/ Hex Artifact Content
Login

Artifact 93ecfc0dfb04c62d5ad3fab6c7be769be1a0b51331f1b97f78ab08664ededd67:


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 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
5aa0: 52 65 74 72 69 65 76 65 20 61 20 72 65 63 6f 72  Retrieve a recor
5ab0: 64 20 66 72 6f 6d 20 74 68 65 20 25 5f 64 61 74  d from the %_dat
5ac0: 61 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49  a table..**.** I
5ad0: 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
5ae0: 73 2c 20 4e 55 4c 4c 20 69 73 20 72 65 74 75 72  s, NULL is retur
5af0: 6e 65 64 20 61 6e 64 20 61 6e 20 65 72 72 6f 72  ned and an error
5b00: 20 6c 65 66 74 20 69 6e 20 74 68 65 20 0a 2a 2a   left in the .**
5b10: 20 46 74 73 35 49 6e 64 65 78 20 6f 62 6a 65 63   Fts5Index objec
5b20: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 46 74 73  t..*/.static Fts
5b30: 35 44 61 74 61 20 2a 66 74 73 35 44 61 74 61 52  5Data *fts5DataR
5b40: 65 61 64 28 46 74 73 35 49 6e 64 65 78 20 2a 70  ead(Fts5Index *p
5b50: 2c 20 69 36 34 20 69 52 6f 77 69 64 29 7b 0a 20  , i64 iRowid){. 
5b60: 20 46 74 73 35 44 61 74 61 20 2a 70 52 65 74 20   Fts5Data *pRet 
5b70: 3d 20 30 3b 0a 20 20 69 66 28 20 70 2d 3e 72 63  = 0;.  if( p->rc
5b80: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
5b90: 20 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49     int rc = SQLI
5ba0: 54 45 5f 4f 4b 3b 0a 0a 20 20 20 20 69 66 28 20  TE_OK;..    if( 
5bb0: 70 2d 3e 70 52 65 61 64 65 72 20 29 7b 0a 20 20  p->pReader ){.  
5bc0: 20 20 20 20 2f 2a 20 54 68 69 73 20 63 61 6c 6c      /* This call
5bd0: 20 6d 61 79 20 72 65 74 75 72 6e 20 53 51 4c 49   may return SQLI
5be0: 54 45 5f 41 42 4f 52 54 20 69 66 20 74 68 65 72  TE_ABORT if ther
5bf0: 65 20 68 61 73 20 62 65 65 6e 20 61 20 73 61 76  e has been a sav
5c00: 65 70 6f 69 6e 74 0a 20 20 20 20 20 20 2a 2a 20  epoint.      ** 
5c10: 72 6f 6c 6c 62 61 63 6b 20 73 69 6e 63 65 20 69  rollback since i
5c20: 74 20 77 61 73 20 6c 61 73 74 20 75 73 65 64 2e  t was last used.
5c30: 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 61 20   In this case a 
5c40: 6e 65 77 20 62 6c 6f 62 20 68 61 6e 64 6c 65 0a  new blob handle.
5c50: 20 20 20 20 20 20 2a 2a 20 69 73 20 72 65 71 75        ** is requ
5c60: 69 72 65 64 2e 20 20 2a 2f 0a 20 20 20 20 20 20  ired.  */.      
5c70: 73 71 6c 69 74 65 33 5f 62 6c 6f 62 20 2a 70 42  sqlite3_blob *pB
5c80: 6c 6f 62 20 3d 20 70 2d 3e 70 52 65 61 64 65 72  lob = p->pReader
5c90: 3b 0a 20 20 20 20 20 20 70 2d 3e 70 52 65 61 64  ;.      p->pRead
5ca0: 65 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 63  er = 0;.      rc
5cb0: 20 3d 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f   = sqlite3_blob_
5cc0: 72 65 6f 70 65 6e 28 70 42 6c 6f 62 2c 20 69 52  reopen(pBlob, iR
5cd0: 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 61 73 73  owid);.      ass
5ce0: 65 72 74 28 20 70 2d 3e 70 52 65 61 64 65 72 3d  ert( p->pReader=
5cf0: 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 2d 3e 70  =0 );.      p->p
5d00: 52 65 61 64 65 72 20 3d 20 70 42 6c 6f 62 3b 0a  Reader = pBlob;.
5d10: 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
5d20: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
5d30: 20 20 20 66 74 73 35 43 6c 6f 73 65 52 65 61 64     fts5CloseRead
5d40: 65 72 28 70 29 3b 0a 20 20 20 20 20 20 7d 0a 20  er(p);.      }. 
5d50: 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
5d60: 49 54 45 5f 41 42 4f 52 54 20 29 20 72 63 20 3d  ITE_ABORT ) rc =
5d70: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
5d80: 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  }..    /* If the
5d90: 20 62 6c 6f 62 20 68 61 6e 64 6c 65 20 69 73 20   blob handle is 
5da0: 6e 6f 74 20 6f 70 65 6e 20 61 74 20 74 68 69 73  not open at this
5db0: 20 70 6f 69 6e 74 2c 20 6f 70 65 6e 20 69 74 20   point, open it 
5dc0: 61 6e 64 20 73 65 65 6b 20 0a 20 20 20 20 2a 2a  and seek .    **
5dd0: 20 74 6f 20 74 68 65 20 72 65 71 75 65 73 74 65   to the requeste
5de0: 64 20 65 6e 74 72 79 2e 20 20 2a 2f 0a 20 20 20  d entry.  */.   
5df0: 20 69 66 28 20 70 2d 3e 70 52 65 61 64 65 72 3d   if( p->pReader=
5e00: 3d 30 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45  =0 && rc==SQLITE
5e10: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 46 74 73  _OK ){.      Fts
5e20: 35 43 6f 6e 66 69 67 20 2a 70 43 6f 6e 66 69 67  5Config *pConfig
5e30: 20 3d 20 70 2d 3e 70 43 6f 6e 66 69 67 3b 0a 20   = p->pConfig;. 
5e40: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
5e50: 33 5f 62 6c 6f 62 5f 6f 70 65 6e 28 70 43 6f 6e  3_blob_open(pCon
5e60: 66 69 67 2d 3e 64 62 2c 20 0a 20 20 20 20 20 20  fig->db, .      
5e70: 20 20 20 20 70 43 6f 6e 66 69 67 2d 3e 7a 44 62      pConfig->zDb
5e80: 2c 20 70 2d 3e 7a 44 61 74 61 54 62 6c 2c 20 22  , p->zDataTbl, "
5e90: 62 6c 6f 63 6b 22 2c 20 69 52 6f 77 69 64 2c 20  block", iRowid, 
5ea0: 30 2c 20 26 70 2d 3e 70 52 65 61 64 65 72 0a 20  0, &p->pReader. 
5eb0: 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 0a 20       );.    }.. 
5ec0: 20 20 20 2f 2a 20 49 66 20 65 69 74 68 65 72 20     /* If either 
5ed0: 6f 66 20 74 68 65 20 73 71 6c 69 74 65 33 5f 62  of the sqlite3_b
5ee0: 6c 6f 62 5f 6f 70 65 6e 28 29 20 6f 72 20 73 71  lob_open() or sq
5ef0: 6c 69 74 65 33 5f 62 6c 6f 62 5f 72 65 6f 70 65  lite3_blob_reope
5f00: 6e 28 29 20 63 61 6c 6c 73 0a 20 20 20 20 2a 2a  n() calls.    **
5f10: 20 61 62 6f 76 65 20 72 65 74 75 72 6e 65 64 20   above returned 
5f20: 53 51 4c 49 54 45 5f 45 52 52 4f 52 2c 20 72 65  SQLITE_ERROR, re
5f30: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
5f40: 55 50 54 5f 56 54 41 42 20 69 6e 73 74 65 61 64  UPT_VTAB instead
5f50: 2e 0a 20 20 20 20 2a 2a 20 41 6c 6c 20 74 68 65  ..    ** All the
5f60: 20 72 65 61 73 6f 6e 73 20 74 68 6f 73 65 20 66   reasons those f
5f70: 75 6e 63 74 69 6f 6e 73 20 6d 69 67 68 74 20 72  unctions might r
5f80: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
5f90: 4f 52 20 2d 20 6d 69 73 73 69 6e 67 0a 20 20 20  OR - missing.   
5fa0: 20 2a 2a 20 74 61 62 6c 65 2c 20 6d 69 73 73 69   ** table, missi
5fb0: 6e 67 20 72 6f 77 2c 20 6e 6f 6e 2d 62 6c 6f 62  ng row, non-blob
5fc0: 2f 74 65 78 74 20 69 6e 20 62 6c 6f 63 6b 20 63  /text in block c
5fd0: 6f 6c 75 6d 6e 20 2d 20 69 6e 64 69 63 61 74 65  olumn - indicate
5fe0: 20 0a 20 20 20 20 2a 2a 20 62 61 63 6b 69 6e 67   .    ** backing
5ff0: 20 73 74 6f 72 65 20 63 6f 72 72 75 70 74 69 6f   store corruptio
6000: 6e 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 72  n.  */.    if( r
6010: 63 3d 3d 53 51 4c 49 54 45 5f 45 52 52 4f 52 20  c==SQLITE_ERROR 
6020: 29 20 72 63 20 3d 20 46 54 53 35 5f 43 4f 52 52  ) rc = FTS5_CORR
6030: 55 50 54 3b 0a 0a 20 20 20 20 69 66 28 20 72 63  UPT;..    if( rc
6040: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
6050: 20 20 20 20 20 75 38 20 2a 61 4f 75 74 20 3d 20       u8 *aOut = 
6060: 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
6070: 20 2f 2a 20 52 65 61 64 20 62 6c 6f 62 20 64 61   /* Read blob da
6080: 74 61 20 69 6e 74 6f 20 74 68 69 73 20 62 75 66  ta into this buf
6090: 66 65 72 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  fer */.      int
60a0: 20 6e 42 79 74 65 20 3d 20 73 71 6c 69 74 65 33   nByte = sqlite3
60b0: 5f 62 6c 6f 62 5f 62 79 74 65 73 28 70 2d 3e 70  _blob_bytes(p->p
60c0: 52 65 61 64 65 72 29 3b 0a 20 20 20 20 20 20 69  Reader);.      i
60d0: 6e 74 20 6e 41 6c 6c 6f 63 20 3d 20 73 69 7a 65  nt nAlloc = size
60e0: 6f 66 28 46 74 73 35 44 61 74 61 29 20 2b 20 6e  of(Fts5Data) + n
60f0: 42 79 74 65 20 2b 20 46 54 53 35 5f 44 41 54 41  Byte + FTS5_DATA
6100: 5f 50 41 44 44 49 4e 47 3b 0a 20 20 20 20 20 20  _PADDING;.      
6110: 70 52 65 74 20 3d 20 28 46 74 73 35 44 61 74 61  pRet = (Fts5Data
6120: 2a 29 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  *)sqlite3_malloc
6130: 28 6e 41 6c 6c 6f 63 29 3b 0a 20 20 20 20 20 20  (nAlloc);.      
6140: 69 66 28 20 70 52 65 74 20 29 7b 0a 20 20 20 20  if( pRet ){.    
6150: 20 20 20 20 70 52 65 74 2d 3e 6e 6e 20 3d 20 6e      pRet->nn = n
6160: 42 79 74 65 3b 0a 20 20 20 20 20 20 20 20 61 4f  Byte;.        aO
6170: 75 74 20 3d 20 70 52 65 74 2d 3e 70 20 3d 20 28  ut = pRet->p = (
6180: 75 38 2a 29 26 70 52 65 74 5b 31 5d 3b 0a 20 20  u8*)&pRet[1];.  
6190: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
61a0: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
61b0: 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  OMEM;.      }.. 
61c0: 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
61d0: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
61e0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 62    rc = sqlite3_b
61f0: 6c 6f 62 5f 72 65 61 64 28 70 2d 3e 70 52 65 61  lob_read(p->pRea
6200: 64 65 72 2c 20 61 4f 75 74 2c 20 6e 42 79 74 65  der, aOut, nByte
6210: 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , 0);.      }.  
6220: 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
6230: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
6240: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 52   sqlite3_free(pR
6250: 65 74 29 3b 0a 20 20 20 20 20 20 20 20 70 52 65  et);.        pRe
6260: 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c  t = 0;.      }el
6270: 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54  se{.        /* T
6280: 4f 44 4f 31 3a 20 46 69 78 20 74 68 69 73 20 2a  ODO1: Fix this *
6290: 2f 0a 20 20 20 20 20 20 20 20 70 52 65 74 2d 3e  /.        pRet->
62a0: 73 7a 4c 65 61 66 20 3d 20 66 74 73 35 47 65 74  szLeaf = fts5Get
62b0: 55 31 36 28 26 70 52 65 74 2d 3e 70 5b 32 5d 29  U16(&pRet->p[2])
62c0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
62d0: 20 20 20 20 70 2d 3e 72 63 20 3d 20 72 63 3b 0a      p->rc = rc;.
62e0: 20 20 20 20 70 2d 3e 6e 52 65 61 64 2b 2b 3b 0a      p->nRead++;.
62f0: 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 28    }..  assert( (
6300: 70 52 65 74 3d 3d 30 29 3d 3d 28 70 2d 3e 72 63  pRet==0)==(p->rc
6310: 21 3d 53 51 4c 49 54 45 5f 4f 4b 29 20 29 3b 0a  !=SQLITE_OK) );.
6320: 20 20 72 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d    return pRet;.}
6330: 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20  ../*.** Release 
6340: 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 64  a reference to d
6350: 61 74 61 20 72 65 63 6f 72 64 20 72 65 74 75 72  ata record retur
6360: 6e 65 64 20 62 79 20 61 6e 20 65 61 72 6c 69 65  ned by an earlie
6370: 72 20 63 61 6c 6c 20 74 6f 0a 2a 2a 20 66 74 73  r call to.** fts
6380: 35 44 61 74 61 52 65 61 64 28 29 2e 0a 2a 2f 0a  5DataRead()..*/.
6390: 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
63a0: 44 61 74 61 52 65 6c 65 61 73 65 28 46 74 73 35  DataRelease(Fts5
63b0: 44 61 74 61 20 2a 70 44 61 74 61 29 7b 0a 20 20  Data *pData){.  
63c0: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 44 61  sqlite3_free(pDa
63d0: 74 61 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 46  ta);.}..static F
63e0: 74 73 35 44 61 74 61 20 2a 66 74 73 35 4c 65 61  ts5Data *fts5Lea
63f0: 66 52 65 61 64 28 46 74 73 35 49 6e 64 65 78 20  fRead(Fts5Index 
6400: 2a 70 2c 20 69 36 34 20 69 52 6f 77 69 64 29 7b  *p, i64 iRowid){
6410: 0a 20 20 46 74 73 35 44 61 74 61 20 2a 70 52 65  .  Fts5Data *pRe
6420: 74 20 3d 20 66 74 73 35 44 61 74 61 52 65 61 64  t = fts5DataRead
6430: 28 70 2c 20 69 52 6f 77 69 64 29 3b 0a 20 20 69  (p, iRowid);.  i
6440: 66 28 20 70 52 65 74 20 29 7b 0a 20 20 20 20 69  f( pRet ){.    i
6450: 66 28 20 70 52 65 74 2d 3e 73 7a 4c 65 61 66 3e  f( pRet->szLeaf>
6460: 70 52 65 74 2d 3e 6e 6e 20 29 7b 0a 20 20 20 20  pRet->nn ){.    
6470: 20 20 70 2d 3e 72 63 20 3d 20 46 54 53 35 5f 43    p->rc = FTS5_C
6480: 4f 52 52 55 50 54 3b 0a 20 20 20 20 20 20 66 74  ORRUPT;.      ft
6490: 73 35 44 61 74 61 52 65 6c 65 61 73 65 28 70 52  s5DataRelease(pR
64a0: 65 74 29 3b 0a 20 20 20 20 20 20 70 52 65 74 20  et);.      pRet 
64b0: 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  = 0;.    }.  }. 
64c0: 20 72 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a   return pRet;.}.
64d0: 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 35  .static int fts5
64e0: 49 6e 64 65 78 50 72 65 70 61 72 65 53 74 6d 74  IndexPrepareStmt
64f0: 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70  (.  Fts5Index *p
6500: 2c 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  ,.  sqlite3_stmt
6510: 20 2a 2a 70 70 53 74 6d 74 2c 0a 20 20 63 68 61   **ppStmt,.  cha
6520: 72 20 2a 7a 53 71 6c 0a 29 7b 0a 20 20 69 66 28  r *zSql.){.  if(
6530: 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
6540: 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 7a 53 71  K ){.    if( zSq
6550: 6c 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  l ){.      sqlit
6560: 65 33 20 2a 64 62 20 3d 20 70 2d 3e 70 43 6f 6e  e3 *db = p->pCon
6570: 66 69 67 2d 3e 64 62 3b 0a 20 20 20 20 20 20 73  fig->db;.      s
6580: 71 6c 69 74 65 33 5f 64 62 5f 63 6f 6e 66 69 67  qlite3_db_config
6590: 28 64 62 2c 20 53 51 4c 49 54 45 5f 44 42 43 4f  (db, SQLITE_DBCO
65a0: 4e 46 49 47 5f 50 52 45 50 41 52 45 5f 46 4c 41  NFIG_PREPARE_FLA
65b0: 47 53 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  GS,.            
65c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
65d0: 53 51 4c 49 54 45 5f 50 52 45 50 41 52 45 5f 50  SQLITE_PREPARE_P
65e0: 45 52 53 49 53 54 45 4e 54 29 3b 0a 20 20 20 20  ERSISTENT);.    
65f0: 20 20 70 2d 3e 72 63 20 3d 20 73 71 6c 69 74 65    p->rc = sqlite
6600: 33 5f 70 72 65 70 61 72 65 5f 76 32 28 64 62 2c  3_prepare_v2(db,
6610: 20 7a 53 71 6c 2c 20 2d 31 2c 20 70 70 53 74 6d   zSql, -1, ppStm
6620: 74 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65  t, 0);.    }else
6630: 7b 0a 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20  {.      p->rc = 
6640: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
6650: 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65    }.  }.  sqlite
6660: 33 5f 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20  3_free(zSql);.  
6670: 72 65 74 75 72 6e 20 70 2d 3e 72 63 3b 0a 7d 0a  return p->rc;.}.
6680: 0a 0a 2f 2a 0a 2a 2a 20 49 4e 53 45 52 54 20 4f  ../*.** INSERT O
6690: 52 20 52 45 50 4c 41 43 45 20 61 20 72 65 63 6f  R REPLACE a reco
66a0: 72 64 20 69 6e 74 6f 20 74 68 65 20 25 5f 64 61  rd into the %_da
66b0: 74 61 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61  ta table..*/.sta
66c0: 74 69 63 20 76 6f 69 64 20 66 74 73 35 44 61 74  tic void fts5Dat
66d0: 61 57 72 69 74 65 28 46 74 73 35 49 6e 64 65 78  aWrite(Fts5Index
66e0: 20 2a 70 2c 20 69 36 34 20 69 52 6f 77 69 64 2c   *p, i64 iRowid,
66f0: 20 63 6f 6e 73 74 20 75 38 20 2a 70 44 61 74 61   const u8 *pData
6700: 2c 20 69 6e 74 20 6e 44 61 74 61 29 7b 0a 20 20  , int nData){.  
6710: 69 66 28 20 70 2d 3e 72 63 21 3d 53 51 4c 49 54  if( p->rc!=SQLIT
6720: 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 3b 0a 0a  E_OK ) return;..
6730: 20 20 69 66 28 20 70 2d 3e 70 57 72 69 74 65 72    if( p->pWriter
6740: 3d 3d 30 20 29 7b 0a 20 20 20 20 46 74 73 35 43  ==0 ){.    Fts5C
6750: 6f 6e 66 69 67 20 2a 70 43 6f 6e 66 69 67 20 3d  onfig *pConfig =
6760: 20 70 2d 3e 70 43 6f 6e 66 69 67 3b 0a 20 20 20   p->pConfig;.   
6770: 20 66 74 73 35 49 6e 64 65 78 50 72 65 70 61 72   fts5IndexPrepar
6780: 65 53 74 6d 74 28 70 2c 20 26 70 2d 3e 70 57 72  eStmt(p, &p->pWr
6790: 69 74 65 72 2c 20 73 71 6c 69 74 65 33 5f 6d 70  iter, sqlite3_mp
67a0: 72 69 6e 74 66 28 0a 20 20 20 20 20 20 20 20 20  rintf(.         
67b0: 20 22 52 45 50 4c 41 43 45 20 49 4e 54 4f 20 27   "REPLACE INTO '
67c0: 25 71 27 2e 27 25 71 5f 64 61 74 61 27 28 69 64  %q'.'%q_data'(id
67d0: 2c 20 62 6c 6f 63 6b 29 20 56 41 4c 55 45 53 28  , block) VALUES(
67e0: 3f 2c 3f 29 22 2c 20 0a 20 20 20 20 20 20 20 20  ?,?)", .        
67f0: 20 20 70 43 6f 6e 66 69 67 2d 3e 7a 44 62 2c 20    pConfig->zDb, 
6800: 70 43 6f 6e 66 69 67 2d 3e 7a 4e 61 6d 65 0a 20  pConfig->zName. 
6810: 20 20 20 29 29 3b 0a 20 20 20 20 69 66 28 20 70     ));.    if( p
6820: 2d 3e 72 63 20 29 20 72 65 74 75 72 6e 3b 0a 20  ->rc ) return;. 
6830: 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33 5f 62 69   }..  sqlite3_bi
6840: 6e 64 5f 69 6e 74 36 34 28 70 2d 3e 70 57 72 69  nd_int64(p->pWri
6850: 74 65 72 2c 20 31 2c 20 69 52 6f 77 69 64 29 3b  ter, 1, iRowid);
6860: 0a 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f  .  sqlite3_bind_
6870: 62 6c 6f 62 28 70 2d 3e 70 57 72 69 74 65 72 2c  blob(p->pWriter,
6880: 20 32 2c 20 70 44 61 74 61 2c 20 6e 44 61 74 61   2, pData, nData
6890: 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29  , SQLITE_STATIC)
68a0: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 65 70  ;.  sqlite3_step
68b0: 28 70 2d 3e 70 57 72 69 74 65 72 29 3b 0a 20 20  (p->pWriter);.  
68c0: 70 2d 3e 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  p->rc = sqlite3_
68d0: 72 65 73 65 74 28 70 2d 3e 70 57 72 69 74 65 72  reset(p->pWriter
68e0: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 78 65 63  );.}../*.** Exec
68f0: 75 74 65 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  ute the followin
6900: 67 20 53 51 4c 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  g SQL:.**.**    
6910: 20 44 45 4c 45 54 45 20 46 52 4f 4d 20 25 5f 64   DELETE FROM %_d
6920: 61 74 61 20 57 48 45 52 45 20 69 64 20 42 45 54  ata WHERE id BET
6930: 57 45 45 4e 20 24 69 46 69 72 73 74 20 41 4e 44  WEEN $iFirst AND
6940: 20 24 69 4c 61 73 74 0a 2a 2f 0a 73 74 61 74 69   $iLast.*/.stati
6950: 63 20 76 6f 69 64 20 66 74 73 35 44 61 74 61 44  c void fts5DataD
6960: 65 6c 65 74 65 28 46 74 73 35 49 6e 64 65 78 20  elete(Fts5Index 
6970: 2a 70 2c 20 69 36 34 20 69 46 69 72 73 74 2c 20  *p, i64 iFirst, 
6980: 69 36 34 20 69 4c 61 73 74 29 7b 0a 20 20 69 66  i64 iLast){.  if
6990: 28 20 70 2d 3e 72 63 21 3d 53 51 4c 49 54 45 5f  ( p->rc!=SQLITE_
69a0: 4f 4b 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20  OK ) return;..  
69b0: 69 66 28 20 70 2d 3e 70 44 65 6c 65 74 65 72 3d  if( p->pDeleter=
69c0: 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63  =0 ){.    int rc
69d0: 3b 0a 20 20 20 20 46 74 73 35 43 6f 6e 66 69 67  ;.    Fts5Config
69e0: 20 2a 70 43 6f 6e 66 69 67 20 3d 20 70 2d 3e 70   *pConfig = p->p
69f0: 43 6f 6e 66 69 67 3b 0a 20 20 20 20 63 68 61 72  Config;.    char
6a00: 20 2a 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33   *zSql = sqlite3
6a10: 5f 6d 70 72 69 6e 74 66 28 0a 20 20 20 20 20 20  _mprintf(.      
6a20: 20 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 27    "DELETE FROM '
6a30: 25 71 27 2e 27 25 71 5f 64 61 74 61 27 20 57 48  %q'.'%q_data' WH
6a40: 45 52 45 20 69 64 3e 3d 3f 20 41 4e 44 20 69 64  ERE id>=? AND id
6a50: 3c 3d 3f 22 2c 20 0a 20 20 20 20 20 20 20 20 20  <=?", .         
6a60: 20 70 43 6f 6e 66 69 67 2d 3e 7a 44 62 2c 20 70   pConfig->zDb, p
6a70: 43 6f 6e 66 69 67 2d 3e 7a 4e 61 6d 65 0a 20 20  Config->zName.  
6a80: 20 20 29 3b 0a 20 20 20 20 69 66 28 20 7a 53 71    );.    if( zSq
6a90: 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63  l==0 ){.      rc
6aa0: 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
6ab0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
6ac0: 20 20 73 71 6c 69 74 65 33 5f 64 62 5f 63 6f 6e    sqlite3_db_con
6ad0: 66 69 67 28 70 43 6f 6e 66 69 67 2d 3e 64 62 2c  fig(pConfig->db,
6ae0: 20 53 51 4c 49 54 45 5f 44 42 43 4f 4e 46 49 47   SQLITE_DBCONFIG
6af0: 5f 50 52 45 50 41 52 45 5f 46 4c 41 47 53 2c 0a  _PREPARE_FLAGS,.
6b00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6b10: 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 50          SQLITE_P
6b20: 52 45 50 41 52 45 5f 50 45 52 53 49 53 54 45 4e  REPARE_PERSISTEN
6b30: 54 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73  T);.      rc = s
6b40: 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76  qlite3_prepare_v
6b50: 32 28 70 43 6f 6e 66 69 67 2d 3e 64 62 2c 20 7a  2(pConfig->db, z
6b60: 53 71 6c 2c 20 2d 31 2c 20 26 70 2d 3e 70 44 65  Sql, -1, &p->pDe
6b70: 6c 65 74 65 72 2c 20 30 29 3b 0a 20 20 20 20 20  leter, 0);.     
6b80: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 53   sqlite3_free(zS
6b90: 71 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ql);.    }.    i
6ba0: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
6bb0: 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 72 63 20   ){.      p->rc 
6bc0: 3d 20 72 63 3b 0a 20 20 20 20 20 20 72 65 74 75  = rc;.      retu
6bd0: 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  rn;.    }.  }.. 
6be0: 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e   sqlite3_bind_in
6bf0: 74 36 34 28 70 2d 3e 70 44 65 6c 65 74 65 72 2c  t64(p->pDeleter,
6c00: 20 31 2c 20 69 46 69 72 73 74 29 3b 0a 20 20 73   1, iFirst);.  s
6c10: 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 36  qlite3_bind_int6
6c20: 34 28 70 2d 3e 70 44 65 6c 65 74 65 72 2c 20 32  4(p->pDeleter, 2
6c30: 2c 20 69 4c 61 73 74 29 3b 0a 20 20 73 71 6c 69  , iLast);.  sqli
6c40: 74 65 33 5f 73 74 65 70 28 70 2d 3e 70 44 65 6c  te3_step(p->pDel
6c50: 65 74 65 72 29 3b 0a 20 20 70 2d 3e 72 63 20 3d  eter);.  p->rc =
6c60: 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28 70   sqlite3_reset(p
6c70: 2d 3e 70 44 65 6c 65 74 65 72 29 3b 0a 7d 0a 0a  ->pDeleter);.}..
6c80: 2f 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20 61 6c 6c  /*.** Remove all
6c90: 20 72 65 63 6f 72 64 73 20 61 73 73 6f 63 69 61   records associa
6ca0: 74 65 64 20 77 69 74 68 20 73 65 67 6d 65 6e 74  ted with segment
6cb0: 20 69 53 65 67 69 64 2e 0a 2a 2f 0a 73 74 61 74   iSegid..*/.stat
6cc0: 69 63 20 76 6f 69 64 20 66 74 73 35 44 61 74 61  ic void fts5Data
6cd0: 52 65 6d 6f 76 65 53 65 67 6d 65 6e 74 28 46 74  RemoveSegment(Ft
6ce0: 73 35 49 6e 64 65 78 20 2a 70 2c 20 69 6e 74 20  s5Index *p, int 
6cf0: 69 53 65 67 69 64 29 7b 0a 20 20 69 36 34 20 69  iSegid){.  i64 i
6d00: 46 69 72 73 74 20 3d 20 46 54 53 35 5f 53 45 47  First = FTS5_SEG
6d10: 4d 45 4e 54 5f 52 4f 57 49 44 28 69 53 65 67 69  MENT_ROWID(iSegi
6d20: 64 2c 20 30 29 3b 0a 20 20 69 36 34 20 69 4c 61  d, 0);.  i64 iLa
6d30: 73 74 20 3d 20 46 54 53 35 5f 53 45 47 4d 45 4e  st = FTS5_SEGMEN
6d40: 54 5f 52 4f 57 49 44 28 69 53 65 67 69 64 2b 31  T_ROWID(iSegid+1
6d50: 2c 20 30 29 2d 31 3b 0a 20 20 66 74 73 35 44 61  , 0)-1;.  fts5Da
6d60: 74 61 44 65 6c 65 74 65 28 70 2c 20 69 46 69 72  taDelete(p, iFir
6d70: 73 74 2c 20 69 4c 61 73 74 29 3b 0a 20 20 69 66  st, iLast);.  if
6d80: 28 20 70 2d 3e 70 49 64 78 44 65 6c 65 74 65 72  ( p->pIdxDeleter
6d90: 3d 3d 30 20 29 7b 0a 20 20 20 20 46 74 73 35 43  ==0 ){.    Fts5C
6da0: 6f 6e 66 69 67 20 2a 70 43 6f 6e 66 69 67 20 3d  onfig *pConfig =
6db0: 20 70 2d 3e 70 43 6f 6e 66 69 67 3b 0a 20 20 20   p->pConfig;.   
6dc0: 20 66 74 73 35 49 6e 64 65 78 50 72 65 70 61 72   fts5IndexPrepar
6dd0: 65 53 74 6d 74 28 70 2c 20 26 70 2d 3e 70 49 64  eStmt(p, &p->pId
6de0: 78 44 65 6c 65 74 65 72 2c 20 73 71 6c 69 74 65  xDeleter, sqlite
6df0: 33 5f 6d 70 72 69 6e 74 66 28 0a 20 20 20 20 20  3_mprintf(.     
6e00: 20 20 20 20 20 22 44 45 4c 45 54 45 20 46 52 4f       "DELETE FRO
6e10: 4d 20 27 25 71 27 2e 27 25 71 5f 69 64 78 27 20  M '%q'.'%q_idx' 
6e20: 57 48 45 52 45 20 73 65 67 69 64 3d 3f 22 2c 0a  WHERE segid=?",.
6e30: 20 20 20 20 20 20 20 20 20 20 70 43 6f 6e 66 69            pConfi
6e40: 67 2d 3e 7a 44 62 2c 20 70 43 6f 6e 66 69 67 2d  g->zDb, pConfig-
6e50: 3e 7a 4e 61 6d 65 0a 20 20 20 20 29 29 3b 0a 20  >zName.    ));. 
6e60: 20 7d 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d   }.  if( p->rc==
6e70: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
6e80: 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e   sqlite3_bind_in
6e90: 74 28 70 2d 3e 70 49 64 78 44 65 6c 65 74 65 72  t(p->pIdxDeleter
6ea0: 2c 20 31 2c 20 69 53 65 67 69 64 29 3b 0a 20 20  , 1, iSegid);.  
6eb0: 20 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70    sqlite3_step(p
6ec0: 2d 3e 70 49 64 78 44 65 6c 65 74 65 72 29 3b 0a  ->pIdxDeleter);.
6ed0: 20 20 20 20 70 2d 3e 72 63 20 3d 20 73 71 6c 69      p->rc = sqli
6ee0: 74 65 33 5f 72 65 73 65 74 28 70 2d 3e 70 49 64  te3_reset(p->pId
6ef0: 78 44 65 6c 65 74 65 72 29 3b 0a 20 20 7d 0a 7d  xDeleter);.  }.}
6f00: 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20  ../*.** Release 
6f10: 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 61  a reference to a
6f20: 6e 20 46 74 73 35 53 74 72 75 63 74 75 72 65 20  n Fts5Structure 
6f30: 6f 62 6a 65 63 74 20 72 65 74 75 72 6e 65 64 20  object returned 
6f40: 62 79 20 61 6e 20 65 61 72 6c 69 65 72 20 0a 2a  by an earlier .*
6f50: 2a 20 63 61 6c 6c 20 74 6f 20 66 74 73 35 53 74  * call to fts5St
6f60: 72 75 63 74 75 72 65 52 65 61 64 28 29 20 6f 72  ructureRead() or
6f70: 20 66 74 73 35 53 74 72 75 63 74 75 72 65 44 65   fts5StructureDe
6f80: 63 6f 64 65 28 29 2e 0a 2a 2f 0a 73 74 61 74 69  code()..*/.stati
6f90: 63 20 76 6f 69 64 20 66 74 73 35 53 74 72 75 63  c void fts5Struc
6fa0: 74 75 72 65 52 65 6c 65 61 73 65 28 46 74 73 35  tureRelease(Fts5
6fb0: 53 74 72 75 63 74 75 72 65 20 2a 70 53 74 72 75  Structure *pStru
6fc0: 63 74 29 7b 0a 20 20 69 66 28 20 70 53 74 72 75  ct){.  if( pStru
6fd0: 63 74 20 26 26 20 30 3e 3d 28 2d 2d 70 53 74 72  ct && 0>=(--pStr
6fe0: 75 63 74 2d 3e 6e 52 65 66 29 20 29 7b 0a 20 20  uct->nRef) ){.  
6ff0: 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 61 73 73    int i;.    ass
7000: 65 72 74 28 20 70 53 74 72 75 63 74 2d 3e 6e 52  ert( pStruct->nR
7010: 65 66 3d 3d 30 20 29 3b 0a 20 20 20 20 66 6f 72  ef==0 );.    for
7020: 28 69 3d 30 3b 20 69 3c 70 53 74 72 75 63 74 2d  (i=0; i<pStruct-
7030: 3e 6e 4c 65 76 65 6c 3b 20 69 2b 2b 29 7b 0a 20  >nLevel; i++){. 
7040: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
7050: 65 28 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65  e(pStruct->aLeve
7060: 6c 5b 69 5d 2e 61 53 65 67 29 3b 0a 20 20 20 20  l[i].aSeg);.    
7070: 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  }.    sqlite3_fr
7080: 65 65 28 70 53 74 72 75 63 74 29 3b 0a 20 20 7d  ee(pStruct);.  }
7090: 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .}..static void 
70a0: 66 74 73 35 53 74 72 75 63 74 75 72 65 52 65 66  fts5StructureRef
70b0: 28 46 74 73 35 53 74 72 75 63 74 75 72 65 20 2a  (Fts5Structure *
70c0: 70 53 74 72 75 63 74 29 7b 0a 20 20 70 53 74 72  pStruct){.  pStr
70d0: 75 63 74 2d 3e 6e 52 65 66 2b 2b 3b 0a 7d 0a 0a  uct->nRef++;.}..
70e0: 2f 2a 0a 2a 2a 20 44 65 73 65 72 69 61 6c 69 7a  /*.** Deserializ
70f0: 65 20 61 6e 64 20 72 65 74 75 72 6e 20 74 68 65  e and return the
7100: 20 73 74 72 75 63 74 75 72 65 20 72 65 63 6f 72   structure recor
7110: 64 20 63 75 72 72 65 6e 74 6c 79 20 73 74 6f 72  d currently stor
7120: 65 64 20 69 6e 20 73 65 72 69 61 6c 69 7a 65 64  ed in serialized
7130: 0a 2a 2a 20 66 6f 72 6d 20 77 69 74 68 69 6e 20  .** form within 
7140: 62 75 66 66 65 72 20 70 44 61 74 61 2f 6e 44 61  buffer pData/nDa
7150: 74 61 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 46 74  ta..**.** The Ft
7160: 73 35 53 74 72 75 63 74 75 72 65 2e 61 4c 65 76  s5Structure.aLev
7170: 65 6c 5b 5d 20 61 6e 64 20 65 61 63 68 20 46 74  el[] and each Ft
7180: 73 35 53 74 72 75 63 74 75 72 65 4c 65 76 65 6c  s5StructureLevel
7190: 2e 61 53 65 67 5b 5d 20 61 72 72 61 79 0a 2a 2a  .aSeg[] array.**
71a0: 20 61 72 65 20 6f 76 65 72 2d 61 6c 6c 6f 63 61   are over-alloca
71b0: 74 65 64 20 62 79 20 6f 6e 65 20 73 6c 6f 74 2e  ted by one slot.
71c0: 20 54 68 69 73 20 61 6c 6c 6f 77 73 20 74 68 65   This allows the
71d0: 20 73 74 72 75 63 74 75 72 65 20 63 6f 6e 74 65   structure conte
71e0: 6e 74 73 0a 2a 2a 20 74 6f 20 62 65 20 6d 6f 72  nts.** to be mor
71f0: 65 20 65 61 73 69 6c 79 20 65 64 69 74 65 64 2e  e easily edited.
7200: 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72  .**.** If an err
7210: 6f 72 20 6f 63 63 75 72 73 2c 20 2a 70 70 4f 75  or occurs, *ppOu
7220: 74 20 69 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c  t is set to NULL
7230: 20 61 6e 64 20 61 6e 20 53 51 4c 69 74 65 20 65   and an SQLite e
7240: 72 72 6f 72 20 63 6f 64 65 0a 2a 2a 20 72 65 74  rror code.** ret
7250: 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65  urned. Otherwise
7260: 2c 20 2a 70 70 4f 75 74 20 69 73 20 73 65 74 20  , *ppOut is set 
7270: 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20  to point to the 
7280: 6e 65 77 20 6f 62 6a 65 63 74 20 61 6e 64 0a 2a  new object and.*
7290: 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75  * SQLITE_OK retu
72a0: 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rned..*/.static 
72b0: 69 6e 74 20 66 74 73 35 53 74 72 75 63 74 75 72  int fts5Structur
72c0: 65 44 65 63 6f 64 65 28 0a 20 20 63 6f 6e 73 74  eDecode(.  const
72d0: 20 75 38 20 2a 70 44 61 74 61 2c 20 20 20 20 20   u8 *pData,     
72e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 75             /* Bu
72f0: 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20  ffer containing 
7300: 73 65 72 69 61 6c 69 7a 65 64 20 73 74 72 75 63  serialized struc
7310: 74 75 72 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 44  ture */.  int nD
7320: 61 74 61 2c 20 20 20 20 20 20 20 20 20 20 20 20  ata,            
7330: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
7340: 65 20 6f 66 20 62 75 66 66 65 72 20 70 44 61 74  e of buffer pDat
7350: 61 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20  a in bytes */.  
7360: 69 6e 74 20 2a 70 69 43 6f 6f 6b 69 65 2c 20 20  int *piCookie,  
7370: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7380: 2f 2a 20 43 6f 6e 66 69 67 75 72 61 74 69 6f 6e  /* Configuration
7390: 20 63 6f 6f 6b 69 65 20 76 61 6c 75 65 20 2a 2f   cookie value */
73a0: 0a 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65  .  Fts5Structure
73b0: 20 2a 2a 70 70 4f 75 74 20 20 20 20 20 20 20 20   **ppOut        
73c0: 20 20 20 2f 2a 20 4f 55 54 3a 20 44 65 73 65 72     /* OUT: Deser
73d0: 69 61 6c 69 7a 65 64 20 6f 62 6a 65 63 74 20 2a  ialized object *
73e0: 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  /.){.  int rc = 
73f0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74  SQLITE_OK;.  int
7400: 20 69 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 4c   i = 0;.  int iL
7410: 76 6c 3b 0a 20 20 69 6e 74 20 6e 4c 65 76 65 6c  vl;.  int nLevel
7420: 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 53 65 67   = 0;.  int nSeg
7430: 6d 65 6e 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20  ment = 0;.  int 
7440: 6e 42 79 74 65 3b 20 20 20 20 20 20 20 20 20 20  nByte;          
7450: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42              /* B
7460: 79 74 65 73 20 6f 66 20 73 70 61 63 65 20 74 6f  ytes of space to
7470: 20 61 6c 6c 6f 63 61 74 65 20 61 74 20 70 52 65   allocate at pRe
7480: 74 20 2a 2f 0a 20 20 46 74 73 35 53 74 72 75 63  t */.  Fts5Struc
7490: 74 75 72 65 20 2a 70 52 65 74 20 3d 20 30 3b 20  ture *pRet = 0; 
74a0: 20 20 20 20 20 20 20 2f 2a 20 53 74 72 75 63 74         /* Struct
74b0: 75 72 65 20 6f 62 6a 65 63 74 20 74 6f 20 72 65  ure object to re
74c0: 74 75 72 6e 20 2a 2f 0a 0a 20 20 2f 2a 20 47 72  turn */..  /* Gr
74d0: 61 62 20 74 68 65 20 63 6f 6f 6b 69 65 20 76 61  ab the cookie va
74e0: 6c 75 65 20 2a 2f 0a 20 20 69 66 28 20 70 69 43  lue */.  if( piC
74f0: 6f 6f 6b 69 65 20 29 20 2a 70 69 43 6f 6f 6b 69  ookie ) *piCooki
7500: 65 20 3d 20 73 71 6c 69 74 65 33 46 74 73 35 47  e = sqlite3Fts5G
7510: 65 74 33 32 28 70 44 61 74 61 29 3b 0a 20 20 69  et32(pData);.  i
7520: 20 3d 20 34 3b 0a 0a 20 20 2f 2a 20 52 65 61 64   = 4;..  /* Read
7530: 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65   the total numbe
7540: 72 20 6f 66 20 6c 65 76 65 6c 73 20 61 6e 64 20  r of levels and 
7550: 73 65 67 6d 65 6e 74 73 20 66 72 6f 6d 20 74 68  segments from th
7560: 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 0a 20  e start of the. 
7570: 20 2a 2a 20 73 74 72 75 63 74 75 72 65 20 72 65   ** structure re
7580: 63 6f 72 64 2e 20 20 2a 2f 0a 20 20 69 20 2b 3d  cord.  */.  i +=
7590: 20 66 74 73 35 47 65 74 56 61 72 69 6e 74 33 32   fts5GetVarint32
75a0: 28 26 70 44 61 74 61 5b 69 5d 2c 20 6e 4c 65 76  (&pData[i], nLev
75b0: 65 6c 29 3b 0a 20 20 69 20 2b 3d 20 66 74 73 35  el);.  i += fts5
75c0: 47 65 74 56 61 72 69 6e 74 33 32 28 26 70 44 61  GetVarint32(&pDa
75d0: 74 61 5b 69 5d 2c 20 6e 53 65 67 6d 65 6e 74 29  ta[i], nSegment)
75e0: 3b 0a 20 20 6e 42 79 74 65 20 3d 20 28 0a 20 20  ;.  nByte = (.  
75f0: 20 20 20 20 73 69 7a 65 6f 66 28 46 74 73 35 53      sizeof(Fts5S
7600: 74 72 75 63 74 75 72 65 29 20 2b 20 20 20 20 20  tructure) +     
7610: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
7620: 2a 20 4d 61 69 6e 20 73 74 72 75 63 74 75 72 65  * Main structure
7630: 20 2a 2f 0a 20 20 20 20 20 20 73 69 7a 65 6f 66   */.      sizeof
7640: 28 46 74 73 35 53 74 72 75 63 74 75 72 65 4c 65  (Fts5StructureLe
7650: 76 65 6c 29 20 2a 20 28 6e 4c 65 76 65 6c 2d 31  vel) * (nLevel-1
7660: 29 20 20 20 20 2f 2a 20 61 4c 65 76 65 6c 5b 5d  )    /* aLevel[]
7670: 20 61 72 72 61 79 20 2a 2f 0a 20 20 29 3b 0a 20   array */.  );. 
7680: 20 70 52 65 74 20 3d 20 28 46 74 73 35 53 74 72   pRet = (Fts5Str
7690: 75 63 74 75 72 65 2a 29 73 71 6c 69 74 65 33 46  ucture*)sqlite3F
76a0: 74 73 35 4d 61 6c 6c 6f 63 5a 65 72 6f 28 26 72  ts5MallocZero(&r
76b0: 63 2c 20 6e 42 79 74 65 29 3b 0a 0a 20 20 69 66  c, nByte);..  if
76c0: 28 20 70 52 65 74 20 29 7b 0a 20 20 20 20 70 52  ( pRet ){.    pR
76d0: 65 74 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20  et->nRef = 1;.  
76e0: 20 20 70 52 65 74 2d 3e 6e 4c 65 76 65 6c 20 3d    pRet->nLevel =
76f0: 20 6e 4c 65 76 65 6c 3b 0a 20 20 20 20 70 52 65   nLevel;.    pRe
7700: 74 2d 3e 6e 53 65 67 6d 65 6e 74 20 3d 20 6e 53  t->nSegment = nS
7710: 65 67 6d 65 6e 74 3b 0a 20 20 20 20 69 20 2b 3d  egment;.    i +=
7720: 20 73 71 6c 69 74 65 33 46 74 73 35 47 65 74 56   sqlite3Fts5GetV
7730: 61 72 69 6e 74 28 26 70 44 61 74 61 5b 69 5d 2c  arint(&pData[i],
7740: 20 26 70 52 65 74 2d 3e 6e 57 72 69 74 65 43 6f   &pRet->nWriteCo
7750: 75 6e 74 65 72 29 3b 0a 0a 20 20 20 20 66 6f 72  unter);..    for
7760: 28 69 4c 76 6c 3d 30 3b 20 72 63 3d 3d 53 51 4c  (iLvl=0; rc==SQL
7770: 49 54 45 5f 4f 4b 20 26 26 20 69 4c 76 6c 3c 6e  ITE_OK && iLvl<n
7780: 4c 65 76 65 6c 3b 20 69 4c 76 6c 2b 2b 29 7b 0a  Level; iLvl++){.
7790: 20 20 20 20 20 20 46 74 73 35 53 74 72 75 63 74        Fts5Struct
77a0: 75 72 65 4c 65 76 65 6c 20 2a 70 4c 76 6c 20 3d  ureLevel *pLvl =
77b0: 20 26 70 52 65 74 2d 3e 61 4c 65 76 65 6c 5b 69   &pRet->aLevel[i
77c0: 4c 76 6c 5d 3b 0a 20 20 20 20 20 20 69 6e 74 20  Lvl];.      int 
77d0: 6e 54 6f 74 61 6c 20 3d 20 30 3b 0a 20 20 20 20  nTotal = 0;.    
77e0: 20 20 69 6e 74 20 69 53 65 67 3b 0a 0a 20 20 20    int iSeg;..   
77f0: 20 20 20 69 66 28 20 69 3e 3d 6e 44 61 74 61 20     if( i>=nData 
7800: 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
7810: 46 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20  FTS5_CORRUPT;.  
7820: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
7830: 20 20 20 69 20 2b 3d 20 66 74 73 35 47 65 74 56     i += fts5GetV
7840: 61 72 69 6e 74 33 32 28 26 70 44 61 74 61 5b 69  arint32(&pData[i
7850: 5d 2c 20 70 4c 76 6c 2d 3e 6e 4d 65 72 67 65 29  ], pLvl->nMerge)
7860: 3b 0a 20 20 20 20 20 20 20 20 69 20 2b 3d 20 66  ;.        i += f
7870: 74 73 35 47 65 74 56 61 72 69 6e 74 33 32 28 26  ts5GetVarint32(&
7880: 70 44 61 74 61 5b 69 5d 2c 20 6e 54 6f 74 61 6c  pData[i], nTotal
7890: 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
78a0: 74 28 20 6e 54 6f 74 61 6c 3e 3d 70 4c 76 6c 2d  t( nTotal>=pLvl-
78b0: 3e 6e 4d 65 72 67 65 20 29 3b 0a 20 20 20 20 20  >nMerge );.     
78c0: 20 20 20 70 4c 76 6c 2d 3e 61 53 65 67 20 3d 20     pLvl->aSeg = 
78d0: 28 46 74 73 35 53 74 72 75 63 74 75 72 65 53 65  (Fts5StructureSe
78e0: 67 6d 65 6e 74 2a 29 73 71 6c 69 74 65 33 46 74  gment*)sqlite3Ft
78f0: 73 35 4d 61 6c 6c 6f 63 5a 65 72 6f 28 26 72 63  s5MallocZero(&rc
7900: 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 6e  , .            n
7910: 54 6f 74 61 6c 20 2a 20 73 69 7a 65 6f 66 28 46  Total * sizeof(F
7920: 74 73 35 53 74 72 75 63 74 75 72 65 53 65 67 6d  ts5StructureSegm
7930: 65 6e 74 29 0a 20 20 20 20 20 20 20 20 29 3b 0a  ent).        );.
7940: 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69        }..      i
7950: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
7960: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4c 76 6c   ){.        pLvl
7970: 2d 3e 6e 53 65 67 20 3d 20 6e 54 6f 74 61 6c 3b  ->nSeg = nTotal;
7980: 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 53 65  .        for(iSe
7990: 67 3d 30 3b 20 69 53 65 67 3c 6e 54 6f 74 61 6c  g=0; iSeg<nTotal
79a0: 3b 20 69 53 65 67 2b 2b 29 7b 0a 20 20 20 20 20  ; iSeg++){.     
79b0: 20 20 20 20 20 69 66 28 20 69 3e 3d 6e 44 61 74       if( i>=nDat
79c0: 61 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  a ){.           
79d0: 20 72 63 20 3d 20 46 54 53 35 5f 43 4f 52 52 55   rc = FTS5_CORRU
79e0: 50 54 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  PT;.            
79f0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20  break;.         
7a00: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69 20 2b   }.          i +
7a10: 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e 74 33  = fts5GetVarint3
7a20: 32 28 26 70 44 61 74 61 5b 69 5d 2c 20 70 4c 76  2(&pData[i], pLv
7a30: 6c 2d 3e 61 53 65 67 5b 69 53 65 67 5d 2e 69 53  l->aSeg[iSeg].iS
7a40: 65 67 69 64 29 3b 0a 20 20 20 20 20 20 20 20 20  egid);.         
7a50: 20 69 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72   i += fts5GetVar
7a60: 69 6e 74 33 32 28 26 70 44 61 74 61 5b 69 5d 2c  int32(&pData[i],
7a70: 20 70 4c 76 6c 2d 3e 61 53 65 67 5b 69 53 65 67   pLvl->aSeg[iSeg
7a80: 5d 2e 70 67 6e 6f 46 69 72 73 74 29 3b 0a 20 20  ].pgnoFirst);.  
7a90: 20 20 20 20 20 20 20 20 69 20 2b 3d 20 66 74 73          i += fts
7aa0: 35 47 65 74 56 61 72 69 6e 74 33 32 28 26 70 44  5GetVarint32(&pD
7ab0: 61 74 61 5b 69 5d 2c 20 70 4c 76 6c 2d 3e 61 53  ata[i], pLvl->aS
7ac0: 65 67 5b 69 53 65 67 5d 2e 70 67 6e 6f 4c 61 73  eg[iSeg].pgnoLas
7ad0: 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  t);.        }.  
7ae0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
7af0: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
7b00: 4b 20 29 7b 0a 20 20 20 20 20 20 66 74 73 35 53  K ){.      fts5S
7b10: 74 72 75 63 74 75 72 65 52 65 6c 65 61 73 65 28  tructureRelease(
7b20: 70 52 65 74 29 3b 0a 20 20 20 20 20 20 70 52 65  pRet);.      pRe
7b30: 74 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d  t = 0;.    }.  }
7b40: 0a 0a 20 20 2a 70 70 4f 75 74 20 3d 20 70 52 65  ..  *ppOut = pRe
7b50: 74 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  t;.  return rc;.
7b60: 7d 0a 0a 2f 2a 0a 2a 2a 0a 2a 2f 0a 73 74 61 74  }../*.**.*/.stat
7b70: 69 63 20 76 6f 69 64 20 66 74 73 35 53 74 72 75  ic void fts5Stru
7b80: 63 74 75 72 65 41 64 64 4c 65 76 65 6c 28 69 6e  ctureAddLevel(in
7b90: 74 20 2a 70 52 63 2c 20 46 74 73 35 53 74 72 75  t *pRc, Fts5Stru
7ba0: 63 74 75 72 65 20 2a 2a 70 70 53 74 72 75 63 74  cture **ppStruct
7bb0: 29 7b 0a 20 20 69 66 28 20 2a 70 52 63 3d 3d 53  ){.  if( *pRc==S
7bc0: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
7bd0: 46 74 73 35 53 74 72 75 63 74 75 72 65 20 2a 70  Fts5Structure *p
7be0: 53 74 72 75 63 74 20 3d 20 2a 70 70 53 74 72 75  Struct = *ppStru
7bf0: 63 74 3b 0a 20 20 20 20 69 6e 74 20 6e 4c 65 76  ct;.    int nLev
7c00: 65 6c 20 3d 20 70 53 74 72 75 63 74 2d 3e 6e 4c  el = pStruct->nL
7c10: 65 76 65 6c 3b 0a 20 20 20 20 69 6e 74 20 6e 42  evel;.    int nB
7c20: 79 74 65 20 3d 20 28 0a 20 20 20 20 20 20 20 20  yte = (.        
7c30: 73 69 7a 65 6f 66 28 46 74 73 35 53 74 72 75 63  sizeof(Fts5Struc
7c40: 74 75 72 65 29 20 2b 20 20 20 20 20 20 20 20 20  ture) +         
7c50: 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 69 6e           /* Main
7c60: 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20   structure */.  
7c70: 20 20 20 20 20 20 73 69 7a 65 6f 66 28 46 74 73        sizeof(Fts
7c80: 35 53 74 72 75 63 74 75 72 65 4c 65 76 65 6c 29  5StructureLevel)
7c90: 20 2a 20 28 6e 4c 65 76 65 6c 2b 31 29 20 20 2f   * (nLevel+1)  /
7ca0: 2a 20 61 4c 65 76 65 6c 5b 5d 20 61 72 72 61 79  * aLevel[] array
7cb0: 20 2a 2f 0a 20 20 20 20 29 3b 0a 0a 20 20 20 20   */.    );..    
7cc0: 70 53 74 72 75 63 74 20 3d 20 73 71 6c 69 74 65  pStruct = sqlite
7cd0: 33 5f 72 65 61 6c 6c 6f 63 28 70 53 74 72 75 63  3_realloc(pStruc
7ce0: 74 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20 20 69  t, nByte);.    i
7cf0: 66 28 20 70 53 74 72 75 63 74 20 29 7b 0a 20 20  f( pStruct ){.  
7d00: 20 20 20 20 6d 65 6d 73 65 74 28 26 70 53 74 72      memset(&pStr
7d10: 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 6e 4c 65 76  uct->aLevel[nLev
7d20: 65 6c 5d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 46  el], 0, sizeof(F
7d30: 74 73 35 53 74 72 75 63 74 75 72 65 4c 65 76 65  ts5StructureLeve
7d40: 6c 29 29 3b 0a 20 20 20 20 20 20 70 53 74 72 75  l));.      pStru
7d50: 63 74 2d 3e 6e 4c 65 76 65 6c 2b 2b 3b 0a 20 20  ct->nLevel++;.  
7d60: 20 20 20 20 2a 70 70 53 74 72 75 63 74 20 3d 20      *ppStruct = 
7d70: 70 53 74 72 75 63 74 3b 0a 20 20 20 20 7d 65 6c  pStruct;.    }el
7d80: 73 65 7b 0a 20 20 20 20 20 20 2a 70 52 63 20 3d  se{.      *pRc =
7d90: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
7da0: 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
7db0: 2a 20 45 78 74 65 6e 64 20 6c 65 76 65 6c 20 69  * Extend level i
7dc0: 4c 76 6c 20 73 6f 20 74 68 61 74 20 74 68 65 72  Lvl so that ther
7dd0: 65 20 69 73 20 72 6f 6f 6d 20 66 6f 72 20 61 74  e is room for at
7de0: 20 6c 65 61 73 74 20 6e 45 78 74 72 61 20 6d 6f   least nExtra mo
7df0: 72 65 0a 2a 2a 20 73 65 67 6d 65 6e 74 73 2e 0a  re.** segments..
7e00: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
7e10: 74 73 35 53 74 72 75 63 74 75 72 65 45 78 74 65  ts5StructureExte
7e20: 6e 64 4c 65 76 65 6c 28 0a 20 20 69 6e 74 20 2a  ndLevel(.  int *
7e30: 70 52 63 2c 20 0a 20 20 46 74 73 35 53 74 72 75  pRc, .  Fts5Stru
7e40: 63 74 75 72 65 20 2a 70 53 74 72 75 63 74 2c 20  cture *pStruct, 
7e50: 0a 20 20 69 6e 74 20 69 4c 76 6c 2c 20 0a 20 20  .  int iLvl, .  
7e60: 69 6e 74 20 6e 45 78 74 72 61 2c 20 0a 20 20 69  int nExtra, .  i
7e70: 6e 74 20 62 49 6e 73 65 72 74 0a 29 7b 0a 20 20  nt bInsert.){.  
7e80: 69 66 28 20 2a 70 52 63 3d 3d 53 51 4c 49 54 45  if( *pRc==SQLITE
7e90: 5f 4f 4b 20 29 7b 0a 20 20 20 20 46 74 73 35 53  _OK ){.    Fts5S
7ea0: 74 72 75 63 74 75 72 65 4c 65 76 65 6c 20 2a 70  tructureLevel *p
7eb0: 4c 76 6c 20 3d 20 26 70 53 74 72 75 63 74 2d 3e  Lvl = &pStruct->
7ec0: 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d 3b 0a 20 20  aLevel[iLvl];.  
7ed0: 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65 53    Fts5StructureS
7ee0: 65 67 6d 65 6e 74 20 2a 61 4e 65 77 3b 0a 20 20  egment *aNew;.  
7ef0: 20 20 69 6e 74 20 6e 42 79 74 65 3b 0a 0a 20 20    int nByte;..  
7f00: 20 20 6e 42 79 74 65 20 3d 20 28 70 4c 76 6c 2d    nByte = (pLvl-
7f10: 3e 6e 53 65 67 20 2b 20 6e 45 78 74 72 61 29 20  >nSeg + nExtra) 
7f20: 2a 20 73 69 7a 65 6f 66 28 46 74 73 35 53 74 72  * sizeof(Fts5Str
7f30: 75 63 74 75 72 65 53 65 67 6d 65 6e 74 29 3b 0a  uctureSegment);.
7f40: 20 20 20 20 61 4e 65 77 20 3d 20 73 71 6c 69 74      aNew = sqlit
7f50: 65 33 5f 72 65 61 6c 6c 6f 63 28 70 4c 76 6c 2d  e3_realloc(pLvl-
7f60: 3e 61 53 65 67 2c 20 6e 42 79 74 65 29 3b 0a 20  >aSeg, nByte);. 
7f70: 20 20 20 69 66 28 20 61 4e 65 77 20 29 7b 0a 20     if( aNew ){. 
7f80: 20 20 20 20 20 69 66 28 20 62 49 6e 73 65 72 74       if( bInsert
7f90: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 6d  ==0 ){.        m
7fa0: 65 6d 73 65 74 28 26 61 4e 65 77 5b 70 4c 76 6c  emset(&aNew[pLvl
7fb0: 2d 3e 6e 53 65 67 5d 2c 20 30 2c 20 73 69 7a 65  ->nSeg], 0, size
7fc0: 6f 66 28 46 74 73 35 53 74 72 75 63 74 75 72 65  of(Fts5Structure
7fd0: 53 65 67 6d 65 6e 74 29 20 2a 20 6e 45 78 74 72  Segment) * nExtr
7fe0: 61 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  a);.      }else{
7ff0: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 4d 6f  .        int nMo
8000: 76 65 20 3d 20 70 4c 76 6c 2d 3e 6e 53 65 67 20  ve = pLvl->nSeg 
8010: 2a 20 73 69 7a 65 6f 66 28 46 74 73 35 53 74 72  * sizeof(Fts5Str
8020: 75 63 74 75 72 65 53 65 67 6d 65 6e 74 29 3b 0a  uctureSegment);.
8030: 20 20 20 20 20 20 20 20 6d 65 6d 6d 6f 76 65 28          memmove(
8040: 26 61 4e 65 77 5b 6e 45 78 74 72 61 5d 2c 20 61  &aNew[nExtra], a
8050: 4e 65 77 2c 20 6e 4d 6f 76 65 29 3b 0a 20 20 20  New, nMove);.   
8060: 20 20 20 20 20 6d 65 6d 73 65 74 28 61 4e 65 77       memset(aNew
8070: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 46 74 73 35  , 0, sizeof(Fts5
8080: 53 74 72 75 63 74 75 72 65 53 65 67 6d 65 6e 74  StructureSegment
8090: 29 20 2a 20 6e 45 78 74 72 61 29 3b 0a 20 20 20  ) * nExtra);.   
80a0: 20 20 20 7d 0a 20 20 20 20 20 20 70 4c 76 6c 2d     }.      pLvl-
80b0: 3e 61 53 65 67 20 3d 20 61 4e 65 77 3b 0a 20 20  >aSeg = aNew;.  
80c0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2a    }else{.      *
80d0: 70 52 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d  pRc = SQLITE_NOM
80e0: 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  EM;.    }.  }.}.
80f0: 0a 73 74 61 74 69 63 20 46 74 73 35 53 74 72 75  .static Fts5Stru
8100: 63 74 75 72 65 20 2a 66 74 73 35 53 74 72 75 63  cture *fts5Struc
8110: 74 75 72 65 52 65 61 64 55 6e 63 61 63 68 65 64  tureReadUncached
8120: 28 46 74 73 35 49 6e 64 65 78 20 2a 70 29 7b 0a  (Fts5Index *p){.
8130: 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65 20    Fts5Structure 
8140: 2a 70 52 65 74 20 3d 20 30 3b 0a 20 20 46 74 73  *pRet = 0;.  Fts
8150: 35 43 6f 6e 66 69 67 20 2a 70 43 6f 6e 66 69 67  5Config *pConfig
8160: 20 3d 20 70 2d 3e 70 43 6f 6e 66 69 67 3b 0a 20   = p->pConfig;. 
8170: 20 69 6e 74 20 69 43 6f 6f 6b 69 65 3b 20 20 20   int iCookie;   
8180: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8190: 20 2f 2a 20 43 6f 6e 66 69 67 75 72 61 74 69 6f   /* Configuratio
81a0: 6e 20 63 6f 6f 6b 69 65 20 2a 2f 0a 20 20 46 74  n cookie */.  Ft
81b0: 73 35 44 61 74 61 20 2a 70 44 61 74 61 3b 0a 0a  s5Data *pData;..
81c0: 20 20 70 44 61 74 61 20 3d 20 66 74 73 35 44 61    pData = fts5Da
81d0: 74 61 52 65 61 64 28 70 2c 20 46 54 53 35 5f 53  taRead(p, FTS5_S
81e0: 54 52 55 43 54 55 52 45 5f 52 4f 57 49 44 29 3b  TRUCTURE_ROWID);
81f0: 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51  .  if( p->rc==SQ
8200: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2f  LITE_OK ){.    /
8210: 2a 20 54 4f 44 4f 3a 20 44 6f 20 77 65 20 6e 65  * TODO: Do we ne
8220: 65 64 20 74 68 69 73 20 69 66 20 74 68 65 20 6c  ed this if the l
8230: 65 61 66 2d 69 6e 64 65 78 20 69 73 20 61 70 70  eaf-index is app
8240: 65 6e 64 65 64 3f 20 50 72 6f 62 61 62 6c 79 2e  ended? Probably.
8250: 2e 2e 20 2a 2f 0a 20 20 20 20 6d 65 6d 73 65 74  .. */.    memset
8260: 28 26 70 44 61 74 61 2d 3e 70 5b 70 44 61 74 61  (&pData->p[pData
8270: 2d 3e 6e 6e 5d 2c 20 30 2c 20 46 54 53 35 5f 44  ->nn], 0, FTS5_D
8280: 41 54 41 5f 50 41 44 44 49 4e 47 29 3b 0a 20 20  ATA_PADDING);.  
8290: 20 20 70 2d 3e 72 63 20 3d 20 66 74 73 35 53 74    p->rc = fts5St
82a0: 72 75 63 74 75 72 65 44 65 63 6f 64 65 28 70 44  ructureDecode(pD
82b0: 61 74 61 2d 3e 70 2c 20 70 44 61 74 61 2d 3e 6e  ata->p, pData->n
82c0: 6e 2c 20 26 69 43 6f 6f 6b 69 65 2c 20 26 70 52  n, &iCookie, &pR
82d0: 65 74 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e  et);.    if( p->
82e0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
82f0: 20 70 43 6f 6e 66 69 67 2d 3e 69 43 6f 6f 6b 69   pConfig->iCooki
8300: 65 21 3d 69 43 6f 6f 6b 69 65 20 29 7b 0a 20 20  e!=iCookie ){.  
8310: 20 20 20 20 70 2d 3e 72 63 20 3d 20 73 71 6c 69      p->rc = sqli
8320: 74 65 33 46 74 73 35 43 6f 6e 66 69 67 4c 6f 61  te3Fts5ConfigLoa
8330: 64 28 70 43 6f 6e 66 69 67 2c 20 69 43 6f 6f 6b  d(pConfig, iCook
8340: 69 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66  ie);.    }.    f
8350: 74 73 35 44 61 74 61 52 65 6c 65 61 73 65 28 70  ts5DataRelease(p
8360: 44 61 74 61 29 3b 0a 20 20 20 20 69 66 28 20 70  Data);.    if( p
8370: 2d 3e 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc!=SQLITE_OK 
8380: 29 7b 0a 20 20 20 20 20 20 66 74 73 35 53 74 72  ){.      fts5Str
8390: 75 63 74 75 72 65 52 65 6c 65 61 73 65 28 70 52  uctureRelease(pR
83a0: 65 74 29 3b 0a 20 20 20 20 20 20 70 52 65 74 20  et);.      pRet 
83b0: 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  = 0;.    }.  }..
83c0: 20 20 72 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d    return pRet;.}
83d0: 0a 0a 73 74 61 74 69 63 20 69 36 34 20 66 74 73  ..static i64 fts
83e0: 35 49 6e 64 65 78 44 61 74 61 56 65 72 73 69 6f  5IndexDataVersio
83f0: 6e 28 46 74 73 35 49 6e 64 65 78 20 2a 70 29 7b  n(Fts5Index *p){
8400: 0a 20 20 69 36 34 20 69 56 65 72 73 69 6f 6e 20  .  i64 iVersion 
8410: 3d 20 30 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 72  = 0;..  if( p->r
8420: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
8430: 20 20 20 20 69 66 28 20 70 2d 3e 70 44 61 74 61      if( p->pData
8440: 56 65 72 73 69 6f 6e 3d 3d 30 20 29 7b 0a 20 20  Version==0 ){.  
8450: 20 20 20 20 70 2d 3e 72 63 20 3d 20 66 74 73 35      p->rc = fts5
8460: 49 6e 64 65 78 50 72 65 70 61 72 65 53 74 6d 74  IndexPrepareStmt
8470: 28 70 2c 20 26 70 2d 3e 70 44 61 74 61 56 65 72  (p, &p->pDataVer
8480: 73 69 6f 6e 2c 20 0a 20 20 20 20 20 20 20 20 20  sion, .         
8490: 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
84a0: 28 22 50 52 41 47 4d 41 20 25 51 2e 64 61 74 61  ("PRAGMA %Q.data
84b0: 5f 76 65 72 73 69 6f 6e 22 2c 20 70 2d 3e 70 43  _version", p->pC
84c0: 6f 6e 66 69 67 2d 3e 7a 44 62 29 0a 20 20 20 20  onfig->zDb).    
84d0: 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 69        );.      i
84e0: 66 28 20 70 2d 3e 72 63 20 29 20 72 65 74 75 72  f( p->rc ) retur
84f0: 6e 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  n 0;.    }..    
8500: 69 66 28 20 53 51 4c 49 54 45 5f 52 4f 57 3d 3d  if( SQLITE_ROW==
8510: 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 2d 3e  sqlite3_step(p->
8520: 70 44 61 74 61 56 65 72 73 69 6f 6e 29 20 29 7b  pDataVersion) ){
8530: 0a 20 20 20 20 20 20 69 56 65 72 73 69 6f 6e 20  .      iVersion 
8540: 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  = sqlite3_column
8550: 5f 69 6e 74 36 34 28 70 2d 3e 70 44 61 74 61 56  _int64(p->pDataV
8560: 65 72 73 69 6f 6e 2c 20 30 29 3b 0a 20 20 20 20  ersion, 0);.    
8570: 7d 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 73 71  }.    p->rc = sq
8580: 6c 69 74 65 33 5f 72 65 73 65 74 28 70 2d 3e 70  lite3_reset(p->p
8590: 44 61 74 61 56 65 72 73 69 6f 6e 29 3b 0a 20 20  DataVersion);.  
85a0: 7d 0a 0a 20 20 72 65 74 75 72 6e 20 69 56 65 72  }..  return iVer
85b0: 73 69 6f 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  sion;.}../*.** R
85c0: 65 61 64 2c 20 64 65 73 65 72 69 61 6c 69 7a 65  ead, deserialize
85d0: 20 61 6e 64 20 72 65 74 75 72 6e 20 74 68 65 20   and return the 
85e0: 73 74 72 75 63 74 75 72 65 20 72 65 63 6f 72 64  structure record
85f0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 46 74 73 35  ..**.** The Fts5
8600: 53 74 72 75 63 74 75 72 65 2e 61 4c 65 76 65 6c  Structure.aLevel
8610: 5b 5d 20 61 6e 64 20 65 61 63 68 20 46 74 73 35  [] and each Fts5
8620: 53 74 72 75 63 74 75 72 65 4c 65 76 65 6c 2e 61  StructureLevel.a
8630: 53 65 67 5b 5d 20 61 72 72 61 79 0a 2a 2a 20 61  Seg[] array.** a
8640: 72 65 20 6f 76 65 72 2d 61 6c 6c 6f 63 61 74 65  re over-allocate
8650: 64 20 61 73 20 64 65 73 63 72 69 62 65 64 20 66  d as described f
8660: 6f 72 20 66 75 6e 63 74 69 6f 6e 20 66 74 73 35  or function fts5
8670: 53 74 72 75 63 74 75 72 65 44 65 63 6f 64 65 28  StructureDecode(
8680: 29 20 0a 2a 2a 20 61 62 6f 76 65 2e 0a 2a 2a 0a  ) .** above..**.
8690: 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  ** If an error o
86a0: 63 63 75 72 73 2c 20 4e 55 4c 4c 20 69 73 20 72  ccurs, NULL is r
86b0: 65 74 75 72 6e 65 64 20 61 6e 64 20 61 6e 20 65  eturned and an e
86c0: 72 72 6f 72 20 63 6f 64 65 20 6c 65 66 74 20 69  rror code left i
86d0: 6e 20 74 68 65 0a 2a 2a 20 46 74 73 35 49 6e 64  n the.** Fts5Ind
86e0: 65 78 20 68 61 6e 64 6c 65 2e 20 49 66 20 61 6e  ex handle. If an
86f0: 20 65 72 72 6f 72 20 68 61 73 20 61 6c 72 65 61   error has alrea
8700: 64 79 20 6f 63 63 75 72 72 65 64 20 77 68 65 6e  dy occurred when
8710: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a   this function.*
8720: 2a 20 69 73 20 63 61 6c 6c 65 64 2c 20 69 74 20  * is called, it 
8730: 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73  is a no-op..*/.s
8740: 74 61 74 69 63 20 46 74 73 35 53 74 72 75 63 74  tatic Fts5Struct
8750: 75 72 65 20 2a 66 74 73 35 53 74 72 75 63 74 75  ure *fts5Structu
8760: 72 65 52 65 61 64 28 46 74 73 35 49 6e 64 65 78  reRead(Fts5Index
8770: 20 2a 70 29 7b 0a 0a 20 20 69 66 28 20 70 2d 3e   *p){..  if( p->
8780: 70 53 74 72 75 63 74 3d 3d 30 20 29 7b 0a 20 20  pStruct==0 ){.  
8790: 20 20 70 2d 3e 69 53 74 72 75 63 74 56 65 72 73    p->iStructVers
87a0: 69 6f 6e 20 3d 20 66 74 73 35 49 6e 64 65 78 44  ion = fts5IndexD
87b0: 61 74 61 56 65 72 73 69 6f 6e 28 70 29 3b 0a 20  ataVersion(p);. 
87c0: 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51     if( p->rc==SQ
87d0: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
87e0: 20 70 2d 3e 70 53 74 72 75 63 74 20 3d 20 66 74   p->pStruct = ft
87f0: 73 35 53 74 72 75 63 74 75 72 65 52 65 61 64 55  s5StructureReadU
8800: 6e 63 61 63 68 65 64 28 70 29 3b 0a 20 20 20 20  ncached(p);.    
8810: 7d 0a 20 20 7d 0a 0a 23 69 66 20 30 0a 20 20 65  }.  }..#if 0.  e
8820: 6c 73 65 7b 0a 20 20 20 20 46 74 73 35 53 74 72  lse{.    Fts5Str
8830: 75 63 74 75 72 65 20 2a 70 54 65 73 74 20 3d 20  ucture *pTest = 
8840: 66 74 73 35 53 74 72 75 63 74 75 72 65 52 65 61  fts5StructureRea
8850: 64 55 6e 63 61 63 68 65 64 28 70 29 3b 0a 20 20  dUncached(p);.  
8860: 20 20 69 66 28 20 70 54 65 73 74 20 29 7b 0a 20    if( pTest ){. 
8870: 20 20 20 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20       int i, j;. 
8880: 20 20 20 20 20 61 73 73 65 72 74 5f 6e 63 28 20       assert_nc( 
8890: 70 2d 3e 70 53 74 72 75 63 74 2d 3e 6e 53 65 67  p->pStruct->nSeg
88a0: 6d 65 6e 74 3d 3d 70 54 65 73 74 2d 3e 6e 53 65  ment==pTest->nSe
88b0: 67 6d 65 6e 74 20 29 3b 0a 20 20 20 20 20 20 61  gment );.      a
88c0: 73 73 65 72 74 5f 6e 63 28 20 70 2d 3e 70 53 74  ssert_nc( p->pSt
88d0: 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 3d 3d 70 54  ruct->nLevel==pT
88e0: 65 73 74 2d 3e 6e 4c 65 76 65 6c 20 29 3b 0a 20  est->nLevel );. 
88f0: 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
8900: 70 54 65 73 74 2d 3e 6e 4c 65 76 65 6c 3b 20 69  pTest->nLevel; i
8910: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  ++){.        ass
8920: 65 72 74 5f 6e 63 28 20 70 2d 3e 70 53 74 72 75  ert_nc( p->pStru
8930: 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 5d 2e 6e 4d  ct->aLevel[i].nM
8940: 65 72 67 65 3d 3d 70 54 65 73 74 2d 3e 61 4c 65  erge==pTest->aLe
8950: 76 65 6c 5b 69 5d 2e 6e 4d 65 72 67 65 20 29 3b  vel[i].nMerge );
8960: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 5f  .        assert_
8970: 6e 63 28 20 70 2d 3e 70 53 74 72 75 63 74 2d 3e  nc( p->pStruct->
8980: 61 4c 65 76 65 6c 5b 69 5d 2e 6e 53 65 67 3d 3d  aLevel[i].nSeg==
8990: 70 54 65 73 74 2d 3e 61 4c 65 76 65 6c 5b 69 5d  pTest->aLevel[i]
89a0: 2e 6e 53 65 67 20 29 3b 0a 20 20 20 20 20 20 20  .nSeg );.       
89b0: 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 54 65 73   for(j=0; j<pTes
89c0: 74 2d 3e 61 4c 65 76 65 6c 5b 69 5d 2e 6e 53 65  t->aLevel[i].nSe
89d0: 67 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20  g; j++){.       
89e0: 20 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65     Fts5Structure
89f0: 53 65 67 6d 65 6e 74 20 2a 70 31 20 3d 20 26 70  Segment *p1 = &p
8a00: 54 65 73 74 2d 3e 61 4c 65 76 65 6c 5b 69 5d 2e  Test->aLevel[i].
8a10: 61 53 65 67 5b 6a 5d 3b 0a 20 20 20 20 20 20 20  aSeg[j];.       
8a20: 20 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65     Fts5Structure
8a30: 53 65 67 6d 65 6e 74 20 2a 70 32 20 3d 20 26 70  Segment *p2 = &p
8a40: 2d 3e 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65  ->pStruct->aLeve
8a50: 6c 5b 69 5d 2e 61 53 65 67 5b 6a 5d 3b 0a 20 20  l[i].aSeg[j];.  
8a60: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 5f 6e          assert_n
8a70: 63 28 20 70 31 2d 3e 69 53 65 67 69 64 3d 3d 70  c( p1->iSegid==p
8a80: 32 2d 3e 69 53 65 67 69 64 20 29 3b 0a 20 20 20  2->iSegid );.   
8a90: 20 20 20 20 20 20 20 61 73 73 65 72 74 5f 6e 63         assert_nc
8aa0: 28 20 70 31 2d 3e 70 67 6e 6f 46 69 72 73 74 3d  ( p1->pgnoFirst=
8ab0: 3d 70 32 2d 3e 70 67 6e 6f 46 69 72 73 74 20 29  =p2->pgnoFirst )
8ac0: 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  ;.          asse
8ad0: 72 74 5f 6e 63 28 20 70 31 2d 3e 70 67 6e 6f 4c  rt_nc( p1->pgnoL
8ae0: 61 73 74 3d 3d 70 32 2d 3e 70 67 6e 6f 4c 61 73  ast==p2->pgnoLas
8af0: 74 20 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  t );.        }. 
8b00: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 74 73       }.      fts
8b10: 35 53 74 72 75 63 74 75 72 65 52 65 6c 65 61 73  5StructureReleas
8b20: 65 28 70 54 65 73 74 29 3b 0a 20 20 20 20 7d 0a  e(pTest);.    }.
8b30: 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66    }.#endif..  if
8b40: 28 20 70 2d 3e 72 63 21 3d 53 51 4c 49 54 45 5f  ( p->rc!=SQLITE_
8b50: 4f 4b 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  OK ) return 0;. 
8b60: 20 61 73 73 65 72 74 28 20 70 2d 3e 69 53 74 72   assert( p->iStr
8b70: 75 63 74 56 65 72 73 69 6f 6e 21 3d 30 20 29 3b  uctVersion!=0 );
8b80: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 53  .  assert( p->pS
8b90: 74 72 75 63 74 21 3d 30 20 29 3b 0a 20 20 66 74  truct!=0 );.  ft
8ba0: 73 35 53 74 72 75 63 74 75 72 65 52 65 66 28 70  s5StructureRef(p
8bb0: 2d 3e 70 53 74 72 75 63 74 29 3b 0a 20 20 72 65  ->pStruct);.  re
8bc0: 74 75 72 6e 20 70 2d 3e 70 53 74 72 75 63 74 3b  turn p->pStruct;
8bd0: 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .}..static void 
8be0: 66 74 73 35 53 74 72 75 63 74 75 72 65 49 6e 76  fts5StructureInv
8bf0: 61 6c 69 64 61 74 65 28 46 74 73 35 49 6e 64 65  alidate(Fts5Inde
8c00: 78 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e  x *p){.  if( p->
8c10: 70 53 74 72 75 63 74 20 29 7b 0a 20 20 20 20 66  pStruct ){.    f
8c20: 74 73 35 53 74 72 75 63 74 75 72 65 52 65 6c 65  ts5StructureRele
8c30: 61 73 65 28 70 2d 3e 70 53 74 72 75 63 74 29 3b  ase(p->pStruct);
8c40: 0a 20 20 20 20 70 2d 3e 70 53 74 72 75 63 74 20  .    p->pStruct 
8c50: 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  = 0;.  }.}../*.*
8c60: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 74 6f 74  * Return the tot
8c70: 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 73 65 67  al number of seg
8c80: 6d 65 6e 74 73 20 69 6e 20 69 6e 64 65 78 20 73  ments in index s
8c90: 74 72 75 63 74 75 72 65 20 70 53 74 72 75 63 74  tructure pStruct
8ca0: 2e 20 54 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69  . This.** functi
8cb0: 6f 6e 20 69 73 20 6f 6e 6c 79 20 65 76 65 72 20  on is only ever 
8cc0: 75 73 65 64 20 61 73 20 70 61 72 74 20 6f 66 20  used as part of 
8cd0: 61 73 73 65 72 74 28 29 20 63 6f 6e 64 69 74 69  assert() conditi
8ce0: 6f 6e 73 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53  ons..*/.#ifdef S
8cf0: 51 4c 49 54 45 5f 44 45 42 55 47 0a 73 74 61 74  QLITE_DEBUG.stat
8d00: 69 63 20 69 6e 74 20 66 74 73 35 53 74 72 75 63  ic int fts5Struc
8d10: 74 75 72 65 43 6f 75 6e 74 53 65 67 6d 65 6e 74  tureCountSegment
8d20: 73 28 46 74 73 35 53 74 72 75 63 74 75 72 65 20  s(Fts5Structure 
8d30: 2a 70 53 74 72 75 63 74 29 7b 0a 20 20 69 6e 74  *pStruct){.  int
8d40: 20 6e 53 65 67 6d 65 6e 74 20 3d 20 30 3b 20 20   nSegment = 0;  
8d50: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
8d60: 54 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20  Total number of 
8d70: 73 65 67 6d 65 6e 74 73 20 2a 2f 0a 20 20 69 66  segments */.  if
8d80: 28 20 70 53 74 72 75 63 74 20 29 7b 0a 20 20 20  ( pStruct ){.   
8d90: 20 69 6e 74 20 69 4c 76 6c 3b 20 20 20 20 20 20   int iLvl;      
8da0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
8db0: 2a 20 55 73 65 64 20 74 6f 20 69 74 65 72 61 74  * Used to iterat
8dc0: 65 20 74 68 72 6f 75 67 68 20 6c 65 76 65 6c 73  e through levels
8dd0: 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 4c 76 6c   */.    for(iLvl
8de0: 3d 30 3b 20 69 4c 76 6c 3c 70 53 74 72 75 63 74  =0; iLvl<pStruct
8df0: 2d 3e 6e 4c 65 76 65 6c 3b 20 69 4c 76 6c 2b 2b  ->nLevel; iLvl++
8e00: 29 7b 0a 20 20 20 20 20 20 6e 53 65 67 6d 65 6e  ){.      nSegmen
8e10: 74 20 2b 3d 20 70 53 74 72 75 63 74 2d 3e 61 4c  t += pStruct->aL
8e20: 65 76 65 6c 5b 69 4c 76 6c 5d 2e 6e 53 65 67 3b  evel[iLvl].nSeg;
8e30: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65  .    }.  }..  re
8e40: 74 75 72 6e 20 6e 53 65 67 6d 65 6e 74 3b 0a 7d  turn nSegment;.}
8e50: 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65  .#endif..#define
8e60: 20 66 74 73 35 42 75 66 66 65 72 53 61 66 65 41   fts5BufferSafeA
8e70: 70 70 65 6e 64 42 6c 6f 62 28 70 42 75 66 2c 20  ppendBlob(pBuf, 
8e80: 70 42 6c 6f 62 2c 20 6e 42 6c 6f 62 29 20 7b 20  pBlob, nBlob) { 
8e90: 20 20 20 20 5c 0a 20 20 61 73 73 65 72 74 28 20      \.  assert( 
8ea0: 28 70 42 75 66 29 2d 3e 6e 53 70 61 63 65 3e 3d  (pBuf)->nSpace>=
8eb0: 28 28 70 42 75 66 29 2d 3e 6e 2b 6e 42 6c 6f 62  ((pBuf)->n+nBlob
8ec0: 29 20 29 3b 20 20 20 20 20 20 20 20 20 20 20 20  ) );            
8ed0: 20 5c 0a 20 20 6d 65 6d 63 70 79 28 26 28 70 42   \.  memcpy(&(pB
8ee0: 75 66 29 2d 3e 70 5b 28 70 42 75 66 29 2d 3e 6e  uf)->p[(pBuf)->n
8ef0: 5d 2c 20 70 42 6c 6f 62 2c 20 6e 42 6c 6f 62 29  ], pBlob, nBlob)
8f00: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a  ;             \.
8f10: 20 20 28 70 42 75 66 29 2d 3e 6e 20 2b 3d 20 6e    (pBuf)->n += n
8f20: 42 6c 6f 62 3b 20 20 20 20 20 20 20 20 20 20 20  Blob;           
8f30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8f40: 20 20 20 20 20 20 20 20 20 20 20 5c 0a 7d 0a 0a             \.}..
8f50: 23 64 65 66 69 6e 65 20 66 74 73 35 42 75 66 66  #define fts5Buff
8f60: 65 72 53 61 66 65 41 70 70 65 6e 64 56 61 72 69  erSafeAppendVari
8f70: 6e 74 28 70 42 75 66 2c 20 69 56 61 6c 29 20 7b  nt(pBuf, iVal) {
8f80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8f90: 5c 0a 20 20 28 70 42 75 66 29 2d 3e 6e 20 2b 3d  \.  (pBuf)->n +=
8fa0: 20 73 71 6c 69 74 65 33 46 74 73 35 50 75 74 56   sqlite3Fts5PutV
8fb0: 61 72 69 6e 74 28 26 28 70 42 75 66 29 2d 3e 70  arint(&(pBuf)->p
8fc0: 5b 28 70 42 75 66 29 2d 3e 6e 5d 2c 20 28 69 56  [(pBuf)->n], (iV
8fd0: 61 6c 29 29 3b 20 20 5c 0a 20 20 61 73 73 65 72  al));  \.  asser
8fe0: 74 28 20 28 70 42 75 66 29 2d 3e 6e 53 70 61 63  t( (pBuf)->nSpac
8ff0: 65 3e 3d 28 70 42 75 66 29 2d 3e 6e 20 29 3b 20  e>=(pBuf)->n ); 
9000: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9010: 20 20 20 20 20 20 20 20 20 5c 0a 7d 0a 0a 0a 2f           \.}.../
9020: 2a 0a 2a 2a 20 53 65 72 69 61 6c 69 7a 65 20 61  *.** Serialize a
9030: 6e 64 20 73 74 6f 72 65 20 74 68 65 20 22 73 74  nd store the "st
9040: 72 75 63 74 75 72 65 22 20 72 65 63 6f 72 64 2e  ructure" record.
9050: 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72  .**.** If an err
9060: 6f 72 20 6f 63 63 75 72 73 2c 20 6c 65 61 76 65  or occurs, leave
9070: 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69   an error code i
9080: 6e 20 74 68 65 20 46 74 73 35 49 6e 64 65 78 20  n the Fts5Index 
9090: 6f 62 6a 65 63 74 2e 20 49 66 20 61 6e 0a 2a 2a  object. If an.**
90a0: 20 65 72 72 6f 72 20 68 61 73 20 61 6c 72 65 61   error has alrea
90b0: 64 79 20 6f 63 63 75 72 72 65 64 2c 20 74 68 69  dy occurred, thi
90c0: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20  s function is a 
90d0: 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63  no-op..*/.static
90e0: 20 76 6f 69 64 20 66 74 73 35 53 74 72 75 63 74   void fts5Struct
90f0: 75 72 65 57 72 69 74 65 28 46 74 73 35 49 6e 64  ureWrite(Fts5Ind
9100: 65 78 20 2a 70 2c 20 46 74 73 35 53 74 72 75 63  ex *p, Fts5Struc
9110: 74 75 72 65 20 2a 70 53 74 72 75 63 74 29 7b 0a  ture *pStruct){.
9120: 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c    if( p->rc==SQL
9130: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 46 74  ITE_OK ){.    Ft
9140: 73 35 42 75 66 66 65 72 20 62 75 66 3b 20 20 20  s5Buffer buf;   
9150: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42              /* B
9160: 75 66 66 65 72 20 74 6f 20 73 65 72 69 61 6c 69  uffer to seriali
9170: 7a 65 20 72 65 63 6f 72 64 20 69 6e 74 6f 20 2a  ze record into *
9180: 2f 0a 20 20 20 20 69 6e 74 20 69 4c 76 6c 3b 20  /.    int iLvl; 
9190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
91a0: 20 20 20 20 2f 2a 20 55 73 65 64 20 74 6f 20 69      /* Used to i
91b0: 74 65 72 61 74 65 20 74 68 72 6f 75 67 68 20 6c  terate through l
91c0: 65 76 65 6c 73 20 2a 2f 0a 20 20 20 20 69 6e 74  evels */.    int
91d0: 20 69 43 6f 6f 6b 69 65 3b 20 20 20 20 20 20 20   iCookie;       
91e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f             /* Co
91f0: 6f 6b 69 65 20 76 61 6c 75 65 20 74 6f 20 73 74  okie value to st
9200: 6f 72 65 20 2a 2f 0a 0a 20 20 20 20 61 73 73 65  ore */..    asse
9210: 72 74 28 20 70 53 74 72 75 63 74 2d 3e 6e 53 65  rt( pStruct->nSe
9220: 67 6d 65 6e 74 3d 3d 66 74 73 35 53 74 72 75 63  gment==fts5Struc
9230: 74 75 72 65 43 6f 75 6e 74 53 65 67 6d 65 6e 74  tureCountSegment
9240: 73 28 70 53 74 72 75 63 74 29 20 29 3b 0a 20 20  s(pStruct) );.  
9250: 20 20 6d 65 6d 73 65 74 28 26 62 75 66 2c 20 30    memset(&buf, 0
9260: 2c 20 73 69 7a 65 6f 66 28 46 74 73 35 42 75 66  , sizeof(Fts5Buf
9270: 66 65 72 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 41  fer));..    /* A
9280: 70 70 65 6e 64 20 74 68 65 20 63 75 72 72 65 6e  ppend the curren
9290: 74 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20  t configuration 
92a0: 63 6f 6f 6b 69 65 20 2a 2f 0a 20 20 20 20 69 43  cookie */.    iC
92b0: 6f 6f 6b 69 65 20 3d 20 70 2d 3e 70 43 6f 6e 66  ookie = p->pConf
92c0: 69 67 2d 3e 69 43 6f 6f 6b 69 65 3b 0a 20 20 20  ig->iCookie;.   
92d0: 20 69 66 28 20 69 43 6f 6f 6b 69 65 3c 30 20 29   if( iCookie<0 )
92e0: 20 69 43 6f 6f 6b 69 65 20 3d 20 30 3b 0a 0a 20   iCookie = 0;.. 
92f0: 20 20 20 69 66 28 20 30 3d 3d 73 71 6c 69 74 65     if( 0==sqlite
9300: 33 46 74 73 35 42 75 66 66 65 72 53 69 7a 65 28  3Fts5BufferSize(
9310: 26 70 2d 3e 72 63 2c 20 26 62 75 66 2c 20 34 2b  &p->rc, &buf, 4+
9320: 39 2b 39 2b 39 29 20 29 7b 0a 20 20 20 20 20 20  9+9+9) ){.      
9330: 73 71 6c 69 74 65 33 46 74 73 35 50 75 74 33 32  sqlite3Fts5Put32
9340: 28 62 75 66 2e 70 2c 20 69 43 6f 6f 6b 69 65 29  (buf.p, iCookie)
9350: 3b 0a 20 20 20 20 20 20 62 75 66 2e 6e 20 3d 20  ;.      buf.n = 
9360: 34 3b 0a 20 20 20 20 20 20 66 74 73 35 42 75 66  4;.      fts5Buf
9370: 66 65 72 53 61 66 65 41 70 70 65 6e 64 56 61 72  ferSafeAppendVar
9380: 69 6e 74 28 26 62 75 66 2c 20 70 53 74 72 75 63  int(&buf, pStruc
9390: 74 2d 3e 6e 4c 65 76 65 6c 29 3b 0a 20 20 20 20  t->nLevel);.    
93a0: 20 20 66 74 73 35 42 75 66 66 65 72 53 61 66 65    fts5BufferSafe
93b0: 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26 62 75  AppendVarint(&bu
93c0: 66 2c 20 70 53 74 72 75 63 74 2d 3e 6e 53 65 67  f, pStruct->nSeg
93d0: 6d 65 6e 74 29 3b 0a 20 20 20 20 20 20 66 74 73  ment);.      fts
93e0: 35 42 75 66 66 65 72 53 61 66 65 41 70 70 65 6e  5BufferSafeAppen
93f0: 64 56 61 72 69 6e 74 28 26 62 75 66 2c 20 28 69  dVarint(&buf, (i
9400: 36 34 29 70 53 74 72 75 63 74 2d 3e 6e 57 72 69  64)pStruct->nWri
9410: 74 65 43 6f 75 6e 74 65 72 29 3b 0a 20 20 20 20  teCounter);.    
9420: 7d 0a 0a 20 20 20 20 66 6f 72 28 69 4c 76 6c 3d  }..    for(iLvl=
9430: 30 3b 20 69 4c 76 6c 3c 70 53 74 72 75 63 74 2d  0; iLvl<pStruct-
9440: 3e 6e 4c 65 76 65 6c 3b 20 69 4c 76 6c 2b 2b 29  >nLevel; iLvl++)
9450: 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 53 65 67  {.      int iSeg
9460: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
9470: 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20 74 6f        /* Used to
9480: 20 69 74 65 72 61 74 65 20 74 68 72 6f 75 67 68   iterate through
9490: 20 73 65 67 6d 65 6e 74 73 20 2a 2f 0a 20 20 20   segments */.   
94a0: 20 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65     Fts5Structure
94b0: 4c 65 76 65 6c 20 2a 70 4c 76 6c 20 3d 20 26 70  Level *pLvl = &p
94c0: 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69  Struct->aLevel[i
94d0: 4c 76 6c 5d 3b 0a 20 20 20 20 20 20 66 74 73 35  Lvl];.      fts5
94e0: 42 75 66 66 65 72 41 70 70 65 6e 64 56 61 72 69  BufferAppendVari
94f0: 6e 74 28 26 70 2d 3e 72 63 2c 20 26 62 75 66 2c  nt(&p->rc, &buf,
9500: 20 70 4c 76 6c 2d 3e 6e 4d 65 72 67 65 29 3b 0a   pLvl->nMerge);.
9510: 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72        fts5Buffer
9520: 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26 70 2d  AppendVarint(&p-
9530: 3e 72 63 2c 20 26 62 75 66 2c 20 70 4c 76 6c 2d  >rc, &buf, pLvl-
9540: 3e 6e 53 65 67 29 3b 0a 20 20 20 20 20 20 61 73  >nSeg);.      as
9550: 73 65 72 74 28 20 70 4c 76 6c 2d 3e 6e 4d 65 72  sert( pLvl->nMer
9560: 67 65 3c 3d 70 4c 76 6c 2d 3e 6e 53 65 67 20 29  ge<=pLvl->nSeg )
9570: 3b 0a 0a 20 20 20 20 20 20 66 6f 72 28 69 53 65  ;..      for(iSe
9580: 67 3d 30 3b 20 69 53 65 67 3c 70 4c 76 6c 2d 3e  g=0; iSeg<pLvl->
9590: 6e 53 65 67 3b 20 69 53 65 67 2b 2b 29 7b 0a 20  nSeg; iSeg++){. 
95a0: 20 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65         fts5Buffe
95b0: 72 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26 70  rAppendVarint(&p
95c0: 2d 3e 72 63 2c 20 26 62 75 66 2c 20 70 4c 76 6c  ->rc, &buf, pLvl
95d0: 2d 3e 61 53 65 67 5b 69 53 65 67 5d 2e 69 53 65  ->aSeg[iSeg].iSe
95e0: 67 69 64 29 3b 0a 20 20 20 20 20 20 20 20 66 74  gid);.        ft
95f0: 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 56 61  s5BufferAppendVa
9600: 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26 62 75  rint(&p->rc, &bu
9610: 66 2c 20 70 4c 76 6c 2d 3e 61 53 65 67 5b 69 53  f, pLvl->aSeg[iS
9620: 65 67 5d 2e 70 67 6e 6f 46 69 72 73 74 29 3b 0a  eg].pgnoFirst);.
9630: 20 20 20 20 20 20 20 20 66 74 73 35 42 75 66 66          fts5Buff
9640: 65 72 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26  erAppendVarint(&
9650: 70 2d 3e 72 63 2c 20 26 62 75 66 2c 20 70 4c 76  p->rc, &buf, pLv
9660: 6c 2d 3e 61 53 65 67 5b 69 53 65 67 5d 2e 70 67  l->aSeg[iSeg].pg
9670: 6e 6f 4c 61 73 74 29 3b 0a 20 20 20 20 20 20 7d  noLast);.      }
9680: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 66 74 73 35  .    }..    fts5
9690: 44 61 74 61 57 72 69 74 65 28 70 2c 20 46 54 53  DataWrite(p, FTS
96a0: 35 5f 53 54 52 55 43 54 55 52 45 5f 52 4f 57 49  5_STRUCTURE_ROWI
96b0: 44 2c 20 62 75 66 2e 70 2c 20 62 75 66 2e 6e 29  D, buf.p, buf.n)
96c0: 3b 0a 20 20 20 20 66 74 73 35 42 75 66 66 65 72  ;.    fts5Buffer
96d0: 46 72 65 65 28 26 62 75 66 29 3b 0a 20 20 7d 0a  Free(&buf);.  }.
96e0: 7d 0a 0a 23 69 66 20 30 0a 73 74 61 74 69 63 20  }..#if 0.static 
96f0: 76 6f 69 64 20 66 74 73 35 44 65 62 75 67 53 74  void fts5DebugSt
9700: 72 75 63 74 75 72 65 28 69 6e 74 2a 2c 46 74 73  ructure(int*,Fts
9710: 35 42 75 66 66 65 72 2a 2c 46 74 73 35 53 74 72  5Buffer*,Fts5Str
9720: 75 63 74 75 72 65 2a 29 3b 0a 73 74 61 74 69 63  ucture*);.static
9730: 20 76 6f 69 64 20 66 74 73 35 50 72 69 6e 74 53   void fts5PrintS
9740: 74 72 75 63 74 75 72 65 28 63 6f 6e 73 74 20 63  tructure(const c
9750: 68 61 72 20 2a 7a 43 61 70 74 69 6f 6e 2c 20 46  har *zCaption, F
9760: 74 73 35 53 74 72 75 63 74 75 72 65 20 2a 70 53  ts5Structure *pS
9770: 74 72 75 63 74 29 7b 0a 20 20 69 6e 74 20 72 63  truct){.  int rc
9780: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
9790: 46 74 73 35 42 75 66 66 65 72 20 62 75 66 3b 0a  Fts5Buffer buf;.
97a0: 20 20 6d 65 6d 73 65 74 28 26 62 75 66 2c 20 30    memset(&buf, 0
97b0: 2c 20 73 69 7a 65 6f 66 28 62 75 66 29 29 3b 0a  , sizeof(buf));.
97c0: 20 20 66 74 73 35 44 65 62 75 67 53 74 72 75 63    fts5DebugStruc
97d0: 74 75 72 65 28 26 72 63 2c 20 26 62 75 66 2c 20  ture(&rc, &buf, 
97e0: 70 53 74 72 75 63 74 29 3b 0a 20 20 66 70 72 69  pStruct);.  fpri
97f0: 6e 74 66 28 73 74 64 6f 75 74 2c 20 22 25 73 3a  ntf(stdout, "%s:
9800: 20 25 73 5c 6e 22 2c 20 7a 43 61 70 74 69 6f 6e   %s\n", zCaption
9810: 2c 20 62 75 66 2e 70 29 3b 0a 20 20 66 66 6c 75  , buf.p);.  fflu
9820: 73 68 28 73 74 64 6f 75 74 29 3b 0a 20 20 66 74  sh(stdout);.  ft
9830: 73 35 42 75 66 66 65 72 46 72 65 65 28 26 62 75  s5BufferFree(&bu
9840: 66 29 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65  f);.}.#else.# de
9850: 66 69 6e 65 20 66 74 73 35 50 72 69 6e 74 53 74  fine fts5PrintSt
9860: 72 75 63 74 75 72 65 28 78 2c 79 29 0a 23 65 6e  ructure(x,y).#en
9870: 64 69 66 0a 0a 73 74 61 74 69 63 20 69 6e 74 20  dif..static int 
9880: 66 74 73 35 53 65 67 6d 65 6e 74 53 69 7a 65 28  fts5SegmentSize(
9890: 46 74 73 35 53 74 72 75 63 74 75 72 65 53 65 67  Fts5StructureSeg
98a0: 6d 65 6e 74 20 2a 70 53 65 67 29 7b 0a 20 20 72  ment *pSeg){.  r
98b0: 65 74 75 72 6e 20 31 20 2b 20 70 53 65 67 2d 3e  eturn 1 + pSeg->
98c0: 70 67 6e 6f 4c 61 73 74 20 2d 20 70 53 65 67 2d  pgnoLast - pSeg-
98d0: 3e 70 67 6e 6f 46 69 72 73 74 3b 0a 7d 0a 0a 2f  >pgnoFirst;.}../
98e0: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 63 6f  *.** Return a co
98f0: 70 79 20 6f 66 20 69 6e 64 65 78 20 73 74 72 75  py of index stru
9900: 63 74 75 72 65 20 70 53 74 72 75 63 74 2e 20 45  cture pStruct. E
9910: 78 63 65 70 74 2c 20 70 72 6f 6d 6f 74 65 20 61  xcept, promote a
9920: 73 20 6d 61 6e 79 20 0a 2a 2a 20 73 65 67 6d 65  s many .** segme
9930: 6e 74 73 20 61 73 20 70 6f 73 73 69 62 6c 65 20  nts as possible 
9940: 74 6f 20 6c 65 76 65 6c 20 69 50 72 6f 6d 6f 74  to level iPromot
9950: 65 2e 20 49 66 20 61 6e 20 4f 4f 4d 20 6f 63 63  e. If an OOM occ
9960: 75 72 73 2c 20 4e 55 4c 4c 20 69 73 20 0a 2a 2a  urs, NULL is .**
9970: 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74   returned..*/.st
9980: 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 53 74  atic void fts5St
9990: 72 75 63 74 75 72 65 50 72 6f 6d 6f 74 65 54 6f  ructurePromoteTo
99a0: 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70  (.  Fts5Index *p
99b0: 2c 0a 20 20 69 6e 74 20 69 50 72 6f 6d 6f 74 65  ,.  int iPromote
99c0: 2c 0a 20 20 69 6e 74 20 73 7a 50 72 6f 6d 6f 74  ,.  int szPromot
99d0: 65 2c 0a 20 20 46 74 73 35 53 74 72 75 63 74 75  e,.  Fts5Structu
99e0: 72 65 20 2a 70 53 74 72 75 63 74 0a 29 7b 0a 20  re *pStruct.){. 
99f0: 20 69 6e 74 20 69 6c 2c 20 69 73 3b 0a 20 20 46   int il, is;.  F
9a00: 74 73 35 53 74 72 75 63 74 75 72 65 4c 65 76 65  ts5StructureLeve
9a10: 6c 20 2a 70 4f 75 74 20 3d 20 26 70 53 74 72 75  l *pOut = &pStru
9a20: 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 50 72 6f 6d  ct->aLevel[iProm
9a30: 6f 74 65 5d 3b 0a 0a 20 20 69 66 28 20 70 4f 75  ote];..  if( pOu
9a40: 74 2d 3e 6e 4d 65 72 67 65 3d 3d 30 20 29 7b 0a  t->nMerge==0 ){.
9a50: 20 20 20 20 66 6f 72 28 69 6c 3d 69 50 72 6f 6d      for(il=iProm
9a60: 6f 74 65 2b 31 3b 20 69 6c 3c 70 53 74 72 75 63  ote+1; il<pStruc
9a70: 74 2d 3e 6e 4c 65 76 65 6c 3b 20 69 6c 2b 2b 29  t->nLevel; il++)
9a80: 7b 0a 20 20 20 20 20 20 46 74 73 35 53 74 72 75  {.      Fts5Stru
9a90: 63 74 75 72 65 4c 65 76 65 6c 20 2a 70 4c 76 6c  ctureLevel *pLvl
9aa0: 20 3d 20 26 70 53 74 72 75 63 74 2d 3e 61 4c 65   = &pStruct->aLe
9ab0: 76 65 6c 5b 69 6c 5d 3b 0a 20 20 20 20 20 20 69  vel[il];.      i
9ac0: 66 28 20 70 4c 76 6c 2d 3e 6e 4d 65 72 67 65 20  f( pLvl->nMerge 
9ad0: 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20  ) return;.      
9ae0: 66 6f 72 28 69 73 3d 70 4c 76 6c 2d 3e 6e 53 65  for(is=pLvl->nSe
9af0: 67 2d 31 3b 20 69 73 3e 3d 30 3b 20 69 73 2d 2d  g-1; is>=0; is--
9b00: 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 73  ){.        int s
9b10: 7a 20 3d 20 66 74 73 35 53 65 67 6d 65 6e 74 53  z = fts5SegmentS
9b20: 69 7a 65 28 26 70 4c 76 6c 2d 3e 61 53 65 67 5b  ize(&pLvl->aSeg[
9b30: 69 73 5d 29 3b 0a 20 20 20 20 20 20 20 20 69 66  is]);.        if
9b40: 28 20 73 7a 3e 73 7a 50 72 6f 6d 6f 74 65 20 29  ( sz>szPromote )
9b50: 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 20   return;.       
9b60: 20 66 74 73 35 53 74 72 75 63 74 75 72 65 45 78   fts5StructureEx
9b70: 74 65 6e 64 4c 65 76 65 6c 28 26 70 2d 3e 72 63  tendLevel(&p->rc
9b80: 2c 20 70 53 74 72 75 63 74 2c 20 69 50 72 6f 6d  , pStruct, iProm
9b90: 6f 74 65 2c 20 31 2c 20 31 29 3b 0a 20 20 20 20  ote, 1, 1);.    
9ba0: 20 20 20 20 69 66 28 20 70 2d 3e 72 63 20 29 20      if( p->rc ) 
9bb0: 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 20 20  return;.        
9bc0: 6d 65 6d 63 70 79 28 70 4f 75 74 2d 3e 61 53 65  memcpy(pOut->aSe
9bd0: 67 2c 20 26 70 4c 76 6c 2d 3e 61 53 65 67 5b 69  g, &pLvl->aSeg[i
9be0: 73 5d 2c 20 73 69 7a 65 6f 66 28 46 74 73 35 53  s], sizeof(Fts5S
9bf0: 74 72 75 63 74 75 72 65 53 65 67 6d 65 6e 74 29  tructureSegment)
9c00: 29 3b 0a 20 20 20 20 20 20 20 20 70 4f 75 74 2d  );.        pOut-
9c10: 3e 6e 53 65 67 2b 2b 3b 0a 20 20 20 20 20 20 20  >nSeg++;.       
9c20: 20 70 4c 76 6c 2d 3e 6e 53 65 67 2d 2d 3b 0a 20   pLvl->nSeg--;. 
9c30: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
9c40: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 6e 65 77 20  .}../*.** A new 
9c50: 73 65 67 6d 65 6e 74 20 68 61 73 20 6a 75 73 74  segment has just
9c60: 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f   been written to
9c70: 20 6c 65 76 65 6c 20 69 4c 76 6c 20 6f 66 20 69   level iLvl of i
9c80: 6e 64 65 78 20 73 74 72 75 63 74 75 72 65 0a 2a  ndex structure.*
9c90: 2a 20 70 53 74 72 75 63 74 2e 20 54 68 69 73 20  * pStruct. This 
9ca0: 66 75 6e 63 74 69 6f 6e 20 64 65 74 65 72 6d 69  function determi
9cb0: 6e 65 73 20 69 66 20 61 6e 79 20 73 65 67 6d 65  nes if any segme
9cc0: 6e 74 73 20 73 68 6f 75 6c 64 20 62 65 20 70 72  nts should be pr
9cd0: 6f 6d 6f 74 65 64 0a 2a 2a 20 61 73 20 61 20 72  omoted.** as a r
9ce0: 65 73 75 6c 74 2e 20 53 65 67 6d 65 6e 74 73 20  esult. Segments 
9cf0: 61 72 65 20 70 72 6f 6d 6f 74 65 64 20 69 6e 20  are promoted in 
9d00: 74 77 6f 20 73 63 65 6e 61 72 69 6f 73 3a 0a 2a  two scenarios:.*
9d10: 2a 0a 2a 2a 20 20 20 61 29 20 49 66 20 74 68 65  *.**   a) If the
9d20: 20 73 65 67 6d 65 6e 74 20 6a 75 73 74 20 77 72   segment just wr
9d30: 69 74 74 65 6e 20 69 73 20 73 6d 61 6c 6c 65 72  itten is smaller
9d40: 20 74 68 61 6e 20 6f 6e 65 20 6f 72 20 6d 6f 72   than one or mor
9d50: 65 20 73 65 67 6d 65 6e 74 73 0a 2a 2a 20 20 20  e segments.**   
9d60: 20 20 20 77 69 74 68 69 6e 20 74 68 65 20 70 72     within the pr
9d70: 65 76 69 6f 75 73 20 70 6f 70 75 6c 61 74 65 64  evious populated
9d80: 20 6c 65 76 65 6c 2c 20 69 74 20 69 73 20 70 72   level, it is pr
9d90: 6f 6d 6f 74 65 64 20 74 6f 20 74 68 65 20 70 72  omoted to the pr
9da0: 65 76 69 6f 75 73 0a 2a 2a 20 20 20 20 20 20 70  evious.**      p
9db0: 6f 70 75 6c 61 74 65 64 20 6c 65 76 65 6c 2e 0a  opulated level..
9dc0: 2a 2a 0a 2a 2a 20 20 20 62 29 20 49 66 20 74 68  **.**   b) If th
9dd0: 65 20 73 65 67 6d 65 6e 74 20 6a 75 73 74 20 77  e segment just w
9de0: 72 69 74 74 65 6e 20 69 73 20 6c 61 72 67 65 72  ritten is larger
9df0: 20 74 68 61 6e 20 74 68 65 20 6e 65 77 65 73 74   than the newest
9e00: 20 73 65 67 6d 65 6e 74 20 6f 6e 0a 2a 2a 20 20   segment on.**  
9e10: 20 20 20 20 74 68 65 20 6e 65 78 74 20 70 6f 70      the next pop
9e20: 75 6c 61 74 65 64 20 6c 65 76 65 6c 2c 20 74 68  ulated level, th
9e30: 65 6e 20 74 68 61 74 20 73 65 67 6d 65 6e 74 2c  en that segment,
9e40: 20 61 6e 64 20 61 6e 79 20 6f 74 68 65 72 20 61   and any other a
9e50: 64 6a 61 63 65 6e 74 0a 2a 2a 20 20 20 20 20 20  djacent.**      
9e60: 73 65 67 6d 65 6e 74 73 20 74 68 61 74 20 61 72  segments that ar
9e70: 65 20 61 6c 73 6f 20 73 6d 61 6c 6c 65 72 20 74  e also smaller t
9e80: 68 61 6e 20 74 68 65 20 6f 6e 65 20 6a 75 73 74  han the one just
9e90: 20 77 72 69 74 74 65 6e 2c 20 61 72 65 20 0a 2a   written, are .*
9ea0: 2a 20 20 20 20 20 20 70 72 6f 6d 6f 74 65 64 2e  *      promoted.
9eb0: 20 0a 2a 2a 0a 2a 2a 20 49 66 20 6f 6e 65 20 6f   .**.** If one o
9ec0: 72 20 6d 6f 72 65 20 73 65 67 6d 65 6e 74 73 20  r more segments 
9ed0: 61 72 65 20 70 72 6f 6d 6f 74 65 64 2c 20 74 68  are promoted, th
9ee0: 65 20 73 74 72 75 63 74 75 72 65 20 6f 62 6a 65  e structure obje
9ef0: 63 74 20 69 73 20 75 70 64 61 74 65 64 0a 2a 2a  ct is updated.**
9f00: 20 74 6f 20 72 65 66 6c 65 63 74 20 74 68 69 73   to reflect this
9f10: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
9f20: 20 66 74 73 35 53 74 72 75 63 74 75 72 65 50 72   fts5StructurePr
9f30: 6f 6d 6f 74 65 28 0a 20 20 46 74 73 35 49 6e 64  omote(.  Fts5Ind
9f40: 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  ex *p,          
9f50: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53 35           /* FTS5
9f60: 20 62 61 63 6b 65 6e 64 20 6f 62 6a 65 63 74 20   backend object 
9f70: 2a 2f 0a 20 20 69 6e 74 20 69 4c 76 6c 2c 20 20  */.  int iLvl,  
9f80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9f90: 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6c 65       /* Index le
9fa0: 76 65 6c 20 6a 75 73 74 20 75 70 64 61 74 65 64  vel just updated
9fb0: 20 2a 2f 0a 20 20 46 74 73 35 53 74 72 75 63 74   */.  Fts5Struct
9fc0: 75 72 65 20 2a 70 53 74 72 75 63 74 20 20 20 20  ure *pStruct    
9fd0: 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 73        /* Index s
9fe0: 74 72 75 63 74 75 72 65 20 2a 2f 0a 29 7b 0a 20  tructure */.){. 
9ff0: 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49   if( p->rc==SQLI
a000: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 6e 74  TE_OK ){.    int
a010: 20 69 54 73 74 3b 0a 20 20 20 20 69 6e 74 20 69   iTst;.    int i
a020: 50 72 6f 6d 6f 74 65 20 3d 20 2d 31 3b 0a 20 20  Promote = -1;.  
a030: 20 20 69 6e 74 20 73 7a 50 72 6f 6d 6f 74 65 20    int szPromote 
a040: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
a050: 2f 2a 20 50 72 6f 6d 6f 74 65 20 61 6e 79 74 68  /* Promote anyth
a060: 69 6e 67 20 74 68 69 73 20 73 69 7a 65 20 6f 72  ing this size or
a070: 20 73 6d 61 6c 6c 65 72 20 2a 2f 0a 20 20 20 20   smaller */.    
a080: 46 74 73 35 53 74 72 75 63 74 75 72 65 53 65 67  Fts5StructureSeg
a090: 6d 65 6e 74 20 2a 70 53 65 67 3b 20 20 20 2f 2a  ment *pSeg;   /*
a0a0: 20 53 65 67 6d 65 6e 74 20 6a 75 73 74 20 77 72   Segment just wr
a0b0: 69 74 74 65 6e 20 2a 2f 0a 20 20 20 20 69 6e 74  itten */.    int
a0c0: 20 73 7a 53 65 67 3b 20 20 20 20 20 20 20 20 20   szSeg;         
a0d0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
a0e0: 7a 65 20 6f 66 20 73 65 67 6d 65 6e 74 20 6a 75  ze of segment ju
a0f0: 73 74 20 77 72 69 74 74 65 6e 20 2a 2f 0a 20 20  st written */.  
a100: 20 20 69 6e 74 20 6e 53 65 67 20 3d 20 70 53 74    int nSeg = pSt
a110: 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76  ruct->aLevel[iLv
a120: 6c 5d 2e 6e 53 65 67 3b 0a 0a 20 20 20 20 69 66  l].nSeg;..    if
a130: 28 20 6e 53 65 67 3d 3d 30 20 29 20 72 65 74 75  ( nSeg==0 ) retu
a140: 72 6e 3b 0a 20 20 20 20 70 53 65 67 20 3d 20 26  rn;.    pSeg = &
a150: 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b  pStruct->aLevel[
a160: 69 4c 76 6c 5d 2e 61 53 65 67 5b 70 53 74 72 75  iLvl].aSeg[pStru
a170: 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d  ct->aLevel[iLvl]
a180: 2e 6e 53 65 67 2d 31 5d 3b 0a 20 20 20 20 73 7a  .nSeg-1];.    sz
a190: 53 65 67 20 3d 20 28 31 20 2b 20 70 53 65 67 2d  Seg = (1 + pSeg-
a1a0: 3e 70 67 6e 6f 4c 61 73 74 20 2d 20 70 53 65 67  >pgnoLast - pSeg
a1b0: 2d 3e 70 67 6e 6f 46 69 72 73 74 29 3b 0a 0a 20  ->pgnoFirst);.. 
a1c0: 20 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20     /* Check for 
a1d0: 63 6f 6e 64 69 74 69 6f 6e 20 28 61 29 20 2a 2f  condition (a) */
a1e0: 0a 20 20 20 20 66 6f 72 28 69 54 73 74 3d 69 4c  .    for(iTst=iL
a1f0: 76 6c 2d 31 3b 20 69 54 73 74 3e 3d 30 20 26 26  vl-1; iTst>=0 &&
a200: 20 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c   pStruct->aLevel
a210: 5b 69 54 73 74 5d 2e 6e 53 65 67 3d 3d 30 3b 20  [iTst].nSeg==0; 
a220: 69 54 73 74 2d 2d 29 3b 0a 20 20 20 20 69 66 28  iTst--);.    if(
a230: 20 69 54 73 74 3e 3d 30 20 29 7b 0a 20 20 20 20   iTst>=0 ){.    
a240: 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 69    int i;.      i
a250: 6e 74 20 73 7a 4d 61 78 20 3d 20 30 3b 0a 20 20  nt szMax = 0;.  
a260: 20 20 20 20 46 74 73 35 53 74 72 75 63 74 75 72      Fts5Structur
a270: 65 4c 65 76 65 6c 20 2a 70 54 73 74 20 3d 20 26  eLevel *pTst = &
a280: 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b  pStruct->aLevel[
a290: 69 54 73 74 5d 3b 0a 20 20 20 20 20 20 61 73 73  iTst];.      ass
a2a0: 65 72 74 28 20 70 54 73 74 2d 3e 6e 4d 65 72 67  ert( pTst->nMerg
a2b0: 65 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 66 6f  e==0 );.      fo
a2c0: 72 28 69 3d 30 3b 20 69 3c 70 54 73 74 2d 3e 6e  r(i=0; i<pTst->n
a2d0: 53 65 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Seg; i++){.     
a2e0: 20 20 20 69 6e 74 20 73 7a 20 3d 20 70 54 73 74     int sz = pTst
a2f0: 2d 3e 61 53 65 67 5b 69 5d 2e 70 67 6e 6f 4c 61  ->aSeg[i].pgnoLa
a300: 73 74 20 2d 20 70 54 73 74 2d 3e 61 53 65 67 5b  st - pTst->aSeg[
a310: 69 5d 2e 70 67 6e 6f 46 69 72 73 74 20 2b 20 31  i].pgnoFirst + 1
a320: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 7a  ;.        if( sz
a330: 3e 73 7a 4d 61 78 20 29 20 73 7a 4d 61 78 20 3d  >szMax ) szMax =
a340: 20 73 7a 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   sz;.      }.   
a350: 20 20 20 69 66 28 20 73 7a 4d 61 78 3e 3d 73 7a     if( szMax>=sz
a360: 53 65 67 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  Seg ){.        /
a370: 2a 20 43 6f 6e 64 69 74 69 6f 6e 20 28 61 29 20  * Condition (a) 
a380: 69 73 20 74 72 75 65 2e 20 50 72 6f 6d 6f 74 65  is true. Promote
a390: 20 74 68 65 20 6e 65 77 65 73 74 20 73 65 67 6d   the newest segm
a3a0: 65 6e 74 20 6f 6e 20 6c 65 76 65 6c 20 0a 20 20  ent on level .  
a3b0: 20 20 20 20 20 20 2a 2a 20 69 4c 76 6c 20 74 6f        ** iLvl to
a3c0: 20 6c 65 76 65 6c 20 69 54 73 74 2e 20 20 2a 2f   level iTst.  */
a3d0: 0a 20 20 20 20 20 20 20 20 69 50 72 6f 6d 6f 74  .        iPromot
a3e0: 65 20 3d 20 69 54 73 74 3b 0a 20 20 20 20 20 20  e = iTst;.      
a3f0: 20 20 73 7a 50 72 6f 6d 6f 74 65 20 3d 20 73 7a    szPromote = sz
a400: 4d 61 78 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  Max;.      }.   
a410: 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 63 6f   }..    /* If co
a420: 6e 64 69 74 69 6f 6e 20 28 61 29 20 69 73 20 6e  ndition (a) is n
a430: 6f 74 20 6d 65 74 2c 20 61 73 73 75 6d 65 20 28  ot met, assume (
a440: 62 29 20 69 73 20 74 72 75 65 2e 20 53 74 72 75  b) is true. Stru
a450: 63 74 75 72 65 50 72 6f 6d 6f 74 65 54 6f 28 29  cturePromoteTo()
a460: 0a 20 20 20 20 2a 2a 20 69 73 20 61 20 6e 6f 2d  .    ** is a no-
a470: 6f 70 20 69 66 20 69 74 20 69 73 20 6e 6f 74 2e  op if it is not.
a480: 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 69 50 72    */.    if( iPr
a490: 6f 6d 6f 74 65 3c 30 20 29 7b 0a 20 20 20 20 20  omote<0 ){.     
a4a0: 20 69 50 72 6f 6d 6f 74 65 20 3d 20 69 4c 76 6c   iPromote = iLvl
a4b0: 3b 0a 20 20 20 20 20 20 73 7a 50 72 6f 6d 6f 74  ;.      szPromot
a4c0: 65 20 3d 20 73 7a 53 65 67 3b 0a 20 20 20 20 7d  e = szSeg;.    }
a4d0: 0a 20 20 20 20 66 74 73 35 53 74 72 75 63 74 75  .    fts5Structu
a4e0: 72 65 50 72 6f 6d 6f 74 65 54 6f 28 70 2c 20 69  rePromoteTo(p, i
a4f0: 50 72 6f 6d 6f 74 65 2c 20 73 7a 50 72 6f 6d 6f  Promote, szPromo
a500: 74 65 2c 20 70 53 74 72 75 63 74 29 3b 0a 20 20  te, pStruct);.  
a510: 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 41 64 76 61  }.}.../*.** Adva
a520: 6e 63 65 20 74 68 65 20 69 74 65 72 61 74 6f 72  nce the iterator
a530: 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 6f   passed as the o
a540: 6e 6c 79 20 61 72 67 75 6d 65 6e 74 2e 20 49 66  nly argument. If
a550: 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
a560: 0a 2a 2a 20 64 6f 63 6c 69 73 74 2d 69 6e 64 65  .** doclist-inde
a570: 78 20 70 61 67 65 20 69 73 20 72 65 61 63 68 65  x page is reache
a580: 64 2c 20 72 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65  d, return non-ze
a590: 72 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ro..*/.static in
a5a0: 74 20 66 74 73 35 44 6c 69 64 78 4c 76 6c 4e 65  t fts5DlidxLvlNe
a5b0: 78 74 28 46 74 73 35 44 6c 69 64 78 4c 76 6c 20  xt(Fts5DlidxLvl 
a5c0: 2a 70 4c 76 6c 29 7b 0a 20 20 46 74 73 35 44 61  *pLvl){.  Fts5Da
a5d0: 74 61 20 2a 70 44 61 74 61 20 3d 20 70 4c 76 6c  ta *pData = pLvl
a5e0: 2d 3e 70 44 61 74 61 3b 0a 0a 20 20 69 66 28 20  ->pData;..  if( 
a5f0: 70 4c 76 6c 2d 3e 69 4f 66 66 3d 3d 30 20 29 7b  pLvl->iOff==0 ){
a600: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 76  .    assert( pLv
a610: 6c 2d 3e 62 45 6f 66 3d 3d 30 20 29 3b 0a 20 20  l->bEof==0 );.  
a620: 20 20 70 4c 76 6c 2d 3e 69 4f 66 66 20 3d 20 31    pLvl->iOff = 1
a630: 3b 0a 20 20 20 20 70 4c 76 6c 2d 3e 69 4f 66 66  ;.    pLvl->iOff
a640: 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e   += fts5GetVarin
a650: 74 33 32 28 26 70 44 61 74 61 2d 3e 70 5b 31 5d  t32(&pData->p[1]
a660: 2c 20 70 4c 76 6c 2d 3e 69 4c 65 61 66 50 67 6e  , pLvl->iLeafPgn
a670: 6f 29 3b 0a 20 20 20 20 70 4c 76 6c 2d 3e 69 4f  o);.    pLvl->iO
a680: 66 66 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72  ff += fts5GetVar
a690: 69 6e 74 28 26 70 44 61 74 61 2d 3e 70 5b 70 4c  int(&pData->p[pL
a6a0: 76 6c 2d 3e 69 4f 66 66 5d 2c 20 28 75 36 34 2a  vl->iOff], (u64*
a6b0: 29 26 70 4c 76 6c 2d 3e 69 52 6f 77 69 64 29 3b  )&pLvl->iRowid);
a6c0: 0a 20 20 20 20 70 4c 76 6c 2d 3e 69 46 69 72 73  .    pLvl->iFirs
a6d0: 74 4f 66 66 20 3d 20 70 4c 76 6c 2d 3e 69 4f 66  tOff = pLvl->iOf
a6e0: 66 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  f;.  }else{.    
a6f0: 69 6e 74 20 69 4f 66 66 3b 0a 20 20 20 20 66 6f  int iOff;.    fo
a700: 72 28 69 4f 66 66 3d 70 4c 76 6c 2d 3e 69 4f 66  r(iOff=pLvl->iOf
a710: 66 3b 20 69 4f 66 66 3c 70 44 61 74 61 2d 3e 6e  f; iOff<pData->n
a720: 6e 3b 20 69 4f 66 66 2b 2b 29 7b 0a 20 20 20 20  n; iOff++){.    
a730: 20 20 69 66 28 20 70 44 61 74 61 2d 3e 70 5b 69    if( pData->p[i
a740: 4f 66 66 5d 20 29 20 62 72 65 61 6b 3b 20 0a 20  Off] ) break; . 
a750: 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 69 4f     }..    if( iO
a760: 66 66 3c 70 44 61 74 61 2d 3e 6e 6e 20 29 7b 0a  ff<pData->nn ){.
a770: 20 20 20 20 20 20 69 36 34 20 69 56 61 6c 3b 0a        i64 iVal;.
a780: 20 20 20 20 20 20 70 4c 76 6c 2d 3e 69 4c 65 61        pLvl->iLea
a790: 66 50 67 6e 6f 20 2b 3d 20 28 69 4f 66 66 20 2d  fPgno += (iOff -
a7a0: 20 70 4c 76 6c 2d 3e 69 4f 66 66 29 20 2b 20 31   pLvl->iOff) + 1
a7b0: 3b 0a 20 20 20 20 20 20 69 4f 66 66 20 2b 3d 20  ;.      iOff += 
a7c0: 66 74 73 35 47 65 74 56 61 72 69 6e 74 28 26 70  fts5GetVarint(&p
a7d0: 44 61 74 61 2d 3e 70 5b 69 4f 66 66 5d 2c 20 28  Data->p[iOff], (
a7e0: 75 36 34 2a 29 26 69 56 61 6c 29 3b 0a 20 20 20  u64*)&iVal);.   
a7f0: 20 20 20 70 4c 76 6c 2d 3e 69 52 6f 77 69 64 20     pLvl->iRowid 
a800: 2b 3d 20 69 56 61 6c 3b 0a 20 20 20 20 20 20 70  += iVal;.      p
a810: 4c 76 6c 2d 3e 69 4f 66 66 20 3d 20 69 4f 66 66  Lvl->iOff = iOff
a820: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
a830: 20 20 20 70 4c 76 6c 2d 3e 62 45 6f 66 20 3d 20     pLvl->bEof = 
a840: 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  1;.    }.  }..  
a850: 72 65 74 75 72 6e 20 70 4c 76 6c 2d 3e 62 45 6f  return pLvl->bEo
a860: 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 76 61  f;.}../*.** Adva
a870: 6e 63 65 20 74 68 65 20 69 74 65 72 61 74 6f 72  nce the iterator
a880: 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 6f   passed as the o
a890: 6e 6c 79 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f  nly argument..*/
a8a0: 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 35  .static int fts5
a8b0: 44 6c 69 64 78 49 74 65 72 4e 65 78 74 52 28 46  DlidxIterNextR(F
a8c0: 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 46 74 73  ts5Index *p, Fts
a8d0: 35 44 6c 69 64 78 49 74 65 72 20 2a 70 49 74 65  5DlidxIter *pIte
a8e0: 72 2c 20 69 6e 74 20 69 4c 76 6c 29 7b 0a 20 20  r, int iLvl){.  
a8f0: 46 74 73 35 44 6c 69 64 78 4c 76 6c 20 2a 70 4c  Fts5DlidxLvl *pL
a900: 76 6c 20 3d 20 26 70 49 74 65 72 2d 3e 61 4c 76  vl = &pIter->aLv
a910: 6c 5b 69 4c 76 6c 5d 3b 0a 0a 20 20 61 73 73 65  l[iLvl];..  asse
a920: 72 74 28 20 69 4c 76 6c 3c 70 49 74 65 72 2d 3e  rt( iLvl<pIter->
a930: 6e 4c 76 6c 20 29 3b 0a 20 20 69 66 28 20 66 74  nLvl );.  if( ft
a940: 73 35 44 6c 69 64 78 4c 76 6c 4e 65 78 74 28 70  s5DlidxLvlNext(p
a950: 4c 76 6c 29 20 29 7b 0a 20 20 20 20 69 66 28 20  Lvl) ){.    if( 
a960: 28 69 4c 76 6c 2b 31 29 20 3c 20 70 49 74 65 72  (iLvl+1) < pIter
a970: 2d 3e 6e 4c 76 6c 20 29 7b 0a 20 20 20 20 20 20  ->nLvl ){.      
a980: 66 74 73 35 44 6c 69 64 78 49 74 65 72 4e 65 78  fts5DlidxIterNex
a990: 74 52 28 70 2c 20 70 49 74 65 72 2c 20 69 4c 76  tR(p, pIter, iLv
a9a0: 6c 2b 31 29 3b 0a 20 20 20 20 20 20 69 66 28 20  l+1);.      if( 
a9b0: 70 4c 76 6c 5b 31 5d 2e 62 45 6f 66 3d 3d 30 20  pLvl[1].bEof==0 
a9c0: 29 7b 0a 20 20 20 20 20 20 20 20 66 74 73 35 44  ){.        fts5D
a9d0: 61 74 61 52 65 6c 65 61 73 65 28 70 4c 76 6c 2d  ataRelease(pLvl-
a9e0: 3e 70 44 61 74 61 29 3b 0a 20 20 20 20 20 20 20  >pData);.       
a9f0: 20 6d 65 6d 73 65 74 28 70 4c 76 6c 2c 20 30 2c   memset(pLvl, 0,
aa00: 20 73 69 7a 65 6f 66 28 46 74 73 35 44 6c 69 64   sizeof(Fts5Dlid
aa10: 78 4c 76 6c 29 29 3b 0a 20 20 20 20 20 20 20 20  xLvl));.        
aa20: 70 4c 76 6c 2d 3e 70 44 61 74 61 20 3d 20 66 74  pLvl->pData = ft
aa30: 73 35 44 61 74 61 52 65 61 64 28 70 2c 20 0a 20  s5DataRead(p, . 
aa40: 20 20 20 20 20 20 20 20 20 20 20 46 54 53 35 5f             FTS5_
aa50: 44 4c 49 44 58 5f 52 4f 57 49 44 28 70 49 74 65  DLIDX_ROWID(pIte
aa60: 72 2d 3e 69 53 65 67 69 64 2c 20 69 4c 76 6c 2c  r->iSegid, iLvl,
aa70: 20 70 4c 76 6c 5b 31 5d 2e 69 4c 65 61 66 50 67   pLvl[1].iLeafPg
aa80: 6e 6f 29 0a 20 20 20 20 20 20 20 20 29 3b 0a 20  no).        );. 
aa90: 20 20 20 20 20 20 20 69 66 28 20 70 4c 76 6c 2d         if( pLvl-
aaa0: 3e 70 44 61 74 61 20 29 20 66 74 73 35 44 6c 69  >pData ) fts5Dli
aab0: 64 78 4c 76 6c 4e 65 78 74 28 70 4c 76 6c 29 3b  dxLvlNext(pLvl);
aac0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
aad0: 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70 49 74   }..  return pIt
aae0: 65 72 2d 3e 61 4c 76 6c 5b 30 5d 2e 62 45 6f 66  er->aLvl[0].bEof
aaf0: 3b 0a 7d 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 4e 65 78 74  ts5DlidxIterNext
ab10: 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 46  (Fts5Index *p, F
ab20: 74 73 35 44 6c 69 64 78 49 74 65 72 20 2a 70 49  ts5DlidxIter *pI
ab30: 74 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 66  ter){.  return f
ab40: 74 73 35 44 6c 69 64 78 49 74 65 72 4e 65 78 74  ts5DlidxIterNext
ab50: 52 28 70 2c 20 70 49 74 65 72 2c 20 30 29 3b 0a  R(p, pIter, 0);.
ab60: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 69 74 65  }../*.** The ite
ab70: 72 61 74 6f 72 20 70 61 73 73 65 64 20 61 73 20  rator passed as 
ab80: 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65  the first argume
ab90: 6e 74 20 68 61 73 20 74 68 65 20 66 6f 6c 6c 6f  nt has the follo
aba0: 77 69 6e 67 20 66 69 65 6c 64 73 20 73 65 74 0a  wing fields set.
abb0: 2a 2a 20 61 73 20 66 6f 6c 6c 6f 77 73 2e 20 54  ** as follows. T
abc0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 73 65 74  his function set
abd0: 73 20 75 70 20 74 68 65 20 72 65 73 74 20 6f 66  s up the rest of
abe0: 20 74 68 65 20 69 74 65 72 61 74 6f 72 20 73 6f   the iterator so
abf0: 20 74 68 61 74 20 69 74 0a 2a 2a 20 70 6f 69 6e   that it.** poin
ac00: 74 73 20 74 6f 20 74 68 65 20 66 69 72 73 74 20  ts to the first 
ac10: 72 6f 77 69 64 20 69 6e 20 74 68 65 20 64 6f 63  rowid in the doc
ac20: 6c 69 73 74 2d 69 6e 64 65 78 2e 0a 2a 2a 0a 2a  list-index..**.*
ac30: 2a 20 20 20 70 44 61 74 61 3a 0a 2a 2a 20 20 20  *   pData:.**   
ac40: 20 20 70 6f 69 6e 74 65 72 20 74 6f 20 64 6f 63    pointer to doc
ac50: 6c 69 73 74 2d 69 6e 64 65 78 20 72 65 63 6f 72  list-index recor
ac60: 64 2c 20 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74  d, .**.** When t
ac70: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
ac80: 63 61 6c 6c 65 64 20 70 49 74 65 72 2d 3e 69 4c  called pIter->iL
ac90: 65 61 66 50 67 6e 6f 20 69 73 20 74 68 65 20 70  eafPgno is the p
aca0: 61 67 65 20 6e 75 6d 62 65 72 20 74 68 65 0a 2a  age number the.*
acb0: 2a 20 64 6f 63 6c 69 73 74 20 69 73 20 61 73 73  * doclist is ass
acc0: 6f 63 69 61 74 65 64 20 77 69 74 68 20 28 74 68  ociated with (th
acd0: 65 20 6f 6e 65 20 66 65 61 74 75 72 69 6e 67 20  e one featuring 
ace0: 74 68 65 20 74 65 72 6d 29 2e 0a 2a 2f 0a 73 74  the term)..*/.st
acf0: 61 74 69 63 20 69 6e 74 20 66 74 73 35 44 6c 69  atic int fts5Dli
ad00: 64 78 49 74 65 72 46 69 72 73 74 28 46 74 73 35  dxIterFirst(Fts5
ad10: 44 6c 69 64 78 49 74 65 72 20 2a 70 49 74 65 72  DlidxIter *pIter
ad20: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f  ){.  int i;.  fo
ad30: 72 28 69 3d 30 3b 20 69 3c 70 49 74 65 72 2d 3e  r(i=0; i<pIter->
ad40: 6e 4c 76 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nLvl; i++){.    
ad50: 66 74 73 35 44 6c 69 64 78 4c 76 6c 4e 65 78 74  fts5DlidxLvlNext
ad60: 28 26 70 49 74 65 72 2d 3e 61 4c 76 6c 5b 69 5d  (&pIter->aLvl[i]
ad70: 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
ad80: 70 49 74 65 72 2d 3e 61 4c 76 6c 5b 30 5d 2e 62  pIter->aLvl[0].b
ad90: 45 6f 66 3b 0a 7d 0a 0a 0a 73 74 61 74 69 63 20  Eof;.}...static 
ada0: 69 6e 74 20 66 74 73 35 44 6c 69 64 78 49 74 65  int fts5DlidxIte
adb0: 72 45 6f 66 28 46 74 73 35 49 6e 64 65 78 20 2a  rEof(Fts5Index *
adc0: 70 2c 20 46 74 73 35 44 6c 69 64 78 49 74 65 72  p, Fts5DlidxIter
add0: 20 2a 70 49 74 65 72 29 7b 0a 20 20 72 65 74 75   *pIter){.  retu
ade0: 72 6e 20 70 2d 3e 72 63 21 3d 53 51 4c 49 54 45  rn p->rc!=SQLITE
adf0: 5f 4f 4b 20 7c 7c 20 70 49 74 65 72 2d 3e 61 4c  _OK || pIter->aL
ae00: 76 6c 5b 30 5d 2e 62 45 6f 66 3b 0a 7d 0a 0a 73  vl[0].bEof;.}..s
ae10: 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 44  tatic void fts5D
ae20: 6c 69 64 78 49 74 65 72 4c 61 73 74 28 46 74 73  lidxIterLast(Fts
ae30: 35 49 6e 64 65 78 20 2a 70 2c 20 46 74 73 35 44  5Index *p, Fts5D
ae40: 6c 69 64 78 49 74 65 72 20 2a 70 49 74 65 72 29  lidxIter *pIter)
ae50: 7b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20 2f 2a  {.  int i;..  /*
ae60: 20 41 64 76 61 6e 63 65 20 65 61 63 68 20 6c 65   Advance each le
ae70: 76 65 6c 20 74 6f 20 74 68 65 20 6c 61 73 74 20  vel to the last 
ae80: 65 6e 74 72 79 20 6f 6e 20 74 68 65 20 6c 61 73  entry on the las
ae90: 74 20 70 61 67 65 20 2a 2f 0a 20 20 66 6f 72 28  t page */.  for(
aea0: 69 3d 70 49 74 65 72 2d 3e 6e 4c 76 6c 2d 31 3b  i=pIter->nLvl-1;
aeb0: 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
aec0: 4b 20 26 26 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b  K && i>=0; i--){
aed0: 0a 20 20 20 20 46 74 73 35 44 6c 69 64 78 4c 76  .    Fts5DlidxLv
aee0: 6c 20 2a 70 4c 76 6c 20 3d 20 26 70 49 74 65 72  l *pLvl = &pIter
aef0: 2d 3e 61 4c 76 6c 5b 69 5d 3b 0a 20 20 20 20 77  ->aLvl[i];.    w
af00: 68 69 6c 65 28 20 66 74 73 35 44 6c 69 64 78 4c  hile( fts5DlidxL
af10: 76 6c 4e 65 78 74 28 70 4c 76 6c 29 3d 3d 30 20  vlNext(pLvl)==0 
af20: 29 3b 0a 20 20 20 20 70 4c 76 6c 2d 3e 62 45 6f  );.    pLvl->bEo
af30: 66 20 3d 20 30 3b 0a 0a 20 20 20 20 69 66 28 20  f = 0;..    if( 
af40: 69 3e 30 20 29 7b 0a 20 20 20 20 20 20 46 74 73  i>0 ){.      Fts
af50: 35 44 6c 69 64 78 4c 76 6c 20 2a 70 43 68 69 6c  5DlidxLvl *pChil
af60: 64 20 3d 20 26 70 4c 76 6c 5b 2d 31 5d 3b 0a 20  d = &pLvl[-1];. 
af70: 20 20 20 20 20 66 74 73 35 44 61 74 61 52 65 6c       fts5DataRel
af80: 65 61 73 65 28 70 43 68 69 6c 64 2d 3e 70 44 61  ease(pChild->pDa
af90: 74 61 29 3b 0a 20 20 20 20 20 20 6d 65 6d 73 65  ta);.      memse
afa0: 74 28 70 43 68 69 6c 64 2c 20 30 2c 20 73 69 7a  t(pChild, 0, siz
afb0: 65 6f 66 28 46 74 73 35 44 6c 69 64 78 4c 76 6c  eof(Fts5DlidxLvl
afc0: 29 29 3b 0a 20 20 20 20 20 20 70 43 68 69 6c 64  ));.      pChild
afd0: 2d 3e 70 44 61 74 61 20 3d 20 66 74 73 35 44 61  ->pData = fts5Da
afe0: 74 61 52 65 61 64 28 70 2c 20 0a 20 20 20 20 20  taRead(p, .     
aff0: 20 20 20 20 20 46 54 53 35 5f 44 4c 49 44 58 5f       FTS5_DLIDX_
b000: 52 4f 57 49 44 28 70 49 74 65 72 2d 3e 69 53 65  ROWID(pIter->iSe
b010: 67 69 64 2c 20 69 2d 31 2c 20 70 4c 76 6c 2d 3e  gid, i-1, pLvl->
b020: 69 4c 65 61 66 50 67 6e 6f 29 0a 20 20 20 20 20  iLeafPgno).     
b030: 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a   );.    }.  }.}.
b040: 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20  ./*.** Move the 
b050: 69 74 65 72 61 74 6f 72 20 70 61 73 73 65 64 20  iterator passed 
b060: 61 73 20 74 68 65 20 6f 6e 6c 79 20 61 72 67 75  as the only argu
b070: 6d 65 6e 74 20 74 6f 20 74 68 65 20 70 72 65 76  ment to the prev
b080: 69 6f 75 73 20 65 6e 74 72 79 2e 0a 2a 2f 0a 73  ious entry..*/.s
b090: 74 61 74 69 63 20 69 6e 74 20 66 74 73 35 44 6c  tatic int fts5Dl
b0a0: 69 64 78 4c 76 6c 50 72 65 76 28 46 74 73 35 44  idxLvlPrev(Fts5D
b0b0: 6c 69 64 78 4c 76 6c 20 2a 70 4c 76 6c 29 7b 0a  lidxLvl *pLvl){.
b0c0: 20 20 69 6e 74 20 69 4f 66 66 20 3d 20 70 4c 76    int iOff = pLv
b0d0: 6c 2d 3e 69 4f 66 66 3b 0a 0a 20 20 61 73 73 65  l->iOff;..  asse
b0e0: 72 74 28 20 70 4c 76 6c 2d 3e 62 45 6f 66 3d 3d  rt( pLvl->bEof==
b0f0: 30 20 29 3b 0a 20 20 69 66 28 20 69 4f 66 66 3c  0 );.  if( iOff<
b100: 3d 70 4c 76 6c 2d 3e 69 46 69 72 73 74 4f 66 66  =pLvl->iFirstOff
b110: 20 29 7b 0a 20 20 20 20 70 4c 76 6c 2d 3e 62 45   ){.    pLvl->bE
b120: 6f 66 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b  of = 1;.  }else{
b130: 0a 20 20 20 20 75 38 20 2a 61 20 3d 20 70 4c 76  .    u8 *a = pLv
b140: 6c 2d 3e 70 44 61 74 61 2d 3e 70 3b 0a 20 20 20  l->pData->p;.   
b150: 20 69 36 34 20 69 56 61 6c 3b 0a 20 20 20 20 69   i64 iVal;.    i
b160: 6e 74 20 69 4c 69 6d 69 74 3b 0a 20 20 20 20 69  nt iLimit;.    i
b170: 6e 74 20 69 69 3b 0a 20 20 20 20 69 6e 74 20 6e  nt ii;.    int n
b180: 5a 65 72 6f 20 3d 20 30 3b 0a 0a 20 20 20 20 2f  Zero = 0;..    /
b190: 2a 20 43 75 72 72 65 6e 74 6c 79 20 69 4f 66 66  * Currently iOff
b1a0: 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 66   points to the f
b1b0: 69 72 73 74 20 62 79 74 65 20 6f 66 20 61 20 76  irst byte of a v
b1c0: 61 72 69 6e 74 2e 20 54 68 69 73 20 62 6c 6f 63  arint. This bloc
b1d0: 6b 20 0a 20 20 20 20 2a 2a 20 64 65 63 72 65 6d  k .    ** decrem
b1e0: 65 6e 74 73 20 69 4f 66 66 20 75 6e 74 69 6c 20  ents iOff until 
b1f0: 69 74 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65  it points to the
b200: 20 66 69 72 73 74 20 62 79 74 65 20 6f 66 20 74   first byte of t
b210: 68 65 20 70 72 65 76 69 6f 75 73 20 0a 20 20 20  he previous .   
b220: 20 2a 2a 20 76 61 72 69 6e 74 2e 20 54 61 6b 69   ** varint. Taki
b230: 6e 67 20 63 61 72 65 20 6e 6f 74 20 74 6f 20 72  ng care not to r
b240: 65 61 64 20 61 6e 79 20 6d 65 6d 6f 72 79 20 6c  ead any memory l
b250: 6f 63 61 74 69 6f 6e 73 20 74 68 61 74 20 6f 63  ocations that oc
b260: 63 75 72 0a 20 20 20 20 2a 2a 20 62 65 66 6f 72  cur.    ** befor
b270: 65 20 74 68 65 20 62 75 66 66 65 72 20 69 6e 20  e the buffer in 
b280: 6d 65 6d 6f 72 79 2e 20 20 2a 2f 0a 20 20 20 20  memory.  */.    
b290: 69 4c 69 6d 69 74 20 3d 20 28 69 4f 66 66 3e 39  iLimit = (iOff>9
b2a0: 20 3f 20 69 4f 66 66 2d 39 20 3a 20 30 29 3b 0a   ? iOff-9 : 0);.
b2b0: 20 20 20 20 66 6f 72 28 69 4f 66 66 2d 2d 3b 20      for(iOff--; 
b2c0: 69 4f 66 66 3e 69 4c 69 6d 69 74 3b 20 69 4f 66  iOff>iLimit; iOf
b2d0: 66 2d 2d 29 7b 0a 20 20 20 20 20 20 69 66 28 20  f--){.      if( 
b2e0: 28 61 5b 69 4f 66 66 2d 31 5d 20 26 20 30 78 38  (a[iOff-1] & 0x8
b2f0: 30 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20  0)==0 ) break;. 
b300: 20 20 20 7d 0a 0a 20 20 20 20 66 74 73 35 47 65     }..    fts5Ge
b310: 74 56 61 72 69 6e 74 28 26 61 5b 69 4f 66 66 5d  tVarint(&a[iOff]
b320: 2c 20 28 75 36 34 2a 29 26 69 56 61 6c 29 3b 0a  , (u64*)&iVal);.
b330: 20 20 20 20 70 4c 76 6c 2d 3e 69 52 6f 77 69 64      pLvl->iRowid
b340: 20 2d 3d 20 69 56 61 6c 3b 0a 20 20 20 20 70 4c   -= iVal;.    pL
b350: 76 6c 2d 3e 69 4c 65 61 66 50 67 6e 6f 2d 2d 3b  vl->iLeafPgno--;
b360: 0a 0a 20 20 20 20 2f 2a 20 53 6b 69 70 20 62 61  ..    /* Skip ba
b370: 63 6b 77 61 72 64 73 20 70 61 73 74 20 61 6e 79  ckwards past any
b380: 20 30 78 30 30 20 76 61 72 69 6e 74 73 2e 20 2a   0x00 varints. *
b390: 2f 0a 20 20 20 20 66 6f 72 28 69 69 3d 69 4f 66  /.    for(ii=iOf
b3a0: 66 2d 31 3b 20 69 69 3e 3d 70 4c 76 6c 2d 3e 69  f-1; ii>=pLvl->i
b3b0: 46 69 72 73 74 4f 66 66 20 26 26 20 61 5b 69 69  FirstOff && a[ii
b3c0: 5d 3d 3d 30 78 30 30 3b 20 69 69 2d 2d 29 7b 0a  ]==0x00; ii--){.
b3d0: 20 20 20 20 20 20 6e 5a 65 72 6f 2b 2b 3b 0a 20        nZero++;. 
b3e0: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 69 3e     }.    if( ii>
b3f0: 3d 70 4c 76 6c 2d 3e 69 46 69 72 73 74 4f 66 66  =pLvl->iFirstOff
b400: 20 26 26 20 28 61 5b 69 69 5d 20 26 20 30 78 38   && (a[ii] & 0x8
b410: 30 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54  0) ){.      /* T
b420: 68 65 20 62 79 74 65 20 69 6d 6d 65 64 69 61 74  he byte immediat
b430: 65 6c 79 20 62 65 66 6f 72 65 20 74 68 65 20 6c  ely before the l
b440: 61 73 74 20 30 78 30 30 20 62 79 74 65 20 68 61  ast 0x00 byte ha
b450: 73 20 74 68 65 20 30 78 38 30 20 62 69 74 0a 20  s the 0x80 bit. 
b460: 20 20 20 20 20 2a 2a 20 73 65 74 2e 20 53 6f 20       ** set. So 
b470: 74 68 65 20 6c 61 73 74 20 30 78 30 30 20 69 73  the last 0x00 is
b480: 20 6f 6e 6c 79 20 61 20 76 61 72 69 6e 74 20 30   only a varint 0
b490: 20 69 66 20 74 68 65 72 65 20 61 72 65 20 38 20   if there are 8 
b4a0: 6d 6f 72 65 20 30 78 38 30 0a 20 20 20 20 20 20  more 0x80.      
b4b0: 2a 2a 20 62 79 74 65 73 20 62 65 66 6f 72 65 20  ** bytes before 
b4c0: 61 5b 69 69 5d 2e 20 2a 2f 0a 20 20 20 20 20 20  a[ii]. */.      
b4d0: 69 6e 74 20 62 5a 65 72 6f 20 3d 20 30 3b 20 20  int bZero = 0;  
b4e0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
b4f0: 72 75 65 20 69 66 20 6c 61 73 74 20 30 78 30 30  rue if last 0x00
b500: 20 63 6f 75 6e 74 73 20 2a 2f 0a 20 20 20 20 20   counts */.     
b510: 20 69 66 28 20 28 69 69 2d 38 29 3e 3d 70 4c 76   if( (ii-8)>=pLv
b520: 6c 2d 3e 69 46 69 72 73 74 4f 66 66 20 29 7b 0a  l->iFirstOff ){.
b530: 20 20 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20          int j;. 
b540: 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 31 3b 20         for(j=1; 
b550: 6a 3c 3d 38 20 26 26 20 28 61 5b 69 69 2d 6a 5d  j<=8 && (a[ii-j]
b560: 20 26 20 30 78 38 30 29 3b 20 6a 2b 2b 29 3b 0a   & 0x80); j++);.
b570: 20 20 20 20 20 20 20 20 62 5a 65 72 6f 20 3d 20          bZero = 
b580: 28 6a 3e 38 29 3b 0a 20 20 20 20 20 20 7d 0a 20  (j>8);.      }. 
b590: 20 20 20 20 20 69 66 28 20 62 5a 65 72 6f 3d 3d       if( bZero==
b5a0: 30 20 29 20 6e 5a 65 72 6f 2d 2d 3b 0a 20 20 20  0 ) nZero--;.   
b5b0: 20 7d 0a 20 20 20 20 70 4c 76 6c 2d 3e 69 4c 65   }.    pLvl->iLe
b5c0: 61 66 50 67 6e 6f 20 2d 3d 20 6e 5a 65 72 6f 3b  afPgno -= nZero;
b5d0: 0a 20 20 20 20 70 4c 76 6c 2d 3e 69 4f 66 66 20  .    pLvl->iOff 
b5e0: 3d 20 69 4f 66 66 20 2d 20 6e 5a 65 72 6f 3b 0a  = iOff - nZero;.
b5f0: 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70 4c    }..  return pL
b600: 76 6c 2d 3e 62 45 6f 66 3b 0a 7d 0a 0a 73 74 61  vl->bEof;.}..sta
b610: 74 69 63 20 69 6e 74 20 66 74 73 35 44 6c 69 64  tic int fts5Dlid
b620: 78 49 74 65 72 50 72 65 76 52 28 46 74 73 35 49  xIterPrevR(Fts5I
b630: 6e 64 65 78 20 2a 70 2c 20 46 74 73 35 44 6c 69  ndex *p, Fts5Dli
b640: 64 78 49 74 65 72 20 2a 70 49 74 65 72 2c 20 69  dxIter *pIter, i
b650: 6e 74 20 69 4c 76 6c 29 7b 0a 20 20 46 74 73 35  nt iLvl){.  Fts5
b660: 44 6c 69 64 78 4c 76 6c 20 2a 70 4c 76 6c 20 3d  DlidxLvl *pLvl =
b670: 20 26 70 49 74 65 72 2d 3e 61 4c 76 6c 5b 69 4c   &pIter->aLvl[iL
b680: 76 6c 5d 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  vl];..  assert( 
b690: 69 4c 76 6c 3c 70 49 74 65 72 2d 3e 6e 4c 76 6c  iLvl<pIter->nLvl
b6a0: 20 29 3b 0a 20 20 69 66 28 20 66 74 73 35 44 6c   );.  if( fts5Dl
b6b0: 69 64 78 4c 76 6c 50 72 65 76 28 70 4c 76 6c 29  idxLvlPrev(pLvl)
b6c0: 20 29 7b 0a 20 20 20 20 69 66 28 20 28 69 4c 76   ){.    if( (iLv
b6d0: 6c 2b 31 29 20 3c 20 70 49 74 65 72 2d 3e 6e 4c  l+1) < pIter->nL
b6e0: 76 6c 20 29 7b 0a 20 20 20 20 20 20 66 74 73 35  vl ){.      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 69 4c 76 6c 2b 31 29  , pIter, iLvl+1)
b710: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4c 76 6c  ;.      if( pLvl
b720: 5b 31 5d 2e 62 45 6f 66 3d 3d 30 20 29 7b 0a 20  [1].bEof==0 ){. 
b730: 20 20 20 20 20 20 20 66 74 73 35 44 61 74 61 52         fts5DataR
b740: 65 6c 65 61 73 65 28 70 4c 76 6c 2d 3e 70 44 61  elease(pLvl->pDa
b750: 74 61 29 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d  ta);.        mem
b760: 73 65 74 28 70 4c 76 6c 2c 20 30 2c 20 73 69 7a  set(pLvl, 0, siz
b770: 65 6f 66 28 46 74 73 35 44 6c 69 64 78 4c 76 6c  eof(Fts5DlidxLvl
b780: 29 29 3b 0a 20 20 20 20 20 20 20 20 70 4c 76 6c  ));.        pLvl
b790: 2d 3e 70 44 61 74 61 20 3d 20 66 74 73 35 44 61  ->pData = fts5Da
b7a0: 74 61 52 65 61 64 28 70 2c 20 0a 20 20 20 20 20  taRead(p, .     
b7b0: 20 20 20 20 20 20 20 46 54 53 35 5f 44 4c 49 44         FTS5_DLID
b7c0: 58 5f 52 4f 57 49 44 28 70 49 74 65 72 2d 3e 69  X_ROWID(pIter->i
b7d0: 53 65 67 69 64 2c 20 69 4c 76 6c 2c 20 70 4c 76  Segid, iLvl, pLv
b7e0: 6c 5b 31 5d 2e 69 4c 65 61 66 50 67 6e 6f 29 0a  l[1].iLeafPgno).
b7f0: 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20          );.     
b800: 20 20 20 69 66 28 20 70 4c 76 6c 2d 3e 70 44 61     if( pLvl->pDa
b810: 74 61 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ta ){.          
b820: 77 68 69 6c 65 28 20 66 74 73 35 44 6c 69 64 78  while( fts5Dlidx
b830: 4c 76 6c 4e 65 78 74 28 70 4c 76 6c 29 3d 3d 30  LvlNext(pLvl)==0
b840: 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 4c   );.          pL
b850: 76 6c 2d 3e 62 45 6f 66 20 3d 20 30 3b 0a 20 20  vl->bEof = 0;.  
b860: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
b870: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74      }.  }..  ret
b880: 75 72 6e 20 70 49 74 65 72 2d 3e 61 4c 76 6c 5b  urn pIter->aLvl[
b890: 30 5d 2e 62 45 6f 66 3b 0a 7d 0a 73 74 61 74 69  0].bEof;.}.stati
b8a0: 63 20 69 6e 74 20 66 74 73 35 44 6c 69 64 78 49  c int fts5DlidxI
b8b0: 74 65 72 50 72 65 76 28 46 74 73 35 49 6e 64 65  terPrev(Fts5Inde
b8c0: 78 20 2a 70 2c 20 46 74 73 35 44 6c 69 64 78 49  x *p, Fts5DlidxI
b8d0: 74 65 72 20 2a 70 49 74 65 72 29 7b 0a 20 20 72  ter *pIter){.  r
b8e0: 65 74 75 72 6e 20 66 74 73 35 44 6c 69 64 78 49  eturn fts5DlidxI
b8f0: 74 65 72 50 72 65 76 52 28 70 2c 20 70 49 74 65  terPrevR(p, pIte
b900: 72 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  r, 0);.}../*.** 
b910: 46 72 65 65 20 61 20 64 6f 63 6c 69 73 74 2d 69  Free a doclist-i
b920: 6e 64 65 78 20 69 74 65 72 61 74 6f 72 20 6f 62  ndex iterator ob
b930: 6a 65 63 74 20 61 6c 6c 6f 63 61 74 65 64 20 62  ject allocated b
b940: 79 20 66 74 73 35 44 6c 69 64 78 49 74 65 72 49  y fts5DlidxIterI
b950: 6e 69 74 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63  nit()..*/.static
b960: 20 76 6f 69 64 20 66 74 73 35 44 6c 69 64 78 49   void fts5DlidxI
b970: 74 65 72 46 72 65 65 28 46 74 73 35 44 6c 69 64  terFree(Fts5Dlid
b980: 78 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a 20  xIter *pIter){. 
b990: 20 69 66 28 20 70 49 74 65 72 20 29 7b 0a 20 20   if( pIter ){.  
b9a0: 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72    int i;.    for
b9b0: 28 69 3d 30 3b 20 69 3c 70 49 74 65 72 2d 3e 6e  (i=0; i<pIter->n
b9c0: 4c 76 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Lvl; i++){.     
b9d0: 20 66 74 73 35 44 61 74 61 52 65 6c 65 61 73 65   fts5DataRelease
b9e0: 28 70 49 74 65 72 2d 3e 61 4c 76 6c 5b 69 5d 2e  (pIter->aLvl[i].
b9f0: 70 44 61 74 61 29 3b 0a 20 20 20 20 7d 0a 20 20  pData);.    }.  
ba00: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
ba10: 49 74 65 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 73 74  Iter);.  }.}..st
ba20: 61 74 69 63 20 46 74 73 35 44 6c 69 64 78 49 74  atic Fts5DlidxIt
ba30: 65 72 20 2a 66 74 73 35 44 6c 69 64 78 49 74 65  er *fts5DlidxIte
ba40: 72 49 6e 69 74 28 0a 20 20 46 74 73 35 49 6e 64  rInit(.  Fts5Ind
ba50: 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  ex *p,          
ba60: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 74 73 35           /* Fts5
ba70: 20 42 61 63 6b 65 6e 64 20 74 6f 20 69 74 65 72   Backend to iter
ba80: 61 74 65 20 77 69 74 68 69 6e 20 2a 2f 0a 20 20  ate within */.  
ba90: 69 6e 74 20 62 52 65 76 2c 20 20 20 20 20 20 20  int bRev,       
baa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bab0: 2f 2a 20 54 72 75 65 20 66 6f 72 20 4f 52 44 45  /* True for ORDE
bac0: 52 20 42 59 20 41 53 43 20 2a 2f 0a 20 20 69 6e  R BY ASC */.  in
bad0: 74 20 69 53 65 67 69 64 2c 20 20 20 20 20 20 20  t iSegid,       
bae0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
baf0: 20 53 65 67 6d 65 6e 74 20 69 64 20 2a 2f 0a 20   Segment id */. 
bb00: 20 69 6e 74 20 69 4c 65 61 66 50 67 20 20 20 20   int iLeafPg    
bb10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bb20: 20 2f 2a 20 4c 65 61 66 20 70 61 67 65 20 6e 75   /* Leaf page nu
bb30: 6d 62 65 72 20 74 6f 20 6c 6f 61 64 20 64 6c 69  mber to load dli
bb40: 64 78 20 66 6f 72 20 2a 2f 0a 29 7b 0a 20 20 46  dx for */.){.  F
bb50: 74 73 35 44 6c 69 64 78 49 74 65 72 20 2a 70 49  ts5DlidxIter *pI
bb60: 74 65 72 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69  ter = 0;.  int i
bb70: 3b 0a 20 20 69 6e 74 20 62 44 6f 6e 65 20 3d 20  ;.  int bDone = 
bb80: 30 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20 70  0;..  for(i=0; p
bb90: 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
bba0: 26 26 20 62 44 6f 6e 65 3d 3d 30 3b 20 69 2b 2b  && bDone==0; i++
bbb0: 29 7b 0a 20 20 20 20 69 6e 74 20 6e 42 79 74 65  ){.    int nByte
bbc0: 20 3d 20 73 69 7a 65 6f 66 28 46 74 73 35 44 6c   = sizeof(Fts5Dl
bbd0: 69 64 78 49 74 65 72 29 20 2b 20 69 20 2a 20 73  idxIter) + i * s
bbe0: 69 7a 65 6f 66 28 46 74 73 35 44 6c 69 64 78 4c  izeof(Fts5DlidxL
bbf0: 76 6c 29 3b 0a 20 20 20 20 46 74 73 35 44 6c 69  vl);.    Fts5Dli
bc00: 64 78 49 74 65 72 20 2a 70 4e 65 77 3b 0a 0a 20  dxIter *pNew;.. 
bc10: 20 20 20 70 4e 65 77 20 3d 20 28 46 74 73 35 44     pNew = (Fts5D
bc20: 6c 69 64 78 49 74 65 72 2a 29 73 71 6c 69 74 65  lidxIter*)sqlite
bc30: 33 5f 72 65 61 6c 6c 6f 63 28 70 49 74 65 72 2c  3_realloc(pIter,
bc40: 20 6e 42 79 74 65 29 3b 0a 20 20 20 20 69 66 28   nByte);.    if(
bc50: 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20   pNew==0 ){.    
bc60: 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45    p->rc = SQLITE
bc70: 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 65 6c 73  _NOMEM;.    }els
bc80: 65 7b 0a 20 20 20 20 20 20 69 36 34 20 69 52 6f  e{.      i64 iRo
bc90: 77 69 64 20 3d 20 46 54 53 35 5f 44 4c 49 44 58  wid = FTS5_DLIDX
bca0: 5f 52 4f 57 49 44 28 69 53 65 67 69 64 2c 20 69  _ROWID(iSegid, i
bcb0: 2c 20 69 4c 65 61 66 50 67 29 3b 0a 20 20 20 20  , iLeafPg);.    
bcc0: 20 20 46 74 73 35 44 6c 69 64 78 4c 76 6c 20 2a    Fts5DlidxLvl *
bcd0: 70 4c 76 6c 20 3d 20 26 70 4e 65 77 2d 3e 61 4c  pLvl = &pNew->aL
bce0: 76 6c 5b 69 5d 3b 0a 20 20 20 20 20 20 70 49 74  vl[i];.      pIt
bcf0: 65 72 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 20  er = pNew;.     
bd00: 20 6d 65 6d 73 65 74 28 70 4c 76 6c 2c 20 30 2c   memset(pLvl, 0,
bd10: 20 73 69 7a 65 6f 66 28 46 74 73 35 44 6c 69 64   sizeof(Fts5Dlid
bd20: 78 4c 76 6c 29 29 3b 0a 20 20 20 20 20 20 70 4c  xLvl));.      pL
bd30: 76 6c 2d 3e 70 44 61 74 61 20 3d 20 66 74 73 35  vl->pData = fts5
bd40: 44 61 74 61 52 65 61 64 28 70 2c 20 69 52 6f 77  DataRead(p, iRow
bd50: 69 64 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  id);.      if( p
bd60: 4c 76 6c 2d 3e 70 44 61 74 61 20 26 26 20 28 70  Lvl->pData && (p
bd70: 4c 76 6c 2d 3e 70 44 61 74 61 2d 3e 70 5b 30 5d  Lvl->pData->p[0]
bd80: 20 26 20 30 78 30 30 30 31 29 3d 3d 30 20 29 7b   & 0x0001)==0 ){
bd90: 0a 20 20 20 20 20 20 20 20 62 44 6f 6e 65 20 3d  .        bDone =
bda0: 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   1;.      }.    
bdb0: 20 20 70 49 74 65 72 2d 3e 6e 4c 76 6c 20 3d 20    pIter->nLvl = 
bdc0: 69 2b 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  i+1;.    }.  }..
bdd0: 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c    if( p->rc==SQL
bde0: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 49  ITE_OK ){.    pI
bdf0: 74 65 72 2d 3e 69 53 65 67 69 64 20 3d 20 69 53  ter->iSegid = iS
be00: 65 67 69 64 3b 0a 20 20 20 20 69 66 28 20 62 52  egid;.    if( bR
be10: 65 76 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 66  ev==0 ){.      f
be20: 74 73 35 44 6c 69 64 78 49 74 65 72 46 69 72 73  ts5DlidxIterFirs
be30: 74 28 70 49 74 65 72 29 3b 0a 20 20 20 20 7d 65  t(pIter);.    }e
be40: 6c 73 65 7b 0a 20 20 20 20 20 20 66 74 73 35 44  lse{.      fts5D
be50: 6c 69 64 78 49 74 65 72 4c 61 73 74 28 70 2c 20  lidxIterLast(p, 
be60: 70 49 74 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20  pIter);.    }.  
be70: 7d 0a 0a 20 20 69 66 28 20 70 2d 3e 72 63 21 3d  }..  if( p->rc!=
be80: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
be90: 20 66 74 73 35 44 6c 69 64 78 49 74 65 72 46 72   fts5DlidxIterFr
bea0: 65 65 28 70 49 74 65 72 29 3b 0a 20 20 20 20 70  ee(pIter);.    p
beb0: 49 74 65 72 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20  Iter = 0;.  }.. 
bec0: 20 72 65 74 75 72 6e 20 70 49 74 65 72 3b 0a 7d   return pIter;.}
bed0: 0a 0a 73 74 61 74 69 63 20 69 36 34 20 66 74 73  ..static i64 fts
bee0: 35 44 6c 69 64 78 49 74 65 72 52 6f 77 69 64 28  5DlidxIterRowid(
bef0: 46 74 73 35 44 6c 69 64 78 49 74 65 72 20 2a 70  Fts5DlidxIter *p
bf00: 49 74 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20  Iter){.  return 
bf10: 70 49 74 65 72 2d 3e 61 4c 76 6c 5b 30 5d 2e 69  pIter->aLvl[0].i
bf20: 52 6f 77 69 64 3b 0a 7d 0a 73 74 61 74 69 63 20  Rowid;.}.static 
bf30: 69 6e 74 20 66 74 73 35 44 6c 69 64 78 49 74 65  int fts5DlidxIte
bf40: 72 50 67 6e 6f 28 46 74 73 35 44 6c 69 64 78 49  rPgno(Fts5DlidxI
bf50: 74 65 72 20 2a 70 49 74 65 72 29 7b 0a 20 20 72  ter *pIter){.  r
bf60: 65 74 75 72 6e 20 70 49 74 65 72 2d 3e 61 4c 76  eturn pIter->aLv
bf70: 6c 5b 30 5d 2e 69 4c 65 61 66 50 67 6e 6f 3b 0a  l[0].iLeafPgno;.
bf80: 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 61 64 20 74 68  }../*.** Load th
bf90: 65 20 6e 65 78 74 20 6c 65 61 66 20 70 61 67 65  e next leaf page
bfa0: 20 69 6e 74 6f 20 74 68 65 20 73 65 67 6d 65 6e   into the segmen
bfb0: 74 20 69 74 65 72 61 74 6f 72 2e 0a 2a 2f 0a 73  t iterator..*/.s
bfc0: 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 53  tatic void fts5S
bfd0: 65 67 49 74 65 72 4e 65 78 74 50 61 67 65 28 0a  egIterNextPage(.
bfe0: 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20    Fts5Index *p, 
bff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c000: 20 20 2f 2a 20 46 54 53 35 20 62 61 63 6b 65 6e    /* FTS5 backen
c010: 64 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 46 74  d object */.  Ft
c020: 73 35 53 65 67 49 74 65 72 20 2a 70 49 74 65 72  s5SegIter *pIter
c030: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
c040: 20 49 74 65 72 61 74 6f 72 20 74 6f 20 61 64 76   Iterator to adv
c050: 61 6e 63 65 20 74 6f 20 6e 65 78 74 20 70 61 67  ance to next pag
c060: 65 20 2a 2f 0a 29 7b 0a 20 20 46 74 73 35 44 61  e */.){.  Fts5Da
c070: 74 61 20 2a 70 4c 65 61 66 3b 0a 20 20 46 74 73  ta *pLeaf;.  Fts
c080: 35 53 74 72 75 63 74 75 72 65 53 65 67 6d 65 6e  5StructureSegmen
c090: 74 20 2a 70 53 65 67 20 3d 20 70 49 74 65 72 2d  t *pSeg = pIter-
c0a0: 3e 70 53 65 67 3b 0a 20 20 66 74 73 35 44 61 74  >pSeg;.  fts5Dat
c0b0: 61 52 65 6c 65 61 73 65 28 70 49 74 65 72 2d 3e  aRelease(pIter->
c0c0: 70 4c 65 61 66 29 3b 0a 20 20 70 49 74 65 72 2d  pLeaf);.  pIter-
c0d0: 3e 69 4c 65 61 66 50 67 6e 6f 2b 2b 3b 0a 20 20  >iLeafPgno++;.  
c0e0: 69 66 28 20 70 49 74 65 72 2d 3e 70 4e 65 78 74  if( pIter->pNext
c0f0: 4c 65 61 66 20 29 7b 0a 20 20 20 20 70 49 74 65  Leaf ){.    pIte
c100: 72 2d 3e 70 4c 65 61 66 20 3d 20 70 49 74 65 72  r->pLeaf = pIter
c110: 2d 3e 70 4e 65 78 74 4c 65 61 66 3b 0a 20 20 20  ->pNextLeaf;.   
c120: 20 70 49 74 65 72 2d 3e 70 4e 65 78 74 4c 65 61   pIter->pNextLea
c130: 66 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 20 69  f = 0;.  }else i
c140: 66 28 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 50  f( pIter->iLeafP
c150: 67 6e 6f 3c 3d 70 53 65 67 2d 3e 70 67 6e 6f 4c  gno<=pSeg->pgnoL
c160: 61 73 74 20 29 7b 0a 20 20 20 20 70 49 74 65 72  ast ){.    pIter
c170: 2d 3e 70 4c 65 61 66 20 3d 20 66 74 73 35 4c 65  ->pLeaf = fts5Le
c180: 61 66 52 65 61 64 28 70 2c 20 0a 20 20 20 20 20  afRead(p, .     
c190: 20 20 20 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f     FTS5_SEGMENT_
c1a0: 52 4f 57 49 44 28 70 53 65 67 2d 3e 69 53 65 67  ROWID(pSeg->iSeg
c1b0: 69 64 2c 20 70 49 74 65 72 2d 3e 69 4c 65 61 66  id, pIter->iLeaf
c1c0: 50 67 6e 6f 29 0a 20 20 20 20 29 3b 0a 20 20 7d  Pgno).    );.  }
c1d0: 65 6c 73 65 7b 0a 20 20 20 20 70 49 74 65 72 2d  else{.    pIter-
c1e0: 3e 70 4c 65 61 66 20 3d 20 30 3b 0a 20 20 7d 0a  >pLeaf = 0;.  }.
c1f0: 20 20 70 4c 65 61 66 20 3d 20 70 49 74 65 72 2d    pLeaf = pIter-
c200: 3e 70 4c 65 61 66 3b 0a 0a 20 20 69 66 28 20 70  >pLeaf;..  if( p
c210: 4c 65 61 66 20 29 7b 0a 20 20 20 20 70 49 74 65  Leaf ){.    pIte
c220: 72 2d 3e 69 50 67 69 64 78 4f 66 66 20 3d 20 70  r->iPgidxOff = p
c230: 4c 65 61 66 2d 3e 73 7a 4c 65 61 66 3b 0a 20 20  Leaf->szLeaf;.  
c240: 20 20 69 66 28 20 66 74 73 35 4c 65 61 66 49 73    if( fts5LeafIs
c250: 54 65 72 6d 6c 65 73 73 28 70 4c 65 61 66 29 20  Termless(pLeaf) 
c260: 29 7b 0a 20 20 20 20 20 20 70 49 74 65 72 2d 3e  ){.      pIter->
c270: 69 45 6e 64 6f 66 44 6f 63 6c 69 73 74 20 3d 20  iEndofDoclist = 
c280: 70 4c 65 61 66 2d 3e 6e 6e 2b 31 3b 0a 20 20 20  pLeaf->nn+1;.   
c290: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 49   }else{.      pI
c2a0: 74 65 72 2d 3e 69 50 67 69 64 78 4f 66 66 20 2b  ter->iPgidxOff +
c2b0: 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e 74 33  = fts5GetVarint3
c2c0: 32 28 26 70 4c 65 61 66 2d 3e 70 5b 70 49 74 65  2(&pLeaf->p[pIte
c2d0: 72 2d 3e 69 50 67 69 64 78 4f 66 66 5d 2c 0a 20  r->iPgidxOff],. 
c2e0: 20 20 20 20 20 20 20 20 20 70 49 74 65 72 2d 3e           pIter->
c2f0: 69 45 6e 64 6f 66 44 6f 63 6c 69 73 74 0a 20 20  iEndofDoclist.  
c300: 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d      );.    }.  }
c310: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 72 67 75 6d 65  .}../*.** Argume
c320: 6e 74 20 70 20 70 6f 69 6e 74 73 20 74 6f 20 61  nt p points to a
c330: 20 62 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69   buffer containi
c340: 6e 67 20 61 20 76 61 72 69 6e 74 20 74 6f 20 62  ng a varint to b
c350: 65 20 69 6e 74 65 72 70 72 65 74 65 64 20 61 73  e interpreted as
c360: 20 61 0a 2a 2a 20 70 6f 73 69 74 69 6f 6e 20 6c   a.** position l
c370: 69 73 74 20 73 69 7a 65 20 66 69 65 6c 64 2e 20  ist size field. 
c380: 52 65 61 64 20 74 68 65 20 76 61 72 69 6e 74 20  Read the varint 
c390: 61 6e 64 20 72 65 74 75 72 6e 20 74 68 65 20 6e  and return the n
c3a0: 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 0a 2a  umber of bytes.*
c3b0: 2a 20 72 65 61 64 2e 20 42 65 66 6f 72 65 20 72  * read. Before r
c3c0: 65 74 75 72 6e 69 6e 67 2c 20 73 65 74 20 2a 70  eturning, set *p
c3d0: 6e 53 7a 20 74 6f 20 74 68 65 20 6e 75 6d 62 65  nSz to the numbe
c3e0: 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20 74 68  r of bytes in th
c3f0: 65 20 70 6f 73 69 74 69 6f 6e 0a 2a 2a 20 6c 69  e position.** li
c400: 73 74 2c 20 61 6e 64 20 2a 70 62 44 65 6c 20 74  st, and *pbDel t
c410: 6f 20 74 72 75 65 20 69 66 20 74 68 65 20 64 65  o true if the de
c420: 6c 65 74 65 20 66 6c 61 67 20 69 73 20 73 65 74  lete flag is set
c430: 2c 20 6f 72 20 66 61 6c 73 65 20 6f 74 68 65 72  , or false other
c440: 77 69 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  wise..*/.static 
c450: 69 6e 74 20 66 74 73 35 47 65 74 50 6f 73 6c 69  int fts5GetPosli
c460: 73 74 53 69 7a 65 28 63 6f 6e 73 74 20 75 38 20  stSize(const u8 
c470: 2a 70 2c 20 69 6e 74 20 2a 70 6e 53 7a 2c 20 69  *p, int *pnSz, i
c480: 6e 74 20 2a 70 62 44 65 6c 29 7b 0a 20 20 69 6e  nt *pbDel){.  in
c490: 74 20 6e 53 7a 3b 0a 20 20 69 6e 74 20 6e 20 3d  t nSz;.  int n =
c4a0: 20 30 3b 0a 20 20 66 74 73 35 46 61 73 74 47 65   0;.  fts5FastGe
c4b0: 74 56 61 72 69 6e 74 33 32 28 70 2c 20 6e 2c 20  tVarint32(p, n, 
c4c0: 6e 53 7a 29 3b 0a 20 20 61 73 73 65 72 74 5f 6e  nSz);.  assert_n
c4d0: 63 28 20 6e 53 7a 3e 3d 30 20 29 3b 0a 20 20 2a  c( nSz>=0 );.  *
c4e0: 70 6e 53 7a 20 3d 20 6e 53 7a 2f 32 3b 0a 20 20  pnSz = nSz/2;.  
c4f0: 2a 70 62 44 65 6c 20 3d 20 6e 53 7a 20 26 20 30  *pbDel = nSz & 0
c500: 78 30 30 30 31 3b 0a 20 20 72 65 74 75 72 6e 20  x0001;.  return 
c510: 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 74 73 35  n;.}../*.** Fts5
c520: 53 65 67 49 74 65 72 2e 69 4c 65 61 66 4f 66 66  SegIter.iLeafOff
c530: 73 65 74 20 63 75 72 72 65 6e 74 6c 79 20 70 6f  set currently po
c540: 69 6e 74 73 20 74 6f 20 74 68 65 20 66 69 72 73  ints to the firs
c550: 74 20 62 79 74 65 20 6f 66 20 61 0a 2a 2a 20 70  t byte of a.** p
c560: 6f 73 69 74 69 6f 6e 2d 6c 69 73 74 20 73 69 7a  osition-list siz
c570: 65 20 66 69 65 6c 64 2e 20 52 65 61 64 20 74 68  e field. Read th
c580: 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 66  e value of the f
c590: 69 65 6c 64 20 61 6e 64 20 73 74 6f 72 65 20 69  ield and store i
c5a0: 74 0a 2a 2a 20 69 6e 20 74 68 65 20 66 6f 6c 6c  t.** in the foll
c5b0: 6f 77 69 6e 67 20 76 61 72 69 61 62 6c 65 73 3a  owing variables:
c5c0: 0a 2a 2a 0a 2a 2a 20 20 20 46 74 73 35 53 65 67  .**.**   Fts5Seg
c5d0: 49 74 65 72 2e 6e 50 6f 73 0a 2a 2a 20 20 20 46  Iter.nPos.**   F
c5e0: 74 73 35 53 65 67 49 74 65 72 2e 62 44 65 6c 0a  ts5SegIter.bDel.
c5f0: 2a 2a 0a 2a 2a 20 4c 65 61 76 65 20 46 74 73 35  **.** Leave Fts5
c600: 53 65 67 49 74 65 72 2e 69 4c 65 61 66 4f 66 66  SegIter.iLeafOff
c610: 73 65 74 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20  set pointing to 
c620: 74 68 65 20 66 69 72 73 74 20 62 79 74 65 20 6f  the first byte o
c630: 66 20 74 68 65 20 0a 2a 2a 20 70 6f 73 69 74 69  f the .** positi
c640: 6f 6e 20 6c 69 73 74 20 63 6f 6e 74 65 6e 74 20  on list content 
c650: 28 69 66 20 61 6e 79 29 2e 0a 2a 2f 0a 73 74 61  (if any)..*/.sta
c660: 74 69 63 20 76 6f 69 64 20 66 74 73 35 53 65 67  tic void fts5Seg
c670: 49 74 65 72 4c 6f 61 64 4e 50 6f 73 28 46 74 73  IterLoadNPos(Fts
c680: 35 49 6e 64 65 78 20 2a 70 2c 20 46 74 73 35 53  5Index *p, Fts5S
c690: 65 67 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a  egIter *pIter){.
c6a0: 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c    if( p->rc==SQL
c6b0: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 6e  ITE_OK ){.    in
c6c0: 74 20 69 4f 66 66 20 3d 20 70 49 74 65 72 2d 3e  t iOff = pIter->
c6d0: 69 4c 65 61 66 4f 66 66 73 65 74 3b 20 20 2f 2a  iLeafOffset;  /*
c6e0: 20 4f 66 66 73 65 74 20 74 6f 20 72 65 61 64 20   Offset to read 
c6f0: 61 74 20 2a 2f 0a 20 20 20 20 41 53 53 45 52 54  at */.    ASSERT
c700: 5f 53 5a 4c 45 41 46 5f 4f 4b 28 70 49 74 65 72  _SZLEAF_OK(pIter
c710: 2d 3e 70 4c 65 61 66 29 3b 0a 20 20 20 20 69 66  ->pLeaf);.    if
c720: 28 20 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e 65 44  ( p->pConfig->eD
c730: 65 74 61 69 6c 3d 3d 46 54 53 35 5f 44 45 54 41  etail==FTS5_DETA
c740: 49 4c 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 20  IL_NONE ){.     
c750: 20 69 6e 74 20 69 45 6f 64 20 3d 20 4d 49 4e 28   int iEod = MIN(
c760: 70 49 74 65 72 2d 3e 69 45 6e 64 6f 66 44 6f 63  pIter->iEndofDoc
c770: 6c 69 73 74 2c 20 70 49 74 65 72 2d 3e 70 4c 65  list, pIter->pLe
c780: 61 66 2d 3e 73 7a 4c 65 61 66 29 3b 0a 20 20 20  af->szLeaf);.   
c790: 20 20 20 70 49 74 65 72 2d 3e 62 44 65 6c 20 3d     pIter->bDel =
c7a0: 20 30 3b 0a 20 20 20 20 20 20 70 49 74 65 72 2d   0;.      pIter-
c7b0: 3e 6e 50 6f 73 20 3d 20 31 3b 0a 20 20 20 20 20  >nPos = 1;.     
c7c0: 20 69 66 28 20 69 4f 66 66 3c 69 45 6f 64 20 26   if( iOff<iEod &
c7d0: 26 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e  & pIter->pLeaf->
c7e0: 70 5b 69 4f 66 66 5d 3d 3d 30 20 29 7b 0a 20 20  p[iOff]==0 ){.  
c7f0: 20 20 20 20 20 20 70 49 74 65 72 2d 3e 62 44 65        pIter->bDe
c800: 6c 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 69  l = 1;.        i
c810: 4f 66 66 2b 2b 3b 0a 20 20 20 20 20 20 20 20 69  Off++;.        i
c820: 66 28 20 69 4f 66 66 3c 69 45 6f 64 20 26 26 20  f( iOff<iEod && 
c830: 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 70 5b  pIter->pLeaf->p[
c840: 69 4f 66 66 5d 3d 3d 30 20 29 7b 0a 20 20 20 20  iOff]==0 ){.    
c850: 20 20 20 20 20 20 70 49 74 65 72 2d 3e 6e 50 6f        pIter->nPo
c860: 73 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20  s = 1;.         
c870: 20 69 4f 66 66 2b 2b 3b 0a 20 20 20 20 20 20 20   iOff++;.       
c880: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
c890: 20 20 70 49 74 65 72 2d 3e 6e 50 6f 73 20 3d 20    pIter->nPos = 
c8a0: 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  0;.        }.   
c8b0: 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a     }.    }else{.
c8c0: 20 20 20 20 20 20 69 6e 74 20 6e 53 7a 3b 0a 20        int nSz;. 
c8d0: 20 20 20 20 20 66 74 73 35 46 61 73 74 47 65 74       fts5FastGet
c8e0: 56 61 72 69 6e 74 33 32 28 70 49 74 65 72 2d 3e  Varint32(pIter->
c8f0: 70 4c 65 61 66 2d 3e 70 2c 20 69 4f 66 66 2c 20  pLeaf->p, iOff, 
c900: 6e 53 7a 29 3b 0a 20 20 20 20 20 20 70 49 74 65  nSz);.      pIte
c910: 72 2d 3e 62 44 65 6c 20 3d 20 28 6e 53 7a 20 26  r->bDel = (nSz &
c920: 20 30 78 30 30 30 31 29 3b 0a 20 20 20 20 20 20   0x0001);.      
c930: 70 49 74 65 72 2d 3e 6e 50 6f 73 20 3d 20 6e 53  pIter->nPos = nS
c940: 7a 3e 3e 31 3b 0a 20 20 20 20 20 20 61 73 73 65  z>>1;.      asse
c950: 72 74 5f 6e 63 28 20 70 49 74 65 72 2d 3e 6e 50  rt_nc( pIter->nP
c960: 6f 73 3e 3d 30 20 29 3b 0a 20 20 20 20 7d 0a 20  os>=0 );.    }. 
c970: 20 20 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f     pIter->iLeafO
c980: 66 66 73 65 74 20 3d 20 69 4f 66 66 3b 0a 20 20  ffset = iOff;.  
c990: 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64  }.}..static void
c9a0: 20 66 74 73 35 53 65 67 49 74 65 72 4c 6f 61 64   fts5SegIterLoad
c9b0: 52 6f 77 69 64 28 46 74 73 35 49 6e 64 65 78 20  Rowid(Fts5Index 
c9c0: 2a 70 2c 20 46 74 73 35 53 65 67 49 74 65 72 20  *p, Fts5SegIter 
c9d0: 2a 70 49 74 65 72 29 7b 0a 20 20 75 38 20 2a 61  *pIter){.  u8 *a
c9e0: 20 3d 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d   = pIter->pLeaf-
c9f0: 3e 70 3b 20 20 20 20 20 20 20 20 2f 2a 20 42 75  >p;        /* Bu
ca00: 66 66 65 72 20 74 6f 20 72 65 61 64 20 64 61 74  ffer to read dat
ca10: 61 20 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20  a from */.  int 
ca20: 69 4f 66 66 20 3d 20 70 49 74 65 72 2d 3e 69 4c  iOff = pIter->iL
ca30: 65 61 66 4f 66 66 73 65 74 3b 0a 0a 20 20 41 53  eafOffset;..  AS
ca40: 53 45 52 54 5f 53 5a 4c 45 41 46 5f 4f 4b 28 70  SERT_SZLEAF_OK(p
ca50: 49 74 65 72 2d 3e 70 4c 65 61 66 29 3b 0a 20 20  Iter->pLeaf);.  
ca60: 69 66 28 20 69 4f 66 66 3e 3d 70 49 74 65 72 2d  if( iOff>=pIter-
ca70: 3e 70 4c 65 61 66 2d 3e 73 7a 4c 65 61 66 20 29  >pLeaf->szLeaf )
ca80: 7b 0a 20 20 20 20 66 74 73 35 53 65 67 49 74 65  {.    fts5SegIte
ca90: 72 4e 65 78 74 50 61 67 65 28 70 2c 20 70 49 74  rNextPage(p, pIt
caa0: 65 72 29 3b 0a 20 20 20 20 69 66 28 20 70 49 74  er);.    if( pIt
cab0: 65 72 2d 3e 70 4c 65 61 66 3d 3d 30 20 29 7b 0a  er->pLeaf==0 ){.
cac0: 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d        if( p->rc=
cad0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 70 2d 3e  =SQLITE_OK ) p->
cae0: 72 63 20 3d 20 46 54 53 35 5f 43 4f 52 52 55 50  rc = FTS5_CORRUP
caf0: 54 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b  T;.      return;
cb00: 0a 20 20 20 20 7d 0a 20 20 20 20 69 4f 66 66 20  .    }.    iOff 
cb10: 3d 20 34 3b 0a 20 20 20 20 61 20 3d 20 70 49 74  = 4;.    a = pIt
cb20: 65 72 2d 3e 70 4c 65 61 66 2d 3e 70 3b 0a 20 20  er->pLeaf->p;.  
cb30: 7d 0a 20 20 69 4f 66 66 20 2b 3d 20 73 71 6c 69  }.  iOff += sqli
cb40: 74 65 33 46 74 73 35 47 65 74 56 61 72 69 6e 74  te3Fts5GetVarint
cb50: 28 26 61 5b 69 4f 66 66 5d 2c 20 28 75 36 34 2a  (&a[iOff], (u64*
cb60: 29 26 70 49 74 65 72 2d 3e 69 52 6f 77 69 64 29  )&pIter->iRowid)
cb70: 3b 0a 20 20 70 49 74 65 72 2d 3e 69 4c 65 61 66  ;.  pIter->iLeaf
cb80: 4f 66 66 73 65 74 20 3d 20 69 4f 66 66 3b 0a 7d  Offset = iOff;.}
cb90: 0a 0a 2f 2a 0a 2a 2a 20 46 74 73 35 53 65 67 49  ../*.** Fts5SegI
cba0: 74 65 72 2e 69 4c 65 61 66 4f 66 66 73 65 74 20  ter.iLeafOffset 
cbb0: 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 73  currently points
cbc0: 20 74 6f 20 74 68 65 20 66 69 72 73 74 20 62 79   to the first by
cbd0: 74 65 20 6f 66 20 74 68 65 20 0a 2a 2a 20 22 6e  te of the .** "n
cbe0: 53 75 66 66 69 78 22 20 66 69 65 6c 64 20 6f 66  Suffix" field of
cbf0: 20 61 20 74 65 72 6d 2e 20 46 75 6e 63 74 69 6f   a term. Functio
cc00: 6e 20 70 61 72 61 6d 65 74 65 72 20 6e 4b 65 65  n parameter nKee
cc10: 70 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 76  p contains the v
cc20: 61 6c 75 65 0a 2a 2a 20 6f 66 20 74 68 65 20 22  alue.** of the "
cc30: 6e 50 72 65 66 69 78 22 20 66 69 65 6c 64 20 28  nPrefix" field (
cc40: 69 66 20 74 68 65 72 65 20 77 61 73 20 6f 6e 65  if there was one
cc50: 20 2d 20 69 74 20 69 73 20 70 61 73 73 65 64 20   - it is passed 
cc60: 30 20 69 66 20 74 68 69 73 20 69 73 0a 2a 2a 20  0 if this is.** 
cc70: 74 68 65 20 66 69 72 73 74 20 74 65 72 6d 20 69  the first term i
cc80: 6e 20 74 68 65 20 73 65 67 6d 65 6e 74 29 2e 0a  n the segment)..
cc90: 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  **.** This funct
cca0: 69 6f 6e 20 70 6f 70 75 6c 61 74 65 73 3a 0a 2a  ion populates:.*
ccb0: 2a 0a 2a 2a 20 20 20 46 74 73 35 53 65 67 49 74  *.**   Fts5SegIt
ccc0: 65 72 2e 74 65 72 6d 0a 2a 2a 20 20 20 46 74 73  er.term.**   Fts
ccd0: 35 53 65 67 49 74 65 72 2e 72 6f 77 69 64 0a 2a  5SegIter.rowid.*
cce0: 2a 0a 2a 2a 20 61 63 63 6f 72 64 69 6e 67 6c 79  *.** accordingly
ccf0: 20 61 6e 64 20 6c 65 61 76 65 73 20 28 46 74 73   and leaves (Fts
cd00: 35 53 65 67 49 74 65 72 2e 69 4c 65 61 66 4f 66  5SegIter.iLeafOf
cd10: 66 73 65 74 29 20 73 65 74 20 74 6f 20 74 68 65  fset) set to the
cd20: 20 63 6f 6e 74 65 6e 74 20 6f 66 0a 2a 2a 20 74   content of.** t
cd30: 68 65 20 66 69 72 73 74 20 70 6f 73 69 74 69 6f  he first positio
cd40: 6e 20 6c 69 73 74 2e 20 54 68 65 20 70 6f 73 69  n list. The posi
cd50: 74 69 6f 6e 20 6c 69 73 74 20 62 65 6c 6f 6e 67  tion list belong
cd60: 69 6e 67 20 74 6f 20 64 6f 63 75 6d 65 6e 74 20  ing to document 
cd70: 0a 2a 2a 20 28 46 74 73 35 53 65 67 49 74 65 72  .** (Fts5SegIter
cd80: 2e 69 52 6f 77 69 64 29 2e 0a 2a 2f 0a 73 74 61  .iRowid)..*/.sta
cd90: 74 69 63 20 76 6f 69 64 20 66 74 73 35 53 65 67  tic void fts5Seg
cda0: 49 74 65 72 4c 6f 61 64 54 65 72 6d 28 46 74 73  IterLoadTerm(Fts
cdb0: 35 49 6e 64 65 78 20 2a 70 2c 20 46 74 73 35 53  5Index *p, Fts5S
cdc0: 65 67 49 74 65 72 20 2a 70 49 74 65 72 2c 20 69  egIter *pIter, i
cdd0: 6e 74 20 6e 4b 65 65 70 29 7b 0a 20 20 75 38 20  nt nKeep){.  u8 
cde0: 2a 61 20 3d 20 70 49 74 65 72 2d 3e 70 4c 65 61  *a = pIter->pLea
cdf0: 66 2d 3e 70 3b 20 20 20 20 20 20 20 20 2f 2a 20  f->p;        /* 
ce00: 42 75 66 66 65 72 20 74 6f 20 72 65 61 64 20 64  Buffer to read d
ce10: 61 74 61 20 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e  ata from */.  in
ce20: 74 20 69 4f 66 66 20 3d 20 70 49 74 65 72 2d 3e  t iOff = pIter->
ce30: 69 4c 65 61 66 4f 66 66 73 65 74 3b 20 20 2f 2a  iLeafOffset;  /*
ce40: 20 4f 66 66 73 65 74 20 74 6f 20 72 65 61 64 20   Offset to read 
ce50: 61 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 4e 65 77  at */.  int nNew
ce60: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
ce70: 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73          /* Bytes
ce80: 20 6f 66 20 6e 65 77 20 64 61 74 61 20 2a 2f 0a   of new data */.
ce90: 0a 20 20 69 4f 66 66 20 2b 3d 20 66 74 73 35 47  .  iOff += fts5G
cea0: 65 74 56 61 72 69 6e 74 33 32 28 26 61 5b 69 4f  etVarint32(&a[iO
ceb0: 66 66 5d 2c 20 6e 4e 65 77 29 3b 0a 20 20 69 66  ff], nNew);.  if
cec0: 28 20 69 4f 66 66 2b 6e 4e 65 77 3e 70 49 74 65  ( iOff+nNew>pIte
ced0: 72 2d 3e 70 4c 65 61 66 2d 3e 6e 6e 20 29 7b 0a  r->pLeaf->nn ){.
cee0: 20 20 20 20 70 2d 3e 72 63 20 3d 20 46 54 53 35      p->rc = FTS5
cef0: 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20 20 72 65  _CORRUPT;.    re
cf00: 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 70 49 74 65  turn;.  }.  pIte
cf10: 72 2d 3e 74 65 72 6d 2e 6e 20 3d 20 6e 4b 65 65  r->term.n = nKee
cf20: 70 3b 0a 20 20 66 74 73 35 42 75 66 66 65 72 41  p;.  fts5BufferA
cf30: 70 70 65 6e 64 42 6c 6f 62 28 26 70 2d 3e 72 63  ppendBlob(&p->rc
cf40: 2c 20 26 70 49 74 65 72 2d 3e 74 65 72 6d 2c 20  , &pIter->term, 
cf50: 6e 4e 65 77 2c 20 26 61 5b 69 4f 66 66 5d 29 3b  nNew, &a[iOff]);
cf60: 0a 20 20 69 4f 66 66 20 2b 3d 20 6e 4e 65 77 3b  .  iOff += nNew;
cf70: 0a 20 20 70 49 74 65 72 2d 3e 69 54 65 72 6d 4c  .  pIter->iTermL
cf80: 65 61 66 4f 66 66 73 65 74 20 3d 20 69 4f 66 66  eafOffset = iOff
cf90: 3b 0a 20 20 70 49 74 65 72 2d 3e 69 54 65 72 6d  ;.  pIter->iTerm
cfa0: 4c 65 61 66 50 67 6e 6f 20 3d 20 70 49 74 65 72  LeafPgno = pIter
cfb0: 2d 3e 69 4c 65 61 66 50 67 6e 6f 3b 0a 20 20 70  ->iLeafPgno;.  p
cfc0: 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65  Iter->iLeafOffse
cfd0: 74 20 3d 20 69 4f 66 66 3b 0a 0a 20 20 69 66 28  t = iOff;..  if(
cfe0: 20 70 49 74 65 72 2d 3e 69 50 67 69 64 78 4f 66   pIter->iPgidxOf
cff0: 66 3e 3d 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d  f>=pIter->pLeaf-
d000: 3e 6e 6e 20 29 7b 0a 20 20 20 20 70 49 74 65 72  >nn ){.    pIter
d010: 2d 3e 69 45 6e 64 6f 66 44 6f 63 6c 69 73 74 20  ->iEndofDoclist 
d020: 3d 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e  = pIter->pLeaf->
d030: 6e 6e 2b 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  nn+1;.  }else{. 
d040: 20 20 20 69 6e 74 20 6e 45 78 74 72 61 3b 0a 20     int nExtra;. 
d050: 20 20 20 70 49 74 65 72 2d 3e 69 50 67 69 64 78     pIter->iPgidx
d060: 4f 66 66 20 2b 3d 20 66 74 73 35 47 65 74 56 61  Off += fts5GetVa
d070: 72 69 6e 74 33 32 28 26 61 5b 70 49 74 65 72 2d  rint32(&a[pIter-
d080: 3e 69 50 67 69 64 78 4f 66 66 5d 2c 20 6e 45 78  >iPgidxOff], nEx
d090: 74 72 61 29 3b 0a 20 20 20 20 70 49 74 65 72 2d  tra);.    pIter-
d0a0: 3e 69 45 6e 64 6f 66 44 6f 63 6c 69 73 74 20 2b  >iEndofDoclist +
d0b0: 3d 20 6e 45 78 74 72 61 3b 0a 20 20 7d 0a 0a 20  = nExtra;.  }.. 
d0c0: 20 66 74 73 35 53 65 67 49 74 65 72 4c 6f 61 64   fts5SegIterLoad
d0d0: 52 6f 77 69 64 28 70 2c 20 70 49 74 65 72 29 3b  Rowid(p, pIter);
d0e0: 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .}..static void 
d0f0: 66 74 73 35 53 65 67 49 74 65 72 4e 65 78 74 28  fts5SegIterNext(
d100: 46 74 73 35 49 6e 64 65 78 2a 2c 20 46 74 73 35  Fts5Index*, Fts5
d110: 53 65 67 49 74 65 72 2a 2c 20 69 6e 74 2a 29 3b  SegIter*, int*);
d120: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
d130: 35 53 65 67 49 74 65 72 4e 65 78 74 5f 52 65 76  5SegIterNext_Rev
d140: 65 72 73 65 28 46 74 73 35 49 6e 64 65 78 2a 2c  erse(Fts5Index*,
d150: 20 46 74 73 35 53 65 67 49 74 65 72 2a 2c 20 69   Fts5SegIter*, i
d160: 6e 74 2a 29 3b 0a 73 74 61 74 69 63 20 76 6f 69  nt*);.static voi
d170: 64 20 66 74 73 35 53 65 67 49 74 65 72 4e 65 78  d fts5SegIterNex
d180: 74 5f 4e 6f 6e 65 28 46 74 73 35 49 6e 64 65 78  t_None(Fts5Index
d190: 2a 2c 20 46 74 73 35 53 65 67 49 74 65 72 2a 2c  *, Fts5SegIter*,
d1a0: 20 69 6e 74 2a 29 3b 0a 0a 73 74 61 74 69 63 20   int*);..static 
d1b0: 76 6f 69 64 20 66 74 73 35 53 65 67 49 74 65 72  void fts5SegIter
d1c0: 53 65 74 4e 65 78 74 28 46 74 73 35 49 6e 64 65  SetNext(Fts5Inde
d1d0: 78 20 2a 70 2c 20 46 74 73 35 53 65 67 49 74 65  x *p, Fts5SegIte
d1e0: 72 20 2a 70 49 74 65 72 29 7b 0a 20 20 69 66 28  r *pIter){.  if(
d1f0: 20 70 49 74 65 72 2d 3e 66 6c 61 67 73 20 26 20   pIter->flags & 
d200: 46 54 53 35 5f 53 45 47 49 54 45 52 5f 52 45 56  FTS5_SEGITER_REV
d210: 45 52 53 45 20 29 7b 0a 20 20 20 20 70 49 74 65  ERSE ){.    pIte
d220: 72 2d 3e 78 4e 65 78 74 20 3d 20 66 74 73 35 53  r->xNext = fts5S
d230: 65 67 49 74 65 72 4e 65 78 74 5f 52 65 76 65 72  egIterNext_Rever
d240: 73 65 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  se;.  }else if( 
d250: 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e 65 44 65 74  p->pConfig->eDet
d260: 61 69 6c 3d 3d 46 54 53 35 5f 44 45 54 41 49 4c  ail==FTS5_DETAIL
d270: 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 70 49 74  _NONE ){.    pIt
d280: 65 72 2d 3e 78 4e 65 78 74 20 3d 20 66 74 73 35  er->xNext = fts5
d290: 53 65 67 49 74 65 72 4e 65 78 74 5f 4e 6f 6e 65  SegIterNext_None
d2a0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
d2b0: 49 74 65 72 2d 3e 78 4e 65 78 74 20 3d 20 66 74  Iter->xNext = ft
d2c0: 73 35 53 65 67 49 74 65 72 4e 65 78 74 3b 0a 20  s5SegIterNext;. 
d2d0: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74   }.}../*.** Init
d2e0: 69 61 6c 69 7a 65 20 74 68 65 20 69 74 65 72 61  ialize the itera
d2f0: 74 6f 72 20 6f 62 6a 65 63 74 20 70 49 74 65 72  tor object pIter
d300: 20 74 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f   to iterate thro
d310: 75 67 68 20 74 68 65 20 65 6e 74 72 69 65 73 20  ugh the entries 
d320: 69 6e 0a 2a 2a 20 73 65 67 6d 65 6e 74 20 70 53  in.** segment pS
d330: 65 67 2e 20 54 68 65 20 69 74 65 72 61 74 6f 72  eg. The iterator
d340: 20 69 73 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e   is left pointin
d350: 67 20 74 6f 20 74 68 65 20 66 69 72 73 74 20 65  g to the first e
d360: 6e 74 72 79 20 77 68 65 6e 20 0a 2a 2a 20 74 68  ntry when .** th
d370: 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75  is function retu
d380: 72 6e 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  rns..**.** If an
d390: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 46   error occurs, F
d3a0: 74 73 35 49 6e 64 65 78 2e 72 63 20 69 73 20 73  ts5Index.rc is s
d3b0: 65 74 20 74 6f 20 61 6e 20 61 70 70 72 6f 70 72  et to an appropr
d3c0: 69 61 74 65 20 65 72 72 6f 72 20 63 6f 64 65 2e  iate error code.
d3d0: 20 49 66 20 0a 2a 2a 20 61 6e 20 65 72 72 6f 72   If .** an error
d3e0: 20 68 61 73 20 61 6c 72 65 61 64 79 20 6f 63 63   has already occ
d3f0: 75 72 72 65 64 20 77 68 65 6e 20 74 68 69 73 20  urred when this 
d400: 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
d410: 65 64 2c 20 69 74 20 69 73 20 61 20 6e 6f 2d 6f  ed, it is a no-o
d420: 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  p..*/.static voi
d430: 64 20 66 74 73 35 53 65 67 49 74 65 72 49 6e 69  d fts5SegIterIni
d440: 74 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a  t(.  Fts5Index *
d450: 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
d460: 20 20 20 20 20 2f 2a 20 46 54 53 20 69 6e 64 65       /* FTS inde
d470: 78 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 46 74  x object */.  Ft
d480: 73 35 53 74 72 75 63 74 75 72 65 53 65 67 6d 65  s5StructureSegme
d490: 6e 74 20 2a 70 53 65 67 2c 20 20 20 20 20 2f 2a  nt *pSeg,     /*
d4a0: 20 44 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20   Description of 
d4b0: 73 65 67 6d 65 6e 74 20 2a 2f 0a 20 20 46 74 73  segment */.  Fts
d4c0: 35 53 65 67 49 74 65 72 20 2a 70 49 74 65 72 20  5SegIter *pIter 
d4d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
d4e0: 4f 62 6a 65 63 74 20 74 6f 20 70 6f 70 75 6c 61  Object to popula
d4f0: 74 65 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 70  te */.){.  if( p
d500: 53 65 67 2d 3e 70 67 6e 6f 46 69 72 73 74 3d 3d  Seg->pgnoFirst==
d510: 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73  0 ){.    /* This
d520: 20 68 61 70 70 65 6e 73 20 69 66 20 74 68 65 20   happens if the 
d530: 73 65 67 6d 65 6e 74 20 69 73 20 62 65 69 6e 67  segment is being
d540: 20 75 73 65 64 20 61 73 20 61 6e 20 69 6e 70 75   used as an inpu
d550: 74 20 74 6f 20 61 6e 20 69 6e 63 72 65 6d 65 6e  t to an incremen
d560: 74 61 6c 0a 20 20 20 20 2a 2a 20 6d 65 72 67 65  tal.    ** merge
d570: 20 61 6e 64 20 61 6c 6c 20 64 61 74 61 20 68 61   and all data ha
d580: 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 22  s already been "
d590: 74 72 69 6d 6d 65 64 22 2e 20 53 65 65 20 66 75  trimmed". See fu
d5a0: 6e 63 74 69 6f 6e 0a 20 20 20 20 2a 2a 20 66 74  nction.    ** ft
d5b0: 73 35 54 72 69 6d 53 65 67 6d 65 6e 74 73 28 29  s5TrimSegments()
d5c0: 20 66 6f 72 20 64 65 74 61 69 6c 73 2e 20 49 6e   for details. In
d5d0: 20 74 68 69 73 20 63 61 73 65 20 6c 65 61 76 65   this case leave
d5e0: 20 74 68 65 20 69 74 65 72 61 74 6f 72 20 65 6d   the iterator em
d5f0: 70 74 79 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20  pty..    ** The 
d600: 63 61 6c 6c 65 72 20 77 69 6c 6c 20 73 65 65 20  caller will see 
d610: 74 68 65 20 28 70 49 74 65 72 2d 3e 70 4c 65 61  the (pIter->pLea
d620: 66 3d 3d 30 29 20 61 6e 64 20 61 73 73 75 6d 65  f==0) and assume
d630: 20 74 68 65 20 69 74 65 72 61 74 6f 72 20 69 73   the iterator is
d640: 0a 20 20 20 20 2a 2a 20 61 74 20 45 4f 46 20 61  .    ** at EOF a
d650: 6c 72 65 61 64 79 2e 20 2a 2f 0a 20 20 20 20 61  lready. */.    a
d660: 73 73 65 72 74 28 20 70 49 74 65 72 2d 3e 70 4c  ssert( pIter->pL
d670: 65 61 66 3d 3d 30 20 29 3b 0a 20 20 20 20 72 65  eaf==0 );.    re
d680: 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  turn;.  }..  if(
d690: 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
d6a0: 4b 20 29 7b 0a 20 20 20 20 6d 65 6d 73 65 74 28  K ){.    memset(
d6b0: 70 49 74 65 72 2c 20 30 2c 20 73 69 7a 65 6f 66  pIter, 0, sizeof
d6c0: 28 2a 70 49 74 65 72 29 29 3b 0a 20 20 20 20 66  (*pIter));.    f
d6d0: 74 73 35 53 65 67 49 74 65 72 53 65 74 4e 65 78  ts5SegIterSetNex
d6e0: 74 28 70 2c 20 70 49 74 65 72 29 3b 0a 20 20 20  t(p, pIter);.   
d6f0: 20 70 49 74 65 72 2d 3e 70 53 65 67 20 3d 20 70   pIter->pSeg = p
d700: 53 65 67 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e  Seg;.    pIter->
d710: 69 4c 65 61 66 50 67 6e 6f 20 3d 20 70 53 65 67  iLeafPgno = pSeg
d720: 2d 3e 70 67 6e 6f 46 69 72 73 74 2d 31 3b 0a 20  ->pgnoFirst-1;. 
d730: 20 20 20 66 74 73 35 53 65 67 49 74 65 72 4e 65     fts5SegIterNe
d740: 78 74 50 61 67 65 28 70 2c 20 70 49 74 65 72 29  xtPage(p, pIter)
d750: 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 2d 3e  ;.  }..  if( p->
d760: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
d770: 0a 20 20 20 20 70 49 74 65 72 2d 3e 69 4c 65 61  .    pIter->iLea
d780: 66 4f 66 66 73 65 74 20 3d 20 34 3b 0a 20 20 20  fOffset = 4;.   
d790: 20 61 73 73 65 72 74 5f 6e 63 28 20 70 49 74 65   assert_nc( pIte
d7a0: 72 2d 3e 70 4c 65 61 66 2d 3e 6e 6e 3e 34 20 29  r->pLeaf->nn>4 )
d7b0: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 66 74  ;.    assert( ft
d7c0: 73 35 4c 65 61 66 46 69 72 73 74 54 65 72 6d 4f  s5LeafFirstTermO
d7d0: 66 66 28 70 49 74 65 72 2d 3e 70 4c 65 61 66 29  ff(pIter->pLeaf)
d7e0: 3d 3d 34 20 29 3b 0a 20 20 20 20 70 49 74 65 72  ==4 );.    pIter
d7f0: 2d 3e 69 50 67 69 64 78 4f 66 66 20 3d 20 70 49  ->iPgidxOff = pI
d800: 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 73 7a 4c 65  ter->pLeaf->szLe
d810: 61 66 2b 31 3b 0a 20 20 20 20 66 74 73 35 53 65  af+1;.    fts5Se
d820: 67 49 74 65 72 4c 6f 61 64 54 65 72 6d 28 70 2c  gIterLoadTerm(p,
d830: 20 70 49 74 65 72 2c 20 30 29 3b 0a 20 20 20 20   pIter, 0);.    
d840: 66 74 73 35 53 65 67 49 74 65 72 4c 6f 61 64 4e  fts5SegIterLoadN
d850: 50 6f 73 28 70 2c 20 70 49 74 65 72 29 3b 0a 20  Pos(p, pIter);. 
d860: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73   }.}../*.** This
d870: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 6f 6e 6c   function is onl
d880: 79 20 65 76 65 72 20 63 61 6c 6c 65 64 20 6f 6e  y ever called on
d890: 20 69 74 65 72 61 74 6f 72 73 20 63 72 65 61 74   iterators creat
d8a0: 65 64 20 62 79 20 63 61 6c 6c 73 20 74 6f 0a 2a  ed by calls to.*
d8b0: 2a 20 46 74 73 35 49 6e 64 65 78 51 75 65 72 79  * Fts5IndexQuery
d8c0: 28 29 20 77 69 74 68 20 74 68 65 20 46 54 53 35  () with the FTS5
d8d0: 49 4e 44 45 58 5f 51 55 45 52 59 5f 44 45 53 43  INDEX_QUERY_DESC
d8e0: 20 66 6c 61 67 20 73 65 74 2e 0a 2a 2a 0a 2a 2a   flag set..**.**
d8f0: 20 54 68 65 20 69 74 65 72 61 74 6f 72 20 69 73   The iterator is
d900: 20 69 6e 20 61 6e 20 75 6e 75 73 75 61 6c 20 73   in an unusual s
d910: 74 61 74 65 20 77 68 65 6e 20 74 68 69 73 20 66  tate when this f
d920: 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
d930: 64 3a 20 74 68 65 0a 2a 2a 20 46 74 73 35 53 65  d: the.** Fts5Se
d940: 67 49 74 65 72 2e 69 4c 65 61 66 4f 66 66 73 65  gIter.iLeafOffse
d950: 74 20 76 61 72 69 61 62 6c 65 20 69 73 20 73 65  t variable is se
d960: 74 20 74 6f 20 74 68 65 20 6f 66 66 73 65 74 20  t to the offset 
d970: 6f 66 20 74 68 65 20 73 74 61 72 74 20 6f 66 0a  of the start of.
d980: 2a 2a 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 2d  ** the position-
d990: 6c 69 73 74 20 73 69 7a 65 20 66 69 65 6c 64 20  list size field 
d9a0: 66 6f 72 20 74 68 65 20 66 69 72 73 74 20 72 65  for the first re
d9b0: 6c 65 76 61 6e 74 20 72 6f 77 69 64 20 6f 6e 20  levant rowid on 
d9c0: 74 68 65 20 70 61 67 65 2e 0a 2a 2a 20 46 74 73  the page..** Fts
d9d0: 35 53 65 67 49 74 65 72 2e 72 6f 77 69 64 20 69  5SegIter.rowid i
d9e0: 73 20 73 65 74 2c 20 62 75 74 20 6e 50 6f 73 20  s set, but nPos 
d9f0: 61 6e 64 20 62 44 65 6c 20 61 72 65 20 6e 6f 74  and bDel are not
da00: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ..**.** This fun
da10: 63 74 69 6f 6e 20 61 64 76 61 6e 63 65 73 20 74  ction advances t
da20: 68 65 20 69 74 65 72 61 74 6f 72 20 73 6f 20 74  he iterator so t
da30: 68 61 74 20 69 74 20 70 6f 69 6e 74 73 20 74 6f  hat it points to
da40: 20 74 68 65 20 6c 61 73 74 20 0a 2a 2a 20 72 65   the last .** re
da50: 6c 65 76 61 6e 74 20 72 6f 77 69 64 20 6f 6e 20  levant rowid on 
da60: 74 68 65 20 70 61 67 65 20 61 6e 64 2c 20 69 66  the page and, if
da70: 20 6e 65 63 65 73 73 61 72 79 2c 20 69 6e 69 74   necessary, init
da80: 69 61 6c 69 7a 65 73 20 74 68 65 20 0a 2a 2a 20  ializes the .** 
da90: 61 52 6f 77 69 64 4f 66 66 73 65 74 5b 5d 20 61  aRowidOffset[] a
daa0: 6e 64 20 69 52 6f 77 69 64 4f 66 66 73 65 74 20  nd iRowidOffset 
dab0: 76 61 72 69 61 62 6c 65 73 2e 20 41 74 20 74 68  variables. At th
dac0: 69 73 20 70 6f 69 6e 74 20 74 68 65 20 69 74 65  is point the ite
dad0: 72 61 74 6f 72 0a 2a 2a 20 69 73 20 69 6e 20 69  rator.** is in i
dae0: 74 73 20 72 65 67 75 6c 61 72 20 73 74 61 74 65  ts regular state
daf0: 20 2d 20 46 74 73 35 53 65 67 49 74 65 72 2e 69   - Fts5SegIter.i
db00: 4c 65 61 66 4f 66 66 73 65 74 20 70 6f 69 6e 74  LeafOffset point
db10: 73 20 74 6f 20 74 68 65 20 66 69 72 73 74 0a 2a  s to the first.*
db20: 2a 20 62 79 74 65 20 6f 66 20 74 68 65 20 70 6f  * byte of the po
db30: 73 69 74 69 6f 6e 20 6c 69 73 74 20 63 6f 6e 74  sition list cont
db40: 65 6e 74 20 61 73 73 6f 63 69 61 74 65 64 20 77  ent associated w
db50: 69 74 68 20 73 61 69 64 20 72 6f 77 69 64 2e 0a  ith said rowid..
db60: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
db70: 74 73 35 53 65 67 49 74 65 72 52 65 76 65 72 73  ts5SegIterRevers
db80: 65 49 6e 69 74 50 61 67 65 28 46 74 73 35 49 6e  eInitPage(Fts5In
db90: 64 65 78 20 2a 70 2c 20 46 74 73 35 53 65 67 49  dex *p, Fts5SegI
dba0: 74 65 72 20 2a 70 49 74 65 72 29 7b 0a 20 20 69  ter *pIter){.  i
dbb0: 6e 74 20 65 44 65 74 61 69 6c 20 3d 20 70 2d 3e  nt eDetail = p->
dbc0: 70 43 6f 6e 66 69 67 2d 3e 65 44 65 74 61 69 6c  pConfig->eDetail
dbd0: 3b 0a 20 20 69 6e 74 20 6e 20 3d 20 70 49 74 65  ;.  int n = pIte
dbe0: 72 2d 3e 70 4c 65 61 66 2d 3e 73 7a 4c 65 61 66  r->pLeaf->szLeaf
dbf0: 3b 0a 20 20 69 6e 74 20 69 20 3d 20 70 49 74 65  ;.  int i = pIte
dc00: 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 3b 0a  r->iLeafOffset;.
dc10: 20 20 75 38 20 2a 61 20 3d 20 70 49 74 65 72 2d    u8 *a = pIter-
dc20: 3e 70 4c 65 61 66 2d 3e 70 3b 0a 20 20 69 6e 74  >pLeaf->p;.  int
dc30: 20 69 52 6f 77 69 64 4f 66 66 73 65 74 20 3d 20   iRowidOffset = 
dc40: 30 3b 0a 0a 20 20 69 66 28 20 6e 3e 70 49 74 65  0;..  if( n>pIte
dc50: 72 2d 3e 69 45 6e 64 6f 66 44 6f 63 6c 69 73 74  r->iEndofDoclist
dc60: 20 29 7b 0a 20 20 20 20 6e 20 3d 20 70 49 74 65   ){.    n = pIte
dc70: 72 2d 3e 69 45 6e 64 6f 66 44 6f 63 6c 69 73 74  r->iEndofDoclist
dc80: 3b 0a 20 20 7d 0a 0a 20 20 41 53 53 45 52 54 5f  ;.  }..  ASSERT_
dc90: 53 5a 4c 45 41 46 5f 4f 4b 28 70 49 74 65 72 2d  SZLEAF_OK(pIter-
dca0: 3e 70 4c 65 61 66 29 3b 0a 20 20 77 68 69 6c 65  >pLeaf);.  while
dcb0: 28 20 31 20 29 7b 0a 20 20 20 20 69 36 34 20 69  ( 1 ){.    i64 i
dcc0: 44 65 6c 74 61 20 3d 20 30 3b 0a 0a 20 20 20 20  Delta = 0;..    
dcd0: 69 66 28 20 65 44 65 74 61 69 6c 3d 3d 46 54 53  if( eDetail==FTS
dce0: 35 5f 44 45 54 41 49 4c 5f 4e 4f 4e 45 20 29 7b  5_DETAIL_NONE ){
dcf0: 0a 20 20 20 20 20 20 2f 2a 20 74 6f 64 6f 20 2a  .      /* todo *
dd00: 2f 0a 20 20 20 20 20 20 69 66 28 20 69 3c 6e 20  /.      if( i<n 
dd10: 26 26 20 61 5b 69 5d 3d 3d 30 20 29 7b 0a 20 20  && a[i]==0 ){.  
dd20: 20 20 20 20 20 20 69 2b 2b 3b 0a 20 20 20 20 20        i++;.     
dd30: 20 20 20 69 66 28 20 69 3c 6e 20 26 26 20 61 5b     if( i<n && a[
dd40: 69 5d 3d 3d 30 20 29 20 69 2b 2b 3b 0a 20 20 20  i]==0 ) i++;.   
dd50: 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a     }.    }else{.
dd60: 20 20 20 20 20 20 69 6e 74 20 6e 50 6f 73 3b 0a        int nPos;.
dd70: 20 20 20 20 20 20 69 6e 74 20 62 44 75 6d 6d 79        int bDummy
dd80: 3b 0a 20 20 20 20 20 20 69 20 2b 3d 20 66 74 73  ;.      i += fts
dd90: 35 47 65 74 50 6f 73 6c 69 73 74 53 69 7a 65 28  5GetPoslistSize(
dda0: 26 61 5b 69 5d 2c 20 26 6e 50 6f 73 2c 20 26 62  &a[i], &nPos, &b
ddb0: 44 75 6d 6d 79 29 3b 0a 20 20 20 20 20 20 69 20  Dummy);.      i 
ddc0: 2b 3d 20 6e 50 6f 73 3b 0a 20 20 20 20 7d 0a 20  += nPos;.    }. 
ddd0: 20 20 20 69 66 28 20 69 3e 3d 6e 20 29 20 62 72     if( i>=n ) br
dde0: 65 61 6b 3b 0a 20 20 20 20 69 20 2b 3d 20 66 74  eak;.    i += ft
ddf0: 73 35 47 65 74 56 61 72 69 6e 74 28 26 61 5b 69  s5GetVarint(&a[i
de00: 5d 2c 20 28 75 36 34 2a 29 26 69 44 65 6c 74 61  ], (u64*)&iDelta
de10: 29 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 69 52  );.    pIter->iR
de20: 6f 77 69 64 20 2b 3d 20 69 44 65 6c 74 61 3b 0a  owid += iDelta;.
de30: 0a 20 20 20 20 2f 2a 20 49 66 20 6e 65 63 65 73  .    /* If neces
de40: 73 61 72 79 2c 20 67 72 6f 77 20 74 68 65 20 70  sary, grow the p
de50: 49 74 65 72 2d 3e 61 52 6f 77 69 64 4f 66 66 73  Iter->aRowidOffs
de60: 65 74 5b 5d 20 61 72 72 61 79 2e 20 2a 2f 0a 20  et[] array. */. 
de70: 20 20 20 69 66 28 20 69 52 6f 77 69 64 4f 66 66     if( iRowidOff
de80: 73 65 74 3e 3d 70 49 74 65 72 2d 3e 6e 52 6f 77  set>=pIter->nRow
de90: 69 64 4f 66 66 73 65 74 20 29 7b 0a 20 20 20 20  idOffset ){.    
dea0: 20 20 69 6e 74 20 6e 4e 65 77 20 3d 20 70 49 74    int nNew = pIt
deb0: 65 72 2d 3e 6e 52 6f 77 69 64 4f 66 66 73 65 74  er->nRowidOffset
dec0: 20 2b 20 38 3b 0a 20 20 20 20 20 20 69 6e 74 20   + 8;.      int 
ded0: 2a 61 4e 65 77 20 3d 20 28 69 6e 74 2a 29 73 71  *aNew = (int*)sq
dee0: 6c 69 74 65 33 5f 72 65 61 6c 6c 6f 63 28 70 49  lite3_realloc(pI
def0: 74 65 72 2d 3e 61 52 6f 77 69 64 4f 66 66 73 65  ter->aRowidOffse
df00: 74 2c 20 6e 4e 65 77 2a 73 69 7a 65 6f 66 28 69  t, nNew*sizeof(i
df10: 6e 74 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20  nt));.      if( 
df20: 61 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20  aNew==0 ){.     
df30: 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54     p->rc = SQLIT
df40: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20  E_NOMEM;.       
df50: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
df60: 20 20 20 20 20 20 70 49 74 65 72 2d 3e 61 52 6f        pIter->aRo
df70: 77 69 64 4f 66 66 73 65 74 20 3d 20 61 4e 65 77  widOffset = aNew
df80: 3b 0a 20 20 20 20 20 20 70 49 74 65 72 2d 3e 6e  ;.      pIter->n
df90: 52 6f 77 69 64 4f 66 66 73 65 74 20 3d 20 6e 4e  RowidOffset = nN
dfa0: 65 77 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70  ew;.    }..    p
dfb0: 49 74 65 72 2d 3e 61 52 6f 77 69 64 4f 66 66 73  Iter->aRowidOffs
dfc0: 65 74 5b 69 52 6f 77 69 64 4f 66 66 73 65 74 2b  et[iRowidOffset+
dfd0: 2b 5d 20 3d 20 70 49 74 65 72 2d 3e 69 4c 65 61  +] = pIter->iLea
dfe0: 66 4f 66 66 73 65 74 3b 0a 20 20 20 20 70 49 74  fOffset;.    pIt
dff0: 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 20  er->iLeafOffset 
e000: 3d 20 69 3b 0a 20 20 7d 0a 20 20 70 49 74 65 72  = i;.  }.  pIter
e010: 2d 3e 69 52 6f 77 69 64 4f 66 66 73 65 74 20 3d  ->iRowidOffset =
e020: 20 69 52 6f 77 69 64 4f 66 66 73 65 74 3b 0a 20   iRowidOffset;. 
e030: 20 66 74 73 35 53 65 67 49 74 65 72 4c 6f 61 64   fts5SegIterLoad
e040: 4e 50 6f 73 28 70 2c 20 70 49 74 65 72 29 3b 0a  NPos(p, pIter);.
e050: 7d 0a 0a 2f 2a 0a 2a 2a 0a 2a 2f 0a 73 74 61 74  }../*.**.*/.stat
e060: 69 63 20 76 6f 69 64 20 66 74 73 35 53 65 67 49  ic void fts5SegI
e070: 74 65 72 52 65 76 65 72 73 65 4e 65 77 50 61 67  terReverseNewPag
e080: 65 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20  e(Fts5Index *p, 
e090: 46 74 73 35 53 65 67 49 74 65 72 20 2a 70 49 74  Fts5SegIter *pIt
e0a0: 65 72 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70  er){.  assert( p
e0b0: 49 74 65 72 2d 3e 66 6c 61 67 73 20 26 20 46 54  Iter->flags & FT
e0c0: 53 35 5f 53 45 47 49 54 45 52 5f 52 45 56 45 52  S5_SEGITER_REVER
e0d0: 53 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  SE );.  assert( 
e0e0: 70 49 74 65 72 2d 3e 66 6c 61 67 73 20 26 20 46  pIter->flags & F
e0f0: 54 53 35 5f 53 45 47 49 54 45 52 5f 4f 4e 45 54  TS5_SEGITER_ONET
e100: 45 52 4d 20 29 3b 0a 0a 20 20 66 74 73 35 44 61  ERM );..  fts5Da
e110: 74 61 52 65 6c 65 61 73 65 28 70 49 74 65 72 2d  taRelease(pIter-
e120: 3e 70 4c 65 61 66 29 3b 0a 20 20 70 49 74 65 72  >pLeaf);.  pIter
e130: 2d 3e 70 4c 65 61 66 20 3d 20 30 3b 0a 20 20 77  ->pLeaf = 0;.  w
e140: 68 69 6c 65 28 20 70 2d 3e 72 63 3d 3d 53 51 4c  hile( p->rc==SQL
e150: 49 54 45 5f 4f 4b 20 26 26 20 70 49 74 65 72 2d  ITE_OK && pIter-
e160: 3e 69 4c 65 61 66 50 67 6e 6f 3e 70 49 74 65 72  >iLeafPgno>pIter
e170: 2d 3e 69 54 65 72 6d 4c 65 61 66 50 67 6e 6f 20  ->iTermLeafPgno 
e180: 29 7b 0a 20 20 20 20 46 74 73 35 44 61 74 61 20  ){.    Fts5Data 
e190: 2a 70 4e 65 77 3b 0a 20 20 20 20 70 49 74 65 72  *pNew;.    pIter
e1a0: 2d 3e 69 4c 65 61 66 50 67 6e 6f 2d 2d 3b 0a 20  ->iLeafPgno--;. 
e1b0: 20 20 20 70 4e 65 77 20 3d 20 66 74 73 35 44 61     pNew = fts5Da
e1c0: 74 61 52 65 61 64 28 70 2c 20 46 54 53 35 5f 53  taRead(p, FTS5_S
e1d0: 45 47 4d 45 4e 54 5f 52 4f 57 49 44 28 0a 20 20  EGMENT_ROWID(.  
e1e0: 20 20 20 20 20 20 20 20 70 49 74 65 72 2d 3e 70          pIter->p
e1f0: 53 65 67 2d 3e 69 53 65 67 69 64 2c 20 70 49 74  Seg->iSegid, pIt
e200: 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 0a 20 20  er->iLeafPgno.  
e210: 20 20 29 29 3b 0a 20 20 20 20 69 66 28 20 70 4e    ));.    if( pN
e220: 65 77 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 69  ew ){.      /* i
e230: 54 65 72 6d 4c 65 61 66 4f 66 66 73 65 74 20 6d  TermLeafOffset m
e240: 61 79 20 62 65 20 65 71 75 61 6c 20 74 6f 20 73  ay be equal to s
e250: 7a 4c 65 61 66 20 69 66 20 74 68 65 20 74 65 72  zLeaf if the ter
e260: 6d 20 69 73 20 74 68 65 20 6c 61 73 74 0a 20 20  m is the last.  
e270: 20 20 20 20 2a 2a 20 74 68 69 6e 67 20 6f 6e 20      ** thing on 
e280: 74 68 65 20 70 61 67 65 20 2d 20 69 2e 65 2e 20  the page - i.e. 
e290: 74 68 65 20 66 69 72 73 74 20 72 6f 77 69 64 20  the first rowid 
e2a0: 69 73 20 6f 6e 20 74 68 65 20 66 6f 6c 6c 6f 77  is on the follow
e2b0: 69 6e 67 20 70 61 67 65 2e 0a 20 20 20 20 20 20  ing page..      
e2c0: 2a 2a 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  ** In this case 
e2d0: 6c 65 61 76 65 20 70 49 74 65 72 2d 3e 70 4c 65  leave pIter->pLe
e2e0: 61 66 3d 3d 30 2c 20 74 68 69 73 20 69 74 65 72  af==0, this iter
e2f0: 61 74 6f 72 20 69 73 20 61 74 20 45 4f 46 2e 20  ator is at EOF. 
e300: 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 49 74  */.      if( pIt
e310: 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 3d 3d 70  er->iLeafPgno==p
e320: 49 74 65 72 2d 3e 69 54 65 72 6d 4c 65 61 66 50  Iter->iTermLeafP
e330: 67 6e 6f 20 29 7b 0a 20 20 20 20 20 20 20 20 61  gno ){.        a
e340: 73 73 65 72 74 28 20 70 49 74 65 72 2d 3e 70 4c  ssert( pIter->pL
e350: 65 61 66 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  eaf==0 );.      
e360: 20 20 69 66 28 20 70 49 74 65 72 2d 3e 69 54 65    if( pIter->iTe
e370: 72 6d 4c 65 61 66 4f 66 66 73 65 74 3c 70 4e 65  rmLeafOffset<pNe
e380: 77 2d 3e 73 7a 4c 65 61 66 20 29 7b 0a 20 20 20  w->szLeaf ){.   
e390: 20 20 20 20 20 20 20 70 49 74 65 72 2d 3e 70 4c         pIter->pL
e3a0: 65 61 66 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20  eaf = pNew;.    
e3b0: 20 20 20 20 20 20 70 49 74 65 72 2d 3e 69 4c 65        pIter->iLe
e3c0: 61 66 4f 66 66 73 65 74 20 3d 20 70 49 74 65 72  afOffset = pIter
e3d0: 2d 3e 69 54 65 72 6d 4c 65 61 66 4f 66 66 73 65  ->iTermLeafOffse
e3e0: 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  t;.        }.   
e3f0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
e400: 20 20 69 6e 74 20 69 52 6f 77 69 64 4f 66 66 3b    int iRowidOff;
e410: 0a 20 20 20 20 20 20 20 20 69 52 6f 77 69 64 4f  .        iRowidO
e420: 66 66 20 3d 20 66 74 73 35 4c 65 61 66 46 69 72  ff = fts5LeafFir
e430: 73 74 52 6f 77 69 64 4f 66 66 28 70 4e 65 77 29  stRowidOff(pNew)
e440: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 52  ;.        if( iR
e450: 6f 77 69 64 4f 66 66 20 29 7b 0a 20 20 20 20 20  owidOff ){.     
e460: 20 20 20 20 20 70 49 74 65 72 2d 3e 70 4c 65 61       pIter->pLea
e470: 66 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 20 20  f = pNew;.      
e480: 20 20 20 20 70 49 74 65 72 2d 3e 69 4c 65 61 66      pIter->iLeaf
e490: 4f 66 66 73 65 74 20 3d 20 69 52 6f 77 69 64 4f  Offset = iRowidO
e4a0: 66 66 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ff;.        }.  
e4b0: 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28      }..      if(
e4c0: 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 20 29 7b   pIter->pLeaf ){
e4d0: 0a 20 20 20 20 20 20 20 20 75 38 20 2a 61 20 3d  .        u8 *a =
e4e0: 20 26 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e   &pIter->pLeaf->
e4f0: 70 5b 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66  p[pIter->iLeafOf
e500: 66 73 65 74 5d 3b 0a 20 20 20 20 20 20 20 20 70  fset];.        p
e510: 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65  Iter->iLeafOffse
e520: 74 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69  t += fts5GetVari
e530: 6e 74 28 61 2c 20 28 75 36 34 2a 29 26 70 49 74  nt(a, (u64*)&pIt
e540: 65 72 2d 3e 69 52 6f 77 69 64 29 3b 0a 20 20 20  er->iRowid);.   
e550: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
e560: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
e570: 20 66 74 73 35 44 61 74 61 52 65 6c 65 61 73 65   fts5DataRelease
e580: 28 70 4e 65 77 29 3b 0a 20 20 20 20 20 20 7d 0a  (pNew);.      }.
e590: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28      }.  }..  if(
e5a0: 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 20 29 7b   pIter->pLeaf ){
e5b0: 0a 20 20 20 20 70 49 74 65 72 2d 3e 69 45 6e 64  .    pIter->iEnd
e5c0: 6f 66 44 6f 63 6c 69 73 74 20 3d 20 70 49 74 65  ofDoclist = pIte
e5d0: 72 2d 3e 70 4c 65 61 66 2d 3e 6e 6e 2b 31 3b 0a  r->pLeaf->nn+1;.
e5e0: 20 20 20 20 66 74 73 35 53 65 67 49 74 65 72 52      fts5SegIterR
e5f0: 65 76 65 72 73 65 49 6e 69 74 50 61 67 65 28 70  everseInitPage(p
e600: 2c 20 70 49 74 65 72 29 3b 0a 20 20 7d 0a 7d 0a  , pIter);.  }.}.
e610: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72  ./*.** Return tr
e620: 75 65 20 69 66 20 74 68 65 20 69 74 65 72 61 74  ue if the iterat
e630: 6f 72 20 70 61 73 73 65 64 20 61 73 20 74 68 65  or passed as the
e640: 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
e650: 20 63 75 72 72 65 6e 74 6c 79 0a 2a 2a 20 70 6f   currently.** po
e660: 69 6e 74 73 20 74 6f 20 61 20 64 65 6c 65 74 65  ints to a delete
e670: 20 6d 61 72 6b 65 72 2e 20 41 20 64 65 6c 65 74   marker. A delet
e680: 65 20 6d 61 72 6b 65 72 20 69 73 20 61 6e 20 65  e marker is an e
e690: 6e 74 72 79 20 77 69 74 68 20 61 20 30 20 62 79  ntry with a 0 by
e6a0: 74 65 0a 2a 2a 20 70 6f 73 69 74 69 6f 6e 2d 6c  te.** position-l
e6b0: 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ist..*/.static i
e6c0: 6e 74 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72  nt fts5MultiIter
e6d0: 49 73 45 6d 70 74 79 28 46 74 73 35 49 6e 64 65  IsEmpty(Fts5Inde
e6e0: 78 20 2a 70 2c 20 46 74 73 35 49 74 65 72 20 2a  x *p, Fts5Iter *
e6f0: 70 49 74 65 72 29 7b 0a 20 20 46 74 73 35 53 65  pIter){.  Fts5Se
e700: 67 49 74 65 72 20 2a 70 53 65 67 20 3d 20 26 70  gIter *pSeg = &p
e710: 49 74 65 72 2d 3e 61 53 65 67 5b 70 49 74 65 72  Iter->aSeg[pIter
e720: 2d 3e 61 46 69 72 73 74 5b 31 5d 2e 69 46 69 72  ->aFirst[1].iFir
e730: 73 74 5d 3b 0a 20 20 72 65 74 75 72 6e 20 28 70  st];.  return (p
e740: 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
e750: 26 26 20 70 53 65 67 2d 3e 70 4c 65 61 66 20 26  && pSeg->pLeaf &
e760: 26 20 70 53 65 67 2d 3e 6e 50 6f 73 3d 3d 30 29  & pSeg->nPos==0)
e770: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 76 61 6e  ;.}../*.** Advan
e780: 63 65 20 69 74 65 72 61 74 6f 72 20 70 49 74 65  ce iterator pIte
e790: 72 20 74 6f 20 74 68 65 20 6e 65 78 74 20 65 6e  r to the next en
e7a0: 74 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  try..**.** This 
e7b0: 76 65 72 73 69 6f 6e 20 6f 66 20 66 74 73 35 53  version of fts5S
e7c0: 65 67 49 74 65 72 4e 65 78 74 28 29 20 69 73 20  egIterNext() is 
e7d0: 6f 6e 6c 79 20 75 73 65 64 20 62 79 20 72 65 76  only used by rev
e7e0: 65 72 73 65 20 69 74 65 72 61 74 6f 72 73 2e 0a  erse iterators..
e7f0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
e800: 74 73 35 53 65 67 49 74 65 72 4e 65 78 74 5f 52  ts5SegIterNext_R
e810: 65 76 65 72 73 65 28 0a 20 20 46 74 73 35 49 6e  everse(.  Fts5In
e820: 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20 20  dex *p,         
e830: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53            /* FTS
e840: 35 20 62 61 63 6b 65 6e 64 20 6f 62 6a 65 63 74  5 backend object
e850: 20 2a 2f 0a 20 20 46 74 73 35 53 65 67 49 74 65   */.  Fts5SegIte
e860: 72 20 2a 70 49 74 65 72 2c 20 20 20 20 20 20 20  r *pIter,       
e870: 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74 6f        /* Iterato
e880: 72 20 74 6f 20 61 64 76 61 6e 63 65 20 2a 2f 0a  r to advance */.
e890: 20 20 69 6e 74 20 2a 70 62 55 6e 75 73 65 64 20    int *pbUnused 
e8a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e8b0: 20 20 2f 2a 20 55 6e 75 73 65 64 20 2a 2f 0a 29    /* Unused */.)
e8c0: 7b 0a 20 20 61 73 73 65 72 74 28 20 70 49 74 65  {.  assert( pIte
e8d0: 72 2d 3e 66 6c 61 67 73 20 26 20 46 54 53 35 5f  r->flags & FTS5_
e8e0: 53 45 47 49 54 45 52 5f 52 45 56 45 52 53 45 20  SEGITER_REVERSE 
e8f0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 49 74  );.  assert( pIt
e900: 65 72 2d 3e 70 4e 65 78 74 4c 65 61 66 3d 3d 30  er->pNextLeaf==0
e910: 20 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52   );.  UNUSED_PAR
e920: 41 4d 28 70 62 55 6e 75 73 65 64 29 3b 0a 0a 20  AM(pbUnused);.. 
e930: 20 69 66 28 20 70 49 74 65 72 2d 3e 69 52 6f 77   if( pIter->iRow
e940: 69 64 4f 66 66 73 65 74 3e 30 20 29 7b 0a 20 20  idOffset>0 ){.  
e950: 20 20 75 38 20 2a 61 20 3d 20 70 49 74 65 72 2d    u8 *a = pIter-
e960: 3e 70 4c 65 61 66 2d 3e 70 3b 0a 20 20 20 20 69  >pLeaf->p;.    i
e970: 6e 74 20 69 4f 66 66 3b 0a 20 20 20 20 69 36 34  nt iOff;.    i64
e980: 20 69 44 65 6c 74 61 3b 0a 0a 20 20 20 20 70 49   iDelta;..    pI
e990: 74 65 72 2d 3e 69 52 6f 77 69 64 4f 66 66 73 65  ter->iRowidOffse
e9a0: 74 2d 2d 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e  t--;.    pIter->
e9b0: 69 4c 65 61 66 4f 66 66 73 65 74 20 3d 20 70 49  iLeafOffset = pI
e9c0: 74 65 72 2d 3e 61 52 6f 77 69 64 4f 66 66 73 65  ter->aRowidOffse
e9d0: 74 5b 70 49 74 65 72 2d 3e 69 52 6f 77 69 64 4f  t[pIter->iRowidO
e9e0: 66 66 73 65 74 5d 3b 0a 20 20 20 20 66 74 73 35  ffset];.    fts5
e9f0: 53 65 67 49 74 65 72 4c 6f 61 64 4e 50 6f 73 28  SegIterLoadNPos(
ea00: 70 2c 20 70 49 74 65 72 29 3b 0a 20 20 20 20 69  p, pIter);.    i
ea10: 4f 66 66 20 3d 20 70 49 74 65 72 2d 3e 69 4c 65  Off = pIter->iLe
ea20: 61 66 4f 66 66 73 65 74 3b 0a 20 20 20 20 69 66  afOffset;.    if
ea30: 28 20 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e 65 44  ( p->pConfig->eD
ea40: 65 74 61 69 6c 21 3d 46 54 53 35 5f 44 45 54 41  etail!=FTS5_DETA
ea50: 49 4c 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 20  IL_NONE ){.     
ea60: 20 69 4f 66 66 20 2b 3d 20 70 49 74 65 72 2d 3e   iOff += pIter->
ea70: 6e 50 6f 73 3b 0a 20 20 20 20 7d 0a 20 20 20 20  nPos;.    }.    
ea80: 66 74 73 35 47 65 74 56 61 72 69 6e 74 28 26 61  fts5GetVarint(&a
ea90: 5b 69 4f 66 66 5d 2c 20 28 75 36 34 2a 29 26 69  [iOff], (u64*)&i
eaa0: 44 65 6c 74 61 29 3b 0a 20 20 20 20 70 49 74 65  Delta);.    pIte
eab0: 72 2d 3e 69 52 6f 77 69 64 20 2d 3d 20 69 44 65  r->iRowid -= iDe
eac0: 6c 74 61 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  lta;.  }else{.  
ead0: 20 20 66 74 73 35 53 65 67 49 74 65 72 52 65 76    fts5SegIterRev
eae0: 65 72 73 65 4e 65 77 50 61 67 65 28 70 2c 20 70  erseNewPage(p, p
eaf0: 49 74 65 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  Iter);.  }.}../*
eb00: 0a 2a 2a 20 41 64 76 61 6e 63 65 20 69 74 65 72  .** Advance iter
eb10: 61 74 6f 72 20 70 49 74 65 72 20 74 6f 20 74 68  ator pIter to th
eb20: 65 20 6e 65 78 74 20 65 6e 74 72 79 2e 0a 2a 2a  e next entry..**
eb30: 0a 2a 2a 20 54 68 69 73 20 76 65 72 73 69 6f 6e  .** This version
eb40: 20 6f 66 20 66 74 73 35 53 65 67 49 74 65 72 4e   of fts5SegIterN
eb50: 65 78 74 28 29 20 69 73 20 6f 6e 6c 79 20 75 73  ext() is only us
eb60: 65 64 20 69 66 20 64 65 74 61 69 6c 3d 6e 6f 6e  ed if detail=non
eb70: 65 20 61 6e 64 20 74 68 65 0a 2a 2a 20 69 74 65  e and the.** ite
eb80: 72 61 74 6f 72 20 69 73 20 6e 6f 74 20 61 20 72  rator is not a r
eb90: 65 76 65 72 73 65 20 64 69 72 65 63 74 69 6f 6e  everse direction
eba0: 20 69 74 65 72 61 74 6f 72 2e 0a 2a 2f 0a 73 74   iterator..*/.st
ebb0: 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 53 65  atic void fts5Se
ebc0: 67 49 74 65 72 4e 65 78 74 5f 4e 6f 6e 65 28 0a  gIterNext_None(.
ebd0: 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20    Fts5Index *p, 
ebe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ebf0: 20 20 2f 2a 20 46 54 53 35 20 62 61 63 6b 65 6e    /* FTS5 backen
ec00: 64 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 46 74  d object */.  Ft
ec10: 73 35 53 65 67 49 74 65 72 20 2a 70 49 74 65 72  s5SegIter *pIter
ec20: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
ec30: 20 49 74 65 72 61 74 6f 72 20 74 6f 20 61 64 76   Iterator to adv
ec40: 61 6e 63 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 70  ance */.  int *p
ec50: 62 4e 65 77 54 65 72 6d 20 20 20 20 20 20 20 20  bNewTerm        
ec60: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54            /* OUT
ec70: 3a 20 53 65 74 20 66 6f 72 20 6e 65 77 20 74 65  : Set for new te
ec80: 72 6d 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69  rm */.){.  int i
ec90: 4f 66 66 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  Off;..  assert( 
eca0: 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
ecb0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70   );.  assert( (p
ecc0: 49 74 65 72 2d 3e 66 6c 61 67 73 20 26 20 46 54  Iter->flags & FT
ecd0: 53 35 5f 53 45 47 49 54 45 52 5f 52 45 56 45 52  S5_SEGITER_REVER
ece0: 53 45 29 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65  SE)==0 );.  asse
ecf0: 72 74 28 20 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e  rt( p->pConfig->
ed00: 65 44 65 74 61 69 6c 3d 3d 46 54 53 35 5f 44 45  eDetail==FTS5_DE
ed10: 54 41 49 4c 5f 4e 4f 4e 45 20 29 3b 0a 0a 20 20  TAIL_NONE );..  
ed20: 41 53 53 45 52 54 5f 53 5a 4c 45 41 46 5f 4f 4b  ASSERT_SZLEAF_OK
ed30: 28 70 49 74 65 72 2d 3e 70 4c 65 61 66 29 3b 0a  (pIter->pLeaf);.
ed40: 20 20 69 4f 66 66 20 3d 20 70 49 74 65 72 2d 3e    iOff = pIter->
ed50: 69 4c 65 61 66 4f 66 66 73 65 74 3b 0a 0a 20 20  iLeafOffset;..  
ed60: 2f 2a 20 4e 65 78 74 20 65 6e 74 72 79 20 69 73  /* Next entry is
ed70: 20 6f 6e 20 74 68 65 20 6e 65 78 74 20 70 61 67   on the next pag
ed80: 65 20 2a 2f 0a 20 20 69 66 28 20 70 49 74 65 72  e */.  if( pIter
ed90: 2d 3e 70 53 65 67 20 26 26 20 69 4f 66 66 3e 3d  ->pSeg && iOff>=
eda0: 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 73 7a  pIter->pLeaf->sz
edb0: 4c 65 61 66 20 29 7b 0a 20 20 20 20 66 74 73 35  Leaf ){.    fts5
edc0: 53 65 67 49 74 65 72 4e 65 78 74 50 61 67 65 28  SegIterNextPage(
edd0: 70 2c 20 70 49 74 65 72 29 3b 0a 20 20 20 20 69  p, pIter);.    i
ede0: 66 28 20 70 2d 3e 72 63 20 7c 7c 20 70 49 74 65  f( p->rc || pIte
edf0: 72 2d 3e 70 4c 65 61 66 3d 3d 30 20 29 20 72 65  r->pLeaf==0 ) re
ee00: 74 75 72 6e 3b 0a 20 20 20 20 70 49 74 65 72 2d  turn;.    pIter-
ee10: 3e 69 52 6f 77 69 64 20 3d 20 30 3b 0a 20 20 20  >iRowid = 0;.   
ee20: 20 69 4f 66 66 20 3d 20 34 3b 0a 20 20 7d 0a 0a   iOff = 4;.  }..
ee30: 20 20 69 66 28 20 69 4f 66 66 3c 70 49 74 65 72    if( iOff<pIter
ee40: 2d 3e 69 45 6e 64 6f 66 44 6f 63 6c 69 73 74 20  ->iEndofDoclist 
ee50: 29 7b 0a 20 20 20 20 2f 2a 20 4e 65 78 74 20 65  ){.    /* Next e
ee60: 6e 74 72 79 20 69 73 20 6f 6e 20 74 68 65 20 63  ntry is on the c
ee70: 75 72 72 65 6e 74 20 70 61 67 65 20 2a 2f 0a 20  urrent page */. 
ee80: 20 20 20 69 36 34 20 69 44 65 6c 74 61 3b 0a 20     i64 iDelta;. 
ee90: 20 20 20 69 4f 66 66 20 2b 3d 20 73 71 6c 69 74     iOff += sqlit
eea0: 65 33 46 74 73 35 47 65 74 56 61 72 69 6e 74 28  e3Fts5GetVarint(
eeb0: 26 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 70  &pIter->pLeaf->p
eec0: 5b 69 4f 66 66 5d 2c 20 28 75 36 34 2a 29 26 69  [iOff], (u64*)&i
eed0: 44 65 6c 74 61 29 3b 0a 20 20 20 20 70 49 74 65  Delta);.    pIte
eee0: 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 20 3d  r->iLeafOffset =
eef0: 20 69 4f 66 66 3b 0a 20 20 20 20 70 49 74 65 72   iOff;.    pIter
ef00: 2d 3e 69 52 6f 77 69 64 20 2b 3d 20 69 44 65 6c  ->iRowid += iDel
ef10: 74 61 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  ta;.  }else if( 
ef20: 28 70 49 74 65 72 2d 3e 66 6c 61 67 73 20 26 20  (pIter->flags & 
ef30: 46 54 53 35 5f 53 45 47 49 54 45 52 5f 4f 4e 45  FTS5_SEGITER_ONE
ef40: 54 45 52 4d 29 3d 3d 30 20 29 7b 0a 20 20 20 20  TERM)==0 ){.    
ef50: 69 66 28 20 70 49 74 65 72 2d 3e 70 53 65 67 20  if( pIter->pSeg 
ef60: 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 4b 65  ){.      int nKe
ef70: 65 70 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66  ep = 0;.      if
ef80: 28 20 69 4f 66 66 21 3d 66 74 73 35 4c 65 61 66  ( iOff!=fts5Leaf
ef90: 46 69 72 73 74 54 65 72 6d 4f 66 66 28 70 49 74  FirstTermOff(pIt
efa0: 65 72 2d 3e 70 4c 65 61 66 29 20 29 7b 0a 20 20  er->pLeaf) ){.  
efb0: 20 20 20 20 20 20 69 4f 66 66 20 2b 3d 20 66 74        iOff += ft
efc0: 73 35 47 65 74 56 61 72 69 6e 74 33 32 28 26 70  s5GetVarint32(&p
efd0: 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 70 5b 69  Iter->pLeaf->p[i
efe0: 4f 66 66 5d 2c 20 6e 4b 65 65 70 29 3b 0a 20 20  Off], nKeep);.  
eff0: 20 20 20 20 7d 0a 20 20 20 20 20 20 70 49 74 65      }.      pIte
f000: 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 20 3d  r->iLeafOffset =
f010: 20 69 4f 66 66 3b 0a 20 20 20 20 20 20 66 74 73   iOff;.      fts
f020: 35 53 65 67 49 74 65 72 4c 6f 61 64 54 65 72 6d  5SegIterLoadTerm
f030: 28 70 2c 20 70 49 74 65 72 2c 20 6e 4b 65 65 70  (p, pIter, nKeep
f040: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
f050: 20 20 20 20 63 6f 6e 73 74 20 75 38 20 2a 70 4c      const u8 *pL
f060: 69 73 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 63  ist = 0;.      c
f070: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 65 72 6d  onst char *zTerm
f080: 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 6e 74 20   = 0;.      int 
f090: 6e 4c 69 73 74 3b 0a 20 20 20 20 20 20 73 71 6c  nList;.      sql
f0a0: 69 74 65 33 46 74 73 35 48 61 73 68 53 63 61 6e  ite3Fts5HashScan
f0b0: 4e 65 78 74 28 70 2d 3e 70 48 61 73 68 29 3b 0a  Next(p->pHash);.
f0c0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 46 74 73        sqlite3Fts
f0d0: 35 48 61 73 68 53 63 61 6e 45 6e 74 72 79 28 70  5HashScanEntry(p
f0e0: 2d 3e 70 48 61 73 68 2c 20 26 7a 54 65 72 6d 2c  ->pHash, &zTerm,
f0f0: 20 26 70 4c 69 73 74 2c 20 26 6e 4c 69 73 74 29   &pList, &nList)
f100: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4c 69 73  ;.      if( pLis
f110: 74 3d 3d 30 20 29 20 67 6f 74 6f 20 6e 65 78 74  t==0 ) goto next
f120: 5f 6e 6f 6e 65 5f 65 6f 66 3b 0a 20 20 20 20 20  _none_eof;.     
f130: 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 70   pIter->pLeaf->p
f140: 20 3d 20 28 75 38 2a 29 70 4c 69 73 74 3b 0a 20   = (u8*)pList;. 
f150: 20 20 20 20 20 70 49 74 65 72 2d 3e 70 4c 65 61       pIter->pLea
f160: 66 2d 3e 6e 6e 20 3d 20 6e 4c 69 73 74 3b 0a 20  f->nn = nList;. 
f170: 20 20 20 20 20 70 49 74 65 72 2d 3e 70 4c 65 61       pIter->pLea
f180: 66 2d 3e 73 7a 4c 65 61 66 20 3d 20 6e 4c 69 73  f->szLeaf = nLis
f190: 74 3b 0a 20 20 20 20 20 20 70 49 74 65 72 2d 3e  t;.      pIter->
f1a0: 69 45 6e 64 6f 66 44 6f 63 6c 69 73 74 20 3d 20  iEndofDoclist = 
f1b0: 6e 4c 69 73 74 3b 0a 20 20 20 20 20 20 73 71 6c  nList;.      sql
f1c0: 69 74 65 33 46 74 73 35 42 75 66 66 65 72 53 65  ite3Fts5BufferSe
f1d0: 74 28 26 70 2d 3e 72 63 2c 26 70 49 74 65 72 2d  t(&p->rc,&pIter-
f1e0: 3e 74 65 72 6d 2c 20 28 69 6e 74 29 73 74 72 6c  >term, (int)strl
f1f0: 65 6e 28 7a 54 65 72 6d 29 2c 20 28 75 38 2a 29  en(zTerm), (u8*)
f200: 7a 54 65 72 6d 29 3b 0a 20 20 20 20 20 20 70 49  zTerm);.      pI
f210: 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74  ter->iLeafOffset
f220: 20 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e 74   = fts5GetVarint
f230: 28 70 4c 69 73 74 2c 20 28 75 36 34 2a 29 26 70  (pList, (u64*)&p
f240: 49 74 65 72 2d 3e 69 52 6f 77 69 64 29 3b 0a 20  Iter->iRowid);. 
f250: 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 70 62     }..    if( pb
f260: 4e 65 77 54 65 72 6d 20 29 20 2a 70 62 4e 65 77  NewTerm ) *pbNew
f270: 54 65 72 6d 20 3d 20 31 3b 0a 20 20 7d 65 6c 73  Term = 1;.  }els
f280: 65 7b 0a 20 20 20 20 67 6f 74 6f 20 6e 65 78 74  e{.    goto next
f290: 5f 6e 6f 6e 65 5f 65 6f 66 3b 0a 20 20 7d 0a 0a  _none_eof;.  }..
f2a0: 20 20 66 74 73 35 53 65 67 49 74 65 72 4c 6f 61    fts5SegIterLoa
f2b0: 64 4e 50 6f 73 28 70 2c 20 70 49 74 65 72 29 3b  dNPos(p, pIter);
f2c0: 0a 0a 20 20 72 65 74 75 72 6e 3b 0a 20 6e 65 78  ..  return;. nex
f2d0: 74 5f 6e 6f 6e 65 5f 65 6f 66 3a 0a 20 20 66 74  t_none_eof:.  ft
f2e0: 73 35 44 61 74 61 52 65 6c 65 61 73 65 28 70 49  s5DataRelease(pI
f2f0: 74 65 72 2d 3e 70 4c 65 61 66 29 3b 0a 20 20 70  ter->pLeaf);.  p
f300: 49 74 65 72 2d 3e 70 4c 65 61 66 20 3d 20 30 3b  Iter->pLeaf = 0;
f310: 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 41 64 76 61 6e  .}.../*.** Advan
f320: 63 65 20 69 74 65 72 61 74 6f 72 20 70 49 74 65  ce iterator pIte
f330: 72 20 74 6f 20 74 68 65 20 6e 65 78 74 20 65 6e  r to the next en
f340: 74 72 79 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 61  try. .**.** If a
f350: 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  n error occurs, 
f360: 46 74 73 35 49 6e 64 65 78 2e 72 63 20 69 73 20  Fts5Index.rc is 
f370: 73 65 74 20 74 6f 20 61 6e 20 61 70 70 72 6f 70  set to an approp
f380: 72 69 61 74 65 20 65 72 72 6f 72 20 63 6f 64 65  riate error code
f390: 2e 20 49 74 20 0a 2a 2a 20 69 73 20 6e 6f 74 20  . It .** is not 
f3a0: 63 6f 6e 73 69 64 65 72 65 64 20 61 6e 20 65 72  considered an er
f3b0: 72 6f 72 20 69 66 20 74 68 65 20 69 74 65 72 61  ror if the itera
f3c0: 74 6f 72 20 72 65 61 63 68 65 73 20 45 4f 46 2e  tor reaches EOF.
f3d0: 20 49 66 20 61 6e 20 65 72 72 6f 72 20 68 61 73   If an error has
f3e0: 20 0a 2a 2a 20 61 6c 72 65 61 64 79 20 6f 63 63   .** already occ
f3f0: 75 72 72 65 64 20 77 68 65 6e 20 74 68 69 73 20  urred when this 
f400: 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
f410: 65 64 2c 20 69 74 20 69 73 20 61 20 6e 6f 2d 6f  ed, it is a no-o
f420: 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  p..*/.static voi
f430: 64 20 66 74 73 35 53 65 67 49 74 65 72 4e 65 78  d fts5SegIterNex
f440: 74 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a  t(.  Fts5Index *
f450: 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
f460: 20 20 20 20 20 2f 2a 20 46 54 53 35 20 62 61 63       /* FTS5 bac
f470: 6b 65 6e 64 20 6f 62 6a 65 63 74 20 2a 2f 0a 20  kend object */. 
f480: 20 46 74 73 35 53 65 67 49 74 65 72 20 2a 70 49   Fts5SegIter *pI
f490: 74 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 20  ter,            
f4a0: 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 74 6f 20   /* Iterator to 
f4b0: 61 64 76 61 6e 63 65 20 2a 2f 0a 20 20 69 6e 74  advance */.  int
f4c0: 20 2a 70 62 4e 65 77 54 65 72 6d 20 20 20 20 20   *pbNewTerm     
f4d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
f4e0: 4f 55 54 3a 20 53 65 74 20 66 6f 72 20 6e 65 77  OUT: Set for new
f4f0: 20 74 65 72 6d 20 2a 2f 0a 29 7b 0a 20 20 46 74   term */.){.  Ft
f500: 73 35 44 61 74 61 20 2a 70 4c 65 61 66 20 3d 20  s5Data *pLeaf = 
f510: 70 49 74 65 72 2d 3e 70 4c 65 61 66 3b 0a 20 20  pIter->pLeaf;.  
f520: 69 6e 74 20 69 4f 66 66 3b 0a 20 20 69 6e 74 20  int iOff;.  int 
f530: 62 4e 65 77 54 65 72 6d 20 3d 20 30 3b 0a 20 20  bNewTerm = 0;.  
f540: 69 6e 74 20 6e 4b 65 65 70 20 3d 20 30 3b 0a 20  int nKeep = 0;. 
f550: 20 75 38 20 2a 61 3b 0a 20 20 69 6e 74 20 6e 3b   u8 *a;.  int n;
f560: 0a 0a 20 20 61 73 73 65 72 74 28 20 70 62 4e 65  ..  assert( pbNe
f570: 77 54 65 72 6d 3d 3d 30 20 7c 7c 20 2a 70 62 4e  wTerm==0 || *pbN
f580: 65 77 54 65 72 6d 3d 3d 30 20 29 3b 0a 20 20 61  ewTerm==0 );.  a
f590: 73 73 65 72 74 28 20 70 2d 3e 70 43 6f 6e 66 69  ssert( p->pConfi
f5a0: 67 2d 3e 65 44 65 74 61 69 6c 21 3d 46 54 53 35  g->eDetail!=FTS5
f5b0: 5f 44 45 54 41 49 4c 5f 4e 4f 4e 45 20 29 3b 0a  _DETAIL_NONE );.
f5c0: 0a 20 20 2f 2a 20 53 65 61 72 63 68 20 66 6f 72  .  /* Search for
f5d0: 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
f5e0: 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74 20 77 69  position list wi
f5f0: 74 68 69 6e 20 74 68 65 20 63 75 72 72 65 6e 74  thin the current
f600: 20 70 61 67 65 2e 20 2a 2f 0a 20 20 61 20 3d 20   page. */.  a = 
f610: 70 4c 65 61 66 2d 3e 70 3b 0a 20 20 6e 20 3d 20  pLeaf->p;.  n = 
f620: 70 4c 65 61 66 2d 3e 73 7a 4c 65 61 66 3b 0a 0a  pLeaf->szLeaf;..
f630: 20 20 41 53 53 45 52 54 5f 53 5a 4c 45 41 46 5f    ASSERT_SZLEAF_
f640: 4f 4b 28 70 4c 65 61 66 29 3b 0a 20 20 69 4f 66  OK(pLeaf);.  iOf
f650: 66 20 3d 20 70 49 74 65 72 2d 3e 69 4c 65 61 66  f = pIter->iLeaf
f660: 4f 66 66 73 65 74 20 2b 20 70 49 74 65 72 2d 3e  Offset + pIter->
f670: 6e 50 6f 73 3b 0a 0a 20 20 69 66 28 20 69 4f 66  nPos;..  if( iOf
f680: 66 3c 6e 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68  f<n ){.    /* Th
f690: 65 20 6e 65 78 74 20 65 6e 74 72 79 20 69 73 20  e next entry is 
f6a0: 6f 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 70  on the current p
f6b0: 61 67 65 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65  age. */.    asse
f6c0: 72 74 5f 6e 63 28 20 69 4f 66 66 3c 3d 70 49 74  rt_nc( iOff<=pIt
f6d0: 65 72 2d 3e 69 45 6e 64 6f 66 44 6f 63 6c 69 73  er->iEndofDoclis
f6e0: 74 20 29 3b 0a 20 20 20 20 69 66 28 20 69 4f 66  t );.    if( iOf
f6f0: 66 3e 3d 70 49 74 65 72 2d 3e 69 45 6e 64 6f 66  f>=pIter->iEndof
f700: 44 6f 63 6c 69 73 74 20 29 7b 0a 20 20 20 20 20  Doclist ){.     
f710: 20 62 4e 65 77 54 65 72 6d 20 3d 20 31 3b 0a 20   bNewTerm = 1;. 
f720: 20 20 20 20 20 69 66 28 20 69 4f 66 66 21 3d 66       if( iOff!=f
f730: 74 73 35 4c 65 61 66 46 69 72 73 74 54 65 72 6d  ts5LeafFirstTerm
f740: 4f 66 66 28 70 4c 65 61 66 29 20 29 7b 0a 20 20  Off(pLeaf) ){.  
f750: 20 20 20 20 20 20 69 4f 66 66 20 2b 3d 20 66 74        iOff += ft
f760: 73 35 47 65 74 56 61 72 69 6e 74 33 32 28 26 61  s5GetVarint32(&a
f770: 5b 69 4f 66 66 5d 2c 20 6e 4b 65 65 70 29 3b 0a  [iOff], nKeep);.
f780: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
f790: 65 7b 0a 20 20 20 20 20 20 75 36 34 20 69 44 65  e{.      u64 iDe
f7a0: 6c 74 61 3b 0a 20 20 20 20 20 20 69 4f 66 66 20  lta;.      iOff 
f7b0: 2b 3d 20 73 71 6c 69 74 65 33 46 74 73 35 47 65  += sqlite3Fts5Ge
f7c0: 74 56 61 72 69 6e 74 28 26 61 5b 69 4f 66 66 5d  tVarint(&a[iOff]
f7d0: 2c 20 26 69 44 65 6c 74 61 29 3b 0a 20 20 20 20  , &iDelta);.    
f7e0: 20 20 70 49 74 65 72 2d 3e 69 52 6f 77 69 64 20    pIter->iRowid 
f7f0: 2b 3d 20 69 44 65 6c 74 61 3b 0a 20 20 20 20 20  += iDelta;.     
f800: 20 61 73 73 65 72 74 5f 6e 63 28 20 69 44 65 6c   assert_nc( iDel
f810: 74 61 3e 30 20 29 3b 0a 20 20 20 20 7d 0a 20 20  ta>0 );.    }.  
f820: 20 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66    pIter->iLeafOf
f830: 66 73 65 74 20 3d 20 69 4f 66 66 3b 0a 0a 20 20  fset = iOff;..  
f840: 7d 65 6c 73 65 20 69 66 28 20 70 49 74 65 72 2d  }else if( pIter-
f850: 3e 70 53 65 67 3d 3d 30 20 29 7b 0a 20 20 20 20  >pSeg==0 ){.    
f860: 63 6f 6e 73 74 20 75 38 20 2a 70 4c 69 73 74 20  const u8 *pList 
f870: 3d 20 30 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63  = 0;.    const c
f880: 68 61 72 20 2a 7a 54 65 72 6d 20 3d 20 30 3b 0a  har *zTerm = 0;.
f890: 20 20 20 20 69 6e 74 20 6e 4c 69 73 74 20 3d 20      int nList = 
f8a0: 30 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28  0;.    assert( (
f8b0: 70 49 74 65 72 2d 3e 66 6c 61 67 73 20 26 20 46  pIter->flags & F
f8c0: 54 53 35 5f 53 45 47 49 54 45 52 5f 4f 4e 45 54  TS5_SEGITER_ONET
f8d0: 45 52 4d 29 20 7c 7c 20 70 62 4e 65 77 54 65 72  ERM) || pbNewTer
f8e0: 6d 20 29 3b 0a 20 20 20 20 69 66 28 20 30 3d 3d  m );.    if( 0==
f8f0: 28 70 49 74 65 72 2d 3e 66 6c 61 67 73 20 26 20  (pIter->flags & 
f900: 46 54 53 35 5f 53 45 47 49 54 45 52 5f 4f 4e 45  FTS5_SEGITER_ONE
f910: 54 45 52 4d 29 20 29 7b 0a 20 20 20 20 20 20 73  TERM) ){.      s
f920: 71 6c 69 74 65 33 46 74 73 35 48 61 73 68 53 63  qlite3Fts5HashSc
f930: 61 6e 4e 65 78 74 28 70 2d 3e 70 48 61 73 68 29  anNext(p->pHash)
f940: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 46  ;.      sqlite3F
f950: 74 73 35 48 61 73 68 53 63 61 6e 45 6e 74 72 79  ts5HashScanEntry
f960: 28 70 2d 3e 70 48 61 73 68 2c 20 26 7a 54 65 72  (p->pHash, &zTer
f970: 6d 2c 20 26 70 4c 69 73 74 2c 20 26 6e 4c 69 73  m, &pList, &nLis
f980: 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  t);.    }.    if
f990: 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20  ( pList==0 ){.  
f9a0: 20 20 20 20 66 74 73 35 44 61 74 61 52 65 6c 65      fts5DataRele
f9b0: 61 73 65 28 70 49 74 65 72 2d 3e 70 4c 65 61 66  ase(pIter->pLeaf
f9c0: 29 3b 0a 20 20 20 20 20 20 70 49 74 65 72 2d 3e  );.      pIter->
f9d0: 70 4c 65 61 66 20 3d 20 30 3b 0a 20 20 20 20 7d  pLeaf = 0;.    }
f9e0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 49 74 65  else{.      pIte
f9f0: 72 2d 3e 70 4c 65 61 66 2d 3e 70 20 3d 20 28 75  r->pLeaf->p = (u
fa00: 38 2a 29 70 4c 69 73 74 3b 0a 20 20 20 20 20 20  8*)pList;.      
fa10: 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 6e 6e  pIter->pLeaf->nn
fa20: 20 3d 20 6e 4c 69 73 74 3b 0a 20 20 20 20 20 20   = nList;.      
fa30: 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 73 7a  pIter->pLeaf->sz
fa40: 4c 65 61 66 20 3d 20 6e 4c 69 73 74 3b 0a 20 20  Leaf = nList;.  
fa50: 20 20 20 20 70 49 74 65 72 2d 3e 69 45 6e 64 6f      pIter->iEndo
fa60: 66 44 6f 63 6c 69 73 74 20 3d 20 6e 4c 69 73 74  fDoclist = nList
fa70: 2b 31 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  +1;.      sqlite
fa80: 33 46 74 73 35 42 75 66 66 65 72 53 65 74 28 26  3Fts5BufferSet(&
fa90: 70 2d 3e 72 63 2c 20 26 70 49 74 65 72 2d 3e 74  p->rc, &pIter->t
faa0: 65 72 6d 2c 20 28 69 6e 74 29 73 74 72 6c 65 6e  erm, (int)strlen
fab0: 28 7a 54 65 72 6d 29 2c 0a 20 20 20 20 20 20 20  (zTerm),.       
fac0: 20 20 20 28 75 38 2a 29 7a 54 65 72 6d 29 3b 0a     (u8*)zTerm);.
fad0: 20 20 20 20 20 20 70 49 74 65 72 2d 3e 69 4c 65        pIter->iLe
fae0: 61 66 4f 66 66 73 65 74 20 3d 20 66 74 73 35 47  afOffset = fts5G
faf0: 65 74 56 61 72 69 6e 74 28 70 4c 69 73 74 2c 20  etVarint(pList, 
fb00: 28 75 36 34 2a 29 26 70 49 74 65 72 2d 3e 69 52  (u64*)&pIter->iR
fb10: 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 2a 70 62  owid);.      *pb
fb20: 4e 65 77 54 65 72 6d 20 3d 20 31 3b 0a 20 20 20  NewTerm = 1;.   
fb30: 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20   }.  }else{.    
fb40: 69 4f 66 66 20 3d 20 30 3b 0a 20 20 20 20 2f 2a  iOff = 0;.    /*
fb50: 20 4e 65 78 74 20 65 6e 74 72 79 20 69 73 20 6e   Next entry is n
fb60: 6f 74 20 6f 6e 20 74 68 65 20 63 75 72 72 65 6e  ot on the curren
fb70: 74 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 77 68  t page */.    wh
fb80: 69 6c 65 28 20 69 4f 66 66 3d 3d 30 20 29 7b 0a  ile( iOff==0 ){.
fb90: 20 20 20 20 20 20 66 74 73 35 53 65 67 49 74 65        fts5SegIte
fba0: 72 4e 65 78 74 50 61 67 65 28 70 2c 20 70 49 74  rNextPage(p, pIt
fbb0: 65 72 29 3b 0a 20 20 20 20 20 20 70 4c 65 61 66  er);.      pLeaf
fbc0: 20 3d 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 3b   = pIter->pLeaf;
fbd0: 0a 20 20 20 20 20 20 69 66 28 20 70 4c 65 61 66  .      if( pLeaf
fbe0: 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ==0 ) break;.   
fbf0: 20 20 20 41 53 53 45 52 54 5f 53 5a 4c 45 41 46     ASSERT_SZLEAF
fc00: 5f 4f 4b 28 70 4c 65 61 66 29 3b 0a 20 20 20 20  _OK(pLeaf);.    
fc10: 20 20 69 66 28 20 28 69 4f 66 66 20 3d 20 66 74    if( (iOff = ft
fc20: 73 35 4c 65 61 66 46 69 72 73 74 52 6f 77 69 64  s5LeafFirstRowid
fc30: 4f 66 66 28 70 4c 65 61 66 29 29 20 26 26 20 69  Off(pLeaf)) && i
fc40: 4f 66 66 3c 70 4c 65 61 66 2d 3e 73 7a 4c 65 61  Off<pLeaf->szLea
fc50: 66 20 29 7b 0a 20 20 20 20 20 20 20 20 69 4f 66  f ){.        iOf
fc60: 66 20 2b 3d 20 73 71 6c 69 74 65 33 46 74 73 35  f += sqlite3Fts5
fc70: 47 65 74 56 61 72 69 6e 74 28 26 70 4c 65 61 66  GetVarint(&pLeaf
fc80: 2d 3e 70 5b 69 4f 66 66 5d 2c 20 28 75 36 34 2a  ->p[iOff], (u64*
fc90: 29 26 70 49 74 65 72 2d 3e 69 52 6f 77 69 64 29  )&pIter->iRowid)
fca0: 3b 0a 20 20 20 20 20 20 20 20 70 49 74 65 72 2d  ;.        pIter-
fcb0: 3e 69 4c 65 61 66 4f 66 66 73 65 74 20 3d 20 69  >iLeafOffset = i
fcc0: 4f 66 66 3b 0a 0a 20 20 20 20 20 20 20 20 69 66  Off;..        if
fcd0: 28 20 70 4c 65 61 66 2d 3e 6e 6e 3e 70 4c 65 61  ( pLeaf->nn>pLea
fce0: 66 2d 3e 73 7a 4c 65 61 66 20 29 7b 0a 20 20 20  f->szLeaf ){.   
fcf0: 20 20 20 20 20 20 20 70 49 74 65 72 2d 3e 69 50         pIter->iP
fd00: 67 69 64 78 4f 66 66 20 3d 20 70 4c 65 61 66 2d  gidxOff = pLeaf-
fd10: 3e 73 7a 4c 65 61 66 20 2b 20 66 74 73 35 47 65  >szLeaf + fts5Ge
fd20: 74 56 61 72 69 6e 74 33 32 28 0a 20 20 20 20 20  tVarint32(.     
fd30: 20 20 20 20 20 20 20 20 20 26 70 4c 65 61 66 2d           &pLeaf-
fd40: 3e 70 5b 70 4c 65 61 66 2d 3e 73 7a 4c 65 61 66  >p[pLeaf->szLeaf
fd50: 5d 2c 20 70 49 74 65 72 2d 3e 69 45 6e 64 6f 66  ], pIter->iEndof
fd60: 44 6f 63 6c 69 73 74 0a 20 20 20 20 20 20 20 20  Doclist.        
fd70: 20 20 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20    );.        }. 
fd80: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 65 6c 73       }.      els
fd90: 65 20 69 66 28 20 70 4c 65 61 66 2d 3e 6e 6e 3e  e if( pLeaf->nn>
fda0: 70 4c 65 61 66 2d 3e 73 7a 4c 65 61 66 20 29 7b  pLeaf->szLeaf ){
fdb0: 0a 20 20 20 20 20 20 20 20 70 49 74 65 72 2d 3e  .        pIter->
fdc0: 69 50 67 69 64 78 4f 66 66 20 3d 20 70 4c 65 61  iPgidxOff = pLea
fdd0: 66 2d 3e 73 7a 4c 65 61 66 20 2b 20 66 74 73 35  f->szLeaf + fts5
fde0: 47 65 74 56 61 72 69 6e 74 33 32 28 0a 20 20 20  GetVarint32(.   
fdf0: 20 20 20 20 20 20 20 20 20 26 70 4c 65 61 66 2d           &pLeaf-
fe00: 3e 70 5b 70 4c 65 61 66 2d 3e 73 7a 4c 65 61 66  >p[pLeaf->szLeaf
fe10: 5d 2c 20 69 4f 66 66 0a 20 20 20 20 20 20 20 20  ], iOff.        
fe20: 29 3b 0a 20 20 20 20 20 20 20 20 70 49 74 65 72  );.        pIter
fe30: 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 20 3d 20  ->iLeafOffset = 
fe40: 69 4f 66 66 3b 0a 20 20 20 20 20 20 20 20 70 49  iOff;.        pI
fe50: 74 65 72 2d 3e 69 45 6e 64 6f 66 44 6f 63 6c 69  ter->iEndofDocli
fe60: 73 74 20 3d 20 69 4f 66 66 3b 0a 20 20 20 20 20  st = iOff;.     
fe70: 20 20 20 62 4e 65 77 54 65 72 6d 20 3d 20 31 3b     bNewTerm = 1;
fe80: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61  .      }.      a
fe90: 73 73 65 72 74 5f 6e 63 28 20 69 4f 66 66 3c 70  ssert_nc( iOff<p
fea0: 4c 65 61 66 2d 3e 73 7a 4c 65 61 66 20 29 3b 0a  Leaf->szLeaf );.
feb0: 20 20 20 20 20 20 69 66 28 20 69 4f 66 66 3e 70        if( iOff>p
fec0: 4c 65 61 66 2d 3e 73 7a 4c 65 61 66 20 29 7b 0a  Leaf->szLeaf ){.
fed0: 20 20 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20          p->rc = 
fee0: 46 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20  FTS5_CORRUPT;.  
fef0: 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20        return;.  
ff00: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
ff10: 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 74  .  /* Check if t
ff20: 68 65 20 69 74 65 72 61 74 6f 72 20 69 73 20 6e  he iterator is n
ff30: 6f 77 20 61 74 20 45 4f 46 2e 20 49 66 20 73 6f  ow at EOF. If so
ff40: 2c 20 72 65 74 75 72 6e 20 65 61 72 6c 79 2e 20  , return early. 
ff50: 2a 2f 0a 20 20 69 66 28 20 70 49 74 65 72 2d 3e  */.  if( pIter->
ff60: 70 4c 65 61 66 20 29 7b 0a 20 20 20 20 69 66 28  pLeaf ){.    if(
ff70: 20 62 4e 65 77 54 65 72 6d 20 29 7b 0a 20 20 20   bNewTerm ){.   
ff80: 20 20 20 69 66 28 20 70 49 74 65 72 2d 3e 66 6c     if( pIter->fl
ff90: 61 67 73 20 26 20 46 54 53 35 5f 53 45 47 49 54  ags & FTS5_SEGIT
ffa0: 45 52 5f 4f 4e 45 54 45 52 4d 20 29 7b 0a 20 20  ER_ONETERM ){.  
ffb0: 20 20 20 20 20 20 66 74 73 35 44 61 74 61 52 65        fts5DataRe
ffc0: 6c 65 61 73 65 28 70 49 74 65 72 2d 3e 70 4c 65  lease(pIter->pLe
ffd0: 61 66 29 3b 0a 20 20 20 20 20 20 20 20 70 49 74  af);.        pIt
ffe0: 65 72 2d 3e 70 4c 65 61 66 20 3d 20 30 3b 0a 20  er->pLeaf = 0;. 
fff0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
10000 20 20 20 20 66 74 73 35 53 65 67 49 74 65 72 4c      fts5SegIterL
10010 6f 61 64 54 65 72 6d 28 70 2c 20 70 49 74 65 72  oadTerm(p, pIter
10020 2c 20 6e 4b 65 65 70 29 3b 0a 20 20 20 20 20 20  , nKeep);.      
10030 20 20 66 74 73 35 53 65 67 49 74 65 72 4c 6f 61    fts5SegIterLoa
10040 64 4e 50 6f 73 28 70 2c 20 70 49 74 65 72 29 3b  dNPos(p, pIter);
10050 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 62 4e  .        if( pbN
10060 65 77 54 65 72 6d 20 29 20 2a 70 62 4e 65 77 54  ewTerm ) *pbNewT
10070 65 72 6d 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d  erm = 1;.      }
10080 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
10090 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69    /* The followi
100a0 6e 67 20 63 6f 75 6c 64 20 62 65 20 64 6f 6e 65  ng could be done
100b0 20 62 79 20 63 61 6c 6c 69 6e 67 20 66 74 73 35   by calling fts5
100c0 53 65 67 49 74 65 72 4c 6f 61 64 4e 50 6f 73 28  SegIterLoadNPos(
100d0 29 2e 20 42 75 74 0a 20 20 20 20 20 20 2a 2a 20  ). But.      ** 
100e0 74 68 69 73 20 62 6c 6f 63 6b 20 69 73 20 70 61  this block is pa
100f0 72 74 69 63 75 6c 61 72 6c 79 20 70 65 72 66 6f  rticularly perfo
10100 72 6d 61 6e 63 65 20 63 72 69 74 69 63 61 6c 2c  rmance critical,
10110 20 73 6f 20 65 71 75 69 76 61 6c 65 6e 74 0a 20   so equivalent. 
10120 20 20 20 20 20 2a 2a 20 63 6f 64 65 20 69 73 20       ** code is 
10130 69 6e 6c 69 6e 65 64 2e 20 0a 20 20 20 20 20 20  inlined. .      
10140 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 4c 61 74 65  **.      ** Late
10150 72 3a 20 53 77 69 74 63 68 65 64 20 62 61 63 6b  r: Switched back
10160 20 74 6f 20 66 74 73 35 53 65 67 49 74 65 72 4c   to fts5SegIterL
10170 6f 61 64 4e 50 6f 73 28 29 20 62 65 63 61 75 73  oadNPos() becaus
10180 65 20 69 74 20 73 75 70 70 6f 72 74 73 0a 20 20  e it supports.  
10190 20 20 20 20 2a 2a 20 64 65 74 61 69 6c 3d 6e 6f      ** detail=no
101a0 6e 65 20 6d 6f 64 65 2e 20 4e 6f 74 20 69 64 65  ne mode. Not ide
101b0 61 6c 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  al..      */.   
101c0 20 20 20 69 6e 74 20 6e 53 7a 3b 0a 20 20 20 20     int nSz;.    
101d0 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72 63 3d    assert( p->rc=
101e0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20  =SQLITE_OK );.  
101f0 20 20 20 20 61 73 73 65 72 74 28 20 70 49 74 65      assert( pIte
10200 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 3c 3d  r->iLeafOffset<=
10210 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 6e 6e  pIter->pLeaf->nn
10220 20 29 3b 0a 20 20 20 20 20 20 66 74 73 35 46 61   );.      fts5Fa
10230 73 74 47 65 74 56 61 72 69 6e 74 33 32 28 70 49  stGetVarint32(pI
10240 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 70 2c 20 70  ter->pLeaf->p, p
10250 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65  Iter->iLeafOffse
10260 74 2c 20 6e 53 7a 29 3b 0a 20 20 20 20 20 20 70  t, nSz);.      p
10270 49 74 65 72 2d 3e 62 44 65 6c 20 3d 20 28 6e 53  Iter->bDel = (nS
10280 7a 20 26 20 30 78 30 30 30 31 29 3b 0a 20 20 20  z & 0x0001);.   
10290 20 20 20 70 49 74 65 72 2d 3e 6e 50 6f 73 20 3d     pIter->nPos =
102a0 20 6e 53 7a 3e 3e 31 3b 0a 20 20 20 20 20 20 61   nSz>>1;.      a
102b0 73 73 65 72 74 5f 6e 63 28 20 70 49 74 65 72 2d  ssert_nc( pIter-
102c0 3e 6e 50 6f 73 3e 3d 30 20 29 3b 0a 20 20 20 20  >nPos>=0 );.    
102d0 7d 0a 20 20 7d 0a 7d 0a 0a 23 64 65 66 69 6e 65  }.  }.}..#define
102e0 20 53 57 41 50 56 41 4c 28 54 2c 20 61 2c 20 62   SWAPVAL(T, a, b
102f0 29 20 7b 20 54 20 74 6d 70 3b 20 74 6d 70 3d 61  ) { T tmp; tmp=a
10300 3b 20 61 3d 62 3b 20 62 3d 74 6d 70 3b 20 7d 0a  ; a=b; b=tmp; }.
10310 0a 23 64 65 66 69 6e 65 20 66 74 73 35 49 6e 64  .#define fts5Ind
10320 65 78 53 6b 69 70 56 61 72 69 6e 74 28 61 2c 20  exSkipVarint(a, 
10330 69 4f 66 66 29 20 7b 20 20 20 20 20 20 20 20 20  iOff) {         
10340 20 20 20 5c 0a 20 20 69 6e 74 20 69 45 6e 64 20     \.  int iEnd 
10350 3d 20 69 4f 66 66 2b 39 3b 20 20 20 20 20 20 20  = iOff+9;       
10360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10370 20 20 20 20 20 20 20 5c 0a 20 20 77 68 69 6c 65         \.  while
10380 28 20 28 61 5b 69 4f 66 66 2b 2b 5d 20 26 20 30  ( (a[iOff++] & 0
10390 78 38 30 29 20 26 26 20 69 4f 66 66 3c 69 45 6e  x80) && iOff<iEn
103a0 64 20 29 3b 20 20 20 20 20 20 20 5c 0a 7d 0a 0a  d );       \.}..
103b0 2f 2a 0a 2a 2a 20 49 74 65 72 61 74 6f 72 20 70  /*.** Iterator p
103c0 49 74 65 72 20 63 75 72 72 65 6e 74 6c 79 20 70  Iter currently p
103d0 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 66 69 72  oints to the fir
103e0 73 74 20 72 6f 77 69 64 20 69 6e 20 61 20 64 6f  st rowid in a do
103f0 63 6c 69 73 74 2e 20 54 68 69 73 0a 2a 2a 20 66  clist. This.** f
10400 75 6e 63 74 69 6f 6e 20 73 65 74 73 20 74 68 65  unction sets the
10410 20 69 74 65 72 61 74 6f 72 20 75 70 20 73 6f 20   iterator up so 
10420 74 68 61 74 20 69 74 65 72 61 74 65 73 20 69 6e  that iterates in
10430 20 72 65 76 65 72 73 65 20 6f 72 64 65 72 20 74   reverse order t
10440 68 72 6f 75 67 68 0a 2a 2a 20 74 68 65 20 64 6f  hrough.** the do
10450 63 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  clist..*/.static
10460 20 76 6f 69 64 20 66 74 73 35 53 65 67 49 74 65   void fts5SegIte
10470 72 52 65 76 65 72 73 65 28 46 74 73 35 49 6e 64  rReverse(Fts5Ind
10480 65 78 20 2a 70 2c 20 46 74 73 35 53 65 67 49 74  ex *p, Fts5SegIt
10490 65 72 20 2a 70 49 74 65 72 29 7b 0a 20 20 46 74  er *pIter){.  Ft
104a0 73 35 44 6c 69 64 78 49 74 65 72 20 2a 70 44 6c  s5DlidxIter *pDl
104b0 69 64 78 20 3d 20 70 49 74 65 72 2d 3e 70 44 6c  idx = pIter->pDl
104c0 69 64 78 3b 0a 20 20 46 74 73 35 44 61 74 61 20  idx;.  Fts5Data 
104d0 2a 70 4c 61 73 74 20 3d 20 30 3b 0a 20 20 69 6e  *pLast = 0;.  in
104e0 74 20 70 67 6e 6f 4c 61 73 74 20 3d 20 30 3b 0a  t pgnoLast = 0;.
104f0 0a 20 20 69 66 28 20 70 44 6c 69 64 78 20 29 7b  .  if( pDlidx ){
10500 0a 20 20 20 20 69 6e 74 20 69 53 65 67 69 64 20  .    int iSegid 
10510 3d 20 70 49 74 65 72 2d 3e 70 53 65 67 2d 3e 69  = pIter->pSeg->i
10520 53 65 67 69 64 3b 0a 20 20 20 20 70 67 6e 6f 4c  Segid;.    pgnoL
10530 61 73 74 20 3d 20 66 74 73 35 44 6c 69 64 78 49  ast = fts5DlidxI
10540 74 65 72 50 67 6e 6f 28 70 44 6c 69 64 78 29 3b  terPgno(pDlidx);
10550 0a 20 20 20 20 70 4c 61 73 74 20 3d 20 66 74 73  .    pLast = fts
10560 35 44 61 74 61 52 65 61 64 28 70 2c 20 46 54 53  5DataRead(p, FTS
10570 35 5f 53 45 47 4d 45 4e 54 5f 52 4f 57 49 44 28  5_SEGMENT_ROWID(
10580 69 53 65 67 69 64 2c 20 70 67 6e 6f 4c 61 73 74  iSegid, pgnoLast
10590 29 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ));.  }else{.   
105a0 20 46 74 73 35 44 61 74 61 20 2a 70 4c 65 61 66   Fts5Data *pLeaf
105b0 20 3d 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 3b   = pIter->pLeaf;
105c0 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72           /* Curr
105d0 65 6e 74 20 6c 65 61 66 20 64 61 74 61 20 2a 2f  ent leaf data */
105e0 0a 0a 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74  ..    /* Current
105f0 6c 79 2c 20 46 74 73 35 53 65 67 49 74 65 72 2e  ly, Fts5SegIter.
10600 69 4c 65 61 66 4f 66 66 73 65 74 20 70 6f 69 6e  iLeafOffset poin
10610 74 73 20 74 6f 20 74 68 65 20 66 69 72 73 74 20  ts to the first 
10620 62 79 74 65 20 6f 66 0a 20 20 20 20 2a 2a 20 70  byte of.    ** p
10630 6f 73 69 74 69 6f 6e 2d 6c 69 73 74 20 63 6f 6e  osition-list con
10640 74 65 6e 74 20 66 6f 72 20 74 68 65 20 63 75 72  tent for the cur
10650 72 65 6e 74 20 72 6f 77 69 64 2e 20 42 61 63 6b  rent rowid. Back
10660 20 69 74 20 75 70 20 73 6f 20 74 68 61 74 20 69   it up so that i
10670 74 0a 20 20 20 20 2a 2a 20 70 6f 69 6e 74 73 20  t.    ** points 
10680 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  to the start of 
10690 74 68 65 20 70 6f 73 69 74 69 6f 6e 2d 6c 69 73  the position-lis
106a0 74 20 73 69 7a 65 20 66 69 65 6c 64 2e 20 2a 2f  t size field. */
106b0 0a 20 20 20 20 69 6e 74 20 69 50 6f 73 6c 69 73  .    int iPoslis
106c0 74 3b 0a 20 20 20 20 69 66 28 20 70 49 74 65 72  t;.    if( pIter
106d0 2d 3e 69 54 65 72 6d 4c 65 61 66 50 67 6e 6f 3d  ->iTermLeafPgno=
106e0 3d 70 49 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e  =pIter->iLeafPgn
106f0 6f 20 29 7b 0a 20 20 20 20 20 20 69 50 6f 73 6c  o ){.      iPosl
10700 69 73 74 20 3d 20 70 49 74 65 72 2d 3e 69 54 65  ist = pIter->iTe
10710 72 6d 4c 65 61 66 4f 66 66 73 65 74 3b 0a 20 20  rmLeafOffset;.  
10720 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69    }else{.      i
10730 50 6f 73 6c 69 73 74 20 3d 20 34 3b 0a 20 20 20  Poslist = 4;.   
10740 20 7d 0a 20 20 20 20 66 74 73 35 49 6e 64 65 78   }.    fts5Index
10750 53 6b 69 70 56 61 72 69 6e 74 28 70 4c 65 61 66  SkipVarint(pLeaf
10760 2d 3e 70 2c 20 69 50 6f 73 6c 69 73 74 29 3b 0a  ->p, iPoslist);.
10770 20 20 20 20 70 49 74 65 72 2d 3e 69 4c 65 61 66      pIter->iLeaf
10780 4f 66 66 73 65 74 20 3d 20 69 50 6f 73 6c 69 73  Offset = iPoslis
10790 74 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  t;..    /* If th
107a0 69 73 20 63 6f 6e 64 69 74 69 6f 6e 20 69 73 20  is condition is 
107b0 74 72 75 65 20 74 68 65 6e 20 74 68 65 20 6c 61  true then the la
107c0 72 67 65 73 74 20 72 6f 77 69 64 20 66 6f 72 20  rgest rowid for 
107d0 74 68 65 20 63 75 72 72 65 6e 74 0a 20 20 20 20  the current.    
107e0 2a 2a 20 74 65 72 6d 20 6d 61 79 20 6e 6f 74 20  ** term may not 
107f0 62 65 20 73 74 6f 72 65 64 20 6f 6e 20 74 68 65  be stored on the
10800 20 63 75 72 72 65 6e 74 20 70 61 67 65 2e 20 53   current page. S
10810 6f 20 73 65 61 72 63 68 20 66 6f 72 77 61 72 64  o search forward
10820 20 74 6f 0a 20 20 20 20 2a 2a 20 73 65 65 20 77   to.    ** see w
10830 68 65 72 65 20 73 61 69 64 20 72 6f 77 69 64 20  here said rowid 
10840 72 65 61 6c 6c 79 20 69 73 2e 20 20 2a 2f 0a 20  really is.  */. 
10850 20 20 20 69 66 28 20 70 49 74 65 72 2d 3e 69 45     if( pIter->iE
10860 6e 64 6f 66 44 6f 63 6c 69 73 74 3e 3d 70 4c 65  ndofDoclist>=pLe
10870 61 66 2d 3e 73 7a 4c 65 61 66 20 29 7b 0a 20 20  af->szLeaf ){.  
10880 20 20 20 20 69 6e 74 20 70 67 6e 6f 3b 0a 20 20      int pgno;.  
10890 20 20 20 20 46 74 73 35 53 74 72 75 63 74 75 72      Fts5Structur
108a0 65 53 65 67 6d 65 6e 74 20 2a 70 53 65 67 20 3d  eSegment *pSeg =
108b0 20 70 49 74 65 72 2d 3e 70 53 65 67 3b 0a 0a 20   pIter->pSeg;.. 
108c0 20 20 20 20 20 2f 2a 20 54 68 65 20 6c 61 73 74       /* The last
108d0 20 72 6f 77 69 64 20 69 6e 20 74 68 65 20 64 6f   rowid in the do
108e0 63 6c 69 73 74 20 6d 61 79 20 6e 6f 74 20 62 65  clist may not be
108f0 20 6f 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20   on the current 
10900 70 61 67 65 2e 20 53 65 61 72 63 68 0a 20 20 20  page. Search.   
10910 20 20 20 2a 2a 20 66 6f 72 77 61 72 64 20 74 6f     ** forward to
10920 20 66 69 6e 64 20 74 68 65 20 70 61 67 65 20 63   find the page c
10930 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 6c 61  ontaining the la
10940 73 74 20 72 6f 77 69 64 2e 20 20 2a 2f 0a 20 20  st rowid.  */.  
10950 20 20 20 20 66 6f 72 28 70 67 6e 6f 3d 70 49 74      for(pgno=pIt
10960 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 2b 31 3b  er->iLeafPgno+1;
10970 20 21 70 2d 3e 72 63 20 26 26 20 70 67 6e 6f 3c   !p->rc && pgno<
10980 3d 70 53 65 67 2d 3e 70 67 6e 6f 4c 61 73 74 3b  =pSeg->pgnoLast;
10990 20 70 67 6e 6f 2b 2b 29 7b 0a 20 20 20 20 20 20   pgno++){.      
109a0 20 20 69 36 34 20 69 41 62 73 20 3d 20 46 54 53    i64 iAbs = FTS
109b0 35 5f 53 45 47 4d 45 4e 54 5f 52 4f 57 49 44 28  5_SEGMENT_ROWID(
109c0 70 53 65 67 2d 3e 69 53 65 67 69 64 2c 20 70 67  pSeg->iSegid, pg
109d0 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 46 74 73  no);.        Fts
109e0 35 44 61 74 61 20 2a 70 4e 65 77 20 3d 20 66 74  5Data *pNew = ft
109f0 73 35 44 61 74 61 52 65 61 64 28 70 2c 20 69 41  s5DataRead(p, iA
10a00 62 73 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  bs);.        if(
10a10 20 70 4e 65 77 20 29 7b 0a 20 20 20 20 20 20 20   pNew ){.       
10a20 20 20 20 69 6e 74 20 69 52 6f 77 69 64 2c 20 62     int iRowid, b
10a30 54 65 72 6d 6c 65 73 73 3b 0a 20 20 20 20 20 20  Termless;.      
10a40 20 20 20 20 69 52 6f 77 69 64 20 3d 20 66 74 73      iRowid = fts
10a50 35 4c 65 61 66 46 69 72 73 74 52 6f 77 69 64 4f  5LeafFirstRowidO
10a60 66 66 28 70 4e 65 77 29 3b 0a 20 20 20 20 20 20  ff(pNew);.      
10a70 20 20 20 20 62 54 65 72 6d 6c 65 73 73 20 3d 20      bTermless = 
10a80 66 74 73 35 4c 65 61 66 49 73 54 65 72 6d 6c 65  fts5LeafIsTermle
10a90 73 73 28 70 4e 65 77 29 3b 0a 20 20 20 20 20 20  ss(pNew);.      
10aa0 20 20 20 20 69 66 28 20 69 52 6f 77 69 64 20 29      if( iRowid )
10ab0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 53 57  {.            SW
10ac0 41 50 56 41 4c 28 46 74 73 35 44 61 74 61 2a 2c  APVAL(Fts5Data*,
10ad0 20 70 4e 65 77 2c 20 70 4c 61 73 74 29 3b 0a 20   pNew, pLast);. 
10ae0 20 20 20 20 20 20 20 20 20 20 20 70 67 6e 6f 4c             pgnoL
10af0 61 73 74 20 3d 20 70 67 6e 6f 3b 0a 20 20 20 20  ast = pgno;.    
10b00 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
10b10 20 20 66 74 73 35 44 61 74 61 52 65 6c 65 61 73    fts5DataReleas
10b20 65 28 70 4e 65 77 29 3b 0a 20 20 20 20 20 20 20  e(pNew);.       
10b30 20 20 20 69 66 28 20 62 54 65 72 6d 6c 65 73 73     if( bTermless
10b40 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ==0 ) break;.   
10b50 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
10b60 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49     }.  }..  /* I
10b70 66 20 70 4c 61 73 74 20 69 73 20 4e 55 4c 4c 20  f pLast is NULL 
10b80 61 74 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 74  at this point, t
10b90 68 65 6e 20 74 68 65 20 6c 61 73 74 20 72 6f 77  hen the last row
10ba0 69 64 20 66 6f 72 20 74 68 69 73 20 64 6f 63 6c  id for this docl
10bb0 69 73 74 0a 20 20 2a 2a 20 6c 69 65 73 20 6f 6e  ist.  ** lies on
10bc0 20 74 68 65 20 70 61 67 65 20 63 75 72 72 65 6e   the page curren
10bd0 74 6c 79 20 69 6e 64 69 63 61 74 65 64 20 62 79  tly indicated by
10be0 20 74 68 65 20 69 74 65 72 61 74 6f 72 2e 20 49   the iterator. I
10bf0 6e 20 74 68 69 73 20 63 61 73 65 20 0a 20 20 2a  n this case .  *
10c00 2a 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66  * pIter->iLeafOf
10c10 66 73 65 74 20 69 73 20 61 6c 72 65 61 64 79 20  fset is already 
10c20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20  set to point to 
10c30 74 68 65 20 70 6f 73 69 74 69 6f 6e 2d 6c 69 73  the position-lis
10c40 74 20 73 69 7a 65 0a 20 20 2a 2a 20 66 69 65 6c  t size.  ** fiel
10c50 64 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  d associated wit
10c60 68 20 74 68 65 20 66 69 72 73 74 20 72 65 6c 65  h the first rele
10c70 76 61 6e 74 20 72 6f 77 69 64 20 6f 6e 20 74 68  vant rowid on th
10c80 65 20 70 61 67 65 2e 0a 20 20 2a 2a 0a 20 20 2a  e page..  **.  *
10c90 2a 20 4f 72 2c 20 69 66 20 70 4c 61 73 74 20 69  * Or, if pLast i
10ca0 73 20 6e 6f 6e 2d 4e 55 4c 4c 2c 20 74 68 65 6e  s non-NULL, then
10cb0 20 69 74 20 69 73 20 74 68 65 20 70 61 67 65 20   it is the page 
10cc0 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68  that contains th
10cd0 65 20 6c 61 73 74 0a 20 20 2a 2a 20 72 6f 77 69  e last.  ** rowi
10ce0 64 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  d. In this case 
10cf0 63 6f 6e 66 69 67 75 72 65 20 74 68 65 20 69 74  configure the it
10d00 65 72 61 74 6f 72 20 73 6f 20 74 68 61 74 20 69  erator so that i
10d10 74 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 0a  t points to the.
10d20 20 20 2a 2a 20 66 69 72 73 74 20 72 6f 77 69 64    ** first rowid
10d30 20 6f 6e 20 74 68 69 73 20 70 61 67 65 2e 0a 20   on this page.. 
10d40 20 2a 2f 0a 20 20 69 66 28 20 70 4c 61 73 74 20   */.  if( pLast 
10d50 29 7b 0a 20 20 20 20 69 6e 74 20 69 4f 66 66 3b  ){.    int iOff;
10d60 0a 20 20 20 20 66 74 73 35 44 61 74 61 52 65 6c  .    fts5DataRel
10d70 65 61 73 65 28 70 49 74 65 72 2d 3e 70 4c 65 61  ease(pIter->pLea
10d80 66 29 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 70  f);.    pIter->p
10d90 4c 65 61 66 20 3d 20 70 4c 61 73 74 3b 0a 20 20  Leaf = pLast;.  
10da0 20 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 50 67    pIter->iLeafPg
10db0 6e 6f 20 3d 20 70 67 6e 6f 4c 61 73 74 3b 0a 20  no = pgnoLast;. 
10dc0 20 20 20 69 4f 66 66 20 3d 20 66 74 73 35 4c 65     iOff = fts5Le
10dd0 61 66 46 69 72 73 74 52 6f 77 69 64 4f 66 66 28  afFirstRowidOff(
10de0 70 4c 61 73 74 29 3b 0a 20 20 20 20 69 4f 66 66  pLast);.    iOff
10df0 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e   += fts5GetVarin
10e00 74 28 26 70 4c 61 73 74 2d 3e 70 5b 69 4f 66 66  t(&pLast->p[iOff
10e10 5d 2c 20 28 75 36 34 2a 29 26 70 49 74 65 72 2d  ], (u64*)&pIter-
10e20 3e 69 52 6f 77 69 64 29 3b 0a 20 20 20 20 70 49  >iRowid);.    pI
10e30 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74  ter->iLeafOffset
10e40 20 3d 20 69 4f 66 66 3b 0a 0a 20 20 20 20 69 66   = iOff;..    if
10e50 28 20 66 74 73 35 4c 65 61 66 49 73 54 65 72 6d  ( fts5LeafIsTerm
10e60 6c 65 73 73 28 70 4c 61 73 74 29 20 29 7b 0a 20  less(pLast) ){. 
10e70 20 20 20 20 20 70 49 74 65 72 2d 3e 69 45 6e 64       pIter->iEnd
10e80 6f 66 44 6f 63 6c 69 73 74 20 3d 20 70 4c 61 73  ofDoclist = pLas
10e90 74 2d 3e 6e 6e 2b 31 3b 0a 20 20 20 20 7d 65 6c  t->nn+1;.    }el
10ea0 73 65 7b 0a 20 20 20 20 20 20 70 49 74 65 72 2d  se{.      pIter-
10eb0 3e 69 45 6e 64 6f 66 44 6f 63 6c 69 73 74 20 3d  >iEndofDoclist =
10ec0 20 66 74 73 35 4c 65 61 66 46 69 72 73 74 54 65   fts5LeafFirstTe
10ed0 72 6d 4f 66 66 28 70 4c 61 73 74 29 3b 0a 20 20  rmOff(pLast);.  
10ee0 20 20 7d 0a 0a 20 20 7d 0a 0a 20 20 66 74 73 35    }..  }..  fts5
10ef0 53 65 67 49 74 65 72 52 65 76 65 72 73 65 49 6e  SegIterReverseIn
10f00 69 74 50 61 67 65 28 70 2c 20 70 49 74 65 72 29  itPage(p, pIter)
10f10 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 74 65 72 61  ;.}../*.** Itera
10f20 74 6f 72 20 70 49 74 65 72 20 63 75 72 72 65 6e  tor pIter curren
10f30 74 6c 79 20 70 6f 69 6e 74 73 20 74 6f 20 74 68  tly points to th
10f40 65 20 66 69 72 73 74 20 72 6f 77 69 64 20 6f 66  e first rowid of
10f50 20 61 20 64 6f 63 6c 69 73 74 2e 0a 2a 2a 20 54   a doclist..** T
10f60 68 65 72 65 20 69 73 20 61 20 64 6f 63 6c 69 73  here is a doclis
10f70 74 2d 69 6e 64 65 78 20 61 73 73 6f 63 69 61 74  t-index associat
10f80 65 64 20 77 69 74 68 20 74 68 65 20 66 69 6e 61  ed with the fina
10f90 6c 20 74 65 72 6d 20 6f 6e 20 74 68 65 20 63 75  l term on the cu
10fa0 72 72 65 6e 74 20 0a 2a 2a 20 70 61 67 65 2e 20  rrent .** page. 
10fb0 49 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 74  If the current t
10fc0 65 72 6d 20 69 73 20 74 68 65 20 6c 61 73 74 20  erm is the last 
10fd0 74 65 72 6d 20 6f 6e 20 74 68 65 20 70 61 67 65  term on the page
10fe0 2c 20 6c 6f 61 64 20 74 68 65 20 0a 2a 2a 20 64  , load the .** d
10ff0 6f 63 6c 69 73 74 2d 69 6e 64 65 78 20 66 72 6f  oclist-index fro
11000 6d 20 64 69 73 6b 20 61 6e 64 20 69 6e 69 74 69  m disk and initi
11010 61 6c 69 7a 65 20 61 6e 20 69 74 65 72 61 74 6f  alize an iterato
11020 72 20 61 74 20 28 70 49 74 65 72 2d 3e 70 44 6c  r at (pIter->pDl
11030 69 64 78 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  idx)..*/.static 
11040 76 6f 69 64 20 66 74 73 35 53 65 67 49 74 65 72  void fts5SegIter
11050 4c 6f 61 64 44 6c 69 64 78 28 46 74 73 35 49 6e  LoadDlidx(Fts5In
11060 64 65 78 20 2a 70 2c 20 46 74 73 35 53 65 67 49  dex *p, Fts5SegI
11070 74 65 72 20 2a 70 49 74 65 72 29 7b 0a 20 20 69  ter *pIter){.  i
11080 6e 74 20 69 53 65 67 20 3d 20 70 49 74 65 72 2d  nt iSeg = pIter-
11090 3e 70 53 65 67 2d 3e 69 53 65 67 69 64 3b 0a 20  >pSeg->iSegid;. 
110a0 20 69 6e 74 20 62 52 65 76 20 3d 20 28 70 49 74   int bRev = (pIt
110b0 65 72 2d 3e 66 6c 61 67 73 20 26 20 46 54 53 35  er->flags & FTS5
110c0 5f 53 45 47 49 54 45 52 5f 52 45 56 45 52 53 45  _SEGITER_REVERSE
110d0 29 3b 0a 20 20 46 74 73 35 44 61 74 61 20 2a 70  );.  Fts5Data *p
110e0 4c 65 61 66 20 3d 20 70 49 74 65 72 2d 3e 70 4c  Leaf = pIter->pL
110f0 65 61 66 3b 20 2f 2a 20 43 75 72 72 65 6e 74 20  eaf; /* Current 
11100 6c 65 61 66 20 64 61 74 61 20 2a 2f 0a 0a 20 20  leaf data */..  
11110 61 73 73 65 72 74 28 20 70 49 74 65 72 2d 3e 66  assert( pIter->f
11120 6c 61 67 73 20 26 20 46 54 53 35 5f 53 45 47 49  lags & FTS5_SEGI
11130 54 45 52 5f 4f 4e 45 54 45 52 4d 20 29 3b 0a 20  TER_ONETERM );. 
11140 20 61 73 73 65 72 74 28 20 70 49 74 65 72 2d 3e   assert( pIter->
11150 70 44 6c 69 64 78 3d 3d 30 20 29 3b 0a 0a 20 20  pDlidx==0 );..  
11160 2f 2a 20 43 68 65 63 6b 20 69 66 20 74 68 65 20  /* Check if the 
11170 63 75 72 72 65 6e 74 20 64 6f 63 6c 69 73 74 20  current doclist 
11180 65 6e 64 73 20 6f 6e 20 74 68 69 73 20 70 61 67  ends on this pag
11190 65 2e 20 49 66 20 69 74 20 64 6f 65 73 2c 20 72  e. If it does, r
111a0 65 74 75 72 6e 0a 20 20 2a 2a 20 65 61 72 6c 79  eturn.  ** early
111b0 20 77 69 74 68 6f 75 74 20 6c 6f 61 64 69 6e 67   without loading
111c0 20 74 68 65 20 64 6f 63 6c 69 73 74 2d 69 6e 64   the doclist-ind
111d0 65 78 20 28 61 73 20 69 74 20 62 65 6c 6f 6e 67  ex (as it belong
111e0 73 20 74 6f 20 61 20 64 69 66 66 65 72 65 6e 74  s to a different
111f0 0a 20 20 2a 2a 20 74 65 72 6d 2e 20 2a 2f 0a 20  .  ** term. */. 
11200 20 69 66 28 20 70 49 74 65 72 2d 3e 69 54 65 72   if( pIter->iTer
11210 6d 4c 65 61 66 50 67 6e 6f 3d 3d 70 49 74 65 72  mLeafPgno==pIter
11220 2d 3e 69 4c 65 61 66 50 67 6e 6f 20 0a 20 20 20  ->iLeafPgno .   
11230 26 26 20 70 49 74 65 72 2d 3e 69 45 6e 64 6f 66  && pIter->iEndof
11240 44 6f 63 6c 69 73 74 3c 70 4c 65 61 66 2d 3e 73  Doclist<pLeaf->s
11250 7a 4c 65 61 66 20 0a 20 20 29 7b 0a 20 20 20 20  zLeaf .  ){.    
11260 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20 70  return;.  }..  p
11270 49 74 65 72 2d 3e 70 44 6c 69 64 78 20 3d 20 66  Iter->pDlidx = f
11280 74 73 35 44 6c 69 64 78 49 74 65 72 49 6e 69 74  ts5DlidxIterInit
11290 28 70 2c 20 62 52 65 76 2c 20 69 53 65 67 2c 20  (p, bRev, iSeg, 
112a0 70 49 74 65 72 2d 3e 69 54 65 72 6d 4c 65 61 66  pIter->iTermLeaf
112b0 50 67 6e 6f 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Pgno);.}../*.** 
112c0 54 68 65 20 69 74 65 72 61 74 6f 72 20 6f 62 6a  The iterator obj
112d0 65 63 74 20 70 61 73 73 65 64 20 61 73 20 74 68  ect passed as th
112e0 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
112f0 74 20 63 75 72 72 65 6e 74 6c 79 20 63 6f 6e 74  t currently cont
11300 61 69 6e 73 0a 2a 2a 20 6e 6f 20 76 61 6c 69 64  ains.** no valid
11310 20 76 61 6c 75 65 73 20 65 78 63 65 70 74 20 66   values except f
11320 6f 72 20 74 68 65 20 46 74 73 35 53 65 67 49 74  or the Fts5SegIt
11330 65 72 2e 70 4c 65 61 66 20 6d 65 6d 62 65 72 20  er.pLeaf member 
11340 76 61 72 69 61 62 6c 65 2e 20 54 68 69 73 0a 2a  variable. This.*
11350 2a 20 66 75 6e 63 74 69 6f 6e 20 73 65 61 72 63  * function searc
11360 68 65 73 20 74 68 65 20 6c 65 61 66 20 70 61 67  hes the leaf pag
11370 65 20 66 6f 72 20 61 20 74 65 72 6d 20 6d 61 74  e for a term mat
11380 63 68 69 6e 67 20 28 70 54 65 72 6d 2f 6e 54 65  ching (pTerm/nTe
11390 72 6d 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  rm)..**.** If th
113a0 65 20 73 70 65 63 69 66 69 65 64 20 74 65 72 6d  e specified term
113b0 20 69 73 20 66 6f 75 6e 64 20 6f 6e 20 74 68 65   is found on the
113c0 20 70 61 67 65 2c 20 74 68 65 6e 20 74 68 65 20   page, then the 
113d0 69 74 65 72 61 74 6f 72 20 69 73 20 6c 65 66 74  iterator is left
113e0 0a 2a 2a 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20  .** pointing to 
113f0 69 74 2e 20 49 66 20 61 72 67 75 6d 65 6e 74 20  it. If argument 
11400 62 47 65 20 69 73 20 7a 65 72 6f 20 61 6e 64 20  bGe is zero and 
11410 74 68 65 20 74 65 72 6d 20 69 73 20 6e 6f 74 20  the term is not 
11420 66 6f 75 6e 64 2c 0a 2a 2a 20 74 68 65 20 69 74  found,.** the it
11430 65 72 61 74 6f 72 20 69 73 20 6c 65 66 74 20 70  erator is left p
11440 6f 69 6e 74 69 6e 67 20 61 74 20 45 4f 46 2e 0a  ointing at EOF..
11450 2a 2a 0a 2a 2a 20 49 66 20 62 47 65 20 69 73 20  **.** If bGe is 
11460 6e 6f 6e 2d 7a 65 72 6f 20 61 6e 64 20 74 68 65  non-zero and the
11470 20 73 70 65 63 69 66 69 65 64 20 74 65 72 6d 20   specified term 
11480 69 73 20 6e 6f 74 20 66 6f 75 6e 64 2c 20 74 68  is not found, th
11490 65 6e 20 74 68 65 0a 2a 2a 20 69 74 65 72 61 74  en the.** iterat
114a0 6f 72 20 69 73 20 6c 65 66 74 20 70 6f 69 6e 74  or is left point
114b0 69 6e 67 20 74 6f 20 74 68 65 20 73 6d 61 6c 6c  ing to the small
114c0 65 73 74 20 74 65 72 6d 20 69 6e 20 74 68 65 20  est term in the 
114d0 73 65 67 6d 65 6e 74 20 74 68 61 74 0a 2a 2a 20  segment that.** 
114e0 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74  is larger than t
114f0 68 65 20 73 70 65 63 69 66 69 65 64 20 74 65 72  he specified ter
11500 6d 2c 20 65 76 65 6e 20 69 66 20 74 68 69 73 20  m, even if this 
11510 74 65 72 6d 20 69 73 20 6e 6f 74 20 6f 6e 20 74  term is not on t
11520 68 65 0a 2a 2a 20 63 75 72 72 65 6e 74 20 70 61  he.** current pa
11530 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ge..*/.static vo
11540 69 64 20 66 74 73 35 4c 65 61 66 53 65 65 6b 28  id fts5LeafSeek(
11550 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c  .  Fts5Index *p,
11560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11570 20 20 20 2f 2a 20 4c 65 61 76 65 20 61 6e 79 20     /* Leave any 
11580 65 72 72 6f 72 20 63 6f 64 65 20 68 65 72 65 20  error code here 
11590 2a 2f 0a 20 20 69 6e 74 20 62 47 65 2c 20 20 20  */.  int bGe,   
115a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
115b0 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72       /* True for
115c0 20 61 20 3e 3d 20 73 65 61 72 63 68 20 2a 2f 0a   a >= search */.
115d0 20 20 46 74 73 35 53 65 67 49 74 65 72 20 2a 70    Fts5SegIter *p
115e0 49 74 65 72 2c 20 20 20 20 20 20 20 20 20 20 20  Iter,           
115f0 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 74 6f    /* Iterator to
11600 20 73 65 65 6b 20 2a 2f 0a 20 20 63 6f 6e 73 74   seek */.  const
11610 20 75 38 20 2a 70 54 65 72 6d 2c 20 69 6e 74 20   u8 *pTerm, int 
11620 6e 54 65 72 6d 20 20 20 20 20 20 2f 2a 20 54 65  nTerm      /* Te
11630 72 6d 20 74 6f 20 73 65 61 72 63 68 20 66 6f 72  rm to search for
11640 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 4f 66   */.){.  int iOf
11650 66 3b 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 61  f;.  const u8 *a
11660 20 3d 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d   = pIter->pLeaf-
11670 3e 70 3b 0a 20 20 69 6e 74 20 73 7a 4c 65 61 66  >p;.  int szLeaf
11680 20 3d 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d   = pIter->pLeaf-
11690 3e 73 7a 4c 65 61 66 3b 0a 20 20 69 6e 74 20 6e  >szLeaf;.  int n
116a0 20 3d 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d   = pIter->pLeaf-
116b0 3e 6e 6e 3b 0a 0a 20 20 69 6e 74 20 6e 4d 61 74  >nn;..  int nMat
116c0 63 68 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 4b  ch = 0;.  int nK
116d0 65 65 70 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e  eep = 0;.  int n
116e0 4e 65 77 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69  New = 0;.  int i
116f0 54 65 72 6d 4f 66 66 3b 0a 20 20 69 6e 74 20 69  TermOff;.  int i
11700 50 67 69 64 78 3b 20 20 20 20 20 20 20 20 20 20  Pgidx;          
11710 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75             /* Cu
11720 72 72 65 6e 74 20 6f 66 66 73 65 74 20 69 6e 20  rrent offset in 
11730 70 67 69 64 78 20 2a 2f 0a 20 20 69 6e 74 20 62  pgidx */.  int b
11740 45 6e 64 4f 66 50 61 67 65 20 3d 20 30 3b 0a 0a  EndOfPage = 0;..
11750 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72 63 3d    assert( p->rc=
11760 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 0a 20  =SQLITE_OK );.. 
11770 20 69 50 67 69 64 78 20 3d 20 73 7a 4c 65 61 66   iPgidx = szLeaf
11780 3b 0a 20 20 69 50 67 69 64 78 20 2b 3d 20 66 74  ;.  iPgidx += ft
11790 73 35 47 65 74 56 61 72 69 6e 74 33 32 28 26 61  s5GetVarint32(&a
117a0 5b 69 50 67 69 64 78 5d 2c 20 69 54 65 72 6d 4f  [iPgidx], iTermO
117b0 66 66 29 3b 0a 20 20 69 4f 66 66 20 3d 20 69 54  ff);.  iOff = iT
117c0 65 72 6d 4f 66 66 3b 0a 20 20 69 66 28 20 69 4f  ermOff;.  if( iO
117d0 66 66 3e 6e 20 29 7b 0a 20 20 20 20 70 2d 3e 72  ff>n ){.    p->r
117e0 63 20 3d 20 46 54 53 35 5f 43 4f 52 52 55 50 54  c = FTS5_CORRUPT
117f0 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  ;.    return;.  
11800 7d 0a 0a 20 20 77 68 69 6c 65 28 20 31 20 29 7b  }..  while( 1 ){
11810 0a 0a 20 20 20 20 2f 2a 20 46 69 67 75 72 65 20  ..    /* Figure 
11820 6f 75 74 20 68 6f 77 20 6d 61 6e 79 20 6e 65 77  out how many new
11830 20 62 79 74 65 73 20 61 72 65 20 69 6e 20 74 68   bytes are in th
11840 69 73 20 74 65 72 6d 20 2a 2f 0a 20 20 20 20 66  is term */.    f
11850 74 73 35 46 61 73 74 47 65 74 56 61 72 69 6e 74  ts5FastGetVarint
11860 33 32 28 61 2c 20 69 4f 66 66 2c 20 6e 4e 65 77  32(a, iOff, nNew
11870 29 3b 0a 20 20 20 20 69 66 28 20 6e 4b 65 65 70  );.    if( nKeep
11880 3c 6e 4d 61 74 63 68 20 29 7b 0a 20 20 20 20 20  <nMatch ){.     
11890 20 67 6f 74 6f 20 73 65 61 72 63 68 5f 66 61 69   goto search_fai
118a0 6c 65 64 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  led;.    }..    
118b0 61 73 73 65 72 74 28 20 6e 4b 65 65 70 3e 3d 6e  assert( nKeep>=n
118c0 4d 61 74 63 68 20 29 3b 0a 20 20 20 20 69 66 28  Match );.    if(
118d0 20 6e 4b 65 65 70 3d 3d 6e 4d 61 74 63 68 20 29   nKeep==nMatch )
118e0 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 43 6d 70  {.      int nCmp
118f0 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20  ;.      int i;. 
11900 20 20 20 20 20 6e 43 6d 70 20 3d 20 4d 49 4e 28       nCmp = MIN(
11910 6e 4e 65 77 2c 20 6e 54 65 72 6d 2d 6e 4d 61 74  nNew, nTerm-nMat
11920 63 68 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  ch);.      for(i
11930 3d 30 3b 20 69 3c 6e 43 6d 70 3b 20 69 2b 2b 29  =0; i<nCmp; i++)
11940 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 61 5b  {.        if( a[
11950 69 4f 66 66 2b 69 5d 21 3d 70 54 65 72 6d 5b 6e  iOff+i]!=pTerm[n
11960 4d 61 74 63 68 2b 69 5d 20 29 20 62 72 65 61 6b  Match+i] ) break
11970 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
11980 6e 4d 61 74 63 68 20 2b 3d 20 69 3b 0a 0a 20 20  nMatch += i;..  
11990 20 20 20 20 69 66 28 20 6e 54 65 72 6d 3d 3d 6e      if( nTerm==n
119a0 4d 61 74 63 68 20 29 7b 0a 20 20 20 20 20 20 20  Match ){.       
119b0 20 69 66 28 20 69 3d 3d 6e 4e 65 77 20 29 7b 0a   if( i==nNew ){.
119c0 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73            goto s
119d0 65 61 72 63 68 5f 73 75 63 63 65 73 73 3b 0a 20  earch_success;. 
119e0 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
119f0 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73 65 61          goto sea
11a00 72 63 68 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20  rch_failed;.    
11a10 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73      }.      }els
11a20 65 20 69 66 28 20 69 3c 6e 4e 65 77 20 26 26 20  e if( i<nNew && 
11a30 61 5b 69 4f 66 66 2b 69 5d 3e 70 54 65 72 6d 5b  a[iOff+i]>pTerm[
11a40 6e 4d 61 74 63 68 5d 20 29 7b 0a 20 20 20 20 20  nMatch] ){.     
11a50 20 20 20 67 6f 74 6f 20 73 65 61 72 63 68 5f 66     goto search_f
11a60 61 69 6c 65 64 3b 0a 20 20 20 20 20 20 7d 0a 20  ailed;.      }. 
11a70 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 69 50     }..    if( iP
11a80 67 69 64 78 3e 3d 6e 20 29 7b 0a 20 20 20 20 20  gidx>=n ){.     
11a90 20 62 45 6e 64 4f 66 50 61 67 65 20 3d 20 31 3b   bEndOfPage = 1;
11aa0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
11ab0 20 20 7d 0a 0a 20 20 20 20 69 50 67 69 64 78 20    }..    iPgidx 
11ac0 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e 74  += fts5GetVarint
11ad0 33 32 28 26 61 5b 69 50 67 69 64 78 5d 2c 20 6e  32(&a[iPgidx], n
11ae0 4b 65 65 70 29 3b 0a 20 20 20 20 69 54 65 72 6d  Keep);.    iTerm
11af0 4f 66 66 20 2b 3d 20 6e 4b 65 65 70 3b 0a 20 20  Off += nKeep;.  
11b00 20 20 69 4f 66 66 20 3d 20 69 54 65 72 6d 4f 66    iOff = iTermOf
11b10 66 3b 0a 0a 20 20 20 20 69 66 28 20 69 4f 66 66  f;..    if( iOff
11b20 3e 3d 6e 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e  >=n ){.      p->
11b30 72 63 20 3d 20 46 54 53 35 5f 43 4f 52 52 55 50  rc = FTS5_CORRUP
11b40 54 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b  T;.      return;
11b50 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52  .    }..    /* R
11b60 65 61 64 20 74 68 65 20 6e 4b 65 65 70 20 66 69  ead the nKeep fi
11b70 65 6c 64 20 6f 66 20 74 68 65 20 6e 65 78 74 20  eld of the next 
11b80 74 65 72 6d 2e 20 2a 2f 0a 20 20 20 20 66 74 73  term. */.    fts
11b90 35 46 61 73 74 47 65 74 56 61 72 69 6e 74 33 32  5FastGetVarint32
11ba0 28 61 2c 20 69 4f 66 66 2c 20 6e 4b 65 65 70 29  (a, iOff, nKeep)
11bb0 3b 0a 20 20 7d 0a 0a 20 73 65 61 72 63 68 5f 66  ;.  }.. search_f
11bc0 61 69 6c 65 64 3a 0a 20 20 69 66 28 20 62 47 65  ailed:.  if( bGe
11bd0 3d 3d 30 20 29 7b 0a 20 20 20 20 66 74 73 35 44  ==0 ){.    fts5D
11be0 61 74 61 52 65 6c 65 61 73 65 28 70 49 74 65 72  ataRelease(pIter
11bf0 2d 3e 70 4c 65 61 66 29 3b 0a 20 20 20 20 70 49  ->pLeaf);.    pI
11c00 74 65 72 2d 3e 70 4c 65 61 66 20 3d 20 30 3b 0a  ter->pLeaf = 0;.
11c10 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 65      return;.  }e
11c20 6c 73 65 20 69 66 28 20 62 45 6e 64 4f 66 50 61  lse if( bEndOfPa
11c30 67 65 20 29 7b 0a 20 20 20 20 64 6f 20 7b 0a 20  ge ){.    do {. 
11c40 20 20 20 20 20 66 74 73 35 53 65 67 49 74 65 72       fts5SegIter
11c50 4e 65 78 74 50 61 67 65 28 70 2c 20 70 49 74 65  NextPage(p, pIte
11c60 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49  r);.      if( pI
11c70 74 65 72 2d 3e 70 4c 65 61 66 3d 3d 30 20 29 20  ter->pLeaf==0 ) 
11c80 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 61 20  return;.      a 
11c90 3d 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e  = pIter->pLeaf->
11ca0 70 3b 0a 20 20 20 20 20 20 69 66 28 20 66 74 73  p;.      if( fts
11cb0 35 4c 65 61 66 49 73 54 65 72 6d 6c 65 73 73 28  5LeafIsTermless(
11cc0 70 49 74 65 72 2d 3e 70 4c 65 61 66 29 3d 3d 30  pIter->pLeaf)==0
11cd0 20 29 7b 0a 20 20 20 20 20 20 20 20 69 50 67 69   ){.        iPgi
11ce0 64 78 20 3d 20 70 49 74 65 72 2d 3e 70 4c 65 61  dx = pIter->pLea
11cf0 66 2d 3e 73 7a 4c 65 61 66 3b 0a 20 20 20 20 20  f->szLeaf;.     
11d00 20 20 20 69 50 67 69 64 78 20 2b 3d 20 66 74 73     iPgidx += fts
11d10 35 47 65 74 56 61 72 69 6e 74 33 32 28 26 70 49  5GetVarint32(&pI
11d20 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 70 5b 69 50  ter->pLeaf->p[iP
11d30 67 69 64 78 5d 2c 20 69 4f 66 66 29 3b 0a 20 20  gidx], iOff);.  
11d40 20 20 20 20 20 20 69 66 28 20 69 4f 66 66 3c 34        if( iOff<4
11d50 20 7c 7c 20 69 4f 66 66 3e 3d 70 49 74 65 72 2d   || iOff>=pIter-
11d60 3e 70 4c 65 61 66 2d 3e 73 7a 4c 65 61 66 20 29  >pLeaf->szLeaf )
11d70 7b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 72  {.          p->r
11d80 63 20 3d 20 46 54 53 35 5f 43 4f 52 52 55 50 54  c = FTS5_CORRUPT
11d90 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
11da0 0a 20 20 20 20 20 20 20 20 20 20 6e 4b 65 65 70  .          nKeep
11db0 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
11dc0 69 54 65 72 6d 4f 66 66 20 3d 20 69 4f 66 66 3b  iTermOff = iOff;
11dd0 0a 20 20 20 20 20 20 20 20 20 20 6e 20 3d 20 70  .          n = p
11de0 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 6e 6e 3b  Iter->pLeaf->nn;
11df0 0a 20 20 20 20 20 20 20 20 20 20 69 4f 66 66 20  .          iOff 
11e00 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e 74  += fts5GetVarint
11e10 33 32 28 26 61 5b 69 4f 66 66 5d 2c 20 6e 4e 65  32(&a[iOff], nNe
11e20 77 29 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72  w);.          br
11e30 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  eak;.        }. 
11e40 20 20 20 20 20 7d 0a 20 20 20 20 7d 77 68 69 6c       }.    }whil
11e50 65 28 20 31 20 29 3b 0a 20 20 7d 0a 0a 20 73 65  e( 1 );.  }.. se
11e60 61 72 63 68 5f 73 75 63 63 65 73 73 3a 0a 0a 20  arch_success:.. 
11e70 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66   pIter->iLeafOff
11e80 73 65 74 20 3d 20 69 4f 66 66 20 2b 20 6e 4e 65  set = iOff + nNe
11e90 77 3b 0a 20 20 70 49 74 65 72 2d 3e 69 54 65 72  w;.  pIter->iTer
11ea0 6d 4c 65 61 66 4f 66 66 73 65 74 20 3d 20 70 49  mLeafOffset = pI
11eb0 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74  ter->iLeafOffset
11ec0 3b 0a 20 20 70 49 74 65 72 2d 3e 69 54 65 72 6d  ;.  pIter->iTerm
11ed0 4c 65 61 66 50 67 6e 6f 20 3d 20 70 49 74 65 72  LeafPgno = pIter
11ee0 2d 3e 69 4c 65 61 66 50 67 6e 6f 3b 0a 0a 20 20  ->iLeafPgno;..  
11ef0 66 74 73 35 42 75 66 66 65 72 53 65 74 28 26 70  fts5BufferSet(&p
11f00 2d 3e 72 63 2c 20 26 70 49 74 65 72 2d 3e 74 65  ->rc, &pIter->te
11f10 72 6d 2c 20 6e 4b 65 65 70 2c 20 70 54 65 72 6d  rm, nKeep, pTerm
11f20 29 3b 0a 20 20 66 74 73 35 42 75 66 66 65 72 41  );.  fts5BufferA
11f30 70 70 65 6e 64 42 6c 6f 62 28 26 70 2d 3e 72 63  ppendBlob(&p->rc
11f40 2c 20 26 70 49 74 65 72 2d 3e 74 65 72 6d 2c 20  , &pIter->term, 
11f50 6e 4e 65 77 2c 20 26 61 5b 69 4f 66 66 5d 29 3b  nNew, &a[iOff]);
11f60 0a 0a 20 20 69 66 28 20 69 50 67 69 64 78 3e 3d  ..  if( iPgidx>=
11f70 6e 20 29 7b 0a 20 20 20 20 70 49 74 65 72 2d 3e  n ){.    pIter->
11f80 69 45 6e 64 6f 66 44 6f 63 6c 69 73 74 20 3d 20  iEndofDoclist = 
11f90 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 6e 6e  pIter->pLeaf->nn
11fa0 2b 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  +1;.  }else{.   
11fb0 20 69 6e 74 20 6e 45 78 74 72 61 3b 0a 20 20 20   int nExtra;.   
11fc0 20 69 50 67 69 64 78 20 2b 3d 20 66 74 73 35 47   iPgidx += fts5G
11fd0 65 74 56 61 72 69 6e 74 33 32 28 26 61 5b 69 50  etVarint32(&a[iP
11fe0 67 69 64 78 5d 2c 20 6e 45 78 74 72 61 29 3b 0a  gidx], nExtra);.
11ff0 20 20 20 20 70 49 74 65 72 2d 3e 69 45 6e 64 6f      pIter->iEndo
12000 66 44 6f 63 6c 69 73 74 20 3d 20 69 54 65 72 6d  fDoclist = iTerm
12010 4f 66 66 20 2b 20 6e 45 78 74 72 61 3b 0a 20 20  Off + nExtra;.  
12020 7d 0a 20 20 70 49 74 65 72 2d 3e 69 50 67 69 64  }.  pIter->iPgid
12030 78 4f 66 66 20 3d 20 69 50 67 69 64 78 3b 0a 0a  xOff = iPgidx;..
12040 20 20 66 74 73 35 53 65 67 49 74 65 72 4c 6f 61    fts5SegIterLoa
12050 64 52 6f 77 69 64 28 70 2c 20 70 49 74 65 72 29  dRowid(p, pIter)
12060 3b 0a 20 20 66 74 73 35 53 65 67 49 74 65 72 4c  ;.  fts5SegIterL
12070 6f 61 64 4e 50 6f 73 28 70 2c 20 70 49 74 65 72  oadNPos(p, pIter
12080 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 73 71 6c  );.}..static sql
12090 69 74 65 33 5f 73 74 6d 74 20 2a 66 74 73 35 49  ite3_stmt *fts5I
120a0 64 78 53 65 6c 65 63 74 53 74 6d 74 28 46 74 73  dxSelectStmt(Fts
120b0 35 49 6e 64 65 78 20 2a 70 29 7b 0a 20 20 69 66  5Index *p){.  if
120c0 28 20 70 2d 3e 70 49 64 78 53 65 6c 65 63 74 3d  ( p->pIdxSelect=
120d0 3d 30 20 29 7b 0a 20 20 20 20 46 74 73 35 43 6f  =0 ){.    Fts5Co
120e0 6e 66 69 67 20 2a 70 43 6f 6e 66 69 67 20 3d 20  nfig *pConfig = 
120f0 70 2d 3e 70 43 6f 6e 66 69 67 3b 0a 20 20 20 20  p->pConfig;.    
12100 66 74 73 35 49 6e 64 65 78 50 72 65 70 61 72 65  fts5IndexPrepare
12110 53 74 6d 74 28 70 2c 20 26 70 2d 3e 70 49 64 78  Stmt(p, &p->pIdx
12120 53 65 6c 65 63 74 2c 20 73 71 6c 69 74 65 33 5f  Select, sqlite3_
12130 6d 70 72 69 6e 74 66 28 0a 20 20 20 20 20 20 20  mprintf(.       
12140 20 20 20 22 53 45 4c 45 43 54 20 70 67 6e 6f 20     "SELECT pgno 
12150 46 52 4f 4d 20 27 25 71 27 2e 27 25 71 5f 69 64  FROM '%q'.'%q_id
12160 78 27 20 57 48 45 52 45 20 22 0a 20 20 20 20 20  x' WHERE ".     
12170 20 20 20 20 20 22 73 65 67 69 64 3d 3f 20 41 4e       "segid=? AN
12180 44 20 74 65 72 6d 3c 3d 3f 20 4f 52 44 45 52 20  D term<=? ORDER 
12190 42 59 20 74 65 72 6d 20 44 45 53 43 20 4c 49 4d  BY term DESC LIM
121a0 49 54 20 31 22 2c 0a 20 20 20 20 20 20 20 20 20  IT 1",.         
121b0 20 70 43 6f 6e 66 69 67 2d 3e 7a 44 62 2c 20 70   pConfig->zDb, p
121c0 43 6f 6e 66 69 67 2d 3e 7a 4e 61 6d 65 0a 20 20  Config->zName.  
121d0 20 20 29 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75    ));.  }.  retu
121e0 72 6e 20 70 2d 3e 70 49 64 78 53 65 6c 65 63 74  rn p->pIdxSelect
121f0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69  ;.}../*.** Initi
12200 61 6c 69 7a 65 20 74 68 65 20 6f 62 6a 65 63 74  alize the object
12210 20 70 49 74 65 72 20 74 6f 20 70 6f 69 6e 74 20   pIter to point 
12220 74 6f 20 74 65 72 6d 20 70 54 65 72 6d 2f 6e 54  to term pTerm/nT
12230 65 72 6d 20 77 69 74 68 69 6e 20 73 65 67 6d 65  erm within segme
12240 6e 74 0a 2a 2a 20 70 53 65 67 2e 20 49 66 20 74  nt.** pSeg. If t
12250 68 65 72 65 20 69 73 20 6e 6f 20 73 75 63 68 20  here is no such 
12260 74 65 72 6d 20 69 6e 20 74 68 65 20 69 6e 64 65  term in the inde
12270 78 2c 20 74 68 65 20 69 74 65 72 61 74 6f 72 20  x, the iterator 
12280 69 73 20 73 65 74 20 74 6f 20 45 4f 46 2e 0a 2a  is set to EOF..*
12290 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72  *.** If an error
122a0 20 6f 63 63 75 72 73 2c 20 46 74 73 35 49 6e 64   occurs, Fts5Ind
122b0 65 78 2e 72 63 20 69 73 20 73 65 74 20 74 6f 20  ex.rc is set to 
122c0 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65 20 65  an appropriate e
122d0 72 72 6f 72 20 63 6f 64 65 2e 20 49 66 20 0a 2a  rror code. If .*
122e0 2a 20 61 6e 20 65 72 72 6f 72 20 68 61 73 20 61  * an error has a
122f0 6c 72 65 61 64 79 20 6f 63 63 75 72 72 65 64 20  lready occurred 
12300 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69  when this functi
12310 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20 69 74  on is called, it
12320 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a   is a no-op..*/.
12330 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
12340 53 65 67 49 74 65 72 53 65 65 6b 49 6e 69 74 28  SegIterSeekInit(
12350 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c  .  Fts5Index *p,
12360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12370 20 20 20 2f 2a 20 46 54 53 35 20 62 61 63 6b 65     /* FTS5 backe
12380 6e 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 75 38  nd */.  const u8
12390 20 2a 70 54 65 72 6d 2c 20 69 6e 74 20 6e 54 65   *pTerm, int nTe
123a0 72 6d 2c 20 20 20 20 20 2f 2a 20 54 65 72 6d 20  rm,     /* Term 
123b0 74 6f 20 73 65 65 6b 20 74 6f 20 2a 2f 0a 20 20  to seek to */.  
123c0 69 6e 74 20 66 6c 61 67 73 2c 20 20 20 20 20 20  int flags,      
123d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
123e0 2f 2a 20 4d 61 73 6b 20 6f 66 20 46 54 53 35 49  /* Mask of FTS5I
123f0 4e 44 45 58 5f 58 58 58 20 66 6c 61 67 73 20 2a  NDEX_XXX flags *
12400 2f 0a 20 20 46 74 73 35 53 74 72 75 63 74 75 72  /.  Fts5Structur
12410 65 53 65 67 6d 65 6e 74 20 2a 70 53 65 67 2c 20  eSegment *pSeg, 
12420 20 20 20 20 2f 2a 20 44 65 73 63 72 69 70 74 69      /* Descripti
12430 6f 6e 20 6f 66 20 73 65 67 6d 65 6e 74 20 2a 2f  on of segment */
12440 0a 20 20 46 74 73 35 53 65 67 49 74 65 72 20 2a  .  Fts5SegIter *
12450 70 49 74 65 72 20 20 20 20 20 20 20 20 20 20 20  pIter           
12460 20 20 20 2f 2a 20 4f 62 6a 65 63 74 20 74 6f 20     /* Object to 
12470 70 6f 70 75 6c 61 74 65 20 2a 2f 0a 29 7b 0a 20  populate */.){. 
12480 20 69 6e 74 20 69 50 67 20 3d 20 31 3b 0a 20 20   int iPg = 1;.  
12490 69 6e 74 20 62 47 65 20 3d 20 28 66 6c 61 67 73  int bGe = (flags
124a0 20 26 20 46 54 53 35 49 4e 44 45 58 5f 51 55 45   & FTS5INDEX_QUE
124b0 52 59 5f 53 43 41 4e 29 3b 0a 20 20 69 6e 74 20  RY_SCAN);.  int 
124c0 62 44 6c 69 64 78 20 3d 20 30 3b 20 20 20 20 20  bDlidx = 0;     
124d0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
124e0 72 75 65 20 69 66 20 74 68 65 72 65 20 69 73 20  rue if there is 
124f0 61 20 64 6f 63 6c 69 73 74 2d 69 6e 64 65 78 20  a doclist-index 
12500 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  */.  sqlite3_stm
12510 74 20 2a 70 49 64 78 53 65 6c 65 63 74 20 3d 20  t *pIdxSelect = 
12520 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 62 47  0;..  assert( bG
12530 65 3d 3d 30 20 7c 7c 20 28 66 6c 61 67 73 20 26  e==0 || (flags &
12540 20 46 54 53 35 49 4e 44 45 58 5f 51 55 45 52 59   FTS5INDEX_QUERY
12550 5f 44 45 53 43 29 3d 3d 30 20 29 3b 0a 20 20 61  _DESC)==0 );.  a
12560 73 73 65 72 74 28 20 70 54 65 72 6d 20 26 26 20  ssert( pTerm && 
12570 6e 54 65 72 6d 20 29 3b 0a 20 20 6d 65 6d 73 65  nTerm );.  memse
12580 74 28 70 49 74 65 72 2c 20 30 2c 20 73 69 7a 65  t(pIter, 0, size
12590 6f 66 28 2a 70 49 74 65 72 29 29 3b 0a 20 20 70  of(*pIter));.  p
125a0 49 74 65 72 2d 3e 70 53 65 67 20 3d 20 70 53 65  Iter->pSeg = pSe
125b0 67 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 62 6c  g;..  /* This bl
125c0 6f 63 6b 20 73 65 74 73 20 73 74 61 63 6b 20 76  ock sets stack v
125d0 61 72 69 61 62 6c 65 20 69 50 67 20 74 6f 20 74  ariable iPg to t
125e0 68 65 20 6c 65 61 66 20 70 61 67 65 20 6e 75 6d  he leaf page num
125f0 62 65 72 20 74 68 61 74 20 6d 61 79 0a 20 20 2a  ber that may.  *
12600 2a 20 63 6f 6e 74 61 69 6e 20 74 65 72 6d 20 28  * contain term (
12610 70 54 65 72 6d 2f 6e 54 65 72 6d 29 2c 20 69 66  pTerm/nTerm), if
12620 20 69 74 20 69 73 20 70 72 65 73 65 6e 74 20 69   it is present i
12630 6e 20 74 68 65 20 73 65 67 6d 65 6e 74 2e 20 2a  n the segment. *
12640 2f 0a 20 20 70 49 64 78 53 65 6c 65 63 74 20 3d  /.  pIdxSelect =
12650 20 66 74 73 35 49 64 78 53 65 6c 65 63 74 53 74   fts5IdxSelectSt
12660 6d 74 28 70 29 3b 0a 20 20 69 66 28 20 70 2d 3e  mt(p);.  if( p->
12670 72 63 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 73  rc ) return;.  s
12680 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 28  qlite3_bind_int(
12690 70 49 64 78 53 65 6c 65 63 74 2c 20 31 2c 20 70  pIdxSelect, 1, p
126a0 53 65 67 2d 3e 69 53 65 67 69 64 29 3b 0a 20 20  Seg->iSegid);.  
126b0 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 62 6c 6f  sqlite3_bind_blo
126c0 62 28 70 49 64 78 53 65 6c 65 63 74 2c 20 32 2c  b(pIdxSelect, 2,
126d0 20 70 54 65 72 6d 2c 20 6e 54 65 72 6d 2c 20 53   pTerm, nTerm, S
126e0 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20  QLITE_STATIC);. 
126f0 20 69 66 28 20 53 51 4c 49 54 45 5f 52 4f 57 3d   if( SQLITE_ROW=
12700 3d 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 49  =sqlite3_step(pI
12710 64 78 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20  dxSelect) ){.   
12720 20 69 36 34 20 76 61 6c 20 3d 20 73 71 6c 69 74   i64 val = sqlit
12730 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 49  e3_column_int(pI
12740 64 78 53 65 6c 65 63 74 2c 20 30 29 3b 0a 20 20  dxSelect, 0);.  
12750 20 20 69 50 67 20 3d 20 28 69 6e 74 29 28 76 61    iPg = (int)(va
12760 6c 3e 3e 31 29 3b 0a 20 20 20 20 62 44 6c 69 64  l>>1);.    bDlid
12770 78 20 3d 20 28 76 61 6c 20 26 20 30 78 30 30 30  x = (val & 0x000
12780 31 29 3b 0a 20 20 7d 0a 20 20 70 2d 3e 72 63 20  1);.  }.  p->rc 
12790 3d 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28  = sqlite3_reset(
127a0 70 49 64 78 53 65 6c 65 63 74 29 3b 0a 0a 20 20  pIdxSelect);..  
127b0 69 66 28 20 69 50 67 3c 70 53 65 67 2d 3e 70 67  if( iPg<pSeg->pg
127c0 6e 6f 46 69 72 73 74 20 29 7b 0a 20 20 20 20 69  noFirst ){.    i
127d0 50 67 20 3d 20 70 53 65 67 2d 3e 70 67 6e 6f 46  Pg = pSeg->pgnoF
127e0 69 72 73 74 3b 0a 20 20 20 20 62 44 6c 69 64 78  irst;.    bDlidx
127f0 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 70 49 74   = 0;.  }..  pIt
12800 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 20 3d 20  er->iLeafPgno = 
12810 69 50 67 20 2d 20 31 3b 0a 20 20 66 74 73 35 53  iPg - 1;.  fts5S
12820 65 67 49 74 65 72 4e 65 78 74 50 61 67 65 28 70  egIterNextPage(p
12830 2c 20 70 49 74 65 72 29 3b 0a 0a 20 20 69 66 28  , pIter);..  if(
12840 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 20 29 7b   pIter->pLeaf ){
12850 0a 20 20 20 20 66 74 73 35 4c 65 61 66 53 65 65  .    fts5LeafSee
12860 6b 28 70 2c 20 62 47 65 2c 20 70 49 74 65 72 2c  k(p, bGe, pIter,
12870 20 70 54 65 72 6d 2c 20 6e 54 65 72 6d 29 3b 0a   pTerm, nTerm);.
12880 20 20 7d 0a 0a 20 20 69 66 28 20 70 2d 3e 72 63    }..  if( p->rc
12890 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 62  ==SQLITE_OK && b
128a0 47 65 3d 3d 30 20 29 7b 0a 20 20 20 20 70 49 74  Ge==0 ){.    pIt
128b0 65 72 2d 3e 66 6c 61 67 73 20 7c 3d 20 46 54 53  er->flags |= FTS
128c0 35 5f 53 45 47 49 54 45 52 5f 4f 4e 45 54 45 52  5_SEGITER_ONETER
128d0 4d 3b 0a 20 20 20 20 69 66 28 20 70 49 74 65 72  M;.    if( pIter
128e0 2d 3e 70 4c 65 61 66 20 29 7b 0a 20 20 20 20 20  ->pLeaf ){.     
128f0 20 69 66 28 20 66 6c 61 67 73 20 26 20 46 54 53   if( flags & FTS
12900 35 49 4e 44 45 58 5f 51 55 45 52 59 5f 44 45 53  5INDEX_QUERY_DES
12910 43 20 29 7b 0a 20 20 20 20 20 20 20 20 70 49 74  C ){.        pIt
12920 65 72 2d 3e 66 6c 61 67 73 20 7c 3d 20 46 54 53  er->flags |= FTS
12930 35 5f 53 45 47 49 54 45 52 5f 52 45 56 45 52 53  5_SEGITER_REVERS
12940 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  E;.      }.     
12950 20 69 66 28 20 62 44 6c 69 64 78 20 29 7b 0a 20   if( bDlidx ){. 
12960 20 20 20 20 20 20 20 66 74 73 35 53 65 67 49 74         fts5SegIt
12970 65 72 4c 6f 61 64 44 6c 69 64 78 28 70 2c 20 70  erLoadDlidx(p, p
12980 49 74 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Iter);.      }. 
12990 20 20 20 20 20 69 66 28 20 66 6c 61 67 73 20 26       if( flags &
129a0 20 46 54 53 35 49 4e 44 45 58 5f 51 55 45 52 59   FTS5INDEX_QUERY
129b0 5f 44 45 53 43 20 29 7b 0a 20 20 20 20 20 20 20  _DESC ){.       
129c0 20 66 74 73 35 53 65 67 49 74 65 72 52 65 76 65   fts5SegIterReve
129d0 72 73 65 28 70 2c 20 70 49 74 65 72 29 3b 0a 20  rse(p, pIter);. 
129e0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
129f0 0a 0a 20 20 66 74 73 35 53 65 67 49 74 65 72 53  ..  fts5SegIterS
12a00 65 74 4e 65 78 74 28 70 2c 20 70 49 74 65 72 29  etNext(p, pIter)
12a10 3b 0a 0a 20 20 2f 2a 20 45 69 74 68 65 72 3a 0a  ;..  /* Either:.
12a20 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 31 29 20 61    **.  **   1) a
12a30 6e 20 65 72 72 6f 72 20 68 61 73 20 6f 63 63 75  n error has occu
12a40 72 72 65 64 2c 20 6f 72 0a 20 20 2a 2a 20 20 20  rred, or.  **   
12a50 32 29 20 74 68 65 20 69 74 65 72 61 74 6f 72 20  2) the iterator 
12a60 70 6f 69 6e 74 73 20 74 6f 20 45 4f 46 2c 20 6f  points to EOF, o
12a70 72 0a 20 20 2a 2a 20 20 20 33 29 20 74 68 65 20  r.  **   3) the 
12a80 69 74 65 72 61 74 6f 72 20 70 6f 69 6e 74 73 20  iterator points 
12a90 74 6f 20 61 6e 20 65 6e 74 72 79 20 77 69 74 68  to an entry with
12aa0 20 74 65 72 6d 20 28 70 54 65 72 6d 2f 6e 54 65   term (pTerm/nTe
12ab0 72 6d 29 2c 20 6f 72 0a 20 20 2a 2a 20 20 20 34  rm), or.  **   4
12ac0 29 20 74 68 65 20 46 54 53 35 49 4e 44 45 58 5f  ) the FTS5INDEX_
12ad0 51 55 45 52 59 5f 53 43 41 4e 20 66 6c 61 67 20  QUERY_SCAN flag 
12ae0 77 61 73 20 73 65 74 20 61 6e 64 20 74 68 65 20  was set and the 
12af0 69 74 65 72 61 74 6f 72 20 70 6f 69 6e 74 73 0a  iterator points.
12b00 20 20 2a 2a 20 20 20 20 20 20 74 6f 20 61 6e 20    **      to an 
12b10 65 6e 74 72 79 20 77 69 74 68 20 61 20 74 65 72  entry with a ter
12b20 6d 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 6f  m greater than o
12b30 72 20 65 71 75 61 6c 20 74 6f 20 28 70 54 65 72  r equal to (pTer
12b40 6d 2f 6e 54 65 72 6d 29 2e 0a 20 20 2a 2f 0a 20  m/nTerm)..  */. 
12b50 20 61 73 73 65 72 74 28 20 70 2d 3e 72 63 21 3d   assert( p->rc!=
12b60 53 51 4c 49 54 45 5f 4f 4b 20 20 20 20 20 20 20  SQLITE_OK       
12b70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12b80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12b90 20 20 20 2f 2a 20 31 20 2a 2f 0a 20 20 20 7c 7c     /* 1 */.   ||
12ba0 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 3d 3d 30   pIter->pLeaf==0
12bb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12bc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12bd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
12be0 2a 20 32 20 2a 2f 0a 20 20 20 7c 7c 20 66 74 73  * 2 */.   || fts
12bf0 35 42 75 66 66 65 72 43 6f 6d 70 61 72 65 42 6c  5BufferCompareBl
12c00 6f 62 28 26 70 49 74 65 72 2d 3e 74 65 72 6d 2c  ob(&pIter->term,
12c10 20 70 54 65 72 6d 2c 20 6e 54 65 72 6d 29 3d 3d   pTerm, nTerm)==
12c20 30 20 20 20 20 20 20 20 20 20 20 2f 2a 20 33 20  0          /* 3 
12c30 2a 2f 0a 20 20 20 7c 7c 20 28 62 47 65 20 26 26  */.   || (bGe &&
12c40 20 66 74 73 35 42 75 66 66 65 72 43 6f 6d 70 61   fts5BufferCompa
12c50 72 65 42 6c 6f 62 28 26 70 49 74 65 72 2d 3e 74  reBlob(&pIter->t
12c60 65 72 6d 2c 20 70 54 65 72 6d 2c 20 6e 54 65 72  erm, pTerm, nTer
12c70 6d 29 3e 30 29 20 20 2f 2a 20 34 20 2a 2f 0a 20  m)>0)  /* 4 */. 
12c80 20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69   );.}../*.** Ini
12c90 74 69 61 6c 69 7a 65 20 74 68 65 20 6f 62 6a 65  tialize the obje
12ca0 63 74 20 70 49 74 65 72 20 74 6f 20 70 6f 69 6e  ct pIter to poin
12cb0 74 20 74 6f 20 74 65 72 6d 20 70 54 65 72 6d 2f  t to term pTerm/
12cc0 6e 54 65 72 6d 20 77 69 74 68 69 6e 20 74 68 65  nTerm within the
12cd0 0a 2a 2a 20 69 6e 2d 6d 65 6d 6f 72 79 20 68 61  .** in-memory ha
12ce0 73 68 20 74 61 62 6c 65 2e 20 49 66 20 74 68 65  sh table. If the
12cf0 72 65 20 69 73 20 6e 6f 20 73 75 63 68 20 74 65  re is no such te
12d00 72 6d 20 69 6e 20 74 68 65 20 68 61 73 68 2d 74  rm in the hash-t
12d10 61 62 6c 65 2c 20 74 68 65 20 0a 2a 2a 20 69 74  able, the .** it
12d20 65 72 61 74 6f 72 20 69 73 20 73 65 74 20 74 6f  erator is set to
12d30 20 45 4f 46 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61   EOF..**.** If a
12d40 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  n error occurs, 
12d50 46 74 73 35 49 6e 64 65 78 2e 72 63 20 69 73 20  Fts5Index.rc is 
12d60 73 65 74 20 74 6f 20 61 6e 20 61 70 70 72 6f 70  set to an approp
12d70 72 69 61 74 65 20 65 72 72 6f 72 20 63 6f 64 65  riate error code
12d80 2e 20 49 66 20 0a 2a 2a 20 61 6e 20 65 72 72 6f  . If .** an erro
12d90 72 20 68 61 73 20 61 6c 72 65 61 64 79 20 6f 63  r has already oc
12da0 63 75 72 72 65 64 20 77 68 65 6e 20 74 68 69 73  curred when this
12db0 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
12dc0 6c 65 64 2c 20 69 74 20 69 73 20 61 20 6e 6f 2d  led, it is a no-
12dd0 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  op..*/.static vo
12de0 69 64 20 66 74 73 35 53 65 67 49 74 65 72 48 61  id fts5SegIterHa
12df0 73 68 49 6e 69 74 28 0a 20 20 46 74 73 35 49 6e  shInit(.  Fts5In
12e00 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20 20  dex *p,         
12e10 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53            /* FTS
12e20 35 20 62 61 63 6b 65 6e 64 20 2a 2f 0a 20 20 63  5 backend */.  c
12e30 6f 6e 73 74 20 75 38 20 2a 70 54 65 72 6d 2c 20  onst u8 *pTerm, 
12e40 69 6e 74 20 6e 54 65 72 6d 2c 20 20 20 20 20 2f  int nTerm,     /
12e50 2a 20 54 65 72 6d 20 74 6f 20 73 65 65 6b 20 74  * Term to seek t
12e60 6f 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73  o */.  int flags
12e70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
12e80 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f         /* Mask o
12e90 66 20 46 54 53 35 49 4e 44 45 58 5f 58 58 58 20  f FTS5INDEX_XXX 
12ea0 66 6c 61 67 73 20 2a 2f 0a 20 20 46 74 73 35 53  flags */.  Fts5S
12eb0 65 67 49 74 65 72 20 2a 70 49 74 65 72 20 20 20  egIter *pIter   
12ec0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 62             /* Ob
12ed0 6a 65 63 74 20 74 6f 20 70 6f 70 75 6c 61 74 65  ject to populate
12ee0 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 75   */.){.  const u
12ef0 38 20 2a 70 4c 69 73 74 20 3d 20 30 3b 0a 20 20  8 *pList = 0;.  
12f00 69 6e 74 20 6e 4c 69 73 74 20 3d 20 30 3b 0a 20  int nList = 0;. 
12f10 20 63 6f 6e 73 74 20 75 38 20 2a 7a 20 3d 20 30   const u8 *z = 0
12f20 3b 0a 20 20 69 6e 74 20 6e 20 3d 20 30 3b 0a 0a  ;.  int n = 0;..
12f30 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 48 61    assert( p->pHa
12f40 73 68 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  sh );.  assert( 
12f50 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
12f60 20 29 3b 0a 0a 20 20 69 66 28 20 70 54 65 72 6d   );..  if( pTerm
12f70 3d 3d 30 20 7c 7c 20 28 66 6c 61 67 73 20 26 20  ==0 || (flags & 
12f80 46 54 53 35 49 4e 44 45 58 5f 51 55 45 52 59 5f  FTS5INDEX_QUERY_
12f90 53 43 41 4e 29 20 29 7b 0a 20 20 20 20 70 2d 3e  SCAN) ){.    p->
12fa0 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74 73 35  rc = sqlite3Fts5
12fb0 48 61 73 68 53 63 61 6e 49 6e 69 74 28 70 2d 3e  HashScanInit(p->
12fc0 70 48 61 73 68 2c 20 28 63 6f 6e 73 74 20 63 68  pHash, (const ch
12fd0 61 72 2a 29 70 54 65 72 6d 2c 20 6e 54 65 72 6d  ar*)pTerm, nTerm
12fe0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 46 74  );.    sqlite3Ft
12ff0 73 35 48 61 73 68 53 63 61 6e 45 6e 74 72 79 28  s5HashScanEntry(
13000 70 2d 3e 70 48 61 73 68 2c 20 28 63 6f 6e 73 74  p->pHash, (const
13010 20 63 68 61 72 2a 2a 29 26 7a 2c 20 26 70 4c 69   char**)&z, &pLi
13020 73 74 2c 20 26 6e 4c 69 73 74 29 3b 0a 20 20 20  st, &nList);.   
13030 20 6e 20 3d 20 28 7a 20 3f 20 28 69 6e 74 29 73   n = (z ? (int)s
13040 74 72 6c 65 6e 28 28 63 6f 6e 73 74 20 63 68 61  trlen((const cha
13050 72 2a 29 7a 29 20 3a 20 30 29 3b 0a 20 20 7d 65  r*)z) : 0);.  }e
13060 6c 73 65 7b 0a 20 20 20 20 70 49 74 65 72 2d 3e  lse{.    pIter->
13070 66 6c 61 67 73 20 7c 3d 20 46 54 53 35 5f 53 45  flags |= FTS5_SE
13080 47 49 54 45 52 5f 4f 4e 45 54 45 52 4d 3b 0a 20  GITER_ONETERM;. 
13090 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 48 61     sqlite3Fts5Ha
130a0 73 68 51 75 65 72 79 28 70 2d 3e 70 48 61 73 68  shQuery(p->pHash
130b0 2c 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 70  , (const char*)p
130c0 54 65 72 6d 2c 20 6e 54 65 72 6d 2c 20 26 70 4c  Term, nTerm, &pL
130d0 69 73 74 2c 20 26 6e 4c 69 73 74 29 3b 0a 20 20  ist, &nList);.  
130e0 20 20 7a 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20    z = pTerm;.   
130f0 20 6e 20 3d 20 6e 54 65 72 6d 3b 0a 20 20 7d 0a   n = nTerm;.  }.
13100 0a 20 20 69 66 28 20 70 4c 69 73 74 20 29 7b 0a  .  if( pList ){.
13110 20 20 20 20 46 74 73 35 44 61 74 61 20 2a 70 4c      Fts5Data *pL
13120 65 61 66 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  eaf;.    sqlite3
13130 46 74 73 35 42 75 66 66 65 72 53 65 74 28 26 70  Fts5BufferSet(&p
13140 2d 3e 72 63 2c 20 26 70 49 74 65 72 2d 3e 74 65  ->rc, &pIter->te
13150 72 6d 2c 20 6e 2c 20 7a 29 3b 0a 20 20 20 20 70  rm, n, z);.    p
13160 4c 65 61 66 20 3d 20 66 74 73 35 49 64 78 4d 61  Leaf = fts5IdxMa
13170 6c 6c 6f 63 28 70 2c 20 73 69 7a 65 6f 66 28 46  lloc(p, sizeof(F
13180 74 73 35 44 61 74 61 29 29 3b 0a 20 20 20 20 69  ts5Data));.    i
13190 66 28 20 70 4c 65 61 66 3d 3d 30 20 29 20 72 65  f( pLeaf==0 ) re
131a0 74 75 72 6e 3b 0a 20 20 20 20 70 4c 65 61 66 2d  turn;.    pLeaf-
131b0 3e 70 20 3d 20 28 75 38 2a 29 70 4c 69 73 74 3b  >p = (u8*)pList;
131c0 0a 20 20 20 20 70 4c 65 61 66 2d 3e 6e 6e 20 3d  .    pLeaf->nn =
131d0 20 70 4c 65 61 66 2d 3e 73 7a 4c 65 61 66 20 3d   pLeaf->szLeaf =
131e0 20 6e 4c 69 73 74 3b 0a 20 20 20 20 70 49 74 65   nList;.    pIte
131f0 72 2d 3e 70 4c 65 61 66 20 3d 20 70 4c 65 61 66  r->pLeaf = pLeaf
13200 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 69 4c 65  ;.    pIter->iLe
13210 61 66 4f 66 66 73 65 74 20 3d 20 66 74 73 35 47  afOffset = fts5G
13220 65 74 56 61 72 69 6e 74 28 70 4c 65 61 66 2d 3e  etVarint(pLeaf->
13230 70 2c 20 28 75 36 34 2a 29 26 70 49 74 65 72 2d  p, (u64*)&pIter-
13240 3e 69 52 6f 77 69 64 29 3b 0a 20 20 20 20 70 49  >iRowid);.    pI
13250 74 65 72 2d 3e 69 45 6e 64 6f 66 44 6f 63 6c 69  ter->iEndofDocli
13260 73 74 20 3d 20 70 4c 65 61 66 2d 3e 6e 6e 3b 0a  st = pLeaf->nn;.
13270 0a 20 20 20 20 69 66 28 20 66 6c 61 67 73 20 26  .    if( flags &
13280 20 46 54 53 35 49 4e 44 45 58 5f 51 55 45 52 59   FTS5INDEX_QUERY
13290 5f 44 45 53 43 20 29 7b 0a 20 20 20 20 20 20 70  _DESC ){.      p
132a0 49 74 65 72 2d 3e 66 6c 61 67 73 20 7c 3d 20 46  Iter->flags |= F
132b0 54 53 35 5f 53 45 47 49 54 45 52 5f 52 45 56 45  TS5_SEGITER_REVE
132c0 52 53 45 3b 0a 20 20 20 20 20 20 66 74 73 35 53  RSE;.      fts5S
132d0 65 67 49 74 65 72 52 65 76 65 72 73 65 49 6e 69  egIterReverseIni
132e0 74 50 61 67 65 28 70 2c 20 70 49 74 65 72 29 3b  tPage(p, pIter);
132f0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
13300 20 20 66 74 73 35 53 65 67 49 74 65 72 4c 6f 61    fts5SegIterLoa
13310 64 4e 50 6f 73 28 70 2c 20 70 49 74 65 72 29 3b  dNPos(p, pIter);
13320 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 66 74  .    }.  }..  ft
13330 73 35 53 65 67 49 74 65 72 53 65 74 4e 65 78 74  s5SegIterSetNext
13340 28 70 2c 20 70 49 74 65 72 29 3b 0a 7d 0a 0a 2f  (p, pIter);.}../
13350 2a 0a 2a 2a 20 5a 65 72 6f 20 74 68 65 20 69 74  *.** Zero the it
13360 65 72 61 74 6f 72 20 70 61 73 73 65 64 20 61 73  erator passed as
13370 20 74 68 65 20 6f 6e 6c 79 20 61 72 67 75 6d 65   the only argume
13380 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  nt..*/.static vo
13390 69 64 20 66 74 73 35 53 65 67 49 74 65 72 43 6c  id fts5SegIterCl
133a0 65 61 72 28 46 74 73 35 53 65 67 49 74 65 72 20  ear(Fts5SegIter 
133b0 2a 70 49 74 65 72 29 7b 0a 20 20 66 74 73 35 42  *pIter){.  fts5B
133c0 75 66 66 65 72 46 72 65 65 28 26 70 49 74 65 72  ufferFree(&pIter
133d0 2d 3e 74 65 72 6d 29 3b 0a 20 20 66 74 73 35 44  ->term);.  fts5D
133e0 61 74 61 52 65 6c 65 61 73 65 28 70 49 74 65 72  ataRelease(pIter
133f0 2d 3e 70 4c 65 61 66 29 3b 0a 20 20 66 74 73 35  ->pLeaf);.  fts5
13400 44 61 74 61 52 65 6c 65 61 73 65 28 70 49 74 65  DataRelease(pIte
13410 72 2d 3e 70 4e 65 78 74 4c 65 61 66 29 3b 0a 20  r->pNextLeaf);. 
13420 20 66 74 73 35 44 6c 69 64 78 49 74 65 72 46 72   fts5DlidxIterFr
13430 65 65 28 70 49 74 65 72 2d 3e 70 44 6c 69 64 78  ee(pIter->pDlidx
13440 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  );.  sqlite3_fre
13450 65 28 70 49 74 65 72 2d 3e 61 52 6f 77 69 64 4f  e(pIter->aRowidO
13460 66 66 73 65 74 29 3b 0a 20 20 6d 65 6d 73 65 74  ffset);.  memset
13470 28 70 49 74 65 72 2c 20 30 2c 20 73 69 7a 65 6f  (pIter, 0, sizeo
13480 66 28 46 74 73 35 53 65 67 49 74 65 72 29 29 3b  f(Fts5SegIter));
13490 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .}..#ifdef SQLIT
134a0 45 5f 44 45 42 55 47 0a 0a 2f 2a 0a 2a 2a 20 54  E_DEBUG../*.** T
134b0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
134c0 75 73 65 64 20 61 73 20 70 61 72 74 20 6f 66 20  used as part of 
134d0 74 68 65 20 62 69 67 20 61 73 73 65 72 74 28 29  the big assert()
134e0 20 70 72 6f 63 65 64 75 72 65 20 69 6d 70 6c 65   procedure imple
134f0 6d 65 6e 74 65 64 20 62 79 0a 2a 2a 20 66 74 73  mented by.** fts
13500 35 41 73 73 65 72 74 4d 75 6c 74 69 49 74 65 72  5AssertMultiIter
13510 53 65 74 75 70 28 29 2e 20 49 74 20 65 6e 73 75  Setup(). It ensu
13520 72 65 73 20 74 68 61 74 20 74 68 65 20 72 65 73  res that the res
13530 75 6c 74 20 63 75 72 72 65 6e 74 6c 79 20 73 74  ult currently st
13540 6f 72 65 64 0a 2a 2a 20 69 6e 20 2a 70 52 65 73  ored.** in *pRes
13550 20 69 73 20 74 68 65 20 63 6f 72 72 65 63 74 20   is the correct 
13560 72 65 73 75 6c 74 20 6f 66 20 63 6f 6d 70 61 72  result of compar
13570 69 6e 67 20 74 68 65 20 63 75 72 72 65 6e 74 20  ing the current 
13580 70 6f 73 69 74 69 6f 6e 73 20 6f 66 20 74 68 65  positions of the
13590 0a 2a 2a 20 74 77 6f 20 69 74 65 72 61 74 6f 72  .** two iterator
135a0 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  s..*/.static voi
135b0 64 20 66 74 73 35 41 73 73 65 72 74 43 6f 6d 70  d fts5AssertComp
135c0 61 72 69 73 6f 6e 52 65 73 75 6c 74 28 0a 20 20  arisonResult(.  
135d0 46 74 73 35 49 74 65 72 20 2a 70 49 74 65 72 2c  Fts5Iter *pIter,
135e0 20 0a 20 20 46 74 73 35 53 65 67 49 74 65 72 20   .  Fts5SegIter 
135f0 2a 70 31 2c 0a 20 20 46 74 73 35 53 65 67 49 74  *p1,.  Fts5SegIt
13600 65 72 20 2a 70 32 2c 0a 20 20 46 74 73 35 43 52  er *p2,.  Fts5CR
13610 65 73 75 6c 74 20 2a 70 52 65 73 0a 29 7b 0a 20  esult *pRes.){. 
13620 20 69 6e 74 20 69 31 20 3d 20 70 31 20 2d 20 70   int i1 = p1 - p
13630 49 74 65 72 2d 3e 61 53 65 67 3b 0a 20 20 69 6e  Iter->aSeg;.  in
13640 74 20 69 32 20 3d 20 70 32 20 2d 20 70 49 74 65  t i2 = p2 - pIte
13650 72 2d 3e 61 53 65 67 3b 0a 0a 20 20 69 66 28 20  r->aSeg;..  if( 
13660 70 31 2d 3e 70 4c 65 61 66 20 7c 7c 20 70 32 2d  p1->pLeaf || p2-
13670 3e 70 4c 65 61 66 20 29 7b 0a 20 20 20 20 69 66  >pLeaf ){.    if
13680 28 20 70 31 2d 3e 70 4c 65 61 66 3d 3d 30 20 29  ( p1->pLeaf==0 )
13690 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
136a0 70 52 65 73 2d 3e 69 46 69 72 73 74 3d 3d 69 32  pRes->iFirst==i2
136b0 20 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66   );.    }else if
136c0 28 20 70 32 2d 3e 70 4c 65 61 66 3d 3d 30 20 29  ( p2->pLeaf==0 )
136d0 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
136e0 70 52 65 73 2d 3e 69 46 69 72 73 74 3d 3d 69 31  pRes->iFirst==i1
136f0 20 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   );.    }else{. 
13700 20 20 20 20 20 69 6e 74 20 6e 4d 69 6e 20 3d 20       int nMin = 
13710 4d 49 4e 28 70 31 2d 3e 74 65 72 6d 2e 6e 2c 20  MIN(p1->term.n, 
13720 70 32 2d 3e 74 65 72 6d 2e 6e 29 3b 0a 20 20 20  p2->term.n);.   
13730 20 20 20 69 6e 74 20 72 65 73 20 3d 20 6d 65 6d     int res = mem
13740 63 6d 70 28 70 31 2d 3e 74 65 72 6d 2e 70 2c 20  cmp(p1->term.p, 
13750 70 32 2d 3e 74 65 72 6d 2e 70 2c 20 6e 4d 69 6e  p2->term.p, nMin
13760 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 65 73  );.      if( res
13770 3d 3d 30 20 29 20 72 65 73 20 3d 20 70 31 2d 3e  ==0 ) res = p1->
13780 74 65 72 6d 2e 6e 20 2d 20 70 32 2d 3e 74 65 72  term.n - p2->ter
13790 6d 2e 6e 3b 0a 0a 20 20 20 20 20 20 69 66 28 20  m.n;..      if( 
137a0 72 65 73 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  res==0 ){.      
137b0 20 20 61 73 73 65 72 74 28 20 70 52 65 73 2d 3e    assert( pRes->
137c0 62 54 65 72 6d 45 71 3d 3d 31 20 29 3b 0a 20 20  bTermEq==1 );.  
137d0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 31        assert( p1
137e0 2d 3e 69 52 6f 77 69 64 21 3d 70 32 2d 3e 69 52  ->iRowid!=p2->iR
137f0 6f 77 69 64 20 29 3b 0a 20 20 20 20 20 20 20 20  owid );.        
13800 72 65 73 20 3d 20 28 28 70 31 2d 3e 69 52 6f 77  res = ((p1->iRow
13810 69 64 20 3e 20 70 32 2d 3e 69 52 6f 77 69 64 29  id > p2->iRowid)
13820 3d 3d 70 49 74 65 72 2d 3e 62 52 65 76 29 20 3f  ==pIter->bRev) ?
13830 20 2d 31 20 3a 20 31 3b 0a 20 20 20 20 20 20 7d   -1 : 1;.      }
13840 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61 73  else{.        as
13850 73 65 72 74 28 20 70 52 65 73 2d 3e 62 54 65 72  sert( pRes->bTer
13860 6d 45 71 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  mEq==0 );.      
13870 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 72 65 73  }..      if( res
13880 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73  <0 ){.        as
13890 73 65 72 74 28 20 70 52 65 73 2d 3e 69 46 69 72  sert( pRes->iFir
138a0 73 74 3d 3d 69 31 20 29 3b 0a 20 20 20 20 20 20  st==i1 );.      
138b0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61  }else{.        a
138c0 73 73 65 72 74 28 20 70 52 65 73 2d 3e 69 46 69  ssert( pRes->iFi
138d0 72 73 74 3d 3d 69 32 20 29 3b 0a 20 20 20 20 20  rst==i2 );.     
138e0 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a   }.    }.  }.}..
138f0 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
13900 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 20 75  ion is a no-op u
13910 6e 6c 65 73 73 20 53 51 4c 49 54 45 5f 44 45 42  nless SQLITE_DEB
13920 55 47 20 69 73 20 64 65 66 69 6e 65 64 20 77 68  UG is defined wh
13930 65 6e 20 74 68 69 73 20 6d 6f 64 75 6c 65 0a 2a  en this module.*
13940 2a 20 69 73 20 63 6f 6d 70 69 6c 65 64 2e 20 49  * is compiled. I
13950 6e 20 74 68 61 74 20 63 61 73 65 2c 20 74 68 69  n that case, thi
13960 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 65 73  s function is es
13970 73 65 6e 74 69 61 6c 6c 79 20 61 6e 20 61 73 73  sentially an ass
13980 65 72 74 28 29 20 0a 2a 2a 20 73 74 61 74 65 6d  ert() .** statem
13990 65 6e 74 20 75 73 65 64 20 74 6f 20 76 65 72 69  ent used to veri
139a0 66 79 20 74 68 61 74 20 74 68 65 20 63 6f 6e 74  fy that the cont
139b0 65 6e 74 73 20 6f 66 20 74 68 65 20 70 49 74 65  ents of the pIte
139c0 72 2d 3e 61 46 69 72 73 74 5b 5d 20 61 72 72 61  r->aFirst[] arra
139d0 79 0a 2a 2a 20 61 72 65 20 63 6f 72 72 65 63 74  y.** are correct
139e0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
139f0 20 66 74 73 35 41 73 73 65 72 74 4d 75 6c 74 69   fts5AssertMulti
13a00 49 74 65 72 53 65 74 75 70 28 46 74 73 35 49 6e  IterSetup(Fts5In
13a10 64 65 78 20 2a 70 2c 20 46 74 73 35 49 74 65 72  dex *p, Fts5Iter
13a20 20 2a 70 49 74 65 72 29 7b 0a 20 20 69 66 28 20   *pIter){.  if( 
13a30 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
13a40 20 29 7b 0a 20 20 20 20 46 74 73 35 53 65 67 49   ){.    Fts5SegI
13a50 74 65 72 20 2a 70 46 69 72 73 74 20 3d 20 26 70  ter *pFirst = &p
13a60 49 74 65 72 2d 3e 61 53 65 67 5b 20 70 49 74 65  Iter->aSeg[ pIte
13a70 72 2d 3e 61 46 69 72 73 74 5b 31 5d 2e 69 46 69  r->aFirst[1].iFi
13a80 72 73 74 20 5d 3b 0a 20 20 20 20 69 6e 74 20 69  rst ];.    int i
13a90 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 28  ;..    assert( (
13aa0 70 46 69 72 73 74 2d 3e 70 4c 65 61 66 3d 3d 30  pFirst->pLeaf==0
13ab0 29 3d 3d 70 49 74 65 72 2d 3e 62 61 73 65 2e 62  )==pIter->base.b
13ac0 45 6f 66 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 43  Eof );..    /* C
13ad0 68 65 63 6b 20 74 68 61 74 20 70 49 74 65 72 2d  heck that pIter-
13ae0 3e 69 53 77 69 74 63 68 52 6f 77 69 64 20 69 73  >iSwitchRowid is
13af0 20 73 65 74 20 63 6f 72 72 65 63 74 6c 79 2e 20   set correctly. 
13b00 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  */.    for(i=0; 
13b10 69 3c 70 49 74 65 72 2d 3e 6e 53 65 67 3b 20 69  i<pIter->nSeg; i
13b20 2b 2b 29 7b 0a 20 20 20 20 20 20 46 74 73 35 53  ++){.      Fts5S
13b30 65 67 49 74 65 72 20 2a 70 31 20 3d 20 26 70 49  egIter *p1 = &pI
13b40 74 65 72 2d 3e 61 53 65 67 5b 69 5d 3b 0a 20 20  ter->aSeg[i];.  
13b50 20 20 20 20 61 73 73 65 72 74 28 20 70 31 3d 3d      assert( p1==
13b60 70 46 69 72 73 74 20 0a 20 20 20 20 20 20 20 20  pFirst .        
13b70 20 20 20 7c 7c 20 70 31 2d 3e 70 4c 65 61 66 3d     || p1->pLeaf=
13b80 3d 30 20 0a 20 20 20 20 20 20 20 20 20 20 20 7c  =0 .           |
13b90 7c 20 66 74 73 35 42 75 66 66 65 72 43 6f 6d 70  | fts5BufferComp
13ba0 61 72 65 28 26 70 46 69 72 73 74 2d 3e 74 65 72  are(&pFirst->ter
13bb0 6d 2c 20 26 70 31 2d 3e 74 65 72 6d 29 20 0a 20  m, &p1->term) . 
13bc0 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 31 2d            || p1-
13bd0 3e 69 52 6f 77 69 64 3d 3d 70 49 74 65 72 2d 3e  >iRowid==pIter->
13be0 69 53 77 69 74 63 68 52 6f 77 69 64 0a 20 20 20  iSwitchRowid.   
13bf0 20 20 20 20 20 20 20 20 7c 7c 20 28 70 31 2d 3e          || (p1->
13c00 69 52 6f 77 69 64 3c 70 49 74 65 72 2d 3e 69 53  iRowid<pIter->iS
13c10 77 69 74 63 68 52 6f 77 69 64 29 3d 3d 70 49 74  witchRowid)==pIt
13c20 65 72 2d 3e 62 52 65 76 0a 20 20 20 20 20 20 29  er->bRev.      )
13c30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 66 6f 72  ;.    }..    for
13c40 28 69 3d 30 3b 20 69 3c 70 49 74 65 72 2d 3e 6e  (i=0; i<pIter->n
13c50 53 65 67 3b 20 69 2b 3d 32 29 7b 0a 20 20 20 20  Seg; i+=2){.    
13c60 20 20 46 74 73 35 53 65 67 49 74 65 72 20 2a 70    Fts5SegIter *p
13c70 31 20 3d 20 26 70 49 74 65 72 2d 3e 61 53 65 67  1 = &pIter->aSeg
13c80 5b 69 5d 3b 0a 20 20 20 20 20 20 46 74 73 35 53  [i];.      Fts5S
13c90 65 67 49 74 65 72 20 2a 70 32 20 3d 20 26 70 49  egIter *p2 = &pI
13ca0 74 65 72 2d 3e 61 53 65 67 5b 69 2b 31 5d 3b 0a  ter->aSeg[i+1];.
13cb0 20 20 20 20 20 20 46 74 73 35 43 52 65 73 75 6c        Fts5CResul
13cc0 74 20 2a 70 52 65 73 20 3d 20 26 70 49 74 65 72  t *pRes = &pIter
13cd0 2d 3e 61 46 69 72 73 74 5b 28 70 49 74 65 72 2d  ->aFirst[(pIter-
13ce0 3e 6e 53 65 67 20 2b 20 69 29 20 2f 20 32 5d 3b  >nSeg + i) / 2];
13cf0 0a 20 20 20 20 20 20 66 74 73 35 41 73 73 65 72  .      fts5Asser
13d00 74 43 6f 6d 70 61 72 69 73 6f 6e 52 65 73 75 6c  tComparisonResul
13d10 74 28 70 49 74 65 72 2c 20 70 31 2c 20 70 32 2c  t(pIter, p1, p2,
13d20 20 70 52 65 73 29 3b 0a 20 20 20 20 7d 0a 0a 20   pRes);.    }.. 
13d30 20 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 28 70     for(i=1; i<(p
13d40 49 74 65 72 2d 3e 6e 53 65 67 20 2f 20 32 29 3b  Iter->nSeg / 2);
13d50 20 69 2b 3d 32 29 7b 0a 20 20 20 20 20 20 46 74   i+=2){.      Ft
13d60 73 35 53 65 67 49 74 65 72 20 2a 70 31 20 3d 20  s5SegIter *p1 = 
13d70 26 70 49 74 65 72 2d 3e 61 53 65 67 5b 20 70 49  &pIter->aSeg[ pI
13d80 74 65 72 2d 3e 61 46 69 72 73 74 5b 69 2a 32 5d  ter->aFirst[i*2]
13d90 2e 69 46 69 72 73 74 20 5d 3b 0a 20 20 20 20 20  .iFirst ];.     
13da0 20 46 74 73 35 53 65 67 49 74 65 72 20 2a 70 32   Fts5SegIter *p2
13db0 20 3d 20 26 70 49 74 65 72 2d 3e 61 53 65 67 5b   = &pIter->aSeg[
13dc0 20 70 49 74 65 72 2d 3e 61 46 69 72 73 74 5b 69   pIter->aFirst[i
13dd0 2a 32 2b 31 5d 2e 69 46 69 72 73 74 20 5d 3b 0a  *2+1].iFirst ];.
13de0 20 20 20 20 20 20 46 74 73 35 43 52 65 73 75 6c        Fts5CResul
13df0 74 20 2a 70 52 65 73 20 3d 20 26 70 49 74 65 72  t *pRes = &pIter
13e00 2d 3e 61 46 69 72 73 74 5b 69 5d 3b 0a 20 20 20  ->aFirst[i];.   
13e10 20 20 20 66 74 73 35 41 73 73 65 72 74 43 6f 6d     fts5AssertCom
13e20 70 61 72 69 73 6f 6e 52 65 73 75 6c 74 28 70 49  parisonResult(pI
13e30 74 65 72 2c 20 70 31 2c 20 70 32 2c 20 70 52 65  ter, p1, p2, pRe
13e40 73 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  s);.    }.  }.}.
13e50 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 66  #else.# define f
13e60 74 73 35 41 73 73 65 72 74 4d 75 6c 74 69 49 74  ts5AssertMultiIt
13e70 65 72 53 65 74 75 70 28 78 2c 79 29 0a 23 65 6e  erSetup(x,y).#en
13e80 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20 74 68  dif../*.** Do th
13e90 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6e 65 63  e comparison nec
13ea0 65 73 73 61 72 79 20 74 6f 20 70 6f 70 75 6c 61  essary to popula
13eb0 74 65 20 70 49 74 65 72 2d 3e 61 46 69 72 73 74  te pIter->aFirst
13ec0 5b 69 4f 75 74 5d 2e 0a 2a 2a 0a 2a 2a 20 49 66  [iOut]..**.** If
13ed0 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 76 61   the returned va
13ee0 6c 75 65 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c  lue is non-zero,
13ef0 20 74 68 65 6e 20 69 74 20 69 73 20 74 68 65 20   then it is the 
13f00 69 6e 64 65 78 20 6f 66 20 61 6e 20 65 6e 74 72  index of an entr
13f10 79 0a 2a 2a 20 69 6e 20 74 68 65 20 70 49 74 65  y.** in the pIte
13f20 72 2d 3e 61 53 65 67 5b 5d 20 61 72 72 61 79 20  r->aSeg[] array 
13f30 74 68 61 74 20 69 73 20 28 61 29 20 6e 6f 74 20  that is (a) not 
13f40 61 74 20 45 4f 46 2c 20 61 6e 64 20 28 62 29 20  at EOF, and (b) 
13f50 70 6f 69 6e 74 69 6e 67 0a 2a 2a 20 74 6f 20 61  pointing.** to a
13f60 20 6b 65 79 20 74 68 61 74 20 69 73 20 61 20 64   key that is a d
13f70 75 70 6c 69 63 61 74 65 20 6f 66 20 61 6e 6f 74  uplicate of anot
13f80 68 65 72 2c 20 68 69 67 68 65 72 20 70 72 69 6f  her, higher prio
13f90 72 69 74 79 2c 20 0a 2a 2a 20 73 65 67 6d 65 6e  rity, .** segmen
13fa0 74 2d 69 74 65 72 61 74 6f 72 20 69 6e 20 74 68  t-iterator in th
13fb0 65 20 70 53 65 67 2d 3e 61 53 65 67 5b 5d 20 61  e pSeg->aSeg[] a
13fc0 72 72 61 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rray..*/.static 
13fd0 69 6e 74 20 66 74 73 35 4d 75 6c 74 69 49 74 65  int fts5MultiIte
13fe0 72 44 6f 43 6f 6d 70 61 72 65 28 46 74 73 35 49  rDoCompare(Fts5I
13ff0 74 65 72 20 2a 70 49 74 65 72 2c 20 69 6e 74 20  ter *pIter, int 
14000 69 4f 75 74 29 7b 0a 20 20 69 6e 74 20 69 31 3b  iOut){.  int i1;
14010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14020 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
14030 78 20 6f 66 20 6c 65 66 74 2d 68 61 6e 64 20 46  x of left-hand F
14040 74 73 35 53 65 67 49 74 65 72 20 2a 2f 0a 20 20  ts5SegIter */.  
14050 69 6e 74 20 69 32 3b 20 20 20 20 20 20 20 20 20  int i2;         
14060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14070 2f 2a 20 49 6e 64 65 78 20 6f 66 20 72 69 67 68  /* Index of righ
14080 74 2d 68 61 6e 64 20 46 74 73 35 53 65 67 49 74  t-hand Fts5SegIt
14090 65 72 20 2a 2f 0a 20 20 69 6e 74 20 69 52 65 73  er */.  int iRes
140a0 3b 0a 20 20 46 74 73 35 53 65 67 49 74 65 72 20  ;.  Fts5SegIter 
140b0 2a 70 31 3b 20 20 20 20 20 20 20 20 20 20 20 20  *p1;            
140c0 20 20 20 20 2f 2a 20 4c 65 66 74 2d 68 61 6e 64      /* Left-hand
140d0 20 46 74 73 35 53 65 67 49 74 65 72 20 2a 2f 0a   Fts5SegIter */.
140e0 20 20 46 74 73 35 53 65 67 49 74 65 72 20 2a 70    Fts5SegIter *p
140f0 32 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  2;              
14100 20 20 2f 2a 20 52 69 67 68 74 2d 68 61 6e 64 20    /* Right-hand 
14110 46 74 73 35 53 65 67 49 74 65 72 20 2a 2f 0a 20  Fts5SegIter */. 
14120 20 46 74 73 35 43 52 65 73 75 6c 74 20 2a 70 52   Fts5CResult *pR
14130 65 73 20 3d 20 26 70 49 74 65 72 2d 3e 61 46 69  es = &pIter->aFi
14140 72 73 74 5b 69 4f 75 74 5d 3b 0a 0a 20 20 61 73  rst[iOut];..  as
14150 73 65 72 74 28 20 69 4f 75 74 3c 70 49 74 65 72  sert( iOut<pIter
14160 2d 3e 6e 53 65 67 20 26 26 20 69 4f 75 74 3e 30  ->nSeg && iOut>0
14170 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 49   );.  assert( pI
14180 74 65 72 2d 3e 62 52 65 76 3d 3d 30 20 7c 7c 20  ter->bRev==0 || 
14190 70 49 74 65 72 2d 3e 62 52 65 76 3d 3d 31 20 29  pIter->bRev==1 )
141a0 3b 0a 0a 20 20 69 66 28 20 69 4f 75 74 3e 3d 28  ;..  if( iOut>=(
141b0 70 49 74 65 72 2d 3e 6e 53 65 67 2f 32 29 20 29  pIter->nSeg/2) )
141c0 7b 0a 20 20 20 20 69 31 20 3d 20 28 69 4f 75 74  {.    i1 = (iOut
141d0 20 2d 20 70 49 74 65 72 2d 3e 6e 53 65 67 2f 32   - pIter->nSeg/2
141e0 29 20 2a 20 32 3b 0a 20 20 20 20 69 32 20 3d 20  ) * 2;.    i2 = 
141f0 69 31 20 2b 20 31 3b 0a 20 20 7d 65 6c 73 65 7b  i1 + 1;.  }else{
14200 0a 20 20 20 20 69 31 20 3d 20 70 49 74 65 72 2d  .    i1 = pIter-
14210 3e 61 46 69 72 73 74 5b 69 4f 75 74 2a 32 5d 2e  >aFirst[iOut*2].
14220 69 46 69 72 73 74 3b 0a 20 20 20 20 69 32 20 3d  iFirst;.    i2 =
14230 20 70 49 74 65 72 2d 3e 61 46 69 72 73 74 5b 69   pIter->aFirst[i
14240 4f 75 74 2a 32 2b 31 5d 2e 69 46 69 72 73 74 3b  Out*2+1].iFirst;
14250 0a 20 20 7d 0a 20 20 70 31 20 3d 20 26 70 49 74  .  }.  p1 = &pIt
14260 65 72 2d 3e 61 53 65 67 5b 69 31 5d 3b 0a 20 20  er->aSeg[i1];.  
14270 70 32 20 3d 20 26 70 49 74 65 72 2d 3e 61 53 65  p2 = &pIter->aSe
14280 67 5b 69 32 5d 3b 0a 0a 20 20 70 52 65 73 2d 3e  g[i2];..  pRes->
14290 62 54 65 72 6d 45 71 20 3d 20 30 3b 0a 20 20 69  bTermEq = 0;.  i
142a0 66 28 20 70 31 2d 3e 70 4c 65 61 66 3d 3d 30 20  f( p1->pLeaf==0 
142b0 29 7b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ){           /* 
142c0 49 66 20 70 31 20 69 73 20 61 74 20 45 4f 46 20  If p1 is at EOF 
142d0 2a 2f 0a 20 20 20 20 69 52 65 73 20 3d 20 69 32  */.    iRes = i2
142e0 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 32  ;.  }else if( p2
142f0 2d 3e 70 4c 65 61 66 3d 3d 30 20 29 7b 20 20 20  ->pLeaf==0 ){   
14300 20 20 2f 2a 20 49 66 20 70 32 20 69 73 20 61 74    /* If p2 is at
14310 20 45 4f 46 20 2a 2f 0a 20 20 20 20 69 52 65 73   EOF */.    iRes
14320 20 3d 20 69 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a   = i1;.  }else{.
14330 20 20 20 20 69 6e 74 20 72 65 73 20 3d 20 66 74      int res = ft
14340 73 35 42 75 66 66 65 72 43 6f 6d 70 61 72 65 28  s5BufferCompare(
14350 26 70 31 2d 3e 74 65 72 6d 2c 20 26 70 32 2d 3e  &p1->term, &p2->
14360 74 65 72 6d 29 3b 0a 20 20 20 20 69 66 28 20 72  term);.    if( r
14370 65 73 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 61  es==0 ){.      a
14380 73 73 65 72 74 28 20 69 32 3e 69 31 20 29 3b 0a  ssert( i2>i1 );.
14390 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69 32        assert( i2
143a0 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 52 65  !=0 );.      pRe
143b0 73 2d 3e 62 54 65 72 6d 45 71 20 3d 20 31 3b 0a  s->bTermEq = 1;.
143c0 20 20 20 20 20 20 69 66 28 20 70 31 2d 3e 69 52        if( p1->iR
143d0 6f 77 69 64 3d 3d 70 32 2d 3e 69 52 6f 77 69 64  owid==p2->iRowid
143e0 20 29 7b 0a 20 20 20 20 20 20 20 20 70 31 2d 3e   ){.        p1->
143f0 62 44 65 6c 20 3d 20 70 32 2d 3e 62 44 65 6c 3b  bDel = p2->bDel;
14400 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
14410 69 32 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  i2;.      }.    
14420 20 20 72 65 73 20 3d 20 28 28 70 31 2d 3e 69 52    res = ((p1->iR
14430 6f 77 69 64 20 3e 20 70 32 2d 3e 69 52 6f 77 69  owid > p2->iRowi
14440 64 29 3d 3d 70 49 74 65 72 2d 3e 62 52 65 76 29  d)==pIter->bRev)
14450 20 3f 20 2d 31 20 3a 20 2b 31 3b 0a 20 20 20 20   ? -1 : +1;.    
14460 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 65  }.    assert( re
14470 73 21 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20  s!=0 );.    if( 
14480 72 65 73 3c 30 20 29 7b 0a 20 20 20 20 20 20 69  res<0 ){.      i
14490 52 65 73 20 3d 20 69 31 3b 0a 20 20 20 20 7d 65  Res = i1;.    }e
144a0 6c 73 65 7b 0a 20 20 20 20 20 20 69 52 65 73 20  lse{.      iRes 
144b0 3d 20 69 32 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  = i2;.    }.  }.
144c0 0a 20 20 70 52 65 73 2d 3e 69 46 69 72 73 74 20  .  pRes->iFirst 
144d0 3d 20 28 75 31 36 29 69 52 65 73 3b 0a 20 20 72  = (u16)iRes;.  r
144e0 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
144f0 2a 20 4d 6f 76 65 20 74 68 65 20 73 65 67 2d 69  * Move the seg-i
14500 74 65 72 20 73 6f 20 74 68 61 74 20 69 74 20 70  ter so that it p
14510 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 66 69 72  oints to the fir
14520 73 74 20 72 6f 77 69 64 20 6f 6e 20 70 61 67 65  st rowid on page
14530 20 69 4c 65 61 66 50 67 6e 6f 2e 0a 2a 2a 20 49   iLeafPgno..** I
14540 74 20 69 73 20 61 6e 20 65 72 72 6f 72 20 69 66  t is an error if
14550 20 6c 65 61 66 20 69 4c 65 61 66 50 67 6e 6f 20   leaf iLeafPgno 
14560 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 20 6f  does not exist o
14570 72 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 72 6f  r contains no ro
14580 77 69 64 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  wids..*/.static 
14590 76 6f 69 64 20 66 74 73 35 53 65 67 49 74 65 72  void fts5SegIter
145a0 47 6f 74 6f 50 61 67 65 28 0a 20 20 46 74 73 35  GotoPage(.  Fts5
145b0 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20  Index *p,       
145c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
145d0 54 53 35 20 62 61 63 6b 65 6e 64 20 6f 62 6a 65  TS5 backend obje
145e0 63 74 20 2a 2f 0a 20 20 46 74 73 35 53 65 67 49  ct */.  Fts5SegI
145f0 74 65 72 20 2a 70 49 74 65 72 2c 20 20 20 20 20  ter *pIter,     
14600 20 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61          /* Itera
14610 74 6f 72 20 74 6f 20 61 64 76 61 6e 63 65 20 2a  tor to advance *
14620 2f 0a 20 20 69 6e 74 20 69 4c 65 61 66 50 67 6e  /.  int iLeafPgn
14630 6f 0a 29 7b 0a 20 20 61 73 73 65 72 74 28 20 69  o.){.  assert( i
14640 4c 65 61 66 50 67 6e 6f 3e 70 49 74 65 72 2d 3e  LeafPgno>pIter->
14650 69 4c 65 61 66 50 67 6e 6f 20 29 3b 0a 0a 20 20  iLeafPgno );..  
14660 69 66 28 20 69 4c 65 61 66 50 67 6e 6f 3e 70 49  if( iLeafPgno>pI
14670 74 65 72 2d 3e 70 53 65 67 2d 3e 70 67 6e 6f 4c  ter->pSeg->pgnoL
14680 61 73 74 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63  ast ){.    p->rc
14690 20 3d 20 46 54 53 35 5f 43 4f 52 52 55 50 54 3b   = FTS5_CORRUPT;
146a0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66 74  .  }else{.    ft
146b0 73 35 44 61 74 61 52 65 6c 65 61 73 65 28 70 49  s5DataRelease(pI
146c0 74 65 72 2d 3e 70 4e 65 78 74 4c 65 61 66 29 3b  ter->pNextLeaf);
146d0 0a 20 20 20 20 70 49 74 65 72 2d 3e 70 4e 65 78  .    pIter->pNex
146e0 74 4c 65 61 66 20 3d 20 30 3b 0a 20 20 20 20 70  tLeaf = 0;.    p
146f0 49 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 20  Iter->iLeafPgno 
14700 3d 20 69 4c 65 61 66 50 67 6e 6f 2d 31 3b 0a 20  = iLeafPgno-1;. 
14710 20 20 20 66 74 73 35 53 65 67 49 74 65 72 4e 65     fts5SegIterNe
14720 78 74 50 61 67 65 28 70 2c 20 70 49 74 65 72 29  xtPage(p, pIter)
14730 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d  ;.    assert( p-
14740 3e 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c  >rc!=SQLITE_OK |
14750 7c 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 50 67  | pIter->iLeafPg
14760 6e 6f 3d 3d 69 4c 65 61 66 50 67 6e 6f 20 29 3b  no==iLeafPgno );
14770 0a 0a 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d  ..    if( p->rc=
14780 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
14790 20 20 20 20 69 6e 74 20 69 4f 66 66 3b 0a 20 20      int iOff;.  
147a0 20 20 20 20 75 38 20 2a 61 20 3d 20 70 49 74 65      u8 *a = pIte
147b0 72 2d 3e 70 4c 65 61 66 2d 3e 70 3b 0a 20 20 20  r->pLeaf->p;.   
147c0 20 20 20 69 6e 74 20 6e 20 3d 20 70 49 74 65 72     int n = pIter
147d0 2d 3e 70 4c 65 61 66 2d 3e 73 7a 4c 65 61 66 3b  ->pLeaf->szLeaf;
147e0 0a 0a 20 20 20 20 20 20 69 4f 66 66 20 3d 20 66  ..      iOff = f
147f0 74 73 35 4c 65 61 66 46 69 72 73 74 52 6f 77 69  ts5LeafFirstRowi
14800 64 4f 66 66 28 70 49 74 65 72 2d 3e 70 4c 65 61  dOff(pIter->pLea
14810 66 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69 4f  f);.      if( iO
14820 66 66 3c 34 20 7c 7c 20 69 4f 66 66 3e 3d 6e 20  ff<4 || iOff>=n 
14830 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 72 63  ){.        p->rc
14840 20 3d 20 46 54 53 35 5f 43 4f 52 52 55 50 54 3b   = FTS5_CORRUPT;
14850 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
14860 20 20 20 20 20 20 69 4f 66 66 20 2b 3d 20 66 74        iOff += ft
14870 73 35 47 65 74 56 61 72 69 6e 74 28 26 61 5b 69  s5GetVarint(&a[i
14880 4f 66 66 5d 2c 20 28 75 36 34 2a 29 26 70 49 74  Off], (u64*)&pIt
14890 65 72 2d 3e 69 52 6f 77 69 64 29 3b 0a 20 20 20  er->iRowid);.   
148a0 20 20 20 20 20 70 49 74 65 72 2d 3e 69 4c 65 61       pIter->iLea
148b0 66 4f 66 66 73 65 74 20 3d 20 69 4f 66 66 3b 0a  fOffset = iOff;.
148c0 20 20 20 20 20 20 20 20 66 74 73 35 53 65 67 49          fts5SegI
148d0 74 65 72 4c 6f 61 64 4e 50 6f 73 28 70 2c 20 70  terLoadNPos(p, p
148e0 49 74 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Iter);.      }. 
148f0 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
14900 2a 20 41 64 76 61 6e 63 65 20 74 68 65 20 69 74  * Advance the it
14910 65 72 61 74 6f 72 20 70 61 73 73 65 64 20 61 73  erator passed as
14920 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
14930 6d 65 6e 74 20 75 6e 74 69 6c 20 69 74 20 69 73  ment until it is
14940 20 61 74 20 6f 72 20 0a 2a 2a 20 70 61 73 74 20   at or .** past 
14950 72 6f 77 69 64 20 69 46 72 6f 6d 2e 20 52 65 67  rowid iFrom. Reg
14960 61 72 64 6c 65 73 73 20 6f 66 20 74 68 65 20 76  ardless of the v
14970 61 6c 75 65 20 6f 66 20 69 46 72 6f 6d 2c 20 74  alue of iFrom, t
14980 68 65 20 69 74 65 72 61 74 6f 72 20 69 73 0a 2a  he iterator is.*
14990 2a 20 61 6c 77 61 79 73 20 61 64 76 61 6e 63 65  * always advance
149a0 64 20 61 74 20 6c 65 61 73 74 20 6f 6e 63 65 2e  d at least once.
149b0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
149c0 66 74 73 35 53 65 67 49 74 65 72 4e 65 78 74 46  fts5SegIterNextF
149d0 72 6f 6d 28 0a 20 20 46 74 73 35 49 6e 64 65 78  rom(.  Fts5Index
149e0 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
149f0 20 20 20 20 20 20 20 2f 2a 20 46 54 53 35 20 62         /* FTS5 b
14a00 61 63 6b 65 6e 64 20 6f 62 6a 65 63 74 20 2a 2f  ackend object */
14a10 0a 20 20 46 74 73 35 53 65 67 49 74 65 72 20 2a  .  Fts5SegIter *
14a20 70 49 74 65 72 2c 20 20 20 20 20 20 20 20 20 20  pIter,          
14a30 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 74     /* Iterator t
14a40 6f 20 61 64 76 61 6e 63 65 20 2a 2f 0a 20 20 69  o advance */.  i
14a50 36 34 20 69 4d 61 74 63 68 20 20 20 20 20 20 20  64 iMatch       
14a60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
14a70 2a 20 41 64 76 61 6e 63 65 20 69 74 65 72 61 74  * Advance iterat
14a80 6f 72 20 61 74 20 6c 65 61 73 74 20 74 68 69 73  or at least this
14a90 20 66 61 72 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74   far */.){.  int
14aa0 20 62 52 65 76 20 3d 20 28 70 49 74 65 72 2d 3e   bRev = (pIter->
14ab0 66 6c 61 67 73 20 26 20 46 54 53 35 5f 53 45 47  flags & FTS5_SEG
14ac0 49 54 45 52 5f 52 45 56 45 52 53 45 29 3b 0a 20  ITER_REVERSE);. 
14ad0 20 46 74 73 35 44 6c 69 64 78 49 74 65 72 20 2a   Fts5DlidxIter *
14ae0 70 44 6c 69 64 78 20 3d 20 70 49 74 65 72 2d 3e  pDlidx = pIter->
14af0 70 44 6c 69 64 78 3b 0a 20 20 69 6e 74 20 69 4c  pDlidx;.  int iL
14b00 65 61 66 50 67 6e 6f 20 3d 20 70 49 74 65 72 2d  eafPgno = pIter-
14b10 3e 69 4c 65 61 66 50 67 6e 6f 3b 0a 20 20 69 6e  >iLeafPgno;.  in
14b20 74 20 62 4d 6f 76 65 20 3d 20 31 3b 0a 0a 20 20  t bMove = 1;..  
14b30 61 73 73 65 72 74 28 20 70 49 74 65 72 2d 3e 66  assert( pIter->f
14b40 6c 61 67 73 20 26 20 46 54 53 35 5f 53 45 47 49  lags & FTS5_SEGI
14b50 54 45 52 5f 4f 4e 45 54 45 52 4d 20 29 3b 0a 20  TER_ONETERM );. 
14b60 20 61 73 73 65 72 74 28 20 70 49 74 65 72 2d 3e   assert( pIter->
14b70 70 44 6c 69 64 78 20 29 3b 0a 20 20 61 73 73 65  pDlidx );.  asse
14b80 72 74 28 20 70 49 74 65 72 2d 3e 70 4c 65 61 66  rt( pIter->pLeaf
14b90 20 29 3b 0a 0a 20 20 69 66 28 20 62 52 65 76 3d   );..  if( bRev=
14ba0 3d 30 20 29 7b 0a 20 20 20 20 77 68 69 6c 65 28  =0 ){.    while(
14bb0 20 21 66 74 73 35 44 6c 69 64 78 49 74 65 72 45   !fts5DlidxIterE
14bc0 6f 66 28 70 2c 20 70 44 6c 69 64 78 29 20 26 26  of(p, pDlidx) &&
14bd0 20 69 4d 61 74 63 68 3e 66 74 73 35 44 6c 69 64   iMatch>fts5Dlid
14be0 78 49 74 65 72 52 6f 77 69 64 28 70 44 6c 69 64  xIterRowid(pDlid
14bf0 78 29 20 29 7b 0a 20 20 20 20 20 20 69 4c 65 61  x) ){.      iLea
14c00 66 50 67 6e 6f 20 3d 20 66 74 73 35 44 6c 69 64  fPgno = fts5Dlid
14c10 78 49 74 65 72 50 67 6e 6f 28 70 44 6c 69 64 78  xIterPgno(pDlidx
14c20 29 3b 0a 20 20 20 20 20 20 66 74 73 35 44 6c 69  );.      fts5Dli
14c30 64 78 49 74 65 72 4e 65 78 74 28 70 2c 20 70 44  dxIterNext(p, pD
14c40 6c 69 64 78 29 3b 0a 20 20 20 20 7d 0a 20 20 20  lidx);.    }.   
14c50 20 61 73 73 65 72 74 5f 6e 63 28 20 69 4c 65 61   assert_nc( iLea
14c60 66 50 67 6e 6f 3e 3d 70 49 74 65 72 2d 3e 69 4c  fPgno>=pIter->iL
14c70 65 61 66 50 67 6e 6f 20 7c 7c 20 70 2d 3e 72 63  eafPgno || p->rc
14c80 20 29 3b 0a 20 20 20 20 69 66 28 20 69 4c 65 61   );.    if( iLea
14c90 66 50 67 6e 6f 3e 70 49 74 65 72 2d 3e 69 4c 65  fPgno>pIter->iLe
14ca0 61 66 50 67 6e 6f 20 29 7b 0a 20 20 20 20 20 20  afPgno ){.      
14cb0 66 74 73 35 53 65 67 49 74 65 72 47 6f 74 6f 50  fts5SegIterGotoP
14cc0 61 67 65 28 70 2c 20 70 49 74 65 72 2c 20 69 4c  age(p, pIter, iL
14cd0 65 61 66 50 67 6e 6f 29 3b 0a 20 20 20 20 20 20  eafPgno);.      
14ce0 62 4d 6f 76 65 20 3d 20 30 3b 0a 20 20 20 20 7d  bMove = 0;.    }
14cf0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73  .  }else{.    as
14d00 73 65 72 74 28 20 70 49 74 65 72 2d 3e 70 4e 65  sert( pIter->pNe
14d10 78 74 4c 65 61 66 3d 3d 30 20 29 3b 0a 20 20 20  xtLeaf==0 );.   
14d20 20 61 73 73 65 72 74 28 20 69 4d 61 74 63 68 3c   assert( iMatch<
14d30 70 49 74 65 72 2d 3e 69 52 6f 77 69 64 20 29 3b  pIter->iRowid );
14d40 0a 20 20 20 20 77 68 69 6c 65 28 20 21 66 74 73  .    while( !fts
14d50 35 44 6c 69 64 78 49 74 65 72 45 6f 66 28 70 2c  5DlidxIterEof(p,
14d60 20 70 44 6c 69 64 78 29 20 26 26 20 69 4d 61 74   pDlidx) && iMat
14d70 63 68 3c 66 74 73 35 44 6c 69 64 78 49 74 65 72  ch<fts5DlidxIter
14d80 52 6f 77 69 64 28 70 44 6c 69 64 78 29 20 29 7b  Rowid(pDlidx) ){
14d90 0a 20 20 20 20 20 20 66 74 73 35 44 6c 69 64 78  .      fts5Dlidx
14da0 49 74 65 72 50 72 65 76 28 70 2c 20 70 44 6c 69  IterPrev(p, pDli
14db0 64 78 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  dx);.    }.    i
14dc0 4c 65 61 66 50 67 6e 6f 20 3d 20 66 74 73 35 44  LeafPgno = fts5D
14dd0 6c 69 64 78 49 74 65 72 50 67 6e 6f 28 70 44 6c  lidxIterPgno(pDl
14de0 69 64 78 29 3b 0a 0a 20 20 20 20 61 73 73 65 72  idx);..    asser
14df0 74 28 20 66 74 73 35 44 6c 69 64 78 49 74 65 72  t( fts5DlidxIter
14e00 45 6f 66 28 70 2c 20 70 44 6c 69 64 78 29 20 7c  Eof(p, pDlidx) |
14e10 7c 20 69 4c 65 61 66 50 67 6e 6f 3c 3d 70 49 74  | iLeafPgno<=pIt
14e20 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 20 29 3b  er->iLeafPgno );
14e30 0a 0a 20 20 20 20 69 66 28 20 69 4c 65 61 66 50  ..    if( iLeafP
14e40 67 6e 6f 3c 70 49 74 65 72 2d 3e 69 4c 65 61 66  gno<pIter->iLeaf
14e50 50 67 6e 6f 20 29 7b 0a 20 20 20 20 20 20 70 49  Pgno ){.      pI
14e60 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 20 3d  ter->iLeafPgno =
14e70 20 69 4c 65 61 66 50 67 6e 6f 2b 31 3b 0a 20 20   iLeafPgno+1;.  
14e80 20 20 20 20 66 74 73 35 53 65 67 49 74 65 72 52      fts5SegIterR
14e90 65 76 65 72 73 65 4e 65 77 50 61 67 65 28 70 2c  everseNewPage(p,
14ea0 20 70 49 74 65 72 29 3b 0a 20 20 20 20 20 20 62   pIter);.      b
14eb0 4d 6f 76 65 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  Move = 0;.    }.
14ec0 20 20 7d 0a 0a 20 20 64 6f 7b 0a 20 20 20 20 69    }..  do{.    i
14ed0 66 28 20 62 4d 6f 76 65 20 26 26 20 70 2d 3e 72  f( bMove && p->r
14ee0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 70  c==SQLITE_OK ) p
14ef0 49 74 65 72 2d 3e 78 4e 65 78 74 28 70 2c 20 70  Iter->xNext(p, p
14f00 49 74 65 72 2c 20 30 29 3b 0a 20 20 20 20 69 66  Iter, 0);.    if
14f10 28 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 3d 3d  ( pIter->pLeaf==
14f20 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 69  0 ) break;.    i
14f30 66 28 20 62 52 65 76 3d 3d 30 20 26 26 20 70 49  f( bRev==0 && pI
14f40 74 65 72 2d 3e 69 52 6f 77 69 64 3e 3d 69 4d 61  ter->iRowid>=iMa
14f50 74 63 68 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  tch ) break;.   
14f60 20 69 66 28 20 62 52 65 76 21 3d 30 20 26 26 20   if( bRev!=0 && 
14f70 70 49 74 65 72 2d 3e 69 52 6f 77 69 64 3c 3d 69  pIter->iRowid<=i
14f80 4d 61 74 63 68 20 29 20 62 72 65 61 6b 3b 0a 20  Match ) break;. 
14f90 20 20 20 62 4d 6f 76 65 20 3d 20 31 3b 0a 20 20     bMove = 1;.  
14fa0 7d 77 68 69 6c 65 28 20 70 2d 3e 72 63 3d 3d 53  }while( p->rc==S
14fb0 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 7d 0a 0a 0a  QLITE_OK );.}...
14fc0 2f 2a 0a 2a 2a 20 46 72 65 65 20 74 68 65 20 69  /*.** Free the i
14fd0 74 65 72 61 74 6f 72 20 6f 62 6a 65 63 74 20 70  terator object p
14fe0 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63  assed as the sec
14ff0 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f  ond argument..*/
15000 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
15010 35 4d 75 6c 74 69 49 74 65 72 46 72 65 65 28 46  5MultiIterFree(F
15020 74 73 35 49 74 65 72 20 2a 70 49 74 65 72 29 7b  ts5Iter *pIter){
15030 0a 20 20 69 66 28 20 70 49 74 65 72 20 29 7b 0a  .  if( pIter ){.
15040 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66      int i;.    f
15050 6f 72 28 69 3d 30 3b 20 69 3c 70 49 74 65 72 2d  or(i=0; i<pIter-
15060 3e 6e 53 65 67 3b 20 69 2b 2b 29 7b 0a 20 20 20  >nSeg; i++){.   
15070 20 20 20 66 74 73 35 53 65 67 49 74 65 72 43 6c     fts5SegIterCl
15080 65 61 72 28 26 70 49 74 65 72 2d 3e 61 53 65 67  ear(&pIter->aSeg
15090 5b 69 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  [i]);.    }.    
150a0 66 74 73 35 53 74 72 75 63 74 75 72 65 52 65 6c  fts5StructureRel
150b0 65 61 73 65 28 70 49 74 65 72 2d 3e 70 53 74 72  ease(pIter->pStr
150c0 75 63 74 29 3b 0a 20 20 20 20 66 74 73 35 42 75  uct);.    fts5Bu
150d0 66 66 65 72 46 72 65 65 28 26 70 49 74 65 72 2d  fferFree(&pIter-
150e0 3e 70 6f 73 6c 69 73 74 29 3b 0a 20 20 20 20 73  >poslist);.    s
150f0 71 6c 69 74 65 33 5f 66 72 65 65 28 70 49 74 65  qlite3_free(pIte
15100 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69  r);.  }.}..stati
15110 63 20 76 6f 69 64 20 66 74 73 35 4d 75 6c 74 69  c void fts5Multi
15120 49 74 65 72 41 64 76 61 6e 63 65 64 28 0a 20 20  IterAdvanced(.  
15130 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 20 20  Fts5Index *p,   
15140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15150 2f 2a 20 46 54 53 35 20 62 61 63 6b 65 6e 64 20  /* FTS5 backend 
15160 74 6f 20 69 74 65 72 61 74 65 20 77 69 74 68 69  to iterate withi
15170 6e 20 2a 2f 0a 20 20 46 74 73 35 49 74 65 72 20  n */.  Fts5Iter 
15180 2a 70 49 74 65 72 2c 20 20 20 20 20 20 20 20 20  *pIter,         
15190 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74         /* Iterat
151a0 6f 72 20 74 6f 20 75 70 64 61 74 65 20 61 46 69  or to update aFi
151b0 72 73 74 5b 5d 20 61 72 72 61 79 20 66 6f 72 20  rst[] array for 
151c0 2a 2f 0a 20 20 69 6e 74 20 69 43 68 61 6e 67 65  */.  int iChange
151d0 64 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d,              
151e0 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66       /* Index of
151f0 20 73 75 62 2d 69 74 65 72 61 74 6f 72 20 6a 75   sub-iterator ju
15200 73 74 20 61 64 76 61 6e 63 65 64 20 2a 2f 0a 20  st advanced */. 
15210 20 69 6e 74 20 69 4d 69 6e 73 65 74 20 20 20 20   int iMinset    
15220 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15230 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 65 6e 74 72   /* Minimum entr
15240 79 20 69 6e 20 61 46 69 72 73 74 5b 5d 20 74 6f  y in aFirst[] to
15250 20 73 65 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74   set */.){.  int
15260 20 69 3b 0a 20 20 66 6f 72 28 69 3d 28 70 49 74   i;.  for(i=(pIt
15270 65 72 2d 3e 6e 53 65 67 2b 69 43 68 61 6e 67 65  er->nSeg+iChange
15280 64 29 2f 32 3b 20 69 3e 3d 69 4d 69 6e 73 65 74  d)/2; i>=iMinset
15290 20 26 26 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54   && p->rc==SQLIT
152a0 45 5f 4f 4b 3b 20 69 3d 69 2f 32 29 7b 0a 20 20  E_OK; i=i/2){.  
152b0 20 20 69 6e 74 20 69 45 71 3b 0a 20 20 20 20 69    int iEq;.    i
152c0 66 28 20 28 69 45 71 20 3d 20 66 74 73 35 4d 75  f( (iEq = fts5Mu
152d0 6c 74 69 49 74 65 72 44 6f 43 6f 6d 70 61 72 65  ltiIterDoCompare
152e0 28 70 49 74 65 72 2c 20 69 29 29 20 29 7b 0a 20  (pIter, i)) ){. 
152f0 20 20 20 20 20 46 74 73 35 53 65 67 49 74 65 72       Fts5SegIter
15300 20 2a 70 53 65 67 20 3d 20 26 70 49 74 65 72 2d   *pSeg = &pIter-
15310 3e 61 53 65 67 5b 69 45 71 5d 3b 0a 20 20 20 20  >aSeg[iEq];.    
15320 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72 63 3d    assert( p->rc=
15330 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20  =SQLITE_OK );.  
15340 20 20 20 20 70 53 65 67 2d 3e 78 4e 65 78 74 28      pSeg->xNext(
15350 70 2c 20 70 53 65 67 2c 20 30 29 3b 0a 20 20 20  p, pSeg, 0);.   
15360 20 20 20 69 20 3d 20 70 49 74 65 72 2d 3e 6e 53     i = pIter->nS
15370 65 67 20 2b 20 69 45 71 3b 0a 20 20 20 20 7d 0a  eg + iEq;.    }.
15380 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 75 62    }.}../*.** Sub
15390 2d 69 74 65 72 61 74 6f 72 20 69 43 68 61 6e 67  -iterator iChang
153a0 65 64 20 6f 66 20 69 74 65 72 61 74 6f 72 20 70  ed of iterator p
153b0 49 74 65 72 20 68 61 73 20 6a 75 73 74 20 62 65  Iter has just be
153c0 65 6e 20 61 64 76 61 6e 63 65 64 2e 20 49 74 20  en advanced. It 
153d0 73 74 69 6c 6c 0a 2a 2a 20 70 6f 69 6e 74 73 20  still.** points 
153e0 74 6f 20 74 68 65 20 73 61 6d 65 20 74 65 72 6d  to the same term
153f0 20 74 68 6f 75 67 68 20 2d 20 6a 75 73 74 20 61   though - just a
15400 20 64 69 66 66 65 72 65 6e 74 20 72 6f 77 69 64   different rowid
15410 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a  . This function.
15420 2a 2a 20 61 74 74 65 6d 70 74 73 20 74 6f 20 75  ** attempts to u
15430 70 64 61 74 65 20 74 68 65 20 63 6f 6e 74 65 6e  pdate the conten
15440 74 73 20 6f 66 20 74 68 65 20 70 49 74 65 72 2d  ts of the pIter-
15450 3e 61 46 69 72 73 74 5b 5d 20 61 63 63 6f 72 64  >aFirst[] accord
15460 69 6e 67 6c 79 2e 0a 2a 2a 20 49 66 20 69 74 20  ingly..** If it 
15470 64 6f 65 73 20 73 6f 20 73 75 63 63 65 73 73 66  does so successf
15480 75 6c 6c 79 2c 20 30 20 69 73 20 72 65 74 75 72  ully, 0 is retur
15490 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65 20 31  ned. Otherwise 1
154a0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 6e 2d 7a  ..**.** If non-z
154b0 65 72 6f 20 69 73 20 72 65 74 75 72 6e 65 64 2c  ero is returned,
154c0 20 74 68 65 20 63 61 6c 6c 65 72 20 73 68 6f 75   the caller shou
154d0 6c 64 20 63 61 6c 6c 20 66 74 73 35 4d 75 6c 74  ld call fts5Mult
154e0 69 49 74 65 72 41 64 76 61 6e 63 65 64 28 29 0a  iIterAdvanced().
154f0 2a 2a 20 6f 6e 20 74 68 65 20 69 74 65 72 61 74  ** on the iterat
15500 6f 72 20 69 6e 73 74 65 61 64 2e 20 54 68 61 74  or instead. That
15510 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20 74   function does t
15520 68 65 20 73 61 6d 65 20 61 73 20 74 68 69 73 20  he same as this 
15530 6f 6e 65 2c 20 65 78 63 65 70 74 0a 2a 2a 20 74  one, except.** t
15540 68 61 74 20 69 74 20 64 65 61 6c 73 20 77 69 74  hat it deals wit
15550 68 20 6d 6f 72 65 20 63 6f 6d 70 6c 69 63 61 74  h more complicat
15560 65 64 20 63 61 73 65 73 20 61 73 20 77 65 6c 6c  ed cases as well
15570 2e 0a 2a 2f 20 0a 73 74 61 74 69 63 20 69 6e 74  ..*/ .static int
15580 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 41 64   fts5MultiIterAd
15590 76 61 6e 63 65 52 6f 77 69 64 28 0a 20 20 46 74  vanceRowid(.  Ft
155a0 73 35 49 74 65 72 20 2a 70 49 74 65 72 2c 20 20  s5Iter *pIter,  
155b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
155c0 20 49 74 65 72 61 74 6f 72 20 74 6f 20 75 70 64   Iterator to upd
155d0 61 74 65 20 61 46 69 72 73 74 5b 5d 20 61 72 72  ate aFirst[] arr
155e0 61 79 20 66 6f 72 20 2a 2f 0a 20 20 69 6e 74 20  ay for */.  int 
155f0 69 43 68 61 6e 67 65 64 2c 20 20 20 20 20 20 20  iChanged,       
15600 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
15610 6e 64 65 78 20 6f 66 20 73 75 62 2d 69 74 65 72  ndex of sub-iter
15620 61 74 6f 72 20 6a 75 73 74 20 61 64 76 61 6e 63  ator just advanc
15630 65 64 20 2a 2f 0a 20 20 46 74 73 35 53 65 67 49  ed */.  Fts5SegI
15640 74 65 72 20 2a 2a 70 70 46 69 72 73 74 0a 29 7b  ter **ppFirst.){
15650 0a 20 20 46 74 73 35 53 65 67 49 74 65 72 20 2a  .  Fts5SegIter *
15660 70 4e 65 77 20 3d 20 26 70 49 74 65 72 2d 3e 61  pNew = &pIter->a
15670 53 65 67 5b 69 43 68 61 6e 67 65 64 5d 3b 0a 0a  Seg[iChanged];..
15680 20 20 69 66 28 20 70 4e 65 77 2d 3e 69 52 6f 77    if( pNew->iRow
15690 69 64 3d 3d 70 49 74 65 72 2d 3e 69 53 77 69 74  id==pIter->iSwit
156a0 63 68 52 6f 77 69 64 0a 20 20 20 7c 7c 20 28 70  chRowid.   || (p
156b0 4e 65 77 2d 3e 69 52 6f 77 69 64 3c 70 49 74 65  New->iRowid<pIte
156c0 72 2d 3e 69 53 77 69 74 63 68 52 6f 77 69 64 29  r->iSwitchRowid)
156d0 3d 3d 70 49 74 65 72 2d 3e 62 52 65 76 0a 20 20  ==pIter->bRev.  
156e0 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  ){.    int i;.  
156f0 20 20 46 74 73 35 53 65 67 49 74 65 72 20 2a 70    Fts5SegIter *p
15700 4f 74 68 65 72 20 3d 20 26 70 49 74 65 72 2d 3e  Other = &pIter->
15710 61 53 65 67 5b 69 43 68 61 6e 67 65 64 20 5e 20  aSeg[iChanged ^ 
15720 30 78 30 30 30 31 5d 3b 0a 20 20 20 20 70 49 74  0x0001];.    pIt
15730 65 72 2d 3e 69 53 77 69 74 63 68 52 6f 77 69 64  er->iSwitchRowid
15740 20 3d 20 70 49 74 65 72 2d 3e 62 52 65 76 20 3f   = pIter->bRev ?
15750 20 53 4d 41 4c 4c 45 53 54 5f 49 4e 54 36 34 20   SMALLEST_INT64 
15760 3a 20 4c 41 52 47 45 53 54 5f 49 4e 54 36 34 3b  : LARGEST_INT64;
15770 0a 20 20 20 20 66 6f 72 28 69 3d 28 70 49 74 65  .    for(i=(pIte
15780 72 2d 3e 6e 53 65 67 2b 69 43 68 61 6e 67 65 64  r->nSeg+iChanged
15790 29 2f 32 3b 20 31 3b 20 69 3d 69 2f 32 29 7b 0a  )/2; 1; i=i/2){.
157a0 20 20 20 20 20 20 46 74 73 35 43 52 65 73 75 6c        Fts5CResul
157b0 74 20 2a 70 52 65 73 20 3d 20 26 70 49 74 65 72  t *pRes = &pIter
157c0 2d 3e 61 46 69 72 73 74 5b 69 5d 3b 0a 0a 20 20  ->aFirst[i];..  
157d0 20 20 20 20 61 73 73 65 72 74 28 20 70 4e 65 77      assert( pNew
157e0 2d 3e 70 4c 65 61 66 20 29 3b 0a 20 20 20 20 20  ->pLeaf );.     
157f0 20 61 73 73 65 72 74 28 20 70 52 65 73 2d 3e 62   assert( pRes->b
15800 54 65 72 6d 45 71 3d 3d 30 20 7c 7c 20 70 4f 74  TermEq==0 || pOt
15810 68 65 72 2d 3e 70 4c 65 61 66 20 29 3b 0a 0a 20  her->pLeaf );.. 
15820 20 20 20 20 20 69 66 28 20 70 52 65 73 2d 3e 62       if( pRes->b
15830 54 65 72 6d 45 71 20 29 7b 0a 20 20 20 20 20 20  TermEq ){.      
15840 20 20 69 66 28 20 70 4e 65 77 2d 3e 69 52 6f 77    if( pNew->iRow
15850 69 64 3d 3d 70 4f 74 68 65 72 2d 3e 69 52 6f 77  id==pOther->iRow
15860 69 64 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  id ){.          
15870 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20  return 1;.      
15880 20 20 7d 65 6c 73 65 20 69 66 28 20 28 70 4f 74    }else if( (pOt
15890 68 65 72 2d 3e 69 52 6f 77 69 64 3e 70 4e 65 77  her->iRowid>pNew
158a0 2d 3e 69 52 6f 77 69 64 29 3d 3d 70 49 74 65 72  ->iRowid)==pIter
158b0 2d 3e 62 52 65 76 20 29 7b 0a 20 20 20 20 20 20  ->bRev ){.      
158c0 20 20 20 20 70 49 74 65 72 2d 3e 69 53 77 69 74      pIter->iSwit
158d0 63 68 52 6f 77 69 64 20 3d 20 70 4f 74 68 65 72  chRowid = pOther
158e0 2d 3e 69 52 6f 77 69 64 3b 0a 20 20 20 20 20 20  ->iRowid;.      
158f0 20 20 20 20 70 4e 65 77 20 3d 20 70 4f 74 68 65      pNew = pOthe
15900 72 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  r;.        }else
15910 20 69 66 28 20 28 70 4f 74 68 65 72 2d 3e 69 52   if( (pOther->iR
15920 6f 77 69 64 3e 70 49 74 65 72 2d 3e 69 53 77 69  owid>pIter->iSwi
15930 74 63 68 52 6f 77 69 64 29 3d 3d 70 49 74 65 72  tchRowid)==pIter
15940 2d 3e 62 52 65 76 20 29 7b 0a 20 20 20 20 20 20  ->bRev ){.      
15950 20 20 20 20 70 49 74 65 72 2d 3e 69 53 77 69 74      pIter->iSwit
15960 63 68 52 6f 77 69 64 20 3d 20 70 4f 74 68 65 72  chRowid = pOther
15970 2d 3e 69 52 6f 77 69 64 3b 0a 20 20 20 20 20 20  ->iRowid;.      
15980 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
15990 20 20 70 52 65 73 2d 3e 69 46 69 72 73 74 20 3d    pRes->iFirst =
159a0 20 28 75 31 36 29 28 70 4e 65 77 20 2d 20 70 49   (u16)(pNew - pI
159b0 74 65 72 2d 3e 61 53 65 67 29 3b 0a 20 20 20 20  ter->aSeg);.    
159c0 20 20 69 66 28 20 69 3d 3d 31 20 29 20 62 72 65    if( i==1 ) bre
159d0 61 6b 3b 0a 0a 20 20 20 20 20 20 70 4f 74 68 65  ak;..      pOthe
159e0 72 20 3d 20 26 70 49 74 65 72 2d 3e 61 53 65 67  r = &pIter->aSeg
159f0 5b 20 70 49 74 65 72 2d 3e 61 46 69 72 73 74 5b  [ pIter->aFirst[
15a00 69 20 5e 20 30 78 30 30 30 31 5d 2e 69 46 69 72  i ^ 0x0001].iFir
15a10 73 74 20 5d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  st ];.    }.  }.
15a20 0a 20 20 2a 70 70 46 69 72 73 74 20 3d 20 70 4e  .  *ppFirst = pN
15a30 65 77 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a  ew;.  return 0;.
15a40 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65  }../*.** Set the
15a50 20 70 49 74 65 72 2d 3e 62 45 6f 66 20 76 61 72   pIter->bEof var
15a60 69 61 62 6c 65 20 62 61 73 65 64 20 6f 6e 20 74  iable based on t
15a70 68 65 20 73 74 61 74 65 20 6f 66 20 74 68 65 20  he state of the 
15a80 73 75 62 2d 69 74 65 72 61 74 6f 72 73 2e 0a 2a  sub-iterators..*
15a90 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  /.static void ft
15aa0 73 35 4d 75 6c 74 69 49 74 65 72 53 65 74 45 6f  s5MultiIterSetEo
15ab0 66 28 46 74 73 35 49 74 65 72 20 2a 70 49 74 65  f(Fts5Iter *pIte
15ac0 72 29 7b 0a 20 20 46 74 73 35 53 65 67 49 74 65  r){.  Fts5SegIte
15ad0 72 20 2a 70 53 65 67 20 3d 20 26 70 49 74 65 72  r *pSeg = &pIter
15ae0 2d 3e 61 53 65 67 5b 20 70 49 74 65 72 2d 3e 61  ->aSeg[ pIter->a
15af0 46 69 72 73 74 5b 31 5d 2e 69 46 69 72 73 74 20  First[1].iFirst 
15b00 5d 3b 0a 20 20 70 49 74 65 72 2d 3e 62 61 73 65  ];.  pIter->base
15b10 2e 62 45 6f 66 20 3d 20 70 53 65 67 2d 3e 70 4c  .bEof = pSeg->pL
15b20 65 61 66 3d 3d 30 3b 0a 20 20 70 49 74 65 72 2d  eaf==0;.  pIter-
15b30 3e 69 53 77 69 74 63 68 52 6f 77 69 64 20 3d 20  >iSwitchRowid = 
15b40 70 53 65 67 2d 3e 69 52 6f 77 69 64 3b 0a 7d 0a  pSeg->iRowid;.}.
15b50 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20  ./*.** Move the 
15b60 69 74 65 72 61 74 6f 72 20 74 6f 20 74 68 65 20  iterator to the 
15b70 6e 65 78 74 20 65 6e 74 72 79 2e 20 0a 2a 2a 0a  next entry. .**.
15b80 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  ** If an error o
15b90 63 63 75 72 73 2c 20 61 6e 20 65 72 72 6f 72 20  ccurs, an error 
15ba0 63 6f 64 65 20 69 73 20 6c 65 66 74 20 69 6e 20  code is left in 
15bb0 46 74 73 35 49 6e 64 65 78 2e 72 63 2e 20 49 74  Fts5Index.rc. It
15bc0 20 69 73 20 6e 6f 74 20 0a 2a 2a 20 63 6f 6e 73   is not .** cons
15bd0 69 64 65 72 65 64 20 61 6e 20 65 72 72 6f 72 20  idered an error 
15be0 69 66 20 74 68 65 20 69 74 65 72 61 74 6f 72 20  if the iterator 
15bf0 72 65 61 63 68 65 73 20 45 4f 46 2c 20 6f 72 20  reaches EOF, or 
15c00 69 66 20 69 74 20 69 73 20 61 6c 72 65 61 64 79  if it is already
15c10 20 61 74 20 0a 2a 2a 20 45 4f 46 20 77 68 65 6e   at .** EOF when
15c20 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
15c30 73 20 63 61 6c 6c 65 64 2e 0a 2a 2f 0a 73 74 61  s called..*/.sta
15c40 74 69 63 20 76 6f 69 64 20 66 74 73 35 4d 75 6c  tic void fts5Mul
15c50 74 69 49 74 65 72 4e 65 78 74 28 0a 20 20 46 74  tiIterNext(.  Ft
15c60 73 35 49 6e 64 65 78 20 2a 70 2c 20 0a 20 20 46  s5Index *p, .  F
15c70 74 73 35 49 74 65 72 20 2a 70 49 74 65 72 2c 0a  ts5Iter *pIter,.
15c80 20 20 69 6e 74 20 62 46 72 6f 6d 2c 20 20 20 20    int bFrom,    
15c90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15ca0 20 20 2f 2a 20 54 72 75 65 20 69 66 20 61 72 67    /* True if arg
15cb0 75 6d 65 6e 74 20 69 46 72 6f 6d 20 69 73 20 76  ument iFrom is v
15cc0 61 6c 69 64 20 2a 2f 0a 20 20 69 36 34 20 69 46  alid */.  i64 iF
15cd0 72 6f 6d 20 20 20 20 20 20 20 20 20 20 20 20 20  rom             
15ce0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 76            /* Adv
15cf0 61 6e 63 65 20 61 74 20 6c 65 61 73 74 20 61 73  ance at least as
15d00 20 66 61 72 20 61 73 20 74 68 69 73 20 2a 2f 0a   far as this */.
15d10 29 7b 0a 20 20 69 6e 74 20 62 55 73 65 46 72 6f  ){.  int bUseFro
15d20 6d 20 3d 20 62 46 72 6f 6d 3b 0a 20 20 61 73 73  m = bFrom;.  ass
15d30 65 72 74 28 20 70 49 74 65 72 2d 3e 62 61 73 65  ert( pIter->base
15d40 2e 62 45 6f 66 3d 3d 30 20 29 3b 0a 20 20 77 68  .bEof==0 );.  wh
15d50 69 6c 65 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49  ile( p->rc==SQLI
15d60 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 6e 74  TE_OK ){.    int
15d70 20 69 46 69 72 73 74 20 3d 20 70 49 74 65 72 2d   iFirst = pIter-
15d80 3e 61 46 69 72 73 74 5b 31 5d 2e 69 46 69 72 73  >aFirst[1].iFirs
15d90 74 3b 0a 20 20 20 20 69 6e 74 20 62 4e 65 77 54  t;.    int bNewT
15da0 65 72 6d 20 3d 20 30 3b 0a 20 20 20 20 46 74 73  erm = 0;.    Fts
15db0 35 53 65 67 49 74 65 72 20 2a 70 53 65 67 20 3d  5SegIter *pSeg =
15dc0 20 26 70 49 74 65 72 2d 3e 61 53 65 67 5b 69 46   &pIter->aSeg[iF
15dd0 69 72 73 74 5d 3b 0a 20 20 20 20 61 73 73 65 72  irst];.    asser
15de0 74 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  t( p->rc==SQLITE
15df0 5f 4f 4b 20 29 3b 0a 20 20 20 20 69 66 28 20 62  _OK );.    if( b
15e00 55 73 65 46 72 6f 6d 20 26 26 20 70 53 65 67 2d  UseFrom && pSeg-
15e10 3e 70 44 6c 69 64 78 20 29 7b 0a 20 20 20 20 20  >pDlidx ){.     
15e20 20 66 74 73 35 53 65 67 49 74 65 72 4e 65 78 74   fts5SegIterNext
15e30 46 72 6f 6d 28 70 2c 20 70 53 65 67 2c 20 69 46  From(p, pSeg, iF
15e40 72 6f 6d 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  rom);.    }else{
15e50 0a 20 20 20 20 20 20 70 53 65 67 2d 3e 78 4e 65  .      pSeg->xNe
15e60 78 74 28 70 2c 20 70 53 65 67 2c 20 26 62 4e 65  xt(p, pSeg, &bNe
15e70 77 54 65 72 6d 29 3b 0a 20 20 20 20 7d 0a 0a 20  wTerm);.    }.. 
15e80 20 20 20 69 66 28 20 70 53 65 67 2d 3e 70 4c 65     if( pSeg->pLe
15e90 61 66 3d 3d 30 20 7c 7c 20 62 4e 65 77 54 65 72  af==0 || bNewTer
15ea0 6d 20 0a 20 20 20 20 20 7c 7c 20 66 74 73 35 4d  m .     || fts5M
15eb0 75 6c 74 69 49 74 65 72 41 64 76 61 6e 63 65 52  ultiIterAdvanceR
15ec0 6f 77 69 64 28 70 49 74 65 72 2c 20 69 46 69 72  owid(pIter, iFir
15ed0 73 74 2c 20 26 70 53 65 67 29 0a 20 20 20 20 29  st, &pSeg).    )
15ee0 7b 0a 20 20 20 20 20 20 66 74 73 35 4d 75 6c 74  {.      fts5Mult
15ef0 69 49 74 65 72 41 64 76 61 6e 63 65 64 28 70 2c  iIterAdvanced(p,
15f00 20 70 49 74 65 72 2c 20 69 46 69 72 73 74 2c 20   pIter, iFirst, 
15f10 31 29 3b 0a 20 20 20 20 20 20 66 74 73 35 4d 75  1);.      fts5Mu
15f20 6c 74 69 49 74 65 72 53 65 74 45 6f 66 28 70 49  ltiIterSetEof(pI
15f30 74 65 72 29 3b 0a 20 20 20 20 20 20 70 53 65 67  ter);.      pSeg
15f40 20 3d 20 26 70 49 74 65 72 2d 3e 61 53 65 67 5b   = &pIter->aSeg[
15f50 70 49 74 65 72 2d 3e 61 46 69 72 73 74 5b 31 5d  pIter->aFirst[1]
15f60 2e 69 46 69 72 73 74 5d 3b 0a 20 20 20 20 20 20  .iFirst];.      
15f70 69 66 28 20 70 53 65 67 2d 3e 70 4c 65 61 66 3d  if( pSeg->pLeaf=
15f80 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20  =0 ) return;.   
15f90 20 7d 0a 0a 20 20 20 20 66 74 73 35 41 73 73 65   }..    fts5Asse
15fa0 72 74 4d 75 6c 74 69 49 74 65 72 53 65 74 75 70  rtMultiIterSetup
15fb0 28 70 2c 20 70 49 74 65 72 29 3b 0a 20 20 20 20  (p, pIter);.    
15fc0 61 73 73 65 72 74 28 20 70 53 65 67 3d 3d 26 70  assert( pSeg==&p
15fd0 49 74 65 72 2d 3e 61 53 65 67 5b 70 49 74 65 72  Iter->aSeg[pIter
15fe0 2d 3e 61 46 69 72 73 74 5b 31 5d 2e 69 46 69 72  ->aFirst[1].iFir
15ff0 73 74 5d 20 26 26 20 70 53 65 67 2d 3e 70 4c 65  st] && pSeg->pLe
16000 61 66 20 29 3b 0a 20 20 20 20 69 66 28 20 70 49  af );.    if( pI
16010 74 65 72 2d 3e 62 53 6b 69 70 45 6d 70 74 79 3d  ter->bSkipEmpty=
16020 3d 30 20 7c 7c 20 70 53 65 67 2d 3e 6e 50 6f 73  =0 || pSeg->nPos
16030 20 29 7b 0a 20 20 20 20 20 20 70 49 74 65 72 2d   ){.      pIter-
16040 3e 78 53 65 74 4f 75 74 70 75 74 73 28 70 49 74  >xSetOutputs(pIt
16050 65 72 2c 20 70 53 65 67 29 3b 0a 20 20 20 20 20  er, pSeg);.     
16060 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20   return;.    }. 
16070 20 20 20 62 55 73 65 46 72 6f 6d 20 3d 20 30 3b     bUseFrom = 0;
16080 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 76  .  }.}..static v
16090 6f 69 64 20 66 74 73 35 4d 75 6c 74 69 49 74 65  oid fts5MultiIte
160a0 72 4e 65 78 74 32 28 0a 20 20 46 74 73 35 49 6e  rNext2(.  Fts5In
160b0 64 65 78 20 2a 70 2c 20 0a 20 20 46 74 73 35 49  dex *p, .  Fts5I
160c0 74 65 72 20 2a 70 49 74 65 72 2c 0a 20 20 69 6e  ter *pIter,.  in
160d0 74 20 2a 70 62 4e 65 77 54 65 72 6d 20 20 20 20  t *pbNewTerm    
160e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
160f0 20 4f 55 54 3a 20 54 72 75 65 20 69 66 20 2a 6d   OUT: True if *m
16100 69 67 68 74 2a 20 62 65 20 6e 65 77 20 74 65 72  ight* be new ter
16110 6d 20 2a 2f 0a 29 7b 0a 20 20 61 73 73 65 72 74  m */.){.  assert
16120 28 20 70 49 74 65 72 2d 3e 62 53 6b 69 70 45 6d  ( pIter->bSkipEm
16130 70 74 79 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e  pty );.  if( p->
16140 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
16150 0a 20 20 20 20 2a 70 62 4e 65 77 54 65 72 6d 20  .    *pbNewTerm 
16160 3d 20 30 3b 0a 20 20 20 20 64 6f 7b 0a 20 20 20  = 0;.    do{.   
16170 20 20 20 69 6e 74 20 69 46 69 72 73 74 20 3d 20     int iFirst = 
16180 70 49 74 65 72 2d 3e 61 46 69 72 73 74 5b 31 5d  pIter->aFirst[1]
16190 2e 69 46 69 72 73 74 3b 0a 20 20 20 20 20 20 46  .iFirst;.      F
161a0 74 73 35 53 65 67 49 74 65 72 20 2a 70 53 65 67  ts5SegIter *pSeg
161b0 20 3d 20 26 70 49 74 65 72 2d 3e 61 53 65 67 5b   = &pIter->aSeg[
161c0 69 46 69 72 73 74 5d 3b 0a 20 20 20 20 20 20 69  iFirst];.      i
161d0 6e 74 20 62 4e 65 77 54 65 72 6d 20 3d 20 30 3b  nt bNewTerm = 0;
161e0 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ..      assert( 
161f0 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
16200 20 29 3b 0a 20 20 20 20 20 20 70 53 65 67 2d 3e   );.      pSeg->
16210 78 4e 65 78 74 28 70 2c 20 70 53 65 67 2c 20 26  xNext(p, pSeg, &
16220 62 4e 65 77 54 65 72 6d 29 3b 0a 20 20 20 20 20  bNewTerm);.     
16230 20 69 66 28 20 70 53 65 67 2d 3e 70 4c 65 61 66   if( pSeg->pLeaf
16240 3d 3d 30 20 7c 7c 20 62 4e 65 77 54 65 72 6d 20  ==0 || bNewTerm 
16250 0a 20 20 20 20 20 20 20 7c 7c 20 66 74 73 35 4d  .       || fts5M
16260 75 6c 74 69 49 74 65 72 41 64 76 61 6e 63 65 52  ultiIterAdvanceR
16270 6f 77 69 64 28 70 49 74 65 72 2c 20 69 46 69 72  owid(pIter, iFir
16280 73 74 2c 20 26 70 53 65 67 29 0a 20 20 20 20 20  st, &pSeg).     
16290 20 29 7b 0a 20 20 20 20 20 20 20 20 66 74 73 35   ){.        fts5
162a0 4d 75 6c 74 69 49 74 65 72 41 64 76 61 6e 63 65  MultiIterAdvance
162b0 64 28 70 2c 20 70 49 74 65 72 2c 20 69 46 69 72  d(p, pIter, iFir
162c0 73 74 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20  st, 1);.        
162d0 66 74 73 35 4d 75 6c 74 69 49 74 65 72 53 65 74  fts5MultiIterSet
162e0 45 6f 66 28 70 49 74 65 72 29 3b 0a 20 20 20 20  Eof(pIter);.    
162f0 20 20 20 20 2a 70 62 4e 65 77 54 65 72 6d 20 3d      *pbNewTerm =
16300 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   1;.      }.    
16310 20 20 66 74 73 35 41 73 73 65 72 74 4d 75 6c 74    fts5AssertMult
16320 69 49 74 65 72 53 65 74 75 70 28 70 2c 20 70 49  iIterSetup(p, pI
16330 74 65 72 29 3b 0a 0a 20 20 20 20 7d 77 68 69 6c  ter);..    }whil
16340 65 28 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72  e( fts5MultiIter
16350 49 73 45 6d 70 74 79 28 70 2c 20 70 49 74 65 72  IsEmpty(p, pIter
16360 29 20 29 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74  ) );.  }.}..stat
16370 69 63 20 76 6f 69 64 20 66 74 73 35 49 74 65 72  ic void fts5Iter
16380 53 65 74 4f 75 74 70 75 74 73 5f 4e 6f 6f 70 28  SetOutputs_Noop(
16390 46 74 73 35 49 74 65 72 20 2a 70 55 6e 75 73 65  Fts5Iter *pUnuse
163a0 64 31 2c 20 46 74 73 35 53 65 67 49 74 65 72 20  d1, Fts5SegIter 
163b0 2a 70 55 6e 75 73 65 64 32 29 7b 0a 20 20 55 4e  *pUnused2){.  UN
163c0 55 53 45 44 5f 50 41 52 41 4d 32 28 70 55 6e 75  USED_PARAM2(pUnu
163d0 73 65 64 31 2c 20 70 55 6e 75 73 65 64 32 29 3b  sed1, pUnused2);
163e0 0a 7d 0a 0a 73 74 61 74 69 63 20 46 74 73 35 49  .}..static Fts5I
163f0 74 65 72 20 2a 66 74 73 35 4d 75 6c 74 69 49 74  ter *fts5MultiIt
16400 65 72 41 6c 6c 6f 63 28 0a 20 20 46 74 73 35 49  erAlloc(.  Fts5I
16410 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20  ndex *p,        
16420 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54             /* FT
16430 53 35 20 62 61 63 6b 65 6e 64 20 74 6f 20 69 74  S5 backend to it
16440 65 72 61 74 65 20 77 69 74 68 69 6e 20 2a 2f 0a  erate within */.
16450 20 20 69 6e 74 20 6e 53 65 67 0a 29 7b 0a 20 20    int nSeg.){.  
16460 46 74 73 35 49 74 65 72 20 2a 70 4e 65 77 3b 0a  Fts5Iter *pNew;.
16470 20 20 69 6e 74 20 6e 53 6c 6f 74 3b 20 20 20 20    int nSlot;    
16480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16490 20 20 2f 2a 20 50 6f 77 65 72 20 6f 66 20 74 77    /* Power of tw
164a0 6f 20 3e 3d 20 6e 53 65 67 20 2a 2f 0a 0a 20 20  o >= nSeg */..  
164b0 66 6f 72 28 6e 53 6c 6f 74 3d 32 3b 20 6e 53 6c  for(nSlot=2; nSl
164c0 6f 74 3c 6e 53 65 67 3b 20 6e 53 6c 6f 74 3d 6e  ot<nSeg; nSlot=n
164d0 53 6c 6f 74 2a 32 29 3b 0a 20 20 70 4e 65 77 20  Slot*2);.  pNew 
164e0 3d 20 66 74 73 35 49 64 78 4d 61 6c 6c 6f 63 28  = fts5IdxMalloc(
164f0 70 2c 20 0a 20 20 20 20 20 20 73 69 7a 65 6f 66  p, .      sizeof
16500 28 46 74 73 35 49 74 65 72 29 20 2b 20 20 20 20  (Fts5Iter) +    
16510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
16520 20 70 4e 65 77 20 2a 2f 0a 20 20 20 20 20 20 73   pNew */.      s
16530 69 7a 65 6f 66 28 46 74 73 35 53 65 67 49 74 65  izeof(Fts5SegIte
16540 72 29 20 2a 20 28 6e 53 6c 6f 74 2d 31 29 20 2b  r) * (nSlot-1) +
16550 20 20 20 2f 2a 20 70 4e 65 77 2d 3e 61 53 65 67     /* pNew->aSeg
16560 5b 5d 20 2a 2f 0a 20 20 20 20 20 20 73 69 7a 65  [] */.      size
16570 6f 66 28 46 74 73 35 43 52 65 73 75 6c 74 29 20  of(Fts5CResult) 
16580 2a 20 6e 53 6c 6f 74 20 20 20 20 20 20 20 20 20  * nSlot         
16590 2f 2a 20 70 4e 65 77 2d 3e 61 46 69 72 73 74 5b  /* pNew->aFirst[
165a0 5d 20 2a 2f 0a 20 20 29 3b 0a 20 20 69 66 28 20  ] */.  );.  if( 
165b0 70 4e 65 77 20 29 7b 0a 20 20 20 20 70 4e 65 77  pNew ){.    pNew
165c0 2d 3e 6e 53 65 67 20 3d 20 6e 53 6c 6f 74 3b 0a  ->nSeg = nSlot;.
165d0 20 20 20 20 70 4e 65 77 2d 3e 61 46 69 72 73 74      pNew->aFirst
165e0 20 3d 20 28 46 74 73 35 43 52 65 73 75 6c 74 2a   = (Fts5CResult*
165f0 29 26 70 4e 65 77 2d 3e 61 53 65 67 5b 6e 53 6c  )&pNew->aSeg[nSl
16600 6f 74 5d 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 70  ot];.    pNew->p
16610 49 6e 64 65 78 20 3d 20 70 3b 0a 20 20 20 20 70  Index = p;.    p
16620 4e 65 77 2d 3e 78 53 65 74 4f 75 74 70 75 74 73  New->xSetOutputs
16630 20 3d 20 66 74 73 35 49 74 65 72 53 65 74 4f 75   = fts5IterSetOu
16640 74 70 75 74 73 5f 4e 6f 6f 70 3b 0a 20 20 7d 0a  tputs_Noop;.  }.
16650 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d    return pNew;.}
16660 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  ..static void ft
16670 73 35 50 6f 73 6c 69 73 74 43 61 6c 6c 62 61 63  s5PoslistCallbac
16680 6b 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a  k(.  Fts5Index *
16690 70 55 6e 75 73 65 64 2c 20 0a 20 20 76 6f 69 64  pUnused, .  void
166a0 20 2a 70 43 6f 6e 74 65 78 74 2c 20 0a 20 20 63   *pContext, .  c
166b0 6f 6e 73 74 20 75 38 20 2a 70 43 68 75 6e 6b 2c  onst u8 *pChunk,
166c0 20 69 6e 74 20 6e 43 68 75 6e 6b 0a 29 7b 0a 20   int nChunk.){. 
166d0 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 28 70 55   UNUSED_PARAM(pU
166e0 6e 75 73 65 64 29 3b 0a 20 20 61 73 73 65 72 74  nused);.  assert
166f0 5f 6e 63 28 20 6e 43 68 75 6e 6b 3e 3d 30 20 29  _nc( nChunk>=0 )
16700 3b 0a 20 20 69 66 28 20 6e 43 68 75 6e 6b 3e 30  ;.  if( nChunk>0
16710 20 29 7b 0a 20 20 20 20 66 74 73 35 42 75 66 66   ){.    fts5Buff
16720 65 72 53 61 66 65 41 70 70 65 6e 64 42 6c 6f 62  erSafeAppendBlob
16730 28 28 46 74 73 35 42 75 66 66 65 72 2a 29 70 43  ((Fts5Buffer*)pC
16740 6f 6e 74 65 78 74 2c 20 70 43 68 75 6e 6b 2c 20  ontext, pChunk, 
16750 6e 43 68 75 6e 6b 29 3b 0a 20 20 7d 0a 7d 0a 0a  nChunk);.  }.}..
16760 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 50  typedef struct P
16770 6f 73 6c 69 73 74 43 61 6c 6c 62 61 63 6b 43 74  oslistCallbackCt
16780 78 20 50 6f 73 6c 69 73 74 43 61 6c 6c 62 61 63  x PoslistCallbac
16790 6b 43 74 78 3b 0a 73 74 72 75 63 74 20 50 6f 73  kCtx;.struct Pos
167a0 6c 69 73 74 43 61 6c 6c 62 61 63 6b 43 74 78 20  listCallbackCtx 
167b0 7b 0a 20 20 46 74 73 35 42 75 66 66 65 72 20 2a  {.  Fts5Buffer *
167c0 70 42 75 66 3b 20 20 20 20 20 20 20 20 20 20 20  pBuf;           
167d0 20 20 20 20 2f 2a 20 41 70 70 65 6e 64 20 74 6f      /* Append to
167e0 20 74 68 69 73 20 62 75 66 66 65 72 20 2a 2f 0a   this buffer */.
167f0 20 20 46 74 73 35 43 6f 6c 73 65 74 20 2a 70 43    Fts5Colset *pC
16800 6f 6c 73 65 74 3b 20 20 20 20 20 20 20 20 20 20  olset;          
16810 20 20 2f 2a 20 52 65 73 74 72 69 63 74 20 6d 61    /* Restrict ma
16820 74 63 68 65 73 20 74 6f 20 74 68 69 73 20 63 6f  tches to this co
16830 6c 75 6d 6e 20 2a 2f 0a 20 20 69 6e 74 20 65 53  lumn */.  int eS
16840 74 61 74 65 3b 20 20 20 20 20 20 20 20 20 20 20  tate;           
16850 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 65            /* See
16860 20 61 62 6f 76 65 20 2a 2f 0a 7d 3b 0a 0a 74 79   above */.};..ty
16870 70 65 64 65 66 20 73 74 72 75 63 74 20 50 6f 73  pedef struct Pos
16880 6c 69 73 74 4f 66 66 73 65 74 73 43 74 78 20 50  listOffsetsCtx P
16890 6f 73 6c 69 73 74 4f 66 66 73 65 74 73 43 74 78  oslistOffsetsCtx
168a0 3b 0a 73 74 72 75 63 74 20 50 6f 73 6c 69 73 74  ;.struct Poslist
168b0 4f 66 66 73 65 74 73 43 74 78 20 7b 0a 20 20 46  OffsetsCtx {.  F
168c0 74 73 35 42 75 66 66 65 72 20 2a 70 42 75 66 3b  ts5Buffer *pBuf;
168d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
168e0 2a 20 41 70 70 65 6e 64 20 74 6f 20 74 68 69 73  * Append to this
168f0 20 62 75 66 66 65 72 20 2a 2f 0a 20 20 46 74 73   buffer */.  Fts
16900 35 43 6f 6c 73 65 74 20 2a 70 43 6f 6c 73 65 74  5Colset *pColset
16910 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
16920 52 65 73 74 72 69 63 74 20 6d 61 74 63 68 65 73  Restrict matches
16930 20 74 6f 20 74 68 69 73 20 63 6f 6c 75 6d 6e 20   to this column 
16940 2a 2f 0a 20 20 69 6e 74 20 69 52 65 61 64 3b 0a  */.  int iRead;.
16950 20 20 69 6e 74 20 69 57 72 69 74 65 3b 0a 7d 3b    int iWrite;.};
16960 0a 0a 2f 2a 0a 2a 2a 20 54 4f 44 4f 3a 20 4d 61  ../*.** TODO: Ma
16970 6b 65 20 74 68 69 73 20 6d 6f 72 65 20 65 66 66  ke this more eff
16980 69 63 69 65 6e 74 21 0a 2a 2f 0a 73 74 61 74 69  icient!.*/.stati
16990 63 20 69 6e 74 20 66 74 73 35 49 6e 64 65 78 43  c int fts5IndexC
169a0 6f 6c 73 65 74 54 65 73 74 28 46 74 73 35 43 6f  olsetTest(Fts5Co
169b0 6c 73 65 74 20 2a 70 43 6f 6c 73 65 74 2c 20 69  lset *pColset, i
169c0 6e 74 20 69 43 6f 6c 29 7b 0a 20 20 69 6e 74 20  nt iCol){.  int 
169d0 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  i;.  for(i=0; i<
169e0 70 43 6f 6c 73 65 74 2d 3e 6e 43 6f 6c 3b 20 69  pColset->nCol; i
169f0 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 43 6f  ++){.    if( pCo
16a00 6c 73 65 74 2d 3e 61 69 43 6f 6c 5b 69 5d 3d 3d  lset->aiCol[i]==
16a10 69 43 6f 6c 20 29 20 72 65 74 75 72 6e 20 31 3b  iCol ) return 1;
16a20 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
16a30 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .}..static void 
16a40 66 74 73 35 50 6f 73 6c 69 73 74 4f 66 66 73 65  fts5PoslistOffse
16a50 74 73 43 61 6c 6c 62 61 63 6b 28 0a 20 20 46 74  tsCallback(.  Ft
16a60 73 35 49 6e 64 65 78 20 2a 70 55 6e 75 73 65 64  s5Index *pUnused
16a70 2c 20 0a 20 20 76 6f 69 64 20 2a 70 43 6f 6e 74  , .  void *pCont
16a80 65 78 74 2c 20 0a 20 20 63 6f 6e 73 74 20 75 38  ext, .  const u8
16a90 20 2a 70 43 68 75 6e 6b 2c 20 69 6e 74 20 6e 43   *pChunk, int nC
16aa0 68 75 6e 6b 0a 29 7b 0a 20 20 50 6f 73 6c 69 73  hunk.){.  Poslis
16ab0 74 4f 66 66 73 65 74 73 43 74 78 20 2a 70 43 74  tOffsetsCtx *pCt
16ac0 78 20 3d 20 28 50 6f 73 6c 69 73 74 4f 66 66 73  x = (PoslistOffs
16ad0 65 74 73 43 74 78 2a 29 70 43 6f 6e 74 65 78 74  etsCtx*)pContext
16ae0 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ;.  UNUSED_PARAM
16af0 28 70 55 6e 75 73 65 64 29 3b 0a 20 20 61 73 73  (pUnused);.  ass
16b00 65 72 74 5f 6e 63 28 20 6e 43 68 75 6e 6b 3e 3d  ert_nc( nChunk>=
16b10 30 20 29 3b 0a 20 20 69 66 28 20 6e 43 68 75 6e  0 );.  if( nChun
16b20 6b 3e 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  k>0 ){.    int i
16b30 20 3d 20 30 3b 0a 20 20 20 20 77 68 69 6c 65 28   = 0;.    while(
16b40 20 69 3c 6e 43 68 75 6e 6b 20 29 7b 0a 20 20 20   i<nChunk ){.   
16b50 20 20 20 69 6e 74 20 69 56 61 6c 3b 0a 20 20 20     int iVal;.   
16b60 20 20 20 69 20 2b 3d 20 66 74 73 35 47 65 74 56     i += fts5GetV
16b70 61 72 69 6e 74 33 32 28 26 70 43 68 75 6e 6b 5b  arint32(&pChunk[
16b80 69 5d 2c 20 69 56 61 6c 29 3b 0a 20 20 20 20 20  i], iVal);.     
16b90 20 69 56 61 6c 20 2b 3d 20 70 43 74 78 2d 3e 69   iVal += pCtx->i
16ba0 52 65 61 64 20 2d 20 32 3b 0a 20 20 20 20 20 20  Read - 2;.      
16bb0 70 43 74 78 2d 3e 69 52 65 61 64 20 3d 20 69 56  pCtx->iRead = iV
16bc0 61 6c 3b 0a 20 20 20 20 20 20 69 66 28 20 66 74  al;.      if( ft
16bd0 73 35 49 6e 64 65 78 43 6f 6c 73 65 74 54 65 73  s5IndexColsetTes
16be0 74 28 70 43 74 78 2d 3e 70 43 6f 6c 73 65 74 2c  t(pCtx->pColset,
16bf0 20 69 56 61 6c 29 20 29 7b 0a 20 20 20 20 20 20   iVal) ){.      
16c00 20 20 66 74 73 35 42 75 66 66 65 72 53 61 66 65    fts5BufferSafe
16c10 41 70 70 65 6e 64 56 61 72 69 6e 74 28 70 43 74  AppendVarint(pCt
16c20 78 2d 3e 70 42 75 66 2c 20 69 56 61 6c 20 2b 20  x->pBuf, iVal + 
16c30 32 20 2d 20 70 43 74 78 2d 3e 69 57 72 69 74 65  2 - pCtx->iWrite
16c40 29 3b 0a 20 20 20 20 20 20 20 20 70 43 74 78 2d  );.        pCtx-
16c50 3e 69 57 72 69 74 65 20 3d 20 69 56 61 6c 3b 0a  >iWrite = iVal;.
16c60 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
16c70 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64  }.}..static void
16c80 20 66 74 73 35 50 6f 73 6c 69 73 74 46 69 6c 74   fts5PoslistFilt
16c90 65 72 43 61 6c 6c 62 61 63 6b 28 0a 20 20 46 74  erCallback(.  Ft
16ca0 73 35 49 6e 64 65 78 20 2a 70 55 6e 75 73 65 64  s5Index *pUnused
16cb0 2c 0a 20 20 76 6f 69 64 20 2a 70 43 6f 6e 74 65  ,.  void *pConte
16cc0 78 74 2c 20 0a 20 20 63 6f 6e 73 74 20 75 38 20  xt, .  const u8 
16cd0 2a 70 43 68 75 6e 6b 2c 20 69 6e 74 20 6e 43 68  *pChunk, int nCh
16ce0 75 6e 6b 0a 29 7b 0a 20 20 50 6f 73 6c 69 73 74  unk.){.  Poslist
16cf0 43 61 6c 6c 62 61 63 6b 43 74 78 20 2a 70 43 74  CallbackCtx *pCt
16d00 78 20 3d 20 28 50 6f 73 6c 69 73 74 43 61 6c 6c  x = (PoslistCall
16d10 62 61 63 6b 43 74 78 2a 29 70 43 6f 6e 74 65 78  backCtx*)pContex
16d20 74 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  t;.  UNUSED_PARA
16d30 4d 28 70 55 6e 75 73 65 64 29 3b 0a 20 20 61 73  M(pUnused);.  as
16d40 73 65 72 74 5f 6e 63 28 20 6e 43 68 75 6e 6b 3e  sert_nc( nChunk>
16d50 3d 30 20 29 3b 0a 20 20 69 66 28 20 6e 43 68 75  =0 );.  if( nChu
16d60 6e 6b 3e 30 20 29 7b 0a 20 20 20 20 2f 2a 20 53  nk>0 ){.    /* S
16d70 65 61 72 63 68 20 74 68 72 6f 75 67 68 20 74 6f  earch through to
16d80 20 66 69 6e 64 20 74 68 65 20 66 69 72 73 74 20   find the first 
16d90 76 61 72 69 6e 74 20 77 69 74 68 20 76 61 6c 75  varint with valu
16da0 65 20 31 2e 20 54 68 69 73 20 69 73 20 74 68 65  e 1. This is the
16db0 0a 20 20 20 20 2a 2a 20 73 74 61 72 74 20 6f 66  .    ** start of
16dc0 20 74 68 65 20 6e 65 78 74 20 63 6f 6c 75 6d 6e   the next column
16dd0 73 20 68 69 74 73 2e 20 2a 2f 0a 20 20 20 20 69  s hits. */.    i
16de0 6e 74 20 69 20 3d 20 30 3b 0a 20 20 20 20 69 6e  nt i = 0;.    in
16df0 74 20 69 53 74 61 72 74 20 3d 20 30 3b 0a 0a 20  t iStart = 0;.. 
16e00 20 20 20 69 66 28 20 70 43 74 78 2d 3e 65 53 74     if( pCtx->eSt
16e10 61 74 65 3d 3d 32 20 29 7b 0a 20 20 20 20 20 20  ate==2 ){.      
16e20 69 6e 74 20 69 43 6f 6c 3b 0a 20 20 20 20 20 20  int iCol;.      
16e30 66 74 73 35 46 61 73 74 47 65 74 56 61 72 69 6e  fts5FastGetVarin
16e40 74 33 32 28 70 43 68 75 6e 6b 2c 20 69 2c 20 69  t32(pChunk, i, i
16e50 43 6f 6c 29 3b 0a 20 20 20 20 20 20 69 66 28 20  Col);.      if( 
16e60 66 74 73 35 49 6e 64 65 78 43 6f 6c 73 65 74 54  fts5IndexColsetT
16e70 65 73 74 28 70 43 74 78 2d 3e 70 43 6f 6c 73 65  est(pCtx->pColse
16e80 74 2c 20 69 43 6f 6c 29 20 29 7b 0a 20 20 20 20  t, iCol) ){.    
16e90 20 20 20 20 70 43 74 78 2d 3e 65 53 74 61 74 65      pCtx->eState
16ea0 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 66 74   = 1;.        ft
16eb0 73 35 42 75 66 66 65 72 53 61 66 65 41 70 70 65  s5BufferSafeAppe
16ec0 6e 64 56 61 72 69 6e 74 28 70 43 74 78 2d 3e 70  ndVarint(pCtx->p
16ed0 42 75 66 2c 20 31 29 3b 0a 20 20 20 20 20 20 7d  Buf, 1);.      }
16ee0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 43  else{.        pC
16ef0 74 78 2d 3e 65 53 74 61 74 65 20 3d 20 30 3b 0a  tx->eState = 0;.
16f00 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
16f10 20 20 20 64 6f 20 7b 0a 20 20 20 20 20 20 77 68     do {.      wh
16f20 69 6c 65 28 20 69 3c 6e 43 68 75 6e 6b 20 26 26  ile( i<nChunk &&
16f30 20 70 43 68 75 6e 6b 5b 69 5d 21 3d 30 78 30 31   pChunk[i]!=0x01
16f40 20 29 7b 0a 20 20 20 20 20 20 20 20 77 68 69 6c   ){.        whil
16f50 65 28 20 70 43 68 75 6e 6b 5b 69 5d 20 26 20 30  e( pChunk[i] & 0
16f60 78 38 30 20 29 20 69 2b 2b 3b 0a 20 20 20 20 20  x80 ) i++;.     
16f70 20 20 20 69 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a     i++;.      }.
16f80 20 20 20 20 20 20 69 66 28 20 70 43 74 78 2d 3e        if( pCtx->
16f90 65 53 74 61 74 65 20 29 7b 0a 20 20 20 20 20 20  eState ){.      
16fa0 20 20 66 74 73 35 42 75 66 66 65 72 53 61 66 65    fts5BufferSafe
16fb0 41 70 70 65 6e 64 42 6c 6f 62 28 70 43 74 78 2d  AppendBlob(pCtx-
16fc0 3e 70 42 75 66 2c 20 26 70 43 68 75 6e 6b 5b 69  >pBuf, &pChunk[i
16fd0 53 74 61 72 74 5d 2c 20 69 2d 69 53 74 61 72 74  Start], i-iStart
16fe0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
16ff0 20 69 66 28 20 69 3c 6e 43 68 75 6e 6b 20 29 7b   if( i<nChunk ){
17000 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 43 6f  .        int iCo
17010 6c 3b 0a 20 20 20 20 20 20 20 20 69 53 74 61 72  l;.        iStar
17020 74 20 3d 20 69 3b 0a 20 20 20 20 20 20 20 20 69  t = i;.        i
17030 2b 2b 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ++;.        if( 
17040 69 3e 3d 6e 43 68 75 6e 6b 20 29 7b 0a 20 20 20  i>=nChunk ){.   
17050 20 20 20 20 20 20 20 70 43 74 78 2d 3e 65 53 74         pCtx->eSt
17060 61 74 65 20 3d 20 32 3b 0a 20 20 20 20 20 20 20  ate = 2;.       
17070 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
17080 20 20 66 74 73 35 46 61 73 74 47 65 74 56 61 72    fts5FastGetVar
17090 69 6e 74 33 32 28 70 43 68 75 6e 6b 2c 20 69 2c  int32(pChunk, i,
170a0 20 69 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20   iCol);.        
170b0 20 20 70 43 74 78 2d 3e 65 53 74 61 74 65 20 3d    pCtx->eState =
170c0 20 66 74 73 35 49 6e 64 65 78 43 6f 6c 73 65 74   fts5IndexColset
170d0 54 65 73 74 28 70 43 74 78 2d 3e 70 43 6f 6c 73  Test(pCtx->pCols
170e0 65 74 2c 20 69 43 6f 6c 29 3b 0a 20 20 20 20 20  et, iCol);.     
170f0 20 20 20 20 20 69 66 28 20 70 43 74 78 2d 3e 65       if( pCtx->e
17100 53 74 61 74 65 20 29 7b 0a 20 20 20 20 20 20 20  State ){.       
17110 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72 53       fts5BufferS
17120 61 66 65 41 70 70 65 6e 64 42 6c 6f 62 28 70 43  afeAppendBlob(pC
17130 74 78 2d 3e 70 42 75 66 2c 20 26 70 43 68 75 6e  tx->pBuf, &pChun
17140 6b 5b 69 53 74 61 72 74 5d 2c 20 69 2d 69 53 74  k[iStart], i-iSt
17150 61 72 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20  art);.          
17160 20 20 69 53 74 61 72 74 20 3d 20 69 3b 0a 20 20    iStart = i;.  
17170 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
17180 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
17190 7d 77 68 69 6c 65 28 20 69 3c 6e 43 68 75 6e 6b  }while( i<nChunk
171a0 20 29 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69   );.  }.}..stati
171b0 63 20 76 6f 69 64 20 66 74 73 35 43 68 75 6e 6b  c void fts5Chunk
171c0 49 74 65 72 61 74 65 28 0a 20 20 46 74 73 35 49  Iterate(.  Fts5I
171d0 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20  ndex *p,        
171e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
171f0 64 65 78 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  dex object */.  
17200 46 74 73 35 53 65 67 49 74 65 72 20 2a 70 53 65  Fts5SegIter *pSe
17210 67 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  g,              
17220 2f 2a 20 50 6f 73 6c 69 73 74 20 6f 66 20 74 68  /* Poslist of th
17230 69 73 20 69 74 65 72 61 74 6f 72 20 2a 2f 0a 20  is iterator */. 
17240 20 76 6f 69 64 20 2a 70 43 74 78 2c 20 20 20 20   void *pCtx,    
17250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17260 20 2f 2a 20 43 6f 6e 74 65 78 74 20 70 6f 69 6e   /* Context poin
17270 74 65 72 20 66 6f 72 20 78 43 68 75 6e 6b 20 63  ter for xChunk c
17280 61 6c 6c 62 61 63 6b 20 2a 2f 0a 20 20 76 6f 69  allback */.  voi
17290 64 20 28 2a 78 43 68 75 6e 6b 29 28 46 74 73 35  d (*xChunk)(Fts5
172a0 49 6e 64 65 78 2a 2c 20 76 6f 69 64 2a 2c 20 63  Index*, void*, c
172b0 6f 6e 73 74 20 75 38 2a 2c 20 69 6e 74 29 0a 29  onst u8*, int).)
172c0 7b 0a 20 20 69 6e 74 20 6e 52 65 6d 20 3d 20 70  {.  int nRem = p
172d0 53 65 67 2d 3e 6e 50 6f 73 3b 20 20 20 20 20 20  Seg->nPos;      
172e0 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
172f0 20 62 79 74 65 73 20 73 74 69 6c 6c 20 74 6f 20   bytes still to 
17300 63 6f 6d 65 20 2a 2f 0a 20 20 46 74 73 35 44 61  come */.  Fts5Da
17310 74 61 20 2a 70 44 61 74 61 20 3d 20 30 3b 0a 20  ta *pData = 0;. 
17320 20 75 38 20 2a 70 43 68 75 6e 6b 20 3d 20 26 70   u8 *pChunk = &p
17330 53 65 67 2d 3e 70 4c 65 61 66 2d 3e 70 5b 70 53  Seg->pLeaf->p[pS
17340 65 67 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 5d  eg->iLeafOffset]
17350 3b 0a 20 20 69 6e 74 20 6e 43 68 75 6e 6b 20 3d  ;.  int nChunk =
17360 20 4d 49 4e 28 6e 52 65 6d 2c 20 70 53 65 67 2d   MIN(nRem, pSeg-
17370 3e 70 4c 65 61 66 2d 3e 73 7a 4c 65 61 66 20 2d  >pLeaf->szLeaf -
17380 20 70 53 65 67 2d 3e 69 4c 65 61 66 4f 66 66 73   pSeg->iLeafOffs
17390 65 74 29 3b 0a 20 20 69 6e 74 20 70 67 6e 6f 20  et);.  int pgno 
173a0 3d 20 70 53 65 67 2d 3e 69 4c 65 61 66 50 67 6e  = pSeg->iLeafPgn
173b0 6f 3b 0a 20 20 69 6e 74 20 70 67 6e 6f 53 61 76  o;.  int pgnoSav
173c0 65 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 54 68 69  e = 0;..  /* Thi
173d0 73 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20  s function does 
173e0 6e 6f 74 6d 77 6f 72 6b 20 77 69 74 68 20 64 65  notmwork with de
173f0 74 61 69 6c 3d 6e 6f 6e 65 20 64 61 74 61 62 61  tail=none databa
17400 73 65 73 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74  ses. */.  assert
17410 28 20 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e 65 44  ( p->pConfig->eD
17420 65 74 61 69 6c 21 3d 46 54 53 35 5f 44 45 54 41  etail!=FTS5_DETA
17430 49 4c 5f 4e 4f 4e 45 20 29 3b 0a 0a 20 20 69 66  IL_NONE );..  if
17440 28 20 28 70 53 65 67 2d 3e 66 6c 61 67 73 20 26  ( (pSeg->flags &
17450 20 46 54 53 35 5f 53 45 47 49 54 45 52 5f 52 45   FTS5_SEGITER_RE
17460 56 45 52 53 45 29 3d 3d 30 20 29 7b 0a 20 20 20  VERSE)==0 ){.   
17470 20 70 67 6e 6f 53 61 76 65 20 3d 20 70 67 6e 6f   pgnoSave = pgno
17480 2b 31 3b 0a 20 20 7d 0a 0a 20 20 77 68 69 6c 65  +1;.  }..  while
17490 28 20 31 20 29 7b 0a 20 20 20 20 78 43 68 75 6e  ( 1 ){.    xChun
174a0 6b 28 70 2c 20 70 43 74 78 2c 20 70 43 68 75 6e  k(p, pCtx, pChun
174b0 6b 2c 20 6e 43 68 75 6e 6b 29 3b 0a 20 20 20 20  k, nChunk);.    
174c0 6e 52 65 6d 20 2d 3d 20 6e 43 68 75 6e 6b 3b 0a  nRem -= nChunk;.
174d0 20 20 20 20 66 74 73 35 44 61 74 61 52 65 6c 65      fts5DataRele
174e0 61 73 65 28 70 44 61 74 61 29 3b 0a 20 20 20 20  ase(pData);.    
174f0 69 66 28 20 6e 52 65 6d 3c 3d 30 20 29 7b 0a 20  if( nRem<=0 ){. 
17500 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
17510 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 67 6e  }else{.      pgn
17520 6f 2b 2b 3b 0a 20 20 20 20 20 20 70 44 61 74 61  o++;.      pData
17530 20 3d 20 66 74 73 35 4c 65 61 66 52 65 61 64 28   = fts5LeafRead(
17540 70 2c 20 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f  p, FTS5_SEGMENT_
17550 52 4f 57 49 44 28 70 53 65 67 2d 3e 70 53 65 67  ROWID(pSeg->pSeg
17560 2d 3e 69 53 65 67 69 64 2c 20 70 67 6e 6f 29 29  ->iSegid, pgno))
17570 3b 0a 20 20 20 20 20 20 69 66 28 20 70 44 61 74  ;.      if( pDat
17580 61 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20  a==0 ) break;.  
17590 20 20 20 20 70 43 68 75 6e 6b 20 3d 20 26 70 44      pChunk = &pD
175a0 61 74 61 2d 3e 70 5b 34 5d 3b 0a 20 20 20 20 20  ata->p[4];.     
175b0 20 6e 43 68 75 6e 6b 20 3d 20 4d 49 4e 28 6e 52   nChunk = MIN(nR
175c0 65 6d 2c 20 70 44 61 74 61 2d 3e 73 7a 4c 65 61  em, pData->szLea
175d0 66 20 2d 20 34 29 3b 0a 20 20 20 20 20 20 69 66  f - 4);.      if
175e0 28 20 70 67 6e 6f 3d 3d 70 67 6e 6f 53 61 76 65  ( pgno==pgnoSave
175f0 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65   ){.        asse
17600 72 74 28 20 70 53 65 67 2d 3e 70 4e 65 78 74 4c  rt( pSeg->pNextL
17610 65 61 66 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  eaf==0 );.      
17620 20 20 70 53 65 67 2d 3e 70 4e 65 78 74 4c 65 61    pSeg->pNextLea
17630 66 20 3d 20 70 44 61 74 61 3b 0a 20 20 20 20 20  f = pData;.     
17640 20 20 20 70 44 61 74 61 20 3d 20 30 3b 0a 20 20     pData = 0;.  
17650 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
17660 7d 0a 0a 2f 2a 0a 2a 2a 20 49 74 65 72 61 74 6f  }../*.** Iterato
17670 72 20 70 49 74 65 72 20 63 75 72 72 65 6e 74 6c  r pIter currentl
17680 79 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 76 61  y points to a va
17690 6c 69 64 20 65 6e 74 72 79 20 28 6e 6f 74 20 45  lid entry (not E
176a0 4f 46 29 2e 20 54 68 69 73 0a 2a 2a 20 66 75 6e  OF). This.** fun
176b0 63 74 69 6f 6e 20 61 70 70 65 6e 64 73 20 74 68  ction appends th
176c0 65 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74 20  e position list 
176d0 64 61 74 61 20 66 6f 72 20 74 68 65 20 63 75 72  data for the cur
176e0 72 65 6e 74 20 65 6e 74 72 79 20 74 6f 0a 2a 2a  rent entry to.**
176f0 20 62 75 66 66 65 72 20 70 42 75 66 2e 20 49 74   buffer pBuf. It
17700 20 64 6f 65 73 20 6e 6f 74 20 6d 61 6b 65 20 61   does not make a
17710 20 63 6f 70 79 20 6f 66 20 74 68 65 20 70 6f 73   copy of the pos
17720 69 74 69 6f 6e 2d 6c 69 73 74 20 73 69 7a 65 0a  ition-list size.
17730 2a 2a 20 66 69 65 6c 64 2e 0a 2a 2f 0a 73 74 61  ** field..*/.sta
17740 74 69 63 20 76 6f 69 64 20 66 74 73 35 53 65 67  tic void fts5Seg
17750 69 74 65 72 50 6f 73 6c 69 73 74 28 0a 20 20 46  iterPoslist(.  F
17760 74 73 35 49 6e 64 65 78 20 2a 70 2c 0a 20 20 46  ts5Index *p,.  F
17770 74 73 35 53 65 67 49 74 65 72 20 2a 70 53 65 67  ts5SegIter *pSeg
17780 2c 0a 20 20 46 74 73 35 43 6f 6c 73 65 74 20 2a  ,.  Fts5Colset *
17790 70 43 6f 6c 73 65 74 2c 0a 20 20 46 74 73 35 42  pColset,.  Fts5B
177a0 75 66 66 65 72 20 2a 70 42 75 66 0a 29 7b 0a 20  uffer *pBuf.){. 
177b0 20 69 66 28 20 30 3d 3d 66 74 73 35 42 75 66 66   if( 0==fts5Buff
177c0 65 72 47 72 6f 77 28 26 70 2d 3e 72 63 2c 20 70  erGrow(&p->rc, p
177d0 42 75 66 2c 20 70 53 65 67 2d 3e 6e 50 6f 73 29  Buf, pSeg->nPos)
177e0 20 29 7b 0a 20 20 20 20 69 66 28 20 70 43 6f 6c   ){.    if( pCol
177f0 73 65 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  set==0 ){.      
17800 66 74 73 35 43 68 75 6e 6b 49 74 65 72 61 74 65  fts5ChunkIterate
17810 28 70 2c 20 70 53 65 67 2c 20 28 76 6f 69 64 2a  (p, pSeg, (void*
17820 29 70 42 75 66 2c 20 66 74 73 35 50 6f 73 6c 69  )pBuf, fts5Posli
17830 73 74 43 61 6c 6c 62 61 63 6b 29 3b 0a 20 20 20  stCallback);.   
17840 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 66   }else{.      if
17850 28 20 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e 65 44  ( p->pConfig->eD
17860 65 74 61 69 6c 3d 3d 46 54 53 35 5f 44 45 54 41  etail==FTS5_DETA
17870 49 4c 5f 46 55 4c 4c 20 29 7b 0a 20 20 20 20 20  IL_FULL ){.     
17880 20 20 20 50 6f 73 6c 69 73 74 43 61 6c 6c 62 61     PoslistCallba
17890 63 6b 43 74 78 20 73 43 74 78 3b 0a 20 20 20 20  ckCtx sCtx;.    
178a0 20 20 20 20 73 43 74 78 2e 70 42 75 66 20 3d 20      sCtx.pBuf = 
178b0 70 42 75 66 3b 0a 20 20 20 20 20 20 20 20 73 43  pBuf;.        sC
178c0 74 78 2e 70 43 6f 6c 73 65 74 20 3d 20 70 43 6f  tx.pColset = pCo
178d0 6c 73 65 74 3b 0a 20 20 20 20 20 20 20 20 73 43  lset;.        sC
178e0 74 78 2e 65 53 74 61 74 65 20 3d 20 66 74 73 35  tx.eState = fts5
178f0 49 6e 64 65 78 43 6f 6c 73 65 74 54 65 73 74 28  IndexColsetTest(
17900 70 43 6f 6c 73 65 74 2c 20 30 29 3b 0a 20 20 20  pColset, 0);.   
17910 20 20 20 20 20 61 73 73 65 72 74 28 20 73 43 74       assert( sCt
17920 78 2e 65 53 74 61 74 65 3d 3d 30 20 7c 7c 20 73  x.eState==0 || s
17930 43 74 78 2e 65 53 74 61 74 65 3d 3d 31 20 29 3b  Ctx.eState==1 );
17940 0a 20 20 20 20 20 20 20 20 66 74 73 35 43 68 75  .        fts5Chu
17950 6e 6b 49 74 65 72 61 74 65 28 70 2c 20 70 53 65  nkIterate(p, pSe
17960 67 2c 20 28 76 6f 69 64 2a 29 26 73 43 74 78 2c  g, (void*)&sCtx,
17970 20 66 74 73 35 50 6f 73 6c 69 73 74 46 69 6c 74   fts5PoslistFilt
17980 65 72 43 61 6c 6c 62 61 63 6b 29 3b 0a 20 20 20  erCallback);.   
17990 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
179a0 20 20 50 6f 73 6c 69 73 74 4f 66 66 73 65 74 73    PoslistOffsets
179b0 43 74 78 20 73 43 74 78 3b 0a 20 20 20 20 20 20  Ctx sCtx;.      
179c0 20 20 6d 65 6d 73 65 74 28 26 73 43 74 78 2c 20    memset(&sCtx, 
179d0 30 2c 20 73 69 7a 65 6f 66 28 73 43 74 78 29 29  0, sizeof(sCtx))
179e0 3b 0a 20 20 20 20 20 20 20 20 73 43 74 78 2e 70  ;.        sCtx.p
179f0 42 75 66 20 3d 20 70 42 75 66 3b 0a 20 20 20 20  Buf = pBuf;.    
17a00 20 20 20 20 73 43 74 78 2e 70 43 6f 6c 73 65 74      sCtx.pColset
17a10 20 3d 20 70 43 6f 6c 73 65 74 3b 0a 20 20 20 20   = pColset;.    
17a20 20 20 20 20 66 74 73 35 43 68 75 6e 6b 49 74 65      fts5ChunkIte
17a30 72 61 74 65 28 70 2c 20 70 53 65 67 2c 20 28 76  rate(p, pSeg, (v
17a40 6f 69 64 2a 29 26 73 43 74 78 2c 20 66 74 73 35  oid*)&sCtx, fts5
17a50 50 6f 73 6c 69 73 74 4f 66 66 73 65 74 73 43 61  PoslistOffsetsCa
17a60 6c 6c 62 61 63 6b 29 3b 0a 20 20 20 20 20 20 7d  llback);.      }
17a70 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a  .    }.  }.}../*
17a80 0a 2a 2a 20 49 4e 2f 4f 55 54 20 70 61 72 61 6d  .** IN/OUT param
17a90 65 74 65 72 20 28 2a 70 61 29 20 70 6f 69 6e 74  eter (*pa) point
17aa0 73 20 74 6f 20 61 20 70 6f 73 69 74 69 6f 6e 20  s to a position 
17ab0 6c 69 73 74 20 6e 20 62 79 74 65 73 20 69 6e 20  list n bytes in 
17ac0 73 69 7a 65 2e 20 49 66 0a 2a 2a 20 74 68 65 20  size. If.** the 
17ad0 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74 20 63 6f  position list co
17ae0 6e 74 61 69 6e 73 20 65 6e 74 72 69 65 73 20 66  ntains entries f
17af0 6f 72 20 63 6f 6c 75 6d 6e 20 69 43 6f 6c 2c 20  or column iCol, 
17b00 74 68 65 6e 20 28 2a 70 61 29 20 69 73 20 73 65  then (*pa) is se
17b10 74 0a 2a 2a 20 74 6f 20 70 6f 69 6e 74 20 74 6f  t.** to point to
17b20 20 74 68 65 20 73 75 62 2d 70 6f 73 69 74 69 6f   the sub-positio
17b30 6e 2d 6c 69 73 74 20 66 6f 72 20 74 68 61 74 20  n-list for that 
17b40 63 6f 6c 75 6d 6e 20 61 6e 64 20 74 68 65 20 6e  column and the n
17b50 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 62 79 74 65  umber of.** byte
17b60 73 20 69 6e 20 69 74 20 72 65 74 75 72 6e 65 64  s in it returned
17b70 2e 20 4f 72 2c 20 69 66 20 74 68 65 20 61 72 67  . Or, if the arg
17b80 75 6d 65 6e 74 20 70 6f 73 69 74 69 6f 6e 20 6c  ument position l
17b90 69 73 74 20 64 6f 65 73 20 6e 6f 74 0a 2a 2a 20  ist does not.** 
17ba0 63 6f 6e 74 61 69 6e 20 61 6e 79 20 65 6e 74 72  contain any entr
17bb0 69 65 73 20 66 6f 72 20 63 6f 6c 75 6d 6e 20 69  ies for column i
17bc0 43 6f 6c 2c 20 72 65 74 75 72 6e 20 30 2e 0a 2a  Col, return 0..*
17bd0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73  /.static int fts
17be0 35 49 6e 64 65 78 45 78 74 72 61 63 74 43 6f 6c  5IndexExtractCol
17bf0 28 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 2a 70  (.  const u8 **p
17c00 61 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  a,              
17c10 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 50      /* IN/OUT: P
17c20 6f 69 6e 74 65 72 20 74 6f 20 70 6f 73 6c 69 73  ointer to poslis
17c30 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 2c 20 20 20  t */.  int n,   
17c40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17c50 20 20 20 20 20 20 20 2f 2a 20 49 4e 3a 20 53 69         /* IN: Si
17c60 7a 65 20 6f 66 20 70 6f 73 6c 69 73 74 20 69 6e  ze of poslist in
17c70 20 62 79 74 65 73 20 2a 2f 0a 20 20 69 6e 74 20   bytes */.  int 
17c80 69 43 6f 6c 20 20 20 20 20 20 20 20 20 20 20 20  iCol            
17c90 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
17ca0 6f 6c 75 6d 6e 20 74 6f 20 65 78 74 72 61 63 74  olumn to extract
17cb0 20 66 72 6f 6d 20 70 6f 73 6c 69 73 74 20 2a 2f   from poslist */
17cc0 0a 29 7b 0a 20 20 69 6e 74 20 69 43 75 72 72 65  .){.  int iCurre
17cd0 6e 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  nt = 0;         
17ce0 20 20 20 20 20 20 2f 2a 20 41 6e 79 74 68 69 6e        /* Anythin
17cf0 67 20 62 65 66 6f 72 65 20 74 68 65 20 66 69 72  g before the fir
17d00 73 74 20 30 78 30 31 20 69 73 20 63 6f 6c 20 30  st 0x01 is col 0
17d10 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a   */.  const u8 *
17d20 70 20 3d 20 2a 70 61 3b 0a 20 20 63 6f 6e 73 74  p = *pa;.  const
17d30 20 75 38 20 2a 70 45 6e 64 20 3d 20 26 70 5b 6e   u8 *pEnd = &p[n
17d40 5d 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e  ];         /* On
17d50 65 20 62 79 74 65 20 70 61 73 74 20 65 6e 64 20  e byte past end 
17d60 6f 66 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74  of position list
17d70 20 2a 2f 0a 0a 20 20 77 68 69 6c 65 28 20 69 43   */..  while( iC
17d80 6f 6c 3e 69 43 75 72 72 65 6e 74 20 29 7b 0a 20  ol>iCurrent ){. 
17d90 20 20 20 2f 2a 20 41 64 76 61 6e 63 65 20 70 6f     /* Advance po
17da0 69 6e 74 65 72 20 70 20 75 6e 74 69 6c 20 69 74  inter p until it
17db0 20 70 6f 69 6e 74 73 20 74 6f 20 70 45 6e 64 20   points to pEnd 
17dc0 6f 72 20 61 6e 20 30 78 30 31 20 62 79 74 65 20  or an 0x01 byte 
17dd0 74 68 61 74 20 69 73 0a 20 20 20 20 2a 2a 20 6e  that is.    ** n
17de0 6f 74 20 70 61 72 74 20 6f 66 20 61 20 76 61 72  ot part of a var
17df0 69 6e 74 2e 20 4e 6f 74 65 20 74 68 61 74 20 69  int. Note that i
17e00 74 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c  t is not possibl
17e10 65 20 66 6f 72 20 61 20 6e 65 67 61 74 69 76 65  e for a negative
17e20 0a 20 20 20 20 2a 2a 20 6f 72 20 65 78 74 72 65  .    ** or extre
17e30 6d 65 6c 79 20 6c 61 72 67 65 20 76 61 72 69 6e  mely large varin
17e40 74 20 74 6f 20 6f 63 63 75 72 20 77 69 74 68 69  t to occur withi
17e50 6e 20 61 6e 20 75 6e 63 6f 72 72 75 70 74 65 64  n an uncorrupted
17e60 20 70 6f 73 69 74 69 6f 6e 20 0a 20 20 20 20 2a   position .    *
17e70 2a 20 6c 69 73 74 2e 20 53 6f 20 74 68 65 20 6c  * list. So the l
17e80 61 73 74 20 62 79 74 65 20 6f 66 20 65 61 63 68  ast byte of each
17e90 20 76 61 72 69 6e 74 20 6d 61 79 20 62 65 20 61   varint may be a
17ea0 73 73 75 6d 65 64 20 74 6f 20 68 61 76 65 20 61  ssumed to have a
17eb0 20 63 6c 65 61 72 0a 20 20 20 20 2a 2a 20 30 78   clear.    ** 0x
17ec0 38 30 20 62 69 74 2e 20 20 2a 2f 0a 20 20 20 20  80 bit.  */.    
17ed0 77 68 69 6c 65 28 20 2a 70 21 3d 30 78 30 31 20  while( *p!=0x01 
17ee0 29 7b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20  ){.      while( 
17ef0 2a 70 2b 2b 20 26 20 30 78 38 30 20 29 3b 0a 20  *p++ & 0x80 );. 
17f00 20 20 20 20 20 69 66 28 20 70 3e 3d 70 45 6e 64       if( p>=pEnd
17f10 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20   ) return 0;.   
17f20 20 7d 0a 20 20 20 20 2a 70 61 20 3d 20 70 2b 2b   }.    *pa = p++
17f30 3b 0a 20 20 20 20 69 43 75 72 72 65 6e 74 20 3d  ;.    iCurrent =
17f40 20 2a 70 2b 2b 3b 0a 20 20 20 20 69 66 28 20 69   *p++;.    if( i
17f50 43 75 72 72 65 6e 74 20 26 20 30 78 38 30 20 29  Current & 0x80 )
17f60 7b 0a 20 20 20 20 20 20 70 2d 2d 3b 0a 20 20 20  {.      p--;.   
17f70 20 20 20 70 20 2b 3d 20 66 74 73 35 47 65 74 56     p += fts5GetV
17f80 61 72 69 6e 74 33 32 28 70 2c 20 69 43 75 72 72  arint32(p, iCurr
17f90 65 6e 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ent);.    }.  }.
17fa0 20 20 69 66 28 20 69 43 6f 6c 21 3d 69 43 75 72    if( iCol!=iCur
17fb0 72 65 6e 74 20 29 20 72 65 74 75 72 6e 20 30 3b  rent ) return 0;
17fc0 0a 0a 20 20 2f 2a 20 41 64 76 61 6e 63 65 20 70  ..  /* Advance p
17fd0 6f 69 6e 74 65 72 20 70 20 75 6e 74 69 6c 20 69  ointer p until i
17fe0 74 20 70 6f 69 6e 74 73 20 74 6f 20 70 45 6e 64  t points to pEnd
17ff0 20 6f 72 20 61 6e 20 30 78 30 31 20 62 79 74 65   or an 0x01 byte
18000 20 74 68 61 74 20 69 73 0a 20 20 2a 2a 20 6e 6f   that is.  ** no
18010 74 20 70 61 72 74 20 6f 66 20 61 20 76 61 72 69  t part of a vari
18020 6e 74 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20 70  nt */.  while( p
18030 3c 70 45 6e 64 20 26 26 20 2a 70 21 3d 30 78 30  <pEnd && *p!=0x0
18040 31 20 29 7b 0a 20 20 20 20 77 68 69 6c 65 28 20  1 ){.    while( 
18050 2a 70 2b 2b 20 26 20 30 78 38 30 20 29 3b 0a 20  *p++ & 0x80 );. 
18060 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70 20 2d   }..  return p -
18070 20 28 2a 70 61 29 3b 0a 7d 0a 0a 73 74 61 74 69   (*pa);.}..stati
18080 63 20 76 6f 69 64 20 66 74 73 35 49 6e 64 65 78  c void fts5Index
18090 45 78 74 72 61 63 74 43 6f 6c 73 65 74 28 0a 20  ExtractColset(. 
180a0 20 69 6e 74 20 2a 70 52 63 2c 0a 20 20 46 74 73   int *pRc,.  Fts
180b0 35 43 6f 6c 73 65 74 20 2a 70 43 6f 6c 73 65 74  5Colset *pColset
180c0 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
180d0 43 6f 6c 73 65 74 20 74 6f 20 66 69 6c 74 65 72  Colset to filter
180e0 20 6f 6e 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 75   on */.  const u
180f0 38 20 2a 70 50 6f 73 2c 20 69 6e 74 20 6e 50 6f  8 *pPos, int nPo
18100 73 2c 20 20 20 20 20 20 20 2f 2a 20 50 6f 73 69  s,       /* Posi
18110 74 69 6f 6e 20 6c 69 73 74 20 2a 2f 0a 20 20 46  tion list */.  F
18120 74 73 35 42 75 66 66 65 72 20 2a 70 42 75 66 20  ts5Buffer *pBuf 
18130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
18140 2a 20 4f 75 74 70 75 74 20 62 75 66 66 65 72 20  * Output buffer 
18150 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 2a 70 52 63  */.){.  if( *pRc
18160 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
18170 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 74     int i;.    ft
18180 73 35 42 75 66 66 65 72 5a 65 72 6f 28 70 42 75  s5BufferZero(pBu
18190 66 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b  f);.    for(i=0;
181a0 20 69 3c 70 43 6f 6c 73 65 74 2d 3e 6e 43 6f 6c   i<pColset->nCol
181b0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 63 6f  ; i++){.      co
181c0 6e 73 74 20 75 38 20 2a 70 53 75 62 20 3d 20 70  nst u8 *pSub = p
181d0 50 6f 73 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e  Pos;.      int n
181e0 53 75 62 20 3d 20 66 74 73 35 49 6e 64 65 78 45  Sub = fts5IndexE
181f0 78 74 72 61 63 74 43 6f 6c 28 26 70 53 75 62 2c  xtractCol(&pSub,
18200 20 6e 50 6f 73 2c 20 70 43 6f 6c 73 65 74 2d 3e   nPos, pColset->
18210 61 69 43 6f 6c 5b 69 5d 29 3b 0a 20 20 20 20 20  aiCol[i]);.     
18220 20 69 66 28 20 6e 53 75 62 20 29 7b 0a 20 20 20   if( nSub ){.   
18230 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72 41       fts5BufferA
18240 70 70 65 6e 64 42 6c 6f 62 28 70 52 63 2c 20 70  ppendBlob(pRc, p
18250 42 75 66 2c 20 6e 53 75 62 2c 20 70 53 75 62 29  Buf, nSub, pSub)
18260 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
18270 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 78 53 65    }.}../*.** xSe
18280 74 4f 75 74 70 75 74 73 20 63 61 6c 6c 62 61 63  tOutputs callbac
18290 6b 20 75 73 65 64 20 62 79 20 64 65 74 61 69 6c  k used by detail
182a0 3d 6e 6f 6e 65 20 74 61 62 6c 65 73 2e 0a 2a 2f  =none tables..*/
182b0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
182c0 35 49 74 65 72 53 65 74 4f 75 74 70 75 74 73 5f  5IterSetOutputs_
182d0 4e 6f 6e 65 28 46 74 73 35 49 74 65 72 20 2a 70  None(Fts5Iter *p
182e0 49 74 65 72 2c 20 46 74 73 35 53 65 67 49 74 65  Iter, Fts5SegIte
182f0 72 20 2a 70 53 65 67 29 7b 0a 20 20 61 73 73 65  r *pSeg){.  asse
18300 72 74 28 20 70 49 74 65 72 2d 3e 70 49 6e 64 65  rt( pIter->pInde
18310 78 2d 3e 70 43 6f 6e 66 69 67 2d 3e 65 44 65 74  x->pConfig->eDet
18320 61 69 6c 3d 3d 46 54 53 35 5f 44 45 54 41 49 4c  ail==FTS5_DETAIL
18330 5f 4e 4f 4e 45 20 29 3b 0a 20 20 70 49 74 65 72  _NONE );.  pIter
18340 2d 3e 62 61 73 65 2e 69 52 6f 77 69 64 20 3d 20  ->base.iRowid = 
18350 70 53 65 67 2d 3e 69 52 6f 77 69 64 3b 0a 20 20  pSeg->iRowid;.  
18360 70 49 74 65 72 2d 3e 62 61 73 65 2e 6e 44 61 74  pIter->base.nDat
18370 61 20 3d 20 70 53 65 67 2d 3e 6e 50 6f 73 3b 0a  a = pSeg->nPos;.
18380 7d 0a 0a 2f 2a 0a 2a 2a 20 78 53 65 74 4f 75 74  }../*.** xSetOut
18390 70 75 74 73 20 63 61 6c 6c 62 61 63 6b 20 75 73  puts callback us
183a0 65 64 20 62 79 20 64 65 74 61 69 6c 3d 66 75 6c  ed by detail=ful
183b0 6c 20 61 6e 64 20 64 65 74 61 69 6c 3d 63 6f 6c  l and detail=col
183c0 20 74 61 62 6c 65 73 20 77 68 65 6e 20 6e 6f 0a   tables when no.
183d0 2a 2a 20 63 6f 6c 75 6d 6e 20 66 69 6c 74 65 72  ** column filter
183e0 73 20 61 72 65 20 73 70 65 63 69 66 69 65 64 2e  s are specified.
183f0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
18400 66 74 73 35 49 74 65 72 53 65 74 4f 75 74 70 75  fts5IterSetOutpu
18410 74 73 5f 4e 6f 63 6f 6c 73 65 74 28 46 74 73 35  ts_Nocolset(Fts5
18420 49 74 65 72 20 2a 70 49 74 65 72 2c 20 46 74 73  Iter *pIter, Fts
18430 35 53 65 67 49 74 65 72 20 2a 70 53 65 67 29 7b  5SegIter *pSeg){
18440 0a 20 20 70 49 74 65 72 2d 3e 62 61 73 65 2e 69  .  pIter->base.i
18450 52 6f 77 69 64 20 3d 20 70 53 65 67 2d 3e 69 52  Rowid = pSeg->iR
18460 6f 77 69 64 3b 0a 20 20 70 49 74 65 72 2d 3e 62  owid;.  pIter->b
18470 61 73 65 2e 6e 44 61 74 61 20 3d 20 70 53 65 67  ase.nData = pSeg
18480 2d 3e 6e 50 6f 73 3b 0a 0a 20 20 61 73 73 65 72  ->nPos;..  asser
18490 74 28 20 70 49 74 65 72 2d 3e 70 49 6e 64 65 78  t( pIter->pIndex
184a0 2d 3e 70 43 6f 6e 66 69 67 2d 3e 65 44 65 74 61  ->pConfig->eDeta
184b0 69 6c 21 3d 46 54 53 35 5f 44 45 54 41 49 4c 5f  il!=FTS5_DETAIL_
184c0 4e 4f 4e 45 20 29 3b 0a 20 20 61 73 73 65 72 74  NONE );.  assert
184d0 28 20 70 49 74 65 72 2d 3e 70 43 6f 6c 73 65 74  ( pIter->pColset
184e0 3d 3d 30 20 29 3b 0a 0a 20 20 69 66 28 20 70 53  ==0 );..  if( pS
184f0 65 67 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 2b  eg->iLeafOffset+
18500 70 53 65 67 2d 3e 6e 50 6f 73 3c 3d 70 53 65 67  pSeg->nPos<=pSeg
18510 2d 3e 70 4c 65 61 66 2d 3e 73 7a 4c 65 61 66 20  ->pLeaf->szLeaf 
18520 29 7b 0a 20 20 20 20 2f 2a 20 41 6c 6c 20 64 61  ){.    /* All da
18530 74 61 20 69 73 20 73 74 6f 72 65 64 20 6f 6e 20  ta is stored on 
18540 74 68 65 20 63 75 72 72 65 6e 74 20 70 61 67 65  the current page
18550 2e 20 50 6f 70 75 6c 61 74 65 20 74 68 65 20 6f  . Populate the o
18560 75 74 70 75 74 20 0a 20 20 20 20 2a 2a 20 76 61  utput .    ** va
18570 72 69 61 62 6c 65 73 20 74 6f 20 70 6f 69 6e 74  riables to point
18580 20 69 6e 74 6f 20 74 68 65 20 62 6f 64 79 20 6f   into the body o
18590 66 20 74 68 65 20 70 61 67 65 20 6f 62 6a 65 63  f the page objec
185a0 74 2e 20 2a 2f 0a 20 20 20 20 70 49 74 65 72 2d  t. */.    pIter-
185b0 3e 62 61 73 65 2e 70 44 61 74 61 20 3d 20 26 70  >base.pData = &p
185c0 53 65 67 2d 3e 70 4c 65 61 66 2d 3e 70 5b 70 53  Seg->pLeaf->p[pS
185d0 65 67 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 5d  eg->iLeafOffset]
185e0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  ;.  }else{.    /
185f0 2a 20 54 68 65 20 64 61 74 61 20 69 73 20 64 69  * The data is di
18600 73 74 72 69 62 75 74 65 64 20 6f 76 65 72 20 74  stributed over t
18610 77 6f 20 6f 72 20 6d 6f 72 65 20 70 61 67 65 73  wo or more pages
18620 2e 20 43 6f 70 79 20 69 74 20 69 6e 74 6f 20 74  . Copy it into t
18630 68 65 0a 20 20 20 20 2a 2a 20 46 74 73 35 49 74  he.    ** Fts5It
18640 65 72 2e 70 6f 73 6c 69 73 74 20 62 75 66 66 65  er.poslist buffe
18650 72 20 61 6e 64 20 74 68 65 6e 20 73 65 74 20 74  r and then set t
18660 68 65 20 6f 75 74 70 75 74 20 70 6f 69 6e 74 65  he output pointe
18670 72 20 74 6f 20 70 6f 69 6e 74 0a 20 20 20 20 2a  r to point.    *
18680 2a 20 74 6f 20 74 68 69 73 20 62 75 66 66 65 72  * to this buffer
18690 2e 20 20 2a 2f 0a 20 20 20 20 66 74 73 35 42 75  .  */.    fts5Bu
186a0 66 66 65 72 5a 65 72 6f 28 26 70 49 74 65 72 2d  fferZero(&pIter-
186b0 3e 70 6f 73 6c 69 73 74 29 3b 0a 20 20 20 20 66  >poslist);.    f
186c0 74 73 35 53 65 67 69 74 65 72 50 6f 73 6c 69 73  ts5SegiterPoslis
186d0 74 28 70 49 74 65 72 2d 3e 70 49 6e 64 65 78 2c  t(pIter->pIndex,
186e0 20 70 53 65 67 2c 20 30 2c 20 26 70 49 74 65 72   pSeg, 0, &pIter
186f0 2d 3e 70 6f 73 6c 69 73 74 29 3b 0a 20 20 20 20  ->poslist);.    
18700 70 49 74 65 72 2d 3e 62 61 73 65 2e 70 44 61 74  pIter->base.pDat
18710 61 20 3d 20 70 49 74 65 72 2d 3e 70 6f 73 6c 69  a = pIter->posli
18720 73 74 2e 70 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  st.p;.  }.}../*.
18730 2a 2a 20 78 53 65 74 4f 75 74 70 75 74 73 20 63  ** xSetOutputs c
18740 61 6c 6c 62 61 63 6b 20 75 73 65 64 20 77 68 65  allback used whe
18750 6e 20 74 68 65 20 46 74 73 35 43 6f 6c 73 65 74  n the Fts5Colset
18760 20 6f 62 6a 65 63 74 20 68 61 73 20 6e 43 6f 6c   object has nCol
18770 3d 3d 30 20 28 6d 61 74 63 68 0a 2a 2a 20 61 67  ==0 (match.** ag
18780 61 69 6e 73 74 20 6e 6f 20 63 6f 6c 75 6d 6e 73  ainst no columns
18790 20 61 74 20 61 6c 6c 29 2e 0a 2a 2f 0a 73 74 61   at all)..*/.sta
187a0 74 69 63 20 76 6f 69 64 20 66 74 73 35 49 74 65  tic void fts5Ite
187b0 72 53 65 74 4f 75 74 70 75 74 73 5f 5a 65 72 6f  rSetOutputs_Zero
187c0 43 6f 6c 73 65 74 28 46 74 73 35 49 74 65 72 20  Colset(Fts5Iter 
187d0 2a 70 49 74 65 72 2c 20 46 74 73 35 53 65 67 49  *pIter, Fts5SegI
187e0 74 65 72 20 2a 70 53 65 67 29 7b 0a 20 20 55 4e  ter *pSeg){.  UN
187f0 55 53 45 44 5f 50 41 52 41 4d 28 70 53 65 67 29  USED_PARAM(pSeg)
18800 3b 0a 20 20 70 49 74 65 72 2d 3e 62 61 73 65 2e  ;.  pIter->base.
18810 6e 44 61 74 61 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a  nData = 0;.}../*
18820 0a 2a 2a 20 78 53 65 74 4f 75 74 70 75 74 73 20  .** xSetOutputs 
18830 63 61 6c 6c 62 61 63 6b 20 75 73 65 64 20 62 79  callback used by
18840 20 64 65 74 61 69 6c 3d 63 6f 6c 20 77 68 65 6e   detail=col when
18850 20 74 68 65 72 65 20 69 73 20 61 20 63 6f 6c 75   there is a colu
18860 6d 6e 20 66 69 6c 74 65 72 0a 2a 2a 20 61 6e 64  mn filter.** and
18870 20 74 68 65 72 65 20 61 72 65 20 31 30 30 20 6f   there are 100 o
18880 72 20 6d 6f 72 65 20 63 6f 6c 75 6d 6e 73 2e 20  r more columns. 
18890 41 6c 73 6f 20 63 61 6c 6c 65 64 20 61 73 20 61  Also called as a
188a0 20 66 61 6c 6c 62 61 63 6b 20 66 72 6f 6d 0a 2a   fallback from.*
188b0 2a 20 66 74 73 35 49 74 65 72 53 65 74 4f 75 74  * fts5IterSetOut
188c0 70 75 74 73 5f 43 6f 6c 31 30 30 20 69 66 20 74  puts_Col100 if t
188d0 68 65 20 63 6f 6c 75 6d 6e 2d 6c 69 73 74 20 73  he column-list s
188e0 70 61 6e 73 20 6d 6f 72 65 20 74 68 61 6e 20 6f  pans more than o
188f0 6e 65 20 70 61 67 65 2e 0a 2a 2f 0a 73 74 61 74  ne page..*/.stat
18900 69 63 20 76 6f 69 64 20 66 74 73 35 49 74 65 72  ic void fts5Iter
18910 53 65 74 4f 75 74 70 75 74 73 5f 43 6f 6c 28 46  SetOutputs_Col(F
18920 74 73 35 49 74 65 72 20 2a 70 49 74 65 72 2c 20  ts5Iter *pIter, 
18930 46 74 73 35 53 65 67 49 74 65 72 20 2a 70 53 65  Fts5SegIter *pSe
18940 67 29 7b 0a 20 20 66 74 73 35 42 75 66 66 65 72  g){.  fts5Buffer
18950 5a 65 72 6f 28 26 70 49 74 65 72 2d 3e 70 6f 73  Zero(&pIter->pos
18960 6c 69 73 74 29 3b 0a 20 20 66 74 73 35 53 65 67  list);.  fts5Seg
18970 69 74 65 72 50 6f 73 6c 69 73 74 28 70 49 74 65  iterPoslist(pIte
18980 72 2d 3e 70 49 6e 64 65 78 2c 20 70 53 65 67 2c  r->pIndex, pSeg,
18990 20 70 49 74 65 72 2d 3e 70 43 6f 6c 73 65 74 2c   pIter->pColset,
189a0 20 26 70 49 74 65 72 2d 3e 70 6f 73 6c 69 73 74   &pIter->poslist
189b0 29 3b 0a 20 20 70 49 74 65 72 2d 3e 62 61 73 65  );.  pIter->base
189c0 2e 69 52 6f 77 69 64 20 3d 20 70 53 65 67 2d 3e  .iRowid = pSeg->
189d0 69 52 6f 77 69 64 3b 0a 20 20 70 49 74 65 72 2d  iRowid;.  pIter-
189e0 3e 62 61 73 65 2e 70 44 61 74 61 20 3d 20 70 49  >base.pData = pI
189f0 74 65 72 2d 3e 70 6f 73 6c 69 73 74 2e 70 3b 0a  ter->poslist.p;.
18a00 20 20 70 49 74 65 72 2d 3e 62 61 73 65 2e 6e 44    pIter->base.nD
18a10 61 74 61 20 3d 20 70 49 74 65 72 2d 3e 70 6f 73  ata = pIter->pos
18a20 6c 69 73 74 2e 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  list.n;.}../*.**
18a30 20 78 53 65 74 4f 75 74 70 75 74 73 20 63 61 6c   xSetOutputs cal
18a40 6c 62 61 63 6b 20 75 73 65 64 20 77 68 65 6e 3a  lback used when:
18a50 20 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 64 65 74 61   .**.**   * deta
18a60 69 6c 3d 63 6f 6c 2c 0a 2a 2a 20 20 20 2a 20 74  il=col,.**   * t
18a70 68 65 72 65 20 69 73 20 61 20 63 6f 6c 75 6d 6e  here is a column
18a80 20 66 69 6c 74 65 72 2c 20 61 6e 64 0a 2a 2a 20   filter, and.** 
18a90 20 20 2a 20 74 68 65 20 74 61 62 6c 65 20 63 6f    * the table co
18aa0 6e 74 61 69 6e 73 20 31 30 30 20 6f 72 20 66 65  ntains 100 or fe
18ab0 77 65 72 20 63 6f 6c 75 6d 6e 73 2e 20 0a 2a 2a  wer columns. .**
18ac0 0a 2a 2a 20 54 68 65 20 6c 61 73 74 20 70 6f 69  .** The last poi
18ad0 6e 74 20 69 73 20 74 6f 20 65 6e 73 75 72 65 20  nt is to ensure 
18ae0 61 6c 6c 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65  all column numbe
18af0 72 73 20 61 72 65 20 73 74 6f 72 65 64 20 61 73  rs are stored as
18b00 20 0a 2a 2a 20 73 69 6e 67 6c 65 2d 62 79 74 65   .** single-byte
18b10 20 76 61 72 69 6e 74 73 2e 0a 2a 2f 0a 73 74 61   varints..*/.sta
18b20 74 69 63 20 76 6f 69 64 20 66 74 73 35 49 74 65  tic void fts5Ite
18b30 72 53 65 74 4f 75 74 70 75 74 73 5f 43 6f 6c 31  rSetOutputs_Col1
18b40 30 30 28 46 74 73 35 49 74 65 72 20 2a 70 49 74  00(Fts5Iter *pIt
18b50 65 72 2c 20 46 74 73 35 53 65 67 49 74 65 72 20  er, Fts5SegIter 
18b60 2a 70 53 65 67 29 7b 0a 0a 20 20 61 73 73 65 72  *pSeg){..  asser
18b70 74 28 20 70 49 74 65 72 2d 3e 70 49 6e 64 65 78  t( pIter->pIndex
18b80 2d 3e 70 43 6f 6e 66 69 67 2d 3e 65 44 65 74 61  ->pConfig->eDeta
18b90 69 6c 3d 3d 46 54 53 35 5f 44 45 54 41 49 4c 5f  il==FTS5_DETAIL_
18ba0 43 4f 4c 55 4d 4e 53 20 29 3b 0a 20 20 61 73 73  COLUMNS );.  ass
18bb0 65 72 74 28 20 70 49 74 65 72 2d 3e 70 43 6f 6c  ert( pIter->pCol
18bc0 73 65 74 20 29 3b 0a 0a 20 20 69 66 28 20 70 53  set );..  if( pS
18bd0 65 67 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 2b  eg->iLeafOffset+
18be0 70 53 65 67 2d 3e 6e 50 6f 73 3e 70 53 65 67 2d  pSeg->nPos>pSeg-
18bf0 3e 70 4c 65 61 66 2d 3e 73 7a 4c 65 61 66 20 29  >pLeaf->szLeaf )
18c00 7b 0a 20 20 20 20 66 74 73 35 49 74 65 72 53 65  {.    fts5IterSe
18c10 74 4f 75 74 70 75 74 73 5f 43 6f 6c 28 70 49 74  tOutputs_Col(pIt
18c20 65 72 2c 20 70 53 65 67 29 3b 0a 20 20 7d 65 6c  er, pSeg);.  }el
18c30 73 65 7b 0a 20 20 20 20 75 38 20 2a 61 20 3d 20  se{.    u8 *a = 
18c40 28 75 38 2a 29 26 70 53 65 67 2d 3e 70 4c 65 61  (u8*)&pSeg->pLea
18c50 66 2d 3e 70 5b 70 53 65 67 2d 3e 69 4c 65 61 66  f->p[pSeg->iLeaf
18c60 4f 66 66 73 65 74 5d 3b 0a 20 20 20 20 75 38 20  Offset];.    u8 
18c70 2a 70 45 6e 64 20 3d 20 28 75 38 2a 29 26 61 5b  *pEnd = (u8*)&a[
18c80 70 53 65 67 2d 3e 6e 50 6f 73 5d 3b 20 0a 20 20  pSeg->nPos]; .  
18c90 20 20 69 6e 74 20 69 50 72 65 76 20 3d 20 30 3b    int iPrev = 0;
18ca0 0a 20 20 20 20 69 6e 74 20 2a 61 69 43 6f 6c 20  .    int *aiCol 
18cb0 3d 20 70 49 74 65 72 2d 3e 70 43 6f 6c 73 65 74  = pIter->pColset
18cc0 2d 3e 61 69 43 6f 6c 3b 0a 20 20 20 20 69 6e 74  ->aiCol;.    int
18cd0 20 2a 61 69 43 6f 6c 45 6e 64 20 3d 20 26 61 69   *aiColEnd = &ai
18ce0 43 6f 6c 5b 70 49 74 65 72 2d 3e 70 43 6f 6c 73  Col[pIter->pCols
18cf0 65 74 2d 3e 6e 43 6f 6c 5d 3b 0a 0a 20 20 20 20  et->nCol];..    
18d00 75 38 20 2a 61 4f 75 74 20 3d 20 70 49 74 65 72  u8 *aOut = pIter
18d10 2d 3e 70 6f 73 6c 69 73 74 2e 70 3b 0a 20 20 20  ->poslist.p;.   
18d20 20 69 6e 74 20 69 50 72 65 76 4f 75 74 20 3d 20   int iPrevOut = 
18d30 30 3b 0a 0a 20 20 20 20 70 49 74 65 72 2d 3e 62  0;..    pIter->b
18d40 61 73 65 2e 69 52 6f 77 69 64 20 3d 20 70 53 65  ase.iRowid = pSe
18d50 67 2d 3e 69 52 6f 77 69 64 3b 0a 0a 20 20 20 20  g->iRowid;..    
18d60 77 68 69 6c 65 28 20 61 3c 70 45 6e 64 20 29 7b  while( a<pEnd ){
18d70 0a 20 20 20 20 20 20 69 50 72 65 76 20 2b 3d 20  .      iPrev += 
18d80 28 69 6e 74 29 61 2b 2b 5b 30 5d 20 2d 20 32 3b  (int)a++[0] - 2;
18d90 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 2a 61  .      while( *a
18da0 69 43 6f 6c 3c 69 50 72 65 76 20 29 7b 0a 20 20  iCol<iPrev ){.  
18db0 20 20 20 20 20 20 61 69 43 6f 6c 2b 2b 3b 0a 20        aiCol++;. 
18dc0 20 20 20 20 20 20 20 69 66 28 20 61 69 43 6f 6c         if( aiCol
18dd0 3d 3d 61 69 43 6f 6c 45 6e 64 20 29 20 67 6f 74  ==aiColEnd ) got
18de0 6f 20 73 65 74 6f 75 74 70 75 74 73 5f 63 6f 6c  o setoutputs_col
18df0 5f 6f 75 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20  _out;.      }.  
18e00 20 20 20 20 69 66 28 20 2a 61 69 43 6f 6c 3d 3d      if( *aiCol==
18e10 69 50 72 65 76 20 29 7b 0a 20 20 20 20 20 20 20  iPrev ){.       
18e20 20 2a 61 4f 75 74 2b 2b 20 3d 20 28 75 38 29 28   *aOut++ = (u8)(
18e30 28 69 50 72 65 76 20 2d 20 69 50 72 65 76 4f 75  (iPrev - iPrevOu
18e40 74 29 20 2b 20 32 29 3b 0a 20 20 20 20 20 20 20  t) + 2);.       
18e50 20 69 50 72 65 76 4f 75 74 20 3d 20 69 50 72 65   iPrevOut = iPre
18e60 76 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  v;.      }.    }
18e70 0a 0a 73 65 74 6f 75 74 70 75 74 73 5f 63 6f 6c  ..setoutputs_col
18e80 5f 6f 75 74 3a 0a 20 20 20 20 70 49 74 65 72 2d  _out:.    pIter-
18e90 3e 62 61 73 65 2e 70 44 61 74 61 20 3d 20 70 49  >base.pData = pI
18ea0 74 65 72 2d 3e 70 6f 73 6c 69 73 74 2e 70 3b 0a  ter->poslist.p;.
18eb0 20 20 20 20 70 49 74 65 72 2d 3e 62 61 73 65 2e      pIter->base.
18ec0 6e 44 61 74 61 20 3d 20 61 4f 75 74 20 2d 20 70  nData = aOut - p
18ed0 49 74 65 72 2d 3e 70 6f 73 6c 69 73 74 2e 70 3b  Iter->poslist.p;
18ee0 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 78 53  .  }.}../*.** xS
18ef0 65 74 4f 75 74 70 75 74 73 20 63 61 6c 6c 62 61  etOutputs callba
18f00 63 6b 20 75 73 65 64 20 62 79 20 64 65 74 61 69  ck used by detai
18f10 6c 3d 66 75 6c 6c 20 77 68 65 6e 20 74 68 65 72  l=full when ther
18f20 65 20 69 73 20 61 20 63 6f 6c 75 6d 6e 20 66 69  e is a column fi
18f30 6c 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  lter..*/.static 
18f40 76 6f 69 64 20 66 74 73 35 49 74 65 72 53 65 74  void fts5IterSet
18f50 4f 75 74 70 75 74 73 5f 46 75 6c 6c 28 46 74 73  Outputs_Full(Fts
18f60 35 49 74 65 72 20 2a 70 49 74 65 72 2c 20 46 74  5Iter *pIter, Ft
18f70 73 35 53 65 67 49 74 65 72 20 2a 70 53 65 67 29  s5SegIter *pSeg)
18f80 7b 0a 20 20 46 74 73 35 43 6f 6c 73 65 74 20 2a  {.  Fts5Colset *
18f90 70 43 6f 6c 73 65 74 20 3d 20 70 49 74 65 72 2d  pColset = pIter-
18fa0 3e 70 43 6f 6c 73 65 74 3b 0a 20 20 70 49 74 65  >pColset;.  pIte
18fb0 72 2d 3e 62 61 73 65 2e 69 52 6f 77 69 64 20 3d  r->base.iRowid =
18fc0 20 70 53 65 67 2d 3e 69 52 6f 77 69 64 3b 0a 0a   pSeg->iRowid;..
18fd0 20 20 61 73 73 65 72 74 28 20 70 49 74 65 72 2d    assert( pIter-
18fe0 3e 70 49 6e 64 65 78 2d 3e 70 43 6f 6e 66 69 67  >pIndex->pConfig
18ff0 2d 3e 65 44 65 74 61 69 6c 3d 3d 46 54 53 35 5f  ->eDetail==FTS5_
19000 44 45 54 41 49 4c 5f 46 55 4c 4c 20 29 3b 0a 20  DETAIL_FULL );. 
19010 20 61 73 73 65 72 74 28 20 70 43 6f 6c 73 65 74   assert( pColset
19020 20 29 3b 0a 0a 20 20 69 66 28 20 70 53 65 67 2d   );..  if( pSeg-
19030 3e 69 4c 65 61 66 4f 66 66 73 65 74 2b 70 53 65  >iLeafOffset+pSe
19040 67 2d 3e 6e 50 6f 73 3c 3d 70 53 65 67 2d 3e 70  g->nPos<=pSeg->p
19050 4c 65 61 66 2d 3e 73 7a 4c 65 61 66 20 29 7b 0a  Leaf->szLeaf ){.
19060 20 20 20 20 2f 2a 20 41 6c 6c 20 64 61 74 61 20      /* All data 
19070 69 73 20 73 74 6f 72 65 64 20 6f 6e 20 74 68 65  is stored on the
19080 20 63 75 72 72 65 6e 74 20 70 61 67 65 2e 20 50   current page. P
19090 6f 70 75 6c 61 74 65 20 74 68 65 20 6f 75 74 70  opulate the outp
190a0 75 74 20 0a 20 20 20 20 2a 2a 20 76 61 72 69 61  ut .    ** varia
190b0 62 6c 65 73 20 74 6f 20 70 6f 69 6e 74 20 69 6e  bles to point in
190c0 74 6f 20 74 68 65 20 62 6f 64 79 20 6f 66 20 74  to the body of t
190d0 68 65 20 70 61 67 65 20 6f 62 6a 65 63 74 2e 20  he page object. 
190e0 2a 2f 0a 20 20 20 20 63 6f 6e 73 74 20 75 38 20  */.    const u8 
190f0 2a 61 20 3d 20 26 70 53 65 67 2d 3e 70 4c 65 61  *a = &pSeg->pLea
19100 66 2d 3e 70 5b 70 53 65 67 2d 3e 69 4c 65 61 66  f->p[pSeg->iLeaf
19110 4f 66 66 73 65 74 5d 3b 0a 20 20 20 20 69 66 28  Offset];.    if(
19120 20 70 43 6f 6c 73 65 74 2d 3e 6e 43 6f 6c 3d 3d   pColset->nCol==
19130 31 20 29 7b 0a 20 20 20 20 20 20 70 49 74 65 72  1 ){.      pIter
19140 2d 3e 62 61 73 65 2e 6e 44 61 74 61 20 3d 20 66  ->base.nData = f
19150 74 73 35 49 6e 64 65 78 45 78 74 72 61 63 74 43  ts5IndexExtractC
19160 6f 6c 28 26 61 2c 20 70 53 65 67 2d 3e 6e 50 6f  ol(&a, pSeg->nPo
19170 73 2c 70 43 6f 6c 73 65 74 2d 3e 61 69 43 6f 6c  s,pColset->aiCol
19180 5b 30 5d 29 3b 0a 20 20 20 20 20 20 70 49 74 65  [0]);.      pIte
19190 72 2d 3e 62 61 73 65 2e 70 44 61 74 61 20 3d 20  r->base.pData = 
191a0 61 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  a;.    }else{.  
191b0 20 20 20 20 69 6e 74 20 2a 70 52 63 20 3d 20 26      int *pRc = &
191c0 70 49 74 65 72 2d 3e 70 49 6e 64 65 78 2d 3e 72  pIter->pIndex->r
191d0 63 3b 0a 20 20 20 20 20 20 66 74 73 35 42 75 66  c;.      fts5Buf
191e0 66 65 72 5a 65 72 6f 28 26 70 49 74 65 72 2d 3e  ferZero(&pIter->
191f0 70 6f 73 6c 69 73 74 29 3b 0a 20 20 20 20 20 20  poslist);.      
19200 66 74 73 35 49 6e 64 65 78 45 78 74 72 61 63 74  fts5IndexExtract
19210 43 6f 6c 73 65 74 28 70 52 63 2c 20 70 43 6f 6c  Colset(pRc, pCol
19220 73 65 74 2c 20 61 2c 20 70 53 65 67 2d 3e 6e 50  set, a, pSeg->nP
19230 6f 73 2c 20 26 70 49 74 65 72 2d 3e 70 6f 73 6c  os, &pIter->posl
19240 69 73 74 29 3b 0a 20 20 20 20 20 20 70 49 74 65  ist);.      pIte
19250 72 2d 3e 62 61 73 65 2e 70 44 61 74 61 20 3d 20  r->base.pData = 
19260 70 49 74 65 72 2d 3e 70 6f 73 6c 69 73 74 2e 70  pIter->poslist.p
19270 3b 0a 20 20 20 20 20 20 70 49 74 65 72 2d 3e 62  ;.      pIter->b
19280 61 73 65 2e 6e 44 61 74 61 20 3d 20 70 49 74 65  ase.nData = pIte
19290 72 2d 3e 70 6f 73 6c 69 73 74 2e 6e 3b 0a 20 20  r->poslist.n;.  
192a0 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20    }.  }else{.   
192b0 20 2f 2a 20 54 68 65 20 64 61 74 61 20 69 73 20   /* The data is 
192c0 64 69 73 74 72 69 62 75 74 65 64 20 6f 76 65 72  distributed over
192d0 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 70 61 67   two or more pag
192e0 65 73 2e 20 43 6f 70 79 20 69 74 20 69 6e 74 6f  es. Copy it into
192f0 20 74 68 65 0a 20 20 20 20 2a 2a 20 46 74 73 35   the.    ** Fts5
19300 49 74 65 72 2e 70 6f 73 6c 69 73 74 20 62 75 66  Iter.poslist buf
19310 66 65 72 20 61 6e 64 20 74 68 65 6e 20 73 65 74  fer and then set
19320 20 74 68 65 20 6f 75 74 70 75 74 20 70 6f 69 6e   the output poin
19330 74 65 72 20 74 6f 20 70 6f 69 6e 74 0a 20 20 20  ter to point.   
19340 20 2a 2a 20 74 6f 20 74 68 69 73 20 62 75 66 66   ** to this buff
19350 65 72 2e 20 20 2a 2f 0a 20 20 20 20 66 74 73 35  er.  */.    fts5
19360 42 75 66 66 65 72 5a 65 72 6f 28 26 70 49 74 65  BufferZero(&pIte
19370 72 2d 3e 70 6f 73 6c 69 73 74 29 3b 0a 20 20 20  r->poslist);.   
19380 20 66 74 73 35 53 65 67 69 74 65 72 50 6f 73 6c   fts5SegiterPosl
19390 69 73 74 28 70 49 74 65 72 2d 3e 70 49 6e 64 65  ist(pIter->pInde
193a0 78 2c 20 70 53 65 67 2c 20 70 43 6f 6c 73 65 74  x, pSeg, pColset
193b0 2c 20 26 70 49 74 65 72 2d 3e 70 6f 73 6c 69 73  , &pIter->poslis
193c0 74 29 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 62  t);.    pIter->b
193d0 61 73 65 2e 70 44 61 74 61 20 3d 20 70 49 74 65  ase.pData = pIte
193e0 72 2d 3e 70 6f 73 6c 69 73 74 2e 70 3b 0a 20 20  r->poslist.p;.  
193f0 20 20 70 49 74 65 72 2d 3e 62 61 73 65 2e 6e 44    pIter->base.nD
19400 61 74 61 20 3d 20 70 49 74 65 72 2d 3e 70 6f 73  ata = pIter->pos
19410 6c 69 73 74 2e 6e 3b 0a 20 20 7d 0a 7d 0a 0a 73  list.n;.  }.}..s
19420 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 49  tatic void fts5I
19430 74 65 72 53 65 74 4f 75 74 70 75 74 43 62 28 69  terSetOutputCb(i
19440 6e 74 20 2a 70 52 63 2c 20 46 74 73 35 49 74 65  nt *pRc, Fts5Ite
19450 72 20 2a 70 49 74 65 72 29 7b 0a 20 20 69 66 28  r *pIter){.  if(
19460 20 2a 70 52 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b   *pRc==SQLITE_OK
19470 20 29 7b 0a 20 20 20 20 46 74 73 35 43 6f 6e 66   ){.    Fts5Conf
19480 69 67 20 2a 70 43 6f 6e 66 69 67 20 3d 20 70 49  ig *pConfig = pI
19490 74 65 72 2d 3e 70 49 6e 64 65 78 2d 3e 70 43 6f  ter->pIndex->pCo
194a0 6e 66 69 67 3b 0a 20 20 20 20 69 66 28 20 70 43  nfig;.    if( pC
194b0 6f 6e 66 69 67 2d 3e 65 44 65 74 61 69 6c 3d 3d  onfig->eDetail==
194c0 46 54 53 35 5f 44 45 54 41 49 4c 5f 4e 4f 4e 45  FTS5_DETAIL_NONE
194d0 20 29 7b 0a 20 20 20 20 20 20 70 49 74 65 72 2d   ){.      pIter-
194e0 3e 78 53 65 74 4f 75 74 70 75 74 73 20 3d 20 66  >xSetOutputs = f
194f0 74 73 35 49 74 65 72 53 65 74 4f 75 74 70 75 74  ts5IterSetOutput
19500 73 5f 4e 6f 6e 65 3b 0a 20 20 20 20 7d 0a 0a 20  s_None;.    }.. 
19510 20 20 20 65 6c 73 65 20 69 66 28 20 70 49 74 65     else if( pIte
19520 72 2d 3e 70 43 6f 6c 73 65 74 3d 3d 30 20 29 7b  r->pColset==0 ){
19530 0a 20 20 20 20 20 20 70 49 74 65 72 2d 3e 78 53  .      pIter->xS
19540 65 74 4f 75 74 70 75 74 73 20 3d 20 66 74 73 35  etOutputs = fts5
19550 49 74 65 72 53 65 74 4f 75 74 70 75 74 73 5f 4e  IterSetOutputs_N
19560 6f 63 6f 6c 73 65 74 3b 0a 20 20 20 20 7d 0a 0a  ocolset;.    }..
19570 20 20 20 20 65 6c 73 65 20 69 66 28 20 70 49 74      else if( pIt
19580 65 72 2d 3e 70 43 6f 6c 73 65 74 2d 3e 6e 43 6f  er->pColset->nCo
19590 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 49  l==0 ){.      pI
195a0 74 65 72 2d 3e 78 53 65 74 4f 75 74 70 75 74 73  ter->xSetOutputs
195b0 20 3d 20 66 74 73 35 49 74 65 72 53 65 74 4f 75   = fts5IterSetOu
195c0 74 70 75 74 73 5f 5a 65 72 6f 43 6f 6c 73 65 74  tputs_ZeroColset
195d0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 65 6c 73  ;.    }..    els
195e0 65 20 69 66 28 20 70 43 6f 6e 66 69 67 2d 3e 65  e if( pConfig->e
195f0 44 65 74 61 69 6c 3d 3d 46 54 53 35 5f 44 45 54  Detail==FTS5_DET
19600 41 49 4c 5f 46 55 4c 4c 20 29 7b 0a 20 20 20 20  AIL_FULL ){.    
19610 20 20 70 49 74 65 72 2d 3e 78 53 65 74 4f 75 74    pIter->xSetOut
19620 70 75 74 73 20 3d 20 66 74 73 35 49 74 65 72 53  puts = fts5IterS
19630 65 74 4f 75 74 70 75 74 73 5f 46 75 6c 6c 3b 0a  etOutputs_Full;.
19640 20 20 20 20 7d 0a 0a 20 20 20 20 65 6c 73 65 7b      }..    else{
19650 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
19660 43 6f 6e 66 69 67 2d 3e 65 44 65 74 61 69 6c 3d  Config->eDetail=
19670 3d 46 54 53 35 5f 44 45 54 41 49 4c 5f 43 4f 4c  =FTS5_DETAIL_COL
19680 55 4d 4e 53 20 29 3b 0a 20 20 20 20 20 20 69 66  UMNS );.      if
19690 28 20 70 43 6f 6e 66 69 67 2d 3e 6e 43 6f 6c 3c  ( pConfig->nCol<
196a0 3d 31 30 30 20 29 7b 0a 20 20 20 20 20 20 20 20  =100 ){.        
196b0 70 49 74 65 72 2d 3e 78 53 65 74 4f 75 74 70 75  pIter->xSetOutpu
196c0 74 73 20 3d 20 66 74 73 35 49 74 65 72 53 65 74  ts = fts5IterSet
196d0 4f 75 74 70 75 74 73 5f 43 6f 6c 31 30 30 3b 0a  Outputs_Col100;.
196e0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 46          sqlite3F
196f0 74 73 35 42 75 66 66 65 72 53 69 7a 65 28 70 52  ts5BufferSize(pR
19700 63 2c 20 26 70 49 74 65 72 2d 3e 70 6f 73 6c 69  c, &pIter->posli
19710 73 74 2c 20 70 43 6f 6e 66 69 67 2d 3e 6e 43 6f  st, pConfig->nCo
19720 6c 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  l);.      }else{
19730 0a 20 20 20 20 20 20 20 20 70 49 74 65 72 2d 3e  .        pIter->
19740 78 53 65 74 4f 75 74 70 75 74 73 20 3d 20 66 74  xSetOutputs = ft
19750 73 35 49 74 65 72 53 65 74 4f 75 74 70 75 74 73  s5IterSetOutputs
19760 5f 43 6f 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20  _Col;.      }.  
19770 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a    }.  }.}.../*.*
19780 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77  * Allocate a new
19790 20 46 74 73 35 49 74 65 72 20 6f 62 6a 65 63 74   Fts5Iter object
197a0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 65 77 20  ..**.** The new 
197b0 6f 62 6a 65 63 74 20 77 69 6c 6c 20 62 65 20 75  object will be u
197c0 73 65 64 20 74 6f 20 69 74 65 72 61 74 65 20 74  sed to iterate t
197d0 68 72 6f 75 67 68 20 64 61 74 61 20 69 6e 20 73  hrough data in s
197e0 74 72 75 63 74 75 72 65 20 70 53 74 72 75 63 74  tructure pStruct
197f0 2e 0a 2a 2a 20 49 66 20 69 4c 65 76 65 6c 20 69  ..** If iLevel i
19800 73 20 2d 76 65 2c 20 74 68 65 6e 20 61 6c 6c 20  s -ve, then all 
19810 64 61 74 61 20 69 6e 20 61 6c 6c 20 73 65 67 6d  data in all segm
19820 65 6e 74 73 20 69 73 20 6d 65 72 67 65 64 2e 20  ents is merged. 
19830 4f 72 2c 20 69 66 20 69 4c 65 76 65 6c 0a 2a 2a  Or, if iLevel.**
19840 20 69 73 20 7a 65 72 6f 20 6f 72 20 67 72 65 61   is zero or grea
19850 74 65 72 2c 20 64 61 74 61 20 66 72 6f 6d 20 74  ter, data from t
19860 68 65 20 66 69 72 73 74 20 6e 53 65 67 6d 65 6e  he first nSegmen
19870 74 20 73 65 67 6d 65 6e 74 73 20 6f 6e 20 6c 65  t segments on le
19880 76 65 6c 20 69 4c 65 76 65 6c 0a 2a 2a 20 69 73  vel iLevel.** is
19890 20 6d 65 72 67 65 64 2e 0a 2a 2a 0a 2a 2a 20 54   merged..**.** T
198a0 68 65 20 69 74 65 72 61 74 6f 72 20 69 6e 69 74  he iterator init
198b0 69 61 6c 6c 79 20 70 6f 69 6e 74 73 20 74 6f 20  ially points to 
198c0 74 68 65 20 66 69 72 73 74 20 74 65 72 6d 2f 72  the first term/r
198d0 6f 77 69 64 20 65 6e 74 72 79 20 69 6e 20 74 68  owid entry in th
198e0 65 20 0a 2a 2a 20 69 74 65 72 61 74 65 64 20 64  e .** iterated d
198f0 61 74 61 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ata..*/.static v
19900 6f 69 64 20 66 74 73 35 4d 75 6c 74 69 49 74 65  oid fts5MultiIte
19910 72 4e 65 77 28 0a 20 20 46 74 73 35 49 6e 64 65  rNew(.  Fts5Inde
19920 78 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  x *p,           
19930 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53 35 20          /* FTS5 
19940 62 61 63 6b 65 6e 64 20 74 6f 20 69 74 65 72 61  backend to itera
19950 74 65 20 77 69 74 68 69 6e 20 2a 2f 0a 20 20 46  te within */.  F
19960 74 73 35 53 74 72 75 63 74 75 72 65 20 2a 70 53  ts5Structure *pS
19970 74 72 75 63 74 2c 20 20 20 20 20 20 20 20 20 2f  truct,         /
19980 2a 20 53 74 72 75 63 74 75 72 65 20 6f 66 20 73  * Structure of s
19990 70 65 63 69 66 69 63 20 69 6e 64 65 78 20 2a 2f  pecific index */
199a0 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c 20 20 20  .  int flags,   
199b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
199c0 20 20 20 2f 2a 20 46 54 53 35 49 4e 44 45 58 5f     /* FTS5INDEX_
199d0 51 55 45 52 59 5f 58 58 58 20 66 6c 61 67 73 20  QUERY_XXX flags 
199e0 2a 2f 0a 20 20 46 74 73 35 43 6f 6c 73 65 74 20  */.  Fts5Colset 
199f0 2a 70 43 6f 6c 73 65 74 2c 20 20 20 20 20 20 20  *pColset,       
19a00 20 20 20 20 20 2f 2a 20 43 6f 6c 73 65 74 20 74       /* Colset t
19a10 6f 20 66 69 6c 74 65 72 20 6f 6e 20 28 6f 72 20  o filter on (or 
19a20 4e 55 4c 4c 29 20 2a 2f 0a 20 20 63 6f 6e 73 74  NULL) */.  const
19a30 20 75 38 20 2a 70 54 65 72 6d 2c 20 69 6e 74 20   u8 *pTerm, int 
19a40 6e 54 65 72 6d 2c 20 20 20 20 20 2f 2a 20 54 65  nTerm,     /* Te
19a50 72 6d 20 74 6f 20 73 65 65 6b 20 74 6f 20 28 6f  rm to seek to (o
19a60 72 20 4e 55 4c 4c 2f 30 29 20 2a 2f 0a 20 20 69  r NULL/0) */.  i
19a70 6e 74 20 69 4c 65 76 65 6c 2c 20 20 20 20 20 20  nt iLevel,      
19a80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
19a90 2a 20 4c 65 76 65 6c 20 74 6f 20 69 74 65 72 61  * Level to itera
19aa0 74 65 20 28 2d 31 20 66 6f 72 20 61 6c 6c 29 20  te (-1 for all) 
19ab0 2a 2f 0a 20 20 69 6e 74 20 6e 53 65 67 6d 65 6e  */.  int nSegmen
19ac0 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t,              
19ad0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
19ae0 66 20 73 65 67 6d 65 6e 74 73 20 74 6f 20 6d 65  f segments to me
19af0 72 67 65 20 28 69 4c 65 76 65 6c 3e 3d 30 29 20  rge (iLevel>=0) 
19b00 2a 2f 0a 20 20 46 74 73 35 49 74 65 72 20 2a 2a  */.  Fts5Iter **
19b10 70 70 4f 75 74 20 20 20 20 20 20 20 20 20 20 20  ppOut           
19b20 20 20 20 20 20 2f 2a 20 4e 65 77 20 6f 62 6a 65       /* New obje
19b30 63 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e  ct */.){.  int n
19b40 53 65 67 20 3d 20 30 3b 20 20 20 20 20 20 20 20  Seg = 0;        
19b50 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
19b60 6d 62 65 72 20 6f 66 20 73 65 67 6d 65 6e 74 2d  mber of segment-
19b70 69 74 65 72 73 20 69 6e 20 75 73 65 20 2a 2f 0a  iters in use */.
19b80 20 20 69 6e 74 20 69 49 74 65 72 20 3d 20 30 3b    int iIter = 0;
19b90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19ba0 20 20 2f 2a 20 2a 2f 0a 20 20 69 6e 74 20 69 53    /* */.  int iS
19bb0 65 67 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  eg;             
19bc0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65            /* Use
19bd0 64 20 74 6f 20 69 74 65 72 61 74 65 20 74 68 72  d to iterate thr
19be0 6f 75 67 68 20 73 65 67 6d 65 6e 74 73 20 2a 2f  ough segments */
19bf0 0a 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65  .  Fts5Structure
19c00 4c 65 76 65 6c 20 2a 70 4c 76 6c 3b 0a 20 20 46  Level *pLvl;.  F
19c10 74 73 35 49 74 65 72 20 2a 70 4e 65 77 3b 0a 0a  ts5Iter *pNew;..
19c20 20 20 61 73 73 65 72 74 28 20 28 70 54 65 72 6d    assert( (pTerm
19c30 3d 3d 30 20 26 26 20 6e 54 65 72 6d 3d 3d 30 29  ==0 && nTerm==0)
19c40 20 7c 7c 20 69 4c 65 76 65 6c 3c 30 20 29 3b 0a   || iLevel<0 );.
19c50 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 73  .  /* Allocate s
19c60 70 61 63 65 20 66 6f 72 20 74 68 65 20 6e 65 77  pace for the new
19c70 20 6d 75 6c 74 69 2d 73 65 67 2d 69 74 65 72 61   multi-seg-itera
19c80 74 6f 72 2e 20 2a 2f 0a 20 20 69 66 28 20 70 2d  tor. */.  if( p-
19c90 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  >rc==SQLITE_OK )
19ca0 7b 0a 20 20 20 20 69 66 28 20 69 4c 65 76 65 6c  {.    if( iLevel
19cb0 3c 30 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  <0 ){.      asse
19cc0 72 74 28 20 70 53 74 72 75 63 74 2d 3e 6e 53 65  rt( pStruct->nSe
19cd0 67 6d 65 6e 74 3d 3d 66 74 73 35 53 74 72 75 63  gment==fts5Struc
19ce0 74 75 72 65 43 6f 75 6e 74 53 65 67 6d 65 6e 74  tureCountSegment
19cf0 73 28 70 53 74 72 75 63 74 29 20 29 3b 0a 20 20  s(pStruct) );.  
19d00 20 20 20 20 6e 53 65 67 20 3d 20 70 53 74 72 75      nSeg = pStru
19d10 63 74 2d 3e 6e 53 65 67 6d 65 6e 74 3b 0a 20 20  ct->nSegment;.  
19d20 20 20 20 20 6e 53 65 67 20 2b 3d 20 28 70 2d 3e      nSeg += (p->
19d30 70 48 61 73 68 20 3f 20 31 20 3a 20 30 29 3b 0a  pHash ? 1 : 0);.
19d40 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
19d50 20 6e 53 65 67 20 3d 20 4d 49 4e 28 70 53 74 72   nSeg = MIN(pStr
19d60 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c 65 76  uct->aLevel[iLev
19d70 65 6c 5d 2e 6e 53 65 67 2c 20 6e 53 65 67 6d 65  el].nSeg, nSegme
19d80 6e 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  nt);.    }.  }. 
19d90 20 2a 70 70 4f 75 74 20 3d 20 70 4e 65 77 20 3d   *ppOut = pNew =
19da0 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 41 6c   fts5MultiIterAl
19db0 6c 6f 63 28 70 2c 20 6e 53 65 67 29 3b 0a 20 20  loc(p, nSeg);.  
19dc0 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 20 72 65  if( pNew==0 ) re
19dd0 74 75 72 6e 3b 0a 20 20 70 4e 65 77 2d 3e 62 52  turn;.  pNew->bR
19de0 65 76 20 3d 20 28 30 21 3d 28 66 6c 61 67 73 20  ev = (0!=(flags 
19df0 26 20 46 54 53 35 49 4e 44 45 58 5f 51 55 45 52  & FTS5INDEX_QUER
19e00 59 5f 44 45 53 43 29 29 3b 0a 20 20 70 4e 65 77  Y_DESC));.  pNew
19e10 2d 3e 62 53 6b 69 70 45 6d 70 74 79 20 3d 20 28  ->bSkipEmpty = (
19e20 30 21 3d 28 66 6c 61 67 73 20 26 20 46 54 53 35  0!=(flags & FTS5
19e30 49 4e 44 45 58 5f 51 55 45 52 59 5f 53 4b 49 50  INDEX_QUERY_SKIP
19e40 45 4d 50 54 59 29 29 3b 0a 20 20 70 4e 65 77 2d  EMPTY));.  pNew-
19e50 3e 70 53 74 72 75 63 74 20 3d 20 70 53 74 72 75  >pStruct = pStru
19e60 63 74 3b 0a 20 20 70 4e 65 77 2d 3e 70 43 6f 6c  ct;.  pNew->pCol
19e70 73 65 74 20 3d 20 70 43 6f 6c 73 65 74 3b 0a 20  set = pColset;. 
19e80 20 66 74 73 35 53 74 72 75 63 74 75 72 65 52 65   fts5StructureRe
19e90 66 28 70 53 74 72 75 63 74 29 3b 0a 20 20 69 66  f(pStruct);.  if
19ea0 28 20 28 66 6c 61 67 73 20 26 20 46 54 53 35 49  ( (flags & FTS5I
19eb0 4e 44 45 58 5f 51 55 45 52 59 5f 4e 4f 4f 55 54  NDEX_QUERY_NOOUT
19ec0 50 55 54 29 3d 3d 30 20 29 7b 0a 20 20 20 20 66  PUT)==0 ){.    f
19ed0 74 73 35 49 74 65 72 53 65 74 4f 75 74 70 75 74  ts5IterSetOutput
19ee0 43 62 28 26 70 2d 3e 72 63 2c 20 70 4e 65 77 29  Cb(&p->rc, pNew)
19ef0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 6e 69 74  ;.  }..  /* Init
19f00 69 61 6c 69 7a 65 20 65 61 63 68 20 6f 66 20 74  ialize each of t
19f10 68 65 20 63 6f 6d 70 6f 6e 65 6e 74 20 73 65 67  he component seg
19f20 6d 65 6e 74 20 69 74 65 72 61 74 6f 72 73 2e 20  ment iterators. 
19f30 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d  */.  if( p->rc==
19f40 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
19f50 20 69 66 28 20 69 4c 65 76 65 6c 3c 30 20 29 7b   if( iLevel<0 ){
19f60 0a 20 20 20 20 20 20 46 74 73 35 53 74 72 75 63  .      Fts5Struc
19f70 74 75 72 65 4c 65 76 65 6c 20 2a 70 45 6e 64 20  tureLevel *pEnd 
19f80 3d 20 26 70 53 74 72 75 63 74 2d 3e 61 4c 65 76  = &pStruct->aLev
19f90 65 6c 5b 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76  el[pStruct->nLev
19fa0 65 6c 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 70  el];.      if( p
19fb0 2d 3e 70 48 61 73 68 20 29 7b 0a 20 20 20 20 20  ->pHash ){.     
19fc0 20 20 20 2f 2a 20 41 64 64 20 61 20 73 65 67 6d     /* Add a segm
19fd0 65 6e 74 20 69 74 65 72 61 74 6f 72 20 66 6f 72  ent iterator for
19fe0 20 74 68 65 20 63 75 72 72 65 6e 74 20 63 6f 6e   the current con
19ff0 74 65 6e 74 73 20 6f 66 20 74 68 65 20 68 61 73  tents of the has
1a000 68 20 74 61 62 6c 65 2e 20 2a 2f 0a 20 20 20 20  h table. */.    
1a010 20 20 20 20 46 74 73 35 53 65 67 49 74 65 72 20      Fts5SegIter 
1a020 2a 70 49 74 65 72 20 3d 20 26 70 4e 65 77 2d 3e  *pIter = &pNew->
1a030 61 53 65 67 5b 69 49 74 65 72 2b 2b 5d 3b 0a 20  aSeg[iIter++];. 
1a040 20 20 20 20 20 20 20 66 74 73 35 53 65 67 49 74         fts5SegIt
1a050 65 72 48 61 73 68 49 6e 69 74 28 70 2c 20 70 54  erHashInit(p, pT
1a060 65 72 6d 2c 20 6e 54 65 72 6d 2c 20 66 6c 61 67  erm, nTerm, flag
1a070 73 2c 20 70 49 74 65 72 29 3b 0a 20 20 20 20 20  s, pIter);.     
1a080 20 7d 0a 20 20 20 20 20 20 66 6f 72 28 70 4c 76   }.      for(pLv
1a090 6c 3d 26 70 53 74 72 75 63 74 2d 3e 61 4c 65 76  l=&pStruct->aLev
1a0a0 65 6c 5b 30 5d 3b 20 70 4c 76 6c 3c 70 45 6e 64  el[0]; pLvl<pEnd
1a0b0 3b 20 70 4c 76 6c 2b 2b 29 7b 0a 20 20 20 20 20  ; pLvl++){.     
1a0c0 20 20 20 66 6f 72 28 69 53 65 67 3d 70 4c 76 6c     for(iSeg=pLvl
1a0d0 2d 3e 6e 53 65 67 2d 31 3b 20 69 53 65 67 3e 3d  ->nSeg-1; iSeg>=
1a0e0 30 3b 20 69 53 65 67 2d 2d 29 7b 0a 20 20 20 20  0; iSeg--){.    
1a0f0 20 20 20 20 20 20 46 74 73 35 53 74 72 75 63 74        Fts5Struct
1a100 75 72 65 53 65 67 6d 65 6e 74 20 2a 70 53 65 67  ureSegment *pSeg
1a110 20 3d 20 26 70 4c 76 6c 2d 3e 61 53 65 67 5b 69   = &pLvl->aSeg[i
1a120 53 65 67 5d 3b 0a 20 20 20 20 20 20 20 20 20 20  Seg];.          
1a130 46 74 73 35 53 65 67 49 74 65 72 20 2a 70 49 74  Fts5SegIter *pIt
1a140 65 72 20 3d 20 26 70 4e 65 77 2d 3e 61 53 65 67  er = &pNew->aSeg
1a150 5b 69 49 74 65 72 2b 2b 5d 3b 0a 20 20 20 20 20  [iIter++];.     
1a160 20 20 20 20 20 69 66 28 20 70 54 65 72 6d 3d 3d       if( pTerm==
1a170 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
1a180 20 66 74 73 35 53 65 67 49 74 65 72 49 6e 69 74   fts5SegIterInit
1a190 28 70 2c 20 70 53 65 67 2c 20 70 49 74 65 72 29  (p, pSeg, pIter)
1a1a0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73  ;.          }els
1a1b0 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 66  e{.            f
1a1c0 74 73 35 53 65 67 49 74 65 72 53 65 65 6b 49 6e  ts5SegIterSeekIn
1a1d0 69 74 28 70 2c 20 70 54 65 72 6d 2c 20 6e 54 65  it(p, pTerm, nTe
1a1e0 72 6d 2c 20 66 6c 61 67 73 2c 20 70 53 65 67 2c  rm, flags, pSeg,
1a1f0 20 70 49 74 65 72 29 3b 0a 20 20 20 20 20 20 20   pIter);.       
1a200 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
1a210 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
1a220 7b 0a 20 20 20 20 20 20 70 4c 76 6c 20 3d 20 26  {.      pLvl = &
1a230 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b  pStruct->aLevel[
1a240 69 4c 65 76 65 6c 5d 3b 0a 20 20 20 20 20 20 66  iLevel];.      f
1a250 6f 72 28 69 53 65 67 3d 6e 53 65 67 2d 31 3b 20  or(iSeg=nSeg-1; 
1a260 69 53 65 67 3e 3d 30 3b 20 69 53 65 67 2d 2d 29  iSeg>=0; iSeg--)
1a270 7b 0a 20 20 20 20 20 20 20 20 66 74 73 35 53 65  {.        fts5Se
1a280 67 49 74 65 72 49 6e 69 74 28 70 2c 20 26 70 4c  gIterInit(p, &pL
1a290 76 6c 2d 3e 61 53 65 67 5b 69 53 65 67 5d 2c 20  vl->aSeg[iSeg], 
1a2a0 26 70 4e 65 77 2d 3e 61 53 65 67 5b 69 49 74 65  &pNew->aSeg[iIte
1a2b0 72 2b 2b 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20  r++]);.      }. 
1a2c0 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28     }.    assert(
1a2d0 20 69 49 74 65 72 3d 3d 6e 53 65 67 20 29 3b 0a   iIter==nSeg );.
1a2e0 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65    }..  /* If the
1a2f0 20 61 62 6f 76 65 20 77 61 73 20 73 75 63 63 65   above was succe
1a300 73 73 66 75 6c 2c 20 65 61 63 68 20 63 6f 6d 70  ssful, each comp
1a310 6f 6e 65 6e 74 20 69 74 65 72 61 74 6f 72 73 20  onent iterators 
1a320 6e 6f 77 20 70 6f 69 6e 74 73 20 0a 20 20 2a 2a  now points .  **
1a330 20 74 6f 20 74 68 65 20 66 69 72 73 74 20 65 6e   to the first en
1a340 74 72 79 20 69 6e 20 69 74 73 20 73 65 67 6d 65  try in its segme
1a350 6e 74 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  nt. In this case
1a360 20 69 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20   initialize the 
1a370 0a 20 20 2a 2a 20 61 46 69 72 73 74 5b 5d 20 61  .  ** aFirst[] a
1a380 72 72 61 79 2e 20 4f 72 2c 20 69 66 20 61 6e 20  rray. Or, if an 
1a390 65 72 72 6f 72 20 68 61 73 20 6f 63 63 75 72 72  error has occurr
1a3a0 65 64 2c 20 66 72 65 65 20 74 68 65 20 69 74 65  ed, free the ite
1a3b0 72 61 74 6f 72 0a 20 20 2a 2a 20 6f 62 6a 65 63  rator.  ** objec
1a3c0 74 20 61 6e 64 20 73 65 74 20 74 68 65 20 6f 75  t and set the ou
1a3d0 74 70 75 74 20 76 61 72 69 61 62 6c 65 20 74 6f  tput variable to
1a3e0 20 4e 55 4c 4c 2e 20 20 2a 2f 0a 20 20 69 66 28   NULL.  */.  if(
1a3f0 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
1a400 4b 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 49 74  K ){.    for(iIt
1a410 65 72 3d 70 4e 65 77 2d 3e 6e 53 65 67 2d 31 3b  er=pNew->nSeg-1;
1a420 20 69 49 74 65 72 3e 30 3b 20 69 49 74 65 72 2d   iIter>0; iIter-
1a430 2d 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 45  -){.      int iE
1a440 71 3b 0a 20 20 20 20 20 20 69 66 28 20 28 69 45  q;.      if( (iE
1a450 71 20 3d 20 66 74 73 35 4d 75 6c 74 69 49 74 65  q = fts5MultiIte
1a460 72 44 6f 43 6f 6d 70 61 72 65 28 70 4e 65 77 2c  rDoCompare(pNew,
1a470 20 69 49 74 65 72 29 29 20 29 7b 0a 20 20 20 20   iIter)) ){.    
1a480 20 20 20 20 46 74 73 35 53 65 67 49 74 65 72 20      Fts5SegIter 
1a490 2a 70 53 65 67 20 3d 20 26 70 4e 65 77 2d 3e 61  *pSeg = &pNew->a
1a4a0 53 65 67 5b 69 45 71 5d 3b 0a 20 20 20 20 20 20  Seg[iEq];.      
1a4b0 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c    if( p->rc==SQL
1a4c0 49 54 45 5f 4f 4b 20 29 20 70 53 65 67 2d 3e 78  ITE_OK ) pSeg->x
1a4d0 4e 65 78 74 28 70 2c 20 70 53 65 67 2c 20 30 29  Next(p, pSeg, 0)
1a4e0 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35 4d 75  ;.        fts5Mu
1a4f0 6c 74 69 49 74 65 72 41 64 76 61 6e 63 65 64 28  ltiIterAdvanced(
1a500 70 2c 20 70 4e 65 77 2c 20 69 45 71 2c 20 69 49  p, pNew, iEq, iI
1a510 74 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ter);.      }.  
1a520 20 20 7d 0a 20 20 20 20 66 74 73 35 4d 75 6c 74    }.    fts5Mult
1a530 69 49 74 65 72 53 65 74 45 6f 66 28 70 4e 65 77  iIterSetEof(pNew
1a540 29 3b 0a 20 20 20 20 66 74 73 35 41 73 73 65 72  );.    fts5Asser
1a550 74 4d 75 6c 74 69 49 74 65 72 53 65 74 75 70 28  tMultiIterSetup(
1a560 70 2c 20 70 4e 65 77 29 3b 0a 0a 20 20 20 20 69  p, pNew);..    i
1a570 66 28 20 70 4e 65 77 2d 3e 62 53 6b 69 70 45 6d  f( pNew->bSkipEm
1a580 70 74 79 20 26 26 20 66 74 73 35 4d 75 6c 74 69  pty && fts5Multi
1a590 49 74 65 72 49 73 45 6d 70 74 79 28 70 2c 20 70  IterIsEmpty(p, p
1a5a0 4e 65 77 29 20 29 7b 0a 20 20 20 20 20 20 66 74  New) ){.      ft
1a5b0 73 35 4d 75 6c 74 69 49 74 65 72 4e 65 78 74 28  s5MultiIterNext(
1a5c0 70 2c 20 70 4e 65 77 2c 20 30 2c 20 30 29 3b 0a  p, pNew, 0, 0);.
1a5d0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4e      }else if( pN
1a5e0 65 77 2d 3e 62 61 73 65 2e 62 45 6f 66 3d 3d 30  ew->base.bEof==0
1a5f0 20 29 7b 0a 20 20 20 20 20 20 46 74 73 35 53 65   ){.      Fts5Se
1a600 67 49 74 65 72 20 2a 70 53 65 67 20 3d 20 26 70  gIter *pSeg = &p
1a610 4e 65 77 2d 3e 61 53 65 67 5b 70 4e 65 77 2d 3e  New->aSeg[pNew->
1a620 61 46 69 72 73 74 5b 31 5d 2e 69 46 69 72 73 74  aFirst[1].iFirst
1a630 5d 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 78  ];.      pNew->x
1a640 53 65 74 4f 75 74 70 75 74 73 28 70 4e 65 77 2c  SetOutputs(pNew,
1a650 20 70 53 65 67 29 3b 0a 20 20 20 20 7d 0a 0a 20   pSeg);.    }.. 
1a660 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66 74 73 35   }else{.    fts5
1a670 4d 75 6c 74 69 49 74 65 72 46 72 65 65 28 70 4e  MultiIterFree(pN
1a680 65 77 29 3b 0a 20 20 20 20 2a 70 70 4f 75 74 20  ew);.    *ppOut 
1a690 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  = 0;.  }.}../*.*
1a6a0 2a 20 43 72 65 61 74 65 20 61 6e 20 46 74 73 35  * Create an Fts5
1a6b0 49 74 65 72 20 74 68 61 74 20 69 74 65 72 61 74  Iter that iterat
1a6c0 65 73 20 74 68 72 6f 75 67 68 20 74 68 65 20 64  es through the d
1a6d0 6f 63 6c 69 73 74 20 70 72 6f 76 69 64 65 64 0a  oclist provided.
1a6e0 2a 2a 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64  ** as the second
1a6f0 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74   argument..*/.st
1a700 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 4d 75  atic void fts5Mu
1a710 6c 74 69 49 74 65 72 4e 65 77 32 28 0a 20 20 46  ltiIterNew2(.  F
1a720 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20  ts5Index *p,    
1a730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1a740 2a 20 46 54 53 35 20 62 61 63 6b 65 6e 64 20 74  * FTS5 backend t
1a750 6f 20 69 74 65 72 61 74 65 20 77 69 74 68 69 6e  o iterate within
1a760 20 2a 2f 0a 20 20 46 74 73 35 44 61 74 61 20 2a   */.  Fts5Data *
1a770 70 44 61 74 61 2c 20 20 20 20 20 20 20 20 20 20  pData,          
1a780 20 20 20 20 20 20 2f 2a 20 44 6f 63 6c 69 73 74        /* Doclist
1a790 20 74 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f   to iterate thro
1a7a0 75 67 68 20 2a 2f 0a 20 20 69 6e 74 20 62 44 65  ugh */.  int bDe
1a7b0 73 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  sc,             
1a7c0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
1a7d0 20 66 6f 72 20 64 65 73 63 65 6e 64 69 6e 67 20   for descending 
1a7e0 72 6f 77 69 64 20 6f 72 64 65 72 20 2a 2f 0a 20  rowid order */. 
1a7f0 20 46 74 73 35 49 74 65 72 20 2a 2a 70 70 4f 75   Fts5Iter **ppOu
1a800 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t               
1a810 20 2f 2a 20 4e 65 77 20 6f 62 6a 65 63 74 20 2a   /* New object *
1a820 2f 0a 29 7b 0a 20 20 46 74 73 35 49 74 65 72 20  /.){.  Fts5Iter 
1a830 2a 70 4e 65 77 3b 0a 20 20 70 4e 65 77 20 3d 20  *pNew;.  pNew = 
1a840 66 74 73 35 4d 75 6c 74 69 49 74 65 72 41 6c 6c  fts5MultiIterAll
1a850 6f 63 28 70 2c 20 32 29 3b 0a 20 20 69 66 28 20  oc(p, 2);.  if( 
1a860 70 4e 65 77 20 29 7b 0a 20 20 20 20 46 74 73 35  pNew ){.    Fts5
1a870 53 65 67 49 74 65 72 20 2a 70 49 74 65 72 20 3d  SegIter *pIter =
1a880 20 26 70 4e 65 77 2d 3e 61 53 65 67 5b 31 5d 3b   &pNew->aSeg[1];
1a890 0a 0a 20 20 20 20 70 49 74 65 72 2d 3e 66 6c 61  ..    pIter->fla
1a8a0 67 73 20 3d 20 46 54 53 35 5f 53 45 47 49 54 45  gs = FTS5_SEGITE
1a8b0 52 5f 4f 4e 45 54 45 52 4d 3b 0a 20 20 20 20 69  R_ONETERM;.    i
1a8c0 66 28 20 70 44 61 74 61 2d 3e 73 7a 4c 65 61 66  f( pData->szLeaf
1a8d0 3e 30 20 29 7b 0a 20 20 20 20 20 20 70 49 74 65  >0 ){.      pIte
1a8e0 72 2d 3e 70 4c 65 61 66 20 3d 20 70 44 61 74 61  r->pLeaf = pData
1a8f0 3b 0a 20 20 20 20 20 20 70 49 74 65 72 2d 3e 69  ;.      pIter->i
1a900 4c 65 61 66 4f 66 66 73 65 74 20 3d 20 66 74 73  LeafOffset = fts
1a910 35 47 65 74 56 61 72 69 6e 74 28 70 44 61 74 61  5GetVarint(pData
1a920 2d 3e 70 2c 20 28 75 36 34 2a 29 26 70 49 74 65  ->p, (u64*)&pIte
1a930 72 2d 3e 69 52 6f 77 69 64 29 3b 0a 20 20 20 20  r->iRowid);.    
1a940 20 20 70 49 74 65 72 2d 3e 69 45 6e 64 6f 66 44    pIter->iEndofD
1a950 6f 63 6c 69 73 74 20 3d 20 70 44 61 74 61 2d 3e  oclist = pData->
1a960 6e 6e 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e  nn;.      pNew->
1a970 61 46 69 72 73 74 5b 31 5d 2e 69 46 69 72 73 74  aFirst[1].iFirst
1a980 20 3d 20 31 3b 0a 20 20 20 20 20 20 69 66 28 20   = 1;.      if( 
1a990 62 44 65 73 63 20 29 7b 0a 20 20 20 20 20 20 20  bDesc ){.       
1a9a0 20 70 4e 65 77 2d 3e 62 52 65 76 20 3d 20 31 3b   pNew->bRev = 1;
1a9b0 0a 20 20 20 20 20 20 20 20 70 49 74 65 72 2d 3e  .        pIter->
1a9c0 66 6c 61 67 73 20 7c 3d 20 46 54 53 35 5f 53 45  flags |= FTS5_SE
1a9d0 47 49 54 45 52 5f 52 45 56 45 52 53 45 3b 0a 20  GITER_REVERSE;. 
1a9e0 20 20 20 20 20 20 20 66 74 73 35 53 65 67 49 74         fts5SegIt
1a9f0 65 72 52 65 76 65 72 73 65 49 6e 69 74 50 61 67  erReverseInitPag
1aa00 65 28 70 2c 20 70 49 74 65 72 29 3b 0a 20 20 20  e(p, pIter);.   
1aa10 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1aa20 20 20 66 74 73 35 53 65 67 49 74 65 72 4c 6f 61    fts5SegIterLoa
1aa30 64 4e 50 6f 73 28 70 2c 20 70 49 74 65 72 29 3b  dNPos(p, pIter);
1aa40 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
1aa50 44 61 74 61 20 3d 20 30 3b 0a 20 20 20 20 7d 65  Data = 0;.    }e
1aa60 6c 73 65 7b 0a 20 20 20 20 20 20 70 4e 65 77 2d  lse{.      pNew-
1aa70 3e 62 61 73 65 2e 62 45 6f 66 20 3d 20 31 3b 0a  >base.bEof = 1;.
1aa80 20 20 20 20 7d 0a 20 20 20 20 66 74 73 35 53 65      }.    fts5Se
1aa90 67 49 74 65 72 53 65 74 4e 65 78 74 28 70 2c 20  gIterSetNext(p, 
1aaa0 70 49 74 65 72 29 3b 0a 0a 20 20 20 20 2a 70 70  pIter);..    *pp
1aab0 4f 75 74 20 3d 20 70 4e 65 77 3b 0a 20 20 7d 0a  Out = pNew;.  }.
1aac0 0a 20 20 66 74 73 35 44 61 74 61 52 65 6c 65 61  .  fts5DataRelea
1aad0 73 65 28 70 44 61 74 61 29 3b 0a 7d 0a 0a 2f 2a  se(pData);.}../*
1aae0 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20  .** Return true 
1aaf0 69 66 20 74 68 65 20 69 74 65 72 61 74 6f 72 20  if the iterator 
1ab00 69 73 20 61 74 20 45 4f 46 20 6f 72 20 69 66 20  is at EOF or if 
1ab10 61 6e 20 65 72 72 6f 72 20 68 61 73 20 6f 63 63  an error has occ
1ab20 75 72 72 65 64 2e 20 0a 2a 2a 20 46 61 6c 73 65  urred. .** False
1ab30 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 73   otherwise..*/.s
1ab40 74 61 74 69 63 20 69 6e 74 20 66 74 73 35 4d 75  tatic int fts5Mu
1ab50 6c 74 69 49 74 65 72 45 6f 66 28 46 74 73 35 49  ltiIterEof(Fts5I
1ab60 6e 64 65 78 20 2a 70 2c 20 46 74 73 35 49 74 65  ndex *p, Fts5Ite
1ab70 72 20 2a 70 49 74 65 72 29 7b 0a 20 20 61 73 73  r *pIter){.  ass
1ab80 65 72 74 28 20 70 2d 3e 72 63 20 0a 20 20 20 20  ert( p->rc .    
1ab90 20 20 7c 7c 20 28 70 49 74 65 72 2d 3e 61 53 65    || (pIter->aSe
1aba0 67 5b 20 70 49 74 65 72 2d 3e 61 46 69 72 73 74  g[ pIter->aFirst
1abb0 5b 31 5d 2e 69 46 69 72 73 74 20 5d 2e 70 4c 65  [1].iFirst ].pLe
1abc0 61 66 3d 3d 30 29 3d 3d 70 49 74 65 72 2d 3e 62  af==0)==pIter->b
1abd0 61 73 65 2e 62 45 6f 66 20 0a 20 20 29 3b 0a 20  ase.bEof .  );. 
1abe0 20 72 65 74 75 72 6e 20 28 70 2d 3e 72 63 20 7c   return (p->rc |
1abf0 7c 20 70 49 74 65 72 2d 3e 62 61 73 65 2e 62 45  | pIter->base.bE
1ac00 6f 66 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  of);.}../*.** Re
1ac10 74 75 72 6e 20 74 68 65 20 72 6f 77 69 64 20 6f  turn the rowid o
1ac20 66 20 74 68 65 20 65 6e 74 72 79 20 74 68 61 74  f the entry that
1ac30 20 74 68 65 20 69 74 65 72 61 74 6f 72 20 63 75   the iterator cu
1ac40 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 73 0a 2a  rrently points.*
1ac50 2a 20 74 6f 2e 20 49 66 20 74 68 65 20 69 74 65  * to. If the ite
1ac60 72 61 74 6f 72 20 70 6f 69 6e 74 73 20 74 6f 20  rator points to 
1ac70 45 4f 46 20 77 68 65 6e 20 74 68 69 73 20 66 75  EOF when this fu
1ac80 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
1ac90 20 74 68 65 0a 2a 2a 20 72 65 73 75 6c 74 73 20   the.** results 
1aca0 61 72 65 20 75 6e 64 65 66 69 6e 65 64 2e 0a 2a  are undefined..*
1acb0 2f 0a 73 74 61 74 69 63 20 69 36 34 20 66 74 73  /.static i64 fts
1acc0 35 4d 75 6c 74 69 49 74 65 72 52 6f 77 69 64 28  5MultiIterRowid(
1acd0 46 74 73 35 49 74 65 72 20 2a 70 49 74 65 72 29  Fts5Iter *pIter)
1ace0 7b 0a 20 20 61 73 73 65 72 74 28 20 70 49 74 65  {.  assert( pIte
1acf0 72 2d 3e 61 53 65 67 5b 20 70 49 74 65 72 2d 3e  r->aSeg[ pIter->
1ad00 61 46 69 72 73 74 5b 31 5d 2e 69 46 69 72 73 74  aFirst[1].iFirst
1ad10 20 5d 2e 70 4c 65 61 66 20 29 3b 0a 20 20 72 65   ].pLeaf );.  re
1ad20 74 75 72 6e 20 70 49 74 65 72 2d 3e 61 53 65 67  turn pIter->aSeg
1ad30 5b 20 70 49 74 65 72 2d 3e 61 46 69 72 73 74 5b  [ pIter->aFirst[
1ad40 31 5d 2e 69 46 69 72 73 74 20 5d 2e 69 52 6f 77  1].iFirst ].iRow
1ad50 69 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76  id;.}../*.** Mov
1ad60 65 20 74 68 65 20 69 74 65 72 61 74 6f 72 20 74  e the iterator t
1ad70 6f 20 74 68 65 20 6e 65 78 74 20 65 6e 74 72 79  o the next entry
1ad80 20 61 74 20 6f 72 20 66 6f 6c 6c 6f 77 69 6e 67   at or following
1ad90 20 69 4d 61 74 63 68 2e 0a 2a 2f 0a 73 74 61 74   iMatch..*/.stat
1ada0 69 63 20 76 6f 69 64 20 66 74 73 35 4d 75 6c 74  ic void fts5Mult
1adb0 69 49 74 65 72 4e 65 78 74 46 72 6f 6d 28 0a 20  iIterNextFrom(. 
1adc0 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 0a   Fts5Index *p, .
1add0 20 20 46 74 73 35 49 74 65 72 20 2a 70 49 74 65    Fts5Iter *pIte
1ade0 72 2c 20 0a 20 20 69 36 34 20 69 4d 61 74 63 68  r, .  i64 iMatch
1adf0 0a 29 7b 0a 20 20 77 68 69 6c 65 28 20 31 20 29  .){.  while( 1 )
1ae00 7b 0a 20 20 20 20 69 36 34 20 69 52 6f 77 69 64  {.    i64 iRowid
1ae10 3b 0a 20 20 20 20 66 74 73 35 4d 75 6c 74 69 49  ;.    fts5MultiI
1ae20 74 65 72 4e 65 78 74 28 70 2c 20 70 49 74 65 72  terNext(p, pIter
1ae30 2c 20 31 2c 20 69 4d 61 74 63 68 29 3b 0a 20 20  , 1, iMatch);.  
1ae40 20 20 69 66 28 20 66 74 73 35 4d 75 6c 74 69 49    if( fts5MultiI
1ae50 74 65 72 45 6f 66 28 70 2c 20 70 49 74 65 72 29  terEof(p, pIter)
1ae60 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 69 52   ) break;.    iR
1ae70 6f 77 69 64 20 3d 20 66 74 73 35 4d 75 6c 74 69  owid = fts5Multi
1ae80 49 74 65 72 52 6f 77 69 64 28 70 49 74 65 72 29  IterRowid(pIter)
1ae90 3b 0a 20 20 20 20 69 66 28 20 70 49 74 65 72 2d  ;.    if( pIter-
1aea0 3e 62 52 65 76 3d 3d 30 20 26 26 20 69 52 6f 77  >bRev==0 && iRow
1aeb0 69 64 3e 3d 69 4d 61 74 63 68 20 29 20 62 72 65  id>=iMatch ) bre
1aec0 61 6b 3b 0a 20 20 20 20 69 66 28 20 70 49 74 65  ak;.    if( pIte
1aed0 72 2d 3e 62 52 65 76 21 3d 30 20 26 26 20 69 52  r->bRev!=0 && iR
1aee0 6f 77 69 64 3c 3d 69 4d 61 74 63 68 20 29 20 62  owid<=iMatch ) b
1aef0 72 65 61 6b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  reak;.  }.}../*.
1af00 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e  ** Return a poin
1af10 74 65 72 20 74 6f 20 61 20 62 75 66 66 65 72 20  ter to a buffer 
1af20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 74  containing the t
1af30 65 72 6d 20 61 73 73 6f 63 69 61 74 65 64 20 77  erm associated w
1af40 69 74 68 20 74 68 65 20 0a 2a 2a 20 65 6e 74 72  ith the .** entr
1af50 79 20 74 68 61 74 20 74 68 65 20 69 74 65 72 61  y that the itera
1af60 74 6f 72 20 63 75 72 72 65 6e 74 6c 79 20 70 6f  tor currently po
1af70 69 6e 74 73 20 74 6f 2e 0a 2a 2f 0a 73 74 61 74  ints to..*/.stat
1af80 69 63 20 63 6f 6e 73 74 20 75 38 20 2a 66 74 73  ic const u8 *fts
1af90 35 4d 75 6c 74 69 49 74 65 72 54 65 72 6d 28 46  5MultiIterTerm(F
1afa0 74 73 35 49 74 65 72 20 2a 70 49 74 65 72 2c 20  ts5Iter *pIter, 
1afb0 69 6e 74 20 2a 70 6e 29 7b 0a 20 20 46 74 73 35  int *pn){.  Fts5
1afc0 53 65 67 49 74 65 72 20 2a 70 20 3d 20 26 70 49  SegIter *p = &pI
1afd0 74 65 72 2d 3e 61 53 65 67 5b 20 70 49 74 65 72  ter->aSeg[ pIter
1afe0 2d 3e 61 46 69 72 73 74 5b 31 5d 2e 69 46 69 72  ->aFirst[1].iFir
1aff0 73 74 20 5d 3b 0a 20 20 2a 70 6e 20 3d 20 70 2d  st ];.  *pn = p-
1b000 3e 74 65 72 6d 2e 6e 3b 0a 20 20 72 65 74 75 72  >term.n;.  retur
1b010 6e 20 70 2d 3e 74 65 72 6d 2e 70 3b 0a 7d 0a 0a  n p->term.p;.}..
1b020 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61  /*.** Allocate a
1b030 20 6e 65 77 20 73 65 67 6d 65 6e 74 2d 69 64 20   new segment-id 
1b040 66 6f 72 20 74 68 65 20 73 74 72 75 63 74 75 72  for the structur
1b050 65 20 70 53 74 72 75 63 74 2e 20 54 68 65 20 6e  e pStruct. The n
1b060 65 77 20 73 65 67 6d 65 6e 74 0a 2a 2a 20 69 64  ew segment.** id
1b070 20 6d 75 73 74 20 62 65 20 62 65 74 77 65 65 6e   must be between
1b080 20 31 20 61 6e 64 20 36 35 33 33 35 20 69 6e 63   1 and 65335 inc
1b090 6c 75 73 69 76 65 2c 20 61 6e 64 20 6d 75 73 74  lusive, and must
1b0a0 20 6e 6f 74 20 62 65 20 75 73 65 64 20 62 79 20   not be used by 
1b0b0 0a 2a 2a 20 61 6e 79 20 63 75 72 72 65 6e 74 6c  .** any currentl
1b0c0 79 20 65 78 69 73 74 69 6e 67 20 73 65 67 6d 65  y existing segme
1b0d0 6e 74 2e 20 49 66 20 61 20 66 72 65 65 20 73 65  nt. If a free se
1b0e0 67 6d 65 6e 74 20 69 64 20 63 61 6e 6e 6f 74 20  gment id cannot 
1b0f0 62 65 20 66 6f 75 6e 64 2c 0a 2a 2a 20 53 51 4c  be found,.** SQL
1b100 49 54 45 5f 46 55 4c 4c 20 69 73 20 72 65 74 75  ITE_FULL is retu
1b110 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  rned..**.** If a
1b120 6e 20 65 72 72 6f 72 20 68 61 73 20 61 6c 72 65  n error has alre
1b130 61 64 79 20 6f 63 63 75 72 72 65 64 2c 20 74 68  ady occurred, th
1b140 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61  is function is a
1b150 20 6e 6f 2d 6f 70 2e 20 30 20 69 73 20 0a 2a 2a   no-op. 0 is .**
1b160 20 72 65 74 75 72 6e 65 64 20 69 6e 20 74 68 69   returned in thi
1b170 73 20 63 61 73 65 2e 0a 2a 2f 0a 73 74 61 74 69  s case..*/.stati
1b180 63 20 69 6e 74 20 66 74 73 35 41 6c 6c 6f 63 61  c int fts5Alloca
1b190 74 65 53 65 67 69 64 28 46 74 73 35 49 6e 64 65  teSegid(Fts5Inde
1b1a0 78 20 2a 70 2c 20 46 74 73 35 53 74 72 75 63 74  x *p, Fts5Struct
1b1b0 75 72 65 20 2a 70 53 74 72 75 63 74 29 7b 0a 20  ure *pStruct){. 
1b1c0 20 69 6e 74 20 69 53 65 67 69 64 20 3d 20 30 3b   int iSegid = 0;
1b1d0 0a 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53  ..  if( p->rc==S
1b1e0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1b1f0 69 66 28 20 70 53 74 72 75 63 74 2d 3e 6e 53 65  if( pStruct->nSe
1b200 67 6d 65 6e 74 3e 3d 46 54 53 35 5f 4d 41 58 5f  gment>=FTS5_MAX_
1b210 53 45 47 4d 45 4e 54 20 29 7b 0a 20 20 20 20 20  SEGMENT ){.     
1b220 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f   p->rc = SQLITE_
1b230 46 55 4c 4c 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  FULL;.    }else{
1b240 0a 20 20 20 20 20 20 2f 2a 20 46 54 53 35 5f 4d  .      /* FTS5_M
1b250 41 58 5f 53 45 47 4d 45 4e 54 20 69 73 20 63 75  AX_SEGMENT is cu
1b260 72 72 65 6e 74 6c 79 20 64 65 66 69 6e 65 64 20  rrently defined 
1b270 61 73 20 32 30 30 30 2e 20 53 6f 20 74 68 65 20  as 2000. So the 
1b280 66 6f 6c 6c 6f 77 69 6e 67 0a 20 20 20 20 20 20  following.      
1b290 2a 2a 20 61 72 72 61 79 20 69 73 20 36 33 20 65  ** array is 63 e
1b2a0 6c 65 6d 65 6e 74 73 2c 20 6f 72 20 32 35 32 20  lements, or 252 
1b2b0 62 79 74 65 73 2c 20 69 6e 20 73 69 7a 65 2e 20  bytes, in size. 
1b2c0 20 2a 2f 0a 20 20 20 20 20 20 75 33 32 20 61 55   */.      u32 aU
1b2d0 73 65 64 5b 28 46 54 53 35 5f 4d 41 58 5f 53 45  sed[(FTS5_MAX_SE
1b2e0 47 4d 45 4e 54 2b 33 31 29 20 2f 20 33 32 5d 3b  GMENT+31) / 32];
1b2f0 0a 20 20 20 20 20 20 69 6e 74 20 69 4c 76 6c 2c  .      int iLvl,
1b300 20 69 53 65 67 3b 0a 20 20 20 20 20 20 69 6e 74   iSeg;.      int
1b310 20 69 3b 0a 20 20 20 20 20 20 75 33 32 20 6d 61   i;.      u32 ma
1b320 73 6b 3b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74  sk;.      memset
1b330 28 61 55 73 65 64 2c 20 30 2c 20 73 69 7a 65 6f  (aUsed, 0, sizeo
1b340 66 28 61 55 73 65 64 29 29 3b 0a 20 20 20 20 20  f(aUsed));.     
1b350 20 66 6f 72 28 69 4c 76 6c 3d 30 3b 20 69 4c 76   for(iLvl=0; iLv
1b360 6c 3c 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65  l<pStruct->nLeve
1b370 6c 3b 20 69 4c 76 6c 2b 2b 29 7b 0a 20 20 20 20  l; iLvl++){.    
1b380 20 20 20 20 66 6f 72 28 69 53 65 67 3d 30 3b 20      for(iSeg=0; 
1b390 69 53 65 67 3c 70 53 74 72 75 63 74 2d 3e 61 4c  iSeg<pStruct->aL
1b3a0 65 76 65 6c 5b 69 4c 76 6c 5d 2e 6e 53 65 67 3b  evel[iLvl].nSeg;
1b3b0 20 69 53 65 67 2b 2b 29 7b 0a 20 20 20 20 20 20   iSeg++){.      
1b3c0 20 20 20 20 69 6e 74 20 69 49 64 20 3d 20 70 53      int iId = pS
1b3d0 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c  truct->aLevel[iL
1b3e0 76 6c 5d 2e 61 53 65 67 5b 69 53 65 67 5d 2e 69  vl].aSeg[iSeg].i
1b3f0 53 65 67 69 64 3b 0a 20 20 20 20 20 20 20 20 20  Segid;.         
1b400 20 69 66 28 20 69 49 64 3c 3d 46 54 53 35 5f 4d   if( iId<=FTS5_M
1b410 41 58 5f 53 45 47 4d 45 4e 54 20 29 7b 0a 20 20  AX_SEGMENT ){.  
1b420 20 20 20 20 20 20 20 20 20 20 61 55 73 65 64 5b            aUsed[
1b430 28 69 49 64 2d 31 29 20 2f 20 33 32 5d 20 7c 3d  (iId-1) / 32] |=
1b440 20 31 20 3c 3c 20 28 28 69 49 64 2d 31 29 20 25   1 << ((iId-1) %
1b450 20 33 32 29 3b 0a 20 20 20 20 20 20 20 20 20 20   32);.          
1b460 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
1b470 20 20 7d 0a 0a 20 20 20 20 20 20 66 6f 72 28 69    }..      for(i
1b480 3d 30 3b 20 61 55 73 65 64 5b 69 5d 3d 3d 30 78  =0; aUsed[i]==0x
1b490 46 46 46 46 46 46 46 46 3b 20 69 2b 2b 29 3b 0a  FFFFFFFF; i++);.
1b4a0 20 20 20 20 20 20 6d 61 73 6b 20 3d 20 61 55 73        mask = aUs
1b4b0 65 64 5b 69 5d 3b 0a 20 20 20 20 20 20 66 6f 72  ed[i];.      for
1b4c0 28 69 53 65 67 69 64 3d 30 3b 20 6d 61 73 6b 20  (iSegid=0; mask 
1b4d0 26 20 28 31 20 3c 3c 20 69 53 65 67 69 64 29 3b  & (1 << iSegid);
1b4e0 20 69 53 65 67 69 64 2b 2b 29 3b 0a 20 20 20 20   iSegid++);.    
1b4f0 20 20 69 53 65 67 69 64 20 2b 3d 20 31 20 2b 20    iSegid += 1 + 
1b500 69 2a 33 32 3b 0a 0a 23 69 66 64 65 66 20 53 51  i*32;..#ifdef SQ
1b510 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20 20  LITE_DEBUG.     
1b520 20 66 6f 72 28 69 4c 76 6c 3d 30 3b 20 69 4c 76   for(iLvl=0; iLv
1b530 6c 3c 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65  l<pStruct->nLeve
1b540 6c 3b 20 69 4c 76 6c 2b 2b 29 7b 0a 20 20 20 20  l; iLvl++){.    
1b550 20 20 20 20 66 6f 72 28 69 53 65 67 3d 30 3b 20      for(iSeg=0; 
1b560 69 53 65 67 3c 70 53 74 72 75 63 74 2d 3e 61 4c  iSeg<pStruct->aL
1b570 65 76 65 6c 5b 69 4c 76 6c 5d 2e 6e 53 65 67 3b  evel[iLvl].nSeg;
1b580 20 69 53 65 67 2b 2b 29 7b 0a 20 20 20 20 20 20   iSeg++){.      
1b590 20 20 20 20 61 73 73 65 72 74 28 20 69 53 65 67      assert( iSeg
1b5a0 69 64 21 3d 70 53 74 72 75 63 74 2d 3e 61 4c 65  id!=pStruct->aLe
1b5b0 76 65 6c 5b 69 4c 76 6c 5d 2e 61 53 65 67 5b 69  vel[iLvl].aSeg[i
1b5c0 53 65 67 5d 2e 69 53 65 67 69 64 20 29 3b 0a 20  Seg].iSegid );. 
1b5d0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
1b5e0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69  .      assert( i
1b5f0 53 65 67 69 64 3e 30 20 26 26 20 69 53 65 67 69  Segid>0 && iSegi
1b600 64 3c 3d 46 54 53 35 5f 4d 41 58 5f 53 45 47 4d  d<=FTS5_MAX_SEGM
1b610 45 4e 54 20 29 3b 0a 0a 20 20 20 20 20 20 7b 0a  ENT );..      {.
1b620 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
1b630 73 74 6d 74 20 2a 70 49 64 78 53 65 6c 65 63 74  stmt *pIdxSelect
1b640 20 3d 20 66 74 73 35 49 64 78 53 65 6c 65 63 74   = fts5IdxSelect
1b650 53 74 6d 74 28 70 29 3b 0a 20 20 20 20 20 20 20  Stmt(p);.       
1b660 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49   if( p->rc==SQLI
1b670 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
1b680 20 20 20 75 38 20 61 42 6c 6f 62 5b 32 5d 20 3d     u8 aBlob[2] =
1b690 20 7b 30 78 66 66 2c 20 30 78 66 66 7d 3b 0a 20   {0xff, 0xff};. 
1b6a0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
1b6b0 5f 62 69 6e 64 5f 69 6e 74 28 70 49 64 78 53 65  _bind_int(pIdxSe
1b6c0 6c 65 63 74 2c 20 31 2c 20 69 53 65 67 69 64 29  lect, 1, iSegid)
1b6d0 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
1b6e0 74 65 33 5f 62 69 6e 64 5f 62 6c 6f 62 28 70 49  te3_bind_blob(pI
1b6f0 64 78 53 65 6c 65 63 74 2c 20 32 2c 20 61 42 6c  dxSelect, 2, aBl
1b700 6f 62 2c 20 32 2c 20 53 51 4c 49 54 45 5f 53 54  ob, 2, SQLITE_ST
1b710 41 54 49 43 29 3b 0a 20 20 20 20 20 20 20 20 20  ATIC);.         
1b720 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
1b730 5f 73 74 65 70 28 70 49 64 78 53 65 6c 65 63 74  _step(pIdxSelect
1b740 29 21 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29 3b  )!=SQLITE_ROW );
1b750 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 72 63  .          p->rc
1b760 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74   = sqlite3_reset
1b770 28 70 49 64 78 53 65 6c 65 63 74 29 3b 0a 20 20  (pIdxSelect);.  
1b780 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
1b790 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 7d  #endif.    }.  }
1b7a0 0a 0a 20 20 72 65 74 75 72 6e 20 69 53 65 67 69  ..  return iSegi
1b7b0 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 69 73 63  d;.}../*.** Disc
1b7c0 61 72 64 20 61 6c 6c 20 64 61 74 61 20 63 75 72  ard all data cur
1b7d0 72 65 6e 74 6c 79 20 63 61 63 68 65 64 20 69 6e  rently cached in
1b7e0 20 74 68 65 20 68 61 73 68 2d 74 61 62 6c 65 73   the hash-tables
1b7f0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
1b800 20 66 74 73 35 49 6e 64 65 78 44 69 73 63 61 72   fts5IndexDiscar
1b810 64 44 61 74 61 28 46 74 73 35 49 6e 64 65 78 20  dData(Fts5Index 
1b820 2a 70 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70  *p){.  assert( p
1b830 2d 3e 70 48 61 73 68 20 7c 7c 20 70 2d 3e 6e 50  ->pHash || p->nP
1b840 65 6e 64 69 6e 67 44 61 74 61 3d 3d 30 20 29 3b  endingData==0 );
1b850 0a 20 20 69 66 28 20 70 2d 3e 70 48 61 73 68 20  .  if( p->pHash 
1b860 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 46 74  ){.    sqlite3Ft
1b870 73 35 48 61 73 68 43 6c 65 61 72 28 70 2d 3e 70  s5HashClear(p->p
1b880 48 61 73 68 29 3b 0a 20 20 20 20 70 2d 3e 6e 50  Hash);.    p->nP
1b890 65 6e 64 69 6e 67 44 61 74 61 20 3d 20 30 3b 0a  endingData = 0;.
1b8a0 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74    }.}../*.** Ret
1b8b0 75 72 6e 20 74 68 65 20 73 69 7a 65 20 6f 66 20  urn the size of 
1b8c0 74 68 65 20 70 72 65 66 69 78 2c 20 69 6e 20 62  the prefix, in b
1b8d0 79 74 65 73 2c 20 74 68 61 74 20 62 75 66 66 65  ytes, that buffe
1b8e0 72 20 0a 2a 2a 20 28 70 4e 65 77 2f 3c 6c 65 6e  r .** (pNew/<len
1b8f0 67 74 68 2d 75 6e 6b 6e 6f 77 6e 3e 29 20 73 68  gth-unknown>) sh
1b900 61 72 65 73 20 77 69 74 68 20 62 75 66 66 65 72  ares with buffer
1b910 20 28 70 4f 6c 64 2f 6e 4f 6c 64 29 2e 0a 2a 2a   (pOld/nOld)..**
1b920 0a 2a 2a 20 42 75 66 66 65 72 20 28 70 4e 65 77  .** Buffer (pNew
1b930 2f 3c 6c 65 6e 67 74 68 2d 75 6e 6b 6e 6f 77 6e  /<length-unknown
1b940 3e 29 20 69 73 20 67 75 61 72 61 6e 74 65 65 64  >) is guaranteed
1b950 20 74 6f 20 62 65 20 67 72 65 61 74 65 72 20 0a   to be greater .
1b960 2a 2a 20 74 68 61 6e 20 62 75 66 66 65 72 20 28  ** than buffer (
1b970 70 4f 6c 64 2f 6e 4f 6c 64 29 2e 0a 2a 2f 0a 73  pOld/nOld)..*/.s
1b980 74 61 74 69 63 20 69 6e 74 20 66 74 73 35 50 72  tatic int fts5Pr
1b990 65 66 69 78 43 6f 6d 70 72 65 73 73 28 69 6e 74  efixCompress(int
1b9a0 20 6e 4f 6c 64 2c 20 63 6f 6e 73 74 20 75 38 20   nOld, const u8 
1b9b0 2a 70 4f 6c 64 2c 20 63 6f 6e 73 74 20 75 38 20  *pOld, const u8 
1b9c0 2a 70 4e 65 77 29 7b 0a 20 20 69 6e 74 20 69 3b  *pNew){.  int i;
1b9d0 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f  .  for(i=0; i<nO
1b9e0 6c 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66  ld; i++){.    if
1b9f0 28 20 70 4f 6c 64 5b 69 5d 21 3d 70 4e 65 77 5b  ( pOld[i]!=pNew[
1ba00 69 5d 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  i] ) break;.  }.
1ba10 20 20 72 65 74 75 72 6e 20 69 3b 0a 7d 0a 0a 73    return i;.}..s
1ba20 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 57  tatic void fts5W
1ba30 72 69 74 65 44 6c 69 64 78 43 6c 65 61 72 28 0a  riteDlidxClear(.
1ba40 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20    Fts5Index *p, 
1ba50 0a 20 20 46 74 73 35 53 65 67 57 72 69 74 65 72  .  Fts5SegWriter
1ba60 20 2a 70 57 72 69 74 65 72 2c 0a 20 20 69 6e 74   *pWriter,.  int
1ba70 20 62 46 6c 75 73 68 20 20 20 20 20 20 20 20 20   bFlush         
1ba80 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1ba90 49 66 20 74 72 75 65 2c 20 77 72 69 74 65 20 64  If true, write d
1baa0 6c 69 64 78 20 74 6f 20 64 69 73 6b 20 2a 2f 0a  lidx to disk */.
1bab0 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 61 73  ){.  int i;.  as
1bac0 73 65 72 74 28 20 62 46 6c 75 73 68 3d 3d 30 20  sert( bFlush==0 
1bad0 7c 7c 20 28 70 57 72 69 74 65 72 2d 3e 6e 44 6c  || (pWriter->nDl
1bae0 69 64 78 3e 30 20 26 26 20 70 57 72 69 74 65 72  idx>0 && pWriter
1baf0 2d 3e 61 44 6c 69 64 78 5b 30 5d 2e 62 75 66 2e  ->aDlidx[0].buf.
1bb00 6e 3e 30 29 20 29 3b 0a 20 20 66 6f 72 28 69 3d  n>0) );.  for(i=
1bb10 30 3b 20 69 3c 70 57 72 69 74 65 72 2d 3e 6e 44  0; i<pWriter->nD
1bb20 6c 69 64 78 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  lidx; i++){.    
1bb30 46 74 73 35 44 6c 69 64 78 57 72 69 74 65 72 20  Fts5DlidxWriter 
1bb40 2a 70 44 6c 69 64 78 20 3d 20 26 70 57 72 69 74  *pDlidx = &pWrit
1bb50 65 72 2d 3e 61 44 6c 69 64 78 5b 69 5d 3b 0a 20  er->aDlidx[i];. 
1bb60 20 20 20 69 66 28 20 70 44 6c 69 64 78 2d 3e 62     if( pDlidx->b
1bb70 75 66 2e 6e 3d 3d 30 20 29 20 62 72 65 61 6b 3b  uf.n==0 ) break;
1bb80 0a 20 20 20 20 69 66 28 20 62 46 6c 75 73 68 20  .    if( bFlush 
1bb90 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
1bba0 20 70 44 6c 69 64 78 2d 3e 70 67 6e 6f 21 3d 30   pDlidx->pgno!=0
1bbb0 20 29 3b 0a 20 20 20 20 20 20 66 74 73 35 44 61   );.      fts5Da
1bbc0 74 61 57 72 69 74 65 28 70 2c 20 0a 20 20 20 20  taWrite(p, .    
1bbd0 20 20 20 20 20 20 46 54 53 35 5f 44 4c 49 44 58        FTS5_DLIDX
1bbe0 5f 52 4f 57 49 44 28 70 57 72 69 74 65 72 2d 3e  _ROWID(pWriter->
1bbf0 69 53 65 67 69 64 2c 20 69 2c 20 70 44 6c 69 64  iSegid, i, pDlid
1bc00 78 2d 3e 70 67 6e 6f 29 2c 0a 20 20 20 20 20 20  x->pgno),.      
1bc10 20 20 20 20 70 44 6c 69 64 78 2d 3e 62 75 66 2e      pDlidx->buf.
1bc20 70 2c 20 70 44 6c 69 64 78 2d 3e 62 75 66 2e 6e  p, pDlidx->buf.n
1bc30 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a  .      );.    }.
1bc40 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 42      sqlite3Fts5B
1bc50 75 66 66 65 72 5a 65 72 6f 28 26 70 44 6c 69 64  ufferZero(&pDlid
1bc60 78 2d 3e 62 75 66 29 3b 0a 20 20 20 20 70 44 6c  x->buf);.    pDl
1bc70 69 64 78 2d 3e 62 50 72 65 76 56 61 6c 69 64 20  idx->bPrevValid 
1bc80 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  = 0;.  }.}../*.*
1bc90 2a 20 47 72 6f 77 20 74 68 65 20 70 57 72 69 74  * Grow the pWrit
1bca0 65 72 2d 3e 61 44 6c 69 64 78 5b 5d 20 61 72 72  er->aDlidx[] arr
1bcb0 61 79 20 74 6f 20 61 74 20 6c 65 61 73 74 20 6e  ay to at least n
1bcc0 4c 76 6c 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20  Lvl elements in 
1bcd0 73 69 7a 65 2e 0a 2a 2a 20 41 6e 79 20 6e 65 77  size..** Any new
1bce0 20 61 72 72 61 79 20 65 6c 65 6d 65 6e 74 73 20   array elements 
1bcf0 61 72 65 20 7a 65 72 6f 65 64 20 62 65 66 6f 72  are zeroed befor
1bd00 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a  e returning..*/.
1bd10 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 35 57  static int fts5W
1bd20 72 69 74 65 44 6c 69 64 78 47 72 6f 77 28 0a 20  riteDlidxGrow(. 
1bd30 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 0a 20   Fts5Index *p,. 
1bd40 20 46 74 73 35 53 65 67 57 72 69 74 65 72 20 2a   Fts5SegWriter *
1bd50 70 57 72 69 74 65 72 2c 0a 20 20 69 6e 74 20 6e  pWriter,.  int n
1bd60 4c 76 6c 0a 29 7b 0a 20 20 69 66 28 20 70 2d 3e  Lvl.){.  if( p->
1bd70 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
1bd80 20 6e 4c 76 6c 3e 3d 70 57 72 69 74 65 72 2d 3e   nLvl>=pWriter->
1bd90 6e 44 6c 69 64 78 20 29 7b 0a 20 20 20 20 46 74  nDlidx ){.    Ft
1bda0 73 35 44 6c 69 64 78 57 72 69 74 65 72 20 2a 61  s5DlidxWriter *a
1bdb0 44 6c 69 64 78 20 3d 20 28 46 74 73 35 44 6c 69  Dlidx = (Fts5Dli
1bdc0 64 78 57 72 69 74 65 72 2a 29 73 71 6c 69 74 65  dxWriter*)sqlite
1bdd0 33 5f 72 65 61 6c 6c 6f 63 28 0a 20 20 20 20 20  3_realloc(.     
1bde0 20 20 20 70 57 72 69 74 65 72 2d 3e 61 44 6c 69     pWriter->aDli
1bdf0 64 78 2c 20 73 69 7a 65 6f 66 28 46 74 73 35 44  dx, sizeof(Fts5D
1be00 6c 69 64 78 57 72 69 74 65 72 29 20 2a 20 6e 4c  lidxWriter) * nL
1be10 76 6c 0a 20 20 20 20 29 3b 0a 20 20 20 20 69 66  vl.    );.    if
1be20 28 20 61 44 6c 69 64 78 3d 3d 30 20 29 7b 0a 20  ( aDlidx==0 ){. 
1be30 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c       p->rc = SQL
1be40 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d  ITE_NOMEM;.    }
1be50 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20  else{.      int 
1be60 6e 42 79 74 65 20 3d 20 73 69 7a 65 6f 66 28 46  nByte = sizeof(F
1be70 74 73 35 44 6c 69 64 78 57 72 69 74 65 72 29 20  ts5DlidxWriter) 
1be80 2a 20 28 6e 4c 76 6c 20 2d 20 70 57 72 69 74 65  * (nLvl - pWrite
1be90 72 2d 3e 6e 44 6c 69 64 78 29 3b 0a 20 20 20 20  r->nDlidx);.    
1bea0 20 20 6d 65 6d 73 65 74 28 26 61 44 6c 69 64 78    memset(&aDlidx
1beb0 5b 70 57 72 69 74 65 72 2d 3e 6e 44 6c 69 64 78  [pWriter->nDlidx
1bec0 5d 2c 20 30 2c 20 6e 42 79 74 65 29 3b 0a 20 20  ], 0, nByte);.  
1bed0 20 20 20 20 70 57 72 69 74 65 72 2d 3e 61 44 6c      pWriter->aDl
1bee0 69 64 78 20 3d 20 61 44 6c 69 64 78 3b 0a 20 20  idx = aDlidx;.  
1bef0 20 20 20 20 70 57 72 69 74 65 72 2d 3e 6e 44 6c      pWriter->nDl
1bf00 69 64 78 20 3d 20 6e 4c 76 6c 3b 0a 20 20 20 20  idx = nLvl;.    
1bf10 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  }.  }.  return p
1bf20 2d 3e 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  ->rc;.}../*.** I
1bf30 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 64 6f  f the current do
1bf40 63 6c 69 73 74 2d 69 6e 64 65 78 20 61 63 63 75  clist-index accu
1bf50 6d 75 6c 61 74 69 6e 67 20 69 6e 20 70 57 72 69  mulating in pWri
1bf60 74 65 72 2d 3e 61 44 6c 69 64 78 5b 5d 20 69 73  ter->aDlidx[] is
1bf70 20 6c 61 72 67 65 0a 2a 2a 20 65 6e 6f 75 67 68   large.** enough
1bf80 2c 20 66 6c 75 73 68 20 69 74 20 74 6f 20 64 69  , flush it to di
1bf90 73 6b 20 61 6e 64 20 72 65 74 75 72 6e 20 31 2e  sk and return 1.
1bfa0 20 4f 74 68 65 72 77 69 73 65 20 64 69 73 63 61   Otherwise disca
1bfb0 72 64 20 69 74 20 61 6e 64 20 72 65 74 75 72 6e  rd it and return
1bfc0 0a 2a 2a 20 7a 65 72 6f 2e 0a 2a 2f 0a 73 74 61  .** zero..*/.sta
1bfd0 74 69 63 20 69 6e 74 20 66 74 73 35 57 72 69 74  tic int fts5Writ
1bfe0 65 46 6c 75 73 68 44 6c 69 64 78 28 46 74 73 35  eFlushDlidx(Fts5
1bff0 49 6e 64 65 78 20 2a 70 2c 20 46 74 73 35 53 65  Index *p, Fts5Se
1c000 67 57 72 69 74 65 72 20 2a 70 57 72 69 74 65 72  gWriter *pWriter
1c010 29 7b 0a 20 20 69 6e 74 20 62 46 6c 61 67 20 3d  ){.  int bFlag =
1c020 20 30 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65   0;..  /* If the
1c030 72 65 20 77 65 72 65 20 46 54 53 35 5f 4d 49 4e  re were FTS5_MIN
1c040 5f 44 4c 49 44 58 5f 53 49 5a 45 20 6f 72 20 6d  _DLIDX_SIZE or m
1c050 6f 72 65 20 65 6d 70 74 79 20 6c 65 61 66 20 70  ore empty leaf p
1c060 61 67 65 73 20 77 72 69 74 74 65 6e 0a 20 20 2a  ages written.  *
1c070 2a 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  * to the databas
1c080 65 2c 20 61 6c 73 6f 20 77 72 69 74 65 20 74 68  e, also write th
1c090 65 20 64 6f 63 6c 69 73 74 2d 69 6e 64 65 78 20  e doclist-index 
1c0a0 74 6f 20 64 69 73 6b 2e 20 20 2a 2f 0a 20 20 69  to disk.  */.  i
1c0b0 66 28 20 70 57 72 69 74 65 72 2d 3e 61 44 6c 69  f( pWriter->aDli
1c0c0 64 78 5b 30 5d 2e 62 75 66 2e 6e 3e 30 20 26 26  dx[0].buf.n>0 &&
1c0d0 20 70 57 72 69 74 65 72 2d 3e 6e 45 6d 70 74 79   pWriter->nEmpty
1c0e0 3e 3d 46 54 53 35 5f 4d 49 4e 5f 44 4c 49 44 58  >=FTS5_MIN_DLIDX
1c0f0 5f 53 49 5a 45 20 29 7b 0a 20 20 20 20 62 46 6c  _SIZE ){.    bFl
1c100 61 67 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 66 74  ag = 1;.  }.  ft
1c110 73 35 57 72 69 74 65 44 6c 69 64 78 43 6c 65 61  s5WriteDlidxClea
1c120 72 28 70 2c 20 70 57 72 69 74 65 72 2c 20 62 46  r(p, pWriter, bF
1c130 6c 61 67 29 3b 0a 20 20 70 57 72 69 74 65 72 2d  lag);.  pWriter-
1c140 3e 6e 45 6d 70 74 79 20 3d 20 30 3b 0a 20 20 72  >nEmpty = 0;.  r
1c150 65 74 75 72 6e 20 62 46 6c 61 67 3b 0a 7d 0a 0a  eturn bFlag;.}..
1c160 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
1c170 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 77 68  ion is called wh
1c180 65 6e 65 76 65 72 20 70 72 6f 63 65 73 73 69 6e  enever processin
1c190 67 20 6f 66 20 74 68 65 20 64 6f 63 6c 69 73 74  g of the doclist
1c1a0 20 66 6f 72 20 74 68 65 20 0a 2a 2a 20 6c 61 73   for the .** las
1c1b0 74 20 74 65 72 6d 20 6f 6e 20 6c 65 61 66 20 70  t term on leaf p
1c1c0 61 67 65 20 28 70 57 72 69 74 65 72 2d 3e 69 42  age (pWriter->iB
1c1d0 74 50 61 67 65 29 20 69 73 20 63 6f 6d 70 6c 65  tPage) is comple
1c1e0 74 65 64 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ted. .**.** The 
1c1f0 64 6f 63 6c 69 73 74 2d 69 6e 64 65 78 20 66 6f  doclist-index fo
1c200 72 20 74 68 61 74 20 74 65 72 6d 20 69 73 20 63  r that term is c
1c210 75 72 72 65 6e 74 6c 79 20 73 74 6f 72 65 64 20  urrently stored 
1c220 69 6e 2d 6d 65 6d 6f 72 79 20 77 69 74 68 69 6e  in-memory within
1c230 20 74 68 65 0a 2a 2a 20 46 74 73 35 53 65 67 57   the.** Fts5SegW
1c240 72 69 74 65 72 2e 61 44 6c 69 64 78 5b 5d 20 61  riter.aDlidx[] a
1c250 72 72 61 79 2e 20 49 66 20 69 74 20 69 73 20 6c  rray. If it is l
1c260 61 72 67 65 20 65 6e 6f 75 67 68 2c 20 74 68 69  arge enough, thi
1c270 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 77 72  s function.** wr
1c280 69 74 65 73 20 69 74 20 6f 75 74 20 74 6f 20 64  ites it out to d
1c290 69 73 6b 2e 20 4f 72 2c 20 69 66 20 69 74 20 69  isk. Or, if it i
1c2a0 73 20 74 6f 6f 20 73 6d 61 6c 6c 20 74 6f 20 62  s too small to b
1c2b0 6f 74 68 65 72 20 77 69 74 68 2c 20 64 69 73 63  other with, disc
1c2c0 61 72 64 73 0a 2a 2a 20 69 74 2e 0a 2a 2a 0a 2a  ards.** it..**.*
1c2d0 2a 20 46 74 73 35 53 65 67 57 72 69 74 65 72 2e  * Fts5SegWriter.
1c2e0 62 74 74 65 72 6d 20 63 75 72 72 65 6e 74 6c 79  btterm currently
1c2f0 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 66 69   contains the fi
1c300 72 73 74 20 74 65 72 6d 20 6f 6e 20 70 61 67 65  rst term on page
1c310 20 69 42 74 50 61 67 65 2e 0a 2a 2f 0a 73 74 61   iBtPage..*/.sta
1c320 74 69 63 20 76 6f 69 64 20 66 74 73 35 57 72 69  tic void fts5Wri
1c330 74 65 46 6c 75 73 68 42 74 72 65 65 28 46 74 73  teFlushBtree(Fts
1c340 35 49 6e 64 65 78 20 2a 70 2c 20 46 74 73 35 53  5Index *p, Fts5S
1c350 65 67 57 72 69 74 65 72 20 2a 70 57 72 69 74 65  egWriter *pWrite
1c360 72 29 7b 0a 20 20 69 6e 74 20 62 46 6c 61 67 3b  r){.  int bFlag;
1c370 0a 0a 20 20 61 73 73 65 72 74 28 20 70 57 72 69  ..  assert( pWri
1c380 74 65 72 2d 3e 69 42 74 50 61 67 65 20 7c 7c 20  ter->iBtPage || 
1c390 70 57 72 69 74 65 72 2d 3e 6e 45 6d 70 74 79 3d  pWriter->nEmpty=
1c3a0 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 57 72 69  =0 );.  if( pWri
1c3b0 74 65 72 2d 3e 69 42 74 50 61 67 65 3d 3d 30 20  ter->iBtPage==0 
1c3c0 29 20 72 65 74 75 72 6e 3b 0a 20 20 62 46 6c 61  ) return;.  bFla
1c3d0 67 20 3d 20 66 74 73 35 57 72 69 74 65 46 6c 75  g = fts5WriteFlu
1c3e0 73 68 44 6c 69 64 78 28 70 2c 20 70 57 72 69 74  shDlidx(p, pWrit
1c3f0 65 72 29 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 72  er);..  if( p->r
1c400 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
1c410 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
1c420 7a 20 3d 20 28 70 57 72 69 74 65 72 2d 3e 62 74  z = (pWriter->bt
1c430 74 65 72 6d 2e 6e 3e 30 3f 28 63 6f 6e 73 74 20  term.n>0?(const 
1c440 63 68 61 72 2a 29 70 57 72 69 74 65 72 2d 3e 62  char*)pWriter->b
1c450 74 74 65 72 6d 2e 70 3a 22 22 29 3b 0a 20 20 20  tterm.p:"");.   
1c460 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e   /* The followin
1c470 67 20 77 61 73 20 61 6c 72 65 61 64 79 20 64 6f  g was already do
1c480 6e 65 20 69 6e 20 66 74 73 35 57 72 69 74 65 49  ne in fts5WriteI
1c490 6e 69 74 28 29 3a 20 2a 2f 0a 20 20 20 20 2f 2a  nit(): */.    /*
1c4a0 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e   sqlite3_bind_in
1c4b0 74 28 70 2d 3e 70 49 64 78 57 72 69 74 65 72 2c  t(p->pIdxWriter,
1c4c0 20 31 2c 20 70 57 72 69 74 65 72 2d 3e 69 53 65   1, pWriter->iSe
1c4d0 67 69 64 29 3b 20 2a 2f 0a 20 20 20 20 73 71 6c  gid); */.    sql
1c4e0 69 74 65 33 5f 62 69 6e 64 5f 62 6c 6f 62 28 70  ite3_bind_blob(p
1c4f0 2d 3e 70 49 64 78 57 72 69 74 65 72 2c 20 32 2c  ->pIdxWriter, 2,
1c500 20 7a 2c 20 70 57 72 69 74 65 72 2d 3e 62 74 74   z, pWriter->btt
1c510 65 72 6d 2e 6e 2c 20 53 51 4c 49 54 45 5f 53 54  erm.n, SQLITE_ST
1c520 41 54 49 43 29 3b 0a 20 20 20 20 73 71 6c 69 74  ATIC);.    sqlit
1c530 65 33 5f 62 69 6e 64 5f 69 6e 74 36 34 28 70 2d  e3_bind_int64(p-
1c540 3e 70 49 64 78 57 72 69 74 65 72 2c 20 33 2c 20  >pIdxWriter, 3, 
1c550 62 46 6c 61 67 20 2b 20 28 28 69 36 34 29 70 57  bFlag + ((i64)pW
1c560 72 69 74 65 72 2d 3e 69 42 74 50 61 67 65 3c 3c  riter->iBtPage<<
1c570 31 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  1));.    sqlite3
1c580 5f 73 74 65 70 28 70 2d 3e 70 49 64 78 57 72 69  _step(p->pIdxWri
1c590 74 65 72 29 3b 0a 20 20 20 20 70 2d 3e 72 63 20  ter);.    p->rc 
1c5a0 3d 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28  = sqlite3_reset(
1c5b0 70 2d 3e 70 49 64 78 57 72 69 74 65 72 29 3b 0a  p->pIdxWriter);.
1c5c0 20 20 7d 0a 20 20 70 57 72 69 74 65 72 2d 3e 69    }.  pWriter->i
1c5d0 42 74 50 61 67 65 20 3d 20 30 3b 0a 7d 0a 0a 2f  BtPage = 0;.}../
1c5e0 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 63 61 6c  *.** This is cal
1c5f0 6c 65 64 20 6f 6e 63 65 20 66 6f 72 20 65 61 63  led once for eac
1c600 68 20 6c 65 61 66 20 70 61 67 65 20 65 78 63 65  h leaf page exce
1c610 70 74 20 74 68 65 20 66 69 72 73 74 20 74 68 61  pt the first tha
1c620 74 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20 61 74  t contains.** at
1c630 20 6c 65 61 73 74 20 6f 6e 65 20 74 65 72 6d 2e   least one term.
1c640 20 41 72 67 75 6d 65 6e 74 20 28 6e 54 65 72 6d   Argument (nTerm
1c650 2f 70 54 65 72 6d 29 20 69 73 20 74 68 65 20 73  /pTerm) is the s
1c660 70 6c 69 74 2d 6b 65 79 20 2d 20 61 20 74 65 72  plit-key - a ter
1c670 6d 20 74 68 61 74 0a 2a 2a 20 69 73 20 6c 61 72  m that.** is lar
1c680 67 65 72 20 74 68 61 6e 20 61 6c 6c 20 74 65 72  ger than all ter
1c690 6d 73 20 77 72 69 74 74 65 6e 20 74 6f 20 65 61  ms written to ea
1c6a0 72 6c 69 65 72 20 6c 65 61 76 65 73 2c 20 61 6e  rlier leaves, an
1c6b0 64 20 65 71 75 61 6c 20 74 6f 20 6f 72 0a 2a 2a  d equal to or.**
1c6c0 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 74 68   smaller than th
1c6d0 65 20 66 69 72 73 74 20 74 65 72 6d 20 6f 6e 20  e first term on 
1c6e0 74 68 65 20 6e 65 77 20 6c 65 61 66 2e 0a 2a 2a  the new leaf..**
1c6f0 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20  .** If an error 
1c700 6f 63 63 75 72 73 2c 20 61 6e 20 65 72 72 6f 72  occurs, an error
1c710 20 63 6f 64 65 20 69 73 20 6c 65 66 74 20 69 6e   code is left in
1c720 20 46 74 73 35 49 6e 64 65 78 2e 72 63 2e 20 49   Fts5Index.rc. I
1c730 66 20 61 6e 20 65 72 72 6f 72 0a 2a 2a 20 68 61  f an error.** ha
1c740 73 20 61 6c 72 65 61 64 79 20 6f 63 63 75 72 72  s already occurr
1c750 65 64 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e  ed when this fun
1c760 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c  ction is called,
1c770 20 69 74 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a   it is a no-op..
1c780 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
1c790 74 73 35 57 72 69 74 65 42 74 72 65 65 54 65 72  ts5WriteBtreeTer
1c7a0 6d 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a  m(.  Fts5Index *
1c7b0 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
1c7c0 20 20 20 20 20 2f 2a 20 46 54 53 35 20 62 61 63       /* FTS5 bac
1c7d0 6b 65 6e 64 20 6f 62 6a 65 63 74 20 2a 2f 0a 20  kend object */. 
1c7e0 20 46 74 73 35 53 65 67 57 72 69 74 65 72 20 2a   Fts5SegWriter *
1c7f0 70 57 72 69 74 65 72 2c 20 20 20 20 20 20 20 20  pWriter,        
1c800 20 2f 2a 20 57 72 69 74 65 72 20 6f 62 6a 65 63   /* Writer objec
1c810 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 54 65 72 6d  t */.  int nTerm
1c820 2c 20 63 6f 6e 73 74 20 75 38 20 2a 70 54 65 72  , const u8 *pTer
1c830 6d 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20  m      /* First 
1c840 74 65 72 6d 20 6f 6e 20 6e 65 77 20 70 61 67 65  term on new page
1c850 20 2a 2f 0a 29 7b 0a 20 20 66 74 73 35 57 72 69   */.){.  fts5Wri
1c860 74 65 46 6c 75 73 68 42 74 72 65 65 28 70 2c 20  teFlushBtree(p, 
1c870 70 57 72 69 74 65 72 29 3b 0a 20 20 66 74 73 35  pWriter);.  fts5
1c880 42 75 66 66 65 72 53 65 74 28 26 70 2d 3e 72 63  BufferSet(&p->rc
1c890 2c 20 26 70 57 72 69 74 65 72 2d 3e 62 74 74 65  , &pWriter->btte
1c8a0 72 6d 2c 20 6e 54 65 72 6d 2c 20 70 54 65 72 6d  rm, nTerm, pTerm
1c8b0 29 3b 0a 20 20 70 57 72 69 74 65 72 2d 3e 69 42  );.  pWriter->iB
1c8c0 74 50 61 67 65 20 3d 20 70 57 72 69 74 65 72 2d  tPage = pWriter-
1c8d0 3e 77 72 69 74 65 72 2e 70 67 6e 6f 3b 0a 7d 0a  >writer.pgno;.}.
1c8e0 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
1c8f0 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 77  tion is called w
1c900 68 65 6e 20 66 6c 75 73 68 69 6e 67 20 61 20 6c  hen flushing a l
1c910 65 61 66 20 70 61 67 65 20 74 68 61 74 20 63 6f  eaf page that co
1c920 6e 74 61 69 6e 73 20 6e 6f 0a 2a 2a 20 74 65 72  ntains no.** ter
1c930 6d 73 20 61 74 20 61 6c 6c 20 74 6f 20 64 69 73  ms at all to dis
1c940 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  k..*/.static voi
1c950 64 20 66 74 73 35 57 72 69 74 65 42 74 72 65 65  d fts5WriteBtree
1c960 4e 6f 54 65 72 6d 28 0a 20 20 46 74 73 35 49 6e  NoTerm(.  Fts5In
1c970 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20 20  dex *p,         
1c980 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53            /* FTS
1c990 35 20 62 61 63 6b 65 6e 64 20 6f 62 6a 65 63 74  5 backend object
1c9a0 20 2a 2f 0a 20 20 46 74 73 35 53 65 67 57 72 69   */.  Fts5SegWri
1c9b0 74 65 72 20 2a 70 57 72 69 74 65 72 20 20 20 20  ter *pWriter    
1c9c0 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 72 20        /* Writer 
1c9d0 6f 62 6a 65 63 74 20 2a 2f 0a 29 7b 0a 20 20 2f  object */.){.  /
1c9e0 2a 20 49 66 20 74 68 65 72 65 20 77 65 72 65 20  * If there were 
1c9f0 6e 6f 20 72 6f 77 69 64 73 20 6f 6e 20 74 68 65  no rowids on the
1ca00 20 6c 65 61 66 20 70 61 67 65 20 65 69 74 68 65   leaf page eithe
1ca10 72 20 61 6e 64 20 74 68 65 20 64 6f 63 6c 69 73  r and the doclis
1ca20 74 2d 69 6e 64 65 78 0a 20 20 2a 2a 20 68 61 73  t-index.  ** has
1ca30 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 73 74   already been st
1ca40 61 72 74 65 64 2c 20 61 70 70 65 6e 64 20 61 6e  arted, append an
1ca50 20 30 78 30 30 20 62 79 74 65 20 74 6f 20 69 74   0x00 byte to it
1ca60 2e 20 20 2a 2f 0a 20 20 69 66 28 20 70 57 72 69  .  */.  if( pWri
1ca70 74 65 72 2d 3e 62 46 69 72 73 74 52 6f 77 69 64  ter->bFirstRowid
1ca80 49 6e 50 61 67 65 20 26 26 20 70 57 72 69 74 65  InPage && pWrite
1ca90 72 2d 3e 61 44 6c 69 64 78 5b 30 5d 2e 62 75 66  r->aDlidx[0].buf
1caa0 2e 6e 3e 30 20 29 7b 0a 20 20 20 20 46 74 73 35  .n>0 ){.    Fts5
1cab0 44 6c 69 64 78 57 72 69 74 65 72 20 2a 70 44 6c  DlidxWriter *pDl
1cac0 69 64 78 20 3d 20 26 70 57 72 69 74 65 72 2d 3e  idx = &pWriter->
1cad0 61 44 6c 69 64 78 5b 30 5d 3b 0a 20 20 20 20 61  aDlidx[0];.    a
1cae0 73 73 65 72 74 28 20 70 44 6c 69 64 78 2d 3e 62  ssert( pDlidx->b
1caf0 50 72 65 76 56 61 6c 69 64 20 29 3b 0a 20 20 20  PrevValid );.   
1cb00 20 73 71 6c 69 74 65 33 46 74 73 35 42 75 66 66   sqlite3Fts5Buff
1cb10 65 72 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26  erAppendVarint(&
1cb20 70 2d 3e 72 63 2c 20 26 70 44 6c 69 64 78 2d 3e  p->rc, &pDlidx->
1cb30 62 75 66 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20 20  buf, 0);.  }..  
1cb40 2f 2a 20 49 6e 63 72 65 6d 65 6e 74 20 74 68 65  /* Increment the
1cb50 20 22 6e 75 6d 62 65 72 20 6f 66 20 73 65 71 75   "number of sequ
1cb60 65 6e 74 69 61 6c 20 6c 65 61 76 65 73 20 77 69  ential leaves wi
1cb70 74 68 6f 75 74 20 61 20 74 65 72 6d 22 20 63 6f  thout a term" co
1cb80 75 6e 74 65 72 2e 20 2a 2f 0a 20 20 70 57 72 69  unter. */.  pWri
1cb90 74 65 72 2d 3e 6e 45 6d 70 74 79 2b 2b 3b 0a 7d  ter->nEmpty++;.}
1cba0 0a 0a 73 74 61 74 69 63 20 69 36 34 20 66 74 73  ..static i64 fts
1cbb0 35 44 6c 69 64 78 45 78 74 72 61 63 74 46 69 72  5DlidxExtractFir
1cbc0 73 74 52 6f 77 69 64 28 46 74 73 35 42 75 66 66  stRowid(Fts5Buff
1cbd0 65 72 20 2a 70 42 75 66 29 7b 0a 20 20 69 36 34  er *pBuf){.  i64
1cbe0 20 69 52 6f 77 69 64 3b 0a 20 20 69 6e 74 20 69   iRowid;.  int i
1cbf0 4f 66 66 3b 0a 0a 20 20 69 4f 66 66 20 3d 20 31  Off;..  iOff = 1
1cc00 20 2b 20 66 74 73 35 47 65 74 56 61 72 69 6e 74   + fts5GetVarint
1cc10 28 26 70 42 75 66 2d 3e 70 5b 31 5d 2c 20 28 75  (&pBuf->p[1], (u
1cc20 36 34 2a 29 26 69 52 6f 77 69 64 29 3b 0a 20 20  64*)&iRowid);.  
1cc30 66 74 73 35 47 65 74 56 61 72 69 6e 74 28 26 70  fts5GetVarint(&p
1cc40 42 75 66 2d 3e 70 5b 69 4f 66 66 5d 2c 20 28 75  Buf->p[iOff], (u
1cc50 36 34 2a 29 26 69 52 6f 77 69 64 29 3b 0a 20 20  64*)&iRowid);.  
1cc60 72 65 74 75 72 6e 20 69 52 6f 77 69 64 3b 0a 7d  return iRowid;.}
1cc70 0a 0a 2f 2a 0a 2a 2a 20 52 6f 77 69 64 20 69 52  ../*.** Rowid iR
1cc80 6f 77 69 64 20 68 61 73 20 6a 75 73 74 20 62 65  owid has just be
1cc90 65 6e 20 61 70 70 65 6e 64 65 64 20 74 6f 20 74  en appended to t
1cca0 68 65 20 63 75 72 72 65 6e 74 20 6c 65 61 66 20  he current leaf 
1ccb0 70 61 67 65 2e 20 49 74 20 69 73 20 74 68 65 0a  page. It is the.
1ccc0 2a 2a 20 66 69 72 73 74 20 6f 6e 20 74 68 65 20  ** first on the 
1ccd0 70 61 67 65 2e 20 54 68 69 73 20 66 75 6e 63 74  page. This funct
1cce0 69 6f 6e 20 61 70 70 65 6e 64 73 20 61 6e 20 61  ion appends an a
1ccf0 70 70 72 6f 70 72 69 61 74 65 20 65 6e 74 72 79  ppropriate entry
1cd00 20 74 6f 20 74 68 65 20 63 75 72 72 65 6e 74 0a   to the current.
1cd10 2a 2a 20 64 6f 63 6c 69 73 74 2d 69 6e 64 65 78  ** doclist-index
1cd20 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
1cd30 20 66 74 73 35 57 72 69 74 65 44 6c 69 64 78 41   fts5WriteDlidxA
1cd40 70 70 65 6e 64 28 0a 20 20 46 74 73 35 49 6e 64  ppend(.  Fts5Ind
1cd50 65 78 20 2a 70 2c 20 0a 20 20 46 74 73 35 53 65  ex *p, .  Fts5Se
1cd60 67 57 72 69 74 65 72 20 2a 70 57 72 69 74 65 72  gWriter *pWriter
1cd70 2c 20 0a 20 20 69 36 34 20 69 52 6f 77 69 64 0a  , .  i64 iRowid.
1cd80 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e  ){.  int i;.  in
1cd90 74 20 62 44 6f 6e 65 20 3d 20 30 3b 0a 0a 20 20  t bDone = 0;..  
1cda0 66 6f 72 28 69 3d 30 3b 20 70 2d 3e 72 63 3d 3d  for(i=0; p->rc==
1cdb0 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 62 44 6f  SQLITE_OK && bDo
1cdc0 6e 65 3d 3d 30 3b 20 69 2b 2b 29 7b 0a 20 20 20  ne==0; i++){.   
1cdd0 20 69 36 34 20 69 56 61 6c 3b 0a 20 20 20 20 46   i64 iVal;.    F
1cde0 74 73 35 44 6c 69 64 78 57 72 69 74 65 72 20 2a  ts5DlidxWriter *
1cdf0 70 44 6c 69 64 78 20 3d 20 26 70 57 72 69 74 65  pDlidx = &pWrite
1ce00 72 2d 3e 61 44 6c 69 64 78 5b 69 5d 3b 0a 0a 20  r->aDlidx[i];.. 
1ce10 20 20 20 69 66 28 20 70 44 6c 69 64 78 2d 3e 62     if( pDlidx->b
1ce20 75 66 2e 6e 3e 3d 70 2d 3e 70 43 6f 6e 66 69 67  uf.n>=p->pConfig
1ce30 2d 3e 70 67 73 7a 20 29 7b 0a 20 20 20 20 20 20  ->pgsz ){.      
1ce40 2f 2a 20 54 68 65 20 63 75 72 72 65 6e 74 20 64  /* The current d
1ce50 6f 63 6c 69 73 74 2d 69 6e 64 65 78 20 70 61 67  oclist-index pag
1ce60 65 20 69 73 20 66 75 6c 6c 2e 20 57 72 69 74 65  e is full. Write
1ce70 20 69 74 20 74 6f 20 64 69 73 6b 20 61 6e 64 20   it to disk and 
1ce80 70 75 73 68 0a 20 20 20 20 20 20 2a 2a 20 61 20  push.      ** a 
1ce90 63 6f 70 79 20 6f 66 20 69 52 6f 77 69 64 20 28  copy of iRowid (
1cea0 77 68 69 63 68 20 77 69 6c 6c 20 62 65 63 6f 6d  which will becom
1ceb0 65 20 74 68 65 20 66 69 72 73 74 20 72 6f 77 69  e the first rowi
1cec0 64 20 6f 6e 20 74 68 65 20 6e 65 78 74 0a 20 20  d on the next.  
1ced0 20 20 20 20 2a 2a 20 64 6f 63 6c 69 73 74 2d 69      ** doclist-i
1cee0 6e 64 65 78 20 6c 65 61 66 20 70 61 67 65 29 20  ndex leaf page) 
1cef0 75 70 20 69 6e 74 6f 20 74 68 65 20 6e 65 78 74  up into the next
1cf00 20 6c 65 76 65 6c 20 6f 66 20 74 68 65 20 62 2d   level of the b-
1cf10 74 72 65 65 20 0a 20 20 20 20 20 20 2a 2a 20 68  tree .      ** h
1cf20 69 65 72 61 72 63 68 79 2e 20 49 66 20 74 68 65  ierarchy. If the
1cf30 20 6e 6f 64 65 20 62 65 69 6e 67 20 66 6c 75 73   node being flus
1cf40 68 65 64 20 69 73 20 63 75 72 72 65 6e 74 6c 79  hed is currently
1cf50 20 74 68 65 20 72 6f 6f 74 20 6e 6f 64 65 2c 0a   the root node,.
1cf60 20 20 20 20 20 20 2a 2a 20 61 6c 73 6f 20 70 75        ** also pu
1cf70 73 68 20 69 74 73 20 66 69 72 73 74 20 72 6f 77  sh its first row
1cf80 69 64 20 75 70 77 61 72 64 73 2e 20 2a 2f 0a 20  id upwards. */. 
1cf90 20 20 20 20 20 70 44 6c 69 64 78 2d 3e 62 75 66       pDlidx->buf
1cfa0 2e 70 5b 30 5d 20 3d 20 30 78 30 31 3b 20 20 20  .p[0] = 0x01;   
1cfb0 20 2f 2a 20 4e 6f 74 20 74 68 65 20 72 6f 6f 74   /* Not the root
1cfc0 20 6e 6f 64 65 20 2a 2f 0a 20 20 20 20 20 20 66   node */.      f
1cfd0 74 73 35 44 61 74 61 57 72 69 74 65 28 70 2c 20  ts5DataWrite(p, 
1cfe0 0a 20 20 20 20 20 20 20 20 20 20 46 54 53 35 5f  .          FTS5_
1cff0 44 4c 49 44 58 5f 52 4f 57 49 44 28 70 57 72 69  DLIDX_ROWID(pWri
1d000 74 65 72 2d 3e 69 53 65 67 69 64 2c 20 69 2c 20  ter->iSegid, i, 
1d010 70 44 6c 69 64 78 2d 3e 70 67 6e 6f 29 2c 0a 20  pDlidx->pgno),. 
1d020 20 20 20 20 20 20 20 20 20 70 44 6c 69 64 78 2d           pDlidx-
1d030 3e 62 75 66 2e 70 2c 20 70 44 6c 69 64 78 2d 3e  >buf.p, pDlidx->
1d040 62 75 66 2e 6e 0a 20 20 20 20 20 20 29 3b 0a 20  buf.n.      );. 
1d050 20 20 20 20 20 66 74 73 35 57 72 69 74 65 44 6c       fts5WriteDl
1d060 69 64 78 47 72 6f 77 28 70 2c 20 70 57 72 69 74  idxGrow(p, pWrit
1d070 65 72 2c 20 69 2b 32 29 3b 0a 20 20 20 20 20 20  er, i+2);.      
1d080 70 44 6c 69 64 78 20 3d 20 26 70 57 72 69 74 65  pDlidx = &pWrite
1d090 72 2d 3e 61 44 6c 69 64 78 5b 69 5d 3b 0a 20 20  r->aDlidx[i];.  
1d0a0 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53      if( p->rc==S
1d0b0 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 44 6c 69  QLITE_OK && pDli
1d0c0 64 78 5b 31 5d 2e 62 75 66 2e 6e 3d 3d 30 20 29  dx[1].buf.n==0 )
1d0d0 7b 0a 20 20 20 20 20 20 20 20 69 36 34 20 69 46  {.        i64 iF
1d0e0 69 72 73 74 20 3d 20 66 74 73 35 44 6c 69 64 78  irst = fts5Dlidx
1d0f0 45 78 74 72 61 63 74 46 69 72 73 74 52 6f 77 69  ExtractFirstRowi
1d100 64 28 26 70 44 6c 69 64 78 2d 3e 62 75 66 29 3b  d(&pDlidx->buf);
1d110 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69  ..        /* Thi
1d120 73 20 77 61 73 20 74 68 65 20 72 6f 6f 74 20 6e  s was the root n
1d130 6f 64 65 2e 20 50 75 73 68 20 69 74 73 20 66 69  ode. Push its fi
1d140 72 73 74 20 72 6f 77 69 64 20 75 70 20 74 6f 20  rst rowid up to 
1d150 74 68 65 20 6e 65 77 20 72 6f 6f 74 2e 20 2a 2f  the new root. */
1d160 0a 20 20 20 20 20 20 20 20 70 44 6c 69 64 78 5b  .        pDlidx[
1d170 31 5d 2e 70 67 6e 6f 20 3d 20 70 44 6c 69 64 78  1].pgno = pDlidx
1d180 2d 3e 70 67 6e 6f 3b 0a 20 20 20 20 20 20 20 20  ->pgno;.        
1d190 73 71 6c 69 74 65 33 46 74 73 35 42 75 66 66 65  sqlite3Fts5Buffe
1d1a0 72 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26 70  rAppendVarint(&p
1d1b0 2d 3e 72 63 2c 20 26 70 44 6c 69 64 78 5b 31 5d  ->rc, &pDlidx[1]
1d1c0 2e 62 75 66 2c 20 30 29 3b 0a 20 20 20 20 20 20  .buf, 0);.      
1d1d0 20 20 73 71 6c 69 74 65 33 46 74 73 35 42 75 66    sqlite3Fts5Buf
1d1e0 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e 74 28  ferAppendVarint(
1d1f0 26 70 2d 3e 72 63 2c 20 26 70 44 6c 69 64 78 5b  &p->rc, &pDlidx[
1d200 31 5d 2e 62 75 66 2c 20 70 44 6c 69 64 78 2d 3e  1].buf, pDlidx->
1d210 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 73  pgno);.        s
1d220 71 6c 69 74 65 33 46 74 73 35 42 75 66 66 65 72  qlite3Fts5Buffer
1d230 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26 70 2d  AppendVarint(&p-
1d240 3e 72 63 2c 20 26 70 44 6c 69 64 78 5b 31 5d 2e  >rc, &pDlidx[1].
1d250 62 75 66 2c 20 69 46 69 72 73 74 29 3b 0a 20 20  buf, iFirst);.  
1d260 20 20 20 20 20 20 70 44 6c 69 64 78 5b 31 5d 2e        pDlidx[1].
1d270 62 50 72 65 76 56 61 6c 69 64 20 3d 20 31 3b 0a  bPrevValid = 1;.
1d280 20 20 20 20 20 20 20 20 70 44 6c 69 64 78 5b 31          pDlidx[1
1d290 5d 2e 69 50 72 65 76 20 3d 20 69 46 69 72 73 74  ].iPrev = iFirst
1d2a0 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
1d2b0 20 73 71 6c 69 74 65 33 46 74 73 35 42 75 66 66   sqlite3Fts5Buff
1d2c0 65 72 5a 65 72 6f 28 26 70 44 6c 69 64 78 2d 3e  erZero(&pDlidx->
1d2d0 62 75 66 29 3b 0a 20 20 20 20 20 20 70 44 6c 69  buf);.      pDli
1d2e0 64 78 2d 3e 62 50 72 65 76 56 61 6c 69 64 20 3d  dx->bPrevValid =
1d2f0 20 30 3b 0a 20 20 20 20 20 20 70 44 6c 69 64 78   0;.      pDlidx
1d300 2d 3e 70 67 6e 6f 2b 2b 3b 0a 20 20 20 20 7d 65  ->pgno++;.    }e
1d310 6c 73 65 7b 0a 20 20 20 20 20 20 62 44 6f 6e 65  lse{.      bDone
1d320 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20   = 1;.    }..   
1d330 20 69 66 28 20 70 44 6c 69 64 78 2d 3e 62 50 72   if( pDlidx->bPr
1d340 65 76 56 61 6c 69 64 20 29 7b 0a 20 20 20 20 20  evValid ){.     
1d350 20 69 56 61 6c 20 3d 20 69 52 6f 77 69 64 20 2d   iVal = iRowid -
1d360 20 70 44 6c 69 64 78 2d 3e 69 50 72 65 76 3b 0a   pDlidx->iPrev;.
1d370 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1d380 20 69 36 34 20 69 50 67 6e 6f 20 3d 20 28 69 3d   i64 iPgno = (i=
1d390 3d 30 20 3f 20 70 57 72 69 74 65 72 2d 3e 77 72  =0 ? pWriter->wr
1d3a0 69 74 65 72 2e 70 67 6e 6f 20 3a 20 70 44 6c 69  iter.pgno : pDli
1d3b0 64 78 5b 2d 31 5d 2e 70 67 6e 6f 29 3b 0a 20 20  dx[-1].pgno);.  
1d3c0 20 20 20 20 61 73 73 65 72 74 28 20 70 44 6c 69      assert( pDli
1d3d0 64 78 2d 3e 62 75 66 2e 6e 3d 3d 30 20 29 3b 0a  dx->buf.n==0 );.
1d3e0 20 20 20 20 20 20 73 71 6c 69 74 65 33 46 74 73        sqlite3Fts
1d3f0 35 42 75 66 66 65 72 41 70 70 65 6e 64 56 61 72  5BufferAppendVar
1d400 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26 70 44 6c  int(&p->rc, &pDl
1d410 69 64 78 2d 3e 62 75 66 2c 20 21 62 44 6f 6e 65  idx->buf, !bDone
1d420 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
1d430 46 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64  Fts5BufferAppend
1d440 56 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26  Varint(&p->rc, &
1d450 70 44 6c 69 64 78 2d 3e 62 75 66 2c 20 69 50 67  pDlidx->buf, iPg
1d460 6e 6f 29 3b 0a 20 20 20 20 20 20 69 56 61 6c 20  no);.      iVal 
1d470 3d 20 69 52 6f 77 69 64 3b 0a 20 20 20 20 7d 0a  = iRowid;.    }.
1d480 0a 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35  .    sqlite3Fts5
1d490 42 75 66 66 65 72 41 70 70 65 6e 64 56 61 72 69  BufferAppendVari
1d4a0 6e 74 28 26 70 2d 3e 72 63 2c 20 26 70 44 6c 69  nt(&p->rc, &pDli
1d4b0 64 78 2d 3e 62 75 66 2c 20 69 56 61 6c 29 3b 0a  dx->buf, iVal);.
1d4c0 20 20 20 20 70 44 6c 69 64 78 2d 3e 62 50 72 65      pDlidx->bPre
1d4d0 76 56 61 6c 69 64 20 3d 20 31 3b 0a 20 20 20 20  vValid = 1;.    
1d4e0 70 44 6c 69 64 78 2d 3e 69 50 72 65 76 20 3d 20  pDlidx->iPrev = 
1d4f0 69 52 6f 77 69 64 3b 0a 20 20 7d 0a 7d 0a 0a 73  iRowid;.  }.}..s
1d500 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 57  tatic void fts5W
1d510 72 69 74 65 46 6c 75 73 68 4c 65 61 66 28 46 74  riteFlushLeaf(Ft
1d520 73 35 49 6e 64 65 78 20 2a 70 2c 20 46 74 73 35  s5Index *p, Fts5
1d530 53 65 67 57 72 69 74 65 72 20 2a 70 57 72 69 74  SegWriter *pWrit
1d540 65 72 29 7b 0a 20 20 73 74 61 74 69 63 20 63 6f  er){.  static co
1d550 6e 73 74 20 75 38 20 7a 65 72 6f 5b 5d 20 3d 20  nst u8 zero[] = 
1d560 7b 20 30 78 30 30 2c 20 30 78 30 30 2c 20 30 78  { 0x00, 0x00, 0x
1d570 30 30 2c 20 30 78 30 30 20 7d 3b 0a 20 20 46 74  00, 0x00 };.  Ft
1d580 73 35 50 61 67 65 57 72 69 74 65 72 20 2a 70 50  s5PageWriter *pP
1d590 61 67 65 20 3d 20 26 70 57 72 69 74 65 72 2d 3e  age = &pWriter->
1d5a0 77 72 69 74 65 72 3b 0a 20 20 69 36 34 20 69 52  writer;.  i64 iR
1d5b0 6f 77 69 64 3b 0a 0a 20 20 61 73 73 65 72 74 28  owid;..  assert(
1d5c0 20 28 70 50 61 67 65 2d 3e 70 67 69 64 78 2e 6e   (pPage->pgidx.n
1d5d0 3d 3d 30 29 3d 3d 28 70 57 72 69 74 65 72 2d 3e  ==0)==(pWriter->
1d5e0 62 46 69 72 73 74 54 65 72 6d 49 6e 50 61 67 65  bFirstTermInPage
1d5f0 29 20 29 3b 0a 0a 20 20 2f 2a 20 53 65 74 20 74  ) );..  /* Set t
1d600 68 65 20 73 7a 4c 65 61 66 20 68 65 61 64 65 72  he szLeaf header
1d610 20 66 69 65 6c 64 2e 20 2a 2f 0a 20 20 61 73 73   field. */.  ass
1d620 65 72 74 28 20 30 3d 3d 66 74 73 35 47 65 74 55  ert( 0==fts5GetU
1d630 31 36 28 26 70 50 61 67 65 2d 3e 62 75 66 2e 70  16(&pPage->buf.p
1d640 5b 32 5d 29 20 29 3b 0a 20 20 66 74 73 35 50 75  [2]) );.  fts5Pu
1d650 74 55 31 36 28 26 70 50 61 67 65 2d 3e 62 75 66  tU16(&pPage->buf
1d660 2e 70 5b 32 5d 2c 20 28 75 31 36 29 70 50 61 67  .p[2], (u16)pPag
1d670 65 2d 3e 62 75 66 2e 6e 29 3b 0a 0a 20 20 69 66  e->buf.n);..  if
1d680 28 20 70 57 72 69 74 65 72 2d 3e 62 46 69 72 73  ( pWriter->bFirs
1d690 74 54 65 72 6d 49 6e 50 61 67 65 20 29 7b 0a 20  tTermInPage ){. 
1d6a0 20 20 20 2f 2a 20 4e 6f 20 74 65 72 6d 20 77 61     /* No term wa
1d6b0 73 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 69  s written to thi
1d6c0 73 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20 61  s page. */.    a
1d6d0 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70 67  ssert( pPage->pg
1d6e0 69 64 78 2e 6e 3d 3d 30 20 29 3b 0a 20 20 20 20  idx.n==0 );.    
1d6f0 66 74 73 35 57 72 69 74 65 42 74 72 65 65 4e 6f  fts5WriteBtreeNo
1d700 54 65 72 6d 28 70 2c 20 70 57 72 69 74 65 72 29  Term(p, pWriter)
1d710 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  ;.  }else{.    /
1d720 2a 20 41 70 70 65 6e 64 20 74 68 65 20 70 67 69  * Append the pgi
1d730 64 78 20 74 6f 20 74 68 65 20 70 61 67 65 20 62  dx to the page b
1d740 75 66 66 65 72 2e 20 53 65 74 20 74 68 65 20 73  uffer. Set the s
1d750 7a 4c 65 61 66 20 68 65 61 64 65 72 20 66 69 65  zLeaf header fie
1d760 6c 64 2e 20 2a 2f 0a 20 20 20 20 66 74 73 35 42  ld. */.    fts5B
1d770 75 66 66 65 72 41 70 70 65 6e 64 42 6c 6f 62 28  ufferAppendBlob(
1d780 26 70 2d 3e 72 63 2c 20 26 70 50 61 67 65 2d 3e  &p->rc, &pPage->
1d790 62 75 66 2c 20 70 50 61 67 65 2d 3e 70 67 69 64  buf, pPage->pgid
1d7a0 78 2e 6e 2c 20 70 50 61 67 65 2d 3e 70 67 69 64  x.n, pPage->pgid
1d7b0 78 2e 70 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  x.p);.  }..  /* 
1d7c0 57 72 69 74 65 20 74 68 65 20 70 61 67 65 20 6f  Write the page o
1d7d0 75 74 20 74 6f 20 64 69 73 6b 20 2a 2f 0a 20 20  ut to disk */.  
1d7e0 69 52 6f 77 69 64 20 3d 20 46 54 53 35 5f 53 45  iRowid = FTS5_SE
1d7f0 47 4d 45 4e 54 5f 52 4f 57 49 44 28 70 57 72 69  GMENT_ROWID(pWri
1d800 74 65 72 2d 3e 69 53 65 67 69 64 2c 20 70 50 61  ter->iSegid, pPa
1d810 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20 20 66 74 73  ge->pgno);.  fts
1d820 35 44 61 74 61 57 72 69 74 65 28 70 2c 20 69 52  5DataWrite(p, iR
1d830 6f 77 69 64 2c 20 70 50 61 67 65 2d 3e 62 75 66  owid, pPage->buf
1d840 2e 70 2c 20 70 50 61 67 65 2d 3e 62 75 66 2e 6e  .p, pPage->buf.n
1d850 29 3b 0a 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c  );..  /* Initial
1d860 69 7a 65 20 74 68 65 20 6e 65 78 74 20 70 61 67  ize the next pag
1d870 65 2e 20 2a 2f 0a 20 20 66 74 73 35 42 75 66 66  e. */.  fts5Buff
1d880 65 72 5a 65 72 6f 28 26 70 50 61 67 65 2d 3e 62  erZero(&pPage->b
1d890 75 66 29 3b 0a 20 20 66 74 73 35 42 75 66 66 65  uf);.  fts5Buffe
1d8a0 72 5a 65 72 6f 28 26 70 50 61 67 65 2d 3e 70 67  rZero(&pPage->pg
1d8b0 69 64 78 29 3b 0a 20 20 66 74 73 35 42 75 66 66  idx);.  fts5Buff
1d8c0 65 72 41 70 70 65 6e 64 42 6c 6f 62 28 26 70 2d  erAppendBlob(&p-
1d8d0 3e 72 63 2c 20 26 70 50 61 67 65 2d 3e 62 75 66  >rc, &pPage->buf
1d8e0 2c 20 34 2c 20 7a 65 72 6f 29 3b 0a 20 20 70 50  , 4, zero);.  pP
1d8f0 61 67 65 2d 3e 69 50 72 65 76 50 67 69 64 78 20  age->iPrevPgidx 
1d900 3d 20 30 3b 0a 20 20 70 50 61 67 65 2d 3e 70 67  = 0;.  pPage->pg
1d910 6e 6f 2b 2b 3b 0a 0a 20 20 2f 2a 20 49 6e 63 72  no++;..  /* Incr
1d920 65 61 73 65 20 74 68 65 20 6c 65 61 76 65 73 20  ease the leaves 
1d930 77 72 69 74 74 65 6e 20 63 6f 75 6e 74 65 72 20  written counter 
1d940 2a 2f 0a 20 20 70 57 72 69 74 65 72 2d 3e 6e 4c  */.  pWriter->nL
1d950 65 61 66 57 72 69 74 74 65 6e 2b 2b 3b 0a 0a 20  eafWritten++;.. 
1d960 20 2f 2a 20 54 68 65 20 6e 65 77 20 6c 65 61 66   /* The new leaf
1d970 20 68 6f 6c 64 73 20 6e 6f 20 74 65 72 6d 73 20   holds no terms 
1d980 6f 72 20 72 6f 77 69 64 73 20 2a 2f 0a 20 20 70  or rowids */.  p
1d990 57 72 69 74 65 72 2d 3e 62 46 69 72 73 74 54 65  Writer->bFirstTe
1d9a0 72 6d 49 6e 50 61 67 65 20 3d 20 31 3b 0a 20 20  rmInPage = 1;.  
1d9b0 70 57 72 69 74 65 72 2d 3e 62 46 69 72 73 74 52  pWriter->bFirstR
1d9c0 6f 77 69 64 49 6e 50 61 67 65 20 3d 20 31 3b 0a  owidInPage = 1;.
1d9d0 7d 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64 20  }../*.** Append 
1d9e0 74 65 72 6d 20 70 54 65 72 6d 2f 6e 54 65 72 6d  term pTerm/nTerm
1d9f0 20 74 6f 20 74 68 65 20 73 65 67 6d 65 6e 74 20   to the segment 
1da00 62 65 69 6e 67 20 77 72 69 74 74 65 6e 20 62 79  being written by
1da10 20 74 68 65 20 77 72 69 74 65 72 20 70 61 73 73   the writer pass
1da20 65 64 0a 2a 2a 20 61 73 20 74 68 65 20 73 65 63  ed.** as the sec
1da30 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a  ond argument..**
1da40 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20  .** If an error 
1da50 6f 63 63 75 72 73 2c 20 73 65 74 20 74 68 65 20  occurs, set the 
1da60 46 74 73 35 49 6e 64 65 78 2e 72 63 20 65 72 72  Fts5Index.rc err
1da70 6f 72 20 63 6f 64 65 2e 20 49 66 20 61 6e 20 65  or code. If an e
1da80 72 72 6f 72 20 68 61 73 20 0a 2a 2a 20 61 6c 72  rror has .** alr
1da90 65 61 64 79 20 6f 63 63 75 72 72 65 64 2c 20 74  eady occurred, t
1daa0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
1dab0 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74  a no-op..*/.stat
1dac0 69 63 20 76 6f 69 64 20 66 74 73 35 57 72 69 74  ic void fts5Writ
1dad0 65 41 70 70 65 6e 64 54 65 72 6d 28 0a 20 20 46  eAppendTerm(.  F
1dae0 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 0a 20 20  ts5Index *p, .  
1daf0 46 74 73 35 53 65 67 57 72 69 74 65 72 20 2a 70  Fts5SegWriter *p
1db00 57 72 69 74 65 72 2c 0a 20 20 69 6e 74 20 6e 54  Writer,.  int nT
1db10 65 72 6d 2c 20 63 6f 6e 73 74 20 75 38 20 2a 70  erm, const u8 *p
1db20 54 65 72 6d 20 0a 29 7b 0a 20 20 69 6e 74 20 6e  Term .){.  int n
1db30 50 72 65 66 69 78 3b 20 20 20 20 20 20 20 20 20  Prefix;         
1db40 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79             /* By
1db50 74 65 73 20 6f 66 20 70 72 65 66 69 78 20 63 6f  tes of prefix co
1db60 6d 70 72 65 73 73 69 6f 6e 20 66 6f 72 20 74 65  mpression for te
1db70 72 6d 20 2a 2f 0a 20 20 46 74 73 35 50 61 67 65  rm */.  Fts5Page
1db80 57 72 69 74 65 72 20 2a 70 50 61 67 65 20 3d 20  Writer *pPage = 
1db90 26 70 57 72 69 74 65 72 2d 3e 77 72 69 74 65 72  &pWriter->writer
1dba0 3b 0a 20 20 46 74 73 35 42 75 66 66 65 72 20 2a  ;.  Fts5Buffer *
1dbb0 70 50 67 69 64 78 20 3d 20 26 70 57 72 69 74 65  pPgidx = &pWrite
1dbc0 72 2d 3e 77 72 69 74 65 72 2e 70 67 69 64 78 3b  r->writer.pgidx;
1dbd0 0a 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72  ..  assert( p->r
1dbe0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  c==SQLITE_OK );.
1dbf0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
1dc00 3e 62 75 66 2e 6e 3e 3d 34 20 29 3b 0a 20 20 61  >buf.n>=4 );.  a
1dc10 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 62 75  ssert( pPage->bu
1dc20 66 2e 6e 3e 34 20 7c 7c 20 70 57 72 69 74 65 72  f.n>4 || pWriter
1dc30 2d 3e 62 46 69 72 73 74 54 65 72 6d 49 6e 50 61  ->bFirstTermInPa
1dc40 67 65 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  ge );..  /* If t
1dc50 68 65 20 63 75 72 72 65 6e 74 20 6c 65 61 66 20  he current leaf 
1dc60 70 61 67 65 20 69 73 20 66 75 6c 6c 2c 20 66 6c  page is full, fl
1dc70 75 73 68 20 69 74 20 74 6f 20 64 69 73 6b 2e 20  ush it to disk. 
1dc80 2a 2f 0a 20 20 69 66 28 20 28 70 50 61 67 65 2d  */.  if( (pPage-
1dc90 3e 62 75 66 2e 6e 20 2b 20 70 50 67 69 64 78 2d  >buf.n + pPgidx-
1dca0 3e 6e 20 2b 20 6e 54 65 72 6d 20 2b 20 32 29 3e  >n + nTerm + 2)>
1dcb0 3d 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e 70 67 73  =p->pConfig->pgs
1dcc0 7a 20 29 7b 0a 20 20 20 20 69 66 28 20 70 50 61  z ){.    if( pPa
1dcd0 67 65 2d 3e 62 75 66 2e 6e 3e 34 20 29 7b 0a 20  ge->buf.n>4 ){. 
1dce0 20 20 20 20 20 66 74 73 35 57 72 69 74 65 46 6c       fts5WriteFl
1dcf0 75 73 68 4c 65 61 66 28 70 2c 20 70 57 72 69 74  ushLeaf(p, pWrit
1dd00 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66  er);.    }.    f
1dd10 74 73 35 42 75 66 66 65 72 47 72 6f 77 28 26 70  ts5BufferGrow(&p
1dd20 2d 3e 72 63 2c 20 26 70 50 61 67 65 2d 3e 62 75  ->rc, &pPage->bu
1dd30 66 2c 20 6e 54 65 72 6d 2b 46 54 53 35 5f 44 41  f, nTerm+FTS5_DA
1dd40 54 41 5f 50 41 44 44 49 4e 47 29 3b 0a 20 20 7d  TA_PADDING);.  }
1dd50 0a 20 20 0a 20 20 2f 2a 20 54 4f 44 4f 31 3a 20  .  .  /* TODO1: 
1dd60 55 70 64 61 74 69 6e 67 20 70 67 69 64 78 20 68  Updating pgidx h
1dd70 65 72 65 2e 20 2a 2f 0a 20 20 70 50 67 69 64 78  ere. */.  pPgidx
1dd80 2d 3e 6e 20 2b 3d 20 73 71 6c 69 74 65 33 46 74  ->n += sqlite3Ft
1dd90 73 35 50 75 74 56 61 72 69 6e 74 28 0a 20 20 20  s5PutVarint(.   
1dda0 20 20 20 26 70 50 67 69 64 78 2d 3e 70 5b 70 50     &pPgidx->p[pP
1ddb0 67 69 64 78 2d 3e 6e 5d 2c 20 70 50 61 67 65 2d  gidx->n], pPage-
1ddc0 3e 62 75 66 2e 6e 20 2d 20 70 50 61 67 65 2d 3e  >buf.n - pPage->
1ddd0 69 50 72 65 76 50 67 69 64 78 0a 20 20 29 3b 0a  iPrevPgidx.  );.
1dde0 20 20 70 50 61 67 65 2d 3e 69 50 72 65 76 50 67    pPage->iPrevPg
1ddf0 69 64 78 20 3d 20 70 50 61 67 65 2d 3e 62 75 66  idx = pPage->buf
1de00 2e 6e 3b 0a 23 69 66 20 30 0a 20 20 66 74 73 35  .n;.#if 0.  fts5
1de10 50 75 74 55 31 36 28 26 70 50 67 69 64 78 2d 3e  PutU16(&pPgidx->
1de20 70 5b 70 50 67 69 64 78 2d 3e 6e 5d 2c 20 70 50  p[pPgidx->n], pP
1de30 61 67 65 2d 3e 62 75 66 2e 6e 29 3b 0a 20 20 70  age->buf.n);.  p
1de40 50 67 69 64 78 2d 3e 6e 20 2b 3d 20 32 3b 0a 23  Pgidx->n += 2;.#
1de50 65 6e 64 69 66 0a 0a 20 20 69 66 28 20 70 57 72  endif..  if( pWr
1de60 69 74 65 72 2d 3e 62 46 69 72 73 74 54 65 72 6d  iter->bFirstTerm
1de70 49 6e 50 61 67 65 20 29 7b 0a 20 20 20 20 6e 50  InPage ){.    nP
1de80 72 65 66 69 78 20 3d 20 30 3b 0a 20 20 20 20 69  refix = 0;.    i
1de90 66 28 20 70 50 61 67 65 2d 3e 70 67 6e 6f 21 3d  f( pPage->pgno!=
1dea0 31 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68  1 ){.      /* Th
1deb0 69 73 20 69 73 20 74 68 65 20 66 69 72 73 74 20  is is the first 
1dec0 74 65 72 6d 20 6f 6e 20 61 20 6c 65 61 66 20 74  term on a leaf t
1ded0 68 61 74 20 69 73 20 6e 6f 74 20 74 68 65 20 6c  hat is not the l
1dee0 65 66 74 6d 6f 73 74 20 6c 65 61 66 20 69 6e 0a  eftmost leaf in.
1def0 20 20 20 20 20 20 2a 2a 20 74 68 65 20 73 65 67        ** the seg
1df00 6d 65 6e 74 20 62 2d 74 72 65 65 2e 20 49 6e 20  ment b-tree. In 
1df10 74 68 69 73 20 63 61 73 65 20 69 74 20 69 73 20  this case it is 
1df20 6e 65 63 65 73 73 61 72 79 20 74 6f 20 61 64 64  necessary to add
1df30 20 61 20 74 65 72 6d 20 74 6f 0a 20 20 20 20 20   a term to.     
1df40 20 2a 2a 20 74 68 65 20 62 2d 74 72 65 65 20 68   ** the b-tree h
1df50 69 65 72 61 72 63 68 79 20 74 68 61 74 20 69 73  ierarchy that is
1df60 20 28 61 29 20 6c 61 72 67 65 72 20 74 68 61 6e   (a) larger than
1df70 20 74 68 65 20 6c 61 72 67 65 73 74 20 74 65 72   the largest ter
1df80 6d 20 0a 20 20 20 20 20 20 2a 2a 20 61 6c 72 65  m .      ** alre
1df90 61 64 79 20 77 72 69 74 74 65 6e 20 74 6f 20 74  ady written to t
1dfa0 68 65 20 73 65 67 6d 65 6e 74 20 61 6e 64 20 28  he segment and (
1dfb0 62 29 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20  b) smaller than 
1dfc0 6f 72 20 65 71 75 61 6c 20 74 6f 0a 20 20 20 20  or equal to.    
1dfd0 20 20 2a 2a 20 74 68 69 73 20 74 65 72 6d 2e 20    ** this term. 
1dfe0 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20  In other words, 
1dff0 61 20 70 72 65 66 69 78 20 6f 66 20 28 70 54 65  a prefix of (pTe
1e000 72 6d 2f 6e 54 65 72 6d 29 20 74 68 61 74 20 69  rm/nTerm) that i
1e010 73 20 6f 6e 65 0a 20 20 20 20 20 20 2a 2a 20 62  s one.      ** b
1e020 79 74 65 20 6c 6f 6e 67 65 72 20 74 68 61 6e 20  yte longer than 
1e030 74 68 65 20 6c 6f 6e 67 65 73 74 20 70 72 65 66  the longest pref
1e040 69 78 20 28 70 54 65 72 6d 2f 6e 54 65 72 6d 29  ix (pTerm/nTerm)
1e050 20 73 68 61 72 65 73 20 77 69 74 68 20 74 68 65   shares with the
1e060 0a 20 20 20 20 20 20 2a 2a 20 70 72 65 76 69 6f  .      ** previo
1e070 75 73 20 74 65 72 6d 2e 20 0a 20 20 20 20 20 20  us term. .      
1e080 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 55 73 75 61  **.      ** Usua
1e090 6c 6c 79 2c 20 74 68 65 20 70 72 65 76 69 6f 75  lly, the previou
1e0a0 73 20 74 65 72 6d 20 69 73 20 61 76 61 69 6c 61  s term is availa
1e0b0 62 6c 65 20 69 6e 20 70 50 61 67 65 2d 3e 74 65  ble in pPage->te
1e0c0 72 6d 2e 20 54 68 65 20 65 78 63 65 70 74 69 6f  rm. The exceptio
1e0d0 6e 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 69 66  n.      ** is if
1e0e0 20 74 68 69 73 20 69 73 20 74 68 65 20 66 69 72   this is the fir
1e0f0 73 74 20 74 65 72 6d 20 77 72 69 74 74 65 6e 20  st term written 
1e100 69 6e 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61  in an incrementa
1e110 6c 2d 6d 65 72 67 65 20 73 74 65 70 2e 0a 20 20  l-merge step..  
1e120 20 20 20 20 2a 2a 20 49 6e 20 74 68 69 73 20 63      ** In this c
1e130 61 73 65 20 74 68 65 20 70 72 65 76 69 6f 75 73  ase the previous
1e140 20 74 65 72 6d 20 69 73 20 6e 6f 74 20 61 76 61   term is not ava
1e150 69 6c 61 62 6c 65 2c 20 73 6f 20 6a 75 73 74 20  ilable, so just 
1e160 77 72 69 74 65 20 61 0a 20 20 20 20 20 20 2a 2a  write a.      **
1e170 20 63 6f 70 79 20 6f 66 20 28 70 54 65 72 6d 2f   copy of (pTerm/
1e180 6e 54 65 72 6d 29 20 69 6e 74 6f 20 74 68 65 20  nTerm) into the 
1e190 70 61 72 65 6e 74 20 6e 6f 64 65 2e 20 54 68 69  parent node. Thi
1e1a0 73 20 69 73 20 73 6c 69 67 68 74 6c 79 0a 20 20  s is slightly.  
1e1b0 20 20 20 20 2a 2a 20 69 6e 65 66 66 69 63 69 65      ** inefficie
1e1c0 6e 74 2c 20 62 75 74 20 73 74 69 6c 6c 20 63 6f  nt, but still co
1e1d0 72 72 65 63 74 2e 20 20 2a 2f 0a 20 20 20 20 20  rrect.  */.     
1e1e0 20 69 6e 74 20 6e 20 3d 20 6e 54 65 72 6d 3b 0a   int n = nTerm;.
1e1f0 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65 2d        if( pPage-
1e200 3e 74 65 72 6d 2e 6e 20 29 7b 0a 20 20 20 20 20  >term.n ){.     
1e210 20 20 20 6e 20 3d 20 31 20 2b 20 66 74 73 35 50     n = 1 + fts5P
1e220 72 65 66 69 78 43 6f 6d 70 72 65 73 73 28 70 50  refixCompress(pP
1e230 61 67 65 2d 3e 74 65 72 6d 2e 6e 2c 20 70 50 61  age->term.n, pPa
1e240 67 65 2d 3e 74 65 72 6d 2e 70 2c 20 70 54 65 72  ge->term.p, pTer
1e250 6d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  m);.      }.    
1e260 20 20 66 74 73 35 57 72 69 74 65 42 74 72 65 65    fts5WriteBtree
1e270 54 65 72 6d 28 70 2c 20 70 57 72 69 74 65 72 2c  Term(p, pWriter,
1e280 20 6e 2c 20 70 54 65 72 6d 29 3b 0a 20 20 20 20   n, pTerm);.    
1e290 20 20 70 50 61 67 65 20 3d 20 26 70 57 72 69 74    pPage = &pWrit
1e2a0 65 72 2d 3e 77 72 69 74 65 72 3b 0a 20 20 20 20  er->writer;.    
1e2b0 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e  }.  }else{.    n
1e2c0 50 72 65 66 69 78 20 3d 20 66 74 73 35 50 72 65  Prefix = fts5Pre
1e2d0 66 69 78 43 6f 6d 70 72 65 73 73 28 70 50 61 67  fixCompress(pPag
1e2e0 65 2d 3e 74 65 72 6d 2e 6e 2c 20 70 50 61 67 65  e->term.n, pPage
1e2f0 2d 3e 74 65 72 6d 2e 70 2c 20 70 54 65 72 6d 29  ->term.p, pTerm)
1e300 3b 0a 20 20 20 20 66 74 73 35 42 75 66 66 65 72  ;.    fts5Buffer
1e310 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26 70 2d  AppendVarint(&p-
1e320 3e 72 63 2c 20 26 70 50 61 67 65 2d 3e 62 75 66  >rc, &pPage->buf
1e330 2c 20 6e 50 72 65 66 69 78 29 3b 0a 20 20 7d 0a  , nPrefix);.  }.
1e340 0a 20 20 2f 2a 20 41 70 70 65 6e 64 20 74 68 65  .  /* Append the
1e350 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   number of bytes
1e360 20 6f 66 20 6e 65 77 20 64 61 74 61 2c 20 74 68   of new data, th
1e370 65 6e 20 74 68 65 20 74 65 72 6d 20 64 61 74 61  en the term data
1e380 20 69 74 73 65 6c 66 0a 20 20 2a 2a 20 74 6f 20   itself.  ** to 
1e390 74 68 65 20 70 61 67 65 2e 20 2a 2f 0a 20 20 66  the page. */.  f
1e3a0 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 56  ts5BufferAppendV
1e3b0 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26 70  arint(&p->rc, &p
1e3c0 50 61 67 65 2d 3e 62 75 66 2c 20 6e 54 65 72 6d  Page->buf, nTerm
1e3d0 20 2d 20 6e 50 72 65 66 69 78 29 3b 0a 20 20 66   - nPrefix);.  f
1e3e0 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 42  ts5BufferAppendB
1e3f0 6c 6f 62 28 26 70 2d 3e 72 63 2c 20 26 70 50 61  lob(&p->rc, &pPa
1e400 67 65 2d 3e 62 75 66 2c 20 6e 54 65 72 6d 20 2d  ge->buf, nTerm -
1e410 20 6e 50 72 65 66 69 78 2c 20 26 70 54 65 72 6d   nPrefix, &pTerm
1e420 5b 6e 50 72 65 66 69 78 5d 29 3b 0a 0a 20 20 2f  [nPrefix]);..  /
1e430 2a 20 55 70 64 61 74 65 20 74 68 65 20 46 74 73  * Update the Fts
1e440 35 50 61 67 65 57 72 69 74 65 72 2e 74 65 72 6d  5PageWriter.term
1e450 20 66 69 65 6c 64 2e 20 2a 2f 0a 20 20 66 74 73   field. */.  fts
1e460 35 42 75 66 66 65 72 53 65 74 28 26 70 2d 3e 72  5BufferSet(&p->r
1e470 63 2c 20 26 70 50 61 67 65 2d 3e 74 65 72 6d 2c  c, &pPage->term,
1e480 20 6e 54 65 72 6d 2c 20 70 54 65 72 6d 29 3b 0a   nTerm, pTerm);.
1e490 20 20 70 57 72 69 74 65 72 2d 3e 62 46 69 72 73    pWriter->bFirs
1e4a0 74 54 65 72 6d 49 6e 50 61 67 65 20 3d 20 30 3b  tTermInPage = 0;
1e4b0 0a 0a 20 20 70 57 72 69 74 65 72 2d 3e 62 46 69  ..  pWriter->bFi
1e4c0 72 73 74 52 6f 77 69 64 49 6e 50 61 67 65 20 3d  rstRowidInPage =
1e4d0 20 30 3b 0a 20 20 70 57 72 69 74 65 72 2d 3e 62   0;.  pWriter->b
1e4e0 46 69 72 73 74 52 6f 77 69 64 49 6e 44 6f 63 6c  FirstRowidInDocl
1e4f0 69 73 74 20 3d 20 31 3b 0a 0a 20 20 61 73 73 65  ist = 1;..  asse
1e500 72 74 28 20 70 2d 3e 72 63 20 7c 7c 20 28 70 57  rt( p->rc || (pW
1e510 72 69 74 65 72 2d 3e 6e 44 6c 69 64 78 3e 30 20  riter->nDlidx>0 
1e520 26 26 20 70 57 72 69 74 65 72 2d 3e 61 44 6c 69  && pWriter->aDli
1e530 64 78 5b 30 5d 2e 62 75 66 2e 6e 3d 3d 30 29 20  dx[0].buf.n==0) 
1e540 29 3b 0a 20 20 70 57 72 69 74 65 72 2d 3e 61 44  );.  pWriter->aD
1e550 6c 69 64 78 5b 30 5d 2e 70 67 6e 6f 20 3d 20 70  lidx[0].pgno = p
1e560 50 61 67 65 2d 3e 70 67 6e 6f 3b 0a 7d 0a 0a 2f  Page->pgno;.}../
1e570 2a 0a 2a 2a 20 41 70 70 65 6e 64 20 61 20 72 6f  *.** Append a ro
1e580 77 69 64 20 61 6e 64 20 70 6f 73 69 74 69 6f 6e  wid and position
1e590 2d 6c 69 73 74 20 73 69 7a 65 20 66 69 65 6c 64  -list size field
1e5a0 20 74 6f 20 74 68 65 20 77 72 69 74 65 72 73 20   to the writers 
1e5b0 6f 75 74 70 75 74 2e 20 0a 2a 2f 0a 73 74 61 74  output. .*/.stat
1e5c0 69 63 20 76 6f 69 64 20 66 74 73 35 57 72 69 74  ic void fts5Writ
1e5d0 65 41 70 70 65 6e 64 52 6f 77 69 64 28 0a 20 20  eAppendRowid(.  
1e5e0 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 0a 20  Fts5Index *p, . 
1e5f0 20 46 74 73 35 53 65 67 57 72 69 74 65 72 20 2a   Fts5SegWriter *
1e600 70 57 72 69 74 65 72 2c 0a 20 20 69 36 34 20 69  pWriter,.  i64 i
1e610 52 6f 77 69 64 0a 29 7b 0a 20 20 69 66 28 20 70  Rowid.){.  if( p
1e620 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
1e630 29 7b 0a 20 20 20 20 46 74 73 35 50 61 67 65 57  ){.    Fts5PageW
1e640 72 69 74 65 72 20 2a 70 50 61 67 65 20 3d 20 26  riter *pPage = &
1e650 70 57 72 69 74 65 72 2d 3e 77 72 69 74 65 72 3b  pWriter->writer;
1e660 0a 0a 20 20 20 20 69 66 28 20 28 70 50 61 67 65  ..    if( (pPage
1e670 2d 3e 62 75 66 2e 6e 20 2b 20 70 50 61 67 65 2d  ->buf.n + pPage-
1e680 3e 70 67 69 64 78 2e 6e 29 3e 3d 70 2d 3e 70 43  >pgidx.n)>=p->pC
1e690 6f 6e 66 69 67 2d 3e 70 67 73 7a 20 29 7b 0a 20  onfig->pgsz ){. 
1e6a0 20 20 20 20 20 66 74 73 35 57 72 69 74 65 46 6c       fts5WriteFl
1e6b0 75 73 68 4c 65 61 66 28 70 2c 20 70 57 72 69 74  ushLeaf(p, pWrit
1e6c0 65 72 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  er);.    }..    
1e6d0 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 74 6f  /* If this is to
1e6e0 20 62 65 20 74 68 65 20 66 69 72 73 74 20 72 6f   be the first ro
1e6f0 77 69 64 20 77 72 69 74 74 65 6e 20 74 6f 20 74  wid written to t
1e700 68 65 20 70 61 67 65 2c 20 73 65 74 20 74 68 65  he page, set the
1e710 20 0a 20 20 20 20 2a 2a 20 72 6f 77 69 64 2d 70   .    ** rowid-p
1e720 6f 69 6e 74 65 72 20 69 6e 20 74 68 65 20 70 61  ointer in the pa
1e730 67 65 2d 68 65 61 64 65 72 2e 20 41 6c 73 6f 20  ge-header. Also 
1e740 61 70 70 65 6e 64 20 61 20 76 61 6c 75 65 20 74  append a value t
1e750 6f 20 74 68 65 20 64 6c 69 64 78 0a 20 20 20 20  o the dlidx.    
1e760 2a 2a 20 62 75 66 66 65 72 2c 20 69 6e 20 63 61  ** buffer, in ca
1e770 73 65 20 61 20 64 6f 63 6c 69 73 74 2d 69 6e 64  se a doclist-ind
1e780 65 78 20 69 73 20 72 65 71 75 69 72 65 64 2e 20  ex is required. 
1e790 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 57 72 69   */.    if( pWri
1e7a0 74 65 72 2d 3e 62 46 69 72 73 74 52 6f 77 69 64  ter->bFirstRowid
1e7b0 49 6e 50 61 67 65 20 29 7b 0a 20 20 20 20 20 20  InPage ){.      
1e7c0 66 74 73 35 50 75 74 55 31 36 28 70 50 61 67 65  fts5PutU16(pPage
1e7d0 2d 3e 62 75 66 2e 70 2c 20 28 75 31 36 29 70 50  ->buf.p, (u16)pP
1e7e0 61 67 65 2d 3e 62 75 66 2e 6e 29 3b 0a 20 20 20  age->buf.n);.   
1e7f0 20 20 20 66 74 73 35 57 72 69 74 65 44 6c 69 64     fts5WriteDlid
1e800 78 41 70 70 65 6e 64 28 70 2c 20 70 57 72 69 74  xAppend(p, pWrit
1e810 65 72 2c 20 69 52 6f 77 69 64 29 3b 0a 20 20 20  er, iRowid);.   
1e820 20 7d 0a 0a 20 20 20 20 2f 2a 20 57 72 69 74 65   }..    /* Write
1e830 20 74 68 65 20 72 6f 77 69 64 2e 20 2a 2f 0a 20   the rowid. */. 
1e840 20 20 20 69 66 28 20 70 57 72 69 74 65 72 2d 3e     if( pWriter->
1e850 62 46 69 72 73 74 52 6f 77 69 64 49 6e 44 6f 63  bFirstRowidInDoc
1e860 6c 69 73 74 20 7c 7c 20 70 57 72 69 74 65 72 2d  list || pWriter-
1e870 3e 62 46 69 72 73 74 52 6f 77 69 64 49 6e 50 61  >bFirstRowidInPa
1e880 67 65 20 29 7b 0a 20 20 20 20 20 20 66 74 73 35  ge ){.      fts5
1e890 42 75 66 66 65 72 41 70 70 65 6e 64 56 61 72 69  BufferAppendVari
1e8a0 6e 74 28 26 70 2d 3e 72 63 2c 20 26 70 50 61 67  nt(&p->rc, &pPag
1e8b0 65 2d 3e 62 75 66 2c 20 69 52 6f 77 69 64 29 3b  e->buf, iRowid);
1e8c0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1e8d0 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72 63 20    assert( p->rc 
1e8e0 7c 7c 20 69 52 6f 77 69 64 3e 70 57 72 69 74 65  || iRowid>pWrite
1e8f0 72 2d 3e 69 50 72 65 76 52 6f 77 69 64 20 29 3b  r->iPrevRowid );
1e900 0a 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65  .      fts5Buffe
1e910 72 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26 70  rAppendVarint(&p
1e920 2d 3e 72 63 2c 20 26 70 50 61 67 65 2d 3e 62 75  ->rc, &pPage->bu
1e930 66 2c 20 69 52 6f 77 69 64 20 2d 20 70 57 72 69  f, iRowid - pWri
1e940 74 65 72 2d 3e 69 50 72 65 76 52 6f 77 69 64 29  ter->iPrevRowid)
1e950 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 57 72 69  ;.    }.    pWri
1e960 74 65 72 2d 3e 69 50 72 65 76 52 6f 77 69 64 20  ter->iPrevRowid 
1e970 3d 20 69 52 6f 77 69 64 3b 0a 20 20 20 20 70 57  = iRowid;.    pW
1e980 72 69 74 65 72 2d 3e 62 46 69 72 73 74 52 6f 77  riter->bFirstRow
1e990 69 64 49 6e 44 6f 63 6c 69 73 74 20 3d 20 30 3b  idInDoclist = 0;
1e9a0 0a 20 20 20 20 70 57 72 69 74 65 72 2d 3e 62 46  .    pWriter->bF
1e9b0 69 72 73 74 52 6f 77 69 64 49 6e 50 61 67 65 20  irstRowidInPage 
1e9c0 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74  = 0;.  }.}..stat
1e9d0 69 63 20 76 6f 69 64 20 66 74 73 35 57 72 69 74  ic void fts5Writ
1e9e0 65 41 70 70 65 6e 64 50 6f 73 6c 69 73 74 44 61  eAppendPoslistDa
1e9f0 74 61 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20  ta(.  Fts5Index 
1ea00 2a 70 2c 20 0a 20 20 46 74 73 35 53 65 67 57 72  *p, .  Fts5SegWr
1ea10 69 74 65 72 20 2a 70 57 72 69 74 65 72 2c 20 0a  iter *pWriter, .
1ea20 20 20 63 6f 6e 73 74 20 75 38 20 2a 61 44 61 74    const u8 *aDat
1ea30 61 2c 20 0a 20 20 69 6e 74 20 6e 44 61 74 61 0a  a, .  int nData.
1ea40 29 7b 0a 20 20 46 74 73 35 50 61 67 65 57 72 69  ){.  Fts5PageWri
1ea50 74 65 72 20 2a 70 50 61 67 65 20 3d 20 26 70 57  ter *pPage = &pW
1ea60 72 69 74 65 72 2d 3e 77 72 69 74 65 72 3b 0a 20  riter->writer;. 
1ea70 20 63 6f 6e 73 74 20 75 38 20 2a 61 20 3d 20 61   const u8 *a = a
1ea80 44 61 74 61 3b 0a 20 20 69 6e 74 20 6e 20 3d 20  Data;.  int n = 
1ea90 6e 44 61 74 61 3b 0a 20 20 0a 20 20 61 73 73 65  nData;.  .  asse
1eaa0 72 74 28 20 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e  rt( p->pConfig->
1eab0 70 67 73 7a 3e 30 20 29 3b 0a 20 20 77 68 69 6c  pgsz>0 );.  whil
1eac0 65 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  e( p->rc==SQLITE
1ead0 5f 4f 4b 20 0a 20 20 20 20 20 26 26 20 28 70 50  _OK .     && (pP
1eae0 61 67 65 2d 3e 62 75 66 2e 6e 20 2b 20 70 50 61  age->buf.n + pPa
1eaf0 67 65 2d 3e 70 67 69 64 78 2e 6e 20 2b 20 6e 29  ge->pgidx.n + n)
1eb00 3e 3d 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e 70 67  >=p->pConfig->pg
1eb10 73 7a 20 0a 20 20 29 7b 0a 20 20 20 20 69 6e 74  sz .  ){.    int
1eb20 20 6e 52 65 71 20 3d 20 70 2d 3e 70 43 6f 6e 66   nReq = p->pConf
1eb30 69 67 2d 3e 70 67 73 7a 20 2d 20 70 50 61 67 65  ig->pgsz - pPage
1eb40 2d 3e 62 75 66 2e 6e 20 2d 20 70 50 61 67 65 2d  ->buf.n - pPage-
1eb50 3e 70 67 69 64 78 2e 6e 3b 0a 20 20 20 20 69 6e  >pgidx.n;.    in
1eb60 74 20 6e 43 6f 70 79 20 3d 20 30 3b 0a 20 20 20  t nCopy = 0;.   
1eb70 20 77 68 69 6c 65 28 20 6e 43 6f 70 79 3c 6e 52   while( nCopy<nR
1eb80 65 71 20 29 7b 0a 20 20 20 20 20 20 69 36 34 20  eq ){.      i64 
1eb90 64 75 6d 6d 79 3b 0a 20 20 20 20 20 20 6e 43 6f  dummy;.      nCo
1eba0 70 79 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72  py += fts5GetVar
1ebb0 69 6e 74 28 26 61 5b 6e 43 6f 70 79 5d 2c 20 28  int(&a[nCopy], (
1ebc0 75 36 34 2a 29 26 64 75 6d 6d 79 29 3b 0a 20 20  u64*)&dummy);.  
1ebd0 20 20 7d 0a 20 20 20 20 66 74 73 35 42 75 66 66    }.    fts5Buff
1ebe0 65 72 41 70 70 65 6e 64 42 6c 6f 62 28 26 70 2d  erAppendBlob(&p-
1ebf0 3e 72 63 2c 20 26 70 50 61 67 65 2d 3e 62 75 66  >rc, &pPage->buf
1ec00 2c 20 6e 43 6f 70 79 2c 20 61 29 3b 0a 20 20 20  , nCopy, a);.   
1ec10 20 61 20 2b 3d 20 6e 43 6f 70 79 3b 0a 20 20 20   a += nCopy;.   
1ec20 20 6e 20 2d 3d 20 6e 43 6f 70 79 3b 0a 20 20 20   n -= nCopy;.   
1ec30 20 66 74 73 35 57 72 69 74 65 46 6c 75 73 68 4c   fts5WriteFlushL
1ec40 65 61 66 28 70 2c 20 70 57 72 69 74 65 72 29 3b  eaf(p, pWriter);
1ec50 0a 20 20 7d 0a 20 20 69 66 28 20 6e 3e 30 20 29  .  }.  if( n>0 )
1ec60 7b 0a 20 20 20 20 66 74 73 35 42 75 66 66 65 72  {.    fts5Buffer
1ec70 41 70 70 65 6e 64 42 6c 6f 62 28 26 70 2d 3e 72  AppendBlob(&p->r
1ec80 63 2c 20 26 70 50 61 67 65 2d 3e 62 75 66 2c 20  c, &pPage->buf, 
1ec90 6e 2c 20 61 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  n, a);.  }.}../*
1eca0 0a 2a 2a 20 46 6c 75 73 68 20 61 6e 79 20 64 61  .** Flush any da
1ecb0 74 61 20 63 61 63 68 65 64 20 62 79 20 74 68 65  ta cached by the
1ecc0 20 77 72 69 74 65 72 20 6f 62 6a 65 63 74 20 74   writer object t
1ecd0 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20  o the database. 
1ece0 46 72 65 65 20 61 6e 79 0a 2a 2a 20 61 6c 6c 6f  Free any.** allo
1ecf0 63 61 74 69 6f 6e 73 20 61 73 73 6f 63 69 61 74  cations associat
1ed00 65 64 20 77 69 74 68 20 74 68 65 20 77 72 69 74  ed with the writ
1ed10 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  er..*/.static vo
1ed20 69 64 20 66 74 73 35 57 72 69 74 65 46 69 6e 69  id fts5WriteFini
1ed30 73 68 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20  sh(.  Fts5Index 
1ed40 2a 70 2c 20 0a 20 20 46 74 73 35 53 65 67 57 72  *p, .  Fts5SegWr
1ed50 69 74 65 72 20 2a 70 57 72 69 74 65 72 2c 20 20  iter *pWriter,  
1ed60 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 72         /* Writer
1ed70 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74   object */.  int
1ed80 20 2a 70 6e 4c 65 61 66 20 20 20 20 20 20 20 20   *pnLeaf        
1ed90 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1eda0 4f 55 54 3a 20 4e 75 6d 62 65 72 20 6f 66 20 6c  OUT: Number of l
1edb0 65 61 66 20 70 61 67 65 73 20 69 6e 20 62 2d 74  eaf pages in b-t
1edc0 72 65 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ree */.){.  int 
1edd0 69 3b 0a 20 20 46 74 73 35 50 61 67 65 57 72 69  i;.  Fts5PageWri
1ede0 74 65 72 20 2a 70 4c 65 61 66 20 3d 20 26 70 57  ter *pLeaf = &pW
1edf0 72 69 74 65 72 2d 3e 77 72 69 74 65 72 3b 0a 20  riter->writer;. 
1ee00 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49   if( p->rc==SQLI
1ee10 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73 73  TE_OK ){.    ass
1ee20 65 72 74 28 20 70 4c 65 61 66 2d 3e 70 67 6e 6f  ert( pLeaf->pgno
1ee30 3e 3d 31 20 29 3b 0a 20 20 20 20 69 66 28 20 70  >=1 );.    if( p
1ee40 4c 65 61 66 2d 3e 62 75 66 2e 6e 3e 34 20 29 7b  Leaf->buf.n>4 ){
1ee50 0a 20 20 20 20 20 20 66 74 73 35 57 72 69 74 65  .      fts5Write
1ee60 46 6c 75 73 68 4c 65 61 66 28 70 2c 20 70 57 72  FlushLeaf(p, pWr
1ee70 69 74 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20  iter);.    }.   
1ee80 20 2a 70 6e 4c 65 61 66 20 3d 20 70 4c 65 61 66   *pnLeaf = pLeaf
1ee90 2d 3e 70 67 6e 6f 2d 31 3b 0a 20 20 20 20 69 66  ->pgno-1;.    if
1eea0 28 20 70 4c 65 61 66 2d 3e 70 67 6e 6f 3e 31 20  ( pLeaf->pgno>1 
1eeb0 29 7b 0a 20 20 20 20 20 20 66 74 73 35 57 72 69  ){.      fts5Wri
1eec0 74 65 46 6c 75 73 68 42 74 72 65 65 28 70 2c 20  teFlushBtree(p, 
1eed0 70 57 72 69 74 65 72 29 3b 0a 20 20 20 20 7d 0a  pWriter);.    }.
1eee0 20 20 7d 0a 20 20 66 74 73 35 42 75 66 66 65 72    }.  fts5Buffer
1eef0 46 72 65 65 28 26 70 4c 65 61 66 2d 3e 74 65 72  Free(&pLeaf->ter
1ef00 6d 29 3b 0a 20 20 66 74 73 35 42 75 66 66 65 72  m);.  fts5Buffer
1ef10 46 72 65 65 28 26 70 4c 65 61 66 2d 3e 62 75 66  Free(&pLeaf->buf
1ef20 29 3b 0a 20 20 66 74 73 35 42 75 66 66 65 72 46  );.  fts5BufferF
1ef30 72 65 65 28 26 70 4c 65 61 66 2d 3e 70 67 69 64  ree(&pLeaf->pgid
1ef40 78 29 3b 0a 20 20 66 74 73 35 42 75 66 66 65 72  x);.  fts5Buffer
1ef50 46 72 65 65 28 26 70 57 72 69 74 65 72 2d 3e 62  Free(&pWriter->b
1ef60 74 74 65 72 6d 29 3b 0a 0a 20 20 66 6f 72 28 69  tterm);..  for(i
1ef70 3d 30 3b 20 69 3c 70 57 72 69 74 65 72 2d 3e 6e  =0; i<pWriter->n
1ef80 44 6c 69 64 78 3b 20 69 2b 2b 29 7b 0a 20 20 20  Dlidx; i++){.   
1ef90 20 73 71 6c 69 74 65 33 46 74 73 35 42 75 66 66   sqlite3Fts5Buff
1efa0 65 72 46 72 65 65 28 26 70 57 72 69 74 65 72 2d  erFree(&pWriter-
1efb0 3e 61 44 6c 69 64 78 5b 69 5d 2e 62 75 66 29 3b  >aDlidx[i].buf);
1efc0 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66  .  }.  sqlite3_f
1efd0 72 65 65 28 70 57 72 69 74 65 72 2d 3e 61 44 6c  ree(pWriter->aDl
1efe0 69 64 78 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20  idx);.}..static 
1eff0 76 6f 69 64 20 66 74 73 35 57 72 69 74 65 49 6e  void fts5WriteIn
1f000 69 74 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20  it(.  Fts5Index 
1f010 2a 70 2c 20 0a 20 20 46 74 73 35 53 65 67 57 72  *p, .  Fts5SegWr
1f020 69 74 65 72 20 2a 70 57 72 69 74 65 72 2c 20 0a  iter *pWriter, .
1f030 20 20 69 6e 74 20 69 53 65 67 69 64 0a 29 7b 0a    int iSegid.){.
1f040 20 20 63 6f 6e 73 74 20 69 6e 74 20 6e 42 75 66    const int nBuf
1f050 66 65 72 20 3d 20 70 2d 3e 70 43 6f 6e 66 69 67  fer = p->pConfig
1f060 2d 3e 70 67 73 7a 20 2b 20 46 54 53 35 5f 44 41  ->pgsz + FTS5_DA
1f070 54 41 5f 50 41 44 44 49 4e 47 3b 0a 0a 20 20 6d  TA_PADDING;..  m
1f080 65 6d 73 65 74 28 70 57 72 69 74 65 72 2c 20 30  emset(pWriter, 0
1f090 2c 20 73 69 7a 65 6f 66 28 46 74 73 35 53 65 67  , sizeof(Fts5Seg
1f0a0 57 72 69 74 65 72 29 29 3b 0a 20 20 70 57 72 69  Writer));.  pWri
1f0b0 74 65 72 2d 3e 69 53 65 67 69 64 20 3d 20 69 53  ter->iSegid = iS
1f0c0 65 67 69 64 3b 0a 0a 20 20 66 74 73 35 57 72 69  egid;..  fts5Wri
1f0d0 74 65 44 6c 69 64 78 47 72 6f 77 28 70 2c 20 70  teDlidxGrow(p, p
1f0e0 57 72 69 74 65 72 2c 20 31 29 3b 0a 20 20 70 57  Writer, 1);.  pW
1f0f0 72 69 74 65 72 2d 3e 77 72 69 74 65 72 2e 70 67  riter->writer.pg
1f100 6e 6f 20 3d 20 31 3b 0a 20 20 70 57 72 69 74 65  no = 1;.  pWrite
1f110 72 2d 3e 62 46 69 72 73 74 54 65 72 6d 49 6e 50  r->bFirstTermInP
1f120 61 67 65 20 3d 20 31 3b 0a 20 20 70 57 72 69 74  age = 1;.  pWrit
1f130 65 72 2d 3e 69 42 74 50 61 67 65 20 3d 20 31 3b  er->iBtPage = 1;
1f140 0a 0a 20 20 61 73 73 65 72 74 28 20 70 57 72 69  ..  assert( pWri
1f150 74 65 72 2d 3e 77 72 69 74 65 72 2e 62 75 66 2e  ter->writer.buf.
1f160 6e 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  n==0 );.  assert
1f170 28 20 70 57 72 69 74 65 72 2d 3e 77 72 69 74 65  ( pWriter->write
1f180 72 2e 70 67 69 64 78 2e 6e 3d 3d 30 20 29 3b 0a  r.pgidx.n==0 );.
1f190 0a 20 20 2f 2a 20 47 72 6f 77 20 74 68 65 20 74  .  /* Grow the t
1f1a0 77 6f 20 62 75 66 66 65 72 73 20 74 6f 20 70 67  wo buffers to pg
1f1b0 73 7a 20 2b 20 70 61 64 64 69 6e 67 20 62 79 74  sz + padding byt
1f1c0 65 73 20 69 6e 20 73 69 7a 65 2e 20 2a 2f 0a 20  es in size. */. 
1f1d0 20 73 71 6c 69 74 65 33 46 74 73 35 42 75 66 66   sqlite3Fts5Buff
1f1e0 65 72 53 69 7a 65 28 26 70 2d 3e 72 63 2c 20 26  erSize(&p->rc, &
1f1f0 70 57 72 69 74 65 72 2d 3e 77 72 69 74 65 72 2e  pWriter->writer.
1f200 70 67 69 64 78 2c 20 6e 42 75 66 66 65 72 29 3b  pgidx, nBuffer);
1f210 0a 20 20 73 71 6c 69 74 65 33 46 74 73 35 42 75  .  sqlite3Fts5Bu
1f220 66 66 65 72 53 69 7a 65 28 26 70 2d 3e 72 63 2c  fferSize(&p->rc,
1f230 20 26 70 57 72 69 74 65 72 2d 3e 77 72 69 74 65   &pWriter->write
1f240 72 2e 62 75 66 2c 20 6e 42 75 66 66 65 72 29 3b  r.buf, nBuffer);
1f250 0a 0a 20 20 69 66 28 20 70 2d 3e 70 49 64 78 57  ..  if( p->pIdxW
1f260 72 69 74 65 72 3d 3d 30 20 29 7b 0a 20 20 20 20  riter==0 ){.    
1f270 46 74 73 35 43 6f 6e 66 69 67 20 2a 70 43 6f 6e  Fts5Config *pCon
1f280 66 69 67 20 3d 20 70 2d 3e 70 43 6f 6e 66 69 67  fig = p->pConfig
1f290 3b 0a 20 20 20 20 66 74 73 35 49 6e 64 65 78 50  ;.    fts5IndexP
1f2a0 72 65 70 61 72 65 53 74 6d 74 28 70 2c 20 26 70  repareStmt(p, &p
1f2b0 2d 3e 70 49 64 78 57 72 69 74 65 72 2c 20 73 71  ->pIdxWriter, sq
1f2c0 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 0a 20  lite3_mprintf(. 
1f2d0 20 20 20 20 20 20 20 20 20 22 49 4e 53 45 52 54           "INSERT
1f2e0 20 49 4e 54 4f 20 27 25 71 27 2e 27 25 71 5f 69   INTO '%q'.'%q_i
1f2f0 64 78 27 28 73 65 67 69 64 2c 74 65 72 6d 2c 70  dx'(segid,term,p
1f300 67 6e 6f 29 20 56 41 4c 55 45 53 28 3f 2c 3f 2c  gno) VALUES(?,?,
1f310 3f 29 22 2c 20 0a 20 20 20 20 20 20 20 20 20 20  ?)", .          
1f320 70 43 6f 6e 66 69 67 2d 3e 7a 44 62 2c 20 70 43  pConfig->zDb, pC
1f330 6f 6e 66 69 67 2d 3e 7a 4e 61 6d 65 0a 20 20 20  onfig->zName.   
1f340 20 29 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20   ));.  }..  if( 
1f350 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
1f360 20 29 7b 0a 20 20 20 20 2f 2a 20 49 6e 69 74 69   ){.    /* Initi
1f370 61 6c 69 7a 65 20 74 68 65 20 34 2d 62 79 74 65  alize the 4-byte
1f380 20 6c 65 61 66 2d 70 61 67 65 20 68 65 61 64 65   leaf-page heade
1f390 72 20 74 6f 20 30 78 30 30 2e 20 2a 2f 0a 20 20  r to 0x00. */.  
1f3a0 20 20 6d 65 6d 73 65 74 28 70 57 72 69 74 65 72    memset(pWriter
1f3b0 2d 3e 77 72 69 74 65 72 2e 62 75 66 2e 70 2c 20  ->writer.buf.p, 
1f3c0 30 2c 20 34 29 3b 0a 20 20 20 20 70 57 72 69 74  0, 4);.    pWrit
1f3d0 65 72 2d 3e 77 72 69 74 65 72 2e 62 75 66 2e 6e  er->writer.buf.n
1f3e0 20 3d 20 34 3b 0a 0a 20 20 20 20 2f 2a 20 42 69   = 4;..    /* Bi
1f3f0 6e 64 20 74 68 65 20 63 75 72 72 65 6e 74 20 6f  nd the current o
1f400 75 74 70 75 74 20 73 65 67 6d 65 6e 74 20 69 64  utput segment id
1f410 20 74 6f 20 74 68 65 20 69 6e 64 65 78 2d 77 72   to the index-wr
1f420 69 74 65 72 2e 20 54 68 69 73 20 69 73 20 61 6e  iter. This is an
1f430 0a 20 20 20 20 2a 2a 20 6f 70 74 69 6d 69 7a 61  .    ** optimiza
1f440 74 69 6f 6e 20 6f 76 65 72 20 62 69 6e 64 69 6e  tion over bindin
1f450 67 20 74 68 65 20 73 61 6d 65 20 76 61 6c 75 65  g the same value
1f460 20 6f 76 65 72 20 61 6e 64 20 6f 76 65 72 20 61   over and over a
1f470 73 20 72 6f 77 73 20 61 72 65 0a 20 20 20 20 2a  s rows are.    *
1f480 2a 20 69 6e 73 65 72 74 65 64 20 69 6e 74 6f 20  * inserted into 
1f490 25 5f 69 64 78 20 62 79 20 74 68 65 20 63 75 72  %_idx by the cur
1f4a0 72 65 6e 74 20 77 72 69 74 65 72 2e 20 20 2a 2f  rent writer.  */
1f4b0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e  .    sqlite3_bin
1f4c0 64 5f 69 6e 74 28 70 2d 3e 70 49 64 78 57 72 69  d_int(p->pIdxWri
1f4d0 74 65 72 2c 20 31 2c 20 70 57 72 69 74 65 72 2d  ter, 1, pWriter-
1f4e0 3e 69 53 65 67 69 64 29 3b 0a 20 20 7d 0a 7d 0a  >iSegid);.  }.}.
1f4f0 0a 2f 2a 0a 2a 2a 20 49 74 65 72 61 74 6f 72 20  ./*.** Iterator 
1f500 70 49 74 65 72 20 77 61 73 20 75 73 65 64 20 74  pIter was used t
1f510 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f 75 67  o iterate throug
1f520 68 20 74 68 65 20 69 6e 70 75 74 20 73 65 67 6d  h the input segm
1f530 65 6e 74 73 20 6f 66 20 6f 6e 20 61 6e 0a 2a 2a  ents of on an.**
1f540 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 6d 65 72   incremental mer
1f550 67 65 20 6f 70 65 72 61 74 69 6f 6e 2e 20 54 68  ge operation. Th
1f560 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
1f570 61 6c 6c 65 64 20 69 66 20 74 68 65 20 69 6e 63  alled if the inc
1f580 72 65 6d 65 6e 74 61 6c 0a 2a 2a 20 6d 65 72 67  remental.** merg
1f590 65 20 73 74 65 70 20 68 61 73 20 66 69 6e 69 73  e step has finis
1f5a0 68 65 64 20 62 75 74 20 74 68 65 20 69 6e 70 75  hed but the inpu
1f5b0 74 20 68 61 73 20 6e 6f 74 20 62 65 65 6e 20 63  t has not been c
1f5c0 6f 6d 70 6c 65 74 65 6c 79 20 65 78 68 61 75 73  ompletely exhaus
1f5d0 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ted..*/.static v
1f5e0 6f 69 64 20 66 74 73 35 54 72 69 6d 53 65 67 6d  oid fts5TrimSegm
1f5f0 65 6e 74 73 28 46 74 73 35 49 6e 64 65 78 20 2a  ents(Fts5Index *
1f600 70 2c 20 46 74 73 35 49 74 65 72 20 2a 70 49 74  p, Fts5Iter *pIt
1f610 65 72 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  er){.  int i;.  
1f620 46 74 73 35 42 75 66 66 65 72 20 62 75 66 3b 0a  Fts5Buffer buf;.
1f630 20 20 6d 65 6d 73 65 74 28 26 62 75 66 2c 20 30    memset(&buf, 0
1f640 2c 20 73 69 7a 65 6f 66 28 46 74 73 35 42 75 66  , sizeof(Fts5Buf
1f650 66 65 72 29 29 3b 0a 20 20 66 6f 72 28 69 3d 30  fer));.  for(i=0
1f660 3b 20 69 3c 70 49 74 65 72 2d 3e 6e 53 65 67 3b  ; i<pIter->nSeg;
1f670 20 69 2b 2b 29 7b 0a 20 20 20 20 46 74 73 35 53   i++){.    Fts5S
1f680 65 67 49 74 65 72 20 2a 70 53 65 67 20 3d 20 26  egIter *pSeg = &
1f690 70 49 74 65 72 2d 3e 61 53 65 67 5b 69 5d 3b 0a  pIter->aSeg[i];.
1f6a0 20 20 20 20 69 66 28 20 70 53 65 67 2d 3e 70 53      if( pSeg->pS
1f6b0 65 67 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f  eg==0 ){.      /
1f6c0 2a 20 6e 6f 2d 6f 70 20 2a 2f 0a 20 20 20 20 7d  * no-op */.    }
1f6d0 65 6c 73 65 20 69 66 28 20 70 53 65 67 2d 3e 70  else if( pSeg->p
1f6e0 4c 65 61 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Leaf==0 ){.     
1f6f0 20 2f 2a 20 41 6c 6c 20 6b 65 79 73 20 66 72 6f   /* All keys fro
1f700 6d 20 74 68 69 73 20 69 6e 70 75 74 20 73 65 67  m this input seg
1f710 6d 65 6e 74 20 68 61 76 65 20 62 65 65 6e 20 74  ment have been t
1f720 72 61 6e 73 66 65 72 65 64 20 74 6f 20 74 68 65  ransfered to the
1f730 20 6f 75 74 70 75 74 2e 0a 20 20 20 20 20 20 2a   output..      *
1f740 2a 20 53 65 74 20 62 6f 74 68 20 74 68 65 20 66  * Set both the f
1f750 69 72 73 74 20 61 6e 64 20 6c 61 73 74 20 70 61  irst and last pa
1f760 67 65 2d 6e 75 6d 62 65 72 73 20 74 6f 20 30 20  ge-numbers to 0 
1f770 74 6f 20 69 6e 64 69 63 61 74 65 20 74 68 61 74  to indicate that
1f780 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 73 65   the.      ** se
1f790 67 6d 65 6e 74 20 69 73 20 6e 6f 77 20 65 6d 70  gment is now emp
1f7a0 74 79 2e 20 2a 2f 0a 20 20 20 20 20 20 70 53 65  ty. */.      pSe
1f7b0 67 2d 3e 70 53 65 67 2d 3e 70 67 6e 6f 4c 61 73  g->pSeg->pgnoLas
1f7c0 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 53 65  t = 0;.      pSe
1f7d0 67 2d 3e 70 53 65 67 2d 3e 70 67 6e 6f 46 69 72  g->pSeg->pgnoFir
1f7e0 73 74 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73  st = 0;.    }els
1f7f0 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 4f 66  e{.      int iOf
1f800 66 20 3d 20 70 53 65 67 2d 3e 69 54 65 72 6d 4c  f = pSeg->iTermL
1f810 65 61 66 4f 66 66 73 65 74 3b 20 20 20 20 20 2f  eafOffset;     /
1f820 2a 20 4f 66 66 73 65 74 20 6f 6e 20 6e 65 77 20  * Offset on new 
1f830 66 69 72 73 74 20 6c 65 61 66 20 70 61 67 65 20  first leaf page 
1f840 2a 2f 0a 20 20 20 20 20 20 69 36 34 20 69 4c 65  */.      i64 iLe
1f850 61 66 52 6f 77 69 64 3b 0a 20 20 20 20 20 20 46  afRowid;.      F
1f860 74 73 35 44 61 74 61 20 2a 70 44 61 74 61 3b 0a  ts5Data *pData;.
1f870 20 20 20 20 20 20 69 6e 74 20 69 49 64 20 3d 20        int iId = 
1f880 70 53 65 67 2d 3e 70 53 65 67 2d 3e 69 53 65 67  pSeg->pSeg->iSeg
1f890 69 64 3b 0a 20 20 20 20 20 20 75 38 20 61 48 64  id;.      u8 aHd
1f8a0 72 5b 34 5d 20 3d 20 7b 30 78 30 30 2c 20 30 78  r[4] = {0x00, 0x
1f8b0 30 30 2c 20 30 78 30 30 2c 20 30 78 30 30 7d 3b  00, 0x00, 0x00};
1f8c0 0a 0a 20 20 20 20 20 20 69 4c 65 61 66 52 6f 77  ..      iLeafRow
1f8d0 69 64 20 3d 20 46 54 53 35 5f 53 45 47 4d 45 4e  id = FTS5_SEGMEN
1f8e0 54 5f 52 4f 57 49 44 28 69 49 64 2c 20 70 53 65  T_ROWID(iId, pSe
1f8f0 67 2d 3e 69 54 65 72 6d 4c 65 61 66 50 67 6e 6f  g->iTermLeafPgno
1f900 29 3b 0a 20 20 20 20 20 20 70 44 61 74 61 20 3d  );.      pData =
1f910 20 66 74 73 35 44 61 74 61 52 65 61 64 28 70 2c   fts5DataRead(p,
1f920 20 69 4c 65 61 66 52 6f 77 69 64 29 3b 0a 20 20   iLeafRowid);.  
1f930 20 20 20 20 69 66 28 20 70 44 61 74 61 20 29 7b      if( pData ){
1f940 0a 20 20 20 20 20 20 20 20 66 74 73 35 42 75 66  .        fts5Buf
1f950 66 65 72 5a 65 72 6f 28 26 62 75 66 29 3b 0a 20  ferZero(&buf);. 
1f960 20 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65         fts5Buffe
1f970 72 47 72 6f 77 28 26 70 2d 3e 72 63 2c 20 26 62  rGrow(&p->rc, &b
1f980 75 66 2c 20 70 44 61 74 61 2d 3e 6e 6e 29 3b 0a  uf, pData->nn);.
1f990 20 20 20 20 20 20 20 20 66 74 73 35 42 75 66 66          fts5Buff
1f9a0 65 72 41 70 70 65 6e 64 42 6c 6f 62 28 26 70 2d  erAppendBlob(&p-
1f9b0 3e 72 63 2c 20 26 62 75 66 2c 20 73 69 7a 65 6f  >rc, &buf, sizeo
1f9c0 66 28 61 48 64 72 29 2c 20 61 48 64 72 29 3b 0a  f(aHdr), aHdr);.
1f9d0 20 20 20 20 20 20 20 20 66 74 73 35 42 75 66 66          fts5Buff
1f9e0 65 72 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26  erAppendVarint(&
1f9f0 70 2d 3e 72 63 2c 20 26 62 75 66 2c 20 70 53 65  p->rc, &buf, pSe
1fa00 67 2d 3e 74 65 72 6d 2e 6e 29 3b 0a 20 20 20 20  g->term.n);.    
1fa10 20 20 20 20 66 74 73 35 42 75 66 66 65 72 41 70      fts5BufferAp
1fa20 70 65 6e 64 42 6c 6f 62 28 26 70 2d 3e 72 63 2c  pendBlob(&p->rc,
1fa30 20 26 62 75 66 2c 20 70 53 65 67 2d 3e 74 65 72   &buf, pSeg->ter
1fa40 6d 2e 6e 2c 20 70 53 65 67 2d 3e 74 65 72 6d 2e  m.n, pSeg->term.
1fa50 70 29 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35  p);.        fts5
1fa60 42 75 66 66 65 72 41 70 70 65 6e 64 42 6c 6f 62  BufferAppendBlob
1fa70 28 26 70 2d 3e 72 63 2c 20 26 62 75 66 2c 20 70  (&p->rc, &buf, p
1fa80 44 61 74 61 2d 3e 73 7a 4c 65 61 66 2d 69 4f 66  Data->szLeaf-iOf
1fa90 66 2c 20 26 70 44 61 74 61 2d 3e 70 5b 69 4f 66  f, &pData->p[iOf
1faa0 66 5d 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  f]);.        if(
1fab0 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
1fac0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  K ){.          /
1fad0 2a 20 53 65 74 20 74 68 65 20 73 7a 4c 65 61 66  * Set the szLeaf
1fae0 20 66 69 65 6c 64 20 2a 2f 0a 20 20 20 20 20 20   field */.      
1faf0 20 20 20 20 66 74 73 35 50 75 74 55 31 36 28 26      fts5PutU16(&
1fb00 62 75 66 2e 70 5b 32 5d 2c 20 28 75 31 36 29 62  buf.p[2], (u16)b
1fb10 75 66 2e 6e 29 3b 0a 20 20 20 20 20 20 20 20 7d  uf.n);.        }
1fb20 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 53 65 74  ..        /* Set
1fb30 20 75 70 20 74 68 65 20 6e 65 77 20 70 61 67 65   up the new page
1fb40 2d 69 6e 64 65 78 20 61 72 72 61 79 20 2a 2f 0a  -index array */.
1fb50 20 20 20 20 20 20 20 20 66 74 73 35 42 75 66 66          fts5Buff
1fb60 65 72 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26  erAppendVarint(&
1fb70 70 2d 3e 72 63 2c 20 26 62 75 66 2c 20 34 29 3b  p->rc, &buf, 4);
1fb80 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 53 65  .        if( pSe
1fb90 67 2d 3e 69 4c 65 61 66 50 67 6e 6f 3d 3d 70 53  g->iLeafPgno==pS
1fba0 65 67 2d 3e 69 54 65 72 6d 4c 65 61 66 50 67 6e  eg->iTermLeafPgn
1fbb0 6f 20 0a 20 20 20 20 20 20 20 20 20 26 26 20 70  o .         && p
1fbc0 53 65 67 2d 3e 69 45 6e 64 6f 66 44 6f 63 6c 69  Seg->iEndofDocli
1fbd0 73 74 3c 70 44 61 74 61 2d 3e 73 7a 4c 65 61 66  st<pData->szLeaf
1fbe0 20 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20   .        ){.   
1fbf0 20 20 20 20 20 20 20 69 6e 74 20 6e 44 69 66 66         int nDiff
1fc00 20 3d 20 70 44 61 74 61 2d 3e 73 7a 4c 65 61 66   = pData->szLeaf
1fc10 20 2d 20 70 53 65 67 2d 3e 69 45 6e 64 6f 66 44   - pSeg->iEndofD
1fc20 6f 63 6c 69 73 74 3b 0a 20 20 20 20 20 20 20 20  oclist;.        
1fc30 20 20 66 74 73 35 42 75 66 66 65 72 41 70 70 65    fts5BufferAppe
1fc40 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c  ndVarint(&p->rc,
1fc50 20 26 62 75 66 2c 20 62 75 66 2e 6e 20 2d 20 31   &buf, buf.n - 1
1fc60 20 2d 20 6e 44 69 66 66 20 2d 20 34 29 3b 0a 20   - nDiff - 4);. 
1fc70 20 20 20 20 20 20 20 20 20 66 74 73 35 42 75 66           fts5Buf
1fc80 66 65 72 41 70 70 65 6e 64 42 6c 6f 62 28 26 70  ferAppendBlob(&p
1fc90 2d 3e 72 63 2c 20 26 62 75 66 2c 20 0a 20 20 20  ->rc, &buf, .   
1fca0 20 20 20 20 20 20 20 20 20 20 20 70 44 61 74 61             pData
1fcb0 2d 3e 6e 6e 20 2d 20 70 53 65 67 2d 3e 69 50 67  ->nn - pSeg->iPg
1fcc0 69 64 78 4f 66 66 2c 20 26 70 44 61 74 61 2d 3e  idxOff, &pData->
1fcd0 70 5b 70 53 65 67 2d 3e 69 50 67 69 64 78 4f 66  p[pSeg->iPgidxOf
1fce0 66 5d 0a 20 20 20 20 20 20 20 20 20 20 29 3b 0a  f].          );.
1fcf0 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20          }..     
1fd00 20 20 20 66 74 73 35 44 61 74 61 52 65 6c 65 61     fts5DataRelea
1fd10 73 65 28 70 44 61 74 61 29 3b 0a 20 20 20 20 20  se(pData);.     
1fd20 20 20 20 70 53 65 67 2d 3e 70 53 65 67 2d 3e 70     pSeg->pSeg->p
1fd30 67 6e 6f 46 69 72 73 74 20 3d 20 70 53 65 67 2d  gnoFirst = pSeg-
1fd40 3e 69 54 65 72 6d 4c 65 61 66 50 67 6e 6f 3b 0a  >iTermLeafPgno;.
1fd50 20 20 20 20 20 20 20 20 66 74 73 35 44 61 74 61          fts5Data
1fd60 44 65 6c 65 74 65 28 70 2c 20 46 54 53 35 5f 53  Delete(p, FTS5_S
1fd70 45 47 4d 45 4e 54 5f 52 4f 57 49 44 28 69 49 64  EGMENT_ROWID(iId
1fd80 2c 20 31 29 2c 20 69 4c 65 61 66 52 6f 77 69 64  , 1), iLeafRowid
1fd90 29 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35 44  );.        fts5D
1fda0 61 74 61 57 72 69 74 65 28 70 2c 20 69 4c 65 61  ataWrite(p, iLea
1fdb0 66 52 6f 77 69 64 2c 20 62 75 66 2e 70 2c 20 62  fRowid, buf.p, b
1fdc0 75 66 2e 6e 29 3b 0a 20 20 20 20 20 20 7d 0a 20  uf.n);.      }. 
1fdd0 20 20 20 7d 0a 20 20 7d 0a 20 20 66 74 73 35 42     }.  }.  fts5B
1fde0 75 66 66 65 72 46 72 65 65 28 26 62 75 66 29 3b  ufferFree(&buf);
1fdf0 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .}..static void 
1fe00 66 74 73 35 4d 65 72 67 65 43 68 75 6e 6b 43 61  fts5MergeChunkCa
1fe10 6c 6c 62 61 63 6b 28 0a 20 20 46 74 73 35 49 6e  llback(.  Fts5In
1fe20 64 65 78 20 2a 70 2c 20 0a 20 20 76 6f 69 64 20  dex *p, .  void 
1fe30 2a 70 43 74 78 2c 20 0a 20 20 63 6f 6e 73 74 20  *pCtx, .  const 
1fe40 75 38 20 2a 70 43 68 75 6e 6b 2c 20 69 6e 74 20  u8 *pChunk, int 
1fe50 6e 43 68 75 6e 6b 0a 29 7b 0a 20 20 46 74 73 35  nChunk.){.  Fts5
1fe60 53 65 67 57 72 69 74 65 72 20 2a 70 57 72 69 74  SegWriter *pWrit
1fe70 65 72 20 3d 20 28 46 74 73 35 53 65 67 57 72 69  er = (Fts5SegWri
1fe80 74 65 72 2a 29 70 43 74 78 3b 0a 20 20 66 74 73  ter*)pCtx;.  fts
1fe90 35 57 72 69 74 65 41 70 70 65 6e 64 50 6f 73 6c  5WriteAppendPosl
1fea0 69 73 74 44 61 74 61 28 70 2c 20 70 57 72 69 74  istData(p, pWrit
1feb0 65 72 2c 20 70 43 68 75 6e 6b 2c 20 6e 43 68 75  er, pChunk, nChu
1fec0 6e 6b 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 0a 2a 2f  nk);.}../*.**.*/
1fed0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
1fee0 35 49 6e 64 65 78 4d 65 72 67 65 4c 65 76 65 6c  5IndexMergeLevel
1fef0 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70  (.  Fts5Index *p
1ff00 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1ff10 20 20 20 20 2f 2a 20 46 54 53 35 20 62 61 63 6b      /* FTS5 back
1ff20 65 6e 64 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  end object */.  
1ff30 46 74 73 35 53 74 72 75 63 74 75 72 65 20 2a 2a  Fts5Structure **
1ff40 70 70 53 74 72 75 63 74 2c 20 20 20 20 20 20 20  ppStruct,       
1ff50 2f 2a 20 49 4e 2f 4f 55 54 3a 20 53 74 75 63 74  /* IN/OUT: Stuct
1ff60 75 72 65 20 6f 66 20 69 6e 64 65 78 20 2a 2f 0a  ure of index */.
1ff70 20 20 69 6e 74 20 69 4c 76 6c 2c 20 20 20 20 20    int iLvl,     
1ff80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ff90 20 20 2f 2a 20 4c 65 76 65 6c 20 74 6f 20 72 65    /* Level to re
1ffa0 61 64 20 69 6e 70 75 74 20 66 72 6f 6d 20 2a 2f  ad input from */
1ffb0 0a 20 20 69 6e 74 20 2a 70 6e 52 65 6d 20 20 20  .  int *pnRem   
1ffc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ffd0 20 20 20 2f 2a 20 57 72 69 74 65 20 75 70 20 74     /* Write up t
1ffe0 6f 20 74 68 69 73 20 6d 61 6e 79 20 6f 75 74 70  o this many outp
1fff0 75 74 20 6c 65 61 76 65 73 20 2a 2f 0a 29 7b 0a  ut leaves */.){.
20000 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65 20    Fts5Structure 
20010 2a 70 53 74 72 75 63 74 20 3d 20 2a 70 70 53 74  *pStruct = *ppSt
20020 72 75 63 74 3b 0a 20 20 46 74 73 35 53 74 72 75  ruct;.  Fts5Stru
20030 63 74 75 72 65 4c 65 76 65 6c 20 2a 70 4c 76 6c  ctureLevel *pLvl
20040 20 3d 20 26 70 53 74 72 75 63 74 2d 3e 61 4c 65   = &pStruct->aLe
20050 76 65 6c 5b 69 4c 76 6c 5d 3b 0a 20 20 46 74 73  vel[iLvl];.  Fts
20060 35 53 74 72 75 63 74 75 72 65 4c 65 76 65 6c 20  5StructureLevel 
20070 2a 70 4c 76 6c 4f 75 74 3b 0a 20 20 46 74 73 35  *pLvlOut;.  Fts5
20080 49 74 65 72 20 2a 70 49 74 65 72 20 3d 20 30 3b  Iter *pIter = 0;
20090 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74         /* Iterat
200a0 6f 72 20 74 6f 20 72 65 61 64 20 69 6e 70 75 74  or to read input
200b0 20 64 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20 6e   data */.  int n
200c0 52 65 6d 20 3d 20 70 6e 52 65 6d 20 3f 20 2a 70  Rem = pnRem ? *p
200d0 6e 52 65 6d 20 3a 20 30 3b 20 20 2f 2a 20 4f 75  nRem : 0;  /* Ou
200e0 74 70 75 74 20 6c 65 61 66 20 70 61 67 65 73 20  tput leaf pages 
200f0 6c 65 66 74 20 74 6f 20 77 72 69 74 65 20 2a 2f  left to write */
20100 0a 20 20 69 6e 74 20 6e 49 6e 70 75 74 3b 20 20  .  int nInput;  
20110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20120 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
20130 69 6e 70 75 74 20 73 65 67 6d 65 6e 74 73 20 2a  input segments *
20140 2f 0a 20 20 46 74 73 35 53 65 67 57 72 69 74 65  /.  Fts5SegWrite
20150 72 20 77 72 69 74 65 72 3b 20 20 20 20 20 20 20  r writer;       
20160 20 20 20 20 2f 2a 20 57 72 69 74 65 72 20 6f 62      /* Writer ob
20170 6a 65 63 74 20 2a 2f 0a 20 20 46 74 73 35 53 74  ject */.  Fts5St
20180 72 75 63 74 75 72 65 53 65 67 6d 65 6e 74 20 2a  ructureSegment *
20190 70 53 65 67 3b 20 20 20 20 20 2f 2a 20 4f 75 74  pSeg;     /* Out
201a0 70 75 74 20 73 65 67 6d 65 6e 74 20 2a 2f 0a 20  put segment */. 
201b0 20 46 74 73 35 42 75 66 66 65 72 20 74 65 72 6d   Fts5Buffer term
201c0 3b 0a 20 20 69 6e 74 20 62 4f 6c 64 65 73 74 3b  ;.  int bOldest;
201d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
201e0 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74      /* True if t
201f0 68 65 20 6f 75 74 70 75 74 20 73 65 67 6d 65 6e  he output segmen
20200 74 20 69 73 20 74 68 65 20 6f 6c 64 65 73 74 20  t is the oldest 
20210 2a 2f 0a 20 20 69 6e 74 20 65 44 65 74 61 69 6c  */.  int eDetail
20220 20 3d 20 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e 65   = p->pConfig->e
20230 44 65 74 61 69 6c 3b 0a 20 20 63 6f 6e 73 74 20  Detail;.  const 
20240 69 6e 74 20 66 6c 61 67 73 20 3d 20 46 54 53 35  int flags = FTS5
20250 49 4e 44 45 58 5f 51 55 45 52 59 5f 4e 4f 4f 55  INDEX_QUERY_NOOU
20260 54 50 55 54 3b 0a 20 20 69 6e 74 20 62 54 65 72  TPUT;.  int bTer
20270 6d 57 72 69 74 74 65 6e 20 3d 20 30 3b 20 20 20  mWritten = 0;   
20280 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
20290 69 66 20 63 75 72 72 65 6e 74 20 74 65 72 6d 20  if current term 
202a0 61 6c 72 65 61 64 79 20 6f 75 74 70 75 74 20 2a  already output *
202b0 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 69 4c 76  /..  assert( iLv
202c0 6c 3c 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65  l<pStruct->nLeve
202d0 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  l );.  assert( p
202e0 4c 76 6c 2d 3e 6e 4d 65 72 67 65 3c 3d 70 4c 76  Lvl->nMerge<=pLv
202f0 6c 2d 3e 6e 53 65 67 20 29 3b 0a 0a 20 20 6d 65  l->nSeg );..  me
20300 6d 73 65 74 28 26 77 72 69 74 65 72 2c 20 30 2c  mset(&writer, 0,
20310 20 73 69 7a 65 6f 66 28 46 74 73 35 53 65 67 57   sizeof(Fts5SegW
20320 72 69 74 65 72 29 29 3b 0a 20 20 6d 65 6d 73 65  riter));.  memse
20330 74 28 26 74 65 72 6d 2c 20 30 2c 20 73 69 7a 65  t(&term, 0, size
20340 6f 66 28 46 74 73 35 42 75 66 66 65 72 29 29 3b  of(Fts5Buffer));
20350 0a 20 20 69 66 28 20 70 4c 76 6c 2d 3e 6e 4d 65  .  if( pLvl->nMe
20360 72 67 65 20 29 7b 0a 20 20 20 20 70 4c 76 6c 4f  rge ){.    pLvlO
20370 75 74 20 3d 20 26 70 53 74 72 75 63 74 2d 3e 61  ut = &pStruct->a
20380 4c 65 76 65 6c 5b 69 4c 76 6c 2b 31 5d 3b 0a 20  Level[iLvl+1];. 
20390 20 20 20 61 73 73 65 72 74 28 20 70 4c 76 6c 4f     assert( pLvlO
203a0 75 74 2d 3e 6e 53 65 67 3e 30 20 29 3b 0a 20 20  ut->nSeg>0 );.  
203b0 20 20 6e 49 6e 70 75 74 20 3d 20 70 4c 76 6c 2d    nInput = pLvl-
203c0 3e 6e 4d 65 72 67 65 3b 0a 20 20 20 20 70 53 65  >nMerge;.    pSe
203d0 67 20 3d 20 26 70 4c 76 6c 4f 75 74 2d 3e 61 53  g = &pLvlOut->aS
203e0 65 67 5b 70 4c 76 6c 4f 75 74 2d 3e 6e 53 65 67  eg[pLvlOut->nSeg
203f0 2d 31 5d 3b 0a 0a 20 20 20 20 66 74 73 35 57 72  -1];..    fts5Wr
20400 69 74 65 49 6e 69 74 28 70 2c 20 26 77 72 69 74  iteInit(p, &writ
20410 65 72 2c 20 70 53 65 67 2d 3e 69 53 65 67 69 64  er, pSeg->iSegid
20420 29 3b 0a 20 20 20 20 77 72 69 74 65 72 2e 77 72  );.    writer.wr
20430 69 74 65 72 2e 70 67 6e 6f 20 3d 20 70 53 65 67  iter.pgno = pSeg
20440 2d 3e 70 67 6e 6f 4c 61 73 74 2b 31 3b 0a 20 20  ->pgnoLast+1;.  
20450 20 20 77 72 69 74 65 72 2e 69 42 74 50 61 67 65    writer.iBtPage
20460 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   = 0;.  }else{. 
20470 20 20 20 69 6e 74 20 69 53 65 67 69 64 20 3d 20     int iSegid = 
20480 66 74 73 35 41 6c 6c 6f 63 61 74 65 53 65 67 69  fts5AllocateSegi
20490 64 28 70 2c 20 70 53 74 72 75 63 74 29 3b 0a 0a  d(p, pStruct);..
204a0 20 20 20 20 2f 2a 20 45 78 74 65 6e 64 20 74 68      /* Extend th
204b0 65 20 46 74 73 35 53 74 72 75 63 74 75 72 65 20  e Fts5Structure 
204c0 6f 62 6a 65 63 74 20 61 73 20 72 65 71 75 69 72  object as requir
204d0 65 64 20 74 6f 20 65 6e 73 75 72 65 20 74 68 65  ed to ensure the
204e0 20 6f 75 74 70 75 74 0a 20 20 20 20 2a 2a 20 73   output.    ** s
204f0 65 67 6d 65 6e 74 20 65 78 69 73 74 73 2e 20 2a  egment exists. *
20500 2f 0a 20 20 20 20 69 66 28 20 69 4c 76 6c 3d 3d  /.    if( iLvl==
20510 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 2d  pStruct->nLevel-
20520 31 20 29 7b 0a 20 20 20 20 20 20 66 74 73 35 53  1 ){.      fts5S
20530 74 72 75 63 74 75 72 65 41 64 64 4c 65 76 65 6c  tructureAddLevel
20540 28 26 70 2d 3e 72 63 2c 20 70 70 53 74 72 75 63  (&p->rc, ppStruc
20550 74 29 3b 0a 20 20 20 20 20 20 70 53 74 72 75 63  t);.      pStruc
20560 74 20 3d 20 2a 70 70 53 74 72 75 63 74 3b 0a 20  t = *ppStruct;. 
20570 20 20 20 7d 0a 20 20 20 20 66 74 73 35 53 74 72     }.    fts5Str
20580 75 63 74 75 72 65 45 78 74 65 6e 64 4c 65 76 65  uctureExtendLeve
20590 6c 28 26 70 2d 3e 72 63 2c 20 70 53 74 72 75 63  l(&p->rc, pStruc
205a0 74 2c 20 69 4c 76 6c 2b 31 2c 20 31 2c 20 30 29  t, iLvl+1, 1, 0)
205b0 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 72 63 20  ;.    if( p->rc 
205c0 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 70 4c  ) return;.    pL
205d0 76 6c 20 3d 20 26 70 53 74 72 75 63 74 2d 3e 61  vl = &pStruct->a
205e0 4c 65 76 65 6c 5b 69 4c 76 6c 5d 3b 0a 20 20 20  Level[iLvl];.   
205f0 20 70 4c 76 6c 4f 75 74 20 3d 20 26 70 53 74 72   pLvlOut = &pStr
20600 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c  uct->aLevel[iLvl
20610 2b 31 5d 3b 0a 0a 20 20 20 20 66 74 73 35 57 72  +1];..    fts5Wr
20620 69 74 65 49 6e 69 74 28 70 2c 20 26 77 72 69 74  iteInit(p, &writ
20630 65 72 2c 20 69 53 65 67 69 64 29 3b 0a 0a 20 20  er, iSegid);..  
20640 20 20 2f 2a 20 41 64 64 20 74 68 65 20 6e 65 77    /* Add the new
20650 20 73 65 67 6d 65 6e 74 20 74 6f 20 74 68 65 20   segment to the 
20660 6f 75 74 70 75 74 20 6c 65 76 65 6c 20 2a 2f 0a  output level */.
20670 20 20 20 20 70 53 65 67 20 3d 20 26 70 4c 76 6c      pSeg = &pLvl
20680 4f 75 74 2d 3e 61 53 65 67 5b 70 4c 76 6c 4f 75  Out->aSeg[pLvlOu
20690 74 2d 3e 6e 53 65 67 5d 3b 0a 20 20 20 20 70 4c  t->nSeg];.    pL
206a0 76 6c 4f 75 74 2d 3e 6e 53 65 67 2b 2b 3b 0a 20  vlOut->nSeg++;. 
206b0 20 20 20 70 53 65 67 2d 3e 70 67 6e 6f 46 69 72     pSeg->pgnoFir
206c0 73 74 20 3d 20 31 3b 0a 20 20 20 20 70 53 65 67  st = 1;.    pSeg
206d0 2d 3e 69 53 65 67 69 64 20 3d 20 69 53 65 67 69  ->iSegid = iSegi
206e0 64 3b 0a 20 20 20 20 70 53 74 72 75 63 74 2d 3e  d;.    pStruct->
206f0 6e 53 65 67 6d 65 6e 74 2b 2b 3b 0a 0a 20 20 20  nSegment++;..   
20700 20 2f 2a 20 52 65 61 64 20 69 6e 70 75 74 20 66   /* Read input f
20710 72 6f 6d 20 61 6c 6c 20 73 65 67 6d 65 6e 74 73  rom all segments
20720 20 69 6e 20 74 68 65 20 69 6e 70 75 74 20 6c 65   in the input le
20730 76 65 6c 20 2a 2f 0a 20 20 20 20 6e 49 6e 70 75  vel */.    nInpu
20740 74 20 3d 20 70 4c 76 6c 2d 3e 6e 53 65 67 3b 0a  t = pLvl->nSeg;.
20750 20 20 7d 0a 20 20 62 4f 6c 64 65 73 74 20 3d 20    }.  bOldest = 
20760 28 70 4c 76 6c 4f 75 74 2d 3e 6e 53 65 67 3d 3d  (pLvlOut->nSeg==
20770 31 20 26 26 20 70 53 74 72 75 63 74 2d 3e 6e 4c  1 && pStruct->nL
20780 65 76 65 6c 3d 3d 69 4c 76 6c 2b 32 29 3b 0a 0a  evel==iLvl+2);..
20790 20 20 61 73 73 65 72 74 28 20 69 4c 76 6c 3e 3d    assert( iLvl>=
207a0 30 20 29 3b 0a 20 20 66 6f 72 28 66 74 73 35 4d  0 );.  for(fts5M
207b0 75 6c 74 69 49 74 65 72 4e 65 77 28 70 2c 20 70  ultiIterNew(p, p
207c0 53 74 72 75 63 74 2c 20 66 6c 61 67 73 2c 20 30  Struct, flags, 0
207d0 2c 20 30 2c 20 30 2c 20 69 4c 76 6c 2c 20 6e 49  , 0, 0, iLvl, nI
207e0 6e 70 75 74 2c 20 26 70 49 74 65 72 29 3b 0a 20  nput, &pIter);. 
207f0 20 20 20 20 20 66 74 73 35 4d 75 6c 74 69 49 74       fts5MultiIt
20800 65 72 45 6f 66 28 70 2c 20 70 49 74 65 72 29 3d  erEof(p, pIter)=
20810 3d 30 3b 0a 20 20 20 20 20 20 66 74 73 35 4d 75  =0;.      fts5Mu
20820 6c 74 69 49 74 65 72 4e 65 78 74 28 70 2c 20 70  ltiIterNext(p, p
20830 49 74 65 72 2c 20 30 2c 20 30 29 0a 20 20 29 7b  Iter, 0, 0).  ){
20840 0a 20 20 20 20 46 74 73 35 53 65 67 49 74 65 72  .    Fts5SegIter
20850 20 2a 70 53 65 67 49 74 65 72 20 3d 20 26 70 49   *pSegIter = &pI
20860 74 65 72 2d 3e 61 53 65 67 5b 20 70 49 74 65 72  ter->aSeg[ pIter
20870 2d 3e 61 46 69 72 73 74 5b 31 5d 2e 69 46 69 72  ->aFirst[1].iFir
20880 73 74 20 5d 3b 0a 20 20 20 20 69 6e 74 20 6e 50  st ];.    int nP
20890 6f 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  os;             
208a0 20 20 20 20 20 20 20 20 2f 2a 20 70 6f 73 69 74          /* posit
208b0 69 6f 6e 2d 6c 69 73 74 20 73 69 7a 65 20 66 69  ion-list size fi
208c0 65 6c 64 20 76 61 6c 75 65 20 2a 2f 0a 20 20 20  eld value */.   
208d0 20 69 6e 74 20 6e 54 65 72 6d 3b 0a 20 20 20 20   int nTerm;.    
208e0 63 6f 6e 73 74 20 75 38 20 2a 70 54 65 72 6d 3b  const u8 *pTerm;
208f0 0a 0a 20 20 20 20 70 54 65 72 6d 20 3d 20 66 74  ..    pTerm = ft
20900 73 35 4d 75 6c 74 69 49 74 65 72 54 65 72 6d 28  s5MultiIterTerm(
20910 70 49 74 65 72 2c 20 26 6e 54 65 72 6d 29 3b 0a  pIter, &nTerm);.
20920 20 20 20 20 69 66 28 20 6e 54 65 72 6d 21 3d 74      if( nTerm!=t
20930 65 72 6d 2e 6e 20 7c 7c 20 6d 65 6d 63 6d 70 28  erm.n || memcmp(
20940 70 54 65 72 6d 2c 20 74 65 72 6d 2e 70 2c 20 6e  pTerm, term.p, n
20950 54 65 72 6d 29 20 29 7b 0a 20 20 20 20 20 20 69  Term) ){.      i
20960 66 28 20 70 6e 52 65 6d 20 26 26 20 77 72 69 74  f( pnRem && writ
20970 65 72 2e 6e 4c 65 61 66 57 72 69 74 74 65 6e 3e  er.nLeafWritten>
20980 6e 52 65 6d 20 29 7b 0a 20 20 20 20 20 20 20 20  nRem ){.        
20990 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
209a0 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72 53       fts5BufferS
209b0 65 74 28 26 70 2d 3e 72 63 2c 20 26 74 65 72 6d  et(&p->rc, &term
209c0 2c 20 6e 54 65 72 6d 2c 20 70 54 65 72 6d 29 3b  , nTerm, pTerm);
209d0 0a 20 20 20 20 20 20 62 54 65 72 6d 57 72 69 74  .      bTermWrit
209e0 74 65 6e 20 3d 30 3b 0a 20 20 20 20 7d 0a 0a 20  ten =0;.    }.. 
209f0 20 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20     /* Check for 
20a00 6b 65 79 20 61 6e 6e 69 68 69 6c 61 74 69 6f 6e  key annihilation
20a10 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 53 65  . */.    if( pSe
20a20 67 49 74 65 72 2d 3e 6e 50 6f 73 3d 3d 30 20 26  gIter->nPos==0 &
20a30 26 20 28 62 4f 6c 64 65 73 74 20 7c 7c 20 70 53  & (bOldest || pS
20a40 65 67 49 74 65 72 2d 3e 62 44 65 6c 3d 3d 30 29  egIter->bDel==0)
20a50 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 0a 20 20   ) continue;..  
20a60 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c    if( p->rc==SQL
20a70 49 54 45 5f 4f 4b 20 26 26 20 62 54 65 72 6d 57  ITE_OK && bTermW
20a80 72 69 74 74 65 6e 3d 3d 30 20 29 7b 0a 20 20 20  ritten==0 ){.   
20a90 20 20 20 2f 2a 20 54 68 69 73 20 69 73 20 61 20     /* This is a 
20aa0 6e 65 77 20 74 65 72 6d 2e 20 41 70 70 65 6e 64  new term. Append
20ab0 20 61 20 74 65 72 6d 20 74 6f 20 74 68 65 20 6f   a term to the o
20ac0 75 74 70 75 74 20 73 65 67 6d 65 6e 74 2e 20 2a  utput segment. *
20ad0 2f 0a 20 20 20 20 20 20 66 74 73 35 57 72 69 74  /.      fts5Writ
20ae0 65 41 70 70 65 6e 64 54 65 72 6d 28 70 2c 20 26  eAppendTerm(p, &
20af0 77 72 69 74 65 72 2c 20 6e 54 65 72 6d 2c 20 70  writer, nTerm, p
20b00 54 65 72 6d 29 3b 0a 20 20 20 20 20 20 62 54 65  Term);.      bTe
20b10 72 6d 57 72 69 74 74 65 6e 20 3d 20 31 3b 0a 20  rmWritten = 1;. 
20b20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 70 70     }..    /* App
20b30 65 6e 64 20 74 68 65 20 72 6f 77 69 64 20 74 6f  end the rowid to
20b40 20 74 68 65 20 6f 75 74 70 75 74 20 2a 2f 0a 20   the output */. 
20b50 20 20 20 2f 2a 20 57 52 49 54 45 50 4f 53 4c 49     /* WRITEPOSLI
20b60 53 54 53 49 5a 45 20 2a 2f 0a 20 20 20 20 66 74  STSIZE */.    ft
20b70 73 35 57 72 69 74 65 41 70 70 65 6e 64 52 6f 77  s5WriteAppendRow
20b80 69 64 28 70 2c 20 26 77 72 69 74 65 72 2c 20 66  id(p, &writer, f
20b90 74 73 35 4d 75 6c 74 69 49 74 65 72 52 6f 77 69  ts5MultiIterRowi
20ba0 64 28 70 49 74 65 72 29 29 3b 0a 0a 20 20 20 20  d(pIter));..    
20bb0 69 66 28 20 65 44 65 74 61 69 6c 3d 3d 46 54 53  if( eDetail==FTS
20bc0 35 5f 44 45 54 41 49 4c 5f 4e 4f 4e 45 20 29 7b  5_DETAIL_NONE ){
20bd0 0a 20 20 20 20 20 20 69 66 28 20 70 53 65 67 49  .      if( pSegI
20be0 74 65 72 2d 3e 62 44 65 6c 20 29 7b 0a 20 20 20  ter->bDel ){.   
20bf0 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72 41       fts5BufferA
20c00 70 70 65 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e  ppendVarint(&p->
20c10 72 63 2c 20 26 77 72 69 74 65 72 2e 77 72 69 74  rc, &writer.writ
20c20 65 72 2e 62 75 66 2c 20 30 29 3b 0a 20 20 20 20  er.buf, 0);.    
20c30 20 20 20 20 69 66 28 20 70 53 65 67 49 74 65 72      if( pSegIter
20c40 2d 3e 6e 50 6f 73 3e 30 20 29 7b 0a 20 20 20 20  ->nPos>0 ){.    
20c50 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72        fts5Buffer
20c60 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26 70 2d  AppendVarint(&p-
20c70 3e 72 63 2c 20 26 77 72 69 74 65 72 2e 77 72 69  >rc, &writer.wri
20c80 74 65 72 2e 62 75 66 2c 20 30 29 3b 0a 20 20 20  ter.buf, 0);.   
20c90 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
20ca0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
20cb0 2f 2a 20 41 70 70 65 6e 64 20 74 68 65 20 70 6f  /* Append the po
20cc0 73 69 74 69 6f 6e 2d 6c 69 73 74 20 64 61 74 61  sition-list data
20cd0 20 74 6f 20 74 68 65 20 6f 75 74 70 75 74 20 2a   to the output *
20ce0 2f 0a 20 20 20 20 20 20 6e 50 6f 73 20 3d 20 70  /.      nPos = p
20cf0 53 65 67 49 74 65 72 2d 3e 6e 50 6f 73 2a 32 20  SegIter->nPos*2 
20d00 2b 20 70 53 65 67 49 74 65 72 2d 3e 62 44 65 6c  + pSegIter->bDel
20d10 3b 0a 20 20 20 20 20 20 66 74 73 35 42 75 66 66  ;.      fts5Buff
20d20 65 72 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26  erAppendVarint(&
20d30 70 2d 3e 72 63 2c 20 26 77 72 69 74 65 72 2e 77  p->rc, &writer.w
20d40 72 69 74 65 72 2e 62 75 66 2c 20 6e 50 6f 73 29  riter.buf, nPos)
20d50 3b 0a 20 20 20 20 20 20 66 74 73 35 43 68 75 6e  ;.      fts5Chun
20d60 6b 49 74 65 72 61 74 65 28 70 2c 20 70 53 65 67  kIterate(p, pSeg
20d70 49 74 65 72 2c 20 28 76 6f 69 64 2a 29 26 77 72  Iter, (void*)&wr
20d80 69 74 65 72 2c 20 66 74 73 35 4d 65 72 67 65 43  iter, fts5MergeC
20d90 68 75 6e 6b 43 61 6c 6c 62 61 63 6b 29 3b 0a 20  hunkCallback);. 
20da0 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46     }.  }..  /* F
20db0 6c 75 73 68 20 74 68 65 20 6c 61 73 74 20 6c 65  lush the last le
20dc0 61 66 20 70 61 67 65 20 74 6f 20 64 69 73 6b 2e  af page to disk.
20dd0 20 53 65 74 20 74 68 65 20 6f 75 74 70 75 74 20   Set the output 
20de0 73 65 67 6d 65 6e 74 20 62 2d 74 72 65 65 20 68  segment b-tree h
20df0 65 69 67 68 74 0a 20 20 2a 2a 20 61 6e 64 20 6c  eight.  ** and l
20e00 61 73 74 20 6c 65 61 66 20 70 61 67 65 20 6e 75  ast leaf page nu
20e10 6d 62 65 72 20 61 74 20 74 68 65 20 73 61 6d 65  mber at the same
20e20 20 74 69 6d 65 2e 20 20 2a 2f 0a 20 20 66 74 73   time.  */.  fts
20e30 35 57 72 69 74 65 46 69 6e 69 73 68 28 70 2c 20  5WriteFinish(p, 
20e40 26 77 72 69 74 65 72 2c 20 26 70 53 65 67 2d 3e  &writer, &pSeg->
20e50 70 67 6e 6f 4c 61 73 74 29 3b 0a 0a 20 20 69 66  pgnoLast);..  if
20e60 28 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 45  ( fts5MultiIterE
20e70 6f 66 28 70 2c 20 70 49 74 65 72 29 20 29 7b 0a  of(p, pIter) ){.
20e80 20 20 20 20 69 6e 74 20 69 3b 0a 0a 20 20 20 20      int i;..    
20e90 2f 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 72 65  /* Remove the re
20ea0 64 75 6e 64 61 6e 74 20 73 65 67 6d 65 6e 74 73  dundant segments
20eb0 20 66 72 6f 6d 20 74 68 65 20 25 5f 64 61 74 61   from the %_data
20ec0 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 66 6f   table */.    fo
20ed0 72 28 69 3d 30 3b 20 69 3c 6e 49 6e 70 75 74 3b  r(i=0; i<nInput;
20ee0 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 66 74 73   i++){.      fts
20ef0 35 44 61 74 61 52 65 6d 6f 76 65 53 65 67 6d 65  5DataRemoveSegme
20f00 6e 74 28 70 2c 20 70 4c 76 6c 2d 3e 61 53 65 67  nt(p, pLvl->aSeg
20f10 5b 69 5d 2e 69 53 65 67 69 64 29 3b 0a 20 20 20  [i].iSegid);.   
20f20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 65 6d 6f 76   }..    /* Remov
20f30 65 20 74 68 65 20 72 65 64 75 6e 64 61 6e 74 20  e the redundant 
20f40 73 65 67 6d 65 6e 74 73 20 66 72 6f 6d 20 74 68  segments from th
20f50 65 20 69 6e 70 75 74 20 6c 65 76 65 6c 20 2a 2f  e input level */
20f60 0a 20 20 20 20 69 66 28 20 70 4c 76 6c 2d 3e 6e  .    if( pLvl->n
20f70 53 65 67 21 3d 6e 49 6e 70 75 74 20 29 7b 0a 20  Seg!=nInput ){. 
20f80 20 20 20 20 20 69 6e 74 20 6e 4d 6f 76 65 20 3d       int nMove =
20f90 20 28 70 4c 76 6c 2d 3e 6e 53 65 67 20 2d 20 6e   (pLvl->nSeg - n
20fa0 49 6e 70 75 74 29 20 2a 20 73 69 7a 65 6f 66 28  Input) * sizeof(
20fb0 46 74 73 35 53 74 72 75 63 74 75 72 65 53 65 67  Fts5StructureSeg
20fc0 6d 65 6e 74 29 3b 0a 20 20 20 20 20 20 6d 65 6d  ment);.      mem
20fd0 6d 6f 76 65 28 70 4c 76 6c 2d 3e 61 53 65 67 2c  move(pLvl->aSeg,
20fe0 20 26 70 4c 76 6c 2d 3e 61 53 65 67 5b 6e 49 6e   &pLvl->aSeg[nIn
20ff0 70 75 74 5d 2c 20 6e 4d 6f 76 65 29 3b 0a 20 20  put], nMove);.  
21000 20 20 7d 0a 20 20 20 20 70 53 74 72 75 63 74 2d    }.    pStruct-
21010 3e 6e 53 65 67 6d 65 6e 74 20 2d 3d 20 6e 49 6e  >nSegment -= nIn
21020 70 75 74 3b 0a 20 20 20 20 70 4c 76 6c 2d 3e 6e  put;.    pLvl->n
21030 53 65 67 20 2d 3d 20 6e 49 6e 70 75 74 3b 0a 20  Seg -= nInput;. 
21040 20 20 20 70 4c 76 6c 2d 3e 6e 4d 65 72 67 65 20     pLvl->nMerge 
21050 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 70 53 65  = 0;.    if( pSe
21060 67 2d 3e 70 67 6e 6f 4c 61 73 74 3d 3d 30 20 29  g->pgnoLast==0 )
21070 7b 0a 20 20 20 20 20 20 70 4c 76 6c 4f 75 74 2d  {.      pLvlOut-
21080 3e 6e 53 65 67 2d 2d 3b 0a 20 20 20 20 20 20 70  >nSeg--;.      p
21090 53 74 72 75 63 74 2d 3e 6e 53 65 67 6d 65 6e 74  Struct->nSegment
210a0 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  --;.    }.  }els
210b0 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  e{.    assert( p
210c0 53 65 67 2d 3e 70 67 6e 6f 4c 61 73 74 3e 30 20  Seg->pgnoLast>0 
210d0 29 3b 0a 20 20 20 20 66 74 73 35 54 72 69 6d 53  );.    fts5TrimS
210e0 65 67 6d 65 6e 74 73 28 70 2c 20 70 49 74 65 72  egments(p, pIter
210f0 29 3b 0a 20 20 20 20 70 4c 76 6c 2d 3e 6e 4d 65  );.    pLvl->nMe
21100 72 67 65 20 3d 20 6e 49 6e 70 75 74 3b 0a 20 20  rge = nInput;.  
21110 7d 0a 0a 20 20 66 74 73 35 4d 75 6c 74 69 49 74  }..  fts5MultiIt
21120 65 72 46 72 65 65 28 70 49 74 65 72 29 3b 0a 20  erFree(pIter);. 
21130 20 66 74 73 35 42 75 66 66 65 72 46 72 65 65 28   fts5BufferFree(
21140 26 74 65 72 6d 29 3b 0a 20 20 69 66 28 20 70 6e  &term);.  if( pn
21150 52 65 6d 20 29 20 2a 70 6e 52 65 6d 20 2d 3d 20  Rem ) *pnRem -= 
21160 77 72 69 74 65 72 2e 6e 4c 65 61 66 57 72 69 74  writer.nLeafWrit
21170 74 65 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 6f  ten;.}../*.** Do
21180 20 75 70 20 74 6f 20 6e 50 67 20 70 61 67 65 73   up to nPg pages
21190 20 6f 66 20 61 75 74 6f 6d 65 72 67 65 20 77 6f   of automerge wo
211a0 72 6b 20 6f 6e 20 74 68 65 20 69 6e 64 65 78 2e  rk on the index.
211b0 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72  .**.** Return tr
211c0 75 65 20 69 66 20 61 6e 79 20 63 68 61 6e 67 65  ue if any change
211d0 73 20 77 65 72 65 20 61 63 74 75 61 6c 6c 79 20  s were actually 
211e0 6d 61 64 65 2c 20 6f 72 20 66 61 6c 73 65 20 6f  made, or false o
211f0 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 73 74 61  therwise..*/.sta
21200 74 69 63 20 69 6e 74 20 66 74 73 35 49 6e 64 65  tic int fts5Inde
21210 78 4d 65 72 67 65 28 0a 20 20 46 74 73 35 49 6e  xMerge(.  Fts5In
21220 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20 20  dex *p,         
21230 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53            /* FTS
21240 35 20 62 61 63 6b 65 6e 64 20 6f 62 6a 65 63 74  5 backend object
21250 20 2a 2f 0a 20 20 46 74 73 35 53 74 72 75 63 74   */.  Fts5Struct
21260 75 72 65 20 2a 2a 70 70 53 74 72 75 63 74 2c 20  ure **ppStruct, 
21270 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a        /* IN/OUT:
21280 20 43 75 72 72 65 6e 74 20 73 74 72 75 63 74 75   Current structu
21290 72 65 20 6f 66 20 69 6e 64 65 78 20 2a 2f 0a 20  re of index */. 
212a0 20 69 6e 74 20 6e 50 67 2c 20 20 20 20 20 20 20   int nPg,       
212b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
212c0 20 2f 2a 20 50 61 67 65 73 20 6f 66 20 77 6f 72   /* Pages of wor
212d0 6b 20 74 6f 20 64 6f 20 2a 2f 0a 20 20 69 6e 74  k to do */.  int
212e0 20 6e 4d 69 6e 20 20 20 20 20 20 20 20 20 20 20   nMin           
212f0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
21300 4d 69 6e 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f  Minimum number o
21310 66 20 73 65 67 6d 65 6e 74 73 20 74 6f 20 6d 65  f segments to me
21320 72 67 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  rge */.){.  int 
21330 6e 52 65 6d 20 3d 20 6e 50 67 3b 0a 20 20 69 6e  nRem = nPg;.  in
21340 74 20 62 52 65 74 20 3d 20 30 3b 0a 20 20 46 74  t bRet = 0;.  Ft
21350 73 35 53 74 72 75 63 74 75 72 65 20 2a 70 53 74  s5Structure *pSt
21360 72 75 63 74 20 3d 20 2a 70 70 53 74 72 75 63 74  ruct = *ppStruct
21370 3b 0a 20 20 77 68 69 6c 65 28 20 6e 52 65 6d 3e  ;.  while( nRem>
21380 30 20 26 26 20 70 2d 3e 72 63 3d 3d 53 51 4c 49  0 && p->rc==SQLI
21390 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 6e 74  TE_OK ){.    int
213a0 20 69 4c 76 6c 3b 20 20 20 20 20 20 20 20 20 20   iLvl;          
213b0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 20 69           /* To i
213c0 74 65 72 61 74 65 20 74 68 72 6f 75 67 68 20 6c  terate through l
213d0 65 76 65 6c 73 20 2a 2f 0a 20 20 20 20 69 6e 74  evels */.    int
213e0 20 69 42 65 73 74 4c 76 6c 20 3d 20 30 3b 20 20   iBestLvl = 0;  
213f0 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 76 65           /* Leve
21400 6c 20 6f 66 66 65 72 69 6e 67 20 74 68 65 20 6d  l offering the m
21410 6f 73 74 20 69 6e 70 75 74 20 73 65 67 6d 65 6e  ost input segmen
21420 74 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 42  ts */.    int nB
21430 65 73 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20  est = 0;        
21440 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
21450 6f 66 20 69 6e 70 75 74 20 73 65 67 6d 65 6e 74  of input segment
21460 73 20 6f 6e 20 62 65 73 74 20 6c 65 76 65 6c 20  s on best level 
21470 2a 2f 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20 69  */..    /* Set i
21480 42 65 73 74 4c 76 6c 20 74 6f 20 74 68 65 20 6c  BestLvl to the l
21490 65 76 65 6c 20 74 6f 20 72 65 61 64 20 69 6e 70  evel to read inp
214a0 75 74 20 73 65 67 6d 65 6e 74 73 20 66 72 6f 6d  ut segments from
214b0 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28  . */.    assert(
214c0 20 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c   pStruct->nLevel
214d0 3e 30 20 29 3b 0a 20 20 20 20 66 6f 72 28 69 4c  >0 );.    for(iL
214e0 76 6c 3d 30 3b 20 69 4c 76 6c 3c 70 53 74 72 75  vl=0; iLvl<pStru
214f0 63 74 2d 3e 6e 4c 65 76 65 6c 3b 20 69 4c 76 6c  ct->nLevel; iLvl
21500 2b 2b 29 7b 0a 20 20 20 20 20 20 46 74 73 35 53  ++){.      Fts5S
21510 74 72 75 63 74 75 72 65 4c 65 76 65 6c 20 2a 70  tructureLevel *p
21520 4c 76 6c 20 3d 20 26 70 53 74 72 75 63 74 2d 3e  Lvl = &pStruct->
21530 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d 3b 0a 20 20  aLevel[iLvl];.  
21540 20 20 20 20 69 66 28 20 70 4c 76 6c 2d 3e 6e 4d      if( pLvl->nM
21550 65 72 67 65 20 29 7b 0a 20 20 20 20 20 20 20 20  erge ){.        
21560 69 66 28 20 70 4c 76 6c 2d 3e 6e 4d 65 72 67 65  if( pLvl->nMerge
21570 3e 6e 42 65 73 74 20 29 7b 0a 20 20 20 20 20 20  >nBest ){.      
21580 20 20 20 20 69 42 65 73 74 4c 76 6c 20 3d 20 69      iBestLvl = i
21590 4c 76 6c 3b 0a 20 20 20 20 20 20 20 20 20 20 6e  Lvl;.          n
215a0 42 65 73 74 20 3d 20 70 4c 76 6c 2d 3e 6e 4d 65  Best = pLvl->nMe
215b0 72 67 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  rge;.        }. 
215c0 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
215d0 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
215e0 70 4c 76 6c 2d 3e 6e 53 65 67 3e 6e 42 65 73 74  pLvl->nSeg>nBest
215f0 20 29 7b 0a 20 20 20 20 20 20 20 20 6e 42 65 73   ){.        nBes
21600 74 20 3d 20 70 4c 76 6c 2d 3e 6e 53 65 67 3b 0a  t = pLvl->nSeg;.
21610 20 20 20 20 20 20 20 20 69 42 65 73 74 4c 76 6c          iBestLvl
21620 20 3d 20 69 4c 76 6c 3b 0a 20 20 20 20 20 20 7d   = iLvl;.      }
21630 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49  .    }..    /* I
21640 66 20 6e 42 65 73 74 20 69 73 20 73 74 69 6c 6c  f nBest is still
21650 20 30 2c 20 74 68 65 6e 20 74 68 65 20 69 6e 64   0, then the ind
21660 65 78 20 6d 75 73 74 20 62 65 20 65 6d 70 74 79  ex must be empty
21670 2e 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  . */.#ifdef SQLI
21680 54 45 5f 44 45 42 55 47 0a 20 20 20 20 66 6f 72  TE_DEBUG.    for
21690 28 69 4c 76 6c 3d 30 3b 20 6e 42 65 73 74 3d 3d  (iLvl=0; nBest==
216a0 30 20 26 26 20 69 4c 76 6c 3c 70 53 74 72 75 63  0 && iLvl<pStruc
216b0 74 2d 3e 6e 4c 65 76 65 6c 3b 20 69 4c 76 6c 2b  t->nLevel; iLvl+
216c0 2b 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  +){.      assert
216d0 28 20 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65  ( pStruct->aLeve
216e0 6c 5b 69 4c 76 6c 5d 2e 6e 53 65 67 3d 3d 30 20  l[iLvl].nSeg==0 
216f0 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  );.    }.#endif.
21700 0a 20 20 20 20 69 66 28 20 6e 42 65 73 74 3c 6e  .    if( nBest<n
21710 4d 69 6e 20 26 26 20 70 53 74 72 75 63 74 2d 3e  Min && pStruct->
21720 61 4c 65 76 65 6c 5b 69 42 65 73 74 4c 76 6c 5d  aLevel[iBestLvl]
21730 2e 6e 4d 65 72 67 65 3d 3d 30 20 29 7b 0a 20 20  .nMerge==0 ){.  
21740 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
21750 0a 20 20 20 20 62 52 65 74 20 3d 20 31 3b 0a 20  .    bRet = 1;. 
21760 20 20 20 66 74 73 35 49 6e 64 65 78 4d 65 72 67     fts5IndexMerg
21770 65 4c 65 76 65 6c 28 70 2c 20 26 70 53 74 72 75  eLevel(p, &pStru
21780 63 74 2c 20 69 42 65 73 74 4c 76 6c 2c 20 26 6e  ct, iBestLvl, &n
21790 52 65 6d 29 3b 0a 20 20 20 20 69 66 28 20 70 2d  Rem);.    if( p-
217a0 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26  >rc==SQLITE_OK &
217b0 26 20 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65  & pStruct->aLeve
217c0 6c 5b 69 42 65 73 74 4c 76 6c 5d 2e 6e 4d 65 72  l[iBestLvl].nMer
217d0 67 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 66  ge==0 ){.      f
217e0 74 73 35 53 74 72 75 63 74 75 72 65 50 72 6f 6d  ts5StructureProm
217f0 6f 74 65 28 70 2c 20 69 42 65 73 74 4c 76 6c 2b  ote(p, iBestLvl+
21800 31 2c 20 70 53 74 72 75 63 74 29 3b 0a 20 20 20  1, pStruct);.   
21810 20 7d 0a 20 20 7d 0a 20 20 2a 70 70 53 74 72 75   }.  }.  *ppStru
21820 63 74 20 3d 20 70 53 74 72 75 63 74 3b 0a 20 20  ct = pStruct;.  
21830 72 65 74 75 72 6e 20 62 52 65 74 3b 0a 7d 0a 0a  return bRet;.}..
21840 2f 2a 0a 2a 2a 20 41 20 74 6f 74 61 6c 20 6f 66  /*.** A total of
21850 20 6e 4c 65 61 66 20 6c 65 61 66 20 70 61 67 65   nLeaf leaf page
21860 73 20 6f 66 20 64 61 74 61 20 68 61 73 20 6a 75  s of data has ju
21870 73 74 20 62 65 65 6e 20 66 6c 75 73 68 65 64 20  st been flushed 
21880 74 6f 20 61 20 6c 65 76 65 6c 2d 30 0a 2a 2a 20  to a level-0.** 
21890 73 65 67 6d 65 6e 74 2e 20 54 68 69 73 20 66 75  segment. This fu
218a0 6e 63 74 69 6f 6e 20 75 70 64 61 74 65 73 20 74  nction updates t
218b0 68 65 20 77 72 69 74 65 2d 63 6f 75 6e 74 65 72  he write-counter
218c0 20 61 63 63 6f 72 64 69 6e 67 6c 79 20 61 6e 64   accordingly and
218d0 2c 20 69 66 0a 2a 2a 20 6e 65 63 65 73 73 61 72  , if.** necessar
218e0 79 2c 20 70 65 72 66 6f 72 6d 73 20 69 6e 63 72  y, performs incr
218f0 65 6d 65 6e 74 61 6c 20 6d 65 72 67 65 20 77 6f  emental merge wo
21900 72 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  rk..**.** If an 
21910 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 73 65  error occurs, se
21920 74 20 74 68 65 20 46 74 73 35 49 6e 64 65 78 2e  t the Fts5Index.
21930 72 63 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 49  rc error code. I
21940 66 20 61 6e 20 65 72 72 6f 72 20 68 61 73 20 0a  f an error has .
21950 2a 2a 20 61 6c 72 65 61 64 79 20 6f 63 63 75 72  ** already occur
21960 72 65 64 2c 20 74 68 69 73 20 66 75 6e 63 74 69  red, this functi
21970 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a  on is a no-op..*
21980 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  /.static void ft
21990 73 35 49 6e 64 65 78 41 75 74 6f 6d 65 72 67 65  s5IndexAutomerge
219a0 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70  (.  Fts5Index *p
219b0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
219c0 20 20 20 20 2f 2a 20 46 54 53 35 20 62 61 63 6b      /* FTS5 back
219d0 65 6e 64 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  end object */.  
219e0 46 74 73 35 53 74 72 75 63 74 75 72 65 20 2a 2a  Fts5Structure **
219f0 70 70 53 74 72 75 63 74 2c 20 20 20 20 20 20 20  ppStruct,       
21a00 2f 2a 20 49 4e 2f 4f 55 54 3a 20 43 75 72 72 65  /* IN/OUT: Curre
21a10 6e 74 20 73 74 72 75 63 74 75 72 65 20 6f 66 20  nt structure of 
21a20 69 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20 6e  index */.  int n
21a30 4c 65 61 66 20 20 20 20 20 20 20 20 20 20 20 20  Leaf            
21a40 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
21a50 6d 62 65 72 20 6f 66 20 6f 75 74 70 75 74 20 6c  mber of output l
21a60 65 61 76 65 73 20 6a 75 73 74 20 77 72 69 74 74  eaves just writt
21a70 65 6e 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 70  en */.){.  if( p
21a80 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
21a90 26 26 20 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e 6e  && p->pConfig->n
21aa0 41 75 74 6f 6d 65 72 67 65 3e 30 20 29 7b 0a 20  Automerge>0 ){. 
21ab0 20 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65     Fts5Structure
21ac0 20 2a 70 53 74 72 75 63 74 20 3d 20 2a 70 70 53   *pStruct = *ppS
21ad0 74 72 75 63 74 3b 0a 20 20 20 20 75 36 34 20 6e  truct;.    u64 n
21ae0 57 72 69 74 65 3b 20 20 20 20 20 20 20 20 20 20  Write;          
21af0 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 69 74           /* Init
21b00 69 61 6c 20 76 61 6c 75 65 20 6f 66 20 77 72 69  ial value of wri
21b10 74 65 2d 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  te-counter */.  
21b20 20 20 69 6e 74 20 6e 57 6f 72 6b 3b 20 20 20 20    int nWork;    
21b30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21b40 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 77 6f 72  /* Number of wor
21b50 6b 2d 71 75 61 6e 74 61 20 74 6f 20 70 65 72 66  k-quanta to perf
21b60 6f 72 6d 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e  orm */.    int n
21b70 52 65 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20  Rem;            
21b80 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
21b90 65 72 20 6f 66 20 6c 65 61 66 20 70 61 67 65 73  er of leaf pages
21ba0 20 6c 65 66 74 20 74 6f 20 77 72 69 74 65 20 2a   left to write *
21bb0 2f 0a 0a 20 20 20 20 2f 2a 20 55 70 64 61 74 65  /..    /* Update
21bc0 20 74 68 65 20 77 72 69 74 65 2d 63 6f 75 6e 74   the write-count
21bd0 65 72 2e 20 57 68 69 6c 65 20 64 6f 69 6e 67 20  er. While doing 
21be0 73 6f 2c 20 73 65 74 20 6e 57 6f 72 6b 2e 20 2a  so, set nWork. *
21bf0 2f 0a 20 20 20 20 6e 57 72 69 74 65 20 3d 20 70  /.    nWrite = p
21c00 53 74 72 75 63 74 2d 3e 6e 57 72 69 74 65 43 6f  Struct->nWriteCo
21c10 75 6e 74 65 72 3b 0a 20 20 20 20 6e 57 6f 72 6b  unter;.    nWork
21c20 20 3d 20 28 69 6e 74 29 28 28 28 6e 57 72 69 74   = (int)(((nWrit
21c30 65 20 2b 20 6e 4c 65 61 66 29 20 2f 20 70 2d 3e  e + nLeaf) / p->
21c40 6e 57 6f 72 6b 55 6e 69 74 29 20 2d 20 28 6e 57  nWorkUnit) - (nW
21c50 72 69 74 65 20 2f 20 70 2d 3e 6e 57 6f 72 6b 55  rite / p->nWorkU
21c60 6e 69 74 29 29 3b 0a 20 20 20 20 70 53 74 72 75  nit));.    pStru
21c70 63 74 2d 3e 6e 57 72 69 74 65 43 6f 75 6e 74 65  ct->nWriteCounte
21c80 72 20 2b 3d 20 6e 4c 65 61 66 3b 0a 20 20 20 20  r += nLeaf;.    
21c90 6e 52 65 6d 20 3d 20 28 69 6e 74 29 28 70 2d 3e  nRem = (int)(p->
21ca0 6e 57 6f 72 6b 55 6e 69 74 20 2a 20 6e 57 6f 72  nWorkUnit * nWor
21cb0 6b 20 2a 20 70 53 74 72 75 63 74 2d 3e 6e 4c 65  k * pStruct->nLe
21cc0 76 65 6c 29 3b 0a 0a 20 20 20 20 66 74 73 35 49  vel);..    fts5I
21cd0 6e 64 65 78 4d 65 72 67 65 28 70 2c 20 70 70 53  ndexMerge(p, ppS
21ce0 74 72 75 63 74 2c 20 6e 52 65 6d 2c 20 70 2d 3e  truct, nRem, p->
21cf0 70 43 6f 6e 66 69 67 2d 3e 6e 41 75 74 6f 6d 65  pConfig->nAutome
21d00 72 67 65 29 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61  rge);.  }.}..sta
21d10 74 69 63 20 76 6f 69 64 20 66 74 73 35 49 6e 64  tic void fts5Ind
21d20 65 78 43 72 69 73 69 73 6d 65 72 67 65 28 0a 20  exCrisismerge(. 
21d30 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 20   Fts5Index *p,  
21d40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21d50 20 2f 2a 20 46 54 53 35 20 62 61 63 6b 65 6e 64   /* FTS5 backend
21d60 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 46 74 73   object */.  Fts
21d70 35 53 74 72 75 63 74 75 72 65 20 2a 2a 70 70 53  5Structure **ppS
21d80 74 72 75 63 74 20 20 20 20 20 20 20 20 2f 2a 20  truct        /* 
21d90 49 4e 2f 4f 55 54 3a 20 43 75 72 72 65 6e 74 20  IN/OUT: Current 
21da0 73 74 72 75 63 74 75 72 65 20 6f 66 20 69 6e 64  structure of ind
21db0 65 78 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74  ex */.){.  const
21dc0 20 69 6e 74 20 6e 43 72 69 73 69 73 20 3d 20 70   int nCrisis = p
21dd0 2d 3e 70 43 6f 6e 66 69 67 2d 3e 6e 43 72 69 73  ->pConfig->nCris
21de0 69 73 4d 65 72 67 65 3b 0a 20 20 46 74 73 35 53  isMerge;.  Fts5S
21df0 74 72 75 63 74 75 72 65 20 2a 70 53 74 72 75 63  tructure *pStruc
21e00 74 20 3d 20 2a 70 70 53 74 72 75 63 74 3b 0a 20  t = *ppStruct;. 
21e10 20 69 6e 74 20 69 4c 76 6c 20 3d 20 30 3b 0a 0a   int iLvl = 0;..
21e20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72 63 21    assert( p->rc!
21e30 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 53  =SQLITE_OK || pS
21e40 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 3e 30 20  truct->nLevel>0 
21e50 29 3b 0a 20 20 77 68 69 6c 65 28 20 70 2d 3e 72  );.  while( p->r
21e60 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
21e70 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b  pStruct->aLevel[
21e80 69 4c 76 6c 5d 2e 6e 53 65 67 3e 3d 6e 43 72 69  iLvl].nSeg>=nCri
21e90 73 69 73 20 29 7b 0a 20 20 20 20 66 74 73 35 49  sis ){.    fts5I
21ea0 6e 64 65 78 4d 65 72 67 65 4c 65 76 65 6c 28 70  ndexMergeLevel(p
21eb0 2c 20 26 70 53 74 72 75 63 74 2c 20 69 4c 76 6c  , &pStruct, iLvl
21ec0 2c 20 30 29 3b 0a 20 20 20 20 61 73 73 65 72 74  , 0);.    assert
21ed0 28 20 70 2d 3e 72 63 21 3d 53 51 4c 49 54 45 5f  ( p->rc!=SQLITE_
21ee0 4f 4b 20 7c 7c 20 70 53 74 72 75 63 74 2d 3e 6e  OK || pStruct->n
21ef0 4c 65 76 65 6c 3e 28 69 4c 76 6c 2b 31 29 20 29  Level>(iLvl+1) )
21f00 3b 0a 20 20 20 20 66 74 73 35 53 74 72 75 63 74  ;.    fts5Struct
21f10 75 72 65 50 72 6f 6d 6f 74 65 28 70 2c 20 69 4c  urePromote(p, iL
21f20 76 6c 2b 31 2c 20 70 53 74 72 75 63 74 29 3b 0a  vl+1, pStruct);.
21f30 20 20 20 20 69 4c 76 6c 2b 2b 3b 0a 20 20 7d 0a      iLvl++;.  }.
21f40 20 20 2a 70 70 53 74 72 75 63 74 20 3d 20 70 53    *ppStruct = pS
21f50 74 72 75 63 74 3b 0a 7d 0a 0a 73 74 61 74 69 63  truct;.}..static
21f60 20 69 6e 74 20 66 74 73 35 49 6e 64 65 78 52 65   int fts5IndexRe
21f70 74 75 72 6e 28 46 74 73 35 49 6e 64 65 78 20 2a  turn(Fts5Index *
21f80 70 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 70  p){.  int rc = p
21f90 2d 3e 72 63 3b 0a 20 20 70 2d 3e 72 63 20 3d 20  ->rc;.  p->rc = 
21fa0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 72 65 74  SQLITE_OK;.  ret
21fb0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 74 79 70 65 64  urn rc;.}..typed
21fc0 65 66 20 73 74 72 75 63 74 20 46 74 73 35 46 6c  ef struct Fts5Fl
21fd0 75 73 68 43 74 78 20 46 74 73 35 46 6c 75 73 68  ushCtx Fts5Flush
21fe0 43 74 78 3b 0a 73 74 72 75 63 74 20 46 74 73 35  Ctx;.struct Fts5
21ff0 46 6c 75 73 68 43 74 78 20 7b 0a 20 20 46 74 73  FlushCtx {.  Fts
22000 35 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20  5Index *pIdx;.  
22010 46 74 73 35 53 65 67 57 72 69 74 65 72 20 77 72  Fts5SegWriter wr
22020 69 74 65 72 3b 20 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  iter; .};../*.**
22030 20 42 75 66 66 65 72 20 61 42 75 66 5b 5d 20 63   Buffer aBuf[] c
22040 6f 6e 74 61 69 6e 73 20 61 20 6c 69 73 74 20 6f  ontains a list o
22050 66 20 76 61 72 69 6e 74 73 2c 20 61 6c 6c 20 73  f varints, all s
22060 6d 61 6c 6c 20 65 6e 6f 75 67 68 20 74 6f 20 66  mall enough to f
22070 69 74 0a 2a 2a 20 69 6e 20 61 20 33 32 2d 62 69  it.** in a 32-bi
22080 74 20 69 6e 74 65 67 65 72 2e 20 52 65 74 75 72  t integer. Retur
22090 6e 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  n the size of th
220a0 65 20 6c 61 72 67 65 73 74 20 70 72 65 66 69 78  e largest prefix
220b0 20 6f 66 20 74 68 69 73 20 0a 2a 2a 20 6c 69 73   of this .** lis
220c0 74 20 6e 4d 61 78 20 62 79 74 65 73 20 6f 72 20  t nMax bytes or 
220d0 6c 65 73 73 20 69 6e 20 73 69 7a 65 2e 0a 2a 2f  less in size..*/
220e0 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 35  .static int fts5
220f0 50 6f 73 6c 69 73 74 50 72 65 66 69 78 28 63 6f  PoslistPrefix(co
22100 6e 73 74 20 75 38 20 2a 61 42 75 66 2c 20 69 6e  nst u8 *aBuf, in
22110 74 20 6e 4d 61 78 29 7b 0a 20 20 69 6e 74 20 72  t nMax){.  int r
22120 65 74 3b 0a 20 20 75 33 32 20 64 75 6d 6d 79 3b  et;.  u32 dummy;
22130 0a 20 20 72 65 74 20 3d 20 66 74 73 35 47 65 74  .  ret = fts5Get
22140 56 61 72 69 6e 74 33 32 28 61 42 75 66 2c 20 64  Varint32(aBuf, d
22150 75 6d 6d 79 29 3b 0a 20 20 69 66 28 20 72 65 74  ummy);.  if( ret
22160 3c 6e 4d 61 78 20 29 7b 0a 20 20 20 20 77 68 69  <nMax ){.    whi
22170 6c 65 28 20 31 20 29 7b 0a 20 20 20 20 20 20 69  le( 1 ){.      i
22180 6e 74 20 69 20 3d 20 66 74 73 35 47 65 74 56 61  nt i = fts5GetVa
22190 72 69 6e 74 33 32 28 26 61 42 75 66 5b 72 65 74  rint32(&aBuf[ret
221a0 5d 2c 20 64 75 6d 6d 79 29 3b 0a 20 20 20 20 20  ], dummy);.     
221b0 20 69 66 28 20 28 72 65 74 20 2b 20 69 29 20 3e   if( (ret + i) >
221c0 20 6e 4d 61 78 20 29 20 62 72 65 61 6b 3b 0a 20   nMax ) break;. 
221d0 20 20 20 20 20 72 65 74 20 2b 3d 20 69 3b 0a 20       ret += i;. 
221e0 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
221f0 6e 20 72 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  n ret;.}../*.** 
22200 46 6c 75 73 68 20 74 68 65 20 63 6f 6e 74 65 6e  Flush the conten
22210 74 73 20 6f 66 20 69 6e 2d 6d 65 6d 6f 72 79 20  ts of in-memory 
22220 68 61 73 68 20 74 61 62 6c 65 20 69 48 61 73 68  hash table iHash
22230 20 74 6f 20 61 20 6e 65 77 20 6c 65 76 65 6c 2d   to a new level-
22240 30 20 0a 2a 2a 20 73 65 67 6d 65 6e 74 20 6f 6e  0 .** segment on
22250 20 64 69 73 6b 2e 20 41 6c 73 6f 20 75 70 64 61   disk. Also upda
22260 74 65 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e  te the correspon
22270 64 69 6e 67 20 73 74 72 75 63 74 75 72 65 20 72  ding structure r
22280 65 63 6f 72 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ecord..**.** If 
22290 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  an error occurs,
222a0 20 73 65 74 20 74 68 65 20 46 74 73 35 49 6e 64   set the Fts5Ind
222b0 65 78 2e 72 63 20 65 72 72 6f 72 20 63 6f 64 65  ex.rc error code
222c0 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20 68 61  . If an error ha
222d0 73 20 0a 2a 2a 20 61 6c 72 65 61 64 79 20 6f 63  s .** already oc
222e0 63 75 72 72 65 64 2c 20 74 68 69 73 20 66 75 6e  curred, this fun
222f0 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70  ction is a no-op
22300 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
22310 20 66 74 73 35 46 6c 75 73 68 4f 6e 65 48 61 73   fts5FlushOneHas
22320 68 28 46 74 73 35 49 6e 64 65 78 20 2a 70 29 7b  h(Fts5Index *p){
22330 0a 20 20 46 74 73 35 48 61 73 68 20 2a 70 48 61  .  Fts5Hash *pHa
22340 73 68 20 3d 20 70 2d 3e 70 48 61 73 68 3b 0a 20  sh = p->pHash;. 
22350 20 46 74 73 35 53 74 72 75 63 74 75 72 65 20 2a   Fts5Structure *
22360 70 53 74 72 75 63 74 3b 0a 20 20 69 6e 74 20 69  pStruct;.  int i
22370 53 65 67 69 64 3b 0a 20 20 69 6e 74 20 70 67 6e  Segid;.  int pgn
22380 6f 4c 61 73 74 20 3d 20 30 3b 20 20 20 20 20 20  oLast = 0;      
22390 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 61             /* La
223a0 73 74 20 6c 65 61 66 20 70 61 67 65 20 6e 75 6d  st leaf page num
223b0 62 65 72 20 69 6e 20 73 65 67 6d 65 6e 74 20 2a  ber in segment *
223c0 2f 0a 0a 20 20 2f 2a 20 4f 62 74 61 69 6e 20 61  /..  /* Obtain a
223d0 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68   reference to th
223e0 65 20 69 6e 64 65 78 20 73 74 72 75 63 74 75 72  e index structur
223f0 65 20 61 6e 64 20 61 6c 6c 6f 63 61 74 65 20 61  e and allocate a
22400 20 6e 65 77 20 73 65 67 6d 65 6e 74 2d 69 64 0a   new segment-id.
22410 20 20 2a 2a 20 66 6f 72 20 74 68 65 20 6e 65 77    ** for the new
22420 20 6c 65 76 65 6c 2d 30 20 73 65 67 6d 65 6e 74   level-0 segment
22430 2e 20 20 2a 2f 0a 20 20 70 53 74 72 75 63 74 20  .  */.  pStruct 
22440 3d 20 66 74 73 35 53 74 72 75 63 74 75 72 65 52  = fts5StructureR
22450 65 61 64 28 70 29 3b 0a 20 20 69 53 65 67 69 64  ead(p);.  iSegid
22460 20 3d 20 66 74 73 35 41 6c 6c 6f 63 61 74 65 53   = fts5AllocateS
22470 65 67 69 64 28 70 2c 20 70 53 74 72 75 63 74 29  egid(p, pStruct)
22480 3b 0a 20 20 66 74 73 35 53 74 72 75 63 74 75 72  ;.  fts5Structur
22490 65 49 6e 76 61 6c 69 64 61 74 65 28 70 29 3b 0a  eInvalidate(p);.
224a0 0a 20 20 69 66 28 20 69 53 65 67 69 64 20 29 7b  .  if( iSegid ){
224b0 0a 20 20 20 20 63 6f 6e 73 74 20 69 6e 74 20 70  .    const int p
224c0 67 73 7a 20 3d 20 70 2d 3e 70 43 6f 6e 66 69 67  gsz = p->pConfig
224d0 2d 3e 70 67 73 7a 3b 0a 20 20 20 20 69 6e 74 20  ->pgsz;.    int 
224e0 65 44 65 74 61 69 6c 20 3d 20 70 2d 3e 70 43 6f  eDetail = p->pCo
224f0 6e 66 69 67 2d 3e 65 44 65 74 61 69 6c 3b 0a 20  nfig->eDetail;. 
22500 20 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65     Fts5Structure
22510 53 65 67 6d 65 6e 74 20 2a 70 53 65 67 3b 20 20  Segment *pSeg;  
22520 20 2f 2a 20 4e 65 77 20 73 65 67 6d 65 6e 74 20   /* New segment 
22530 77 69 74 68 69 6e 20 70 53 74 72 75 63 74 20 2a  within pStruct *
22540 2f 0a 20 20 20 20 46 74 73 35 42 75 66 66 65 72  /.    Fts5Buffer
22550 20 2a 70 42 75 66 3b 20 20 20 20 20 20 20 20 20   *pBuf;         
22560 20 20 20 20 2f 2a 20 42 75 66 66 65 72 20 69 6e      /* Buffer in
22570 20 77 68 69 63 68 20 74 6f 20 61 73 73 65 6d 62   which to assemb
22580 6c 65 20 6c 65 61 66 20 70 61 67 65 20 2a 2f 0a  le leaf page */.
22590 20 20 20 20 46 74 73 35 42 75 66 66 65 72 20 2a      Fts5Buffer *
225a0 70 50 67 69 64 78 3b 20 20 20 20 20 20 20 20 20  pPgidx;         
225b0 20 20 2f 2a 20 42 75 66 66 65 72 20 69 6e 20 77    /* Buffer in w
225c0 68 69 63 68 20 74 6f 20 61 73 73 65 6d 62 6c 65  hich to assemble
225d0 20 70 67 69 64 78 20 2a 2f 0a 0a 20 20 20 20 46   pgidx */..    F
225e0 74 73 35 53 65 67 57 72 69 74 65 72 20 77 72 69  ts5SegWriter wri
225f0 74 65 72 3b 0a 20 20 20 20 66 74 73 35 57 72 69  ter;.    fts5Wri
22600 74 65 49 6e 69 74 28 70 2c 20 26 77 72 69 74 65  teInit(p, &write
22610 72 2c 20 69 53 65 67 69 64 29 3b 0a 0a 20 20 20  r, iSegid);..   
22620 20 70 42 75 66 20 3d 20 26 77 72 69 74 65 72 2e   pBuf = &writer.
22630 77 72 69 74 65 72 2e 62 75 66 3b 0a 20 20 20 20  writer.buf;.    
22640 70 50 67 69 64 78 20 3d 20 26 77 72 69 74 65 72  pPgidx = &writer
22650 2e 77 72 69 74 65 72 2e 70 67 69 64 78 3b 0a 0a  .writer.pgidx;..
22660 20 20 20 20 2f 2a 20 66 74 73 35 57 72 69 74 65      /* fts5Write
22670 49 6e 69 74 28 29 20 73 68 6f 75 6c 64 20 68 61  Init() should ha
22680 76 65 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74  ve initialized t
22690 68 65 20 62 75 66 66 65 72 73 20 74 6f 20 28 6d  he buffers to (m
226a0 6f 73 74 20 6c 69 6b 65 6c 79 29 0a 20 20 20 20  ost likely).    
226b0 2a 2a 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 73  ** the maximum s
226c0 70 61 63 65 20 72 65 71 75 69 72 65 64 2e 20 2a  pace required. *
226d0 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d  /.    assert( p-
226e0 3e 72 63 20 7c 7c 20 70 42 75 66 2d 3e 6e 53 70  >rc || pBuf->nSp
226f0 61 63 65 3e 3d 28 70 67 73 7a 20 2b 20 46 54 53  ace>=(pgsz + FTS
22700 35 5f 44 41 54 41 5f 50 41 44 44 49 4e 47 29 20  5_DATA_PADDING) 
22710 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
22720 2d 3e 72 63 20 7c 7c 20 70 50 67 69 64 78 2d 3e  ->rc || pPgidx->
22730 6e 53 70 61 63 65 3e 3d 28 70 67 73 7a 20 2b 20  nSpace>=(pgsz + 
22740 46 54 53 35 5f 44 41 54 41 5f 50 41 44 44 49 4e  FTS5_DATA_PADDIN
22750 47 29 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 42 65  G) );..    /* Be
22760 67 69 6e 20 73 63 61 6e 6e 69 6e 67 20 74 68 72  gin scanning thr
22770 6f 75 67 68 20 68 61 73 68 20 74 61 62 6c 65 20  ough hash table 
22780 65 6e 74 72 69 65 73 2e 20 54 68 69 73 20 6c 6f  entries. This lo
22790 6f 70 20 72 75 6e 73 20 6f 6e 63 65 20 66 6f 72  op runs once for
227a0 20 65 61 63 68 0a 20 20 20 20 2a 2a 20 74 65 72   each.    ** ter
227b0 6d 2f 64 6f 63 6c 69 73 74 20 63 75 72 72 65 6e  m/doclist curren
227c0 74 6c 79 20 73 74 6f 72 65 64 20 77 69 74 68 69  tly stored withi
227d0 6e 20 74 68 65 20 68 61 73 68 20 74 61 62 6c 65  n the hash table
227e0 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e  . */.    if( p->
227f0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
22800 0a 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 73  .      p->rc = s
22810 71 6c 69 74 65 33 46 74 73 35 48 61 73 68 53 63  qlite3Fts5HashSc
22820 61 6e 49 6e 69 74 28 70 48 61 73 68 2c 20 30 2c  anInit(pHash, 0,
22830 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 77   0);.    }.    w
22840 68 69 6c 65 28 20 70 2d 3e 72 63 3d 3d 53 51 4c  hile( p->rc==SQL
22850 49 54 45 5f 4f 4b 20 26 26 20 30 3d 3d 73 71 6c  ITE_OK && 0==sql
22860 69 74 65 33 46 74 73 35 48 61 73 68 53 63 61 6e  ite3Fts5HashScan
22870 45 6f 66 28 70 48 61 73 68 29 20 29 7b 0a 20 20  Eof(pHash) ){.  
22880 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
22890 7a 54 65 72 6d 3b 20 20 20 20 20 20 20 20 20 20  zTerm;          
228a0 2f 2a 20 42 75 66 66 65 72 20 63 6f 6e 74 61 69  /* Buffer contai
228b0 6e 69 6e 67 20 74 65 72 6d 20 2a 2f 0a 20 20 20  ning term */.   
228c0 20 20 20 63 6f 6e 73 74 20 75 38 20 2a 70 44 6f     const u8 *pDo
228d0 63 6c 69 73 74 3b 20 20 20 20 20 20 20 20 20 2f  clist;         /
228e0 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 64 6f 63  * Pointer to doc
228f0 6c 69 73 74 20 66 6f 72 20 74 68 69 73 20 74 65  list for this te
22900 72 6d 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  rm */.      int 
22910 6e 44 6f 63 6c 69 73 74 3b 20 20 20 20 20 20 20  nDoclist;       
22920 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
22930 6f 66 20 64 6f 63 6c 69 73 74 20 69 6e 20 62 79  of doclist in by
22940 74 65 73 20 2a 2f 0a 0a 20 20 20 20 20 20 2f 2a  tes */..      /*
22950 20 57 72 69 74 65 20 74 68 65 20 74 65 72 6d 20   Write the term 
22960 66 6f 72 20 74 68 69 73 20 65 6e 74 72 79 20 74  for this entry t
22970 6f 20 64 69 73 6b 2e 20 2a 2f 0a 20 20 20 20 20  o disk. */.     
22980 20 73 71 6c 69 74 65 33 46 74 73 35 48 61 73 68   sqlite3Fts5Hash
22990 53 63 61 6e 45 6e 74 72 79 28 70 48 61 73 68 2c  ScanEntry(pHash,
229a0 20 26 7a 54 65 72 6d 2c 20 26 70 44 6f 63 6c 69   &zTerm, &pDocli
229b0 73 74 2c 20 26 6e 44 6f 63 6c 69 73 74 29 3b 0a  st, &nDoclist);.
229c0 20 20 20 20 20 20 66 74 73 35 57 72 69 74 65 41        fts5WriteA
229d0 70 70 65 6e 64 54 65 72 6d 28 70 2c 20 26 77 72  ppendTerm(p, &wr
229e0 69 74 65 72 2c 20 28 69 6e 74 29 73 74 72 6c 65  iter, (int)strle
229f0 6e 28 7a 54 65 72 6d 29 2c 20 28 63 6f 6e 73 74  n(zTerm), (const
22a00 20 75 38 2a 29 7a 54 65 72 6d 29 3b 0a 0a 20 20   u8*)zTerm);..  
22a10 20 20 20 20 61 73 73 65 72 74 28 20 77 72 69 74      assert( writ
22a20 65 72 2e 62 46 69 72 73 74 52 6f 77 69 64 49 6e  er.bFirstRowidIn
22a30 50 61 67 65 3d 3d 30 20 29 3b 0a 20 20 20 20 20  Page==0 );.     
22a40 20 69 66 28 20 70 67 73 7a 3e 3d 28 70 42 75 66   if( pgsz>=(pBuf
22a50 2d 3e 6e 20 2b 20 70 50 67 69 64 78 2d 3e 6e 20  ->n + pPgidx->n 
22a60 2b 20 6e 44 6f 63 6c 69 73 74 20 2b 20 31 29 20  + nDoclist + 1) 
22a70 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ){.        /* Th
22a80 65 20 65 6e 74 69 72 65 20 64 6f 63 6c 69 73 74  e entire doclist
22a90 20 77 69 6c 6c 20 66 69 74 20 6f 6e 20 74 68 65   will fit on the
22aa0 20 63 75 72 72 65 6e 74 20 6c 65 61 66 2e 20 2a   current leaf. *
22ab0 2f 0a 20 20 20 20 20 20 20 20 66 74 73 35 42 75  /.        fts5Bu
22ac0 66 66 65 72 53 61 66 65 41 70 70 65 6e 64 42 6c  fferSafeAppendBl
22ad0 6f 62 28 70 42 75 66 2c 20 70 44 6f 63 6c 69 73  ob(pBuf, pDoclis
22ae0 74 2c 20 6e 44 6f 63 6c 69 73 74 29 3b 0a 20 20  t, nDoclist);.  
22af0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
22b00 20 20 20 69 36 34 20 69 52 6f 77 69 64 20 3d 20     i64 iRowid = 
22b10 30 3b 0a 20 20 20 20 20 20 20 20 69 36 34 20 69  0;.        i64 i
22b20 44 65 6c 74 61 20 3d 20 30 3b 0a 20 20 20 20 20  Delta = 0;.     
22b30 20 20 20 69 6e 74 20 69 4f 66 66 20 3d 20 30 3b     int iOff = 0;
22b40 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  ..        /* The
22b50 20 65 6e 74 69 72 65 20 64 6f 63 6c 69 73 74 20   entire doclist 
22b60 77 69 6c 6c 20 6e 6f 74 20 66 69 74 20 6f 6e 20  will not fit on 
22b70 74 68 69 73 20 6c 65 61 66 2e 20 54 68 65 20 66  this leaf. The f
22b80 6f 6c 6c 6f 77 69 6e 67 20 0a 20 20 20 20 20 20  ollowing .      
22b90 20 20 2a 2a 20 6c 6f 6f 70 20 69 74 65 72 61 74    ** loop iterat
22ba0 65 73 20 74 68 72 6f 75 67 68 20 74 68 65 20 70  es through the p
22bb0 6f 73 6c 69 73 74 73 20 74 68 61 74 20 6d 61 6b  oslists that mak
22bc0 65 20 75 70 20 74 68 65 20 63 75 72 72 65 6e 74  e up the current
22bd0 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 64 6f 63   .        ** doc
22be0 6c 69 73 74 2e 20 20 2a 2f 0a 20 20 20 20 20 20  list.  */.      
22bf0 20 20 77 68 69 6c 65 28 20 70 2d 3e 72 63 3d 3d    while( p->rc==
22c00 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 4f 66  SQLITE_OK && iOf
22c10 66 3c 6e 44 6f 63 6c 69 73 74 20 29 7b 0a 20 20  f<nDoclist ){.  
22c20 20 20 20 20 20 20 20 20 69 4f 66 66 20 2b 3d 20          iOff += 
22c30 66 74 73 35 47 65 74 56 61 72 69 6e 74 28 26 70  fts5GetVarint(&p
22c40 44 6f 63 6c 69 73 74 5b 69 4f 66 66 5d 2c 20 28  Doclist[iOff], (
22c50 75 36 34 2a 29 26 69 44 65 6c 74 61 29 3b 0a 20  u64*)&iDelta);. 
22c60 20 20 20 20 20 20 20 20 20 69 52 6f 77 69 64 20           iRowid 
22c70 2b 3d 20 69 44 65 6c 74 61 3b 0a 20 20 20 20 20  += iDelta;.     
22c80 20 20 20 20 20 0a 20 20 20 20 20 20 20 20 20 20       .          
22c90 69 66 28 20 77 72 69 74 65 72 2e 62 46 69 72 73  if( writer.bFirs
22ca0 74 52 6f 77 69 64 49 6e 50 61 67 65 20 29 7b 0a  tRowidInPage ){.
22cb0 20 20 20 20 20 20 20 20 20 20 20 20 66 74 73 35              fts5
22cc0 50 75 74 55 31 36 28 26 70 42 75 66 2d 3e 70 5b  PutU16(&pBuf->p[
22cd0 30 5d 2c 20 28 75 31 36 29 70 42 75 66 2d 3e 6e  0], (u16)pBuf->n
22ce0 29 3b 20 20 20 2f 2a 20 66 69 72 73 74 20 72 6f  );   /* first ro
22cf0 77 69 64 20 6f 6e 20 70 61 67 65 20 2a 2f 0a 20  wid on page */. 
22d00 20 20 20 20 20 20 20 20 20 20 20 70 42 75 66 2d             pBuf-
22d10 3e 6e 20 2b 3d 20 73 71 6c 69 74 65 33 46 74 73  >n += sqlite3Fts
22d20 35 50 75 74 56 61 72 69 6e 74 28 26 70 42 75 66  5PutVarint(&pBuf
22d30 2d 3e 70 5b 70 42 75 66 2d 3e 6e 5d 2c 20 69 52  ->p[pBuf->n], iR
22d40 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 20 20 20  owid);.         
22d50 20 20 20 77 72 69 74 65 72 2e 62 46 69 72 73 74     writer.bFirst
22d60 52 6f 77 69 64 49 6e 50 61 67 65 20 3d 20 30 3b  RowidInPage = 0;
22d70 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 74 73  .            fts
22d80 35 57 72 69 74 65 44 6c 69 64 78 41 70 70 65 6e  5WriteDlidxAppen
22d90 64 28 70 2c 20 26 77 72 69 74 65 72 2c 20 69 52  d(p, &writer, iR
22da0 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 20 20 20  owid);.         
22db0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
22dc0 20 20 20 20 70 42 75 66 2d 3e 6e 20 2b 3d 20 73      pBuf->n += s
22dd0 71 6c 69 74 65 33 46 74 73 35 50 75 74 56 61 72  qlite3Fts5PutVar
22de0 69 6e 74 28 26 70 42 75 66 2d 3e 70 5b 70 42 75  int(&pBuf->p[pBu
22df0 66 2d 3e 6e 5d 2c 20 69 44 65 6c 74 61 29 3b 0a  f->n], iDelta);.
22e00 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
22e10 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 42        assert( pB
22e20 75 66 2d 3e 6e 3c 3d 70 42 75 66 2d 3e 6e 53 70  uf->n<=pBuf->nSp
22e30 61 63 65 20 29 3b 0a 0a 20 20 20 20 20 20 20 20  ace );..        
22e40 20 20 69 66 28 20 65 44 65 74 61 69 6c 3d 3d 46    if( eDetail==F
22e50 54 53 35 5f 44 45 54 41 49 4c 5f 4e 4f 4e 45 20  TS5_DETAIL_NONE 
22e60 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ){.            i
22e70 66 28 20 69 4f 66 66 3c 6e 44 6f 63 6c 69 73 74  f( iOff<nDoclist
22e80 20 26 26 20 70 44 6f 63 6c 69 73 74 5b 69 4f 66   && pDoclist[iOf
22e90 66 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  f]==0 ){.       
22ea0 20 20 20 20 20 20 20 70 42 75 66 2d 3e 70 5b 70         pBuf->p[p
22eb0 42 75 66 2d 3e 6e 2b 2b 5d 20 3d 20 30 3b 0a 20  Buf->n++] = 0;. 
22ec0 20 20 20 20 20 20 20 20 20 20 20 20 20 69 4f 66               iOf
22ed0 66 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 20  f++;.           
22ee0 20 20 20 69 66 28 20 69 4f 66 66 3c 6e 44 6f 63     if( iOff<nDoc
22ef0 6c 69 73 74 20 26 26 20 70 44 6f 63 6c 69 73 74  list && pDoclist
22f00 5b 69 4f 66 66 5d 3d 3d 30 20 29 7b 0a 20 20 20  [iOff]==0 ){.   
22f10 20 20 20 20 20 20 20 20 20 20 20 20 20 70 42 75               pBu
22f20 66 2d 3e 70 5b 70 42 75 66 2d 3e 6e 2b 2b 5d 20  f->p[pBuf->n++] 
22f30 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20  = 0;.           
22f40 20 20 20 20 20 69 4f 66 66 2b 2b 3b 0a 20 20 20       iOff++;.   
22f50 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
22f60 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
22f70 20 20 20 20 20 20 20 69 66 28 20 28 70 42 75 66         if( (pBuf
22f80 2d 3e 6e 20 2b 20 70 50 67 69 64 78 2d 3e 6e 29  ->n + pPgidx->n)
22f90 3e 3d 70 67 73 7a 20 29 7b 0a 20 20 20 20 20 20  >=pgsz ){.      
22fa0 20 20 20 20 20 20 20 20 66 74 73 35 57 72 69 74          fts5Writ
22fb0 65 46 6c 75 73 68 4c 65 61 66 28 70 2c 20 26 77  eFlushLeaf(p, &w
22fc0 72 69 74 65 72 29 3b 0a 20 20 20 20 20 20 20 20  riter);.        
22fd0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
22fe0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
22ff0 20 20 20 69 6e 74 20 62 44 75 6d 6d 79 3b 0a 20     int bDummy;. 
23000 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 6e             int n
23010 50 6f 73 3b 0a 20 20 20 20 20 20 20 20 20 20 20  Pos;.           
23020 20 69 6e 74 20 6e 43 6f 70 79 20 3d 20 66 74 73   int nCopy = fts
23030 35 47 65 74 50 6f 73 6c 69 73 74 53 69 7a 65 28  5GetPoslistSize(
23040 26 70 44 6f 63 6c 69 73 74 5b 69 4f 66 66 5d 2c  &pDoclist[iOff],
23050 20 26 6e 50 6f 73 2c 20 26 62 44 75 6d 6d 79 29   &nPos, &bDummy)
23060 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6e 43  ;.            nC
23070 6f 70 79 20 2b 3d 20 6e 50 6f 73 3b 0a 20 20 20  opy += nPos;.   
23080 20 20 20 20 20 20 20 20 20 69 66 28 20 28 70 42           if( (pB
23090 75 66 2d 3e 6e 20 2b 20 70 50 67 69 64 78 2d 3e  uf->n + pPgidx->
230a0 6e 20 2b 20 6e 43 6f 70 79 29 20 3c 3d 20 70 67  n + nCopy) <= pg
230b0 73 7a 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  sz ){.          
230c0 20 20 20 20 2f 2a 20 54 68 65 20 65 6e 74 69 72      /* The entir
230d0 65 20 70 6f 73 6c 69 73 74 20 77 69 6c 6c 20 66  e poslist will f
230e0 69 74 20 6f 6e 20 74 68 65 20 63 75 72 72 65 6e  it on the curren
230f0 74 20 6c 65 61 66 2e 20 53 6f 20 63 6f 70 79 0a  t leaf. So copy.
23100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a                **
23110 20 69 74 20 69 6e 20 6f 6e 65 20 67 6f 2e 20 2a   it in one go. *
23120 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /.              
23130 66 74 73 35 42 75 66 66 65 72 53 61 66 65 41 70  fts5BufferSafeAp
23140 70 65 6e 64 42 6c 6f 62 28 70 42 75 66 2c 20 26  pendBlob(pBuf, &
23150 70 44 6f 63 6c 69 73 74 5b 69 4f 66 66 5d 2c 20  pDoclist[iOff], 
23160 6e 43 6f 70 79 29 3b 0a 20 20 20 20 20 20 20 20  nCopy);.        
23170 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
23180 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
23190 65 6e 74 69 72 65 20 70 6f 73 6c 69 73 74 20 77  entire poslist w
231a0 69 6c 6c 20 6e 6f 74 20 66 69 74 20 6f 6e 20 74  ill not fit on t
231b0 68 69 73 20 6c 65 61 66 2e 20 53 6f 20 69 74 20  his leaf. So it 
231c0 6e 65 65 64 73 0a 20 20 20 20 20 20 20 20 20 20  needs.          
231d0 20 20 20 20 2a 2a 20 74 6f 20 62 65 20 62 72 6f      ** to be bro
231e0 6b 65 6e 20 69 6e 74 6f 20 73 65 63 74 69 6f 6e  ken into section
231f0 73 2e 20 54 68 65 20 6f 6e 6c 79 20 71 75 61 6c  s. The only qual
23200 69 66 69 63 61 74 69 6f 6e 20 62 65 69 6e 67 0a  ification being.
23210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a                **
23220 20 74 68 61 74 20 65 61 63 68 20 76 61 72 69 6e   that each varin
23230 74 20 6d 75 73 74 20 62 65 20 73 74 6f 72 65 64  t must be stored
23240 20 63 6f 6e 74 69 67 75 6f 75 73 6c 79 2e 20 20   contiguously.  
23250 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  */.             
23260 20 63 6f 6e 73 74 20 75 38 20 2a 70 50 6f 73 6c   const u8 *pPosl
23270 69 73 74 20 3d 20 26 70 44 6f 63 6c 69 73 74 5b  ist = &pDoclist[
23280 69 4f 66 66 5d 3b 0a 20 20 20 20 20 20 20 20 20  iOff];.         
23290 20 20 20 20 20 69 6e 74 20 69 50 6f 73 20 3d 20       int iPos = 
232a0 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  0;.             
232b0 20 77 68 69 6c 65 28 20 70 2d 3e 72 63 3d 3d 53   while( p->rc==S
232c0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
232d0 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20              int 
232e0 6e 53 70 61 63 65 20 3d 20 70 67 73 7a 20 2d 20  nSpace = pgsz - 
232f0 70 42 75 66 2d 3e 6e 20 2d 20 70 50 67 69 64 78  pBuf->n - pPgidx
23300 2d 3e 6e 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ->n;.           
23310 20 20 20 20 20 69 6e 74 20 6e 20 3d 20 30 3b 0a       int n = 0;.
23320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23330 69 66 28 20 28 6e 43 6f 70 79 20 2d 20 69 50 6f  if( (nCopy - iPo
23340 73 29 3c 3d 6e 53 70 61 63 65 20 29 7b 0a 20 20  s)<=nSpace ){.  
23350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23360 6e 20 3d 20 6e 43 6f 70 79 20 2d 20 69 50 6f 73  n = nCopy - iPos
23370 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
23380 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
23390 20 20 20 20 20 20 20 20 20 20 20 6e 20 3d 20 66             n = f
233a0 74 73 35 50 6f 73 6c 69 73 74 50 72 65 66 69 78  ts5PoslistPrefix
233b0 28 26 70 50 6f 73 6c 69 73 74 5b 69 50 6f 73 5d  (&pPoslist[iPos]
233c0 2c 20 6e 53 70 61 63 65 29 3b 0a 20 20 20 20 20  , nSpace);.     
233d0 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
233e0 20 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73               ass
233f0 65 72 74 28 20 6e 3e 30 20 29 3b 0a 20 20 20 20  ert( n>0 );.    
23400 20 20 20 20 20 20 20 20 20 20 20 20 66 74 73 35              fts5
23410 42 75 66 66 65 72 53 61 66 65 41 70 70 65 6e 64  BufferSafeAppend
23420 42 6c 6f 62 28 70 42 75 66 2c 20 26 70 50 6f 73  Blob(pBuf, &pPos
23430 6c 69 73 74 5b 69 50 6f 73 5d 2c 20 6e 29 3b 0a  list[iPos], n);.
23440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23450 69 50 6f 73 20 2b 3d 20 6e 3b 0a 20 20 20 20 20  iPos += n;.     
23460 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 28             if( (
23470 70 42 75 66 2d 3e 6e 20 2b 20 70 50 67 69 64 78  pBuf->n + pPgidx
23480 2d 3e 6e 29 3e 3d 70 67 73 7a 20 29 7b 0a 20 20  ->n)>=pgsz ){.  
23490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
234a0 66 74 73 35 57 72 69 74 65 46 6c 75 73 68 4c 65  fts5WriteFlushLe
234b0 61 66 28 70 2c 20 26 77 72 69 74 65 72 29 3b 0a  af(p, &writer);.
234c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
234d0 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  }.              
234e0 20 20 69 66 28 20 69 50 6f 73 3e 3d 6e 43 6f 70    if( iPos>=nCop
234f0 79 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  y ) break;.     
23500 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
23510 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
23520 20 20 20 20 20 69 4f 66 66 20 2b 3d 20 6e 43 6f       iOff += nCo
23530 70 79 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  py;.          }.
23540 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
23550 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 54 4f 44 4f  }..      /* TODO
23560 32 3a 20 44 6f 63 6c 69 73 74 20 74 65 72 6d 69  2: Doclist termi
23570 6e 61 74 6f 72 20 77 72 69 74 74 65 6e 20 68 65  nator written he
23580 72 65 2e 20 2a 2f 0a 20 20 20 20 20 20 2f 2a 20  re. */.      /* 
23590 70 42 75 66 2d 3e 70 5b 70 42 75 66 2d 3e 6e 2b  pBuf->p[pBuf->n+
235a0 2b 5d 20 3d 20 27 5c 30 27 3b 20 2a 2f 0a 20 20  +] = '\0'; */.  
235b0 20 20 20 20 61 73 73 65 72 74 28 20 70 42 75 66      assert( pBuf
235c0 2d 3e 6e 3c 3d 70 42 75 66 2d 3e 6e 53 70 61 63  ->n<=pBuf->nSpac
235d0 65 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  e );.      sqlit
235e0 65 33 46 74 73 35 48 61 73 68 53 63 61 6e 4e 65  e3Fts5HashScanNe
235f0 78 74 28 70 48 61 73 68 29 3b 0a 20 20 20 20 7d  xt(pHash);.    }
23600 0a 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35  .    sqlite3Fts5
23610 48 61 73 68 43 6c 65 61 72 28 70 48 61 73 68 29  HashClear(pHash)
23620 3b 0a 20 20 20 20 66 74 73 35 57 72 69 74 65 46  ;.    fts5WriteF
23630 69 6e 69 73 68 28 70 2c 20 26 77 72 69 74 65 72  inish(p, &writer
23640 2c 20 26 70 67 6e 6f 4c 61 73 74 29 3b 0a 0a 20  , &pgnoLast);.. 
23650 20 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65     /* Update the
23660 20 46 74 73 35 53 74 72 75 63 74 75 72 65 2e 20   Fts5Structure. 
23670 49 74 20 69 73 20 77 72 69 74 74 65 6e 20 62 61  It is written ba
23680 63 6b 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ck to the databa
23690 73 65 20 62 79 20 74 68 65 0a 20 20 20 20 2a 2a  se by the.    **
236a0 20 66 74 73 35 53 74 72 75 63 74 75 72 65 52 65   fts5StructureRe
236b0 6c 65 61 73 65 28 29 20 63 61 6c 6c 20 62 65 6c  lease() call bel
236c0 6f 77 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  ow.  */.    if( 
236d0 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 3d  pStruct->nLevel=
236e0 3d 30 20 29 7b 0a 20 20 20 20 20 20 66 74 73 35  =0 ){.      fts5
236f0 53 74 72 75 63 74 75 72 65 41 64 64 4c 65 76 65  StructureAddLeve
23700 6c 28 26 70 2d 3e 72 63 2c 20 26 70 53 74 72 75  l(&p->rc, &pStru
23710 63 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66  ct);.    }.    f
23720 74 73 35 53 74 72 75 63 74 75 72 65 45 78 74 65  ts5StructureExte
23730 6e 64 4c 65 76 65 6c 28 26 70 2d 3e 72 63 2c 20  ndLevel(&p->rc, 
23740 70 53 74 72 75 63 74 2c 20 30 2c 20 31 2c 20 30  pStruct, 0, 1, 0
23750 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 72 63  );.    if( p->rc
23760 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
23770 20 20 20 20 20 70 53 65 67 20 3d 20 26 70 53 74       pSeg = &pSt
23780 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 30 5d 2e  ruct->aLevel[0].
23790 61 53 65 67 5b 20 70 53 74 72 75 63 74 2d 3e 61  aSeg[ pStruct->a
237a0 4c 65 76 65 6c 5b 30 5d 2e 6e 53 65 67 2b 2b 20  Level[0].nSeg++ 
237b0 5d 3b 0a 20 20 20 20 20 20 70 53 65 67 2d 3e 69  ];.      pSeg->i
237c0 53 65 67 69 64 20 3d 20 69 53 65 67 69 64 3b 0a  Segid = iSegid;.
237d0 20 20 20 20 20 20 70 53 65 67 2d 3e 70 67 6e 6f        pSeg->pgno
237e0 46 69 72 73 74 20 3d 20 31 3b 0a 20 20 20 20 20  First = 1;.     
237f0 20 70 53 65 67 2d 3e 70 67 6e 6f 4c 61 73 74 20   pSeg->pgnoLast 
23800 3d 20 70 67 6e 6f 4c 61 73 74 3b 0a 20 20 20 20  = pgnoLast;.    
23810 20 20 70 53 74 72 75 63 74 2d 3e 6e 53 65 67 6d    pStruct->nSegm
23820 65 6e 74 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20  ent++;.    }.   
23830 20 66 74 73 35 53 74 72 75 63 74 75 72 65 50 72   fts5StructurePr
23840 6f 6d 6f 74 65 28 70 2c 20 30 2c 20 70 53 74 72  omote(p, 0, pStr
23850 75 63 74 29 3b 0a 20 20 7d 0a 0a 20 20 66 74 73  uct);.  }..  fts
23860 35 49 6e 64 65 78 41 75 74 6f 6d 65 72 67 65 28  5IndexAutomerge(
23870 70 2c 20 26 70 53 74 72 75 63 74 2c 20 70 67 6e  p, &pStruct, pgn
23880 6f 4c 61 73 74 29 3b 0a 20 20 66 74 73 35 49 6e  oLast);.  fts5In
23890 64 65 78 43 72 69 73 69 73 6d 65 72 67 65 28 70  dexCrisismerge(p
238a0 2c 20 26 70 53 74 72 75 63 74 29 3b 0a 20 20 66  , &pStruct);.  f
238b0 74 73 35 53 74 72 75 63 74 75 72 65 57 72 69 74  ts5StructureWrit
238c0 65 28 70 2c 20 70 53 74 72 75 63 74 29 3b 0a 20  e(p, pStruct);. 
238d0 20 66 74 73 35 53 74 72 75 63 74 75 72 65 52 65   fts5StructureRe
238e0 6c 65 61 73 65 28 70 53 74 72 75 63 74 29 3b 0a  lease(pStruct);.
238f0 7d 0a 0a 2f 2a 0a 2a 2a 20 46 6c 75 73 68 20 61  }../*.** Flush a
23900 6e 79 20 64 61 74 61 20 73 74 6f 72 65 64 20 69  ny data stored i
23910 6e 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20  n the in-memory 
23920 68 61 73 68 20 74 61 62 6c 65 73 20 74 6f 20 74  hash tables to t
23930 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2f 0a  he database..*/.
23940 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
23950 49 6e 64 65 78 46 6c 75 73 68 28 46 74 73 35 49  IndexFlush(Fts5I
23960 6e 64 65 78 20 2a 70 29 7b 0a 20 20 2f 2a 20 55  ndex *p){.  /* U
23970 6e 6c 65 73 73 20 69 74 20 69 73 20 65 6d 70 74  nless it is empt
23980 79 2c 20 66 6c 75 73 68 20 74 68 65 20 68 61 73  y, flush the has
23990 68 20 74 61 62 6c 65 20 74 6f 20 64 69 73 6b 20  h table to disk 
239a0 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 6e 50 65 6e  */.  if( p->nPen
239b0 64 69 6e 67 44 61 74 61 20 29 7b 0a 20 20 20 20  dingData ){.    
239c0 61 73 73 65 72 74 28 20 70 2d 3e 70 48 61 73 68  assert( p->pHash
239d0 20 29 3b 0a 20 20 20 20 70 2d 3e 6e 50 65 6e 64   );.    p->nPend
239e0 69 6e 67 44 61 74 61 20 3d 20 30 3b 0a 20 20 20  ingData = 0;.   
239f0 20 66 74 73 35 46 6c 75 73 68 4f 6e 65 48 61 73   fts5FlushOneHas
23a00 68 28 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61  h(p);.  }.}..sta
23a10 74 69 63 20 46 74 73 35 53 74 72 75 63 74 75 72  tic Fts5Structur
23a20 65 20 2a 66 74 73 35 49 6e 64 65 78 4f 70 74 69  e *fts5IndexOpti
23a30 6d 69 7a 65 53 74 72 75 63 74 28 0a 20 20 46 74  mizeStruct(.  Ft
23a40 73 35 49 6e 64 65 78 20 2a 70 2c 20 0a 20 20 46  s5Index *p, .  F
23a50 74 73 35 53 74 72 75 63 74 75 72 65 20 2a 70 53  ts5Structure *pS
23a60 74 72 75 63 74 0a 29 7b 0a 20 20 46 74 73 35 53  truct.){.  Fts5S
23a70 74 72 75 63 74 75 72 65 20 2a 70 4e 65 77 20 3d  tructure *pNew =
23a80 20 30 3b 0a 20 20 69 6e 74 20 6e 42 79 74 65 20   0;.  int nByte 
23a90 3d 20 73 69 7a 65 6f 66 28 46 74 73 35 53 74 72  = sizeof(Fts5Str
23aa0 75 63 74 75 72 65 29 3b 0a 20 20 69 6e 74 20 6e  ucture);.  int n
23ab0 53 65 67 20 3d 20 70 53 74 72 75 63 74 2d 3e 6e  Seg = pStruct->n
23ac0 53 65 67 6d 65 6e 74 3b 0a 20 20 69 6e 74 20 69  Segment;.  int i
23ad0 3b 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65 20 6f  ;..  /* Figure o
23ae0 75 74 20 69 66 20 74 68 69 73 20 73 74 72 75 63  ut if this struc
23af0 74 75 72 65 20 72 65 71 75 69 72 65 73 20 6f 70  ture requires op
23b00 74 69 6d 69 7a 61 74 69 6f 6e 2e 20 41 20 73 74  timization. A st
23b10 72 75 63 74 75 72 65 20 64 6f 65 73 0a 20 20 2a  ructure does.  *
23b20 2a 20 6e 6f 74 20 72 65 71 75 69 72 65 20 6f 70  * not require op
23b30 74 69 6d 69 7a 61 74 69 6f 6e 20 69 66 20 65 69  timization if ei
23b40 74 68 65 72 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ther:.  **.  ** 
23b50 20 2b 20 69 74 20 63 6f 6e 73 69 73 74 73 20 6f   + it consists o
23b60 66 20 66 65 77 65 72 20 74 68 61 6e 20 74 77 6f  f fewer than two
23b70 20 73 65 67 6d 65 6e 74 73 2c 20 6f 72 20 0a 20   segments, or . 
23b80 20 2a 2a 20 20 2b 20 61 6c 6c 20 73 65 67 6d 65   **  + all segme
23b90 6e 74 73 20 61 72 65 20 6f 6e 20 74 68 65 20 73  nts are on the s
23ba0 61 6d 65 20 6c 65 76 65 6c 2c 20 6f 72 0a 20 20  ame level, or.  
23bb0 2a 2a 20 20 2b 20 61 6c 6c 20 73 65 67 6d 65 6e  **  + all segmen
23bc0 74 73 20 65 78 63 65 70 74 20 6f 6e 65 20 61 72  ts except one ar
23bd0 65 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 70 75  e currently inpu
23be0 74 73 20 74 6f 20 61 20 6d 65 72 67 65 20 6f 70  ts to a merge op
23bf0 65 72 61 74 69 6f 6e 2e 0a 20 20 2a 2a 0a 20 20  eration..  **.  
23c00 2a 2a 20 49 6e 20 74 68 65 20 66 69 72 73 74 20  ** In the first 
23c10 63 61 73 65 2c 20 72 65 74 75 72 6e 20 4e 55 4c  case, return NUL
23c20 4c 2e 20 49 6e 20 74 68 65 20 73 65 63 6f 6e 64  L. In the second
23c30 2c 20 69 6e 63 72 65 6d 65 6e 74 20 74 68 65 20  , increment the 
23c40 72 65 66 2d 63 6f 75 6e 74 0a 20 20 2a 2a 20 6f  ref-count.  ** o
23c50 6e 20 2a 70 53 74 72 75 63 74 20 61 6e 64 20 72  n *pStruct and r
23c60 65 74 75 72 6e 20 61 20 63 6f 70 79 20 6f 66 20  eturn a copy of 
23c70 74 68 65 20 70 6f 69 6e 74 65 72 20 74 6f 20 69  the pointer to i
23c80 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6e 53  t..  */.  if( nS
23c90 65 67 3c 32 20 29 20 72 65 74 75 72 6e 20 30 3b  eg<2 ) return 0;
23ca0 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 53  .  for(i=0; i<pS
23cb0 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 3b 20 69  truct->nLevel; i
23cc0 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6e 54 68  ++){.    int nTh
23cd0 69 73 20 3d 20 70 53 74 72 75 63 74 2d 3e 61 4c  is = pStruct->aL
23ce0 65 76 65 6c 5b 69 5d 2e 6e 53 65 67 3b 0a 20 20  evel[i].nSeg;.  
23cf0 20 20 69 66 28 20 6e 54 68 69 73 3d 3d 6e 53 65    if( nThis==nSe
23d00 67 20 7c 7c 20 28 6e 54 68 69 73 3d 3d 6e 53 65  g || (nThis==nSe
23d10 67 2d 31 20 26 26 20 70 53 74 72 75 63 74 2d 3e  g-1 && pStruct->
23d20 61 4c 65 76 65 6c 5b 69 5d 2e 6e 4d 65 72 67 65  aLevel[i].nMerge
23d30 3d 3d 6e 54 68 69 73 29 20 29 7b 0a 20 20 20 20  ==nThis) ){.    
23d40 20 20 66 74 73 35 53 74 72 75 63 74 75 72 65 52    fts5StructureR
23d50 65 66 28 70 53 74 72 75 63 74 29 3b 0a 20 20 20  ef(pStruct);.   
23d60 20 20 20 72 65 74 75 72 6e 20 70 53 74 72 75 63     return pStruc
23d70 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73  t;.    }.    ass
23d80 65 72 74 28 20 70 53 74 72 75 63 74 2d 3e 61 4c  ert( pStruct->aL
23d90 65 76 65 6c 5b 69 5d 2e 6e 4d 65 72 67 65 3c 3d  evel[i].nMerge<=
23da0 6e 54 68 69 73 20 29 3b 0a 20 20 7d 0a 0a 20 20  nThis );.  }..  
23db0 6e 42 79 74 65 20 2b 3d 20 28 70 53 74 72 75 63  nByte += (pStruc
23dc0 74 2d 3e 6e 4c 65 76 65 6c 2b 31 29 20 2a 20 73  t->nLevel+1) * s
23dd0 69 7a 65 6f 66 28 46 74 73 35 53 74 72 75 63 74  izeof(Fts5Struct
23de0 75 72 65 4c 65 76 65 6c 29 3b 0a 20 20 70 4e 65  ureLevel);.  pNe
23df0 77 20 3d 20 28 46 74 73 35 53 74 72 75 63 74 75  w = (Fts5Structu
23e00 72 65 2a 29 73 71 6c 69 74 65 33 46 74 73 35 4d  re*)sqlite3Fts5M
23e10 61 6c 6c 6f 63 5a 65 72 6f 28 26 70 2d 3e 72 63  allocZero(&p->rc
23e20 2c 20 6e 42 79 74 65 29 3b 0a 0a 20 20 69 66 28  , nByte);..  if(
23e30 20 70 4e 65 77 20 29 7b 0a 20 20 20 20 46 74 73   pNew ){.    Fts
23e40 35 53 74 72 75 63 74 75 72 65 4c 65 76 65 6c 20  5StructureLevel 
23e50 2a 70 4c 76 6c 3b 0a 20 20 20 20 6e 42 79 74 65  *pLvl;.    nByte
23e60 20 3d 20 6e 53 65 67 20 2a 20 73 69 7a 65 6f 66   = nSeg * sizeof
23e70 28 46 74 73 35 53 74 72 75 63 74 75 72 65 53 65  (Fts5StructureSe
23e80 67 6d 65 6e 74 29 3b 0a 20 20 20 20 70 4e 65 77  gment);.    pNew
23e90 2d 3e 6e 4c 65 76 65 6c 20 3d 20 70 53 74 72 75  ->nLevel = pStru
23ea0 63 74 2d 3e 6e 4c 65 76 65 6c 2b 31 3b 0a 20 20  ct->nLevel+1;.  
23eb0 20 20 70 4e 65 77 2d 3e 6e 52 65 66 20 3d 20 31    pNew->nRef = 1
23ec0 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 57 72 69  ;.    pNew->nWri
23ed0 74 65 43 6f 75 6e 74 65 72 20 3d 20 70 53 74 72  teCounter = pStr
23ee0 75 63 74 2d 3e 6e 57 72 69 74 65 43 6f 75 6e 74  uct->nWriteCount
23ef0 65 72 3b 0a 20 20 20 20 70 4c 76 6c 20 3d 20 26  er;.    pLvl = &
23f00 70 4e 65 77 2d 3e 61 4c 65 76 65 6c 5b 70 53 74  pNew->aLevel[pSt
23f10 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 5d 3b 0a 20  ruct->nLevel];. 
23f20 20 20 20 70 4c 76 6c 2d 3e 61 53 65 67 20 3d 20     pLvl->aSeg = 
23f30 28 46 74 73 35 53 74 72 75 63 74 75 72 65 53 65  (Fts5StructureSe
23f40 67 6d 65 6e 74 2a 29 73 71 6c 69 74 65 33 46 74  gment*)sqlite3Ft
23f50 73 35 4d 61 6c 6c 6f 63 5a 65 72 6f 28 26 70 2d  s5MallocZero(&p-
23f60 3e 72 63 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20  >rc, nByte);.   
23f70 20 69 66 28 20 70 4c 76 6c 2d 3e 61 53 65 67 20   if( pLvl->aSeg 
23f80 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 4c 76  ){.      int iLv
23f90 6c 2c 20 69 53 65 67 3b 0a 20 20 20 20 20 20 69  l, iSeg;.      i
23fa0 6e 74 20 69 53 65 67 4f 75 74 20 3d 20 30 3b 0a  nt iSegOut = 0;.
23fb0 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74 65        /* Iterate
23fc0 20 74 68 72 6f 75 67 68 20 61 6c 6c 20 73 65 67   through all seg
23fd0 6d 65 6e 74 73 2c 20 66 72 6f 6d 20 6f 6c 64 65  ments, from olde
23fe0 73 74 20 74 6f 20 6e 65 77 65 73 74 2e 20 41 64  st to newest. Ad
23ff0 64 20 74 68 65 6d 20 74 6f 0a 20 20 20 20 20 20  d them to.      
24000 2a 2a 20 74 68 65 20 6e 65 77 20 46 74 73 35 4c  ** the new Fts5L
24010 65 76 65 6c 20 6f 62 6a 65 63 74 20 73 6f 20 74  evel object so t
24020 68 61 74 20 70 4c 76 6c 2d 3e 61 53 65 67 5b 30  hat pLvl->aSeg[0
24030 5d 20 69 73 20 74 68 65 20 6f 6c 64 65 73 74 0a  ] is the oldest.
24040 20 20 20 20 20 20 2a 2a 20 73 65 67 6d 65 6e 74        ** segment
24050 20 69 6e 20 74 68 65 20 64 61 74 61 20 73 74 72   in the data str
24060 75 63 74 75 72 65 2e 20 20 2a 2f 0a 20 20 20 20  ucture.  */.    
24070 20 20 66 6f 72 28 69 4c 76 6c 3d 70 53 74 72 75    for(iLvl=pStru
24080 63 74 2d 3e 6e 4c 65 76 65 6c 2d 31 3b 20 69 4c  ct->nLevel-1; iL
24090 76 6c 3e 3d 30 3b 20 69 4c 76 6c 2d 2d 29 7b 0a  vl>=0; iLvl--){.
240a0 20 20 20 20 20 20 20 20 66 6f 72 28 69 53 65 67          for(iSeg
240b0 3d 30 3b 20 69 53 65 67 3c 70 53 74 72 75 63 74  =0; iSeg<pStruct
240c0 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d 2e 6e  ->aLevel[iLvl].n
240d0 53 65 67 3b 20 69 53 65 67 2b 2b 29 7b 0a 20 20  Seg; iSeg++){.  
240e0 20 20 20 20 20 20 20 20 70 4c 76 6c 2d 3e 61 53          pLvl->aS
240f0 65 67 5b 69 53 65 67 4f 75 74 5d 20 3d 20 70 53  eg[iSegOut] = pS
24100 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c  truct->aLevel[iL
24110 76 6c 5d 2e 61 53 65 67 5b 69 53 65 67 5d 3b 0a  vl].aSeg[iSeg];.
24120 20 20 20 20 20 20 20 20 20 20 69 53 65 67 4f 75            iSegOu
24130 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  t++;.        }. 
24140 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 4e 65       }.      pNe
24150 77 2d 3e 6e 53 65 67 6d 65 6e 74 20 3d 20 70 4c  w->nSegment = pL
24160 76 6c 2d 3e 6e 53 65 67 20 3d 20 6e 53 65 67 3b  vl->nSeg = nSeg;
24170 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
24180 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
24190 4e 65 77 29 3b 0a 20 20 20 20 20 20 70 4e 65 77  New);.      pNew
241a0 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   = 0;.    }.  }.
241b0 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a  .  return pNew;.
241c0 7d 0a 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74  }..int sqlite3Ft
241d0 73 35 49 6e 64 65 78 4f 70 74 69 6d 69 7a 65 28  s5IndexOptimize(
241e0 46 74 73 35 49 6e 64 65 78 20 2a 70 29 7b 0a 20  Fts5Index *p){. 
241f0 20 46 74 73 35 53 74 72 75 63 74 75 72 65 20 2a   Fts5Structure *
24200 70 53 74 72 75 63 74 3b 0a 20 20 46 74 73 35 53  pStruct;.  Fts5S
24210 74 72 75 63 74 75 72 65 20 2a 70 4e 65 77 20 3d  tructure *pNew =
24220 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70   0;..  assert( p
24230 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
24240 29 3b 0a 20 20 66 74 73 35 49 6e 64 65 78 46 6c  );.  fts5IndexFl
24250 75 73 68 28 70 29 3b 0a 20 20 70 53 74 72 75 63  ush(p);.  pStruc
24260 74 20 3d 20 66 74 73 35 53 74 72 75 63 74 75 72  t = fts5Structur
24270 65 52 65 61 64 28 70 29 3b 0a 20 20 66 74 73 35  eRead(p);.  fts5
24280 53 74 72 75 63 74 75 72 65 49 6e 76 61 6c 69 64  StructureInvalid
24290 61 74 65 28 70 29 3b 0a 0a 20 20 69 66 28 20 70  ate(p);..  if( p
242a0 53 74 72 75 63 74 20 29 7b 0a 20 20 20 20 70 4e  Struct ){.    pN
242b0 65 77 20 3d 20 66 74 73 35 49 6e 64 65 78 4f 70  ew = fts5IndexOp
242c0 74 69 6d 69 7a 65 53 74 72 75 63 74 28 70 2c 20  timizeStruct(p, 
242d0 70 53 74 72 75 63 74 29 3b 0a 20 20 7d 0a 20 20  pStruct);.  }.  
242e0 66 74 73 35 53 74 72 75 63 74 75 72 65 52 65 6c  fts5StructureRel
242f0 65 61 73 65 28 70 53 74 72 75 63 74 29 3b 0a 0a  ease(pStruct);..
24300 20 20 61 73 73 65 72 74 28 20 70 4e 65 77 3d 3d    assert( pNew==
24310 30 20 7c 7c 20 70 4e 65 77 2d 3e 6e 53 65 67 6d  0 || pNew->nSegm
24320 65 6e 74 3e 30 20 29 3b 0a 20 20 69 66 28 20 70  ent>0 );.  if( p
24330 4e 65 77 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  New ){.    int i
24340 4c 76 6c 3b 0a 20 20 20 20 66 6f 72 28 69 4c 76  Lvl;.    for(iLv
24350 6c 3d 30 3b 20 70 4e 65 77 2d 3e 61 4c 65 76 65  l=0; pNew->aLeve
24360 6c 5b 69 4c 76 6c 5d 2e 6e 53 65 67 3d 3d 30 3b  l[iLvl].nSeg==0;
24370 20 69 4c 76 6c 2b 2b 29 7b 7d 0a 20 20 20 20 77   iLvl++){}.    w
24380 68 69 6c 65 28 20 70 2d 3e 72 63 3d 3d 53 51 4c  hile( p->rc==SQL
24390 49 54 45 5f 4f 4b 20 26 26 20 70 4e 65 77 2d 3e  ITE_OK && pNew->
243a0 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d 2e 6e 53 65  aLevel[iLvl].nSe
243b0 67 3e 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  g>0 ){.      int
243c0 20 6e 52 65 6d 20 3d 20 46 54 53 35 5f 4f 50 54   nRem = FTS5_OPT
243d0 5f 57 4f 52 4b 5f 55 4e 49 54 3b 0a 20 20 20 20  _WORK_UNIT;.    
243e0 20 20 66 74 73 35 49 6e 64 65 78 4d 65 72 67 65    fts5IndexMerge
243f0 4c 65 76 65 6c 28 70 2c 20 26 70 4e 65 77 2c 20  Level(p, &pNew, 
24400 69 4c 76 6c 2c 20 26 6e 52 65 6d 29 3b 0a 20 20  iLvl, &nRem);.  
24410 20 20 7d 0a 0a 20 20 20 20 66 74 73 35 53 74 72    }..    fts5Str
24420 75 63 74 75 72 65 57 72 69 74 65 28 70 2c 20 70  uctureWrite(p, p
24430 4e 65 77 29 3b 0a 20 20 20 20 66 74 73 35 53 74  New);.    fts5St
24440 72 75 63 74 75 72 65 52 65 6c 65 61 73 65 28 70  ructureRelease(p
24450 4e 65 77 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74  New);.  }..  ret
24460 75 72 6e 20 66 74 73 35 49 6e 64 65 78 52 65 74  urn fts5IndexRet
24470 75 72 6e 28 70 29 3b 20 0a 7d 0a 0a 2f 2a 0a 2a  urn(p); .}../*.*
24480 2a 20 54 68 69 73 20 69 73 20 63 61 6c 6c 65 64  * This is called
24490 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68   to implement th
244a0 65 20 73 70 65 63 69 61 6c 20 22 56 41 4c 55 45  e special "VALUE
244b0 53 28 27 6d 65 72 67 65 27 2c 20 24 6e 4d 65 72  S('merge', $nMer
244c0 67 65 29 22 0a 2a 2a 20 49 4e 53 45 52 54 20 63  ge)".** INSERT c
244d0 6f 6d 6d 61 6e 64 2e 0a 2a 2f 0a 69 6e 74 20 73  ommand..*/.int s
244e0 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78 4d  qlite3Fts5IndexM
244f0 65 72 67 65 28 46 74 73 35 49 6e 64 65 78 20 2a  erge(Fts5Index *
24500 70 2c 20 69 6e 74 20 6e 4d 65 72 67 65 29 7b 0a  p, int nMerge){.
24510 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65 20    Fts5Structure 
24520 2a 70 53 74 72 75 63 74 20 3d 20 66 74 73 35 53  *pStruct = fts5S
24530 74 72 75 63 74 75 72 65 52 65 61 64 28 70 29 3b  tructureRead(p);
24540 0a 20 20 69 66 28 20 70 53 74 72 75 63 74 20 29  .  if( pStruct )
24550 7b 0a 20 20 20 20 69 6e 74 20 6e 4d 69 6e 20 3d  {.    int nMin =
24560 20 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e 6e 55 73   p->pConfig->nUs
24570 65 72 6d 65 72 67 65 3b 0a 20 20 20 20 66 74 73  ermerge;.    fts
24580 35 53 74 72 75 63 74 75 72 65 49 6e 76 61 6c 69  5StructureInvali
24590 64 61 74 65 28 70 29 3b 0a 20 20 20 20 69 66 28  date(p);.    if(
245a0 20 6e 4d 65 72 67 65 3c 30 20 29 7b 0a 20 20 20   nMerge<0 ){.   
245b0 20 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65     Fts5Structure
245c0 20 2a 70 4e 65 77 20 3d 20 66 74 73 35 49 6e 64   *pNew = fts5Ind
245d0 65 78 4f 70 74 69 6d 69 7a 65 53 74 72 75 63 74  exOptimizeStruct
245e0 28 70 2c 20 70 53 74 72 75 63 74 29 3b 0a 20 20  (p, pStruct);.  
245f0 20 20 20 20 66 74 73 35 53 74 72 75 63 74 75 72      fts5Structur
24600 65 52 65 6c 65 61 73 65 28 70 53 74 72 75 63 74  eRelease(pStruct
24610 29 3b 0a 20 20 20 20 20 20 70 53 74 72 75 63 74  );.      pStruct
24620 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 20 20 6e   = pNew;.      n
24630 4d 69 6e 20 3d 20 32 3b 0a 20 20 20 20 20 20 6e  Min = 2;.      n
24640 4d 65 72 67 65 20 3d 20 6e 4d 65 72 67 65 2a 2d  Merge = nMerge*-
24650 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  1;.    }.    if(
24660 20 70 53 74 72 75 63 74 20 26 26 20 70 53 74 72   pStruct && pStr
24670 75 63 74 2d 3e 6e 4c 65 76 65 6c 20 29 7b 0a 20  uct->nLevel ){. 
24680 20 20 20 20 20 69 66 28 20 66 74 73 35 49 6e 64       if( fts5Ind
24690 65 78 4d 65 72 67 65 28 70 2c 20 26 70 53 74 72  exMerge(p, &pStr
246a0 75 63 74 2c 20 6e 4d 65 72 67 65 2c 20 6e 4d 69  uct, nMerge, nMi
246b0 6e 29 20 29 7b 0a 20 20 20 20 20 20 20 20 66 74  n) ){.        ft
246c0 73 35 53 74 72 75 63 74 75 72 65 57 72 69 74 65  s5StructureWrite
246d0 28 70 2c 20 70 53 74 72 75 63 74 29 3b 0a 20 20  (p, pStruct);.  
246e0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
246f0 66 74 73 35 53 74 72 75 63 74 75 72 65 52 65 6c  fts5StructureRel
24700 65 61 73 65 28 70 53 74 72 75 63 74 29 3b 0a 20  ease(pStruct);. 
24710 20 7d 0a 20 20 72 65 74 75 72 6e 20 66 74 73 35   }.  return fts5
24720 49 6e 64 65 78 52 65 74 75 72 6e 28 70 29 3b 0a  IndexReturn(p);.
24730 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  }..static void f
24740 74 73 35 41 70 70 65 6e 64 52 6f 77 69 64 28 0a  ts5AppendRowid(.
24750 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 0a    Fts5Index *p,.
24760 20 20 69 36 34 20 69 44 65 6c 74 61 2c 0a 20 20    i64 iDelta,.  
24770 46 74 73 35 49 74 65 72 20 2a 70 55 6e 75 73 65  Fts5Iter *pUnuse
24780 64 2c 0a 20 20 46 74 73 35 42 75 66 66 65 72 20  d,.  Fts5Buffer 
24790 2a 70 42 75 66 0a 29 7b 0a 20 20 55 4e 55 53 45  *pBuf.){.  UNUSE
247a0 44 5f 50 41 52 41 4d 28 70 55 6e 75 73 65 64 29  D_PARAM(pUnused)
247b0 3b 0a 20 20 66 74 73 35 42 75 66 66 65 72 41 70  ;.  fts5BufferAp
247c0 70 65 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e 72  pendVarint(&p->r
247d0 63 2c 20 70 42 75 66 2c 20 69 44 65 6c 74 61 29  c, pBuf, iDelta)
247e0 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64  ;.}..static void
247f0 20 66 74 73 35 41 70 70 65 6e 64 50 6f 73 6c 69   fts5AppendPosli
24800 73 74 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20  st(.  Fts5Index 
24810 2a 70 2c 0a 20 20 69 36 34 20 69 44 65 6c 74 61  *p,.  i64 iDelta
24820 2c 0a 20 20 46 74 73 35 49 74 65 72 20 2a 70 4d  ,.  Fts5Iter *pM
24830 75 6c 74 69 2c 0a 20 20 46 74 73 35 42 75 66 66  ulti,.  Fts5Buff
24840 65 72 20 2a 70 42 75 66 0a 29 7b 0a 20 20 69 6e  er *pBuf.){.  in
24850 74 20 6e 44 61 74 61 20 3d 20 70 4d 75 6c 74 69  t nData = pMulti
24860 2d 3e 62 61 73 65 2e 6e 44 61 74 61 3b 0a 20 20  ->base.nData;.  
24870 61 73 73 65 72 74 28 20 6e 44 61 74 61 3e 30 20  assert( nData>0 
24880 29 3b 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d  );.  if( p->rc==
24890 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 30 3d 3d  SQLITE_OK && 0==
248a0 66 74 73 35 42 75 66 66 65 72 47 72 6f 77 28 26  fts5BufferGrow(&
248b0 70 2d 3e 72 63 2c 20 70 42 75 66 2c 20 6e 44 61  p->rc, pBuf, nDa
248c0 74 61 2b 39 2b 39 29 20 29 7b 0a 20 20 20 20 66  ta+9+9) ){.    f
248d0 74 73 35 42 75 66 66 65 72 53 61 66 65 41 70 70  ts5BufferSafeApp
248e0 65 6e 64 56 61 72 69 6e 74 28 70 42 75 66 2c 20  endVarint(pBuf, 
248f0 69 44 65 6c 74 61 29 3b 0a 20 20 20 20 66 74 73  iDelta);.    fts
24900 35 42 75 66 66 65 72 53 61 66 65 41 70 70 65 6e  5BufferSafeAppen
24910 64 56 61 72 69 6e 74 28 70 42 75 66 2c 20 6e 44  dVarint(pBuf, nD
24920 61 74 61 2a 32 29 3b 0a 20 20 20 20 66 74 73 35  ata*2);.    fts5
24930 42 75 66 66 65 72 53 61 66 65 41 70 70 65 6e 64  BufferSafeAppend
24940 42 6c 6f 62 28 70 42 75 66 2c 20 70 4d 75 6c 74  Blob(pBuf, pMult
24950 69 2d 3e 62 61 73 65 2e 70 44 61 74 61 2c 20 6e  i->base.pData, n
24960 44 61 74 61 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a 73  Data);.  }.}...s
24970 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 44  tatic void fts5D
24980 6f 63 6c 69 73 74 49 74 65 72 4e 65 78 74 28 46  oclistIterNext(F
24990 74 73 35 44 6f 63 6c 69 73 74 49 74 65 72 20 2a  ts5DoclistIter *
249a0 70 49 74 65 72 29 7b 0a 20 20 75 38 20 2a 70 20  pIter){.  u8 *p 
249b0 3d 20 70 49 74 65 72 2d 3e 61 50 6f 73 6c 69 73  = pIter->aPoslis
249c0 74 20 2b 20 70 49 74 65 72 2d 3e 6e 53 69 7a 65  t + pIter->nSize
249d0 20 2b 20 70 49 74 65 72 2d 3e 6e 50 6f 73 6c 69   + pIter->nPosli
249e0 73 74 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  st;..  assert( p
249f0 49 74 65 72 2d 3e 61 50 6f 73 6c 69 73 74 20 29  Iter->aPoslist )
24a00 3b 0a 20 20 69 66 28 20 70 3e 3d 70 49 74 65 72  ;.  if( p>=pIter
24a10 2d 3e 61 45 6f 66 20 29 7b 0a 20 20 20 20 70 49  ->aEof ){.    pI
24a20 74 65 72 2d 3e 61 50 6f 73 6c 69 73 74 20 3d 20  ter->aPoslist = 
24a30 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  0;.  }else{.    
24a40 69 36 34 20 69 44 65 6c 74 61 3b 0a 0a 20 20 20  i64 iDelta;..   
24a50 20 70 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72   p += fts5GetVar
24a60 69 6e 74 28 70 2c 20 28 75 36 34 2a 29 26 69 44  int(p, (u64*)&iD
24a70 65 6c 74 61 29 3b 0a 20 20 20 20 70 49 74 65 72  elta);.    pIter
24a80 2d 3e 69 52 6f 77 69 64 20 2b 3d 20 69 44 65 6c  ->iRowid += iDel
24a90 74 61 3b 0a 0a 20 20 20 20 2f 2a 20 52 65 61 64  ta;..    /* Read
24aa0 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74 20 73   position list s
24ab0 69 7a 65 20 2a 2f 0a 20 20 20 20 69 66 28 20 70  ize */.    if( p
24ac0 5b 30 5d 20 26 20 30 78 38 30 20 29 7b 0a 20 20  [0] & 0x80 ){.  
24ad0 20 20 20 20 69 6e 74 20 6e 50 6f 73 3b 0a 20 20      int nPos;.  
24ae0 20 20 20 20 70 49 74 65 72 2d 3e 6e 53 69 7a 65      pIter->nSize
24af0 20 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e 74   = fts5GetVarint
24b00 33 32 28 70 2c 20 6e 50 6f 73 29 3b 0a 20 20 20  32(p, nPos);.   
24b10 20 20 20 70 49 74 65 72 2d 3e 6e 50 6f 73 6c 69     pIter->nPosli
24b20 73 74 20 3d 20 28 6e 50 6f 73 3e 3e 31 29 3b 0a  st = (nPos>>1);.
24b30 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
24b40 20 70 49 74 65 72 2d 3e 6e 50 6f 73 6c 69 73 74   pIter->nPoslist
24b50 20 3d 20 28 28 69 6e 74 29 28 70 5b 30 5d 29 29   = ((int)(p[0]))
24b60 20 3e 3e 20 31 3b 0a 20 20 20 20 20 20 70 49 74   >> 1;.      pIt
24b70 65 72 2d 3e 6e 53 69 7a 65 20 3d 20 31 3b 0a 20  er->nSize = 1;. 
24b80 20 20 20 7d 0a 0a 20 20 20 20 70 49 74 65 72 2d     }..    pIter-
24b90 3e 61 50 6f 73 6c 69 73 74 20 3d 20 70 3b 0a 20  >aPoslist = p;. 
24ba0 20 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69   }.}..static voi
24bb0 64 20 66 74 73 35 44 6f 63 6c 69 73 74 49 74 65  d fts5DoclistIte
24bc0 72 49 6e 69 74 28 0a 20 20 46 74 73 35 42 75 66  rInit(.  Fts5Buf
24bd0 66 65 72 20 2a 70 42 75 66 2c 20 0a 20 20 46 74  fer *pBuf, .  Ft
24be0 73 35 44 6f 63 6c 69 73 74 49 74 65 72 20 2a 70  s5DoclistIter *p
24bf0 49 74 65 72 0a 29 7b 0a 20 20 6d 65 6d 73 65 74  Iter.){.  memset
24c00 28 70 49 74 65 72 2c 20 30 2c 20 73 69 7a 65 6f  (pIter, 0, sizeo
24c10 66 28 2a 70 49 74 65 72 29 29 3b 0a 20 20 70 49  f(*pIter));.  pI
24c20 74 65 72 2d 3e 61 50 6f 73 6c 69 73 74 20 3d 20  ter->aPoslist = 
24c30 70 42 75 66 2d 3e 70 3b 0a 20 20 70 49 74 65 72  pBuf->p;.  pIter
24c40 2d 3e 61 45 6f 66 20 3d 20 26 70 42 75 66 2d 3e  ->aEof = &pBuf->
24c50 70 5b 70 42 75 66 2d 3e 6e 5d 3b 0a 20 20 66 74  p[pBuf->n];.  ft
24c60 73 35 44 6f 63 6c 69 73 74 49 74 65 72 4e 65 78  s5DoclistIterNex
24c70 74 28 70 49 74 65 72 29 3b 0a 7d 0a 0a 23 69 66  t(pIter);.}..#if
24c80 20 30 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64 20   0./*.** Append 
24c90 61 20 64 6f 63 6c 69 73 74 20 74 6f 20 62 75 66  a doclist to buf
24ca0 66 65 72 20 70 42 75 66 2e 0a 2a 2a 0a 2a 2a 20  fer pBuf..**.** 
24cb0 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 73  This function as
24cc0 73 75 6d 65 73 20 74 68 61 74 20 73 70 61 63 65  sumes that space
24cd0 20 77 69 74 68 69 6e 20 74 68 65 20 62 75 66 66   within the buff
24ce0 65 72 20 68 61 73 20 61 6c 72 65 61 64 79 20 62  er has already b
24cf0 65 65 6e 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65 64  een.** allocated
24d00 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
24d10 20 66 74 73 35 4d 65 72 67 65 41 70 70 65 6e 64   fts5MergeAppend
24d20 44 6f 63 69 64 28 0a 20 20 46 74 73 35 42 75 66  Docid(.  Fts5Buf
24d30 66 65 72 20 2a 70 42 75 66 2c 20 20 20 20 20 20  fer *pBuf,      
24d40 20 20 20 20 20 20 20 20 20 2f 2a 20 42 75 66 66           /* Buff
24d50 65 72 20 74 6f 20 77 72 69 74 65 20 74 6f 20 2a  er to write to *
24d60 2f 0a 20 20 69 36 34 20 2a 70 69 4c 61 73 74 52  /.  i64 *piLastR
24d70 6f 77 69 64 2c 20 20 20 20 20 20 20 20 20 20 20  owid,           
24d80 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 50      /* IN/OUT: P
24d90 72 65 76 69 6f 75 73 20 72 6f 77 69 64 20 77 72  revious rowid wr
24da0 69 74 74 65 6e 20 28 69 66 20 61 6e 79 29 20 2a  itten (if any) *
24db0 2f 0a 20 20 69 36 34 20 69 52 6f 77 69 64 20 20  /.  i64 iRowid  
24dc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24dd0 20 20 20 20 2f 2a 20 52 6f 77 69 64 20 74 6f 20      /* Rowid to 
24de0 61 70 70 65 6e 64 20 2a 2f 0a 29 7b 0a 20 20 61  append */.){.  a
24df0 73 73 65 72 74 28 20 70 42 75 66 2d 3e 6e 21 3d  ssert( pBuf->n!=
24e00 30 20 7c 7c 20 28 2a 70 69 4c 61 73 74 52 6f 77  0 || (*piLastRow
24e10 69 64 29 3d 3d 30 20 29 3b 0a 20 20 66 74 73 35  id)==0 );.  fts5
24e20 42 75 66 66 65 72 53 61 66 65 41 70 70 65 6e 64  BufferSafeAppend
24e30 56 61 72 69 6e 74 28 70 42 75 66 2c 20 69 52 6f  Varint(pBuf, iRo
24e40 77 69 64 20 2d 20 2a 70 69 4c 61 73 74 52 6f 77  wid - *piLastRow
24e50 69 64 29 3b 0a 20 20 2a 70 69 4c 61 73 74 52 6f  id);.  *piLastRo
24e60 77 69 64 20 3d 20 69 52 6f 77 69 64 3b 0a 7d 0a  wid = iRowid;.}.
24e70 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20  #endif..#define 
24e80 66 74 73 35 4d 65 72 67 65 41 70 70 65 6e 64 44  fts5MergeAppendD
24e90 6f 63 69 64 28 70 42 75 66 2c 20 69 4c 61 73 74  ocid(pBuf, iLast
24ea0 52 6f 77 69 64 2c 20 69 52 6f 77 69 64 29 20 7b  Rowid, iRowid) {
24eb0 20 20 20 20 20 20 20 5c 0a 20 20 61 73 73 65 72         \.  asser
24ec0 74 28 20 28 70 42 75 66 29 2d 3e 6e 21 3d 30 20  t( (pBuf)->n!=0 
24ed0 7c 7c 20 28 69 4c 61 73 74 52 6f 77 69 64 29 3d  || (iLastRowid)=
24ee0 3d 30 20 29 3b 20 20 20 20 20 20 20 20 20 20 20  =0 );           
24ef0 20 20 20 20 20 20 20 20 5c 0a 20 20 66 74 73 35          \.  fts5
24f00 42 75 66 66 65 72 53 61 66 65 41 70 70 65 6e 64  BufferSafeAppend
24f10 56 61 72 69 6e 74 28 28 70 42 75 66 29 2c 20 28  Varint((pBuf), (
24f20 69 52 6f 77 69 64 29 20 2d 20 28 69 4c 61 73 74  iRowid) - (iLast
24f30 52 6f 77 69 64 29 29 3b 20 5c 0a 20 20 28 69 4c  Rowid)); \.  (iL
24f40 61 73 74 52 6f 77 69 64 29 20 3d 20 28 69 52 6f  astRowid) = (iRo
24f50 77 69 64 29 3b 20 20 20 20 20 20 20 20 20 20 20  wid);           
24f60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24f70 20 20 20 20 20 20 20 20 20 20 5c 0a 7d 0a 0a 2f            \.}../
24f80 2a 0a 2a 2a 20 53 77 61 70 20 74 68 65 20 63 6f  *.** Swap the co
24f90 6e 74 65 6e 74 73 20 6f 66 20 62 75 66 66 65 72  ntents of buffer
24fa0 20 2a 70 31 20 77 69 74 68 20 74 68 61 74 20 6f   *p1 with that o
24fb0 66 20 2a 70 32 2e 0a 2a 2f 0a 73 74 61 74 69 63  f *p2..*/.static
24fc0 20 76 6f 69 64 20 66 74 73 35 42 75 66 66 65 72   void fts5Buffer
24fd0 53 77 61 70 28 46 74 73 35 42 75 66 66 65 72 20  Swap(Fts5Buffer 
24fe0 2a 70 31 2c 20 46 74 73 35 42 75 66 66 65 72 20  *p1, Fts5Buffer 
24ff0 2a 70 32 29 7b 0a 20 20 46 74 73 35 42 75 66 66  *p2){.  Fts5Buff
25000 65 72 20 74 6d 70 20 3d 20 2a 70 31 3b 0a 20 20  er tmp = *p1;.  
25010 2a 70 31 20 3d 20 2a 70 32 3b 0a 20 20 2a 70 32  *p1 = *p2;.  *p2
25020 20 3d 20 74 6d 70 3b 0a 7d 0a 0a 73 74 61 74 69   = tmp;.}..stati
25030 63 20 76 6f 69 64 20 66 74 73 35 4e 65 78 74 52  c void fts5NextR
25040 6f 77 69 64 28 46 74 73 35 42 75 66 66 65 72 20  owid(Fts5Buffer 
25050 2a 70 42 75 66 2c 20 69 6e 74 20 2a 70 69 4f 66  *pBuf, int *piOf
25060 66 2c 20 69 36 34 20 2a 70 69 52 6f 77 69 64 29  f, i64 *piRowid)
25070 7b 0a 20 20 69 6e 74 20 69 20 3d 20 2a 70 69 4f  {.  int i = *piO
25080 66 66 3b 0a 20 20 69 66 28 20 69 3e 3d 70 42 75  ff;.  if( i>=pBu
25090 66 2d 3e 6e 20 29 7b 0a 20 20 20 20 2a 70 69 4f  f->n ){.    *piO
250a0 66 66 20 3d 20 2d 31 3b 0a 20 20 7d 65 6c 73 65  ff = -1;.  }else
250b0 7b 0a 20 20 20 20 75 36 34 20 69 56 61 6c 3b 0a  {.    u64 iVal;.
250c0 20 20 20 20 2a 70 69 4f 66 66 20 3d 20 69 20 2b      *piOff = i +
250d0 20 73 71 6c 69 74 65 33 46 74 73 35 47 65 74 56   sqlite3Fts5GetV
250e0 61 72 69 6e 74 28 26 70 42 75 66 2d 3e 70 5b 69  arint(&pBuf->p[i
250f0 5d 2c 20 26 69 56 61 6c 29 3b 0a 20 20 20 20 2a  ], &iVal);.    *
25100 70 69 52 6f 77 69 64 20 2b 3d 20 69 56 61 6c 3b  piRowid += iVal;
25110 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  .  }.}../*.** Th
25120 69 73 20 69 73 20 74 68 65 20 65 71 75 69 76 61  is is the equiva
25130 6c 65 6e 74 20 6f 66 20 66 74 73 35 4d 65 72 67  lent of fts5Merg
25140 65 50 72 65 66 69 78 4c 69 73 74 73 28 29 20 66  ePrefixLists() f
25150 6f 72 20 64 65 74 61 69 6c 3d 6e 6f 6e 65 20 6d  or detail=none m
25160 6f 64 65 2e 0a 2a 2a 20 49 6e 20 74 68 69 73 20  ode..** In this 
25170 63 61 73 65 20 74 68 65 20 62 75 66 66 65 72 73  case the buffers
25180 20 63 6f 6e 73 69 73 74 20 6f 66 20 61 20 64 65   consist of a de
25190 6c 74 61 2d 65 6e 63 6f 64 65 64 20 6c 69 73 74  lta-encoded list
251a0 20 6f 66 20 72 6f 77 69 64 73 20 6f 6e 6c 79 2e   of rowids only.
251b0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
251c0 66 74 73 35 4d 65 72 67 65 52 6f 77 69 64 4c 69  fts5MergeRowidLi
251d0 73 74 73 28 0a 20 20 46 74 73 35 49 6e 64 65 78  sts(.  Fts5Index
251e0 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
251f0 20 20 20 20 20 20 20 2f 2a 20 46 54 53 35 20 62         /* FTS5 b
25200 61 63 6b 65 6e 64 20 6f 62 6a 65 63 74 20 2a 2f  ackend object */
25210 0a 20 20 46 74 73 35 42 75 66 66 65 72 20 2a 70  .  Fts5Buffer *p
25220 31 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  1,              
25230 20 20 20 2f 2a 20 46 69 72 73 74 20 6c 69 73 74     /* First list
25240 20 74 6f 20 6d 65 72 67 65 20 2a 2f 0a 20 20 46   to merge */.  F
25250 74 73 35 42 75 66 66 65 72 20 2a 70 32 20 20 20  ts5Buffer *p2   
25260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
25270 2a 20 53 65 63 6f 6e 64 20 6c 69 73 74 20 74 6f  * Second list to
25280 20 6d 65 72 67 65 20 2a 2f 0a 29 7b 0a 20 20 69   merge */.){.  i
25290 6e 74 20 69 31 20 3d 20 30 3b 0a 20 20 69 6e 74  nt i1 = 0;.  int
252a0 20 69 32 20 3d 20 30 3b 0a 20 20 69 36 34 20 69   i2 = 0;.  i64 i
252b0 52 6f 77 69 64 31 20 3d 20 30 3b 0a 20 20 69 36  Rowid1 = 0;.  i6
252c0 34 20 69 52 6f 77 69 64 32 20 3d 20 30 3b 0a 20  4 iRowid2 = 0;. 
252d0 20 69 36 34 20 69 4f 75 74 20 3d 20 30 3b 0a 0a   i64 iOut = 0;..
252e0 20 20 46 74 73 35 42 75 66 66 65 72 20 6f 75 74    Fts5Buffer out
252f0 3b 0a 20 20 6d 65 6d 73 65 74 28 26 6f 75 74 2c  ;.  memset(&out,
25300 20 30 2c 20 73 69 7a 65 6f 66 28 6f 75 74 29 29   0, sizeof(out))
25310 3b 0a 20 20 73 71 6c 69 74 65 33 46 74 73 35 42  ;.  sqlite3Fts5B
25320 75 66 66 65 72 53 69 7a 65 28 26 70 2d 3e 72 63  ufferSize(&p->rc
25330 2c 20 26 6f 75 74 2c 20 70 31 2d 3e 6e 20 2b 20  , &out, p1->n + 
25340 70 32 2d 3e 6e 29 3b 0a 20 20 69 66 28 20 70 2d  p2->n);.  if( p-
25350 3e 72 63 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20  >rc ) return;.. 
25360 20 66 74 73 35 4e 65 78 74 52 6f 77 69 64 28 70   fts5NextRowid(p
25370 31 2c 20 26 69 31 2c 20 26 69 52 6f 77 69 64 31  1, &i1, &iRowid1
25380 29 3b 0a 20 20 66 74 73 35 4e 65 78 74 52 6f 77  );.  fts5NextRow
25390 69 64 28 70 32 2c 20 26 69 32 2c 20 26 69 52 6f  id(p2, &i2, &iRo
253a0 77 69 64 32 29 3b 0a 20 20 77 68 69 6c 65 28 20  wid2);.  while( 
253b0 69 31 3e 3d 30 20 7c 7c 20 69 32 3e 3d 30 20 29  i1>=0 || i2>=0 )
253c0 7b 0a 20 20 20 20 69 66 28 20 69 31 3e 3d 30 20  {.    if( i1>=0 
253d0 26 26 20 28 69 32 3c 30 20 7c 7c 20 69 52 6f 77  && (i2<0 || iRow
253e0 69 64 31 3c 69 52 6f 77 69 64 32 29 20 29 7b 0a  id1<iRowid2) ){.
253f0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69 4f        assert( iO
25400 75 74 3d 3d 30 20 7c 7c 20 69 52 6f 77 69 64 31  ut==0 || iRowid1
25410 3e 69 4f 75 74 20 29 3b 0a 20 20 20 20 20 20 66  >iOut );.      f
25420 74 73 35 42 75 66 66 65 72 53 61 66 65 41 70 70  ts5BufferSafeApp
25430 65 6e 64 56 61 72 69 6e 74 28 26 6f 75 74 2c 20  endVarint(&out, 
25440 69 52 6f 77 69 64 31 20 2d 20 69 4f 75 74 29 3b  iRowid1 - iOut);
25450 0a 20 20 20 20 20 20 69 4f 75 74 20 3d 20 69 52  .      iOut = iR
25460 6f 77 69 64 31 3b 0a 20 20 20 20 20 20 66 74 73  owid1;.      fts
25470 35 4e 65 78 74 52 6f 77 69 64 28 70 31 2c 20 26  5NextRowid(p1, &
25480 69 31 2c 20 26 69 52 6f 77 69 64 31 29 3b 0a 20  i1, &iRowid1);. 
25490 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
254a0 61 73 73 65 72 74 28 20 69 4f 75 74 3d 3d 30 20  assert( iOut==0 
254b0 7c 7c 20 69 52 6f 77 69 64 32 3e 69 4f 75 74 20  || iRowid2>iOut 
254c0 29 3b 0a 20 20 20 20 20 20 66 74 73 35 42 75 66  );.      fts5Buf
254d0 66 65 72 53 61 66 65 41 70 70 65 6e 64 56 61 72  ferSafeAppendVar
254e0 69 6e 74 28 26 6f 75 74 2c 20 69 52 6f 77 69 64  int(&out, iRowid
254f0 32 20 2d 20 69 4f 75 74 29 3b 0a 20 20 20 20 20  2 - iOut);.     
25500 20 69 4f 75 74 20 3d 20 69 52 6f 77 69 64 32 3b   iOut = iRowid2;
25510 0a 20 20 20 20 20 20 69 66 28 20 69 31 3e 3d 30  .      if( i1>=0
25520 20 26 26 20 69 52 6f 77 69 64 31 3d 3d 69 52 6f   && iRowid1==iRo
25530 77 69 64 32 20 29 7b 0a 20 20 20 20 20 20 20 20  wid2 ){.        
25540 66 74 73 35 4e 65 78 74 52 6f 77 69 64 28 70 31  fts5NextRowid(p1
25550 2c 20 26 69 31 2c 20 26 69 52 6f 77 69 64 31 29  , &i1, &iRowid1)
25560 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
25570 66 74 73 35 4e 65 78 74 52 6f 77 69 64 28 70 32  fts5NextRowid(p2
25580 2c 20 26 69 32 2c 20 26 69 52 6f 77 69 64 32 29  , &i2, &iRowid2)
25590 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 66  ;.    }.  }..  f
255a0 74 73 35 42 75 66 66 65 72 53 77 61 70 28 26 6f  ts5BufferSwap(&o
255b0 75 74 2c 20 70 31 29 3b 0a 20 20 66 74 73 35 42  ut, p1);.  fts5B
255c0 75 66 66 65 72 46 72 65 65 28 26 6f 75 74 29 3b  ufferFree(&out);
255d0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42 75 66 66 65 72  .}../*.** Buffer
255e0 73 20 70 31 20 61 6e 64 20 70 32 20 63 6f 6e 74  s p1 and p2 cont
255f0 61 69 6e 20 64 6f 63 6c 69 73 74 73 2e 20 54 68  ain doclists. Th
25600 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 65 72 67  is function merg
25610 65 73 20 74 68 65 20 63 6f 6e 74 65 6e 74 0a 2a  es the content.*
25620 2a 20 6f 66 20 74 68 65 20 74 77 6f 20 64 6f 63  * of the two doc
25630 6c 69 73 74 73 20 74 6f 67 65 74 68 65 72 20 61  lists together a
25640 6e 64 20 73 65 74 73 20 62 75 66 66 65 72 20 70  nd sets buffer p
25650 31 20 74 6f 20 74 68 65 20 72 65 73 75 6c 74 20  1 to the result 
25660 62 65 66 6f 72 65 0a 2a 2a 20 72 65 74 75 72 6e  before.** return
25670 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  ing..**.** If an
25680 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 61   error occurs, a
25690 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  n error code is 
256a0 6c 65 66 74 20 69 6e 20 70 2d 3e 72 63 2e 20 49  left in p->rc. I
256b0 66 20 61 6e 20 65 72 72 6f 72 20 68 61 73 0a 2a  f an error has.*
256c0 2a 20 61 6c 72 65 61 64 79 20 6f 63 63 75 72 72  * already occurr
256d0 65 64 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ed, this functio
256e0 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f  n is a no-op..*/
256f0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
25700 35 4d 65 72 67 65 50 72 65 66 69 78 4c 69 73 74  5MergePrefixList
25710 73 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a  s(.  Fts5Index *
25720 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
25730 20 20 20 20 20 2f 2a 20 46 54 53 35 20 62 61 63       /* FTS5 bac
25740 6b 65 6e 64 20 6f 62 6a 65 63 74 20 2a 2f 0a 20  kend object */. 
25750 20 46 74 73 35 42 75 66 66 65 72 20 2a 70 31 2c   Fts5Buffer *p1,
25760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25770 20 2f 2a 20 46 69 72 73 74 20 6c 69 73 74 20 74   /* First list t
25780 6f 20 6d 65 72 67 65 20 2a 2f 0a 20 20 46 74 73  o merge */.  Fts
25790 35 42 75 66 66 65 72 20 2a 70 32 20 20 20 20 20  5Buffer *p2     
257a0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
257b0 53 65 63 6f 6e 64 20 6c 69 73 74 20 74 6f 20 6d  Second list to m
257c0 65 72 67 65 20 2a 2f 0a 29 7b 0a 20 20 69 66 28  erge */.){.  if(
257d0 20 70 32 2d 3e 6e 20 29 7b 0a 20 20 20 20 69 36   p2->n ){.    i6
257e0 34 20 69 4c 61 73 74 52 6f 77 69 64 20 3d 20 30  4 iLastRowid = 0
257f0 3b 0a 20 20 20 20 46 74 73 35 44 6f 63 6c 69 73  ;.    Fts5Doclis
25800 74 49 74 65 72 20 69 31 3b 0a 20 20 20 20 46 74  tIter i1;.    Ft
25810 73 35 44 6f 63 6c 69 73 74 49 74 65 72 20 69 32  s5DoclistIter i2
25820 3b 0a 20 20 20 20 46 74 73 35 42 75 66 66 65 72  ;.    Fts5Buffer
25830 20 6f 75 74 20 3d 20 7b 30 2c 20 30 2c 20 30 7d   out = {0, 0, 0}
25840 3b 0a 20 20 20 20 46 74 73 35 42 75 66 66 65 72  ;.    Fts5Buffer
25850 20 74 6d 70 20 3d 20 7b 30 2c 20 30 2c 20 30 7d   tmp = {0, 0, 0}
25860 3b 0a 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  ;..    if( sqlit
25870 65 33 46 74 73 35 42 75 66 66 65 72 53 69 7a 65  e3Fts5BufferSize
25880 28 26 70 2d 3e 72 63 2c 20 26 6f 75 74 2c 20 70  (&p->rc, &out, p
25890 31 2d 3e 6e 20 2b 20 70 32 2d 3e 6e 29 20 29 20  1->n + p2->n) ) 
258a0 72 65 74 75 72 6e 3b 0a 20 20 20 20 66 74 73 35  return;.    fts5
258b0 44 6f 63 6c 69 73 74 49 74 65 72 49 6e 69 74 28  DoclistIterInit(
258c0 70 31 2c 20 26 69 31 29 3b 0a 20 20 20 20 66 74  p1, &i1);.    ft
258d0 73 35 44 6f 63 6c 69 73 74 49 74 65 72 49 6e 69  s5DoclistIterIni
258e0 74 28 70 32 2c 20 26 69 32 29 3b 0a 0a 20 20 20  t(p2, &i2);..   
258f0 20 77 68 69 6c 65 28 20 31 20 29 7b 0a 20 20 20   while( 1 ){.   
25900 20 20 20 69 66 28 20 69 31 2e 69 52 6f 77 69 64     if( i1.iRowid
25910 3c 69 32 2e 69 52 6f 77 69 64 20 29 7b 0a 20 20  <i2.iRowid ){.  
25920 20 20 20 20 20 20 2f 2a 20 43 6f 70 79 20 65 6e        /* Copy en
25930 74 72 79 20 66 72 6f 6d 20 69 31 20 2a 2f 0a 20  try from i1 */. 
25940 20 20 20 20 20 20 20 66 74 73 35 4d 65 72 67 65         fts5Merge
25950 41 70 70 65 6e 64 44 6f 63 69 64 28 26 6f 75 74  AppendDocid(&out
25960 2c 20 69 4c 61 73 74 52 6f 77 69 64 2c 20 69 31  , iLastRowid, i1
25970 2e 69 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20  .iRowid);.      
25980 20 20 66 74 73 35 42 75 66 66 65 72 53 61 66 65    fts5BufferSafe
25990 41 70 70 65 6e 64 42 6c 6f 62 28 26 6f 75 74 2c  AppendBlob(&out,
259a0 20 69 31 2e 61 50 6f 73 6c 69 73 74 2c 20 69 31   i1.aPoslist, i1
259b0 2e 6e 50 6f 73 6c 69 73 74 2b 69 31 2e 6e 53 69  .nPoslist+i1.nSi
259c0 7a 65 29 3b 0a 20 20 20 20 20 20 20 20 66 74 73  ze);.        fts
259d0 35 44 6f 63 6c 69 73 74 49 74 65 72 4e 65 78 74  5DoclistIterNext
259e0 28 26 69 31 29 3b 0a 20 20 20 20 20 20 20 20 69  (&i1);.        i
259f0 66 28 20 69 31 2e 61 50 6f 73 6c 69 73 74 3d 3d  f( i1.aPoslist==
25a00 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  0 ) break;.     
25a10 20 7d 0a 20 20 20 20 20 20 65 6c 73 65 20 69 66   }.      else if
25a20 28 20 69 32 2e 69 52 6f 77 69 64 21 3d 69 31 2e  ( i2.iRowid!=i1.
25a30 69 52 6f 77 69 64 20 29 7b 0a 20 20 20 20 20 20  iRowid ){.      
25a40 20 20 2f 2a 20 43 6f 70 79 20 65 6e 74 72 79 20    /* Copy entry 
25a50 66 72 6f 6d 20 69 32 20 2a 2f 0a 20 20 20 20 20  from i2 */.     
25a60 20 20 20 66 74 73 35 4d 65 72 67 65 41 70 70 65     fts5MergeAppe
25a70 6e 64 44 6f 63 69 64 28 26 6f 75 74 2c 20 69 4c  ndDocid(&out, iL
25a80 61 73 74 52 6f 77 69 64 2c 20 69 32 2e 69 52 6f  astRowid, i2.iRo
25a90 77 69 64 29 3b 0a 20 20 20 20 20 20 20 20 66 74  wid);.        ft
25aa0 73 35 42 75 66 66 65 72 53 61 66 65 41 70 70 65  s5BufferSafeAppe
25ab0 6e 64 42 6c 6f 62 28 26 6f 75 74 2c 20 69 32 2e  ndBlob(&out, i2.
25ac0 61 50 6f 73 6c 69 73 74 2c 20 69 32 2e 6e 50 6f  aPoslist, i2.nPo
25ad0 73 6c 69 73 74 2b 69 32 2e 6e 53 69 7a 65 29 3b  slist+i2.nSize);
25ae0 0a 20 20 20 20 20 20 20 20 66 74 73 35 44 6f 63  .        fts5Doc
25af0 6c 69 73 74 49 74 65 72 4e 65 78 74 28 26 69 32  listIterNext(&i2
25b00 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69  );.        if( i
25b10 32 2e 61 50 6f 73 6c 69 73 74 3d 3d 30 20 29 20  2.aPoslist==0 ) 
25b20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
25b30 20 20 20 20 20 65 6c 73 65 7b 0a 20 20 20 20 20       else{.     
25b40 20 20 20 2f 2a 20 4d 65 72 67 65 20 74 68 65 20     /* Merge the 
25b50 74 77 6f 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73  two position lis
25b60 74 73 2e 20 2a 2f 20 0a 20 20 20 20 20 20 20 20  ts. */ .        
25b70 69 36 34 20 69 50 6f 73 31 20 3d 20 30 3b 0a 20  i64 iPos1 = 0;. 
25b80 20 20 20 20 20 20 20 69 36 34 20 69 50 6f 73 32         i64 iPos2
25b90 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 69 6e   = 0;.        in
25ba0 74 20 69 4f 66 66 31 20 3d 20 30 3b 0a 20 20 20  t iOff1 = 0;.   
25bb0 20 20 20 20 20 69 6e 74 20 69 4f 66 66 32 20 3d       int iOff2 =
25bc0 20 30 3b 0a 20 20 20 20 20 20 20 20 75 38 20 2a   0;.        u8 *
25bd0 61 31 20 3d 20 26 69 31 2e 61 50 6f 73 6c 69 73  a1 = &i1.aPoslis
25be0 74 5b 69 31 2e 6e 53 69 7a 65 5d 3b 0a 20 20 20  t[i1.nSize];.   
25bf0 20 20 20 20 20 75 38 20 2a 61 32 20 3d 20 26 69       u8 *a2 = &i
25c00 32 2e 61 50 6f 73 6c 69 73 74 5b 69 32 2e 6e 53  2.aPoslist[i2.nS
25c10 69 7a 65 5d 3b 0a 0a 20 20 20 20 20 20 20 20 69  ize];..        i
25c20 36 34 20 69 50 72 65 76 20 3d 20 30 3b 0a 20 20  64 iPrev = 0;.  
25c30 20 20 20 20 20 20 46 74 73 35 50 6f 73 6c 69 73        Fts5Poslis
25c40 74 57 72 69 74 65 72 20 77 72 69 74 65 72 3b 0a  tWriter writer;.
25c50 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28 26          memset(&
25c60 77 72 69 74 65 72 2c 20 30 2c 20 73 69 7a 65 6f  writer, 0, sizeo
25c70 66 28 77 72 69 74 65 72 29 29 3b 0a 0a 20 20 20  f(writer));..   
25c80 20 20 20 20 20 66 74 73 35 4d 65 72 67 65 41 70       fts5MergeAp
25c90 70 65 6e 64 44 6f 63 69 64 28 26 6f 75 74 2c 20  pendDocid(&out, 
25ca0 69 4c 61 73 74 52 6f 77 69 64 2c 20 69 32 2e 69  iLastRowid, i2.i
25cb0 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 20 20  Rowid);.        
25cc0 66 74 73 35 42 75 66 66 65 72 5a 65 72 6f 28 26  fts5BufferZero(&
25cd0 74 6d 70 29 3b 0a 20 20 20 20 20 20 20 20 73 71  tmp);.        sq
25ce0 6c 69 74 65 33 46 74 73 35 42 75 66 66 65 72 53  lite3Fts5BufferS
25cf0 69 7a 65 28 26 70 2d 3e 72 63 2c 20 26 74 6d 70  ize(&p->rc, &tmp
25d00 2c 20 69 31 2e 6e 50 6f 73 6c 69 73 74 20 2b 20  , i1.nPoslist + 
25d10 69 32 2e 6e 50 6f 73 6c 69 73 74 29 3b 0a 20 20  i2.nPoslist);.  
25d20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72 63 20        if( p->rc 
25d30 29 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 20 20  ) break;..      
25d40 20 20 73 71 6c 69 74 65 33 46 74 73 35 50 6f 73    sqlite3Fts5Pos
25d50 6c 69 73 74 4e 65 78 74 36 34 28 61 31 2c 20 69  listNext64(a1, i
25d60 31 2e 6e 50 6f 73 6c 69 73 74 2c 20 26 69 4f 66  1.nPoslist, &iOf
25d70 66 31 2c 20 26 69 50 6f 73 31 29 3b 0a 20 20 20  f1, &iPos1);.   
25d80 20 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35       sqlite3Fts5
25d90 50 6f 73 6c 69 73 74 4e 65 78 74 36 34 28 61 32  PoslistNext64(a2
25da0 2c 20 69 32 2e 6e 50 6f 73 6c 69 73 74 2c 20 26  , i2.nPoslist, &
25db0 69 4f 66 66 32 2c 20 26 69 50 6f 73 32 29 3b 0a  iOff2, &iPos2);.
25dc0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
25dd0 69 50 6f 73 31 3e 3d 30 20 26 26 20 69 50 6f 73  iPos1>=0 && iPos
25de0 32 3e 3d 30 20 29 3b 0a 0a 20 20 20 20 20 20 20  2>=0 );..       
25df0 20 69 66 28 20 69 50 6f 73 31 3c 69 50 6f 73 32   if( iPos1<iPos2
25e00 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
25e10 6c 69 74 65 33 46 74 73 35 50 6f 73 6c 69 73 74  lite3Fts5Poslist
25e20 53 61 66 65 41 70 70 65 6e 64 28 26 74 6d 70 2c  SafeAppend(&tmp,
25e30 20 26 69 50 72 65 76 2c 20 69 50 6f 73 31 29 3b   &iPrev, iPos1);
25e40 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
25e50 65 33 46 74 73 35 50 6f 73 6c 69 73 74 4e 65 78  e3Fts5PoslistNex
25e60 74 36 34 28 61 31 2c 20 69 31 2e 6e 50 6f 73 6c  t64(a1, i1.nPosl
25e70 69 73 74 2c 20 26 69 4f 66 66 31 2c 20 26 69 50  ist, &iOff1, &iP
25e80 6f 73 31 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  os1);.        }e
25e90 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 73  lse{.          s
25ea0 71 6c 69 74 65 33 46 74 73 35 50 6f 73 6c 69 73  qlite3Fts5Poslis
25eb0 74 53 61 66 65 41 70 70 65 6e 64 28 26 74 6d 70  tSafeAppend(&tmp
25ec0 2c 20 26 69 50 72 65 76 2c 20 69 50 6f 73 32 29  , &iPrev, iPos2)
25ed0 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
25ee0 74 65 33 46 74 73 35 50 6f 73 6c 69 73 74 4e 65  te3Fts5PoslistNe
25ef0 78 74 36 34 28 61 32 2c 20 69 32 2e 6e 50 6f 73  xt64(a2, i2.nPos
25f00 6c 69 73 74 2c 20 26 69 4f 66 66 32 2c 20 26 69  list, &iOff2, &i
25f10 50 6f 73 32 29 3b 0a 20 20 20 20 20 20 20 20 7d  Pos2);.        }
25f20 0a 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 50  ..        if( iP
25f30 6f 73 31 3e 3d 30 20 26 26 20 69 50 6f 73 32 3e  os1>=0 && iPos2>
25f40 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
25f50 77 68 69 6c 65 28 20 31 20 29 7b 0a 20 20 20 20  while( 1 ){.    
25f60 20 20 20 20 20 20 20 20 69 66 28 20 69 50 6f 73          if( iPos
25f70 31 3c 69 50 6f 73 32 20 29 7b 0a 20 20 20 20 20  1<iPos2 ){.     
25f80 20 20 20 20 20 20 20 20 20 69 66 28 20 69 50 6f           if( iPo
25f90 73 31 21 3d 69 50 72 65 76 20 29 7b 0a 20 20 20  s1!=iPrev ){.   
25fa0 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
25fb0 69 74 65 33 46 74 73 35 50 6f 73 6c 69 73 74 53  ite3Fts5PoslistS
25fc0 61 66 65 41 70 70 65 6e 64 28 26 74 6d 70 2c 20  afeAppend(&tmp, 
25fd0 26 69 50 72 65 76 2c 20 69 50 6f 73 31 29 3b 0a  &iPrev, iPos1);.
25fe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a                }.
25ff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
26000 6c 69 74 65 33 46 74 73 35 50 6f 73 6c 69 73 74  lite3Fts5Poslist
26010 4e 65 78 74 36 34 28 61 31 2c 20 69 31 2e 6e 50  Next64(a1, i1.nP
26020 6f 73 6c 69 73 74 2c 20 26 69 4f 66 66 31 2c 20  oslist, &iOff1, 
26030 26 69 50 6f 73 31 29 3b 0a 20 20 20 20 20 20 20  &iPos1);.       
26040 20 20 20 20 20 20 20 69 66 28 20 69 50 6f 73 31         if( iPos1
26050 3c 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  <0 ) break;.    
26060 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
26070 20 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73               ass
26080 65 72 74 28 20 69 50 6f 73 32 21 3d 69 50 72 65  ert( iPos2!=iPre
26090 76 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  v );.           
260a0 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 50 6f     sqlite3Fts5Po
260b0 73 6c 69 73 74 53 61 66 65 41 70 70 65 6e 64 28  slistSafeAppend(
260c0 26 74 6d 70 2c 20 26 69 50 72 65 76 2c 20 69 50  &tmp, &iPrev, iP
260d0 6f 73 32 29 3b 0a 20 20 20 20 20 20 20 20 20 20  os2);.          
260e0 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 50      sqlite3Fts5P
260f0 6f 73 6c 69 73 74 4e 65 78 74 36 34 28 61 32 2c  oslistNext64(a2,
26100 20 69 32 2e 6e 50 6f 73 6c 69 73 74 2c 20 26 69   i2.nPoslist, &i
26110 4f 66 66 32 2c 20 26 69 50 6f 73 32 29 3b 0a 20  Off2, &iPos2);. 
26120 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28               if(
26130 20 69 50 6f 73 32 3c 30 20 29 20 62 72 65 61 6b   iPos2<0 ) break
26140 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
26150 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
26160 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 69      }..        i
26170 66 28 20 69 50 6f 73 31 3e 3d 30 20 29 7b 0a 20  f( iPos1>=0 ){. 
26180 20 20 20 20 20 20 20 20 20 69 66 28 20 69 50 6f           if( iPo
26190 73 31 21 3d 69 50 72 65 76 20 29 7b 0a 20 20 20  s1!=iPrev ){.   
261a0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
261b0 46 74 73 35 50 6f 73 6c 69 73 74 53 61 66 65 41  Fts5PoslistSafeA
261c0 70 70 65 6e 64 28 26 74 6d 70 2c 20 26 69 50 72  ppend(&tmp, &iPr
261d0 65 76 2c 20 69 50 6f 73 31 29 3b 0a 20 20 20 20  ev, iPos1);.    
261e0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
261f0 20 20 66 74 73 35 42 75 66 66 65 72 53 61 66 65    fts5BufferSafe
26200 41 70 70 65 6e 64 42 6c 6f 62 28 26 74 6d 70 2c  AppendBlob(&tmp,
26210 20 26 61 31 5b 69 4f 66 66 31 5d 2c 20 69 31 2e   &a1[iOff1], i1.
26220 6e 50 6f 73 6c 69 73 74 2d 69 4f 66 66 31 29 3b  nPoslist-iOff1);
26230 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
26240 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
26250 28 20 69 50 6f 73 32 3e 3d 30 20 26 26 20 69 50  ( iPos2>=0 && iP
26260 6f 73 32 21 3d 69 50 72 65 76 20 29 3b 0a 20 20  os2!=iPrev );.  
26270 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 46          sqlite3F
26280 74 73 35 50 6f 73 6c 69 73 74 53 61 66 65 41 70  ts5PoslistSafeAp
26290 70 65 6e 64 28 26 74 6d 70 2c 20 26 69 50 72 65  pend(&tmp, &iPre
262a0 76 2c 20 69 50 6f 73 32 29 3b 0a 20 20 20 20 20  v, iPos2);.     
262b0 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72 53       fts5BufferS
262c0 61 66 65 41 70 70 65 6e 64 42 6c 6f 62 28 26 74  afeAppendBlob(&t
262d0 6d 70 2c 20 26 61 32 5b 69 4f 66 66 32 5d 2c 20  mp, &a2[iOff2], 
262e0 69 32 2e 6e 50 6f 73 6c 69 73 74 2d 69 4f 66 66  i2.nPoslist-iOff
262f0 32 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20  2);.        }.. 
26300 20 20 20 20 20 20 20 2f 2a 20 57 52 49 54 45 50         /* WRITEP
26310 4f 53 4c 49 53 54 53 49 5a 45 20 2a 2f 0a 20 20  OSLISTSIZE */.  
26320 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72        fts5Buffer
26330 53 61 66 65 41 70 70 65 6e 64 56 61 72 69 6e 74  SafeAppendVarint
26340 28 26 6f 75 74 2c 20 74 6d 70 2e 6e 20 2a 20 32  (&out, tmp.n * 2
26350 29 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35 42  );.        fts5B
26360 75 66 66 65 72 53 61 66 65 41 70 70 65 6e 64 42  ufferSafeAppendB
26370 6c 6f 62 28 26 6f 75 74 2c 20 74 6d 70 2e 70 2c  lob(&out, tmp.p,
26380 20 74 6d 70 2e 6e 29 3b 0a 20 20 20 20 20 20 20   tmp.n);.       
26390 20 66 74 73 35 44 6f 63 6c 69 73 74 49 74 65 72   fts5DoclistIter
263a0 4e 65 78 74 28 26 69 31 29 3b 0a 20 20 20 20 20  Next(&i1);.     
263b0 20 20 20 66 74 73 35 44 6f 63 6c 69 73 74 49 74     fts5DoclistIt
263c0 65 72 4e 65 78 74 28 26 69 32 29 3b 0a 20 20 20  erNext(&i2);.   
263d0 20 20 20 20 20 69 66 28 20 69 31 2e 61 50 6f 73       if( i1.aPos
263e0 6c 69 73 74 3d 3d 30 20 7c 7c 20 69 32 2e 61 50  list==0 || i2.aP
263f0 6f 73 6c 69 73 74 3d 3d 30 20 29 20 62 72 65 61  oslist==0 ) brea
26400 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  k;.      }.    }
26410 0a 0a 20 20 20 20 69 66 28 20 69 31 2e 61 50 6f  ..    if( i1.aPo
26420 73 6c 69 73 74 20 29 7b 0a 20 20 20 20 20 20 66  slist ){.      f
26430 74 73 35 4d 65 72 67 65 41 70 70 65 6e 64 44 6f  ts5MergeAppendDo
26440 63 69 64 28 26 6f 75 74 2c 20 69 4c 61 73 74 52  cid(&out, iLastR
26450 6f 77 69 64 2c 20 69 31 2e 69 52 6f 77 69 64 29  owid, i1.iRowid)
26460 3b 0a 20 20 20 20 20 20 66 74 73 35 42 75 66 66  ;.      fts5Buff
26470 65 72 53 61 66 65 41 70 70 65 6e 64 42 6c 6f 62  erSafeAppendBlob
26480 28 26 6f 75 74 2c 20 69 31 2e 61 50 6f 73 6c 69  (&out, i1.aPosli
26490 73 74 2c 20 69 31 2e 61 45 6f 66 20 2d 20 69 31  st, i1.aEof - i1
264a0 2e 61 50 6f 73 6c 69 73 74 29 3b 0a 20 20 20 20  .aPoslist);.    
264b0 7d 0a 20 20 20 20 65 6c 73 65 20 69 66 28 20 69  }.    else if( i
264c0 32 2e 61 50 6f 73 6c 69 73 74 20 29 7b 0a 20 20  2.aPoslist ){.  
264d0 20 20 20 20 66 74 73 35 4d 65 72 67 65 41 70 70      fts5MergeApp
264e0 65 6e 64 44 6f 63 69 64 28 26 6f 75 74 2c 20 69  endDocid(&out, i
264f0 4c 61 73 74 52 6f 77 69 64 2c 20 69 32 2e 69 52  LastRowid, i2.iR
26500 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 66 74 73  owid);.      fts
26510 35 42 75 66 66 65 72 53 61 66 65 41 70 70 65 6e  5BufferSafeAppen
26520 64 42 6c 6f 62 28 26 6f 75 74 2c 20 69 32 2e 61  dBlob(&out, i2.a
26530 50 6f 73 6c 69 73 74 2c 20 69 32 2e 61 45 6f 66  Poslist, i2.aEof
26540 20 2d 20 69 32 2e 61 50 6f 73 6c 69 73 74 29 3b   - i2.aPoslist);
26550 0a 20 20 20 20 7d 0a 0a 20 20 20 20 66 74 73 35  .    }..    fts5
26560 42 75 66 66 65 72 53 65 74 28 26 70 2d 3e 72 63  BufferSet(&p->rc
26570 2c 20 70 31 2c 20 6f 75 74 2e 6e 2c 20 6f 75 74  , p1, out.n, out
26580 2e 70 29 3b 0a 20 20 20 20 66 74 73 35 42 75 66  .p);.    fts5Buf
26590 66 65 72 46 72 65 65 28 26 74 6d 70 29 3b 0a 20  ferFree(&tmp);. 
265a0 20 20 20 66 74 73 35 42 75 66 66 65 72 46 72 65     fts5BufferFre
265b0 65 28 26 6f 75 74 29 3b 0a 20 20 7d 0a 7d 0a 0a  e(&out);.  }.}..
265c0 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
265d0 53 65 74 75 70 50 72 65 66 69 78 49 74 65 72 28  SetupPrefixIter(
265e0 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c  .  Fts5Index *p,
265f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26600 20 20 20 2f 2a 20 49 6e 64 65 78 20 74 6f 20 72     /* Index to r
26610 65 61 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e  ead from */.  in
26620 74 20 62 44 65 73 63 2c 20 20 20 20 20 20 20 20  t bDesc,        
26630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
26640 20 54 72 75 65 20 66 6f 72 20 22 4f 52 44 45 52   True for "ORDER
26650 20 42 59 20 72 6f 77 69 64 20 44 45 53 43 22 20   BY rowid DESC" 
26660 2a 2f 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 70  */.  const u8 *p
26670 54 6f 6b 65 6e 2c 20 20 20 20 20 20 20 20 20 20  Token,          
26680 20 20 20 20 20 2f 2a 20 42 75 66 66 65 72 20 63       /* Buffer c
26690 6f 6e 74 61 69 6e 69 6e 67 20 70 72 65 66 69 78  ontaining prefix
266a0 20 74 6f 20 6d 61 74 63 68 20 2a 2f 0a 20 20 69   to match */.  i
266b0 6e 74 20 6e 54 6f 6b 65 6e 2c 20 20 20 20 20 20  nt nToken,      
266c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
266d0 2a 20 53 69 7a 65 20 6f 66 20 62 75 66 66 65 72  * Size of buffer
266e0 20 70 54 6f 6b 65 6e 20 69 6e 20 62 79 74 65 73   pToken in bytes
266f0 20 2a 2f 0a 20 20 46 74 73 35 43 6f 6c 73 65 74   */.  Fts5Colset
26700 20 2a 70 43 6f 6c 73 65 74 2c 20 20 20 20 20 20   *pColset,      
26710 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63        /* Restric
26720 74 20 6d 61 74 63 68 65 73 20 74 6f 20 74 68 65  t matches to the
26730 73 65 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20  se columns */.  
26740 46 74 73 35 49 74 65 72 20 2a 2a 70 70 49 74 65  Fts5Iter **ppIte
26750 72 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55  r          /* OU
26760 54 3a 20 4e 65 77 20 69 74 65 72 61 74 6f 72 20  T: New iterator 
26770 2a 2f 0a 29 7b 0a 20 20 46 74 73 35 53 74 72 75  */.){.  Fts5Stru
26780 63 74 75 72 65 20 2a 70 53 74 72 75 63 74 3b 0a  cture *pStruct;.
26790 20 20 46 74 73 35 42 75 66 66 65 72 20 2a 61 42    Fts5Buffer *aB
267a0 75 66 3b 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20  uf;.  const int 
267b0 6e 42 75 66 20 3d 20 33 32 3b 0a 0a 20 20 76 6f  nBuf = 32;..  vo
267c0 69 64 20 28 2a 78 4d 65 72 67 65 29 28 46 74 73  id (*xMerge)(Fts
267d0 35 49 6e 64 65 78 2a 2c 20 46 74 73 35 42 75 66  5Index*, Fts5Buf
267e0 66 65 72 2a 2c 20 46 74 73 35 42 75 66 66 65 72  fer*, Fts5Buffer
267f0 2a 29 3b 0a 20 20 76 6f 69 64 20 28 2a 78 41 70  *);.  void (*xAp
26800 70 65 6e 64 29 28 46 74 73 35 49 6e 64 65 78 2a  pend)(Fts5Index*
26810 2c 20 69 36 34 2c 20 46 74 73 35 49 74 65 72 2a  , i64, Fts5Iter*
26820 2c 20 46 74 73 35 42 75 66 66 65 72 2a 29 3b 0a  , Fts5Buffer*);.
26830 20 20 69 66 28 20 70 2d 3e 70 43 6f 6e 66 69 67    if( p->pConfig
26840 2d 3e 65 44 65 74 61 69 6c 3d 3d 46 54 53 35 5f  ->eDetail==FTS5_
26850 44 45 54 41 49 4c 5f 4e 4f 4e 45 20 29 7b 0a 20  DETAIL_NONE ){. 
26860 20 20 20 78 4d 65 72 67 65 20 3d 20 66 74 73 35     xMerge = fts5
26870 4d 65 72 67 65 52 6f 77 69 64 4c 69 73 74 73 3b  MergeRowidLists;
26880 0a 20 20 20 20 78 41 70 70 65 6e 64 20 3d 20 66  .    xAppend = f
26890 74 73 35 41 70 70 65 6e 64 52 6f 77 69 64 3b 0a  ts5AppendRowid;.
268a0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 78 4d 65    }else{.    xMe
268b0 72 67 65 20 3d 20 66 74 73 35 4d 65 72 67 65 50  rge = fts5MergeP
268c0 72 65 66 69 78 4c 69 73 74 73 3b 0a 20 20 20 20  refixLists;.    
268d0 78 41 70 70 65 6e 64 20 3d 20 66 74 73 35 41 70  xAppend = fts5Ap
268e0 70 65 6e 64 50 6f 73 6c 69 73 74 3b 0a 20 20 7d  pendPoslist;.  }
268f0 0a 0a 20 20 61 42 75 66 20 3d 20 28 46 74 73 35  ..  aBuf = (Fts5
26900 42 75 66 66 65 72 2a 29 66 74 73 35 49 64 78 4d  Buffer*)fts5IdxM
26910 61 6c 6c 6f 63 28 70 2c 20 73 69 7a 65 6f 66 28  alloc(p, sizeof(
26920 46 74 73 35 42 75 66 66 65 72 29 2a 6e 42 75 66  Fts5Buffer)*nBuf
26930 29 3b 0a 20 20 70 53 74 72 75 63 74 20 3d 20 66  );.  pStruct = f
26940 74 73 35 53 74 72 75 63 74 75 72 65 52 65 61 64  ts5StructureRead
26950 28 70 29 3b 0a 0a 20 20 69 66 28 20 61 42 75 66  (p);..  if( aBuf
26960 20 26 26 20 70 53 74 72 75 63 74 20 29 7b 0a 20   && pStruct ){. 
26970 20 20 20 63 6f 6e 73 74 20 69 6e 74 20 66 6c 61     const int fla
26980 67 73 20 3d 20 46 54 53 35 49 4e 44 45 58 5f 51  gs = FTS5INDEX_Q
26990 55 45 52 59 5f 53 43 41 4e 20 0a 20 20 20 20 20  UERY_SCAN .     
269a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
269b0 20 46 54 53 35 49 4e 44 45 58 5f 51 55 45 52 59   FTS5INDEX_QUERY
269c0 5f 53 4b 49 50 45 4d 50 54 59 20 0a 20 20 20 20  _SKIPEMPTY .    
269d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
269e0 7c 20 46 54 53 35 49 4e 44 45 58 5f 51 55 45 52  | FTS5INDEX_QUER
269f0 59 5f 4e 4f 4f 55 54 50 55 54 3b 0a 20 20 20 20  Y_NOOUTPUT;.    
26a00 69 6e 74 20 69 3b 0a 20 20 20 20 69 36 34 20 69  int i;.    i64 i
26a10 4c 61 73 74 52 6f 77 69 64 20 3d 20 30 3b 0a 20  LastRowid = 0;. 
26a20 20 20 20 46 74 73 35 49 74 65 72 20 2a 70 31 20     Fts5Iter *p1 
26a30 3d 20 30 3b 20 20 20 20 20 2f 2a 20 49 74 65 72  = 0;     /* Iter
26a40 61 74 6f 72 20 75 73 65 64 20 74 6f 20 67 61 74  ator used to gat
26a50 68 65 72 20 64 61 74 61 20 66 72 6f 6d 20 69 6e  her data from in
26a60 64 65 78 20 2a 2f 0a 20 20 20 20 46 74 73 35 44  dex */.    Fts5D
26a70 61 74 61 20 2a 70 44 61 74 61 3b 0a 20 20 20 20  ata *pData;.    
26a80 46 74 73 35 42 75 66 66 65 72 20 64 6f 63 6c 69  Fts5Buffer docli
26a90 73 74 3b 0a 20 20 20 20 69 6e 74 20 62 4e 65 77  st;.    int bNew
26aa0 54 65 72 6d 20 3d 20 31 3b 0a 0a 20 20 20 20 6d  Term = 1;..    m
26ab0 65 6d 73 65 74 28 26 64 6f 63 6c 69 73 74 2c 20  emset(&doclist, 
26ac0 30 2c 20 73 69 7a 65 6f 66 28 64 6f 63 6c 69 73  0, sizeof(doclis
26ad0 74 29 29 3b 0a 20 20 20 20 66 74 73 35 4d 75 6c  t));.    fts5Mul
26ae0 74 69 49 74 65 72 4e 65 77 28 70 2c 20 70 53 74  tiIterNew(p, pSt
26af0 72 75 63 74 2c 20 66 6c 61 67 73 2c 20 70 43 6f  ruct, flags, pCo
26b00 6c 73 65 74 2c 20 70 54 6f 6b 65 6e 2c 20 6e 54  lset, pToken, nT
26b10 6f 6b 65 6e 2c 20 2d 31 2c 20 30 2c 20 26 70 31  oken, -1, 0, &p1
26b20 29 3b 0a 20 20 20 20 66 74 73 35 49 74 65 72 53  );.    fts5IterS
26b30 65 74 4f 75 74 70 75 74 43 62 28 26 70 2d 3e 72  etOutputCb(&p->r
26b40 63 2c 20 70 31 29 3b 0a 20 20 20 20 66 6f 72 28  c, p1);.    for(
26b50 20 2f 2a 20 6e 6f 2d 6f 70 20 2a 2f 20 3b 0a 20   /* no-op */ ;. 
26b60 20 20 20 20 20 20 20 66 74 73 35 4d 75 6c 74 69         fts5Multi
26b70 49 74 65 72 45 6f 66 28 70 2c 20 70 31 29 3d 3d  IterEof(p, p1)==
26b80 30 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35 4d  0;.        fts5M
26b90 75 6c 74 69 49 74 65 72 4e 65 78 74 32 28 70 2c  ultiIterNext2(p,
26ba0 20 70 31 2c 20 26 62 4e 65 77 54 65 72 6d 29 0a   p1, &bNewTerm).
26bb0 20 20 20 20 29 7b 0a 20 20 20 20 20 20 46 74 73      ){.      Fts
26bc0 35 53 65 67 49 74 65 72 20 2a 70 53 65 67 20 3d  5SegIter *pSeg =
26bd0 20 26 70 31 2d 3e 61 53 65 67 5b 20 70 31 2d 3e   &p1->aSeg[ p1->
26be0 61 46 69 72 73 74 5b 31 5d 2e 69 46 69 72 73 74  aFirst[1].iFirst
26bf0 20 5d 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 54   ];.      int nT
26c00 65 72 6d 20 3d 20 70 53 65 67 2d 3e 74 65 72 6d  erm = pSeg->term
26c10 2e 6e 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20  .n;.      const 
26c20 75 38 20 2a 70 54 65 72 6d 20 3d 20 70 53 65 67  u8 *pTerm = pSeg
26c30 2d 3e 74 65 72 6d 2e 70 3b 0a 20 20 20 20 20 20  ->term.p;.      
26c40 70 31 2d 3e 78 53 65 74 4f 75 74 70 75 74 73 28  p1->xSetOutputs(
26c50 70 31 2c 20 70 53 65 67 29 3b 0a 0a 20 20 20 20  p1, pSeg);..    
26c60 20 20 61 73 73 65 72 74 5f 6e 63 28 20 6d 65 6d    assert_nc( mem
26c70 63 6d 70 28 70 54 6f 6b 65 6e 2c 20 70 54 65 72  cmp(pToken, pTer
26c80 6d 2c 20 4d 49 4e 28 6e 54 6f 6b 65 6e 2c 20 6e  m, MIN(nToken, n
26c90 54 65 72 6d 29 29 3c 3d 30 20 29 3b 0a 20 20 20  Term))<=0 );.   
26ca0 20 20 20 69 66 28 20 62 4e 65 77 54 65 72 6d 20     if( bNewTerm 
26cb0 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e  ){.        if( n
26cc0 54 65 72 6d 3c 6e 54 6f 6b 65 6e 20 7c 7c 20 6d  Term<nToken || m
26cd0 65 6d 63 6d 70 28 70 54 6f 6b 65 6e 2c 20 70 54  emcmp(pToken, pT
26ce0 65 72 6d 2c 20 6e 54 6f 6b 65 6e 29 20 29 20 62  erm, nToken) ) b
26cf0 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  reak;.      }.. 
26d00 20 20 20 20 20 69 66 28 20 70 31 2d 3e 62 61 73       if( p1->bas
26d10 65 2e 6e 44 61 74 61 3d 3d 30 20 29 20 63 6f 6e  e.nData==0 ) con
26d20 74 69 6e 75 65 3b 0a 0a 20 20 20 20 20 20 69 66  tinue;..      if
26d30 28 20 70 31 2d 3e 62 61 73 65 2e 69 52 6f 77 69  ( p1->base.iRowi
26d40 64 3c 3d 69 4c 61 73 74 52 6f 77 69 64 20 26 26  d<=iLastRowid &&
26d50 20 64 6f 63 6c 69 73 74 2e 6e 3e 30 20 29 7b 0a   doclist.n>0 ){.
26d60 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b          for(i=0;
26d70 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
26d80 4b 20 26 26 20 64 6f 63 6c 69 73 74 2e 6e 3b 20  K && doclist.n; 
26d90 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  i++){.          
26da0 61 73 73 65 72 74 28 20 69 3c 6e 42 75 66 20 29  assert( i<nBuf )
26db0 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
26dc0 61 42 75 66 5b 69 5d 2e 6e 3d 3d 30 20 29 7b 0a  aBuf[i].n==0 ){.
26dd0 20 20 20 20 20 20 20 20 20 20 20 20 66 74 73 35              fts5
26de0 42 75 66 66 65 72 53 77 61 70 28 26 64 6f 63 6c  BufferSwap(&docl
26df0 69 73 74 2c 20 26 61 42 75 66 5b 69 5d 29 3b 0a  ist, &aBuf[i]);.
26e00 20 20 20 20 20 20 20 20 20 20 20 20 66 74 73 35              fts5
26e10 42 75 66 66 65 72 5a 65 72 6f 28 26 64 6f 63 6c  BufferZero(&docl
26e20 69 73 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ist);.          
26e30 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
26e40 20 20 20 78 4d 65 72 67 65 28 70 2c 20 26 64 6f     xMerge(p, &do
26e50 63 6c 69 73 74 2c 20 26 61 42 75 66 5b 69 5d 29  clist, &aBuf[i])
26e60 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 74  ;.            ft
26e70 73 35 42 75 66 66 65 72 5a 65 72 6f 28 26 61 42  s5BufferZero(&aB
26e80 75 66 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20  uf[i]);.        
26e90 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
26ea0 20 20 20 20 20 20 69 4c 61 73 74 52 6f 77 69 64        iLastRowid
26eb0 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 0a 20   = 0;.      }.. 
26ec0 20 20 20 20 20 78 41 70 70 65 6e 64 28 70 2c 20       xAppend(p, 
26ed0 70 31 2d 3e 62 61 73 65 2e 69 52 6f 77 69 64 2d  p1->base.iRowid-
26ee0 69 4c 61 73 74 52 6f 77 69 64 2c 20 70 31 2c 20  iLastRowid, p1, 
26ef0 26 64 6f 63 6c 69 73 74 29 3b 0a 20 20 20 20 20  &doclist);.     
26f00 20 69 4c 61 73 74 52 6f 77 69 64 20 3d 20 70 31   iLastRowid = p1
26f10 2d 3e 62 61 73 65 2e 69 52 6f 77 69 64 3b 0a 20  ->base.iRowid;. 
26f20 20 20 20 7d 0a 0a 20 20 20 20 66 6f 72 28 69 3d     }..    for(i=
26f30 30 3b 20 69 3c 6e 42 75 66 3b 20 69 2b 2b 29 7b  0; i<nBuf; i++){
26f40 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72 63  .      if( p->rc
26f50 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
26f60 20 20 20 20 20 20 20 78 4d 65 72 67 65 28 70 2c         xMerge(p,
26f70 20 26 64 6f 63 6c 69 73 74 2c 20 26 61 42 75 66   &doclist, &aBuf
26f80 5b 69 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  [i]);.      }.  
26f90 20 20 20 20 66 74 73 35 42 75 66 66 65 72 46 72      fts5BufferFr
26fa0 65 65 28 26 61 42 75 66 5b 69 5d 29 3b 0a 20 20  ee(&aBuf[i]);.  
26fb0 20 20 7d 0a 20 20 20 20 66 74 73 35 4d 75 6c 74    }.    fts5Mult
26fc0 69 49 74 65 72 46 72 65 65 28 70 31 29 3b 0a 0a  iIterFree(p1);..
26fd0 20 20 20 20 70 44 61 74 61 20 3d 20 66 74 73 35      pData = fts5
26fe0 49 64 78 4d 61 6c 6c 6f 63 28 70 2c 20 73 69 7a  IdxMalloc(p, siz
26ff0 65 6f 66 28 46 74 73 35 44 61 74 61 29 20 2b 20  eof(Fts5Data) + 
27000 64 6f 63 6c 69 73 74 2e 6e 29 3b 0a 20 20 20 20  doclist.n);.    
27010 69 66 28 20 70 44 61 74 61 20 29 7b 0a 20 20 20  if( pData ){.   
27020 20 20 20 70 44 61 74 61 2d 3e 70 20 3d 20 28 75     pData->p = (u
27030 38 2a 29 26 70 44 61 74 61 5b 31 5d 3b 0a 20 20  8*)&pData[1];.  
27040 20 20 20 20 70 44 61 74 61 2d 3e 6e 6e 20 3d 20      pData->nn = 
27050 70 44 61 74 61 2d 3e 73 7a 4c 65 61 66 20 3d 20  pData->szLeaf = 
27060 64 6f 63 6c 69 73 74 2e 6e 3b 0a 20 20 20 20 20  doclist.n;.     
27070 20 69 66 28 20 64 6f 63 6c 69 73 74 2e 6e 20 29   if( doclist.n )
27080 20 6d 65 6d 63 70 79 28 70 44 61 74 61 2d 3e 70   memcpy(pData->p
27090 2c 20 64 6f 63 6c 69 73 74 2e 70 2c 20 64 6f 63  , doclist.p, doc
270a0 6c 69 73 74 2e 6e 29 3b 0a 20 20 20 20 20 20 66  list.n);.      f
270b0 74 73 35 4d 75 6c 74 69 49 74 65 72 4e 65 77 32  ts5MultiIterNew2
270c0 28 70 2c 20 70 44 61 74 61 2c 20 62 44 65 73 63  (p, pData, bDesc
270d0 2c 20 70 70 49 74 65 72 29 3b 0a 20 20 20 20 7d  , ppIter);.    }
270e0 0a 20 20 20 20 66 74 73 35 42 75 66 66 65 72 46  .    fts5BufferF
270f0 72 65 65 28 26 64 6f 63 6c 69 73 74 29 3b 0a 20  ree(&doclist);. 
27100 20 7d 0a 0a 20 20 66 74 73 35 53 74 72 75 63 74   }..  fts5Struct
27110 75 72 65 52 65 6c 65 61 73 65 28 70 53 74 72 75  ureRelease(pStru
27120 63 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66  ct);.  sqlite3_f
27130 72 65 65 28 61 42 75 66 29 3b 0a 7d 0a 0a 0a 2f  ree(aBuf);.}.../
27140 2a 0a 2a 2a 20 49 6e 64 69 63 61 74 65 20 74 68  *.** Indicate th
27150 61 74 20 61 6c 6c 20 73 75 62 73 65 71 75 65 6e  at all subsequen
27160 74 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74  t calls to sqlit
27170 65 33 46 74 73 35 49 6e 64 65 78 57 72 69 74 65  e3Fts5IndexWrite
27180 28 29 20 70 65 72 74 61 69 6e 0a 2a 2a 20 74 6f  () pertain.** to
27190 20 74 68 65 20 64 6f 63 75 6d 65 6e 74 20 77 69   the document wi
271a0 74 68 20 72 6f 77 69 64 20 69 52 6f 77 69 64 2e  th rowid iRowid.
271b0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46  .*/.int sqlite3F
271c0 74 73 35 49 6e 64 65 78 42 65 67 69 6e 57 72 69  ts5IndexBeginWri
271d0 74 65 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c  te(Fts5Index *p,
271e0 20 69 6e 74 20 62 44 65 6c 65 74 65 2c 20 69 36   int bDelete, i6
271f0 34 20 69 52 6f 77 69 64 29 7b 0a 20 20 61 73 73  4 iRowid){.  ass
27200 65 72 74 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49  ert( p->rc==SQLI
27210 54 45 5f 4f 4b 20 29 3b 0a 0a 20 20 2f 2a 20 41  TE_OK );..  /* A
27220 6c 6c 6f 63 61 74 65 20 74 68 65 20 68 61 73 68  llocate the hash
27230 20 74 61 62 6c 65 20 69 66 20 69 74 20 68 61 73   table if it has
27240 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 62 65 65   not already bee
27250 6e 20 61 6c 6c 6f 63 61 74 65 64 20 2a 2f 0a 20  n allocated */. 
27260 20 69 66 28 20 70 2d 3e 70 48 61 73 68 3d 3d 30   if( p->pHash==0
27270 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20   ){.    p->rc = 
27280 73 71 6c 69 74 65 33 46 74 73 35 48 61 73 68 4e  sqlite3Fts5HashN
27290 65 77 28 70 2d 3e 70 43 6f 6e 66 69 67 2c 20 26  ew(p->pConfig, &
272a0 70 2d 3e 70 48 61 73 68 2c 20 26 70 2d 3e 6e 50  p->pHash, &p->nP
272b0 65 6e 64 69 6e 67 44 61 74 61 29 3b 0a 20 20 7d  endingData);.  }
272c0 0a 0a 20 20 2f 2a 20 46 6c 75 73 68 20 74 68 65  ..  /* Flush the
272d0 20 68 61 73 68 20 74 61 62 6c 65 20 74 6f 20 64   hash table to d
272e0 69 73 6b 20 69 66 20 72 65 71 75 69 72 65 64 20  isk if required 
272f0 2a 2f 0a 20 20 69 66 28 20 69 52 6f 77 69 64 3c  */.  if( iRowid<
27300 70 2d 3e 69 57 72 69 74 65 52 6f 77 69 64 20 0a  p->iWriteRowid .
27310 20 20 20 7c 7c 20 28 69 52 6f 77 69 64 3d 3d 70     || (iRowid==p
27320 2d 3e 69 57 72 69 74 65 52 6f 77 69 64 20 26 26  ->iWriteRowid &&
27330 20 70 2d 3e 62 44 65 6c 65 74 65 3d 3d 30 29 0a   p->bDelete==0).
27340 20 20 20 7c 7c 20 28 70 2d 3e 6e 50 65 6e 64 69     || (p->nPendi
27350 6e 67 44 61 74 61 20 3e 20 70 2d 3e 70 43 6f 6e  ngData > p->pCon
27360 66 69 67 2d 3e 6e 48 61 73 68 53 69 7a 65 29 20  fig->nHashSize) 
27370 0a 20 20 29 7b 0a 20 20 20 20 66 74 73 35 49 6e  .  ){.    fts5In
27380 64 65 78 46 6c 75 73 68 28 70 29 3b 0a 20 20 7d  dexFlush(p);.  }
27390 0a 0a 20 20 70 2d 3e 69 57 72 69 74 65 52 6f 77  ..  p->iWriteRow
273a0 69 64 20 3d 20 69 52 6f 77 69 64 3b 0a 20 20 70  id = iRowid;.  p
273b0 2d 3e 62 44 65 6c 65 74 65 20 3d 20 62 44 65 6c  ->bDelete = bDel
273c0 65 74 65 3b 0a 20 20 72 65 74 75 72 6e 20 66 74  ete;.  return ft
273d0 73 35 49 6e 64 65 78 52 65 74 75 72 6e 28 70 29  s5IndexReturn(p)
273e0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69  ;.}../*.** Commi
273f0 74 20 64 61 74 61 20 74 6f 20 64 69 73 6b 2e 0a  t data to disk..
27400 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74  */.int sqlite3Ft
27410 73 35 49 6e 64 65 78 53 79 6e 63 28 46 74 73 35  s5IndexSync(Fts5
27420 49 6e 64 65 78 20 2a 70 29 7b 0a 20 20 61 73 73  Index *p){.  ass
27430 65 72 74 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49  ert( p->rc==SQLI
27440 54 45 5f 4f 4b 20 29 3b 0a 20 20 66 74 73 35 49  TE_OK );.  fts5I
27450 6e 64 65 78 46 6c 75 73 68 28 70 29 3b 0a 20 20  ndexFlush(p);.  
27460 66 74 73 35 43 6c 6f 73 65 52 65 61 64 65 72 28  fts5CloseReader(
27470 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 66 74 73  p);.  return fts
27480 35 49 6e 64 65 78 52 65 74 75 72 6e 28 70 29 3b  5IndexReturn(p);
27490 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 69 73 63 61 72  .}../*.** Discar
274a0 64 20 61 6e 79 20 64 61 74 61 20 73 74 6f 72 65  d any data store
274b0 64 20 69 6e 20 74 68 65 20 69 6e 2d 6d 65 6d 6f  d in the in-memo
274c0 72 79 20 68 61 73 68 20 74 61 62 6c 65 73 2e 20  ry hash tables. 
274d0 44 6f 20 6e 6f 74 20 77 72 69 74 65 20 69 74 0a  Do not write it.
274e0 2a 2a 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ** to the databa
274f0 73 65 2e 20 41 64 64 69 74 69 6f 6e 61 6c 6c 79  se. Additionally
27500 2c 20 61 73 73 75 6d 65 20 74 68 61 74 20 74 68  , assume that th
27510 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
27520 65 20 25 5f 64 61 74 61 0a 2a 2a 20 74 61 62 6c  e %_data.** tabl
27530 65 20 6d 61 79 20 68 61 76 65 20 63 68 61 6e 67  e may have chang
27540 65 64 20 6f 6e 20 64 69 73 6b 2e 20 53 6f 20 61  ed on disk. So a
27550 6e 79 20 69 6e 2d 6d 65 6d 6f 72 79 20 63 61 63  ny in-memory cac
27560 68 65 73 20 6f 66 20 25 5f 64 61 74 61 20 0a 2a  hes of %_data .*
27570 2a 20 72 65 63 6f 72 64 73 20 6d 75 73 74 20 62  * records must b
27580 65 20 69 6e 76 61 6c 69 64 61 74 65 64 2e 0a 2a  e invalidated..*
27590 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73  /.int sqlite3Fts
275a0 35 49 6e 64 65 78 52 6f 6c 6c 62 61 63 6b 28 46  5IndexRollback(F
275b0 74 73 35 49 6e 64 65 78 20 2a 70 29 7b 0a 20 20  ts5Index *p){.  
275c0 66 74 73 35 43 6c 6f 73 65 52 65 61 64 65 72 28  fts5CloseReader(
275d0 70 29 3b 0a 20 20 66 74 73 35 49 6e 64 65 78 44  p);.  fts5IndexD
275e0 69 73 63 61 72 64 44 61 74 61 28 70 29 3b 0a 20  iscardData(p);. 
275f0 20 66 74 73 35 53 74 72 75 63 74 75 72 65 49 6e   fts5StructureIn
27600 76 61 6c 69 64 61 74 65 28 70 29 3b 0a 20 20 2f  validate(p);.  /
27610 2a 20 61 73 73 65 72 74 28 20 70 2d 3e 72 63 3d  * assert( p->rc=
27620 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 20 2a 2f  =SQLITE_OK ); */
27630 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
27640 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  _OK;.}../*.** Th
27650 65 20 25 5f 64 61 74 61 20 74 61 62 6c 65 20 69  e %_data table i
27660 73 20 63 6f 6d 70 6c 65 74 65 6c 79 20 65 6d 70  s completely emp
27670 74 79 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e  ty when this fun
27680 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2e  ction is called.
27690 20 54 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f   This.** functio
276a0 6e 20 70 6f 70 75 6c 61 74 65 73 20 69 74 20 77  n populates it w
276b0 69 74 68 20 74 68 65 20 69 6e 69 74 69 61 6c 20  ith the initial 
276c0 73 74 72 75 63 74 75 72 65 20 6f 62 6a 65 63 74  structure object
276d0 73 20 66 6f 72 20 65 61 63 68 20 69 6e 64 65 78  s for each index
276e0 2c 0a 2a 2a 20 61 6e 64 20 74 68 65 20 69 6e 69  ,.** and the ini
276f0 74 69 61 6c 20 76 65 72 73 69 6f 6e 20 6f 66 20  tial version of 
27700 74 68 65 20 22 61 76 65 72 61 67 65 73 22 20 72  the "averages" r
27710 65 63 6f 72 64 20 28 61 20 7a 65 72 6f 2d 62 79  ecord (a zero-by
27720 74 65 20 62 6c 6f 62 29 2e 0a 2a 2f 0a 69 6e 74  te blob)..*/.int
27730 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65   sqlite3Fts5Inde
27740 78 52 65 69 6e 69 74 28 46 74 73 35 49 6e 64 65  xReinit(Fts5Inde
27750 78 20 2a 70 29 7b 0a 20 20 46 74 73 35 53 74 72  x *p){.  Fts5Str
27760 75 63 74 75 72 65 20 73 3b 0a 20 20 66 74 73 35  ucture s;.  fts5
27770 53 74 72 75 63 74 75 72 65 49 6e 76 61 6c 69 64  StructureInvalid
27780 61 74 65 28 70 29 3b 0a 20 20 6d 65 6d 73 65 74  ate(p);.  memset
27790 28 26 73 2c 20 30 2c 20 73 69 7a 65 6f 66 28 46  (&s, 0, sizeof(F
277a0 74 73 35 53 74 72 75 63 74 75 72 65 29 29 3b 0a  ts5Structure));.
277b0 20 20 66 74 73 35 44 61 74 61 57 72 69 74 65 28    fts5DataWrite(
277c0 70 2c 20 46 54 53 35 5f 41 56 45 52 41 47 45 53  p, FTS5_AVERAGES
277d0 5f 52 4f 57 49 44 2c 20 28 63 6f 6e 73 74 20 75  _ROWID, (const u
277e0 38 2a 29 22 22 2c 20 30 29 3b 0a 20 20 66 74 73  8*)"", 0);.  fts
277f0 35 53 74 72 75 63 74 75 72 65 57 72 69 74 65 28  5StructureWrite(
27800 70 2c 20 26 73 29 3b 0a 20 20 72 65 74 75 72 6e  p, &s);.  return
27810 20 66 74 73 35 49 6e 64 65 78 52 65 74 75 72 6e   fts5IndexReturn
27820 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70  (p);.}../*.** Op
27830 65 6e 20 61 20 6e 65 77 20 46 74 73 35 49 6e 64  en a new Fts5Ind
27840 65 78 20 68 61 6e 64 6c 65 2e 20 49 66 20 74 68  ex handle. If th
27850 65 20 62 43 72 65 61 74 65 20 61 72 67 75 6d 65  e bCreate argume
27860 6e 74 20 69 73 20 74 72 75 65 2c 20 63 72 65 61  nt is true, crea
27870 74 65 0a 2a 2a 20 61 6e 64 20 69 6e 69 74 69 61  te.** and initia
27880 6c 69 7a 65 20 74 68 65 20 75 6e 64 65 72 6c 79  lize the underly
27890 69 6e 67 20 25 5f 64 61 74 61 20 74 61 62 6c 65  ing %_data table
278a0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65  ..**.** If succe
278b0 73 73 66 75 6c 2c 20 73 65 74 20 2a 70 70 20 74  ssful, set *pp t
278c0 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 6e  o point to the n
278d0 65 77 20 6f 62 6a 65 63 74 20 61 6e 64 20 72 65  ew object and re
278e0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a  turn SQLITE_OK..
278f0 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 73 65  ** Otherwise, se
27900 74 20 2a 70 70 20 74 6f 20 4e 55 4c 4c 20 61 6e  t *pp to NULL an
27910 64 20 72 65 74 75 72 6e 20 61 6e 20 53 51 4c 69  d return an SQLi
27920 74 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a  te error code..*
27930 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73  /.int sqlite3Fts
27940 35 49 6e 64 65 78 4f 70 65 6e 28 0a 20 20 46 74  5IndexOpen(.  Ft
27950 73 35 43 6f 6e 66 69 67 20 2a 70 43 6f 6e 66 69  s5Config *pConfi
27960 67 2c 20 0a 20 20 69 6e 74 20 62 43 72 65 61 74  g, .  int bCreat
27970 65 2c 20 0a 20 20 46 74 73 35 49 6e 64 65 78 20  e, .  Fts5Index 
27980 2a 2a 70 70 2c 0a 20 20 63 68 61 72 20 2a 2a 70  **pp,.  char **p
27990 7a 45 72 72 0a 29 7b 0a 20 20 69 6e 74 20 72 63  zErr.){.  int rc
279a0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
279b0 46 74 73 35 49 6e 64 65 78 20 2a 70 3b 20 20 20  Fts5Index *p;   
279c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
279d0 2f 2a 20 4e 65 77 20 6f 62 6a 65 63 74 20 2a 2f  /* New object */
279e0 0a 0a 20 20 2a 70 70 20 3d 20 70 20 3d 20 28 46  ..  *pp = p = (F
279f0 74 73 35 49 6e 64 65 78 2a 29 73 71 6c 69 74 65  ts5Index*)sqlite
27a00 33 46 74 73 35 4d 61 6c 6c 6f 63 5a 65 72 6f 28  3Fts5MallocZero(
27a10 26 72 63 2c 20 73 69 7a 65 6f 66 28 46 74 73 35  &rc, sizeof(Fts5
27a20 49 6e 64 65 78 29 29 3b 0a 20 20 69 66 28 20 72  Index));.  if( r
27a30 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
27a40 20 20 20 20 70 2d 3e 70 43 6f 6e 66 69 67 20 3d      p->pConfig =
27a50 20 70 43 6f 6e 66 69 67 3b 0a 20 20 20 20 70 2d   pConfig;.    p-
27a60 3e 6e 57 6f 72 6b 55 6e 69 74 20 3d 20 46 54 53  >nWorkUnit = FTS
27a70 35 5f 57 4f 52 4b 5f 55 4e 49 54 3b 0a 20 20 20  5_WORK_UNIT;.   
27a80 20 70 2d 3e 7a 44 61 74 61 54 62 6c 20 3d 20 73   p->zDataTbl = s
27a90 71 6c 69 74 65 33 46 74 73 35 4d 70 72 69 6e 74  qlite3Fts5Mprint
27aa0 66 28 26 72 63 2c 20 22 25 73 5f 64 61 74 61 22  f(&rc, "%s_data"
27ab0 2c 20 70 43 6f 6e 66 69 67 2d 3e 7a 4e 61 6d 65  , pConfig->zName
27ac0 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 7a 44  );.    if( p->zD
27ad0 61 74 61 54 62 6c 20 26 26 20 62 43 72 65 61 74  ataTbl && bCreat
27ae0 65 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  e ){.      rc = 
27af0 73 71 6c 69 74 65 33 46 74 73 35 43 72 65 61 74  sqlite3Fts5Creat
27b00 65 54 61 62 6c 65 28 0a 20 20 20 20 20 20 20 20  eTable(.        
27b10 20 20 70 43 6f 6e 66 69 67 2c 20 22 64 61 74 61    pConfig, "data
27b20 22 2c 20 22 69 64 20 49 4e 54 45 47 45 52 20 50  ", "id INTEGER P
27b30 52 49 4d 41 52 59 20 4b 45 59 2c 20 62 6c 6f 63  RIMARY KEY, bloc
27b40 6b 20 42 4c 4f 42 22 2c 20 30 2c 20 70 7a 45 72  k BLOB", 0, pzEr
27b50 72 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20  r.      );.     
27b60 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
27b70 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  OK ){.        rc
27b80 20 3d 20 73 71 6c 69 74 65 33 46 74 73 35 43 72   = sqlite3Fts5Cr
27b90 65 61 74 65 54 61 62 6c 65 28 70 43 6f 6e 66 69  eateTable(pConfi
27ba0 67 2c 20 22 69 64 78 22 2c 20 0a 20 20 20 20 20  g, "idx", .     
27bb0 20 20 20 20 20 20 20 22 73 65 67 69 64 2c 20 74         "segid, t
27bc0 65 72 6d 2c 20 70 67 6e 6f 2c 20 50 52 49 4d 41  erm, pgno, PRIMA
27bd0 52 59 20 4b 45 59 28 73 65 67 69 64 2c 20 74 65  RY KEY(segid, te
27be0 72 6d 29 22 2c 20 0a 20 20 20 20 20 20 20 20 20  rm)", .         
27bf0 20 20 20 31 2c 20 70 7a 45 72 72 0a 20 20 20 20     1, pzErr.    
27c00 20 20 20 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20      );.      }. 
27c10 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
27c20 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
27c30 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74    rc = sqlite3Ft
27c40 73 35 49 6e 64 65 78 52 65 69 6e 69 74 28 70 29  s5IndexReinit(p)
27c50 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
27c60 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 72    }..  assert( r
27c70 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c!=SQLITE_OK || 
27c80 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
27c90 20 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a   );.  if( rc ){.
27ca0 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 49      sqlite3Fts5I
27cb0 6e 64 65 78 43 6c 6f 73 65 28 70 29 3b 0a 20 20  ndexClose(p);.  
27cc0 20 20 2a 70 70 20 3d 20 30 3b 0a 20 20 7d 0a 20    *pp = 0;.  }. 
27cd0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
27ce0 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 68 61 6e  *.** Close a han
27cf0 64 6c 65 20 6f 70 65 6e 65 64 20 62 79 20 61 6e  dle opened by an
27d00 20 65 61 72 6c 69 65 72 20 63 61 6c 6c 20 74 6f   earlier call to
27d10 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65   sqlite3Fts5Inde
27d20 78 4f 70 65 6e 28 29 2e 0a 2a 2f 0a 69 6e 74 20  xOpen()..*/.int 
27d30 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78  sqlite3Fts5Index
27d40 43 6c 6f 73 65 28 46 74 73 35 49 6e 64 65 78 20  Close(Fts5Index 
27d50 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  *p){.  int rc = 
27d60 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28  SQLITE_OK;.  if(
27d70 20 70 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74   p ){.    assert
27d80 28 20 70 2d 3e 70 52 65 61 64 65 72 3d 3d 30 20  ( p->pReader==0 
27d90 29 3b 0a 20 20 20 20 66 74 73 35 53 74 72 75 63  );.    fts5Struc
27da0 74 75 72 65 49 6e 76 61 6c 69 64 61 74 65 28 70  tureInvalidate(p
27db0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
27dc0 69 6e 61 6c 69 7a 65 28 70 2d 3e 70 57 72 69 74  inalize(p->pWrit
27dd0 65 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  er);.    sqlite3
27de0 5f 66 69 6e 61 6c 69 7a 65 28 70 2d 3e 70 44 65  _finalize(p->pDe
27df0 6c 65 74 65 72 29 3b 0a 20 20 20 20 73 71 6c 69  leter);.    sqli
27e00 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 2d 3e  te3_finalize(p->
27e10 70 49 64 78 57 72 69 74 65 72 29 3b 0a 20 20 20  pIdxWriter);.   
27e20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a   sqlite3_finaliz
27e30 65 28 70 2d 3e 70 49 64 78 44 65 6c 65 74 65 72  e(p->pIdxDeleter
27e40 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
27e50 69 6e 61 6c 69 7a 65 28 70 2d 3e 70 49 64 78 53  inalize(p->pIdxS
27e60 65 6c 65 63 74 29 3b 0a 20 20 20 20 73 71 6c 69  elect);.    sqli
27e70 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 2d 3e  te3_finalize(p->
27e80 70 44 61 74 61 56 65 72 73 69 6f 6e 29 3b 0a 20  pDataVersion);. 
27e90 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 48 61     sqlite3Fts5Ha
27ea0 73 68 46 72 65 65 28 70 2d 3e 70 48 61 73 68 29  shFree(p->pHash)
27eb0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ;.    sqlite3_fr
27ec0 65 65 28 70 2d 3e 7a 44 61 74 61 54 62 6c 29 3b  ee(p->zDataTbl);
27ed0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
27ee0 65 28 70 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  e(p);.  }.  retu
27ef0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
27f00 41 72 67 75 6d 65 6e 74 20 70 20 70 6f 69 6e 74  Argument p point
27f10 73 20 74 6f 20 61 20 62 75 66 66 65 72 20 63 6f  s to a buffer co
27f20 6e 74 61 69 6e 69 6e 67 20 75 74 66 2d 38 20 74  ntaining utf-8 t
27f30 65 78 74 20 74 68 61 74 20 69 73 20 6e 20 62 79  ext that is n by
27f40 74 65 73 20 69 6e 20 0a 2a 2a 20 73 69 7a 65 2e  tes in .** size.
27f50 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62   Return the numb
27f60 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20 74  er of bytes in t
27f70 68 65 20 6e 43 68 61 72 20 63 68 61 72 61 63 74  he nChar charact
27f80 65 72 20 70 72 65 66 69 78 20 6f 66 20 74 68 65  er prefix of the
27f90 0a 2a 2a 20 62 75 66 66 65 72 2c 20 6f 72 20 30  .** buffer, or 0
27fa0 20 69 66 20 74 68 65 72 65 20 61 72 65 20 6c 65   if there are le
27fb0 73 73 20 74 68 61 6e 20 6e 43 68 61 72 20 63 68  ss than nChar ch
27fc0 61 72 61 63 74 65 72 73 20 69 6e 20 74 6f 74 61  aracters in tota
27fd0 6c 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  l..*/.int sqlite
27fe0 33 46 74 73 35 49 6e 64 65 78 43 68 61 72 6c 65  3Fts5IndexCharle
27ff0 6e 54 6f 42 79 74 65 6c 65 6e 28 0a 20 20 63 6f  nToBytelen(.  co
28000 6e 73 74 20 63 68 61 72 20 2a 70 2c 20 0a 20 20  nst char *p, .  
28010 69 6e 74 20 6e 42 79 74 65 2c 20 0a 20 20 69 6e  int nByte, .  in
28020 74 20 6e 43 68 61 72 0a 29 7b 0a 20 20 69 6e 74  t nChar.){.  int
28030 20 6e 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 3b   n = 0;.  int i;
28040 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43  .  for(i=0; i<nC
28050 68 61 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  har; i++){.    i
28060 66 28 20 6e 3e 3d 6e 42 79 74 65 20 29 20 72 65  f( n>=nByte ) re
28070 74 75 72 6e 20 30 3b 20 20 20 20 20 20 2f 2a 20  turn 0;      /* 
28080 49 6e 70 75 74 20 63 6f 6e 74 61 69 6e 73 20 66  Input contains f
28090 65 77 65 72 20 74 68 61 6e 20 6e 43 68 61 72 20  ewer than nChar 
280a0 63 68 61 72 73 20 2a 2f 0a 20 20 20 20 69 66 28  chars */.    if(
280b0 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 29   (unsigned char)
280c0 70 5b 6e 2b 2b 5d 3e 3d 30 78 63 30 20 29 7b 0a  p[n++]>=0xc0 ){.
280d0 20 20 20 20 20 20 77 68 69 6c 65 28 20 28 70 5b        while( (p[
280e0 6e 5d 20 26 20 30 78 63 30 29 3d 3d 30 78 38 30  n] & 0xc0)==0x80
280f0 20 29 20 6e 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20   ) n++;.    }.  
28100 7d 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a  }.  return n;.}.
28110 0a 2f 2a 0a 2a 2a 20 70 49 6e 20 69 73 20 61 20  ./*.** pIn is a 
28120 55 54 46 2d 38 20 65 6e 63 6f 64 65 64 20 73 74  UTF-8 encoded st
28130 72 69 6e 67 2c 20 6e 49 6e 20 62 79 74 65 73 20  ring, nIn bytes 
28140 69 6e 20 73 69 7a 65 2e 20 52 65 74 75 72 6e 20  in size. Return 
28150 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a  the number of.**
28160 20 75 6e 69 63 6f 64 65 20 63 68 61 72 61 63 74   unicode charact
28170 65 72 73 20 69 6e 20 74 68 65 20 73 74 72 69 6e  ers in the strin
28180 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  g..*/.static int
28190 20 66 74 73 35 49 6e 64 65 78 43 68 61 72 6c 65   fts5IndexCharle
281a0 6e 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 70 49  n(const char *pI
281b0 6e 2c 20 69 6e 74 20 6e 49 6e 29 7b 0a 20 20 69  n, int nIn){.  i
281c0 6e 74 20 6e 43 68 61 72 20 3d 20 30 3b 20 20 20  nt nChar = 0;   
281d0 20 20 20 20 20 20 20 20 20 0a 20 20 69 6e 74 20           .  int 
281e0 69 20 3d 20 30 3b 0a 20 20 77 68 69 6c 65 28 20  i = 0;.  while( 
281f0 69 3c 6e 49 6e 20 29 7b 0a 20 20 20 20 69 66 28  i<nIn ){.    if(
28200 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 29   (unsigned char)
28210 70 49 6e 5b 69 2b 2b 5d 3e 3d 30 78 63 30 20 29  pIn[i++]>=0xc0 )
28220 7b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 69  {.      while( i
28230 3c 6e 49 6e 20 26 26 20 28 70 49 6e 5b 69 5d 20  <nIn && (pIn[i] 
28240 26 20 30 78 63 30 29 3d 3d 30 78 38 30 20 29 20  & 0xc0)==0x80 ) 
28250 69 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e  i++;.    }.    n
28260 43 68 61 72 2b 2b 3b 0a 20 20 7d 0a 20 20 72 65  Char++;.  }.  re
28270 74 75 72 6e 20 6e 43 68 61 72 3b 0a 7d 0a 0a 2f  turn nChar;.}../
28280 2a 0a 2a 2a 20 49 6e 73 65 72 74 20 6f 72 20 72  *.** Insert or r
28290 65 6d 6f 76 65 20 64 61 74 61 20 74 6f 20 6f 72  emove data to or
282a0 20 66 72 6f 6d 20 74 68 65 20 69 6e 64 65 78 2e   from the index.
282b0 20 45 61 63 68 20 74 69 6d 65 20 61 20 64 6f 63   Each time a doc
282c0 75 6d 65 6e 74 20 69 73 20 0a 2a 2a 20 61 64 64  ument is .** add
282d0 65 64 20 74 6f 20 6f 72 20 72 65 6d 6f 76 65 64  ed to or removed
282e0 20 66 72 6f 6d 20 74 68 65 20 69 6e 64 65 78 2c   from the index,
282f0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
28300 73 20 63 61 6c 6c 65 64 20 6f 6e 65 20 6f 72 20  s called one or 
28310 6d 6f 72 65 0a 2a 2a 20 74 69 6d 65 73 2e 0a 2a  more.** times..*
28320 2a 0a 2a 2a 20 46 6f 72 20 61 6e 20 69 6e 73 65  *.** For an inse
28330 72 74 2c 20 69 74 20 6d 75 73 74 20 62 65 20 63  rt, it must be c
28340 61 6c 6c 65 64 20 6f 6e 63 65 20 66 6f 72 20 65  alled once for e
28350 61 63 68 20 74 6f 6b 65 6e 20 69 6e 20 74 68 65  ach token in the
28360 20 6e 65 77 20 64 6f 63 75 6d 65 6e 74 2e 0a 2a   new document..*
28370 2a 20 49 66 20 74 68 65 20 6f 70 65 72 61 74 69  * If the operati
28380 6f 6e 20 69 73 20 61 20 64 65 6c 65 74 65 2c 20  on is a delete, 
28390 69 74 20 6d 75 73 74 20 62 65 20 63 61 6c 6c 65  it must be calle
283a0 64 20 28 61 74 20 6c 65 61 73 74 29 20 6f 6e 63  d (at least) onc
283b0 65 20 66 6f 72 20 65 61 63 68 0a 2a 2a 20 75 6e  e for each.** un
283c0 69 71 75 65 20 74 6f 6b 65 6e 20 69 6e 20 74 68  ique token in th
283d0 65 20 64 6f 63 75 6d 65 6e 74 20 77 69 74 68 20  e document with 
283e0 61 6e 20 69 43 6f 6c 20 76 61 6c 75 65 20 6c 65  an iCol value le
283f0 73 73 20 74 68 61 6e 20 7a 65 72 6f 2e 20 54 68  ss than zero. Th
28400 65 20 69 50 6f 73 0a 2a 2a 20 61 72 67 75 6d 65  e iPos.** argume
28410 6e 74 20 69 73 20 69 67 6e 6f 72 65 64 20 66 6f  nt is ignored fo
28420 72 20 61 20 64 65 6c 65 74 65 2e 0a 2a 2f 0a 69  r a delete..*/.i
28430 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e  nt sqlite3Fts5In
28440 64 65 78 57 72 69 74 65 28 0a 20 20 46 74 73 35  dexWrite(.  Fts5
28450 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20  Index *p,       
28460 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
28470 6e 64 65 78 20 74 6f 20 77 72 69 74 65 20 74 6f  ndex to write to
28480 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 2c 20   */.  int iCol, 
28490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
284a0 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20        /* Column 
284b0 74 6f 6b 65 6e 20 61 70 70 65 61 72 73 20 69 6e  token appears in
284c0 20 28 2d 76 65 20 2d 3e 20 64 65 6c 65 74 65 29   (-ve -> delete)
284d0 20 2a 2f 0a 20 20 69 6e 74 20 69 50 6f 73 2c 20   */.  int iPos, 
284e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
284f0 20 20 20 20 20 20 2f 2a 20 50 6f 73 69 74 69 6f        /* Positio
28500 6e 20 6f 66 20 74 6f 6b 65 6e 20 77 69 74 68 69  n of token withi
28510 6e 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 63 6f  n column */.  co
28520 6e 73 74 20 63 68 61 72 20 2a 70 54 6f 6b 65 6e  nst char *pToken
28530 2c 20 69 6e 74 20 6e 54 6f 6b 65 6e 20 20 2f 2a  , int nToken  /*
28540 20 54 6f 6b 65 6e 20 74 6f 20 61 64 64 20 6f 72   Token to add or
28550 20 72 65 6d 6f 76 65 20 74 6f 20 6f 72 20 66 72   remove to or fr
28560 6f 6d 20 69 6e 64 65 78 20 2a 2f 0a 29 7b 0a 20  om index */.){. 
28570 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20   int i;         
28580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28590 20 2f 2a 20 55 73 65 64 20 74 6f 20 69 74 65 72   /* Used to iter
285a0 61 74 65 20 74 68 72 6f 75 67 68 20 69 6e 64 65  ate through inde
285b0 78 65 73 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20  xes */.  int rc 
285c0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20  = SQLITE_OK;    
285d0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
285e0 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 46 74 73  rn code */.  Fts
285f0 35 43 6f 6e 66 69 67 20 2a 70 43 6f 6e 66 69 67  5Config *pConfig
28600 20 3d 20 70 2d 3e 70 43 6f 6e 66 69 67 3b 0a 0a   = p->pConfig;..
28610 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72 63 3d    assert( p->rc=
28620 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20  =SQLITE_OK );.  
28630 61 73 73 65 72 74 28 20 28 69 43 6f 6c 3c 30 29  assert( (iCol<0)
28640 3d 3d 70 2d 3e 62 44 65 6c 65 74 65 20 29 3b 0a  ==p->bDelete );.
28650 0a 20 20 2f 2a 20 41 64 64 20 74 68 65 20 65 6e  .  /* Add the en
28660 74 72 79 20 74 6f 20 74 68 65 20 6d 61 69 6e 20  try to the main 
28670 74 65 72 6d 73 20 69 6e 64 65 78 2e 20 2a 2f 0a  terms index. */.
28680 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74    rc = sqlite3Ft
28690 73 35 48 61 73 68 57 72 69 74 65 28 0a 20 20 20  s5HashWrite(.   
286a0 20 20 20 70 2d 3e 70 48 61 73 68 2c 20 70 2d 3e     p->pHash, p->
286b0 69 57 72 69 74 65 52 6f 77 69 64 2c 20 69 43 6f  iWriteRowid, iCo
286c0 6c 2c 20 69 50 6f 73 2c 20 46 54 53 35 5f 4d 41  l, iPos, FTS5_MA
286d0 49 4e 5f 50 52 45 46 49 58 2c 20 70 54 6f 6b 65  IN_PREFIX, pToke
286e0 6e 2c 20 6e 54 6f 6b 65 6e 0a 20 20 29 3b 0a 0a  n, nToken.  );..
286f0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 43 6f    for(i=0; i<pCo
28700 6e 66 69 67 2d 3e 6e 50 72 65 66 69 78 20 26 26  nfig->nPrefix &&
28710 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20   rc==SQLITE_OK; 
28720 69 2b 2b 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20  i++){.    const 
28730 69 6e 74 20 6e 43 68 61 72 20 3d 20 70 43 6f 6e  int nChar = pCon
28740 66 69 67 2d 3e 61 50 72 65 66 69 78 5b 69 5d 3b  fig->aPrefix[i];
28750 0a 20 20 20 20 69 6e 74 20 6e 42 79 74 65 20 3d  .    int nByte =
28760 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65   sqlite3Fts5Inde
28770 78 43 68 61 72 6c 65 6e 54 6f 42 79 74 65 6c 65  xCharlenToBytele
28780 6e 28 70 54 6f 6b 65 6e 2c 20 6e 54 6f 6b 65 6e  n(pToken, nToken
28790 2c 20 6e 43 68 61 72 29 3b 0a 20 20 20 20 69 66  , nChar);.    if
287a0 28 20 6e 42 79 74 65 20 29 7b 0a 20 20 20 20 20  ( nByte ){.     
287b0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74 73   rc = sqlite3Fts
287c0 35 48 61 73 68 57 72 69 74 65 28 70 2d 3e 70 48  5HashWrite(p->pH
287d0 61 73 68 2c 20 0a 20 20 20 20 20 20 20 20 20 20  ash, .          
287e0 70 2d 3e 69 57 72 69 74 65 52 6f 77 69 64 2c 20  p->iWriteRowid, 
287f0 69 43 6f 6c 2c 20 69 50 6f 73 2c 20 28 63 68 61  iCol, iPos, (cha
28800 72 29 28 46 54 53 35 5f 4d 41 49 4e 5f 50 52 45  r)(FTS5_MAIN_PRE
28810 46 49 58 2b 69 2b 31 29 2c 20 70 54 6f 6b 65 6e  FIX+i+1), pToken
28820 2c 0a 20 20 20 20 20 20 20 20 20 20 6e 42 79 74  ,.          nByt
28830 65 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d  e.      );.    }
28840 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72  .  }..  return r
28850 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e  c;.}../*.** Open
28860 20 61 20 6e 65 77 20 69 74 65 72 61 74 6f 72 20   a new iterator 
28870 74 6f 20 69 74 65 72 61 74 65 20 74 68 6f 75 67  to iterate thoug
28880 68 20 61 6c 6c 20 72 6f 77 69 64 20 74 68 61 74  h all rowid that
28890 20 6d 61 74 63 68 20 74 68 65 20 0a 2a 2a 20 73   match the .** s
288a0 70 65 63 69 66 69 65 64 20 74 6f 6b 65 6e 20 6f  pecified token o
288b0 72 20 74 6f 6b 65 6e 20 70 72 65 66 69 78 2e 0a  r token prefix..
288c0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74  */.int sqlite3Ft
288d0 73 35 49 6e 64 65 78 51 75 65 72 79 28 0a 20 20  s5IndexQuery(.  
288e0 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 20 20  Fts5Index *p,   
288f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28900 2f 2a 20 46 54 53 20 69 6e 64 65 78 20 74 6f 20  /* FTS index to 
28910 71 75 65 72 79 20 2a 2f 0a 20 20 63 6f 6e 73 74  query */.  const
28920 20 63 68 61 72 20 2a 70 54 6f 6b 65 6e 2c 20 69   char *pToken, i
28930 6e 74 20 6e 54 6f 6b 65 6e 2c 20 2f 2a 20 54 6f  nt nToken, /* To
28940 6b 65 6e 20 28 6f 72 20 70 72 65 66 69 78 29 20  ken (or prefix) 
28950 74 6f 20 71 75 65 72 79 20 66 6f 72 20 2a 2f 0a  to query for */.
28960 20 20 69 6e 74 20 66 6c 61 67 73 2c 20 20 20 20    int flags,    
28970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28980 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 46 54 53    /* Mask of FTS
28990 35 49 4e 44 45 58 5f 51 55 45 52 59 5f 58 20 66  5INDEX_QUERY_X f
289a0 6c 61 67 73 20 2a 2f 0a 20 20 46 74 73 35 43 6f  lags */.  Fts5Co
289b0 6c 73 65 74 20 2a 70 43 6f 6c 73 65 74 2c 20 20  lset *pColset,  
289c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 74            /* Mat
289d0 63 68 20 74 68 65 73 65 20 63 6f 6c 75 6d 6e 73  ch these columns
289e0 20 6f 6e 6c 79 20 2a 2f 0a 20 20 46 74 73 35 49   only */.  Fts5I
289f0 6e 64 65 78 49 74 65 72 20 2a 2a 70 70 49 74 65  ndexIter **ppIte
28a00 72 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55  r          /* OU
28a10 54 3a 20 4e 65 77 20 69 74 65 72 61 74 6f 72 20  T: New iterator 
28a20 6f 62 6a 65 63 74 20 2a 2f 0a 29 7b 0a 20 20 46  object */.){.  F
28a30 74 73 35 43 6f 6e 66 69 67 20 2a 70 43 6f 6e 66  ts5Config *pConf
28a40 69 67 20 3d 20 70 2d 3e 70 43 6f 6e 66 69 67 3b  ig = p->pConfig;
28a50 0a 20 20 46 74 73 35 49 74 65 72 20 2a 70 52 65  .  Fts5Iter *pRe
28a60 74 20 3d 20 30 3b 0a 20 20 46 74 73 35 42 75 66  t = 0;.  Fts5Buf
28a70 66 65 72 20 62 75 66 20 3d 20 7b 30 2c 20 30 2c  fer buf = {0, 0,
28a80 20 30 7d 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68   0};..  /* If th
28a90 65 20 51 55 45 52 59 5f 53 43 41 4e 20 66 6c 61  e QUERY_SCAN fla
28aa0 67 20 69 73 20 73 65 74 2c 20 61 6c 6c 20 6f 74  g is set, all ot
28ab0 68 65 72 20 66 6c 61 67 73 20 6d 75 73 74 20 62  her flags must b
28ac0 65 20 63 6c 65 61 72 2e 20 2a 2f 0a 20 20 61 73  e clear. */.  as
28ad0 73 65 72 74 28 20 28 66 6c 61 67 73 20 26 20 46  sert( (flags & F
28ae0 54 53 35 49 4e 44 45 58 5f 51 55 45 52 59 5f 53  TS5INDEX_QUERY_S
28af0 43 41 4e 29 3d 3d 30 20 7c 7c 20 66 6c 61 67 73  CAN)==0 || flags
28b00 3d 3d 46 54 53 35 49 4e 44 45 58 5f 51 55 45 52  ==FTS5INDEX_QUER
28b10 59 5f 53 43 41 4e 20 29 3b 0a 0a 20 20 69 66 28  Y_SCAN );..  if(
28b20 20 73 71 6c 69 74 65 33 46 74 73 35 42 75 66 66   sqlite3Fts5Buff
28b30 65 72 53 69 7a 65 28 26 70 2d 3e 72 63 2c 20 26  erSize(&p->rc, &
28b40 62 75 66 2c 20 6e 54 6f 6b 65 6e 2b 31 29 3d 3d  buf, nToken+1)==
28b50 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 49 64  0 ){.    int iId
28b60 78 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  x = 0;          
28b70 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
28b80 74 6f 20 73 65 61 72 63 68 20 2a 2f 0a 20 20 20  to search */.   
28b90 20 69 66 28 20 6e 54 6f 6b 65 6e 20 29 20 6d 65   if( nToken ) me
28ba0 6d 63 70 79 28 26 62 75 66 2e 70 5b 31 5d 2c 20  mcpy(&buf.p[1], 
28bb0 70 54 6f 6b 65 6e 2c 20 6e 54 6f 6b 65 6e 29 3b  pToken, nToken);
28bc0 0a 0a 20 20 20 20 2f 2a 20 46 69 67 75 72 65 20  ..    /* Figure 
28bd0 6f 75 74 20 77 68 69 63 68 20 69 6e 64 65 78 20  out which index 
28be0 74 6f 20 73 65 61 72 63 68 20 61 6e 64 20 73 65  to search and se
28bf0 74 20 69 49 64 78 20 61 63 63 6f 72 64 69 6e 67  t iIdx according
28c00 6c 79 2e 20 49 66 20 74 68 69 73 0a 20 20 20 20  ly. If this.    
28c10 2a 2a 20 69 73 20 61 20 70 72 65 66 69 78 20 71  ** is a prefix q
28c20 75 65 72 79 20 66 6f 72 20 77 68 69 63 68 20 74  uery for which t
28c30 68 65 72 65 20 69 73 20 6e 6f 20 70 72 65 66 69  here is no prefi
28c40 78 20 69 6e 64 65 78 2c 20 73 65 74 20 69 49 64  x index, set iId
28c50 78 20 74 6f 0a 20 20 20 20 2a 2a 20 67 72 65 61  x to.    ** grea
28c60 74 65 72 20 74 68 61 6e 20 70 43 6f 6e 66 69 67  ter than pConfig
28c70 2d 3e 6e 50 72 65 66 69 78 20 74 6f 20 69 6e 64  ->nPrefix to ind
28c80 69 63 61 74 65 20 74 68 61 74 20 74 68 65 20 71  icate that the q
28c90 75 65 72 79 20 77 69 6c 6c 20 62 65 0a 20 20 20  uery will be.   
28ca0 20 2a 2a 20 73 61 74 69 73 66 69 65 64 20 62 79   ** satisfied by
28cb0 20 73 63 61 6e 6e 69 6e 67 20 6d 75 6c 74 69 70   scanning multip
28cc0 6c 65 20 74 65 72 6d 73 20 69 6e 20 74 68 65 20  le terms in the 
28cd0 6d 61 69 6e 20 69 6e 64 65 78 2e 0a 20 20 20 20  main index..    
28ce0 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20 74 68 65  **.    ** If the
28cf0 20 51 55 45 52 59 5f 54 45 53 54 5f 4e 4f 49 44   QUERY_TEST_NOID
28d00 58 20 66 6c 61 67 20 77 61 73 20 73 70 65 63 69  X flag was speci
28d10 66 69 65 64 2c 20 74 68 65 6e 20 74 68 69 73 20  fied, then this 
28d20 6d 75 73 74 20 62 65 20 61 0a 20 20 20 20 2a 2a  must be a.    **
28d30 20 70 72 65 66 69 78 2d 71 75 65 72 79 2e 20 49   prefix-query. I
28d40 6e 73 74 65 61 64 20 6f 66 20 75 73 69 6e 67 20  nstead of using 
28d50 61 20 70 72 65 66 69 78 2d 69 6e 64 65 78 20 28  a prefix-index (
28d60 69 66 20 6f 6e 65 20 65 78 69 73 74 73 29 2c 20  if one exists), 
28d70 0a 20 20 20 20 2a 2a 20 65 76 61 6c 75 61 74 65  .    ** evaluate
28d80 20 74 68 65 20 70 72 65 66 69 78 20 71 75 65 72   the prefix quer
28d90 79 20 75 73 69 6e 67 20 74 68 65 20 6d 61 69 6e  y using the main
28da0 20 46 54 53 20 69 6e 64 65 78 2e 20 54 68 69 73   FTS index. This
28db0 20 69 73 20 75 73 65 64 0a 20 20 20 20 2a 2a 20   is used.    ** 
28dc0 66 6f 72 20 69 6e 74 65 72 6e 61 6c 20 73 61 6e  for internal san
28dd0 69 74 79 20 63 68 65 63 6b 69 6e 67 20 62 79 20  ity checking by 
28de0 74 68 65 20 69 6e 74 65 67 72 69 74 79 2d 63 68  the integrity-ch
28df0 65 63 6b 20 69 6e 20 64 65 62 75 67 20 0a 20 20  eck in debug .  
28e00 20 20 2a 2a 20 6d 6f 64 65 20 6f 6e 6c 79 2e 20    ** mode only. 
28e10 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54   */.#ifdef SQLIT
28e20 45 5f 44 45 42 55 47 0a 20 20 20 20 69 66 28 20  E_DEBUG.    if( 
28e30 70 43 6f 6e 66 69 67 2d 3e 62 50 72 65 66 69 78  pConfig->bPrefix
28e40 49 6e 64 65 78 3d 3d 30 20 7c 7c 20 28 66 6c 61  Index==0 || (fla
28e50 67 73 20 26 20 46 54 53 35 49 4e 44 45 58 5f 51  gs & FTS5INDEX_Q
28e60 55 45 52 59 5f 54 45 53 54 5f 4e 4f 49 44 58 29  UERY_TEST_NOIDX)
28e70 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
28e80 28 20 66 6c 61 67 73 20 26 20 46 54 53 35 49 4e  ( flags & FTS5IN
28e90 44 45 58 5f 51 55 45 52 59 5f 50 52 45 46 49 58  DEX_QUERY_PREFIX
28ea0 20 29 3b 0a 20 20 20 20 20 20 69 49 64 78 20 3d   );.      iIdx =
28eb0 20 31 2b 70 43 6f 6e 66 69 67 2d 3e 6e 50 72 65   1+pConfig->nPre
28ec0 66 69 78 3b 0a 20 20 20 20 7d 65 6c 73 65 0a 23  fix;.    }else.#
28ed0 65 6e 64 69 66 0a 20 20 20 20 69 66 28 20 66 6c  endif.    if( fl
28ee0 61 67 73 20 26 20 46 54 53 35 49 4e 44 45 58 5f  ags & FTS5INDEX_
28ef0 51 55 45 52 59 5f 50 52 45 46 49 58 20 29 7b 0a  QUERY_PREFIX ){.
28f00 20 20 20 20 20 20 69 6e 74 20 6e 43 68 61 72 20        int nChar 
28f10 3d 20 66 74 73 35 49 6e 64 65 78 43 68 61 72 6c  = fts5IndexCharl
28f20 65 6e 28 70 54 6f 6b 65 6e 2c 20 6e 54 6f 6b 65  en(pToken, nToke
28f30 6e 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 49  n);.      for(iI
28f40 64 78 3d 31 3b 20 69 49 64 78 3c 3d 70 43 6f 6e  dx=1; iIdx<=pCon
28f50 66 69 67 2d 3e 6e 50 72 65 66 69 78 3b 20 69 49  fig->nPrefix; iI
28f60 64 78 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69  dx++){.        i
28f70 66 28 20 70 43 6f 6e 66 69 67 2d 3e 61 50 72 65  f( pConfig->aPre
28f80 66 69 78 5b 69 49 64 78 2d 31 5d 3d 3d 6e 43 68  fix[iIdx-1]==nCh
28f90 61 72 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  ar ) break;.    
28fa0 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69    }.    }..    i
28fb0 66 28 20 69 49 64 78 3c 3d 70 43 6f 6e 66 69 67  f( iIdx<=pConfig
28fc0 2d 3e 6e 50 72 65 66 69 78 20 29 7b 0a 20 20 20  ->nPrefix ){.   
28fd0 20 20 20 2f 2a 20 53 74 72 61 69 67 68 74 20 69     /* Straight i
28fe0 6e 64 65 78 20 6c 6f 6f 6b 75 70 20 2a 2f 0a 20  ndex lookup */. 
28ff0 20 20 20 20 20 46 74 73 35 53 74 72 75 63 74 75       Fts5Structu
29000 72 65 20 2a 70 53 74 72 75 63 74 20 3d 20 66 74  re *pStruct = ft
29010 73 35 53 74 72 75 63 74 75 72 65 52 65 61 64 28  s5StructureRead(
29020 70 29 3b 0a 20 20 20 20 20 20 62 75 66 2e 70 5b  p);.      buf.p[
29030 30 5d 20 3d 20 28 75 38 29 28 46 54 53 35 5f 4d  0] = (u8)(FTS5_M
29040 41 49 4e 5f 50 52 45 46 49 58 20 2b 20 69 49 64  AIN_PREFIX + iId
29050 78 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 53  x);.      if( pS
29060 74 72 75 63 74 20 29 7b 0a 20 20 20 20 20 20 20  truct ){.       
29070 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 4e 65   fts5MultiIterNe
29080 77 28 70 2c 20 70 53 74 72 75 63 74 2c 20 66 6c  w(p, pStruct, fl
29090 61 67 73 20 7c 20 46 54 53 35 49 4e 44 45 58 5f  ags | FTS5INDEX_
290a0 51 55 45 52 59 5f 53 4b 49 50 45 4d 50 54 59 2c  QUERY_SKIPEMPTY,
290b0 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 43   .            pC
290c0 6f 6c 73 65 74 2c 20 62 75 66 2e 70 2c 20 6e 54  olset, buf.p, nT
290d0 6f 6b 65 6e 2b 31 2c 20 2d 31 2c 20 30 2c 20 26  oken+1, -1, 0, &
290e0 70 52 65 74 0a 20 20 20 20 20 20 20 20 29 3b 0a  pRet.        );.
290f0 20 20 20 20 20 20 20 20 66 74 73 35 53 74 72 75          fts5Stru
29100 63 74 75 72 65 52 65 6c 65 61 73 65 28 70 53 74  ctureRelease(pSt
29110 72 75 63 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20  ruct);.      }. 
29120 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
29130 2f 2a 20 53 63 61 6e 20 6d 75 6c 74 69 70 6c 65  /* Scan multiple
29140 20 74 65 72 6d 73 20 69 6e 20 74 68 65 20 6d 61   terms in the ma
29150 69 6e 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20  in index */.    
29160 20 20 69 6e 74 20 62 44 65 73 63 20 3d 20 28 66    int bDesc = (f
29170 6c 61 67 73 20 26 20 46 54 53 35 49 4e 44 45 58  lags & FTS5INDEX
29180 5f 51 55 45 52 59 5f 44 45 53 43 29 21 3d 30 3b  _QUERY_DESC)!=0;
29190 0a 20 20 20 20 20 20 62 75 66 2e 70 5b 30 5d 20  .      buf.p[0] 
291a0 3d 20 46 54 53 35 5f 4d 41 49 4e 5f 50 52 45 46  = FTS5_MAIN_PREF
291b0 49 58 3b 0a 20 20 20 20 20 20 66 74 73 35 53 65  IX;.      fts5Se
291c0 74 75 70 50 72 65 66 69 78 49 74 65 72 28 70 2c  tupPrefixIter(p,
291d0 20 62 44 65 73 63 2c 20 62 75 66 2e 70 2c 20 6e   bDesc, buf.p, n
291e0 54 6f 6b 65 6e 2b 31 2c 20 70 43 6f 6c 73 65 74  Token+1, pColset
291f0 2c 20 26 70 52 65 74 29 3b 0a 20 20 20 20 20 20  , &pRet);.      
29200 61 73 73 65 72 74 28 20 70 2d 3e 72 63 21 3d 53  assert( p->rc!=S
29210 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 52 65 74  QLITE_OK || pRet
29220 2d 3e 70 43 6f 6c 73 65 74 3d 3d 30 20 29 3b 0a  ->pColset==0 );.
29230 20 20 20 20 20 20 66 74 73 35 49 74 65 72 53 65        fts5IterSe
29240 74 4f 75 74 70 75 74 43 62 28 26 70 2d 3e 72 63  tOutputCb(&p->rc
29250 2c 20 70 52 65 74 29 3b 0a 20 20 20 20 20 20 69  , pRet);.      i
29260 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  f( p->rc==SQLITE
29270 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 46  _OK ){.        F
29280 74 73 35 53 65 67 49 74 65 72 20 2a 70 53 65 67  ts5SegIter *pSeg
29290 20 3d 20 26 70 52 65 74 2d 3e 61 53 65 67 5b 70   = &pRet->aSeg[p
292a0 52 65 74 2d 3e 61 46 69 72 73 74 5b 31 5d 2e 69  Ret->aFirst[1].i
292b0 46 69 72 73 74 5d 3b 0a 20 20 20 20 20 20 20 20  First];.        
292c0 69 66 28 20 70 53 65 67 2d 3e 70 4c 65 61 66 20  if( pSeg->pLeaf 
292d0 29 20 70 52 65 74 2d 3e 78 53 65 74 4f 75 74 70  ) pRet->xSetOutp
292e0 75 74 73 28 70 52 65 74 2c 20 70 53 65 67 29 3b  uts(pRet, pSeg);
292f0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
29300 20 20 20 20 69 66 28 20 70 2d 3e 72 63 20 29 7b      if( p->rc ){
29310 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 46 74  .      sqlite3Ft
29320 73 35 49 74 65 72 43 6c 6f 73 65 28 28 46 74 73  s5IterClose((Fts
29330 35 49 6e 64 65 78 49 74 65 72 2a 29 70 52 65 74  5IndexIter*)pRet
29340 29 3b 0a 20 20 20 20 20 20 70 52 65 74 20 3d 20  );.      pRet = 
29350 30 3b 0a 20 20 20 20 20 20 66 74 73 35 43 6c 6f  0;.      fts5Clo
29360 73 65 52 65 61 64 65 72 28 70 29 3b 0a 20 20 20  seReader(p);.   
29370 20 7d 0a 0a 20 20 20 20 2a 70 70 49 74 65 72 20   }..    *ppIter 
29380 3d 20 26 70 52 65 74 2d 3e 62 61 73 65 3b 0a 20  = &pRet->base;. 
29390 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 42 75     sqlite3Fts5Bu
293a0 66 66 65 72 46 72 65 65 28 26 62 75 66 29 3b 0a  fferFree(&buf);.
293b0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 66 74 73    }.  return fts
293c0 35 49 6e 64 65 78 52 65 74 75 72 6e 28 70 29 3b  5IndexReturn(p);
293d0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
293e0 20 74 72 75 65 20 69 66 20 74 68 65 20 69 74 65   true if the ite
293f0 72 61 74 6f 72 20 70 61 73 73 65 64 20 61 73 20  rator passed as 
29400 74 68 65 20 6f 6e 6c 79 20 61 72 67 75 6d 65 6e  the only argumen
29410 74 20 69 73 20 61 74 20 45 4f 46 2e 0a 2a 2f 0a  t is at EOF..*/.
29420 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 6f 20 74 68  /*.** Move to th
29430 65 20 6e 65 78 74 20 6d 61 74 63 68 69 6e 67 20  e next matching 
29440 72 6f 77 69 64 2e 20 0a 2a 2f 0a 69 6e 74 20 73  rowid. .*/.int s
29450 71 6c 69 74 65 33 46 74 73 35 49 74 65 72 4e 65  qlite3Fts5IterNe
29460 78 74 28 46 74 73 35 49 6e 64 65 78 49 74 65 72  xt(Fts5IndexIter
29470 20 2a 70 49 6e 64 65 78 49 74 65 72 29 7b 0a 20   *pIndexIter){. 
29480 20 46 74 73 35 49 74 65 72 20 2a 70 49 74 65 72   Fts5Iter *pIter
29490 20 3d 20 28 46 74 73 35 49 74 65 72 2a 29 70 49   = (Fts5Iter*)pI
294a0 6e 64 65 78 49 74 65 72 3b 0a 20 20 61 73 73 65  ndexIter;.  asse
294b0 72 74 28 20 70 49 74 65 72 2d 3e 70 49 6e 64 65  rt( pIter->pInde
294c0 78 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  x->rc==SQLITE_OK
294d0 20 29 3b 0a 20 20 66 74 73 35 4d 75 6c 74 69 49   );.  fts5MultiI
294e0 74 65 72 4e 65 78 74 28 70 49 74 65 72 2d 3e 70  terNext(pIter->p
294f0 49 6e 64 65 78 2c 20 70 49 74 65 72 2c 20 30 2c  Index, pIter, 0,
29500 20 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 66 74   0);.  return ft
29510 73 35 49 6e 64 65 78 52 65 74 75 72 6e 28 70 49  s5IndexReturn(pI
29520 74 65 72 2d 3e 70 49 6e 64 65 78 29 3b 0a 7d 0a  ter->pIndex);.}.
29530 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 6f 20 74  ./*.** Move to t
29540 68 65 20 6e 65 78 74 20 6d 61 74 63 68 69 6e 67  he next matching
29550 20 74 65 72 6d 2f 72 6f 77 69 64 2e 20 55 73 65   term/rowid. Use
29560 64 20 62 79 20 74 68 65 20 66 74 73 35 76 6f 63  d by the fts5voc
29570 61 62 20 6d 6f 64 75 6c 65 2e 0a 2a 2f 0a 69 6e  ab module..*/.in
29580 74 20 73 71 6c 69 74 65 33 46 74 73 35 49 74 65  t sqlite3Fts5Ite
29590 72 4e 65 78 74 53 63 61 6e 28 46 74 73 35 49 6e  rNextScan(Fts5In
295a0 64 65 78 49 74 65 72 20 2a 70 49 6e 64 65 78 49  dexIter *pIndexI
295b0 74 65 72 29 7b 0a 20 20 46 74 73 35 49 74 65 72  ter){.  Fts5Iter
295c0 20 2a 70 49 74 65 72 20 3d 20 28 46 74 73 35 49   *pIter = (Fts5I
295d0 74 65 72 2a 29 70 49 6e 64 65 78 49 74 65 72 3b  ter*)pIndexIter;
295e0 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 20  .  Fts5Index *p 
295f0 3d 20 70 49 74 65 72 2d 3e 70 49 6e 64 65 78 3b  = pIter->pIndex;
29600 0a 0a 20 20 61 73 73 65 72 74 28 20 70 49 74 65  ..  assert( pIte
29610 72 2d 3e 70 49 6e 64 65 78 2d 3e 72 63 3d 3d 53  r->pIndex->rc==S
29620 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 0a 20 20 66  QLITE_OK );..  f
29630 74 73 35 4d 75 6c 74 69 49 74 65 72 4e 65 78 74  ts5MultiIterNext
29640 28 70 2c 20 70 49 74 65 72 2c 20 30 2c 20 30 29  (p, pIter, 0, 0)
29650 3b 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53  ;.  if( p->rc==S
29660 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
29670 46 74 73 35 53 65 67 49 74 65 72 20 2a 70 53 65  Fts5SegIter *pSe
29680 67 20 3d 20 26 70 49 74 65 72 2d 3e 61 53 65 67  g = &pIter->aSeg
29690 5b 20 70 49 74 65 72 2d 3e 61 46 69 72 73 74 5b  [ pIter->aFirst[
296a0 31 5d 2e 69 46 69 72 73 74 20 5d 3b 0a 20 20 20  1].iFirst ];.   
296b0 20 69 66 28 20 70 53 65 67 2d 3e 70 4c 65 61 66   if( pSeg->pLeaf
296c0 20 26 26 20 70 53 65 67 2d 3e 74 65 72 6d 2e 70   && pSeg->term.p
296d0 5b 30 5d 21 3d 46 54 53 35 5f 4d 41 49 4e 5f 50  [0]!=FTS5_MAIN_P
296e0 52 45 46 49 58 20 29 7b 0a 20 20 20 20 20 20 66  REFIX ){.      f
296f0 74 73 35 44 61 74 61 52 65 6c 65 61 73 65 28 70  ts5DataRelease(p
29700 53 65 67 2d 3e 70 4c 65 61 66 29 3b 0a 20 20 20  Seg->pLeaf);.   
29710 20 20 20 70 53 65 67 2d 3e 70 4c 65 61 66 20 3d     pSeg->pLeaf =
29720 20 30 3b 0a 20 20 20 20 20 20 70 49 74 65 72 2d   0;.      pIter-
29730 3e 62 61 73 65 2e 62 45 6f 66 20 3d 20 31 3b 0a  >base.bEof = 1;.
29740 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74      }.  }..  ret
29750 75 72 6e 20 66 74 73 35 49 6e 64 65 78 52 65 74  urn fts5IndexRet
29760 75 72 6e 28 70 49 74 65 72 2d 3e 70 49 6e 64 65  urn(pIter->pInde
29770 78 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76  x);.}../*.** Mov
29780 65 20 74 6f 20 74 68 65 20 6e 65 78 74 20 6d 61  e to the next ma
29790 74 63 68 69 6e 67 20 72 6f 77 69 64 20 74 68 61  tching rowid tha
297a0 74 20 6f 63 63 75 72 73 20 61 74 20 6f 72 20 61  t occurs at or a
297b0 66 74 65 72 20 69 4d 61 74 63 68 2e 20 54 68 65  fter iMatch. The
297c0 0a 2a 2a 20 64 65 66 69 6e 69 74 69 6f 6e 20 6f  .** definition o
297d0 66 20 22 61 74 20 6f 72 20 61 66 74 65 72 22 20  f "at or after" 
297e0 64 65 70 65 6e 64 73 20 6f 6e 20 77 68 65 74 68  depends on wheth
297f0 65 72 20 74 68 69 73 20 69 74 65 72 61 74 6f 72  er this iterator
29800 20 69 74 65 72 61 74 65 73 0a 2a 2a 20 69 6e 20   iterates.** in 
29810 61 73 63 65 6e 64 69 6e 67 20 6f 72 20 64 65 73  ascending or des
29820 63 65 6e 64 69 6e 67 20 72 6f 77 69 64 20 6f 72  cending rowid or
29830 64 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  der..*/.int sqli
29840 74 65 33 46 74 73 35 49 74 65 72 4e 65 78 74 46  te3Fts5IterNextF
29850 72 6f 6d 28 46 74 73 35 49 6e 64 65 78 49 74 65  rom(Fts5IndexIte
29860 72 20 2a 70 49 6e 64 65 78 49 74 65 72 2c 20 69  r *pIndexIter, i
29870 36 34 20 69 4d 61 74 63 68 29 7b 0a 20 20 46 74  64 iMatch){.  Ft
29880 73 35 49 74 65 72 20 2a 70 49 74 65 72 20 3d 20  s5Iter *pIter = 
29890 28 46 74 73 35 49 74 65 72 2a 29 70 49 6e 64 65  (Fts5Iter*)pInde
298a0 78 49 74 65 72 3b 0a 20 20 66 74 73 35 4d 75 6c  xIter;.  fts5Mul
298b0 74 69 49 74 65 72 4e 65 78 74 46 72 6f 6d 28 70  tiIterNextFrom(p
298c0 49 74 65 72 2d 3e 70 49 6e 64 65 78 2c 20 70 49  Iter->pIndex, pI
298d0 74 65 72 2c 20 69 4d 61 74 63 68 29 3b 0a 20 20  ter, iMatch);.  
298e0 72 65 74 75 72 6e 20 66 74 73 35 49 6e 64 65 78  return fts5Index
298f0 52 65 74 75 72 6e 28 70 49 74 65 72 2d 3e 70 49  Return(pIter->pI
29900 6e 64 65 78 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ndex);.}../*.** 
29910 52 65 74 75 72 6e 20 74 68 65 20 63 75 72 72 65  Return the curre
29920 6e 74 20 74 65 72 6d 2e 0a 2a 2f 0a 63 6f 6e 73  nt term..*/.cons
29930 74 20 63 68 61 72 20 2a 73 71 6c 69 74 65 33 46  t char *sqlite3F
29940 74 73 35 49 74 65 72 54 65 72 6d 28 46 74 73 35  ts5IterTerm(Fts5
29950 49 6e 64 65 78 49 74 65 72 20 2a 70 49 6e 64 65  IndexIter *pInde
29960 78 49 74 65 72 2c 20 69 6e 74 20 2a 70 6e 29 7b  xIter, int *pn){
29970 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 63 6f 6e 73  .  int n;.  cons
29980 74 20 63 68 61 72 20 2a 7a 20 3d 20 28 63 6f 6e  t char *z = (con
29990 73 74 20 63 68 61 72 2a 29 66 74 73 35 4d 75 6c  st char*)fts5Mul
299a0 74 69 49 74 65 72 54 65 72 6d 28 28 46 74 73 35  tiIterTerm((Fts5
299b0 49 74 65 72 2a 29 70 49 6e 64 65 78 49 74 65 72  Iter*)pIndexIter
299c0 2c 20 26 6e 29 3b 0a 20 20 2a 70 6e 20 3d 20 6e  , &n);.  *pn = n
299d0 2d 31 3b 0a 20 20 72 65 74 75 72 6e 20 26 7a 5b  -1;.  return &z[
299e0 31 5d 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f  1];.}../*.** Clo
299f0 73 65 20 61 6e 20 69 74 65 72 61 74 6f 72 20 6f  se an iterator o
29a00 70 65 6e 65 64 20 62 79 20 61 6e 20 65 61 72 6c  pened by an earl
29a10 69 65 72 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69  ier call to sqli
29a20 74 65 33 46 74 73 35 49 6e 64 65 78 51 75 65 72  te3Fts5IndexQuer
29a30 79 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  y()..*/.void sql
29a40 69 74 65 33 46 74 73 35 49 74 65 72 43 6c 6f 73  ite3Fts5IterClos
29a50 65 28 46 74 73 35 49 6e 64 65 78 49 74 65 72 20  e(Fts5IndexIter 
29a60 2a 70 49 6e 64 65 78 49 74 65 72 29 7b 0a 20 20  *pIndexIter){.  
29a70 69 66 28 20 70 49 6e 64 65 78 49 74 65 72 20 29  if( pIndexIter )
29a80 7b 0a 20 20 20 20 46 74 73 35 49 74 65 72 20 2a  {.    Fts5Iter *
29a90 70 49 74 65 72 20 3d 20 28 46 74 73 35 49 74 65  pIter = (Fts5Ite
29aa0 72 2a 29 70 49 6e 64 65 78 49 74 65 72 3b 0a 20  r*)pIndexIter;. 
29ab0 20 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 49     Fts5Index *pI
29ac0 6e 64 65 78 20 3d 20 70 49 74 65 72 2d 3e 70 49  ndex = pIter->pI
29ad0 6e 64 65 78 3b 0a 20 20 20 20 66 74 73 35 4d 75  ndex;.    fts5Mu
29ae0 6c 74 69 49 74 65 72 46 72 65 65 28 70 49 74 65  ltiIterFree(pIte
29af0 72 29 3b 0a 20 20 20 20 66 74 73 35 43 6c 6f 73  r);.    fts5Clos
29b00 65 52 65 61 64 65 72 28 70 49 6e 64 65 78 29 3b  eReader(pIndex);
29b10 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  .  }.}../*.** Re
29b20 61 64 20 61 6e 64 20 64 65 63 6f 64 65 20 74 68  ad and decode th
29b30 65 20 22 61 76 65 72 61 67 65 73 22 20 72 65 63  e "averages" rec
29b40 6f 72 64 20 66 72 6f 6d 20 74 68 65 20 64 61 74  ord from the dat
29b50 61 62 61 73 65 2e 20 0a 2a 2a 0a 2a 2a 20 50 61  abase. .**.** Pa
29b60 72 61 6d 65 74 65 72 20 61 6e 53 69 7a 65 20 6d  rameter anSize m
29b70 75 73 74 20 70 6f 69 6e 74 20 74 6f 20 61 6e 20  ust point to an 
29b80 61 72 72 61 79 20 6f 66 20 73 69 7a 65 20 6e 43  array of size nC
29b90 6f 6c 2c 20 77 68 65 72 65 20 6e 43 6f 6c 20 69  ol, where nCol i
29ba0 73 0a 2a 2a 20 74 68 65 20 6e 75 6d 62 65 72 20  s.** the number 
29bb0 6f 66 20 75 73 65 72 20 64 65 66 69 6e 65 64 20  of user defined 
29bc0 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 46  columns in the F
29bd0 54 53 20 74 61 62 6c 65 2e 0a 2a 2f 0a 69 6e 74  TS table..*/.int
29be0 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65   sqlite3Fts5Inde
29bf0 78 47 65 74 41 76 65 72 61 67 65 73 28 46 74 73  xGetAverages(Fts
29c00 35 49 6e 64 65 78 20 2a 70 2c 20 69 36 34 20 2a  5Index *p, i64 *
29c10 70 6e 52 6f 77 2c 20 69 36 34 20 2a 61 6e 53 69  pnRow, i64 *anSi
29c20 7a 65 29 7b 0a 20 20 69 6e 74 20 6e 43 6f 6c 20  ze){.  int nCol 
29c30 3d 20 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e 6e 43  = p->pConfig->nC
29c40 6f 6c 3b 0a 20 20 46 74 73 35 44 61 74 61 20 2a  ol;.  Fts5Data *
29c50 70 44 61 74 61 3b 0a 0a 20 20 2a 70 6e 52 6f 77  pData;..  *pnRow
29c60 20 3d 20 30 3b 0a 20 20 6d 65 6d 73 65 74 28 61   = 0;.  memset(a
29c70 6e 53 69 7a 65 2c 20 30 2c 20 73 69 7a 65 6f 66  nSize, 0, sizeof
29c80 28 69 36 34 29 20 2a 20 6e 43 6f 6c 29 3b 0a 20  (i64) * nCol);. 
29c90 20 70 44 61 74 61 20 3d 20 66 74 73 35 44 61 74   pData = fts5Dat
29ca0 61 52 65 61 64 28 70 2c 20 46 54 53 35 5f 41 56  aRead(p, FTS5_AV
29cb0 45 52 41 47 45 53 5f 52 4f 57 49 44 29 3b 0a 20  ERAGES_ROWID);. 
29cc0 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49   if( p->rc==SQLI
29cd0 54 45 5f 4f 4b 20 26 26 20 70 44 61 74 61 2d 3e  TE_OK && pData->
29ce0 6e 6e 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 20  nn ){.    int i 
29cf0 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 69 43 6f  = 0;.    int iCo
29d00 6c 3b 0a 20 20 20 20 69 20 2b 3d 20 66 74 73 35  l;.    i += fts5
29d10 47 65 74 56 61 72 69 6e 74 28 26 70 44 61 74 61  GetVarint(&pData
29d20 2d 3e 70 5b 69 5d 2c 20 28 75 36 34 2a 29 70 6e  ->p[i], (u64*)pn
29d30 52 6f 77 29 3b 0a 20 20 20 20 66 6f 72 28 69 43  Row);.    for(iC
29d40 6f 6c 3d 30 3b 20 69 3c 70 44 61 74 61 2d 3e 6e  ol=0; i<pData->n
29d50 6e 20 26 26 20 69 43 6f 6c 3c 6e 43 6f 6c 3b 20  n && iCol<nCol; 
29d60 69 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 69  iCol++){.      i
29d70 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e   += fts5GetVarin
29d80 74 28 26 70 44 61 74 61 2d 3e 70 5b 69 5d 2c 20  t(&pData->p[i], 
29d90 28 75 36 34 2a 29 26 61 6e 53 69 7a 65 5b 69 43  (u64*)&anSize[iC
29da0 6f 6c 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ol]);.    }.  }.
29db0 0a 20 20 66 74 73 35 44 61 74 61 52 65 6c 65 61  .  fts5DataRelea
29dc0 73 65 28 70 44 61 74 61 29 3b 0a 20 20 72 65 74  se(pData);.  ret
29dd0 75 72 6e 20 66 74 73 35 49 6e 64 65 78 52 65 74  urn fts5IndexRet
29de0 75 72 6e 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn(p);.}../*.**
29df0 20 52 65 70 6c 61 63 65 20 74 68 65 20 63 75 72   Replace the cur
29e00 72 65 6e 74 20 22 61 76 65 72 61 67 65 73 22 20  rent "averages" 
29e10 72 65 63 6f 72 64 20 77 69 74 68 20 74 68 65 20  record with the 
29e20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
29e30 62 75 66 66 65 72 20 0a 2a 2a 20 73 75 70 70 6c  buffer .** suppl
29e40 69 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e  ied as the secon
29e50 64 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 69  d argument..*/.i
29e60 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e  nt sqlite3Fts5In
29e70 64 65 78 53 65 74 41 76 65 72 61 67 65 73 28 46  dexSetAverages(F
29e80 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 63 6f 6e  ts5Index *p, con
29e90 73 74 20 75 38 20 2a 70 44 61 74 61 2c 20 69 6e  st u8 *pData, in
29ea0 74 20 6e 44 61 74 61 29 7b 0a 20 20 61 73 73 65  t nData){.  asse
29eb0 72 74 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  rt( p->rc==SQLIT
29ec0 45 5f 4f 4b 20 29 3b 0a 20 20 66 74 73 35 44 61  E_OK );.  fts5Da
29ed0 74 61 57 72 69 74 65 28 70 2c 20 46 54 53 35 5f  taWrite(p, FTS5_
29ee0 41 56 45 52 41 47 45 53 5f 52 4f 57 49 44 2c 20  AVERAGES_ROWID, 
29ef0 70 44 61 74 61 2c 20 6e 44 61 74 61 29 3b 0a 20  pData, nData);. 
29f00 20 72 65 74 75 72 6e 20 66 74 73 35 49 6e 64 65   return fts5Inde
29f10 78 52 65 74 75 72 6e 28 70 29 3b 0a 7d 0a 0a 2f  xReturn(p);.}../
29f20 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
29f30 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20  total number of 
29f40 62 6c 6f 63 6b 73 20 74 68 69 73 20 6d 6f 64 75  blocks this modu
29f50 6c 65 20 68 61 73 20 72 65 61 64 20 66 72 6f 6d  le has read from
29f60 20 74 68 65 20 25 5f 64 61 74 61 0a 2a 2a 20 74   the %_data.** t
29f70 61 62 6c 65 20 73 69 6e 63 65 20 69 74 20 77 61  able since it wa
29f80 73 20 63 72 65 61 74 65 64 2e 0a 2a 2f 0a 69 6e  s created..*/.in
29f90 74 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64  t sqlite3Fts5Ind
29fa0 65 78 52 65 61 64 73 28 46 74 73 35 49 6e 64 65  exReads(Fts5Inde
29fb0 78 20 2a 70 29 7b 0a 20 20 72 65 74 75 72 6e 20  x *p){.  return 
29fc0 70 2d 3e 6e 52 65 61 64 3b 0a 7d 0a 0a 2f 2a 0a  p->nRead;.}../*.
29fd0 2a 2a 20 53 65 74 20 74 68 65 20 33 32 2d 62 69  ** Set the 32-bi
29fe0 74 20 63 6f 6f 6b 69 65 20 76 61 6c 75 65 20 73  t cookie value s
29ff0 74 6f 72 65 64 20 61 74 20 74 68 65 20 73 74 61  tored at the sta
2a000 72 74 20 6f 66 20 61 6c 6c 20 73 74 72 75 63 74  rt of all struct
2a010 75 72 65 20 0a 2a 2a 20 72 65 63 6f 72 64 73 20  ure .** records 
2a020 74 6f 20 74 68 65 20 76 61 6c 75 65 20 70 61 73  to the value pas
2a030 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e  sed as the secon
2a040 64 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a  d argument..**.*
2a050 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  * Return SQLITE_
2a060 4f 4b 20 69 66 20 73 75 63 63 65 73 73 66 75 6c  OK if successful
2a070 2c 20 6f 72 20 61 6e 20 53 51 4c 69 74 65 20 65  , or an SQLite e
2a080 72 72 6f 72 20 63 6f 64 65 20 69 66 20 61 6e 20  rror code if an 
2a090 65 72 72 6f 72 0a 2a 2a 20 6f 63 63 75 72 73 2e  error.** occurs.
2a0a0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46  .*/.int sqlite3F
2a0b0 74 73 35 49 6e 64 65 78 53 65 74 43 6f 6f 6b 69  ts5IndexSetCooki
2a0c0 65 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20  e(Fts5Index *p, 
2a0d0 69 6e 74 20 69 4e 65 77 29 7b 0a 20 20 69 6e 74  int iNew){.  int
2a0e0 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
2a0f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a100 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
2a110 20 2a 2f 0a 20 20 46 74 73 35 43 6f 6e 66 69 67   */.  Fts5Config
2a120 20 2a 70 43 6f 6e 66 69 67 20 3d 20 70 2d 3e 70   *pConfig = p->p
2a130 43 6f 6e 66 69 67 3b 20 20 20 20 2f 2a 20 43 6f  Config;    /* Co
2a140 6e 66 69 67 75 72 61 74 69 6f 6e 20 6f 62 6a 65  nfiguration obje
2a150 63 74 20 2a 2f 0a 20 20 75 38 20 61 43 6f 6f 6b  ct */.  u8 aCook
2a160 69 65 5b 34 5d 3b 20 20 20 20 20 20 20 20 20 20  ie[4];          
2a170 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2a180 42 69 6e 61 72 79 20 72 65 70 72 65 73 65 6e 74  Binary represent
2a190 61 74 69 6f 6e 20 6f 66 20 69 4e 65 77 20 2a 2f  ation of iNew */
2a1a0 0a 20 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62 20  .  sqlite3_blob 
2a1b0 2a 70 42 6c 6f 62 20 3d 20 30 3b 0a 0a 20 20 61  *pBlob = 0;..  a
2a1c0 73 73 65 72 74 28 20 70 2d 3e 72 63 3d 3d 53 51  ssert( p->rc==SQ
2a1d0 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 73 71 6c  LITE_OK );.  sql
2a1e0 69 74 65 33 46 74 73 35 50 75 74 33 32 28 61 43  ite3Fts5Put32(aC
2a1f0 6f 6f 6b 69 65 2c 20 69 4e 65 77 29 3b 0a 0a 20  ookie, iNew);.. 
2a200 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 62 6c   rc = sqlite3_bl
2a210 6f 62 5f 6f 70 65 6e 28 70 43 6f 6e 66 69 67 2d  ob_open(pConfig-
2a220 3e 64 62 2c 20 70 43 6f 6e 66 69 67 2d 3e 7a 44  >db, pConfig->zD
2a230 62 2c 20 70 2d 3e 7a 44 61 74 61 54 62 6c 2c 20  b, p->zDataTbl, 
2a240 0a 20 20 20 20 20 20 22 62 6c 6f 63 6b 22 2c 20  .      "block", 
2a250 46 54 53 35 5f 53 54 52 55 43 54 55 52 45 5f 52  FTS5_STRUCTURE_R
2a260 4f 57 49 44 2c 20 31 2c 20 26 70 42 6c 6f 62 0a  OWID, 1, &pBlob.
2a270 20 20 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53    );.  if( rc==S
2a280 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2a290 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 77 72 69  sqlite3_blob_wri
2a2a0 74 65 28 70 42 6c 6f 62 2c 20 61 43 6f 6f 6b 69  te(pBlob, aCooki
2a2b0 65 2c 20 34 2c 20 30 29 3b 0a 20 20 20 20 72 63  e, 4, 0);.    rc
2a2c0 20 3d 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f   = sqlite3_blob_
2a2d0 63 6c 6f 73 65 28 70 42 6c 6f 62 29 3b 0a 20 20  close(pBlob);.  
2a2e0 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  }..  return rc;.
2a2f0 7d 0a 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74  }..int sqlite3Ft
2a300 73 35 49 6e 64 65 78 4c 6f 61 64 43 6f 6e 66 69  s5IndexLoadConfi
2a310 67 28 46 74 73 35 49 6e 64 65 78 20 2a 70 29 7b  g(Fts5Index *p){
2a320 0a 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65  .  Fts5Structure
2a330 20 2a 70 53 74 72 75 63 74 3b 0a 20 20 70 53 74   *pStruct;.  pSt
2a340 72 75 63 74 20 3d 20 66 74 73 35 53 74 72 75 63  ruct = fts5Struc
2a350 74 75 72 65 52 65 61 64 28 70 29 3b 0a 20 20 66  tureRead(p);.  f
2a360 74 73 35 53 74 72 75 63 74 75 72 65 52 65 6c 65  ts5StructureRele
2a370 61 73 65 28 70 53 74 72 75 63 74 29 3b 0a 20 20  ase(pStruct);.  
2a380 72 65 74 75 72 6e 20 66 74 73 35 49 6e 64 65 78  return fts5Index
2a390 52 65 74 75 72 6e 28 70 29 3b 0a 7d 0a 0a 0a 2f  Return(p);.}.../
2a3a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2a3b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2a3c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2a3d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2a3e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a  *********.******
2a3f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2a400 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2a410 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2a420 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2a430 2a 2a 2a 2a 0a 2a 2a 20 42 65 6c 6f 77 20 74 68  ****.** Below th
2a440 69 73 20 70 6f 69 6e 74 20 69 73 20 74 68 65 20  is point is the 
2a450 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f  implementation o
2a460 66 20 74 68 65 20 69 6e 74 65 67 72 69 74 79 2d  f the integrity-
2a470 63 68 65 63 6b 20 0a 2a 2a 20 66 75 6e 63 74 69  check .** functi
2a480 6f 6e 61 6c 69 74 79 2e 0a 2a 2f 0a 0a 2f 2a 0a  onality..*/../*.
2a490 2a 2a 20 52 65 74 75 72 6e 20 61 20 73 69 6d 70  ** Return a simp
2a4a0 6c 65 20 63 68 65 63 6b 73 75 6d 20 76 61 6c 75  le checksum valu
2a4b0 65 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20 61  e based on the a
2a4c0 72 67 75 6d 65 6e 74 73 2e 0a 2a 2f 0a 75 36 34  rguments..*/.u64
2a4d0 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65   sqlite3Fts5Inde
2a4e0 78 45 6e 74 72 79 43 6b 73 75 6d 28 0a 20 20 69  xEntryCksum(.  i
2a4f0 36 34 20 69 52 6f 77 69 64 2c 20 0a 20 20 69 6e  64 iRowid, .  in
2a500 74 20 69 43 6f 6c 2c 20 0a 20 20 69 6e 74 20 69  t iCol, .  int i
2a510 50 6f 73 2c 20 0a 20 20 69 6e 74 20 69 49 64 78  Pos, .  int iIdx
2a520 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ,.  const char *
2a530 70 54 65 72 6d 2c 0a 20 20 69 6e 74 20 6e 54 65  pTerm,.  int nTe
2a540 72 6d 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  rm.){.  int i;. 
2a550 20 75 36 34 20 72 65 74 20 3d 20 69 52 6f 77 69   u64 ret = iRowi
2a560 64 3b 0a 20 20 72 65 74 20 2b 3d 20 28 72 65 74  d;.  ret += (ret
2a570 3c 3c 33 29 20 2b 20 69 43 6f 6c 3b 0a 20 20 72  <<3) + iCol;.  r
2a580 65 74 20 2b 3d 20 28 72 65 74 3c 3c 33 29 20 2b  et += (ret<<3) +
2a590 20 69 50 6f 73 3b 0a 20 20 69 66 28 20 69 49 64   iPos;.  if( iId
2a5a0 78 3e 3d 30 20 29 20 72 65 74 20 2b 3d 20 28 72  x>=0 ) ret += (r
2a5b0 65 74 3c 3c 33 29 20 2b 20 28 46 54 53 35 5f 4d  et<<3) + (FTS5_M
2a5c0 41 49 4e 5f 50 52 45 46 49 58 20 2b 20 69 49 64  AIN_PREFIX + iId
2a5d0 78 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  x);.  for(i=0; i
2a5e0 3c 6e 54 65 72 6d 3b 20 69 2b 2b 29 20 72 65 74  <nTerm; i++) ret
2a5f0 20 2b 3d 20 28 72 65 74 3c 3c 33 29 20 2b 20 70   += (ret<<3) + p
2a600 54 65 72 6d 5b 69 5d 3b 0a 20 20 72 65 74 75 72  Term[i];.  retur
2a610 6e 20 72 65 74 3b 0a 7d 0a 0a 23 69 66 64 65 66  n ret;.}..#ifdef
2a620 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a   SQLITE_DEBUG./*
2a630 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
2a640 6e 20 69 73 20 70 75 72 65 6c 79 20 61 6e 20 69  n is purely an i
2a650 6e 74 65 72 6e 61 6c 20 74 65 73 74 2e 20 49 74  nternal test. It
2a660 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6e 74 72 69   does not contri
2a670 62 75 74 65 20 74 6f 20 0a 2a 2a 20 46 54 53 20  bute to .** FTS 
2a680 66 75 6e 63 74 69 6f 6e 61 6c 69 74 79 2c 20 6f  functionality, o
2a690 72 20 65 76 65 6e 20 74 68 65 20 69 6e 74 65 67  r even the integ
2a6a0 72 69 74 79 2d 63 68 65 63 6b 2c 20 69 6e 20 61  rity-check, in a
2a6b0 6e 79 20 77 61 79 2e 0a 2a 2a 0a 2a 2a 20 49 6e  ny way..**.** In
2a6c0 73 74 65 61 64 2c 20 69 74 20 74 65 73 74 73 20  stead, it tests 
2a6d0 74 68 61 74 20 74 68 65 20 73 61 6d 65 20 73 65  that the same se
2a6e0 74 20 6f 66 20 70 67 6e 6f 2f 72 6f 77 69 64 20  t of pgno/rowid 
2a6f0 63 6f 6d 62 69 6e 61 74 69 6f 6e 73 20 61 72 65  combinations are
2a700 20 0a 2a 2a 20 76 69 73 69 74 65 64 20 72 65 67   .** visited reg
2a710 61 72 64 6c 65 73 73 20 6f 66 20 77 68 65 74 68  ardless of wheth
2a720 65 72 20 74 68 65 20 64 6f 63 6c 69 73 74 2d 69  er the doclist-i
2a730 6e 64 65 78 20 69 64 65 6e 74 69 66 69 65 64 20  ndex identified 
2a740 62 79 20 70 61 72 61 6d 65 74 65 72 73 0a 2a 2a  by parameters.**
2a750 20 69 53 65 67 69 64 2f 69 4c 65 61 66 20 69 73   iSegid/iLeaf is
2a760 20 69 74 65 72 61 74 65 64 20 69 6e 20 66 6f 72   iterated in for
2a770 77 61 72 64 73 20 6f 72 20 72 65 76 65 72 73 65  wards or reverse
2a780 20 6f 72 64 65 72 2e 0a 2a 2f 0a 73 74 61 74 69   order..*/.stati
2a790 63 20 76 6f 69 64 20 66 74 73 35 54 65 73 74 44  c void fts5TestD
2a7a0 6c 69 64 78 52 65 76 65 72 73 65 28 0a 20 20 46  lidxReverse(.  F
2a7b0 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 0a 20 20  ts5Index *p, .  
2a7c0 69 6e 74 20 69 53 65 67 69 64 2c 20 20 20 20 20  int iSegid,     
2a7d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a7e0 2f 2a 20 53 65 67 6d 65 6e 74 20 69 64 20 74 6f  /* Segment id to
2a7f0 20 6c 6f 61 64 20 66 72 6f 6d 20 2a 2f 0a 20 20   load from */.  
2a800 69 6e 74 20 69 4c 65 61 66 20 20 20 20 20 20 20  int iLeaf       
2a810 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a820 2f 2a 20 4c 6f 61 64 20 64 6f 63 6c 69 73 74 2d  /* Load doclist-
2a830 69 6e 64 65 78 20 66 6f 72 20 74 68 69 73 20 6c  index for this l
2a840 65 61 66 20 2a 2f 0a 29 7b 0a 20 20 46 74 73 35  eaf */.){.  Fts5
2a850 44 6c 69 64 78 49 74 65 72 20 2a 70 44 6c 69 64  DlidxIter *pDlid
2a860 78 20 3d 20 30 3b 0a 20 20 75 36 34 20 63 6b 73  x = 0;.  u64 cks
2a870 75 6d 31 20 3d 20 31 33 3b 0a 20 20 75 36 34 20  um1 = 13;.  u64 
2a880 63 6b 73 75 6d 32 20 3d 20 31 33 3b 0a 0a 20 20  cksum2 = 13;..  
2a890 66 6f 72 28 70 44 6c 69 64 78 3d 66 74 73 35 44  for(pDlidx=fts5D
2a8a0 6c 69 64 78 49 74 65 72 49 6e 69 74 28 70 2c 20  lidxIterInit(p, 
2a8b0 30 2c 20 69 53 65 67 69 64 2c 20 69 4c 65 61 66  0, iSegid, iLeaf
2a8c0 29 3b 0a 20 20 20 20 20 20 66 74 73 35 44 6c 69  );.      fts5Dli
2a8d0 64 78 49 74 65 72 45 6f 66 28 70 2c 20 70 44 6c  dxIterEof(p, pDl
2a8e0 69 64 78 29 3d 3d 30 3b 0a 20 20 20 20 20 20 66  idx)==0;.      f
2a8f0 74 73 35 44 6c 69 64 78 49 74 65 72 4e 65 78 74  ts5DlidxIterNext
2a900 28 70 2c 20 70 44 6c 69 64 78 29 0a 20 20 29 7b  (p, pDlidx).  ){
2a910 0a 20 20 20 20 69 36 34 20 69 52 6f 77 69 64 20  .    i64 iRowid 
2a920 3d 20 66 74 73 35 44 6c 69 64 78 49 74 65 72 52  = fts5DlidxIterR
2a930 6f 77 69 64 28 70 44 6c 69 64 78 29 3b 0a 20 20  owid(pDlidx);.  
2a940 20 20 69 6e 74 20 70 67 6e 6f 20 3d 20 66 74 73    int pgno = fts
2a950 35 44 6c 69 64 78 49 74 65 72 50 67 6e 6f 28 70  5DlidxIterPgno(p
2a960 44 6c 69 64 78 29 3b 0a 20 20 20 20 61 73 73 65  Dlidx);.    asse
2a970 72 74 28 20 70 67 6e 6f 3e 69 4c 65 61 66 20 29  rt( pgno>iLeaf )
2a980 3b 0a 20 20 20 20 63 6b 73 75 6d 31 20 2b 3d 20  ;.    cksum1 += 
2a990 69 52 6f 77 69 64 20 2b 20 28 28 69 36 34 29 70  iRowid + ((i64)p
2a9a0 67 6e 6f 3c 3c 33 32 29 3b 0a 20 20 7d 0a 20 20  gno<<32);.  }.  
2a9b0 66 74 73 35 44 6c 69 64 78 49 74 65 72 46 72 65  fts5DlidxIterFre
2a9c0 65 28 70 44 6c 69 64 78 29 3b 0a 20 20 70 44 6c  e(pDlidx);.  pDl
2a9d0 69 64 78 20 3d 20 30 3b 0a 0a 20 20 66 6f 72 28  idx = 0;..  for(
2a9e0 70 44 6c 69 64 78 3d 66 74 73 35 44 6c 69 64 78  pDlidx=fts5Dlidx
2a9f0 49 74 65 72 49 6e 69 74 28 70 2c 20 31 2c 20 69  IterInit(p, 1, i
2aa00 53 65 67 69 64 2c 20 69 4c 65 61 66 29 3b 0a 20  Segid, iLeaf);. 
2aa10 20 20 20 20 20 66 74 73 35 44 6c 69 64 78 49 74       fts5DlidxIt
2aa20 65 72 45 6f 66 28 70 2c 20 70 44 6c 69 64 78 29  erEof(p, pDlidx)
2aa30 3d 3d 30 3b 0a 20 20 20 20 20 20 66 74 73 35 44  ==0;.      fts5D
2aa40 6c 69 64 78 49 74 65 72 50 72 65 76 28 70 2c 20  lidxIterPrev(p, 
2aa50 70 44 6c 69 64 78 29 0a 20 20 29 7b 0a 20 20 20  pDlidx).  ){.   
2aa60 20 69 36 34 20 69 52 6f 77 69 64 20 3d 20 66 74   i64 iRowid = ft
2aa70 73 35 44 6c 69 64 78 49 74 65 72 52 6f 77 69 64  s5DlidxIterRowid
2aa80 28 70 44 6c 69 64 78 29 3b 0a 20 20 20 20 69 6e  (pDlidx);.    in
2aa90 74 20 70 67 6e 6f 20 3d 20 66 74 73 35 44 6c 69  t pgno = fts5Dli
2aaa0 64 78 49 74 65 72 50 67 6e 6f 28 70 44 6c 69 64  dxIterPgno(pDlid
2aab0 78 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  x);.    assert( 
2aac0 66 74 73 35 44 6c 69 64 78 49 74 65 72 50 67 6e  fts5DlidxIterPgn
2aad0 6f 28 70 44 6c 69 64 78 29 3e 69 4c 65 61 66 20  o(pDlidx)>iLeaf 
2aae0 29 3b 0a 20 20 20 20 63 6b 73 75 6d 32 20 2b 3d  );.    cksum2 +=
2aaf0 20 69 52 6f 77 69 64 20 2b 20 28 28 69 36 34 29   iRowid + ((i64)
2ab00 70 67 6e 6f 3c 3c 33 32 29 3b 0a 20 20 7d 0a 20  pgno<<32);.  }. 
2ab10 20 66 74 73 35 44 6c 69 64 78 49 74 65 72 46 72   fts5DlidxIterFr
2ab20 65 65 28 70 44 6c 69 64 78 29 3b 0a 20 20 70 44  ee(pDlidx);.  pD
2ab30 6c 69 64 78 20 3d 20 30 3b 0a 0a 20 20 69 66 28  lidx = 0;..  if(
2ab40 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
2ab50 4b 20 26 26 20 63 6b 73 75 6d 31 21 3d 63 6b 73  K && cksum1!=cks
2ab60 75 6d 32 20 29 20 70 2d 3e 72 63 20 3d 20 46 54  um2 ) p->rc = FT
2ab70 53 35 5f 43 4f 52 52 55 50 54 3b 0a 7d 0a 0a 73  S5_CORRUPT;.}..s
2ab80 74 61 74 69 63 20 69 6e 74 20 66 74 73 35 51 75  tatic int fts5Qu
2ab90 65 72 79 43 6b 73 75 6d 28 0a 20 20 46 74 73 35  eryCksum(.  Fts5
2aba0 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20  Index *p,       
2abb0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
2abc0 74 73 35 20 69 6e 64 65 78 20 6f 62 6a 65 63 74  ts5 index object
2abd0 20 2a 2f 0a 20 20 69 6e 74 20 69 49 64 78 2c 0a   */.  int iIdx,.
2abe0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 2c    const char *z,
2abf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ac00 20 20 2f 2a 20 49 6e 64 65 78 20 6b 65 79 20 74    /* Index key t
2ac10 6f 20 71 75 65 72 79 20 66 6f 72 20 2a 2f 0a 20  o query for */. 
2ac20 20 69 6e 74 20 6e 2c 20 20 20 20 20 20 20 20 20   int n,         
2ac30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ac40 20 2f 2a 20 53 69 7a 65 20 6f 66 20 69 6e 64 65   /* Size of inde
2ac50 78 20 6b 65 79 20 69 6e 20 62 79 74 65 73 20 2a  x key in bytes *
2ac60 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c 20 20  /.  int flags,  
2ac70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ac80 20 20 20 20 2f 2a 20 46 6c 61 67 73 20 66 6f 72      /* Flags for
2ac90 20 46 74 73 35 49 6e 64 65 78 51 75 65 72 79 20   Fts5IndexQuery 
2aca0 2a 2f 0a 20 20 75 36 34 20 2a 70 43 6b 73 75 6d  */.  u64 *pCksum
2acb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2acc0 20 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20       /* IN/OUT: 
2acd0 43 68 65 63 6b 73 75 6d 20 76 61 6c 75 65 20 2a  Checksum value *
2ace0 2f 0a 29 7b 0a 20 20 69 6e 74 20 65 44 65 74 61  /.){.  int eDeta
2acf0 69 6c 20 3d 20 70 2d 3e 70 43 6f 6e 66 69 67 2d  il = p->pConfig-
2ad00 3e 65 44 65 74 61 69 6c 3b 0a 20 20 75 36 34 20  >eDetail;.  u64 
2ad10 63 6b 73 75 6d 20 3d 20 2a 70 43 6b 73 75 6d 3b  cksum = *pCksum;
2ad20 0a 20 20 46 74 73 35 49 6e 64 65 78 49 74 65 72  .  Fts5IndexIter
2ad30 20 2a 70 49 74 65 72 20 3d 20 30 3b 0a 20 20 69   *pIter = 0;.  i
2ad40 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33 46  nt rc = sqlite3F
2ad50 74 73 35 49 6e 64 65 78 51 75 65 72 79 28 70 2c  ts5IndexQuery(p,
2ad60 20 7a 2c 20 6e 2c 20 66 6c 61 67 73 2c 20 30 2c   z, n, flags, 0,
2ad70 20 26 70 49 74 65 72 29 3b 0a 0a 20 20 77 68 69   &pIter);..  whi
2ad80 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  le( rc==SQLITE_O
2ad90 4b 20 26 26 20 30 3d 3d 73 71 6c 69 74 65 33 46  K && 0==sqlite3F
2ada0 74 73 35 49 74 65 72 45 6f 66 28 70 49 74 65 72  ts5IterEof(pIter
2adb0 29 20 29 7b 0a 20 20 20 20 69 36 34 20 72 6f 77  ) ){.    i64 row
2adc0 69 64 20 3d 20 70 49 74 65 72 2d 3e 69 52 6f 77  id = pIter->iRow
2add0 69 64 3b 0a 0a 20 20 20 20 69 66 28 20 65 44 65  id;..    if( eDe
2ade0 74 61 69 6c 3d 3d 46 54 53 35 5f 44 45 54 41 49  tail==FTS5_DETAI
2adf0 4c 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20  L_NONE ){.      
2ae00 63 6b 73 75 6d 20 5e 3d 20 73 71 6c 69 74 65 33  cksum ^= sqlite3
2ae10 46 74 73 35 49 6e 64 65 78 45 6e 74 72 79 43 6b  Fts5IndexEntryCk
2ae20 73 75 6d 28 72 6f 77 69 64 2c 20 30 2c 20 30 2c  sum(rowid, 0, 0,
2ae30 20 69 49 64 78 2c 20 7a 2c 20 6e 29 3b 0a 20 20   iIdx, z, n);.  
2ae40 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 46    }else{.      F
2ae50 74 73 35 50 6f 73 6c 69 73 74 52 65 61 64 65 72  ts5PoslistReader
2ae60 20 73 52 65 61 64 65 72 3b 0a 20 20 20 20 20 20   sReader;.      
2ae70 66 6f 72 28 73 71 6c 69 74 65 33 46 74 73 35 50  for(sqlite3Fts5P
2ae80 6f 73 6c 69 73 74 52 65 61 64 65 72 49 6e 69 74  oslistReaderInit
2ae90 28 70 49 74 65 72 2d 3e 70 44 61 74 61 2c 20 70  (pIter->pData, p
2aea0 49 74 65 72 2d 3e 6e 44 61 74 61 2c 20 26 73 52  Iter->nData, &sR
2aeb0 65 61 64 65 72 29 3b 0a 20 20 20 20 20 20 20 20  eader);.        
2aec0 20 20 73 52 65 61 64 65 72 2e 62 45 6f 66 3d 3d    sReader.bEof==
2aed0 30 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  0;.          sql
2aee0 69 74 65 33 46 74 73 35 50 6f 73 6c 69 73 74 52  ite3Fts5PoslistR
2aef0 65 61 64 65 72 4e 65 78 74 28 26 73 52 65 61 64  eaderNext(&sRead
2af00 65 72 29 0a 20 20 20 20 20 20 29 7b 0a 20 20 20  er).      ){.   
2af10 20 20 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20       int iCol = 
2af20 46 54 53 35 5f 50 4f 53 32 43 4f 4c 55 4d 4e 28  FTS5_POS2COLUMN(
2af30 73 52 65 61 64 65 72 2e 69 50 6f 73 29 3b 0a 20  sReader.iPos);. 
2af40 20 20 20 20 20 20 20 69 6e 74 20 69 4f 66 66 20         int iOff 
2af50 3d 20 46 54 53 35 5f 50 4f 53 32 4f 46 46 53 45  = FTS5_POS2OFFSE
2af60 54 28 73 52 65 61 64 65 72 2e 69 50 6f 73 29 3b  T(sReader.iPos);
2af70 0a 20 20 20 20 20 20 20 20 63 6b 73 75 6d 20 5e  .        cksum ^
2af80 3d 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64  = sqlite3Fts5Ind
2af90 65 78 45 6e 74 72 79 43 6b 73 75 6d 28 72 6f 77  exEntryCksum(row
2afa0 69 64 2c 20 69 43 6f 6c 2c 20 69 4f 66 66 2c 20  id, iCol, iOff, 
2afb0 69 49 64 78 2c 20 7a 2c 20 6e 29 3b 0a 20 20 20  iIdx, z, n);.   
2afc0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
2afd0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
2afe0 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   ){.      rc = s
2aff0 71 6c 69 74 65 33 46 74 73 35 49 74 65 72 4e 65  qlite3Fts5IterNe
2b000 78 74 28 70 49 74 65 72 29 3b 0a 20 20 20 20 7d  xt(pIter);.    }
2b010 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 46 74  .  }.  sqlite3Ft
2b020 73 35 49 74 65 72 43 6c 6f 73 65 28 70 49 74 65  s5IterClose(pIte
2b030 72 29 3b 0a 0a 20 20 2a 70 43 6b 73 75 6d 20 3d  r);..  *pCksum =
2b040 20 63 6b 73 75 6d 3b 0a 20 20 72 65 74 75 72 6e   cksum;.  return
2b050 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54   rc;.}.../*.** T
2b060 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
2b070 61 6c 73 6f 20 70 75 72 65 6c 79 20 61 6e 20 69  also purely an i
2b080 6e 74 65 72 6e 61 6c 20 74 65 73 74 2e 20 49 74  nternal test. It
2b090 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6e 74 72 69   does not contri
2b0a0 62 75 74 65 20 74 6f 20 0a 2a 2a 20 46 54 53 20  bute to .** FTS 
2b0b0 66 75 6e 63 74 69 6f 6e 61 6c 69 74 79 2c 20 6f  functionality, o
2b0c0 72 20 65 76 65 6e 20 74 68 65 20 69 6e 74 65 67  r even the integ
2b0d0 72 69 74 79 2d 63 68 65 63 6b 2c 20 69 6e 20 61  rity-check, in a
2b0e0 6e 79 20 77 61 79 2e 0a 2a 2f 0a 73 74 61 74 69  ny way..*/.stati
2b0f0 63 20 76 6f 69 64 20 66 74 73 35 54 65 73 74 54  c void fts5TestT
2b100 65 72 6d 28 0a 20 20 46 74 73 35 49 6e 64 65 78  erm(.  Fts5Index
2b110 20 2a 70 2c 20 0a 20 20 46 74 73 35 42 75 66 66   *p, .  Fts5Buff
2b120 65 72 20 2a 70 50 72 65 76 2c 20 20 20 20 20 20  er *pPrev,      
2b130 20 20 20 20 20 20 20 20 2f 2a 20 50 72 65 76 69          /* Previ
2b140 6f 75 73 20 74 65 72 6d 20 2a 2f 0a 20 20 63 6f  ous term */.  co
2b150 6e 73 74 20 63 68 61 72 20 2a 7a 2c 20 69 6e 74  nst char *z, int
2b160 20 6e 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a   n,           /*
2b170 20 50 6f 73 73 69 62 6c 79 20 6e 65 77 20 74 65   Possibly new te
2b180 72 6d 20 74 6f 20 74 65 73 74 20 2a 2f 0a 20 20  rm to test */.  
2b190 75 36 34 20 65 78 70 65 63 74 65 64 2c 0a 20 20  u64 expected,.  
2b1a0 75 36 34 20 2a 70 43 6b 73 75 6d 0a 29 7b 0a 20  u64 *pCksum.){. 
2b1b0 20 69 6e 74 20 72 63 20 3d 20 70 2d 3e 72 63 3b   int rc = p->rc;
2b1c0 0a 20 20 69 66 28 20 70 50 72 65 76 2d 3e 6e 3d  .  if( pPrev->n=
2b1d0 3d 30 20 29 7b 0a 20 20 20 20 66 74 73 35 42 75  =0 ){.    fts5Bu
2b1e0 66 66 65 72 53 65 74 28 26 72 63 2c 20 70 50 72  fferSet(&rc, pPr
2b1f0 65 76 2c 20 6e 2c 20 28 63 6f 6e 73 74 20 75 38  ev, n, (const u8
2b200 2a 29 7a 29 3b 0a 20 20 7d 65 6c 73 65 0a 20 20  *)z);.  }else.  
2b210 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
2b220 4b 20 26 26 20 28 70 50 72 65 76 2d 3e 6e 21 3d  K && (pPrev->n!=
2b230 6e 20 7c 7c 20 6d 65 6d 63 6d 70 28 70 50 72 65  n || memcmp(pPre
2b240 76 2d 3e 70 2c 20 7a 2c 20 6e 29 29 20 29 7b 0a  v->p, z, n)) ){.
2b250 20 20 20 20 75 36 34 20 63 6b 73 75 6d 33 20 3d      u64 cksum3 =
2b260 20 2a 70 43 6b 73 75 6d 3b 0a 20 20 20 20 63 6f   *pCksum;.    co
2b270 6e 73 74 20 63 68 61 72 20 2a 7a 54 65 72 6d 20  nst char *zTerm 
2b280 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 26  = (const char*)&
2b290 70 50 72 65 76 2d 3e 70 5b 31 5d 3b 20 20 2f 2a  pPrev->p[1];  /*
2b2a0 20 74 65 72 6d 20 73 61 6e 73 20 70 72 65 66 69   term sans prefi
2b2b0 78 2d 62 79 74 65 20 2a 2f 0a 20 20 20 20 69 6e  x-byte */.    in
2b2c0 74 20 6e 54 65 72 6d 20 3d 20 70 50 72 65 76 2d  t nTerm = pPrev-
2b2d0 3e 6e 2d 31 3b 20 20 20 20 20 20 20 20 20 20 20  >n-1;           
2b2e0 20 2f 2a 20 53 69 7a 65 20 6f 66 20 7a 54 65 72   /* Size of zTer
2b2f0 6d 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20  m in bytes */.  
2b300 20 20 69 6e 74 20 69 49 64 78 20 3d 20 28 70 50    int iIdx = (pP
2b310 72 65 76 2d 3e 70 5b 30 5d 20 2d 20 46 54 53 35  rev->p[0] - FTS5
2b320 5f 4d 41 49 4e 5f 50 52 45 46 49 58 29 3b 0a 20  _MAIN_PREFIX);. 
2b330 20 20 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 28     int flags = (
2b340 69 49 64 78 3d 3d 30 20 3f 20 30 20 3a 20 46 54  iIdx==0 ? 0 : FT
2b350 53 35 49 4e 44 45 58 5f 51 55 45 52 59 5f 50 52  S5INDEX_QUERY_PR
2b360 45 46 49 58 29 3b 0a 20 20 20 20 75 36 34 20 63  EFIX);.    u64 c
2b370 6b 31 20 3d 20 30 3b 0a 20 20 20 20 75 36 34 20  k1 = 0;.    u64 
2b380 63 6b 32 20 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a  ck2 = 0;..    /*
2b390 20 43 68 65 63 6b 20 74 68 61 74 20 74 68 65 20   Check that the 
2b3a0 72 65 73 75 6c 74 73 20 72 65 74 75 72 6e 65 64  results returned
2b3b0 20 66 6f 72 20 41 53 43 20 61 6e 64 20 44 45 53   for ASC and DES
2b3c0 43 20 71 75 65 72 69 65 73 20 61 72 65 0a 20 20  C queries are.  
2b3d0 20 20 2a 2a 20 74 68 65 20 73 61 6d 65 2e 20 49    ** the same. I
2b3e0 66 20 6e 6f 74 2c 20 63 61 6c 6c 20 74 68 69 73  f not, call this
2b3f0 20 63 6f 72 72 75 70 74 69 6f 6e 2e 20 20 2a 2f   corruption.  */
2b400 0a 20 20 20 20 72 63 20 3d 20 66 74 73 35 51 75  .    rc = fts5Qu
2b410 65 72 79 43 6b 73 75 6d 28 70 2c 20 69 49 64 78  eryCksum(p, iIdx
2b420 2c 20 7a 54 65 72 6d 2c 20 6e 54 65 72 6d 2c 20  , zTerm, nTerm, 
2b430 66 6c 61 67 73 2c 20 26 63 6b 31 29 3b 0a 20 20  flags, &ck1);.  
2b440 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
2b450 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  _OK ){.      int
2b460 20 66 20 3d 20 66 6c 61 67 73 7c 46 54 53 35 49   f = flags|FTS5I
2b470 4e 44 45 58 5f 51 55 45 52 59 5f 44 45 53 43 3b  NDEX_QUERY_DESC;
2b480 0a 20 20 20 20 20 20 72 63 20 3d 20 66 74 73 35  .      rc = fts5
2b490 51 75 65 72 79 43 6b 73 75 6d 28 70 2c 20 69 49  QueryCksum(p, iI
2b4a0 64 78 2c 20 7a 54 65 72 6d 2c 20 6e 54 65 72 6d  dx, zTerm, nTerm
2b4b0 2c 20 66 2c 20 26 63 6b 32 29 3b 0a 20 20 20 20  , f, &ck2);.    
2b4c0 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  }.    if( rc==SQ
2b4d0 4c 49 54 45 5f 4f 4b 20 26 26 20 63 6b 31 21 3d  LITE_OK && ck1!=
2b4e0 63 6b 32 20 29 20 72 63 20 3d 20 46 54 53 35 5f  ck2 ) rc = FTS5_
2b4f0 43 4f 52 52 55 50 54 3b 0a 0a 20 20 20 20 2f 2a  CORRUPT;..    /*
2b500 20 49 66 20 74 68 69 73 20 69 73 20 61 20 70 72   If this is a pr
2b510 65 66 69 78 20 71 75 65 72 79 2c 20 63 68 65 63  efix query, chec
2b520 6b 20 74 68 61 74 20 74 68 65 20 72 65 73 75 6c  k that the resul
2b530 74 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 74  ts returned if t
2b540 68 65 0a 20 20 20 20 2a 2a 20 74 68 65 20 69 6e  he.    ** the in
2b550 64 65 78 20 69 73 20 64 69 73 61 62 6c 65 64 20  dex is disabled 
2b560 61 72 65 20 74 68 65 20 73 61 6d 65 2e 20 49 6e  are the same. In
2b570 20 62 6f 74 68 20 41 53 43 20 61 6e 64 20 44 45   both ASC and DE
2b580 53 43 20 6f 72 64 65 72 2e 20 0a 20 20 20 20 2a  SC order. .    *
2b590 2a 0a 20 20 20 20 2a 2a 20 54 68 69 73 20 63 68  *.    ** This ch
2b5a0 65 63 6b 20 6d 61 79 20 6f 6e 6c 79 20 62 65 20  eck may only be 
2b5b0 70 65 72 66 6f 72 6d 65 64 20 69 66 20 74 68 65  performed if the
2b5c0 20 68 61 73 68 20 74 61 62 6c 65 20 69 73 20 65   hash table is e
2b5d0 6d 70 74 79 2e 20 54 68 69 73 0a 20 20 20 20 2a  mpty. This.    *
2b5e0 2a 20 69 73 20 62 65 63 61 75 73 65 20 74 68 65  * is because the
2b5f0 20 68 61 73 68 20 74 61 62 6c 65 20 6f 6e 6c 79   hash table only
2b600 20 73 75 70 70 6f 72 74 73 20 61 20 73 69 6e 67   supports a sing
2b610 6c 65 20 73 63 61 6e 20 71 75 65 72 79 20 61 74  le scan query at
2b620 0a 20 20 20 20 2a 2a 20 61 20 74 69 6d 65 2c 20  .    ** a time, 
2b630 61 6e 64 20 74 68 65 20 6d 75 6c 74 69 2d 69 74  and the multi-it
2b640 65 72 20 6c 6f 6f 70 20 66 72 6f 6d 20 77 68 69  er loop from whi
2b650 63 68 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  ch this function
2b660 20 69 73 20 63 61 6c 6c 65 64 0a 20 20 20 20 2a   is called.    *
2b670 2a 20 69 73 20 61 6c 72 65 61 64 79 20 70 65 72  * is already per
2b680 66 6f 72 6d 69 6e 67 20 73 75 63 68 20 61 20 73  forming such a s
2b690 63 61 6e 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20  can. */.    if( 
2b6a0 70 2d 3e 6e 50 65 6e 64 69 6e 67 44 61 74 61 3d  p->nPendingData=
2b6b0 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  =0 ){.      if( 
2b6c0 69 49 64 78 3e 30 20 26 26 20 72 63 3d 3d 53 51  iIdx>0 && rc==SQ
2b6d0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
2b6e0 20 20 20 69 6e 74 20 66 20 3d 20 66 6c 61 67 73     int f = flags
2b6f0 7c 46 54 53 35 49 4e 44 45 58 5f 51 55 45 52 59  |FTS5INDEX_QUERY
2b700 5f 54 45 53 54 5f 4e 4f 49 44 58 3b 0a 20 20 20  _TEST_NOIDX;.   
2b710 20 20 20 20 20 63 6b 32 20 3d 20 30 3b 0a 20 20       ck2 = 0;.  
2b720 20 20 20 20 20 20 72 63 20 3d 20 66 74 73 35 51        rc = fts5Q
2b730 75 65 72 79 43 6b 73 75 6d 28 70 2c 20 69 49 64  ueryCksum(p, iId
2b740 78 2c 20 7a 54 65 72 6d 2c 20 6e 54 65 72 6d 2c  x, zTerm, nTerm,
2b750 20 66 2c 20 26 63 6b 32 29 3b 0a 20 20 20 20 20   f, &ck2);.     
2b760 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
2b770 45 5f 4f 4b 20 26 26 20 63 6b 31 21 3d 63 6b 32  E_OK && ck1!=ck2
2b780 20 29 20 72 63 20 3d 20 46 54 53 35 5f 43 4f 52   ) rc = FTS5_COR
2b790 52 55 50 54 3b 0a 20 20 20 20 20 20 7d 0a 20 20  RUPT;.      }.  
2b7a0 20 20 20 20 69 66 28 20 69 49 64 78 3e 30 20 26      if( iIdx>0 &
2b7b0 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  & rc==SQLITE_OK 
2b7c0 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 66  ){.        int f
2b7d0 20 3d 20 66 6c 61 67 73 7c 46 54 53 35 49 4e 44   = flags|FTS5IND
2b7e0 45 58 5f 51 55 45 52 59 5f 54 45 53 54 5f 4e 4f  EX_QUERY_TEST_NO
2b7f0 49 44 58 7c 46 54 53 35 49 4e 44 45 58 5f 51 55  IDX|FTS5INDEX_QU
2b800 45 52 59 5f 44 45 53 43 3b 0a 20 20 20 20 20 20  ERY_DESC;.      
2b810 20 20 63 6b 32 20 3d 20 30 3b 0a 20 20 20 20 20    ck2 = 0;.     
2b820 20 20 20 72 63 20 3d 20 66 74 73 35 51 75 65 72     rc = fts5Quer
2b830 79 43 6b 73 75 6d 28 70 2c 20 69 49 64 78 2c 20  yCksum(p, iIdx, 
2b840 7a 54 65 72 6d 2c 20 6e 54 65 72 6d 2c 20 66 2c  zTerm, nTerm, f,
2b850 20 26 63 6b 32 29 3b 0a 20 20 20 20 20 20 20 20   &ck2);.        
2b860 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
2b870 4b 20 26 26 20 63 6b 31 21 3d 63 6b 32 20 29 20  K && ck1!=ck2 ) 
2b880 72 63 20 3d 20 46 54 53 35 5f 43 4f 52 52 55 50  rc = FTS5_CORRUP
2b890 54 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  T;.      }.    }
2b8a0 0a 0a 20 20 20 20 63 6b 73 75 6d 33 20 5e 3d 20  ..    cksum3 ^= 
2b8b0 63 6b 31 3b 0a 20 20 20 20 66 74 73 35 42 75 66  ck1;.    fts5Buf
2b8c0 66 65 72 53 65 74 28 26 72 63 2c 20 70 50 72 65  ferSet(&rc, pPre
2b8d0 76 2c 20 6e 2c 20 28 63 6f 6e 73 74 20 75 38 2a  v, n, (const u8*
2b8e0 29 7a 29 3b 0a 0a 20 20 20 20 69 66 28 20 72 63  )z);..    if( rc
2b8f0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 63  ==SQLITE_OK && c
2b900 6b 73 75 6d 33 21 3d 65 78 70 65 63 74 65 64 20  ksum3!=expected 
2b910 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 46 54  ){.      rc = FT
2b920 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20 20  S5_CORRUPT;.    
2b930 7d 0a 20 20 20 20 2a 70 43 6b 73 75 6d 20 3d 20  }.    *pCksum = 
2b940 63 6b 73 75 6d 33 3b 0a 20 20 7d 0a 20 20 70 2d  cksum3;.  }.  p-
2b950 3e 72 63 20 3d 20 72 63 3b 0a 7d 0a 20 0a 23 65  >rc = rc;.}. .#e
2b960 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 66 74 73  lse.# define fts
2b970 35 54 65 73 74 44 6c 69 64 78 52 65 76 65 72 73  5TestDlidxRevers
2b980 65 28 78 2c 79 2c 7a 29 0a 23 20 64 65 66 69 6e  e(x,y,z).# defin
2b990 65 20 66 74 73 35 54 65 73 74 54 65 72 6d 28 75  e fts5TestTerm(u
2b9a0 2c 76 2c 77 2c 78 2c 79 2c 7a 29 0a 23 65 6e 64  ,v,w,x,y,z).#end
2b9b0 69 66 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20  if../*.** Check 
2b9c0 74 68 61 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 31 29  that:.**.**   1)
2b9d0 20 41 6c 6c 20 6c 65 61 76 65 73 20 6f 66 20 70   All leaves of p
2b9e0 53 65 67 20 62 65 74 77 65 65 6e 20 69 46 69 72  Seg between iFir
2b9f0 73 74 20 61 6e 64 20 69 4c 61 73 74 20 28 69 6e  st and iLast (in
2ba00 63 6c 75 73 69 76 65 29 20 65 78 69 73 74 20 61  clusive) exist a
2ba10 6e 64 0a 2a 2a 20 20 20 20 20 20 63 6f 6e 74 61  nd.**      conta
2ba20 69 6e 20 7a 65 72 6f 20 74 65 72 6d 73 2e 0a 2a  in zero terms..*
2ba30 2a 20 20 20 32 29 20 41 6c 6c 20 6c 65 61 76 65  *   2) All leave
2ba40 73 20 6f 66 20 70 53 65 67 20 62 65 74 77 65 65  s of pSeg betwee
2ba50 6e 20 69 4e 6f 52 6f 77 69 64 20 61 6e 64 20 69  n iNoRowid and i
2ba60 4c 61 73 74 20 28 69 6e 63 6c 75 73 69 76 65 29  Last (inclusive)
2ba70 20 65 78 69 73 74 20 61 6e 64 0a 2a 2a 20 20 20   exist and.**   
2ba80 20 20 20 63 6f 6e 74 61 69 6e 20 7a 65 72 6f 20     contain zero 
2ba90 72 6f 77 69 64 73 2e 0a 2a 2f 0a 73 74 61 74 69  rowids..*/.stati
2baa0 63 20 76 6f 69 64 20 66 74 73 35 49 6e 64 65 78  c void fts5Index
2bab0 49 6e 74 65 67 72 69 74 79 43 68 65 63 6b 45 6d  IntegrityCheckEm
2bac0 70 74 79 28 0a 20 20 46 74 73 35 49 6e 64 65 78  pty(.  Fts5Index
2bad0 20 2a 70 2c 0a 20 20 46 74 73 35 53 74 72 75 63   *p,.  Fts5Struc
2bae0 74 75 72 65 53 65 67 6d 65 6e 74 20 2a 70 53 65  tureSegment *pSe
2baf0 67 2c 20 20 20 20 20 2f 2a 20 53 65 67 6d 65 6e  g,     /* Segmen
2bb00 74 20 74 6f 20 63 68 65 63 6b 20 69 6e 74 65 72  t to check inter
2bb10 6e 61 6c 20 63 6f 6e 73 69 73 74 65 6e 63 79 20  nal consistency 
2bb20 2a 2f 0a 20 20 69 6e 74 20 69 46 69 72 73 74 2c  */.  int iFirst,
2bb30 0a 20 20 69 6e 74 20 69 4e 6f 52 6f 77 69 64 2c  .  int iNoRowid,
2bb40 0a 20 20 69 6e 74 20 69 4c 61 73 74 0a 29 7b 0a  .  int iLast.){.
2bb50 20 20 69 6e 74 20 69 3b 0a 0a 20 20 2f 2a 20 4e    int i;..  /* N
2bb60 6f 77 20 63 68 65 63 6b 20 74 68 61 74 20 74 68  ow check that th
2bb70 65 20 69 74 65 72 2e 6e 45 6d 70 74 79 20 6c 65  e iter.nEmpty le
2bb80 61 76 65 73 20 66 6f 6c 6c 6f 77 69 6e 67 20 74  aves following t
2bb90 68 65 20 63 75 72 72 65 6e 74 20 6c 65 61 66 0a  he current leaf.
2bba0 20 20 2a 2a 20 28 61 29 20 65 78 69 73 74 20 61    ** (a) exist a
2bbb0 6e 64 20 28 62 29 20 63 6f 6e 74 61 69 6e 20 6e  nd (b) contain n
2bbc0 6f 20 74 65 72 6d 73 2e 20 2a 2f 0a 20 20 66 6f  o terms. */.  fo
2bbd0 72 28 69 3d 69 46 69 72 73 74 3b 20 70 2d 3e 72  r(i=iFirst; p->r
2bbe0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
2bbf0 69 3c 3d 69 4c 61 73 74 3b 20 69 2b 2b 29 7b 0a  i<=iLast; i++){.
2bc00 20 20 20 20 46 74 73 35 44 61 74 61 20 2a 70 4c      Fts5Data *pL
2bc10 65 61 66 20 3d 20 66 74 73 35 44 61 74 61 52 65  eaf = fts5DataRe
2bc20 61 64 28 70 2c 20 46 54 53 35 5f 53 45 47 4d 45  ad(p, FTS5_SEGME
2bc30 4e 54 5f 52 4f 57 49 44 28 70 53 65 67 2d 3e 69  NT_ROWID(pSeg->i
2bc40 53 65 67 69 64 2c 20 69 29 29 3b 0a 20 20 20 20  Segid, i));.    
2bc50 69 66 28 20 70 4c 65 61 66 20 29 7b 0a 20 20 20  if( pLeaf ){.   
2bc60 20 20 20 69 66 28 20 21 66 74 73 35 4c 65 61 66     if( !fts5Leaf
2bc70 49 73 54 65 72 6d 6c 65 73 73 28 70 4c 65 61 66  IsTermless(pLeaf
2bc80 29 20 29 20 70 2d 3e 72 63 20 3d 20 46 54 53 35  ) ) p->rc = FTS5
2bc90 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20 20 20 20  _CORRUPT;.      
2bca0 69 66 28 20 69 3e 3d 69 4e 6f 52 6f 77 69 64 20  if( i>=iNoRowid 
2bcb0 26 26 20 30 21 3d 66 74 73 35 4c 65 61 66 46 69  && 0!=fts5LeafFi
2bcc0 72 73 74 52 6f 77 69 64 4f 66 66 28 70 4c 65 61  rstRowidOff(pLea
2bcd0 66 29 20 29 20 70 2d 3e 72 63 20 3d 20 46 54 53  f) ) p->rc = FTS
2bce0 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20 20 7d  5_CORRUPT;.    }
2bcf0 0a 20 20 20 20 66 74 73 35 44 61 74 61 52 65 6c  .    fts5DataRel
2bd00 65 61 73 65 28 70 4c 65 61 66 29 3b 0a 20 20 7d  ease(pLeaf);.  }
2bd10 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .}..static void 
2bd20 66 74 73 35 49 6e 74 65 67 72 69 74 79 43 68 65  fts5IntegrityChe
2bd30 63 6b 50 67 69 64 78 28 46 74 73 35 49 6e 64 65  ckPgidx(Fts5Inde
2bd40 78 20 2a 70 2c 20 46 74 73 35 44 61 74 61 20 2a  x *p, Fts5Data *
2bd50 70 4c 65 61 66 29 7b 0a 20 20 69 6e 74 20 69 54  pLeaf){.  int iT
2bd60 65 72 6d 4f 66 66 20 3d 20 30 3b 0a 20 20 69 6e  ermOff = 0;.  in
2bd70 74 20 69 69 3b 0a 0a 20 20 46 74 73 35 42 75 66  t ii;..  Fts5Buf
2bd80 66 65 72 20 62 75 66 31 20 3d 20 7b 30 2c 30 2c  fer buf1 = {0,0,
2bd90 30 7d 3b 0a 20 20 46 74 73 35 42 75 66 66 65 72  0};.  Fts5Buffer
2bda0 20 62 75 66 32 20 3d 20 7b 30 2c 30 2c 30 7d 3b   buf2 = {0,0,0};
2bdb0 0a 0a 20 20 69 69 20 3d 20 70 4c 65 61 66 2d 3e  ..  ii = pLeaf->
2bdc0 73 7a 4c 65 61 66 3b 0a 20 20 77 68 69 6c 65 28  szLeaf;.  while(
2bdd0 20 69 69 3c 70 4c 65 61 66 2d 3e 6e 6e 20 26 26   ii<pLeaf->nn &&
2bde0 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
2bdf0 4b 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 65 73  K ){.    int res
2be00 3b 0a 20 20 20 20 69 6e 74 20 69 4f 66 66 3b 0a  ;.    int iOff;.
2be10 20 20 20 20 69 6e 74 20 6e 49 6e 63 72 3b 0a 0a      int nIncr;..
2be20 20 20 20 20 69 69 20 2b 3d 20 66 74 73 35 47 65      ii += fts5Ge
2be30 74 56 61 72 69 6e 74 33 32 28 26 70 4c 65 61 66  tVarint32(&pLeaf
2be40 2d 3e 70 5b 69 69 5d 2c 20 6e 49 6e 63 72 29 3b  ->p[ii], nIncr);
2be50 0a 20 20 20 20 69 54 65 72 6d 4f 66 66 20 2b 3d  .    iTermOff +=
2be60 20 6e 49 6e 63 72 3b 0a 20 20 20 20 69 4f 66 66   nIncr;.    iOff
2be70 20 3d 20 69 54 65 72 6d 4f 66 66 3b 0a 0a 20 20   = iTermOff;..  
2be80 20 20 69 66 28 20 69 4f 66 66 3e 3d 70 4c 65 61    if( iOff>=pLea
2be90 66 2d 3e 73 7a 4c 65 61 66 20 29 7b 0a 20 20 20  f->szLeaf ){.   
2bea0 20 20 20 70 2d 3e 72 63 20 3d 20 46 54 53 35 5f     p->rc = FTS5_
2beb0 43 4f 52 52 55 50 54 3b 0a 20 20 20 20 7d 65 6c  CORRUPT;.    }el
2bec0 73 65 20 69 66 28 20 69 54 65 72 6d 4f 66 66 3d  se if( iTermOff=
2bed0 3d 6e 49 6e 63 72 20 29 7b 0a 20 20 20 20 20 20  =nIncr ){.      
2bee0 69 6e 74 20 6e 42 79 74 65 3b 0a 20 20 20 20 20  int nByte;.     
2bef0 20 69 4f 66 66 20 2b 3d 20 66 74 73 35 47 65 74   iOff += fts5Get
2bf00 56 61 72 69 6e 74 33 32 28 26 70 4c 65 61 66 2d  Varint32(&pLeaf-
2bf10 3e 70 5b 69 4f 66 66 5d 2c 20 6e 42 79 74 65 29  >p[iOff], nByte)
2bf20 3b 0a 20 20 20 20 20 20 69 66 28 20 28 69 4f 66  ;.      if( (iOf
2bf30 66 2b 6e 42 79 74 65 29 3e 70 4c 65 61 66 2d 3e  f+nByte)>pLeaf->
2bf40 73 7a 4c 65 61 66 20 29 7b 0a 20 20 20 20 20 20  szLeaf ){.      
2bf50 20 20 70 2d 3e 72 63 20 3d 20 46 54 53 35 5f 43    p->rc = FTS5_C
2bf60 4f 52 52 55 50 54 3b 0a 20 20 20 20 20 20 7d 65  ORRUPT;.      }e
2bf70 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 66 74 73  lse{.        fts
2bf80 35 42 75 66 66 65 72 53 65 74 28 26 70 2d 3e 72  5BufferSet(&p->r
2bf90 63 2c 20 26 62 75 66 31 2c 20 6e 42 79 74 65 2c  c, &buf1, nByte,
2bfa0 20 26 70 4c 65 61 66 2d 3e 70 5b 69 4f 66 66 5d   &pLeaf->p[iOff]
2bfb0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
2bfc0 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20  else{.      int 
2bfd0 6e 4b 65 65 70 2c 20 6e 42 79 74 65 3b 0a 20 20  nKeep, nByte;.  
2bfe0 20 20 20 20 69 4f 66 66 20 2b 3d 20 66 74 73 35      iOff += fts5
2bff0 47 65 74 56 61 72 69 6e 74 33 32 28 26 70 4c 65  GetVarint32(&pLe
2c000 61 66 2d 3e 70 5b 69 4f 66 66 5d 2c 20 6e 4b 65  af->p[iOff], nKe
2c010 65 70 29 3b 0a 20 20 20 20 20 20 69 4f 66 66 20  ep);.      iOff 
2c020 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e 74  += fts5GetVarint
2c030 33 32 28 26 70 4c 65 61 66 2d 3e 70 5b 69 4f 66  32(&pLeaf->p[iOf
2c040 66 5d 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20 20  f], nByte);.    
2c050 20 20 69 66 28 20 6e 4b 65 65 70 3e 62 75 66 31    if( nKeep>buf1
2c060 2e 6e 20 7c 7c 20 28 69 4f 66 66 2b 6e 42 79 74  .n || (iOff+nByt
2c070 65 29 3e 70 4c 65 61 66 2d 3e 73 7a 4c 65 61 66  e)>pLeaf->szLeaf
2c080 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 72   ){.        p->r
2c090 63 20 3d 20 46 54 53 35 5f 43 4f 52 52 55 50 54  c = FTS5_CORRUPT
2c0a0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
2c0b0 20 20 20 20 20 20 20 62 75 66 31 2e 6e 20 3d 20         buf1.n = 
2c0c0 6e 4b 65 65 70 3b 0a 20 20 20 20 20 20 20 20 66  nKeep;.        f
2c0d0 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 42  ts5BufferAppendB
2c0e0 6c 6f 62 28 26 70 2d 3e 72 63 2c 20 26 62 75 66  lob(&p->rc, &buf
2c0f0 31 2c 20 6e 42 79 74 65 2c 20 26 70 4c 65 61 66  1, nByte, &pLeaf
2c100 2d 3e 70 5b 69 4f 66 66 5d 29 3b 0a 20 20 20 20  ->p[iOff]);.    
2c110 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 70    }..      if( p
2c120 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
2c130 29 7b 0a 20 20 20 20 20 20 20 20 72 65 73 20 3d  ){.        res =
2c140 20 66 74 73 35 42 75 66 66 65 72 43 6f 6d 70 61   fts5BufferCompa
2c150 72 65 28 26 62 75 66 31 2c 20 26 62 75 66 32 29  re(&buf1, &buf2)
2c160 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 65  ;.        if( re
2c170 73 3c 3d 30 20 29 20 70 2d 3e 72 63 20 3d 20 46  s<=0 ) p->rc = F
2c180 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20  TS5_CORRUPT;.   
2c190 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 66     }.    }.    f
2c1a0 74 73 35 42 75 66 66 65 72 53 65 74 28 26 70 2d  ts5BufferSet(&p-
2c1b0 3e 72 63 2c 20 26 62 75 66 32 2c 20 62 75 66 31  >rc, &buf2, buf1
2c1c0 2e 6e 2c 20 62 75 66 31 2e 70 29 3b 0a 20 20 7d  .n, buf1.p);.  }
2c1d0 0a 0a 20 20 66 74 73 35 42 75 66 66 65 72 46 72  ..  fts5BufferFr
2c1e0 65 65 28 26 62 75 66 31 29 3b 0a 20 20 66 74 73  ee(&buf1);.  fts
2c1f0 35 42 75 66 66 65 72 46 72 65 65 28 26 62 75 66  5BufferFree(&buf
2c200 32 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f  2);.}..static vo
2c210 69 64 20 66 74 73 35 49 6e 64 65 78 49 6e 74 65  id fts5IndexInte
2c220 67 72 69 74 79 43 68 65 63 6b 53 65 67 6d 65 6e  grityCheckSegmen
2c230 74 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a  t(.  Fts5Index *
2c240 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
2c250 20 20 20 20 20 2f 2a 20 46 54 53 35 20 62 61 63       /* FTS5 bac
2c260 6b 65 6e 64 20 6f 62 6a 65 63 74 20 2a 2f 0a 20  kend object */. 
2c270 20 46 74 73 35 53 74 72 75 63 74 75 72 65 53 65   Fts5StructureSe
2c280 67 6d 65 6e 74 20 2a 70 53 65 67 20 20 20 20 20  gment *pSeg     
2c290 20 2f 2a 20 53 65 67 6d 65 6e 74 20 74 6f 20 63   /* Segment to c
2c2a0 68 65 63 6b 20 69 6e 74 65 72 6e 61 6c 20 63 6f  heck internal co
2c2b0 6e 73 69 73 74 65 6e 63 79 20 2a 2f 0a 29 7b 0a  nsistency */.){.
2c2c0 20 20 46 74 73 35 43 6f 6e 66 69 67 20 2a 70 43    Fts5Config *pC
2c2d0 6f 6e 66 69 67 20 3d 20 70 2d 3e 70 43 6f 6e 66  onfig = p->pConf
2c2e0 69 67 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74  ig;.  sqlite3_st
2c2f0 6d 74 20 2a 70 53 74 6d 74 20 3d 20 30 3b 0a 20  mt *pStmt = 0;. 
2c300 20 69 6e 74 20 72 63 32 3b 0a 20 20 69 6e 74 20   int rc2;.  int 
2c310 69 49 64 78 50 72 65 76 4c 65 61 66 20 3d 20 70  iIdxPrevLeaf = p
2c320 53 65 67 2d 3e 70 67 6e 6f 46 69 72 73 74 2d 31  Seg->pgnoFirst-1
2c330 3b 0a 20 20 69 6e 74 20 69 44 6c 69 64 78 50 72  ;.  int iDlidxPr
2c340 65 76 4c 65 61 66 20 3d 20 70 53 65 67 2d 3e 70  evLeaf = pSeg->p
2c350 67 6e 6f 4c 61 73 74 3b 0a 0a 20 20 69 66 28 20  gnoLast;..  if( 
2c360 70 53 65 67 2d 3e 70 67 6e 6f 46 69 72 73 74 3d  pSeg->pgnoFirst=
2c370 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20  =0 ) return;..  
2c380 66 74 73 35 49 6e 64 65 78 50 72 65 70 61 72 65  fts5IndexPrepare
2c390 53 74 6d 74 28 70 2c 20 26 70 53 74 6d 74 2c 20  Stmt(p, &pStmt, 
2c3a0 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
2c3b0 0a 20 20 20 20 20 20 22 53 45 4c 45 43 54 20 73  .      "SELECT s
2c3c0 65 67 69 64 2c 20 74 65 72 6d 2c 20 28 70 67 6e  egid, term, (pgn
2c3d0 6f 3e 3e 31 29 2c 20 28 70 67 6e 6f 26 31 29 20  o>>1), (pgno&1) 
2c3e0 46 52 4f 4d 20 25 51 2e 27 25 71 5f 69 64 78 27  FROM %Q.'%q_idx'
2c3f0 20 57 48 45 52 45 20 73 65 67 69 64 3d 25 64 22   WHERE segid=%d"
2c400 2c 0a 20 20 20 20 20 20 70 43 6f 6e 66 69 67 2d  ,.      pConfig-
2c410 3e 7a 44 62 2c 20 70 43 6f 6e 66 69 67 2d 3e 7a  >zDb, pConfig->z
2c420 4e 61 6d 65 2c 20 70 53 65 67 2d 3e 69 53 65 67  Name, pSeg->iSeg
2c430 69 64 0a 20 20 29 29 3b 0a 0a 20 20 2f 2a 20 49  id.  ));..  /* I
2c440 74 65 72 61 74 65 20 74 68 72 6f 75 67 68 20 74  terate through t
2c450 68 65 20 62 2d 74 72 65 65 20 68 69 65 72 61 72  he b-tree hierar
2c460 63 68 79 2e 20 20 2a 2f 0a 20 20 77 68 69 6c 65  chy.  */.  while
2c470 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
2c480 4f 4b 20 26 26 20 53 51 4c 49 54 45 5f 52 4f 57  OK && SQLITE_ROW
2c490 3d 3d 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70  ==sqlite3_step(p
2c4a0 53 74 6d 74 29 20 29 7b 0a 20 20 20 20 69 36 34  Stmt) ){.    i64
2c4b0 20 69 52 6f 77 3b 20 20 20 20 20 20 20 20 20 20   iRow;          
2c4c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f             /* Ro
2c4d0 77 69 64 20 66 6f 72 20 74 68 69 73 20 6c 65 61  wid for this lea
2c4e0 66 20 2a 2f 0a 20 20 20 20 46 74 73 35 44 61 74  f */.    Fts5Dat
2c4f0 61 20 2a 70 4c 65 61 66 3b 20 20 20 20 20 20 20  a *pLeaf;       
2c500 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 20 66         /* Data f
2c510 6f 72 20 74 68 69 73 20 6c 65 61 66 20 2a 2f 0a  or this leaf */.
2c520 0a 20 20 20 20 69 6e 74 20 6e 49 64 78 54 65 72  .    int nIdxTer
2c530 6d 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  m = sqlite3_colu
2c540 6d 6e 5f 62 79 74 65 73 28 70 53 74 6d 74 2c 20  mn_bytes(pStmt, 
2c550 31 29 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68  1);.    const ch
2c560 61 72 20 2a 7a 49 64 78 54 65 72 6d 20 3d 20 28  ar *zIdxTerm = (
2c570 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69  const char*)sqli
2c580 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28  te3_column_text(
2c590 70 53 74 6d 74 2c 20 31 29 3b 0a 20 20 20 20 69  pStmt, 1);.    i
2c5a0 6e 74 20 69 49 64 78 4c 65 61 66 20 3d 20 73 71  nt iIdxLeaf = sq
2c5b0 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74  lite3_column_int
2c5c0 28 70 53 74 6d 74 2c 20 32 29 3b 0a 20 20 20 20  (pStmt, 2);.    
2c5d0 69 6e 74 20 62 49 64 78 44 6c 69 64 78 20 3d 20  int bIdxDlidx = 
2c5e0 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69  sqlite3_column_i
2c5f0 6e 74 28 70 53 74 6d 74 2c 20 33 29 3b 0a 0a 20  nt(pStmt, 3);.. 
2c600 20 20 20 2f 2a 20 49 66 20 74 68 65 20 6c 65 61     /* If the lea
2c610 66 20 69 6e 20 71 75 65 73 74 69 6f 6e 20 68 61  f in question ha
2c620 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 74  s already been t
2c630 72 69 6d 6d 65 64 20 66 72 6f 6d 20 74 68 65 20  rimmed from the 
2c640 73 65 67 6d 65 6e 74 2c 20 0a 20 20 20 20 2a 2a  segment, .    **
2c650 20 69 67 6e 6f 72 65 20 74 68 69 73 20 62 2d 74   ignore this b-t
2c660 72 65 65 20 65 6e 74 72 79 2e 20 4f 74 68 65 72  ree entry. Other
2c670 77 69 73 65 2c 20 6c 6f 61 64 20 69 74 20 69 6e  wise, load it in
2c680 74 6f 20 6d 65 6d 6f 72 79 2e 20 2a 2f 0a 20 20  to memory. */.  
2c690 20 20 69 66 28 20 69 49 64 78 4c 65 61 66 3c 70    if( iIdxLeaf<p
2c6a0 53 65 67 2d 3e 70 67 6e 6f 46 69 72 73 74 20 29  Seg->pgnoFirst )
2c6b0 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69   continue;.    i
2c6c0 52 6f 77 20 3d 20 46 54 53 35 5f 53 45 47 4d 45  Row = FTS5_SEGME
2c6d0 4e 54 5f 52 4f 57 49 44 28 70 53 65 67 2d 3e 69  NT_ROWID(pSeg->i
2c6e0 53 65 67 69 64 2c 20 69 49 64 78 4c 65 61 66 29  Segid, iIdxLeaf)
2c6f0 3b 0a 20 20 20 20 70 4c 65 61 66 20 3d 20 66 74  ;.    pLeaf = ft
2c700 73 35 4c 65 61 66 52 65 61 64 28 70 2c 20 69 52  s5LeafRead(p, iR
2c710 6f 77 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 65  ow);.    if( pLe
2c720 61 66 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 0a  af==0 ) break;..
2c730 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61      /* Check tha
2c740 74 20 74 68 65 20 6c 65 61 66 20 63 6f 6e 74 61  t the leaf conta
2c750 69 6e 73 20 61 74 20 6c 65 61 73 74 20 6f 6e 65  ins at least one
2c760 20 74 65 72 6d 2c 20 61 6e 64 20 74 68 61 74 20   term, and that 
2c770 69 74 20 69 73 20 65 71 75 61 6c 0a 20 20 20 20  it is equal.    
2c780 2a 2a 20 74 6f 20 6f 72 20 6c 61 72 67 65 72 20  ** to or larger 
2c790 74 68 61 6e 20 74 68 65 20 73 70 6c 69 74 2d 6b  than the split-k
2c7a0 65 79 20 69 6e 20 7a 49 64 78 54 65 72 6d 2e 20  ey in zIdxTerm. 
2c7b0 20 41 6c 73 6f 20 63 68 65 63 6b 20 74 68 61 74   Also check that
2c7c0 20 69 66 20 74 68 65 72 65 0a 20 20 20 20 2a 2a   if there.    **
2c7d0 20 69 73 20 61 6c 73 6f 20 61 20 72 6f 77 69 64   is also a rowid
2c7e0 20 70 6f 69 6e 74 65 72 20 77 69 74 68 69 6e 20   pointer within 
2c7f0 74 68 65 20 6c 65 61 66 20 70 61 67 65 20 68 65  the leaf page he
2c800 61 64 65 72 2c 20 69 74 20 70 6f 69 6e 74 73 20  ader, it points 
2c810 74 6f 20 61 0a 20 20 20 20 2a 2a 20 6c 6f 63 61  to a.    ** loca
2c820 74 69 6f 6e 20 62 65 66 6f 72 65 20 74 68 65 20  tion before the 
2c830 74 65 72 6d 2e 20 20 2a 2f 0a 20 20 20 20 69 66  term.  */.    if
2c840 28 20 70 4c 65 61 66 2d 3e 6e 6e 3c 3d 70 4c 65  ( pLeaf->nn<=pLe
2c850 61 66 2d 3e 73 7a 4c 65 61 66 20 29 7b 0a 20 20  af->szLeaf ){.  
2c860 20 20 20 20 70 2d 3e 72 63 20 3d 20 46 54 53 35      p->rc = FTS5
2c870 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20 20 7d 65  _CORRUPT;.    }e
2c880 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  lse{.      int i
2c890 4f 66 66 3b 20 20 20 20 20 20 20 20 20 20 20 20  Off;            
2c8a0 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74         /* Offset
2c8b0 20 6f 66 20 66 69 72 73 74 20 74 65 72 6d 20 6f   of first term o
2c8c0 6e 20 6c 65 61 66 20 2a 2f 0a 20 20 20 20 20 20  n leaf */.      
2c8d0 69 6e 74 20 69 52 6f 77 69 64 4f 66 66 3b 20 20  int iRowidOff;  
2c8e0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
2c8f0 66 66 73 65 74 20 6f 66 20 66 69 72 73 74 20 72  ffset of first r
2c900 6f 77 69 64 20 6f 6e 20 6c 65 61 66 20 2a 2f 0a  owid on leaf */.
2c910 20 20 20 20 20 20 69 6e 74 20 6e 54 65 72 6d 3b        int nTerm;
2c920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c930 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 65 72    /* Size of ter
2c940 6d 20 6f 6e 20 6c 65 61 66 20 69 6e 20 62 79 74  m on leaf in byt
2c950 65 73 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  es */.      int 
2c960 72 65 73 3b 20 20 20 20 20 20 20 20 20 20 20 20  res;            
2c970 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d 70 61          /* Compa
2c980 72 69 73 6f 6e 20 6f 66 20 74 65 72 6d 20 61 6e  rison of term an
2c990 64 20 73 70 6c 69 74 2d 6b 65 79 20 2a 2f 0a 0a  d split-key */..
2c9a0 20 20 20 20 20 20 69 4f 66 66 20 3d 20 66 74 73        iOff = fts
2c9b0 35 4c 65 61 66 46 69 72 73 74 54 65 72 6d 4f 66  5LeafFirstTermOf
2c9c0 66 28 70 4c 65 61 66 29 3b 0a 20 20 20 20 20 20  f(pLeaf);.      
2c9d0 69 52 6f 77 69 64 4f 66 66 20 3d 20 66 74 73 35  iRowidOff = fts5
2c9e0 4c 65 61 66 46 69 72 73 74 52 6f 77 69 64 4f 66  LeafFirstRowidOf
2c9f0 66 28 70 4c 65 61 66 29 3b 0a 20 20 20 20 20 20  f(pLeaf);.      
2ca00 69 66 28 20 69 52 6f 77 69 64 4f 66 66 3e 3d 69  if( iRowidOff>=i
2ca10 4f 66 66 20 29 7b 0a 20 20 20 20 20 20 20 20 70  Off ){.        p
2ca20 2d 3e 72 63 20 3d 20 46 54 53 35 5f 43 4f 52 52  ->rc = FTS5_CORR
2ca30 55 50 54 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  UPT;.      }else
2ca40 7b 0a 20 20 20 20 20 20 20 20 69 4f 66 66 20 2b  {.        iOff +
2ca50 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e 74 33  = fts5GetVarint3
2ca60 32 28 26 70 4c 65 61 66 2d 3e 70 5b 69 4f 66 66  2(&pLeaf->p[iOff
2ca70 5d 2c 20 6e 54 65 72 6d 29 3b 0a 20 20 20 20 20  ], nTerm);.     
2ca80 20 20 20 72 65 73 20 3d 20 6d 65 6d 63 6d 70 28     res = memcmp(
2ca90 26 70 4c 65 61 66 2d 3e 70 5b 69 4f 66 66 5d 2c  &pLeaf->p[iOff],
2caa0 20 7a 49 64 78 54 65 72 6d 2c 20 4d 49 4e 28 6e   zIdxTerm, MIN(n
2cab0 54 65 72 6d 2c 20 6e 49 64 78 54 65 72 6d 29 29  Term, nIdxTerm))
2cac0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 65  ;.        if( re
2cad0 73 3d 3d 30 20 29 20 72 65 73 20 3d 20 6e 54 65  s==0 ) res = nTe
2cae0 72 6d 20 2d 20 6e 49 64 78 54 65 72 6d 3b 0a 20  rm - nIdxTerm;. 
2caf0 20 20 20 20 20 20 20 69 66 28 20 72 65 73 3c 30         if( res<0
2cb00 20 29 20 70 2d 3e 72 63 20 3d 20 46 54 53 35 5f   ) p->rc = FTS5_
2cb10 43 4f 52 52 55 50 54 3b 0a 20 20 20 20 20 20 7d  CORRUPT;.      }
2cb20 0a 0a 20 20 20 20 20 20 66 74 73 35 49 6e 74 65  ..      fts5Inte
2cb30 67 72 69 74 79 43 68 65 63 6b 50 67 69 64 78 28  grityCheckPgidx(
2cb40 70 2c 20 70 4c 65 61 66 29 3b 0a 20 20 20 20 7d  p, pLeaf);.    }
2cb50 0a 20 20 20 20 66 74 73 35 44 61 74 61 52 65 6c  .    fts5DataRel
2cb60 65 61 73 65 28 70 4c 65 61 66 29 3b 0a 20 20 20  ease(pLeaf);.   
2cb70 20 69 66 28 20 70 2d 3e 72 63 20 29 20 62 72 65   if( p->rc ) bre
2cb80 61 6b 3b 0a 0a 20 20 20 20 2f 2a 20 4e 6f 77 20  ak;..    /* Now 
2cb90 63 68 65 63 6b 20 74 68 61 74 20 74 68 65 20 69  check that the i
2cba0 74 65 72 2e 6e 45 6d 70 74 79 20 6c 65 61 76 65  ter.nEmpty leave
2cbb0 73 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20  s following the 
2cbc0 63 75 72 72 65 6e 74 20 6c 65 61 66 0a 20 20 20  current leaf.   
2cbd0 20 2a 2a 20 28 61 29 20 65 78 69 73 74 20 61 6e   ** (a) exist an
2cbe0 64 20 28 62 29 20 63 6f 6e 74 61 69 6e 20 6e 6f  d (b) contain no
2cbf0 20 74 65 72 6d 73 2e 20 2a 2f 0a 20 20 20 20 66   terms. */.    f
2cc00 74 73 35 49 6e 64 65 78 49 6e 74 65 67 72 69 74  ts5IndexIntegrit
2cc10 79 43 68 65 63 6b 45 6d 70 74 79 28 0a 20 20 20  yCheckEmpty(.   
2cc20 20 20 20 20 20 70 2c 20 70 53 65 67 2c 20 69 49       p, pSeg, iI
2cc30 64 78 50 72 65 76 4c 65 61 66 2b 31 2c 20 69 44  dxPrevLeaf+1, iD
2cc40 6c 69 64 78 50 72 65 76 4c 65 61 66 2b 31 2c 20  lidxPrevLeaf+1, 
2cc50 69 49 64 78 4c 65 61 66 2d 31 0a 20 20 20 20 29  iIdxLeaf-1.    )
2cc60 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 72 63 20  ;.    if( p->rc 
2cc70 29 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 2f 2a  ) break;..    /*
2cc80 20 49 66 20 74 68 65 72 65 20 69 73 20 61 20 64   If there is a d
2cc90 6f 63 6c 69 73 74 2d 69 6e 64 65 78 2c 20 63 68  oclist-index, ch
2cca0 65 63 6b 20 74 68 61 74 20 69 74 20 6c 6f 6f 6b  eck that it look
2ccb0 73 20 72 69 67 68 74 2e 20 2a 2f 0a 20 20 20 20  s right. */.    
2ccc0 69 66 28 20 62 49 64 78 44 6c 69 64 78 20 29 7b  if( bIdxDlidx ){
2ccd0 0a 20 20 20 20 20 20 46 74 73 35 44 6c 69 64 78  .      Fts5Dlidx
2cce0 49 74 65 72 20 2a 70 44 6c 69 64 78 20 3d 20 30  Iter *pDlidx = 0
2ccf0 3b 20 20 2f 2a 20 46 6f 72 20 69 74 65 72 61 74  ;  /* For iterat
2cd00 69 6e 67 20 74 68 72 6f 75 67 68 20 64 6f 63 6c  ing through docl
2cd10 69 73 74 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20  ist index */.   
2cd20 20 20 20 69 6e 74 20 69 50 72 65 76 4c 65 61 66     int iPrevLeaf
2cd30 20 3d 20 69 49 64 78 4c 65 61 66 3b 0a 20 20 20   = iIdxLeaf;.   
2cd40 20 20 20 69 6e 74 20 69 53 65 67 69 64 20 3d 20     int iSegid = 
2cd50 70 53 65 67 2d 3e 69 53 65 67 69 64 3b 0a 20 20  pSeg->iSegid;.  
2cd60 20 20 20 20 69 6e 74 20 69 50 67 20 3d 20 30 3b      int iPg = 0;
2cd70 0a 20 20 20 20 20 20 69 36 34 20 69 4b 65 79 3b  .      i64 iKey;
2cd80 0a 0a 20 20 20 20 20 20 66 6f 72 28 70 44 6c 69  ..      for(pDli
2cd90 64 78 3d 66 74 73 35 44 6c 69 64 78 49 74 65 72  dx=fts5DlidxIter
2cda0 49 6e 69 74 28 70 2c 20 30 2c 20 69 53 65 67 69  Init(p, 0, iSegi
2cdb0 64 2c 20 69 49 64 78 4c 65 61 66 29 3b 0a 20 20  d, iIdxLeaf);.  
2cdc0 20 20 20 20 20 20 20 20 66 74 73 35 44 6c 69 64          fts5Dlid
2cdd0 78 49 74 65 72 45 6f 66 28 70 2c 20 70 44 6c 69  xIterEof(p, pDli
2cde0 64 78 29 3d 3d 30 3b 0a 20 20 20 20 20 20 20 20  dx)==0;.        
2cdf0 20 20 66 74 73 35 44 6c 69 64 78 49 74 65 72 4e    fts5DlidxIterN
2ce00 65 78 74 28 70 2c 20 70 44 6c 69 64 78 29 0a 20  ext(p, pDlidx). 
2ce10 20 20 20 20 20 29 7b 0a 0a 20 20 20 20 20 20 20       ){..       
2ce20 20 2f 2a 20 43 68 65 63 6b 20 61 6e 79 20 72 6f   /* Check any ro
2ce30 77 69 64 2d 6c 65 73 73 20 70 61 67 65 73 20 74  wid-less pages t
2ce40 68 61 74 20 6f 63 63 75 72 20 62 65 66 6f 72 65  hat occur before
2ce50 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c 65 61   the current lea
2ce60 66 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 66 6f  f. */.        fo
2ce70 72 28 69 50 67 3d 69 50 72 65 76 4c 65 61 66 2b  r(iPg=iPrevLeaf+
2ce80 31 3b 20 69 50 67 3c 66 74 73 35 44 6c 69 64 78  1; iPg<fts5Dlidx
2ce90 49 74 65 72 50 67 6e 6f 28 70 44 6c 69 64 78 29  IterPgno(pDlidx)
2cea0 3b 20 69 50 67 2b 2b 29 7b 0a 20 20 20 20 20 20  ; iPg++){.      
2ceb0 20 20 20 20 69 4b 65 79 20 3d 20 46 54 53 35 5f      iKey = FTS5_
2cec0 53 45 47 4d 45 4e 54 5f 52 4f 57 49 44 28 69 53  SEGMENT_ROWID(iS
2ced0 65 67 69 64 2c 20 69 50 67 29 3b 0a 20 20 20 20  egid, iPg);.    
2cee0 20 20 20 20 20 20 70 4c 65 61 66 20 3d 20 66 74        pLeaf = ft
2cef0 73 35 44 61 74 61 52 65 61 64 28 70 2c 20 69 4b  s5DataRead(p, iK
2cf00 65 79 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  ey);.          i
2cf10 66 28 20 70 4c 65 61 66 20 29 7b 0a 20 20 20 20  f( pLeaf ){.    
2cf20 20 20 20 20 20 20 20 20 69 66 28 20 66 74 73 35          if( fts5
2cf30 4c 65 61 66 46 69 72 73 74 52 6f 77 69 64 4f 66  LeafFirstRowidOf
2cf40 66 28 70 4c 65 61 66 29 21 3d 30 20 29 20 70 2d  f(pLeaf)!=0 ) p-
2cf50 3e 72 63 20 3d 20 46 54 53 35 5f 43 4f 52 52 55  >rc = FTS5_CORRU
2cf60 50 54 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  PT;.            
2cf70 66 74 73 35 44 61 74 61 52 65 6c 65 61 73 65 28  fts5DataRelease(
2cf80 70 4c 65 61 66 29 3b 0a 20 20 20 20 20 20 20 20  pLeaf);.        
2cf90 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
2cfa0 20 20 20 20 20 20 69 50 72 65 76 4c 65 61 66 20        iPrevLeaf 
2cfb0 3d 20 66 74 73 35 44 6c 69 64 78 49 74 65 72 50  = fts5DlidxIterP
2cfc0 67 6e 6f 28 70 44 6c 69 64 78 29 3b 0a 0a 20 20  gno(pDlidx);..  
2cfd0 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74        /* Check t
2cfe0 68 61 74 20 74 68 65 20 6c 65 61 66 20 70 61 67  hat the leaf pag
2cff0 65 20 69 6e 64 69 63 61 74 65 64 20 62 79 20 74  e indicated by t
2d000 68 65 20 69 74 65 72 61 74 6f 72 20 72 65 61 6c  he iterator real
2d010 6c 79 20 64 6f 65 73 0a 20 20 20 20 20 20 20 20  ly does.        
2d020 2a 2a 20 63 6f 6e 74 61 69 6e 20 74 68 65 20 72  ** contain the r
2d030 6f 77 69 64 20 73 75 67 67 65 73 74 65 64 20 62  owid suggested b
2d040 79 20 74 68 65 20 73 61 6d 65 2e 20 2a 2f 0a 20  y the same. */. 
2d050 20 20 20 20 20 20 20 69 4b 65 79 20 3d 20 46 54         iKey = FT
2d060 53 35 5f 53 45 47 4d 45 4e 54 5f 52 4f 57 49 44  S5_SEGMENT_ROWID
2d070 28 69 53 65 67 69 64 2c 20 69 50 72 65 76 4c 65  (iSegid, iPrevLe
2d080 61 66 29 3b 0a 20 20 20 20 20 20 20 20 70 4c 65  af);.        pLe
2d090 61 66 20 3d 20 66 74 73 35 44 61 74 61 52 65 61  af = fts5DataRea
2d0a0 64 28 70 2c 20 69 4b 65 79 29 3b 0a 20 20 20 20  d(p, iKey);.    
2d0b0 20 20 20 20 69 66 28 20 70 4c 65 61 66 20 29 7b      if( pLeaf ){
2d0c0 0a 20 20 20 20 20 20 20 20 20 20 69 36 34 20 69  .          i64 i
2d0d0 52 6f 77 69 64 3b 0a 20 20 20 20 20 20 20 20 20  Rowid;.         
2d0e0 20 69 6e 74 20 69 52 6f 77 69 64 4f 66 66 20 3d   int iRowidOff =
2d0f0 20 66 74 73 35 4c 65 61 66 46 69 72 73 74 52 6f   fts5LeafFirstRo
2d100 77 69 64 4f 66 66 28 70 4c 65 61 66 29 3b 0a 20  widOff(pLeaf);. 
2d110 20 20 20 20 20 20 20 20 20 41 53 53 45 52 54 5f           ASSERT_
2d120 53 5a 4c 45 41 46 5f 4f 4b 28 70 4c 65 61 66 29  SZLEAF_OK(pLeaf)
2d130 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
2d140 69 52 6f 77 69 64 4f 66 66 3e 3d 70 4c 65 61 66  iRowidOff>=pLeaf
2d150 2d 3e 73 7a 4c 65 61 66 20 29 7b 0a 20 20 20 20  ->szLeaf ){.    
2d160 20 20 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20          p->rc = 
2d170 46 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20  FTS5_CORRUPT;.  
2d180 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
2d190 20 20 20 20 20 20 20 20 20 20 20 66 74 73 35 47             fts5G
2d1a0 65 74 56 61 72 69 6e 74 28 26 70 4c 65 61 66 2d  etVarint(&pLeaf-
2d1b0 3e 70 5b 69 52 6f 77 69 64 4f 66 66 5d 2c 20 28  >p[iRowidOff], (
2d1c0 75 36 34 2a 29 26 69 52 6f 77 69 64 29 3b 0a 20  u64*)&iRowid);. 
2d1d0 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69             if( i
2d1e0 52 6f 77 69 64 21 3d 66 74 73 35 44 6c 69 64 78  Rowid!=fts5Dlidx
2d1f0 49 74 65 72 52 6f 77 69 64 28 70 44 6c 69 64 78  IterRowid(pDlidx
2d200 29 20 29 20 70 2d 3e 72 63 20 3d 20 46 54 53 35  ) ) p->rc = FTS5
2d210 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20 20 20 20  _CORRUPT;.      
2d220 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
2d230 66 74 73 35 44 61 74 61 52 65 6c 65 61 73 65 28  fts5DataRelease(
2d240 70 4c 65 61 66 29 3b 0a 20 20 20 20 20 20 20 20  pLeaf);.        
2d250 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  }.      }..     
2d260 20 69 44 6c 69 64 78 50 72 65 76 4c 65 61 66 20   iDlidxPrevLeaf 
2d270 3d 20 69 50 67 3b 0a 20 20 20 20 20 20 66 74 73  = iPg;.      fts
2d280 35 44 6c 69 64 78 49 74 65 72 46 72 65 65 28 70  5DlidxIterFree(p
2d290 44 6c 69 64 78 29 3b 0a 20 20 20 20 20 20 66 74  Dlidx);.      ft
2d2a0 73 35 54 65 73 74 44 6c 69 64 78 52 65 76 65 72  s5TestDlidxRever
2d2b0 73 65 28 70 2c 20 69 53 65 67 69 64 2c 20 69 49  se(p, iSegid, iI
2d2c0 64 78 4c 65 61 66 29 3b 0a 20 20 20 20 7d 65 6c  dxLeaf);.    }el
2d2d0 73 65 7b 0a 20 20 20 20 20 20 69 44 6c 69 64 78  se{.      iDlidx
2d2e0 50 72 65 76 4c 65 61 66 20 3d 20 70 53 65 67 2d  PrevLeaf = pSeg-
2d2f0 3e 70 67 6e 6f 4c 61 73 74 3b 0a 20 20 20 20 20  >pgnoLast;.     
2d300 20 2f 2a 20 54 4f 44 4f 3a 20 43 68 65 63 6b 20   /* TODO: Check 
2d310 74 68 65 72 65 20 69 73 20 6e 6f 20 64 6f 63 6c  there is no docl
2d320 69 73 74 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20  ist index */.   
2d330 20 7d 0a 0a 20 20 20 20 69 49 64 78 50 72 65 76   }..    iIdxPrev
2d340 4c 65 61 66 20 3d 20 69 49 64 78 4c 65 61 66 3b  Leaf = iIdxLeaf;
2d350 0a 20 20 7d 0a 0a 20 20 72 63 32 20 3d 20 73 71  .  }..  rc2 = sq
2d360 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70  lite3_finalize(p
2d370 53 74 6d 74 29 3b 0a 20 20 69 66 28 20 70 2d 3e  Stmt);.  if( p->
2d380 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc==SQLITE_OK ) 
2d390 70 2d 3e 72 63 20 3d 20 72 63 32 3b 0a 0a 20 20  p->rc = rc2;..  
2d3a0 2f 2a 20 50 61 67 65 20 69 74 65 72 2e 69 4c 65  /* Page iter.iLe
2d3b0 61 66 20 6d 75 73 74 20 6e 6f 77 20 62 65 20 74  af must now be t
2d3c0 68 65 20 72 69 67 68 74 6d 6f 73 74 20 6c 65 61  he rightmost lea
2d3d0 66 2d 70 61 67 65 20 69 6e 20 74 68 65 20 73 65  f-page in the se
2d3e0 67 6d 65 6e 74 20 2a 2f 0a 23 69 66 20 30 0a 20  gment */.#if 0. 
2d3f0 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49   if( p->rc==SQLI
2d400 54 45 5f 4f 4b 20 26 26 20 69 74 65 72 2e 69 4c  TE_OK && iter.iL
2d410 65 61 66 21 3d 70 53 65 67 2d 3e 70 67 6e 6f 4c  eaf!=pSeg->pgnoL
2d420 61 73 74 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63  ast ){.    p->rc
2d430 20 3d 20 46 54 53 35 5f 43 4f 52 52 55 50 54 3b   = FTS5_CORRUPT;
2d440 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 0a  .  }.#endif.}...
2d450 2f 2a 0a 2a 2a 20 52 75 6e 20 69 6e 74 65 72 6e  /*.** Run intern
2d460 61 6c 20 63 68 65 63 6b 73 20 74 6f 20 65 6e 73  al checks to ens
2d470 75 72 65 20 74 68 61 74 20 74 68 65 20 46 54 53  ure that the FTS
2d480 20 69 6e 64 65 78 20 28 61 29 20 69 73 20 69 6e   index (a) is in
2d490 74 65 72 6e 61 6c 6c 79 20 0a 2a 2a 20 63 6f 6e  ternally .** con
2d4a0 73 69 73 74 65 6e 74 20 61 6e 64 20 28 62 29 20  sistent and (b) 
2d4b0 63 6f 6e 74 61 69 6e 73 20 65 6e 74 72 69 65 73  contains entries
2d4c0 20 66 6f 72 20 77 68 69 63 68 20 74 68 65 20 58   for which the X
2d4d0 4f 52 20 6f 66 20 74 68 65 20 63 68 65 63 6b 73  OR of the checks
2d4e0 75 6d 73 0a 2a 2a 20 61 73 20 63 61 6c 63 75 6c  ums.** as calcul
2d4f0 61 74 65 64 20 62 79 20 73 71 6c 69 74 65 33 46  ated by sqlite3F
2d500 74 73 35 49 6e 64 65 78 45 6e 74 72 79 43 6b 73  ts5IndexEntryCks
2d510 75 6d 28 29 20 69 73 20 63 6b 73 75 6d 2e 0a 2a  um() is cksum..*
2d520 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49  *.** Return SQLI
2d530 54 45 5f 43 4f 52 52 55 50 54 20 69 66 20 61 6e  TE_CORRUPT if an
2d540 79 20 6f 66 20 74 68 65 20 69 6e 74 65 72 6e 61  y of the interna
2d550 6c 20 63 68 65 63 6b 73 20 66 61 69 6c 2c 20 6f  l checks fail, o
2d560 72 20 69 66 20 74 68 65 0a 2a 2a 20 63 68 65 63  r if the.** chec
2d570 6b 73 75 6d 20 64 6f 65 73 20 6e 6f 74 20 6d 61  ksum does not ma
2d580 74 63 68 2e 20 52 65 74 75 72 6e 20 53 51 4c 49  tch. Return SQLI
2d590 54 45 5f 4f 4b 20 69 66 20 61 6c 6c 20 63 68 65  TE_OK if all che
2d5a0 63 6b 73 20 70 61 73 73 20 77 69 74 68 6f 75 74  cks pass without
2d5b0 0a 2a 2a 20 65 72 72 6f 72 2c 20 6f 72 20 73 6f  .** error, or so
2d5c0 6d 65 20 6f 74 68 65 72 20 53 51 4c 69 74 65 20  me other SQLite 
2d5d0 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20 61 6e  error code if an
2d5e0 6f 74 68 65 72 20 65 72 72 6f 72 20 28 65 2e 67  other error (e.g
2d5f0 2e 20 4f 4f 4d 29 0a 2a 2a 20 6f 63 63 75 72 73  . OOM).** occurs
2d600 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
2d610 46 74 73 35 49 6e 64 65 78 49 6e 74 65 67 72 69  Fts5IndexIntegri
2d620 74 79 43 68 65 63 6b 28 46 74 73 35 49 6e 64 65  tyCheck(Fts5Inde
2d630 78 20 2a 70 2c 20 75 36 34 20 63 6b 73 75 6d 29  x *p, u64 cksum)
2d640 7b 0a 20 20 69 6e 74 20 65 44 65 74 61 69 6c 20  {.  int eDetail 
2d650 3d 20 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e 65 44  = p->pConfig->eD
2d660 65 74 61 69 6c 3b 0a 20 20 75 36 34 20 63 6b 73  etail;.  u64 cks
2d670 75 6d 32 20 3d 20 30 3b 20 20 20 20 20 20 20 20  um2 = 0;        
2d680 20 20 20 20 20 20 20 20 20 2f 2a 20 43 68 65 63           /* Chec
2d690 6b 73 75 6d 20 62 61 73 65 64 20 6f 6e 20 63 6f  ksum based on co
2d6a0 6e 74 65 6e 74 73 20 6f 66 20 69 6e 64 65 78 65  ntents of indexe
2d6b0 73 20 2a 2f 0a 20 20 46 74 73 35 42 75 66 66 65  s */.  Fts5Buffe
2d6c0 72 20 70 6f 73 6c 69 73 74 20 3d 20 7b 30 2c 30  r poslist = {0,0
2d6d0 2c 30 7d 3b 20 20 20 2f 2a 20 42 75 66 66 65 72  ,0};   /* Buffer
2d6e0 20 75 73 65 64 20 74 6f 20 68 6f 6c 64 20 61 20   used to hold a 
2d6f0 70 6f 73 6c 69 73 74 20 2a 2f 0a 20 20 46 74 73  poslist */.  Fts
2d700 35 49 74 65 72 20 2a 70 49 74 65 72 3b 20 20 20  5Iter *pIter;   
2d710 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2d720 55 73 65 64 20 74 6f 20 69 74 65 72 61 74 65 20  Used to iterate 
2d730 74 68 72 6f 75 67 68 20 65 6e 74 69 72 65 20 69  through entire i
2d740 6e 64 65 78 20 2a 2f 0a 20 20 46 74 73 35 53 74  ndex */.  Fts5St
2d750 72 75 63 74 75 72 65 20 2a 70 53 74 72 75 63 74  ructure *pStruct
2d760 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64  ;         /* Ind
2d770 65 78 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a  ex structure */.
2d780 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
2d790 45 42 55 47 0a 20 20 2f 2a 20 55 73 65 64 20 62  EBUG.  /* Used b
2d7a0 79 20 65 78 74 72 61 20 69 6e 74 65 72 6e 61 6c  y extra internal
2d7b0 20 74 65 73 74 73 20 6f 6e 6c 79 20 72 75 6e 20   tests only run 
2d7c0 69 66 20 4e 44 45 42 55 47 20 69 73 20 6e 6f 74  if NDEBUG is not
2d7d0 20 64 65 66 69 6e 65 64 20 2a 2f 0a 20 20 75 36   defined */.  u6
2d7e0 34 20 63 6b 73 75 6d 33 20 3d 20 30 3b 20 20 20  4 cksum3 = 0;   
2d7f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2d800 20 43 68 65 63 6b 73 75 6d 20 62 61 73 65 64 20   Checksum based 
2d810 6f 6e 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 69  on contents of i
2d820 6e 64 65 78 65 73 20 2a 2f 0a 20 20 46 74 73 35  ndexes */.  Fts5
2d830 42 75 66 66 65 72 20 74 65 72 6d 20 3d 20 7b 30  Buffer term = {0
2d840 2c 30 2c 30 7d 3b 20 20 20 20 20 20 2f 2a 20 42  ,0,0};      /* B
2d850 75 66 66 65 72 20 75 73 65 64 20 74 6f 20 68 6f  uffer used to ho
2d860 6c 64 20 6d 6f 73 74 20 72 65 63 65 6e 74 20 74  ld most recent t
2d870 65 72 6d 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20  erm */.#endif.  
2d880 63 6f 6e 73 74 20 69 6e 74 20 66 6c 61 67 73 20  const int flags 
2d890 3d 20 46 54 53 35 49 4e 44 45 58 5f 51 55 45 52  = FTS5INDEX_QUER
2d8a0 59 5f 4e 4f 4f 55 54 50 55 54 3b 0a 20 20 0a 20  Y_NOOUTPUT;.  . 
2d8b0 20 2f 2a 20 4c 6f 61 64 20 74 68 65 20 46 54 53   /* Load the FTS
2d8c0 20 69 6e 64 65 78 20 73 74 72 75 63 74 75 72 65   index structure
2d8d0 20 2a 2f 0a 20 20 70 53 74 72 75 63 74 20 3d 20   */.  pStruct = 
2d8e0 66 74 73 35 53 74 72 75 63 74 75 72 65 52 65 61  fts5StructureRea
2d8f0 64 28 70 29 3b 0a 0a 20 20 2f 2a 20 43 68 65 63  d(p);..  /* Chec
2d900 6b 20 74 68 61 74 20 74 68 65 20 69 6e 74 65 72  k that the inter
2d910 6e 61 6c 20 6e 6f 64 65 73 20 6f 66 20 65 61 63  nal nodes of eac
2d920 68 20 73 65 67 6d 65 6e 74 20 6d 61 74 63 68 20  h segment match 
2d930 74 68 65 20 6c 65 61 76 65 73 20 2a 2f 0a 20 20  the leaves */.  
2d940 69 66 28 20 70 53 74 72 75 63 74 20 29 7b 0a 20  if( pStruct ){. 
2d950 20 20 20 69 6e 74 20 69 4c 76 6c 2c 20 69 53 65     int iLvl, iSe
2d960 67 3b 0a 20 20 20 20 66 6f 72 28 69 4c 76 6c 3d  g;.    for(iLvl=
2d970 30 3b 20 69 4c 76 6c 3c 70 53 74 72 75 63 74 2d  0; iLvl<pStruct-
2d980 3e 6e 4c 65 76 65 6c 3b 20 69 4c 76 6c 2b 2b 29  >nLevel; iLvl++)
2d990 7b 0a 20 20 20 20 20 20 66 6f 72 28 69 53 65 67  {.      for(iSeg
2d9a0 3d 30 3b 20 69 53 65 67 3c 70 53 74 72 75 63 74  =0; iSeg<pStruct
2d9b0 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d 2e 6e  ->aLevel[iLvl].n
2d9c0 53 65 67 3b 20 69 53 65 67 2b 2b 29 7b 0a 20 20  Seg; iSeg++){.  
2d9d0 20 20 20 20 20 20 46 74 73 35 53 74 72 75 63 74        Fts5Struct
2d9e0 75 72 65 53 65 67 6d 65 6e 74 20 2a 70 53 65 67  ureSegment *pSeg
2d9f0 20 3d 20 26 70 53 74 72 75 63 74 2d 3e 61 4c 65   = &pStruct->aLe
2da00 76 65 6c 5b 69 4c 76 6c 5d 2e 61 53 65 67 5b 69  vel[iLvl].aSeg[i
2da10 53 65 67 5d 3b 0a 20 20 20 20 20 20 20 20 66 74  Seg];.        ft
2da20 73 35 49 6e 64 65 78 49 6e 74 65 67 72 69 74 79  s5IndexIntegrity
2da30 43 68 65 63 6b 53 65 67 6d 65 6e 74 28 70 2c 20  CheckSegment(p, 
2da40 70 53 65 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20  pSeg);.      }. 
2da50 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54     }.  }..  /* T
2da60 68 65 20 63 6b 73 75 6d 20 61 72 67 75 6d 65 6e  he cksum argumen
2da70 74 20 70 61 73 73 65 64 20 74 6f 20 74 68 69 73  t passed to this
2da80 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 63   function is a c
2da90 68 65 63 6b 73 75 6d 20 63 61 6c 63 75 6c 61 74  hecksum calculat
2daa0 65 64 0a 20 20 2a 2a 20 62 61 73 65 64 20 6f 6e  ed.  ** based on
2dab0 20 61 6c 6c 20 65 78 70 65 63 74 65 64 20 65 6e   all expected en
2dac0 74 72 69 65 73 20 69 6e 20 74 68 65 20 46 54 53  tries in the FTS
2dad0 20 69 6e 64 65 78 20 28 69 6e 63 6c 75 64 69 6e   index (includin
2dae0 67 20 70 72 65 66 69 78 20 69 6e 64 65 78 0a 20  g prefix index. 
2daf0 20 2a 2a 20 65 6e 74 72 69 65 73 29 2e 20 54 68   ** entries). Th
2db00 69 73 20 62 6c 6f 63 6b 20 63 68 65 63 6b 73 20  is block checks 
2db10 74 68 61 74 20 61 20 63 68 65 63 6b 73 75 6d 20  that a checksum 
2db20 63 61 6c 63 75 6c 61 74 65 64 20 62 61 73 65 64  calculated based
2db30 20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20 61 63 74   on the.  ** act
2db40 75 61 6c 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  ual contents of 
2db50 46 54 53 20 69 6e 64 65 78 20 69 73 20 69 64 65  FTS index is ide
2db60 6e 74 69 63 61 6c 2e 0a 20 20 2a 2a 0a 20 20 2a  ntical..  **.  *
2db70 2a 20 54 77 6f 20 76 65 72 73 69 6f 6e 73 20 6f  * Two versions o
2db80 66 20 74 68 65 20 73 61 6d 65 20 63 68 65 63 6b  f the same check
2db90 73 75 6d 20 61 72 65 20 63 61 6c 63 75 6c 61 74  sum are calculat
2dba0 65 64 2e 20 54 68 65 20 66 69 72 73 74 20 28 73  ed. The first (s
2dbb0 74 61 63 6b 0a 20 20 2a 2a 20 76 61 72 69 61 62  tack.  ** variab
2dbc0 6c 65 20 63 6b 73 75 6d 32 29 20 62 61 73 65 64  le cksum2) based
2dbd0 20 6f 6e 20 65 6e 74 72 69 65 73 20 65 78 74 72   on entries extr
2dbe0 61 63 74 65 64 20 66 72 6f 6d 20 74 68 65 20 66  acted from the f
2dbf0 75 6c 6c 2d 74 65 78 74 20 69 6e 64 65 78 0a 20  ull-text index. 
2dc00 20 2a 2a 20 77 68 69 6c 65 20 64 6f 69 6e 67 20   ** while doing 
2dc10 61 20 6c 69 6e 65 61 72 20 73 63 61 6e 20 6f 66  a linear scan of
2dc20 20 65 61 63 68 20 69 6e 64 69 76 69 64 75 61 6c   each individual
2dc30 20 69 6e 64 65 78 20 69 6e 20 74 75 72 6e 2e 20   index in turn. 
2dc40 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 73 20 65 61  .  **.  ** As ea
2dc50 63 68 20 74 65 72 6d 20 76 69 73 69 74 65 64 20  ch term visited 
2dc60 62 79 20 74 68 65 20 6c 69 6e 65 61 72 20 73 63  by the linear sc
2dc70 61 6e 73 2c 20 61 20 73 65 70 61 72 61 74 65 20  ans, a separate 
2dc80 71 75 65 72 79 20 66 6f 72 20 74 68 65 0a 20 20  query for the.  
2dc90 2a 2a 20 73 61 6d 65 20 74 65 72 6d 20 69 73 20  ** same term is 
2dca0 70 65 72 66 6f 72 6d 65 64 2e 20 63 6b 73 75 6d  performed. cksum
2dcb0 33 20 69 73 20 63 61 6c 63 75 6c 61 74 65 64 20  3 is calculated 
2dcc0 62 61 73 65 64 20 6f 6e 20 74 68 65 20 65 6e 74  based on the ent
2dcd0 72 69 65 73 0a 20 20 2a 2a 20 65 78 74 72 61 63  ries.  ** extrac
2dce0 74 65 64 20 62 79 20 74 68 65 73 65 20 71 75 65  ted by these que
2dcf0 72 69 65 73 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72  ries..  */.  for
2dd00 28 66 74 73 35 4d 75 6c 74 69 49 74 65 72 4e 65  (fts5MultiIterNe
2dd10 77 28 70 2c 20 70 53 74 72 75 63 74 2c 20 66 6c  w(p, pStruct, fl
2dd20 61 67 73 2c 20 30 2c 20 30 2c 20 30 2c 20 2d 31  ags, 0, 0, 0, -1
2dd30 2c 20 30 2c 20 26 70 49 74 65 72 29 3b 0a 20 20  , 0, &pIter);.  
2dd40 20 20 20 20 66 74 73 35 4d 75 6c 74 69 49 74 65      fts5MultiIte
2dd50 72 45 6f 66 28 70 2c 20 70 49 74 65 72 29 3d 3d  rEof(p, pIter)==
2dd60 30 3b 0a 20 20 20 20 20 20 66 74 73 35 4d 75 6c  0;.      fts5Mul
2dd70 74 69 49 74 65 72 4e 65 78 74 28 70 2c 20 70 49  tiIterNext(p, pI
2dd80 74 65 72 2c 20 30 2c 20 30 29 0a 20 20 29 7b 0a  ter, 0, 0).  ){.
2dd90 20 20 20 20 69 6e 74 20 6e 3b 20 20 20 20 20 20      int n;      
2dda0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ddb0 2f 2a 20 53 69 7a 65 20 6f 66 20 74 65 72 6d 20  /* Size of term 
2ddc0 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 20 20  in bytes */.    
2ddd0 69 36 34 20 69 50 6f 73 20 3d 20 30 3b 20 20 20  i64 iPos = 0;   
2dde0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
2ddf0 6f 73 69 74 69 6f 6e 20 72 65 61 64 20 66 72 6f  osition read fro
2de00 6d 20 70 6f 73 6c 69 73 74 20 2a 2f 0a 20 20 20  m poslist */.   
2de10 20 69 6e 74 20 69 4f 66 66 20 3d 20 30 3b 20 20   int iOff = 0;  
2de20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2de30 4f 66 66 73 65 74 20 77 69 74 68 69 6e 20 70 6f  Offset within po
2de40 73 6c 69 73 74 20 2a 2f 0a 20 20 20 20 69 36 34  slist */.    i64
2de50 20 69 52 6f 77 69 64 20 3d 20 66 74 73 35 4d 75   iRowid = fts5Mu
2de60 6c 74 69 49 74 65 72 52 6f 77 69 64 28 70 49 74  ltiIterRowid(pIt
2de70 65 72 29 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a  er);.    char *z
2de80 20 3d 20 28 63 68 61 72 2a 29 66 74 73 35 4d 75   = (char*)fts5Mu
2de90 6c 74 69 49 74 65 72 54 65 72 6d 28 70 49 74 65  ltiIterTerm(pIte
2dea0 72 2c 20 26 6e 29 3b 0a 0a 20 20 20 20 2f 2a 20  r, &n);..    /* 
2deb0 49 66 20 74 68 69 73 20 69 73 20 61 20 6e 65 77  If this is a new
2dec0 20 74 65 72 6d 2c 20 71 75 65 72 79 20 66 6f 72   term, query for
2ded0 20 69 74 2e 20 55 70 64 61 74 65 20 63 6b 73 75   it. Update cksu
2dee0 6d 33 20 77 69 74 68 20 74 68 65 20 72 65 73 75  m3 with the resu
2def0 6c 74 73 2e 20 2a 2f 0a 20 20 20 20 66 74 73 35  lts. */.    fts5
2df00 54 65 73 74 54 65 72 6d 28 70 2c 20 26 74 65 72  TestTerm(p, &ter
2df10 6d 2c 20 7a 2c 20 6e 2c 20 63 6b 73 75 6d 32 2c  m, z, n, cksum2,
2df20 20 26 63 6b 73 75 6d 33 29 3b 0a 0a 20 20 20 20   &cksum3);..    
2df30 69 66 28 20 65 44 65 74 61 69 6c 3d 3d 46 54 53  if( eDetail==FTS
2df40 35 5f 44 45 54 41 49 4c 5f 4e 4f 4e 45 20 29 7b  5_DETAIL_NONE ){
2df50 0a 20 20 20 20 20 20 69 66 28 20 30 3d 3d 66 74  .      if( 0==ft
2df60 73 35 4d 75 6c 74 69 49 74 65 72 49 73 45 6d 70  s5MultiIterIsEmp
2df70 74 79 28 70 2c 20 70 49 74 65 72 29 20 29 7b 0a  ty(p, pIter) ){.
2df80 20 20 20 20 20 20 20 20 63 6b 73 75 6d 32 20 5e          cksum2 ^
2df90 3d 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64  = sqlite3Fts5Ind
2dfa0 65 78 45 6e 74 72 79 43 6b 73 75 6d 28 69 52 6f  exEntryCksum(iRo
2dfb0 77 69 64 2c 20 30 2c 20 30 2c 20 2d 31 2c 20 7a  wid, 0, 0, -1, z
2dfc0 2c 20 6e 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , n);.      }.  
2dfd0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
2dfe0 6f 73 6c 69 73 74 2e 6e 20 3d 20 30 3b 0a 20 20  oslist.n = 0;.  
2dff0 20 20 20 20 66 74 73 35 53 65 67 69 74 65 72 50      fts5SegiterP
2e000 6f 73 6c 69 73 74 28 70 2c 20 26 70 49 74 65 72  oslist(p, &pIter
2e010 2d 3e 61 53 65 67 5b 70 49 74 65 72 2d 3e 61 46  ->aSeg[pIter->aF
2e020 69 72 73 74 5b 31 5d 2e 69 46 69 72 73 74 5d 2c  irst[1].iFirst],
2e030 20 30 2c 20 26 70 6f 73 6c 69 73 74 29 3b 0a 20   0, &poslist);. 
2e040 20 20 20 20 20 77 68 69 6c 65 28 20 30 3d 3d 73       while( 0==s
2e050 71 6c 69 74 65 33 46 74 73 35 50 6f 73 6c 69 73  qlite3Fts5Poslis
2e060 74 4e 65 78 74 36 34 28 70 6f 73 6c 69 73 74 2e  tNext64(poslist.
2e070 70 2c 20 70 6f 73 6c 69 73 74 2e 6e 2c 20 26 69  p, poslist.n, &i
2e080 4f 66 66 2c 20 26 69 50 6f 73 29 20 29 7b 0a 20  Off, &iPos) ){. 
2e090 20 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6c 20         int iCol 
2e0a0 3d 20 46 54 53 35 5f 50 4f 53 32 43 4f 4c 55 4d  = FTS5_POS2COLUM
2e0b0 4e 28 69 50 6f 73 29 3b 0a 20 20 20 20 20 20 20  N(iPos);.       
2e0c0 20 69 6e 74 20 69 54 6f 6b 4f 66 66 20 3d 20 46   int iTokOff = F
2e0d0 54 53 35 5f 50 4f 53 32 4f 46 46 53 45 54 28 69  TS5_POS2OFFSET(i
2e0e0 50 6f 73 29 3b 0a 20 20 20 20 20 20 20 20 63 6b  Pos);.        ck
2e0f0 73 75 6d 32 20 5e 3d 20 73 71 6c 69 74 65 33 46  sum2 ^= sqlite3F
2e100 74 73 35 49 6e 64 65 78 45 6e 74 72 79 43 6b 73  ts5IndexEntryCks
2e110 75 6d 28 69 52 6f 77 69 64 2c 20 69 43 6f 6c 2c  um(iRowid, iCol,
2e120 20 69 54 6f 6b 4f 66 66 2c 20 2d 31 2c 20 7a 2c   iTokOff, -1, z,
2e130 20 6e 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   n);.      }.   
2e140 20 7d 0a 20 20 7d 0a 20 20 66 74 73 35 54 65 73   }.  }.  fts5Tes
2e150 74 54 65 72 6d 28 70 2c 20 26 74 65 72 6d 2c 20  tTerm(p, &term, 
2e160 30 2c 20 30 2c 20 63 6b 73 75 6d 32 2c 20 26 63  0, 0, cksum2, &c
2e170 6b 73 75 6d 33 29 3b 0a 0a 20 20 66 74 73 35 4d  ksum3);..  fts5M
2e180 75 6c 74 69 49 74 65 72 46 72 65 65 28 70 49 74  ultiIterFree(pIt
2e190 65 72 29 3b 0a 20 20 69 66 28 20 70 2d 3e 72 63  er);.  if( p->rc
2e1a0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 63  ==SQLITE_OK && c
2e1b0 6b 73 75 6d 21 3d 63 6b 73 75 6d 32 20 29 20 70  ksum!=cksum2 ) p
2e1c0 2d 3e 72 63 20 3d 20 46 54 53 35 5f 43 4f 52 52  ->rc = FTS5_CORR
2e1d0 55 50 54 3b 0a 0a 20 20 66 74 73 35 53 74 72 75  UPT;..  fts5Stru
2e1e0 63 74 75 72 65 52 65 6c 65 61 73 65 28 70 53 74  ctureRelease(pSt
2e1f0 72 75 63 74 29 3b 0a 23 69 66 64 65 66 20 53 51  ruct);.#ifdef SQ
2e200 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 66 74 73  LITE_DEBUG.  fts
2e210 35 42 75 66 66 65 72 46 72 65 65 28 26 74 65 72  5BufferFree(&ter
2e220 6d 29 3b 0a 23 65 6e 64 69 66 0a 20 20 66 74 73  m);.#endif.  fts
2e230 35 42 75 66 66 65 72 46 72 65 65 28 26 70 6f 73  5BufferFree(&pos
2e240 6c 69 73 74 29 3b 0a 20 20 72 65 74 75 72 6e 20  list);.  return 
2e250 66 74 73 35 49 6e 64 65 78 52 65 74 75 72 6e 28  fts5IndexReturn(
2e260 70 29 3b 0a 7d 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a  p);.}../********
2e270 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2e280 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2e290 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2e2a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2e2b0 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *.**************
2e2c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2e2d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2e2e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2e2f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20  ************.** 
2e300 42 65 6c 6f 77 20 74 68 69 73 20 70 6f 69 6e 74  Below this point
2e310 20 69 73 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e   is the implemen
2e320 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 66 74  tation of the ft
2e330 73 35 5f 64 65 63 6f 64 65 28 29 20 73 63 61 6c  s5_decode() scal
2e340 61 72 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 6f  ar.** function o
2e350 6e 6c 79 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 44  nly..*/../*.** D
2e360 65 63 6f 64 65 20 61 20 73 65 67 6d 65 6e 74 2d  ecode a segment-
2e370 64 61 74 61 20 72 6f 77 69 64 20 66 72 6f 6d 20  data rowid from 
2e380 74 68 65 20 25 5f 64 61 74 61 20 74 61 62 6c 65  the %_data table
2e390 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  . This function 
2e3a0 69 73 0a 2a 2a 20 74 68 65 20 6f 70 70 6f 73 69  is.** the opposi
2e3b0 74 65 20 6f 66 20 6d 61 63 72 6f 20 46 54 53 35  te of macro FTS5
2e3c0 5f 53 45 47 4d 45 4e 54 5f 52 4f 57 49 44 28 29  _SEGMENT_ROWID()
2e3d0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
2e3e0 20 66 74 73 35 44 65 63 6f 64 65 52 6f 77 69 64   fts5DecodeRowid
2e3f0 28 0a 20 20 69 36 34 20 69 52 6f 77 69 64 2c 20  (.  i64 iRowid, 
2e400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e410 20 20 20 20 2f 2a 20 52 6f 77 69 64 20 66 72 6f      /* Rowid fro
2e420 6d 20 25 5f 64 61 74 61 20 74 61 62 6c 65 20 2a  m %_data table *
2e430 2f 0a 20 20 69 6e 74 20 2a 70 69 53 65 67 69 64  /.  int *piSegid
2e440 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
2e450 20 20 20 20 2f 2a 20 4f 55 54 3a 20 53 65 67 6d      /* OUT: Segm
2e460 65 6e 74 20 69 64 20 2a 2f 0a 20 20 69 6e 74 20  ent id */.  int 
2e470 2a 70 62 44 6c 69 64 78 2c 20 20 20 20 20 20 20  *pbDlidx,       
2e480 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
2e490 55 54 3a 20 44 6c 69 64 78 20 66 6c 61 67 20 2a  UT: Dlidx flag *
2e4a0 2f 0a 20 20 69 6e 74 20 2a 70 69 48 65 69 67 68  /.  int *piHeigh
2e4b0 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t,              
2e4c0 20 20 20 20 2f 2a 20 4f 55 54 3a 20 48 65 69 67      /* OUT: Heig
2e4d0 68 74 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 69 50  ht */.  int *piP
2e4e0 67 6e 6f 20 20 20 20 20 20 20 20 20 20 20 20 20  gno             
2e4f0 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20          /* OUT: 
2e500 50 61 67 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 29  Page number */.)
2e510 7b 0a 20 20 2a 70 69 50 67 6e 6f 20 3d 20 28 69  {.  *piPgno = (i
2e520 6e 74 29 28 69 52 6f 77 69 64 20 26 20 28 28 28  nt)(iRowid & (((
2e530 69 36 34 29 31 20 3c 3c 20 46 54 53 35 5f 44 41  i64)1 << FTS5_DA
2e540 54 41 5f 50 41 47 45 5f 42 29 20 2d 20 31 29 29  TA_PAGE_B) - 1))
2e550 3b 0a 20 20 69 52 6f 77 69 64 20 3e 3e 3d 20 46  ;.  iRowid >>= F
2e560 54 53 35 5f 44 41 54 41 5f 50 41 47 45 5f 42 3b  TS5_DATA_PAGE_B;
2e570 0a 0a 20 20 2a 70 69 48 65 69 67 68 74 20 3d 20  ..  *piHeight = 
2e580 28 69 6e 74 29 28 69 52 6f 77 69 64 20 26 20 28  (int)(iRowid & (
2e590 28 28 69 36 34 29 31 20 3c 3c 20 46 54 53 35 5f  ((i64)1 << FTS5_
2e5a0 44 41 54 41 5f 48 45 49 47 48 54 5f 42 29 20 2d  DATA_HEIGHT_B) -
2e5b0 20 31 29 29 3b 0a 20 20 69 52 6f 77 69 64 20 3e   1));.  iRowid >
2e5c0 3e 3d 20 46 54 53 35 5f 44 41 54 41 5f 48 45 49  >= FTS5_DATA_HEI
2e5d0 47 48 54 5f 42 3b 0a 0a 20 20 2a 70 62 44 6c 69  GHT_B;..  *pbDli
2e5e0 64 78 20 3d 20 28 69 6e 74 29 28 69 52 6f 77 69  dx = (int)(iRowi
2e5f0 64 20 26 20 30 78 30 30 30 31 29 3b 0a 20 20 69  d & 0x0001);.  i
2e600 52 6f 77 69 64 20 3e 3e 3d 20 46 54 53 35 5f 44  Rowid >>= FTS5_D
2e610 41 54 41 5f 44 4c 49 5f 42 3b 0a 0a 20 20 2a 70  ATA_DLI_B;..  *p
2e620 69 53 65 67 69 64 20 3d 20 28 69 6e 74 29 28 69  iSegid = (int)(i
2e630 52 6f 77 69 64 20 26 20 28 28 28 69 36 34 29 31  Rowid & (((i64)1
2e640 20 3c 3c 20 46 54 53 35 5f 44 41 54 41 5f 49 44   << FTS5_DATA_ID
2e650 5f 42 29 20 2d 20 31 29 29 3b 0a 7d 0a 0a 73 74  _B) - 1));.}..st
2e660 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 44 65  atic void fts5De
2e670 62 75 67 52 6f 77 69 64 28 69 6e 74 20 2a 70 52  bugRowid(int *pR
2e680 63 2c 20 46 74 73 35 42 75 66 66 65 72 20 2a 70  c, Fts5Buffer *p
2e690 42 75 66 2c 20 69 36 34 20 69 4b 65 79 29 7b 0a  Buf, i64 iKey){.
2e6a0 20 20 69 6e 74 20 69 53 65 67 69 64 2c 20 69 48    int iSegid, iH
2e6b0 65 69 67 68 74 2c 20 69 50 67 6e 6f 2c 20 62 44  eight, iPgno, bD
2e6c0 6c 69 64 78 3b 20 20 20 20 20 20 20 2f 2a 20 52  lidx;       /* R
2e6d0 6f 77 69 64 20 63 6f 6d 70 65 6e 65 6e 74 73 20  owid compenents 
2e6e0 2a 2f 0a 20 20 66 74 73 35 44 65 63 6f 64 65 52  */.  fts5DecodeR
2e6f0 6f 77 69 64 28 69 4b 65 79 2c 20 26 69 53 65 67  owid(iKey, &iSeg
2e700 69 64 2c 20 26 62 44 6c 69 64 78 2c 20 26 69 48  id, &bDlidx, &iH
2e710 65 69 67 68 74 2c 20 26 69 50 67 6e 6f 29 3b 0a  eight, &iPgno);.
2e720 0a 20 20 69 66 28 20 69 53 65 67 69 64 3d 3d 30  .  if( iSegid==0
2e730 20 29 7b 0a 20 20 20 20 69 66 28 20 69 4b 65 79   ){.    if( iKey
2e740 3d 3d 46 54 53 35 5f 41 56 45 52 41 47 45 53 5f  ==FTS5_AVERAGES_
2e750 52 4f 57 49 44 20 29 7b 0a 20 20 20 20 20 20 73  ROWID ){.      s
2e760 71 6c 69 74 65 33 46 74 73 35 42 75 66 66 65 72  qlite3Fts5Buffer
2e770 41 70 70 65 6e 64 50 72 69 6e 74 66 28 70 52 63  AppendPrintf(pRc
2e780 2c 20 70 42 75 66 2c 20 22 7b 61 76 65 72 61 67  , pBuf, "{averag
2e790 65 73 7d 20 22 29 3b 0a 20 20 20 20 7d 65 6c 73  es} ");.    }els
2e7a0 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  e{.      sqlite3
2e7b0 46 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64  Fts5BufferAppend
2e7c0 50 72 69 6e 74 66 28 70 52 63 2c 20 70 42 75 66  Printf(pRc, pBuf
2e7d0 2c 20 22 7b 73 74 72 75 63 74 75 72 65 7d 22 29  , "{structure}")
2e7e0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 65 6c  ;.    }.  }.  el
2e7f0 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 46  se{.    sqlite3F
2e800 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 50  ts5BufferAppendP
2e810 72 69 6e 74 66 28 70 52 63 2c 20 70 42 75 66 2c  rintf(pRc, pBuf,
2e820 20 22 7b 25 73 73 65 67 69 64 3d 25 64 20 68 3d   "{%ssegid=%d h=
2e830 25 64 20 70 67 6e 6f 3d 25 64 7d 22 2c 0a 20 20  %d pgno=%d}",.  
2e840 20 20 20 20 20 20 62 44 6c 69 64 78 20 3f 20 22        bDlidx ? "
2e850 64 6c 69 64 78 20 22 20 3a 20 22 22 2c 20 69 53  dlidx " : "", iS
2e860 65 67 69 64 2c 20 69 48 65 69 67 68 74 2c 20 69  egid, iHeight, i
2e870 50 67 6e 6f 0a 20 20 20 20 29 3b 0a 20 20 7d 0a  Pgno.    );.  }.
2e880 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  }..static void f
2e890 74 73 35 44 65 62 75 67 53 74 72 75 63 74 75 72  ts5DebugStructur
2e8a0 65 28 0a 20 20 69 6e 74 20 2a 70 52 63 2c 20 20  e(.  int *pRc,  
2e8b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e8c0 20 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20       /* IN/OUT: 
2e8d0 65 72 72 6f 72 20 63 6f 64 65 20 2a 2f 0a 20 20  error code */.  
2e8e0 46 74 73 35 42 75 66 66 65 72 20 2a 70 42 75 66  Fts5Buffer *pBuf
2e8f0 2c 0a 20 20 46 74 73 35 53 74 72 75 63 74 75 72  ,.  Fts5Structur
2e900 65 20 2a 70 0a 29 7b 0a 20 20 69 6e 74 20 69 4c  e *p.){.  int iL
2e910 76 6c 2c 20 69 53 65 67 3b 20 20 20 20 20 20 20  vl, iSeg;       
2e920 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 74 65            /* Ite
2e930 72 61 74 65 20 74 68 72 6f 75 67 68 20 6c 65 76  rate through lev
2e940 65 6c 73 2c 20 73 65 67 6d 65 6e 74 73 20 2a 2f  els, segments */
2e950 0a 0a 20 20 66 6f 72 28 69 4c 76 6c 3d 30 3b 20  ..  for(iLvl=0; 
2e960 69 4c 76 6c 3c 70 2d 3e 6e 4c 65 76 65 6c 3b 20  iLvl<p->nLevel; 
2e970 69 4c 76 6c 2b 2b 29 7b 0a 20 20 20 20 46 74 73  iLvl++){.    Fts
2e980 35 53 74 72 75 63 74 75 72 65 4c 65 76 65 6c 20  5StructureLevel 
2e990 2a 70 4c 76 6c 20 3d 20 26 70 2d 3e 61 4c 65 76  *pLvl = &p->aLev
2e9a0 65 6c 5b 69 4c 76 6c 5d 3b 0a 20 20 20 20 73 71  el[iLvl];.    sq
2e9b0 6c 69 74 65 33 46 74 73 35 42 75 66 66 65 72 41  lite3Fts5BufferA
2e9c0 70 70 65 6e 64 50 72 69 6e 74 66 28 70 52 63 2c  ppendPrintf(pRc,
2e9d0 20 70 42 75 66 2c 20 0a 20 20 20 20 20 20 20 20   pBuf, .        
2e9e0 22 20 7b 6c 76 6c 3d 25 64 20 6e 4d 65 72 67 65  " {lvl=%d nMerge
2e9f0 3d 25 64 20 6e 53 65 67 3d 25 64 22 2c 20 69 4c  =%d nSeg=%d", iL
2ea00 76 6c 2c 20 70 4c 76 6c 2d 3e 6e 4d 65 72 67 65  vl, pLvl->nMerge
2ea10 2c 20 70 4c 76 6c 2d 3e 6e 53 65 67 0a 20 20 20  , pLvl->nSeg.   
2ea20 20 29 3b 0a 20 20 20 20 66 6f 72 28 69 53 65 67   );.    for(iSeg
2ea30 3d 30 3b 20 69 53 65 67 3c 70 4c 76 6c 2d 3e 6e  =0; iSeg<pLvl->n
2ea40 53 65 67 3b 20 69 53 65 67 2b 2b 29 7b 0a 20 20  Seg; iSeg++){.  
2ea50 20 20 20 20 46 74 73 35 53 74 72 75 63 74 75 72      Fts5Structur
2ea60 65 53 65 67 6d 65 6e 74 20 2a 70 53 65 67 20 3d  eSegment *pSeg =
2ea70 20 26 70 4c 76 6c 2d 3e 61 53 65 67 5b 69 53 65   &pLvl->aSeg[iSe
2ea80 67 5d 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  g];.      sqlite
2ea90 33 46 74 73 35 42 75 66 66 65 72 41 70 70 65 6e  3Fts5BufferAppen
2eaa0 64 50 72 69 6e 74 66 28 70 52 63 2c 20 70 42 75  dPrintf(pRc, pBu
2eab0 66 2c 20 22 20 7b 69 64 3d 25 64 20 6c 65 61 76  f, " {id=%d leav
2eac0 65 73 3d 25 64 2e 2e 25 64 7d 22 2c 20 0a 20 20  es=%d..%d}", .  
2ead0 20 20 20 20 20 20 20 20 70 53 65 67 2d 3e 69 53          pSeg->iS
2eae0 65 67 69 64 2c 20 70 53 65 67 2d 3e 70 67 6e 6f  egid, pSeg->pgno
2eaf0 46 69 72 73 74 2c 20 70 53 65 67 2d 3e 70 67 6e  First, pSeg->pgn
2eb00 6f 4c 61 73 74 0a 20 20 20 20 20 20 29 3b 0a 20  oLast.      );. 
2eb10 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
2eb20 46 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64  Fts5BufferAppend
2eb30 50 72 69 6e 74 66 28 70 52 63 2c 20 70 42 75 66  Printf(pRc, pBuf
2eb40 2c 20 22 7d 22 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  , "}");.  }.}../
2eb50 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 70 61 72  *.** This is par
2eb60 74 20 6f 66 20 74 68 65 20 66 74 73 35 5f 64 65  t of the fts5_de
2eb70 63 6f 64 65 28 29 20 64 65 62 75 67 67 69 6e 67  code() debugging
2eb80 20 61 69 64 2e 0a 2a 2a 0a 2a 2a 20 41 72 67 75   aid..**.** Argu
2eb90 6d 65 6e 74 73 20 70 42 6c 6f 62 2f 6e 42 6c 6f  ments pBlob/nBlo
2eba0 62 20 63 6f 6e 74 61 69 6e 20 61 20 73 65 72 69  b contain a seri
2ebb0 61 6c 69 7a 65 64 20 46 74 73 35 53 74 72 75 63  alized Fts5Struc
2ebc0 74 75 72 65 20 6f 62 6a 65 63 74 2e 20 54 68 69  ture object. Thi
2ebd0 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 61 70  s.** function ap
2ebe0 70 65 6e 64 73 20 61 20 68 75 6d 61 6e 2d 72 65  pends a human-re
2ebf0 61 64 61 62 6c 65 20 72 65 70 72 65 73 65 6e 74  adable represent
2ec00 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 73 61 6d  ation of the sam
2ec10 65 20 6f 62 6a 65 63 74 0a 2a 2a 20 74 6f 20 74  e object.** to t
2ec20 68 65 20 62 75 66 66 65 72 20 70 61 73 73 65 64  he buffer passed
2ec30 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61   as the second a
2ec40 72 67 75 6d 65 6e 74 2e 20 0a 2a 2f 0a 73 74 61  rgument. .*/.sta
2ec50 74 69 63 20 76 6f 69 64 20 66 74 73 35 44 65 63  tic void fts5Dec
2ec60 6f 64 65 53 74 72 75 63 74 75 72 65 28 0a 20 20  odeStructure(.  
2ec70 69 6e 74 20 2a 70 52 63 2c 20 20 20 20 20 20 20  int *pRc,       
2ec80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ec90 2f 2a 20 49 4e 2f 4f 55 54 3a 20 65 72 72 6f 72  /* IN/OUT: error
2eca0 20 63 6f 64 65 20 2a 2f 0a 20 20 46 74 73 35 42   code */.  Fts5B
2ecb0 75 66 66 65 72 20 2a 70 42 75 66 2c 0a 20 20 63  uffer *pBuf,.  c
2ecc0 6f 6e 73 74 20 75 38 20 2a 70 42 6c 6f 62 2c 20  onst u8 *pBlob, 
2ecd0 69 6e 74 20 6e 42 6c 6f 62 0a 29 7b 0a 20 20 69  int nBlob.){.  i
2ece0 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
2ecf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2ed00 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
2ed10 0a 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65  .  Fts5Structure
2ed20 20 2a 70 20 3d 20 30 3b 20 20 20 20 20 20 20 20   *p = 0;        
2ed30 20 20 20 2f 2a 20 44 65 63 6f 64 65 64 20 73 74     /* Decoded st
2ed40 72 75 63 74 75 72 65 20 6f 62 6a 65 63 74 20 2a  ructure object *
2ed50 2f 0a 0a 20 20 72 63 20 3d 20 66 74 73 35 53 74  /..  rc = fts5St
2ed60 72 75 63 74 75 72 65 44 65 63 6f 64 65 28 70 42  ructureDecode(pB
2ed70 6c 6f 62 2c 20 6e 42 6c 6f 62 2c 20 30 2c 20 26  lob, nBlob, 0, &
2ed80 70 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  p);.  if( rc!=SQ
2ed90 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2a  LITE_OK ){.    *
2eda0 70 52 63 20 3d 20 72 63 3b 0a 20 20 20 20 72 65  pRc = rc;.    re
2edb0 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20 66 74 73  turn;.  }..  fts
2edc0 35 44 65 62 75 67 53 74 72 75 63 74 75 72 65 28  5DebugStructure(
2edd0 70 52 63 2c 20 70 42 75 66 2c 20 70 29 3b 0a 20  pRc, pBuf, p);. 
2ede0 20 66 74 73 35 53 74 72 75 63 74 75 72 65 52 65   fts5StructureRe
2edf0 6c 65 61 73 65 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a  lease(p);.}../*.
2ee00 2a 2a 20 54 68 69 73 20 69 73 20 70 61 72 74 20  ** This is part 
2ee10 6f 66 20 74 68 65 20 66 74 73 35 5f 64 65 63 6f  of the fts5_deco
2ee20 64 65 28 29 20 64 65 62 75 67 67 69 6e 67 20 61  de() debugging a
2ee30 69 64 2e 0a 2a 2a 0a 2a 2a 20 41 72 67 75 6d 65  id..**.** Argume
2ee40 6e 74 73 20 70 42 6c 6f 62 2f 6e 42 6c 6f 62 20  nts pBlob/nBlob 
2ee50 63 6f 6e 74 61 69 6e 20 61 6e 20 22 61 76 65 72  contain an "aver
2ee60 61 67 65 73 22 20 72 65 63 6f 72 64 2e 20 54 68  ages" record. Th
2ee70 69 73 20 66 75 6e 63 74 69 6f 6e 20 0a 2a 2a 20  is function .** 
2ee80 61 70 70 65 6e 64 73 20 61 20 68 75 6d 61 6e 2d  appends a human-
2ee90 72 65 61 64 61 62 6c 65 20 72 65 70 72 65 73 65  readable represe
2eea0 6e 74 61 74 69 6f 6e 20 6f 66 20 72 65 63 6f 72  ntation of recor
2eeb0 64 20 74 6f 20 74 68 65 20 62 75 66 66 65 72 20  d to the buffer 
2eec0 70 61 73 73 65 64 20 0a 2a 2a 20 61 73 20 74 68  passed .** as th
2eed0 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
2eee0 74 2e 20 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  t. .*/.static vo
2eef0 69 64 20 66 74 73 35 44 65 63 6f 64 65 41 76 65  id fts5DecodeAve
2ef00 72 61 67 65 73 28 0a 20 20 69 6e 74 20 2a 70 52  rages(.  int *pR
2ef10 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c,              
2ef20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f           /* IN/O
2ef30 55 54 3a 20 65 72 72 6f 72 20 63 6f 64 65 20 2a  UT: error code *
2ef40 2f 0a 20 20 46 74 73 35 42 75 66 66 65 72 20 2a  /.  Fts5Buffer *
2ef50 70 42 75 66 2c 0a 20 20 63 6f 6e 73 74 20 75 38  pBuf,.  const u8
2ef60 20 2a 70 42 6c 6f 62 2c 20 69 6e 74 20 6e 42 6c   *pBlob, int nBl
2ef70 6f 62 0a 29 7b 0a 20 20 69 6e 74 20 69 20 3d 20  ob.){.  int i = 
2ef80 30 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  0;.  const char 
2ef90 2a 7a 53 70 61 63 65 20 3d 20 22 22 3b 0a 0a 20  *zSpace = "";.. 
2efa0 20 77 68 69 6c 65 28 20 69 3c 6e 42 6c 6f 62 20   while( i<nBlob 
2efb0 29 7b 0a 20 20 20 20 75 36 34 20 69 56 61 6c 3b  ){.    u64 iVal;
2efc0 0a 20 20 20 20 69 20 2b 3d 20 73 71 6c 69 74 65  .    i += sqlite
2efd0 33 46 74 73 35 47 65 74 56 61 72 69 6e 74 28 26  3Fts5GetVarint(&
2efe0 70 42 6c 6f 62 5b 69 5d 2c 20 26 69 56 61 6c 29  pBlob[i], &iVal)
2eff0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 46 74 73  ;.    sqlite3Fts
2f000 35 42 75 66 66 65 72 41 70 70 65 6e 64 50 72 69  5BufferAppendPri
2f010 6e 74 66 28 70 52 63 2c 20 70 42 75 66 2c 20 22  ntf(pRc, pBuf, "
2f020 25 73 25 64 22 2c 20 7a 53 70 61 63 65 2c 20 28  %s%d", zSpace, (
2f030 69 6e 74 29 69 56 61 6c 29 3b 0a 20 20 20 20 7a  int)iVal);.    z
2f040 53 70 61 63 65 20 3d 20 22 20 22 3b 0a 20 20 7d  Space = " ";.  }
2f050 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42 75 66 66 65 72  .}../*.** Buffer
2f060 20 28 61 2f 6e 29 20 69 73 20 61 73 73 75 6d 65   (a/n) is assume
2f070 64 20 74 6f 20 63 6f 6e 74 61 69 6e 20 61 20 6c  d to contain a l
2f080 69 73 74 20 6f 66 20 73 65 72 69 61 6c 69 7a 65  ist of serialize
2f090 64 20 76 61 72 69 6e 74 73 2e 20 52 65 61 64 0a  d varints. Read.
2f0a0 2a 2a 20 65 61 63 68 20 76 61 72 69 6e 74 20 61  ** each varint a
2f0b0 6e 64 20 61 70 70 65 6e 64 20 69 74 73 20 73 74  nd append its st
2f0c0 72 69 6e 67 20 72 65 70 72 65 73 65 6e 74 61 74  ring representat
2f0d0 69 6f 6e 20 74 6f 20 62 75 66 66 65 72 20 70 42  ion to buffer pB
2f0e0 75 66 2e 20 52 65 74 75 72 6e 0a 2a 2a 20 61 66  uf. Return.** af
2f0f0 74 65 72 20 65 69 74 68 65 72 20 74 68 65 20 69  ter either the i
2f100 6e 70 75 74 20 62 75 66 66 65 72 20 69 73 20 65  nput buffer is e
2f110 78 68 61 75 73 74 65 64 20 6f 72 20 61 20 30 20  xhausted or a 0 
2f120 76 61 6c 75 65 20 69 73 20 72 65 61 64 2e 0a 2a  value is read..*
2f130 2a 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 20  *.** The return 
2f140 76 61 6c 75 65 20 69 73 20 74 68 65 20 6e 75 6d  value is the num
2f150 62 65 72 20 6f 66 20 62 79 74 65 73 20 72 65 61  ber of bytes rea
2f160 64 20 66 72 6f 6d 20 74 68 65 20 69 6e 70 75 74  d from the input
2f170 20 62 75 66 66 65 72 2e 0a 2a 2f 0a 73 74 61 74   buffer..*/.stat
2f180 69 63 20 69 6e 74 20 66 74 73 35 44 65 63 6f 64  ic int fts5Decod
2f190 65 50 6f 73 6c 69 73 74 28 69 6e 74 20 2a 70 52  ePoslist(int *pR
2f1a0 63 2c 20 46 74 73 35 42 75 66 66 65 72 20 2a 70  c, Fts5Buffer *p
2f1b0 42 75 66 2c 20 63 6f 6e 73 74 20 75 38 20 2a 61  Buf, const u8 *a
2f1c0 2c 20 69 6e 74 20 6e 29 7b 0a 20 20 69 6e 74 20  , int n){.  int 
2f1d0 69 4f 66 66 20 3d 20 30 3b 0a 20 20 77 68 69 6c  iOff = 0;.  whil
2f1e0 65 28 20 69 4f 66 66 3c 6e 20 29 7b 0a 20 20 20  e( iOff<n ){.   
2f1f0 20 69 6e 74 20 69 56 61 6c 3b 0a 20 20 20 20 69   int iVal;.    i
2f200 4f 66 66 20 2b 3d 20 66 74 73 35 47 65 74 56 61  Off += fts5GetVa
2f210 72 69 6e 74 33 32 28 26 61 5b 69 4f 66 66 5d 2c  rint32(&a[iOff],
2f220 20 69 56 61 6c 29 3b 0a 20 20 20 20 73 71 6c 69   iVal);.    sqli
2f230 74 65 33 46 74 73 35 42 75 66 66 65 72 41 70 70  te3Fts5BufferApp
2f240 65 6e 64 50 72 69 6e 74 66 28 70 52 63 2c 20 70  endPrintf(pRc, p
2f250 42 75 66 2c 20 22 20 25 64 22 2c 20 69 56 61 6c  Buf, " %d", iVal
2f260 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
2f270 69 4f 66 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  iOff;.}../*.** T
2f280 68 65 20 73 74 61 72 74 20 6f 66 20 62 75 66 66  he start of buff
2f290 65 72 20 28 61 2f 6e 29 20 63 6f 6e 74 61 69 6e  er (a/n) contain
2f2a0 73 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 61  s the start of a
2f2b0 20 64 6f 63 6c 69 73 74 2e 20 54 68 65 20 64 6f   doclist. The do
2f2c0 63 6c 69 73 74 0a 2a 2a 20 6d 61 79 20 6f 72 20  clist.** may or 
2f2d0 6d 61 79 20 6e 6f 74 20 66 69 6e 69 73 68 20 77  may not finish w
2f2e0 69 74 68 69 6e 20 74 68 65 20 62 75 66 66 65 72  ithin the buffer
2f2f0 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  . This function 
2f300 61 70 70 65 6e 64 73 20 61 20 74 65 78 74 0a 2a  appends a text.*
2f310 2a 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e  * representation
2f320 20 6f 66 20 74 68 65 20 70 61 72 74 20 6f 66 20   of the part of 
2f330 74 68 65 20 64 6f 63 6c 69 73 74 20 74 68 61 74  the doclist that
2f340 20 69 73 20 70 72 65 73 65 6e 74 20 74 6f 20 62   is present to b
2f350 75 66 66 65 72 0a 2a 2a 20 70 42 75 66 2e 20 0a  uffer.** pBuf. .
2f360 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e  **.** The return
2f370 20 76 61 6c 75 65 20 69 73 20 74 68 65 20 6e 75   value is the nu
2f380 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 72 65  mber of bytes re
2f390 61 64 20 66 72 6f 6d 20 74 68 65 20 69 6e 70 75  ad from the inpu
2f3a0 74 20 62 75 66 66 65 72 2e 0a 2a 2f 0a 73 74 61  t buffer..*/.sta
2f3b0 74 69 63 20 69 6e 74 20 66 74 73 35 44 65 63 6f  tic int fts5Deco
2f3c0 64 65 44 6f 63 6c 69 73 74 28 69 6e 74 20 2a 70  deDoclist(int *p
2f3d0 52 63 2c 20 46 74 73 35 42 75 66 66 65 72 20 2a  Rc, Fts5Buffer *
2f3e0 70 42 75 66 2c 20 63 6f 6e 73 74 20 75 38 20 2a  pBuf, const u8 *
2f3f0 61 2c 20 69 6e 74 20 6e 29 7b 0a 20 20 69 36 34  a, int n){.  i64
2f400 20 69 44 6f 63 69 64 20 3d 20 30 3b 0a 20 20 69   iDocid = 0;.  i
2f410 6e 74 20 69 4f 66 66 20 3d 20 30 3b 0a 0a 20 20  nt iOff = 0;..  
2f420 69 66 28 20 6e 3e 30 20 29 7b 0a 20 20 20 20 69  if( n>0 ){.    i
2f430 4f 66 66 20 3d 20 73 71 6c 69 74 65 33 46 74 73  Off = sqlite3Fts
2f440 35 47 65 74 56 61 72 69 6e 74 28 61 2c 20 28 75  5GetVarint(a, (u
2f450 36 34 2a 29 26 69 44 6f 63 69 64 29 3b 0a 20 20  64*)&iDocid);.  
2f460 20 20 73 71 6c 69 74 65 33 46 74 73 35 42 75 66    sqlite3Fts5Buf
2f470 66 65 72 41 70 70 65 6e 64 50 72 69 6e 74 66 28  ferAppendPrintf(
2f480 70 52 63 2c 20 70 42 75 66 2c 20 22 20 69 64 3d  pRc, pBuf, " id=
2f490 25 6c 6c 64 22 2c 20 69 44 6f 63 69 64 29 3b 0a  %lld", iDocid);.
2f4a0 20 20 7d 0a 20 20 77 68 69 6c 65 28 20 69 4f 66    }.  while( iOf
2f4b0 66 3c 6e 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e  f<n ){.    int n
2f4c0 50 6f 73 3b 0a 20 20 20 20 69 6e 74 20 62 44 65  Pos;.    int bDe
2f4d0 6c 3b 0a 20 20 20 20 69 4f 66 66 20 2b 3d 20 66  l;.    iOff += f
2f4e0 74 73 35 47 65 74 50 6f 73 6c 69 73 74 53 69 7a  ts5GetPoslistSiz
2f4f0 65 28 26 61 5b 69 4f 66 66 5d 2c 20 26 6e 50 6f  e(&a[iOff], &nPo
2f500 73 2c 20 26 62 44 65 6c 29 3b 0a 20 20 20 20 73  s, &bDel);.    s
2f510 71 6c 69 74 65 33 46 74 73 35 42 75 66 66 65 72  qlite3Fts5Buffer
2f520 41 70 70 65 6e 64 50 72 69 6e 74 66 28 70 52 63  AppendPrintf(pRc
2f530 2c 20 70 42 75 66 2c 20 22 20 6e 50 6f 73 3d 25  , pBuf, " nPos=%
2f540 64 25 73 22 2c 20 6e 50 6f 73 2c 20 62 44 65 6c  d%s", nPos, bDel
2f550 3f 22 2a 22 3a 22 22 29 3b 0a 20 20 20 20 69 4f  ?"*":"");.    iO
2f560 66 66 20 2b 3d 20 66 74 73 35 44 65 63 6f 64 65  ff += fts5Decode
2f570 50 6f 73 6c 69 73 74 28 70 52 63 2c 20 70 42 75  Poslist(pRc, pBu
2f580 66 2c 20 26 61 5b 69 4f 66 66 5d 2c 20 4d 49 4e  f, &a[iOff], MIN
2f590 28 6e 2d 69 4f 66 66 2c 20 6e 50 6f 73 29 29 3b  (n-iOff, nPos));
2f5a0 0a 20 20 20 20 69 66 28 20 69 4f 66 66 3c 6e 20  .    if( iOff<n 
2f5b0 29 7b 0a 20 20 20 20 20 20 69 36 34 20 69 44 65  ){.      i64 iDe
2f5c0 6c 74 61 3b 0a 20 20 20 20 20 20 69 4f 66 66 20  lta;.      iOff 
2f5d0 2b 3d 20 73 71 6c 69 74 65 33 46 74 73 35 47 65  += sqlite3Fts5Ge
2f5e0 74 56 61 72 69 6e 74 28 26 61 5b 69 4f 66 66 5d  tVarint(&a[iOff]
2f5f0 2c 20 28 75 36 34 2a 29 26 69 44 65 6c 74 61 29  , (u64*)&iDelta)
2f600 3b 0a 20 20 20 20 20 20 69 44 6f 63 69 64 20 2b  ;.      iDocid +
2f610 3d 20 69 44 65 6c 74 61 3b 0a 20 20 20 20 20 20  = iDelta;.      
2f620 73 71 6c 69 74 65 33 46 74 73 35 42 75 66 66 65  sqlite3Fts5Buffe
2f630 72 41 70 70 65 6e 64 50 72 69 6e 74 66 28 70 52  rAppendPrintf(pR
2f640 63 2c 20 70 42 75 66 2c 20 22 20 69 64 3d 25 6c  c, pBuf, " id=%l
2f650 6c 64 22 2c 20 69 44 6f 63 69 64 29 3b 0a 20 20  ld", iDocid);.  
2f660 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72    }.  }..  retur
2f670 6e 20 69 4f 66 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n iOff;.}../*.**
2f680 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
2f690 73 20 70 61 72 74 20 6f 66 20 74 68 65 20 66 74  s part of the ft
2f6a0 73 35 5f 64 65 63 6f 64 65 28 29 20 64 65 62 75  s5_decode() debu
2f6b0 67 67 69 6e 67 20 66 75 6e 63 74 69 6f 6e 2e 20  gging function. 
2f6c0 49 74 20 69 73 20 0a 2a 2a 20 6f 6e 6c 79 20 65  It is .** only e
2f6d0 76 65 72 20 75 73 65 64 20 77 69 74 68 20 64 65  ver used with de
2f6e0 74 61 69 6c 3d 6e 6f 6e 65 20 74 61 62 6c 65 73  tail=none tables
2f6f0 2e 0a 2a 2a 0a 2a 2a 20 42 75 66 66 65 72 20 28  ..**.** Buffer (
2f700 70 44 61 74 61 2f 6e 44 61 74 61 29 20 63 6f 6e  pData/nData) con
2f710 74 61 69 6e 73 20 61 20 64 6f 63 6c 69 73 74 20  tains a doclist 
2f720 69 6e 20 74 68 65 20 66 6f 72 6d 61 74 20 75 73  in the format us
2f730 65 64 20 62 79 20 64 65 74 61 69 6c 3d 6e 6f 6e  ed by detail=non
2f740 65 0a 2a 2a 20 74 61 62 6c 65 73 2e 20 54 68 69  e.** tables. Thi
2f750 73 20 66 75 6e 63 74 69 6f 6e 20 61 70 70 65 6e  s function appen
2f760 64 73 20 61 20 68 75 6d 61 6e 2d 72 65 61 64 61  ds a human-reada
2f770 62 6c 65 20 76 65 72 73 69 6f 6e 20 6f 66 20 74  ble version of t
2f780 68 61 74 20 6c 69 73 74 20 74 6f 0a 2a 2a 20 62  hat list to.** b
2f790 75 66 66 65 72 20 70 42 75 66 2e 0a 2a 2a 0a 2a  uffer pBuf..**.*
2f7a0 2a 20 49 66 20 2a 70 52 63 20 69 73 20 6f 74 68  * If *pRc is oth
2f7b0 65 72 20 74 68 61 6e 20 53 51 4c 49 54 45 5f 4f  er than SQLITE_O
2f7c0 4b 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63  K when this func
2f7d0 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20  tion is called, 
2f7e0 69 74 20 69 73 20 61 0a 2a 2a 20 6e 6f 2d 6f 70  it is a.** no-op
2f7f0 2e 20 49 66 20 61 6e 20 4f 4f 4d 20 6f 72 20 6f  . If an OOM or o
2f800 74 68 65 72 20 65 72 72 6f 72 20 6f 63 63 75 72  ther error occur
2f810 73 20 77 69 74 68 69 6e 20 74 68 69 73 20 66 75  s within this fu
2f820 6e 63 74 69 6f 6e 2c 20 2a 70 52 63 20 69 73 0a  nction, *pRc is.
2f830 2a 2a 20 73 65 74 20 74 6f 20 61 6e 20 53 51 4c  ** set to an SQL
2f840 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 62  ite error code b
2f850 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e  efore returning.
2f860 20 54 68 65 20 66 69 6e 61 6c 20 73 74 61 74 65   The final state
2f870 20 6f 66 20 62 75 66 66 65 72 0a 2a 2a 20 70 42   of buffer.** pB
2f880 75 66 20 69 73 20 75 6e 64 65 66 69 6e 65 64 20  uf is undefined 
2f890 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 2a 2f  in this case..*/
2f8a0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
2f8b0 35 44 65 63 6f 64 65 52 6f 77 69 64 4c 69 73 74  5DecodeRowidList
2f8c0 28 0a 20 20 69 6e 74 20 2a 70 52 63 2c 20 20 20  (.  int *pRc,   
2f8d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f8e0 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 45      /* IN/OUT: E
2f8f0 72 72 6f 72 20 63 6f 64 65 20 2a 2f 0a 20 20 46  rror code */.  F
2f900 74 73 35 42 75 66 66 65 72 20 2a 70 42 75 66 2c  ts5Buffer *pBuf,
2f910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2f920 2a 20 42 75 66 66 65 72 20 74 6f 20 61 70 70 65  * Buffer to appe
2f930 6e 64 20 74 65 78 74 20 74 6f 20 2a 2f 0a 20 20  nd text to */.  
2f940 63 6f 6e 73 74 20 75 38 20 2a 70 44 61 74 61 2c  const u8 *pData,
2f950 20 69 6e 74 20 6e 44 61 74 61 20 20 20 20 20 20   int nData      
2f960 2f 2a 20 44 61 74 61 20 74 6f 20 64 65 63 6f 64  /* Data to decod
2f970 65 20 6c 69 73 74 2d 6f 66 2d 72 6f 77 69 64 73  e list-of-rowids
2f980 20 66 72 6f 6d 20 2a 2f 0a 29 7b 0a 20 20 69 6e   from */.){.  in
2f990 74 20 69 20 3d 20 30 3b 0a 20 20 69 36 34 20 69  t i = 0;.  i64 i
2f9a0 52 6f 77 69 64 20 3d 20 30 3b 0a 0a 20 20 77 68  Rowid = 0;..  wh
2f9b0 69 6c 65 28 20 69 3c 6e 44 61 74 61 20 29 7b 0a  ile( i<nData ){.
2f9c0 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
2f9d0 7a 41 70 70 20 3d 20 22 22 3b 0a 20 20 20 20 75  zApp = "";.    u
2f9e0 36 34 20 69 56 61 6c 3b 0a 20 20 20 20 69 20 2b  64 iVal;.    i +
2f9f0 3d 20 73 71 6c 69 74 65 33 46 74 73 35 47 65 74  = sqlite3Fts5Get
2fa00 56 61 72 69 6e 74 28 26 70 44 61 74 61 5b 69 5d  Varint(&pData[i]
2fa10 2c 20 26 69 56 61 6c 29 3b 0a 20 20 20 20 69 52  , &iVal);.    iR
2fa20 6f 77 69 64 20 2b 3d 20 69 56 61 6c 3b 0a 0a 20  owid += iVal;.. 
2fa30 20 20 20 69 66 28 20 69 3c 6e 44 61 74 61 20 26     if( i<nData &
2fa40 26 20 70 44 61 74 61 5b 69 5d 3d 3d 30 78 30 30  & pData[i]==0x00
2fa50 20 29 7b 0a 20 20 20 20 20 20 69 2b 2b 3b 0a 20   ){.      i++;. 
2fa60 20 20 20 20 20 69 66 28 20 69 3c 6e 44 61 74 61       if( i<nData
2fa70 20 26 26 20 70 44 61 74 61 5b 69 5d 3d 3d 30 78   && pData[i]==0x
2fa80 30 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 2b  00 ){.        i+
2fa90 2b 3b 0a 20 20 20 20 20 20 20 20 7a 41 70 70 20  +;.        zApp 
2faa0 3d 20 22 2b 22 3b 0a 20 20 20 20 20 20 7d 65 6c  = "+";.      }el
2fab0 73 65 7b 0a 20 20 20 20 20 20 20 20 7a 41 70 70  se{.        zApp
2fac0 20 3d 20 22 2a 22 3b 0a 20 20 20 20 20 20 7d 0a   = "*";.      }.
2fad0 20 20 20 20 7d 0a 0a 20 20 20 20 73 71 6c 69 74      }..    sqlit
2fae0 65 33 46 74 73 35 42 75 66 66 65 72 41 70 70 65  e3Fts5BufferAppe
2faf0 6e 64 50 72 69 6e 74 66 28 70 52 63 2c 20 70 42  ndPrintf(pRc, pB
2fb00 75 66 2c 20 22 20 25 6c 6c 64 25 73 22 2c 20 69  uf, " %lld%s", i
2fb10 52 6f 77 69 64 2c 20 7a 41 70 70 29 3b 0a 20 20  Rowid, zApp);.  
2fb20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 69  }.}../*.** The i
2fb30 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66  mplementation of
2fb40 20 75 73 65 72 2d 64 65 66 69 6e 65 64 20 73 63   user-defined sc
2fb50 61 6c 61 72 20 66 75 6e 63 74 69 6f 6e 20 66 74  alar function ft
2fb60 73 35 5f 64 65 63 6f 64 65 28 29 2e 0a 2a 2f 0a  s5_decode()..*/.
2fb70 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
2fb80 44 65 63 6f 64 65 46 75 6e 63 74 69 6f 6e 28 0a  DecodeFunction(.
2fb90 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78    sqlite3_contex
2fba0 74 20 2a 70 43 74 78 2c 20 20 20 20 20 20 20 20  t *pCtx,        
2fbb0 20 20 2f 2a 20 46 75 6e 63 74 69 6f 6e 20 63 61    /* Function ca
2fbc0 6c 6c 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ll context */.  
2fbd0 69 6e 74 20 6e 41 72 67 2c 20 20 20 20 20 20 20  int nArg,       
2fbe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2fbf0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67  /* Number of arg
2fc00 73 20 28 61 6c 77 61 79 73 20 32 29 20 2a 2f 0a  s (always 2) */.
2fc10 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20    sqlite3_value 
2fc20 2a 2a 61 70 56 61 6c 20 20 20 20 20 20 20 20 20  **apVal         
2fc30 20 20 2f 2a 20 46 75 6e 63 74 69 6f 6e 20 61 72    /* Function ar
2fc40 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20  guments */.){.  
2fc50 69 36 34 20 69 52 6f 77 69 64 3b 20 20 20 20 20  i64 iRowid;     
2fc60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2fc70 2f 2a 20 52 6f 77 69 64 20 66 6f 72 20 72 65 63  /* Rowid for rec
2fc80 6f 72 64 20 62 65 69 6e 67 20 64 65 63 6f 64 65  ord being decode
2fc90 64 20 2a 2f 0a 20 20 69 6e 74 20 69 53 65 67 69  d */.  int iSegi
2fca0 64 2c 69 48 65 69 67 68 74 2c 69 50 67 6e 6f 2c  d,iHeight,iPgno,
2fcb0 62 44 6c 69 64 78 3b 2f 2a 20 52 6f 77 69 64 20  bDlidx;/* Rowid 
2fcc0 63 6f 6d 70 6f 6e 65 6e 74 73 20 2a 2f 0a 20 20  components */.  
2fcd0 63 6f 6e 73 74 20 75 38 20 2a 61 42 6c 6f 62 3b  const u8 *aBlob;
2fce0 20 69 6e 74 20 6e 3b 20 20 20 20 20 20 20 20 20   int n;         
2fcf0 2f 2a 20 52 65 63 6f 72 64 20 74 6f 20 64 65 63  /* Record to dec
2fd00 6f 64 65 20 2a 2f 0a 20 20 75 38 20 2a 61 20 3d  ode */.  u8 *a =
2fd10 20 30 3b 0a 20 20 46 74 73 35 42 75 66 66 65 72   0;.  Fts5Buffer
2fd20 20 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   s;             
2fd30 20 20 20 20 20 20 2f 2a 20 42 75 69 6c 64 20 75        /* Build u
2fd40 70 20 74 65 78 74 20 74 6f 20 72 65 74 75 72 6e  p text to return
2fd50 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20 72   here */.  int r
2fd60 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  c = SQLITE_OK;  
2fd70 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
2fd80 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69  turn code */.  i
2fd90 6e 74 20 6e 53 70 61 63 65 20 3d 20 30 3b 0a 20  nt nSpace = 0;. 
2fda0 20 69 6e 74 20 65 44 65 74 61 69 6c 4e 6f 6e 65   int eDetailNone
2fdb0 20 3d 20 28 73 71 6c 69 74 65 33 5f 75 73 65 72   = (sqlite3_user
2fdc0 5f 64 61 74 61 28 70 43 74 78 29 21 3d 30 29 3b  _data(pCtx)!=0);
2fdd0 0a 0a 20 20 61 73 73 65 72 74 28 20 6e 41 72 67  ..  assert( nArg
2fde0 3d 3d 32 20 29 3b 0a 20 20 55 4e 55 53 45 44 5f  ==2 );.  UNUSED_
2fdf0 50 41 52 41 4d 28 6e 41 72 67 29 3b 0a 20 20 6d  PARAM(nArg);.  m
2fe00 65 6d 73 65 74 28 26 73 2c 20 30 2c 20 73 69 7a  emset(&s, 0, siz
2fe10 65 6f 66 28 46 74 73 35 42 75 66 66 65 72 29 29  eof(Fts5Buffer))
2fe20 3b 0a 20 20 69 52 6f 77 69 64 20 3d 20 73 71 6c  ;.  iRowid = sql
2fe30 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 36 34  ite3_value_int64
2fe40 28 61 70 56 61 6c 5b 30 5d 29 3b 0a 0a 20 20 2f  (apVal[0]);..  /
2fe50 2a 20 4d 61 6b 65 20 61 20 63 6f 70 79 20 6f 66  * Make a copy of
2fe60 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
2fe70 6d 65 6e 74 20 28 61 20 62 6c 6f 62 29 20 69 6e  ment (a blob) in
2fe80 20 61 42 6c 6f 62 5b 5d 2e 20 54 68 65 20 61 42   aBlob[]. The aB
2fe90 6c 6f 62 5b 5d 0a 20 20 2a 2a 20 63 6f 70 79 20  lob[].  ** copy 
2fea0 69 73 20 66 6f 6c 6c 6f 77 65 64 20 62 79 20 46  is followed by F
2feb0 54 53 35 5f 44 41 54 41 5f 5a 45 52 4f 5f 50 41  TS5_DATA_ZERO_PA
2fec0 44 44 49 4e 47 20 30 78 30 30 20 62 79 74 65 73  DDING 0x00 bytes
2fed0 2c 20 77 68 69 63 68 20 70 72 65 76 65 6e 74 73  , which prevents
2fee0 0a 20 20 2a 2a 20 62 75 66 66 65 72 20 6f 76 65  .  ** buffer ove
2fef0 72 72 65 61 64 73 20 65 76 65 6e 20 69 66 20 74  rreads even if t
2ff00 68 65 20 72 65 63 6f 72 64 20 69 73 20 63 6f 72  he record is cor
2ff10 72 75 70 74 2e 20 20 2a 2f 0a 20 20 6e 20 3d 20  rupt.  */.  n = 
2ff20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 79  sqlite3_value_by
2ff30 74 65 73 28 61 70 56 61 6c 5b 31 5d 29 3b 0a 20  tes(apVal[1]);. 
2ff40 20 61 42 6c 6f 62 20 3d 20 73 71 6c 69 74 65 33   aBlob = sqlite3
2ff50 5f 76 61 6c 75 65 5f 62 6c 6f 62 28 61 70 56 61  _value_blob(apVa
2ff60 6c 5b 31 5d 29 3b 0a 20 20 6e 53 70 61 63 65 20  l[1]);.  nSpace 
2ff70 3d 20 6e 20 2b 20 46 54 53 35 5f 44 41 54 41 5f  = n + FTS5_DATA_
2ff80 5a 45 52 4f 5f 50 41 44 44 49 4e 47 3b 0a 20 20  ZERO_PADDING;.  
2ff90 61 20 3d 20 28 75 38 2a 29 73 71 6c 69 74 65 33  a = (u8*)sqlite3
2ffa0 46 74 73 35 4d 61 6c 6c 6f 63 5a 65 72 6f 28 26  Fts5MallocZero(&
2ffb0 72 63 2c 20 6e 53 70 61 63 65 29 3b 0a 20 20 69  rc, nSpace);.  i
2ffc0 66 28 20 61 3d 3d 30 20 29 20 67 6f 74 6f 20 64  f( a==0 ) goto d
2ffd0 65 63 6f 64 65 5f 6f 75 74 3b 0a 20 20 6d 65 6d  ecode_out;.  mem
2ffe0 63 70 79 28 61 2c 20 61 42 6c 6f 62 2c 20 6e 29  cpy(a, aBlob, n)
2fff0 3b 0a 0a 0a 20 20 66 74 73 35 44 65 63 6f 64 65  ;...  fts5Decode
30000 52 6f 77 69 64 28 69 52 6f 77 69 64 2c 20 26 69  Rowid(iRowid, &i
30010 53 65 67 69 64 2c 20 26 62 44 6c 69 64 78 2c 20  Segid, &bDlidx, 
30020 26 69 48 65 69 67 68 74 2c 20 26 69 50 67 6e 6f  &iHeight, &iPgno
30030 29 3b 0a 0a 20 20 66 74 73 35 44 65 62 75 67 52  );..  fts5DebugR
30040 6f 77 69 64 28 26 72 63 2c 20 26 73 2c 20 69 52  owid(&rc, &s, iR
30050 6f 77 69 64 29 3b 0a 20 20 69 66 28 20 62 44 6c  owid);.  if( bDl
30060 69 64 78 20 29 7b 0a 20 20 20 20 46 74 73 35 44  idx ){.    Fts5D
30070 61 74 61 20 64 6c 69 64 78 3b 0a 20 20 20 20 46  ata dlidx;.    F
30080 74 73 35 44 6c 69 64 78 4c 76 6c 20 6c 76 6c 3b  ts5DlidxLvl lvl;
30090 0a 0a 20 20 20 20 64 6c 69 64 78 2e 70 20 3d 20  ..    dlidx.p = 
300a0 61 3b 0a 20 20 20 20 64 6c 69 64 78 2e 6e 6e 20  a;.    dlidx.nn 
300b0 3d 20 6e 3b 0a 0a 20 20 20 20 6d 65 6d 73 65 74  = n;..    memset
300c0 28 26 6c 76 6c 2c 20 30 2c 20 73 69 7a 65 6f 66  (&lvl, 0, sizeof
300d0 28 46 74 73 35 44 6c 69 64 78 4c 76 6c 29 29 3b  (Fts5DlidxLvl));
300e0 0a 20 20 20 20 6c 76 6c 2e 70 44 61 74 61 20 3d  .    lvl.pData =
300f0 20 26 64 6c 69 64 78 3b 0a 20 20 20 20 6c 76 6c   &dlidx;.    lvl
30100 2e 69 4c 65 61 66 50 67 6e 6f 20 3d 20 69 50 67  .iLeafPgno = iPg
30110 6e 6f 3b 0a 0a 20 20 20 20 66 6f 72 28 66 74 73  no;..    for(fts
30120 35 44 6c 69 64 78 4c 76 6c 4e 65 78 74 28 26 6c  5DlidxLvlNext(&l
30130 76 6c 29 3b 20 6c 76 6c 2e 62 45 6f 66 3d 3d 30  vl); lvl.bEof==0
30140 3b 20 66 74 73 35 44 6c 69 64 78 4c 76 6c 4e 65  ; fts5DlidxLvlNe
30150 78 74 28 26 6c 76 6c 29 29 7b 0a 20 20 20 20 20  xt(&lvl)){.     
30160 20 73 71 6c 69 74 65 33 46 74 73 35 42 75 66 66   sqlite3Fts5Buff
30170 65 72 41 70 70 65 6e 64 50 72 69 6e 74 66 28 26  erAppendPrintf(&
30180 72 63 2c 20 26 73 2c 20 0a 20 20 20 20 20 20 20  rc, &s, .       
30190 20 20 20 22 20 25 64 28 25 6c 6c 64 29 22 2c 20     " %d(%lld)", 
301a0 6c 76 6c 2e 69 4c 65 61 66 50 67 6e 6f 2c 20 6c  lvl.iLeafPgno, l
301b0 76 6c 2e 69 52 6f 77 69 64 0a 20 20 20 20 20 20  vl.iRowid.      
301c0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  );.    }.  }else
301d0 20 69 66 28 20 69 53 65 67 69 64 3d 3d 30 20 29   if( iSegid==0 )
301e0 7b 0a 20 20 20 20 69 66 28 20 69 52 6f 77 69 64  {.    if( iRowid
301f0 3d 3d 46 54 53 35 5f 41 56 45 52 41 47 45 53 5f  ==FTS5_AVERAGES_
30200 52 4f 57 49 44 20 29 7b 0a 20 20 20 20 20 20 66  ROWID ){.      f
30210 74 73 35 44 65 63 6f 64 65 41 76 65 72 61 67 65  ts5DecodeAverage
30220 73 28 26 72 63 2c 20 26 73 2c 20 61 2c 20 6e 29  s(&rc, &s, a, n)
30230 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
30240 20 20 20 66 74 73 35 44 65 63 6f 64 65 53 74 72     fts5DecodeStr
30250 75 63 74 75 72 65 28 26 72 63 2c 20 26 73 2c 20  ucture(&rc, &s, 
30260 61 2c 20 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  a, n);.    }.  }
30270 65 6c 73 65 20 69 66 28 20 65 44 65 74 61 69 6c  else if( eDetail
30280 4e 6f 6e 65 20 29 7b 0a 20 20 20 20 46 74 73 35  None ){.    Fts5
30290 42 75 66 66 65 72 20 74 65 72 6d 3b 20 20 20 20  Buffer term;    
302a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72            /* Cur
302b0 72 65 6e 74 20 74 65 72 6d 20 72 65 61 64 20 66  rent term read f
302c0 72 6f 6d 20 70 61 67 65 20 2a 2f 0a 20 20 20 20  rom page */.    
302d0 69 6e 74 20 73 7a 4c 65 61 66 3b 0a 20 20 20 20  int szLeaf;.    
302e0 69 6e 74 20 69 50 67 69 64 78 4f 66 66 20 3d 20  int iPgidxOff = 
302f0 73 7a 4c 65 61 66 20 3d 20 66 74 73 35 47 65 74  szLeaf = fts5Get
30300 55 31 36 28 26 61 5b 32 5d 29 3b 0a 20 20 20 20  U16(&a[2]);.    
30310 69 6e 74 20 69 54 65 72 6d 4f 66 66 3b 0a 20 20  int iTermOff;.  
30320 20 20 69 6e 74 20 6e 4b 65 65 70 20 3d 20 30 3b    int nKeep = 0;
30330 0a 20 20 20 20 69 6e 74 20 69 4f 66 66 3b 0a 0a  .    int iOff;..
30340 20 20 20 20 6d 65 6d 73 65 74 28 26 74 65 72 6d      memset(&term
30350 2c 20 30 2c 20 73 69 7a 65 6f 66 28 46 74 73 35  , 0, sizeof(Fts5
30360 42 75 66 66 65 72 29 29 3b 0a 0a 20 20 20 20 2f  Buffer));..    /
30370 2a 20 44 65 63 6f 64 65 20 61 6e 79 20 65 6e 74  * Decode any ent
30380 72 69 65 73 20 74 68 61 74 20 6f 63 63 75 72 20  ries that occur 
30390 62 65 66 6f 72 65 20 74 68 65 20 66 69 72 73 74  before the first
303a0 20 74 65 72 6d 2e 20 2a 2f 0a 20 20 20 20 69 66   term. */.    if
303b0 28 20 73 7a 4c 65 61 66 3c 6e 20 29 7b 0a 20 20  ( szLeaf<n ){.  
303c0 20 20 20 20 69 50 67 69 64 78 4f 66 66 20 2b 3d      iPgidxOff +=
303d0 20 66 74 73 35 47 65 74 56 61 72 69 6e 74 33 32   fts5GetVarint32
303e0 28 26 61 5b 69 50 67 69 64 78 4f 66 66 5d 2c 20  (&a[iPgidxOff], 
303f0 69 54 65 72 6d 4f 66 66 29 3b 0a 20 20 20 20 7d  iTermOff);.    }
30400 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 54 65 72  else{.      iTer
30410 6d 4f 66 66 20 3d 20 73 7a 4c 65 61 66 3b 0a 20  mOff = szLeaf;. 
30420 20 20 20 7d 0a 20 20 20 20 66 74 73 35 44 65 63     }.    fts5Dec
30430 6f 64 65 52 6f 77 69 64 4c 69 73 74 28 26 72 63  odeRowidList(&rc
30440 2c 20 26 73 2c 20 26 61 5b 34 5d 2c 20 69 54 65  , &s, &a[4], iTe
30450 72 6d 4f 66 66 2d 34 29 3b 0a 0a 20 20 20 20 69  rmOff-4);..    i
30460 4f 66 66 20 3d 20 69 54 65 72 6d 4f 66 66 3b 0a  Off = iTermOff;.
30470 20 20 20 20 77 68 69 6c 65 28 20 69 4f 66 66 3c      while( iOff<
30480 73 7a 4c 65 61 66 20 29 7b 0a 20 20 20 20 20 20  szLeaf ){.      
30490 69 6e 74 20 6e 41 70 70 65 6e 64 3b 0a 0a 20 20  int nAppend;..  
304a0 20 20 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20      /* Read the 
304b0 74 65 72 6d 20 64 61 74 61 20 66 6f 72 20 74 68  term data for th
304c0 65 20 6e 65 78 74 20 74 65 72 6d 2a 2f 0a 20 20  e next term*/.  
304d0 20 20 20 20 69 4f 66 66 20 2b 3d 20 66 74 73 35      iOff += fts5
304e0 47 65 74 56 61 72 69 6e 74 33 32 28 26 61 5b 69  GetVarint32(&a[i
304f0 4f 66 66 5d 2c 20 6e 41 70 70 65 6e 64 29 3b 0a  Off], nAppend);.
30500 20 20 20 20 20 20 74 65 72 6d 2e 6e 20 3d 20 6e        term.n = n
30510 4b 65 65 70 3b 0a 20 20 20 20 20 20 66 74 73 35  Keep;.      fts5
30520 42 75 66 66 65 72 41 70 70 65 6e 64 42 6c 6f 62  BufferAppendBlob
30530 28 26 72 63 2c 20 26 74 65 72 6d 2c 20 6e 41 70  (&rc, &term, nAp
30540 70 65 6e 64 2c 20 26 61 5b 69 4f 66 66 5d 29 3b  pend, &a[iOff]);
30550 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 46 74  .      sqlite3Ft
30560 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 50 72  s5BufferAppendPr
30570 69 6e 74 66 28 0a 20 20 20 20 20 20 20 20 20 20  intf(.          
30580 26 72 63 2c 20 26 73 2c 20 22 20 74 65 72 6d 3d  &rc, &s, " term=
30590 25 2e 2a 73 22 2c 20 74 65 72 6d 2e 6e 2c 20 28  %.*s", term.n, (
305a0 63 6f 6e 73 74 20 63 68 61 72 2a 29 74 65 72 6d  const char*)term
305b0 2e 70 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20  .p.      );.    
305c0 20 20 69 4f 66 66 20 2b 3d 20 6e 41 70 70 65 6e    iOff += nAppen
305d0 64 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 46 69 67  d;..      /* Fig
305e0 75 72 65 20 6f 75 74 20 77 68 65 72 65 20 74 68  ure out where th
305f0 65 20 64 6f 63 6c 69 73 74 20 66 6f 72 20 74 68  e doclist for th
30600 69 73 20 74 65 72 6d 20 65 6e 64 73 20 2a 2f 0a  is term ends */.
30610 20 20 20 20 20 20 69 66 28 20 69 50 67 69 64 78        if( iPgidx
30620 4f 66 66 3c 6e 20 29 7b 0a 20 20 20 20 20 20 20  Off<n ){.       
30630 20 69 6e 74 20 6e 49 6e 63 72 3b 0a 20 20 20 20   int nIncr;.    
30640 20 20 20 20 69 50 67 69 64 78 4f 66 66 20 2b 3d      iPgidxOff +=
30650 20 66 74 73 35 47 65 74 56 61 72 69 6e 74 33 32   fts5GetVarint32
30660 28 26 61 5b 69 50 67 69 64 78 4f 66 66 5d 2c 20  (&a[iPgidxOff], 
30670 6e 49 6e 63 72 29 3b 0a 20 20 20 20 20 20 20 20  nIncr);.        
30680 69 54 65 72 6d 4f 66 66 20 2b 3d 20 6e 49 6e 63  iTermOff += nInc
30690 72 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  r;.      }else{.
306a0 20 20 20 20 20 20 20 20 69 54 65 72 6d 4f 66 66          iTermOff
306b0 20 3d 20 73 7a 4c 65 61 66 3b 0a 20 20 20 20 20   = szLeaf;.     
306c0 20 7d 0a 0a 20 20 20 20 20 20 66 74 73 35 44 65   }..      fts5De
306d0 63 6f 64 65 52 6f 77 69 64 4c 69 73 74 28 26 72  codeRowidList(&r
306e0 63 2c 20 26 73 2c 20 26 61 5b 69 4f 66 66 5d 2c  c, &s, &a[iOff],
306f0 20 69 54 65 72 6d 4f 66 66 2d 69 4f 66 66 29 3b   iTermOff-iOff);
30700 0a 20 20 20 20 20 20 69 4f 66 66 20 3d 20 69 54  .      iOff = iT
30710 65 72 6d 4f 66 66 3b 0a 20 20 20 20 20 20 69 66  ermOff;.      if
30720 28 20 69 4f 66 66 3c 73 7a 4c 65 61 66 20 29 7b  ( iOff<szLeaf ){
30730 0a 20 20 20 20 20 20 20 20 69 4f 66 66 20 2b 3d  .        iOff +=
30740 20 66 74 73 35 47 65 74 56 61 72 69 6e 74 33 32   fts5GetVarint32
30750 28 26 61 5b 69 4f 66 66 5d 2c 20 6e 4b 65 65 70  (&a[iOff], nKeep
30760 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
30770 0a 0a 20 20 20 20 66 74 73 35 42 75 66 66 65 72  ..    fts5Buffer
30780 46 72 65 65 28 26 74 65 72 6d 29 3b 0a 20 20 7d  Free(&term);.  }
30790 65 6c 73 65 7b 0a 20 20 20 20 46 74 73 35 42 75  else{.    Fts5Bu
307a0 66 66 65 72 20 74 65 72 6d 3b 20 20 20 20 20 20  ffer term;      
307b0 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65          /* Curre
307c0 6e 74 20 74 65 72 6d 20 72 65 61 64 20 66 72 6f  nt term read fro
307d0 6d 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 69 6e  m page */.    in
307e0 74 20 73 7a 4c 65 61 66 3b 20 20 20 20 20 20 20  t szLeaf;       
307f0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
30800 66 66 73 65 74 20 6f 66 20 70 67 69 64 78 20 69  ffset of pgidx i
30810 6e 20 61 5b 5d 20 2a 2f 0a 20 20 20 20 69 6e 74  n a[] */.    int
30820 20 69 50 67 69 64 78 4f 66 66 3b 0a 20 20 20 20   iPgidxOff;.    
30830 69 6e 74 20 69 50 67 69 64 78 50 72 65 76 20 3d  int iPgidxPrev =
30840 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a   0;           /*
30850 20 50 72 65 76 69 6f 75 73 20 76 61 6c 75 65 20   Previous value 
30860 72 65 61 64 20 66 72 6f 6d 20 70 67 69 64 78 20  read from pgidx 
30870 2a 2f 0a 20 20 20 20 69 6e 74 20 69 54 65 72 6d  */.    int iTerm
30880 4f 66 66 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74  Off = 0;.    int
30890 20 69 52 6f 77 69 64 4f 66 66 20 3d 20 30 3b 0a   iRowidOff = 0;.
308a0 20 20 20 20 69 6e 74 20 69 4f 66 66 3b 0a 20 20      int iOff;.  
308b0 20 20 69 6e 74 20 6e 44 6f 63 6c 69 73 74 3b 0a    int nDoclist;.
308c0 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 74 65 72  .    memset(&ter
308d0 6d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 46 74 73  m, 0, sizeof(Fts
308e0 35 42 75 66 66 65 72 29 29 3b 0a 0a 20 20 20 20  5Buffer));..    
308f0 69 66 28 20 6e 3c 34 20 29 7b 0a 20 20 20 20 20  if( n<4 ){.     
30900 20 73 71 6c 69 74 65 33 46 74 73 35 42 75 66 66   sqlite3Fts5Buff
30910 65 72 53 65 74 28 26 72 63 2c 20 26 73 2c 20 37  erSet(&rc, &s, 7
30920 2c 20 28 63 6f 6e 73 74 20 75 38 2a 29 22 63 6f  , (const u8*)"co
30930 72 72 75 70 74 22 29 3b 0a 20 20 20 20 20 20 67  rrupt");.      g
30940 6f 74 6f 20 64 65 63 6f 64 65 5f 6f 75 74 3b 0a  oto decode_out;.
30950 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
30960 20 69 52 6f 77 69 64 4f 66 66 20 3d 20 66 74 73   iRowidOff = fts
30970 35 47 65 74 55 31 36 28 26 61 5b 30 5d 29 3b 0a  5GetU16(&a[0]);.
30980 20 20 20 20 20 20 69 50 67 69 64 78 4f 66 66 20        iPgidxOff 
30990 3d 20 73 7a 4c 65 61 66 20 3d 20 66 74 73 35 47  = szLeaf = fts5G
309a0 65 74 55 31 36 28 26 61 5b 32 5d 29 3b 0a 20 20  etU16(&a[2]);.  
309b0 20 20 20 20 69 66 28 20 69 50 67 69 64 78 4f 66      if( iPgidxOf
309c0 66 3c 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 66  f<n ){.        f
309d0 74 73 35 47 65 74 56 61 72 69 6e 74 33 32 28 26  ts5GetVarint32(&
309e0 61 5b 69 50 67 69 64 78 4f 66 66 5d 2c 20 69 54  a[iPgidxOff], iT
309f0 65 72 6d 4f 66 66 29 3b 0a 20 20 20 20 20 20 7d  ermOff);.      }
30a00 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44  .    }..    /* D
30a10 65 63 6f 64 65 20 74 68 65 20 70 6f 73 69 74 69  ecode the positi
30a20 6f 6e 20 6c 69 73 74 20 74 61 69 6c 20 61 74 20  on list tail at 
30a30 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
30a40 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 69 66 28   page */.    if(
30a50 20 69 52 6f 77 69 64 4f 66 66 21 3d 30 20 29 7b   iRowidOff!=0 ){
30a60 0a 20 20 20 20 20 20 69 4f 66 66 20 3d 20 69 52  .      iOff = iR
30a70 6f 77 69 64 4f 66 66 3b 0a 20 20 20 20 7d 65 6c  owidOff;.    }el
30a80 73 65 20 69 66 28 20 69 54 65 72 6d 4f 66 66 21  se if( iTermOff!
30a90 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 4f 66 66  =0 ){.      iOff
30aa0 20 3d 20 69 54 65 72 6d 4f 66 66 3b 0a 20 20 20   = iTermOff;.   
30ab0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 4f   }else{.      iO
30ac0 66 66 20 3d 20 73 7a 4c 65 61 66 3b 0a 20 20 20  ff = szLeaf;.   
30ad0 20 7d 0a 20 20 20 20 66 74 73 35 44 65 63 6f 64   }.    fts5Decod
30ae0 65 50 6f 73 6c 69 73 74 28 26 72 63 2c 20 26 73  ePoslist(&rc, &s
30af0 2c 20 26 61 5b 34 5d 2c 20 69 4f 66 66 2d 34 29  , &a[4], iOff-4)
30b00 3b 0a 0a 20 20 20 20 2f 2a 20 44 65 63 6f 64 65  ;..    /* Decode
30b10 20 61 6e 79 20 6d 6f 72 65 20 64 6f 63 6c 69 73   any more doclis
30b20 74 20 64 61 74 61 20 74 68 61 74 20 61 70 70 65  t data that appe
30b30 61 72 73 20 6f 6e 20 74 68 65 20 70 61 67 65 20  ars on the page 
30b40 62 65 66 6f 72 65 20 74 68 65 0a 20 20 20 20 2a  before the.    *
30b50 2a 20 66 69 72 73 74 20 74 65 72 6d 2e 20 2a 2f  * first term. */
30b60 0a 20 20 20 20 6e 44 6f 63 6c 69 73 74 20 3d 20  .    nDoclist = 
30b70 28 69 54 65 72 6d 4f 66 66 20 3f 20 69 54 65 72  (iTermOff ? iTer
30b80 6d 4f 66 66 20 3a 20 73 7a 4c 65 61 66 29 20 2d  mOff : szLeaf) -
30b90 20 69 4f 66 66 3b 0a 20 20 20 20 66 74 73 35 44   iOff;.    fts5D
30ba0 65 63 6f 64 65 44 6f 63 6c 69 73 74 28 26 72 63  ecodeDoclist(&rc
30bb0 2c 20 26 73 2c 20 26 61 5b 69 4f 66 66 5d 2c 20  , &s, &a[iOff], 
30bc0 6e 44 6f 63 6c 69 73 74 29 3b 0a 0a 20 20 20 20  nDoclist);..    
30bd0 77 68 69 6c 65 28 20 69 50 67 69 64 78 4f 66 66  while( iPgidxOff
30be0 3c 6e 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  <n ){.      int 
30bf0 62 46 69 72 73 74 20 3d 20 28 69 50 67 69 64 78  bFirst = (iPgidx
30c00 4f 66 66 3d 3d 73 7a 4c 65 61 66 29 3b 20 20 20  Off==szLeaf);   
30c10 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 66 69    /* True for fi
30c20 72 73 74 20 74 65 72 6d 20 6f 6e 20 70 61 67 65  rst term on page
30c30 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e 42   */.      int nB
30c40 79 74 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  yte;            
30c50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30c60 2f 2a 20 42 79 74 65 73 20 6f 66 20 64 61 74 61  /* Bytes of data
30c70 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 69 45   */.      int iE
30c80 6e 64 3b 0a 20 20 20 20 20 20 0a 20 20 20 20 20  nd;.      .     
30c90 20 69 50 67 69 64 78 4f 66 66 20 2b 3d 20 66 74   iPgidxOff += ft
30ca0 73 35 47 65 74 56 61 72 69 6e 74 33 32 28 26 61  s5GetVarint32(&a
30cb0 5b 69 50 67 69 64 78 4f 66 66 5d 2c 20 6e 42 79  [iPgidxOff], nBy
30cc0 74 65 29 3b 0a 20 20 20 20 20 20 69 50 67 69 64  te);.      iPgid
30cd0 78 50 72 65 76 20 2b 3d 20 6e 42 79 74 65 3b 0a  xPrev += nByte;.
30ce0 20 20 20 20 20 20 69 4f 66 66 20 3d 20 69 50 67        iOff = iPg
30cf0 69 64 78 50 72 65 76 3b 0a 0a 20 20 20 20 20 20  idxPrev;..      
30d00 69 66 28 20 69 50 67 69 64 78 4f 66 66 3c 6e 20  if( iPgidxOff<n 
30d10 29 7b 0a 20 20 20 20 20 20 20 20 66 74 73 35 47  ){.        fts5G
30d20 65 74 56 61 72 69 6e 74 33 32 28 26 61 5b 69 50  etVarint32(&a[iP
30d30 67 69 64 78 4f 66 66 5d 2c 20 6e 42 79 74 65 29  gidxOff], nByte)
30d40 3b 0a 20 20 20 20 20 20 20 20 69 45 6e 64 20 3d  ;.        iEnd =
30d50 20 69 50 67 69 64 78 50 72 65 76 20 2b 20 6e 42   iPgidxPrev + nB
30d60 79 74 65 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  yte;.      }else
30d70 7b 0a 20 20 20 20 20 20 20 20 69 45 6e 64 20 3d  {.        iEnd =
30d80 20 73 7a 4c 65 61 66 3b 0a 20 20 20 20 20 20 7d   szLeaf;.      }
30d90 0a 0a 20 20 20 20 20 20 69 66 28 20 62 46 69 72  ..      if( bFir
30da0 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  st==0 ){.       
30db0 20 69 4f 66 66 20 2b 3d 20 66 74 73 35 47 65 74   iOff += fts5Get
30dc0 56 61 72 69 6e 74 33 32 28 26 61 5b 69 4f 66 66  Varint32(&a[iOff
30dd0 5d 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20 20 20  ], nByte);.     
30de0 20 20 20 74 65 72 6d 2e 6e 20 3d 20 6e 42 79 74     term.n = nByt
30df0 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  e;.      }.     
30e00 20 69 4f 66 66 20 2b 3d 20 66 74 73 35 47 65 74   iOff += fts5Get
30e10 56 61 72 69 6e 74 33 32 28 26 61 5b 69 4f 66 66  Varint32(&a[iOff
30e20 5d 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20 20 20  ], nByte);.     
30e30 20 66 74 73 35 42 75 66 66 65 72 41 70 70 65 6e   fts5BufferAppen
30e40 64 42 6c 6f 62 28 26 72 63 2c 20 26 74 65 72 6d  dBlob(&rc, &term
30e50 2c 20 6e 42 79 74 65 2c 20 26 61 5b 69 4f 66 66  , nByte, &a[iOff
30e60 5d 29 3b 0a 20 20 20 20 20 20 69 4f 66 66 20 2b  ]);.      iOff +
30e70 3d 20 6e 42 79 74 65 3b 0a 0a 20 20 20 20 20 20  = nByte;..      
30e80 73 71 6c 69 74 65 33 46 74 73 35 42 75 66 66 65  sqlite3Fts5Buffe
30e90 72 41 70 70 65 6e 64 50 72 69 6e 74 66 28 0a 20  rAppendPrintf(. 
30ea0 20 20 20 20 20 20 20 20 20 26 72 63 2c 20 26 73           &rc, &s
30eb0 2c 20 22 20 74 65 72 6d 3d 25 2e 2a 73 22 2c 20  , " term=%.*s", 
30ec0 74 65 72 6d 2e 6e 2c 20 28 63 6f 6e 73 74 20 63  term.n, (const c
30ed0 68 61 72 2a 29 74 65 72 6d 2e 70 0a 20 20 20 20  har*)term.p.    
30ee0 20 20 29 3b 0a 20 20 20 20 20 20 69 4f 66 66 20    );.      iOff 
30ef0 2b 3d 20 66 74 73 35 44 65 63 6f 64 65 44 6f 63  += fts5DecodeDoc
30f00 6c 69 73 74 28 26 72 63 2c 20 26 73 2c 20 26 61  list(&rc, &s, &a
30f10 5b 69 4f 66 66 5d 2c 20 69 45 6e 64 2d 69 4f 66  [iOff], iEnd-iOf
30f20 66 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 66  f);.    }..    f
30f30 74 73 35 42 75 66 66 65 72 46 72 65 65 28 26 74  ts5BufferFree(&t
30f40 65 72 6d 29 3b 0a 20 20 7d 0a 20 20 0a 20 64 65  erm);.  }.  . de
30f50 63 6f 64 65 5f 6f 75 74 3a 0a 20 20 73 71 6c 69  code_out:.  sqli
30f60 74 65 33 5f 66 72 65 65 28 61 29 3b 0a 20 20 69  te3_free(a);.  i
30f70 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
30f80 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
30f90 72 65 73 75 6c 74 5f 74 65 78 74 28 70 43 74 78  result_text(pCtx
30fa0 2c 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73  , (const char*)s
30fb0 2e 70 2c 20 73 2e 6e 2c 20 53 51 4c 49 54 45 5f  .p, s.n, SQLITE_
30fc0 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 7d 65  TRANSIENT);.  }e
30fd0 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  lse{.    sqlite3
30fe0 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 5f 63 6f  _result_error_co
30ff0 64 65 28 70 43 74 78 2c 20 72 63 29 3b 0a 20 20  de(pCtx, rc);.  
31000 7d 0a 20 20 66 74 73 35 42 75 66 66 65 72 46 72  }.  fts5BufferFr
31010 65 65 28 26 73 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ee(&s);.}../*.**
31020 20 54 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74   The implementat
31030 69 6f 6e 20 6f 66 20 75 73 65 72 2d 64 65 66 69  ion of user-defi
31040 6e 65 64 20 73 63 61 6c 61 72 20 66 75 6e 63 74  ned scalar funct
31050 69 6f 6e 20 66 74 73 35 5f 72 6f 77 69 64 28 29  ion fts5_rowid()
31060 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
31070 20 66 74 73 35 52 6f 77 69 64 46 75 6e 63 74 69   fts5RowidFuncti
31080 6f 6e 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f  on(.  sqlite3_co
31090 6e 74 65 78 74 20 2a 70 43 74 78 2c 20 20 20 20  ntext *pCtx,    
310a0 20 20 20 20 20 20 2f 2a 20 46 75 6e 63 74 69 6f        /* Functio
310b0 6e 20 63 61 6c 6c 20 63 6f 6e 74 65 78 74 20 2a  n call context *
310c0 2f 0a 20 20 69 6e 74 20 6e 41 72 67 2c 20 20 20  /.  int nArg,   
310d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
310e0 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
310f0 20 61 72 67 73 20 28 61 6c 77 61 79 73 20 32 29   args (always 2)
31100 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76 61   */.  sqlite3_va
31110 6c 75 65 20 2a 2a 61 70 56 61 6c 20 20 20 20 20  lue **apVal     
31120 20 20 20 20 20 20 2f 2a 20 46 75 6e 63 74 69 6f        /* Functio
31130 6e 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29  n arguments */.)
31140 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  {.  const char *
31150 7a 41 72 67 3b 0a 20 20 69 66 28 20 6e 41 72 67  zArg;.  if( nArg
31160 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ==0 ){.    sqlit
31170 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 28  e3_result_error(
31180 70 43 74 78 2c 20 22 73 68 6f 75 6c 64 20 62 65  pCtx, "should be
31190 3a 20 66 74 73 35 5f 72 6f 77 69 64 28 73 75 62  : fts5_rowid(sub
311a0 6a 65 63 74 2c 20 2e 2e 2e 2e 29 22 2c 20 2d 31  ject, ....)", -1
311b0 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
311c0 7a 41 72 67 20 3d 20 28 63 6f 6e 73 74 20 63 68  zArg = (const ch
311d0 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75  ar*)sqlite3_valu
311e0 65 5f 74 65 78 74 28 61 70 56 61 6c 5b 30 5d 29  e_text(apVal[0])
311f0 3b 0a 20 20 20 20 69 66 28 20 30 3d 3d 73 71 6c  ;.    if( 0==sql
31200 69 74 65 33 5f 73 74 72 69 63 6d 70 28 7a 41 72  ite3_stricmp(zAr
31210 67 2c 20 22 73 65 67 6d 65 6e 74 22 29 20 29 7b  g, "segment") ){
31220 0a 20 20 20 20 20 20 69 36 34 20 69 52 6f 77 69  .      i64 iRowi
31230 64 3b 0a 20 20 20 20 20 20 69 6e 74 20 73 65 67  d;.      int seg
31240 69 64 2c 20 70 67 6e 6f 3b 0a 20 20 20 20 20 20  id, pgno;.      
31250 69 66 28 20 6e 41 72 67 21 3d 33 20 29 7b 0a 20  if( nArg!=3 ){. 
31260 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72         sqlite3_r
31270 65 73 75 6c 74 5f 65 72 72 6f 72 28 70 43 74 78  esult_error(pCtx
31280 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 22  , .            "
31290 73 68 6f 75 6c 64 20 62 65 3a 20 66 74 73 35 5f  should be: fts5_
312a0 72 6f 77 69 64 28 27 73 65 67 6d 65 6e 74 27 2c  rowid('segment',
312b0 20 73 65 67 69 64 2c 20 70 67 6e 6f 29 29 22 2c   segid, pgno))",
312c0 20 2d 31 0a 20 20 20 20 20 20 20 20 29 3b 0a 20   -1.        );. 
312d0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
312e0 20 20 20 20 73 65 67 69 64 20 3d 20 73 71 6c 69      segid = sqli
312f0 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 28 61 70  te3_value_int(ap
31300 56 61 6c 5b 31 5d 29 3b 0a 20 20 20 20 20 20 20  Val[1]);.       
31310 20 70 67 6e 6f 20 3d 20 73 71 6c 69 74 65 33 5f   pgno = sqlite3_
31320 76 61 6c 75 65 5f 69 6e 74 28 61 70 56 61 6c 5b  value_int(apVal[
31330 32 5d 29 3b 0a 20 20 20 20 20 20 20 20 69 52 6f  2]);.        iRo
31340 77 69 64 20 3d 20 46 54 53 35 5f 53 45 47 4d 45  wid = FTS5_SEGME
31350 4e 54 5f 52 4f 57 49 44 28 73 65 67 69 64 2c 20  NT_ROWID(segid, 
31360 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 73  pgno);.        s
31370 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e  qlite3_result_in
31380 74 36 34 28 70 43 74 78 2c 20 69 52 6f 77 69 64  t64(pCtx, iRowid
31390 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
313a0 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69  else{.      sqli
313b0 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72  te3_result_error
313c0 28 70 43 74 78 2c 20 0a 20 20 20 20 20 20 20 20  (pCtx, .        
313d0 22 66 69 72 73 74 20 61 72 67 20 74 6f 20 66 74  "first arg to ft
313e0 73 35 5f 72 6f 77 69 64 28 29 20 6d 75 73 74 20  s5_rowid() must 
313f0 62 65 20 27 73 65 67 6d 65 6e 74 27 22 20 2c 20  be 'segment'" , 
31400 2d 31 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20  -1.      );.    
31410 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  }.  }.}../*.** T
31420 68 69 73 20 69 73 20 63 61 6c 6c 65 64 20 61 73  his is called as
31430 20 70 61 72 74 20 6f 66 20 72 65 67 69 73 74 65   part of registe
31440 72 69 6e 67 20 74 68 65 20 46 54 53 35 20 6d 6f  ring the FTS5 mo
31450 64 75 6c 65 20 77 69 74 68 20 64 61 74 61 62 61  dule with databa
31460 73 65 0a 2a 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e  se.** connection
31470 20 64 62 2e 20 49 74 20 72 65 67 69 73 74 65 72   db. It register
31480 73 20 73 65 76 65 72 61 6c 20 75 73 65 72 2d 64  s several user-d
31490 65 66 69 6e 65 64 20 73 63 61 6c 61 72 20 66 75  efined scalar fu
314a0 6e 63 74 69 6f 6e 73 20 75 73 65 66 75 6c 0a 2a  nctions useful.*
314b0 2a 20 77 69 74 68 20 46 54 53 35 2e 0a 2a 2a 0a  * with FTS5..**.
314c0 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66 75 6c  ** If successful
314d0 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  , SQLITE_OK is r
314e0 65 74 75 72 6e 65 64 2e 20 49 66 20 61 6e 20 65  eturned. If an e
314f0 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 73 6f 6d  rror occurs, som
31500 65 20 6f 74 68 65 72 0a 2a 2a 20 53 51 4c 69 74  e other.** SQLit
31510 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  e error code is 
31520 72 65 74 75 72 6e 65 64 20 69 6e 73 74 65 61 64  returned instead
31530 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
31540 46 74 73 35 49 6e 64 65 78 49 6e 69 74 28 73 71  Fts5IndexInit(sq
31550 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 69 6e  lite3 *db){.  in
31560 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 63  t rc = sqlite3_c
31570 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 0a  reate_function(.
31580 20 20 20 20 20 20 64 62 2c 20 22 66 74 73 35 5f        db, "fts5_
31590 64 65 63 6f 64 65 22 2c 20 32 2c 20 53 51 4c 49  decode", 2, SQLI
315a0 54 45 5f 55 54 46 38 2c 20 30 2c 20 66 74 73 35  TE_UTF8, 0, fts5
315b0 44 65 63 6f 64 65 46 75 6e 63 74 69 6f 6e 2c 20  DecodeFunction, 
315c0 30 2c 20 30 0a 20 20 29 3b 0a 0a 20 20 69 66 28  0, 0.  );..  if(
315d0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
315e0 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
315f0 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69  e3_create_functi
31600 6f 6e 28 0a 20 20 20 20 20 20 20 20 64 62 2c 20  on(.        db, 
31610 22 66 74 73 35 5f 64 65 63 6f 64 65 5f 6e 6f 6e  "fts5_decode_non
31620 65 22 2c 20 32 2c 20 0a 20 20 20 20 20 20 20 20  e", 2, .        
31630 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 28 76 6f  SQLITE_UTF8, (vo
31640 69 64 2a 29 64 62 2c 20 66 74 73 35 44 65 63 6f  id*)db, fts5Deco
31650 64 65 46 75 6e 63 74 69 6f 6e 2c 20 30 2c 20 30  deFunction, 0, 0
31660 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 0a 20 20 69  .    );.  }..  i
31670 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
31680 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   ){.    rc = sql
31690 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63  ite3_create_func
316a0 74 69 6f 6e 28 0a 20 20 20 20 20 20 20 20 64 62  tion(.        db
316b0 2c 20 22 66 74 73 35 5f 72 6f 77 69 64 22 2c 20  , "fts5_rowid", 
316c0 2d 31 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c  -1, SQLITE_UTF8,
316d0 20 30 2c 20 66 74 73 35 52 6f 77 69 64 46 75 6e   0, fts5RowidFun
316e0 63 74 69 6f 6e 2c 20 30 2c 20 30 0a 20 20 20 20  ction, 0, 0.    
316f0 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
31700 72 63 3b 0a 7d 0a 0a 0a 69 6e 74 20 73 71 6c 69  rc;.}...int sqli
31710 74 65 33 46 74 73 35 49 6e 64 65 78 52 65 73 65  te3Fts5IndexRese
31720 74 28 46 74 73 35 49 6e 64 65 78 20 2a 70 29 7b  t(Fts5Index *p){
31730 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 53  .  assert( p->pS
31740 74 72 75 63 74 3d 3d 30 20 7c 7c 20 70 2d 3e 69  truct==0 || p->i
31750 53 74 72 75 63 74 56 65 72 73 69 6f 6e 21 3d 30  StructVersion!=0
31760 20 29 3b 0a 20 20 69 66 28 20 66 74 73 35 49 6e   );.  if( fts5In
31770 64 65 78 44 61 74 61 56 65 72 73 69 6f 6e 28 70  dexDataVersion(p
31780 29 21 3d 70 2d 3e 69 53 74 72 75 63 74 56 65 72  )!=p->iStructVer
31790 73 69 6f 6e 20 29 7b 0a 20 20 20 20 66 74 73 35  sion ){.    fts5
317a0 53 74 72 75 63 74 75 72 65 49 6e 76 61 6c 69 64  StructureInvalid
317b0 61 74 65 28 70 29 3b 0a 20 20 7d 0a 20 20 72 65  ate(p);.  }.  re
317c0 74 75 72 6e 20 66 74 73 35 49 6e 64 65 78 52 65  turn fts5IndexRe
317d0 74 75 72 6e 28 70 29 3b 0a 7d 0a                 turn(p);.}.