/ Hex Artifact Content
Login

Artifact b429e23fabb57506f71e406997cc46b89190dc97:


0000: 2f 2a 0a 2a 2a 20 32 30 31 34 20 4d 61 79 20 33  /*.** 2014 May 3
0010: 31 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74 68  1.**.** The auth
0020: 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f 70  or disclaims cop
0030: 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20 73  yright to this s
0040: 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e 20  ource code.  In 
0050: 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c 65  place of.** a le
0060: 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72 65  gal notice, here
0070: 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a 0a   is a blessing:.
0080: 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f 75  **.**    May you
0090: 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f 74   do good and not
00a0: 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61 79   evil..**    May
00b0: 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69 76   you find forgiv
00c0: 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73 65  eness for yourse
00d0: 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20 6f  lf and forgive o
00e0: 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61 79  thers..**    May
00f0: 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65 6c   you share freel
0100: 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67 20  y, never taking 
0110: 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67 69  more than you gi
0120: 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ve..**.*********
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 4c 6f 77 20  *****.**.** Low 
0180: 6c 65 76 65 6c 20 61 63 63 65 73 73 20 74 6f 20  level access to 
0190: 74 68 65 20 46 54 53 20 69 6e 64 65 78 20 73 74  the FTS index st
01a0: 6f 72 65 64 20 69 6e 20 74 68 65 20 64 61 74 61  ored in the data
01b0: 62 61 73 65 20 66 69 6c 65 2e 20 54 68 65 20 0a  base file. The .
01c0: 2a 2a 20 72 6f 75 74 69 6e 65 73 20 69 6e 20 74  ** routines in t
01d0: 68 69 73 20 66 69 6c 65 20 66 69 6c 65 20 69 6d  his file file im
01e0: 70 6c 65 6d 65 6e 74 20 61 6c 6c 20 72 65 61 64  plement all read
01f0: 20 61 6e 64 20 77 72 69 74 65 20 61 63 63 65 73   and write acces
0200: 73 20 74 6f 20 74 68 65 0a 2a 2a 20 25 5f 64 61  s to the.** %_da
0210: 74 61 20 74 61 62 6c 65 2e 20 4f 74 68 65 72 20  ta table. Other 
0220: 70 61 72 74 73 20 6f 66 20 74 68 65 20 73 79 73  parts of the sys
0230: 74 65 6d 20 61 63 63 65 73 73 20 74 68 69 73 20  tem access this 
0240: 66 75 6e 63 74 69 6f 6e 61 6c 69 74 79 20 76 69  functionality vi
0250: 61 0a 2a 2a 20 74 68 65 20 69 6e 74 65 72 66 61  a.** the interfa
0260: 63 65 20 64 65 66 69 6e 65 64 20 69 6e 20 66 74  ce defined in ft
0270: 73 35 49 6e 74 2e 68 2e 0a 2a 2f 0a 0a 0a 23 69  s5Int.h..*/...#i
0280: 6e 63 6c 75 64 65 20 22 66 74 73 35 49 6e 74 2e  nclude "fts5Int.
0290: 68 22 0a 0a 2f 2a 0a 2a 2a 20 4f 76 65 72 76 69  h"../*.** Overvi
02a0: 65 77 3a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 25 5f  ew:.**.** The %_
02b0: 64 61 74 61 20 74 61 62 6c 65 20 63 6f 6e 74 61  data table conta
02c0: 69 6e 73 20 61 6c 6c 20 74 68 65 20 46 54 53 20  ins all the FTS 
02d0: 69 6e 64 65 78 65 73 20 66 6f 72 20 61 6e 20 46  indexes for an F
02e0: 54 53 35 20 76 69 72 74 75 61 6c 20 74 61 62 6c  TS5 virtual tabl
02f0: 65 2e 0a 2a 2a 20 41 73 20 77 65 6c 6c 20 61 73  e..** As well as
0300: 20 74 68 65 20 6d 61 69 6e 20 74 65 72 6d 20 69   the main term i
0310: 6e 64 65 78 2c 20 74 68 65 72 65 20 6d 61 79 20  ndex, there may 
0320: 62 65 20 75 70 20 74 6f 20 33 31 20 70 72 65 66  be up to 31 pref
0330: 69 78 20 69 6e 64 65 78 65 73 2e 0a 2a 2a 20 54  ix indexes..** T
0340: 68 65 20 66 6f 72 6d 61 74 20 69 73 20 73 69 6d  he format is sim
0350: 69 6c 61 72 20 74 6f 20 46 54 53 33 2f 34 2c 20  ilar to FTS3/4, 
0360: 65 78 63 65 70 74 20 74 68 61 74 3a 0a 2a 2a 0a  except that:.**.
0370: 2a 2a 20 20 20 2a 20 61 6c 6c 20 73 65 67 6d 65  **   * all segme
0380: 6e 74 20 62 2d 74 72 65 65 20 6c 65 61 66 20 64  nt b-tree leaf d
0390: 61 74 61 20 69 73 20 73 74 6f 72 65 64 20 69 6e  ata is stored in
03a0: 20 66 69 78 65 64 20 73 69 7a 65 20 70 61 67 65   fixed size page
03b0: 20 72 65 63 6f 72 64 73 20 0a 2a 2a 20 20 20 20   records .**    
03c0: 20 28 65 2e 67 2e 20 31 30 30 30 20 62 79 74 65   (e.g. 1000 byte
03d0: 73 29 2e 20 41 20 73 69 6e 67 6c 65 20 64 6f 63  s). A single doc
03e0: 6c 69 73 74 20 6d 61 79 20 73 70 61 6e 20 6d 75  list may span mu
03f0: 6c 74 69 70 6c 65 20 70 61 67 65 73 2e 20 43 61  ltiple pages. Ca
0400: 72 65 20 69 73 20 0a 2a 2a 20 20 20 20 20 74 61  re is .**     ta
0410: 6b 65 6e 20 74 6f 20 65 6e 73 75 72 65 20 69 74  ken to ensure it
0420: 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74 6f 20   is possible to 
0430: 69 74 65 72 61 74 65 20 69 6e 20 65 69 74 68 65  iterate in eithe
0440: 72 20 64 69 72 65 63 74 69 6f 6e 20 74 68 72 6f  r direction thro
0450: 75 67 68 20 0a 2a 2a 20 20 20 20 20 74 68 65 20  ugh .**     the 
0460: 65 6e 74 72 69 65 73 20 69 6e 20 61 20 64 6f 63  entries in a doc
0470: 6c 69 73 74 2c 20 6f 72 20 74 6f 20 73 65 65 6b  list, or to seek
0480: 20 74 6f 20 61 20 73 70 65 63 69 66 69 63 20 65   to a specific e
0490: 6e 74 72 79 20 77 69 74 68 69 6e 20 61 20 0a 2a  ntry within a .*
04a0: 2a 20 20 20 20 20 64 6f 63 6c 69 73 74 2c 20 77  *     doclist, w
04b0: 69 74 68 6f 75 74 20 6c 6f 61 64 69 6e 67 20 69  ithout loading i
04c0: 74 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 2e 0a 2a  t into memory..*
04d0: 2a 0a 2a 2a 20 20 20 2a 20 6c 61 72 67 65 20 64  *.**   * large d
04e0: 6f 63 6c 69 73 74 73 20 74 68 61 74 20 73 70 61  oclists that spa
04f0: 6e 20 6d 61 6e 79 20 70 61 67 65 73 20 68 61 76  n many pages hav
0500: 65 20 61 73 73 6f 63 69 61 74 65 64 20 22 64 6f  e associated "do
0510: 63 6c 69 73 74 20 69 6e 64 65 78 22 0a 2a 2a 20  clist index".** 
0520: 20 20 20 20 72 65 63 6f 72 64 73 20 74 68 61 74      records that
0530: 20 63 6f 6e 74 61 69 6e 20 61 20 63 6f 70 79 20   contain a copy 
0540: 6f 66 20 74 68 65 20 66 69 72 73 74 20 72 6f 77  of the first row
0550: 69 64 20 6f 6e 20 65 61 63 68 20 70 61 67 65 20  id on each page 
0560: 73 70 61 6e 6e 65 64 20 62 79 0a 2a 2a 20 20 20  spanned by.**   
0570: 20 20 74 68 65 20 64 6f 63 6c 69 73 74 2e 20 54    the doclist. T
0580: 68 69 73 20 69 73 20 75 73 65 64 20 74 6f 20 73  his is used to s
0590: 70 65 65 64 20 75 70 20 73 65 65 6b 20 6f 70 65  peed up seek ope
05a0: 72 61 74 69 6f 6e 73 2c 20 61 6e 64 20 6d 65 72  rations, and mer
05b0: 67 65 73 20 6f 66 0a 2a 2a 20 20 20 20 20 6c 61  ges of.**     la
05c0: 72 67 65 20 64 6f 63 6c 69 73 74 73 20 77 69 74  rge doclists wit
05d0: 68 20 76 65 72 79 20 73 6d 61 6c 6c 20 64 6f 63  h very small doc
05e0: 6c 69 73 74 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a  lists..**.**   *
05f0: 20 65 78 74 72 61 20 66 69 65 6c 64 73 20 69 6e   extra fields in
0600: 20 74 68 65 20 22 73 74 72 75 63 74 75 72 65 20   the "structure 
0610: 72 65 63 6f 72 64 22 20 72 65 63 6f 72 64 20 74  record" record t
0620: 68 65 20 73 74 61 74 65 20 6f 66 20 6f 6e 67 6f  he state of ongo
0630: 69 6e 67 0a 2a 2a 20 20 20 20 20 69 6e 63 72 65  ing.**     incre
0640: 6d 65 6e 74 61 6c 20 6d 65 72 67 65 20 6f 70 65  mental merge ope
0650: 72 61 74 69 6f 6e 73 2e 0a 2a 2a 0a 2a 2f 0a 0a  rations..**.*/..
0660: 0a 23 64 65 66 69 6e 65 20 46 54 53 35 5f 4f 50  .#define FTS5_OP
0670: 54 5f 57 4f 52 4b 5f 55 4e 49 54 20 20 31 30 30  T_WORK_UNIT  100
0680: 30 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20  0  /* Number of 
0690: 6c 65 61 66 20 70 61 67 65 73 20 70 65 72 20 6f  leaf pages per o
06a0: 70 74 69 6d 69 7a 65 20 73 74 65 70 20 2a 2f 0a  ptimize step */.
06b0: 23 64 65 66 69 6e 65 20 46 54 53 35 5f 57 4f 52  #define FTS5_WOR
06c0: 4b 5f 55 4e 49 54 20 20 20 20 20 20 36 34 20 20  K_UNIT      64  
06d0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6c    /* Number of l
06e0: 65 61 66 20 70 61 67 65 73 20 69 6e 20 75 6e 69  eaf pages in uni
06f0: 74 20 6f 66 20 77 6f 72 6b 20 2a 2f 0a 0a 23 64  t of work */..#d
0700: 65 66 69 6e 65 20 46 54 53 35 5f 4d 49 4e 5f 44  efine FTS5_MIN_D
0710: 4c 49 44 58 5f 53 49 5a 45 20 34 20 20 20 20 20  LIDX_SIZE 4     
0720: 2f 2a 20 41 64 64 20 64 6c 69 64 78 20 69 66 20  /* Add dlidx if 
0730: 74 68 69 73 20 6d 61 6e 79 20 65 6d 70 74 79 20  this many empty 
0740: 70 61 67 65 73 20 2a 2f 0a 0a 23 64 65 66 69 6e  pages */..#defin
0750: 65 20 46 54 53 35 5f 4d 41 49 4e 5f 50 52 45 46  e FTS5_MAIN_PREF
0760: 49 58 20 27 30 27 0a 0a 23 69 66 20 46 54 53 35  IX '0'..#if FTS5
0770: 5f 4d 41 58 5f 50 52 45 46 49 58 5f 49 4e 44 45  _MAX_PREFIX_INDE
0780: 58 45 53 20 3e 20 33 31 0a 23 20 65 72 72 6f 72  XES > 31.# error
0790: 20 22 46 54 53 35 5f 4d 41 58 5f 50 52 45 46 49   "FTS5_MAX_PREFI
07a0: 58 5f 49 4e 44 45 58 45 53 20 69 73 20 74 6f 6f  X_INDEXES is too
07b0: 20 6c 61 72 67 65 22 0a 23 65 6e 64 69 66 0a 0a   large".#endif..
07c0: 2f 2a 0a 2a 2a 20 44 65 74 61 69 6c 73 3a 0a 2a  /*.** Details:.*
07d0: 2a 0a 2a 2a 20 54 68 65 20 25 5f 64 61 74 61 20  *.** The %_data 
07e0: 74 61 62 6c 65 20 6d 61 6e 61 67 65 64 20 62 79  table managed by
07f0: 20 74 68 69 73 20 6d 6f 64 75 6c 65 2c 0a 2a 2a   this module,.**
0800: 0a 2a 2a 20 20 20 20 20 43 52 45 41 54 45 20 54  .**     CREATE T
0810: 41 42 4c 45 20 25 5f 64 61 74 61 28 69 64 20 49  ABLE %_data(id I
0820: 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b  NTEGER PRIMARY K
0830: 45 59 2c 20 62 6c 6f 63 6b 20 42 4c 4f 42 29 3b  EY, block BLOB);
0840: 0a 2a 2a 0a 2a 2a 20 2c 20 63 6f 6e 74 61 69 6e  .**.** , contain
0850: 73 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  s the following 
0860: 35 20 74 79 70 65 73 20 6f 66 20 72 65 63 6f 72  5 types of recor
0870: 64 73 2e 20 53 65 65 20 74 68 65 20 63 6f 6d 6d  ds. See the comm
0880: 65 6e 74 73 20 73 75 72 72 6f 75 6e 64 69 6e 67  ents surrounding
0890: 0a 2a 2a 20 74 68 65 20 46 54 53 35 5f 2a 5f 52  .** the FTS5_*_R
08a0: 4f 57 49 44 20 6d 61 63 72 6f 73 20 62 65 6c 6f  OWID macros belo
08b0: 77 20 66 6f 72 20 61 20 64 65 73 63 72 69 70 74  w for a descript
08c0: 69 6f 6e 20 6f 66 20 68 6f 77 20 25 5f 64 61 74  ion of how %_dat
08d0: 61 20 72 6f 77 69 64 73 20 61 72 65 20 0a 2a 2a  a rowids are .**
08e0: 20 61 73 73 69 67 6e 65 64 20 74 6f 20 65 61 63   assigned to eac
08f0: 68 20 66 6f 20 74 68 65 6d 2e 0a 2a 2a 0a 2a 2a  h fo them..**.**
0900: 20 31 2e 20 53 74 72 75 63 74 75 72 65 20 52 65   1. Structure Re
0910: 63 6f 72 64 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 54  cords:.**.**   T
0920: 68 65 20 73 65 74 20 6f 66 20 73 65 67 6d 65 6e  he set of segmen
0930: 74 73 20 74 68 61 74 20 6d 61 6b 65 20 75 70 20  ts that make up 
0940: 61 6e 20 69 6e 64 65 78 20 2d 20 74 68 65 20 69  an index - the i
0950: 6e 64 65 78 20 73 74 72 75 63 74 75 72 65 20 2d  ndex structure -
0960: 20 61 72 65 0a 2a 2a 20 20 20 72 65 63 6f 72 64   are.**   record
0970: 65 64 20 69 6e 20 61 20 73 69 6e 67 6c 65 20 72  ed in a single r
0980: 65 63 6f 72 64 20 77 69 74 68 69 6e 20 74 68 65  ecord within the
0990: 20 25 5f 64 61 74 61 20 74 61 62 6c 65 2e 20 54   %_data table. T
09a0: 68 65 20 72 65 63 6f 72 64 20 63 6f 6e 73 69 73  he record consis
09b0: 74 73 0a 2a 2a 20 20 20 6f 66 20 61 20 73 69 6e  ts.**   of a sin
09c0: 67 6c 65 20 33 32 2d 62 69 74 20 63 6f 6e 66 69  gle 32-bit confi
09d0: 67 75 72 61 74 69 6f 6e 20 63 6f 6f 6b 69 65 20  guration cookie 
09e0: 76 61 6c 75 65 20 66 6f 6c 6c 6f 77 65 64 20 62  value followed b
09f0: 79 20 61 20 6c 69 73 74 20 6f 66 20 0a 2a 2a 20  y a list of .** 
0a00: 20 20 53 51 4c 69 74 65 20 76 61 72 69 6e 74 73    SQLite varints
0a10: 2e 20 49 66 20 74 68 65 20 46 54 53 20 74 61 62  . If the FTS tab
0a20: 6c 65 20 66 65 61 74 75 72 65 73 20 6d 6f 72 65  le features more
0a30: 20 74 68 61 6e 20 6f 6e 65 20 69 6e 64 65 78 20   than one index 
0a40: 28 62 65 63 61 75 73 65 0a 2a 2a 20 20 20 74 68  (because.**   th
0a50: 65 72 65 20 61 72 65 20 6f 6e 65 20 6f 72 20 6d  ere are one or m
0a60: 6f 72 65 20 70 72 65 66 69 78 20 69 6e 64 65 78  ore prefix index
0a70: 65 73 29 2c 20 69 74 20 69 73 20 67 75 61 72 61  es), it is guara
0a80: 6e 74 65 65 64 20 74 68 61 74 20 61 6c 6c 20 73  nteed that all s
0a90: 68 61 72 65 0a 2a 2a 20 20 20 74 68 65 20 73 61  hare.**   the sa
0aa0: 6d 65 20 63 6f 6f 6b 69 65 20 76 61 6c 75 65 2e  me cookie value.
0ab0: 0a 2a 2a 0a 2a 2a 20 20 20 49 6d 6d 65 64 69 61  .**.**   Immedia
0ac0: 74 65 6c 79 20 66 6f 6c 6c 6f 77 69 6e 67 20 74  tely following t
0ad0: 68 65 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e  he configuration
0ae0: 20 63 6f 6f 6b 69 65 2c 20 74 68 65 20 72 65 63   cookie, the rec
0af0: 6f 72 64 20 62 65 67 69 6e 73 20 77 69 74 68 0a  ord begins with.
0b00: 2a 2a 20 20 20 74 68 72 65 65 20 76 61 72 69 6e  **   three varin
0b10: 74 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2b 20  ts:.**.**     + 
0b20: 6e 75 6d 62 65 72 20 6f 66 20 6c 65 76 65 6c 73  number of levels
0b30: 2c 0a 2a 2a 20 20 20 20 20 2b 20 74 6f 74 61 6c  ,.**     + total
0b40: 20 6e 75 6d 62 65 72 20 6f 66 20 73 65 67 6d 65   number of segme
0b50: 6e 74 73 20 6f 6e 20 61 6c 6c 20 6c 65 76 65 6c  nts on all level
0b60: 73 2c 0a 2a 2a 20 20 20 20 20 2b 20 76 61 6c 75  s,.**     + valu
0b70: 65 20 6f 66 20 77 72 69 74 65 20 63 6f 75 6e 74  e of write count
0b80: 65 72 2e 0a 2a 2a 0a 2a 2a 20 20 20 54 68 65 6e  er..**.**   Then
0b90: 2c 20 66 6f 72 20 65 61 63 68 20 6c 65 76 65 6c  , for each level
0ba0: 20 66 72 6f 6d 20 30 20 74 6f 20 6e 4d 61 78 3a   from 0 to nMax:
0bb0: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2b 20 6e 75 6d  .**.**     + num
0bc0: 62 65 72 20 6f 66 20 69 6e 70 75 74 20 73 65 67  ber of input seg
0bd0: 6d 65 6e 74 73 20 69 6e 20 6f 6e 67 6f 69 6e 67  ments in ongoing
0be0: 20 6d 65 72 67 65 2e 0a 2a 2a 20 20 20 20 20 2b   merge..**     +
0bf0: 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66   total number of
0c00: 20 73 65 67 6d 65 6e 74 73 20 69 6e 20 6c 65 76   segments in lev
0c10: 65 6c 2e 0a 2a 2a 20 20 20 20 20 2b 20 66 6f 72  el..**     + for
0c20: 20 65 61 63 68 20 73 65 67 6d 65 6e 74 20 66 72   each segment fr
0c30: 6f 6d 20 6f 6c 64 65 73 74 20 74 6f 20 6e 65 77  om oldest to new
0c40: 65 73 74 3a 0a 2a 2a 20 20 20 20 20 20 20 20 20  est:.**         
0c50: 2b 20 73 65 67 6d 65 6e 74 20 69 64 20 28 61 6c  + segment id (al
0c60: 77 61 79 73 20 3e 20 30 29 0a 2a 2a 20 20 20 20  ways > 0).**    
0c70: 20 20 20 20 20 2b 20 66 69 72 73 74 20 6c 65 61       + first lea
0c80: 66 20 70 61 67 65 20 6e 75 6d 62 65 72 20 28 6f  f page number (o
0c90: 66 74 65 6e 20 31 2c 20 61 6c 77 61 79 73 20 67  ften 1, always g
0ca0: 72 65 61 74 65 72 20 74 68 61 6e 20 30 29 0a 2a  reater than 0).*
0cb0: 2a 20 20 20 20 20 20 20 20 20 2b 20 66 69 6e 61  *         + fina
0cc0: 6c 20 6c 65 61 66 20 70 61 67 65 20 6e 75 6d 62  l leaf page numb
0cd0: 65 72 0a 2a 2a 0a 2a 2a 20 32 2e 20 54 68 65 20  er.**.** 2. The 
0ce0: 41 76 65 72 61 67 65 73 20 52 65 63 6f 72 64 3a  Averages Record:
0cf0: 0a 2a 2a 0a 2a 2a 20 20 20 41 20 73 69 6e 67 6c  .**.**   A singl
0d00: 65 20 72 65 63 6f 72 64 20 77 69 74 68 69 6e 20  e record within 
0d10: 74 68 65 20 25 5f 64 61 74 61 20 74 61 62 6c 65  the %_data table
0d20: 2e 20 54 68 65 20 64 61 74 61 20 69 73 20 61 20  . The data is a 
0d30: 6c 69 73 74 20 6f 66 20 76 61 72 69 6e 74 73 2e  list of varints.
0d40: 0a 2a 2a 20 20 20 54 68 65 20 66 69 72 73 74 20  .**   The first 
0d50: 76 61 6c 75 65 20 69 73 20 74 68 65 20 6e 75 6d  value is the num
0d60: 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e 20 74  ber of rows in t
0d70: 68 65 20 69 6e 64 65 78 2e 20 54 68 65 6e 2c 20  he index. Then, 
0d80: 66 6f 72 20 65 61 63 68 20 63 6f 6c 75 6d 6e 0a  for each column.
0d90: 2a 2a 20 20 20 66 72 6f 6d 20 6c 65 66 74 20 74  **   from left t
0da0: 6f 20 72 69 67 68 74 2c 20 74 68 65 20 74 6f 74  o right, the tot
0db0: 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 74 6f 6b  al number of tok
0dc0: 65 6e 73 20 69 6e 20 74 68 65 20 63 6f 6c 75 6d  ens in the colum
0dd0: 6e 20 66 6f 72 20 61 6c 6c 0a 2a 2a 20 20 20 72  n for all.**   r
0de0: 6f 77 73 20 6f 66 20 74 68 65 20 74 61 62 6c 65  ows of the table
0df0: 2e 0a 2a 2a 0a 2a 2a 20 33 2e 20 53 65 67 6d 65  ..**.** 3. Segme
0e00: 6e 74 20 6c 65 61 76 65 73 3a 0a 2a 2a 0a 2a 2a  nt leaves:.**.**
0e10: 20 20 20 54 45 52 4d 2f 44 4f 43 4c 49 53 54 20     TERM/DOCLIST 
0e20: 46 4f 52 4d 41 54 3a 0a 2a 2a 0a 2a 2a 20 20 20  FORMAT:.**.**   
0e30: 20 20 4d 6f 73 74 20 6f 66 20 65 61 63 68 20 73    Most of each s
0e40: 65 67 6d 65 6e 74 20 6c 65 61 66 20 69 73 20 74  egment leaf is t
0e50: 61 6b 65 6e 20 75 70 20 62 79 20 74 65 72 6d 2f  aken up by term/
0e60: 64 6f 63 6c 69 73 74 20 64 61 74 61 2e 20 54 68  doclist data. Th
0e70: 65 20 0a 2a 2a 20 20 20 20 20 67 65 6e 65 72 61  e .**     genera
0e80: 6c 20 66 6f 72 6d 61 74 20 6f 66 20 74 65 72 6d  l format of term
0e90: 2f 64 6f 63 6c 69 73 74 2c 20 73 74 61 72 74 69  /doclist, starti
0ea0: 6e 67 20 77 69 74 68 20 74 68 65 20 66 69 72 73  ng with the firs
0eb0: 74 20 74 65 72 6d 0a 2a 2a 20 20 20 20 20 6f 6e  t term.**     on
0ec0: 20 74 68 65 20 6c 65 61 66 20 70 61 67 65 2c 20   the leaf page, 
0ed0: 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20  is:.**.**       
0ee0: 20 20 76 61 72 69 6e 74 20 3a 20 73 69 7a 65 20    varint : size 
0ef0: 6f 66 20 66 69 72 73 74 20 74 65 72 6d 0a 2a 2a  of first term.**
0f00: 20 20 20 20 20 20 20 20 20 62 6c 6f 62 3a 20 20           blob:  
0f10: 20 20 66 69 72 73 74 20 74 65 72 6d 20 64 61 74    first term dat
0f20: 61 0a 2a 2a 20 20 20 20 20 20 20 20 20 64 6f 63  a.**         doc
0f30: 6c 69 73 74 3a 20 66 69 72 73 74 20 64 6f 63 6c  list: first docl
0f40: 69 73 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 7a  ist.**         z
0f50: 65 72 6f 2d 6f 72 2d 6d 6f 72 65 20 7b 0a 2a 2a  ero-or-more {.**
0f60: 20 20 20 20 20 20 20 20 20 20 20 76 61 72 69 6e             varin
0f70: 74 3a 20 20 6e 75 6d 62 65 72 20 6f 66 20 62 79  t:  number of by
0f80: 74 65 73 20 69 6e 20 63 6f 6d 6d 6f 6e 20 77 69  tes in common wi
0f90: 74 68 20 70 72 65 76 69 6f 75 73 20 74 65 72 6d  th previous term
0fa0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 76 61  .**           va
0fb0: 72 69 6e 74 3a 20 20 6e 75 6d 62 65 72 20 6f 66  rint:  number of
0fc0: 20 62 79 74 65 73 20 6f 66 20 6e 65 77 20 74 65   bytes of new te
0fd0: 72 6d 20 64 61 74 61 20 28 6e 4e 65 77 29 0a 2a  rm data (nNew).*
0fe0: 2a 20 20 20 20 20 20 20 20 20 20 20 62 6c 6f 62  *           blob
0ff0: 3a 20 20 20 20 6e 4e 65 77 20 62 79 74 65 73 20  :    nNew bytes 
1000: 6f 66 20 6e 65 77 20 74 65 72 6d 20 64 61 74 61  of new term data
1010: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 64 6f  .**           do
1020: 63 6c 69 73 74 3a 20 6e 65 78 74 20 64 6f 63 6c  clist: next docl
1030: 69 73 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 7d  ist.**         }
1040: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 64 6f 63 6c 69  .**.**     docli
1050: 73 74 20 66 6f 72 6d 61 74 3a 0a 2a 2a 0a 2a 2a  st format:.**.**
1060: 20 20 20 20 20 20 20 20 20 76 61 72 69 6e 74 3a           varint:
1070: 20 20 66 69 72 73 74 20 72 6f 77 69 64 0a 2a 2a    first rowid.**
1080: 20 20 20 20 20 20 20 20 20 70 6f 73 6c 69 73 74           poslist
1090: 3a 20 66 69 72 73 74 20 70 6f 73 6c 69 73 74 0a  : first poslist.
10a0: 2a 2a 20 20 20 20 20 20 20 20 20 7a 65 72 6f 2d  **         zero-
10b0: 6f 72 2d 6d 6f 72 65 20 7b 0a 2a 2a 20 20 20 20  or-more {.**    
10c0: 20 20 20 20 20 20 20 76 61 72 69 6e 74 3a 20 20         varint:  
10d0: 72 6f 77 69 64 20 64 65 6c 74 61 20 28 61 6c 77  rowid delta (alw
10e0: 61 79 73 20 3e 20 30 29 0a 2a 2a 20 20 20 20 20  ays > 0).**     
10f0: 20 20 20 20 20 20 70 6f 73 6c 69 73 74 3a 20 6e        poslist: n
1100: 65 78 74 20 70 6f 73 6c 69 73 74 0a 2a 2a 20 20  ext poslist.**  
1110: 20 20 20 20 20 20 20 7d 0a 2a 2a 0a 2a 2a 20 20         }.**.**  
1120: 20 20 20 70 6f 73 6c 69 73 74 20 66 6f 72 6d 61     poslist forma
1130: 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20  t:.**.**        
1140: 20 76 61 72 69 6e 74 3a 20 73 69 7a 65 20 6f 66   varint: size of
1150: 20 70 6f 73 6c 69 73 74 20 69 6e 20 62 79 74 65   poslist in byte
1160: 73 20 6d 75 6c 74 69 70 6c 69 65 64 20 62 79 20  s multiplied by 
1170: 32 2c 20 6e 6f 74 20 69 6e 63 6c 75 64 69 6e 67  2, not including
1180: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
1190: 20 20 20 20 74 68 69 73 20 66 69 65 6c 64 2e 20      this field. 
11a0: 50 6c 75 73 20 31 20 69 66 20 74 68 69 73 20 65  Plus 1 if this e
11b0: 6e 74 72 79 20 63 61 72 72 69 65 73 20 74 68 65  ntry carries the
11c0: 20 22 64 65 6c 65 74 65 22 20 66 6c 61 67 2e 0a   "delete" flag..
11d0: 2a 2a 20 20 20 20 20 20 20 20 20 63 6f 6c 6c 69  **         colli
11e0: 73 74 3a 20 63 6f 6c 6c 69 73 74 20 66 6f 72 20  st: collist for 
11f0: 63 6f 6c 75 6d 6e 20 30 0a 2a 2a 20 20 20 20 20  column 0.**     
1200: 20 20 20 20 7a 65 72 6f 2d 6f 72 2d 6d 6f 72 65      zero-or-more
1210: 20 7b 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20   {.**           
1220: 30 78 30 31 20 62 79 74 65 0a 2a 2a 20 20 20 20  0x01 byte.**    
1230: 20 20 20 20 20 20 20 76 61 72 69 6e 74 3a 20 63         varint: c
1240: 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20 28 49 29  olumn number (I)
1250: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 63 6f  .**           co
1260: 6c 6c 69 73 74 3a 20 63 6f 6c 6c 69 73 74 20 66  llist: collist f
1270: 6f 72 20 63 6f 6c 75 6d 6e 20 49 0a 2a 2a 20 20  or column I.**  
1280: 20 20 20 20 20 20 20 7d 0a 2a 2a 0a 2a 2a 20 20         }.**.**  
1290: 20 20 20 63 6f 6c 6c 69 73 74 20 66 6f 72 6d 61     collist forma
12a0: 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20  t:.**.**        
12b0: 20 76 61 72 69 6e 74 3a 20 66 69 72 73 74 20 6f   varint: first o
12c0: 66 66 73 65 74 20 2b 20 32 0a 2a 2a 20 20 20 20  ffset + 2.**    
12d0: 20 20 20 20 20 7a 65 72 6f 2d 6f 72 2d 6d 6f 72       zero-or-mor
12e0: 65 20 7b 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  e {.**          
12f0: 20 76 61 72 69 6e 74 3a 20 6f 66 66 73 65 74 20   varint: offset 
1300: 64 65 6c 74 61 20 2b 20 32 0a 2a 2a 20 20 20 20  delta + 2.**    
1310: 20 20 20 20 20 7d 0a 2a 2a 0a 2a 2a 20 20 20 50       }.**.**   P
1320: 41 47 45 20 46 4f 52 4d 41 54 0a 2a 2a 0a 2a 2a  AGE FORMAT.**.**
1330: 20 20 20 20 20 45 61 63 68 20 6c 65 61 66 20 70       Each leaf p
1340: 61 67 65 20 62 65 67 69 6e 73 20 77 69 74 68 20  age begins with 
1350: 61 20 34 2d 62 79 74 65 20 68 65 61 64 65 72 20  a 4-byte header 
1360: 63 6f 6e 74 61 69 6e 69 6e 67 20 32 20 31 36 2d  containing 2 16-
1370: 62 69 74 20 0a 2a 2a 20 20 20 20 20 75 6e 73 69  bit .**     unsi
1380: 67 6e 65 64 20 69 6e 74 65 67 65 72 20 66 69 65  gned integer fie
1390: 6c 64 73 20 69 6e 20 62 69 67 2d 65 6e 64 69 61  lds in big-endia
13a0: 6e 20 66 6f 72 6d 61 74 2e 20 54 68 65 79 20 61  n format. They a
13b0: 72 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20  re:.**.**       
13c0: 2a 20 54 68 65 20 62 79 74 65 20 6f 66 66 73 65  * The byte offse
13d0: 74 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 72  t of the first r
13e0: 6f 77 69 64 20 6f 6e 20 74 68 65 20 70 61 67 65  owid on the page
13f0: 2c 20 69 66 20 69 74 20 65 78 69 73 74 73 0a 2a  , if it exists.*
1400: 2a 20 20 20 20 20 20 20 20 20 61 6e 64 20 6f 63  *         and oc
1410: 63 75 72 73 20 62 65 66 6f 72 65 20 74 68 65 20  curs before the 
1420: 66 69 72 73 74 20 74 65 72 6d 20 28 6f 74 68 65  first term (othe
1430: 72 77 69 73 65 20 30 29 2e 0a 2a 2a 0a 2a 2a 20  rwise 0)..**.** 
1440: 20 20 20 20 20 20 2a 20 54 68 65 20 62 79 74 65        * The byte
1450: 20 6f 66 66 73 65 74 20 6f 66 20 74 68 65 20 73   offset of the s
1460: 74 61 72 74 20 6f 66 20 74 68 65 20 70 61 67 65  tart of the page
1470: 20 66 6f 6f 74 65 72 2e 20 49 66 20 74 68 65 20   footer. If the 
1480: 70 61 67 65 0a 2a 2a 20 20 20 20 20 20 20 20 20  page.**         
1490: 66 6f 6f 74 65 72 20 69 73 20 30 20 62 79 74 65  footer is 0 byte
14a0: 73 20 69 6e 20 73 69 7a 65 2c 20 74 68 65 6e 20  s in size, then 
14b0: 74 68 69 73 20 66 69 65 6c 64 20 69 73 20 74 68  this field is th
14c0: 65 20 73 61 6d 65 20 61 73 20 74 68 65 0a 2a 2a  e same as the.**
14d0: 20 20 20 20 20 20 20 20 20 73 69 7a 65 20 6f 66           size of
14e0: 20 74 68 65 20 6c 65 61 66 20 70 61 67 65 20 69   the leaf page i
14f0: 6e 20 62 79 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 20  n bytes..**.**  
1500: 20 20 20 54 68 65 20 70 61 67 65 20 66 6f 6f 74     The page foot
1510: 65 72 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 61  er consists of a
1520: 20 73 69 6e 67 6c 65 20 76 61 72 69 6e 74 20 66   single varint f
1530: 6f 72 20 65 61 63 68 20 74 65 72 6d 20 6c 6f 63  or each term loc
1540: 61 74 65 64 0a 2a 2a 20 20 20 20 20 6f 6e 20 74  ated.**     on t
1550: 68 65 20 70 61 67 65 2e 20 45 61 63 68 20 76 61  he page. Each va
1560: 72 69 6e 74 20 69 73 20 74 68 65 20 62 79 74 65  rint is the byte
1570: 20 6f 66 66 73 65 74 20 6f 66 20 74 68 65 20 63   offset of the c
1580: 75 72 72 65 6e 74 20 74 65 72 6d 0a 2a 2a 20 20  urrent term.**  
1590: 20 20 20 77 69 74 68 69 6e 20 74 68 65 20 70 61     within the pa
15a0: 67 65 2c 20 64 65 6c 74 61 2d 63 6f 6d 70 72 65  ge, delta-compre
15b0: 73 73 65 64 20 61 67 61 69 6e 73 74 20 74 68 65  ssed against the
15c0: 20 70 72 65 76 69 6f 75 73 20 76 61 6c 75 65 2e   previous value.
15d0: 20 49 6e 0a 2a 2a 20 20 20 20 20 6f 74 68 65 72   In.**     other
15e0: 20 77 6f 72 64 73 2c 20 74 68 65 20 66 69 72 73   words, the firs
15f0: 74 20 76 61 72 69 6e 74 20 69 6e 20 74 68 65 20  t varint in the 
1600: 66 6f 6f 74 65 72 20 69 73 20 74 68 65 20 62 79  footer is the by
1610: 74 65 20 6f 66 66 73 65 74 20 6f 66 0a 2a 2a 20  te offset of.** 
1620: 20 20 20 20 74 68 65 20 66 69 72 73 74 20 74 65      the first te
1630: 72 6d 2c 20 74 68 65 20 73 65 63 6f 6e 64 20 69  rm, the second i
1640: 73 20 74 68 65 20 62 79 74 65 20 6f 66 66 73 65  s the byte offse
1650: 74 20 6f 66 20 74 68 65 20 73 65 63 6f 6e 64 20  t of the second 
1660: 6c 65 73 73 20 74 68 61 74 0a 2a 2a 20 20 20 20  less that.**    
1670: 20 6f 66 20 74 68 65 20 66 69 72 73 74 2c 20 61   of the first, a
1680: 6e 64 20 73 6f 20 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  nd so on..**.** 
1690: 20 20 20 20 54 68 65 20 74 65 72 6d 2f 64 6f 63      The term/doc
16a0: 6c 69 73 74 20 66 6f 72 6d 61 74 20 64 65 73 63  list format desc
16b0: 72 69 62 65 64 20 61 62 6f 76 65 20 69 73 20 61  ribed above is a
16c0: 63 63 75 72 61 74 65 20 69 66 20 74 68 65 20 65  ccurate if the e
16d0: 6e 74 69 72 65 0a 2a 2a 20 20 20 20 20 74 65 72  ntire.**     ter
16e0: 6d 2f 64 6f 63 6c 69 73 74 20 64 61 74 61 20 66  m/doclist data f
16f0: 69 74 73 20 6f 6e 20 61 20 73 69 6e 67 6c 65 20  its on a single 
1700: 6c 65 61 66 20 70 61 67 65 2e 20 49 66 20 74 68  leaf page. If th
1710: 69 73 20 69 73 20 6e 6f 74 20 74 68 65 20 63 61  is is not the ca
1720: 73 65 2c 0a 2a 2a 20 20 20 20 20 74 68 65 20 66  se,.**     the f
1730: 6f 72 6d 61 74 20 69 73 20 63 68 61 6e 67 65 64  ormat is changed
1740: 20 69 6e 20 74 77 6f 20 77 61 79 73 3a 0a 2a 2a   in two ways:.**
1750: 0a 2a 2a 20 20 20 20 20 20 20 2b 20 69 66 20 74  .**       + if t
1760: 68 65 20 66 69 72 73 74 20 72 6f 77 69 64 20 6f  he first rowid o
1770: 6e 20 61 20 70 61 67 65 20 6f 63 63 75 72 73 20  n a page occurs 
1780: 62 65 66 6f 72 65 20 74 68 65 20 66 69 72 73 74  before the first
1790: 20 74 65 72 6d 2c 20 69 74 0a 2a 2a 20 20 20 20   term, it.**    
17a0: 20 20 20 20 20 69 73 20 73 74 6f 72 65 64 20 61       is stored a
17b0: 73 20 61 20 6c 69 74 65 72 61 6c 20 76 61 6c 75  s a literal valu
17c0: 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20  e:.**.**        
17d0: 20 20 20 20 20 76 61 72 69 6e 74 3a 20 20 66 69       varint:  fi
17e0: 72 73 74 20 72 6f 77 69 64 0a 2a 2a 0a 2a 2a 20  rst rowid.**.** 
17f0: 20 20 20 20 20 20 2b 20 74 68 65 20 66 69 72 73        + the firs
1800: 74 20 74 65 72 6d 20 6f 6e 20 65 61 63 68 20 70  t term on each p
1810: 61 67 65 20 69 73 20 73 74 6f 72 65 64 20 69 6e  age is stored in
1820: 20 74 68 65 20 73 61 6d 65 20 77 61 79 20 61 73   the same way as
1830: 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 20   the.**         
1840: 76 65 72 79 20 66 69 72 73 74 20 74 65 72 6d 20  very first term 
1850: 6f 66 20 74 68 65 20 73 65 67 6d 65 6e 74 3a 0a  of the segment:.
1860: 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  **.**           
1870: 20 20 76 61 72 69 6e 74 20 3a 20 73 69 7a 65 20    varint : size 
1880: 6f 66 20 66 69 72 73 74 20 74 65 72 6d 0a 2a 2a  of first term.**
1890: 20 20 20 20 20 20 20 20 20 20 20 20 20 62 6c 6f               blo
18a0: 62 3a 20 20 20 20 66 69 72 73 74 20 74 65 72 6d  b:    first term
18b0: 20 64 61 74 61 0a 2a 2a 0a 2a 2a 20 35 2e 20 53   data.**.** 5. S
18c0: 65 67 6d 65 6e 74 20 64 6f 63 6c 69 73 74 20 69  egment doclist i
18d0: 6e 64 65 78 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  ndexes:.**.**   
18e0: 44 6f 63 6c 69 73 74 20 69 6e 64 65 78 65 73 20  Doclist indexes 
18f0: 61 72 65 20 74 68 65 6d 73 65 6c 76 65 73 20 62  are themselves b
1900: 2d 74 72 65 65 73 2c 20 68 6f 77 65 76 65 72 20  -trees, however 
1910: 74 68 65 79 20 75 73 75 61 6c 6c 79 20 63 6f 6e  they usually con
1920: 73 69 73 74 20 6f 66 0a 2a 2a 20 20 20 61 20 73  sist of.**   a s
1930: 69 6e 67 6c 65 20 6c 65 61 66 20 72 65 63 6f 72  ingle leaf recor
1940: 64 20 6f 6e 6c 79 2e 20 54 68 65 20 66 6f 72 6d  d only. The form
1950: 61 74 20 6f 66 20 65 61 63 68 20 64 6f 63 6c 69  at of each docli
1960: 73 74 20 69 6e 64 65 78 20 6c 65 61 66 20 70 61  st index leaf pa
1970: 67 65 20 0a 2a 2a 20 20 20 69 73 3a 0a 2a 2a 0a  ge .**   is:.**.
1980: 2a 2a 20 20 20 20 20 2a 20 46 6c 61 67 73 20 62  **     * Flags b
1990: 79 74 65 2e 20 42 69 74 73 20 61 72 65 3a 0a 2a  yte. Bits are:.*
19a0: 2a 20 20 20 20 20 20 20 20 20 30 78 30 31 3a 20  *         0x01: 
19b0: 43 6c 65 61 72 20 69 66 20 6c 65 61 66 20 69 73  Clear if leaf is
19c0: 20 61 6c 73 6f 20 74 68 65 20 72 6f 6f 74 20 70   also the root p
19d0: 61 67 65 2c 20 6f 74 68 65 72 77 69 73 65 20 73  age, otherwise s
19e0: 65 74 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 20  et..**.**     * 
19f0: 50 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 66  Page number of f
1a00: 74 73 20 69 6e 64 65 78 20 6c 65 61 66 20 70 61  ts index leaf pa
1a10: 67 65 2e 20 41 73 20 61 20 76 61 72 69 6e 74 2e  ge. As a varint.
1a20: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 20 46 69 72  .**.**     * Fir
1a30: 73 74 20 72 6f 77 69 64 20 6f 6e 20 70 61 67 65  st rowid on page
1a40: 20 69 6e 64 69 63 61 74 65 64 20 62 79 20 70 72   indicated by pr
1a50: 65 76 69 6f 75 73 20 66 69 65 6c 64 2e 20 41 73  evious field. As
1a60: 20 61 20 76 61 72 69 6e 74 2e 0a 2a 2a 0a 2a 2a   a varint..**.**
1a70: 20 20 20 20 20 2a 20 41 20 6c 69 73 74 20 6f 66       * A list of
1a80: 20 76 61 72 69 6e 74 73 2c 20 6f 6e 65 20 66 6f   varints, one fo
1a90: 72 20 65 61 63 68 20 73 75 62 73 65 71 75 65 6e  r each subsequen
1aa0: 74 20 74 65 72 6d 6c 65 73 73 20 70 61 67 65 2e  t termless page.
1ab0: 20 41 20 0a 2a 2a 20 20 20 20 20 20 20 70 6f 73   A .**       pos
1ac0: 69 74 69 76 65 20 64 65 6c 74 61 20 69 66 20 74  itive delta if t
1ad0: 68 65 20 74 65 72 6d 6c 65 73 73 20 70 61 67 65  he termless page
1ae0: 20 63 6f 6e 74 61 69 6e 73 20 61 74 20 6c 65 61   contains at lea
1af0: 73 74 20 6f 6e 65 20 72 6f 77 69 64 2c 20 0a 2a  st one rowid, .*
1b00: 2a 20 20 20 20 20 20 20 6f 72 20 61 6e 20 30 78  *       or an 0x
1b10: 30 30 20 62 79 74 65 20 6f 74 68 65 72 77 69 73  00 byte otherwis
1b20: 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 49 6e 74 65 72  e..**.**   Inter
1b30: 6e 61 6c 20 64 6f 63 6c 69 73 74 20 69 6e 64 65  nal doclist inde
1b40: 78 20 6e 6f 64 65 73 20 61 72 65 3a 0a 2a 2a 0a  x nodes are:.**.
1b50: 2a 2a 20 20 20 20 20 2a 20 46 6c 61 67 73 20 62  **     * Flags b
1b60: 79 74 65 2e 20 42 69 74 73 20 61 72 65 3a 0a 2a  yte. Bits are:.*
1b70: 2a 20 20 20 20 20 20 20 20 20 30 78 30 31 3a 20  *         0x01: 
1b80: 43 6c 65 61 72 20 66 6f 72 20 72 6f 6f 74 20 70  Clear for root p
1b90: 61 67 65 2c 20 6f 74 68 65 72 77 69 73 65 20 73  age, otherwise s
1ba0: 65 74 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 20  et..**.**     * 
1bb0: 50 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 66  Page number of f
1bc0: 69 72 73 74 20 63 68 69 6c 64 20 70 61 67 65 2e  irst child page.
1bd0: 20 41 73 20 61 20 76 61 72 69 6e 74 2e 0a 2a 2a   As a varint..**
1be0: 0a 2a 2a 20 20 20 20 20 2a 20 43 6f 70 79 20 6f  .**     * Copy o
1bf0: 66 20 66 69 72 73 74 20 72 6f 77 69 64 20 6f 6e  f first rowid on
1c00: 20 70 61 67 65 20 69 6e 64 69 63 61 74 65 64 20   page indicated 
1c10: 62 79 20 70 72 65 76 69 6f 75 73 20 66 69 65 6c  by previous fiel
1c20: 64 2e 20 41 73 20 61 20 76 61 72 69 6e 74 2e 0a  d. As a varint..
1c30: 2a 2a 0a 2a 2a 20 20 20 20 20 2a 20 41 20 6c 69  **.**     * A li
1c40: 73 74 20 6f 66 20 64 65 6c 74 61 2d 65 6e 63 6f  st of delta-enco
1c50: 64 65 64 20 76 61 72 69 6e 74 73 20 2d 20 74 68  ded varints - th
1c60: 65 20 66 69 72 73 74 20 72 6f 77 69 64 20 6f 6e  e first rowid on
1c70: 20 65 61 63 68 20 73 75 62 73 65 71 75 65 6e 74   each subsequent
1c80: 0a 2a 2a 20 20 20 20 20 20 20 63 68 69 6c 64 20  .**       child 
1c90: 70 61 67 65 2e 20 0a 2a 2a 0a 2a 2f 0a 0a 2f 2a  page. .**.*/../*
1ca0: 0a 2a 2a 20 52 6f 77 69 64 73 20 66 6f 72 20 74  .** Rowids for t
1cb0: 68 65 20 61 76 65 72 61 67 65 73 20 61 6e 64 20  he averages and 
1cc0: 73 74 72 75 63 74 75 72 65 20 72 65 63 6f 72 64  structure record
1cd0: 73 20 69 6e 20 74 68 65 20 25 5f 64 61 74 61 20  s in the %_data 
1ce0: 74 61 62 6c 65 2e 0a 2a 2f 0a 23 64 65 66 69 6e  table..*/.#defin
1cf0: 65 20 46 54 53 35 5f 41 56 45 52 41 47 45 53 5f  e FTS5_AVERAGES_
1d00: 52 4f 57 49 44 20 20 20 20 20 31 20 20 20 20 2f  ROWID     1    /
1d10: 2a 20 52 6f 77 69 64 20 75 73 65 64 20 66 6f 72  * Rowid used for
1d20: 20 74 68 65 20 61 76 65 72 61 67 65 73 20 72 65   the averages re
1d30: 63 6f 72 64 20 2a 2f 0a 23 64 65 66 69 6e 65 20  cord */.#define 
1d40: 46 54 53 35 5f 53 54 52 55 43 54 55 52 45 5f 52  FTS5_STRUCTURE_R
1d50: 4f 57 49 44 20 20 20 31 30 20 20 20 20 2f 2a 20  OWID   10    /* 
1d60: 54 68 65 20 73 74 72 75 63 74 75 72 65 20 72 65  The structure re
1d70: 63 6f 72 64 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 4d  cord */../*.** M
1d80: 61 63 72 6f 73 20 64 65 74 65 72 6d 69 6e 69 6e  acros determinin
1d90: 67 20 74 68 65 20 72 6f 77 69 64 73 20 75 73 65  g the rowids use
1da0: 64 20 62 79 20 73 65 67 6d 65 6e 74 20 6c 65 61  d by segment lea
1db0: 76 65 73 20 61 6e 64 20 64 6c 69 64 78 20 6c 65  ves and dlidx le
1dc0: 61 76 65 73 0a 2a 2a 20 61 6e 64 20 6e 6f 64 65  aves.** and node
1dd0: 73 2e 20 41 6c 6c 20 6e 6f 64 65 73 20 61 6e 64  s. All nodes and
1de0: 20 6c 65 61 76 65 73 20 61 72 65 20 73 74 6f 72   leaves are stor
1df0: 65 64 20 69 6e 20 74 68 65 20 25 5f 64 61 74 61  ed in the %_data
1e00: 20 74 61 62 6c 65 20 77 69 74 68 20 6c 61 72 67   table with larg
1e10: 65 0a 2a 2a 20 70 6f 73 69 74 69 76 65 20 72 6f  e.** positive ro
1e20: 77 69 64 73 2e 0a 2a 2a 0a 2a 2a 20 45 61 63 68  wids..**.** Each
1e30: 20 73 65 67 6d 65 6e 74 20 68 61 73 20 61 20 75   segment has a u
1e40: 6e 69 71 75 65 20 6e 6f 6e 2d 7a 65 72 6f 20 31  nique non-zero 1
1e50: 36 2d 62 69 74 20 69 64 2e 0a 2a 2a 0a 2a 2a 20  6-bit id..**.** 
1e60: 54 68 65 20 72 6f 77 69 64 20 66 6f 72 20 65 61  The rowid for ea
1e70: 63 68 20 73 65 67 6d 65 6e 74 20 6c 65 61 66 20  ch segment leaf 
1e80: 69 73 20 66 6f 75 6e 64 20 62 79 20 70 61 73 73  is found by pass
1e90: 69 6e 67 20 74 68 65 20 73 65 67 6d 65 6e 74 20  ing the segment 
1ea0: 69 64 20 61 6e 64 20 0a 2a 2a 20 74 68 65 20 6c  id and .** the l
1eb0: 65 61 66 20 70 61 67 65 20 6e 75 6d 62 65 72 20  eaf page number 
1ec0: 74 6f 20 74 68 65 20 46 54 53 35 5f 53 45 47 4d  to the FTS5_SEGM
1ed0: 45 4e 54 5f 52 4f 57 49 44 20 6d 61 63 72 6f 2e  ENT_ROWID macro.
1ee0: 20 4c 65 61 76 65 73 20 61 72 65 20 6e 75 6d 62   Leaves are numb
1ef0: 65 72 65 64 0a 2a 2a 20 73 65 71 75 65 6e 74 69  ered.** sequenti
1f00: 61 6c 6c 79 20 73 74 61 72 74 69 6e 67 20 66 72  ally starting fr
1f10: 6f 6d 20 31 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  om 1..*/.#define
1f20: 20 46 54 53 35 5f 44 41 54 41 5f 49 44 5f 42 20   FTS5_DATA_ID_B 
1f30: 20 20 20 20 31 36 20 20 20 20 20 2f 2a 20 4d 61      16     /* Ma
1f40: 78 20 73 65 67 20 69 64 20 6e 75 6d 62 65 72 20  x seg id number 
1f50: 36 35 35 33 35 20 2a 2f 0a 23 64 65 66 69 6e 65  65535 */.#define
1f60: 20 46 54 53 35 5f 44 41 54 41 5f 44 4c 49 5f 42   FTS5_DATA_DLI_B
1f70: 20 20 20 20 20 31 20 20 20 20 20 2f 2a 20 44 6f       1     /* Do
1f80: 63 6c 69 73 74 2d 69 6e 64 65 78 20 66 6c 61 67  clist-index flag
1f90: 20 28 31 20 62 69 74 29 20 2a 2f 0a 23 64 65 66   (1 bit) */.#def
1fa0: 69 6e 65 20 46 54 53 35 5f 44 41 54 41 5f 48 45  ine FTS5_DATA_HE
1fb0: 49 47 48 54 5f 42 20 20 35 20 20 20 20 20 2f 2a  IGHT_B  5     /*
1fc0: 20 4d 61 78 20 64 6c 69 64 78 20 74 72 65 65 20   Max dlidx tree 
1fd0: 68 65 69 67 68 74 20 6f 66 20 33 32 20 2a 2f 0a  height of 32 */.
1fe0: 23 64 65 66 69 6e 65 20 46 54 53 35 5f 44 41 54  #define FTS5_DAT
1ff0: 41 5f 50 41 47 45 5f 42 20 20 20 33 31 20 20 20  A_PAGE_B   31   
2000: 20 20 2f 2a 20 4d 61 78 20 70 61 67 65 20 6e 75    /* Max page nu
2010: 6d 62 65 72 20 6f 66 20 32 31 34 37 34 38 33 36  mber of 21474836
2020: 34 38 20 2a 2f 0a 0a 23 64 65 66 69 6e 65 20 66  48 */..#define f
2030: 74 73 35 5f 64 72 69 28 73 65 67 69 64 2c 20 64  ts5_dri(segid, d
2040: 6c 69 64 78 2c 20 68 65 69 67 68 74 2c 20 70 67  lidx, height, pg
2050: 6e 6f 29 20 28 20 20 20 20 20 20 20 20 20 20 20  no) (           
2060: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2070: 20 20 20 20 20 20 5c 0a 20 28 28 69 36 34 29 28        \. ((i64)(
2080: 73 65 67 69 64 29 20 20 3c 3c 20 28 46 54 53 35  segid)  << (FTS5
2090: 5f 44 41 54 41 5f 50 41 47 45 5f 42 2b 46 54 53  _DATA_PAGE_B+FTS
20a0: 35 5f 44 41 54 41 5f 48 45 49 47 48 54 5f 42 2b  5_DATA_HEIGHT_B+
20b0: 46 54 53 35 5f 44 41 54 41 5f 44 4c 49 5f 42 29  FTS5_DATA_DLI_B)
20c0: 29 20 2b 20 20 20 20 5c 0a 20 28 28 69 36 34 29  ) +    \. ((i64)
20d0: 28 64 6c 69 64 78 29 20 20 3c 3c 20 28 46 54 53  (dlidx)  << (FTS
20e0: 35 5f 44 41 54 41 5f 50 41 47 45 5f 42 20 2b 20  5_DATA_PAGE_B + 
20f0: 46 54 53 35 5f 44 41 54 41 5f 48 45 49 47 48 54  FTS5_DATA_HEIGHT
2100: 5f 42 29 29 20 2b 20 20 20 20 20 20 20 20 20 20  _B)) +          
2110: 20 20 20 20 20 20 20 20 5c 0a 20 28 28 69 36 34          \. ((i64
2120: 29 28 68 65 69 67 68 74 29 20 3c 3c 20 28 46 54  )(height) << (FT
2130: 53 35 5f 44 41 54 41 5f 50 41 47 45 5f 42 29 29  S5_DATA_PAGE_B))
2140: 20 2b 20 20 20 20 20 20 20 20 20 20 20 20 20 20   +              
2150: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2160: 20 20 20 20 20 20 20 20 20 5c 0a 20 28 28 69 36           \. ((i6
2170: 34 29 28 70 67 6e 6f 29 29 20 20 20 20 20 20 20  4)(pgno))       
2180: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21b0: 20 20 20 20 20 20 20 20 20 20 5c 0a 29 0a 0a 23            \.)..#
21c0: 64 65 66 69 6e 65 20 46 54 53 35 5f 53 45 47 4d  define FTS5_SEGM
21d0: 45 4e 54 5f 52 4f 57 49 44 28 73 65 67 69 64 2c  ENT_ROWID(segid,
21e0: 20 70 67 6e 6f 29 20 20 20 20 20 20 20 66 74 73   pgno)       fts
21f0: 35 5f 64 72 69 28 73 65 67 69 64 2c 20 30 2c 20  5_dri(segid, 0, 
2200: 30 2c 20 70 67 6e 6f 29 0a 23 64 65 66 69 6e 65  0, pgno).#define
2210: 20 46 54 53 35 5f 44 4c 49 44 58 5f 52 4f 57 49   FTS5_DLIDX_ROWI
2220: 44 28 73 65 67 69 64 2c 20 68 65 69 67 68 74 2c  D(segid, height,
2230: 20 70 67 6e 6f 29 20 66 74 73 35 5f 64 72 69 28   pgno) fts5_dri(
2240: 73 65 67 69 64 2c 20 31 2c 20 68 65 69 67 68 74  segid, 1, height
2250: 2c 20 70 67 6e 6f 29 0a 0a 2f 2a 0a 2a 2a 20 4d  , pgno)../*.** M
2260: 61 78 69 6d 75 6d 20 73 65 67 6d 65 6e 74 73 20  aximum segments 
2270: 70 65 72 6d 69 74 74 65 64 20 69 6e 20 61 20 73  permitted in a s
2280: 69 6e 67 6c 65 20 69 6e 64 65 78 20 0a 2a 2f 0a  ingle index .*/.
2290: 23 64 65 66 69 6e 65 20 46 54 53 35 5f 4d 41 58  #define FTS5_MAX
22a0: 5f 53 45 47 4d 45 4e 54 20 32 30 30 30 0a 0a 23  _SEGMENT 2000..#
22b0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
22c0: 55 47 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74  UG.int sqlite3Ft
22d0: 73 35 43 6f 72 72 75 70 74 28 29 20 7b 20 72 65  s5Corrupt() { re
22e0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
22f0: 55 50 54 5f 56 54 41 42 3b 20 7d 0a 23 65 6e 64  UPT_VTAB; }.#end
2300: 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 45 61 63 68 20  if.../*.** Each 
2310: 74 69 6d 65 20 61 20 62 6c 6f 62 20 69 73 20 72  time a blob is r
2320: 65 61 64 20 66 72 6f 6d 20 74 68 65 20 25 5f 64  ead from the %_d
2330: 61 74 61 20 74 61 62 6c 65 2c 20 69 74 20 69 73  ata table, it is
2340: 20 70 61 64 64 65 64 20 77 69 74 68 20 74 68 69   padded with thi
2350: 73 0a 2a 2a 20 6d 61 6e 79 20 7a 65 72 6f 20 62  s.** many zero b
2360: 79 74 65 73 2e 20 54 68 69 73 20 6d 61 6b 65 73  ytes. This makes
2370: 20 69 74 20 65 61 73 69 65 72 20 74 6f 20 64 65   it easier to de
2380: 63 6f 64 65 20 74 68 65 20 76 61 72 69 6f 75 73  code the various
2390: 20 72 65 63 6f 72 64 20 66 6f 72 6d 61 74 73 0a   record formats.
23a0: 2a 2a 20 77 69 74 68 6f 75 74 20 6f 76 65 72 72  ** without overr
23b0: 65 61 64 69 6e 67 20 69 66 20 74 68 65 20 72 65  eading if the re
23c0: 63 6f 72 64 73 20 61 72 65 20 63 6f 72 72 75 70  cords are corrup
23d0: 74 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 46 54  t..*/.#define FT
23e0: 53 35 5f 44 41 54 41 5f 5a 45 52 4f 5f 50 41 44  S5_DATA_ZERO_PAD
23f0: 44 49 4e 47 20 38 0a 23 64 65 66 69 6e 65 20 46  DING 8.#define F
2400: 54 53 35 5f 44 41 54 41 5f 50 41 44 44 49 4e 47  TS5_DATA_PADDING
2410: 20 32 30 0a 0a 74 79 70 65 64 65 66 20 73 74 72   20..typedef str
2420: 75 63 74 20 46 74 73 35 44 61 74 61 20 46 74 73  uct Fts5Data Fts
2430: 35 44 61 74 61 3b 0a 74 79 70 65 64 65 66 20 73  5Data;.typedef s
2440: 74 72 75 63 74 20 46 74 73 35 44 6c 69 64 78 49  truct Fts5DlidxI
2450: 74 65 72 20 46 74 73 35 44 6c 69 64 78 49 74 65  ter Fts5DlidxIte
2460: 72 3b 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  r;.typedef struc
2470: 74 20 46 74 73 35 44 6c 69 64 78 4c 76 6c 20 46  t Fts5DlidxLvl F
2480: 74 73 35 44 6c 69 64 78 4c 76 6c 3b 0a 74 79 70  ts5DlidxLvl;.typ
2490: 65 64 65 66 20 73 74 72 75 63 74 20 46 74 73 35  edef struct Fts5
24a0: 44 6c 69 64 78 57 72 69 74 65 72 20 46 74 73 35  DlidxWriter Fts5
24b0: 44 6c 69 64 78 57 72 69 74 65 72 3b 0a 74 79 70  DlidxWriter;.typ
24c0: 65 64 65 66 20 73 74 72 75 63 74 20 46 74 73 35  edef struct Fts5
24d0: 49 74 65 72 20 46 74 73 35 49 74 65 72 3b 0a 74  Iter Fts5Iter;.t
24e0: 79 70 65 64 65 66 20 73 74 72 75 63 74 20 46 74  ypedef struct Ft
24f0: 73 35 50 61 67 65 57 72 69 74 65 72 20 46 74 73  s5PageWriter Fts
2500: 35 50 61 67 65 57 72 69 74 65 72 3b 0a 74 79 70  5PageWriter;.typ
2510: 65 64 65 66 20 73 74 72 75 63 74 20 46 74 73 35  edef struct Fts5
2520: 53 65 67 49 74 65 72 20 46 74 73 35 53 65 67 49  SegIter Fts5SegI
2530: 74 65 72 3b 0a 74 79 70 65 64 65 66 20 73 74 72  ter;.typedef str
2540: 75 63 74 20 46 74 73 35 44 6f 63 6c 69 73 74 49  uct Fts5DoclistI
2550: 74 65 72 20 46 74 73 35 44 6f 63 6c 69 73 74 49  ter Fts5DoclistI
2560: 74 65 72 3b 0a 74 79 70 65 64 65 66 20 73 74 72  ter;.typedef str
2570: 75 63 74 20 46 74 73 35 53 65 67 57 72 69 74 65  uct Fts5SegWrite
2580: 72 20 46 74 73 35 53 65 67 57 72 69 74 65 72 3b  r Fts5SegWriter;
2590: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
25a0: 46 74 73 35 53 74 72 75 63 74 75 72 65 20 46 74  Fts5Structure Ft
25b0: 73 35 53 74 72 75 63 74 75 72 65 3b 0a 74 79 70  s5Structure;.typ
25c0: 65 64 65 66 20 73 74 72 75 63 74 20 46 74 73 35  edef struct Fts5
25d0: 53 74 72 75 63 74 75 72 65 4c 65 76 65 6c 20 46  StructureLevel F
25e0: 74 73 35 53 74 72 75 63 74 75 72 65 4c 65 76 65  ts5StructureLeve
25f0: 6c 3b 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  l;.typedef struc
2600: 74 20 46 74 73 35 53 74 72 75 63 74 75 72 65 53  t Fts5StructureS
2610: 65 67 6d 65 6e 74 20 46 74 73 35 53 74 72 75 63  egment Fts5Struc
2620: 74 75 72 65 53 65 67 6d 65 6e 74 3b 0a 0a 73 74  tureSegment;..st
2630: 72 75 63 74 20 46 74 73 35 44 61 74 61 20 7b 0a  ruct Fts5Data {.
2640: 20 20 75 38 20 2a 70 3b 20 20 20 20 20 20 20 20    u8 *p;        
2650: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2660: 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
2670: 62 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e  buffer containin
2680: 67 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 69 6e  g record */.  in
2690: 74 20 6e 6e 3b 20 20 20 20 20 20 20 20 20 20 20  t nn;           
26a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
26b0: 20 53 69 7a 65 20 6f 66 20 72 65 63 6f 72 64 20   Size of record 
26c0: 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 69 6e  in bytes */.  in
26d0: 74 20 73 7a 4c 65 61 66 3b 20 20 20 20 20 20 20  t szLeaf;       
26e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
26f0: 20 53 69 7a 65 20 6f 66 20 6c 65 61 66 20 77 69   Size of leaf wi
2700: 74 68 6f 75 74 20 70 61 67 65 2d 69 6e 64 65 78  thout page-index
2710: 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 4f 6e   */.};../*.** On
2720: 65 20 6f 62 6a 65 63 74 20 70 65 72 20 25 5f 64  e object per %_d
2730: 61 74 61 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74  ata table..*/.st
2740: 72 75 63 74 20 46 74 73 35 49 6e 64 65 78 20 7b  ruct Fts5Index {
2750: 0a 20 20 46 74 73 35 43 6f 6e 66 69 67 20 2a 70  .  Fts5Config *p
2760: 43 6f 6e 66 69 67 3b 20 20 20 20 20 20 20 20 20  Config;         
2770: 20 20 20 2f 2a 20 56 69 72 74 75 61 6c 20 74 61     /* Virtual ta
2780: 62 6c 65 20 63 6f 6e 66 69 67 75 72 61 74 69 6f  ble configuratio
2790: 6e 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 44 61  n */.  char *zDa
27a0: 74 61 54 62 6c 3b 20 20 20 20 20 20 20 20 20 20  taTbl;          
27b0: 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
27c0: 66 20 25 5f 64 61 74 61 20 74 61 62 6c 65 20 2a  f %_data table *
27d0: 2f 0a 20 20 69 6e 74 20 6e 57 6f 72 6b 55 6e 69  /.  int nWorkUni
27e0: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
27f0: 20 20 20 20 2f 2a 20 4c 65 61 66 20 70 61 67 65      /* Leaf page
2800: 73 20 69 6e 20 61 20 22 75 6e 69 74 22 20 6f 66  s in a "unit" of
2810: 20 77 6f 72 6b 20 2a 2f 0a 0a 20 20 2f 2a 0a 20   work */..  /*. 
2820: 20 2a 2a 20 56 61 72 69 61 62 6c 65 73 20 72 65   ** Variables re
2830: 6c 61 74 65 64 20 74 6f 20 74 68 65 20 61 63 63  lated to the acc
2840: 75 6d 75 6c 61 74 69 6f 6e 20 6f 66 20 74 6f 6b  umulation of tok
2850: 65 6e 73 20 61 6e 64 20 64 6f 63 6c 69 73 74 73  ens and doclists
2860: 20 77 69 74 68 69 6e 20 74 68 65 0a 20 20 2a 2a   within the.  **
2870: 20 69 6e 2d 6d 65 6d 6f 72 79 20 68 61 73 68 20   in-memory hash 
2880: 74 61 62 6c 65 73 20 62 65 66 6f 72 65 20 74 68  tables before th
2890: 65 79 20 61 72 65 20 66 6c 75 73 68 65 64 20 74  ey are flushed t
28a0: 6f 20 64 69 73 6b 2e 0a 20 20 2a 2f 0a 20 20 46  o disk..  */.  F
28b0: 74 73 35 48 61 73 68 20 2a 70 48 61 73 68 3b 20  ts5Hash *pHash; 
28c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
28d0: 2a 20 48 61 73 68 20 74 61 62 6c 65 20 66 6f 72  * Hash table for
28e0: 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 20   in-memory data 
28f0: 2a 2f 0a 20 20 69 6e 74 20 6e 50 65 6e 64 69 6e  */.  int nPendin
2900: 67 44 61 74 61 3b 20 20 20 20 20 20 20 20 20 20  gData;          
2910: 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20       /* Current 
2920: 62 79 74 65 73 20 6f 66 20 70 65 6e 64 69 6e 67  bytes of pending
2930: 20 64 61 74 61 20 2a 2f 0a 20 20 69 36 34 20 69   data */.  i64 i
2940: 57 72 69 74 65 52 6f 77 69 64 3b 20 20 20 20 20  WriteRowid;     
2950: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f             /* Ro
2960: 77 69 64 20 66 6f 72 20 63 75 72 72 65 6e 74 20  wid for current 
2970: 64 6f 63 20 62 65 69 6e 67 20 77 72 69 74 74 65  doc being writte
2980: 6e 20 2a 2f 0a 20 20 69 6e 74 20 62 44 65 6c 65  n */.  int bDele
2990: 74 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  te;             
29a0: 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e         /* Curren
29b0: 74 20 77 72 69 74 65 20 69 73 20 61 20 64 65 6c  t write is a del
29c0: 65 74 65 20 2a 2f 0a 0a 20 20 2f 2a 20 45 72 72  ete */..  /* Err
29d0: 6f 72 20 73 74 61 74 65 2e 20 2a 2f 0a 20 20 69  or state. */.  i
29e0: 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
29f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2a00: 2a 20 43 75 72 72 65 6e 74 20 65 72 72 6f 72 20  * Current error 
2a10: 63 6f 64 65 20 2a 2f 0a 0a 20 20 2f 2a 20 53 74  code */..  /* St
2a20: 61 74 65 20 75 73 65 64 20 62 79 20 74 68 65 20  ate used by the 
2a30: 66 74 73 35 44 61 74 61 58 58 58 28 29 20 66 75  fts5DataXXX() fu
2a40: 6e 63 74 69 6f 6e 73 2e 20 2a 2f 0a 20 20 73 71  nctions. */.  sq
2a50: 6c 69 74 65 33 5f 62 6c 6f 62 20 2a 70 52 65 61  lite3_blob *pRea
2a60: 64 65 72 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  der;          /*
2a70: 20 52 4f 20 69 6e 63 72 2d 62 6c 6f 62 20 6f 70   RO incr-blob op
2a80: 65 6e 20 6f 6e 20 25 5f 64 61 74 61 20 74 61 62  en on %_data tab
2a90: 6c 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  le */.  sqlite3_
2aa0: 73 74 6d 74 20 2a 70 57 72 69 74 65 72 3b 20 20  stmt *pWriter;  
2ab0: 20 20 20 20 20 20 20 20 2f 2a 20 22 49 4e 53 45          /* "INSE
2ac0: 52 54 20 2e 2e 2e 20 25 5f 64 61 74 61 20 56 41  RT ... %_data VA
2ad0: 4c 55 45 53 28 3f 2c 3f 29 22 20 2a 2f 0a 20 20  LUES(?,?)" */.  
2ae0: 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 44  sqlite3_stmt *pD
2af0: 65 6c 65 74 65 72 3b 20 20 20 20 20 20 20 20 20  eleter;         
2b00: 2f 2a 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20  /* "DELETE FROM 
2b10: 25 5f 64 61 74 61 20 2e 2e 2e 20 69 64 3e 3d 3f  %_data ... id>=?
2b20: 20 41 4e 44 20 69 64 3c 3d 3f 22 20 2a 2f 0a 20   AND id<=?" */. 
2b30: 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
2b40: 49 64 78 57 72 69 74 65 72 3b 20 20 20 20 20 20  IdxWriter;      
2b50: 20 2f 2a 20 22 49 4e 53 45 52 54 20 2e 2e 2e 20   /* "INSERT ... 
2b60: 25 5f 69 64 78 20 56 41 4c 55 45 53 28 3f 2c 3f  %_idx VALUES(?,?
2b70: 2c 3f 2c 3f 29 22 20 2a 2f 0a 20 20 73 71 6c 69  ,?,?)" */.  sqli
2b80: 74 65 33 5f 73 74 6d 74 20 2a 70 49 64 78 44 65  te3_stmt *pIdxDe
2b90: 6c 65 74 65 72 3b 20 20 20 20 20 20 2f 2a 20 22  leter;      /* "
2ba0: 44 45 4c 45 54 45 20 46 52 4f 4d 20 25 5f 69 64  DELETE FROM %_id
2bb0: 78 20 57 48 45 52 45 20 73 65 67 69 64 3d 3f 20  x WHERE segid=? 
2bc0: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  */.  sqlite3_stm
2bd0: 74 20 2a 70 49 64 78 53 65 6c 65 63 74 3b 0a 20  t *pIdxSelect;. 
2be0: 20 69 6e 74 20 6e 52 65 61 64 3b 20 20 20 20 20   int nRead;     
2bf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c00: 20 2f 2a 20 54 6f 74 61 6c 20 6e 75 6d 62 65 72   /* Total number
2c10: 20 6f 66 20 62 6c 6f 63 6b 73 20 72 65 61 64 20   of blocks read 
2c20: 2a 2f 0a 0a 20 20 73 71 6c 69 74 65 33 5f 73 74  */..  sqlite3_st
2c30: 6d 74 20 2a 70 44 61 74 61 56 65 72 73 69 6f 6e  mt *pDataVersion
2c40: 3b 0a 20 20 69 36 34 20 69 53 74 72 75 63 74 56  ;.  i64 iStructV
2c50: 65 72 73 69 6f 6e 3b 20 20 20 20 20 20 20 20 20  ersion;         
2c60: 20 20 20 20 2f 2a 20 64 61 74 61 5f 76 65 72 73      /* data_vers
2c70: 69 6f 6e 20 77 68 65 6e 20 70 53 74 72 75 63 74  ion when pStruct
2c80: 20 72 65 61 64 20 2a 2f 0a 20 20 46 74 73 35 53   read */.  Fts5S
2c90: 74 72 75 63 74 75 72 65 20 2a 70 53 74 72 75 63  tructure *pStruc
2ca0: 74 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75  t;         /* Cu
2cb0: 72 72 65 6e 74 20 64 62 20 73 74 72 75 63 74 75  rrent db structu
2cc0: 72 65 20 28 6f 72 20 4e 55 4c 4c 29 20 2a 2f 0a  re (or NULL) */.
2cd0: 7d 3b 0a 0a 73 74 72 75 63 74 20 46 74 73 35 44  };..struct Fts5D
2ce0: 6f 63 6c 69 73 74 49 74 65 72 20 7b 0a 20 20 75  oclistIter {.  u
2cf0: 38 20 2a 61 45 6f 66 3b 20 20 20 20 20 20 20 20  8 *aEof;        
2d00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2d10: 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 31 20 62  * Pointer to 1 b
2d20: 79 74 65 20 70 61 73 74 20 65 6e 64 20 6f 66 20  yte past end of 
2d30: 64 6f 63 6c 69 73 74 20 2a 2f 0a 0a 20 20 2f 2a  doclist */..  /*
2d40: 20 4f 75 74 70 75 74 20 76 61 72 69 61 62 6c 65   Output variable
2d50: 73 2e 20 61 50 6f 73 6c 69 73 74 3d 3d 30 20 61  s. aPoslist==0 a
2d60: 74 20 45 4f 46 20 2a 2f 0a 20 20 69 36 34 20 69  t EOF */.  i64 i
2d70: 52 6f 77 69 64 3b 0a 20 20 75 38 20 2a 61 50 6f  Rowid;.  u8 *aPo
2d80: 73 6c 69 73 74 3b 0a 20 20 69 6e 74 20 6e 50 6f  slist;.  int nPo
2d90: 73 6c 69 73 74 3b 0a 20 20 69 6e 74 20 6e 53 69  slist;.  int nSi
2da0: 7a 65 3b 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68  ze;.};../*.** Th
2db0: 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
2dc0: 65 20 22 73 74 72 75 63 74 75 72 65 22 20 72 65  e "structure" re
2dd0: 63 6f 72 64 20 66 6f 72 20 65 61 63 68 20 69 6e  cord for each in
2de0: 64 65 78 20 61 72 65 20 72 65 70 72 65 73 65 6e  dex are represen
2df0: 74 65 64 0a 2a 2a 20 75 73 69 6e 67 20 61 6e 20  ted.** using an 
2e00: 46 74 73 35 53 74 72 75 63 74 75 72 65 20 72 65  Fts5Structure re
2e10: 63 6f 72 64 20 69 6e 20 6d 65 6d 6f 72 79 2e 20  cord in memory. 
2e20: 57 68 69 63 68 20 75 73 65 73 20 69 6e 73 74 61  Which uses insta
2e30: 6e 63 65 73 20 6f 66 20 74 68 65 20 0a 2a 2a 20  nces of the .** 
2e40: 6f 74 68 65 72 20 46 74 73 35 53 74 72 75 63 74  other Fts5Struct
2e50: 75 72 65 58 58 58 20 74 79 70 65 73 20 61 73 20  ureXXX types as 
2e60: 63 6f 6d 70 6f 6e 65 6e 74 73 2e 0a 2a 2f 0a 73  components..*/.s
2e70: 74 72 75 63 74 20 46 74 73 35 53 74 72 75 63 74  truct Fts5Struct
2e80: 75 72 65 53 65 67 6d 65 6e 74 20 7b 0a 20 20 69  ureSegment {.  i
2e90: 6e 74 20 69 53 65 67 69 64 3b 20 20 20 20 20 20  nt iSegid;      
2ea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2eb0: 2a 20 53 65 67 6d 65 6e 74 20 69 64 20 2a 2f 0a  * Segment id */.
2ec0: 20 20 69 6e 74 20 70 67 6e 6f 46 69 72 73 74 3b    int pgnoFirst;
2ed0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ee0: 20 20 2f 2a 20 46 69 72 73 74 20 6c 65 61 66 20    /* First leaf 
2ef0: 70 61 67 65 20 6e 75 6d 62 65 72 20 69 6e 20 73  page number in s
2f00: 65 67 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20  egment */.  int 
2f10: 70 67 6e 6f 4c 61 73 74 3b 20 20 20 20 20 20 20  pgnoLast;       
2f20: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
2f30: 61 73 74 20 6c 65 61 66 20 70 61 67 65 20 6e 75  ast leaf page nu
2f40: 6d 62 65 72 20 69 6e 20 73 65 67 6d 65 6e 74 20  mber in segment 
2f50: 2a 2f 0a 7d 3b 0a 73 74 72 75 63 74 20 46 74 73  */.};.struct Fts
2f60: 35 53 74 72 75 63 74 75 72 65 4c 65 76 65 6c 20  5StructureLevel 
2f70: 7b 0a 20 20 69 6e 74 20 6e 4d 65 72 67 65 3b 20  {.  int nMerge; 
2f80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f90: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
2fa0: 20 73 65 67 6d 65 6e 74 73 20 69 6e 20 69 6e 63   segments in inc
2fb0: 72 2d 6d 65 72 67 65 20 2a 2f 0a 20 20 69 6e 74  r-merge */.  int
2fc0: 20 6e 53 65 67 3b 20 20 20 20 20 20 20 20 20 20   nSeg;          
2fd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2fe0: 54 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20  Total number of 
2ff0: 73 65 67 6d 65 6e 74 73 20 6f 6e 20 6c 65 76 65  segments on leve
3000: 6c 20 2a 2f 0a 20 20 46 74 73 35 53 74 72 75 63  l */.  Fts5Struc
3010: 74 75 72 65 53 65 67 6d 65 6e 74 20 2a 61 53 65  tureSegment *aSe
3020: 67 3b 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20  g;     /* Array 
3030: 6f 66 20 73 65 67 6d 65 6e 74 73 2e 20 61 53 65  of segments. aSe
3040: 67 5b 30 5d 20 69 73 20 6f 6c 64 65 73 74 2e 20  g[0] is oldest. 
3050: 2a 2f 0a 7d 3b 0a 73 74 72 75 63 74 20 46 74 73  */.};.struct Fts
3060: 35 53 74 72 75 63 74 75 72 65 20 7b 0a 20 20 69  5Structure {.  i
3070: 6e 74 20 6e 52 65 66 3b 20 20 20 20 20 20 20 20  nt nRef;        
3080: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
3090: 2a 20 4f 62 6a 65 63 74 20 72 65 66 65 72 65 6e  * Object referen
30a0: 63 65 20 63 6f 75 6e 74 20 2a 2f 0a 20 20 75 36  ce count */.  u6
30b0: 34 20 6e 57 72 69 74 65 43 6f 75 6e 74 65 72 3b  4 nWriteCounter;
30c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
30d0: 20 54 6f 74 61 6c 20 6c 65 61 76 65 73 20 77 72   Total leaves wr
30e0: 69 74 74 65 6e 20 74 6f 20 6c 65 76 65 6c 20 30  itten to level 0
30f0: 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 65 67 6d 65   */.  int nSegme
3100: 6e 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  nt;             
3110: 20 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 73        /* Total s
3120: 65 67 6d 65 6e 74 73 20 69 6e 20 74 68 69 73 20  egments in this 
3130: 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 69  structure */.  i
3140: 6e 74 20 6e 4c 65 76 65 6c 3b 20 20 20 20 20 20  nt nLevel;      
3150: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
3160: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6c 65 76 65  * Number of leve
3170: 6c 73 20 69 6e 20 74 68 69 73 20 69 6e 64 65 78  ls in this index
3180: 20 2a 2f 0a 20 20 46 74 73 35 53 74 72 75 63 74   */.  Fts5Struct
3190: 75 72 65 4c 65 76 65 6c 20 61 4c 65 76 65 6c 5b  ureLevel aLevel[
31a0: 31 5d 3b 20 20 20 2f 2a 20 41 72 72 61 79 20 6f  1];   /* Array o
31b0: 66 20 6e 4c 65 76 65 6c 20 6c 65 76 65 6c 20 6f  f nLevel level o
31c0: 62 6a 65 63 74 73 20 2a 2f 0a 7d 3b 0a 0a 2f 2a  bjects */.};../*
31d0: 0a 2a 2a 20 41 6e 20 6f 62 6a 65 63 74 20 6f 66  .** An object of
31e0: 20 74 79 70 65 20 46 74 73 35 53 65 67 57 72 69   type Fts5SegWri
31f0: 74 65 72 20 69 73 20 75 73 65 64 20 74 6f 20 77  ter is used to w
3200: 72 69 74 65 20 74 6f 20 73 65 67 6d 65 6e 74 73  rite to segments
3210: 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 46 74 73 35  ..*/.struct Fts5
3220: 50 61 67 65 57 72 69 74 65 72 20 7b 0a 20 20 69  PageWriter {.  i
3230: 6e 74 20 70 67 6e 6f 3b 20 20 20 20 20 20 20 20  nt pgno;        
3240: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
3250: 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20 66 6f  * Page number fo
3260: 72 20 74 68 69 73 20 70 61 67 65 20 2a 2f 0a 20  r this page */. 
3270: 20 69 6e 74 20 69 50 72 65 76 50 67 69 64 78 3b   int iPrevPgidx;
3280: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3290: 20 2f 2a 20 50 72 65 76 69 6f 75 73 20 76 61 6c   /* Previous val
32a0: 75 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  ue written into 
32b0: 70 67 69 64 78 20 2a 2f 0a 20 20 46 74 73 35 42  pgidx */.  Fts5B
32c0: 75 66 66 65 72 20 62 75 66 3b 20 20 20 20 20 20  uffer buf;      
32d0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 75             /* Bu
32e0: 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20  ffer containing 
32f0: 6c 65 61 66 20 64 61 74 61 20 2a 2f 0a 20 20 46  leaf data */.  F
3300: 74 73 35 42 75 66 66 65 72 20 70 67 69 64 78 3b  ts5Buffer pgidx;
3310: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
3320: 2a 20 42 75 66 66 65 72 20 63 6f 6e 74 61 69 6e  * Buffer contain
3330: 69 6e 67 20 70 61 67 65 2d 69 6e 64 65 78 20 2a  ing page-index *
3340: 2f 0a 20 20 46 74 73 35 42 75 66 66 65 72 20 74  /.  Fts5Buffer t
3350: 65 72 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20  erm;            
3360: 20 20 20 20 2f 2a 20 42 75 66 66 65 72 20 63 6f      /* Buffer co
3370: 6e 74 61 69 6e 69 6e 67 20 70 72 65 76 69 6f 75  ntaining previou
3380: 73 20 74 65 72 6d 20 6f 6e 20 70 61 67 65 20 2a  s term on page *
3390: 2f 0a 7d 3b 0a 73 74 72 75 63 74 20 46 74 73 35  /.};.struct Fts5
33a0: 44 6c 69 64 78 57 72 69 74 65 72 20 7b 0a 20 20  DlidxWriter {.  
33b0: 69 6e 74 20 70 67 6e 6f 3b 20 20 20 20 20 20 20  int pgno;       
33c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33d0: 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20 66  /* Page number f
33e0: 6f 72 20 74 68 69 73 20 70 61 67 65 20 2a 2f 0a  or this page */.
33f0: 20 20 69 6e 74 20 62 50 72 65 76 56 61 6c 69 64    int bPrevValid
3400: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
3410: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 69 50 72    /* True if iPr
3420: 65 76 20 69 73 20 76 61 6c 69 64 20 2a 2f 0a 20  ev is valid */. 
3430: 20 69 36 34 20 69 50 72 65 76 3b 20 20 20 20 20   i64 iPrev;     
3440: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3450: 20 2f 2a 20 50 72 65 76 69 6f 75 73 20 72 6f 77   /* Previous row
3460: 69 64 20 76 61 6c 75 65 20 77 72 69 74 74 65 6e  id value written
3470: 20 74 6f 20 70 61 67 65 20 2a 2f 0a 20 20 46 74   to page */.  Ft
3480: 73 35 42 75 66 66 65 72 20 62 75 66 3b 20 20 20  s5Buffer buf;   
3490: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
34a0: 20 42 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69   Buffer containi
34b0: 6e 67 20 70 61 67 65 20 64 61 74 61 20 2a 2f 0a  ng page data */.
34c0: 7d 3b 0a 73 74 72 75 63 74 20 46 74 73 35 53 65  };.struct Fts5Se
34d0: 67 57 72 69 74 65 72 20 7b 0a 20 20 69 6e 74 20  gWriter {.  int 
34e0: 69 53 65 67 69 64 3b 20 20 20 20 20 20 20 20 20  iSegid;         
34f0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
3500: 65 67 69 64 20 74 6f 20 77 72 69 74 65 20 74 6f  egid to write to
3510: 20 2a 2f 0a 20 20 46 74 73 35 50 61 67 65 57 72   */.  Fts5PageWr
3520: 69 74 65 72 20 77 72 69 74 65 72 3b 20 20 20 20  iter writer;    
3530: 20 20 20 20 20 20 2f 2a 20 50 61 67 65 57 72 69        /* PageWri
3540: 74 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  ter object */.  
3550: 69 36 34 20 69 50 72 65 76 52 6f 77 69 64 3b 20  i64 iPrevRowid; 
3560: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3570: 2f 2a 20 50 72 65 76 69 6f 75 73 20 72 6f 77 69  /* Previous rowi
3580: 64 20 77 72 69 74 74 65 6e 20 74 6f 20 63 75 72  d written to cur
3590: 72 65 6e 74 20 6c 65 61 66 20 2a 2f 0a 20 20 75  rent leaf */.  u
35a0: 38 20 62 46 69 72 73 74 52 6f 77 69 64 49 6e 44  8 bFirstRowidInD
35b0: 6f 63 6c 69 73 74 3b 20 20 20 20 20 20 20 20 2f  oclist;        /
35c0: 2a 20 54 72 75 65 20 69 66 20 6e 65 78 74 20 72  * True if next r
35d0: 6f 77 69 64 20 69 73 20 66 69 72 73 74 20 69 6e  owid is first in
35e0: 20 64 6f 63 6c 69 73 74 20 2a 2f 0a 20 20 75 38   doclist */.  u8
35f0: 20 62 46 69 72 73 74 52 6f 77 69 64 49 6e 50 61   bFirstRowidInPa
3600: 67 65 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ge;           /*
3610: 20 54 72 75 65 20 69 66 20 6e 65 78 74 20 72 6f   True if next ro
3620: 77 69 64 20 69 73 20 66 69 72 73 74 20 69 6e 20  wid is first in 
3630: 70 61 67 65 20 2a 2f 0a 20 20 2f 2a 20 54 4f 44  page */.  /* TOD
3640: 4f 31 3a 20 43 61 6e 20 75 73 65 20 28 77 72 69  O1: Can use (wri
3650: 74 65 72 2e 70 67 69 64 78 2e 6e 3d 3d 30 29 20  ter.pgidx.n==0) 
3660: 69 6e 73 74 65 61 64 20 6f 66 20 62 46 69 72 73  instead of bFirs
3670: 74 54 65 72 6d 49 6e 50 61 67 65 20 2a 2f 0a 20  tTermInPage */. 
3680: 20 75 38 20 62 46 69 72 73 74 54 65 72 6d 49 6e   u8 bFirstTermIn
3690: 50 61 67 65 3b 20 20 20 20 20 20 20 20 20 20 20  Page;           
36a0: 20 2f 2a 20 54 72 75 65 20 69 66 20 6e 65 78 74   /* True if next
36b0: 20 74 65 72 6d 20 77 69 6c 6c 20 62 65 20 66 69   term will be fi
36c0: 72 73 74 20 69 6e 20 6c 65 61 66 20 2a 2f 0a 20  rst in leaf */. 
36d0: 20 69 6e 74 20 6e 4c 65 61 66 57 72 69 74 74 65   int nLeafWritte
36e0: 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n;              
36f0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6c 65   /* Number of le
3700: 61 66 20 70 61 67 65 73 20 77 72 69 74 74 65 6e  af pages written
3710: 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 6d 70 74 79   */.  int nEmpty
3720: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
3730: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
3740: 6f 66 20 63 6f 6e 74 69 67 75 6f 75 73 20 74 65  of contiguous te
3750: 72 6d 2d 6c 65 73 73 20 6e 6f 64 65 73 20 2a 2f  rm-less nodes */
3760: 0a 0a 20 20 69 6e 74 20 6e 44 6c 69 64 78 3b 20  ..  int nDlidx; 
3770: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3780: 20 20 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 64      /* Allocated
3790: 20 73 69 7a 65 20 6f 66 20 61 44 6c 69 64 78 5b   size of aDlidx[
37a0: 5d 20 61 72 72 61 79 20 2a 2f 0a 20 20 46 74 73  ] array */.  Fts
37b0: 35 44 6c 69 64 78 57 72 69 74 65 72 20 2a 61 44  5DlidxWriter *aD
37c0: 6c 69 64 78 3b 20 20 20 20 20 20 20 20 2f 2a 20  lidx;        /* 
37d0: 41 72 72 61 79 20 6f 66 20 46 74 73 35 44 6c 69  Array of Fts5Dli
37e0: 64 78 57 72 69 74 65 72 20 6f 62 6a 65 63 74 73  dxWriter objects
37f0: 20 2a 2f 0a 0a 20 20 2f 2a 20 56 61 6c 75 65 73   */..  /* Values
3800: 20 74 6f 20 69 6e 73 65 72 74 20 69 6e 74 6f 20   to insert into 
3810: 74 68 65 20 25 5f 69 64 78 20 74 61 62 6c 65 20  the %_idx table 
3820: 2a 2f 0a 20 20 46 74 73 35 42 75 66 66 65 72 20  */.  Fts5Buffer 
3830: 62 74 74 65 72 6d 3b 20 20 20 20 20 20 20 20 20  btterm;         
3840: 20 20 20 20 20 2f 2a 20 4e 65 78 74 20 74 65 72       /* Next ter
3850: 6d 20 74 6f 20 69 6e 73 65 72 74 20 69 6e 74 6f  m to insert into
3860: 20 25 5f 69 64 78 20 74 61 62 6c 65 20 2a 2f 0a   %_idx table */.
3870: 20 20 69 6e 74 20 69 42 74 50 61 67 65 3b 20 20    int iBtPage;  
3880: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3890: 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72    /* Page number
38a0: 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74   corresponding t
38b0: 6f 20 62 74 74 65 72 6d 20 2a 2f 0a 7d 3b 0a 0a  o btterm */.};..
38c0: 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 46  typedef struct F
38d0: 74 73 35 43 52 65 73 75 6c 74 20 46 74 73 35 43  ts5CResult Fts5C
38e0: 52 65 73 75 6c 74 3b 0a 73 74 72 75 63 74 20 46  Result;.struct F
38f0: 74 73 35 43 52 65 73 75 6c 74 20 7b 0a 20 20 75  ts5CResult {.  u
3900: 31 36 20 69 46 69 72 73 74 3b 20 20 20 20 20 20  16 iFirst;      
3910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
3920: 2a 20 61 53 65 67 5b 5d 20 69 6e 64 65 78 20 6f  * aSeg[] index o
3930: 66 20 66 69 72 73 74 65 73 74 20 69 74 65 72 61  f firstest itera
3940: 74 6f 72 20 2a 2f 0a 20 20 75 38 20 62 54 65 72  tor */.  u8 bTer
3950: 6d 45 71 3b 20 20 20 20 20 20 20 20 20 20 20 20  mEq;            
3960: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
3970: 20 69 66 20 74 68 65 20 74 65 72 6d 73 20 61 72   if the terms ar
3980: 65 20 65 71 75 61 6c 20 2a 2f 0a 7d 3b 0a 0a 2f  e equal */.};../
3990: 2a 0a 2a 2a 20 4f 62 6a 65 63 74 20 66 6f 72 20  *.** Object for 
39a0: 69 74 65 72 61 74 69 6e 67 20 74 68 72 6f 75 67  iterating throug
39b0: 68 20 61 20 73 69 6e 67 6c 65 20 73 65 67 6d 65  h a single segme
39c0: 6e 74 2c 20 76 69 73 69 74 69 6e 67 20 65 61 63  nt, visiting eac
39d0: 68 20 74 65 72 6d 2f 72 6f 77 69 64 0a 2a 2a 20  h term/rowid.** 
39e0: 70 61 69 72 20 69 6e 20 74 68 65 20 73 65 67 6d  pair in the segm
39f0: 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 70 53 65 67 3a  ent..**.** pSeg:
3a00: 0a 2a 2a 20 20 20 54 68 65 20 73 65 67 6d 65 6e  .**   The segmen
3a10: 74 20 74 6f 20 69 74 65 72 61 74 65 20 74 68 72  t to iterate thr
3a20: 6f 75 67 68 2e 0a 2a 2a 0a 2a 2a 20 69 4c 65 61  ough..**.** iLea
3a30: 66 50 67 6e 6f 3a 0a 2a 2a 20 20 20 43 75 72 72  fPgno:.**   Curr
3a40: 65 6e 74 20 6c 65 61 66 20 70 61 67 65 20 6e 75  ent leaf page nu
3a50: 6d 62 65 72 20 77 69 74 68 69 6e 20 73 65 67 6d  mber within segm
3a60: 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 69 4c 65 61 66  ent..**.** iLeaf
3a70: 4f 66 66 73 65 74 3a 0a 2a 2a 20 20 20 42 79 74  Offset:.**   Byt
3a80: 65 20 6f 66 66 73 65 74 20 77 69 74 68 69 6e 20  e offset within 
3a90: 74 68 65 20 63 75 72 72 65 6e 74 20 6c 65 61 66  the current leaf
3aa0: 20 74 68 61 74 20 69 73 20 74 68 65 20 66 69 72   that is the fir
3ab0: 73 74 20 62 79 74 65 20 6f 66 20 74 68 65 20 0a  st byte of the .
3ac0: 2a 2a 20 20 20 70 6f 73 69 74 69 6f 6e 20 6c 69  **   position li
3ad0: 73 74 20 64 61 74 61 20 28 6f 6e 65 20 62 79 74  st data (one byt
3ae0: 65 20 70 61 73 73 65 64 20 74 68 65 20 70 6f 73  e passed the pos
3af0: 69 74 69 6f 6e 2d 6c 69 73 74 20 73 69 7a 65 20  ition-list size 
3b00: 66 69 65 6c 64 29 2e 0a 2a 2a 20 20 20 72 6f 77  field)..**   row
3b10: 69 64 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20  id field of the 
3b20: 63 75 72 72 65 6e 74 20 65 6e 74 72 79 2e 20 55  current entry. U
3b30: 73 75 61 6c 6c 79 20 74 68 69 73 20 69 73 20 74  sually this is t
3b40: 68 65 20 73 69 7a 65 20 66 69 65 6c 64 20 6f 66  he size field of
3b50: 20 74 68 65 0a 2a 2a 20 20 20 70 6f 73 69 74 69   the.**   positi
3b60: 6f 6e 20 6c 69 73 74 20 64 61 74 61 2e 20 54 68  on list data. Th
3b70: 65 20 65 78 63 65 70 74 69 6f 6e 20 69 73 20 69  e exception is i
3b80: 66 20 74 68 65 20 72 6f 77 69 64 20 66 6f 72 20  f the rowid for 
3b90: 74 68 65 20 63 75 72 72 65 6e 74 20 65 6e 74 72  the current entr
3ba0: 79 20 0a 2a 2a 20 20 20 69 73 20 74 68 65 20 6c  y .**   is the l
3bb0: 61 73 74 20 74 68 69 6e 67 20 6f 6e 20 74 68 65  ast thing on the
3bc0: 20 6c 65 61 66 20 70 61 67 65 2e 0a 2a 2a 0a 2a   leaf page..**.*
3bd0: 2a 20 70 4c 65 61 66 3a 0a 2a 2a 20 20 20 42 75  * pLeaf:.**   Bu
3be0: 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20  ffer containing 
3bf0: 63 75 72 72 65 6e 74 20 6c 65 61 66 20 70 61 67  current leaf pag
3c00: 65 20 64 61 74 61 2e 20 53 65 74 20 74 6f 20 4e  e data. Set to N
3c10: 55 4c 4c 20 61 74 20 45 4f 46 2e 0a 2a 2a 0a 2a  ULL at EOF..**.*
3c20: 2a 20 69 54 65 72 6d 4c 65 61 66 50 67 6e 6f 2c  * iTermLeafPgno,
3c30: 20 69 54 65 72 6d 4c 65 61 66 4f 66 66 73 65 74   iTermLeafOffset
3c40: 3a 0a 2a 2a 20 20 20 4c 65 61 66 20 70 61 67 65  :.**   Leaf page
3c50: 20 6e 75 6d 62 65 72 20 63 6f 6e 74 61 69 6e 69   number containi
3c60: 6e 67 20 74 68 65 20 6c 61 73 74 20 74 65 72 6d  ng the last term
3c70: 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 73   read from the s
3c80: 65 67 6d 65 6e 74 2e 20 41 6e 64 0a 2a 2a 20 20  egment. And.**  
3c90: 20 74 68 65 20 6f 66 66 73 65 74 20 69 6d 6d 65   the offset imme
3ca0: 64 69 61 74 65 6c 79 20 66 6f 6c 6c 6f 77 69 6e  diately followin
3cb0: 67 20 74 68 65 20 74 65 72 6d 20 64 61 74 61 2e  g the term data.
3cc0: 0a 2a 2a 0a 2a 2a 20 66 6c 61 67 73 3a 0a 2a 2a  .**.** flags:.**
3cd0: 20 20 20 4d 61 73 6b 20 6f 66 20 46 54 53 35 5f     Mask of FTS5_
3ce0: 53 45 47 49 54 45 52 5f 58 58 58 20 76 61 6c 75  SEGITER_XXX valu
3cf0: 65 73 2e 20 49 6e 74 65 72 70 72 65 74 65 64 20  es. Interpreted 
3d00: 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a  as follows:.**.*
3d10: 2a 20 20 20 46 54 53 35 5f 53 45 47 49 54 45 52  *   FTS5_SEGITER
3d20: 5f 4f 4e 45 54 45 52 4d 3a 0a 2a 2a 20 20 20 20  _ONETERM:.**    
3d30: 20 49 66 20 73 65 74 2c 20 73 65 74 20 74 68 65   If set, set the
3d40: 20 69 74 65 72 61 74 6f 72 20 74 6f 20 70 6f 69   iterator to poi
3d50: 6e 74 20 74 6f 20 45 4f 46 20 61 66 74 65 72 20  nt to EOF after 
3d60: 74 68 65 20 63 75 72 72 65 6e 74 20 64 6f 63 6c  the current docl
3d70: 69 73 74 20 0a 2a 2a 20 20 20 20 20 68 61 73 20  ist .**     has 
3d80: 62 65 65 6e 20 65 78 68 61 75 73 74 65 64 2e 20  been exhausted. 
3d90: 44 6f 20 6e 6f 74 20 70 72 6f 63 65 65 64 20 74  Do not proceed t
3da0: 6f 20 74 68 65 20 6e 65 78 74 20 74 65 72 6d 20  o the next term 
3db0: 69 6e 20 74 68 65 20 73 65 67 6d 65 6e 74 2e 0a  in the segment..
3dc0: 2a 2a 0a 2a 2a 20 20 20 46 54 53 35 5f 53 45 47  **.**   FTS5_SEG
3dd0: 49 54 45 52 5f 52 45 56 45 52 53 45 3a 0a 2a 2a  ITER_REVERSE:.**
3de0: 20 20 20 20 20 54 68 69 73 20 66 6c 61 67 20 69       This flag i
3df0: 73 20 6f 6e 6c 79 20 65 76 65 72 20 73 65 74 20  s only ever set 
3e00: 69 66 20 46 54 53 35 5f 53 45 47 49 54 45 52 5f  if FTS5_SEGITER_
3e10: 4f 4e 45 54 45 52 4d 20 69 73 20 61 6c 73 6f 20  ONETERM is also 
3e20: 73 65 74 2e 20 49 66 0a 2a 2a 20 20 20 20 20 69  set. If.**     i
3e30: 74 20 69 73 20 73 65 74 2c 20 69 74 65 72 61 74  t is set, iterat
3e40: 65 20 74 68 72 6f 75 67 68 20 72 6f 77 69 64 20  e through rowid 
3e50: 69 6e 20 64 65 73 63 65 6e 64 69 6e 67 20 6f 72  in descending or
3e60: 64 65 72 20 69 6e 73 74 65 61 64 20 6f 66 20 74  der instead of t
3e70: 68 65 0a 2a 2a 20 20 20 20 20 64 65 66 61 75 6c  he.**     defaul
3e80: 74 20 61 73 63 65 6e 64 69 6e 67 20 6f 72 64 65  t ascending orde
3e90: 72 2e 0a 2a 2a 0a 2a 2a 20 69 52 6f 77 69 64 4f  r..**.** iRowidO
3ea0: 66 66 73 65 74 2f 6e 52 6f 77 69 64 4f 66 66 73  ffset/nRowidOffs
3eb0: 65 74 2f 61 52 6f 77 69 64 4f 66 66 73 65 74 3a  et/aRowidOffset:
3ec0: 0a 2a 2a 20 20 20 20 20 54 68 65 73 65 20 61 72  .**     These ar
3ed0: 65 20 75 73 65 64 20 69 66 20 74 68 65 20 46 54  e used if the FT
3ee0: 53 35 5f 53 45 47 49 54 45 52 5f 52 45 56 45 52  S5_SEGITER_REVER
3ef0: 53 45 20 66 6c 61 67 20 69 73 20 73 65 74 2e 0a  SE flag is set..
3f00: 2a 2a 0a 2a 2a 20 20 20 20 20 46 6f 72 20 65 61  **.**     For ea
3f10: 63 68 20 72 6f 77 69 64 20 6f 6e 20 74 68 65 20  ch rowid on the 
3f20: 70 61 67 65 20 63 6f 72 72 65 73 70 6f 6e 64 69  page correspondi
3f30: 6e 67 20 74 6f 20 74 68 65 20 63 75 72 72 65 6e  ng to the curren
3f40: 74 20 74 65 72 6d 2c 20 74 68 65 0a 2a 2a 20 20  t term, the.**  
3f50: 20 20 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67     corresponding
3f60: 20 61 52 6f 77 69 64 4f 66 66 73 65 74 5b 5d 20   aRowidOffset[] 
3f70: 65 6e 74 72 79 20 69 73 20 73 65 74 20 74 6f 20  entry is set to 
3f80: 74 68 65 20 62 79 74 65 20 6f 66 66 73 65 74 20  the byte offset 
3f90: 6f 66 20 74 68 65 0a 2a 2a 20 20 20 20 20 73 74  of the.**     st
3fa0: 61 72 74 20 6f 66 20 74 68 65 20 22 70 6f 73 69  art of the "posi
3fb0: 74 69 6f 6e 2d 6c 69 73 74 2d 73 69 7a 65 22 20  tion-list-size" 
3fc0: 66 69 65 6c 64 20 77 69 74 68 69 6e 20 74 68 65  field within the
3fd0: 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 69 54 65   page..**.** iTe
3fe0: 72 6d 49 64 78 3a 0a 2a 2a 20 20 20 20 20 49 6e  rmIdx:.**     In
3ff0: 64 65 78 20 6f 66 20 63 75 72 72 65 6e 74 20 74  dex of current t
4000: 65 72 6d 20 6f 6e 20 69 54 65 72 6d 4c 65 61 66  erm on iTermLeaf
4010: 50 67 6e 6f 2e 0a 2a 2f 0a 73 74 72 75 63 74 20  Pgno..*/.struct 
4020: 46 74 73 35 53 65 67 49 74 65 72 20 7b 0a 20 20  Fts5SegIter {.  
4030: 46 74 73 35 53 74 72 75 63 74 75 72 65 53 65 67  Fts5StructureSeg
4040: 6d 65 6e 74 20 2a 70 53 65 67 3b 20 20 20 20 20  ment *pSeg;     
4050: 2f 2a 20 53 65 67 6d 65 6e 74 20 74 6f 20 69 74  /* Segment to it
4060: 65 72 61 74 65 20 74 68 72 6f 75 67 68 20 2a 2f  erate through */
4070: 0a 20 20 69 6e 74 20 66 6c 61 67 73 3b 20 20 20  .  int flags;   
4080: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4090: 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 63 6f     /* Mask of co
40a0: 6e 66 69 67 75 72 61 74 69 6f 6e 20 66 6c 61 67  nfiguration flag
40b0: 73 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 65 61 66  s */.  int iLeaf
40c0: 50 67 6e 6f 3b 20 20 20 20 20 20 20 20 20 20 20  Pgno;           
40d0: 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e         /* Curren
40e0: 74 20 6c 65 61 66 20 70 61 67 65 20 6e 75 6d 62  t leaf page numb
40f0: 65 72 20 2a 2f 0a 20 20 46 74 73 35 44 61 74 61  er */.  Fts5Data
4100: 20 2a 70 4c 65 61 66 3b 20 20 20 20 20 20 20 20   *pLeaf;        
4110: 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65          /* Curre
4120: 6e 74 20 6c 65 61 66 20 64 61 74 61 20 2a 2f 0a  nt leaf data */.
4130: 20 20 46 74 73 35 44 61 74 61 20 2a 70 4e 65 78    Fts5Data *pNex
4140: 74 4c 65 61 66 3b 20 20 20 20 20 20 20 20 20 20  tLeaf;          
4150: 20 20 2f 2a 20 4c 65 61 66 20 70 61 67 65 20 28    /* Leaf page (
4160: 69 4c 65 61 66 50 67 6e 6f 2b 31 29 20 2a 2f 0a  iLeafPgno+1) */.
4170: 20 20 69 6e 74 20 69 4c 65 61 66 4f 66 66 73 65    int iLeafOffse
4180: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
4190: 20 20 2f 2a 20 42 79 74 65 20 6f 66 66 73 65 74    /* Byte offset
41a0: 20 77 69 74 68 69 6e 20 63 75 72 72 65 6e 74 20   within current 
41b0: 6c 65 61 66 20 2a 2f 0a 0a 20 20 2f 2a 20 4e 65  leaf */..  /* Ne
41c0: 78 74 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 76  xt method */.  v
41d0: 6f 69 64 20 28 2a 78 4e 65 78 74 29 28 46 74 73  oid (*xNext)(Fts
41e0: 35 49 6e 64 65 78 2a 2c 20 46 74 73 35 53 65 67  5Index*, Fts5Seg
41f0: 49 74 65 72 2a 2c 20 69 6e 74 2a 29 3b 0a 0a 20  Iter*, int*);.. 
4200: 20 2f 2a 20 54 68 65 20 70 61 67 65 20 61 6e 64   /* The page and
4210: 20 6f 66 66 73 65 74 20 66 72 6f 6d 20 77 68 69   offset from whi
4220: 63 68 20 74 68 65 20 63 75 72 72 65 6e 74 20 74  ch the current t
4230: 65 72 6d 20 77 61 73 20 72 65 61 64 2e 20 54 68  erm was read. Th
4240: 65 20 6f 66 66 73 65 74 20 0a 20 20 2a 2a 20 69  e offset .  ** i
4250: 73 20 74 68 65 20 6f 66 66 73 65 74 20 6f 66 20  s the offset of 
4260: 74 68 65 20 66 69 72 73 74 20 72 6f 77 69 64 20  the first rowid 
4270: 69 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 64  in the current d
4280: 6f 63 6c 69 73 74 2e 20 20 2a 2f 0a 20 20 69 6e  oclist.  */.  in
4290: 74 20 69 54 65 72 6d 4c 65 61 66 50 67 6e 6f 3b  t iTermLeafPgno;
42a0: 0a 20 20 69 6e 74 20 69 54 65 72 6d 4c 65 61 66  .  int iTermLeaf
42b0: 4f 66 66 73 65 74 3b 0a 0a 20 20 69 6e 74 20 69  Offset;..  int i
42c0: 50 67 69 64 78 4f 66 66 3b 20 20 20 20 20 20 20  PgidxOff;       
42d0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65             /* Ne
42e0: 78 74 20 6f 66 66 73 65 74 20 69 6e 20 70 67 69  xt offset in pgi
42f0: 64 78 20 2a 2f 0a 20 20 69 6e 74 20 69 45 6e 64  dx */.  int iEnd
4300: 6f 66 44 6f 63 6c 69 73 74 3b 0a 0a 20 20 2f 2a  ofDoclist;..  /*
4310: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61   The following a
4320: 72 65 20 6f 6e 6c 79 20 75 73 65 64 20 69 66 20  re only used if 
4330: 74 68 65 20 46 54 53 35 5f 53 45 47 49 54 45 52  the FTS5_SEGITER
4340: 5f 52 45 56 45 52 53 45 20 66 6c 61 67 20 69 73  _REVERSE flag is
4350: 20 73 65 74 2e 20 2a 2f 0a 20 20 69 6e 74 20 69   set. */.  int i
4360: 52 6f 77 69 64 4f 66 66 73 65 74 3b 20 20 20 20  RowidOffset;    
4370: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75             /* Cu
4380: 72 72 65 6e 74 20 65 6e 74 72 79 20 69 6e 20 61  rrent entry in a
4390: 52 6f 77 69 64 4f 66 66 73 65 74 5b 5d 20 2a 2f  RowidOffset[] */
43a0: 0a 20 20 69 6e 74 20 6e 52 6f 77 69 64 4f 66 66  .  int nRowidOff
43b0: 73 65 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  set;            
43c0: 20 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 64 20     /* Allocated 
43d0: 73 69 7a 65 20 6f 66 20 61 52 6f 77 69 64 4f 66  size of aRowidOf
43e0: 66 73 65 74 5b 5d 20 61 72 72 61 79 20 2a 2f 0a  fset[] array */.
43f0: 20 20 69 6e 74 20 2a 61 52 6f 77 69 64 4f 66 66    int *aRowidOff
4400: 73 65 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  set;            
4410: 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 6f 66    /* Array of of
4420: 66 73 65 74 20 74 6f 20 72 6f 77 69 64 20 66 69  fset to rowid fi
4430: 65 6c 64 73 20 2a 2f 0a 0a 20 20 46 74 73 35 44  elds */..  Fts5D
4440: 6c 69 64 78 49 74 65 72 20 2a 70 44 6c 69 64 78  lidxIter *pDlidx
4450: 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66  ;          /* If
4460: 20 74 68 65 72 65 20 69 73 20 61 20 64 6f 63 6c   there is a docl
4470: 69 73 74 2d 69 6e 64 65 78 20 2a 2f 0a 0a 20 20  ist-index */..  
4480: 2f 2a 20 56 61 72 69 61 62 6c 65 73 20 70 6f 70  /* Variables pop
4490: 75 6c 61 74 65 64 20 62 61 73 65 64 20 6f 6e 20  ulated based on 
44a0: 63 75 72 72 65 6e 74 20 65 6e 74 72 79 2e 20 2a  current entry. *
44b0: 2f 0a 20 20 46 74 73 35 42 75 66 66 65 72 20 74  /.  Fts5Buffer t
44c0: 65 72 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20  erm;            
44d0: 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 74      /* Current t
44e0: 65 72 6d 20 2a 2f 0a 20 20 69 36 34 20 69 52 6f  erm */.  i64 iRo
44f0: 77 69 64 3b 20 20 20 20 20 20 20 20 20 20 20 20  wid;            
4500: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72           /* Curr
4510: 65 6e 74 20 72 6f 77 69 64 20 2a 2f 0a 20 20 69  ent rowid */.  i
4520: 6e 74 20 6e 50 6f 73 3b 20 20 20 20 20 20 20 20  nt nPos;        
4530: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
4540: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  * Number of byte
4550: 73 20 69 6e 20 63 75 72 72 65 6e 74 20 70 6f 73  s in current pos
4560: 69 74 69 6f 6e 20 6c 69 73 74 20 2a 2f 0a 20 20  ition list */.  
4570: 75 38 20 62 44 65 6c 3b 20 20 20 20 20 20 20 20  u8 bDel;        
4580: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4590: 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65 20 64  /* True if the d
45a0: 65 6c 65 74 65 20 66 6c 61 67 20 69 73 20 73 65  elete flag is se
45b0: 74 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41  t */.};../*.** A
45c0: 72 67 75 6d 65 6e 74 20 69 73 20 61 20 70 6f 69  rgument is a poi
45d0: 6e 74 65 72 20 74 6f 20 61 6e 20 46 74 73 35 44  nter to an Fts5D
45e0: 61 74 61 20 73 74 72 75 63 74 75 72 65 20 74 68  ata structure th
45f0: 61 74 20 63 6f 6e 74 61 69 6e 73 20 61 20 0a 2a  at contains a .*
4600: 2a 20 6c 65 61 66 20 70 61 67 65 2e 0a 2a 2f 0a  * leaf page..*/.
4610: 23 64 65 66 69 6e 65 20 41 53 53 45 52 54 5f 53  #define ASSERT_S
4620: 5a 4c 45 41 46 5f 4f 4b 28 78 29 20 61 73 73 65  ZLEAF_OK(x) asse
4630: 72 74 28 20 5c 0a 20 20 20 20 28 78 29 2d 3e 73  rt( \.    (x)->s
4640: 7a 4c 65 61 66 3d 3d 28 78 29 2d 3e 6e 6e 20 7c  zLeaf==(x)->nn |
4650: 7c 20 28 78 29 2d 3e 73 7a 4c 65 61 66 3d 3d 66  | (x)->szLeaf==f
4660: 74 73 35 47 65 74 55 31 36 28 26 28 78 29 2d 3e  ts5GetU16(&(x)->
4670: 70 5b 32 5d 29 20 5c 0a 29 0a 0a 23 64 65 66 69  p[2]) \.)..#defi
4680: 6e 65 20 46 54 53 35 5f 53 45 47 49 54 45 52 5f  ne FTS5_SEGITER_
4690: 4f 4e 45 54 45 52 4d 20 30 78 30 31 0a 23 64 65  ONETERM 0x01.#de
46a0: 66 69 6e 65 20 46 54 53 35 5f 53 45 47 49 54 45  fine FTS5_SEGITE
46b0: 52 5f 52 45 56 45 52 53 45 20 30 78 30 32 0a 0a  R_REVERSE 0x02..
46c0: 2f 2a 20 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20  /* .** Argument 
46d0: 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  is a pointer to 
46e0: 61 6e 20 46 74 73 35 44 61 74 61 20 73 74 72 75  an Fts5Data stru
46f0: 63 74 75 72 65 20 74 68 61 74 20 63 6f 6e 74 61  cture that conta
4700: 69 6e 73 20 61 20 6c 65 61 66 0a 2a 2a 20 70 61  ins a leaf.** pa
4710: 67 65 2e 20 54 68 69 73 20 6d 61 63 72 6f 20 65  ge. This macro e
4720: 76 61 6c 75 61 74 65 73 20 74 6f 20 74 72 75 65  valuates to true
4730: 20 69 66 20 74 68 65 20 6c 65 61 66 20 63 6f 6e   if the leaf con
4740: 74 61 69 6e 73 20 6e 6f 20 74 65 72 6d 73 2c 20  tains no terms, 
4750: 6f 72 0a 2a 2a 20 66 61 6c 73 65 20 69 66 20 69  or.** false if i
4760: 74 20 63 6f 6e 74 61 69 6e 73 20 61 74 20 6c 65  t contains at le
4770: 61 73 74 20 6f 6e 65 20 74 65 72 6d 2e 0a 2a 2f  ast one term..*/
4780: 0a 23 64 65 66 69 6e 65 20 66 74 73 35 4c 65 61  .#define fts5Lea
4790: 66 49 73 54 65 72 6d 6c 65 73 73 28 78 29 20 28  fIsTermless(x) (
47a0: 28 78 29 2d 3e 73 7a 4c 65 61 66 20 3e 3d 20 28  (x)->szLeaf >= (
47b0: 78 29 2d 3e 6e 6e 29 0a 0a 23 64 65 66 69 6e 65  x)->nn)..#define
47c0: 20 66 74 73 35 4c 65 61 66 54 65 72 6d 4f 66 66   fts5LeafTermOff
47d0: 28 78 2c 20 69 29 20 28 66 74 73 35 47 65 74 55  (x, i) (fts5GetU
47e0: 31 36 28 26 28 78 29 2d 3e 70 5b 28 78 29 2d 3e  16(&(x)->p[(x)->
47f0: 73 7a 4c 65 61 66 20 2b 20 28 69 29 2a 32 5d 29  szLeaf + (i)*2])
4800: 29 0a 0a 23 64 65 66 69 6e 65 20 66 74 73 35 4c  )..#define fts5L
4810: 65 61 66 46 69 72 73 74 52 6f 77 69 64 4f 66 66  eafFirstRowidOff
4820: 28 78 29 20 28 66 74 73 35 47 65 74 55 31 36 28  (x) (fts5GetU16(
4830: 28 78 29 2d 3e 70 29 29 0a 0a 2f 2a 0a 2a 2a 20  (x)->p))../*.** 
4840: 4f 62 6a 65 63 74 20 66 6f 72 20 69 74 65 72 61  Object for itera
4850: 74 69 6e 67 20 74 68 72 6f 75 67 68 20 74 68 65  ting through the
4860: 20 6d 65 72 67 65 64 20 72 65 73 75 6c 74 73 20   merged results 
4870: 6f 66 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 73  of one or more s
4880: 65 67 6d 65 6e 74 73 2c 0a 2a 2a 20 76 69 73 69  egments,.** visi
4890: 74 69 6e 67 20 65 61 63 68 20 74 65 72 6d 2f 72  ting each term/r
48a0: 6f 77 69 64 20 70 61 69 72 20 69 6e 20 74 68 65  owid pair in the
48b0: 20 6d 65 72 67 65 64 20 64 61 74 61 2e 0a 2a 2a   merged data..**
48c0: 0a 2a 2a 20 6e 53 65 67 20 69 73 20 61 6c 77 61  .** nSeg is alwa
48d0: 79 73 20 61 20 70 6f 77 65 72 20 6f 66 20 74 77  ys a power of tw
48e0: 6f 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 6f  o greater than o
48f0: 72 20 65 71 75 61 6c 20 74 6f 20 74 68 65 20 6e  r equal to the n
4900: 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 73 65 67 6d  umber of.** segm
4910: 65 6e 74 73 20 74 68 61 74 20 74 68 69 73 20 6f  ents that this o
4920: 62 6a 65 63 74 20 69 73 20 6d 65 72 67 69 6e 67  bject is merging
4930: 20 64 61 74 61 20 66 72 6f 6d 2e 20 42 6f 74 68   data from. Both
4940: 20 74 68 65 20 61 53 65 67 5b 5d 20 61 6e 64 0a   the aSeg[] and.
4950: 2a 2a 20 61 46 69 72 73 74 5b 5d 20 61 72 72 61  ** aFirst[] arra
4960: 79 73 20 61 72 65 20 73 69 7a 65 64 20 61 74 20  ys are sized at 
4970: 6e 53 65 67 20 65 6e 74 72 69 65 73 2e 20 54 68  nSeg entries. Th
4980: 65 20 61 53 65 67 5b 5d 20 61 72 72 61 79 20 69  e aSeg[] array i
4990: 73 20 70 61 64 64 65 64 0a 2a 2a 20 77 69 74 68  s padded.** with
49a0: 20 7a 65 72 6f 65 64 20 6f 62 6a 65 63 74 73 20   zeroed objects 
49b0: 2d 20 74 68 65 73 65 20 61 72 65 20 68 61 6e 64  - these are hand
49c0: 6c 65 64 20 61 73 20 69 66 20 74 68 65 79 20 77  led as if they w
49d0: 65 72 65 20 69 74 65 72 61 74 6f 72 73 20 6f 70  ere iterators op
49e0: 65 6e 65 64 0a 2a 2a 20 6f 6e 20 65 6d 70 74 79  ened.** on empty
49f0: 20 73 65 67 6d 65 6e 74 73 2e 0a 2a 2a 0a 2a 2a   segments..**.**
4a00: 20 54 68 65 20 72 65 73 75 6c 74 73 20 6f 66 20   The results of 
4a10: 63 6f 6d 70 61 72 69 6e 67 20 73 65 67 6d 65 6e  comparing segmen
4a20: 74 73 20 61 53 65 67 5b 4e 5d 20 61 6e 64 20 61  ts aSeg[N] and a
4a30: 53 65 67 5b 4e 2b 31 5d 2c 20 77 68 65 72 65 20  Seg[N+1], where 
4a40: 4e 20 69 73 20 61 6e 0a 2a 2a 20 65 76 65 6e 20  N is an.** even 
4a50: 6e 75 6d 62 65 72 2c 20 69 73 20 73 74 6f 72 65  number, is store
4a60: 64 20 69 6e 20 61 46 69 72 73 74 5b 28 6e 53 65  d in aFirst[(nSe
4a70: 67 2b 4e 29 2f 32 5d 2e 20 54 68 65 20 22 72 65  g+N)/2]. The "re
4a80: 73 75 6c 74 22 20 6f 66 20 74 68 65 20 0a 2a 2a  sult" of the .**
4a90: 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69 6e 20 74   comparison in t
4aa0: 68 69 73 20 63 6f 6e 74 65 78 74 20 69 73 20 74  his context is t
4ab0: 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20  he index of the 
4ac0: 69 74 65 72 61 74 6f 72 20 74 68 61 74 20 63 75  iterator that cu
4ad0: 72 72 65 6e 74 6c 79 0a 2a 2a 20 70 6f 69 6e 74  rrently.** point
4ae0: 73 20 74 6f 20 74 68 65 20 73 6d 61 6c 6c 65 72  s to the smaller
4af0: 20 74 65 72 6d 2f 72 6f 77 69 64 20 63 6f 6d 62   term/rowid comb
4b00: 69 6e 61 74 69 6f 6e 2e 20 49 74 65 72 61 74 6f  ination. Iterato
4b10: 72 73 20 61 74 20 45 4f 46 20 61 72 65 0a 2a 2a  rs at EOF are.**
4b20: 20 63 6f 6e 73 69 64 65 72 65 64 20 74 6f 20 62   considered to b
4b30: 65 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 61  e greater than a
4b40: 6c 6c 20 6f 74 68 65 72 20 69 74 65 72 61 74 6f  ll other iterato
4b50: 72 73 2e 0a 2a 2a 0a 2a 2a 20 61 46 69 72 73 74  rs..**.** aFirst
4b60: 5b 31 5d 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  [1] contains the
4b70: 20 69 6e 64 65 78 20 69 6e 20 61 53 65 67 5b 5d   index in aSeg[]
4b80: 20 6f 66 20 74 68 65 20 69 74 65 72 61 74 6f 72   of the iterator
4b90: 20 74 68 61 74 20 70 6f 69 6e 74 73 20 74 6f 0a   that points to.
4ba0: 2a 2a 20 74 68 65 20 73 6d 61 6c 6c 65 73 74 20  ** the smallest 
4bb0: 6b 65 79 20 6f 76 65 72 61 6c 6c 2e 20 61 46 69  key overall. aFi
4bc0: 72 73 74 5b 30 5d 20 69 73 20 75 6e 75 73 65 64  rst[0] is unused
4bd0: 2e 20 0a 2a 2a 0a 2a 2a 20 70 6f 73 6c 69 73 74  . .**.** poslist
4be0: 3a 0a 2a 2a 20 20 20 55 73 65 64 20 62 79 20 73  :.**   Used by s
4bf0: 71 6c 69 74 65 33 46 74 73 35 49 74 65 72 50 6f  qlite3Fts5IterPo
4c00: 73 6c 69 73 74 28 29 20 77 68 65 6e 20 74 68 65  slist() when the
4c10: 20 70 6f 73 6c 69 73 74 20 6e 65 65 64 73 20 74   poslist needs t
4c20: 6f 20 62 65 20 62 75 66 66 65 72 65 64 2e 0a 2a  o be buffered..*
4c30: 2a 20 20 20 54 68 65 72 65 20 69 73 20 6e 6f 20  *   There is no 
4c40: 77 61 79 20 74 6f 20 74 65 6c 6c 20 69 66 20 74  way to tell if t
4c50: 68 69 73 20 69 73 20 70 6f 70 75 6c 61 74 65 64  his is populated
4c60: 20 6f 72 20 6e 6f 74 2e 0a 2a 2f 0a 73 74 72 75   or not..*/.stru
4c70: 63 74 20 46 74 73 35 49 74 65 72 20 7b 0a 20 20  ct Fts5Iter {.  
4c80: 46 74 73 35 49 6e 64 65 78 49 74 65 72 20 62 61  Fts5IndexIter ba
4c90: 73 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  se;             
4ca0: 2f 2a 20 42 61 73 65 20 63 6c 61 73 73 20 63 6f  /* Base class co
4cb0: 6e 74 61 69 6e 69 6e 67 20 6f 75 74 70 75 74 20  ntaining output 
4cc0: 76 61 72 73 20 2a 2f 0a 0a 20 20 46 74 73 35 49  vars */..  Fts5I
4cd0: 6e 64 65 78 20 2a 70 49 6e 64 65 78 3b 20 20 20  ndex *pIndex;   
4ce0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
4cf0: 64 65 78 20 74 68 61 74 20 6f 77 6e 73 20 74 68  dex that owns th
4d00: 69 73 20 69 74 65 72 61 74 6f 72 20 2a 2f 0a 20  is iterator */. 
4d10: 20 46 74 73 35 53 74 72 75 63 74 75 72 65 20 2a   Fts5Structure *
4d20: 70 53 74 72 75 63 74 3b 20 20 20 20 20 20 20 20  pStruct;        
4d30: 20 2f 2a 20 44 61 74 61 62 61 73 65 20 73 74 72   /* Database str
4d40: 75 63 74 75 72 65 20 66 6f 72 20 74 68 69 73 20  ucture for this 
4d50: 69 74 65 72 61 74 6f 72 20 2a 2f 0a 20 20 46 74  iterator */.  Ft
4d60: 73 35 42 75 66 66 65 72 20 70 6f 73 6c 69 73 74  s5Buffer poslist
4d70: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
4d80: 20 42 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69   Buffer containi
4d90: 6e 67 20 63 75 72 72 65 6e 74 20 70 6f 73 6c 69  ng current posli
4da0: 73 74 20 2a 2f 0a 20 20 46 74 73 35 43 6f 6c 73  st */.  Fts5Cols
4db0: 65 74 20 2a 70 43 6f 6c 73 65 74 3b 20 20 20 20  et *pColset;    
4dc0: 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72          /* Restr
4dd0: 69 63 74 20 6d 61 74 63 68 65 73 20 74 6f 20 74  ict matches to t
4de0: 68 65 73 65 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a  hese columns */.
4df0: 0a 20 20 2f 2a 20 49 6e 76 6f 6b 65 64 20 74 6f  .  /* Invoked to
4e00: 20 73 65 74 20 6f 75 74 70 75 74 20 76 61 72 69   set output vari
4e10: 61 62 6c 65 73 2e 20 2a 2f 0a 20 20 76 6f 69 64  ables. */.  void
4e20: 20 28 2a 78 53 65 74 4f 75 74 70 75 74 73 29 28   (*xSetOutputs)(
4e30: 46 74 73 35 49 74 65 72 2a 2c 20 46 74 73 35 53  Fts5Iter*, Fts5S
4e40: 65 67 49 74 65 72 2a 29 3b 0a 0a 20 20 69 6e 74  egIter*);..  int
4e50: 20 6e 53 65 67 3b 20 20 20 20 20 20 20 20 20 20   nSeg;          
4e60: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
4e70: 53 69 7a 65 20 6f 66 20 61 53 65 67 5b 5d 20 61  Size of aSeg[] a
4e80: 72 72 61 79 20 2a 2f 0a 20 20 69 6e 74 20 62 52  rray */.  int bR
4e90: 65 76 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ev;             
4ea0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
4eb0: 65 20 74 6f 20 69 74 65 72 61 74 65 20 69 6e 20  e to iterate in 
4ec0: 72 65 76 65 72 73 65 20 6f 72 64 65 72 20 2a 2f  reverse order */
4ed0: 0a 20 20 75 38 20 62 53 6b 69 70 45 6d 70 74 79  .  u8 bSkipEmpty
4ee0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
4ef0: 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 73 6b     /* True to sk
4f00: 69 70 20 64 65 6c 65 74 65 64 20 65 6e 74 72 69  ip deleted entri
4f10: 65 73 20 2a 2f 0a 0a 20 20 69 36 34 20 69 53 77  es */..  i64 iSw
4f20: 69 74 63 68 52 6f 77 69 64 3b 20 20 20 20 20 20  itchRowid;      
4f30: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73           /* Firs
4f40: 74 65 73 74 20 72 6f 77 69 64 20 6f 66 20 6f 74  test rowid of ot
4f50: 68 65 72 20 74 68 61 6e 20 61 46 69 72 73 74 5b  her than aFirst[
4f60: 31 5d 20 2a 2f 0a 20 20 46 74 73 35 43 52 65 73  1] */.  Fts5CRes
4f70: 75 6c 74 20 2a 61 46 69 72 73 74 3b 20 20 20 20  ult *aFirst;    
4f80: 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65          /* Curre
4f90: 6e 74 20 6d 65 72 67 65 20 73 74 61 74 65 20 28  nt merge state (
4fa0: 73 65 65 20 61 62 6f 76 65 29 20 2a 2f 0a 20 20  see above) */.  
4fb0: 46 74 73 35 53 65 67 49 74 65 72 20 61 53 65 67  Fts5SegIter aSeg
4fc0: 5b 31 5d 3b 20 20 20 20 20 20 20 20 20 20 20 20  [1];            
4fd0: 2f 2a 20 41 72 72 61 79 20 6f 66 20 73 65 67 6d  /* Array of segm
4fe0: 65 6e 74 20 69 74 65 72 61 74 6f 72 73 20 2a 2f  ent iterators */
4ff0: 0a 7d 3b 0a 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69  .};.../*.** An i
5000: 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66  nstance of the f
5010: 6f 6c 6c 6f 77 69 6e 67 20 74 79 70 65 20 69 73  ollowing type is
5020: 20 75 73 65 64 20 74 6f 20 69 74 65 72 61 74 65   used to iterate
5030: 20 74 68 72 6f 75 67 68 20 74 68 65 20 63 6f 6e   through the con
5040: 74 65 6e 74 73 0a 2a 2a 20 6f 66 20 61 20 64 6f  tents.** of a do
5050: 63 6c 69 73 74 2d 69 6e 64 65 78 20 72 65 63 6f  clist-index reco
5060: 72 64 2e 0a 2a 2a 0a 2a 2a 20 70 44 61 74 61 3a  rd..**.** pData:
5070: 0a 2a 2a 20 20 20 52 65 63 6f 72 64 20 63 6f 6e  .**   Record con
5080: 74 61 69 6e 69 6e 67 20 74 68 65 20 64 6f 63 6c  taining the docl
5090: 69 73 74 2d 69 6e 64 65 78 20 64 61 74 61 2e 0a  ist-index data..
50a0: 2a 2a 0a 2a 2a 20 62 45 6f 66 3a 0a 2a 2a 20 20  **.** bEof:.**  
50b0: 20 53 65 74 20 74 6f 20 74 72 75 65 20 6f 6e 63   Set to true onc
50c0: 65 20 69 74 65 72 61 74 6f 72 20 68 61 73 20 72  e iterator has r
50d0: 65 61 63 68 65 64 20 45 4f 46 2e 0a 2a 2a 0a 2a  eached EOF..**.*
50e0: 2a 20 69 4f 66 66 3a 0a 2a 2a 20 20 20 53 65 74  * iOff:.**   Set
50f0: 20 74 6f 20 74 68 65 20 63 75 72 72 65 6e 74 20   to the current 
5100: 6f 66 66 73 65 74 20 77 69 74 68 69 6e 20 72 65  offset within re
5110: 63 6f 72 64 20 70 44 61 74 61 2e 0a 2a 2f 0a 73  cord pData..*/.s
5120: 74 72 75 63 74 20 46 74 73 35 44 6c 69 64 78 4c  truct Fts5DlidxL
5130: 76 6c 20 7b 0a 20 20 46 74 73 35 44 61 74 61 20  vl {.  Fts5Data 
5140: 2a 70 44 61 74 61 3b 20 20 20 20 20 20 20 20 20  *pData;         
5150: 20 20 20 20 20 2f 2a 20 44 61 74 61 20 66 6f 72       /* Data for
5160: 20 63 75 72 72 65 6e 74 20 70 61 67 65 20 6f 66   current page of
5170: 20 74 68 69 73 20 6c 65 76 65 6c 20 2a 2f 0a 20   this level */. 
5180: 20 69 6e 74 20 69 4f 66 66 3b 20 20 20 20 20 20   int iOff;      
5190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
51a0: 2a 20 43 75 72 72 65 6e 74 20 6f 66 66 73 65 74  * Current offset
51b0: 20 69 6e 74 6f 20 70 44 61 74 61 20 2a 2f 0a 20   into pData */. 
51c0: 20 69 6e 74 20 62 45 6f 66 3b 20 20 20 20 20 20   int bEof;      
51d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
51e0: 2a 20 41 74 20 45 4f 46 20 61 6c 72 65 61 64 79  * At EOF already
51f0: 20 2a 2f 0a 20 20 69 6e 74 20 69 46 69 72 73 74   */.  int iFirst
5200: 4f 66 66 3b 20 20 20 20 20 20 20 20 20 20 20 20  Off;            
5210: 20 20 20 20 2f 2a 20 55 73 65 64 20 62 79 20 72      /* Used by r
5220: 65 76 65 72 73 65 20 69 74 65 72 61 74 6f 72 73  everse iterators
5230: 20 2a 2f 0a 0a 20 20 2f 2a 20 4f 75 74 70 75 74   */..  /* Output
5240: 20 76 61 72 69 61 62 6c 65 73 20 2a 2f 0a 20 20   variables */.  
5250: 69 6e 74 20 69 4c 65 61 66 50 67 6e 6f 3b 20 20  int iLeafPgno;  
5260: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
5270: 20 50 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20   Page number of 
5280: 63 75 72 72 65 6e 74 20 6c 65 61 66 20 70 61 67  current leaf pag
5290: 65 20 2a 2f 0a 20 20 69 36 34 20 69 52 6f 77 69  e */.  i64 iRowi
52a0: 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d;              
52b0: 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 72 6f       /* First ro
52c0: 77 69 64 20 6f 6e 20 6c 65 61 66 20 69 4c 65 61  wid on leaf iLea
52d0: 66 50 67 6e 6f 20 2a 2f 0a 7d 3b 0a 73 74 72 75  fPgno */.};.stru
52e0: 63 74 20 46 74 73 35 44 6c 69 64 78 49 74 65 72  ct Fts5DlidxIter
52f0: 20 7b 0a 20 20 69 6e 74 20 6e 4c 76 6c 3b 0a 20   {.  int nLvl;. 
5300: 20 69 6e 74 20 69 53 65 67 69 64 3b 0a 20 20 46   int iSegid;.  F
5310: 74 73 35 44 6c 69 64 78 4c 76 6c 20 61 4c 76 6c  ts5DlidxLvl aLvl
5320: 5b 31 5d 3b 0a 7d 3b 0a 0a 73 74 61 74 69 63 20  [1];.};..static 
5330: 76 6f 69 64 20 66 74 73 35 50 75 74 55 31 36 28  void fts5PutU16(
5340: 75 38 20 2a 61 4f 75 74 2c 20 75 31 36 20 69 56  u8 *aOut, u16 iV
5350: 61 6c 29 7b 0a 20 20 61 4f 75 74 5b 30 5d 20 3d  al){.  aOut[0] =
5360: 20 28 69 56 61 6c 3e 3e 38 29 3b 0a 20 20 61 4f   (iVal>>8);.  aO
5370: 75 74 5b 31 5d 20 3d 20 28 69 56 61 6c 26 30 78  ut[1] = (iVal&0x
5380: 46 46 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 75  FF);.}..static u
5390: 31 36 20 66 74 73 35 47 65 74 55 31 36 28 63 6f  16 fts5GetU16(co
53a0: 6e 73 74 20 75 38 20 2a 61 49 6e 29 7b 0a 20 20  nst u8 *aIn){.  
53b0: 72 65 74 75 72 6e 20 28 28 75 31 36 29 61 49 6e  return ((u16)aIn
53c0: 5b 30 5d 20 3c 3c 20 38 29 20 2b 20 61 49 6e 5b  [0] << 8) + aIn[
53d0: 31 5d 3b 0a 7d 20 0a 0a 2f 2a 0a 2a 2a 20 41 6c  1];.} ../*.** Al
53e0: 6c 6f 63 61 74 65 20 61 6e 64 20 72 65 74 75 72  locate and retur
53f0: 6e 20 61 20 62 75 66 66 65 72 20 61 74 20 6c 65  n a buffer at le
5400: 61 73 74 20 6e 42 79 74 65 20 62 79 74 65 73 20  ast nByte bytes 
5410: 69 6e 20 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 49  in size..**.** I
5420: 66 20 61 6e 20 4f 4f 4d 20 65 72 72 6f 72 20 69  f an OOM error i
5430: 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c 20 72  s encountered, r
5440: 65 74 75 72 6e 20 4e 55 4c 4c 20 61 6e 64 20 73  eturn NULL and s
5450: 65 74 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64  et the error cod
5460: 65 20 69 6e 0a 2a 2a 20 74 68 65 20 46 74 73 35  e in.** the Fts5
5470: 49 6e 64 65 78 20 68 61 6e 64 6c 65 20 70 61 73  Index handle pas
5480: 73 65 64 20 61 73 20 74 68 65 20 66 69 72 73 74  sed as the first
5490: 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74   argument..*/.st
54a0: 61 74 69 63 20 76 6f 69 64 20 2a 66 74 73 35 49  atic void *fts5I
54b0: 64 78 4d 61 6c 6c 6f 63 28 46 74 73 35 49 6e 64  dxMalloc(Fts5Ind
54c0: 65 78 20 2a 70 2c 20 69 6e 74 20 6e 42 79 74 65  ex *p, int nByte
54d0: 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69  ){.  return sqli
54e0: 74 65 33 46 74 73 35 4d 61 6c 6c 6f 63 5a 65 72  te3Fts5MallocZer
54f0: 6f 28 26 70 2d 3e 72 63 2c 20 6e 42 79 74 65 29  o(&p->rc, nByte)
5500: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 61  ;.}../*.** Compa
5510: 72 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  re the contents 
5520: 6f 66 20 74 68 65 20 70 4c 65 66 74 20 62 75 66  of the pLeft buf
5530: 66 65 72 20 77 69 74 68 20 74 68 65 20 70 52 69  fer with the pRi
5540: 67 68 74 2f 6e 52 69 67 68 74 20 62 6c 6f 62 2e  ght/nRight blob.
5550: 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 2d 76  .**.** Return -v
5560: 65 20 69 66 20 70 4c 65 66 74 20 69 73 20 73 6d  e if pLeft is sm
5570: 61 6c 6c 65 72 20 74 68 61 6e 20 70 52 69 67 68  aller than pRigh
5580: 74 2c 20 30 20 69 66 20 74 68 65 79 20 61 72 65  t, 0 if they are
5590: 20 65 71 75 61 6c 20 6f 72 0a 2a 2a 20 2b 76 65   equal or.** +ve
55a0: 20 69 66 20 70 52 69 67 68 74 20 69 73 20 73 6d   if pRight is sm
55b0: 61 6c 6c 65 72 20 74 68 61 6e 20 70 4c 65 66 74  aller than pLeft
55c0: 2e 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73  . In other words
55d0: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 72 65 73 20  :.**.**     res 
55e0: 3d 20 2a 70 4c 65 66 74 20 2d 20 2a 70 52 69 67  = *pLeft - *pRig
55f0: 68 74 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  ht.*/.#ifdef SQL
5600: 49 54 45 5f 44 45 42 55 47 0a 73 74 61 74 69 63  ITE_DEBUG.static
5610: 20 69 6e 74 20 66 74 73 35 42 75 66 66 65 72 43   int fts5BufferC
5620: 6f 6d 70 61 72 65 42 6c 6f 62 28 0a 20 20 46 74  ompareBlob(.  Ft
5630: 73 35 42 75 66 66 65 72 20 2a 70 4c 65 66 74 2c  s5Buffer *pLeft,
5640: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
5650: 20 4c 65 66 74 20 68 61 6e 64 20 73 69 64 65 20   Left hand side 
5660: 6f 66 20 63 6f 6d 70 61 72 69 73 6f 6e 20 2a 2f  of comparison */
5670: 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 70 52 69  .  const u8 *pRi
5680: 67 68 74 2c 20 69 6e 74 20 6e 52 69 67 68 74 20  ght, int nRight 
5690: 20 20 20 2f 2a 20 52 69 67 68 74 20 68 61 6e 64     /* Right hand
56a0: 20 73 69 64 65 20 6f 66 20 63 6f 6d 70 61 72 69   side of compari
56b0: 73 6f 6e 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  son */.){.  int 
56c0: 6e 43 6d 70 20 3d 20 4d 49 4e 28 70 4c 65 66 74  nCmp = MIN(pLeft
56d0: 2d 3e 6e 2c 20 6e 52 69 67 68 74 29 3b 0a 20 20  ->n, nRight);.  
56e0: 69 6e 74 20 72 65 73 20 3d 20 6d 65 6d 63 6d 70  int res = memcmp
56f0: 28 70 4c 65 66 74 2d 3e 70 2c 20 70 52 69 67 68  (pLeft->p, pRigh
5700: 74 2c 20 6e 43 6d 70 29 3b 0a 20 20 72 65 74 75  t, nCmp);.  retu
5710: 72 6e 20 28 72 65 73 3d 3d 30 20 3f 20 28 70 4c  rn (res==0 ? (pL
5720: 65 66 74 2d 3e 6e 20 2d 20 6e 52 69 67 68 74 29  eft->n - nRight)
5730: 20 3a 20 72 65 73 29 3b 0a 7d 0a 23 65 6e 64 69   : res);.}.#endi
5740: 66 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65  f../*.** Compare
5750: 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
5760: 20 74 68 65 20 74 77 6f 20 62 75 66 66 65 72 73   the two buffers
5770: 20 75 73 69 6e 67 20 6d 65 6d 63 6d 70 28 29 2e   using memcmp().
5780: 20 49 66 20 6f 6e 65 20 62 75 66 66 65 72 0a 2a   If one buffer.*
5790: 2a 20 69 73 20 61 20 70 72 65 66 69 78 20 6f 66  * is a prefix of
57a0: 20 74 68 65 20 6f 74 68 65 72 2c 20 69 74 20 69   the other, it i
57b0: 73 20 63 6f 6e 73 69 64 65 72 65 64 20 74 68 65  s considered the
57c0: 20 6c 65 73 73 65 72 2e 0a 2a 2a 0a 2a 2a 20 52   lesser..**.** R
57d0: 65 74 75 72 6e 20 2d 76 65 20 69 66 20 70 4c 65  eturn -ve if pLe
57e0: 66 74 20 69 73 20 73 6d 61 6c 6c 65 72 20 74 68  ft is smaller th
57f0: 61 6e 20 70 52 69 67 68 74 2c 20 30 20 69 66 20  an pRight, 0 if 
5800: 74 68 65 79 20 61 72 65 20 65 71 75 61 6c 20 6f  they are equal o
5810: 72 0a 2a 2a 20 2b 76 65 20 69 66 20 70 52 69 67  r.** +ve if pRig
5820: 68 74 20 69 73 20 73 6d 61 6c 6c 65 72 20 74 68  ht is smaller th
5830: 61 6e 20 70 4c 65 66 74 2e 20 49 6e 20 6f 74 68  an pLeft. In oth
5840: 65 72 20 77 6f 72 64 73 3a 0a 2a 2a 0a 2a 2a 20  er words:.**.** 
5850: 20 20 20 20 72 65 73 20 3d 20 2a 70 4c 65 66 74      res = *pLeft
5860: 20 2d 20 2a 70 52 69 67 68 74 0a 2a 2f 0a 73 74   - *pRight.*/.st
5870: 61 74 69 63 20 69 6e 74 20 66 74 73 35 42 75 66  atic int fts5Buf
5880: 66 65 72 43 6f 6d 70 61 72 65 28 46 74 73 35 42  ferCompare(Fts5B
5890: 75 66 66 65 72 20 2a 70 4c 65 66 74 2c 20 46 74  uffer *pLeft, Ft
58a0: 73 35 42 75 66 66 65 72 20 2a 70 52 69 67 68 74  s5Buffer *pRight
58b0: 29 7b 0a 20 20 69 6e 74 20 6e 43 6d 70 20 3d 20  ){.  int nCmp = 
58c0: 4d 49 4e 28 70 4c 65 66 74 2d 3e 6e 2c 20 70 52  MIN(pLeft->n, pR
58d0: 69 67 68 74 2d 3e 6e 29 3b 0a 20 20 69 6e 74 20  ight->n);.  int 
58e0: 72 65 73 20 3d 20 6d 65 6d 63 6d 70 28 70 4c 65  res = memcmp(pLe
58f0: 66 74 2d 3e 70 2c 20 70 52 69 67 68 74 2d 3e 70  ft->p, pRight->p
5900: 2c 20 6e 43 6d 70 29 3b 0a 20 20 72 65 74 75 72  , nCmp);.  retur
5910: 6e 20 28 72 65 73 3d 3d 30 20 3f 20 28 70 4c 65  n (res==0 ? (pLe
5920: 66 74 2d 3e 6e 20 2d 20 70 52 69 67 68 74 2d 3e  ft->n - pRight->
5930: 6e 29 20 3a 20 72 65 73 29 3b 0a 7d 0a 0a 73 74  n) : res);.}..st
5940: 61 74 69 63 20 69 6e 74 20 66 74 73 35 4c 65 61  atic int fts5Lea
5950: 66 46 69 72 73 74 54 65 72 6d 4f 66 66 28 46 74  fFirstTermOff(Ft
5960: 73 35 44 61 74 61 20 2a 70 4c 65 61 66 29 7b 0a  s5Data *pLeaf){.
5970: 20 20 69 6e 74 20 72 65 74 3b 0a 20 20 66 74 73    int ret;.  fts
5980: 35 47 65 74 56 61 72 69 6e 74 33 32 28 26 70 4c  5GetVarint32(&pL
5990: 65 61 66 2d 3e 70 5b 70 4c 65 61 66 2d 3e 73 7a  eaf->p[pLeaf->sz
59a0: 4c 65 61 66 5d 2c 20 72 65 74 29 3b 0a 20 20 72  Leaf], ret);.  r
59b0: 65 74 75 72 6e 20 72 65 74 3b 0a 7d 0a 0a 2f 2a  eturn ret;.}../*
59c0: 0a 2a 2a 20 43 6c 6f 73 65 20 74 68 65 20 72 65  .** Close the re
59d0: 61 64 2d 6f 6e 6c 79 20 62 6c 6f 62 20 68 61 6e  ad-only blob han
59e0: 64 6c 65 2c 20 69 66 20 69 74 20 69 73 20 6f 70  dle, if it is op
59f0: 65 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  en..*/.static vo
5a00: 69 64 20 66 74 73 35 43 6c 6f 73 65 52 65 61 64  id fts5CloseRead
5a10: 65 72 28 46 74 73 35 49 6e 64 65 78 20 2a 70 29  er(Fts5Index *p)
5a20: 7b 0a 20 20 69 66 28 20 70 2d 3e 70 52 65 61 64  {.  if( p->pRead
5a30: 65 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  er ){.    sqlite
5a40: 33 5f 62 6c 6f 62 20 2a 70 52 65 61 64 65 72 20  3_blob *pReader 
5a50: 3d 20 70 2d 3e 70 52 65 61 64 65 72 3b 0a 20 20  = p->pReader;.  
5a60: 20 20 70 2d 3e 70 52 65 61 64 65 72 20 3d 20 30    p->pReader = 0
5a70: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62 6c  ;.    sqlite3_bl
5a80: 6f 62 5f 63 6c 6f 73 65 28 70 52 65 61 64 65 72  ob_close(pReader
5a90: 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  );.  }.}.../*.**
5aa0: 20 52 65 74 72 69 65 76 65 20 61 20 72 65 63 6f   Retrieve a reco
5ab0: 72 64 20 66 72 6f 6d 20 74 68 65 20 25 5f 64 61  rd from the %_da
5ac0: 74 61 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20  ta table..**.** 
5ad0: 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
5ae0: 72 73 2c 20 4e 55 4c 4c 20 69 73 20 72 65 74 75  rs, NULL is retu
5af0: 72 6e 65 64 20 61 6e 64 20 61 6e 20 65 72 72 6f  rned and an erro
5b00: 72 20 6c 65 66 74 20 69 6e 20 74 68 65 20 0a 2a  r left in the .*
5b10: 2a 20 46 74 73 35 49 6e 64 65 78 20 6f 62 6a 65  * Fts5Index obje
5b20: 63 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 46 74  ct..*/.static Ft
5b30: 73 35 44 61 74 61 20 2a 66 74 73 35 44 61 74 61  s5Data *fts5Data
5b40: 52 65 61 64 28 46 74 73 35 49 6e 64 65 78 20 2a  Read(Fts5Index *
5b50: 70 2c 20 69 36 34 20 69 52 6f 77 69 64 29 7b 0a  p, i64 iRowid){.
5b60: 20 20 46 74 73 35 44 61 74 61 20 2a 70 52 65 74    Fts5Data *pRet
5b70: 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 2d 3e 72   = 0;.  if( p->r
5b80: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
5b90: 20 20 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c      int rc = SQL
5ba0: 49 54 45 5f 4f 4b 3b 0a 0a 20 20 20 20 69 66 28  ITE_OK;..    if(
5bb0: 20 70 2d 3e 70 52 65 61 64 65 72 20 29 7b 0a 20   p->pReader ){. 
5bc0: 20 20 20 20 20 2f 2a 20 54 68 69 73 20 63 61 6c       /* This cal
5bd0: 6c 20 6d 61 79 20 72 65 74 75 72 6e 20 53 51 4c  l may return SQL
5be0: 49 54 45 5f 41 42 4f 52 54 20 69 66 20 74 68 65  ITE_ABORT if the
5bf0: 72 65 20 68 61 73 20 62 65 65 6e 20 61 20 73 61  re has been a sa
5c00: 76 65 70 6f 69 6e 74 0a 20 20 20 20 20 20 2a 2a  vepoint.      **
5c10: 20 72 6f 6c 6c 62 61 63 6b 20 73 69 6e 63 65 20   rollback since 
5c20: 69 74 20 77 61 73 20 6c 61 73 74 20 75 73 65 64  it was last used
5c30: 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 61  . In this case a
5c40: 20 6e 65 77 20 62 6c 6f 62 20 68 61 6e 64 6c 65   new blob handle
5c50: 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 72 65 71  .      ** is req
5c60: 75 69 72 65 64 2e 20 20 2a 2f 0a 20 20 20 20 20  uired.  */.     
5c70: 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62 20 2a 70   sqlite3_blob *p
5c80: 42 6c 6f 62 20 3d 20 70 2d 3e 70 52 65 61 64 65  Blob = p->pReade
5c90: 72 3b 0a 20 20 20 20 20 20 70 2d 3e 70 52 65 61  r;.      p->pRea
5ca0: 64 65 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 72  der = 0;.      r
5cb0: 63 20 3d 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62  c = sqlite3_blob
5cc0: 5f 72 65 6f 70 65 6e 28 70 42 6c 6f 62 2c 20 69  _reopen(pBlob, i
5cd0: 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 61 73  Rowid);.      as
5ce0: 73 65 72 74 28 20 70 2d 3e 70 52 65 61 64 65 72  sert( p->pReader
5cf0: 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 2d 3e  ==0 );.      p->
5d00: 70 52 65 61 64 65 72 20 3d 20 70 42 6c 6f 62 3b  pReader = pBlob;
5d10: 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
5d20: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
5d30: 20 20 20 20 66 74 73 35 43 6c 6f 73 65 52 65 61      fts5CloseRea
5d40: 64 65 72 28 70 29 3b 0a 20 20 20 20 20 20 7d 0a  der(p);.      }.
5d50: 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
5d60: 4c 49 54 45 5f 41 42 4f 52 54 20 29 20 72 63 20  LITE_ABORT ) rc 
5d70: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
5d80: 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68   }..    /* If th
5d90: 65 20 62 6c 6f 62 20 68 61 6e 64 6c 65 20 69 73  e blob handle is
5da0: 20 6e 6f 74 20 6f 70 65 6e 20 61 74 20 74 68 69   not open at thi
5db0: 73 20 70 6f 69 6e 74 2c 20 6f 70 65 6e 20 69 74  s point, open it
5dc0: 20 61 6e 64 20 73 65 65 6b 20 0a 20 20 20 20 2a   and seek .    *
5dd0: 2a 20 74 6f 20 74 68 65 20 72 65 71 75 65 73 74  * to the request
5de0: 65 64 20 65 6e 74 72 79 2e 20 20 2a 2f 0a 20 20  ed entry.  */.  
5df0: 20 20 69 66 28 20 70 2d 3e 70 52 65 61 64 65 72    if( p->pReader
5e00: 3d 3d 30 20 26 26 20 72 63 3d 3d 53 51 4c 49 54  ==0 && rc==SQLIT
5e10: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 46 74  E_OK ){.      Ft
5e20: 73 35 43 6f 6e 66 69 67 20 2a 70 43 6f 6e 66 69  s5Config *pConfi
5e30: 67 20 3d 20 70 2d 3e 70 43 6f 6e 66 69 67 3b 0a  g = p->pConfig;.
5e40: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
5e50: 65 33 5f 62 6c 6f 62 5f 6f 70 65 6e 28 70 43 6f  e3_blob_open(pCo
5e60: 6e 66 69 67 2d 3e 64 62 2c 20 0a 20 20 20 20 20  nfig->db, .     
5e70: 20 20 20 20 20 70 43 6f 6e 66 69 67 2d 3e 7a 44       pConfig->zD
5e80: 62 2c 20 70 2d 3e 7a 44 61 74 61 54 62 6c 2c 20  b, p->zDataTbl, 
5e90: 22 62 6c 6f 63 6b 22 2c 20 69 52 6f 77 69 64 2c  "block", iRowid,
5ea0: 20 30 2c 20 26 70 2d 3e 70 52 65 61 64 65 72 0a   0, &p->pReader.
5eb0: 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 0a        );.    }..
5ec0: 20 20 20 20 2f 2a 20 49 66 20 65 69 74 68 65 72      /* If either
5ed0: 20 6f 66 20 74 68 65 20 73 71 6c 69 74 65 33 5f   of the sqlite3_
5ee0: 62 6c 6f 62 5f 6f 70 65 6e 28 29 20 6f 72 20 73  blob_open() or s
5ef0: 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 72 65 6f 70  qlite3_blob_reop
5f00: 65 6e 28 29 20 63 61 6c 6c 73 0a 20 20 20 20 2a  en() calls.    *
5f10: 2a 20 61 62 6f 76 65 20 72 65 74 75 72 6e 65 64  * above returned
5f20: 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 2c 20 72   SQLITE_ERROR, r
5f30: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
5f40: 52 55 50 54 5f 56 54 41 42 20 69 6e 73 74 65 61  RUPT_VTAB instea
5f50: 64 2e 0a 20 20 20 20 2a 2a 20 41 6c 6c 20 74 68  d..    ** All th
5f60: 65 20 72 65 61 73 6f 6e 73 20 74 68 6f 73 65 20  e reasons those 
5f70: 66 75 6e 63 74 69 6f 6e 73 20 6d 69 67 68 74 20  functions might 
5f80: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
5f90: 52 4f 52 20 2d 20 6d 69 73 73 69 6e 67 0a 20 20  ROR - missing.  
5fa0: 20 20 2a 2a 20 74 61 62 6c 65 2c 20 6d 69 73 73    ** table, miss
5fb0: 69 6e 67 20 72 6f 77 2c 20 6e 6f 6e 2d 62 6c 6f  ing row, non-blo
5fc0: 62 2f 74 65 78 74 20 69 6e 20 62 6c 6f 63 6b 20  b/text in block 
5fd0: 63 6f 6c 75 6d 6e 20 2d 20 69 6e 64 69 63 61 74  column - indicat
5fe0: 65 20 0a 20 20 20 20 2a 2a 20 62 61 63 6b 69 6e  e .    ** backin
5ff0: 67 20 73 74 6f 72 65 20 63 6f 72 72 75 70 74 69  g store corrupti
6000: 6f 6e 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  on.  */.    if( 
6010: 72 63 3d 3d 53 51 4c 49 54 45 5f 45 52 52 4f 52  rc==SQLITE_ERROR
6020: 20 29 20 72 63 20 3d 20 46 54 53 35 5f 43 4f 52   ) rc = FTS5_COR
6030: 52 55 50 54 3b 0a 0a 20 20 20 20 69 66 28 20 72  RUPT;..    if( r
6040: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
6050: 20 20 20 20 20 20 75 38 20 2a 61 4f 75 74 20 3d        u8 *aOut =
6060: 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
6070: 20 20 2f 2a 20 52 65 61 64 20 62 6c 6f 62 20 64    /* Read blob d
6080: 61 74 61 20 69 6e 74 6f 20 74 68 69 73 20 62 75  ata into this bu
6090: 66 66 65 72 20 2a 2f 0a 20 20 20 20 20 20 69 6e  ffer */.      in
60a0: 74 20 6e 42 79 74 65 20 3d 20 73 71 6c 69 74 65  t nByte = sqlite
60b0: 33 5f 62 6c 6f 62 5f 62 79 74 65 73 28 70 2d 3e  3_blob_bytes(p->
60c0: 70 52 65 61 64 65 72 29 3b 0a 20 20 20 20 20 20  pReader);.      
60d0: 69 6e 74 20 6e 41 6c 6c 6f 63 20 3d 20 73 69 7a  int nAlloc = siz
60e0: 65 6f 66 28 46 74 73 35 44 61 74 61 29 20 2b 20  eof(Fts5Data) + 
60f0: 6e 42 79 74 65 20 2b 20 46 54 53 35 5f 44 41 54  nByte + FTS5_DAT
6100: 41 5f 50 41 44 44 49 4e 47 3b 0a 20 20 20 20 20  A_PADDING;.     
6110: 20 70 52 65 74 20 3d 20 28 46 74 73 35 44 61 74   pRet = (Fts5Dat
6120: 61 2a 29 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f  a*)sqlite3_mallo
6130: 63 28 6e 41 6c 6c 6f 63 29 3b 0a 20 20 20 20 20  c(nAlloc);.     
6140: 20 69 66 28 20 70 52 65 74 20 29 7b 0a 20 20 20   if( pRet ){.   
6150: 20 20 20 20 20 70 52 65 74 2d 3e 6e 6e 20 3d 20       pRet->nn = 
6160: 6e 42 79 74 65 3b 0a 20 20 20 20 20 20 20 20 61  nByte;.        a
6170: 4f 75 74 20 3d 20 70 52 65 74 2d 3e 70 20 3d 20  Out = pRet->p = 
6180: 28 75 38 2a 29 26 70 52 65 74 5b 31 5d 3b 0a 20  (u8*)&pRet[1];. 
6190: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
61a0: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
61b0: 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 0a 0a  NOMEM;.      }..
61c0: 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
61d0: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
61e0: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f     rc = sqlite3_
61f0: 62 6c 6f 62 5f 72 65 61 64 28 70 2d 3e 70 52 65  blob_read(p->pRe
6200: 61 64 65 72 2c 20 61 4f 75 74 2c 20 6e 42 79 74  ader, aOut, nByt
6210: 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20  e, 0);.      }. 
6220: 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
6230: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
6240: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
6250: 52 65 74 29 3b 0a 20 20 20 20 20 20 20 20 70 52  Ret);.        pR
6260: 65 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65  et = 0;.      }e
6270: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  lse{.        /* 
6280: 54 4f 44 4f 31 3a 20 46 69 78 20 74 68 69 73 20  TODO1: Fix this 
6290: 2a 2f 0a 20 20 20 20 20 20 20 20 70 52 65 74 2d  */.        pRet-
62a0: 3e 73 7a 4c 65 61 66 20 3d 20 66 74 73 35 47 65  >szLeaf = fts5Ge
62b0: 74 55 31 36 28 26 70 52 65 74 2d 3e 70 5b 32 5d  tU16(&pRet->p[2]
62c0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
62d0: 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 72 63 3b  .    p->rc = rc;
62e0: 0a 20 20 20 20 70 2d 3e 6e 52 65 61 64 2b 2b 3b  .    p->nRead++;
62f0: 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20  .  }..  assert( 
6300: 28 70 52 65 74 3d 3d 30 29 3d 3d 28 70 2d 3e 72  (pRet==0)==(p->r
6310: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 29 20 29 3b  c!=SQLITE_OK) );
6320: 0a 20 20 72 65 74 75 72 6e 20 70 52 65 74 3b 0a  .  return pRet;.
6330: 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73  }.../*.** Releas
6340: 65 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f  e a reference to
6350: 20 64 61 74 61 20 72 65 63 6f 72 64 20 72 65 74   data record ret
6360: 75 72 6e 65 64 20 62 79 20 61 6e 20 65 61 72 6c  urned by an earl
6370: 69 65 72 20 63 61 6c 6c 20 74 6f 0a 2a 2a 20 66  ier call to.** f
6380: 74 73 35 44 61 74 61 52 65 61 64 28 29 2e 0a 2a  ts5DataRead()..*
6390: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  /.static void ft
63a0: 73 35 44 61 74 61 52 65 6c 65 61 73 65 28 46 74  s5DataRelease(Ft
63b0: 73 35 44 61 74 61 20 2a 70 44 61 74 61 29 7b 0a  s5Data *pData){.
63c0: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
63d0: 44 61 74 61 29 3b 0a 7d 0a 0a 73 74 61 74 69 63  Data);.}..static
63e0: 20 69 6e 74 20 66 74 73 35 49 6e 64 65 78 50 72   int fts5IndexPr
63f0: 65 70 61 72 65 53 74 6d 74 28 0a 20 20 46 74 73  epareStmt(.  Fts
6400: 35 49 6e 64 65 78 20 2a 70 2c 0a 20 20 73 71 6c  5Index *p,.  sql
6410: 69 74 65 33 5f 73 74 6d 74 20 2a 2a 70 70 53 74  ite3_stmt **ppSt
6420: 6d 74 2c 0a 20 20 63 68 61 72 20 2a 7a 53 71 6c  mt,.  char *zSql
6430: 0a 29 7b 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d  .){.  if( p->rc=
6440: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
6450: 20 20 69 66 28 20 7a 53 71 6c 20 29 7b 0a 20 20    if( zSql ){.  
6460: 20 20 20 20 70 2d 3e 72 63 20 3d 20 73 71 6c 69      p->rc = sqli
6470: 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28 70  te3_prepare_v2(p
6480: 2d 3e 70 43 6f 6e 66 69 67 2d 3e 64 62 2c 20 7a  ->pConfig->db, z
6490: 53 71 6c 2c 20 2d 31 2c 20 70 70 53 74 6d 74 2c  Sql, -1, ppStmt,
64a0: 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a   0);.    }else{.
64b0: 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51        p->rc = SQ
64c0: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
64d0: 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f  }.  }.  sqlite3_
64e0: 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20 72 65  free(zSql);.  re
64f0: 74 75 72 6e 20 70 2d 3e 72 63 3b 0a 7d 0a 0a 0a  turn p->rc;.}...
6500: 2f 2a 0a 2a 2a 20 49 4e 53 45 52 54 20 4f 52 20  /*.** INSERT OR 
6510: 52 45 50 4c 41 43 45 20 61 20 72 65 63 6f 72 64  REPLACE a record
6520: 20 69 6e 74 6f 20 74 68 65 20 25 5f 64 61 74 61   into the %_data
6530: 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69   table..*/.stati
6540: 63 20 76 6f 69 64 20 66 74 73 35 44 61 74 61 57  c void fts5DataW
6550: 72 69 74 65 28 46 74 73 35 49 6e 64 65 78 20 2a  rite(Fts5Index *
6560: 70 2c 20 69 36 34 20 69 52 6f 77 69 64 2c 20 63  p, i64 iRowid, c
6570: 6f 6e 73 74 20 75 38 20 2a 70 44 61 74 61 2c 20  onst u8 *pData, 
6580: 69 6e 74 20 6e 44 61 74 61 29 7b 0a 20 20 69 66  int nData){.  if
6590: 28 20 70 2d 3e 72 63 21 3d 53 51 4c 49 54 45 5f  ( p->rc!=SQLITE_
65a0: 4f 4b 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20  OK ) return;..  
65b0: 69 66 28 20 70 2d 3e 70 57 72 69 74 65 72 3d 3d  if( p->pWriter==
65c0: 30 20 29 7b 0a 20 20 20 20 46 74 73 35 43 6f 6e  0 ){.    Fts5Con
65d0: 66 69 67 20 2a 70 43 6f 6e 66 69 67 20 3d 20 70  fig *pConfig = p
65e0: 2d 3e 70 43 6f 6e 66 69 67 3b 0a 20 20 20 20 66  ->pConfig;.    f
65f0: 74 73 35 49 6e 64 65 78 50 72 65 70 61 72 65 53  ts5IndexPrepareS
6600: 74 6d 74 28 70 2c 20 26 70 2d 3e 70 57 72 69 74  tmt(p, &p->pWrit
6610: 65 72 2c 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  er, sqlite3_mpri
6620: 6e 74 66 28 0a 20 20 20 20 20 20 20 20 20 20 22  ntf(.          "
6630: 52 45 50 4c 41 43 45 20 49 4e 54 4f 20 27 25 71  REPLACE INTO '%q
6640: 27 2e 27 25 71 5f 64 61 74 61 27 28 69 64 2c 20  '.'%q_data'(id, 
6650: 62 6c 6f 63 6b 29 20 56 41 4c 55 45 53 28 3f 2c  block) VALUES(?,
6660: 3f 29 22 2c 20 0a 20 20 20 20 20 20 20 20 20 20  ?)", .          
6670: 70 43 6f 6e 66 69 67 2d 3e 7a 44 62 2c 20 70 43  pConfig->zDb, pC
6680: 6f 6e 66 69 67 2d 3e 7a 4e 61 6d 65 0a 20 20 20  onfig->zName.   
6690: 20 29 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e   ));.    if( p->
66a0: 72 63 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 7d  rc ) return;.  }
66b0: 0a 0a 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64  ..  sqlite3_bind
66c0: 5f 69 6e 74 36 34 28 70 2d 3e 70 57 72 69 74 65  _int64(p->pWrite
66d0: 72 2c 20 31 2c 20 69 52 6f 77 69 64 29 3b 0a 20  r, 1, iRowid);. 
66e0: 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 62 6c   sqlite3_bind_bl
66f0: 6f 62 28 70 2d 3e 70 57 72 69 74 65 72 2c 20 32  ob(p->pWriter, 2
6700: 2c 20 70 44 61 74 61 2c 20 6e 44 61 74 61 2c 20  , pData, nData, 
6710: 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a  SQLITE_STATIC);.
6720: 20 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70    sqlite3_step(p
6730: 2d 3e 70 57 72 69 74 65 72 29 3b 0a 20 20 70 2d  ->pWriter);.  p-
6740: 3e 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 72 65  >rc = sqlite3_re
6750: 73 65 74 28 70 2d 3e 70 57 72 69 74 65 72 29 3b  set(p->pWriter);
6760: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 78 65 63 75 74  .}../*.** Execut
6770: 65 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  e the following 
6780: 53 51 4c 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 44  SQL:.**.**     D
6790: 45 4c 45 54 45 20 46 52 4f 4d 20 25 5f 64 61 74  ELETE FROM %_dat
67a0: 61 20 57 48 45 52 45 20 69 64 20 42 45 54 57 45  a WHERE id BETWE
67b0: 45 4e 20 24 69 46 69 72 73 74 20 41 4e 44 20 24  EN $iFirst AND $
67c0: 69 4c 61 73 74 0a 2a 2f 0a 73 74 61 74 69 63 20  iLast.*/.static 
67d0: 76 6f 69 64 20 66 74 73 35 44 61 74 61 44 65 6c  void fts5DataDel
67e0: 65 74 65 28 46 74 73 35 49 6e 64 65 78 20 2a 70  ete(Fts5Index *p
67f0: 2c 20 69 36 34 20 69 46 69 72 73 74 2c 20 69 36  , i64 iFirst, i6
6800: 34 20 69 4c 61 73 74 29 7b 0a 20 20 69 66 28 20  4 iLast){.  if( 
6810: 70 2d 3e 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc!=SQLITE_OK
6820: 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 69 66   ) return;..  if
6830: 28 20 70 2d 3e 70 44 65 6c 65 74 65 72 3d 3d 30  ( p->pDeleter==0
6840: 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a   ){.    int rc;.
6850: 20 20 20 20 46 74 73 35 43 6f 6e 66 69 67 20 2a      Fts5Config *
6860: 70 43 6f 6e 66 69 67 20 3d 20 70 2d 3e 70 43 6f  pConfig = p->pCo
6870: 6e 66 69 67 3b 0a 20 20 20 20 63 68 61 72 20 2a  nfig;.    char *
6880: 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d  zSql = sqlite3_m
6890: 70 72 69 6e 74 66 28 0a 20 20 20 20 20 20 20 20  printf(.        
68a0: 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 27 25 71  "DELETE FROM '%q
68b0: 27 2e 27 25 71 5f 64 61 74 61 27 20 57 48 45 52  '.'%q_data' WHER
68c0: 45 20 69 64 3e 3d 3f 20 41 4e 44 20 69 64 3c 3d  E id>=? AND id<=
68d0: 3f 22 2c 20 0a 20 20 20 20 20 20 20 20 20 20 70  ?", .          p
68e0: 43 6f 6e 66 69 67 2d 3e 7a 44 62 2c 20 70 43 6f  Config->zDb, pCo
68f0: 6e 66 69 67 2d 3e 7a 4e 61 6d 65 0a 20 20 20 20  nfig->zName.    
6900: 29 3b 0a 20 20 20 20 69 66 28 20 7a 53 71 6c 3d  );.    if( zSql=
6910: 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  =0 ){.      rc =
6920: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
6930: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
6940: 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65  rc = sqlite3_pre
6950: 70 61 72 65 5f 76 32 28 70 43 6f 6e 66 69 67 2d  pare_v2(pConfig-
6960: 3e 64 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20 26  >db, zSql, -1, &
6970: 70 2d 3e 70 44 65 6c 65 74 65 72 2c 20 30 29 3b  p->pDeleter, 0);
6980: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
6990: 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20 20 20 7d  ree(zSql);.    }
69a0: 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
69b0: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
69c0: 70 2d 3e 72 63 20 3d 20 72 63 3b 0a 20 20 20 20  p->rc = rc;.    
69d0: 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a    return;.    }.
69e0: 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33 5f 62    }..  sqlite3_b
69f0: 69 6e 64 5f 69 6e 74 36 34 28 70 2d 3e 70 44 65  ind_int64(p->pDe
6a00: 6c 65 74 65 72 2c 20 31 2c 20 69 46 69 72 73 74  leter, 1, iFirst
6a10: 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 62 69 6e  );.  sqlite3_bin
6a20: 64 5f 69 6e 74 36 34 28 70 2d 3e 70 44 65 6c 65  d_int64(p->pDele
6a30: 74 65 72 2c 20 32 2c 20 69 4c 61 73 74 29 3b 0a  ter, 2, iLast);.
6a40: 20 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70    sqlite3_step(p
6a50: 2d 3e 70 44 65 6c 65 74 65 72 29 3b 0a 20 20 70  ->pDeleter);.  p
6a60: 2d 3e 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 72  ->rc = sqlite3_r
6a70: 65 73 65 74 28 70 2d 3e 70 44 65 6c 65 74 65 72  eset(p->pDeleter
6a80: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f  );.}../*.** Remo
6a90: 76 65 20 61 6c 6c 20 72 65 63 6f 72 64 73 20 61  ve all records a
6aa0: 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 73  ssociated with s
6ab0: 65 67 6d 65 6e 74 20 69 53 65 67 69 64 2e 0a 2a  egment iSegid..*
6ac0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  /.static void ft
6ad0: 73 35 44 61 74 61 52 65 6d 6f 76 65 53 65 67 6d  s5DataRemoveSegm
6ae0: 65 6e 74 28 46 74 73 35 49 6e 64 65 78 20 2a 70  ent(Fts5Index *p
6af0: 2c 20 69 6e 74 20 69 53 65 67 69 64 29 7b 0a 20  , int iSegid){. 
6b00: 20 69 36 34 20 69 46 69 72 73 74 20 3d 20 46 54   i64 iFirst = FT
6b10: 53 35 5f 53 45 47 4d 45 4e 54 5f 52 4f 57 49 44  S5_SEGMENT_ROWID
6b20: 28 69 53 65 67 69 64 2c 20 30 29 3b 0a 20 20 69  (iSegid, 0);.  i
6b30: 36 34 20 69 4c 61 73 74 20 3d 20 46 54 53 35 5f  64 iLast = FTS5_
6b40: 53 45 47 4d 45 4e 54 5f 52 4f 57 49 44 28 69 53  SEGMENT_ROWID(iS
6b50: 65 67 69 64 2b 31 2c 20 30 29 2d 31 3b 0a 20 20  egid+1, 0)-1;.  
6b60: 66 74 73 35 44 61 74 61 44 65 6c 65 74 65 28 70  fts5DataDelete(p
6b70: 2c 20 69 46 69 72 73 74 2c 20 69 4c 61 73 74 29  , iFirst, iLast)
6b80: 3b 0a 20 20 69 66 28 20 70 2d 3e 70 49 64 78 44  ;.  if( p->pIdxD
6b90: 65 6c 65 74 65 72 3d 3d 30 20 29 7b 0a 20 20 20  eleter==0 ){.   
6ba0: 20 46 74 73 35 43 6f 6e 66 69 67 20 2a 70 43 6f   Fts5Config *pCo
6bb0: 6e 66 69 67 20 3d 20 70 2d 3e 70 43 6f 6e 66 69  nfig = p->pConfi
6bc0: 67 3b 0a 20 20 20 20 66 74 73 35 49 6e 64 65 78  g;.    fts5Index
6bd0: 50 72 65 70 61 72 65 53 74 6d 74 28 70 2c 20 26  PrepareStmt(p, &
6be0: 70 2d 3e 70 49 64 78 44 65 6c 65 74 65 72 2c 20  p->pIdxDeleter, 
6bf0: 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
6c00: 0a 20 20 20 20 20 20 20 20 20 20 22 44 45 4c 45  .          "DELE
6c10: 54 45 20 46 52 4f 4d 20 27 25 71 27 2e 27 25 71  TE FROM '%q'.'%q
6c20: 5f 69 64 78 27 20 57 48 45 52 45 20 73 65 67 69  _idx' WHERE segi
6c30: 64 3d 3f 22 2c 0a 20 20 20 20 20 20 20 20 20 20  d=?",.          
6c40: 70 43 6f 6e 66 69 67 2d 3e 7a 44 62 2c 20 70 43  pConfig->zDb, pC
6c50: 6f 6e 66 69 67 2d 3e 7a 4e 61 6d 65 0a 20 20 20  onfig->zName.   
6c60: 20 29 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70   ));.  }.  if( p
6c70: 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
6c80: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62  ){.    sqlite3_b
6c90: 69 6e 64 5f 69 6e 74 28 70 2d 3e 70 49 64 78 44  ind_int(p->pIdxD
6ca0: 65 6c 65 74 65 72 2c 20 31 2c 20 69 53 65 67 69  eleter, 1, iSegi
6cb0: 64 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  d);.    sqlite3_
6cc0: 73 74 65 70 28 70 2d 3e 70 49 64 78 44 65 6c 65  step(p->pIdxDele
6cd0: 74 65 72 29 3b 0a 20 20 20 20 70 2d 3e 72 63 20  ter);.    p->rc 
6ce0: 3d 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28  = sqlite3_reset(
6cf0: 70 2d 3e 70 49 64 78 44 65 6c 65 74 65 72 29 3b  p->pIdxDeleter);
6d00: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  .  }.}../*.** Re
6d10: 6c 65 61 73 65 20 61 20 72 65 66 65 72 65 6e 63  lease a referenc
6d20: 65 20 74 6f 20 61 6e 20 46 74 73 35 53 74 72 75  e to an Fts5Stru
6d30: 63 74 75 72 65 20 6f 62 6a 65 63 74 20 72 65 74  cture object ret
6d40: 75 72 6e 65 64 20 62 79 20 61 6e 20 65 61 72 6c  urned by an earl
6d50: 69 65 72 20 0a 2a 2a 20 63 61 6c 6c 20 74 6f 20  ier .** call to 
6d60: 66 74 73 35 53 74 72 75 63 74 75 72 65 52 65 61  fts5StructureRea
6d70: 64 28 29 20 6f 72 20 66 74 73 35 53 74 72 75 63  d() or fts5Struc
6d80: 74 75 72 65 44 65 63 6f 64 65 28 29 2e 0a 2a 2f  tureDecode()..*/
6d90: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
6da0: 35 53 74 72 75 63 74 75 72 65 52 65 6c 65 61 73  5StructureReleas
6db0: 65 28 46 74 73 35 53 74 72 75 63 74 75 72 65 20  e(Fts5Structure 
6dc0: 2a 70 53 74 72 75 63 74 29 7b 0a 20 20 69 66 28  *pStruct){.  if(
6dd0: 20 70 53 74 72 75 63 74 20 26 26 20 30 3e 3d 28   pStruct && 0>=(
6de0: 2d 2d 70 53 74 72 75 63 74 2d 3e 6e 52 65 66 29  --pStruct->nRef)
6df0: 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20   ){.    int i;. 
6e00: 20 20 20 61 73 73 65 72 74 28 20 70 53 74 72 75     assert( pStru
6e10: 63 74 2d 3e 6e 52 65 66 3d 3d 30 20 29 3b 0a 20  ct->nRef==0 );. 
6e20: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 53     for(i=0; i<pS
6e30: 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 3b 20 69  truct->nLevel; i
6e40: 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  ++){.      sqlit
6e50: 65 33 5f 66 72 65 65 28 70 53 74 72 75 63 74 2d  e3_free(pStruct-
6e60: 3e 61 4c 65 76 65 6c 5b 69 5d 2e 61 53 65 67 29  >aLevel[i].aSeg)
6e70: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
6e80: 74 65 33 5f 66 72 65 65 28 70 53 74 72 75 63 74  te3_free(pStruct
6e90: 29 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63  );.  }.}..static
6ea0: 20 76 6f 69 64 20 66 74 73 35 53 74 72 75 63 74   void fts5Struct
6eb0: 75 72 65 52 65 66 28 46 74 73 35 53 74 72 75 63  ureRef(Fts5Struc
6ec0: 74 75 72 65 20 2a 70 53 74 72 75 63 74 29 7b 0a  ture *pStruct){.
6ed0: 20 20 70 53 74 72 75 63 74 2d 3e 6e 52 65 66 2b    pStruct->nRef+
6ee0: 2b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 73 65  +;.}../*.** Dese
6ef0: 72 69 61 6c 69 7a 65 20 61 6e 64 20 72 65 74 75  rialize and retu
6f00: 72 6e 20 74 68 65 20 73 74 72 75 63 74 75 72 65  rn the structure
6f10: 20 72 65 63 6f 72 64 20 63 75 72 72 65 6e 74 6c   record currentl
6f20: 79 20 73 74 6f 72 65 64 20 69 6e 20 73 65 72 69  y stored in seri
6f30: 61 6c 69 7a 65 64 0a 2a 2a 20 66 6f 72 6d 20 77  alized.** form w
6f40: 69 74 68 69 6e 20 62 75 66 66 65 72 20 70 44 61  ithin buffer pDa
6f50: 74 61 2f 6e 44 61 74 61 2e 0a 2a 2a 0a 2a 2a 20  ta/nData..**.** 
6f60: 54 68 65 20 46 74 73 35 53 74 72 75 63 74 75 72  The Fts5Structur
6f70: 65 2e 61 4c 65 76 65 6c 5b 5d 20 61 6e 64 20 65  e.aLevel[] and e
6f80: 61 63 68 20 46 74 73 35 53 74 72 75 63 74 75 72  ach Fts5Structur
6f90: 65 4c 65 76 65 6c 2e 61 53 65 67 5b 5d 20 61 72  eLevel.aSeg[] ar
6fa0: 72 61 79 0a 2a 2a 20 61 72 65 20 6f 76 65 72 2d  ray.** are over-
6fb0: 61 6c 6c 6f 63 61 74 65 64 20 62 79 20 6f 6e 65  allocated by one
6fc0: 20 73 6c 6f 74 2e 20 54 68 69 73 20 61 6c 6c 6f   slot. This allo
6fd0: 77 73 20 74 68 65 20 73 74 72 75 63 74 75 72 65  ws the structure
6fe0: 20 63 6f 6e 74 65 6e 74 73 0a 2a 2a 20 74 6f 20   contents.** to 
6ff0: 62 65 20 6d 6f 72 65 20 65 61 73 69 6c 79 20 65  be more easily e
7000: 64 69 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  dited..**.** If 
7010: 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  an error occurs,
7020: 20 2a 70 70 4f 75 74 20 69 73 20 73 65 74 20 74   *ppOut is set t
7030: 6f 20 4e 55 4c 4c 20 61 6e 64 20 61 6e 20 53 51  o NULL and an SQ
7040: 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 0a  Lite error code.
7050: 2a 2a 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68  ** returned. Oth
7060: 65 72 77 69 73 65 2c 20 2a 70 70 4f 75 74 20 69  erwise, *ppOut i
7070: 73 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74  s set to point t
7080: 6f 20 74 68 65 20 6e 65 77 20 6f 62 6a 65 63 74  o the new object
7090: 20 61 6e 64 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f   and.** SQLITE_O
70a0: 4b 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73  K returned..*/.s
70b0: 74 61 74 69 63 20 69 6e 74 20 66 74 73 35 53 74  tatic int fts5St
70c0: 72 75 63 74 75 72 65 44 65 63 6f 64 65 28 0a 20  ructureDecode(. 
70d0: 20 63 6f 6e 73 74 20 75 38 20 2a 70 44 61 74 61   const u8 *pData
70e0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
70f0: 20 2f 2a 20 42 75 66 66 65 72 20 63 6f 6e 74 61   /* Buffer conta
7100: 69 6e 69 6e 67 20 73 65 72 69 61 6c 69 7a 65 64  ining serialized
7110: 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20   structure */.  
7120: 69 6e 74 20 6e 44 61 74 61 2c 20 20 20 20 20 20  int nData,      
7130: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7140: 2f 2a 20 53 69 7a 65 20 6f 66 20 62 75 66 66 65  /* Size of buffe
7150: 72 20 70 44 61 74 61 20 69 6e 20 62 79 74 65 73  r pData in bytes
7160: 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 69 43 6f 6f   */.  int *piCoo
7170: 6b 69 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  kie,            
7180: 20 20 20 20 20 20 2f 2a 20 43 6f 6e 66 69 67 75        /* Configu
7190: 72 61 74 69 6f 6e 20 63 6f 6f 6b 69 65 20 76 61  ration cookie va
71a0: 6c 75 65 20 2a 2f 0a 20 20 46 74 73 35 53 74 72  lue */.  Fts5Str
71b0: 75 63 74 75 72 65 20 2a 2a 70 70 4f 75 74 20 20  ucture **ppOut  
71c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a           /* OUT:
71d0: 20 44 65 73 65 72 69 61 6c 69 7a 65 64 20 6f 62   Deserialized ob
71e0: 6a 65 63 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  ject */.){.  int
71f0: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
7200: 0a 20 20 69 6e 74 20 69 20 3d 20 30 3b 0a 20 20  .  int i = 0;.  
7210: 69 6e 74 20 69 4c 76 6c 3b 0a 20 20 69 6e 74 20  int iLvl;.  int 
7220: 6e 4c 65 76 65 6c 20 3d 20 30 3b 0a 20 20 69 6e  nLevel = 0;.  in
7230: 74 20 6e 53 65 67 6d 65 6e 74 20 3d 20 30 3b 0a  t nSegment = 0;.
7240: 20 20 69 6e 74 20 6e 42 79 74 65 3b 20 20 20 20    int nByte;    
7250: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7260: 20 20 2f 2a 20 42 79 74 65 73 20 6f 66 20 73 70    /* Bytes of sp
7270: 61 63 65 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20  ace to allocate 
7280: 61 74 20 70 52 65 74 20 2a 2f 0a 20 20 46 74 73  at pRet */.  Fts
7290: 35 53 74 72 75 63 74 75 72 65 20 2a 70 52 65 74  5Structure *pRet
72a0: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 2f 2a 20   = 0;        /* 
72b0: 53 74 72 75 63 74 75 72 65 20 6f 62 6a 65 63 74  Structure object
72c0: 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 0a 20   to return */.. 
72d0: 20 2f 2a 20 47 72 61 62 20 74 68 65 20 63 6f 6f   /* Grab the coo
72e0: 6b 69 65 20 76 61 6c 75 65 20 2a 2f 0a 20 20 69  kie value */.  i
72f0: 66 28 20 70 69 43 6f 6f 6b 69 65 20 29 20 2a 70  f( piCookie ) *p
7300: 69 43 6f 6f 6b 69 65 20 3d 20 73 71 6c 69 74 65  iCookie = sqlite
7310: 33 46 74 73 35 47 65 74 33 32 28 70 44 61 74 61  3Fts5Get32(pData
7320: 29 3b 0a 20 20 69 20 3d 20 34 3b 0a 0a 20 20 2f  );.  i = 4;..  /
7330: 2a 20 52 65 61 64 20 74 68 65 20 74 6f 74 61 6c  * Read the total
7340: 20 6e 75 6d 62 65 72 20 6f 66 20 6c 65 76 65 6c   number of level
7350: 73 20 61 6e 64 20 73 65 67 6d 65 6e 74 73 20 66  s and segments f
7360: 72 6f 6d 20 74 68 65 20 73 74 61 72 74 20 6f 66  rom the start of
7370: 20 74 68 65 0a 20 20 2a 2a 20 73 74 72 75 63 74   the.  ** struct
7380: 75 72 65 20 72 65 63 6f 72 64 2e 20 20 2a 2f 0a  ure record.  */.
7390: 20 20 69 20 2b 3d 20 66 74 73 35 47 65 74 56 61    i += fts5GetVa
73a0: 72 69 6e 74 33 32 28 26 70 44 61 74 61 5b 69 5d  rint32(&pData[i]
73b0: 2c 20 6e 4c 65 76 65 6c 29 3b 0a 20 20 69 20 2b  , nLevel);.  i +
73c0: 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e 74 33  = fts5GetVarint3
73d0: 32 28 26 70 44 61 74 61 5b 69 5d 2c 20 6e 53 65  2(&pData[i], nSe
73e0: 67 6d 65 6e 74 29 3b 0a 20 20 6e 42 79 74 65 20  gment);.  nByte 
73f0: 3d 20 28 0a 20 20 20 20 20 20 73 69 7a 65 6f 66  = (.      sizeof
7400: 28 46 74 73 35 53 74 72 75 63 74 75 72 65 29 20  (Fts5Structure) 
7410: 2b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  +               
7420: 20 20 20 20 20 2f 2a 20 4d 61 69 6e 20 73 74 72       /* Main str
7430: 75 63 74 75 72 65 20 2a 2f 0a 20 20 20 20 20 20  ucture */.      
7440: 73 69 7a 65 6f 66 28 46 74 73 35 53 74 72 75 63  sizeof(Fts5Struc
7450: 74 75 72 65 4c 65 76 65 6c 29 20 2a 20 28 6e 4c  tureLevel) * (nL
7460: 65 76 65 6c 2d 31 29 20 20 20 20 2f 2a 20 61 4c  evel-1)    /* aL
7470: 65 76 65 6c 5b 5d 20 61 72 72 61 79 20 2a 2f 0a  evel[] array */.
7480: 20 20 29 3b 0a 20 20 70 52 65 74 20 3d 20 28 46    );.  pRet = (F
7490: 74 73 35 53 74 72 75 63 74 75 72 65 2a 29 73 71  ts5Structure*)sq
74a0: 6c 69 74 65 33 46 74 73 35 4d 61 6c 6c 6f 63 5a  lite3Fts5MallocZ
74b0: 65 72 6f 28 26 72 63 2c 20 6e 42 79 74 65 29 3b  ero(&rc, nByte);
74c0: 0a 0a 20 20 69 66 28 20 70 52 65 74 20 29 7b 0a  ..  if( pRet ){.
74d0: 20 20 20 20 70 52 65 74 2d 3e 6e 52 65 66 20 3d      pRet->nRef =
74e0: 20 31 3b 0a 20 20 20 20 70 52 65 74 2d 3e 6e 4c   1;.    pRet->nL
74f0: 65 76 65 6c 20 3d 20 6e 4c 65 76 65 6c 3b 0a 20  evel = nLevel;. 
7500: 20 20 20 70 52 65 74 2d 3e 6e 53 65 67 6d 65 6e     pRet->nSegmen
7510: 74 20 3d 20 6e 53 65 67 6d 65 6e 74 3b 0a 20 20  t = nSegment;.  
7520: 20 20 69 20 2b 3d 20 73 71 6c 69 74 65 33 46 74    i += sqlite3Ft
7530: 73 35 47 65 74 56 61 72 69 6e 74 28 26 70 44 61  s5GetVarint(&pDa
7540: 74 61 5b 69 5d 2c 20 26 70 52 65 74 2d 3e 6e 57  ta[i], &pRet->nW
7550: 72 69 74 65 43 6f 75 6e 74 65 72 29 3b 0a 0a 20  riteCounter);.. 
7560: 20 20 20 66 6f 72 28 69 4c 76 6c 3d 30 3b 20 72     for(iLvl=0; r
7570: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
7580: 69 4c 76 6c 3c 6e 4c 65 76 65 6c 3b 20 69 4c 76  iLvl<nLevel; iLv
7590: 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 46 74 73 35  l++){.      Fts5
75a0: 53 74 72 75 63 74 75 72 65 4c 65 76 65 6c 20 2a  StructureLevel *
75b0: 70 4c 76 6c 20 3d 20 26 70 52 65 74 2d 3e 61 4c  pLvl = &pRet->aL
75c0: 65 76 65 6c 5b 69 4c 76 6c 5d 3b 0a 20 20 20 20  evel[iLvl];.    
75d0: 20 20 69 6e 74 20 6e 54 6f 74 61 6c 20 3d 20 30    int nTotal = 0
75e0: 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 53 65 67  ;.      int iSeg
75f0: 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 69 3e 3d  ;..      if( i>=
7600: 6e 44 61 74 61 20 29 7b 0a 20 20 20 20 20 20 20  nData ){.       
7610: 20 72 63 20 3d 20 46 54 53 35 5f 43 4f 52 52 55   rc = FTS5_CORRU
7620: 50 54 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  PT;.      }else{
7630: 0a 20 20 20 20 20 20 20 20 69 20 2b 3d 20 66 74  .        i += ft
7640: 73 35 47 65 74 56 61 72 69 6e 74 33 32 28 26 70  s5GetVarint32(&p
7650: 44 61 74 61 5b 69 5d 2c 20 70 4c 76 6c 2d 3e 6e  Data[i], pLvl->n
7660: 4d 65 72 67 65 29 3b 0a 20 20 20 20 20 20 20 20  Merge);.        
7670: 69 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69  i += fts5GetVari
7680: 6e 74 33 32 28 26 70 44 61 74 61 5b 69 5d 2c 20  nt32(&pData[i], 
7690: 6e 54 6f 74 61 6c 29 3b 0a 20 20 20 20 20 20 20  nTotal);.       
76a0: 20 61 73 73 65 72 74 28 20 6e 54 6f 74 61 6c 3e   assert( nTotal>
76b0: 3d 70 4c 76 6c 2d 3e 6e 4d 65 72 67 65 20 29 3b  =pLvl->nMerge );
76c0: 0a 20 20 20 20 20 20 20 20 70 4c 76 6c 2d 3e 61  .        pLvl->a
76d0: 53 65 67 20 3d 20 28 46 74 73 35 53 74 72 75 63  Seg = (Fts5Struc
76e0: 74 75 72 65 53 65 67 6d 65 6e 74 2a 29 73 71 6c  tureSegment*)sql
76f0: 69 74 65 33 46 74 73 35 4d 61 6c 6c 6f 63 5a 65  ite3Fts5MallocZe
7700: 72 6f 28 26 72 63 2c 20 0a 20 20 20 20 20 20 20  ro(&rc, .       
7710: 20 20 20 20 20 6e 54 6f 74 61 6c 20 2a 20 73 69       nTotal * si
7720: 7a 65 6f 66 28 46 74 73 35 53 74 72 75 63 74 75  zeof(Fts5Structu
7730: 72 65 53 65 67 6d 65 6e 74 29 0a 20 20 20 20 20  reSegment).     
7740: 20 20 20 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20     );.      }.. 
7750: 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
7760: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
7770: 20 20 70 4c 76 6c 2d 3e 6e 53 65 67 20 3d 20 6e    pLvl->nSeg = n
7780: 54 6f 74 61 6c 3b 0a 20 20 20 20 20 20 20 20 66  Total;.        f
7790: 6f 72 28 69 53 65 67 3d 30 3b 20 69 53 65 67 3c  or(iSeg=0; iSeg<
77a0: 6e 54 6f 74 61 6c 3b 20 69 53 65 67 2b 2b 29 7b  nTotal; iSeg++){
77b0: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69  .          if( i
77c0: 3e 3d 6e 44 61 74 61 20 29 7b 0a 20 20 20 20 20  >=nData ){.     
77d0: 20 20 20 20 20 20 20 72 63 20 3d 20 46 54 53 35         rc = FTS5
77e0: 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20 20 20 20  _CORRUPT;.      
77f0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
7800: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
7810: 20 20 20 69 20 2b 3d 20 66 74 73 35 47 65 74 56     i += fts5GetV
7820: 61 72 69 6e 74 33 32 28 26 70 44 61 74 61 5b 69  arint32(&pData[i
7830: 5d 2c 20 70 4c 76 6c 2d 3e 61 53 65 67 5b 69 53  ], pLvl->aSeg[iS
7840: 65 67 5d 2e 69 53 65 67 69 64 29 3b 0a 20 20 20  eg].iSegid);.   
7850: 20 20 20 20 20 20 20 69 20 2b 3d 20 66 74 73 35         i += fts5
7860: 47 65 74 56 61 72 69 6e 74 33 32 28 26 70 44 61  GetVarint32(&pDa
7870: 74 61 5b 69 5d 2c 20 70 4c 76 6c 2d 3e 61 53 65  ta[i], pLvl->aSe
7880: 67 5b 69 53 65 67 5d 2e 70 67 6e 6f 46 69 72 73  g[iSeg].pgnoFirs
7890: 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 20  t);.          i 
78a0: 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e 74  += fts5GetVarint
78b0: 33 32 28 26 70 44 61 74 61 5b 69 5d 2c 20 70 4c  32(&pData[i], pL
78c0: 76 6c 2d 3e 61 53 65 67 5b 69 53 65 67 5d 2e 70  vl->aSeg[iSeg].p
78d0: 67 6e 6f 4c 61 73 74 29 3b 0a 20 20 20 20 20 20  gnoLast);.      
78e0: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
78f0: 7d 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  }.    if( rc!=SQ
7900: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
7910: 20 66 74 73 35 53 74 72 75 63 74 75 72 65 52 65   fts5StructureRe
7920: 6c 65 61 73 65 28 70 52 65 74 29 3b 0a 20 20 20  lease(pRet);.   
7930: 20 20 20 70 52 65 74 20 3d 20 30 3b 0a 20 20 20     pRet = 0;.   
7940: 20 7d 0a 20 20 7d 0a 0a 20 20 2a 70 70 4f 75 74   }.  }..  *ppOut
7950: 20 3d 20 70 52 65 74 3b 0a 20 20 72 65 74 75 72   = pRet;.  retur
7960: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 0a 2a  n rc;.}../*.**.*
7970: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  /.static void ft
7980: 73 35 53 74 72 75 63 74 75 72 65 41 64 64 4c 65  s5StructureAddLe
7990: 76 65 6c 28 69 6e 74 20 2a 70 52 63 2c 20 46 74  vel(int *pRc, Ft
79a0: 73 35 53 74 72 75 63 74 75 72 65 20 2a 2a 70 70  s5Structure **pp
79b0: 53 74 72 75 63 74 29 7b 0a 20 20 69 66 28 20 2a  Struct){.  if( *
79c0: 70 52 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  pRc==SQLITE_OK )
79d0: 7b 0a 20 20 20 20 46 74 73 35 53 74 72 75 63 74  {.    Fts5Struct
79e0: 75 72 65 20 2a 70 53 74 72 75 63 74 20 3d 20 2a  ure *pStruct = *
79f0: 70 70 53 74 72 75 63 74 3b 0a 20 20 20 20 69 6e  ppStruct;.    in
7a00: 74 20 6e 4c 65 76 65 6c 20 3d 20 70 53 74 72 75  t nLevel = pStru
7a10: 63 74 2d 3e 6e 4c 65 76 65 6c 3b 0a 20 20 20 20  ct->nLevel;.    
7a20: 69 6e 74 20 6e 42 79 74 65 20 3d 20 28 0a 20 20  int nByte = (.  
7a30: 20 20 20 20 20 20 73 69 7a 65 6f 66 28 46 74 73        sizeof(Fts
7a40: 35 53 74 72 75 63 74 75 72 65 29 20 2b 20 20 20  5Structure) +   
7a50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
7a60: 2a 20 4d 61 69 6e 20 73 74 72 75 63 74 75 72 65  * Main structure
7a70: 20 2a 2f 0a 20 20 20 20 20 20 20 20 73 69 7a 65   */.        size
7a80: 6f 66 28 46 74 73 35 53 74 72 75 63 74 75 72 65  of(Fts5Structure
7a90: 4c 65 76 65 6c 29 20 2a 20 28 6e 4c 65 76 65 6c  Level) * (nLevel
7aa0: 2b 31 29 20 20 2f 2a 20 61 4c 65 76 65 6c 5b 5d  +1)  /* aLevel[]
7ab0: 20 61 72 72 61 79 20 2a 2f 0a 20 20 20 20 29 3b   array */.    );
7ac0: 0a 0a 20 20 20 20 70 53 74 72 75 63 74 20 3d 20  ..    pStruct = 
7ad0: 73 71 6c 69 74 65 33 5f 72 65 61 6c 6c 6f 63 28  sqlite3_realloc(
7ae0: 70 53 74 72 75 63 74 2c 20 6e 42 79 74 65 29 3b  pStruct, nByte);
7af0: 0a 20 20 20 20 69 66 28 20 70 53 74 72 75 63 74  .    if( pStruct
7b00: 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74   ){.      memset
7b10: 28 26 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65  (&pStruct->aLeve
7b20: 6c 5b 6e 4c 65 76 65 6c 5d 2c 20 30 2c 20 73 69  l[nLevel], 0, si
7b30: 7a 65 6f 66 28 46 74 73 35 53 74 72 75 63 74 75  zeof(Fts5Structu
7b40: 72 65 4c 65 76 65 6c 29 29 3b 0a 20 20 20 20 20  reLevel));.     
7b50: 20 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c   pStruct->nLevel
7b60: 2b 2b 3b 0a 20 20 20 20 20 20 2a 70 70 53 74 72  ++;.      *ppStr
7b70: 75 63 74 20 3d 20 70 53 74 72 75 63 74 3b 0a 20  uct = pStruct;. 
7b80: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
7b90: 2a 70 52 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f  *pRc = SQLITE_NO
7ba0: 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  MEM;.    }.  }.}
7bb0: 0a 0a 2f 2a 0a 2a 2a 20 45 78 74 65 6e 64 20 6c  ../*.** Extend l
7bc0: 65 76 65 6c 20 69 4c 76 6c 20 73 6f 20 74 68 61  evel iLvl so tha
7bd0: 74 20 74 68 65 72 65 20 69 73 20 72 6f 6f 6d 20  t there is room 
7be0: 66 6f 72 20 61 74 20 6c 65 61 73 74 20 6e 45 78  for at least nEx
7bf0: 74 72 61 20 6d 6f 72 65 0a 2a 2a 20 73 65 67 6d  tra more.** segm
7c00: 65 6e 74 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ents..*/.static 
7c10: 76 6f 69 64 20 66 74 73 35 53 74 72 75 63 74 75  void fts5Structu
7c20: 72 65 45 78 74 65 6e 64 4c 65 76 65 6c 28 0a 20  reExtendLevel(. 
7c30: 20 69 6e 74 20 2a 70 52 63 2c 20 0a 20 20 46 74   int *pRc, .  Ft
7c40: 73 35 53 74 72 75 63 74 75 72 65 20 2a 70 53 74  s5Structure *pSt
7c50: 72 75 63 74 2c 20 0a 20 20 69 6e 74 20 69 4c 76  ruct, .  int iLv
7c60: 6c 2c 20 0a 20 20 69 6e 74 20 6e 45 78 74 72 61  l, .  int nExtra
7c70: 2c 20 0a 20 20 69 6e 74 20 62 49 6e 73 65 72 74  , .  int bInsert
7c80: 0a 29 7b 0a 20 20 69 66 28 20 2a 70 52 63 3d 3d  .){.  if( *pRc==
7c90: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
7ca0: 20 46 74 73 35 53 74 72 75 63 74 75 72 65 4c 65   Fts5StructureLe
7cb0: 76 65 6c 20 2a 70 4c 76 6c 20 3d 20 26 70 53 74  vel *pLvl = &pSt
7cc0: 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76  ruct->aLevel[iLv
7cd0: 6c 5d 3b 0a 20 20 20 20 46 74 73 35 53 74 72 75  l];.    Fts5Stru
7ce0: 63 74 75 72 65 53 65 67 6d 65 6e 74 20 2a 61 4e  ctureSegment *aN
7cf0: 65 77 3b 0a 20 20 20 20 69 6e 74 20 6e 42 79 74  ew;.    int nByt
7d00: 65 3b 0a 0a 20 20 20 20 6e 42 79 74 65 20 3d 20  e;..    nByte = 
7d10: 28 70 4c 76 6c 2d 3e 6e 53 65 67 20 2b 20 6e 45  (pLvl->nSeg + nE
7d20: 78 74 72 61 29 20 2a 20 73 69 7a 65 6f 66 28 46  xtra) * sizeof(F
7d30: 74 73 35 53 74 72 75 63 74 75 72 65 53 65 67 6d  ts5StructureSegm
7d40: 65 6e 74 29 3b 0a 20 20 20 20 61 4e 65 77 20 3d  ent);.    aNew =
7d50: 20 73 71 6c 69 74 65 33 5f 72 65 61 6c 6c 6f 63   sqlite3_realloc
7d60: 28 70 4c 76 6c 2d 3e 61 53 65 67 2c 20 6e 42 79  (pLvl->aSeg, nBy
7d70: 74 65 29 3b 0a 20 20 20 20 69 66 28 20 61 4e 65  te);.    if( aNe
7d80: 77 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 62  w ){.      if( b
7d90: 49 6e 73 65 72 74 3d 3d 30 20 29 7b 0a 20 20 20  Insert==0 ){.   
7da0: 20 20 20 20 20 6d 65 6d 73 65 74 28 26 61 4e 65       memset(&aNe
7db0: 77 5b 70 4c 76 6c 2d 3e 6e 53 65 67 5d 2c 20 30  w[pLvl->nSeg], 0
7dc0: 2c 20 73 69 7a 65 6f 66 28 46 74 73 35 53 74 72  , sizeof(Fts5Str
7dd0: 75 63 74 75 72 65 53 65 67 6d 65 6e 74 29 20 2a  uctureSegment) *
7de0: 20 6e 45 78 74 72 61 29 3b 0a 20 20 20 20 20 20   nExtra);.      
7df0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69  }else{.        i
7e00: 6e 74 20 6e 4d 6f 76 65 20 3d 20 70 4c 76 6c 2d  nt nMove = pLvl-
7e10: 3e 6e 53 65 67 20 2a 20 73 69 7a 65 6f 66 28 46  >nSeg * sizeof(F
7e20: 74 73 35 53 74 72 75 63 74 75 72 65 53 65 67 6d  ts5StructureSegm
7e30: 65 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 6d 65  ent);.        me
7e40: 6d 6d 6f 76 65 28 26 61 4e 65 77 5b 6e 45 78 74  mmove(&aNew[nExt
7e50: 72 61 5d 2c 20 61 4e 65 77 2c 20 6e 4d 6f 76 65  ra], aNew, nMove
7e60: 29 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 73 65  );.        memse
7e70: 74 28 61 4e 65 77 2c 20 30 2c 20 73 69 7a 65 6f  t(aNew, 0, sizeo
7e80: 66 28 46 74 73 35 53 74 72 75 63 74 75 72 65 53  f(Fts5StructureS
7e90: 65 67 6d 65 6e 74 29 20 2a 20 6e 45 78 74 72 61  egment) * nExtra
7ea0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
7eb0: 20 70 4c 76 6c 2d 3e 61 53 65 67 20 3d 20 61 4e   pLvl->aSeg = aN
7ec0: 65 77 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ew;.    }else{. 
7ed0: 20 20 20 20 20 2a 70 52 63 20 3d 20 53 51 4c 49       *pRc = SQLI
7ee0: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a  TE_NOMEM;.    }.
7ef0: 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 46 74    }.}..static Ft
7f00: 73 35 53 74 72 75 63 74 75 72 65 20 2a 66 74 73  s5Structure *fts
7f10: 35 53 74 72 75 63 74 75 72 65 52 65 61 64 55 6e  5StructureReadUn
7f20: 63 61 63 68 65 64 28 46 74 73 35 49 6e 64 65 78  cached(Fts5Index
7f30: 20 2a 70 29 7b 0a 20 20 46 74 73 35 53 74 72 75   *p){.  Fts5Stru
7f40: 63 74 75 72 65 20 2a 70 52 65 74 20 3d 20 30 3b  cture *pRet = 0;
7f50: 0a 20 20 46 74 73 35 43 6f 6e 66 69 67 20 2a 70  .  Fts5Config *p
7f60: 43 6f 6e 66 69 67 20 3d 20 70 2d 3e 70 43 6f 6e  Config = p->pCon
7f70: 66 69 67 3b 0a 20 20 69 6e 74 20 69 43 6f 6f 6b  fig;.  int iCook
7f80: 69 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ie;             
7f90: 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 66 69 67         /* Config
7fa0: 75 72 61 74 69 6f 6e 20 63 6f 6f 6b 69 65 20 2a  uration cookie *
7fb0: 2f 0a 20 20 46 74 73 35 44 61 74 61 20 2a 70 44  /.  Fts5Data *pD
7fc0: 61 74 61 3b 0a 0a 20 20 70 44 61 74 61 20 3d 20  ata;..  pData = 
7fd0: 66 74 73 35 44 61 74 61 52 65 61 64 28 70 2c 20  fts5DataRead(p, 
7fe0: 46 54 53 35 5f 53 54 52 55 43 54 55 52 45 5f 52  FTS5_STRUCTURE_R
7ff0: 4f 57 49 44 29 3b 0a 20 20 69 66 28 20 70 2d 3e  OWID);.  if( p->
8000: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
8010: 0a 20 20 20 20 2f 2a 20 54 4f 44 4f 3a 20 44 6f  .    /* TODO: Do
8020: 20 77 65 20 6e 65 65 64 20 74 68 69 73 20 69 66   we need this if
8030: 20 74 68 65 20 6c 65 61 66 2d 69 6e 64 65 78 20   the leaf-index 
8040: 69 73 20 61 70 70 65 6e 64 65 64 3f 20 50 72 6f  is appended? Pro
8050: 62 61 62 6c 79 2e 2e 2e 20 2a 2f 0a 20 20 20 20  bably... */.    
8060: 6d 65 6d 73 65 74 28 26 70 44 61 74 61 2d 3e 70  memset(&pData->p
8070: 5b 70 44 61 74 61 2d 3e 6e 6e 5d 2c 20 30 2c 20  [pData->nn], 0, 
8080: 46 54 53 35 5f 44 41 54 41 5f 50 41 44 44 49 4e  FTS5_DATA_PADDIN
8090: 47 29 3b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20  G);.    p->rc = 
80a0: 66 74 73 35 53 74 72 75 63 74 75 72 65 44 65 63  fts5StructureDec
80b0: 6f 64 65 28 70 44 61 74 61 2d 3e 70 2c 20 70 44  ode(pData->p, pD
80c0: 61 74 61 2d 3e 6e 6e 2c 20 26 69 43 6f 6f 6b 69  ata->nn, &iCooki
80d0: 65 2c 20 26 70 52 65 74 29 3b 0a 20 20 20 20 69  e, &pRet);.    i
80e0: 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  f( p->rc==SQLITE
80f0: 5f 4f 4b 20 26 26 20 70 43 6f 6e 66 69 67 2d 3e  _OK && pConfig->
8100: 69 43 6f 6f 6b 69 65 21 3d 69 43 6f 6f 6b 69 65  iCookie!=iCookie
8110: 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 72 63 20   ){.      p->rc 
8120: 3d 20 73 71 6c 69 74 65 33 46 74 73 35 43 6f 6e  = sqlite3Fts5Con
8130: 66 69 67 4c 6f 61 64 28 70 43 6f 6e 66 69 67 2c  figLoad(pConfig,
8140: 20 69 43 6f 6f 6b 69 65 29 3b 0a 20 20 20 20 7d   iCookie);.    }
8150: 0a 20 20 20 20 66 74 73 35 44 61 74 61 52 65 6c  .    fts5DataRel
8160: 65 61 73 65 28 70 44 61 74 61 29 3b 0a 20 20 20  ease(pData);.   
8170: 20 69 66 28 20 70 2d 3e 72 63 21 3d 53 51 4c 49   if( p->rc!=SQLI
8180: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 66  TE_OK ){.      f
8190: 74 73 35 53 74 72 75 63 74 75 72 65 52 65 6c 65  ts5StructureRele
81a0: 61 73 65 28 70 52 65 74 29 3b 0a 20 20 20 20 20  ase(pRet);.     
81b0: 20 70 52 65 74 20 3d 20 30 3b 0a 20 20 20 20 7d   pRet = 0;.    }
81c0: 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70  .  }..  return p
81d0: 52 65 74 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69  Ret;.}..static i
81e0: 36 34 20 66 74 73 35 49 6e 64 65 78 44 61 74 61  64 fts5IndexData
81f0: 56 65 72 73 69 6f 6e 28 46 74 73 35 49 6e 64 65  Version(Fts5Inde
8200: 78 20 2a 70 29 7b 0a 20 20 69 36 34 20 69 56 65  x *p){.  i64 iVe
8210: 72 73 69 6f 6e 20 3d 20 30 3b 0a 0a 20 20 69 66  rsion = 0;..  if
8220: 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
8230: 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 70 2d  OK ){.    if( p-
8240: 3e 70 44 61 74 61 56 65 72 73 69 6f 6e 3d 3d 30  >pDataVersion==0
8250: 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 72 63 20   ){.      p->rc 
8260: 3d 20 66 74 73 35 49 6e 64 65 78 50 72 65 70 61  = fts5IndexPrepa
8270: 72 65 53 74 6d 74 28 70 2c 20 26 70 2d 3e 70 44  reStmt(p, &p->pD
8280: 61 74 61 56 65 72 73 69 6f 6e 2c 20 0a 20 20 20  ataVersion, .   
8290: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d         sqlite3_m
82a0: 70 72 69 6e 74 66 28 22 50 52 41 47 4d 41 20 25  printf("PRAGMA %
82b0: 51 2e 64 61 74 61 5f 76 65 72 73 69 6f 6e 22 2c  Q.data_version",
82c0: 20 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e 7a 44 62   p->pConfig->zDb
82d0: 29 0a 20 20 20 20 20 20 20 20 20 20 29 3b 0a 20  ).          );. 
82e0: 20 20 20 20 20 69 66 28 20 70 2d 3e 72 63 20 29       if( p->rc )
82f0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d   return 0;.    }
8300: 0a 0a 20 20 20 20 69 66 28 20 53 51 4c 49 54 45  ..    if( SQLITE
8310: 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33 5f 73 74  _ROW==sqlite3_st
8320: 65 70 28 70 2d 3e 70 44 61 74 61 56 65 72 73 69  ep(p->pDataVersi
8330: 6f 6e 29 20 29 7b 0a 20 20 20 20 20 20 69 56 65  on) ){.      iVe
8340: 72 73 69 6f 6e 20 3d 20 73 71 6c 69 74 65 33 5f  rsion = sqlite3_
8350: 63 6f 6c 75 6d 6e 5f 69 6e 74 36 34 28 70 2d 3e  column_int64(p->
8360: 70 44 61 74 61 56 65 72 73 69 6f 6e 2c 20 30 29  pDataVersion, 0)
8370: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 72  ;.    }.    p->r
8380: 63 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 73 65  c = sqlite3_rese
8390: 74 28 70 2d 3e 70 44 61 74 61 56 65 72 73 69 6f  t(p->pDataVersio
83a0: 6e 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72  n);.  }..  retur
83b0: 6e 20 69 56 65 72 73 69 6f 6e 3b 0a 7d 0a 0a 2f  n iVersion;.}../
83c0: 2a 0a 2a 2a 20 52 65 61 64 2c 20 64 65 73 65 72  *.** Read, deser
83d0: 69 61 6c 69 7a 65 20 61 6e 64 20 72 65 74 75 72  ialize and retur
83e0: 6e 20 74 68 65 20 73 74 72 75 63 74 75 72 65 20  n the structure 
83f0: 72 65 63 6f 72 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  record..**.** Th
8400: 65 20 46 74 73 35 53 74 72 75 63 74 75 72 65 2e  e Fts5Structure.
8410: 61 4c 65 76 65 6c 5b 5d 20 61 6e 64 20 65 61 63  aLevel[] and eac
8420: 68 20 46 74 73 35 53 74 72 75 63 74 75 72 65 4c  h Fts5StructureL
8430: 65 76 65 6c 2e 61 53 65 67 5b 5d 20 61 72 72 61  evel.aSeg[] arra
8440: 79 0a 2a 2a 20 61 72 65 20 6f 76 65 72 2d 61 6c  y.** are over-al
8450: 6c 6f 63 61 74 65 64 20 61 73 20 64 65 73 63 72  located as descr
8460: 69 62 65 64 20 66 6f 72 20 66 75 6e 63 74 69 6f  ibed for functio
8470: 6e 20 66 74 73 35 53 74 72 75 63 74 75 72 65 44  n fts5StructureD
8480: 65 63 6f 64 65 28 29 20 0a 2a 2a 20 61 62 6f 76  ecode() .** abov
8490: 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65  e..**.** If an e
84a0: 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 4e 55 4c  rror occurs, NUL
84b0: 4c 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e  L is returned an
84c0: 64 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20  d an error code 
84d0: 6c 65 66 74 20 69 6e 20 74 68 65 0a 2a 2a 20 46  left in the.** F
84e0: 74 73 35 49 6e 64 65 78 20 68 61 6e 64 6c 65 2e  ts5Index handle.
84f0: 20 49 66 20 61 6e 20 65 72 72 6f 72 20 68 61 73   If an error has
8500: 20 61 6c 72 65 61 64 79 20 6f 63 63 75 72 72 65   already occurre
8510: 64 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63  d when this func
8520: 74 69 6f 6e 0a 2a 2a 20 69 73 20 63 61 6c 6c 65  tion.** is calle
8530: 64 2c 20 69 74 20 69 73 20 61 20 6e 6f 2d 6f 70  d, it is a no-op
8540: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 46 74 73 35  ..*/.static Fts5
8550: 53 74 72 75 63 74 75 72 65 20 2a 66 74 73 35 53  Structure *fts5S
8560: 74 72 75 63 74 75 72 65 52 65 61 64 28 46 74 73  tructureRead(Fts
8570: 35 49 6e 64 65 78 20 2a 70 29 7b 0a 0a 20 20 69  5Index *p){..  i
8580: 66 28 20 70 2d 3e 70 53 74 72 75 63 74 3d 3d 30  f( p->pStruct==0
8590: 20 29 7b 0a 20 20 20 20 70 2d 3e 69 53 74 72 75   ){.    p->iStru
85a0: 63 74 56 65 72 73 69 6f 6e 20 3d 20 66 74 73 35  ctVersion = fts5
85b0: 49 6e 64 65 78 44 61 74 61 56 65 72 73 69 6f 6e  IndexDataVersion
85c0: 28 70 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e  (p);.    if( p->
85d0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
85e0: 0a 20 20 20 20 20 20 70 2d 3e 70 53 74 72 75 63  .      p->pStruc
85f0: 74 20 3d 20 66 74 73 35 53 74 72 75 63 74 75 72  t = fts5Structur
8600: 65 52 65 61 64 55 6e 63 61 63 68 65 64 28 70 29  eReadUncached(p)
8610: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 23 69 66  ;.    }.  }..#if
8620: 20 30 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20 46   0.  else{.    F
8630: 74 73 35 53 74 72 75 63 74 75 72 65 20 2a 70 54  ts5Structure *pT
8640: 65 73 74 20 3d 20 66 74 73 35 53 74 72 75 63 74  est = fts5Struct
8650: 75 72 65 52 65 61 64 55 6e 63 61 63 68 65 64 28  ureReadUncached(
8660: 70 29 3b 0a 20 20 20 20 69 66 28 20 70 54 65 73  p);.    if( pTes
8670: 74 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  t ){.      int i
8680: 2c 20 6a 3b 0a 20 20 20 20 20 20 61 73 73 65 72  , j;.      asser
8690: 74 5f 6e 63 28 20 70 2d 3e 70 53 74 72 75 63 74  t_nc( p->pStruct
86a0: 2d 3e 6e 53 65 67 6d 65 6e 74 3d 3d 70 54 65 73  ->nSegment==pTes
86b0: 74 2d 3e 6e 53 65 67 6d 65 6e 74 20 29 3b 0a 20  t->nSegment );. 
86c0: 20 20 20 20 20 61 73 73 65 72 74 5f 6e 63 28 20       assert_nc( 
86d0: 70 2d 3e 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76  p->pStruct->nLev
86e0: 65 6c 3d 3d 70 54 65 73 74 2d 3e 6e 4c 65 76 65  el==pTest->nLeve
86f0: 6c 20 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  l );.      for(i
8700: 3d 30 3b 20 69 3c 70 54 65 73 74 2d 3e 6e 4c 65  =0; i<pTest->nLe
8710: 76 65 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  vel; i++){.     
8720: 20 20 20 61 73 73 65 72 74 5f 6e 63 28 20 70 2d     assert_nc( p-
8730: 3e 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c  >pStruct->aLevel
8740: 5b 69 5d 2e 6e 4d 65 72 67 65 3d 3d 70 54 65 73  [i].nMerge==pTes
8750: 74 2d 3e 61 4c 65 76 65 6c 5b 69 5d 2e 6e 4d 65  t->aLevel[i].nMe
8760: 72 67 65 20 29 3b 0a 20 20 20 20 20 20 20 20 61  rge );.        a
8770: 73 73 65 72 74 5f 6e 63 28 20 70 2d 3e 70 53 74  ssert_nc( p->pSt
8780: 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 5d 2e  ruct->aLevel[i].
8790: 6e 53 65 67 3d 3d 70 54 65 73 74 2d 3e 61 4c 65  nSeg==pTest->aLe
87a0: 76 65 6c 5b 69 5d 2e 6e 53 65 67 20 29 3b 0a 20  vel[i].nSeg );. 
87b0: 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20         for(j=0; 
87c0: 6a 3c 70 54 65 73 74 2d 3e 61 4c 65 76 65 6c 5b  j<pTest->aLevel[
87d0: 69 5d 2e 6e 53 65 67 3b 20 6a 2b 2b 29 7b 0a 20  i].nSeg; j++){. 
87e0: 20 20 20 20 20 20 20 20 20 46 74 73 35 53 74 72           Fts5Str
87f0: 75 63 74 75 72 65 53 65 67 6d 65 6e 74 20 2a 70  uctureSegment *p
8800: 31 20 3d 20 26 70 54 65 73 74 2d 3e 61 4c 65 76  1 = &pTest->aLev
8810: 65 6c 5b 69 5d 2e 61 53 65 67 5b 6a 5d 3b 0a 20  el[i].aSeg[j];. 
8820: 20 20 20 20 20 20 20 20 20 46 74 73 35 53 74 72           Fts5Str
8830: 75 63 74 75 72 65 53 65 67 6d 65 6e 74 20 2a 70  uctureSegment *p
8840: 32 20 3d 20 26 70 2d 3e 70 53 74 72 75 63 74 2d  2 = &p->pStruct-
8850: 3e 61 4c 65 76 65 6c 5b 69 5d 2e 61 53 65 67 5b  >aLevel[i].aSeg[
8860: 6a 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73  j];.          as
8870: 73 65 72 74 5f 6e 63 28 20 70 31 2d 3e 69 53 65  sert_nc( p1->iSe
8880: 67 69 64 3d 3d 70 32 2d 3e 69 53 65 67 69 64 20  gid==p2->iSegid 
8890: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  );.          ass
88a0: 65 72 74 5f 6e 63 28 20 70 31 2d 3e 70 67 6e 6f  ert_nc( p1->pgno
88b0: 46 69 72 73 74 3d 3d 70 32 2d 3e 70 67 6e 6f 46  First==p2->pgnoF
88c0: 69 72 73 74 20 29 3b 0a 20 20 20 20 20 20 20 20  irst );.        
88d0: 20 20 61 73 73 65 72 74 5f 6e 63 28 20 70 31 2d    assert_nc( p1-
88e0: 3e 70 67 6e 6f 4c 61 73 74 3d 3d 70 32 2d 3e 70  >pgnoLast==p2->p
88f0: 67 6e 6f 4c 61 73 74 20 29 3b 0a 20 20 20 20 20  gnoLast );.     
8900: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
8910: 20 20 20 66 74 73 35 53 74 72 75 63 74 75 72 65     fts5Structure
8920: 52 65 6c 65 61 73 65 28 70 54 65 73 74 29 3b 0a  Release(pTest);.
8930: 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66      }.  }.#endif
8940: 0a 0a 20 20 69 66 28 20 70 2d 3e 72 63 21 3d 53  ..  if( p->rc!=S
8950: 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72  QLITE_OK ) retur
8960: 6e 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20 70  n 0;.  assert( p
8970: 2d 3e 69 53 74 72 75 63 74 56 65 72 73 69 6f 6e  ->iStructVersion
8980: 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
8990: 20 70 2d 3e 70 53 74 72 75 63 74 21 3d 30 20 29   p->pStruct!=0 )
89a0: 3b 0a 20 20 66 74 73 35 53 74 72 75 63 74 75 72  ;.  fts5Structur
89b0: 65 52 65 66 28 70 2d 3e 70 53 74 72 75 63 74 29  eRef(p->pStruct)
89c0: 3b 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e 70 53  ;.  return p->pS
89d0: 74 72 75 63 74 3b 0a 7d 0a 0a 73 74 61 74 69 63  truct;.}..static
89e0: 20 76 6f 69 64 20 66 74 73 35 53 74 72 75 63 74   void fts5Struct
89f0: 75 72 65 49 6e 76 61 6c 69 64 61 74 65 28 46 74  ureInvalidate(Ft
8a00: 73 35 49 6e 64 65 78 20 2a 70 29 7b 0a 20 20 69  s5Index *p){.  i
8a10: 66 28 20 70 2d 3e 70 53 74 72 75 63 74 20 29 7b  f( p->pStruct ){
8a20: 0a 20 20 20 20 66 74 73 35 53 74 72 75 63 74 75  .    fts5Structu
8a30: 72 65 52 65 6c 65 61 73 65 28 70 2d 3e 70 53 74  reRelease(p->pSt
8a40: 72 75 63 74 29 3b 0a 20 20 20 20 70 2d 3e 70 53  ruct);.    p->pS
8a50: 74 72 75 63 74 20 3d 20 30 3b 0a 20 20 7d 0a 7d  truct = 0;.  }.}
8a60: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
8a70: 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20  he total number 
8a80: 6f 66 20 73 65 67 6d 65 6e 74 73 20 69 6e 20 69  of segments in i
8a90: 6e 64 65 78 20 73 74 72 75 63 74 75 72 65 20 70  ndex structure p
8aa0: 53 74 72 75 63 74 2e 20 54 68 69 73 0a 2a 2a 20  Struct. This.** 
8ab0: 66 75 6e 63 74 69 6f 6e 20 69 73 20 6f 6e 6c 79  function is only
8ac0: 20 65 76 65 72 20 75 73 65 64 20 61 73 20 70 61   ever used as pa
8ad0: 72 74 20 6f 66 20 61 73 73 65 72 74 28 29 20 63  rt of assert() c
8ae0: 6f 6e 64 69 74 69 6f 6e 73 2e 0a 2a 2f 0a 23 69  onditions..*/.#i
8af0: 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
8b00: 47 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73  G.static int fts
8b10: 35 53 74 72 75 63 74 75 72 65 43 6f 75 6e 74 53  5StructureCountS
8b20: 65 67 6d 65 6e 74 73 28 46 74 73 35 53 74 72 75  egments(Fts5Stru
8b30: 63 74 75 72 65 20 2a 70 53 74 72 75 63 74 29 7b  cture *pStruct){
8b40: 0a 20 20 69 6e 74 20 6e 53 65 67 6d 65 6e 74 20  .  int nSegment 
8b50: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
8b60: 20 20 20 2f 2a 20 54 6f 74 61 6c 20 6e 75 6d 62     /* Total numb
8b70: 65 72 20 6f 66 20 73 65 67 6d 65 6e 74 73 20 2a  er of segments *
8b80: 2f 0a 20 20 69 66 28 20 70 53 74 72 75 63 74 20  /.  if( pStruct 
8b90: 29 7b 0a 20 20 20 20 69 6e 74 20 69 4c 76 6c 3b  ){.    int iLvl;
8ba0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8bb0: 20 20 20 20 20 2f 2a 20 55 73 65 64 20 74 6f 20       /* Used to 
8bc0: 69 74 65 72 61 74 65 20 74 68 72 6f 75 67 68 20  iterate through 
8bd0: 6c 65 76 65 6c 73 20 2a 2f 0a 20 20 20 20 66 6f  levels */.    fo
8be0: 72 28 69 4c 76 6c 3d 30 3b 20 69 4c 76 6c 3c 70  r(iLvl=0; iLvl<p
8bf0: 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 3b 20  Struct->nLevel; 
8c00: 69 4c 76 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 6e  iLvl++){.      n
8c10: 53 65 67 6d 65 6e 74 20 2b 3d 20 70 53 74 72 75  Segment += pStru
8c20: 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d  ct->aLevel[iLvl]
8c30: 2e 6e 53 65 67 3b 0a 20 20 20 20 7d 0a 20 20 7d  .nSeg;.    }.  }
8c40: 0a 0a 20 20 72 65 74 75 72 6e 20 6e 53 65 67 6d  ..  return nSegm
8c50: 65 6e 74 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23  ent;.}.#endif..#
8c60: 64 65 66 69 6e 65 20 66 74 73 35 42 75 66 66 65  define fts5Buffe
8c70: 72 53 61 66 65 41 70 70 65 6e 64 42 6c 6f 62 28  rSafeAppendBlob(
8c80: 70 42 75 66 2c 20 70 42 6c 6f 62 2c 20 6e 42 6c  pBuf, pBlob, nBl
8c90: 6f 62 29 20 7b 20 20 20 20 20 5c 0a 20 20 61 73  ob) {     \.  as
8ca0: 73 65 72 74 28 20 28 70 42 75 66 29 2d 3e 6e 53  sert( (pBuf)->nS
8cb0: 70 61 63 65 3e 3d 28 28 70 42 75 66 29 2d 3e 6e  pace>=((pBuf)->n
8cc0: 2b 6e 42 6c 6f 62 29 20 29 3b 20 20 20 20 20 20  +nBlob) );      
8cd0: 20 20 20 20 20 20 20 5c 0a 20 20 6d 65 6d 63 70         \.  memcp
8ce0: 79 28 26 28 70 42 75 66 29 2d 3e 70 5b 28 70 42  y(&(pBuf)->p[(pB
8cf0: 75 66 29 2d 3e 6e 5d 2c 20 70 42 6c 6f 62 2c 20  uf)->n], pBlob, 
8d00: 6e 42 6c 6f 62 29 3b 20 20 20 20 20 20 20 20 20  nBlob);         
8d10: 20 20 20 20 5c 0a 20 20 28 70 42 75 66 29 2d 3e      \.  (pBuf)->
8d20: 6e 20 2b 3d 20 6e 42 6c 6f 62 3b 20 20 20 20 20  n += nBlob;     
8d30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8d40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8d50: 20 5c 0a 7d 0a 0a 23 64 65 66 69 6e 65 20 66 74   \.}..#define ft
8d60: 73 35 42 75 66 66 65 72 53 61 66 65 41 70 70 65  s5BufferSafeAppe
8d70: 6e 64 56 61 72 69 6e 74 28 70 42 75 66 2c 20 69  ndVarint(pBuf, i
8d80: 56 61 6c 29 20 7b 20 20 20 20 20 20 20 20 20 20  Val) {          
8d90: 20 20 20 20 20 20 5c 0a 20 20 28 70 42 75 66 29        \.  (pBuf)
8da0: 2d 3e 6e 20 2b 3d 20 73 71 6c 69 74 65 33 46 74  ->n += sqlite3Ft
8db0: 73 35 50 75 74 56 61 72 69 6e 74 28 26 28 70 42  s5PutVarint(&(pB
8dc0: 75 66 29 2d 3e 70 5b 28 70 42 75 66 29 2d 3e 6e  uf)->p[(pBuf)->n
8dd0: 5d 2c 20 28 69 56 61 6c 29 29 3b 20 20 5c 0a 20  ], (iVal));  \. 
8de0: 20 61 73 73 65 72 74 28 20 28 70 42 75 66 29 2d   assert( (pBuf)-
8df0: 3e 6e 53 70 61 63 65 3e 3d 28 70 42 75 66 29 2d  >nSpace>=(pBuf)-
8e00: 3e 6e 20 29 3b 20 20 20 20 20 20 20 20 20 20 20  >n );           
8e10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
8e20: 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 53 65 72 69 61  .}.../*.** Seria
8e30: 6c 69 7a 65 20 61 6e 64 20 73 74 6f 72 65 20 74  lize and store t
8e40: 68 65 20 22 73 74 72 75 63 74 75 72 65 22 20 72  he "structure" r
8e50: 65 63 6f 72 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ecord..**.** If 
8e60: 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  an error occurs,
8e70: 20 6c 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20   leave an error 
8e80: 63 6f 64 65 20 69 6e 20 74 68 65 20 46 74 73 35  code in the Fts5
8e90: 49 6e 64 65 78 20 6f 62 6a 65 63 74 2e 20 49 66  Index object. If
8ea0: 20 61 6e 0a 2a 2a 20 65 72 72 6f 72 20 68 61 73   an.** error has
8eb0: 20 61 6c 72 65 61 64 79 20 6f 63 63 75 72 72 65   already occurre
8ec0: 64 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  d, this function
8ed0: 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a   is a no-op..*/.
8ee0: 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
8ef0: 53 74 72 75 63 74 75 72 65 57 72 69 74 65 28 46  StructureWrite(F
8f00: 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 46 74 73  ts5Index *p, Fts
8f10: 35 53 74 72 75 63 74 75 72 65 20 2a 70 53 74 72  5Structure *pStr
8f20: 75 63 74 29 7b 0a 20 20 69 66 28 20 70 2d 3e 72  uct){.  if( p->r
8f30: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
8f40: 20 20 20 20 46 74 73 35 42 75 66 66 65 72 20 62      Fts5Buffer b
8f50: 75 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  uf;             
8f60: 20 20 2f 2a 20 42 75 66 66 65 72 20 74 6f 20 73    /* Buffer to s
8f70: 65 72 69 61 6c 69 7a 65 20 72 65 63 6f 72 64 20  erialize record 
8f80: 69 6e 74 6f 20 2a 2f 0a 20 20 20 20 69 6e 74 20  into */.    int 
8f90: 69 4c 76 6c 3b 20 20 20 20 20 20 20 20 20 20 20  iLvl;           
8fa0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65            /* Use
8fb0: 64 20 74 6f 20 69 74 65 72 61 74 65 20 74 68 72  d to iterate thr
8fc0: 6f 75 67 68 20 6c 65 76 65 6c 73 20 2a 2f 0a 20  ough levels */. 
8fd0: 20 20 20 69 6e 74 20 69 43 6f 6f 6b 69 65 3b 20     int iCookie; 
8fe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8ff0: 20 2f 2a 20 43 6f 6f 6b 69 65 20 76 61 6c 75 65   /* Cookie value
9000: 20 74 6f 20 73 74 6f 72 65 20 2a 2f 0a 0a 20 20   to store */..  
9010: 20 20 61 73 73 65 72 74 28 20 70 53 74 72 75 63    assert( pStruc
9020: 74 2d 3e 6e 53 65 67 6d 65 6e 74 3d 3d 66 74 73  t->nSegment==fts
9030: 35 53 74 72 75 63 74 75 72 65 43 6f 75 6e 74 53  5StructureCountS
9040: 65 67 6d 65 6e 74 73 28 70 53 74 72 75 63 74 29  egments(pStruct)
9050: 20 29 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 26   );.    memset(&
9060: 62 75 66 2c 20 30 2c 20 73 69 7a 65 6f 66 28 46  buf, 0, sizeof(F
9070: 74 73 35 42 75 66 66 65 72 29 29 3b 0a 0a 20 20  ts5Buffer));..  
9080: 20 20 2f 2a 20 41 70 70 65 6e 64 20 74 68 65 20    /* Append the 
9090: 63 75 72 72 65 6e 74 20 63 6f 6e 66 69 67 75 72  current configur
90a0: 61 74 69 6f 6e 20 63 6f 6f 6b 69 65 20 2a 2f 0a  ation cookie */.
90b0: 20 20 20 20 69 43 6f 6f 6b 69 65 20 3d 20 70 2d      iCookie = p-
90c0: 3e 70 43 6f 6e 66 69 67 2d 3e 69 43 6f 6f 6b 69  >pConfig->iCooki
90d0: 65 3b 0a 20 20 20 20 69 66 28 20 69 43 6f 6f 6b  e;.    if( iCook
90e0: 69 65 3c 30 20 29 20 69 43 6f 6f 6b 69 65 20 3d  ie<0 ) iCookie =
90f0: 20 30 3b 0a 0a 20 20 20 20 69 66 28 20 30 3d 3d   0;..    if( 0==
9100: 73 71 6c 69 74 65 33 46 74 73 35 42 75 66 66 65  sqlite3Fts5Buffe
9110: 72 53 69 7a 65 28 26 70 2d 3e 72 63 2c 20 26 62  rSize(&p->rc, &b
9120: 75 66 2c 20 34 2b 39 2b 39 2b 39 29 20 29 7b 0a  uf, 4+9+9+9) ){.
9130: 20 20 20 20 20 20 73 71 6c 69 74 65 33 46 74 73        sqlite3Fts
9140: 35 50 75 74 33 32 28 62 75 66 2e 70 2c 20 69 43  5Put32(buf.p, iC
9150: 6f 6f 6b 69 65 29 3b 0a 20 20 20 20 20 20 62 75  ookie);.      bu
9160: 66 2e 6e 20 3d 20 34 3b 0a 20 20 20 20 20 20 66  f.n = 4;.      f
9170: 74 73 35 42 75 66 66 65 72 53 61 66 65 41 70 70  ts5BufferSafeApp
9180: 65 6e 64 56 61 72 69 6e 74 28 26 62 75 66 2c 20  endVarint(&buf, 
9190: 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 29  pStruct->nLevel)
91a0: 3b 0a 20 20 20 20 20 20 66 74 73 35 42 75 66 66  ;.      fts5Buff
91b0: 65 72 53 61 66 65 41 70 70 65 6e 64 56 61 72 69  erSafeAppendVari
91c0: 6e 74 28 26 62 75 66 2c 20 70 53 74 72 75 63 74  nt(&buf, pStruct
91d0: 2d 3e 6e 53 65 67 6d 65 6e 74 29 3b 0a 20 20 20  ->nSegment);.   
91e0: 20 20 20 66 74 73 35 42 75 66 66 65 72 53 61 66     fts5BufferSaf
91f0: 65 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26 62  eAppendVarint(&b
9200: 75 66 2c 20 28 69 36 34 29 70 53 74 72 75 63 74  uf, (i64)pStruct
9210: 2d 3e 6e 57 72 69 74 65 43 6f 75 6e 74 65 72 29  ->nWriteCounter)
9220: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 66 6f 72  ;.    }..    for
9230: 28 69 4c 76 6c 3d 30 3b 20 69 4c 76 6c 3c 70 53  (iLvl=0; iLvl<pS
9240: 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 3b 20 69  truct->nLevel; i
9250: 4c 76 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e  Lvl++){.      in
9260: 74 20 69 53 65 67 3b 20 20 20 20 20 20 20 20 20  t iSeg;         
9270: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55              /* U
9280: 73 65 64 20 74 6f 20 69 74 65 72 61 74 65 20 74  sed to iterate t
9290: 68 72 6f 75 67 68 20 73 65 67 6d 65 6e 74 73 20  hrough segments 
92a0: 2a 2f 0a 20 20 20 20 20 20 46 74 73 35 53 74 72  */.      Fts5Str
92b0: 75 63 74 75 72 65 4c 65 76 65 6c 20 2a 70 4c 76  uctureLevel *pLv
92c0: 6c 20 3d 20 26 70 53 74 72 75 63 74 2d 3e 61 4c  l = &pStruct->aL
92d0: 65 76 65 6c 5b 69 4c 76 6c 5d 3b 0a 20 20 20 20  evel[iLvl];.    
92e0: 20 20 66 74 73 35 42 75 66 66 65 72 41 70 70 65    fts5BufferAppe
92f0: 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c  ndVarint(&p->rc,
9300: 20 26 62 75 66 2c 20 70 4c 76 6c 2d 3e 6e 4d 65   &buf, pLvl->nMe
9310: 72 67 65 29 3b 0a 20 20 20 20 20 20 66 74 73 35  rge);.      fts5
9320: 42 75 66 66 65 72 41 70 70 65 6e 64 56 61 72 69  BufferAppendVari
9330: 6e 74 28 26 70 2d 3e 72 63 2c 20 26 62 75 66 2c  nt(&p->rc, &buf,
9340: 20 70 4c 76 6c 2d 3e 6e 53 65 67 29 3b 0a 20 20   pLvl->nSeg);.  
9350: 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 76 6c      assert( pLvl
9360: 2d 3e 6e 4d 65 72 67 65 3c 3d 70 4c 76 6c 2d 3e  ->nMerge<=pLvl->
9370: 6e 53 65 67 20 29 3b 0a 0a 20 20 20 20 20 20 66  nSeg );..      f
9380: 6f 72 28 69 53 65 67 3d 30 3b 20 69 53 65 67 3c  or(iSeg=0; iSeg<
9390: 70 4c 76 6c 2d 3e 6e 53 65 67 3b 20 69 53 65 67  pLvl->nSeg; iSeg
93a0: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 66 74 73  ++){.        fts
93b0: 35 42 75 66 66 65 72 41 70 70 65 6e 64 56 61 72  5BufferAppendVar
93c0: 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26 62 75 66  int(&p->rc, &buf
93d0: 2c 20 70 4c 76 6c 2d 3e 61 53 65 67 5b 69 53 65  , pLvl->aSeg[iSe
93e0: 67 5d 2e 69 53 65 67 69 64 29 3b 0a 20 20 20 20  g].iSegid);.    
93f0: 20 20 20 20 66 74 73 35 42 75 66 66 65 72 41 70      fts5BufferAp
9400: 70 65 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e 72  pendVarint(&p->r
9410: 63 2c 20 26 62 75 66 2c 20 70 4c 76 6c 2d 3e 61  c, &buf, pLvl->a
9420: 53 65 67 5b 69 53 65 67 5d 2e 70 67 6e 6f 46 69  Seg[iSeg].pgnoFi
9430: 72 73 74 29 3b 0a 20 20 20 20 20 20 20 20 66 74  rst);.        ft
9440: 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 56 61  s5BufferAppendVa
9450: 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26 62 75  rint(&p->rc, &bu
9460: 66 2c 20 70 4c 76 6c 2d 3e 61 53 65 67 5b 69 53  f, pLvl->aSeg[iS
9470: 65 67 5d 2e 70 67 6e 6f 4c 61 73 74 29 3b 0a 20  eg].pgnoLast);. 
9480: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
9490: 20 20 66 74 73 35 44 61 74 61 57 72 69 74 65 28    fts5DataWrite(
94a0: 70 2c 20 46 54 53 35 5f 53 54 52 55 43 54 55 52  p, FTS5_STRUCTUR
94b0: 45 5f 52 4f 57 49 44 2c 20 62 75 66 2e 70 2c 20  E_ROWID, buf.p, 
94c0: 62 75 66 2e 6e 29 3b 0a 20 20 20 20 66 74 73 35  buf.n);.    fts5
94d0: 42 75 66 66 65 72 46 72 65 65 28 26 62 75 66 29  BufferFree(&buf)
94e0: 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 20 30 0a 73  ;.  }.}..#if 0.s
94f0: 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 44  tatic void fts5D
9500: 65 62 75 67 53 74 72 75 63 74 75 72 65 28 69 6e  ebugStructure(in
9510: 74 2a 2c 46 74 73 35 42 75 66 66 65 72 2a 2c 46  t*,Fts5Buffer*,F
9520: 74 73 35 53 74 72 75 63 74 75 72 65 2a 29 3b 0a  ts5Structure*);.
9530: 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
9540: 50 72 69 6e 74 53 74 72 75 63 74 75 72 65 28 63  PrintStructure(c
9550: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 61 70 74  onst char *zCapt
9560: 69 6f 6e 2c 20 46 74 73 35 53 74 72 75 63 74 75  ion, Fts5Structu
9570: 72 65 20 2a 70 53 74 72 75 63 74 29 7b 0a 20 20  re *pStruct){.  
9580: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
9590: 4f 4b 3b 0a 20 20 46 74 73 35 42 75 66 66 65 72  OK;.  Fts5Buffer
95a0: 20 62 75 66 3b 0a 20 20 6d 65 6d 73 65 74 28 26   buf;.  memset(&
95b0: 62 75 66 2c 20 30 2c 20 73 69 7a 65 6f 66 28 62  buf, 0, sizeof(b
95c0: 75 66 29 29 3b 0a 20 20 66 74 73 35 44 65 62 75  uf));.  fts5Debu
95d0: 67 53 74 72 75 63 74 75 72 65 28 26 72 63 2c 20  gStructure(&rc, 
95e0: 26 62 75 66 2c 20 70 53 74 72 75 63 74 29 3b 0a  &buf, pStruct);.
95f0: 20 20 66 70 72 69 6e 74 66 28 73 74 64 6f 75 74    fprintf(stdout
9600: 2c 20 22 25 73 3a 20 25 73 5c 6e 22 2c 20 7a 43  , "%s: %s\n", zC
9610: 61 70 74 69 6f 6e 2c 20 62 75 66 2e 70 29 3b 0a  aption, buf.p);.
9620: 20 20 66 66 6c 75 73 68 28 73 74 64 6f 75 74 29    fflush(stdout)
9630: 3b 0a 20 20 66 74 73 35 42 75 66 66 65 72 46 72  ;.  fts5BufferFr
9640: 65 65 28 26 62 75 66 29 3b 0a 7d 0a 23 65 6c 73  ee(&buf);.}.#els
9650: 65 0a 23 20 64 65 66 69 6e 65 20 66 74 73 35 50  e.# define fts5P
9660: 72 69 6e 74 53 74 72 75 63 74 75 72 65 28 78 2c  rintStructure(x,
9670: 79 29 0a 23 65 6e 64 69 66 0a 0a 73 74 61 74 69  y).#endif..stati
9680: 63 20 69 6e 74 20 66 74 73 35 53 65 67 6d 65 6e  c int fts5Segmen
9690: 74 53 69 7a 65 28 46 74 73 35 53 74 72 75 63 74  tSize(Fts5Struct
96a0: 75 72 65 53 65 67 6d 65 6e 74 20 2a 70 53 65 67  ureSegment *pSeg
96b0: 29 7b 0a 20 20 72 65 74 75 72 6e 20 31 20 2b 20  ){.  return 1 + 
96c0: 70 53 65 67 2d 3e 70 67 6e 6f 4c 61 73 74 20 2d  pSeg->pgnoLast -
96d0: 20 70 53 65 67 2d 3e 70 67 6e 6f 46 69 72 73 74   pSeg->pgnoFirst
96e0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
96f0: 6e 20 61 20 63 6f 70 79 20 6f 66 20 69 6e 64 65  n a copy of inde
9700: 78 20 73 74 72 75 63 74 75 72 65 20 70 53 74 72  x structure pStr
9710: 75 63 74 2e 20 45 78 63 65 70 74 2c 20 70 72 6f  uct. Except, pro
9720: 6d 6f 74 65 20 61 73 20 6d 61 6e 79 20 0a 2a 2a  mote as many .**
9730: 20 73 65 67 6d 65 6e 74 73 20 61 73 20 70 6f 73   segments as pos
9740: 73 69 62 6c 65 20 74 6f 20 6c 65 76 65 6c 20 69  sible to level i
9750: 50 72 6f 6d 6f 74 65 2e 20 49 66 20 61 6e 20 4f  Promote. If an O
9760: 4f 4d 20 6f 63 63 75 72 73 2c 20 4e 55 4c 4c 20  OM occurs, NULL 
9770: 69 73 20 0a 2a 2a 20 72 65 74 75 72 6e 65 64 2e  is .** returned.
9780: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
9790: 66 74 73 35 53 74 72 75 63 74 75 72 65 50 72 6f  fts5StructurePro
97a0: 6d 6f 74 65 54 6f 28 0a 20 20 46 74 73 35 49 6e  moteTo(.  Fts5In
97b0: 64 65 78 20 2a 70 2c 0a 20 20 69 6e 74 20 69 50  dex *p,.  int iP
97c0: 72 6f 6d 6f 74 65 2c 0a 20 20 69 6e 74 20 73 7a  romote,.  int sz
97d0: 50 72 6f 6d 6f 74 65 2c 0a 20 20 46 74 73 35 53  Promote,.  Fts5S
97e0: 74 72 75 63 74 75 72 65 20 2a 70 53 74 72 75 63  tructure *pStruc
97f0: 74 0a 29 7b 0a 20 20 69 6e 74 20 69 6c 2c 20 69  t.){.  int il, i
9800: 73 3b 0a 20 20 46 74 73 35 53 74 72 75 63 74 75  s;.  Fts5Structu
9810: 72 65 4c 65 76 65 6c 20 2a 70 4f 75 74 20 3d 20  reLevel *pOut = 
9820: 26 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c  &pStruct->aLevel
9830: 5b 69 50 72 6f 6d 6f 74 65 5d 3b 0a 0a 20 20 69  [iPromote];..  i
9840: 66 28 20 70 4f 75 74 2d 3e 6e 4d 65 72 67 65 3d  f( pOut->nMerge=
9850: 3d 30 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 6c  =0 ){.    for(il
9860: 3d 69 50 72 6f 6d 6f 74 65 2b 31 3b 20 69 6c 3c  =iPromote+1; il<
9870: 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 3b  pStruct->nLevel;
9880: 20 69 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 46 74   il++){.      Ft
9890: 73 35 53 74 72 75 63 74 75 72 65 4c 65 76 65 6c  s5StructureLevel
98a0: 20 2a 70 4c 76 6c 20 3d 20 26 70 53 74 72 75 63   *pLvl = &pStruc
98b0: 74 2d 3e 61 4c 65 76 65 6c 5b 69 6c 5d 3b 0a 20  t->aLevel[il];. 
98c0: 20 20 20 20 20 69 66 28 20 70 4c 76 6c 2d 3e 6e       if( pLvl->n
98d0: 4d 65 72 67 65 20 29 20 72 65 74 75 72 6e 3b 0a  Merge ) return;.
98e0: 20 20 20 20 20 20 66 6f 72 28 69 73 3d 70 4c 76        for(is=pLv
98f0: 6c 2d 3e 6e 53 65 67 2d 31 3b 20 69 73 3e 3d 30  l->nSeg-1; is>=0
9900: 3b 20 69 73 2d 2d 29 7b 0a 20 20 20 20 20 20 20  ; is--){.       
9910: 20 69 6e 74 20 73 7a 20 3d 20 66 74 73 35 53 65   int sz = fts5Se
9920: 67 6d 65 6e 74 53 69 7a 65 28 26 70 4c 76 6c 2d  gmentSize(&pLvl-
9930: 3e 61 53 65 67 5b 69 73 5d 29 3b 0a 20 20 20 20  >aSeg[is]);.    
9940: 20 20 20 20 69 66 28 20 73 7a 3e 73 7a 50 72 6f      if( sz>szPro
9950: 6d 6f 74 65 20 29 20 72 65 74 75 72 6e 3b 0a 20  mote ) return;. 
9960: 20 20 20 20 20 20 20 66 74 73 35 53 74 72 75 63         fts5Struc
9970: 74 75 72 65 45 78 74 65 6e 64 4c 65 76 65 6c 28  tureExtendLevel(
9980: 26 70 2d 3e 72 63 2c 20 70 53 74 72 75 63 74 2c  &p->rc, pStruct,
9990: 20 69 50 72 6f 6d 6f 74 65 2c 20 31 2c 20 31 29   iPromote, 1, 1)
99a0: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 2d  ;.        if( p-
99b0: 3e 72 63 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  >rc ) return;.  
99c0: 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 4f 75        memcpy(pOu
99d0: 74 2d 3e 61 53 65 67 2c 20 26 70 4c 76 6c 2d 3e  t->aSeg, &pLvl->
99e0: 61 53 65 67 5b 69 73 5d 2c 20 73 69 7a 65 6f 66  aSeg[is], sizeof
99f0: 28 46 74 73 35 53 74 72 75 63 74 75 72 65 53 65  (Fts5StructureSe
9a00: 67 6d 65 6e 74 29 29 3b 0a 20 20 20 20 20 20 20  gment));.       
9a10: 20 70 4f 75 74 2d 3e 6e 53 65 67 2b 2b 3b 0a 20   pOut->nSeg++;. 
9a20: 20 20 20 20 20 20 20 70 4c 76 6c 2d 3e 6e 53 65         pLvl->nSe
9a30: 67 2d 2d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  g--;.      }.   
9a40: 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
9a50: 41 20 6e 65 77 20 73 65 67 6d 65 6e 74 20 68 61  A new segment ha
9a60: 73 20 6a 75 73 74 20 62 65 65 6e 20 77 72 69 74  s just been writ
9a70: 74 65 6e 20 74 6f 20 6c 65 76 65 6c 20 69 4c 76  ten to level iLv
9a80: 6c 20 6f 66 20 69 6e 64 65 78 20 73 74 72 75 63  l of index struc
9a90: 74 75 72 65 0a 2a 2a 20 70 53 74 72 75 63 74 2e  ture.** pStruct.
9aa0: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 64   This function d
9ab0: 65 74 65 72 6d 69 6e 65 73 20 69 66 20 61 6e 79  etermines if any
9ac0: 20 73 65 67 6d 65 6e 74 73 20 73 68 6f 75 6c 64   segments should
9ad0: 20 62 65 20 70 72 6f 6d 6f 74 65 64 0a 2a 2a 20   be promoted.** 
9ae0: 61 73 20 61 20 72 65 73 75 6c 74 2e 20 53 65 67  as a result. Seg
9af0: 6d 65 6e 74 73 20 61 72 65 20 70 72 6f 6d 6f 74  ments are promot
9b00: 65 64 20 69 6e 20 74 77 6f 20 73 63 65 6e 61 72  ed in two scenar
9b10: 69 6f 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 61 29 20  ios:.**.**   a) 
9b20: 49 66 20 74 68 65 20 73 65 67 6d 65 6e 74 20 6a  If the segment j
9b30: 75 73 74 20 77 72 69 74 74 65 6e 20 69 73 20 73  ust written is s
9b40: 6d 61 6c 6c 65 72 20 74 68 61 6e 20 6f 6e 65 20  maller than one 
9b50: 6f 72 20 6d 6f 72 65 20 73 65 67 6d 65 6e 74 73  or more segments
9b60: 0a 2a 2a 20 20 20 20 20 20 77 69 74 68 69 6e 20  .**      within 
9b70: 74 68 65 20 70 72 65 76 69 6f 75 73 20 70 6f 70  the previous pop
9b80: 75 6c 61 74 65 64 20 6c 65 76 65 6c 2c 20 69 74  ulated level, it
9b90: 20 69 73 20 70 72 6f 6d 6f 74 65 64 20 74 6f 20   is promoted to 
9ba0: 74 68 65 20 70 72 65 76 69 6f 75 73 0a 2a 2a 20  the previous.** 
9bb0: 20 20 20 20 20 70 6f 70 75 6c 61 74 65 64 20 6c       populated l
9bc0: 65 76 65 6c 2e 0a 2a 2a 0a 2a 2a 20 20 20 62 29  evel..**.**   b)
9bd0: 20 49 66 20 74 68 65 20 73 65 67 6d 65 6e 74 20   If the segment 
9be0: 6a 75 73 74 20 77 72 69 74 74 65 6e 20 69 73 20  just written is 
9bf0: 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68 65 20  larger than the 
9c00: 6e 65 77 65 73 74 20 73 65 67 6d 65 6e 74 20 6f  newest segment o
9c10: 6e 0a 2a 2a 20 20 20 20 20 20 74 68 65 20 6e 65  n.**      the ne
9c20: 78 74 20 70 6f 70 75 6c 61 74 65 64 20 6c 65 76  xt populated lev
9c30: 65 6c 2c 20 74 68 65 6e 20 74 68 61 74 20 73 65  el, then that se
9c40: 67 6d 65 6e 74 2c 20 61 6e 64 20 61 6e 79 20 6f  gment, and any o
9c50: 74 68 65 72 20 61 64 6a 61 63 65 6e 74 0a 2a 2a  ther adjacent.**
9c60: 20 20 20 20 20 20 73 65 67 6d 65 6e 74 73 20 74        segments t
9c70: 68 61 74 20 61 72 65 20 61 6c 73 6f 20 73 6d 61  hat are also sma
9c80: 6c 6c 65 72 20 74 68 61 6e 20 74 68 65 20 6f 6e  ller than the on
9c90: 65 20 6a 75 73 74 20 77 72 69 74 74 65 6e 2c 20  e just written, 
9ca0: 61 72 65 20 0a 2a 2a 20 20 20 20 20 20 70 72 6f  are .**      pro
9cb0: 6d 6f 74 65 64 2e 20 0a 2a 2a 0a 2a 2a 20 49 66  moted. .**.** If
9cc0: 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 73 65 67   one or more seg
9cd0: 6d 65 6e 74 73 20 61 72 65 20 70 72 6f 6d 6f 74  ments are promot
9ce0: 65 64 2c 20 74 68 65 20 73 74 72 75 63 74 75 72  ed, the structur
9cf0: 65 20 6f 62 6a 65 63 74 20 69 73 20 75 70 64 61  e object is upda
9d00: 74 65 64 0a 2a 2a 20 74 6f 20 72 65 66 6c 65 63  ted.** to reflec
9d10: 74 20 74 68 69 73 2e 0a 2a 2f 0a 73 74 61 74 69  t this..*/.stati
9d20: 63 20 76 6f 69 64 20 66 74 73 35 53 74 72 75 63  c void fts5Struc
9d30: 74 75 72 65 50 72 6f 6d 6f 74 65 28 0a 20 20 46  turePromote(.  F
9d40: 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20  ts5Index *p,    
9d50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
9d60: 2a 20 46 54 53 35 20 62 61 63 6b 65 6e 64 20 6f  * FTS5 backend o
9d70: 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20 69  bject */.  int i
9d80: 4c 76 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20  Lvl,            
9d90: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
9da0: 64 65 78 20 6c 65 76 65 6c 20 6a 75 73 74 20 75  dex level just u
9db0: 70 64 61 74 65 64 20 2a 2f 0a 20 20 46 74 73 35  pdated */.  Fts5
9dc0: 53 74 72 75 63 74 75 72 65 20 2a 70 53 74 72 75  Structure *pStru
9dd0: 63 74 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49  ct          /* I
9de0: 6e 64 65 78 20 73 74 72 75 63 74 75 72 65 20 2a  ndex structure *
9df0: 2f 0a 29 7b 0a 20 20 69 66 28 20 70 2d 3e 72 63  /.){.  if( p->rc
9e00: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
9e10: 20 20 20 69 6e 74 20 69 54 73 74 3b 0a 20 20 20     int iTst;.   
9e20: 20 69 6e 74 20 69 50 72 6f 6d 6f 74 65 20 3d 20   int iPromote = 
9e30: 2d 31 3b 0a 20 20 20 20 69 6e 74 20 73 7a 50 72  -1;.    int szPr
9e40: 6f 6d 6f 74 65 20 3d 20 30 3b 20 20 20 20 20 20  omote = 0;      
9e50: 20 20 20 20 20 20 2f 2a 20 50 72 6f 6d 6f 74 65        /* Promote
9e60: 20 61 6e 79 74 68 69 6e 67 20 74 68 69 73 20 73   anything this s
9e70: 69 7a 65 20 6f 72 20 73 6d 61 6c 6c 65 72 20 2a  ize or smaller *
9e80: 2f 0a 20 20 20 20 46 74 73 35 53 74 72 75 63 74  /.    Fts5Struct
9e90: 75 72 65 53 65 67 6d 65 6e 74 20 2a 70 53 65 67  ureSegment *pSeg
9ea0: 3b 20 20 20 2f 2a 20 53 65 67 6d 65 6e 74 20 6a  ;   /* Segment j
9eb0: 75 73 74 20 77 72 69 74 74 65 6e 20 2a 2f 0a 20  ust written */. 
9ec0: 20 20 20 69 6e 74 20 73 7a 53 65 67 3b 20 20 20     int szSeg;   
9ed0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9ee0: 20 2f 2a 20 53 69 7a 65 20 6f 66 20 73 65 67 6d   /* Size of segm
9ef0: 65 6e 74 20 6a 75 73 74 20 77 72 69 74 74 65 6e  ent just written
9f00: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 53 65 67   */.    int nSeg
9f10: 20 3d 20 70 53 74 72 75 63 74 2d 3e 61 4c 65 76   = pStruct->aLev
9f20: 65 6c 5b 69 4c 76 6c 5d 2e 6e 53 65 67 3b 0a 0a  el[iLvl].nSeg;..
9f30: 20 20 20 20 69 66 28 20 6e 53 65 67 3d 3d 30 20      if( nSeg==0 
9f40: 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 70 53  ) return;.    pS
9f50: 65 67 20 3d 20 26 70 53 74 72 75 63 74 2d 3e 61  eg = &pStruct->a
9f60: 4c 65 76 65 6c 5b 69 4c 76 6c 5d 2e 61 53 65 67  Level[iLvl].aSeg
9f70: 5b 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c  [pStruct->aLevel
9f80: 5b 69 4c 76 6c 5d 2e 6e 53 65 67 2d 31 5d 3b 0a  [iLvl].nSeg-1];.
9f90: 20 20 20 20 73 7a 53 65 67 20 3d 20 28 31 20 2b      szSeg = (1 +
9fa0: 20 70 53 65 67 2d 3e 70 67 6e 6f 4c 61 73 74 20   pSeg->pgnoLast 
9fb0: 2d 20 70 53 65 67 2d 3e 70 67 6e 6f 46 69 72 73  - pSeg->pgnoFirs
9fc0: 74 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63  t);..    /* Chec
9fd0: 6b 20 66 6f 72 20 63 6f 6e 64 69 74 69 6f 6e 20  k for condition 
9fe0: 28 61 29 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69  (a) */.    for(i
9ff0: 54 73 74 3d 69 4c 76 6c 2d 31 3b 20 69 54 73 74  Tst=iLvl-1; iTst
a000: 3e 3d 30 20 26 26 20 70 53 74 72 75 63 74 2d 3e  >=0 && pStruct->
a010: 61 4c 65 76 65 6c 5b 69 54 73 74 5d 2e 6e 53 65  aLevel[iTst].nSe
a020: 67 3d 3d 30 3b 20 69 54 73 74 2d 2d 29 3b 0a 20  g==0; iTst--);. 
a030: 20 20 20 69 66 28 20 69 54 73 74 3e 3d 30 20 29     if( iTst>=0 )
a040: 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20  {.      int i;. 
a050: 20 20 20 20 20 69 6e 74 20 73 7a 4d 61 78 20 3d       int szMax =
a060: 20 30 3b 0a 20 20 20 20 20 20 46 74 73 35 53 74   0;.      Fts5St
a070: 72 75 63 74 75 72 65 4c 65 76 65 6c 20 2a 70 54  ructureLevel *pT
a080: 73 74 20 3d 20 26 70 53 74 72 75 63 74 2d 3e 61  st = &pStruct->a
a090: 4c 65 76 65 6c 5b 69 54 73 74 5d 3b 0a 20 20 20  Level[iTst];.   
a0a0: 20 20 20 61 73 73 65 72 74 28 20 70 54 73 74 2d     assert( pTst-
a0b0: 3e 6e 4d 65 72 67 65 3d 3d 30 20 29 3b 0a 20 20  >nMerge==0 );.  
a0c0: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
a0d0: 54 73 74 2d 3e 6e 53 65 67 3b 20 69 2b 2b 29 7b  Tst->nSeg; i++){
a0e0: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 73 7a 20  .        int sz 
a0f0: 3d 20 70 54 73 74 2d 3e 61 53 65 67 5b 69 5d 2e  = pTst->aSeg[i].
a100: 70 67 6e 6f 4c 61 73 74 20 2d 20 70 54 73 74 2d  pgnoLast - pTst-
a110: 3e 61 53 65 67 5b 69 5d 2e 70 67 6e 6f 46 69 72  >aSeg[i].pgnoFir
a120: 73 74 20 2b 20 31 3b 0a 20 20 20 20 20 20 20 20  st + 1;.        
a130: 69 66 28 20 73 7a 3e 73 7a 4d 61 78 20 29 20 73  if( sz>szMax ) s
a140: 7a 4d 61 78 20 3d 20 73 7a 3b 0a 20 20 20 20 20  zMax = sz;.     
a150: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 73 7a 4d   }.      if( szM
a160: 61 78 3e 3d 73 7a 53 65 67 20 29 7b 0a 20 20 20  ax>=szSeg ){.   
a170: 20 20 20 20 20 2f 2a 20 43 6f 6e 64 69 74 69 6f       /* Conditio
a180: 6e 20 28 61 29 20 69 73 20 74 72 75 65 2e 20 50  n (a) is true. P
a190: 72 6f 6d 6f 74 65 20 74 68 65 20 6e 65 77 65 73  romote the newes
a1a0: 74 20 73 65 67 6d 65 6e 74 20 6f 6e 20 6c 65 76  t segment on lev
a1b0: 65 6c 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 69  el .        ** i
a1c0: 4c 76 6c 20 74 6f 20 6c 65 76 65 6c 20 69 54 73  Lvl to level iTs
a1d0: 74 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69  t.  */.        i
a1e0: 50 72 6f 6d 6f 74 65 20 3d 20 69 54 73 74 3b 0a  Promote = iTst;.
a1f0: 20 20 20 20 20 20 20 20 73 7a 50 72 6f 6d 6f 74          szPromot
a200: 65 20 3d 20 73 7a 4d 61 78 3b 0a 20 20 20 20 20  e = szMax;.     
a210: 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a   }.    }..    /*
a220: 20 49 66 20 63 6f 6e 64 69 74 69 6f 6e 20 28 61   If condition (a
a230: 29 20 69 73 20 6e 6f 74 20 6d 65 74 2c 20 61 73  ) is not met, as
a240: 73 75 6d 65 20 28 62 29 20 69 73 20 74 72 75 65  sume (b) is true
a250: 2e 20 53 74 72 75 63 74 75 72 65 50 72 6f 6d 6f  . StructurePromo
a260: 74 65 54 6f 28 29 0a 20 20 20 20 2a 2a 20 69 73  teTo().    ** is
a270: 20 61 20 6e 6f 2d 6f 70 20 69 66 20 69 74 20 69   a no-op if it i
a280: 73 20 6e 6f 74 2e 20 20 2a 2f 0a 20 20 20 20 69  s not.  */.    i
a290: 66 28 20 69 50 72 6f 6d 6f 74 65 3c 30 20 29 7b  f( iPromote<0 ){
a2a0: 0a 20 20 20 20 20 20 69 50 72 6f 6d 6f 74 65 20  .      iPromote 
a2b0: 3d 20 69 4c 76 6c 3b 0a 20 20 20 20 20 20 73 7a  = iLvl;.      sz
a2c0: 50 72 6f 6d 6f 74 65 20 3d 20 73 7a 53 65 67 3b  Promote = szSeg;
a2d0: 0a 20 20 20 20 7d 0a 20 20 20 20 66 74 73 35 53  .    }.    fts5S
a2e0: 74 72 75 63 74 75 72 65 50 72 6f 6d 6f 74 65 54  tructurePromoteT
a2f0: 6f 28 70 2c 20 69 50 72 6f 6d 6f 74 65 2c 20 73  o(p, iPromote, s
a300: 7a 50 72 6f 6d 6f 74 65 2c 20 70 53 74 72 75 63  zPromote, pStruc
a310: 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a  t);.  }.}.../*.*
a320: 2a 20 41 64 76 61 6e 63 65 20 74 68 65 20 69 74  * Advance the it
a330: 65 72 61 74 6f 72 20 70 61 73 73 65 64 20 61 73  erator passed as
a340: 20 74 68 65 20 6f 6e 6c 79 20 61 72 67 75 6d 65   the only argume
a350: 6e 74 2e 20 49 66 20 74 68 65 20 65 6e 64 20 6f  nt. If the end o
a360: 66 20 74 68 65 20 0a 2a 2a 20 64 6f 63 6c 69 73  f the .** doclis
a370: 74 2d 69 6e 64 65 78 20 70 61 67 65 20 69 73 20  t-index page is 
a380: 72 65 61 63 68 65 64 2c 20 72 65 74 75 72 6e 20  reached, return 
a390: 6e 6f 6e 2d 7a 65 72 6f 2e 0a 2a 2f 0a 73 74 61  non-zero..*/.sta
a3a0: 74 69 63 20 69 6e 74 20 66 74 73 35 44 6c 69 64  tic int fts5Dlid
a3b0: 78 4c 76 6c 4e 65 78 74 28 46 74 73 35 44 6c 69  xLvlNext(Fts5Dli
a3c0: 64 78 4c 76 6c 20 2a 70 4c 76 6c 29 7b 0a 20 20  dxLvl *pLvl){.  
a3d0: 46 74 73 35 44 61 74 61 20 2a 70 44 61 74 61 20  Fts5Data *pData 
a3e0: 3d 20 70 4c 76 6c 2d 3e 70 44 61 74 61 3b 0a 0a  = pLvl->pData;..
a3f0: 20 20 69 66 28 20 70 4c 76 6c 2d 3e 69 4f 66 66    if( pLvl->iOff
a400: 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72  ==0 ){.    asser
a410: 74 28 20 70 4c 76 6c 2d 3e 62 45 6f 66 3d 3d 30  t( pLvl->bEof==0
a420: 20 29 3b 0a 20 20 20 20 70 4c 76 6c 2d 3e 69 4f   );.    pLvl->iO
a430: 66 66 20 3d 20 31 3b 0a 20 20 20 20 70 4c 76 6c  ff = 1;.    pLvl
a440: 2d 3e 69 4f 66 66 20 2b 3d 20 66 74 73 35 47 65  ->iOff += fts5Ge
a450: 74 56 61 72 69 6e 74 33 32 28 26 70 44 61 74 61  tVarint32(&pData
a460: 2d 3e 70 5b 31 5d 2c 20 70 4c 76 6c 2d 3e 69 4c  ->p[1], pLvl->iL
a470: 65 61 66 50 67 6e 6f 29 3b 0a 20 20 20 20 70 4c  eafPgno);.    pL
a480: 76 6c 2d 3e 69 4f 66 66 20 2b 3d 20 66 74 73 35  vl->iOff += fts5
a490: 47 65 74 56 61 72 69 6e 74 28 26 70 44 61 74 61  GetVarint(&pData
a4a0: 2d 3e 70 5b 70 4c 76 6c 2d 3e 69 4f 66 66 5d 2c  ->p[pLvl->iOff],
a4b0: 20 28 75 36 34 2a 29 26 70 4c 76 6c 2d 3e 69 52   (u64*)&pLvl->iR
a4c0: 6f 77 69 64 29 3b 0a 20 20 20 20 70 4c 76 6c 2d  owid);.    pLvl-
a4d0: 3e 69 46 69 72 73 74 4f 66 66 20 3d 20 70 4c 76  >iFirstOff = pLv
a4e0: 6c 2d 3e 69 4f 66 66 3b 0a 20 20 7d 65 6c 73 65  l->iOff;.  }else
a4f0: 7b 0a 20 20 20 20 69 6e 74 20 69 4f 66 66 3b 0a  {.    int iOff;.
a500: 20 20 20 20 66 6f 72 28 69 4f 66 66 3d 70 4c 76      for(iOff=pLv
a510: 6c 2d 3e 69 4f 66 66 3b 20 69 4f 66 66 3c 70 44  l->iOff; iOff<pD
a520: 61 74 61 2d 3e 6e 6e 3b 20 69 4f 66 66 2b 2b 29  ata->nn; iOff++)
a530: 7b 0a 20 20 20 20 20 20 69 66 28 20 70 44 61 74  {.      if( pDat
a540: 61 2d 3e 70 5b 69 4f 66 66 5d 20 29 20 62 72 65  a->p[iOff] ) bre
a550: 61 6b 3b 20 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ak; .    }..    
a560: 69 66 28 20 69 4f 66 66 3c 70 44 61 74 61 2d 3e  if( iOff<pData->
a570: 6e 6e 20 29 7b 0a 20 20 20 20 20 20 69 36 34 20  nn ){.      i64 
a580: 69 56 61 6c 3b 0a 20 20 20 20 20 20 70 4c 76 6c  iVal;.      pLvl
a590: 2d 3e 69 4c 65 61 66 50 67 6e 6f 20 2b 3d 20 28  ->iLeafPgno += (
a5a0: 69 4f 66 66 20 2d 20 70 4c 76 6c 2d 3e 69 4f 66  iOff - pLvl->iOf
a5b0: 66 29 20 2b 20 31 3b 0a 20 20 20 20 20 20 69 4f  f) + 1;.      iO
a5c0: 66 66 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72  ff += fts5GetVar
a5d0: 69 6e 74 28 26 70 44 61 74 61 2d 3e 70 5b 69 4f  int(&pData->p[iO
a5e0: 66 66 5d 2c 20 28 75 36 34 2a 29 26 69 56 61 6c  ff], (u64*)&iVal
a5f0: 29 3b 0a 20 20 20 20 20 20 70 4c 76 6c 2d 3e 69  );.      pLvl->i
a600: 52 6f 77 69 64 20 2b 3d 20 69 56 61 6c 3b 0a 20  Rowid += iVal;. 
a610: 20 20 20 20 20 70 4c 76 6c 2d 3e 69 4f 66 66 20       pLvl->iOff 
a620: 3d 20 69 4f 66 66 3b 0a 20 20 20 20 7d 65 6c 73  = iOff;.    }els
a630: 65 7b 0a 20 20 20 20 20 20 70 4c 76 6c 2d 3e 62  e{.      pLvl->b
a640: 45 6f 66 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20  Eof = 1;.    }. 
a650: 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70 4c 76   }..  return pLv
a660: 6c 2d 3e 62 45 6f 66 3b 0a 7d 0a 0a 2f 2a 0a 2a  l->bEof;.}../*.*
a670: 2a 20 41 64 76 61 6e 63 65 20 74 68 65 20 69 74  * Advance the it
a680: 65 72 61 74 6f 72 20 70 61 73 73 65 64 20 61 73  erator passed as
a690: 20 74 68 65 20 6f 6e 6c 79 20 61 72 67 75 6d 65   the only argume
a6a0: 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  nt..*/.static in
a6b0: 74 20 66 74 73 35 44 6c 69 64 78 49 74 65 72 4e  t fts5DlidxIterN
a6c0: 65 78 74 52 28 46 74 73 35 49 6e 64 65 78 20 2a  extR(Fts5Index *
a6d0: 70 2c 20 46 74 73 35 44 6c 69 64 78 49 74 65 72  p, Fts5DlidxIter
a6e0: 20 2a 70 49 74 65 72 2c 20 69 6e 74 20 69 4c 76   *pIter, int iLv
a6f0: 6c 29 7b 0a 20 20 46 74 73 35 44 6c 69 64 78 4c  l){.  Fts5DlidxL
a700: 76 6c 20 2a 70 4c 76 6c 20 3d 20 26 70 49 74 65  vl *pLvl = &pIte
a710: 72 2d 3e 61 4c 76 6c 5b 69 4c 76 6c 5d 3b 0a 0a  r->aLvl[iLvl];..
a720: 20 20 61 73 73 65 72 74 28 20 69 4c 76 6c 3c 70    assert( iLvl<p
a730: 49 74 65 72 2d 3e 6e 4c 76 6c 20 29 3b 0a 20 20  Iter->nLvl );.  
a740: 69 66 28 20 66 74 73 35 44 6c 69 64 78 4c 76 6c  if( fts5DlidxLvl
a750: 4e 65 78 74 28 70 4c 76 6c 29 20 29 7b 0a 20 20  Next(pLvl) ){.  
a760: 20 20 69 66 28 20 28 69 4c 76 6c 2b 31 29 20 3c    if( (iLvl+1) <
a770: 20 70 49 74 65 72 2d 3e 6e 4c 76 6c 20 29 7b 0a   pIter->nLvl ){.
a780: 20 20 20 20 20 20 66 74 73 35 44 6c 69 64 78 49        fts5DlidxI
a790: 74 65 72 4e 65 78 74 52 28 70 2c 20 70 49 74 65  terNextR(p, pIte
a7a0: 72 2c 20 69 4c 76 6c 2b 31 29 3b 0a 20 20 20 20  r, iLvl+1);.    
a7b0: 20 20 69 66 28 20 70 4c 76 6c 5b 31 5d 2e 62 45    if( pLvl[1].bE
a7c0: 6f 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  of==0 ){.       
a7d0: 20 66 74 73 35 44 61 74 61 52 65 6c 65 61 73 65   fts5DataRelease
a7e0: 28 70 4c 76 6c 2d 3e 70 44 61 74 61 29 3b 0a 20  (pLvl->pData);. 
a7f0: 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70 4c         memset(pL
a800: 76 6c 2c 20 30 2c 20 73 69 7a 65 6f 66 28 46 74  vl, 0, sizeof(Ft
a810: 73 35 44 6c 69 64 78 4c 76 6c 29 29 3b 0a 20 20  s5DlidxLvl));.  
a820: 20 20 20 20 20 20 70 4c 76 6c 2d 3e 70 44 61 74        pLvl->pDat
a830: 61 20 3d 20 66 74 73 35 44 61 74 61 52 65 61 64  a = fts5DataRead
a840: 28 70 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  (p, .           
a850: 20 46 54 53 35 5f 44 4c 49 44 58 5f 52 4f 57 49   FTS5_DLIDX_ROWI
a860: 44 28 70 49 74 65 72 2d 3e 69 53 65 67 69 64 2c  D(pIter->iSegid,
a870: 20 69 4c 76 6c 2c 20 70 4c 76 6c 5b 31 5d 2e 69   iLvl, pLvl[1].i
a880: 4c 65 61 66 50 67 6e 6f 29 0a 20 20 20 20 20 20  LeafPgno).      
a890: 20 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28    );.        if(
a8a0: 20 70 4c 76 6c 2d 3e 70 44 61 74 61 20 29 20 66   pLvl->pData ) f
a8b0: 74 73 35 44 6c 69 64 78 4c 76 6c 4e 65 78 74 28  ts5DlidxLvlNext(
a8c0: 70 4c 76 6c 29 3b 0a 20 20 20 20 20 20 7d 0a 20  pLvl);.      }. 
a8d0: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75     }.  }..  retu
a8e0: 72 6e 20 70 49 74 65 72 2d 3e 61 4c 76 6c 5b 30  rn pIter->aLvl[0
a8f0: 5d 2e 62 45 6f 66 3b 0a 7d 0a 73 74 61 74 69 63  ].bEof;.}.static
a900: 20 69 6e 74 20 66 74 73 35 44 6c 69 64 78 49 74   int fts5DlidxIt
a910: 65 72 4e 65 78 74 28 46 74 73 35 49 6e 64 65 78  erNext(Fts5Index
a920: 20 2a 70 2c 20 46 74 73 35 44 6c 69 64 78 49 74   *p, Fts5DlidxIt
a930: 65 72 20 2a 70 49 74 65 72 29 7b 0a 20 20 72 65  er *pIter){.  re
a940: 74 75 72 6e 20 66 74 73 35 44 6c 69 64 78 49 74  turn fts5DlidxIt
a950: 65 72 4e 65 78 74 52 28 70 2c 20 70 49 74 65 72  erNextR(p, pIter
a960: 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  , 0);.}../*.** T
a970: 68 65 20 69 74 65 72 61 74 6f 72 20 70 61 73 73  he iterator pass
a980: 65 64 20 61 73 20 74 68 65 20 66 69 72 73 74 20  ed as the first 
a990: 61 72 67 75 6d 65 6e 74 20 68 61 73 20 74 68 65  argument has the
a9a0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 69 65 6c 64   following field
a9b0: 73 20 73 65 74 0a 2a 2a 20 61 73 20 66 6f 6c 6c  s set.** as foll
a9c0: 6f 77 73 2e 20 54 68 69 73 20 66 75 6e 63 74 69  ows. This functi
a9d0: 6f 6e 20 73 65 74 73 20 75 70 20 74 68 65 20 72  on sets up the r
a9e0: 65 73 74 20 6f 66 20 74 68 65 20 69 74 65 72 61  est of the itera
a9f0: 74 6f 72 20 73 6f 20 74 68 61 74 20 69 74 0a 2a  tor so that it.*
aa00: 2a 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20  * points to the 
aa10: 66 69 72 73 74 20 72 6f 77 69 64 20 69 6e 20 74  first rowid in t
aa20: 68 65 20 64 6f 63 6c 69 73 74 2d 69 6e 64 65 78  he doclist-index
aa30: 2e 0a 2a 2a 0a 2a 2a 20 20 20 70 44 61 74 61 3a  ..**.**   pData:
aa40: 0a 2a 2a 20 20 20 20 20 70 6f 69 6e 74 65 72 20  .**     pointer 
aa50: 74 6f 20 64 6f 63 6c 69 73 74 2d 69 6e 64 65 78  to doclist-index
aa60: 20 72 65 63 6f 72 64 2c 20 0a 2a 2a 0a 2a 2a 20   record, .**.** 
aa70: 57 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69  When this functi
aa80: 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 70 49 74  on is called pIt
aa90: 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 20 69 73  er->iLeafPgno is
aaa0: 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72   the page number
aab0: 20 74 68 65 0a 2a 2a 20 64 6f 63 6c 69 73 74 20   the.** doclist 
aac0: 69 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  is associated wi
aad0: 74 68 20 28 74 68 65 20 6f 6e 65 20 66 65 61 74  th (the one feat
aae0: 75 72 69 6e 67 20 74 68 65 20 74 65 72 6d 29 2e  uring the term).
aaf0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .*/.static int f
ab00: 74 73 35 44 6c 69 64 78 49 74 65 72 46 69 72 73  ts5DlidxIterFirs
ab10: 74 28 46 74 73 35 44 6c 69 64 78 49 74 65 72 20  t(Fts5DlidxIter 
ab20: 2a 70 49 74 65 72 29 7b 0a 20 20 69 6e 74 20 69  *pIter){.  int i
ab30: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
ab40: 49 74 65 72 2d 3e 6e 4c 76 6c 3b 20 69 2b 2b 29  Iter->nLvl; i++)
ab50: 7b 0a 20 20 20 20 66 74 73 35 44 6c 69 64 78 4c  {.    fts5DlidxL
ab60: 76 6c 4e 65 78 74 28 26 70 49 74 65 72 2d 3e 61  vlNext(&pIter->a
ab70: 4c 76 6c 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20 72  Lvl[i]);.  }.  r
ab80: 65 74 75 72 6e 20 70 49 74 65 72 2d 3e 61 4c 76  eturn pIter->aLv
ab90: 6c 5b 30 5d 2e 62 45 6f 66 3b 0a 7d 0a 0a 0a 73  l[0].bEof;.}...s
aba0: 74 61 74 69 63 20 69 6e 74 20 66 74 73 35 44 6c  tatic int fts5Dl
abb0: 69 64 78 49 74 65 72 45 6f 66 28 46 74 73 35 49  idxIterEof(Fts5I
abc0: 6e 64 65 78 20 2a 70 2c 20 46 74 73 35 44 6c 69  ndex *p, Fts5Dli
abd0: 64 78 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a  dxIter *pIter){.
abe0: 20 20 72 65 74 75 72 6e 20 70 2d 3e 72 63 21 3d    return p->rc!=
abf0: 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 49 74  SQLITE_OK || pIt
ac00: 65 72 2d 3e 61 4c 76 6c 5b 30 5d 2e 62 45 6f 66  er->aLvl[0].bEof
ac10: 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64  ;.}..static void
ac20: 20 66 74 73 35 44 6c 69 64 78 49 74 65 72 4c 61   fts5DlidxIterLa
ac30: 73 74 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c  st(Fts5Index *p,
ac40: 20 46 74 73 35 44 6c 69 64 78 49 74 65 72 20 2a   Fts5DlidxIter *
ac50: 70 49 74 65 72 29 7b 0a 20 20 69 6e 74 20 69 3b  pIter){.  int i;
ac60: 0a 0a 20 20 2f 2a 20 41 64 76 61 6e 63 65 20 65  ..  /* Advance e
ac70: 61 63 68 20 6c 65 76 65 6c 20 74 6f 20 74 68 65  ach level to the
ac80: 20 6c 61 73 74 20 65 6e 74 72 79 20 6f 6e 20 74   last entry on t
ac90: 68 65 20 6c 61 73 74 20 70 61 67 65 20 2a 2f 0a  he last page */.
aca0: 20 20 66 6f 72 28 69 3d 70 49 74 65 72 2d 3e 6e    for(i=pIter->n
acb0: 4c 76 6c 2d 31 3b 20 70 2d 3e 72 63 3d 3d 53 51  Lvl-1; p->rc==SQ
acc0: 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3e 3d 30 3b  LITE_OK && i>=0;
acd0: 20 69 2d 2d 29 7b 0a 20 20 20 20 46 74 73 35 44   i--){.    Fts5D
ace0: 6c 69 64 78 4c 76 6c 20 2a 70 4c 76 6c 20 3d 20  lidxLvl *pLvl = 
acf0: 26 70 49 74 65 72 2d 3e 61 4c 76 6c 5b 69 5d 3b  &pIter->aLvl[i];
ad00: 0a 20 20 20 20 77 68 69 6c 65 28 20 66 74 73 35  .    while( fts5
ad10: 44 6c 69 64 78 4c 76 6c 4e 65 78 74 28 70 4c 76  DlidxLvlNext(pLv
ad20: 6c 29 3d 3d 30 20 29 3b 0a 20 20 20 20 70 4c 76  l)==0 );.    pLv
ad30: 6c 2d 3e 62 45 6f 66 20 3d 20 30 3b 0a 0a 20 20  l->bEof = 0;..  
ad40: 20 20 69 66 28 20 69 3e 30 20 29 7b 0a 20 20 20    if( i>0 ){.   
ad50: 20 20 20 46 74 73 35 44 6c 69 64 78 4c 76 6c 20     Fts5DlidxLvl 
ad60: 2a 70 43 68 69 6c 64 20 3d 20 26 70 4c 76 6c 5b  *pChild = &pLvl[
ad70: 2d 31 5d 3b 0a 20 20 20 20 20 20 66 74 73 35 44  -1];.      fts5D
ad80: 61 74 61 52 65 6c 65 61 73 65 28 70 43 68 69 6c  ataRelease(pChil
ad90: 64 2d 3e 70 44 61 74 61 29 3b 0a 20 20 20 20 20  d->pData);.     
ada0: 20 6d 65 6d 73 65 74 28 70 43 68 69 6c 64 2c 20   memset(pChild, 
adb0: 30 2c 20 73 69 7a 65 6f 66 28 46 74 73 35 44 6c  0, sizeof(Fts5Dl
adc0: 69 64 78 4c 76 6c 29 29 3b 0a 20 20 20 20 20 20  idxLvl));.      
add0: 70 43 68 69 6c 64 2d 3e 70 44 61 74 61 20 3d 20  pChild->pData = 
ade0: 66 74 73 35 44 61 74 61 52 65 61 64 28 70 2c 20  fts5DataRead(p, 
adf0: 0a 20 20 20 20 20 20 20 20 20 20 46 54 53 35 5f  .          FTS5_
ae00: 44 4c 49 44 58 5f 52 4f 57 49 44 28 70 49 74 65  DLIDX_ROWID(pIte
ae10: 72 2d 3e 69 53 65 67 69 64 2c 20 69 2d 31 2c 20  r->iSegid, i-1, 
ae20: 70 4c 76 6c 2d 3e 69 4c 65 61 66 50 67 6e 6f 29  pLvl->iLeafPgno)
ae30: 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a  .      );.    }.
ae40: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76    }.}../*.** Mov
ae50: 65 20 74 68 65 20 69 74 65 72 61 74 6f 72 20 70  e the iterator p
ae60: 61 73 73 65 64 20 61 73 20 74 68 65 20 6f 6e 6c  assed as the onl
ae70: 79 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68  y argument to th
ae80: 65 20 70 72 65 76 69 6f 75 73 20 65 6e 74 72 79  e previous entry
ae90: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
aea0: 66 74 73 35 44 6c 69 64 78 4c 76 6c 50 72 65 76  fts5DlidxLvlPrev
aeb0: 28 46 74 73 35 44 6c 69 64 78 4c 76 6c 20 2a 70  (Fts5DlidxLvl *p
aec0: 4c 76 6c 29 7b 0a 20 20 69 6e 74 20 69 4f 66 66  Lvl){.  int iOff
aed0: 20 3d 20 70 4c 76 6c 2d 3e 69 4f 66 66 3b 0a 0a   = pLvl->iOff;..
aee0: 20 20 61 73 73 65 72 74 28 20 70 4c 76 6c 2d 3e    assert( pLvl->
aef0: 62 45 6f 66 3d 3d 30 20 29 3b 0a 20 20 69 66 28  bEof==0 );.  if(
af00: 20 69 4f 66 66 3c 3d 70 4c 76 6c 2d 3e 69 46 69   iOff<=pLvl->iFi
af10: 72 73 74 4f 66 66 20 29 7b 0a 20 20 20 20 70 4c  rstOff ){.    pL
af20: 76 6c 2d 3e 62 45 6f 66 20 3d 20 31 3b 0a 20 20  vl->bEof = 1;.  
af30: 7d 65 6c 73 65 7b 0a 20 20 20 20 75 38 20 2a 61  }else{.    u8 *a
af40: 20 3d 20 70 4c 76 6c 2d 3e 70 44 61 74 61 2d 3e   = pLvl->pData->
af50: 70 3b 0a 20 20 20 20 69 36 34 20 69 56 61 6c 3b  p;.    i64 iVal;
af60: 0a 20 20 20 20 69 6e 74 20 69 4c 69 6d 69 74 3b  .    int iLimit;
af70: 0a 20 20 20 20 69 6e 74 20 69 69 3b 0a 20 20 20  .    int ii;.   
af80: 20 69 6e 74 20 6e 5a 65 72 6f 20 3d 20 30 3b 0a   int nZero = 0;.
af90: 0a 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 6c  .    /* Currentl
afa0: 79 20 69 4f 66 66 20 70 6f 69 6e 74 73 20 74 6f  y iOff points to
afb0: 20 74 68 65 20 66 69 72 73 74 20 62 79 74 65 20   the first byte 
afc0: 6f 66 20 61 20 76 61 72 69 6e 74 2e 20 54 68 69  of a varint. Thi
afd0: 73 20 62 6c 6f 63 6b 20 0a 20 20 20 20 2a 2a 20  s block .    ** 
afe0: 64 65 63 72 65 6d 65 6e 74 73 20 69 4f 66 66 20  decrements iOff 
aff0: 75 6e 74 69 6c 20 69 74 20 70 6f 69 6e 74 73 20  until it points 
b000: 74 6f 20 74 68 65 20 66 69 72 73 74 20 62 79 74  to the first byt
b010: 65 20 6f 66 20 74 68 65 20 70 72 65 76 69 6f 75  e of the previou
b020: 73 20 0a 20 20 20 20 2a 2a 20 76 61 72 69 6e 74  s .    ** varint
b030: 2e 20 54 61 6b 69 6e 67 20 63 61 72 65 20 6e 6f  . Taking care no
b040: 74 20 74 6f 20 72 65 61 64 20 61 6e 79 20 6d 65  t to read any me
b050: 6d 6f 72 79 20 6c 6f 63 61 74 69 6f 6e 73 20 74  mory locations t
b060: 68 61 74 20 6f 63 63 75 72 0a 20 20 20 20 2a 2a  hat occur.    **
b070: 20 62 65 66 6f 72 65 20 74 68 65 20 62 75 66 66   before the buff
b080: 65 72 20 69 6e 20 6d 65 6d 6f 72 79 2e 20 20 2a  er in memory.  *
b090: 2f 0a 20 20 20 20 69 4c 69 6d 69 74 20 3d 20 28  /.    iLimit = (
b0a0: 69 4f 66 66 3e 39 20 3f 20 69 4f 66 66 2d 39 20  iOff>9 ? iOff-9 
b0b0: 3a 20 30 29 3b 0a 20 20 20 20 66 6f 72 28 69 4f  : 0);.    for(iO
b0c0: 66 66 2d 2d 3b 20 69 4f 66 66 3e 69 4c 69 6d 69  ff--; iOff>iLimi
b0d0: 74 3b 20 69 4f 66 66 2d 2d 29 7b 0a 20 20 20 20  t; iOff--){.    
b0e0: 20 20 69 66 28 20 28 61 5b 69 4f 66 66 2d 31 5d    if( (a[iOff-1]
b0f0: 20 26 20 30 78 38 30 29 3d 3d 30 20 29 20 62 72   & 0x80)==0 ) br
b100: 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  eak;.    }..    
b110: 66 74 73 35 47 65 74 56 61 72 69 6e 74 28 26 61  fts5GetVarint(&a
b120: 5b 69 4f 66 66 5d 2c 20 28 75 36 34 2a 29 26 69  [iOff], (u64*)&i
b130: 56 61 6c 29 3b 0a 20 20 20 20 70 4c 76 6c 2d 3e  Val);.    pLvl->
b140: 69 52 6f 77 69 64 20 2d 3d 20 69 56 61 6c 3b 0a  iRowid -= iVal;.
b150: 20 20 20 20 70 4c 76 6c 2d 3e 69 4c 65 61 66 50      pLvl->iLeafP
b160: 67 6e 6f 2d 2d 3b 0a 0a 20 20 20 20 2f 2a 20 53  gno--;..    /* S
b170: 6b 69 70 20 62 61 63 6b 77 61 72 64 73 20 70 61  kip backwards pa
b180: 73 74 20 61 6e 79 20 30 78 30 30 20 76 61 72 69  st any 0x00 vari
b190: 6e 74 73 2e 20 2a 2f 0a 20 20 20 20 66 6f 72 28  nts. */.    for(
b1a0: 69 69 3d 69 4f 66 66 2d 31 3b 20 69 69 3e 3d 70  ii=iOff-1; ii>=p
b1b0: 4c 76 6c 2d 3e 69 46 69 72 73 74 4f 66 66 20 26  Lvl->iFirstOff &
b1c0: 26 20 61 5b 69 69 5d 3d 3d 30 78 30 30 3b 20 69  & a[ii]==0x00; i
b1d0: 69 2d 2d 29 7b 0a 20 20 20 20 20 20 6e 5a 65 72  i--){.      nZer
b1e0: 6f 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  o++;.    }.    i
b1f0: 66 28 20 69 69 3e 3d 70 4c 76 6c 2d 3e 69 46 69  f( ii>=pLvl->iFi
b200: 72 73 74 4f 66 66 20 26 26 20 28 61 5b 69 69 5d  rstOff && (a[ii]
b210: 20 26 20 30 78 38 30 29 20 29 7b 0a 20 20 20 20   & 0x80) ){.    
b220: 20 20 2f 2a 20 54 68 65 20 62 79 74 65 20 69 6d    /* The byte im
b230: 6d 65 64 69 61 74 65 6c 79 20 62 65 66 6f 72 65  mediately before
b240: 20 74 68 65 20 6c 61 73 74 20 30 78 30 30 20 62   the last 0x00 b
b250: 79 74 65 20 68 61 73 20 74 68 65 20 30 78 38 30  yte has the 0x80
b260: 20 62 69 74 0a 20 20 20 20 20 20 2a 2a 20 73 65   bit.      ** se
b270: 74 2e 20 53 6f 20 74 68 65 20 6c 61 73 74 20 30  t. So the last 0
b280: 78 30 30 20 69 73 20 6f 6e 6c 79 20 61 20 76 61  x00 is only a va
b290: 72 69 6e 74 20 30 20 69 66 20 74 68 65 72 65 20  rint 0 if there 
b2a0: 61 72 65 20 38 20 6d 6f 72 65 20 30 78 38 30 0a  are 8 more 0x80.
b2b0: 20 20 20 20 20 20 2a 2a 20 62 79 74 65 73 20 62        ** bytes b
b2c0: 65 66 6f 72 65 20 61 5b 69 69 5d 2e 20 2a 2f 0a  efore a[ii]. */.
b2d0: 20 20 20 20 20 20 69 6e 74 20 62 5a 65 72 6f 20        int bZero 
b2e0: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
b2f0: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 6c 61 73    /* True if las
b300: 74 20 30 78 30 30 20 63 6f 75 6e 74 73 20 2a 2f  t 0x00 counts */
b310: 0a 20 20 20 20 20 20 69 66 28 20 28 69 69 2d 38  .      if( (ii-8
b320: 29 3e 3d 70 4c 76 6c 2d 3e 69 46 69 72 73 74 4f  )>=pLvl->iFirstO
b330: 66 66 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  ff ){.        in
b340: 74 20 6a 3b 0a 20 20 20 20 20 20 20 20 66 6f 72  t j;.        for
b350: 28 6a 3d 31 3b 20 6a 3c 3d 38 20 26 26 20 28 61  (j=1; j<=8 && (a
b360: 5b 69 69 2d 6a 5d 20 26 20 30 78 38 30 29 3b 20  [ii-j] & 0x80); 
b370: 6a 2b 2b 29 3b 0a 20 20 20 20 20 20 20 20 62 5a  j++);.        bZ
b380: 65 72 6f 20 3d 20 28 6a 3e 38 29 3b 0a 20 20 20  ero = (j>8);.   
b390: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 62     }.      if( b
b3a0: 5a 65 72 6f 3d 3d 30 20 29 20 6e 5a 65 72 6f 2d  Zero==0 ) nZero-
b3b0: 2d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c 76  -;.    }.    pLv
b3c0: 6c 2d 3e 69 4c 65 61 66 50 67 6e 6f 20 2d 3d 20  l->iLeafPgno -= 
b3d0: 6e 5a 65 72 6f 3b 0a 20 20 20 20 70 4c 76 6c 2d  nZero;.    pLvl-
b3e0: 3e 69 4f 66 66 20 3d 20 69 4f 66 66 20 2d 20 6e  >iOff = iOff - n
b3f0: 5a 65 72 6f 3b 0a 20 20 7d 0a 0a 20 20 72 65 74  Zero;.  }..  ret
b400: 75 72 6e 20 70 4c 76 6c 2d 3e 62 45 6f 66 3b 0a  urn pLvl->bEof;.
b410: 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74  }..static int ft
b420: 73 35 44 6c 69 64 78 49 74 65 72 50 72 65 76 52  s5DlidxIterPrevR
b430: 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 46  (Fts5Index *p, F
b440: 74 73 35 44 6c 69 64 78 49 74 65 72 20 2a 70 49  ts5DlidxIter *pI
b450: 74 65 72 2c 20 69 6e 74 20 69 4c 76 6c 29 7b 0a  ter, int iLvl){.
b460: 20 20 46 74 73 35 44 6c 69 64 78 4c 76 6c 20 2a    Fts5DlidxLvl *
b470: 70 4c 76 6c 20 3d 20 26 70 49 74 65 72 2d 3e 61  pLvl = &pIter->a
b480: 4c 76 6c 5b 69 4c 76 6c 5d 3b 0a 0a 20 20 61 73  Lvl[iLvl];..  as
b490: 73 65 72 74 28 20 69 4c 76 6c 3c 70 49 74 65 72  sert( iLvl<pIter
b4a0: 2d 3e 6e 4c 76 6c 20 29 3b 0a 20 20 69 66 28 20  ->nLvl );.  if( 
b4b0: 66 74 73 35 44 6c 69 64 78 4c 76 6c 50 72 65 76  fts5DlidxLvlPrev
b4c0: 28 70 4c 76 6c 29 20 29 7b 0a 20 20 20 20 69 66  (pLvl) ){.    if
b4d0: 28 20 28 69 4c 76 6c 2b 31 29 20 3c 20 70 49 74  ( (iLvl+1) < pIt
b4e0: 65 72 2d 3e 6e 4c 76 6c 20 29 7b 0a 20 20 20 20  er->nLvl ){.    
b4f0: 20 20 66 74 73 35 44 6c 69 64 78 49 74 65 72 50    fts5DlidxIterP
b500: 72 65 76 52 28 70 2c 20 70 49 74 65 72 2c 20 69  revR(p, pIter, i
b510: 4c 76 6c 2b 31 29 3b 0a 20 20 20 20 20 20 69 66  Lvl+1);.      if
b520: 28 20 70 4c 76 6c 5b 31 5d 2e 62 45 6f 66 3d 3d  ( pLvl[1].bEof==
b530: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 66 74 73  0 ){.        fts
b540: 35 44 61 74 61 52 65 6c 65 61 73 65 28 70 4c 76  5DataRelease(pLv
b550: 6c 2d 3e 70 44 61 74 61 29 3b 0a 20 20 20 20 20  l->pData);.     
b560: 20 20 20 6d 65 6d 73 65 74 28 70 4c 76 6c 2c 20     memset(pLvl, 
b570: 30 2c 20 73 69 7a 65 6f 66 28 46 74 73 35 44 6c  0, sizeof(Fts5Dl
b580: 69 64 78 4c 76 6c 29 29 3b 0a 20 20 20 20 20 20  idxLvl));.      
b590: 20 20 70 4c 76 6c 2d 3e 70 44 61 74 61 20 3d 20    pLvl->pData = 
b5a0: 66 74 73 35 44 61 74 61 52 65 61 64 28 70 2c 20  fts5DataRead(p, 
b5b0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 46 54 53  .            FTS
b5c0: 35 5f 44 4c 49 44 58 5f 52 4f 57 49 44 28 70 49  5_DLIDX_ROWID(pI
b5d0: 74 65 72 2d 3e 69 53 65 67 69 64 2c 20 69 4c 76  ter->iSegid, iLv
b5e0: 6c 2c 20 70 4c 76 6c 5b 31 5d 2e 69 4c 65 61 66  l, pLvl[1].iLeaf
b5f0: 50 67 6e 6f 29 0a 20 20 20 20 20 20 20 20 29 3b  Pgno).        );
b600: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4c 76  .        if( pLv
b610: 6c 2d 3e 70 44 61 74 61 20 29 7b 0a 20 20 20 20  l->pData ){.    
b620: 20 20 20 20 20 20 77 68 69 6c 65 28 20 66 74 73        while( fts
b630: 35 44 6c 69 64 78 4c 76 6c 4e 65 78 74 28 70 4c  5DlidxLvlNext(pL
b640: 76 6c 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  vl)==0 );.      
b650: 20 20 20 20 70 4c 76 6c 2d 3e 62 45 6f 66 20 3d      pLvl->bEof =
b660: 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   0;.        }.  
b670: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
b680: 0a 20 20 72 65 74 75 72 6e 20 70 49 74 65 72 2d  .  return pIter-
b690: 3e 61 4c 76 6c 5b 30 5d 2e 62 45 6f 66 3b 0a 7d  >aLvl[0].bEof;.}
b6a0: 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 35  .static int fts5
b6b0: 44 6c 69 64 78 49 74 65 72 50 72 65 76 28 46 74  DlidxIterPrev(Ft
b6c0: 73 35 49 6e 64 65 78 20 2a 70 2c 20 46 74 73 35  s5Index *p, Fts5
b6d0: 44 6c 69 64 78 49 74 65 72 20 2a 70 49 74 65 72  DlidxIter *pIter
b6e0: 29 7b 0a 20 20 72 65 74 75 72 6e 20 66 74 73 35  ){.  return fts5
b6f0: 44 6c 69 64 78 49 74 65 72 50 72 65 76 52 28 70  DlidxIterPrevR(p
b700: 2c 20 70 49 74 65 72 2c 20 30 29 3b 0a 7d 0a 0a  , pIter, 0);.}..
b710: 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 20 64 6f 63  /*.** Free a doc
b720: 6c 69 73 74 2d 69 6e 64 65 78 20 69 74 65 72 61  list-index itera
b730: 74 6f 72 20 6f 62 6a 65 63 74 20 61 6c 6c 6f 63  tor object alloc
b740: 61 74 65 64 20 62 79 20 66 74 73 35 44 6c 69 64  ated by fts5Dlid
b750: 78 49 74 65 72 49 6e 69 74 28 29 2e 0a 2a 2f 0a  xIterInit()..*/.
b760: 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
b770: 44 6c 69 64 78 49 74 65 72 46 72 65 65 28 46 74  DlidxIterFree(Ft
b780: 73 35 44 6c 69 64 78 49 74 65 72 20 2a 70 49 74  s5DlidxIter *pIt
b790: 65 72 29 7b 0a 20 20 69 66 28 20 70 49 74 65 72  er){.  if( pIter
b7a0: 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20   ){.    int i;. 
b7b0: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49     for(i=0; i<pI
b7c0: 74 65 72 2d 3e 6e 4c 76 6c 3b 20 69 2b 2b 29 7b  ter->nLvl; i++){
b7d0: 0a 20 20 20 20 20 20 66 74 73 35 44 61 74 61 52  .      fts5DataR
b7e0: 65 6c 65 61 73 65 28 70 49 74 65 72 2d 3e 61 4c  elease(pIter->aL
b7f0: 76 6c 5b 69 5d 2e 70 44 61 74 61 29 3b 0a 20 20  vl[i].pData);.  
b800: 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f    }.    sqlite3_
b810: 66 72 65 65 28 70 49 74 65 72 29 3b 0a 20 20 7d  free(pIter);.  }
b820: 0a 7d 0a 0a 73 74 61 74 69 63 20 46 74 73 35 44  .}..static Fts5D
b830: 6c 69 64 78 49 74 65 72 20 2a 66 74 73 35 44 6c  lidxIter *fts5Dl
b840: 69 64 78 49 74 65 72 49 6e 69 74 28 0a 20 20 46  idxIterInit(.  F
b850: 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20  ts5Index *p,    
b860: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
b870: 2a 20 46 74 73 35 20 42 61 63 6b 65 6e 64 20 74  * Fts5 Backend t
b880: 6f 20 69 74 65 72 61 74 65 20 77 69 74 68 69 6e  o iterate within
b890: 20 2a 2f 0a 20 20 69 6e 74 20 62 52 65 76 2c 20   */.  int bRev, 
b8a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b8b0: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f        /* True fo
b8c0: 72 20 4f 52 44 45 52 20 42 59 20 41 53 43 20 2a  r ORDER BY ASC *
b8d0: 2f 0a 20 20 69 6e 74 20 69 53 65 67 69 64 2c 20  /.  int iSegid, 
b8e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b8f0: 20 20 20 20 2f 2a 20 53 65 67 6d 65 6e 74 20 69      /* Segment i
b900: 64 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 65 61 66  d */.  int iLeaf
b910: 50 67 20 20 20 20 20 20 20 20 20 20 20 20 20 20  Pg              
b920: 20 20 20 20 20 20 20 2f 2a 20 4c 65 61 66 20 70         /* Leaf p
b930: 61 67 65 20 6e 75 6d 62 65 72 20 74 6f 20 6c 6f  age number to lo
b940: 61 64 20 64 6c 69 64 78 20 66 6f 72 20 2a 2f 0a  ad dlidx for */.
b950: 29 7b 0a 20 20 46 74 73 35 44 6c 69 64 78 49 74  ){.  Fts5DlidxIt
b960: 65 72 20 2a 70 49 74 65 72 20 3d 20 30 3b 0a 20  er *pIter = 0;. 
b970: 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 62 44   int i;.  int bD
b980: 6f 6e 65 20 3d 20 30 3b 0a 0a 20 20 66 6f 72 28  one = 0;..  for(
b990: 69 3d 30 3b 20 70 2d 3e 72 63 3d 3d 53 51 4c 49  i=0; p->rc==SQLI
b9a0: 54 45 5f 4f 4b 20 26 26 20 62 44 6f 6e 65 3d 3d  TE_OK && bDone==
b9b0: 30 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74  0; i++){.    int
b9c0: 20 6e 42 79 74 65 20 3d 20 73 69 7a 65 6f 66 28   nByte = sizeof(
b9d0: 46 74 73 35 44 6c 69 64 78 49 74 65 72 29 20 2b  Fts5DlidxIter) +
b9e0: 20 69 20 2a 20 73 69 7a 65 6f 66 28 46 74 73 35   i * sizeof(Fts5
b9f0: 44 6c 69 64 78 4c 76 6c 29 3b 0a 20 20 20 20 46  DlidxLvl);.    F
ba00: 74 73 35 44 6c 69 64 78 49 74 65 72 20 2a 70 4e  ts5DlidxIter *pN
ba10: 65 77 3b 0a 0a 20 20 20 20 70 4e 65 77 20 3d 20  ew;..    pNew = 
ba20: 28 46 74 73 35 44 6c 69 64 78 49 74 65 72 2a 29  (Fts5DlidxIter*)
ba30: 73 71 6c 69 74 65 33 5f 72 65 61 6c 6c 6f 63 28  sqlite3_realloc(
ba40: 70 49 74 65 72 2c 20 6e 42 79 74 65 29 3b 0a 20  pIter, nByte);. 
ba50: 20 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29     if( pNew==0 )
ba60: 7b 0a 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20  {.      p->rc = 
ba70: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
ba80: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69    }else{.      i
ba90: 36 34 20 69 52 6f 77 69 64 20 3d 20 46 54 53 35  64 iRowid = FTS5
baa0: 5f 44 4c 49 44 58 5f 52 4f 57 49 44 28 69 53 65  _DLIDX_ROWID(iSe
bab0: 67 69 64 2c 20 69 2c 20 69 4c 65 61 66 50 67 29  gid, i, iLeafPg)
bac0: 3b 0a 20 20 20 20 20 20 46 74 73 35 44 6c 69 64  ;.      Fts5Dlid
bad0: 78 4c 76 6c 20 2a 70 4c 76 6c 20 3d 20 26 70 4e  xLvl *pLvl = &pN
bae0: 65 77 2d 3e 61 4c 76 6c 5b 69 5d 3b 0a 20 20 20  ew->aLvl[i];.   
baf0: 20 20 20 70 49 74 65 72 20 3d 20 70 4e 65 77 3b     pIter = pNew;
bb00: 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70 4c  .      memset(pL
bb10: 76 6c 2c 20 30 2c 20 73 69 7a 65 6f 66 28 46 74  vl, 0, sizeof(Ft
bb20: 73 35 44 6c 69 64 78 4c 76 6c 29 29 3b 0a 20 20  s5DlidxLvl));.  
bb30: 20 20 20 20 70 4c 76 6c 2d 3e 70 44 61 74 61 20      pLvl->pData 
bb40: 3d 20 66 74 73 35 44 61 74 61 52 65 61 64 28 70  = fts5DataRead(p
bb50: 2c 20 69 52 6f 77 69 64 29 3b 0a 20 20 20 20 20  , iRowid);.     
bb60: 20 69 66 28 20 70 4c 76 6c 2d 3e 70 44 61 74 61   if( pLvl->pData
bb70: 20 26 26 20 28 70 4c 76 6c 2d 3e 70 44 61 74 61   && (pLvl->pData
bb80: 2d 3e 70 5b 30 5d 20 26 20 30 78 30 30 30 31 29  ->p[0] & 0x0001)
bb90: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 62  ==0 ){.        b
bba0: 44 6f 6e 65 20 3d 20 31 3b 0a 20 20 20 20 20 20  Done = 1;.      
bbb0: 7d 0a 20 20 20 20 20 20 70 49 74 65 72 2d 3e 6e  }.      pIter->n
bbc0: 4c 76 6c 20 3d 20 69 2b 31 3b 0a 20 20 20 20 7d  Lvl = i+1;.    }
bbd0: 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 2d 3e 72  .  }..  if( p->r
bbe0: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
bbf0: 20 20 20 20 70 49 74 65 72 2d 3e 69 53 65 67 69      pIter->iSegi
bc00: 64 20 3d 20 69 53 65 67 69 64 3b 0a 20 20 20 20  d = iSegid;.    
bc10: 69 66 28 20 62 52 65 76 3d 3d 30 20 29 7b 0a 20  if( bRev==0 ){. 
bc20: 20 20 20 20 20 66 74 73 35 44 6c 69 64 78 49 74       fts5DlidxIt
bc30: 65 72 46 69 72 73 74 28 70 49 74 65 72 29 3b 0a  erFirst(pIter);.
bc40: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
bc50: 20 66 74 73 35 44 6c 69 64 78 49 74 65 72 4c 61   fts5DlidxIterLa
bc60: 73 74 28 70 2c 20 70 49 74 65 72 29 3b 0a 20 20  st(p, pIter);.  
bc70: 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70    }.  }..  if( p
bc80: 2d 3e 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc!=SQLITE_OK 
bc90: 29 7b 0a 20 20 20 20 66 74 73 35 44 6c 69 64 78  ){.    fts5Dlidx
bca0: 49 74 65 72 46 72 65 65 28 70 49 74 65 72 29 3b  IterFree(pIter);
bcb0: 0a 20 20 20 20 70 49 74 65 72 20 3d 20 30 3b 0a  .    pIter = 0;.
bcc0: 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70 49    }..  return pI
bcd0: 74 65 72 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69  ter;.}..static i
bce0: 36 34 20 66 74 73 35 44 6c 69 64 78 49 74 65 72  64 fts5DlidxIter
bcf0: 52 6f 77 69 64 28 46 74 73 35 44 6c 69 64 78 49  Rowid(Fts5DlidxI
bd00: 74 65 72 20 2a 70 49 74 65 72 29 7b 0a 20 20 72  ter *pIter){.  r
bd10: 65 74 75 72 6e 20 70 49 74 65 72 2d 3e 61 4c 76  eturn pIter->aLv
bd20: 6c 5b 30 5d 2e 69 52 6f 77 69 64 3b 0a 7d 0a 73  l[0].iRowid;.}.s
bd30: 74 61 74 69 63 20 69 6e 74 20 66 74 73 35 44 6c  tatic int fts5Dl
bd40: 69 64 78 49 74 65 72 50 67 6e 6f 28 46 74 73 35  idxIterPgno(Fts5
bd50: 44 6c 69 64 78 49 74 65 72 20 2a 70 49 74 65 72  DlidxIter *pIter
bd60: 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 49 74 65  ){.  return pIte
bd70: 72 2d 3e 61 4c 76 6c 5b 30 5d 2e 69 4c 65 61 66  r->aLvl[0].iLeaf
bd80: 50 67 6e 6f 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c  Pgno;.}../*.** L
bd90: 6f 61 64 20 74 68 65 20 6e 65 78 74 20 6c 65 61  oad the next lea
bda0: 66 20 70 61 67 65 20 69 6e 74 6f 20 74 68 65 20  f page into the 
bdb0: 73 65 67 6d 65 6e 74 20 69 74 65 72 61 74 6f 72  segment iterator
bdc0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
bdd0: 20 66 74 73 35 53 65 67 49 74 65 72 4e 65 78 74   fts5SegIterNext
bde0: 50 61 67 65 28 0a 20 20 46 74 73 35 49 6e 64 65  Page(.  Fts5Inde
bdf0: 78 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  x *p,           
be00: 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53 35 20          /* FTS5 
be10: 62 61 63 6b 65 6e 64 20 6f 62 6a 65 63 74 20 2a  backend object *
be20: 2f 0a 20 20 46 74 73 35 53 65 67 49 74 65 72 20  /.  Fts5SegIter 
be30: 2a 70 49 74 65 72 20 20 20 20 20 20 20 20 20 20  *pIter          
be40: 20 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20      /* Iterator 
be50: 74 6f 20 61 64 76 61 6e 63 65 20 74 6f 20 6e 65  to advance to ne
be60: 78 74 20 70 61 67 65 20 2a 2f 0a 29 7b 0a 20 20  xt page */.){.  
be70: 46 74 73 35 44 61 74 61 20 2a 70 4c 65 61 66 3b  Fts5Data *pLeaf;
be80: 0a 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65  .  Fts5Structure
be90: 53 65 67 6d 65 6e 74 20 2a 70 53 65 67 20 3d 20  Segment *pSeg = 
bea0: 70 49 74 65 72 2d 3e 70 53 65 67 3b 0a 20 20 66  pIter->pSeg;.  f
beb0: 74 73 35 44 61 74 61 52 65 6c 65 61 73 65 28 70  ts5DataRelease(p
bec0: 49 74 65 72 2d 3e 70 4c 65 61 66 29 3b 0a 20 20  Iter->pLeaf);.  
bed0: 70 49 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f  pIter->iLeafPgno
bee0: 2b 2b 3b 0a 20 20 69 66 28 20 70 49 74 65 72 2d  ++;.  if( pIter-
bef0: 3e 70 4e 65 78 74 4c 65 61 66 20 29 7b 0a 20 20  >pNextLeaf ){.  
bf00: 20 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 20 3d    pIter->pLeaf =
bf10: 20 70 49 74 65 72 2d 3e 70 4e 65 78 74 4c 65 61   pIter->pNextLea
bf20: 66 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 70 4e  f;.    pIter->pN
bf30: 65 78 74 4c 65 61 66 20 3d 20 30 3b 0a 20 20 7d  extLeaf = 0;.  }
bf40: 65 6c 73 65 20 69 66 28 20 70 49 74 65 72 2d 3e  else if( pIter->
bf50: 69 4c 65 61 66 50 67 6e 6f 3c 3d 70 53 65 67 2d  iLeafPgno<=pSeg-
bf60: 3e 70 67 6e 6f 4c 61 73 74 20 29 7b 0a 20 20 20  >pgnoLast ){.   
bf70: 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 20 3d 20   pIter->pLeaf = 
bf80: 66 74 73 35 44 61 74 61 52 65 61 64 28 70 2c 20  fts5DataRead(p, 
bf90: 0a 20 20 20 20 20 20 20 20 46 54 53 35 5f 53 45  .        FTS5_SE
bfa0: 47 4d 45 4e 54 5f 52 4f 57 49 44 28 70 53 65 67  GMENT_ROWID(pSeg
bfb0: 2d 3e 69 53 65 67 69 64 2c 20 70 49 74 65 72 2d  ->iSegid, pIter-
bfc0: 3e 69 4c 65 61 66 50 67 6e 6f 29 0a 20 20 20 20  >iLeafPgno).    
bfd0: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
bfe0: 70 49 74 65 72 2d 3e 70 4c 65 61 66 20 3d 20 30  pIter->pLeaf = 0
bff0: 3b 0a 20 20 7d 0a 20 20 70 4c 65 61 66 20 3d 20  ;.  }.  pLeaf = 
c000: 70 49 74 65 72 2d 3e 70 4c 65 61 66 3b 0a 0a 20  pIter->pLeaf;.. 
c010: 20 69 66 28 20 70 4c 65 61 66 20 29 7b 0a 20 20   if( pLeaf ){.  
c020: 20 20 70 49 74 65 72 2d 3e 69 50 67 69 64 78 4f    pIter->iPgidxO
c030: 66 66 20 3d 20 70 4c 65 61 66 2d 3e 73 7a 4c 65  ff = pLeaf->szLe
c040: 61 66 3b 0a 20 20 20 20 69 66 28 20 66 74 73 35  af;.    if( fts5
c050: 4c 65 61 66 49 73 54 65 72 6d 6c 65 73 73 28 70  LeafIsTermless(p
c060: 4c 65 61 66 29 20 29 7b 0a 20 20 20 20 20 20 70  Leaf) ){.      p
c070: 49 74 65 72 2d 3e 69 45 6e 64 6f 66 44 6f 63 6c  Iter->iEndofDocl
c080: 69 73 74 20 3d 20 70 4c 65 61 66 2d 3e 6e 6e 2b  ist = pLeaf->nn+
c090: 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  1;.    }else{.  
c0a0: 20 20 20 20 70 49 74 65 72 2d 3e 69 50 67 69 64      pIter->iPgid
c0b0: 78 4f 66 66 20 2b 3d 20 66 74 73 35 47 65 74 56  xOff += fts5GetV
c0c0: 61 72 69 6e 74 33 32 28 26 70 4c 65 61 66 2d 3e  arint32(&pLeaf->
c0d0: 70 5b 70 49 74 65 72 2d 3e 69 50 67 69 64 78 4f  p[pIter->iPgidxO
c0e0: 66 66 5d 2c 0a 20 20 20 20 20 20 20 20 20 20 70  ff],.          p
c0f0: 49 74 65 72 2d 3e 69 45 6e 64 6f 66 44 6f 63 6c  Iter->iEndofDocl
c100: 69 73 74 0a 20 20 20 20 20 20 29 3b 0a 20 20 20  ist.      );.   
c110: 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
c120: 41 72 67 75 6d 65 6e 74 20 70 20 70 6f 69 6e 74  Argument p point
c130: 73 20 74 6f 20 61 20 62 75 66 66 65 72 20 63 6f  s to a buffer co
c140: 6e 74 61 69 6e 69 6e 67 20 61 20 76 61 72 69 6e  ntaining a varin
c150: 74 20 74 6f 20 62 65 20 69 6e 74 65 72 70 72 65  t to be interpre
c160: 74 65 64 20 61 73 20 61 0a 2a 2a 20 70 6f 73 69  ted as a.** posi
c170: 74 69 6f 6e 20 6c 69 73 74 20 73 69 7a 65 20 66  tion list size f
c180: 69 65 6c 64 2e 20 52 65 61 64 20 74 68 65 20 76  ield. Read the v
c190: 61 72 69 6e 74 20 61 6e 64 20 72 65 74 75 72 6e  arint and return
c1a0: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62   the number of b
c1b0: 79 74 65 73 0a 2a 2a 20 72 65 61 64 2e 20 42 65  ytes.** read. Be
c1c0: 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2c 20  fore returning, 
c1d0: 73 65 74 20 2a 70 6e 53 7a 20 74 6f 20 74 68 65  set *pnSz to the
c1e0: 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   number of bytes
c1f0: 20 69 6e 20 74 68 65 20 70 6f 73 69 74 69 6f 6e   in the position
c200: 0a 2a 2a 20 6c 69 73 74 2c 20 61 6e 64 20 2a 70  .** list, and *p
c210: 62 44 65 6c 20 74 6f 20 74 72 75 65 20 69 66 20  bDel to true if 
c220: 74 68 65 20 64 65 6c 65 74 65 20 66 6c 61 67 20  the delete flag 
c230: 69 73 20 73 65 74 2c 20 6f 72 20 66 61 6c 73 65  is set, or false
c240: 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 73   otherwise..*/.s
c250: 74 61 74 69 63 20 69 6e 74 20 66 74 73 35 47 65  tatic int fts5Ge
c260: 74 50 6f 73 6c 69 73 74 53 69 7a 65 28 63 6f 6e  tPoslistSize(con
c270: 73 74 20 75 38 20 2a 70 2c 20 69 6e 74 20 2a 70  st u8 *p, int *p
c280: 6e 53 7a 2c 20 69 6e 74 20 2a 70 62 44 65 6c 29  nSz, int *pbDel)
c290: 7b 0a 20 20 69 6e 74 20 6e 53 7a 3b 0a 20 20 69  {.  int nSz;.  i
c2a0: 6e 74 20 6e 20 3d 20 30 3b 0a 20 20 66 74 73 35  nt n = 0;.  fts5
c2b0: 46 61 73 74 47 65 74 56 61 72 69 6e 74 33 32 28  FastGetVarint32(
c2c0: 70 2c 20 6e 2c 20 6e 53 7a 29 3b 0a 20 20 61 73  p, n, nSz);.  as
c2d0: 73 65 72 74 5f 6e 63 28 20 6e 53 7a 3e 3d 30 20  sert_nc( nSz>=0 
c2e0: 29 3b 0a 20 20 2a 70 6e 53 7a 20 3d 20 6e 53 7a  );.  *pnSz = nSz
c2f0: 2f 32 3b 0a 20 20 2a 70 62 44 65 6c 20 3d 20 6e  /2;.  *pbDel = n
c300: 53 7a 20 26 20 30 78 30 30 30 31 3b 0a 20 20 72  Sz & 0x0001;.  r
c310: 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn n;.}../*.*
c320: 2a 20 46 74 73 35 53 65 67 49 74 65 72 2e 69 4c  * Fts5SegIter.iL
c330: 65 61 66 4f 66 66 73 65 74 20 63 75 72 72 65 6e  eafOffset curren
c340: 74 6c 79 20 70 6f 69 6e 74 73 20 74 6f 20 74 68  tly points to th
c350: 65 20 66 69 72 73 74 20 62 79 74 65 20 6f 66 20  e first byte of 
c360: 61 0a 2a 2a 20 70 6f 73 69 74 69 6f 6e 2d 6c 69  a.** position-li
c370: 73 74 20 73 69 7a 65 20 66 69 65 6c 64 2e 20 52  st size field. R
c380: 65 61 64 20 74 68 65 20 76 61 6c 75 65 20 6f 66  ead the value of
c390: 20 74 68 65 20 66 69 65 6c 64 20 61 6e 64 20 73   the field and s
c3a0: 74 6f 72 65 20 69 74 0a 2a 2a 20 69 6e 20 74 68  tore it.** in th
c3b0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 76 61 72 69  e following vari
c3c0: 61 62 6c 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 46  ables:.**.**   F
c3d0: 74 73 35 53 65 67 49 74 65 72 2e 6e 50 6f 73 0a  ts5SegIter.nPos.
c3e0: 2a 2a 20 20 20 46 74 73 35 53 65 67 49 74 65 72  **   Fts5SegIter
c3f0: 2e 62 44 65 6c 0a 2a 2a 0a 2a 2a 20 4c 65 61 76  .bDel.**.** Leav
c400: 65 20 46 74 73 35 53 65 67 49 74 65 72 2e 69 4c  e Fts5SegIter.iL
c410: 65 61 66 4f 66 66 73 65 74 20 70 6f 69 6e 74 69  eafOffset pointi
c420: 6e 67 20 74 6f 20 74 68 65 20 66 69 72 73 74 20  ng to the first 
c430: 62 79 74 65 20 6f 66 20 74 68 65 20 0a 2a 2a 20  byte of the .** 
c440: 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74 20 63 6f  position list co
c450: 6e 74 65 6e 74 20 28 69 66 20 61 6e 79 29 2e 0a  ntent (if any)..
c460: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
c470: 74 73 35 53 65 67 49 74 65 72 4c 6f 61 64 4e 50  ts5SegIterLoadNP
c480: 6f 73 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c  os(Fts5Index *p,
c490: 20 46 74 73 35 53 65 67 49 74 65 72 20 2a 70 49   Fts5SegIter *pI
c4a0: 74 65 72 29 7b 0a 20 20 69 66 28 20 70 2d 3e 72  ter){.  if( p->r
c4b0: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
c4c0: 20 20 20 20 69 6e 74 20 69 4f 66 66 20 3d 20 70      int iOff = p
c4d0: 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65  Iter->iLeafOffse
c4e0: 74 3b 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f  t;  /* Offset to
c4f0: 20 72 65 61 64 20 61 74 20 2a 2f 0a 20 20 20 20   read at */.    
c500: 41 53 53 45 52 54 5f 53 5a 4c 45 41 46 5f 4f 4b  ASSERT_SZLEAF_OK
c510: 28 70 49 74 65 72 2d 3e 70 4c 65 61 66 29 3b 0a  (pIter->pLeaf);.
c520: 20 20 20 20 69 66 28 20 70 2d 3e 70 43 6f 6e 66      if( p->pConf
c530: 69 67 2d 3e 65 44 65 74 61 69 6c 3d 3d 46 54 53  ig->eDetail==FTS
c540: 35 5f 44 45 54 41 49 4c 5f 4e 4f 4e 45 20 29 7b  5_DETAIL_NONE ){
c550: 0a 20 20 20 20 20 20 69 6e 74 20 69 45 6f 64 20  .      int iEod 
c560: 3d 20 4d 49 4e 28 70 49 74 65 72 2d 3e 69 45 6e  = MIN(pIter->iEn
c570: 64 6f 66 44 6f 63 6c 69 73 74 2c 20 70 49 74 65  dofDoclist, pIte
c580: 72 2d 3e 70 4c 65 61 66 2d 3e 73 7a 4c 65 61 66  r->pLeaf->szLeaf
c590: 29 3b 0a 20 20 20 20 20 20 70 49 74 65 72 2d 3e  );.      pIter->
c5a0: 62 44 65 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20  bDel = 0;.      
c5b0: 70 49 74 65 72 2d 3e 6e 50 6f 73 20 3d 20 31 3b  pIter->nPos = 1;
c5c0: 0a 20 20 20 20 20 20 69 66 28 20 69 4f 66 66 3c  .      if( iOff<
c5d0: 69 45 6f 64 20 26 26 20 70 49 74 65 72 2d 3e 70  iEod && pIter->p
c5e0: 4c 65 61 66 2d 3e 70 5b 69 4f 66 66 5d 3d 3d 30  Leaf->p[iOff]==0
c5f0: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 49 74 65   ){.        pIte
c600: 72 2d 3e 62 44 65 6c 20 3d 20 31 3b 0a 20 20 20  r->bDel = 1;.   
c610: 20 20 20 20 20 69 4f 66 66 2b 2b 3b 0a 20 20 20       iOff++;.   
c620: 20 20 20 20 20 69 66 28 20 69 4f 66 66 3c 69 45       if( iOff<iE
c630: 6f 64 20 26 26 20 70 49 74 65 72 2d 3e 70 4c 65  od && pIter->pLe
c640: 61 66 2d 3e 70 5b 69 4f 66 66 5d 3d 3d 30 20 29  af->p[iOff]==0 )
c650: 7b 0a 20 20 20 20 20 20 20 20 20 20 70 49 74 65  {.          pIte
c660: 72 2d 3e 6e 50 6f 73 20 3d 20 31 3b 0a 20 20 20  r->nPos = 1;.   
c670: 20 20 20 20 20 20 20 69 4f 66 66 2b 2b 3b 0a 20         iOff++;. 
c680: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
c690: 20 20 20 20 20 20 20 20 70 49 74 65 72 2d 3e 6e          pIter->n
c6a0: 50 6f 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  Pos = 0;.       
c6b0: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
c6c0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20  else{.      int 
c6d0: 6e 53 7a 3b 0a 20 20 20 20 20 20 66 74 73 35 46  nSz;.      fts5F
c6e0: 61 73 74 47 65 74 56 61 72 69 6e 74 33 32 28 70  astGetVarint32(p
c6f0: 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 70 2c 20  Iter->pLeaf->p, 
c700: 69 4f 66 66 2c 20 6e 53 7a 29 3b 0a 20 20 20 20  iOff, nSz);.    
c710: 20 20 70 49 74 65 72 2d 3e 62 44 65 6c 20 3d 20    pIter->bDel = 
c720: 28 6e 53 7a 20 26 20 30 78 30 30 30 31 29 3b 0a  (nSz & 0x0001);.
c730: 20 20 20 20 20 20 70 49 74 65 72 2d 3e 6e 50 6f        pIter->nPo
c740: 73 20 3d 20 6e 53 7a 3e 3e 31 3b 0a 20 20 20 20  s = nSz>>1;.    
c750: 20 20 61 73 73 65 72 74 5f 6e 63 28 20 70 49 74    assert_nc( pIt
c760: 65 72 2d 3e 6e 50 6f 73 3e 3d 30 20 29 3b 0a 20  er->nPos>=0 );. 
c770: 20 20 20 7d 0a 20 20 20 20 70 49 74 65 72 2d 3e     }.    pIter->
c780: 69 4c 65 61 66 4f 66 66 73 65 74 20 3d 20 69 4f  iLeafOffset = iO
c790: 66 66 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69  ff;.  }.}..stati
c7a0: 63 20 76 6f 69 64 20 66 74 73 35 53 65 67 49 74  c void fts5SegIt
c7b0: 65 72 4c 6f 61 64 52 6f 77 69 64 28 46 74 73 35  erLoadRowid(Fts5
c7c0: 49 6e 64 65 78 20 2a 70 2c 20 46 74 73 35 53 65  Index *p, Fts5Se
c7d0: 67 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a 20  gIter *pIter){. 
c7e0: 20 75 38 20 2a 61 20 3d 20 70 49 74 65 72 2d 3e   u8 *a = pIter->
c7f0: 70 4c 65 61 66 2d 3e 70 3b 20 20 20 20 20 20 20  pLeaf->p;       
c800: 20 2f 2a 20 42 75 66 66 65 72 20 74 6f 20 72 65   /* Buffer to re
c810: 61 64 20 64 61 74 61 20 66 72 6f 6d 20 2a 2f 0a  ad data from */.
c820: 20 20 69 6e 74 20 69 4f 66 66 20 3d 20 70 49 74    int iOff = pIt
c830: 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 3b  er->iLeafOffset;
c840: 0a 0a 20 20 41 53 53 45 52 54 5f 53 5a 4c 45 41  ..  ASSERT_SZLEA
c850: 46 5f 4f 4b 28 70 49 74 65 72 2d 3e 70 4c 65 61  F_OK(pIter->pLea
c860: 66 29 3b 0a 20 20 69 66 28 20 69 4f 66 66 3e 3d  f);.  if( iOff>=
c870: 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 73 7a  pIter->pLeaf->sz
c880: 4c 65 61 66 20 29 7b 0a 20 20 20 20 66 74 73 35  Leaf ){.    fts5
c890: 53 65 67 49 74 65 72 4e 65 78 74 50 61 67 65 28  SegIterNextPage(
c8a0: 70 2c 20 70 49 74 65 72 29 3b 0a 20 20 20 20 69  p, pIter);.    i
c8b0: 66 28 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 3d  f( pIter->pLeaf=
c8c0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  =0 ){.      if( 
c8d0: 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
c8e0: 20 29 20 70 2d 3e 72 63 20 3d 20 46 54 53 35 5f   ) p->rc = FTS5_
c8f0: 43 4f 52 52 55 50 54 3b 0a 20 20 20 20 20 20 72  CORRUPT;.      r
c900: 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20  eturn;.    }.   
c910: 20 69 4f 66 66 20 3d 20 34 3b 0a 20 20 20 20 61   iOff = 4;.    a
c920: 20 3d 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d   = pIter->pLeaf-
c930: 3e 70 3b 0a 20 20 7d 0a 20 20 69 4f 66 66 20 2b  >p;.  }.  iOff +
c940: 3d 20 73 71 6c 69 74 65 33 46 74 73 35 47 65 74  = sqlite3Fts5Get
c950: 56 61 72 69 6e 74 28 26 61 5b 69 4f 66 66 5d 2c  Varint(&a[iOff],
c960: 20 28 75 36 34 2a 29 26 70 49 74 65 72 2d 3e 69   (u64*)&pIter->i
c970: 52 6f 77 69 64 29 3b 0a 20 20 70 49 74 65 72 2d  Rowid);.  pIter-
c980: 3e 69 4c 65 61 66 4f 66 66 73 65 74 20 3d 20 69  >iLeafOffset = i
c990: 4f 66 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 74  Off;.}../*.** Ft
c9a0: 73 35 53 65 67 49 74 65 72 2e 69 4c 65 61 66 4f  s5SegIter.iLeafO
c9b0: 66 66 73 65 74 20 63 75 72 72 65 6e 74 6c 79 20  ffset currently 
c9c0: 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 66 69  points to the fi
c9d0: 72 73 74 20 62 79 74 65 20 6f 66 20 74 68 65 20  rst byte of the 
c9e0: 0a 2a 2a 20 22 6e 53 75 66 66 69 78 22 20 66 69  .** "nSuffix" fi
c9f0: 65 6c 64 20 6f 66 20 61 20 74 65 72 6d 2e 20 46  eld of a term. F
ca00: 75 6e 63 74 69 6f 6e 20 70 61 72 61 6d 65 74 65  unction paramete
ca10: 72 20 6e 4b 65 65 70 20 63 6f 6e 74 61 69 6e 73  r nKeep contains
ca20: 20 74 68 65 20 76 61 6c 75 65 0a 2a 2a 20 6f 66   the value.** of
ca30: 20 74 68 65 20 22 6e 50 72 65 66 69 78 22 20 66   the "nPrefix" f
ca40: 69 65 6c 64 20 28 69 66 20 74 68 65 72 65 20 77  ield (if there w
ca50: 61 73 20 6f 6e 65 20 2d 20 69 74 20 69 73 20 70  as one - it is p
ca60: 61 73 73 65 64 20 30 20 69 66 20 74 68 69 73 20  assed 0 if this 
ca70: 69 73 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20  is.** the first 
ca80: 74 65 72 6d 20 69 6e 20 74 68 65 20 73 65 67 6d  term in the segm
ca90: 65 6e 74 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ent)..**.** This
caa0: 20 66 75 6e 63 74 69 6f 6e 20 70 6f 70 75 6c 61   function popula
cab0: 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 46 74 73  tes:.**.**   Fts
cac0: 35 53 65 67 49 74 65 72 2e 74 65 72 6d 0a 2a 2a  5SegIter.term.**
cad0: 20 20 20 46 74 73 35 53 65 67 49 74 65 72 2e 72     Fts5SegIter.r
cae0: 6f 77 69 64 0a 2a 2a 0a 2a 2a 20 61 63 63 6f 72  owid.**.** accor
caf0: 64 69 6e 67 6c 79 20 61 6e 64 20 6c 65 61 76 65  dingly and leave
cb00: 73 20 28 46 74 73 35 53 65 67 49 74 65 72 2e 69  s (Fts5SegIter.i
cb10: 4c 65 61 66 4f 66 66 73 65 74 29 20 73 65 74 20  LeafOffset) set 
cb20: 74 6f 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f  to the content o
cb30: 66 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20 70  f.** the first p
cb40: 6f 73 69 74 69 6f 6e 20 6c 69 73 74 2e 20 54 68  osition list. Th
cb50: 65 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74 20  e position list 
cb60: 62 65 6c 6f 6e 67 69 6e 67 20 74 6f 20 64 6f 63  belonging to doc
cb70: 75 6d 65 6e 74 20 0a 2a 2a 20 28 46 74 73 35 53  ument .** (Fts5S
cb80: 65 67 49 74 65 72 2e 69 52 6f 77 69 64 29 2e 0a  egIter.iRowid)..
cb90: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
cba0: 74 73 35 53 65 67 49 74 65 72 4c 6f 61 64 54 65  ts5SegIterLoadTe
cbb0: 72 6d 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c  rm(Fts5Index *p,
cbc0: 20 46 74 73 35 53 65 67 49 74 65 72 20 2a 70 49   Fts5SegIter *pI
cbd0: 74 65 72 2c 20 69 6e 74 20 6e 4b 65 65 70 29 7b  ter, int nKeep){
cbe0: 0a 20 20 75 38 20 2a 61 20 3d 20 70 49 74 65 72  .  u8 *a = pIter
cbf0: 2d 3e 70 4c 65 61 66 2d 3e 70 3b 20 20 20 20 20  ->pLeaf->p;     
cc00: 20 20 20 2f 2a 20 42 75 66 66 65 72 20 74 6f 20     /* Buffer to 
cc10: 72 65 61 64 20 64 61 74 61 20 66 72 6f 6d 20 2a  read data from *
cc20: 2f 0a 20 20 69 6e 74 20 69 4f 66 66 20 3d 20 70  /.  int iOff = p
cc30: 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65  Iter->iLeafOffse
cc40: 74 3b 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f  t;  /* Offset to
cc50: 20 72 65 61 64 20 61 74 20 2a 2f 0a 20 20 69 6e   read at */.  in
cc60: 74 20 6e 4e 65 77 3b 20 20 20 20 20 20 20 20 20  t nNew;         
cc70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
cc80: 20 42 79 74 65 73 20 6f 66 20 6e 65 77 20 64 61   Bytes of new da
cc90: 74 61 20 2a 2f 0a 0a 20 20 69 4f 66 66 20 2b 3d  ta */..  iOff +=
cca0: 20 66 74 73 35 47 65 74 56 61 72 69 6e 74 33 32   fts5GetVarint32
ccb0: 28 26 61 5b 69 4f 66 66 5d 2c 20 6e 4e 65 77 29  (&a[iOff], nNew)
ccc0: 3b 0a 20 20 69 66 28 20 69 4f 66 66 2b 6e 4e 65  ;.  if( iOff+nNe
ccd0: 77 3e 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e  w>pIter->pLeaf->
cce0: 6e 6e 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20  nn ){.    p->rc 
ccf0: 3d 20 46 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a  = FTS5_CORRUPT;.
cd00: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
cd10: 20 20 70 49 74 65 72 2d 3e 74 65 72 6d 2e 6e 20    pIter->term.n 
cd20: 3d 20 6e 4b 65 65 70 3b 0a 20 20 66 74 73 35 42  = nKeep;.  fts5B
cd30: 75 66 66 65 72 41 70 70 65 6e 64 42 6c 6f 62 28  ufferAppendBlob(
cd40: 26 70 2d 3e 72 63 2c 20 26 70 49 74 65 72 2d 3e  &p->rc, &pIter->
cd50: 74 65 72 6d 2c 20 6e 4e 65 77 2c 20 26 61 5b 69  term, nNew, &a[i
cd60: 4f 66 66 5d 29 3b 0a 20 20 69 4f 66 66 20 2b 3d  Off]);.  iOff +=
cd70: 20 6e 4e 65 77 3b 0a 20 20 70 49 74 65 72 2d 3e   nNew;.  pIter->
cd80: 69 54 65 72 6d 4c 65 61 66 4f 66 66 73 65 74 20  iTermLeafOffset 
cd90: 3d 20 69 4f 66 66 3b 0a 20 20 70 49 74 65 72 2d  = iOff;.  pIter-
cda0: 3e 69 54 65 72 6d 4c 65 61 66 50 67 6e 6f 20 3d  >iTermLeafPgno =
cdb0: 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e   pIter->iLeafPgn
cdc0: 6f 3b 0a 20 20 70 49 74 65 72 2d 3e 69 4c 65 61  o;.  pIter->iLea
cdd0: 66 4f 66 66 73 65 74 20 3d 20 69 4f 66 66 3b 0a  fOffset = iOff;.
cde0: 0a 20 20 69 66 28 20 70 49 74 65 72 2d 3e 69 50  .  if( pIter->iP
cdf0: 67 69 64 78 4f 66 66 3e 3d 70 49 74 65 72 2d 3e  gidxOff>=pIter->
ce00: 70 4c 65 61 66 2d 3e 6e 6e 20 29 7b 0a 20 20 20  pLeaf->nn ){.   
ce10: 20 70 49 74 65 72 2d 3e 69 45 6e 64 6f 66 44 6f   pIter->iEndofDo
ce20: 63 6c 69 73 74 20 3d 20 70 49 74 65 72 2d 3e 70  clist = pIter->p
ce30: 4c 65 61 66 2d 3e 6e 6e 2b 31 3b 0a 20 20 7d 65  Leaf->nn+1;.  }e
ce40: 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 6e 45 78  lse{.    int nEx
ce50: 74 72 61 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e  tra;.    pIter->
ce60: 69 50 67 69 64 78 4f 66 66 20 2b 3d 20 66 74 73  iPgidxOff += fts
ce70: 35 47 65 74 56 61 72 69 6e 74 33 32 28 26 61 5b  5GetVarint32(&a[
ce80: 70 49 74 65 72 2d 3e 69 50 67 69 64 78 4f 66 66  pIter->iPgidxOff
ce90: 5d 2c 20 6e 45 78 74 72 61 29 3b 0a 20 20 20 20  ], nExtra);.    
cea0: 70 49 74 65 72 2d 3e 69 45 6e 64 6f 66 44 6f 63  pIter->iEndofDoc
ceb0: 6c 69 73 74 20 2b 3d 20 6e 45 78 74 72 61 3b 0a  list += nExtra;.
cec0: 20 20 7d 0a 0a 20 20 66 74 73 35 53 65 67 49 74    }..  fts5SegIt
ced0: 65 72 4c 6f 61 64 52 6f 77 69 64 28 70 2c 20 70  erLoadRowid(p, p
cee0: 49 74 65 72 29 3b 0a 7d 0a 0a 73 74 61 74 69 63  Iter);.}..static
cef0: 20 76 6f 69 64 20 66 74 73 35 53 65 67 49 74 65   void fts5SegIte
cf00: 72 4e 65 78 74 28 46 74 73 35 49 6e 64 65 78 2a  rNext(Fts5Index*
cf10: 2c 20 46 74 73 35 53 65 67 49 74 65 72 2a 2c 20  , Fts5SegIter*, 
cf20: 69 6e 74 2a 29 3b 0a 73 74 61 74 69 63 20 76 6f  int*);.static vo
cf30: 69 64 20 66 74 73 35 53 65 67 49 74 65 72 4e 65  id fts5SegIterNe
cf40: 78 74 5f 52 65 76 65 72 73 65 28 46 74 73 35 49  xt_Reverse(Fts5I
cf50: 6e 64 65 78 2a 2c 20 46 74 73 35 53 65 67 49 74  ndex*, Fts5SegIt
cf60: 65 72 2a 2c 20 69 6e 74 2a 29 3b 0a 73 74 61 74  er*, int*);.stat
cf70: 69 63 20 76 6f 69 64 20 66 74 73 35 53 65 67 49  ic void fts5SegI
cf80: 74 65 72 4e 65 78 74 5f 4e 6f 6e 65 28 46 74 73  terNext_None(Fts
cf90: 35 49 6e 64 65 78 2a 2c 20 46 74 73 35 53 65 67  5Index*, Fts5Seg
cfa0: 49 74 65 72 2a 2c 20 69 6e 74 2a 29 3b 0a 0a 73  Iter*, int*);..s
cfb0: 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 53  tatic void fts5S
cfc0: 65 67 49 74 65 72 53 65 74 4e 65 78 74 28 46 74  egIterSetNext(Ft
cfd0: 73 35 49 6e 64 65 78 20 2a 70 2c 20 46 74 73 35  s5Index *p, Fts5
cfe0: 53 65 67 49 74 65 72 20 2a 70 49 74 65 72 29 7b  SegIter *pIter){
cff0: 0a 20 20 69 66 28 20 70 49 74 65 72 2d 3e 66 6c  .  if( pIter->fl
d000: 61 67 73 20 26 20 46 54 53 35 5f 53 45 47 49 54  ags & FTS5_SEGIT
d010: 45 52 5f 52 45 56 45 52 53 45 20 29 7b 0a 20 20  ER_REVERSE ){.  
d020: 20 20 70 49 74 65 72 2d 3e 78 4e 65 78 74 20 3d    pIter->xNext =
d030: 20 66 74 73 35 53 65 67 49 74 65 72 4e 65 78 74   fts5SegIterNext
d040: 5f 52 65 76 65 72 73 65 3b 0a 20 20 7d 65 6c 73  _Reverse;.  }els
d050: 65 20 69 66 28 20 70 2d 3e 70 43 6f 6e 66 69 67  e if( p->pConfig
d060: 2d 3e 65 44 65 74 61 69 6c 3d 3d 46 54 53 35 5f  ->eDetail==FTS5_
d070: 44 45 54 41 49 4c 5f 4e 4f 4e 45 20 29 7b 0a 20  DETAIL_NONE ){. 
d080: 20 20 20 70 49 74 65 72 2d 3e 78 4e 65 78 74 20     pIter->xNext 
d090: 3d 20 66 74 73 35 53 65 67 49 74 65 72 4e 65 78  = fts5SegIterNex
d0a0: 74 5f 4e 6f 6e 65 3b 0a 20 20 7d 65 6c 73 65 7b  t_None;.  }else{
d0b0: 0a 20 20 20 20 70 49 74 65 72 2d 3e 78 4e 65 78  .    pIter->xNex
d0c0: 74 20 3d 20 66 74 73 35 53 65 67 49 74 65 72 4e  t = fts5SegIterN
d0d0: 65 78 74 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  ext;.  }.}../*.*
d0e0: 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65  * Initialize the
d0f0: 20 69 74 65 72 61 74 6f 72 20 6f 62 6a 65 63 74   iterator object
d100: 20 70 49 74 65 72 20 74 6f 20 69 74 65 72 61 74   pIter to iterat
d110: 65 20 74 68 72 6f 75 67 68 20 74 68 65 20 65 6e  e through the en
d120: 74 72 69 65 73 20 69 6e 0a 2a 2a 20 73 65 67 6d  tries in.** segm
d130: 65 6e 74 20 70 53 65 67 2e 20 54 68 65 20 69 74  ent pSeg. The it
d140: 65 72 61 74 6f 72 20 69 73 20 6c 65 66 74 20 70  erator is left p
d150: 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 65 20 66  ointing to the f
d160: 69 72 73 74 20 65 6e 74 72 79 20 77 68 65 6e 20  irst entry when 
d170: 0a 2a 2a 20 74 68 69 73 20 66 75 6e 63 74 69 6f  .** this functio
d180: 6e 20 72 65 74 75 72 6e 73 2e 0a 2a 2a 0a 2a 2a  n returns..**.**
d190: 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
d1a0: 75 72 73 2c 20 46 74 73 35 49 6e 64 65 78 2e 72  urs, Fts5Index.r
d1b0: 63 20 69 73 20 73 65 74 20 74 6f 20 61 6e 20 61  c is set to an a
d1c0: 70 70 72 6f 70 72 69 61 74 65 20 65 72 72 6f 72  ppropriate error
d1d0: 20 63 6f 64 65 2e 20 49 66 20 0a 2a 2a 20 61 6e   code. If .** an
d1e0: 20 65 72 72 6f 72 20 68 61 73 20 61 6c 72 65 61   error has alrea
d1f0: 64 79 20 6f 63 63 75 72 72 65 64 20 77 68 65 6e  dy occurred when
d200: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
d210: 73 20 63 61 6c 6c 65 64 2c 20 69 74 20 69 73 20  s called, it is 
d220: 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74  a no-op..*/.stat
d230: 69 63 20 76 6f 69 64 20 66 74 73 35 53 65 67 49  ic void fts5SegI
d240: 74 65 72 49 6e 69 74 28 0a 20 20 46 74 73 35 49  terInit(.  Fts5I
d250: 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20  ndex *p,        
d260: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54             /* FT
d270: 53 20 69 6e 64 65 78 20 6f 62 6a 65 63 74 20 2a  S index object *
d280: 2f 0a 20 20 46 74 73 35 53 74 72 75 63 74 75 72  /.  Fts5Structur
d290: 65 53 65 67 6d 65 6e 74 20 2a 70 53 65 67 2c 20  eSegment *pSeg, 
d2a0: 20 20 20 20 2f 2a 20 44 65 73 63 72 69 70 74 69      /* Descripti
d2b0: 6f 6e 20 6f 66 20 73 65 67 6d 65 6e 74 20 2a 2f  on of segment */
d2c0: 0a 20 20 46 74 73 35 53 65 67 49 74 65 72 20 2a  .  Fts5SegIter *
d2d0: 70 49 74 65 72 20 20 20 20 20 20 20 20 20 20 20  pIter           
d2e0: 20 20 20 2f 2a 20 4f 62 6a 65 63 74 20 74 6f 20     /* Object to 
d2f0: 70 6f 70 75 6c 61 74 65 20 2a 2f 0a 29 7b 0a 20  populate */.){. 
d300: 20 69 66 28 20 70 53 65 67 2d 3e 70 67 6e 6f 46   if( pSeg->pgnoF
d310: 69 72 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 2f  irst==0 ){.    /
d320: 2a 20 54 68 69 73 20 68 61 70 70 65 6e 73 20 69  * This happens i
d330: 66 20 74 68 65 20 73 65 67 6d 65 6e 74 20 69 73  f the segment is
d340: 20 62 65 69 6e 67 20 75 73 65 64 20 61 73 20 61   being used as a
d350: 6e 20 69 6e 70 75 74 20 74 6f 20 61 6e 20 69 6e  n input to an in
d360: 63 72 65 6d 65 6e 74 61 6c 0a 20 20 20 20 2a 2a  cremental.    **
d370: 20 6d 65 72 67 65 20 61 6e 64 20 61 6c 6c 20 64   merge and all d
d380: 61 74 61 20 68 61 73 20 61 6c 72 65 61 64 79 20  ata has already 
d390: 62 65 65 6e 20 22 74 72 69 6d 6d 65 64 22 2e 20  been "trimmed". 
d3a0: 53 65 65 20 66 75 6e 63 74 69 6f 6e 0a 20 20 20  See function.   
d3b0: 20 2a 2a 20 66 74 73 35 54 72 69 6d 53 65 67 6d   ** fts5TrimSegm
d3c0: 65 6e 74 73 28 29 20 66 6f 72 20 64 65 74 61 69  ents() for detai
d3d0: 6c 73 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  ls. In this case
d3e0: 20 6c 65 61 76 65 20 74 68 65 20 69 74 65 72 61   leave the itera
d3f0: 74 6f 72 20 65 6d 70 74 79 2e 0a 20 20 20 20 2a  tor empty..    *
d400: 2a 20 54 68 65 20 63 61 6c 6c 65 72 20 77 69 6c  * The caller wil
d410: 6c 20 73 65 65 20 74 68 65 20 28 70 49 74 65 72  l see the (pIter
d420: 2d 3e 70 4c 65 61 66 3d 3d 30 29 20 61 6e 64 20  ->pLeaf==0) and 
d430: 61 73 73 75 6d 65 20 74 68 65 20 69 74 65 72 61  assume the itera
d440: 74 6f 72 20 69 73 0a 20 20 20 20 2a 2a 20 61 74  tor is.    ** at
d450: 20 45 4f 46 20 61 6c 72 65 61 64 79 2e 20 2a 2f   EOF already. */
d460: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49 74  .    assert( pIt
d470: 65 72 2d 3e 70 4c 65 61 66 3d 3d 30 20 29 3b 0a  er->pLeaf==0 );.
d480: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
d490: 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51  .  if( p->rc==SQ
d4a0: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 6d  LITE_OK ){.    m
d4b0: 65 6d 73 65 74 28 70 49 74 65 72 2c 20 30 2c 20  emset(pIter, 0, 
d4c0: 73 69 7a 65 6f 66 28 2a 70 49 74 65 72 29 29 3b  sizeof(*pIter));
d4d0: 0a 20 20 20 20 66 74 73 35 53 65 67 49 74 65 72  .    fts5SegIter
d4e0: 53 65 74 4e 65 78 74 28 70 2c 20 70 49 74 65 72  SetNext(p, pIter
d4f0: 29 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 70 53  );.    pIter->pS
d500: 65 67 20 3d 20 70 53 65 67 3b 0a 20 20 20 20 70  eg = pSeg;.    p
d510: 49 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 20  Iter->iLeafPgno 
d520: 3d 20 70 53 65 67 2d 3e 70 67 6e 6f 46 69 72 73  = pSeg->pgnoFirs
d530: 74 2d 31 3b 0a 20 20 20 20 66 74 73 35 53 65 67  t-1;.    fts5Seg
d540: 49 74 65 72 4e 65 78 74 50 61 67 65 28 70 2c 20  IterNextPage(p, 
d550: 70 49 74 65 72 29 3b 0a 20 20 7d 0a 0a 20 20 69  pIter);.  }..  i
d560: 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  f( p->rc==SQLITE
d570: 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 49 74 65 72  _OK ){.    pIter
d580: 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 20 3d 20  ->iLeafOffset = 
d590: 34 3b 0a 20 20 20 20 61 73 73 65 72 74 5f 6e 63  4;.    assert_nc
d5a0: 28 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e  ( pIter->pLeaf->
d5b0: 6e 6e 3e 34 20 29 3b 0a 20 20 20 20 61 73 73 65  nn>4 );.    asse
d5c0: 72 74 28 20 66 74 73 35 4c 65 61 66 46 69 72 73  rt( fts5LeafFirs
d5d0: 74 54 65 72 6d 4f 66 66 28 70 49 74 65 72 2d 3e  tTermOff(pIter->
d5e0: 70 4c 65 61 66 29 3d 3d 34 20 29 3b 0a 20 20 20  pLeaf)==4 );.   
d5f0: 20 70 49 74 65 72 2d 3e 69 50 67 69 64 78 4f 66   pIter->iPgidxOf
d600: 66 20 3d 20 70 49 74 65 72 2d 3e 70 4c 65 61 66  f = pIter->pLeaf
d610: 2d 3e 73 7a 4c 65 61 66 2b 31 3b 0a 20 20 20 20  ->szLeaf+1;.    
d620: 66 74 73 35 53 65 67 49 74 65 72 4c 6f 61 64 54  fts5SegIterLoadT
d630: 65 72 6d 28 70 2c 20 70 49 74 65 72 2c 20 30 29  erm(p, pIter, 0)
d640: 3b 0a 20 20 20 20 66 74 73 35 53 65 67 49 74 65  ;.    fts5SegIte
d650: 72 4c 6f 61 64 4e 50 6f 73 28 70 2c 20 70 49 74  rLoadNPos(p, pIt
d660: 65 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  er);.  }.}../*.*
d670: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
d680: 69 73 20 6f 6e 6c 79 20 65 76 65 72 20 63 61 6c  is only ever cal
d690: 6c 65 64 20 6f 6e 20 69 74 65 72 61 74 6f 72 73  led on iterators
d6a0: 20 63 72 65 61 74 65 64 20 62 79 20 63 61 6c 6c   created by call
d6b0: 73 20 74 6f 0a 2a 2a 20 46 74 73 35 49 6e 64 65  s to.** Fts5Inde
d6c0: 78 51 75 65 72 79 28 29 20 77 69 74 68 20 74 68  xQuery() with th
d6d0: 65 20 46 54 53 35 49 4e 44 45 58 5f 51 55 45 52  e FTS5INDEX_QUER
d6e0: 59 5f 44 45 53 43 20 66 6c 61 67 20 73 65 74 2e  Y_DESC flag set.
d6f0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 74 65 72 61  .**.** The itera
d700: 74 6f 72 20 69 73 20 69 6e 20 61 6e 20 75 6e 75  tor is in an unu
d710: 73 75 61 6c 20 73 74 61 74 65 20 77 68 65 6e 20  sual state when 
d720: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
d730: 20 63 61 6c 6c 65 64 3a 20 74 68 65 0a 2a 2a 20   called: the.** 
d740: 46 74 73 35 53 65 67 49 74 65 72 2e 69 4c 65 61  Fts5SegIter.iLea
d750: 66 4f 66 66 73 65 74 20 76 61 72 69 61 62 6c 65  fOffset variable
d760: 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 6f   is set to the o
d770: 66 66 73 65 74 20 6f 66 20 74 68 65 20 73 74 61  ffset of the sta
d780: 72 74 20 6f 66 0a 2a 2a 20 74 68 65 20 70 6f 73  rt of.** the pos
d790: 69 74 69 6f 6e 2d 6c 69 73 74 20 73 69 7a 65 20  ition-list size 
d7a0: 66 69 65 6c 64 20 66 6f 72 20 74 68 65 20 66 69  field for the fi
d7b0: 72 73 74 20 72 65 6c 65 76 61 6e 74 20 72 6f 77  rst relevant row
d7c0: 69 64 20 6f 6e 20 74 68 65 20 70 61 67 65 2e 0a  id on the page..
d7d0: 2a 2a 20 46 74 73 35 53 65 67 49 74 65 72 2e 72  ** Fts5SegIter.r
d7e0: 6f 77 69 64 20 69 73 20 73 65 74 2c 20 62 75 74  owid is set, but
d7f0: 20 6e 50 6f 73 20 61 6e 64 20 62 44 65 6c 20 61   nPos and bDel a
d800: 72 65 20 6e 6f 74 2e 0a 2a 2a 0a 2a 2a 20 54 68  re not..**.** Th
d810: 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 64 76 61  is function adva
d820: 6e 63 65 73 20 74 68 65 20 69 74 65 72 61 74 6f  nces the iterato
d830: 72 20 73 6f 20 74 68 61 74 20 69 74 20 70 6f 69  r so that it poi
d840: 6e 74 73 20 74 6f 20 74 68 65 20 6c 61 73 74 20  nts to the last 
d850: 0a 2a 2a 20 72 65 6c 65 76 61 6e 74 20 72 6f 77  .** relevant row
d860: 69 64 20 6f 6e 20 74 68 65 20 70 61 67 65 20 61  id on the page a
d870: 6e 64 2c 20 69 66 20 6e 65 63 65 73 73 61 72 79  nd, if necessary
d880: 2c 20 69 6e 69 74 69 61 6c 69 7a 65 73 20 74 68  , initializes th
d890: 65 20 0a 2a 2a 20 61 52 6f 77 69 64 4f 66 66 73  e .** aRowidOffs
d8a0: 65 74 5b 5d 20 61 6e 64 20 69 52 6f 77 69 64 4f  et[] and iRowidO
d8b0: 66 66 73 65 74 20 76 61 72 69 61 62 6c 65 73 2e  ffset variables.
d8c0: 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 20 74   At this point t
d8d0: 68 65 20 69 74 65 72 61 74 6f 72 0a 2a 2a 20 69  he iterator.** i
d8e0: 73 20 69 6e 20 69 74 73 20 72 65 67 75 6c 61 72  s in its regular
d8f0: 20 73 74 61 74 65 20 2d 20 46 74 73 35 53 65 67   state - Fts5Seg
d900: 49 74 65 72 2e 69 4c 65 61 66 4f 66 66 73 65 74  Iter.iLeafOffset
d910: 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 66   points to the f
d920: 69 72 73 74 0a 2a 2a 20 62 79 74 65 20 6f 66 20  irst.** byte of 
d930: 74 68 65 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73  the position lis
d940: 74 20 63 6f 6e 74 65 6e 74 20 61 73 73 6f 63 69  t content associ
d950: 61 74 65 64 20 77 69 74 68 20 73 61 69 64 20 72  ated with said r
d960: 6f 77 69 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  owid..*/.static 
d970: 76 6f 69 64 20 66 74 73 35 53 65 67 49 74 65 72  void fts5SegIter
d980: 52 65 76 65 72 73 65 49 6e 69 74 50 61 67 65 28  ReverseInitPage(
d990: 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 46 74  Fts5Index *p, Ft
d9a0: 73 35 53 65 67 49 74 65 72 20 2a 70 49 74 65 72  s5SegIter *pIter
d9b0: 29 7b 0a 20 20 69 6e 74 20 65 44 65 74 61 69 6c  ){.  int eDetail
d9c0: 20 3d 20 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e 65   = p->pConfig->e
d9d0: 44 65 74 61 69 6c 3b 0a 20 20 69 6e 74 20 6e 20  Detail;.  int n 
d9e0: 3d 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e  = pIter->pLeaf->
d9f0: 73 7a 4c 65 61 66 3b 0a 20 20 69 6e 74 20 69 20  szLeaf;.  int i 
da00: 3d 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66  = pIter->iLeafOf
da10: 66 73 65 74 3b 0a 20 20 75 38 20 2a 61 20 3d 20  fset;.  u8 *a = 
da20: 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 70 3b  pIter->pLeaf->p;
da30: 0a 20 20 69 6e 74 20 69 52 6f 77 69 64 4f 66 66  .  int iRowidOff
da40: 73 65 74 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20  set = 0;..  if( 
da50: 6e 3e 70 49 74 65 72 2d 3e 69 45 6e 64 6f 66 44  n>pIter->iEndofD
da60: 6f 63 6c 69 73 74 20 29 7b 0a 20 20 20 20 6e 20  oclist ){.    n 
da70: 3d 20 70 49 74 65 72 2d 3e 69 45 6e 64 6f 66 44  = pIter->iEndofD
da80: 6f 63 6c 69 73 74 3b 0a 20 20 7d 0a 0a 20 20 41  oclist;.  }..  A
da90: 53 53 45 52 54 5f 53 5a 4c 45 41 46 5f 4f 4b 28  SSERT_SZLEAF_OK(
daa0: 70 49 74 65 72 2d 3e 70 4c 65 61 66 29 3b 0a 20  pIter->pLeaf);. 
dab0: 20 77 68 69 6c 65 28 20 31 20 29 7b 0a 20 20 20   while( 1 ){.   
dac0: 20 69 36 34 20 69 44 65 6c 74 61 20 3d 20 30 3b   i64 iDelta = 0;
dad0: 0a 0a 20 20 20 20 69 66 28 20 65 44 65 74 61 69  ..    if( eDetai
dae0: 6c 3d 3d 46 54 53 35 5f 44 45 54 41 49 4c 5f 4e  l==FTS5_DETAIL_N
daf0: 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  ONE ){.      /* 
db00: 74 6f 64 6f 20 2a 2f 0a 20 20 20 20 20 20 69 66  todo */.      if
db10: 28 20 69 3c 6e 20 26 26 20 61 5b 69 5d 3d 3d 30  ( i<n && a[i]==0
db20: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 2b 2b 3b   ){.        i++;
db30: 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 3c 6e  .        if( i<n
db40: 20 26 26 20 61 5b 69 5d 3d 3d 30 20 29 20 69 2b   && a[i]==0 ) i+
db50: 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  +;.      }.    }
db60: 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20  else{.      int 
db70: 6e 50 6f 73 3b 0a 20 20 20 20 20 20 69 6e 74 20  nPos;.      int 
db80: 62 44 75 6d 6d 79 3b 0a 20 20 20 20 20 20 69 20  bDummy;.      i 
db90: 2b 3d 20 66 74 73 35 47 65 74 50 6f 73 6c 69 73  += fts5GetPoslis
dba0: 74 53 69 7a 65 28 26 61 5b 69 5d 2c 20 26 6e 50  tSize(&a[i], &nP
dbb0: 6f 73 2c 20 26 62 44 75 6d 6d 79 29 3b 0a 20 20  os, &bDummy);.  
dbc0: 20 20 20 20 69 20 2b 3d 20 6e 50 6f 73 3b 0a 20      i += nPos;. 
dbd0: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 3e 3d     }.    if( i>=
dbe0: 6e 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 69  n ) break;.    i
dbf0: 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e   += fts5GetVarin
dc00: 74 28 26 61 5b 69 5d 2c 20 28 75 36 34 2a 29 26  t(&a[i], (u64*)&
dc10: 69 44 65 6c 74 61 29 3b 0a 20 20 20 20 70 49 74  iDelta);.    pIt
dc20: 65 72 2d 3e 69 52 6f 77 69 64 20 2b 3d 20 69 44  er->iRowid += iD
dc30: 65 6c 74 61 3b 0a 0a 20 20 20 20 2f 2a 20 49 66  elta;..    /* If
dc40: 20 6e 65 63 65 73 73 61 72 79 2c 20 67 72 6f 77   necessary, grow
dc50: 20 74 68 65 20 70 49 74 65 72 2d 3e 61 52 6f 77   the pIter->aRow
dc60: 69 64 4f 66 66 73 65 74 5b 5d 20 61 72 72 61 79  idOffset[] array
dc70: 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 69 52 6f  . */.    if( iRo
dc80: 77 69 64 4f 66 66 73 65 74 3e 3d 70 49 74 65 72  widOffset>=pIter
dc90: 2d 3e 6e 52 6f 77 69 64 4f 66 66 73 65 74 20 29  ->nRowidOffset )
dca0: 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 4e 65 77  {.      int nNew
dcb0: 20 3d 20 70 49 74 65 72 2d 3e 6e 52 6f 77 69 64   = pIter->nRowid
dcc0: 4f 66 66 73 65 74 20 2b 20 38 3b 0a 20 20 20 20  Offset + 8;.    
dcd0: 20 20 69 6e 74 20 2a 61 4e 65 77 20 3d 20 28 69    int *aNew = (i
dce0: 6e 74 2a 29 73 71 6c 69 74 65 33 5f 72 65 61 6c  nt*)sqlite3_real
dcf0: 6c 6f 63 28 70 49 74 65 72 2d 3e 61 52 6f 77 69  loc(pIter->aRowi
dd00: 64 4f 66 66 73 65 74 2c 20 6e 4e 65 77 2a 73 69  dOffset, nNew*si
dd10: 7a 65 6f 66 28 69 6e 74 29 29 3b 0a 20 20 20 20  zeof(int));.    
dd20: 20 20 69 66 28 20 61 4e 65 77 3d 3d 30 20 29 7b    if( aNew==0 ){
dd30: 0a 20 20 20 20 20 20 20 20 70 2d 3e 72 63 20 3d  .        p->rc =
dd40: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
dd50: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
dd60: 20 20 20 20 7d 0a 20 20 20 20 20 20 70 49 74 65      }.      pIte
dd70: 72 2d 3e 61 52 6f 77 69 64 4f 66 66 73 65 74 20  r->aRowidOffset 
dd80: 3d 20 61 4e 65 77 3b 0a 20 20 20 20 20 20 70 49  = aNew;.      pI
dd90: 74 65 72 2d 3e 6e 52 6f 77 69 64 4f 66 66 73 65  ter->nRowidOffse
dda0: 74 20 3d 20 6e 4e 65 77 3b 0a 20 20 20 20 7d 0a  t = nNew;.    }.
ddb0: 0a 20 20 20 20 70 49 74 65 72 2d 3e 61 52 6f 77  .    pIter->aRow
ddc0: 69 64 4f 66 66 73 65 74 5b 69 52 6f 77 69 64 4f  idOffset[iRowidO
ddd0: 66 66 73 65 74 2b 2b 5d 20 3d 20 70 49 74 65 72  ffset++] = pIter
dde0: 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 3b 0a 20  ->iLeafOffset;. 
ddf0: 20 20 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f     pIter->iLeafO
de00: 66 66 73 65 74 20 3d 20 69 3b 0a 20 20 7d 0a 20  ffset = i;.  }. 
de10: 20 70 49 74 65 72 2d 3e 69 52 6f 77 69 64 4f 66   pIter->iRowidOf
de20: 66 73 65 74 20 3d 20 69 52 6f 77 69 64 4f 66 66  fset = iRowidOff
de30: 73 65 74 3b 0a 20 20 66 74 73 35 53 65 67 49 74  set;.  fts5SegIt
de40: 65 72 4c 6f 61 64 4e 50 6f 73 28 70 2c 20 70 49  erLoadNPos(p, pI
de50: 74 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 0a 2a  ter);.}../*.**.*
de60: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  /.static void ft
de70: 73 35 53 65 67 49 74 65 72 52 65 76 65 72 73 65  s5SegIterReverse
de80: 4e 65 77 50 61 67 65 28 46 74 73 35 49 6e 64 65  NewPage(Fts5Inde
de90: 78 20 2a 70 2c 20 46 74 73 35 53 65 67 49 74 65  x *p, Fts5SegIte
dea0: 72 20 2a 70 49 74 65 72 29 7b 0a 20 20 61 73 73  r *pIter){.  ass
deb0: 65 72 74 28 20 70 49 74 65 72 2d 3e 66 6c 61 67  ert( pIter->flag
dec0: 73 20 26 20 46 54 53 35 5f 53 45 47 49 54 45 52  s & FTS5_SEGITER
ded0: 5f 52 45 56 45 52 53 45 20 29 3b 0a 20 20 61 73  _REVERSE );.  as
dee0: 73 65 72 74 28 20 70 49 74 65 72 2d 3e 66 6c 61  sert( pIter->fla
def0: 67 73 20 26 20 46 54 53 35 5f 53 45 47 49 54 45  gs & FTS5_SEGITE
df00: 52 5f 4f 4e 45 54 45 52 4d 20 29 3b 0a 0a 20 20  R_ONETERM );..  
df10: 66 74 73 35 44 61 74 61 52 65 6c 65 61 73 65 28  fts5DataRelease(
df20: 70 49 74 65 72 2d 3e 70 4c 65 61 66 29 3b 0a 20  pIter->pLeaf);. 
df30: 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 20 3d 20   pIter->pLeaf = 
df40: 30 3b 0a 20 20 77 68 69 6c 65 28 20 70 2d 3e 72  0;.  while( p->r
df50: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
df60: 70 49 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f  pIter->iLeafPgno
df70: 3e 70 49 74 65 72 2d 3e 69 54 65 72 6d 4c 65 61  >pIter->iTermLea
df80: 66 50 67 6e 6f 20 29 7b 0a 20 20 20 20 46 74 73  fPgno ){.    Fts
df90: 35 44 61 74 61 20 2a 70 4e 65 77 3b 0a 20 20 20  5Data *pNew;.   
dfa0: 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e   pIter->iLeafPgn
dfb0: 6f 2d 2d 3b 0a 20 20 20 20 70 4e 65 77 20 3d 20  o--;.    pNew = 
dfc0: 66 74 73 35 44 61 74 61 52 65 61 64 28 70 2c 20  fts5DataRead(p, 
dfd0: 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f 52 4f 57  FTS5_SEGMENT_ROW
dfe0: 49 44 28 0a 20 20 20 20 20 20 20 20 20 20 70 49  ID(.          pI
dff0: 74 65 72 2d 3e 70 53 65 67 2d 3e 69 53 65 67 69  ter->pSeg->iSegi
e000: 64 2c 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 50  d, pIter->iLeafP
e010: 67 6e 6f 0a 20 20 20 20 29 29 3b 0a 20 20 20 20  gno.    ));.    
e020: 69 66 28 20 70 4e 65 77 20 29 7b 0a 20 20 20 20  if( pNew ){.    
e030: 20 20 2f 2a 20 69 54 65 72 6d 4c 65 61 66 4f 66    /* iTermLeafOf
e040: 66 73 65 74 20 6d 61 79 20 62 65 20 65 71 75 61  fset may be equa
e050: 6c 20 74 6f 20 73 7a 4c 65 61 66 20 69 66 20 74  l to szLeaf if t
e060: 68 65 20 74 65 72 6d 20 69 73 20 74 68 65 20 6c  he term is the l
e070: 61 73 74 0a 20 20 20 20 20 20 2a 2a 20 74 68 69  ast.      ** thi
e080: 6e 67 20 6f 6e 20 74 68 65 20 70 61 67 65 20 2d  ng on the page -
e090: 20 69 2e 65 2e 20 74 68 65 20 66 69 72 73 74 20   i.e. the first 
e0a0: 72 6f 77 69 64 20 69 73 20 6f 6e 20 74 68 65 20  rowid is on the 
e0b0: 66 6f 6c 6c 6f 77 69 6e 67 20 70 61 67 65 2e 0a  following page..
e0c0: 20 20 20 20 20 20 2a 2a 20 49 6e 20 74 68 69 73        ** In this
e0d0: 20 63 61 73 65 20 6c 65 61 76 65 20 70 49 74 65   case leave pIte
e0e0: 72 2d 3e 70 4c 65 61 66 3d 3d 30 2c 20 74 68 69  r->pLeaf==0, thi
e0f0: 73 20 69 74 65 72 61 74 6f 72 20 69 73 20 61 74  s iterator is at
e100: 20 45 4f 46 2e 20 2a 2f 0a 20 20 20 20 20 20 69   EOF. */.      i
e110: 66 28 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 50  f( pIter->iLeafP
e120: 67 6e 6f 3d 3d 70 49 74 65 72 2d 3e 69 54 65 72  gno==pIter->iTer
e130: 6d 4c 65 61 66 50 67 6e 6f 20 29 7b 0a 20 20 20  mLeafPgno ){.   
e140: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49 74       assert( pIt
e150: 65 72 2d 3e 70 4c 65 61 66 3d 3d 30 20 29 3b 0a  er->pLeaf==0 );.
e160: 20 20 20 20 20 20 20 20 69 66 28 20 70 49 74 65          if( pIte
e170: 72 2d 3e 69 54 65 72 6d 4c 65 61 66 4f 66 66 73  r->iTermLeafOffs
e180: 65 74 3c 70 4e 65 77 2d 3e 73 7a 4c 65 61 66 20  et<pNew->szLeaf 
e190: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 49 74  ){.          pIt
e1a0: 65 72 2d 3e 70 4c 65 61 66 20 3d 20 70 4e 65 77  er->pLeaf = pNew
e1b0: 3b 0a 20 20 20 20 20 20 20 20 20 20 70 49 74 65  ;.          pIte
e1c0: 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 20 3d  r->iLeafOffset =
e1d0: 20 70 49 74 65 72 2d 3e 69 54 65 72 6d 4c 65 61   pIter->iTermLea
e1e0: 66 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20 20  fOffset;.       
e1f0: 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a   }.      }else{.
e200: 20 20 20 20 20 20 20 20 69 6e 74 20 69 52 6f 77          int iRow
e210: 69 64 4f 66 66 3b 0a 20 20 20 20 20 20 20 20 69  idOff;.        i
e220: 52 6f 77 69 64 4f 66 66 20 3d 20 66 74 73 35 4c  RowidOff = fts5L
e230: 65 61 66 46 69 72 73 74 52 6f 77 69 64 4f 66 66  eafFirstRowidOff
e240: 28 70 4e 65 77 29 3b 0a 20 20 20 20 20 20 20 20  (pNew);.        
e250: 69 66 28 20 69 52 6f 77 69 64 4f 66 66 20 29 7b  if( iRowidOff ){
e260: 0a 20 20 20 20 20 20 20 20 20 20 70 49 74 65 72  .          pIter
e270: 2d 3e 70 4c 65 61 66 20 3d 20 70 4e 65 77 3b 0a  ->pLeaf = pNew;.
e280: 20 20 20 20 20 20 20 20 20 20 70 49 74 65 72 2d            pIter-
e290: 3e 69 4c 65 61 66 4f 66 66 73 65 74 20 3d 20 69  >iLeafOffset = i
e2a0: 52 6f 77 69 64 4f 66 66 3b 0a 20 20 20 20 20 20  RowidOff;.      
e2b0: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20    }.      }..   
e2c0: 20 20 20 69 66 28 20 70 49 74 65 72 2d 3e 70 4c     if( pIter->pL
e2d0: 65 61 66 20 29 7b 0a 20 20 20 20 20 20 20 20 75  eaf ){.        u
e2e0: 38 20 2a 61 20 3d 20 26 70 49 74 65 72 2d 3e 70  8 *a = &pIter->p
e2f0: 4c 65 61 66 2d 3e 70 5b 70 49 74 65 72 2d 3e 69  Leaf->p[pIter->i
e300: 4c 65 61 66 4f 66 66 73 65 74 5d 3b 0a 20 20 20  LeafOffset];.   
e310: 20 20 20 20 20 70 49 74 65 72 2d 3e 69 4c 65 61       pIter->iLea
e320: 66 4f 66 66 73 65 74 20 2b 3d 20 66 74 73 35 47  fOffset += fts5G
e330: 65 74 56 61 72 69 6e 74 28 61 2c 20 28 75 36 34  etVarint(a, (u64
e340: 2a 29 26 70 49 74 65 72 2d 3e 69 52 6f 77 69 64  *)&pIter->iRowid
e350: 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  );.        break
e360: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
e370: 20 20 20 20 20 20 20 66 74 73 35 44 61 74 61 52         fts5DataR
e380: 65 6c 65 61 73 65 28 70 4e 65 77 29 3b 0a 20 20  elease(pNew);.  
e390: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
e3a0: 0a 20 20 69 66 28 20 70 49 74 65 72 2d 3e 70 4c  .  if( pIter->pL
e3b0: 65 61 66 20 29 7b 0a 20 20 20 20 70 49 74 65 72  eaf ){.    pIter
e3c0: 2d 3e 69 45 6e 64 6f 66 44 6f 63 6c 69 73 74 20  ->iEndofDoclist 
e3d0: 3d 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e  = pIter->pLeaf->
e3e0: 6e 6e 2b 31 3b 0a 20 20 20 20 66 74 73 35 53 65  nn+1;.    fts5Se
e3f0: 67 49 74 65 72 52 65 76 65 72 73 65 49 6e 69 74  gIterReverseInit
e400: 50 61 67 65 28 70 2c 20 70 49 74 65 72 29 3b 0a  Page(p, pIter);.
e410: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74    }.}../*.** Ret
e420: 75 72 6e 20 74 72 75 65 20 69 66 20 74 68 65 20  urn true if the 
e430: 69 74 65 72 61 74 6f 72 20 70 61 73 73 65 64 20  iterator passed 
e440: 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72  as the second ar
e450: 67 75 6d 65 6e 74 20 63 75 72 72 65 6e 74 6c 79  gument currently
e460: 0a 2a 2a 20 70 6f 69 6e 74 73 20 74 6f 20 61 20  .** points to a 
e470: 64 65 6c 65 74 65 20 6d 61 72 6b 65 72 2e 20 41  delete marker. A
e480: 20 64 65 6c 65 74 65 20 6d 61 72 6b 65 72 20 69   delete marker i
e490: 73 20 61 6e 20 65 6e 74 72 79 20 77 69 74 68 20  s an entry with 
e4a0: 61 20 30 20 62 79 74 65 0a 2a 2a 20 70 6f 73 69  a 0 byte.** posi
e4b0: 74 69 6f 6e 2d 6c 69 73 74 2e 0a 2a 2f 0a 73 74  tion-list..*/.st
e4c0: 61 74 69 63 20 69 6e 74 20 66 74 73 35 4d 75 6c  atic int fts5Mul
e4d0: 74 69 49 74 65 72 49 73 45 6d 70 74 79 28 46 74  tiIterIsEmpty(Ft
e4e0: 73 35 49 6e 64 65 78 20 2a 70 2c 20 46 74 73 35  s5Index *p, Fts5
e4f0: 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a 20 20  Iter *pIter){.  
e500: 46 74 73 35 53 65 67 49 74 65 72 20 2a 70 53 65  Fts5SegIter *pSe
e510: 67 20 3d 20 26 70 49 74 65 72 2d 3e 61 53 65 67  g = &pIter->aSeg
e520: 5b 70 49 74 65 72 2d 3e 61 46 69 72 73 74 5b 31  [pIter->aFirst[1
e530: 5d 2e 69 46 69 72 73 74 5d 3b 0a 20 20 72 65 74  ].iFirst];.  ret
e540: 75 72 6e 20 28 70 2d 3e 72 63 3d 3d 53 51 4c 49  urn (p->rc==SQLI
e550: 54 45 5f 4f 4b 20 26 26 20 70 53 65 67 2d 3e 70  TE_OK && pSeg->p
e560: 4c 65 61 66 20 26 26 20 70 53 65 67 2d 3e 6e 50  Leaf && pSeg->nP
e570: 6f 73 3d 3d 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  os==0);.}../*.**
e580: 20 41 64 76 61 6e 63 65 20 69 74 65 72 61 74 6f   Advance iterato
e590: 72 20 70 49 74 65 72 20 74 6f 20 74 68 65 20 6e  r pIter to the n
e5a0: 65 78 74 20 65 6e 74 72 79 2e 0a 2a 2a 0a 2a 2a  ext entry..**.**
e5b0: 20 54 68 69 73 20 76 65 72 73 69 6f 6e 20 6f 66   This version of
e5c0: 20 66 74 73 35 53 65 67 49 74 65 72 4e 65 78 74   fts5SegIterNext
e5d0: 28 29 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20  () is only used 
e5e0: 62 79 20 72 65 76 65 72 73 65 20 69 74 65 72 61  by reverse itera
e5f0: 74 6f 72 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tors..*/.static 
e600: 76 6f 69 64 20 66 74 73 35 53 65 67 49 74 65 72  void fts5SegIter
e610: 4e 65 78 74 5f 52 65 76 65 72 73 65 28 0a 20 20  Next_Reverse(.  
e620: 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 20 20  Fts5Index *p,   
e630: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e640: 2f 2a 20 46 54 53 35 20 62 61 63 6b 65 6e 64 20  /* FTS5 backend 
e650: 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 46 74 73 35  object */.  Fts5
e660: 53 65 67 49 74 65 72 20 2a 70 49 74 65 72 2c 20  SegIter *pIter, 
e670: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
e680: 74 65 72 61 74 6f 72 20 74 6f 20 61 64 76 61 6e  terator to advan
e690: 63 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 62 55  ce */.  int *pbU
e6a0: 6e 75 73 65 64 20 20 20 20 20 20 20 20 20 20 20  nused           
e6b0: 20 20 20 20 20 20 20 20 2f 2a 20 55 6e 75 73 65          /* Unuse
e6c0: 64 20 2a 2f 0a 29 7b 0a 20 20 61 73 73 65 72 74  d */.){.  assert
e6d0: 28 20 70 49 74 65 72 2d 3e 66 6c 61 67 73 20 26  ( pIter->flags &
e6e0: 20 46 54 53 35 5f 53 45 47 49 54 45 52 5f 52 45   FTS5_SEGITER_RE
e6f0: 56 45 52 53 45 20 29 3b 0a 20 20 61 73 73 65 72  VERSE );.  asser
e700: 74 28 20 70 49 74 65 72 2d 3e 70 4e 65 78 74 4c  t( pIter->pNextL
e710: 65 61 66 3d 3d 30 20 29 3b 0a 20 20 55 4e 55 53  eaf==0 );.  UNUS
e720: 45 44 5f 50 41 52 41 4d 28 70 62 55 6e 75 73 65  ED_PARAM(pbUnuse
e730: 64 29 3b 0a 0a 20 20 69 66 28 20 70 49 74 65 72  d);..  if( pIter
e740: 2d 3e 69 52 6f 77 69 64 4f 66 66 73 65 74 3e 30  ->iRowidOffset>0
e750: 20 29 7b 0a 20 20 20 20 75 38 20 2a 61 20 3d 20   ){.    u8 *a = 
e760: 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 70 3b  pIter->pLeaf->p;
e770: 0a 20 20 20 20 69 6e 74 20 69 4f 66 66 3b 0a 20  .    int iOff;. 
e780: 20 20 20 69 36 34 20 69 44 65 6c 74 61 3b 0a 0a     i64 iDelta;..
e790: 20 20 20 20 70 49 74 65 72 2d 3e 69 52 6f 77 69      pIter->iRowi
e7a0: 64 4f 66 66 73 65 74 2d 2d 3b 0a 20 20 20 20 70  dOffset--;.    p
e7b0: 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65  Iter->iLeafOffse
e7c0: 74 20 3d 20 70 49 74 65 72 2d 3e 61 52 6f 77 69  t = pIter->aRowi
e7d0: 64 4f 66 66 73 65 74 5b 70 49 74 65 72 2d 3e 69  dOffset[pIter->i
e7e0: 52 6f 77 69 64 4f 66 66 73 65 74 5d 3b 0a 20 20  RowidOffset];.  
e7f0: 20 20 66 74 73 35 53 65 67 49 74 65 72 4c 6f 61    fts5SegIterLoa
e800: 64 4e 50 6f 73 28 70 2c 20 70 49 74 65 72 29 3b  dNPos(p, pIter);
e810: 0a 20 20 20 20 69 4f 66 66 20 3d 20 70 49 74 65  .    iOff = pIte
e820: 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 3b 0a  r->iLeafOffset;.
e830: 20 20 20 20 69 66 28 20 70 2d 3e 70 43 6f 6e 66      if( p->pConf
e840: 69 67 2d 3e 65 44 65 74 61 69 6c 21 3d 46 54 53  ig->eDetail!=FTS
e850: 35 5f 44 45 54 41 49 4c 5f 4e 4f 4e 45 20 29 7b  5_DETAIL_NONE ){
e860: 0a 20 20 20 20 20 20 69 4f 66 66 20 2b 3d 20 70  .      iOff += p
e870: 49 74 65 72 2d 3e 6e 50 6f 73 3b 0a 20 20 20 20  Iter->nPos;.    
e880: 7d 0a 20 20 20 20 66 74 73 35 47 65 74 56 61 72  }.    fts5GetVar
e890: 69 6e 74 28 26 61 5b 69 4f 66 66 5d 2c 20 28 75  int(&a[iOff], (u
e8a0: 36 34 2a 29 26 69 44 65 6c 74 61 29 3b 0a 20 20  64*)&iDelta);.  
e8b0: 20 20 70 49 74 65 72 2d 3e 69 52 6f 77 69 64 20    pIter->iRowid 
e8c0: 2d 3d 20 69 44 65 6c 74 61 3b 0a 20 20 7d 65 6c  -= iDelta;.  }el
e8d0: 73 65 7b 0a 20 20 20 20 66 74 73 35 53 65 67 49  se{.    fts5SegI
e8e0: 74 65 72 52 65 76 65 72 73 65 4e 65 77 50 61 67  terReverseNewPag
e8f0: 65 28 70 2c 20 70 49 74 65 72 29 3b 0a 20 20 7d  e(p, pIter);.  }
e900: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 76 61 6e 63  .}../*.** Advanc
e910: 65 20 69 74 65 72 61 74 6f 72 20 70 49 74 65 72  e iterator pIter
e920: 20 74 6f 20 74 68 65 20 6e 65 78 74 20 65 6e 74   to the next ent
e930: 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 76  ry..**.** This v
e940: 65 72 73 69 6f 6e 20 6f 66 20 66 74 73 35 53 65  ersion of fts5Se
e950: 67 49 74 65 72 4e 65 78 74 28 29 20 69 73 20 6f  gIterNext() is o
e960: 6e 6c 79 20 75 73 65 64 20 69 66 20 64 65 74 61  nly used if deta
e970: 69 6c 3d 6e 6f 6e 65 20 61 6e 64 20 74 68 65 0a  il=none and the.
e980: 2a 2a 20 69 74 65 72 61 74 6f 72 20 69 73 20 6e  ** iterator is n
e990: 6f 74 20 61 20 72 65 76 65 72 73 65 20 64 69 72  ot a reverse dir
e9a0: 65 63 74 69 6f 6e 20 69 74 65 72 61 74 6f 72 2e  ection iterator.
e9b0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
e9c0: 66 74 73 35 53 65 67 49 74 65 72 4e 65 78 74 5f  fts5SegIterNext_
e9d0: 4e 6f 6e 65 28 0a 20 20 46 74 73 35 49 6e 64 65  None(.  Fts5Inde
e9e0: 78 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  x *p,           
e9f0: 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53 35 20          /* FTS5 
ea00: 62 61 63 6b 65 6e 64 20 6f 62 6a 65 63 74 20 2a  backend object *
ea10: 2f 0a 20 20 46 74 73 35 53 65 67 49 74 65 72 20  /.  Fts5SegIter 
ea20: 2a 70 49 74 65 72 2c 20 20 20 20 20 20 20 20 20  *pIter,         
ea30: 20 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20      /* Iterator 
ea40: 74 6f 20 61 64 76 61 6e 63 65 20 2a 2f 0a 20 20  to advance */.  
ea50: 69 6e 74 20 2a 70 62 4e 65 77 54 65 72 6d 20 20  int *pbNewTerm  
ea60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ea70: 2f 2a 20 4f 55 54 3a 20 53 65 74 20 66 6f 72 20  /* OUT: Set for 
ea80: 6e 65 77 20 74 65 72 6d 20 2a 2f 0a 29 7b 0a 20  new term */.){. 
ea90: 20 69 6e 74 20 69 4f 66 66 3b 0a 0a 20 20 61 73   int iOff;..  as
eaa0: 73 65 72 74 28 20 70 2d 3e 72 63 3d 3d 53 51 4c  sert( p->rc==SQL
eab0: 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 61 73 73 65  ITE_OK );.  asse
eac0: 72 74 28 20 28 70 49 74 65 72 2d 3e 66 6c 61 67  rt( (pIter->flag
ead0: 73 20 26 20 46 54 53 35 5f 53 45 47 49 54 45 52  s & FTS5_SEGITER
eae0: 5f 52 45 56 45 52 53 45 29 3d 3d 30 20 29 3b 0a  _REVERSE)==0 );.
eaf0: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 43 6f    assert( p->pCo
eb00: 6e 66 69 67 2d 3e 65 44 65 74 61 69 6c 3d 3d 46  nfig->eDetail==F
eb10: 54 53 35 5f 44 45 54 41 49 4c 5f 4e 4f 4e 45 20  TS5_DETAIL_NONE 
eb20: 29 3b 0a 0a 20 20 41 53 53 45 52 54 5f 53 5a 4c  );..  ASSERT_SZL
eb30: 45 41 46 5f 4f 4b 28 70 49 74 65 72 2d 3e 70 4c  EAF_OK(pIter->pL
eb40: 65 61 66 29 3b 0a 20 20 69 4f 66 66 20 3d 20 70  eaf);.  iOff = p
eb50: 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65  Iter->iLeafOffse
eb60: 74 3b 0a 0a 20 20 2f 2a 20 4e 65 78 74 20 65 6e  t;..  /* Next en
eb70: 74 72 79 20 69 73 20 6f 6e 20 74 68 65 20 6e 65  try is on the ne
eb80: 78 74 20 70 61 67 65 20 2a 2f 0a 20 20 69 66 28  xt page */.  if(
eb90: 20 70 49 74 65 72 2d 3e 70 53 65 67 20 26 26 20   pIter->pSeg && 
eba0: 69 4f 66 66 3e 3d 70 49 74 65 72 2d 3e 70 4c 65  iOff>=pIter->pLe
ebb0: 61 66 2d 3e 73 7a 4c 65 61 66 20 29 7b 0a 20 20  af->szLeaf ){.  
ebc0: 20 20 66 74 73 35 53 65 67 49 74 65 72 4e 65 78    fts5SegIterNex
ebd0: 74 50 61 67 65 28 70 2c 20 70 49 74 65 72 29 3b  tPage(p, pIter);
ebe0: 0a 20 20 20 20 69 66 28 20 70 2d 3e 72 63 20 7c  .    if( p->rc |
ebf0: 7c 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 3d 3d  | pIter->pLeaf==
ec00: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20  0 ) return;.    
ec10: 70 49 74 65 72 2d 3e 69 52 6f 77 69 64 20 3d 20  pIter->iRowid = 
ec20: 30 3b 0a 20 20 20 20 69 4f 66 66 20 3d 20 34 3b  0;.    iOff = 4;
ec30: 0a 20 20 7d 0a 0a 20 20 69 66 28 20 69 4f 66 66  .  }..  if( iOff
ec40: 3c 70 49 74 65 72 2d 3e 69 45 6e 64 6f 66 44 6f  <pIter->iEndofDo
ec50: 63 6c 69 73 74 20 29 7b 0a 20 20 20 20 2f 2a 20  clist ){.    /* 
ec60: 4e 65 78 74 20 65 6e 74 72 79 20 69 73 20 6f 6e  Next entry is on
ec70: 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 61 67   the current pag
ec80: 65 20 2a 2f 0a 20 20 20 20 69 36 34 20 69 44 65  e */.    i64 iDe
ec90: 6c 74 61 3b 0a 20 20 20 20 69 4f 66 66 20 2b 3d  lta;.    iOff +=
eca0: 20 73 71 6c 69 74 65 33 46 74 73 35 47 65 74 56   sqlite3Fts5GetV
ecb0: 61 72 69 6e 74 28 26 70 49 74 65 72 2d 3e 70 4c  arint(&pIter->pL
ecc0: 65 61 66 2d 3e 70 5b 69 4f 66 66 5d 2c 20 28 75  eaf->p[iOff], (u
ecd0: 36 34 2a 29 26 69 44 65 6c 74 61 29 3b 0a 20 20  64*)&iDelta);.  
ece0: 20 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66    pIter->iLeafOf
ecf0: 66 73 65 74 20 3d 20 69 4f 66 66 3b 0a 20 20 20  fset = iOff;.   
ed00: 20 70 49 74 65 72 2d 3e 69 52 6f 77 69 64 20 2b   pIter->iRowid +
ed10: 3d 20 69 44 65 6c 74 61 3b 0a 20 20 7d 65 6c 73  = iDelta;.  }els
ed20: 65 20 69 66 28 20 28 70 49 74 65 72 2d 3e 66 6c  e if( (pIter->fl
ed30: 61 67 73 20 26 20 46 54 53 35 5f 53 45 47 49 54  ags & FTS5_SEGIT
ed40: 45 52 5f 4f 4e 45 54 45 52 4d 29 3d 3d 30 20 29  ER_ONETERM)==0 )
ed50: 7b 0a 20 20 20 20 69 66 28 20 70 49 74 65 72 2d  {.    if( pIter-
ed60: 3e 70 53 65 67 20 29 7b 0a 20 20 20 20 20 20 69  >pSeg ){.      i
ed70: 6e 74 20 6e 4b 65 65 70 20 3d 20 30 3b 0a 20 20  nt nKeep = 0;.  
ed80: 20 20 20 20 69 66 28 20 69 4f 66 66 21 3d 66 74      if( iOff!=ft
ed90: 73 35 4c 65 61 66 46 69 72 73 74 54 65 72 6d 4f  s5LeafFirstTermO
eda0: 66 66 28 70 49 74 65 72 2d 3e 70 4c 65 61 66 29  ff(pIter->pLeaf)
edb0: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 4f 66 66   ){.        iOff
edc0: 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e   += fts5GetVarin
edd0: 74 33 32 28 26 70 49 74 65 72 2d 3e 70 4c 65 61  t32(&pIter->pLea
ede0: 66 2d 3e 70 5b 69 4f 66 66 5d 2c 20 6e 4b 65 65  f->p[iOff], nKee
edf0: 70 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  p);.      }.    
ee00: 20 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66    pIter->iLeafOf
ee10: 66 73 65 74 20 3d 20 69 4f 66 66 3b 0a 20 20 20  fset = iOff;.   
ee20: 20 20 20 66 74 73 35 53 65 67 49 74 65 72 4c 6f     fts5SegIterLo
ee30: 61 64 54 65 72 6d 28 70 2c 20 70 49 74 65 72 2c  adTerm(p, pIter,
ee40: 20 6e 4b 65 65 70 29 3b 0a 20 20 20 20 7d 65 6c   nKeep);.    }el
ee50: 73 65 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20  se{.      const 
ee60: 75 38 20 2a 70 4c 69 73 74 20 3d 20 30 3b 0a 20  u8 *pList = 0;. 
ee70: 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
ee80: 2a 7a 54 65 72 6d 20 3d 20 30 3b 0a 20 20 20 20  *zTerm = 0;.    
ee90: 20 20 69 6e 74 20 6e 4c 69 73 74 3b 0a 20 20 20    int nList;.   
eea0: 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 48 61     sqlite3Fts5Ha
eeb0: 73 68 53 63 61 6e 4e 65 78 74 28 70 2d 3e 70 48  shScanNext(p->pH
eec0: 61 73 68 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ash);.      sqli
eed0: 74 65 33 46 74 73 35 48 61 73 68 53 63 61 6e 45  te3Fts5HashScanE
eee0: 6e 74 72 79 28 70 2d 3e 70 48 61 73 68 2c 20 26  ntry(p->pHash, &
eef0: 7a 54 65 72 6d 2c 20 26 70 4c 69 73 74 2c 20 26  zTerm, &pList, &
ef00: 6e 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 69 66  nList);.      if
ef10: 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 67 6f 74  ( pList==0 ) got
ef20: 6f 20 6e 65 78 74 5f 6e 6f 6e 65 5f 65 6f 66 3b  o next_none_eof;
ef30: 0a 20 20 20 20 20 20 70 49 74 65 72 2d 3e 70 4c  .      pIter->pL
ef40: 65 61 66 2d 3e 70 20 3d 20 28 75 38 2a 29 70 4c  eaf->p = (u8*)pL
ef50: 69 73 74 3b 0a 20 20 20 20 20 20 70 49 74 65 72  ist;.      pIter
ef60: 2d 3e 70 4c 65 61 66 2d 3e 6e 6e 20 3d 20 6e 4c  ->pLeaf->nn = nL
ef70: 69 73 74 3b 0a 20 20 20 20 20 20 70 49 74 65 72  ist;.      pIter
ef80: 2d 3e 70 4c 65 61 66 2d 3e 73 7a 4c 65 61 66 20  ->pLeaf->szLeaf 
ef90: 3d 20 6e 4c 69 73 74 3b 0a 20 20 20 20 20 20 70  = nList;.      p
efa0: 49 74 65 72 2d 3e 69 45 6e 64 6f 66 44 6f 63 6c  Iter->iEndofDocl
efb0: 69 73 74 20 3d 20 6e 4c 69 73 74 3b 0a 20 20 20  ist = nList;.   
efc0: 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 42 75     sqlite3Fts5Bu
efd0: 66 66 65 72 53 65 74 28 26 70 2d 3e 72 63 2c 26  fferSet(&p->rc,&
efe0: 70 49 74 65 72 2d 3e 74 65 72 6d 2c 20 28 69 6e  pIter->term, (in
eff0: 74 29 73 74 72 6c 65 6e 28 7a 54 65 72 6d 29 2c  t)strlen(zTerm),
f000: 20 28 75 38 2a 29 7a 54 65 72 6d 29 3b 0a 20 20   (u8*)zTerm);.  
f010: 20 20 20 20 70 49 74 65 72 2d 3e 69 4c 65 61 66      pIter->iLeaf
f020: 4f 66 66 73 65 74 20 3d 20 66 74 73 35 47 65 74  Offset = fts5Get
f030: 56 61 72 69 6e 74 28 70 4c 69 73 74 2c 20 28 75  Varint(pList, (u
f040: 36 34 2a 29 26 70 49 74 65 72 2d 3e 69 52 6f 77  64*)&pIter->iRow
f050: 69 64 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  id);.    }..    
f060: 69 66 28 20 70 62 4e 65 77 54 65 72 6d 20 29 20  if( pbNewTerm ) 
f070: 2a 70 62 4e 65 77 54 65 72 6d 20 3d 20 31 3b 0a  *pbNewTerm = 1;.
f080: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 67 6f 74    }else{.    got
f090: 6f 20 6e 65 78 74 5f 6e 6f 6e 65 5f 65 6f 66 3b  o next_none_eof;
f0a0: 0a 20 20 7d 0a 0a 20 20 66 74 73 35 53 65 67 49  .  }..  fts5SegI
f0b0: 74 65 72 4c 6f 61 64 4e 50 6f 73 28 70 2c 20 70  terLoadNPos(p, p
f0c0: 49 74 65 72 29 3b 0a 0a 20 20 72 65 74 75 72 6e  Iter);..  return
f0d0: 3b 0a 20 6e 65 78 74 5f 6e 6f 6e 65 5f 65 6f 66  ;. next_none_eof
f0e0: 3a 0a 20 20 66 74 73 35 44 61 74 61 52 65 6c 65  :.  fts5DataRele
f0f0: 61 73 65 28 70 49 74 65 72 2d 3e 70 4c 65 61 66  ase(pIter->pLeaf
f100: 29 3b 0a 20 20 70 49 74 65 72 2d 3e 70 4c 65 61  );.  pIter->pLea
f110: 66 20 3d 20 30 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  f = 0;.}.../*.**
f120: 20 41 64 76 61 6e 63 65 20 69 74 65 72 61 74 6f   Advance iterato
f130: 72 20 70 49 74 65 72 20 74 6f 20 74 68 65 20 6e  r pIter to the n
f140: 65 78 74 20 65 6e 74 72 79 2e 20 0a 2a 2a 0a 2a  ext entry. .**.*
f150: 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  * If an error oc
f160: 63 75 72 73 2c 20 46 74 73 35 49 6e 64 65 78 2e  curs, Fts5Index.
f170: 72 63 20 69 73 20 73 65 74 20 74 6f 20 61 6e 20  rc is set to an 
f180: 61 70 70 72 6f 70 72 69 61 74 65 20 65 72 72 6f  appropriate erro
f190: 72 20 63 6f 64 65 2e 20 49 74 20 0a 2a 2a 20 69  r code. It .** i
f1a0: 73 20 6e 6f 74 20 63 6f 6e 73 69 64 65 72 65 64  s not considered
f1b0: 20 61 6e 20 65 72 72 6f 72 20 69 66 20 74 68 65   an error if the
f1c0: 20 69 74 65 72 61 74 6f 72 20 72 65 61 63 68 65   iterator reache
f1d0: 73 20 45 4f 46 2e 20 49 66 20 61 6e 20 65 72 72  s EOF. If an err
f1e0: 6f 72 20 68 61 73 20 0a 2a 2a 20 61 6c 72 65 61  or has .** alrea
f1f0: 64 79 20 6f 63 63 75 72 72 65 64 20 77 68 65 6e  dy occurred when
f200: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
f210: 73 20 63 61 6c 6c 65 64 2c 20 69 74 20 69 73 20  s called, it is 
f220: 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74  a no-op..*/.stat
f230: 69 63 20 76 6f 69 64 20 66 74 73 35 53 65 67 49  ic void fts5SegI
f240: 74 65 72 4e 65 78 74 28 0a 20 20 46 74 73 35 49  terNext(.  Fts5I
f250: 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20  ndex *p,        
f260: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54             /* FT
f270: 53 35 20 62 61 63 6b 65 6e 64 20 6f 62 6a 65 63  S5 backend objec
f280: 74 20 2a 2f 0a 20 20 46 74 73 35 53 65 67 49 74  t */.  Fts5SegIt
f290: 65 72 20 2a 70 49 74 65 72 2c 20 20 20 20 20 20  er *pIter,      
f2a0: 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74         /* Iterat
f2b0: 6f 72 20 74 6f 20 61 64 76 61 6e 63 65 20 2a 2f  or to advance */
f2c0: 0a 20 20 69 6e 74 20 2a 70 62 4e 65 77 54 65 72  .  int *pbNewTer
f2d0: 6d 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m               
f2e0: 20 20 20 2f 2a 20 4f 55 54 3a 20 53 65 74 20 66     /* OUT: Set f
f2f0: 6f 72 20 6e 65 77 20 74 65 72 6d 20 2a 2f 0a 29  or new term */.)
f300: 7b 0a 20 20 46 74 73 35 44 61 74 61 20 2a 70 4c  {.  Fts5Data *pL
f310: 65 61 66 20 3d 20 70 49 74 65 72 2d 3e 70 4c 65  eaf = pIter->pLe
f320: 61 66 3b 0a 20 20 69 6e 74 20 69 4f 66 66 3b 0a  af;.  int iOff;.
f330: 20 20 69 6e 74 20 62 4e 65 77 54 65 72 6d 20 3d    int bNewTerm =
f340: 20 30 3b 0a 20 20 69 6e 74 20 6e 4b 65 65 70 20   0;.  int nKeep 
f350: 3d 20 30 3b 0a 20 20 75 38 20 2a 61 3b 0a 20 20  = 0;.  u8 *a;.  
f360: 69 6e 74 20 6e 3b 0a 0a 20 20 61 73 73 65 72 74  int n;..  assert
f370: 28 20 70 62 4e 65 77 54 65 72 6d 3d 3d 30 20 7c  ( pbNewTerm==0 |
f380: 7c 20 2a 70 62 4e 65 77 54 65 72 6d 3d 3d 30 20  | *pbNewTerm==0 
f390: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  );.  assert( p->
f3a0: 70 43 6f 6e 66 69 67 2d 3e 65 44 65 74 61 69 6c  pConfig->eDetail
f3b0: 21 3d 46 54 53 35 5f 44 45 54 41 49 4c 5f 4e 4f  !=FTS5_DETAIL_NO
f3c0: 4e 45 20 29 3b 0a 0a 20 20 2f 2a 20 53 65 61 72  NE );..  /* Sear
f3d0: 63 68 20 66 6f 72 20 74 68 65 20 65 6e 64 20 6f  ch for the end o
f3e0: 66 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 20 6c  f the position l
f3f0: 69 73 74 20 77 69 74 68 69 6e 20 74 68 65 20 63  ist within the c
f400: 75 72 72 65 6e 74 20 70 61 67 65 2e 20 2a 2f 0a  urrent page. */.
f410: 20 20 61 20 3d 20 70 4c 65 61 66 2d 3e 70 3b 0a    a = pLeaf->p;.
f420: 20 20 6e 20 3d 20 70 4c 65 61 66 2d 3e 73 7a 4c    n = pLeaf->szL
f430: 65 61 66 3b 0a 0a 20 20 41 53 53 45 52 54 5f 53  eaf;..  ASSERT_S
f440: 5a 4c 45 41 46 5f 4f 4b 28 70 4c 65 61 66 29 3b  ZLEAF_OK(pLeaf);
f450: 0a 20 20 69 4f 66 66 20 3d 20 70 49 74 65 72 2d  .  iOff = pIter-
f460: 3e 69 4c 65 61 66 4f 66 66 73 65 74 20 2b 20 70  >iLeafOffset + p
f470: 49 74 65 72 2d 3e 6e 50 6f 73 3b 0a 0a 20 20 69  Iter->nPos;..  i
f480: 66 28 20 69 4f 66 66 3c 6e 20 29 7b 0a 20 20 20  f( iOff<n ){.   
f490: 20 2f 2a 20 54 68 65 20 6e 65 78 74 20 65 6e 74   /* The next ent
f4a0: 72 79 20 69 73 20 6f 6e 20 74 68 65 20 63 75 72  ry is on the cur
f4b0: 72 65 6e 74 20 70 61 67 65 2e 20 2a 2f 0a 20 20  rent page. */.  
f4c0: 20 20 61 73 73 65 72 74 5f 6e 63 28 20 69 4f 66    assert_nc( iOf
f4d0: 66 3c 3d 70 49 74 65 72 2d 3e 69 45 6e 64 6f 66  f<=pIter->iEndof
f4e0: 44 6f 63 6c 69 73 74 20 29 3b 0a 20 20 20 20 69  Doclist );.    i
f4f0: 66 28 20 69 4f 66 66 3e 3d 70 49 74 65 72 2d 3e  f( iOff>=pIter->
f500: 69 45 6e 64 6f 66 44 6f 63 6c 69 73 74 20 29 7b  iEndofDoclist ){
f510: 0a 20 20 20 20 20 20 62 4e 65 77 54 65 72 6d 20  .      bNewTerm 
f520: 3d 20 31 3b 0a 20 20 20 20 20 20 69 66 28 20 69  = 1;.      if( i
f530: 4f 66 66 21 3d 66 74 73 35 4c 65 61 66 46 69 72  Off!=fts5LeafFir
f540: 73 74 54 65 72 6d 4f 66 66 28 70 4c 65 61 66 29  stTermOff(pLeaf)
f550: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 4f 66 66   ){.        iOff
f560: 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e   += fts5GetVarin
f570: 74 33 32 28 26 61 5b 69 4f 66 66 5d 2c 20 6e 4b  t32(&a[iOff], nK
f580: 65 65 70 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  eep);.      }.  
f590: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 75    }else{.      u
f5a0: 36 34 20 69 44 65 6c 74 61 3b 0a 20 20 20 20 20  64 iDelta;.     
f5b0: 20 69 4f 66 66 20 2b 3d 20 73 71 6c 69 74 65 33   iOff += sqlite3
f5c0: 46 74 73 35 47 65 74 56 61 72 69 6e 74 28 26 61  Fts5GetVarint(&a
f5d0: 5b 69 4f 66 66 5d 2c 20 26 69 44 65 6c 74 61 29  [iOff], &iDelta)
f5e0: 3b 0a 20 20 20 20 20 20 70 49 74 65 72 2d 3e 69  ;.      pIter->i
f5f0: 52 6f 77 69 64 20 2b 3d 20 69 44 65 6c 74 61 3b  Rowid += iDelta;
f600: 0a 20 20 20 20 20 20 61 73 73 65 72 74 5f 6e 63  .      assert_nc
f610: 28 20 69 44 65 6c 74 61 3e 30 20 29 3b 0a 20 20  ( iDelta>0 );.  
f620: 20 20 7d 0a 20 20 20 20 70 49 74 65 72 2d 3e 69    }.    pIter->i
f630: 4c 65 61 66 4f 66 66 73 65 74 20 3d 20 69 4f 66  LeafOffset = iOf
f640: 66 3b 0a 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  f;..  }else if( 
f650: 70 49 74 65 72 2d 3e 70 53 65 67 3d 3d 30 20 29  pIter->pSeg==0 )
f660: 7b 0a 20 20 20 20 63 6f 6e 73 74 20 75 38 20 2a  {.    const u8 *
f670: 70 4c 69 73 74 20 3d 20 30 3b 0a 20 20 20 20 63  pList = 0;.    c
f680: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 65 72 6d  onst char *zTerm
f690: 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 6e 4c   = 0;.    int nL
f6a0: 69 73 74 20 3d 20 30 3b 0a 20 20 20 20 61 73 73  ist = 0;.    ass
f6b0: 65 72 74 28 20 28 70 49 74 65 72 2d 3e 66 6c 61  ert( (pIter->fla
f6c0: 67 73 20 26 20 46 54 53 35 5f 53 45 47 49 54 45  gs & FTS5_SEGITE
f6d0: 52 5f 4f 4e 45 54 45 52 4d 29 20 7c 7c 20 70 62  R_ONETERM) || pb
f6e0: 4e 65 77 54 65 72 6d 20 29 3b 0a 20 20 20 20 69  NewTerm );.    i
f6f0: 66 28 20 30 3d 3d 28 70 49 74 65 72 2d 3e 66 6c  f( 0==(pIter->fl
f700: 61 67 73 20 26 20 46 54 53 35 5f 53 45 47 49 54  ags & FTS5_SEGIT
f710: 45 52 5f 4f 4e 45 54 45 52 4d 29 20 29 7b 0a 20  ER_ONETERM) ){. 
f720: 20 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35       sqlite3Fts5
f730: 48 61 73 68 53 63 61 6e 4e 65 78 74 28 70 2d 3e  HashScanNext(p->
f740: 70 48 61 73 68 29 3b 0a 20 20 20 20 20 20 73 71  pHash);.      sq
f750: 6c 69 74 65 33 46 74 73 35 48 61 73 68 53 63 61  lite3Fts5HashSca
f760: 6e 45 6e 74 72 79 28 70 2d 3e 70 48 61 73 68 2c  nEntry(p->pHash,
f770: 20 26 7a 54 65 72 6d 2c 20 26 70 4c 69 73 74 2c   &zTerm, &pList,
f780: 20 26 6e 4c 69 73 74 29 3b 0a 20 20 20 20 7d 0a   &nList);.    }.
f790: 20 20 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30      if( pList==0
f7a0: 20 29 7b 0a 20 20 20 20 20 20 66 74 73 35 44 61   ){.      fts5Da
f7b0: 74 61 52 65 6c 65 61 73 65 28 70 49 74 65 72 2d  taRelease(pIter-
f7c0: 3e 70 4c 65 61 66 29 3b 0a 20 20 20 20 20 20 70  >pLeaf);.      p
f7d0: 49 74 65 72 2d 3e 70 4c 65 61 66 20 3d 20 30 3b  Iter->pLeaf = 0;
f7e0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
f7f0: 20 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e    pIter->pLeaf->
f800: 70 20 3d 20 28 75 38 2a 29 70 4c 69 73 74 3b 0a  p = (u8*)pList;.
f810: 20 20 20 20 20 20 70 49 74 65 72 2d 3e 70 4c 65        pIter->pLe
f820: 61 66 2d 3e 6e 6e 20 3d 20 6e 4c 69 73 74 3b 0a  af->nn = nList;.
f830: 20 20 20 20 20 20 70 49 74 65 72 2d 3e 70 4c 65        pIter->pLe
f840: 61 66 2d 3e 73 7a 4c 65 61 66 20 3d 20 6e 4c 69  af->szLeaf = nLi
f850: 73 74 3b 0a 20 20 20 20 20 20 70 49 74 65 72 2d  st;.      pIter-
f860: 3e 69 45 6e 64 6f 66 44 6f 63 6c 69 73 74 20 3d  >iEndofDoclist =
f870: 20 6e 4c 69 73 74 2b 31 3b 0a 20 20 20 20 20 20   nList+1;.      
f880: 73 71 6c 69 74 65 33 46 74 73 35 42 75 66 66 65  sqlite3Fts5Buffe
f890: 72 53 65 74 28 26 70 2d 3e 72 63 2c 20 26 70 49  rSet(&p->rc, &pI
f8a0: 74 65 72 2d 3e 74 65 72 6d 2c 20 28 69 6e 74 29  ter->term, (int)
f8b0: 73 74 72 6c 65 6e 28 7a 54 65 72 6d 29 2c 0a 20  strlen(zTerm),. 
f8c0: 20 20 20 20 20 20 20 20 20 28 75 38 2a 29 7a 54           (u8*)zT
f8d0: 65 72 6d 29 3b 0a 20 20 20 20 20 20 70 49 74 65  erm);.      pIte
f8e0: 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 20 3d  r->iLeafOffset =
f8f0: 20 66 74 73 35 47 65 74 56 61 72 69 6e 74 28 70   fts5GetVarint(p
f900: 4c 69 73 74 2c 20 28 75 36 34 2a 29 26 70 49 74  List, (u64*)&pIt
f910: 65 72 2d 3e 69 52 6f 77 69 64 29 3b 0a 20 20 20  er->iRowid);.   
f920: 20 20 20 2a 70 62 4e 65 77 54 65 72 6d 20 3d 20     *pbNewTerm = 
f930: 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  1;.    }.  }else
f940: 7b 0a 20 20 20 20 69 4f 66 66 20 3d 20 30 3b 0a  {.    iOff = 0;.
f950: 20 20 20 20 2f 2a 20 4e 65 78 74 20 65 6e 74 72      /* Next entr
f960: 79 20 69 73 20 6e 6f 74 20 6f 6e 20 74 68 65 20  y is not on the 
f970: 63 75 72 72 65 6e 74 20 70 61 67 65 20 2a 2f 0a  current page */.
f980: 20 20 20 20 77 68 69 6c 65 28 20 69 4f 66 66 3d      while( iOff=
f990: 3d 30 20 29 7b 0a 20 20 20 20 20 20 66 74 73 35  =0 ){.      fts5
f9a0: 53 65 67 49 74 65 72 4e 65 78 74 50 61 67 65 28  SegIterNextPage(
f9b0: 70 2c 20 70 49 74 65 72 29 3b 0a 20 20 20 20 20  p, pIter);.     
f9c0: 20 70 4c 65 61 66 20 3d 20 70 49 74 65 72 2d 3e   pLeaf = pIter->
f9d0: 70 4c 65 61 66 3b 0a 20 20 20 20 20 20 69 66 28  pLeaf;.      if(
f9e0: 20 70 4c 65 61 66 3d 3d 30 20 29 20 62 72 65 61   pLeaf==0 ) brea
f9f0: 6b 3b 0a 20 20 20 20 20 20 41 53 53 45 52 54 5f  k;.      ASSERT_
fa00: 53 5a 4c 45 41 46 5f 4f 4b 28 70 4c 65 61 66 29  SZLEAF_OK(pLeaf)
fa10: 3b 0a 20 20 20 20 20 20 69 66 28 20 28 69 4f 66  ;.      if( (iOf
fa20: 66 20 3d 20 66 74 73 35 4c 65 61 66 46 69 72 73  f = fts5LeafFirs
fa30: 74 52 6f 77 69 64 4f 66 66 28 70 4c 65 61 66 29  tRowidOff(pLeaf)
fa40: 29 20 26 26 20 69 4f 66 66 3c 70 4c 65 61 66 2d  ) && iOff<pLeaf-
fa50: 3e 73 7a 4c 65 61 66 20 29 7b 0a 20 20 20 20 20  >szLeaf ){.     
fa60: 20 20 20 69 4f 66 66 20 2b 3d 20 73 71 6c 69 74     iOff += sqlit
fa70: 65 33 46 74 73 35 47 65 74 56 61 72 69 6e 74 28  e3Fts5GetVarint(
fa80: 26 70 4c 65 61 66 2d 3e 70 5b 69 4f 66 66 5d 2c  &pLeaf->p[iOff],
fa90: 20 28 75 36 34 2a 29 26 70 49 74 65 72 2d 3e 69   (u64*)&pIter->i
faa0: 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 20 20  Rowid);.        
fab0: 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73  pIter->iLeafOffs
fac0: 65 74 20 3d 20 69 4f 66 66 3b 0a 0a 20 20 20 20  et = iOff;..    
fad0: 20 20 20 20 69 66 28 20 70 4c 65 61 66 2d 3e 6e      if( pLeaf->n
fae0: 6e 3e 70 4c 65 61 66 2d 3e 73 7a 4c 65 61 66 20  n>pLeaf->szLeaf 
faf0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 49 74  ){.          pIt
fb00: 65 72 2d 3e 69 50 67 69 64 78 4f 66 66 20 3d 20  er->iPgidxOff = 
fb10: 70 4c 65 61 66 2d 3e 73 7a 4c 65 61 66 20 2b 20  pLeaf->szLeaf + 
fb20: 66 74 73 35 47 65 74 56 61 72 69 6e 74 33 32 28  fts5GetVarint32(
fb30: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26  .              &
fb40: 70 4c 65 61 66 2d 3e 70 5b 70 4c 65 61 66 2d 3e  pLeaf->p[pLeaf->
fb50: 73 7a 4c 65 61 66 5d 2c 20 70 49 74 65 72 2d 3e  szLeaf], pIter->
fb60: 69 45 6e 64 6f 66 44 6f 63 6c 69 73 74 0a 20 20  iEndofDoclist.  
fb70: 20 20 20 20 20 20 20 20 20 20 20 20 29 3b 0a 20              );. 
fb80: 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20         }..      
fb90: 7d 0a 20 20 20 20 20 20 65 6c 73 65 20 69 66 28  }.      else if(
fba0: 20 70 4c 65 61 66 2d 3e 6e 6e 3e 70 4c 65 61 66   pLeaf->nn>pLeaf
fbb0: 2d 3e 73 7a 4c 65 61 66 20 29 7b 0a 20 20 20 20  ->szLeaf ){.    
fbc0: 20 20 20 20 70 49 74 65 72 2d 3e 69 50 67 69 64      pIter->iPgid
fbd0: 78 4f 66 66 20 3d 20 70 4c 65 61 66 2d 3e 73 7a  xOff = pLeaf->sz
fbe0: 4c 65 61 66 20 2b 20 66 74 73 35 47 65 74 56 61  Leaf + fts5GetVa
fbf0: 72 69 6e 74 33 32 28 0a 20 20 20 20 20 20 20 20  rint32(.        
fc00: 20 20 20 20 26 70 4c 65 61 66 2d 3e 70 5b 70 4c      &pLeaf->p[pL
fc10: 65 61 66 2d 3e 73 7a 4c 65 61 66 5d 2c 20 69 4f  eaf->szLeaf], iO
fc20: 66 66 0a 20 20 20 20 20 20 20 20 20 20 20 20 29  ff.            )
fc30: 3b 0a 20 20 20 20 20 20 20 20 70 49 74 65 72 2d  ;.        pIter-
fc40: 3e 69 4c 65 61 66 4f 66 66 73 65 74 20 3d 20 69  >iLeafOffset = i
fc50: 4f 66 66 3b 0a 20 20 20 20 20 20 20 20 70 49 74  Off;.        pIt
fc60: 65 72 2d 3e 69 45 6e 64 6f 66 44 6f 63 6c 69 73  er->iEndofDoclis
fc70: 74 20 3d 20 69 4f 66 66 3b 0a 20 20 20 20 20 20  t = iOff;.      
fc80: 20 20 62 4e 65 77 54 65 72 6d 20 3d 20 31 3b 0a    bNewTerm = 1;.
fc90: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73        }.      as
fca0: 73 65 72 74 5f 6e 63 28 20 69 4f 66 66 3c 70 4c  sert_nc( iOff<pL
fcb0: 65 61 66 2d 3e 73 7a 4c 65 61 66 20 29 3b 0a 20  eaf->szLeaf );. 
fcc0: 20 20 20 20 20 69 66 28 20 69 4f 66 66 3e 70 4c       if( iOff>pL
fcd0: 65 61 66 2d 3e 73 7a 4c 65 61 66 20 29 7b 0a 20  eaf->szLeaf ){. 
fce0: 20 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 46         p->rc = F
fcf0: 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20  TS5_CORRUPT;.   
fd00: 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20       return;.   
fd10: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
fd20: 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 74 68    /* Check if th
fd30: 65 20 69 74 65 72 61 74 6f 72 20 69 73 20 6e 6f  e iterator is no
fd40: 77 20 61 74 20 45 4f 46 2e 20 49 66 20 73 6f 2c  w at EOF. If so,
fd50: 20 72 65 74 75 72 6e 20 65 61 72 6c 79 2e 20 2a   return early. *
fd60: 2f 0a 20 20 69 66 28 20 70 49 74 65 72 2d 3e 70  /.  if( pIter->p
fd70: 4c 65 61 66 20 29 7b 0a 20 20 20 20 69 66 28 20  Leaf ){.    if( 
fd80: 62 4e 65 77 54 65 72 6d 20 29 7b 0a 20 20 20 20  bNewTerm ){.    
fd90: 20 20 69 66 28 20 70 49 74 65 72 2d 3e 66 6c 61    if( pIter->fla
fda0: 67 73 20 26 20 46 54 53 35 5f 53 45 47 49 54 45  gs & FTS5_SEGITE
fdb0: 52 5f 4f 4e 45 54 45 52 4d 20 29 7b 0a 20 20 20  R_ONETERM ){.   
fdc0: 20 20 20 20 20 66 74 73 35 44 61 74 61 52 65 6c       fts5DataRel
fdd0: 65 61 73 65 28 70 49 74 65 72 2d 3e 70 4c 65 61  ease(pIter->pLea
fde0: 66 29 3b 0a 20 20 20 20 20 20 20 20 70 49 74 65  f);.        pIte
fdf0: 72 2d 3e 70 4c 65 61 66 20 3d 20 30 3b 0a 20 20  r->pLeaf = 0;.  
fe00: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
fe10: 20 20 20 66 74 73 35 53 65 67 49 74 65 72 4c 6f     fts5SegIterLo
fe20: 61 64 54 65 72 6d 28 70 2c 20 70 49 74 65 72 2c  adTerm(p, pIter,
fe30: 20 6e 4b 65 65 70 29 3b 0a 20 20 20 20 20 20 20   nKeep);.       
fe40: 20 66 74 73 35 53 65 67 49 74 65 72 4c 6f 61 64   fts5SegIterLoad
fe50: 4e 50 6f 73 28 70 2c 20 70 49 74 65 72 29 3b 0a  NPos(p, pIter);.
fe60: 20 20 20 20 20 20 20 20 69 66 28 20 70 62 4e 65          if( pbNe
fe70: 77 54 65 72 6d 20 29 20 2a 70 62 4e 65 77 54 65  wTerm ) *pbNewTe
fe80: 72 6d 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a  rm = 1;.      }.
fe90: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
fea0: 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e   /* The followin
feb0: 67 20 63 6f 75 6c 64 20 62 65 20 64 6f 6e 65 20  g could be done 
fec0: 62 79 20 63 61 6c 6c 69 6e 67 20 66 74 73 35 53  by calling fts5S
fed0: 65 67 49 74 65 72 4c 6f 61 64 4e 50 6f 73 28 29  egIterLoadNPos()
fee0: 2e 20 42 75 74 0a 20 20 20 20 20 20 2a 2a 20 74  . But.      ** t
fef0: 68 69 73 20 62 6c 6f 63 6b 20 69 73 20 70 61 72  his block is par
ff00: 74 69 63 75 6c 61 72 6c 79 20 70 65 72 66 6f 72  ticularly perfor
ff10: 6d 61 6e 63 65 20 63 72 69 74 69 63 61 6c 2c 20  mance critical, 
ff20: 73 6f 20 65 71 75 69 76 61 6c 65 6e 74 0a 20 20  so equivalent.  
ff30: 20 20 20 20 2a 2a 20 63 6f 64 65 20 69 73 20 69      ** code is i
ff40: 6e 6c 69 6e 65 64 2e 20 0a 20 20 20 20 20 20 2a  nlined. .      *
ff50: 2a 0a 20 20 20 20 20 20 2a 2a 20 4c 61 74 65 72  *.      ** Later
ff60: 3a 20 53 77 69 74 63 68 65 64 20 62 61 63 6b 20  : Switched back 
ff70: 74 6f 20 66 74 73 35 53 65 67 49 74 65 72 4c 6f  to fts5SegIterLo
ff80: 61 64 4e 50 6f 73 28 29 20 62 65 63 61 75 73 65  adNPos() because
ff90: 20 69 74 20 73 75 70 70 6f 72 74 73 0a 20 20 20   it supports.   
ffa0: 20 20 20 2a 2a 20 64 65 74 61 69 6c 3d 6e 6f 6e     ** detail=non
ffb0: 65 20 6d 6f 64 65 2e 20 4e 6f 74 20 69 64 65 61  e mode. Not idea
ffc0: 6c 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  l..      */.    
ffd0: 20 20 69 6e 74 20 6e 53 7a 3b 0a 20 20 20 20 20    int nSz;.     
ffe0: 20 61 73 73 65 72 74 28 20 70 2d 3e 72 63 3d 3d   assert( p->rc==
fff0: 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20  SQLITE_OK );.   
10000 20 20 20 66 74 73 35 46 61 73 74 47 65 74 56 61     fts5FastGetVa
10010 72 69 6e 74 33 32 28 70 49 74 65 72 2d 3e 70 4c  rint32(pIter->pL
10020 65 61 66 2d 3e 70 2c 20 70 49 74 65 72 2d 3e 69  eaf->p, pIter->i
10030 4c 65 61 66 4f 66 66 73 65 74 2c 20 6e 53 7a 29  LeafOffset, nSz)
10040 3b 0a 20 20 20 20 20 20 70 49 74 65 72 2d 3e 62  ;.      pIter->b
10050 44 65 6c 20 3d 20 28 6e 53 7a 20 26 20 30 78 30  Del = (nSz & 0x0
10060 30 30 31 29 3b 0a 20 20 20 20 20 20 70 49 74 65  001);.      pIte
10070 72 2d 3e 6e 50 6f 73 20 3d 20 6e 53 7a 3e 3e 31  r->nPos = nSz>>1
10080 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 5f 6e  ;.      assert_n
10090 63 28 20 70 49 74 65 72 2d 3e 6e 50 6f 73 3e 3d  c( pIter->nPos>=
100a0 30 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  0 );.    }.  }.}
100b0 0a 0a 23 64 65 66 69 6e 65 20 53 57 41 50 56 41  ..#define SWAPVA
100c0 4c 28 54 2c 20 61 2c 20 62 29 20 7b 20 54 20 74  L(T, a, b) { T t
100d0 6d 70 3b 20 74 6d 70 3d 61 3b 20 61 3d 62 3b 20  mp; tmp=a; a=b; 
100e0 62 3d 74 6d 70 3b 20 7d 0a 0a 23 64 65 66 69 6e  b=tmp; }..#defin
100f0 65 20 66 74 73 35 49 6e 64 65 78 53 6b 69 70 56  e fts5IndexSkipV
10100 61 72 69 6e 74 28 61 2c 20 69 4f 66 66 29 20 7b  arint(a, iOff) {
10110 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
10120 69 6e 74 20 69 45 6e 64 20 3d 20 69 4f 66 66 2b  int iEnd = iOff+
10130 39 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  9;              
10140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10150 5c 0a 20 20 77 68 69 6c 65 28 20 28 61 5b 69 4f  \.  while( (a[iO
10160 66 66 2b 2b 5d 20 26 20 30 78 38 30 29 20 26 26  ff++] & 0x80) &&
10170 20 69 4f 66 66 3c 69 45 6e 64 20 29 3b 20 20 20   iOff<iEnd );   
10180 20 20 20 20 5c 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49      \.}../*.** I
10190 74 65 72 61 74 6f 72 20 70 49 74 65 72 20 63 75  terator pIter cu
101a0 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 73 20 74  rrently points t
101b0 6f 20 74 68 65 20 66 69 72 73 74 20 72 6f 77 69  o the first rowi
101c0 64 20 69 6e 20 61 20 64 6f 63 6c 69 73 74 2e 20  d in a doclist. 
101d0 54 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e  This.** function
101e0 20 73 65 74 73 20 74 68 65 20 69 74 65 72 61 74   sets the iterat
101f0 6f 72 20 75 70 20 73 6f 20 74 68 61 74 20 69 74  or up so that it
10200 65 72 61 74 65 73 20 69 6e 20 72 65 76 65 72 73  erates in revers
10210 65 20 6f 72 64 65 72 20 74 68 72 6f 75 67 68 0a  e order through.
10220 2a 2a 20 74 68 65 20 64 6f 63 6c 69 73 74 2e 0a  ** the doclist..
10230 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
10240 74 73 35 53 65 67 49 74 65 72 52 65 76 65 72 73  ts5SegIterRevers
10250 65 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20  e(Fts5Index *p, 
10260 46 74 73 35 53 65 67 49 74 65 72 20 2a 70 49 74  Fts5SegIter *pIt
10270 65 72 29 7b 0a 20 20 46 74 73 35 44 6c 69 64 78  er){.  Fts5Dlidx
10280 49 74 65 72 20 2a 70 44 6c 69 64 78 20 3d 20 70  Iter *pDlidx = p
10290 49 74 65 72 2d 3e 70 44 6c 69 64 78 3b 0a 20 20  Iter->pDlidx;.  
102a0 46 74 73 35 44 61 74 61 20 2a 70 4c 61 73 74 20  Fts5Data *pLast 
102b0 3d 20 30 3b 0a 20 20 69 6e 74 20 70 67 6e 6f 4c  = 0;.  int pgnoL
102c0 61 73 74 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20  ast = 0;..  if( 
102d0 70 44 6c 69 64 78 20 29 7b 0a 20 20 20 20 69 6e  pDlidx ){.    in
102e0 74 20 69 53 65 67 69 64 20 3d 20 70 49 74 65 72  t iSegid = pIter
102f0 2d 3e 70 53 65 67 2d 3e 69 53 65 67 69 64 3b 0a  ->pSeg->iSegid;.
10300 20 20 20 20 70 67 6e 6f 4c 61 73 74 20 3d 20 66      pgnoLast = f
10310 74 73 35 44 6c 69 64 78 49 74 65 72 50 67 6e 6f  ts5DlidxIterPgno
10320 28 70 44 6c 69 64 78 29 3b 0a 20 20 20 20 70 4c  (pDlidx);.    pL
10330 61 73 74 20 3d 20 66 74 73 35 44 61 74 61 52 65  ast = fts5DataRe
10340 61 64 28 70 2c 20 46 54 53 35 5f 53 45 47 4d 45  ad(p, FTS5_SEGME
10350 4e 54 5f 52 4f 57 49 44 28 69 53 65 67 69 64 2c  NT_ROWID(iSegid,
10360 20 70 67 6e 6f 4c 61 73 74 29 29 3b 0a 20 20 7d   pgnoLast));.  }
10370 65 6c 73 65 7b 0a 20 20 20 20 46 74 73 35 44 61  else{.    Fts5Da
10380 74 61 20 2a 70 4c 65 61 66 20 3d 20 70 49 74 65  ta *pLeaf = pIte
10390 72 2d 3e 70 4c 65 61 66 3b 20 20 20 20 20 20 20  r->pLeaf;       
103a0 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 6c 65 61    /* Current lea
103b0 66 20 64 61 74 61 20 2a 2f 0a 0a 20 20 20 20 2f  f data */..    /
103c0 2a 20 43 75 72 72 65 6e 74 6c 79 2c 20 46 74 73  * Currently, Fts
103d0 35 53 65 67 49 74 65 72 2e 69 4c 65 61 66 4f 66  5SegIter.iLeafOf
103e0 66 73 65 74 20 70 6f 69 6e 74 73 20 74 6f 20 74  fset points to t
103f0 68 65 20 66 69 72 73 74 20 62 79 74 65 20 6f 66  he first byte of
10400 0a 20 20 20 20 2a 2a 20 70 6f 73 69 74 69 6f 6e  .    ** position
10410 2d 6c 69 73 74 20 63 6f 6e 74 65 6e 74 20 66 6f  -list content fo
10420 72 20 74 68 65 20 63 75 72 72 65 6e 74 20 72 6f  r the current ro
10430 77 69 64 2e 20 42 61 63 6b 20 69 74 20 75 70 20  wid. Back it up 
10440 73 6f 20 74 68 61 74 20 69 74 0a 20 20 20 20 2a  so that it.    *
10450 2a 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20  * points to the 
10460 73 74 61 72 74 20 6f 66 20 74 68 65 20 70 6f 73  start of the pos
10470 69 74 69 6f 6e 2d 6c 69 73 74 20 73 69 7a 65 20  ition-list size 
10480 66 69 65 6c 64 2e 20 2a 2f 0a 20 20 20 20 69 6e  field. */.    in
10490 74 20 69 50 6f 73 6c 69 73 74 3b 0a 20 20 20 20  t iPoslist;.    
104a0 69 66 28 20 70 49 74 65 72 2d 3e 69 54 65 72 6d  if( pIter->iTerm
104b0 4c 65 61 66 50 67 6e 6f 3d 3d 70 49 74 65 72 2d  LeafPgno==pIter-
104c0 3e 69 4c 65 61 66 50 67 6e 6f 20 29 7b 0a 20 20  >iLeafPgno ){.  
104d0 20 20 20 20 69 50 6f 73 6c 69 73 74 20 3d 20 70      iPoslist = p
104e0 49 74 65 72 2d 3e 69 54 65 72 6d 4c 65 61 66 4f  Iter->iTermLeafO
104f0 66 66 73 65 74 3b 0a 20 20 20 20 7d 65 6c 73 65  ffset;.    }else
10500 7b 0a 20 20 20 20 20 20 69 50 6f 73 6c 69 73 74  {.      iPoslist
10510 20 3d 20 34 3b 0a 20 20 20 20 7d 0a 20 20 20 20   = 4;.    }.    
10520 66 74 73 35 49 6e 64 65 78 53 6b 69 70 56 61 72  fts5IndexSkipVar
10530 69 6e 74 28 70 4c 65 61 66 2d 3e 70 2c 20 69 50  int(pLeaf->p, iP
10540 6f 73 6c 69 73 74 29 3b 0a 20 20 20 20 70 49 74  oslist);.    pIt
10550 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 20  er->iLeafOffset 
10560 3d 20 69 50 6f 73 6c 69 73 74 3b 0a 0a 20 20 20  = iPoslist;..   
10570 20 2f 2a 20 49 66 20 74 68 69 73 20 63 6f 6e 64   /* If this cond
10580 69 74 69 6f 6e 20 69 73 20 74 72 75 65 20 74 68  ition is true th
10590 65 6e 20 74 68 65 20 6c 61 72 67 65 73 74 20 72  en the largest r
105a0 6f 77 69 64 20 66 6f 72 20 74 68 65 20 63 75 72  owid for the cur
105b0 72 65 6e 74 0a 20 20 20 20 2a 2a 20 74 65 72 6d  rent.    ** term
105c0 20 6d 61 79 20 6e 6f 74 20 62 65 20 73 74 6f 72   may not be stor
105d0 65 64 20 6f 6e 20 74 68 65 20 63 75 72 72 65 6e  ed on the curren
105e0 74 20 70 61 67 65 2e 20 53 6f 20 73 65 61 72 63  t page. So searc
105f0 68 20 66 6f 72 77 61 72 64 20 74 6f 0a 20 20 20  h forward to.   
10600 20 2a 2a 20 73 65 65 20 77 68 65 72 65 20 73 61   ** see where sa
10610 69 64 20 72 6f 77 69 64 20 72 65 61 6c 6c 79 20  id rowid really 
10620 69 73 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  is.  */.    if( 
10630 70 49 74 65 72 2d 3e 69 45 6e 64 6f 66 44 6f 63  pIter->iEndofDoc
10640 6c 69 73 74 3e 3d 70 4c 65 61 66 2d 3e 73 7a 4c  list>=pLeaf->szL
10650 65 61 66 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  eaf ){.      int
10660 20 70 67 6e 6f 3b 0a 20 20 20 20 20 20 46 74 73   pgno;.      Fts
10670 35 53 74 72 75 63 74 75 72 65 53 65 67 6d 65 6e  5StructureSegmen
10680 74 20 2a 70 53 65 67 20 3d 20 70 49 74 65 72 2d  t *pSeg = pIter-
10690 3e 70 53 65 67 3b 0a 0a 20 20 20 20 20 20 2f 2a  >pSeg;..      /*
106a0 20 54 68 65 20 6c 61 73 74 20 72 6f 77 69 64 20   The last rowid 
106b0 69 6e 20 74 68 65 20 64 6f 63 6c 69 73 74 20 6d  in the doclist m
106c0 61 79 20 6e 6f 74 20 62 65 20 6f 6e 20 74 68 65  ay not be on the
106d0 20 63 75 72 72 65 6e 74 20 70 61 67 65 2e 20 53   current page. S
106e0 65 61 72 63 68 0a 20 20 20 20 20 20 2a 2a 20 66  earch.      ** f
106f0 6f 72 77 61 72 64 20 74 6f 20 66 69 6e 64 20 74  orward to find t
10700 68 65 20 70 61 67 65 20 63 6f 6e 74 61 69 6e 69  he page containi
10710 6e 67 20 74 68 65 20 6c 61 73 74 20 72 6f 77 69  ng the last rowi
10720 64 2e 20 20 2a 2f 0a 20 20 20 20 20 20 66 6f 72  d.  */.      for
10730 28 70 67 6e 6f 3d 70 49 74 65 72 2d 3e 69 4c 65  (pgno=pIter->iLe
10740 61 66 50 67 6e 6f 2b 31 3b 20 21 70 2d 3e 72 63  afPgno+1; !p->rc
10750 20 26 26 20 70 67 6e 6f 3c 3d 70 53 65 67 2d 3e   && pgno<=pSeg->
10760 70 67 6e 6f 4c 61 73 74 3b 20 70 67 6e 6f 2b 2b  pgnoLast; pgno++
10770 29 7b 0a 20 20 20 20 20 20 20 20 69 36 34 20 69  ){.        i64 i
10780 41 62 73 20 3d 20 46 54 53 35 5f 53 45 47 4d 45  Abs = FTS5_SEGME
10790 4e 54 5f 52 4f 57 49 44 28 70 53 65 67 2d 3e 69  NT_ROWID(pSeg->i
107a0 53 65 67 69 64 2c 20 70 67 6e 6f 29 3b 0a 20 20  Segid, pgno);.  
107b0 20 20 20 20 20 20 46 74 73 35 44 61 74 61 20 2a        Fts5Data *
107c0 70 4e 65 77 20 3d 20 66 74 73 35 44 61 74 61 52  pNew = fts5DataR
107d0 65 61 64 28 70 2c 20 69 41 62 73 29 3b 0a 20 20  ead(p, iAbs);.  
107e0 20 20 20 20 20 20 69 66 28 20 70 4e 65 77 20 29        if( pNew )
107f0 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20  {.          int 
10800 69 52 6f 77 69 64 2c 20 62 54 65 72 6d 6c 65 73  iRowid, bTermles
10810 73 3b 0a 20 20 20 20 20 20 20 20 20 20 69 52 6f  s;.          iRo
10820 77 69 64 20 3d 20 66 74 73 35 4c 65 61 66 46 69  wid = fts5LeafFi
10830 72 73 74 52 6f 77 69 64 4f 66 66 28 70 4e 65 77  rstRowidOff(pNew
10840 29 3b 0a 20 20 20 20 20 20 20 20 20 20 62 54 65  );.          bTe
10850 72 6d 6c 65 73 73 20 3d 20 66 74 73 35 4c 65 61  rmless = fts5Lea
10860 66 49 73 54 65 72 6d 6c 65 73 73 28 70 4e 65 77  fIsTermless(pNew
10870 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
10880 20 69 52 6f 77 69 64 20 29 7b 0a 20 20 20 20 20   iRowid ){.     
10890 20 20 20 20 20 20 20 53 57 41 50 56 41 4c 28 46         SWAPVAL(F
108a0 74 73 35 44 61 74 61 2a 2c 20 70 4e 65 77 2c 20  ts5Data*, pNew, 
108b0 70 4c 61 73 74 29 3b 0a 20 20 20 20 20 20 20 20  pLast);.        
108c0 20 20 20 20 70 67 6e 6f 4c 61 73 74 20 3d 20 70      pgnoLast = p
108d0 67 6e 6f 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  gno;.          }
108e0 0a 20 20 20 20 20 20 20 20 20 20 66 74 73 35 44  .          fts5D
108f0 61 74 61 52 65 6c 65 61 73 65 28 70 4e 65 77 29  ataRelease(pNew)
10900 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
10910 62 54 65 72 6d 6c 65 73 73 3d 3d 30 20 29 20 62  bTermless==0 ) b
10920 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  reak;.        }.
10930 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
10940 7d 0a 0a 20 20 2f 2a 20 49 66 20 70 4c 61 73 74  }..  /* If pLast
10950 20 69 73 20 4e 55 4c 4c 20 61 74 20 74 68 69 73   is NULL at this
10960 20 70 6f 69 6e 74 2c 20 74 68 65 6e 20 74 68 65   point, then the
10970 20 6c 61 73 74 20 72 6f 77 69 64 20 66 6f 72 20   last rowid for 
10980 74 68 69 73 20 64 6f 63 6c 69 73 74 0a 20 20 2a  this doclist.  *
10990 2a 20 6c 69 65 73 20 6f 6e 20 74 68 65 20 70 61  * lies on the pa
109a0 67 65 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 64  ge currently ind
109b0 69 63 61 74 65 64 20 62 79 20 74 68 65 20 69 74  icated by the it
109c0 65 72 61 74 6f 72 2e 20 49 6e 20 74 68 69 73 20  erator. In this 
109d0 63 61 73 65 20 0a 20 20 2a 2a 20 70 49 74 65 72  case .  ** pIter
109e0 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 20 69 73  ->iLeafOffset is
109f0 20 61 6c 72 65 61 64 79 20 73 65 74 20 74 6f 20   already set to 
10a00 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 70 6f 73  point to the pos
10a10 69 74 69 6f 6e 2d 6c 69 73 74 20 73 69 7a 65 0a  ition-list size.
10a20 20 20 2a 2a 20 66 69 65 6c 64 20 61 73 73 6f 63    ** field assoc
10a30 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20 66  iated with the f
10a40 69 72 73 74 20 72 65 6c 65 76 61 6e 74 20 72 6f  irst relevant ro
10a50 77 69 64 20 6f 6e 20 74 68 65 20 70 61 67 65 2e  wid on the page.
10a60 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4f 72 2c 20 69  .  **.  ** Or, i
10a70 66 20 70 4c 61 73 74 20 69 73 20 6e 6f 6e 2d 4e  f pLast is non-N
10a80 55 4c 4c 2c 20 74 68 65 6e 20 69 74 20 69 73 20  ULL, then it is 
10a90 74 68 65 20 70 61 67 65 20 74 68 61 74 20 63 6f  the page that co
10aa0 6e 74 61 69 6e 73 20 74 68 65 20 6c 61 73 74 0a  ntains the last.
10ab0 20 20 2a 2a 20 72 6f 77 69 64 2e 20 49 6e 20 74    ** rowid. In t
10ac0 68 69 73 20 63 61 73 65 20 63 6f 6e 66 69 67 75  his case configu
10ad0 72 65 20 74 68 65 20 69 74 65 72 61 74 6f 72 20  re the iterator 
10ae0 73 6f 20 74 68 61 74 20 69 74 20 70 6f 69 6e 74  so that it point
10af0 73 20 74 6f 20 74 68 65 0a 20 20 2a 2a 20 66 69  s to the.  ** fi
10b00 72 73 74 20 72 6f 77 69 64 20 6f 6e 20 74 68 69  rst rowid on thi
10b10 73 20 70 61 67 65 2e 0a 20 20 2a 2f 0a 20 20 69  s page..  */.  i
10b20 66 28 20 70 4c 61 73 74 20 29 7b 0a 20 20 20 20  f( pLast ){.    
10b30 69 6e 74 20 69 4f 66 66 3b 0a 20 20 20 20 66 74  int iOff;.    ft
10b40 73 35 44 61 74 61 52 65 6c 65 61 73 65 28 70 49  s5DataRelease(pI
10b50 74 65 72 2d 3e 70 4c 65 61 66 29 3b 0a 20 20 20  ter->pLeaf);.   
10b60 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 20 3d 20   pIter->pLeaf = 
10b70 70 4c 61 73 74 3b 0a 20 20 20 20 70 49 74 65 72  pLast;.    pIter
10b80 2d 3e 69 4c 65 61 66 50 67 6e 6f 20 3d 20 70 67  ->iLeafPgno = pg
10b90 6e 6f 4c 61 73 74 3b 0a 20 20 20 20 69 4f 66 66  noLast;.    iOff
10ba0 20 3d 20 66 74 73 35 4c 65 61 66 46 69 72 73 74   = fts5LeafFirst
10bb0 52 6f 77 69 64 4f 66 66 28 70 4c 61 73 74 29 3b  RowidOff(pLast);
10bc0 0a 20 20 20 20 69 4f 66 66 20 2b 3d 20 66 74 73  .    iOff += fts
10bd0 35 47 65 74 56 61 72 69 6e 74 28 26 70 4c 61 73  5GetVarint(&pLas
10be0 74 2d 3e 70 5b 69 4f 66 66 5d 2c 20 28 75 36 34  t->p[iOff], (u64
10bf0 2a 29 26 70 49 74 65 72 2d 3e 69 52 6f 77 69 64  *)&pIter->iRowid
10c00 29 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 69 4c  );.    pIter->iL
10c10 65 61 66 4f 66 66 73 65 74 20 3d 20 69 4f 66 66  eafOffset = iOff
10c20 3b 0a 0a 20 20 20 20 69 66 28 20 66 74 73 35 4c  ;..    if( fts5L
10c30 65 61 66 49 73 54 65 72 6d 6c 65 73 73 28 70 4c  eafIsTermless(pL
10c40 61 73 74 29 20 29 7b 0a 20 20 20 20 20 20 70 49  ast) ){.      pI
10c50 74 65 72 2d 3e 69 45 6e 64 6f 66 44 6f 63 6c 69  ter->iEndofDocli
10c60 73 74 20 3d 20 70 4c 61 73 74 2d 3e 6e 6e 2b 31  st = pLast->nn+1
10c70 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
10c80 20 20 20 70 49 74 65 72 2d 3e 69 45 6e 64 6f 66     pIter->iEndof
10c90 44 6f 63 6c 69 73 74 20 3d 20 66 74 73 35 4c 65  Doclist = fts5Le
10ca0 61 66 46 69 72 73 74 54 65 72 6d 4f 66 66 28 70  afFirstTermOff(p
10cb0 4c 61 73 74 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  Last);.    }..  
10cc0 7d 0a 0a 20 20 66 74 73 35 53 65 67 49 74 65 72  }..  fts5SegIter
10cd0 52 65 76 65 72 73 65 49 6e 69 74 50 61 67 65 28  ReverseInitPage(
10ce0 70 2c 20 70 49 74 65 72 29 3b 0a 7d 0a 0a 2f 2a  p, pIter);.}../*
10cf0 0a 2a 2a 20 49 74 65 72 61 74 6f 72 20 70 49 74  .** Iterator pIt
10d00 65 72 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69  er currently poi
10d10 6e 74 73 20 74 6f 20 74 68 65 20 66 69 72 73 74  nts to the first
10d20 20 72 6f 77 69 64 20 6f 66 20 61 20 64 6f 63 6c   rowid of a docl
10d30 69 73 74 2e 0a 2a 2a 20 54 68 65 72 65 20 69 73  ist..** There is
10d40 20 61 20 64 6f 63 6c 69 73 74 2d 69 6e 64 65 78   a doclist-index
10d50 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
10d60 20 74 68 65 20 66 69 6e 61 6c 20 74 65 72 6d 20   the final term 
10d70 6f 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 0a  on the current .
10d80 2a 2a 20 70 61 67 65 2e 20 49 66 20 74 68 65 20  ** page. If the 
10d90 63 75 72 72 65 6e 74 20 74 65 72 6d 20 69 73 20  current term is 
10da0 74 68 65 20 6c 61 73 74 20 74 65 72 6d 20 6f 6e  the last term on
10db0 20 74 68 65 20 70 61 67 65 2c 20 6c 6f 61 64 20   the page, load 
10dc0 74 68 65 20 0a 2a 2a 20 64 6f 63 6c 69 73 74 2d  the .** doclist-
10dd0 69 6e 64 65 78 20 66 72 6f 6d 20 64 69 73 6b 20  index from disk 
10de0 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 20 61  and initialize a
10df0 6e 20 69 74 65 72 61 74 6f 72 20 61 74 20 28 70  n iterator at (p
10e00 49 74 65 72 2d 3e 70 44 6c 69 64 78 29 2e 0a 2a  Iter->pDlidx)..*
10e10 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  /.static void ft
10e20 73 35 53 65 67 49 74 65 72 4c 6f 61 64 44 6c 69  s5SegIterLoadDli
10e30 64 78 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c  dx(Fts5Index *p,
10e40 20 46 74 73 35 53 65 67 49 74 65 72 20 2a 70 49   Fts5SegIter *pI
10e50 74 65 72 29 7b 0a 20 20 69 6e 74 20 69 53 65 67  ter){.  int iSeg
10e60 20 3d 20 70 49 74 65 72 2d 3e 70 53 65 67 2d 3e   = pIter->pSeg->
10e70 69 53 65 67 69 64 3b 0a 20 20 69 6e 74 20 62 52  iSegid;.  int bR
10e80 65 76 20 3d 20 28 70 49 74 65 72 2d 3e 66 6c 61  ev = (pIter->fla
10e90 67 73 20 26 20 46 54 53 35 5f 53 45 47 49 54 45  gs & FTS5_SEGITE
10ea0 52 5f 52 45 56 45 52 53 45 29 3b 0a 20 20 46 74  R_REVERSE);.  Ft
10eb0 73 35 44 61 74 61 20 2a 70 4c 65 61 66 20 3d 20  s5Data *pLeaf = 
10ec0 70 49 74 65 72 2d 3e 70 4c 65 61 66 3b 20 2f 2a  pIter->pLeaf; /*
10ed0 20 43 75 72 72 65 6e 74 20 6c 65 61 66 20 64 61   Current leaf da
10ee0 74 61 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  ta */..  assert(
10ef0 20 70 49 74 65 72 2d 3e 66 6c 61 67 73 20 26 20   pIter->flags & 
10f00 46 54 53 35 5f 53 45 47 49 54 45 52 5f 4f 4e 45  FTS5_SEGITER_ONE
10f10 54 45 52 4d 20 29 3b 0a 20 20 61 73 73 65 72 74  TERM );.  assert
10f20 28 20 70 49 74 65 72 2d 3e 70 44 6c 69 64 78 3d  ( pIter->pDlidx=
10f30 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 43 68 65 63  =0 );..  /* Chec
10f40 6b 20 69 66 20 74 68 65 20 63 75 72 72 65 6e 74  k if the current
10f50 20 64 6f 63 6c 69 73 74 20 65 6e 64 73 20 6f 6e   doclist ends on
10f60 20 74 68 69 73 20 70 61 67 65 2e 20 49 66 20 69   this page. If i
10f70 74 20 64 6f 65 73 2c 20 72 65 74 75 72 6e 0a 20  t does, return. 
10f80 20 2a 2a 20 65 61 72 6c 79 20 77 69 74 68 6f 75   ** early withou
10f90 74 20 6c 6f 61 64 69 6e 67 20 74 68 65 20 64 6f  t loading the do
10fa0 63 6c 69 73 74 2d 69 6e 64 65 78 20 28 61 73 20  clist-index (as 
10fb0 69 74 20 62 65 6c 6f 6e 67 73 20 74 6f 20 61 20  it belongs to a 
10fc0 64 69 66 66 65 72 65 6e 74 0a 20 20 2a 2a 20 74  different.  ** t
10fd0 65 72 6d 2e 20 2a 2f 0a 20 20 69 66 28 20 70 49  erm. */.  if( pI
10fe0 74 65 72 2d 3e 69 54 65 72 6d 4c 65 61 66 50 67  ter->iTermLeafPg
10ff0 6e 6f 3d 3d 70 49 74 65 72 2d 3e 69 4c 65 61 66  no==pIter->iLeaf
11000 50 67 6e 6f 20 0a 20 20 20 26 26 20 70 49 74 65  Pgno .   && pIte
11010 72 2d 3e 69 45 6e 64 6f 66 44 6f 63 6c 69 73 74  r->iEndofDoclist
11020 3c 70 4c 65 61 66 2d 3e 73 7a 4c 65 61 66 20 0a  <pLeaf->szLeaf .
11030 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b    ){.    return;
11040 0a 20 20 7d 0a 0a 20 20 70 49 74 65 72 2d 3e 70  .  }..  pIter->p
11050 44 6c 69 64 78 20 3d 20 66 74 73 35 44 6c 69 64  Dlidx = fts5Dlid
11060 78 49 74 65 72 49 6e 69 74 28 70 2c 20 62 52 65  xIterInit(p, bRe
11070 76 2c 20 69 53 65 67 2c 20 70 49 74 65 72 2d 3e  v, iSeg, pIter->
11080 69 54 65 72 6d 4c 65 61 66 50 67 6e 6f 29 3b 0a  iTermLeafPgno);.
11090 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 69 74 65  }../*.** The ite
110a0 72 61 74 6f 72 20 6f 62 6a 65 63 74 20 70 61 73  rator object pas
110b0 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e  sed as the secon
110c0 64 20 61 72 67 75 6d 65 6e 74 20 63 75 72 72 65  d argument curre
110d0 6e 74 6c 79 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a  ntly contains.**
110e0 20 6e 6f 20 76 61 6c 69 64 20 76 61 6c 75 65 73   no valid values
110f0 20 65 78 63 65 70 74 20 66 6f 72 20 74 68 65 20   except for the 
11100 46 74 73 35 53 65 67 49 74 65 72 2e 70 4c 65 61  Fts5SegIter.pLea
11110 66 20 6d 65 6d 62 65 72 20 76 61 72 69 61 62 6c  f member variabl
11120 65 2e 20 54 68 69 73 0a 2a 2a 20 66 75 6e 63 74  e. This.** funct
11130 69 6f 6e 20 73 65 61 72 63 68 65 73 20 74 68 65  ion searches the
11140 20 6c 65 61 66 20 70 61 67 65 20 66 6f 72 20 61   leaf page for a
11150 20 74 65 72 6d 20 6d 61 74 63 68 69 6e 67 20 28   term matching (
11160 70 54 65 72 6d 2f 6e 54 65 72 6d 29 2e 0a 2a 2a  pTerm/nTerm)..**
11170 0a 2a 2a 20 49 66 20 74 68 65 20 73 70 65 63 69  .** If the speci
11180 66 69 65 64 20 74 65 72 6d 20 69 73 20 66 6f 75  fied term is fou
11190 6e 64 20 6f 6e 20 74 68 65 20 70 61 67 65 2c 20  nd on the page, 
111a0 74 68 65 6e 20 74 68 65 20 69 74 65 72 61 74 6f  then the iterato
111b0 72 20 69 73 20 6c 65 66 74 0a 2a 2a 20 70 6f 69  r is left.** poi
111c0 6e 74 69 6e 67 20 74 6f 20 69 74 2e 20 49 66 20  nting to it. If 
111d0 61 72 67 75 6d 65 6e 74 20 62 47 65 20 69 73 20  argument bGe is 
111e0 7a 65 72 6f 20 61 6e 64 20 74 68 65 20 74 65 72  zero and the ter
111f0 6d 20 69 73 20 6e 6f 74 20 66 6f 75 6e 64 2c 0a  m is not found,.
11200 2a 2a 20 74 68 65 20 69 74 65 72 61 74 6f 72 20  ** the iterator 
11210 69 73 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67  is left pointing
11220 20 61 74 20 45 4f 46 2e 0a 2a 2a 0a 2a 2a 20 49   at EOF..**.** I
11230 66 20 62 47 65 20 69 73 20 6e 6f 6e 2d 7a 65 72  f bGe is non-zer
11240 6f 20 61 6e 64 20 74 68 65 20 73 70 65 63 69 66  o and the specif
11250 69 65 64 20 74 65 72 6d 20 69 73 20 6e 6f 74 20  ied term is not 
11260 66 6f 75 6e 64 2c 20 74 68 65 6e 20 74 68 65 0a  found, then the.
11270 2a 2a 20 69 74 65 72 61 74 6f 72 20 69 73 20 6c  ** iterator is l
11280 65 66 74 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20  eft pointing to 
11290 74 68 65 20 73 6d 61 6c 6c 65 73 74 20 74 65 72  the smallest ter
112a0 6d 20 69 6e 20 74 68 65 20 73 65 67 6d 65 6e 74  m in the segment
112b0 20 74 68 61 74 0a 2a 2a 20 69 73 20 6c 61 72 67   that.** is larg
112c0 65 72 20 74 68 61 6e 20 74 68 65 20 73 70 65 63  er than the spec
112d0 69 66 69 65 64 20 74 65 72 6d 2c 20 65 76 65 6e  ified term, even
112e0 20 69 66 20 74 68 69 73 20 74 65 72 6d 20 69 73   if this term is
112f0 20 6e 6f 74 20 6f 6e 20 74 68 65 0a 2a 2a 20 63   not on the.** c
11300 75 72 72 65 6e 74 20 70 61 67 65 2e 0a 2a 2f 0a  urrent page..*/.
11310 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
11320 4c 65 61 66 53 65 65 6b 28 0a 20 20 46 74 73 35  LeafSeek(.  Fts5
11330 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20  Index *p,       
11340 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
11350 65 61 76 65 20 61 6e 79 20 65 72 72 6f 72 20 63  eave any error c
11360 6f 64 65 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e  ode here */.  in
11370 74 20 62 47 65 2c 20 20 20 20 20 20 20 20 20 20  t bGe,          
11380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
11390 20 54 72 75 65 20 66 6f 72 20 61 20 3e 3d 20 73   True for a >= s
113a0 65 61 72 63 68 20 2a 2f 0a 20 20 46 74 73 35 53  earch */.  Fts5S
113b0 65 67 49 74 65 72 20 2a 70 49 74 65 72 2c 20 20  egIter *pIter,  
113c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 74             /* It
113d0 65 72 61 74 6f 72 20 74 6f 20 73 65 65 6b 20 2a  erator to seek *
113e0 2f 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 70 54  /.  const u8 *pT
113f0 65 72 6d 2c 20 69 6e 74 20 6e 54 65 72 6d 20 20  erm, int nTerm  
11400 20 20 20 20 2f 2a 20 54 65 72 6d 20 74 6f 20 73      /* Term to s
11410 65 61 72 63 68 20 66 6f 72 20 2a 2f 0a 29 7b 0a  earch for */.){.
11420 20 20 69 6e 74 20 69 4f 66 66 3b 0a 20 20 63 6f    int iOff;.  co
11430 6e 73 74 20 75 38 20 2a 61 20 3d 20 70 49 74 65  nst u8 *a = pIte
11440 72 2d 3e 70 4c 65 61 66 2d 3e 70 3b 0a 20 20 69  r->pLeaf->p;.  i
11450 6e 74 20 73 7a 4c 65 61 66 20 3d 20 70 49 74 65  nt szLeaf = pIte
11460 72 2d 3e 70 4c 65 61 66 2d 3e 73 7a 4c 65 61 66  r->pLeaf->szLeaf
11470 3b 0a 20 20 69 6e 74 20 6e 20 3d 20 70 49 74 65  ;.  int n = pIte
11480 72 2d 3e 70 4c 65 61 66 2d 3e 6e 6e 3b 0a 0a 20  r->pLeaf->nn;.. 
11490 20 69 6e 74 20 6e 4d 61 74 63 68 20 3d 20 30 3b   int nMatch = 0;
114a0 0a 20 20 69 6e 74 20 6e 4b 65 65 70 20 3d 20 30  .  int nKeep = 0
114b0 3b 0a 20 20 69 6e 74 20 6e 4e 65 77 20 3d 20 30  ;.  int nNew = 0
114c0 3b 0a 20 20 69 6e 74 20 69 54 65 72 6d 4f 66 66  ;.  int iTermOff
114d0 3b 0a 20 20 69 6e 74 20 69 50 67 69 64 78 3b 20  ;.  int iPgidx; 
114e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
114f0 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 6f      /* Current o
11500 66 66 73 65 74 20 69 6e 20 70 67 69 64 78 20 2a  ffset in pgidx *
11510 2f 0a 20 20 69 6e 74 20 62 45 6e 64 4f 66 50 61  /.  int bEndOfPa
11520 67 65 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72  ge = 0;..  asser
11530 74 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  t( p->rc==SQLITE
11540 5f 4f 4b 20 29 3b 0a 0a 20 20 69 50 67 69 64 78  _OK );..  iPgidx
11550 20 3d 20 73 7a 4c 65 61 66 3b 0a 20 20 69 50 67   = szLeaf;.  iPg
11560 69 64 78 20 2b 3d 20 66 74 73 35 47 65 74 56 61  idx += fts5GetVa
11570 72 69 6e 74 33 32 28 26 61 5b 69 50 67 69 64 78  rint32(&a[iPgidx
11580 5d 2c 20 69 54 65 72 6d 4f 66 66 29 3b 0a 20 20  ], iTermOff);.  
11590 69 4f 66 66 20 3d 20 69 54 65 72 6d 4f 66 66 3b  iOff = iTermOff;
115a0 0a 20 20 69 66 28 20 69 4f 66 66 3e 6e 20 29 7b  .  if( iOff>n ){
115b0 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 46 54 53  .    p->rc = FTS
115c0 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20 20 72  5_CORRUPT;.    r
115d0 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20 77 68  eturn;.  }..  wh
115e0 69 6c 65 28 20 31 20 29 7b 0a 0a 20 20 20 20 2f  ile( 1 ){..    /
115f0 2a 20 46 69 67 75 72 65 20 6f 75 74 20 68 6f 77  * Figure out how
11600 20 6d 61 6e 79 20 6e 65 77 20 62 79 74 65 73 20   many new bytes 
11610 61 72 65 20 69 6e 20 74 68 69 73 20 74 65 72 6d  are in this term
11620 20 2a 2f 0a 20 20 20 20 66 74 73 35 46 61 73 74   */.    fts5Fast
11630 47 65 74 56 61 72 69 6e 74 33 32 28 61 2c 20 69  GetVarint32(a, i
11640 4f 66 66 2c 20 6e 4e 65 77 29 3b 0a 20 20 20 20  Off, nNew);.    
11650 69 66 28 20 6e 4b 65 65 70 3c 6e 4d 61 74 63 68  if( nKeep<nMatch
11660 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73   ){.      goto s
11670 65 61 72 63 68 5f 66 61 69 6c 65 64 3b 0a 20 20  earch_failed;.  
11680 20 20 7d 0a 0a 20 20 20 20 61 73 73 65 72 74 28    }..    assert(
11690 20 6e 4b 65 65 70 3e 3d 6e 4d 61 74 63 68 20 29   nKeep>=nMatch )
116a0 3b 0a 20 20 20 20 69 66 28 20 6e 4b 65 65 70 3d  ;.    if( nKeep=
116b0 3d 6e 4d 61 74 63 68 20 29 7b 0a 20 20 20 20 20  =nMatch ){.     
116c0 20 69 6e 74 20 6e 43 6d 70 3b 0a 20 20 20 20 20   int nCmp;.     
116d0 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 6e 43   int i;.      nC
116e0 6d 70 20 3d 20 4d 49 4e 28 6e 4e 65 77 2c 20 6e  mp = MIN(nNew, n
116f0 54 65 72 6d 2d 6e 4d 61 74 63 68 29 3b 0a 20 20  Term-nMatch);.  
11700 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
11710 43 6d 70 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Cmp; i++){.     
11720 20 20 20 69 66 28 20 61 5b 69 4f 66 66 2b 69 5d     if( a[iOff+i]
11730 21 3d 70 54 65 72 6d 5b 6e 4d 61 74 63 68 2b 69  !=pTerm[nMatch+i
11740 5d 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  ] ) break;.     
11750 20 7d 0a 20 20 20 20 20 20 6e 4d 61 74 63 68 20   }.      nMatch 
11760 2b 3d 20 69 3b 0a 0a 20 20 20 20 20 20 69 66 28  += i;..      if(
11770 20 6e 54 65 72 6d 3d 3d 6e 4d 61 74 63 68 20 29   nTerm==nMatch )
11780 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 3d  {.        if( i=
11790 3d 6e 4e 65 77 20 29 7b 0a 20 20 20 20 20 20 20  =nNew ){.       
117a0 20 20 20 67 6f 74 6f 20 73 65 61 72 63 68 5f 73     goto search_s
117b0 75 63 63 65 73 73 3b 0a 20 20 20 20 20 20 20 20  uccess;.        
117c0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
117d0 20 67 6f 74 6f 20 73 65 61 72 63 68 5f 66 61 69   goto search_fai
117e0 6c 65 64 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  led;.        }. 
117f0 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 69       }else if( i
11800 3c 6e 4e 65 77 20 26 26 20 61 5b 69 4f 66 66 2b  <nNew && a[iOff+
11810 69 5d 3e 70 54 65 72 6d 5b 6e 4d 61 74 63 68 5d  i]>pTerm[nMatch]
11820 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f   ){.        goto
11830 20 73 65 61 72 63 68 5f 66 61 69 6c 65 64 3b 0a   search_failed;.
11840 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
11850 20 20 20 69 66 28 20 69 50 67 69 64 78 3e 3d 6e     if( iPgidx>=n
11860 20 29 7b 0a 20 20 20 20 20 20 62 45 6e 64 4f 66   ){.      bEndOf
11870 50 61 67 65 20 3d 20 31 3b 0a 20 20 20 20 20 20  Page = 1;.      
11880 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20  break;.    }..  
11890 20 20 69 50 67 69 64 78 20 2b 3d 20 66 74 73 35    iPgidx += fts5
118a0 47 65 74 56 61 72 69 6e 74 33 32 28 26 61 5b 69  GetVarint32(&a[i
118b0 50 67 69 64 78 5d 2c 20 6e 4b 65 65 70 29 3b 0a  Pgidx], nKeep);.
118c0 20 20 20 20 69 54 65 72 6d 4f 66 66 20 2b 3d 20      iTermOff += 
118d0 6e 4b 65 65 70 3b 0a 20 20 20 20 69 4f 66 66 20  nKeep;.    iOff 
118e0 3d 20 69 54 65 72 6d 4f 66 66 3b 0a 0a 20 20 20  = iTermOff;..   
118f0 20 2f 2a 20 52 65 61 64 20 74 68 65 20 6e 4b 65   /* Read the nKe
11900 65 70 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20  ep field of the 
11910 6e 65 78 74 20 74 65 72 6d 2e 20 2a 2f 0a 20 20  next term. */.  
11920 20 20 66 74 73 35 46 61 73 74 47 65 74 56 61 72    fts5FastGetVar
11930 69 6e 74 33 32 28 61 2c 20 69 4f 66 66 2c 20 6e  int32(a, iOff, n
11940 4b 65 65 70 29 3b 0a 20 20 7d 0a 0a 20 73 65 61  Keep);.  }.. sea
11950 72 63 68 5f 66 61 69 6c 65 64 3a 0a 20 20 69 66  rch_failed:.  if
11960 28 20 62 47 65 3d 3d 30 20 29 7b 0a 20 20 20 20  ( bGe==0 ){.    
11970 66 74 73 35 44 61 74 61 52 65 6c 65 61 73 65 28  fts5DataRelease(
11980 70 49 74 65 72 2d 3e 70 4c 65 61 66 29 3b 0a 20  pIter->pLeaf);. 
11990 20 20 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 20     pIter->pLeaf 
119a0 3d 20 30 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b  = 0;.    return;
119b0 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 62 45 6e  .  }else if( bEn
119c0 64 4f 66 50 61 67 65 20 29 7b 0a 20 20 20 20 64  dOfPage ){.    d
119d0 6f 20 7b 0a 20 20 20 20 20 20 66 74 73 35 53 65  o {.      fts5Se
119e0 67 49 74 65 72 4e 65 78 74 50 61 67 65 28 70 2c  gIterNextPage(p,
119f0 20 70 49 74 65 72 29 3b 0a 20 20 20 20 20 20 69   pIter);.      i
11a00 66 28 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 3d  f( pIter->pLeaf=
11a10 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20  =0 ) return;.   
11a20 20 20 20 61 20 3d 20 70 49 74 65 72 2d 3e 70 4c     a = pIter->pL
11a30 65 61 66 2d 3e 70 3b 0a 20 20 20 20 20 20 69 66  eaf->p;.      if
11a40 28 20 66 74 73 35 4c 65 61 66 49 73 54 65 72 6d  ( fts5LeafIsTerm
11a50 6c 65 73 73 28 70 49 74 65 72 2d 3e 70 4c 65 61  less(pIter->pLea
11a60 66 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  f)==0 ){.       
11a70 20 69 50 67 69 64 78 20 3d 20 70 49 74 65 72 2d   iPgidx = pIter-
11a80 3e 70 4c 65 61 66 2d 3e 73 7a 4c 65 61 66 3b 0a  >pLeaf->szLeaf;.
11a90 20 20 20 20 20 20 20 20 69 50 67 69 64 78 20 2b          iPgidx +
11aa0 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e 74 33  = fts5GetVarint3
11ab0 32 28 26 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d  2(&pIter->pLeaf-
11ac0 3e 70 5b 69 50 67 69 64 78 5d 2c 20 69 4f 66 66  >p[iPgidx], iOff
11ad0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69  );.        if( i
11ae0 4f 66 66 3c 34 20 7c 7c 20 69 4f 66 66 3e 3d 70  Off<4 || iOff>=p
11af0 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 73 7a 4c  Iter->pLeaf->szL
11b00 65 61 66 20 29 7b 0a 20 20 20 20 20 20 20 20 20  eaf ){.         
11b10 20 70 2d 3e 72 63 20 3d 20 46 54 53 35 5f 43 4f   p->rc = FTS5_CO
11b20 52 52 55 50 54 3b 0a 20 20 20 20 20 20 20 20 7d  RRUPT;.        }
11b30 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
11b40 6e 4b 65 65 70 20 3d 20 30 3b 0a 20 20 20 20 20  nKeep = 0;.     
11b50 20 20 20 20 20 69 54 65 72 6d 4f 66 66 20 3d 20       iTermOff = 
11b60 69 4f 66 66 3b 0a 20 20 20 20 20 20 20 20 20 20  iOff;.          
11b70 6e 20 3d 20 70 49 74 65 72 2d 3e 70 4c 65 61 66  n = pIter->pLeaf
11b80 2d 3e 6e 6e 3b 0a 20 20 20 20 20 20 20 20 20 20  ->nn;.          
11b90 69 4f 66 66 20 2b 3d 20 66 74 73 35 47 65 74 56  iOff += fts5GetV
11ba0 61 72 69 6e 74 33 32 28 26 61 5b 69 4f 66 66 5d  arint32(&a[iOff]
11bb0 2c 20 6e 4e 65 77 29 3b 0a 20 20 20 20 20 20 20  , nNew);.       
11bc0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
11bd0 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
11be0 7d 77 68 69 6c 65 28 20 31 20 29 3b 0a 20 20 7d  }while( 1 );.  }
11bf0 0a 0a 20 73 65 61 72 63 68 5f 73 75 63 63 65 73  .. search_succes
11c00 73 3a 0a 0a 20 20 70 49 74 65 72 2d 3e 69 4c 65  s:..  pIter->iLe
11c10 61 66 4f 66 66 73 65 74 20 3d 20 69 4f 66 66 20  afOffset = iOff 
11c20 2b 20 6e 4e 65 77 3b 0a 20 20 70 49 74 65 72 2d  + nNew;.  pIter-
11c30 3e 69 54 65 72 6d 4c 65 61 66 4f 66 66 73 65 74  >iTermLeafOffset
11c40 20 3d 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f   = pIter->iLeafO
11c50 66 66 73 65 74 3b 0a 20 20 70 49 74 65 72 2d 3e  ffset;.  pIter->
11c60 69 54 65 72 6d 4c 65 61 66 50 67 6e 6f 20 3d 20  iTermLeafPgno = 
11c70 70 49 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f  pIter->iLeafPgno
11c80 3b 0a 0a 20 20 66 74 73 35 42 75 66 66 65 72 53  ;..  fts5BufferS
11c90 65 74 28 26 70 2d 3e 72 63 2c 20 26 70 49 74 65  et(&p->rc, &pIte
11ca0 72 2d 3e 74 65 72 6d 2c 20 6e 4b 65 65 70 2c 20  r->term, nKeep, 
11cb0 70 54 65 72 6d 29 3b 0a 20 20 66 74 73 35 42 75  pTerm);.  fts5Bu
11cc0 66 66 65 72 41 70 70 65 6e 64 42 6c 6f 62 28 26  fferAppendBlob(&
11cd0 70 2d 3e 72 63 2c 20 26 70 49 74 65 72 2d 3e 74  p->rc, &pIter->t
11ce0 65 72 6d 2c 20 6e 4e 65 77 2c 20 26 61 5b 69 4f  erm, nNew, &a[iO
11cf0 66 66 5d 29 3b 0a 0a 20 20 69 66 28 20 69 50 67  ff]);..  if( iPg
11d00 69 64 78 3e 3d 6e 20 29 7b 0a 20 20 20 20 70 49  idx>=n ){.    pI
11d10 74 65 72 2d 3e 69 45 6e 64 6f 66 44 6f 63 6c 69  ter->iEndofDocli
11d20 73 74 20 3d 20 70 49 74 65 72 2d 3e 70 4c 65 61  st = pIter->pLea
11d30 66 2d 3e 6e 6e 2b 31 3b 0a 20 20 7d 65 6c 73 65  f->nn+1;.  }else
11d40 7b 0a 20 20 20 20 69 6e 74 20 6e 45 78 74 72 61  {.    int nExtra
11d50 3b 0a 20 20 20 20 69 50 67 69 64 78 20 2b 3d 20  ;.    iPgidx += 
11d60 66 74 73 35 47 65 74 56 61 72 69 6e 74 33 32 28  fts5GetVarint32(
11d70 26 61 5b 69 50 67 69 64 78 5d 2c 20 6e 45 78 74  &a[iPgidx], nExt
11d80 72 61 29 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e  ra);.    pIter->
11d90 69 45 6e 64 6f 66 44 6f 63 6c 69 73 74 20 3d 20  iEndofDoclist = 
11da0 69 54 65 72 6d 4f 66 66 20 2b 20 6e 45 78 74 72  iTermOff + nExtr
11db0 61 3b 0a 20 20 7d 0a 20 20 70 49 74 65 72 2d 3e  a;.  }.  pIter->
11dc0 69 50 67 69 64 78 4f 66 66 20 3d 20 69 50 67 69  iPgidxOff = iPgi
11dd0 64 78 3b 0a 0a 20 20 66 74 73 35 53 65 67 49 74  dx;..  fts5SegIt
11de0 65 72 4c 6f 61 64 52 6f 77 69 64 28 70 2c 20 70  erLoadRowid(p, p
11df0 49 74 65 72 29 3b 0a 20 20 66 74 73 35 53 65 67  Iter);.  fts5Seg
11e00 49 74 65 72 4c 6f 61 64 4e 50 6f 73 28 70 2c 20  IterLoadNPos(p, 
11e10 70 49 74 65 72 29 3b 0a 7d 0a 0a 73 74 61 74 69  pIter);.}..stati
11e20 63 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a  c sqlite3_stmt *
11e30 66 74 73 35 49 64 78 53 65 6c 65 63 74 53 74 6d  fts5IdxSelectStm
11e40 74 28 46 74 73 35 49 6e 64 65 78 20 2a 70 29 7b  t(Fts5Index *p){
11e50 0a 20 20 69 66 28 20 70 2d 3e 70 49 64 78 53 65  .  if( p->pIdxSe
11e60 6c 65 63 74 3d 3d 30 20 29 7b 0a 20 20 20 20 46  lect==0 ){.    F
11e70 74 73 35 43 6f 6e 66 69 67 20 2a 70 43 6f 6e 66  ts5Config *pConf
11e80 69 67 20 3d 20 70 2d 3e 70 43 6f 6e 66 69 67 3b  ig = p->pConfig;
11e90 0a 20 20 20 20 66 74 73 35 49 6e 64 65 78 50 72  .    fts5IndexPr
11ea0 65 70 61 72 65 53 74 6d 74 28 70 2c 20 26 70 2d  epareStmt(p, &p-
11eb0 3e 70 49 64 78 53 65 6c 65 63 74 2c 20 73 71 6c  >pIdxSelect, sql
11ec0 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 0a 20 20  ite3_mprintf(.  
11ed0 20 20 20 20 20 20 20 20 22 53 45 4c 45 43 54 20          "SELECT 
11ee0 70 67 6e 6f 20 46 52 4f 4d 20 27 25 71 27 2e 27  pgno FROM '%q'.'
11ef0 25 71 5f 69 64 78 27 20 57 48 45 52 45 20 22 0a  %q_idx' WHERE ".
11f00 20 20 20 20 20 20 20 20 20 20 22 73 65 67 69 64            "segid
11f10 3d 3f 20 41 4e 44 20 74 65 72 6d 3c 3d 3f 20 4f  =? AND term<=? O
11f20 52 44 45 52 20 42 59 20 74 65 72 6d 20 44 45 53  RDER BY term DES
11f30 43 20 4c 49 4d 49 54 20 31 22 2c 0a 20 20 20 20  C LIMIT 1",.    
11f40 20 20 20 20 20 20 70 43 6f 6e 66 69 67 2d 3e 7a        pConfig->z
11f50 44 62 2c 20 70 43 6f 6e 66 69 67 2d 3e 7a 4e 61  Db, pConfig->zNa
11f60 6d 65 0a 20 20 20 20 29 29 3b 0a 20 20 7d 0a 20  me.    ));.  }. 
11f70 20 72 65 74 75 72 6e 20 70 2d 3e 70 49 64 78 53   return p->pIdxS
11f80 65 6c 65 63 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  elect;.}../*.** 
11f90 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 6f  Initialize the o
11fa0 62 6a 65 63 74 20 70 49 74 65 72 20 74 6f 20 70  bject pIter to p
11fb0 6f 69 6e 74 20 74 6f 20 74 65 72 6d 20 70 54 65  oint to term pTe
11fc0 72 6d 2f 6e 54 65 72 6d 20 77 69 74 68 69 6e 20  rm/nTerm within 
11fd0 73 65 67 6d 65 6e 74 0a 2a 2a 20 70 53 65 67 2e  segment.** pSeg.
11fe0 20 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20   If there is no 
11ff0 73 75 63 68 20 74 65 72 6d 20 69 6e 20 74 68 65  such term in the
12000 20 69 6e 64 65 78 2c 20 74 68 65 20 69 74 65 72   index, the iter
12010 61 74 6f 72 20 69 73 20 73 65 74 20 74 6f 20 45  ator is set to E
12020 4f 46 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  OF..**.** If an 
12030 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 46 74  error occurs, Ft
12040 73 35 49 6e 64 65 78 2e 72 63 20 69 73 20 73 65  s5Index.rc is se
12050 74 20 74 6f 20 61 6e 20 61 70 70 72 6f 70 72 69  t to an appropri
12060 61 74 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 20  ate error code. 
12070 49 66 20 0a 2a 2a 20 61 6e 20 65 72 72 6f 72 20  If .** an error 
12080 68 61 73 20 61 6c 72 65 61 64 79 20 6f 63 63 75  has already occu
12090 72 72 65 64 20 77 68 65 6e 20 74 68 69 73 20 66  rred when this f
120a0 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
120b0 64 2c 20 69 74 20 69 73 20 61 20 6e 6f 2d 6f 70  d, it is a no-op
120c0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
120d0 20 66 74 73 35 53 65 67 49 74 65 72 53 65 65 6b   fts5SegIterSeek
120e0 49 6e 69 74 28 0a 20 20 46 74 73 35 49 6e 64 65  Init(.  Fts5Inde
120f0 78 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  x *p,           
12100 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53 35 20          /* FTS5 
12110 62 61 63 6b 65 6e 64 20 2a 2f 0a 20 20 63 6f 6e  backend */.  con
12120 73 74 20 75 38 20 2a 70 54 65 72 6d 2c 20 69 6e  st u8 *pTerm, in
12130 74 20 6e 54 65 72 6d 2c 20 20 20 20 20 2f 2a 20  t nTerm,     /* 
12140 54 65 72 6d 20 74 6f 20 73 65 65 6b 20 74 6f 20  Term to seek to 
12150 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c 20  */.  int flags, 
12160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12170 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20       /* Mask of 
12180 46 54 53 35 49 4e 44 45 58 5f 58 58 58 20 66 6c  FTS5INDEX_XXX fl
12190 61 67 73 20 2a 2f 0a 20 20 46 74 73 35 53 74 72  ags */.  Fts5Str
121a0 75 63 74 75 72 65 53 65 67 6d 65 6e 74 20 2a 70  uctureSegment *p
121b0 53 65 67 2c 20 20 20 20 20 2f 2a 20 44 65 73 63  Seg,     /* Desc
121c0 72 69 70 74 69 6f 6e 20 6f 66 20 73 65 67 6d 65  ription of segme
121d0 6e 74 20 2a 2f 0a 20 20 46 74 73 35 53 65 67 49  nt */.  Fts5SegI
121e0 74 65 72 20 2a 70 49 74 65 72 20 20 20 20 20 20  ter *pIter      
121f0 20 20 20 20 20 20 20 20 2f 2a 20 4f 62 6a 65 63          /* Objec
12200 74 20 74 6f 20 70 6f 70 75 6c 61 74 65 20 2a 2f  t to populate */
12210 0a 29 7b 0a 20 20 69 6e 74 20 69 50 67 20 3d 20  .){.  int iPg = 
12220 31 3b 0a 20 20 69 6e 74 20 62 47 65 20 3d 20 28  1;.  int bGe = (
12230 66 6c 61 67 73 20 26 20 46 54 53 35 49 4e 44 45  flags & FTS5INDE
12240 58 5f 51 55 45 52 59 5f 53 43 41 4e 29 3b 0a 20  X_QUERY_SCAN);. 
12250 20 69 6e 74 20 62 44 6c 69 64 78 20 3d 20 30 3b   int bDlidx = 0;
12260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12270 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65 72   /* True if ther
12280 65 20 69 73 20 61 20 64 6f 63 6c 69 73 74 2d 69  e is a doclist-i
12290 6e 64 65 78 20 2a 2f 0a 20 20 73 71 6c 69 74 65  ndex */.  sqlite
122a0 33 5f 73 74 6d 74 20 2a 70 49 64 78 53 65 6c 65  3_stmt *pIdxSele
122b0 63 74 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72  ct = 0;..  asser
122c0 74 28 20 62 47 65 3d 3d 30 20 7c 7c 20 28 66 6c  t( bGe==0 || (fl
122d0 61 67 73 20 26 20 46 54 53 35 49 4e 44 45 58 5f  ags & FTS5INDEX_
122e0 51 55 45 52 59 5f 44 45 53 43 29 3d 3d 30 20 29  QUERY_DESC)==0 )
122f0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 54 65 72  ;.  assert( pTer
12300 6d 20 26 26 20 6e 54 65 72 6d 20 29 3b 0a 20 20  m && nTerm );.  
12310 6d 65 6d 73 65 74 28 70 49 74 65 72 2c 20 30 2c  memset(pIter, 0,
12320 20 73 69 7a 65 6f 66 28 2a 70 49 74 65 72 29 29   sizeof(*pIter))
12330 3b 0a 20 20 70 49 74 65 72 2d 3e 70 53 65 67 20  ;.  pIter->pSeg 
12340 3d 20 70 53 65 67 3b 0a 0a 20 20 2f 2a 20 54 68  = pSeg;..  /* Th
12350 69 73 20 62 6c 6f 63 6b 20 73 65 74 73 20 73 74  is block sets st
12360 61 63 6b 20 76 61 72 69 61 62 6c 65 20 69 50 67  ack variable iPg
12370 20 74 6f 20 74 68 65 20 6c 65 61 66 20 70 61 67   to the leaf pag
12380 65 20 6e 75 6d 62 65 72 20 74 68 61 74 20 6d 61  e number that ma
12390 79 0a 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 20 74  y.  ** contain t
123a0 65 72 6d 20 28 70 54 65 72 6d 2f 6e 54 65 72 6d  erm (pTerm/nTerm
123b0 29 2c 20 69 66 20 69 74 20 69 73 20 70 72 65 73  ), if it is pres
123c0 65 6e 74 20 69 6e 20 74 68 65 20 73 65 67 6d 65  ent in the segme
123d0 6e 74 2e 20 2a 2f 0a 20 20 70 49 64 78 53 65 6c  nt. */.  pIdxSel
123e0 65 63 74 20 3d 20 66 74 73 35 49 64 78 53 65 6c  ect = fts5IdxSel
123f0 65 63 74 53 74 6d 74 28 70 29 3b 0a 20 20 69 66  ectStmt(p);.  if
12400 28 20 70 2d 3e 72 63 20 29 20 72 65 74 75 72 6e  ( p->rc ) return
12410 3b 0a 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64  ;.  sqlite3_bind
12420 5f 69 6e 74 28 70 49 64 78 53 65 6c 65 63 74 2c  _int(pIdxSelect,
12430 20 31 2c 20 70 53 65 67 2d 3e 69 53 65 67 69 64   1, pSeg->iSegid
12440 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 62 69 6e  );.  sqlite3_bin
12450 64 5f 62 6c 6f 62 28 70 49 64 78 53 65 6c 65 63  d_blob(pIdxSelec
12460 74 2c 20 32 2c 20 70 54 65 72 6d 2c 20 6e 54 65  t, 2, pTerm, nTe
12470 72 6d 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49  rm, SQLITE_STATI
12480 43 29 3b 0a 20 20 69 66 28 20 53 51 4c 49 54 45  C);.  if( SQLITE
12490 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33 5f 73 74  _ROW==sqlite3_st
124a0 65 70 28 70 49 64 78 53 65 6c 65 63 74 29 20 29  ep(pIdxSelect) )
124b0 7b 0a 20 20 20 20 69 36 34 20 76 61 6c 20 3d 20  {.    i64 val = 
124c0 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69  sqlite3_column_i
124d0 6e 74 28 70 49 64 78 53 65 6c 65 63 74 2c 20 30  nt(pIdxSelect, 0
124e0 29 3b 0a 20 20 20 20 69 50 67 20 3d 20 28 69 6e  );.    iPg = (in
124f0 74 29 28 76 61 6c 3e 3e 31 29 3b 0a 20 20 20 20  t)(val>>1);.    
12500 62 44 6c 69 64 78 20 3d 20 28 76 61 6c 20 26 20  bDlidx = (val & 
12510 30 78 30 30 30 31 29 3b 0a 20 20 7d 0a 20 20 70  0x0001);.  }.  p
12520 2d 3e 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 72  ->rc = sqlite3_r
12530 65 73 65 74 28 70 49 64 78 53 65 6c 65 63 74 29  eset(pIdxSelect)
12540 3b 0a 0a 20 20 69 66 28 20 69 50 67 3c 70 53 65  ;..  if( iPg<pSe
12550 67 2d 3e 70 67 6e 6f 46 69 72 73 74 20 29 7b 0a  g->pgnoFirst ){.
12560 20 20 20 20 69 50 67 20 3d 20 70 53 65 67 2d 3e      iPg = pSeg->
12570 70 67 6e 6f 46 69 72 73 74 3b 0a 20 20 20 20 62  pgnoFirst;.    b
12580 44 6c 69 64 78 20 3d 20 30 3b 0a 20 20 7d 0a 0a  Dlidx = 0;.  }..
12590 20 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 50 67    pIter->iLeafPg
125a0 6e 6f 20 3d 20 69 50 67 20 2d 20 31 3b 0a 20 20  no = iPg - 1;.  
125b0 66 74 73 35 53 65 67 49 74 65 72 4e 65 78 74 50  fts5SegIterNextP
125c0 61 67 65 28 70 2c 20 70 49 74 65 72 29 3b 0a 0a  age(p, pIter);..
125d0 20 20 69 66 28 20 70 49 74 65 72 2d 3e 70 4c 65    if( pIter->pLe
125e0 61 66 20 29 7b 0a 20 20 20 20 66 74 73 35 4c 65  af ){.    fts5Le
125f0 61 66 53 65 65 6b 28 70 2c 20 62 47 65 2c 20 70  afSeek(p, bGe, p
12600 49 74 65 72 2c 20 70 54 65 72 6d 2c 20 6e 54 65  Iter, pTerm, nTe
12610 72 6d 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  rm);.  }..  if( 
12620 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
12630 20 26 26 20 62 47 65 3d 3d 30 20 29 7b 0a 20 20   && bGe==0 ){.  
12640 20 20 70 49 74 65 72 2d 3e 66 6c 61 67 73 20 7c    pIter->flags |
12650 3d 20 46 54 53 35 5f 53 45 47 49 54 45 52 5f 4f  = FTS5_SEGITER_O
12660 4e 45 54 45 52 4d 3b 0a 20 20 20 20 69 66 28 20  NETERM;.    if( 
12670 70 49 74 65 72 2d 3e 70 4c 65 61 66 20 29 7b 0a  pIter->pLeaf ){.
12680 20 20 20 20 20 20 69 66 28 20 66 6c 61 67 73 20        if( flags 
12690 26 20 46 54 53 35 49 4e 44 45 58 5f 51 55 45 52  & FTS5INDEX_QUER
126a0 59 5f 44 45 53 43 20 29 7b 0a 20 20 20 20 20 20  Y_DESC ){.      
126b0 20 20 70 49 74 65 72 2d 3e 66 6c 61 67 73 20 7c    pIter->flags |
126c0 3d 20 46 54 53 35 5f 53 45 47 49 54 45 52 5f 52  = FTS5_SEGITER_R
126d0 45 56 45 52 53 45 3b 0a 20 20 20 20 20 20 7d 0a  EVERSE;.      }.
126e0 20 20 20 20 20 20 69 66 28 20 62 44 6c 69 64 78        if( bDlidx
126f0 20 29 7b 0a 20 20 20 20 20 20 20 20 66 74 73 35   ){.        fts5
12700 53 65 67 49 74 65 72 4c 6f 61 64 44 6c 69 64 78  SegIterLoadDlidx
12710 28 70 2c 20 70 49 74 65 72 29 3b 0a 20 20 20 20  (p, pIter);.    
12720 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 66 6c    }.      if( fl
12730 61 67 73 20 26 20 46 54 53 35 49 4e 44 45 58 5f  ags & FTS5INDEX_
12740 51 55 45 52 59 5f 44 45 53 43 20 29 7b 0a 20 20  QUERY_DESC ){.  
12750 20 20 20 20 20 20 66 74 73 35 53 65 67 49 74 65        fts5SegIte
12760 72 52 65 76 65 72 73 65 28 70 2c 20 70 49 74 65  rReverse(p, pIte
12770 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  r);.      }.    
12780 7d 0a 20 20 7d 0a 0a 20 20 66 74 73 35 53 65 67  }.  }..  fts5Seg
12790 49 74 65 72 53 65 74 4e 65 78 74 28 70 2c 20 70  IterSetNext(p, p
127a0 49 74 65 72 29 3b 0a 0a 20 20 2f 2a 20 45 69 74  Iter);..  /* Eit
127b0 68 65 72 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  her:.  **.  **  
127c0 20 31 29 20 61 6e 20 65 72 72 6f 72 20 68 61 73   1) an error has
127d0 20 6f 63 63 75 72 72 65 64 2c 20 6f 72 0a 20 20   occurred, or.  
127e0 2a 2a 20 20 20 32 29 20 74 68 65 20 69 74 65 72  **   2) the iter
127f0 61 74 6f 72 20 70 6f 69 6e 74 73 20 74 6f 20 45  ator points to E
12800 4f 46 2c 20 6f 72 0a 20 20 2a 2a 20 20 20 33 29  OF, or.  **   3)
12810 20 74 68 65 20 69 74 65 72 61 74 6f 72 20 70 6f   the iterator po
12820 69 6e 74 73 20 74 6f 20 61 6e 20 65 6e 74 72 79  ints to an entry
12830 20 77 69 74 68 20 74 65 72 6d 20 28 70 54 65 72   with term (pTer
12840 6d 2f 6e 54 65 72 6d 29 2c 20 6f 72 0a 20 20 2a  m/nTerm), or.  *
12850 2a 20 20 20 34 29 20 74 68 65 20 46 54 53 35 49  *   4) the FTS5I
12860 4e 44 45 58 5f 51 55 45 52 59 5f 53 43 41 4e 20  NDEX_QUERY_SCAN 
12870 66 6c 61 67 20 77 61 73 20 73 65 74 20 61 6e 64  flag was set and
12880 20 74 68 65 20 69 74 65 72 61 74 6f 72 20 70 6f   the iterator po
12890 69 6e 74 73 0a 20 20 2a 2a 20 20 20 20 20 20 74  ints.  **      t
128a0 6f 20 61 6e 20 65 6e 74 72 79 20 77 69 74 68 20  o an entry with 
128b0 61 20 74 65 72 6d 20 67 72 65 61 74 65 72 20 74  a term greater t
128c0 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20  han or equal to 
128d0 28 70 54 65 72 6d 2f 6e 54 65 72 6d 29 2e 0a 20  (pTerm/nTerm).. 
128e0 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d   */.  assert( p-
128f0 3e 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 20  >rc!=SQLITE_OK  
12900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12920 20 20 20 20 20 20 20 20 2f 2a 20 31 20 2a 2f 0a          /* 1 */.
12930 20 20 20 7c 7c 20 70 49 74 65 72 2d 3e 70 4c 65     || pIter->pLe
12940 61 66 3d 3d 30 20 20 20 20 20 20 20 20 20 20 20  af==0           
12950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12970 20 20 20 20 2f 2a 20 32 20 2a 2f 0a 20 20 20 7c      /* 2 */.   |
12980 7c 20 66 74 73 35 42 75 66 66 65 72 43 6f 6d 70  | fts5BufferComp
12990 61 72 65 42 6c 6f 62 28 26 70 49 74 65 72 2d 3e  areBlob(&pIter->
129a0 74 65 72 6d 2c 20 70 54 65 72 6d 2c 20 6e 54 65  term, pTerm, nTe
129b0 72 6d 29 3d 3d 30 20 20 20 20 20 20 20 20 20 20  rm)==0          
129c0 2f 2a 20 33 20 2a 2f 0a 20 20 20 7c 7c 20 28 62  /* 3 */.   || (b
129d0 47 65 20 26 26 20 66 74 73 35 42 75 66 66 65 72  Ge && fts5Buffer
129e0 43 6f 6d 70 61 72 65 42 6c 6f 62 28 26 70 49 74  CompareBlob(&pIt
129f0 65 72 2d 3e 74 65 72 6d 2c 20 70 54 65 72 6d 2c  er->term, pTerm,
12a00 20 6e 54 65 72 6d 29 3e 30 29 20 20 2f 2a 20 34   nTerm)>0)  /* 4
12a10 20 2a 2f 0a 20 20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a   */.  );.}../*.*
12a20 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65  * Initialize the
12a30 20 6f 62 6a 65 63 74 20 70 49 74 65 72 20 74 6f   object pIter to
12a40 20 70 6f 69 6e 74 20 74 6f 20 74 65 72 6d 20 70   point to term p
12a50 54 65 72 6d 2f 6e 54 65 72 6d 20 77 69 74 68 69  Term/nTerm withi
12a60 6e 20 74 68 65 0a 2a 2a 20 69 6e 2d 6d 65 6d 6f  n the.** in-memo
12a70 72 79 20 68 61 73 68 20 74 61 62 6c 65 2e 20 49  ry hash table. I
12a80 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 73 75  f there is no su
12a90 63 68 20 74 65 72 6d 20 69 6e 20 74 68 65 20 68  ch term in the h
12aa0 61 73 68 2d 74 61 62 6c 65 2c 20 74 68 65 20 0a  ash-table, the .
12ab0 2a 2a 20 69 74 65 72 61 74 6f 72 20 69 73 20 73  ** iterator is s
12ac0 65 74 20 74 6f 20 45 4f 46 2e 0a 2a 2a 0a 2a 2a  et to EOF..**.**
12ad0 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
12ae0 75 72 73 2c 20 46 74 73 35 49 6e 64 65 78 2e 72  urs, Fts5Index.r
12af0 63 20 69 73 20 73 65 74 20 74 6f 20 61 6e 20 61  c is set to an a
12b00 70 70 72 6f 70 72 69 61 74 65 20 65 72 72 6f 72  ppropriate error
12b10 20 63 6f 64 65 2e 20 49 66 20 0a 2a 2a 20 61 6e   code. If .** an
12b20 20 65 72 72 6f 72 20 68 61 73 20 61 6c 72 65 61   error has alrea
12b30 64 79 20 6f 63 63 75 72 72 65 64 20 77 68 65 6e  dy occurred when
12b40 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
12b50 73 20 63 61 6c 6c 65 64 2c 20 69 74 20 69 73 20  s called, it is 
12b60 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74  a no-op..*/.stat
12b70 69 63 20 76 6f 69 64 20 66 74 73 35 53 65 67 49  ic void fts5SegI
12b80 74 65 72 48 61 73 68 49 6e 69 74 28 0a 20 20 46  terHashInit(.  F
12b90 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20  ts5Index *p,    
12ba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
12bb0 2a 20 46 54 53 35 20 62 61 63 6b 65 6e 64 20 2a  * FTS5 backend *
12bc0 2f 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 70 54  /.  const u8 *pT
12bd0 65 72 6d 2c 20 69 6e 74 20 6e 54 65 72 6d 2c 20  erm, int nTerm, 
12be0 20 20 20 20 2f 2a 20 54 65 72 6d 20 74 6f 20 73      /* Term to s
12bf0 65 65 6b 20 74 6f 20 2a 2f 0a 20 20 69 6e 74 20  eek to */.  int 
12c00 66 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20 20  flags,          
12c10 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
12c20 61 73 6b 20 6f 66 20 46 54 53 35 49 4e 44 45 58  ask of FTS5INDEX
12c30 5f 58 58 58 20 66 6c 61 67 73 20 2a 2f 0a 20 20  _XXX flags */.  
12c40 46 74 73 35 53 65 67 49 74 65 72 20 2a 70 49 74  Fts5SegIter *pIt
12c50 65 72 20 20 20 20 20 20 20 20 20 20 20 20 20 20  er              
12c60 2f 2a 20 4f 62 6a 65 63 74 20 74 6f 20 70 6f 70  /* Object to pop
12c70 75 6c 61 74 65 20 2a 2f 0a 29 7b 0a 20 20 63 6f  ulate */.){.  co
12c80 6e 73 74 20 75 38 20 2a 70 4c 69 73 74 20 3d 20  nst u8 *pList = 
12c90 30 3b 0a 20 20 69 6e 74 20 6e 4c 69 73 74 20 3d  0;.  int nList =
12ca0 20 30 3b 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a   0;.  const u8 *
12cb0 7a 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 20 3d  z = 0;.  int n =
12cc0 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70   0;..  assert( p
12cd0 2d 3e 70 48 61 73 68 20 29 3b 0a 20 20 61 73 73  ->pHash );.  ass
12ce0 65 72 74 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49  ert( p->rc==SQLI
12cf0 54 45 5f 4f 4b 20 29 3b 0a 0a 20 20 69 66 28 20  TE_OK );..  if( 
12d00 70 54 65 72 6d 3d 3d 30 20 7c 7c 20 28 66 6c 61  pTerm==0 || (fla
12d10 67 73 20 26 20 46 54 53 35 49 4e 44 45 58 5f 51  gs & FTS5INDEX_Q
12d20 55 45 52 59 5f 53 43 41 4e 29 20 29 7b 0a 20 20  UERY_SCAN) ){.  
12d30 20 20 70 2d 3e 72 63 20 3d 20 73 71 6c 69 74 65    p->rc = sqlite
12d40 33 46 74 73 35 48 61 73 68 53 63 61 6e 49 6e 69  3Fts5HashScanIni
12d50 74 28 70 2d 3e 70 48 61 73 68 2c 20 28 63 6f 6e  t(p->pHash, (con
12d60 73 74 20 63 68 61 72 2a 29 70 54 65 72 6d 2c 20  st char*)pTerm, 
12d70 6e 54 65 72 6d 29 3b 0a 20 20 20 20 73 71 6c 69  nTerm);.    sqli
12d80 74 65 33 46 74 73 35 48 61 73 68 53 63 61 6e 45  te3Fts5HashScanE
12d90 6e 74 72 79 28 70 2d 3e 70 48 61 73 68 2c 20 28  ntry(p->pHash, (
12da0 63 6f 6e 73 74 20 63 68 61 72 2a 2a 29 26 7a 2c  const char**)&z,
12db0 20 26 70 4c 69 73 74 2c 20 26 6e 4c 69 73 74 29   &pList, &nList)
12dc0 3b 0a 20 20 20 20 6e 20 3d 20 28 7a 20 3f 20 28  ;.    n = (z ? (
12dd0 69 6e 74 29 73 74 72 6c 65 6e 28 28 63 6f 6e 73  int)strlen((cons
12de0 74 20 63 68 61 72 2a 29 7a 29 20 3a 20 30 29 3b  t char*)z) : 0);
12df0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 49  .  }else{.    pI
12e00 74 65 72 2d 3e 66 6c 61 67 73 20 7c 3d 20 46 54  ter->flags |= FT
12e10 53 35 5f 53 45 47 49 54 45 52 5f 4f 4e 45 54 45  S5_SEGITER_ONETE
12e20 52 4d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 46  RM;.    sqlite3F
12e30 74 73 35 48 61 73 68 51 75 65 72 79 28 70 2d 3e  ts5HashQuery(p->
12e40 70 48 61 73 68 2c 20 28 63 6f 6e 73 74 20 63 68  pHash, (const ch
12e50 61 72 2a 29 70 54 65 72 6d 2c 20 6e 54 65 72 6d  ar*)pTerm, nTerm
12e60 2c 20 26 70 4c 69 73 74 2c 20 26 6e 4c 69 73 74  , &pList, &nList
12e70 29 3b 0a 20 20 20 20 7a 20 3d 20 70 54 65 72 6d  );.    z = pTerm
12e80 3b 0a 20 20 20 20 6e 20 3d 20 6e 54 65 72 6d 3b  ;.    n = nTerm;
12e90 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 4c 69 73  .  }..  if( pLis
12ea0 74 20 29 7b 0a 20 20 20 20 46 74 73 35 44 61 74  t ){.    Fts5Dat
12eb0 61 20 2a 70 4c 65 61 66 3b 0a 20 20 20 20 73 71  a *pLeaf;.    sq
12ec0 6c 69 74 65 33 46 74 73 35 42 75 66 66 65 72 53  lite3Fts5BufferS
12ed0 65 74 28 26 70 2d 3e 72 63 2c 20 26 70 49 74 65  et(&p->rc, &pIte
12ee0 72 2d 3e 74 65 72 6d 2c 20 6e 2c 20 7a 29 3b 0a  r->term, n, z);.
12ef0 20 20 20 20 70 4c 65 61 66 20 3d 20 66 74 73 35      pLeaf = fts5
12f00 49 64 78 4d 61 6c 6c 6f 63 28 70 2c 20 73 69 7a  IdxMalloc(p, siz
12f10 65 6f 66 28 46 74 73 35 44 61 74 61 29 29 3b 0a  eof(Fts5Data));.
12f20 20 20 20 20 69 66 28 20 70 4c 65 61 66 3d 3d 30      if( pLeaf==0
12f30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 70   ) return;.    p
12f40 4c 65 61 66 2d 3e 70 20 3d 20 28 75 38 2a 29 70  Leaf->p = (u8*)p
12f50 4c 69 73 74 3b 0a 20 20 20 20 70 4c 65 61 66 2d  List;.    pLeaf-
12f60 3e 6e 6e 20 3d 20 70 4c 65 61 66 2d 3e 73 7a 4c  >nn = pLeaf->szL
12f70 65 61 66 20 3d 20 6e 4c 69 73 74 3b 0a 20 20 20  eaf = nList;.   
12f80 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 20 3d 20   pIter->pLeaf = 
12f90 70 4c 65 61 66 3b 0a 20 20 20 20 70 49 74 65 72  pLeaf;.    pIter
12fa0 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 20 3d 20  ->iLeafOffset = 
12fb0 66 74 73 35 47 65 74 56 61 72 69 6e 74 28 70 4c  fts5GetVarint(pL
12fc0 65 61 66 2d 3e 70 2c 20 28 75 36 34 2a 29 26 70  eaf->p, (u64*)&p
12fd0 49 74 65 72 2d 3e 69 52 6f 77 69 64 29 3b 0a 20  Iter->iRowid);. 
12fe0 20 20 20 70 49 74 65 72 2d 3e 69 45 6e 64 6f 66     pIter->iEndof
12ff0 44 6f 63 6c 69 73 74 20 3d 20 70 4c 65 61 66 2d  Doclist = pLeaf-
13000 3e 6e 6e 3b 0a 0a 20 20 20 20 69 66 28 20 66 6c  >nn;..    if( fl
13010 61 67 73 20 26 20 46 54 53 35 49 4e 44 45 58 5f  ags & FTS5INDEX_
13020 51 55 45 52 59 5f 44 45 53 43 20 29 7b 0a 20 20  QUERY_DESC ){.  
13030 20 20 20 20 70 49 74 65 72 2d 3e 66 6c 61 67 73      pIter->flags
13040 20 7c 3d 20 46 54 53 35 5f 53 45 47 49 54 45 52   |= FTS5_SEGITER
13050 5f 52 45 56 45 52 53 45 3b 0a 20 20 20 20 20 20  _REVERSE;.      
13060 66 74 73 35 53 65 67 49 74 65 72 52 65 76 65 72  fts5SegIterRever
13070 73 65 49 6e 69 74 50 61 67 65 28 70 2c 20 70 49  seInitPage(p, pI
13080 74 65 72 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  ter);.    }else{
13090 0a 20 20 20 20 20 20 66 74 73 35 53 65 67 49 74  .      fts5SegIt
130a0 65 72 4c 6f 61 64 4e 50 6f 73 28 70 2c 20 70 49  erLoadNPos(p, pI
130b0 74 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ter);.    }.  }.
130c0 0a 20 20 66 74 73 35 53 65 67 49 74 65 72 53 65  .  fts5SegIterSe
130d0 74 4e 65 78 74 28 70 2c 20 70 49 74 65 72 29 3b  tNext(p, pIter);
130e0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 5a 65 72 6f 20 74  .}../*.** Zero t
130f0 68 65 20 69 74 65 72 61 74 6f 72 20 70 61 73 73  he iterator pass
13100 65 64 20 61 73 20 74 68 65 20 6f 6e 6c 79 20 61  ed as the only a
13110 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74  rgument..*/.stat
13120 69 63 20 76 6f 69 64 20 66 74 73 35 53 65 67 49  ic void fts5SegI
13130 74 65 72 43 6c 65 61 72 28 46 74 73 35 53 65 67  terClear(Fts5Seg
13140 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a 20 20  Iter *pIter){.  
13150 66 74 73 35 42 75 66 66 65 72 46 72 65 65 28 26  fts5BufferFree(&
13160 70 49 74 65 72 2d 3e 74 65 72 6d 29 3b 0a 20 20  pIter->term);.  
13170 66 74 73 35 44 61 74 61 52 65 6c 65 61 73 65 28  fts5DataRelease(
13180 70 49 74 65 72 2d 3e 70 4c 65 61 66 29 3b 0a 20  pIter->pLeaf);. 
13190 20 66 74 73 35 44 61 74 61 52 65 6c 65 61 73 65   fts5DataRelease
131a0 28 70 49 74 65 72 2d 3e 70 4e 65 78 74 4c 65 61  (pIter->pNextLea
131b0 66 29 3b 0a 20 20 66 74 73 35 44 6c 69 64 78 49  f);.  fts5DlidxI
131c0 74 65 72 46 72 65 65 28 70 49 74 65 72 2d 3e 70  terFree(pIter->p
131d0 44 6c 69 64 78 29 3b 0a 20 20 73 71 6c 69 74 65  Dlidx);.  sqlite
131e0 33 5f 66 72 65 65 28 70 49 74 65 72 2d 3e 61 52  3_free(pIter->aR
131f0 6f 77 69 64 4f 66 66 73 65 74 29 3b 0a 20 20 6d  owidOffset);.  m
13200 65 6d 73 65 74 28 70 49 74 65 72 2c 20 30 2c 20  emset(pIter, 0, 
13210 73 69 7a 65 6f 66 28 46 74 73 35 53 65 67 49 74  sizeof(Fts5SegIt
13220 65 72 29 29 3b 0a 7d 0a 0a 23 69 66 64 65 66 20  er));.}..#ifdef 
13230 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 0a 2f 2a  SQLITE_DEBUG../*
13240 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
13250 6e 20 69 73 20 75 73 65 64 20 61 73 20 70 61 72  n is used as par
13260 74 20 6f 66 20 74 68 65 20 62 69 67 20 61 73 73  t of the big ass
13270 65 72 74 28 29 20 70 72 6f 63 65 64 75 72 65 20  ert() procedure 
13280 69 6d 70 6c 65 6d 65 6e 74 65 64 20 62 79 0a 2a  implemented by.*
13290 2a 20 66 74 73 35 41 73 73 65 72 74 4d 75 6c 74  * fts5AssertMult
132a0 69 49 74 65 72 53 65 74 75 70 28 29 2e 20 49 74  iIterSetup(). It
132b0 20 65 6e 73 75 72 65 73 20 74 68 61 74 20 74 68   ensures that th
132c0 65 20 72 65 73 75 6c 74 20 63 75 72 72 65 6e 74  e result current
132d0 6c 79 20 73 74 6f 72 65 64 0a 2a 2a 20 69 6e 20  ly stored.** in 
132e0 2a 70 52 65 73 20 69 73 20 74 68 65 20 63 6f 72  *pRes is the cor
132f0 72 65 63 74 20 72 65 73 75 6c 74 20 6f 66 20 63  rect result of c
13300 6f 6d 70 61 72 69 6e 67 20 74 68 65 20 63 75 72  omparing the cur
13310 72 65 6e 74 20 70 6f 73 69 74 69 6f 6e 73 20 6f  rent positions o
13320 66 20 74 68 65 0a 2a 2a 20 74 77 6f 20 69 74 65  f the.** two ite
13330 72 61 74 6f 72 73 2e 0a 2a 2f 0a 73 74 61 74 69  rators..*/.stati
13340 63 20 76 6f 69 64 20 66 74 73 35 41 73 73 65 72  c void fts5Asser
13350 74 43 6f 6d 70 61 72 69 73 6f 6e 52 65 73 75 6c  tComparisonResul
13360 74 28 0a 20 20 46 74 73 35 49 74 65 72 20 2a 70  t(.  Fts5Iter *p
13370 49 74 65 72 2c 20 0a 20 20 46 74 73 35 53 65 67  Iter, .  Fts5Seg
13380 49 74 65 72 20 2a 70 31 2c 0a 20 20 46 74 73 35  Iter *p1,.  Fts5
13390 53 65 67 49 74 65 72 20 2a 70 32 2c 0a 20 20 46  SegIter *p2,.  F
133a0 74 73 35 43 52 65 73 75 6c 74 20 2a 70 52 65 73  ts5CResult *pRes
133b0 0a 29 7b 0a 20 20 69 6e 74 20 69 31 20 3d 20 70  .){.  int i1 = p
133c0 31 20 2d 20 70 49 74 65 72 2d 3e 61 53 65 67 3b  1 - pIter->aSeg;
133d0 0a 20 20 69 6e 74 20 69 32 20 3d 20 70 32 20 2d  .  int i2 = p2 -
133e0 20 70 49 74 65 72 2d 3e 61 53 65 67 3b 0a 0a 20   pIter->aSeg;.. 
133f0 20 69 66 28 20 70 31 2d 3e 70 4c 65 61 66 20 7c   if( p1->pLeaf |
13400 7c 20 70 32 2d 3e 70 4c 65 61 66 20 29 7b 0a 20  | p2->pLeaf ){. 
13410 20 20 20 69 66 28 20 70 31 2d 3e 70 4c 65 61 66     if( p1->pLeaf
13420 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 61 73 73  ==0 ){.      ass
13430 65 72 74 28 20 70 52 65 73 2d 3e 69 46 69 72 73  ert( pRes->iFirs
13440 74 3d 3d 69 32 20 29 3b 0a 20 20 20 20 7d 65 6c  t==i2 );.    }el
13450 73 65 20 69 66 28 20 70 32 2d 3e 70 4c 65 61 66  se if( p2->pLeaf
13460 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 61 73 73  ==0 ){.      ass
13470 65 72 74 28 20 70 52 65 73 2d 3e 69 46 69 72 73  ert( pRes->iFirs
13480 74 3d 3d 69 31 20 29 3b 0a 20 20 20 20 7d 65 6c  t==i1 );.    }el
13490 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 4d  se{.      int nM
134a0 69 6e 20 3d 20 4d 49 4e 28 70 31 2d 3e 74 65 72  in = MIN(p1->ter
134b0 6d 2e 6e 2c 20 70 32 2d 3e 74 65 72 6d 2e 6e 29  m.n, p2->term.n)
134c0 3b 0a 20 20 20 20 20 20 69 6e 74 20 72 65 73 20  ;.      int res 
134d0 3d 20 6d 65 6d 63 6d 70 28 70 31 2d 3e 74 65 72  = memcmp(p1->ter
134e0 6d 2e 70 2c 20 70 32 2d 3e 74 65 72 6d 2e 70 2c  m.p, p2->term.p,
134f0 20 6e 4d 69 6e 29 3b 0a 20 20 20 20 20 20 69 66   nMin);.      if
13500 28 20 72 65 73 3d 3d 30 20 29 20 72 65 73 20 3d  ( res==0 ) res =
13510 20 70 31 2d 3e 74 65 72 6d 2e 6e 20 2d 20 70 32   p1->term.n - p2
13520 2d 3e 74 65 72 6d 2e 6e 3b 0a 0a 20 20 20 20 20  ->term.n;..     
13530 20 69 66 28 20 72 65 73 3d 3d 30 20 29 7b 0a 20   if( res==0 ){. 
13540 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
13550 52 65 73 2d 3e 62 54 65 72 6d 45 71 3d 3d 31 20  Res->bTermEq==1 
13560 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
13570 74 28 20 70 31 2d 3e 69 52 6f 77 69 64 21 3d 70  t( p1->iRowid!=p
13580 32 2d 3e 69 52 6f 77 69 64 20 29 3b 0a 20 20 20  2->iRowid );.   
13590 20 20 20 20 20 72 65 73 20 3d 20 28 28 70 31 2d       res = ((p1-
135a0 3e 69 52 6f 77 69 64 20 3e 20 70 32 2d 3e 69 52  >iRowid > p2->iR
135b0 6f 77 69 64 29 3d 3d 70 49 74 65 72 2d 3e 62 52  owid)==pIter->bR
135c0 65 76 29 20 3f 20 2d 31 20 3a 20 31 3b 0a 20 20  ev) ? -1 : 1;.  
135d0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
135e0 20 20 20 61 73 73 65 72 74 28 20 70 52 65 73 2d     assert( pRes-
135f0 3e 62 54 65 72 6d 45 71 3d 3d 30 20 29 3b 0a 20  >bTermEq==0 );. 
13600 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66       }..      if
13610 28 20 72 65 73 3c 30 20 29 7b 0a 20 20 20 20 20  ( res<0 ){.     
13620 20 20 20 61 73 73 65 72 74 28 20 70 52 65 73 2d     assert( pRes-
13630 3e 69 46 69 72 73 74 3d 3d 69 31 20 29 3b 0a 20  >iFirst==i1 );. 
13640 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
13650 20 20 20 20 61 73 73 65 72 74 28 20 70 52 65 73      assert( pRes
13660 2d 3e 69 46 69 72 73 74 3d 3d 69 32 20 29 3b 0a  ->iFirst==i2 );.
13670 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
13680 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  }.}../*.** This 
13690 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f  function is a no
136a0 2d 6f 70 20 75 6e 6c 65 73 73 20 53 51 4c 49 54  -op unless SQLIT
136b0 45 5f 44 45 42 55 47 20 69 73 20 64 65 66 69 6e  E_DEBUG is defin
136c0 65 64 20 77 68 65 6e 20 74 68 69 73 20 6d 6f 64  ed when this mod
136d0 75 6c 65 0a 2a 2a 20 69 73 20 63 6f 6d 70 69 6c  ule.** is compil
136e0 65 64 2e 20 49 6e 20 74 68 61 74 20 63 61 73 65  ed. In that case
136f0 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  , this function 
13700 69 73 20 65 73 73 65 6e 74 69 61 6c 6c 79 20 61  is essentially a
13710 6e 20 61 73 73 65 72 74 28 29 20 0a 2a 2a 20 73  n assert() .** s
13720 74 61 74 65 6d 65 6e 74 20 75 73 65 64 20 74 6f  tatement used to
13730 20 76 65 72 69 66 79 20 74 68 61 74 20 74 68 65   verify that the
13740 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
13750 20 70 49 74 65 72 2d 3e 61 46 69 72 73 74 5b 5d   pIter->aFirst[]
13760 20 61 72 72 61 79 0a 2a 2a 20 61 72 65 20 63 6f   array.** are co
13770 72 72 65 63 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  rrect..*/.static
13780 20 76 6f 69 64 20 66 74 73 35 41 73 73 65 72 74   void fts5Assert
13790 4d 75 6c 74 69 49 74 65 72 53 65 74 75 70 28 46  MultiIterSetup(F
137a0 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 46 74 73  ts5Index *p, Fts
137b0 35 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a 20  5Iter *pIter){. 
137c0 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49   if( p->rc==SQLI
137d0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 46 74 73  TE_OK ){.    Fts
137e0 35 53 65 67 49 74 65 72 20 2a 70 46 69 72 73 74  5SegIter *pFirst
137f0 20 3d 20 26 70 49 74 65 72 2d 3e 61 53 65 67 5b   = &pIter->aSeg[
13800 20 70 49 74 65 72 2d 3e 61 46 69 72 73 74 5b 31   pIter->aFirst[1
13810 5d 2e 69 46 69 72 73 74 20 5d 3b 0a 20 20 20 20  ].iFirst ];.    
13820 69 6e 74 20 69 3b 0a 0a 20 20 20 20 61 73 73 65  int i;..    asse
13830 72 74 28 20 28 70 46 69 72 73 74 2d 3e 70 4c 65  rt( (pFirst->pLe
13840 61 66 3d 3d 30 29 3d 3d 70 49 74 65 72 2d 3e 62  af==0)==pIter->b
13850 61 73 65 2e 62 45 6f 66 20 29 3b 0a 0a 20 20 20  ase.bEof );..   
13860 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20 70   /* Check that p
13870 49 74 65 72 2d 3e 69 53 77 69 74 63 68 52 6f 77  Iter->iSwitchRow
13880 69 64 20 69 73 20 73 65 74 20 63 6f 72 72 65 63  id is set correc
13890 74 6c 79 2e 20 2a 2f 0a 20 20 20 20 66 6f 72 28  tly. */.    for(
138a0 69 3d 30 3b 20 69 3c 70 49 74 65 72 2d 3e 6e 53  i=0; i<pIter->nS
138b0 65 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  eg; i++){.      
138c0 46 74 73 35 53 65 67 49 74 65 72 20 2a 70 31 20  Fts5SegIter *p1 
138d0 3d 20 26 70 49 74 65 72 2d 3e 61 53 65 67 5b 69  = &pIter->aSeg[i
138e0 5d 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ];.      assert(
138f0 20 70 31 3d 3d 70 46 69 72 73 74 20 0a 20 20 20   p1==pFirst .   
13900 20 20 20 20 20 20 20 20 7c 7c 20 70 31 2d 3e 70          || p1->p
13910 4c 65 61 66 3d 3d 30 20 0a 20 20 20 20 20 20 20  Leaf==0 .       
13920 20 20 20 20 7c 7c 20 66 74 73 35 42 75 66 66 65      || fts5Buffe
13930 72 43 6f 6d 70 61 72 65 28 26 70 46 69 72 73 74  rCompare(&pFirst
13940 2d 3e 74 65 72 6d 2c 20 26 70 31 2d 3e 74 65 72  ->term, &p1->ter
13950 6d 29 20 0a 20 20 20 20 20 20 20 20 20 20 20 7c  m) .           |
13960 7c 20 70 31 2d 3e 69 52 6f 77 69 64 3d 3d 70 49  | p1->iRowid==pI
13970 74 65 72 2d 3e 69 53 77 69 74 63 68 52 6f 77 69  ter->iSwitchRowi
13980 64 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20  d.           || 
13990 28 70 31 2d 3e 69 52 6f 77 69 64 3c 70 49 74 65  (p1->iRowid<pIte
139a0 72 2d 3e 69 53 77 69 74 63 68 52 6f 77 69 64 29  r->iSwitchRowid)
139b0 3d 3d 70 49 74 65 72 2d 3e 62 52 65 76 0a 20 20  ==pIter->bRev.  
139c0 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 0a 20 20      );.    }..  
139d0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49 74    for(i=0; i<pIt
139e0 65 72 2d 3e 6e 53 65 67 3b 20 69 2b 3d 32 29 7b  er->nSeg; i+=2){
139f0 0a 20 20 20 20 20 20 46 74 73 35 53 65 67 49 74  .      Fts5SegIt
13a00 65 72 20 2a 70 31 20 3d 20 26 70 49 74 65 72 2d  er *p1 = &pIter-
13a10 3e 61 53 65 67 5b 69 5d 3b 0a 20 20 20 20 20 20  >aSeg[i];.      
13a20 46 74 73 35 53 65 67 49 74 65 72 20 2a 70 32 20  Fts5SegIter *p2 
13a30 3d 20 26 70 49 74 65 72 2d 3e 61 53 65 67 5b 69  = &pIter->aSeg[i
13a40 2b 31 5d 3b 0a 20 20 20 20 20 20 46 74 73 35 43  +1];.      Fts5C
13a50 52 65 73 75 6c 74 20 2a 70 52 65 73 20 3d 20 26  Result *pRes = &
13a60 70 49 74 65 72 2d 3e 61 46 69 72 73 74 5b 28 70  pIter->aFirst[(p
13a70 49 74 65 72 2d 3e 6e 53 65 67 20 2b 20 69 29 20  Iter->nSeg + i) 
13a80 2f 20 32 5d 3b 0a 20 20 20 20 20 20 66 74 73 35  / 2];.      fts5
13a90 41 73 73 65 72 74 43 6f 6d 70 61 72 69 73 6f 6e  AssertComparison
13aa0 52 65 73 75 6c 74 28 70 49 74 65 72 2c 20 70 31  Result(pIter, p1
13ab0 2c 20 70 32 2c 20 70 52 65 73 29 3b 0a 20 20 20  , p2, pRes);.   
13ac0 20 7d 0a 0a 20 20 20 20 66 6f 72 28 69 3d 31 3b   }..    for(i=1;
13ad0 20 69 3c 28 70 49 74 65 72 2d 3e 6e 53 65 67 20   i<(pIter->nSeg 
13ae0 2f 20 32 29 3b 20 69 2b 3d 32 29 7b 0a 20 20 20  / 2); i+=2){.   
13af0 20 20 20 46 74 73 35 53 65 67 49 74 65 72 20 2a     Fts5SegIter *
13b00 70 31 20 3d 20 26 70 49 74 65 72 2d 3e 61 53 65  p1 = &pIter->aSe
13b10 67 5b 20 70 49 74 65 72 2d 3e 61 46 69 72 73 74  g[ pIter->aFirst
13b20 5b 69 2a 32 5d 2e 69 46 69 72 73 74 20 5d 3b 0a  [i*2].iFirst ];.
13b30 20 20 20 20 20 20 46 74 73 35 53 65 67 49 74 65        Fts5SegIte
13b40 72 20 2a 70 32 20 3d 20 26 70 49 74 65 72 2d 3e  r *p2 = &pIter->
13b50 61 53 65 67 5b 20 70 49 74 65 72 2d 3e 61 46 69  aSeg[ pIter->aFi
13b60 72 73 74 5b 69 2a 32 2b 31 5d 2e 69 46 69 72 73  rst[i*2+1].iFirs
13b70 74 20 5d 3b 0a 20 20 20 20 20 20 46 74 73 35 43  t ];.      Fts5C
13b80 52 65 73 75 6c 74 20 2a 70 52 65 73 20 3d 20 26  Result *pRes = &
13b90 70 49 74 65 72 2d 3e 61 46 69 72 73 74 5b 69 5d  pIter->aFirst[i]
13ba0 3b 0a 20 20 20 20 20 20 66 74 73 35 41 73 73 65  ;.      fts5Asse
13bb0 72 74 43 6f 6d 70 61 72 69 73 6f 6e 52 65 73 75  rtComparisonResu
13bc0 6c 74 28 70 49 74 65 72 2c 20 70 31 2c 20 70 32  lt(pIter, p1, p2
13bd0 2c 20 70 52 65 73 29 3b 0a 20 20 20 20 7d 0a 20  , pRes);.    }. 
13be0 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66   }.}.#else.# def
13bf0 69 6e 65 20 66 74 73 35 41 73 73 65 72 74 4d 75  ine fts5AssertMu
13c00 6c 74 69 49 74 65 72 53 65 74 75 70 28 78 2c 79  ltiIterSetup(x,y
13c10 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  ).#endif../*.** 
13c20 44 6f 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f  Do the compariso
13c30 6e 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20 70  n necessary to p
13c40 6f 70 75 6c 61 74 65 20 70 49 74 65 72 2d 3e 61  opulate pIter->a
13c50 46 69 72 73 74 5b 69 4f 75 74 5d 2e 0a 2a 2a 0a  First[iOut]..**.
13c60 2a 2a 20 49 66 20 74 68 65 20 72 65 74 75 72 6e  ** If the return
13c70 65 64 20 76 61 6c 75 65 20 69 73 20 6e 6f 6e 2d  ed value is non-
13c80 7a 65 72 6f 2c 20 74 68 65 6e 20 69 74 20 69 73  zero, then it is
13c90 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 61 6e   the index of an
13ca0 20 65 6e 74 72 79 0a 2a 2a 20 69 6e 20 74 68 65   entry.** in the
13cb0 20 70 49 74 65 72 2d 3e 61 53 65 67 5b 5d 20 61   pIter->aSeg[] a
13cc0 72 72 61 79 20 74 68 61 74 20 69 73 20 28 61 29  rray that is (a)
13cd0 20 6e 6f 74 20 61 74 20 45 4f 46 2c 20 61 6e 64   not at EOF, and
13ce0 20 28 62 29 20 70 6f 69 6e 74 69 6e 67 0a 2a 2a   (b) pointing.**
13cf0 20 74 6f 20 61 20 6b 65 79 20 74 68 61 74 20 69   to a key that i
13d00 73 20 61 20 64 75 70 6c 69 63 61 74 65 20 6f 66  s a duplicate of
13d10 20 61 6e 6f 74 68 65 72 2c 20 68 69 67 68 65 72   another, higher
13d20 20 70 72 69 6f 72 69 74 79 2c 20 0a 2a 2a 20 73   priority, .** s
13d30 65 67 6d 65 6e 74 2d 69 74 65 72 61 74 6f 72 20  egment-iterator 
13d40 69 6e 20 74 68 65 20 70 53 65 67 2d 3e 61 53 65  in the pSeg->aSe
13d50 67 5b 5d 20 61 72 72 61 79 2e 0a 2a 2f 0a 73 74  g[] array..*/.st
13d60 61 74 69 63 20 69 6e 74 20 66 74 73 35 4d 75 6c  atic int fts5Mul
13d70 74 69 49 74 65 72 44 6f 43 6f 6d 70 61 72 65 28  tiIterDoCompare(
13d80 46 74 73 35 49 74 65 72 20 2a 70 49 74 65 72 2c  Fts5Iter *pIter,
13d90 20 69 6e 74 20 69 4f 75 74 29 7b 0a 20 20 69 6e   int iOut){.  in
13da0 74 20 69 31 3b 20 20 20 20 20 20 20 20 20 20 20  t i1;           
13db0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
13dc0 20 49 6e 64 65 78 20 6f 66 20 6c 65 66 74 2d 68   Index of left-h
13dd0 61 6e 64 20 46 74 73 35 53 65 67 49 74 65 72 20  and Fts5SegIter 
13de0 2a 2f 0a 20 20 69 6e 74 20 69 32 3b 20 20 20 20  */.  int i2;    
13df0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13e00 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66       /* Index of
13e10 20 72 69 67 68 74 2d 68 61 6e 64 20 46 74 73 35   right-hand Fts5
13e20 53 65 67 49 74 65 72 20 2a 2f 0a 20 20 69 6e 74  SegIter */.  int
13e30 20 69 52 65 73 3b 0a 20 20 46 74 73 35 53 65 67   iRes;.  Fts5Seg
13e40 49 74 65 72 20 2a 70 31 3b 20 20 20 20 20 20 20  Iter *p1;       
13e50 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 66 74           /* Left
13e60 2d 68 61 6e 64 20 46 74 73 35 53 65 67 49 74 65  -hand Fts5SegIte
13e70 72 20 2a 2f 0a 20 20 46 74 73 35 53 65 67 49 74  r */.  Fts5SegIt
13e80 65 72 20 2a 70 32 3b 20 20 20 20 20 20 20 20 20  er *p2;         
13e90 20 20 20 20 20 20 20 2f 2a 20 52 69 67 68 74 2d         /* Right-
13ea0 68 61 6e 64 20 46 74 73 35 53 65 67 49 74 65 72  hand Fts5SegIter
13eb0 20 2a 2f 0a 20 20 46 74 73 35 43 52 65 73 75 6c   */.  Fts5CResul
13ec0 74 20 2a 70 52 65 73 20 3d 20 26 70 49 74 65 72  t *pRes = &pIter
13ed0 2d 3e 61 46 69 72 73 74 5b 69 4f 75 74 5d 3b 0a  ->aFirst[iOut];.
13ee0 0a 20 20 61 73 73 65 72 74 28 20 69 4f 75 74 3c  .  assert( iOut<
13ef0 70 49 74 65 72 2d 3e 6e 53 65 67 20 26 26 20 69  pIter->nSeg && i
13f00 4f 75 74 3e 30 20 29 3b 0a 20 20 61 73 73 65 72  Out>0 );.  asser
13f10 74 28 20 70 49 74 65 72 2d 3e 62 52 65 76 3d 3d  t( pIter->bRev==
13f20 30 20 7c 7c 20 70 49 74 65 72 2d 3e 62 52 65 76  0 || pIter->bRev
13f30 3d 3d 31 20 29 3b 0a 0a 20 20 69 66 28 20 69 4f  ==1 );..  if( iO
13f40 75 74 3e 3d 28 70 49 74 65 72 2d 3e 6e 53 65 67  ut>=(pIter->nSeg
13f50 2f 32 29 20 29 7b 0a 20 20 20 20 69 31 20 3d 20  /2) ){.    i1 = 
13f60 28 69 4f 75 74 20 2d 20 70 49 74 65 72 2d 3e 6e  (iOut - pIter->n
13f70 53 65 67 2f 32 29 20 2a 20 32 3b 0a 20 20 20 20  Seg/2) * 2;.    
13f80 69 32 20 3d 20 69 31 20 2b 20 31 3b 0a 20 20 7d  i2 = i1 + 1;.  }
13f90 65 6c 73 65 7b 0a 20 20 20 20 69 31 20 3d 20 70  else{.    i1 = p
13fa0 49 74 65 72 2d 3e 61 46 69 72 73 74 5b 69 4f 75  Iter->aFirst[iOu
13fb0 74 2a 32 5d 2e 69 46 69 72 73 74 3b 0a 20 20 20  t*2].iFirst;.   
13fc0 20 69 32 20 3d 20 70 49 74 65 72 2d 3e 61 46 69   i2 = pIter->aFi
13fd0 72 73 74 5b 69 4f 75 74 2a 32 2b 31 5d 2e 69 46  rst[iOut*2+1].iF
13fe0 69 72 73 74 3b 0a 20 20 7d 0a 20 20 70 31 20 3d  irst;.  }.  p1 =
13ff0 20 26 70 49 74 65 72 2d 3e 61 53 65 67 5b 69 31   &pIter->aSeg[i1
14000 5d 3b 0a 20 20 70 32 20 3d 20 26 70 49 74 65 72  ];.  p2 = &pIter
14010 2d 3e 61 53 65 67 5b 69 32 5d 3b 0a 0a 20 20 70  ->aSeg[i2];..  p
14020 52 65 73 2d 3e 62 54 65 72 6d 45 71 20 3d 20 30  Res->bTermEq = 0
14030 3b 0a 20 20 69 66 28 20 70 31 2d 3e 70 4c 65 61  ;.  if( p1->pLea
14040 66 3d 3d 30 20 29 7b 20 20 20 20 20 20 20 20 20  f==0 ){         
14050 20 20 2f 2a 20 49 66 20 70 31 20 69 73 20 61 74    /* If p1 is at
14060 20 45 4f 46 20 2a 2f 0a 20 20 20 20 69 52 65 73   EOF */.    iRes
14070 20 3d 20 69 32 3b 0a 20 20 7d 65 6c 73 65 20 69   = i2;.  }else i
14080 66 28 20 70 32 2d 3e 70 4c 65 61 66 3d 3d 30 20  f( p2->pLeaf==0 
14090 29 7b 20 20 20 20 20 2f 2a 20 49 66 20 70 32 20  ){     /* If p2 
140a0 69 73 20 61 74 20 45 4f 46 20 2a 2f 0a 20 20 20  is at EOF */.   
140b0 20 69 52 65 73 20 3d 20 69 31 3b 0a 20 20 7d 65   iRes = i1;.  }e
140c0 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 72 65 73  lse{.    int res
140d0 20 3d 20 66 74 73 35 42 75 66 66 65 72 43 6f 6d   = fts5BufferCom
140e0 70 61 72 65 28 26 70 31 2d 3e 74 65 72 6d 2c 20  pare(&p1->term, 
140f0 26 70 32 2d 3e 74 65 72 6d 29 3b 0a 20 20 20 20  &p2->term);.    
14100 69 66 28 20 72 65 73 3d 3d 30 20 29 7b 0a 20 20  if( res==0 ){.  
14110 20 20 20 20 61 73 73 65 72 74 28 20 69 32 3e 69      assert( i2>i
14120 31 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  1 );.      asser
14130 74 28 20 69 32 21 3d 30 20 29 3b 0a 20 20 20 20  t( i2!=0 );.    
14140 20 20 70 52 65 73 2d 3e 62 54 65 72 6d 45 71 20    pRes->bTermEq 
14150 3d 20 31 3b 0a 20 20 20 20 20 20 69 66 28 20 70  = 1;.      if( p
14160 31 2d 3e 69 52 6f 77 69 64 3d 3d 70 32 2d 3e 69  1->iRowid==p2->i
14170 52 6f 77 69 64 20 29 7b 0a 20 20 20 20 20 20 20  Rowid ){.       
14180 20 70 31 2d 3e 62 44 65 6c 20 3d 20 70 32 2d 3e   p1->bDel = p2->
14190 62 44 65 6c 3b 0a 20 20 20 20 20 20 20 20 72 65  bDel;.        re
141a0 74 75 72 6e 20 69 32 3b 0a 20 20 20 20 20 20 7d  turn i2;.      }
141b0 0a 20 20 20 20 20 20 72 65 73 20 3d 20 28 28 70  .      res = ((p
141c0 31 2d 3e 69 52 6f 77 69 64 20 3e 20 70 32 2d 3e  1->iRowid > p2->
141d0 69 52 6f 77 69 64 29 3d 3d 70 49 74 65 72 2d 3e  iRowid)==pIter->
141e0 62 52 65 76 29 20 3f 20 2d 31 20 3a 20 2b 31 3b  bRev) ? -1 : +1;
141f0 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72  .    }.    asser
14200 74 28 20 72 65 73 21 3d 30 20 29 3b 0a 20 20 20  t( res!=0 );.   
14210 20 69 66 28 20 72 65 73 3c 30 20 29 7b 0a 20 20   if( res<0 ){.  
14220 20 20 20 20 69 52 65 73 20 3d 20 69 31 3b 0a 20      iRes = i1;. 
14230 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
14240 69 52 65 73 20 3d 20 69 32 3b 0a 20 20 20 20 7d  iRes = i2;.    }
14250 0a 20 20 7d 0a 0a 20 20 70 52 65 73 2d 3e 69 46  .  }..  pRes->iF
14260 69 72 73 74 20 3d 20 28 75 31 36 29 69 52 65 73  irst = (u16)iRes
14270 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  ;.  return 0;.}.
14280 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20  ./*.** Move the 
14290 73 65 67 2d 69 74 65 72 20 73 6f 20 74 68 61 74  seg-iter so that
142a0 20 69 74 20 70 6f 69 6e 74 73 20 74 6f 20 74 68   it points to th
142b0 65 20 66 69 72 73 74 20 72 6f 77 69 64 20 6f 6e  e first rowid on
142c0 20 70 61 67 65 20 69 4c 65 61 66 50 67 6e 6f 2e   page iLeafPgno.
142d0 0a 2a 2a 20 49 74 20 69 73 20 61 6e 20 65 72 72  .** It is an err
142e0 6f 72 20 69 66 20 6c 65 61 66 20 69 4c 65 61 66  or if leaf iLeaf
142f0 50 67 6e 6f 20 64 6f 65 73 20 6e 6f 74 20 65 78  Pgno does not ex
14300 69 73 74 20 6f 72 20 63 6f 6e 74 61 69 6e 73 20  ist or contains 
14310 6e 6f 20 72 6f 77 69 64 73 2e 0a 2a 2f 0a 73 74  no rowids..*/.st
14320 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 53 65  atic void fts5Se
14330 67 49 74 65 72 47 6f 74 6f 50 61 67 65 28 0a 20  gIterGotoPage(. 
14340 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 20   Fts5Index *p,  
14350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14360 20 2f 2a 20 46 54 53 35 20 62 61 63 6b 65 6e 64   /* FTS5 backend
14370 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 46 74 73   object */.  Fts
14380 35 53 65 67 49 74 65 72 20 2a 70 49 74 65 72 2c  5SegIter *pIter,
14390 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
143a0 49 74 65 72 61 74 6f 72 20 74 6f 20 61 64 76 61  Iterator to adva
143b0 6e 63 65 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 65  nce */.  int iLe
143c0 61 66 50 67 6e 6f 0a 29 7b 0a 20 20 61 73 73 65  afPgno.){.  asse
143d0 72 74 28 20 69 4c 65 61 66 50 67 6e 6f 3e 70 49  rt( iLeafPgno>pI
143e0 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 20 29  ter->iLeafPgno )
143f0 3b 0a 0a 20 20 69 66 28 20 69 4c 65 61 66 50 67  ;..  if( iLeafPg
14400 6e 6f 3e 70 49 74 65 72 2d 3e 70 53 65 67 2d 3e  no>pIter->pSeg->
14410 70 67 6e 6f 4c 61 73 74 20 29 7b 0a 20 20 20 20  pgnoLast ){.    
14420 70 2d 3e 72 63 20 3d 20 46 54 53 35 5f 43 4f 52  p->rc = FTS5_COR
14430 52 55 50 54 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  RUPT;.  }else{. 
14440 20 20 20 66 74 73 35 44 61 74 61 52 65 6c 65 61     fts5DataRelea
14450 73 65 28 70 49 74 65 72 2d 3e 70 4e 65 78 74 4c  se(pIter->pNextL
14460 65 61 66 29 3b 0a 20 20 20 20 70 49 74 65 72 2d  eaf);.    pIter-
14470 3e 70 4e 65 78 74 4c 65 61 66 20 3d 20 30 3b 0a  >pNextLeaf = 0;.
14480 20 20 20 20 70 49 74 65 72 2d 3e 69 4c 65 61 66      pIter->iLeaf
14490 50 67 6e 6f 20 3d 20 69 4c 65 61 66 50 67 6e 6f  Pgno = iLeafPgno
144a0 2d 31 3b 0a 20 20 20 20 66 74 73 35 53 65 67 49  -1;.    fts5SegI
144b0 74 65 72 4e 65 78 74 50 61 67 65 28 70 2c 20 70  terNextPage(p, p
144c0 49 74 65 72 29 3b 0a 20 20 20 20 61 73 73 65 72  Iter);.    asser
144d0 74 28 20 70 2d 3e 72 63 21 3d 53 51 4c 49 54 45  t( p->rc!=SQLITE
144e0 5f 4f 4b 20 7c 7c 20 70 49 74 65 72 2d 3e 69 4c  _OK || pIter->iL
144f0 65 61 66 50 67 6e 6f 3d 3d 69 4c 65 61 66 50 67  eafPgno==iLeafPg
14500 6e 6f 20 29 3b 0a 0a 20 20 20 20 69 66 28 20 70  no );..    if( p
14510 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
14520 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 4f 66  ){.      int iOf
14530 66 3b 0a 20 20 20 20 20 20 75 38 20 2a 61 20 3d  f;.      u8 *a =
14540 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 70   pIter->pLeaf->p
14550 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 20 3d 20  ;.      int n = 
14560 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 73 7a  pIter->pLeaf->sz
14570 4c 65 61 66 3b 0a 0a 20 20 20 20 20 20 69 4f 66  Leaf;..      iOf
14580 66 20 3d 20 66 74 73 35 4c 65 61 66 46 69 72 73  f = fts5LeafFirs
14590 74 52 6f 77 69 64 4f 66 66 28 70 49 74 65 72 2d  tRowidOff(pIter-
145a0 3e 70 4c 65 61 66 29 3b 0a 20 20 20 20 20 20 69  >pLeaf);.      i
145b0 66 28 20 69 4f 66 66 3c 34 20 7c 7c 20 69 4f 66  f( iOff<4 || iOf
145c0 66 3e 3d 6e 20 29 7b 0a 20 20 20 20 20 20 20 20  f>=n ){.        
145d0 70 2d 3e 72 63 20 3d 20 46 54 53 35 5f 43 4f 52  p->rc = FTS5_COR
145e0 52 55 50 54 3b 0a 20 20 20 20 20 20 7d 65 6c 73  RUPT;.      }els
145f0 65 7b 0a 20 20 20 20 20 20 20 20 69 4f 66 66 20  e{.        iOff 
14600 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e 74  += fts5GetVarint
14610 28 26 61 5b 69 4f 66 66 5d 2c 20 28 75 36 34 2a  (&a[iOff], (u64*
14620 29 26 70 49 74 65 72 2d 3e 69 52 6f 77 69 64 29  )&pIter->iRowid)
14630 3b 0a 20 20 20 20 20 20 20 20 70 49 74 65 72 2d  ;.        pIter-
14640 3e 69 4c 65 61 66 4f 66 66 73 65 74 20 3d 20 69  >iLeafOffset = i
14650 4f 66 66 3b 0a 20 20 20 20 20 20 20 20 66 74 73  Off;.        fts
14660 35 53 65 67 49 74 65 72 4c 6f 61 64 4e 50 6f 73  5SegIterLoadNPos
14670 28 70 2c 20 70 49 74 65 72 29 3b 0a 20 20 20 20  (p, pIter);.    
14680 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a    }.    }.  }.}.
14690 0a 2f 2a 0a 2a 2a 20 41 64 76 61 6e 63 65 20 74  ./*.** Advance t
146a0 68 65 20 69 74 65 72 61 74 6f 72 20 70 61 73 73  he iterator pass
146b0 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64  ed as the second
146c0 20 61 72 67 75 6d 65 6e 74 20 75 6e 74 69 6c 20   argument until 
146d0 69 74 20 69 73 20 61 74 20 6f 72 20 0a 2a 2a 20  it is at or .** 
146e0 70 61 73 74 20 72 6f 77 69 64 20 69 46 72 6f 6d  past rowid iFrom
146f0 2e 20 52 65 67 61 72 64 6c 65 73 73 20 6f 66 20  . Regardless of 
14700 74 68 65 20 76 61 6c 75 65 20 6f 66 20 69 46 72  the value of iFr
14710 6f 6d 2c 20 74 68 65 20 69 74 65 72 61 74 6f 72  om, the iterator
14720 20 69 73 0a 2a 2a 20 61 6c 77 61 79 73 20 61 64   is.** always ad
14730 76 61 6e 63 65 64 20 61 74 20 6c 65 61 73 74 20  vanced at least 
14740 6f 6e 63 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  once..*/.static 
14750 76 6f 69 64 20 66 74 73 35 53 65 67 49 74 65 72  void fts5SegIter
14760 4e 65 78 74 46 72 6f 6d 28 0a 20 20 46 74 73 35  NextFrom(.  Fts5
14770 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20  Index *p,       
14780 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
14790 54 53 35 20 62 61 63 6b 65 6e 64 20 6f 62 6a 65  TS5 backend obje
147a0 63 74 20 2a 2f 0a 20 20 46 74 73 35 53 65 67 49  ct */.  Fts5SegI
147b0 74 65 72 20 2a 70 49 74 65 72 2c 20 20 20 20 20  ter *pIter,     
147c0 20 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61          /* Itera
147d0 74 6f 72 20 74 6f 20 61 64 76 61 6e 63 65 20 2a  tor to advance *
147e0 2f 0a 20 20 69 36 34 20 69 4d 61 74 63 68 20 20  /.  i64 iMatch  
147f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14800 20 20 20 20 2f 2a 20 41 64 76 61 6e 63 65 20 69      /* Advance i
14810 74 65 72 61 74 6f 72 20 61 74 20 6c 65 61 73 74  terator at least
14820 20 74 68 69 73 20 66 61 72 20 2a 2f 0a 29 7b 0a   this far */.){.
14830 20 20 69 6e 74 20 62 52 65 76 20 3d 20 28 70 49    int bRev = (pI
14840 74 65 72 2d 3e 66 6c 61 67 73 20 26 20 46 54 53  ter->flags & FTS
14850 35 5f 53 45 47 49 54 45 52 5f 52 45 56 45 52 53  5_SEGITER_REVERS
14860 45 29 3b 0a 20 20 46 74 73 35 44 6c 69 64 78 49  E);.  Fts5DlidxI
14870 74 65 72 20 2a 70 44 6c 69 64 78 20 3d 20 70 49  ter *pDlidx = pI
14880 74 65 72 2d 3e 70 44 6c 69 64 78 3b 0a 20 20 69  ter->pDlidx;.  i
14890 6e 74 20 69 4c 65 61 66 50 67 6e 6f 20 3d 20 70  nt iLeafPgno = p
148a0 49 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 3b  Iter->iLeafPgno;
148b0 0a 20 20 69 6e 74 20 62 4d 6f 76 65 20 3d 20 31  .  int bMove = 1
148c0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 49 74  ;..  assert( pIt
148d0 65 72 2d 3e 66 6c 61 67 73 20 26 20 46 54 53 35  er->flags & FTS5
148e0 5f 53 45 47 49 54 45 52 5f 4f 4e 45 54 45 52 4d  _SEGITER_ONETERM
148f0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 49   );.  assert( pI
14900 74 65 72 2d 3e 70 44 6c 69 64 78 20 29 3b 0a 20  ter->pDlidx );. 
14910 20 61 73 73 65 72 74 28 20 70 49 74 65 72 2d 3e   assert( pIter->
14920 70 4c 65 61 66 20 29 3b 0a 0a 20 20 69 66 28 20  pLeaf );..  if( 
14930 62 52 65 76 3d 3d 30 20 29 7b 0a 20 20 20 20 77  bRev==0 ){.    w
14940 68 69 6c 65 28 20 21 66 74 73 35 44 6c 69 64 78  hile( !fts5Dlidx
14950 49 74 65 72 45 6f 66 28 70 2c 20 70 44 6c 69 64  IterEof(p, pDlid
14960 78 29 20 26 26 20 69 4d 61 74 63 68 3e 66 74 73  x) && iMatch>fts
14970 35 44 6c 69 64 78 49 74 65 72 52 6f 77 69 64 28  5DlidxIterRowid(
14980 70 44 6c 69 64 78 29 20 29 7b 0a 20 20 20 20 20  pDlidx) ){.     
14990 20 69 4c 65 61 66 50 67 6e 6f 20 3d 20 66 74 73   iLeafPgno = fts
149a0 35 44 6c 69 64 78 49 74 65 72 50 67 6e 6f 28 70  5DlidxIterPgno(p
149b0 44 6c 69 64 78 29 3b 0a 20 20 20 20 20 20 66 74  Dlidx);.      ft
149c0 73 35 44 6c 69 64 78 49 74 65 72 4e 65 78 74 28  s5DlidxIterNext(
149d0 70 2c 20 70 44 6c 69 64 78 29 3b 0a 20 20 20 20  p, pDlidx);.    
149e0 7d 0a 20 20 20 20 61 73 73 65 72 74 5f 6e 63 28  }.    assert_nc(
149f0 20 69 4c 65 61 66 50 67 6e 6f 3e 3d 70 49 74 65   iLeafPgno>=pIte
14a00 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 20 7c 7c 20  r->iLeafPgno || 
14a10 70 2d 3e 72 63 20 29 3b 0a 20 20 20 20 69 66 28  p->rc );.    if(
14a20 20 69 4c 65 61 66 50 67 6e 6f 3e 70 49 74 65 72   iLeafPgno>pIter
14a30 2d 3e 69 4c 65 61 66 50 67 6e 6f 20 29 7b 0a 20  ->iLeafPgno ){. 
14a40 20 20 20 20 20 66 74 73 35 53 65 67 49 74 65 72       fts5SegIter
14a50 47 6f 74 6f 50 61 67 65 28 70 2c 20 70 49 74 65  GotoPage(p, pIte
14a60 72 2c 20 69 4c 65 61 66 50 67 6e 6f 29 3b 0a 20  r, iLeafPgno);. 
14a70 20 20 20 20 20 62 4d 6f 76 65 20 3d 20 30 3b 0a       bMove = 0;.
14a80 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
14a90 20 20 20 61 73 73 65 72 74 28 20 70 49 74 65 72     assert( pIter
14aa0 2d 3e 70 4e 65 78 74 4c 65 61 66 3d 3d 30 20 29  ->pNextLeaf==0 )
14ab0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 4d  ;.    assert( iM
14ac0 61 74 63 68 3c 70 49 74 65 72 2d 3e 69 52 6f 77  atch<pIter->iRow
14ad0 69 64 20 29 3b 0a 20 20 20 20 77 68 69 6c 65 28  id );.    while(
14ae0 20 21 66 74 73 35 44 6c 69 64 78 49 74 65 72 45   !fts5DlidxIterE
14af0 6f 66 28 70 2c 20 70 44 6c 69 64 78 29 20 26 26  of(p, pDlidx) &&
14b00 20 69 4d 61 74 63 68 3c 66 74 73 35 44 6c 69 64   iMatch<fts5Dlid
14b10 78 49 74 65 72 52 6f 77 69 64 28 70 44 6c 69 64  xIterRowid(pDlid
14b20 78 29 20 29 7b 0a 20 20 20 20 20 20 66 74 73 35  x) ){.      fts5
14b30 44 6c 69 64 78 49 74 65 72 50 72 65 76 28 70 2c  DlidxIterPrev(p,
14b40 20 70 44 6c 69 64 78 29 3b 0a 20 20 20 20 7d 0a   pDlidx);.    }.
14b50 20 20 20 20 69 4c 65 61 66 50 67 6e 6f 20 3d 20      iLeafPgno = 
14b60 66 74 73 35 44 6c 69 64 78 49 74 65 72 50 67 6e  fts5DlidxIterPgn
14b70 6f 28 70 44 6c 69 64 78 29 3b 0a 0a 20 20 20 20  o(pDlidx);..    
14b80 61 73 73 65 72 74 28 20 66 74 73 35 44 6c 69 64  assert( fts5Dlid
14b90 78 49 74 65 72 45 6f 66 28 70 2c 20 70 44 6c 69  xIterEof(p, pDli
14ba0 64 78 29 20 7c 7c 20 69 4c 65 61 66 50 67 6e 6f  dx) || iLeafPgno
14bb0 3c 3d 70 49 74 65 72 2d 3e 69 4c 65 61 66 50 67  <=pIter->iLeafPg
14bc0 6e 6f 20 29 3b 0a 0a 20 20 20 20 69 66 28 20 69  no );..    if( i
14bd0 4c 65 61 66 50 67 6e 6f 3c 70 49 74 65 72 2d 3e  LeafPgno<pIter->
14be0 69 4c 65 61 66 50 67 6e 6f 20 29 7b 0a 20 20 20  iLeafPgno ){.   
14bf0 20 20 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 50     pIter->iLeafP
14c00 67 6e 6f 20 3d 20 69 4c 65 61 66 50 67 6e 6f 2b  gno = iLeafPgno+
14c10 31 3b 0a 20 20 20 20 20 20 66 74 73 35 53 65 67  1;.      fts5Seg
14c20 49 74 65 72 52 65 76 65 72 73 65 4e 65 77 50 61  IterReverseNewPa
14c30 67 65 28 70 2c 20 70 49 74 65 72 29 3b 0a 20 20  ge(p, pIter);.  
14c40 20 20 20 20 62 4d 6f 76 65 20 3d 20 30 3b 0a 20      bMove = 0;. 
14c50 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 64 6f 7b 0a     }.  }..  do{.
14c60 20 20 20 20 69 66 28 20 62 4d 6f 76 65 20 26 26      if( bMove &&
14c70 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
14c80 4b 20 29 20 70 49 74 65 72 2d 3e 78 4e 65 78 74  K ) pIter->xNext
14c90 28 70 2c 20 70 49 74 65 72 2c 20 30 29 3b 0a 20  (p, pIter, 0);. 
14ca0 20 20 20 69 66 28 20 70 49 74 65 72 2d 3e 70 4c     if( pIter->pL
14cb0 65 61 66 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a  eaf==0 ) break;.
14cc0 20 20 20 20 69 66 28 20 62 52 65 76 3d 3d 30 20      if( bRev==0 
14cd0 26 26 20 70 49 74 65 72 2d 3e 69 52 6f 77 69 64  && pIter->iRowid
14ce0 3e 3d 69 4d 61 74 63 68 20 29 20 62 72 65 61 6b  >=iMatch ) break
14cf0 3b 0a 20 20 20 20 69 66 28 20 62 52 65 76 21 3d  ;.    if( bRev!=
14d00 30 20 26 26 20 70 49 74 65 72 2d 3e 69 52 6f 77  0 && pIter->iRow
14d10 69 64 3c 3d 69 4d 61 74 63 68 20 29 20 62 72 65  id<=iMatch ) bre
14d20 61 6b 3b 0a 20 20 20 20 62 4d 6f 76 65 20 3d 20  ak;.    bMove = 
14d30 31 3b 0a 20 20 7d 77 68 69 6c 65 28 20 70 2d 3e  1;.  }while( p->
14d40 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  rc==SQLITE_OK );
14d50 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20  .}.../*.** Free 
14d60 74 68 65 20 69 74 65 72 61 74 6f 72 20 6f 62 6a  the iterator obj
14d70 65 63 74 20 70 61 73 73 65 64 20 61 73 20 74 68  ect passed as th
14d80 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
14d90 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  t..*/.static voi
14da0 64 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 46  d fts5MultiIterF
14db0 72 65 65 28 46 74 73 35 49 74 65 72 20 2a 70 49  ree(Fts5Iter *pI
14dc0 74 65 72 29 7b 0a 20 20 69 66 28 20 70 49 74 65  ter){.  if( pIte
14dd0 72 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  r ){.    int i;.
14de0 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
14df0 49 74 65 72 2d 3e 6e 53 65 67 3b 20 69 2b 2b 29  Iter->nSeg; i++)
14e00 7b 0a 20 20 20 20 20 20 66 74 73 35 53 65 67 49  {.      fts5SegI
14e10 74 65 72 43 6c 65 61 72 28 26 70 49 74 65 72 2d  terClear(&pIter-
14e20 3e 61 53 65 67 5b 69 5d 29 3b 0a 20 20 20 20 7d  >aSeg[i]);.    }
14e30 0a 20 20 20 20 66 74 73 35 53 74 72 75 63 74 75  .    fts5Structu
14e40 72 65 52 65 6c 65 61 73 65 28 70 49 74 65 72 2d  reRelease(pIter-
14e50 3e 70 53 74 72 75 63 74 29 3b 0a 20 20 20 20 66  >pStruct);.    f
14e60 74 73 35 42 75 66 66 65 72 46 72 65 65 28 26 70  ts5BufferFree(&p
14e70 49 74 65 72 2d 3e 70 6f 73 6c 69 73 74 29 3b 0a  Iter->poslist);.
14e80 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
14e90 28 70 49 74 65 72 29 3b 0a 20 20 7d 0a 7d 0a 0a  (pIter);.  }.}..
14ea0 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
14eb0 4d 75 6c 74 69 49 74 65 72 41 64 76 61 6e 63 65  MultiIterAdvance
14ec0 64 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a  d(.  Fts5Index *
14ed0 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
14ee0 20 20 20 20 20 2f 2a 20 46 54 53 35 20 62 61 63       /* FTS5 bac
14ef0 6b 65 6e 64 20 74 6f 20 69 74 65 72 61 74 65 20  kend to iterate 
14f00 77 69 74 68 69 6e 20 2a 2f 0a 20 20 46 74 73 35  within */.  Fts5
14f10 49 74 65 72 20 2a 70 49 74 65 72 2c 20 20 20 20  Iter *pIter,    
14f20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
14f30 74 65 72 61 74 6f 72 20 74 6f 20 75 70 64 61 74  terator to updat
14f40 65 20 61 46 69 72 73 74 5b 5d 20 61 72 72 61 79  e aFirst[] array
14f50 20 66 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 69 43   for */.  int iC
14f60 68 61 6e 67 65 64 2c 20 20 20 20 20 20 20 20 20  hanged,         
14f70 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
14f80 65 78 20 6f 66 20 73 75 62 2d 69 74 65 72 61 74  ex of sub-iterat
14f90 6f 72 20 6a 75 73 74 20 61 64 76 61 6e 63 65 64  or just advanced
14fa0 20 2a 2f 0a 20 20 69 6e 74 20 69 4d 69 6e 73 65   */.  int iMinse
14fb0 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t               
14fc0 20 20 20 20 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d        /* Minimum
14fd0 20 65 6e 74 72 79 20 69 6e 20 61 46 69 72 73 74   entry in aFirst
14fe0 5b 5d 20 74 6f 20 73 65 74 20 2a 2f 0a 29 7b 0a  [] to set */.){.
14ff0 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69    int i;.  for(i
15000 3d 28 70 49 74 65 72 2d 3e 6e 53 65 67 2b 69 43  =(pIter->nSeg+iC
15010 68 61 6e 67 65 64 29 2f 32 3b 20 69 3e 3d 69 4d  hanged)/2; i>=iM
15020 69 6e 73 65 74 20 26 26 20 70 2d 3e 72 63 3d 3d  inset && p->rc==
15030 53 51 4c 49 54 45 5f 4f 4b 3b 20 69 3d 69 2f 32  SQLITE_OK; i=i/2
15040 29 7b 0a 20 20 20 20 69 6e 74 20 69 45 71 3b 0a  ){.    int iEq;.
15050 20 20 20 20 69 66 28 20 28 69 45 71 20 3d 20 66      if( (iEq = f
15060 74 73 35 4d 75 6c 74 69 49 74 65 72 44 6f 43 6f  ts5MultiIterDoCo
15070 6d 70 61 72 65 28 70 49 74 65 72 2c 20 69 29 29  mpare(pIter, i))
15080 20 29 7b 0a 20 20 20 20 20 20 46 74 73 35 53 65   ){.      Fts5Se
15090 67 49 74 65 72 20 2a 70 53 65 67 20 3d 20 26 70  gIter *pSeg = &p
150a0 49 74 65 72 2d 3e 61 53 65 67 5b 69 45 71 5d 3b  Iter->aSeg[iEq];
150b0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
150c0 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
150d0 29 3b 0a 20 20 20 20 20 20 70 53 65 67 2d 3e 78  );.      pSeg->x
150e0 4e 65 78 74 28 70 2c 20 70 53 65 67 2c 20 30 29  Next(p, pSeg, 0)
150f0 3b 0a 20 20 20 20 20 20 69 20 3d 20 70 49 74 65  ;.      i = pIte
15100 72 2d 3e 6e 53 65 67 20 2b 20 69 45 71 3b 0a 20  r->nSeg + iEq;. 
15110 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
15120 2a 20 53 75 62 2d 69 74 65 72 61 74 6f 72 20 69  * Sub-iterator i
15130 43 68 61 6e 67 65 64 20 6f 66 20 69 74 65 72 61  Changed of itera
15140 74 6f 72 20 70 49 74 65 72 20 68 61 73 20 6a 75  tor pIter has ju
15150 73 74 20 62 65 65 6e 20 61 64 76 61 6e 63 65 64  st been advanced
15160 2e 20 49 74 20 73 74 69 6c 6c 0a 2a 2a 20 70 6f  . It still.** po
15170 69 6e 74 73 20 74 6f 20 74 68 65 20 73 61 6d 65  ints to the same
15180 20 74 65 72 6d 20 74 68 6f 75 67 68 20 2d 20 6a   term though - j
15190 75 73 74 20 61 20 64 69 66 66 65 72 65 6e 74 20  ust a different 
151a0 72 6f 77 69 64 2e 20 54 68 69 73 20 66 75 6e 63  rowid. This func
151b0 74 69 6f 6e 0a 2a 2a 20 61 74 74 65 6d 70 74 73  tion.** attempts
151c0 20 74 6f 20 75 70 64 61 74 65 20 74 68 65 20 63   to update the c
151d0 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70  ontents of the p
151e0 49 74 65 72 2d 3e 61 46 69 72 73 74 5b 5d 20 61  Iter->aFirst[] a
151f0 63 63 6f 72 64 69 6e 67 6c 79 2e 0a 2a 2a 20 49  ccordingly..** I
15200 66 20 69 74 20 64 6f 65 73 20 73 6f 20 73 75 63  f it does so suc
15210 63 65 73 73 66 75 6c 6c 79 2c 20 30 20 69 73 20  cessfully, 0 is 
15220 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77  returned. Otherw
15230 69 73 65 20 31 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ise 1..**.** If 
15240 6e 6f 6e 2d 7a 65 72 6f 20 69 73 20 72 65 74 75  non-zero is retu
15250 72 6e 65 64 2c 20 74 68 65 20 63 61 6c 6c 65 72  rned, the caller
15260 20 73 68 6f 75 6c 64 20 63 61 6c 6c 20 66 74 73   should call fts
15270 35 4d 75 6c 74 69 49 74 65 72 41 64 76 61 6e 63  5MultiIterAdvanc
15280 65 64 28 29 0a 2a 2a 20 6f 6e 20 74 68 65 20 69  ed().** on the i
15290 74 65 72 61 74 6f 72 20 69 6e 73 74 65 61 64 2e  terator instead.
152a0 20 54 68 61 74 20 66 75 6e 63 74 69 6f 6e 20 64   That function d
152b0 6f 65 73 20 74 68 65 20 73 61 6d 65 20 61 73 20  oes the same as 
152c0 74 68 69 73 20 6f 6e 65 2c 20 65 78 63 65 70 74  this one, except
152d0 0a 2a 2a 20 74 68 61 74 20 69 74 20 64 65 61 6c  .** that it deal
152e0 73 20 77 69 74 68 20 6d 6f 72 65 20 63 6f 6d 70  s with more comp
152f0 6c 69 63 61 74 65 64 20 63 61 73 65 73 20 61 73  licated cases as
15300 20 77 65 6c 6c 2e 0a 2a 2f 20 0a 73 74 61 74 69   well..*/ .stati
15310 63 20 69 6e 74 20 66 74 73 35 4d 75 6c 74 69 49  c int fts5MultiI
15320 74 65 72 41 64 76 61 6e 63 65 52 6f 77 69 64 28  terAdvanceRowid(
15330 0a 20 20 46 74 73 35 49 74 65 72 20 2a 70 49 74  .  Fts5Iter *pIt
15340 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  er,             
15350 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 74     /* Iterator t
15360 6f 20 75 70 64 61 74 65 20 61 46 69 72 73 74 5b  o update aFirst[
15370 5d 20 61 72 72 61 79 20 66 6f 72 20 2a 2f 0a 20  ] array for */. 
15380 20 69 6e 74 20 69 43 68 61 6e 67 65 64 2c 20 20   int iChanged,  
15390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
153a0 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 73 75 62   /* Index of sub
153b0 2d 69 74 65 72 61 74 6f 72 20 6a 75 73 74 20 61  -iterator just a
153c0 64 76 61 6e 63 65 64 20 2a 2f 0a 20 20 46 74 73  dvanced */.  Fts
153d0 35 53 65 67 49 74 65 72 20 2a 2a 70 70 46 69 72  5SegIter **ppFir
153e0 73 74 0a 29 7b 0a 20 20 46 74 73 35 53 65 67 49  st.){.  Fts5SegI
153f0 74 65 72 20 2a 70 4e 65 77 20 3d 20 26 70 49 74  ter *pNew = &pIt
15400 65 72 2d 3e 61 53 65 67 5b 69 43 68 61 6e 67 65  er->aSeg[iChange
15410 64 5d 3b 0a 0a 20 20 69 66 28 20 70 4e 65 77 2d  d];..  if( pNew-
15420 3e 69 52 6f 77 69 64 3d 3d 70 49 74 65 72 2d 3e  >iRowid==pIter->
15430 69 53 77 69 74 63 68 52 6f 77 69 64 0a 20 20 20  iSwitchRowid.   
15440 7c 7c 20 28 70 4e 65 77 2d 3e 69 52 6f 77 69 64  || (pNew->iRowid
15450 3c 70 49 74 65 72 2d 3e 69 53 77 69 74 63 68 52  <pIter->iSwitchR
15460 6f 77 69 64 29 3d 3d 70 49 74 65 72 2d 3e 62 52  owid)==pIter->bR
15470 65 76 0a 20 20 29 7b 0a 20 20 20 20 69 6e 74 20  ev.  ){.    int 
15480 69 3b 0a 20 20 20 20 46 74 73 35 53 65 67 49 74  i;.    Fts5SegIt
15490 65 72 20 2a 70 4f 74 68 65 72 20 3d 20 26 70 49  er *pOther = &pI
154a0 74 65 72 2d 3e 61 53 65 67 5b 69 43 68 61 6e 67  ter->aSeg[iChang
154b0 65 64 20 5e 20 30 78 30 30 30 31 5d 3b 0a 20 20  ed ^ 0x0001];.  
154c0 20 20 70 49 74 65 72 2d 3e 69 53 77 69 74 63 68    pIter->iSwitch
154d0 52 6f 77 69 64 20 3d 20 70 49 74 65 72 2d 3e 62  Rowid = pIter->b
154e0 52 65 76 20 3f 20 53 4d 41 4c 4c 45 53 54 5f 49  Rev ? SMALLEST_I
154f0 4e 54 36 34 20 3a 20 4c 41 52 47 45 53 54 5f 49  NT64 : LARGEST_I
15500 4e 54 36 34 3b 0a 20 20 20 20 66 6f 72 28 69 3d  NT64;.    for(i=
15510 28 70 49 74 65 72 2d 3e 6e 53 65 67 2b 69 43 68  (pIter->nSeg+iCh
15520 61 6e 67 65 64 29 2f 32 3b 20 31 3b 20 69 3d 69  anged)/2; 1; i=i
15530 2f 32 29 7b 0a 20 20 20 20 20 20 46 74 73 35 43  /2){.      Fts5C
15540 52 65 73 75 6c 74 20 2a 70 52 65 73 20 3d 20 26  Result *pRes = &
15550 70 49 74 65 72 2d 3e 61 46 69 72 73 74 5b 69 5d  pIter->aFirst[i]
15560 3b 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ;..      assert(
15570 20 70 4e 65 77 2d 3e 70 4c 65 61 66 20 29 3b 0a   pNew->pLeaf );.
15580 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 52        assert( pR
15590 65 73 2d 3e 62 54 65 72 6d 45 71 3d 3d 30 20 7c  es->bTermEq==0 |
155a0 7c 20 70 4f 74 68 65 72 2d 3e 70 4c 65 61 66 20  | pOther->pLeaf 
155b0 29 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 70 52  );..      if( pR
155c0 65 73 2d 3e 62 54 65 72 6d 45 71 20 29 7b 0a 20  es->bTermEq ){. 
155d0 20 20 20 20 20 20 20 69 66 28 20 70 4e 65 77 2d         if( pNew-
155e0 3e 69 52 6f 77 69 64 3d 3d 70 4f 74 68 65 72 2d  >iRowid==pOther-
155f0 3e 69 52 6f 77 69 64 20 29 7b 0a 20 20 20 20 20  >iRowid ){.     
15600 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
15610 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
15620 20 28 70 4f 74 68 65 72 2d 3e 69 52 6f 77 69 64   (pOther->iRowid
15630 3e 70 4e 65 77 2d 3e 69 52 6f 77 69 64 29 3d 3d  >pNew->iRowid)==
15640 70 49 74 65 72 2d 3e 62 52 65 76 20 29 7b 0a 20  pIter->bRev ){. 
15650 20 20 20 20 20 20 20 20 20 70 49 74 65 72 2d 3e           pIter->
15660 69 53 77 69 74 63 68 52 6f 77 69 64 20 3d 20 70  iSwitchRowid = p
15670 4f 74 68 65 72 2d 3e 69 52 6f 77 69 64 3b 0a 20  Other->iRowid;. 
15680 20 20 20 20 20 20 20 20 20 70 4e 65 77 20 3d 20           pNew = 
15690 70 4f 74 68 65 72 3b 0a 20 20 20 20 20 20 20 20  pOther;.        
156a0 7d 65 6c 73 65 20 69 66 28 20 28 70 4f 74 68 65  }else if( (pOthe
156b0 72 2d 3e 69 52 6f 77 69 64 3e 70 49 74 65 72 2d  r->iRowid>pIter-
156c0 3e 69 53 77 69 74 63 68 52 6f 77 69 64 29 3d 3d  >iSwitchRowid)==
156d0 70 49 74 65 72 2d 3e 62 52 65 76 20 29 7b 0a 20  pIter->bRev ){. 
156e0 20 20 20 20 20 20 20 20 20 70 49 74 65 72 2d 3e           pIter->
156f0 69 53 77 69 74 63 68 52 6f 77 69 64 20 3d 20 70  iSwitchRowid = p
15700 4f 74 68 65 72 2d 3e 69 52 6f 77 69 64 3b 0a 20  Other->iRowid;. 
15710 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
15720 0a 20 20 20 20 20 20 70 52 65 73 2d 3e 69 46 69  .      pRes->iFi
15730 72 73 74 20 3d 20 28 75 31 36 29 28 70 4e 65 77  rst = (u16)(pNew
15740 20 2d 20 70 49 74 65 72 2d 3e 61 53 65 67 29 3b   - pIter->aSeg);
15750 0a 20 20 20 20 20 20 69 66 28 20 69 3d 3d 31 20  .      if( i==1 
15760 29 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 20 20  ) break;..      
15770 70 4f 74 68 65 72 20 3d 20 26 70 49 74 65 72 2d  pOther = &pIter-
15780 3e 61 53 65 67 5b 20 70 49 74 65 72 2d 3e 61 46  >aSeg[ pIter->aF
15790 69 72 73 74 5b 69 20 5e 20 30 78 30 30 30 31 5d  irst[i ^ 0x0001]
157a0 2e 69 46 69 72 73 74 20 5d 3b 0a 20 20 20 20 7d  .iFirst ];.    }
157b0 0a 20 20 7d 0a 0a 20 20 2a 70 70 46 69 72 73 74  .  }..  *ppFirst
157c0 20 3d 20 70 4e 65 77 3b 0a 20 20 72 65 74 75 72   = pNew;.  retur
157d0 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65  n 0;.}../*.** Se
157e0 74 20 74 68 65 20 70 49 74 65 72 2d 3e 62 45 6f  t the pIter->bEo
157f0 66 20 76 61 72 69 61 62 6c 65 20 62 61 73 65 64  f variable based
15800 20 6f 6e 20 74 68 65 20 73 74 61 74 65 20 6f 66   on the state of
15810 20 74 68 65 20 73 75 62 2d 69 74 65 72 61 74 6f   the sub-iterato
15820 72 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  rs..*/.static vo
15830 69 64 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72  id fts5MultiIter
15840 53 65 74 45 6f 66 28 46 74 73 35 49 74 65 72 20  SetEof(Fts5Iter 
15850 2a 70 49 74 65 72 29 7b 0a 20 20 46 74 73 35 53  *pIter){.  Fts5S
15860 65 67 49 74 65 72 20 2a 70 53 65 67 20 3d 20 26  egIter *pSeg = &
15870 70 49 74 65 72 2d 3e 61 53 65 67 5b 20 70 49 74  pIter->aSeg[ pIt
15880 65 72 2d 3e 61 46 69 72 73 74 5b 31 5d 2e 69 46  er->aFirst[1].iF
15890 69 72 73 74 20 5d 3b 0a 20 20 70 49 74 65 72 2d  irst ];.  pIter-
158a0 3e 62 61 73 65 2e 62 45 6f 66 20 3d 20 70 53 65  >base.bEof = pSe
158b0 67 2d 3e 70 4c 65 61 66 3d 3d 30 3b 0a 20 20 70  g->pLeaf==0;.  p
158c0 49 74 65 72 2d 3e 69 53 77 69 74 63 68 52 6f 77  Iter->iSwitchRow
158d0 69 64 20 3d 20 70 53 65 67 2d 3e 69 52 6f 77 69  id = pSeg->iRowi
158e0 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65  d;.}../*.** Move
158f0 20 74 68 65 20 69 74 65 72 61 74 6f 72 20 74 6f   the iterator to
15900 20 74 68 65 20 6e 65 78 74 20 65 6e 74 72 79 2e   the next entry.
15910 20 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72   .**.** If an er
15920 72 6f 72 20 6f 63 63 75 72 73 2c 20 61 6e 20 65  ror occurs, an e
15930 72 72 6f 72 20 63 6f 64 65 20 69 73 20 6c 65 66  rror code is lef
15940 74 20 69 6e 20 46 74 73 35 49 6e 64 65 78 2e 72  t in Fts5Index.r
15950 63 2e 20 49 74 20 69 73 20 6e 6f 74 20 0a 2a 2a  c. It is not .**
15960 20 63 6f 6e 73 69 64 65 72 65 64 20 61 6e 20 65   considered an e
15970 72 72 6f 72 20 69 66 20 74 68 65 20 69 74 65 72  rror if the iter
15980 61 74 6f 72 20 72 65 61 63 68 65 73 20 45 4f 46  ator reaches EOF
15990 2c 20 6f 72 20 69 66 20 69 74 20 69 73 20 61 6c  , or if it is al
159a0 72 65 61 64 79 20 61 74 20 0a 2a 2a 20 45 4f 46  ready at .** EOF
159b0 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74   when this funct
159c0 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a  ion is called..*
159d0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  /.static void ft
159e0 73 35 4d 75 6c 74 69 49 74 65 72 4e 65 78 74 28  s5MultiIterNext(
159f0 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c  .  Fts5Index *p,
15a00 20 0a 20 20 46 74 73 35 49 74 65 72 20 2a 70 49   .  Fts5Iter *pI
15a10 74 65 72 2c 0a 20 20 69 6e 74 20 62 46 72 6f 6d  ter,.  int bFrom
15a20 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
15a30 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
15a40 66 20 61 72 67 75 6d 65 6e 74 20 69 46 72 6f 6d  f argument iFrom
15a50 20 69 73 20 76 61 6c 69 64 20 2a 2f 0a 20 20 69   is valid */.  i
15a60 36 34 20 69 46 72 6f 6d 20 20 20 20 20 20 20 20  64 iFrom        
15a70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
15a80 2a 20 41 64 76 61 6e 63 65 20 61 74 20 6c 65 61  * Advance at lea
15a90 73 74 20 61 73 20 66 61 72 20 61 73 20 74 68 69  st as far as thi
15aa0 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 62 55  s */.){.  int bU
15ab0 73 65 46 72 6f 6d 20 3d 20 62 46 72 6f 6d 3b 0a  seFrom = bFrom;.
15ac0 20 20 77 68 69 6c 65 28 20 70 2d 3e 72 63 3d 3d    while( p->rc==
15ad0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
15ae0 20 69 6e 74 20 69 46 69 72 73 74 20 3d 20 70 49   int iFirst = pI
15af0 74 65 72 2d 3e 61 46 69 72 73 74 5b 31 5d 2e 69  ter->aFirst[1].i
15b00 46 69 72 73 74 3b 0a 20 20 20 20 69 6e 74 20 62  First;.    int b
15b10 4e 65 77 54 65 72 6d 20 3d 20 30 3b 0a 20 20 20  NewTerm = 0;.   
15b20 20 46 74 73 35 53 65 67 49 74 65 72 20 2a 70 53   Fts5SegIter *pS
15b30 65 67 20 3d 20 26 70 49 74 65 72 2d 3e 61 53 65  eg = &pIter->aSe
15b40 67 5b 69 46 69 72 73 74 5d 3b 0a 20 20 20 20 61  g[iFirst];.    a
15b50 73 73 65 72 74 28 20 70 2d 3e 72 63 3d 3d 53 51  ssert( p->rc==SQ
15b60 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 69  LITE_OK );.    i
15b70 66 28 20 62 55 73 65 46 72 6f 6d 20 26 26 20 70  f( bUseFrom && p
15b80 53 65 67 2d 3e 70 44 6c 69 64 78 20 29 7b 0a 20  Seg->pDlidx ){. 
15b90 20 20 20 20 20 66 74 73 35 53 65 67 49 74 65 72       fts5SegIter
15ba0 4e 65 78 74 46 72 6f 6d 28 70 2c 20 70 53 65 67  NextFrom(p, pSeg
15bb0 2c 20 69 46 72 6f 6d 29 3b 0a 20 20 20 20 7d 65  , iFrom);.    }e
15bc0 6c 73 65 7b 0a 20 20 20 20 20 20 70 53 65 67 2d  lse{.      pSeg-
15bd0 3e 78 4e 65 78 74 28 70 2c 20 70 53 65 67 2c 20  >xNext(p, pSeg, 
15be0 26 62 4e 65 77 54 65 72 6d 29 3b 0a 20 20 20 20  &bNewTerm);.    
15bf0 7d 0a 0a 20 20 20 20 69 66 28 20 70 53 65 67 2d  }..    if( pSeg-
15c00 3e 70 4c 65 61 66 3d 3d 30 20 7c 7c 20 62 4e 65  >pLeaf==0 || bNe
15c10 77 54 65 72 6d 20 0a 20 20 20 20 20 7c 7c 20 66  wTerm .     || f
15c20 74 73 35 4d 75 6c 74 69 49 74 65 72 41 64 76 61  ts5MultiIterAdva
15c30 6e 63 65 52 6f 77 69 64 28 70 49 74 65 72 2c 20  nceRowid(pIter, 
15c40 69 46 69 72 73 74 2c 20 26 70 53 65 67 29 0a 20  iFirst, &pSeg). 
15c50 20 20 20 29 7b 0a 20 20 20 20 20 20 66 74 73 35     ){.      fts5
15c60 4d 75 6c 74 69 49 74 65 72 41 64 76 61 6e 63 65  MultiIterAdvance
15c70 64 28 70 2c 20 70 49 74 65 72 2c 20 69 46 69 72  d(p, pIter, iFir
15c80 73 74 2c 20 31 29 3b 0a 20 20 20 20 20 20 66 74  st, 1);.      ft
15c90 73 35 4d 75 6c 74 69 49 74 65 72 53 65 74 45 6f  s5MultiIterSetEo
15ca0 66 28 70 49 74 65 72 29 3b 0a 20 20 20 20 20 20  f(pIter);.      
15cb0 70 53 65 67 20 3d 20 26 70 49 74 65 72 2d 3e 61  pSeg = &pIter->a
15cc0 53 65 67 5b 70 49 74 65 72 2d 3e 61 46 69 72 73  Seg[pIter->aFirs
15cd0 74 5b 31 5d 2e 69 46 69 72 73 74 5d 3b 0a 20 20  t[1].iFirst];.  
15ce0 20 20 20 20 69 66 28 20 70 53 65 67 2d 3e 70 4c      if( pSeg->pL
15cf0 65 61 66 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  eaf==0 ) return;
15d00 0a 20 20 20 20 7d 0a 0a 20 20 20 20 66 74 73 35  .    }..    fts5
15d10 41 73 73 65 72 74 4d 75 6c 74 69 49 74 65 72 53  AssertMultiIterS
15d20 65 74 75 70 28 70 2c 20 70 49 74 65 72 29 3b 0a  etup(p, pIter);.
15d30 20 20 20 20 61 73 73 65 72 74 28 20 70 53 65 67      assert( pSeg
15d40 3d 3d 26 70 49 74 65 72 2d 3e 61 53 65 67 5b 70  ==&pIter->aSeg[p
15d50 49 74 65 72 2d 3e 61 46 69 72 73 74 5b 31 5d 2e  Iter->aFirst[1].
15d60 69 46 69 72 73 74 5d 20 26 26 20 70 53 65 67 2d  iFirst] && pSeg-
15d70 3e 70 4c 65 61 66 20 29 3b 0a 20 20 20 20 69 66  >pLeaf );.    if
15d80 28 20 70 49 74 65 72 2d 3e 62 53 6b 69 70 45 6d  ( pIter->bSkipEm
15d90 70 74 79 3d 3d 30 20 7c 7c 20 70 53 65 67 2d 3e  pty==0 || pSeg->
15da0 6e 50 6f 73 20 29 7b 0a 20 20 20 20 20 20 70 49  nPos ){.      pI
15db0 74 65 72 2d 3e 78 53 65 74 4f 75 74 70 75 74 73  ter->xSetOutputs
15dc0 28 70 49 74 65 72 2c 20 70 53 65 67 29 3b 0a 20  (pIter, pSeg);. 
15dd0 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20       return;.   
15de0 20 7d 0a 20 20 20 20 62 55 73 65 46 72 6f 6d 20   }.    bUseFrom 
15df0 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74  = 0;.  }.}..stat
15e00 69 63 20 76 6f 69 64 20 66 74 73 35 4d 75 6c 74  ic void fts5Mult
15e10 69 49 74 65 72 4e 65 78 74 32 28 0a 20 20 46 74  iIterNext2(.  Ft
15e20 73 35 49 6e 64 65 78 20 2a 70 2c 20 0a 20 20 46  s5Index *p, .  F
15e30 74 73 35 49 74 65 72 20 2a 70 49 74 65 72 2c 0a  ts5Iter *pIter,.
15e40 20 20 69 6e 74 20 2a 70 62 4e 65 77 54 65 72 6d    int *pbNewTerm
15e50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15e60 20 20 2f 2a 20 4f 55 54 3a 20 54 72 75 65 20 69    /* OUT: True i
15e70 66 20 2a 6d 69 67 68 74 2a 20 62 65 20 6e 65 77  f *might* be new
15e80 20 74 65 72 6d 20 2a 2f 0a 29 7b 0a 20 20 61 73   term */.){.  as
15e90 73 65 72 74 28 20 70 49 74 65 72 2d 3e 62 53 6b  sert( pIter->bSk
15ea0 69 70 45 6d 70 74 79 20 29 3b 0a 20 20 69 66 28  ipEmpty );.  if(
15eb0 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
15ec0 4b 20 29 7b 0a 20 20 20 20 64 6f 20 7b 0a 20 20  K ){.    do {.  
15ed0 20 20 20 20 69 6e 74 20 69 46 69 72 73 74 20 3d      int iFirst =
15ee0 20 70 49 74 65 72 2d 3e 61 46 69 72 73 74 5b 31   pIter->aFirst[1
15ef0 5d 2e 69 46 69 72 73 74 3b 0a 20 20 20 20 20 20  ].iFirst;.      
15f00 46 74 73 35 53 65 67 49 74 65 72 20 2a 70 53 65  Fts5SegIter *pSe
15f10 67 20 3d 20 26 70 49 74 65 72 2d 3e 61 53 65 67  g = &pIter->aSeg
15f20 5b 69 46 69 72 73 74 5d 3b 0a 20 20 20 20 20 20  [iFirst];.      
15f30 69 6e 74 20 62 4e 65 77 54 65 72 6d 20 3d 20 30  int bNewTerm = 0
15f40 3b 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ;..      assert(
15f50 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
15f60 4b 20 29 3b 0a 20 20 20 20 20 20 70 53 65 67 2d  K );.      pSeg-
15f70 3e 78 4e 65 78 74 28 70 2c 20 70 53 65 67 2c 20  >xNext(p, pSeg, 
15f80 26 62 4e 65 77 54 65 72 6d 29 3b 0a 20 20 20 20  &bNewTerm);.    
15f90 20 20 69 66 28 20 70 53 65 67 2d 3e 70 4c 65 61    if( pSeg->pLea
15fa0 66 3d 3d 30 20 7c 7c 20 62 4e 65 77 54 65 72 6d  f==0 || bNewTerm
15fb0 20 0a 20 20 20 20 20 20 20 7c 7c 20 66 74 73 35   .       || fts5
15fc0 4d 75 6c 74 69 49 74 65 72 41 64 76 61 6e 63 65  MultiIterAdvance
15fd0 52 6f 77 69 64 28 70 49 74 65 72 2c 20 69 46 69  Rowid(pIter, iFi
15fe0 72 73 74 2c 20 26 70 53 65 67 29 0a 20 20 20 20  rst, &pSeg).    
15ff0 20 20 29 7b 0a 20 20 20 20 20 20 20 20 66 74 73    ){.        fts
16000 35 4d 75 6c 74 69 49 74 65 72 41 64 76 61 6e 63  5MultiIterAdvanc
16010 65 64 28 70 2c 20 70 49 74 65 72 2c 20 69 46 69  ed(p, pIter, iFi
16020 72 73 74 2c 20 31 29 3b 0a 20 20 20 20 20 20 20  rst, 1);.       
16030 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 53 65   fts5MultiIterSe
16040 74 45 6f 66 28 70 49 74 65 72 29 3b 0a 20 20 20  tEof(pIter);.   
16050 20 20 20 20 20 2a 70 62 4e 65 77 54 65 72 6d 20       *pbNewTerm 
16060 3d 20 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  = 1;.      }else
16070 7b 0a 20 20 20 20 20 20 20 20 2a 70 62 4e 65 77  {.        *pbNew
16080 54 65 72 6d 20 3d 20 30 3b 0a 20 20 20 20 20 20  Term = 0;.      
16090 7d 0a 20 20 20 20 20 20 66 74 73 35 41 73 73 65  }.      fts5Asse
160a0 72 74 4d 75 6c 74 69 49 74 65 72 53 65 74 75 70  rtMultiIterSetup
160b0 28 70 2c 20 70 49 74 65 72 29 3b 0a 0a 20 20 20  (p, pIter);..   
160c0 20 7d 77 68 69 6c 65 28 20 66 74 73 35 4d 75 6c   }while( fts5Mul
160d0 74 69 49 74 65 72 49 73 45 6d 70 74 79 28 70 2c  tiIterIsEmpty(p,
160e0 20 70 49 74 65 72 29 20 29 3b 0a 20 20 7d 0a 7d   pIter) );.  }.}
160f0 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  ..static void ft
16100 73 35 49 74 65 72 53 65 74 4f 75 74 70 75 74 73  s5IterSetOutputs
16110 5f 4e 6f 6f 70 28 46 74 73 35 49 74 65 72 20 2a  _Noop(Fts5Iter *
16120 70 55 6e 75 73 65 64 31 2c 20 46 74 73 35 53 65  pUnused1, Fts5Se
16130 67 49 74 65 72 20 2a 70 55 6e 75 73 65 64 32 29  gIter *pUnused2)
16140 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  {.  UNUSED_PARAM
16150 32 28 70 55 6e 75 73 65 64 31 2c 20 70 55 6e 75  2(pUnused1, pUnu
16160 73 65 64 32 29 3b 0a 7d 0a 0a 73 74 61 74 69 63  sed2);.}..static
16170 20 46 74 73 35 49 74 65 72 20 2a 66 74 73 35 4d   Fts5Iter *fts5M
16180 75 6c 74 69 49 74 65 72 41 6c 6c 6f 63 28 0a 20  ultiIterAlloc(. 
16190 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 20   Fts5Index *p,  
161a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
161b0 20 2f 2a 20 46 54 53 35 20 62 61 63 6b 65 6e 64   /* FTS5 backend
161c0 20 74 6f 20 69 74 65 72 61 74 65 20 77 69 74 68   to iterate with
161d0 69 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 65 67  in */.  int nSeg
161e0 0a 29 7b 0a 20 20 46 74 73 35 49 74 65 72 20 2a  .){.  Fts5Iter *
161f0 70 4e 65 77 3b 0a 20 20 69 6e 74 20 6e 53 6c 6f  pNew;.  int nSlo
16200 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
16210 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 77 65 72          /* Power
16220 20 6f 66 20 74 77 6f 20 3e 3d 20 6e 53 65 67 20   of two >= nSeg 
16230 2a 2f 0a 0a 20 20 66 6f 72 28 6e 53 6c 6f 74 3d  */..  for(nSlot=
16240 32 3b 20 6e 53 6c 6f 74 3c 6e 53 65 67 3b 20 6e  2; nSlot<nSeg; n
16250 53 6c 6f 74 3d 6e 53 6c 6f 74 2a 32 29 3b 0a 20  Slot=nSlot*2);. 
16260 20 70 4e 65 77 20 3d 20 66 74 73 35 49 64 78 4d   pNew = fts5IdxM
16270 61 6c 6c 6f 63 28 70 2c 20 0a 20 20 20 20 20 20  alloc(p, .      
16280 73 69 7a 65 6f 66 28 46 74 73 35 49 74 65 72 29  sizeof(Fts5Iter)
16290 20 2b 20 20 20 20 20 20 20 20 20 20 20 20 20 20   +              
162a0 20 20 20 20 2f 2a 20 70 4e 65 77 20 2a 2f 0a 20      /* pNew */. 
162b0 20 20 20 20 20 73 69 7a 65 6f 66 28 46 74 73 35       sizeof(Fts5
162c0 53 65 67 49 74 65 72 29 20 2a 20 28 6e 53 6c 6f  SegIter) * (nSlo
162d0 74 2d 31 29 20 2b 20 20 20 2f 2a 20 70 4e 65 77  t-1) +   /* pNew
162e0 2d 3e 61 53 65 67 5b 5d 20 2a 2f 0a 20 20 20 20  ->aSeg[] */.    
162f0 20 20 73 69 7a 65 6f 66 28 46 74 73 35 43 52 65    sizeof(Fts5CRe
16300 73 75 6c 74 29 20 2a 20 6e 53 6c 6f 74 20 20 20  sult) * nSlot   
16310 20 20 20 20 20 20 2f 2a 20 70 4e 65 77 2d 3e 61        /* pNew->a
16320 46 69 72 73 74 5b 5d 20 2a 2f 0a 20 20 29 3b 0a  First[] */.  );.
16330 20 20 69 66 28 20 70 4e 65 77 20 29 7b 0a 20 20    if( pNew ){.  
16340 20 20 70 4e 65 77 2d 3e 6e 53 65 67 20 3d 20 6e    pNew->nSeg = n
16350 53 6c 6f 74 3b 0a 20 20 20 20 70 4e 65 77 2d 3e  Slot;.    pNew->
16360 61 46 69 72 73 74 20 3d 20 28 46 74 73 35 43 52  aFirst = (Fts5CR
16370 65 73 75 6c 74 2a 29 26 70 4e 65 77 2d 3e 61 53  esult*)&pNew->aS
16380 65 67 5b 6e 53 6c 6f 74 5d 3b 0a 20 20 20 20 70  eg[nSlot];.    p
16390 4e 65 77 2d 3e 70 49 6e 64 65 78 20 3d 20 70 3b  New->pIndex = p;
163a0 0a 20 20 20 20 70 4e 65 77 2d 3e 78 53 65 74 4f  .    pNew->xSetO
163b0 75 74 70 75 74 73 20 3d 20 66 74 73 35 49 74 65  utputs = fts5Ite
163c0 72 53 65 74 4f 75 74 70 75 74 73 5f 4e 6f 6f 70  rSetOutputs_Noop
163d0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  ;.  }.  return p
163e0 4e 65 77 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76  New;.}..static v
163f0 6f 69 64 20 66 74 73 35 50 6f 73 6c 69 73 74 43  oid fts5PoslistC
16400 61 6c 6c 62 61 63 6b 28 0a 20 20 46 74 73 35 49  allback(.  Fts5I
16410 6e 64 65 78 20 2a 70 55 6e 75 73 65 64 2c 20 0a  ndex *pUnused, .
16420 20 20 76 6f 69 64 20 2a 70 43 6f 6e 74 65 78 74    void *pContext
16430 2c 20 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 70  , .  const u8 *p
16440 43 68 75 6e 6b 2c 20 69 6e 74 20 6e 43 68 75 6e  Chunk, int nChun
16450 6b 0a 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41  k.){.  UNUSED_PA
16460 52 41 4d 28 70 55 6e 75 73 65 64 29 3b 0a 20 20  RAM(pUnused);.  
16470 61 73 73 65 72 74 5f 6e 63 28 20 6e 43 68 75 6e  assert_nc( nChun
16480 6b 3e 3d 30 20 29 3b 0a 20 20 69 66 28 20 6e 43  k>=0 );.  if( nC
16490 68 75 6e 6b 3e 30 20 29 7b 0a 20 20 20 20 66 74  hunk>0 ){.    ft
164a0 73 35 42 75 66 66 65 72 53 61 66 65 41 70 70 65  s5BufferSafeAppe
164b0 6e 64 42 6c 6f 62 28 28 46 74 73 35 42 75 66 66  ndBlob((Fts5Buff
164c0 65 72 2a 29 70 43 6f 6e 74 65 78 74 2c 20 70 43  er*)pContext, pC
164d0 68 75 6e 6b 2c 20 6e 43 68 75 6e 6b 29 3b 0a 20  hunk, nChunk);. 
164e0 20 7d 0a 7d 0a 0a 74 79 70 65 64 65 66 20 73 74   }.}..typedef st
164f0 72 75 63 74 20 50 6f 73 6c 69 73 74 43 61 6c 6c  ruct PoslistCall
16500 62 61 63 6b 43 74 78 20 50 6f 73 6c 69 73 74 43  backCtx PoslistC
16510 61 6c 6c 62 61 63 6b 43 74 78 3b 0a 73 74 72 75  allbackCtx;.stru
16520 63 74 20 50 6f 73 6c 69 73 74 43 61 6c 6c 62 61  ct PoslistCallba
16530 63 6b 43 74 78 20 7b 0a 20 20 46 74 73 35 42 75  ckCtx {.  Fts5Bu
16540 66 66 65 72 20 2a 70 42 75 66 3b 20 20 20 20 20  ffer *pBuf;     
16550 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 70 70            /* App
16560 65 6e 64 20 74 6f 20 74 68 69 73 20 62 75 66 66  end to this buff
16570 65 72 20 2a 2f 0a 20 20 46 74 73 35 43 6f 6c 73  er */.  Fts5Cols
16580 65 74 20 2a 70 43 6f 6c 73 65 74 3b 20 20 20 20  et *pColset;    
16590 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72          /* Restr
165a0 69 63 74 20 6d 61 74 63 68 65 73 20 74 6f 20 74  ict matches to t
165b0 68 69 73 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20  his column */.  
165c0 69 6e 74 20 65 53 74 61 74 65 3b 20 20 20 20 20  int eState;     
165d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
165e0 2f 2a 20 53 65 65 20 61 62 6f 76 65 20 2a 2f 0a  /* See above */.
165f0 7d 3b 0a 0a 74 79 70 65 64 65 66 20 73 74 72 75  };..typedef stru
16600 63 74 20 50 6f 73 6c 69 73 74 4f 66 66 73 65 74  ct PoslistOffset
16610 73 43 74 78 20 50 6f 73 6c 69 73 74 4f 66 66 73  sCtx PoslistOffs
16620 65 74 73 43 74 78 3b 0a 73 74 72 75 63 74 20 50  etsCtx;.struct P
16630 6f 73 6c 69 73 74 4f 66 66 73 65 74 73 43 74 78  oslistOffsetsCtx
16640 20 7b 0a 20 20 46 74 73 35 42 75 66 66 65 72 20   {.  Fts5Buffer 
16650 2a 70 42 75 66 3b 20 20 20 20 20 20 20 20 20 20  *pBuf;          
16660 20 20 20 20 20 2f 2a 20 41 70 70 65 6e 64 20 74       /* Append t
16670 6f 20 74 68 69 73 20 62 75 66 66 65 72 20 2a 2f  o this buffer */
16680 0a 20 20 46 74 73 35 43 6f 6c 73 65 74 20 2a 70  .  Fts5Colset *p
16690 43 6f 6c 73 65 74 3b 20 20 20 20 20 20 20 20 20  Colset;         
166a0 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 20 6d     /* Restrict m
166b0 61 74 63 68 65 73 20 74 6f 20 74 68 69 73 20 63  atches to this c
166c0 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 69 6e 74 20 69  olumn */.  int i
166d0 52 65 61 64 3b 0a 20 20 69 6e 74 20 69 57 72 69  Read;.  int iWri
166e0 74 65 3b 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 4f  te;.};../*.** TO
166f0 44 4f 3a 20 4d 61 6b 65 20 74 68 69 73 20 6d 6f  DO: Make this mo
16700 72 65 20 65 66 66 69 63 69 65 6e 74 21 0a 2a 2f  re efficient!.*/
16710 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 35  .static int fts5
16720 49 6e 64 65 78 43 6f 6c 73 65 74 54 65 73 74 28  IndexColsetTest(
16730 46 74 73 35 43 6f 6c 73 65 74 20 2a 70 43 6f 6c  Fts5Colset *pCol
16740 73 65 74 2c 20 69 6e 74 20 69 43 6f 6c 29 7b 0a  set, int iCol){.
16750 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69    int i;.  for(i
16760 3d 30 3b 20 69 3c 70 43 6f 6c 73 65 74 2d 3e 6e  =0; i<pColset->n
16770 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  Col; i++){.    i
16780 66 28 20 70 43 6f 6c 73 65 74 2d 3e 61 69 43 6f  f( pColset->aiCo
16790 6c 5b 69 5d 3d 3d 69 43 6f 6c 20 29 20 72 65 74  l[i]==iCol ) ret
167a0 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74  urn 1;.  }.  ret
167b0 75 72 6e 20 30 3b 0a 7d 0a 0a 73 74 61 74 69 63  urn 0;.}..static
167c0 20 76 6f 69 64 20 66 74 73 35 50 6f 73 6c 69 73   void fts5Poslis
167d0 74 4f 66 66 73 65 74 73 43 61 6c 6c 62 61 63 6b  tOffsetsCallback
167e0 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70  (.  Fts5Index *p
167f0 55 6e 75 73 65 64 2c 20 0a 20 20 76 6f 69 64 20  Unused, .  void 
16800 2a 70 43 6f 6e 74 65 78 74 2c 20 0a 20 20 63 6f  *pContext, .  co
16810 6e 73 74 20 75 38 20 2a 70 43 68 75 6e 6b 2c 20  nst u8 *pChunk, 
16820 69 6e 74 20 6e 43 68 75 6e 6b 0a 29 7b 0a 20 20  int nChunk.){.  
16830 50 6f 73 6c 69 73 74 4f 66 66 73 65 74 73 43 74  PoslistOffsetsCt
16840 78 20 2a 70 43 74 78 20 3d 20 28 50 6f 73 6c 69  x *pCtx = (Posli
16850 73 74 4f 66 66 73 65 74 73 43 74 78 2a 29 70 43  stOffsetsCtx*)pC
16860 6f 6e 74 65 78 74 3b 0a 20 20 55 4e 55 53 45 44  ontext;.  UNUSED
16870 5f 50 41 52 41 4d 28 70 55 6e 75 73 65 64 29 3b  _PARAM(pUnused);
16880 0a 20 20 61 73 73 65 72 74 5f 6e 63 28 20 6e 43  .  assert_nc( nC
16890 68 75 6e 6b 3e 3d 30 20 29 3b 0a 20 20 69 66 28  hunk>=0 );.  if(
168a0 20 6e 43 68 75 6e 6b 3e 30 20 29 7b 0a 20 20 20   nChunk>0 ){.   
168b0 20 69 6e 74 20 69 20 3d 20 30 3b 0a 20 20 20 20   int i = 0;.    
168c0 77 68 69 6c 65 28 20 69 3c 6e 43 68 75 6e 6b 20  while( i<nChunk 
168d0 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 56 61  ){.      int iVa
168e0 6c 3b 0a 20 20 20 20 20 20 69 20 2b 3d 20 66 74  l;.      i += ft
168f0 73 35 47 65 74 56 61 72 69 6e 74 33 32 28 26 70  s5GetVarint32(&p
16900 43 68 75 6e 6b 5b 69 5d 2c 20 69 56 61 6c 29 3b  Chunk[i], iVal);
16910 0a 20 20 20 20 20 20 69 56 61 6c 20 2b 3d 20 70  .      iVal += p
16920 43 74 78 2d 3e 69 52 65 61 64 20 2d 20 32 3b 0a  Ctx->iRead - 2;.
16930 20 20 20 20 20 20 70 43 74 78 2d 3e 69 52 65 61        pCtx->iRea
16940 64 20 3d 20 69 56 61 6c 3b 0a 20 20 20 20 20 20  d = iVal;.      
16950 69 66 28 20 66 74 73 35 49 6e 64 65 78 43 6f 6c  if( fts5IndexCol
16960 73 65 74 54 65 73 74 28 70 43 74 78 2d 3e 70 43  setTest(pCtx->pC
16970 6f 6c 73 65 74 2c 20 69 56 61 6c 29 20 29 7b 0a  olset, iVal) ){.
16980 20 20 20 20 20 20 20 20 66 74 73 35 42 75 66 66          fts5Buff
16990 65 72 53 61 66 65 41 70 70 65 6e 64 56 61 72 69  erSafeAppendVari
169a0 6e 74 28 70 43 74 78 2d 3e 70 42 75 66 2c 20 69  nt(pCtx->pBuf, i
169b0 56 61 6c 20 2b 20 32 20 2d 20 70 43 74 78 2d 3e  Val + 2 - pCtx->
169c0 69 57 72 69 74 65 29 3b 0a 20 20 20 20 20 20 20  iWrite);.       
169d0 20 70 43 74 78 2d 3e 69 57 72 69 74 65 20 3d 20   pCtx->iWrite = 
169e0 69 56 61 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20  iVal;.      }.  
169f0 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69    }.  }.}..stati
16a00 63 20 76 6f 69 64 20 66 74 73 35 50 6f 73 6c 69  c void fts5Posli
16a10 73 74 46 69 6c 74 65 72 43 61 6c 6c 62 61 63 6b  stFilterCallback
16a20 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70  (.  Fts5Index *p
16a30 55 6e 75 73 65 64 2c 0a 20 20 76 6f 69 64 20 2a  Unused,.  void *
16a40 70 43 6f 6e 74 65 78 74 2c 20 0a 20 20 63 6f 6e  pContext, .  con
16a50 73 74 20 75 38 20 2a 70 43 68 75 6e 6b 2c 20 69  st u8 *pChunk, i
16a60 6e 74 20 6e 43 68 75 6e 6b 0a 29 7b 0a 20 20 50  nt nChunk.){.  P
16a70 6f 73 6c 69 73 74 43 61 6c 6c 62 61 63 6b 43 74  oslistCallbackCt
16a80 78 20 2a 70 43 74 78 20 3d 20 28 50 6f 73 6c 69  x *pCtx = (Posli
16a90 73 74 43 61 6c 6c 62 61 63 6b 43 74 78 2a 29 70  stCallbackCtx*)p
16aa0 43 6f 6e 74 65 78 74 3b 0a 20 20 55 4e 55 53 45  Context;.  UNUSE
16ab0 44 5f 50 41 52 41 4d 28 70 55 6e 75 73 65 64 29  D_PARAM(pUnused)
16ac0 3b 0a 20 20 61 73 73 65 72 74 5f 6e 63 28 20 6e  ;.  assert_nc( n
16ad0 43 68 75 6e 6b 3e 3d 30 20 29 3b 0a 20 20 69 66  Chunk>=0 );.  if
16ae0 28 20 6e 43 68 75 6e 6b 3e 30 20 29 7b 0a 20 20  ( nChunk>0 ){.  
16af0 20 20 2f 2a 20 53 65 61 72 63 68 20 74 68 72 6f    /* Search thro
16b00 75 67 68 20 74 6f 20 66 69 6e 64 20 74 68 65 20  ugh to find the 
16b10 66 69 72 73 74 20 76 61 72 69 6e 74 20 77 69 74  first varint wit
16b20 68 20 76 61 6c 75 65 20 31 2e 20 54 68 69 73 20  h value 1. This 
16b30 69 73 20 74 68 65 0a 20 20 20 20 2a 2a 20 73 74  is the.    ** st
16b40 61 72 74 20 6f 66 20 74 68 65 20 6e 65 78 74 20  art of the next 
16b50 63 6f 6c 75 6d 6e 73 20 68 69 74 73 2e 20 2a 2f  columns hits. */
16b60 0a 20 20 20 20 69 6e 74 20 69 20 3d 20 30 3b 0a  .    int i = 0;.
16b70 20 20 20 20 69 6e 74 20 69 53 74 61 72 74 20 3d      int iStart =
16b80 20 30 3b 0a 0a 20 20 20 20 69 66 28 20 70 43 74   0;..    if( pCt
16b90 78 2d 3e 65 53 74 61 74 65 3d 3d 32 20 29 7b 0a  x->eState==2 ){.
16ba0 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6c 3b 0a        int iCol;.
16bb0 20 20 20 20 20 20 66 74 73 35 46 61 73 74 47 65        fts5FastGe
16bc0 74 56 61 72 69 6e 74 33 32 28 70 43 68 75 6e 6b  tVarint32(pChunk
16bd0 2c 20 69 2c 20 69 43 6f 6c 29 3b 0a 20 20 20 20  , i, iCol);.    
16be0 20 20 69 66 28 20 66 74 73 35 49 6e 64 65 78 43    if( fts5IndexC
16bf0 6f 6c 73 65 74 54 65 73 74 28 70 43 74 78 2d 3e  olsetTest(pCtx->
16c00 70 43 6f 6c 73 65 74 2c 20 69 43 6f 6c 29 20 29  pColset, iCol) )
16c10 7b 0a 20 20 20 20 20 20 20 20 70 43 74 78 2d 3e  {.        pCtx->
16c20 65 53 74 61 74 65 20 3d 20 31 3b 0a 20 20 20 20  eState = 1;.    
16c30 20 20 20 20 66 74 73 35 42 75 66 66 65 72 53 61      fts5BufferSa
16c40 66 65 41 70 70 65 6e 64 56 61 72 69 6e 74 28 70  feAppendVarint(p
16c50 43 74 78 2d 3e 70 42 75 66 2c 20 31 29 3b 0a 20  Ctx->pBuf, 1);. 
16c60 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
16c70 20 20 20 20 70 43 74 78 2d 3e 65 53 74 61 74 65      pCtx->eState
16c80 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 0;.      }.  
16c90 20 20 7d 0a 0a 20 20 20 20 64 6f 20 7b 0a 20 20    }..    do {.  
16ca0 20 20 20 20 77 68 69 6c 65 28 20 69 3c 6e 43 68      while( i<nCh
16cb0 75 6e 6b 20 26 26 20 70 43 68 75 6e 6b 5b 69 5d  unk && pChunk[i]
16cc0 21 3d 30 78 30 31 20 29 7b 0a 20 20 20 20 20 20  !=0x01 ){.      
16cd0 20 20 77 68 69 6c 65 28 20 70 43 68 75 6e 6b 5b    while( pChunk[
16ce0 69 5d 20 26 20 30 78 38 30 20 29 20 69 2b 2b 3b  i] & 0x80 ) i++;
16cf0 0a 20 20 20 20 20 20 20 20 69 2b 2b 3b 0a 20 20  .        i++;.  
16d00 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
16d10 70 43 74 78 2d 3e 65 53 74 61 74 65 20 29 7b 0a  pCtx->eState ){.
16d20 20 20 20 20 20 20 20 20 66 74 73 35 42 75 66 66          fts5Buff
16d30 65 72 53 61 66 65 41 70 70 65 6e 64 42 6c 6f 62  erSafeAppendBlob
16d40 28 70 43 74 78 2d 3e 70 42 75 66 2c 20 26 70 43  (pCtx->pBuf, &pC
16d50 68 75 6e 6b 5b 69 53 74 61 72 74 5d 2c 20 69 2d  hunk[iStart], i-
16d60 69 53 74 61 72 74 29 3b 0a 20 20 20 20 20 20 7d  iStart);.      }
16d70 0a 20 20 20 20 20 20 69 66 28 20 69 3c 6e 43 68  .      if( i<nCh
16d80 75 6e 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 69  unk ){.        i
16d90 6e 74 20 69 43 6f 6c 3b 0a 20 20 20 20 20 20 20  nt iCol;.       
16da0 20 69 53 74 61 72 74 20 3d 20 69 3b 0a 20 20 20   iStart = i;.   
16db0 20 20 20 20 20 69 2b 2b 3b 0a 20 20 20 20 20 20       i++;.      
16dc0 20 20 69 66 28 20 69 3e 3d 6e 43 68 75 6e 6b 20    if( i>=nChunk 
16dd0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 43 74  ){.          pCt
16de0 78 2d 3e 65 53 74 61 74 65 20 3d 20 32 3b 0a 20  x->eState = 2;. 
16df0 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
16e00 20 20 20 20 20 20 20 20 66 74 73 35 46 61 73 74          fts5Fast
16e10 47 65 74 56 61 72 69 6e 74 33 32 28 70 43 68 75  GetVarint32(pChu
16e20 6e 6b 2c 20 69 2c 20 69 43 6f 6c 29 3b 0a 20 20  nk, i, iCol);.  
16e30 20 20 20 20 20 20 20 20 70 43 74 78 2d 3e 65 53          pCtx->eS
16e40 74 61 74 65 20 3d 20 66 74 73 35 49 6e 64 65 78  tate = fts5Index
16e50 43 6f 6c 73 65 74 54 65 73 74 28 70 43 74 78 2d  ColsetTest(pCtx-
16e60 3e 70 43 6f 6c 73 65 74 2c 20 69 43 6f 6c 29 3b  >pColset, iCol);
16e70 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
16e80 43 74 78 2d 3e 65 53 74 61 74 65 20 29 7b 0a 20  Ctx->eState ){. 
16e90 20 20 20 20 20 20 20 20 20 20 20 66 74 73 35 42             fts5B
16ea0 75 66 66 65 72 53 61 66 65 41 70 70 65 6e 64 42  ufferSafeAppendB
16eb0 6c 6f 62 28 70 43 74 78 2d 3e 70 42 75 66 2c 20  lob(pCtx->pBuf, 
16ec0 26 70 43 68 75 6e 6b 5b 69 53 74 61 72 74 5d 2c  &pChunk[iStart],
16ed0 20 69 2d 69 53 74 61 72 74 29 3b 0a 20 20 20 20   i-iStart);.    
16ee0 20 20 20 20 20 20 20 20 69 53 74 61 72 74 20 3d          iStart =
16ef0 20 69 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a   i;.          }.
16f00 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
16f10 7d 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 69 3c  }.    }while( i<
16f20 6e 43 68 75 6e 6b 20 29 3b 0a 20 20 7d 0a 7d 0a  nChunk );.  }.}.
16f30 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
16f40 35 43 68 75 6e 6b 49 74 65 72 61 74 65 28 0a 20  5ChunkIterate(. 
16f50 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 20   Fts5Index *p,  
16f60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16f70 20 2f 2a 20 49 6e 64 65 78 20 6f 62 6a 65 63 74   /* Index object
16f80 20 2a 2f 0a 20 20 46 74 73 35 53 65 67 49 74 65   */.  Fts5SegIte
16f90 72 20 2a 70 53 65 67 2c 20 20 20 20 20 20 20 20  r *pSeg,        
16fa0 20 20 20 20 20 20 2f 2a 20 50 6f 73 6c 69 73 74        /* Poslist
16fb0 20 6f 66 20 74 68 69 73 20 69 74 65 72 61 74 6f   of this iterato
16fc0 72 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 43 74  r */.  void *pCt
16fd0 78 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  x,              
16fe0 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 74 65 78         /* Contex
16ff0 74 20 70 6f 69 6e 74 65 72 20 66 6f 72 20 78 43  t pointer for xC
17000 68 75 6e 6b 20 63 61 6c 6c 62 61 63 6b 20 2a 2f  hunk callback */
17010 0a 20 20 76 6f 69 64 20 28 2a 78 43 68 75 6e 6b  .  void (*xChunk
17020 29 28 46 74 73 35 49 6e 64 65 78 2a 2c 20 76 6f  )(Fts5Index*, vo
17030 69 64 2a 2c 20 63 6f 6e 73 74 20 75 38 2a 2c 20  id*, const u8*, 
17040 69 6e 74 29 0a 29 7b 0a 20 20 69 6e 74 20 6e 52  int).){.  int nR
17050 65 6d 20 3d 20 70 53 65 67 2d 3e 6e 50 6f 73 3b  em = pSeg->nPos;
17060 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
17070 62 65 72 20 6f 66 20 62 79 74 65 73 20 73 74 69  ber of bytes sti
17080 6c 6c 20 74 6f 20 63 6f 6d 65 20 2a 2f 0a 20 20  ll to come */.  
17090 46 74 73 35 44 61 74 61 20 2a 70 44 61 74 61 20  Fts5Data *pData 
170a0 3d 20 30 3b 0a 20 20 75 38 20 2a 70 43 68 75 6e  = 0;.  u8 *pChun
170b0 6b 20 3d 20 26 70 53 65 67 2d 3e 70 4c 65 61 66  k = &pSeg->pLeaf
170c0 2d 3e 70 5b 70 53 65 67 2d 3e 69 4c 65 61 66 4f  ->p[pSeg->iLeafO
170d0 66 66 73 65 74 5d 3b 0a 20 20 69 6e 74 20 6e 43  ffset];.  int nC
170e0 68 75 6e 6b 20 3d 20 4d 49 4e 28 6e 52 65 6d 2c  hunk = MIN(nRem,
170f0 20 70 53 65 67 2d 3e 70 4c 65 61 66 2d 3e 73 7a   pSeg->pLeaf->sz
17100 4c 65 61 66 20 2d 20 70 53 65 67 2d 3e 69 4c 65  Leaf - pSeg->iLe
17110 61 66 4f 66 66 73 65 74 29 3b 0a 20 20 69 6e 74  afOffset);.  int
17120 20 70 67 6e 6f 20 3d 20 70 53 65 67 2d 3e 69 4c   pgno = pSeg->iL
17130 65 61 66 50 67 6e 6f 3b 0a 20 20 69 6e 74 20 70  eafPgno;.  int p
17140 67 6e 6f 53 61 76 65 20 3d 20 30 3b 0a 0a 20 20  gnoSave = 0;..  
17150 2f 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  /* This function
17160 20 64 6f 65 73 20 6e 6f 74 6d 77 6f 72 6b 20 77   does notmwork w
17170 69 74 68 20 64 65 74 61 69 6c 3d 6e 6f 6e 65 20  ith detail=none 
17180 64 61 74 61 62 61 73 65 73 2e 20 2a 2f 0a 20 20  databases. */.  
17190 61 73 73 65 72 74 28 20 70 2d 3e 70 43 6f 6e 66  assert( p->pConf
171a0 69 67 2d 3e 65 44 65 74 61 69 6c 21 3d 46 54 53  ig->eDetail!=FTS
171b0 35 5f 44 45 54 41 49 4c 5f 4e 4f 4e 45 20 29 3b  5_DETAIL_NONE );
171c0 0a 0a 20 20 69 66 28 20 28 70 53 65 67 2d 3e 66  ..  if( (pSeg->f
171d0 6c 61 67 73 20 26 20 46 54 53 35 5f 53 45 47 49  lags & FTS5_SEGI
171e0 54 45 52 5f 52 45 56 45 52 53 45 29 3d 3d 30 20  TER_REVERSE)==0 
171f0 29 7b 0a 20 20 20 20 70 67 6e 6f 53 61 76 65 20  ){.    pgnoSave 
17200 3d 20 70 67 6e 6f 2b 31 3b 0a 20 20 7d 0a 0a 20  = pgno+1;.  }.. 
17210 20 77 68 69 6c 65 28 20 31 20 29 7b 0a 20 20 20   while( 1 ){.   
17220 20 78 43 68 75 6e 6b 28 70 2c 20 70 43 74 78 2c   xChunk(p, pCtx,
17230 20 70 43 68 75 6e 6b 2c 20 6e 43 68 75 6e 6b 29   pChunk, nChunk)
17240 3b 0a 20 20 20 20 6e 52 65 6d 20 2d 3d 20 6e 43  ;.    nRem -= nC
17250 68 75 6e 6b 3b 0a 20 20 20 20 66 74 73 35 44 61  hunk;.    fts5Da
17260 74 61 52 65 6c 65 61 73 65 28 70 44 61 74 61 29  taRelease(pData)
17270 3b 0a 20 20 20 20 69 66 28 20 6e 52 65 6d 3c 3d  ;.    if( nRem<=
17280 30 20 29 7b 0a 20 20 20 20 20 20 62 72 65 61 6b  0 ){.      break
17290 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
172a0 20 20 20 70 67 6e 6f 2b 2b 3b 0a 20 20 20 20 20     pgno++;.     
172b0 20 70 44 61 74 61 20 3d 20 66 74 73 35 44 61 74   pData = fts5Dat
172c0 61 52 65 61 64 28 70 2c 20 46 54 53 35 5f 53 45  aRead(p, FTS5_SE
172d0 47 4d 45 4e 54 5f 52 4f 57 49 44 28 70 53 65 67  GMENT_ROWID(pSeg
172e0 2d 3e 70 53 65 67 2d 3e 69 53 65 67 69 64 2c 20  ->pSeg->iSegid, 
172f0 70 67 6e 6f 29 29 3b 0a 20 20 20 20 20 20 69 66  pgno));.      if
17300 28 20 70 44 61 74 61 3d 3d 30 20 29 20 62 72 65  ( pData==0 ) bre
17310 61 6b 3b 0a 20 20 20 20 20 20 70 43 68 75 6e 6b  ak;.      pChunk
17320 20 3d 20 26 70 44 61 74 61 2d 3e 70 5b 34 5d 3b   = &pData->p[4];
17330 0a 20 20 20 20 20 20 6e 43 68 75 6e 6b 20 3d 20  .      nChunk = 
17340 4d 49 4e 28 6e 52 65 6d 2c 20 70 44 61 74 61 2d  MIN(nRem, pData-
17350 3e 73 7a 4c 65 61 66 20 2d 20 34 29 3b 0a 20 20  >szLeaf - 4);.  
17360 20 20 20 20 69 66 28 20 70 67 6e 6f 3d 3d 70 67      if( pgno==pg
17370 6e 6f 53 61 76 65 20 29 7b 0a 20 20 20 20 20 20  noSave ){.      
17380 20 20 61 73 73 65 72 74 28 20 70 53 65 67 2d 3e    assert( pSeg->
17390 70 4e 65 78 74 4c 65 61 66 3d 3d 30 20 29 3b 0a  pNextLeaf==0 );.
173a0 20 20 20 20 20 20 20 20 70 53 65 67 2d 3e 70 4e          pSeg->pN
173b0 65 78 74 4c 65 61 66 20 3d 20 70 44 61 74 61 3b  extLeaf = pData;
173c0 0a 20 20 20 20 20 20 20 20 70 44 61 74 61 20 3d  .        pData =
173d0 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   0;.      }.    
173e0 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  }.  }.}../*.** I
173f0 74 65 72 61 74 6f 72 20 70 49 74 65 72 20 63 75  terator pIter cu
17400 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 73 20 74  rrently points t
17410 6f 20 61 20 76 61 6c 69 64 20 65 6e 74 72 79 20  o a valid entry 
17420 28 6e 6f 74 20 45 4f 46 29 2e 20 54 68 69 73 0a  (not EOF). This.
17430 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 61 70 70 65  ** function appe
17440 6e 64 73 20 74 68 65 20 70 6f 73 69 74 69 6f 6e  nds the position
17450 20 6c 69 73 74 20 64 61 74 61 20 66 6f 72 20 74   list data for t
17460 68 65 20 63 75 72 72 65 6e 74 20 65 6e 74 72 79  he current entry
17470 20 74 6f 0a 2a 2a 20 62 75 66 66 65 72 20 70 42   to.** buffer pB
17480 75 66 2e 20 49 74 20 64 6f 65 73 20 6e 6f 74 20  uf. It does not 
17490 6d 61 6b 65 20 61 20 63 6f 70 79 20 6f 66 20 74  make a copy of t
174a0 68 65 20 70 6f 73 69 74 69 6f 6e 2d 6c 69 73 74  he position-list
174b0 20 73 69 7a 65 0a 2a 2a 20 66 69 65 6c 64 2e 0a   size.** field..
174c0 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
174d0 74 73 35 53 65 67 69 74 65 72 50 6f 73 6c 69 73  ts5SegiterPoslis
174e0 74 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a  t(.  Fts5Index *
174f0 70 2c 0a 20 20 46 74 73 35 53 65 67 49 74 65 72  p,.  Fts5SegIter
17500 20 2a 70 53 65 67 2c 0a 20 20 46 74 73 35 43 6f   *pSeg,.  Fts5Co
17510 6c 73 65 74 20 2a 70 43 6f 6c 73 65 74 2c 0a 20  lset *pColset,. 
17520 20 46 74 73 35 42 75 66 66 65 72 20 2a 70 42 75   Fts5Buffer *pBu
17530 66 0a 29 7b 0a 20 20 69 66 28 20 30 3d 3d 66 74  f.){.  if( 0==ft
17540 73 35 42 75 66 66 65 72 47 72 6f 77 28 26 70 2d  s5BufferGrow(&p-
17550 3e 72 63 2c 20 70 42 75 66 2c 20 70 53 65 67 2d  >rc, pBuf, pSeg-
17560 3e 6e 50 6f 73 29 20 29 7b 0a 20 20 20 20 69 66  >nPos) ){.    if
17570 28 20 70 43 6f 6c 73 65 74 3d 3d 30 20 29 7b 0a  ( pColset==0 ){.
17580 20 20 20 20 20 20 66 74 73 35 43 68 75 6e 6b 49        fts5ChunkI
17590 74 65 72 61 74 65 28 70 2c 20 70 53 65 67 2c 20  terate(p, pSeg, 
175a0 28 76 6f 69 64 2a 29 70 42 75 66 2c 20 66 74 73  (void*)pBuf, fts
175b0 35 50 6f 73 6c 69 73 74 43 61 6c 6c 62 61 63 6b  5PoslistCallback
175c0 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
175d0 20 20 20 20 69 66 28 20 70 2d 3e 70 43 6f 6e 66      if( p->pConf
175e0 69 67 2d 3e 65 44 65 74 61 69 6c 3d 3d 46 54 53  ig->eDetail==FTS
175f0 35 5f 44 45 54 41 49 4c 5f 46 55 4c 4c 20 29 7b  5_DETAIL_FULL ){
17600 0a 20 20 20 20 20 20 20 20 50 6f 73 6c 69 73 74  .        Poslist
17610 43 61 6c 6c 62 61 63 6b 43 74 78 20 73 43 74 78  CallbackCtx sCtx
17620 3b 0a 20 20 20 20 20 20 20 20 73 43 74 78 2e 70  ;.        sCtx.p
17630 42 75 66 20 3d 20 70 42 75 66 3b 0a 20 20 20 20  Buf = pBuf;.    
17640 20 20 20 20 73 43 74 78 2e 70 43 6f 6c 73 65 74      sCtx.pColset
17650 20 3d 20 70 43 6f 6c 73 65 74 3b 0a 20 20 20 20   = pColset;.    
17660 20 20 20 20 73 43 74 78 2e 65 53 74 61 74 65 20      sCtx.eState 
17670 3d 20 66 74 73 35 49 6e 64 65 78 43 6f 6c 73 65  = fts5IndexColse
17680 74 54 65 73 74 28 70 43 6f 6c 73 65 74 2c 20 30  tTest(pColset, 0
17690 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
176a0 74 28 20 73 43 74 78 2e 65 53 74 61 74 65 3d 3d  t( sCtx.eState==
176b0 30 20 7c 7c 20 73 43 74 78 2e 65 53 74 61 74 65  0 || sCtx.eState
176c0 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 20 20 66  ==1 );.        f
176d0 74 73 35 43 68 75 6e 6b 49 74 65 72 61 74 65 28  ts5ChunkIterate(
176e0 70 2c 20 70 53 65 67 2c 20 28 76 6f 69 64 2a 29  p, pSeg, (void*)
176f0 26 73 43 74 78 2c 20 66 74 73 35 50 6f 73 6c 69  &sCtx, fts5Posli
17700 73 74 46 69 6c 74 65 72 43 61 6c 6c 62 61 63 6b  stFilterCallback
17710 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
17720 20 20 20 20 20 20 20 20 50 6f 73 6c 69 73 74 4f          PoslistO
17730 66 66 73 65 74 73 43 74 78 20 73 43 74 78 3b 0a  ffsetsCtx sCtx;.
17740 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28 26          memset(&
17750 73 43 74 78 2c 20 30 2c 20 73 69 7a 65 6f 66 28  sCtx, 0, sizeof(
17760 73 43 74 78 29 29 3b 0a 20 20 20 20 20 20 20 20  sCtx));.        
17770 73 43 74 78 2e 70 42 75 66 20 3d 20 70 42 75 66  sCtx.pBuf = pBuf
17780 3b 0a 20 20 20 20 20 20 20 20 73 43 74 78 2e 70  ;.        sCtx.p
17790 43 6f 6c 73 65 74 20 3d 20 70 43 6f 6c 73 65 74  Colset = pColset
177a0 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35 43 68  ;.        fts5Ch
177b0 75 6e 6b 49 74 65 72 61 74 65 28 70 2c 20 70 53  unkIterate(p, pS
177c0 65 67 2c 20 28 76 6f 69 64 2a 29 26 73 43 74 78  eg, (void*)&sCtx
177d0 2c 20 66 74 73 35 50 6f 73 6c 69 73 74 4f 66 66  , fts5PoslistOff
177e0 73 65 74 73 43 61 6c 6c 62 61 63 6b 29 3b 0a 20  setsCallback);. 
177f0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
17800 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 4e 2f 4f 55 54  .}../*.** IN/OUT
17810 20 70 61 72 61 6d 65 74 65 72 20 28 2a 70 61 29   parameter (*pa)
17820 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 70 6f 73   points to a pos
17830 69 74 69 6f 6e 20 6c 69 73 74 20 6e 20 62 79 74  ition list n byt
17840 65 73 20 69 6e 20 73 69 7a 65 2e 20 49 66 0a 2a  es in size. If.*
17850 2a 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 20 6c  * the position l
17860 69 73 74 20 63 6f 6e 74 61 69 6e 73 20 65 6e 74  ist contains ent
17870 72 69 65 73 20 66 6f 72 20 63 6f 6c 75 6d 6e 20  ries for column 
17880 69 43 6f 6c 2c 20 74 68 65 6e 20 28 2a 70 61 29  iCol, then (*pa)
17890 20 69 73 20 73 65 74 0a 2a 2a 20 74 6f 20 70 6f   is set.** to po
178a0 69 6e 74 20 74 6f 20 74 68 65 20 73 75 62 2d 70  int to the sub-p
178b0 6f 73 69 74 69 6f 6e 2d 6c 69 73 74 20 66 6f 72  osition-list for
178c0 20 74 68 61 74 20 63 6f 6c 75 6d 6e 20 61 6e 64   that column and
178d0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a   the number of.*
178e0 2a 20 62 79 74 65 73 20 69 6e 20 69 74 20 72 65  * bytes in it re
178f0 74 75 72 6e 65 64 2e 20 4f 72 2c 20 69 66 20 74  turned. Or, if t
17900 68 65 20 61 72 67 75 6d 65 6e 74 20 70 6f 73 69  he argument posi
17910 74 69 6f 6e 20 6c 69 73 74 20 64 6f 65 73 20 6e  tion list does n
17920 6f 74 0a 2a 2a 20 63 6f 6e 74 61 69 6e 20 61 6e  ot.** contain an
17930 79 20 65 6e 74 72 69 65 73 20 66 6f 72 20 63 6f  y entries for co
17940 6c 75 6d 6e 20 69 43 6f 6c 2c 20 72 65 74 75 72  lumn iCol, retur
17950 6e 20 30 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  n 0..*/.static i
17960 6e 74 20 66 74 73 35 49 6e 64 65 78 45 78 74 72  nt fts5IndexExtr
17970 61 63 74 43 6f 6c 28 0a 20 20 63 6f 6e 73 74 20  actCol(.  const 
17980 75 38 20 2a 2a 70 61 2c 20 20 20 20 20 20 20 20  u8 **pa,        
17990 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f            /* IN/
179a0 4f 55 54 3a 20 50 6f 69 6e 74 65 72 20 74 6f 20  OUT: Pointer to 
179b0 70 6f 73 6c 69 73 74 20 2a 2f 0a 20 20 69 6e 74  poslist */.  int
179c0 20 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   n,             
179d0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
179e0 49 4e 3a 20 53 69 7a 65 20 6f 66 20 70 6f 73 6c  IN: Size of posl
179f0 69 73 74 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a  ist in bytes */.
17a00 20 20 69 6e 74 20 69 43 6f 6c 20 20 20 20 20 20    int iCol      
17a10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17a20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 74 6f 20 65    /* Column to e
17a30 78 74 72 61 63 74 20 66 72 6f 6d 20 70 6f 73 6c  xtract from posl
17a40 69 73 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ist */.){.  int 
17a50 69 43 75 72 72 65 6e 74 20 3d 20 30 3b 20 20 20  iCurrent = 0;   
17a60 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
17a70 6e 79 74 68 69 6e 67 20 62 65 66 6f 72 65 20 74  nything before t
17a80 68 65 20 66 69 72 73 74 20 30 78 30 31 20 69 73  he first 0x01 is
17a90 20 63 6f 6c 20 30 20 2a 2f 0a 20 20 63 6f 6e 73   col 0 */.  cons
17aa0 74 20 75 38 20 2a 70 20 3d 20 2a 70 61 3b 0a 20  t u8 *p = *pa;. 
17ab0 20 63 6f 6e 73 74 20 75 38 20 2a 70 45 6e 64 20   const u8 *pEnd 
17ac0 3d 20 26 70 5b 6e 5d 3b 20 20 20 20 20 20 20 20  = &p[n];        
17ad0 20 2f 2a 20 4f 6e 65 20 62 79 74 65 20 70 61 73   /* One byte pas
17ae0 74 20 65 6e 64 20 6f 66 20 70 6f 73 69 74 69 6f  t end of positio
17af0 6e 20 6c 69 73 74 20 2a 2f 0a 0a 20 20 77 68 69  n list */..  whi
17b00 6c 65 28 20 69 43 6f 6c 3e 69 43 75 72 72 65 6e  le( iCol>iCurren
17b10 74 20 29 7b 0a 20 20 20 20 2f 2a 20 41 64 76 61  t ){.    /* Adva
17b20 6e 63 65 20 70 6f 69 6e 74 65 72 20 70 20 75 6e  nce pointer p un
17b30 74 69 6c 20 69 74 20 70 6f 69 6e 74 73 20 74 6f  til it points to
17b40 20 70 45 6e 64 20 6f 72 20 61 6e 20 30 78 30 31   pEnd or an 0x01
17b50 20 62 79 74 65 20 74 68 61 74 20 69 73 0a 20 20   byte that is.  
17b60 20 20 2a 2a 20 6e 6f 74 20 70 61 72 74 20 6f 66    ** not part of
17b70 20 61 20 76 61 72 69 6e 74 2e 20 4e 6f 74 65 20   a varint. Note 
17b80 74 68 61 74 20 69 74 20 69 73 20 6e 6f 74 20 70  that it is not p
17b90 6f 73 73 69 62 6c 65 20 66 6f 72 20 61 20 6e 65  ossible for a ne
17ba0 67 61 74 69 76 65 0a 20 20 20 20 2a 2a 20 6f 72  gative.    ** or
17bb0 20 65 78 74 72 65 6d 65 6c 79 20 6c 61 72 67 65   extremely large
17bc0 20 76 61 72 69 6e 74 20 74 6f 20 6f 63 63 75 72   varint to occur
17bd0 20 77 69 74 68 69 6e 20 61 6e 20 75 6e 63 6f 72   within an uncor
17be0 72 75 70 74 65 64 20 70 6f 73 69 74 69 6f 6e 20  rupted position 
17bf0 0a 20 20 20 20 2a 2a 20 6c 69 73 74 2e 20 53 6f  .    ** list. So
17c00 20 74 68 65 20 6c 61 73 74 20 62 79 74 65 20 6f   the last byte o
17c10 66 20 65 61 63 68 20 76 61 72 69 6e 74 20 6d 61  f each varint ma
17c20 79 20 62 65 20 61 73 73 75 6d 65 64 20 74 6f 20  y be assumed to 
17c30 68 61 76 65 20 61 20 63 6c 65 61 72 0a 20 20 20  have a clear.   
17c40 20 2a 2a 20 30 78 38 30 20 62 69 74 2e 20 20 2a   ** 0x80 bit.  *
17c50 2f 0a 20 20 20 20 77 68 69 6c 65 28 20 2a 70 21  /.    while( *p!
17c60 3d 30 78 30 31 20 29 7b 0a 20 20 20 20 20 20 77  =0x01 ){.      w
17c70 68 69 6c 65 28 20 2a 70 2b 2b 20 26 20 30 78 38  hile( *p++ & 0x8
17c80 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  0 );.      if( p
17c90 3e 3d 70 45 6e 64 20 29 20 72 65 74 75 72 6e 20  >=pEnd ) return 
17ca0 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2a 70 61  0;.    }.    *pa
17cb0 20 3d 20 70 2b 2b 3b 0a 20 20 20 20 69 43 75 72   = p++;.    iCur
17cc0 72 65 6e 74 20 3d 20 2a 70 2b 2b 3b 0a 20 20 20  rent = *p++;.   
17cd0 20 69 66 28 20 69 43 75 72 72 65 6e 74 20 26 20   if( iCurrent & 
17ce0 30 78 38 30 20 29 7b 0a 20 20 20 20 20 20 70 2d  0x80 ){.      p-
17cf0 2d 3b 0a 20 20 20 20 20 20 70 20 2b 3d 20 66 74  -;.      p += ft
17d00 73 35 47 65 74 56 61 72 69 6e 74 33 32 28 70 2c  s5GetVarint32(p,
17d10 20 69 43 75 72 72 65 6e 74 29 3b 0a 20 20 20 20   iCurrent);.    
17d20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 69 43 6f 6c  }.  }.  if( iCol
17d30 21 3d 69 43 75 72 72 65 6e 74 20 29 20 72 65 74  !=iCurrent ) ret
17d40 75 72 6e 20 30 3b 0a 0a 20 20 2f 2a 20 41 64 76  urn 0;..  /* Adv
17d50 61 6e 63 65 20 70 6f 69 6e 74 65 72 20 70 20 75  ance pointer p u
17d60 6e 74 69 6c 20 69 74 20 70 6f 69 6e 74 73 20 74  ntil it points t
17d70 6f 20 70 45 6e 64 20 6f 72 20 61 6e 20 30 78 30  o pEnd or an 0x0
17d80 31 20 62 79 74 65 20 74 68 61 74 20 69 73 0a 20  1 byte that is. 
17d90 20 2a 2a 20 6e 6f 74 20 70 61 72 74 20 6f 66 20   ** not part of 
17da0 61 20 76 61 72 69 6e 74 20 2a 2f 0a 20 20 77 68  a varint */.  wh
17db0 69 6c 65 28 20 70 3c 70 45 6e 64 20 26 26 20 2a  ile( p<pEnd && *
17dc0 70 21 3d 30 78 30 31 20 29 7b 0a 20 20 20 20 77  p!=0x01 ){.    w
17dd0 68 69 6c 65 28 20 2a 70 2b 2b 20 26 20 30 78 38  hile( *p++ & 0x8
17de0 30 20 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75  0 );.  }..  retu
17df0 72 6e 20 70 20 2d 20 28 2a 70 61 29 3b 0a 7d 0a  rn p - (*pa);.}.
17e00 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 35  .static int fts5
17e10 49 6e 64 65 78 45 78 74 72 61 63 74 43 6f 6c 73  IndexExtractCols
17e20 65 74 20 28 0a 20 20 46 74 73 35 43 6f 6c 73 65  et (.  Fts5Colse
17e30 74 20 2a 70 43 6f 6c 73 65 74 2c 20 20 20 20 20  t *pColset,     
17e40 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 73 65 74         /* Colset
17e50 20 74 6f 20 66 69 6c 74 65 72 20 6f 6e 20 2a 2f   to filter on */
17e60 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 70 50 6f  .  const u8 *pPo
17e70 73 2c 20 69 6e 74 20 6e 50 6f 73 2c 20 20 20 20  s, int nPos,    
17e80 20 20 20 2f 2a 20 50 6f 73 69 74 69 6f 6e 20 6c     /* Position l
17e90 69 73 74 20 2a 2f 0a 20 20 46 74 73 35 42 75 66  ist */.  Fts5Buf
17ea0 66 65 72 20 2a 70 42 75 66 20 20 20 20 20 20 20  fer *pBuf       
17eb0 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 75 74 70           /* Outp
17ec0 75 74 20 62 75 66 66 65 72 20 2a 2f 0a 29 7b 0a  ut buffer */.){.
17ed0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
17ee0 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a  E_OK;.  int i;..
17ef0 20 20 66 74 73 35 42 75 66 66 65 72 5a 65 72 6f    fts5BufferZero
17f00 28 70 42 75 66 29 3b 0a 20 20 66 6f 72 28 69 3d  (pBuf);.  for(i=
17f10 30 3b 20 69 3c 70 43 6f 6c 73 65 74 2d 3e 6e 43  0; i<pColset->nC
17f20 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63 6f  ol; i++){.    co
17f30 6e 73 74 20 75 38 20 2a 70 53 75 62 20 3d 20 70  nst u8 *pSub = p
17f40 50 6f 73 3b 0a 20 20 20 20 69 6e 74 20 6e 53 75  Pos;.    int nSu
17f50 62 20 3d 20 66 74 73 35 49 6e 64 65 78 45 78 74  b = fts5IndexExt
17f60 72 61 63 74 43 6f 6c 28 26 70 53 75 62 2c 20 6e  ractCol(&pSub, n
17f70 50 6f 73 2c 20 70 43 6f 6c 73 65 74 2d 3e 61 69  Pos, pColset->ai
17f80 43 6f 6c 5b 69 5d 29 3b 0a 20 20 20 20 69 66 28  Col[i]);.    if(
17f90 20 6e 53 75 62 20 29 7b 0a 20 20 20 20 20 20 66   nSub ){.      f
17fa0 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 42  ts5BufferAppendB
17fb0 6c 6f 62 28 26 72 63 2c 20 70 42 75 66 2c 20 6e  lob(&rc, pBuf, n
17fc0 53 75 62 2c 20 70 53 75 62 29 3b 0a 20 20 20 20  Sub, pSub);.    
17fd0 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  }.  }.  return r
17fe0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 78 53 65 74  c;.}../*.** xSet
17ff0 4f 75 74 70 75 74 73 20 63 61 6c 6c 62 61 63 6b  Outputs callback
18000 20 75 73 65 64 20 62 79 20 64 65 74 61 69 6c 3d   used by detail=
18010 6e 6f 6e 65 20 74 61 62 6c 65 73 2e 0a 2a 2f 0a  none tables..*/.
18020 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
18030 49 74 65 72 53 65 74 4f 75 74 70 75 74 73 5f 4e  IterSetOutputs_N
18040 6f 6e 65 28 46 74 73 35 49 74 65 72 20 2a 70 49  one(Fts5Iter *pI
18050 74 65 72 2c 20 46 74 73 35 53 65 67 49 74 65 72  ter, Fts5SegIter
18060 20 2a 70 53 65 67 29 7b 0a 20 20 61 73 73 65 72   *pSeg){.  asser
18070 74 28 20 70 49 74 65 72 2d 3e 70 49 6e 64 65 78  t( pIter->pIndex
18080 2d 3e 70 43 6f 6e 66 69 67 2d 3e 65 44 65 74 61  ->pConfig->eDeta
18090 69 6c 3d 3d 46 54 53 35 5f 44 45 54 41 49 4c 5f  il==FTS5_DETAIL_
180a0 4e 4f 4e 45 20 29 3b 0a 20 20 70 49 74 65 72 2d  NONE );.  pIter-
180b0 3e 62 61 73 65 2e 69 52 6f 77 69 64 20 3d 20 70  >base.iRowid = p
180c0 53 65 67 2d 3e 69 52 6f 77 69 64 3b 0a 20 20 70  Seg->iRowid;.  p
180d0 49 74 65 72 2d 3e 62 61 73 65 2e 6e 44 61 74 61  Iter->base.nData
180e0 20 3d 20 70 53 65 67 2d 3e 6e 50 6f 73 3b 0a 7d   = pSeg->nPos;.}
180f0 0a 0a 2f 2a 0a 2a 2a 20 78 53 65 74 4f 75 74 70  ../*.** xSetOutp
18100 75 74 73 20 63 61 6c 6c 62 61 63 6b 20 75 73 65  uts callback use
18110 64 20 62 79 20 64 65 74 61 69 6c 3d 66 75 6c 6c  d by detail=full
18120 20 61 6e 64 20 64 65 74 61 69 6c 3d 63 6f 6c 20   and detail=col 
18130 74 61 62 6c 65 73 20 77 68 65 6e 20 6e 6f 0a 2a  tables when no.*
18140 2a 20 63 6f 6c 75 6d 6e 20 66 69 6c 74 65 72 73  * column filters
18150 20 61 72 65 20 73 70 65 63 69 66 69 65 64 2e 0a   are specified..
18160 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
18170 74 73 35 49 74 65 72 53 65 74 4f 75 74 70 75 74  ts5IterSetOutput
18180 73 5f 4e 6f 63 6f 6c 73 65 74 28 46 74 73 35 49  s_Nocolset(Fts5I
18190 74 65 72 20 2a 70 49 74 65 72 2c 20 46 74 73 35  ter *pIter, Fts5
181a0 53 65 67 49 74 65 72 20 2a 70 53 65 67 29 7b 0a  SegIter *pSeg){.
181b0 20 20 70 49 74 65 72 2d 3e 62 61 73 65 2e 69 52    pIter->base.iR
181c0 6f 77 69 64 20 3d 20 70 53 65 67 2d 3e 69 52 6f  owid = pSeg->iRo
181d0 77 69 64 3b 0a 20 20 70 49 74 65 72 2d 3e 62 61  wid;.  pIter->ba
181e0 73 65 2e 6e 44 61 74 61 20 3d 20 70 53 65 67 2d  se.nData = pSeg-
181f0 3e 6e 50 6f 73 3b 0a 0a 20 20 61 73 73 65 72 74  >nPos;..  assert
18200 28 20 70 49 74 65 72 2d 3e 70 49 6e 64 65 78 2d  ( pIter->pIndex-
18210 3e 70 43 6f 6e 66 69 67 2d 3e 65 44 65 74 61 69  >pConfig->eDetai
18220 6c 21 3d 46 54 53 35 5f 44 45 54 41 49 4c 5f 4e  l!=FTS5_DETAIL_N
18230 4f 4e 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ONE );.  assert(
18240 20 70 49 74 65 72 2d 3e 70 43 6f 6c 73 65 74 3d   pIter->pColset=
18250 3d 30 20 29 3b 0a 0a 20 20 69 66 28 20 70 53 65  =0 );..  if( pSe
18260 67 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 2b 70  g->iLeafOffset+p
18270 53 65 67 2d 3e 6e 50 6f 73 3c 3d 70 53 65 67 2d  Seg->nPos<=pSeg-
18280 3e 70 4c 65 61 66 2d 3e 73 7a 4c 65 61 66 20 29  >pLeaf->szLeaf )
18290 7b 0a 20 20 20 20 2f 2a 20 41 6c 6c 20 64 61 74  {.    /* All dat
182a0 61 20 69 73 20 73 74 6f 72 65 64 20 6f 6e 20 74  a is stored on t
182b0 68 65 20 63 75 72 72 65 6e 74 20 70 61 67 65 2e  he current page.
182c0 20 50 6f 70 75 6c 61 74 65 20 74 68 65 20 6f 75   Populate the ou
182d0 74 70 75 74 20 0a 20 20 20 20 2a 2a 20 76 61 72  tput .    ** var
182e0 69 61 62 6c 65 73 20 74 6f 20 70 6f 69 6e 74 20  iables to point 
182f0 69 6e 74 6f 20 74 68 65 20 62 6f 64 79 20 6f 66  into the body of
18300 20 74 68 65 20 70 61 67 65 20 6f 62 6a 65 63 74   the page object
18310 2e 20 2a 2f 0a 20 20 20 20 70 49 74 65 72 2d 3e  . */.    pIter->
18320 62 61 73 65 2e 70 44 61 74 61 20 3d 20 26 70 53  base.pData = &pS
18330 65 67 2d 3e 70 4c 65 61 66 2d 3e 70 5b 70 53 65  eg->pLeaf->p[pSe
18340 67 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 5d 3b  g->iLeafOffset];
18350 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
18360 20 54 68 65 20 64 61 74 61 20 69 73 20 64 69 73   The data is dis
18370 74 72 69 62 75 74 65 64 20 6f 76 65 72 20 74 77  tributed over tw
18380 6f 20 6f 72 20 6d 6f 72 65 20 70 61 67 65 73 2e  o or more pages.
18390 20 43 6f 70 79 20 69 74 20 69 6e 74 6f 20 74 68   Copy it into th
183a0 65 0a 20 20 20 20 2a 2a 20 46 74 73 35 49 74 65  e.    ** Fts5Ite
183b0 72 2e 70 6f 73 6c 69 73 74 20 62 75 66 66 65 72  r.poslist buffer
183c0 20 61 6e 64 20 74 68 65 6e 20 73 65 74 20 74 68   and then set th
183d0 65 20 6f 75 74 70 75 74 20 70 6f 69 6e 74 65 72  e output pointer
183e0 20 74 6f 20 70 6f 69 6e 74 0a 20 20 20 20 2a 2a   to point.    **
183f0 20 74 6f 20 74 68 69 73 20 62 75 66 66 65 72 2e   to this buffer.
18400 20 20 2a 2f 0a 20 20 20 20 66 74 73 35 42 75 66    */.    fts5Buf
18410 66 65 72 5a 65 72 6f 28 26 70 49 74 65 72 2d 3e  ferZero(&pIter->
18420 70 6f 73 6c 69 73 74 29 3b 0a 20 20 20 20 66 74  poslist);.    ft
18430 73 35 53 65 67 69 74 65 72 50 6f 73 6c 69 73 74  s5SegiterPoslist
18440 28 70 49 74 65 72 2d 3e 70 49 6e 64 65 78 2c 20  (pIter->pIndex, 
18450 70 53 65 67 2c 20 30 2c 20 26 70 49 74 65 72 2d  pSeg, 0, &pIter-
18460 3e 70 6f 73 6c 69 73 74 29 3b 0a 20 20 20 20 70  >poslist);.    p
18470 49 74 65 72 2d 3e 62 61 73 65 2e 70 44 61 74 61  Iter->base.pData
18480 20 3d 20 70 49 74 65 72 2d 3e 70 6f 73 6c 69 73   = pIter->poslis
18490 74 2e 70 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  t.p;.  }.}../*.*
184a0 2a 20 78 53 65 74 4f 75 74 70 75 74 73 20 63 61  * xSetOutputs ca
184b0 6c 6c 62 61 63 6b 20 75 73 65 64 20 62 79 20 64  llback used by d
184c0 65 74 61 69 6c 3d 63 6f 6c 20 77 68 65 6e 20 74  etail=col when t
184d0 68 65 72 65 20 69 73 20 61 20 63 6f 6c 75 6d 6e  here is a column
184e0 20 66 69 6c 74 65 72 0a 2a 2a 20 61 6e 64 20 74   filter.** and t
184f0 68 65 72 65 20 61 72 65 20 31 30 30 20 6f 72 20  here are 100 or 
18500 6d 6f 72 65 20 63 6f 6c 75 6d 6e 73 2e 20 41 6c  more columns. Al
18510 73 6f 20 63 61 6c 6c 65 64 20 61 73 20 61 20 66  so called as a f
18520 61 6c 6c 62 61 63 6b 20 66 72 6f 6d 0a 2a 2a 20  allback from.** 
18530 66 74 73 35 49 74 65 72 53 65 74 4f 75 74 70 75  fts5IterSetOutpu
18540 74 73 5f 43 6f 6c 31 30 30 20 69 66 20 74 68 65  ts_Col100 if the
18550 20 63 6f 6c 75 6d 6e 2d 6c 69 73 74 20 73 70 61   column-list spa
18560 6e 73 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65  ns more than one
18570 20 70 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   page..*/.static
18580 20 76 6f 69 64 20 66 74 73 35 49 74 65 72 53 65   void fts5IterSe
18590 74 4f 75 74 70 75 74 73 5f 43 6f 6c 28 46 74 73  tOutputs_Col(Fts
185a0 35 49 74 65 72 20 2a 70 49 74 65 72 2c 20 46 74  5Iter *pIter, Ft
185b0 73 35 53 65 67 49 74 65 72 20 2a 70 53 65 67 29  s5SegIter *pSeg)
185c0 7b 0a 20 20 66 74 73 35 42 75 66 66 65 72 5a 65  {.  fts5BufferZe
185d0 72 6f 28 26 70 49 74 65 72 2d 3e 70 6f 73 6c 69  ro(&pIter->posli
185e0 73 74 29 3b 0a 20 20 66 74 73 35 53 65 67 69 74  st);.  fts5Segit
185f0 65 72 50 6f 73 6c 69 73 74 28 70 49 74 65 72 2d  erPoslist(pIter-
18600 3e 70 49 6e 64 65 78 2c 20 70 53 65 67 2c 20 70  >pIndex, pSeg, p
18610 49 74 65 72 2d 3e 70 43 6f 6c 73 65 74 2c 20 26  Iter->pColset, &
18620 70 49 74 65 72 2d 3e 70 6f 73 6c 69 73 74 29 3b  pIter->poslist);
18630 0a 20 20 70 49 74 65 72 2d 3e 62 61 73 65 2e 69  .  pIter->base.i
18640 52 6f 77 69 64 20 3d 20 70 53 65 67 2d 3e 69 52  Rowid = pSeg->iR
18650 6f 77 69 64 3b 0a 20 20 70 49 74 65 72 2d 3e 62  owid;.  pIter->b
18660 61 73 65 2e 70 44 61 74 61 20 3d 20 70 49 74 65  ase.pData = pIte
18670 72 2d 3e 70 6f 73 6c 69 73 74 2e 70 3b 0a 20 20  r->poslist.p;.  
18680 70 49 74 65 72 2d 3e 62 61 73 65 2e 6e 44 61 74  pIter->base.nDat
18690 61 20 3d 20 70 49 74 65 72 2d 3e 70 6f 73 6c 69  a = pIter->posli
186a0 73 74 2e 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 78  st.n;.}../*.** x
186b0 53 65 74 4f 75 74 70 75 74 73 20 63 61 6c 6c 62  SetOutputs callb
186c0 61 63 6b 20 75 73 65 64 20 77 68 65 6e 3a 20 0a  ack used when: .
186d0 2a 2a 0a 2a 2a 20 20 20 2a 20 64 65 74 61 69 6c  **.**   * detail
186e0 3d 63 6f 6c 2c 0a 2a 2a 20 20 20 2a 20 74 68 65  =col,.**   * the
186f0 72 65 20 69 73 20 61 20 63 6f 6c 75 6d 6e 20 66  re is a column f
18700 69 6c 74 65 72 2c 20 61 6e 64 0a 2a 2a 20 20 20  ilter, and.**   
18710 2a 20 74 68 65 20 74 61 62 6c 65 20 63 6f 6e 74  * the table cont
18720 61 69 6e 73 20 31 30 30 20 6f 72 20 66 65 77 65  ains 100 or fewe
18730 72 20 63 6f 6c 75 6d 6e 73 2e 20 0a 2a 2a 0a 2a  r columns. .**.*
18740 2a 20 54 68 65 20 6c 61 73 74 20 70 6f 69 6e 74  * The last point
18750 20 69 73 20 74 6f 20 65 6e 73 75 72 65 20 61 6c   is to ensure al
18760 6c 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 73  l column numbers
18770 20 61 72 65 20 73 74 6f 72 65 64 20 61 73 20 0a   are stored as .
18780 2a 2a 20 73 69 6e 67 6c 65 2d 62 79 74 65 20 76  ** single-byte v
18790 61 72 69 6e 74 73 2e 0a 2a 2f 0a 73 74 61 74 69  arints..*/.stati
187a0 63 20 76 6f 69 64 20 66 74 73 35 49 74 65 72 53  c void fts5IterS
187b0 65 74 4f 75 74 70 75 74 73 5f 43 6f 6c 31 30 30  etOutputs_Col100
187c0 28 46 74 73 35 49 74 65 72 20 2a 70 49 74 65 72  (Fts5Iter *pIter
187d0 2c 20 46 74 73 35 53 65 67 49 74 65 72 20 2a 70  , Fts5SegIter *p
187e0 53 65 67 29 7b 0a 0a 20 20 61 73 73 65 72 74 28  Seg){..  assert(
187f0 20 70 49 74 65 72 2d 3e 70 49 6e 64 65 78 2d 3e   pIter->pIndex->
18800 70 43 6f 6e 66 69 67 2d 3e 65 44 65 74 61 69 6c  pConfig->eDetail
18810 3d 3d 46 54 53 35 5f 44 45 54 41 49 4c 5f 43 4f  ==FTS5_DETAIL_CO
18820 4c 55 4d 4e 53 20 29 3b 0a 20 20 61 73 73 65 72  LUMNS );.  asser
18830 74 28 20 70 49 74 65 72 2d 3e 70 43 6f 6c 73 65  t( pIter->pColse
18840 74 20 29 3b 0a 0a 20 20 69 66 28 20 70 53 65 67  t );..  if( pSeg
18850 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 2b 70 53  ->iLeafOffset+pS
18860 65 67 2d 3e 6e 50 6f 73 3e 70 53 65 67 2d 3e 70  eg->nPos>pSeg->p
18870 4c 65 61 66 2d 3e 73 7a 4c 65 61 66 20 29 7b 0a  Leaf->szLeaf ){.
18880 20 20 20 20 66 74 73 35 49 74 65 72 53 65 74 4f      fts5IterSetO
18890 75 74 70 75 74 73 5f 43 6f 6c 28 70 49 74 65 72  utputs_Col(pIter
188a0 2c 20 70 53 65 67 29 3b 0a 20 20 7d 65 6c 73 65  , pSeg);.  }else
188b0 7b 0a 20 20 20 20 75 38 20 2a 61 20 3d 20 28 75  {.    u8 *a = (u
188c0 38 2a 29 26 70 53 65 67 2d 3e 70 4c 65 61 66 2d  8*)&pSeg->pLeaf-
188d0 3e 70 5b 70 53 65 67 2d 3e 69 4c 65 61 66 4f 66  >p[pSeg->iLeafOf
188e0 66 73 65 74 5d 3b 0a 20 20 20 20 75 38 20 2a 70  fset];.    u8 *p
188f0 45 6e 64 20 3d 20 28 75 38 2a 29 26 61 5b 70 53  End = (u8*)&a[pS
18900 65 67 2d 3e 6e 50 6f 73 5d 3b 20 0a 20 20 20 20  eg->nPos]; .    
18910 69 6e 74 20 69 50 72 65 76 20 3d 20 30 3b 0a 20  int iPrev = 0;. 
18920 20 20 20 69 6e 74 20 2a 61 69 43 6f 6c 20 3d 20     int *aiCol = 
18930 70 49 74 65 72 2d 3e 70 43 6f 6c 73 65 74 2d 3e  pIter->pColset->
18940 61 69 43 6f 6c 3b 0a 20 20 20 20 69 6e 74 20 2a  aiCol;.    int *
18950 61 69 43 6f 6c 45 6e 64 20 3d 20 26 61 69 43 6f  aiColEnd = &aiCo
18960 6c 5b 70 49 74 65 72 2d 3e 70 43 6f 6c 73 65 74  l[pIter->pColset
18970 2d 3e 6e 43 6f 6c 5d 3b 0a 0a 20 20 20 20 75 38  ->nCol];..    u8
18980 20 2a 61 4f 75 74 20 3d 20 70 49 74 65 72 2d 3e   *aOut = pIter->
18990 70 6f 73 6c 69 73 74 2e 70 3b 0a 20 20 20 20 69  poslist.p;.    i
189a0 6e 74 20 69 50 72 65 76 4f 75 74 20 3d 20 30 3b  nt iPrevOut = 0;
189b0 0a 0a 20 20 20 20 70 49 74 65 72 2d 3e 62 61 73  ..    pIter->bas
189c0 65 2e 69 52 6f 77 69 64 20 3d 20 70 53 65 67 2d  e.iRowid = pSeg-
189d0 3e 69 52 6f 77 69 64 3b 0a 0a 20 20 20 20 77 68  >iRowid;..    wh
189e0 69 6c 65 28 20 61 3c 70 45 6e 64 20 29 7b 0a 20  ile( a<pEnd ){. 
189f0 20 20 20 20 20 69 50 72 65 76 20 2b 3d 20 28 69       iPrev += (i
18a00 6e 74 29 61 2b 2b 5b 30 5d 20 2d 20 32 3b 0a 20  nt)a++[0] - 2;. 
18a10 20 20 20 20 20 77 68 69 6c 65 28 20 2a 61 69 43       while( *aiC
18a20 6f 6c 3c 69 50 72 65 76 20 29 7b 0a 20 20 20 20  ol<iPrev ){.    
18a30 20 20 20 20 61 69 43 6f 6c 2b 2b 3b 0a 20 20 20      aiCol++;.   
18a40 20 20 20 20 20 69 66 28 20 61 69 43 6f 6c 3d 3d       if( aiCol==
18a50 61 69 43 6f 6c 45 6e 64 20 29 20 67 6f 74 6f 20  aiColEnd ) goto 
18a60 73 65 74 6f 75 74 70 75 74 73 5f 63 6f 6c 5f 6f  setoutputs_col_o
18a70 75 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ut;.      }.    
18a80 20 20 69 66 28 20 2a 61 69 43 6f 6c 3d 3d 69 50    if( *aiCol==iP
18a90 72 65 76 20 29 7b 0a 20 20 20 20 20 20 20 20 2a  rev ){.        *
18aa0 61 4f 75 74 2b 2b 20 3d 20 28 75 38 29 28 28 69  aOut++ = (u8)((i
18ab0 50 72 65 76 20 2d 20 69 50 72 65 76 4f 75 74 29  Prev - iPrevOut)
18ac0 20 2b 20 32 29 3b 0a 20 20 20 20 20 20 20 20 69   + 2);.        i
18ad0 50 72 65 76 4f 75 74 20 3d 20 69 50 72 65 76 3b  PrevOut = iPrev;
18ae0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
18af0 73 65 74 6f 75 74 70 75 74 73 5f 63 6f 6c 5f 6f  setoutputs_col_o
18b00 75 74 3a 0a 20 20 20 20 70 49 74 65 72 2d 3e 62  ut:.    pIter->b
18b10 61 73 65 2e 70 44 61 74 61 20 3d 20 70 49 74 65  ase.pData = pIte
18b20 72 2d 3e 70 6f 73 6c 69 73 74 2e 70 3b 0a 20 20  r->poslist.p;.  
18b30 20 20 70 49 74 65 72 2d 3e 62 61 73 65 2e 6e 44    pIter->base.nD
18b40 61 74 61 20 3d 20 61 4f 75 74 20 2d 20 70 49 74  ata = aOut - pIt
18b50 65 72 2d 3e 70 6f 73 6c 69 73 74 2e 70 3b 0a 20  er->poslist.p;. 
18b60 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 78 53 65 74   }.}../*.** xSet
18b70 4f 75 74 70 75 74 73 20 63 61 6c 6c 62 61 63 6b  Outputs callback
18b80 20 75 73 65 64 20 62 79 20 64 65 74 61 69 6c 3d   used by detail=
18b90 66 75 6c 6c 20 77 68 65 6e 20 74 68 65 72 65 20  full when there 
18ba0 69 73 20 61 20 63 6f 6c 75 6d 6e 20 66 69 6c 74  is a column filt
18bb0 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  er..*/.static vo
18bc0 69 64 20 66 74 73 35 49 74 65 72 53 65 74 4f 75  id fts5IterSetOu
18bd0 74 70 75 74 73 5f 46 75 6c 6c 28 46 74 73 35 49  tputs_Full(Fts5I
18be0 74 65 72 20 2a 70 49 74 65 72 2c 20 46 74 73 35  ter *pIter, Fts5
18bf0 53 65 67 49 74 65 72 20 2a 70 53 65 67 29 7b 0a  SegIter *pSeg){.
18c00 20 20 46 74 73 35 43 6f 6c 73 65 74 20 2a 70 43    Fts5Colset *pC
18c10 6f 6c 73 65 74 20 3d 20 70 49 74 65 72 2d 3e 70  olset = pIter->p
18c20 43 6f 6c 73 65 74 3b 0a 20 20 70 49 74 65 72 2d  Colset;.  pIter-
18c30 3e 62 61 73 65 2e 69 52 6f 77 69 64 20 3d 20 70  >base.iRowid = p
18c40 53 65 67 2d 3e 69 52 6f 77 69 64 3b 0a 0a 20 20  Seg->iRowid;..  
18c50 61 73 73 65 72 74 28 20 70 49 74 65 72 2d 3e 70  assert( pIter->p
18c60 49 6e 64 65 78 2d 3e 70 43 6f 6e 66 69 67 2d 3e  Index->pConfig->
18c70 65 44 65 74 61 69 6c 3d 3d 46 54 53 35 5f 44 45  eDetail==FTS5_DE
18c80 54 41 49 4c 5f 46 55 4c 4c 20 29 3b 0a 20 20 61  TAIL_FULL );.  a
18c90 73 73 65 72 74 28 20 70 43 6f 6c 73 65 74 20 29  ssert( pColset )
18ca0 3b 0a 0a 20 20 69 66 28 20 70 53 65 67 2d 3e 69  ;..  if( pSeg->i
18cb0 4c 65 61 66 4f 66 66 73 65 74 2b 70 53 65 67 2d  LeafOffset+pSeg-
18cc0 3e 6e 50 6f 73 3c 3d 70 53 65 67 2d 3e 70 4c 65  >nPos<=pSeg->pLe
18cd0 61 66 2d 3e 73 7a 4c 65 61 66 20 29 7b 0a 20 20  af->szLeaf ){.  
18ce0 20 20 2f 2a 20 41 6c 6c 20 64 61 74 61 20 69 73    /* All data is
18cf0 20 73 74 6f 72 65 64 20 6f 6e 20 74 68 65 20 63   stored on the c
18d00 75 72 72 65 6e 74 20 70 61 67 65 2e 20 50 6f 70  urrent page. Pop
18d10 75 6c 61 74 65 20 74 68 65 20 6f 75 74 70 75 74  ulate the output
18d20 20 0a 20 20 20 20 2a 2a 20 76 61 72 69 61 62 6c   .    ** variabl
18d30 65 73 20 74 6f 20 70 6f 69 6e 74 20 69 6e 74 6f  es to point into
18d40 20 74 68 65 20 62 6f 64 79 20 6f 66 20 74 68 65   the body of the
18d50 20 70 61 67 65 20 6f 62 6a 65 63 74 2e 20 2a 2f   page object. */
18d60 0a 20 20 20 20 63 6f 6e 73 74 20 75 38 20 2a 61  .    const u8 *a
18d70 20 3d 20 26 70 53 65 67 2d 3e 70 4c 65 61 66 2d   = &pSeg->pLeaf-
18d80 3e 70 5b 70 53 65 67 2d 3e 69 4c 65 61 66 4f 66  >p[pSeg->iLeafOf
18d90 66 73 65 74 5d 3b 0a 20 20 20 20 69 66 28 20 70  fset];.    if( p
18da0 43 6f 6c 73 65 74 2d 3e 6e 43 6f 6c 3d 3d 31 20  Colset->nCol==1 
18db0 29 7b 0a 20 20 20 20 20 20 70 49 74 65 72 2d 3e  ){.      pIter->
18dc0 62 61 73 65 2e 6e 44 61 74 61 20 3d 20 66 74 73  base.nData = fts
18dd0 35 49 6e 64 65 78 45 78 74 72 61 63 74 43 6f 6c  5IndexExtractCol
18de0 28 26 61 2c 20 70 53 65 67 2d 3e 6e 50 6f 73 2c  (&a, pSeg->nPos,
18df0 70 43 6f 6c 73 65 74 2d 3e 61 69 43 6f 6c 5b 30  pColset->aiCol[0
18e00 5d 29 3b 0a 20 20 20 20 20 20 70 49 74 65 72 2d  ]);.      pIter-
18e10 3e 62 61 73 65 2e 70 44 61 74 61 20 3d 20 61 3b  >base.pData = a;
18e20 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
18e30 20 20 66 74 73 35 42 75 66 66 65 72 5a 65 72 6f    fts5BufferZero
18e40 28 26 70 49 74 65 72 2d 3e 70 6f 73 6c 69 73 74  (&pIter->poslist
18e50 29 3b 0a 20 20 20 20 20 20 66 74 73 35 49 6e 64  );.      fts5Ind
18e60 65 78 45 78 74 72 61 63 74 43 6f 6c 73 65 74 28  exExtractColset(
18e70 70 43 6f 6c 73 65 74 2c 20 61 2c 20 70 53 65 67  pColset, a, pSeg
18e80 2d 3e 6e 50 6f 73 2c 20 26 70 49 74 65 72 2d 3e  ->nPos, &pIter->
18e90 70 6f 73 6c 69 73 74 29 3b 0a 20 20 20 20 20 20  poslist);.      
18ea0 70 49 74 65 72 2d 3e 62 61 73 65 2e 70 44 61 74  pIter->base.pDat
18eb0 61 20 3d 20 70 49 74 65 72 2d 3e 70 6f 73 6c 69  a = pIter->posli
18ec0 73 74 2e 70 3b 0a 20 20 20 20 20 20 70 49 74 65  st.p;.      pIte
18ed0 72 2d 3e 62 61 73 65 2e 6e 44 61 74 61 20 3d 20  r->base.nData = 
18ee0 70 49 74 65 72 2d 3e 70 6f 73 6c 69 73 74 2e 6e  pIter->poslist.n
18ef0 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b  ;.    }.  }else{
18f00 0a 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61  .    /* The data
18f10 20 69 73 20 64 69 73 74 72 69 62 75 74 65 64 20   is distributed 
18f20 6f 76 65 72 20 74 77 6f 20 6f 72 20 6d 6f 72 65  over two or more
18f30 20 70 61 67 65 73 2e 20 43 6f 70 79 20 69 74 20   pages. Copy it 
18f40 69 6e 74 6f 20 74 68 65 0a 20 20 20 20 2a 2a 20  into the.    ** 
18f50 46 74 73 35 49 74 65 72 2e 70 6f 73 6c 69 73 74  Fts5Iter.poslist
18f60 20 62 75 66 66 65 72 20 61 6e 64 20 74 68 65 6e   buffer and then
18f70 20 73 65 74 20 74 68 65 20 6f 75 74 70 75 74 20   set the output 
18f80 70 6f 69 6e 74 65 72 20 74 6f 20 70 6f 69 6e 74  pointer to point
18f90 0a 20 20 20 20 2a 2a 20 74 6f 20 74 68 69 73 20  .    ** to this 
18fa0 62 75 66 66 65 72 2e 20 20 2a 2f 0a 20 20 20 20  buffer.  */.    
18fb0 66 74 73 35 42 75 66 66 65 72 5a 65 72 6f 28 26  fts5BufferZero(&
18fc0 70 49 74 65 72 2d 3e 70 6f 73 6c 69 73 74 29 3b  pIter->poslist);
18fd0 0a 20 20 20 20 66 74 73 35 53 65 67 69 74 65 72  .    fts5Segiter
18fe0 50 6f 73 6c 69 73 74 28 70 49 74 65 72 2d 3e 70  Poslist(pIter->p
18ff0 49 6e 64 65 78 2c 20 70 53 65 67 2c 20 70 43 6f  Index, pSeg, pCo
19000 6c 73 65 74 2c 20 26 70 49 74 65 72 2d 3e 70 6f  lset, &pIter->po
19010 73 6c 69 73 74 29 3b 0a 20 20 20 20 70 49 74 65  slist);.    pIte
19020 72 2d 3e 62 61 73 65 2e 70 44 61 74 61 20 3d 20  r->base.pData = 
19030 70 49 74 65 72 2d 3e 70 6f 73 6c 69 73 74 2e 70  pIter->poslist.p
19040 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 62 61 73  ;.    pIter->bas
19050 65 2e 6e 44 61 74 61 20 3d 20 70 49 74 65 72 2d  e.nData = pIter-
19060 3e 70 6f 73 6c 69 73 74 2e 6e 3b 0a 20 20 7d 0a  >poslist.n;.  }.
19070 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  }..static void f
19080 74 73 35 49 74 65 72 53 65 74 4f 75 74 70 75 74  ts5IterSetOutput
19090 43 62 28 69 6e 74 20 2a 70 52 63 2c 20 46 74 73  Cb(int *pRc, Fts
190a0 35 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a 20  5Iter *pIter){. 
190b0 20 69 66 28 20 2a 70 52 63 3d 3d 53 51 4c 49 54   if( *pRc==SQLIT
190c0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 46 74 73 35  E_OK ){.    Fts5
190d0 43 6f 6e 66 69 67 20 2a 70 43 6f 6e 66 69 67 20  Config *pConfig 
190e0 3d 20 70 49 74 65 72 2d 3e 70 49 6e 64 65 78 2d  = pIter->pIndex-
190f0 3e 70 43 6f 6e 66 69 67 3b 0a 20 20 20 20 69 66  >pConfig;.    if
19100 28 20 70 43 6f 6e 66 69 67 2d 3e 65 44 65 74 61  ( pConfig->eDeta
19110 69 6c 3d 3d 46 54 53 35 5f 44 45 54 41 49 4c 5f  il==FTS5_DETAIL_
19120 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 70 49  NONE ){.      pI
19130 74 65 72 2d 3e 78 53 65 74 4f 75 74 70 75 74 73  ter->xSetOutputs
19140 20 3d 20 66 74 73 35 49 74 65 72 53 65 74 4f 75   = fts5IterSetOu
19150 74 70 75 74 73 5f 4e 6f 6e 65 3b 0a 20 20 20 20  tputs_None;.    
19160 7d 0a 0a 20 20 20 20 65 6c 73 65 20 69 66 28 20  }..    else if( 
19170 70 49 74 65 72 2d 3e 70 43 6f 6c 73 65 74 3d 3d  pIter->pColset==
19180 30 20 29 7b 0a 20 20 20 20 20 20 70 49 74 65 72  0 ){.      pIter
19190 2d 3e 78 53 65 74 4f 75 74 70 75 74 73 20 3d 20  ->xSetOutputs = 
191a0 66 74 73 35 49 74 65 72 53 65 74 4f 75 74 70 75  fts5IterSetOutpu
191b0 74 73 5f 4e 6f 63 6f 6c 73 65 74 3b 0a 20 20 20  ts_Nocolset;.   
191c0 20 7d 0a 0a 20 20 20 20 65 6c 73 65 20 69 66 28   }..    else if(
191d0 20 70 43 6f 6e 66 69 67 2d 3e 65 44 65 74 61 69   pConfig->eDetai
191e0 6c 3d 3d 46 54 53 35 5f 44 45 54 41 49 4c 5f 46  l==FTS5_DETAIL_F
191f0 55 4c 4c 20 29 7b 0a 20 20 20 20 20 20 70 49 74  ULL ){.      pIt
19200 65 72 2d 3e 78 53 65 74 4f 75 74 70 75 74 73 20  er->xSetOutputs 
19210 3d 20 66 74 73 35 49 74 65 72 53 65 74 4f 75 74  = fts5IterSetOut
19220 70 75 74 73 5f 46 75 6c 6c 3b 0a 20 20 20 20 7d  puts_Full;.    }
19230 0a 0a 20 20 20 20 65 6c 73 65 7b 0a 20 20 20 20  ..    else{.    
19240 20 20 61 73 73 65 72 74 28 20 70 43 6f 6e 66 69    assert( pConfi
19250 67 2d 3e 65 44 65 74 61 69 6c 3d 3d 46 54 53 35  g->eDetail==FTS5
19260 5f 44 45 54 41 49 4c 5f 43 4f 4c 55 4d 4e 53 20  _DETAIL_COLUMNS 
19270 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 43 6f  );.      if( pCo
19280 6e 66 69 67 2d 3e 6e 43 6f 6c 3c 3d 31 30 30 20  nfig->nCol<=100 
19290 29 7b 0a 20 20 20 20 20 20 20 20 70 49 74 65 72  ){.        pIter
192a0 2d 3e 78 53 65 74 4f 75 74 70 75 74 73 20 3d 20  ->xSetOutputs = 
192b0 66 74 73 35 49 74 65 72 53 65 74 4f 75 74 70 75  fts5IterSetOutpu
192c0 74 73 5f 43 6f 6c 31 30 30 3b 0a 20 20 20 20 20  ts_Col100;.     
192d0 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 42 75     sqlite3Fts5Bu
192e0 66 66 65 72 53 69 7a 65 28 70 52 63 2c 20 26 70  fferSize(pRc, &p
192f0 49 74 65 72 2d 3e 70 6f 73 6c 69 73 74 2c 20 70  Iter->poslist, p
19300 43 6f 6e 66 69 67 2d 3e 6e 43 6f 6c 29 3b 0a 20  Config->nCol);. 
19310 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
19320 20 20 20 20 70 49 74 65 72 2d 3e 78 53 65 74 4f      pIter->xSetO
19330 75 74 70 75 74 73 20 3d 20 66 74 73 35 49 74 65  utputs = fts5Ite
19340 72 53 65 74 4f 75 74 70 75 74 73 5f 43 6f 6c 3b  rSetOutputs_Col;
19350 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
19360 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c   }.}.../*.** All
19370 6f 63 61 74 65 20 61 20 6e 65 77 20 46 74 73 35  ocate a new Fts5
19380 49 74 65 72 20 6f 62 6a 65 63 74 2e 0a 2a 2a 0a  Iter object..**.
19390 2a 2a 20 54 68 65 20 6e 65 77 20 6f 62 6a 65 63  ** The new objec
193a0 74 20 77 69 6c 6c 20 62 65 20 75 73 65 64 20 74  t will be used t
193b0 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f 75 67  o iterate throug
193c0 68 20 64 61 74 61 20 69 6e 20 73 74 72 75 63 74  h data in struct
193d0 75 72 65 20 70 53 74 72 75 63 74 2e 0a 2a 2a 20  ure pStruct..** 
193e0 49 66 20 69 4c 65 76 65 6c 20 69 73 20 2d 76 65  If iLevel is -ve
193f0 2c 20 74 68 65 6e 20 61 6c 6c 20 64 61 74 61 20  , then all data 
19400 69 6e 20 61 6c 6c 20 73 65 67 6d 65 6e 74 73 20  in all segments 
19410 69 73 20 6d 65 72 67 65 64 2e 20 4f 72 2c 20 69  is merged. Or, i
19420 66 20 69 4c 65 76 65 6c 0a 2a 2a 20 69 73 20 7a  f iLevel.** is z
19430 65 72 6f 20 6f 72 20 67 72 65 61 74 65 72 2c 20  ero or greater, 
19440 64 61 74 61 20 66 72 6f 6d 20 74 68 65 20 66 69  data from the fi
19450 72 73 74 20 6e 53 65 67 6d 65 6e 74 20 73 65 67  rst nSegment seg
19460 6d 65 6e 74 73 20 6f 6e 20 6c 65 76 65 6c 20 69  ments on level i
19470 4c 65 76 65 6c 0a 2a 2a 20 69 73 20 6d 65 72 67  Level.** is merg
19480 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 74  ed..**.** The it
19490 65 72 61 74 6f 72 20 69 6e 69 74 69 61 6c 6c 79  erator initially
194a0 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 66   points to the f
194b0 69 72 73 74 20 74 65 72 6d 2f 72 6f 77 69 64 20  irst term/rowid 
194c0 65 6e 74 72 79 20 69 6e 20 74 68 65 20 0a 2a 2a  entry in the .**
194d0 20 69 74 65 72 61 74 65 64 20 64 61 74 61 2e 0a   iterated data..
194e0 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
194f0 74 73 35 4d 75 6c 74 69 49 74 65 72 4e 65 77 28  ts5MultiIterNew(
19500 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c  .  Fts5Index *p,
19510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19520 20 20 20 2f 2a 20 46 54 53 35 20 62 61 63 6b 65     /* FTS5 backe
19530 6e 64 20 74 6f 20 69 74 65 72 61 74 65 20 77 69  nd to iterate wi
19540 74 68 69 6e 20 2a 2f 0a 20 20 46 74 73 35 53 74  thin */.  Fts5St
19550 72 75 63 74 75 72 65 20 2a 70 53 74 72 75 63 74  ructure *pStruct
19560 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74 72  ,         /* Str
19570 75 63 74 75 72 65 20 6f 66 20 73 70 65 63 69 66  ucture of specif
19580 69 63 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69 6e  ic index */.  in
19590 74 20 66 6c 61 67 73 2c 20 20 20 20 20 20 20 20  t flags,        
195a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
195b0 20 46 54 53 35 49 4e 44 45 58 5f 51 55 45 52 59   FTS5INDEX_QUERY
195c0 5f 58 58 58 20 66 6c 61 67 73 20 2a 2f 0a 20 20  _XXX flags */.  
195d0 46 74 73 35 43 6f 6c 73 65 74 20 2a 70 43 6f 6c  Fts5Colset *pCol
195e0 73 65 74 2c 20 20 20 20 20 20 20 20 20 20 20 20  set,            
195f0 2f 2a 20 43 6f 6c 73 65 74 20 74 6f 20 66 69 6c  /* Colset to fil
19600 74 65 72 20 6f 6e 20 28 6f 72 20 4e 55 4c 4c 29  ter on (or NULL)
19610 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a   */.  const u8 *
19620 70 54 65 72 6d 2c 20 69 6e 74 20 6e 54 65 72 6d  pTerm, int nTerm
19630 2c 20 20 20 20 20 2f 2a 20 54 65 72 6d 20 74 6f  ,     /* Term to
19640 20 73 65 65 6b 20 74 6f 20 28 6f 72 20 4e 55 4c   seek to (or NUL
19650 4c 2f 30 29 20 2a 2f 0a 20 20 69 6e 74 20 69 4c  L/0) */.  int iL
19660 65 76 65 6c 2c 20 20 20 20 20 20 20 20 20 20 20  evel,           
19670 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 76            /* Lev
19680 65 6c 20 74 6f 20 69 74 65 72 61 74 65 20 28 2d  el to iterate (-
19690 31 20 66 6f 72 20 61 6c 6c 29 20 2a 2f 0a 20 20  1 for all) */.  
196a0 69 6e 74 20 6e 53 65 67 6d 65 6e 74 2c 20 20 20  int nSegment,   
196b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
196c0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 73 65 67  /* Number of seg
196d0 6d 65 6e 74 73 20 74 6f 20 6d 65 72 67 65 20 28  ments to merge (
196e0 69 4c 65 76 65 6c 3e 3d 30 29 20 2a 2f 0a 20 20  iLevel>=0) */.  
196f0 46 74 73 35 49 74 65 72 20 2a 2a 70 70 4f 75 74  Fts5Iter **ppOut
19700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19710 2f 2a 20 4e 65 77 20 6f 62 6a 65 63 74 20 2a 2f  /* New object */
19720 0a 29 7b 0a 20 20 69 6e 74 20 6e 53 65 67 20 3d  .){.  int nSeg =
19730 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
19740 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
19750 6f 66 20 73 65 67 6d 65 6e 74 2d 69 74 65 72 73  of segment-iters
19760 20 69 6e 20 75 73 65 20 2a 2f 0a 20 20 69 6e 74   in use */.  int
19770 20 69 49 74 65 72 20 3d 20 30 3b 20 20 20 20 20   iIter = 0;     
19780 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
19790 2a 2f 0a 20 20 69 6e 74 20 69 53 65 67 3b 20 20  */.  int iSeg;  
197a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
197b0 20 20 20 20 20 2f 2a 20 55 73 65 64 20 74 6f 20       /* Used to 
197c0 69 74 65 72 61 74 65 20 74 68 72 6f 75 67 68 20  iterate through 
197d0 73 65 67 6d 65 6e 74 73 20 2a 2f 0a 20 20 46 74  segments */.  Ft
197e0 73 35 53 74 72 75 63 74 75 72 65 4c 65 76 65 6c  s5StructureLevel
197f0 20 2a 70 4c 76 6c 3b 0a 20 20 46 74 73 35 49 74   *pLvl;.  Fts5It
19800 65 72 20 2a 70 4e 65 77 3b 0a 0a 20 20 61 73 73  er *pNew;..  ass
19810 65 72 74 28 20 28 70 54 65 72 6d 3d 3d 30 20 26  ert( (pTerm==0 &
19820 26 20 6e 54 65 72 6d 3d 3d 30 29 20 7c 7c 20 69  & nTerm==0) || i
19830 4c 65 76 65 6c 3c 30 20 29 3b 0a 0a 20 20 2f 2a  Level<0 );..  /*
19840 20 41 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20   Allocate space 
19850 66 6f 72 20 74 68 65 20 6e 65 77 20 6d 75 6c 74  for the new mult
19860 69 2d 73 65 67 2d 69 74 65 72 61 74 6f 72 2e 20  i-seg-iterator. 
19870 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d  */.  if( p->rc==
19880 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
19890 20 69 66 28 20 69 4c 65 76 65 6c 3c 30 20 29 7b   if( iLevel<0 ){
198a0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
198b0 53 74 72 75 63 74 2d 3e 6e 53 65 67 6d 65 6e 74  Struct->nSegment
198c0 3d 3d 66 74 73 35 53 74 72 75 63 74 75 72 65 43  ==fts5StructureC
198d0 6f 75 6e 74 53 65 67 6d 65 6e 74 73 28 70 53 74  ountSegments(pSt
198e0 72 75 63 74 29 20 29 3b 0a 20 20 20 20 20 20 6e  ruct) );.      n
198f0 53 65 67 20 3d 20 70 53 74 72 75 63 74 2d 3e 6e  Seg = pStruct->n
19900 53 65 67 6d 65 6e 74 3b 0a 20 20 20 20 20 20 6e  Segment;.      n
19910 53 65 67 20 2b 3d 20 28 70 2d 3e 70 48 61 73 68  Seg += (p->pHash
19920 20 3f 20 31 20 3a 20 30 29 3b 0a 20 20 20 20 7d   ? 1 : 0);.    }
19930 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e 53 65 67  else{.      nSeg
19940 20 3d 20 4d 49 4e 28 70 53 74 72 75 63 74 2d 3e   = MIN(pStruct->
19950 61 4c 65 76 65 6c 5b 69 4c 65 76 65 6c 5d 2e 6e  aLevel[iLevel].n
19960 53 65 67 2c 20 6e 53 65 67 6d 65 6e 74 29 3b 0a  Seg, nSegment);.
19970 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2a 70 70 4f      }.  }.  *ppO
19980 75 74 20 3d 20 70 4e 65 77 20 3d 20 66 74 73 35  ut = pNew = fts5
19990 4d 75 6c 74 69 49 74 65 72 41 6c 6c 6f 63 28 70  MultiIterAlloc(p
199a0 2c 20 6e 53 65 67 29 3b 0a 20 20 69 66 28 20 70  , nSeg);.  if( p
199b0 4e 65 77 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  New==0 ) return;
199c0 0a 20 20 70 4e 65 77 2d 3e 62 52 65 76 20 3d 20  .  pNew->bRev = 
199d0 28 30 21 3d 28 66 6c 61 67 73 20 26 20 46 54 53  (0!=(flags & FTS
199e0 35 49 4e 44 45 58 5f 51 55 45 52 59 5f 44 45 53  5INDEX_QUERY_DES
199f0 43 29 29 3b 0a 20 20 70 4e 65 77 2d 3e 62 53 6b  C));.  pNew->bSk
19a00 69 70 45 6d 70 74 79 20 3d 20 28 30 21 3d 28 66  ipEmpty = (0!=(f
19a10 6c 61 67 73 20 26 20 46 54 53 35 49 4e 44 45 58  lags & FTS5INDEX
19a20 5f 51 55 45 52 59 5f 53 4b 49 50 45 4d 50 54 59  _QUERY_SKIPEMPTY
19a30 29 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 53 74 72  ));.  pNew->pStr
19a40 75 63 74 20 3d 20 70 53 74 72 75 63 74 3b 0a 20  uct = pStruct;. 
19a50 20 70 4e 65 77 2d 3e 70 43 6f 6c 73 65 74 20 3d   pNew->pColset =
19a60 20 70 43 6f 6c 73 65 74 3b 0a 20 20 66 74 73 35   pColset;.  fts5
19a70 53 74 72 75 63 74 75 72 65 52 65 66 28 70 53 74  StructureRef(pSt
19a80 72 75 63 74 29 3b 0a 20 20 69 66 28 20 28 66 6c  ruct);.  if( (fl
19a90 61 67 73 20 26 20 46 54 53 35 49 4e 44 45 58 5f  ags & FTS5INDEX_
19aa0 51 55 45 52 59 5f 4e 4f 4f 55 54 50 55 54 29 3d  QUERY_NOOUTPUT)=
19ab0 3d 30 20 29 7b 0a 20 20 20 20 66 74 73 35 49 74  =0 ){.    fts5It
19ac0 65 72 53 65 74 4f 75 74 70 75 74 43 62 28 26 70  erSetOutputCb(&p
19ad0 2d 3e 72 63 2c 20 70 4e 65 77 29 3b 0a 20 20 7d  ->rc, pNew);.  }
19ae0 0a 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a  ..  /* Initializ
19af0 65 20 65 61 63 68 20 6f 66 20 74 68 65 20 63 6f  e each of the co
19b00 6d 70 6f 6e 65 6e 74 20 73 65 67 6d 65 6e 74 20  mponent segment 
19b10 69 74 65 72 61 74 6f 72 73 2e 20 2a 2f 0a 20 20  iterators. */.  
19b20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  if( p->rc==SQLIT
19b30 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20  E_OK ){.    if( 
19b40 69 4c 65 76 65 6c 3c 30 20 29 7b 0a 20 20 20 20  iLevel<0 ){.    
19b50 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65 4c    Fts5StructureL
19b60 65 76 65 6c 20 2a 70 45 6e 64 20 3d 20 26 70 53  evel *pEnd = &pS
19b70 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 70 53  truct->aLevel[pS
19b80 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 5d 3b 0a  truct->nLevel];.
19b90 20 20 20 20 20 20 69 66 28 20 70 2d 3e 70 48 61        if( p->pHa
19ba0 73 68 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  sh ){.        /*
19bb0 20 41 64 64 20 61 20 73 65 67 6d 65 6e 74 20 69   Add a segment i
19bc0 74 65 72 61 74 6f 72 20 66 6f 72 20 74 68 65 20  terator for the 
19bd0 63 75 72 72 65 6e 74 20 63 6f 6e 74 65 6e 74 73  current contents
19be0 20 6f 66 20 74 68 65 20 68 61 73 68 20 74 61 62   of the hash tab
19bf0 6c 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 46  le. */.        F
19c00 74 73 35 53 65 67 49 74 65 72 20 2a 70 49 74 65  ts5SegIter *pIte
19c10 72 20 3d 20 26 70 4e 65 77 2d 3e 61 53 65 67 5b  r = &pNew->aSeg[
19c20 69 49 74 65 72 2b 2b 5d 3b 0a 20 20 20 20 20 20  iIter++];.      
19c30 20 20 66 74 73 35 53 65 67 49 74 65 72 48 61 73    fts5SegIterHas
19c40 68 49 6e 69 74 28 70 2c 20 70 54 65 72 6d 2c 20  hInit(p, pTerm, 
19c50 6e 54 65 72 6d 2c 20 66 6c 61 67 73 2c 20 70 49  nTerm, flags, pI
19c60 74 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ter);.      }.  
19c70 20 20 20 20 66 6f 72 28 70 4c 76 6c 3d 26 70 53      for(pLvl=&pS
19c80 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 30 5d  truct->aLevel[0]
19c90 3b 20 70 4c 76 6c 3c 70 45 6e 64 3b 20 70 4c 76  ; pLvl<pEnd; pLv
19ca0 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 66 6f  l++){.        fo
19cb0 72 28 69 53 65 67 3d 70 4c 76 6c 2d 3e 6e 53 65  r(iSeg=pLvl->nSe
19cc0 67 2d 31 3b 20 69 53 65 67 3e 3d 30 3b 20 69 53  g-1; iSeg>=0; iS
19cd0 65 67 2d 2d 29 7b 0a 20 20 20 20 20 20 20 20 20  eg--){.         
19ce0 20 46 74 73 35 53 74 72 75 63 74 75 72 65 53 65   Fts5StructureSe
19cf0 67 6d 65 6e 74 20 2a 70 53 65 67 20 3d 20 26 70  gment *pSeg = &p
19d00 4c 76 6c 2d 3e 61 53 65 67 5b 69 53 65 67 5d 3b  Lvl->aSeg[iSeg];
19d10 0a 20 20 20 20 20 20 20 20 20 20 46 74 73 35 53  .          Fts5S
19d20 65 67 49 74 65 72 20 2a 70 49 74 65 72 20 3d 20  egIter *pIter = 
19d30 26 70 4e 65 77 2d 3e 61 53 65 67 5b 69 49 74 65  &pNew->aSeg[iIte
19d40 72 2b 2b 5d 3b 0a 20 20 20 20 20 20 20 20 20 20  r++];.          
19d50 69 66 28 20 70 54 65 72 6d 3d 3d 30 20 29 7b 0a  if( pTerm==0 ){.
19d60 20 20 20 20 20 20 20 20 20 20 20 20 66 74 73 35              fts5
19d70 53 65 67 49 74 65 72 49 6e 69 74 28 70 2c 20 70  SegIterInit(p, p
19d80 53 65 67 2c 20 70 49 74 65 72 29 3b 0a 20 20 20  Seg, pIter);.   
19d90 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
19da0 20 20 20 20 20 20 20 20 20 20 66 74 73 35 53 65            fts5Se
19db0 67 49 74 65 72 53 65 65 6b 49 6e 69 74 28 70 2c  gIterSeekInit(p,
19dc0 20 70 54 65 72 6d 2c 20 6e 54 65 72 6d 2c 20 66   pTerm, nTerm, f
19dd0 6c 61 67 73 2c 20 70 53 65 67 2c 20 70 49 74 65  lags, pSeg, pIte
19de0 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  r);.          }.
19df0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
19e00 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  }.    }else{.   
19e10 20 20 20 70 4c 76 6c 20 3d 20 26 70 53 74 72 75     pLvl = &pStru
19e20 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c 65 76 65  ct->aLevel[iLeve
19e30 6c 5d 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 53  l];.      for(iS
19e40 65 67 3d 6e 53 65 67 2d 31 3b 20 69 53 65 67 3e  eg=nSeg-1; iSeg>
19e50 3d 30 3b 20 69 53 65 67 2d 2d 29 7b 0a 20 20 20  =0; iSeg--){.   
19e60 20 20 20 20 20 66 74 73 35 53 65 67 49 74 65 72       fts5SegIter
19e70 49 6e 69 74 28 70 2c 20 26 70 4c 76 6c 2d 3e 61  Init(p, &pLvl->a
19e80 53 65 67 5b 69 53 65 67 5d 2c 20 26 70 4e 65 77  Seg[iSeg], &pNew
19e90 2d 3e 61 53 65 67 5b 69 49 74 65 72 2b 2b 5d 29  ->aSeg[iIter++])
19ea0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
19eb0 20 20 20 20 61 73 73 65 72 74 28 20 69 49 74 65      assert( iIte
19ec0 72 3d 3d 6e 53 65 67 20 29 3b 0a 20 20 7d 0a 0a  r==nSeg );.  }..
19ed0 20 20 2f 2a 20 49 66 20 74 68 65 20 61 62 6f 76    /* If the abov
19ee0 65 20 77 61 73 20 73 75 63 63 65 73 73 66 75 6c  e was successful
19ef0 2c 20 65 61 63 68 20 63 6f 6d 70 6f 6e 65 6e 74  , each component
19f00 20 69 74 65 72 61 74 6f 72 73 20 6e 6f 77 20 70   iterators now p
19f10 6f 69 6e 74 73 20 0a 20 20 2a 2a 20 74 6f 20 74  oints .  ** to t
19f20 68 65 20 66 69 72 73 74 20 65 6e 74 72 79 20 69  he first entry i
19f30 6e 20 69 74 73 20 73 65 67 6d 65 6e 74 2e 20 49  n its segment. I
19f40 6e 20 74 68 69 73 20 63 61 73 65 20 69 6e 69 74  n this case init
19f50 69 61 6c 69 7a 65 20 74 68 65 20 0a 20 20 2a 2a  ialize the .  **
19f60 20 61 46 69 72 73 74 5b 5d 20 61 72 72 61 79 2e   aFirst[] array.
19f70 20 4f 72 2c 20 69 66 20 61 6e 20 65 72 72 6f 72   Or, if an error
19f80 20 68 61 73 20 6f 63 63 75 72 72 65 64 2c 20 66   has occurred, f
19f90 72 65 65 20 74 68 65 20 69 74 65 72 61 74 6f 72  ree the iterator
19fa0 0a 20 20 2a 2a 20 6f 62 6a 65 63 74 20 61 6e 64  .  ** object and
19fb0 20 73 65 74 20 74 68 65 20 6f 75 74 70 75 74 20   set the output 
19fc0 76 61 72 69 61 62 6c 65 20 74 6f 20 4e 55 4c 4c  variable to NULL
19fd0 2e 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 72  .  */.  if( p->r
19fe0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
19ff0 20 20 20 20 66 6f 72 28 69 49 74 65 72 3d 70 4e      for(iIter=pN
1a000 65 77 2d 3e 6e 53 65 67 2d 31 3b 20 69 49 74 65  ew->nSeg-1; iIte
1a010 72 3e 30 3b 20 69 49 74 65 72 2d 2d 29 7b 0a 20  r>0; iIter--){. 
1a020 20 20 20 20 20 69 6e 74 20 69 45 71 3b 0a 20 20       int iEq;.  
1a030 20 20 20 20 69 66 28 20 28 69 45 71 20 3d 20 66      if( (iEq = f
1a040 74 73 35 4d 75 6c 74 69 49 74 65 72 44 6f 43 6f  ts5MultiIterDoCo
1a050 6d 70 61 72 65 28 70 4e 65 77 2c 20 69 49 74 65  mpare(pNew, iIte
1a060 72 29 29 20 29 7b 0a 20 20 20 20 20 20 20 20 46  r)) ){.        F
1a070 74 73 35 53 65 67 49 74 65 72 20 2a 70 53 65 67  ts5SegIter *pSeg
1a080 20 3d 20 26 70 4e 65 77 2d 3e 61 53 65 67 5b 69   = &pNew->aSeg[i
1a090 45 71 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 28  Eq];.        if(
1a0a0 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
1a0b0 4b 20 29 20 70 53 65 67 2d 3e 78 4e 65 78 74 28  K ) pSeg->xNext(
1a0c0 70 2c 20 70 53 65 67 2c 20 30 29 3b 0a 20 20 20  p, pSeg, 0);.   
1a0d0 20 20 20 20 20 66 74 73 35 4d 75 6c 74 69 49 74       fts5MultiIt
1a0e0 65 72 41 64 76 61 6e 63 65 64 28 70 2c 20 70 4e  erAdvanced(p, pN
1a0f0 65 77 2c 20 69 45 71 2c 20 69 49 74 65 72 29 3b  ew, iEq, iIter);
1a100 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
1a110 20 20 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72     fts5MultiIter
1a120 53 65 74 45 6f 66 28 70 4e 65 77 29 3b 0a 20 20  SetEof(pNew);.  
1a130 20 20 66 74 73 35 41 73 73 65 72 74 4d 75 6c 74    fts5AssertMult
1a140 69 49 74 65 72 53 65 74 75 70 28 70 2c 20 70 4e  iIterSetup(p, pN
1a150 65 77 29 3b 0a 0a 20 20 20 20 69 66 28 20 70 4e  ew);..    if( pN
1a160 65 77 2d 3e 62 53 6b 69 70 45 6d 70 74 79 20 26  ew->bSkipEmpty &
1a170 26 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 49  & fts5MultiIterI
1a180 73 45 6d 70 74 79 28 70 2c 20 70 4e 65 77 29 20  sEmpty(p, pNew) 
1a190 29 7b 0a 20 20 20 20 20 20 66 74 73 35 4d 75 6c  ){.      fts5Mul
1a1a0 74 69 49 74 65 72 4e 65 78 74 28 70 2c 20 70 4e  tiIterNext(p, pN
1a1b0 65 77 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d  ew, 0, 0);.    }
1a1c0 65 6c 73 65 20 69 66 28 20 70 4e 65 77 2d 3e 62  else if( pNew->b
1a1d0 61 73 65 2e 62 45 6f 66 3d 3d 30 20 29 7b 0a 20  ase.bEof==0 ){. 
1a1e0 20 20 20 20 20 46 74 73 35 53 65 67 49 74 65 72       Fts5SegIter
1a1f0 20 2a 70 53 65 67 20 3d 20 26 70 4e 65 77 2d 3e   *pSeg = &pNew->
1a200 61 53 65 67 5b 70 4e 65 77 2d 3e 61 46 69 72 73  aSeg[pNew->aFirs
1a210 74 5b 31 5d 2e 69 46 69 72 73 74 5d 3b 0a 20 20  t[1].iFirst];.  
1a220 20 20 20 20 70 4e 65 77 2d 3e 78 53 65 74 4f 75      pNew->xSetOu
1a230 74 70 75 74 73 28 70 4e 65 77 2c 20 70 53 65 67  tputs(pNew, pSeg
1a240 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 7d 65 6c 73  );.    }..  }els
1a250 65 7b 0a 20 20 20 20 66 74 73 35 4d 75 6c 74 69  e{.    fts5Multi
1a260 49 74 65 72 46 72 65 65 28 70 4e 65 77 29 3b 0a  IterFree(pNew);.
1a270 20 20 20 20 2a 70 70 4f 75 74 20 3d 20 30 3b 0a      *ppOut = 0;.
1a280 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65    }.}../*.** Cre
1a290 61 74 65 20 61 6e 20 46 74 73 35 49 74 65 72 20  ate an Fts5Iter 
1a2a0 74 68 61 74 20 69 74 65 72 61 74 65 73 20 74 68  that iterates th
1a2b0 72 6f 75 67 68 20 74 68 65 20 64 6f 63 6c 69 73  rough the doclis
1a2c0 74 20 70 72 6f 76 69 64 65 64 0a 2a 2a 20 61 73  t provided.** as
1a2d0 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
1a2e0 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ment..*/.static 
1a2f0 76 6f 69 64 20 66 74 73 35 4d 75 6c 74 69 49 74  void fts5MultiIt
1a300 65 72 4e 65 77 32 28 0a 20 20 46 74 73 35 49 6e  erNew2(.  Fts5In
1a310 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20 20  dex *p,         
1a320 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53            /* FTS
1a330 35 20 62 61 63 6b 65 6e 64 20 74 6f 20 69 74 65  5 backend to ite
1a340 72 61 74 65 20 77 69 74 68 69 6e 20 2a 2f 0a 20  rate within */. 
1a350 20 46 74 73 35 44 61 74 61 20 2a 70 44 61 74 61   Fts5Data *pData
1a360 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1a370 20 2f 2a 20 44 6f 63 6c 69 73 74 20 74 6f 20 69   /* Doclist to i
1a380 74 65 72 61 74 65 20 74 68 72 6f 75 67 68 20 2a  terate through *
1a390 2f 0a 20 20 69 6e 74 20 62 44 65 73 63 2c 20 20  /.  int bDesc,  
1a3a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a3b0 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20      /* True for 
1a3c0 64 65 73 63 65 6e 64 69 6e 67 20 72 6f 77 69 64  descending rowid
1a3d0 20 6f 72 64 65 72 20 2a 2f 0a 20 20 46 74 73 35   order */.  Fts5
1a3e0 49 74 65 72 20 2a 2a 70 70 4f 75 74 20 20 20 20  Iter **ppOut    
1a3f0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
1a400 65 77 20 6f 62 6a 65 63 74 20 2a 2f 0a 29 7b 0a  ew object */.){.
1a410 20 20 46 74 73 35 49 74 65 72 20 2a 70 4e 65 77    Fts5Iter *pNew
1a420 3b 0a 20 20 70 4e 65 77 20 3d 20 66 74 73 35 4d  ;.  pNew = fts5M
1a430 75 6c 74 69 49 74 65 72 41 6c 6c 6f 63 28 70 2c  ultiIterAlloc(p,
1a440 20 32 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 20   2);.  if( pNew 
1a450 29 7b 0a 20 20 20 20 46 74 73 35 53 65 67 49 74  ){.    Fts5SegIt
1a460 65 72 20 2a 70 49 74 65 72 20 3d 20 26 70 4e 65  er *pIter = &pNe
1a470 77 2d 3e 61 53 65 67 5b 31 5d 3b 0a 0a 20 20 20  w->aSeg[1];..   
1a480 20 70 49 74 65 72 2d 3e 66 6c 61 67 73 20 3d 20   pIter->flags = 
1a490 46 54 53 35 5f 53 45 47 49 54 45 52 5f 4f 4e 45  FTS5_SEGITER_ONE
1a4a0 54 45 52 4d 3b 0a 20 20 20 20 69 66 28 20 70 44  TERM;.    if( pD
1a4b0 61 74 61 2d 3e 73 7a 4c 65 61 66 3e 30 20 29 7b  ata->szLeaf>0 ){
1a4c0 0a 20 20 20 20 20 20 70 49 74 65 72 2d 3e 70 4c  .      pIter->pL
1a4d0 65 61 66 20 3d 20 70 44 61 74 61 3b 0a 20 20 20  eaf = pData;.   
1a4e0 20 20 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f     pIter->iLeafO
1a4f0 66 66 73 65 74 20 3d 20 66 74 73 35 47 65 74 56  ffset = fts5GetV
1a500 61 72 69 6e 74 28 70 44 61 74 61 2d 3e 70 2c 20  arint(pData->p, 
1a510 28 75 36 34 2a 29 26 70 49 74 65 72 2d 3e 69 52  (u64*)&pIter->iR
1a520 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 70 49 74  owid);.      pIt
1a530 65 72 2d 3e 69 45 6e 64 6f 66 44 6f 63 6c 69 73  er->iEndofDoclis
1a540 74 20 3d 20 70 44 61 74 61 2d 3e 6e 6e 3b 0a 20  t = pData->nn;. 
1a550 20 20 20 20 20 70 4e 65 77 2d 3e 61 46 69 72 73       pNew->aFirs
1a560 74 5b 31 5d 2e 69 46 69 72 73 74 20 3d 20 31 3b  t[1].iFirst = 1;
1a570 0a 20 20 20 20 20 20 69 66 28 20 62 44 65 73 63  .      if( bDesc
1a580 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4e 65 77   ){.        pNew
1a590 2d 3e 62 52 65 76 20 3d 20 31 3b 0a 20 20 20 20  ->bRev = 1;.    
1a5a0 20 20 20 20 70 49 74 65 72 2d 3e 66 6c 61 67 73      pIter->flags
1a5b0 20 7c 3d 20 46 54 53 35 5f 53 45 47 49 54 45 52   |= FTS5_SEGITER
1a5c0 5f 52 45 56 45 52 53 45 3b 0a 20 20 20 20 20 20  _REVERSE;.      
1a5d0 20 20 66 74 73 35 53 65 67 49 74 65 72 52 65 76    fts5SegIterRev
1a5e0 65 72 73 65 49 6e 69 74 50 61 67 65 28 70 2c 20  erseInitPage(p, 
1a5f0 70 49 74 65 72 29 3b 0a 20 20 20 20 20 20 7d 65  pIter);.      }e
1a600 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 66 74 73  lse{.        fts
1a610 35 53 65 67 49 74 65 72 4c 6f 61 64 4e 50 6f 73  5SegIterLoadNPos
1a620 28 70 2c 20 70 49 74 65 72 29 3b 0a 20 20 20 20  (p, pIter);.    
1a630 20 20 7d 0a 20 20 20 20 20 20 70 44 61 74 61 20    }.      pData 
1a640 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  = 0;.    }else{.
1a650 20 20 20 20 20 20 70 4e 65 77 2d 3e 62 61 73 65        pNew->base
1a660 2e 62 45 6f 66 20 3d 20 31 3b 0a 20 20 20 20 7d  .bEof = 1;.    }
1a670 0a 20 20 20 20 66 74 73 35 53 65 67 49 74 65 72  .    fts5SegIter
1a680 53 65 74 4e 65 78 74 28 70 2c 20 70 49 74 65 72  SetNext(p, pIter
1a690 29 3b 0a 0a 20 20 20 20 2a 70 70 4f 75 74 20 3d  );..    *ppOut =
1a6a0 20 70 4e 65 77 3b 0a 20 20 7d 0a 0a 20 20 66 74   pNew;.  }..  ft
1a6b0 73 35 44 61 74 61 52 65 6c 65 61 73 65 28 70 44  s5DataRelease(pD
1a6c0 61 74 61 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  ata);.}../*.** R
1a6d0 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 74 68  eturn true if th
1a6e0 65 20 69 74 65 72 61 74 6f 72 20 69 73 20 61 74  e iterator is at
1a6f0 20 45 4f 46 20 6f 72 20 69 66 20 61 6e 20 65 72   EOF or if an er
1a700 72 6f 72 20 68 61 73 20 6f 63 63 75 72 72 65 64  ror has occurred
1a710 2e 20 0a 2a 2a 20 46 61 6c 73 65 20 6f 74 68 65  . .** False othe
1a720 72 77 69 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  rwise..*/.static
1a730 20 69 6e 74 20 66 74 73 35 4d 75 6c 74 69 49 74   int fts5MultiIt
1a740 65 72 45 6f 66 28 46 74 73 35 49 6e 64 65 78 20  erEof(Fts5Index 
1a750 2a 70 2c 20 46 74 73 35 49 74 65 72 20 2a 70 49  *p, Fts5Iter *pI
1a760 74 65 72 29 7b 0a 20 20 61 73 73 65 72 74 28 20  ter){.  assert( 
1a770 70 2d 3e 72 63 20 0a 20 20 20 20 20 20 7c 7c 20  p->rc .      || 
1a780 28 70 49 74 65 72 2d 3e 61 53 65 67 5b 20 70 49  (pIter->aSeg[ pI
1a790 74 65 72 2d 3e 61 46 69 72 73 74 5b 31 5d 2e 69  ter->aFirst[1].i
1a7a0 46 69 72 73 74 20 5d 2e 70 4c 65 61 66 3d 3d 30  First ].pLeaf==0
1a7b0 29 3d 3d 70 49 74 65 72 2d 3e 62 61 73 65 2e 62  )==pIter->base.b
1a7c0 45 6f 66 20 0a 20 20 29 3b 0a 20 20 72 65 74 75  Eof .  );.  retu
1a7d0 72 6e 20 28 70 2d 3e 72 63 20 7c 7c 20 70 49 74  rn (p->rc || pIt
1a7e0 65 72 2d 3e 62 61 73 65 2e 62 45 6f 66 29 3b 0a  er->base.bEof);.
1a7f0 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
1a800 74 68 65 20 72 6f 77 69 64 20 6f 66 20 74 68 65  the rowid of the
1a810 20 65 6e 74 72 79 20 74 68 61 74 20 74 68 65 20   entry that the 
1a820 69 74 65 72 61 74 6f 72 20 63 75 72 72 65 6e 74  iterator current
1a830 6c 79 20 70 6f 69 6e 74 73 0a 2a 2a 20 74 6f 2e  ly points.** to.
1a840 20 49 66 20 74 68 65 20 69 74 65 72 61 74 6f 72   If the iterator
1a850 20 70 6f 69 6e 74 73 20 74 6f 20 45 4f 46 20 77   points to EOF w
1a860 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hen this functio
1a870 6e 20 69 73 20 63 61 6c 6c 65 64 20 74 68 65 0a  n is called the.
1a880 2a 2a 20 72 65 73 75 6c 74 73 20 61 72 65 20 75  ** results are u
1a890 6e 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a 73 74 61  ndefined..*/.sta
1a8a0 74 69 63 20 69 36 34 20 66 74 73 35 4d 75 6c 74  tic i64 fts5Mult
1a8b0 69 49 74 65 72 52 6f 77 69 64 28 46 74 73 35 49  iIterRowid(Fts5I
1a8c0 74 65 72 20 2a 70 49 74 65 72 29 7b 0a 20 20 61  ter *pIter){.  a
1a8d0 73 73 65 72 74 28 20 70 49 74 65 72 2d 3e 61 53  ssert( pIter->aS
1a8e0 65 67 5b 20 70 49 74 65 72 2d 3e 61 46 69 72 73  eg[ pIter->aFirs
1a8f0 74 5b 31 5d 2e 69 46 69 72 73 74 20 5d 2e 70 4c  t[1].iFirst ].pL
1a900 65 61 66 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  eaf );.  return 
1a910 70 49 74 65 72 2d 3e 61 53 65 67 5b 20 70 49 74  pIter->aSeg[ pIt
1a920 65 72 2d 3e 61 46 69 72 73 74 5b 31 5d 2e 69 46  er->aFirst[1].iF
1a930 69 72 73 74 20 5d 2e 69 52 6f 77 69 64 3b 0a 7d  irst ].iRowid;.}
1a940 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65  ../*.** Move the
1a950 20 69 74 65 72 61 74 6f 72 20 74 6f 20 74 68 65   iterator to the
1a960 20 6e 65 78 74 20 65 6e 74 72 79 20 61 74 20 6f   next entry at o
1a970 72 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 4d 61 74  r following iMat
1a980 63 68 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ch..*/.static vo
1a990 69 64 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72  id fts5MultiIter
1a9a0 4e 65 78 74 46 72 6f 6d 28 0a 20 20 46 74 73 35  NextFrom(.  Fts5
1a9b0 49 6e 64 65 78 20 2a 70 2c 20 0a 20 20 46 74 73  Index *p, .  Fts
1a9c0 35 49 74 65 72 20 2a 70 49 74 65 72 2c 20 0a 20  5Iter *pIter, . 
1a9d0 20 69 36 34 20 69 4d 61 74 63 68 0a 29 7b 0a 20   i64 iMatch.){. 
1a9e0 20 77 68 69 6c 65 28 20 31 20 29 7b 0a 20 20 20   while( 1 ){.   
1a9f0 20 69 36 34 20 69 52 6f 77 69 64 3b 0a 20 20 20   i64 iRowid;.   
1aa00 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 4e 65   fts5MultiIterNe
1aa10 78 74 28 70 2c 20 70 49 74 65 72 2c 20 31 2c 20  xt(p, pIter, 1, 
1aa20 69 4d 61 74 63 68 29 3b 0a 20 20 20 20 69 66 28  iMatch);.    if(
1aa30 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 45 6f   fts5MultiIterEo
1aa40 66 28 70 2c 20 70 49 74 65 72 29 20 29 20 62 72  f(p, pIter) ) br
1aa50 65 61 6b 3b 0a 20 20 20 20 69 52 6f 77 69 64 20  eak;.    iRowid 
1aa60 3d 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 52  = fts5MultiIterR
1aa70 6f 77 69 64 28 70 49 74 65 72 29 3b 0a 20 20 20  owid(pIter);.   
1aa80 20 69 66 28 20 70 49 74 65 72 2d 3e 62 52 65 76   if( pIter->bRev
1aa90 3d 3d 30 20 26 26 20 69 52 6f 77 69 64 3e 3d 69  ==0 && iRowid>=i
1aaa0 4d 61 74 63 68 20 29 20 62 72 65 61 6b 3b 0a 20  Match ) break;. 
1aab0 20 20 20 69 66 28 20 70 49 74 65 72 2d 3e 62 52     if( pIter->bR
1aac0 65 76 21 3d 30 20 26 26 20 69 52 6f 77 69 64 3c  ev!=0 && iRowid<
1aad0 3d 69 4d 61 74 63 68 20 29 20 62 72 65 61 6b 3b  =iMatch ) break;
1aae0 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  .  }.}../*.** Re
1aaf0 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
1ab00 6f 20 61 20 62 75 66 66 65 72 20 63 6f 6e 74 61  o a buffer conta
1ab10 69 6e 69 6e 67 20 74 68 65 20 74 65 72 6d 20 61  ining the term a
1ab20 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74  ssociated with t
1ab30 68 65 20 0a 2a 2a 20 65 6e 74 72 79 20 74 68 61  he .** entry tha
1ab40 74 20 74 68 65 20 69 74 65 72 61 74 6f 72 20 63  t the iterator c
1ab50 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 73 20  urrently points 
1ab60 74 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f  to..*/.static co
1ab70 6e 73 74 20 75 38 20 2a 66 74 73 35 4d 75 6c 74  nst u8 *fts5Mult
1ab80 69 49 74 65 72 54 65 72 6d 28 46 74 73 35 49 74  iIterTerm(Fts5It
1ab90 65 72 20 2a 70 49 74 65 72 2c 20 69 6e 74 20 2a  er *pIter, int *
1aba0 70 6e 29 7b 0a 20 20 46 74 73 35 53 65 67 49 74  pn){.  Fts5SegIt
1abb0 65 72 20 2a 70 20 3d 20 26 70 49 74 65 72 2d 3e  er *p = &pIter->
1abc0 61 53 65 67 5b 20 70 49 74 65 72 2d 3e 61 46 69  aSeg[ pIter->aFi
1abd0 72 73 74 5b 31 5d 2e 69 46 69 72 73 74 20 5d 3b  rst[1].iFirst ];
1abe0 0a 20 20 2a 70 6e 20 3d 20 70 2d 3e 74 65 72 6d  .  *pn = p->term
1abf0 2e 6e 3b 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e  .n;.  return p->
1ac00 74 65 72 6d 2e 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  term.p;.}../*.**
1ac10 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20   Allocate a new 
1ac20 73 65 67 6d 65 6e 74 2d 69 64 20 66 6f 72 20 74  segment-id for t
1ac30 68 65 20 73 74 72 75 63 74 75 72 65 20 70 53 74  he structure pSt
1ac40 72 75 63 74 2e 20 54 68 65 20 6e 65 77 20 73 65  ruct. The new se
1ac50 67 6d 65 6e 74 0a 2a 2a 20 69 64 20 6d 75 73 74  gment.** id must
1ac60 20 62 65 20 62 65 74 77 65 65 6e 20 31 20 61 6e   be between 1 an
1ac70 64 20 36 35 33 33 35 20 69 6e 63 6c 75 73 69 76  d 65335 inclusiv
1ac80 65 2c 20 61 6e 64 20 6d 75 73 74 20 6e 6f 74 20  e, and must not 
1ac90 62 65 20 75 73 65 64 20 62 79 20 0a 2a 2a 20 61  be used by .** a
1aca0 6e 79 20 63 75 72 72 65 6e 74 6c 79 20 65 78 69  ny currently exi
1acb0 73 74 69 6e 67 20 73 65 67 6d 65 6e 74 2e 20 49  sting segment. I
1acc0 66 20 61 20 66 72 65 65 20 73 65 67 6d 65 6e 74  f a free segment
1acd0 20 69 64 20 63 61 6e 6e 6f 74 20 62 65 20 66 6f   id cannot be fo
1ace0 75 6e 64 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 46  und,.** SQLITE_F
1acf0 55 4c 4c 20 69 73 20 72 65 74 75 72 6e 65 64 2e  ULL is returned.
1ad00 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72  .**.** If an err
1ad10 6f 72 20 68 61 73 20 61 6c 72 65 61 64 79 20 6f  or has already o
1ad20 63 63 75 72 72 65 64 2c 20 74 68 69 73 20 66 75  ccurred, this fu
1ad30 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f  nction is a no-o
1ad40 70 2e 20 30 20 69 73 20 0a 2a 2a 20 72 65 74 75  p. 0 is .** retu
1ad50 72 6e 65 64 20 69 6e 20 74 68 69 73 20 63 61 73  rned in this cas
1ad60 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
1ad70 20 66 74 73 35 41 6c 6c 6f 63 61 74 65 53 65 67   fts5AllocateSeg
1ad80 69 64 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c  id(Fts5Index *p,
1ad90 20 46 74 73 35 53 74 72 75 63 74 75 72 65 20 2a   Fts5Structure *
1ada0 70 53 74 72 75 63 74 29 7b 0a 20 20 69 6e 74 20  pStruct){.  int 
1adb0 69 53 65 67 69 64 20 3d 20 30 3b 0a 0a 20 20 69  iSegid = 0;..  i
1adc0 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  f( p->rc==SQLITE
1add0 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 70  _OK ){.    if( p
1ade0 53 74 72 75 63 74 2d 3e 6e 53 65 67 6d 65 6e 74  Struct->nSegment
1adf0 3e 3d 46 54 53 35 5f 4d 41 58 5f 53 45 47 4d 45  >=FTS5_MAX_SEGME
1ae00 4e 54 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 72  NT ){.      p->r
1ae10 63 20 3d 20 53 51 4c 49 54 45 5f 46 55 4c 4c 3b  c = SQLITE_FULL;
1ae20 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1ae30 20 20 2f 2a 20 46 54 53 35 5f 4d 41 58 5f 53 45    /* FTS5_MAX_SE
1ae40 47 4d 45 4e 54 20 69 73 20 63 75 72 72 65 6e 74  GMENT is current
1ae50 6c 79 20 64 65 66 69 6e 65 64 20 61 73 20 32 30  ly defined as 20
1ae60 30 30 2e 20 53 6f 20 74 68 65 20 66 6f 6c 6c 6f  00. So the follo
1ae70 77 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 61 72  wing.      ** ar
1ae80 72 61 79 20 69 73 20 36 33 20 65 6c 65 6d 65 6e  ray is 63 elemen
1ae90 74 73 2c 20 6f 72 20 32 35 32 20 62 79 74 65 73  ts, or 252 bytes
1aea0 2c 20 69 6e 20 73 69 7a 65 2e 20 20 2a 2f 0a 20  , in size.  */. 
1aeb0 20 20 20 20 20 75 33 32 20 61 55 73 65 64 5b 28       u32 aUsed[(
1aec0 46 54 53 35 5f 4d 41 58 5f 53 45 47 4d 45 4e 54  FTS5_MAX_SEGMENT
1aed0 2b 33 31 29 20 2f 20 33 32 5d 3b 0a 20 20 20 20  +31) / 32];.    
1aee0 20 20 69 6e 74 20 69 4c 76 6c 2c 20 69 53 65 67    int iLvl, iSeg
1aef0 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20  ;.      int i;. 
1af00 20 20 20 20 20 75 33 32 20 6d 61 73 6b 3b 0a 20       u32 mask;. 
1af10 20 20 20 20 20 6d 65 6d 73 65 74 28 61 55 73 65       memset(aUse
1af20 64 2c 20 30 2c 20 73 69 7a 65 6f 66 28 61 55 73  d, 0, sizeof(aUs
1af30 65 64 29 29 3b 0a 20 20 20 20 20 20 66 6f 72 28  ed));.      for(
1af40 69 4c 76 6c 3d 30 3b 20 69 4c 76 6c 3c 70 53 74  iLvl=0; iLvl<pSt
1af50 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 3b 20 69 4c  ruct->nLevel; iL
1af60 76 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 66  vl++){.        f
1af70 6f 72 28 69 53 65 67 3d 30 3b 20 69 53 65 67 3c  or(iSeg=0; iSeg<
1af80 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b  pStruct->aLevel[
1af90 69 4c 76 6c 5d 2e 6e 53 65 67 3b 20 69 53 65 67  iLvl].nSeg; iSeg
1afa0 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  ++){.          i
1afb0 6e 74 20 69 49 64 20 3d 20 70 53 74 72 75 63 74  nt iId = pStruct
1afc0 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d 2e 61  ->aLevel[iLvl].a
1afd0 53 65 67 5b 69 53 65 67 5d 2e 69 53 65 67 69 64  Seg[iSeg].iSegid
1afe0 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
1aff0 69 49 64 3c 3d 46 54 53 35 5f 4d 41 58 5f 53 45  iId<=FTS5_MAX_SE
1b000 47 4d 45 4e 54 20 29 7b 0a 20 20 20 20 20 20 20  GMENT ){.       
1b010 20 20 20 20 20 61 55 73 65 64 5b 28 69 49 64 2d       aUsed[(iId-
1b020 31 29 20 2f 20 33 32 5d 20 7c 3d 20 31 20 3c 3c  1) / 32] |= 1 <<
1b030 20 28 28 69 49 64 2d 31 29 20 25 20 33 32 29 3b   ((iId-1) % 32);
1b040 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
1b050 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a       }.      }..
1b060 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 61        for(i=0; a
1b070 55 73 65 64 5b 69 5d 3d 3d 30 78 46 46 46 46 46  Used[i]==0xFFFFF
1b080 46 46 46 3b 20 69 2b 2b 29 3b 0a 20 20 20 20 20  FFF; i++);.     
1b090 20 6d 61 73 6b 20 3d 20 61 55 73 65 64 5b 69 5d   mask = aUsed[i]
1b0a0 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 53 65 67  ;.      for(iSeg
1b0b0 69 64 3d 30 3b 20 6d 61 73 6b 20 26 20 28 31 20  id=0; mask & (1 
1b0c0 3c 3c 20 69 53 65 67 69 64 29 3b 20 69 53 65 67  << iSegid); iSeg
1b0d0 69 64 2b 2b 29 3b 0a 20 20 20 20 20 20 69 53 65  id++);.      iSe
1b0e0 67 69 64 20 2b 3d 20 31 20 2b 20 69 2a 33 32 3b  gid += 1 + i*32;
1b0f0 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
1b100 44 45 42 55 47 0a 20 20 20 20 20 20 66 6f 72 28  DEBUG.      for(
1b110 69 4c 76 6c 3d 30 3b 20 69 4c 76 6c 3c 70 53 74  iLvl=0; iLvl<pSt
1b120 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 3b 20 69 4c  ruct->nLevel; iL
1b130 76 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 66  vl++){.        f
1b140 6f 72 28 69 53 65 67 3d 30 3b 20 69 53 65 67 3c  or(iSeg=0; iSeg<
1b150 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b  pStruct->aLevel[
1b160 69 4c 76 6c 5d 2e 6e 53 65 67 3b 20 69 53 65 67  iLvl].nSeg; iSeg
1b170 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61  ++){.          a
1b180 73 73 65 72 74 28 20 69 53 65 67 69 64 21 3d 70  ssert( iSegid!=p
1b190 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69  Struct->aLevel[i
1b1a0 4c 76 6c 5d 2e 61 53 65 67 5b 69 53 65 67 5d 2e  Lvl].aSeg[iSeg].
1b1b0 69 53 65 67 69 64 20 29 3b 0a 20 20 20 20 20 20  iSegid );.      
1b1c0 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
1b1d0 20 20 61 73 73 65 72 74 28 20 69 53 65 67 69 64    assert( iSegid
1b1e0 3e 30 20 26 26 20 69 53 65 67 69 64 3c 3d 46 54  >0 && iSegid<=FT
1b1f0 53 35 5f 4d 41 58 5f 53 45 47 4d 45 4e 54 20 29  S5_MAX_SEGMENT )
1b200 3b 0a 0a 20 20 20 20 20 20 7b 0a 20 20 20 20 20  ;..      {.     
1b210 20 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20     sqlite3_stmt 
1b220 2a 70 49 64 78 53 65 6c 65 63 74 20 3d 20 66 74  *pIdxSelect = ft
1b230 73 35 49 64 78 53 65 6c 65 63 74 53 74 6d 74 28  s5IdxSelectStmt(
1b240 70 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  p);.        if( 
1b250 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
1b260 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 75 38   ){.          u8
1b270 20 61 42 6c 6f 62 5b 32 5d 20 3d 20 7b 30 78 66   aBlob[2] = {0xf
1b280 66 2c 20 30 78 66 66 7d 3b 0a 20 20 20 20 20 20  f, 0xff};.      
1b290 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64      sqlite3_bind
1b2a0 5f 69 6e 74 28 70 49 64 78 53 65 6c 65 63 74 2c  _int(pIdxSelect,
1b2b0 20 31 2c 20 69 53 65 67 69 64 29 3b 0a 20 20 20   1, iSegid);.   
1b2c0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62         sqlite3_b
1b2d0 69 6e 64 5f 62 6c 6f 62 28 70 49 64 78 53 65 6c  ind_blob(pIdxSel
1b2e0 65 63 74 2c 20 32 2c 20 61 42 6c 6f 62 2c 20 32  ect, 2, aBlob, 2
1b2f0 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29  , SQLITE_STATIC)
1b300 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  ;.          asse
1b310 72 74 28 20 73 71 6c 69 74 65 33 5f 73 74 65 70  rt( sqlite3_step
1b320 28 70 49 64 78 53 65 6c 65 63 74 29 21 3d 53 51  (pIdxSelect)!=SQ
1b330 4c 49 54 45 5f 52 4f 57 20 29 3b 0a 20 20 20 20  LITE_ROW );.    
1b340 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 73 71        p->rc = sq
1b350 6c 69 74 65 33 5f 72 65 73 65 74 28 70 49 64 78  lite3_reset(pIdx
1b360 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 20 20 20  Select);.       
1b370 20 7d 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69   }.      }.#endi
1b380 66 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72  f.    }.  }..  r
1b390 65 74 75 72 6e 20 69 53 65 67 69 64 3b 0a 7d 0a  eturn iSegid;.}.
1b3a0 0a 2f 2a 0a 2a 2a 20 44 69 73 63 61 72 64 20 61  ./*.** Discard a
1b3b0 6c 6c 20 64 61 74 61 20 63 75 72 72 65 6e 74 6c  ll data currentl
1b3c0 79 20 63 61 63 68 65 64 20 69 6e 20 74 68 65 20  y cached in the 
1b3d0 68 61 73 68 2d 74 61 62 6c 65 73 2e 0a 2a 2f 0a  hash-tables..*/.
1b3e0 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
1b3f0 49 6e 64 65 78 44 69 73 63 61 72 64 44 61 74 61  IndexDiscardData
1b400 28 46 74 73 35 49 6e 64 65 78 20 2a 70 29 7b 0a  (Fts5Index *p){.
1b410 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 48 61    assert( p->pHa
1b420 73 68 20 7c 7c 20 70 2d 3e 6e 50 65 6e 64 69 6e  sh || p->nPendin
1b430 67 44 61 74 61 3d 3d 30 20 29 3b 0a 20 20 69 66  gData==0 );.  if
1b440 28 20 70 2d 3e 70 48 61 73 68 20 29 7b 0a 20 20  ( p->pHash ){.  
1b450 20 20 73 71 6c 69 74 65 33 46 74 73 35 48 61 73    sqlite3Fts5Has
1b460 68 43 6c 65 61 72 28 70 2d 3e 70 48 61 73 68 29  hClear(p->pHash)
1b470 3b 0a 20 20 20 20 70 2d 3e 6e 50 65 6e 64 69 6e  ;.    p->nPendin
1b480 67 44 61 74 61 20 3d 20 30 3b 0a 20 20 7d 0a 7d  gData = 0;.  }.}
1b490 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
1b4a0 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 70  he size of the p
1b4b0 72 65 66 69 78 2c 20 69 6e 20 62 79 74 65 73 2c  refix, in bytes,
1b4c0 20 74 68 61 74 20 62 75 66 66 65 72 20 0a 2a 2a   that buffer .**
1b4d0 20 28 70 4e 65 77 2f 3c 6c 65 6e 67 74 68 2d 75   (pNew/<length-u
1b4e0 6e 6b 6e 6f 77 6e 3e 29 20 73 68 61 72 65 73 20  nknown>) shares 
1b4f0 77 69 74 68 20 62 75 66 66 65 72 20 28 70 4f 6c  with buffer (pOl
1b500 64 2f 6e 4f 6c 64 29 2e 0a 2a 2a 0a 2a 2a 20 42  d/nOld)..**.** B
1b510 75 66 66 65 72 20 28 70 4e 65 77 2f 3c 6c 65 6e  uffer (pNew/<len
1b520 67 74 68 2d 75 6e 6b 6e 6f 77 6e 3e 29 20 69 73  gth-unknown>) is
1b530 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20 62   guaranteed to b
1b540 65 20 67 72 65 61 74 65 72 20 0a 2a 2a 20 74 68  e greater .** th
1b550 61 6e 20 62 75 66 66 65 72 20 28 70 4f 6c 64 2f  an buffer (pOld/
1b560 6e 4f 6c 64 29 2e 0a 2a 2f 0a 73 74 61 74 69 63  nOld)..*/.static
1b570 20 69 6e 74 20 66 74 73 35 50 72 65 66 69 78 43   int fts5PrefixC
1b580 6f 6d 70 72 65 73 73 28 69 6e 74 20 6e 4f 6c 64  ompress(int nOld
1b590 2c 20 63 6f 6e 73 74 20 75 38 20 2a 70 4f 6c 64  , const u8 *pOld
1b5a0 2c 20 63 6f 6e 73 74 20 75 38 20 2a 70 4e 65 77  , const u8 *pNew
1b5b0 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f  ){.  int i;.  fo
1b5c0 72 28 69 3d 30 3b 20 69 3c 6e 4f 6c 64 3b 20 69  r(i=0; i<nOld; i
1b5d0 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 4f 6c  ++){.    if( pOl
1b5e0 64 5b 69 5d 21 3d 70 4e 65 77 5b 69 5d 20 29 20  d[i]!=pNew[i] ) 
1b5f0 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72 65 74  break;.  }.  ret
1b600 75 72 6e 20 69 3b 0a 7d 0a 0a 73 74 61 74 69 63  urn i;.}..static
1b610 20 76 6f 69 64 20 66 74 73 35 57 72 69 74 65 44   void fts5WriteD
1b620 6c 69 64 78 43 6c 65 61 72 28 0a 20 20 46 74 73  lidxClear(.  Fts
1b630 35 49 6e 64 65 78 20 2a 70 2c 20 0a 20 20 46 74  5Index *p, .  Ft
1b640 73 35 53 65 67 57 72 69 74 65 72 20 2a 70 57 72  s5SegWriter *pWr
1b650 69 74 65 72 2c 0a 20 20 69 6e 74 20 62 46 6c 75  iter,.  int bFlu
1b660 73 68 20 20 20 20 20 20 20 20 20 20 20 20 20 20  sh              
1b670 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 72          /* If tr
1b680 75 65 2c 20 77 72 69 74 65 20 64 6c 69 64 78 20  ue, write dlidx 
1b690 74 6f 20 64 69 73 6b 20 2a 2f 0a 29 7b 0a 20 20  to disk */.){.  
1b6a0 69 6e 74 20 69 3b 0a 20 20 61 73 73 65 72 74 28  int i;.  assert(
1b6b0 20 62 46 6c 75 73 68 3d 3d 30 20 7c 7c 20 28 70   bFlush==0 || (p
1b6c0 57 72 69 74 65 72 2d 3e 6e 44 6c 69 64 78 3e 30  Writer->nDlidx>0
1b6d0 20 26 26 20 70 57 72 69 74 65 72 2d 3e 61 44 6c   && pWriter->aDl
1b6e0 69 64 78 5b 30 5d 2e 62 75 66 2e 6e 3e 30 29 20  idx[0].buf.n>0) 
1b6f0 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  );.  for(i=0; i<
1b700 70 57 72 69 74 65 72 2d 3e 6e 44 6c 69 64 78 3b  pWriter->nDlidx;
1b710 20 69 2b 2b 29 7b 0a 20 20 20 20 46 74 73 35 44   i++){.    Fts5D
1b720 6c 69 64 78 57 72 69 74 65 72 20 2a 70 44 6c 69  lidxWriter *pDli
1b730 64 78 20 3d 20 26 70 57 72 69 74 65 72 2d 3e 61  dx = &pWriter->a
1b740 44 6c 69 64 78 5b 69 5d 3b 0a 20 20 20 20 69 66  Dlidx[i];.    if
1b750 28 20 70 44 6c 69 64 78 2d 3e 62 75 66 2e 6e 3d  ( pDlidx->buf.n=
1b760 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  =0 ) break;.    
1b770 69 66 28 20 62 46 6c 75 73 68 20 29 7b 0a 20 20  if( bFlush ){.  
1b780 20 20 20 20 61 73 73 65 72 74 28 20 70 44 6c 69      assert( pDli
1b790 64 78 2d 3e 70 67 6e 6f 21 3d 30 20 29 3b 0a 20  dx->pgno!=0 );. 
1b7a0 20 20 20 20 20 66 74 73 35 44 61 74 61 57 72 69       fts5DataWri
1b7b0 74 65 28 70 2c 20 0a 20 20 20 20 20 20 20 20 20  te(p, .         
1b7c0 20 46 54 53 35 5f 44 4c 49 44 58 5f 52 4f 57 49   FTS5_DLIDX_ROWI
1b7d0 44 28 70 57 72 69 74 65 72 2d 3e 69 53 65 67 69  D(pWriter->iSegi
1b7e0 64 2c 20 69 2c 20 70 44 6c 69 64 78 2d 3e 70 67  d, i, pDlidx->pg
1b7f0 6e 6f 29 2c 0a 20 20 20 20 20 20 20 20 20 20 70  no),.          p
1b800 44 6c 69 64 78 2d 3e 62 75 66 2e 70 2c 20 70 44  Dlidx->buf.p, pD
1b810 6c 69 64 78 2d 3e 62 75 66 2e 6e 0a 20 20 20 20  lidx->buf.n.    
1b820 20 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73    );.    }.    s
1b830 71 6c 69 74 65 33 46 74 73 35 42 75 66 66 65 72  qlite3Fts5Buffer
1b840 5a 65 72 6f 28 26 70 44 6c 69 64 78 2d 3e 62 75  Zero(&pDlidx->bu
1b850 66 29 3b 0a 20 20 20 20 70 44 6c 69 64 78 2d 3e  f);.    pDlidx->
1b860 62 50 72 65 76 56 61 6c 69 64 20 3d 20 30 3b 0a  bPrevValid = 0;.
1b870 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 72 6f    }.}../*.** Gro
1b880 77 20 74 68 65 20 70 57 72 69 74 65 72 2d 3e 61  w the pWriter->a
1b890 44 6c 69 64 78 5b 5d 20 61 72 72 61 79 20 74 6f  Dlidx[] array to
1b8a0 20 61 74 20 6c 65 61 73 74 20 6e 4c 76 6c 20 65   at least nLvl e
1b8b0 6c 65 6d 65 6e 74 73 20 69 6e 20 73 69 7a 65 2e  lements in size.
1b8c0 0a 2a 2a 20 41 6e 79 20 6e 65 77 20 61 72 72 61  .** Any new arra
1b8d0 79 20 65 6c 65 6d 65 6e 74 73 20 61 72 65 20 7a  y elements are z
1b8e0 65 72 6f 65 64 20 62 65 66 6f 72 65 20 72 65 74  eroed before ret
1b8f0 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69  urning..*/.stati
1b900 63 20 69 6e 74 20 66 74 73 35 57 72 69 74 65 44  c int fts5WriteD
1b910 6c 69 64 78 47 72 6f 77 28 0a 20 20 46 74 73 35  lidxGrow(.  Fts5
1b920 49 6e 64 65 78 20 2a 70 2c 0a 20 20 46 74 73 35  Index *p,.  Fts5
1b930 53 65 67 57 72 69 74 65 72 20 2a 70 57 72 69 74  SegWriter *pWrit
1b940 65 72 2c 0a 20 20 69 6e 74 20 6e 4c 76 6c 0a 29  er,.  int nLvl.)
1b950 7b 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53  {.  if( p->rc==S
1b960 51 4c 49 54 45 5f 4f 4b 20 26 26 20 6e 4c 76 6c  QLITE_OK && nLvl
1b970 3e 3d 70 57 72 69 74 65 72 2d 3e 6e 44 6c 69 64  >=pWriter->nDlid
1b980 78 20 29 7b 0a 20 20 20 20 46 74 73 35 44 6c 69  x ){.    Fts5Dli
1b990 64 78 57 72 69 74 65 72 20 2a 61 44 6c 69 64 78  dxWriter *aDlidx
1b9a0 20 3d 20 28 46 74 73 35 44 6c 69 64 78 57 72 69   = (Fts5DlidxWri
1b9b0 74 65 72 2a 29 73 71 6c 69 74 65 33 5f 72 65 61  ter*)sqlite3_rea
1b9c0 6c 6c 6f 63 28 0a 20 20 20 20 20 20 20 20 70 57  lloc(.        pW
1b9d0 72 69 74 65 72 2d 3e 61 44 6c 69 64 78 2c 20 73  riter->aDlidx, s
1b9e0 69 7a 65 6f 66 28 46 74 73 35 44 6c 69 64 78 57  izeof(Fts5DlidxW
1b9f0 72 69 74 65 72 29 20 2a 20 6e 4c 76 6c 0a 20 20  riter) * nLvl.  
1ba00 20 20 29 3b 0a 20 20 20 20 69 66 28 20 61 44 6c    );.    if( aDl
1ba10 69 64 78 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  idx==0 ){.      
1ba20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e  p->rc = SQLITE_N
1ba30 4f 4d 45 4d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  OMEM;.    }else{
1ba40 0a 20 20 20 20 20 20 69 6e 74 20 6e 42 79 74 65  .      int nByte
1ba50 20 3d 20 73 69 7a 65 6f 66 28 46 74 73 35 44 6c   = sizeof(Fts5Dl
1ba60 69 64 78 57 72 69 74 65 72 29 20 2a 20 28 6e 4c  idxWriter) * (nL
1ba70 76 6c 20 2d 20 70 57 72 69 74 65 72 2d 3e 6e 44  vl - pWriter->nD
1ba80 6c 69 64 78 29 3b 0a 20 20 20 20 20 20 6d 65 6d  lidx);.      mem
1ba90 73 65 74 28 26 61 44 6c 69 64 78 5b 70 57 72 69  set(&aDlidx[pWri
1baa0 74 65 72 2d 3e 6e 44 6c 69 64 78 5d 2c 20 30 2c  ter->nDlidx], 0,
1bab0 20 6e 42 79 74 65 29 3b 0a 20 20 20 20 20 20 70   nByte);.      p
1bac0 57 72 69 74 65 72 2d 3e 61 44 6c 69 64 78 20 3d  Writer->aDlidx =
1bad0 20 61 44 6c 69 64 78 3b 0a 20 20 20 20 20 20 70   aDlidx;.      p
1bae0 57 72 69 74 65 72 2d 3e 6e 44 6c 69 64 78 20 3d  Writer->nDlidx =
1baf0 20 6e 4c 76 6c 3b 0a 20 20 20 20 7d 0a 20 20 7d   nLvl;.    }.  }
1bb00 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e 72 63 3b  .  return p->rc;
1bb10 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65  .}../*.** If the
1bb20 20 63 75 72 72 65 6e 74 20 64 6f 63 6c 69 73 74   current doclist
1bb30 2d 69 6e 64 65 78 20 61 63 63 75 6d 75 6c 61 74  -index accumulat
1bb40 69 6e 67 20 69 6e 20 70 57 72 69 74 65 72 2d 3e  ing in pWriter->
1bb50 61 44 6c 69 64 78 5b 5d 20 69 73 20 6c 61 72 67  aDlidx[] is larg
1bb60 65 0a 2a 2a 20 65 6e 6f 75 67 68 2c 20 66 6c 75  e.** enough, flu
1bb70 73 68 20 69 74 20 74 6f 20 64 69 73 6b 20 61 6e  sh it to disk an
1bb80 64 20 72 65 74 75 72 6e 20 31 2e 20 4f 74 68 65  d return 1. Othe
1bb90 72 77 69 73 65 20 64 69 73 63 61 72 64 20 69 74  rwise discard it
1bba0 20 61 6e 64 20 72 65 74 75 72 6e 0a 2a 2a 20 7a   and return.** z
1bbb0 65 72 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ero..*/.static i
1bbc0 6e 74 20 66 74 73 35 57 72 69 74 65 46 6c 75 73  nt fts5WriteFlus
1bbd0 68 44 6c 69 64 78 28 46 74 73 35 49 6e 64 65 78  hDlidx(Fts5Index
1bbe0 20 2a 70 2c 20 46 74 73 35 53 65 67 57 72 69 74   *p, Fts5SegWrit
1bbf0 65 72 20 2a 70 57 72 69 74 65 72 29 7b 0a 20 20  er *pWriter){.  
1bc00 69 6e 74 20 62 46 6c 61 67 20 3d 20 30 3b 0a 0a  int bFlag = 0;..
1bc10 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 77 65    /* If there we
1bc20 72 65 20 46 54 53 35 5f 4d 49 4e 5f 44 4c 49 44  re FTS5_MIN_DLID
1bc30 58 5f 53 49 5a 45 20 6f 72 20 6d 6f 72 65 20 65  X_SIZE or more e
1bc40 6d 70 74 79 20 6c 65 61 66 20 70 61 67 65 73 20  mpty leaf pages 
1bc50 77 72 69 74 74 65 6e 0a 20 20 2a 2a 20 74 6f 20  written.  ** to 
1bc60 74 68 65 20 64 61 74 61 62 61 73 65 2c 20 61 6c  the database, al
1bc70 73 6f 20 77 72 69 74 65 20 74 68 65 20 64 6f 63  so write the doc
1bc80 6c 69 73 74 2d 69 6e 64 65 78 20 74 6f 20 64 69  list-index to di
1bc90 73 6b 2e 20 20 2a 2f 0a 20 20 69 66 28 20 70 57  sk.  */.  if( pW
1bca0 72 69 74 65 72 2d 3e 61 44 6c 69 64 78 5b 30 5d  riter->aDlidx[0]
1bcb0 2e 62 75 66 2e 6e 3e 30 20 26 26 20 70 57 72 69  .buf.n>0 && pWri
1bcc0 74 65 72 2d 3e 6e 45 6d 70 74 79 3e 3d 46 54 53  ter->nEmpty>=FTS
1bcd0 35 5f 4d 49 4e 5f 44 4c 49 44 58 5f 53 49 5a 45  5_MIN_DLIDX_SIZE
1bce0 20 29 7b 0a 20 20 20 20 62 46 6c 61 67 20 3d 20   ){.    bFlag = 
1bcf0 31 3b 0a 20 20 7d 0a 20 20 66 74 73 35 57 72 69  1;.  }.  fts5Wri
1bd00 74 65 44 6c 69 64 78 43 6c 65 61 72 28 70 2c 20  teDlidxClear(p, 
1bd10 70 57 72 69 74 65 72 2c 20 62 46 6c 61 67 29 3b  pWriter, bFlag);
1bd20 0a 20 20 70 57 72 69 74 65 72 2d 3e 6e 45 6d 70  .  pWriter->nEmp
1bd30 74 79 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e  ty = 0;.  return
1bd40 20 62 46 6c 61 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   bFlag;.}../*.**
1bd50 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
1bd60 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 65 76 65  s called wheneve
1bd70 72 20 70 72 6f 63 65 73 73 69 6e 67 20 6f 66 20  r processing of 
1bd80 74 68 65 20 64 6f 63 6c 69 73 74 20 66 6f 72 20  the doclist for 
1bd90 74 68 65 20 0a 2a 2a 20 6c 61 73 74 20 74 65 72  the .** last ter
1bda0 6d 20 6f 6e 20 6c 65 61 66 20 70 61 67 65 20 28  m on leaf page (
1bdb0 70 57 72 69 74 65 72 2d 3e 69 42 74 50 61 67 65  pWriter->iBtPage
1bdc0 29 20 69 73 20 63 6f 6d 70 6c 65 74 65 64 2e 20  ) is completed. 
1bdd0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 6f 63 6c 69  .**.** The docli
1bde0 73 74 2d 69 6e 64 65 78 20 66 6f 72 20 74 68 61  st-index for tha
1bdf0 74 20 74 65 72 6d 20 69 73 20 63 75 72 72 65 6e  t term is curren
1be00 74 6c 79 20 73 74 6f 72 65 64 20 69 6e 2d 6d 65  tly stored in-me
1be10 6d 6f 72 79 20 77 69 74 68 69 6e 20 74 68 65 0a  mory within the.
1be20 2a 2a 20 46 74 73 35 53 65 67 57 72 69 74 65 72  ** Fts5SegWriter
1be30 2e 61 44 6c 69 64 78 5b 5d 20 61 72 72 61 79 2e  .aDlidx[] array.
1be40 20 49 66 20 69 74 20 69 73 20 6c 61 72 67 65 20   If it is large 
1be50 65 6e 6f 75 67 68 2c 20 74 68 69 73 20 66 75 6e  enough, this fun
1be60 63 74 69 6f 6e 0a 2a 2a 20 77 72 69 74 65 73 20  ction.** writes 
1be70 69 74 20 6f 75 74 20 74 6f 20 64 69 73 6b 2e 20  it out to disk. 
1be80 4f 72 2c 20 69 66 20 69 74 20 69 73 20 74 6f 6f  Or, if it is too
1be90 20 73 6d 61 6c 6c 20 74 6f 20 62 6f 74 68 65 72   small to bother
1bea0 20 77 69 74 68 2c 20 64 69 73 63 61 72 64 73 0a   with, discards.
1beb0 2a 2a 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 46 74 73  ** it..**.** Fts
1bec0 35 53 65 67 57 72 69 74 65 72 2e 62 74 74 65 72  5SegWriter.btter
1bed0 6d 20 63 75 72 72 65 6e 74 6c 79 20 63 6f 6e 74  m currently cont
1bee0 61 69 6e 73 20 74 68 65 20 66 69 72 73 74 20 74  ains the first t
1bef0 65 72 6d 20 6f 6e 20 70 61 67 65 20 69 42 74 50  erm on page iBtP
1bf00 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  age..*/.static v
1bf10 6f 69 64 20 66 74 73 35 57 72 69 74 65 46 6c 75  oid fts5WriteFlu
1bf20 73 68 42 74 72 65 65 28 46 74 73 35 49 6e 64 65  shBtree(Fts5Inde
1bf30 78 20 2a 70 2c 20 46 74 73 35 53 65 67 57 72 69  x *p, Fts5SegWri
1bf40 74 65 72 20 2a 70 57 72 69 74 65 72 29 7b 0a 20  ter *pWriter){. 
1bf50 20 69 6e 74 20 62 46 6c 61 67 3b 0a 0a 20 20 61   int bFlag;..  a
1bf60 73 73 65 72 74 28 20 70 57 72 69 74 65 72 2d 3e  ssert( pWriter->
1bf70 69 42 74 50 61 67 65 20 7c 7c 20 70 57 72 69 74  iBtPage || pWrit
1bf80 65 72 2d 3e 6e 45 6d 70 74 79 3d 3d 30 20 29 3b  er->nEmpty==0 );
1bf90 0a 20 20 69 66 28 20 70 57 72 69 74 65 72 2d 3e  .  if( pWriter->
1bfa0 69 42 74 50 61 67 65 3d 3d 30 20 29 20 72 65 74  iBtPage==0 ) ret
1bfb0 75 72 6e 3b 0a 20 20 62 46 6c 61 67 20 3d 20 66  urn;.  bFlag = f
1bfc0 74 73 35 57 72 69 74 65 46 6c 75 73 68 44 6c 69  ts5WriteFlushDli
1bfd0 64 78 28 70 2c 20 70 57 72 69 74 65 72 29 3b 0a  dx(p, pWriter);.
1bfe0 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51  .  if( p->rc==SQ
1bff0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 63  LITE_OK ){.    c
1c000 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 28  onst char *z = (
1c010 70 57 72 69 74 65 72 2d 3e 62 74 74 65 72 6d 2e  pWriter->btterm.
1c020 6e 3e 30 3f 28 63 6f 6e 73 74 20 63 68 61 72 2a  n>0?(const char*
1c030 29 70 57 72 69 74 65 72 2d 3e 62 74 74 65 72 6d  )pWriter->btterm
1c040 2e 70 3a 22 22 29 3b 0a 20 20 20 20 2f 2a 20 54  .p:"");.    /* T
1c050 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 77 61 73  he following was
1c060 20 61 6c 72 65 61 64 79 20 64 6f 6e 65 20 69 6e   already done in
1c070 20 66 74 73 35 57 72 69 74 65 49 6e 69 74 28 29   fts5WriteInit()
1c080 3a 20 2a 2f 0a 20 20 20 20 2f 2a 20 73 71 6c 69  : */.    /* sqli
1c090 74 65 33 5f 62 69 6e 64 5f 69 6e 74 28 70 2d 3e  te3_bind_int(p->
1c0a0 70 49 64 78 57 72 69 74 65 72 2c 20 31 2c 20 70  pIdxWriter, 1, p
1c0b0 57 72 69 74 65 72 2d 3e 69 53 65 67 69 64 29 3b  Writer->iSegid);
1c0c0 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   */.    sqlite3_
1c0d0 62 69 6e 64 5f 62 6c 6f 62 28 70 2d 3e 70 49 64  bind_blob(p->pId
1c0e0 78 57 72 69 74 65 72 2c 20 32 2c 20 7a 2c 20 70  xWriter, 2, z, p
1c0f0 57 72 69 74 65 72 2d 3e 62 74 74 65 72 6d 2e 6e  Writer->btterm.n
1c100 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29  , SQLITE_STATIC)
1c110 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69  ;.    sqlite3_bi
1c120 6e 64 5f 69 6e 74 36 34 28 70 2d 3e 70 49 64 78  nd_int64(p->pIdx
1c130 57 72 69 74 65 72 2c 20 33 2c 20 62 46 6c 61 67  Writer, 3, bFlag
1c140 20 2b 20 28 28 69 36 34 29 70 57 72 69 74 65 72   + ((i64)pWriter
1c150 2d 3e 69 42 74 50 61 67 65 3c 3c 31 29 29 3b 0a  ->iBtPage<<1));.
1c160 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 65 70      sqlite3_step
1c170 28 70 2d 3e 70 49 64 78 57 72 69 74 65 72 29 3b  (p->pIdxWriter);
1c180 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 73 71 6c  .    p->rc = sql
1c190 69 74 65 33 5f 72 65 73 65 74 28 70 2d 3e 70 49  ite3_reset(p->pI
1c1a0 64 78 57 72 69 74 65 72 29 3b 0a 20 20 7d 0a 20  dxWriter);.  }. 
1c1b0 20 70 57 72 69 74 65 72 2d 3e 69 42 74 50 61 67   pWriter->iBtPag
1c1c0 65 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  e = 0;.}../*.** 
1c1d0 54 68 69 73 20 69 73 20 63 61 6c 6c 65 64 20 6f  This is called o
1c1e0 6e 63 65 20 66 6f 72 20 65 61 63 68 20 6c 65 61  nce for each lea
1c1f0 66 20 70 61 67 65 20 65 78 63 65 70 74 20 74 68  f page except th
1c200 65 20 66 69 72 73 74 20 74 68 61 74 20 63 6f 6e  e first that con
1c210 74 61 69 6e 73 0a 2a 2a 20 61 74 20 6c 65 61 73  tains.** at leas
1c220 74 20 6f 6e 65 20 74 65 72 6d 2e 20 41 72 67 75  t one term. Argu
1c230 6d 65 6e 74 20 28 6e 54 65 72 6d 2f 70 54 65 72  ment (nTerm/pTer
1c240 6d 29 20 69 73 20 74 68 65 20 73 70 6c 69 74 2d  m) is the split-
1c250 6b 65 79 20 2d 20 61 20 74 65 72 6d 20 74 68 61  key - a term tha
1c260 74 0a 2a 2a 20 69 73 20 6c 61 72 67 65 72 20 74  t.** is larger t
1c270 68 61 6e 20 61 6c 6c 20 74 65 72 6d 73 20 77 72  han all terms wr
1c280 69 74 74 65 6e 20 74 6f 20 65 61 72 6c 69 65 72  itten to earlier
1c290 20 6c 65 61 76 65 73 2c 20 61 6e 64 20 65 71 75   leaves, and equ
1c2a0 61 6c 20 74 6f 20 6f 72 0a 2a 2a 20 73 6d 61 6c  al to or.** smal
1c2b0 6c 65 72 20 74 68 61 6e 20 74 68 65 20 66 69 72  ler than the fir
1c2c0 73 74 20 74 65 72 6d 20 6f 6e 20 74 68 65 20 6e  st term on the n
1c2d0 65 77 20 6c 65 61 66 2e 0a 2a 2a 0a 2a 2a 20 49  ew leaf..**.** I
1c2e0 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
1c2f0 73 2c 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  s, an error code
1c300 20 69 73 20 6c 65 66 74 20 69 6e 20 46 74 73 35   is left in Fts5
1c310 49 6e 64 65 78 2e 72 63 2e 20 49 66 20 61 6e 20  Index.rc. If an 
1c320 65 72 72 6f 72 0a 2a 2a 20 68 61 73 20 61 6c 72  error.** has alr
1c330 65 61 64 79 20 6f 63 63 75 72 72 65 64 20 77 68  eady occurred wh
1c340 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
1c350 20 69 73 20 63 61 6c 6c 65 64 2c 20 69 74 20 69   is called, it i
1c360 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74  s a no-op..*/.st
1c370 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 57 72  atic void fts5Wr
1c380 69 74 65 42 74 72 65 65 54 65 72 6d 28 0a 20 20  iteBtreeTerm(.  
1c390 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 20 20  Fts5Index *p,   
1c3a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c3b0 2f 2a 20 46 54 53 35 20 62 61 63 6b 65 6e 64 20  /* FTS5 backend 
1c3c0 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 46 74 73 35  object */.  Fts5
1c3d0 53 65 67 57 72 69 74 65 72 20 2a 70 57 72 69 74  SegWriter *pWrit
1c3e0 65 72 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 57  er,         /* W
1c3f0 72 69 74 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a  riter object */.
1c400 20 20 69 6e 74 20 6e 54 65 72 6d 2c 20 63 6f 6e    int nTerm, con
1c410 73 74 20 75 38 20 2a 70 54 65 72 6d 20 20 20 20  st u8 *pTerm    
1c420 20 20 2f 2a 20 46 69 72 73 74 20 74 65 72 6d 20    /* First term 
1c430 6f 6e 20 6e 65 77 20 70 61 67 65 20 2a 2f 0a 29  on new page */.)
1c440 7b 0a 20 20 66 74 73 35 57 72 69 74 65 46 6c 75  {.  fts5WriteFlu
1c450 73 68 42 74 72 65 65 28 70 2c 20 70 57 72 69 74  shBtree(p, pWrit
1c460 65 72 29 3b 0a 20 20 66 74 73 35 42 75 66 66 65  er);.  fts5Buffe
1c470 72 53 65 74 28 26 70 2d 3e 72 63 2c 20 26 70 57  rSet(&p->rc, &pW
1c480 72 69 74 65 72 2d 3e 62 74 74 65 72 6d 2c 20 6e  riter->btterm, n
1c490 54 65 72 6d 2c 20 70 54 65 72 6d 29 3b 0a 20 20  Term, pTerm);.  
1c4a0 70 57 72 69 74 65 72 2d 3e 69 42 74 50 61 67 65  pWriter->iBtPage
1c4b0 20 3d 20 70 57 72 69 74 65 72 2d 3e 77 72 69 74   = pWriter->writ
1c4c0 65 72 2e 70 67 6e 6f 3b 0a 7d 0a 0a 2f 2a 0a 2a  er.pgno;.}../*.*
1c4d0 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
1c4e0 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 66  is called when f
1c4f0 6c 75 73 68 69 6e 67 20 61 20 6c 65 61 66 20 70  lushing a leaf p
1c500 61 67 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e  age that contain
1c510 73 20 6e 6f 0a 2a 2a 20 74 65 72 6d 73 20 61 74  s no.** terms at
1c520 20 61 6c 6c 20 74 6f 20 64 69 73 6b 2e 0a 2a 2f   all to disk..*/
1c530 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
1c540 35 57 72 69 74 65 42 74 72 65 65 4e 6f 54 65 72  5WriteBtreeNoTer
1c550 6d 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a  m(.  Fts5Index *
1c560 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
1c570 20 20 20 20 20 2f 2a 20 46 54 53 35 20 62 61 63       /* FTS5 bac
1c580 6b 65 6e 64 20 6f 62 6a 65 63 74 20 2a 2f 0a 20  kend object */. 
1c590 20 46 74 73 35 53 65 67 57 72 69 74 65 72 20 2a   Fts5SegWriter *
1c5a0 70 57 72 69 74 65 72 20 20 20 20 20 20 20 20 20  pWriter         
1c5b0 20 2f 2a 20 57 72 69 74 65 72 20 6f 62 6a 65 63   /* Writer objec
1c5c0 74 20 2a 2f 0a 29 7b 0a 20 20 2f 2a 20 49 66 20  t */.){.  /* If 
1c5d0 74 68 65 72 65 20 77 65 72 65 20 6e 6f 20 72 6f  there were no ro
1c5e0 77 69 64 73 20 6f 6e 20 74 68 65 20 6c 65 61 66  wids on the leaf
1c5f0 20 70 61 67 65 20 65 69 74 68 65 72 20 61 6e 64   page either and
1c600 20 74 68 65 20 64 6f 63 6c 69 73 74 2d 69 6e 64   the doclist-ind
1c610 65 78 0a 20 20 2a 2a 20 68 61 73 20 61 6c 72 65  ex.  ** has alre
1c620 61 64 79 20 62 65 65 6e 20 73 74 61 72 74 65 64  ady been started
1c630 2c 20 61 70 70 65 6e 64 20 61 6e 20 30 78 30 30  , append an 0x00
1c640 20 62 79 74 65 20 74 6f 20 69 74 2e 20 20 2a 2f   byte to it.  */
1c650 0a 20 20 69 66 28 20 70 57 72 69 74 65 72 2d 3e  .  if( pWriter->
1c660 62 46 69 72 73 74 52 6f 77 69 64 49 6e 50 61 67  bFirstRowidInPag
1c670 65 20 26 26 20 70 57 72 69 74 65 72 2d 3e 61 44  e && pWriter->aD
1c680 6c 69 64 78 5b 30 5d 2e 62 75 66 2e 6e 3e 30 20  lidx[0].buf.n>0 
1c690 29 7b 0a 20 20 20 20 46 74 73 35 44 6c 69 64 78  ){.    Fts5Dlidx
1c6a0 57 72 69 74 65 72 20 2a 70 44 6c 69 64 78 20 3d  Writer *pDlidx =
1c6b0 20 26 70 57 72 69 74 65 72 2d 3e 61 44 6c 69 64   &pWriter->aDlid
1c6c0 78 5b 30 5d 3b 0a 20 20 20 20 61 73 73 65 72 74  x[0];.    assert
1c6d0 28 20 70 44 6c 69 64 78 2d 3e 62 50 72 65 76 56  ( pDlidx->bPrevV
1c6e0 61 6c 69 64 20 29 3b 0a 20 20 20 20 73 71 6c 69  alid );.    sqli
1c6f0 74 65 33 46 74 73 35 42 75 66 66 65 72 41 70 70  te3Fts5BufferApp
1c700 65 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e 72 63  endVarint(&p->rc
1c710 2c 20 26 70 44 6c 69 64 78 2d 3e 62 75 66 2c 20  , &pDlidx->buf, 
1c720 30 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 6e  0);.  }..  /* In
1c730 63 72 65 6d 65 6e 74 20 74 68 65 20 22 6e 75 6d  crement the "num
1c740 62 65 72 20 6f 66 20 73 65 71 75 65 6e 74 69 61  ber of sequentia
1c750 6c 20 6c 65 61 76 65 73 20 77 69 74 68 6f 75 74  l leaves without
1c760 20 61 20 74 65 72 6d 22 20 63 6f 75 6e 74 65 72   a term" counter
1c770 2e 20 2a 2f 0a 20 20 70 57 72 69 74 65 72 2d 3e  . */.  pWriter->
1c780 6e 45 6d 70 74 79 2b 2b 3b 0a 7d 0a 0a 73 74 61  nEmpty++;.}..sta
1c790 74 69 63 20 69 36 34 20 66 74 73 35 44 6c 69 64  tic i64 fts5Dlid
1c7a0 78 45 78 74 72 61 63 74 46 69 72 73 74 52 6f 77  xExtractFirstRow
1c7b0 69 64 28 46 74 73 35 42 75 66 66 65 72 20 2a 70  id(Fts5Buffer *p
1c7c0 42 75 66 29 7b 0a 20 20 69 36 34 20 69 52 6f 77  Buf){.  i64 iRow
1c7d0 69 64 3b 0a 20 20 69 6e 74 20 69 4f 66 66 3b 0a  id;.  int iOff;.
1c7e0 0a 20 20 69 4f 66 66 20 3d 20 31 20 2b 20 66 74  .  iOff = 1 + ft
1c7f0 73 35 47 65 74 56 61 72 69 6e 74 28 26 70 42 75  s5GetVarint(&pBu
1c800 66 2d 3e 70 5b 31 5d 2c 20 28 75 36 34 2a 29 26  f->p[1], (u64*)&
1c810 69 52 6f 77 69 64 29 3b 0a 20 20 66 74 73 35 47  iRowid);.  fts5G
1c820 65 74 56 61 72 69 6e 74 28 26 70 42 75 66 2d 3e  etVarint(&pBuf->
1c830 70 5b 69 4f 66 66 5d 2c 20 28 75 36 34 2a 29 26  p[iOff], (u64*)&
1c840 69 52 6f 77 69 64 29 3b 0a 20 20 72 65 74 75 72  iRowid);.  retur
1c850 6e 20 69 52 6f 77 69 64 3b 0a 7d 0a 0a 2f 2a 0a  n iRowid;.}../*.
1c860 2a 2a 20 52 6f 77 69 64 20 69 52 6f 77 69 64 20  ** Rowid iRowid 
1c870 68 61 73 20 6a 75 73 74 20 62 65 65 6e 20 61 70  has just been ap
1c880 70 65 6e 64 65 64 20 74 6f 20 74 68 65 20 63 75  pended to the cu
1c890 72 72 65 6e 74 20 6c 65 61 66 20 70 61 67 65 2e  rrent leaf page.
1c8a0 20 49 74 20 69 73 20 74 68 65 0a 2a 2a 20 66 69   It is the.** fi
1c8b0 72 73 74 20 6f 6e 20 74 68 65 20 70 61 67 65 2e  rst on the page.
1c8c0 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61   This function a
1c8d0 70 70 65 6e 64 73 20 61 6e 20 61 70 70 72 6f 70  ppends an approp
1c8e0 72 69 61 74 65 20 65 6e 74 72 79 20 74 6f 20 74  riate entry to t
1c8f0 68 65 20 63 75 72 72 65 6e 74 0a 2a 2a 20 64 6f  he current.** do
1c900 63 6c 69 73 74 2d 69 6e 64 65 78 2e 0a 2a 2f 0a  clist-index..*/.
1c910 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
1c920 57 72 69 74 65 44 6c 69 64 78 41 70 70 65 6e 64  WriteDlidxAppend
1c930 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70  (.  Fts5Index *p
1c940 2c 20 0a 20 20 46 74 73 35 53 65 67 57 72 69 74  , .  Fts5SegWrit
1c950 65 72 20 2a 70 57 72 69 74 65 72 2c 20 0a 20 20  er *pWriter, .  
1c960 69 36 34 20 69 52 6f 77 69 64 0a 29 7b 0a 20 20  i64 iRowid.){.  
1c970 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 62 44 6f  int i;.  int bDo
1c980 6e 65 20 3d 20 30 3b 0a 0a 20 20 66 6f 72 28 69  ne = 0;..  for(i
1c990 3d 30 3b 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  =0; p->rc==SQLIT
1c9a0 45 5f 4f 4b 20 26 26 20 62 44 6f 6e 65 3d 3d 30  E_OK && bDone==0
1c9b0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 36 34 20  ; i++){.    i64 
1c9c0 69 56 61 6c 3b 0a 20 20 20 20 46 74 73 35 44 6c  iVal;.    Fts5Dl
1c9d0 69 64 78 57 72 69 74 65 72 20 2a 70 44 6c 69 64  idxWriter *pDlid
1c9e0 78 20 3d 20 26 70 57 72 69 74 65 72 2d 3e 61 44  x = &pWriter->aD
1c9f0 6c 69 64 78 5b 69 5d 3b 0a 0a 20 20 20 20 69 66  lidx[i];..    if
1ca00 28 20 70 44 6c 69 64 78 2d 3e 62 75 66 2e 6e 3e  ( pDlidx->buf.n>
1ca10 3d 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e 70 67 73  =p->pConfig->pgs
1ca20 7a 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68  z ){.      /* Th
1ca30 65 20 63 75 72 72 65 6e 74 20 64 6f 63 6c 69 73  e current doclis
1ca40 74 2d 69 6e 64 65 78 20 70 61 67 65 20 69 73 20  t-index page is 
1ca50 66 75 6c 6c 2e 20 57 72 69 74 65 20 69 74 20 74  full. Write it t
1ca60 6f 20 64 69 73 6b 20 61 6e 64 20 70 75 73 68 0a  o disk and push.
1ca70 20 20 20 20 20 20 2a 2a 20 61 20 63 6f 70 79 20        ** a copy 
1ca80 6f 66 20 69 52 6f 77 69 64 20 28 77 68 69 63 68  of iRowid (which
1ca90 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20 74 68 65   will become the
1caa0 20 66 69 72 73 74 20 72 6f 77 69 64 20 6f 6e 20   first rowid on 
1cab0 74 68 65 20 6e 65 78 74 0a 20 20 20 20 20 20 2a  the next.      *
1cac0 2a 20 64 6f 63 6c 69 73 74 2d 69 6e 64 65 78 20  * doclist-index 
1cad0 6c 65 61 66 20 70 61 67 65 29 20 75 70 20 69 6e  leaf page) up in
1cae0 74 6f 20 74 68 65 20 6e 65 78 74 20 6c 65 76 65  to the next leve
1caf0 6c 20 6f 66 20 74 68 65 20 62 2d 74 72 65 65 20  l of the b-tree 
1cb00 0a 20 20 20 20 20 20 2a 2a 20 68 69 65 72 61 72  .      ** hierar
1cb10 63 68 79 2e 20 49 66 20 74 68 65 20 6e 6f 64 65  chy. If the node
1cb20 20 62 65 69 6e 67 20 66 6c 75 73 68 65 64 20 69   being flushed i
1cb30 73 20 63 75 72 72 65 6e 74 6c 79 20 74 68 65 20  s currently the 
1cb40 72 6f 6f 74 20 6e 6f 64 65 2c 0a 20 20 20 20 20  root node,.     
1cb50 20 2a 2a 20 61 6c 73 6f 20 70 75 73 68 20 69 74   ** also push it
1cb60 73 20 66 69 72 73 74 20 72 6f 77 69 64 20 75 70  s first rowid up
1cb70 77 61 72 64 73 2e 20 2a 2f 0a 20 20 20 20 20 20  wards. */.      
1cb80 70 44 6c 69 64 78 2d 3e 62 75 66 2e 70 5b 30 5d  pDlidx->buf.p[0]
1cb90 20 3d 20 30 78 30 31 3b 20 20 20 20 2f 2a 20 4e   = 0x01;    /* N
1cba0 6f 74 20 74 68 65 20 72 6f 6f 74 20 6e 6f 64 65  ot the root node
1cbb0 20 2a 2f 0a 20 20 20 20 20 20 66 74 73 35 44 61   */.      fts5Da
1cbc0 74 61 57 72 69 74 65 28 70 2c 20 0a 20 20 20 20  taWrite(p, .    
1cbd0 20 20 20 20 20 20 46 54 53 35 5f 44 4c 49 44 58        FTS5_DLIDX
1cbe0 5f 52 4f 57 49 44 28 70 57 72 69 74 65 72 2d 3e  _ROWID(pWriter->
1cbf0 69 53 65 67 69 64 2c 20 69 2c 20 70 44 6c 69 64  iSegid, i, pDlid
1cc00 78 2d 3e 70 67 6e 6f 29 2c 0a 20 20 20 20 20 20  x->pgno),.      
1cc10 20 20 20 20 70 44 6c 69 64 78 2d 3e 62 75 66 2e      pDlidx->buf.
1cc20 70 2c 20 70 44 6c 69 64 78 2d 3e 62 75 66 2e 6e  p, pDlidx->buf.n
1cc30 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20  .      );.      
1cc40 66 74 73 35 57 72 69 74 65 44 6c 69 64 78 47 72  fts5WriteDlidxGr
1cc50 6f 77 28 70 2c 20 70 57 72 69 74 65 72 2c 20 69  ow(p, pWriter, i
1cc60 2b 32 29 3b 0a 20 20 20 20 20 20 70 44 6c 69 64  +2);.      pDlid
1cc70 78 20 3d 20 26 70 57 72 69 74 65 72 2d 3e 61 44  x = &pWriter->aD
1cc80 6c 69 64 78 5b 69 5d 3b 0a 20 20 20 20 20 20 69  lidx[i];.      i
1cc90 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  f( p->rc==SQLITE
1cca0 5f 4f 4b 20 26 26 20 70 44 6c 69 64 78 5b 31 5d  _OK && pDlidx[1]
1ccb0 2e 62 75 66 2e 6e 3d 3d 30 20 29 7b 0a 20 20 20  .buf.n==0 ){.   
1ccc0 20 20 20 20 20 69 36 34 20 69 46 69 72 73 74 20       i64 iFirst 
1ccd0 3d 20 66 74 73 35 44 6c 69 64 78 45 78 74 72 61  = fts5DlidxExtra
1cce0 63 74 46 69 72 73 74 52 6f 77 69 64 28 26 70 44  ctFirstRowid(&pD
1ccf0 6c 69 64 78 2d 3e 62 75 66 29 3b 0a 0a 20 20 20  lidx->buf);..   
1cd00 20 20 20 20 20 2f 2a 20 54 68 69 73 20 77 61 73       /* This was
1cd10 20 74 68 65 20 72 6f 6f 74 20 6e 6f 64 65 2e 20   the root node. 
1cd20 50 75 73 68 20 69 74 73 20 66 69 72 73 74 20 72  Push its first r
1cd30 6f 77 69 64 20 75 70 20 74 6f 20 74 68 65 20 6e  owid up to the n
1cd40 65 77 20 72 6f 6f 74 2e 20 2a 2f 0a 20 20 20 20  ew root. */.    
1cd50 20 20 20 20 70 44 6c 69 64 78 5b 31 5d 2e 70 67      pDlidx[1].pg
1cd60 6e 6f 20 3d 20 70 44 6c 69 64 78 2d 3e 70 67 6e  no = pDlidx->pgn
1cd70 6f 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  o;.        sqlit
1cd80 65 33 46 74 73 35 42 75 66 66 65 72 41 70 70 65  e3Fts5BufferAppe
1cd90 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c  ndVarint(&p->rc,
1cda0 20 26 70 44 6c 69 64 78 5b 31 5d 2e 62 75 66 2c   &pDlidx[1].buf,
1cdb0 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c   0);.        sql
1cdc0 69 74 65 33 46 74 73 35 42 75 66 66 65 72 41 70  ite3Fts5BufferAp
1cdd0 70 65 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e 72  pendVarint(&p->r
1cde0 63 2c 20 26 70 44 6c 69 64 78 5b 31 5d 2e 62 75  c, &pDlidx[1].bu
1cdf0 66 2c 20 70 44 6c 69 64 78 2d 3e 70 67 6e 6f 29  f, pDlidx->pgno)
1ce00 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
1ce10 33 46 74 73 35 42 75 66 66 65 72 41 70 70 65 6e  3Fts5BufferAppen
1ce20 64 56 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20  dVarint(&p->rc, 
1ce30 26 70 44 6c 69 64 78 5b 31 5d 2e 62 75 66 2c 20  &pDlidx[1].buf, 
1ce40 69 46 69 72 73 74 29 3b 0a 20 20 20 20 20 20 20  iFirst);.       
1ce50 20 70 44 6c 69 64 78 5b 31 5d 2e 62 50 72 65 76   pDlidx[1].bPrev
1ce60 56 61 6c 69 64 20 3d 20 31 3b 0a 20 20 20 20 20  Valid = 1;.     
1ce70 20 20 20 70 44 6c 69 64 78 5b 31 5d 2e 69 50 72     pDlidx[1].iPr
1ce80 65 76 20 3d 20 69 46 69 72 73 74 3b 0a 20 20 20  ev = iFirst;.   
1ce90 20 20 20 7d 0a 0a 20 20 20 20 20 20 73 71 6c 69     }..      sqli
1cea0 74 65 33 46 74 73 35 42 75 66 66 65 72 5a 65 72  te3Fts5BufferZer
1ceb0 6f 28 26 70 44 6c 69 64 78 2d 3e 62 75 66 29 3b  o(&pDlidx->buf);
1cec0 0a 20 20 20 20 20 20 70 44 6c 69 64 78 2d 3e 62  .      pDlidx->b
1ced0 50 72 65 76 56 61 6c 69 64 20 3d 20 30 3b 0a 20  PrevValid = 0;. 
1cee0 20 20 20 20 20 70 44 6c 69 64 78 2d 3e 70 67 6e       pDlidx->pgn
1cef0 6f 2b 2b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  o++;.    }else{.
1cf00 20 20 20 20 20 20 62 44 6f 6e 65 20 3d 20 31 3b        bDone = 1;
1cf10 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20  .    }..    if( 
1cf20 70 44 6c 69 64 78 2d 3e 62 50 72 65 76 56 61 6c  pDlidx->bPrevVal
1cf30 69 64 20 29 7b 0a 20 20 20 20 20 20 69 56 61 6c  id ){.      iVal
1cf40 20 3d 20 69 52 6f 77 69 64 20 2d 20 70 44 6c 69   = iRowid - pDli
1cf50 64 78 2d 3e 69 50 72 65 76 3b 0a 20 20 20 20 7d  dx->iPrev;.    }
1cf60 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 36 34 20  else{.      i64 
1cf70 69 50 67 6e 6f 20 3d 20 28 69 3d 3d 30 20 3f 20  iPgno = (i==0 ? 
1cf80 70 57 72 69 74 65 72 2d 3e 77 72 69 74 65 72 2e  pWriter->writer.
1cf90 70 67 6e 6f 20 3a 20 70 44 6c 69 64 78 5b 2d 31  pgno : pDlidx[-1
1cfa0 5d 2e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 61  ].pgno);.      a
1cfb0 73 73 65 72 74 28 20 70 44 6c 69 64 78 2d 3e 62  ssert( pDlidx->b
1cfc0 75 66 2e 6e 3d 3d 30 20 29 3b 0a 20 20 20 20 20  uf.n==0 );.     
1cfd0 20 73 71 6c 69 74 65 33 46 74 73 35 42 75 66 66   sqlite3Fts5Buff
1cfe0 65 72 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26  erAppendVarint(&
1cff0 70 2d 3e 72 63 2c 20 26 70 44 6c 69 64 78 2d 3e  p->rc, &pDlidx->
1d000 62 75 66 2c 20 21 62 44 6f 6e 65 29 3b 0a 20 20  buf, !bDone);.  
1d010 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 42      sqlite3Fts5B
1d020 75 66 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e  ufferAppendVarin
1d030 74 28 26 70 2d 3e 72 63 2c 20 26 70 44 6c 69 64  t(&p->rc, &pDlid
1d040 78 2d 3e 62 75 66 2c 20 69 50 67 6e 6f 29 3b 0a  x->buf, iPgno);.
1d050 20 20 20 20 20 20 69 56 61 6c 20 3d 20 69 52 6f        iVal = iRo
1d060 77 69 64 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  wid;.    }..    
1d070 73 71 6c 69 74 65 33 46 74 73 35 42 75 66 66 65  sqlite3Fts5Buffe
1d080 72 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26 70  rAppendVarint(&p
1d090 2d 3e 72 63 2c 20 26 70 44 6c 69 64 78 2d 3e 62  ->rc, &pDlidx->b
1d0a0 75 66 2c 20 69 56 61 6c 29 3b 0a 20 20 20 20 70  uf, iVal);.    p
1d0b0 44 6c 69 64 78 2d 3e 62 50 72 65 76 56 61 6c 69  Dlidx->bPrevVali
1d0c0 64 20 3d 20 31 3b 0a 20 20 20 20 70 44 6c 69 64  d = 1;.    pDlid
1d0d0 78 2d 3e 69 50 72 65 76 20 3d 20 69 52 6f 77 69  x->iPrev = iRowi
1d0e0 64 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63  d;.  }.}..static
1d0f0 20 76 6f 69 64 20 66 74 73 35 57 72 69 74 65 46   void fts5WriteF
1d100 6c 75 73 68 4c 65 61 66 28 46 74 73 35 49 6e 64  lushLeaf(Fts5Ind
1d110 65 78 20 2a 70 2c 20 46 74 73 35 53 65 67 57 72  ex *p, Fts5SegWr
1d120 69 74 65 72 20 2a 70 57 72 69 74 65 72 29 7b 0a  iter *pWriter){.
1d130 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75    static const u
1d140 38 20 7a 65 72 6f 5b 5d 20 3d 20 7b 20 30 78 30  8 zero[] = { 0x0
1d150 30 2c 20 30 78 30 30 2c 20 30 78 30 30 2c 20 30  0, 0x00, 0x00, 0
1d160 78 30 30 20 7d 3b 0a 20 20 46 74 73 35 50 61 67  x00 };.  Fts5Pag
1d170 65 57 72 69 74 65 72 20 2a 70 50 61 67 65 20 3d  eWriter *pPage =
1d180 20 26 70 57 72 69 74 65 72 2d 3e 77 72 69 74 65   &pWriter->write
1d190 72 3b 0a 20 20 69 36 34 20 69 52 6f 77 69 64 3b  r;.  i64 iRowid;
1d1a0 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 6e 43 61  ..static int nCa
1d1b0 6c 6c 20 3d 20 30 3b 0a 6e 43 61 6c 6c 2b 2b 3b  ll = 0;.nCall++;
1d1c0 0a 0a 20 20 61 73 73 65 72 74 28 20 28 70 50 61  ..  assert( (pPa
1d1d0 67 65 2d 3e 70 67 69 64 78 2e 6e 3d 3d 30 29 3d  ge->pgidx.n==0)=
1d1e0 3d 28 70 57 72 69 74 65 72 2d 3e 62 46 69 72 73  =(pWriter->bFirs
1d1f0 74 54 65 72 6d 49 6e 50 61 67 65 29 20 29 3b 0a  tTermInPage) );.
1d200 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20 73 7a  .  /* Set the sz
1d210 4c 65 61 66 20 68 65 61 64 65 72 20 66 69 65 6c  Leaf header fiel
1d220 64 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  d. */.  assert( 
1d230 30 3d 3d 66 74 73 35 47 65 74 55 31 36 28 26 70  0==fts5GetU16(&p
1d240 50 61 67 65 2d 3e 62 75 66 2e 70 5b 32 5d 29 20  Page->buf.p[2]) 
1d250 29 3b 0a 20 20 66 74 73 35 50 75 74 55 31 36 28  );.  fts5PutU16(
1d260 26 70 50 61 67 65 2d 3e 62 75 66 2e 70 5b 32 5d  &pPage->buf.p[2]
1d270 2c 20 28 75 31 36 29 70 50 61 67 65 2d 3e 62 75  , (u16)pPage->bu
1d280 66 2e 6e 29 3b 0a 0a 20 20 69 66 28 20 70 57 72  f.n);..  if( pWr
1d290 69 74 65 72 2d 3e 62 46 69 72 73 74 54 65 72 6d  iter->bFirstTerm
1d2a0 49 6e 50 61 67 65 20 29 7b 0a 20 20 20 20 2f 2a  InPage ){.    /*
1d2b0 20 4e 6f 20 74 65 72 6d 20 77 61 73 20 77 72 69   No term was wri
1d2c0 74 74 65 6e 20 74 6f 20 74 68 69 73 20 70 61 67  tten to this pag
1d2d0 65 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74  e. */.    assert
1d2e0 28 20 70 50 61 67 65 2d 3e 70 67 69 64 78 2e 6e  ( pPage->pgidx.n
1d2f0 3d 3d 30 20 29 3b 0a 20 20 20 20 66 74 73 35 57  ==0 );.    fts5W
1d300 72 69 74 65 42 74 72 65 65 4e 6f 54 65 72 6d 28  riteBtreeNoTerm(
1d310 70 2c 20 70 57 72 69 74 65 72 29 3b 0a 20 20 7d  p, pWriter);.  }
1d320 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 41 70 70  else{.    /* App
1d330 65 6e 64 20 74 68 65 20 70 67 69 64 78 20 74 6f  end the pgidx to
1d340 20 74 68 65 20 70 61 67 65 20 62 75 66 66 65 72   the page buffer
1d350 2e 20 53 65 74 20 74 68 65 20 73 7a 4c 65 61 66  . Set the szLeaf
1d360 20 68 65 61 64 65 72 20 66 69 65 6c 64 2e 20 2a   header field. *
1d370 2f 0a 20 20 20 20 66 74 73 35 42 75 66 66 65 72  /.    fts5Buffer
1d380 41 70 70 65 6e 64 42 6c 6f 62 28 26 70 2d 3e 72  AppendBlob(&p->r
1d390 63 2c 20 26 70 50 61 67 65 2d 3e 62 75 66 2c 20  c, &pPage->buf, 
1d3a0 70 50 61 67 65 2d 3e 70 67 69 64 78 2e 6e 2c 20  pPage->pgidx.n, 
1d3b0 70 50 61 67 65 2d 3e 70 67 69 64 78 2e 70 29 3b  pPage->pgidx.p);
1d3c0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 72 69 74 65  .  }..  /* Write
1d3d0 20 74 68 65 20 70 61 67 65 20 6f 75 74 20 74 6f   the page out to
1d3e0 20 64 69 73 6b 20 2a 2f 0a 20 20 69 52 6f 77 69   disk */.  iRowi
1d3f0 64 20 3d 20 46 54 53 35 5f 53 45 47 4d 45 4e 54  d = FTS5_SEGMENT
1d400 5f 52 4f 57 49 44 28 70 57 72 69 74 65 72 2d 3e  _ROWID(pWriter->
1d410 69 53 65 67 69 64 2c 20 70 50 61 67 65 2d 3e 70  iSegid, pPage->p
1d420 67 6e 6f 29 3b 0a 20 20 66 74 73 35 44 61 74 61  gno);.  fts5Data
1d430 57 72 69 74 65 28 70 2c 20 69 52 6f 77 69 64 2c  Write(p, iRowid,
1d440 20 70 50 61 67 65 2d 3e 62 75 66 2e 70 2c 20 70   pPage->buf.p, p
1d450 50 61 67 65 2d 3e 62 75 66 2e 6e 29 3b 0a 0a 20  Page->buf.n);.. 
1d460 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74   /* Initialize t
1d470 68 65 20 6e 65 78 74 20 70 61 67 65 2e 20 2a 2f  he next page. */
1d480 0a 20 20 66 74 73 35 42 75 66 66 65 72 5a 65 72  .  fts5BufferZer
1d490 6f 28 26 70 50 61 67 65 2d 3e 62 75 66 29 3b 0a  o(&pPage->buf);.
1d4a0 20 20 66 74 73 35 42 75 66 66 65 72 5a 65 72 6f    fts5BufferZero
1d4b0 28 26 70 50 61 67 65 2d 3e 70 67 69 64 78 29 3b  (&pPage->pgidx);
1d4c0 0a 20 20 66 74 73 35 42 75 66 66 65 72 41 70 70  .  fts5BufferApp
1d4d0 65 6e 64 42 6c 6f 62 28 26 70 2d 3e 72 63 2c 20  endBlob(&p->rc, 
1d4e0 26 70 50 61 67 65 2d 3e 62 75 66 2c 20 34 2c 20  &pPage->buf, 4, 
1d4f0 7a 65 72 6f 29 3b 0a 20 20 70 50 61 67 65 2d 3e  zero);.  pPage->
1d500 69 50 72 65 76 50 67 69 64 78 20 3d 20 30 3b 0a  iPrevPgidx = 0;.
1d510 20 20 70 50 61 67 65 2d 3e 70 67 6e 6f 2b 2b 3b    pPage->pgno++;
1d520 0a 0a 20 20 2f 2a 20 49 6e 63 72 65 61 73 65 20  ..  /* Increase 
1d530 74 68 65 20 6c 65 61 76 65 73 20 77 72 69 74 74  the leaves writt
1d540 65 6e 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  en counter */.  
1d550 70 57 72 69 74 65 72 2d 3e 6e 4c 65 61 66 57 72  pWriter->nLeafWr
1d560 69 74 74 65 6e 2b 2b 3b 0a 0a 20 20 2f 2a 20 54  itten++;..  /* T
1d570 68 65 20 6e 65 77 20 6c 65 61 66 20 68 6f 6c 64  he new leaf hold
1d580 73 20 6e 6f 20 74 65 72 6d 73 20 6f 72 20 72 6f  s no terms or ro
1d590 77 69 64 73 20 2a 2f 0a 20 20 70 57 72 69 74 65  wids */.  pWrite
1d5a0 72 2d 3e 62 46 69 72 73 74 54 65 72 6d 49 6e 50  r->bFirstTermInP
1d5b0 61 67 65 20 3d 20 31 3b 0a 20 20 70 57 72 69 74  age = 1;.  pWrit
1d5c0 65 72 2d 3e 62 46 69 72 73 74 52 6f 77 69 64 49  er->bFirstRowidI
1d5d0 6e 50 61 67 65 20 3d 20 31 3b 0a 7d 0a 0a 2f 2a  nPage = 1;.}../*
1d5e0 0a 2a 2a 20 41 70 70 65 6e 64 20 74 65 72 6d 20  .** Append term 
1d5f0 70 54 65 72 6d 2f 6e 54 65 72 6d 20 74 6f 20 74  pTerm/nTerm to t
1d600 68 65 20 73 65 67 6d 65 6e 74 20 62 65 69 6e 67  he segment being
1d610 20 77 72 69 74 74 65 6e 20 62 79 20 74 68 65 20   written by the 
1d620 77 72 69 74 65 72 20 70 61 73 73 65 64 0a 2a 2a  writer passed.**
1d630 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61   as the second a
1d640 72 67 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 49  rgument..**.** I
1d650 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
1d660 73 2c 20 73 65 74 20 74 68 65 20 46 74 73 35 49  s, set the Fts5I
1d670 6e 64 65 78 2e 72 63 20 65 72 72 6f 72 20 63 6f  ndex.rc error co
1d680 64 65 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20  de. If an error 
1d690 68 61 73 20 0a 2a 2a 20 61 6c 72 65 61 64 79 20  has .** already 
1d6a0 6f 63 63 75 72 72 65 64 2c 20 74 68 69 73 20 66  occurred, this f
1d6b0 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d  unction is a no-
1d6c0 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  op..*/.static vo
1d6d0 69 64 20 66 74 73 35 57 72 69 74 65 41 70 70 65  id fts5WriteAppe
1d6e0 6e 64 54 65 72 6d 28 0a 20 20 46 74 73 35 49 6e  ndTerm(.  Fts5In
1d6f0 64 65 78 20 2a 70 2c 20 0a 20 20 46 74 73 35 53  dex *p, .  Fts5S
1d700 65 67 57 72 69 74 65 72 20 2a 70 57 72 69 74 65  egWriter *pWrite
1d710 72 2c 0a 20 20 69 6e 74 20 6e 54 65 72 6d 2c 20  r,.  int nTerm, 
1d720 63 6f 6e 73 74 20 75 38 20 2a 70 54 65 72 6d 20  const u8 *pTerm 
1d730 0a 29 7b 0a 20 20 69 6e 74 20 6e 50 72 65 66 69  .){.  int nPrefi
1d740 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  x;              
1d750 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20 6f        /* Bytes o
1d760 66 20 70 72 65 66 69 78 20 63 6f 6d 70 72 65 73  f prefix compres
1d770 73 69 6f 6e 20 66 6f 72 20 74 65 72 6d 20 2a 2f  sion for term */
1d780 0a 20 20 46 74 73 35 50 61 67 65 57 72 69 74 65  .  Fts5PageWrite
1d790 72 20 2a 70 50 61 67 65 20 3d 20 26 70 57 72 69  r *pPage = &pWri
1d7a0 74 65 72 2d 3e 77 72 69 74 65 72 3b 0a 20 20 46  ter->writer;.  F
1d7b0 74 73 35 42 75 66 66 65 72 20 2a 70 50 67 69 64  ts5Buffer *pPgid
1d7c0 78 20 3d 20 26 70 57 72 69 74 65 72 2d 3e 77 72  x = &pWriter->wr
1d7d0 69 74 65 72 2e 70 67 69 64 78 3b 0a 0a 20 20 61  iter.pgidx;..  a
1d7e0 73 73 65 72 74 28 20 70 2d 3e 72 63 3d 3d 53 51  ssert( p->rc==SQ
1d7f0 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 61 73 73  LITE_OK );.  ass
1d800 65 72 74 28 20 70 50 61 67 65 2d 3e 62 75 66 2e  ert( pPage->buf.
1d810 6e 3e 3d 34 20 29 3b 0a 20 20 61 73 73 65 72 74  n>=4 );.  assert
1d820 28 20 70 50 61 67 65 2d 3e 62 75 66 2e 6e 3e 34  ( pPage->buf.n>4
1d830 20 7c 7c 20 70 57 72 69 74 65 72 2d 3e 62 46 69   || pWriter->bFi
1d840 72 73 74 54 65 72 6d 49 6e 50 61 67 65 20 29 3b  rstTermInPage );
1d850 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 63 75  ..  /* If the cu
1d860 72 72 65 6e 74 20 6c 65 61 66 20 70 61 67 65 20  rrent leaf page 
1d870 69 73 20 66 75 6c 6c 2c 20 66 6c 75 73 68 20 69  is full, flush i
1d880 74 20 74 6f 20 64 69 73 6b 2e 20 2a 2f 0a 20 20  t to disk. */.  
1d890 69 66 28 20 28 70 50 61 67 65 2d 3e 62 75 66 2e  if( (pPage->buf.
1d8a0 6e 20 2b 20 70 50 67 69 64 78 2d 3e 6e 20 2b 20  n + pPgidx->n + 
1d8b0 6e 54 65 72 6d 20 2b 20 32 29 3e 3d 70 2d 3e 70  nTerm + 2)>=p->p
1d8c0 43 6f 6e 66 69 67 2d 3e 70 67 73 7a 20 29 7b 0a  Config->pgsz ){.
1d8d0 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 62      if( pPage->b
1d8e0 75 66 2e 6e 3e 34 20 29 7b 0a 20 20 20 20 20 20  uf.n>4 ){.      
1d8f0 66 74 73 35 57 72 69 74 65 46 6c 75 73 68 4c 65  fts5WriteFlushLe
1d900 61 66 28 70 2c 20 70 57 72 69 74 65 72 29 3b 0a  af(p, pWriter);.
1d910 20 20 20 20 7d 0a 20 20 20 20 66 74 73 35 42 75      }.    fts5Bu
1d920 66 66 65 72 47 72 6f 77 28 26 70 2d 3e 72 63 2c  fferGrow(&p->rc,
1d930 20 26 70 50 61 67 65 2d 3e 62 75 66 2c 20 6e 54   &pPage->buf, nT
1d940 65 72 6d 2b 46 54 53 35 5f 44 41 54 41 5f 50 41  erm+FTS5_DATA_PA
1d950 44 44 49 4e 47 29 3b 0a 20 20 7d 0a 20 20 0a 20  DDING);.  }.  . 
1d960 20 2f 2a 20 54 4f 44 4f 31 3a 20 55 70 64 61 74   /* TODO1: Updat
1d970 69 6e 67 20 70 67 69 64 78 20 68 65 72 65 2e 20  ing pgidx here. 
1d980 2a 2f 0a 20 20 70 50 67 69 64 78 2d 3e 6e 20 2b  */.  pPgidx->n +
1d990 3d 20 73 71 6c 69 74 65 33 46 74 73 35 50 75 74  = sqlite3Fts5Put
1d9a0 56 61 72 69 6e 74 28 0a 20 20 20 20 20 20 26 70  Varint(.      &p
1d9b0 50 67 69 64 78 2d 3e 70 5b 70 50 67 69 64 78 2d  Pgidx->p[pPgidx-
1d9c0 3e 6e 5d 2c 20 70 50 61 67 65 2d 3e 62 75 66 2e  >n], pPage->buf.
1d9d0 6e 20 2d 20 70 50 61 67 65 2d 3e 69 50 72 65 76  n - pPage->iPrev
1d9e0 50 67 69 64 78 0a 20 20 29 3b 0a 20 20 70 50 61  Pgidx.  );.  pPa
1d9f0 67 65 2d 3e 69 50 72 65 76 50 67 69 64 78 20 3d  ge->iPrevPgidx =
1da00 20 70 50 61 67 65 2d 3e 62 75 66 2e 6e 3b 0a 23   pPage->buf.n;.#
1da10 69 66 20 30 0a 20 20 66 74 73 35 50 75 74 55 31  if 0.  fts5PutU1
1da20 36 28 26 70 50 67 69 64 78 2d 3e 70 5b 70 50 67  6(&pPgidx->p[pPg
1da30 69 64 78 2d 3e 6e 5d 2c 20 70 50 61 67 65 2d 3e  idx->n], pPage->
1da40 62 75 66 2e 6e 29 3b 0a 20 20 70 50 67 69 64 78  buf.n);.  pPgidx
1da50 2d 3e 6e 20 2b 3d 20 32 3b 0a 23 65 6e 64 69 66  ->n += 2;.#endif
1da60 0a 0a 20 20 69 66 28 20 70 57 72 69 74 65 72 2d  ..  if( pWriter-
1da70 3e 62 46 69 72 73 74 54 65 72 6d 49 6e 50 61 67  >bFirstTermInPag
1da80 65 20 29 7b 0a 20 20 20 20 6e 50 72 65 66 69 78  e ){.    nPrefix
1da90 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 70 50   = 0;.    if( pP
1daa0 61 67 65 2d 3e 70 67 6e 6f 21 3d 31 20 29 7b 0a  age->pgno!=1 ){.
1dab0 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 69 73        /* This is
1dac0 20 74 68 65 20 66 69 72 73 74 20 74 65 72 6d 20   the first term 
1dad0 6f 6e 20 61 20 6c 65 61 66 20 74 68 61 74 20 69  on a leaf that i
1dae0 73 20 6e 6f 74 20 74 68 65 20 6c 65 66 74 6d 6f  s not the leftmo
1daf0 73 74 20 6c 65 61 66 20 69 6e 0a 20 20 20 20 20  st leaf in.     
1db00 20 2a 2a 20 74 68 65 20 73 65 67 6d 65 6e 74 20   ** the segment 
1db10 62 2d 74 72 65 65 2e 20 49 6e 20 74 68 69 73 20  b-tree. In this 
1db20 63 61 73 65 20 69 74 20 69 73 20 6e 65 63 65 73  case it is neces
1db30 73 61 72 79 20 74 6f 20 61 64 64 20 61 20 74 65  sary to add a te
1db40 72 6d 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 74  rm to.      ** t
1db50 68 65 20 62 2d 74 72 65 65 20 68 69 65 72 61 72  he b-tree hierar
1db60 63 68 79 20 74 68 61 74 20 69 73 20 28 61 29 20  chy that is (a) 
1db70 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68 65 20  larger than the 
1db80 6c 61 72 67 65 73 74 20 74 65 72 6d 20 0a 20 20  largest term .  
1db90 20 20 20 20 2a 2a 20 61 6c 72 65 61 64 79 20 77      ** already w
1dba0 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 73 65  ritten to the se
1dbb0 67 6d 65 6e 74 20 61 6e 64 20 28 62 29 20 73 6d  gment and (b) sm
1dbc0 61 6c 6c 65 72 20 74 68 61 6e 20 6f 72 20 65 71  aller than or eq
1dbd0 75 61 6c 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20  ual to.      ** 
1dbe0 74 68 69 73 20 74 65 72 6d 2e 20 49 6e 20 6f 74  this term. In ot
1dbf0 68 65 72 20 77 6f 72 64 73 2c 20 61 20 70 72 65  her words, a pre
1dc00 66 69 78 20 6f 66 20 28 70 54 65 72 6d 2f 6e 54  fix of (pTerm/nT
1dc10 65 72 6d 29 20 74 68 61 74 20 69 73 20 6f 6e 65  erm) that is one
1dc20 0a 20 20 20 20 20 20 2a 2a 20 62 79 74 65 20 6c  .      ** byte l
1dc30 6f 6e 67 65 72 20 74 68 61 6e 20 74 68 65 20 6c  onger than the l
1dc40 6f 6e 67 65 73 74 20 70 72 65 66 69 78 20 28 70  ongest prefix (p
1dc50 54 65 72 6d 2f 6e 54 65 72 6d 29 20 73 68 61 72  Term/nTerm) shar
1dc60 65 73 20 77 69 74 68 20 74 68 65 0a 20 20 20 20  es with the.    
1dc70 20 20 2a 2a 20 70 72 65 76 69 6f 75 73 20 74 65    ** previous te
1dc80 72 6d 2e 20 0a 20 20 20 20 20 20 2a 2a 0a 20 20  rm. .      **.  
1dc90 20 20 20 20 2a 2a 20 55 73 75 61 6c 6c 79 2c 20      ** Usually, 
1dca0 74 68 65 20 70 72 65 76 69 6f 75 73 20 74 65 72  the previous ter
1dcb0 6d 20 69 73 20 61 76 61 69 6c 61 62 6c 65 20 69  m is available i
1dcc0 6e 20 70 50 61 67 65 2d 3e 74 65 72 6d 2e 20 54  n pPage->term. T
1dcd0 68 65 20 65 78 63 65 70 74 69 6f 6e 0a 20 20 20  he exception.   
1dce0 20 20 20 2a 2a 20 69 73 20 69 66 20 74 68 69 73     ** is if this
1dcf0 20 69 73 20 74 68 65 20 66 69 72 73 74 20 74 65   is the first te
1dd00 72 6d 20 77 72 69 74 74 65 6e 20 69 6e 20 61 6e  rm written in an
1dd10 20 69 6e 63 72 65 6d 65 6e 74 61 6c 2d 6d 65 72   incremental-mer
1dd20 67 65 20 73 74 65 70 2e 0a 20 20 20 20 20 20 2a  ge step..      *
1dd30 2a 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74  * In this case t
1dd40 68 65 20 70 72 65 76 69 6f 75 73 20 74 65 72 6d  he previous term
1dd50 20 69 73 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c   is not availabl
1dd60 65 2c 20 73 6f 20 6a 75 73 74 20 77 72 69 74 65  e, so just write
1dd70 20 61 0a 20 20 20 20 20 20 2a 2a 20 63 6f 70 79   a.      ** copy
1dd80 20 6f 66 20 28 70 54 65 72 6d 2f 6e 54 65 72 6d   of (pTerm/nTerm
1dd90 29 20 69 6e 74 6f 20 74 68 65 20 70 61 72 65 6e  ) into the paren
1dda0 74 20 6e 6f 64 65 2e 20 54 68 69 73 20 69 73 20  t node. This is 
1ddb0 73 6c 69 67 68 74 6c 79 0a 20 20 20 20 20 20 2a  slightly.      *
1ddc0 2a 20 69 6e 65 66 66 69 63 69 65 6e 74 2c 20 62  * inefficient, b
1ddd0 75 74 20 73 74 69 6c 6c 20 63 6f 72 72 65 63 74  ut still correct
1dde0 2e 20 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  .  */.      int 
1ddf0 6e 20 3d 20 6e 54 65 72 6d 3b 0a 20 20 20 20 20  n = nTerm;.     
1de00 20 69 66 28 20 70 50 61 67 65 2d 3e 74 65 72 6d   if( pPage->term
1de10 2e 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 6e 20  .n ){.        n 
1de20 3d 20 31 20 2b 20 66 74 73 35 50 72 65 66 69 78  = 1 + fts5Prefix
1de30 43 6f 6d 70 72 65 73 73 28 70 50 61 67 65 2d 3e  Compress(pPage->
1de40 74 65 72 6d 2e 6e 2c 20 70 50 61 67 65 2d 3e 74  term.n, pPage->t
1de50 65 72 6d 2e 70 2c 20 70 54 65 72 6d 29 3b 0a 20  erm.p, pTerm);. 
1de60 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 74 73       }.      fts
1de70 35 57 72 69 74 65 42 74 72 65 65 54 65 72 6d 28  5WriteBtreeTerm(
1de80 70 2c 20 70 57 72 69 74 65 72 2c 20 6e 2c 20 70  p, pWriter, n, p
1de90 54 65 72 6d 29 3b 0a 20 20 20 20 20 20 70 50 61  Term);.      pPa
1dea0 67 65 20 3d 20 26 70 57 72 69 74 65 72 2d 3e 77  ge = &pWriter->w
1deb0 72 69 74 65 72 3b 0a 20 20 20 20 7d 0a 20 20 7d  riter;.    }.  }
1dec0 65 6c 73 65 7b 0a 20 20 20 20 6e 50 72 65 66 69  else{.    nPrefi
1ded0 78 20 3d 20 66 74 73 35 50 72 65 66 69 78 43 6f  x = fts5PrefixCo
1dee0 6d 70 72 65 73 73 28 70 50 61 67 65 2d 3e 74 65  mpress(pPage->te
1def0 72 6d 2e 6e 2c 20 70 50 61 67 65 2d 3e 74 65 72  rm.n, pPage->ter
1df00 6d 2e 70 2c 20 70 54 65 72 6d 29 3b 0a 20 20 20  m.p, pTerm);.   
1df10 20 66 74 73 35 42 75 66 66 65 72 41 70 70 65 6e   fts5BufferAppen
1df20 64 56 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20  dVarint(&p->rc, 
1df30 26 70 50 61 67 65 2d 3e 62 75 66 2c 20 6e 50 72  &pPage->buf, nPr
1df40 65 66 69 78 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  efix);.  }..  /*
1df50 20 41 70 70 65 6e 64 20 74 68 65 20 6e 75 6d 62   Append the numb
1df60 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20 6e  er of bytes of n
1df70 65 77 20 64 61 74 61 2c 20 74 68 65 6e 20 74 68  ew data, then th
1df80 65 20 74 65 72 6d 20 64 61 74 61 20 69 74 73 65  e term data itse
1df90 6c 66 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20 70  lf.  ** to the p
1dfa0 61 67 65 2e 20 2a 2f 0a 20 20 66 74 73 35 42 75  age. */.  fts5Bu
1dfb0 66 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e 74  fferAppendVarint
1dfc0 28 26 70 2d 3e 72 63 2c 20 26 70 50 61 67 65 2d  (&p->rc, &pPage-
1dfd0 3e 62 75 66 2c 20 6e 54 65 72 6d 20 2d 20 6e 50  >buf, nTerm - nP
1dfe0 72 65 66 69 78 29 3b 0a 20 20 66 74 73 35 42 75  refix);.  fts5Bu
1dff0 66 66 65 72 41 70 70 65 6e 64 42 6c 6f 62 28 26  fferAppendBlob(&
1e000 70 2d 3e 72 63 2c 20 26 70 50 61 67 65 2d 3e 62  p->rc, &pPage->b
1e010 75 66 2c 20 6e 54 65 72 6d 20 2d 20 6e 50 72 65  uf, nTerm - nPre
1e020 66 69 78 2c 20 26 70 54 65 72 6d 5b 6e 50 72 65  fix, &pTerm[nPre
1e030 66 69 78 5d 29 3b 0a 0a 20 20 2f 2a 20 55 70 64  fix]);..  /* Upd
1e040 61 74 65 20 74 68 65 20 46 74 73 35 50 61 67 65  ate the Fts5Page
1e050 57 72 69 74 65 72 2e 74 65 72 6d 20 66 69 65 6c  Writer.term fiel
1e060 64 2e 20 2a 2f 0a 20 20 66 74 73 35 42 75 66 66  d. */.  fts5Buff
1e070 65 72 53 65 74 28 26 70 2d 3e 72 63 2c 20 26 70  erSet(&p->rc, &p
1e080 50 61 67 65 2d 3e 74 65 72 6d 2c 20 6e 54 65 72  Page->term, nTer
1e090 6d 2c 20 70 54 65 72 6d 29 3b 0a 20 20 70 57 72  m, pTerm);.  pWr
1e0a0 69 74 65 72 2d 3e 62 46 69 72 73 74 54 65 72 6d  iter->bFirstTerm
1e0b0 49 6e 50 61 67 65 20 3d 20 30 3b 0a 0a 20 20 70  InPage = 0;..  p
1e0c0 57 72 69 74 65 72 2d 3e 62 46 69 72 73 74 52 6f  Writer->bFirstRo
1e0d0 77 69 64 49 6e 50 61 67 65 20 3d 20 30 3b 0a 20  widInPage = 0;. 
1e0e0 20 70 57 72 69 74 65 72 2d 3e 62 46 69 72 73 74   pWriter->bFirst
1e0f0 52 6f 77 69 64 49 6e 44 6f 63 6c 69 73 74 20 3d  RowidInDoclist =
1e100 20 31 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70   1;..  assert( p
1e110 2d 3e 72 63 20 7c 7c 20 28 70 57 72 69 74 65 72  ->rc || (pWriter
1e120 2d 3e 6e 44 6c 69 64 78 3e 30 20 26 26 20 70 57  ->nDlidx>0 && pW
1e130 72 69 74 65 72 2d 3e 61 44 6c 69 64 78 5b 30 5d  riter->aDlidx[0]
1e140 2e 62 75 66 2e 6e 3d 3d 30 29 20 29 3b 0a 20 20  .buf.n==0) );.  
1e150 70 57 72 69 74 65 72 2d 3e 61 44 6c 69 64 78 5b  pWriter->aDlidx[
1e160 30 5d 2e 70 67 6e 6f 20 3d 20 70 50 61 67 65 2d  0].pgno = pPage-
1e170 3e 70 67 6e 6f 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  >pgno;.}../*.** 
1e180 41 70 70 65 6e 64 20 61 20 72 6f 77 69 64 20 61  Append a rowid a
1e190 6e 64 20 70 6f 73 69 74 69 6f 6e 2d 6c 69 73 74  nd position-list
1e1a0 20 73 69 7a 65 20 66 69 65 6c 64 20 74 6f 20 74   size field to t
1e1b0 68 65 20 77 72 69 74 65 72 73 20 6f 75 74 70 75  he writers outpu
1e1c0 74 2e 20 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  t. .*/.static vo
1e1d0 69 64 20 66 74 73 35 57 72 69 74 65 41 70 70 65  id fts5WriteAppe
1e1e0 6e 64 52 6f 77 69 64 28 0a 20 20 46 74 73 35 49  ndRowid(.  Fts5I
1e1f0 6e 64 65 78 20 2a 70 2c 20 0a 20 20 46 74 73 35  ndex *p, .  Fts5
1e200 53 65 67 57 72 69 74 65 72 20 2a 70 57 72 69 74  SegWriter *pWrit
1e210 65 72 2c 0a 20 20 69 36 34 20 69 52 6f 77 69 64  er,.  i64 iRowid
1e220 0a 29 7b 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d  .){.  if( p->rc=
1e230 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1e240 20 20 46 74 73 35 50 61 67 65 57 72 69 74 65 72    Fts5PageWriter
1e250 20 2a 70 50 61 67 65 20 3d 20 26 70 57 72 69 74   *pPage = &pWrit
1e260 65 72 2d 3e 77 72 69 74 65 72 3b 0a 0a 20 20 20  er->writer;..   
1e270 20 69 66 28 20 28 70 50 61 67 65 2d 3e 62 75 66   if( (pPage->buf
1e280 2e 6e 20 2b 20 70 50 61 67 65 2d 3e 70 67 69 64  .n + pPage->pgid
1e290 78 2e 6e 29 3e 3d 70 2d 3e 70 43 6f 6e 66 69 67  x.n)>=p->pConfig
1e2a0 2d 3e 70 67 73 7a 20 29 7b 0a 20 20 20 20 20 20  ->pgsz ){.      
1e2b0 66 74 73 35 57 72 69 74 65 46 6c 75 73 68 4c 65  fts5WriteFlushLe
1e2c0 61 66 28 70 2c 20 70 57 72 69 74 65 72 29 3b 0a  af(p, pWriter);.
1e2d0 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66      }..    /* If
1e2e0 20 74 68 69 73 20 69 73 20 74 6f 20 62 65 20 74   this is to be t
1e2f0 68 65 20 66 69 72 73 74 20 72 6f 77 69 64 20 77  he first rowid w
1e300 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 70 61  ritten to the pa
1e310 67 65 2c 20 73 65 74 20 74 68 65 20 0a 20 20 20  ge, set the .   
1e320 20 2a 2a 20 72 6f 77 69 64 2d 70 6f 69 6e 74 65   ** rowid-pointe
1e330 72 20 69 6e 20 74 68 65 20 70 61 67 65 2d 68 65  r in the page-he
1e340 61 64 65 72 2e 20 41 6c 73 6f 20 61 70 70 65 6e  ader. Also appen
1e350 64 20 61 20 76 61 6c 75 65 20 74 6f 20 74 68 65  d a value to the
1e360 20 64 6c 69 64 78 0a 20 20 20 20 2a 2a 20 62 75   dlidx.    ** bu
1e370 66 66 65 72 2c 20 69 6e 20 63 61 73 65 20 61 20  ffer, in case a 
1e380 64 6f 63 6c 69 73 74 2d 69 6e 64 65 78 20 69 73  doclist-index is
1e390 20 72 65 71 75 69 72 65 64 2e 20 20 2a 2f 0a 20   required.  */. 
1e3a0 20 20 20 69 66 28 20 70 57 72 69 74 65 72 2d 3e     if( pWriter->
1e3b0 62 46 69 72 73 74 52 6f 77 69 64 49 6e 50 61 67  bFirstRowidInPag
1e3c0 65 20 29 7b 0a 20 20 20 20 20 20 66 74 73 35 50  e ){.      fts5P
1e3d0 75 74 55 31 36 28 70 50 61 67 65 2d 3e 62 75 66  utU16(pPage->buf
1e3e0 2e 70 2c 20 28 75 31 36 29 70 50 61 67 65 2d 3e  .p, (u16)pPage->
1e3f0 62 75 66 2e 6e 29 3b 0a 20 20 20 20 20 20 66 74  buf.n);.      ft
1e400 73 35 57 72 69 74 65 44 6c 69 64 78 41 70 70 65  s5WriteDlidxAppe
1e410 6e 64 28 70 2c 20 70 57 72 69 74 65 72 2c 20 69  nd(p, pWriter, i
1e420 52 6f 77 69 64 29 3b 0a 20 20 20 20 7d 0a 0a 20  Rowid);.    }.. 
1e430 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20     /* Write the 
1e440 72 6f 77 69 64 2e 20 2a 2f 0a 20 20 20 20 69 66  rowid. */.    if
1e450 28 20 70 57 72 69 74 65 72 2d 3e 62 46 69 72 73  ( pWriter->bFirs
1e460 74 52 6f 77 69 64 49 6e 44 6f 63 6c 69 73 74 20  tRowidInDoclist 
1e470 7c 7c 20 70 57 72 69 74 65 72 2d 3e 62 46 69 72  || pWriter->bFir
1e480 73 74 52 6f 77 69 64 49 6e 50 61 67 65 20 29 7b  stRowidInPage ){
1e490 0a 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65  .      fts5Buffe
1e4a0 72 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26 70  rAppendVarint(&p
1e4b0 2d 3e 72 63 2c 20 26 70 50 61 67 65 2d 3e 62 75  ->rc, &pPage->bu
1e4c0 66 2c 20 69 52 6f 77 69 64 29 3b 0a 20 20 20 20  f, iRowid);.    
1e4d0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73  }else{.      ass
1e4e0 65 72 74 28 20 70 2d 3e 72 63 20 7c 7c 20 69 52  ert( p->rc || iR
1e4f0 6f 77 69 64 3e 70 57 72 69 74 65 72 2d 3e 69 50  owid>pWriter->iP
1e500 72 65 76 52 6f 77 69 64 20 29 3b 0a 20 20 20 20  revRowid );.    
1e510 20 20 66 74 73 35 42 75 66 66 65 72 41 70 70 65    fts5BufferAppe
1e520 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c  ndVarint(&p->rc,
1e530 20 26 70 50 61 67 65 2d 3e 62 75 66 2c 20 69 52   &pPage->buf, iR
1e540 6f 77 69 64 20 2d 20 70 57 72 69 74 65 72 2d 3e  owid - pWriter->
1e550 69 50 72 65 76 52 6f 77 69 64 29 3b 0a 20 20 20  iPrevRowid);.   
1e560 20 7d 0a 20 20 20 20 70 57 72 69 74 65 72 2d 3e   }.    pWriter->
1e570 69 50 72 65 76 52 6f 77 69 64 20 3d 20 69 52 6f  iPrevRowid = iRo
1e580 77 69 64 3b 0a 20 20 20 20 70 57 72 69 74 65 72  wid;.    pWriter
1e590 2d 3e 62 46 69 72 73 74 52 6f 77 69 64 49 6e 44  ->bFirstRowidInD
1e5a0 6f 63 6c 69 73 74 20 3d 20 30 3b 0a 20 20 20 20  oclist = 0;.    
1e5b0 70 57 72 69 74 65 72 2d 3e 62 46 69 72 73 74 52  pWriter->bFirstR
1e5c0 6f 77 69 64 49 6e 50 61 67 65 20 3d 20 30 3b 0a  owidInPage = 0;.
1e5d0 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f    }.}..static vo
1e5e0 69 64 20 66 74 73 35 57 72 69 74 65 41 70 70 65  id fts5WriteAppe
1e5f0 6e 64 50 6f 73 6c 69 73 74 44 61 74 61 28 0a 20  ndPoslistData(. 
1e600 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 0a   Fts5Index *p, .
1e610 20 20 46 74 73 35 53 65 67 57 72 69 74 65 72 20    Fts5SegWriter 
1e620 2a 70 57 72 69 74 65 72 2c 20 0a 20 20 63 6f 6e  *pWriter, .  con
1e630 73 74 20 75 38 20 2a 61 44 61 74 61 2c 20 0a 20  st u8 *aData, . 
1e640 20 69 6e 74 20 6e 44 61 74 61 0a 29 7b 0a 20 20   int nData.){.  
1e650 46 74 73 35 50 61 67 65 57 72 69 74 65 72 20 2a  Fts5PageWriter *
1e660 70 50 61 67 65 20 3d 20 26 70 57 72 69 74 65 72  pPage = &pWriter
1e670 2d 3e 77 72 69 74 65 72 3b 0a 20 20 63 6f 6e 73  ->writer;.  cons
1e680 74 20 75 38 20 2a 61 20 3d 20 61 44 61 74 61 3b  t u8 *a = aData;
1e690 0a 20 20 69 6e 74 20 6e 20 3d 20 6e 44 61 74 61  .  int n = nData
1e6a0 3b 0a 20 20 0a 20 20 61 73 73 65 72 74 28 20 70  ;.  .  assert( p
1e6b0 2d 3e 70 43 6f 6e 66 69 67 2d 3e 70 67 73 7a 3e  ->pConfig->pgsz>
1e6c0 30 20 29 3b 0a 20 20 77 68 69 6c 65 28 20 70 2d  0 );.  while( p-
1e6d0 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 0a  >rc==SQLITE_OK .
1e6e0 20 20 20 20 20 26 26 20 28 70 50 61 67 65 2d 3e       && (pPage->
1e6f0 62 75 66 2e 6e 20 2b 20 70 50 61 67 65 2d 3e 70  buf.n + pPage->p
1e700 67 69 64 78 2e 6e 20 2b 20 6e 29 3e 3d 70 2d 3e  gidx.n + n)>=p->
1e710 70 43 6f 6e 66 69 67 2d 3e 70 67 73 7a 20 0a 20  pConfig->pgsz . 
1e720 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 52 65 71   ){.    int nReq
1e730 20 3d 20 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e 70   = p->pConfig->p
1e740 67 73 7a 20 2d 20 70 50 61 67 65 2d 3e 62 75 66  gsz - pPage->buf
1e750 2e 6e 20 2d 20 70 50 61 67 65 2d 3e 70 67 69 64  .n - pPage->pgid
1e760 78 2e 6e 3b 0a 20 20 20 20 69 6e 74 20 6e 43 6f  x.n;.    int nCo
1e770 70 79 20 3d 20 30 3b 0a 20 20 20 20 77 68 69 6c  py = 0;.    whil
1e780 65 28 20 6e 43 6f 70 79 3c 6e 52 65 71 20 29 7b  e( nCopy<nReq ){
1e790 0a 20 20 20 20 20 20 69 36 34 20 64 75 6d 6d 79  .      i64 dummy
1e7a0 3b 0a 20 20 20 20 20 20 6e 43 6f 70 79 20 2b 3d  ;.      nCopy +=
1e7b0 20 66 74 73 35 47 65 74 56 61 72 69 6e 74 28 26   fts5GetVarint(&
1e7c0 61 5b 6e 43 6f 70 79 5d 2c 20 28 75 36 34 2a 29  a[nCopy], (u64*)
1e7d0 26 64 75 6d 6d 79 29 3b 0a 20 20 20 20 7d 0a 20  &dummy);.    }. 
1e7e0 20 20 20 66 74 73 35 42 75 66 66 65 72 41 70 70     fts5BufferApp
1e7f0 65 6e 64 42 6c 6f 62 28 26 70 2d 3e 72 63 2c 20  endBlob(&p->rc, 
1e800 26 70 50 61 67 65 2d 3e 62 75 66 2c 20 6e 43 6f  &pPage->buf, nCo
1e810 70 79 2c 20 61 29 3b 0a 20 20 20 20 61 20 2b 3d  py, a);.    a +=
1e820 20 6e 43 6f 70 79 3b 0a 20 20 20 20 6e 20 2d 3d   nCopy;.    n -=
1e830 20 6e 43 6f 70 79 3b 0a 20 20 20 20 66 74 73 35   nCopy;.    fts5
1e840 57 72 69 74 65 46 6c 75 73 68 4c 65 61 66 28 70  WriteFlushLeaf(p
1e850 2c 20 70 57 72 69 74 65 72 29 3b 0a 20 20 7d 0a  , pWriter);.  }.
1e860 20 20 69 66 28 20 6e 3e 30 20 29 7b 0a 20 20 20    if( n>0 ){.   
1e870 20 66 74 73 35 42 75 66 66 65 72 41 70 70 65 6e   fts5BufferAppen
1e880 64 42 6c 6f 62 28 26 70 2d 3e 72 63 2c 20 26 70  dBlob(&p->rc, &p
1e890 50 61 67 65 2d 3e 62 75 66 2c 20 6e 2c 20 61 29  Page->buf, n, a)
1e8a0 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46  ;.  }.}../*.** F
1e8b0 6c 75 73 68 20 61 6e 79 20 64 61 74 61 20 63 61  lush any data ca
1e8c0 63 68 65 64 20 62 79 20 74 68 65 20 77 72 69 74  ched by the writ
1e8d0 65 72 20 6f 62 6a 65 63 74 20 74 6f 20 74 68 65  er object to the
1e8e0 20 64 61 74 61 62 61 73 65 2e 20 46 72 65 65 20   database. Free 
1e8f0 61 6e 79 0a 2a 2a 20 61 6c 6c 6f 63 61 74 69 6f  any.** allocatio
1e900 6e 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  ns associated wi
1e910 74 68 20 74 68 65 20 77 72 69 74 65 72 2e 0a 2a  th the writer..*
1e920 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  /.static void ft
1e930 73 35 57 72 69 74 65 46 69 6e 69 73 68 28 0a 20  s5WriteFinish(. 
1e940 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 0a   Fts5Index *p, .
1e950 20 20 46 74 73 35 53 65 67 57 72 69 74 65 72 20    Fts5SegWriter 
1e960 2a 70 57 72 69 74 65 72 2c 20 20 20 20 20 20 20  *pWriter,       
1e970 20 20 2f 2a 20 57 72 69 74 65 72 20 6f 62 6a 65    /* Writer obje
1e980 63 74 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 4c  ct */.  int *pnL
1e990 65 61 66 20 20 20 20 20 20 20 20 20 20 20 20 20  eaf             
1e9a0 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20          /* OUT: 
1e9b0 4e 75 6d 62 65 72 20 6f 66 20 6c 65 61 66 20 70  Number of leaf p
1e9c0 61 67 65 73 20 69 6e 20 62 2d 74 72 65 65 20 2a  ages in b-tree *
1e9d0 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  /.){.  int i;.  
1e9e0 46 74 73 35 50 61 67 65 57 72 69 74 65 72 20 2a  Fts5PageWriter *
1e9f0 70 4c 65 61 66 20 3d 20 26 70 57 72 69 74 65 72  pLeaf = &pWriter
1ea00 2d 3e 77 72 69 74 65 72 3b 0a 20 20 69 66 28 20  ->writer;.  if( 
1ea10 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
1ea20 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
1ea30 70 4c 65 61 66 2d 3e 70 67 6e 6f 3e 3d 31 20 29  pLeaf->pgno>=1 )
1ea40 3b 0a 20 20 20 20 69 66 28 20 70 4c 65 61 66 2d  ;.    if( pLeaf-
1ea50 3e 62 75 66 2e 6e 3e 34 20 29 7b 0a 20 20 20 20  >buf.n>4 ){.    
1ea60 20 20 66 74 73 35 57 72 69 74 65 46 6c 75 73 68    fts5WriteFlush
1ea70 4c 65 61 66 28 70 2c 20 70 57 72 69 74 65 72 29  Leaf(p, pWriter)
1ea80 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2a 70 6e 4c  ;.    }.    *pnL
1ea90 65 61 66 20 3d 20 70 4c 65 61 66 2d 3e 70 67 6e  eaf = pLeaf->pgn
1eaa0 6f 2d 31 3b 0a 20 20 20 20 69 66 28 20 70 4c 65  o-1;.    if( pLe
1eab0 61 66 2d 3e 70 67 6e 6f 3e 31 20 29 7b 0a 20 20  af->pgno>1 ){.  
1eac0 20 20 20 20 66 74 73 35 57 72 69 74 65 46 6c 75      fts5WriteFlu
1ead0 73 68 42 74 72 65 65 28 70 2c 20 70 57 72 69 74  shBtree(p, pWrit
1eae0 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  er);.    }.  }. 
1eaf0 20 66 74 73 35 42 75 66 66 65 72 46 72 65 65 28   fts5BufferFree(
1eb00 26 70 4c 65 61 66 2d 3e 74 65 72 6d 29 3b 0a 20  &pLeaf->term);. 
1eb10 20 66 74 73 35 42 75 66 66 65 72 46 72 65 65 28   fts5BufferFree(
1eb20 26 70 4c 65 61 66 2d 3e 62 75 66 29 3b 0a 20 20  &pLeaf->buf);.  
1eb30 66 74 73 35 42 75 66 66 65 72 46 72 65 65 28 26  fts5BufferFree(&
1eb40 70 4c 65 61 66 2d 3e 70 67 69 64 78 29 3b 0a 20  pLeaf->pgidx);. 
1eb50 20 66 74 73 35 42 75 66 66 65 72 46 72 65 65 28   fts5BufferFree(
1eb60 26 70 57 72 69 74 65 72 2d 3e 62 74 74 65 72 6d  &pWriter->btterm
1eb70 29 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  );..  for(i=0; i
1eb80 3c 70 57 72 69 74 65 72 2d 3e 6e 44 6c 69 64 78  <pWriter->nDlidx
1eb90 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69  ; i++){.    sqli
1eba0 74 65 33 46 74 73 35 42 75 66 66 65 72 46 72 65  te3Fts5BufferFre
1ebb0 65 28 26 70 57 72 69 74 65 72 2d 3e 61 44 6c 69  e(&pWriter->aDli
1ebc0 64 78 5b 69 5d 2e 62 75 66 29 3b 0a 20 20 7d 0a  dx[i].buf);.  }.
1ebd0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
1ebe0 57 72 69 74 65 72 2d 3e 61 44 6c 69 64 78 29 3b  Writer->aDlidx);
1ebf0 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .}..static void 
1ec00 66 74 73 35 57 72 69 74 65 49 6e 69 74 28 0a 20  fts5WriteInit(. 
1ec10 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 0a   Fts5Index *p, .
1ec20 20 20 46 74 73 35 53 65 67 57 72 69 74 65 72 20    Fts5SegWriter 
1ec30 2a 70 57 72 69 74 65 72 2c 20 0a 20 20 69 6e 74  *pWriter, .  int
1ec40 20 69 53 65 67 69 64 0a 29 7b 0a 20 20 63 6f 6e   iSegid.){.  con
1ec50 73 74 20 69 6e 74 20 6e 42 75 66 66 65 72 20 3d  st int nBuffer =
1ec60 20 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e 70 67 73   p->pConfig->pgs
1ec70 7a 20 2b 20 46 54 53 35 5f 44 41 54 41 5f 50 41  z + FTS5_DATA_PA
1ec80 44 44 49 4e 47 3b 0a 0a 20 20 6d 65 6d 73 65 74  DDING;..  memset
1ec90 28 70 57 72 69 74 65 72 2c 20 30 2c 20 73 69 7a  (pWriter, 0, siz
1eca0 65 6f 66 28 46 74 73 35 53 65 67 57 72 69 74 65  eof(Fts5SegWrite
1ecb0 72 29 29 3b 0a 20 20 70 57 72 69 74 65 72 2d 3e  r));.  pWriter->
1ecc0 69 53 65 67 69 64 20 3d 20 69 53 65 67 69 64 3b  iSegid = iSegid;
1ecd0 0a 0a 20 20 66 74 73 35 57 72 69 74 65 44 6c 69  ..  fts5WriteDli
1ece0 64 78 47 72 6f 77 28 70 2c 20 70 57 72 69 74 65  dxGrow(p, pWrite
1ecf0 72 2c 20 31 29 3b 0a 20 20 70 57 72 69 74 65 72  r, 1);.  pWriter
1ed00 2d 3e 77 72 69 74 65 72 2e 70 67 6e 6f 20 3d 20  ->writer.pgno = 
1ed10 31 3b 0a 20 20 70 57 72 69 74 65 72 2d 3e 62 46  1;.  pWriter->bF
1ed20 69 72 73 74 54 65 72 6d 49 6e 50 61 67 65 20 3d  irstTermInPage =
1ed30 20 31 3b 0a 20 20 70 57 72 69 74 65 72 2d 3e 69   1;.  pWriter->i
1ed40 42 74 50 61 67 65 20 3d 20 31 3b 0a 0a 20 20 61  BtPage = 1;..  a
1ed50 73 73 65 72 74 28 20 70 57 72 69 74 65 72 2d 3e  ssert( pWriter->
1ed60 77 72 69 74 65 72 2e 62 75 66 2e 6e 3d 3d 30 20  writer.buf.n==0 
1ed70 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 57 72  );.  assert( pWr
1ed80 69 74 65 72 2d 3e 77 72 69 74 65 72 2e 70 67 69  iter->writer.pgi
1ed90 64 78 2e 6e 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a  dx.n==0 );..  /*
1eda0 20 47 72 6f 77 20 74 68 65 20 74 77 6f 20 62 75   Grow the two bu
1edb0 66 66 65 72 73 20 74 6f 20 70 67 73 7a 20 2b 20  ffers to pgsz + 
1edc0 70 61 64 64 69 6e 67 20 62 79 74 65 73 20 69 6e  padding bytes in
1edd0 20 73 69 7a 65 2e 20 2a 2f 0a 20 20 73 71 6c 69   size. */.  sqli
1ede0 74 65 33 46 74 73 35 42 75 66 66 65 72 53 69 7a  te3Fts5BufferSiz
1edf0 65 28 26 70 2d 3e 72 63 2c 20 26 70 57 72 69 74  e(&p->rc, &pWrit
1ee00 65 72 2d 3e 77 72 69 74 65 72 2e 70 67 69 64 78  er->writer.pgidx
1ee10 2c 20 6e 42 75 66 66 65 72 29 3b 0a 20 20 73 71  , nBuffer);.  sq
1ee20 6c 69 74 65 33 46 74 73 35 42 75 66 66 65 72 53  lite3Fts5BufferS
1ee30 69 7a 65 28 26 70 2d 3e 72 63 2c 20 26 70 57 72  ize(&p->rc, &pWr
1ee40 69 74 65 72 2d 3e 77 72 69 74 65 72 2e 62 75 66  iter->writer.buf
1ee50 2c 20 6e 42 75 66 66 65 72 29 3b 0a 0a 20 20 69  , nBuffer);..  i
1ee60 66 28 20 70 2d 3e 70 49 64 78 57 72 69 74 65 72  f( p->pIdxWriter
1ee70 3d 3d 30 20 29 7b 0a 20 20 20 20 46 74 73 35 43  ==0 ){.    Fts5C
1ee80 6f 6e 66 69 67 20 2a 70 43 6f 6e 66 69 67 20 3d  onfig *pConfig =
1ee90 20 70 2d 3e 70 43 6f 6e 66 69 67 3b 0a 20 20 20   p->pConfig;.   
1eea0 20 66 74 73 35 49 6e 64 65 78 50 72 65 70 61 72   fts5IndexPrepar
1eeb0 65 53 74 6d 74 28 70 2c 20 26 70 2d 3e 70 49 64  eStmt(p, &p->pId
1eec0 78 57 72 69 74 65 72 2c 20 73 71 6c 69 74 65 33  xWriter, sqlite3
1eed0 5f 6d 70 72 69 6e 74 66 28 0a 20 20 20 20 20 20  _mprintf(.      
1eee0 20 20 20 20 22 49 4e 53 45 52 54 20 49 4e 54 4f      "INSERT INTO
1eef0 20 27 25 71 27 2e 27 25 71 5f 69 64 78 27 28 73   '%q'.'%q_idx'(s
1ef00 65 67 69 64 2c 74 65 72 6d 2c 70 67 6e 6f 29 20  egid,term,pgno) 
1ef10 56 41 4c 55 45 53 28 3f 2c 3f 2c 3f 29 22 2c 20  VALUES(?,?,?)", 
1ef20 0a 20 20 20 20 20 20 20 20 20 20 70 43 6f 6e 66  .          pConf
1ef30 69 67 2d 3e 7a 44 62 2c 20 70 43 6f 6e 66 69 67  ig->zDb, pConfig
1ef40 2d 3e 7a 4e 61 6d 65 0a 20 20 20 20 29 29 3b 0a  ->zName.    ));.
1ef50 20 20 7d 0a 0a 20 20 69 66 28 20 70 2d 3e 72 63    }..  if( p->rc
1ef60 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
1ef70 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65     /* Initialize
1ef80 20 74 68 65 20 34 2d 62 79 74 65 20 6c 65 61 66   the 4-byte leaf
1ef90 2d 70 61 67 65 20 68 65 61 64 65 72 20 74 6f 20  -page header to 
1efa0 30 78 30 30 2e 20 2a 2f 0a 20 20 20 20 6d 65 6d  0x00. */.    mem
1efb0 73 65 74 28 70 57 72 69 74 65 72 2d 3e 77 72 69  set(pWriter->wri
1efc0 74 65 72 2e 62 75 66 2e 70 2c 20 30 2c 20 34 29  ter.buf.p, 0, 4)
1efd0 3b 0a 20 20 20 20 70 57 72 69 74 65 72 2d 3e 77  ;.    pWriter->w
1efe0 72 69 74 65 72 2e 62 75 66 2e 6e 20 3d 20 34 3b  riter.buf.n = 4;
1eff0 0a 0a 20 20 20 20 2f 2a 20 42 69 6e 64 20 74 68  ..    /* Bind th
1f000 65 20 63 75 72 72 65 6e 74 20 6f 75 74 70 75 74  e current output
1f010 20 73 65 67 6d 65 6e 74 20 69 64 20 74 6f 20 74   segment id to t
1f020 68 65 20 69 6e 64 65 78 2d 77 72 69 74 65 72 2e  he index-writer.
1f030 20 54 68 69 73 20 69 73 20 61 6e 0a 20 20 20 20   This is an.    
1f040 2a 2a 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20  ** optimization 
1f050 6f 76 65 72 20 62 69 6e 64 69 6e 67 20 74 68 65  over binding the
1f060 20 73 61 6d 65 20 76 61 6c 75 65 20 6f 76 65 72   same value over
1f070 20 61 6e 64 20 6f 76 65 72 20 61 73 20 72 6f 77   and over as row
1f080 73 20 61 72 65 0a 20 20 20 20 2a 2a 20 69 6e 73  s are.    ** ins
1f090 65 72 74 65 64 20 69 6e 74 6f 20 25 5f 69 64 78  erted into %_idx
1f0a0 20 62 79 20 74 68 65 20 63 75 72 72 65 6e 74 20   by the current 
1f0b0 77 72 69 74 65 72 2e 20 20 2a 2f 0a 20 20 20 20  writer.  */.    
1f0c0 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74  sqlite3_bind_int
1f0d0 28 70 2d 3e 70 49 64 78 57 72 69 74 65 72 2c 20  (p->pIdxWriter, 
1f0e0 31 2c 20 70 57 72 69 74 65 72 2d 3e 69 53 65 67  1, pWriter->iSeg
1f0f0 69 64 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  id);.  }.}../*.*
1f100 2a 20 49 74 65 72 61 74 6f 72 20 70 49 74 65 72  * Iterator pIter
1f110 20 77 61 73 20 75 73 65 64 20 74 6f 20 69 74 65   was used to ite
1f120 72 61 74 65 20 74 68 72 6f 75 67 68 20 74 68 65  rate through the
1f130 20 69 6e 70 75 74 20 73 65 67 6d 65 6e 74 73 20   input segments 
1f140 6f 66 20 6f 6e 20 61 6e 0a 2a 2a 20 69 6e 63 72  of on an.** incr
1f150 65 6d 65 6e 74 61 6c 20 6d 65 72 67 65 20 6f 70  emental merge op
1f160 65 72 61 74 69 6f 6e 2e 20 54 68 69 73 20 66 75  eration. This fu
1f170 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
1f180 20 69 66 20 74 68 65 20 69 6e 63 72 65 6d 65 6e   if the incremen
1f190 74 61 6c 0a 2a 2a 20 6d 65 72 67 65 20 73 74 65  tal.** merge ste
1f1a0 70 20 68 61 73 20 66 69 6e 69 73 68 65 64 20 62  p has finished b
1f1b0 75 74 20 74 68 65 20 69 6e 70 75 74 20 68 61 73  ut the input has
1f1c0 20 6e 6f 74 20 62 65 65 6e 20 63 6f 6d 70 6c 65   not been comple
1f1d0 74 65 6c 79 20 65 78 68 61 75 73 74 65 64 2e 0a  tely exhausted..
1f1e0 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
1f1f0 74 73 35 54 72 69 6d 53 65 67 6d 65 6e 74 73 28  ts5TrimSegments(
1f200 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 46 74  Fts5Index *p, Ft
1f210 73 35 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a  s5Iter *pIter){.
1f220 20 20 69 6e 74 20 69 3b 0a 20 20 46 74 73 35 42    int i;.  Fts5B
1f230 75 66 66 65 72 20 62 75 66 3b 0a 20 20 6d 65 6d  uffer buf;.  mem
1f240 73 65 74 28 26 62 75 66 2c 20 30 2c 20 73 69 7a  set(&buf, 0, siz
1f250 65 6f 66 28 46 74 73 35 42 75 66 66 65 72 29 29  eof(Fts5Buffer))
1f260 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
1f270 49 74 65 72 2d 3e 6e 53 65 67 3b 20 69 2b 2b 29  Iter->nSeg; i++)
1f280 7b 0a 20 20 20 20 46 74 73 35 53 65 67 49 74 65  {.    Fts5SegIte
1f290 72 20 2a 70 53 65 67 20 3d 20 26 70 49 74 65 72  r *pSeg = &pIter
1f2a0 2d 3e 61 53 65 67 5b 69 5d 3b 0a 20 20 20 20 69  ->aSeg[i];.    i
1f2b0 66 28 20 70 53 65 67 2d 3e 70 53 65 67 3d 3d 30  f( pSeg->pSeg==0
1f2c0 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 6e 6f 2d   ){.      /* no-
1f2d0 6f 70 20 2a 2f 0a 20 20 20 20 7d 65 6c 73 65 20  op */.    }else 
1f2e0 69 66 28 20 70 53 65 67 2d 3e 70 4c 65 61 66 3d  if( pSeg->pLeaf=
1f2f0 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41  =0 ){.      /* A
1f300 6c 6c 20 6b 65 79 73 20 66 72 6f 6d 20 74 68 69  ll keys from thi
1f310 73 20 69 6e 70 75 74 20 73 65 67 6d 65 6e 74 20  s input segment 
1f320 68 61 76 65 20 62 65 65 6e 20 74 72 61 6e 73 66  have been transf
1f330 65 72 65 64 20 74 6f 20 74 68 65 20 6f 75 74 70  ered to the outp
1f340 75 74 2e 0a 20 20 20 20 20 20 2a 2a 20 53 65 74  ut..      ** Set
1f350 20 62 6f 74 68 20 74 68 65 20 66 69 72 73 74 20   both the first 
1f360 61 6e 64 20 6c 61 73 74 20 70 61 67 65 2d 6e 75  and last page-nu
1f370 6d 62 65 72 73 20 74 6f 20 30 20 74 6f 20 69 6e  mbers to 0 to in
1f380 64 69 63 61 74 65 20 74 68 61 74 20 74 68 65 0a  dicate that the.
1f390 20 20 20 20 20 20 2a 2a 20 73 65 67 6d 65 6e 74        ** segment
1f3a0 20 69 73 20 6e 6f 77 20 65 6d 70 74 79 2e 20 2a   is now empty. *
1f3b0 2f 0a 20 20 20 20 20 20 70 53 65 67 2d 3e 70 53  /.      pSeg->pS
1f3c0 65 67 2d 3e 70 67 6e 6f 4c 61 73 74 20 3d 20 30  eg->pgnoLast = 0
1f3d0 3b 0a 20 20 20 20 20 20 70 53 65 67 2d 3e 70 53  ;.      pSeg->pS
1f3e0 65 67 2d 3e 70 67 6e 6f 46 69 72 73 74 20 3d 20  eg->pgnoFirst = 
1f3f0 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  0;.    }else{.  
1f400 20 20 20 20 69 6e 74 20 69 4f 66 66 20 3d 20 70      int iOff = p
1f410 53 65 67 2d 3e 69 54 65 72 6d 4c 65 61 66 4f 66  Seg->iTermLeafOf
1f420 66 73 65 74 3b 20 20 20 20 20 2f 2a 20 4f 66 66  fset;     /* Off
1f430 73 65 74 20 6f 6e 20 6e 65 77 20 66 69 72 73 74  set on new first
1f440 20 6c 65 61 66 20 70 61 67 65 20 2a 2f 0a 20 20   leaf page */.  
1f450 20 20 20 20 69 36 34 20 69 4c 65 61 66 52 6f 77      i64 iLeafRow
1f460 69 64 3b 0a 20 20 20 20 20 20 46 74 73 35 44 61  id;.      Fts5Da
1f470 74 61 20 2a 70 44 61 74 61 3b 0a 20 20 20 20 20  ta *pData;.     
1f480 20 69 6e 74 20 69 49 64 20 3d 20 70 53 65 67 2d   int iId = pSeg-
1f490 3e 70 53 65 67 2d 3e 69 53 65 67 69 64 3b 0a 20  >pSeg->iSegid;. 
1f4a0 20 20 20 20 20 75 38 20 61 48 64 72 5b 34 5d 20       u8 aHdr[4] 
1f4b0 3d 20 7b 30 78 30 30 2c 20 30 78 30 30 2c 20 30  = {0x00, 0x00, 0
1f4c0 78 30 30 2c 20 30 78 30 30 7d 3b 0a 0a 20 20 20  x00, 0x00};..   
1f4d0 20 20 20 69 4c 65 61 66 52 6f 77 69 64 20 3d 20     iLeafRowid = 
1f4e0 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f 52 4f 57  FTS5_SEGMENT_ROW
1f4f0 49 44 28 69 49 64 2c 20 70 53 65 67 2d 3e 69 54  ID(iId, pSeg->iT
1f500 65 72 6d 4c 65 61 66 50 67 6e 6f 29 3b 0a 20 20  ermLeafPgno);.  
1f510 20 20 20 20 70 44 61 74 61 20 3d 20 66 74 73 35      pData = fts5
1f520 44 61 74 61 52 65 61 64 28 70 2c 20 69 4c 65 61  DataRead(p, iLea
1f530 66 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 69  fRowid);.      i
1f540 66 28 20 70 44 61 74 61 20 29 7b 0a 20 20 20 20  f( pData ){.    
1f550 20 20 20 20 66 74 73 35 42 75 66 66 65 72 5a 65      fts5BufferZe
1f560 72 6f 28 26 62 75 66 29 3b 0a 20 20 20 20 20 20  ro(&buf);.      
1f570 20 20 66 74 73 35 42 75 66 66 65 72 47 72 6f 77    fts5BufferGrow
1f580 28 26 70 2d 3e 72 63 2c 20 26 62 75 66 2c 20 70  (&p->rc, &buf, p
1f590 44 61 74 61 2d 3e 6e 6e 29 3b 0a 20 20 20 20 20  Data->nn);.     
1f5a0 20 20 20 66 74 73 35 42 75 66 66 65 72 41 70 70     fts5BufferApp
1f5b0 65 6e 64 42 6c 6f 62 28 26 70 2d 3e 72 63 2c 20  endBlob(&p->rc, 
1f5c0 26 62 75 66 2c 20 73 69 7a 65 6f 66 28 61 48 64  &buf, sizeof(aHd
1f5d0 72 29 2c 20 61 48 64 72 29 3b 0a 20 20 20 20 20  r), aHdr);.     
1f5e0 20 20 20 66 74 73 35 42 75 66 66 65 72 41 70 70     fts5BufferApp
1f5f0 65 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e 72 63  endVarint(&p->rc
1f600 2c 20 26 62 75 66 2c 20 70 53 65 67 2d 3e 74 65  , &buf, pSeg->te
1f610 72 6d 2e 6e 29 3b 0a 20 20 20 20 20 20 20 20 66  rm.n);.        f
1f620 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 42  ts5BufferAppendB
1f630 6c 6f 62 28 26 70 2d 3e 72 63 2c 20 26 62 75 66  lob(&p->rc, &buf
1f640 2c 20 70 53 65 67 2d 3e 74 65 72 6d 2e 6e 2c 20  , pSeg->term.n, 
1f650 70 53 65 67 2d 3e 74 65 72 6d 2e 70 29 3b 0a 20  pSeg->term.p);. 
1f660 20 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65         fts5Buffe
1f670 72 41 70 70 65 6e 64 42 6c 6f 62 28 26 70 2d 3e  rAppendBlob(&p->
1f680 72 63 2c 20 26 62 75 66 2c 20 70 44 61 74 61 2d  rc, &buf, pData-
1f690 3e 73 7a 4c 65 61 66 2d 69 4f 66 66 2c 20 26 70  >szLeaf-iOff, &p
1f6a0 44 61 74 61 2d 3e 70 5b 69 4f 66 66 5d 29 3b 0a  Data->p[iOff]);.
1f6b0 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72          if( p->r
1f6c0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
1f6d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 74            /* Set
1f6e0 20 74 68 65 20 73 7a 4c 65 61 66 20 66 69 65 6c   the szLeaf fiel
1f6f0 64 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 66  d */.          f
1f700 74 73 35 50 75 74 55 31 36 28 26 62 75 66 2e 70  ts5PutU16(&buf.p
1f710 5b 32 5d 2c 20 28 75 31 36 29 62 75 66 2e 6e 29  [2], (u16)buf.n)
1f720 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20  ;.        }..   
1f730 20 20 20 20 20 2f 2a 20 53 65 74 20 75 70 20 74       /* Set up t
1f740 68 65 20 6e 65 77 20 70 61 67 65 2d 69 6e 64 65  he new page-inde
1f750 78 20 61 72 72 61 79 20 2a 2f 0a 20 20 20 20 20  x array */.     
1f760 20 20 20 66 74 73 35 42 75 66 66 65 72 41 70 70     fts5BufferApp
1f770 65 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e 72 63  endVarint(&p->rc
1f780 2c 20 26 62 75 66 2c 20 34 29 3b 0a 20 20 20 20  , &buf, 4);.    
1f790 20 20 20 20 69 66 28 20 70 53 65 67 2d 3e 69 4c      if( pSeg->iL
1f7a0 65 61 66 50 67 6e 6f 3d 3d 70 53 65 67 2d 3e 69  eafPgno==pSeg->i
1f7b0 54 65 72 6d 4c 65 61 66 50 67 6e 6f 20 0a 20 20  TermLeafPgno .  
1f7c0 20 20 20 20 20 20 20 26 26 20 70 53 65 67 2d 3e         && pSeg->
1f7d0 69 45 6e 64 6f 66 44 6f 63 6c 69 73 74 3c 70 44  iEndofDoclist<pD
1f7e0 61 74 61 2d 3e 73 7a 4c 65 61 66 20 0a 20 20 20  ata->szLeaf .   
1f7f0 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
1f800 20 20 69 6e 74 20 6e 44 69 66 66 20 3d 20 70 44    int nDiff = pD
1f810 61 74 61 2d 3e 73 7a 4c 65 61 66 20 2d 20 70 53  ata->szLeaf - pS
1f820 65 67 2d 3e 69 45 6e 64 6f 66 44 6f 63 6c 69 73  eg->iEndofDoclis
1f830 74 3b 0a 20 20 20 20 20 20 20 20 20 20 66 74 73  t;.          fts
1f840 35 42 75 66 66 65 72 41 70 70 65 6e 64 56 61 72  5BufferAppendVar
1f850 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26 62 75 66  int(&p->rc, &buf
1f860 2c 20 62 75 66 2e 6e 20 2d 20 31 20 2d 20 6e 44  , buf.n - 1 - nD
1f870 69 66 66 20 2d 20 34 29 3b 0a 20 20 20 20 20 20  iff - 4);.      
1f880 20 20 20 20 66 74 73 35 42 75 66 66 65 72 41 70      fts5BufferAp
1f890 70 65 6e 64 42 6c 6f 62 28 26 70 2d 3e 72 63 2c  pendBlob(&p->rc,
1f8a0 20 26 62 75 66 2c 20 0a 20 20 20 20 20 20 20 20   &buf, .        
1f8b0 20 20 20 20 20 20 70 44 61 74 61 2d 3e 6e 6e 20        pData->nn 
1f8c0 2d 20 70 53 65 67 2d 3e 69 50 67 69 64 78 4f 66  - pSeg->iPgidxOf
1f8d0 66 2c 20 26 70 44 61 74 61 2d 3e 70 5b 70 53 65  f, &pData->p[pSe
1f8e0 67 2d 3e 69 50 67 69 64 78 4f 66 66 5d 0a 20 20  g->iPgidxOff].  
1f8f0 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20          );.     
1f900 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 66 74     }..        ft
1f910 73 35 44 61 74 61 52 65 6c 65 61 73 65 28 70 44  s5DataRelease(pD
1f920 61 74 61 29 3b 0a 20 20 20 20 20 20 20 20 70 53  ata);.        pS
1f930 65 67 2d 3e 70 53 65 67 2d 3e 70 67 6e 6f 46 69  eg->pSeg->pgnoFi
1f940 72 73 74 20 3d 20 70 53 65 67 2d 3e 69 54 65 72  rst = pSeg->iTer
1f950 6d 4c 65 61 66 50 67 6e 6f 3b 0a 20 20 20 20 20  mLeafPgno;.     
1f960 20 20 20 66 74 73 35 44 61 74 61 44 65 6c 65 74     fts5DataDelet
1f970 65 28 70 2c 20 46 54 53 35 5f 53 45 47 4d 45 4e  e(p, FTS5_SEGMEN
1f980 54 5f 52 4f 57 49 44 28 69 49 64 2c 20 31 29 2c  T_ROWID(iId, 1),
1f990 20 69 4c 65 61 66 52 6f 77 69 64 29 3b 0a 20 20   iLeafRowid);.  
1f9a0 20 20 20 20 20 20 66 74 73 35 44 61 74 61 57 72        fts5DataWr
1f9b0 69 74 65 28 70 2c 20 69 4c 65 61 66 52 6f 77 69  ite(p, iLeafRowi
1f9c0 64 2c 20 62 75 66 2e 70 2c 20 62 75 66 2e 6e 29  d, buf.p, buf.n)
1f9d0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
1f9e0 20 20 7d 0a 20 20 66 74 73 35 42 75 66 66 65 72    }.  fts5Buffer
1f9f0 46 72 65 65 28 26 62 75 66 29 3b 0a 7d 0a 0a 73  Free(&buf);.}..s
1fa00 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 4d  tatic void fts5M
1fa10 65 72 67 65 43 68 75 6e 6b 43 61 6c 6c 62 61 63  ergeChunkCallbac
1fa20 6b 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a  k(.  Fts5Index *
1fa30 70 2c 20 0a 20 20 76 6f 69 64 20 2a 70 43 74 78  p, .  void *pCtx
1fa40 2c 20 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 70  , .  const u8 *p
1fa50 43 68 75 6e 6b 2c 20 69 6e 74 20 6e 43 68 75 6e  Chunk, int nChun
1fa60 6b 0a 29 7b 0a 20 20 46 74 73 35 53 65 67 57 72  k.){.  Fts5SegWr
1fa70 69 74 65 72 20 2a 70 57 72 69 74 65 72 20 3d 20  iter *pWriter = 
1fa80 28 46 74 73 35 53 65 67 57 72 69 74 65 72 2a 29  (Fts5SegWriter*)
1fa90 70 43 74 78 3b 0a 20 20 66 74 73 35 57 72 69 74  pCtx;.  fts5Writ
1faa0 65 41 70 70 65 6e 64 50 6f 73 6c 69 73 74 44 61  eAppendPoslistDa
1fab0 74 61 28 70 2c 20 70 57 72 69 74 65 72 2c 20 70  ta(p, pWriter, p
1fac0 43 68 75 6e 6b 2c 20 6e 43 68 75 6e 6b 29 3b 0a  Chunk, nChunk);.
1fad0 7d 0a 0a 2f 2a 0a 2a 2a 0a 2a 2f 0a 73 74 61 74  }../*.**.*/.stat
1fae0 69 63 20 76 6f 69 64 20 66 74 73 35 49 6e 64 65  ic void fts5Inde
1faf0 78 4d 65 72 67 65 4c 65 76 65 6c 28 0a 20 20 46  xMergeLevel(.  F
1fb00 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20  ts5Index *p,    
1fb10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1fb20 2a 20 46 54 53 35 20 62 61 63 6b 65 6e 64 20 6f  * FTS5 backend o
1fb30 62 6a 65 63 74 20 2a 2f 0a 20 20 46 74 73 35 53  bject */.  Fts5S
1fb40 74 72 75 63 74 75 72 65 20 2a 2a 70 70 53 74 72  tructure **ppStr
1fb50 75 63 74 2c 20 20 20 20 20 20 20 2f 2a 20 49 4e  uct,       /* IN
1fb60 2f 4f 55 54 3a 20 53 74 75 63 74 75 72 65 20 6f  /OUT: Stucture o
1fb70 66 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74  f index */.  int
1fb80 20 69 4c 76 6c 2c 20 20 20 20 20 20 20 20 20 20   iLvl,          
1fb90 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1fba0 4c 65 76 65 6c 20 74 6f 20 72 65 61 64 20 69 6e  Level to read in
1fbb0 70 75 74 20 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e  put from */.  in
1fbc0 74 20 2a 70 6e 52 65 6d 20 20 20 20 20 20 20 20  t *pnRem        
1fbd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1fbe0 20 57 72 69 74 65 20 75 70 20 74 6f 20 74 68 69   Write up to thi
1fbf0 73 20 6d 61 6e 79 20 6f 75 74 70 75 74 20 6c 65  s many output le
1fc00 61 76 65 73 20 2a 2f 0a 29 7b 0a 20 20 46 74 73  aves */.){.  Fts
1fc10 35 53 74 72 75 63 74 75 72 65 20 2a 70 53 74 72  5Structure *pStr
1fc20 75 63 74 20 3d 20 2a 70 70 53 74 72 75 63 74 3b  uct = *ppStruct;
1fc30 0a 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65  .  Fts5Structure
1fc40 4c 65 76 65 6c 20 2a 70 4c 76 6c 20 3d 20 26 70  Level *pLvl = &p
1fc50 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69  Struct->aLevel[i
1fc60 4c 76 6c 5d 3b 0a 20 20 46 74 73 35 53 74 72 75  Lvl];.  Fts5Stru
1fc70 63 74 75 72 65 4c 65 76 65 6c 20 2a 70 4c 76 6c  ctureLevel *pLvl
1fc80 4f 75 74 3b 0a 20 20 46 74 73 35 49 74 65 72 20  Out;.  Fts5Iter 
1fc90 2a 70 49 74 65 72 20 3d 20 30 3b 20 20 20 20 20  *pIter = 0;     
1fca0 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 74 6f    /* Iterator to
1fcb0 20 72 65 61 64 20 69 6e 70 75 74 20 64 61 74 61   read input data
1fcc0 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 6d 20 3d   */.  int nRem =
1fcd0 20 70 6e 52 65 6d 20 3f 20 2a 70 6e 52 65 6d 20   pnRem ? *pnRem 
1fce0 3a 20 30 3b 20 20 2f 2a 20 4f 75 74 70 75 74 20  : 0;  /* Output 
1fcf0 6c 65 61 66 20 70 61 67 65 73 20 6c 65 66 74 20  leaf pages left 
1fd00 74 6f 20 77 72 69 74 65 20 2a 2f 0a 20 20 69 6e  to write */.  in
1fd10 74 20 6e 49 6e 70 75 74 3b 20 20 20 20 20 20 20  t nInput;       
1fd20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1fd30 20 4e 75 6d 62 65 72 20 6f 66 20 69 6e 70 75 74   Number of input
1fd40 20 73 65 67 6d 65 6e 74 73 20 2a 2f 0a 20 20 46   segments */.  F
1fd50 74 73 35 53 65 67 57 72 69 74 65 72 20 77 72 69  ts5SegWriter wri
1fd60 74 65 72 3b 20 20 20 20 20 20 20 20 20 20 20 2f  ter;           /
1fd70 2a 20 57 72 69 74 65 72 20 6f 62 6a 65 63 74 20  * Writer object 
1fd80 2a 2f 0a 20 20 46 74 73 35 53 74 72 75 63 74 75  */.  Fts5Structu
1fd90 72 65 53 65 67 6d 65 6e 74 20 2a 70 53 65 67 3b  reSegment *pSeg;
1fda0 20 20 20 20 20 2f 2a 20 4f 75 74 70 75 74 20 73       /* Output s
1fdb0 65 67 6d 65 6e 74 20 2a 2f 0a 20 20 46 74 73 35  egment */.  Fts5
1fdc0 42 75 66 66 65 72 20 74 65 72 6d 3b 0a 20 20 69  Buffer term;.  i
1fdd0 6e 74 20 62 4f 6c 64 65 73 74 3b 20 20 20 20 20  nt bOldest;     
1fde0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1fdf0 2a 20 54 72 75 65 20 69 66 20 74 68 65 20 6f 75  * True if the ou
1fe00 74 70 75 74 20 73 65 67 6d 65 6e 74 20 69 73 20  tput segment is 
1fe10 74 68 65 20 6f 6c 64 65 73 74 20 2a 2f 0a 20 20  the oldest */.  
1fe20 69 6e 74 20 65 44 65 74 61 69 6c 20 3d 20 70 2d  int eDetail = p-
1fe30 3e 70 43 6f 6e 66 69 67 2d 3e 65 44 65 74 61 69  >pConfig->eDetai
1fe40 6c 3b 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 66  l;.  const int f
1fe50 6c 61 67 73 20 3d 20 46 54 53 35 49 4e 44 45 58  lags = FTS5INDEX
1fe60 5f 51 55 45 52 59 5f 4e 4f 4f 55 54 50 55 54 3b  _QUERY_NOOUTPUT;
1fe70 0a 0a 20 20 61 73 73 65 72 74 28 20 69 4c 76 6c  ..  assert( iLvl
1fe80 3c 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c  <pStruct->nLevel
1fe90 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4c   );.  assert( pL
1fea0 76 6c 2d 3e 6e 4d 65 72 67 65 3c 3d 70 4c 76 6c  vl->nMerge<=pLvl
1feb0 2d 3e 6e 53 65 67 20 29 3b 0a 0a 20 20 6d 65 6d  ->nSeg );..  mem
1fec0 73 65 74 28 26 77 72 69 74 65 72 2c 20 30 2c 20  set(&writer, 0, 
1fed0 73 69 7a 65 6f 66 28 46 74 73 35 53 65 67 57 72  sizeof(Fts5SegWr
1fee0 69 74 65 72 29 29 3b 0a 20 20 6d 65 6d 73 65 74  iter));.  memset
1fef0 28 26 74 65 72 6d 2c 20 30 2c 20 73 69 7a 65 6f  (&term, 0, sizeo
1ff00 66 28 46 74 73 35 42 75 66 66 65 72 29 29 3b 0a  f(Fts5Buffer));.
1ff10 20 20 69 66 28 20 70 4c 76 6c 2d 3e 6e 4d 65 72    if( pLvl->nMer
1ff20 67 65 20 29 7b 0a 20 20 20 20 70 4c 76 6c 4f 75  ge ){.    pLvlOu
1ff30 74 20 3d 20 26 70 53 74 72 75 63 74 2d 3e 61 4c  t = &pStruct->aL
1ff40 65 76 65 6c 5b 69 4c 76 6c 2b 31 5d 3b 0a 20 20  evel[iLvl+1];.  
1ff50 20 20 61 73 73 65 72 74 28 20 70 4c 76 6c 4f 75    assert( pLvlOu
1ff60 74 2d 3e 6e 53 65 67 3e 30 20 29 3b 0a 20 20 20  t->nSeg>0 );.   
1ff70 20 6e 49 6e 70 75 74 20 3d 20 70 4c 76 6c 2d 3e   nInput = pLvl->
1ff80 6e 4d 65 72 67 65 3b 0a 20 20 20 20 70 53 65 67  nMerge;.    pSeg
1ff90 20 3d 20 26 70 4c 76 6c 4f 75 74 2d 3e 61 53 65   = &pLvlOut->aSe
1ffa0 67 5b 70 4c 76 6c 4f 75 74 2d 3e 6e 53 65 67 2d  g[pLvlOut->nSeg-
1ffb0 31 5d 3b 0a 0a 20 20 20 20 66 74 73 35 57 72 69  1];..    fts5Wri
1ffc0 74 65 49 6e 69 74 28 70 2c 20 26 77 72 69 74 65  teInit(p, &write
1ffd0 72 2c 20 70 53 65 67 2d 3e 69 53 65 67 69 64 29  r, pSeg->iSegid)
1ffe0 3b 0a 20 20 20 20 77 72 69 74 65 72 2e 77 72 69  ;.    writer.wri
1fff0 74 65 72 2e 70 67 6e 6f 20 3d 20 70 53 65 67 2d  ter.pgno = pSeg-
20000 3e 70 67 6e 6f 4c 61 73 74 2b 31 3b 0a 20 20 20  >pgnoLast+1;.   
20010 20 77 72 69 74 65 72 2e 69 42 74 50 61 67 65 20   writer.iBtPage 
20020 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  = 0;.  }else{.  
20030 20 20 69 6e 74 20 69 53 65 67 69 64 20 3d 20 66    int iSegid = f
20040 74 73 35 41 6c 6c 6f 63 61 74 65 53 65 67 69 64  ts5AllocateSegid
20050 28 70 2c 20 70 53 74 72 75 63 74 29 3b 0a 0a 20  (p, pStruct);.. 
20060 20 20 20 2f 2a 20 45 78 74 65 6e 64 20 74 68 65     /* Extend the
20070 20 46 74 73 35 53 74 72 75 63 74 75 72 65 20 6f   Fts5Structure o
20080 62 6a 65 63 74 20 61 73 20 72 65 71 75 69 72 65  bject as require
20090 64 20 74 6f 20 65 6e 73 75 72 65 20 74 68 65 20  d to ensure the 
200a0 6f 75 74 70 75 74 0a 20 20 20 20 2a 2a 20 73 65  output.    ** se
200b0 67 6d 65 6e 74 20 65 78 69 73 74 73 2e 20 2a 2f  gment exists. */
200c0 0a 20 20 20 20 69 66 28 20 69 4c 76 6c 3d 3d 70  .    if( iLvl==p
200d0 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 2d 31  Struct->nLevel-1
200e0 20 29 7b 0a 20 20 20 20 20 20 66 74 73 35 53 74   ){.      fts5St
200f0 72 75 63 74 75 72 65 41 64 64 4c 65 76 65 6c 28  ructureAddLevel(
20100 26 70 2d 3e 72 63 2c 20 70 70 53 74 72 75 63 74  &p->rc, ppStruct
20110 29 3b 0a 20 20 20 20 20 20 70 53 74 72 75 63 74  );.      pStruct
20120 20 3d 20 2a 70 70 53 74 72 75 63 74 3b 0a 20 20   = *ppStruct;.  
20130 20 20 7d 0a 20 20 20 20 66 74 73 35 53 74 72 75    }.    fts5Stru
20140 63 74 75 72 65 45 78 74 65 6e 64 4c 65 76 65 6c  ctureExtendLevel
20150 28 26 70 2d 3e 72 63 2c 20 70 53 74 72 75 63 74  (&p->rc, pStruct
20160 2c 20 69 4c 76 6c 2b 31 2c 20 31 2c 20 30 29 3b  , iLvl+1, 1, 0);
20170 0a 20 20 20 20 69 66 28 20 70 2d 3e 72 63 20 29  .    if( p->rc )
20180 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 70 4c 76   return;.    pLv
20190 6c 20 3d 20 26 70 53 74 72 75 63 74 2d 3e 61 4c  l = &pStruct->aL
201a0 65 76 65 6c 5b 69 4c 76 6c 5d 3b 0a 20 20 20 20  evel[iLvl];.    
201b0 70 4c 76 6c 4f 75 74 20 3d 20 26 70 53 74 72 75  pLvlOut = &pStru
201c0 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c 2b  ct->aLevel[iLvl+
201d0 31 5d 3b 0a 0a 20 20 20 20 66 74 73 35 57 72 69  1];..    fts5Wri
201e0 74 65 49 6e 69 74 28 70 2c 20 26 77 72 69 74 65  teInit(p, &write
201f0 72 2c 20 69 53 65 67 69 64 29 3b 0a 0a 20 20 20  r, iSegid);..   
20200 20 2f 2a 20 41 64 64 20 74 68 65 20 6e 65 77 20   /* Add the new 
20210 73 65 67 6d 65 6e 74 20 74 6f 20 74 68 65 20 6f  segment to the o
20220 75 74 70 75 74 20 6c 65 76 65 6c 20 2a 2f 0a 20  utput level */. 
20230 20 20 20 70 53 65 67 20 3d 20 26 70 4c 76 6c 4f     pSeg = &pLvlO
20240 75 74 2d 3e 61 53 65 67 5b 70 4c 76 6c 4f 75 74  ut->aSeg[pLvlOut
20250 2d 3e 6e 53 65 67 5d 3b 0a 20 20 20 20 70 4c 76  ->nSeg];.    pLv
20260 6c 4f 75 74 2d 3e 6e 53 65 67 2b 2b 3b 0a 20 20  lOut->nSeg++;.  
20270 20 20 70 53 65 67 2d 3e 70 67 6e 6f 46 69 72 73    pSeg->pgnoFirs
20280 74 20 3d 20 31 3b 0a 20 20 20 20 70 53 65 67 2d  t = 1;.    pSeg-
20290 3e 69 53 65 67 69 64 20 3d 20 69 53 65 67 69 64  >iSegid = iSegid
202a0 3b 0a 20 20 20 20 70 53 74 72 75 63 74 2d 3e 6e  ;.    pStruct->n
202b0 53 65 67 6d 65 6e 74 2b 2b 3b 0a 0a 20 20 20 20  Segment++;..    
202c0 2f 2a 20 52 65 61 64 20 69 6e 70 75 74 20 66 72  /* Read input fr
202d0 6f 6d 20 61 6c 6c 20 73 65 67 6d 65 6e 74 73 20  om all segments 
202e0 69 6e 20 74 68 65 20 69 6e 70 75 74 20 6c 65 76  in the input lev
202f0 65 6c 20 2a 2f 0a 20 20 20 20 6e 49 6e 70 75 74  el */.    nInput
20300 20 3d 20 70 4c 76 6c 2d 3e 6e 53 65 67 3b 0a 20   = pLvl->nSeg;. 
20310 20 7d 0a 20 20 62 4f 6c 64 65 73 74 20 3d 20 28   }.  bOldest = (
20320 70 4c 76 6c 4f 75 74 2d 3e 6e 53 65 67 3d 3d 31  pLvlOut->nSeg==1
20330 20 26 26 20 70 53 74 72 75 63 74 2d 3e 6e 4c 65   && pStruct->nLe
20340 76 65 6c 3d 3d 69 4c 76 6c 2b 32 29 3b 0a 0a 20  vel==iLvl+2);.. 
20350 20 61 73 73 65 72 74 28 20 69 4c 76 6c 3e 3d 30   assert( iLvl>=0
20360 20 29 3b 0a 20 20 66 6f 72 28 66 74 73 35 4d 75   );.  for(fts5Mu
20370 6c 74 69 49 74 65 72 4e 65 77 28 70 2c 20 70 53  ltiIterNew(p, pS
20380 74 72 75 63 74 2c 20 66 6c 61 67 73 2c 20 30 2c  truct, flags, 0,
20390 20 30 2c 20 30 2c 20 69 4c 76 6c 2c 20 6e 49 6e   0, 0, iLvl, nIn
203a0 70 75 74 2c 20 26 70 49 74 65 72 29 3b 0a 20 20  put, &pIter);.  
203b0 20 20 20 20 66 74 73 35 4d 75 6c 74 69 49 74 65      fts5MultiIte
203c0 72 45 6f 66 28 70 2c 20 70 49 74 65 72 29 3d 3d  rEof(p, pIter)==
203d0 30 3b 0a 20 20 20 20 20 20 66 74 73 35 4d 75 6c  0;.      fts5Mul
203e0 74 69 49 74 65 72 4e 65 78 74 28 70 2c 20 70 49  tiIterNext(p, pI
203f0 74 65 72 2c 20 30 2c 20 30 29 0a 20 20 29 7b 0a  ter, 0, 0).  ){.
20400 20 20 20 20 46 74 73 35 53 65 67 49 74 65 72 20      Fts5SegIter 
20410 2a 70 53 65 67 49 74 65 72 20 3d 20 26 70 49 74  *pSegIter = &pIt
20420 65 72 2d 3e 61 53 65 67 5b 20 70 49 74 65 72 2d  er->aSeg[ pIter-
20430 3e 61 46 69 72 73 74 5b 31 5d 2e 69 46 69 72 73  >aFirst[1].iFirs
20440 74 20 5d 3b 0a 20 20 20 20 69 6e 74 20 6e 50 6f  t ];.    int nPo
20450 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s;              
20460 20 20 20 20 20 20 20 2f 2a 20 70 6f 73 69 74 69         /* positi
20470 6f 6e 2d 6c 69 73 74 20 73 69 7a 65 20 66 69 65  on-list size fie
20480 6c 64 20 76 61 6c 75 65 20 2a 2f 0a 20 20 20 20  ld value */.    
20490 69 6e 74 20 6e 54 65 72 6d 3b 0a 20 20 20 20 63  int nTerm;.    c
204a0 6f 6e 73 74 20 75 38 20 2a 70 54 65 72 6d 3b 0a  onst u8 *pTerm;.
204b0 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f  .    /* Check fo
204c0 72 20 6b 65 79 20 61 6e 6e 69 68 69 6c 61 74 69  r key annihilati
204d0 6f 6e 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70  on. */.    if( p
204e0 53 65 67 49 74 65 72 2d 3e 6e 50 6f 73 3d 3d 30  SegIter->nPos==0
204f0 20 26 26 20 28 62 4f 6c 64 65 73 74 20 7c 7c 20   && (bOldest || 
20500 70 53 65 67 49 74 65 72 2d 3e 62 44 65 6c 3d 3d  pSegIter->bDel==
20510 30 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 0a  0) ) continue;..
20520 20 20 20 20 70 54 65 72 6d 20 3d 20 66 74 73 35      pTerm = fts5
20530 4d 75 6c 74 69 49 74 65 72 54 65 72 6d 28 70 49  MultiIterTerm(pI
20540 74 65 72 2c 20 26 6e 54 65 72 6d 29 3b 0a 20 20  ter, &nTerm);.  
20550 20 20 69 66 28 20 6e 54 65 72 6d 21 3d 74 65 72    if( nTerm!=ter
20560 6d 2e 6e 20 7c 7c 20 6d 65 6d 63 6d 70 28 70 54  m.n || memcmp(pT
20570 65 72 6d 2c 20 74 65 72 6d 2e 70 2c 20 6e 54 65  erm, term.p, nTe
20580 72 6d 29 20 29 7b 0a 20 20 20 20 20 20 69 66 28  rm) ){.      if(
20590 20 70 6e 52 65 6d 20 26 26 20 77 72 69 74 65 72   pnRem && writer
205a0 2e 6e 4c 65 61 66 57 72 69 74 74 65 6e 3e 6e 52  .nLeafWritten>nR
205b0 65 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 62 72  em ){.        br
205c0 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  eak;.      }..  
205d0 20 20 20 20 2f 2a 20 54 68 69 73 20 69 73 20 61      /* This is a
205e0 20 6e 65 77 20 74 65 72 6d 2e 20 41 70 70 65 6e   new term. Appen
205f0 64 20 61 20 74 65 72 6d 20 74 6f 20 74 68 65 20  d a term to the 
20600 6f 75 74 70 75 74 20 73 65 67 6d 65 6e 74 2e 20  output segment. 
20610 2a 2f 0a 20 20 20 20 20 20 66 74 73 35 57 72 69  */.      fts5Wri
20620 74 65 41 70 70 65 6e 64 54 65 72 6d 28 70 2c 20  teAppendTerm(p, 
20630 26 77 72 69 74 65 72 2c 20 6e 54 65 72 6d 2c 20  &writer, nTerm, 
20640 70 54 65 72 6d 29 3b 0a 20 20 20 20 20 20 66 74  pTerm);.      ft
20650 73 35 42 75 66 66 65 72 53 65 74 28 26 70 2d 3e  s5BufferSet(&p->
20660 72 63 2c 20 26 74 65 72 6d 2c 20 6e 54 65 72 6d  rc, &term, nTerm
20670 2c 20 70 54 65 72 6d 29 3b 0a 20 20 20 20 7d 0a  , pTerm);.    }.
20680 0a 20 20 20 20 2f 2a 20 41 70 70 65 6e 64 20 74  .    /* Append t
20690 68 65 20 72 6f 77 69 64 20 74 6f 20 74 68 65 20  he rowid to the 
206a0 6f 75 74 70 75 74 20 2a 2f 0a 20 20 20 20 2f 2a  output */.    /*
206b0 20 57 52 49 54 45 50 4f 53 4c 49 53 54 53 49 5a   WRITEPOSLISTSIZ
206c0 45 20 2a 2f 0a 20 20 20 20 66 74 73 35 57 72 69  E */.    fts5Wri
206d0 74 65 41 70 70 65 6e 64 52 6f 77 69 64 28 70 2c  teAppendRowid(p,
206e0 20 26 77 72 69 74 65 72 2c 20 66 74 73 35 4d 75   &writer, fts5Mu
206f0 6c 74 69 49 74 65 72 52 6f 77 69 64 28 70 49 74  ltiIterRowid(pIt
20700 65 72 29 29 3b 0a 0a 20 20 20 20 69 66 28 20 65  er));..    if( e
20710 44 65 74 61 69 6c 3d 3d 46 54 53 35 5f 44 45 54  Detail==FTS5_DET
20720 41 49 4c 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20  AIL_NONE ){.    
20730 20 20 69 66 28 20 70 53 65 67 49 74 65 72 2d 3e    if( pSegIter->
20740 62 44 65 6c 20 29 7b 0a 20 20 20 20 20 20 20 20  bDel ){.        
20750 66 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64  fts5BufferAppend
20760 56 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26  Varint(&p->rc, &
20770 77 72 69 74 65 72 2e 77 72 69 74 65 72 2e 62 75  writer.writer.bu
20780 66 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69  f, 0);.        i
20790 66 28 20 70 53 65 67 49 74 65 72 2d 3e 6e 50 6f  f( pSegIter->nPo
207a0 73 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  s>0 ){.         
207b0 20 66 74 73 35 42 75 66 66 65 72 41 70 70 65 6e   fts5BufferAppen
207c0 64 56 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20  dVarint(&p->rc, 
207d0 26 77 72 69 74 65 72 2e 77 72 69 74 65 72 2e 62  &writer.writer.b
207e0 75 66 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  uf, 0);.        
207f0 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  }.      }.    }e
20800 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 41 70  lse{.      /* Ap
20810 70 65 6e 64 20 74 68 65 20 70 6f 73 69 74 69 6f  pend the positio
20820 6e 2d 6c 69 73 74 20 64 61 74 61 20 74 6f 20 74  n-list data to t
20830 68 65 20 6f 75 74 70 75 74 20 2a 2f 0a 20 20 20  he output */.   
20840 20 20 20 6e 50 6f 73 20 3d 20 70 53 65 67 49 74     nPos = pSegIt
20850 65 72 2d 3e 6e 50 6f 73 2a 32 20 2b 20 70 53 65  er->nPos*2 + pSe
20860 67 49 74 65 72 2d 3e 62 44 65 6c 3b 0a 20 20 20  gIter->bDel;.   
20870 20 20 20 66 74 73 35 42 75 66 66 65 72 41 70 70     fts5BufferApp
20880 65 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e 72 63  endVarint(&p->rc
20890 2c 20 26 77 72 69 74 65 72 2e 77 72 69 74 65 72  , &writer.writer
208a0 2e 62 75 66 2c 20 6e 50 6f 73 29 3b 0a 20 20 20  .buf, nPos);.   
208b0 20 20 20 66 74 73 35 43 68 75 6e 6b 49 74 65 72     fts5ChunkIter
208c0 61 74 65 28 70 2c 20 70 53 65 67 49 74 65 72 2c  ate(p, pSegIter,
208d0 20 28 76 6f 69 64 2a 29 26 77 72 69 74 65 72 2c   (void*)&writer,
208e0 20 66 74 73 35 4d 65 72 67 65 43 68 75 6e 6b 43   fts5MergeChunkC
208f0 61 6c 6c 62 61 63 6b 29 3b 0a 20 20 20 20 7d 0a  allback);.    }.
20900 20 20 7d 0a 0a 20 20 2f 2a 20 46 6c 75 73 68 20    }..  /* Flush 
20910 74 68 65 20 6c 61 73 74 20 6c 65 61 66 20 70 61  the last leaf pa
20920 67 65 20 74 6f 20 64 69 73 6b 2e 20 53 65 74 20  ge to disk. Set 
20930 74 68 65 20 6f 75 74 70 75 74 20 73 65 67 6d 65  the output segme
20940 6e 74 20 62 2d 74 72 65 65 20 68 65 69 67 68 74  nt b-tree height
20950 0a 20 20 2a 2a 20 61 6e 64 20 6c 61 73 74 20 6c  .  ** and last l
20960 65 61 66 20 70 61 67 65 20 6e 75 6d 62 65 72 20  eaf page number 
20970 61 74 20 74 68 65 20 73 61 6d 65 20 74 69 6d 65  at the same time
20980 2e 20 20 2a 2f 0a 20 20 66 74 73 35 57 72 69 74  .  */.  fts5Writ
20990 65 46 69 6e 69 73 68 28 70 2c 20 26 77 72 69 74  eFinish(p, &writ
209a0 65 72 2c 20 26 70 53 65 67 2d 3e 70 67 6e 6f 4c  er, &pSeg->pgnoL
209b0 61 73 74 29 3b 0a 0a 20 20 69 66 28 20 66 74 73  ast);..  if( fts
209c0 35 4d 75 6c 74 69 49 74 65 72 45 6f 66 28 70 2c  5MultiIterEof(p,
209d0 20 70 49 74 65 72 29 20 29 7b 0a 20 20 20 20 69   pIter) ){.    i
209e0 6e 74 20 69 3b 0a 0a 20 20 20 20 2f 2a 20 52 65  nt i;..    /* Re
209f0 6d 6f 76 65 20 74 68 65 20 72 65 64 75 6e 64 61  move the redunda
20a00 6e 74 20 73 65 67 6d 65 6e 74 73 20 66 72 6f 6d  nt segments from
20a10 20 74 68 65 20 25 5f 64 61 74 61 20 74 61 62 6c   the %_data tabl
20a20 65 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30  e */.    for(i=0
20a30 3b 20 69 3c 6e 49 6e 70 75 74 3b 20 69 2b 2b 29  ; i<nInput; i++)
20a40 7b 0a 20 20 20 20 20 20 66 74 73 35 44 61 74 61  {.      fts5Data
20a50 52 65 6d 6f 76 65 53 65 67 6d 65 6e 74 28 70 2c  RemoveSegment(p,
20a60 20 70 4c 76 6c 2d 3e 61 53 65 67 5b 69 5d 2e 69   pLvl->aSeg[i].i
20a70 53 65 67 69 64 29 3b 0a 20 20 20 20 7d 0a 0a 20  Segid);.    }.. 
20a80 20 20 20 2f 2a 20 52 65 6d 6f 76 65 20 74 68 65     /* Remove the
20a90 20 72 65 64 75 6e 64 61 6e 74 20 73 65 67 6d 65   redundant segme
20aa0 6e 74 73 20 66 72 6f 6d 20 74 68 65 20 69 6e 70  nts from the inp
20ab0 75 74 20 6c 65 76 65 6c 20 2a 2f 0a 20 20 20 20  ut level */.    
20ac0 69 66 28 20 70 4c 76 6c 2d 3e 6e 53 65 67 21 3d  if( pLvl->nSeg!=
20ad0 6e 49 6e 70 75 74 20 29 7b 0a 20 20 20 20 20 20  nInput ){.      
20ae0 69 6e 74 20 6e 4d 6f 76 65 20 3d 20 28 70 4c 76  int nMove = (pLv
20af0 6c 2d 3e 6e 53 65 67 20 2d 20 6e 49 6e 70 75 74  l->nSeg - nInput
20b00 29 20 2a 20 73 69 7a 65 6f 66 28 46 74 73 35 53  ) * sizeof(Fts5S
20b10 74 72 75 63 74 75 72 65 53 65 67 6d 65 6e 74 29  tructureSegment)
20b20 3b 0a 20 20 20 20 20 20 6d 65 6d 6d 6f 76 65 28  ;.      memmove(
20b30 70 4c 76 6c 2d 3e 61 53 65 67 2c 20 26 70 4c 76  pLvl->aSeg, &pLv
20b40 6c 2d 3e 61 53 65 67 5b 6e 49 6e 70 75 74 5d 2c  l->aSeg[nInput],
20b50 20 6e 4d 6f 76 65 29 3b 0a 20 20 20 20 7d 0a 20   nMove);.    }. 
20b60 20 20 20 70 53 74 72 75 63 74 2d 3e 6e 53 65 67     pStruct->nSeg
20b70 6d 65 6e 74 20 2d 3d 20 6e 49 6e 70 75 74 3b 0a  ment -= nInput;.
20b80 20 20 20 20 70 4c 76 6c 2d 3e 6e 53 65 67 20 2d      pLvl->nSeg -
20b90 3d 20 6e 49 6e 70 75 74 3b 0a 20 20 20 20 70 4c  = nInput;.    pL
20ba0 76 6c 2d 3e 6e 4d 65 72 67 65 20 3d 20 30 3b 0a  vl->nMerge = 0;.
20bb0 20 20 20 20 69 66 28 20 70 53 65 67 2d 3e 70 67      if( pSeg->pg
20bc0 6e 6f 4c 61 73 74 3d 3d 30 20 29 7b 0a 20 20 20  noLast==0 ){.   
20bd0 20 20 20 70 4c 76 6c 4f 75 74 2d 3e 6e 53 65 67     pLvlOut->nSeg
20be0 2d 2d 3b 0a 20 20 20 20 20 20 70 53 74 72 75 63  --;.      pStruc
20bf0 74 2d 3e 6e 53 65 67 6d 65 6e 74 2d 2d 3b 0a 20  t->nSegment--;. 
20c00 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20     }.  }else{.  
20c10 20 20 61 73 73 65 72 74 28 20 70 53 65 67 2d 3e    assert( pSeg->
20c20 70 67 6e 6f 4c 61 73 74 3e 30 20 29 3b 0a 20 20  pgnoLast>0 );.  
20c30 20 20 66 74 73 35 54 72 69 6d 53 65 67 6d 65 6e    fts5TrimSegmen
20c40 74 73 28 70 2c 20 70 49 74 65 72 29 3b 0a 20 20  ts(p, pIter);.  
20c50 20 20 70 4c 76 6c 2d 3e 6e 4d 65 72 67 65 20 3d    pLvl->nMerge =
20c60 20 6e 49 6e 70 75 74 3b 0a 20 20 7d 0a 0a 20 20   nInput;.  }..  
20c70 66 74 73 35 4d 75 6c 74 69 49 74 65 72 46 72 65  fts5MultiIterFre
20c80 65 28 70 49 74 65 72 29 3b 0a 20 20 66 74 73 35  e(pIter);.  fts5
20c90 42 75 66 66 65 72 46 72 65 65 28 26 74 65 72 6d  BufferFree(&term
20ca0 29 3b 0a 20 20 69 66 28 20 70 6e 52 65 6d 20 29  );.  if( pnRem )
20cb0 20 2a 70 6e 52 65 6d 20 2d 3d 20 77 72 69 74 65   *pnRem -= write
20cc0 72 2e 6e 4c 65 61 66 57 72 69 74 74 65 6e 3b 0a  r.nLeafWritten;.
20cd0 7d 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20 75 70 20 74  }../*.** Do up t
20ce0 6f 20 6e 50 67 20 70 61 67 65 73 20 6f 66 20 61  o nPg pages of a
20cf0 75 74 6f 6d 65 72 67 65 20 77 6f 72 6b 20 6f 6e  utomerge work on
20d00 20 74 68 65 20 69 6e 64 65 78 2e 0a 2a 2a 0a 2a   the index..**.*
20d10 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66  * Return true if
20d20 20 61 6e 79 20 63 68 61 6e 67 65 73 20 77 65 72   any changes wer
20d30 65 20 61 63 74 75 61 6c 6c 79 20 6d 61 64 65 2c  e actually made,
20d40 20 6f 72 20 66 61 6c 73 65 20 6f 74 68 65 72 77   or false otherw
20d50 69 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ise..*/.static i
20d60 6e 74 20 66 74 73 35 49 6e 64 65 78 4d 65 72 67  nt fts5IndexMerg
20d70 65 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a  e(.  Fts5Index *
20d80 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
20d90 20 20 20 20 20 2f 2a 20 46 54 53 35 20 62 61 63       /* FTS5 bac
20da0 6b 65 6e 64 20 6f 62 6a 65 63 74 20 2a 2f 0a 20  kend object */. 
20db0 20 46 74 73 35 53 74 72 75 63 74 75 72 65 20 2a   Fts5Structure *
20dc0 2a 70 70 53 74 72 75 63 74 2c 20 20 20 20 20 20  *ppStruct,      
20dd0 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 43 75 72 72   /* IN/OUT: Curr
20de0 65 6e 74 20 73 74 72 75 63 74 75 72 65 20 6f 66  ent structure of
20df0 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20   index */.  int 
20e00 6e 50 67 2c 20 20 20 20 20 20 20 20 20 20 20 20  nPg,            
20e10 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
20e20 61 67 65 73 20 6f 66 20 77 6f 72 6b 20 74 6f 20  ages of work to 
20e30 64 6f 20 2a 2f 0a 20 20 69 6e 74 20 6e 4d 69 6e  do */.  int nMin
20e40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20e50 20 20 20 20 20 20 20 20 2f 2a 20 4d 69 6e 69 6d          /* Minim
20e60 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 73 65 67  um number of seg
20e70 6d 65 6e 74 73 20 74 6f 20 6d 65 72 67 65 20 2a  ments to merge *
20e80 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 52 65 6d 20  /.){.  int nRem 
20e90 3d 20 6e 50 67 3b 0a 20 20 69 6e 74 20 62 52 65  = nPg;.  int bRe
20ea0 74 20 3d 20 30 3b 0a 20 20 46 74 73 35 53 74 72  t = 0;.  Fts5Str
20eb0 75 63 74 75 72 65 20 2a 70 53 74 72 75 63 74 20  ucture *pStruct 
20ec0 3d 20 2a 70 70 53 74 72 75 63 74 3b 0a 20 20 77  = *ppStruct;.  w
20ed0 68 69 6c 65 28 20 6e 52 65 6d 3e 30 20 26 26 20  hile( nRem>0 && 
20ee0 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
20ef0 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 4c 76 6c   ){.    int iLvl
20f00 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
20f10 20 20 20 20 2f 2a 20 54 6f 20 69 74 65 72 61 74      /* To iterat
20f20 65 20 74 68 72 6f 75 67 68 20 6c 65 76 65 6c 73  e through levels
20f30 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 42 65 73   */.    int iBes
20f40 74 4c 76 6c 20 3d 20 30 3b 20 20 20 20 20 20 20  tLvl = 0;       
20f50 20 20 20 20 2f 2a 20 4c 65 76 65 6c 20 6f 66 66      /* Level off
20f60 65 72 69 6e 67 20 74 68 65 20 6d 6f 73 74 20 69  ering the most i
20f70 6e 70 75 74 20 73 65 67 6d 65 6e 74 73 20 2a 2f  nput segments */
20f80 0a 20 20 20 20 69 6e 74 20 6e 42 65 73 74 20 3d  .    int nBest =
20f90 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
20fa0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 69 6e   /* Number of in
20fb0 70 75 74 20 73 65 67 6d 65 6e 74 73 20 6f 6e 20  put segments on 
20fc0 62 65 73 74 20 6c 65 76 65 6c 20 2a 2f 0a 0a 20  best level */.. 
20fd0 20 20 20 2f 2a 20 53 65 74 20 69 42 65 73 74 4c     /* Set iBestL
20fe0 76 6c 20 74 6f 20 74 68 65 20 6c 65 76 65 6c 20  vl to the level 
20ff0 74 6f 20 72 65 61 64 20 69 6e 70 75 74 20 73 65  to read input se
21000 67 6d 65 6e 74 73 20 66 72 6f 6d 2e 20 2a 2f 0a  gments from. */.
21010 20 20 20 20 61 73 73 65 72 74 28 20 70 53 74 72      assert( pStr
21020 75 63 74 2d 3e 6e 4c 65 76 65 6c 3e 30 20 29 3b  uct->nLevel>0 );
21030 0a 20 20 20 20 66 6f 72 28 69 4c 76 6c 3d 30 3b  .    for(iLvl=0;
21040 20 69 4c 76 6c 3c 70 53 74 72 75 63 74 2d 3e 6e   iLvl<pStruct->n
21050 4c 65 76 65 6c 3b 20 69 4c 76 6c 2b 2b 29 7b 0a  Level; iLvl++){.
21060 20 20 20 20 20 20 46 74 73 35 53 74 72 75 63 74        Fts5Struct
21070 75 72 65 4c 65 76 65 6c 20 2a 70 4c 76 6c 20 3d  ureLevel *pLvl =
21080 20 26 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65   &pStruct->aLeve
21090 6c 5b 69 4c 76 6c 5d 3b 0a 20 20 20 20 20 20 69  l[iLvl];.      i
210a0 66 28 20 70 4c 76 6c 2d 3e 6e 4d 65 72 67 65 20  f( pLvl->nMerge 
210b0 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  ){.        if( p
210c0 4c 76 6c 2d 3e 6e 4d 65 72 67 65 3e 6e 42 65 73  Lvl->nMerge>nBes
210d0 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  t ){.          i
210e0 42 65 73 74 4c 76 6c 20 3d 20 69 4c 76 6c 3b 0a  BestLvl = iLvl;.
210f0 20 20 20 20 20 20 20 20 20 20 6e 42 65 73 74 20            nBest 
21100 3d 20 70 4c 76 6c 2d 3e 6e 4d 65 72 67 65 3b 0a  = pLvl->nMerge;.
21110 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
21120 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
21130 0a 20 20 20 20 20 20 69 66 28 20 70 4c 76 6c 2d  .      if( pLvl-
21140 3e 6e 53 65 67 3e 6e 42 65 73 74 20 29 7b 0a 20  >nSeg>nBest ){. 
21150 20 20 20 20 20 20 20 6e 42 65 73 74 20 3d 20 70         nBest = p
21160 4c 76 6c 2d 3e 6e 53 65 67 3b 0a 20 20 20 20 20  Lvl->nSeg;.     
21170 20 20 20 69 42 65 73 74 4c 76 6c 20 3d 20 69 4c     iBestLvl = iL
21180 76 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  vl;.      }.    
21190 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 6e 42 65  }..    /* If nBe
211a0 73 74 20 69 73 20 73 74 69 6c 6c 20 30 2c 20 74  st is still 0, t
211b0 68 65 6e 20 74 68 65 20 69 6e 64 65 78 20 6d 75  hen the index mu
211c0 73 74 20 62 65 20 65 6d 70 74 79 2e 20 2a 2f 0a  st be empty. */.
211d0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
211e0 42 55 47 0a 20 20 20 20 66 6f 72 28 69 4c 76 6c  BUG.    for(iLvl
211f0 3d 30 3b 20 6e 42 65 73 74 3d 3d 30 20 26 26 20  =0; nBest==0 && 
21200 69 4c 76 6c 3c 70 53 74 72 75 63 74 2d 3e 6e 4c  iLvl<pStruct->nL
21210 65 76 65 6c 3b 20 69 4c 76 6c 2b 2b 29 7b 0a 20  evel; iLvl++){. 
21220 20 20 20 20 20 61 73 73 65 72 74 28 20 70 53 74       assert( pSt
21230 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76  ruct->aLevel[iLv
21240 6c 5d 2e 6e 53 65 67 3d 3d 30 20 29 3b 0a 20 20  l].nSeg==0 );.  
21250 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20    }.#endif..    
21260 69 66 28 20 6e 42 65 73 74 3c 6e 4d 69 6e 20 26  if( nBest<nMin &
21270 26 20 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65  & pStruct->aLeve
21280 6c 5b 69 42 65 73 74 4c 76 6c 5d 2e 6e 4d 65 72  l[iBestLvl].nMer
21290 67 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 62  ge==0 ){.      b
212a0 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
212b0 62 52 65 74 20 3d 20 31 3b 0a 20 20 20 20 66 74  bRet = 1;.    ft
212c0 73 35 49 6e 64 65 78 4d 65 72 67 65 4c 65 76 65  s5IndexMergeLeve
212d0 6c 28 70 2c 20 26 70 53 74 72 75 63 74 2c 20 69  l(p, &pStruct, i
212e0 42 65 73 74 4c 76 6c 2c 20 26 6e 52 65 6d 29 3b  BestLvl, &nRem);
212f0 0a 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d  .    if( p->rc==
21300 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 53 74  SQLITE_OK && pSt
21310 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 42 65  ruct->aLevel[iBe
21320 73 74 4c 76 6c 5d 2e 6e 4d 65 72 67 65 3d 3d 30  stLvl].nMerge==0
21330 20 29 7b 0a 20 20 20 20 20 20 66 74 73 35 53 74   ){.      fts5St
21340 72 75 63 74 75 72 65 50 72 6f 6d 6f 74 65 28 70  ructurePromote(p
21350 2c 20 69 42 65 73 74 4c 76 6c 2b 31 2c 20 70 53  , iBestLvl+1, pS
21360 74 72 75 63 74 29 3b 0a 20 20 20 20 7d 0a 20 20  truct);.    }.  
21370 7d 0a 20 20 2a 70 70 53 74 72 75 63 74 20 3d 20  }.  *ppStruct = 
21380 70 53 74 72 75 63 74 3b 0a 20 20 72 65 74 75 72  pStruct;.  retur
21390 6e 20 62 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n bRet;.}../*.**
213a0 20 41 20 74 6f 74 61 6c 20 6f 66 20 6e 4c 65 61   A total of nLea
213b0 66 20 6c 65 61 66 20 70 61 67 65 73 20 6f 66 20  f leaf pages of 
213c0 64 61 74 61 20 68 61 73 20 6a 75 73 74 20 62 65  data has just be
213d0 65 6e 20 66 6c 75 73 68 65 64 20 74 6f 20 61 20  en flushed to a 
213e0 6c 65 76 65 6c 2d 30 0a 2a 2a 20 73 65 67 6d 65  level-0.** segme
213f0 6e 74 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f  nt. This functio
21400 6e 20 75 70 64 61 74 65 73 20 74 68 65 20 77 72  n updates the wr
21410 69 74 65 2d 63 6f 75 6e 74 65 72 20 61 63 63 6f  ite-counter acco
21420 72 64 69 6e 67 6c 79 20 61 6e 64 2c 20 69 66 0a  rdingly and, if.
21430 2a 2a 20 6e 65 63 65 73 73 61 72 79 2c 20 70 65  ** necessary, pe
21440 72 66 6f 72 6d 73 20 69 6e 63 72 65 6d 65 6e 74  rforms increment
21450 61 6c 20 6d 65 72 67 65 20 77 6f 72 6b 2e 0a 2a  al merge work..*
21460 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72  *.** If an error
21470 20 6f 63 63 75 72 73 2c 20 73 65 74 20 74 68 65   occurs, set the
21480 20 46 74 73 35 49 6e 64 65 78 2e 72 63 20 65 72   Fts5Index.rc er
21490 72 6f 72 20 63 6f 64 65 2e 20 49 66 20 61 6e 20  ror code. If an 
214a0 65 72 72 6f 72 20 68 61 73 20 0a 2a 2a 20 61 6c  error has .** al
214b0 72 65 61 64 79 20 6f 63 63 75 72 72 65 64 2c 20  ready occurred, 
214c0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
214d0 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61   a no-op..*/.sta
214e0 74 69 63 20 76 6f 69 64 20 66 74 73 35 49 6e 64  tic void fts5Ind
214f0 65 78 41 75 74 6f 6d 65 72 67 65 28 0a 20 20 46  exAutomerge(.  F
21500 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20  ts5Index *p,    
21510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
21520 2a 20 46 54 53 35 20 62 61 63 6b 65 6e 64 20 6f  * FTS5 backend o
21530 62 6a 65 63 74 20 2a 2f 0a 20 20 46 74 73 35 53  bject */.  Fts5S
21540 74 72 75 63 74 75 72 65 20 2a 2a 70 70 53 74 72  tructure **ppStr
21550 75 63 74 2c 20 20 20 20 20 20 20 2f 2a 20 49 4e  uct,       /* IN
21560 2f 4f 55 54 3a 20 43 75 72 72 65 6e 74 20 73 74  /OUT: Current st
21570 72 75 63 74 75 72 65 20 6f 66 20 69 6e 64 65 78  ructure of index
21580 20 2a 2f 0a 20 20 69 6e 74 20 6e 4c 65 61 66 20   */.  int nLeaf 
21590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
215a0 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
215b0 6f 66 20 6f 75 74 70 75 74 20 6c 65 61 76 65 73  of output leaves
215c0 20 6a 75 73 74 20 77 72 69 74 74 65 6e 20 2a 2f   just written */
215d0 0a 29 7b 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d  .){.  if( p->rc=
215e0 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 2d  =SQLITE_OK && p-
215f0 3e 70 43 6f 6e 66 69 67 2d 3e 6e 41 75 74 6f 6d  >pConfig->nAutom
21600 65 72 67 65 3e 30 20 29 7b 0a 20 20 20 20 46 74  erge>0 ){.    Ft
21610 73 35 53 74 72 75 63 74 75 72 65 20 2a 70 53 74  s5Structure *pSt
21620 72 75 63 74 20 3d 20 2a 70 70 53 74 72 75 63 74  ruct = *ppStruct
21630 3b 0a 20 20 20 20 75 36 34 20 6e 57 72 69 74 65  ;.    u64 nWrite
21640 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
21650 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c 20 76      /* Initial v
21660 61 6c 75 65 20 6f 66 20 77 72 69 74 65 2d 63 6f  alue of write-co
21670 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20 69 6e 74  unter */.    int
21680 20 6e 57 6f 72 6b 3b 20 20 20 20 20 20 20 20 20   nWork;         
21690 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
216a0 6d 62 65 72 20 6f 66 20 77 6f 72 6b 2d 71 75 61  mber of work-qua
216b0 6e 74 61 20 74 6f 20 70 65 72 66 6f 72 6d 20 2a  nta to perform *
216c0 2f 0a 20 20 20 20 69 6e 74 20 6e 52 65 6d 3b 20  /.    int nRem; 
216d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
216e0 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
216f0 20 6c 65 61 66 20 70 61 67 65 73 20 6c 65 66 74   leaf pages left
21700 20 74 6f 20 77 72 69 74 65 20 2a 2f 0a 0a 20 20   to write */..  
21710 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20    /* Update the 
21720 77 72 69 74 65 2d 63 6f 75 6e 74 65 72 2e 20 57  write-counter. W
21730 68 69 6c 65 20 64 6f 69 6e 67 20 73 6f 2c 20 73  hile doing so, s
21740 65 74 20 6e 57 6f 72 6b 2e 20 2a 2f 0a 20 20 20  et nWork. */.   
21750 20 6e 57 72 69 74 65 20 3d 20 70 53 74 72 75 63   nWrite = pStruc
21760 74 2d 3e 6e 57 72 69 74 65 43 6f 75 6e 74 65 72  t->nWriteCounter
21770 3b 0a 20 20 20 20 6e 57 6f 72 6b 20 3d 20 28 69  ;.    nWork = (i
21780 6e 74 29 28 28 28 6e 57 72 69 74 65 20 2b 20 6e  nt)(((nWrite + n
21790 4c 65 61 66 29 20 2f 20 70 2d 3e 6e 57 6f 72 6b  Leaf) / p->nWork
217a0 55 6e 69 74 29 20 2d 20 28 6e 57 72 69 74 65 20  Unit) - (nWrite 
217b0 2f 20 70 2d 3e 6e 57 6f 72 6b 55 6e 69 74 29 29  / p->nWorkUnit))
217c0 3b 0a 20 20 20 20 70 53 74 72 75 63 74 2d 3e 6e  ;.    pStruct->n
217d0 57 72 69 74 65 43 6f 75 6e 74 65 72 20 2b 3d 20  WriteCounter += 
217e0 6e 4c 65 61 66 3b 0a 20 20 20 20 6e 52 65 6d 20  nLeaf;.    nRem 
217f0 3d 20 28 69 6e 74 29 28 70 2d 3e 6e 57 6f 72 6b  = (int)(p->nWork
21800 55 6e 69 74 20 2a 20 6e 57 6f 72 6b 20 2a 20 70  Unit * nWork * p
21810 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 29 3b  Struct->nLevel);
21820 0a 0a 20 20 20 20 66 74 73 35 49 6e 64 65 78 4d  ..    fts5IndexM
21830 65 72 67 65 28 70 2c 20 70 70 53 74 72 75 63 74  erge(p, ppStruct
21840 2c 20 6e 52 65 6d 2c 20 70 2d 3e 70 43 6f 6e 66  , nRem, p->pConf
21850 69 67 2d 3e 6e 41 75 74 6f 6d 65 72 67 65 29 3b  ig->nAutomerge);
21860 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 76  .  }.}..static v
21870 6f 69 64 20 66 74 73 35 49 6e 64 65 78 43 72 69  oid fts5IndexCri
21880 73 69 73 6d 65 72 67 65 28 0a 20 20 46 74 73 35  sismerge(.  Fts5
21890 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20  Index *p,       
218a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
218b0 54 53 35 20 62 61 63 6b 65 6e 64 20 6f 62 6a 65  TS5 backend obje
218c0 63 74 20 2a 2f 0a 20 20 46 74 73 35 53 74 72 75  ct */.  Fts5Stru
218d0 63 74 75 72 65 20 2a 2a 70 70 53 74 72 75 63 74  cture **ppStruct
218e0 20 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f 55          /* IN/OU
218f0 54 3a 20 43 75 72 72 65 6e 74 20 73 74 72 75 63  T: Current struc
21900 74 75 72 65 20 6f 66 20 69 6e 64 65 78 20 2a 2f  ture of index */
21910 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20  .){.  const int 
21920 6e 43 72 69 73 69 73 20 3d 20 70 2d 3e 70 43 6f  nCrisis = p->pCo
21930 6e 66 69 67 2d 3e 6e 43 72 69 73 69 73 4d 65 72  nfig->nCrisisMer
21940 67 65 3b 0a 20 20 46 74 73 35 53 74 72 75 63 74  ge;.  Fts5Struct
21950 75 72 65 20 2a 70 53 74 72 75 63 74 20 3d 20 2a  ure *pStruct = *
21960 70 70 53 74 72 75 63 74 3b 0a 20 20 69 6e 74 20  ppStruct;.  int 
21970 69 4c 76 6c 20 3d 20 30 3b 0a 0a 20 20 61 73 73  iLvl = 0;..  ass
21980 65 72 74 28 20 70 2d 3e 72 63 21 3d 53 51 4c 49  ert( p->rc!=SQLI
21990 54 45 5f 4f 4b 20 7c 7c 20 70 53 74 72 75 63 74  TE_OK || pStruct
219a0 2d 3e 6e 4c 65 76 65 6c 3e 30 20 29 3b 0a 20 20  ->nLevel>0 );.  
219b0 77 68 69 6c 65 28 20 70 2d 3e 72 63 3d 3d 53 51  while( p->rc==SQ
219c0 4c 49 54 45 5f 4f 4b 20 26 26 20 70 53 74 72 75  LITE_OK && pStru
219d0 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d  ct->aLevel[iLvl]
219e0 2e 6e 53 65 67 3e 3d 6e 43 72 69 73 69 73 20 29  .nSeg>=nCrisis )
219f0 7b 0a 20 20 20 20 66 74 73 35 49 6e 64 65 78 4d  {.    fts5IndexM
21a00 65 72 67 65 4c 65 76 65 6c 28 70 2c 20 26 70 53  ergeLevel(p, &pS
21a10 74 72 75 63 74 2c 20 69 4c 76 6c 2c 20 30 29 3b  truct, iLvl, 0);
21a20 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e  .    assert( p->
21a30 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc!=SQLITE_OK ||
21a40 20 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c   pStruct->nLevel
21a50 3e 28 69 4c 76 6c 2b 31 29 20 29 3b 0a 20 20 20  >(iLvl+1) );.   
21a60 20 66 74 73 35 53 74 72 75 63 74 75 72 65 50 72   fts5StructurePr
21a70 6f 6d 6f 74 65 28 70 2c 20 69 4c 76 6c 2b 31 2c  omote(p, iLvl+1,
21a80 20 70 53 74 72 75 63 74 29 3b 0a 20 20 20 20 69   pStruct);.    i
21a90 4c 76 6c 2b 2b 3b 0a 20 20 7d 0a 20 20 2a 70 70  Lvl++;.  }.  *pp
21aa0 53 74 72 75 63 74 20 3d 20 70 53 74 72 75 63 74  Struct = pStruct
21ab0 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20  ;.}..static int 
21ac0 66 74 73 35 49 6e 64 65 78 52 65 74 75 72 6e 28  fts5IndexReturn(
21ad0 46 74 73 35 49 6e 64 65 78 20 2a 70 29 7b 0a 20  Fts5Index *p){. 
21ae0 20 69 6e 74 20 72 63 20 3d 20 70 2d 3e 72 63 3b   int rc = p->rc;
21af0 0a 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54  .  p->rc = SQLIT
21b00 45 5f 4f 4b 3b 0a 20 20 72 65 74 75 72 6e 20 72  E_OK;.  return r
21b10 63 3b 0a 7d 0a 0a 74 79 70 65 64 65 66 20 73 74  c;.}..typedef st
21b20 72 75 63 74 20 46 74 73 35 46 6c 75 73 68 43 74  ruct Fts5FlushCt
21b30 78 20 46 74 73 35 46 6c 75 73 68 43 74 78 3b 0a  x Fts5FlushCtx;.
21b40 73 74 72 75 63 74 20 46 74 73 35 46 6c 75 73 68  struct Fts5Flush
21b50 43 74 78 20 7b 0a 20 20 46 74 73 35 49 6e 64 65  Ctx {.  Fts5Inde
21b60 78 20 2a 70 49 64 78 3b 0a 20 20 46 74 73 35 53  x *pIdx;.  Fts5S
21b70 65 67 57 72 69 74 65 72 20 77 72 69 74 65 72 3b  egWriter writer;
21b80 20 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 42 75 66 66   .};../*.** Buff
21b90 65 72 20 61 42 75 66 5b 5d 20 63 6f 6e 74 61 69  er aBuf[] contai
21ba0 6e 73 20 61 20 6c 69 73 74 20 6f 66 20 76 61 72  ns a list of var
21bb0 69 6e 74 73 2c 20 61 6c 6c 20 73 6d 61 6c 6c 20  ints, all small 
21bc0 65 6e 6f 75 67 68 20 74 6f 20 66 69 74 0a 2a 2a  enough to fit.**
21bd0 20 69 6e 20 61 20 33 32 2d 62 69 74 20 69 6e 74   in a 32-bit int
21be0 65 67 65 72 2e 20 52 65 74 75 72 6e 20 74 68 65  eger. Return the
21bf0 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6c 61 72   size of the lar
21c00 67 65 73 74 20 70 72 65 66 69 78 20 6f 66 20 74  gest prefix of t
21c10 68 69 73 20 0a 2a 2a 20 6c 69 73 74 20 6e 4d 61  his .** list nMa
21c20 78 20 62 79 74 65 73 20 6f 72 20 6c 65 73 73 20  x bytes or less 
21c30 69 6e 20 73 69 7a 65 2e 0a 2a 2f 0a 73 74 61 74  in size..*/.stat
21c40 69 63 20 69 6e 74 20 66 74 73 35 50 6f 73 6c 69  ic int fts5Posli
21c50 73 74 50 72 65 66 69 78 28 63 6f 6e 73 74 20 75  stPrefix(const u
21c60 38 20 2a 61 42 75 66 2c 20 69 6e 74 20 6e 4d 61  8 *aBuf, int nMa
21c70 78 29 7b 0a 20 20 69 6e 74 20 72 65 74 3b 0a 20  x){.  int ret;. 
21c80 20 75 33 32 20 64 75 6d 6d 79 3b 0a 20 20 72 65   u32 dummy;.  re
21c90 74 20 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e  t = fts5GetVarin
21ca0 74 33 32 28 61 42 75 66 2c 20 64 75 6d 6d 79 29  t32(aBuf, dummy)
21cb0 3b 0a 20 20 69 66 28 20 72 65 74 3c 6e 4d 61 78  ;.  if( ret<nMax
21cc0 20 29 7b 0a 20 20 20 20 77 68 69 6c 65 28 20 31   ){.    while( 1
21cd0 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 20   ){.      int i 
21ce0 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e 74 33  = fts5GetVarint3
21cf0 32 28 26 61 42 75 66 5b 72 65 74 5d 2c 20 64 75  2(&aBuf[ret], du
21d00 6d 6d 79 29 3b 0a 20 20 20 20 20 20 69 66 28 20  mmy);.      if( 
21d10 28 72 65 74 20 2b 20 69 29 20 3e 20 6e 4d 61 78  (ret + i) > nMax
21d20 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
21d30 72 65 74 20 2b 3d 20 69 3b 0a 20 20 20 20 7d 0a  ret += i;.    }.
21d40 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 65 74    }.  return ret
21d50 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 6c 75 73 68  ;.}../*.** Flush
21d60 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
21d70 20 69 6e 2d 6d 65 6d 6f 72 79 20 68 61 73 68 20   in-memory hash 
21d80 74 61 62 6c 65 20 69 48 61 73 68 20 74 6f 20 61  table iHash to a
21d90 20 6e 65 77 20 6c 65 76 65 6c 2d 30 20 0a 2a 2a   new level-0 .**
21da0 20 73 65 67 6d 65 6e 74 20 6f 6e 20 64 69 73 6b   segment on disk
21db0 2e 20 41 6c 73 6f 20 75 70 64 61 74 65 20 74 68  . Also update th
21dc0 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  e corresponding 
21dd0 73 74 72 75 63 74 75 72 65 20 72 65 63 6f 72 64  structure record
21de0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72  ..**.** If an er
21df0 72 6f 72 20 6f 63 63 75 72 73 2c 20 73 65 74 20  ror occurs, set 
21e00 74 68 65 20 46 74 73 35 49 6e 64 65 78 2e 72 63  the Fts5Index.rc
21e10 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 49 66 20   error code. If 
21e20 61 6e 20 65 72 72 6f 72 20 68 61 73 20 0a 2a 2a  an error has .**
21e30 20 61 6c 72 65 61 64 79 20 6f 63 63 75 72 72 65   already occurre
21e40 64 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  d, this function
21e50 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a   is a no-op..*/.
21e60 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
21e70 46 6c 75 73 68 4f 6e 65 48 61 73 68 28 46 74 73  FlushOneHash(Fts
21e80 35 49 6e 64 65 78 20 2a 70 29 7b 0a 20 20 46 74  5Index *p){.  Ft
21e90 73 35 48 61 73 68 20 2a 70 48 61 73 68 20 3d 20  s5Hash *pHash = 
21ea0 70 2d 3e 70 48 61 73 68 3b 0a 20 20 46 74 73 35  p->pHash;.  Fts5
21eb0 53 74 72 75 63 74 75 72 65 20 2a 70 53 74 72 75  Structure *pStru
21ec0 63 74 3b 0a 20 20 69 6e 74 20 69 53 65 67 69 64  ct;.  int iSegid
21ed0 3b 0a 20 20 69 6e 74 20 70 67 6e 6f 4c 61 73 74  ;.  int pgnoLast
21ee0 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
21ef0 20 20 20 20 20 20 2f 2a 20 4c 61 73 74 20 6c 65        /* Last le
21f00 61 66 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69  af page number i
21f10 6e 20 73 65 67 6d 65 6e 74 20 2a 2f 0a 0a 20 20  n segment */..  
21f20 2f 2a 20 4f 62 74 61 69 6e 20 61 20 72 65 66 65  /* Obtain a refe
21f30 72 65 6e 63 65 20 74 6f 20 74 68 65 20 69 6e 64  rence to the ind
21f40 65 78 20 73 74 72 75 63 74 75 72 65 20 61 6e 64  ex structure and
21f50 20 61 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20   allocate a new 
21f60 73 65 67 6d 65 6e 74 2d 69 64 0a 20 20 2a 2a 20  segment-id.  ** 
21f70 66 6f 72 20 74 68 65 20 6e 65 77 20 6c 65 76 65  for the new leve
21f80 6c 2d 30 20 73 65 67 6d 65 6e 74 2e 20 20 2a 2f  l-0 segment.  */
21f90 0a 20 20 70 53 74 72 75 63 74 20 3d 20 66 74 73  .  pStruct = fts
21fa0 35 53 74 72 75 63 74 75 72 65 52 65 61 64 28 70  5StructureRead(p
21fb0 29 3b 0a 20 20 69 53 65 67 69 64 20 3d 20 66 74  );.  iSegid = ft
21fc0 73 35 41 6c 6c 6f 63 61 74 65 53 65 67 69 64 28  s5AllocateSegid(
21fd0 70 2c 20 70 53 74 72 75 63 74 29 3b 0a 20 20 66  p, pStruct);.  f
21fe0 74 73 35 53 74 72 75 63 74 75 72 65 49 6e 76 61  ts5StructureInva
21ff0 6c 69 64 61 74 65 28 70 29 3b 0a 0a 20 20 69 66  lidate(p);..  if
22000 28 20 69 53 65 67 69 64 20 29 7b 0a 20 20 20 20  ( iSegid ){.    
22010 63 6f 6e 73 74 20 69 6e 74 20 70 67 73 7a 20 3d  const int pgsz =
22020 20 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e 70 67 73   p->pConfig->pgs
22030 7a 3b 0a 20 20 20 20 69 6e 74 20 65 44 65 74 61  z;.    int eDeta
22040 69 6c 20 3d 20 70 2d 3e 70 43 6f 6e 66 69 67 2d  il = p->pConfig-
22050 3e 65 44 65 74 61 69 6c 3b 0a 20 20 20 20 46 74  >eDetail;.    Ft
22060 73 35 53 74 72 75 63 74 75 72 65 53 65 67 6d 65  s5StructureSegme
22070 6e 74 20 2a 70 53 65 67 3b 20 20 20 2f 2a 20 4e  nt *pSeg;   /* N
22080 65 77 20 73 65 67 6d 65 6e 74 20 77 69 74 68 69  ew segment withi
22090 6e 20 70 53 74 72 75 63 74 20 2a 2f 0a 20 20 20  n pStruct */.   
220a0 20 46 74 73 35 42 75 66 66 65 72 20 2a 70 42 75   Fts5Buffer *pBu
220b0 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  f;             /
220c0 2a 20 42 75 66 66 65 72 20 69 6e 20 77 68 69 63  * Buffer in whic
220d0 68 20 74 6f 20 61 73 73 65 6d 62 6c 65 20 6c 65  h to assemble le
220e0 61 66 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 46  af page */.    F
220f0 74 73 35 42 75 66 66 65 72 20 2a 70 50 67 69 64  ts5Buffer *pPgid
22100 78 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  x;           /* 
22110 42 75 66 66 65 72 20 69 6e 20 77 68 69 63 68 20  Buffer in which 
22120 74 6f 20 61 73 73 65 6d 62 6c 65 20 70 67 69 64  to assemble pgid
22130 78 20 2a 2f 0a 0a 20 20 20 20 46 74 73 35 53 65  x */..    Fts5Se
22140 67 57 72 69 74 65 72 20 77 72 69 74 65 72 3b 0a  gWriter writer;.
22150 20 20 20 20 66 74 73 35 57 72 69 74 65 49 6e 69      fts5WriteIni
22160 74 28 70 2c 20 26 77 72 69 74 65 72 2c 20 69 53  t(p, &writer, iS
22170 65 67 69 64 29 3b 0a 0a 20 20 20 20 70 42 75 66  egid);..    pBuf
22180 20 3d 20 26 77 72 69 74 65 72 2e 77 72 69 74 65   = &writer.write
22190 72 2e 62 75 66 3b 0a 20 20 20 20 70 50 67 69 64  r.buf;.    pPgid
221a0 78 20 3d 20 26 77 72 69 74 65 72 2e 77 72 69 74  x = &writer.writ
221b0 65 72 2e 70 67 69 64 78 3b 0a 0a 20 20 20 20 2f  er.pgidx;..    /
221c0 2a 20 66 74 73 35 57 72 69 74 65 49 6e 69 74 28  * fts5WriteInit(
221d0 29 20 73 68 6f 75 6c 64 20 68 61 76 65 20 69 6e  ) should have in
221e0 69 74 69 61 6c 69 7a 65 64 20 74 68 65 20 62 75  itialized the bu
221f0 66 66 65 72 73 20 74 6f 20 28 6d 6f 73 74 20 6c  ffers to (most l
22200 69 6b 65 6c 79 29 0a 20 20 20 20 2a 2a 20 74 68  ikely).    ** th
22210 65 20 6d 61 78 69 6d 75 6d 20 73 70 61 63 65 20  e maximum space 
22220 72 65 71 75 69 72 65 64 2e 20 2a 2f 0a 20 20 20  required. */.   
22230 20 61 73 73 65 72 74 28 20 70 2d 3e 72 63 20 7c   assert( p->rc |
22240 7c 20 70 42 75 66 2d 3e 6e 53 70 61 63 65 3e 3d  | pBuf->nSpace>=
22250 28 70 67 73 7a 20 2b 20 46 54 53 35 5f 44 41 54  (pgsz + FTS5_DAT
22260 41 5f 50 41 44 44 49 4e 47 29 20 29 3b 0a 20 20  A_PADDING) );.  
22270 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72 63 20    assert( p->rc 
22280 7c 7c 20 70 50 67 69 64 78 2d 3e 6e 53 70 61 63  || pPgidx->nSpac
22290 65 3e 3d 28 70 67 73 7a 20 2b 20 46 54 53 35 5f  e>=(pgsz + FTS5_
222a0 44 41 54 41 5f 50 41 44 44 49 4e 47 29 20 29 3b  DATA_PADDING) );
222b0 0a 0a 20 20 20 20 2f 2a 20 42 65 67 69 6e 20 73  ..    /* Begin s
222c0 63 61 6e 6e 69 6e 67 20 74 68 72 6f 75 67 68 20  canning through 
222d0 68 61 73 68 20 74 61 62 6c 65 20 65 6e 74 72 69  hash table entri
222e0 65 73 2e 20 54 68 69 73 20 6c 6f 6f 70 20 72 75  es. This loop ru
222f0 6e 73 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68  ns once for each
22300 0a 20 20 20 20 2a 2a 20 74 65 72 6d 2f 64 6f 63  .    ** term/doc
22310 6c 69 73 74 20 63 75 72 72 65 6e 74 6c 79 20 73  list currently s
22320 74 6f 72 65 64 20 77 69 74 68 69 6e 20 74 68 65  tored within the
22330 20 68 61 73 68 20 74 61 62 6c 65 2e 20 2a 2f 0a   hash table. */.
22340 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53      if( p->rc==S
22350 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
22360 20 20 70 2d 3e 72 63 20 3d 20 73 71 6c 69 74 65    p->rc = sqlite
22370 33 46 74 73 35 48 61 73 68 53 63 61 6e 49 6e 69  3Fts5HashScanIni
22380 74 28 70 48 61 73 68 2c 20 30 2c 20 30 29 3b 0a  t(pHash, 0, 0);.
22390 20 20 20 20 7d 0a 20 20 20 20 77 68 69 6c 65 28      }.    while(
223a0 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
223b0 4b 20 26 26 20 30 3d 3d 73 71 6c 69 74 65 33 46  K && 0==sqlite3F
223c0 74 73 35 48 61 73 68 53 63 61 6e 45 6f 66 28 70  ts5HashScanEof(p
223d0 48 61 73 68 29 20 29 7b 0a 20 20 20 20 20 20 63  Hash) ){.      c
223e0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 65 72 6d  onst char *zTerm
223f0 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 75  ;          /* Bu
22400 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20  ffer containing 
22410 74 65 72 6d 20 2a 2f 0a 20 20 20 20 20 20 63 6f  term */.      co
22420 6e 73 74 20 75 38 20 2a 70 44 6f 63 6c 69 73 74  nst u8 *pDoclist
22430 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69  ;         /* Poi
22440 6e 74 65 72 20 74 6f 20 64 6f 63 6c 69 73 74 20  nter to doclist 
22450 66 6f 72 20 74 68 69 73 20 74 65 72 6d 20 2a 2f  for this term */
22460 0a 20 20 20 20 20 20 69 6e 74 20 6e 44 6f 63 6c  .      int nDocl
22470 69 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  ist;            
22480 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 64 6f     /* Size of do
22490 63 6c 69 73 74 20 69 6e 20 62 79 74 65 73 20 2a  clist in bytes *
224a0 2f 0a 0a 20 20 20 20 20 20 2f 2a 20 57 72 69 74  /..      /* Writ
224b0 65 20 74 68 65 20 74 65 72 6d 20 66 6f 72 20 74  e the term for t
224c0 68 69 73 20 65 6e 74 72 79 20 74 6f 20 64 69 73  his entry to dis
224d0 6b 2e 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69  k. */.      sqli
224e0 74 65 33 46 74 73 35 48 61 73 68 53 63 61 6e 45  te3Fts5HashScanE
224f0 6e 74 72 79 28 70 48 61 73 68 2c 20 26 7a 54 65  ntry(pHash, &zTe
22500 72 6d 2c 20 26 70 44 6f 63 6c 69 73 74 2c 20 26  rm, &pDoclist, &
22510 6e 44 6f 63 6c 69 73 74 29 3b 0a 20 20 20 20 20  nDoclist);.     
22520 20 66 74 73 35 57 72 69 74 65 41 70 70 65 6e 64   fts5WriteAppend
22530 54 65 72 6d 28 70 2c 20 26 77 72 69 74 65 72 2c  Term(p, &writer,
22540 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 7a 54 65   (int)strlen(zTe
22550 72 6d 29 2c 20 28 63 6f 6e 73 74 20 75 38 2a 29  rm), (const u8*)
22560 7a 54 65 72 6d 29 3b 0a 0a 20 20 20 20 20 20 61  zTerm);..      a
22570 73 73 65 72 74 28 20 77 72 69 74 65 72 2e 62 46  ssert( writer.bF
22580 69 72 73 74 52 6f 77 69 64 49 6e 50 61 67 65 3d  irstRowidInPage=
22590 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  =0 );.      if( 
225a0 70 67 73 7a 3e 3d 28 70 42 75 66 2d 3e 6e 20 2b  pgsz>=(pBuf->n +
225b0 20 70 50 67 69 64 78 2d 3e 6e 20 2b 20 6e 44 6f   pPgidx->n + nDo
225c0 63 6c 69 73 74 20 2b 20 31 29 20 29 7b 0a 20 20  clist + 1) ){.  
225d0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 65 6e 74        /* The ent
225e0 69 72 65 20 64 6f 63 6c 69 73 74 20 77 69 6c 6c  ire doclist will
225f0 20 66 69 74 20 6f 6e 20 74 68 65 20 63 75 72 72   fit on the curr
22600 65 6e 74 20 6c 65 61 66 2e 20 2a 2f 0a 20 20 20  ent leaf. */.   
22610 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72 53       fts5BufferS
22620 61 66 65 41 70 70 65 6e 64 42 6c 6f 62 28 70 42  afeAppendBlob(pB
22630 75 66 2c 20 70 44 6f 63 6c 69 73 74 2c 20 6e 44  uf, pDoclist, nD
22640 6f 63 6c 69 73 74 29 3b 0a 20 20 20 20 20 20 7d  oclist);.      }
22650 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 36  else{.        i6
22660 34 20 69 52 6f 77 69 64 20 3d 20 30 3b 0a 20 20  4 iRowid = 0;.  
22670 20 20 20 20 20 20 69 36 34 20 69 44 65 6c 74 61        i64 iDelta
22680 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 69 6e   = 0;.        in
22690 74 20 69 4f 66 66 20 3d 20 30 3b 0a 0a 20 20 20  t iOff = 0;..   
226a0 20 20 20 20 20 2f 2a 20 54 68 65 20 65 6e 74 69       /* The enti
226b0 72 65 20 64 6f 63 6c 69 73 74 20 77 69 6c 6c 20  re doclist will 
226c0 6e 6f 74 20 66 69 74 20 6f 6e 20 74 68 69 73 20  not fit on this 
226d0 6c 65 61 66 2e 20 54 68 65 20 66 6f 6c 6c 6f 77  leaf. The follow
226e0 69 6e 67 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  ing .        ** 
226f0 6c 6f 6f 70 20 69 74 65 72 61 74 65 73 20 74 68  loop iterates th
22700 72 6f 75 67 68 20 74 68 65 20 70 6f 73 6c 69 73  rough the poslis
22710 74 73 20 74 68 61 74 20 6d 61 6b 65 20 75 70 20  ts that make up 
22720 74 68 65 20 63 75 72 72 65 6e 74 20 0a 20 20 20  the current .   
22730 20 20 20 20 20 2a 2a 20 64 6f 63 6c 69 73 74 2e       ** doclist.
22740 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 77 68 69    */.        whi
22750 6c 65 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  le( p->rc==SQLIT
22760 45 5f 4f 4b 20 26 26 20 69 4f 66 66 3c 6e 44 6f  E_OK && iOff<nDo
22770 63 6c 69 73 74 20 29 7b 0a 20 20 20 20 20 20 20  clist ){.       
22780 20 20 20 69 4f 66 66 20 2b 3d 20 66 74 73 35 47     iOff += fts5G
22790 65 74 56 61 72 69 6e 74 28 26 70 44 6f 63 6c 69  etVarint(&pDocli
227a0 73 74 5b 69 4f 66 66 5d 2c 20 28 75 36 34 2a 29  st[iOff], (u64*)
227b0 26 69 44 65 6c 74 61 29 3b 0a 20 20 20 20 20 20  &iDelta);.      
227c0 20 20 20 20 69 52 6f 77 69 64 20 2b 3d 20 69 44      iRowid += iD
227d0 65 6c 74 61 3b 0a 20 20 20 20 20 20 20 20 20 20  elta;.          
227e0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 77  .          if( w
227f0 72 69 74 65 72 2e 62 46 69 72 73 74 52 6f 77 69  riter.bFirstRowi
22800 64 49 6e 50 61 67 65 20 29 7b 0a 20 20 20 20 20  dInPage ){.     
22810 20 20 20 20 20 20 20 66 74 73 35 50 75 74 55 31         fts5PutU1
22820 36 28 26 70 42 75 66 2d 3e 70 5b 30 5d 2c 20 28  6(&pBuf->p[0], (
22830 75 31 36 29 70 42 75 66 2d 3e 6e 29 3b 20 20 20  u16)pBuf->n);   
22840 2f 2a 20 66 69 72 73 74 20 72 6f 77 69 64 20 6f  /* first rowid o
22850 6e 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 20 20  n page */.      
22860 20 20 20 20 20 20 70 42 75 66 2d 3e 6e 20 2b 3d        pBuf->n +=
22870 20 73 71 6c 69 74 65 33 46 74 73 35 50 75 74 56   sqlite3Fts5PutV
22880 61 72 69 6e 74 28 26 70 42 75 66 2d 3e 70 5b 70  arint(&pBuf->p[p
22890 42 75 66 2d 3e 6e 5d 2c 20 69 52 6f 77 69 64 29  Buf->n], iRowid)
228a0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 77 72  ;.            wr
228b0 69 74 65 72 2e 62 46 69 72 73 74 52 6f 77 69 64  iter.bFirstRowid
228c0 49 6e 50 61 67 65 20 3d 20 30 3b 0a 20 20 20 20  InPage = 0;.    
228d0 20 20 20 20 20 20 20 20 66 74 73 35 57 72 69 74          fts5Writ
228e0 65 44 6c 69 64 78 41 70 70 65 6e 64 28 70 2c 20  eDlidxAppend(p, 
228f0 26 77 72 69 74 65 72 2c 20 69 52 6f 77 69 64 29  &writer, iRowid)
22900 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73  ;.          }els
22910 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  e{.            p
22920 42 75 66 2d 3e 6e 20 2b 3d 20 73 71 6c 69 74 65  Buf->n += sqlite
22930 33 46 74 73 35 50 75 74 56 61 72 69 6e 74 28 26  3Fts5PutVarint(&
22940 70 42 75 66 2d 3e 70 5b 70 42 75 66 2d 3e 6e 5d  pBuf->p[pBuf->n]
22950 2c 20 69 44 65 6c 74 61 29 3b 0a 20 20 20 20 20  , iDelta);.     
22960 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
22970 20 61 73 73 65 72 74 28 20 70 42 75 66 2d 3e 6e   assert( pBuf->n
22980 3c 3d 70 42 75 66 2d 3e 6e 53 70 61 63 65 20 29  <=pBuf->nSpace )
22990 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ;..          if(
229a0 20 65 44 65 74 61 69 6c 3d 3d 46 54 53 35 5f 44   eDetail==FTS5_D
229b0 45 54 41 49 4c 5f 4e 4f 4e 45 20 29 7b 0a 20 20  ETAIL_NONE ){.  
229c0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69 4f            if( iO
229d0 66 66 3c 6e 44 6f 63 6c 69 73 74 20 26 26 20 70  ff<nDoclist && p
229e0 44 6f 63 6c 69 73 74 5b 69 4f 66 66 5d 3d 3d 30  Doclist[iOff]==0
229f0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
22a00 20 20 70 42 75 66 2d 3e 70 5b 70 42 75 66 2d 3e    pBuf->p[pBuf->
22a10 6e 2b 2b 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20  n++] = 0;.      
22a20 20 20 20 20 20 20 20 20 69 4f 66 66 2b 2b 3b 0a          iOff++;.
22a30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
22a40 28 20 69 4f 66 66 3c 6e 44 6f 63 6c 69 73 74 20  ( iOff<nDoclist 
22a50 26 26 20 70 44 6f 63 6c 69 73 74 5b 69 4f 66 66  && pDoclist[iOff
22a60 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  ]==0 ){.        
22a70 20 20 20 20 20 20 20 20 70 42 75 66 2d 3e 70 5b          pBuf->p[
22a80 70 42 75 66 2d 3e 6e 2b 2b 5d 20 3d 20 30 3b 0a  pBuf->n++] = 0;.
22a90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22aa0 69 4f 66 66 2b 2b 3b 0a 20 20 20 20 20 20 20 20  iOff++;.        
22ab0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
22ac0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
22ad0 20 20 69 66 28 20 28 70 42 75 66 2d 3e 6e 20 2b    if( (pBuf->n +
22ae0 20 70 50 67 69 64 78 2d 3e 6e 29 3e 3d 70 67 73   pPgidx->n)>=pgs
22af0 7a 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  z ){.           
22b00 20 20 20 66 74 73 35 57 72 69 74 65 46 6c 75 73     fts5WriteFlus
22b10 68 4c 65 61 66 28 70 2c 20 26 77 72 69 74 65 72  hLeaf(p, &writer
22b20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  );.            }
22b30 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65  .          }else
22b40 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 6e  {.            in
22b50 74 20 62 44 75 6d 6d 79 3b 0a 20 20 20 20 20 20  t bDummy;.      
22b60 20 20 20 20 20 20 69 6e 74 20 6e 50 6f 73 3b 0a        int nPos;.
22b70 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20              int 
22b80 6e 43 6f 70 79 20 3d 20 66 74 73 35 47 65 74 50  nCopy = fts5GetP
22b90 6f 73 6c 69 73 74 53 69 7a 65 28 26 70 44 6f 63  oslistSize(&pDoc
22ba0 6c 69 73 74 5b 69 4f 66 66 5d 2c 20 26 6e 50 6f  list[iOff], &nPo
22bb0 73 2c 20 26 62 44 75 6d 6d 79 29 3b 0a 20 20 20  s, &bDummy);.   
22bc0 20 20 20 20 20 20 20 20 20 6e 43 6f 70 79 20 2b           nCopy +
22bd0 3d 20 6e 50 6f 73 3b 0a 20 20 20 20 20 20 20 20  = nPos;.        
22be0 20 20 20 20 69 66 28 20 28 70 42 75 66 2d 3e 6e      if( (pBuf->n
22bf0 20 2b 20 70 50 67 69 64 78 2d 3e 6e 20 2b 20 6e   + pPgidx->n + n
22c00 43 6f 70 79 29 20 3c 3d 20 70 67 73 7a 20 29 7b  Copy) <= pgsz ){
22c10 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  .              /
22c20 2a 20 54 68 65 20 65 6e 74 69 72 65 20 70 6f 73  * The entire pos
22c30 6c 69 73 74 20 77 69 6c 6c 20 66 69 74 20 6f 6e  list will fit on
22c40 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c 65 61   the current lea
22c50 66 2e 20 53 6f 20 63 6f 70 79 0a 20 20 20 20 20  f. So copy.     
22c60 20 20 20 20 20 20 20 20 20 2a 2a 20 69 74 20 69           ** it i
22c70 6e 20 6f 6e 65 20 67 6f 2e 20 2a 2f 0a 20 20 20  n one go. */.   
22c80 20 20 20 20 20 20 20 20 20 20 20 66 74 73 35 42             fts5B
22c90 75 66 66 65 72 53 61 66 65 41 70 70 65 6e 64 42  ufferSafeAppendB
22ca0 6c 6f 62 28 70 42 75 66 2c 20 26 70 44 6f 63 6c  lob(pBuf, &pDocl
22cb0 69 73 74 5b 69 4f 66 66 5d 2c 20 6e 43 6f 70 79  ist[iOff], nCopy
22cc0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  );.            }
22cd0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
22ce0 20 20 20 20 2f 2a 20 54 68 65 20 65 6e 74 69 72      /* The entir
22cf0 65 20 70 6f 73 6c 69 73 74 20 77 69 6c 6c 20 6e  e poslist will n
22d00 6f 74 20 66 69 74 20 6f 6e 20 74 68 69 73 20 6c  ot fit on this l
22d10 65 61 66 2e 20 53 6f 20 69 74 20 6e 65 65 64 73  eaf. So it needs
22d20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a  .              *
22d30 2a 20 74 6f 20 62 65 20 62 72 6f 6b 65 6e 20 69  * to be broken i
22d40 6e 74 6f 20 73 65 63 74 69 6f 6e 73 2e 20 54 68  nto sections. Th
22d50 65 20 6f 6e 6c 79 20 71 75 61 6c 69 66 69 63 61  e only qualifica
22d60 74 69 6f 6e 20 62 65 69 6e 67 0a 20 20 20 20 20  tion being.     
22d70 20 20 20 20 20 20 20 20 20 2a 2a 20 74 68 61 74           ** that
22d80 20 65 61 63 68 20 76 61 72 69 6e 74 20 6d 75 73   each varint mus
22d90 74 20 62 65 20 73 74 6f 72 65 64 20 63 6f 6e 74  t be stored cont
22da0 69 67 75 6f 75 73 6c 79 2e 20 20 2a 2f 0a 20 20  iguously.  */.  
22db0 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 73              cons
22dc0 74 20 75 38 20 2a 70 50 6f 73 6c 69 73 74 20 3d  t u8 *pPoslist =
22dd0 20 26 70 44 6f 63 6c 69 73 74 5b 69 4f 66 66 5d   &pDoclist[iOff]
22de0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
22df0 69 6e 74 20 69 50 6f 73 20 3d 20 30 3b 0a 20 20  int iPos = 0;.  
22e00 20 20 20 20 20 20 20 20 20 20 20 20 77 68 69 6c              whil
22e10 65 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  e( p->rc==SQLITE
22e20 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
22e30 20 20 20 20 20 20 20 69 6e 74 20 6e 53 70 61 63         int nSpac
22e40 65 20 3d 20 70 67 73 7a 20 2d 20 70 42 75 66 2d  e = pgsz - pBuf-
22e50 3e 6e 20 2d 20 70 50 67 69 64 78 2d 3e 6e 3b 0a  >n - pPgidx->n;.
22e60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22e70 69 6e 74 20 6e 20 3d 20 30 3b 0a 20 20 20 20 20  int n = 0;.     
22e80 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 28             if( (
22e90 6e 43 6f 70 79 20 2d 20 69 50 6f 73 29 3c 3d 6e  nCopy - iPos)<=n
22ea0 53 70 61 63 65 20 29 7b 0a 20 20 20 20 20 20 20  Space ){.       
22eb0 20 20 20 20 20 20 20 20 20 20 20 6e 20 3d 20 6e             n = n
22ec0 43 6f 70 79 20 2d 20 69 50 6f 73 3b 0a 20 20 20  Copy - iPos;.   
22ed0 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 65 6c               }el
22ee0 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
22ef0 20 20 20 20 20 20 6e 20 3d 20 66 74 73 35 50 6f        n = fts5Po
22f00 73 6c 69 73 74 50 72 65 66 69 78 28 26 70 50 6f  slistPrefix(&pPo
22f10 73 6c 69 73 74 5b 69 50 6f 73 5d 2c 20 6e 53 70  slist[iPos], nSp
22f20 61 63 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ace);.          
22f30 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
22f40 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
22f50 6e 3e 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20  n>0 );.         
22f60 20 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65         fts5Buffe
22f70 72 53 61 66 65 41 70 70 65 6e 64 42 6c 6f 62 28  rSafeAppendBlob(
22f80 70 42 75 66 2c 20 26 70 50 6f 73 6c 69 73 74 5b  pBuf, &pPoslist[
22f90 69 50 6f 73 5d 2c 20 6e 29 3b 0a 20 20 20 20 20  iPos], n);.     
22fa0 20 20 20 20 20 20 20 20 20 20 20 69 50 6f 73 20             iPos 
22fb0 2b 3d 20 6e 3b 0a 20 20 20 20 20 20 20 20 20 20  += n;.          
22fc0 20 20 20 20 20 20 69 66 28 20 28 70 42 75 66 2d        if( (pBuf-
22fd0 3e 6e 20 2b 20 70 50 67 69 64 78 2d 3e 6e 29 3e  >n + pPgidx->n)>
22fe0 3d 70 67 73 7a 20 29 7b 0a 20 20 20 20 20 20 20  =pgsz ){.       
22ff0 20 20 20 20 20 20 20 20 20 20 20 66 74 73 35 57             fts5W
23000 72 69 74 65 46 6c 75 73 68 4c 65 61 66 28 70 2c  riteFlushLeaf(p,
23010 20 26 77 72 69 74 65 72 29 3b 0a 20 20 20 20 20   &writer);.     
23020 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
23030 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28               if(
23040 20 69 50 6f 73 3e 3d 6e 43 6f 70 79 20 29 20 62   iPos>=nCopy ) b
23050 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  reak;.          
23060 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
23070 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
23080 69 4f 66 66 20 2b 3d 20 6e 43 6f 70 79 3b 0a 20  iOff += nCopy;. 
23090 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
230a0 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20     }.      }..  
230b0 20 20 20 20 2f 2a 20 54 4f 44 4f 32 3a 20 44 6f      /* TODO2: Do
230c0 63 6c 69 73 74 20 74 65 72 6d 69 6e 61 74 6f 72  clist terminator
230d0 20 77 72 69 74 74 65 6e 20 68 65 72 65 2e 20 2a   written here. *
230e0 2f 0a 20 20 20 20 20 20 2f 2a 20 70 42 75 66 2d  /.      /* pBuf-
230f0 3e 70 5b 70 42 75 66 2d 3e 6e 2b 2b 5d 20 3d 20  >p[pBuf->n++] = 
23100 27 5c 30 27 3b 20 2a 2f 0a 20 20 20 20 20 20 61  '\0'; */.      a
23110 73 73 65 72 74 28 20 70 42 75 66 2d 3e 6e 3c 3d  ssert( pBuf->n<=
23120 70 42 75 66 2d 3e 6e 53 70 61 63 65 20 29 3b 0a  pBuf->nSpace );.
23130 20 20 20 20 20 20 73 71 6c 69 74 65 33 46 74 73        sqlite3Fts
23140 35 48 61 73 68 53 63 61 6e 4e 65 78 74 28 70 48  5HashScanNext(pH
23150 61 73 68 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ash);.    }.    
23160 73 71 6c 69 74 65 33 46 74 73 35 48 61 73 68 43  sqlite3Fts5HashC
23170 6c 65 61 72 28 70 48 61 73 68 29 3b 0a 20 20 20  lear(pHash);.   
23180 20 66 74 73 35 57 72 69 74 65 46 69 6e 69 73 68   fts5WriteFinish
23190 28 70 2c 20 26 77 72 69 74 65 72 2c 20 26 70 67  (p, &writer, &pg
231a0 6e 6f 4c 61 73 74 29 3b 0a 0a 20 20 20 20 2f 2a  noLast);..    /*
231b0 20 55 70 64 61 74 65 20 74 68 65 20 46 74 73 35   Update the Fts5
231c0 53 74 72 75 63 74 75 72 65 2e 20 49 74 20 69 73  Structure. It is
231d0 20 77 72 69 74 74 65 6e 20 62 61 63 6b 20 74 6f   written back to
231e0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 62 79   the database by
231f0 20 74 68 65 0a 20 20 20 20 2a 2a 20 66 74 73 35   the.    ** fts5
23200 53 74 72 75 63 74 75 72 65 52 65 6c 65 61 73 65  StructureRelease
23210 28 29 20 63 61 6c 6c 20 62 65 6c 6f 77 2e 20 20  () call below.  
23220 2a 2f 0a 20 20 20 20 69 66 28 20 70 53 74 72 75  */.    if( pStru
23230 63 74 2d 3e 6e 4c 65 76 65 6c 3d 3d 30 20 29 7b  ct->nLevel==0 ){
23240 0a 20 20 20 20 20 20 66 74 73 35 53 74 72 75 63  .      fts5Struc
23250 74 75 72 65 41 64 64 4c 65 76 65 6c 28 26 70 2d  tureAddLevel(&p-
23260 3e 72 63 2c 20 26 70 53 74 72 75 63 74 29 3b 0a  >rc, &pStruct);.
23270 20 20 20 20 7d 0a 20 20 20 20 66 74 73 35 53 74      }.    fts5St
23280 72 75 63 74 75 72 65 45 78 74 65 6e 64 4c 65 76  ructureExtendLev
23290 65 6c 28 26 70 2d 3e 72 63 2c 20 70 53 74 72 75  el(&p->rc, pStru
232a0 63 74 2c 20 30 2c 20 31 2c 20 30 29 3b 0a 20 20  ct, 0, 1, 0);.  
232b0 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c    if( p->rc==SQL
232c0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
232d0 70 53 65 67 20 3d 20 26 70 53 74 72 75 63 74 2d  pSeg = &pStruct-
232e0 3e 61 4c 65 76 65 6c 5b 30 5d 2e 61 53 65 67 5b  >aLevel[0].aSeg[
232f0 20 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c   pStruct->aLevel
23300 5b 30 5d 2e 6e 53 65 67 2b 2b 20 5d 3b 0a 20 20  [0].nSeg++ ];.  
23310 20 20 20 20 70 53 65 67 2d 3e 69 53 65 67 69 64      pSeg->iSegid
23320 20 3d 20 69 53 65 67 69 64 3b 0a 20 20 20 20 20   = iSegid;.     
23330 20 70 53 65 67 2d 3e 70 67 6e 6f 46 69 72 73 74   pSeg->pgnoFirst
23340 20 3d 20 31 3b 0a 20 20 20 20 20 20 70 53 65 67   = 1;.      pSeg
23350 2d 3e 70 67 6e 6f 4c 61 73 74 20 3d 20 70 67 6e  ->pgnoLast = pgn
23360 6f 4c 61 73 74 3b 0a 20 20 20 20 20 20 70 53 74  oLast;.      pSt
23370 72 75 63 74 2d 3e 6e 53 65 67 6d 65 6e 74 2b 2b  ruct->nSegment++
23380 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 74 73 35  ;.    }.    fts5
23390 53 74 72 75 63 74 75 72 65 50 72 6f 6d 6f 74 65  StructurePromote
233a0 28 70 2c 20 30 2c 20 70 53 74 72 75 63 74 29 3b  (p, 0, pStruct);
233b0 0a 20 20 7d 0a 0a 20 20 66 74 73 35 49 6e 64 65  .  }..  fts5Inde
233c0 78 41 75 74 6f 6d 65 72 67 65 28 70 2c 20 26 70  xAutomerge(p, &p
233d0 53 74 72 75 63 74 2c 20 70 67 6e 6f 4c 61 73 74  Struct, pgnoLast
233e0 29 3b 0a 20 20 66 74 73 35 49 6e 64 65 78 43 72  );.  fts5IndexCr
233f0 69 73 69 73 6d 65 72 67 65 28 70 2c 20 26 70 53  isismerge(p, &pS
23400 74 72 75 63 74 29 3b 0a 20 20 66 74 73 35 53 74  truct);.  fts5St
23410 72 75 63 74 75 72 65 57 72 69 74 65 28 70 2c 20  ructureWrite(p, 
23420 70 53 74 72 75 63 74 29 3b 0a 20 20 66 74 73 35  pStruct);.  fts5
23430 53 74 72 75 63 74 75 72 65 52 65 6c 65 61 73 65  StructureRelease
23440 28 70 53 74 72 75 63 74 29 3b 0a 7d 0a 0a 2f 2a  (pStruct);.}../*
23450 0a 2a 2a 20 46 6c 75 73 68 20 61 6e 79 20 64 61  .** Flush any da
23460 74 61 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65  ta stored in the
23470 20 69 6e 2d 6d 65 6d 6f 72 79 20 68 61 73 68 20   in-memory hash 
23480 74 61 62 6c 65 73 20 74 6f 20 74 68 65 20 64 61  tables to the da
23490 74 61 62 61 73 65 2e 0a 2a 2f 0a 73 74 61 74 69  tabase..*/.stati
234a0 63 20 76 6f 69 64 20 66 74 73 35 49 6e 64 65 78  c void fts5Index
234b0 46 6c 75 73 68 28 46 74 73 35 49 6e 64 65 78 20  Flush(Fts5Index 
234c0 2a 70 29 7b 0a 20 20 2f 2a 20 55 6e 6c 65 73 73  *p){.  /* Unless
234d0 20 69 74 20 69 73 20 65 6d 70 74 79 2c 20 66 6c   it is empty, fl
234e0 75 73 68 20 74 68 65 20 68 61 73 68 20 74 61 62  ush the hash tab
234f0 6c 65 20 74 6f 20 64 69 73 6b 20 2a 2f 0a 20 20  le to disk */.  
23500 69 66 28 20 70 2d 3e 6e 50 65 6e 64 69 6e 67 44  if( p->nPendingD
23510 61 74 61 20 29 7b 0a 20 20 20 20 61 73 73 65 72  ata ){.    asser
23520 74 28 20 70 2d 3e 70 48 61 73 68 20 29 3b 0a 20  t( p->pHash );. 
23530 20 20 20 70 2d 3e 6e 50 65 6e 64 69 6e 67 44 61     p->nPendingDa
23540 74 61 20 3d 20 30 3b 0a 20 20 20 20 66 74 73 35  ta = 0;.    fts5
23550 46 6c 75 73 68 4f 6e 65 48 61 73 68 28 70 29 3b  FlushOneHash(p);
23560 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 46  .  }.}..static F
23570 74 73 35 53 74 72 75 63 74 75 72 65 20 2a 66 74  ts5Structure *ft
23580 73 35 49 6e 64 65 78 4f 70 74 69 6d 69 7a 65 53  s5IndexOptimizeS
23590 74 72 75 63 74 28 0a 20 20 46 74 73 35 49 6e 64  truct(.  Fts5Ind
235a0 65 78 20 2a 70 2c 20 0a 20 20 46 74 73 35 53 74  ex *p, .  Fts5St
235b0 72 75 63 74 75 72 65 20 2a 70 53 74 72 75 63 74  ructure *pStruct
235c0 0a 29 7b 0a 20 20 46 74 73 35 53 74 72 75 63 74  .){.  Fts5Struct
235d0 75 72 65 20 2a 70 4e 65 77 20 3d 20 30 3b 0a 20  ure *pNew = 0;. 
235e0 20 69 6e 74 20 6e 42 79 74 65 20 3d 20 73 69 7a   int nByte = siz
235f0 65 6f 66 28 46 74 73 35 53 74 72 75 63 74 75 72  eof(Fts5Structur
23600 65 29 3b 0a 20 20 69 6e 74 20 6e 53 65 67 20 3d  e);.  int nSeg =
23610 20 70 53 74 72 75 63 74 2d 3e 6e 53 65 67 6d 65   pStruct->nSegme
23620 6e 74 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20  nt;.  int i;..  
23630 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20 69 66  /* Figure out if
23640 20 74 68 69 73 20 73 74 72 75 63 74 75 72 65 20   this structure 
23650 72 65 71 75 69 72 65 73 20 6f 70 74 69 6d 69 7a  requires optimiz
23660 61 74 69 6f 6e 2e 20 41 20 73 74 72 75 63 74 75  ation. A structu
23670 72 65 20 64 6f 65 73 0a 20 20 2a 2a 20 6e 6f 74  re does.  ** not
23680 20 72 65 71 75 69 72 65 20 6f 70 74 69 6d 69 7a   require optimiz
23690 61 74 69 6f 6e 20 69 66 20 65 69 74 68 65 72 3a  ation if either:
236a0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 2b 20 69 74  .  **.  **  + it
236b0 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 66 65 77   consists of few
236c0 65 72 20 74 68 61 6e 20 74 77 6f 20 73 65 67 6d  er than two segm
236d0 65 6e 74 73 2c 20 6f 72 20 0a 20 20 2a 2a 20 20  ents, or .  **  
236e0 2b 20 61 6c 6c 20 73 65 67 6d 65 6e 74 73 20 61  + all segments a
236f0 72 65 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 6c  re on the same l
23700 65 76 65 6c 2c 20 6f 72 0a 20 20 2a 2a 20 20 2b  evel, or.  **  +
23710 20 61 6c 6c 20 73 65 67 6d 65 6e 74 73 20 65 78   all segments ex
23720 63 65 70 74 20 6f 6e 65 20 61 72 65 20 63 75 72  cept one are cur
23730 72 65 6e 74 6c 79 20 69 6e 70 75 74 73 20 74 6f  rently inputs to
23740 20 61 20 6d 65 72 67 65 20 6f 70 65 72 61 74 69   a merge operati
23750 6f 6e 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 6e  on..  **.  ** In
23760 20 74 68 65 20 66 69 72 73 74 20 63 61 73 65 2c   the first case,
23770 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 20 49 6e   return NULL. In
23780 20 74 68 65 20 73 65 63 6f 6e 64 2c 20 69 6e 63   the second, inc
23790 72 65 6d 65 6e 74 20 74 68 65 20 72 65 66 2d 63  rement the ref-c
237a0 6f 75 6e 74 0a 20 20 2a 2a 20 6f 6e 20 2a 70 53  ount.  ** on *pS
237b0 74 72 75 63 74 20 61 6e 64 20 72 65 74 75 72 6e  truct and return
237c0 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 70   a copy of the p
237d0 6f 69 6e 74 65 72 20 74 6f 20 69 74 2e 0a 20 20  ointer to it..  
237e0 2a 2f 0a 20 20 69 66 28 20 6e 53 65 67 3c 32 20  */.  if( nSeg<2 
237f0 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 66 6f  ) return 0;.  fo
23800 72 28 69 3d 30 3b 20 69 3c 70 53 74 72 75 63 74  r(i=0; i<pStruct
23810 2d 3e 6e 4c 65 76 65 6c 3b 20 69 2b 2b 29 7b 0a  ->nLevel; i++){.
23820 20 20 20 20 69 6e 74 20 6e 54 68 69 73 20 3d 20      int nThis = 
23830 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b  pStruct->aLevel[
23840 69 5d 2e 6e 53 65 67 3b 0a 20 20 20 20 69 66 28  i].nSeg;.    if(
23850 20 6e 54 68 69 73 3d 3d 6e 53 65 67 20 7c 7c 20   nThis==nSeg || 
23860 28 6e 54 68 69 73 3d 3d 6e 53 65 67 2d 31 20 26  (nThis==nSeg-1 &
23870 26 20 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65  & pStruct->aLeve
23880 6c 5b 69 5d 2e 6e 4d 65 72 67 65 3d 3d 6e 54 68  l[i].nMerge==nTh
23890 69 73 29 20 29 7b 0a 20 20 20 20 20 20 66 74 73  is) ){.      fts
238a0 35 53 74 72 75 63 74 75 72 65 52 65 66 28 70 53  5StructureRef(pS
238b0 74 72 75 63 74 29 3b 0a 20 20 20 20 20 20 72 65  truct);.      re
238c0 74 75 72 6e 20 70 53 74 72 75 63 74 3b 0a 20 20  turn pStruct;.  
238d0 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20    }.    assert( 
238e0 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b  pStruct->aLevel[
238f0 69 5d 2e 6e 4d 65 72 67 65 3c 3d 6e 54 68 69 73  i].nMerge<=nThis
23900 20 29 3b 0a 20 20 7d 0a 0a 20 20 6e 42 79 74 65   );.  }..  nByte
23910 20 2b 3d 20 28 70 53 74 72 75 63 74 2d 3e 6e 4c   += (pStruct->nL
23920 65 76 65 6c 2b 31 29 20 2a 20 73 69 7a 65 6f 66  evel+1) * sizeof
23930 28 46 74 73 35 53 74 72 75 63 74 75 72 65 4c 65  (Fts5StructureLe
23940 76 65 6c 29 3b 0a 20 20 70 4e 65 77 20 3d 20 28  vel);.  pNew = (
23950 46 74 73 35 53 74 72 75 63 74 75 72 65 2a 29 73  Fts5Structure*)s
23960 71 6c 69 74 65 33 46 74 73 35 4d 61 6c 6c 6f 63  qlite3Fts5Malloc
23970 5a 65 72 6f 28 26 70 2d 3e 72 63 2c 20 6e 42 79  Zero(&p->rc, nBy
23980 74 65 29 3b 0a 0a 20 20 69 66 28 20 70 4e 65 77  te);..  if( pNew
23990 20 29 7b 0a 20 20 20 20 46 74 73 35 53 74 72 75   ){.    Fts5Stru
239a0 63 74 75 72 65 4c 65 76 65 6c 20 2a 70 4c 76 6c  ctureLevel *pLvl
239b0 3b 0a 20 20 20 20 6e 42 79 74 65 20 3d 20 6e 53  ;.    nByte = nS
239c0 65 67 20 2a 20 73 69 7a 65 6f 66 28 46 74 73 35  eg * sizeof(Fts5
239d0 53 74 72 75 63 74 75 72 65 53 65 67 6d 65 6e 74  StructureSegment
239e0 29 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 4c 65  );.    pNew->nLe
239f0 76 65 6c 20 3d 20 70 53 74 72 75 63 74 2d 3e 6e  vel = pStruct->n
23a00 4c 65 76 65 6c 2b 31 3b 0a 20 20 20 20 70 4e 65  Level+1;.    pNe
23a10 77 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20 20  w->nRef = 1;.   
23a20 20 70 4e 65 77 2d 3e 6e 57 72 69 74 65 43 6f 75   pNew->nWriteCou
23a30 6e 74 65 72 20 3d 20 70 53 74 72 75 63 74 2d 3e  nter = pStruct->
23a40 6e 57 72 69 74 65 43 6f 75 6e 74 65 72 3b 0a 20  nWriteCounter;. 
23a50 20 20 20 70 4c 76 6c 20 3d 20 26 70 4e 65 77 2d     pLvl = &pNew-
23a60 3e 61 4c 65 76 65 6c 5b 70 53 74 72 75 63 74 2d  >aLevel[pStruct-
23a70 3e 6e 4c 65 76 65 6c 5d 3b 0a 20 20 20 20 70 4c  >nLevel];.    pL
23a80 76 6c 2d 3e 61 53 65 67 20 3d 20 28 46 74 73 35  vl->aSeg = (Fts5
23a90 53 74 72 75 63 74 75 72 65 53 65 67 6d 65 6e 74  StructureSegment
23aa0 2a 29 73 71 6c 69 74 65 33 46 74 73 35 4d 61 6c  *)sqlite3Fts5Mal
23ab0 6c 6f 63 5a 65 72 6f 28 26 70 2d 3e 72 63 2c 20  locZero(&p->rc, 
23ac0 6e 42 79 74 65 29 3b 0a 20 20 20 20 69 66 28 20  nByte);.    if( 
23ad0 70 4c 76 6c 2d 3e 61 53 65 67 20 29 7b 0a 20 20  pLvl->aSeg ){.  
23ae0 20 20 20 20 69 6e 74 20 69 4c 76 6c 2c 20 69 53      int iLvl, iS
23af0 65 67 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 53  eg;.      int iS
23b00 65 67 4f 75 74 20 3d 20 30 3b 0a 20 20 20 20 20  egOut = 0;.     
23b10 20 2f 2a 20 49 74 65 72 61 74 65 20 74 68 72 6f   /* Iterate thro
23b20 75 67 68 20 61 6c 6c 20 73 65 67 6d 65 6e 74 73  ugh all segments
23b30 2c 20 66 72 6f 6d 20 6f 6c 64 65 73 74 20 74 6f  , from oldest to
23b40 20 6e 65 77 65 73 74 2e 20 41 64 64 20 74 68 65   newest. Add the
23b50 6d 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 74 68  m to.      ** th
23b60 65 20 6e 65 77 20 46 74 73 35 4c 65 76 65 6c 20  e new Fts5Level 
23b70 6f 62 6a 65 63 74 20 73 6f 20 74 68 61 74 20 70  object so that p
23b80 4c 76 6c 2d 3e 61 53 65 67 5b 30 5d 20 69 73 20  Lvl->aSeg[0] is 
23b90 74 68 65 20 6f 6c 64 65 73 74 0a 20 20 20 20 20  the oldest.     
23ba0 20 2a 2a 20 73 65 67 6d 65 6e 74 20 69 6e 20 74   ** segment in t
23bb0 68 65 20 64 61 74 61 20 73 74 72 75 63 74 75 72  he data structur
23bc0 65 2e 20 20 2a 2f 0a 20 20 20 20 20 20 66 6f 72  e.  */.      for
23bd0 28 69 4c 76 6c 3d 70 53 74 72 75 63 74 2d 3e 6e  (iLvl=pStruct->n
23be0 4c 65 76 65 6c 2d 31 3b 20 69 4c 76 6c 3e 3d 30  Level-1; iLvl>=0
23bf0 3b 20 69 4c 76 6c 2d 2d 29 7b 0a 20 20 20 20 20  ; iLvl--){.     
23c00 20 20 20 66 6f 72 28 69 53 65 67 3d 30 3b 20 69     for(iSeg=0; i
23c10 53 65 67 3c 70 53 74 72 75 63 74 2d 3e 61 4c 65  Seg<pStruct->aLe
23c20 76 65 6c 5b 69 4c 76 6c 5d 2e 6e 53 65 67 3b 20  vel[iLvl].nSeg; 
23c30 69 53 65 67 2b 2b 29 7b 0a 20 20 20 20 20 20 20  iSeg++){.       
23c40 20 20 20 70 4c 76 6c 2d 3e 61 53 65 67 5b 69 53     pLvl->aSeg[iS
23c50 65 67 4f 75 74 5d 20 3d 20 70 53 74 72 75 63 74  egOut] = pStruct
23c60 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d 2e 61  ->aLevel[iLvl].a
23c70 53 65 67 5b 69 53 65 67 5d 3b 0a 20 20 20 20 20  Seg[iSeg];.     
23c80 20 20 20 20 20 69 53 65 67 4f 75 74 2b 2b 3b 0a       iSegOut++;.
23c90 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
23ca0 7d 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 53  }.      pNew->nS
23cb0 65 67 6d 65 6e 74 20 3d 20 70 4c 76 6c 2d 3e 6e  egment = pLvl->n
23cc0 53 65 67 20 3d 20 6e 53 65 67 3b 0a 20 20 20 20  Seg = nSeg;.    
23cd0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c  }else{.      sql
23ce0 69 74 65 33 5f 66 72 65 65 28 70 4e 65 77 29 3b  ite3_free(pNew);
23cf0 0a 20 20 20 20 20 20 70 4e 65 77 20 3d 20 30 3b  .      pNew = 0;
23d00 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65  .    }.  }..  re
23d10 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 69 6e  turn pNew;.}..in
23d20 74 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64  t sqlite3Fts5Ind
23d30 65 78 4f 70 74 69 6d 69 7a 65 28 46 74 73 35 49  exOptimize(Fts5I
23d40 6e 64 65 78 20 2a 70 29 7b 0a 20 20 46 74 73 35  ndex *p){.  Fts5
23d50 53 74 72 75 63 74 75 72 65 20 2a 70 53 74 72 75  Structure *pStru
23d60 63 74 3b 0a 20 20 46 74 73 35 53 74 72 75 63 74  ct;.  Fts5Struct
23d70 75 72 65 20 2a 70 4e 65 77 20 3d 20 30 3b 0a 0a  ure *pNew = 0;..
23d80 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72 63 3d    assert( p->rc=
23d90 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20  =SQLITE_OK );.  
23da0 66 74 73 35 49 6e 64 65 78 46 6c 75 73 68 28 70  fts5IndexFlush(p
23db0 29 3b 0a 20 20 70 53 74 72 75 63 74 20 3d 20 66  );.  pStruct = f
23dc0 74 73 35 53 74 72 75 63 74 75 72 65 52 65 61 64  ts5StructureRead
23dd0 28 70 29 3b 0a 20 20 66 74 73 35 53 74 72 75 63  (p);.  fts5Struc
23de0 74 75 72 65 49 6e 76 61 6c 69 64 61 74 65 28 70  tureInvalidate(p
23df0 29 3b 0a 0a 20 20 69 66 28 20 70 53 74 72 75 63  );..  if( pStruc
23e00 74 20 29 7b 0a 20 20 20 20 70 4e 65 77 20 3d 20  t ){.    pNew = 
23e10 66 74 73 35 49 6e 64 65 78 4f 70 74 69 6d 69 7a  fts5IndexOptimiz
23e20 65 53 74 72 75 63 74 28 70 2c 20 70 53 74 72 75  eStruct(p, pStru
23e30 63 74 29 3b 0a 20 20 7d 0a 20 20 66 74 73 35 53  ct);.  }.  fts5S
23e40 74 72 75 63 74 75 72 65 52 65 6c 65 61 73 65 28  tructureRelease(
23e50 70 53 74 72 75 63 74 29 3b 0a 0a 20 20 61 73 73  pStruct);..  ass
23e60 65 72 74 28 20 70 4e 65 77 3d 3d 30 20 7c 7c 20  ert( pNew==0 || 
23e70 70 4e 65 77 2d 3e 6e 53 65 67 6d 65 6e 74 3e 30  pNew->nSegment>0
23e80 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 20 29   );.  if( pNew )
23e90 7b 0a 20 20 20 20 69 6e 74 20 69 4c 76 6c 3b 0a  {.    int iLvl;.
23ea0 20 20 20 20 66 6f 72 28 69 4c 76 6c 3d 30 3b 20      for(iLvl=0; 
23eb0 70 4e 65 77 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76  pNew->aLevel[iLv
23ec0 6c 5d 2e 6e 53 65 67 3d 3d 30 3b 20 69 4c 76 6c  l].nSeg==0; iLvl
23ed0 2b 2b 29 7b 7d 0a 20 20 20 20 77 68 69 6c 65 28  ++){}.    while(
23ee0 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
23ef0 4b 20 26 26 20 70 4e 65 77 2d 3e 61 4c 65 76 65  K && pNew->aLeve
23f00 6c 5b 69 4c 76 6c 5d 2e 6e 53 65 67 3e 30 20 29  l[iLvl].nSeg>0 )
23f10 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 52 65 6d  {.      int nRem
23f20 20 3d 20 46 54 53 35 5f 4f 50 54 5f 57 4f 52 4b   = FTS5_OPT_WORK
23f30 5f 55 4e 49 54 3b 0a 20 20 20 20 20 20 66 74 73  _UNIT;.      fts
23f40 35 49 6e 64 65 78 4d 65 72 67 65 4c 65 76 65 6c  5IndexMergeLevel
23f50 28 70 2c 20 26 70 4e 65 77 2c 20 69 4c 76 6c 2c  (p, &pNew, iLvl,
23f60 20 26 6e 52 65 6d 29 3b 0a 20 20 20 20 7d 0a 0a   &nRem);.    }..
23f70 20 20 20 20 66 74 73 35 53 74 72 75 63 74 75 72      fts5Structur
23f80 65 57 72 69 74 65 28 70 2c 20 70 4e 65 77 29 3b  eWrite(p, pNew);
23f90 0a 20 20 20 20 66 74 73 35 53 74 72 75 63 74 75  .    fts5Structu
23fa0 72 65 52 65 6c 65 61 73 65 28 70 4e 65 77 29 3b  reRelease(pNew);
23fb0 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 66  .  }..  return f
23fc0 74 73 35 49 6e 64 65 78 52 65 74 75 72 6e 28 70  ts5IndexReturn(p
23fd0 29 3b 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  ); .}../*.** Thi
23fe0 73 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 69  s is called to i
23ff0 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 73 70 65  mplement the spe
24000 63 69 61 6c 20 22 56 41 4c 55 45 53 28 27 6d 65  cial "VALUES('me
24010 72 67 65 27 2c 20 24 6e 4d 65 72 67 65 29 22 0a  rge', $nMerge)".
24020 2a 2a 20 49 4e 53 45 52 54 20 63 6f 6d 6d 61 6e  ** INSERT comman
24030 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
24040 33 46 74 73 35 49 6e 64 65 78 4d 65 72 67 65 28  3Fts5IndexMerge(
24050 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 69 6e  Fts5Index *p, in
24060 74 20 6e 4d 65 72 67 65 29 7b 0a 20 20 46 74 73  t nMerge){.  Fts
24070 35 53 74 72 75 63 74 75 72 65 20 2a 70 53 74 72  5Structure *pStr
24080 75 63 74 20 3d 20 66 74 73 35 53 74 72 75 63 74  uct = fts5Struct
24090 75 72 65 52 65 61 64 28 70 29 3b 0a 20 20 69 66  ureRead(p);.  if
240a0 28 20 70 53 74 72 75 63 74 20 29 7b 0a 20 20 20  ( pStruct ){.   
240b0 20 69 6e 74 20 6e 4d 69 6e 20 3d 20 70 2d 3e 70   int nMin = p->p
240c0 43 6f 6e 66 69 67 2d 3e 6e 55 73 65 72 6d 65 72  Config->nUsermer
240d0 67 65 3b 0a 20 20 20 20 66 74 73 35 53 74 72 75  ge;.    fts5Stru
240e0 63 74 75 72 65 49 6e 76 61 6c 69 64 61 74 65 28  ctureInvalidate(
240f0 70 29 3b 0a 20 20 20 20 69 66 28 20 6e 4d 65 72  p);.    if( nMer
24100 67 65 3c 30 20 29 7b 0a 20 20 20 20 20 20 46 74  ge<0 ){.      Ft
24110 73 35 53 74 72 75 63 74 75 72 65 20 2a 70 4e 65  s5Structure *pNe
24120 77 20 3d 20 66 74 73 35 49 6e 64 65 78 4f 70 74  w = fts5IndexOpt
24130 69 6d 69 7a 65 53 74 72 75 63 74 28 70 2c 20 70  imizeStruct(p, p
24140 53 74 72 75 63 74 29 3b 0a 20 20 20 20 20 20 66  Struct);.      f
24150 74 73 35 53 74 72 75 63 74 75 72 65 52 65 6c 65  ts5StructureRele
24160 61 73 65 28 70 53 74 72 75 63 74 29 3b 0a 20 20  ase(pStruct);.  
24170 20 20 20 20 70 53 74 72 75 63 74 20 3d 20 70 4e      pStruct = pN
24180 65 77 3b 0a 20 20 20 20 20 20 6e 4d 69 6e 20 3d  ew;.      nMin =
24190 20 32 3b 0a 20 20 20 20 20 20 6e 4d 65 72 67 65   2;.      nMerge
241a0 20 3d 20 6e 4d 65 72 67 65 2a 2d 31 3b 0a 20 20   = nMerge*-1;.  
241b0 20 20 7d 0a 20 20 20 20 69 66 28 20 70 53 74 72    }.    if( pStr
241c0 75 63 74 20 26 26 20 70 53 74 72 75 63 74 2d 3e  uct && pStruct->
241d0 6e 4c 65 76 65 6c 20 29 7b 0a 20 20 20 20 20 20  nLevel ){.      
241e0 69 66 28 20 66 74 73 35 49 6e 64 65 78 4d 65 72  if( fts5IndexMer
241f0 67 65 28 70 2c 20 26 70 53 74 72 75 63 74 2c 20  ge(p, &pStruct, 
24200 6e 4d 65 72 67 65 2c 20 6e 4d 69 6e 29 20 29 7b  nMerge, nMin) ){
24210 0a 20 20 20 20 20 20 20 20 66 74 73 35 53 74 72  .        fts5Str
24220 75 63 74 75 72 65 57 72 69 74 65 28 70 2c 20 70  uctureWrite(p, p
24230 53 74 72 75 63 74 29 3b 0a 20 20 20 20 20 20 7d  Struct);.      }
24240 0a 20 20 20 20 7d 0a 20 20 20 20 66 74 73 35 53  .    }.    fts5S
24250 74 72 75 63 74 75 72 65 52 65 6c 65 61 73 65 28  tructureRelease(
24260 70 53 74 72 75 63 74 29 3b 0a 20 20 7d 0a 20 20  pStruct);.  }.  
24270 72 65 74 75 72 6e 20 66 74 73 35 49 6e 64 65 78  return fts5Index
24280 52 65 74 75 72 6e 28 70 29 3b 0a 7d 0a 0a 73 74  Return(p);.}..st
24290 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 41 70  atic void fts5Ap
242a0 70 65 6e 64 52 6f 77 69 64 28 0a 20 20 46 74 73  pendRowid(.  Fts
242b0 35 49 6e 64 65 78 20 2a 70 2c 0a 20 20 69 36 34  5Index *p,.  i64
242c0 20 69 44 65 6c 74 61 2c 0a 20 20 46 74 73 35 49   iDelta,.  Fts5I
242d0 74 65 72 20 2a 70 55 6e 75 73 65 64 2c 0a 20 20  ter *pUnused,.  
242e0 46 74 73 35 42 75 66 66 65 72 20 2a 70 42 75 66  Fts5Buffer *pBuf
242f0 0a 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  .){.  UNUSED_PAR
24300 41 4d 28 70 55 6e 75 73 65 64 29 3b 0a 20 20 66  AM(pUnused);.  f
24310 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 56  ts5BufferAppendV
24320 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20 70 42  arint(&p->rc, pB
24330 75 66 2c 20 69 44 65 6c 74 61 29 3b 0a 7d 0a 0a  uf, iDelta);.}..
24340 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
24350 41 70 70 65 6e 64 50 6f 73 6c 69 73 74 28 0a 20  AppendPoslist(. 
24360 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 0a 20   Fts5Index *p,. 
24370 20 69 36 34 20 69 44 65 6c 74 61 2c 0a 20 20 46   i64 iDelta,.  F
24380 74 73 35 49 74 65 72 20 2a 70 4d 75 6c 74 69 2c  ts5Iter *pMulti,
24390 0a 20 20 46 74 73 35 42 75 66 66 65 72 20 2a 70  .  Fts5Buffer *p
243a0 42 75 66 0a 29 7b 0a 20 20 69 6e 74 20 6e 44 61  Buf.){.  int nDa
243b0 74 61 20 3d 20 70 4d 75 6c 74 69 2d 3e 62 61 73  ta = pMulti->bas
243c0 65 2e 6e 44 61 74 61 3b 0a 20 20 61 73 73 65 72  e.nData;.  asser
243d0 74 28 20 6e 44 61 74 61 3e 30 20 29 3b 0a 20 20  t( nData>0 );.  
243e0 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  if( p->rc==SQLIT
243f0 45 5f 4f 4b 20 26 26 20 30 3d 3d 66 74 73 35 42  E_OK && 0==fts5B
24400 75 66 66 65 72 47 72 6f 77 28 26 70 2d 3e 72 63  ufferGrow(&p->rc
24410 2c 20 70 42 75 66 2c 20 6e 44 61 74 61 2b 39 2b  , pBuf, nData+9+
24420 39 29 20 29 7b 0a 20 20 20 20 66 74 73 35 42 75  9) ){.    fts5Bu
24430 66 66 65 72 53 61 66 65 41 70 70 65 6e 64 56 61  fferSafeAppendVa
24440 72 69 6e 74 28 70 42 75 66 2c 20 69 44 65 6c 74  rint(pBuf, iDelt
24450 61 29 3b 0a 20 20 20 20 66 74 73 35 42 75 66 66  a);.    fts5Buff
24460 65 72 53 61 66 65 41 70 70 65 6e 64 56 61 72 69  erSafeAppendVari
24470 6e 74 28 70 42 75 66 2c 20 6e 44 61 74 61 2a 32  nt(pBuf, nData*2
24480 29 3b 0a 20 20 20 20 66 74 73 35 42 75 66 66 65  );.    fts5Buffe
24490 72 53 61 66 65 41 70 70 65 6e 64 42 6c 6f 62 28  rSafeAppendBlob(
244a0 70 42 75 66 2c 20 70 4d 75 6c 74 69 2d 3e 62 61  pBuf, pMulti->ba
244b0 73 65 2e 70 44 61 74 61 2c 20 6e 44 61 74 61 29  se.pData, nData)
244c0 3b 0a 20 20 7d 0a 7d 0a 0a 0a 73 74 61 74 69 63  ;.  }.}...static
244d0 20 76 6f 69 64 20 66 74 73 35 44 6f 63 6c 69 73   void fts5Doclis
244e0 74 49 74 65 72 4e 65 78 74 28 46 74 73 35 44 6f  tIterNext(Fts5Do
244f0 63 6c 69 73 74 49 74 65 72 20 2a 70 49 74 65 72  clistIter *pIter
24500 29 7b 0a 20 20 75 38 20 2a 70 20 3d 20 70 49 74  ){.  u8 *p = pIt
24510 65 72 2d 3e 61 50 6f 73 6c 69 73 74 20 2b 20 70  er->aPoslist + p
24520 49 74 65 72 2d 3e 6e 53 69 7a 65 20 2b 20 70 49  Iter->nSize + pI
24530 74 65 72 2d 3e 6e 50 6f 73 6c 69 73 74 3b 0a 0a  ter->nPoslist;..
24540 20 20 61 73 73 65 72 74 28 20 70 49 74 65 72 2d    assert( pIter-
24550 3e 61 50 6f 73 6c 69 73 74 20 29 3b 0a 20 20 69  >aPoslist );.  i
24560 66 28 20 70 3e 3d 70 49 74 65 72 2d 3e 61 45 6f  f( p>=pIter->aEo
24570 66 20 29 7b 0a 20 20 20 20 70 49 74 65 72 2d 3e  f ){.    pIter->
24580 61 50 6f 73 6c 69 73 74 20 3d 20 30 3b 0a 20 20  aPoslist = 0;.  
24590 7d 65 6c 73 65 7b 0a 20 20 20 20 69 36 34 20 69  }else{.    i64 i
245a0 44 65 6c 74 61 3b 0a 0a 20 20 20 20 70 20 2b 3d  Delta;..    p +=
245b0 20 66 74 73 35 47 65 74 56 61 72 69 6e 74 28 70   fts5GetVarint(p
245c0 2c 20 28 75 36 34 2a 29 26 69 44 65 6c 74 61 29  , (u64*)&iDelta)
245d0 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 69 52 6f  ;.    pIter->iRo
245e0 77 69 64 20 2b 3d 20 69 44 65 6c 74 61 3b 0a 0a  wid += iDelta;..
245f0 20 20 20 20 2f 2a 20 52 65 61 64 20 70 6f 73 69      /* Read posi
24600 74 69 6f 6e 20 6c 69 73 74 20 73 69 7a 65 20 2a  tion list size *
24610 2f 0a 20 20 20 20 69 66 28 20 70 5b 30 5d 20 26  /.    if( p[0] &
24620 20 30 78 38 30 20 29 7b 0a 20 20 20 20 20 20 69   0x80 ){.      i
24630 6e 74 20 6e 50 6f 73 3b 0a 20 20 20 20 20 20 70  nt nPos;.      p
24640 49 74 65 72 2d 3e 6e 53 69 7a 65 20 3d 20 66 74  Iter->nSize = ft
24650 73 35 47 65 74 56 61 72 69 6e 74 33 32 28 70 2c  s5GetVarint32(p,
24660 20 6e 50 6f 73 29 3b 0a 20 20 20 20 20 20 70 49   nPos);.      pI
24670 74 65 72 2d 3e 6e 50 6f 73 6c 69 73 74 20 3d 20  ter->nPoslist = 
24680 28 6e 50 6f 73 3e 3e 31 29 3b 0a 20 20 20 20 7d  (nPos>>1);.    }
24690 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 49 74 65  else{.      pIte
246a0 72 2d 3e 6e 50 6f 73 6c 69 73 74 20 3d 20 28 28  r->nPoslist = ((
246b0 69 6e 74 29 28 70 5b 30 5d 29 29 20 3e 3e 20 31  int)(p[0])) >> 1
246c0 3b 0a 20 20 20 20 20 20 70 49 74 65 72 2d 3e 6e  ;.      pIter->n
246d0 53 69 7a 65 20 3d 20 31 3b 0a 20 20 20 20 7d 0a  Size = 1;.    }.
246e0 0a 20 20 20 20 70 49 74 65 72 2d 3e 61 50 6f 73  .    pIter->aPos
246f0 6c 69 73 74 20 3d 20 70 3b 0a 20 20 7d 0a 7d 0a  list = p;.  }.}.
24700 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
24710 35 44 6f 63 6c 69 73 74 49 74 65 72 49 6e 69 74  5DoclistIterInit
24720 28 0a 20 20 46 74 73 35 42 75 66 66 65 72 20 2a  (.  Fts5Buffer *
24730 70 42 75 66 2c 20 0a 20 20 46 74 73 35 44 6f 63  pBuf, .  Fts5Doc
24740 6c 69 73 74 49 74 65 72 20 2a 70 49 74 65 72 0a  listIter *pIter.
24750 29 7b 0a 20 20 6d 65 6d 73 65 74 28 70 49 74 65  ){.  memset(pIte
24760 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70 49  r, 0, sizeof(*pI
24770 74 65 72 29 29 3b 0a 20 20 70 49 74 65 72 2d 3e  ter));.  pIter->
24780 61 50 6f 73 6c 69 73 74 20 3d 20 70 42 75 66 2d  aPoslist = pBuf-
24790 3e 70 3b 0a 20 20 70 49 74 65 72 2d 3e 61 45 6f  >p;.  pIter->aEo
247a0 66 20 3d 20 26 70 42 75 66 2d 3e 70 5b 70 42 75  f = &pBuf->p[pBu
247b0 66 2d 3e 6e 5d 3b 0a 20 20 66 74 73 35 44 6f 63  f->n];.  fts5Doc
247c0 6c 69 73 74 49 74 65 72 4e 65 78 74 28 70 49 74  listIterNext(pIt
247d0 65 72 29 3b 0a 7d 0a 0a 23 69 66 20 30 0a 2f 2a  er);.}..#if 0./*
247e0 0a 2a 2a 20 41 70 70 65 6e 64 20 61 20 64 6f 63  .** Append a doc
247f0 6c 69 73 74 20 74 6f 20 62 75 66 66 65 72 20 70  list to buffer p
24800 42 75 66 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  Buf..**.** This 
24810 66 75 6e 63 74 69 6f 6e 20 61 73 73 75 6d 65 73  function assumes
24820 20 74 68 61 74 20 73 70 61 63 65 20 77 69 74 68   that space with
24830 69 6e 20 74 68 65 20 62 75 66 66 65 72 20 68 61  in the buffer ha
24840 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 0a 2a  s already been.*
24850 2a 20 61 6c 6c 6f 63 61 74 65 64 2e 0a 2a 2f 0a  * allocated..*/.
24860 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
24870 4d 65 72 67 65 41 70 70 65 6e 64 44 6f 63 69 64  MergeAppendDocid
24880 28 0a 20 20 46 74 73 35 42 75 66 66 65 72 20 2a  (.  Fts5Buffer *
24890 70 42 75 66 2c 20 20 20 20 20 20 20 20 20 20 20  pBuf,           
248a0 20 20 20 20 2f 2a 20 42 75 66 66 65 72 20 74 6f      /* Buffer to
248b0 20 77 72 69 74 65 20 74 6f 20 2a 2f 0a 20 20 69   write to */.  i
248c0 36 34 20 2a 70 69 4c 61 73 74 52 6f 77 69 64 2c  64 *piLastRowid,
248d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
248e0 2a 20 49 4e 2f 4f 55 54 3a 20 50 72 65 76 69 6f  * IN/OUT: Previo
248f0 75 73 20 72 6f 77 69 64 20 77 72 69 74 74 65 6e  us rowid written
24900 20 28 69 66 20 61 6e 79 29 20 2a 2f 0a 20 20 69   (if any) */.  i
24910 36 34 20 69 52 6f 77 69 64 20 20 20 20 20 20 20  64 iRowid       
24920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
24930 2a 20 52 6f 77 69 64 20 74 6f 20 61 70 70 65 6e  * Rowid to appen
24940 64 20 2a 2f 0a 29 7b 0a 20 20 61 73 73 65 72 74  d */.){.  assert
24950 28 20 70 42 75 66 2d 3e 6e 21 3d 30 20 7c 7c 20  ( pBuf->n!=0 || 
24960 28 2a 70 69 4c 61 73 74 52 6f 77 69 64 29 3d 3d  (*piLastRowid)==
24970 30 20 29 3b 0a 20 20 66 74 73 35 42 75 66 66 65  0 );.  fts5Buffe
24980 72 53 61 66 65 41 70 70 65 6e 64 56 61 72 69 6e  rSafeAppendVarin
24990 74 28 70 42 75 66 2c 20 69 52 6f 77 69 64 20 2d  t(pBuf, iRowid -
249a0 20 2a 70 69 4c 61 73 74 52 6f 77 69 64 29 3b 0a   *piLastRowid);.
249b0 20 20 2a 70 69 4c 61 73 74 52 6f 77 69 64 20 3d    *piLastRowid =
249c0 20 69 52 6f 77 69 64 3b 0a 7d 0a 23 65 6e 64 69   iRowid;.}.#endi
249d0 66 0a 0a 23 64 65 66 69 6e 65 20 66 74 73 35 4d  f..#define fts5M
249e0 65 72 67 65 41 70 70 65 6e 64 44 6f 63 69 64 28  ergeAppendDocid(
249f0 70 42 75 66 2c 20 69 4c 61 73 74 52 6f 77 69 64  pBuf, iLastRowid
24a00 2c 20 69 52 6f 77 69 64 29 20 7b 20 20 20 20 20  , iRowid) {     
24a10 20 20 5c 0a 20 20 61 73 73 65 72 74 28 20 28 70    \.  assert( (p
24a20 42 75 66 29 2d 3e 6e 21 3d 30 20 7c 7c 20 28 69  Buf)->n!=0 || (i
24a30 4c 61 73 74 52 6f 77 69 64 29 3d 3d 30 20 29 3b  LastRowid)==0 );
24a40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24a50 20 20 20 5c 0a 20 20 66 74 73 35 42 75 66 66 65     \.  fts5Buffe
24a60 72 53 61 66 65 41 70 70 65 6e 64 56 61 72 69 6e  rSafeAppendVarin
24a70 74 28 28 70 42 75 66 29 2c 20 28 69 52 6f 77 69  t((pBuf), (iRowi
24a80 64 29 20 2d 20 28 69 4c 61 73 74 52 6f 77 69 64  d) - (iLastRowid
24a90 29 29 3b 20 5c 0a 20 20 28 69 4c 61 73 74 52 6f  )); \.  (iLastRo
24aa0 77 69 64 29 20 3d 20 28 69 52 6f 77 69 64 29 3b  wid) = (iRowid);
24ab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24ac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24ad0 20 20 20 20 20 5c 0a 7d 0a 0a 2f 2a 0a 2a 2a 20       \.}../*.** 
24ae0 53 77 61 70 20 74 68 65 20 63 6f 6e 74 65 6e 74  Swap the content
24af0 73 20 6f 66 20 62 75 66 66 65 72 20 2a 70 31 20  s of buffer *p1 
24b00 77 69 74 68 20 74 68 61 74 20 6f 66 20 2a 70 32  with that of *p2
24b10 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
24b20 20 66 74 73 35 42 75 66 66 65 72 53 77 61 70 28   fts5BufferSwap(
24b30 46 74 73 35 42 75 66 66 65 72 20 2a 70 31 2c 20  Fts5Buffer *p1, 
24b40 46 74 73 35 42 75 66 66 65 72 20 2a 70 32 29 7b  Fts5Buffer *p2){
24b50 0a 20 20 46 74 73 35 42 75 66 66 65 72 20 74 6d  .  Fts5Buffer tm
24b60 70 20 3d 20 2a 70 31 3b 0a 20 20 2a 70 31 20 3d  p = *p1;.  *p1 =
24b70 20 2a 70 32 3b 0a 20 20 2a 70 32 20 3d 20 74 6d   *p2;.  *p2 = tm
24b80 70 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69  p;.}..static voi
24b90 64 20 66 74 73 35 4e 65 78 74 52 6f 77 69 64 28  d fts5NextRowid(
24ba0 46 74 73 35 42 75 66 66 65 72 20 2a 70 42 75 66  Fts5Buffer *pBuf
24bb0 2c 20 69 6e 74 20 2a 70 69 4f 66 66 2c 20 69 36  , int *piOff, i6
24bc0 34 20 2a 70 69 52 6f 77 69 64 29 7b 0a 20 20 69  4 *piRowid){.  i
24bd0 6e 74 20 69 20 3d 20 2a 70 69 4f 66 66 3b 0a 20  nt i = *piOff;. 
24be0 20 69 66 28 20 69 3e 3d 70 42 75 66 2d 3e 6e 20   if( i>=pBuf->n 
24bf0 29 7b 0a 20 20 20 20 2a 70 69 4f 66 66 20 3d 20  ){.    *piOff = 
24c00 2d 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  -1;.  }else{.   
24c10 20 75 36 34 20 69 56 61 6c 3b 0a 20 20 20 20 2a   u64 iVal;.    *
24c20 70 69 4f 66 66 20 3d 20 69 20 2b 20 73 71 6c 69  piOff = i + sqli
24c30 74 65 33 46 74 73 35 47 65 74 56 61 72 69 6e 74  te3Fts5GetVarint
24c40 28 26 70 42 75 66 2d 3e 70 5b 69 5d 2c 20 26 69  (&pBuf->p[i], &i
24c50 56 61 6c 29 3b 0a 20 20 20 20 2a 70 69 52 6f 77  Val);.    *piRow
24c60 69 64 20 2b 3d 20 69 56 61 6c 3b 0a 20 20 7d 0a  id += iVal;.  }.
24c70 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73  }../*.** This is
24c80 20 74 68 65 20 65 71 75 69 76 61 6c 65 6e 74 20   the equivalent 
24c90 6f 66 20 66 74 73 35 4d 65 72 67 65 50 72 65 66  of fts5MergePref
24ca0 69 78 4c 69 73 74 73 28 29 20 66 6f 72 20 64 65  ixLists() for de
24cb0 74 61 69 6c 3d 6e 6f 6e 65 20 6d 6f 64 65 2e 0a  tail=none mode..
24cc0 2a 2a 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  ** In this case 
24cd0 74 68 65 20 62 75 66 66 65 72 73 20 63 6f 6e 73  the buffers cons
24ce0 69 73 74 20 6f 66 20 61 20 64 65 6c 74 61 2d 65  ist of a delta-e
24cf0 6e 63 6f 64 65 64 20 6c 69 73 74 20 6f 66 20 72  ncoded list of r
24d00 6f 77 69 64 73 20 6f 6e 6c 79 2e 0a 2a 2f 0a 73  owids only..*/.s
24d10 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 4d  tatic void fts5M
24d20 65 72 67 65 52 6f 77 69 64 4c 69 73 74 73 28 0a  ergeRowidLists(.
24d30 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20    Fts5Index *p, 
24d40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24d50 20 20 2f 2a 20 46 54 53 35 20 62 61 63 6b 65 6e    /* FTS5 backen
24d60 64 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 46 74  d object */.  Ft
24d70 73 35 42 75 66 66 65 72 20 2a 70 31 2c 20 20 20  s5Buffer *p1,   
24d80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
24d90 20 46 69 72 73 74 20 6c 69 73 74 20 74 6f 20 6d   First list to m
24da0 65 72 67 65 20 2a 2f 0a 20 20 46 74 73 35 42 75  erge */.  Fts5Bu
24db0 66 66 65 72 20 2a 70 32 20 20 20 20 20 20 20 20  ffer *p2        
24dc0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 63            /* Sec
24dd0 6f 6e 64 20 6c 69 73 74 20 74 6f 20 6d 65 72 67  ond list to merg
24de0 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 31  e */.){.  int i1
24df0 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 32 20 3d   = 0;.  int i2 =
24e00 20 30 3b 0a 20 20 69 36 34 20 69 52 6f 77 69 64   0;.  i64 iRowid
24e10 31 20 3d 20 30 3b 0a 20 20 69 36 34 20 69 52 6f  1 = 0;.  i64 iRo
24e20 77 69 64 32 20 3d 20 30 3b 0a 20 20 69 36 34 20  wid2 = 0;.  i64 
24e30 69 4f 75 74 20 3d 20 30 3b 0a 0a 20 20 46 74 73  iOut = 0;..  Fts
24e40 35 42 75 66 66 65 72 20 6f 75 74 3b 0a 20 20 6d  5Buffer out;.  m
24e50 65 6d 73 65 74 28 26 6f 75 74 2c 20 30 2c 20 73  emset(&out, 0, s
24e60 69 7a 65 6f 66 28 6f 75 74 29 29 3b 0a 20 20 73  izeof(out));.  s
24e70 71 6c 69 74 65 33 46 74 73 35 42 75 66 66 65 72  qlite3Fts5Buffer
24e80 53 69 7a 65 28 26 70 2d 3e 72 63 2c 20 26 6f 75  Size(&p->rc, &ou
24e90 74 2c 20 70 31 2d 3e 6e 20 2b 20 70 32 2d 3e 6e  t, p1->n + p2->n
24ea0 29 3b 0a 20 20 69 66 28 20 70 2d 3e 72 63 20 29  );.  if( p->rc )
24eb0 20 72 65 74 75 72 6e 3b 0a 0a 20 20 66 74 73 35   return;..  fts5
24ec0 4e 65 78 74 52 6f 77 69 64 28 70 31 2c 20 26 69  NextRowid(p1, &i
24ed0 31 2c 20 26 69 52 6f 77 69 64 31 29 3b 0a 20 20  1, &iRowid1);.  
24ee0 66 74 73 35 4e 65 78 74 52 6f 77 69 64 28 70 32  fts5NextRowid(p2
24ef0 2c 20 26 69 32 2c 20 26 69 52 6f 77 69 64 32 29  , &i2, &iRowid2)
24f00 3b 0a 20 20 77 68 69 6c 65 28 20 69 31 3e 3d 30  ;.  while( i1>=0
24f10 20 7c 7c 20 69 32 3e 3d 30 20 29 7b 0a 20 20 20   || i2>=0 ){.   
24f20 20 69 66 28 20 69 31 3e 3d 30 20 26 26 20 28 69   if( i1>=0 && (i
24f30 32 3c 30 20 7c 7c 20 69 52 6f 77 69 64 31 3c 69  2<0 || iRowid1<i
24f40 52 6f 77 69 64 32 29 20 29 7b 0a 20 20 20 20 20  Rowid2) ){.     
24f50 20 61 73 73 65 72 74 28 20 69 4f 75 74 3d 3d 30   assert( iOut==0
24f60 20 7c 7c 20 69 52 6f 77 69 64 31 3e 69 4f 75 74   || iRowid1>iOut
24f70 20 29 3b 0a 20 20 20 20 20 20 66 74 73 35 42 75   );.      fts5Bu
24f80 66 66 65 72 53 61 66 65 41 70 70 65 6e 64 56 61  fferSafeAppendVa
24f90 72 69 6e 74 28 26 6f 75 74 2c 20 69 52 6f 77 69  rint(&out, iRowi
24fa0 64 31 20 2d 20 69 4f 75 74 29 3b 0a 20 20 20 20  d1 - iOut);.    
24fb0 20 20 69 4f 75 74 20 3d 20 69 52 6f 77 69 64 31    iOut = iRowid1
24fc0 3b 0a 20 20 20 20 20 20 66 74 73 35 4e 65 78 74  ;.      fts5Next
24fd0 52 6f 77 69 64 28 70 31 2c 20 26 69 31 2c 20 26  Rowid(p1, &i1, &
24fe0 69 52 6f 77 69 64 31 29 3b 0a 20 20 20 20 7d 65  iRowid1);.    }e
24ff0 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72  lse{.      asser
25000 74 28 20 69 4f 75 74 3d 3d 30 20 7c 7c 20 69 52  t( iOut==0 || iR
25010 6f 77 69 64 32 3e 69 4f 75 74 20 29 3b 0a 20 20  owid2>iOut );.  
25020 20 20 20 20 66 74 73 35 42 75 66 66 65 72 53 61      fts5BufferSa
25030 66 65 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26  feAppendVarint(&
25040 6f 75 74 2c 20 69 52 6f 77 69 64 32 20 2d 20 69  out, iRowid2 - i
25050 4f 75 74 29 3b 0a 20 20 20 20 20 20 69 4f 75 74  Out);.      iOut
25060 20 3d 20 69 52 6f 77 69 64 32 3b 0a 20 20 20 20   = iRowid2;.    
25070 20 20 69 66 28 20 69 31 3e 3d 30 20 26 26 20 69    if( i1>=0 && i
25080 52 6f 77 69 64 31 3d 3d 69 52 6f 77 69 64 32 20  Rowid1==iRowid2 
25090 29 7b 0a 20 20 20 20 20 20 20 20 66 74 73 35 4e  ){.        fts5N
250a0 65 78 74 52 6f 77 69 64 28 70 31 2c 20 26 69 31  extRowid(p1, &i1
250b0 2c 20 26 69 52 6f 77 69 64 31 29 3b 0a 20 20 20  , &iRowid1);.   
250c0 20 20 20 7d 0a 20 20 20 20 20 20 66 74 73 35 4e     }.      fts5N
250d0 65 78 74 52 6f 77 69 64 28 70 32 2c 20 26 69 32  extRowid(p2, &i2
250e0 2c 20 26 69 52 6f 77 69 64 32 29 3b 0a 20 20 20  , &iRowid2);.   
250f0 20 7d 0a 20 20 7d 0a 0a 20 20 66 74 73 35 42 75   }.  }..  fts5Bu
25100 66 66 65 72 53 77 61 70 28 26 6f 75 74 2c 20 70  fferSwap(&out, p
25110 31 29 3b 0a 20 20 66 74 73 35 42 75 66 66 65 72  1);.  fts5Buffer
25120 46 72 65 65 28 26 6f 75 74 29 3b 0a 7d 0a 0a 2f  Free(&out);.}../
25130 2a 0a 2a 2a 20 42 75 66 66 65 72 73 20 70 31 20  *.** Buffers p1 
25140 61 6e 64 20 70 32 20 63 6f 6e 74 61 69 6e 20 64  and p2 contain d
25150 6f 63 6c 69 73 74 73 2e 20 54 68 69 73 20 66 75  oclists. This fu
25160 6e 63 74 69 6f 6e 20 6d 65 72 67 65 73 20 74 68  nction merges th
25170 65 20 63 6f 6e 74 65 6e 74 0a 2a 2a 20 6f 66 20  e content.** of 
25180 74 68 65 20 74 77 6f 20 64 6f 63 6c 69 73 74 73  the two doclists
25190 20 74 6f 67 65 74 68 65 72 20 61 6e 64 20 73 65   together and se
251a0 74 73 20 62 75 66 66 65 72 20 70 31 20 74 6f 20  ts buffer p1 to 
251b0 74 68 65 20 72 65 73 75 6c 74 20 62 65 66 6f 72  the result befor
251c0 65 0a 2a 2a 20 72 65 74 75 72 6e 69 6e 67 2e 0a  e.** returning..
251d0 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f  **.** If an erro
251e0 72 20 6f 63 63 75 72 73 2c 20 61 6e 20 65 72 72  r occurs, an err
251f0 6f 72 20 63 6f 64 65 20 69 73 20 6c 65 66 74 20  or code is left 
25200 69 6e 20 70 2d 3e 72 63 2e 20 49 66 20 61 6e 20  in p->rc. If an 
25210 65 72 72 6f 72 20 68 61 73 0a 2a 2a 20 61 6c 72  error has.** alr
25220 65 61 64 79 20 6f 63 63 75 72 72 65 64 2c 20 74  eady occurred, t
25230 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
25240 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74  a no-op..*/.stat
25250 69 63 20 76 6f 69 64 20 66 74 73 35 4d 65 72 67  ic void fts5Merg
25260 65 50 72 65 66 69 78 4c 69 73 74 73 28 0a 20 20  ePrefixLists(.  
25270 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 20 20  Fts5Index *p,   
25280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25290 2f 2a 20 46 54 53 35 20 62 61 63 6b 65 6e 64 20  /* FTS5 backend 
252a0 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 46 74 73 35  object */.  Fts5
252b0 42 75 66 66 65 72 20 2a 70 31 2c 20 20 20 20 20  Buffer *p1,     
252c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
252d0 69 72 73 74 20 6c 69 73 74 20 74 6f 20 6d 65 72  irst list to mer
252e0 67 65 20 2a 2f 0a 20 20 46 74 73 35 42 75 66 66  ge */.  Fts5Buff
252f0 65 72 20 2a 70 32 20 20 20 20 20 20 20 20 20 20  er *p2          
25300 20 20 20 20 20 20 20 20 2f 2a 20 53 65 63 6f 6e          /* Secon
25310 64 20 6c 69 73 74 20 74 6f 20 6d 65 72 67 65 20  d list to merge 
25320 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 70 32 2d 3e  */.){.  if( p2->
25330 6e 20 29 7b 0a 20 20 20 20 69 36 34 20 69 4c 61  n ){.    i64 iLa
25340 73 74 52 6f 77 69 64 20 3d 20 30 3b 0a 20 20 20  stRowid = 0;.   
25350 20 46 74 73 35 44 6f 63 6c 69 73 74 49 74 65 72   Fts5DoclistIter
25360 20 69 31 3b 0a 20 20 20 20 46 74 73 35 44 6f 63   i1;.    Fts5Doc
25370 6c 69 73 74 49 74 65 72 20 69 32 3b 0a 20 20 20  listIter i2;.   
25380 20 46 74 73 35 42 75 66 66 65 72 20 6f 75 74 20   Fts5Buffer out 
25390 3d 20 7b 30 2c 20 30 2c 20 30 7d 3b 0a 20 20 20  = {0, 0, 0};.   
253a0 20 46 74 73 35 42 75 66 66 65 72 20 74 6d 70 20   Fts5Buffer tmp 
253b0 3d 20 7b 30 2c 20 30 2c 20 30 7d 3b 0a 0a 20 20  = {0, 0, 0};..  
253c0 20 20 69 66 28 20 73 71 6c 69 74 65 33 46 74 73    if( sqlite3Fts
253d0 35 42 75 66 66 65 72 53 69 7a 65 28 26 70 2d 3e  5BufferSize(&p->
253e0 72 63 2c 20 26 6f 75 74 2c 20 70 31 2d 3e 6e 20  rc, &out, p1->n 
253f0 2b 20 70 32 2d 3e 6e 29 20 29 20 72 65 74 75 72  + p2->n) ) retur
25400 6e 3b 0a 20 20 20 20 66 74 73 35 44 6f 63 6c 69  n;.    fts5Docli
25410 73 74 49 74 65 72 49 6e 69 74 28 70 31 2c 20 26  stIterInit(p1, &
25420 69 31 29 3b 0a 20 20 20 20 66 74 73 35 44 6f 63  i1);.    fts5Doc
25430 6c 69 73 74 49 74 65 72 49 6e 69 74 28 70 32 2c  listIterInit(p2,
25440 20 26 69 32 29 3b 0a 0a 20 20 20 20 77 68 69 6c   &i2);..    whil
25450 65 28 20 31 20 29 7b 0a 20 20 20 20 20 20 69 66  e( 1 ){.      if
25460 28 20 69 31 2e 69 52 6f 77 69 64 3c 69 32 2e 69  ( i1.iRowid<i2.i
25470 52 6f 77 69 64 20 29 7b 0a 20 20 20 20 20 20 20  Rowid ){.       
25480 20 2f 2a 20 43 6f 70 79 20 65 6e 74 72 79 20 66   /* Copy entry f
25490 72 6f 6d 20 69 31 20 2a 2f 0a 20 20 20 20 20 20  rom i1 */.      
254a0 20 20 66 74 73 35 4d 65 72 67 65 41 70 70 65 6e    fts5MergeAppen
254b0 64 44 6f 63 69 64 28 26 6f 75 74 2c 20 69 4c 61  dDocid(&out, iLa
254c0 73 74 52 6f 77 69 64 2c 20 69 31 2e 69 52 6f 77  stRowid, i1.iRow
254d0 69 64 29 3b 0a 20 20 20 20 20 20 20 20 66 74 73  id);.        fts
254e0 35 42 75 66 66 65 72 53 61 66 65 41 70 70 65 6e  5BufferSafeAppen
254f0 64 42 6c 6f 62 28 26 6f 75 74 2c 20 69 31 2e 61  dBlob(&out, i1.a
25500 50 6f 73 6c 69 73 74 2c 20 69 31 2e 6e 50 6f 73  Poslist, i1.nPos
25510 6c 69 73 74 2b 69 31 2e 6e 53 69 7a 65 29 3b 0a  list+i1.nSize);.
25520 20 20 20 20 20 20 20 20 66 74 73 35 44 6f 63 6c          fts5Docl
25530 69 73 74 49 74 65 72 4e 65 78 74 28 26 69 31 29  istIterNext(&i1)
25540 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 31  ;.        if( i1
25550 2e 61 50 6f 73 6c 69 73 74 3d 3d 30 20 29 20 62  .aPoslist==0 ) b
25560 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
25570 20 20 20 20 65 6c 73 65 20 69 66 28 20 69 32 2e      else if( i2.
25580 69 52 6f 77 69 64 21 3d 69 31 2e 69 52 6f 77 69  iRowid!=i1.iRowi
25590 64 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  d ){.        /* 
255a0 43 6f 70 79 20 65 6e 74 72 79 20 66 72 6f 6d 20  Copy entry from 
255b0 69 32 20 2a 2f 0a 20 20 20 20 20 20 20 20 66 74  i2 */.        ft
255c0 73 35 4d 65 72 67 65 41 70 70 65 6e 64 44 6f 63  s5MergeAppendDoc
255d0 69 64 28 26 6f 75 74 2c 20 69 4c 61 73 74 52 6f  id(&out, iLastRo
255e0 77 69 64 2c 20 69 32 2e 69 52 6f 77 69 64 29 3b  wid, i2.iRowid);
255f0 0a 20 20 20 20 20 20 20 20 66 74 73 35 42 75 66  .        fts5Buf
25600 66 65 72 53 61 66 65 41 70 70 65 6e 64 42 6c 6f  ferSafeAppendBlo
25610 62 28 26 6f 75 74 2c 20 69 32 2e 61 50 6f 73 6c  b(&out, i2.aPosl
25620 69 73 74 2c 20 69 32 2e 6e 50 6f 73 6c 69 73 74  ist, i2.nPoslist
25630 2b 69 32 2e 6e 53 69 7a 65 29 3b 0a 20 20 20 20  +i2.nSize);.    
25640 20 20 20 20 66 74 73 35 44 6f 63 6c 69 73 74 49      fts5DoclistI
25650 74 65 72 4e 65 78 74 28 26 69 32 29 3b 0a 20 20  terNext(&i2);.  
25660 20 20 20 20 20 20 69 66 28 20 69 32 2e 61 50 6f        if( i2.aPo
25670 73 6c 69 73 74 3d 3d 30 20 29 20 62 72 65 61 6b  slist==0 ) break
25680 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
25690 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a  else{.        /*
256a0 20 4d 65 72 67 65 20 74 68 65 20 74 77 6f 20 70   Merge the two p
256b0 6f 73 69 74 69 6f 6e 20 6c 69 73 74 73 2e 20 2a  osition lists. *
256c0 2f 20 0a 20 20 20 20 20 20 20 20 69 36 34 20 69  / .        i64 i
256d0 50 6f 73 31 20 3d 20 30 3b 0a 20 20 20 20 20 20  Pos1 = 0;.      
256e0 20 20 69 36 34 20 69 50 6f 73 32 20 3d 20 30 3b    i64 iPos2 = 0;
256f0 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 4f 66  .        int iOf
25700 66 31 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  f1 = 0;.        
25710 69 6e 74 20 69 4f 66 66 32 20 3d 20 30 3b 0a 20  int iOff2 = 0;. 
25720 20 20 20 20 20 20 20 75 38 20 2a 61 31 20 3d 20         u8 *a1 = 
25730 26 69 31 2e 61 50 6f 73 6c 69 73 74 5b 69 31 2e  &i1.aPoslist[i1.
25740 6e 53 69 7a 65 5d 3b 0a 20 20 20 20 20 20 20 20  nSize];.        
25750 75 38 20 2a 61 32 20 3d 20 26 69 32 2e 61 50 6f  u8 *a2 = &i2.aPo
25760 73 6c 69 73 74 5b 69 32 2e 6e 53 69 7a 65 5d 3b  slist[i2.nSize];
25770 0a 0a 20 20 20 20 20 20 20 20 69 36 34 20 69 50  ..        i64 iP
25780 72 65 76 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  rev = 0;.       
25790 20 46 74 73 35 50 6f 73 6c 69 73 74 57 72 69 74   Fts5PoslistWrit
257a0 65 72 20 77 72 69 74 65 72 3b 0a 20 20 20 20 20  er writer;.     
257b0 20 20 20 6d 65 6d 73 65 74 28 26 77 72 69 74 65     memset(&write
257c0 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 77 72 69  r, 0, sizeof(wri
257d0 74 65 72 29 29 3b 0a 0a 20 20 20 20 20 20 20 20  ter));..        
257e0 66 74 73 35 4d 65 72 67 65 41 70 70 65 6e 64 44  fts5MergeAppendD
257f0 6f 63 69 64 28 26 6f 75 74 2c 20 69 4c 61 73 74  ocid(&out, iLast
25800 52 6f 77 69 64 2c 20 69 32 2e 69 52 6f 77 69 64  Rowid, i2.iRowid
25810 29 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35 42  );.        fts5B
25820 75 66 66 65 72 5a 65 72 6f 28 26 74 6d 70 29 3b  ufferZero(&tmp);
25830 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
25840 46 74 73 35 42 75 66 66 65 72 53 69 7a 65 28 26  Fts5BufferSize(&
25850 70 2d 3e 72 63 2c 20 26 74 6d 70 2c 20 69 31 2e  p->rc, &tmp, i1.
25860 6e 50 6f 73 6c 69 73 74 20 2b 20 69 32 2e 6e 50  nPoslist + i2.nP
25870 6f 73 6c 69 73 74 29 3b 0a 20 20 20 20 20 20 20  oslist);.       
25880 20 69 66 28 20 70 2d 3e 72 63 20 29 20 62 72 65   if( p->rc ) bre
25890 61 6b 3b 0a 0a 20 20 20 20 20 20 20 20 73 71 6c  ak;..        sql
258a0 69 74 65 33 46 74 73 35 50 6f 73 6c 69 73 74 4e  ite3Fts5PoslistN
258b0 65 78 74 36 34 28 61 31 2c 20 69 31 2e 6e 50 6f  ext64(a1, i1.nPo
258c0 73 6c 69 73 74 2c 20 26 69 4f 66 66 31 2c 20 26  slist, &iOff1, &
258d0 69 50 6f 73 31 29 3b 0a 20 20 20 20 20 20 20 20  iPos1);.        
258e0 73 71 6c 69 74 65 33 46 74 73 35 50 6f 73 6c 69  sqlite3Fts5Posli
258f0 73 74 4e 65 78 74 36 34 28 61 32 2c 20 69 32 2e  stNext64(a2, i2.
25900 6e 50 6f 73 6c 69 73 74 2c 20 26 69 4f 66 66 32  nPoslist, &iOff2
25910 2c 20 26 69 50 6f 73 32 29 3b 0a 20 20 20 20 20  , &iPos2);.     
25920 20 20 20 61 73 73 65 72 74 28 20 69 50 6f 73 31     assert( iPos1
25930 3e 3d 30 20 26 26 20 69 50 6f 73 32 3e 3d 30 20  >=0 && iPos2>=0 
25940 29 3b 0a 0a 20 20 20 20 20 20 20 20 69 66 28 20  );..        if( 
25950 69 50 6f 73 31 3c 69 50 6f 73 32 20 29 7b 0a 20  iPos1<iPos2 ){. 
25960 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
25970 46 74 73 35 50 6f 73 6c 69 73 74 53 61 66 65 41  Fts5PoslistSafeA
25980 70 70 65 6e 64 28 26 74 6d 70 2c 20 26 69 50 72  ppend(&tmp, &iPr
25990 65 76 2c 20 69 50 6f 73 31 29 3b 0a 20 20 20 20  ev, iPos1);.    
259a0 20 20 20 20 20 20 73 71 6c 69 74 65 33 46 74 73        sqlite3Fts
259b0 35 50 6f 73 6c 69 73 74 4e 65 78 74 36 34 28 61  5PoslistNext64(a
259c0 31 2c 20 69 31 2e 6e 50 6f 73 6c 69 73 74 2c 20  1, i1.nPoslist, 
259d0 26 69 4f 66 66 31 2c 20 26 69 50 6f 73 31 29 3b  &iOff1, &iPos1);
259e0 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
259f0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
25a00 33 46 74 73 35 50 6f 73 6c 69 73 74 53 61 66 65  3Fts5PoslistSafe
25a10 41 70 70 65 6e 64 28 26 74 6d 70 2c 20 26 69 50  Append(&tmp, &iP
25a20 72 65 76 2c 20 69 50 6f 73 32 29 3b 0a 20 20 20  rev, iPos2);.   
25a30 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 46 74         sqlite3Ft
25a40 73 35 50 6f 73 6c 69 73 74 4e 65 78 74 36 34 28  s5PoslistNext64(
25a50 61 32 2c 20 69 32 2e 6e 50 6f 73 6c 69 73 74 2c  a2, i2.nPoslist,
25a60 20 26 69 4f 66 66 32 2c 20 26 69 50 6f 73 32 29   &iOff2, &iPos2)
25a70 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20  ;.        }..   
25a80 20 20 20 20 20 69 66 28 20 69 50 6f 73 31 3e 3d       if( iPos1>=
25a90 30 20 26 26 20 69 50 6f 73 32 3e 3d 30 20 29 7b  0 && iPos2>=0 ){
25aa0 0a 20 20 20 20 20 20 20 20 20 20 77 68 69 6c 65  .          while
25ab0 28 20 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ( 1 ){.         
25ac0 20 20 20 69 66 28 20 69 50 6f 73 31 3c 69 50 6f     if( iPos1<iPo
25ad0 73 32 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  s2 ){.          
25ae0 20 20 20 20 69 66 28 20 69 50 6f 73 31 21 3d 69      if( iPos1!=i
25af0 50 72 65 76 20 29 7b 0a 20 20 20 20 20 20 20 20  Prev ){.        
25b00 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 46          sqlite3F
25b10 74 73 35 50 6f 73 6c 69 73 74 53 61 66 65 41 70  ts5PoslistSafeAp
25b20 70 65 6e 64 28 26 74 6d 70 2c 20 26 69 50 72 65  pend(&tmp, &iPre
25b30 76 2c 20 69 50 6f 73 31 29 3b 0a 20 20 20 20 20  v, iPos1);.     
25b40 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
25b50 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
25b60 46 74 73 35 50 6f 73 6c 69 73 74 4e 65 78 74 36  Fts5PoslistNext6
25b70 34 28 61 31 2c 20 69 31 2e 6e 50 6f 73 6c 69 73  4(a1, i1.nPoslis
25b80 74 2c 20 26 69 4f 66 66 31 2c 20 26 69 50 6f 73  t, &iOff1, &iPos
25b90 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  1);.            
25ba0 20 20 69 66 28 20 69 50 6f 73 31 3c 30 20 29 20    if( iPos1<0 ) 
25bb0 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20  break;.         
25bc0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
25bd0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
25be0 69 50 6f 73 32 21 3d 69 50 72 65 76 20 29 3b 0a  iPos2!=iPrev );.
25bf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
25c00 6c 69 74 65 33 46 74 73 35 50 6f 73 6c 69 73 74  lite3Fts5Poslist
25c10 53 61 66 65 41 70 70 65 6e 64 28 26 74 6d 70 2c  SafeAppend(&tmp,
25c20 20 26 69 50 72 65 76 2c 20 69 50 6f 73 32 29 3b   &iPrev, iPos2);
25c30 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73  .              s
25c40 71 6c 69 74 65 33 46 74 73 35 50 6f 73 6c 69 73  qlite3Fts5Poslis
25c50 74 4e 65 78 74 36 34 28 61 32 2c 20 69 32 2e 6e  tNext64(a2, i2.n
25c60 50 6f 73 6c 69 73 74 2c 20 26 69 4f 66 66 32 2c  Poslist, &iOff2,
25c70 20 26 69 50 6f 73 32 29 3b 0a 20 20 20 20 20 20   &iPos2);.      
25c80 20 20 20 20 20 20 20 20 69 66 28 20 69 50 6f 73          if( iPos
25c90 32 3c 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  2<0 ) break;.   
25ca0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
25cb0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
25cc0 0a 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 50  ..        if( iP
25cd0 6f 73 31 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20  os1>=0 ){.      
25ce0 20 20 20 20 69 66 28 20 69 50 6f 73 31 21 3d 69      if( iPos1!=i
25cf0 50 72 65 76 20 29 7b 0a 20 20 20 20 20 20 20 20  Prev ){.        
25d00 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 50      sqlite3Fts5P
25d10 6f 73 6c 69 73 74 53 61 66 65 41 70 70 65 6e 64  oslistSafeAppend
25d20 28 26 74 6d 70 2c 20 26 69 50 72 65 76 2c 20 69  (&tmp, &iPrev, i
25d30 50 6f 73 31 29 3b 0a 20 20 20 20 20 20 20 20 20  Pos1);.         
25d40 20 7d 0a 20 20 20 20 20 20 20 20 20 20 66 74 73   }.          fts
25d50 35 42 75 66 66 65 72 53 61 66 65 41 70 70 65 6e  5BufferSafeAppen
25d60 64 42 6c 6f 62 28 26 74 6d 70 2c 20 26 61 31 5b  dBlob(&tmp, &a1[
25d70 69 4f 66 66 31 5d 2c 20 69 31 2e 6e 50 6f 73 6c  iOff1], i1.nPosl
25d80 69 73 74 2d 69 4f 66 66 31 29 3b 0a 20 20 20 20  ist-iOff1);.    
25d90 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
25da0 20 20 20 20 20 61 73 73 65 72 74 28 20 69 50 6f       assert( iPo
25db0 73 32 3e 3d 30 20 26 26 20 69 50 6f 73 32 21 3d  s2>=0 && iPos2!=
25dc0 69 50 72 65 76 20 29 3b 0a 20 20 20 20 20 20 20  iPrev );.       
25dd0 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 50 6f     sqlite3Fts5Po
25de0 73 6c 69 73 74 53 61 66 65 41 70 70 65 6e 64 28  slistSafeAppend(
25df0 26 74 6d 70 2c 20 26 69 50 72 65 76 2c 20 69 50  &tmp, &iPrev, iP
25e00 6f 73 32 29 3b 0a 20 20 20 20 20 20 20 20 20 20  os2);.          
25e10 66 74 73 35 42 75 66 66 65 72 53 61 66 65 41 70  fts5BufferSafeAp
25e20 70 65 6e 64 42 6c 6f 62 28 26 74 6d 70 2c 20 26  pendBlob(&tmp, &
25e30 61 32 5b 69 4f 66 66 32 5d 2c 20 69 32 2e 6e 50  a2[iOff2], i2.nP
25e40 6f 73 6c 69 73 74 2d 69 4f 66 66 32 29 3b 0a 20  oslist-iOff2);. 
25e50 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20         }..      
25e60 20 20 2f 2a 20 57 52 49 54 45 50 4f 53 4c 49 53    /* WRITEPOSLIS
25e70 54 53 49 5a 45 20 2a 2f 0a 20 20 20 20 20 20 20  TSIZE */.       
25e80 20 66 74 73 35 42 75 66 66 65 72 53 61 66 65 41   fts5BufferSafeA
25e90 70 70 65 6e 64 56 61 72 69 6e 74 28 26 6f 75 74  ppendVarint(&out
25ea0 2c 20 74 6d 70 2e 6e 20 2a 20 32 29 3b 0a 20 20  , tmp.n * 2);.  
25eb0 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72        fts5Buffer
25ec0 53 61 66 65 41 70 70 65 6e 64 42 6c 6f 62 28 26  SafeAppendBlob(&
25ed0 6f 75 74 2c 20 74 6d 70 2e 70 2c 20 74 6d 70 2e  out, tmp.p, tmp.
25ee0 6e 29 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35  n);.        fts5
25ef0 44 6f 63 6c 69 73 74 49 74 65 72 4e 65 78 74 28  DoclistIterNext(
25f00 26 69 31 29 3b 0a 20 20 20 20 20 20 20 20 66 74  &i1);.        ft
25f10 73 35 44 6f 63 6c 69 73 74 49 74 65 72 4e 65 78  s5DoclistIterNex
25f20 74 28 26 69 32 29 3b 0a 20 20 20 20 20 20 20 20  t(&i2);.        
25f30 69 66 28 20 69 31 2e 61 50 6f 73 6c 69 73 74 3d  if( i1.aPoslist=
25f40 3d 30 20 7c 7c 20 69 32 2e 61 50 6f 73 6c 69 73  =0 || i2.aPoslis
25f50 74 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20  t==0 ) break;.  
25f60 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
25f70 20 69 66 28 20 69 31 2e 61 50 6f 73 6c 69 73 74   if( i1.aPoslist
25f80 20 29 7b 0a 20 20 20 20 20 20 66 74 73 35 4d 65   ){.      fts5Me
25f90 72 67 65 41 70 70 65 6e 64 44 6f 63 69 64 28 26  rgeAppendDocid(&
25fa0 6f 75 74 2c 20 69 4c 61 73 74 52 6f 77 69 64 2c  out, iLastRowid,
25fb0 20 69 31 2e 69 52 6f 77 69 64 29 3b 0a 20 20 20   i1.iRowid);.   
25fc0 20 20 20 66 74 73 35 42 75 66 66 65 72 53 61 66     fts5BufferSaf
25fd0 65 41 70 70 65 6e 64 42 6c 6f 62 28 26 6f 75 74  eAppendBlob(&out
25fe0 2c 20 69 31 2e 61 50 6f 73 6c 69 73 74 2c 20 69  , i1.aPoslist, i
25ff0 31 2e 61 45 6f 66 20 2d 20 69 31 2e 61 50 6f 73  1.aEof - i1.aPos
26000 6c 69 73 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20  list);.    }.   
26010 20 65 6c 73 65 20 69 66 28 20 69 32 2e 61 50 6f   else if( i2.aPo
26020 73 6c 69 73 74 20 29 7b 0a 20 20 20 20 20 20 66  slist ){.      f
26030 74 73 35 4d 65 72 67 65 41 70 70 65 6e 64 44 6f  ts5MergeAppendDo
26040 63 69 64 28 26 6f 75 74 2c 20 69 4c 61 73 74 52  cid(&out, iLastR
26050 6f 77 69 64 2c 20 69 32 2e 69 52 6f 77 69 64 29  owid, i2.iRowid)
26060 3b 0a 20 20 20 20 20 20 66 74 73 35 42 75 66 66  ;.      fts5Buff
26070 65 72 53 61 66 65 41 70 70 65 6e 64 42 6c 6f 62  erSafeAppendBlob
26080 28 26 6f 75 74 2c 20 69 32 2e 61 50 6f 73 6c 69  (&out, i2.aPosli
26090 73 74 2c 20 69 32 2e 61 45 6f 66 20 2d 20 69 32  st, i2.aEof - i2
260a0 2e 61 50 6f 73 6c 69 73 74 29 3b 0a 20 20 20 20  .aPoslist);.    
260b0 7d 0a 0a 20 20 20 20 66 74 73 35 42 75 66 66 65  }..    fts5Buffe
260c0 72 53 65 74 28 26 70 2d 3e 72 63 2c 20 70 31 2c  rSet(&p->rc, p1,
260d0 20 6f 75 74 2e 6e 2c 20 6f 75 74 2e 70 29 3b 0a   out.n, out.p);.
260e0 20 20 20 20 66 74 73 35 42 75 66 66 65 72 46 72      fts5BufferFr
260f0 65 65 28 26 74 6d 70 29 3b 0a 20 20 20 20 66 74  ee(&tmp);.    ft
26100 73 35 42 75 66 66 65 72 46 72 65 65 28 26 6f 75  s5BufferFree(&ou
26110 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69  t);.  }.}..stati
26120 63 20 76 6f 69 64 20 66 74 73 35 53 65 74 75 70  c void fts5Setup
26130 50 72 65 66 69 78 49 74 65 72 28 0a 20 20 46 74  PrefixIter(.  Ft
26140 73 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20  s5Index *p,     
26150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
26160 20 49 6e 64 65 78 20 74 6f 20 72 65 61 64 20 66   Index to read f
26170 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20 62 44 65  rom */.  int bDe
26180 73 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  sc,             
26190 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
261a0 20 66 6f 72 20 22 4f 52 44 45 52 20 42 59 20 72   for "ORDER BY r
261b0 6f 77 69 64 20 44 45 53 43 22 20 2a 2f 0a 20 20  owid DESC" */.  
261c0 63 6f 6e 73 74 20 75 38 20 2a 70 54 6f 6b 65 6e  const u8 *pToken
261d0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
261e0 2f 2a 20 42 75 66 66 65 72 20 63 6f 6e 74 61 69  /* Buffer contai
261f0 6e 69 6e 67 20 70 72 65 66 69 78 20 74 6f 20 6d  ning prefix to m
26200 61 74 63 68 20 2a 2f 0a 20 20 69 6e 74 20 6e 54  atch */.  int nT
26210 6f 6b 65 6e 2c 20 20 20 20 20 20 20 20 20 20 20  oken,           
26220 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
26230 65 20 6f 66 20 62 75 66 66 65 72 20 70 54 6f 6b  e of buffer pTok
26240 65 6e 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20  en in bytes */. 
26250 20 46 74 73 35 43 6f 6c 73 65 74 20 2a 70 43 6f   Fts5Colset *pCo
26260 6c 73 65 74 2c 20 20 20 20 20 20 20 20 20 20 20  lset,           
26270 20 2f 2a 20 52 65 73 74 72 69 63 74 20 6d 61 74   /* Restrict mat
26280 63 68 65 73 20 74 6f 20 74 68 65 73 65 20 63 6f  ches to these co
26290 6c 75 6d 6e 73 20 2a 2f 0a 20 20 46 74 73 35 49  lumns */.  Fts5I
262a0 74 65 72 20 2a 2a 70 70 49 74 65 72 20 20 20 20  ter **ppIter    
262b0 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 4e 65        /* OUT: Ne
262c0 77 20 69 74 65 72 61 74 6f 72 20 2a 2f 0a 29 7b  w iterator */.){
262d0 0a 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65  .  Fts5Structure
262e0 20 2a 70 53 74 72 75 63 74 3b 0a 20 20 46 74 73   *pStruct;.  Fts
262f0 35 42 75 66 66 65 72 20 2a 61 42 75 66 3b 0a 20  5Buffer *aBuf;. 
26300 20 63 6f 6e 73 74 20 69 6e 74 20 6e 42 75 66 20   const int nBuf 
26310 3d 20 33 32 3b 0a 0a 20 20 76 6f 69 64 20 28 2a  = 32;..  void (*
26320 78 4d 65 72 67 65 29 28 46 74 73 35 49 6e 64 65  xMerge)(Fts5Inde
26330 78 2a 2c 20 46 74 73 35 42 75 66 66 65 72 2a 2c  x*, Fts5Buffer*,
26340 20 46 74 73 35 42 75 66 66 65 72 2a 29 3b 0a 20   Fts5Buffer*);. 
26350 20 76 6f 69 64 20 28 2a 78 41 70 70 65 6e 64 29   void (*xAppend)
26360 28 46 74 73 35 49 6e 64 65 78 2a 2c 20 69 36 34  (Fts5Index*, i64
26370 2c 20 46 74 73 35 49 74 65 72 2a 2c 20 46 74 73  , Fts5Iter*, Fts
26380 35 42 75 66 66 65 72 2a 29 3b 0a 20 20 69 66 28  5Buffer*);.  if(
26390 20 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e 65 44 65   p->pConfig->eDe
263a0 74 61 69 6c 3d 3d 46 54 53 35 5f 44 45 54 41 49  tail==FTS5_DETAI
263b0 4c 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 78 4d  L_NONE ){.    xM
263c0 65 72 67 65 20 3d 20 66 74 73 35 4d 65 72 67 65  erge = fts5Merge
263d0 52 6f 77 69 64 4c 69 73 74 73 3b 0a 20 20 20 20  RowidLists;.    
263e0 78 41 70 70 65 6e 64 20 3d 20 66 74 73 35 41 70  xAppend = fts5Ap
263f0 70 65 6e 64 52 6f 77 69 64 3b 0a 20 20 7d 65 6c  pendRowid;.  }el
26400 73 65 7b 0a 20 20 20 20 78 4d 65 72 67 65 20 3d  se{.    xMerge =
26410 20 66 74 73 35 4d 65 72 67 65 50 72 65 66 69 78   fts5MergePrefix
26420 4c 69 73 74 73 3b 0a 20 20 20 20 78 41 70 70 65  Lists;.    xAppe
26430 6e 64 20 3d 20 66 74 73 35 41 70 70 65 6e 64 50  nd = fts5AppendP
26440 6f 73 6c 69 73 74 3b 0a 20 20 7d 0a 0a 20 20 61  oslist;.  }..  a
26450 42 75 66 20 3d 20 28 46 74 73 35 42 75 66 66 65  Buf = (Fts5Buffe
26460 72 2a 29 66 74 73 35 49 64 78 4d 61 6c 6c 6f 63  r*)fts5IdxMalloc
26470 28 70 2c 20 73 69 7a 65 6f 66 28 46 74 73 35 42  (p, sizeof(Fts5B
26480 75 66 66 65 72 29 2a 6e 42 75 66 29 3b 0a 20 20  uffer)*nBuf);.  
26490 70 53 74 72 75 63 74 20 3d 20 66 74 73 35 53 74  pStruct = fts5St
264a0 72 75 63 74 75 72 65 52 65 61 64 28 70 29 3b 0a  ructureRead(p);.
264b0 0a 20 20 69 66 28 20 61 42 75 66 20 26 26 20 70  .  if( aBuf && p
264c0 53 74 72 75 63 74 20 29 7b 0a 20 20 20 20 63 6f  Struct ){.    co
264d0 6e 73 74 20 69 6e 74 20 66 6c 61 67 73 20 3d 20  nst int flags = 
264e0 46 54 53 35 49 4e 44 45 58 5f 51 55 45 52 59 5f  FTS5INDEX_QUERY_
264f0 53 43 41 4e 20 0a 20 20 20 20 20 20 20 20 20 20  SCAN .          
26500 20 20 20 20 20 20 20 20 20 20 7c 20 46 54 53 35            | FTS5
26510 49 4e 44 45 58 5f 51 55 45 52 59 5f 53 4b 49 50  INDEX_QUERY_SKIP
26520 45 4d 50 54 59 20 0a 20 20 20 20 20 20 20 20 20  EMPTY .         
26530 20 20 20 20 20 20 20 20 20 20 20 7c 20 46 54 53             | FTS
26540 35 49 4e 44 45 58 5f 51 55 45 52 59 5f 4e 4f 4f  5INDEX_QUERY_NOO
26550 55 54 50 55 54 3b 0a 20 20 20 20 69 6e 74 20 69  UTPUT;.    int i
26560 3b 0a 20 20 20 20 69 36 34 20 69 4c 61 73 74 52  ;.    i64 iLastR
26570 6f 77 69 64 20 3d 20 30 3b 0a 20 20 20 20 46 74  owid = 0;.    Ft
26580 73 35 49 74 65 72 20 2a 70 31 20 3d 20 30 3b 20  s5Iter *p1 = 0; 
26590 20 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20      /* Iterator 
265a0 75 73 65 64 20 74 6f 20 67 61 74 68 65 72 20 64  used to gather d
265b0 61 74 61 20 66 72 6f 6d 20 69 6e 64 65 78 20 2a  ata from index *
265c0 2f 0a 20 20 20 20 46 74 73 35 44 61 74 61 20 2a  /.    Fts5Data *
265d0 70 44 61 74 61 3b 0a 20 20 20 20 46 74 73 35 42  pData;.    Fts5B
265e0 75 66 66 65 72 20 64 6f 63 6c 69 73 74 3b 0a 20  uffer doclist;. 
265f0 20 20 20 69 6e 74 20 62 4e 65 77 54 65 72 6d 20     int bNewTerm 
26600 3d 20 31 3b 0a 0a 20 20 20 20 6d 65 6d 73 65 74  = 1;..    memset
26610 28 26 64 6f 63 6c 69 73 74 2c 20 30 2c 20 73 69  (&doclist, 0, si
26620 7a 65 6f 66 28 64 6f 63 6c 69 73 74 29 29 3b 0a  zeof(doclist));.
26630 20 20 20 20 66 74 73 35 4d 75 6c 74 69 49 74 65      fts5MultiIte
26640 72 4e 65 77 28 70 2c 20 70 53 74 72 75 63 74 2c  rNew(p, pStruct,
26650 20 66 6c 61 67 73 2c 20 70 43 6f 6c 73 65 74 2c   flags, pColset,
26660 20 70 54 6f 6b 65 6e 2c 20 6e 54 6f 6b 65 6e 2c   pToken, nToken,
26670 20 2d 31 2c 20 30 2c 20 26 70 31 29 3b 0a 20 20   -1, 0, &p1);.  
26680 20 20 66 74 73 35 49 74 65 72 53 65 74 4f 75 74    fts5IterSetOut
26690 70 75 74 43 62 28 26 70 2d 3e 72 63 2c 20 70 31  putCb(&p->rc, p1
266a0 29 3b 0a 20 20 20 20 66 6f 72 28 20 2f 2a 20 6e  );.    for( /* n
266b0 6f 2d 6f 70 20 2a 2f 20 3b 0a 20 20 20 20 20 20  o-op */ ;.      
266c0 20 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 45    fts5MultiIterE
266d0 6f 66 28 70 2c 20 70 31 29 3d 3d 30 3b 0a 20 20  of(p, p1)==0;.  
266e0 20 20 20 20 20 20 66 74 73 35 4d 75 6c 74 69 49        fts5MultiI
266f0 74 65 72 4e 65 78 74 32 28 70 2c 20 70 31 2c 20  terNext2(p, p1, 
26700 26 62 4e 65 77 54 65 72 6d 29 0a 20 20 20 20 29  &bNewTerm).    )
26710 7b 0a 20 20 20 20 20 20 46 74 73 35 53 65 67 49  {.      Fts5SegI
26720 74 65 72 20 2a 70 53 65 67 20 3d 20 26 70 31 2d  ter *pSeg = &p1-
26730 3e 61 53 65 67 5b 20 70 31 2d 3e 61 46 69 72 73  >aSeg[ p1->aFirs
26740 74 5b 31 5d 2e 69 46 69 72 73 74 20 5d 3b 0a 20  t[1].iFirst ];. 
26750 20 20 20 20 20 69 6e 74 20 6e 54 65 72 6d 20 3d       int nTerm =
26760 20 70 53 65 67 2d 3e 74 65 72 6d 2e 6e 3b 0a 20   pSeg->term.n;. 
26770 20 20 20 20 20 63 6f 6e 73 74 20 75 38 20 2a 70       const u8 *p
26780 54 65 72 6d 20 3d 20 70 53 65 67 2d 3e 74 65 72  Term = pSeg->ter
26790 6d 2e 70 3b 0a 20 20 20 20 20 20 70 31 2d 3e 78  m.p;.      p1->x
267a0 53 65 74 4f 75 74 70 75 74 73 28 70 31 2c 20 70  SetOutputs(p1, p
267b0 53 65 67 29 3b 0a 0a 20 20 20 20 20 20 61 73 73  Seg);..      ass
267c0 65 72 74 5f 6e 63 28 20 6d 65 6d 63 6d 70 28 70  ert_nc( memcmp(p
267d0 54 6f 6b 65 6e 2c 20 70 54 65 72 6d 2c 20 4d 49  Token, pTerm, MI
267e0 4e 28 6e 54 6f 6b 65 6e 2c 20 6e 54 65 72 6d 29  N(nToken, nTerm)
267f0 29 3c 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66  )<=0 );.      if
26800 28 20 62 4e 65 77 54 65 72 6d 20 29 7b 0a 20 20  ( bNewTerm ){.  
26810 20 20 20 20 20 20 69 66 28 20 6e 54 65 72 6d 3c        if( nTerm<
26820 6e 54 6f 6b 65 6e 20 7c 7c 20 6d 65 6d 63 6d 70  nToken || memcmp
26830 28 70 54 6f 6b 65 6e 2c 20 70 54 65 72 6d 2c 20  (pToken, pTerm, 
26840 6e 54 6f 6b 65 6e 29 20 29 20 62 72 65 61 6b 3b  nToken) ) break;
26850 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
26860 69 66 28 20 70 31 2d 3e 62 61 73 65 2e 6e 44 61  if( p1->base.nDa
26870 74 61 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65  ta==0 ) continue
26880 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 70 31 2d  ;..      if( p1-
26890 3e 62 61 73 65 2e 69 52 6f 77 69 64 3c 3d 69 4c  >base.iRowid<=iL
268a0 61 73 74 52 6f 77 69 64 20 26 26 20 64 6f 63 6c  astRowid && docl
268b0 69 73 74 2e 6e 3e 30 20 29 7b 0a 20 20 20 20 20  ist.n>0 ){.     
268c0 20 20 20 66 6f 72 28 69 3d 30 3b 20 70 2d 3e 72     for(i=0; p->r
268d0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
268e0 64 6f 63 6c 69 73 74 2e 6e 3b 20 69 2b 2b 29 7b  doclist.n; i++){
268f0 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
26900 74 28 20 69 3c 6e 42 75 66 20 29 3b 0a 20 20 20  t( i<nBuf );.   
26910 20 20 20 20 20 20 20 69 66 28 20 61 42 75 66 5b         if( aBuf[
26920 69 5d 2e 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20  i].n==0 ){.     
26930 20 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65         fts5Buffe
26940 72 53 77 61 70 28 26 64 6f 63 6c 69 73 74 2c 20  rSwap(&doclist, 
26950 26 61 42 75 66 5b 69 5d 29 3b 0a 20 20 20 20 20  &aBuf[i]);.     
26960 20 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65         fts5Buffe
26970 72 5a 65 72 6f 28 26 64 6f 63 6c 69 73 74 29 3b  rZero(&doclist);
26980 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65  .          }else
26990 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 78 4d  {.            xM
269a0 65 72 67 65 28 70 2c 20 26 64 6f 63 6c 69 73 74  erge(p, &doclist
269b0 2c 20 26 61 42 75 66 5b 69 5d 29 3b 0a 20 20 20  , &aBuf[i]);.   
269c0 20 20 20 20 20 20 20 20 20 66 74 73 35 42 75 66           fts5Buf
269d0 66 65 72 5a 65 72 6f 28 26 61 42 75 66 5b 69 5d  ferZero(&aBuf[i]
269e0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
269f0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
26a00 20 69 4c 61 73 74 52 6f 77 69 64 20 3d 20 30 3b   iLastRowid = 0;
26a10 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
26a20 78 41 70 70 65 6e 64 28 70 2c 20 70 31 2d 3e 62  xAppend(p, p1->b
26a30 61 73 65 2e 69 52 6f 77 69 64 2d 69 4c 61 73 74  ase.iRowid-iLast
26a40 52 6f 77 69 64 2c 20 70 31 2c 20 26 64 6f 63 6c  Rowid, p1, &docl
26a50 69 73 74 29 3b 0a 20 20 20 20 20 20 69 4c 61 73  ist);.      iLas
26a60 74 52 6f 77 69 64 20 3d 20 70 31 2d 3e 62 61 73  tRowid = p1->bas
26a70 65 2e 69 52 6f 77 69 64 3b 0a 20 20 20 20 7d 0a  e.iRowid;.    }.
26a80 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
26a90 6e 42 75 66 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nBuf; i++){.    
26aa0 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c    if( p->rc==SQL
26ab0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
26ac0 20 20 78 4d 65 72 67 65 28 70 2c 20 26 64 6f 63    xMerge(p, &doc
26ad0 6c 69 73 74 2c 20 26 61 42 75 66 5b 69 5d 29 3b  list, &aBuf[i]);
26ae0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66  .      }.      f
26af0 74 73 35 42 75 66 66 65 72 46 72 65 65 28 26 61  ts5BufferFree(&a
26b00 42 75 66 5b 69 5d 29 3b 0a 20 20 20 20 7d 0a 20  Buf[i]);.    }. 
26b10 20 20 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72     fts5MultiIter
26b20 46 72 65 65 28 70 31 29 3b 0a 0a 20 20 20 20 70  Free(p1);..    p
26b30 44 61 74 61 20 3d 20 66 74 73 35 49 64 78 4d 61  Data = fts5IdxMa
26b40 6c 6c 6f 63 28 70 2c 20 73 69 7a 65 6f 66 28 46  lloc(p, sizeof(F
26b50 74 73 35 44 61 74 61 29 20 2b 20 64 6f 63 6c 69  ts5Data) + docli
26b60 73 74 2e 6e 29 3b 0a 20 20 20 20 69 66 28 20 70  st.n);.    if( p
26b70 44 61 74 61 20 29 7b 0a 20 20 20 20 20 20 70 44  Data ){.      pD
26b80 61 74 61 2d 3e 70 20 3d 20 28 75 38 2a 29 26 70  ata->p = (u8*)&p
26b90 44 61 74 61 5b 31 5d 3b 0a 20 20 20 20 20 20 70  Data[1];.      p
26ba0 44 61 74 61 2d 3e 6e 6e 20 3d 20 70 44 61 74 61  Data->nn = pData
26bb0 2d 3e 73 7a 4c 65 61 66 20 3d 20 64 6f 63 6c 69  ->szLeaf = docli
26bc0 73 74 2e 6e 3b 0a 20 20 20 20 20 20 6d 65 6d 63  st.n;.      memc
26bd0 70 79 28 70 44 61 74 61 2d 3e 70 2c 20 64 6f 63  py(pData->p, doc
26be0 6c 69 73 74 2e 70 2c 20 64 6f 63 6c 69 73 74 2e  list.p, doclist.
26bf0 6e 29 3b 0a 20 20 20 20 20 20 66 74 73 35 4d 75  n);.      fts5Mu
26c00 6c 74 69 49 74 65 72 4e 65 77 32 28 70 2c 20 70  ltiIterNew2(p, p
26c10 44 61 74 61 2c 20 62 44 65 73 63 2c 20 70 70 49  Data, bDesc, ppI
26c20 74 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ter);.    }.    
26c30 66 74 73 35 42 75 66 66 65 72 46 72 65 65 28 26  fts5BufferFree(&
26c40 64 6f 63 6c 69 73 74 29 3b 0a 20 20 7d 0a 0a 20  doclist);.  }.. 
26c50 20 66 74 73 35 53 74 72 75 63 74 75 72 65 52 65   fts5StructureRe
26c60 6c 65 61 73 65 28 70 53 74 72 75 63 74 29 3b 0a  lease(pStruct);.
26c70 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 61    sqlite3_free(a
26c80 42 75 66 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  Buf);.}.../*.** 
26c90 49 6e 64 69 63 61 74 65 20 74 68 61 74 20 61 6c  Indicate that al
26ca0 6c 20 73 75 62 73 65 71 75 65 6e 74 20 63 61 6c  l subsequent cal
26cb0 6c 73 20 74 6f 20 73 71 6c 69 74 65 33 46 74 73  ls to sqlite3Fts
26cc0 35 49 6e 64 65 78 57 72 69 74 65 28 29 20 70 65  5IndexWrite() pe
26cd0 72 74 61 69 6e 0a 2a 2a 20 74 6f 20 74 68 65 20  rtain.** to the 
26ce0 64 6f 63 75 6d 65 6e 74 20 77 69 74 68 20 72 6f  document with ro
26cf0 77 69 64 20 69 52 6f 77 69 64 2e 0a 2a 2f 0a 69  wid iRowid..*/.i
26d00 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e  nt sqlite3Fts5In
26d10 64 65 78 42 65 67 69 6e 57 72 69 74 65 28 46 74  dexBeginWrite(Ft
26d20 73 35 49 6e 64 65 78 20 2a 70 2c 20 69 6e 74 20  s5Index *p, int 
26d30 62 44 65 6c 65 74 65 2c 20 69 36 34 20 69 52 6f  bDelete, i64 iRo
26d40 77 69 64 29 7b 0a 20 20 61 73 73 65 72 74 28 20  wid){.  assert( 
26d50 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
26d60 20 29 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61   );..  /* Alloca
26d70 74 65 20 74 68 65 20 68 61 73 68 20 74 61 62 6c  te the hash tabl
26d80 65 20 69 66 20 69 74 20 68 61 73 20 6e 6f 74 20  e if it has not 
26d90 61 6c 72 65 61 64 79 20 62 65 65 6e 20 61 6c 6c  already been all
26da0 6f 63 61 74 65 64 20 2a 2f 0a 20 20 69 66 28 20  ocated */.  if( 
26db0 70 2d 3e 70 48 61 73 68 3d 3d 30 20 29 7b 0a 20  p->pHash==0 ){. 
26dc0 20 20 20 70 2d 3e 72 63 20 3d 20 73 71 6c 69 74     p->rc = sqlit
26dd0 65 33 46 74 73 35 48 61 73 68 4e 65 77 28 70 2d  e3Fts5HashNew(p-
26de0 3e 70 43 6f 6e 66 69 67 2c 20 26 70 2d 3e 70 48  >pConfig, &p->pH
26df0 61 73 68 2c 20 26 70 2d 3e 6e 50 65 6e 64 69 6e  ash, &p->nPendin
26e00 67 44 61 74 61 29 3b 0a 20 20 7d 0a 0a 20 20 2f  gData);.  }..  /
26e10 2a 20 46 6c 75 73 68 20 74 68 65 20 68 61 73 68  * Flush the hash
26e20 20 74 61 62 6c 65 20 74 6f 20 64 69 73 6b 20 69   table to disk i
26e30 66 20 72 65 71 75 69 72 65 64 20 2a 2f 0a 20 20  f required */.  
26e40 69 66 28 20 69 52 6f 77 69 64 3c 70 2d 3e 69 57  if( iRowid<p->iW
26e50 72 69 74 65 52 6f 77 69 64 20 0a 20 20 20 7c 7c  riteRowid .   ||
26e60 20 28 69 52 6f 77 69 64 3d 3d 70 2d 3e 69 57 72   (iRowid==p->iWr
26e70 69 74 65 52 6f 77 69 64 20 26 26 20 70 2d 3e 62  iteRowid && p->b
26e80 44 65 6c 65 74 65 3d 3d 30 29 0a 20 20 20 7c 7c  Delete==0).   ||
26e90 20 28 70 2d 3e 6e 50 65 6e 64 69 6e 67 44 61 74   (p->nPendingDat
26ea0 61 20 3e 20 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e  a > p->pConfig->
26eb0 6e 48 61 73 68 53 69 7a 65 29 20 0a 20 20 29 7b  nHashSize) .  ){
26ec0 0a 20 20 20 20 66 74 73 35 49 6e 64 65 78 46 6c  .    fts5IndexFl
26ed0 75 73 68 28 70 29 3b 0a 20 20 7d 0a 0a 20 20 70  ush(p);.  }..  p
26ee0 2d 3e 69 57 72 69 74 65 52 6f 77 69 64 20 3d 20  ->iWriteRowid = 
26ef0 69 52 6f 77 69 64 3b 0a 20 20 70 2d 3e 62 44 65  iRowid;.  p->bDe
26f00 6c 65 74 65 20 3d 20 62 44 65 6c 65 74 65 3b 0a  lete = bDelete;.
26f10 20 20 72 65 74 75 72 6e 20 66 74 73 35 49 6e 64    return fts5Ind
26f20 65 78 52 65 74 75 72 6e 28 70 29 3b 0a 7d 0a 0a  exReturn(p);.}..
26f30 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69 74 20 64 61 74  /*.** Commit dat
26f40 61 20 74 6f 20 64 69 73 6b 2e 0a 2a 2f 0a 69 6e  a to disk..*/.in
26f50 74 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64  t sqlite3Fts5Ind
26f60 65 78 53 79 6e 63 28 46 74 73 35 49 6e 64 65 78  exSync(Fts5Index
26f70 20 2a 70 2c 20 69 6e 74 20 62 43 6f 6d 6d 69 74   *p, int bCommit
26f80 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  ){.  assert( p->
26f90 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  rc==SQLITE_OK );
26fa0 0a 20 20 66 74 73 35 49 6e 64 65 78 46 6c 75 73  .  fts5IndexFlus
26fb0 68 28 70 29 3b 0a 20 20 69 66 28 20 62 43 6f 6d  h(p);.  if( bCom
26fc0 6d 69 74 20 29 20 66 74 73 35 43 6c 6f 73 65 52  mit ) fts5CloseR
26fd0 65 61 64 65 72 28 70 29 3b 0a 20 20 72 65 74 75  eader(p);.  retu
26fe0 72 6e 20 66 74 73 35 49 6e 64 65 78 52 65 74 75  rn fts5IndexRetu
26ff0 72 6e 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn(p);.}../*.** 
27000 44 69 73 63 61 72 64 20 61 6e 79 20 64 61 74 61  Discard any data
27010 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 69   stored in the i
27020 6e 2d 6d 65 6d 6f 72 79 20 68 61 73 68 20 74 61  n-memory hash ta
27030 62 6c 65 73 2e 20 44 6f 20 6e 6f 74 20 77 72 69  bles. Do not wri
27040 74 65 20 69 74 0a 2a 2a 20 74 6f 20 74 68 65 20  te it.** to the 
27050 64 61 74 61 62 61 73 65 2e 20 41 64 64 69 74 69  database. Additi
27060 6f 6e 61 6c 6c 79 2c 20 61 73 73 75 6d 65 20 74  onally, assume t
27070 68 61 74 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  hat the contents
27080 20 6f 66 20 74 68 65 20 25 5f 64 61 74 61 0a 2a   of the %_data.*
27090 2a 20 74 61 62 6c 65 20 6d 61 79 20 68 61 76 65  * table may have
270a0 20 63 68 61 6e 67 65 64 20 6f 6e 20 64 69 73 6b   changed on disk
270b0 2e 20 53 6f 20 61 6e 79 20 69 6e 2d 6d 65 6d 6f  . So any in-memo
270c0 72 79 20 63 61 63 68 65 73 20 6f 66 20 25 5f 64  ry caches of %_d
270d0 61 74 61 20 0a 2a 2a 20 72 65 63 6f 72 64 73 20  ata .** records 
270e0 6d 75 73 74 20 62 65 20 69 6e 76 61 6c 69 64 61  must be invalida
270f0 74 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ted..*/.int sqli
27100 74 65 33 46 74 73 35 49 6e 64 65 78 52 6f 6c 6c  te3Fts5IndexRoll
27110 62 61 63 6b 28 46 74 73 35 49 6e 64 65 78 20 2a  back(Fts5Index *
27120 70 29 7b 0a 20 20 66 74 73 35 43 6c 6f 73 65 52  p){.  fts5CloseR
27130 65 61 64 65 72 28 70 29 3b 0a 20 20 66 74 73 35  eader(p);.  fts5
27140 49 6e 64 65 78 44 69 73 63 61 72 64 44 61 74 61  IndexDiscardData
27150 28 70 29 3b 0a 20 20 66 74 73 35 53 74 72 75 63  (p);.  fts5Struc
27160 74 75 72 65 49 6e 76 61 6c 69 64 61 74 65 28 70  tureInvalidate(p
27170 29 3b 0a 20 20 2f 2a 20 61 73 73 65 72 74 28 20  );.  /* assert( 
27180 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
27190 20 29 3b 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20   ); */.  return 
271a0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
271b0 0a 2a 2a 20 54 68 65 20 25 5f 64 61 74 61 20 74  .** The %_data t
271c0 61 62 6c 65 20 69 73 20 63 6f 6d 70 6c 65 74 65  able is complete
271d0 6c 79 20 65 6d 70 74 79 20 77 68 65 6e 20 74 68  ly empty when th
271e0 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
271f0 61 6c 6c 65 64 2e 20 54 68 69 73 0a 2a 2a 20 66  alled. This.** f
27200 75 6e 63 74 69 6f 6e 20 70 6f 70 75 6c 61 74 65  unction populate
27210 73 20 69 74 20 77 69 74 68 20 74 68 65 20 69 6e  s it with the in
27220 69 74 69 61 6c 20 73 74 72 75 63 74 75 72 65 20  itial structure 
27230 6f 62 6a 65 63 74 73 20 66 6f 72 20 65 61 63 68  objects for each
27240 20 69 6e 64 65 78 2c 0a 2a 2a 20 61 6e 64 20 74   index,.** and t
27250 68 65 20 69 6e 69 74 69 61 6c 20 76 65 72 73 69  he initial versi
27260 6f 6e 20 6f 66 20 74 68 65 20 22 61 76 65 72 61  on of the "avera
27270 67 65 73 22 20 72 65 63 6f 72 64 20 28 61 20 7a  ges" record (a z
27280 65 72 6f 2d 62 79 74 65 20 62 6c 6f 62 29 2e 0a  ero-byte blob)..
27290 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74  */.int sqlite3Ft
272a0 73 35 49 6e 64 65 78 52 65 69 6e 69 74 28 46 74  s5IndexReinit(Ft
272b0 73 35 49 6e 64 65 78 20 2a 70 29 7b 0a 20 20 46  s5Index *p){.  F
272c0 74 73 35 53 74 72 75 63 74 75 72 65 20 73 3b 0a  ts5Structure s;.
272d0 20 20 66 74 73 35 53 74 72 75 63 74 75 72 65 49    fts5StructureI
272e0 6e 76 61 6c 69 64 61 74 65 28 70 29 3b 0a 20 20  nvalidate(p);.  
272f0 6d 65 6d 73 65 74 28 26 73 2c 20 30 2c 20 73 69  memset(&s, 0, si
27300 7a 65 6f 66 28 46 74 73 35 53 74 72 75 63 74 75  zeof(Fts5Structu
27310 72 65 29 29 3b 0a 20 20 66 74 73 35 44 61 74 61  re));.  fts5Data
27320 57 72 69 74 65 28 70 2c 20 46 54 53 35 5f 41 56  Write(p, FTS5_AV
27330 45 52 41 47 45 53 5f 52 4f 57 49 44 2c 20 28 63  ERAGES_ROWID, (c
27340 6f 6e 73 74 20 75 38 2a 29 22 22 2c 20 30 29 3b  onst u8*)"", 0);
27350 0a 20 20 66 74 73 35 53 74 72 75 63 74 75 72 65  .  fts5Structure
27360 57 72 69 74 65 28 70 2c 20 26 73 29 3b 0a 20 20  Write(p, &s);.  
27370 72 65 74 75 72 6e 20 66 74 73 35 49 6e 64 65 78  return fts5Index
27380 52 65 74 75 72 6e 28 70 29 3b 0a 7d 0a 0a 2f 2a  Return(p);.}../*
27390 0a 2a 2a 20 4f 70 65 6e 20 61 20 6e 65 77 20 46  .** Open a new F
273a0 74 73 35 49 6e 64 65 78 20 68 61 6e 64 6c 65 2e  ts5Index handle.
273b0 20 49 66 20 74 68 65 20 62 43 72 65 61 74 65 20   If the bCreate 
273c0 61 72 67 75 6d 65 6e 74 20 69 73 20 74 72 75 65  argument is true
273d0 2c 20 63 72 65 61 74 65 0a 2a 2a 20 61 6e 64 20  , create.** and 
273e0 69 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 75  initialize the u
273f0 6e 64 65 72 6c 79 69 6e 67 20 25 5f 64 61 74 61  nderlying %_data
27400 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66   table..**.** If
27410 20 73 75 63 63 65 73 73 66 75 6c 2c 20 73 65 74   successful, set
27420 20 2a 70 70 20 74 6f 20 70 6f 69 6e 74 20 74 6f   *pp to point to
27430 20 74 68 65 20 6e 65 77 20 6f 62 6a 65 63 74 20   the new object 
27440 61 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54  and return SQLIT
27450 45 5f 4f 4b 2e 0a 2a 2a 20 4f 74 68 65 72 77 69  E_OK..** Otherwi
27460 73 65 2c 20 73 65 74 20 2a 70 70 20 74 6f 20 4e  se, set *pp to N
27470 55 4c 4c 20 61 6e 64 20 72 65 74 75 72 6e 20 61  ULL and return a
27480 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63  n SQLite error c
27490 6f 64 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ode..*/.int sqli
274a0 74 65 33 46 74 73 35 49 6e 64 65 78 4f 70 65 6e  te3Fts5IndexOpen
274b0 28 0a 20 20 46 74 73 35 43 6f 6e 66 69 67 20 2a  (.  Fts5Config *
274c0 70 43 6f 6e 66 69 67 2c 20 0a 20 20 69 6e 74 20  pConfig, .  int 
274d0 62 43 72 65 61 74 65 2c 20 0a 20 20 46 74 73 35  bCreate, .  Fts5
274e0 49 6e 64 65 78 20 2a 2a 70 70 2c 0a 20 20 63 68  Index **pp,.  ch
274f0 61 72 20 2a 2a 70 7a 45 72 72 0a 29 7b 0a 20 20  ar **pzErr.){.  
27500 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
27510 4f 4b 3b 0a 20 20 46 74 73 35 49 6e 64 65 78 20  OK;.  Fts5Index 
27520 2a 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  *p;             
27530 20 20 20 20 20 20 2f 2a 20 4e 65 77 20 6f 62 6a        /* New obj
27540 65 63 74 20 2a 2f 0a 0a 20 20 2a 70 70 20 3d 20  ect */..  *pp = 
27550 70 20 3d 20 28 46 74 73 35 49 6e 64 65 78 2a 29  p = (Fts5Index*)
27560 73 71 6c 69 74 65 33 46 74 73 35 4d 61 6c 6c 6f  sqlite3Fts5Mallo
27570 63 5a 65 72 6f 28 26 72 63 2c 20 73 69 7a 65 6f  cZero(&rc, sizeo
27580 66 28 46 74 73 35 49 6e 64 65 78 29 29 3b 0a 20  f(Fts5Index));. 
27590 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
275a0 4f 4b 20 29 7b 0a 20 20 20 20 70 2d 3e 70 43 6f  OK ){.    p->pCo
275b0 6e 66 69 67 20 3d 20 70 43 6f 6e 66 69 67 3b 0a  nfig = pConfig;.
275c0 20 20 20 20 70 2d 3e 6e 57 6f 72 6b 55 6e 69 74      p->nWorkUnit
275d0 20 3d 20 46 54 53 35 5f 57 4f 52 4b 5f 55 4e 49   = FTS5_WORK_UNI
275e0 54 3b 0a 20 20 20 20 70 2d 3e 7a 44 61 74 61 54  T;.    p->zDataT
275f0 62 6c 20 3d 20 73 71 6c 69 74 65 33 46 74 73 35  bl = sqlite3Fts5
27600 4d 70 72 69 6e 74 66 28 26 72 63 2c 20 22 25 73  Mprintf(&rc, "%s
27610 5f 64 61 74 61 22 2c 20 70 43 6f 6e 66 69 67 2d  _data", pConfig-
27620 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28  >zName);.    if(
27630 20 70 2d 3e 7a 44 61 74 61 54 62 6c 20 26 26 20   p->zDataTbl && 
27640 62 43 72 65 61 74 65 20 29 7b 0a 20 20 20 20 20  bCreate ){.     
27650 20 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74 73   rc = sqlite3Fts
27660 35 43 72 65 61 74 65 54 61 62 6c 65 28 0a 20 20  5CreateTable(.  
27670 20 20 20 20 20 20 20 20 70 43 6f 6e 66 69 67 2c          pConfig,
27680 20 22 64 61 74 61 22 2c 20 22 69 64 20 49 4e 54   "data", "id INT
27690 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59  EGER PRIMARY KEY
276a0 2c 20 62 6c 6f 63 6b 20 42 4c 4f 42 22 2c 20 30  , block BLOB", 0
276b0 2c 20 70 7a 45 72 72 0a 20 20 20 20 20 20 29 3b  , pzErr.      );
276c0 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
276d0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
276e0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
276f0 46 74 73 35 43 72 65 61 74 65 54 61 62 6c 65 28  Fts5CreateTable(
27700 70 43 6f 6e 66 69 67 2c 20 22 69 64 78 22 2c 20  pConfig, "idx", 
27710 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 73 65  .            "se
27720 67 69 64 2c 20 74 65 72 6d 2c 20 70 67 6e 6f 2c  gid, term, pgno,
27730 20 50 52 49 4d 41 52 59 20 4b 45 59 28 73 65 67   PRIMARY KEY(seg
27740 69 64 2c 20 74 65 72 6d 29 22 2c 20 0a 20 20 20  id, term)", .   
27750 20 20 20 20 20 20 20 20 20 31 2c 20 70 7a 45 72           1, pzEr
27760 72 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20  r.        );.   
27770 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72     }.      if( r
27780 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
27790 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
277a0 69 74 65 33 46 74 73 35 49 6e 64 65 78 52 65 69  ite3Fts5IndexRei
277b0 6e 69 74 28 70 29 3b 0a 20 20 20 20 20 20 7d 0a  nit(p);.      }.
277c0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 61 73 73      }.  }..  ass
277d0 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f  ert( rc!=SQLITE_
277e0 4f 4b 20 7c 7c 20 70 2d 3e 72 63 3d 3d 53 51 4c  OK || p->rc==SQL
277f0 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 69 66 28 20  ITE_OK );.  if( 
27800 72 63 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  rc ){.    sqlite
27810 33 46 74 73 35 49 6e 64 65 78 43 6c 6f 73 65 28  3Fts5IndexClose(
27820 70 29 3b 0a 20 20 20 20 2a 70 70 20 3d 20 30 3b  p);.    *pp = 0;
27830 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
27840 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65  ;.}../*.** Close
27850 20 61 20 68 61 6e 64 6c 65 20 6f 70 65 6e 65 64   a handle opened
27860 20 62 79 20 61 6e 20 65 61 72 6c 69 65 72 20 63   by an earlier c
27870 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 46 74  all to sqlite3Ft
27880 73 35 49 6e 64 65 78 4f 70 65 6e 28 29 2e 0a 2a  s5IndexOpen()..*
27890 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73  /.int sqlite3Fts
278a0 35 49 6e 64 65 78 43 6c 6f 73 65 28 46 74 73 35  5IndexClose(Fts5
278b0 49 6e 64 65 78 20 2a 70 29 7b 0a 20 20 69 6e 74  Index *p){.  int
278c0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
278d0 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20  .  if( p ){.    
278e0 61 73 73 65 72 74 28 20 70 2d 3e 70 52 65 61 64  assert( p->pRead
278f0 65 72 3d 3d 30 20 29 3b 0a 20 20 20 20 66 74 73  er==0 );.    fts
27900 35 53 74 72 75 63 74 75 72 65 49 6e 76 61 6c 69  5StructureInvali
27910 64 61 74 65 28 70 29 3b 0a 20 20 20 20 73 71 6c  date(p);.    sql
27920 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 2d  ite3_finalize(p-
27930 3e 70 57 72 69 74 65 72 29 3b 0a 20 20 20 20 73  >pWriter);.    s
27940 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28  qlite3_finalize(
27950 70 2d 3e 70 44 65 6c 65 74 65 72 29 3b 0a 20 20  p->pDeleter);.  
27960 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69    sqlite3_finali
27970 7a 65 28 70 2d 3e 70 49 64 78 57 72 69 74 65 72  ze(p->pIdxWriter
27980 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
27990 69 6e 61 6c 69 7a 65 28 70 2d 3e 70 49 64 78 44  inalize(p->pIdxD
279a0 65 6c 65 74 65 72 29 3b 0a 20 20 20 20 73 71 6c  eleter);.    sql
279b0 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 2d  ite3_finalize(p-
279c0 3e 70 49 64 78 53 65 6c 65 63 74 29 3b 0a 20 20  >pIdxSelect);.  
279d0 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69    sqlite3_finali
279e0 7a 65 28 70 2d 3e 70 44 61 74 61 56 65 72 73 69  ze(p->pDataVersi
279f0 6f 6e 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  on);.    sqlite3
27a00 46 74 73 35 48 61 73 68 46 72 65 65 28 70 2d 3e  Fts5HashFree(p->
27a10 70 48 61 73 68 29 3b 0a 20 20 20 20 73 71 6c 69  pHash);.    sqli
27a20 74 65 33 5f 66 72 65 65 28 70 2d 3e 7a 44 61 74  te3_free(p->zDat
27a30 61 54 62 6c 29 3b 0a 20 20 20 20 73 71 6c 69 74  aTbl);.    sqlit
27a40 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 7d 0a  e3_free(p);.  }.
27a50 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
27a60 2f 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20 70  /*.** Argument p
27a70 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 62 75 66   points to a buf
27a80 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 75  fer containing u
27a90 74 66 2d 38 20 74 65 78 74 20 74 68 61 74 20 69  tf-8 text that i
27aa0 73 20 6e 20 62 79 74 65 73 20 69 6e 20 0a 2a 2a  s n bytes in .**
27ab0 20 73 69 7a 65 2e 20 52 65 74 75 72 6e 20 74 68   size. Return th
27ac0 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  e number of byte
27ad0 73 20 69 6e 20 74 68 65 20 6e 43 68 61 72 20 63  s in the nChar c
27ae0 68 61 72 61 63 74 65 72 20 70 72 65 66 69 78 20  haracter prefix 
27af0 6f 66 20 74 68 65 0a 2a 2a 20 62 75 66 66 65 72  of the.** buffer
27b00 2c 20 6f 72 20 30 20 69 66 20 74 68 65 72 65 20  , or 0 if there 
27b10 61 72 65 20 6c 65 73 73 20 74 68 61 6e 20 6e 43  are less than nC
27b20 68 61 72 20 63 68 61 72 61 63 74 65 72 73 20 69  har characters i
27b30 6e 20 74 6f 74 61 6c 2e 0a 2a 2f 0a 69 6e 74 20  n total..*/.int 
27b40 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78  sqlite3Fts5Index
27b50 43 68 61 72 6c 65 6e 54 6f 42 79 74 65 6c 65 6e  CharlenToBytelen
27b60 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  (.  const char *
27b70 70 2c 20 0a 20 20 69 6e 74 20 6e 42 79 74 65 2c  p, .  int nByte,
27b80 20 0a 20 20 69 6e 74 20 6e 43 68 61 72 0a 29 7b   .  int nChar.){
27b90 0a 20 20 69 6e 74 20 6e 20 3d 20 30 3b 0a 20 20  .  int n = 0;.  
27ba0 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30  int i;.  for(i=0
27bb0 3b 20 69 3c 6e 43 68 61 72 3b 20 69 2b 2b 29 7b  ; i<nChar; i++){
27bc0 0a 20 20 20 20 69 66 28 20 6e 3e 3d 6e 42 79 74  .    if( n>=nByt
27bd0 65 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20  e ) return 0;   
27be0 20 20 20 2f 2a 20 49 6e 70 75 74 20 63 6f 6e 74     /* Input cont
27bf0 61 69 6e 73 20 66 65 77 65 72 20 74 68 61 6e 20  ains fewer than 
27c00 6e 43 68 61 72 20 63 68 61 72 73 20 2a 2f 0a 20  nChar chars */. 
27c10 20 20 20 69 66 28 20 28 75 6e 73 69 67 6e 65 64     if( (unsigned
27c20 20 63 68 61 72 29 70 5b 6e 2b 2b 5d 3e 3d 30 78   char)p[n++]>=0x
27c30 63 30 20 29 7b 0a 20 20 20 20 20 20 77 68 69 6c  c0 ){.      whil
27c40 65 28 20 28 70 5b 6e 5d 20 26 20 30 78 63 30 29  e( (p[n] & 0xc0)
27c50 3d 3d 30 78 38 30 20 29 20 6e 2b 2b 3b 0a 20 20  ==0x80 ) n++;.  
27c60 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
27c70 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70 49 6e   n;.}../*.** pIn
27c80 20 69 73 20 61 20 55 54 46 2d 38 20 65 6e 63 6f   is a UTF-8 enco
27c90 64 65 64 20 73 74 72 69 6e 67 2c 20 6e 49 6e 20  ded string, nIn 
27ca0 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2e 20 52  bytes in size. R
27cb0 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72  eturn the number
27cc0 20 6f 66 0a 2a 2a 20 75 6e 69 63 6f 64 65 20 63   of.** unicode c
27cd0 68 61 72 61 63 74 65 72 73 20 69 6e 20 74 68 65  haracters in the
27ce0 20 73 74 72 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74   string..*/.stat
27cf0 69 63 20 69 6e 74 20 66 74 73 35 49 6e 64 65 78  ic int fts5Index
27d00 43 68 61 72 6c 65 6e 28 63 6f 6e 73 74 20 63 68  Charlen(const ch
27d10 61 72 20 2a 70 49 6e 2c 20 69 6e 74 20 6e 49 6e  ar *pIn, int nIn
27d20 29 7b 0a 20 20 69 6e 74 20 6e 43 68 61 72 20 3d  ){.  int nChar =
27d30 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 0a   0;            .
27d40 20 20 69 6e 74 20 69 20 3d 20 30 3b 0a 20 20 77    int i = 0;.  w
27d50 68 69 6c 65 28 20 69 3c 6e 49 6e 20 29 7b 0a 20  hile( i<nIn ){. 
27d60 20 20 20 69 66 28 20 28 75 6e 73 69 67 6e 65 64     if( (unsigned
27d70 20 63 68 61 72 29 70 49 6e 5b 69 2b 2b 5d 3e 3d   char)pIn[i++]>=
27d80 30 78 63 30 20 29 7b 0a 20 20 20 20 20 20 77 68  0xc0 ){.      wh
27d90 69 6c 65 28 20 69 3c 6e 49 6e 20 26 26 20 28 70  ile( i<nIn && (p
27da0 49 6e 5b 69 5d 20 26 20 30 78 63 30 29 3d 3d 30  In[i] & 0xc0)==0
27db0 78 38 30 20 29 20 69 2b 2b 3b 0a 20 20 20 20 7d  x80 ) i++;.    }
27dc0 0a 20 20 20 20 6e 43 68 61 72 2b 2b 3b 0a 20 20  .    nChar++;.  
27dd0 7d 0a 20 20 72 65 74 75 72 6e 20 6e 43 68 61 72  }.  return nChar
27de0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 73 65 72  ;.}../*.** Inser
27df0 74 20 6f 72 20 72 65 6d 6f 76 65 20 64 61 74 61  t or remove data
27e00 20 74 6f 20 6f 72 20 66 72 6f 6d 20 74 68 65 20   to or from the 
27e10 69 6e 64 65 78 2e 20 45 61 63 68 20 74 69 6d 65  index. Each time
27e20 20 61 20 64 6f 63 75 6d 65 6e 74 20 69 73 20 0a   a document is .
27e30 2a 2a 20 61 64 64 65 64 20 74 6f 20 6f 72 20 72  ** added to or r
27e40 65 6d 6f 76 65 64 20 66 72 6f 6d 20 74 68 65 20  emoved from the 
27e50 69 6e 64 65 78 2c 20 74 68 69 73 20 66 75 6e 63  index, this func
27e60 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 6f  tion is called o
27e70 6e 65 20 6f 72 20 6d 6f 72 65 0a 2a 2a 20 74 69  ne or more.** ti
27e80 6d 65 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 61  mes..**.** For a
27e90 6e 20 69 6e 73 65 72 74 2c 20 69 74 20 6d 75 73  n insert, it mus
27ea0 74 20 62 65 20 63 61 6c 6c 65 64 20 6f 6e 63 65  t be called once
27eb0 20 66 6f 72 20 65 61 63 68 20 74 6f 6b 65 6e 20   for each token 
27ec0 69 6e 20 74 68 65 20 6e 65 77 20 64 6f 63 75 6d  in the new docum
27ed0 65 6e 74 2e 0a 2a 2a 20 49 66 20 74 68 65 20 6f  ent..** If the o
27ee0 70 65 72 61 74 69 6f 6e 20 69 73 20 61 20 64 65  peration is a de
27ef0 6c 65 74 65 2c 20 69 74 20 6d 75 73 74 20 62 65  lete, it must be
27f00 20 63 61 6c 6c 65 64 20 28 61 74 20 6c 65 61 73   called (at leas
27f10 74 29 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68  t) once for each
27f20 0a 2a 2a 20 75 6e 69 71 75 65 20 74 6f 6b 65 6e  .** unique token
27f30 20 69 6e 20 74 68 65 20 64 6f 63 75 6d 65 6e 74   in the document
27f40 20 77 69 74 68 20 61 6e 20 69 43 6f 6c 20 76 61   with an iCol va
27f50 6c 75 65 20 6c 65 73 73 20 74 68 61 6e 20 7a 65  lue less than ze
27f60 72 6f 2e 20 54 68 65 20 69 50 6f 73 0a 2a 2a 20  ro. The iPos.** 
27f70 61 72 67 75 6d 65 6e 74 20 69 73 20 69 67 6e 6f  argument is igno
27f80 72 65 64 20 66 6f 72 20 61 20 64 65 6c 65 74 65  red for a delete
27f90 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
27fa0 46 74 73 35 49 6e 64 65 78 57 72 69 74 65 28 0a  Fts5IndexWrite(.
27fb0 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20    Fts5Index *p, 
27fc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27fd0 20 20 2f 2a 20 49 6e 64 65 78 20 74 6f 20 77 72    /* Index to wr
27fe0 69 74 65 20 74 6f 20 2a 2f 0a 20 20 69 6e 74 20  ite to */.  int 
27ff0 69 43 6f 6c 2c 20 20 20 20 20 20 20 20 20 20 20  iCol,           
28000 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
28010 6f 6c 75 6d 6e 20 74 6f 6b 65 6e 20 61 70 70 65  olumn token appe
28020 61 72 73 20 69 6e 20 28 2d 76 65 20 2d 3e 20 64  ars in (-ve -> d
28030 65 6c 65 74 65 29 20 2a 2f 0a 20 20 69 6e 74 20  elete) */.  int 
28040 69 50 6f 73 2c 20 20 20 20 20 20 20 20 20 20 20  iPos,           
28050 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
28060 6f 73 69 74 69 6f 6e 20 6f 66 20 74 6f 6b 65 6e  osition of token
28070 20 77 69 74 68 69 6e 20 63 6f 6c 75 6d 6e 20 2a   within column *
28080 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
28090 70 54 6f 6b 65 6e 2c 20 69 6e 74 20 6e 54 6f 6b  pToken, int nTok
280a0 65 6e 20 20 2f 2a 20 54 6f 6b 65 6e 20 74 6f 20  en  /* Token to 
280b0 61 64 64 20 6f 72 20 72 65 6d 6f 76 65 20 74 6f  add or remove to
280c0 20 6f 72 20 66 72 6f 6d 20 69 6e 64 65 78 20 2a   or from index *
280d0 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20  /.){.  int i;   
280e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
280f0 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20 74         /* Used t
28100 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f 75 67  o iterate throug
28110 68 20 69 6e 64 65 78 65 73 20 2a 2f 0a 20 20 69  h indexes */.  i
28120 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
28130 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  K;             /
28140 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
28150 0a 20 20 46 74 73 35 43 6f 6e 66 69 67 20 2a 70  .  Fts5Config *p
28160 43 6f 6e 66 69 67 20 3d 20 70 2d 3e 70 43 6f 6e  Config = p->pCon
28170 66 69 67 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  fig;..  assert( 
28180 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
28190 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 69   );.  assert( (i
281a0 43 6f 6c 3c 30 29 3d 3d 70 2d 3e 62 44 65 6c 65  Col<0)==p->bDele
281b0 74 65 20 29 3b 0a 0a 20 20 2f 2a 20 41 64 64 20  te );..  /* Add 
281c0 74 68 65 20 65 6e 74 72 79 20 74 6f 20 74 68 65  the entry to the
281d0 20 6d 61 69 6e 20 74 65 72 6d 73 20 69 6e 64 65   main terms inde
281e0 78 2e 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c  x. */.  rc = sql
281f0 69 74 65 33 46 74 73 35 48 61 73 68 57 72 69 74  ite3Fts5HashWrit
28200 65 28 0a 20 20 20 20 20 20 70 2d 3e 70 48 61 73  e(.      p->pHas
28210 68 2c 20 70 2d 3e 69 57 72 69 74 65 52 6f 77 69  h, p->iWriteRowi
28220 64 2c 20 69 43 6f 6c 2c 20 69 50 6f 73 2c 20 46  d, iCol, iPos, F
28230 54 53 35 5f 4d 41 49 4e 5f 50 52 45 46 49 58 2c  TS5_MAIN_PREFIX,
28240 20 70 54 6f 6b 65 6e 2c 20 6e 54 6f 6b 65 6e 0a   pToken, nToken.
28250 20 20 29 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b    );..  for(i=0;
28260 20 69 3c 70 43 6f 6e 66 69 67 2d 3e 6e 50 72 65   i<pConfig->nPre
28270 66 69 78 20 26 26 20 72 63 3d 3d 53 51 4c 49 54  fix && rc==SQLIT
28280 45 5f 4f 4b 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  E_OK; i++){.    
28290 63 6f 6e 73 74 20 69 6e 74 20 6e 43 68 61 72 20  const int nChar 
282a0 3d 20 70 43 6f 6e 66 69 67 2d 3e 61 50 72 65 66  = pConfig->aPref
282b0 69 78 5b 69 5d 3b 0a 20 20 20 20 69 6e 74 20 6e  ix[i];.    int n
282c0 42 79 74 65 20 3d 20 73 71 6c 69 74 65 33 46 74  Byte = sqlite3Ft
282d0 73 35 49 6e 64 65 78 43 68 61 72 6c 65 6e 54 6f  s5IndexCharlenTo
282e0 42 79 74 65 6c 65 6e 28 70 54 6f 6b 65 6e 2c 20  Bytelen(pToken, 
282f0 6e 54 6f 6b 65 6e 2c 20 6e 43 68 61 72 29 3b 0a  nToken, nChar);.
28300 20 20 20 20 69 66 28 20 6e 42 79 74 65 20 29 7b      if( nByte ){
28310 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
28320 74 65 33 46 74 73 35 48 61 73 68 57 72 69 74 65  te3Fts5HashWrite
28330 28 70 2d 3e 70 48 61 73 68 2c 20 0a 20 20 20 20  (p->pHash, .    
28340 20 20 20 20 20 20 70 2d 3e 69 57 72 69 74 65 52        p->iWriteR
28350 6f 77 69 64 2c 20 69 43 6f 6c 2c 20 69 50 6f 73  owid, iCol, iPos
28360 2c 20 28 63 68 61 72 29 28 46 54 53 35 5f 4d 41  , (char)(FTS5_MA
28370 49 4e 5f 50 52 45 46 49 58 2b 69 2b 31 29 2c 20  IN_PREFIX+i+1), 
28380 70 54 6f 6b 65 6e 2c 0a 20 20 20 20 20 20 20 20  pToken,.        
28390 20 20 6e 42 79 74 65 0a 20 20 20 20 20 20 29 3b    nByte.      );
283a0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65  .    }.  }..  re
283b0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
283c0 2a 20 4f 70 65 6e 20 61 20 6e 65 77 20 69 74 65  * Open a new ite
283d0 72 61 74 6f 72 20 74 6f 20 69 74 65 72 61 74 65  rator to iterate
283e0 20 74 68 6f 75 67 68 20 61 6c 6c 20 72 6f 77 69   though all rowi
283f0 64 20 74 68 61 74 20 6d 61 74 63 68 20 74 68 65  d that match the
28400 20 0a 2a 2a 20 73 70 65 63 69 66 69 65 64 20 74   .** specified t
28410 6f 6b 65 6e 20 6f 72 20 74 6f 6b 65 6e 20 70 72  oken or token pr
28420 65 66 69 78 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  efix..*/.int sql
28430 69 74 65 33 46 74 73 35 49 6e 64 65 78 51 75 65  ite3Fts5IndexQue
28440 72 79 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20  ry(.  Fts5Index 
28450 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  *p,             
28460 20 20 20 20 20 20 2f 2a 20 46 54 53 20 69 6e 64        /* FTS ind
28470 65 78 20 74 6f 20 71 75 65 72 79 20 2a 2f 0a 20  ex to query */. 
28480 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 70 54 6f   const char *pTo
28490 6b 65 6e 2c 20 69 6e 74 20 6e 54 6f 6b 65 6e 2c  ken, int nToken,
284a0 20 2f 2a 20 54 6f 6b 65 6e 20 28 6f 72 20 70 72   /* Token (or pr
284b0 65 66 69 78 29 20 74 6f 20 71 75 65 72 79 20 66  efix) to query f
284c0 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67  or */.  int flag
284d0 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s,              
284e0 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20          /* Mask 
284f0 6f 66 20 46 54 53 35 49 4e 44 45 58 5f 51 55 45  of FTS5INDEX_QUE
28500 52 59 5f 58 20 66 6c 61 67 73 20 2a 2f 0a 20 20  RY_X flags */.  
28510 46 74 73 35 43 6f 6c 73 65 74 20 2a 70 43 6f 6c  Fts5Colset *pCol
28520 73 65 74 2c 20 20 20 20 20 20 20 20 20 20 20 20  set,            
28530 2f 2a 20 4d 61 74 63 68 20 74 68 65 73 65 20 63  /* Match these c
28540 6f 6c 75 6d 6e 73 20 6f 6e 6c 79 20 2a 2f 0a 20  olumns only */. 
28550 20 46 74 73 35 49 6e 64 65 78 49 74 65 72 20 2a   Fts5IndexIter *
28560 2a 70 70 49 74 65 72 20 20 20 20 20 20 20 20 20  *ppIter         
28570 20 2f 2a 20 4f 55 54 3a 20 4e 65 77 20 69 74 65   /* OUT: New ite
28580 72 61 74 6f 72 20 6f 62 6a 65 63 74 20 2a 2f 0a  rator object */.
28590 29 7b 0a 20 20 46 74 73 35 43 6f 6e 66 69 67 20  ){.  Fts5Config 
285a0 2a 70 43 6f 6e 66 69 67 20 3d 20 70 2d 3e 70 43  *pConfig = p->pC
285b0 6f 6e 66 69 67 3b 0a 20 20 46 74 73 35 49 74 65  onfig;.  Fts5Ite
285c0 72 20 2a 70 52 65 74 20 3d 20 30 3b 0a 20 20 46  r *pRet = 0;.  F
285d0 74 73 35 42 75 66 66 65 72 20 62 75 66 20 3d 20  ts5Buffer buf = 
285e0 7b 30 2c 20 30 2c 20 30 7d 3b 0a 0a 20 20 2f 2a  {0, 0, 0};..  /*
285f0 20 49 66 20 74 68 65 20 51 55 45 52 59 5f 53 43   If the QUERY_SC
28600 41 4e 20 66 6c 61 67 20 69 73 20 73 65 74 2c 20  AN flag is set, 
28610 61 6c 6c 20 6f 74 68 65 72 20 66 6c 61 67 73 20  all other flags 
28620 6d 75 73 74 20 62 65 20 63 6c 65 61 72 2e 20 2a  must be clear. *
28630 2f 0a 20 20 61 73 73 65 72 74 28 20 28 66 6c 61  /.  assert( (fla
28640 67 73 20 26 20 46 54 53 35 49 4e 44 45 58 5f 51  gs & FTS5INDEX_Q
28650 55 45 52 59 5f 53 43 41 4e 29 3d 3d 30 20 7c 7c  UERY_SCAN)==0 ||
28660 20 66 6c 61 67 73 3d 3d 46 54 53 35 49 4e 44 45   flags==FTS5INDE
28670 58 5f 51 55 45 52 59 5f 53 43 41 4e 20 29 3b 0a  X_QUERY_SCAN );.
28680 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 46 74  .  if( sqlite3Ft
28690 73 35 42 75 66 66 65 72 53 69 7a 65 28 26 70 2d  s5BufferSize(&p-
286a0 3e 72 63 2c 20 26 62 75 66 2c 20 6e 54 6f 6b 65  >rc, &buf, nToke
286b0 6e 2b 31 29 3d 3d 30 20 29 7b 0a 20 20 20 20 69  n+1)==0 ){.    i
286c0 6e 74 20 69 49 64 78 20 3d 20 30 3b 20 20 20 20  nt iIdx = 0;    
286d0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
286e0 49 6e 64 65 78 20 74 6f 20 73 65 61 72 63 68 20  Index to search 
286f0 2a 2f 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 62  */.    memcpy(&b
28700 75 66 2e 70 5b 31 5d 2c 20 70 54 6f 6b 65 6e 2c  uf.p[1], pToken,
28710 20 6e 54 6f 6b 65 6e 29 3b 0a 0a 20 20 20 20 2f   nToken);..    /
28720 2a 20 46 69 67 75 72 65 20 6f 75 74 20 77 68 69  * Figure out whi
28730 63 68 20 69 6e 64 65 78 20 74 6f 20 73 65 61 72  ch index to sear
28740 63 68 20 61 6e 64 20 73 65 74 20 69 49 64 78 20  ch and set iIdx 
28750 61 63 63 6f 72 64 69 6e 67 6c 79 2e 20 49 66 20  accordingly. If 
28760 74 68 69 73 0a 20 20 20 20 2a 2a 20 69 73 20 61  this.    ** is a
28770 20 70 72 65 66 69 78 20 71 75 65 72 79 20 66 6f   prefix query fo
28780 72 20 77 68 69 63 68 20 74 68 65 72 65 20 69 73  r which there is
28790 20 6e 6f 20 70 72 65 66 69 78 20 69 6e 64 65 78   no prefix index
287a0 2c 20 73 65 74 20 69 49 64 78 20 74 6f 0a 20 20  , set iIdx to.  
287b0 20 20 2a 2a 20 67 72 65 61 74 65 72 20 74 68 61    ** greater tha
287c0 6e 20 70 43 6f 6e 66 69 67 2d 3e 6e 50 72 65 66  n pConfig->nPref
287d0 69 78 20 74 6f 20 69 6e 64 69 63 61 74 65 20 74  ix to indicate t
287e0 68 61 74 20 74 68 65 20 71 75 65 72 79 20 77 69  hat the query wi
287f0 6c 6c 20 62 65 0a 20 20 20 20 2a 2a 20 73 61 74  ll be.    ** sat
28800 69 73 66 69 65 64 20 62 79 20 73 63 61 6e 6e 69  isfied by scanni
28810 6e 67 20 6d 75 6c 74 69 70 6c 65 20 74 65 72 6d  ng multiple term
28820 73 20 69 6e 20 74 68 65 20 6d 61 69 6e 20 69 6e  s in the main in
28830 64 65 78 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  dex..    **.    
28840 2a 2a 20 49 66 20 74 68 65 20 51 55 45 52 59 5f  ** If the QUERY_
28850 54 45 53 54 5f 4e 4f 49 44 58 20 66 6c 61 67 20  TEST_NOIDX flag 
28860 77 61 73 20 73 70 65 63 69 66 69 65 64 2c 20 74  was specified, t
28870 68 65 6e 20 74 68 69 73 20 6d 75 73 74 20 62 65  hen this must be
28880 20 61 0a 20 20 20 20 2a 2a 20 70 72 65 66 69 78   a.    ** prefix
28890 2d 71 75 65 72 79 2e 20 49 6e 73 74 65 61 64 20  -query. Instead 
288a0 6f 66 20 75 73 69 6e 67 20 61 20 70 72 65 66 69  of using a prefi
288b0 78 2d 69 6e 64 65 78 20 28 69 66 20 6f 6e 65 20  x-index (if one 
288c0 65 78 69 73 74 73 29 2c 20 0a 20 20 20 20 2a 2a  exists), .    **
288d0 20 65 76 61 6c 75 61 74 65 20 74 68 65 20 70 72   evaluate the pr
288e0 65 66 69 78 20 71 75 65 72 79 20 75 73 69 6e 67  efix query using
288f0 20 74 68 65 20 6d 61 69 6e 20 46 54 53 20 69 6e   the main FTS in
28900 64 65 78 2e 20 54 68 69 73 20 69 73 20 75 73 65  dex. This is use
28910 64 0a 20 20 20 20 2a 2a 20 66 6f 72 20 69 6e 74  d.    ** for int
28920 65 72 6e 61 6c 20 73 61 6e 69 74 79 20 63 68 65  ernal sanity che
28930 63 6b 69 6e 67 20 62 79 20 74 68 65 20 69 6e 74  cking by the int
28940 65 67 72 69 74 79 2d 63 68 65 63 6b 20 69 6e 20  egrity-check in 
28950 64 65 62 75 67 20 0a 20 20 20 20 2a 2a 20 6d 6f  debug .    ** mo
28960 64 65 20 6f 6e 6c 79 2e 20 20 2a 2f 0a 23 69 66  de only.  */.#if
28970 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
28980 0a 20 20 20 20 69 66 28 20 70 43 6f 6e 66 69 67  .    if( pConfig
28990 2d 3e 62 50 72 65 66 69 78 49 6e 64 65 78 3d 3d  ->bPrefixIndex==
289a0 30 20 7c 7c 20 28 66 6c 61 67 73 20 26 20 46 54  0 || (flags & FT
289b0 53 35 49 4e 44 45 58 5f 51 55 45 52 59 5f 54 45  S5INDEX_QUERY_TE
289c0 53 54 5f 4e 4f 49 44 58 29 20 29 7b 0a 20 20 20  ST_NOIDX) ){.   
289d0 20 20 20 61 73 73 65 72 74 28 20 66 6c 61 67 73     assert( flags
289e0 20 26 20 46 54 53 35 49 4e 44 45 58 5f 51 55 45   & FTS5INDEX_QUE
289f0 52 59 5f 50 52 45 46 49 58 20 29 3b 0a 20 20 20  RY_PREFIX );.   
28a00 20 20 20 69 49 64 78 20 3d 20 31 2b 70 43 6f 6e     iIdx = 1+pCon
28a10 66 69 67 2d 3e 6e 50 72 65 66 69 78 3b 0a 20 20  fig->nPrefix;.  
28a20 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20    }else.#endif. 
28a30 20 20 20 69 66 28 20 66 6c 61 67 73 20 26 20 46     if( flags & F
28a40 54 53 35 49 4e 44 45 58 5f 51 55 45 52 59 5f 50  TS5INDEX_QUERY_P
28a50 52 45 46 49 58 20 29 7b 0a 20 20 20 20 20 20 69  REFIX ){.      i
28a60 6e 74 20 6e 43 68 61 72 20 3d 20 66 74 73 35 49  nt nChar = fts5I
28a70 6e 64 65 78 43 68 61 72 6c 65 6e 28 70 54 6f 6b  ndexCharlen(pTok
28a80 65 6e 2c 20 6e 54 6f 6b 65 6e 29 3b 0a 20 20 20  en, nToken);.   
28a90 20 20 20 66 6f 72 28 69 49 64 78 3d 31 3b 20 69     for(iIdx=1; i
28aa0 49 64 78 3c 3d 70 43 6f 6e 66 69 67 2d 3e 6e 50  Idx<=pConfig->nP
28ab0 72 65 66 69 78 3b 20 69 49 64 78 2b 2b 29 7b 0a  refix; iIdx++){.
28ac0 20 20 20 20 20 20 20 20 69 66 28 20 70 43 6f 6e          if( pCon
28ad0 66 69 67 2d 3e 61 50 72 65 66 69 78 5b 69 49 64  fig->aPrefix[iId
28ae0 78 2d 31 5d 3d 3d 6e 43 68 61 72 20 29 20 62 72  x-1]==nChar ) br
28af0 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
28b00 20 7d 0a 0a 20 20 20 20 69 66 28 20 69 49 64 78   }..    if( iIdx
28b10 3c 3d 70 43 6f 6e 66 69 67 2d 3e 6e 50 72 65 66  <=pConfig->nPref
28b20 69 78 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 53  ix ){.      /* S
28b30 74 72 61 69 67 68 74 20 69 6e 64 65 78 20 6c 6f  traight index lo
28b40 6f 6b 75 70 20 2a 2f 0a 20 20 20 20 20 20 46 74  okup */.      Ft
28b50 73 35 53 74 72 75 63 74 75 72 65 20 2a 70 53 74  s5Structure *pSt
28b60 72 75 63 74 20 3d 20 66 74 73 35 53 74 72 75 63  ruct = fts5Struc
28b70 74 75 72 65 52 65 61 64 28 70 29 3b 0a 20 20 20  tureRead(p);.   
28b80 20 20 20 62 75 66 2e 70 5b 30 5d 20 3d 20 28 75     buf.p[0] = (u
28b90 38 29 28 46 54 53 35 5f 4d 41 49 4e 5f 50 52 45  8)(FTS5_MAIN_PRE
28ba0 46 49 58 20 2b 20 69 49 64 78 29 3b 0a 20 20 20  FIX + iIdx);.   
28bb0 20 20 20 69 66 28 20 70 53 74 72 75 63 74 20 29     if( pStruct )
28bc0 7b 0a 20 20 20 20 20 20 20 20 66 74 73 35 4d 75  {.        fts5Mu
28bd0 6c 74 69 49 74 65 72 4e 65 77 28 70 2c 20 70 53  ltiIterNew(p, pS
28be0 74 72 75 63 74 2c 20 66 6c 61 67 73 20 7c 20 46  truct, flags | F
28bf0 54 53 35 49 4e 44 45 58 5f 51 55 45 52 59 5f 53  TS5INDEX_QUERY_S
28c00 4b 49 50 45 4d 50 54 59 2c 20 0a 20 20 20 20 20  KIPEMPTY, .     
28c10 20 20 20 20 20 20 20 70 43 6f 6c 73 65 74 2c 20         pColset, 
28c20 62 75 66 2e 70 2c 20 6e 54 6f 6b 65 6e 2b 31 2c  buf.p, nToken+1,
28c30 20 2d 31 2c 20 30 2c 20 26 70 52 65 74 0a 20 20   -1, 0, &pRet.  
28c40 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20        );.       
28c50 20 66 74 73 35 53 74 72 75 63 74 75 72 65 52 65   fts5StructureRe
28c60 6c 65 61 73 65 28 70 53 74 72 75 63 74 29 3b 0a  lease(pStruct);.
28c70 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
28c80 65 7b 0a 20 20 20 20 20 20 2f 2a 20 53 63 61 6e  e{.      /* Scan
28c90 20 6d 75 6c 74 69 70 6c 65 20 74 65 72 6d 73 20   multiple terms 
28ca0 69 6e 20 74 68 65 20 6d 61 69 6e 20 69 6e 64 65  in the main inde
28cb0 78 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 62  x */.      int b
28cc0 44 65 73 63 20 3d 20 28 66 6c 61 67 73 20 26 20  Desc = (flags & 
28cd0 46 54 53 35 49 4e 44 45 58 5f 51 55 45 52 59 5f  FTS5INDEX_QUERY_
28ce0 44 45 53 43 29 21 3d 30 3b 0a 20 20 20 20 20 20  DESC)!=0;.      
28cf0 62 75 66 2e 70 5b 30 5d 20 3d 20 46 54 53 35 5f  buf.p[0] = FTS5_
28d00 4d 41 49 4e 5f 50 52 45 46 49 58 3b 0a 20 20 20  MAIN_PREFIX;.   
28d10 20 20 20 66 74 73 35 53 65 74 75 70 50 72 65 66     fts5SetupPref
28d20 69 78 49 74 65 72 28 70 2c 20 62 44 65 73 63 2c  ixIter(p, bDesc,
28d30 20 62 75 66 2e 70 2c 20 6e 54 6f 6b 65 6e 2b 31   buf.p, nToken+1
28d40 2c 20 70 43 6f 6c 73 65 74 2c 20 26 70 52 65 74  , pColset, &pRet
28d50 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
28d60 20 70 2d 3e 72 63 21 3d 53 51 4c 49 54 45 5f 4f   p->rc!=SQLITE_O
28d70 4b 20 7c 7c 20 70 52 65 74 2d 3e 70 43 6f 6c 73  K || pRet->pCols
28d80 65 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 66  et==0 );.      f
28d90 74 73 35 49 74 65 72 53 65 74 4f 75 74 70 75 74  ts5IterSetOutput
28da0 43 62 28 26 70 2d 3e 72 63 2c 20 70 52 65 74 29  Cb(&p->rc, pRet)
28db0 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72  ;.      if( p->r
28dc0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
28dd0 20 20 20 20 20 20 20 20 46 74 73 35 53 65 67 49          Fts5SegI
28de0 74 65 72 20 2a 70 53 65 67 20 3d 20 26 70 52 65  ter *pSeg = &pRe
28df0 74 2d 3e 61 53 65 67 5b 70 52 65 74 2d 3e 61 46  t->aSeg[pRet->aF
28e00 69 72 73 74 5b 31 5d 2e 69 46 69 72 73 74 5d 3b  irst[1].iFirst];
28e10 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 53 65  .        if( pSe
28e20 67 2d 3e 70 4c 65 61 66 20 29 20 70 52 65 74 2d  g->pLeaf ) pRet-
28e30 3e 78 53 65 74 4f 75 74 70 75 74 73 28 70 52 65  >xSetOutputs(pRe
28e40 74 2c 20 70 53 65 67 29 3b 0a 20 20 20 20 20 20  t, pSeg);.      
28e50 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28  }.    }..    if(
28e60 20 70 2d 3e 72 63 20 29 7b 0a 20 20 20 20 20 20   p->rc ){.      
28e70 73 71 6c 69 74 65 33 46 74 73 35 49 74 65 72 43  sqlite3Fts5IterC
28e80 6c 6f 73 65 28 26 70 52 65 74 2d 3e 62 61 73 65  lose(&pRet->base
28e90 29 3b 0a 20 20 20 20 20 20 70 52 65 74 20 3d 20  );.      pRet = 
28ea0 30 3b 0a 20 20 20 20 20 20 66 74 73 35 43 6c 6f  0;.      fts5Clo
28eb0 73 65 52 65 61 64 65 72 28 70 29 3b 0a 20 20 20  seReader(p);.   
28ec0 20 7d 0a 0a 20 20 20 20 2a 70 70 49 74 65 72 20   }..    *ppIter 
28ed0 3d 20 26 70 52 65 74 2d 3e 62 61 73 65 3b 0a 20  = &pRet->base;. 
28ee0 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 42 75     sqlite3Fts5Bu
28ef0 66 66 65 72 46 72 65 65 28 26 62 75 66 29 3b 0a  fferFree(&buf);.
28f00 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 66 74 73    }.  return fts
28f10 35 49 6e 64 65 78 52 65 74 75 72 6e 28 70 29 3b  5IndexReturn(p);
28f20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
28f30 20 74 72 75 65 20 69 66 20 74 68 65 20 69 74 65   true if the ite
28f40 72 61 74 6f 72 20 70 61 73 73 65 64 20 61 73 20  rator passed as 
28f50 74 68 65 20 6f 6e 6c 79 20 61 72 67 75 6d 65 6e  the only argumen
28f60 74 20 69 73 20 61 74 20 45 4f 46 2e 0a 2a 2f 0a  t is at EOF..*/.
28f70 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 6f 20 74 68  /*.** Move to th
28f80 65 20 6e 65 78 74 20 6d 61 74 63 68 69 6e 67 20  e next matching 
28f90 72 6f 77 69 64 2e 20 0a 2a 2f 0a 69 6e 74 20 73  rowid. .*/.int s
28fa0 71 6c 69 74 65 33 46 74 73 35 49 74 65 72 4e 65  qlite3Fts5IterNe
28fb0 78 74 28 46 74 73 35 49 6e 64 65 78 49 74 65 72  xt(Fts5IndexIter
28fc0 20 2a 70 49 6e 64 65 78 49 74 65 72 29 7b 0a 20   *pIndexIter){. 
28fd0 20 46 74 73 35 49 74 65 72 20 2a 70 49 74 65 72   Fts5Iter *pIter
28fe0 20 3d 20 28 46 74 73 35 49 74 65 72 2a 29 70 49   = (Fts5Iter*)pI
28ff0 6e 64 65 78 49 74 65 72 3b 0a 20 20 61 73 73 65  ndexIter;.  asse
29000 72 74 28 20 70 49 74 65 72 2d 3e 70 49 6e 64 65  rt( pIter->pInde
29010 78 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  x->rc==SQLITE_OK
29020 20 29 3b 0a 20 20 66 74 73 35 4d 75 6c 74 69 49   );.  fts5MultiI
29030 74 65 72 4e 65 78 74 28 70 49 74 65 72 2d 3e 70  terNext(pIter->p
29040 49 6e 64 65 78 2c 20 70 49 74 65 72 2c 20 30 2c  Index, pIter, 0,
29050 20 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 66 74   0);.  return ft
29060 73 35 49 6e 64 65 78 52 65 74 75 72 6e 28 70 49  s5IndexReturn(pI
29070 74 65 72 2d 3e 70 49 6e 64 65 78 29 3b 0a 7d 0a  ter->pIndex);.}.
29080 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 6f 20 74  ./*.** Move to t
29090 68 65 20 6e 65 78 74 20 6d 61 74 63 68 69 6e 67  he next matching
290a0 20 74 65 72 6d 2f 72 6f 77 69 64 2e 20 55 73 65   term/rowid. Use
290b0 64 20 62 79 20 74 68 65 20 66 74 73 35 76 6f 63  d by the fts5voc
290c0 61 62 20 6d 6f 64 75 6c 65 2e 0a 2a 2f 0a 69 6e  ab module..*/.in
290d0 74 20 73 71 6c 69 74 65 33 46 74 73 35 49 74 65  t sqlite3Fts5Ite
290e0 72 4e 65 78 74 53 63 61 6e 28 46 74 73 35 49 6e  rNextScan(Fts5In
290f0 64 65 78 49 74 65 72 20 2a 70 49 6e 64 65 78 49  dexIter *pIndexI
29100 74 65 72 29 7b 0a 20 20 46 74 73 35 49 74 65 72  ter){.  Fts5Iter
29110 20 2a 70 49 74 65 72 20 3d 20 28 46 74 73 35 49   *pIter = (Fts5I
29120 74 65 72 2a 29 70 49 6e 64 65 78 49 74 65 72 3b  ter*)pIndexIter;
29130 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 20  .  Fts5Index *p 
29140 3d 20 70 49 74 65 72 2d 3e 70 49 6e 64 65 78 3b  = pIter->pIndex;
29150 0a 0a 20 20 61 73 73 65 72 74 28 20 70 49 74 65  ..  assert( pIte
29160 72 2d 3e 70 49 6e 64 65 78 2d 3e 72 63 3d 3d 53  r->pIndex->rc==S
29170 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 0a 20 20 66  QLITE_OK );..  f
29180 74 73 35 4d 75 6c 74 69 49 74 65 72 4e 65 78 74  ts5MultiIterNext
29190 28 70 2c 20 70 49 74 65 72 2c 20 30 2c 20 30 29  (p, pIter, 0, 0)
291a0 3b 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53  ;.  if( p->rc==S
291b0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
291c0 46 74 73 35 53 65 67 49 74 65 72 20 2a 70 53 65  Fts5SegIter *pSe
291d0 67 20 3d 20 26 70 49 74 65 72 2d 3e 61 53 65 67  g = &pIter->aSeg
291e0 5b 20 70 49 74 65 72 2d 3e 61 46 69 72 73 74 5b  [ pIter->aFirst[
291f0 31 5d 2e 69 46 69 72 73 74 20 5d 3b 0a 20 20 20  1].iFirst ];.   
29200 20 69 66 28 20 70 53 65 67 2d 3e 70 4c 65 61 66   if( pSeg->pLeaf
29210 20 26 26 20 70 53 65 67 2d 3e 74 65 72 6d 2e 70   && pSeg->term.p
29220 5b 30 5d 21 3d 46 54 53 35 5f 4d 41 49 4e 5f 50  [0]!=FTS5_MAIN_P
29230 52 45 46 49 58 20 29 7b 0a 20 20 20 20 20 20 66  REFIX ){.      f
29240 74 73 35 44 61 74 61 52 65 6c 65 61 73 65 28 70  ts5DataRelease(p
29250 53 65 67 2d 3e 70 4c 65 61 66 29 3b 0a 20 20 20  Seg->pLeaf);.   
29260 20 20 20 70 53 65 67 2d 3e 70 4c 65 61 66 20 3d     pSeg->pLeaf =
29270 20 30 3b 0a 20 20 20 20 20 20 70 49 74 65 72 2d   0;.      pIter-
29280 3e 62 61 73 65 2e 62 45 6f 66 20 3d 20 31 3b 0a  >base.bEof = 1;.
29290 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74      }.  }..  ret
292a0 75 72 6e 20 66 74 73 35 49 6e 64 65 78 52 65 74  urn fts5IndexRet
292b0 75 72 6e 28 70 49 74 65 72 2d 3e 70 49 6e 64 65  urn(pIter->pInde
292c0 78 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76  x);.}../*.** Mov
292d0 65 20 74 6f 20 74 68 65 20 6e 65 78 74 20 6d 61  e to the next ma
292e0 74 63 68 69 6e 67 20 72 6f 77 69 64 20 74 68 61  tching rowid tha
292f0 74 20 6f 63 63 75 72 73 20 61 74 20 6f 72 20 61  t occurs at or a
29300 66 74 65 72 20 69 4d 61 74 63 68 2e 20 54 68 65  fter iMatch. The
29310 0a 2a 2a 20 64 65 66 69 6e 69 74 69 6f 6e 20 6f  .** definition o
29320 66 20 22 61 74 20 6f 72 20 61 66 74 65 72 22 20  f "at or after" 
29330 64 65 70 65 6e 64 73 20 6f 6e 20 77 68 65 74 68  depends on wheth
29340 65 72 20 74 68 69 73 20 69 74 65 72 61 74 6f 72  er this iterator
29350 20 69 74 65 72 61 74 65 73 0a 2a 2a 20 69 6e 20   iterates.** in 
29360 61 73 63 65 6e 64 69 6e 67 20 6f 72 20 64 65 73  ascending or des
29370 63 65 6e 64 69 6e 67 20 72 6f 77 69 64 20 6f 72  cending rowid or
29380 64 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  der..*/.int sqli
29390 74 65 33 46 74 73 35 49 74 65 72 4e 65 78 74 46  te3Fts5IterNextF
293a0 72 6f 6d 28 46 74 73 35 49 6e 64 65 78 49 74 65  rom(Fts5IndexIte
293b0 72 20 2a 70 49 6e 64 65 78 49 74 65 72 2c 20 69  r *pIndexIter, i
293c0 36 34 20 69 4d 61 74 63 68 29 7b 0a 20 20 46 74  64 iMatch){.  Ft
293d0 73 35 49 74 65 72 20 2a 70 49 74 65 72 20 3d 20  s5Iter *pIter = 
293e0 28 46 74 73 35 49 74 65 72 2a 29 70 49 6e 64 65  (Fts5Iter*)pInde
293f0 78 49 74 65 72 3b 0a 20 20 66 74 73 35 4d 75 6c  xIter;.  fts5Mul
29400 74 69 49 74 65 72 4e 65 78 74 46 72 6f 6d 28 70  tiIterNextFrom(p
29410 49 74 65 72 2d 3e 70 49 6e 64 65 78 2c 20 70 49  Iter->pIndex, pI
29420 74 65 72 2c 20 69 4d 61 74 63 68 29 3b 0a 20 20  ter, iMatch);.  
29430 72 65 74 75 72 6e 20 66 74 73 35 49 6e 64 65 78  return fts5Index
29440 52 65 74 75 72 6e 28 70 49 74 65 72 2d 3e 70 49  Return(pIter->pI
29450 6e 64 65 78 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ndex);.}../*.** 
29460 52 65 74 75 72 6e 20 74 68 65 20 63 75 72 72 65  Return the curre
29470 6e 74 20 74 65 72 6d 2e 0a 2a 2f 0a 63 6f 6e 73  nt term..*/.cons
29480 74 20 63 68 61 72 20 2a 73 71 6c 69 74 65 33 46  t char *sqlite3F
29490 74 73 35 49 74 65 72 54 65 72 6d 28 46 74 73 35  ts5IterTerm(Fts5
294a0 49 6e 64 65 78 49 74 65 72 20 2a 70 49 6e 64 65  IndexIter *pInde
294b0 78 49 74 65 72 2c 20 69 6e 74 20 2a 70 6e 29 7b  xIter, int *pn){
294c0 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 63 6f 6e 73  .  int n;.  cons
294d0 74 20 63 68 61 72 20 2a 7a 20 3d 20 28 63 6f 6e  t char *z = (con
294e0 73 74 20 63 68 61 72 2a 29 66 74 73 35 4d 75 6c  st char*)fts5Mul
294f0 74 69 49 74 65 72 54 65 72 6d 28 28 46 74 73 35  tiIterTerm((Fts5
29500 49 74 65 72 2a 29 70 49 6e 64 65 78 49 74 65 72  Iter*)pIndexIter
29510 2c 20 26 6e 29 3b 0a 20 20 2a 70 6e 20 3d 20 6e  , &n);.  *pn = n
29520 2d 31 3b 0a 20 20 72 65 74 75 72 6e 20 26 7a 5b  -1;.  return &z[
29530 31 5d 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f  1];.}../*.** Clo
29540 73 65 20 61 6e 20 69 74 65 72 61 74 6f 72 20 6f  se an iterator o
29550 70 65 6e 65 64 20 62 79 20 61 6e 20 65 61 72 6c  pened by an earl
29560 69 65 72 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69  ier call to sqli
29570 74 65 33 46 74 73 35 49 6e 64 65 78 51 75 65 72  te3Fts5IndexQuer
29580 79 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  y()..*/.void sql
29590 69 74 65 33 46 74 73 35 49 74 65 72 43 6c 6f 73  ite3Fts5IterClos
295a0 65 28 46 74 73 35 49 6e 64 65 78 49 74 65 72 20  e(Fts5IndexIter 
295b0 2a 70 49 6e 64 65 78 49 74 65 72 29 7b 0a 20 20  *pIndexIter){.  
295c0 69 66 28 20 70 49 6e 64 65 78 49 74 65 72 20 29  if( pIndexIter )
295d0 7b 0a 20 20 20 20 46 74 73 35 49 74 65 72 20 2a  {.    Fts5Iter *
295e0 70 49 74 65 72 20 3d 20 28 46 74 73 35 49 74 65  pIter = (Fts5Ite
295f0 72 2a 29 70 49 6e 64 65 78 49 74 65 72 3b 0a 20  r*)pIndexIter;. 
29600 20 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 49     Fts5Index *pI
29610 6e 64 65 78 20 3d 20 70 49 74 65 72 2d 3e 70 49  ndex = pIter->pI
29620 6e 64 65 78 3b 0a 20 20 20 20 66 74 73 35 4d 75  ndex;.    fts5Mu
29630 6c 74 69 49 74 65 72 46 72 65 65 28 70 49 74 65  ltiIterFree(pIte
29640 72 29 3b 0a 20 20 20 20 66 74 73 35 43 6c 6f 73  r);.    fts5Clos
29650 65 52 65 61 64 65 72 28 70 49 6e 64 65 78 29 3b  eReader(pIndex);
29660 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  .  }.}../*.** Re
29670 61 64 20 61 6e 64 20 64 65 63 6f 64 65 20 74 68  ad and decode th
29680 65 20 22 61 76 65 72 61 67 65 73 22 20 72 65 63  e "averages" rec
29690 6f 72 64 20 66 72 6f 6d 20 74 68 65 20 64 61 74  ord from the dat
296a0 61 62 61 73 65 2e 20 0a 2a 2a 0a 2a 2a 20 50 61  abase. .**.** Pa
296b0 72 61 6d 65 74 65 72 20 61 6e 53 69 7a 65 20 6d  rameter anSize m
296c0 75 73 74 20 70 6f 69 6e 74 20 74 6f 20 61 6e 20  ust point to an 
296d0 61 72 72 61 79 20 6f 66 20 73 69 7a 65 20 6e 43  array of size nC
296e0 6f 6c 2c 20 77 68 65 72 65 20 6e 43 6f 6c 20 69  ol, where nCol i
296f0 73 0a 2a 2a 20 74 68 65 20 6e 75 6d 62 65 72 20  s.** the number 
29700 6f 66 20 75 73 65 72 20 64 65 66 69 6e 65 64 20  of user defined 
29710 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 46  columns in the F
29720 54 53 20 74 61 62 6c 65 2e 0a 2a 2f 0a 69 6e 74  TS table..*/.int
29730 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65   sqlite3Fts5Inde
29740 78 47 65 74 41 76 65 72 61 67 65 73 28 46 74 73  xGetAverages(Fts
29750 35 49 6e 64 65 78 20 2a 70 2c 20 69 36 34 20 2a  5Index *p, i64 *
29760 70 6e 52 6f 77 2c 20 69 36 34 20 2a 61 6e 53 69  pnRow, i64 *anSi
29770 7a 65 29 7b 0a 20 20 69 6e 74 20 6e 43 6f 6c 20  ze){.  int nCol 
29780 3d 20 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e 6e 43  = p->pConfig->nC
29790 6f 6c 3b 0a 20 20 46 74 73 35 44 61 74 61 20 2a  ol;.  Fts5Data *
297a0 70 44 61 74 61 3b 0a 0a 20 20 2a 70 6e 52 6f 77  pData;..  *pnRow
297b0 20 3d 20 30 3b 0a 20 20 6d 65 6d 73 65 74 28 61   = 0;.  memset(a
297c0 6e 53 69 7a 65 2c 20 30 2c 20 73 69 7a 65 6f 66  nSize, 0, sizeof
297d0 28 69 36 34 29 20 2a 20 6e 43 6f 6c 29 3b 0a 20  (i64) * nCol);. 
297e0 20 70 44 61 74 61 20 3d 20 66 74 73 35 44 61 74   pData = fts5Dat
297f0 61 52 65 61 64 28 70 2c 20 46 54 53 35 5f 41 56  aRead(p, FTS5_AV
29800 45 52 41 47 45 53 5f 52 4f 57 49 44 29 3b 0a 20  ERAGES_ROWID);. 
29810 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49   if( p->rc==SQLI
29820 54 45 5f 4f 4b 20 26 26 20 70 44 61 74 61 2d 3e  TE_OK && pData->
29830 6e 6e 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 20  nn ){.    int i 
29840 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 69 43 6f  = 0;.    int iCo
29850 6c 3b 0a 20 20 20 20 69 20 2b 3d 20 66 74 73 35  l;.    i += fts5
29860 47 65 74 56 61 72 69 6e 74 28 26 70 44 61 74 61  GetVarint(&pData
29870 2d 3e 70 5b 69 5d 2c 20 28 75 36 34 2a 29 70 6e  ->p[i], (u64*)pn
29880 52 6f 77 29 3b 0a 20 20 20 20 66 6f 72 28 69 43  Row);.    for(iC
29890 6f 6c 3d 30 3b 20 69 3c 70 44 61 74 61 2d 3e 6e  ol=0; i<pData->n
298a0 6e 20 26 26 20 69 43 6f 6c 3c 6e 43 6f 6c 3b 20  n && iCol<nCol; 
298b0 69 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 69  iCol++){.      i
298c0 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e   += fts5GetVarin
298d0 74 28 26 70 44 61 74 61 2d 3e 70 5b 69 5d 2c 20  t(&pData->p[i], 
298e0 28 75 36 34 2a 29 26 61 6e 53 69 7a 65 5b 69 43  (u64*)&anSize[iC
298f0 6f 6c 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ol]);.    }.  }.
29900 0a 20 20 66 74 73 35 44 61 74 61 52 65 6c 65 61  .  fts5DataRelea
29910 73 65 28 70 44 61 74 61 29 3b 0a 20 20 72 65 74  se(pData);.  ret
29920 75 72 6e 20 66 74 73 35 49 6e 64 65 78 52 65 74  urn fts5IndexRet
29930 75 72 6e 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn(p);.}../*.**
29940 20 52 65 70 6c 61 63 65 20 74 68 65 20 63 75 72   Replace the cur
29950 72 65 6e 74 20 22 61 76 65 72 61 67 65 73 22 20  rent "averages" 
29960 72 65 63 6f 72 64 20 77 69 74 68 20 74 68 65 20  record with the 
29970 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
29980 62 75 66 66 65 72 20 0a 2a 2a 20 73 75 70 70 6c  buffer .** suppl
29990 69 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e  ied as the secon
299a0 64 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 69  d argument..*/.i
299b0 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e  nt sqlite3Fts5In
299c0 64 65 78 53 65 74 41 76 65 72 61 67 65 73 28 46  dexSetAverages(F
299d0 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 63 6f 6e  ts5Index *p, con
299e0 73 74 20 75 38 20 2a 70 44 61 74 61 2c 20 69 6e  st u8 *pData, in
299f0 74 20 6e 44 61 74 61 29 7b 0a 20 20 61 73 73 65  t nData){.  asse
29a00 72 74 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  rt( p->rc==SQLIT
29a10 45 5f 4f 4b 20 29 3b 0a 20 20 66 74 73 35 44 61  E_OK );.  fts5Da
29a20 74 61 57 72 69 74 65 28 70 2c 20 46 54 53 35 5f  taWrite(p, FTS5_
29a30 41 56 45 52 41 47 45 53 5f 52 4f 57 49 44 2c 20  AVERAGES_ROWID, 
29a40 70 44 61 74 61 2c 20 6e 44 61 74 61 29 3b 0a 20  pData, nData);. 
29a50 20 72 65 74 75 72 6e 20 66 74 73 35 49 6e 64 65   return fts5Inde
29a60 78 52 65 74 75 72 6e 28 70 29 3b 0a 7d 0a 0a 2f  xReturn(p);.}../
29a70 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
29a80 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20  total number of 
29a90 62 6c 6f 63 6b 73 20 74 68 69 73 20 6d 6f 64 75  blocks this modu
29aa0 6c 65 20 68 61 73 20 72 65 61 64 20 66 72 6f 6d  le has read from
29ab0 20 74 68 65 20 25 5f 64 61 74 61 0a 2a 2a 20 74   the %_data.** t
29ac0 61 62 6c 65 20 73 69 6e 63 65 20 69 74 20 77 61  able since it wa
29ad0 73 20 63 72 65 61 74 65 64 2e 0a 2a 2f 0a 69 6e  s created..*/.in
29ae0 74 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64  t sqlite3Fts5Ind
29af0 65 78 52 65 61 64 73 28 46 74 73 35 49 6e 64 65  exReads(Fts5Inde
29b00 78 20 2a 70 29 7b 0a 20 20 72 65 74 75 72 6e 20  x *p){.  return 
29b10 70 2d 3e 6e 52 65 61 64 3b 0a 7d 0a 0a 2f 2a 0a  p->nRead;.}../*.
29b20 2a 2a 20 53 65 74 20 74 68 65 20 33 32 2d 62 69  ** Set the 32-bi
29b30 74 20 63 6f 6f 6b 69 65 20 76 61 6c 75 65 20 73  t cookie value s
29b40 74 6f 72 65 64 20 61 74 20 74 68 65 20 73 74 61  tored at the sta
29b50 72 74 20 6f 66 20 61 6c 6c 20 73 74 72 75 63 74  rt of all struct
29b60 75 72 65 20 0a 2a 2a 20 72 65 63 6f 72 64 73 20  ure .** records 
29b70 74 6f 20 74 68 65 20 76 61 6c 75 65 20 70 61 73  to the value pas
29b80 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e  sed as the secon
29b90 64 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a  d argument..**.*
29ba0 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  * Return SQLITE_
29bb0 4f 4b 20 69 66 20 73 75 63 63 65 73 73 66 75 6c  OK if successful
29bc0 2c 20 6f 72 20 61 6e 20 53 51 4c 69 74 65 20 65  , or an SQLite e
29bd0 72 72 6f 72 20 63 6f 64 65 20 69 66 20 61 6e 20  rror code if an 
29be0 65 72 72 6f 72 0a 2a 2a 20 6f 63 63 75 72 73 2e  error.** occurs.
29bf0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46  .*/.int sqlite3F
29c00 74 73 35 49 6e 64 65 78 53 65 74 43 6f 6f 6b 69  ts5IndexSetCooki
29c10 65 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20  e(Fts5Index *p, 
29c20 69 6e 74 20 69 4e 65 77 29 7b 0a 20 20 69 6e 74  int iNew){.  int
29c30 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
29c40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29c50 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
29c60 20 2a 2f 0a 20 20 46 74 73 35 43 6f 6e 66 69 67   */.  Fts5Config
29c70 20 2a 70 43 6f 6e 66 69 67 20 3d 20 70 2d 3e 70   *pConfig = p->p
29c80 43 6f 6e 66 69 67 3b 20 20 20 20 2f 2a 20 43 6f  Config;    /* Co
29c90 6e 66 69 67 75 72 61 74 69 6f 6e 20 6f 62 6a 65  nfiguration obje
29ca0 63 74 20 2a 2f 0a 20 20 75 38 20 61 43 6f 6f 6b  ct */.  u8 aCook
29cb0 69 65 5b 34 5d 3b 20 20 20 20 20 20 20 20 20 20  ie[4];          
29cc0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
29cd0 42 69 6e 61 72 79 20 72 65 70 72 65 73 65 6e 74  Binary represent
29ce0 61 74 69 6f 6e 20 6f 66 20 69 4e 65 77 20 2a 2f  ation of iNew */
29cf0 0a 20 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62 20  .  sqlite3_blob 
29d00 2a 70 42 6c 6f 62 20 3d 20 30 3b 0a 0a 20 20 61  *pBlob = 0;..  a
29d10 73 73 65 72 74 28 20 70 2d 3e 72 63 3d 3d 53 51  ssert( p->rc==SQ
29d20 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 73 71 6c  LITE_OK );.  sql
29d30 69 74 65 33 46 74 73 35 50 75 74 33 32 28 61 43  ite3Fts5Put32(aC
29d40 6f 6f 6b 69 65 2c 20 69 4e 65 77 29 3b 0a 0a 20  ookie, iNew);.. 
29d50 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 62 6c   rc = sqlite3_bl
29d60 6f 62 5f 6f 70 65 6e 28 70 43 6f 6e 66 69 67 2d  ob_open(pConfig-
29d70 3e 64 62 2c 20 70 43 6f 6e 66 69 67 2d 3e 7a 44  >db, pConfig->zD
29d80 62 2c 20 70 2d 3e 7a 44 61 74 61 54 62 6c 2c 20  b, p->zDataTbl, 
29d90 0a 20 20 20 20 20 20 22 62 6c 6f 63 6b 22 2c 20  .      "block", 
29da0 46 54 53 35 5f 53 54 52 55 43 54 55 52 45 5f 52  FTS5_STRUCTURE_R
29db0 4f 57 49 44 2c 20 31 2c 20 26 70 42 6c 6f 62 0a  OWID, 1, &pBlob.
29dc0 20 20 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53    );.  if( rc==S
29dd0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
29de0 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 77 72 69  sqlite3_blob_wri
29df0 74 65 28 70 42 6c 6f 62 2c 20 61 43 6f 6f 6b 69  te(pBlob, aCooki
29e00 65 2c 20 34 2c 20 30 29 3b 0a 20 20 20 20 72 63  e, 4, 0);.    rc
29e10 20 3d 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f   = sqlite3_blob_
29e20 63 6c 6f 73 65 28 70 42 6c 6f 62 29 3b 0a 20 20  close(pBlob);.  
29e30 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  }..  return rc;.
29e40 7d 0a 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74  }..int sqlite3Ft
29e50 73 35 49 6e 64 65 78 4c 6f 61 64 43 6f 6e 66 69  s5IndexLoadConfi
29e60 67 28 46 74 73 35 49 6e 64 65 78 20 2a 70 29 7b  g(Fts5Index *p){
29e70 0a 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65  .  Fts5Structure
29e80 20 2a 70 53 74 72 75 63 74 3b 0a 20 20 70 53 74   *pStruct;.  pSt
29e90 72 75 63 74 20 3d 20 66 74 73 35 53 74 72 75 63  ruct = fts5Struc
29ea0 74 75 72 65 52 65 61 64 28 70 29 3b 0a 20 20 66  tureRead(p);.  f
29eb0 74 73 35 53 74 72 75 63 74 75 72 65 52 65 6c 65  ts5StructureRele
29ec0 61 73 65 28 70 53 74 72 75 63 74 29 3b 0a 20 20  ase(pStruct);.  
29ed0 72 65 74 75 72 6e 20 66 74 73 35 49 6e 64 65 78  return fts5Index
29ee0 52 65 74 75 72 6e 28 70 29 3b 0a 7d 0a 0a 0a 2f  Return(p);.}.../
29ef0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
29f00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
29f10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
29f20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
29f30 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a  *********.******
29f40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
29f50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
29f60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
29f70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
29f80 2a 2a 2a 2a 0a 2a 2a 20 42 65 6c 6f 77 20 74 68  ****.** Below th
29f90 69 73 20 70 6f 69 6e 74 20 69 73 20 74 68 65 20  is point is the 
29fa0 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f  implementation o
29fb0 66 20 74 68 65 20 69 6e 74 65 67 72 69 74 79 2d  f the integrity-
29fc0 63 68 65 63 6b 20 0a 2a 2a 20 66 75 6e 63 74 69  check .** functi
29fd0 6f 6e 61 6c 69 74 79 2e 0a 2a 2f 0a 0a 2f 2a 0a  onality..*/../*.
29fe0 2a 2a 20 52 65 74 75 72 6e 20 61 20 73 69 6d 70  ** Return a simp
29ff0 6c 65 20 63 68 65 63 6b 73 75 6d 20 76 61 6c 75  le checksum valu
2a000 65 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20 61  e based on the a
2a010 72 67 75 6d 65 6e 74 73 2e 0a 2a 2f 0a 75 36 34  rguments..*/.u64
2a020 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65   sqlite3Fts5Inde
2a030 78 45 6e 74 72 79 43 6b 73 75 6d 28 0a 20 20 69  xEntryCksum(.  i
2a040 36 34 20 69 52 6f 77 69 64 2c 20 0a 20 20 69 6e  64 iRowid, .  in
2a050 74 20 69 43 6f 6c 2c 20 0a 20 20 69 6e 74 20 69  t iCol, .  int i
2a060 50 6f 73 2c 20 0a 20 20 69 6e 74 20 69 49 64 78  Pos, .  int iIdx
2a070 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ,.  const char *
2a080 70 54 65 72 6d 2c 0a 20 20 69 6e 74 20 6e 54 65  pTerm,.  int nTe
2a090 72 6d 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  rm.){.  int i;. 
2a0a0 20 75 36 34 20 72 65 74 20 3d 20 69 52 6f 77 69   u64 ret = iRowi
2a0b0 64 3b 0a 20 20 72 65 74 20 2b 3d 20 28 72 65 74  d;.  ret += (ret
2a0c0 3c 3c 33 29 20 2b 20 69 43 6f 6c 3b 0a 20 20 72  <<3) + iCol;.  r
2a0d0 65 74 20 2b 3d 20 28 72 65 74 3c 3c 33 29 20 2b  et += (ret<<3) +
2a0e0 20 69 50 6f 73 3b 0a 20 20 69 66 28 20 69 49 64   iPos;.  if( iId
2a0f0 78 3e 3d 30 20 29 20 72 65 74 20 2b 3d 20 28 72  x>=0 ) ret += (r
2a100 65 74 3c 3c 33 29 20 2b 20 28 46 54 53 35 5f 4d  et<<3) + (FTS5_M
2a110 41 49 4e 5f 50 52 45 46 49 58 20 2b 20 69 49 64  AIN_PREFIX + iId
2a120 78 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  x);.  for(i=0; i
2a130 3c 6e 54 65 72 6d 3b 20 69 2b 2b 29 20 72 65 74  <nTerm; i++) ret
2a140 20 2b 3d 20 28 72 65 74 3c 3c 33 29 20 2b 20 70   += (ret<<3) + p
2a150 54 65 72 6d 5b 69 5d 3b 0a 20 20 72 65 74 75 72  Term[i];.  retur
2a160 6e 20 72 65 74 3b 0a 7d 0a 0a 23 69 66 64 65 66  n ret;.}..#ifdef
2a170 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a   SQLITE_DEBUG./*
2a180 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
2a190 6e 20 69 73 20 70 75 72 65 6c 79 20 61 6e 20 69  n is purely an i
2a1a0 6e 74 65 72 6e 61 6c 20 74 65 73 74 2e 20 49 74  nternal test. It
2a1b0 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6e 74 72 69   does not contri
2a1c0 62 75 74 65 20 74 6f 20 0a 2a 2a 20 46 54 53 20  bute to .** FTS 
2a1d0 66 75 6e 63 74 69 6f 6e 61 6c 69 74 79 2c 20 6f  functionality, o
2a1e0 72 20 65 76 65 6e 20 74 68 65 20 69 6e 74 65 67  r even the integ
2a1f0 72 69 74 79 2d 63 68 65 63 6b 2c 20 69 6e 20 61  rity-check, in a
2a200 6e 79 20 77 61 79 2e 0a 2a 2a 0a 2a 2a 20 49 6e  ny way..**.** In
2a210 73 74 65 61 64 2c 20 69 74 20 74 65 73 74 73 20  stead, it tests 
2a220 74 68 61 74 20 74 68 65 20 73 61 6d 65 20 73 65  that the same se
2a230 74 20 6f 66 20 70 67 6e 6f 2f 72 6f 77 69 64 20  t of pgno/rowid 
2a240 63 6f 6d 62 69 6e 61 74 69 6f 6e 73 20 61 72 65  combinations are
2a250 20 0a 2a 2a 20 76 69 73 69 74 65 64 20 72 65 67   .** visited reg
2a260 61 72 64 6c 65 73 73 20 6f 66 20 77 68 65 74 68  ardless of wheth
2a270 65 72 20 74 68 65 20 64 6f 63 6c 69 73 74 2d 69  er the doclist-i
2a280 6e 64 65 78 20 69 64 65 6e 74 69 66 69 65 64 20  ndex identified 
2a290 62 79 20 70 61 72 61 6d 65 74 65 72 73 0a 2a 2a  by parameters.**
2a2a0 20 69 53 65 67 69 64 2f 69 4c 65 61 66 20 69 73   iSegid/iLeaf is
2a2b0 20 69 74 65 72 61 74 65 64 20 69 6e 20 66 6f 72   iterated in for
2a2c0 77 61 72 64 73 20 6f 72 20 72 65 76 65 72 73 65  wards or reverse
2a2d0 20 6f 72 64 65 72 2e 0a 2a 2f 0a 73 74 61 74 69   order..*/.stati
2a2e0 63 20 76 6f 69 64 20 66 74 73 35 54 65 73 74 44  c void fts5TestD
2a2f0 6c 69 64 78 52 65 76 65 72 73 65 28 0a 20 20 46  lidxReverse(.  F
2a300 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 0a 20 20  ts5Index *p, .  
2a310 69 6e 74 20 69 53 65 67 69 64 2c 20 20 20 20 20  int iSegid,     
2a320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a330 2f 2a 20 53 65 67 6d 65 6e 74 20 69 64 20 74 6f  /* Segment id to
2a340 20 6c 6f 61 64 20 66 72 6f 6d 20 2a 2f 0a 20 20   load from */.  
2a350 69 6e 74 20 69 4c 65 61 66 20 20 20 20 20 20 20  int iLeaf       
2a360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a370 2f 2a 20 4c 6f 61 64 20 64 6f 63 6c 69 73 74 2d  /* Load doclist-
2a380 69 6e 64 65 78 20 66 6f 72 20 74 68 69 73 20 6c  index for this l
2a390 65 61 66 20 2a 2f 0a 29 7b 0a 20 20 46 74 73 35  eaf */.){.  Fts5
2a3a0 44 6c 69 64 78 49 74 65 72 20 2a 70 44 6c 69 64  DlidxIter *pDlid
2a3b0 78 20 3d 20 30 3b 0a 20 20 75 36 34 20 63 6b 73  x = 0;.  u64 cks
2a3c0 75 6d 31 20 3d 20 31 33 3b 0a 20 20 75 36 34 20  um1 = 13;.  u64 
2a3d0 63 6b 73 75 6d 32 20 3d 20 31 33 3b 0a 0a 20 20  cksum2 = 13;..  
2a3e0 66 6f 72 28 70 44 6c 69 64 78 3d 66 74 73 35 44  for(pDlidx=fts5D
2a3f0 6c 69 64 78 49 74 65 72 49 6e 69 74 28 70 2c 20  lidxIterInit(p, 
2a400 30 2c 20 69 53 65 67 69 64 2c 20 69 4c 65 61 66  0, iSegid, iLeaf
2a410 29 3b 0a 20 20 20 20 20 20 66 74 73 35 44 6c 69  );.      fts5Dli
2a420 64 78 49 74 65 72 45 6f 66 28 70 2c 20 70 44 6c  dxIterEof(p, pDl
2a430 69 64 78 29 3d 3d 30 3b 0a 20 20 20 20 20 20 66  idx)==0;.      f
2a440 74 73 35 44 6c 69 64 78 49 74 65 72 4e 65 78 74  ts5DlidxIterNext
2a450 28 70 2c 20 70 44 6c 69 64 78 29 0a 20 20 29 7b  (p, pDlidx).  ){
2a460 0a 20 20 20 20 69 36 34 20 69 52 6f 77 69 64 20  .    i64 iRowid 
2a470 3d 20 66 74 73 35 44 6c 69 64 78 49 74 65 72 52  = fts5DlidxIterR
2a480 6f 77 69 64 28 70 44 6c 69 64 78 29 3b 0a 20 20  owid(pDlidx);.  
2a490 20 20 69 6e 74 20 70 67 6e 6f 20 3d 20 66 74 73    int pgno = fts
2a4a0 35 44 6c 69 64 78 49 74 65 72 50 67 6e 6f 28 70  5DlidxIterPgno(p
2a4b0 44 6c 69 64 78 29 3b 0a 20 20 20 20 61 73 73 65  Dlidx);.    asse
2a4c0 72 74 28 20 70 67 6e 6f 3e 69 4c 65 61 66 20 29  rt( pgno>iLeaf )
2a4d0 3b 0a 20 20 20 20 63 6b 73 75 6d 31 20 2b 3d 20  ;.    cksum1 += 
2a4e0 69 52 6f 77 69 64 20 2b 20 28 28 69 36 34 29 70  iRowid + ((i64)p
2a4f0 67 6e 6f 3c 3c 33 32 29 3b 0a 20 20 7d 0a 20 20  gno<<32);.  }.  
2a500 66 74 73 35 44 6c 69 64 78 49 74 65 72 46 72 65  fts5DlidxIterFre
2a510 65 28 70 44 6c 69 64 78 29 3b 0a 20 20 70 44 6c  e(pDlidx);.  pDl
2a520 69 64 78 20 3d 20 30 3b 0a 0a 20 20 66 6f 72 28  idx = 0;..  for(
2a530 70 44 6c 69 64 78 3d 66 74 73 35 44 6c 69 64 78  pDlidx=fts5Dlidx
2a540 49 74 65 72 49 6e 69 74 28 70 2c 20 31 2c 20 69  IterInit(p, 1, i
2a550 53 65 67 69 64 2c 20 69 4c 65 61 66 29 3b 0a 20  Segid, iLeaf);. 
2a560 20 20 20 20 20 66 74 73 35 44 6c 69 64 78 49 74       fts5DlidxIt
2a570 65 72 45 6f 66 28 70 2c 20 70 44 6c 69 64 78 29  erEof(p, pDlidx)
2a580 3d 3d 30 3b 0a 20 20 20 20 20 20 66 74 73 35 44  ==0;.      fts5D
2a590 6c 69 64 78 49 74 65 72 50 72 65 76 28 70 2c 20  lidxIterPrev(p, 
2a5a0 70 44 6c 69 64 78 29 0a 20 20 29 7b 0a 20 20 20  pDlidx).  ){.   
2a5b0 20 69 36 34 20 69 52 6f 77 69 64 20 3d 20 66 74   i64 iRowid = ft
2a5c0 73 35 44 6c 69 64 78 49 74 65 72 52 6f 77 69 64  s5DlidxIterRowid
2a5d0 28 70 44 6c 69 64 78 29 3b 0a 20 20 20 20 69 6e  (pDlidx);.    in
2a5e0 74 20 70 67 6e 6f 20 3d 20 66 74 73 35 44 6c 69  t pgno = fts5Dli
2a5f0 64 78 49 74 65 72 50 67 6e 6f 28 70 44 6c 69 64  dxIterPgno(pDlid
2a600 78 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  x);.    assert( 
2a610 66 74 73 35 44 6c 69 64 78 49 74 65 72 50 67 6e  fts5DlidxIterPgn
2a620 6f 28 70 44 6c 69 64 78 29 3e 69 4c 65 61 66 20  o(pDlidx)>iLeaf 
2a630 29 3b 0a 20 20 20 20 63 6b 73 75 6d 32 20 2b 3d  );.    cksum2 +=
2a640 20 69 52 6f 77 69 64 20 2b 20 28 28 69 36 34 29   iRowid + ((i64)
2a650 70 67 6e 6f 3c 3c 33 32 29 3b 0a 20 20 7d 0a 20  pgno<<32);.  }. 
2a660 20 66 74 73 35 44 6c 69 64 78 49 74 65 72 46 72   fts5DlidxIterFr
2a670 65 65 28 70 44 6c 69 64 78 29 3b 0a 20 20 70 44  ee(pDlidx);.  pD
2a680 6c 69 64 78 20 3d 20 30 3b 0a 0a 20 20 69 66 28  lidx = 0;..  if(
2a690 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
2a6a0 4b 20 26 26 20 63 6b 73 75 6d 31 21 3d 63 6b 73  K && cksum1!=cks
2a6b0 75 6d 32 20 29 20 70 2d 3e 72 63 20 3d 20 46 54  um2 ) p->rc = FT
2a6c0 53 35 5f 43 4f 52 52 55 50 54 3b 0a 7d 0a 0a 73  S5_CORRUPT;.}..s
2a6d0 74 61 74 69 63 20 69 6e 74 20 66 74 73 35 51 75  tatic int fts5Qu
2a6e0 65 72 79 43 6b 73 75 6d 28 0a 20 20 46 74 73 35  eryCksum(.  Fts5
2a6f0 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20  Index *p,       
2a700 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
2a710 74 73 35 20 69 6e 64 65 78 20 6f 62 6a 65 63 74  ts5 index object
2a720 20 2a 2f 0a 20 20 69 6e 74 20 69 49 64 78 2c 0a   */.  int iIdx,.
2a730 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 2c    const char *z,
2a740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a750 20 20 2f 2a 20 49 6e 64 65 78 20 6b 65 79 20 74    /* Index key t
2a760 6f 20 71 75 65 72 79 20 66 6f 72 20 2a 2f 0a 20  o query for */. 
2a770 20 69 6e 74 20 6e 2c 20 20 20 20 20 20 20 20 20   int n,         
2a780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a790 20 2f 2a 20 53 69 7a 65 20 6f 66 20 69 6e 64 65   /* Size of inde
2a7a0 78 20 6b 65 79 20 69 6e 20 62 79 74 65 73 20 2a  x key in bytes *
2a7b0 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c 20 20  /.  int flags,  
2a7c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a7d0 20 20 20 20 2f 2a 20 46 6c 61 67 73 20 66 6f 72      /* Flags for
2a7e0 20 46 74 73 35 49 6e 64 65 78 51 75 65 72 79 20   Fts5IndexQuery 
2a7f0 2a 2f 0a 20 20 75 36 34 20 2a 70 43 6b 73 75 6d  */.  u64 *pCksum
2a800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a810 20 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20       /* IN/OUT: 
2a820 43 68 65 63 6b 73 75 6d 20 76 61 6c 75 65 20 2a  Checksum value *
2a830 2f 0a 29 7b 0a 20 20 69 6e 74 20 65 44 65 74 61  /.){.  int eDeta
2a840 69 6c 20 3d 20 70 2d 3e 70 43 6f 6e 66 69 67 2d  il = p->pConfig-
2a850 3e 65 44 65 74 61 69 6c 3b 0a 20 20 75 36 34 20  >eDetail;.  u64 
2a860 63 6b 73 75 6d 20 3d 20 2a 70 43 6b 73 75 6d 3b  cksum = *pCksum;
2a870 0a 20 20 46 74 73 35 49 6e 64 65 78 49 74 65 72  .  Fts5IndexIter
2a880 20 2a 70 49 74 65 72 20 3d 20 30 3b 0a 20 20 69   *pIter = 0;.  i
2a890 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33 46  nt rc = sqlite3F
2a8a0 74 73 35 49 6e 64 65 78 51 75 65 72 79 28 70 2c  ts5IndexQuery(p,
2a8b0 20 7a 2c 20 6e 2c 20 66 6c 61 67 73 2c 20 30 2c   z, n, flags, 0,
2a8c0 20 26 70 49 74 65 72 29 3b 0a 0a 20 20 77 68 69   &pIter);..  whi
2a8d0 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  le( rc==SQLITE_O
2a8e0 4b 20 26 26 20 30 3d 3d 73 71 6c 69 74 65 33 46  K && 0==sqlite3F
2a8f0 74 73 35 49 74 65 72 45 6f 66 28 70 49 74 65 72  ts5IterEof(pIter
2a900 29 20 29 7b 0a 20 20 20 20 69 36 34 20 72 6f 77  ) ){.    i64 row
2a910 69 64 20 3d 20 70 49 74 65 72 2d 3e 69 52 6f 77  id = pIter->iRow
2a920 69 64 3b 0a 0a 20 20 20 20 69 66 28 20 65 44 65  id;..    if( eDe
2a930 74 61 69 6c 3d 3d 46 54 53 35 5f 44 45 54 41 49  tail==FTS5_DETAI
2a940 4c 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20  L_NONE ){.      
2a950 63 6b 73 75 6d 20 5e 3d 20 73 71 6c 69 74 65 33  cksum ^= sqlite3
2a960 46 74 73 35 49 6e 64 65 78 45 6e 74 72 79 43 6b  Fts5IndexEntryCk
2a970 73 75 6d 28 72 6f 77 69 64 2c 20 30 2c 20 30 2c  sum(rowid, 0, 0,
2a980 20 69 49 64 78 2c 20 7a 2c 20 6e 29 3b 0a 20 20   iIdx, z, n);.  
2a990 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 46    }else{.      F
2a9a0 74 73 35 50 6f 73 6c 69 73 74 52 65 61 64 65 72  ts5PoslistReader
2a9b0 20 73 52 65 61 64 65 72 3b 0a 20 20 20 20 20 20   sReader;.      
2a9c0 66 6f 72 28 73 71 6c 69 74 65 33 46 74 73 35 50  for(sqlite3Fts5P
2a9d0 6f 73 6c 69 73 74 52 65 61 64 65 72 49 6e 69 74  oslistReaderInit
2a9e0 28 70 49 74 65 72 2d 3e 70 44 61 74 61 2c 20 70  (pIter->pData, p
2a9f0 49 74 65 72 2d 3e 6e 44 61 74 61 2c 20 26 73 52  Iter->nData, &sR
2aa00 65 61 64 65 72 29 3b 0a 20 20 20 20 20 20 20 20  eader);.        
2aa10 20 20 73 52 65 61 64 65 72 2e 62 45 6f 66 3d 3d    sReader.bEof==
2aa20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  0;.          sql
2aa30 69 74 65 33 46 74 73 35 50 6f 73 6c 69 73 74 52  ite3Fts5PoslistR
2aa40 65 61 64 65 72 4e 65 78 74 28 26 73 52 65 61 64  eaderNext(&sRead
2aa50 65 72 29 0a 20 20 20 20 20 20 29 7b 0a 20 20 20  er).      ){.   
2aa60 20 20 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20       int iCol = 
2aa70 46 54 53 35 5f 50 4f 53 32 43 4f 4c 55 4d 4e 28  FTS5_POS2COLUMN(
2aa80 73 52 65 61 64 65 72 2e 69 50 6f 73 29 3b 0a 20  sReader.iPos);. 
2aa90 20 20 20 20 20 20 20 69 6e 74 20 69 4f 66 66 20         int iOff 
2aaa0 3d 20 46 54 53 35 5f 50 4f 53 32 4f 46 46 53 45  = FTS5_POS2OFFSE
2aab0 54 28 73 52 65 61 64 65 72 2e 69 50 6f 73 29 3b  T(sReader.iPos);
2aac0 0a 20 20 20 20 20 20 20 20 63 6b 73 75 6d 20 5e  .        cksum ^
2aad0 3d 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64  = sqlite3Fts5Ind
2aae0 65 78 45 6e 74 72 79 43 6b 73 75 6d 28 72 6f 77  exEntryCksum(row
2aaf0 69 64 2c 20 69 43 6f 6c 2c 20 69 4f 66 66 2c 20  id, iCol, iOff, 
2ab00 69 49 64 78 2c 20 7a 2c 20 6e 29 3b 0a 20 20 20  iIdx, z, n);.   
2ab10 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
2ab20 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
2ab30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   ){.      rc = s
2ab40 71 6c 69 74 65 33 46 74 73 35 49 74 65 72 4e 65  qlite3Fts5IterNe
2ab50 78 74 28 70 49 74 65 72 29 3b 0a 20 20 20 20 7d  xt(pIter);.    }
2ab60 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 46 74  .  }.  sqlite3Ft
2ab70 73 35 49 74 65 72 43 6c 6f 73 65 28 70 49 74 65  s5IterClose(pIte
2ab80 72 29 3b 0a 0a 20 20 2a 70 43 6b 73 75 6d 20 3d  r);..  *pCksum =
2ab90 20 63 6b 73 75 6d 3b 0a 20 20 72 65 74 75 72 6e   cksum;.  return
2aba0 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54   rc;.}.../*.** T
2abb0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
2abc0 61 6c 73 6f 20 70 75 72 65 6c 79 20 61 6e 20 69  also purely an i
2abd0 6e 74 65 72 6e 61 6c 20 74 65 73 74 2e 20 49 74  nternal test. It
2abe0 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6e 74 72 69   does not contri
2abf0 62 75 74 65 20 74 6f 20 0a 2a 2a 20 46 54 53 20  bute to .** FTS 
2ac00 66 75 6e 63 74 69 6f 6e 61 6c 69 74 79 2c 20 6f  functionality, o
2ac10 72 20 65 76 65 6e 20 74 68 65 20 69 6e 74 65 67  r even the integ
2ac20 72 69 74 79 2d 63 68 65 63 6b 2c 20 69 6e 20 61  rity-check, in a
2ac30 6e 79 20 77 61 79 2e 0a 2a 2f 0a 73 74 61 74 69  ny way..*/.stati
2ac40 63 20 76 6f 69 64 20 66 74 73 35 54 65 73 74 54  c void fts5TestT
2ac50 65 72 6d 28 0a 20 20 46 74 73 35 49 6e 64 65 78  erm(.  Fts5Index
2ac60 20 2a 70 2c 20 0a 20 20 46 74 73 35 42 75 66 66   *p, .  Fts5Buff
2ac70 65 72 20 2a 70 50 72 65 76 2c 20 20 20 20 20 20  er *pPrev,      
2ac80 20 20 20 20 20 20 20 20 2f 2a 20 50 72 65 76 69          /* Previ
2ac90 6f 75 73 20 74 65 72 6d 20 2a 2f 0a 20 20 63 6f  ous term */.  co
2aca0 6e 73 74 20 63 68 61 72 20 2a 7a 2c 20 69 6e 74  nst char *z, int
2acb0 20 6e 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a   n,           /*
2acc0 20 50 6f 73 73 69 62 6c 79 20 6e 65 77 20 74 65   Possibly new te
2acd0 72 6d 20 74 6f 20 74 65 73 74 20 2a 2f 0a 20 20  rm to test */.  
2ace0 75 36 34 20 65 78 70 65 63 74 65 64 2c 0a 20 20  u64 expected,.  
2acf0 75 36 34 20 2a 70 43 6b 73 75 6d 0a 29 7b 0a 20  u64 *pCksum.){. 
2ad00 20 69 6e 74 20 72 63 20 3d 20 70 2d 3e 72 63 3b   int rc = p->rc;
2ad10 0a 20 20 69 66 28 20 70 50 72 65 76 2d 3e 6e 3d  .  if( pPrev->n=
2ad20 3d 30 20 29 7b 0a 20 20 20 20 66 74 73 35 42 75  =0 ){.    fts5Bu
2ad30 66 66 65 72 53 65 74 28 26 72 63 2c 20 70 50 72  fferSet(&rc, pPr
2ad40 65 76 2c 20 6e 2c 20 28 63 6f 6e 73 74 20 75 38  ev, n, (const u8
2ad50 2a 29 7a 29 3b 0a 20 20 7d 65 6c 73 65 0a 20 20  *)z);.  }else.  
2ad60 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
2ad70 4b 20 26 26 20 28 70 50 72 65 76 2d 3e 6e 21 3d  K && (pPrev->n!=
2ad80 6e 20 7c 7c 20 6d 65 6d 63 6d 70 28 70 50 72 65  n || memcmp(pPre
2ad90 76 2d 3e 70 2c 20 7a 2c 20 6e 29 29 20 29 7b 0a  v->p, z, n)) ){.
2ada0 20 20 20 20 75 36 34 20 63 6b 73 75 6d 33 20 3d      u64 cksum3 =
2adb0 20 2a 70 43 6b 73 75 6d 3b 0a 20 20 20 20 63 6f   *pCksum;.    co
2adc0 6e 73 74 20 63 68 61 72 20 2a 7a 54 65 72 6d 20  nst char *zTerm 
2add0 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 26  = (const char*)&
2ade0 70 50 72 65 76 2d 3e 70 5b 31 5d 3b 20 20 2f 2a  pPrev->p[1];  /*
2adf0 20 74 65 72 6d 20 73 61 6e 73 20 70 72 65 66 69   term sans prefi
2ae00 78 2d 62 79 74 65 20 2a 2f 0a 20 20 20 20 69 6e  x-byte */.    in
2ae10 74 20 6e 54 65 72 6d 20 3d 20 70 50 72 65 76 2d  t nTerm = pPrev-
2ae20 3e 6e 2d 31 3b 20 20 20 20 20 20 20 20 20 20 20  >n-1;           
2ae30 20 2f 2a 20 53 69 7a 65 20 6f 66 20 7a 54 65 72   /* Size of zTer
2ae40 6d 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20  m in bytes */.  
2ae50 20 20 69 6e 74 20 69 49 64 78 20 3d 20 28 70 50    int iIdx = (pP
2ae60 72 65 76 2d 3e 70 5b 30 5d 20 2d 20 46 54 53 35  rev->p[0] - FTS5
2ae70 5f 4d 41 49 4e 5f 50 52 45 46 49 58 29 3b 0a 20  _MAIN_PREFIX);. 
2ae80 20 20 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 28     int flags = (
2ae90 69 49 64 78 3d 3d 30 20 3f 20 30 20 3a 20 46 54  iIdx==0 ? 0 : FT
2aea0 53 35 49 4e 44 45 58 5f 51 55 45 52 59 5f 50 52  S5INDEX_QUERY_PR
2aeb0 45 46 49 58 29 3b 0a 20 20 20 20 75 36 34 20 63  EFIX);.    u64 c
2aec0 6b 31 20 3d 20 30 3b 0a 20 20 20 20 75 36 34 20  k1 = 0;.    u64 
2aed0 63 6b 32 20 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a  ck2 = 0;..    /*
2aee0 20 43 68 65 63 6b 20 74 68 61 74 20 74 68 65 20   Check that the 
2aef0 72 65 73 75 6c 74 73 20 72 65 74 75 72 6e 65 64  results returned
2af00 20 66 6f 72 20 41 53 43 20 61 6e 64 20 44 45 53   for ASC and DES
2af10 43 20 71 75 65 72 69 65 73 20 61 72 65 0a 20 20  C queries are.  
2af20 20 20 2a 2a 20 74 68 65 20 73 61 6d 65 2e 20 49    ** the same. I
2af30 66 20 6e 6f 74 2c 20 63 61 6c 6c 20 74 68 69 73  f not, call this
2af40 20 63 6f 72 72 75 70 74 69 6f 6e 2e 20 20 2a 2f   corruption.  */
2af50 0a 20 20 20 20 72 63 20 3d 20 66 74 73 35 51 75  .    rc = fts5Qu
2af60 65 72 79 43 6b 73 75 6d 28 70 2c 20 69 49 64 78  eryCksum(p, iIdx
2af70 2c 20 7a 54 65 72 6d 2c 20 6e 54 65 72 6d 2c 20  , zTerm, nTerm, 
2af80 66 6c 61 67 73 2c 20 26 63 6b 31 29 3b 0a 20 20  flags, &ck1);.  
2af90 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
2afa0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  _OK ){.      int
2afb0 20 66 20 3d 20 66 6c 61 67 73 7c 46 54 53 35 49   f = flags|FTS5I
2afc0 4e 44 45 58 5f 51 55 45 52 59 5f 44 45 53 43 3b  NDEX_QUERY_DESC;
2afd0 0a 20 20 20 20 20 20 72 63 20 3d 20 66 74 73 35  .      rc = fts5
2afe0 51 75 65 72 79 43 6b 73 75 6d 28 70 2c 20 69 49  QueryCksum(p, iI
2aff0 64 78 2c 20 7a 54 65 72 6d 2c 20 6e 54 65 72 6d  dx, zTerm, nTerm
2b000 2c 20 66 2c 20 26 63 6b 32 29 3b 0a 20 20 20 20  , f, &ck2);.    
2b010 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  }.    if( rc==SQ
2b020 4c 49 54 45 5f 4f 4b 20 26 26 20 63 6b 31 21 3d  LITE_OK && ck1!=
2b030 63 6b 32 20 29 20 72 63 20 3d 20 46 54 53 35 5f  ck2 ) rc = FTS5_
2b040 43 4f 52 52 55 50 54 3b 0a 0a 20 20 20 20 2f 2a  CORRUPT;..    /*
2b050 20 49 66 20 74 68 69 73 20 69 73 20 61 20 70 72   If this is a pr
2b060 65 66 69 78 20 71 75 65 72 79 2c 20 63 68 65 63  efix query, chec
2b070 6b 20 74 68 61 74 20 74 68 65 20 72 65 73 75 6c  k that the resul
2b080 74 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 74  ts returned if t
2b090 68 65 0a 20 20 20 20 2a 2a 20 74 68 65 20 69 6e  he.    ** the in
2b0a0 64 65 78 20 69 73 20 64 69 73 61 62 6c 65 64 20  dex is disabled 
2b0b0 61 72 65 20 74 68 65 20 73 61 6d 65 2e 20 49 6e  are the same. In
2b0c0 20 62 6f 74 68 20 41 53 43 20 61 6e 64 20 44 45   both ASC and DE
2b0d0 53 43 20 6f 72 64 65 72 2e 20 0a 20 20 20 20 2a  SC order. .    *
2b0e0 2a 0a 20 20 20 20 2a 2a 20 54 68 69 73 20 63 68  *.    ** This ch
2b0f0 65 63 6b 20 6d 61 79 20 6f 6e 6c 79 20 62 65 20  eck may only be 
2b100 70 65 72 66 6f 72 6d 65 64 20 69 66 20 74 68 65  performed if the
2b110 20 68 61 73 68 20 74 61 62 6c 65 20 69 73 20 65   hash table is e
2b120 6d 70 74 79 2e 20 54 68 69 73 0a 20 20 20 20 2a  mpty. This.    *
2b130 2a 20 69 73 20 62 65 63 61 75 73 65 20 74 68 65  * is because the
2b140 20 68 61 73 68 20 74 61 62 6c 65 20 6f 6e 6c 79   hash table only
2b150 20 73 75 70 70 6f 72 74 73 20 61 20 73 69 6e 67   supports a sing
2b160 6c 65 20 73 63 61 6e 20 71 75 65 72 79 20 61 74  le scan query at
2b170 0a 20 20 20 20 2a 2a 20 61 20 74 69 6d 65 2c 20  .    ** a time, 
2b180 61 6e 64 20 74 68 65 20 6d 75 6c 74 69 2d 69 74  and the multi-it
2b190 65 72 20 6c 6f 6f 70 20 66 72 6f 6d 20 77 68 69  er loop from whi
2b1a0 63 68 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  ch this function
2b1b0 20 69 73 20 63 61 6c 6c 65 64 0a 20 20 20 20 2a   is called.    *
2b1c0 2a 20 69 73 20 61 6c 72 65 61 64 79 20 70 65 72  * is already per
2b1d0 66 6f 72 6d 69 6e 67 20 73 75 63 68 20 61 20 73  forming such a s
2b1e0 63 61 6e 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20  can. */.    if( 
2b1f0 70 2d 3e 6e 50 65 6e 64 69 6e 67 44 61 74 61 3d  p->nPendingData=
2b200 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  =0 ){.      if( 
2b210 69 49 64 78 3e 30 20 26 26 20 72 63 3d 3d 53 51  iIdx>0 && rc==SQ
2b220 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
2b230 20 20 20 69 6e 74 20 66 20 3d 20 66 6c 61 67 73     int f = flags
2b240 7c 46 54 53 35 49 4e 44 45 58 5f 51 55 45 52 59  |FTS5INDEX_QUERY
2b250 5f 54 45 53 54 5f 4e 4f 49 44 58 3b 0a 20 20 20  _TEST_NOIDX;.   
2b260 20 20 20 20 20 63 6b 32 20 3d 20 30 3b 0a 20 20       ck2 = 0;.  
2b270 20 20 20 20 20 20 72 63 20 3d 20 66 74 73 35 51        rc = fts5Q
2b280 75 65 72 79 43 6b 73 75 6d 28 70 2c 20 69 49 64  ueryCksum(p, iId
2b290 78 2c 20 7a 54 65 72 6d 2c 20 6e 54 65 72 6d 2c  x, zTerm, nTerm,
2b2a0 20 66 2c 20 26 63 6b 32 29 3b 0a 20 20 20 20 20   f, &ck2);.     
2b2b0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
2b2c0 45 5f 4f 4b 20 26 26 20 63 6b 31 21 3d 63 6b 32  E_OK && ck1!=ck2
2b2d0 20 29 20 72 63 20 3d 20 46 54 53 35 5f 43 4f 52   ) rc = FTS5_COR
2b2e0 52 55 50 54 3b 0a 20 20 20 20 20 20 7d 0a 20 20  RUPT;.      }.  
2b2f0 20 20 20 20 69 66 28 20 69 49 64 78 3e 30 20 26      if( iIdx>0 &
2b300 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  & rc==SQLITE_OK 
2b310 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 66  ){.        int f
2b320 20 3d 20 66 6c 61 67 73 7c 46 54 53 35 49 4e 44   = flags|FTS5IND
2b330 45 58 5f 51 55 45 52 59 5f 54 45 53 54 5f 4e 4f  EX_QUERY_TEST_NO
2b340 49 44 58 7c 46 54 53 35 49 4e 44 45 58 5f 51 55  IDX|FTS5INDEX_QU
2b350 45 52 59 5f 44 45 53 43 3b 0a 20 20 20 20 20 20  ERY_DESC;.      
2b360 20 20 63 6b 32 20 3d 20 30 3b 0a 20 20 20 20 20    ck2 = 0;.     
2b370 20 20 20 72 63 20 3d 20 66 74 73 35 51 75 65 72     rc = fts5Quer
2b380 79 43 6b 73 75 6d 28 70 2c 20 69 49 64 78 2c 20  yCksum(p, iIdx, 
2b390 7a 54 65 72 6d 2c 20 6e 54 65 72 6d 2c 20 66 2c  zTerm, nTerm, f,
2b3a0 20 26 63 6b 32 29 3b 0a 20 20 20 20 20 20 20 20   &ck2);.        
2b3b0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
2b3c0 4b 20 26 26 20 63 6b 31 21 3d 63 6b 32 20 29 20  K && ck1!=ck2 ) 
2b3d0 72 63 20 3d 20 46 54 53 35 5f 43 4f 52 52 55 50  rc = FTS5_CORRUP
2b3e0 54 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  T;.      }.    }
2b3f0 0a 0a 20 20 20 20 63 6b 73 75 6d 33 20 5e 3d 20  ..    cksum3 ^= 
2b400 63 6b 31 3b 0a 20 20 20 20 66 74 73 35 42 75 66  ck1;.    fts5Buf
2b410 66 65 72 53 65 74 28 26 72 63 2c 20 70 50 72 65  ferSet(&rc, pPre
2b420 76 2c 20 6e 2c 20 28 63 6f 6e 73 74 20 75 38 2a  v, n, (const u8*
2b430 29 7a 29 3b 0a 0a 20 20 20 20 69 66 28 20 72 63  )z);..    if( rc
2b440 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 63  ==SQLITE_OK && c
2b450 6b 73 75 6d 33 21 3d 65 78 70 65 63 74 65 64 20  ksum3!=expected 
2b460 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 46 54  ){.      rc = FT
2b470 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20 20  S5_CORRUPT;.    
2b480 7d 0a 20 20 20 20 2a 70 43 6b 73 75 6d 20 3d 20  }.    *pCksum = 
2b490 63 6b 73 75 6d 33 3b 0a 20 20 7d 0a 20 20 70 2d  cksum3;.  }.  p-
2b4a0 3e 72 63 20 3d 20 72 63 3b 0a 7d 0a 20 0a 23 65  >rc = rc;.}. .#e
2b4b0 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 66 74 73  lse.# define fts
2b4c0 35 54 65 73 74 44 6c 69 64 78 52 65 76 65 72 73  5TestDlidxRevers
2b4d0 65 28 78 2c 79 2c 7a 29 0a 23 20 64 65 66 69 6e  e(x,y,z).# defin
2b4e0 65 20 66 74 73 35 54 65 73 74 54 65 72 6d 28 75  e fts5TestTerm(u
2b4f0 2c 76 2c 77 2c 78 2c 79 2c 7a 29 0a 23 65 6e 64  ,v,w,x,y,z).#end
2b500 69 66 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20  if../*.** Check 
2b510 74 68 61 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 31 29  that:.**.**   1)
2b520 20 41 6c 6c 20 6c 65 61 76 65 73 20 6f 66 20 70   All leaves of p
2b530 53 65 67 20 62 65 74 77 65 65 6e 20 69 46 69 72  Seg between iFir
2b540 73 74 20 61 6e 64 20 69 4c 61 73 74 20 28 69 6e  st and iLast (in
2b550 63 6c 75 73 69 76 65 29 20 65 78 69 73 74 20 61  clusive) exist a
2b560 6e 64 0a 2a 2a 20 20 20 20 20 20 63 6f 6e 74 61  nd.**      conta
2b570 69 6e 20 7a 65 72 6f 20 74 65 72 6d 73 2e 0a 2a  in zero terms..*
2b580 2a 20 20 20 32 29 20 41 6c 6c 20 6c 65 61 76 65  *   2) All leave
2b590 73 20 6f 66 20 70 53 65 67 20 62 65 74 77 65 65  s of pSeg betwee
2b5a0 6e 20 69 4e 6f 52 6f 77 69 64 20 61 6e 64 20 69  n iNoRowid and i
2b5b0 4c 61 73 74 20 28 69 6e 63 6c 75 73 69 76 65 29  Last (inclusive)
2b5c0 20 65 78 69 73 74 20 61 6e 64 0a 2a 2a 20 20 20   exist and.**   
2b5d0 20 20 20 63 6f 6e 74 61 69 6e 20 7a 65 72 6f 20     contain zero 
2b5e0 72 6f 77 69 64 73 2e 0a 2a 2f 0a 73 74 61 74 69  rowids..*/.stati
2b5f0 63 20 76 6f 69 64 20 66 74 73 35 49 6e 64 65 78  c void fts5Index
2b600 49 6e 74 65 67 72 69 74 79 43 68 65 63 6b 45 6d  IntegrityCheckEm
2b610 70 74 79 28 0a 20 20 46 74 73 35 49 6e 64 65 78  pty(.  Fts5Index
2b620 20 2a 70 2c 0a 20 20 46 74 73 35 53 74 72 75 63   *p,.  Fts5Struc
2b630 74 75 72 65 53 65 67 6d 65 6e 74 20 2a 70 53 65  tureSegment *pSe
2b640 67 2c 20 20 20 20 20 2f 2a 20 53 65 67 6d 65 6e  g,     /* Segmen
2b650 74 20 74 6f 20 63 68 65 63 6b 20 69 6e 74 65 72  t to check inter
2b660 6e 61 6c 20 63 6f 6e 73 69 73 74 65 6e 63 79 20  nal consistency 
2b670 2a 2f 0a 20 20 69 6e 74 20 69 46 69 72 73 74 2c  */.  int iFirst,
2b680 0a 20 20 69 6e 74 20 69 4e 6f 52 6f 77 69 64 2c  .  int iNoRowid,
2b690 0a 20 20 69 6e 74 20 69 4c 61 73 74 0a 29 7b 0a  .  int iLast.){.
2b6a0 20 20 69 6e 74 20 69 3b 0a 0a 20 20 2f 2a 20 4e    int i;..  /* N
2b6b0 6f 77 20 63 68 65 63 6b 20 74 68 61 74 20 74 68  ow check that th
2b6c0 65 20 69 74 65 72 2e 6e 45 6d 70 74 79 20 6c 65  e iter.nEmpty le
2b6d0 61 76 65 73 20 66 6f 6c 6c 6f 77 69 6e 67 20 74  aves following t
2b6e0 68 65 20 63 75 72 72 65 6e 74 20 6c 65 61 66 0a  he current leaf.
2b6f0 20 20 2a 2a 20 28 61 29 20 65 78 69 73 74 20 61    ** (a) exist a
2b700 6e 64 20 28 62 29 20 63 6f 6e 74 61 69 6e 20 6e  nd (b) contain n
2b710 6f 20 74 65 72 6d 73 2e 20 2a 2f 0a 20 20 66 6f  o terms. */.  fo
2b720 72 28 69 3d 69 46 69 72 73 74 3b 20 70 2d 3e 72  r(i=iFirst; p->r
2b730 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
2b740 69 3c 3d 69 4c 61 73 74 3b 20 69 2b 2b 29 7b 0a  i<=iLast; i++){.
2b750 20 20 20 20 46 74 73 35 44 61 74 61 20 2a 70 4c      Fts5Data *pL
2b760 65 61 66 20 3d 20 66 74 73 35 44 61 74 61 52 65  eaf = fts5DataRe
2b770 61 64 28 70 2c 20 46 54 53 35 5f 53 45 47 4d 45  ad(p, FTS5_SEGME
2b780 4e 54 5f 52 4f 57 49 44 28 70 53 65 67 2d 3e 69  NT_ROWID(pSeg->i
2b790 53 65 67 69 64 2c 20 69 29 29 3b 0a 20 20 20 20  Segid, i));.    
2b7a0 69 66 28 20 70 4c 65 61 66 20 29 7b 0a 20 20 20  if( pLeaf ){.   
2b7b0 20 20 20 69 66 28 20 21 66 74 73 35 4c 65 61 66     if( !fts5Leaf
2b7c0 49 73 54 65 72 6d 6c 65 73 73 28 70 4c 65 61 66  IsTermless(pLeaf
2b7d0 29 20 29 20 70 2d 3e 72 63 20 3d 20 46 54 53 35  ) ) p->rc = FTS5
2b7e0 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20 20 20 20  _CORRUPT;.      
2b7f0 69 66 28 20 69 3e 3d 69 4e 6f 52 6f 77 69 64 20  if( i>=iNoRowid 
2b800 26 26 20 30 21 3d 66 74 73 35 4c 65 61 66 46 69  && 0!=fts5LeafFi
2b810 72 73 74 52 6f 77 69 64 4f 66 66 28 70 4c 65 61  rstRowidOff(pLea
2b820 66 29 20 29 20 70 2d 3e 72 63 20 3d 20 46 54 53  f) ) p->rc = FTS
2b830 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20 20 7d  5_CORRUPT;.    }
2b840 0a 20 20 20 20 66 74 73 35 44 61 74 61 52 65 6c  .    fts5DataRel
2b850 65 61 73 65 28 70 4c 65 61 66 29 3b 0a 20 20 7d  ease(pLeaf);.  }
2b860 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .}..static void 
2b870 66 74 73 35 49 6e 74 65 67 72 69 74 79 43 68 65  fts5IntegrityChe
2b880 63 6b 50 67 69 64 78 28 46 74 73 35 49 6e 64 65  ckPgidx(Fts5Inde
2b890 78 20 2a 70 2c 20 46 74 73 35 44 61 74 61 20 2a  x *p, Fts5Data *
2b8a0 70 4c 65 61 66 29 7b 0a 20 20 69 6e 74 20 69 54  pLeaf){.  int iT
2b8b0 65 72 6d 4f 66 66 20 3d 20 30 3b 0a 20 20 69 6e  ermOff = 0;.  in
2b8c0 74 20 69 69 3b 0a 0a 20 20 46 74 73 35 42 75 66  t ii;..  Fts5Buf
2b8d0 66 65 72 20 62 75 66 31 20 3d 20 7b 30 2c 30 2c  fer buf1 = {0,0,
2b8e0 30 7d 3b 0a 20 20 46 74 73 35 42 75 66 66 65 72  0};.  Fts5Buffer
2b8f0 20 62 75 66 32 20 3d 20 7b 30 2c 30 2c 30 7d 3b   buf2 = {0,0,0};
2b900 0a 0a 20 20 69 69 20 3d 20 70 4c 65 61 66 2d 3e  ..  ii = pLeaf->
2b910 73 7a 4c 65 61 66 3b 0a 20 20 77 68 69 6c 65 28  szLeaf;.  while(
2b920 20 69 69 3c 70 4c 65 61 66 2d 3e 6e 6e 20 26 26   ii<pLeaf->nn &&
2b930 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
2b940 4b 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 65 73  K ){.    int res
2b950 3b 0a 20 20 20 20 69 6e 74 20 69 4f 66 66 3b 0a  ;.    int iOff;.
2b960 20 20 20 20 69 6e 74 20 6e 49 6e 63 72 3b 0a 0a      int nIncr;..
2b970 20 20 20 20 69 69 20 2b 3d 20 66 74 73 35 47 65      ii += fts5Ge
2b980 74 56 61 72 69 6e 74 33 32 28 26 70 4c 65 61 66  tVarint32(&pLeaf
2b990 2d 3e 70 5b 69 69 5d 2c 20 6e 49 6e 63 72 29 3b  ->p[ii], nIncr);
2b9a0 0a 20 20 20 20 69 54 65 72 6d 4f 66 66 20 2b 3d  .    iTermOff +=
2b9b0 20 6e 49 6e 63 72 3b 0a 20 20 20 20 69 4f 66 66   nIncr;.    iOff
2b9c0 20 3d 20 69 54 65 72 6d 4f 66 66 3b 0a 0a 20 20   = iTermOff;..  
2b9d0 20 20 69 66 28 20 69 4f 66 66 3e 3d 70 4c 65 61    if( iOff>=pLea
2b9e0 66 2d 3e 73 7a 4c 65 61 66 20 29 7b 0a 20 20 20  f->szLeaf ){.   
2b9f0 20 20 20 70 2d 3e 72 63 20 3d 20 46 54 53 35 5f     p->rc = FTS5_
2ba00 43 4f 52 52 55 50 54 3b 0a 20 20 20 20 7d 65 6c  CORRUPT;.    }el
2ba10 73 65 20 69 66 28 20 69 54 65 72 6d 4f 66 66 3d  se if( iTermOff=
2ba20 3d 6e 49 6e 63 72 20 29 7b 0a 20 20 20 20 20 20  =nIncr ){.      
2ba30 69 6e 74 20 6e 42 79 74 65 3b 0a 20 20 20 20 20  int nByte;.     
2ba40 20 69 4f 66 66 20 2b 3d 20 66 74 73 35 47 65 74   iOff += fts5Get
2ba50 56 61 72 69 6e 74 33 32 28 26 70 4c 65 61 66 2d  Varint32(&pLeaf-
2ba60 3e 70 5b 69 4f 66 66 5d 2c 20 6e 42 79 74 65 29  >p[iOff], nByte)
2ba70 3b 0a 20 20 20 20 20 20 69 66 28 20 28 69 4f 66  ;.      if( (iOf
2ba80 66 2b 6e 42 79 74 65 29 3e 70 4c 65 61 66 2d 3e  f+nByte)>pLeaf->
2ba90 73 7a 4c 65 61 66 20 29 7b 0a 20 20 20 20 20 20  szLeaf ){.      
2baa0 20 20 70 2d 3e 72 63 20 3d 20 46 54 53 35 5f 43    p->rc = FTS5_C
2bab0 4f 52 52 55 50 54 3b 0a 20 20 20 20 20 20 7d 65  ORRUPT;.      }e
2bac0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 66 74 73  lse{.        fts
2bad0 35 42 75 66 66 65 72 53 65 74 28 26 70 2d 3e 72  5BufferSet(&p->r
2bae0 63 2c 20 26 62 75 66 31 2c 20 6e 42 79 74 65 2c  c, &buf1, nByte,
2baf0 20 26 70 4c 65 61 66 2d 3e 70 5b 69 4f 66 66 5d   &pLeaf->p[iOff]
2bb00 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
2bb10 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20  else{.      int 
2bb20 6e 4b 65 65 70 2c 20 6e 42 79 74 65 3b 0a 20 20  nKeep, nByte;.  
2bb30 20 20 20 20 69 4f 66 66 20 2b 3d 20 66 74 73 35      iOff += fts5
2bb40 47 65 74 56 61 72 69 6e 74 33 32 28 26 70 4c 65  GetVarint32(&pLe
2bb50 61 66 2d 3e 70 5b 69 4f 66 66 5d 2c 20 6e 4b 65  af->p[iOff], nKe
2bb60 65 70 29 3b 0a 20 20 20 20 20 20 69 4f 66 66 20  ep);.      iOff 
2bb70 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e 74  += fts5GetVarint
2bb80 33 32 28 26 70 4c 65 61 66 2d 3e 70 5b 69 4f 66  32(&pLeaf->p[iOf
2bb90 66 5d 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20 20  f], nByte);.    
2bba0 20 20 69 66 28 20 6e 4b 65 65 70 3e 62 75 66 31    if( nKeep>buf1
2bbb0 2e 6e 20 7c 7c 20 28 69 4f 66 66 2b 6e 42 79 74  .n || (iOff+nByt
2bbc0 65 29 3e 70 4c 65 61 66 2d 3e 73 7a 4c 65 61 66  e)>pLeaf->szLeaf
2bbd0 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 72   ){.        p->r
2bbe0 63 20 3d 20 46 54 53 35 5f 43 4f 52 52 55 50 54  c = FTS5_CORRUPT
2bbf0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
2bc00 20 20 20 20 20 20 20 62 75 66 31 2e 6e 20 3d 20         buf1.n = 
2bc10 6e 4b 65 65 70 3b 0a 20 20 20 20 20 20 20 20 66  nKeep;.        f
2bc20 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 42  ts5BufferAppendB
2bc30 6c 6f 62 28 26 70 2d 3e 72 63 2c 20 26 62 75 66  lob(&p->rc, &buf
2bc40 31 2c 20 6e 42 79 74 65 2c 20 26 70 4c 65 61 66  1, nByte, &pLeaf
2bc50 2d 3e 70 5b 69 4f 66 66 5d 29 3b 0a 20 20 20 20  ->p[iOff]);.    
2bc60 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 70    }..      if( p
2bc70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
2bc80 29 7b 0a 20 20 20 20 20 20 20 20 72 65 73 20 3d  ){.        res =
2bc90 20 66 74 73 35 42 75 66 66 65 72 43 6f 6d 70 61   fts5BufferCompa
2bca0 72 65 28 26 62 75 66 31 2c 20 26 62 75 66 32 29  re(&buf1, &buf2)
2bcb0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 65  ;.        if( re
2bcc0 73 3c 3d 30 20 29 20 70 2d 3e 72 63 20 3d 20 46  s<=0 ) p->rc = F
2bcd0 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20  TS5_CORRUPT;.   
2bce0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 66     }.    }.    f
2bcf0 74 73 35 42 75 66 66 65 72 53 65 74 28 26 70 2d  ts5BufferSet(&p-
2bd00 3e 72 63 2c 20 26 62 75 66 32 2c 20 62 75 66 31  >rc, &buf2, buf1
2bd10 2e 6e 2c 20 62 75 66 31 2e 70 29 3b 0a 20 20 7d  .n, buf1.p);.  }
2bd20 0a 0a 20 20 66 74 73 35 42 75 66 66 65 72 46 72  ..  fts5BufferFr
2bd30 65 65 28 26 62 75 66 31 29 3b 0a 20 20 66 74 73  ee(&buf1);.  fts
2bd40 35 42 75 66 66 65 72 46 72 65 65 28 26 62 75 66  5BufferFree(&buf
2bd50 32 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f  2);.}..static vo
2bd60 69 64 20 66 74 73 35 49 6e 64 65 78 49 6e 74 65  id fts5IndexInte
2bd70 67 72 69 74 79 43 68 65 63 6b 53 65 67 6d 65 6e  grityCheckSegmen
2bd80 74 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a  t(.  Fts5Index *
2bd90 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
2bda0 20 20 20 20 20 2f 2a 20 46 54 53 35 20 62 61 63       /* FTS5 bac
2bdb0 6b 65 6e 64 20 6f 62 6a 65 63 74 20 2a 2f 0a 20  kend object */. 
2bdc0 20 46 74 73 35 53 74 72 75 63 74 75 72 65 53 65   Fts5StructureSe
2bdd0 67 6d 65 6e 74 20 2a 70 53 65 67 20 20 20 20 20  gment *pSeg     
2bde0 20 2f 2a 20 53 65 67 6d 65 6e 74 20 74 6f 20 63   /* Segment to c
2bdf0 68 65 63 6b 20 69 6e 74 65 72 6e 61 6c 20 63 6f  heck internal co
2be00 6e 73 69 73 74 65 6e 63 79 20 2a 2f 0a 29 7b 0a  nsistency */.){.
2be10 20 20 46 74 73 35 43 6f 6e 66 69 67 20 2a 70 43    Fts5Config *pC
2be20 6f 6e 66 69 67 20 3d 20 70 2d 3e 70 43 6f 6e 66  onfig = p->pConf
2be30 69 67 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74  ig;.  sqlite3_st
2be40 6d 74 20 2a 70 53 74 6d 74 20 3d 20 30 3b 0a 20  mt *pStmt = 0;. 
2be50 20 69 6e 74 20 72 63 32 3b 0a 20 20 69 6e 74 20   int rc2;.  int 
2be60 69 49 64 78 50 72 65 76 4c 65 61 66 20 3d 20 70  iIdxPrevLeaf = p
2be70 53 65 67 2d 3e 70 67 6e 6f 46 69 72 73 74 2d 31  Seg->pgnoFirst-1
2be80 3b 0a 20 20 69 6e 74 20 69 44 6c 69 64 78 50 72  ;.  int iDlidxPr
2be90 65 76 4c 65 61 66 20 3d 20 70 53 65 67 2d 3e 70  evLeaf = pSeg->p
2bea0 67 6e 6f 4c 61 73 74 3b 0a 0a 20 20 69 66 28 20  gnoLast;..  if( 
2beb0 70 53 65 67 2d 3e 70 67 6e 6f 46 69 72 73 74 3d  pSeg->pgnoFirst=
2bec0 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20  =0 ) return;..  
2bed0 66 74 73 35 49 6e 64 65 78 50 72 65 70 61 72 65  fts5IndexPrepare
2bee0 53 74 6d 74 28 70 2c 20 26 70 53 74 6d 74 2c 20  Stmt(p, &pStmt, 
2bef0 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
2bf00 0a 20 20 20 20 20 20 22 53 45 4c 45 43 54 20 73  .      "SELECT s
2bf10 65 67 69 64 2c 20 74 65 72 6d 2c 20 28 70 67 6e  egid, term, (pgn
2bf20 6f 3e 3e 31 29 2c 20 28 70 67 6e 6f 26 31 29 20  o>>1), (pgno&1) 
2bf30 46 52 4f 4d 20 25 51 2e 27 25 71 5f 69 64 78 27  FROM %Q.'%q_idx'
2bf40 20 57 48 45 52 45 20 73 65 67 69 64 3d 25 64 22   WHERE segid=%d"
2bf50 2c 0a 20 20 20 20 20 20 70 43 6f 6e 66 69 67 2d  ,.      pConfig-
2bf60 3e 7a 44 62 2c 20 70 43 6f 6e 66 69 67 2d 3e 7a  >zDb, pConfig->z
2bf70 4e 61 6d 65 2c 20 70 53 65 67 2d 3e 69 53 65 67  Name, pSeg->iSeg
2bf80 69 64 0a 20 20 29 29 3b 0a 0a 20 20 2f 2a 20 49  id.  ));..  /* I
2bf90 74 65 72 61 74 65 20 74 68 72 6f 75 67 68 20 74  terate through t
2bfa0 68 65 20 62 2d 74 72 65 65 20 68 69 65 72 61 72  he b-tree hierar
2bfb0 63 68 79 2e 20 20 2a 2f 0a 20 20 77 68 69 6c 65  chy.  */.  while
2bfc0 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
2bfd0 4f 4b 20 26 26 20 53 51 4c 49 54 45 5f 52 4f 57  OK && SQLITE_ROW
2bfe0 3d 3d 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70  ==sqlite3_step(p
2bff0 53 74 6d 74 29 20 29 7b 0a 20 20 20 20 69 36 34  Stmt) ){.    i64
2c000 20 69 52 6f 77 3b 20 20 20 20 20 20 20 20 20 20   iRow;          
2c010 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f             /* Ro
2c020 77 69 64 20 66 6f 72 20 74 68 69 73 20 6c 65 61  wid for this lea
2c030 66 20 2a 2f 0a 20 20 20 20 46 74 73 35 44 61 74  f */.    Fts5Dat
2c040 61 20 2a 70 4c 65 61 66 3b 20 20 20 20 20 20 20  a *pLeaf;       
2c050 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 20 66         /* Data f
2c060 6f 72 20 74 68 69 73 20 6c 65 61 66 20 2a 2f 0a  or this leaf */.
2c070 0a 20 20 20 20 69 6e 74 20 6e 49 64 78 54 65 72  .    int nIdxTer
2c080 6d 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  m = sqlite3_colu
2c090 6d 6e 5f 62 79 74 65 73 28 70 53 74 6d 74 2c 20  mn_bytes(pStmt, 
2c0a0 31 29 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68  1);.    const ch
2c0b0 61 72 20 2a 7a 49 64 78 54 65 72 6d 20 3d 20 28  ar *zIdxTerm = (
2c0c0 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69  const char*)sqli
2c0d0 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28  te3_column_text(
2c0e0 70 53 74 6d 74 2c 20 31 29 3b 0a 20 20 20 20 69  pStmt, 1);.    i
2c0f0 6e 74 20 69 49 64 78 4c 65 61 66 20 3d 20 73 71  nt iIdxLeaf = sq
2c100 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74  lite3_column_int
2c110 28 70 53 74 6d 74 2c 20 32 29 3b 0a 20 20 20 20  (pStmt, 2);.    
2c120 69 6e 74 20 62 49 64 78 44 6c 69 64 78 20 3d 20  int bIdxDlidx = 
2c130 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69  sqlite3_column_i
2c140 6e 74 28 70 53 74 6d 74 2c 20 33 29 3b 0a 0a 20  nt(pStmt, 3);.. 
2c150 20 20 20 2f 2a 20 49 66 20 74 68 65 20 6c 65 61     /* If the lea
2c160 66 20 69 6e 20 71 75 65 73 74 69 6f 6e 20 68 61  f in question ha
2c170 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 74  s already been t
2c180 72 69 6d 6d 65 64 20 66 72 6f 6d 20 74 68 65 20  rimmed from the 
2c190 73 65 67 6d 65 6e 74 2c 20 0a 20 20 20 20 2a 2a  segment, .    **
2c1a0 20 69 67 6e 6f 72 65 20 74 68 69 73 20 62 2d 74   ignore this b-t
2c1b0 72 65 65 20 65 6e 74 72 79 2e 20 4f 74 68 65 72  ree entry. Other
2c1c0 77 69 73 65 2c 20 6c 6f 61 64 20 69 74 20 69 6e  wise, load it in
2c1d0 74 6f 20 6d 65 6d 6f 72 79 2e 20 2a 2f 0a 20 20  to memory. */.  
2c1e0 20 20 69 66 28 20 69 49 64 78 4c 65 61 66 3c 70    if( iIdxLeaf<p
2c1f0 53 65 67 2d 3e 70 67 6e 6f 46 69 72 73 74 20 29  Seg->pgnoFirst )
2c200 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69   continue;.    i
2c210 52 6f 77 20 3d 20 46 54 53 35 5f 53 45 47 4d 45  Row = FTS5_SEGME
2c220 4e 54 5f 52 4f 57 49 44 28 70 53 65 67 2d 3e 69  NT_ROWID(pSeg->i
2c230 53 65 67 69 64 2c 20 69 49 64 78 4c 65 61 66 29  Segid, iIdxLeaf)
2c240 3b 0a 20 20 20 20 70 4c 65 61 66 20 3d 20 66 74  ;.    pLeaf = ft
2c250 73 35 44 61 74 61 52 65 61 64 28 70 2c 20 69 52  s5DataRead(p, iR
2c260 6f 77 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 65  ow);.    if( pLe
2c270 61 66 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 0a  af==0 ) break;..
2c280 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61      /* Check tha
2c290 74 20 74 68 65 20 6c 65 61 66 20 63 6f 6e 74 61  t the leaf conta
2c2a0 69 6e 73 20 61 74 20 6c 65 61 73 74 20 6f 6e 65  ins at least one
2c2b0 20 74 65 72 6d 2c 20 61 6e 64 20 74 68 61 74 20   term, and that 
2c2c0 69 74 20 69 73 20 65 71 75 61 6c 0a 20 20 20 20  it is equal.    
2c2d0 2a 2a 20 74 6f 20 6f 72 20 6c 61 72 67 65 72 20  ** to or larger 
2c2e0 74 68 61 6e 20 74 68 65 20 73 70 6c 69 74 2d 6b  than the split-k
2c2f0 65 79 20 69 6e 20 7a 49 64 78 54 65 72 6d 2e 20  ey in zIdxTerm. 
2c300 20 41 6c 73 6f 20 63 68 65 63 6b 20 74 68 61 74   Also check that
2c310 20 69 66 20 74 68 65 72 65 0a 20 20 20 20 2a 2a   if there.    **
2c320 20 69 73 20 61 6c 73 6f 20 61 20 72 6f 77 69 64   is also a rowid
2c330 20 70 6f 69 6e 74 65 72 20 77 69 74 68 69 6e 20   pointer within 
2c340 74 68 65 20 6c 65 61 66 20 70 61 67 65 20 68 65  the leaf page he
2c350 61 64 65 72 2c 20 69 74 20 70 6f 69 6e 74 73 20  ader, it points 
2c360 74 6f 20 61 0a 20 20 20 20 2a 2a 20 6c 6f 63 61  to a.    ** loca
2c370 74 69 6f 6e 20 62 65 66 6f 72 65 20 74 68 65 20  tion before the 
2c380 74 65 72 6d 2e 20 20 2a 2f 0a 20 20 20 20 69 66  term.  */.    if
2c390 28 20 70 4c 65 61 66 2d 3e 6e 6e 3c 3d 70 4c 65  ( pLeaf->nn<=pLe
2c3a0 61 66 2d 3e 73 7a 4c 65 61 66 20 29 7b 0a 20 20  af->szLeaf ){.  
2c3b0 20 20 20 20 70 2d 3e 72 63 20 3d 20 46 54 53 35      p->rc = FTS5
2c3c0 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20 20 7d 65  _CORRUPT;.    }e
2c3d0 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  lse{.      int i
2c3e0 4f 66 66 3b 20 20 20 20 20 20 20 20 20 20 20 20  Off;            
2c3f0 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74         /* Offset
2c400 20 6f 66 20 66 69 72 73 74 20 74 65 72 6d 20 6f   of first term o
2c410 6e 20 6c 65 61 66 20 2a 2f 0a 20 20 20 20 20 20  n leaf */.      
2c420 69 6e 74 20 69 52 6f 77 69 64 4f 66 66 3b 20 20  int iRowidOff;  
2c430 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
2c440 66 66 73 65 74 20 6f 66 20 66 69 72 73 74 20 72  ffset of first r
2c450 6f 77 69 64 20 6f 6e 20 6c 65 61 66 20 2a 2f 0a  owid on leaf */.
2c460 20 20 20 20 20 20 69 6e 74 20 6e 54 65 72 6d 3b        int nTerm;
2c470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c480 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 65 72    /* Size of ter
2c490 6d 20 6f 6e 20 6c 65 61 66 20 69 6e 20 62 79 74  m on leaf in byt
2c4a0 65 73 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  es */.      int 
2c4b0 72 65 73 3b 20 20 20 20 20 20 20 20 20 20 20 20  res;            
2c4c0 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d 70 61          /* Compa
2c4d0 72 69 73 6f 6e 20 6f 66 20 74 65 72 6d 20 61 6e  rison of term an
2c4e0 64 20 73 70 6c 69 74 2d 6b 65 79 20 2a 2f 0a 0a  d split-key */..
2c4f0 20 20 20 20 20 20 69 4f 66 66 20 3d 20 66 74 73        iOff = fts
2c500 35 4c 65 61 66 46 69 72 73 74 54 65 72 6d 4f 66  5LeafFirstTermOf
2c510 66 28 70 4c 65 61 66 29 3b 0a 20 20 20 20 20 20  f(pLeaf);.      
2c520 69 52 6f 77 69 64 4f 66 66 20 3d 20 66 74 73 35  iRowidOff = fts5
2c530 4c 65 61 66 46 69 72 73 74 52 6f 77 69 64 4f 66  LeafFirstRowidOf
2c540 66 28 70 4c 65 61 66 29 3b 0a 20 20 20 20 20 20  f(pLeaf);.      
2c550 69 66 28 20 69 52 6f 77 69 64 4f 66 66 3e 3d 69  if( iRowidOff>=i
2c560 4f 66 66 20 29 7b 0a 20 20 20 20 20 20 20 20 70  Off ){.        p
2c570 2d 3e 72 63 20 3d 20 46 54 53 35 5f 43 4f 52 52  ->rc = FTS5_CORR
2c580 55 50 54 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  UPT;.      }else
2c590 7b 0a 20 20 20 20 20 20 20 20 69 4f 66 66 20 2b  {.        iOff +
2c5a0 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e 74 33  = fts5GetVarint3
2c5b0 32 28 26 70 4c 65 61 66 2d 3e 70 5b 69 4f 66 66  2(&pLeaf->p[iOff
2c5c0 5d 2c 20 6e 54 65 72 6d 29 3b 0a 20 20 20 20 20  ], nTerm);.     
2c5d0 20 20 20 72 65 73 20 3d 20 6d 65 6d 63 6d 70 28     res = memcmp(
2c5e0 26 70 4c 65 61 66 2d 3e 70 5b 69 4f 66 66 5d 2c  &pLeaf->p[iOff],
2c5f0 20 7a 49 64 78 54 65 72 6d 2c 20 4d 49 4e 28 6e   zIdxTerm, MIN(n
2c600 54 65 72 6d 2c 20 6e 49 64 78 54 65 72 6d 29 29  Term, nIdxTerm))
2c610 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 65  ;.        if( re
2c620 73 3d 3d 30 20 29 20 72 65 73 20 3d 20 6e 54 65  s==0 ) res = nTe
2c630 72 6d 20 2d 20 6e 49 64 78 54 65 72 6d 3b 0a 20  rm - nIdxTerm;. 
2c640 20 20 20 20 20 20 20 69 66 28 20 72 65 73 3c 30         if( res<0
2c650 20 29 20 70 2d 3e 72 63 20 3d 20 46 54 53 35 5f   ) p->rc = FTS5_
2c660 43 4f 52 52 55 50 54 3b 0a 20 20 20 20 20 20 7d  CORRUPT;.      }
2c670 0a 0a 20 20 20 20 20 20 66 74 73 35 49 6e 74 65  ..      fts5Inte
2c680 67 72 69 74 79 43 68 65 63 6b 50 67 69 64 78 28  grityCheckPgidx(
2c690 70 2c 20 70 4c 65 61 66 29 3b 0a 20 20 20 20 7d  p, pLeaf);.    }
2c6a0 0a 20 20 20 20 66 74 73 35 44 61 74 61 52 65 6c  .    fts5DataRel
2c6b0 65 61 73 65 28 70 4c 65 61 66 29 3b 0a 20 20 20  ease(pLeaf);.   
2c6c0 20 69 66 28 20 70 2d 3e 72 63 20 29 20 62 72 65   if( p->rc ) bre
2c6d0 61 6b 3b 0a 0a 20 20 20 20 2f 2a 20 4e 6f 77 20  ak;..    /* Now 
2c6e0 63 68 65 63 6b 20 74 68 61 74 20 74 68 65 20 69  check that the i
2c6f0 74 65 72 2e 6e 45 6d 70 74 79 20 6c 65 61 76 65  ter.nEmpty leave
2c700 73 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20  s following the 
2c710 63 75 72 72 65 6e 74 20 6c 65 61 66 0a 20 20 20  current leaf.   
2c720 20 2a 2a 20 28 61 29 20 65 78 69 73 74 20 61 6e   ** (a) exist an
2c730 64 20 28 62 29 20 63 6f 6e 74 61 69 6e 20 6e 6f  d (b) contain no
2c740 20 74 65 72 6d 73 2e 20 2a 2f 0a 20 20 20 20 66   terms. */.    f
2c750 74 73 35 49 6e 64 65 78 49 6e 74 65 67 72 69 74  ts5IndexIntegrit
2c760 79 43 68 65 63 6b 45 6d 70 74 79 28 0a 20 20 20  yCheckEmpty(.   
2c770 20 20 20 20 20 70 2c 20 70 53 65 67 2c 20 69 49       p, pSeg, iI
2c780 64 78 50 72 65 76 4c 65 61 66 2b 31 2c 20 69 44  dxPrevLeaf+1, iD
2c790 6c 69 64 78 50 72 65 76 4c 65 61 66 2b 31 2c 20  lidxPrevLeaf+1, 
2c7a0 69 49 64 78 4c 65 61 66 2d 31 0a 20 20 20 20 29  iIdxLeaf-1.    )
2c7b0 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 72 63 20  ;.    if( p->rc 
2c7c0 29 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 2f 2a  ) break;..    /*
2c7d0 20 49 66 20 74 68 65 72 65 20 69 73 20 61 20 64   If there is a d
2c7e0 6f 63 6c 69 73 74 2d 69 6e 64 65 78 2c 20 63 68  oclist-index, ch
2c7f0 65 63 6b 20 74 68 61 74 20 69 74 20 6c 6f 6f 6b  eck that it look
2c800 73 20 72 69 67 68 74 2e 20 2a 2f 0a 20 20 20 20  s right. */.    
2c810 69 66 28 20 62 49 64 78 44 6c 69 64 78 20 29 7b  if( bIdxDlidx ){
2c820 0a 20 20 20 20 20 20 46 74 73 35 44 6c 69 64 78  .      Fts5Dlidx
2c830 49 74 65 72 20 2a 70 44 6c 69 64 78 20 3d 20 30  Iter *pDlidx = 0
2c840 3b 20 20 2f 2a 20 46 6f 72 20 69 74 65 72 61 74  ;  /* For iterat
2c850 69 6e 67 20 74 68 72 6f 75 67 68 20 64 6f 63 6c  ing through docl
2c860 69 73 74 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20  ist index */.   
2c870 20 20 20 69 6e 74 20 69 50 72 65 76 4c 65 61 66     int iPrevLeaf
2c880 20 3d 20 69 49 64 78 4c 65 61 66 3b 0a 20 20 20   = iIdxLeaf;.   
2c890 20 20 20 69 6e 74 20 69 53 65 67 69 64 20 3d 20     int iSegid = 
2c8a0 70 53 65 67 2d 3e 69 53 65 67 69 64 3b 0a 20 20  pSeg->iSegid;.  
2c8b0 20 20 20 20 69 6e 74 20 69 50 67 20 3d 20 30 3b      int iPg = 0;
2c8c0 0a 20 20 20 20 20 20 69 36 34 20 69 4b 65 79 3b  .      i64 iKey;
2c8d0 0a 0a 20 20 20 20 20 20 66 6f 72 28 70 44 6c 69  ..      for(pDli
2c8e0 64 78 3d 66 74 73 35 44 6c 69 64 78 49 74 65 72  dx=fts5DlidxIter
2c8f0 49 6e 69 74 28 70 2c 20 30 2c 20 69 53 65 67 69  Init(p, 0, iSegi
2c900 64 2c 20 69 49 64 78 4c 65 61 66 29 3b 0a 20 20  d, iIdxLeaf);.  
2c910 20 20 20 20 20 20 20 20 66 74 73 35 44 6c 69 64          fts5Dlid
2c920 78 49 74 65 72 45 6f 66 28 70 2c 20 70 44 6c 69  xIterEof(p, pDli
2c930 64 78 29 3d 3d 30 3b 0a 20 20 20 20 20 20 20 20  dx)==0;.        
2c940 20 20 66 74 73 35 44 6c 69 64 78 49 74 65 72 4e    fts5DlidxIterN
2c950 65 78 74 28 70 2c 20 70 44 6c 69 64 78 29 0a 20  ext(p, pDlidx). 
2c960 20 20 20 20 20 29 7b 0a 0a 20 20 20 20 20 20 20       ){..       
2c970 20 2f 2a 20 43 68 65 63 6b 20 61 6e 79 20 72 6f   /* Check any ro
2c980 77 69 64 2d 6c 65 73 73 20 70 61 67 65 73 20 74  wid-less pages t
2c990 68 61 74 20 6f 63 63 75 72 20 62 65 66 6f 72 65  hat occur before
2c9a0 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c 65 61   the current lea
2c9b0 66 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 66 6f  f. */.        fo
2c9c0 72 28 69 50 67 3d 69 50 72 65 76 4c 65 61 66 2b  r(iPg=iPrevLeaf+
2c9d0 31 3b 20 69 50 67 3c 66 74 73 35 44 6c 69 64 78  1; iPg<fts5Dlidx
2c9e0 49 74 65 72 50 67 6e 6f 28 70 44 6c 69 64 78 29  IterPgno(pDlidx)
2c9f0 3b 20 69 50 67 2b 2b 29 7b 0a 20 20 20 20 20 20  ; iPg++){.      
2ca00 20 20 20 20 69 4b 65 79 20 3d 20 46 54 53 35 5f      iKey = FTS5_
2ca10 53 45 47 4d 45 4e 54 5f 52 4f 57 49 44 28 69 53  SEGMENT_ROWID(iS
2ca20 65 67 69 64 2c 20 69 50 67 29 3b 0a 20 20 20 20  egid, iPg);.    
2ca30 20 20 20 20 20 20 70 4c 65 61 66 20 3d 20 66 74        pLeaf = ft
2ca40 73 35 44 61 74 61 52 65 61 64 28 70 2c 20 69 4b  s5DataRead(p, iK
2ca50 65 79 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  ey);.          i
2ca60 66 28 20 70 4c 65 61 66 20 29 7b 0a 20 20 20 20  f( pLeaf ){.    
2ca70 20 20 20 20 20 20 20 20 69 66 28 20 66 74 73 35          if( fts5
2ca80 4c 65 61 66 46 69 72 73 74 52 6f 77 69 64 4f 66  LeafFirstRowidOf
2ca90 66 28 70 4c 65 61 66 29 21 3d 30 20 29 20 70 2d  f(pLeaf)!=0 ) p-
2caa0 3e 72 63 20 3d 20 46 54 53 35 5f 43 4f 52 52 55  >rc = FTS5_CORRU
2cab0 50 54 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  PT;.            
2cac0 66 74 73 35 44 61 74 61 52 65 6c 65 61 73 65 28  fts5DataRelease(
2cad0 70 4c 65 61 66 29 3b 0a 20 20 20 20 20 20 20 20  pLeaf);.        
2cae0 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
2caf0 20 20 20 20 20 20 69 50 72 65 76 4c 65 61 66 20        iPrevLeaf 
2cb00 3d 20 66 74 73 35 44 6c 69 64 78 49 74 65 72 50  = fts5DlidxIterP
2cb10 67 6e 6f 28 70 44 6c 69 64 78 29 3b 0a 0a 20 20  gno(pDlidx);..  
2cb20 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74        /* Check t
2cb30 68 61 74 20 74 68 65 20 6c 65 61 66 20 70 61 67  hat the leaf pag
2cb40 65 20 69 6e 64 69 63 61 74 65 64 20 62 79 20 74  e indicated by t
2cb50 68 65 20 69 74 65 72 61 74 6f 72 20 72 65 61 6c  he iterator real
2cb60 6c 79 20 64 6f 65 73 0a 20 20 20 20 20 20 20 20  ly does.        
2cb70 2a 2a 20 63 6f 6e 74 61 69 6e 20 74 68 65 20 72  ** contain the r
2cb80 6f 77 69 64 20 73 75 67 67 65 73 74 65 64 20 62  owid suggested b
2cb90 79 20 74 68 65 20 73 61 6d 65 2e 20 2a 2f 0a 20  y the same. */. 
2cba0 20 20 20 20 20 20 20 69 4b 65 79 20 3d 20 46 54         iKey = FT
2cbb0 53 35 5f 53 45 47 4d 45 4e 54 5f 52 4f 57 49 44  S5_SEGMENT_ROWID
2cbc0 28 69 53 65 67 69 64 2c 20 69 50 72 65 76 4c 65  (iSegid, iPrevLe
2cbd0 61 66 29 3b 0a 20 20 20 20 20 20 20 20 70 4c 65  af);.        pLe
2cbe0 61 66 20 3d 20 66 74 73 35 44 61 74 61 52 65 61  af = fts5DataRea
2cbf0 64 28 70 2c 20 69 4b 65 79 29 3b 0a 20 20 20 20  d(p, iKey);.    
2cc00 20 20 20 20 69 66 28 20 70 4c 65 61 66 20 29 7b      if( pLeaf ){
2cc10 0a 20 20 20 20 20 20 20 20 20 20 69 36 34 20 69  .          i64 i
2cc20 52 6f 77 69 64 3b 0a 20 20 20 20 20 20 20 20 20  Rowid;.         
2cc30 20 69 6e 74 20 69 52 6f 77 69 64 4f 66 66 20 3d   int iRowidOff =
2cc40 20 66 74 73 35 4c 65 61 66 46 69 72 73 74 52 6f   fts5LeafFirstRo
2cc50 77 69 64 4f 66 66 28 70 4c 65 61 66 29 3b 0a 20  widOff(pLeaf);. 
2cc60 20 20 20 20 20 20 20 20 20 41 53 53 45 52 54 5f           ASSERT_
2cc70 53 5a 4c 45 41 46 5f 4f 4b 28 70 4c 65 61 66 29  SZLEAF_OK(pLeaf)
2cc80 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
2cc90 69 52 6f 77 69 64 4f 66 66 3e 3d 70 4c 65 61 66  iRowidOff>=pLeaf
2cca0 2d 3e 73 7a 4c 65 61 66 20 29 7b 0a 20 20 20 20  ->szLeaf ){.    
2ccb0 20 20 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20          p->rc = 
2ccc0 46 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20  FTS5_CORRUPT;.  
2ccd0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
2cce0 20 20 20 20 20 20 20 20 20 20 20 66 74 73 35 47             fts5G
2ccf0 65 74 56 61 72 69 6e 74 28 26 70 4c 65 61 66 2d  etVarint(&pLeaf-
2cd00 3e 70 5b 69 52 6f 77 69 64 4f 66 66 5d 2c 20 28  >p[iRowidOff], (
2cd10 75 36 34 2a 29 26 69 52 6f 77 69 64 29 3b 0a 20  u64*)&iRowid);. 
2cd20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69             if( i
2cd30 52 6f 77 69 64 21 3d 66 74 73 35 44 6c 69 64 78  Rowid!=fts5Dlidx
2cd40 49 74 65 72 52 6f 77 69 64 28 70 44 6c 69 64 78  IterRowid(pDlidx
2cd50 29 20 29 20 70 2d 3e 72 63 20 3d 20 46 54 53 35  ) ) p->rc = FTS5
2cd60 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20 20 20 20  _CORRUPT;.      
2cd70 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
2cd80 66 74 73 35 44 61 74 61 52 65 6c 65 61 73 65 28  fts5DataRelease(
2cd90 70 4c 65 61 66 29 3b 0a 20 20 20 20 20 20 20 20  pLeaf);.        
2cda0 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  }.      }..     
2cdb0 20 69 44 6c 69 64 78 50 72 65 76 4c 65 61 66 20   iDlidxPrevLeaf 
2cdc0 3d 20 69 50 67 3b 0a 20 20 20 20 20 20 66 74 73  = iPg;.      fts
2cdd0 35 44 6c 69 64 78 49 74 65 72 46 72 65 65 28 70  5DlidxIterFree(p
2cde0 44 6c 69 64 78 29 3b 0a 20 20 20 20 20 20 66 74  Dlidx);.      ft
2cdf0 73 35 54 65 73 74 44 6c 69 64 78 52 65 76 65 72  s5TestDlidxRever
2ce00 73 65 28 70 2c 20 69 53 65 67 69 64 2c 20 69 49  se(p, iSegid, iI
2ce10 64 78 4c 65 61 66 29 3b 0a 20 20 20 20 7d 65 6c  dxLeaf);.    }el
2ce20 73 65 7b 0a 20 20 20 20 20 20 69 44 6c 69 64 78  se{.      iDlidx
2ce30 50 72 65 76 4c 65 61 66 20 3d 20 70 53 65 67 2d  PrevLeaf = pSeg-
2ce40 3e 70 67 6e 6f 4c 61 73 74 3b 0a 20 20 20 20 20  >pgnoLast;.     
2ce50 20 2f 2a 20 54 4f 44 4f 3a 20 43 68 65 63 6b 20   /* TODO: Check 
2ce60 74 68 65 72 65 20 69 73 20 6e 6f 20 64 6f 63 6c  there is no docl
2ce70 69 73 74 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20  ist index */.   
2ce80 20 7d 0a 0a 20 20 20 20 69 49 64 78 50 72 65 76   }..    iIdxPrev
2ce90 4c 65 61 66 20 3d 20 69 49 64 78 4c 65 61 66 3b  Leaf = iIdxLeaf;
2cea0 0a 20 20 7d 0a 0a 20 20 72 63 32 20 3d 20 73 71  .  }..  rc2 = sq
2ceb0 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70  lite3_finalize(p
2cec0 53 74 6d 74 29 3b 0a 20 20 69 66 28 20 70 2d 3e  Stmt);.  if( p->
2ced0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc==SQLITE_OK ) 
2cee0 70 2d 3e 72 63 20 3d 20 72 63 32 3b 0a 0a 20 20  p->rc = rc2;..  
2cef0 2f 2a 20 50 61 67 65 20 69 74 65 72 2e 69 4c 65  /* Page iter.iLe
2cf00 61 66 20 6d 75 73 74 20 6e 6f 77 20 62 65 20 74  af must now be t
2cf10 68 65 20 72 69 67 68 74 6d 6f 73 74 20 6c 65 61  he rightmost lea
2cf20 66 2d 70 61 67 65 20 69 6e 20 74 68 65 20 73 65  f-page in the se
2cf30 67 6d 65 6e 74 20 2a 2f 0a 23 69 66 20 30 0a 20  gment */.#if 0. 
2cf40 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49   if( p->rc==SQLI
2cf50 54 45 5f 4f 4b 20 26 26 20 69 74 65 72 2e 69 4c  TE_OK && iter.iL
2cf60 65 61 66 21 3d 70 53 65 67 2d 3e 70 67 6e 6f 4c  eaf!=pSeg->pgnoL
2cf70 61 73 74 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63  ast ){.    p->rc
2cf80 20 3d 20 46 54 53 35 5f 43 4f 52 52 55 50 54 3b   = FTS5_CORRUPT;
2cf90 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 0a  .  }.#endif.}...
2cfa0 2f 2a 0a 2a 2a 20 52 75 6e 20 69 6e 74 65 72 6e  /*.** Run intern
2cfb0 61 6c 20 63 68 65 63 6b 73 20 74 6f 20 65 6e 73  al checks to ens
2cfc0 75 72 65 20 74 68 61 74 20 74 68 65 20 46 54 53  ure that the FTS
2cfd0 20 69 6e 64 65 78 20 28 61 29 20 69 73 20 69 6e   index (a) is in
2cfe0 74 65 72 6e 61 6c 6c 79 20 0a 2a 2a 20 63 6f 6e  ternally .** con
2cff0 73 69 73 74 65 6e 74 20 61 6e 64 20 28 62 29 20  sistent and (b) 
2d000 63 6f 6e 74 61 69 6e 73 20 65 6e 74 72 69 65 73  contains entries
2d010 20 66 6f 72 20 77 68 69 63 68 20 74 68 65 20 58   for which the X
2d020 4f 52 20 6f 66 20 74 68 65 20 63 68 65 63 6b 73  OR of the checks
2d030 75 6d 73 0a 2a 2a 20 61 73 20 63 61 6c 63 75 6c  ums.** as calcul
2d040 61 74 65 64 20 62 79 20 73 71 6c 69 74 65 33 46  ated by sqlite3F
2d050 74 73 35 49 6e 64 65 78 45 6e 74 72 79 43 6b 73  ts5IndexEntryCks
2d060 75 6d 28 29 20 69 73 20 63 6b 73 75 6d 2e 0a 2a  um() is cksum..*
2d070 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49  *.** Return SQLI
2d080 54 45 5f 43 4f 52 52 55 50 54 20 69 66 20 61 6e  TE_CORRUPT if an
2d090 79 20 6f 66 20 74 68 65 20 69 6e 74 65 72 6e 61  y of the interna
2d0a0 6c 20 63 68 65 63 6b 73 20 66 61 69 6c 2c 20 6f  l checks fail, o
2d0b0 72 20 69 66 20 74 68 65 0a 2a 2a 20 63 68 65 63  r if the.** chec
2d0c0 6b 73 75 6d 20 64 6f 65 73 20 6e 6f 74 20 6d 61  ksum does not ma
2d0d0 74 63 68 2e 20 52 65 74 75 72 6e 20 53 51 4c 49  tch. Return SQLI
2d0e0 54 45 5f 4f 4b 20 69 66 20 61 6c 6c 20 63 68 65  TE_OK if all che
2d0f0 63 6b 73 20 70 61 73 73 20 77 69 74 68 6f 75 74  cks pass without
2d100 0a 2a 2a 20 65 72 72 6f 72 2c 20 6f 72 20 73 6f  .** error, or so
2d110 6d 65 20 6f 74 68 65 72 20 53 51 4c 69 74 65 20  me other SQLite 
2d120 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20 61 6e  error code if an
2d130 6f 74 68 65 72 20 65 72 72 6f 72 20 28 65 2e 67  other error (e.g
2d140 2e 20 4f 4f 4d 29 0a 2a 2a 20 6f 63 63 75 72 73  . OOM).** occurs
2d150 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
2d160 46 74 73 35 49 6e 64 65 78 49 6e 74 65 67 72 69  Fts5IndexIntegri
2d170 74 79 43 68 65 63 6b 28 46 74 73 35 49 6e 64 65  tyCheck(Fts5Inde
2d180 78 20 2a 70 2c 20 75 36 34 20 63 6b 73 75 6d 29  x *p, u64 cksum)
2d190 7b 0a 20 20 69 6e 74 20 65 44 65 74 61 69 6c 20  {.  int eDetail 
2d1a0 3d 20 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e 65 44  = p->pConfig->eD
2d1b0 65 74 61 69 6c 3b 0a 20 20 75 36 34 20 63 6b 73  etail;.  u64 cks
2d1c0 75 6d 32 20 3d 20 30 3b 20 20 20 20 20 20 20 20  um2 = 0;        
2d1d0 20 20 20 20 20 20 20 20 20 2f 2a 20 43 68 65 63           /* Chec
2d1e0 6b 73 75 6d 20 62 61 73 65 64 20 6f 6e 20 63 6f  ksum based on co
2d1f0 6e 74 65 6e 74 73 20 6f 66 20 69 6e 64 65 78 65  ntents of indexe
2d200 73 20 2a 2f 0a 20 20 46 74 73 35 42 75 66 66 65  s */.  Fts5Buffe
2d210 72 20 70 6f 73 6c 69 73 74 20 3d 20 7b 30 2c 30  r poslist = {0,0
2d220 2c 30 7d 3b 20 20 20 2f 2a 20 42 75 66 66 65 72  ,0};   /* Buffer
2d230 20 75 73 65 64 20 74 6f 20 68 6f 6c 64 20 61 20   used to hold a 
2d240 70 6f 73 6c 69 73 74 20 2a 2f 0a 20 20 46 74 73  poslist */.  Fts
2d250 35 49 74 65 72 20 2a 70 49 74 65 72 3b 20 20 20  5Iter *pIter;   
2d260 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2d270 55 73 65 64 20 74 6f 20 69 74 65 72 61 74 65 20  Used to iterate 
2d280 74 68 72 6f 75 67 68 20 65 6e 74 69 72 65 20 69  through entire i
2d290 6e 64 65 78 20 2a 2f 0a 20 20 46 74 73 35 53 74  ndex */.  Fts5St
2d2a0 72 75 63 74 75 72 65 20 2a 70 53 74 72 75 63 74  ructure *pStruct
2d2b0 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64  ;         /* Ind
2d2c0 65 78 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a  ex structure */.
2d2d0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
2d2e0 45 42 55 47 0a 20 20 2f 2a 20 55 73 65 64 20 62  EBUG.  /* Used b
2d2f0 79 20 65 78 74 72 61 20 69 6e 74 65 72 6e 61 6c  y extra internal
2d300 20 74 65 73 74 73 20 6f 6e 6c 79 20 72 75 6e 20   tests only run 
2d310 69 66 20 4e 44 45 42 55 47 20 69 73 20 6e 6f 74  if NDEBUG is not
2d320 20 64 65 66 69 6e 65 64 20 2a 2f 0a 20 20 75 36   defined */.  u6
2d330 34 20 63 6b 73 75 6d 33 20 3d 20 30 3b 20 20 20  4 cksum3 = 0;   
2d340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2d350 20 43 68 65 63 6b 73 75 6d 20 62 61 73 65 64 20   Checksum based 
2d360 6f 6e 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 69  on contents of i
2d370 6e 64 65 78 65 73 20 2a 2f 0a 20 20 46 74 73 35  ndexes */.  Fts5
2d380 42 75 66 66 65 72 20 74 65 72 6d 20 3d 20 7b 30  Buffer term = {0
2d390 2c 30 2c 30 7d 3b 20 20 20 20 20 20 2f 2a 20 42  ,0,0};      /* B
2d3a0 75 66 66 65 72 20 75 73 65 64 20 74 6f 20 68 6f  uffer used to ho
2d3b0 6c 64 20 6d 6f 73 74 20 72 65 63 65 6e 74 20 74  ld most recent t
2d3c0 65 72 6d 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20  erm */.#endif.  
2d3d0 63 6f 6e 73 74 20 69 6e 74 20 66 6c 61 67 73 20  const int flags 
2d3e0 3d 20 46 54 53 35 49 4e 44 45 58 5f 51 55 45 52  = FTS5INDEX_QUER
2d3f0 59 5f 4e 4f 4f 55 54 50 55 54 3b 0a 20 20 0a 20  Y_NOOUTPUT;.  . 
2d400 20 2f 2a 20 4c 6f 61 64 20 74 68 65 20 46 54 53   /* Load the FTS
2d410 20 69 6e 64 65 78 20 73 74 72 75 63 74 75 72 65   index structure
2d420 20 2a 2f 0a 20 20 70 53 74 72 75 63 74 20 3d 20   */.  pStruct = 
2d430 66 74 73 35 53 74 72 75 63 74 75 72 65 52 65 61  fts5StructureRea
2d440 64 28 70 29 3b 0a 0a 20 20 2f 2a 20 43 68 65 63  d(p);..  /* Chec
2d450 6b 20 74 68 61 74 20 74 68 65 20 69 6e 74 65 72  k that the inter
2d460 6e 61 6c 20 6e 6f 64 65 73 20 6f 66 20 65 61 63  nal nodes of eac
2d470 68 20 73 65 67 6d 65 6e 74 20 6d 61 74 63 68 20  h segment match 
2d480 74 68 65 20 6c 65 61 76 65 73 20 2a 2f 0a 20 20  the leaves */.  
2d490 69 66 28 20 70 53 74 72 75 63 74 20 29 7b 0a 20  if( pStruct ){. 
2d4a0 20 20 20 69 6e 74 20 69 4c 76 6c 2c 20 69 53 65     int iLvl, iSe
2d4b0 67 3b 0a 20 20 20 20 66 6f 72 28 69 4c 76 6c 3d  g;.    for(iLvl=
2d4c0 30 3b 20 69 4c 76 6c 3c 70 53 74 72 75 63 74 2d  0; iLvl<pStruct-
2d4d0 3e 6e 4c 65 76 65 6c 3b 20 69 4c 76 6c 2b 2b 29  >nLevel; iLvl++)
2d4e0 7b 0a 20 20 20 20 20 20 66 6f 72 28 69 53 65 67  {.      for(iSeg
2d4f0 3d 30 3b 20 69 53 65 67 3c 70 53 74 72 75 63 74  =0; iSeg<pStruct
2d500 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d 2e 6e  ->aLevel[iLvl].n
2d510 53 65 67 3b 20 69 53 65 67 2b 2b 29 7b 0a 20 20  Seg; iSeg++){.  
2d520 20 20 20 20 20 20 46 74 73 35 53 74 72 75 63 74        Fts5Struct
2d530 75 72 65 53 65 67 6d 65 6e 74 20 2a 70 53 65 67  ureSegment *pSeg
2d540 20 3d 20 26 70 53 74 72 75 63 74 2d 3e 61 4c 65   = &pStruct->aLe
2d550 76 65 6c 5b 69 4c 76 6c 5d 2e 61 53 65 67 5b 69  vel[iLvl].aSeg[i
2d560 53 65 67 5d 3b 0a 20 20 20 20 20 20 20 20 66 74  Seg];.        ft
2d570 73 35 49 6e 64 65 78 49 6e 74 65 67 72 69 74 79  s5IndexIntegrity
2d580 43 68 65 63 6b 53 65 67 6d 65 6e 74 28 70 2c 20  CheckSegment(p, 
2d590 70 53 65 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20  pSeg);.      }. 
2d5a0 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54     }.  }..  /* T
2d5b0 68 65 20 63 6b 73 75 6d 20 61 72 67 75 6d 65 6e  he cksum argumen
2d5c0 74 20 70 61 73 73 65 64 20 74 6f 20 74 68 69 73  t passed to this
2d5d0 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 63   function is a c
2d5e0 68 65 63 6b 73 75 6d 20 63 61 6c 63 75 6c 61 74  hecksum calculat
2d5f0 65 64 0a 20 20 2a 2a 20 62 61 73 65 64 20 6f 6e  ed.  ** based on
2d600 20 61 6c 6c 20 65 78 70 65 63 74 65 64 20 65 6e   all expected en
2d610 74 72 69 65 73 20 69 6e 20 74 68 65 20 46 54 53  tries in the FTS
2d620 20 69 6e 64 65 78 20 28 69 6e 63 6c 75 64 69 6e   index (includin
2d630 67 20 70 72 65 66 69 78 20 69 6e 64 65 78 0a 20  g prefix index. 
2d640 20 2a 2a 20 65 6e 74 72 69 65 73 29 2e 20 54 68   ** entries). Th
2d650 69 73 20 62 6c 6f 63 6b 20 63 68 65 63 6b 73 20  is block checks 
2d660 74 68 61 74 20 61 20 63 68 65 63 6b 73 75 6d 20  that a checksum 
2d670 63 61 6c 63 75 6c 61 74 65 64 20 62 61 73 65 64  calculated based
2d680 20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20 61 63 74   on the.  ** act
2d690 75 61 6c 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  ual contents of 
2d6a0 46 54 53 20 69 6e 64 65 78 20 69 73 20 69 64 65  FTS index is ide
2d6b0 6e 74 69 63 61 6c 2e 0a 20 20 2a 2a 0a 20 20 2a  ntical..  **.  *
2d6c0 2a 20 54 77 6f 20 76 65 72 73 69 6f 6e 73 20 6f  * Two versions o
2d6d0 66 20 74 68 65 20 73 61 6d 65 20 63 68 65 63 6b  f the same check
2d6e0 73 75 6d 20 61 72 65 20 63 61 6c 63 75 6c 61 74  sum are calculat
2d6f0 65 64 2e 20 54 68 65 20 66 69 72 73 74 20 28 73  ed. The first (s
2d700 74 61 63 6b 0a 20 20 2a 2a 20 76 61 72 69 61 62  tack.  ** variab
2d710 6c 65 20 63 6b 73 75 6d 32 29 20 62 61 73 65 64  le cksum2) based
2d720 20 6f 6e 20 65 6e 74 72 69 65 73 20 65 78 74 72   on entries extr
2d730 61 63 74 65 64 20 66 72 6f 6d 20 74 68 65 20 66  acted from the f
2d740 75 6c 6c 2d 74 65 78 74 20 69 6e 64 65 78 0a 20  ull-text index. 
2d750 20 2a 2a 20 77 68 69 6c 65 20 64 6f 69 6e 67 20   ** while doing 
2d760 61 20 6c 69 6e 65 61 72 20 73 63 61 6e 20 6f 66  a linear scan of
2d770 20 65 61 63 68 20 69 6e 64 69 76 69 64 75 61 6c   each individual
2d780 20 69 6e 64 65 78 20 69 6e 20 74 75 72 6e 2e 20   index in turn. 
2d790 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 73 20 65 61  .  **.  ** As ea
2d7a0 63 68 20 74 65 72 6d 20 76 69 73 69 74 65 64 20  ch term visited 
2d7b0 62 79 20 74 68 65 20 6c 69 6e 65 61 72 20 73 63  by the linear sc
2d7c0 61 6e 73 2c 20 61 20 73 65 70 61 72 61 74 65 20  ans, a separate 
2d7d0 71 75 65 72 79 20 66 6f 72 20 74 68 65 0a 20 20  query for the.  
2d7e0 2a 2a 20 73 61 6d 65 20 74 65 72 6d 20 69 73 20  ** same term is 
2d7f0 70 65 72 66 6f 72 6d 65 64 2e 20 63 6b 73 75 6d  performed. cksum
2d800 33 20 69 73 20 63 61 6c 63 75 6c 61 74 65 64 20  3 is calculated 
2d810 62 61 73 65 64 20 6f 6e 20 74 68 65 20 65 6e 74  based on the ent
2d820 72 69 65 73 0a 20 20 2a 2a 20 65 78 74 72 61 63  ries.  ** extrac
2d830 74 65 64 20 62 79 20 74 68 65 73 65 20 71 75 65  ted by these que
2d840 72 69 65 73 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72  ries..  */.  for
2d850 28 66 74 73 35 4d 75 6c 74 69 49 74 65 72 4e 65  (fts5MultiIterNe
2d860 77 28 70 2c 20 70 53 74 72 75 63 74 2c 20 66 6c  w(p, pStruct, fl
2d870 61 67 73 2c 20 30 2c 20 30 2c 20 30 2c 20 2d 31  ags, 0, 0, 0, -1
2d880 2c 20 30 2c 20 26 70 49 74 65 72 29 3b 0a 20 20  , 0, &pIter);.  
2d890 20 20 20 20 66 74 73 35 4d 75 6c 74 69 49 74 65      fts5MultiIte
2d8a0 72 45 6f 66 28 70 2c 20 70 49 74 65 72 29 3d 3d  rEof(p, pIter)==
2d8b0 30 3b 0a 20 20 20 20 20 20 66 74 73 35 4d 75 6c  0;.      fts5Mul
2d8c0 74 69 49 74 65 72 4e 65 78 74 28 70 2c 20 70 49  tiIterNext(p, pI
2d8d0 74 65 72 2c 20 30 2c 20 30 29 0a 20 20 29 7b 0a  ter, 0, 0).  ){.
2d8e0 20 20 20 20 69 6e 74 20 6e 3b 20 20 20 20 20 20      int n;      
2d8f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d900 2f 2a 20 53 69 7a 65 20 6f 66 20 74 65 72 6d 20  /* Size of term 
2d910 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 20 20  in bytes */.    
2d920 69 36 34 20 69 50 6f 73 20 3d 20 30 3b 20 20 20  i64 iPos = 0;   
2d930 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
2d940 6f 73 69 74 69 6f 6e 20 72 65 61 64 20 66 72 6f  osition read fro
2d950 6d 20 70 6f 73 6c 69 73 74 20 2a 2f 0a 20 20 20  m poslist */.   
2d960 20 69 6e 74 20 69 4f 66 66 20 3d 20 30 3b 20 20   int iOff = 0;  
2d970 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2d980 4f 66 66 73 65 74 20 77 69 74 68 69 6e 20 70 6f  Offset within po
2d990 73 6c 69 73 74 20 2a 2f 0a 20 20 20 20 69 36 34  slist */.    i64
2d9a0 20 69 52 6f 77 69 64 20 3d 20 66 74 73 35 4d 75   iRowid = fts5Mu
2d9b0 6c 74 69 49 74 65 72 52 6f 77 69 64 28 70 49 74  ltiIterRowid(pIt
2d9c0 65 72 29 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a  er);.    char *z
2d9d0 20 3d 20 28 63 68 61 72 2a 29 66 74 73 35 4d 75   = (char*)fts5Mu
2d9e0 6c 74 69 49 74 65 72 54 65 72 6d 28 70 49 74 65  ltiIterTerm(pIte
2d9f0 72 2c 20 26 6e 29 3b 0a 0a 20 20 20 20 2f 2a 20  r, &n);..    /* 
2da00 49 66 20 74 68 69 73 20 69 73 20 61 20 6e 65 77  If this is a new
2da10 20 74 65 72 6d 2c 20 71 75 65 72 79 20 66 6f 72   term, query for
2da20 20 69 74 2e 20 55 70 64 61 74 65 20 63 6b 73 75   it. Update cksu
2da30 6d 33 20 77 69 74 68 20 74 68 65 20 72 65 73 75  m3 with the resu
2da40 6c 74 73 2e 20 2a 2f 0a 20 20 20 20 66 74 73 35  lts. */.    fts5
2da50 54 65 73 74 54 65 72 6d 28 70 2c 20 26 74 65 72  TestTerm(p, &ter
2da60 6d 2c 20 7a 2c 20 6e 2c 20 63 6b 73 75 6d 32 2c  m, z, n, cksum2,
2da70 20 26 63 6b 73 75 6d 33 29 3b 0a 0a 20 20 20 20   &cksum3);..    
2da80 69 66 28 20 65 44 65 74 61 69 6c 3d 3d 46 54 53  if( eDetail==FTS
2da90 35 5f 44 45 54 41 49 4c 5f 4e 4f 4e 45 20 29 7b  5_DETAIL_NONE ){
2daa0 0a 20 20 20 20 20 20 69 66 28 20 30 3d 3d 66 74  .      if( 0==ft
2dab0 73 35 4d 75 6c 74 69 49 74 65 72 49 73 45 6d 70  s5MultiIterIsEmp
2dac0 74 79 28 70 2c 20 70 49 74 65 72 29 20 29 7b 0a  ty(p, pIter) ){.
2dad0 20 20 20 20 20 20 20 20 63 6b 73 75 6d 32 20 5e          cksum2 ^
2dae0 3d 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64  = sqlite3Fts5Ind
2daf0 65 78 45 6e 74 72 79 43 6b 73 75 6d 28 69 52 6f  exEntryCksum(iRo
2db00 77 69 64 2c 20 30 2c 20 30 2c 20 2d 31 2c 20 7a  wid, 0, 0, -1, z
2db10 2c 20 6e 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , n);.      }.  
2db20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
2db30 6f 73 6c 69 73 74 2e 6e 20 3d 20 30 3b 0a 20 20  oslist.n = 0;.  
2db40 20 20 20 20 66 74 73 35 53 65 67 69 74 65 72 50      fts5SegiterP
2db50 6f 73 6c 69 73 74 28 70 2c 20 26 70 49 74 65 72  oslist(p, &pIter
2db60 2d 3e 61 53 65 67 5b 70 49 74 65 72 2d 3e 61 46  ->aSeg[pIter->aF
2db70 69 72 73 74 5b 31 5d 2e 69 46 69 72 73 74 5d 2c  irst[1].iFirst],
2db80 20 30 2c 20 26 70 6f 73 6c 69 73 74 29 3b 0a 20   0, &poslist);. 
2db90 20 20 20 20 20 77 68 69 6c 65 28 20 30 3d 3d 73       while( 0==s
2dba0 71 6c 69 74 65 33 46 74 73 35 50 6f 73 6c 69 73  qlite3Fts5Poslis
2dbb0 74 4e 65 78 74 36 34 28 70 6f 73 6c 69 73 74 2e  tNext64(poslist.
2dbc0 70 2c 20 70 6f 73 6c 69 73 74 2e 6e 2c 20 26 69  p, poslist.n, &i
2dbd0 4f 66 66 2c 20 26 69 50 6f 73 29 20 29 7b 0a 20  Off, &iPos) ){. 
2dbe0 20 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6c 20         int iCol 
2dbf0 3d 20 46 54 53 35 5f 50 4f 53 32 43 4f 4c 55 4d  = FTS5_POS2COLUM
2dc00 4e 28 69 50 6f 73 29 3b 0a 20 20 20 20 20 20 20  N(iPos);.       
2dc10 20 69 6e 74 20 69 54 6f 6b 4f 66 66 20 3d 20 46   int iTokOff = F
2dc20 54 53 35 5f 50 4f 53 32 4f 46 46 53 45 54 28 69  TS5_POS2OFFSET(i
2dc30 50 6f 73 29 3b 0a 20 20 20 20 20 20 20 20 63 6b  Pos);.        ck
2dc40 73 75 6d 32 20 5e 3d 20 73 71 6c 69 74 65 33 46  sum2 ^= sqlite3F
2dc50 74 73 35 49 6e 64 65 78 45 6e 74 72 79 43 6b 73  ts5IndexEntryCks
2dc60 75 6d 28 69 52 6f 77 69 64 2c 20 69 43 6f 6c 2c  um(iRowid, iCol,
2dc70 20 69 54 6f 6b 4f 66 66 2c 20 2d 31 2c 20 7a 2c   iTokOff, -1, z,
2dc80 20 6e 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   n);.      }.   
2dc90 20 7d 0a 20 20 7d 0a 20 20 66 74 73 35 54 65 73   }.  }.  fts5Tes
2dca0 74 54 65 72 6d 28 70 2c 20 26 74 65 72 6d 2c 20  tTerm(p, &term, 
2dcb0 30 2c 20 30 2c 20 63 6b 73 75 6d 32 2c 20 26 63  0, 0, cksum2, &c
2dcc0 6b 73 75 6d 33 29 3b 0a 0a 20 20 66 74 73 35 4d  ksum3);..  fts5M
2dcd0 75 6c 74 69 49 74 65 72 46 72 65 65 28 70 49 74  ultiIterFree(pIt
2dce0 65 72 29 3b 0a 20 20 69 66 28 20 70 2d 3e 72 63  er);.  if( p->rc
2dcf0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 63  ==SQLITE_OK && c
2dd00 6b 73 75 6d 21 3d 63 6b 73 75 6d 32 20 29 20 70  ksum!=cksum2 ) p
2dd10 2d 3e 72 63 20 3d 20 46 54 53 35 5f 43 4f 52 52  ->rc = FTS5_CORR
2dd20 55 50 54 3b 0a 0a 20 20 66 74 73 35 53 74 72 75  UPT;..  fts5Stru
2dd30 63 74 75 72 65 52 65 6c 65 61 73 65 28 70 53 74  ctureRelease(pSt
2dd40 72 75 63 74 29 3b 0a 23 69 66 64 65 66 20 53 51  ruct);.#ifdef SQ
2dd50 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 66 74 73  LITE_DEBUG.  fts
2dd60 35 42 75 66 66 65 72 46 72 65 65 28 26 74 65 72  5BufferFree(&ter
2dd70 6d 29 3b 0a 23 65 6e 64 69 66 0a 20 20 66 74 73  m);.#endif.  fts
2dd80 35 42 75 66 66 65 72 46 72 65 65 28 26 70 6f 73  5BufferFree(&pos
2dd90 6c 69 73 74 29 3b 0a 20 20 72 65 74 75 72 6e 20  list);.  return 
2dda0 66 74 73 35 49 6e 64 65 78 52 65 74 75 72 6e 28  fts5IndexReturn(
2ddb0 70 29 3b 0a 7d 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a  p);.}../********
2ddc0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2ddd0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2dde0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2ddf0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2de00 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *.**************
2de10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2de20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2de30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2de40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20  ************.** 
2de50 42 65 6c 6f 77 20 74 68 69 73 20 70 6f 69 6e 74  Below this point
2de60 20 69 73 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e   is the implemen
2de70 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 66 74  tation of the ft
2de80 73 35 5f 64 65 63 6f 64 65 28 29 20 73 63 61 6c  s5_decode() scal
2de90 61 72 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 6f  ar.** function o
2dea0 6e 6c 79 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 44  nly..*/../*.** D
2deb0 65 63 6f 64 65 20 61 20 73 65 67 6d 65 6e 74 2d  ecode a segment-
2dec0 64 61 74 61 20 72 6f 77 69 64 20 66 72 6f 6d 20  data rowid from 
2ded0 74 68 65 20 25 5f 64 61 74 61 20 74 61 62 6c 65  the %_data table
2dee0 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  . This function 
2def0 69 73 0a 2a 2a 20 74 68 65 20 6f 70 70 6f 73 69  is.** the opposi
2df00 74 65 20 6f 66 20 6d 61 63 72 6f 20 46 54 53 35  te of macro FTS5
2df10 5f 53 45 47 4d 45 4e 54 5f 52 4f 57 49 44 28 29  _SEGMENT_ROWID()
2df20 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
2df30 20 66 74 73 35 44 65 63 6f 64 65 52 6f 77 69 64   fts5DecodeRowid
2df40 28 0a 20 20 69 36 34 20 69 52 6f 77 69 64 2c 20  (.  i64 iRowid, 
2df50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2df60 20 20 20 20 2f 2a 20 52 6f 77 69 64 20 66 72 6f      /* Rowid fro
2df70 6d 20 25 5f 64 61 74 61 20 74 61 62 6c 65 20 2a  m %_data table *
2df80 2f 0a 20 20 69 6e 74 20 2a 70 69 53 65 67 69 64  /.  int *piSegid
2df90 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
2dfa0 20 20 20 20 2f 2a 20 4f 55 54 3a 20 53 65 67 6d      /* OUT: Segm
2dfb0 65 6e 74 20 69 64 20 2a 2f 0a 20 20 69 6e 74 20  ent id */.  int 
2dfc0 2a 70 62 44 6c 69 64 78 2c 20 20 20 20 20 20 20  *pbDlidx,       
2dfd0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
2dfe0 55 54 3a 20 44 6c 69 64 78 20 66 6c 61 67 20 2a  UT: Dlidx flag *
2dff0 2f 0a 20 20 69 6e 74 20 2a 70 69 48 65 69 67 68  /.  int *piHeigh
2e000 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t,              
2e010 20 20 20 20 2f 2a 20 4f 55 54 3a 20 48 65 69 67      /* OUT: Heig
2e020 68 74 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 69 50  ht */.  int *piP
2e030 67 6e 6f 20 20 20 20 20 20 20 20 20 20 20 20 20  gno             
2e040 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20          /* OUT: 
2e050 50 61 67 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 29  Page number */.)
2e060 7b 0a 20 20 2a 70 69 50 67 6e 6f 20 3d 20 28 69  {.  *piPgno = (i
2e070 6e 74 29 28 69 52 6f 77 69 64 20 26 20 28 28 28  nt)(iRowid & (((
2e080 69 36 34 29 31 20 3c 3c 20 46 54 53 35 5f 44 41  i64)1 << FTS5_DA
2e090 54 41 5f 50 41 47 45 5f 42 29 20 2d 20 31 29 29  TA_PAGE_B) - 1))
2e0a0 3b 0a 20 20 69 52 6f 77 69 64 20 3e 3e 3d 20 46  ;.  iRowid >>= F
2e0b0 54 53 35 5f 44 41 54 41 5f 50 41 47 45 5f 42 3b  TS5_DATA_PAGE_B;
2e0c0 0a 0a 20 20 2a 70 69 48 65 69 67 68 74 20 3d 20  ..  *piHeight = 
2e0d0 28 69 6e 74 29 28 69 52 6f 77 69 64 20 26 20 28  (int)(iRowid & (
2e0e0 28 28 69 36 34 29 31 20 3c 3c 20 46 54 53 35 5f  ((i64)1 << FTS5_
2e0f0 44 41 54 41 5f 48 45 49 47 48 54 5f 42 29 20 2d  DATA_HEIGHT_B) -
2e100 20 31 29 29 3b 0a 20 20 69 52 6f 77 69 64 20 3e   1));.  iRowid >
2e110 3e 3d 20 46 54 53 35 5f 44 41 54 41 5f 48 45 49  >= FTS5_DATA_HEI
2e120 47 48 54 5f 42 3b 0a 0a 20 20 2a 70 62 44 6c 69  GHT_B;..  *pbDli
2e130 64 78 20 3d 20 28 69 6e 74 29 28 69 52 6f 77 69  dx = (int)(iRowi
2e140 64 20 26 20 30 78 30 30 30 31 29 3b 0a 20 20 69  d & 0x0001);.  i
2e150 52 6f 77 69 64 20 3e 3e 3d 20 46 54 53 35 5f 44  Rowid >>= FTS5_D
2e160 41 54 41 5f 44 4c 49 5f 42 3b 0a 0a 20 20 2a 70  ATA_DLI_B;..  *p
2e170 69 53 65 67 69 64 20 3d 20 28 69 6e 74 29 28 69  iSegid = (int)(i
2e180 52 6f 77 69 64 20 26 20 28 28 28 69 36 34 29 31  Rowid & (((i64)1
2e190 20 3c 3c 20 46 54 53 35 5f 44 41 54 41 5f 49 44   << FTS5_DATA_ID
2e1a0 5f 42 29 20 2d 20 31 29 29 3b 0a 7d 0a 0a 73 74  _B) - 1));.}..st
2e1b0 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 44 65  atic void fts5De
2e1c0 62 75 67 52 6f 77 69 64 28 69 6e 74 20 2a 70 52  bugRowid(int *pR
2e1d0 63 2c 20 46 74 73 35 42 75 66 66 65 72 20 2a 70  c, Fts5Buffer *p
2e1e0 42 75 66 2c 20 69 36 34 20 69 4b 65 79 29 7b 0a  Buf, i64 iKey){.
2e1f0 20 20 69 6e 74 20 69 53 65 67 69 64 2c 20 69 48    int iSegid, iH
2e200 65 69 67 68 74 2c 20 69 50 67 6e 6f 2c 20 62 44  eight, iPgno, bD
2e210 6c 69 64 78 3b 20 20 20 20 20 20 20 2f 2a 20 52  lidx;       /* R
2e220 6f 77 69 64 20 63 6f 6d 70 65 6e 65 6e 74 73 20  owid compenents 
2e230 2a 2f 0a 20 20 66 74 73 35 44 65 63 6f 64 65 52  */.  fts5DecodeR
2e240 6f 77 69 64 28 69 4b 65 79 2c 20 26 69 53 65 67  owid(iKey, &iSeg
2e250 69 64 2c 20 26 62 44 6c 69 64 78 2c 20 26 69 48  id, &bDlidx, &iH
2e260 65 69 67 68 74 2c 20 26 69 50 67 6e 6f 29 3b 0a  eight, &iPgno);.
2e270 0a 20 20 69 66 28 20 69 53 65 67 69 64 3d 3d 30  .  if( iSegid==0
2e280 20 29 7b 0a 20 20 20 20 69 66 28 20 69 4b 65 79   ){.    if( iKey
2e290 3d 3d 46 54 53 35 5f 41 56 45 52 41 47 45 53 5f  ==FTS5_AVERAGES_
2e2a0 52 4f 57 49 44 20 29 7b 0a 20 20 20 20 20 20 73  ROWID ){.      s
2e2b0 71 6c 69 74 65 33 46 74 73 35 42 75 66 66 65 72  qlite3Fts5Buffer
2e2c0 41 70 70 65 6e 64 50 72 69 6e 74 66 28 70 52 63  AppendPrintf(pRc
2e2d0 2c 20 70 42 75 66 2c 20 22 7b 61 76 65 72 61 67  , pBuf, "{averag
2e2e0 65 73 7d 20 22 29 3b 0a 20 20 20 20 7d 65 6c 73  es} ");.    }els
2e2f0 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  e{.      sqlite3
2e300 46 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64  Fts5BufferAppend
2e310 50 72 69 6e 74 66 28 70 52 63 2c 20 70 42 75 66  Printf(pRc, pBuf
2e320 2c 20 22 7b 73 74 72 75 63 74 75 72 65 7d 22 29  , "{structure}")
2e330 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 65 6c  ;.    }.  }.  el
2e340 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 46  se{.    sqlite3F
2e350 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 50  ts5BufferAppendP
2e360 72 69 6e 74 66 28 70 52 63 2c 20 70 42 75 66 2c  rintf(pRc, pBuf,
2e370 20 22 7b 25 73 73 65 67 69 64 3d 25 64 20 68 3d   "{%ssegid=%d h=
2e380 25 64 20 70 67 6e 6f 3d 25 64 7d 22 2c 0a 20 20  %d pgno=%d}",.  
2e390 20 20 20 20 20 20 62 44 6c 69 64 78 20 3f 20 22        bDlidx ? "
2e3a0 64 6c 69 64 78 20 22 20 3a 20 22 22 2c 20 69 53  dlidx " : "", iS
2e3b0 65 67 69 64 2c 20 69 48 65 69 67 68 74 2c 20 69  egid, iHeight, i
2e3c0 50 67 6e 6f 0a 20 20 20 20 29 3b 0a 20 20 7d 0a  Pgno.    );.  }.
2e3d0 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  }..static void f
2e3e0 74 73 35 44 65 62 75 67 53 74 72 75 63 74 75 72  ts5DebugStructur
2e3f0 65 28 0a 20 20 69 6e 74 20 2a 70 52 63 2c 20 20  e(.  int *pRc,  
2e400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e410 20 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20       /* IN/OUT: 
2e420 65 72 72 6f 72 20 63 6f 64 65 20 2a 2f 0a 20 20  error code */.  
2e430 46 74 73 35 42 75 66 66 65 72 20 2a 70 42 75 66  Fts5Buffer *pBuf
2e440 2c 0a 20 20 46 74 73 35 53 74 72 75 63 74 75 72  ,.  Fts5Structur
2e450 65 20 2a 70 0a 29 7b 0a 20 20 69 6e 74 20 69 4c  e *p.){.  int iL
2e460 76 6c 2c 20 69 53 65 67 3b 20 20 20 20 20 20 20  vl, iSeg;       
2e470 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 74 65            /* Ite
2e480 72 61 74 65 20 74 68 72 6f 75 67 68 20 6c 65 76  rate through lev
2e490 65 6c 73 2c 20 73 65 67 6d 65 6e 74 73 20 2a 2f  els, segments */
2e4a0 0a 0a 20 20 66 6f 72 28 69 4c 76 6c 3d 30 3b 20  ..  for(iLvl=0; 
2e4b0 69 4c 76 6c 3c 70 2d 3e 6e 4c 65 76 65 6c 3b 20  iLvl<p->nLevel; 
2e4c0 69 4c 76 6c 2b 2b 29 7b 0a 20 20 20 20 46 74 73  iLvl++){.    Fts
2e4d0 35 53 74 72 75 63 74 75 72 65 4c 65 76 65 6c 20  5StructureLevel 
2e4e0 2a 70 4c 76 6c 20 3d 20 26 70 2d 3e 61 4c 65 76  *pLvl = &p->aLev
2e4f0 65 6c 5b 69 4c 76 6c 5d 3b 0a 20 20 20 20 73 71  el[iLvl];.    sq
2e500 6c 69 74 65 33 46 74 73 35 42 75 66 66 65 72 41  lite3Fts5BufferA
2e510 70 70 65 6e 64 50 72 69 6e 74 66 28 70 52 63 2c  ppendPrintf(pRc,
2e520 20 70 42 75 66 2c 20 0a 20 20 20 20 20 20 20 20   pBuf, .        
2e530 22 20 7b 6c 76 6c 3d 25 64 20 6e 4d 65 72 67 65  " {lvl=%d nMerge
2e540 3d 25 64 20 6e 53 65 67 3d 25 64 22 2c 20 69 4c  =%d nSeg=%d", iL
2e550 76 6c 2c 20 70 4c 76 6c 2d 3e 6e 4d 65 72 67 65  vl, pLvl->nMerge
2e560 2c 20 70 4c 76 6c 2d 3e 6e 53 65 67 0a 20 20 20  , pLvl->nSeg.   
2e570 20 29 3b 0a 20 20 20 20 66 6f 72 28 69 53 65 67   );.    for(iSeg
2e580 3d 30 3b 20 69 53 65 67 3c 70 4c 76 6c 2d 3e 6e  =0; iSeg<pLvl->n
2e590 53 65 67 3b 20 69 53 65 67 2b 2b 29 7b 0a 20 20  Seg; iSeg++){.  
2e5a0 20 20 20 20 46 74 73 35 53 74 72 75 63 74 75 72      Fts5Structur
2e5b0 65 53 65 67 6d 65 6e 74 20 2a 70 53 65 67 20 3d  eSegment *pSeg =
2e5c0 20 26 70 4c 76 6c 2d 3e 61 53 65 67 5b 69 53 65   &pLvl->aSeg[iSe
2e5d0 67 5d 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  g];.      sqlite
2e5e0 33 46 74 73 35 42 75 66 66 65 72 41 70 70 65 6e  3Fts5BufferAppen
2e5f0 64 50 72 69 6e 74 66 28 70 52 63 2c 20 70 42 75  dPrintf(pRc, pBu
2e600 66 2c 20 22 20 7b 69 64 3d 25 64 20 6c 65 61 76  f, " {id=%d leav
2e610 65 73 3d 25 64 2e 2e 25 64 7d 22 2c 20 0a 20 20  es=%d..%d}", .  
2e620 20 20 20 20 20 20 20 20 70 53 65 67 2d 3e 69 53          pSeg->iS
2e630 65 67 69 64 2c 20 70 53 65 67 2d 3e 70 67 6e 6f  egid, pSeg->pgno
2e640 46 69 72 73 74 2c 20 70 53 65 67 2d 3e 70 67 6e  First, pSeg->pgn
2e650 6f 4c 61 73 74 0a 20 20 20 20 20 20 29 3b 0a 20  oLast.      );. 
2e660 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
2e670 46 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64  Fts5BufferAppend
2e680 50 72 69 6e 74 66 28 70 52 63 2c 20 70 42 75 66  Printf(pRc, pBuf
2e690 2c 20 22 7d 22 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  , "}");.  }.}../
2e6a0 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 70 61 72  *.** This is par
2e6b0 74 20 6f 66 20 74 68 65 20 66 74 73 35 5f 64 65  t of the fts5_de
2e6c0 63 6f 64 65 28 29 20 64 65 62 75 67 67 69 6e 67  code() debugging
2e6d0 20 61 69 64 2e 0a 2a 2a 0a 2a 2a 20 41 72 67 75   aid..**.** Argu
2e6e0 6d 65 6e 74 73 20 70 42 6c 6f 62 2f 6e 42 6c 6f  ments pBlob/nBlo
2e6f0 62 20 63 6f 6e 74 61 69 6e 20 61 20 73 65 72 69  b contain a seri
2e700 61 6c 69 7a 65 64 20 46 74 73 35 53 74 72 75 63  alized Fts5Struc
2e710 74 75 72 65 20 6f 62 6a 65 63 74 2e 20 54 68 69  ture object. Thi
2e720 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 61 70  s.** function ap
2e730 70 65 6e 64 73 20 61 20 68 75 6d 61 6e 2d 72 65  pends a human-re
2e740 61 64 61 62 6c 65 20 72 65 70 72 65 73 65 6e 74  adable represent
2e750 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 73 61 6d  ation of the sam
2e760 65 20 6f 62 6a 65 63 74 0a 2a 2a 20 74 6f 20 74  e object.** to t
2e770 68 65 20 62 75 66 66 65 72 20 70 61 73 73 65 64  he buffer passed
2e780 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61   as the second a
2e790 72 67 75 6d 65 6e 74 2e 20 0a 2a 2f 0a 73 74 61  rgument. .*/.sta
2e7a0 74 69 63 20 76 6f 69 64 20 66 74 73 35 44 65 63  tic void fts5Dec
2e7b0 6f 64 65 53 74 72 75 63 74 75 72 65 28 0a 20 20  odeStructure(.  
2e7c0 69 6e 74 20 2a 70 52 63 2c 20 20 20 20 20 20 20  int *pRc,       
2e7d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e7e0 2f 2a 20 49 4e 2f 4f 55 54 3a 20 65 72 72 6f 72  /* IN/OUT: error
2e7f0 20 63 6f 64 65 20 2a 2f 0a 20 20 46 74 73 35 42   code */.  Fts5B
2e800 75 66 66 65 72 20 2a 70 42 75 66 2c 0a 20 20 63  uffer *pBuf,.  c
2e810 6f 6e 73 74 20 75 38 20 2a 70 42 6c 6f 62 2c 20  onst u8 *pBlob, 
2e820 69 6e 74 20 6e 42 6c 6f 62 0a 29 7b 0a 20 20 69  int nBlob.){.  i
2e830 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
2e840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2e850 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
2e860 0a 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65  .  Fts5Structure
2e870 20 2a 70 20 3d 20 30 3b 20 20 20 20 20 20 20 20   *p = 0;        
2e880 20 20 20 2f 2a 20 44 65 63 6f 64 65 64 20 73 74     /* Decoded st
2e890 72 75 63 74 75 72 65 20 6f 62 6a 65 63 74 20 2a  ructure object *
2e8a0 2f 0a 0a 20 20 72 63 20 3d 20 66 74 73 35 53 74  /..  rc = fts5St
2e8b0 72 75 63 74 75 72 65 44 65 63 6f 64 65 28 70 42  ructureDecode(pB
2e8c0 6c 6f 62 2c 20 6e 42 6c 6f 62 2c 20 30 2c 20 26  lob, nBlob, 0, &
2e8d0 70 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  p);.  if( rc!=SQ
2e8e0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2a  LITE_OK ){.    *
2e8f0 70 52 63 20 3d 20 72 63 3b 0a 20 20 20 20 72 65  pRc = rc;.    re
2e900 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20 66 74 73  turn;.  }..  fts
2e910 35 44 65 62 75 67 53 74 72 75 63 74 75 72 65 28  5DebugStructure(
2e920 70 52 63 2c 20 70 42 75 66 2c 20 70 29 3b 0a 20  pRc, pBuf, p);. 
2e930 20 66 74 73 35 53 74 72 75 63 74 75 72 65 52 65   fts5StructureRe
2e940 6c 65 61 73 65 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a  lease(p);.}../*.
2e950 2a 2a 20 54 68 69 73 20 69 73 20 70 61 72 74 20  ** This is part 
2e960 6f 66 20 74 68 65 20 66 74 73 35 5f 64 65 63 6f  of the fts5_deco
2e970 64 65 28 29 20 64 65 62 75 67 67 69 6e 67 20 61  de() debugging a
2e980 69 64 2e 0a 2a 2a 0a 2a 2a 20 41 72 67 75 6d 65  id..**.** Argume
2e990 6e 74 73 20 70 42 6c 6f 62 2f 6e 42 6c 6f 62 20  nts pBlob/nBlob 
2e9a0 63 6f 6e 74 61 69 6e 20 61 6e 20 22 61 76 65 72  contain an "aver
2e9b0 61 67 65 73 22 20 72 65 63 6f 72 64 2e 20 54 68  ages" record. Th
2e9c0 69 73 20 66 75 6e 63 74 69 6f 6e 20 0a 2a 2a 20  is function .** 
2e9d0 61 70 70 65 6e 64 73 20 61 20 68 75 6d 61 6e 2d  appends a human-
2e9e0 72 65 61 64 61 62 6c 65 20 72 65 70 72 65 73 65  readable represe
2e9f0 6e 74 61 74 69 6f 6e 20 6f 66 20 72 65 63 6f 72  ntation of recor
2ea00 64 20 74 6f 20 74 68 65 20 62 75 66 66 65 72 20  d to the buffer 
2ea10 70 61 73 73 65 64 20 0a 2a 2a 20 61 73 20 74 68  passed .** as th
2ea20 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
2ea30 74 2e 20 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  t. .*/.static vo
2ea40 69 64 20 66 74 73 35 44 65 63 6f 64 65 41 76 65  id fts5DecodeAve
2ea50 72 61 67 65 73 28 0a 20 20 69 6e 74 20 2a 70 52  rages(.  int *pR
2ea60 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c,              
2ea70 20 20 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f           /* IN/O
2ea80 55 54 3a 20 65 72 72 6f 72 20 63 6f 64 65 20 2a  UT: error code *
2ea90 2f 0a 20 20 46 74 73 35 42 75 66 66 65 72 20 2a  /.  Fts5Buffer *
2eaa0 70 42 75 66 2c 0a 20 20 63 6f 6e 73 74 20 75 38  pBuf,.  const u8
2eab0 20 2a 70 42 6c 6f 62 2c 20 69 6e 74 20 6e 42 6c   *pBlob, int nBl
2eac0 6f 62 0a 29 7b 0a 20 20 69 6e 74 20 69 20 3d 20  ob.){.  int i = 
2ead0 30 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  0;.  const char 
2eae0 2a 7a 53 70 61 63 65 20 3d 20 22 22 3b 0a 0a 20  *zSpace = "";.. 
2eaf0 20 77 68 69 6c 65 28 20 69 3c 6e 42 6c 6f 62 20   while( i<nBlob 
2eb00 29 7b 0a 20 20 20 20 75 36 34 20 69 56 61 6c 3b  ){.    u64 iVal;
2eb10 0a 20 20 20 20 69 20 2b 3d 20 73 71 6c 69 74 65  .    i += sqlite
2eb20 33 46 74 73 35 47 65 74 56 61 72 69 6e 74 28 26  3Fts5GetVarint(&
2eb30 70 42 6c 6f 62 5b 69 5d 2c 20 26 69 56 61 6c 29  pBlob[i], &iVal)
2eb40 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 46 74 73  ;.    sqlite3Fts
2eb50 35 42 75 66 66 65 72 41 70 70 65 6e 64 50 72 69  5BufferAppendPri
2eb60 6e 74 66 28 70 52 63 2c 20 70 42 75 66 2c 20 22  ntf(pRc, pBuf, "
2eb70 25 73 25 64 22 2c 20 7a 53 70 61 63 65 2c 20 28  %s%d", zSpace, (
2eb80 69 6e 74 29 69 56 61 6c 29 3b 0a 20 20 20 20 7a  int)iVal);.    z
2eb90 53 70 61 63 65 20 3d 20 22 20 22 3b 0a 20 20 7d  Space = " ";.  }
2eba0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42 75 66 66 65 72  .}../*.** Buffer
2ebb0 20 28 61 2f 6e 29 20 69 73 20 61 73 73 75 6d 65   (a/n) is assume
2ebc0 64 20 74 6f 20 63 6f 6e 74 61 69 6e 20 61 20 6c  d to contain a l
2ebd0 69 73 74 20 6f 66 20 73 65 72 69 61 6c 69 7a 65  ist of serialize
2ebe0 64 20 76 61 72 69 6e 74 73 2e 20 52 65 61 64 0a  d varints. Read.
2ebf0 2a 2a 20 65 61 63 68 20 76 61 72 69 6e 74 20 61  ** each varint a
2ec00 6e 64 20 61 70 70 65 6e 64 20 69 74 73 20 73 74  nd append its st
2ec10 72 69 6e 67 20 72 65 70 72 65 73 65 6e 74 61 74  ring representat
2ec20 69 6f 6e 20 74 6f 20 62 75 66 66 65 72 20 70 42  ion to buffer pB
2ec30 75 66 2e 20 52 65 74 75 72 6e 0a 2a 2a 20 61 66  uf. Return.** af
2ec40 74 65 72 20 65 69 74 68 65 72 20 74 68 65 20 69  ter either the i
2ec50 6e 70 75 74 20 62 75 66 66 65 72 20 69 73 20 65  nput buffer is e
2ec60 78 68 61 75 73 74 65 64 20 6f 72 20 61 20 30 20  xhausted or a 0 
2ec70 76 61 6c 75 65 20 69 73 20 72 65 61 64 2e 0a 2a  value is read..*
2ec80 2a 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 20  *.** The return 
2ec90 76 61 6c 75 65 20 69 73 20 74 68 65 20 6e 75 6d  value is the num
2eca0 62 65 72 20 6f 66 20 62 79 74 65 73 20 72 65 61  ber of bytes rea
2ecb0 64 20 66 72 6f 6d 20 74 68 65 20 69 6e 70 75 74  d from the input
2ecc0 20 62 75 66 66 65 72 2e 0a 2a 2f 0a 73 74 61 74   buffer..*/.stat
2ecd0 69 63 20 69 6e 74 20 66 74 73 35 44 65 63 6f 64  ic int fts5Decod
2ece0 65 50 6f 73 6c 69 73 74 28 69 6e 74 20 2a 70 52  ePoslist(int *pR
2ecf0 63 2c 20 46 74 73 35 42 75 66 66 65 72 20 2a 70  c, Fts5Buffer *p
2ed00 42 75 66 2c 20 63 6f 6e 73 74 20 75 38 20 2a 61  Buf, const u8 *a
2ed10 2c 20 69 6e 74 20 6e 29 7b 0a 20 20 69 6e 74 20  , int n){.  int 
2ed20 69 4f 66 66 20 3d 20 30 3b 0a 20 20 77 68 69 6c  iOff = 0;.  whil
2ed30 65 28 20 69 4f 66 66 3c 6e 20 29 7b 0a 20 20 20  e( iOff<n ){.   
2ed40 20 69 6e 74 20 69 56 61 6c 3b 0a 20 20 20 20 69   int iVal;.    i
2ed50 4f 66 66 20 2b 3d 20 66 74 73 35 47 65 74 56 61  Off += fts5GetVa
2ed60 72 69 6e 74 33 32 28 26 61 5b 69 4f 66 66 5d 2c  rint32(&a[iOff],
2ed70 20 69 56 61 6c 29 3b 0a 20 20 20 20 73 71 6c 69   iVal);.    sqli
2ed80 74 65 33 46 74 73 35 42 75 66 66 65 72 41 70 70  te3Fts5BufferApp
2ed90 65 6e 64 50 72 69 6e 74 66 28 70 52 63 2c 20 70  endPrintf(pRc, p
2eda0 42 75 66 2c 20 22 20 25 64 22 2c 20 69 56 61 6c  Buf, " %d", iVal
2edb0 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
2edc0 69 4f 66 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  iOff;.}../*.** T
2edd0 68 65 20 73 74 61 72 74 20 6f 66 20 62 75 66 66  he start of buff
2ede0 65 72 20 28 61 2f 6e 29 20 63 6f 6e 74 61 69 6e  er (a/n) contain
2edf0 73 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 61  s the start of a
2ee00 20 64 6f 63 6c 69 73 74 2e 20 54 68 65 20 64 6f   doclist. The do
2ee10 63 6c 69 73 74 0a 2a 2a 20 6d 61 79 20 6f 72 20  clist.** may or 
2ee20 6d 61 79 20 6e 6f 74 20 66 69 6e 69 73 68 20 77  may not finish w
2ee30 69 74 68 69 6e 20 74 68 65 20 62 75 66 66 65 72  ithin the buffer
2ee40 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  . This function 
2ee50 61 70 70 65 6e 64 73 20 61 20 74 65 78 74 0a 2a  appends a text.*
2ee60 2a 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e  * representation
2ee70 20 6f 66 20 74 68 65 20 70 61 72 74 20 6f 66 20   of the part of 
2ee80 74 68 65 20 64 6f 63 6c 69 73 74 20 74 68 61 74  the doclist that
2ee90 20 69 73 20 70 72 65 73 65 6e 74 20 74 6f 20 62   is present to b
2eea0 75 66 66 65 72 0a 2a 2a 20 70 42 75 66 2e 20 0a  uffer.** pBuf. .
2eeb0 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e  **.** The return
2eec0 20 76 61 6c 75 65 20 69 73 20 74 68 65 20 6e 75   value is the nu
2eed0 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 72 65  mber of bytes re
2eee0 61 64 20 66 72 6f 6d 20 74 68 65 20 69 6e 70 75  ad from the inpu
2eef0 74 20 62 75 66 66 65 72 2e 0a 2a 2f 0a 73 74 61  t buffer..*/.sta
2ef00 74 69 63 20 69 6e 74 20 66 74 73 35 44 65 63 6f  tic int fts5Deco
2ef10 64 65 44 6f 63 6c 69 73 74 28 69 6e 74 20 2a 70  deDoclist(int *p
2ef20 52 63 2c 20 46 74 73 35 42 75 66 66 65 72 20 2a  Rc, Fts5Buffer *
2ef30 70 42 75 66 2c 20 63 6f 6e 73 74 20 75 38 20 2a  pBuf, const u8 *
2ef40 61 2c 20 69 6e 74 20 6e 29 7b 0a 20 20 69 36 34  a, int n){.  i64
2ef50 20 69 44 6f 63 69 64 20 3d 20 30 3b 0a 20 20 69   iDocid = 0;.  i
2ef60 6e 74 20 69 4f 66 66 20 3d 20 30 3b 0a 0a 20 20  nt iOff = 0;..  
2ef70 69 66 28 20 6e 3e 30 20 29 7b 0a 20 20 20 20 69  if( n>0 ){.    i
2ef80 4f 66 66 20 3d 20 73 71 6c 69 74 65 33 46 74 73  Off = sqlite3Fts
2ef90 35 47 65 74 56 61 72 69 6e 74 28 61 2c 20 28 75  5GetVarint(a, (u
2efa0 36 34 2a 29 26 69 44 6f 63 69 64 29 3b 0a 20 20  64*)&iDocid);.  
2efb0 20 20 73 71 6c 69 74 65 33 46 74 73 35 42 75 66    sqlite3Fts5Buf
2efc0 66 65 72 41 70 70 65 6e 64 50 72 69 6e 74 66 28  ferAppendPrintf(
2efd0 70 52 63 2c 20 70 42 75 66 2c 20 22 20 69 64 3d  pRc, pBuf, " id=
2efe0 25 6c 6c 64 22 2c 20 69 44 6f 63 69 64 29 3b 0a  %lld", iDocid);.
2eff0 20 20 7d 0a 20 20 77 68 69 6c 65 28 20 69 4f 66    }.  while( iOf
2f000 66 3c 6e 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e  f<n ){.    int n
2f010 50 6f 73 3b 0a 20 20 20 20 69 6e 74 20 62 44 65  Pos;.    int bDe
2f020 6c 3b 0a 20 20 20 20 69 4f 66 66 20 2b 3d 20 66  l;.    iOff += f
2f030 74 73 35 47 65 74 50 6f 73 6c 69 73 74 53 69 7a  ts5GetPoslistSiz
2f040 65 28 26 61 5b 69 4f 66 66 5d 2c 20 26 6e 50 6f  e(&a[iOff], &nPo
2f050 73 2c 20 26 62 44 65 6c 29 3b 0a 20 20 20 20 73  s, &bDel);.    s
2f060 71 6c 69 74 65 33 46 74 73 35 42 75 66 66 65 72  qlite3Fts5Buffer
2f070 41 70 70 65 6e 64 50 72 69 6e 74 66 28 70 52 63  AppendPrintf(pRc
2f080 2c 20 70 42 75 66 2c 20 22 20 6e 50 6f 73 3d 25  , pBuf, " nPos=%
2f090 64 25 73 22 2c 20 6e 50 6f 73 2c 20 62 44 65 6c  d%s", nPos, bDel
2f0a0 3f 22 2a 22 3a 22 22 29 3b 0a 20 20 20 20 69 4f  ?"*":"");.    iO
2f0b0 66 66 20 2b 3d 20 66 74 73 35 44 65 63 6f 64 65  ff += fts5Decode
2f0c0 50 6f 73 6c 69 73 74 28 70 52 63 2c 20 70 42 75  Poslist(pRc, pBu
2f0d0 66 2c 20 26 61 5b 69 4f 66 66 5d 2c 20 4d 49 4e  f, &a[iOff], MIN
2f0e0 28 6e 2d 69 4f 66 66 2c 20 6e 50 6f 73 29 29 3b  (n-iOff, nPos));
2f0f0 0a 20 20 20 20 69 66 28 20 69 4f 66 66 3c 6e 20  .    if( iOff<n 
2f100 29 7b 0a 20 20 20 20 20 20 69 36 34 20 69 44 65  ){.      i64 iDe
2f110 6c 74 61 3b 0a 20 20 20 20 20 20 69 4f 66 66 20  lta;.      iOff 
2f120 2b 3d 20 73 71 6c 69 74 65 33 46 74 73 35 47 65  += sqlite3Fts5Ge
2f130 74 56 61 72 69 6e 74 28 26 61 5b 69 4f 66 66 5d  tVarint(&a[iOff]
2f140 2c 20 28 75 36 34 2a 29 26 69 44 65 6c 74 61 29  , (u64*)&iDelta)
2f150 3b 0a 20 20 20 20 20 20 69 44 6f 63 69 64 20 2b  ;.      iDocid +
2f160 3d 20 69 44 65 6c 74 61 3b 0a 20 20 20 20 20 20  = iDelta;.      
2f170 73 71 6c 69 74 65 33 46 74 73 35 42 75 66 66 65  sqlite3Fts5Buffe
2f180 72 41 70 70 65 6e 64 50 72 69 6e 74 66 28 70 52  rAppendPrintf(pR
2f190 63 2c 20 70 42 75 66 2c 20 22 20 69 64 3d 25 6c  c, pBuf, " id=%l
2f1a0 6c 64 22 2c 20 69 44 6f 63 69 64 29 3b 0a 20 20  ld", iDocid);.  
2f1b0 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72    }.  }..  retur
2f1c0 6e 20 69 4f 66 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n iOff;.}../*.**
2f1d0 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
2f1e0 73 20 70 61 72 74 20 6f 66 20 74 68 65 20 66 74  s part of the ft
2f1f0 73 35 5f 64 65 63 6f 64 65 28 29 20 64 65 62 75  s5_decode() debu
2f200 67 67 69 6e 67 20 66 75 6e 63 74 69 6f 6e 2e 20  gging function. 
2f210 49 74 20 69 73 20 0a 2a 2a 20 6f 6e 6c 79 20 65  It is .** only e
2f220 76 65 72 20 75 73 65 64 20 77 69 74 68 20 64 65  ver used with de
2f230 74 61 69 6c 3d 6e 6f 6e 65 20 74 61 62 6c 65 73  tail=none tables
2f240 2e 0a 2a 2a 0a 2a 2a 20 42 75 66 66 65 72 20 28  ..**.** Buffer (
2f250 70 44 61 74 61 2f 6e 44 61 74 61 29 20 63 6f 6e  pData/nData) con
2f260 74 61 69 6e 73 20 61 20 64 6f 63 6c 69 73 74 20  tains a doclist 
2f270 69 6e 20 74 68 65 20 66 6f 72 6d 61 74 20 75 73  in the format us
2f280 65 64 20 62 79 20 64 65 74 61 69 6c 3d 6e 6f 6e  ed by detail=non
2f290 65 0a 2a 2a 20 74 61 62 6c 65 73 2e 20 54 68 69  e.** tables. Thi
2f2a0 73 20 66 75 6e 63 74 69 6f 6e 20 61 70 70 65 6e  s function appen
2f2b0 64 73 20 61 20 68 75 6d 61 6e 2d 72 65 61 64 61  ds a human-reada
2f2c0 62 6c 65 20 76 65 72 73 69 6f 6e 20 6f 66 20 74  ble version of t
2f2d0 68 61 74 20 6c 69 73 74 20 74 6f 0a 2a 2a 20 62  hat list to.** b
2f2e0 75 66 66 65 72 20 70 42 75 66 2e 0a 2a 2a 0a 2a  uffer pBuf..**.*
2f2f0 2a 20 49 66 20 2a 70 52 63 20 69 73 20 6f 74 68  * If *pRc is oth
2f300 65 72 20 74 68 61 6e 20 53 51 4c 49 54 45 5f 4f  er than SQLITE_O
2f310 4b 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63  K when this func
2f320 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20  tion is called, 
2f330 69 74 20 69 73 20 61 0a 2a 2a 20 6e 6f 2d 6f 70  it is a.** no-op
2f340 2e 20 49 66 20 61 6e 20 4f 4f 4d 20 6f 72 20 6f  . If an OOM or o
2f350 74 68 65 72 20 65 72 72 6f 72 20 6f 63 63 75 72  ther error occur
2f360 73 20 77 69 74 68 69 6e 20 74 68 69 73 20 66 75  s within this fu
2f370 6e 63 74 69 6f 6e 2c 20 2a 70 52 63 20 69 73 0a  nction, *pRc is.
2f380 2a 2a 20 73 65 74 20 74 6f 20 61 6e 20 53 51 4c  ** set to an SQL
2f390 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 62  ite error code b
2f3a0 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e  efore returning.
2f3b0 20 54 68 65 20 66 69 6e 61 6c 20 73 74 61 74 65   The final state
2f3c0 20 6f 66 20 62 75 66 66 65 72 0a 2a 2a 20 70 42   of buffer.** pB
2f3d0 75 66 20 69 73 20 75 6e 64 65 66 69 6e 65 64 20  uf is undefined 
2f3e0 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 2a 2f  in this case..*/
2f3f0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
2f400 35 44 65 63 6f 64 65 52 6f 77 69 64 4c 69 73 74  5DecodeRowidList
2f410 28 0a 20 20 69 6e 74 20 2a 70 52 63 2c 20 20 20  (.  int *pRc,   
2f420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f430 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 45      /* IN/OUT: E
2f440 72 72 6f 72 20 63 6f 64 65 20 2a 2f 0a 20 20 46  rror code */.  F
2f450 74 73 35 42 75 66 66 65 72 20 2a 70 42 75 66 2c  ts5Buffer *pBuf,
2f460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2f470 2a 20 42 75 66 66 65 72 20 74 6f 20 61 70 70 65  * Buffer to appe
2f480 6e 64 20 74 65 78 74 20 74 6f 20 2a 2f 0a 20 20  nd text to */.  
2f490 63 6f 6e 73 74 20 75 38 20 2a 70 44 61 74 61 2c  const u8 *pData,
2f4a0 20 69 6e 74 20 6e 44 61 74 61 20 20 20 20 20 20   int nData      
2f4b0 2f 2a 20 44 61 74 61 20 74 6f 20 64 65 63 6f 64  /* Data to decod
2f4c0 65 20 6c 69 73 74 2d 6f 66 2d 72 6f 77 69 64 73  e list-of-rowids
2f4d0 20 66 72 6f 6d 20 2a 2f 0a 29 7b 0a 20 20 69 6e   from */.){.  in
2f4e0 74 20 69 20 3d 20 30 3b 0a 20 20 69 36 34 20 69  t i = 0;.  i64 i
2f4f0 52 6f 77 69 64 20 3d 20 30 3b 0a 0a 20 20 77 68  Rowid = 0;..  wh
2f500 69 6c 65 28 20 69 3c 6e 44 61 74 61 20 29 7b 0a  ile( i<nData ){.
2f510 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
2f520 7a 41 70 70 20 3d 20 22 22 3b 0a 20 20 20 20 75  zApp = "";.    u
2f530 36 34 20 69 56 61 6c 3b 0a 20 20 20 20 69 20 2b  64 iVal;.    i +
2f540 3d 20 73 71 6c 69 74 65 33 46 74 73 35 47 65 74  = sqlite3Fts5Get
2f550 56 61 72 69 6e 74 28 26 70 44 61 74 61 5b 69 5d  Varint(&pData[i]
2f560 2c 20 26 69 56 61 6c 29 3b 0a 20 20 20 20 69 52  , &iVal);.    iR
2f570 6f 77 69 64 20 2b 3d 20 69 56 61 6c 3b 0a 0a 20  owid += iVal;.. 
2f580 20 20 20 69 66 28 20 69 3c 6e 44 61 74 61 20 26     if( i<nData &
2f590 26 20 70 44 61 74 61 5b 69 5d 3d 3d 30 78 30 30  & pData[i]==0x00
2f5a0 20 29 7b 0a 20 20 20 20 20 20 69 2b 2b 3b 0a 20   ){.      i++;. 
2f5b0 20 20 20 20 20 69 66 28 20 69 3c 6e 44 61 74 61       if( i<nData
2f5c0 20 26 26 20 70 44 61 74 61 5b 69 5d 3d 3d 30 78   && pData[i]==0x
2f5d0 30 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 2b  00 ){.        i+
2f5e0 2b 3b 0a 20 20 20 20 20 20 20 20 7a 41 70 70 20  +;.        zApp 
2f5f0 3d 20 22 2b 22 3b 0a 20 20 20 20 20 20 7d 65 6c  = "+";.      }el
2f600 73 65 7b 0a 20 20 20 20 20 20 20 20 7a 41 70 70  se{.        zApp
2f610 20 3d 20 22 2a 22 3b 0a 20 20 20 20 20 20 7d 0a   = "*";.      }.
2f620 20 20 20 20 7d 0a 0a 20 20 20 20 73 71 6c 69 74      }..    sqlit
2f630 65 33 46 74 73 35 42 75 66 66 65 72 41 70 70 65  e3Fts5BufferAppe
2f640 6e 64 50 72 69 6e 74 66 28 70 52 63 2c 20 70 42  ndPrintf(pRc, pB
2f650 75 66 2c 20 22 20 25 6c 6c 64 25 73 22 2c 20 69  uf, " %lld%s", i
2f660 52 6f 77 69 64 2c 20 7a 41 70 70 29 3b 0a 20 20  Rowid, zApp);.  
2f670 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 69  }.}../*.** The i
2f680 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66  mplementation of
2f690 20 75 73 65 72 2d 64 65 66 69 6e 65 64 20 73 63   user-defined sc
2f6a0 61 6c 61 72 20 66 75 6e 63 74 69 6f 6e 20 66 74  alar function ft
2f6b0 73 35 5f 64 65 63 6f 64 65 28 29 2e 0a 2a 2f 0a  s5_decode()..*/.
2f6c0 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
2f6d0 44 65 63 6f 64 65 46 75 6e 63 74 69 6f 6e 28 0a  DecodeFunction(.
2f6e0 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78    sqlite3_contex
2f6f0 74 20 2a 70 43 74 78 2c 20 20 20 20 20 20 20 20  t *pCtx,        
2f700 20 20 2f 2a 20 46 75 6e 63 74 69 6f 6e 20 63 61    /* Function ca
2f710 6c 6c 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ll context */.  
2f720 69 6e 74 20 6e 41 72 67 2c 20 20 20 20 20 20 20  int nArg,       
2f730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f740 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67  /* Number of arg
2f750 73 20 28 61 6c 77 61 79 73 20 32 29 20 2a 2f 0a  s (always 2) */.
2f760 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20    sqlite3_value 
2f770 2a 2a 61 70 56 61 6c 20 20 20 20 20 20 20 20 20  **apVal         
2f780 20 20 2f 2a 20 46 75 6e 63 74 69 6f 6e 20 61 72    /* Function ar
2f790 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20  guments */.){.  
2f7a0 69 36 34 20 69 52 6f 77 69 64 3b 20 20 20 20 20  i64 iRowid;     
2f7b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f7c0 2f 2a 20 52 6f 77 69 64 20 66 6f 72 20 72 65 63  /* Rowid for rec
2f7d0 6f 72 64 20 62 65 69 6e 67 20 64 65 63 6f 64 65  ord being decode
2f7e0 64 20 2a 2f 0a 20 20 69 6e 74 20 69 53 65 67 69  d */.  int iSegi
2f7f0 64 2c 69 48 65 69 67 68 74 2c 69 50 67 6e 6f 2c  d,iHeight,iPgno,
2f800 62 44 6c 69 64 78 3b 2f 2a 20 52 6f 77 69 64 20  bDlidx;/* Rowid 
2f810 63 6f 6d 70 6f 6e 65 6e 74 73 20 2a 2f 0a 20 20  components */.  
2f820 63 6f 6e 73 74 20 75 38 20 2a 61 42 6c 6f 62 3b  const u8 *aBlob;
2f830 20 69 6e 74 20 6e 3b 20 20 20 20 20 20 20 20 20   int n;         
2f840 2f 2a 20 52 65 63 6f 72 64 20 74 6f 20 64 65 63  /* Record to dec
2f850 6f 64 65 20 2a 2f 0a 20 20 75 38 20 2a 61 20 3d  ode */.  u8 *a =
2f860 20 30 3b 0a 20 20 46 74 73 35 42 75 66 66 65 72   0;.  Fts5Buffer
2f870 20 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   s;             
2f880 20 20 20 20 20 20 2f 2a 20 42 75 69 6c 64 20 75        /* Build u
2f890 70 20 74 65 78 74 20 74 6f 20 72 65 74 75 72 6e  p text to return
2f8a0 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20 72   here */.  int r
2f8b0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  c = SQLITE_OK;  
2f8c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
2f8d0 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69  turn code */.  i
2f8e0 6e 74 20 6e 53 70 61 63 65 20 3d 20 30 3b 0a 20  nt nSpace = 0;. 
2f8f0 20 69 6e 74 20 65 44 65 74 61 69 6c 4e 6f 6e 65   int eDetailNone
2f900 20 3d 20 28 73 71 6c 69 74 65 33 5f 75 73 65 72   = (sqlite3_user
2f910 5f 64 61 74 61 28 70 43 74 78 29 21 3d 30 29 3b  _data(pCtx)!=0);
2f920 0a 0a 20 20 61 73 73 65 72 74 28 20 6e 41 72 67  ..  assert( nArg
2f930 3d 3d 32 20 29 3b 0a 20 20 55 4e 55 53 45 44 5f  ==2 );.  UNUSED_
2f940 50 41 52 41 4d 28 6e 41 72 67 29 3b 0a 20 20 6d  PARAM(nArg);.  m
2f950 65 6d 73 65 74 28 26 73 2c 20 30 2c 20 73 69 7a  emset(&s, 0, siz
2f960 65 6f 66 28 46 74 73 35 42 75 66 66 65 72 29 29  eof(Fts5Buffer))
2f970 3b 0a 20 20 69 52 6f 77 69 64 20 3d 20 73 71 6c  ;.  iRowid = sql
2f980 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 36 34  ite3_value_int64
2f990 28 61 70 56 61 6c 5b 30 5d 29 3b 0a 0a 20 20 2f  (apVal[0]);..  /
2f9a0 2a 20 4d 61 6b 65 20 61 20 63 6f 70 79 20 6f 66  * Make a copy of
2f9b0 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
2f9c0 6d 65 6e 74 20 28 61 20 62 6c 6f 62 29 20 69 6e  ment (a blob) in
2f9d0 20 61 42 6c 6f 62 5b 5d 2e 20 54 68 65 20 61 42   aBlob[]. The aB
2f9e0 6c 6f 62 5b 5d 0a 20 20 2a 2a 20 63 6f 70 79 20  lob[].  ** copy 
2f9f0 69 73 20 66 6f 6c 6c 6f 77 65 64 20 62 79 20 46  is followed by F
2fa00 54 53 35 5f 44 41 54 41 5f 5a 45 52 4f 5f 50 41  TS5_DATA_ZERO_PA
2fa10 44 44 49 4e 47 20 30 78 30 30 20 62 79 74 65 73  DDING 0x00 bytes
2fa20 2c 20 77 68 69 63 68 20 70 72 65 76 65 6e 74 73  , which prevents
2fa30 0a 20 20 2a 2a 20 62 75 66 66 65 72 20 6f 76 65  .  ** buffer ove
2fa40 72 72 65 61 64 73 20 65 76 65 6e 20 69 66 20 74  rreads even if t
2fa50 68 65 20 72 65 63 6f 72 64 20 69 73 20 63 6f 72  he record is cor
2fa60 72 75 70 74 2e 20 20 2a 2f 0a 20 20 6e 20 3d 20  rupt.  */.  n = 
2fa70 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 79  sqlite3_value_by
2fa80 74 65 73 28 61 70 56 61 6c 5b 31 5d 29 3b 0a 20  tes(apVal[1]);. 
2fa90 20 61 42 6c 6f 62 20 3d 20 73 71 6c 69 74 65 33   aBlob = sqlite3
2faa0 5f 76 61 6c 75 65 5f 62 6c 6f 62 28 61 70 56 61  _value_blob(apVa
2fab0 6c 5b 31 5d 29 3b 0a 20 20 6e 53 70 61 63 65 20  l[1]);.  nSpace 
2fac0 3d 20 6e 20 2b 20 46 54 53 35 5f 44 41 54 41 5f  = n + FTS5_DATA_
2fad0 5a 45 52 4f 5f 50 41 44 44 49 4e 47 3b 0a 20 20  ZERO_PADDING;.  
2fae0 61 20 3d 20 28 75 38 2a 29 73 71 6c 69 74 65 33  a = (u8*)sqlite3
2faf0 46 74 73 35 4d 61 6c 6c 6f 63 5a 65 72 6f 28 26  Fts5MallocZero(&
2fb00 72 63 2c 20 6e 53 70 61 63 65 29 3b 0a 20 20 69  rc, nSpace);.  i
2fb10 66 28 20 61 3d 3d 30 20 29 20 67 6f 74 6f 20 64  f( a==0 ) goto d
2fb20 65 63 6f 64 65 5f 6f 75 74 3b 0a 20 20 6d 65 6d  ecode_out;.  mem
2fb30 63 70 79 28 61 2c 20 61 42 6c 6f 62 2c 20 6e 29  cpy(a, aBlob, n)
2fb40 3b 0a 0a 0a 20 20 66 74 73 35 44 65 63 6f 64 65  ;...  fts5Decode
2fb50 52 6f 77 69 64 28 69 52 6f 77 69 64 2c 20 26 69  Rowid(iRowid, &i
2fb60 53 65 67 69 64 2c 20 26 62 44 6c 69 64 78 2c 20  Segid, &bDlidx, 
2fb70 26 69 48 65 69 67 68 74 2c 20 26 69 50 67 6e 6f  &iHeight, &iPgno
2fb80 29 3b 0a 0a 20 20 66 74 73 35 44 65 62 75 67 52  );..  fts5DebugR
2fb90 6f 77 69 64 28 26 72 63 2c 20 26 73 2c 20 69 52  owid(&rc, &s, iR
2fba0 6f 77 69 64 29 3b 0a 20 20 69 66 28 20 62 44 6c  owid);.  if( bDl
2fbb0 69 64 78 20 29 7b 0a 20 20 20 20 46 74 73 35 44  idx ){.    Fts5D
2fbc0 61 74 61 20 64 6c 69 64 78 3b 0a 20 20 20 20 46  ata dlidx;.    F
2fbd0 74 73 35 44 6c 69 64 78 4c 76 6c 20 6c 76 6c 3b  ts5DlidxLvl lvl;
2fbe0 0a 0a 20 20 20 20 64 6c 69 64 78 2e 70 20 3d 20  ..    dlidx.p = 
2fbf0 61 3b 0a 20 20 20 20 64 6c 69 64 78 2e 6e 6e 20  a;.    dlidx.nn 
2fc00 3d 20 6e 3b 0a 0a 20 20 20 20 6d 65 6d 73 65 74  = n;..    memset
2fc10 28 26 6c 76 6c 2c 20 30 2c 20 73 69 7a 65 6f 66  (&lvl, 0, sizeof
2fc20 28 46 74 73 35 44 6c 69 64 78 4c 76 6c 29 29 3b  (Fts5DlidxLvl));
2fc30 0a 20 20 20 20 6c 76 6c 2e 70 44 61 74 61 20 3d  .    lvl.pData =
2fc40 20 26 64 6c 69 64 78 3b 0a 20 20 20 20 6c 76 6c   &dlidx;.    lvl
2fc50 2e 69 4c 65 61 66 50 67 6e 6f 20 3d 20 69 50 67  .iLeafPgno = iPg
2fc60 6e 6f 3b 0a 0a 20 20 20 20 66 6f 72 28 66 74 73  no;..    for(fts
2fc70 35 44 6c 69 64 78 4c 76 6c 4e 65 78 74 28 26 6c  5DlidxLvlNext(&l
2fc80 76 6c 29 3b 20 6c 76 6c 2e 62 45 6f 66 3d 3d 30  vl); lvl.bEof==0
2fc90 3b 20 66 74 73 35 44 6c 69 64 78 4c 76 6c 4e 65  ; fts5DlidxLvlNe
2fca0 78 74 28 26 6c 76 6c 29 29 7b 0a 20 20 20 20 20  xt(&lvl)){.     
2fcb0 20 73 71 6c 69 74 65 33 46 74 73 35 42 75 66 66   sqlite3Fts5Buff
2fcc0 65 72 41 70 70 65 6e 64 50 72 69 6e 74 66 28 26  erAppendPrintf(&
2fcd0 72 63 2c 20 26 73 2c 20 0a 20 20 20 20 20 20 20  rc, &s, .       
2fce0 20 20 20 22 20 25 64 28 25 6c 6c 64 29 22 2c 20     " %d(%lld)", 
2fcf0 6c 76 6c 2e 69 4c 65 61 66 50 67 6e 6f 2c 20 6c  lvl.iLeafPgno, l
2fd00 76 6c 2e 69 52 6f 77 69 64 0a 20 20 20 20 20 20  vl.iRowid.      
2fd10 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  );.    }.  }else
2fd20 20 69 66 28 20 69 53 65 67 69 64 3d 3d 30 20 29   if( iSegid==0 )
2fd30 7b 0a 20 20 20 20 69 66 28 20 69 52 6f 77 69 64  {.    if( iRowid
2fd40 3d 3d 46 54 53 35 5f 41 56 45 52 41 47 45 53 5f  ==FTS5_AVERAGES_
2fd50 52 4f 57 49 44 20 29 7b 0a 20 20 20 20 20 20 66  ROWID ){.      f
2fd60 74 73 35 44 65 63 6f 64 65 41 76 65 72 61 67 65  ts5DecodeAverage
2fd70 73 28 26 72 63 2c 20 26 73 2c 20 61 2c 20 6e 29  s(&rc, &s, a, n)
2fd80 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
2fd90 20 20 20 66 74 73 35 44 65 63 6f 64 65 53 74 72     fts5DecodeStr
2fda0 75 63 74 75 72 65 28 26 72 63 2c 20 26 73 2c 20  ucture(&rc, &s, 
2fdb0 61 2c 20 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  a, n);.    }.  }
2fdc0 65 6c 73 65 20 69 66 28 20 65 44 65 74 61 69 6c  else if( eDetail
2fdd0 4e 6f 6e 65 20 29 7b 0a 20 20 20 20 46 74 73 35  None ){.    Fts5
2fde0 42 75 66 66 65 72 20 74 65 72 6d 3b 20 20 20 20  Buffer term;    
2fdf0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72            /* Cur
2fe00 72 65 6e 74 20 74 65 72 6d 20 72 65 61 64 20 66  rent term read f
2fe10 72 6f 6d 20 70 61 67 65 20 2a 2f 0a 20 20 20 20  rom page */.    
2fe20 69 6e 74 20 73 7a 4c 65 61 66 3b 0a 20 20 20 20  int szLeaf;.    
2fe30 69 6e 74 20 69 50 67 69 64 78 4f 66 66 20 3d 20  int iPgidxOff = 
2fe40 73 7a 4c 65 61 66 20 3d 20 66 74 73 35 47 65 74  szLeaf = fts5Get
2fe50 55 31 36 28 26 61 5b 32 5d 29 3b 0a 20 20 20 20  U16(&a[2]);.    
2fe60 69 6e 74 20 69 54 65 72 6d 4f 66 66 3b 0a 20 20  int iTermOff;.  
2fe70 20 20 69 6e 74 20 6e 4b 65 65 70 20 3d 20 30 3b    int nKeep = 0;
2fe80 0a 20 20 20 20 69 6e 74 20 69 4f 66 66 3b 0a 0a  .    int iOff;..
2fe90 20 20 20 20 6d 65 6d 73 65 74 28 26 74 65 72 6d      memset(&term
2fea0 2c 20 30 2c 20 73 69 7a 65 6f 66 28 46 74 73 35  , 0, sizeof(Fts5
2feb0 42 75 66 66 65 72 29 29 3b 0a 0a 20 20 20 20 2f  Buffer));..    /
2fec0 2a 20 44 65 63 6f 64 65 20 61 6e 79 20 65 6e 74  * Decode any ent
2fed0 72 69 65 73 20 74 68 61 74 20 6f 63 63 75 72 20  ries that occur 
2fee0 62 65 66 6f 72 65 20 74 68 65 20 66 69 72 73 74  before the first
2fef0 20 74 65 72 6d 2e 20 2a 2f 0a 20 20 20 20 69 66   term. */.    if
2ff00 28 20 73 7a 4c 65 61 66 3c 6e 20 29 7b 0a 20 20  ( szLeaf<n ){.  
2ff10 20 20 20 20 69 50 67 69 64 78 4f 66 66 20 2b 3d      iPgidxOff +=
2ff20 20 66 74 73 35 47 65 74 56 61 72 69 6e 74 33 32   fts5GetVarint32
2ff30 28 26 61 5b 69 50 67 69 64 78 4f 66 66 5d 2c 20  (&a[iPgidxOff], 
2ff40 69 54 65 72 6d 4f 66 66 29 3b 0a 20 20 20 20 7d  iTermOff);.    }
2ff50 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 54 65 72  else{.      iTer
2ff60 6d 4f 66 66 20 3d 20 73 7a 4c 65 61 66 3b 0a 20  mOff = szLeaf;. 
2ff70 20 20 20 7d 0a 20 20 20 20 66 74 73 35 44 65 63     }.    fts5Dec
2ff80 6f 64 65 52 6f 77 69 64 4c 69 73 74 28 26 72 63  odeRowidList(&rc
2ff90 2c 20 26 73 2c 20 26 61 5b 34 5d 2c 20 69 54 65  , &s, &a[4], iTe
2ffa0 72 6d 4f 66 66 2d 34 29 3b 0a 0a 20 20 20 20 69  rmOff-4);..    i
2ffb0 4f 66 66 20 3d 20 69 54 65 72 6d 4f 66 66 3b 0a  Off = iTermOff;.
2ffc0 20 20 20 20 77 68 69 6c 65 28 20 69 4f 66 66 3c      while( iOff<
2ffd0 73 7a 4c 65 61 66 20 29 7b 0a 20 20 20 20 20 20  szLeaf ){.      
2ffe0 69 6e 74 20 6e 41 70 70 65 6e 64 3b 0a 0a 20 20  int nAppend;..  
2fff0 20 20 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20      /* Read the 
30000 74 65 72 6d 20 64 61 74 61 20 66 6f 72 20 74 68  term data for th
30010 65 20 6e 65 78 74 20 74 65 72 6d 2a 2f 0a 20 20  e next term*/.  
30020 20 20 20 20 69 4f 66 66 20 2b 3d 20 66 74 73 35      iOff += fts5
30030 47 65 74 56 61 72 69 6e 74 33 32 28 26 61 5b 69  GetVarint32(&a[i
30040 4f 66 66 5d 2c 20 6e 41 70 70 65 6e 64 29 3b 0a  Off], nAppend);.
30050 20 20 20 20 20 20 74 65 72 6d 2e 6e 20 3d 20 6e        term.n = n
30060 4b 65 65 70 3b 0a 20 20 20 20 20 20 66 74 73 35  Keep;.      fts5
30070 42 75 66 66 65 72 41 70 70 65 6e 64 42 6c 6f 62  BufferAppendBlob
30080 28 26 72 63 2c 20 26 74 65 72 6d 2c 20 6e 41 70  (&rc, &term, nAp
30090 70 65 6e 64 2c 20 26 61 5b 69 4f 66 66 5d 29 3b  pend, &a[iOff]);
300a0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 46 74  .      sqlite3Ft
300b0 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 50 72  s5BufferAppendPr
300c0 69 6e 74 66 28 0a 20 20 20 20 20 20 20 20 20 20  intf(.          
300d0 26 72 63 2c 20 26 73 2c 20 22 20 74 65 72 6d 3d  &rc, &s, " term=
300e0 25 2e 2a 73 22 2c 20 74 65 72 6d 2e 6e 2c 20 28  %.*s", term.n, (
300f0 63 6f 6e 73 74 20 63 68 61 72 2a 29 74 65 72 6d  const char*)term
30100 2e 70 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20  .p.      );.    
30110 20 20 69 4f 66 66 20 2b 3d 20 6e 41 70 70 65 6e    iOff += nAppen
30120 64 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 46 69 67  d;..      /* Fig
30130 75 72 65 20 6f 75 74 20 77 68 65 72 65 20 74 68  ure out where th
30140 65 20 64 6f 63 6c 69 73 74 20 66 6f 72 20 74 68  e doclist for th
30150 69 73 20 74 65 72 6d 20 65 6e 64 73 20 2a 2f 0a  is term ends */.
30160 20 20 20 20 20 20 69 66 28 20 69 50 67 69 64 78        if( iPgidx
30170 4f 66 66 3c 6e 20 29 7b 0a 20 20 20 20 20 20 20  Off<n ){.       
30180 20 69 6e 74 20 6e 49 6e 63 72 3b 0a 20 20 20 20   int nIncr;.    
30190 20 20 20 20 69 50 67 69 64 78 4f 66 66 20 2b 3d      iPgidxOff +=
301a0 20 66 74 73 35 47 65 74 56 61 72 69 6e 74 33 32   fts5GetVarint32
301b0 28 26 61 5b 69 50 67 69 64 78 4f 66 66 5d 2c 20  (&a[iPgidxOff], 
301c0 6e 49 6e 63 72 29 3b 0a 20 20 20 20 20 20 20 20  nIncr);.        
301d0 69 54 65 72 6d 4f 66 66 20 2b 3d 20 6e 49 6e 63  iTermOff += nInc
301e0 72 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  r;.      }else{.
301f0 20 20 20 20 20 20 20 20 69 54 65 72 6d 4f 66 66          iTermOff
30200 20 3d 20 73 7a 4c 65 61 66 3b 0a 20 20 20 20 20   = szLeaf;.     
30210 20 7d 0a 0a 20 20 20 20 20 20 66 74 73 35 44 65   }..      fts5De
30220 63 6f 64 65 52 6f 77 69 64 4c 69 73 74 28 26 72  codeRowidList(&r
30230 63 2c 20 26 73 2c 20 26 61 5b 69 4f 66 66 5d 2c  c, &s, &a[iOff],
30240 20 69 54 65 72 6d 4f 66 66 2d 69 4f 66 66 29 3b   iTermOff-iOff);
30250 0a 20 20 20 20 20 20 69 4f 66 66 20 3d 20 69 54  .      iOff = iT
30260 65 72 6d 4f 66 66 3b 0a 20 20 20 20 20 20 69 66  ermOff;.      if
30270 28 20 69 4f 66 66 3c 73 7a 4c 65 61 66 20 29 7b  ( iOff<szLeaf ){
30280 0a 20 20 20 20 20 20 20 20 69 4f 66 66 20 2b 3d  .        iOff +=
30290 20 66 74 73 35 47 65 74 56 61 72 69 6e 74 33 32   fts5GetVarint32
302a0 28 26 61 5b 69 4f 66 66 5d 2c 20 6e 4b 65 65 70  (&a[iOff], nKeep
302b0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
302c0 0a 0a 20 20 20 20 66 74 73 35 42 75 66 66 65 72  ..    fts5Buffer
302d0 46 72 65 65 28 26 74 65 72 6d 29 3b 0a 20 20 7d  Free(&term);.  }
302e0 65 6c 73 65 7b 0a 20 20 20 20 46 74 73 35 42 75  else{.    Fts5Bu
302f0 66 66 65 72 20 74 65 72 6d 3b 20 20 20 20 20 20  ffer term;      
30300 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65          /* Curre
30310 6e 74 20 74 65 72 6d 20 72 65 61 64 20 66 72 6f  nt term read fro
30320 6d 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 69 6e  m page */.    in
30330 74 20 73 7a 4c 65 61 66 3b 20 20 20 20 20 20 20  t szLeaf;       
30340 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
30350 66 66 73 65 74 20 6f 66 20 70 67 69 64 78 20 69  ffset of pgidx i
30360 6e 20 61 5b 5d 20 2a 2f 0a 20 20 20 20 69 6e 74  n a[] */.    int
30370 20 69 50 67 69 64 78 4f 66 66 3b 0a 20 20 20 20   iPgidxOff;.    
30380 69 6e 74 20 69 50 67 69 64 78 50 72 65 76 20 3d  int iPgidxPrev =
30390 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a   0;           /*
303a0 20 50 72 65 76 69 6f 75 73 20 76 61 6c 75 65 20   Previous value 
303b0 72 65 61 64 20 66 72 6f 6d 20 70 67 69 64 78 20  read from pgidx 
303c0 2a 2f 0a 20 20 20 20 69 6e 74 20 69 54 65 72 6d  */.    int iTerm
303d0 4f 66 66 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74  Off = 0;.    int
303e0 20 69 52 6f 77 69 64 4f 66 66 20 3d 20 30 3b 0a   iRowidOff = 0;.
303f0 20 20 20 20 69 6e 74 20 69 4f 66 66 3b 0a 20 20      int iOff;.  
30400 20 20 69 6e 74 20 6e 44 6f 63 6c 69 73 74 3b 0a    int nDoclist;.
30410 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 74 65 72  .    memset(&ter
30420 6d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 46 74 73  m, 0, sizeof(Fts
30430 35 42 75 66 66 65 72 29 29 3b 0a 0a 20 20 20 20  5Buffer));..    
30440 69 66 28 20 6e 3c 34 20 29 7b 0a 20 20 20 20 20  if( n<4 ){.     
30450 20 73 71 6c 69 74 65 33 46 74 73 35 42 75 66 66   sqlite3Fts5Buff
30460 65 72 53 65 74 28 26 72 63 2c 20 26 73 2c 20 37  erSet(&rc, &s, 7
30470 2c 20 28 63 6f 6e 73 74 20 75 38 2a 29 22 63 6f  , (const u8*)"co
30480 72 72 75 70 74 22 29 3b 0a 20 20 20 20 20 20 67  rrupt");.      g
30490 6f 74 6f 20 64 65 63 6f 64 65 5f 6f 75 74 3b 0a  oto decode_out;.
304a0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
304b0 20 69 52 6f 77 69 64 4f 66 66 20 3d 20 66 74 73   iRowidOff = fts
304c0 35 47 65 74 55 31 36 28 26 61 5b 30 5d 29 3b 0a  5GetU16(&a[0]);.
304d0 20 20 20 20 20 20 69 50 67 69 64 78 4f 66 66 20        iPgidxOff 
304e0 3d 20 73 7a 4c 65 61 66 20 3d 20 66 74 73 35 47  = szLeaf = fts5G
304f0 65 74 55 31 36 28 26 61 5b 32 5d 29 3b 0a 20 20  etU16(&a[2]);.  
30500 20 20 20 20 69 66 28 20 69 50 67 69 64 78 4f 66      if( iPgidxOf
30510 66 3c 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 66  f<n ){.        f
30520 74 73 35 47 65 74 56 61 72 69 6e 74 33 32 28 26  ts5GetVarint32(&
30530 61 5b 69 50 67 69 64 78 4f 66 66 5d 2c 20 69 54  a[iPgidxOff], iT
30540 65 72 6d 4f 66 66 29 3b 0a 20 20 20 20 20 20 7d  ermOff);.      }
30550 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44  .    }..    /* D
30560 65 63 6f 64 65 20 74 68 65 20 70 6f 73 69 74 69  ecode the positi
30570 6f 6e 20 6c 69 73 74 20 74 61 69 6c 20 61 74 20  on list tail at 
30580 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
30590 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 69 66 28   page */.    if(
305a0 20 69 52 6f 77 69 64 4f 66 66 21 3d 30 20 29 7b   iRowidOff!=0 ){
305b0 0a 20 20 20 20 20 20 69 4f 66 66 20 3d 20 69 52  .      iOff = iR
305c0 6f 77 69 64 4f 66 66 3b 0a 20 20 20 20 7d 65 6c  owidOff;.    }el
305d0 73 65 20 69 66 28 20 69 54 65 72 6d 4f 66 66 21  se if( iTermOff!
305e0 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 4f 66 66  =0 ){.      iOff
305f0 20 3d 20 69 54 65 72 6d 4f 66 66 3b 0a 20 20 20   = iTermOff;.   
30600 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 4f   }else{.      iO
30610 66 66 20 3d 20 73 7a 4c 65 61 66 3b 0a 20 20 20  ff = szLeaf;.   
30620 20 7d 0a 20 20 20 20 66 74 73 35 44 65 63 6f 64   }.    fts5Decod
30630 65 50 6f 73 6c 69 73 74 28 26 72 63 2c 20 26 73  ePoslist(&rc, &s
30640 2c 20 26 61 5b 34 5d 2c 20 69 4f 66 66 2d 34 29  , &a[4], iOff-4)
30650 3b 0a 0a 20 20 20 20 2f 2a 20 44 65 63 6f 64 65  ;..    /* Decode
30660 20 61 6e 79 20 6d 6f 72 65 20 64 6f 63 6c 69 73   any more doclis
30670 74 20 64 61 74 61 20 74 68 61 74 20 61 70 70 65  t data that appe
30680 61 72 73 20 6f 6e 20 74 68 65 20 70 61 67 65 20  ars on the page 
30690 62 65 66 6f 72 65 20 74 68 65 0a 20 20 20 20 2a  before the.    *
306a0 2a 20 66 69 72 73 74 20 74 65 72 6d 2e 20 2a 2f  * first term. */
306b0 0a 20 20 20 20 6e 44 6f 63 6c 69 73 74 20 3d 20  .    nDoclist = 
306c0 28 69 54 65 72 6d 4f 66 66 20 3f 20 69 54 65 72  (iTermOff ? iTer
306d0 6d 4f 66 66 20 3a 20 73 7a 4c 65 61 66 29 20 2d  mOff : szLeaf) -
306e0 20 69 4f 66 66 3b 0a 20 20 20 20 66 74 73 35 44   iOff;.    fts5D
306f0 65 63 6f 64 65 44 6f 63 6c 69 73 74 28 26 72 63  ecodeDoclist(&rc
30700 2c 20 26 73 2c 20 26 61 5b 69 4f 66 66 5d 2c 20  , &s, &a[iOff], 
30710 6e 44 6f 63 6c 69 73 74 29 3b 0a 0a 20 20 20 20  nDoclist);..    
30720 77 68 69 6c 65 28 20 69 50 67 69 64 78 4f 66 66  while( iPgidxOff
30730 3c 6e 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  <n ){.      int 
30740 62 46 69 72 73 74 20 3d 20 28 69 50 67 69 64 78  bFirst = (iPgidx
30750 4f 66 66 3d 3d 73 7a 4c 65 61 66 29 3b 20 20 20  Off==szLeaf);   
30760 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 66 69    /* True for fi
30770 72 73 74 20 74 65 72 6d 20 6f 6e 20 70 61 67 65  rst term on page
30780 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e 42   */.      int nB
30790 79 74 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  yte;            
307a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
307b0 2f 2a 20 42 79 74 65 73 20 6f 66 20 64 61 74 61  /* Bytes of data
307c0 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 69 45   */.      int iE
307d0 6e 64 3b 0a 20 20 20 20 20 20 0a 20 20 20 20 20  nd;.      .     
307e0 20 69 50 67 69 64 78 4f 66 66 20 2b 3d 20 66 74   iPgidxOff += ft
307f0 73 35 47 65 74 56 61 72 69 6e 74 33 32 28 26 61  s5GetVarint32(&a
30800 5b 69 50 67 69 64 78 4f 66 66 5d 2c 20 6e 42 79  [iPgidxOff], nBy
30810 74 65 29 3b 0a 20 20 20 20 20 20 69 50 67 69 64  te);.      iPgid
30820 78 50 72 65 76 20 2b 3d 20 6e 42 79 74 65 3b 0a  xPrev += nByte;.
30830 20 20 20 20 20 20 69 4f 66 66 20 3d 20 69 50 67        iOff = iPg
30840 69 64 78 50 72 65 76 3b 0a 0a 20 20 20 20 20 20  idxPrev;..      
30850 69 66 28 20 69 50 67 69 64 78 4f 66 66 3c 6e 20  if( iPgidxOff<n 
30860 29 7b 0a 20 20 20 20 20 20 20 20 66 74 73 35 47  ){.        fts5G
30870 65 74 56 61 72 69 6e 74 33 32 28 26 61 5b 69 50  etVarint32(&a[iP
30880 67 69 64 78 4f 66 66 5d 2c 20 6e 42 79 74 65 29  gidxOff], nByte)
30890 3b 0a 20 20 20 20 20 20 20 20 69 45 6e 64 20 3d  ;.        iEnd =
308a0 20 69 50 67 69 64 78 50 72 65 76 20 2b 20 6e 42   iPgidxPrev + nB
308b0 79 74 65 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  yte;.      }else
308c0 7b 0a 20 20 20 20 20 20 20 20 69 45 6e 64 20 3d  {.        iEnd =
308d0 20 73 7a 4c 65 61 66 3b 0a 20 20 20 20 20 20 7d   szLeaf;.      }
308e0 0a 0a 20 20 20 20 20 20 69 66 28 20 62 46 69 72  ..      if( bFir
308f0 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  st==0 ){.       
30900 20 69 4f 66 66 20 2b 3d 20 66 74 73 35 47 65 74   iOff += fts5Get
30910 56 61 72 69 6e 74 33 32 28 26 61 5b 69 4f 66 66  Varint32(&a[iOff
30920 5d 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20 20 20  ], nByte);.     
30930 20 20 20 74 65 72 6d 2e 6e 20 3d 20 6e 42 79 74     term.n = nByt
30940 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  e;.      }.     
30950 20 69 4f 66 66 20 2b 3d 20 66 74 73 35 47 65 74   iOff += fts5Get
30960 56 61 72 69 6e 74 33 32 28 26 61 5b 69 4f 66 66  Varint32(&a[iOff
30970 5d 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20 20 20  ], nByte);.     
30980 20 66 74 73 35 42 75 66 66 65 72 41 70 70 65 6e   fts5BufferAppen
30990 64 42 6c 6f 62 28 26 72 63 2c 20 26 74 65 72 6d  dBlob(&rc, &term
309a0 2c 20 6e 42 79 74 65 2c 20 26 61 5b 69 4f 66 66  , nByte, &a[iOff
309b0 5d 29 3b 0a 20 20 20 20 20 20 69 4f 66 66 20 2b  ]);.      iOff +
309c0 3d 20 6e 42 79 74 65 3b 0a 0a 20 20 20 20 20 20  = nByte;..      
309d0 73 71 6c 69 74 65 33 46 74 73 35 42 75 66 66 65  sqlite3Fts5Buffe
309e0 72 41 70 70 65 6e 64 50 72 69 6e 74 66 28 0a 20  rAppendPrintf(. 
309f0 20 20 20 20 20 20 20 20 20 26 72 63 2c 20 26 73           &rc, &s
30a00 2c 20 22 20 74 65 72 6d 3d 25 2e 2a 73 22 2c 20  , " term=%.*s", 
30a10 74 65 72 6d 2e 6e 2c 20 28 63 6f 6e 73 74 20 63  term.n, (const c
30a20 68 61 72 2a 29 74 65 72 6d 2e 70 0a 20 20 20 20  har*)term.p.    
30a30 20 20 29 3b 0a 20 20 20 20 20 20 69 4f 66 66 20    );.      iOff 
30a40 2b 3d 20 66 74 73 35 44 65 63 6f 64 65 44 6f 63  += fts5DecodeDoc
30a50 6c 69 73 74 28 26 72 63 2c 20 26 73 2c 20 26 61  list(&rc, &s, &a
30a60 5b 69 4f 66 66 5d 2c 20 69 45 6e 64 2d 69 4f 66  [iOff], iEnd-iOf
30a70 66 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 66  f);.    }..    f
30a80 74 73 35 42 75 66 66 65 72 46 72 65 65 28 26 74  ts5BufferFree(&t
30a90 65 72 6d 29 3b 0a 20 20 7d 0a 20 20 0a 20 64 65  erm);.  }.  . de
30aa0 63 6f 64 65 5f 6f 75 74 3a 0a 20 20 73 71 6c 69  code_out:.  sqli
30ab0 74 65 33 5f 66 72 65 65 28 61 29 3b 0a 20 20 69  te3_free(a);.  i
30ac0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
30ad0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
30ae0 72 65 73 75 6c 74 5f 74 65 78 74 28 70 43 74 78  result_text(pCtx
30af0 2c 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73  , (const char*)s
30b00 2e 70 2c 20 73 2e 6e 2c 20 53 51 4c 49 54 45 5f  .p, s.n, SQLITE_
30b10 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 7d 65  TRANSIENT);.  }e
30b20 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  lse{.    sqlite3
30b30 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 5f 63 6f  _result_error_co
30b40 64 65 28 70 43 74 78 2c 20 72 63 29 3b 0a 20 20  de(pCtx, rc);.  
30b50 7d 0a 20 20 66 74 73 35 42 75 66 66 65 72 46 72  }.  fts5BufferFr
30b60 65 65 28 26 73 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ee(&s);.}../*.**
30b70 20 54 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74   The implementat
30b80 69 6f 6e 20 6f 66 20 75 73 65 72 2d 64 65 66 69  ion of user-defi
30b90 6e 65 64 20 73 63 61 6c 61 72 20 66 75 6e 63 74  ned scalar funct
30ba0 69 6f 6e 20 66 74 73 35 5f 72 6f 77 69 64 28 29  ion fts5_rowid()
30bb0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
30bc0 20 66 74 73 35 52 6f 77 69 64 46 75 6e 63 74 69   fts5RowidFuncti
30bd0 6f 6e 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f  on(.  sqlite3_co
30be0 6e 74 65 78 74 20 2a 70 43 74 78 2c 20 20 20 20  ntext *pCtx,    
30bf0 20 20 20 20 20 20 2f 2a 20 46 75 6e 63 74 69 6f        /* Functio
30c00 6e 20 63 61 6c 6c 20 63 6f 6e 74 65 78 74 20 2a  n call context *
30c10 2f 0a 20 20 69 6e 74 20 6e 41 72 67 2c 20 20 20  /.  int nArg,   
30c20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30c30 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
30c40 20 61 72 67 73 20 28 61 6c 77 61 79 73 20 32 29   args (always 2)
30c50 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76 61   */.  sqlite3_va
30c60 6c 75 65 20 2a 2a 61 70 56 61 6c 20 20 20 20 20  lue **apVal     
30c70 20 20 20 20 20 20 2f 2a 20 46 75 6e 63 74 69 6f        /* Functio
30c80 6e 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29  n arguments */.)
30c90 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  {.  const char *
30ca0 7a 41 72 67 3b 0a 20 20 69 66 28 20 6e 41 72 67  zArg;.  if( nArg
30cb0 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ==0 ){.    sqlit
30cc0 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 28  e3_result_error(
30cd0 70 43 74 78 2c 20 22 73 68 6f 75 6c 64 20 62 65  pCtx, "should be
30ce0 3a 20 66 74 73 35 5f 72 6f 77 69 64 28 73 75 62  : fts5_rowid(sub
30cf0 6a 65 63 74 2c 20 2e 2e 2e 2e 29 22 2c 20 2d 31  ject, ....)", -1
30d00 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
30d10 7a 41 72 67 20 3d 20 28 63 6f 6e 73 74 20 63 68  zArg = (const ch
30d20 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75  ar*)sqlite3_valu
30d30 65 5f 74 65 78 74 28 61 70 56 61 6c 5b 30 5d 29  e_text(apVal[0])
30d40 3b 0a 20 20 20 20 69 66 28 20 30 3d 3d 73 71 6c  ;.    if( 0==sql
30d50 69 74 65 33 5f 73 74 72 69 63 6d 70 28 7a 41 72  ite3_stricmp(zAr
30d60 67 2c 20 22 73 65 67 6d 65 6e 74 22 29 20 29 7b  g, "segment") ){
30d70 0a 20 20 20 20 20 20 69 36 34 20 69 52 6f 77 69  .      i64 iRowi
30d80 64 3b 0a 20 20 20 20 20 20 69 6e 74 20 73 65 67  d;.      int seg
30d90 69 64 2c 20 70 67 6e 6f 3b 0a 20 20 20 20 20 20  id, pgno;.      
30da0 69 66 28 20 6e 41 72 67 21 3d 33 20 29 7b 0a 20  if( nArg!=3 ){. 
30db0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72         sqlite3_r
30dc0 65 73 75 6c 74 5f 65 72 72 6f 72 28 70 43 74 78  esult_error(pCtx
30dd0 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 22  , .            "
30de0 73 68 6f 75 6c 64 20 62 65 3a 20 66 74 73 35 5f  should be: fts5_
30df0 72 6f 77 69 64 28 27 73 65 67 6d 65 6e 74 27 2c  rowid('segment',
30e00 20 73 65 67 69 64 2c 20 70 67 6e 6f 29 29 22 2c   segid, pgno))",
30e10 20 2d 31 0a 20 20 20 20 20 20 20 20 29 3b 0a 20   -1.        );. 
30e20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
30e30 20 20 20 20 73 65 67 69 64 20 3d 20 73 71 6c 69      segid = sqli
30e40 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 28 61 70  te3_value_int(ap
30e50 56 61 6c 5b 31 5d 29 3b 0a 20 20 20 20 20 20 20  Val[1]);.       
30e60 20 70 67 6e 6f 20 3d 20 73 71 6c 69 74 65 33 5f   pgno = sqlite3_
30e70 76 61 6c 75 65 5f 69 6e 74 28 61 70 56 61 6c 5b  value_int(apVal[
30e80 32 5d 29 3b 0a 20 20 20 20 20 20 20 20 69 52 6f  2]);.        iRo
30e90 77 69 64 20 3d 20 46 54 53 35 5f 53 45 47 4d 45  wid = FTS5_SEGME
30ea0 4e 54 5f 52 4f 57 49 44 28 73 65 67 69 64 2c 20  NT_ROWID(segid, 
30eb0 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 73  pgno);.        s
30ec0 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e  qlite3_result_in
30ed0 74 36 34 28 70 43 74 78 2c 20 69 52 6f 77 69 64  t64(pCtx, iRowid
30ee0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
30ef0 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69  else{.      sqli
30f00 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72  te3_result_error
30f10 28 70 43 74 78 2c 20 0a 20 20 20 20 20 20 20 20  (pCtx, .        
30f20 22 66 69 72 73 74 20 61 72 67 20 74 6f 20 66 74  "first arg to ft
30f30 73 35 5f 72 6f 77 69 64 28 29 20 6d 75 73 74 20  s5_rowid() must 
30f40 62 65 20 27 73 65 67 6d 65 6e 74 27 22 20 2c 20  be 'segment'" , 
30f50 2d 31 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20  -1.      );.    
30f60 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  }.  }.}../*.** T
30f70 68 69 73 20 69 73 20 63 61 6c 6c 65 64 20 61 73  his is called as
30f80 20 70 61 72 74 20 6f 66 20 72 65 67 69 73 74 65   part of registe
30f90 72 69 6e 67 20 74 68 65 20 46 54 53 35 20 6d 6f  ring the FTS5 mo
30fa0 64 75 6c 65 20 77 69 74 68 20 64 61 74 61 62 61  dule with databa
30fb0 73 65 0a 2a 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e  se.** connection
30fc0 20 64 62 2e 20 49 74 20 72 65 67 69 73 74 65 72   db. It register
30fd0 73 20 73 65 76 65 72 61 6c 20 75 73 65 72 2d 64  s several user-d
30fe0 65 66 69 6e 65 64 20 73 63 61 6c 61 72 20 66 75  efined scalar fu
30ff0 6e 63 74 69 6f 6e 73 20 75 73 65 66 75 6c 0a 2a  nctions useful.*
31000 2a 20 77 69 74 68 20 46 54 53 35 2e 0a 2a 2a 0a  * with FTS5..**.
31010 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66 75 6c  ** If successful
31020 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  , SQLITE_OK is r
31030 65 74 75 72 6e 65 64 2e 20 49 66 20 61 6e 20 65  eturned. If an e
31040 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 73 6f 6d  rror occurs, som
31050 65 20 6f 74 68 65 72 0a 2a 2a 20 53 51 4c 69 74  e other.** SQLit
31060 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  e error code is 
31070 72 65 74 75 72 6e 65 64 20 69 6e 73 74 65 61 64  returned instead
31080 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
31090 46 74 73 35 49 6e 64 65 78 49 6e 69 74 28 73 71  Fts5IndexInit(sq
310a0 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 69 6e  lite3 *db){.  in
310b0 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 63  t rc = sqlite3_c
310c0 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 0a  reate_function(.
310d0 20 20 20 20 20 20 64 62 2c 20 22 66 74 73 35 5f        db, "fts5_
310e0 64 65 63 6f 64 65 22 2c 20 32 2c 20 53 51 4c 49  decode", 2, SQLI
310f0 54 45 5f 55 54 46 38 2c 20 30 2c 20 66 74 73 35  TE_UTF8, 0, fts5
31100 44 65 63 6f 64 65 46 75 6e 63 74 69 6f 6e 2c 20  DecodeFunction, 
31110 30 2c 20 30 0a 20 20 29 3b 0a 0a 20 20 69 66 28  0, 0.  );..  if(
31120 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
31130 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
31140 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69  e3_create_functi
31150 6f 6e 28 0a 20 20 20 20 20 20 20 20 64 62 2c 20  on(.        db, 
31160 22 66 74 73 35 5f 64 65 63 6f 64 65 5f 6e 6f 6e  "fts5_decode_non
31170 65 22 2c 20 32 2c 20 0a 20 20 20 20 20 20 20 20  e", 2, .        
31180 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 28 76 6f  SQLITE_UTF8, (vo
31190 69 64 2a 29 64 62 2c 20 66 74 73 35 44 65 63 6f  id*)db, fts5Deco
311a0 64 65 46 75 6e 63 74 69 6f 6e 2c 20 30 2c 20 30  deFunction, 0, 0
311b0 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 0a 20 20 69  .    );.  }..  i
311c0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
311d0 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   ){.    rc = sql
311e0 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63  ite3_create_func
311f0 74 69 6f 6e 28 0a 20 20 20 20 20 20 20 20 64 62  tion(.        db
31200 2c 20 22 66 74 73 35 5f 72 6f 77 69 64 22 2c 20  , "fts5_rowid", 
31210 2d 31 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c  -1, SQLITE_UTF8,
31220 20 30 2c 20 66 74 73 35 52 6f 77 69 64 46 75 6e   0, fts5RowidFun
31230 63 74 69 6f 6e 2c 20 30 2c 20 30 0a 20 20 20 20  ction, 0, 0.    
31240 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
31250 72 63 3b 0a 7d 0a 0a 0a 69 6e 74 20 73 71 6c 69  rc;.}...int sqli
31260 74 65 33 46 74 73 35 49 6e 64 65 78 52 65 73 65  te3Fts5IndexRese
31270 74 28 46 74 73 35 49 6e 64 65 78 20 2a 70 29 7b  t(Fts5Index *p){
31280 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 53  .  assert( p->pS
31290 74 72 75 63 74 3d 3d 30 20 7c 7c 20 70 2d 3e 69  truct==0 || p->i
312a0 53 74 72 75 63 74 56 65 72 73 69 6f 6e 21 3d 30  StructVersion!=0
312b0 20 29 3b 0a 20 20 69 66 28 20 66 74 73 35 49 6e   );.  if( fts5In
312c0 64 65 78 44 61 74 61 56 65 72 73 69 6f 6e 28 70  dexDataVersion(p
312d0 29 21 3d 70 2d 3e 69 53 74 72 75 63 74 56 65 72  )!=p->iStructVer
312e0 73 69 6f 6e 20 29 7b 0a 20 20 20 20 66 74 73 35  sion ){.    fts5
312f0 53 74 72 75 63 74 75 72 65 49 6e 76 61 6c 69 64  StructureInvalid
31300 61 74 65 28 70 29 3b 0a 20 20 7d 0a 20 20 72 65  ate(p);.  }.  re
31310 74 75 72 6e 20 66 74 73 35 49 6e 64 65 78 52 65  turn fts5IndexRe
31320 74 75 72 6e 28 70 29 3b 0a 7d 0a                 turn(p);.}.