/ Hex Artifact Content
Login

Artifact baf3ad4451d32d35c2bd692ee4a81235ca7f26bd6f7613f7f73505474c33bbf2:


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 70 2d 3e 72 63  l ){.      p->rc
6560: 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61   = sqlite3_prepa
6570: 72 65 5f 76 33 28 70 2d 3e 70 43 6f 6e 66 69 67  re_v3(p->pConfig
6580: 2d 3e 64 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c 0a  ->db, zSql, -1,.
6590: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
65a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
65b0: 20 53 51 4c 49 54 45 5f 50 52 45 50 41 52 45 5f   SQLITE_PREPARE_
65c0: 50 45 52 53 49 53 54 45 4e 54 2c 20 70 70 53 74  PERSISTENT, ppSt
65d0: 6d 74 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73  mt, 0);.    }els
65e0: 65 7b 0a 20 20 20 20 20 20 70 2d 3e 72 63 20 3d  e{.      p->rc =
65f0: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
6600: 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74     }.  }.  sqlit
6610: 65 33 5f 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20  e3_free(zSql);. 
6620: 20 72 65 74 75 72 6e 20 70 2d 3e 72 63 3b 0a 7d   return p->rc;.}
6630: 0a 0a 0a 2f 2a 0a 2a 2a 20 49 4e 53 45 52 54 20  .../*.** INSERT 
6640: 4f 52 20 52 45 50 4c 41 43 45 20 61 20 72 65 63  OR REPLACE a rec
6650: 6f 72 64 20 69 6e 74 6f 20 74 68 65 20 25 5f 64  ord into the %_d
6660: 61 74 61 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74  ata table..*/.st
6670: 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 44 61  atic void fts5Da
6680: 74 61 57 72 69 74 65 28 46 74 73 35 49 6e 64 65  taWrite(Fts5Inde
6690: 78 20 2a 70 2c 20 69 36 34 20 69 52 6f 77 69 64  x *p, i64 iRowid
66a0: 2c 20 63 6f 6e 73 74 20 75 38 20 2a 70 44 61 74  , const u8 *pDat
66b0: 61 2c 20 69 6e 74 20 6e 44 61 74 61 29 7b 0a 20  a, int nData){. 
66c0: 20 69 66 28 20 70 2d 3e 72 63 21 3d 53 51 4c 49   if( p->rc!=SQLI
66d0: 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 3b 0a  TE_OK ) return;.
66e0: 0a 20 20 69 66 28 20 70 2d 3e 70 57 72 69 74 65  .  if( p->pWrite
66f0: 72 3d 3d 30 20 29 7b 0a 20 20 20 20 46 74 73 35  r==0 ){.    Fts5
6700: 43 6f 6e 66 69 67 20 2a 70 43 6f 6e 66 69 67 20  Config *pConfig 
6710: 3d 20 70 2d 3e 70 43 6f 6e 66 69 67 3b 0a 20 20  = p->pConfig;.  
6720: 20 20 66 74 73 35 49 6e 64 65 78 50 72 65 70 61    fts5IndexPrepa
6730: 72 65 53 74 6d 74 28 70 2c 20 26 70 2d 3e 70 57  reStmt(p, &p->pW
6740: 72 69 74 65 72 2c 20 73 71 6c 69 74 65 33 5f 6d  riter, sqlite3_m
6750: 70 72 69 6e 74 66 28 0a 20 20 20 20 20 20 20 20  printf(.        
6760: 20 20 22 52 45 50 4c 41 43 45 20 49 4e 54 4f 20    "REPLACE INTO 
6770: 27 25 71 27 2e 27 25 71 5f 64 61 74 61 27 28 69  '%q'.'%q_data'(i
6780: 64 2c 20 62 6c 6f 63 6b 29 20 56 41 4c 55 45 53  d, block) VALUES
6790: 28 3f 2c 3f 29 22 2c 20 0a 20 20 20 20 20 20 20  (?,?)", .       
67a0: 20 20 20 70 43 6f 6e 66 69 67 2d 3e 7a 44 62 2c     pConfig->zDb,
67b0: 20 70 43 6f 6e 66 69 67 2d 3e 7a 4e 61 6d 65 0a   pConfig->zName.
67c0: 20 20 20 20 29 29 3b 0a 20 20 20 20 69 66 28 20      ));.    if( 
67d0: 70 2d 3e 72 63 20 29 20 72 65 74 75 72 6e 3b 0a  p->rc ) return;.
67e0: 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33 5f 62    }..  sqlite3_b
67f0: 69 6e 64 5f 69 6e 74 36 34 28 70 2d 3e 70 57 72  ind_int64(p->pWr
6800: 69 74 65 72 2c 20 31 2c 20 69 52 6f 77 69 64 29  iter, 1, iRowid)
6810: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64  ;.  sqlite3_bind
6820: 5f 62 6c 6f 62 28 70 2d 3e 70 57 72 69 74 65 72  _blob(p->pWriter
6830: 2c 20 32 2c 20 70 44 61 74 61 2c 20 6e 44 61 74  , 2, pData, nDat
6840: 61 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43  a, SQLITE_STATIC
6850: 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 65  );.  sqlite3_ste
6860: 70 28 70 2d 3e 70 57 72 69 74 65 72 29 3b 0a 20  p(p->pWriter);. 
6870: 20 70 2d 3e 72 63 20 3d 20 73 71 6c 69 74 65 33   p->rc = sqlite3
6880: 5f 72 65 73 65 74 28 70 2d 3e 70 57 72 69 74 65  _reset(p->pWrite
6890: 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 62 69  r);.  sqlite3_bi
68a0: 6e 64 5f 6e 75 6c 6c 28 70 2d 3e 70 57 72 69 74  nd_null(p->pWrit
68b0: 65 72 2c 20 32 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  er, 2);.}../*.**
68c0: 20 45 78 65 63 75 74 65 20 74 68 65 20 66 6f 6c   Execute the fol
68d0: 6c 6f 77 69 6e 67 20 53 51 4c 3a 0a 2a 2a 0a 2a  lowing SQL:.**.*
68e0: 2a 20 20 20 20 20 44 45 4c 45 54 45 20 46 52 4f  *     DELETE FRO
68f0: 4d 20 25 5f 64 61 74 61 20 57 48 45 52 45 20 69  M %_data WHERE i
6900: 64 20 42 45 54 57 45 45 4e 20 24 69 46 69 72 73  d BETWEEN $iFirs
6910: 74 20 41 4e 44 20 24 69 4c 61 73 74 0a 2a 2f 0a  t AND $iLast.*/.
6920: 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
6930: 44 61 74 61 44 65 6c 65 74 65 28 46 74 73 35 49  DataDelete(Fts5I
6940: 6e 64 65 78 20 2a 70 2c 20 69 36 34 20 69 46 69  ndex *p, i64 iFi
6950: 72 73 74 2c 20 69 36 34 20 69 4c 61 73 74 29 7b  rst, i64 iLast){
6960: 0a 20 20 69 66 28 20 70 2d 3e 72 63 21 3d 53 51  .  if( p->rc!=SQ
6970: 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e  LITE_OK ) return
6980: 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 70 44 65 6c  ;..  if( p->pDel
6990: 65 74 65 72 3d 3d 30 20 29 7b 0a 20 20 20 20 69  eter==0 ){.    i
69a0: 6e 74 20 72 63 3b 0a 20 20 20 20 46 74 73 35 43  nt rc;.    Fts5C
69b0: 6f 6e 66 69 67 20 2a 70 43 6f 6e 66 69 67 20 3d  onfig *pConfig =
69c0: 20 70 2d 3e 70 43 6f 6e 66 69 67 3b 0a 20 20 20   p->pConfig;.   
69d0: 20 63 68 61 72 20 2a 7a 53 71 6c 20 3d 20 73 71   char *zSql = sq
69e0: 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 0a 20  lite3_mprintf(. 
69f0: 20 20 20 20 20 20 20 22 44 45 4c 45 54 45 20 46         "DELETE F
6a00: 52 4f 4d 20 27 25 71 27 2e 27 25 71 5f 64 61 74  ROM '%q'.'%q_dat
6a10: 61 27 20 57 48 45 52 45 20 69 64 3e 3d 3f 20 41  a' WHERE id>=? A
6a20: 4e 44 20 69 64 3c 3d 3f 22 2c 20 0a 20 20 20 20  ND id<=?", .    
6a30: 20 20 20 20 20 20 70 43 6f 6e 66 69 67 2d 3e 7a        pConfig->z
6a40: 44 62 2c 20 70 43 6f 6e 66 69 67 2d 3e 7a 4e 61  Db, pConfig->zNa
6a50: 6d 65 0a 20 20 20 20 29 3b 0a 20 20 20 20 69 66  me.    );.    if
6a60: 28 20 7a 53 71 6c 3d 3d 30 20 29 7b 0a 20 20 20  ( zSql==0 ){.   
6a70: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
6a80: 4f 4d 45 4d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  OMEM;.    }else{
6a90: 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
6aa0: 74 65 33 5f 70 72 65 70 61 72 65 5f 76 33 28 70  te3_prepare_v3(p
6ab0: 43 6f 6e 66 69 67 2d 3e 64 62 2c 20 7a 53 71 6c  Config->db, zSql
6ac0: 2c 20 2d 31 2c 0a 20 20 20 20 20 20 20 20 20 20  , -1,.          
6ad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6ae0: 20 20 20 20 53 51 4c 49 54 45 5f 50 52 45 50 41      SQLITE_PREPA
6af0: 52 45 5f 50 45 52 53 49 53 54 45 4e 54 2c 20 26  RE_PERSISTENT, &
6b00: 70 2d 3e 70 44 65 6c 65 74 65 72 2c 20 30 29 3b  p->pDeleter, 0);
6b10: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
6b20: 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20 20 20 7d  ree(zSql);.    }
6b30: 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
6b40: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
6b50: 70 2d 3e 72 63 20 3d 20 72 63 3b 0a 20 20 20 20  p->rc = rc;.    
6b60: 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a    return;.    }.
6b70: 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33 5f 62    }..  sqlite3_b
6b80: 69 6e 64 5f 69 6e 74 36 34 28 70 2d 3e 70 44 65  ind_int64(p->pDe
6b90: 6c 65 74 65 72 2c 20 31 2c 20 69 46 69 72 73 74  leter, 1, iFirst
6ba0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 62 69 6e  );.  sqlite3_bin
6bb0: 64 5f 69 6e 74 36 34 28 70 2d 3e 70 44 65 6c 65  d_int64(p->pDele
6bc0: 74 65 72 2c 20 32 2c 20 69 4c 61 73 74 29 3b 0a  ter, 2, iLast);.
6bd0: 20 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70    sqlite3_step(p
6be0: 2d 3e 70 44 65 6c 65 74 65 72 29 3b 0a 20 20 70  ->pDeleter);.  p
6bf0: 2d 3e 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 72  ->rc = sqlite3_r
6c00: 65 73 65 74 28 70 2d 3e 70 44 65 6c 65 74 65 72  eset(p->pDeleter
6c10: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f  );.}../*.** Remo
6c20: 76 65 20 61 6c 6c 20 72 65 63 6f 72 64 73 20 61  ve all records a
6c30: 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 73  ssociated with s
6c40: 65 67 6d 65 6e 74 20 69 53 65 67 69 64 2e 0a 2a  egment iSegid..*
6c50: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  /.static void ft
6c60: 73 35 44 61 74 61 52 65 6d 6f 76 65 53 65 67 6d  s5DataRemoveSegm
6c70: 65 6e 74 28 46 74 73 35 49 6e 64 65 78 20 2a 70  ent(Fts5Index *p
6c80: 2c 20 69 6e 74 20 69 53 65 67 69 64 29 7b 0a 20  , int iSegid){. 
6c90: 20 69 36 34 20 69 46 69 72 73 74 20 3d 20 46 54   i64 iFirst = FT
6ca0: 53 35 5f 53 45 47 4d 45 4e 54 5f 52 4f 57 49 44  S5_SEGMENT_ROWID
6cb0: 28 69 53 65 67 69 64 2c 20 30 29 3b 0a 20 20 69  (iSegid, 0);.  i
6cc0: 36 34 20 69 4c 61 73 74 20 3d 20 46 54 53 35 5f  64 iLast = FTS5_
6cd0: 53 45 47 4d 45 4e 54 5f 52 4f 57 49 44 28 69 53  SEGMENT_ROWID(iS
6ce0: 65 67 69 64 2b 31 2c 20 30 29 2d 31 3b 0a 20 20  egid+1, 0)-1;.  
6cf0: 66 74 73 35 44 61 74 61 44 65 6c 65 74 65 28 70  fts5DataDelete(p
6d00: 2c 20 69 46 69 72 73 74 2c 20 69 4c 61 73 74 29  , iFirst, iLast)
6d10: 3b 0a 20 20 69 66 28 20 70 2d 3e 70 49 64 78 44  ;.  if( p->pIdxD
6d20: 65 6c 65 74 65 72 3d 3d 30 20 29 7b 0a 20 20 20  eleter==0 ){.   
6d30: 20 46 74 73 35 43 6f 6e 66 69 67 20 2a 70 43 6f   Fts5Config *pCo
6d40: 6e 66 69 67 20 3d 20 70 2d 3e 70 43 6f 6e 66 69  nfig = p->pConfi
6d50: 67 3b 0a 20 20 20 20 66 74 73 35 49 6e 64 65 78  g;.    fts5Index
6d60: 50 72 65 70 61 72 65 53 74 6d 74 28 70 2c 20 26  PrepareStmt(p, &
6d70: 70 2d 3e 70 49 64 78 44 65 6c 65 74 65 72 2c 20  p->pIdxDeleter, 
6d80: 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
6d90: 0a 20 20 20 20 20 20 20 20 20 20 22 44 45 4c 45  .          "DELE
6da0: 54 45 20 46 52 4f 4d 20 27 25 71 27 2e 27 25 71  TE FROM '%q'.'%q
6db0: 5f 69 64 78 27 20 57 48 45 52 45 20 73 65 67 69  _idx' WHERE segi
6dc0: 64 3d 3f 22 2c 0a 20 20 20 20 20 20 20 20 20 20  d=?",.          
6dd0: 70 43 6f 6e 66 69 67 2d 3e 7a 44 62 2c 20 70 43  pConfig->zDb, pC
6de0: 6f 6e 66 69 67 2d 3e 7a 4e 61 6d 65 0a 20 20 20  onfig->zName.   
6df0: 20 29 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70   ));.  }.  if( p
6e00: 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
6e10: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62  ){.    sqlite3_b
6e20: 69 6e 64 5f 69 6e 74 28 70 2d 3e 70 49 64 78 44  ind_int(p->pIdxD
6e30: 65 6c 65 74 65 72 2c 20 31 2c 20 69 53 65 67 69  eleter, 1, iSegi
6e40: 64 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  d);.    sqlite3_
6e50: 73 74 65 70 28 70 2d 3e 70 49 64 78 44 65 6c 65  step(p->pIdxDele
6e60: 74 65 72 29 3b 0a 20 20 20 20 70 2d 3e 72 63 20  ter);.    p->rc 
6e70: 3d 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28  = sqlite3_reset(
6e80: 70 2d 3e 70 49 64 78 44 65 6c 65 74 65 72 29 3b  p->pIdxDeleter);
6e90: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  .  }.}../*.** Re
6ea0: 6c 65 61 73 65 20 61 20 72 65 66 65 72 65 6e 63  lease a referenc
6eb0: 65 20 74 6f 20 61 6e 20 46 74 73 35 53 74 72 75  e to an Fts5Stru
6ec0: 63 74 75 72 65 20 6f 62 6a 65 63 74 20 72 65 74  cture object ret
6ed0: 75 72 6e 65 64 20 62 79 20 61 6e 20 65 61 72 6c  urned by an earl
6ee0: 69 65 72 20 0a 2a 2a 20 63 61 6c 6c 20 74 6f 20  ier .** call to 
6ef0: 66 74 73 35 53 74 72 75 63 74 75 72 65 52 65 61  fts5StructureRea
6f00: 64 28 29 20 6f 72 20 66 74 73 35 53 74 72 75 63  d() or fts5Struc
6f10: 74 75 72 65 44 65 63 6f 64 65 28 29 2e 0a 2a 2f  tureDecode()..*/
6f20: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
6f30: 35 53 74 72 75 63 74 75 72 65 52 65 6c 65 61 73  5StructureReleas
6f40: 65 28 46 74 73 35 53 74 72 75 63 74 75 72 65 20  e(Fts5Structure 
6f50: 2a 70 53 74 72 75 63 74 29 7b 0a 20 20 69 66 28  *pStruct){.  if(
6f60: 20 70 53 74 72 75 63 74 20 26 26 20 30 3e 3d 28   pStruct && 0>=(
6f70: 2d 2d 70 53 74 72 75 63 74 2d 3e 6e 52 65 66 29  --pStruct->nRef)
6f80: 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20   ){.    int i;. 
6f90: 20 20 20 61 73 73 65 72 74 28 20 70 53 74 72 75     assert( pStru
6fa0: 63 74 2d 3e 6e 52 65 66 3d 3d 30 20 29 3b 0a 20  ct->nRef==0 );. 
6fb0: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 53     for(i=0; i<pS
6fc0: 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 3b 20 69  truct->nLevel; i
6fd0: 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  ++){.      sqlit
6fe0: 65 33 5f 66 72 65 65 28 70 53 74 72 75 63 74 2d  e3_free(pStruct-
6ff0: 3e 61 4c 65 76 65 6c 5b 69 5d 2e 61 53 65 67 29  >aLevel[i].aSeg)
7000: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
7010: 74 65 33 5f 66 72 65 65 28 70 53 74 72 75 63 74  te3_free(pStruct
7020: 29 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63  );.  }.}..static
7030: 20 76 6f 69 64 20 66 74 73 35 53 74 72 75 63 74   void fts5Struct
7040: 75 72 65 52 65 66 28 46 74 73 35 53 74 72 75 63  ureRef(Fts5Struc
7050: 74 75 72 65 20 2a 70 53 74 72 75 63 74 29 7b 0a  ture *pStruct){.
7060: 20 20 70 53 74 72 75 63 74 2d 3e 6e 52 65 66 2b    pStruct->nRef+
7070: 2b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 73 65  +;.}../*.** Dese
7080: 72 69 61 6c 69 7a 65 20 61 6e 64 20 72 65 74 75  rialize and retu
7090: 72 6e 20 74 68 65 20 73 74 72 75 63 74 75 72 65  rn the structure
70a0: 20 72 65 63 6f 72 64 20 63 75 72 72 65 6e 74 6c   record currentl
70b0: 79 20 73 74 6f 72 65 64 20 69 6e 20 73 65 72 69  y stored in seri
70c0: 61 6c 69 7a 65 64 0a 2a 2a 20 66 6f 72 6d 20 77  alized.** form w
70d0: 69 74 68 69 6e 20 62 75 66 66 65 72 20 70 44 61  ithin buffer pDa
70e0: 74 61 2f 6e 44 61 74 61 2e 0a 2a 2a 0a 2a 2a 20  ta/nData..**.** 
70f0: 54 68 65 20 46 74 73 35 53 74 72 75 63 74 75 72  The Fts5Structur
7100: 65 2e 61 4c 65 76 65 6c 5b 5d 20 61 6e 64 20 65  e.aLevel[] and e
7110: 61 63 68 20 46 74 73 35 53 74 72 75 63 74 75 72  ach Fts5Structur
7120: 65 4c 65 76 65 6c 2e 61 53 65 67 5b 5d 20 61 72  eLevel.aSeg[] ar
7130: 72 61 79 0a 2a 2a 20 61 72 65 20 6f 76 65 72 2d  ray.** are over-
7140: 61 6c 6c 6f 63 61 74 65 64 20 62 79 20 6f 6e 65  allocated by one
7150: 20 73 6c 6f 74 2e 20 54 68 69 73 20 61 6c 6c 6f   slot. This allo
7160: 77 73 20 74 68 65 20 73 74 72 75 63 74 75 72 65  ws the structure
7170: 20 63 6f 6e 74 65 6e 74 73 0a 2a 2a 20 74 6f 20   contents.** to 
7180: 62 65 20 6d 6f 72 65 20 65 61 73 69 6c 79 20 65  be more easily e
7190: 64 69 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  dited..**.** If 
71a0: 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  an error occurs,
71b0: 20 2a 70 70 4f 75 74 20 69 73 20 73 65 74 20 74   *ppOut is set t
71c0: 6f 20 4e 55 4c 4c 20 61 6e 64 20 61 6e 20 53 51  o NULL and an SQ
71d0: 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 0a  Lite error code.
71e0: 2a 2a 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68  ** returned. Oth
71f0: 65 72 77 69 73 65 2c 20 2a 70 70 4f 75 74 20 69  erwise, *ppOut i
7200: 73 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74  s set to point t
7210: 6f 20 74 68 65 20 6e 65 77 20 6f 62 6a 65 63 74  o the new object
7220: 20 61 6e 64 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f   and.** SQLITE_O
7230: 4b 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73  K returned..*/.s
7240: 74 61 74 69 63 20 69 6e 74 20 66 74 73 35 53 74  tatic int fts5St
7250: 72 75 63 74 75 72 65 44 65 63 6f 64 65 28 0a 20  ructureDecode(. 
7260: 20 63 6f 6e 73 74 20 75 38 20 2a 70 44 61 74 61   const u8 *pData
7270: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
7280: 20 2f 2a 20 42 75 66 66 65 72 20 63 6f 6e 74 61   /* Buffer conta
7290: 69 6e 69 6e 67 20 73 65 72 69 61 6c 69 7a 65 64  ining serialized
72a0: 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20   structure */.  
72b0: 69 6e 74 20 6e 44 61 74 61 2c 20 20 20 20 20 20  int nData,      
72c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
72d0: 2f 2a 20 53 69 7a 65 20 6f 66 20 62 75 66 66 65  /* Size of buffe
72e0: 72 20 70 44 61 74 61 20 69 6e 20 62 79 74 65 73  r pData in bytes
72f0: 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 69 43 6f 6f   */.  int *piCoo
7300: 6b 69 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  kie,            
7310: 20 20 20 20 20 20 2f 2a 20 43 6f 6e 66 69 67 75        /* Configu
7320: 72 61 74 69 6f 6e 20 63 6f 6f 6b 69 65 20 76 61  ration cookie va
7330: 6c 75 65 20 2a 2f 0a 20 20 46 74 73 35 53 74 72  lue */.  Fts5Str
7340: 75 63 74 75 72 65 20 2a 2a 70 70 4f 75 74 20 20  ucture **ppOut  
7350: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a           /* OUT:
7360: 20 44 65 73 65 72 69 61 6c 69 7a 65 64 20 6f 62   Deserialized ob
7370: 6a 65 63 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  ject */.){.  int
7380: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
7390: 0a 20 20 69 6e 74 20 69 20 3d 20 30 3b 0a 20 20  .  int i = 0;.  
73a0: 69 6e 74 20 69 4c 76 6c 3b 0a 20 20 69 6e 74 20  int iLvl;.  int 
73b0: 6e 4c 65 76 65 6c 20 3d 20 30 3b 0a 20 20 69 6e  nLevel = 0;.  in
73c0: 74 20 6e 53 65 67 6d 65 6e 74 20 3d 20 30 3b 0a  t nSegment = 0;.
73d0: 20 20 69 6e 74 20 6e 42 79 74 65 3b 20 20 20 20    int nByte;    
73e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
73f0: 20 20 2f 2a 20 42 79 74 65 73 20 6f 66 20 73 70    /* Bytes of sp
7400: 61 63 65 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20  ace to allocate 
7410: 61 74 20 70 52 65 74 20 2a 2f 0a 20 20 46 74 73  at pRet */.  Fts
7420: 35 53 74 72 75 63 74 75 72 65 20 2a 70 52 65 74  5Structure *pRet
7430: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 2f 2a 20   = 0;        /* 
7440: 53 74 72 75 63 74 75 72 65 20 6f 62 6a 65 63 74  Structure object
7450: 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 0a 20   to return */.. 
7460: 20 2f 2a 20 47 72 61 62 20 74 68 65 20 63 6f 6f   /* Grab the coo
7470: 6b 69 65 20 76 61 6c 75 65 20 2a 2f 0a 20 20 69  kie value */.  i
7480: 66 28 20 70 69 43 6f 6f 6b 69 65 20 29 20 2a 70  f( piCookie ) *p
7490: 69 43 6f 6f 6b 69 65 20 3d 20 73 71 6c 69 74 65  iCookie = sqlite
74a0: 33 46 74 73 35 47 65 74 33 32 28 70 44 61 74 61  3Fts5Get32(pData
74b0: 29 3b 0a 20 20 69 20 3d 20 34 3b 0a 0a 20 20 2f  );.  i = 4;..  /
74c0: 2a 20 52 65 61 64 20 74 68 65 20 74 6f 74 61 6c  * Read the total
74d0: 20 6e 75 6d 62 65 72 20 6f 66 20 6c 65 76 65 6c   number of level
74e0: 73 20 61 6e 64 20 73 65 67 6d 65 6e 74 73 20 66  s and segments f
74f0: 72 6f 6d 20 74 68 65 20 73 74 61 72 74 20 6f 66  rom the start of
7500: 20 74 68 65 0a 20 20 2a 2a 20 73 74 72 75 63 74   the.  ** struct
7510: 75 72 65 20 72 65 63 6f 72 64 2e 20 20 2a 2f 0a  ure record.  */.
7520: 20 20 69 20 2b 3d 20 66 74 73 35 47 65 74 56 61    i += fts5GetVa
7530: 72 69 6e 74 33 32 28 26 70 44 61 74 61 5b 69 5d  rint32(&pData[i]
7540: 2c 20 6e 4c 65 76 65 6c 29 3b 0a 20 20 69 20 2b  , nLevel);.  i +
7550: 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e 74 33  = fts5GetVarint3
7560: 32 28 26 70 44 61 74 61 5b 69 5d 2c 20 6e 53 65  2(&pData[i], nSe
7570: 67 6d 65 6e 74 29 3b 0a 20 20 6e 42 79 74 65 20  gment);.  nByte 
7580: 3d 20 28 0a 20 20 20 20 20 20 73 69 7a 65 6f 66  = (.      sizeof
7590: 28 46 74 73 35 53 74 72 75 63 74 75 72 65 29 20  (Fts5Structure) 
75a0: 2b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  +               
75b0: 20 20 20 20 20 2f 2a 20 4d 61 69 6e 20 73 74 72       /* Main str
75c0: 75 63 74 75 72 65 20 2a 2f 0a 20 20 20 20 20 20  ucture */.      
75d0: 73 69 7a 65 6f 66 28 46 74 73 35 53 74 72 75 63  sizeof(Fts5Struc
75e0: 74 75 72 65 4c 65 76 65 6c 29 20 2a 20 28 6e 4c  tureLevel) * (nL
75f0: 65 76 65 6c 2d 31 29 20 20 20 20 2f 2a 20 61 4c  evel-1)    /* aL
7600: 65 76 65 6c 5b 5d 20 61 72 72 61 79 20 2a 2f 0a  evel[] array */.
7610: 20 20 29 3b 0a 20 20 70 52 65 74 20 3d 20 28 46    );.  pRet = (F
7620: 74 73 35 53 74 72 75 63 74 75 72 65 2a 29 73 71  ts5Structure*)sq
7630: 6c 69 74 65 33 46 74 73 35 4d 61 6c 6c 6f 63 5a  lite3Fts5MallocZ
7640: 65 72 6f 28 26 72 63 2c 20 6e 42 79 74 65 29 3b  ero(&rc, nByte);
7650: 0a 0a 20 20 69 66 28 20 70 52 65 74 20 29 7b 0a  ..  if( pRet ){.
7660: 20 20 20 20 70 52 65 74 2d 3e 6e 52 65 66 20 3d      pRet->nRef =
7670: 20 31 3b 0a 20 20 20 20 70 52 65 74 2d 3e 6e 4c   1;.    pRet->nL
7680: 65 76 65 6c 20 3d 20 6e 4c 65 76 65 6c 3b 0a 20  evel = nLevel;. 
7690: 20 20 20 70 52 65 74 2d 3e 6e 53 65 67 6d 65 6e     pRet->nSegmen
76a0: 74 20 3d 20 6e 53 65 67 6d 65 6e 74 3b 0a 20 20  t = nSegment;.  
76b0: 20 20 69 20 2b 3d 20 73 71 6c 69 74 65 33 46 74    i += sqlite3Ft
76c0: 73 35 47 65 74 56 61 72 69 6e 74 28 26 70 44 61  s5GetVarint(&pDa
76d0: 74 61 5b 69 5d 2c 20 26 70 52 65 74 2d 3e 6e 57  ta[i], &pRet->nW
76e0: 72 69 74 65 43 6f 75 6e 74 65 72 29 3b 0a 0a 20  riteCounter);.. 
76f0: 20 20 20 66 6f 72 28 69 4c 76 6c 3d 30 3b 20 72     for(iLvl=0; r
7700: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
7710: 69 4c 76 6c 3c 6e 4c 65 76 65 6c 3b 20 69 4c 76  iLvl<nLevel; iLv
7720: 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 46 74 73 35  l++){.      Fts5
7730: 53 74 72 75 63 74 75 72 65 4c 65 76 65 6c 20 2a  StructureLevel *
7740: 70 4c 76 6c 20 3d 20 26 70 52 65 74 2d 3e 61 4c  pLvl = &pRet->aL
7750: 65 76 65 6c 5b 69 4c 76 6c 5d 3b 0a 20 20 20 20  evel[iLvl];.    
7760: 20 20 69 6e 74 20 6e 54 6f 74 61 6c 20 3d 20 30    int nTotal = 0
7770: 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 53 65 67  ;.      int iSeg
7780: 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 69 3e 3d  ;..      if( i>=
7790: 6e 44 61 74 61 20 29 7b 0a 20 20 20 20 20 20 20  nData ){.       
77a0: 20 72 63 20 3d 20 46 54 53 35 5f 43 4f 52 52 55   rc = FTS5_CORRU
77b0: 50 54 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  PT;.      }else{
77c0: 0a 20 20 20 20 20 20 20 20 69 20 2b 3d 20 66 74  .        i += ft
77d0: 73 35 47 65 74 56 61 72 69 6e 74 33 32 28 26 70  s5GetVarint32(&p
77e0: 44 61 74 61 5b 69 5d 2c 20 70 4c 76 6c 2d 3e 6e  Data[i], pLvl->n
77f0: 4d 65 72 67 65 29 3b 0a 20 20 20 20 20 20 20 20  Merge);.        
7800: 69 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69  i += fts5GetVari
7810: 6e 74 33 32 28 26 70 44 61 74 61 5b 69 5d 2c 20  nt32(&pData[i], 
7820: 6e 54 6f 74 61 6c 29 3b 0a 20 20 20 20 20 20 20  nTotal);.       
7830: 20 61 73 73 65 72 74 28 20 6e 54 6f 74 61 6c 3e   assert( nTotal>
7840: 3d 70 4c 76 6c 2d 3e 6e 4d 65 72 67 65 20 29 3b  =pLvl->nMerge );
7850: 0a 20 20 20 20 20 20 20 20 70 4c 76 6c 2d 3e 61  .        pLvl->a
7860: 53 65 67 20 3d 20 28 46 74 73 35 53 74 72 75 63  Seg = (Fts5Struc
7870: 74 75 72 65 53 65 67 6d 65 6e 74 2a 29 73 71 6c  tureSegment*)sql
7880: 69 74 65 33 46 74 73 35 4d 61 6c 6c 6f 63 5a 65  ite3Fts5MallocZe
7890: 72 6f 28 26 72 63 2c 20 0a 20 20 20 20 20 20 20  ro(&rc, .       
78a0: 20 20 20 20 20 6e 54 6f 74 61 6c 20 2a 20 73 69       nTotal * si
78b0: 7a 65 6f 66 28 46 74 73 35 53 74 72 75 63 74 75  zeof(Fts5Structu
78c0: 72 65 53 65 67 6d 65 6e 74 29 0a 20 20 20 20 20  reSegment).     
78d0: 20 20 20 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20     );.      }.. 
78e0: 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
78f0: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
7900: 20 20 70 4c 76 6c 2d 3e 6e 53 65 67 20 3d 20 6e    pLvl->nSeg = n
7910: 54 6f 74 61 6c 3b 0a 20 20 20 20 20 20 20 20 66  Total;.        f
7920: 6f 72 28 69 53 65 67 3d 30 3b 20 69 53 65 67 3c  or(iSeg=0; iSeg<
7930: 6e 54 6f 74 61 6c 3b 20 69 53 65 67 2b 2b 29 7b  nTotal; iSeg++){
7940: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69  .          if( i
7950: 3e 3d 6e 44 61 74 61 20 29 7b 0a 20 20 20 20 20  >=nData ){.     
7960: 20 20 20 20 20 20 20 72 63 20 3d 20 46 54 53 35         rc = FTS5
7970: 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20 20 20 20  _CORRUPT;.      
7980: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
7990: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
79a0: 20 20 20 69 20 2b 3d 20 66 74 73 35 47 65 74 56     i += fts5GetV
79b0: 61 72 69 6e 74 33 32 28 26 70 44 61 74 61 5b 69  arint32(&pData[i
79c0: 5d 2c 20 70 4c 76 6c 2d 3e 61 53 65 67 5b 69 53  ], pLvl->aSeg[iS
79d0: 65 67 5d 2e 69 53 65 67 69 64 29 3b 0a 20 20 20  eg].iSegid);.   
79e0: 20 20 20 20 20 20 20 69 20 2b 3d 20 66 74 73 35         i += fts5
79f0: 47 65 74 56 61 72 69 6e 74 33 32 28 26 70 44 61  GetVarint32(&pDa
7a00: 74 61 5b 69 5d 2c 20 70 4c 76 6c 2d 3e 61 53 65  ta[i], pLvl->aSe
7a10: 67 5b 69 53 65 67 5d 2e 70 67 6e 6f 46 69 72 73  g[iSeg].pgnoFirs
7a20: 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 20  t);.          i 
7a30: 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e 74  += fts5GetVarint
7a40: 33 32 28 26 70 44 61 74 61 5b 69 5d 2c 20 70 4c  32(&pData[i], pL
7a50: 76 6c 2d 3e 61 53 65 67 5b 69 53 65 67 5d 2e 70  vl->aSeg[iSeg].p
7a60: 67 6e 6f 4c 61 73 74 29 3b 0a 20 20 20 20 20 20  gnoLast);.      
7a70: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
7a80: 7d 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  }.    if( rc!=SQ
7a90: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
7aa0: 20 66 74 73 35 53 74 72 75 63 74 75 72 65 52 65   fts5StructureRe
7ab0: 6c 65 61 73 65 28 70 52 65 74 29 3b 0a 20 20 20  lease(pRet);.   
7ac0: 20 20 20 70 52 65 74 20 3d 20 30 3b 0a 20 20 20     pRet = 0;.   
7ad0: 20 7d 0a 20 20 7d 0a 0a 20 20 2a 70 70 4f 75 74   }.  }..  *ppOut
7ae0: 20 3d 20 70 52 65 74 3b 0a 20 20 72 65 74 75 72   = pRet;.  retur
7af0: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 0a 2a  n rc;.}../*.**.*
7b00: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  /.static void ft
7b10: 73 35 53 74 72 75 63 74 75 72 65 41 64 64 4c 65  s5StructureAddLe
7b20: 76 65 6c 28 69 6e 74 20 2a 70 52 63 2c 20 46 74  vel(int *pRc, Ft
7b30: 73 35 53 74 72 75 63 74 75 72 65 20 2a 2a 70 70  s5Structure **pp
7b40: 53 74 72 75 63 74 29 7b 0a 20 20 69 66 28 20 2a  Struct){.  if( *
7b50: 70 52 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  pRc==SQLITE_OK )
7b60: 7b 0a 20 20 20 20 46 74 73 35 53 74 72 75 63 74  {.    Fts5Struct
7b70: 75 72 65 20 2a 70 53 74 72 75 63 74 20 3d 20 2a  ure *pStruct = *
7b80: 70 70 53 74 72 75 63 74 3b 0a 20 20 20 20 69 6e  ppStruct;.    in
7b90: 74 20 6e 4c 65 76 65 6c 20 3d 20 70 53 74 72 75  t nLevel = pStru
7ba0: 63 74 2d 3e 6e 4c 65 76 65 6c 3b 0a 20 20 20 20  ct->nLevel;.    
7bb0: 69 6e 74 20 6e 42 79 74 65 20 3d 20 28 0a 20 20  int nByte = (.  
7bc0: 20 20 20 20 20 20 73 69 7a 65 6f 66 28 46 74 73        sizeof(Fts
7bd0: 35 53 74 72 75 63 74 75 72 65 29 20 2b 20 20 20  5Structure) +   
7be0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
7bf0: 2a 20 4d 61 69 6e 20 73 74 72 75 63 74 75 72 65  * Main structure
7c00: 20 2a 2f 0a 20 20 20 20 20 20 20 20 73 69 7a 65   */.        size
7c10: 6f 66 28 46 74 73 35 53 74 72 75 63 74 75 72 65  of(Fts5Structure
7c20: 4c 65 76 65 6c 29 20 2a 20 28 6e 4c 65 76 65 6c  Level) * (nLevel
7c30: 2b 31 29 20 20 2f 2a 20 61 4c 65 76 65 6c 5b 5d  +1)  /* aLevel[]
7c40: 20 61 72 72 61 79 20 2a 2f 0a 20 20 20 20 29 3b   array */.    );
7c50: 0a 0a 20 20 20 20 70 53 74 72 75 63 74 20 3d 20  ..    pStruct = 
7c60: 73 71 6c 69 74 65 33 5f 72 65 61 6c 6c 6f 63 28  sqlite3_realloc(
7c70: 70 53 74 72 75 63 74 2c 20 6e 42 79 74 65 29 3b  pStruct, nByte);
7c80: 0a 20 20 20 20 69 66 28 20 70 53 74 72 75 63 74  .    if( pStruct
7c90: 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74   ){.      memset
7ca0: 28 26 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65  (&pStruct->aLeve
7cb0: 6c 5b 6e 4c 65 76 65 6c 5d 2c 20 30 2c 20 73 69  l[nLevel], 0, si
7cc0: 7a 65 6f 66 28 46 74 73 35 53 74 72 75 63 74 75  zeof(Fts5Structu
7cd0: 72 65 4c 65 76 65 6c 29 29 3b 0a 20 20 20 20 20  reLevel));.     
7ce0: 20 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c   pStruct->nLevel
7cf0: 2b 2b 3b 0a 20 20 20 20 20 20 2a 70 70 53 74 72  ++;.      *ppStr
7d00: 75 63 74 20 3d 20 70 53 74 72 75 63 74 3b 0a 20  uct = pStruct;. 
7d10: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
7d20: 2a 70 52 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f  *pRc = SQLITE_NO
7d30: 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  MEM;.    }.  }.}
7d40: 0a 0a 2f 2a 0a 2a 2a 20 45 78 74 65 6e 64 20 6c  ../*.** Extend l
7d50: 65 76 65 6c 20 69 4c 76 6c 20 73 6f 20 74 68 61  evel iLvl so tha
7d60: 74 20 74 68 65 72 65 20 69 73 20 72 6f 6f 6d 20  t there is room 
7d70: 66 6f 72 20 61 74 20 6c 65 61 73 74 20 6e 45 78  for at least nEx
7d80: 74 72 61 20 6d 6f 72 65 0a 2a 2a 20 73 65 67 6d  tra more.** segm
7d90: 65 6e 74 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ents..*/.static 
7da0: 76 6f 69 64 20 66 74 73 35 53 74 72 75 63 74 75  void fts5Structu
7db0: 72 65 45 78 74 65 6e 64 4c 65 76 65 6c 28 0a 20  reExtendLevel(. 
7dc0: 20 69 6e 74 20 2a 70 52 63 2c 20 0a 20 20 46 74   int *pRc, .  Ft
7dd0: 73 35 53 74 72 75 63 74 75 72 65 20 2a 70 53 74  s5Structure *pSt
7de0: 72 75 63 74 2c 20 0a 20 20 69 6e 74 20 69 4c 76  ruct, .  int iLv
7df0: 6c 2c 20 0a 20 20 69 6e 74 20 6e 45 78 74 72 61  l, .  int nExtra
7e00: 2c 20 0a 20 20 69 6e 74 20 62 49 6e 73 65 72 74  , .  int bInsert
7e10: 0a 29 7b 0a 20 20 69 66 28 20 2a 70 52 63 3d 3d  .){.  if( *pRc==
7e20: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
7e30: 20 46 74 73 35 53 74 72 75 63 74 75 72 65 4c 65   Fts5StructureLe
7e40: 76 65 6c 20 2a 70 4c 76 6c 20 3d 20 26 70 53 74  vel *pLvl = &pSt
7e50: 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76  ruct->aLevel[iLv
7e60: 6c 5d 3b 0a 20 20 20 20 46 74 73 35 53 74 72 75  l];.    Fts5Stru
7e70: 63 74 75 72 65 53 65 67 6d 65 6e 74 20 2a 61 4e  ctureSegment *aN
7e80: 65 77 3b 0a 20 20 20 20 69 6e 74 20 6e 42 79 74  ew;.    int nByt
7e90: 65 3b 0a 0a 20 20 20 20 6e 42 79 74 65 20 3d 20  e;..    nByte = 
7ea0: 28 70 4c 76 6c 2d 3e 6e 53 65 67 20 2b 20 6e 45  (pLvl->nSeg + nE
7eb0: 78 74 72 61 29 20 2a 20 73 69 7a 65 6f 66 28 46  xtra) * sizeof(F
7ec0: 74 73 35 53 74 72 75 63 74 75 72 65 53 65 67 6d  ts5StructureSegm
7ed0: 65 6e 74 29 3b 0a 20 20 20 20 61 4e 65 77 20 3d  ent);.    aNew =
7ee0: 20 73 71 6c 69 74 65 33 5f 72 65 61 6c 6c 6f 63   sqlite3_realloc
7ef0: 28 70 4c 76 6c 2d 3e 61 53 65 67 2c 20 6e 42 79  (pLvl->aSeg, nBy
7f00: 74 65 29 3b 0a 20 20 20 20 69 66 28 20 61 4e 65  te);.    if( aNe
7f10: 77 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 62  w ){.      if( b
7f20: 49 6e 73 65 72 74 3d 3d 30 20 29 7b 0a 20 20 20  Insert==0 ){.   
7f30: 20 20 20 20 20 6d 65 6d 73 65 74 28 26 61 4e 65       memset(&aNe
7f40: 77 5b 70 4c 76 6c 2d 3e 6e 53 65 67 5d 2c 20 30  w[pLvl->nSeg], 0
7f50: 2c 20 73 69 7a 65 6f 66 28 46 74 73 35 53 74 72  , sizeof(Fts5Str
7f60: 75 63 74 75 72 65 53 65 67 6d 65 6e 74 29 20 2a  uctureSegment) *
7f70: 20 6e 45 78 74 72 61 29 3b 0a 20 20 20 20 20 20   nExtra);.      
7f80: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69  }else{.        i
7f90: 6e 74 20 6e 4d 6f 76 65 20 3d 20 70 4c 76 6c 2d  nt nMove = pLvl-
7fa0: 3e 6e 53 65 67 20 2a 20 73 69 7a 65 6f 66 28 46  >nSeg * sizeof(F
7fb0: 74 73 35 53 74 72 75 63 74 75 72 65 53 65 67 6d  ts5StructureSegm
7fc0: 65 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 6d 65  ent);.        me
7fd0: 6d 6d 6f 76 65 28 26 61 4e 65 77 5b 6e 45 78 74  mmove(&aNew[nExt
7fe0: 72 61 5d 2c 20 61 4e 65 77 2c 20 6e 4d 6f 76 65  ra], aNew, nMove
7ff0: 29 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 73 65  );.        memse
8000: 74 28 61 4e 65 77 2c 20 30 2c 20 73 69 7a 65 6f  t(aNew, 0, sizeo
8010: 66 28 46 74 73 35 53 74 72 75 63 74 75 72 65 53  f(Fts5StructureS
8020: 65 67 6d 65 6e 74 29 20 2a 20 6e 45 78 74 72 61  egment) * nExtra
8030: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
8040: 20 70 4c 76 6c 2d 3e 61 53 65 67 20 3d 20 61 4e   pLvl->aSeg = aN
8050: 65 77 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ew;.    }else{. 
8060: 20 20 20 20 20 2a 70 52 63 20 3d 20 53 51 4c 49       *pRc = SQLI
8070: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a  TE_NOMEM;.    }.
8080: 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 46 74    }.}..static Ft
8090: 73 35 53 74 72 75 63 74 75 72 65 20 2a 66 74 73  s5Structure *fts
80a0: 35 53 74 72 75 63 74 75 72 65 52 65 61 64 55 6e  5StructureReadUn
80b0: 63 61 63 68 65 64 28 46 74 73 35 49 6e 64 65 78  cached(Fts5Index
80c0: 20 2a 70 29 7b 0a 20 20 46 74 73 35 53 74 72 75   *p){.  Fts5Stru
80d0: 63 74 75 72 65 20 2a 70 52 65 74 20 3d 20 30 3b  cture *pRet = 0;
80e0: 0a 20 20 46 74 73 35 43 6f 6e 66 69 67 20 2a 70  .  Fts5Config *p
80f0: 43 6f 6e 66 69 67 20 3d 20 70 2d 3e 70 43 6f 6e  Config = p->pCon
8100: 66 69 67 3b 0a 20 20 69 6e 74 20 69 43 6f 6f 6b  fig;.  int iCook
8110: 69 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ie;             
8120: 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 66 69 67         /* Config
8130: 75 72 61 74 69 6f 6e 20 63 6f 6f 6b 69 65 20 2a  uration cookie *
8140: 2f 0a 20 20 46 74 73 35 44 61 74 61 20 2a 70 44  /.  Fts5Data *pD
8150: 61 74 61 3b 0a 0a 20 20 70 44 61 74 61 20 3d 20  ata;..  pData = 
8160: 66 74 73 35 44 61 74 61 52 65 61 64 28 70 2c 20  fts5DataRead(p, 
8170: 46 54 53 35 5f 53 54 52 55 43 54 55 52 45 5f 52  FTS5_STRUCTURE_R
8180: 4f 57 49 44 29 3b 0a 20 20 69 66 28 20 70 2d 3e  OWID);.  if( p->
8190: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
81a0: 0a 20 20 20 20 2f 2a 20 54 4f 44 4f 3a 20 44 6f  .    /* TODO: Do
81b0: 20 77 65 20 6e 65 65 64 20 74 68 69 73 20 69 66   we need this if
81c0: 20 74 68 65 20 6c 65 61 66 2d 69 6e 64 65 78 20   the leaf-index 
81d0: 69 73 20 61 70 70 65 6e 64 65 64 3f 20 50 72 6f  is appended? Pro
81e0: 62 61 62 6c 79 2e 2e 2e 20 2a 2f 0a 20 20 20 20  bably... */.    
81f0: 6d 65 6d 73 65 74 28 26 70 44 61 74 61 2d 3e 70  memset(&pData->p
8200: 5b 70 44 61 74 61 2d 3e 6e 6e 5d 2c 20 30 2c 20  [pData->nn], 0, 
8210: 46 54 53 35 5f 44 41 54 41 5f 50 41 44 44 49 4e  FTS5_DATA_PADDIN
8220: 47 29 3b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20  G);.    p->rc = 
8230: 66 74 73 35 53 74 72 75 63 74 75 72 65 44 65 63  fts5StructureDec
8240: 6f 64 65 28 70 44 61 74 61 2d 3e 70 2c 20 70 44  ode(pData->p, pD
8250: 61 74 61 2d 3e 6e 6e 2c 20 26 69 43 6f 6f 6b 69  ata->nn, &iCooki
8260: 65 2c 20 26 70 52 65 74 29 3b 0a 20 20 20 20 69  e, &pRet);.    i
8270: 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  f( p->rc==SQLITE
8280: 5f 4f 4b 20 26 26 20 70 43 6f 6e 66 69 67 2d 3e  _OK && pConfig->
8290: 69 43 6f 6f 6b 69 65 21 3d 69 43 6f 6f 6b 69 65  iCookie!=iCookie
82a0: 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 72 63 20   ){.      p->rc 
82b0: 3d 20 73 71 6c 69 74 65 33 46 74 73 35 43 6f 6e  = sqlite3Fts5Con
82c0: 66 69 67 4c 6f 61 64 28 70 43 6f 6e 66 69 67 2c  figLoad(pConfig,
82d0: 20 69 43 6f 6f 6b 69 65 29 3b 0a 20 20 20 20 7d   iCookie);.    }
82e0: 0a 20 20 20 20 66 74 73 35 44 61 74 61 52 65 6c  .    fts5DataRel
82f0: 65 61 73 65 28 70 44 61 74 61 29 3b 0a 20 20 20  ease(pData);.   
8300: 20 69 66 28 20 70 2d 3e 72 63 21 3d 53 51 4c 49   if( p->rc!=SQLI
8310: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 66  TE_OK ){.      f
8320: 74 73 35 53 74 72 75 63 74 75 72 65 52 65 6c 65  ts5StructureRele
8330: 61 73 65 28 70 52 65 74 29 3b 0a 20 20 20 20 20  ase(pRet);.     
8340: 20 70 52 65 74 20 3d 20 30 3b 0a 20 20 20 20 7d   pRet = 0;.    }
8350: 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70  .  }..  return p
8360: 52 65 74 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69  Ret;.}..static i
8370: 36 34 20 66 74 73 35 49 6e 64 65 78 44 61 74 61  64 fts5IndexData
8380: 56 65 72 73 69 6f 6e 28 46 74 73 35 49 6e 64 65  Version(Fts5Inde
8390: 78 20 2a 70 29 7b 0a 20 20 69 36 34 20 69 56 65  x *p){.  i64 iVe
83a0: 72 73 69 6f 6e 20 3d 20 30 3b 0a 0a 20 20 69 66  rsion = 0;..  if
83b0: 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
83c0: 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 70 2d  OK ){.    if( p-
83d0: 3e 70 44 61 74 61 56 65 72 73 69 6f 6e 3d 3d 30  >pDataVersion==0
83e0: 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 72 63 20   ){.      p->rc 
83f0: 3d 20 66 74 73 35 49 6e 64 65 78 50 72 65 70 61  = fts5IndexPrepa
8400: 72 65 53 74 6d 74 28 70 2c 20 26 70 2d 3e 70 44  reStmt(p, &p->pD
8410: 61 74 61 56 65 72 73 69 6f 6e 2c 20 0a 20 20 20  ataVersion, .   
8420: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d         sqlite3_m
8430: 70 72 69 6e 74 66 28 22 50 52 41 47 4d 41 20 25  printf("PRAGMA %
8440: 51 2e 64 61 74 61 5f 76 65 72 73 69 6f 6e 22 2c  Q.data_version",
8450: 20 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e 7a 44 62   p->pConfig->zDb
8460: 29 0a 20 20 20 20 20 20 20 20 20 20 29 3b 0a 20  ).          );. 
8470: 20 20 20 20 20 69 66 28 20 70 2d 3e 72 63 20 29       if( p->rc )
8480: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d   return 0;.    }
8490: 0a 0a 20 20 20 20 69 66 28 20 53 51 4c 49 54 45  ..    if( SQLITE
84a0: 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33 5f 73 74  _ROW==sqlite3_st
84b0: 65 70 28 70 2d 3e 70 44 61 74 61 56 65 72 73 69  ep(p->pDataVersi
84c0: 6f 6e 29 20 29 7b 0a 20 20 20 20 20 20 69 56 65  on) ){.      iVe
84d0: 72 73 69 6f 6e 20 3d 20 73 71 6c 69 74 65 33 5f  rsion = sqlite3_
84e0: 63 6f 6c 75 6d 6e 5f 69 6e 74 36 34 28 70 2d 3e  column_int64(p->
84f0: 70 44 61 74 61 56 65 72 73 69 6f 6e 2c 20 30 29  pDataVersion, 0)
8500: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 72  ;.    }.    p->r
8510: 63 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 73 65  c = sqlite3_rese
8520: 74 28 70 2d 3e 70 44 61 74 61 56 65 72 73 69 6f  t(p->pDataVersio
8530: 6e 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72  n);.  }..  retur
8540: 6e 20 69 56 65 72 73 69 6f 6e 3b 0a 7d 0a 0a 2f  n iVersion;.}../
8550: 2a 0a 2a 2a 20 52 65 61 64 2c 20 64 65 73 65 72  *.** Read, deser
8560: 69 61 6c 69 7a 65 20 61 6e 64 20 72 65 74 75 72  ialize and retur
8570: 6e 20 74 68 65 20 73 74 72 75 63 74 75 72 65 20  n the structure 
8580: 72 65 63 6f 72 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  record..**.** Th
8590: 65 20 46 74 73 35 53 74 72 75 63 74 75 72 65 2e  e Fts5Structure.
85a0: 61 4c 65 76 65 6c 5b 5d 20 61 6e 64 20 65 61 63  aLevel[] and eac
85b0: 68 20 46 74 73 35 53 74 72 75 63 74 75 72 65 4c  h Fts5StructureL
85c0: 65 76 65 6c 2e 61 53 65 67 5b 5d 20 61 72 72 61  evel.aSeg[] arra
85d0: 79 0a 2a 2a 20 61 72 65 20 6f 76 65 72 2d 61 6c  y.** are over-al
85e0: 6c 6f 63 61 74 65 64 20 61 73 20 64 65 73 63 72  located as descr
85f0: 69 62 65 64 20 66 6f 72 20 66 75 6e 63 74 69 6f  ibed for functio
8600: 6e 20 66 74 73 35 53 74 72 75 63 74 75 72 65 44  n fts5StructureD
8610: 65 63 6f 64 65 28 29 20 0a 2a 2a 20 61 62 6f 76  ecode() .** abov
8620: 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65  e..**.** If an e
8630: 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 4e 55 4c  rror occurs, NUL
8640: 4c 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e  L is returned an
8650: 64 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20  d an error code 
8660: 6c 65 66 74 20 69 6e 20 74 68 65 0a 2a 2a 20 46  left in the.** F
8670: 74 73 35 49 6e 64 65 78 20 68 61 6e 64 6c 65 2e  ts5Index handle.
8680: 20 49 66 20 61 6e 20 65 72 72 6f 72 20 68 61 73   If an error has
8690: 20 61 6c 72 65 61 64 79 20 6f 63 63 75 72 72 65   already occurre
86a0: 64 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63  d when this func
86b0: 74 69 6f 6e 0a 2a 2a 20 69 73 20 63 61 6c 6c 65  tion.** is calle
86c0: 64 2c 20 69 74 20 69 73 20 61 20 6e 6f 2d 6f 70  d, it is a no-op
86d0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 46 74 73 35  ..*/.static Fts5
86e0: 53 74 72 75 63 74 75 72 65 20 2a 66 74 73 35 53  Structure *fts5S
86f0: 74 72 75 63 74 75 72 65 52 65 61 64 28 46 74 73  tructureRead(Fts
8700: 35 49 6e 64 65 78 20 2a 70 29 7b 0a 0a 20 20 69  5Index *p){..  i
8710: 66 28 20 70 2d 3e 70 53 74 72 75 63 74 3d 3d 30  f( p->pStruct==0
8720: 20 29 7b 0a 20 20 20 20 70 2d 3e 69 53 74 72 75   ){.    p->iStru
8730: 63 74 56 65 72 73 69 6f 6e 20 3d 20 66 74 73 35  ctVersion = fts5
8740: 49 6e 64 65 78 44 61 74 61 56 65 72 73 69 6f 6e  IndexDataVersion
8750: 28 70 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e  (p);.    if( p->
8760: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
8770: 0a 20 20 20 20 20 20 70 2d 3e 70 53 74 72 75 63  .      p->pStruc
8780: 74 20 3d 20 66 74 73 35 53 74 72 75 63 74 75 72  t = fts5Structur
8790: 65 52 65 61 64 55 6e 63 61 63 68 65 64 28 70 29  eReadUncached(p)
87a0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 23 69 66  ;.    }.  }..#if
87b0: 20 30 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20 46   0.  else{.    F
87c0: 74 73 35 53 74 72 75 63 74 75 72 65 20 2a 70 54  ts5Structure *pT
87d0: 65 73 74 20 3d 20 66 74 73 35 53 74 72 75 63 74  est = fts5Struct
87e0: 75 72 65 52 65 61 64 55 6e 63 61 63 68 65 64 28  ureReadUncached(
87f0: 70 29 3b 0a 20 20 20 20 69 66 28 20 70 54 65 73  p);.    if( pTes
8800: 74 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  t ){.      int i
8810: 2c 20 6a 3b 0a 20 20 20 20 20 20 61 73 73 65 72  , j;.      asser
8820: 74 5f 6e 63 28 20 70 2d 3e 70 53 74 72 75 63 74  t_nc( p->pStruct
8830: 2d 3e 6e 53 65 67 6d 65 6e 74 3d 3d 70 54 65 73  ->nSegment==pTes
8840: 74 2d 3e 6e 53 65 67 6d 65 6e 74 20 29 3b 0a 20  t->nSegment );. 
8850: 20 20 20 20 20 61 73 73 65 72 74 5f 6e 63 28 20       assert_nc( 
8860: 70 2d 3e 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76  p->pStruct->nLev
8870: 65 6c 3d 3d 70 54 65 73 74 2d 3e 6e 4c 65 76 65  el==pTest->nLeve
8880: 6c 20 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  l );.      for(i
8890: 3d 30 3b 20 69 3c 70 54 65 73 74 2d 3e 6e 4c 65  =0; i<pTest->nLe
88a0: 76 65 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  vel; i++){.     
88b0: 20 20 20 61 73 73 65 72 74 5f 6e 63 28 20 70 2d     assert_nc( p-
88c0: 3e 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c  >pStruct->aLevel
88d0: 5b 69 5d 2e 6e 4d 65 72 67 65 3d 3d 70 54 65 73  [i].nMerge==pTes
88e0: 74 2d 3e 61 4c 65 76 65 6c 5b 69 5d 2e 6e 4d 65  t->aLevel[i].nMe
88f0: 72 67 65 20 29 3b 0a 20 20 20 20 20 20 20 20 61  rge );.        a
8900: 73 73 65 72 74 5f 6e 63 28 20 70 2d 3e 70 53 74  ssert_nc( p->pSt
8910: 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 5d 2e  ruct->aLevel[i].
8920: 6e 53 65 67 3d 3d 70 54 65 73 74 2d 3e 61 4c 65  nSeg==pTest->aLe
8930: 76 65 6c 5b 69 5d 2e 6e 53 65 67 20 29 3b 0a 20  vel[i].nSeg );. 
8940: 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20         for(j=0; 
8950: 6a 3c 70 54 65 73 74 2d 3e 61 4c 65 76 65 6c 5b  j<pTest->aLevel[
8960: 69 5d 2e 6e 53 65 67 3b 20 6a 2b 2b 29 7b 0a 20  i].nSeg; j++){. 
8970: 20 20 20 20 20 20 20 20 20 46 74 73 35 53 74 72           Fts5Str
8980: 75 63 74 75 72 65 53 65 67 6d 65 6e 74 20 2a 70  uctureSegment *p
8990: 31 20 3d 20 26 70 54 65 73 74 2d 3e 61 4c 65 76  1 = &pTest->aLev
89a0: 65 6c 5b 69 5d 2e 61 53 65 67 5b 6a 5d 3b 0a 20  el[i].aSeg[j];. 
89b0: 20 20 20 20 20 20 20 20 20 46 74 73 35 53 74 72           Fts5Str
89c0: 75 63 74 75 72 65 53 65 67 6d 65 6e 74 20 2a 70  uctureSegment *p
89d0: 32 20 3d 20 26 70 2d 3e 70 53 74 72 75 63 74 2d  2 = &p->pStruct-
89e0: 3e 61 4c 65 76 65 6c 5b 69 5d 2e 61 53 65 67 5b  >aLevel[i].aSeg[
89f0: 6a 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73  j];.          as
8a00: 73 65 72 74 5f 6e 63 28 20 70 31 2d 3e 69 53 65  sert_nc( p1->iSe
8a10: 67 69 64 3d 3d 70 32 2d 3e 69 53 65 67 69 64 20  gid==p2->iSegid 
8a20: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  );.          ass
8a30: 65 72 74 5f 6e 63 28 20 70 31 2d 3e 70 67 6e 6f  ert_nc( p1->pgno
8a40: 46 69 72 73 74 3d 3d 70 32 2d 3e 70 67 6e 6f 46  First==p2->pgnoF
8a50: 69 72 73 74 20 29 3b 0a 20 20 20 20 20 20 20 20  irst );.        
8a60: 20 20 61 73 73 65 72 74 5f 6e 63 28 20 70 31 2d    assert_nc( p1-
8a70: 3e 70 67 6e 6f 4c 61 73 74 3d 3d 70 32 2d 3e 70  >pgnoLast==p2->p
8a80: 67 6e 6f 4c 61 73 74 20 29 3b 0a 20 20 20 20 20  gnoLast );.     
8a90: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
8aa0: 20 20 20 66 74 73 35 53 74 72 75 63 74 75 72 65     fts5Structure
8ab0: 52 65 6c 65 61 73 65 28 70 54 65 73 74 29 3b 0a  Release(pTest);.
8ac0: 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66      }.  }.#endif
8ad0: 0a 0a 20 20 69 66 28 20 70 2d 3e 72 63 21 3d 53  ..  if( p->rc!=S
8ae0: 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72  QLITE_OK ) retur
8af0: 6e 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20 70  n 0;.  assert( p
8b00: 2d 3e 69 53 74 72 75 63 74 56 65 72 73 69 6f 6e  ->iStructVersion
8b10: 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
8b20: 20 70 2d 3e 70 53 74 72 75 63 74 21 3d 30 20 29   p->pStruct!=0 )
8b30: 3b 0a 20 20 66 74 73 35 53 74 72 75 63 74 75 72  ;.  fts5Structur
8b40: 65 52 65 66 28 70 2d 3e 70 53 74 72 75 63 74 29  eRef(p->pStruct)
8b50: 3b 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e 70 53  ;.  return p->pS
8b60: 74 72 75 63 74 3b 0a 7d 0a 0a 73 74 61 74 69 63  truct;.}..static
8b70: 20 76 6f 69 64 20 66 74 73 35 53 74 72 75 63 74   void fts5Struct
8b80: 75 72 65 49 6e 76 61 6c 69 64 61 74 65 28 46 74  ureInvalidate(Ft
8b90: 73 35 49 6e 64 65 78 20 2a 70 29 7b 0a 20 20 69  s5Index *p){.  i
8ba0: 66 28 20 70 2d 3e 70 53 74 72 75 63 74 20 29 7b  f( p->pStruct ){
8bb0: 0a 20 20 20 20 66 74 73 35 53 74 72 75 63 74 75  .    fts5Structu
8bc0: 72 65 52 65 6c 65 61 73 65 28 70 2d 3e 70 53 74  reRelease(p->pSt
8bd0: 72 75 63 74 29 3b 0a 20 20 20 20 70 2d 3e 70 53  ruct);.    p->pS
8be0: 74 72 75 63 74 20 3d 20 30 3b 0a 20 20 7d 0a 7d  truct = 0;.  }.}
8bf0: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
8c00: 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20  he total number 
8c10: 6f 66 20 73 65 67 6d 65 6e 74 73 20 69 6e 20 69  of segments in i
8c20: 6e 64 65 78 20 73 74 72 75 63 74 75 72 65 20 70  ndex structure p
8c30: 53 74 72 75 63 74 2e 20 54 68 69 73 0a 2a 2a 20  Struct. This.** 
8c40: 66 75 6e 63 74 69 6f 6e 20 69 73 20 6f 6e 6c 79  function is only
8c50: 20 65 76 65 72 20 75 73 65 64 20 61 73 20 70 61   ever used as pa
8c60: 72 74 20 6f 66 20 61 73 73 65 72 74 28 29 20 63  rt of assert() c
8c70: 6f 6e 64 69 74 69 6f 6e 73 2e 0a 2a 2f 0a 23 69  onditions..*/.#i
8c80: 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
8c90: 47 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73  G.static int fts
8ca0: 35 53 74 72 75 63 74 75 72 65 43 6f 75 6e 74 53  5StructureCountS
8cb0: 65 67 6d 65 6e 74 73 28 46 74 73 35 53 74 72 75  egments(Fts5Stru
8cc0: 63 74 75 72 65 20 2a 70 53 74 72 75 63 74 29 7b  cture *pStruct){
8cd0: 0a 20 20 69 6e 74 20 6e 53 65 67 6d 65 6e 74 20  .  int nSegment 
8ce0: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
8cf0: 20 20 20 2f 2a 20 54 6f 74 61 6c 20 6e 75 6d 62     /* Total numb
8d00: 65 72 20 6f 66 20 73 65 67 6d 65 6e 74 73 20 2a  er of segments *
8d10: 2f 0a 20 20 69 66 28 20 70 53 74 72 75 63 74 20  /.  if( pStruct 
8d20: 29 7b 0a 20 20 20 20 69 6e 74 20 69 4c 76 6c 3b  ){.    int iLvl;
8d30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8d40: 20 20 20 20 20 2f 2a 20 55 73 65 64 20 74 6f 20       /* Used to 
8d50: 69 74 65 72 61 74 65 20 74 68 72 6f 75 67 68 20  iterate through 
8d60: 6c 65 76 65 6c 73 20 2a 2f 0a 20 20 20 20 66 6f  levels */.    fo
8d70: 72 28 69 4c 76 6c 3d 30 3b 20 69 4c 76 6c 3c 70  r(iLvl=0; iLvl<p
8d80: 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 3b 20  Struct->nLevel; 
8d90: 69 4c 76 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 6e  iLvl++){.      n
8da0: 53 65 67 6d 65 6e 74 20 2b 3d 20 70 53 74 72 75  Segment += pStru
8db0: 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d  ct->aLevel[iLvl]
8dc0: 2e 6e 53 65 67 3b 0a 20 20 20 20 7d 0a 20 20 7d  .nSeg;.    }.  }
8dd0: 0a 0a 20 20 72 65 74 75 72 6e 20 6e 53 65 67 6d  ..  return nSegm
8de0: 65 6e 74 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23  ent;.}.#endif..#
8df0: 64 65 66 69 6e 65 20 66 74 73 35 42 75 66 66 65  define fts5Buffe
8e00: 72 53 61 66 65 41 70 70 65 6e 64 42 6c 6f 62 28  rSafeAppendBlob(
8e10: 70 42 75 66 2c 20 70 42 6c 6f 62 2c 20 6e 42 6c  pBuf, pBlob, nBl
8e20: 6f 62 29 20 7b 20 20 20 20 20 5c 0a 20 20 61 73  ob) {     \.  as
8e30: 73 65 72 74 28 20 28 70 42 75 66 29 2d 3e 6e 53  sert( (pBuf)->nS
8e40: 70 61 63 65 3e 3d 28 28 70 42 75 66 29 2d 3e 6e  pace>=((pBuf)->n
8e50: 2b 6e 42 6c 6f 62 29 20 29 3b 20 20 20 20 20 20  +nBlob) );      
8e60: 20 20 20 20 20 20 20 5c 0a 20 20 6d 65 6d 63 70         \.  memcp
8e70: 79 28 26 28 70 42 75 66 29 2d 3e 70 5b 28 70 42  y(&(pBuf)->p[(pB
8e80: 75 66 29 2d 3e 6e 5d 2c 20 70 42 6c 6f 62 2c 20  uf)->n], pBlob, 
8e90: 6e 42 6c 6f 62 29 3b 20 20 20 20 20 20 20 20 20  nBlob);         
8ea0: 20 20 20 20 5c 0a 20 20 28 70 42 75 66 29 2d 3e      \.  (pBuf)->
8eb0: 6e 20 2b 3d 20 6e 42 6c 6f 62 3b 20 20 20 20 20  n += nBlob;     
8ec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8ed0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8ee0: 20 5c 0a 7d 0a 0a 23 64 65 66 69 6e 65 20 66 74   \.}..#define ft
8ef0: 73 35 42 75 66 66 65 72 53 61 66 65 41 70 70 65  s5BufferSafeAppe
8f00: 6e 64 56 61 72 69 6e 74 28 70 42 75 66 2c 20 69  ndVarint(pBuf, i
8f10: 56 61 6c 29 20 7b 20 20 20 20 20 20 20 20 20 20  Val) {          
8f20: 20 20 20 20 20 20 5c 0a 20 20 28 70 42 75 66 29        \.  (pBuf)
8f30: 2d 3e 6e 20 2b 3d 20 73 71 6c 69 74 65 33 46 74  ->n += sqlite3Ft
8f40: 73 35 50 75 74 56 61 72 69 6e 74 28 26 28 70 42  s5PutVarint(&(pB
8f50: 75 66 29 2d 3e 70 5b 28 70 42 75 66 29 2d 3e 6e  uf)->p[(pBuf)->n
8f60: 5d 2c 20 28 69 56 61 6c 29 29 3b 20 20 5c 0a 20  ], (iVal));  \. 
8f70: 20 61 73 73 65 72 74 28 20 28 70 42 75 66 29 2d   assert( (pBuf)-
8f80: 3e 6e 53 70 61 63 65 3e 3d 28 70 42 75 66 29 2d  >nSpace>=(pBuf)-
8f90: 3e 6e 20 29 3b 20 20 20 20 20 20 20 20 20 20 20  >n );           
8fa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
8fb0: 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 53 65 72 69 61  .}.../*.** Seria
8fc0: 6c 69 7a 65 20 61 6e 64 20 73 74 6f 72 65 20 74  lize and store t
8fd0: 68 65 20 22 73 74 72 75 63 74 75 72 65 22 20 72  he "structure" r
8fe0: 65 63 6f 72 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ecord..**.** If 
8ff0: 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  an error occurs,
9000: 20 6c 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20   leave an error 
9010: 63 6f 64 65 20 69 6e 20 74 68 65 20 46 74 73 35  code in the Fts5
9020: 49 6e 64 65 78 20 6f 62 6a 65 63 74 2e 20 49 66  Index object. If
9030: 20 61 6e 0a 2a 2a 20 65 72 72 6f 72 20 68 61 73   an.** error has
9040: 20 61 6c 72 65 61 64 79 20 6f 63 63 75 72 72 65   already occurre
9050: 64 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  d, this function
9060: 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a   is a no-op..*/.
9070: 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
9080: 53 74 72 75 63 74 75 72 65 57 72 69 74 65 28 46  StructureWrite(F
9090: 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 46 74 73  ts5Index *p, Fts
90a0: 35 53 74 72 75 63 74 75 72 65 20 2a 70 53 74 72  5Structure *pStr
90b0: 75 63 74 29 7b 0a 20 20 69 66 28 20 70 2d 3e 72  uct){.  if( p->r
90c0: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
90d0: 20 20 20 20 46 74 73 35 42 75 66 66 65 72 20 62      Fts5Buffer b
90e0: 75 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  uf;             
90f0: 20 20 2f 2a 20 42 75 66 66 65 72 20 74 6f 20 73    /* Buffer to s
9100: 65 72 69 61 6c 69 7a 65 20 72 65 63 6f 72 64 20  erialize record 
9110: 69 6e 74 6f 20 2a 2f 0a 20 20 20 20 69 6e 74 20  into */.    int 
9120: 69 4c 76 6c 3b 20 20 20 20 20 20 20 20 20 20 20  iLvl;           
9130: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65            /* Use
9140: 64 20 74 6f 20 69 74 65 72 61 74 65 20 74 68 72  d to iterate thr
9150: 6f 75 67 68 20 6c 65 76 65 6c 73 20 2a 2f 0a 20  ough levels */. 
9160: 20 20 20 69 6e 74 20 69 43 6f 6f 6b 69 65 3b 20     int iCookie; 
9170: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9180: 20 2f 2a 20 43 6f 6f 6b 69 65 20 76 61 6c 75 65   /* Cookie value
9190: 20 74 6f 20 73 74 6f 72 65 20 2a 2f 0a 0a 20 20   to store */..  
91a0: 20 20 61 73 73 65 72 74 28 20 70 53 74 72 75 63    assert( pStruc
91b0: 74 2d 3e 6e 53 65 67 6d 65 6e 74 3d 3d 66 74 73  t->nSegment==fts
91c0: 35 53 74 72 75 63 74 75 72 65 43 6f 75 6e 74 53  5StructureCountS
91d0: 65 67 6d 65 6e 74 73 28 70 53 74 72 75 63 74 29  egments(pStruct)
91e0: 20 29 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 26   );.    memset(&
91f0: 62 75 66 2c 20 30 2c 20 73 69 7a 65 6f 66 28 46  buf, 0, sizeof(F
9200: 74 73 35 42 75 66 66 65 72 29 29 3b 0a 0a 20 20  ts5Buffer));..  
9210: 20 20 2f 2a 20 41 70 70 65 6e 64 20 74 68 65 20    /* Append the 
9220: 63 75 72 72 65 6e 74 20 63 6f 6e 66 69 67 75 72  current configur
9230: 61 74 69 6f 6e 20 63 6f 6f 6b 69 65 20 2a 2f 0a  ation cookie */.
9240: 20 20 20 20 69 43 6f 6f 6b 69 65 20 3d 20 70 2d      iCookie = p-
9250: 3e 70 43 6f 6e 66 69 67 2d 3e 69 43 6f 6f 6b 69  >pConfig->iCooki
9260: 65 3b 0a 20 20 20 20 69 66 28 20 69 43 6f 6f 6b  e;.    if( iCook
9270: 69 65 3c 30 20 29 20 69 43 6f 6f 6b 69 65 20 3d  ie<0 ) iCookie =
9280: 20 30 3b 0a 0a 20 20 20 20 69 66 28 20 30 3d 3d   0;..    if( 0==
9290: 73 71 6c 69 74 65 33 46 74 73 35 42 75 66 66 65  sqlite3Fts5Buffe
92a0: 72 53 69 7a 65 28 26 70 2d 3e 72 63 2c 20 26 62  rSize(&p->rc, &b
92b0: 75 66 2c 20 34 2b 39 2b 39 2b 39 29 20 29 7b 0a  uf, 4+9+9+9) ){.
92c0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 46 74 73        sqlite3Fts
92d0: 35 50 75 74 33 32 28 62 75 66 2e 70 2c 20 69 43  5Put32(buf.p, iC
92e0: 6f 6f 6b 69 65 29 3b 0a 20 20 20 20 20 20 62 75  ookie);.      bu
92f0: 66 2e 6e 20 3d 20 34 3b 0a 20 20 20 20 20 20 66  f.n = 4;.      f
9300: 74 73 35 42 75 66 66 65 72 53 61 66 65 41 70 70  ts5BufferSafeApp
9310: 65 6e 64 56 61 72 69 6e 74 28 26 62 75 66 2c 20  endVarint(&buf, 
9320: 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 29  pStruct->nLevel)
9330: 3b 0a 20 20 20 20 20 20 66 74 73 35 42 75 66 66  ;.      fts5Buff
9340: 65 72 53 61 66 65 41 70 70 65 6e 64 56 61 72 69  erSafeAppendVari
9350: 6e 74 28 26 62 75 66 2c 20 70 53 74 72 75 63 74  nt(&buf, pStruct
9360: 2d 3e 6e 53 65 67 6d 65 6e 74 29 3b 0a 20 20 20  ->nSegment);.   
9370: 20 20 20 66 74 73 35 42 75 66 66 65 72 53 61 66     fts5BufferSaf
9380: 65 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26 62  eAppendVarint(&b
9390: 75 66 2c 20 28 69 36 34 29 70 53 74 72 75 63 74  uf, (i64)pStruct
93a0: 2d 3e 6e 57 72 69 74 65 43 6f 75 6e 74 65 72 29  ->nWriteCounter)
93b0: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 66 6f 72  ;.    }..    for
93c0: 28 69 4c 76 6c 3d 30 3b 20 69 4c 76 6c 3c 70 53  (iLvl=0; iLvl<pS
93d0: 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 3b 20 69  truct->nLevel; i
93e0: 4c 76 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e  Lvl++){.      in
93f0: 74 20 69 53 65 67 3b 20 20 20 20 20 20 20 20 20  t iSeg;         
9400: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55              /* U
9410: 73 65 64 20 74 6f 20 69 74 65 72 61 74 65 20 74  sed to iterate t
9420: 68 72 6f 75 67 68 20 73 65 67 6d 65 6e 74 73 20  hrough segments 
9430: 2a 2f 0a 20 20 20 20 20 20 46 74 73 35 53 74 72  */.      Fts5Str
9440: 75 63 74 75 72 65 4c 65 76 65 6c 20 2a 70 4c 76  uctureLevel *pLv
9450: 6c 20 3d 20 26 70 53 74 72 75 63 74 2d 3e 61 4c  l = &pStruct->aL
9460: 65 76 65 6c 5b 69 4c 76 6c 5d 3b 0a 20 20 20 20  evel[iLvl];.    
9470: 20 20 66 74 73 35 42 75 66 66 65 72 41 70 70 65    fts5BufferAppe
9480: 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c  ndVarint(&p->rc,
9490: 20 26 62 75 66 2c 20 70 4c 76 6c 2d 3e 6e 4d 65   &buf, pLvl->nMe
94a0: 72 67 65 29 3b 0a 20 20 20 20 20 20 66 74 73 35  rge);.      fts5
94b0: 42 75 66 66 65 72 41 70 70 65 6e 64 56 61 72 69  BufferAppendVari
94c0: 6e 74 28 26 70 2d 3e 72 63 2c 20 26 62 75 66 2c  nt(&p->rc, &buf,
94d0: 20 70 4c 76 6c 2d 3e 6e 53 65 67 29 3b 0a 20 20   pLvl->nSeg);.  
94e0: 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 76 6c      assert( pLvl
94f0: 2d 3e 6e 4d 65 72 67 65 3c 3d 70 4c 76 6c 2d 3e  ->nMerge<=pLvl->
9500: 6e 53 65 67 20 29 3b 0a 0a 20 20 20 20 20 20 66  nSeg );..      f
9510: 6f 72 28 69 53 65 67 3d 30 3b 20 69 53 65 67 3c  or(iSeg=0; iSeg<
9520: 70 4c 76 6c 2d 3e 6e 53 65 67 3b 20 69 53 65 67  pLvl->nSeg; iSeg
9530: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 66 74 73  ++){.        fts
9540: 35 42 75 66 66 65 72 41 70 70 65 6e 64 56 61 72  5BufferAppendVar
9550: 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26 62 75 66  int(&p->rc, &buf
9560: 2c 20 70 4c 76 6c 2d 3e 61 53 65 67 5b 69 53 65  , pLvl->aSeg[iSe
9570: 67 5d 2e 69 53 65 67 69 64 29 3b 0a 20 20 20 20  g].iSegid);.    
9580: 20 20 20 20 66 74 73 35 42 75 66 66 65 72 41 70      fts5BufferAp
9590: 70 65 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e 72  pendVarint(&p->r
95a0: 63 2c 20 26 62 75 66 2c 20 70 4c 76 6c 2d 3e 61  c, &buf, pLvl->a
95b0: 53 65 67 5b 69 53 65 67 5d 2e 70 67 6e 6f 46 69  Seg[iSeg].pgnoFi
95c0: 72 73 74 29 3b 0a 20 20 20 20 20 20 20 20 66 74  rst);.        ft
95d0: 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 56 61  s5BufferAppendVa
95e0: 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26 62 75  rint(&p->rc, &bu
95f0: 66 2c 20 70 4c 76 6c 2d 3e 61 53 65 67 5b 69 53  f, pLvl->aSeg[iS
9600: 65 67 5d 2e 70 67 6e 6f 4c 61 73 74 29 3b 0a 20  eg].pgnoLast);. 
9610: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
9620: 20 20 66 74 73 35 44 61 74 61 57 72 69 74 65 28    fts5DataWrite(
9630: 70 2c 20 46 54 53 35 5f 53 54 52 55 43 54 55 52  p, FTS5_STRUCTUR
9640: 45 5f 52 4f 57 49 44 2c 20 62 75 66 2e 70 2c 20  E_ROWID, buf.p, 
9650: 62 75 66 2e 6e 29 3b 0a 20 20 20 20 66 74 73 35  buf.n);.    fts5
9660: 42 75 66 66 65 72 46 72 65 65 28 26 62 75 66 29  BufferFree(&buf)
9670: 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 20 30 0a 73  ;.  }.}..#if 0.s
9680: 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 44  tatic void fts5D
9690: 65 62 75 67 53 74 72 75 63 74 75 72 65 28 69 6e  ebugStructure(in
96a0: 74 2a 2c 46 74 73 35 42 75 66 66 65 72 2a 2c 46  t*,Fts5Buffer*,F
96b0: 74 73 35 53 74 72 75 63 74 75 72 65 2a 29 3b 0a  ts5Structure*);.
96c0: 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
96d0: 50 72 69 6e 74 53 74 72 75 63 74 75 72 65 28 63  PrintStructure(c
96e0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 61 70 74  onst char *zCapt
96f0: 69 6f 6e 2c 20 46 74 73 35 53 74 72 75 63 74 75  ion, Fts5Structu
9700: 72 65 20 2a 70 53 74 72 75 63 74 29 7b 0a 20 20  re *pStruct){.  
9710: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
9720: 4f 4b 3b 0a 20 20 46 74 73 35 42 75 66 66 65 72  OK;.  Fts5Buffer
9730: 20 62 75 66 3b 0a 20 20 6d 65 6d 73 65 74 28 26   buf;.  memset(&
9740: 62 75 66 2c 20 30 2c 20 73 69 7a 65 6f 66 28 62  buf, 0, sizeof(b
9750: 75 66 29 29 3b 0a 20 20 66 74 73 35 44 65 62 75  uf));.  fts5Debu
9760: 67 53 74 72 75 63 74 75 72 65 28 26 72 63 2c 20  gStructure(&rc, 
9770: 26 62 75 66 2c 20 70 53 74 72 75 63 74 29 3b 0a  &buf, pStruct);.
9780: 20 20 66 70 72 69 6e 74 66 28 73 74 64 6f 75 74    fprintf(stdout
9790: 2c 20 22 25 73 3a 20 25 73 5c 6e 22 2c 20 7a 43  , "%s: %s\n", zC
97a0: 61 70 74 69 6f 6e 2c 20 62 75 66 2e 70 29 3b 0a  aption, buf.p);.
97b0: 20 20 66 66 6c 75 73 68 28 73 74 64 6f 75 74 29    fflush(stdout)
97c0: 3b 0a 20 20 66 74 73 35 42 75 66 66 65 72 46 72  ;.  fts5BufferFr
97d0: 65 65 28 26 62 75 66 29 3b 0a 7d 0a 23 65 6c 73  ee(&buf);.}.#els
97e0: 65 0a 23 20 64 65 66 69 6e 65 20 66 74 73 35 50  e.# define fts5P
97f0: 72 69 6e 74 53 74 72 75 63 74 75 72 65 28 78 2c  rintStructure(x,
9800: 79 29 0a 23 65 6e 64 69 66 0a 0a 73 74 61 74 69  y).#endif..stati
9810: 63 20 69 6e 74 20 66 74 73 35 53 65 67 6d 65 6e  c int fts5Segmen
9820: 74 53 69 7a 65 28 46 74 73 35 53 74 72 75 63 74  tSize(Fts5Struct
9830: 75 72 65 53 65 67 6d 65 6e 74 20 2a 70 53 65 67  ureSegment *pSeg
9840: 29 7b 0a 20 20 72 65 74 75 72 6e 20 31 20 2b 20  ){.  return 1 + 
9850: 70 53 65 67 2d 3e 70 67 6e 6f 4c 61 73 74 20 2d  pSeg->pgnoLast -
9860: 20 70 53 65 67 2d 3e 70 67 6e 6f 46 69 72 73 74   pSeg->pgnoFirst
9870: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
9880: 6e 20 61 20 63 6f 70 79 20 6f 66 20 69 6e 64 65  n a copy of inde
9890: 78 20 73 74 72 75 63 74 75 72 65 20 70 53 74 72  x structure pStr
98a0: 75 63 74 2e 20 45 78 63 65 70 74 2c 20 70 72 6f  uct. Except, pro
98b0: 6d 6f 74 65 20 61 73 20 6d 61 6e 79 20 0a 2a 2a  mote as many .**
98c0: 20 73 65 67 6d 65 6e 74 73 20 61 73 20 70 6f 73   segments as pos
98d0: 73 69 62 6c 65 20 74 6f 20 6c 65 76 65 6c 20 69  sible to level i
98e0: 50 72 6f 6d 6f 74 65 2e 20 49 66 20 61 6e 20 4f  Promote. If an O
98f0: 4f 4d 20 6f 63 63 75 72 73 2c 20 4e 55 4c 4c 20  OM occurs, NULL 
9900: 69 73 20 0a 2a 2a 20 72 65 74 75 72 6e 65 64 2e  is .** returned.
9910: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
9920: 66 74 73 35 53 74 72 75 63 74 75 72 65 50 72 6f  fts5StructurePro
9930: 6d 6f 74 65 54 6f 28 0a 20 20 46 74 73 35 49 6e  moteTo(.  Fts5In
9940: 64 65 78 20 2a 70 2c 0a 20 20 69 6e 74 20 69 50  dex *p,.  int iP
9950: 72 6f 6d 6f 74 65 2c 0a 20 20 69 6e 74 20 73 7a  romote,.  int sz
9960: 50 72 6f 6d 6f 74 65 2c 0a 20 20 46 74 73 35 53  Promote,.  Fts5S
9970: 74 72 75 63 74 75 72 65 20 2a 70 53 74 72 75 63  tructure *pStruc
9980: 74 0a 29 7b 0a 20 20 69 6e 74 20 69 6c 2c 20 69  t.){.  int il, i
9990: 73 3b 0a 20 20 46 74 73 35 53 74 72 75 63 74 75  s;.  Fts5Structu
99a0: 72 65 4c 65 76 65 6c 20 2a 70 4f 75 74 20 3d 20  reLevel *pOut = 
99b0: 26 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c  &pStruct->aLevel
99c0: 5b 69 50 72 6f 6d 6f 74 65 5d 3b 0a 0a 20 20 69  [iPromote];..  i
99d0: 66 28 20 70 4f 75 74 2d 3e 6e 4d 65 72 67 65 3d  f( pOut->nMerge=
99e0: 3d 30 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 6c  =0 ){.    for(il
99f0: 3d 69 50 72 6f 6d 6f 74 65 2b 31 3b 20 69 6c 3c  =iPromote+1; il<
9a00: 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 3b  pStruct->nLevel;
9a10: 20 69 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 46 74   il++){.      Ft
9a20: 73 35 53 74 72 75 63 74 75 72 65 4c 65 76 65 6c  s5StructureLevel
9a30: 20 2a 70 4c 76 6c 20 3d 20 26 70 53 74 72 75 63   *pLvl = &pStruc
9a40: 74 2d 3e 61 4c 65 76 65 6c 5b 69 6c 5d 3b 0a 20  t->aLevel[il];. 
9a50: 20 20 20 20 20 69 66 28 20 70 4c 76 6c 2d 3e 6e       if( pLvl->n
9a60: 4d 65 72 67 65 20 29 20 72 65 74 75 72 6e 3b 0a  Merge ) return;.
9a70: 20 20 20 20 20 20 66 6f 72 28 69 73 3d 70 4c 76        for(is=pLv
9a80: 6c 2d 3e 6e 53 65 67 2d 31 3b 20 69 73 3e 3d 30  l->nSeg-1; is>=0
9a90: 3b 20 69 73 2d 2d 29 7b 0a 20 20 20 20 20 20 20  ; is--){.       
9aa0: 20 69 6e 74 20 73 7a 20 3d 20 66 74 73 35 53 65   int sz = fts5Se
9ab0: 67 6d 65 6e 74 53 69 7a 65 28 26 70 4c 76 6c 2d  gmentSize(&pLvl-
9ac0: 3e 61 53 65 67 5b 69 73 5d 29 3b 0a 20 20 20 20  >aSeg[is]);.    
9ad0: 20 20 20 20 69 66 28 20 73 7a 3e 73 7a 50 72 6f      if( sz>szPro
9ae0: 6d 6f 74 65 20 29 20 72 65 74 75 72 6e 3b 0a 20  mote ) return;. 
9af0: 20 20 20 20 20 20 20 66 74 73 35 53 74 72 75 63         fts5Struc
9b00: 74 75 72 65 45 78 74 65 6e 64 4c 65 76 65 6c 28  tureExtendLevel(
9b10: 26 70 2d 3e 72 63 2c 20 70 53 74 72 75 63 74 2c  &p->rc, pStruct,
9b20: 20 69 50 72 6f 6d 6f 74 65 2c 20 31 2c 20 31 29   iPromote, 1, 1)
9b30: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 2d  ;.        if( p-
9b40: 3e 72 63 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  >rc ) return;.  
9b50: 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 4f 75        memcpy(pOu
9b60: 74 2d 3e 61 53 65 67 2c 20 26 70 4c 76 6c 2d 3e  t->aSeg, &pLvl->
9b70: 61 53 65 67 5b 69 73 5d 2c 20 73 69 7a 65 6f 66  aSeg[is], sizeof
9b80: 28 46 74 73 35 53 74 72 75 63 74 75 72 65 53 65  (Fts5StructureSe
9b90: 67 6d 65 6e 74 29 29 3b 0a 20 20 20 20 20 20 20  gment));.       
9ba0: 20 70 4f 75 74 2d 3e 6e 53 65 67 2b 2b 3b 0a 20   pOut->nSeg++;. 
9bb0: 20 20 20 20 20 20 20 70 4c 76 6c 2d 3e 6e 53 65         pLvl->nSe
9bc0: 67 2d 2d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  g--;.      }.   
9bd0: 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
9be0: 41 20 6e 65 77 20 73 65 67 6d 65 6e 74 20 68 61  A new segment ha
9bf0: 73 20 6a 75 73 74 20 62 65 65 6e 20 77 72 69 74  s just been writ
9c00: 74 65 6e 20 74 6f 20 6c 65 76 65 6c 20 69 4c 76  ten to level iLv
9c10: 6c 20 6f 66 20 69 6e 64 65 78 20 73 74 72 75 63  l of index struc
9c20: 74 75 72 65 0a 2a 2a 20 70 53 74 72 75 63 74 2e  ture.** pStruct.
9c30: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 64   This function d
9c40: 65 74 65 72 6d 69 6e 65 73 20 69 66 20 61 6e 79  etermines if any
9c50: 20 73 65 67 6d 65 6e 74 73 20 73 68 6f 75 6c 64   segments should
9c60: 20 62 65 20 70 72 6f 6d 6f 74 65 64 0a 2a 2a 20   be promoted.** 
9c70: 61 73 20 61 20 72 65 73 75 6c 74 2e 20 53 65 67  as a result. Seg
9c80: 6d 65 6e 74 73 20 61 72 65 20 70 72 6f 6d 6f 74  ments are promot
9c90: 65 64 20 69 6e 20 74 77 6f 20 73 63 65 6e 61 72  ed in two scenar
9ca0: 69 6f 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 61 29 20  ios:.**.**   a) 
9cb0: 49 66 20 74 68 65 20 73 65 67 6d 65 6e 74 20 6a  If the segment j
9cc0: 75 73 74 20 77 72 69 74 74 65 6e 20 69 73 20 73  ust written is s
9cd0: 6d 61 6c 6c 65 72 20 74 68 61 6e 20 6f 6e 65 20  maller than one 
9ce0: 6f 72 20 6d 6f 72 65 20 73 65 67 6d 65 6e 74 73  or more segments
9cf0: 0a 2a 2a 20 20 20 20 20 20 77 69 74 68 69 6e 20  .**      within 
9d00: 74 68 65 20 70 72 65 76 69 6f 75 73 20 70 6f 70  the previous pop
9d10: 75 6c 61 74 65 64 20 6c 65 76 65 6c 2c 20 69 74  ulated level, it
9d20: 20 69 73 20 70 72 6f 6d 6f 74 65 64 20 74 6f 20   is promoted to 
9d30: 74 68 65 20 70 72 65 76 69 6f 75 73 0a 2a 2a 20  the previous.** 
9d40: 20 20 20 20 20 70 6f 70 75 6c 61 74 65 64 20 6c       populated l
9d50: 65 76 65 6c 2e 0a 2a 2a 0a 2a 2a 20 20 20 62 29  evel..**.**   b)
9d60: 20 49 66 20 74 68 65 20 73 65 67 6d 65 6e 74 20   If the segment 
9d70: 6a 75 73 74 20 77 72 69 74 74 65 6e 20 69 73 20  just written is 
9d80: 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68 65 20  larger than the 
9d90: 6e 65 77 65 73 74 20 73 65 67 6d 65 6e 74 20 6f  newest segment o
9da0: 6e 0a 2a 2a 20 20 20 20 20 20 74 68 65 20 6e 65  n.**      the ne
9db0: 78 74 20 70 6f 70 75 6c 61 74 65 64 20 6c 65 76  xt populated lev
9dc0: 65 6c 2c 20 74 68 65 6e 20 74 68 61 74 20 73 65  el, then that se
9dd0: 67 6d 65 6e 74 2c 20 61 6e 64 20 61 6e 79 20 6f  gment, and any o
9de0: 74 68 65 72 20 61 64 6a 61 63 65 6e 74 0a 2a 2a  ther adjacent.**
9df0: 20 20 20 20 20 20 73 65 67 6d 65 6e 74 73 20 74        segments t
9e00: 68 61 74 20 61 72 65 20 61 6c 73 6f 20 73 6d 61  hat are also sma
9e10: 6c 6c 65 72 20 74 68 61 6e 20 74 68 65 20 6f 6e  ller than the on
9e20: 65 20 6a 75 73 74 20 77 72 69 74 74 65 6e 2c 20  e just written, 
9e30: 61 72 65 20 0a 2a 2a 20 20 20 20 20 20 70 72 6f  are .**      pro
9e40: 6d 6f 74 65 64 2e 20 0a 2a 2a 0a 2a 2a 20 49 66  moted. .**.** If
9e50: 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 73 65 67   one or more seg
9e60: 6d 65 6e 74 73 20 61 72 65 20 70 72 6f 6d 6f 74  ments are promot
9e70: 65 64 2c 20 74 68 65 20 73 74 72 75 63 74 75 72  ed, the structur
9e80: 65 20 6f 62 6a 65 63 74 20 69 73 20 75 70 64 61  e object is upda
9e90: 74 65 64 0a 2a 2a 20 74 6f 20 72 65 66 6c 65 63  ted.** to reflec
9ea0: 74 20 74 68 69 73 2e 0a 2a 2f 0a 73 74 61 74 69  t this..*/.stati
9eb0: 63 20 76 6f 69 64 20 66 74 73 35 53 74 72 75 63  c void fts5Struc
9ec0: 74 75 72 65 50 72 6f 6d 6f 74 65 28 0a 20 20 46  turePromote(.  F
9ed0: 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20  ts5Index *p,    
9ee0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
9ef0: 2a 20 46 54 53 35 20 62 61 63 6b 65 6e 64 20 6f  * FTS5 backend o
9f00: 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20 69  bject */.  int i
9f10: 4c 76 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20  Lvl,            
9f20: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
9f30: 64 65 78 20 6c 65 76 65 6c 20 6a 75 73 74 20 75  dex level just u
9f40: 70 64 61 74 65 64 20 2a 2f 0a 20 20 46 74 73 35  pdated */.  Fts5
9f50: 53 74 72 75 63 74 75 72 65 20 2a 70 53 74 72 75  Structure *pStru
9f60: 63 74 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49  ct          /* I
9f70: 6e 64 65 78 20 73 74 72 75 63 74 75 72 65 20 2a  ndex structure *
9f80: 2f 0a 29 7b 0a 20 20 69 66 28 20 70 2d 3e 72 63  /.){.  if( p->rc
9f90: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
9fa0: 20 20 20 69 6e 74 20 69 54 73 74 3b 0a 20 20 20     int iTst;.   
9fb0: 20 69 6e 74 20 69 50 72 6f 6d 6f 74 65 20 3d 20   int iPromote = 
9fc0: 2d 31 3b 0a 20 20 20 20 69 6e 74 20 73 7a 50 72  -1;.    int szPr
9fd0: 6f 6d 6f 74 65 20 3d 20 30 3b 20 20 20 20 20 20  omote = 0;      
9fe0: 20 20 20 20 20 20 2f 2a 20 50 72 6f 6d 6f 74 65        /* Promote
9ff0: 20 61 6e 79 74 68 69 6e 67 20 74 68 69 73 20 73   anything this s
a000: 69 7a 65 20 6f 72 20 73 6d 61 6c 6c 65 72 20 2a  ize or smaller *
a010: 2f 0a 20 20 20 20 46 74 73 35 53 74 72 75 63 74  /.    Fts5Struct
a020: 75 72 65 53 65 67 6d 65 6e 74 20 2a 70 53 65 67  ureSegment *pSeg
a030: 3b 20 20 20 2f 2a 20 53 65 67 6d 65 6e 74 20 6a  ;   /* Segment j
a040: 75 73 74 20 77 72 69 74 74 65 6e 20 2a 2f 0a 20  ust written */. 
a050: 20 20 20 69 6e 74 20 73 7a 53 65 67 3b 20 20 20     int szSeg;   
a060: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a070: 20 2f 2a 20 53 69 7a 65 20 6f 66 20 73 65 67 6d   /* Size of segm
a080: 65 6e 74 20 6a 75 73 74 20 77 72 69 74 74 65 6e  ent just written
a090: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 53 65 67   */.    int nSeg
a0a0: 20 3d 20 70 53 74 72 75 63 74 2d 3e 61 4c 65 76   = pStruct->aLev
a0b0: 65 6c 5b 69 4c 76 6c 5d 2e 6e 53 65 67 3b 0a 0a  el[iLvl].nSeg;..
a0c0: 20 20 20 20 69 66 28 20 6e 53 65 67 3d 3d 30 20      if( nSeg==0 
a0d0: 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 70 53  ) return;.    pS
a0e0: 65 67 20 3d 20 26 70 53 74 72 75 63 74 2d 3e 61  eg = &pStruct->a
a0f0: 4c 65 76 65 6c 5b 69 4c 76 6c 5d 2e 61 53 65 67  Level[iLvl].aSeg
a100: 5b 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c  [pStruct->aLevel
a110: 5b 69 4c 76 6c 5d 2e 6e 53 65 67 2d 31 5d 3b 0a  [iLvl].nSeg-1];.
a120: 20 20 20 20 73 7a 53 65 67 20 3d 20 28 31 20 2b      szSeg = (1 +
a130: 20 70 53 65 67 2d 3e 70 67 6e 6f 4c 61 73 74 20   pSeg->pgnoLast 
a140: 2d 20 70 53 65 67 2d 3e 70 67 6e 6f 46 69 72 73  - pSeg->pgnoFirs
a150: 74 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63  t);..    /* Chec
a160: 6b 20 66 6f 72 20 63 6f 6e 64 69 74 69 6f 6e 20  k for condition 
a170: 28 61 29 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69  (a) */.    for(i
a180: 54 73 74 3d 69 4c 76 6c 2d 31 3b 20 69 54 73 74  Tst=iLvl-1; iTst
a190: 3e 3d 30 20 26 26 20 70 53 74 72 75 63 74 2d 3e  >=0 && pStruct->
a1a0: 61 4c 65 76 65 6c 5b 69 54 73 74 5d 2e 6e 53 65  aLevel[iTst].nSe
a1b0: 67 3d 3d 30 3b 20 69 54 73 74 2d 2d 29 3b 0a 20  g==0; iTst--);. 
a1c0: 20 20 20 69 66 28 20 69 54 73 74 3e 3d 30 20 29     if( iTst>=0 )
a1d0: 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20  {.      int i;. 
a1e0: 20 20 20 20 20 69 6e 74 20 73 7a 4d 61 78 20 3d       int szMax =
a1f0: 20 30 3b 0a 20 20 20 20 20 20 46 74 73 35 53 74   0;.      Fts5St
a200: 72 75 63 74 75 72 65 4c 65 76 65 6c 20 2a 70 54  ructureLevel *pT
a210: 73 74 20 3d 20 26 70 53 74 72 75 63 74 2d 3e 61  st = &pStruct->a
a220: 4c 65 76 65 6c 5b 69 54 73 74 5d 3b 0a 20 20 20  Level[iTst];.   
a230: 20 20 20 61 73 73 65 72 74 28 20 70 54 73 74 2d     assert( pTst-
a240: 3e 6e 4d 65 72 67 65 3d 3d 30 20 29 3b 0a 20 20  >nMerge==0 );.  
a250: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
a260: 54 73 74 2d 3e 6e 53 65 67 3b 20 69 2b 2b 29 7b  Tst->nSeg; i++){
a270: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 73 7a 20  .        int sz 
a280: 3d 20 70 54 73 74 2d 3e 61 53 65 67 5b 69 5d 2e  = pTst->aSeg[i].
a290: 70 67 6e 6f 4c 61 73 74 20 2d 20 70 54 73 74 2d  pgnoLast - pTst-
a2a0: 3e 61 53 65 67 5b 69 5d 2e 70 67 6e 6f 46 69 72  >aSeg[i].pgnoFir
a2b0: 73 74 20 2b 20 31 3b 0a 20 20 20 20 20 20 20 20  st + 1;.        
a2c0: 69 66 28 20 73 7a 3e 73 7a 4d 61 78 20 29 20 73  if( sz>szMax ) s
a2d0: 7a 4d 61 78 20 3d 20 73 7a 3b 0a 20 20 20 20 20  zMax = sz;.     
a2e0: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 73 7a 4d   }.      if( szM
a2f0: 61 78 3e 3d 73 7a 53 65 67 20 29 7b 0a 20 20 20  ax>=szSeg ){.   
a300: 20 20 20 20 20 2f 2a 20 43 6f 6e 64 69 74 69 6f       /* Conditio
a310: 6e 20 28 61 29 20 69 73 20 74 72 75 65 2e 20 50  n (a) is true. P
a320: 72 6f 6d 6f 74 65 20 74 68 65 20 6e 65 77 65 73  romote the newes
a330: 74 20 73 65 67 6d 65 6e 74 20 6f 6e 20 6c 65 76  t segment on lev
a340: 65 6c 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 69  el .        ** i
a350: 4c 76 6c 20 74 6f 20 6c 65 76 65 6c 20 69 54 73  Lvl to level iTs
a360: 74 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69  t.  */.        i
a370: 50 72 6f 6d 6f 74 65 20 3d 20 69 54 73 74 3b 0a  Promote = iTst;.
a380: 20 20 20 20 20 20 20 20 73 7a 50 72 6f 6d 6f 74          szPromot
a390: 65 20 3d 20 73 7a 4d 61 78 3b 0a 20 20 20 20 20  e = szMax;.     
a3a0: 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a   }.    }..    /*
a3b0: 20 49 66 20 63 6f 6e 64 69 74 69 6f 6e 20 28 61   If condition (a
a3c0: 29 20 69 73 20 6e 6f 74 20 6d 65 74 2c 20 61 73  ) is not met, as
a3d0: 73 75 6d 65 20 28 62 29 20 69 73 20 74 72 75 65  sume (b) is true
a3e0: 2e 20 53 74 72 75 63 74 75 72 65 50 72 6f 6d 6f  . StructurePromo
a3f0: 74 65 54 6f 28 29 0a 20 20 20 20 2a 2a 20 69 73  teTo().    ** is
a400: 20 61 20 6e 6f 2d 6f 70 20 69 66 20 69 74 20 69   a no-op if it i
a410: 73 20 6e 6f 74 2e 20 20 2a 2f 0a 20 20 20 20 69  s not.  */.    i
a420: 66 28 20 69 50 72 6f 6d 6f 74 65 3c 30 20 29 7b  f( iPromote<0 ){
a430: 0a 20 20 20 20 20 20 69 50 72 6f 6d 6f 74 65 20  .      iPromote 
a440: 3d 20 69 4c 76 6c 3b 0a 20 20 20 20 20 20 73 7a  = iLvl;.      sz
a450: 50 72 6f 6d 6f 74 65 20 3d 20 73 7a 53 65 67 3b  Promote = szSeg;
a460: 0a 20 20 20 20 7d 0a 20 20 20 20 66 74 73 35 53  .    }.    fts5S
a470: 74 72 75 63 74 75 72 65 50 72 6f 6d 6f 74 65 54  tructurePromoteT
a480: 6f 28 70 2c 20 69 50 72 6f 6d 6f 74 65 2c 20 73  o(p, iPromote, s
a490: 7a 50 72 6f 6d 6f 74 65 2c 20 70 53 74 72 75 63  zPromote, pStruc
a4a0: 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a  t);.  }.}.../*.*
a4b0: 2a 20 41 64 76 61 6e 63 65 20 74 68 65 20 69 74  * Advance the it
a4c0: 65 72 61 74 6f 72 20 70 61 73 73 65 64 20 61 73  erator passed as
a4d0: 20 74 68 65 20 6f 6e 6c 79 20 61 72 67 75 6d 65   the only argume
a4e0: 6e 74 2e 20 49 66 20 74 68 65 20 65 6e 64 20 6f  nt. If the end o
a4f0: 66 20 74 68 65 20 0a 2a 2a 20 64 6f 63 6c 69 73  f the .** doclis
a500: 74 2d 69 6e 64 65 78 20 70 61 67 65 20 69 73 20  t-index page is 
a510: 72 65 61 63 68 65 64 2c 20 72 65 74 75 72 6e 20  reached, return 
a520: 6e 6f 6e 2d 7a 65 72 6f 2e 0a 2a 2f 0a 73 74 61  non-zero..*/.sta
a530: 74 69 63 20 69 6e 74 20 66 74 73 35 44 6c 69 64  tic int fts5Dlid
a540: 78 4c 76 6c 4e 65 78 74 28 46 74 73 35 44 6c 69  xLvlNext(Fts5Dli
a550: 64 78 4c 76 6c 20 2a 70 4c 76 6c 29 7b 0a 20 20  dxLvl *pLvl){.  
a560: 46 74 73 35 44 61 74 61 20 2a 70 44 61 74 61 20  Fts5Data *pData 
a570: 3d 20 70 4c 76 6c 2d 3e 70 44 61 74 61 3b 0a 0a  = pLvl->pData;..
a580: 20 20 69 66 28 20 70 4c 76 6c 2d 3e 69 4f 66 66    if( pLvl->iOff
a590: 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72  ==0 ){.    asser
a5a0: 74 28 20 70 4c 76 6c 2d 3e 62 45 6f 66 3d 3d 30  t( pLvl->bEof==0
a5b0: 20 29 3b 0a 20 20 20 20 70 4c 76 6c 2d 3e 69 4f   );.    pLvl->iO
a5c0: 66 66 20 3d 20 31 3b 0a 20 20 20 20 70 4c 76 6c  ff = 1;.    pLvl
a5d0: 2d 3e 69 4f 66 66 20 2b 3d 20 66 74 73 35 47 65  ->iOff += fts5Ge
a5e0: 74 56 61 72 69 6e 74 33 32 28 26 70 44 61 74 61  tVarint32(&pData
a5f0: 2d 3e 70 5b 31 5d 2c 20 70 4c 76 6c 2d 3e 69 4c  ->p[1], pLvl->iL
a600: 65 61 66 50 67 6e 6f 29 3b 0a 20 20 20 20 70 4c  eafPgno);.    pL
a610: 76 6c 2d 3e 69 4f 66 66 20 2b 3d 20 66 74 73 35  vl->iOff += fts5
a620: 47 65 74 56 61 72 69 6e 74 28 26 70 44 61 74 61  GetVarint(&pData
a630: 2d 3e 70 5b 70 4c 76 6c 2d 3e 69 4f 66 66 5d 2c  ->p[pLvl->iOff],
a640: 20 28 75 36 34 2a 29 26 70 4c 76 6c 2d 3e 69 52   (u64*)&pLvl->iR
a650: 6f 77 69 64 29 3b 0a 20 20 20 20 70 4c 76 6c 2d  owid);.    pLvl-
a660: 3e 69 46 69 72 73 74 4f 66 66 20 3d 20 70 4c 76  >iFirstOff = pLv
a670: 6c 2d 3e 69 4f 66 66 3b 0a 20 20 7d 65 6c 73 65  l->iOff;.  }else
a680: 7b 0a 20 20 20 20 69 6e 74 20 69 4f 66 66 3b 0a  {.    int iOff;.
a690: 20 20 20 20 66 6f 72 28 69 4f 66 66 3d 70 4c 76      for(iOff=pLv
a6a0: 6c 2d 3e 69 4f 66 66 3b 20 69 4f 66 66 3c 70 44  l->iOff; iOff<pD
a6b0: 61 74 61 2d 3e 6e 6e 3b 20 69 4f 66 66 2b 2b 29  ata->nn; iOff++)
a6c0: 7b 0a 20 20 20 20 20 20 69 66 28 20 70 44 61 74  {.      if( pDat
a6d0: 61 2d 3e 70 5b 69 4f 66 66 5d 20 29 20 62 72 65  a->p[iOff] ) bre
a6e0: 61 6b 3b 20 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ak; .    }..    
a6f0: 69 66 28 20 69 4f 66 66 3c 70 44 61 74 61 2d 3e  if( iOff<pData->
a700: 6e 6e 20 29 7b 0a 20 20 20 20 20 20 69 36 34 20  nn ){.      i64 
a710: 69 56 61 6c 3b 0a 20 20 20 20 20 20 70 4c 76 6c  iVal;.      pLvl
a720: 2d 3e 69 4c 65 61 66 50 67 6e 6f 20 2b 3d 20 28  ->iLeafPgno += (
a730: 69 4f 66 66 20 2d 20 70 4c 76 6c 2d 3e 69 4f 66  iOff - pLvl->iOf
a740: 66 29 20 2b 20 31 3b 0a 20 20 20 20 20 20 69 4f  f) + 1;.      iO
a750: 66 66 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72  ff += fts5GetVar
a760: 69 6e 74 28 26 70 44 61 74 61 2d 3e 70 5b 69 4f  int(&pData->p[iO
a770: 66 66 5d 2c 20 28 75 36 34 2a 29 26 69 56 61 6c  ff], (u64*)&iVal
a780: 29 3b 0a 20 20 20 20 20 20 70 4c 76 6c 2d 3e 69  );.      pLvl->i
a790: 52 6f 77 69 64 20 2b 3d 20 69 56 61 6c 3b 0a 20  Rowid += iVal;. 
a7a0: 20 20 20 20 20 70 4c 76 6c 2d 3e 69 4f 66 66 20       pLvl->iOff 
a7b0: 3d 20 69 4f 66 66 3b 0a 20 20 20 20 7d 65 6c 73  = iOff;.    }els
a7c0: 65 7b 0a 20 20 20 20 20 20 70 4c 76 6c 2d 3e 62  e{.      pLvl->b
a7d0: 45 6f 66 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20  Eof = 1;.    }. 
a7e0: 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70 4c 76   }..  return pLv
a7f0: 6c 2d 3e 62 45 6f 66 3b 0a 7d 0a 0a 2f 2a 0a 2a  l->bEof;.}../*.*
a800: 2a 20 41 64 76 61 6e 63 65 20 74 68 65 20 69 74  * Advance the it
a810: 65 72 61 74 6f 72 20 70 61 73 73 65 64 20 61 73  erator passed as
a820: 20 74 68 65 20 6f 6e 6c 79 20 61 72 67 75 6d 65   the only argume
a830: 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  nt..*/.static in
a840: 74 20 66 74 73 35 44 6c 69 64 78 49 74 65 72 4e  t fts5DlidxIterN
a850: 65 78 74 52 28 46 74 73 35 49 6e 64 65 78 20 2a  extR(Fts5Index *
a860: 70 2c 20 46 74 73 35 44 6c 69 64 78 49 74 65 72  p, Fts5DlidxIter
a870: 20 2a 70 49 74 65 72 2c 20 69 6e 74 20 69 4c 76   *pIter, int iLv
a880: 6c 29 7b 0a 20 20 46 74 73 35 44 6c 69 64 78 4c  l){.  Fts5DlidxL
a890: 76 6c 20 2a 70 4c 76 6c 20 3d 20 26 70 49 74 65  vl *pLvl = &pIte
a8a0: 72 2d 3e 61 4c 76 6c 5b 69 4c 76 6c 5d 3b 0a 0a  r->aLvl[iLvl];..
a8b0: 20 20 61 73 73 65 72 74 28 20 69 4c 76 6c 3c 70    assert( iLvl<p
a8c0: 49 74 65 72 2d 3e 6e 4c 76 6c 20 29 3b 0a 20 20  Iter->nLvl );.  
a8d0: 69 66 28 20 66 74 73 35 44 6c 69 64 78 4c 76 6c  if( fts5DlidxLvl
a8e0: 4e 65 78 74 28 70 4c 76 6c 29 20 29 7b 0a 20 20  Next(pLvl) ){.  
a8f0: 20 20 69 66 28 20 28 69 4c 76 6c 2b 31 29 20 3c    if( (iLvl+1) <
a900: 20 70 49 74 65 72 2d 3e 6e 4c 76 6c 20 29 7b 0a   pIter->nLvl ){.
a910: 20 20 20 20 20 20 66 74 73 35 44 6c 69 64 78 49        fts5DlidxI
a920: 74 65 72 4e 65 78 74 52 28 70 2c 20 70 49 74 65  terNextR(p, pIte
a930: 72 2c 20 69 4c 76 6c 2b 31 29 3b 0a 20 20 20 20  r, iLvl+1);.    
a940: 20 20 69 66 28 20 70 4c 76 6c 5b 31 5d 2e 62 45    if( pLvl[1].bE
a950: 6f 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  of==0 ){.       
a960: 20 66 74 73 35 44 61 74 61 52 65 6c 65 61 73 65   fts5DataRelease
a970: 28 70 4c 76 6c 2d 3e 70 44 61 74 61 29 3b 0a 20  (pLvl->pData);. 
a980: 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70 4c         memset(pL
a990: 76 6c 2c 20 30 2c 20 73 69 7a 65 6f 66 28 46 74  vl, 0, sizeof(Ft
a9a0: 73 35 44 6c 69 64 78 4c 76 6c 29 29 3b 0a 20 20  s5DlidxLvl));.  
a9b0: 20 20 20 20 20 20 70 4c 76 6c 2d 3e 70 44 61 74        pLvl->pDat
a9c0: 61 20 3d 20 66 74 73 35 44 61 74 61 52 65 61 64  a = fts5DataRead
a9d0: 28 70 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  (p, .           
a9e0: 20 46 54 53 35 5f 44 4c 49 44 58 5f 52 4f 57 49   FTS5_DLIDX_ROWI
a9f0: 44 28 70 49 74 65 72 2d 3e 69 53 65 67 69 64 2c  D(pIter->iSegid,
aa00: 20 69 4c 76 6c 2c 20 70 4c 76 6c 5b 31 5d 2e 69   iLvl, pLvl[1].i
aa10: 4c 65 61 66 50 67 6e 6f 29 0a 20 20 20 20 20 20  LeafPgno).      
aa20: 20 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28    );.        if(
aa30: 20 70 4c 76 6c 2d 3e 70 44 61 74 61 20 29 20 66   pLvl->pData ) f
aa40: 74 73 35 44 6c 69 64 78 4c 76 6c 4e 65 78 74 28  ts5DlidxLvlNext(
aa50: 70 4c 76 6c 29 3b 0a 20 20 20 20 20 20 7d 0a 20  pLvl);.      }. 
aa60: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75     }.  }..  retu
aa70: 72 6e 20 70 49 74 65 72 2d 3e 61 4c 76 6c 5b 30  rn pIter->aLvl[0
aa80: 5d 2e 62 45 6f 66 3b 0a 7d 0a 73 74 61 74 69 63  ].bEof;.}.static
aa90: 20 69 6e 74 20 66 74 73 35 44 6c 69 64 78 49 74   int fts5DlidxIt
aaa0: 65 72 4e 65 78 74 28 46 74 73 35 49 6e 64 65 78  erNext(Fts5Index
aab0: 20 2a 70 2c 20 46 74 73 35 44 6c 69 64 78 49 74   *p, Fts5DlidxIt
aac0: 65 72 20 2a 70 49 74 65 72 29 7b 0a 20 20 72 65  er *pIter){.  re
aad0: 74 75 72 6e 20 66 74 73 35 44 6c 69 64 78 49 74  turn fts5DlidxIt
aae0: 65 72 4e 65 78 74 52 28 70 2c 20 70 49 74 65 72  erNextR(p, pIter
aaf0: 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  , 0);.}../*.** T
ab00: 68 65 20 69 74 65 72 61 74 6f 72 20 70 61 73 73  he iterator pass
ab10: 65 64 20 61 73 20 74 68 65 20 66 69 72 73 74 20  ed as the first 
ab20: 61 72 67 75 6d 65 6e 74 20 68 61 73 20 74 68 65  argument has the
ab30: 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 69 65 6c 64   following field
ab40: 73 20 73 65 74 0a 2a 2a 20 61 73 20 66 6f 6c 6c  s set.** as foll
ab50: 6f 77 73 2e 20 54 68 69 73 20 66 75 6e 63 74 69  ows. This functi
ab60: 6f 6e 20 73 65 74 73 20 75 70 20 74 68 65 20 72  on sets up the r
ab70: 65 73 74 20 6f 66 20 74 68 65 20 69 74 65 72 61  est of the itera
ab80: 74 6f 72 20 73 6f 20 74 68 61 74 20 69 74 0a 2a  tor so that it.*
ab90: 2a 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20  * points to the 
aba0: 66 69 72 73 74 20 72 6f 77 69 64 20 69 6e 20 74  first rowid in t
abb0: 68 65 20 64 6f 63 6c 69 73 74 2d 69 6e 64 65 78  he doclist-index
abc0: 2e 0a 2a 2a 0a 2a 2a 20 20 20 70 44 61 74 61 3a  ..**.**   pData:
abd0: 0a 2a 2a 20 20 20 20 20 70 6f 69 6e 74 65 72 20  .**     pointer 
abe0: 74 6f 20 64 6f 63 6c 69 73 74 2d 69 6e 64 65 78  to doclist-index
abf0: 20 72 65 63 6f 72 64 2c 20 0a 2a 2a 0a 2a 2a 20   record, .**.** 
ac00: 57 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69  When this functi
ac10: 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 70 49 74  on is called pIt
ac20: 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 20 69 73  er->iLeafPgno is
ac30: 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72   the page number
ac40: 20 74 68 65 0a 2a 2a 20 64 6f 63 6c 69 73 74 20   the.** doclist 
ac50: 69 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  is associated wi
ac60: 74 68 20 28 74 68 65 20 6f 6e 65 20 66 65 61 74  th (the one feat
ac70: 75 72 69 6e 67 20 74 68 65 20 74 65 72 6d 29 2e  uring the term).
ac80: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .*/.static int f
ac90: 74 73 35 44 6c 69 64 78 49 74 65 72 46 69 72 73  ts5DlidxIterFirs
aca0: 74 28 46 74 73 35 44 6c 69 64 78 49 74 65 72 20  t(Fts5DlidxIter 
acb0: 2a 70 49 74 65 72 29 7b 0a 20 20 69 6e 74 20 69  *pIter){.  int i
acc0: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
acd0: 49 74 65 72 2d 3e 6e 4c 76 6c 3b 20 69 2b 2b 29  Iter->nLvl; i++)
ace0: 7b 0a 20 20 20 20 66 74 73 35 44 6c 69 64 78 4c  {.    fts5DlidxL
acf0: 76 6c 4e 65 78 74 28 26 70 49 74 65 72 2d 3e 61  vlNext(&pIter->a
ad00: 4c 76 6c 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20 72  Lvl[i]);.  }.  r
ad10: 65 74 75 72 6e 20 70 49 74 65 72 2d 3e 61 4c 76  eturn pIter->aLv
ad20: 6c 5b 30 5d 2e 62 45 6f 66 3b 0a 7d 0a 0a 0a 73  l[0].bEof;.}...s
ad30: 74 61 74 69 63 20 69 6e 74 20 66 74 73 35 44 6c  tatic int fts5Dl
ad40: 69 64 78 49 74 65 72 45 6f 66 28 46 74 73 35 49  idxIterEof(Fts5I
ad50: 6e 64 65 78 20 2a 70 2c 20 46 74 73 35 44 6c 69  ndex *p, Fts5Dli
ad60: 64 78 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a  dxIter *pIter){.
ad70: 20 20 72 65 74 75 72 6e 20 70 2d 3e 72 63 21 3d    return p->rc!=
ad80: 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 49 74  SQLITE_OK || pIt
ad90: 65 72 2d 3e 61 4c 76 6c 5b 30 5d 2e 62 45 6f 66  er->aLvl[0].bEof
ada0: 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64  ;.}..static void
adb0: 20 66 74 73 35 44 6c 69 64 78 49 74 65 72 4c 61   fts5DlidxIterLa
adc0: 73 74 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c  st(Fts5Index *p,
add0: 20 46 74 73 35 44 6c 69 64 78 49 74 65 72 20 2a   Fts5DlidxIter *
ade0: 70 49 74 65 72 29 7b 0a 20 20 69 6e 74 20 69 3b  pIter){.  int i;
adf0: 0a 0a 20 20 2f 2a 20 41 64 76 61 6e 63 65 20 65  ..  /* Advance e
ae00: 61 63 68 20 6c 65 76 65 6c 20 74 6f 20 74 68 65  ach level to the
ae10: 20 6c 61 73 74 20 65 6e 74 72 79 20 6f 6e 20 74   last entry on t
ae20: 68 65 20 6c 61 73 74 20 70 61 67 65 20 2a 2f 0a  he last page */.
ae30: 20 20 66 6f 72 28 69 3d 70 49 74 65 72 2d 3e 6e    for(i=pIter->n
ae40: 4c 76 6c 2d 31 3b 20 70 2d 3e 72 63 3d 3d 53 51  Lvl-1; p->rc==SQ
ae50: 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3e 3d 30 3b  LITE_OK && i>=0;
ae60: 20 69 2d 2d 29 7b 0a 20 20 20 20 46 74 73 35 44   i--){.    Fts5D
ae70: 6c 69 64 78 4c 76 6c 20 2a 70 4c 76 6c 20 3d 20  lidxLvl *pLvl = 
ae80: 26 70 49 74 65 72 2d 3e 61 4c 76 6c 5b 69 5d 3b  &pIter->aLvl[i];
ae90: 0a 20 20 20 20 77 68 69 6c 65 28 20 66 74 73 35  .    while( fts5
aea0: 44 6c 69 64 78 4c 76 6c 4e 65 78 74 28 70 4c 76  DlidxLvlNext(pLv
aeb0: 6c 29 3d 3d 30 20 29 3b 0a 20 20 20 20 70 4c 76  l)==0 );.    pLv
aec0: 6c 2d 3e 62 45 6f 66 20 3d 20 30 3b 0a 0a 20 20  l->bEof = 0;..  
aed0: 20 20 69 66 28 20 69 3e 30 20 29 7b 0a 20 20 20    if( i>0 ){.   
aee0: 20 20 20 46 74 73 35 44 6c 69 64 78 4c 76 6c 20     Fts5DlidxLvl 
aef0: 2a 70 43 68 69 6c 64 20 3d 20 26 70 4c 76 6c 5b  *pChild = &pLvl[
af00: 2d 31 5d 3b 0a 20 20 20 20 20 20 66 74 73 35 44  -1];.      fts5D
af10: 61 74 61 52 65 6c 65 61 73 65 28 70 43 68 69 6c  ataRelease(pChil
af20: 64 2d 3e 70 44 61 74 61 29 3b 0a 20 20 20 20 20  d->pData);.     
af30: 20 6d 65 6d 73 65 74 28 70 43 68 69 6c 64 2c 20   memset(pChild, 
af40: 30 2c 20 73 69 7a 65 6f 66 28 46 74 73 35 44 6c  0, sizeof(Fts5Dl
af50: 69 64 78 4c 76 6c 29 29 3b 0a 20 20 20 20 20 20  idxLvl));.      
af60: 70 43 68 69 6c 64 2d 3e 70 44 61 74 61 20 3d 20  pChild->pData = 
af70: 66 74 73 35 44 61 74 61 52 65 61 64 28 70 2c 20  fts5DataRead(p, 
af80: 0a 20 20 20 20 20 20 20 20 20 20 46 54 53 35 5f  .          FTS5_
af90: 44 4c 49 44 58 5f 52 4f 57 49 44 28 70 49 74 65  DLIDX_ROWID(pIte
afa0: 72 2d 3e 69 53 65 67 69 64 2c 20 69 2d 31 2c 20  r->iSegid, i-1, 
afb0: 70 4c 76 6c 2d 3e 69 4c 65 61 66 50 67 6e 6f 29  pLvl->iLeafPgno)
afc0: 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a  .      );.    }.
afd0: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76    }.}../*.** Mov
afe0: 65 20 74 68 65 20 69 74 65 72 61 74 6f 72 20 70  e the iterator p
aff0: 61 73 73 65 64 20 61 73 20 74 68 65 20 6f 6e 6c  assed as the onl
b000: 79 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68  y argument to th
b010: 65 20 70 72 65 76 69 6f 75 73 20 65 6e 74 72 79  e previous entry
b020: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
b030: 66 74 73 35 44 6c 69 64 78 4c 76 6c 50 72 65 76  fts5DlidxLvlPrev
b040: 28 46 74 73 35 44 6c 69 64 78 4c 76 6c 20 2a 70  (Fts5DlidxLvl *p
b050: 4c 76 6c 29 7b 0a 20 20 69 6e 74 20 69 4f 66 66  Lvl){.  int iOff
b060: 20 3d 20 70 4c 76 6c 2d 3e 69 4f 66 66 3b 0a 0a   = pLvl->iOff;..
b070: 20 20 61 73 73 65 72 74 28 20 70 4c 76 6c 2d 3e    assert( pLvl->
b080: 62 45 6f 66 3d 3d 30 20 29 3b 0a 20 20 69 66 28  bEof==0 );.  if(
b090: 20 69 4f 66 66 3c 3d 70 4c 76 6c 2d 3e 69 46 69   iOff<=pLvl->iFi
b0a0: 72 73 74 4f 66 66 20 29 7b 0a 20 20 20 20 70 4c  rstOff ){.    pL
b0b0: 76 6c 2d 3e 62 45 6f 66 20 3d 20 31 3b 0a 20 20  vl->bEof = 1;.  
b0c0: 7d 65 6c 73 65 7b 0a 20 20 20 20 75 38 20 2a 61  }else{.    u8 *a
b0d0: 20 3d 20 70 4c 76 6c 2d 3e 70 44 61 74 61 2d 3e   = pLvl->pData->
b0e0: 70 3b 0a 20 20 20 20 69 36 34 20 69 56 61 6c 3b  p;.    i64 iVal;
b0f0: 0a 20 20 20 20 69 6e 74 20 69 4c 69 6d 69 74 3b  .    int iLimit;
b100: 0a 20 20 20 20 69 6e 74 20 69 69 3b 0a 20 20 20  .    int ii;.   
b110: 20 69 6e 74 20 6e 5a 65 72 6f 20 3d 20 30 3b 0a   int nZero = 0;.
b120: 0a 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 6c  .    /* Currentl
b130: 79 20 69 4f 66 66 20 70 6f 69 6e 74 73 20 74 6f  y iOff points to
b140: 20 74 68 65 20 66 69 72 73 74 20 62 79 74 65 20   the first byte 
b150: 6f 66 20 61 20 76 61 72 69 6e 74 2e 20 54 68 69  of a varint. Thi
b160: 73 20 62 6c 6f 63 6b 20 0a 20 20 20 20 2a 2a 20  s block .    ** 
b170: 64 65 63 72 65 6d 65 6e 74 73 20 69 4f 66 66 20  decrements iOff 
b180: 75 6e 74 69 6c 20 69 74 20 70 6f 69 6e 74 73 20  until it points 
b190: 74 6f 20 74 68 65 20 66 69 72 73 74 20 62 79 74  to the first byt
b1a0: 65 20 6f 66 20 74 68 65 20 70 72 65 76 69 6f 75  e of the previou
b1b0: 73 20 0a 20 20 20 20 2a 2a 20 76 61 72 69 6e 74  s .    ** varint
b1c0: 2e 20 54 61 6b 69 6e 67 20 63 61 72 65 20 6e 6f  . Taking care no
b1d0: 74 20 74 6f 20 72 65 61 64 20 61 6e 79 20 6d 65  t to read any me
b1e0: 6d 6f 72 79 20 6c 6f 63 61 74 69 6f 6e 73 20 74  mory locations t
b1f0: 68 61 74 20 6f 63 63 75 72 0a 20 20 20 20 2a 2a  hat occur.    **
b200: 20 62 65 66 6f 72 65 20 74 68 65 20 62 75 66 66   before the buff
b210: 65 72 20 69 6e 20 6d 65 6d 6f 72 79 2e 20 20 2a  er in memory.  *
b220: 2f 0a 20 20 20 20 69 4c 69 6d 69 74 20 3d 20 28  /.    iLimit = (
b230: 69 4f 66 66 3e 39 20 3f 20 69 4f 66 66 2d 39 20  iOff>9 ? iOff-9 
b240: 3a 20 30 29 3b 0a 20 20 20 20 66 6f 72 28 69 4f  : 0);.    for(iO
b250: 66 66 2d 2d 3b 20 69 4f 66 66 3e 69 4c 69 6d 69  ff--; iOff>iLimi
b260: 74 3b 20 69 4f 66 66 2d 2d 29 7b 0a 20 20 20 20  t; iOff--){.    
b270: 20 20 69 66 28 20 28 61 5b 69 4f 66 66 2d 31 5d    if( (a[iOff-1]
b280: 20 26 20 30 78 38 30 29 3d 3d 30 20 29 20 62 72   & 0x80)==0 ) br
b290: 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  eak;.    }..    
b2a0: 66 74 73 35 47 65 74 56 61 72 69 6e 74 28 26 61  fts5GetVarint(&a
b2b0: 5b 69 4f 66 66 5d 2c 20 28 75 36 34 2a 29 26 69  [iOff], (u64*)&i
b2c0: 56 61 6c 29 3b 0a 20 20 20 20 70 4c 76 6c 2d 3e  Val);.    pLvl->
b2d0: 69 52 6f 77 69 64 20 2d 3d 20 69 56 61 6c 3b 0a  iRowid -= iVal;.
b2e0: 20 20 20 20 70 4c 76 6c 2d 3e 69 4c 65 61 66 50      pLvl->iLeafP
b2f0: 67 6e 6f 2d 2d 3b 0a 0a 20 20 20 20 2f 2a 20 53  gno--;..    /* S
b300: 6b 69 70 20 62 61 63 6b 77 61 72 64 73 20 70 61  kip backwards pa
b310: 73 74 20 61 6e 79 20 30 78 30 30 20 76 61 72 69  st any 0x00 vari
b320: 6e 74 73 2e 20 2a 2f 0a 20 20 20 20 66 6f 72 28  nts. */.    for(
b330: 69 69 3d 69 4f 66 66 2d 31 3b 20 69 69 3e 3d 70  ii=iOff-1; ii>=p
b340: 4c 76 6c 2d 3e 69 46 69 72 73 74 4f 66 66 20 26  Lvl->iFirstOff &
b350: 26 20 61 5b 69 69 5d 3d 3d 30 78 30 30 3b 20 69  & a[ii]==0x00; i
b360: 69 2d 2d 29 7b 0a 20 20 20 20 20 20 6e 5a 65 72  i--){.      nZer
b370: 6f 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  o++;.    }.    i
b380: 66 28 20 69 69 3e 3d 70 4c 76 6c 2d 3e 69 46 69  f( ii>=pLvl->iFi
b390: 72 73 74 4f 66 66 20 26 26 20 28 61 5b 69 69 5d  rstOff && (a[ii]
b3a0: 20 26 20 30 78 38 30 29 20 29 7b 0a 20 20 20 20   & 0x80) ){.    
b3b0: 20 20 2f 2a 20 54 68 65 20 62 79 74 65 20 69 6d    /* The byte im
b3c0: 6d 65 64 69 61 74 65 6c 79 20 62 65 66 6f 72 65  mediately before
b3d0: 20 74 68 65 20 6c 61 73 74 20 30 78 30 30 20 62   the last 0x00 b
b3e0: 79 74 65 20 68 61 73 20 74 68 65 20 30 78 38 30  yte has the 0x80
b3f0: 20 62 69 74 0a 20 20 20 20 20 20 2a 2a 20 73 65   bit.      ** se
b400: 74 2e 20 53 6f 20 74 68 65 20 6c 61 73 74 20 30  t. So the last 0
b410: 78 30 30 20 69 73 20 6f 6e 6c 79 20 61 20 76 61  x00 is only a va
b420: 72 69 6e 74 20 30 20 69 66 20 74 68 65 72 65 20  rint 0 if there 
b430: 61 72 65 20 38 20 6d 6f 72 65 20 30 78 38 30 0a  are 8 more 0x80.
b440: 20 20 20 20 20 20 2a 2a 20 62 79 74 65 73 20 62        ** bytes b
b450: 65 66 6f 72 65 20 61 5b 69 69 5d 2e 20 2a 2f 0a  efore a[ii]. */.
b460: 20 20 20 20 20 20 69 6e 74 20 62 5a 65 72 6f 20        int bZero 
b470: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
b480: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 6c 61 73    /* True if las
b490: 74 20 30 78 30 30 20 63 6f 75 6e 74 73 20 2a 2f  t 0x00 counts */
b4a0: 0a 20 20 20 20 20 20 69 66 28 20 28 69 69 2d 38  .      if( (ii-8
b4b0: 29 3e 3d 70 4c 76 6c 2d 3e 69 46 69 72 73 74 4f  )>=pLvl->iFirstO
b4c0: 66 66 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  ff ){.        in
b4d0: 74 20 6a 3b 0a 20 20 20 20 20 20 20 20 66 6f 72  t j;.        for
b4e0: 28 6a 3d 31 3b 20 6a 3c 3d 38 20 26 26 20 28 61  (j=1; j<=8 && (a
b4f0: 5b 69 69 2d 6a 5d 20 26 20 30 78 38 30 29 3b 20  [ii-j] & 0x80); 
b500: 6a 2b 2b 29 3b 0a 20 20 20 20 20 20 20 20 62 5a  j++);.        bZ
b510: 65 72 6f 20 3d 20 28 6a 3e 38 29 3b 0a 20 20 20  ero = (j>8);.   
b520: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 62     }.      if( b
b530: 5a 65 72 6f 3d 3d 30 20 29 20 6e 5a 65 72 6f 2d  Zero==0 ) nZero-
b540: 2d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c 76  -;.    }.    pLv
b550: 6c 2d 3e 69 4c 65 61 66 50 67 6e 6f 20 2d 3d 20  l->iLeafPgno -= 
b560: 6e 5a 65 72 6f 3b 0a 20 20 20 20 70 4c 76 6c 2d  nZero;.    pLvl-
b570: 3e 69 4f 66 66 20 3d 20 69 4f 66 66 20 2d 20 6e  >iOff = iOff - n
b580: 5a 65 72 6f 3b 0a 20 20 7d 0a 0a 20 20 72 65 74  Zero;.  }..  ret
b590: 75 72 6e 20 70 4c 76 6c 2d 3e 62 45 6f 66 3b 0a  urn pLvl->bEof;.
b5a0: 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74  }..static int ft
b5b0: 73 35 44 6c 69 64 78 49 74 65 72 50 72 65 76 52  s5DlidxIterPrevR
b5c0: 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 46  (Fts5Index *p, F
b5d0: 74 73 35 44 6c 69 64 78 49 74 65 72 20 2a 70 49  ts5DlidxIter *pI
b5e0: 74 65 72 2c 20 69 6e 74 20 69 4c 76 6c 29 7b 0a  ter, int iLvl){.
b5f0: 20 20 46 74 73 35 44 6c 69 64 78 4c 76 6c 20 2a    Fts5DlidxLvl *
b600: 70 4c 76 6c 20 3d 20 26 70 49 74 65 72 2d 3e 61  pLvl = &pIter->a
b610: 4c 76 6c 5b 69 4c 76 6c 5d 3b 0a 0a 20 20 61 73  Lvl[iLvl];..  as
b620: 73 65 72 74 28 20 69 4c 76 6c 3c 70 49 74 65 72  sert( iLvl<pIter
b630: 2d 3e 6e 4c 76 6c 20 29 3b 0a 20 20 69 66 28 20  ->nLvl );.  if( 
b640: 66 74 73 35 44 6c 69 64 78 4c 76 6c 50 72 65 76  fts5DlidxLvlPrev
b650: 28 70 4c 76 6c 29 20 29 7b 0a 20 20 20 20 69 66  (pLvl) ){.    if
b660: 28 20 28 69 4c 76 6c 2b 31 29 20 3c 20 70 49 74  ( (iLvl+1) < pIt
b670: 65 72 2d 3e 6e 4c 76 6c 20 29 7b 0a 20 20 20 20  er->nLvl ){.    
b680: 20 20 66 74 73 35 44 6c 69 64 78 49 74 65 72 50    fts5DlidxIterP
b690: 72 65 76 52 28 70 2c 20 70 49 74 65 72 2c 20 69  revR(p, pIter, i
b6a0: 4c 76 6c 2b 31 29 3b 0a 20 20 20 20 20 20 69 66  Lvl+1);.      if
b6b0: 28 20 70 4c 76 6c 5b 31 5d 2e 62 45 6f 66 3d 3d  ( pLvl[1].bEof==
b6c0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 66 74 73  0 ){.        fts
b6d0: 35 44 61 74 61 52 65 6c 65 61 73 65 28 70 4c 76  5DataRelease(pLv
b6e0: 6c 2d 3e 70 44 61 74 61 29 3b 0a 20 20 20 20 20  l->pData);.     
b6f0: 20 20 20 6d 65 6d 73 65 74 28 70 4c 76 6c 2c 20     memset(pLvl, 
b700: 30 2c 20 73 69 7a 65 6f 66 28 46 74 73 35 44 6c  0, sizeof(Fts5Dl
b710: 69 64 78 4c 76 6c 29 29 3b 0a 20 20 20 20 20 20  idxLvl));.      
b720: 20 20 70 4c 76 6c 2d 3e 70 44 61 74 61 20 3d 20    pLvl->pData = 
b730: 66 74 73 35 44 61 74 61 52 65 61 64 28 70 2c 20  fts5DataRead(p, 
b740: 0a 20 20 20 20 20 20 20 20 20 20 20 20 46 54 53  .            FTS
b750: 35 5f 44 4c 49 44 58 5f 52 4f 57 49 44 28 70 49  5_DLIDX_ROWID(pI
b760: 74 65 72 2d 3e 69 53 65 67 69 64 2c 20 69 4c 76  ter->iSegid, iLv
b770: 6c 2c 20 70 4c 76 6c 5b 31 5d 2e 69 4c 65 61 66  l, pLvl[1].iLeaf
b780: 50 67 6e 6f 29 0a 20 20 20 20 20 20 20 20 29 3b  Pgno).        );
b790: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4c 76  .        if( pLv
b7a0: 6c 2d 3e 70 44 61 74 61 20 29 7b 0a 20 20 20 20  l->pData ){.    
b7b0: 20 20 20 20 20 20 77 68 69 6c 65 28 20 66 74 73        while( fts
b7c0: 35 44 6c 69 64 78 4c 76 6c 4e 65 78 74 28 70 4c  5DlidxLvlNext(pL
b7d0: 76 6c 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  vl)==0 );.      
b7e0: 20 20 20 20 70 4c 76 6c 2d 3e 62 45 6f 66 20 3d      pLvl->bEof =
b7f0: 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   0;.        }.  
b800: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
b810: 0a 20 20 72 65 74 75 72 6e 20 70 49 74 65 72 2d  .  return pIter-
b820: 3e 61 4c 76 6c 5b 30 5d 2e 62 45 6f 66 3b 0a 7d  >aLvl[0].bEof;.}
b830: 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 35  .static int fts5
b840: 44 6c 69 64 78 49 74 65 72 50 72 65 76 28 46 74  DlidxIterPrev(Ft
b850: 73 35 49 6e 64 65 78 20 2a 70 2c 20 46 74 73 35  s5Index *p, Fts5
b860: 44 6c 69 64 78 49 74 65 72 20 2a 70 49 74 65 72  DlidxIter *pIter
b870: 29 7b 0a 20 20 72 65 74 75 72 6e 20 66 74 73 35  ){.  return fts5
b880: 44 6c 69 64 78 49 74 65 72 50 72 65 76 52 28 70  DlidxIterPrevR(p
b890: 2c 20 70 49 74 65 72 2c 20 30 29 3b 0a 7d 0a 0a  , pIter, 0);.}..
b8a0: 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 20 64 6f 63  /*.** Free a doc
b8b0: 6c 69 73 74 2d 69 6e 64 65 78 20 69 74 65 72 61  list-index itera
b8c0: 74 6f 72 20 6f 62 6a 65 63 74 20 61 6c 6c 6f 63  tor object alloc
b8d0: 61 74 65 64 20 62 79 20 66 74 73 35 44 6c 69 64  ated by fts5Dlid
b8e0: 78 49 74 65 72 49 6e 69 74 28 29 2e 0a 2a 2f 0a  xIterInit()..*/.
b8f0: 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
b900: 44 6c 69 64 78 49 74 65 72 46 72 65 65 28 46 74  DlidxIterFree(Ft
b910: 73 35 44 6c 69 64 78 49 74 65 72 20 2a 70 49 74  s5DlidxIter *pIt
b920: 65 72 29 7b 0a 20 20 69 66 28 20 70 49 74 65 72  er){.  if( pIter
b930: 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20   ){.    int i;. 
b940: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49     for(i=0; i<pI
b950: 74 65 72 2d 3e 6e 4c 76 6c 3b 20 69 2b 2b 29 7b  ter->nLvl; i++){
b960: 0a 20 20 20 20 20 20 66 74 73 35 44 61 74 61 52  .      fts5DataR
b970: 65 6c 65 61 73 65 28 70 49 74 65 72 2d 3e 61 4c  elease(pIter->aL
b980: 76 6c 5b 69 5d 2e 70 44 61 74 61 29 3b 0a 20 20  vl[i].pData);.  
b990: 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f    }.    sqlite3_
b9a0: 66 72 65 65 28 70 49 74 65 72 29 3b 0a 20 20 7d  free(pIter);.  }
b9b0: 0a 7d 0a 0a 73 74 61 74 69 63 20 46 74 73 35 44  .}..static Fts5D
b9c0: 6c 69 64 78 49 74 65 72 20 2a 66 74 73 35 44 6c  lidxIter *fts5Dl
b9d0: 69 64 78 49 74 65 72 49 6e 69 74 28 0a 20 20 46  idxIterInit(.  F
b9e0: 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20  ts5Index *p,    
b9f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
ba00: 2a 20 46 74 73 35 20 42 61 63 6b 65 6e 64 20 74  * Fts5 Backend t
ba10: 6f 20 69 74 65 72 61 74 65 20 77 69 74 68 69 6e  o iterate within
ba20: 20 2a 2f 0a 20 20 69 6e 74 20 62 52 65 76 2c 20   */.  int bRev, 
ba30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ba40: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f        /* True fo
ba50: 72 20 4f 52 44 45 52 20 42 59 20 41 53 43 20 2a  r ORDER BY ASC *
ba60: 2f 0a 20 20 69 6e 74 20 69 53 65 67 69 64 2c 20  /.  int iSegid, 
ba70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ba80: 20 20 20 20 2f 2a 20 53 65 67 6d 65 6e 74 20 69      /* Segment i
ba90: 64 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 65 61 66  d */.  int iLeaf
baa0: 50 67 20 20 20 20 20 20 20 20 20 20 20 20 20 20  Pg              
bab0: 20 20 20 20 20 20 20 2f 2a 20 4c 65 61 66 20 70         /* Leaf p
bac0: 61 67 65 20 6e 75 6d 62 65 72 20 74 6f 20 6c 6f  age number to lo
bad0: 61 64 20 64 6c 69 64 78 20 66 6f 72 20 2a 2f 0a  ad dlidx for */.
bae0: 29 7b 0a 20 20 46 74 73 35 44 6c 69 64 78 49 74  ){.  Fts5DlidxIt
baf0: 65 72 20 2a 70 49 74 65 72 20 3d 20 30 3b 0a 20  er *pIter = 0;. 
bb00: 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 62 44   int i;.  int bD
bb10: 6f 6e 65 20 3d 20 30 3b 0a 0a 20 20 66 6f 72 28  one = 0;..  for(
bb20: 69 3d 30 3b 20 70 2d 3e 72 63 3d 3d 53 51 4c 49  i=0; p->rc==SQLI
bb30: 54 45 5f 4f 4b 20 26 26 20 62 44 6f 6e 65 3d 3d  TE_OK && bDone==
bb40: 30 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74  0; i++){.    int
bb50: 20 6e 42 79 74 65 20 3d 20 73 69 7a 65 6f 66 28   nByte = sizeof(
bb60: 46 74 73 35 44 6c 69 64 78 49 74 65 72 29 20 2b  Fts5DlidxIter) +
bb70: 20 69 20 2a 20 73 69 7a 65 6f 66 28 46 74 73 35   i * sizeof(Fts5
bb80: 44 6c 69 64 78 4c 76 6c 29 3b 0a 20 20 20 20 46  DlidxLvl);.    F
bb90: 74 73 35 44 6c 69 64 78 49 74 65 72 20 2a 70 4e  ts5DlidxIter *pN
bba0: 65 77 3b 0a 0a 20 20 20 20 70 4e 65 77 20 3d 20  ew;..    pNew = 
bbb0: 28 46 74 73 35 44 6c 69 64 78 49 74 65 72 2a 29  (Fts5DlidxIter*)
bbc0: 73 71 6c 69 74 65 33 5f 72 65 61 6c 6c 6f 63 28  sqlite3_realloc(
bbd0: 70 49 74 65 72 2c 20 6e 42 79 74 65 29 3b 0a 20  pIter, nByte);. 
bbe0: 20 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29     if( pNew==0 )
bbf0: 7b 0a 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20  {.      p->rc = 
bc00: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
bc10: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69    }else{.      i
bc20: 36 34 20 69 52 6f 77 69 64 20 3d 20 46 54 53 35  64 iRowid = FTS5
bc30: 5f 44 4c 49 44 58 5f 52 4f 57 49 44 28 69 53 65  _DLIDX_ROWID(iSe
bc40: 67 69 64 2c 20 69 2c 20 69 4c 65 61 66 50 67 29  gid, i, iLeafPg)
bc50: 3b 0a 20 20 20 20 20 20 46 74 73 35 44 6c 69 64  ;.      Fts5Dlid
bc60: 78 4c 76 6c 20 2a 70 4c 76 6c 20 3d 20 26 70 4e  xLvl *pLvl = &pN
bc70: 65 77 2d 3e 61 4c 76 6c 5b 69 5d 3b 0a 20 20 20  ew->aLvl[i];.   
bc80: 20 20 20 70 49 74 65 72 20 3d 20 70 4e 65 77 3b     pIter = pNew;
bc90: 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70 4c  .      memset(pL
bca0: 76 6c 2c 20 30 2c 20 73 69 7a 65 6f 66 28 46 74  vl, 0, sizeof(Ft
bcb0: 73 35 44 6c 69 64 78 4c 76 6c 29 29 3b 0a 20 20  s5DlidxLvl));.  
bcc0: 20 20 20 20 70 4c 76 6c 2d 3e 70 44 61 74 61 20      pLvl->pData 
bcd0: 3d 20 66 74 73 35 44 61 74 61 52 65 61 64 28 70  = fts5DataRead(p
bce0: 2c 20 69 52 6f 77 69 64 29 3b 0a 20 20 20 20 20  , iRowid);.     
bcf0: 20 69 66 28 20 70 4c 76 6c 2d 3e 70 44 61 74 61   if( pLvl->pData
bd00: 20 26 26 20 28 70 4c 76 6c 2d 3e 70 44 61 74 61   && (pLvl->pData
bd10: 2d 3e 70 5b 30 5d 20 26 20 30 78 30 30 30 31 29  ->p[0] & 0x0001)
bd20: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 62  ==0 ){.        b
bd30: 44 6f 6e 65 20 3d 20 31 3b 0a 20 20 20 20 20 20  Done = 1;.      
bd40: 7d 0a 20 20 20 20 20 20 70 49 74 65 72 2d 3e 6e  }.      pIter->n
bd50: 4c 76 6c 20 3d 20 69 2b 31 3b 0a 20 20 20 20 7d  Lvl = i+1;.    }
bd60: 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 2d 3e 72  .  }..  if( p->r
bd70: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
bd80: 20 20 20 20 70 49 74 65 72 2d 3e 69 53 65 67 69      pIter->iSegi
bd90: 64 20 3d 20 69 53 65 67 69 64 3b 0a 20 20 20 20  d = iSegid;.    
bda0: 69 66 28 20 62 52 65 76 3d 3d 30 20 29 7b 0a 20  if( bRev==0 ){. 
bdb0: 20 20 20 20 20 66 74 73 35 44 6c 69 64 78 49 74       fts5DlidxIt
bdc0: 65 72 46 69 72 73 74 28 70 49 74 65 72 29 3b 0a  erFirst(pIter);.
bdd0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
bde0: 20 66 74 73 35 44 6c 69 64 78 49 74 65 72 4c 61   fts5DlidxIterLa
bdf0: 73 74 28 70 2c 20 70 49 74 65 72 29 3b 0a 20 20  st(p, pIter);.  
be00: 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70    }.  }..  if( p
be10: 2d 3e 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc!=SQLITE_OK 
be20: 29 7b 0a 20 20 20 20 66 74 73 35 44 6c 69 64 78  ){.    fts5Dlidx
be30: 49 74 65 72 46 72 65 65 28 70 49 74 65 72 29 3b  IterFree(pIter);
be40: 0a 20 20 20 20 70 49 74 65 72 20 3d 20 30 3b 0a  .    pIter = 0;.
be50: 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70 49    }..  return pI
be60: 74 65 72 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69  ter;.}..static i
be70: 36 34 20 66 74 73 35 44 6c 69 64 78 49 74 65 72  64 fts5DlidxIter
be80: 52 6f 77 69 64 28 46 74 73 35 44 6c 69 64 78 49  Rowid(Fts5DlidxI
be90: 74 65 72 20 2a 70 49 74 65 72 29 7b 0a 20 20 72  ter *pIter){.  r
bea0: 65 74 75 72 6e 20 70 49 74 65 72 2d 3e 61 4c 76  eturn pIter->aLv
beb0: 6c 5b 30 5d 2e 69 52 6f 77 69 64 3b 0a 7d 0a 73  l[0].iRowid;.}.s
bec0: 74 61 74 69 63 20 69 6e 74 20 66 74 73 35 44 6c  tatic int fts5Dl
bed0: 69 64 78 49 74 65 72 50 67 6e 6f 28 46 74 73 35  idxIterPgno(Fts5
bee0: 44 6c 69 64 78 49 74 65 72 20 2a 70 49 74 65 72  DlidxIter *pIter
bef0: 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 49 74 65  ){.  return pIte
bf00: 72 2d 3e 61 4c 76 6c 5b 30 5d 2e 69 4c 65 61 66  r->aLvl[0].iLeaf
bf10: 50 67 6e 6f 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c  Pgno;.}../*.** L
bf20: 6f 61 64 20 74 68 65 20 6e 65 78 74 20 6c 65 61  oad the next lea
bf30: 66 20 70 61 67 65 20 69 6e 74 6f 20 74 68 65 20  f page into the 
bf40: 73 65 67 6d 65 6e 74 20 69 74 65 72 61 74 6f 72  segment iterator
bf50: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
bf60: 20 66 74 73 35 53 65 67 49 74 65 72 4e 65 78 74   fts5SegIterNext
bf70: 50 61 67 65 28 0a 20 20 46 74 73 35 49 6e 64 65  Page(.  Fts5Inde
bf80: 78 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  x *p,           
bf90: 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53 35 20          /* FTS5 
bfa0: 62 61 63 6b 65 6e 64 20 6f 62 6a 65 63 74 20 2a  backend object *
bfb0: 2f 0a 20 20 46 74 73 35 53 65 67 49 74 65 72 20  /.  Fts5SegIter 
bfc0: 2a 70 49 74 65 72 20 20 20 20 20 20 20 20 20 20  *pIter          
bfd0: 20 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20      /* Iterator 
bfe0: 74 6f 20 61 64 76 61 6e 63 65 20 74 6f 20 6e 65  to advance to ne
bff0: 78 74 20 70 61 67 65 20 2a 2f 0a 29 7b 0a 20 20  xt page */.){.  
c000: 46 74 73 35 44 61 74 61 20 2a 70 4c 65 61 66 3b  Fts5Data *pLeaf;
c010: 0a 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65  .  Fts5Structure
c020: 53 65 67 6d 65 6e 74 20 2a 70 53 65 67 20 3d 20  Segment *pSeg = 
c030: 70 49 74 65 72 2d 3e 70 53 65 67 3b 0a 20 20 66  pIter->pSeg;.  f
c040: 74 73 35 44 61 74 61 52 65 6c 65 61 73 65 28 70  ts5DataRelease(p
c050: 49 74 65 72 2d 3e 70 4c 65 61 66 29 3b 0a 20 20  Iter->pLeaf);.  
c060: 70 49 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f  pIter->iLeafPgno
c070: 2b 2b 3b 0a 20 20 69 66 28 20 70 49 74 65 72 2d  ++;.  if( pIter-
c080: 3e 70 4e 65 78 74 4c 65 61 66 20 29 7b 0a 20 20  >pNextLeaf ){.  
c090: 20 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 20 3d    pIter->pLeaf =
c0a0: 20 70 49 74 65 72 2d 3e 70 4e 65 78 74 4c 65 61   pIter->pNextLea
c0b0: 66 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 70 4e  f;.    pIter->pN
c0c0: 65 78 74 4c 65 61 66 20 3d 20 30 3b 0a 20 20 7d  extLeaf = 0;.  }
c0d0: 65 6c 73 65 20 69 66 28 20 70 49 74 65 72 2d 3e  else if( pIter->
c0e0: 69 4c 65 61 66 50 67 6e 6f 3c 3d 70 53 65 67 2d  iLeafPgno<=pSeg-
c0f0: 3e 70 67 6e 6f 4c 61 73 74 20 29 7b 0a 20 20 20  >pgnoLast ){.   
c100: 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 20 3d 20   pIter->pLeaf = 
c110: 66 74 73 35 4c 65 61 66 52 65 61 64 28 70 2c 20  fts5LeafRead(p, 
c120: 0a 20 20 20 20 20 20 20 20 46 54 53 35 5f 53 45  .        FTS5_SE
c130: 47 4d 45 4e 54 5f 52 4f 57 49 44 28 70 53 65 67  GMENT_ROWID(pSeg
c140: 2d 3e 69 53 65 67 69 64 2c 20 70 49 74 65 72 2d  ->iSegid, pIter-
c150: 3e 69 4c 65 61 66 50 67 6e 6f 29 0a 20 20 20 20  >iLeafPgno).    
c160: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
c170: 70 49 74 65 72 2d 3e 70 4c 65 61 66 20 3d 20 30  pIter->pLeaf = 0
c180: 3b 0a 20 20 7d 0a 20 20 70 4c 65 61 66 20 3d 20  ;.  }.  pLeaf = 
c190: 70 49 74 65 72 2d 3e 70 4c 65 61 66 3b 0a 0a 20  pIter->pLeaf;.. 
c1a0: 20 69 66 28 20 70 4c 65 61 66 20 29 7b 0a 20 20   if( pLeaf ){.  
c1b0: 20 20 70 49 74 65 72 2d 3e 69 50 67 69 64 78 4f    pIter->iPgidxO
c1c0: 66 66 20 3d 20 70 4c 65 61 66 2d 3e 73 7a 4c 65  ff = pLeaf->szLe
c1d0: 61 66 3b 0a 20 20 20 20 69 66 28 20 66 74 73 35  af;.    if( fts5
c1e0: 4c 65 61 66 49 73 54 65 72 6d 6c 65 73 73 28 70  LeafIsTermless(p
c1f0: 4c 65 61 66 29 20 29 7b 0a 20 20 20 20 20 20 70  Leaf) ){.      p
c200: 49 74 65 72 2d 3e 69 45 6e 64 6f 66 44 6f 63 6c  Iter->iEndofDocl
c210: 69 73 74 20 3d 20 70 4c 65 61 66 2d 3e 6e 6e 2b  ist = pLeaf->nn+
c220: 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  1;.    }else{.  
c230: 20 20 20 20 70 49 74 65 72 2d 3e 69 50 67 69 64      pIter->iPgid
c240: 78 4f 66 66 20 2b 3d 20 66 74 73 35 47 65 74 56  xOff += fts5GetV
c250: 61 72 69 6e 74 33 32 28 26 70 4c 65 61 66 2d 3e  arint32(&pLeaf->
c260: 70 5b 70 49 74 65 72 2d 3e 69 50 67 69 64 78 4f  p[pIter->iPgidxO
c270: 66 66 5d 2c 0a 20 20 20 20 20 20 20 20 20 20 70  ff],.          p
c280: 49 74 65 72 2d 3e 69 45 6e 64 6f 66 44 6f 63 6c  Iter->iEndofDocl
c290: 69 73 74 0a 20 20 20 20 20 20 29 3b 0a 20 20 20  ist.      );.   
c2a0: 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
c2b0: 41 72 67 75 6d 65 6e 74 20 70 20 70 6f 69 6e 74  Argument p point
c2c0: 73 20 74 6f 20 61 20 62 75 66 66 65 72 20 63 6f  s to a buffer co
c2d0: 6e 74 61 69 6e 69 6e 67 20 61 20 76 61 72 69 6e  ntaining a varin
c2e0: 74 20 74 6f 20 62 65 20 69 6e 74 65 72 70 72 65  t to be interpre
c2f0: 74 65 64 20 61 73 20 61 0a 2a 2a 20 70 6f 73 69  ted as a.** posi
c300: 74 69 6f 6e 20 6c 69 73 74 20 73 69 7a 65 20 66  tion list size f
c310: 69 65 6c 64 2e 20 52 65 61 64 20 74 68 65 20 76  ield. Read the v
c320: 61 72 69 6e 74 20 61 6e 64 20 72 65 74 75 72 6e  arint and return
c330: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62   the number of b
c340: 79 74 65 73 0a 2a 2a 20 72 65 61 64 2e 20 42 65  ytes.** read. Be
c350: 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2c 20  fore returning, 
c360: 73 65 74 20 2a 70 6e 53 7a 20 74 6f 20 74 68 65  set *pnSz to the
c370: 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   number of bytes
c380: 20 69 6e 20 74 68 65 20 70 6f 73 69 74 69 6f 6e   in the position
c390: 0a 2a 2a 20 6c 69 73 74 2c 20 61 6e 64 20 2a 70  .** list, and *p
c3a0: 62 44 65 6c 20 74 6f 20 74 72 75 65 20 69 66 20  bDel to true if 
c3b0: 74 68 65 20 64 65 6c 65 74 65 20 66 6c 61 67 20  the delete flag 
c3c0: 69 73 20 73 65 74 2c 20 6f 72 20 66 61 6c 73 65  is set, or false
c3d0: 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 73   otherwise..*/.s
c3e0: 74 61 74 69 63 20 69 6e 74 20 66 74 73 35 47 65  tatic int fts5Ge
c3f0: 74 50 6f 73 6c 69 73 74 53 69 7a 65 28 63 6f 6e  tPoslistSize(con
c400: 73 74 20 75 38 20 2a 70 2c 20 69 6e 74 20 2a 70  st u8 *p, int *p
c410: 6e 53 7a 2c 20 69 6e 74 20 2a 70 62 44 65 6c 29  nSz, int *pbDel)
c420: 7b 0a 20 20 69 6e 74 20 6e 53 7a 3b 0a 20 20 69  {.  int nSz;.  i
c430: 6e 74 20 6e 20 3d 20 30 3b 0a 20 20 66 74 73 35  nt n = 0;.  fts5
c440: 46 61 73 74 47 65 74 56 61 72 69 6e 74 33 32 28  FastGetVarint32(
c450: 70 2c 20 6e 2c 20 6e 53 7a 29 3b 0a 20 20 61 73  p, n, nSz);.  as
c460: 73 65 72 74 5f 6e 63 28 20 6e 53 7a 3e 3d 30 20  sert_nc( nSz>=0 
c470: 29 3b 0a 20 20 2a 70 6e 53 7a 20 3d 20 6e 53 7a  );.  *pnSz = nSz
c480: 2f 32 3b 0a 20 20 2a 70 62 44 65 6c 20 3d 20 6e  /2;.  *pbDel = n
c490: 53 7a 20 26 20 30 78 30 30 30 31 3b 0a 20 20 72  Sz & 0x0001;.  r
c4a0: 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn n;.}../*.*
c4b0: 2a 20 46 74 73 35 53 65 67 49 74 65 72 2e 69 4c  * Fts5SegIter.iL
c4c0: 65 61 66 4f 66 66 73 65 74 20 63 75 72 72 65 6e  eafOffset curren
c4d0: 74 6c 79 20 70 6f 69 6e 74 73 20 74 6f 20 74 68  tly points to th
c4e0: 65 20 66 69 72 73 74 20 62 79 74 65 20 6f 66 20  e first byte of 
c4f0: 61 0a 2a 2a 20 70 6f 73 69 74 69 6f 6e 2d 6c 69  a.** position-li
c500: 73 74 20 73 69 7a 65 20 66 69 65 6c 64 2e 20 52  st size field. R
c510: 65 61 64 20 74 68 65 20 76 61 6c 75 65 20 6f 66  ead the value of
c520: 20 74 68 65 20 66 69 65 6c 64 20 61 6e 64 20 73   the field and s
c530: 74 6f 72 65 20 69 74 0a 2a 2a 20 69 6e 20 74 68  tore it.** in th
c540: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 76 61 72 69  e following vari
c550: 61 62 6c 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 46  ables:.**.**   F
c560: 74 73 35 53 65 67 49 74 65 72 2e 6e 50 6f 73 0a  ts5SegIter.nPos.
c570: 2a 2a 20 20 20 46 74 73 35 53 65 67 49 74 65 72  **   Fts5SegIter
c580: 2e 62 44 65 6c 0a 2a 2a 0a 2a 2a 20 4c 65 61 76  .bDel.**.** Leav
c590: 65 20 46 74 73 35 53 65 67 49 74 65 72 2e 69 4c  e Fts5SegIter.iL
c5a0: 65 61 66 4f 66 66 73 65 74 20 70 6f 69 6e 74 69  eafOffset pointi
c5b0: 6e 67 20 74 6f 20 74 68 65 20 66 69 72 73 74 20  ng to the first 
c5c0: 62 79 74 65 20 6f 66 20 74 68 65 20 0a 2a 2a 20  byte of the .** 
c5d0: 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74 20 63 6f  position list co
c5e0: 6e 74 65 6e 74 20 28 69 66 20 61 6e 79 29 2e 0a  ntent (if any)..
c5f0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
c600: 74 73 35 53 65 67 49 74 65 72 4c 6f 61 64 4e 50  ts5SegIterLoadNP
c610: 6f 73 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c  os(Fts5Index *p,
c620: 20 46 74 73 35 53 65 67 49 74 65 72 20 2a 70 49   Fts5SegIter *pI
c630: 74 65 72 29 7b 0a 20 20 69 66 28 20 70 2d 3e 72  ter){.  if( p->r
c640: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
c650: 20 20 20 20 69 6e 74 20 69 4f 66 66 20 3d 20 70      int iOff = p
c660: 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65  Iter->iLeafOffse
c670: 74 3b 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f  t;  /* Offset to
c680: 20 72 65 61 64 20 61 74 20 2a 2f 0a 20 20 20 20   read at */.    
c690: 41 53 53 45 52 54 5f 53 5a 4c 45 41 46 5f 4f 4b  ASSERT_SZLEAF_OK
c6a0: 28 70 49 74 65 72 2d 3e 70 4c 65 61 66 29 3b 0a  (pIter->pLeaf);.
c6b0: 20 20 20 20 69 66 28 20 70 2d 3e 70 43 6f 6e 66      if( p->pConf
c6c0: 69 67 2d 3e 65 44 65 74 61 69 6c 3d 3d 46 54 53  ig->eDetail==FTS
c6d0: 35 5f 44 45 54 41 49 4c 5f 4e 4f 4e 45 20 29 7b  5_DETAIL_NONE ){
c6e0: 0a 20 20 20 20 20 20 69 6e 74 20 69 45 6f 64 20  .      int iEod 
c6f0: 3d 20 4d 49 4e 28 70 49 74 65 72 2d 3e 69 45 6e  = MIN(pIter->iEn
c700: 64 6f 66 44 6f 63 6c 69 73 74 2c 20 70 49 74 65  dofDoclist, pIte
c710: 72 2d 3e 70 4c 65 61 66 2d 3e 73 7a 4c 65 61 66  r->pLeaf->szLeaf
c720: 29 3b 0a 20 20 20 20 20 20 70 49 74 65 72 2d 3e  );.      pIter->
c730: 62 44 65 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20  bDel = 0;.      
c740: 70 49 74 65 72 2d 3e 6e 50 6f 73 20 3d 20 31 3b  pIter->nPos = 1;
c750: 0a 20 20 20 20 20 20 69 66 28 20 69 4f 66 66 3c  .      if( iOff<
c760: 69 45 6f 64 20 26 26 20 70 49 74 65 72 2d 3e 70  iEod && pIter->p
c770: 4c 65 61 66 2d 3e 70 5b 69 4f 66 66 5d 3d 3d 30  Leaf->p[iOff]==0
c780: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 49 74 65   ){.        pIte
c790: 72 2d 3e 62 44 65 6c 20 3d 20 31 3b 0a 20 20 20  r->bDel = 1;.   
c7a0: 20 20 20 20 20 69 4f 66 66 2b 2b 3b 0a 20 20 20       iOff++;.   
c7b0: 20 20 20 20 20 69 66 28 20 69 4f 66 66 3c 69 45       if( iOff<iE
c7c0: 6f 64 20 26 26 20 70 49 74 65 72 2d 3e 70 4c 65  od && pIter->pLe
c7d0: 61 66 2d 3e 70 5b 69 4f 66 66 5d 3d 3d 30 20 29  af->p[iOff]==0 )
c7e0: 7b 0a 20 20 20 20 20 20 20 20 20 20 70 49 74 65  {.          pIte
c7f0: 72 2d 3e 6e 50 6f 73 20 3d 20 31 3b 0a 20 20 20  r->nPos = 1;.   
c800: 20 20 20 20 20 20 20 69 4f 66 66 2b 2b 3b 0a 20         iOff++;. 
c810: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
c820: 20 20 20 20 20 20 20 20 70 49 74 65 72 2d 3e 6e          pIter->n
c830: 50 6f 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  Pos = 0;.       
c840: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
c850: 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20  else{.      int 
c860: 6e 53 7a 3b 0a 20 20 20 20 20 20 66 74 73 35 46  nSz;.      fts5F
c870: 61 73 74 47 65 74 56 61 72 69 6e 74 33 32 28 70  astGetVarint32(p
c880: 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 70 2c 20  Iter->pLeaf->p, 
c890: 69 4f 66 66 2c 20 6e 53 7a 29 3b 0a 20 20 20 20  iOff, nSz);.    
c8a0: 20 20 70 49 74 65 72 2d 3e 62 44 65 6c 20 3d 20    pIter->bDel = 
c8b0: 28 6e 53 7a 20 26 20 30 78 30 30 30 31 29 3b 0a  (nSz & 0x0001);.
c8c0: 20 20 20 20 20 20 70 49 74 65 72 2d 3e 6e 50 6f        pIter->nPo
c8d0: 73 20 3d 20 6e 53 7a 3e 3e 31 3b 0a 20 20 20 20  s = nSz>>1;.    
c8e0: 20 20 61 73 73 65 72 74 5f 6e 63 28 20 70 49 74    assert_nc( pIt
c8f0: 65 72 2d 3e 6e 50 6f 73 3e 3d 30 20 29 3b 0a 20  er->nPos>=0 );. 
c900: 20 20 20 7d 0a 20 20 20 20 70 49 74 65 72 2d 3e     }.    pIter->
c910: 69 4c 65 61 66 4f 66 66 73 65 74 20 3d 20 69 4f  iLeafOffset = iO
c920: 66 66 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69  ff;.  }.}..stati
c930: 63 20 76 6f 69 64 20 66 74 73 35 53 65 67 49 74  c void fts5SegIt
c940: 65 72 4c 6f 61 64 52 6f 77 69 64 28 46 74 73 35  erLoadRowid(Fts5
c950: 49 6e 64 65 78 20 2a 70 2c 20 46 74 73 35 53 65  Index *p, Fts5Se
c960: 67 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a 20  gIter *pIter){. 
c970: 20 75 38 20 2a 61 20 3d 20 70 49 74 65 72 2d 3e   u8 *a = pIter->
c980: 70 4c 65 61 66 2d 3e 70 3b 20 20 20 20 20 20 20  pLeaf->p;       
c990: 20 2f 2a 20 42 75 66 66 65 72 20 74 6f 20 72 65   /* Buffer to re
c9a0: 61 64 20 64 61 74 61 20 66 72 6f 6d 20 2a 2f 0a  ad data from */.
c9b0: 20 20 69 6e 74 20 69 4f 66 66 20 3d 20 70 49 74    int iOff = pIt
c9c0: 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 3b  er->iLeafOffset;
c9d0: 0a 0a 20 20 41 53 53 45 52 54 5f 53 5a 4c 45 41  ..  ASSERT_SZLEA
c9e0: 46 5f 4f 4b 28 70 49 74 65 72 2d 3e 70 4c 65 61  F_OK(pIter->pLea
c9f0: 66 29 3b 0a 20 20 69 66 28 20 69 4f 66 66 3e 3d  f);.  if( iOff>=
ca00: 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 73 7a  pIter->pLeaf->sz
ca10: 4c 65 61 66 20 29 7b 0a 20 20 20 20 66 74 73 35  Leaf ){.    fts5
ca20: 53 65 67 49 74 65 72 4e 65 78 74 50 61 67 65 28  SegIterNextPage(
ca30: 70 2c 20 70 49 74 65 72 29 3b 0a 20 20 20 20 69  p, pIter);.    i
ca40: 66 28 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 3d  f( pIter->pLeaf=
ca50: 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  =0 ){.      if( 
ca60: 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
ca70: 20 29 20 70 2d 3e 72 63 20 3d 20 46 54 53 35 5f   ) p->rc = FTS5_
ca80: 43 4f 52 52 55 50 54 3b 0a 20 20 20 20 20 20 72  CORRUPT;.      r
ca90: 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20  eturn;.    }.   
caa0: 20 69 4f 66 66 20 3d 20 34 3b 0a 20 20 20 20 61   iOff = 4;.    a
cab0: 20 3d 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d   = pIter->pLeaf-
cac0: 3e 70 3b 0a 20 20 7d 0a 20 20 69 4f 66 66 20 2b  >p;.  }.  iOff +
cad0: 3d 20 73 71 6c 69 74 65 33 46 74 73 35 47 65 74  = sqlite3Fts5Get
cae0: 56 61 72 69 6e 74 28 26 61 5b 69 4f 66 66 5d 2c  Varint(&a[iOff],
caf0: 20 28 75 36 34 2a 29 26 70 49 74 65 72 2d 3e 69   (u64*)&pIter->i
cb00: 52 6f 77 69 64 29 3b 0a 20 20 70 49 74 65 72 2d  Rowid);.  pIter-
cb10: 3e 69 4c 65 61 66 4f 66 66 73 65 74 20 3d 20 69  >iLeafOffset = i
cb20: 4f 66 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 74  Off;.}../*.** Ft
cb30: 73 35 53 65 67 49 74 65 72 2e 69 4c 65 61 66 4f  s5SegIter.iLeafO
cb40: 66 66 73 65 74 20 63 75 72 72 65 6e 74 6c 79 20  ffset currently 
cb50: 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 66 69  points to the fi
cb60: 72 73 74 20 62 79 74 65 20 6f 66 20 74 68 65 20  rst byte of the 
cb70: 0a 2a 2a 20 22 6e 53 75 66 66 69 78 22 20 66 69  .** "nSuffix" fi
cb80: 65 6c 64 20 6f 66 20 61 20 74 65 72 6d 2e 20 46  eld of a term. F
cb90: 75 6e 63 74 69 6f 6e 20 70 61 72 61 6d 65 74 65  unction paramete
cba0: 72 20 6e 4b 65 65 70 20 63 6f 6e 74 61 69 6e 73  r nKeep contains
cbb0: 20 74 68 65 20 76 61 6c 75 65 0a 2a 2a 20 6f 66   the value.** of
cbc0: 20 74 68 65 20 22 6e 50 72 65 66 69 78 22 20 66   the "nPrefix" f
cbd0: 69 65 6c 64 20 28 69 66 20 74 68 65 72 65 20 77  ield (if there w
cbe0: 61 73 20 6f 6e 65 20 2d 20 69 74 20 69 73 20 70  as one - it is p
cbf0: 61 73 73 65 64 20 30 20 69 66 20 74 68 69 73 20  assed 0 if this 
cc00: 69 73 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20  is.** the first 
cc10: 74 65 72 6d 20 69 6e 20 74 68 65 20 73 65 67 6d  term in the segm
cc20: 65 6e 74 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ent)..**.** This
cc30: 20 66 75 6e 63 74 69 6f 6e 20 70 6f 70 75 6c 61   function popula
cc40: 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 46 74 73  tes:.**.**   Fts
cc50: 35 53 65 67 49 74 65 72 2e 74 65 72 6d 0a 2a 2a  5SegIter.term.**
cc60: 20 20 20 46 74 73 35 53 65 67 49 74 65 72 2e 72     Fts5SegIter.r
cc70: 6f 77 69 64 0a 2a 2a 0a 2a 2a 20 61 63 63 6f 72  owid.**.** accor
cc80: 64 69 6e 67 6c 79 20 61 6e 64 20 6c 65 61 76 65  dingly and leave
cc90: 73 20 28 46 74 73 35 53 65 67 49 74 65 72 2e 69  s (Fts5SegIter.i
cca0: 4c 65 61 66 4f 66 66 73 65 74 29 20 73 65 74 20  LeafOffset) set 
ccb0: 74 6f 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f  to the content o
ccc0: 66 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20 70  f.** the first p
ccd0: 6f 73 69 74 69 6f 6e 20 6c 69 73 74 2e 20 54 68  osition list. Th
cce0: 65 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74 20  e position list 
ccf0: 62 65 6c 6f 6e 67 69 6e 67 20 74 6f 20 64 6f 63  belonging to doc
cd00: 75 6d 65 6e 74 20 0a 2a 2a 20 28 46 74 73 35 53  ument .** (Fts5S
cd10: 65 67 49 74 65 72 2e 69 52 6f 77 69 64 29 2e 0a  egIter.iRowid)..
cd20: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
cd30: 74 73 35 53 65 67 49 74 65 72 4c 6f 61 64 54 65  ts5SegIterLoadTe
cd40: 72 6d 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c  rm(Fts5Index *p,
cd50: 20 46 74 73 35 53 65 67 49 74 65 72 20 2a 70 49   Fts5SegIter *pI
cd60: 74 65 72 2c 20 69 6e 74 20 6e 4b 65 65 70 29 7b  ter, int nKeep){
cd70: 0a 20 20 75 38 20 2a 61 20 3d 20 70 49 74 65 72  .  u8 *a = pIter
cd80: 2d 3e 70 4c 65 61 66 2d 3e 70 3b 20 20 20 20 20  ->pLeaf->p;     
cd90: 20 20 20 2f 2a 20 42 75 66 66 65 72 20 74 6f 20     /* Buffer to 
cda0: 72 65 61 64 20 64 61 74 61 20 66 72 6f 6d 20 2a  read data from *
cdb0: 2f 0a 20 20 69 6e 74 20 69 4f 66 66 20 3d 20 70  /.  int iOff = p
cdc0: 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65  Iter->iLeafOffse
cdd0: 74 3b 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f  t;  /* Offset to
cde0: 20 72 65 61 64 20 61 74 20 2a 2f 0a 20 20 69 6e   read at */.  in
cdf0: 74 20 6e 4e 65 77 3b 20 20 20 20 20 20 20 20 20  t nNew;         
ce00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
ce10: 20 42 79 74 65 73 20 6f 66 20 6e 65 77 20 64 61   Bytes of new da
ce20: 74 61 20 2a 2f 0a 0a 20 20 69 4f 66 66 20 2b 3d  ta */..  iOff +=
ce30: 20 66 74 73 35 47 65 74 56 61 72 69 6e 74 33 32   fts5GetVarint32
ce40: 28 26 61 5b 69 4f 66 66 5d 2c 20 6e 4e 65 77 29  (&a[iOff], nNew)
ce50: 3b 0a 20 20 69 66 28 20 69 4f 66 66 2b 6e 4e 65  ;.  if( iOff+nNe
ce60: 77 3e 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e  w>pIter->pLeaf->
ce70: 6e 6e 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20  nn ){.    p->rc 
ce80: 3d 20 46 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a  = FTS5_CORRUPT;.
ce90: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
cea0: 20 20 70 49 74 65 72 2d 3e 74 65 72 6d 2e 6e 20    pIter->term.n 
ceb0: 3d 20 6e 4b 65 65 70 3b 0a 20 20 66 74 73 35 42  = nKeep;.  fts5B
cec0: 75 66 66 65 72 41 70 70 65 6e 64 42 6c 6f 62 28  ufferAppendBlob(
ced0: 26 70 2d 3e 72 63 2c 20 26 70 49 74 65 72 2d 3e  &p->rc, &pIter->
cee0: 74 65 72 6d 2c 20 6e 4e 65 77 2c 20 26 61 5b 69  term, nNew, &a[i
cef0: 4f 66 66 5d 29 3b 0a 20 20 69 4f 66 66 20 2b 3d  Off]);.  iOff +=
cf00: 20 6e 4e 65 77 3b 0a 20 20 70 49 74 65 72 2d 3e   nNew;.  pIter->
cf10: 69 54 65 72 6d 4c 65 61 66 4f 66 66 73 65 74 20  iTermLeafOffset 
cf20: 3d 20 69 4f 66 66 3b 0a 20 20 70 49 74 65 72 2d  = iOff;.  pIter-
cf30: 3e 69 54 65 72 6d 4c 65 61 66 50 67 6e 6f 20 3d  >iTermLeafPgno =
cf40: 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e   pIter->iLeafPgn
cf50: 6f 3b 0a 20 20 70 49 74 65 72 2d 3e 69 4c 65 61  o;.  pIter->iLea
cf60: 66 4f 66 66 73 65 74 20 3d 20 69 4f 66 66 3b 0a  fOffset = iOff;.
cf70: 0a 20 20 69 66 28 20 70 49 74 65 72 2d 3e 69 50  .  if( pIter->iP
cf80: 67 69 64 78 4f 66 66 3e 3d 70 49 74 65 72 2d 3e  gidxOff>=pIter->
cf90: 70 4c 65 61 66 2d 3e 6e 6e 20 29 7b 0a 20 20 20  pLeaf->nn ){.   
cfa0: 20 70 49 74 65 72 2d 3e 69 45 6e 64 6f 66 44 6f   pIter->iEndofDo
cfb0: 63 6c 69 73 74 20 3d 20 70 49 74 65 72 2d 3e 70  clist = pIter->p
cfc0: 4c 65 61 66 2d 3e 6e 6e 2b 31 3b 0a 20 20 7d 65  Leaf->nn+1;.  }e
cfd0: 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 6e 45 78  lse{.    int nEx
cfe0: 74 72 61 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e  tra;.    pIter->
cff0: 69 50 67 69 64 78 4f 66 66 20 2b 3d 20 66 74 73  iPgidxOff += fts
d000: 35 47 65 74 56 61 72 69 6e 74 33 32 28 26 61 5b  5GetVarint32(&a[
d010: 70 49 74 65 72 2d 3e 69 50 67 69 64 78 4f 66 66  pIter->iPgidxOff
d020: 5d 2c 20 6e 45 78 74 72 61 29 3b 0a 20 20 20 20  ], nExtra);.    
d030: 70 49 74 65 72 2d 3e 69 45 6e 64 6f 66 44 6f 63  pIter->iEndofDoc
d040: 6c 69 73 74 20 2b 3d 20 6e 45 78 74 72 61 3b 0a  list += nExtra;.
d050: 20 20 7d 0a 0a 20 20 66 74 73 35 53 65 67 49 74    }..  fts5SegIt
d060: 65 72 4c 6f 61 64 52 6f 77 69 64 28 70 2c 20 70  erLoadRowid(p, p
d070: 49 74 65 72 29 3b 0a 7d 0a 0a 73 74 61 74 69 63  Iter);.}..static
d080: 20 76 6f 69 64 20 66 74 73 35 53 65 67 49 74 65   void fts5SegIte
d090: 72 4e 65 78 74 28 46 74 73 35 49 6e 64 65 78 2a  rNext(Fts5Index*
d0a0: 2c 20 46 74 73 35 53 65 67 49 74 65 72 2a 2c 20  , Fts5SegIter*, 
d0b0: 69 6e 74 2a 29 3b 0a 73 74 61 74 69 63 20 76 6f  int*);.static vo
d0c0: 69 64 20 66 74 73 35 53 65 67 49 74 65 72 4e 65  id fts5SegIterNe
d0d0: 78 74 5f 52 65 76 65 72 73 65 28 46 74 73 35 49  xt_Reverse(Fts5I
d0e0: 6e 64 65 78 2a 2c 20 46 74 73 35 53 65 67 49 74  ndex*, Fts5SegIt
d0f0: 65 72 2a 2c 20 69 6e 74 2a 29 3b 0a 73 74 61 74  er*, int*);.stat
d100: 69 63 20 76 6f 69 64 20 66 74 73 35 53 65 67 49  ic void fts5SegI
d110: 74 65 72 4e 65 78 74 5f 4e 6f 6e 65 28 46 74 73  terNext_None(Fts
d120: 35 49 6e 64 65 78 2a 2c 20 46 74 73 35 53 65 67  5Index*, Fts5Seg
d130: 49 74 65 72 2a 2c 20 69 6e 74 2a 29 3b 0a 0a 73  Iter*, int*);..s
d140: 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 53  tatic void fts5S
d150: 65 67 49 74 65 72 53 65 74 4e 65 78 74 28 46 74  egIterSetNext(Ft
d160: 73 35 49 6e 64 65 78 20 2a 70 2c 20 46 74 73 35  s5Index *p, Fts5
d170: 53 65 67 49 74 65 72 20 2a 70 49 74 65 72 29 7b  SegIter *pIter){
d180: 0a 20 20 69 66 28 20 70 49 74 65 72 2d 3e 66 6c  .  if( pIter->fl
d190: 61 67 73 20 26 20 46 54 53 35 5f 53 45 47 49 54  ags & FTS5_SEGIT
d1a0: 45 52 5f 52 45 56 45 52 53 45 20 29 7b 0a 20 20  ER_REVERSE ){.  
d1b0: 20 20 70 49 74 65 72 2d 3e 78 4e 65 78 74 20 3d    pIter->xNext =
d1c0: 20 66 74 73 35 53 65 67 49 74 65 72 4e 65 78 74   fts5SegIterNext
d1d0: 5f 52 65 76 65 72 73 65 3b 0a 20 20 7d 65 6c 73  _Reverse;.  }els
d1e0: 65 20 69 66 28 20 70 2d 3e 70 43 6f 6e 66 69 67  e if( p->pConfig
d1f0: 2d 3e 65 44 65 74 61 69 6c 3d 3d 46 54 53 35 5f  ->eDetail==FTS5_
d200: 44 45 54 41 49 4c 5f 4e 4f 4e 45 20 29 7b 0a 20  DETAIL_NONE ){. 
d210: 20 20 20 70 49 74 65 72 2d 3e 78 4e 65 78 74 20     pIter->xNext 
d220: 3d 20 66 74 73 35 53 65 67 49 74 65 72 4e 65 78  = fts5SegIterNex
d230: 74 5f 4e 6f 6e 65 3b 0a 20 20 7d 65 6c 73 65 7b  t_None;.  }else{
d240: 0a 20 20 20 20 70 49 74 65 72 2d 3e 78 4e 65 78  .    pIter->xNex
d250: 74 20 3d 20 66 74 73 35 53 65 67 49 74 65 72 4e  t = fts5SegIterN
d260: 65 78 74 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  ext;.  }.}../*.*
d270: 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65  * Initialize the
d280: 20 69 74 65 72 61 74 6f 72 20 6f 62 6a 65 63 74   iterator object
d290: 20 70 49 74 65 72 20 74 6f 20 69 74 65 72 61 74   pIter to iterat
d2a0: 65 20 74 68 72 6f 75 67 68 20 74 68 65 20 65 6e  e through the en
d2b0: 74 72 69 65 73 20 69 6e 0a 2a 2a 20 73 65 67 6d  tries in.** segm
d2c0: 65 6e 74 20 70 53 65 67 2e 20 54 68 65 20 69 74  ent pSeg. The it
d2d0: 65 72 61 74 6f 72 20 69 73 20 6c 65 66 74 20 70  erator is left p
d2e0: 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 65 20 66  ointing to the f
d2f0: 69 72 73 74 20 65 6e 74 72 79 20 77 68 65 6e 20  irst entry when 
d300: 0a 2a 2a 20 74 68 69 73 20 66 75 6e 63 74 69 6f  .** this functio
d310: 6e 20 72 65 74 75 72 6e 73 2e 0a 2a 2a 0a 2a 2a  n returns..**.**
d320: 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
d330: 75 72 73 2c 20 46 74 73 35 49 6e 64 65 78 2e 72  urs, Fts5Index.r
d340: 63 20 69 73 20 73 65 74 20 74 6f 20 61 6e 20 61  c is set to an a
d350: 70 70 72 6f 70 72 69 61 74 65 20 65 72 72 6f 72  ppropriate error
d360: 20 63 6f 64 65 2e 20 49 66 20 0a 2a 2a 20 61 6e   code. If .** an
d370: 20 65 72 72 6f 72 20 68 61 73 20 61 6c 72 65 61   error has alrea
d380: 64 79 20 6f 63 63 75 72 72 65 64 20 77 68 65 6e  dy occurred when
d390: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
d3a0: 73 20 63 61 6c 6c 65 64 2c 20 69 74 20 69 73 20  s called, it is 
d3b0: 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74  a no-op..*/.stat
d3c0: 69 63 20 76 6f 69 64 20 66 74 73 35 53 65 67 49  ic void fts5SegI
d3d0: 74 65 72 49 6e 69 74 28 0a 20 20 46 74 73 35 49  terInit(.  Fts5I
d3e0: 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20  ndex *p,        
d3f0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54             /* FT
d400: 53 20 69 6e 64 65 78 20 6f 62 6a 65 63 74 20 2a  S index object *
d410: 2f 0a 20 20 46 74 73 35 53 74 72 75 63 74 75 72  /.  Fts5Structur
d420: 65 53 65 67 6d 65 6e 74 20 2a 70 53 65 67 2c 20  eSegment *pSeg, 
d430: 20 20 20 20 2f 2a 20 44 65 73 63 72 69 70 74 69      /* Descripti
d440: 6f 6e 20 6f 66 20 73 65 67 6d 65 6e 74 20 2a 2f  on of segment */
d450: 0a 20 20 46 74 73 35 53 65 67 49 74 65 72 20 2a  .  Fts5SegIter *
d460: 70 49 74 65 72 20 20 20 20 20 20 20 20 20 20 20  pIter           
d470: 20 20 20 2f 2a 20 4f 62 6a 65 63 74 20 74 6f 20     /* Object to 
d480: 70 6f 70 75 6c 61 74 65 20 2a 2f 0a 29 7b 0a 20  populate */.){. 
d490: 20 69 66 28 20 70 53 65 67 2d 3e 70 67 6e 6f 46   if( pSeg->pgnoF
d4a0: 69 72 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 2f  irst==0 ){.    /
d4b0: 2a 20 54 68 69 73 20 68 61 70 70 65 6e 73 20 69  * This happens i
d4c0: 66 20 74 68 65 20 73 65 67 6d 65 6e 74 20 69 73  f the segment is
d4d0: 20 62 65 69 6e 67 20 75 73 65 64 20 61 73 20 61   being used as a
d4e0: 6e 20 69 6e 70 75 74 20 74 6f 20 61 6e 20 69 6e  n input to an in
d4f0: 63 72 65 6d 65 6e 74 61 6c 0a 20 20 20 20 2a 2a  cremental.    **
d500: 20 6d 65 72 67 65 20 61 6e 64 20 61 6c 6c 20 64   merge and all d
d510: 61 74 61 20 68 61 73 20 61 6c 72 65 61 64 79 20  ata has already 
d520: 62 65 65 6e 20 22 74 72 69 6d 6d 65 64 22 2e 20  been "trimmed". 
d530: 53 65 65 20 66 75 6e 63 74 69 6f 6e 0a 20 20 20  See function.   
d540: 20 2a 2a 20 66 74 73 35 54 72 69 6d 53 65 67 6d   ** fts5TrimSegm
d550: 65 6e 74 73 28 29 20 66 6f 72 20 64 65 74 61 69  ents() for detai
d560: 6c 73 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  ls. In this case
d570: 20 6c 65 61 76 65 20 74 68 65 20 69 74 65 72 61   leave the itera
d580: 74 6f 72 20 65 6d 70 74 79 2e 0a 20 20 20 20 2a  tor empty..    *
d590: 2a 20 54 68 65 20 63 61 6c 6c 65 72 20 77 69 6c  * The caller wil
d5a0: 6c 20 73 65 65 20 74 68 65 20 28 70 49 74 65 72  l see the (pIter
d5b0: 2d 3e 70 4c 65 61 66 3d 3d 30 29 20 61 6e 64 20  ->pLeaf==0) and 
d5c0: 61 73 73 75 6d 65 20 74 68 65 20 69 74 65 72 61  assume the itera
d5d0: 74 6f 72 20 69 73 0a 20 20 20 20 2a 2a 20 61 74  tor is.    ** at
d5e0: 20 45 4f 46 20 61 6c 72 65 61 64 79 2e 20 2a 2f   EOF already. */
d5f0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49 74  .    assert( pIt
d600: 65 72 2d 3e 70 4c 65 61 66 3d 3d 30 20 29 3b 0a  er->pLeaf==0 );.
d610: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
d620: 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51  .  if( p->rc==SQ
d630: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 6d  LITE_OK ){.    m
d640: 65 6d 73 65 74 28 70 49 74 65 72 2c 20 30 2c 20  emset(pIter, 0, 
d650: 73 69 7a 65 6f 66 28 2a 70 49 74 65 72 29 29 3b  sizeof(*pIter));
d660: 0a 20 20 20 20 66 74 73 35 53 65 67 49 74 65 72  .    fts5SegIter
d670: 53 65 74 4e 65 78 74 28 70 2c 20 70 49 74 65 72  SetNext(p, pIter
d680: 29 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 70 53  );.    pIter->pS
d690: 65 67 20 3d 20 70 53 65 67 3b 0a 20 20 20 20 70  eg = pSeg;.    p
d6a0: 49 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 20  Iter->iLeafPgno 
d6b0: 3d 20 70 53 65 67 2d 3e 70 67 6e 6f 46 69 72 73  = pSeg->pgnoFirs
d6c0: 74 2d 31 3b 0a 20 20 20 20 66 74 73 35 53 65 67  t-1;.    fts5Seg
d6d0: 49 74 65 72 4e 65 78 74 50 61 67 65 28 70 2c 20  IterNextPage(p, 
d6e0: 70 49 74 65 72 29 3b 0a 20 20 7d 0a 0a 20 20 69  pIter);.  }..  i
d6f0: 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  f( p->rc==SQLITE
d700: 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 49 74 65 72  _OK ){.    pIter
d710: 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 20 3d 20  ->iLeafOffset = 
d720: 34 3b 0a 20 20 20 20 61 73 73 65 72 74 5f 6e 63  4;.    assert_nc
d730: 28 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e  ( pIter->pLeaf->
d740: 6e 6e 3e 34 20 29 3b 0a 20 20 20 20 61 73 73 65  nn>4 );.    asse
d750: 72 74 28 20 66 74 73 35 4c 65 61 66 46 69 72 73  rt( fts5LeafFirs
d760: 74 54 65 72 6d 4f 66 66 28 70 49 74 65 72 2d 3e  tTermOff(pIter->
d770: 70 4c 65 61 66 29 3d 3d 34 20 29 3b 0a 20 20 20  pLeaf)==4 );.   
d780: 20 70 49 74 65 72 2d 3e 69 50 67 69 64 78 4f 66   pIter->iPgidxOf
d790: 66 20 3d 20 70 49 74 65 72 2d 3e 70 4c 65 61 66  f = pIter->pLeaf
d7a0: 2d 3e 73 7a 4c 65 61 66 2b 31 3b 0a 20 20 20 20  ->szLeaf+1;.    
d7b0: 66 74 73 35 53 65 67 49 74 65 72 4c 6f 61 64 54  fts5SegIterLoadT
d7c0: 65 72 6d 28 70 2c 20 70 49 74 65 72 2c 20 30 29  erm(p, pIter, 0)
d7d0: 3b 0a 20 20 20 20 66 74 73 35 53 65 67 49 74 65  ;.    fts5SegIte
d7e0: 72 4c 6f 61 64 4e 50 6f 73 28 70 2c 20 70 49 74  rLoadNPos(p, pIt
d7f0: 65 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  er);.  }.}../*.*
d800: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
d810: 69 73 20 6f 6e 6c 79 20 65 76 65 72 20 63 61 6c  is only ever cal
d820: 6c 65 64 20 6f 6e 20 69 74 65 72 61 74 6f 72 73  led on iterators
d830: 20 63 72 65 61 74 65 64 20 62 79 20 63 61 6c 6c   created by call
d840: 73 20 74 6f 0a 2a 2a 20 46 74 73 35 49 6e 64 65  s to.** Fts5Inde
d850: 78 51 75 65 72 79 28 29 20 77 69 74 68 20 74 68  xQuery() with th
d860: 65 20 46 54 53 35 49 4e 44 45 58 5f 51 55 45 52  e FTS5INDEX_QUER
d870: 59 5f 44 45 53 43 20 66 6c 61 67 20 73 65 74 2e  Y_DESC flag set.
d880: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 74 65 72 61  .**.** The itera
d890: 74 6f 72 20 69 73 20 69 6e 20 61 6e 20 75 6e 75  tor is in an unu
d8a0: 73 75 61 6c 20 73 74 61 74 65 20 77 68 65 6e 20  sual state when 
d8b0: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
d8c0: 20 63 61 6c 6c 65 64 3a 20 74 68 65 0a 2a 2a 20   called: the.** 
d8d0: 46 74 73 35 53 65 67 49 74 65 72 2e 69 4c 65 61  Fts5SegIter.iLea
d8e0: 66 4f 66 66 73 65 74 20 76 61 72 69 61 62 6c 65  fOffset variable
d8f0: 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 6f   is set to the o
d900: 66 66 73 65 74 20 6f 66 20 74 68 65 20 73 74 61  ffset of the sta
d910: 72 74 20 6f 66 0a 2a 2a 20 74 68 65 20 70 6f 73  rt of.** the pos
d920: 69 74 69 6f 6e 2d 6c 69 73 74 20 73 69 7a 65 20  ition-list size 
d930: 66 69 65 6c 64 20 66 6f 72 20 74 68 65 20 66 69  field for the fi
d940: 72 73 74 20 72 65 6c 65 76 61 6e 74 20 72 6f 77  rst relevant row
d950: 69 64 20 6f 6e 20 74 68 65 20 70 61 67 65 2e 0a  id on the page..
d960: 2a 2a 20 46 74 73 35 53 65 67 49 74 65 72 2e 72  ** Fts5SegIter.r
d970: 6f 77 69 64 20 69 73 20 73 65 74 2c 20 62 75 74  owid is set, but
d980: 20 6e 50 6f 73 20 61 6e 64 20 62 44 65 6c 20 61   nPos and bDel a
d990: 72 65 20 6e 6f 74 2e 0a 2a 2a 0a 2a 2a 20 54 68  re not..**.** Th
d9a0: 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 64 76 61  is function adva
d9b0: 6e 63 65 73 20 74 68 65 20 69 74 65 72 61 74 6f  nces the iterato
d9c0: 72 20 73 6f 20 74 68 61 74 20 69 74 20 70 6f 69  r so that it poi
d9d0: 6e 74 73 20 74 6f 20 74 68 65 20 6c 61 73 74 20  nts to the last 
d9e0: 0a 2a 2a 20 72 65 6c 65 76 61 6e 74 20 72 6f 77  .** relevant row
d9f0: 69 64 20 6f 6e 20 74 68 65 20 70 61 67 65 20 61  id on the page a
da00: 6e 64 2c 20 69 66 20 6e 65 63 65 73 73 61 72 79  nd, if necessary
da10: 2c 20 69 6e 69 74 69 61 6c 69 7a 65 73 20 74 68  , initializes th
da20: 65 20 0a 2a 2a 20 61 52 6f 77 69 64 4f 66 66 73  e .** aRowidOffs
da30: 65 74 5b 5d 20 61 6e 64 20 69 52 6f 77 69 64 4f  et[] and iRowidO
da40: 66 66 73 65 74 20 76 61 72 69 61 62 6c 65 73 2e  ffset variables.
da50: 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 20 74   At this point t
da60: 68 65 20 69 74 65 72 61 74 6f 72 0a 2a 2a 20 69  he iterator.** i
da70: 73 20 69 6e 20 69 74 73 20 72 65 67 75 6c 61 72  s in its regular
da80: 20 73 74 61 74 65 20 2d 20 46 74 73 35 53 65 67   state - Fts5Seg
da90: 49 74 65 72 2e 69 4c 65 61 66 4f 66 66 73 65 74  Iter.iLeafOffset
daa0: 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 66   points to the f
dab0: 69 72 73 74 0a 2a 2a 20 62 79 74 65 20 6f 66 20  irst.** byte of 
dac0: 74 68 65 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73  the position lis
dad0: 74 20 63 6f 6e 74 65 6e 74 20 61 73 73 6f 63 69  t content associ
dae0: 61 74 65 64 20 77 69 74 68 20 73 61 69 64 20 72  ated with said r
daf0: 6f 77 69 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  owid..*/.static 
db00: 76 6f 69 64 20 66 74 73 35 53 65 67 49 74 65 72  void fts5SegIter
db10: 52 65 76 65 72 73 65 49 6e 69 74 50 61 67 65 28  ReverseInitPage(
db20: 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 46 74  Fts5Index *p, Ft
db30: 73 35 53 65 67 49 74 65 72 20 2a 70 49 74 65 72  s5SegIter *pIter
db40: 29 7b 0a 20 20 69 6e 74 20 65 44 65 74 61 69 6c  ){.  int eDetail
db50: 20 3d 20 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e 65   = p->pConfig->e
db60: 44 65 74 61 69 6c 3b 0a 20 20 69 6e 74 20 6e 20  Detail;.  int n 
db70: 3d 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e  = pIter->pLeaf->
db80: 73 7a 4c 65 61 66 3b 0a 20 20 69 6e 74 20 69 20  szLeaf;.  int i 
db90: 3d 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66  = pIter->iLeafOf
dba0: 66 73 65 74 3b 0a 20 20 75 38 20 2a 61 20 3d 20  fset;.  u8 *a = 
dbb0: 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 70 3b  pIter->pLeaf->p;
dbc0: 0a 20 20 69 6e 74 20 69 52 6f 77 69 64 4f 66 66  .  int iRowidOff
dbd0: 73 65 74 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20  set = 0;..  if( 
dbe0: 6e 3e 70 49 74 65 72 2d 3e 69 45 6e 64 6f 66 44  n>pIter->iEndofD
dbf0: 6f 63 6c 69 73 74 20 29 7b 0a 20 20 20 20 6e 20  oclist ){.    n 
dc00: 3d 20 70 49 74 65 72 2d 3e 69 45 6e 64 6f 66 44  = pIter->iEndofD
dc10: 6f 63 6c 69 73 74 3b 0a 20 20 7d 0a 0a 20 20 41  oclist;.  }..  A
dc20: 53 53 45 52 54 5f 53 5a 4c 45 41 46 5f 4f 4b 28  SSERT_SZLEAF_OK(
dc30: 70 49 74 65 72 2d 3e 70 4c 65 61 66 29 3b 0a 20  pIter->pLeaf);. 
dc40: 20 77 68 69 6c 65 28 20 31 20 29 7b 0a 20 20 20   while( 1 ){.   
dc50: 20 69 36 34 20 69 44 65 6c 74 61 20 3d 20 30 3b   i64 iDelta = 0;
dc60: 0a 0a 20 20 20 20 69 66 28 20 65 44 65 74 61 69  ..    if( eDetai
dc70: 6c 3d 3d 46 54 53 35 5f 44 45 54 41 49 4c 5f 4e  l==FTS5_DETAIL_N
dc80: 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  ONE ){.      /* 
dc90: 74 6f 64 6f 20 2a 2f 0a 20 20 20 20 20 20 69 66  todo */.      if
dca0: 28 20 69 3c 6e 20 26 26 20 61 5b 69 5d 3d 3d 30  ( i<n && a[i]==0
dcb0: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 2b 2b 3b   ){.        i++;
dcc0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 3c 6e  .        if( i<n
dcd0: 20 26 26 20 61 5b 69 5d 3d 3d 30 20 29 20 69 2b   && a[i]==0 ) i+
dce0: 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  +;.      }.    }
dcf0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20  else{.      int 
dd00: 6e 50 6f 73 3b 0a 20 20 20 20 20 20 69 6e 74 20  nPos;.      int 
dd10: 62 44 75 6d 6d 79 3b 0a 20 20 20 20 20 20 69 20  bDummy;.      i 
dd20: 2b 3d 20 66 74 73 35 47 65 74 50 6f 73 6c 69 73  += fts5GetPoslis
dd30: 74 53 69 7a 65 28 26 61 5b 69 5d 2c 20 26 6e 50  tSize(&a[i], &nP
dd40: 6f 73 2c 20 26 62 44 75 6d 6d 79 29 3b 0a 20 20  os, &bDummy);.  
dd50: 20 20 20 20 69 20 2b 3d 20 6e 50 6f 73 3b 0a 20      i += nPos;. 
dd60: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 3e 3d     }.    if( i>=
dd70: 6e 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 69  n ) break;.    i
dd80: 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e   += fts5GetVarin
dd90: 74 28 26 61 5b 69 5d 2c 20 28 75 36 34 2a 29 26  t(&a[i], (u64*)&
dda0: 69 44 65 6c 74 61 29 3b 0a 20 20 20 20 70 49 74  iDelta);.    pIt
ddb0: 65 72 2d 3e 69 52 6f 77 69 64 20 2b 3d 20 69 44  er->iRowid += iD
ddc0: 65 6c 74 61 3b 0a 0a 20 20 20 20 2f 2a 20 49 66  elta;..    /* If
ddd0: 20 6e 65 63 65 73 73 61 72 79 2c 20 67 72 6f 77   necessary, grow
dde0: 20 74 68 65 20 70 49 74 65 72 2d 3e 61 52 6f 77   the pIter->aRow
ddf0: 69 64 4f 66 66 73 65 74 5b 5d 20 61 72 72 61 79  idOffset[] array
de00: 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 69 52 6f  . */.    if( iRo
de10: 77 69 64 4f 66 66 73 65 74 3e 3d 70 49 74 65 72  widOffset>=pIter
de20: 2d 3e 6e 52 6f 77 69 64 4f 66 66 73 65 74 20 29  ->nRowidOffset )
de30: 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 4e 65 77  {.      int nNew
de40: 20 3d 20 70 49 74 65 72 2d 3e 6e 52 6f 77 69 64   = pIter->nRowid
de50: 4f 66 66 73 65 74 20 2b 20 38 3b 0a 20 20 20 20  Offset + 8;.    
de60: 20 20 69 6e 74 20 2a 61 4e 65 77 20 3d 20 28 69    int *aNew = (i
de70: 6e 74 2a 29 73 71 6c 69 74 65 33 5f 72 65 61 6c  nt*)sqlite3_real
de80: 6c 6f 63 28 70 49 74 65 72 2d 3e 61 52 6f 77 69  loc(pIter->aRowi
de90: 64 4f 66 66 73 65 74 2c 20 6e 4e 65 77 2a 73 69  dOffset, nNew*si
dea0: 7a 65 6f 66 28 69 6e 74 29 29 3b 0a 20 20 20 20  zeof(int));.    
deb0: 20 20 69 66 28 20 61 4e 65 77 3d 3d 30 20 29 7b    if( aNew==0 ){
dec0: 0a 20 20 20 20 20 20 20 20 70 2d 3e 72 63 20 3d  .        p->rc =
ded0: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
dee0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
def0: 20 20 20 20 7d 0a 20 20 20 20 20 20 70 49 74 65      }.      pIte
df00: 72 2d 3e 61 52 6f 77 69 64 4f 66 66 73 65 74 20  r->aRowidOffset 
df10: 3d 20 61 4e 65 77 3b 0a 20 20 20 20 20 20 70 49  = aNew;.      pI
df20: 74 65 72 2d 3e 6e 52 6f 77 69 64 4f 66 66 73 65  ter->nRowidOffse
df30: 74 20 3d 20 6e 4e 65 77 3b 0a 20 20 20 20 7d 0a  t = nNew;.    }.
df40: 0a 20 20 20 20 70 49 74 65 72 2d 3e 61 52 6f 77  .    pIter->aRow
df50: 69 64 4f 66 66 73 65 74 5b 69 52 6f 77 69 64 4f  idOffset[iRowidO
df60: 66 66 73 65 74 2b 2b 5d 20 3d 20 70 49 74 65 72  ffset++] = pIter
df70: 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 3b 0a 20  ->iLeafOffset;. 
df80: 20 20 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f     pIter->iLeafO
df90: 66 66 73 65 74 20 3d 20 69 3b 0a 20 20 7d 0a 20  ffset = i;.  }. 
dfa0: 20 70 49 74 65 72 2d 3e 69 52 6f 77 69 64 4f 66   pIter->iRowidOf
dfb0: 66 73 65 74 20 3d 20 69 52 6f 77 69 64 4f 66 66  fset = iRowidOff
dfc0: 73 65 74 3b 0a 20 20 66 74 73 35 53 65 67 49 74  set;.  fts5SegIt
dfd0: 65 72 4c 6f 61 64 4e 50 6f 73 28 70 2c 20 70 49  erLoadNPos(p, pI
dfe0: 74 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 0a 2a  ter);.}../*.**.*
dff0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  /.static void ft
e000: 73 35 53 65 67 49 74 65 72 52 65 76 65 72 73 65  s5SegIterReverse
e010: 4e 65 77 50 61 67 65 28 46 74 73 35 49 6e 64 65  NewPage(Fts5Inde
e020: 78 20 2a 70 2c 20 46 74 73 35 53 65 67 49 74 65  x *p, Fts5SegIte
e030: 72 20 2a 70 49 74 65 72 29 7b 0a 20 20 61 73 73  r *pIter){.  ass
e040: 65 72 74 28 20 70 49 74 65 72 2d 3e 66 6c 61 67  ert( pIter->flag
e050: 73 20 26 20 46 54 53 35 5f 53 45 47 49 54 45 52  s & FTS5_SEGITER
e060: 5f 52 45 56 45 52 53 45 20 29 3b 0a 20 20 61 73  _REVERSE );.  as
e070: 73 65 72 74 28 20 70 49 74 65 72 2d 3e 66 6c 61  sert( pIter->fla
e080: 67 73 20 26 20 46 54 53 35 5f 53 45 47 49 54 45  gs & FTS5_SEGITE
e090: 52 5f 4f 4e 45 54 45 52 4d 20 29 3b 0a 0a 20 20  R_ONETERM );..  
e0a0: 66 74 73 35 44 61 74 61 52 65 6c 65 61 73 65 28  fts5DataRelease(
e0b0: 70 49 74 65 72 2d 3e 70 4c 65 61 66 29 3b 0a 20  pIter->pLeaf);. 
e0c0: 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 20 3d 20   pIter->pLeaf = 
e0d0: 30 3b 0a 20 20 77 68 69 6c 65 28 20 70 2d 3e 72  0;.  while( p->r
e0e0: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
e0f0: 70 49 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f  pIter->iLeafPgno
e100: 3e 70 49 74 65 72 2d 3e 69 54 65 72 6d 4c 65 61  >pIter->iTermLea
e110: 66 50 67 6e 6f 20 29 7b 0a 20 20 20 20 46 74 73  fPgno ){.    Fts
e120: 35 44 61 74 61 20 2a 70 4e 65 77 3b 0a 20 20 20  5Data *pNew;.   
e130: 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e   pIter->iLeafPgn
e140: 6f 2d 2d 3b 0a 20 20 20 20 70 4e 65 77 20 3d 20  o--;.    pNew = 
e150: 66 74 73 35 44 61 74 61 52 65 61 64 28 70 2c 20  fts5DataRead(p, 
e160: 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f 52 4f 57  FTS5_SEGMENT_ROW
e170: 49 44 28 0a 20 20 20 20 20 20 20 20 20 20 70 49  ID(.          pI
e180: 74 65 72 2d 3e 70 53 65 67 2d 3e 69 53 65 67 69  ter->pSeg->iSegi
e190: 64 2c 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 50  d, pIter->iLeafP
e1a0: 67 6e 6f 0a 20 20 20 20 29 29 3b 0a 20 20 20 20  gno.    ));.    
e1b0: 69 66 28 20 70 4e 65 77 20 29 7b 0a 20 20 20 20  if( pNew ){.    
e1c0: 20 20 2f 2a 20 69 54 65 72 6d 4c 65 61 66 4f 66    /* iTermLeafOf
e1d0: 66 73 65 74 20 6d 61 79 20 62 65 20 65 71 75 61  fset may be equa
e1e0: 6c 20 74 6f 20 73 7a 4c 65 61 66 20 69 66 20 74  l to szLeaf if t
e1f0: 68 65 20 74 65 72 6d 20 69 73 20 74 68 65 20 6c  he term is the l
e200: 61 73 74 0a 20 20 20 20 20 20 2a 2a 20 74 68 69  ast.      ** thi
e210: 6e 67 20 6f 6e 20 74 68 65 20 70 61 67 65 20 2d  ng on the page -
e220: 20 69 2e 65 2e 20 74 68 65 20 66 69 72 73 74 20   i.e. the first 
e230: 72 6f 77 69 64 20 69 73 20 6f 6e 20 74 68 65 20  rowid is on the 
e240: 66 6f 6c 6c 6f 77 69 6e 67 20 70 61 67 65 2e 0a  following page..
e250: 20 20 20 20 20 20 2a 2a 20 49 6e 20 74 68 69 73        ** In this
e260: 20 63 61 73 65 20 6c 65 61 76 65 20 70 49 74 65   case leave pIte
e270: 72 2d 3e 70 4c 65 61 66 3d 3d 30 2c 20 74 68 69  r->pLeaf==0, thi
e280: 73 20 69 74 65 72 61 74 6f 72 20 69 73 20 61 74  s iterator is at
e290: 20 45 4f 46 2e 20 2a 2f 0a 20 20 20 20 20 20 69   EOF. */.      i
e2a0: 66 28 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 50  f( pIter->iLeafP
e2b0: 67 6e 6f 3d 3d 70 49 74 65 72 2d 3e 69 54 65 72  gno==pIter->iTer
e2c0: 6d 4c 65 61 66 50 67 6e 6f 20 29 7b 0a 20 20 20  mLeafPgno ){.   
e2d0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49 74       assert( pIt
e2e0: 65 72 2d 3e 70 4c 65 61 66 3d 3d 30 20 29 3b 0a  er->pLeaf==0 );.
e2f0: 20 20 20 20 20 20 20 20 69 66 28 20 70 49 74 65          if( pIte
e300: 72 2d 3e 69 54 65 72 6d 4c 65 61 66 4f 66 66 73  r->iTermLeafOffs
e310: 65 74 3c 70 4e 65 77 2d 3e 73 7a 4c 65 61 66 20  et<pNew->szLeaf 
e320: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 49 74  ){.          pIt
e330: 65 72 2d 3e 70 4c 65 61 66 20 3d 20 70 4e 65 77  er->pLeaf = pNew
e340: 3b 0a 20 20 20 20 20 20 20 20 20 20 70 49 74 65  ;.          pIte
e350: 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 20 3d  r->iLeafOffset =
e360: 20 70 49 74 65 72 2d 3e 69 54 65 72 6d 4c 65 61   pIter->iTermLea
e370: 66 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20 20  fOffset;.       
e380: 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a   }.      }else{.
e390: 20 20 20 20 20 20 20 20 69 6e 74 20 69 52 6f 77          int iRow
e3a0: 69 64 4f 66 66 3b 0a 20 20 20 20 20 20 20 20 69  idOff;.        i
e3b0: 52 6f 77 69 64 4f 66 66 20 3d 20 66 74 73 35 4c  RowidOff = fts5L
e3c0: 65 61 66 46 69 72 73 74 52 6f 77 69 64 4f 66 66  eafFirstRowidOff
e3d0: 28 70 4e 65 77 29 3b 0a 20 20 20 20 20 20 20 20  (pNew);.        
e3e0: 69 66 28 20 69 52 6f 77 69 64 4f 66 66 20 29 7b  if( iRowidOff ){
e3f0: 0a 20 20 20 20 20 20 20 20 20 20 70 49 74 65 72  .          pIter
e400: 2d 3e 70 4c 65 61 66 20 3d 20 70 4e 65 77 3b 0a  ->pLeaf = pNew;.
e410: 20 20 20 20 20 20 20 20 20 20 70 49 74 65 72 2d            pIter-
e420: 3e 69 4c 65 61 66 4f 66 66 73 65 74 20 3d 20 69  >iLeafOffset = i
e430: 52 6f 77 69 64 4f 66 66 3b 0a 20 20 20 20 20 20  RowidOff;.      
e440: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20    }.      }..   
e450: 20 20 20 69 66 28 20 70 49 74 65 72 2d 3e 70 4c     if( pIter->pL
e460: 65 61 66 20 29 7b 0a 20 20 20 20 20 20 20 20 75  eaf ){.        u
e470: 38 20 2a 61 20 3d 20 26 70 49 74 65 72 2d 3e 70  8 *a = &pIter->p
e480: 4c 65 61 66 2d 3e 70 5b 70 49 74 65 72 2d 3e 69  Leaf->p[pIter->i
e490: 4c 65 61 66 4f 66 66 73 65 74 5d 3b 0a 20 20 20  LeafOffset];.   
e4a0: 20 20 20 20 20 70 49 74 65 72 2d 3e 69 4c 65 61       pIter->iLea
e4b0: 66 4f 66 66 73 65 74 20 2b 3d 20 66 74 73 35 47  fOffset += fts5G
e4c0: 65 74 56 61 72 69 6e 74 28 61 2c 20 28 75 36 34  etVarint(a, (u64
e4d0: 2a 29 26 70 49 74 65 72 2d 3e 69 52 6f 77 69 64  *)&pIter->iRowid
e4e0: 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  );.        break
e4f0: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
e500: 20 20 20 20 20 20 20 66 74 73 35 44 61 74 61 52         fts5DataR
e510: 65 6c 65 61 73 65 28 70 4e 65 77 29 3b 0a 20 20  elease(pNew);.  
e520: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
e530: 0a 20 20 69 66 28 20 70 49 74 65 72 2d 3e 70 4c  .  if( pIter->pL
e540: 65 61 66 20 29 7b 0a 20 20 20 20 70 49 74 65 72  eaf ){.    pIter
e550: 2d 3e 69 45 6e 64 6f 66 44 6f 63 6c 69 73 74 20  ->iEndofDoclist 
e560: 3d 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e  = pIter->pLeaf->
e570: 6e 6e 2b 31 3b 0a 20 20 20 20 66 74 73 35 53 65  nn+1;.    fts5Se
e580: 67 49 74 65 72 52 65 76 65 72 73 65 49 6e 69 74  gIterReverseInit
e590: 50 61 67 65 28 70 2c 20 70 49 74 65 72 29 3b 0a  Page(p, pIter);.
e5a0: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74    }.}../*.** Ret
e5b0: 75 72 6e 20 74 72 75 65 20 69 66 20 74 68 65 20  urn true if the 
e5c0: 69 74 65 72 61 74 6f 72 20 70 61 73 73 65 64 20  iterator passed 
e5d0: 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72  as the second ar
e5e0: 67 75 6d 65 6e 74 20 63 75 72 72 65 6e 74 6c 79  gument currently
e5f0: 0a 2a 2a 20 70 6f 69 6e 74 73 20 74 6f 20 61 20  .** points to a 
e600: 64 65 6c 65 74 65 20 6d 61 72 6b 65 72 2e 20 41  delete marker. A
e610: 20 64 65 6c 65 74 65 20 6d 61 72 6b 65 72 20 69   delete marker i
e620: 73 20 61 6e 20 65 6e 74 72 79 20 77 69 74 68 20  s an entry with 
e630: 61 20 30 20 62 79 74 65 0a 2a 2a 20 70 6f 73 69  a 0 byte.** posi
e640: 74 69 6f 6e 2d 6c 69 73 74 2e 0a 2a 2f 0a 73 74  tion-list..*/.st
e650: 61 74 69 63 20 69 6e 74 20 66 74 73 35 4d 75 6c  atic int fts5Mul
e660: 74 69 49 74 65 72 49 73 45 6d 70 74 79 28 46 74  tiIterIsEmpty(Ft
e670: 73 35 49 6e 64 65 78 20 2a 70 2c 20 46 74 73 35  s5Index *p, Fts5
e680: 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a 20 20  Iter *pIter){.  
e690: 46 74 73 35 53 65 67 49 74 65 72 20 2a 70 53 65  Fts5SegIter *pSe
e6a0: 67 20 3d 20 26 70 49 74 65 72 2d 3e 61 53 65 67  g = &pIter->aSeg
e6b0: 5b 70 49 74 65 72 2d 3e 61 46 69 72 73 74 5b 31  [pIter->aFirst[1
e6c0: 5d 2e 69 46 69 72 73 74 5d 3b 0a 20 20 72 65 74  ].iFirst];.  ret
e6d0: 75 72 6e 20 28 70 2d 3e 72 63 3d 3d 53 51 4c 49  urn (p->rc==SQLI
e6e0: 54 45 5f 4f 4b 20 26 26 20 70 53 65 67 2d 3e 70  TE_OK && pSeg->p
e6f0: 4c 65 61 66 20 26 26 20 70 53 65 67 2d 3e 6e 50  Leaf && pSeg->nP
e700: 6f 73 3d 3d 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  os==0);.}../*.**
e710: 20 41 64 76 61 6e 63 65 20 69 74 65 72 61 74 6f   Advance iterato
e720: 72 20 70 49 74 65 72 20 74 6f 20 74 68 65 20 6e  r pIter to the n
e730: 65 78 74 20 65 6e 74 72 79 2e 0a 2a 2a 0a 2a 2a  ext entry..**.**
e740: 20 54 68 69 73 20 76 65 72 73 69 6f 6e 20 6f 66   This version of
e750: 20 66 74 73 35 53 65 67 49 74 65 72 4e 65 78 74   fts5SegIterNext
e760: 28 29 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20  () is only used 
e770: 62 79 20 72 65 76 65 72 73 65 20 69 74 65 72 61  by reverse itera
e780: 74 6f 72 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tors..*/.static 
e790: 76 6f 69 64 20 66 74 73 35 53 65 67 49 74 65 72  void fts5SegIter
e7a0: 4e 65 78 74 5f 52 65 76 65 72 73 65 28 0a 20 20  Next_Reverse(.  
e7b0: 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 20 20  Fts5Index *p,   
e7c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e7d0: 2f 2a 20 46 54 53 35 20 62 61 63 6b 65 6e 64 20  /* FTS5 backend 
e7e0: 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 46 74 73 35  object */.  Fts5
e7f0: 53 65 67 49 74 65 72 20 2a 70 49 74 65 72 2c 20  SegIter *pIter, 
e800: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
e810: 74 65 72 61 74 6f 72 20 74 6f 20 61 64 76 61 6e  terator to advan
e820: 63 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 62 55  ce */.  int *pbU
e830: 6e 75 73 65 64 20 20 20 20 20 20 20 20 20 20 20  nused           
e840: 20 20 20 20 20 20 20 20 2f 2a 20 55 6e 75 73 65          /* Unuse
e850: 64 20 2a 2f 0a 29 7b 0a 20 20 61 73 73 65 72 74  d */.){.  assert
e860: 28 20 70 49 74 65 72 2d 3e 66 6c 61 67 73 20 26  ( pIter->flags &
e870: 20 46 54 53 35 5f 53 45 47 49 54 45 52 5f 52 45   FTS5_SEGITER_RE
e880: 56 45 52 53 45 20 29 3b 0a 20 20 61 73 73 65 72  VERSE );.  asser
e890: 74 28 20 70 49 74 65 72 2d 3e 70 4e 65 78 74 4c  t( pIter->pNextL
e8a0: 65 61 66 3d 3d 30 20 29 3b 0a 20 20 55 4e 55 53  eaf==0 );.  UNUS
e8b0: 45 44 5f 50 41 52 41 4d 28 70 62 55 6e 75 73 65  ED_PARAM(pbUnuse
e8c0: 64 29 3b 0a 0a 20 20 69 66 28 20 70 49 74 65 72  d);..  if( pIter
e8d0: 2d 3e 69 52 6f 77 69 64 4f 66 66 73 65 74 3e 30  ->iRowidOffset>0
e8e0: 20 29 7b 0a 20 20 20 20 75 38 20 2a 61 20 3d 20   ){.    u8 *a = 
e8f0: 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 70 3b  pIter->pLeaf->p;
e900: 0a 20 20 20 20 69 6e 74 20 69 4f 66 66 3b 0a 20  .    int iOff;. 
e910: 20 20 20 69 36 34 20 69 44 65 6c 74 61 3b 0a 0a     i64 iDelta;..
e920: 20 20 20 20 70 49 74 65 72 2d 3e 69 52 6f 77 69      pIter->iRowi
e930: 64 4f 66 66 73 65 74 2d 2d 3b 0a 20 20 20 20 70  dOffset--;.    p
e940: 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65  Iter->iLeafOffse
e950: 74 20 3d 20 70 49 74 65 72 2d 3e 61 52 6f 77 69  t = pIter->aRowi
e960: 64 4f 66 66 73 65 74 5b 70 49 74 65 72 2d 3e 69  dOffset[pIter->i
e970: 52 6f 77 69 64 4f 66 66 73 65 74 5d 3b 0a 20 20  RowidOffset];.  
e980: 20 20 66 74 73 35 53 65 67 49 74 65 72 4c 6f 61    fts5SegIterLoa
e990: 64 4e 50 6f 73 28 70 2c 20 70 49 74 65 72 29 3b  dNPos(p, pIter);
e9a0: 0a 20 20 20 20 69 4f 66 66 20 3d 20 70 49 74 65  .    iOff = pIte
e9b0: 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 3b 0a  r->iLeafOffset;.
e9c0: 20 20 20 20 69 66 28 20 70 2d 3e 70 43 6f 6e 66      if( p->pConf
e9d0: 69 67 2d 3e 65 44 65 74 61 69 6c 21 3d 46 54 53  ig->eDetail!=FTS
e9e0: 35 5f 44 45 54 41 49 4c 5f 4e 4f 4e 45 20 29 7b  5_DETAIL_NONE ){
e9f0: 0a 20 20 20 20 20 20 69 4f 66 66 20 2b 3d 20 70  .      iOff += p
ea00: 49 74 65 72 2d 3e 6e 50 6f 73 3b 0a 20 20 20 20  Iter->nPos;.    
ea10: 7d 0a 20 20 20 20 66 74 73 35 47 65 74 56 61 72  }.    fts5GetVar
ea20: 69 6e 74 28 26 61 5b 69 4f 66 66 5d 2c 20 28 75  int(&a[iOff], (u
ea30: 36 34 2a 29 26 69 44 65 6c 74 61 29 3b 0a 20 20  64*)&iDelta);.  
ea40: 20 20 70 49 74 65 72 2d 3e 69 52 6f 77 69 64 20    pIter->iRowid 
ea50: 2d 3d 20 69 44 65 6c 74 61 3b 0a 20 20 7d 65 6c  -= iDelta;.  }el
ea60: 73 65 7b 0a 20 20 20 20 66 74 73 35 53 65 67 49  se{.    fts5SegI
ea70: 74 65 72 52 65 76 65 72 73 65 4e 65 77 50 61 67  terReverseNewPag
ea80: 65 28 70 2c 20 70 49 74 65 72 29 3b 0a 20 20 7d  e(p, pIter);.  }
ea90: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 76 61 6e 63  .}../*.** Advanc
eaa0: 65 20 69 74 65 72 61 74 6f 72 20 70 49 74 65 72  e iterator pIter
eab0: 20 74 6f 20 74 68 65 20 6e 65 78 74 20 65 6e 74   to the next ent
eac0: 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 76  ry..**.** This v
ead0: 65 72 73 69 6f 6e 20 6f 66 20 66 74 73 35 53 65  ersion of fts5Se
eae0: 67 49 74 65 72 4e 65 78 74 28 29 20 69 73 20 6f  gIterNext() is o
eaf0: 6e 6c 79 20 75 73 65 64 20 69 66 20 64 65 74 61  nly used if deta
eb00: 69 6c 3d 6e 6f 6e 65 20 61 6e 64 20 74 68 65 0a  il=none and the.
eb10: 2a 2a 20 69 74 65 72 61 74 6f 72 20 69 73 20 6e  ** iterator is n
eb20: 6f 74 20 61 20 72 65 76 65 72 73 65 20 64 69 72  ot a reverse dir
eb30: 65 63 74 69 6f 6e 20 69 74 65 72 61 74 6f 72 2e  ection iterator.
eb40: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
eb50: 66 74 73 35 53 65 67 49 74 65 72 4e 65 78 74 5f  fts5SegIterNext_
eb60: 4e 6f 6e 65 28 0a 20 20 46 74 73 35 49 6e 64 65  None(.  Fts5Inde
eb70: 78 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  x *p,           
eb80: 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53 35 20          /* FTS5 
eb90: 62 61 63 6b 65 6e 64 20 6f 62 6a 65 63 74 20 2a  backend object *
eba0: 2f 0a 20 20 46 74 73 35 53 65 67 49 74 65 72 20  /.  Fts5SegIter 
ebb0: 2a 70 49 74 65 72 2c 20 20 20 20 20 20 20 20 20  *pIter,         
ebc0: 20 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20      /* Iterator 
ebd0: 74 6f 20 61 64 76 61 6e 63 65 20 2a 2f 0a 20 20  to advance */.  
ebe0: 69 6e 74 20 2a 70 62 4e 65 77 54 65 72 6d 20 20  int *pbNewTerm  
ebf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ec00: 2f 2a 20 4f 55 54 3a 20 53 65 74 20 66 6f 72 20  /* OUT: Set for 
ec10: 6e 65 77 20 74 65 72 6d 20 2a 2f 0a 29 7b 0a 20  new term */.){. 
ec20: 20 69 6e 74 20 69 4f 66 66 3b 0a 0a 20 20 61 73   int iOff;..  as
ec30: 73 65 72 74 28 20 70 2d 3e 72 63 3d 3d 53 51 4c  sert( p->rc==SQL
ec40: 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 61 73 73 65  ITE_OK );.  asse
ec50: 72 74 28 20 28 70 49 74 65 72 2d 3e 66 6c 61 67  rt( (pIter->flag
ec60: 73 20 26 20 46 54 53 35 5f 53 45 47 49 54 45 52  s & FTS5_SEGITER
ec70: 5f 52 45 56 45 52 53 45 29 3d 3d 30 20 29 3b 0a  _REVERSE)==0 );.
ec80: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 43 6f    assert( p->pCo
ec90: 6e 66 69 67 2d 3e 65 44 65 74 61 69 6c 3d 3d 46  nfig->eDetail==F
eca0: 54 53 35 5f 44 45 54 41 49 4c 5f 4e 4f 4e 45 20  TS5_DETAIL_NONE 
ecb0: 29 3b 0a 0a 20 20 41 53 53 45 52 54 5f 53 5a 4c  );..  ASSERT_SZL
ecc0: 45 41 46 5f 4f 4b 28 70 49 74 65 72 2d 3e 70 4c  EAF_OK(pIter->pL
ecd0: 65 61 66 29 3b 0a 20 20 69 4f 66 66 20 3d 20 70  eaf);.  iOff = p
ece0: 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65  Iter->iLeafOffse
ecf0: 74 3b 0a 0a 20 20 2f 2a 20 4e 65 78 74 20 65 6e  t;..  /* Next en
ed00: 74 72 79 20 69 73 20 6f 6e 20 74 68 65 20 6e 65  try is on the ne
ed10: 78 74 20 70 61 67 65 20 2a 2f 0a 20 20 69 66 28  xt page */.  if(
ed20: 20 70 49 74 65 72 2d 3e 70 53 65 67 20 26 26 20   pIter->pSeg && 
ed30: 69 4f 66 66 3e 3d 70 49 74 65 72 2d 3e 70 4c 65  iOff>=pIter->pLe
ed40: 61 66 2d 3e 73 7a 4c 65 61 66 20 29 7b 0a 20 20  af->szLeaf ){.  
ed50: 20 20 66 74 73 35 53 65 67 49 74 65 72 4e 65 78    fts5SegIterNex
ed60: 74 50 61 67 65 28 70 2c 20 70 49 74 65 72 29 3b  tPage(p, pIter);
ed70: 0a 20 20 20 20 69 66 28 20 70 2d 3e 72 63 20 7c  .    if( p->rc |
ed80: 7c 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 3d 3d  | pIter->pLeaf==
ed90: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20  0 ) return;.    
eda0: 70 49 74 65 72 2d 3e 69 52 6f 77 69 64 20 3d 20  pIter->iRowid = 
edb0: 30 3b 0a 20 20 20 20 69 4f 66 66 20 3d 20 34 3b  0;.    iOff = 4;
edc0: 0a 20 20 7d 0a 0a 20 20 69 66 28 20 69 4f 66 66  .  }..  if( iOff
edd0: 3c 70 49 74 65 72 2d 3e 69 45 6e 64 6f 66 44 6f  <pIter->iEndofDo
ede0: 63 6c 69 73 74 20 29 7b 0a 20 20 20 20 2f 2a 20  clist ){.    /* 
edf0: 4e 65 78 74 20 65 6e 74 72 79 20 69 73 20 6f 6e  Next entry is on
ee00: 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 61 67   the current pag
ee10: 65 20 2a 2f 0a 20 20 20 20 69 36 34 20 69 44 65  e */.    i64 iDe
ee20: 6c 74 61 3b 0a 20 20 20 20 69 4f 66 66 20 2b 3d  lta;.    iOff +=
ee30: 20 73 71 6c 69 74 65 33 46 74 73 35 47 65 74 56   sqlite3Fts5GetV
ee40: 61 72 69 6e 74 28 26 70 49 74 65 72 2d 3e 70 4c  arint(&pIter->pL
ee50: 65 61 66 2d 3e 70 5b 69 4f 66 66 5d 2c 20 28 75  eaf->p[iOff], (u
ee60: 36 34 2a 29 26 69 44 65 6c 74 61 29 3b 0a 20 20  64*)&iDelta);.  
ee70: 20 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66    pIter->iLeafOf
ee80: 66 73 65 74 20 3d 20 69 4f 66 66 3b 0a 20 20 20  fset = iOff;.   
ee90: 20 70 49 74 65 72 2d 3e 69 52 6f 77 69 64 20 2b   pIter->iRowid +
eea0: 3d 20 69 44 65 6c 74 61 3b 0a 20 20 7d 65 6c 73  = iDelta;.  }els
eeb0: 65 20 69 66 28 20 28 70 49 74 65 72 2d 3e 66 6c  e if( (pIter->fl
eec0: 61 67 73 20 26 20 46 54 53 35 5f 53 45 47 49 54  ags & FTS5_SEGIT
eed0: 45 52 5f 4f 4e 45 54 45 52 4d 29 3d 3d 30 20 29  ER_ONETERM)==0 )
eee0: 7b 0a 20 20 20 20 69 66 28 20 70 49 74 65 72 2d  {.    if( pIter-
eef0: 3e 70 53 65 67 20 29 7b 0a 20 20 20 20 20 20 69  >pSeg ){.      i
ef00: 6e 74 20 6e 4b 65 65 70 20 3d 20 30 3b 0a 20 20  nt nKeep = 0;.  
ef10: 20 20 20 20 69 66 28 20 69 4f 66 66 21 3d 66 74      if( iOff!=ft
ef20: 73 35 4c 65 61 66 46 69 72 73 74 54 65 72 6d 4f  s5LeafFirstTermO
ef30: 66 66 28 70 49 74 65 72 2d 3e 70 4c 65 61 66 29  ff(pIter->pLeaf)
ef40: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 4f 66 66   ){.        iOff
ef50: 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e   += fts5GetVarin
ef60: 74 33 32 28 26 70 49 74 65 72 2d 3e 70 4c 65 61  t32(&pIter->pLea
ef70: 66 2d 3e 70 5b 69 4f 66 66 5d 2c 20 6e 4b 65 65  f->p[iOff], nKee
ef80: 70 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  p);.      }.    
ef90: 20 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66    pIter->iLeafOf
efa0: 66 73 65 74 20 3d 20 69 4f 66 66 3b 0a 20 20 20  fset = iOff;.   
efb0: 20 20 20 66 74 73 35 53 65 67 49 74 65 72 4c 6f     fts5SegIterLo
efc0: 61 64 54 65 72 6d 28 70 2c 20 70 49 74 65 72 2c  adTerm(p, pIter,
efd0: 20 6e 4b 65 65 70 29 3b 0a 20 20 20 20 7d 65 6c   nKeep);.    }el
efe0: 73 65 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20  se{.      const 
eff0: 75 38 20 2a 70 4c 69 73 74 20 3d 20 30 3b 0a 20  u8 *pList = 0;. 
f000: 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
f010: 2a 7a 54 65 72 6d 20 3d 20 30 3b 0a 20 20 20 20  *zTerm = 0;.    
f020: 20 20 69 6e 74 20 6e 4c 69 73 74 3b 0a 20 20 20    int nList;.   
f030: 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 48 61     sqlite3Fts5Ha
f040: 73 68 53 63 61 6e 4e 65 78 74 28 70 2d 3e 70 48  shScanNext(p->pH
f050: 61 73 68 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ash);.      sqli
f060: 74 65 33 46 74 73 35 48 61 73 68 53 63 61 6e 45  te3Fts5HashScanE
f070: 6e 74 72 79 28 70 2d 3e 70 48 61 73 68 2c 20 26  ntry(p->pHash, &
f080: 7a 54 65 72 6d 2c 20 26 70 4c 69 73 74 2c 20 26  zTerm, &pList, &
f090: 6e 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 69 66  nList);.      if
f0a0: 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 67 6f 74  ( pList==0 ) got
f0b0: 6f 20 6e 65 78 74 5f 6e 6f 6e 65 5f 65 6f 66 3b  o next_none_eof;
f0c0: 0a 20 20 20 20 20 20 70 49 74 65 72 2d 3e 70 4c  .      pIter->pL
f0d0: 65 61 66 2d 3e 70 20 3d 20 28 75 38 2a 29 70 4c  eaf->p = (u8*)pL
f0e0: 69 73 74 3b 0a 20 20 20 20 20 20 70 49 74 65 72  ist;.      pIter
f0f0: 2d 3e 70 4c 65 61 66 2d 3e 6e 6e 20 3d 20 6e 4c  ->pLeaf->nn = nL
f100: 69 73 74 3b 0a 20 20 20 20 20 20 70 49 74 65 72  ist;.      pIter
f110: 2d 3e 70 4c 65 61 66 2d 3e 73 7a 4c 65 61 66 20  ->pLeaf->szLeaf 
f120: 3d 20 6e 4c 69 73 74 3b 0a 20 20 20 20 20 20 70  = nList;.      p
f130: 49 74 65 72 2d 3e 69 45 6e 64 6f 66 44 6f 63 6c  Iter->iEndofDocl
f140: 69 73 74 20 3d 20 6e 4c 69 73 74 3b 0a 20 20 20  ist = nList;.   
f150: 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 42 75     sqlite3Fts5Bu
f160: 66 66 65 72 53 65 74 28 26 70 2d 3e 72 63 2c 26  fferSet(&p->rc,&
f170: 70 49 74 65 72 2d 3e 74 65 72 6d 2c 20 28 69 6e  pIter->term, (in
f180: 74 29 73 74 72 6c 65 6e 28 7a 54 65 72 6d 29 2c  t)strlen(zTerm),
f190: 20 28 75 38 2a 29 7a 54 65 72 6d 29 3b 0a 20 20   (u8*)zTerm);.  
f1a0: 20 20 20 20 70 49 74 65 72 2d 3e 69 4c 65 61 66      pIter->iLeaf
f1b0: 4f 66 66 73 65 74 20 3d 20 66 74 73 35 47 65 74  Offset = fts5Get
f1c0: 56 61 72 69 6e 74 28 70 4c 69 73 74 2c 20 28 75  Varint(pList, (u
f1d0: 36 34 2a 29 26 70 49 74 65 72 2d 3e 69 52 6f 77  64*)&pIter->iRow
f1e0: 69 64 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  id);.    }..    
f1f0: 69 66 28 20 70 62 4e 65 77 54 65 72 6d 20 29 20  if( pbNewTerm ) 
f200: 2a 70 62 4e 65 77 54 65 72 6d 20 3d 20 31 3b 0a  *pbNewTerm = 1;.
f210: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 67 6f 74    }else{.    got
f220: 6f 20 6e 65 78 74 5f 6e 6f 6e 65 5f 65 6f 66 3b  o next_none_eof;
f230: 0a 20 20 7d 0a 0a 20 20 66 74 73 35 53 65 67 49  .  }..  fts5SegI
f240: 74 65 72 4c 6f 61 64 4e 50 6f 73 28 70 2c 20 70  terLoadNPos(p, p
f250: 49 74 65 72 29 3b 0a 0a 20 20 72 65 74 75 72 6e  Iter);..  return
f260: 3b 0a 20 6e 65 78 74 5f 6e 6f 6e 65 5f 65 6f 66  ;. next_none_eof
f270: 3a 0a 20 20 66 74 73 35 44 61 74 61 52 65 6c 65  :.  fts5DataRele
f280: 61 73 65 28 70 49 74 65 72 2d 3e 70 4c 65 61 66  ase(pIter->pLeaf
f290: 29 3b 0a 20 20 70 49 74 65 72 2d 3e 70 4c 65 61  );.  pIter->pLea
f2a0: 66 20 3d 20 30 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  f = 0;.}.../*.**
f2b0: 20 41 64 76 61 6e 63 65 20 69 74 65 72 61 74 6f   Advance iterato
f2c0: 72 20 70 49 74 65 72 20 74 6f 20 74 68 65 20 6e  r pIter to the n
f2d0: 65 78 74 20 65 6e 74 72 79 2e 20 0a 2a 2a 0a 2a  ext entry. .**.*
f2e0: 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  * If an error oc
f2f0: 63 75 72 73 2c 20 46 74 73 35 49 6e 64 65 78 2e  curs, Fts5Index.
f300: 72 63 20 69 73 20 73 65 74 20 74 6f 20 61 6e 20  rc is set to an 
f310: 61 70 70 72 6f 70 72 69 61 74 65 20 65 72 72 6f  appropriate erro
f320: 72 20 63 6f 64 65 2e 20 49 74 20 0a 2a 2a 20 69  r code. It .** i
f330: 73 20 6e 6f 74 20 63 6f 6e 73 69 64 65 72 65 64  s not considered
f340: 20 61 6e 20 65 72 72 6f 72 20 69 66 20 74 68 65   an error if the
f350: 20 69 74 65 72 61 74 6f 72 20 72 65 61 63 68 65   iterator reache
f360: 73 20 45 4f 46 2e 20 49 66 20 61 6e 20 65 72 72  s EOF. If an err
f370: 6f 72 20 68 61 73 20 0a 2a 2a 20 61 6c 72 65 61  or has .** alrea
f380: 64 79 20 6f 63 63 75 72 72 65 64 20 77 68 65 6e  dy occurred when
f390: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
f3a0: 73 20 63 61 6c 6c 65 64 2c 20 69 74 20 69 73 20  s called, it is 
f3b0: 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74  a no-op..*/.stat
f3c0: 69 63 20 76 6f 69 64 20 66 74 73 35 53 65 67 49  ic void fts5SegI
f3d0: 74 65 72 4e 65 78 74 28 0a 20 20 46 74 73 35 49  terNext(.  Fts5I
f3e0: 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20  ndex *p,        
f3f0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54             /* FT
f400: 53 35 20 62 61 63 6b 65 6e 64 20 6f 62 6a 65 63  S5 backend objec
f410: 74 20 2a 2f 0a 20 20 46 74 73 35 53 65 67 49 74  t */.  Fts5SegIt
f420: 65 72 20 2a 70 49 74 65 72 2c 20 20 20 20 20 20  er *pIter,      
f430: 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74         /* Iterat
f440: 6f 72 20 74 6f 20 61 64 76 61 6e 63 65 20 2a 2f  or to advance */
f450: 0a 20 20 69 6e 74 20 2a 70 62 4e 65 77 54 65 72  .  int *pbNewTer
f460: 6d 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m               
f470: 20 20 20 2f 2a 20 4f 55 54 3a 20 53 65 74 20 66     /* OUT: Set f
f480: 6f 72 20 6e 65 77 20 74 65 72 6d 20 2a 2f 0a 29  or new term */.)
f490: 7b 0a 20 20 46 74 73 35 44 61 74 61 20 2a 70 4c  {.  Fts5Data *pL
f4a0: 65 61 66 20 3d 20 70 49 74 65 72 2d 3e 70 4c 65  eaf = pIter->pLe
f4b0: 61 66 3b 0a 20 20 69 6e 74 20 69 4f 66 66 3b 0a  af;.  int iOff;.
f4c0: 20 20 69 6e 74 20 62 4e 65 77 54 65 72 6d 20 3d    int bNewTerm =
f4d0: 20 30 3b 0a 20 20 69 6e 74 20 6e 4b 65 65 70 20   0;.  int nKeep 
f4e0: 3d 20 30 3b 0a 20 20 75 38 20 2a 61 3b 0a 20 20  = 0;.  u8 *a;.  
f4f0: 69 6e 74 20 6e 3b 0a 0a 20 20 61 73 73 65 72 74  int n;..  assert
f500: 28 20 70 62 4e 65 77 54 65 72 6d 3d 3d 30 20 7c  ( pbNewTerm==0 |
f510: 7c 20 2a 70 62 4e 65 77 54 65 72 6d 3d 3d 30 20  | *pbNewTerm==0 
f520: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  );.  assert( p->
f530: 70 43 6f 6e 66 69 67 2d 3e 65 44 65 74 61 69 6c  pConfig->eDetail
f540: 21 3d 46 54 53 35 5f 44 45 54 41 49 4c 5f 4e 4f  !=FTS5_DETAIL_NO
f550: 4e 45 20 29 3b 0a 0a 20 20 2f 2a 20 53 65 61 72  NE );..  /* Sear
f560: 63 68 20 66 6f 72 20 74 68 65 20 65 6e 64 20 6f  ch for the end o
f570: 66 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 20 6c  f the position l
f580: 69 73 74 20 77 69 74 68 69 6e 20 74 68 65 20 63  ist within the c
f590: 75 72 72 65 6e 74 20 70 61 67 65 2e 20 2a 2f 0a  urrent page. */.
f5a0: 20 20 61 20 3d 20 70 4c 65 61 66 2d 3e 70 3b 0a    a = pLeaf->p;.
f5b0: 20 20 6e 20 3d 20 70 4c 65 61 66 2d 3e 73 7a 4c    n = pLeaf->szL
f5c0: 65 61 66 3b 0a 0a 20 20 41 53 53 45 52 54 5f 53  eaf;..  ASSERT_S
f5d0: 5a 4c 45 41 46 5f 4f 4b 28 70 4c 65 61 66 29 3b  ZLEAF_OK(pLeaf);
f5e0: 0a 20 20 69 4f 66 66 20 3d 20 70 49 74 65 72 2d  .  iOff = pIter-
f5f0: 3e 69 4c 65 61 66 4f 66 66 73 65 74 20 2b 20 70  >iLeafOffset + p
f600: 49 74 65 72 2d 3e 6e 50 6f 73 3b 0a 0a 20 20 69  Iter->nPos;..  i
f610: 66 28 20 69 4f 66 66 3c 6e 20 29 7b 0a 20 20 20  f( iOff<n ){.   
f620: 20 2f 2a 20 54 68 65 20 6e 65 78 74 20 65 6e 74   /* The next ent
f630: 72 79 20 69 73 20 6f 6e 20 74 68 65 20 63 75 72  ry is on the cur
f640: 72 65 6e 74 20 70 61 67 65 2e 20 2a 2f 0a 20 20  rent page. */.  
f650: 20 20 61 73 73 65 72 74 5f 6e 63 28 20 69 4f 66    assert_nc( iOf
f660: 66 3c 3d 70 49 74 65 72 2d 3e 69 45 6e 64 6f 66  f<=pIter->iEndof
f670: 44 6f 63 6c 69 73 74 20 29 3b 0a 20 20 20 20 69  Doclist );.    i
f680: 66 28 20 69 4f 66 66 3e 3d 70 49 74 65 72 2d 3e  f( iOff>=pIter->
f690: 69 45 6e 64 6f 66 44 6f 63 6c 69 73 74 20 29 7b  iEndofDoclist ){
f6a0: 0a 20 20 20 20 20 20 62 4e 65 77 54 65 72 6d 20  .      bNewTerm 
f6b0: 3d 20 31 3b 0a 20 20 20 20 20 20 69 66 28 20 69  = 1;.      if( i
f6c0: 4f 66 66 21 3d 66 74 73 35 4c 65 61 66 46 69 72  Off!=fts5LeafFir
f6d0: 73 74 54 65 72 6d 4f 66 66 28 70 4c 65 61 66 29  stTermOff(pLeaf)
f6e0: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 4f 66 66   ){.        iOff
f6f0: 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e   += fts5GetVarin
f700: 74 33 32 28 26 61 5b 69 4f 66 66 5d 2c 20 6e 4b  t32(&a[iOff], nK
f710: 65 65 70 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  eep);.      }.  
f720: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 75    }else{.      u
f730: 36 34 20 69 44 65 6c 74 61 3b 0a 20 20 20 20 20  64 iDelta;.     
f740: 20 69 4f 66 66 20 2b 3d 20 73 71 6c 69 74 65 33   iOff += sqlite3
f750: 46 74 73 35 47 65 74 56 61 72 69 6e 74 28 26 61  Fts5GetVarint(&a
f760: 5b 69 4f 66 66 5d 2c 20 26 69 44 65 6c 74 61 29  [iOff], &iDelta)
f770: 3b 0a 20 20 20 20 20 20 70 49 74 65 72 2d 3e 69  ;.      pIter->i
f780: 52 6f 77 69 64 20 2b 3d 20 69 44 65 6c 74 61 3b  Rowid += iDelta;
f790: 0a 20 20 20 20 20 20 61 73 73 65 72 74 5f 6e 63  .      assert_nc
f7a0: 28 20 69 44 65 6c 74 61 3e 30 20 29 3b 0a 20 20  ( iDelta>0 );.  
f7b0: 20 20 7d 0a 20 20 20 20 70 49 74 65 72 2d 3e 69    }.    pIter->i
f7c0: 4c 65 61 66 4f 66 66 73 65 74 20 3d 20 69 4f 66  LeafOffset = iOf
f7d0: 66 3b 0a 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  f;..  }else if( 
f7e0: 70 49 74 65 72 2d 3e 70 53 65 67 3d 3d 30 20 29  pIter->pSeg==0 )
f7f0: 7b 0a 20 20 20 20 63 6f 6e 73 74 20 75 38 20 2a  {.    const u8 *
f800: 70 4c 69 73 74 20 3d 20 30 3b 0a 20 20 20 20 63  pList = 0;.    c
f810: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 65 72 6d  onst char *zTerm
f820: 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 6e 4c   = 0;.    int nL
f830: 69 73 74 20 3d 20 30 3b 0a 20 20 20 20 61 73 73  ist = 0;.    ass
f840: 65 72 74 28 20 28 70 49 74 65 72 2d 3e 66 6c 61  ert( (pIter->fla
f850: 67 73 20 26 20 46 54 53 35 5f 53 45 47 49 54 45  gs & FTS5_SEGITE
f860: 52 5f 4f 4e 45 54 45 52 4d 29 20 7c 7c 20 70 62  R_ONETERM) || pb
f870: 4e 65 77 54 65 72 6d 20 29 3b 0a 20 20 20 20 69  NewTerm );.    i
f880: 66 28 20 30 3d 3d 28 70 49 74 65 72 2d 3e 66 6c  f( 0==(pIter->fl
f890: 61 67 73 20 26 20 46 54 53 35 5f 53 45 47 49 54  ags & FTS5_SEGIT
f8a0: 45 52 5f 4f 4e 45 54 45 52 4d 29 20 29 7b 0a 20  ER_ONETERM) ){. 
f8b0: 20 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35       sqlite3Fts5
f8c0: 48 61 73 68 53 63 61 6e 4e 65 78 74 28 70 2d 3e  HashScanNext(p->
f8d0: 70 48 61 73 68 29 3b 0a 20 20 20 20 20 20 73 71  pHash);.      sq
f8e0: 6c 69 74 65 33 46 74 73 35 48 61 73 68 53 63 61  lite3Fts5HashSca
f8f0: 6e 45 6e 74 72 79 28 70 2d 3e 70 48 61 73 68 2c  nEntry(p->pHash,
f900: 20 26 7a 54 65 72 6d 2c 20 26 70 4c 69 73 74 2c   &zTerm, &pList,
f910: 20 26 6e 4c 69 73 74 29 3b 0a 20 20 20 20 7d 0a   &nList);.    }.
f920: 20 20 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30      if( pList==0
f930: 20 29 7b 0a 20 20 20 20 20 20 66 74 73 35 44 61   ){.      fts5Da
f940: 74 61 52 65 6c 65 61 73 65 28 70 49 74 65 72 2d  taRelease(pIter-
f950: 3e 70 4c 65 61 66 29 3b 0a 20 20 20 20 20 20 70  >pLeaf);.      p
f960: 49 74 65 72 2d 3e 70 4c 65 61 66 20 3d 20 30 3b  Iter->pLeaf = 0;
f970: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
f980: 20 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e    pIter->pLeaf->
f990: 70 20 3d 20 28 75 38 2a 29 70 4c 69 73 74 3b 0a  p = (u8*)pList;.
f9a0: 20 20 20 20 20 20 70 49 74 65 72 2d 3e 70 4c 65        pIter->pLe
f9b0: 61 66 2d 3e 6e 6e 20 3d 20 6e 4c 69 73 74 3b 0a  af->nn = nList;.
f9c0: 20 20 20 20 20 20 70 49 74 65 72 2d 3e 70 4c 65        pIter->pLe
f9d0: 61 66 2d 3e 73 7a 4c 65 61 66 20 3d 20 6e 4c 69  af->szLeaf = nLi
f9e0: 73 74 3b 0a 20 20 20 20 20 20 70 49 74 65 72 2d  st;.      pIter-
f9f0: 3e 69 45 6e 64 6f 66 44 6f 63 6c 69 73 74 20 3d  >iEndofDoclist =
fa00: 20 6e 4c 69 73 74 2b 31 3b 0a 20 20 20 20 20 20   nList+1;.      
fa10: 73 71 6c 69 74 65 33 46 74 73 35 42 75 66 66 65  sqlite3Fts5Buffe
fa20: 72 53 65 74 28 26 70 2d 3e 72 63 2c 20 26 70 49  rSet(&p->rc, &pI
fa30: 74 65 72 2d 3e 74 65 72 6d 2c 20 28 69 6e 74 29  ter->term, (int)
fa40: 73 74 72 6c 65 6e 28 7a 54 65 72 6d 29 2c 0a 20  strlen(zTerm),. 
fa50: 20 20 20 20 20 20 20 20 20 28 75 38 2a 29 7a 54           (u8*)zT
fa60: 65 72 6d 29 3b 0a 20 20 20 20 20 20 70 49 74 65  erm);.      pIte
fa70: 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 20 3d  r->iLeafOffset =
fa80: 20 66 74 73 35 47 65 74 56 61 72 69 6e 74 28 70   fts5GetVarint(p
fa90: 4c 69 73 74 2c 20 28 75 36 34 2a 29 26 70 49 74  List, (u64*)&pIt
faa0: 65 72 2d 3e 69 52 6f 77 69 64 29 3b 0a 20 20 20  er->iRowid);.   
fab0: 20 20 20 2a 70 62 4e 65 77 54 65 72 6d 20 3d 20     *pbNewTerm = 
fac0: 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  1;.    }.  }else
fad0: 7b 0a 20 20 20 20 69 4f 66 66 20 3d 20 30 3b 0a  {.    iOff = 0;.
fae0: 20 20 20 20 2f 2a 20 4e 65 78 74 20 65 6e 74 72      /* Next entr
faf0: 79 20 69 73 20 6e 6f 74 20 6f 6e 20 74 68 65 20  y is not on the 
fb00: 63 75 72 72 65 6e 74 20 70 61 67 65 20 2a 2f 0a  current page */.
fb10: 20 20 20 20 77 68 69 6c 65 28 20 69 4f 66 66 3d      while( iOff=
fb20: 3d 30 20 29 7b 0a 20 20 20 20 20 20 66 74 73 35  =0 ){.      fts5
fb30: 53 65 67 49 74 65 72 4e 65 78 74 50 61 67 65 28  SegIterNextPage(
fb40: 70 2c 20 70 49 74 65 72 29 3b 0a 20 20 20 20 20  p, pIter);.     
fb50: 20 70 4c 65 61 66 20 3d 20 70 49 74 65 72 2d 3e   pLeaf = pIter->
fb60: 70 4c 65 61 66 3b 0a 20 20 20 20 20 20 69 66 28  pLeaf;.      if(
fb70: 20 70 4c 65 61 66 3d 3d 30 20 29 20 62 72 65 61   pLeaf==0 ) brea
fb80: 6b 3b 0a 20 20 20 20 20 20 41 53 53 45 52 54 5f  k;.      ASSERT_
fb90: 53 5a 4c 45 41 46 5f 4f 4b 28 70 4c 65 61 66 29  SZLEAF_OK(pLeaf)
fba0: 3b 0a 20 20 20 20 20 20 69 66 28 20 28 69 4f 66  ;.      if( (iOf
fbb0: 66 20 3d 20 66 74 73 35 4c 65 61 66 46 69 72 73  f = fts5LeafFirs
fbc0: 74 52 6f 77 69 64 4f 66 66 28 70 4c 65 61 66 29  tRowidOff(pLeaf)
fbd0: 29 20 26 26 20 69 4f 66 66 3c 70 4c 65 61 66 2d  ) && iOff<pLeaf-
fbe0: 3e 73 7a 4c 65 61 66 20 29 7b 0a 20 20 20 20 20  >szLeaf ){.     
fbf0: 20 20 20 69 4f 66 66 20 2b 3d 20 73 71 6c 69 74     iOff += sqlit
fc00: 65 33 46 74 73 35 47 65 74 56 61 72 69 6e 74 28  e3Fts5GetVarint(
fc10: 26 70 4c 65 61 66 2d 3e 70 5b 69 4f 66 66 5d 2c  &pLeaf->p[iOff],
fc20: 20 28 75 36 34 2a 29 26 70 49 74 65 72 2d 3e 69   (u64*)&pIter->i
fc30: 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 20 20  Rowid);.        
fc40: 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73  pIter->iLeafOffs
fc50: 65 74 20 3d 20 69 4f 66 66 3b 0a 0a 20 20 20 20  et = iOff;..    
fc60: 20 20 20 20 69 66 28 20 70 4c 65 61 66 2d 3e 6e      if( pLeaf->n
fc70: 6e 3e 70 4c 65 61 66 2d 3e 73 7a 4c 65 61 66 20  n>pLeaf->szLeaf 
fc80: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 49 74  ){.          pIt
fc90: 65 72 2d 3e 69 50 67 69 64 78 4f 66 66 20 3d 20  er->iPgidxOff = 
fca0: 70 4c 65 61 66 2d 3e 73 7a 4c 65 61 66 20 2b 20  pLeaf->szLeaf + 
fcb0: 66 74 73 35 47 65 74 56 61 72 69 6e 74 33 32 28  fts5GetVarint32(
fcc0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26  .              &
fcd0: 70 4c 65 61 66 2d 3e 70 5b 70 4c 65 61 66 2d 3e  pLeaf->p[pLeaf->
fce0: 73 7a 4c 65 61 66 5d 2c 20 70 49 74 65 72 2d 3e  szLeaf], pIter->
fcf0: 69 45 6e 64 6f 66 44 6f 63 6c 69 73 74 0a 20 20  iEndofDoclist.  
fd00: 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20          );.     
fd10: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
fd20: 20 20 20 65 6c 73 65 20 69 66 28 20 70 4c 65 61     else if( pLea
fd30: 66 2d 3e 6e 6e 3e 70 4c 65 61 66 2d 3e 73 7a 4c  f->nn>pLeaf->szL
fd40: 65 61 66 20 29 7b 0a 20 20 20 20 20 20 20 20 70  eaf ){.        p
fd50: 49 74 65 72 2d 3e 69 50 67 69 64 78 4f 66 66 20  Iter->iPgidxOff 
fd60: 3d 20 70 4c 65 61 66 2d 3e 73 7a 4c 65 61 66 20  = pLeaf->szLeaf 
fd70: 2b 20 66 74 73 35 47 65 74 56 61 72 69 6e 74 33  + fts5GetVarint3
fd80: 32 28 0a 20 20 20 20 20 20 20 20 20 20 20 20 26  2(.            &
fd90: 70 4c 65 61 66 2d 3e 70 5b 70 4c 65 61 66 2d 3e  pLeaf->p[pLeaf->
fda0: 73 7a 4c 65 61 66 5d 2c 20 69 4f 66 66 0a 20 20  szLeaf], iOff.  
fdb0: 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20        );.       
fdc0: 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66   pIter->iLeafOff
fdd0: 73 65 74 20 3d 20 69 4f 66 66 3b 0a 20 20 20 20  set = iOff;.    
fde0: 20 20 20 20 70 49 74 65 72 2d 3e 69 45 6e 64 6f      pIter->iEndo
fdf0: 66 44 6f 63 6c 69 73 74 20 3d 20 69 4f 66 66 3b  fDoclist = iOff;
fe00: 0a 20 20 20 20 20 20 20 20 62 4e 65 77 54 65 72  .        bNewTer
fe10: 6d 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20  m = 1;.      }. 
fe20: 20 20 20 20 20 61 73 73 65 72 74 5f 6e 63 28 20       assert_nc( 
fe30: 69 4f 66 66 3c 70 4c 65 61 66 2d 3e 73 7a 4c 65  iOff<pLeaf->szLe
fe40: 61 66 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  af );.      if( 
fe50: 69 4f 66 66 3e 70 4c 65 61 66 2d 3e 73 7a 4c 65  iOff>pLeaf->szLe
fe60: 61 66 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d  af ){.        p-
fe70: 3e 72 63 20 3d 20 46 54 53 35 5f 43 4f 52 52 55  >rc = FTS5_CORRU
fe80: 50 54 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  PT;.        retu
fe90: 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rn;.      }.    
fea0: 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 65 63  }.  }..  /* Chec
feb0: 6b 20 69 66 20 74 68 65 20 69 74 65 72 61 74 6f  k if the iterato
fec0: 72 20 69 73 20 6e 6f 77 20 61 74 20 45 4f 46 2e  r is now at EOF.
fed0: 20 49 66 20 73 6f 2c 20 72 65 74 75 72 6e 20 65   If so, return e
fee0: 61 72 6c 79 2e 20 2a 2f 0a 20 20 69 66 28 20 70  arly. */.  if( p
fef0: 49 74 65 72 2d 3e 70 4c 65 61 66 20 29 7b 0a 20  Iter->pLeaf ){. 
ff00: 20 20 20 69 66 28 20 62 4e 65 77 54 65 72 6d 20     if( bNewTerm 
ff10: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 49 74  ){.      if( pIt
ff20: 65 72 2d 3e 66 6c 61 67 73 20 26 20 46 54 53 35  er->flags & FTS5
ff30: 5f 53 45 47 49 54 45 52 5f 4f 4e 45 54 45 52 4d  _SEGITER_ONETERM
ff40: 20 29 7b 0a 20 20 20 20 20 20 20 20 66 74 73 35   ){.        fts5
ff50: 44 61 74 61 52 65 6c 65 61 73 65 28 70 49 74 65  DataRelease(pIte
ff60: 72 2d 3e 70 4c 65 61 66 29 3b 0a 20 20 20 20 20  r->pLeaf);.     
ff70: 20 20 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 20     pIter->pLeaf 
ff80: 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  = 0;.      }else
ff90: 7b 0a 20 20 20 20 20 20 20 20 66 74 73 35 53 65  {.        fts5Se
ffa0: 67 49 74 65 72 4c 6f 61 64 54 65 72 6d 28 70 2c  gIterLoadTerm(p,
ffb0: 20 70 49 74 65 72 2c 20 6e 4b 65 65 70 29 3b 0a   pIter, nKeep);.
ffc0: 20 20 20 20 20 20 20 20 66 74 73 35 53 65 67 49          fts5SegI
ffd0: 74 65 72 4c 6f 61 64 4e 50 6f 73 28 70 2c 20 70  terLoadNPos(p, p
ffe0: 49 74 65 72 29 3b 0a 20 20 20 20 20 20 20 20 69  Iter);.        i
fff0: 66 28 20 70 62 4e 65 77 54 65 72 6d 20 29 20 2a  f( pbNewTerm ) *
10000 70 62 4e 65 77 54 65 72 6d 20 3d 20 31 3b 0a 20  pbNewTerm = 1;. 
10010 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
10020 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 66  {.      /* The f
10030 6f 6c 6c 6f 77 69 6e 67 20 63 6f 75 6c 64 20 62  ollowing could b
10040 65 20 64 6f 6e 65 20 62 79 20 63 61 6c 6c 69 6e  e done by callin
10050 67 20 66 74 73 35 53 65 67 49 74 65 72 4c 6f 61  g fts5SegIterLoa
10060 64 4e 50 6f 73 28 29 2e 20 42 75 74 0a 20 20 20  dNPos(). But.   
10070 20 20 20 2a 2a 20 74 68 69 73 20 62 6c 6f 63 6b     ** this block
10080 20 69 73 20 70 61 72 74 69 63 75 6c 61 72 6c 79   is particularly
10090 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 63 72 69   performance cri
100a0 74 69 63 61 6c 2c 20 73 6f 20 65 71 75 69 76 61  tical, so equiva
100b0 6c 65 6e 74 0a 20 20 20 20 20 20 2a 2a 20 63 6f  lent.      ** co
100c0 64 65 20 69 73 20 69 6e 6c 69 6e 65 64 2e 20 0a  de is inlined. .
100d0 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
100e0 2a 20 4c 61 74 65 72 3a 20 53 77 69 74 63 68 65  * Later: Switche
100f0 64 20 62 61 63 6b 20 74 6f 20 66 74 73 35 53 65  d back to fts5Se
10100 67 49 74 65 72 4c 6f 61 64 4e 50 6f 73 28 29 20  gIterLoadNPos() 
10110 62 65 63 61 75 73 65 20 69 74 20 73 75 70 70 6f  because it suppo
10120 72 74 73 0a 20 20 20 20 20 20 2a 2a 20 64 65 74  rts.      ** det
10130 61 69 6c 3d 6e 6f 6e 65 20 6d 6f 64 65 2e 20 4e  ail=none mode. N
10140 6f 74 20 69 64 65 61 6c 2e 0a 20 20 20 20 20 20  ot ideal..      
10150 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e 53 7a  */.      int nSz
10160 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
10170 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
10180 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
10190 28 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66  ( pIter->iLeafOf
101a0 66 73 65 74 3c 3d 70 49 74 65 72 2d 3e 70 4c 65  fset<=pIter->pLe
101b0 61 66 2d 3e 6e 6e 20 29 3b 0a 20 20 20 20 20 20  af->nn );.      
101c0 66 74 73 35 46 61 73 74 47 65 74 56 61 72 69 6e  fts5FastGetVarin
101d0 74 33 32 28 70 49 74 65 72 2d 3e 70 4c 65 61 66  t32(pIter->pLeaf
101e0 2d 3e 70 2c 20 70 49 74 65 72 2d 3e 69 4c 65 61  ->p, pIter->iLea
101f0 66 4f 66 66 73 65 74 2c 20 6e 53 7a 29 3b 0a 20  fOffset, nSz);. 
10200 20 20 20 20 20 70 49 74 65 72 2d 3e 62 44 65 6c       pIter->bDel
10210 20 3d 20 28 6e 53 7a 20 26 20 30 78 30 30 30 31   = (nSz & 0x0001
10220 29 3b 0a 20 20 20 20 20 20 70 49 74 65 72 2d 3e  );.      pIter->
10230 6e 50 6f 73 20 3d 20 6e 53 7a 3e 3e 31 3b 0a 20  nPos = nSz>>1;. 
10240 20 20 20 20 20 61 73 73 65 72 74 5f 6e 63 28 20       assert_nc( 
10250 70 49 74 65 72 2d 3e 6e 50 6f 73 3e 3d 30 20 29  pIter->nPos>=0 )
10260 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 23  ;.    }.  }.}..#
10270 64 65 66 69 6e 65 20 53 57 41 50 56 41 4c 28 54  define SWAPVAL(T
10280 2c 20 61 2c 20 62 29 20 7b 20 54 20 74 6d 70 3b  , a, b) { T tmp;
10290 20 74 6d 70 3d 61 3b 20 61 3d 62 3b 20 62 3d 74   tmp=a; a=b; b=t
102a0 6d 70 3b 20 7d 0a 0a 23 64 65 66 69 6e 65 20 66  mp; }..#define f
102b0 74 73 35 49 6e 64 65 78 53 6b 69 70 56 61 72 69  ts5IndexSkipVari
102c0 6e 74 28 61 2c 20 69 4f 66 66 29 20 7b 20 20 20  nt(a, iOff) {   
102d0 20 20 20 20 20 20 20 20 20 5c 0a 20 20 69 6e 74           \.  int
102e0 20 69 45 6e 64 20 3d 20 69 4f 66 66 2b 39 3b 20   iEnd = iOff+9; 
102f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10300 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
10310 20 77 68 69 6c 65 28 20 28 61 5b 69 4f 66 66 2b   while( (a[iOff+
10320 2b 5d 20 26 20 30 78 38 30 29 20 26 26 20 69 4f  +] & 0x80) && iO
10330 66 66 3c 69 45 6e 64 20 29 3b 20 20 20 20 20 20  ff<iEnd );      
10340 20 5c 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 74 65 72   \.}../*.** Iter
10350 61 74 6f 72 20 70 49 74 65 72 20 63 75 72 72 65  ator pIter curre
10360 6e 74 6c 79 20 70 6f 69 6e 74 73 20 74 6f 20 74  ntly points to t
10370 68 65 20 66 69 72 73 74 20 72 6f 77 69 64 20 69  he first rowid i
10380 6e 20 61 20 64 6f 63 6c 69 73 74 2e 20 54 68 69  n a doclist. Thi
10390 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 73 65  s.** function se
103a0 74 73 20 74 68 65 20 69 74 65 72 61 74 6f 72 20  ts the iterator 
103b0 75 70 20 73 6f 20 74 68 61 74 20 69 74 65 72 61  up so that itera
103c0 74 65 73 20 69 6e 20 72 65 76 65 72 73 65 20 6f  tes in reverse o
103d0 72 64 65 72 20 74 68 72 6f 75 67 68 0a 2a 2a 20  rder through.** 
103e0 74 68 65 20 64 6f 63 6c 69 73 74 2e 0a 2a 2f 0a  the doclist..*/.
103f0 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
10400 53 65 67 49 74 65 72 52 65 76 65 72 73 65 28 46  SegIterReverse(F
10410 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 46 74 73  ts5Index *p, Fts
10420 35 53 65 67 49 74 65 72 20 2a 70 49 74 65 72 29  5SegIter *pIter)
10430 7b 0a 20 20 46 74 73 35 44 6c 69 64 78 49 74 65  {.  Fts5DlidxIte
10440 72 20 2a 70 44 6c 69 64 78 20 3d 20 70 49 74 65  r *pDlidx = pIte
10450 72 2d 3e 70 44 6c 69 64 78 3b 0a 20 20 46 74 73  r->pDlidx;.  Fts
10460 35 44 61 74 61 20 2a 70 4c 61 73 74 20 3d 20 30  5Data *pLast = 0
10470 3b 0a 20 20 69 6e 74 20 70 67 6e 6f 4c 61 73 74  ;.  int pgnoLast
10480 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20 70 44 6c   = 0;..  if( pDl
10490 69 64 78 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  idx ){.    int i
104a0 53 65 67 69 64 20 3d 20 70 49 74 65 72 2d 3e 70  Segid = pIter->p
104b0 53 65 67 2d 3e 69 53 65 67 69 64 3b 0a 20 20 20  Seg->iSegid;.   
104c0 20 70 67 6e 6f 4c 61 73 74 20 3d 20 66 74 73 35   pgnoLast = fts5
104d0 44 6c 69 64 78 49 74 65 72 50 67 6e 6f 28 70 44  DlidxIterPgno(pD
104e0 6c 69 64 78 29 3b 0a 20 20 20 20 70 4c 61 73 74  lidx);.    pLast
104f0 20 3d 20 66 74 73 35 44 61 74 61 52 65 61 64 28   = fts5DataRead(
10500 70 2c 20 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f  p, FTS5_SEGMENT_
10510 52 4f 57 49 44 28 69 53 65 67 69 64 2c 20 70 67  ROWID(iSegid, pg
10520 6e 6f 4c 61 73 74 29 29 3b 0a 20 20 7d 65 6c 73  noLast));.  }els
10530 65 7b 0a 20 20 20 20 46 74 73 35 44 61 74 61 20  e{.    Fts5Data 
10540 2a 70 4c 65 61 66 20 3d 20 70 49 74 65 72 2d 3e  *pLeaf = pIter->
10550 70 4c 65 61 66 3b 20 20 20 20 20 20 20 20 20 2f  pLeaf;         /
10560 2a 20 43 75 72 72 65 6e 74 20 6c 65 61 66 20 64  * Current leaf d
10570 61 74 61 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 43  ata */..    /* C
10580 75 72 72 65 6e 74 6c 79 2c 20 46 74 73 35 53 65  urrently, Fts5Se
10590 67 49 74 65 72 2e 69 4c 65 61 66 4f 66 66 73 65  gIter.iLeafOffse
105a0 74 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20  t points to the 
105b0 66 69 72 73 74 20 62 79 74 65 20 6f 66 0a 20 20  first byte of.  
105c0 20 20 2a 2a 20 70 6f 73 69 74 69 6f 6e 2d 6c 69    ** position-li
105d0 73 74 20 63 6f 6e 74 65 6e 74 20 66 6f 72 20 74  st content for t
105e0 68 65 20 63 75 72 72 65 6e 74 20 72 6f 77 69 64  he current rowid
105f0 2e 20 42 61 63 6b 20 69 74 20 75 70 20 73 6f 20  . Back it up so 
10600 74 68 61 74 20 69 74 0a 20 20 20 20 2a 2a 20 70  that it.    ** p
10610 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 73 74 61  oints to the sta
10620 72 74 20 6f 66 20 74 68 65 20 70 6f 73 69 74 69  rt of the positi
10630 6f 6e 2d 6c 69 73 74 20 73 69 7a 65 20 66 69 65  on-list size fie
10640 6c 64 2e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69  ld. */.    int i
10650 50 6f 73 6c 69 73 74 3b 0a 20 20 20 20 69 66 28  Poslist;.    if(
10660 20 70 49 74 65 72 2d 3e 69 54 65 72 6d 4c 65 61   pIter->iTermLea
10670 66 50 67 6e 6f 3d 3d 70 49 74 65 72 2d 3e 69 4c  fPgno==pIter->iL
10680 65 61 66 50 67 6e 6f 20 29 7b 0a 20 20 20 20 20  eafPgno ){.     
10690 20 69 50 6f 73 6c 69 73 74 20 3d 20 70 49 74 65   iPoslist = pIte
106a0 72 2d 3e 69 54 65 72 6d 4c 65 61 66 4f 66 66 73  r->iTermLeafOffs
106b0 65 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  et;.    }else{. 
106c0 20 20 20 20 20 69 50 6f 73 6c 69 73 74 20 3d 20       iPoslist = 
106d0 34 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 74 73  4;.    }.    fts
106e0 35 49 6e 64 65 78 53 6b 69 70 56 61 72 69 6e 74  5IndexSkipVarint
106f0 28 70 4c 65 61 66 2d 3e 70 2c 20 69 50 6f 73 6c  (pLeaf->p, iPosl
10700 69 73 74 29 3b 0a 20 20 20 20 70 49 74 65 72 2d  ist);.    pIter-
10710 3e 69 4c 65 61 66 4f 66 66 73 65 74 20 3d 20 69  >iLeafOffset = i
10720 50 6f 73 6c 69 73 74 3b 0a 0a 20 20 20 20 2f 2a  Poslist;..    /*
10730 20 49 66 20 74 68 69 73 20 63 6f 6e 64 69 74 69   If this conditi
10740 6f 6e 20 69 73 20 74 72 75 65 20 74 68 65 6e 20  on is true then 
10750 74 68 65 20 6c 61 72 67 65 73 74 20 72 6f 77 69  the largest rowi
10760 64 20 66 6f 72 20 74 68 65 20 63 75 72 72 65 6e  d for the curren
10770 74 0a 20 20 20 20 2a 2a 20 74 65 72 6d 20 6d 61  t.    ** term ma
10780 79 20 6e 6f 74 20 62 65 20 73 74 6f 72 65 64 20  y not be stored 
10790 6f 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 70  on the current p
107a0 61 67 65 2e 20 53 6f 20 73 65 61 72 63 68 20 66  age. So search f
107b0 6f 72 77 61 72 64 20 74 6f 0a 20 20 20 20 2a 2a  orward to.    **
107c0 20 73 65 65 20 77 68 65 72 65 20 73 61 69 64 20   see where said 
107d0 72 6f 77 69 64 20 72 65 61 6c 6c 79 20 69 73 2e  rowid really is.
107e0 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 49 74    */.    if( pIt
107f0 65 72 2d 3e 69 45 6e 64 6f 66 44 6f 63 6c 69 73  er->iEndofDoclis
10800 74 3e 3d 70 4c 65 61 66 2d 3e 73 7a 4c 65 61 66  t>=pLeaf->szLeaf
10810 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 70 67   ){.      int pg
10820 6e 6f 3b 0a 20 20 20 20 20 20 46 74 73 35 53 74  no;.      Fts5St
10830 72 75 63 74 75 72 65 53 65 67 6d 65 6e 74 20 2a  ructureSegment *
10840 70 53 65 67 20 3d 20 70 49 74 65 72 2d 3e 70 53  pSeg = pIter->pS
10850 65 67 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 54 68  eg;..      /* Th
10860 65 20 6c 61 73 74 20 72 6f 77 69 64 20 69 6e 20  e last rowid in 
10870 74 68 65 20 64 6f 63 6c 69 73 74 20 6d 61 79 20  the doclist may 
10880 6e 6f 74 20 62 65 20 6f 6e 20 74 68 65 20 63 75  not be on the cu
10890 72 72 65 6e 74 20 70 61 67 65 2e 20 53 65 61 72  rrent page. Sear
108a0 63 68 0a 20 20 20 20 20 20 2a 2a 20 66 6f 72 77  ch.      ** forw
108b0 61 72 64 20 74 6f 20 66 69 6e 64 20 74 68 65 20  ard to find the 
108c0 70 61 67 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20  page containing 
108d0 74 68 65 20 6c 61 73 74 20 72 6f 77 69 64 2e 20  the last rowid. 
108e0 20 2a 2f 0a 20 20 20 20 20 20 66 6f 72 28 70 67   */.      for(pg
108f0 6e 6f 3d 70 49 74 65 72 2d 3e 69 4c 65 61 66 50  no=pIter->iLeafP
10900 67 6e 6f 2b 31 3b 20 21 70 2d 3e 72 63 20 26 26  gno+1; !p->rc &&
10910 20 70 67 6e 6f 3c 3d 70 53 65 67 2d 3e 70 67 6e   pgno<=pSeg->pgn
10920 6f 4c 61 73 74 3b 20 70 67 6e 6f 2b 2b 29 7b 0a  oLast; pgno++){.
10930 20 20 20 20 20 20 20 20 69 36 34 20 69 41 62 73          i64 iAbs
10940 20 3d 20 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f   = FTS5_SEGMENT_
10950 52 4f 57 49 44 28 70 53 65 67 2d 3e 69 53 65 67  ROWID(pSeg->iSeg
10960 69 64 2c 20 70 67 6e 6f 29 3b 0a 20 20 20 20 20  id, pgno);.     
10970 20 20 20 46 74 73 35 44 61 74 61 20 2a 70 4e 65     Fts5Data *pNe
10980 77 20 3d 20 66 74 73 35 44 61 74 61 52 65 61 64  w = fts5DataRead
10990 28 70 2c 20 69 41 62 73 29 3b 0a 20 20 20 20 20  (p, iAbs);.     
109a0 20 20 20 69 66 28 20 70 4e 65 77 20 29 7b 0a 20     if( pNew ){. 
109b0 20 20 20 20 20 20 20 20 20 69 6e 74 20 69 52 6f           int iRo
109c0 77 69 64 2c 20 62 54 65 72 6d 6c 65 73 73 3b 0a  wid, bTermless;.
109d0 20 20 20 20 20 20 20 20 20 20 69 52 6f 77 69 64            iRowid
109e0 20 3d 20 66 74 73 35 4c 65 61 66 46 69 72 73 74   = fts5LeafFirst
109f0 52 6f 77 69 64 4f 66 66 28 70 4e 65 77 29 3b 0a  RowidOff(pNew);.
10a00 20 20 20 20 20 20 20 20 20 20 62 54 65 72 6d 6c            bTerml
10a10 65 73 73 20 3d 20 66 74 73 35 4c 65 61 66 49 73  ess = fts5LeafIs
10a20 54 65 72 6d 6c 65 73 73 28 70 4e 65 77 29 3b 0a  Termless(pNew);.
10a30 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69 52            if( iR
10a40 6f 77 69 64 20 29 7b 0a 20 20 20 20 20 20 20 20  owid ){.        
10a50 20 20 20 20 53 57 41 50 56 41 4c 28 46 74 73 35      SWAPVAL(Fts5
10a60 44 61 74 61 2a 2c 20 70 4e 65 77 2c 20 70 4c 61  Data*, pNew, pLa
10a70 73 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  st);.           
10a80 20 70 67 6e 6f 4c 61 73 74 20 3d 20 70 67 6e 6f   pgnoLast = pgno
10a90 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
10aa0 20 20 20 20 20 20 20 20 66 74 73 35 44 61 74 61          fts5Data
10ab0 52 65 6c 65 61 73 65 28 70 4e 65 77 29 3b 0a 20  Release(pNew);. 
10ac0 20 20 20 20 20 20 20 20 20 69 66 28 20 62 54 65           if( bTe
10ad0 72 6d 6c 65 73 73 3d 3d 30 20 29 20 62 72 65 61  rmless==0 ) brea
10ae0 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  k;.        }.   
10af0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
10b00 20 20 2f 2a 20 49 66 20 70 4c 61 73 74 20 69 73    /* If pLast is
10b10 20 4e 55 4c 4c 20 61 74 20 74 68 69 73 20 70 6f   NULL at this po
10b20 69 6e 74 2c 20 74 68 65 6e 20 74 68 65 20 6c 61  int, then the la
10b30 73 74 20 72 6f 77 69 64 20 66 6f 72 20 74 68 69  st rowid for thi
10b40 73 20 64 6f 63 6c 69 73 74 0a 20 20 2a 2a 20 6c  s doclist.  ** l
10b50 69 65 73 20 6f 6e 20 74 68 65 20 70 61 67 65 20  ies on the page 
10b60 63 75 72 72 65 6e 74 6c 79 20 69 6e 64 69 63 61  currently indica
10b70 74 65 64 20 62 79 20 74 68 65 20 69 74 65 72 61  ted by the itera
10b80 74 6f 72 2e 20 49 6e 20 74 68 69 73 20 63 61 73  tor. In this cas
10b90 65 20 0a 20 20 2a 2a 20 70 49 74 65 72 2d 3e 69  e .  ** pIter->i
10ba0 4c 65 61 66 4f 66 66 73 65 74 20 69 73 20 61 6c  LeafOffset is al
10bb0 72 65 61 64 79 20 73 65 74 20 74 6f 20 70 6f 69  ready set to poi
10bc0 6e 74 20 74 6f 20 74 68 65 20 70 6f 73 69 74 69  nt to the positi
10bd0 6f 6e 2d 6c 69 73 74 20 73 69 7a 65 0a 20 20 2a  on-list size.  *
10be0 2a 20 66 69 65 6c 64 20 61 73 73 6f 63 69 61 74  * field associat
10bf0 65 64 20 77 69 74 68 20 74 68 65 20 66 69 72 73  ed with the firs
10c00 74 20 72 65 6c 65 76 61 6e 74 20 72 6f 77 69 64  t relevant rowid
10c10 20 6f 6e 20 74 68 65 20 70 61 67 65 2e 0a 20 20   on the page..  
10c20 2a 2a 0a 20 20 2a 2a 20 4f 72 2c 20 69 66 20 70  **.  ** Or, if p
10c30 4c 61 73 74 20 69 73 20 6e 6f 6e 2d 4e 55 4c 4c  Last is non-NULL
10c40 2c 20 74 68 65 6e 20 69 74 20 69 73 20 74 68 65  , then it is the
10c50 20 70 61 67 65 20 74 68 61 74 20 63 6f 6e 74 61   page that conta
10c60 69 6e 73 20 74 68 65 20 6c 61 73 74 0a 20 20 2a  ins the last.  *
10c70 2a 20 72 6f 77 69 64 2e 20 49 6e 20 74 68 69 73  * rowid. In this
10c80 20 63 61 73 65 20 63 6f 6e 66 69 67 75 72 65 20   case configure 
10c90 74 68 65 20 69 74 65 72 61 74 6f 72 20 73 6f 20  the iterator so 
10ca0 74 68 61 74 20 69 74 20 70 6f 69 6e 74 73 20 74  that it points t
10cb0 6f 20 74 68 65 0a 20 20 2a 2a 20 66 69 72 73 74  o the.  ** first
10cc0 20 72 6f 77 69 64 20 6f 6e 20 74 68 69 73 20 70   rowid on this p
10cd0 61 67 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  age..  */.  if( 
10ce0 70 4c 61 73 74 20 29 7b 0a 20 20 20 20 69 6e 74  pLast ){.    int
10cf0 20 69 4f 66 66 3b 0a 20 20 20 20 66 74 73 35 44   iOff;.    fts5D
10d00 61 74 61 52 65 6c 65 61 73 65 28 70 49 74 65 72  ataRelease(pIter
10d10 2d 3e 70 4c 65 61 66 29 3b 0a 20 20 20 20 70 49  ->pLeaf);.    pI
10d20 74 65 72 2d 3e 70 4c 65 61 66 20 3d 20 70 4c 61  ter->pLeaf = pLa
10d30 73 74 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 69  st;.    pIter->i
10d40 4c 65 61 66 50 67 6e 6f 20 3d 20 70 67 6e 6f 4c  LeafPgno = pgnoL
10d50 61 73 74 3b 0a 20 20 20 20 69 4f 66 66 20 3d 20  ast;.    iOff = 
10d60 66 74 73 35 4c 65 61 66 46 69 72 73 74 52 6f 77  fts5LeafFirstRow
10d70 69 64 4f 66 66 28 70 4c 61 73 74 29 3b 0a 20 20  idOff(pLast);.  
10d80 20 20 69 4f 66 66 20 2b 3d 20 66 74 73 35 47 65    iOff += fts5Ge
10d90 74 56 61 72 69 6e 74 28 26 70 4c 61 73 74 2d 3e  tVarint(&pLast->
10da0 70 5b 69 4f 66 66 5d 2c 20 28 75 36 34 2a 29 26  p[iOff], (u64*)&
10db0 70 49 74 65 72 2d 3e 69 52 6f 77 69 64 29 3b 0a  pIter->iRowid);.
10dc0 20 20 20 20 70 49 74 65 72 2d 3e 69 4c 65 61 66      pIter->iLeaf
10dd0 4f 66 66 73 65 74 20 3d 20 69 4f 66 66 3b 0a 0a  Offset = iOff;..
10de0 20 20 20 20 69 66 28 20 66 74 73 35 4c 65 61 66      if( fts5Leaf
10df0 49 73 54 65 72 6d 6c 65 73 73 28 70 4c 61 73 74  IsTermless(pLast
10e00 29 20 29 7b 0a 20 20 20 20 20 20 70 49 74 65 72  ) ){.      pIter
10e10 2d 3e 69 45 6e 64 6f 66 44 6f 63 6c 69 73 74 20  ->iEndofDoclist 
10e20 3d 20 70 4c 61 73 74 2d 3e 6e 6e 2b 31 3b 0a 20  = pLast->nn+1;. 
10e30 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
10e40 70 49 74 65 72 2d 3e 69 45 6e 64 6f 66 44 6f 63  pIter->iEndofDoc
10e50 6c 69 73 74 20 3d 20 66 74 73 35 4c 65 61 66 46  list = fts5LeafF
10e60 69 72 73 74 54 65 72 6d 4f 66 66 28 70 4c 61 73  irstTermOff(pLas
10e70 74 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 7d 0a 0a  t);.    }..  }..
10e80 20 20 66 74 73 35 53 65 67 49 74 65 72 52 65 76    fts5SegIterRev
10e90 65 72 73 65 49 6e 69 74 50 61 67 65 28 70 2c 20  erseInitPage(p, 
10ea0 70 49 74 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  pIter);.}../*.**
10eb0 20 49 74 65 72 61 74 6f 72 20 70 49 74 65 72 20   Iterator pIter 
10ec0 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 73  currently points
10ed0 20 74 6f 20 74 68 65 20 66 69 72 73 74 20 72 6f   to the first ro
10ee0 77 69 64 20 6f 66 20 61 20 64 6f 63 6c 69 73 74  wid of a doclist
10ef0 2e 0a 2a 2a 20 54 68 65 72 65 20 69 73 20 61 20  ..** There is a 
10f00 64 6f 63 6c 69 73 74 2d 69 6e 64 65 78 20 61 73  doclist-index as
10f10 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68  sociated with th
10f20 65 20 66 69 6e 61 6c 20 74 65 72 6d 20 6f 6e 20  e final term on 
10f30 74 68 65 20 63 75 72 72 65 6e 74 20 0a 2a 2a 20  the current .** 
10f40 70 61 67 65 2e 20 49 66 20 74 68 65 20 63 75 72  page. If the cur
10f50 72 65 6e 74 20 74 65 72 6d 20 69 73 20 74 68 65  rent term is the
10f60 20 6c 61 73 74 20 74 65 72 6d 20 6f 6e 20 74 68   last term on th
10f70 65 20 70 61 67 65 2c 20 6c 6f 61 64 20 74 68 65  e page, load the
10f80 20 0a 2a 2a 20 64 6f 63 6c 69 73 74 2d 69 6e 64   .** doclist-ind
10f90 65 78 20 66 72 6f 6d 20 64 69 73 6b 20 61 6e 64  ex from disk and
10fa0 20 69 6e 69 74 69 61 6c 69 7a 65 20 61 6e 20 69   initialize an i
10fb0 74 65 72 61 74 6f 72 20 61 74 20 28 70 49 74 65  terator at (pIte
10fc0 72 2d 3e 70 44 6c 69 64 78 29 2e 0a 2a 2f 0a 73  r->pDlidx)..*/.s
10fd0 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 53  tatic void fts5S
10fe0 65 67 49 74 65 72 4c 6f 61 64 44 6c 69 64 78 28  egIterLoadDlidx(
10ff0 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 46 74  Fts5Index *p, Ft
11000 73 35 53 65 67 49 74 65 72 20 2a 70 49 74 65 72  s5SegIter *pIter
11010 29 7b 0a 20 20 69 6e 74 20 69 53 65 67 20 3d 20  ){.  int iSeg = 
11020 70 49 74 65 72 2d 3e 70 53 65 67 2d 3e 69 53 65  pIter->pSeg->iSe
11030 67 69 64 3b 0a 20 20 69 6e 74 20 62 52 65 76 20  gid;.  int bRev 
11040 3d 20 28 70 49 74 65 72 2d 3e 66 6c 61 67 73 20  = (pIter->flags 
11050 26 20 46 54 53 35 5f 53 45 47 49 54 45 52 5f 52  & FTS5_SEGITER_R
11060 45 56 45 52 53 45 29 3b 0a 20 20 46 74 73 35 44  EVERSE);.  Fts5D
11070 61 74 61 20 2a 70 4c 65 61 66 20 3d 20 70 49 74  ata *pLeaf = pIt
11080 65 72 2d 3e 70 4c 65 61 66 3b 20 2f 2a 20 43 75  er->pLeaf; /* Cu
11090 72 72 65 6e 74 20 6c 65 61 66 20 64 61 74 61 20  rrent leaf data 
110a0 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 49  */..  assert( pI
110b0 74 65 72 2d 3e 66 6c 61 67 73 20 26 20 46 54 53  ter->flags & FTS
110c0 35 5f 53 45 47 49 54 45 52 5f 4f 4e 45 54 45 52  5_SEGITER_ONETER
110d0 4d 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  M );.  assert( p
110e0 49 74 65 72 2d 3e 70 44 6c 69 64 78 3d 3d 30 20  Iter->pDlidx==0 
110f0 29 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69  );..  /* Check i
11100 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 64 6f  f the current do
11110 63 6c 69 73 74 20 65 6e 64 73 20 6f 6e 20 74 68  clist ends on th
11120 69 73 20 70 61 67 65 2e 20 49 66 20 69 74 20 64  is page. If it d
11130 6f 65 73 2c 20 72 65 74 75 72 6e 0a 20 20 2a 2a  oes, return.  **
11140 20 65 61 72 6c 79 20 77 69 74 68 6f 75 74 20 6c   early without l
11150 6f 61 64 69 6e 67 20 74 68 65 20 64 6f 63 6c 69  oading the docli
11160 73 74 2d 69 6e 64 65 78 20 28 61 73 20 69 74 20  st-index (as it 
11170 62 65 6c 6f 6e 67 73 20 74 6f 20 61 20 64 69 66  belongs to a dif
11180 66 65 72 65 6e 74 0a 20 20 2a 2a 20 74 65 72 6d  ferent.  ** term
11190 2e 20 2a 2f 0a 20 20 69 66 28 20 70 49 74 65 72  . */.  if( pIter
111a0 2d 3e 69 54 65 72 6d 4c 65 61 66 50 67 6e 6f 3d  ->iTermLeafPgno=
111b0 3d 70 49 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e  =pIter->iLeafPgn
111c0 6f 20 0a 20 20 20 26 26 20 70 49 74 65 72 2d 3e  o .   && pIter->
111d0 69 45 6e 64 6f 66 44 6f 63 6c 69 73 74 3c 70 4c  iEndofDoclist<pL
111e0 65 61 66 2d 3e 73 7a 4c 65 61 66 20 0a 20 20 29  eaf->szLeaf .  )
111f0 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  {.    return;.  
11200 7d 0a 0a 20 20 70 49 74 65 72 2d 3e 70 44 6c 69  }..  pIter->pDli
11210 64 78 20 3d 20 66 74 73 35 44 6c 69 64 78 49 74  dx = fts5DlidxIt
11220 65 72 49 6e 69 74 28 70 2c 20 62 52 65 76 2c 20  erInit(p, bRev, 
11230 69 53 65 67 2c 20 70 49 74 65 72 2d 3e 69 54 65  iSeg, pIter->iTe
11240 72 6d 4c 65 61 66 50 67 6e 6f 29 3b 0a 7d 0a 0a  rmLeafPgno);.}..
11250 2f 2a 0a 2a 2a 20 54 68 65 20 69 74 65 72 61 74  /*.** The iterat
11260 6f 72 20 6f 62 6a 65 63 74 20 70 61 73 73 65 64  or object passed
11270 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61   as the second a
11280 72 67 75 6d 65 6e 74 20 63 75 72 72 65 6e 74 6c  rgument currentl
11290 79 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20 6e 6f  y contains.** no
112a0 20 76 61 6c 69 64 20 76 61 6c 75 65 73 20 65 78   valid values ex
112b0 63 65 70 74 20 66 6f 72 20 74 68 65 20 46 74 73  cept for the Fts
112c0 35 53 65 67 49 74 65 72 2e 70 4c 65 61 66 20 6d  5SegIter.pLeaf m
112d0 65 6d 62 65 72 20 76 61 72 69 61 62 6c 65 2e 20  ember variable. 
112e0 54 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e  This.** function
112f0 20 73 65 61 72 63 68 65 73 20 74 68 65 20 6c 65   searches the le
11300 61 66 20 70 61 67 65 20 66 6f 72 20 61 20 74 65  af page for a te
11310 72 6d 20 6d 61 74 63 68 69 6e 67 20 28 70 54 65  rm matching (pTe
11320 72 6d 2f 6e 54 65 72 6d 29 2e 0a 2a 2a 0a 2a 2a  rm/nTerm)..**.**
11330 20 49 66 20 74 68 65 20 73 70 65 63 69 66 69 65   If the specifie
11340 64 20 74 65 72 6d 20 69 73 20 66 6f 75 6e 64 20  d term is found 
11350 6f 6e 20 74 68 65 20 70 61 67 65 2c 20 74 68 65  on the page, the
11360 6e 20 74 68 65 20 69 74 65 72 61 74 6f 72 20 69  n the iterator i
11370 73 20 6c 65 66 74 0a 2a 2a 20 70 6f 69 6e 74 69  s left.** pointi
11380 6e 67 20 74 6f 20 69 74 2e 20 49 66 20 61 72 67  ng to it. If arg
11390 75 6d 65 6e 74 20 62 47 65 20 69 73 20 7a 65 72  ument bGe is zer
113a0 6f 20 61 6e 64 20 74 68 65 20 74 65 72 6d 20 69  o and the term i
113b0 73 20 6e 6f 74 20 66 6f 75 6e 64 2c 0a 2a 2a 20  s not found,.** 
113c0 74 68 65 20 69 74 65 72 61 74 6f 72 20 69 73 20  the iterator is 
113d0 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67 20 61 74  left pointing at
113e0 20 45 4f 46 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 62   EOF..**.** If b
113f0 47 65 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 20 61  Ge is non-zero a
11400 6e 64 20 74 68 65 20 73 70 65 63 69 66 69 65 64  nd the specified
11410 20 74 65 72 6d 20 69 73 20 6e 6f 74 20 66 6f 75   term is not fou
11420 6e 64 2c 20 74 68 65 6e 20 74 68 65 0a 2a 2a 20  nd, then the.** 
11430 69 74 65 72 61 74 6f 72 20 69 73 20 6c 65 66 74  iterator is left
11440 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 65   pointing to the
11450 20 73 6d 61 6c 6c 65 73 74 20 74 65 72 6d 20 69   smallest term i
11460 6e 20 74 68 65 20 73 65 67 6d 65 6e 74 20 74 68  n the segment th
11470 61 74 0a 2a 2a 20 69 73 20 6c 61 72 67 65 72 20  at.** is larger 
11480 74 68 61 6e 20 74 68 65 20 73 70 65 63 69 66 69  than the specifi
11490 65 64 20 74 65 72 6d 2c 20 65 76 65 6e 20 69 66  ed term, even if
114a0 20 74 68 69 73 20 74 65 72 6d 20 69 73 20 6e 6f   this term is no
114b0 74 20 6f 6e 20 74 68 65 0a 2a 2a 20 63 75 72 72  t on the.** curr
114c0 65 6e 74 20 70 61 67 65 2e 0a 2a 2f 0a 73 74 61  ent page..*/.sta
114d0 74 69 63 20 76 6f 69 64 20 66 74 73 35 4c 65 61  tic void fts5Lea
114e0 66 53 65 65 6b 28 0a 20 20 46 74 73 35 49 6e 64  fSeek(.  Fts5Ind
114f0 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  ex *p,          
11500 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 61 76           /* Leav
11510 65 20 61 6e 79 20 65 72 72 6f 72 20 63 6f 64 65  e any error code
11520 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20 62   here */.  int b
11530 47 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  Ge,             
11540 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
11550 75 65 20 66 6f 72 20 61 20 3e 3d 20 73 65 61 72  ue for a >= sear
11560 63 68 20 2a 2f 0a 20 20 46 74 73 35 53 65 67 49  ch */.  Fts5SegI
11570 74 65 72 20 2a 70 49 74 65 72 2c 20 20 20 20 20  ter *pIter,     
11580 20 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61          /* Itera
11590 74 6f 72 20 74 6f 20 73 65 65 6b 20 2a 2f 0a 20  tor to seek */. 
115a0 20 63 6f 6e 73 74 20 75 38 20 2a 70 54 65 72 6d   const u8 *pTerm
115b0 2c 20 69 6e 74 20 6e 54 65 72 6d 20 20 20 20 20  , int nTerm     
115c0 20 2f 2a 20 54 65 72 6d 20 74 6f 20 73 65 61 72   /* Term to sear
115d0 63 68 20 66 6f 72 20 2a 2f 0a 29 7b 0a 20 20 69  ch for */.){.  i
115e0 6e 74 20 69 4f 66 66 3b 0a 20 20 63 6f 6e 73 74  nt iOff;.  const
115f0 20 75 38 20 2a 61 20 3d 20 70 49 74 65 72 2d 3e   u8 *a = pIter->
11600 70 4c 65 61 66 2d 3e 70 3b 0a 20 20 69 6e 74 20  pLeaf->p;.  int 
11610 73 7a 4c 65 61 66 20 3d 20 70 49 74 65 72 2d 3e  szLeaf = pIter->
11620 70 4c 65 61 66 2d 3e 73 7a 4c 65 61 66 3b 0a 20  pLeaf->szLeaf;. 
11630 20 69 6e 74 20 6e 20 3d 20 70 49 74 65 72 2d 3e   int n = pIter->
11640 70 4c 65 61 66 2d 3e 6e 6e 3b 0a 0a 20 20 69 6e  pLeaf->nn;..  in
11650 74 20 6e 4d 61 74 63 68 20 3d 20 30 3b 0a 20 20  t nMatch = 0;.  
11660 69 6e 74 20 6e 4b 65 65 70 20 3d 20 30 3b 0a 20  int nKeep = 0;. 
11670 20 69 6e 74 20 6e 4e 65 77 20 3d 20 30 3b 0a 20   int nNew = 0;. 
11680 20 69 6e 74 20 69 54 65 72 6d 4f 66 66 3b 0a 20   int iTermOff;. 
11690 20 69 6e 74 20 69 50 67 69 64 78 3b 20 20 20 20   int iPgidx;    
116a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
116b0 20 2f 2a 20 43 75 72 72 65 6e 74 20 6f 66 66 73   /* Current offs
116c0 65 74 20 69 6e 20 70 67 69 64 78 20 2a 2f 0a 20  et in pgidx */. 
116d0 20 69 6e 74 20 62 45 6e 64 4f 66 50 61 67 65 20   int bEndOfPage 
116e0 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  = 0;..  assert( 
116f0 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
11700 20 29 3b 0a 0a 20 20 69 50 67 69 64 78 20 3d 20   );..  iPgidx = 
11710 73 7a 4c 65 61 66 3b 0a 20 20 69 50 67 69 64 78  szLeaf;.  iPgidx
11720 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e   += fts5GetVarin
11730 74 33 32 28 26 61 5b 69 50 67 69 64 78 5d 2c 20  t32(&a[iPgidx], 
11740 69 54 65 72 6d 4f 66 66 29 3b 0a 20 20 69 4f 66  iTermOff);.  iOf
11750 66 20 3d 20 69 54 65 72 6d 4f 66 66 3b 0a 20 20  f = iTermOff;.  
11760 69 66 28 20 69 4f 66 66 3e 6e 20 29 7b 0a 20 20  if( iOff>n ){.  
11770 20 20 70 2d 3e 72 63 20 3d 20 46 54 53 35 5f 43    p->rc = FTS5_C
11780 4f 52 52 55 50 54 3b 0a 20 20 20 20 72 65 74 75  ORRUPT;.    retu
11790 72 6e 3b 0a 20 20 7d 0a 0a 20 20 77 68 69 6c 65  rn;.  }..  while
117a0 28 20 31 20 29 7b 0a 0a 20 20 20 20 2f 2a 20 46  ( 1 ){..    /* F
117b0 69 67 75 72 65 20 6f 75 74 20 68 6f 77 20 6d 61  igure out how ma
117c0 6e 79 20 6e 65 77 20 62 79 74 65 73 20 61 72 65  ny new bytes are
117d0 20 69 6e 20 74 68 69 73 20 74 65 72 6d 20 2a 2f   in this term */
117e0 0a 20 20 20 20 66 74 73 35 46 61 73 74 47 65 74  .    fts5FastGet
117f0 56 61 72 69 6e 74 33 32 28 61 2c 20 69 4f 66 66  Varint32(a, iOff
11800 2c 20 6e 4e 65 77 29 3b 0a 20 20 20 20 69 66 28  , nNew);.    if(
11810 20 6e 4b 65 65 70 3c 6e 4d 61 74 63 68 20 29 7b   nKeep<nMatch ){
11820 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 65 61 72  .      goto sear
11830 63 68 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d  ch_failed;.    }
11840 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e 4b  ..    assert( nK
11850 65 65 70 3e 3d 6e 4d 61 74 63 68 20 29 3b 0a 20  eep>=nMatch );. 
11860 20 20 20 69 66 28 20 6e 4b 65 65 70 3d 3d 6e 4d     if( nKeep==nM
11870 61 74 63 68 20 29 7b 0a 20 20 20 20 20 20 69 6e  atch ){.      in
11880 74 20 6e 43 6d 70 3b 0a 20 20 20 20 20 20 69 6e  t nCmp;.      in
11890 74 20 69 3b 0a 20 20 20 20 20 20 6e 43 6d 70 20  t i;.      nCmp 
118a0 3d 20 4d 49 4e 28 6e 4e 65 77 2c 20 6e 54 65 72  = MIN(nNew, nTer
118b0 6d 2d 6e 4d 61 74 63 68 29 3b 0a 20 20 20 20 20  m-nMatch);.     
118c0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6d 70   for(i=0; i<nCmp
118d0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
118e0 69 66 28 20 61 5b 69 4f 66 66 2b 69 5d 21 3d 70  if( a[iOff+i]!=p
118f0 54 65 72 6d 5b 6e 4d 61 74 63 68 2b 69 5d 20 29  Term[nMatch+i] )
11900 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
11910 20 20 20 20 20 20 6e 4d 61 74 63 68 20 2b 3d 20        nMatch += 
11920 69 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 6e 54  i;..      if( nT
11930 65 72 6d 3d 3d 6e 4d 61 74 63 68 20 29 7b 0a 20  erm==nMatch ){. 
11940 20 20 20 20 20 20 20 69 66 28 20 69 3d 3d 6e 4e         if( i==nN
11950 65 77 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ew ){.          
11960 67 6f 74 6f 20 73 65 61 72 63 68 5f 73 75 63 63  goto search_succ
11970 65 73 73 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  ess;.        }el
11980 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f  se{.          go
11990 74 6f 20 73 65 61 72 63 68 5f 66 61 69 6c 65 64  to search_failed
119a0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
119b0 20 20 7d 65 6c 73 65 20 69 66 28 20 69 3c 6e 4e    }else if( i<nN
119c0 65 77 20 26 26 20 61 5b 69 4f 66 66 2b 69 5d 3e  ew && a[iOff+i]>
119d0 70 54 65 72 6d 5b 6e 4d 61 74 63 68 5d 20 29 7b  pTerm[nMatch] ){
119e0 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73 65  .        goto se
119f0 61 72 63 68 5f 66 61 69 6c 65 64 3b 0a 20 20 20  arch_failed;.   
11a00 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
11a10 69 66 28 20 69 50 67 69 64 78 3e 3d 6e 20 29 7b  if( iPgidx>=n ){
11a20 0a 20 20 20 20 20 20 62 45 6e 64 4f 66 50 61 67  .      bEndOfPag
11a30 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 62 72 65  e = 1;.      bre
11a40 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69  ak;.    }..    i
11a50 50 67 69 64 78 20 2b 3d 20 66 74 73 35 47 65 74  Pgidx += fts5Get
11a60 56 61 72 69 6e 74 33 32 28 26 61 5b 69 50 67 69  Varint32(&a[iPgi
11a70 64 78 5d 2c 20 6e 4b 65 65 70 29 3b 0a 20 20 20  dx], nKeep);.   
11a80 20 69 54 65 72 6d 4f 66 66 20 2b 3d 20 6e 4b 65   iTermOff += nKe
11a90 65 70 3b 0a 20 20 20 20 69 4f 66 66 20 3d 20 69  ep;.    iOff = i
11aa0 54 65 72 6d 4f 66 66 3b 0a 0a 20 20 20 20 69 66  TermOff;..    if
11ab0 28 20 69 4f 66 66 3e 3d 6e 20 29 7b 0a 20 20 20  ( iOff>=n ){.   
11ac0 20 20 20 70 2d 3e 72 63 20 3d 20 46 54 53 35 5f     p->rc = FTS5_
11ad0 43 4f 52 52 55 50 54 3b 0a 20 20 20 20 20 20 72  CORRUPT;.      r
11ae0 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 0a 20 20  eturn;.    }..  
11af0 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20 6e 4b    /* Read the nK
11b00 65 65 70 20 66 69 65 6c 64 20 6f 66 20 74 68 65  eep field of the
11b10 20 6e 65 78 74 20 74 65 72 6d 2e 20 2a 2f 0a 20   next term. */. 
11b20 20 20 20 66 74 73 35 46 61 73 74 47 65 74 56 61     fts5FastGetVa
11b30 72 69 6e 74 33 32 28 61 2c 20 69 4f 66 66 2c 20  rint32(a, iOff, 
11b40 6e 4b 65 65 70 29 3b 0a 20 20 7d 0a 0a 20 73 65  nKeep);.  }.. se
11b50 61 72 63 68 5f 66 61 69 6c 65 64 3a 0a 20 20 69  arch_failed:.  i
11b60 66 28 20 62 47 65 3d 3d 30 20 29 7b 0a 20 20 20  f( bGe==0 ){.   
11b70 20 66 74 73 35 44 61 74 61 52 65 6c 65 61 73 65   fts5DataRelease
11b80 28 70 49 74 65 72 2d 3e 70 4c 65 61 66 29 3b 0a  (pIter->pLeaf);.
11b90 20 20 20 20 70 49 74 65 72 2d 3e 70 4c 65 61 66      pIter->pLeaf
11ba0 20 3d 20 30 3b 0a 20 20 20 20 72 65 74 75 72 6e   = 0;.    return
11bb0 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 62 45  ;.  }else if( bE
11bc0 6e 64 4f 66 50 61 67 65 20 29 7b 0a 20 20 20 20  ndOfPage ){.    
11bd0 64 6f 20 7b 0a 20 20 20 20 20 20 66 74 73 35 53  do {.      fts5S
11be0 65 67 49 74 65 72 4e 65 78 74 50 61 67 65 28 70  egIterNextPage(p
11bf0 2c 20 70 49 74 65 72 29 3b 0a 20 20 20 20 20 20  , pIter);.      
11c00 69 66 28 20 70 49 74 65 72 2d 3e 70 4c 65 61 66  if( pIter->pLeaf
11c10 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
11c20 20 20 20 20 61 20 3d 20 70 49 74 65 72 2d 3e 70      a = pIter->p
11c30 4c 65 61 66 2d 3e 70 3b 0a 20 20 20 20 20 20 69  Leaf->p;.      i
11c40 66 28 20 66 74 73 35 4c 65 61 66 49 73 54 65 72  f( fts5LeafIsTer
11c50 6d 6c 65 73 73 28 70 49 74 65 72 2d 3e 70 4c 65  mless(pIter->pLe
11c60 61 66 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  af)==0 ){.      
11c70 20 20 69 50 67 69 64 78 20 3d 20 70 49 74 65 72    iPgidx = pIter
11c80 2d 3e 70 4c 65 61 66 2d 3e 73 7a 4c 65 61 66 3b  ->pLeaf->szLeaf;
11c90 0a 20 20 20 20 20 20 20 20 69 50 67 69 64 78 20  .        iPgidx 
11ca0 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e 74  += fts5GetVarint
11cb0 33 32 28 26 70 49 74 65 72 2d 3e 70 4c 65 61 66  32(&pIter->pLeaf
11cc0 2d 3e 70 5b 69 50 67 69 64 78 5d 2c 20 69 4f 66  ->p[iPgidx], iOf
11cd0 66 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  f);.        if( 
11ce0 69 4f 66 66 3c 34 20 7c 7c 20 69 4f 66 66 3e 3d  iOff<4 || iOff>=
11cf0 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 73 7a  pIter->pLeaf->sz
11d00 4c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 20 20  Leaf ){.        
11d10 20 20 70 2d 3e 72 63 20 3d 20 46 54 53 35 5f 43    p->rc = FTS5_C
11d20 4f 52 52 55 50 54 3b 0a 20 20 20 20 20 20 20 20  ORRUPT;.        
11d30 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
11d40 20 6e 4b 65 65 70 20 3d 20 30 3b 0a 20 20 20 20   nKeep = 0;.    
11d50 20 20 20 20 20 20 69 54 65 72 6d 4f 66 66 20 3d        iTermOff =
11d60 20 69 4f 66 66 3b 0a 20 20 20 20 20 20 20 20 20   iOff;.         
11d70 20 6e 20 3d 20 70 49 74 65 72 2d 3e 70 4c 65 61   n = pIter->pLea
11d80 66 2d 3e 6e 6e 3b 0a 20 20 20 20 20 20 20 20 20  f->nn;.         
11d90 20 69 4f 66 66 20 2b 3d 20 66 74 73 35 47 65 74   iOff += fts5Get
11da0 56 61 72 69 6e 74 33 32 28 26 61 5b 69 4f 66 66  Varint32(&a[iOff
11db0 5d 2c 20 6e 4e 65 77 29 3b 0a 20 20 20 20 20 20  ], nNew);.      
11dc0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
11dd0 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
11de0 20 7d 77 68 69 6c 65 28 20 31 20 29 3b 0a 20 20   }while( 1 );.  
11df0 7d 0a 0a 20 73 65 61 72 63 68 5f 73 75 63 63 65  }.. search_succe
11e00 73 73 3a 0a 0a 20 20 70 49 74 65 72 2d 3e 69 4c  ss:..  pIter->iL
11e10 65 61 66 4f 66 66 73 65 74 20 3d 20 69 4f 66 66  eafOffset = iOff
11e20 20 2b 20 6e 4e 65 77 3b 0a 20 20 70 49 74 65 72   + nNew;.  pIter
11e30 2d 3e 69 54 65 72 6d 4c 65 61 66 4f 66 66 73 65  ->iTermLeafOffse
11e40 74 20 3d 20 70 49 74 65 72 2d 3e 69 4c 65 61 66  t = pIter->iLeaf
11e50 4f 66 66 73 65 74 3b 0a 20 20 70 49 74 65 72 2d  Offset;.  pIter-
11e60 3e 69 54 65 72 6d 4c 65 61 66 50 67 6e 6f 20 3d  >iTermLeafPgno =
11e70 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e   pIter->iLeafPgn
11e80 6f 3b 0a 0a 20 20 66 74 73 35 42 75 66 66 65 72  o;..  fts5Buffer
11e90 53 65 74 28 26 70 2d 3e 72 63 2c 20 26 70 49 74  Set(&p->rc, &pIt
11ea0 65 72 2d 3e 74 65 72 6d 2c 20 6e 4b 65 65 70 2c  er->term, nKeep,
11eb0 20 70 54 65 72 6d 29 3b 0a 20 20 66 74 73 35 42   pTerm);.  fts5B
11ec0 75 66 66 65 72 41 70 70 65 6e 64 42 6c 6f 62 28  ufferAppendBlob(
11ed0 26 70 2d 3e 72 63 2c 20 26 70 49 74 65 72 2d 3e  &p->rc, &pIter->
11ee0 74 65 72 6d 2c 20 6e 4e 65 77 2c 20 26 61 5b 69  term, nNew, &a[i
11ef0 4f 66 66 5d 29 3b 0a 0a 20 20 69 66 28 20 69 50  Off]);..  if( iP
11f00 67 69 64 78 3e 3d 6e 20 29 7b 0a 20 20 20 20 70  gidx>=n ){.    p
11f10 49 74 65 72 2d 3e 69 45 6e 64 6f 66 44 6f 63 6c  Iter->iEndofDocl
11f20 69 73 74 20 3d 20 70 49 74 65 72 2d 3e 70 4c 65  ist = pIter->pLe
11f30 61 66 2d 3e 6e 6e 2b 31 3b 0a 20 20 7d 65 6c 73  af->nn+1;.  }els
11f40 65 7b 0a 20 20 20 20 69 6e 74 20 6e 45 78 74 72  e{.    int nExtr
11f50 61 3b 0a 20 20 20 20 69 50 67 69 64 78 20 2b 3d  a;.    iPgidx +=
11f60 20 66 74 73 35 47 65 74 56 61 72 69 6e 74 33 32   fts5GetVarint32
11f70 28 26 61 5b 69 50 67 69 64 78 5d 2c 20 6e 45 78  (&a[iPgidx], nEx
11f80 74 72 61 29 3b 0a 20 20 20 20 70 49 74 65 72 2d  tra);.    pIter-
11f90 3e 69 45 6e 64 6f 66 44 6f 63 6c 69 73 74 20 3d  >iEndofDoclist =
11fa0 20 69 54 65 72 6d 4f 66 66 20 2b 20 6e 45 78 74   iTermOff + nExt
11fb0 72 61 3b 0a 20 20 7d 0a 20 20 70 49 74 65 72 2d  ra;.  }.  pIter-
11fc0 3e 69 50 67 69 64 78 4f 66 66 20 3d 20 69 50 67  >iPgidxOff = iPg
11fd0 69 64 78 3b 0a 0a 20 20 66 74 73 35 53 65 67 49  idx;..  fts5SegI
11fe0 74 65 72 4c 6f 61 64 52 6f 77 69 64 28 70 2c 20  terLoadRowid(p, 
11ff0 70 49 74 65 72 29 3b 0a 20 20 66 74 73 35 53 65  pIter);.  fts5Se
12000 67 49 74 65 72 4c 6f 61 64 4e 50 6f 73 28 70 2c  gIterLoadNPos(p,
12010 20 70 49 74 65 72 29 3b 0a 7d 0a 0a 73 74 61 74   pIter);.}..stat
12020 69 63 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20  ic sqlite3_stmt 
12030 2a 66 74 73 35 49 64 78 53 65 6c 65 63 74 53 74  *fts5IdxSelectSt
12040 6d 74 28 46 74 73 35 49 6e 64 65 78 20 2a 70 29  mt(Fts5Index *p)
12050 7b 0a 20 20 69 66 28 20 70 2d 3e 70 49 64 78 53  {.  if( p->pIdxS
12060 65 6c 65 63 74 3d 3d 30 20 29 7b 0a 20 20 20 20  elect==0 ){.    
12070 46 74 73 35 43 6f 6e 66 69 67 20 2a 70 43 6f 6e  Fts5Config *pCon
12080 66 69 67 20 3d 20 70 2d 3e 70 43 6f 6e 66 69 67  fig = p->pConfig
12090 3b 0a 20 20 20 20 66 74 73 35 49 6e 64 65 78 50  ;.    fts5IndexP
120a0 72 65 70 61 72 65 53 74 6d 74 28 70 2c 20 26 70  repareStmt(p, &p
120b0 2d 3e 70 49 64 78 53 65 6c 65 63 74 2c 20 73 71  ->pIdxSelect, sq
120c0 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 0a 20  lite3_mprintf(. 
120d0 20 20 20 20 20 20 20 20 20 22 53 45 4c 45 43 54           "SELECT
120e0 20 70 67 6e 6f 20 46 52 4f 4d 20 27 25 71 27 2e   pgno FROM '%q'.
120f0 27 25 71 5f 69 64 78 27 20 57 48 45 52 45 20 22  '%q_idx' WHERE "
12100 0a 20 20 20 20 20 20 20 20 20 20 22 73 65 67 69  .          "segi
12110 64 3d 3f 20 41 4e 44 20 74 65 72 6d 3c 3d 3f 20  d=? AND term<=? 
12120 4f 52 44 45 52 20 42 59 20 74 65 72 6d 20 44 45  ORDER BY term DE
12130 53 43 20 4c 49 4d 49 54 20 31 22 2c 0a 20 20 20  SC LIMIT 1",.   
12140 20 20 20 20 20 20 20 70 43 6f 6e 66 69 67 2d 3e         pConfig->
12150 7a 44 62 2c 20 70 43 6f 6e 66 69 67 2d 3e 7a 4e  zDb, pConfig->zN
12160 61 6d 65 0a 20 20 20 20 29 29 3b 0a 20 20 7d 0a  ame.    ));.  }.
12170 20 20 72 65 74 75 72 6e 20 70 2d 3e 70 49 64 78    return p->pIdx
12180 53 65 6c 65 63 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  Select;.}../*.**
12190 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20   Initialize the 
121a0 6f 62 6a 65 63 74 20 70 49 74 65 72 20 74 6f 20  object pIter to 
121b0 70 6f 69 6e 74 20 74 6f 20 74 65 72 6d 20 70 54  point to term pT
121c0 65 72 6d 2f 6e 54 65 72 6d 20 77 69 74 68 69 6e  erm/nTerm within
121d0 20 73 65 67 6d 65 6e 74 0a 2a 2a 20 70 53 65 67   segment.** pSeg
121e0 2e 20 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f  . If there is no
121f0 20 73 75 63 68 20 74 65 72 6d 20 69 6e 20 74 68   such term in th
12200 65 20 69 6e 64 65 78 2c 20 74 68 65 20 69 74 65  e index, the ite
12210 72 61 74 6f 72 20 69 73 20 73 65 74 20 74 6f 20  rator is set to 
12220 45 4f 46 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  EOF..**.** If an
12230 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 46   error occurs, F
12240 74 73 35 49 6e 64 65 78 2e 72 63 20 69 73 20 73  ts5Index.rc is s
12250 65 74 20 74 6f 20 61 6e 20 61 70 70 72 6f 70 72  et to an appropr
12260 69 61 74 65 20 65 72 72 6f 72 20 63 6f 64 65 2e  iate error code.
12270 20 49 66 20 0a 2a 2a 20 61 6e 20 65 72 72 6f 72   If .** an error
12280 20 68 61 73 20 61 6c 72 65 61 64 79 20 6f 63 63   has already occ
12290 75 72 72 65 64 20 77 68 65 6e 20 74 68 69 73 20  urred when this 
122a0 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
122b0 65 64 2c 20 69 74 20 69 73 20 61 20 6e 6f 2d 6f  ed, it is a no-o
122c0 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  p..*/.static voi
122d0 64 20 66 74 73 35 53 65 67 49 74 65 72 53 65 65  d fts5SegIterSee
122e0 6b 49 6e 69 74 28 0a 20 20 46 74 73 35 49 6e 64  kInit(.  Fts5Ind
122f0 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  ex *p,          
12300 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53 35           /* FTS5
12310 20 62 61 63 6b 65 6e 64 20 2a 2f 0a 20 20 63 6f   backend */.  co
12320 6e 73 74 20 75 38 20 2a 70 54 65 72 6d 2c 20 69  nst u8 *pTerm, i
12330 6e 74 20 6e 54 65 72 6d 2c 20 20 20 20 20 2f 2a  nt nTerm,     /*
12340 20 54 65 72 6d 20 74 6f 20 73 65 65 6b 20 74 6f   Term to seek to
12350 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c   */.  int flags,
12360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12370 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66        /* Mask of
12380 20 46 54 53 35 49 4e 44 45 58 5f 58 58 58 20 66   FTS5INDEX_XXX f
12390 6c 61 67 73 20 2a 2f 0a 20 20 46 74 73 35 53 74  lags */.  Fts5St
123a0 72 75 63 74 75 72 65 53 65 67 6d 65 6e 74 20 2a  ructureSegment *
123b0 70 53 65 67 2c 20 20 20 20 20 2f 2a 20 44 65 73  pSeg,     /* Des
123c0 63 72 69 70 74 69 6f 6e 20 6f 66 20 73 65 67 6d  cription of segm
123d0 65 6e 74 20 2a 2f 0a 20 20 46 74 73 35 53 65 67  ent */.  Fts5Seg
123e0 49 74 65 72 20 2a 70 49 74 65 72 20 20 20 20 20  Iter *pIter     
123f0 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 62 6a 65           /* Obje
12400 63 74 20 74 6f 20 70 6f 70 75 6c 61 74 65 20 2a  ct to populate *
12410 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 50 67 20 3d  /.){.  int iPg =
12420 20 31 3b 0a 20 20 69 6e 74 20 62 47 65 20 3d 20   1;.  int bGe = 
12430 28 66 6c 61 67 73 20 26 20 46 54 53 35 49 4e 44  (flags & FTS5IND
12440 45 58 5f 51 55 45 52 59 5f 53 43 41 4e 29 3b 0a  EX_QUERY_SCAN);.
12450 20 20 69 6e 74 20 62 44 6c 69 64 78 20 3d 20 30    int bDlidx = 0
12460 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
12470 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65    /* True if the
12480 72 65 20 69 73 20 61 20 64 6f 63 6c 69 73 74 2d  re is a doclist-
12490 69 6e 64 65 78 20 2a 2f 0a 20 20 73 71 6c 69 74  index */.  sqlit
124a0 65 33 5f 73 74 6d 74 20 2a 70 49 64 78 53 65 6c  e3_stmt *pIdxSel
124b0 65 63 74 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65  ect = 0;..  asse
124c0 72 74 28 20 62 47 65 3d 3d 30 20 7c 7c 20 28 66  rt( bGe==0 || (f
124d0 6c 61 67 73 20 26 20 46 54 53 35 49 4e 44 45 58  lags & FTS5INDEX
124e0 5f 51 55 45 52 59 5f 44 45 53 43 29 3d 3d 30 20  _QUERY_DESC)==0 
124f0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 54 65  );.  assert( pTe
12500 72 6d 20 26 26 20 6e 54 65 72 6d 20 29 3b 0a 20  rm && nTerm );. 
12510 20 6d 65 6d 73 65 74 28 70 49 74 65 72 2c 20 30   memset(pIter, 0
12520 2c 20 73 69 7a 65 6f 66 28 2a 70 49 74 65 72 29  , sizeof(*pIter)
12530 29 3b 0a 20 20 70 49 74 65 72 2d 3e 70 53 65 67  );.  pIter->pSeg
12540 20 3d 20 70 53 65 67 3b 0a 0a 20 20 2f 2a 20 54   = pSeg;..  /* T
12550 68 69 73 20 62 6c 6f 63 6b 20 73 65 74 73 20 73  his block sets s
12560 74 61 63 6b 20 76 61 72 69 61 62 6c 65 20 69 50  tack variable iP
12570 67 20 74 6f 20 74 68 65 20 6c 65 61 66 20 70 61  g to the leaf pa
12580 67 65 20 6e 75 6d 62 65 72 20 74 68 61 74 20 6d  ge number that m
12590 61 79 0a 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 20  ay.  ** contain 
125a0 74 65 72 6d 20 28 70 54 65 72 6d 2f 6e 54 65 72  term (pTerm/nTer
125b0 6d 29 2c 20 69 66 20 69 74 20 69 73 20 70 72 65  m), if it is pre
125c0 73 65 6e 74 20 69 6e 20 74 68 65 20 73 65 67 6d  sent in the segm
125d0 65 6e 74 2e 20 2a 2f 0a 20 20 70 49 64 78 53 65  ent. */.  pIdxSe
125e0 6c 65 63 74 20 3d 20 66 74 73 35 49 64 78 53 65  lect = fts5IdxSe
125f0 6c 65 63 74 53 74 6d 74 28 70 29 3b 0a 20 20 69  lectStmt(p);.  i
12600 66 28 20 70 2d 3e 72 63 20 29 20 72 65 74 75 72  f( p->rc ) retur
12610 6e 3b 0a 20 20 73 71 6c 69 74 65 33 5f 62 69 6e  n;.  sqlite3_bin
12620 64 5f 69 6e 74 28 70 49 64 78 53 65 6c 65 63 74  d_int(pIdxSelect
12630 2c 20 31 2c 20 70 53 65 67 2d 3e 69 53 65 67 69  , 1, pSeg->iSegi
12640 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 62 69  d);.  sqlite3_bi
12650 6e 64 5f 62 6c 6f 62 28 70 49 64 78 53 65 6c 65  nd_blob(pIdxSele
12660 63 74 2c 20 32 2c 20 70 54 65 72 6d 2c 20 6e 54  ct, 2, pTerm, nT
12670 65 72 6d 2c 20 53 51 4c 49 54 45 5f 53 54 41 54  erm, SQLITE_STAT
12680 49 43 29 3b 0a 20 20 69 66 28 20 53 51 4c 49 54  IC);.  if( SQLIT
12690 45 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33 5f 73  E_ROW==sqlite3_s
126a0 74 65 70 28 70 49 64 78 53 65 6c 65 63 74 29 20  tep(pIdxSelect) 
126b0 29 7b 0a 20 20 20 20 69 36 34 20 76 61 6c 20 3d  ){.    i64 val =
126c0 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
126d0 69 6e 74 28 70 49 64 78 53 65 6c 65 63 74 2c 20  int(pIdxSelect, 
126e0 30 29 3b 0a 20 20 20 20 69 50 67 20 3d 20 28 69  0);.    iPg = (i
126f0 6e 74 29 28 76 61 6c 3e 3e 31 29 3b 0a 20 20 20  nt)(val>>1);.   
12700 20 62 44 6c 69 64 78 20 3d 20 28 76 61 6c 20 26   bDlidx = (val &
12710 20 30 78 30 30 30 31 29 3b 0a 20 20 7d 0a 20 20   0x0001);.  }.  
12720 70 2d 3e 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  p->rc = sqlite3_
12730 72 65 73 65 74 28 70 49 64 78 53 65 6c 65 63 74  reset(pIdxSelect
12740 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 62 69 6e  );.  sqlite3_bin
12750 64 5f 6e 75 6c 6c 28 70 49 64 78 53 65 6c 65 63  d_null(pIdxSelec
12760 74 2c 20 32 29 3b 0a 0a 20 20 69 66 28 20 69 50  t, 2);..  if( iP
12770 67 3c 70 53 65 67 2d 3e 70 67 6e 6f 46 69 72 73  g<pSeg->pgnoFirs
12780 74 20 29 7b 0a 20 20 20 20 69 50 67 20 3d 20 70  t ){.    iPg = p
12790 53 65 67 2d 3e 70 67 6e 6f 46 69 72 73 74 3b 0a  Seg->pgnoFirst;.
127a0 20 20 20 20 62 44 6c 69 64 78 20 3d 20 30 3b 0a      bDlidx = 0;.
127b0 20 20 7d 0a 0a 20 20 70 49 74 65 72 2d 3e 69 4c    }..  pIter->iL
127c0 65 61 66 50 67 6e 6f 20 3d 20 69 50 67 20 2d 20  eafPgno = iPg - 
127d0 31 3b 0a 20 20 66 74 73 35 53 65 67 49 74 65 72  1;.  fts5SegIter
127e0 4e 65 78 74 50 61 67 65 28 70 2c 20 70 49 74 65  NextPage(p, pIte
127f0 72 29 3b 0a 0a 20 20 69 66 28 20 70 49 74 65 72  r);..  if( pIter
12800 2d 3e 70 4c 65 61 66 20 29 7b 0a 20 20 20 20 66  ->pLeaf ){.    f
12810 74 73 35 4c 65 61 66 53 65 65 6b 28 70 2c 20 62  ts5LeafSeek(p, b
12820 47 65 2c 20 70 49 74 65 72 2c 20 70 54 65 72 6d  Ge, pIter, pTerm
12830 2c 20 6e 54 65 72 6d 29 3b 0a 20 20 7d 0a 0a 20  , nTerm);.  }.. 
12840 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49   if( p->rc==SQLI
12850 54 45 5f 4f 4b 20 26 26 20 62 47 65 3d 3d 30 20  TE_OK && bGe==0 
12860 29 7b 0a 20 20 20 20 70 49 74 65 72 2d 3e 66 6c  ){.    pIter->fl
12870 61 67 73 20 7c 3d 20 46 54 53 35 5f 53 45 47 49  ags |= FTS5_SEGI
12880 54 45 52 5f 4f 4e 45 54 45 52 4d 3b 0a 20 20 20  TER_ONETERM;.   
12890 20 69 66 28 20 70 49 74 65 72 2d 3e 70 4c 65 61   if( pIter->pLea
128a0 66 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 66  f ){.      if( f
128b0 6c 61 67 73 20 26 20 46 54 53 35 49 4e 44 45 58  lags & FTS5INDEX
128c0 5f 51 55 45 52 59 5f 44 45 53 43 20 29 7b 0a 20  _QUERY_DESC ){. 
128d0 20 20 20 20 20 20 20 70 49 74 65 72 2d 3e 66 6c         pIter->fl
128e0 61 67 73 20 7c 3d 20 46 54 53 35 5f 53 45 47 49  ags |= FTS5_SEGI
128f0 54 45 52 5f 52 45 56 45 52 53 45 3b 0a 20 20 20  TER_REVERSE;.   
12900 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 62     }.      if( b
12910 44 6c 69 64 78 20 29 7b 0a 20 20 20 20 20 20 20  Dlidx ){.       
12920 20 66 74 73 35 53 65 67 49 74 65 72 4c 6f 61 64   fts5SegIterLoad
12930 44 6c 69 64 78 28 70 2c 20 70 49 74 65 72 29 3b  Dlidx(p, pIter);
12940 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
12950 66 28 20 66 6c 61 67 73 20 26 20 46 54 53 35 49  f( flags & FTS5I
12960 4e 44 45 58 5f 51 55 45 52 59 5f 44 45 53 43 20  NDEX_QUERY_DESC 
12970 29 7b 0a 20 20 20 20 20 20 20 20 66 74 73 35 53  ){.        fts5S
12980 65 67 49 74 65 72 52 65 76 65 72 73 65 28 70 2c  egIterReverse(p,
12990 20 70 49 74 65 72 29 3b 0a 20 20 20 20 20 20 7d   pIter);.      }
129a0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 66 74  .    }.  }..  ft
129b0 73 35 53 65 67 49 74 65 72 53 65 74 4e 65 78 74  s5SegIterSetNext
129c0 28 70 2c 20 70 49 74 65 72 29 3b 0a 0a 20 20 2f  (p, pIter);..  /
129d0 2a 20 45 69 74 68 65 72 3a 0a 20 20 2a 2a 0a 20  * Either:.  **. 
129e0 20 2a 2a 20 20 20 31 29 20 61 6e 20 65 72 72 6f   **   1) an erro
129f0 72 20 68 61 73 20 6f 63 63 75 72 72 65 64 2c 20  r has occurred, 
12a00 6f 72 0a 20 20 2a 2a 20 20 20 32 29 20 74 68 65  or.  **   2) the
12a10 20 69 74 65 72 61 74 6f 72 20 70 6f 69 6e 74 73   iterator points
12a20 20 74 6f 20 45 4f 46 2c 20 6f 72 0a 20 20 2a 2a   to EOF, or.  **
12a30 20 20 20 33 29 20 74 68 65 20 69 74 65 72 61 74     3) the iterat
12a40 6f 72 20 70 6f 69 6e 74 73 20 74 6f 20 61 6e 20  or points to an 
12a50 65 6e 74 72 79 20 77 69 74 68 20 74 65 72 6d 20  entry with term 
12a60 28 70 54 65 72 6d 2f 6e 54 65 72 6d 29 2c 20 6f  (pTerm/nTerm), o
12a70 72 0a 20 20 2a 2a 20 20 20 34 29 20 74 68 65 20  r.  **   4) the 
12a80 46 54 53 35 49 4e 44 45 58 5f 51 55 45 52 59 5f  FTS5INDEX_QUERY_
12a90 53 43 41 4e 20 66 6c 61 67 20 77 61 73 20 73 65  SCAN flag was se
12aa0 74 20 61 6e 64 20 74 68 65 20 69 74 65 72 61 74  t and the iterat
12ab0 6f 72 20 70 6f 69 6e 74 73 0a 20 20 2a 2a 20 20  or points.  **  
12ac0 20 20 20 20 74 6f 20 61 6e 20 65 6e 74 72 79 20      to an entry 
12ad0 77 69 74 68 20 61 20 74 65 72 6d 20 67 72 65 61  with a term grea
12ae0 74 65 72 20 74 68 61 6e 20 6f 72 20 65 71 75 61  ter than or equa
12af0 6c 20 74 6f 20 28 70 54 65 72 6d 2f 6e 54 65 72  l to (pTerm/nTer
12b00 6d 29 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  m)..  */.  asser
12b10 74 28 20 70 2d 3e 72 63 21 3d 53 51 4c 49 54 45  t( p->rc!=SQLITE
12b20 5f 4f 4b 20 20 20 20 20 20 20 20 20 20 20 20 20  _OK             
12b30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12b40 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
12b50 31 20 2a 2f 0a 20 20 20 7c 7c 20 70 49 74 65 72  1 */.   || pIter
12b60 2d 3e 70 4c 65 61 66 3d 3d 30 20 20 20 20 20 20  ->pLeaf==0      
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 20 20 20 20 20 20 2f 2a 20 32 20 2a 2f           /* 2 */
12ba0 0a 20 20 20 7c 7c 20 66 74 73 35 42 75 66 66 65  .   || fts5Buffe
12bb0 72 43 6f 6d 70 61 72 65 42 6c 6f 62 28 26 70 49  rCompareBlob(&pI
12bc0 74 65 72 2d 3e 74 65 72 6d 2c 20 70 54 65 72 6d  ter->term, pTerm
12bd0 2c 20 6e 54 65 72 6d 29 3d 3d 30 20 20 20 20 20  , nTerm)==0     
12be0 20 20 20 20 20 2f 2a 20 33 20 2a 2f 0a 20 20 20       /* 3 */.   
12bf0 7c 7c 20 28 62 47 65 20 26 26 20 66 74 73 35 42  || (bGe && fts5B
12c00 75 66 66 65 72 43 6f 6d 70 61 72 65 42 6c 6f 62  ufferCompareBlob
12c10 28 26 70 49 74 65 72 2d 3e 74 65 72 6d 2c 20 70  (&pIter->term, p
12c20 54 65 72 6d 2c 20 6e 54 65 72 6d 29 3e 30 29 20  Term, nTerm)>0) 
12c30 20 2f 2a 20 34 20 2a 2f 0a 20 20 29 3b 0a 7d 0a   /* 4 */.  );.}.
12c40 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a  ./*.** Initializ
12c50 65 20 74 68 65 20 6f 62 6a 65 63 74 20 70 49 74  e the object pIt
12c60 65 72 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74  er to point to t
12c70 65 72 6d 20 70 54 65 72 6d 2f 6e 54 65 72 6d 20  erm pTerm/nTerm 
12c80 77 69 74 68 69 6e 20 74 68 65 0a 2a 2a 20 69 6e  within the.** in
12c90 2d 6d 65 6d 6f 72 79 20 68 61 73 68 20 74 61 62  -memory hash tab
12ca0 6c 65 2e 20 49 66 20 74 68 65 72 65 20 69 73 20  le. If there is 
12cb0 6e 6f 20 73 75 63 68 20 74 65 72 6d 20 69 6e 20  no such term in 
12cc0 74 68 65 20 68 61 73 68 2d 74 61 62 6c 65 2c 20  the hash-table, 
12cd0 74 68 65 20 0a 2a 2a 20 69 74 65 72 61 74 6f 72  the .** iterator
12ce0 20 69 73 20 73 65 74 20 74 6f 20 45 4f 46 2e 0a   is set to EOF..
12cf0 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f  **.** If an erro
12d00 72 20 6f 63 63 75 72 73 2c 20 46 74 73 35 49 6e  r occurs, Fts5In
12d10 64 65 78 2e 72 63 20 69 73 20 73 65 74 20 74 6f  dex.rc is set to
12d20 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65 20   an appropriate 
12d30 65 72 72 6f 72 20 63 6f 64 65 2e 20 49 66 20 0a  error code. If .
12d40 2a 2a 20 61 6e 20 65 72 72 6f 72 20 68 61 73 20  ** an error has 
12d50 61 6c 72 65 61 64 79 20 6f 63 63 75 72 72 65 64  already occurred
12d60 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74   when this funct
12d70 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20 69  ion is called, i
12d80 74 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f  t is a no-op..*/
12d90 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
12da0 35 53 65 67 49 74 65 72 48 61 73 68 49 6e 69 74  5SegIterHashInit
12db0 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70  (.  Fts5Index *p
12dc0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
12dd0 20 20 20 20 2f 2a 20 46 54 53 35 20 62 61 63 6b      /* FTS5 back
12de0 65 6e 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 75  end */.  const u
12df0 38 20 2a 70 54 65 72 6d 2c 20 69 6e 74 20 6e 54  8 *pTerm, int nT
12e00 65 72 6d 2c 20 20 20 20 20 2f 2a 20 54 65 72 6d  erm,     /* Term
12e10 20 74 6f 20 73 65 65 6b 20 74 6f 20 2a 2f 0a 20   to seek to */. 
12e20 20 69 6e 74 20 66 6c 61 67 73 2c 20 20 20 20 20   int flags,     
12e30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12e40 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 46 54 53 35   /* Mask of FTS5
12e50 49 4e 44 45 58 5f 58 58 58 20 66 6c 61 67 73 20  INDEX_XXX flags 
12e60 2a 2f 0a 20 20 46 74 73 35 53 65 67 49 74 65 72  */.  Fts5SegIter
12e70 20 2a 70 49 74 65 72 20 20 20 20 20 20 20 20 20   *pIter         
12e80 20 20 20 20 20 2f 2a 20 4f 62 6a 65 63 74 20 74       /* Object t
12e90 6f 20 70 6f 70 75 6c 61 74 65 20 2a 2f 0a 29 7b  o populate */.){
12ea0 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 70 4c 69  .  const u8 *pLi
12eb0 73 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 4c  st = 0;.  int nL
12ec0 69 73 74 20 3d 20 30 3b 0a 20 20 63 6f 6e 73 74  ist = 0;.  const
12ed0 20 75 38 20 2a 7a 20 3d 20 30 3b 0a 20 20 69 6e   u8 *z = 0;.  in
12ee0 74 20 6e 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65  t n = 0;..  asse
12ef0 72 74 28 20 70 2d 3e 70 48 61 73 68 20 29 3b 0a  rt( p->pHash );.
12f00 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72 63 3d    assert( p->rc=
12f10 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 0a 20  =SQLITE_OK );.. 
12f20 20 69 66 28 20 70 54 65 72 6d 3d 3d 30 20 7c 7c   if( pTerm==0 ||
12f30 20 28 66 6c 61 67 73 20 26 20 46 54 53 35 49 4e   (flags & FTS5IN
12f40 44 45 58 5f 51 55 45 52 59 5f 53 43 41 4e 29 20  DEX_QUERY_SCAN) 
12f50 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 73  ){.    p->rc = s
12f60 71 6c 69 74 65 33 46 74 73 35 48 61 73 68 53 63  qlite3Fts5HashSc
12f70 61 6e 49 6e 69 74 28 70 2d 3e 70 48 61 73 68 2c  anInit(p->pHash,
12f80 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 70 54   (const char*)pT
12f90 65 72 6d 2c 20 6e 54 65 72 6d 29 3b 0a 20 20 20  erm, nTerm);.   
12fa0 20 73 71 6c 69 74 65 33 46 74 73 35 48 61 73 68   sqlite3Fts5Hash
12fb0 53 63 61 6e 45 6e 74 72 79 28 70 2d 3e 70 48 61  ScanEntry(p->pHa
12fc0 73 68 2c 20 28 63 6f 6e 73 74 20 63 68 61 72 2a  sh, (const char*
12fd0 2a 29 26 7a 2c 20 26 70 4c 69 73 74 2c 20 26 6e  *)&z, &pList, &n
12fe0 4c 69 73 74 29 3b 0a 20 20 20 20 6e 20 3d 20 28  List);.    n = (
12ff0 7a 20 3f 20 28 69 6e 74 29 73 74 72 6c 65 6e 28  z ? (int)strlen(
13000 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 7a 29 20  (const char*)z) 
13010 3a 20 30 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  : 0);.  }else{. 
13020 20 20 20 70 49 74 65 72 2d 3e 66 6c 61 67 73 20     pIter->flags 
13030 7c 3d 20 46 54 53 35 5f 53 45 47 49 54 45 52 5f  |= FTS5_SEGITER_
13040 4f 4e 45 54 45 52 4d 3b 0a 20 20 20 20 73 71 6c  ONETERM;.    sql
13050 69 74 65 33 46 74 73 35 48 61 73 68 51 75 65 72  ite3Fts5HashQuer
13060 79 28 70 2d 3e 70 48 61 73 68 2c 20 28 63 6f 6e  y(p->pHash, (con
13070 73 74 20 63 68 61 72 2a 29 70 54 65 72 6d 2c 20  st char*)pTerm, 
13080 6e 54 65 72 6d 2c 20 26 70 4c 69 73 74 2c 20 26  nTerm, &pList, &
13090 6e 4c 69 73 74 29 3b 0a 20 20 20 20 7a 20 3d 20  nList);.    z = 
130a0 70 54 65 72 6d 3b 0a 20 20 20 20 6e 20 3d 20 6e  pTerm;.    n = n
130b0 54 65 72 6d 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  Term;.  }..  if(
130c0 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 46 74   pList ){.    Ft
130d0 73 35 44 61 74 61 20 2a 70 4c 65 61 66 3b 0a 20  s5Data *pLeaf;. 
130e0 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 42 75     sqlite3Fts5Bu
130f0 66 66 65 72 53 65 74 28 26 70 2d 3e 72 63 2c 20  fferSet(&p->rc, 
13100 26 70 49 74 65 72 2d 3e 74 65 72 6d 2c 20 6e 2c  &pIter->term, n,
13110 20 7a 29 3b 0a 20 20 20 20 70 4c 65 61 66 20 3d   z);.    pLeaf =
13120 20 66 74 73 35 49 64 78 4d 61 6c 6c 6f 63 28 70   fts5IdxMalloc(p
13130 2c 20 73 69 7a 65 6f 66 28 46 74 73 35 44 61 74  , sizeof(Fts5Dat
13140 61 29 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 65  a));.    if( pLe
13150 61 66 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  af==0 ) return;.
13160 20 20 20 20 70 4c 65 61 66 2d 3e 70 20 3d 20 28      pLeaf->p = (
13170 75 38 2a 29 70 4c 69 73 74 3b 0a 20 20 20 20 70  u8*)pList;.    p
13180 4c 65 61 66 2d 3e 6e 6e 20 3d 20 70 4c 65 61 66  Leaf->nn = pLeaf
13190 2d 3e 73 7a 4c 65 61 66 20 3d 20 6e 4c 69 73 74  ->szLeaf = nList
131a0 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 70 4c 65  ;.    pIter->pLe
131b0 61 66 20 3d 20 70 4c 65 61 66 3b 0a 20 20 20 20  af = pLeaf;.    
131c0 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73  pIter->iLeafOffs
131d0 65 74 20 3d 20 66 74 73 35 47 65 74 56 61 72 69  et = fts5GetVari
131e0 6e 74 28 70 4c 65 61 66 2d 3e 70 2c 20 28 75 36  nt(pLeaf->p, (u6
131f0 34 2a 29 26 70 49 74 65 72 2d 3e 69 52 6f 77 69  4*)&pIter->iRowi
13200 64 29 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 69  d);.    pIter->i
13210 45 6e 64 6f 66 44 6f 63 6c 69 73 74 20 3d 20 70  EndofDoclist = p
13220 4c 65 61 66 2d 3e 6e 6e 3b 0a 0a 20 20 20 20 69  Leaf->nn;..    i
13230 66 28 20 66 6c 61 67 73 20 26 20 46 54 53 35 49  f( flags & FTS5I
13240 4e 44 45 58 5f 51 55 45 52 59 5f 44 45 53 43 20  NDEX_QUERY_DESC 
13250 29 7b 0a 20 20 20 20 20 20 70 49 74 65 72 2d 3e  ){.      pIter->
13260 66 6c 61 67 73 20 7c 3d 20 46 54 53 35 5f 53 45  flags |= FTS5_SE
13270 47 49 54 45 52 5f 52 45 56 45 52 53 45 3b 0a 20  GITER_REVERSE;. 
13280 20 20 20 20 20 66 74 73 35 53 65 67 49 74 65 72       fts5SegIter
13290 52 65 76 65 72 73 65 49 6e 69 74 50 61 67 65 28  ReverseInitPage(
132a0 70 2c 20 70 49 74 65 72 29 3b 0a 20 20 20 20 7d  p, pIter);.    }
132b0 65 6c 73 65 7b 0a 20 20 20 20 20 20 66 74 73 35  else{.      fts5
132c0 53 65 67 49 74 65 72 4c 6f 61 64 4e 50 6f 73 28  SegIterLoadNPos(
132d0 70 2c 20 70 49 74 65 72 29 3b 0a 20 20 20 20 7d  p, pIter);.    }
132e0 0a 20 20 7d 0a 0a 20 20 66 74 73 35 53 65 67 49  .  }..  fts5SegI
132f0 74 65 72 53 65 74 4e 65 78 74 28 70 2c 20 70 49  terSetNext(p, pI
13300 74 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 5a  ter);.}../*.** Z
13310 65 72 6f 20 74 68 65 20 69 74 65 72 61 74 6f 72  ero the iterator
13320 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 6f   passed as the o
13330 6e 6c 79 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f  nly argument..*/
13340 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
13350 35 53 65 67 49 74 65 72 43 6c 65 61 72 28 46 74  5SegIterClear(Ft
13360 73 35 53 65 67 49 74 65 72 20 2a 70 49 74 65 72  s5SegIter *pIter
13370 29 7b 0a 20 20 66 74 73 35 42 75 66 66 65 72 46  ){.  fts5BufferF
13380 72 65 65 28 26 70 49 74 65 72 2d 3e 74 65 72 6d  ree(&pIter->term
13390 29 3b 0a 20 20 66 74 73 35 44 61 74 61 52 65 6c  );.  fts5DataRel
133a0 65 61 73 65 28 70 49 74 65 72 2d 3e 70 4c 65 61  ease(pIter->pLea
133b0 66 29 3b 0a 20 20 66 74 73 35 44 61 74 61 52 65  f);.  fts5DataRe
133c0 6c 65 61 73 65 28 70 49 74 65 72 2d 3e 70 4e 65  lease(pIter->pNe
133d0 78 74 4c 65 61 66 29 3b 0a 20 20 66 74 73 35 44  xtLeaf);.  fts5D
133e0 6c 69 64 78 49 74 65 72 46 72 65 65 28 70 49 74  lidxIterFree(pIt
133f0 65 72 2d 3e 70 44 6c 69 64 78 29 3b 0a 20 20 73  er->pDlidx);.  s
13400 71 6c 69 74 65 33 5f 66 72 65 65 28 70 49 74 65  qlite3_free(pIte
13410 72 2d 3e 61 52 6f 77 69 64 4f 66 66 73 65 74 29  r->aRowidOffset)
13420 3b 0a 20 20 6d 65 6d 73 65 74 28 70 49 74 65 72  ;.  memset(pIter
13430 2c 20 30 2c 20 73 69 7a 65 6f 66 28 46 74 73 35  , 0, sizeof(Fts5
13440 53 65 67 49 74 65 72 29 29 3b 0a 7d 0a 0a 23 69  SegIter));.}..#i
13450 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
13460 47 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  G../*.** This fu
13470 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20 61  nction is used a
13480 73 20 70 61 72 74 20 6f 66 20 74 68 65 20 62 69  s part of the bi
13490 67 20 61 73 73 65 72 74 28 29 20 70 72 6f 63 65  g assert() proce
134a0 64 75 72 65 20 69 6d 70 6c 65 6d 65 6e 74 65 64  dure implemented
134b0 20 62 79 0a 2a 2a 20 66 74 73 35 41 73 73 65 72   by.** fts5Asser
134c0 74 4d 75 6c 74 69 49 74 65 72 53 65 74 75 70 28  tMultiIterSetup(
134d0 29 2e 20 49 74 20 65 6e 73 75 72 65 73 20 74 68  ). It ensures th
134e0 61 74 20 74 68 65 20 72 65 73 75 6c 74 20 63 75  at the result cu
134f0 72 72 65 6e 74 6c 79 20 73 74 6f 72 65 64 0a 2a  rrently stored.*
13500 2a 20 69 6e 20 2a 70 52 65 73 20 69 73 20 74 68  * in *pRes is th
13510 65 20 63 6f 72 72 65 63 74 20 72 65 73 75 6c 74  e correct result
13520 20 6f 66 20 63 6f 6d 70 61 72 69 6e 67 20 74 68   of comparing th
13530 65 20 63 75 72 72 65 6e 74 20 70 6f 73 69 74 69  e current positi
13540 6f 6e 73 20 6f 66 20 74 68 65 0a 2a 2a 20 74 77  ons of the.** tw
13550 6f 20 69 74 65 72 61 74 6f 72 73 2e 0a 2a 2f 0a  o iterators..*/.
13560 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
13570 41 73 73 65 72 74 43 6f 6d 70 61 72 69 73 6f 6e  AssertComparison
13580 52 65 73 75 6c 74 28 0a 20 20 46 74 73 35 49 74  Result(.  Fts5It
13590 65 72 20 2a 70 49 74 65 72 2c 20 0a 20 20 46 74  er *pIter, .  Ft
135a0 73 35 53 65 67 49 74 65 72 20 2a 70 31 2c 0a 20  s5SegIter *p1,. 
135b0 20 46 74 73 35 53 65 67 49 74 65 72 20 2a 70 32   Fts5SegIter *p2
135c0 2c 0a 20 20 46 74 73 35 43 52 65 73 75 6c 74 20  ,.  Fts5CResult 
135d0 2a 70 52 65 73 0a 29 7b 0a 20 20 69 6e 74 20 69  *pRes.){.  int i
135e0 31 20 3d 20 70 31 20 2d 20 70 49 74 65 72 2d 3e  1 = p1 - pIter->
135f0 61 53 65 67 3b 0a 20 20 69 6e 74 20 69 32 20 3d  aSeg;.  int i2 =
13600 20 70 32 20 2d 20 70 49 74 65 72 2d 3e 61 53 65   p2 - pIter->aSe
13610 67 3b 0a 0a 20 20 69 66 28 20 70 31 2d 3e 70 4c  g;..  if( p1->pL
13620 65 61 66 20 7c 7c 20 70 32 2d 3e 70 4c 65 61 66  eaf || p2->pLeaf
13630 20 29 7b 0a 20 20 20 20 69 66 28 20 70 31 2d 3e   ){.    if( p1->
13640 70 4c 65 61 66 3d 3d 30 20 29 7b 0a 20 20 20 20  pLeaf==0 ){.    
13650 20 20 61 73 73 65 72 74 28 20 70 52 65 73 2d 3e    assert( pRes->
13660 69 46 69 72 73 74 3d 3d 69 32 20 29 3b 0a 20 20  iFirst==i2 );.  
13670 20 20 7d 65 6c 73 65 20 69 66 28 20 70 32 2d 3e    }else if( p2->
13680 70 4c 65 61 66 3d 3d 30 20 29 7b 0a 20 20 20 20  pLeaf==0 ){.    
13690 20 20 61 73 73 65 72 74 28 20 70 52 65 73 2d 3e    assert( pRes->
136a0 69 46 69 72 73 74 3d 3d 69 31 20 29 3b 0a 20 20  iFirst==i1 );.  
136b0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69    }else{.      i
136c0 6e 74 20 6e 4d 69 6e 20 3d 20 4d 49 4e 28 70 31  nt nMin = MIN(p1
136d0 2d 3e 74 65 72 6d 2e 6e 2c 20 70 32 2d 3e 74 65  ->term.n, p2->te
136e0 72 6d 2e 6e 29 3b 0a 20 20 20 20 20 20 69 6e 74  rm.n);.      int
136f0 20 72 65 73 20 3d 20 6d 65 6d 63 6d 70 28 70 31   res = memcmp(p1
13700 2d 3e 74 65 72 6d 2e 70 2c 20 70 32 2d 3e 74 65  ->term.p, p2->te
13710 72 6d 2e 70 2c 20 6e 4d 69 6e 29 3b 0a 20 20 20  rm.p, nMin);.   
13720 20 20 20 69 66 28 20 72 65 73 3d 3d 30 20 29 20     if( res==0 ) 
13730 72 65 73 20 3d 20 70 31 2d 3e 74 65 72 6d 2e 6e  res = p1->term.n
13740 20 2d 20 70 32 2d 3e 74 65 72 6d 2e 6e 3b 0a 0a   - p2->term.n;..
13750 20 20 20 20 20 20 69 66 28 20 72 65 73 3d 3d 30        if( res==0
13760 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65   ){.        asse
13770 72 74 28 20 70 52 65 73 2d 3e 62 54 65 72 6d 45  rt( pRes->bTermE
13780 71 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 20 20  q==1 );.        
13790 61 73 73 65 72 74 28 20 70 31 2d 3e 69 52 6f 77  assert( p1->iRow
137a0 69 64 21 3d 70 32 2d 3e 69 52 6f 77 69 64 20 29  id!=p2->iRowid )
137b0 3b 0a 20 20 20 20 20 20 20 20 72 65 73 20 3d 20  ;.        res = 
137c0 28 28 70 31 2d 3e 69 52 6f 77 69 64 20 3e 20 70  ((p1->iRowid > p
137d0 32 2d 3e 69 52 6f 77 69 64 29 3d 3d 70 49 74 65  2->iRowid)==pIte
137e0 72 2d 3e 62 52 65 76 29 20 3f 20 2d 31 20 3a 20  r->bRev) ? -1 : 
137f0 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  1;.      }else{.
13800 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
13810 70 52 65 73 2d 3e 62 54 65 72 6d 45 71 3d 3d 30  pRes->bTermEq==0
13820 20 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20   );.      }..   
13830 20 20 20 69 66 28 20 72 65 73 3c 30 20 29 7b 0a     if( res<0 ){.
13840 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
13850 70 52 65 73 2d 3e 69 46 69 72 73 74 3d 3d 69 31  pRes->iFirst==i1
13860 20 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b   );.      }else{
13870 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
13880 20 70 52 65 73 2d 3e 69 46 69 72 73 74 3d 3d 69   pRes->iFirst==i
13890 32 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  2 );.      }.   
138a0 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
138b0 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
138c0 20 61 20 6e 6f 2d 6f 70 20 75 6e 6c 65 73 73 20   a no-op unless 
138d0 53 51 4c 49 54 45 5f 44 45 42 55 47 20 69 73 20  SQLITE_DEBUG is 
138e0 64 65 66 69 6e 65 64 20 77 68 65 6e 20 74 68 69  defined when thi
138f0 73 20 6d 6f 64 75 6c 65 0a 2a 2a 20 69 73 20 63  s module.** is c
13900 6f 6d 70 69 6c 65 64 2e 20 49 6e 20 74 68 61 74  ompiled. In that
13910 20 63 61 73 65 2c 20 74 68 69 73 20 66 75 6e 63   case, this func
13920 74 69 6f 6e 20 69 73 20 65 73 73 65 6e 74 69 61  tion is essentia
13930 6c 6c 79 20 61 6e 20 61 73 73 65 72 74 28 29 20  lly an assert() 
13940 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 75 73  .** statement us
13950 65 64 20 74 6f 20 76 65 72 69 66 79 20 74 68 61  ed to verify tha
13960 74 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  t the contents o
13970 66 20 74 68 65 20 70 49 74 65 72 2d 3e 61 46 69  f the pIter->aFi
13980 72 73 74 5b 5d 20 61 72 72 61 79 0a 2a 2a 20 61  rst[] array.** a
13990 72 65 20 63 6f 72 72 65 63 74 2e 0a 2a 2f 0a 73  re correct..*/.s
139a0 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 41  tatic void fts5A
139b0 73 73 65 72 74 4d 75 6c 74 69 49 74 65 72 53 65  ssertMultiIterSe
139c0 74 75 70 28 46 74 73 35 49 6e 64 65 78 20 2a 70  tup(Fts5Index *p
139d0 2c 20 46 74 73 35 49 74 65 72 20 2a 70 49 74 65  , Fts5Iter *pIte
139e0 72 29 7b 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d  r){.  if( p->rc=
139f0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
13a00 20 20 46 74 73 35 53 65 67 49 74 65 72 20 2a 70    Fts5SegIter *p
13a10 46 69 72 73 74 20 3d 20 26 70 49 74 65 72 2d 3e  First = &pIter->
13a20 61 53 65 67 5b 20 70 49 74 65 72 2d 3e 61 46 69  aSeg[ pIter->aFi
13a30 72 73 74 5b 31 5d 2e 69 46 69 72 73 74 20 5d 3b  rst[1].iFirst ];
13a40 0a 20 20 20 20 69 6e 74 20 69 3b 0a 0a 20 20 20  .    int i;..   
13a50 20 61 73 73 65 72 74 28 20 28 70 46 69 72 73 74   assert( (pFirst
13a60 2d 3e 70 4c 65 61 66 3d 3d 30 29 3d 3d 70 49 74  ->pLeaf==0)==pIt
13a70 65 72 2d 3e 62 61 73 65 2e 62 45 6f 66 20 29 3b  er->base.bEof );
13a80 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74  ..    /* Check t
13a90 68 61 74 20 70 49 74 65 72 2d 3e 69 53 77 69 74  hat pIter->iSwit
13aa0 63 68 52 6f 77 69 64 20 69 73 20 73 65 74 20 63  chRowid is set c
13ab0 6f 72 72 65 63 74 6c 79 2e 20 2a 2f 0a 20 20 20  orrectly. */.   
13ac0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49 74 65   for(i=0; i<pIte
13ad0 72 2d 3e 6e 53 65 67 3b 20 69 2b 2b 29 7b 0a 20  r->nSeg; i++){. 
13ae0 20 20 20 20 20 46 74 73 35 53 65 67 49 74 65 72       Fts5SegIter
13af0 20 2a 70 31 20 3d 20 26 70 49 74 65 72 2d 3e 61   *p1 = &pIter->a
13b00 53 65 67 5b 69 5d 3b 0a 20 20 20 20 20 20 61 73  Seg[i];.      as
13b10 73 65 72 74 28 20 70 31 3d 3d 70 46 69 72 73 74  sert( p1==pFirst
13b20 20 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20   .           || 
13b30 70 31 2d 3e 70 4c 65 61 66 3d 3d 30 20 0a 20 20  p1->pLeaf==0 .  
13b40 20 20 20 20 20 20 20 20 20 7c 7c 20 66 74 73 35           || fts5
13b50 42 75 66 66 65 72 43 6f 6d 70 61 72 65 28 26 70  BufferCompare(&p
13b60 46 69 72 73 74 2d 3e 74 65 72 6d 2c 20 26 70 31  First->term, &p1
13b70 2d 3e 74 65 72 6d 29 20 0a 20 20 20 20 20 20 20  ->term) .       
13b80 20 20 20 20 7c 7c 20 70 31 2d 3e 69 52 6f 77 69      || p1->iRowi
13b90 64 3d 3d 70 49 74 65 72 2d 3e 69 53 77 69 74 63  d==pIter->iSwitc
13ba0 68 52 6f 77 69 64 0a 20 20 20 20 20 20 20 20 20  hRowid.         
13bb0 20 20 7c 7c 20 28 70 31 2d 3e 69 52 6f 77 69 64    || (p1->iRowid
13bc0 3c 70 49 74 65 72 2d 3e 69 53 77 69 74 63 68 52  <pIter->iSwitchR
13bd0 6f 77 69 64 29 3d 3d 70 49 74 65 72 2d 3e 62 52  owid)==pIter->bR
13be0 65 76 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20  ev.      );.    
13bf0 7d 0a 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  }..    for(i=0; 
13c00 69 3c 70 49 74 65 72 2d 3e 6e 53 65 67 3b 20 69  i<pIter->nSeg; i
13c10 2b 3d 32 29 7b 0a 20 20 20 20 20 20 46 74 73 35  +=2){.      Fts5
13c20 53 65 67 49 74 65 72 20 2a 70 31 20 3d 20 26 70  SegIter *p1 = &p
13c30 49 74 65 72 2d 3e 61 53 65 67 5b 69 5d 3b 0a 20  Iter->aSeg[i];. 
13c40 20 20 20 20 20 46 74 73 35 53 65 67 49 74 65 72       Fts5SegIter
13c50 20 2a 70 32 20 3d 20 26 70 49 74 65 72 2d 3e 61   *p2 = &pIter->a
13c60 53 65 67 5b 69 2b 31 5d 3b 0a 20 20 20 20 20 20  Seg[i+1];.      
13c70 46 74 73 35 43 52 65 73 75 6c 74 20 2a 70 52 65  Fts5CResult *pRe
13c80 73 20 3d 20 26 70 49 74 65 72 2d 3e 61 46 69 72  s = &pIter->aFir
13c90 73 74 5b 28 70 49 74 65 72 2d 3e 6e 53 65 67 20  st[(pIter->nSeg 
13ca0 2b 20 69 29 20 2f 20 32 5d 3b 0a 20 20 20 20 20  + i) / 2];.     
13cb0 20 66 74 73 35 41 73 73 65 72 74 43 6f 6d 70 61   fts5AssertCompa
13cc0 72 69 73 6f 6e 52 65 73 75 6c 74 28 70 49 74 65  risonResult(pIte
13cd0 72 2c 20 70 31 2c 20 70 32 2c 20 70 52 65 73 29  r, p1, p2, pRes)
13ce0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 66 6f 72  ;.    }..    for
13cf0 28 69 3d 31 3b 20 69 3c 28 70 49 74 65 72 2d 3e  (i=1; i<(pIter->
13d00 6e 53 65 67 20 2f 20 32 29 3b 20 69 2b 3d 32 29  nSeg / 2); i+=2)
13d10 7b 0a 20 20 20 20 20 20 46 74 73 35 53 65 67 49  {.      Fts5SegI
13d20 74 65 72 20 2a 70 31 20 3d 20 26 70 49 74 65 72  ter *p1 = &pIter
13d30 2d 3e 61 53 65 67 5b 20 70 49 74 65 72 2d 3e 61  ->aSeg[ pIter->a
13d40 46 69 72 73 74 5b 69 2a 32 5d 2e 69 46 69 72 73  First[i*2].iFirs
13d50 74 20 5d 3b 0a 20 20 20 20 20 20 46 74 73 35 53  t ];.      Fts5S
13d60 65 67 49 74 65 72 20 2a 70 32 20 3d 20 26 70 49  egIter *p2 = &pI
13d70 74 65 72 2d 3e 61 53 65 67 5b 20 70 49 74 65 72  ter->aSeg[ pIter
13d80 2d 3e 61 46 69 72 73 74 5b 69 2a 32 2b 31 5d 2e  ->aFirst[i*2+1].
13d90 69 46 69 72 73 74 20 5d 3b 0a 20 20 20 20 20 20  iFirst ];.      
13da0 46 74 73 35 43 52 65 73 75 6c 74 20 2a 70 52 65  Fts5CResult *pRe
13db0 73 20 3d 20 26 70 49 74 65 72 2d 3e 61 46 69 72  s = &pIter->aFir
13dc0 73 74 5b 69 5d 3b 0a 20 20 20 20 20 20 66 74 73  st[i];.      fts
13dd0 35 41 73 73 65 72 74 43 6f 6d 70 61 72 69 73 6f  5AssertCompariso
13de0 6e 52 65 73 75 6c 74 28 70 49 74 65 72 2c 20 70  nResult(pIter, p
13df0 31 2c 20 70 32 2c 20 70 52 65 73 29 3b 0a 20 20  1, p2, pRes);.  
13e00 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a    }.  }.}.#else.
13e10 23 20 64 65 66 69 6e 65 20 66 74 73 35 41 73 73  # define fts5Ass
13e20 65 72 74 4d 75 6c 74 69 49 74 65 72 53 65 74 75  ertMultiIterSetu
13e30 70 28 78 2c 79 29 0a 23 65 6e 64 69 66 0a 0a 2f  p(x,y).#endif../
13e40 2a 0a 2a 2a 20 44 6f 20 74 68 65 20 63 6f 6d 70  *.** Do the comp
13e50 61 72 69 73 6f 6e 20 6e 65 63 65 73 73 61 72 79  arison necessary
13e60 20 74 6f 20 70 6f 70 75 6c 61 74 65 20 70 49 74   to populate pIt
13e70 65 72 2d 3e 61 46 69 72 73 74 5b 69 4f 75 74 5d  er->aFirst[iOut]
13e80 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 72  ..**.** If the r
13e90 65 74 75 72 6e 65 64 20 76 61 6c 75 65 20 69 73  eturned value is
13ea0 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20   non-zero, then 
13eb0 69 74 20 69 73 20 74 68 65 20 69 6e 64 65 78 20  it is the index 
13ec0 6f 66 20 61 6e 20 65 6e 74 72 79 0a 2a 2a 20 69  of an entry.** i
13ed0 6e 20 74 68 65 20 70 49 74 65 72 2d 3e 61 53 65  n the pIter->aSe
13ee0 67 5b 5d 20 61 72 72 61 79 20 74 68 61 74 20 69  g[] array that i
13ef0 73 20 28 61 29 20 6e 6f 74 20 61 74 20 45 4f 46  s (a) not at EOF
13f00 2c 20 61 6e 64 20 28 62 29 20 70 6f 69 6e 74 69  , and (b) pointi
13f10 6e 67 0a 2a 2a 20 74 6f 20 61 20 6b 65 79 20 74  ng.** to a key t
13f20 68 61 74 20 69 73 20 61 20 64 75 70 6c 69 63 61  hat is a duplica
13f30 74 65 20 6f 66 20 61 6e 6f 74 68 65 72 2c 20 68  te of another, h
13f40 69 67 68 65 72 20 70 72 69 6f 72 69 74 79 2c 20  igher priority, 
13f50 0a 2a 2a 20 73 65 67 6d 65 6e 74 2d 69 74 65 72  .** segment-iter
13f60 61 74 6f 72 20 69 6e 20 74 68 65 20 70 53 65 67  ator in the pSeg
13f70 2d 3e 61 53 65 67 5b 5d 20 61 72 72 61 79 2e 0a  ->aSeg[] array..
13f80 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74  */.static int ft
13f90 73 35 4d 75 6c 74 69 49 74 65 72 44 6f 43 6f 6d  s5MultiIterDoCom
13fa0 70 61 72 65 28 46 74 73 35 49 74 65 72 20 2a 70  pare(Fts5Iter *p
13fb0 49 74 65 72 2c 20 69 6e 74 20 69 4f 75 74 29 7b  Iter, int iOut){
13fc0 0a 20 20 69 6e 74 20 69 31 3b 20 20 20 20 20 20  .  int i1;      
13fd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13fe0 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 6c     /* Index of l
13ff0 65 66 74 2d 68 61 6e 64 20 46 74 73 35 53 65 67  eft-hand Fts5Seg
14000 49 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 69 32  Iter */.  int i2
14010 3b 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 20 2f 2a 20 49 6e 64            /* Ind
14030 65 78 20 6f 66 20 72 69 67 68 74 2d 68 61 6e 64  ex of right-hand
14040 20 46 74 73 35 53 65 67 49 74 65 72 20 2a 2f 0a   Fts5SegIter */.
14050 20 20 69 6e 74 20 69 52 65 73 3b 0a 20 20 46 74    int iRes;.  Ft
14060 73 35 53 65 67 49 74 65 72 20 2a 70 31 3b 20 20  s5SegIter *p1;  
14070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
14080 20 4c 65 66 74 2d 68 61 6e 64 20 46 74 73 35 53   Left-hand Fts5S
14090 65 67 49 74 65 72 20 2a 2f 0a 20 20 46 74 73 35  egIter */.  Fts5
140a0 53 65 67 49 74 65 72 20 2a 70 32 3b 20 20 20 20  SegIter *p2;    
140b0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
140c0 69 67 68 74 2d 68 61 6e 64 20 46 74 73 35 53 65  ight-hand Fts5Se
140d0 67 49 74 65 72 20 2a 2f 0a 20 20 46 74 73 35 43  gIter */.  Fts5C
140e0 52 65 73 75 6c 74 20 2a 70 52 65 73 20 3d 20 26  Result *pRes = &
140f0 70 49 74 65 72 2d 3e 61 46 69 72 73 74 5b 69 4f  pIter->aFirst[iO
14100 75 74 5d 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  ut];..  assert( 
14110 69 4f 75 74 3c 70 49 74 65 72 2d 3e 6e 53 65 67  iOut<pIter->nSeg
14120 20 26 26 20 69 4f 75 74 3e 30 20 29 3b 0a 20 20   && iOut>0 );.  
14130 61 73 73 65 72 74 28 20 70 49 74 65 72 2d 3e 62  assert( pIter->b
14140 52 65 76 3d 3d 30 20 7c 7c 20 70 49 74 65 72 2d  Rev==0 || pIter-
14150 3e 62 52 65 76 3d 3d 31 20 29 3b 0a 0a 20 20 69  >bRev==1 );..  i
14160 66 28 20 69 4f 75 74 3e 3d 28 70 49 74 65 72 2d  f( iOut>=(pIter-
14170 3e 6e 53 65 67 2f 32 29 20 29 7b 0a 20 20 20 20  >nSeg/2) ){.    
14180 69 31 20 3d 20 28 69 4f 75 74 20 2d 20 70 49 74  i1 = (iOut - pIt
14190 65 72 2d 3e 6e 53 65 67 2f 32 29 20 2a 20 32 3b  er->nSeg/2) * 2;
141a0 0a 20 20 20 20 69 32 20 3d 20 69 31 20 2b 20 31  .    i2 = i1 + 1
141b0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  ;.  }else{.    i
141c0 31 20 3d 20 70 49 74 65 72 2d 3e 61 46 69 72 73  1 = pIter->aFirs
141d0 74 5b 69 4f 75 74 2a 32 5d 2e 69 46 69 72 73 74  t[iOut*2].iFirst
141e0 3b 0a 20 20 20 20 69 32 20 3d 20 70 49 74 65 72  ;.    i2 = pIter
141f0 2d 3e 61 46 69 72 73 74 5b 69 4f 75 74 2a 32 2b  ->aFirst[iOut*2+
14200 31 5d 2e 69 46 69 72 73 74 3b 0a 20 20 7d 0a 20  1].iFirst;.  }. 
14210 20 70 31 20 3d 20 26 70 49 74 65 72 2d 3e 61 53   p1 = &pIter->aS
14220 65 67 5b 69 31 5d 3b 0a 20 20 70 32 20 3d 20 26  eg[i1];.  p2 = &
14230 70 49 74 65 72 2d 3e 61 53 65 67 5b 69 32 5d 3b  pIter->aSeg[i2];
14240 0a 0a 20 20 70 52 65 73 2d 3e 62 54 65 72 6d 45  ..  pRes->bTermE
14250 71 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 31 2d  q = 0;.  if( p1-
14260 3e 70 4c 65 61 66 3d 3d 30 20 29 7b 20 20 20 20  >pLeaf==0 ){    
14270 20 20 20 20 20 20 20 2f 2a 20 49 66 20 70 31 20         /* If p1 
14280 69 73 20 61 74 20 45 4f 46 20 2a 2f 0a 20 20 20  is at EOF */.   
14290 20 69 52 65 73 20 3d 20 69 32 3b 0a 20 20 7d 65   iRes = i2;.  }e
142a0 6c 73 65 20 69 66 28 20 70 32 2d 3e 70 4c 65 61  lse if( p2->pLea
142b0 66 3d 3d 30 20 29 7b 20 20 20 20 20 2f 2a 20 49  f==0 ){     /* I
142c0 66 20 70 32 20 69 73 20 61 74 20 45 4f 46 20 2a  f p2 is at EOF *
142d0 2f 0a 20 20 20 20 69 52 65 73 20 3d 20 69 31 3b  /.    iRes = i1;
142e0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e  .  }else{.    in
142f0 74 20 72 65 73 20 3d 20 66 74 73 35 42 75 66 66  t res = fts5Buff
14300 65 72 43 6f 6d 70 61 72 65 28 26 70 31 2d 3e 74  erCompare(&p1->t
14310 65 72 6d 2c 20 26 70 32 2d 3e 74 65 72 6d 29 3b  erm, &p2->term);
14320 0a 20 20 20 20 69 66 28 20 72 65 73 3d 3d 30 20  .    if( res==0 
14330 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
14340 20 69 32 3e 69 31 20 29 3b 0a 20 20 20 20 20 20   i2>i1 );.      
14350 61 73 73 65 72 74 28 20 69 32 21 3d 30 20 29 3b  assert( i2!=0 );
14360 0a 20 20 20 20 20 20 70 52 65 73 2d 3e 62 54 65  .      pRes->bTe
14370 72 6d 45 71 20 3d 20 31 3b 0a 20 20 20 20 20 20  rmEq = 1;.      
14380 69 66 28 20 70 31 2d 3e 69 52 6f 77 69 64 3d 3d  if( p1->iRowid==
14390 70 32 2d 3e 69 52 6f 77 69 64 20 29 7b 0a 20 20  p2->iRowid ){.  
143a0 20 20 20 20 20 20 70 31 2d 3e 62 44 65 6c 20 3d        p1->bDel =
143b0 20 70 32 2d 3e 62 44 65 6c 3b 0a 20 20 20 20 20   p2->bDel;.     
143c0 20 20 20 72 65 74 75 72 6e 20 69 32 3b 0a 20 20     return i2;.  
143d0 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 73 20      }.      res 
143e0 3d 20 28 28 70 31 2d 3e 69 52 6f 77 69 64 20 3e  = ((p1->iRowid >
143f0 20 70 32 2d 3e 69 52 6f 77 69 64 29 3d 3d 70 49   p2->iRowid)==pI
14400 74 65 72 2d 3e 62 52 65 76 29 20 3f 20 2d 31 20  ter->bRev) ? -1 
14410 3a 20 2b 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20  : +1;.    }.    
14420 61 73 73 65 72 74 28 20 72 65 73 21 3d 30 20 29  assert( res!=0 )
14430 3b 0a 20 20 20 20 69 66 28 20 72 65 73 3c 30 20  ;.    if( res<0 
14440 29 7b 0a 20 20 20 20 20 20 69 52 65 73 20 3d 20  ){.      iRes = 
14450 69 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  i1;.    }else{. 
14460 20 20 20 20 20 69 52 65 73 20 3d 20 69 32 3b 0a       iRes = i2;.
14470 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 52 65      }.  }..  pRe
14480 73 2d 3e 69 46 69 72 73 74 20 3d 20 28 75 31 36  s->iFirst = (u16
14490 29 69 52 65 73 3b 0a 20 20 72 65 74 75 72 6e 20  )iRes;.  return 
144a0 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65  0;.}../*.** Move
144b0 20 74 68 65 20 73 65 67 2d 69 74 65 72 20 73 6f   the seg-iter so
144c0 20 74 68 61 74 20 69 74 20 70 6f 69 6e 74 73 20   that it points 
144d0 74 6f 20 74 68 65 20 66 69 72 73 74 20 72 6f 77  to the first row
144e0 69 64 20 6f 6e 20 70 61 67 65 20 69 4c 65 61 66  id on page iLeaf
144f0 50 67 6e 6f 2e 0a 2a 2a 20 49 74 20 69 73 20 61  Pgno..** It is a
14500 6e 20 65 72 72 6f 72 20 69 66 20 6c 65 61 66 20  n error if leaf 
14510 69 4c 65 61 66 50 67 6e 6f 20 64 6f 65 73 20 6e  iLeafPgno does n
14520 6f 74 20 65 78 69 73 74 20 6f 72 20 63 6f 6e 74  ot exist or cont
14530 61 69 6e 73 20 6e 6f 20 72 6f 77 69 64 73 2e 0a  ains no rowids..
14540 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
14550 74 73 35 53 65 67 49 74 65 72 47 6f 74 6f 50 61  ts5SegIterGotoPa
14560 67 65 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20  ge(.  Fts5Index 
14570 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  *p,             
14580 20 20 20 20 20 20 2f 2a 20 46 54 53 35 20 62 61        /* FTS5 ba
14590 63 6b 65 6e 64 20 6f 62 6a 65 63 74 20 2a 2f 0a  ckend object */.
145a0 20 20 46 74 73 35 53 65 67 49 74 65 72 20 2a 70    Fts5SegIter *p
145b0 49 74 65 72 2c 20 20 20 20 20 20 20 20 20 20 20  Iter,           
145c0 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 74 6f    /* Iterator to
145d0 20 61 64 76 61 6e 63 65 20 2a 2f 0a 20 20 69 6e   advance */.  in
145e0 74 20 69 4c 65 61 66 50 67 6e 6f 0a 29 7b 0a 20  t iLeafPgno.){. 
145f0 20 61 73 73 65 72 74 28 20 69 4c 65 61 66 50 67   assert( iLeafPg
14600 6e 6f 3e 70 49 74 65 72 2d 3e 69 4c 65 61 66 50  no>pIter->iLeafP
14610 67 6e 6f 20 29 3b 0a 0a 20 20 69 66 28 20 69 4c  gno );..  if( iL
14620 65 61 66 50 67 6e 6f 3e 70 49 74 65 72 2d 3e 70  eafPgno>pIter->p
14630 53 65 67 2d 3e 70 67 6e 6f 4c 61 73 74 20 29 7b  Seg->pgnoLast ){
14640 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 46 54 53  .    p->rc = FTS
14650 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20 7d 65 6c  5_CORRUPT;.  }el
14660 73 65 7b 0a 20 20 20 20 66 74 73 35 44 61 74 61  se{.    fts5Data
14670 52 65 6c 65 61 73 65 28 70 49 74 65 72 2d 3e 70  Release(pIter->p
14680 4e 65 78 74 4c 65 61 66 29 3b 0a 20 20 20 20 70  NextLeaf);.    p
14690 49 74 65 72 2d 3e 70 4e 65 78 74 4c 65 61 66 20  Iter->pNextLeaf 
146a0 3d 20 30 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e  = 0;.    pIter->
146b0 69 4c 65 61 66 50 67 6e 6f 20 3d 20 69 4c 65 61  iLeafPgno = iLea
146c0 66 50 67 6e 6f 2d 31 3b 0a 20 20 20 20 66 74 73  fPgno-1;.    fts
146d0 35 53 65 67 49 74 65 72 4e 65 78 74 50 61 67 65  5SegIterNextPage
146e0 28 70 2c 20 70 49 74 65 72 29 3b 0a 20 20 20 20  (p, pIter);.    
146f0 61 73 73 65 72 74 28 20 70 2d 3e 72 63 21 3d 53  assert( p->rc!=S
14700 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 49 74 65  QLITE_OK || pIte
14710 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 3d 3d 69 4c  r->iLeafPgno==iL
14720 65 61 66 50 67 6e 6f 20 29 3b 0a 0a 20 20 20 20  eafPgno );..    
14730 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  if( p->rc==SQLIT
14740 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69 6e  E_OK ){.      in
14750 74 20 69 4f 66 66 3b 0a 20 20 20 20 20 20 75 38  t iOff;.      u8
14760 20 2a 61 20 3d 20 70 49 74 65 72 2d 3e 70 4c 65   *a = pIter->pLe
14770 61 66 2d 3e 70 3b 0a 20 20 20 20 20 20 69 6e 74  af->p;.      int
14780 20 6e 20 3d 20 70 49 74 65 72 2d 3e 70 4c 65 61   n = pIter->pLea
14790 66 2d 3e 73 7a 4c 65 61 66 3b 0a 0a 20 20 20 20  f->szLeaf;..    
147a0 20 20 69 4f 66 66 20 3d 20 66 74 73 35 4c 65 61    iOff = fts5Lea
147b0 66 46 69 72 73 74 52 6f 77 69 64 4f 66 66 28 70  fFirstRowidOff(p
147c0 49 74 65 72 2d 3e 70 4c 65 61 66 29 3b 0a 20 20  Iter->pLeaf);.  
147d0 20 20 20 20 69 66 28 20 69 4f 66 66 3c 34 20 7c      if( iOff<4 |
147e0 7c 20 69 4f 66 66 3e 3d 6e 20 29 7b 0a 20 20 20  | iOff>=n ){.   
147f0 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 46 54 53       p->rc = FTS
14800 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20 20 20  5_CORRUPT;.     
14810 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
14820 69 4f 66 66 20 2b 3d 20 66 74 73 35 47 65 74 56  iOff += fts5GetV
14830 61 72 69 6e 74 28 26 61 5b 69 4f 66 66 5d 2c 20  arint(&a[iOff], 
14840 28 75 36 34 2a 29 26 70 49 74 65 72 2d 3e 69 52  (u64*)&pIter->iR
14850 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 20 20 70  owid);.        p
14860 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65  Iter->iLeafOffse
14870 74 20 3d 20 69 4f 66 66 3b 0a 20 20 20 20 20 20  t = iOff;.      
14880 20 20 66 74 73 35 53 65 67 49 74 65 72 4c 6f 61    fts5SegIterLoa
14890 64 4e 50 6f 73 28 70 2c 20 70 49 74 65 72 29 3b  dNPos(p, pIter);
148a0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
148b0 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 76 61   }.}../*.** Adva
148c0 6e 63 65 20 74 68 65 20 69 74 65 72 61 74 6f 72  nce the iterator
148d0 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73   passed as the s
148e0 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 75  econd argument u
148f0 6e 74 69 6c 20 69 74 20 69 73 20 61 74 20 6f 72  ntil it is at or
14900 20 0a 2a 2a 20 70 61 73 74 20 72 6f 77 69 64 20   .** past rowid 
14910 69 46 72 6f 6d 2e 20 52 65 67 61 72 64 6c 65 73  iFrom. Regardles
14920 73 20 6f 66 20 74 68 65 20 76 61 6c 75 65 20 6f  s of the value o
14930 66 20 69 46 72 6f 6d 2c 20 74 68 65 20 69 74 65  f iFrom, the ite
14940 72 61 74 6f 72 20 69 73 0a 2a 2a 20 61 6c 77 61  rator is.** alwa
14950 79 73 20 61 64 76 61 6e 63 65 64 20 61 74 20 6c  ys advanced at l
14960 65 61 73 74 20 6f 6e 63 65 2e 0a 2a 2f 0a 73 74  east once..*/.st
14970 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 53 65  atic void fts5Se
14980 67 49 74 65 72 4e 65 78 74 46 72 6f 6d 28 0a 20  gIterNextFrom(. 
14990 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 20   Fts5Index *p,  
149a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
149b0 20 2f 2a 20 46 54 53 35 20 62 61 63 6b 65 6e 64   /* FTS5 backend
149c0 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 46 74 73   object */.  Fts
149d0 35 53 65 67 49 74 65 72 20 2a 70 49 74 65 72 2c  5SegIter *pIter,
149e0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
149f0 49 74 65 72 61 74 6f 72 20 74 6f 20 61 64 76 61  Iterator to adva
14a00 6e 63 65 20 2a 2f 0a 20 20 69 36 34 20 69 4d 61  nce */.  i64 iMa
14a10 74 63 68 20 20 20 20 20 20 20 20 20 20 20 20 20  tch             
14a20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 76 61           /* Adva
14a30 6e 63 65 20 69 74 65 72 61 74 6f 72 20 61 74 20  nce iterator at 
14a40 6c 65 61 73 74 20 74 68 69 73 20 66 61 72 20 2a  least this far *
14a50 2f 0a 29 7b 0a 20 20 69 6e 74 20 62 52 65 76 20  /.){.  int bRev 
14a60 3d 20 28 70 49 74 65 72 2d 3e 66 6c 61 67 73 20  = (pIter->flags 
14a70 26 20 46 54 53 35 5f 53 45 47 49 54 45 52 5f 52  & FTS5_SEGITER_R
14a80 45 56 45 52 53 45 29 3b 0a 20 20 46 74 73 35 44  EVERSE);.  Fts5D
14a90 6c 69 64 78 49 74 65 72 20 2a 70 44 6c 69 64 78  lidxIter *pDlidx
14aa0 20 3d 20 70 49 74 65 72 2d 3e 70 44 6c 69 64 78   = pIter->pDlidx
14ab0 3b 0a 20 20 69 6e 74 20 69 4c 65 61 66 50 67 6e  ;.  int iLeafPgn
14ac0 6f 20 3d 20 70 49 74 65 72 2d 3e 69 4c 65 61 66  o = pIter->iLeaf
14ad0 50 67 6e 6f 3b 0a 20 20 69 6e 74 20 62 4d 6f 76  Pgno;.  int bMov
14ae0 65 20 3d 20 31 3b 0a 0a 20 20 61 73 73 65 72 74  e = 1;..  assert
14af0 28 20 70 49 74 65 72 2d 3e 66 6c 61 67 73 20 26  ( pIter->flags &
14b00 20 46 54 53 35 5f 53 45 47 49 54 45 52 5f 4f 4e   FTS5_SEGITER_ON
14b10 45 54 45 52 4d 20 29 3b 0a 20 20 61 73 73 65 72  ETERM );.  asser
14b20 74 28 20 70 49 74 65 72 2d 3e 70 44 6c 69 64 78  t( pIter->pDlidx
14b30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 49   );.  assert( pI
14b40 74 65 72 2d 3e 70 4c 65 61 66 20 29 3b 0a 0a 20  ter->pLeaf );.. 
14b50 20 69 66 28 20 62 52 65 76 3d 3d 30 20 29 7b 0a   if( bRev==0 ){.
14b60 20 20 20 20 77 68 69 6c 65 28 20 21 66 74 73 35      while( !fts5
14b70 44 6c 69 64 78 49 74 65 72 45 6f 66 28 70 2c 20  DlidxIterEof(p, 
14b80 70 44 6c 69 64 78 29 20 26 26 20 69 4d 61 74 63  pDlidx) && iMatc
14b90 68 3e 66 74 73 35 44 6c 69 64 78 49 74 65 72 52  h>fts5DlidxIterR
14ba0 6f 77 69 64 28 70 44 6c 69 64 78 29 20 29 7b 0a  owid(pDlidx) ){.
14bb0 20 20 20 20 20 20 69 4c 65 61 66 50 67 6e 6f 20        iLeafPgno 
14bc0 3d 20 66 74 73 35 44 6c 69 64 78 49 74 65 72 50  = fts5DlidxIterP
14bd0 67 6e 6f 28 70 44 6c 69 64 78 29 3b 0a 20 20 20  gno(pDlidx);.   
14be0 20 20 20 66 74 73 35 44 6c 69 64 78 49 74 65 72     fts5DlidxIter
14bf0 4e 65 78 74 28 70 2c 20 70 44 6c 69 64 78 29 3b  Next(p, pDlidx);
14c00 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72  .    }.    asser
14c10 74 5f 6e 63 28 20 69 4c 65 61 66 50 67 6e 6f 3e  t_nc( iLeafPgno>
14c20 3d 70 49 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e  =pIter->iLeafPgn
14c30 6f 20 7c 7c 20 70 2d 3e 72 63 20 29 3b 0a 20 20  o || p->rc );.  
14c40 20 20 69 66 28 20 69 4c 65 61 66 50 67 6e 6f 3e    if( iLeafPgno>
14c50 70 49 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f  pIter->iLeafPgno
14c60 20 29 7b 0a 20 20 20 20 20 20 66 74 73 35 53 65   ){.      fts5Se
14c70 67 49 74 65 72 47 6f 74 6f 50 61 67 65 28 70 2c  gIterGotoPage(p,
14c80 20 70 49 74 65 72 2c 20 69 4c 65 61 66 50 67 6e   pIter, iLeafPgn
14c90 6f 29 3b 0a 20 20 20 20 20 20 62 4d 6f 76 65 20  o);.      bMove 
14ca0 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  = 0;.    }.  }el
14cb0 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20  se{.    assert( 
14cc0 70 49 74 65 72 2d 3e 70 4e 65 78 74 4c 65 61 66  pIter->pNextLeaf
14cd0 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ==0 );.    asser
14ce0 74 28 20 69 4d 61 74 63 68 3c 70 49 74 65 72 2d  t( iMatch<pIter-
14cf0 3e 69 52 6f 77 69 64 20 29 3b 0a 20 20 20 20 77  >iRowid );.    w
14d00 68 69 6c 65 28 20 21 66 74 73 35 44 6c 69 64 78  hile( !fts5Dlidx
14d10 49 74 65 72 45 6f 66 28 70 2c 20 70 44 6c 69 64  IterEof(p, pDlid
14d20 78 29 20 26 26 20 69 4d 61 74 63 68 3c 66 74 73  x) && iMatch<fts
14d30 35 44 6c 69 64 78 49 74 65 72 52 6f 77 69 64 28  5DlidxIterRowid(
14d40 70 44 6c 69 64 78 29 20 29 7b 0a 20 20 20 20 20  pDlidx) ){.     
14d50 20 66 74 73 35 44 6c 69 64 78 49 74 65 72 50 72   fts5DlidxIterPr
14d60 65 76 28 70 2c 20 70 44 6c 69 64 78 29 3b 0a 20  ev(p, pDlidx);. 
14d70 20 20 20 7d 0a 20 20 20 20 69 4c 65 61 66 50 67     }.    iLeafPg
14d80 6e 6f 20 3d 20 66 74 73 35 44 6c 69 64 78 49 74  no = fts5DlidxIt
14d90 65 72 50 67 6e 6f 28 70 44 6c 69 64 78 29 3b 0a  erPgno(pDlidx);.
14da0 0a 20 20 20 20 61 73 73 65 72 74 28 20 66 74 73  .    assert( fts
14db0 35 44 6c 69 64 78 49 74 65 72 45 6f 66 28 70 2c  5DlidxIterEof(p,
14dc0 20 70 44 6c 69 64 78 29 20 7c 7c 20 69 4c 65 61   pDlidx) || iLea
14dd0 66 50 67 6e 6f 3c 3d 70 49 74 65 72 2d 3e 69 4c  fPgno<=pIter->iL
14de0 65 61 66 50 67 6e 6f 20 29 3b 0a 0a 20 20 20 20  eafPgno );..    
14df0 69 66 28 20 69 4c 65 61 66 50 67 6e 6f 3c 70 49  if( iLeafPgno<pI
14e00 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 20 29  ter->iLeafPgno )
14e10 7b 0a 20 20 20 20 20 20 70 49 74 65 72 2d 3e 69  {.      pIter->i
14e20 4c 65 61 66 50 67 6e 6f 20 3d 20 69 4c 65 61 66  LeafPgno = iLeaf
14e30 50 67 6e 6f 2b 31 3b 0a 20 20 20 20 20 20 66 74  Pgno+1;.      ft
14e40 73 35 53 65 67 49 74 65 72 52 65 76 65 72 73 65  s5SegIterReverse
14e50 4e 65 77 50 61 67 65 28 70 2c 20 70 49 74 65 72  NewPage(p, pIter
14e60 29 3b 0a 20 20 20 20 20 20 62 4d 6f 76 65 20 3d  );.      bMove =
14e70 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20   0;.    }.  }.. 
14e80 20 64 6f 7b 0a 20 20 20 20 69 66 28 20 62 4d 6f   do{.    if( bMo
14e90 76 65 20 26 26 20 70 2d 3e 72 63 3d 3d 53 51 4c  ve && p->rc==SQL
14ea0 49 54 45 5f 4f 4b 20 29 20 70 49 74 65 72 2d 3e  ITE_OK ) pIter->
14eb0 78 4e 65 78 74 28 70 2c 20 70 49 74 65 72 2c 20  xNext(p, pIter, 
14ec0 30 29 3b 0a 20 20 20 20 69 66 28 20 70 49 74 65  0);.    if( pIte
14ed0 72 2d 3e 70 4c 65 61 66 3d 3d 30 20 29 20 62 72  r->pLeaf==0 ) br
14ee0 65 61 6b 3b 0a 20 20 20 20 69 66 28 20 62 52 65  eak;.    if( bRe
14ef0 76 3d 3d 30 20 26 26 20 70 49 74 65 72 2d 3e 69  v==0 && pIter->i
14f00 52 6f 77 69 64 3e 3d 69 4d 61 74 63 68 20 29 20  Rowid>=iMatch ) 
14f10 62 72 65 61 6b 3b 0a 20 20 20 20 69 66 28 20 62  break;.    if( b
14f20 52 65 76 21 3d 30 20 26 26 20 70 49 74 65 72 2d  Rev!=0 && pIter-
14f30 3e 69 52 6f 77 69 64 3c 3d 69 4d 61 74 63 68 20  >iRowid<=iMatch 
14f40 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 62 4d 6f  ) break;.    bMo
14f50 76 65 20 3d 20 31 3b 0a 20 20 7d 77 68 69 6c 65  ve = 1;.  }while
14f60 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
14f70 4f 4b 20 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  OK );.}.../*.** 
14f80 46 72 65 65 20 74 68 65 20 69 74 65 72 61 74 6f  Free the iterato
14f90 72 20 6f 62 6a 65 63 74 20 70 61 73 73 65 64 20  r object passed 
14fa0 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72  as the second ar
14fb0 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69  gument..*/.stati
14fc0 63 20 76 6f 69 64 20 66 74 73 35 4d 75 6c 74 69  c void fts5Multi
14fd0 49 74 65 72 46 72 65 65 28 46 74 73 35 49 74 65  IterFree(Fts5Ite
14fe0 72 20 2a 70 49 74 65 72 29 7b 0a 20 20 69 66 28  r *pIter){.  if(
14ff0 20 70 49 74 65 72 20 29 7b 0a 20 20 20 20 69 6e   pIter ){.    in
15000 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  t i;.    for(i=0
15010 3b 20 69 3c 70 49 74 65 72 2d 3e 6e 53 65 67 3b  ; i<pIter->nSeg;
15020 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 66 74 73   i++){.      fts
15030 35 53 65 67 49 74 65 72 43 6c 65 61 72 28 26 70  5SegIterClear(&p
15040 49 74 65 72 2d 3e 61 53 65 67 5b 69 5d 29 3b 0a  Iter->aSeg[i]);.
15050 20 20 20 20 7d 0a 20 20 20 20 66 74 73 35 53 74      }.    fts5St
15060 72 75 63 74 75 72 65 52 65 6c 65 61 73 65 28 70  ructureRelease(p
15070 49 74 65 72 2d 3e 70 53 74 72 75 63 74 29 3b 0a  Iter->pStruct);.
15080 20 20 20 20 66 74 73 35 42 75 66 66 65 72 46 72      fts5BufferFr
15090 65 65 28 26 70 49 74 65 72 2d 3e 70 6f 73 6c 69  ee(&pIter->posli
150a0 73 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  st);.    sqlite3
150b0 5f 66 72 65 65 28 70 49 74 65 72 29 3b 0a 20 20  _free(pIter);.  
150c0 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64  }.}..static void
150d0 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 41 64   fts5MultiIterAd
150e0 76 61 6e 63 65 64 28 0a 20 20 46 74 73 35 49 6e  vanced(.  Fts5In
150f0 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20 20  dex *p,         
15100 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53            /* FTS
15110 35 20 62 61 63 6b 65 6e 64 20 74 6f 20 69 74 65  5 backend to ite
15120 72 61 74 65 20 77 69 74 68 69 6e 20 2a 2f 0a 20  rate within */. 
15130 20 46 74 73 35 49 74 65 72 20 2a 70 49 74 65 72   Fts5Iter *pIter
15140 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
15150 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 74 6f 20   /* Iterator to 
15160 75 70 64 61 74 65 20 61 46 69 72 73 74 5b 5d 20  update aFirst[] 
15170 61 72 72 61 79 20 66 6f 72 20 2a 2f 0a 20 20 69  array for */.  i
15180 6e 74 20 69 43 68 61 6e 67 65 64 2c 20 20 20 20  nt iChanged,    
15190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
151a0 2a 20 49 6e 64 65 78 20 6f 66 20 73 75 62 2d 69  * Index of sub-i
151b0 74 65 72 61 74 6f 72 20 6a 75 73 74 20 61 64 76  terator just adv
151c0 61 6e 63 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69  anced */.  int i
151d0 4d 69 6e 73 65 74 20 20 20 20 20 20 20 20 20 20  Minset          
151e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 69             /* Mi
151f0 6e 69 6d 75 6d 20 65 6e 74 72 79 20 69 6e 20 61  nimum entry in a
15200 46 69 72 73 74 5b 5d 20 74 6f 20 73 65 74 20 2a  First[] to set *
15210 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  /.){.  int i;.  
15220 66 6f 72 28 69 3d 28 70 49 74 65 72 2d 3e 6e 53  for(i=(pIter->nS
15230 65 67 2b 69 43 68 61 6e 67 65 64 29 2f 32 3b 20  eg+iChanged)/2; 
15240 69 3e 3d 69 4d 69 6e 73 65 74 20 26 26 20 70 2d  i>=iMinset && p-
15250 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20  >rc==SQLITE_OK; 
15260 69 3d 69 2f 32 29 7b 0a 20 20 20 20 69 6e 74 20  i=i/2){.    int 
15270 69 45 71 3b 0a 20 20 20 20 69 66 28 20 28 69 45  iEq;.    if( (iE
15280 71 20 3d 20 66 74 73 35 4d 75 6c 74 69 49 74 65  q = fts5MultiIte
15290 72 44 6f 43 6f 6d 70 61 72 65 28 70 49 74 65 72  rDoCompare(pIter
152a0 2c 20 69 29 29 20 29 7b 0a 20 20 20 20 20 20 46  , i)) ){.      F
152b0 74 73 35 53 65 67 49 74 65 72 20 2a 70 53 65 67  ts5SegIter *pSeg
152c0 20 3d 20 26 70 49 74 65 72 2d 3e 61 53 65 67 5b   = &pIter->aSeg[
152d0 69 45 71 5d 3b 0a 20 20 20 20 20 20 61 73 73 65  iEq];.      asse
152e0 72 74 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  rt( p->rc==SQLIT
152f0 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 70 53  E_OK );.      pS
15300 65 67 2d 3e 78 4e 65 78 74 28 70 2c 20 70 53 65  eg->xNext(p, pSe
15310 67 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 20 3d  g, 0);.      i =
15320 20 70 49 74 65 72 2d 3e 6e 53 65 67 20 2b 20 69   pIter->nSeg + i
15330 45 71 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  Eq;.    }.  }.}.
15340 0a 2f 2a 0a 2a 2a 20 53 75 62 2d 69 74 65 72 61  ./*.** Sub-itera
15350 74 6f 72 20 69 43 68 61 6e 67 65 64 20 6f 66 20  tor iChanged of 
15360 69 74 65 72 61 74 6f 72 20 70 49 74 65 72 20 68  iterator pIter h
15370 61 73 20 6a 75 73 74 20 62 65 65 6e 20 61 64 76  as just been adv
15380 61 6e 63 65 64 2e 20 49 74 20 73 74 69 6c 6c 0a  anced. It still.
15390 2a 2a 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65  ** points to the
153a0 20 73 61 6d 65 20 74 65 72 6d 20 74 68 6f 75 67   same term thoug
153b0 68 20 2d 20 6a 75 73 74 20 61 20 64 69 66 66 65  h - just a diffe
153c0 72 65 6e 74 20 72 6f 77 69 64 2e 20 54 68 69 73  rent rowid. This
153d0 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 61 74 74   function.** att
153e0 65 6d 70 74 73 20 74 6f 20 75 70 64 61 74 65 20  empts to update 
153f0 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
15400 74 68 65 20 70 49 74 65 72 2d 3e 61 46 69 72 73  the pIter->aFirs
15410 74 5b 5d 20 61 63 63 6f 72 64 69 6e 67 6c 79 2e  t[] accordingly.
15420 0a 2a 2a 20 49 66 20 69 74 20 64 6f 65 73 20 73  .** If it does s
15430 6f 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2c 20  o successfully, 
15440 30 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f  0 is returned. O
15450 74 68 65 72 77 69 73 65 20 31 2e 0a 2a 2a 0a 2a  therwise 1..**.*
15460 2a 20 49 66 20 6e 6f 6e 2d 7a 65 72 6f 20 69 73  * If non-zero is
15470 20 72 65 74 75 72 6e 65 64 2c 20 74 68 65 20 63   returned, the c
15480 61 6c 6c 65 72 20 73 68 6f 75 6c 64 20 63 61 6c  aller should cal
15490 6c 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 41  l fts5MultiIterA
154a0 64 76 61 6e 63 65 64 28 29 0a 2a 2a 20 6f 6e 20  dvanced().** on 
154b0 74 68 65 20 69 74 65 72 61 74 6f 72 20 69 6e 73  the iterator ins
154c0 74 65 61 64 2e 20 54 68 61 74 20 66 75 6e 63 74  tead. That funct
154d0 69 6f 6e 20 64 6f 65 73 20 74 68 65 20 73 61 6d  ion does the sam
154e0 65 20 61 73 20 74 68 69 73 20 6f 6e 65 2c 20 65  e as this one, e
154f0 78 63 65 70 74 0a 2a 2a 20 74 68 61 74 20 69 74  xcept.** that it
15500 20 64 65 61 6c 73 20 77 69 74 68 20 6d 6f 72 65   deals with more
15510 20 63 6f 6d 70 6c 69 63 61 74 65 64 20 63 61 73   complicated cas
15520 65 73 20 61 73 20 77 65 6c 6c 2e 0a 2a 2f 20 0a  es as well..*/ .
15530 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 35 4d  static int fts5M
15540 75 6c 74 69 49 74 65 72 41 64 76 61 6e 63 65 52  ultiIterAdvanceR
15550 6f 77 69 64 28 0a 20 20 46 74 73 35 49 74 65 72  owid(.  Fts5Iter
15560 20 2a 70 49 74 65 72 2c 20 20 20 20 20 20 20 20   *pIter,        
15570 20 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61          /* Itera
15580 74 6f 72 20 74 6f 20 75 70 64 61 74 65 20 61 46  tor to update aF
15590 69 72 73 74 5b 5d 20 61 72 72 61 79 20 66 6f 72  irst[] array for
155a0 20 2a 2f 0a 20 20 69 6e 74 20 69 43 68 61 6e 67   */.  int iChang
155b0 65 64 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ed,             
155c0 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f        /* Index o
155d0 66 20 73 75 62 2d 69 74 65 72 61 74 6f 72 20 6a  f sub-iterator j
155e0 75 73 74 20 61 64 76 61 6e 63 65 64 20 2a 2f 0a  ust advanced */.
155f0 20 20 46 74 73 35 53 65 67 49 74 65 72 20 2a 2a    Fts5SegIter **
15600 70 70 46 69 72 73 74 0a 29 7b 0a 20 20 46 74 73  ppFirst.){.  Fts
15610 35 53 65 67 49 74 65 72 20 2a 70 4e 65 77 20 3d  5SegIter *pNew =
15620 20 26 70 49 74 65 72 2d 3e 61 53 65 67 5b 69 43   &pIter->aSeg[iC
15630 68 61 6e 67 65 64 5d 3b 0a 0a 20 20 69 66 28 20  hanged];..  if( 
15640 70 4e 65 77 2d 3e 69 52 6f 77 69 64 3d 3d 70 49  pNew->iRowid==pI
15650 74 65 72 2d 3e 69 53 77 69 74 63 68 52 6f 77 69  ter->iSwitchRowi
15660 64 0a 20 20 20 7c 7c 20 28 70 4e 65 77 2d 3e 69  d.   || (pNew->i
15670 52 6f 77 69 64 3c 70 49 74 65 72 2d 3e 69 53 77  Rowid<pIter->iSw
15680 69 74 63 68 52 6f 77 69 64 29 3d 3d 70 49 74 65  itchRowid)==pIte
15690 72 2d 3e 62 52 65 76 0a 20 20 29 7b 0a 20 20 20  r->bRev.  ){.   
156a0 20 69 6e 74 20 69 3b 0a 20 20 20 20 46 74 73 35   int i;.    Fts5
156b0 53 65 67 49 74 65 72 20 2a 70 4f 74 68 65 72 20  SegIter *pOther 
156c0 3d 20 26 70 49 74 65 72 2d 3e 61 53 65 67 5b 69  = &pIter->aSeg[i
156d0 43 68 61 6e 67 65 64 20 5e 20 30 78 30 30 30 31  Changed ^ 0x0001
156e0 5d 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 69 53  ];.    pIter->iS
156f0 77 69 74 63 68 52 6f 77 69 64 20 3d 20 70 49 74  witchRowid = pIt
15700 65 72 2d 3e 62 52 65 76 20 3f 20 53 4d 41 4c 4c  er->bRev ? SMALL
15710 45 53 54 5f 49 4e 54 36 34 20 3a 20 4c 41 52 47  EST_INT64 : LARG
15720 45 53 54 5f 49 4e 54 36 34 3b 0a 20 20 20 20 66  EST_INT64;.    f
15730 6f 72 28 69 3d 28 70 49 74 65 72 2d 3e 6e 53 65  or(i=(pIter->nSe
15740 67 2b 69 43 68 61 6e 67 65 64 29 2f 32 3b 20 31  g+iChanged)/2; 1
15750 3b 20 69 3d 69 2f 32 29 7b 0a 20 20 20 20 20 20  ; i=i/2){.      
15760 46 74 73 35 43 52 65 73 75 6c 74 20 2a 70 52 65  Fts5CResult *pRe
15770 73 20 3d 20 26 70 49 74 65 72 2d 3e 61 46 69 72  s = &pIter->aFir
15780 73 74 5b 69 5d 3b 0a 0a 20 20 20 20 20 20 61 73  st[i];..      as
15790 73 65 72 74 28 20 70 4e 65 77 2d 3e 70 4c 65 61  sert( pNew->pLea
157a0 66 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  f );.      asser
157b0 74 28 20 70 52 65 73 2d 3e 62 54 65 72 6d 45 71  t( pRes->bTermEq
157c0 3d 3d 30 20 7c 7c 20 70 4f 74 68 65 72 2d 3e 70  ==0 || pOther->p
157d0 4c 65 61 66 20 29 3b 0a 0a 20 20 20 20 20 20 69  Leaf );..      i
157e0 66 28 20 70 52 65 73 2d 3e 62 54 65 72 6d 45 71  f( pRes->bTermEq
157f0 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
15800 70 4e 65 77 2d 3e 69 52 6f 77 69 64 3d 3d 70 4f  pNew->iRowid==pO
15810 74 68 65 72 2d 3e 69 52 6f 77 69 64 20 29 7b 0a  ther->iRowid ){.
15820 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
15830 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73   1;.        }els
15840 65 20 69 66 28 20 28 70 4f 74 68 65 72 2d 3e 69  e if( (pOther->i
15850 52 6f 77 69 64 3e 70 4e 65 77 2d 3e 69 52 6f 77  Rowid>pNew->iRow
15860 69 64 29 3d 3d 70 49 74 65 72 2d 3e 62 52 65 76  id)==pIter->bRev
15870 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 49   ){.          pI
15880 74 65 72 2d 3e 69 53 77 69 74 63 68 52 6f 77 69  ter->iSwitchRowi
15890 64 20 3d 20 70 4f 74 68 65 72 2d 3e 69 52 6f 77  d = pOther->iRow
158a0 69 64 3b 0a 20 20 20 20 20 20 20 20 20 20 70 4e  id;.          pN
158b0 65 77 20 3d 20 70 4f 74 68 65 72 3b 0a 20 20 20  ew = pOther;.   
158c0 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28       }else if( (
158d0 70 4f 74 68 65 72 2d 3e 69 52 6f 77 69 64 3e 70  pOther->iRowid>p
158e0 49 74 65 72 2d 3e 69 53 77 69 74 63 68 52 6f 77  Iter->iSwitchRow
158f0 69 64 29 3d 3d 70 49 74 65 72 2d 3e 62 52 65 76  id)==pIter->bRev
15900 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 49   ){.          pI
15910 74 65 72 2d 3e 69 53 77 69 74 63 68 52 6f 77 69  ter->iSwitchRowi
15920 64 20 3d 20 70 4f 74 68 65 72 2d 3e 69 52 6f 77  d = pOther->iRow
15930 69 64 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  id;.        }.  
15940 20 20 20 20 7d 0a 20 20 20 20 20 20 70 52 65 73      }.      pRes
15950 2d 3e 69 46 69 72 73 74 20 3d 20 28 75 31 36 29  ->iFirst = (u16)
15960 28 70 4e 65 77 20 2d 20 70 49 74 65 72 2d 3e 61  (pNew - pIter->a
15970 53 65 67 29 3b 0a 20 20 20 20 20 20 69 66 28 20  Seg);.      if( 
15980 69 3d 3d 31 20 29 20 62 72 65 61 6b 3b 0a 0a 20  i==1 ) break;.. 
15990 20 20 20 20 20 70 4f 74 68 65 72 20 3d 20 26 70       pOther = &p
159a0 49 74 65 72 2d 3e 61 53 65 67 5b 20 70 49 74 65  Iter->aSeg[ pIte
159b0 72 2d 3e 61 46 69 72 73 74 5b 69 20 5e 20 30 78  r->aFirst[i ^ 0x
159c0 30 30 30 31 5d 2e 69 46 69 72 73 74 20 5d 3b 0a  0001].iFirst ];.
159d0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2a 70 70      }.  }..  *pp
159e0 46 69 72 73 74 20 3d 20 70 4e 65 77 3b 0a 20 20  First = pNew;.  
159f0 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
15a00 2a 2a 20 53 65 74 20 74 68 65 20 70 49 74 65 72  ** Set the pIter
15a10 2d 3e 62 45 6f 66 20 76 61 72 69 61 62 6c 65 20  ->bEof variable 
15a20 62 61 73 65 64 20 6f 6e 20 74 68 65 20 73 74 61  based on the sta
15a30 74 65 20 6f 66 20 74 68 65 20 73 75 62 2d 69 74  te of the sub-it
15a40 65 72 61 74 6f 72 73 2e 0a 2a 2f 0a 73 74 61 74  erators..*/.stat
15a50 69 63 20 76 6f 69 64 20 66 74 73 35 4d 75 6c 74  ic void fts5Mult
15a60 69 49 74 65 72 53 65 74 45 6f 66 28 46 74 73 35  iIterSetEof(Fts5
15a70 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a 20 20  Iter *pIter){.  
15a80 46 74 73 35 53 65 67 49 74 65 72 20 2a 70 53 65  Fts5SegIter *pSe
15a90 67 20 3d 20 26 70 49 74 65 72 2d 3e 61 53 65 67  g = &pIter->aSeg
15aa0 5b 20 70 49 74 65 72 2d 3e 61 46 69 72 73 74 5b  [ pIter->aFirst[
15ab0 31 5d 2e 69 46 69 72 73 74 20 5d 3b 0a 20 20 70  1].iFirst ];.  p
15ac0 49 74 65 72 2d 3e 62 61 73 65 2e 62 45 6f 66 20  Iter->base.bEof 
15ad0 3d 20 70 53 65 67 2d 3e 70 4c 65 61 66 3d 3d 30  = pSeg->pLeaf==0
15ae0 3b 0a 20 20 70 49 74 65 72 2d 3e 69 53 77 69 74  ;.  pIter->iSwit
15af0 63 68 52 6f 77 69 64 20 3d 20 70 53 65 67 2d 3e  chRowid = pSeg->
15b00 69 52 6f 77 69 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  iRowid;.}../*.**
15b10 20 4d 6f 76 65 20 74 68 65 20 69 74 65 72 61 74   Move the iterat
15b20 6f 72 20 74 6f 20 74 68 65 20 6e 65 78 74 20 65  or to the next e
15b30 6e 74 72 79 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20  ntry. .**.** If 
15b40 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  an error occurs,
15b50 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69   an error code i
15b60 73 20 6c 65 66 74 20 69 6e 20 46 74 73 35 49 6e  s left in Fts5In
15b70 64 65 78 2e 72 63 2e 20 49 74 20 69 73 20 6e 6f  dex.rc. It is no
15b80 74 20 0a 2a 2a 20 63 6f 6e 73 69 64 65 72 65 64  t .** considered
15b90 20 61 6e 20 65 72 72 6f 72 20 69 66 20 74 68 65   an error if the
15ba0 20 69 74 65 72 61 74 6f 72 20 72 65 61 63 68 65   iterator reache
15bb0 73 20 45 4f 46 2c 20 6f 72 20 69 66 20 69 74 20  s EOF, or if it 
15bc0 69 73 20 61 6c 72 65 61 64 79 20 61 74 20 0a 2a  is already at .*
15bd0 2a 20 45 4f 46 20 77 68 65 6e 20 74 68 69 73 20  * EOF when this 
15be0 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
15bf0 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ed..*/.static vo
15c00 69 64 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72  id fts5MultiIter
15c10 4e 65 78 74 28 0a 20 20 46 74 73 35 49 6e 64 65  Next(.  Fts5Inde
15c20 78 20 2a 70 2c 20 0a 20 20 46 74 73 35 49 74 65  x *p, .  Fts5Ite
15c30 72 20 2a 70 49 74 65 72 2c 0a 20 20 69 6e 74 20  r *pIter,.  int 
15c40 62 46 72 6f 6d 2c 20 20 20 20 20 20 20 20 20 20  bFrom,          
15c50 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
15c60 72 75 65 20 69 66 20 61 72 67 75 6d 65 6e 74 20  rue if argument 
15c70 69 46 72 6f 6d 20 69 73 20 76 61 6c 69 64 20 2a  iFrom is valid *
15c80 2f 0a 20 20 69 36 34 20 69 46 72 6f 6d 20 20 20  /.  i64 iFrom   
15c90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15ca0 20 20 20 20 2f 2a 20 41 64 76 61 6e 63 65 20 61      /* Advance a
15cb0 74 20 6c 65 61 73 74 20 61 73 20 66 61 72 20 61  t least as far a
15cc0 73 20 74 68 69 73 20 2a 2f 0a 29 7b 0a 20 20 69  s this */.){.  i
15cd0 6e 74 20 62 55 73 65 46 72 6f 6d 20 3d 20 62 46  nt bUseFrom = bF
15ce0 72 6f 6d 3b 0a 20 20 61 73 73 65 72 74 28 20 70  rom;.  assert( p
15cf0 49 74 65 72 2d 3e 62 61 73 65 2e 62 45 6f 66 3d  Iter->base.bEof=
15d00 3d 30 20 29 3b 0a 20 20 77 68 69 6c 65 28 20 70  =0 );.  while( p
15d10 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
15d20 29 7b 0a 20 20 20 20 69 6e 74 20 69 46 69 72 73  ){.    int iFirs
15d30 74 20 3d 20 70 49 74 65 72 2d 3e 61 46 69 72 73  t = pIter->aFirs
15d40 74 5b 31 5d 2e 69 46 69 72 73 74 3b 0a 20 20 20  t[1].iFirst;.   
15d50 20 69 6e 74 20 62 4e 65 77 54 65 72 6d 20 3d 20   int bNewTerm = 
15d60 30 3b 0a 20 20 20 20 46 74 73 35 53 65 67 49 74  0;.    Fts5SegIt
15d70 65 72 20 2a 70 53 65 67 20 3d 20 26 70 49 74 65  er *pSeg = &pIte
15d80 72 2d 3e 61 53 65 67 5b 69 46 69 72 73 74 5d 3b  r->aSeg[iFirst];
15d90 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e  .    assert( p->
15da0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  rc==SQLITE_OK );
15db0 0a 20 20 20 20 69 66 28 20 62 55 73 65 46 72 6f  .    if( bUseFro
15dc0 6d 20 26 26 20 70 53 65 67 2d 3e 70 44 6c 69 64  m && pSeg->pDlid
15dd0 78 20 29 7b 0a 20 20 20 20 20 20 66 74 73 35 53  x ){.      fts5S
15de0 65 67 49 74 65 72 4e 65 78 74 46 72 6f 6d 28 70  egIterNextFrom(p
15df0 2c 20 70 53 65 67 2c 20 69 46 72 6f 6d 29 3b 0a  , pSeg, iFrom);.
15e00 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
15e10 20 70 53 65 67 2d 3e 78 4e 65 78 74 28 70 2c 20   pSeg->xNext(p, 
15e20 70 53 65 67 2c 20 26 62 4e 65 77 54 65 72 6d 29  pSeg, &bNewTerm)
15e30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28  ;.    }..    if(
15e40 20 70 53 65 67 2d 3e 70 4c 65 61 66 3d 3d 30 20   pSeg->pLeaf==0 
15e50 7c 7c 20 62 4e 65 77 54 65 72 6d 20 0a 20 20 20  || bNewTerm .   
15e60 20 20 7c 7c 20 66 74 73 35 4d 75 6c 74 69 49 74    || fts5MultiIt
15e70 65 72 41 64 76 61 6e 63 65 52 6f 77 69 64 28 70  erAdvanceRowid(p
15e80 49 74 65 72 2c 20 69 46 69 72 73 74 2c 20 26 70  Iter, iFirst, &p
15e90 53 65 67 29 0a 20 20 20 20 29 7b 0a 20 20 20 20  Seg).    ){.    
15ea0 20 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 41    fts5MultiIterA
15eb0 64 76 61 6e 63 65 64 28 70 2c 20 70 49 74 65 72  dvanced(p, pIter
15ec0 2c 20 69 46 69 72 73 74 2c 20 31 29 3b 0a 20 20  , iFirst, 1);.  
15ed0 20 20 20 20 66 74 73 35 4d 75 6c 74 69 49 74 65      fts5MultiIte
15ee0 72 53 65 74 45 6f 66 28 70 49 74 65 72 29 3b 0a  rSetEof(pIter);.
15ef0 20 20 20 20 20 20 70 53 65 67 20 3d 20 26 70 49        pSeg = &pI
15f00 74 65 72 2d 3e 61 53 65 67 5b 70 49 74 65 72 2d  ter->aSeg[pIter-
15f10 3e 61 46 69 72 73 74 5b 31 5d 2e 69 46 69 72 73  >aFirst[1].iFirs
15f20 74 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 70 53  t];.      if( pS
15f30 65 67 2d 3e 70 4c 65 61 66 3d 3d 30 20 29 20 72  eg->pLeaf==0 ) r
15f40 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 0a 20 20  eturn;.    }..  
15f50 20 20 66 74 73 35 41 73 73 65 72 74 4d 75 6c 74    fts5AssertMult
15f60 69 49 74 65 72 53 65 74 75 70 28 70 2c 20 70 49  iIterSetup(p, pI
15f70 74 65 72 29 3b 0a 20 20 20 20 61 73 73 65 72 74  ter);.    assert
15f80 28 20 70 53 65 67 3d 3d 26 70 49 74 65 72 2d 3e  ( pSeg==&pIter->
15f90 61 53 65 67 5b 70 49 74 65 72 2d 3e 61 46 69 72  aSeg[pIter->aFir
15fa0 73 74 5b 31 5d 2e 69 46 69 72 73 74 5d 20 26 26  st[1].iFirst] &&
15fb0 20 70 53 65 67 2d 3e 70 4c 65 61 66 20 29 3b 0a   pSeg->pLeaf );.
15fc0 20 20 20 20 69 66 28 20 70 49 74 65 72 2d 3e 62      if( pIter->b
15fd0 53 6b 69 70 45 6d 70 74 79 3d 3d 30 20 7c 7c 20  SkipEmpty==0 || 
15fe0 70 53 65 67 2d 3e 6e 50 6f 73 20 29 7b 0a 20 20  pSeg->nPos ){.  
15ff0 20 20 20 20 70 49 74 65 72 2d 3e 78 53 65 74 4f      pIter->xSetO
16000 75 74 70 75 74 73 28 70 49 74 65 72 2c 20 70 53  utputs(pIter, pS
16010 65 67 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  eg);.      retur
16020 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 62 55 73  n;.    }.    bUs
16030 65 46 72 6f 6d 20 3d 20 30 3b 0a 20 20 7d 0a 7d  eFrom = 0;.  }.}
16040 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  ..static void ft
16050 73 35 4d 75 6c 74 69 49 74 65 72 4e 65 78 74 32  s5MultiIterNext2
16060 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70  (.  Fts5Index *p
16070 2c 20 0a 20 20 46 74 73 35 49 74 65 72 20 2a 70  , .  Fts5Iter *p
16080 49 74 65 72 2c 0a 20 20 69 6e 74 20 2a 70 62 4e  Iter,.  int *pbN
16090 65 77 54 65 72 6d 20 20 20 20 20 20 20 20 20 20  ewTerm          
160a0 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20          /* OUT: 
160b0 54 72 75 65 20 69 66 20 2a 6d 69 67 68 74 2a 20  True if *might* 
160c0 62 65 20 6e 65 77 20 74 65 72 6d 20 2a 2f 0a 29  be new term */.)
160d0 7b 0a 20 20 61 73 73 65 72 74 28 20 70 49 74 65  {.  assert( pIte
160e0 72 2d 3e 62 53 6b 69 70 45 6d 70 74 79 20 29 3b  r->bSkipEmpty );
160f0 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51  .  if( p->rc==SQ
16100 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2a  LITE_OK ){.    *
16110 70 62 4e 65 77 54 65 72 6d 20 3d 20 30 3b 0a 20  pbNewTerm = 0;. 
16120 20 20 20 64 6f 7b 0a 20 20 20 20 20 20 69 6e 74     do{.      int
16130 20 69 46 69 72 73 74 20 3d 20 70 49 74 65 72 2d   iFirst = pIter-
16140 3e 61 46 69 72 73 74 5b 31 5d 2e 69 46 69 72 73  >aFirst[1].iFirs
16150 74 3b 0a 20 20 20 20 20 20 46 74 73 35 53 65 67  t;.      Fts5Seg
16160 49 74 65 72 20 2a 70 53 65 67 20 3d 20 26 70 49  Iter *pSeg = &pI
16170 74 65 72 2d 3e 61 53 65 67 5b 69 46 69 72 73 74  ter->aSeg[iFirst
16180 5d 3b 0a 20 20 20 20 20 20 69 6e 74 20 62 4e 65  ];.      int bNe
16190 77 54 65 72 6d 20 3d 20 30 3b 0a 0a 20 20 20 20  wTerm = 0;..    
161a0 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72 63 3d    assert( p->rc=
161b0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20  =SQLITE_OK );.  
161c0 20 20 20 20 70 53 65 67 2d 3e 78 4e 65 78 74 28      pSeg->xNext(
161d0 70 2c 20 70 53 65 67 2c 20 26 62 4e 65 77 54 65  p, pSeg, &bNewTe
161e0 72 6d 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  rm);.      if( p
161f0 53 65 67 2d 3e 70 4c 65 61 66 3d 3d 30 20 7c 7c  Seg->pLeaf==0 ||
16200 20 62 4e 65 77 54 65 72 6d 20 0a 20 20 20 20 20   bNewTerm .     
16210 20 20 7c 7c 20 66 74 73 35 4d 75 6c 74 69 49 74    || fts5MultiIt
16220 65 72 41 64 76 61 6e 63 65 52 6f 77 69 64 28 70  erAdvanceRowid(p
16230 49 74 65 72 2c 20 69 46 69 72 73 74 2c 20 26 70  Iter, iFirst, &p
16240 53 65 67 29 0a 20 20 20 20 20 20 29 7b 0a 20 20  Seg).      ){.  
16250 20 20 20 20 20 20 66 74 73 35 4d 75 6c 74 69 49        fts5MultiI
16260 74 65 72 41 64 76 61 6e 63 65 64 28 70 2c 20 70  terAdvanced(p, p
16270 49 74 65 72 2c 20 69 46 69 72 73 74 2c 20 31 29  Iter, iFirst, 1)
16280 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35 4d 75  ;.        fts5Mu
16290 6c 74 69 49 74 65 72 53 65 74 45 6f 66 28 70 49  ltiIterSetEof(pI
162a0 74 65 72 29 3b 0a 20 20 20 20 20 20 20 20 2a 70  ter);.        *p
162b0 62 4e 65 77 54 65 72 6d 20 3d 20 31 3b 0a 20 20  bNewTerm = 1;.  
162c0 20 20 20 20 7d 0a 20 20 20 20 20 20 66 74 73 35      }.      fts5
162d0 41 73 73 65 72 74 4d 75 6c 74 69 49 74 65 72 53  AssertMultiIterS
162e0 65 74 75 70 28 70 2c 20 70 49 74 65 72 29 3b 0a  etup(p, pIter);.
162f0 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 66 74 73  .    }while( fts
16300 35 4d 75 6c 74 69 49 74 65 72 49 73 45 6d 70 74  5MultiIterIsEmpt
16310 79 28 70 2c 20 70 49 74 65 72 29 20 29 3b 0a 20  y(p, pIter) );. 
16320 20 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69   }.}..static voi
16330 64 20 66 74 73 35 49 74 65 72 53 65 74 4f 75 74  d fts5IterSetOut
16340 70 75 74 73 5f 4e 6f 6f 70 28 46 74 73 35 49 74  puts_Noop(Fts5It
16350 65 72 20 2a 70 55 6e 75 73 65 64 31 2c 20 46 74  er *pUnused1, Ft
16360 73 35 53 65 67 49 74 65 72 20 2a 70 55 6e 75 73  s5SegIter *pUnus
16370 65 64 32 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50  ed2){.  UNUSED_P
16380 41 52 41 4d 32 28 70 55 6e 75 73 65 64 31 2c 20  ARAM2(pUnused1, 
16390 70 55 6e 75 73 65 64 32 29 3b 0a 7d 0a 0a 73 74  pUnused2);.}..st
163a0 61 74 69 63 20 46 74 73 35 49 74 65 72 20 2a 66  atic Fts5Iter *f
163b0 74 73 35 4d 75 6c 74 69 49 74 65 72 41 6c 6c 6f  ts5MultiIterAllo
163c0 63 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a  c(.  Fts5Index *
163d0 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
163e0 20 20 20 20 20 2f 2a 20 46 54 53 35 20 62 61 63       /* FTS5 bac
163f0 6b 65 6e 64 20 74 6f 20 69 74 65 72 61 74 65 20  kend to iterate 
16400 77 69 74 68 69 6e 20 2a 2f 0a 20 20 69 6e 74 20  within */.  int 
16410 6e 53 65 67 0a 29 7b 0a 20 20 46 74 73 35 49 74  nSeg.){.  Fts5It
16420 65 72 20 2a 70 4e 65 77 3b 0a 20 20 69 6e 74 20  er *pNew;.  int 
16430 6e 53 6c 6f 74 3b 20 20 20 20 20 20 20 20 20 20  nSlot;          
16440 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
16450 6f 77 65 72 20 6f 66 20 74 77 6f 20 3e 3d 20 6e  ower of two >= n
16460 53 65 67 20 2a 2f 0a 0a 20 20 66 6f 72 28 6e 53  Seg */..  for(nS
16470 6c 6f 74 3d 32 3b 20 6e 53 6c 6f 74 3c 6e 53 65  lot=2; nSlot<nSe
16480 67 3b 20 6e 53 6c 6f 74 3d 6e 53 6c 6f 74 2a 32  g; nSlot=nSlot*2
16490 29 3b 0a 20 20 70 4e 65 77 20 3d 20 66 74 73 35  );.  pNew = fts5
164a0 49 64 78 4d 61 6c 6c 6f 63 28 70 2c 20 0a 20 20  IdxMalloc(p, .  
164b0 20 20 20 20 73 69 7a 65 6f 66 28 46 74 73 35 49      sizeof(Fts5I
164c0 74 65 72 29 20 2b 20 20 20 20 20 20 20 20 20 20  ter) +          
164d0 20 20 20 20 20 20 20 20 2f 2a 20 70 4e 65 77 20          /* pNew 
164e0 2a 2f 0a 20 20 20 20 20 20 73 69 7a 65 6f 66 28  */.      sizeof(
164f0 46 74 73 35 53 65 67 49 74 65 72 29 20 2a 20 28  Fts5SegIter) * (
16500 6e 53 6c 6f 74 2d 31 29 20 2b 20 20 20 2f 2a 20  nSlot-1) +   /* 
16510 70 4e 65 77 2d 3e 61 53 65 67 5b 5d 20 2a 2f 0a  pNew->aSeg[] */.
16520 20 20 20 20 20 20 73 69 7a 65 6f 66 28 46 74 73        sizeof(Fts
16530 35 43 52 65 73 75 6c 74 29 20 2a 20 6e 53 6c 6f  5CResult) * nSlo
16540 74 20 20 20 20 20 20 20 20 20 2f 2a 20 70 4e 65  t         /* pNe
16550 77 2d 3e 61 46 69 72 73 74 5b 5d 20 2a 2f 0a 20  w->aFirst[] */. 
16560 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 20 29   );.  if( pNew )
16570 7b 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 53 65 67  {.    pNew->nSeg
16580 20 3d 20 6e 53 6c 6f 74 3b 0a 20 20 20 20 70 4e   = nSlot;.    pN
16590 65 77 2d 3e 61 46 69 72 73 74 20 3d 20 28 46 74  ew->aFirst = (Ft
165a0 73 35 43 52 65 73 75 6c 74 2a 29 26 70 4e 65 77  s5CResult*)&pNew
165b0 2d 3e 61 53 65 67 5b 6e 53 6c 6f 74 5d 3b 0a 20  ->aSeg[nSlot];. 
165c0 20 20 20 70 4e 65 77 2d 3e 70 49 6e 64 65 78 20     pNew->pIndex 
165d0 3d 20 70 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 78  = p;.    pNew->x
165e0 53 65 74 4f 75 74 70 75 74 73 20 3d 20 66 74 73  SetOutputs = fts
165f0 35 49 74 65 72 53 65 74 4f 75 74 70 75 74 73 5f  5IterSetOutputs_
16600 4e 6f 6f 70 3b 0a 20 20 7d 0a 20 20 72 65 74 75  Noop;.  }.  retu
16610 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 73 74 61 74  rn pNew;.}..stat
16620 69 63 20 76 6f 69 64 20 66 74 73 35 50 6f 73 6c  ic void fts5Posl
16630 69 73 74 43 61 6c 6c 62 61 63 6b 28 0a 20 20 46  istCallback(.  F
16640 74 73 35 49 6e 64 65 78 20 2a 70 55 6e 75 73 65  ts5Index *pUnuse
16650 64 2c 20 0a 20 20 76 6f 69 64 20 2a 70 43 6f 6e  d, .  void *pCon
16660 74 65 78 74 2c 20 0a 20 20 63 6f 6e 73 74 20 75  text, .  const u
16670 38 20 2a 70 43 68 75 6e 6b 2c 20 69 6e 74 20 6e  8 *pChunk, int n
16680 43 68 75 6e 6b 0a 29 7b 0a 20 20 55 4e 55 53 45  Chunk.){.  UNUSE
16690 44 5f 50 41 52 41 4d 28 70 55 6e 75 73 65 64 29  D_PARAM(pUnused)
166a0 3b 0a 20 20 61 73 73 65 72 74 5f 6e 63 28 20 6e  ;.  assert_nc( n
166b0 43 68 75 6e 6b 3e 3d 30 20 29 3b 0a 20 20 69 66  Chunk>=0 );.  if
166c0 28 20 6e 43 68 75 6e 6b 3e 30 20 29 7b 0a 20 20  ( nChunk>0 ){.  
166d0 20 20 66 74 73 35 42 75 66 66 65 72 53 61 66 65    fts5BufferSafe
166e0 41 70 70 65 6e 64 42 6c 6f 62 28 28 46 74 73 35  AppendBlob((Fts5
166f0 42 75 66 66 65 72 2a 29 70 43 6f 6e 74 65 78 74  Buffer*)pContext
16700 2c 20 70 43 68 75 6e 6b 2c 20 6e 43 68 75 6e 6b  , pChunk, nChunk
16710 29 3b 0a 20 20 7d 0a 7d 0a 0a 74 79 70 65 64 65  );.  }.}..typede
16720 66 20 73 74 72 75 63 74 20 50 6f 73 6c 69 73 74  f struct Poslist
16730 43 61 6c 6c 62 61 63 6b 43 74 78 20 50 6f 73 6c  CallbackCtx Posl
16740 69 73 74 43 61 6c 6c 62 61 63 6b 43 74 78 3b 0a  istCallbackCtx;.
16750 73 74 72 75 63 74 20 50 6f 73 6c 69 73 74 43 61  struct PoslistCa
16760 6c 6c 62 61 63 6b 43 74 78 20 7b 0a 20 20 46 74  llbackCtx {.  Ft
16770 73 35 42 75 66 66 65 72 20 2a 70 42 75 66 3b 20  s5Buffer *pBuf; 
16780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
16790 20 41 70 70 65 6e 64 20 74 6f 20 74 68 69 73 20   Append to this 
167a0 62 75 66 66 65 72 20 2a 2f 0a 20 20 46 74 73 35  buffer */.  Fts5
167b0 43 6f 6c 73 65 74 20 2a 70 43 6f 6c 73 65 74 3b  Colset *pColset;
167c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
167d0 65 73 74 72 69 63 74 20 6d 61 74 63 68 65 73 20  estrict matches 
167e0 74 6f 20 74 68 69 73 20 63 6f 6c 75 6d 6e 20 2a  to this column *
167f0 2f 0a 20 20 69 6e 74 20 65 53 74 61 74 65 3b 20  /.  int eState; 
16800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16810 20 20 20 20 2f 2a 20 53 65 65 20 61 62 6f 76 65      /* See above
16820 20 2a 2f 0a 7d 3b 0a 0a 74 79 70 65 64 65 66 20   */.};..typedef 
16830 73 74 72 75 63 74 20 50 6f 73 6c 69 73 74 4f 66  struct PoslistOf
16840 66 73 65 74 73 43 74 78 20 50 6f 73 6c 69 73 74  fsetsCtx Poslist
16850 4f 66 66 73 65 74 73 43 74 78 3b 0a 73 74 72 75  OffsetsCtx;.stru
16860 63 74 20 50 6f 73 6c 69 73 74 4f 66 66 73 65 74  ct PoslistOffset
16870 73 43 74 78 20 7b 0a 20 20 46 74 73 35 42 75 66  sCtx {.  Fts5Buf
16880 66 65 72 20 2a 70 42 75 66 3b 20 20 20 20 20 20  fer *pBuf;      
16890 20 20 20 20 20 20 20 20 20 2f 2a 20 41 70 70 65           /* Appe
168a0 6e 64 20 74 6f 20 74 68 69 73 20 62 75 66 66 65  nd to this buffe
168b0 72 20 2a 2f 0a 20 20 46 74 73 35 43 6f 6c 73 65  r */.  Fts5Colse
168c0 74 20 2a 70 43 6f 6c 73 65 74 3b 20 20 20 20 20  t *pColset;     
168d0 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69         /* Restri
168e0 63 74 20 6d 61 74 63 68 65 73 20 74 6f 20 74 68  ct matches to th
168f0 69 73 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 69  is column */.  i
16900 6e 74 20 69 52 65 61 64 3b 0a 20 20 69 6e 74 20  nt iRead;.  int 
16910 69 57 72 69 74 65 3b 0a 7d 3b 0a 0a 2f 2a 0a 2a  iWrite;.};../*.*
16920 2a 20 54 4f 44 4f 3a 20 4d 61 6b 65 20 74 68 69  * TODO: Make thi
16930 73 20 6d 6f 72 65 20 65 66 66 69 63 69 65 6e 74  s more efficient
16940 21 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  !.*/.static int 
16950 66 74 73 35 49 6e 64 65 78 43 6f 6c 73 65 74 54  fts5IndexColsetT
16960 65 73 74 28 46 74 73 35 43 6f 6c 73 65 74 20 2a  est(Fts5Colset *
16970 70 43 6f 6c 73 65 74 2c 20 69 6e 74 20 69 43 6f  pColset, int iCo
16980 6c 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66  l){.  int i;.  f
16990 6f 72 28 69 3d 30 3b 20 69 3c 70 43 6f 6c 73 65  or(i=0; i<pColse
169a0 74 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20  t->nCol; i++){. 
169b0 20 20 20 69 66 28 20 70 43 6f 6c 73 65 74 2d 3e     if( pColset->
169c0 61 69 43 6f 6c 5b 69 5d 3d 3d 69 43 6f 6c 20 29  aiCol[i]==iCol )
169d0 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20   return 1;.  }. 
169e0 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 73 74   return 0;.}..st
169f0 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 50 6f  atic void fts5Po
16a00 73 6c 69 73 74 4f 66 66 73 65 74 73 43 61 6c 6c  slistOffsetsCall
16a10 62 61 63 6b 28 0a 20 20 46 74 73 35 49 6e 64 65  back(.  Fts5Inde
16a20 78 20 2a 70 55 6e 75 73 65 64 2c 20 0a 20 20 76  x *pUnused, .  v
16a30 6f 69 64 20 2a 70 43 6f 6e 74 65 78 74 2c 20 0a  oid *pContext, .
16a40 20 20 63 6f 6e 73 74 20 75 38 20 2a 70 43 68 75    const u8 *pChu
16a50 6e 6b 2c 20 69 6e 74 20 6e 43 68 75 6e 6b 0a 29  nk, int nChunk.)
16a60 7b 0a 20 20 50 6f 73 6c 69 73 74 4f 66 66 73 65  {.  PoslistOffse
16a70 74 73 43 74 78 20 2a 70 43 74 78 20 3d 20 28 50  tsCtx *pCtx = (P
16a80 6f 73 6c 69 73 74 4f 66 66 73 65 74 73 43 74 78  oslistOffsetsCtx
16a90 2a 29 70 43 6f 6e 74 65 78 74 3b 0a 20 20 55 4e  *)pContext;.  UN
16aa0 55 53 45 44 5f 50 41 52 41 4d 28 70 55 6e 75 73  USED_PARAM(pUnus
16ab0 65 64 29 3b 0a 20 20 61 73 73 65 72 74 5f 6e 63  ed);.  assert_nc
16ac0 28 20 6e 43 68 75 6e 6b 3e 3d 30 20 29 3b 0a 20  ( nChunk>=0 );. 
16ad0 20 69 66 28 20 6e 43 68 75 6e 6b 3e 30 20 29 7b   if( nChunk>0 ){
16ae0 0a 20 20 20 20 69 6e 74 20 69 20 3d 20 30 3b 0a  .    int i = 0;.
16af0 20 20 20 20 77 68 69 6c 65 28 20 69 3c 6e 43 68      while( i<nCh
16b00 75 6e 6b 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  unk ){.      int
16b10 20 69 56 61 6c 3b 0a 20 20 20 20 20 20 69 20 2b   iVal;.      i +
16b20 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e 74 33  = fts5GetVarint3
16b30 32 28 26 70 43 68 75 6e 6b 5b 69 5d 2c 20 69 56  2(&pChunk[i], iV
16b40 61 6c 29 3b 0a 20 20 20 20 20 20 69 56 61 6c 20  al);.      iVal 
16b50 2b 3d 20 70 43 74 78 2d 3e 69 52 65 61 64 20 2d  += pCtx->iRead -
16b60 20 32 3b 0a 20 20 20 20 20 20 70 43 74 78 2d 3e   2;.      pCtx->
16b70 69 52 65 61 64 20 3d 20 69 56 61 6c 3b 0a 20 20  iRead = iVal;.  
16b80 20 20 20 20 69 66 28 20 66 74 73 35 49 6e 64 65      if( fts5Inde
16b90 78 43 6f 6c 73 65 74 54 65 73 74 28 70 43 74 78  xColsetTest(pCtx
16ba0 2d 3e 70 43 6f 6c 73 65 74 2c 20 69 56 61 6c 29  ->pColset, iVal)
16bb0 20 29 7b 0a 20 20 20 20 20 20 20 20 66 74 73 35   ){.        fts5
16bc0 42 75 66 66 65 72 53 61 66 65 41 70 70 65 6e 64  BufferSafeAppend
16bd0 56 61 72 69 6e 74 28 70 43 74 78 2d 3e 70 42 75  Varint(pCtx->pBu
16be0 66 2c 20 69 56 61 6c 20 2b 20 32 20 2d 20 70 43  f, iVal + 2 - pC
16bf0 74 78 2d 3e 69 57 72 69 74 65 29 3b 0a 20 20 20  tx->iWrite);.   
16c00 20 20 20 20 20 70 43 74 78 2d 3e 69 57 72 69 74       pCtx->iWrit
16c10 65 20 3d 20 69 56 61 6c 3b 0a 20 20 20 20 20 20  e = iVal;.      
16c20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 73  }.    }.  }.}..s
16c30 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 50  tatic void fts5P
16c40 6f 73 6c 69 73 74 46 69 6c 74 65 72 43 61 6c 6c  oslistFilterCall
16c50 62 61 63 6b 28 0a 20 20 46 74 73 35 49 6e 64 65  back(.  Fts5Inde
16c60 78 20 2a 70 55 6e 75 73 65 64 2c 0a 20 20 76 6f  x *pUnused,.  vo
16c70 69 64 20 2a 70 43 6f 6e 74 65 78 74 2c 20 0a 20  id *pContext, . 
16c80 20 63 6f 6e 73 74 20 75 38 20 2a 70 43 68 75 6e   const u8 *pChun
16c90 6b 2c 20 69 6e 74 20 6e 43 68 75 6e 6b 0a 29 7b  k, int nChunk.){
16ca0 0a 20 20 50 6f 73 6c 69 73 74 43 61 6c 6c 62 61  .  PoslistCallba
16cb0 63 6b 43 74 78 20 2a 70 43 74 78 20 3d 20 28 50  ckCtx *pCtx = (P
16cc0 6f 73 6c 69 73 74 43 61 6c 6c 62 61 63 6b 43 74  oslistCallbackCt
16cd0 78 2a 29 70 43 6f 6e 74 65 78 74 3b 0a 20 20 55  x*)pContext;.  U
16ce0 4e 55 53 45 44 5f 50 41 52 41 4d 28 70 55 6e 75  NUSED_PARAM(pUnu
16cf0 73 65 64 29 3b 0a 20 20 61 73 73 65 72 74 5f 6e  sed);.  assert_n
16d00 63 28 20 6e 43 68 75 6e 6b 3e 3d 30 20 29 3b 0a  c( nChunk>=0 );.
16d10 20 20 69 66 28 20 6e 43 68 75 6e 6b 3e 30 20 29    if( nChunk>0 )
16d20 7b 0a 20 20 20 20 2f 2a 20 53 65 61 72 63 68 20  {.    /* Search 
16d30 74 68 72 6f 75 67 68 20 74 6f 20 66 69 6e 64 20  through to find 
16d40 74 68 65 20 66 69 72 73 74 20 76 61 72 69 6e 74  the first varint
16d50 20 77 69 74 68 20 76 61 6c 75 65 20 31 2e 20 54   with value 1. T
16d60 68 69 73 20 69 73 20 74 68 65 0a 20 20 20 20 2a  his is the.    *
16d70 2a 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 6e  * start of the n
16d80 65 78 74 20 63 6f 6c 75 6d 6e 73 20 68 69 74 73  ext columns hits
16d90 2e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 20 3d  . */.    int i =
16da0 20 30 3b 0a 20 20 20 20 69 6e 74 20 69 53 74 61   0;.    int iSta
16db0 72 74 20 3d 20 30 3b 0a 0a 20 20 20 20 69 66 28  rt = 0;..    if(
16dc0 20 70 43 74 78 2d 3e 65 53 74 61 74 65 3d 3d 32   pCtx->eState==2
16dd0 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 43   ){.      int iC
16de0 6f 6c 3b 0a 20 20 20 20 20 20 66 74 73 35 46 61  ol;.      fts5Fa
16df0 73 74 47 65 74 56 61 72 69 6e 74 33 32 28 70 43  stGetVarint32(pC
16e00 68 75 6e 6b 2c 20 69 2c 20 69 43 6f 6c 29 3b 0a  hunk, i, iCol);.
16e10 20 20 20 20 20 20 69 66 28 20 66 74 73 35 49 6e        if( fts5In
16e20 64 65 78 43 6f 6c 73 65 74 54 65 73 74 28 70 43  dexColsetTest(pC
16e30 74 78 2d 3e 70 43 6f 6c 73 65 74 2c 20 69 43 6f  tx->pColset, iCo
16e40 6c 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43  l) ){.        pC
16e50 74 78 2d 3e 65 53 74 61 74 65 20 3d 20 31 3b 0a  tx->eState = 1;.
16e60 20 20 20 20 20 20 20 20 66 74 73 35 42 75 66 66          fts5Buff
16e70 65 72 53 61 66 65 41 70 70 65 6e 64 56 61 72 69  erSafeAppendVari
16e80 6e 74 28 70 43 74 78 2d 3e 70 42 75 66 2c 20 31  nt(pCtx->pBuf, 1
16e90 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
16ea0 20 20 20 20 20 20 20 20 70 43 74 78 2d 3e 65 53          pCtx->eS
16eb0 74 61 74 65 20 3d 20 30 3b 0a 20 20 20 20 20 20  tate = 0;.      
16ec0 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 64 6f 20  }.    }..    do 
16ed0 7b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 69  {.      while( i
16ee0 3c 6e 43 68 75 6e 6b 20 26 26 20 70 43 68 75 6e  <nChunk && pChun
16ef0 6b 5b 69 5d 21 3d 30 78 30 31 20 29 7b 0a 20 20  k[i]!=0x01 ){.  
16f00 20 20 20 20 20 20 77 68 69 6c 65 28 20 70 43 68        while( pCh
16f10 75 6e 6b 5b 69 5d 20 26 20 30 78 38 30 20 29 20  unk[i] & 0x80 ) 
16f20 69 2b 2b 3b 0a 20 20 20 20 20 20 20 20 69 2b 2b  i++;.        i++
16f30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
16f40 69 66 28 20 70 43 74 78 2d 3e 65 53 74 61 74 65  if( pCtx->eState
16f50 20 29 7b 0a 20 20 20 20 20 20 20 20 66 74 73 35   ){.        fts5
16f60 42 75 66 66 65 72 53 61 66 65 41 70 70 65 6e 64  BufferSafeAppend
16f70 42 6c 6f 62 28 70 43 74 78 2d 3e 70 42 75 66 2c  Blob(pCtx->pBuf,
16f80 20 26 70 43 68 75 6e 6b 5b 69 53 74 61 72 74 5d   &pChunk[iStart]
16f90 2c 20 69 2d 69 53 74 61 72 74 29 3b 0a 20 20 20  , i-iStart);.   
16fa0 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 69     }.      if( i
16fb0 3c 6e 43 68 75 6e 6b 20 29 7b 0a 20 20 20 20 20  <nChunk ){.     
16fc0 20 20 20 69 6e 74 20 69 43 6f 6c 3b 0a 20 20 20     int iCol;.   
16fd0 20 20 20 20 20 69 53 74 61 72 74 20 3d 20 69 3b       iStart = i;
16fe0 0a 20 20 20 20 20 20 20 20 69 2b 2b 3b 0a 20 20  .        i++;.  
16ff0 20 20 20 20 20 20 69 66 28 20 69 3e 3d 6e 43 68        if( i>=nCh
17000 75 6e 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  unk ){.         
17010 20 70 43 74 78 2d 3e 65 53 74 61 74 65 20 3d 20   pCtx->eState = 
17020 32 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  2;.        }else
17030 7b 0a 20 20 20 20 20 20 20 20 20 20 66 74 73 35  {.          fts5
17040 46 61 73 74 47 65 74 56 61 72 69 6e 74 33 32 28  FastGetVarint32(
17050 70 43 68 75 6e 6b 2c 20 69 2c 20 69 43 6f 6c 29  pChunk, i, iCol)
17060 3b 0a 20 20 20 20 20 20 20 20 20 20 70 43 74 78  ;.          pCtx
17070 2d 3e 65 53 74 61 74 65 20 3d 20 66 74 73 35 49  ->eState = fts5I
17080 6e 64 65 78 43 6f 6c 73 65 74 54 65 73 74 28 70  ndexColsetTest(p
17090 43 74 78 2d 3e 70 43 6f 6c 73 65 74 2c 20 69 43  Ctx->pColset, iC
170a0 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  ol);.          i
170b0 66 28 20 70 43 74 78 2d 3e 65 53 74 61 74 65 20  f( pCtx->eState 
170c0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 66  ){.            f
170d0 74 73 35 42 75 66 66 65 72 53 61 66 65 41 70 70  ts5BufferSafeApp
170e0 65 6e 64 42 6c 6f 62 28 70 43 74 78 2d 3e 70 42  endBlob(pCtx->pB
170f0 75 66 2c 20 26 70 43 68 75 6e 6b 5b 69 53 74 61  uf, &pChunk[iSta
17100 72 74 5d 2c 20 69 2d 69 53 74 61 72 74 29 3b 0a  rt], i-iStart);.
17110 20 20 20 20 20 20 20 20 20 20 20 20 69 53 74 61              iSta
17120 72 74 20 3d 20 69 3b 0a 20 20 20 20 20 20 20 20  rt = i;.        
17130 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
17140 20 20 20 20 7d 0a 20 20 20 20 7d 77 68 69 6c 65      }.    }while
17150 28 20 69 3c 6e 43 68 75 6e 6b 20 29 3b 0a 20 20  ( i<nChunk );.  
17160 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64  }.}..static void
17170 20 66 74 73 35 43 68 75 6e 6b 49 74 65 72 61 74   fts5ChunkIterat
17180 65 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a  e(.  Fts5Index *
17190 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
171a0 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 62       /* Index ob
171b0 6a 65 63 74 20 2a 2f 0a 20 20 46 74 73 35 53 65  ject */.  Fts5Se
171c0 67 49 74 65 72 20 2a 70 53 65 67 2c 20 20 20 20  gIter *pSeg,    
171d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 73            /* Pos
171e0 6c 69 73 74 20 6f 66 20 74 68 69 73 20 69 74 65  list of this ite
171f0 72 61 74 6f 72 20 2a 2f 0a 20 20 76 6f 69 64 20  rator */.  void 
17200 2a 70 43 74 78 2c 20 20 20 20 20 20 20 20 20 20  *pCtx,          
17210 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f             /* Co
17220 6e 74 65 78 74 20 70 6f 69 6e 74 65 72 20 66 6f  ntext pointer fo
17230 72 20 78 43 68 75 6e 6b 20 63 61 6c 6c 62 61 63  r xChunk callbac
17240 6b 20 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 78 43  k */.  void (*xC
17250 68 75 6e 6b 29 28 46 74 73 35 49 6e 64 65 78 2a  hunk)(Fts5Index*
17260 2c 20 76 6f 69 64 2a 2c 20 63 6f 6e 73 74 20 75  , void*, const u
17270 38 2a 2c 20 69 6e 74 29 0a 29 7b 0a 20 20 69 6e  8*, int).){.  in
17280 74 20 6e 52 65 6d 20 3d 20 70 53 65 67 2d 3e 6e  t nRem = pSeg->n
17290 50 6f 73 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  Pos;          /*
172a0 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   Number of bytes
172b0 20 73 74 69 6c 6c 20 74 6f 20 63 6f 6d 65 20 2a   still to come *
172c0 2f 0a 20 20 46 74 73 35 44 61 74 61 20 2a 70 44  /.  Fts5Data *pD
172d0 61 74 61 20 3d 20 30 3b 0a 20 20 75 38 20 2a 70  ata = 0;.  u8 *p
172e0 43 68 75 6e 6b 20 3d 20 26 70 53 65 67 2d 3e 70  Chunk = &pSeg->p
172f0 4c 65 61 66 2d 3e 70 5b 70 53 65 67 2d 3e 69 4c  Leaf->p[pSeg->iL
17300 65 61 66 4f 66 66 73 65 74 5d 3b 0a 20 20 69 6e  eafOffset];.  in
17310 74 20 6e 43 68 75 6e 6b 20 3d 20 4d 49 4e 28 6e  t nChunk = MIN(n
17320 52 65 6d 2c 20 70 53 65 67 2d 3e 70 4c 65 61 66  Rem, pSeg->pLeaf
17330 2d 3e 73 7a 4c 65 61 66 20 2d 20 70 53 65 67 2d  ->szLeaf - pSeg-
17340 3e 69 4c 65 61 66 4f 66 66 73 65 74 29 3b 0a 20  >iLeafOffset);. 
17350 20 69 6e 74 20 70 67 6e 6f 20 3d 20 70 53 65 67   int pgno = pSeg
17360 2d 3e 69 4c 65 61 66 50 67 6e 6f 3b 0a 20 20 69  ->iLeafPgno;.  i
17370 6e 74 20 70 67 6e 6f 53 61 76 65 20 3d 20 30 3b  nt pgnoSave = 0;
17380 0a 0a 20 20 2f 2a 20 54 68 69 73 20 66 75 6e 63  ..  /* This func
17390 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 6d 77 6f  tion does notmwo
173a0 72 6b 20 77 69 74 68 20 64 65 74 61 69 6c 3d 6e  rk with detail=n
173b0 6f 6e 65 20 64 61 74 61 62 61 73 65 73 2e 20 2a  one databases. *
173c0 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70  /.  assert( p->p
173d0 43 6f 6e 66 69 67 2d 3e 65 44 65 74 61 69 6c 21  Config->eDetail!
173e0 3d 46 54 53 35 5f 44 45 54 41 49 4c 5f 4e 4f 4e  =FTS5_DETAIL_NON
173f0 45 20 29 3b 0a 0a 20 20 69 66 28 20 28 70 53 65  E );..  if( (pSe
17400 67 2d 3e 66 6c 61 67 73 20 26 20 46 54 53 35 5f  g->flags & FTS5_
17410 53 45 47 49 54 45 52 5f 52 45 56 45 52 53 45 29  SEGITER_REVERSE)
17420 3d 3d 30 20 29 7b 0a 20 20 20 20 70 67 6e 6f 53  ==0 ){.    pgnoS
17430 61 76 65 20 3d 20 70 67 6e 6f 2b 31 3b 0a 20 20  ave = pgno+1;.  
17440 7d 0a 0a 20 20 77 68 69 6c 65 28 20 31 20 29 7b  }..  while( 1 ){
17450 0a 20 20 20 20 78 43 68 75 6e 6b 28 70 2c 20 70  .    xChunk(p, p
17460 43 74 78 2c 20 70 43 68 75 6e 6b 2c 20 6e 43 68  Ctx, pChunk, nCh
17470 75 6e 6b 29 3b 0a 20 20 20 20 6e 52 65 6d 20 2d  unk);.    nRem -
17480 3d 20 6e 43 68 75 6e 6b 3b 0a 20 20 20 20 66 74  = nChunk;.    ft
17490 73 35 44 61 74 61 52 65 6c 65 61 73 65 28 70 44  s5DataRelease(pD
174a0 61 74 61 29 3b 0a 20 20 20 20 69 66 28 20 6e 52  ata);.    if( nR
174b0 65 6d 3c 3d 30 20 29 7b 0a 20 20 20 20 20 20 62  em<=0 ){.      b
174c0 72 65 61 6b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  reak;.    }else{
174d0 0a 20 20 20 20 20 20 70 67 6e 6f 2b 2b 3b 0a 20  .      pgno++;. 
174e0 20 20 20 20 20 70 44 61 74 61 20 3d 20 66 74 73       pData = fts
174f0 35 4c 65 61 66 52 65 61 64 28 70 2c 20 46 54 53  5LeafRead(p, FTS
17500 35 5f 53 45 47 4d 45 4e 54 5f 52 4f 57 49 44 28  5_SEGMENT_ROWID(
17510 70 53 65 67 2d 3e 70 53 65 67 2d 3e 69 53 65 67  pSeg->pSeg->iSeg
17520 69 64 2c 20 70 67 6e 6f 29 29 3b 0a 20 20 20 20  id, pgno));.    
17530 20 20 69 66 28 20 70 44 61 74 61 3d 3d 30 20 29    if( pData==0 )
17540 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 70 43   break;.      pC
17550 68 75 6e 6b 20 3d 20 26 70 44 61 74 61 2d 3e 70  hunk = &pData->p
17560 5b 34 5d 3b 0a 20 20 20 20 20 20 6e 43 68 75 6e  [4];.      nChun
17570 6b 20 3d 20 4d 49 4e 28 6e 52 65 6d 2c 20 70 44  k = MIN(nRem, pD
17580 61 74 61 2d 3e 73 7a 4c 65 61 66 20 2d 20 34 29  ata->szLeaf - 4)
17590 3b 0a 20 20 20 20 20 20 69 66 28 20 70 67 6e 6f  ;.      if( pgno
175a0 3d 3d 70 67 6e 6f 53 61 76 65 20 29 7b 0a 20 20  ==pgnoSave ){.  
175b0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 53        assert( pS
175c0 65 67 2d 3e 70 4e 65 78 74 4c 65 61 66 3d 3d 30  eg->pNextLeaf==0
175d0 20 29 3b 0a 20 20 20 20 20 20 20 20 70 53 65 67   );.        pSeg
175e0 2d 3e 70 4e 65 78 74 4c 65 61 66 20 3d 20 70 44  ->pNextLeaf = pD
175f0 61 74 61 3b 0a 20 20 20 20 20 20 20 20 70 44 61  ata;.        pDa
17600 74 61 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a  ta = 0;.      }.
17610 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
17620 2a 2a 20 49 74 65 72 61 74 6f 72 20 70 49 74 65  ** Iterator pIte
17630 72 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e  r currently poin
17640 74 73 20 74 6f 20 61 20 76 61 6c 69 64 20 65 6e  ts to a valid en
17650 74 72 79 20 28 6e 6f 74 20 45 4f 46 29 2e 20 54  try (not EOF). T
17660 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20  his.** function 
17670 61 70 70 65 6e 64 73 20 74 68 65 20 70 6f 73 69  appends the posi
17680 74 69 6f 6e 20 6c 69 73 74 20 64 61 74 61 20 66  tion list data f
17690 6f 72 20 74 68 65 20 63 75 72 72 65 6e 74 20 65  or the current e
176a0 6e 74 72 79 20 74 6f 0a 2a 2a 20 62 75 66 66 65  ntry to.** buffe
176b0 72 20 70 42 75 66 2e 20 49 74 20 64 6f 65 73 20  r pBuf. It does 
176c0 6e 6f 74 20 6d 61 6b 65 20 61 20 63 6f 70 79 20  not make a copy 
176d0 6f 66 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 2d  of the position-
176e0 6c 69 73 74 20 73 69 7a 65 0a 2a 2a 20 66 69 65  list size.** fie
176f0 6c 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ld..*/.static vo
17700 69 64 20 66 74 73 35 53 65 67 69 74 65 72 50 6f  id fts5SegiterPo
17710 73 6c 69 73 74 28 0a 20 20 46 74 73 35 49 6e 64  slist(.  Fts5Ind
17720 65 78 20 2a 70 2c 0a 20 20 46 74 73 35 53 65 67  ex *p,.  Fts5Seg
17730 49 74 65 72 20 2a 70 53 65 67 2c 0a 20 20 46 74  Iter *pSeg,.  Ft
17740 73 35 43 6f 6c 73 65 74 20 2a 70 43 6f 6c 73 65  s5Colset *pColse
17750 74 2c 0a 20 20 46 74 73 35 42 75 66 66 65 72 20  t,.  Fts5Buffer 
17760 2a 70 42 75 66 0a 29 7b 0a 20 20 69 66 28 20 30  *pBuf.){.  if( 0
17770 3d 3d 66 74 73 35 42 75 66 66 65 72 47 72 6f 77  ==fts5BufferGrow
17780 28 26 70 2d 3e 72 63 2c 20 70 42 75 66 2c 20 70  (&p->rc, pBuf, p
17790 53 65 67 2d 3e 6e 50 6f 73 29 20 29 7b 0a 20 20  Seg->nPos) ){.  
177a0 20 20 69 66 28 20 70 43 6f 6c 73 65 74 3d 3d 30    if( pColset==0
177b0 20 29 7b 0a 20 20 20 20 20 20 66 74 73 35 43 68   ){.      fts5Ch
177c0 75 6e 6b 49 74 65 72 61 74 65 28 70 2c 20 70 53  unkIterate(p, pS
177d0 65 67 2c 20 28 76 6f 69 64 2a 29 70 42 75 66 2c  eg, (void*)pBuf,
177e0 20 66 74 73 35 50 6f 73 6c 69 73 74 43 61 6c 6c   fts5PoslistCall
177f0 62 61 63 6b 29 3b 0a 20 20 20 20 7d 65 6c 73 65  back);.    }else
17800 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 70  {.      if( p->p
17810 43 6f 6e 66 69 67 2d 3e 65 44 65 74 61 69 6c 3d  Config->eDetail=
17820 3d 46 54 53 35 5f 44 45 54 41 49 4c 5f 46 55 4c  =FTS5_DETAIL_FUL
17830 4c 20 29 7b 0a 20 20 20 20 20 20 20 20 50 6f 73  L ){.        Pos
17840 6c 69 73 74 43 61 6c 6c 62 61 63 6b 43 74 78 20  listCallbackCtx 
17850 73 43 74 78 3b 0a 20 20 20 20 20 20 20 20 73 43  sCtx;.        sC
17860 74 78 2e 70 42 75 66 20 3d 20 70 42 75 66 3b 0a  tx.pBuf = pBuf;.
17870 20 20 20 20 20 20 20 20 73 43 74 78 2e 70 43 6f          sCtx.pCo
17880 6c 73 65 74 20 3d 20 70 43 6f 6c 73 65 74 3b 0a  lset = pColset;.
17890 20 20 20 20 20 20 20 20 73 43 74 78 2e 65 53 74          sCtx.eSt
178a0 61 74 65 20 3d 20 66 74 73 35 49 6e 64 65 78 43  ate = fts5IndexC
178b0 6f 6c 73 65 74 54 65 73 74 28 70 43 6f 6c 73 65  olsetTest(pColse
178c0 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 61  t, 0);.        a
178d0 73 73 65 72 74 28 20 73 43 74 78 2e 65 53 74 61  ssert( sCtx.eSta
178e0 74 65 3d 3d 30 20 7c 7c 20 73 43 74 78 2e 65 53  te==0 || sCtx.eS
178f0 74 61 74 65 3d 3d 31 20 29 3b 0a 20 20 20 20 20  tate==1 );.     
17900 20 20 20 66 74 73 35 43 68 75 6e 6b 49 74 65 72     fts5ChunkIter
17910 61 74 65 28 70 2c 20 70 53 65 67 2c 20 28 76 6f  ate(p, pSeg, (vo
17920 69 64 2a 29 26 73 43 74 78 2c 20 66 74 73 35 50  id*)&sCtx, fts5P
17930 6f 73 6c 69 73 74 46 69 6c 74 65 72 43 61 6c 6c  oslistFilterCall
17940 62 61 63 6b 29 3b 0a 20 20 20 20 20 20 7d 65 6c  back);.      }el
17950 73 65 7b 0a 20 20 20 20 20 20 20 20 50 6f 73 6c  se{.        Posl
17960 69 73 74 4f 66 66 73 65 74 73 43 74 78 20 73 43  istOffsetsCtx sC
17970 74 78 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 73  tx;.        mems
17980 65 74 28 26 73 43 74 78 2c 20 30 2c 20 73 69 7a  et(&sCtx, 0, siz
17990 65 6f 66 28 73 43 74 78 29 29 3b 0a 20 20 20 20  eof(sCtx));.    
179a0 20 20 20 20 73 43 74 78 2e 70 42 75 66 20 3d 20      sCtx.pBuf = 
179b0 70 42 75 66 3b 0a 20 20 20 20 20 20 20 20 73 43  pBuf;.        sC
179c0 74 78 2e 70 43 6f 6c 73 65 74 20 3d 20 70 43 6f  tx.pColset = pCo
179d0 6c 73 65 74 3b 0a 20 20 20 20 20 20 20 20 66 74  lset;.        ft
179e0 73 35 43 68 75 6e 6b 49 74 65 72 61 74 65 28 70  s5ChunkIterate(p
179f0 2c 20 70 53 65 67 2c 20 28 76 6f 69 64 2a 29 26  , pSeg, (void*)&
17a00 73 43 74 78 2c 20 66 74 73 35 50 6f 73 6c 69 73  sCtx, fts5Poslis
17a10 74 4f 66 66 73 65 74 73 43 61 6c 6c 62 61 63 6b  tOffsetsCallback
17a20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
17a30 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 4e  .  }.}../*.** IN
17a40 2f 4f 55 54 20 70 61 72 61 6d 65 74 65 72 20 28  /OUT parameter (
17a50 2a 70 61 29 20 70 6f 69 6e 74 73 20 74 6f 20 61  *pa) points to a
17a60 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74 20 6e   position list n
17a70 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2e 20   bytes in size. 
17a80 49 66 0a 2a 2a 20 74 68 65 20 70 6f 73 69 74 69  If.** the positi
17a90 6f 6e 20 6c 69 73 74 20 63 6f 6e 74 61 69 6e 73  on list contains
17aa0 20 65 6e 74 72 69 65 73 20 66 6f 72 20 63 6f 6c   entries for col
17ab0 75 6d 6e 20 69 43 6f 6c 2c 20 74 68 65 6e 20 28  umn iCol, then (
17ac0 2a 70 61 29 20 69 73 20 73 65 74 0a 2a 2a 20 74  *pa) is set.** t
17ad0 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 73  o point to the s
17ae0 75 62 2d 70 6f 73 69 74 69 6f 6e 2d 6c 69 73 74  ub-position-list
17af0 20 66 6f 72 20 74 68 61 74 20 63 6f 6c 75 6d 6e   for that column
17b00 20 61 6e 64 20 74 68 65 20 6e 75 6d 62 65 72 20   and the number 
17b10 6f 66 0a 2a 2a 20 62 79 74 65 73 20 69 6e 20 69  of.** bytes in i
17b20 74 20 72 65 74 75 72 6e 65 64 2e 20 4f 72 2c 20  t returned. Or, 
17b30 69 66 20 74 68 65 20 61 72 67 75 6d 65 6e 74 20  if the argument 
17b40 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74 20 64 6f  position list do
17b50 65 73 20 6e 6f 74 0a 2a 2a 20 63 6f 6e 74 61 69  es not.** contai
17b60 6e 20 61 6e 79 20 65 6e 74 72 69 65 73 20 66 6f  n any entries fo
17b70 72 20 63 6f 6c 75 6d 6e 20 69 43 6f 6c 2c 20 72  r column iCol, r
17b80 65 74 75 72 6e 20 30 2e 0a 2a 2f 0a 73 74 61 74  eturn 0..*/.stat
17b90 69 63 20 69 6e 74 20 66 74 73 35 49 6e 64 65 78  ic int fts5Index
17ba0 45 78 74 72 61 63 74 43 6f 6c 28 0a 20 20 63 6f  ExtractCol(.  co
17bb0 6e 73 74 20 75 38 20 2a 2a 70 61 2c 20 20 20 20  nst u8 **pa,    
17bc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
17bd0 20 49 4e 2f 4f 55 54 3a 20 50 6f 69 6e 74 65 72   IN/OUT: Pointer
17be0 20 74 6f 20 70 6f 73 6c 69 73 74 20 2a 2f 0a 20   to poslist */. 
17bf0 20 69 6e 74 20 6e 2c 20 20 20 20 20 20 20 20 20   int n,         
17c00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17c10 20 2f 2a 20 49 4e 3a 20 53 69 7a 65 20 6f 66 20   /* IN: Size of 
17c20 70 6f 73 6c 69 73 74 20 69 6e 20 62 79 74 65 73  poslist in bytes
17c30 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 20 20   */.  int iCol  
17c40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17c50 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20        /* Column 
17c60 74 6f 20 65 78 74 72 61 63 74 20 66 72 6f 6d 20  to extract from 
17c70 70 6f 73 6c 69 73 74 20 2a 2f 0a 29 7b 0a 20 20  poslist */.){.  
17c80 69 6e 74 20 69 43 75 72 72 65 6e 74 20 3d 20 30  int iCurrent = 0
17c90 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
17ca0 2f 2a 20 41 6e 79 74 68 69 6e 67 20 62 65 66 6f  /* Anything befo
17cb0 72 65 20 74 68 65 20 66 69 72 73 74 20 30 78 30  re the first 0x0
17cc0 31 20 69 73 20 63 6f 6c 20 30 20 2a 2f 0a 20 20  1 is col 0 */.  
17cd0 63 6f 6e 73 74 20 75 38 20 2a 70 20 3d 20 2a 70  const u8 *p = *p
17ce0 61 3b 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 70  a;.  const u8 *p
17cf0 45 6e 64 20 3d 20 26 70 5b 6e 5d 3b 20 20 20 20  End = &p[n];    
17d00 20 20 20 20 20 2f 2a 20 4f 6e 65 20 62 79 74 65       /* One byte
17d10 20 70 61 73 74 20 65 6e 64 20 6f 66 20 70 6f 73   past end of pos
17d20 69 74 69 6f 6e 20 6c 69 73 74 20 2a 2f 0a 0a 20  ition list */.. 
17d30 20 77 68 69 6c 65 28 20 69 43 6f 6c 3e 69 43 75   while( iCol>iCu
17d40 72 72 65 6e 74 20 29 7b 0a 20 20 20 20 2f 2a 20  rrent ){.    /* 
17d50 41 64 76 61 6e 63 65 20 70 6f 69 6e 74 65 72 20  Advance pointer 
17d60 70 20 75 6e 74 69 6c 20 69 74 20 70 6f 69 6e 74  p until it point
17d70 73 20 74 6f 20 70 45 6e 64 20 6f 72 20 61 6e 20  s to pEnd or an 
17d80 30 78 30 31 20 62 79 74 65 20 74 68 61 74 20 69  0x01 byte that i
17d90 73 0a 20 20 20 20 2a 2a 20 6e 6f 74 20 70 61 72  s.    ** not par
17da0 74 20 6f 66 20 61 20 76 61 72 69 6e 74 2e 20 4e  t of a varint. N
17db0 6f 74 65 20 74 68 61 74 20 69 74 20 69 73 20 6e  ote that it is n
17dc0 6f 74 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 20  ot possible for 
17dd0 61 20 6e 65 67 61 74 69 76 65 0a 20 20 20 20 2a  a negative.    *
17de0 2a 20 6f 72 20 65 78 74 72 65 6d 65 6c 79 20 6c  * or extremely l
17df0 61 72 67 65 20 76 61 72 69 6e 74 20 74 6f 20 6f  arge varint to o
17e00 63 63 75 72 20 77 69 74 68 69 6e 20 61 6e 20 75  ccur within an u
17e10 6e 63 6f 72 72 75 70 74 65 64 20 70 6f 73 69 74  ncorrupted posit
17e20 69 6f 6e 20 0a 20 20 20 20 2a 2a 20 6c 69 73 74  ion .    ** list
17e30 2e 20 53 6f 20 74 68 65 20 6c 61 73 74 20 62 79  . So the last by
17e40 74 65 20 6f 66 20 65 61 63 68 20 76 61 72 69 6e  te of each varin
17e50 74 20 6d 61 79 20 62 65 20 61 73 73 75 6d 65 64  t may be assumed
17e60 20 74 6f 20 68 61 76 65 20 61 20 63 6c 65 61 72   to have a clear
17e70 0a 20 20 20 20 2a 2a 20 30 78 38 30 20 62 69 74  .    ** 0x80 bit
17e80 2e 20 20 2a 2f 0a 20 20 20 20 77 68 69 6c 65 28  .  */.    while(
17e90 20 2a 70 21 3d 30 78 30 31 20 29 7b 0a 20 20 20   *p!=0x01 ){.   
17ea0 20 20 20 77 68 69 6c 65 28 20 2a 70 2b 2b 20 26     while( *p++ &
17eb0 20 30 78 38 30 20 29 3b 0a 20 20 20 20 20 20 69   0x80 );.      i
17ec0 66 28 20 70 3e 3d 70 45 6e 64 20 29 20 72 65 74  f( p>=pEnd ) ret
17ed0 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20  urn 0;.    }.   
17ee0 20 2a 70 61 20 3d 20 70 2b 2b 3b 0a 20 20 20 20   *pa = p++;.    
17ef0 69 43 75 72 72 65 6e 74 20 3d 20 2a 70 2b 2b 3b  iCurrent = *p++;
17f00 0a 20 20 20 20 69 66 28 20 69 43 75 72 72 65 6e  .    if( iCurren
17f10 74 20 26 20 30 78 38 30 20 29 7b 0a 20 20 20 20  t & 0x80 ){.    
17f20 20 20 70 2d 2d 3b 0a 20 20 20 20 20 20 70 20 2b    p--;.      p +
17f30 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e 74 33  = fts5GetVarint3
17f40 32 28 70 2c 20 69 43 75 72 72 65 6e 74 29 3b 0a  2(p, iCurrent);.
17f50 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
17f60 69 43 6f 6c 21 3d 69 43 75 72 72 65 6e 74 20 29  iCol!=iCurrent )
17f70 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20 2f 2a   return 0;..  /*
17f80 20 41 64 76 61 6e 63 65 20 70 6f 69 6e 74 65 72   Advance pointer
17f90 20 70 20 75 6e 74 69 6c 20 69 74 20 70 6f 69 6e   p until it poin
17fa0 74 73 20 74 6f 20 70 45 6e 64 20 6f 72 20 61 6e  ts to pEnd or an
17fb0 20 30 78 30 31 20 62 79 74 65 20 74 68 61 74 20   0x01 byte that 
17fc0 69 73 0a 20 20 2a 2a 20 6e 6f 74 20 70 61 72 74  is.  ** not part
17fd0 20 6f 66 20 61 20 76 61 72 69 6e 74 20 2a 2f 0a   of a varint */.
17fe0 20 20 77 68 69 6c 65 28 20 70 3c 70 45 6e 64 20    while( p<pEnd 
17ff0 26 26 20 2a 70 21 3d 30 78 30 31 20 29 7b 0a 20  && *p!=0x01 ){. 
18000 20 20 20 77 68 69 6c 65 28 20 2a 70 2b 2b 20 26     while( *p++ &
18010 20 30 78 38 30 20 29 3b 0a 20 20 7d 0a 0a 20 20   0x80 );.  }..  
18020 72 65 74 75 72 6e 20 70 20 2d 20 28 2a 70 61 29  return p - (*pa)
18030 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64  ;.}..static void
18040 20 66 74 73 35 49 6e 64 65 78 45 78 74 72 61 63   fts5IndexExtrac
18050 74 43 6f 6c 73 65 74 28 0a 20 20 69 6e 74 20 2a  tColset(.  int *
18060 70 52 63 2c 0a 20 20 46 74 73 35 43 6f 6c 73 65  pRc,.  Fts5Colse
18070 74 20 2a 70 43 6f 6c 73 65 74 2c 20 20 20 20 20  t *pColset,     
18080 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 73 65 74         /* Colset
18090 20 74 6f 20 66 69 6c 74 65 72 20 6f 6e 20 2a 2f   to filter on */
180a0 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 70 50 6f  .  const u8 *pPo
180b0 73 2c 20 69 6e 74 20 6e 50 6f 73 2c 20 20 20 20  s, int nPos,    
180c0 20 20 20 2f 2a 20 50 6f 73 69 74 69 6f 6e 20 6c     /* Position l
180d0 69 73 74 20 2a 2f 0a 20 20 46 74 73 35 42 75 66  ist */.  Fts5Buf
180e0 66 65 72 20 2a 70 42 75 66 20 20 20 20 20 20 20  fer *pBuf       
180f0 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 75 74 70           /* Outp
18100 75 74 20 62 75 66 66 65 72 20 2a 2f 0a 29 7b 0a  ut buffer */.){.
18110 20 20 69 66 28 20 2a 70 52 63 3d 3d 53 51 4c 49    if( *pRc==SQLI
18120 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 6e 74  TE_OK ){.    int
18130 20 69 3b 0a 20 20 20 20 66 74 73 35 42 75 66 66   i;.    fts5Buff
18140 65 72 5a 65 72 6f 28 70 42 75 66 29 3b 0a 20 20  erZero(pBuf);.  
18150 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 43 6f    for(i=0; i<pCo
18160 6c 73 65 74 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29  lset->nCol; i++)
18170 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 75 38  {.      const u8
18180 20 2a 70 53 75 62 20 3d 20 70 50 6f 73 3b 0a 20   *pSub = pPos;. 
18190 20 20 20 20 20 69 6e 74 20 6e 53 75 62 20 3d 20       int nSub = 
181a0 66 74 73 35 49 6e 64 65 78 45 78 74 72 61 63 74  fts5IndexExtract
181b0 43 6f 6c 28 26 70 53 75 62 2c 20 6e 50 6f 73 2c  Col(&pSub, nPos,
181c0 20 70 43 6f 6c 73 65 74 2d 3e 61 69 43 6f 6c 5b   pColset->aiCol[
181d0 69 5d 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6e  i]);.      if( n
181e0 53 75 62 20 29 7b 0a 20 20 20 20 20 20 20 20 66  Sub ){.        f
181f0 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 42  ts5BufferAppendB
18200 6c 6f 62 28 70 52 63 2c 20 70 42 75 66 2c 20 6e  lob(pRc, pBuf, n
18210 53 75 62 2c 20 70 53 75 62 29 3b 0a 20 20 20 20  Sub, pSub);.    
18220 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a    }.    }.  }.}.
18230 0a 2f 2a 0a 2a 2a 20 78 53 65 74 4f 75 74 70 75  ./*.** xSetOutpu
18240 74 73 20 63 61 6c 6c 62 61 63 6b 20 75 73 65 64  ts callback used
18250 20 62 79 20 64 65 74 61 69 6c 3d 6e 6f 6e 65 20   by detail=none 
18260 74 61 62 6c 65 73 2e 0a 2a 2f 0a 73 74 61 74 69  tables..*/.stati
18270 63 20 76 6f 69 64 20 66 74 73 35 49 74 65 72 53  c void fts5IterS
18280 65 74 4f 75 74 70 75 74 73 5f 4e 6f 6e 65 28 46  etOutputs_None(F
18290 74 73 35 49 74 65 72 20 2a 70 49 74 65 72 2c 20  ts5Iter *pIter, 
182a0 46 74 73 35 53 65 67 49 74 65 72 20 2a 70 53 65  Fts5SegIter *pSe
182b0 67 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 49  g){.  assert( pI
182c0 74 65 72 2d 3e 70 49 6e 64 65 78 2d 3e 70 43 6f  ter->pIndex->pCo
182d0 6e 66 69 67 2d 3e 65 44 65 74 61 69 6c 3d 3d 46  nfig->eDetail==F
182e0 54 53 35 5f 44 45 54 41 49 4c 5f 4e 4f 4e 45 20  TS5_DETAIL_NONE 
182f0 29 3b 0a 20 20 70 49 74 65 72 2d 3e 62 61 73 65  );.  pIter->base
18300 2e 69 52 6f 77 69 64 20 3d 20 70 53 65 67 2d 3e  .iRowid = pSeg->
18310 69 52 6f 77 69 64 3b 0a 20 20 70 49 74 65 72 2d  iRowid;.  pIter-
18320 3e 62 61 73 65 2e 6e 44 61 74 61 20 3d 20 70 53  >base.nData = pS
18330 65 67 2d 3e 6e 50 6f 73 3b 0a 7d 0a 0a 2f 2a 0a  eg->nPos;.}../*.
18340 2a 2a 20 78 53 65 74 4f 75 74 70 75 74 73 20 63  ** xSetOutputs c
18350 61 6c 6c 62 61 63 6b 20 75 73 65 64 20 62 79 20  allback used by 
18360 64 65 74 61 69 6c 3d 66 75 6c 6c 20 61 6e 64 20  detail=full and 
18370 64 65 74 61 69 6c 3d 63 6f 6c 20 74 61 62 6c 65  detail=col table
18380 73 20 77 68 65 6e 20 6e 6f 0a 2a 2a 20 63 6f 6c  s when no.** col
18390 75 6d 6e 20 66 69 6c 74 65 72 73 20 61 72 65 20  umn filters are 
183a0 73 70 65 63 69 66 69 65 64 2e 0a 2a 2f 0a 73 74  specified..*/.st
183b0 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 49 74  atic void fts5It
183c0 65 72 53 65 74 4f 75 74 70 75 74 73 5f 4e 6f 63  erSetOutputs_Noc
183d0 6f 6c 73 65 74 28 46 74 73 35 49 74 65 72 20 2a  olset(Fts5Iter *
183e0 70 49 74 65 72 2c 20 46 74 73 35 53 65 67 49 74  pIter, Fts5SegIt
183f0 65 72 20 2a 70 53 65 67 29 7b 0a 20 20 70 49 74  er *pSeg){.  pIt
18400 65 72 2d 3e 62 61 73 65 2e 69 52 6f 77 69 64 20  er->base.iRowid 
18410 3d 20 70 53 65 67 2d 3e 69 52 6f 77 69 64 3b 0a  = pSeg->iRowid;.
18420 20 20 70 49 74 65 72 2d 3e 62 61 73 65 2e 6e 44    pIter->base.nD
18430 61 74 61 20 3d 20 70 53 65 67 2d 3e 6e 50 6f 73  ata = pSeg->nPos
18440 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 49 74  ;..  assert( pIt
18450 65 72 2d 3e 70 49 6e 64 65 78 2d 3e 70 43 6f 6e  er->pIndex->pCon
18460 66 69 67 2d 3e 65 44 65 74 61 69 6c 21 3d 46 54  fig->eDetail!=FT
18470 53 35 5f 44 45 54 41 49 4c 5f 4e 4f 4e 45 20 29  S5_DETAIL_NONE )
18480 3b 0a 20 20 61 73 73 65 72 74 28 20 70 49 74 65  ;.  assert( pIte
18490 72 2d 3e 70 43 6f 6c 73 65 74 3d 3d 30 20 29 3b  r->pColset==0 );
184a0 0a 0a 20 20 69 66 28 20 70 53 65 67 2d 3e 69 4c  ..  if( pSeg->iL
184b0 65 61 66 4f 66 66 73 65 74 2b 70 53 65 67 2d 3e  eafOffset+pSeg->
184c0 6e 50 6f 73 3c 3d 70 53 65 67 2d 3e 70 4c 65 61  nPos<=pSeg->pLea
184d0 66 2d 3e 73 7a 4c 65 61 66 20 29 7b 0a 20 20 20  f->szLeaf ){.   
184e0 20 2f 2a 20 41 6c 6c 20 64 61 74 61 20 69 73 20   /* All data is 
184f0 73 74 6f 72 65 64 20 6f 6e 20 74 68 65 20 63 75  stored on the cu
18500 72 72 65 6e 74 20 70 61 67 65 2e 20 50 6f 70 75  rrent page. Popu
18510 6c 61 74 65 20 74 68 65 20 6f 75 74 70 75 74 20  late the output 
18520 0a 20 20 20 20 2a 2a 20 76 61 72 69 61 62 6c 65  .    ** variable
18530 73 20 74 6f 20 70 6f 69 6e 74 20 69 6e 74 6f 20  s to point into 
18540 74 68 65 20 62 6f 64 79 20 6f 66 20 74 68 65 20  the body of the 
18550 70 61 67 65 20 6f 62 6a 65 63 74 2e 20 2a 2f 0a  page object. */.
18560 20 20 20 20 70 49 74 65 72 2d 3e 62 61 73 65 2e      pIter->base.
18570 70 44 61 74 61 20 3d 20 26 70 53 65 67 2d 3e 70  pData = &pSeg->p
18580 4c 65 61 66 2d 3e 70 5b 70 53 65 67 2d 3e 69 4c  Leaf->p[pSeg->iL
18590 65 61 66 4f 66 66 73 65 74 5d 3b 0a 20 20 7d 65  eafOffset];.  }e
185a0 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20  lse{.    /* The 
185b0 64 61 74 61 20 69 73 20 64 69 73 74 72 69 62 75  data is distribu
185c0 74 65 64 20 6f 76 65 72 20 74 77 6f 20 6f 72 20  ted over two or 
185d0 6d 6f 72 65 20 70 61 67 65 73 2e 20 43 6f 70 79  more pages. Copy
185e0 20 69 74 20 69 6e 74 6f 20 74 68 65 0a 20 20 20   it into the.   
185f0 20 2a 2a 20 46 74 73 35 49 74 65 72 2e 70 6f 73   ** Fts5Iter.pos
18600 6c 69 73 74 20 62 75 66 66 65 72 20 61 6e 64 20  list buffer and 
18610 74 68 65 6e 20 73 65 74 20 74 68 65 20 6f 75 74  then set the out
18620 70 75 74 20 70 6f 69 6e 74 65 72 20 74 6f 20 70  put pointer to p
18630 6f 69 6e 74 0a 20 20 20 20 2a 2a 20 74 6f 20 74  oint.    ** to t
18640 68 69 73 20 62 75 66 66 65 72 2e 20 20 2a 2f 0a  his buffer.  */.
18650 20 20 20 20 66 74 73 35 42 75 66 66 65 72 5a 65      fts5BufferZe
18660 72 6f 28 26 70 49 74 65 72 2d 3e 70 6f 73 6c 69  ro(&pIter->posli
18670 73 74 29 3b 0a 20 20 20 20 66 74 73 35 53 65 67  st);.    fts5Seg
18680 69 74 65 72 50 6f 73 6c 69 73 74 28 70 49 74 65  iterPoslist(pIte
18690 72 2d 3e 70 49 6e 64 65 78 2c 20 70 53 65 67 2c  r->pIndex, pSeg,
186a0 20 30 2c 20 26 70 49 74 65 72 2d 3e 70 6f 73 6c   0, &pIter->posl
186b0 69 73 74 29 3b 0a 20 20 20 20 70 49 74 65 72 2d  ist);.    pIter-
186c0 3e 62 61 73 65 2e 70 44 61 74 61 20 3d 20 70 49  >base.pData = pI
186d0 74 65 72 2d 3e 70 6f 73 6c 69 73 74 2e 70 3b 0a  ter->poslist.p;.
186e0 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 78 53 65    }.}../*.** xSe
186f0 74 4f 75 74 70 75 74 73 20 63 61 6c 6c 62 61 63  tOutputs callbac
18700 6b 20 75 73 65 64 20 77 68 65 6e 20 74 68 65 20  k used when the 
18710 46 74 73 35 43 6f 6c 73 65 74 20 6f 62 6a 65 63  Fts5Colset objec
18720 74 20 68 61 73 20 6e 43 6f 6c 3d 3d 30 20 28 6d  t has nCol==0 (m
18730 61 74 63 68 0a 2a 2a 20 61 67 61 69 6e 73 74 20  atch.** against 
18740 6e 6f 20 63 6f 6c 75 6d 6e 73 20 61 74 20 61 6c  no columns at al
18750 6c 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  l)..*/.static vo
18760 69 64 20 66 74 73 35 49 74 65 72 53 65 74 4f 75  id fts5IterSetOu
18770 74 70 75 74 73 5f 5a 65 72 6f 43 6f 6c 73 65 74  tputs_ZeroColset
18780 28 46 74 73 35 49 74 65 72 20 2a 70 49 74 65 72  (Fts5Iter *pIter
18790 2c 20 46 74 73 35 53 65 67 49 74 65 72 20 2a 70  , Fts5SegIter *p
187a0 53 65 67 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50  Seg){.  UNUSED_P
187b0 41 52 41 4d 28 70 53 65 67 29 3b 0a 20 20 70 49  ARAM(pSeg);.  pI
187c0 74 65 72 2d 3e 62 61 73 65 2e 6e 44 61 74 61 20  ter->base.nData 
187d0 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 78 53  = 0;.}../*.** xS
187e0 65 74 4f 75 74 70 75 74 73 20 63 61 6c 6c 62 61  etOutputs callba
187f0 63 6b 20 75 73 65 64 20 62 79 20 64 65 74 61 69  ck used by detai
18800 6c 3d 63 6f 6c 20 77 68 65 6e 20 74 68 65 72 65  l=col when there
18810 20 69 73 20 61 20 63 6f 6c 75 6d 6e 20 66 69 6c   is a column fil
18820 74 65 72 0a 2a 2a 20 61 6e 64 20 74 68 65 72 65  ter.** and there
18830 20 61 72 65 20 31 30 30 20 6f 72 20 6d 6f 72 65   are 100 or more
18840 20 63 6f 6c 75 6d 6e 73 2e 20 41 6c 73 6f 20 63   columns. Also c
18850 61 6c 6c 65 64 20 61 73 20 61 20 66 61 6c 6c 62  alled as a fallb
18860 61 63 6b 20 66 72 6f 6d 0a 2a 2a 20 66 74 73 35  ack from.** fts5
18870 49 74 65 72 53 65 74 4f 75 74 70 75 74 73 5f 43  IterSetOutputs_C
18880 6f 6c 31 30 30 20 69 66 20 74 68 65 20 63 6f 6c  ol100 if the col
18890 75 6d 6e 2d 6c 69 73 74 20 73 70 61 6e 73 20 6d  umn-list spans m
188a0 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 70 61 67  ore than one pag
188b0 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  e..*/.static voi
188c0 64 20 66 74 73 35 49 74 65 72 53 65 74 4f 75 74  d fts5IterSetOut
188d0 70 75 74 73 5f 43 6f 6c 28 46 74 73 35 49 74 65  puts_Col(Fts5Ite
188e0 72 20 2a 70 49 74 65 72 2c 20 46 74 73 35 53 65  r *pIter, Fts5Se
188f0 67 49 74 65 72 20 2a 70 53 65 67 29 7b 0a 20 20  gIter *pSeg){.  
18900 66 74 73 35 42 75 66 66 65 72 5a 65 72 6f 28 26  fts5BufferZero(&
18910 70 49 74 65 72 2d 3e 70 6f 73 6c 69 73 74 29 3b  pIter->poslist);
18920 0a 20 20 66 74 73 35 53 65 67 69 74 65 72 50 6f  .  fts5SegiterPo
18930 73 6c 69 73 74 28 70 49 74 65 72 2d 3e 70 49 6e  slist(pIter->pIn
18940 64 65 78 2c 20 70 53 65 67 2c 20 70 49 74 65 72  dex, pSeg, pIter
18950 2d 3e 70 43 6f 6c 73 65 74 2c 20 26 70 49 74 65  ->pColset, &pIte
18960 72 2d 3e 70 6f 73 6c 69 73 74 29 3b 0a 20 20 70  r->poslist);.  p
18970 49 74 65 72 2d 3e 62 61 73 65 2e 69 52 6f 77 69  Iter->base.iRowi
18980 64 20 3d 20 70 53 65 67 2d 3e 69 52 6f 77 69 64  d = pSeg->iRowid
18990 3b 0a 20 20 70 49 74 65 72 2d 3e 62 61 73 65 2e  ;.  pIter->base.
189a0 70 44 61 74 61 20 3d 20 70 49 74 65 72 2d 3e 70  pData = pIter->p
189b0 6f 73 6c 69 73 74 2e 70 3b 0a 20 20 70 49 74 65  oslist.p;.  pIte
189c0 72 2d 3e 62 61 73 65 2e 6e 44 61 74 61 20 3d 20  r->base.nData = 
189d0 70 49 74 65 72 2d 3e 70 6f 73 6c 69 73 74 2e 6e  pIter->poslist.n
189e0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 78 53 65 74 4f  ;.}../*.** xSetO
189f0 75 74 70 75 74 73 20 63 61 6c 6c 62 61 63 6b 20  utputs callback 
18a00 75 73 65 64 20 77 68 65 6e 3a 20 0a 2a 2a 0a 2a  used when: .**.*
18a10 2a 20 20 20 2a 20 64 65 74 61 69 6c 3d 63 6f 6c  *   * detail=col
18a20 2c 0a 2a 2a 20 20 20 2a 20 74 68 65 72 65 20 69  ,.**   * there i
18a30 73 20 61 20 63 6f 6c 75 6d 6e 20 66 69 6c 74 65  s a column filte
18a40 72 2c 20 61 6e 64 0a 2a 2a 20 20 20 2a 20 74 68  r, and.**   * th
18a50 65 20 74 61 62 6c 65 20 63 6f 6e 74 61 69 6e 73  e table contains
18a60 20 31 30 30 20 6f 72 20 66 65 77 65 72 20 63 6f   100 or fewer co
18a70 6c 75 6d 6e 73 2e 20 0a 2a 2a 0a 2a 2a 20 54 68  lumns. .**.** Th
18a80 65 20 6c 61 73 74 20 70 6f 69 6e 74 20 69 73 20  e last point is 
18a90 74 6f 20 65 6e 73 75 72 65 20 61 6c 6c 20 63 6f  to ensure all co
18aa0 6c 75 6d 6e 20 6e 75 6d 62 65 72 73 20 61 72 65  lumn numbers are
18ab0 20 73 74 6f 72 65 64 20 61 73 20 0a 2a 2a 20 73   stored as .** s
18ac0 69 6e 67 6c 65 2d 62 79 74 65 20 76 61 72 69 6e  ingle-byte varin
18ad0 74 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ts..*/.static vo
18ae0 69 64 20 66 74 73 35 49 74 65 72 53 65 74 4f 75  id fts5IterSetOu
18af0 74 70 75 74 73 5f 43 6f 6c 31 30 30 28 46 74 73  tputs_Col100(Fts
18b00 35 49 74 65 72 20 2a 70 49 74 65 72 2c 20 46 74  5Iter *pIter, Ft
18b10 73 35 53 65 67 49 74 65 72 20 2a 70 53 65 67 29  s5SegIter *pSeg)
18b20 7b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 49 74  {..  assert( pIt
18b30 65 72 2d 3e 70 49 6e 64 65 78 2d 3e 70 43 6f 6e  er->pIndex->pCon
18b40 66 69 67 2d 3e 65 44 65 74 61 69 6c 3d 3d 46 54  fig->eDetail==FT
18b50 53 35 5f 44 45 54 41 49 4c 5f 43 4f 4c 55 4d 4e  S5_DETAIL_COLUMN
18b60 53 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  S );.  assert( p
18b70 49 74 65 72 2d 3e 70 43 6f 6c 73 65 74 20 29 3b  Iter->pColset );
18b80 0a 0a 20 20 69 66 28 20 70 53 65 67 2d 3e 69 4c  ..  if( pSeg->iL
18b90 65 61 66 4f 66 66 73 65 74 2b 70 53 65 67 2d 3e  eafOffset+pSeg->
18ba0 6e 50 6f 73 3e 70 53 65 67 2d 3e 70 4c 65 61 66  nPos>pSeg->pLeaf
18bb0 2d 3e 73 7a 4c 65 61 66 20 29 7b 0a 20 20 20 20  ->szLeaf ){.    
18bc0 66 74 73 35 49 74 65 72 53 65 74 4f 75 74 70 75  fts5IterSetOutpu
18bd0 74 73 5f 43 6f 6c 28 70 49 74 65 72 2c 20 70 53  ts_Col(pIter, pS
18be0 65 67 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  eg);.  }else{.  
18bf0 20 20 75 38 20 2a 61 20 3d 20 28 75 38 2a 29 26    u8 *a = (u8*)&
18c00 70 53 65 67 2d 3e 70 4c 65 61 66 2d 3e 70 5b 70  pSeg->pLeaf->p[p
18c10 53 65 67 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74  Seg->iLeafOffset
18c20 5d 3b 0a 20 20 20 20 75 38 20 2a 70 45 6e 64 20  ];.    u8 *pEnd 
18c30 3d 20 28 75 38 2a 29 26 61 5b 70 53 65 67 2d 3e  = (u8*)&a[pSeg->
18c40 6e 50 6f 73 5d 3b 20 0a 20 20 20 20 69 6e 74 20  nPos]; .    int 
18c50 69 50 72 65 76 20 3d 20 30 3b 0a 20 20 20 20 69  iPrev = 0;.    i
18c60 6e 74 20 2a 61 69 43 6f 6c 20 3d 20 70 49 74 65  nt *aiCol = pIte
18c70 72 2d 3e 70 43 6f 6c 73 65 74 2d 3e 61 69 43 6f  r->pColset->aiCo
18c80 6c 3b 0a 20 20 20 20 69 6e 74 20 2a 61 69 43 6f  l;.    int *aiCo
18c90 6c 45 6e 64 20 3d 20 26 61 69 43 6f 6c 5b 70 49  lEnd = &aiCol[pI
18ca0 74 65 72 2d 3e 70 43 6f 6c 73 65 74 2d 3e 6e 43  ter->pColset->nC
18cb0 6f 6c 5d 3b 0a 0a 20 20 20 20 75 38 20 2a 61 4f  ol];..    u8 *aO
18cc0 75 74 20 3d 20 70 49 74 65 72 2d 3e 70 6f 73 6c  ut = pIter->posl
18cd0 69 73 74 2e 70 3b 0a 20 20 20 20 69 6e 74 20 69  ist.p;.    int i
18ce0 50 72 65 76 4f 75 74 20 3d 20 30 3b 0a 0a 20 20  PrevOut = 0;..  
18cf0 20 20 70 49 74 65 72 2d 3e 62 61 73 65 2e 69 52    pIter->base.iR
18d00 6f 77 69 64 20 3d 20 70 53 65 67 2d 3e 69 52 6f  owid = pSeg->iRo
18d10 77 69 64 3b 0a 0a 20 20 20 20 77 68 69 6c 65 28  wid;..    while(
18d20 20 61 3c 70 45 6e 64 20 29 7b 0a 20 20 20 20 20   a<pEnd ){.     
18d30 20 69 50 72 65 76 20 2b 3d 20 28 69 6e 74 29 61   iPrev += (int)a
18d40 2b 2b 5b 30 5d 20 2d 20 32 3b 0a 20 20 20 20 20  ++[0] - 2;.     
18d50 20 77 68 69 6c 65 28 20 2a 61 69 43 6f 6c 3c 69   while( *aiCol<i
18d60 50 72 65 76 20 29 7b 0a 20 20 20 20 20 20 20 20  Prev ){.        
18d70 61 69 43 6f 6c 2b 2b 3b 0a 20 20 20 20 20 20 20  aiCol++;.       
18d80 20 69 66 28 20 61 69 43 6f 6c 3d 3d 61 69 43 6f   if( aiCol==aiCo
18d90 6c 45 6e 64 20 29 20 67 6f 74 6f 20 73 65 74 6f  lEnd ) goto seto
18da0 75 74 70 75 74 73 5f 63 6f 6c 5f 6f 75 74 3b 0a  utputs_col_out;.
18db0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
18dc0 28 20 2a 61 69 43 6f 6c 3d 3d 69 50 72 65 76 20  ( *aiCol==iPrev 
18dd0 29 7b 0a 20 20 20 20 20 20 20 20 2a 61 4f 75 74  ){.        *aOut
18de0 2b 2b 20 3d 20 28 75 38 29 28 28 69 50 72 65 76  ++ = (u8)((iPrev
18df0 20 2d 20 69 50 72 65 76 4f 75 74 29 20 2b 20 32   - iPrevOut) + 2
18e00 29 3b 0a 20 20 20 20 20 20 20 20 69 50 72 65 76  );.        iPrev
18e10 4f 75 74 20 3d 20 69 50 72 65 76 3b 0a 20 20 20  Out = iPrev;.   
18e20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 73 65 74 6f     }.    }..seto
18e30 75 74 70 75 74 73 5f 63 6f 6c 5f 6f 75 74 3a 0a  utputs_col_out:.
18e40 20 20 20 20 70 49 74 65 72 2d 3e 62 61 73 65 2e      pIter->base.
18e50 70 44 61 74 61 20 3d 20 70 49 74 65 72 2d 3e 70  pData = pIter->p
18e60 6f 73 6c 69 73 74 2e 70 3b 0a 20 20 20 20 70 49  oslist.p;.    pI
18e70 74 65 72 2d 3e 62 61 73 65 2e 6e 44 61 74 61 20  ter->base.nData 
18e80 3d 20 61 4f 75 74 20 2d 20 70 49 74 65 72 2d 3e  = aOut - pIter->
18e90 70 6f 73 6c 69 73 74 2e 70 3b 0a 20 20 7d 0a 7d  poslist.p;.  }.}
18ea0 0a 0a 2f 2a 0a 2a 2a 20 78 53 65 74 4f 75 74 70  ../*.** xSetOutp
18eb0 75 74 73 20 63 61 6c 6c 62 61 63 6b 20 75 73 65  uts callback use
18ec0 64 20 62 79 20 64 65 74 61 69 6c 3d 66 75 6c 6c  d by detail=full
18ed0 20 77 68 65 6e 20 74 68 65 72 65 20 69 73 20 61   when there is a
18ee0 20 63 6f 6c 75 6d 6e 20 66 69 6c 74 65 72 2e 0a   column filter..
18ef0 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
18f00 74 73 35 49 74 65 72 53 65 74 4f 75 74 70 75 74  ts5IterSetOutput
18f10 73 5f 46 75 6c 6c 28 46 74 73 35 49 74 65 72 20  s_Full(Fts5Iter 
18f20 2a 70 49 74 65 72 2c 20 46 74 73 35 53 65 67 49  *pIter, Fts5SegI
18f30 74 65 72 20 2a 70 53 65 67 29 7b 0a 20 20 46 74  ter *pSeg){.  Ft
18f40 73 35 43 6f 6c 73 65 74 20 2a 70 43 6f 6c 73 65  s5Colset *pColse
18f50 74 20 3d 20 70 49 74 65 72 2d 3e 70 43 6f 6c 73  t = pIter->pCols
18f60 65 74 3b 0a 20 20 70 49 74 65 72 2d 3e 62 61 73  et;.  pIter->bas
18f70 65 2e 69 52 6f 77 69 64 20 3d 20 70 53 65 67 2d  e.iRowid = pSeg-
18f80 3e 69 52 6f 77 69 64 3b 0a 0a 20 20 61 73 73 65  >iRowid;..  asse
18f90 72 74 28 20 70 49 74 65 72 2d 3e 70 49 6e 64 65  rt( pIter->pInde
18fa0 78 2d 3e 70 43 6f 6e 66 69 67 2d 3e 65 44 65 74  x->pConfig->eDet
18fb0 61 69 6c 3d 3d 46 54 53 35 5f 44 45 54 41 49 4c  ail==FTS5_DETAIL
18fc0 5f 46 55 4c 4c 20 29 3b 0a 20 20 61 73 73 65 72  _FULL );.  asser
18fd0 74 28 20 70 43 6f 6c 73 65 74 20 29 3b 0a 0a 20  t( pColset );.. 
18fe0 20 69 66 28 20 70 53 65 67 2d 3e 69 4c 65 61 66   if( pSeg->iLeaf
18ff0 4f 66 66 73 65 74 2b 70 53 65 67 2d 3e 6e 50 6f  Offset+pSeg->nPo
19000 73 3c 3d 70 53 65 67 2d 3e 70 4c 65 61 66 2d 3e  s<=pSeg->pLeaf->
19010 73 7a 4c 65 61 66 20 29 7b 0a 20 20 20 20 2f 2a  szLeaf ){.    /*
19020 20 41 6c 6c 20 64 61 74 61 20 69 73 20 73 74 6f   All data is sto
19030 72 65 64 20 6f 6e 20 74 68 65 20 63 75 72 72 65  red on the curre
19040 6e 74 20 70 61 67 65 2e 20 50 6f 70 75 6c 61 74  nt page. Populat
19050 65 20 74 68 65 20 6f 75 74 70 75 74 20 0a 20 20  e the output .  
19060 20 20 2a 2a 20 76 61 72 69 61 62 6c 65 73 20 74    ** variables t
19070 6f 20 70 6f 69 6e 74 20 69 6e 74 6f 20 74 68 65  o point into the
19080 20 62 6f 64 79 20 6f 66 20 74 68 65 20 70 61 67   body of the pag
19090 65 20 6f 62 6a 65 63 74 2e 20 2a 2f 0a 20 20 20  e object. */.   
190a0 20 63 6f 6e 73 74 20 75 38 20 2a 61 20 3d 20 26   const u8 *a = &
190b0 70 53 65 67 2d 3e 70 4c 65 61 66 2d 3e 70 5b 70  pSeg->pLeaf->p[p
190c0 53 65 67 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74  Seg->iLeafOffset
190d0 5d 3b 0a 20 20 20 20 69 66 28 20 70 43 6f 6c 73  ];.    if( pCols
190e0 65 74 2d 3e 6e 43 6f 6c 3d 3d 31 20 29 7b 0a 20  et->nCol==1 ){. 
190f0 20 20 20 20 20 70 49 74 65 72 2d 3e 62 61 73 65       pIter->base
19100 2e 6e 44 61 74 61 20 3d 20 66 74 73 35 49 6e 64  .nData = fts5Ind
19110 65 78 45 78 74 72 61 63 74 43 6f 6c 28 26 61 2c  exExtractCol(&a,
19120 20 70 53 65 67 2d 3e 6e 50 6f 73 2c 70 43 6f 6c   pSeg->nPos,pCol
19130 73 65 74 2d 3e 61 69 43 6f 6c 5b 30 5d 29 3b 0a  set->aiCol[0]);.
19140 20 20 20 20 20 20 70 49 74 65 72 2d 3e 62 61 73        pIter->bas
19150 65 2e 70 44 61 74 61 20 3d 20 61 3b 0a 20 20 20  e.pData = a;.   
19160 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e   }else{.      in
19170 74 20 2a 70 52 63 20 3d 20 26 70 49 74 65 72 2d  t *pRc = &pIter-
19180 3e 70 49 6e 64 65 78 2d 3e 72 63 3b 0a 20 20 20  >pIndex->rc;.   
19190 20 20 20 66 74 73 35 42 75 66 66 65 72 5a 65 72     fts5BufferZer
191a0 6f 28 26 70 49 74 65 72 2d 3e 70 6f 73 6c 69 73  o(&pIter->poslis
191b0 74 29 3b 0a 20 20 20 20 20 20 66 74 73 35 49 6e  t);.      fts5In
191c0 64 65 78 45 78 74 72 61 63 74 43 6f 6c 73 65 74  dexExtractColset
191d0 28 70 52 63 2c 20 70 43 6f 6c 73 65 74 2c 20 61  (pRc, pColset, a
191e0 2c 20 70 53 65 67 2d 3e 6e 50 6f 73 2c 20 26 70  , pSeg->nPos, &p
191f0 49 74 65 72 2d 3e 70 6f 73 6c 69 73 74 29 3b 0a  Iter->poslist);.
19200 20 20 20 20 20 20 70 49 74 65 72 2d 3e 62 61 73        pIter->bas
19210 65 2e 70 44 61 74 61 20 3d 20 70 49 74 65 72 2d  e.pData = pIter-
19220 3e 70 6f 73 6c 69 73 74 2e 70 3b 0a 20 20 20 20  >poslist.p;.    
19230 20 20 70 49 74 65 72 2d 3e 62 61 73 65 2e 6e 44    pIter->base.nD
19240 61 74 61 20 3d 20 70 49 74 65 72 2d 3e 70 6f 73  ata = pIter->pos
19250 6c 69 73 74 2e 6e 3b 0a 20 20 20 20 7d 0a 20 20  list.n;.    }.  
19260 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68  }else{.    /* Th
19270 65 20 64 61 74 61 20 69 73 20 64 69 73 74 72 69  e data is distri
19280 62 75 74 65 64 20 6f 76 65 72 20 74 77 6f 20 6f  buted over two o
19290 72 20 6d 6f 72 65 20 70 61 67 65 73 2e 20 43 6f  r more pages. Co
192a0 70 79 20 69 74 20 69 6e 74 6f 20 74 68 65 0a 20  py it into the. 
192b0 20 20 20 2a 2a 20 46 74 73 35 49 74 65 72 2e 70     ** Fts5Iter.p
192c0 6f 73 6c 69 73 74 20 62 75 66 66 65 72 20 61 6e  oslist buffer an
192d0 64 20 74 68 65 6e 20 73 65 74 20 74 68 65 20 6f  d then set the o
192e0 75 74 70 75 74 20 70 6f 69 6e 74 65 72 20 74 6f  utput pointer to
192f0 20 70 6f 69 6e 74 0a 20 20 20 20 2a 2a 20 74 6f   point.    ** to
19300 20 74 68 69 73 20 62 75 66 66 65 72 2e 20 20 2a   this buffer.  *
19310 2f 0a 20 20 20 20 66 74 73 35 42 75 66 66 65 72  /.    fts5Buffer
19320 5a 65 72 6f 28 26 70 49 74 65 72 2d 3e 70 6f 73  Zero(&pIter->pos
19330 6c 69 73 74 29 3b 0a 20 20 20 20 66 74 73 35 53  list);.    fts5S
19340 65 67 69 74 65 72 50 6f 73 6c 69 73 74 28 70 49  egiterPoslist(pI
19350 74 65 72 2d 3e 70 49 6e 64 65 78 2c 20 70 53 65  ter->pIndex, pSe
19360 67 2c 20 70 43 6f 6c 73 65 74 2c 20 26 70 49 74  g, pColset, &pIt
19370 65 72 2d 3e 70 6f 73 6c 69 73 74 29 3b 0a 20 20  er->poslist);.  
19380 20 20 70 49 74 65 72 2d 3e 62 61 73 65 2e 70 44    pIter->base.pD
19390 61 74 61 20 3d 20 70 49 74 65 72 2d 3e 70 6f 73  ata = pIter->pos
193a0 6c 69 73 74 2e 70 3b 0a 20 20 20 20 70 49 74 65  list.p;.    pIte
193b0 72 2d 3e 62 61 73 65 2e 6e 44 61 74 61 20 3d 20  r->base.nData = 
193c0 70 49 74 65 72 2d 3e 70 6f 73 6c 69 73 74 2e 6e  pIter->poslist.n
193d0 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63 20  ;.  }.}..static 
193e0 76 6f 69 64 20 66 74 73 35 49 74 65 72 53 65 74  void fts5IterSet
193f0 4f 75 74 70 75 74 43 62 28 69 6e 74 20 2a 70 52  OutputCb(int *pR
19400 63 2c 20 46 74 73 35 49 74 65 72 20 2a 70 49 74  c, Fts5Iter *pIt
19410 65 72 29 7b 0a 20 20 69 66 28 20 2a 70 52 63 3d  er){.  if( *pRc=
19420 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
19430 20 20 46 74 73 35 43 6f 6e 66 69 67 20 2a 70 43    Fts5Config *pC
19440 6f 6e 66 69 67 20 3d 20 70 49 74 65 72 2d 3e 70  onfig = pIter->p
19450 49 6e 64 65 78 2d 3e 70 43 6f 6e 66 69 67 3b 0a  Index->pConfig;.
19460 20 20 20 20 69 66 28 20 70 43 6f 6e 66 69 67 2d      if( pConfig-
19470 3e 65 44 65 74 61 69 6c 3d 3d 46 54 53 35 5f 44  >eDetail==FTS5_D
19480 45 54 41 49 4c 5f 4e 4f 4e 45 20 29 7b 0a 20 20  ETAIL_NONE ){.  
19490 20 20 20 20 70 49 74 65 72 2d 3e 78 53 65 74 4f      pIter->xSetO
194a0 75 74 70 75 74 73 20 3d 20 66 74 73 35 49 74 65  utputs = fts5Ite
194b0 72 53 65 74 4f 75 74 70 75 74 73 5f 4e 6f 6e 65  rSetOutputs_None
194c0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 65 6c 73  ;.    }..    els
194d0 65 20 69 66 28 20 70 49 74 65 72 2d 3e 70 43 6f  e if( pIter->pCo
194e0 6c 73 65 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20  lset==0 ){.     
194f0 20 70 49 74 65 72 2d 3e 78 53 65 74 4f 75 74 70   pIter->xSetOutp
19500 75 74 73 20 3d 20 66 74 73 35 49 74 65 72 53 65  uts = fts5IterSe
19510 74 4f 75 74 70 75 74 73 5f 4e 6f 63 6f 6c 73 65  tOutputs_Nocolse
19520 74 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 65 6c  t;.    }..    el
19530 73 65 20 69 66 28 20 70 49 74 65 72 2d 3e 70 43  se if( pIter->pC
19540 6f 6c 73 65 74 2d 3e 6e 43 6f 6c 3d 3d 30 20 29  olset->nCol==0 )
19550 7b 0a 20 20 20 20 20 20 70 49 74 65 72 2d 3e 78  {.      pIter->x
19560 53 65 74 4f 75 74 70 75 74 73 20 3d 20 66 74 73  SetOutputs = fts
19570 35 49 74 65 72 53 65 74 4f 75 74 70 75 74 73 5f  5IterSetOutputs_
19580 5a 65 72 6f 43 6f 6c 73 65 74 3b 0a 20 20 20 20  ZeroColset;.    
19590 7d 0a 0a 20 20 20 20 65 6c 73 65 20 69 66 28 20  }..    else if( 
195a0 70 43 6f 6e 66 69 67 2d 3e 65 44 65 74 61 69 6c  pConfig->eDetail
195b0 3d 3d 46 54 53 35 5f 44 45 54 41 49 4c 5f 46 55  ==FTS5_DETAIL_FU
195c0 4c 4c 20 29 7b 0a 20 20 20 20 20 20 70 49 74 65  LL ){.      pIte
195d0 72 2d 3e 78 53 65 74 4f 75 74 70 75 74 73 20 3d  r->xSetOutputs =
195e0 20 66 74 73 35 49 74 65 72 53 65 74 4f 75 74 70   fts5IterSetOutp
195f0 75 74 73 5f 46 75 6c 6c 3b 0a 20 20 20 20 7d 0a  uts_Full;.    }.
19600 0a 20 20 20 20 65 6c 73 65 7b 0a 20 20 20 20 20  .    else{.     
19610 20 61 73 73 65 72 74 28 20 70 43 6f 6e 66 69 67   assert( pConfig
19620 2d 3e 65 44 65 74 61 69 6c 3d 3d 46 54 53 35 5f  ->eDetail==FTS5_
19630 44 45 54 41 49 4c 5f 43 4f 4c 55 4d 4e 53 20 29  DETAIL_COLUMNS )
19640 3b 0a 20 20 20 20 20 20 69 66 28 20 70 43 6f 6e  ;.      if( pCon
19650 66 69 67 2d 3e 6e 43 6f 6c 3c 3d 31 30 30 20 29  fig->nCol<=100 )
19660 7b 0a 20 20 20 20 20 20 20 20 70 49 74 65 72 2d  {.        pIter-
19670 3e 78 53 65 74 4f 75 74 70 75 74 73 20 3d 20 66  >xSetOutputs = f
19680 74 73 35 49 74 65 72 53 65 74 4f 75 74 70 75 74  ts5IterSetOutput
19690 73 5f 43 6f 6c 31 30 30 3b 0a 20 20 20 20 20 20  s_Col100;.      
196a0 20 20 73 71 6c 69 74 65 33 46 74 73 35 42 75 66    sqlite3Fts5Buf
196b0 66 65 72 53 69 7a 65 28 70 52 63 2c 20 26 70 49  ferSize(pRc, &pI
196c0 74 65 72 2d 3e 70 6f 73 6c 69 73 74 2c 20 70 43  ter->poslist, pC
196d0 6f 6e 66 69 67 2d 3e 6e 43 6f 6c 29 3b 0a 20 20  onfig->nCol);.  
196e0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
196f0 20 20 20 70 49 74 65 72 2d 3e 78 53 65 74 4f 75     pIter->xSetOu
19700 74 70 75 74 73 20 3d 20 66 74 73 35 49 74 65 72  tputs = fts5Iter
19710 53 65 74 4f 75 74 70 75 74 73 5f 43 6f 6c 3b 0a  SetOutputs_Col;.
19720 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
19730 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f  }.}.../*.** Allo
19740 63 61 74 65 20 61 20 6e 65 77 20 46 74 73 35 49  cate a new Fts5I
19750 74 65 72 20 6f 62 6a 65 63 74 2e 0a 2a 2a 0a 2a  ter object..**.*
19760 2a 20 54 68 65 20 6e 65 77 20 6f 62 6a 65 63 74  * The new object
19770 20 77 69 6c 6c 20 62 65 20 75 73 65 64 20 74 6f   will be used to
19780 20 69 74 65 72 61 74 65 20 74 68 72 6f 75 67 68   iterate through
19790 20 64 61 74 61 20 69 6e 20 73 74 72 75 63 74 75   data in structu
197a0 72 65 20 70 53 74 72 75 63 74 2e 0a 2a 2a 20 49  re pStruct..** I
197b0 66 20 69 4c 65 76 65 6c 20 69 73 20 2d 76 65 2c  f iLevel is -ve,
197c0 20 74 68 65 6e 20 61 6c 6c 20 64 61 74 61 20 69   then all data i
197d0 6e 20 61 6c 6c 20 73 65 67 6d 65 6e 74 73 20 69  n all segments i
197e0 73 20 6d 65 72 67 65 64 2e 20 4f 72 2c 20 69 66  s merged. Or, if
197f0 20 69 4c 65 76 65 6c 0a 2a 2a 20 69 73 20 7a 65   iLevel.** is ze
19800 72 6f 20 6f 72 20 67 72 65 61 74 65 72 2c 20 64  ro or greater, d
19810 61 74 61 20 66 72 6f 6d 20 74 68 65 20 66 69 72  ata from the fir
19820 73 74 20 6e 53 65 67 6d 65 6e 74 20 73 65 67 6d  st nSegment segm
19830 65 6e 74 73 20 6f 6e 20 6c 65 76 65 6c 20 69 4c  ents on level iL
19840 65 76 65 6c 0a 2a 2a 20 69 73 20 6d 65 72 67 65  evel.** is merge
19850 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 74 65  d..**.** The ite
19860 72 61 74 6f 72 20 69 6e 69 74 69 61 6c 6c 79 20  rator initially 
19870 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 66 69  points to the fi
19880 72 73 74 20 74 65 72 6d 2f 72 6f 77 69 64 20 65  rst term/rowid e
19890 6e 74 72 79 20 69 6e 20 74 68 65 20 0a 2a 2a 20  ntry in the .** 
198a0 69 74 65 72 61 74 65 64 20 64 61 74 61 2e 0a 2a  iterated data..*
198b0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  /.static void ft
198c0 73 35 4d 75 6c 74 69 49 74 65 72 4e 65 77 28 0a  s5MultiIterNew(.
198d0 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20    Fts5Index *p, 
198e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
198f0 20 20 2f 2a 20 46 54 53 35 20 62 61 63 6b 65 6e    /* FTS5 backen
19900 64 20 74 6f 20 69 74 65 72 61 74 65 20 77 69 74  d to iterate wit
19910 68 69 6e 20 2a 2f 0a 20 20 46 74 73 35 53 74 72  hin */.  Fts5Str
19920 75 63 74 75 72 65 20 2a 70 53 74 72 75 63 74 2c  ucture *pStruct,
19930 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74 72 75           /* Stru
19940 63 74 75 72 65 20 6f 66 20 73 70 65 63 69 66 69  cture of specifi
19950 63 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74  c index */.  int
19960 20 66 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20   flags,         
19970 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
19980 46 54 53 35 49 4e 44 45 58 5f 51 55 45 52 59 5f  FTS5INDEX_QUERY_
19990 58 58 58 20 66 6c 61 67 73 20 2a 2f 0a 20 20 46  XXX flags */.  F
199a0 74 73 35 43 6f 6c 73 65 74 20 2a 70 43 6f 6c 73  ts5Colset *pCols
199b0 65 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  et,            /
199c0 2a 20 43 6f 6c 73 65 74 20 74 6f 20 66 69 6c 74  * Colset to filt
199d0 65 72 20 6f 6e 20 28 6f 72 20 4e 55 4c 4c 29 20  er on (or NULL) 
199e0 2a 2f 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 70  */.  const u8 *p
199f0 54 65 72 6d 2c 20 69 6e 74 20 6e 54 65 72 6d 2c  Term, int nTerm,
19a00 20 20 20 20 20 2f 2a 20 54 65 72 6d 20 74 6f 20       /* Term to 
19a10 73 65 65 6b 20 74 6f 20 28 6f 72 20 4e 55 4c 4c  seek to (or NULL
19a20 2f 30 29 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 65  /0) */.  int iLe
19a30 76 65 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20  vel,            
19a40 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 76 65           /* Leve
19a50 6c 20 74 6f 20 69 74 65 72 61 74 65 20 28 2d 31  l to iterate (-1
19a60 20 66 6f 72 20 61 6c 6c 29 20 2a 2f 0a 20 20 69   for all) */.  i
19a70 6e 74 20 6e 53 65 67 6d 65 6e 74 2c 20 20 20 20  nt nSegment,    
19a80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
19a90 2a 20 4e 75 6d 62 65 72 20 6f 66 20 73 65 67 6d  * Number of segm
19aa0 65 6e 74 73 20 74 6f 20 6d 65 72 67 65 20 28 69  ents to merge (i
19ab0 4c 65 76 65 6c 3e 3d 30 29 20 2a 2f 0a 20 20 46  Level>=0) */.  F
19ac0 74 73 35 49 74 65 72 20 2a 2a 70 70 4f 75 74 20  ts5Iter **ppOut 
19ad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
19ae0 2a 20 4e 65 77 20 6f 62 6a 65 63 74 20 2a 2f 0a  * New object */.
19af0 29 7b 0a 20 20 69 6e 74 20 6e 53 65 67 20 3d 20  ){.  int nSeg = 
19b00 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
19b10 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
19b20 66 20 73 65 67 6d 65 6e 74 2d 69 74 65 72 73 20  f segment-iters 
19b30 69 6e 20 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20  in use */.  int 
19b40 69 49 74 65 72 20 3d 20 30 3b 20 20 20 20 20 20  iIter = 0;      
19b50 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 2a              /* *
19b60 2f 0a 20 20 69 6e 74 20 69 53 65 67 3b 20 20 20  /.  int iSeg;   
19b70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19b80 20 20 20 20 2f 2a 20 55 73 65 64 20 74 6f 20 69      /* Used to i
19b90 74 65 72 61 74 65 20 74 68 72 6f 75 67 68 20 73  terate through s
19ba0 65 67 6d 65 6e 74 73 20 2a 2f 0a 20 20 46 74 73  egments */.  Fts
19bb0 35 53 74 72 75 63 74 75 72 65 4c 65 76 65 6c 20  5StructureLevel 
19bc0 2a 70 4c 76 6c 3b 0a 20 20 46 74 73 35 49 74 65  *pLvl;.  Fts5Ite
19bd0 72 20 2a 70 4e 65 77 3b 0a 0a 20 20 61 73 73 65  r *pNew;..  asse
19be0 72 74 28 20 28 70 54 65 72 6d 3d 3d 30 20 26 26  rt( (pTerm==0 &&
19bf0 20 6e 54 65 72 6d 3d 3d 30 29 20 7c 7c 20 69 4c   nTerm==0) || iL
19c00 65 76 65 6c 3c 30 20 29 3b 0a 0a 20 20 2f 2a 20  evel<0 );..  /* 
19c10 41 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20 66  Allocate space f
19c20 6f 72 20 74 68 65 20 6e 65 77 20 6d 75 6c 74 69  or the new multi
19c30 2d 73 65 67 2d 69 74 65 72 61 74 6f 72 2e 20 2a  -seg-iterator. *
19c40 2f 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53  /.  if( p->rc==S
19c50 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
19c60 69 66 28 20 69 4c 65 76 65 6c 3c 30 20 29 7b 0a  if( iLevel<0 ){.
19c70 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 53        assert( pS
19c80 74 72 75 63 74 2d 3e 6e 53 65 67 6d 65 6e 74 3d  truct->nSegment=
19c90 3d 66 74 73 35 53 74 72 75 63 74 75 72 65 43 6f  =fts5StructureCo
19ca0 75 6e 74 53 65 67 6d 65 6e 74 73 28 70 53 74 72  untSegments(pStr
19cb0 75 63 74 29 20 29 3b 0a 20 20 20 20 20 20 6e 53  uct) );.      nS
19cc0 65 67 20 3d 20 70 53 74 72 75 63 74 2d 3e 6e 53  eg = pStruct->nS
19cd0 65 67 6d 65 6e 74 3b 0a 20 20 20 20 20 20 6e 53  egment;.      nS
19ce0 65 67 20 2b 3d 20 28 70 2d 3e 70 48 61 73 68 20  eg += (p->pHash 
19cf0 3f 20 31 20 3a 20 30 29 3b 0a 20 20 20 20 7d 65  ? 1 : 0);.    }e
19d00 6c 73 65 7b 0a 20 20 20 20 20 20 6e 53 65 67 20  lse{.      nSeg 
19d10 3d 20 4d 49 4e 28 70 53 74 72 75 63 74 2d 3e 61  = MIN(pStruct->a
19d20 4c 65 76 65 6c 5b 69 4c 65 76 65 6c 5d 2e 6e 53  Level[iLevel].nS
19d30 65 67 2c 20 6e 53 65 67 6d 65 6e 74 29 3b 0a 20  eg, nSegment);. 
19d40 20 20 20 7d 0a 20 20 7d 0a 20 20 2a 70 70 4f 75     }.  }.  *ppOu
19d50 74 20 3d 20 70 4e 65 77 20 3d 20 66 74 73 35 4d  t = pNew = fts5M
19d60 75 6c 74 69 49 74 65 72 41 6c 6c 6f 63 28 70 2c  ultiIterAlloc(p,
19d70 20 6e 53 65 67 29 3b 0a 20 20 69 66 28 20 70 4e   nSeg);.  if( pN
19d80 65 77 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  ew==0 ) return;.
19d90 20 20 70 4e 65 77 2d 3e 62 52 65 76 20 3d 20 28    pNew->bRev = (
19da0 30 21 3d 28 66 6c 61 67 73 20 26 20 46 54 53 35  0!=(flags & FTS5
19db0 49 4e 44 45 58 5f 51 55 45 52 59 5f 44 45 53 43  INDEX_QUERY_DESC
19dc0 29 29 3b 0a 20 20 70 4e 65 77 2d 3e 62 53 6b 69  ));.  pNew->bSki
19dd0 70 45 6d 70 74 79 20 3d 20 28 30 21 3d 28 66 6c  pEmpty = (0!=(fl
19de0 61 67 73 20 26 20 46 54 53 35 49 4e 44 45 58 5f  ags & FTS5INDEX_
19df0 51 55 45 52 59 5f 53 4b 49 50 45 4d 50 54 59 29  QUERY_SKIPEMPTY)
19e00 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 53 74 72 75  );.  pNew->pStru
19e10 63 74 20 3d 20 70 53 74 72 75 63 74 3b 0a 20 20  ct = pStruct;.  
19e20 70 4e 65 77 2d 3e 70 43 6f 6c 73 65 74 20 3d 20  pNew->pColset = 
19e30 70 43 6f 6c 73 65 74 3b 0a 20 20 66 74 73 35 53  pColset;.  fts5S
19e40 74 72 75 63 74 75 72 65 52 65 66 28 70 53 74 72  tructureRef(pStr
19e50 75 63 74 29 3b 0a 20 20 69 66 28 20 28 66 6c 61  uct);.  if( (fla
19e60 67 73 20 26 20 46 54 53 35 49 4e 44 45 58 5f 51  gs & FTS5INDEX_Q
19e70 55 45 52 59 5f 4e 4f 4f 55 54 50 55 54 29 3d 3d  UERY_NOOUTPUT)==
19e80 30 20 29 7b 0a 20 20 20 20 66 74 73 35 49 74 65  0 ){.    fts5Ite
19e90 72 53 65 74 4f 75 74 70 75 74 43 62 28 26 70 2d  rSetOutputCb(&p-
19ea0 3e 72 63 2c 20 70 4e 65 77 29 3b 0a 20 20 7d 0a  >rc, pNew);.  }.
19eb0 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65  .  /* Initialize
19ec0 20 65 61 63 68 20 6f 66 20 74 68 65 20 63 6f 6d   each of the com
19ed0 70 6f 6e 65 6e 74 20 73 65 67 6d 65 6e 74 20 69  ponent segment i
19ee0 74 65 72 61 74 6f 72 73 2e 20 2a 2f 0a 20 20 69  terators. */.  i
19ef0 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  f( p->rc==SQLITE
19f00 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 69  _OK ){.    if( i
19f10 4c 65 76 65 6c 3c 30 20 29 7b 0a 20 20 20 20 20  Level<0 ){.     
19f20 20 46 74 73 35 53 74 72 75 63 74 75 72 65 4c 65   Fts5StructureLe
19f30 76 65 6c 20 2a 70 45 6e 64 20 3d 20 26 70 53 74  vel *pEnd = &pSt
19f40 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 70 53 74  ruct->aLevel[pSt
19f50 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 5d 3b 0a 20  ruct->nLevel];. 
19f60 20 20 20 20 20 69 66 28 20 70 2d 3e 70 48 61 73       if( p->pHas
19f70 68 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  h ){.        /* 
19f80 41 64 64 20 61 20 73 65 67 6d 65 6e 74 20 69 74  Add a segment it
19f90 65 72 61 74 6f 72 20 66 6f 72 20 74 68 65 20 63  erator for the c
19fa0 75 72 72 65 6e 74 20 63 6f 6e 74 65 6e 74 73 20  urrent contents 
19fb0 6f 66 20 74 68 65 20 68 61 73 68 20 74 61 62 6c  of the hash tabl
19fc0 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 46 74  e. */.        Ft
19fd0 73 35 53 65 67 49 74 65 72 20 2a 70 49 74 65 72  s5SegIter *pIter
19fe0 20 3d 20 26 70 4e 65 77 2d 3e 61 53 65 67 5b 69   = &pNew->aSeg[i
19ff0 49 74 65 72 2b 2b 5d 3b 0a 20 20 20 20 20 20 20  Iter++];.       
1a000 20 66 74 73 35 53 65 67 49 74 65 72 48 61 73 68   fts5SegIterHash
1a010 49 6e 69 74 28 70 2c 20 70 54 65 72 6d 2c 20 6e  Init(p, pTerm, n
1a020 54 65 72 6d 2c 20 66 6c 61 67 73 2c 20 70 49 74  Term, flags, pIt
1a030 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  er);.      }.   
1a040 20 20 20 66 6f 72 28 70 4c 76 6c 3d 26 70 53 74     for(pLvl=&pSt
1a050 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 30 5d 3b  ruct->aLevel[0];
1a060 20 70 4c 76 6c 3c 70 45 6e 64 3b 20 70 4c 76 6c   pLvl<pEnd; pLvl
1a070 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 66 6f 72  ++){.        for
1a080 28 69 53 65 67 3d 70 4c 76 6c 2d 3e 6e 53 65 67  (iSeg=pLvl->nSeg
1a090 2d 31 3b 20 69 53 65 67 3e 3d 30 3b 20 69 53 65  -1; iSeg>=0; iSe
1a0a0 67 2d 2d 29 7b 0a 20 20 20 20 20 20 20 20 20 20  g--){.          
1a0b0 46 74 73 35 53 74 72 75 63 74 75 72 65 53 65 67  Fts5StructureSeg
1a0c0 6d 65 6e 74 20 2a 70 53 65 67 20 3d 20 26 70 4c  ment *pSeg = &pL
1a0d0 76 6c 2d 3e 61 53 65 67 5b 69 53 65 67 5d 3b 0a  vl->aSeg[iSeg];.
1a0e0 20 20 20 20 20 20 20 20 20 20 46 74 73 35 53 65            Fts5Se
1a0f0 67 49 74 65 72 20 2a 70 49 74 65 72 20 3d 20 26  gIter *pIter = &
1a100 70 4e 65 77 2d 3e 61 53 65 67 5b 69 49 74 65 72  pNew->aSeg[iIter
1a110 2b 2b 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 69  ++];.          i
1a120 66 28 20 70 54 65 72 6d 3d 3d 30 20 29 7b 0a 20  f( pTerm==0 ){. 
1a130 20 20 20 20 20 20 20 20 20 20 20 66 74 73 35 53             fts5S
1a140 65 67 49 74 65 72 49 6e 69 74 28 70 2c 20 70 53  egIterInit(p, pS
1a150 65 67 2c 20 70 49 74 65 72 29 3b 0a 20 20 20 20  eg, pIter);.    
1a160 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1a170 20 20 20 20 20 20 20 20 20 66 74 73 35 53 65 67           fts5Seg
1a180 49 74 65 72 53 65 65 6b 49 6e 69 74 28 70 2c 20  IterSeekInit(p, 
1a190 70 54 65 72 6d 2c 20 6e 54 65 72 6d 2c 20 66 6c  pTerm, nTerm, fl
1a1a0 61 67 73 2c 20 70 53 65 67 2c 20 70 49 74 65 72  ags, pSeg, pIter
1a1b0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
1a1c0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
1a1d0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1a1e0 20 20 70 4c 76 6c 20 3d 20 26 70 53 74 72 75 63    pLvl = &pStruc
1a1f0 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c 65 76 65 6c  t->aLevel[iLevel
1a200 5d 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 53 65  ];.      for(iSe
1a210 67 3d 6e 53 65 67 2d 31 3b 20 69 53 65 67 3e 3d  g=nSeg-1; iSeg>=
1a220 30 3b 20 69 53 65 67 2d 2d 29 7b 0a 20 20 20 20  0; iSeg--){.    
1a230 20 20 20 20 66 74 73 35 53 65 67 49 74 65 72 49      fts5SegIterI
1a240 6e 69 74 28 70 2c 20 26 70 4c 76 6c 2d 3e 61 53  nit(p, &pLvl->aS
1a250 65 67 5b 69 53 65 67 5d 2c 20 26 70 4e 65 77 2d  eg[iSeg], &pNew-
1a260 3e 61 53 65 67 5b 69 49 74 65 72 2b 2b 5d 29 3b  >aSeg[iIter++]);
1a270 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
1a280 20 20 20 61 73 73 65 72 74 28 20 69 49 74 65 72     assert( iIter
1a290 3d 3d 6e 53 65 67 20 29 3b 0a 20 20 7d 0a 0a 20  ==nSeg );.  }.. 
1a2a0 20 2f 2a 20 49 66 20 74 68 65 20 61 62 6f 76 65   /* If the above
1a2b0 20 77 61 73 20 73 75 63 63 65 73 73 66 75 6c 2c   was successful,
1a2c0 20 65 61 63 68 20 63 6f 6d 70 6f 6e 65 6e 74 20   each component 
1a2d0 69 74 65 72 61 74 6f 72 73 20 6e 6f 77 20 70 6f  iterators now po
1a2e0 69 6e 74 73 20 0a 20 20 2a 2a 20 74 6f 20 74 68  ints .  ** to th
1a2f0 65 20 66 69 72 73 74 20 65 6e 74 72 79 20 69 6e  e first entry in
1a300 20 69 74 73 20 73 65 67 6d 65 6e 74 2e 20 49 6e   its segment. In
1a310 20 74 68 69 73 20 63 61 73 65 20 69 6e 69 74 69   this case initi
1a320 61 6c 69 7a 65 20 74 68 65 20 0a 20 20 2a 2a 20  alize the .  ** 
1a330 61 46 69 72 73 74 5b 5d 20 61 72 72 61 79 2e 20  aFirst[] array. 
1a340 4f 72 2c 20 69 66 20 61 6e 20 65 72 72 6f 72 20  Or, if an error 
1a350 68 61 73 20 6f 63 63 75 72 72 65 64 2c 20 66 72  has occurred, fr
1a360 65 65 20 74 68 65 20 69 74 65 72 61 74 6f 72 0a  ee the iterator.
1a370 20 20 2a 2a 20 6f 62 6a 65 63 74 20 61 6e 64 20    ** object and 
1a380 73 65 74 20 74 68 65 20 6f 75 74 70 75 74 20 76  set the output v
1a390 61 72 69 61 62 6c 65 20 74 6f 20 4e 55 4c 4c 2e  ariable to NULL.
1a3a0 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 72 63    */.  if( p->rc
1a3b0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
1a3c0 20 20 20 66 6f 72 28 69 49 74 65 72 3d 70 4e 65     for(iIter=pNe
1a3d0 77 2d 3e 6e 53 65 67 2d 31 3b 20 69 49 74 65 72  w->nSeg-1; iIter
1a3e0 3e 30 3b 20 69 49 74 65 72 2d 2d 29 7b 0a 20 20  >0; iIter--){.  
1a3f0 20 20 20 20 69 6e 74 20 69 45 71 3b 0a 20 20 20      int iEq;.   
1a400 20 20 20 69 66 28 20 28 69 45 71 20 3d 20 66 74     if( (iEq = ft
1a410 73 35 4d 75 6c 74 69 49 74 65 72 44 6f 43 6f 6d  s5MultiIterDoCom
1a420 70 61 72 65 28 70 4e 65 77 2c 20 69 49 74 65 72  pare(pNew, iIter
1a430 29 29 20 29 7b 0a 20 20 20 20 20 20 20 20 46 74  )) ){.        Ft
1a440 73 35 53 65 67 49 74 65 72 20 2a 70 53 65 67 20  s5SegIter *pSeg 
1a450 3d 20 26 70 4e 65 77 2d 3e 61 53 65 67 5b 69 45  = &pNew->aSeg[iE
1a460 71 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  q];.        if( 
1a470 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
1a480 20 29 20 70 53 65 67 2d 3e 78 4e 65 78 74 28 70   ) pSeg->xNext(p
1a490 2c 20 70 53 65 67 2c 20 30 29 3b 0a 20 20 20 20  , pSeg, 0);.    
1a4a0 20 20 20 20 66 74 73 35 4d 75 6c 74 69 49 74 65      fts5MultiIte
1a4b0 72 41 64 76 61 6e 63 65 64 28 70 2c 20 70 4e 65  rAdvanced(p, pNe
1a4c0 77 2c 20 69 45 71 2c 20 69 49 74 65 72 29 3b 0a  w, iEq, iIter);.
1a4d0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
1a4e0 20 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 53    fts5MultiIterS
1a4f0 65 74 45 6f 66 28 70 4e 65 77 29 3b 0a 20 20 20  etEof(pNew);.   
1a500 20 66 74 73 35 41 73 73 65 72 74 4d 75 6c 74 69   fts5AssertMulti
1a510 49 74 65 72 53 65 74 75 70 28 70 2c 20 70 4e 65  IterSetup(p, pNe
1a520 77 29 3b 0a 0a 20 20 20 20 69 66 28 20 70 4e 65  w);..    if( pNe
1a530 77 2d 3e 62 53 6b 69 70 45 6d 70 74 79 20 26 26  w->bSkipEmpty &&
1a540 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 49 73   fts5MultiIterIs
1a550 45 6d 70 74 79 28 70 2c 20 70 4e 65 77 29 20 29  Empty(p, pNew) )
1a560 7b 0a 20 20 20 20 20 20 66 74 73 35 4d 75 6c 74  {.      fts5Mult
1a570 69 49 74 65 72 4e 65 78 74 28 70 2c 20 70 4e 65  iIterNext(p, pNe
1a580 77 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d 65  w, 0, 0);.    }e
1a590 6c 73 65 20 69 66 28 20 70 4e 65 77 2d 3e 62 61  lse if( pNew->ba
1a5a0 73 65 2e 62 45 6f 66 3d 3d 30 20 29 7b 0a 20 20  se.bEof==0 ){.  
1a5b0 20 20 20 20 46 74 73 35 53 65 67 49 74 65 72 20      Fts5SegIter 
1a5c0 2a 70 53 65 67 20 3d 20 26 70 4e 65 77 2d 3e 61  *pSeg = &pNew->a
1a5d0 53 65 67 5b 70 4e 65 77 2d 3e 61 46 69 72 73 74  Seg[pNew->aFirst
1a5e0 5b 31 5d 2e 69 46 69 72 73 74 5d 3b 0a 20 20 20  [1].iFirst];.   
1a5f0 20 20 20 70 4e 65 77 2d 3e 78 53 65 74 4f 75 74     pNew->xSetOut
1a600 70 75 74 73 28 70 4e 65 77 2c 20 70 53 65 67 29  puts(pNew, pSeg)
1a610 3b 0a 20 20 20 20 7d 0a 0a 20 20 7d 65 6c 73 65  ;.    }..  }else
1a620 7b 0a 20 20 20 20 66 74 73 35 4d 75 6c 74 69 49  {.    fts5MultiI
1a630 74 65 72 46 72 65 65 28 70 4e 65 77 29 3b 0a 20  terFree(pNew);. 
1a640 20 20 20 2a 70 70 4f 75 74 20 3d 20 30 3b 0a 20     *ppOut = 0;. 
1a650 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61   }.}../*.** Crea
1a660 74 65 20 61 6e 20 46 74 73 35 49 74 65 72 20 74  te an Fts5Iter t
1a670 68 61 74 20 69 74 65 72 61 74 65 73 20 74 68 72  hat iterates thr
1a680 6f 75 67 68 20 74 68 65 20 64 6f 63 6c 69 73 74  ough the doclist
1a690 20 70 72 6f 76 69 64 65 64 0a 2a 2a 20 61 73 20   provided.** as 
1a6a0 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  the second argum
1a6b0 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ent..*/.static v
1a6c0 6f 69 64 20 66 74 73 35 4d 75 6c 74 69 49 74 65  oid fts5MultiIte
1a6d0 72 4e 65 77 32 28 0a 20 20 46 74 73 35 49 6e 64  rNew2(.  Fts5Ind
1a6e0 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  ex *p,          
1a6f0 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53 35           /* FTS5
1a700 20 62 61 63 6b 65 6e 64 20 74 6f 20 69 74 65 72   backend to iter
1a710 61 74 65 20 77 69 74 68 69 6e 20 2a 2f 0a 20 20  ate within */.  
1a720 46 74 73 35 44 61 74 61 20 2a 70 44 61 74 61 2c  Fts5Data *pData,
1a730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a740 2f 2a 20 44 6f 63 6c 69 73 74 20 74 6f 20 69 74  /* Doclist to it
1a750 65 72 61 74 65 20 74 68 72 6f 75 67 68 20 2a 2f  erate through */
1a760 0a 20 20 69 6e 74 20 62 44 65 73 63 2c 20 20 20  .  int bDesc,   
1a770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a780 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 64     /* True for d
1a790 65 73 63 65 6e 64 69 6e 67 20 72 6f 77 69 64 20  escending rowid 
1a7a0 6f 72 64 65 72 20 2a 2f 0a 20 20 46 74 73 35 49  order */.  Fts5I
1a7b0 74 65 72 20 2a 2a 70 70 4f 75 74 20 20 20 20 20  ter **ppOut     
1a7c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65             /* Ne
1a7d0 77 20 6f 62 6a 65 63 74 20 2a 2f 0a 29 7b 0a 20  w object */.){. 
1a7e0 20 46 74 73 35 49 74 65 72 20 2a 70 4e 65 77 3b   Fts5Iter *pNew;
1a7f0 0a 20 20 70 4e 65 77 20 3d 20 66 74 73 35 4d 75  .  pNew = fts5Mu
1a800 6c 74 69 49 74 65 72 41 6c 6c 6f 63 28 70 2c 20  ltiIterAlloc(p, 
1a810 32 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 20 29  2);.  if( pNew )
1a820 7b 0a 20 20 20 20 46 74 73 35 53 65 67 49 74 65  {.    Fts5SegIte
1a830 72 20 2a 70 49 74 65 72 20 3d 20 26 70 4e 65 77  r *pIter = &pNew
1a840 2d 3e 61 53 65 67 5b 31 5d 3b 0a 0a 20 20 20 20  ->aSeg[1];..    
1a850 70 49 74 65 72 2d 3e 66 6c 61 67 73 20 3d 20 46  pIter->flags = F
1a860 54 53 35 5f 53 45 47 49 54 45 52 5f 4f 4e 45 54  TS5_SEGITER_ONET
1a870 45 52 4d 3b 0a 20 20 20 20 69 66 28 20 70 44 61  ERM;.    if( pDa
1a880 74 61 2d 3e 73 7a 4c 65 61 66 3e 30 20 29 7b 0a  ta->szLeaf>0 ){.
1a890 20 20 20 20 20 20 70 49 74 65 72 2d 3e 70 4c 65        pIter->pLe
1a8a0 61 66 20 3d 20 70 44 61 74 61 3b 0a 20 20 20 20  af = pData;.    
1a8b0 20 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66    pIter->iLeafOf
1a8c0 66 73 65 74 20 3d 20 66 74 73 35 47 65 74 56 61  fset = fts5GetVa
1a8d0 72 69 6e 74 28 70 44 61 74 61 2d 3e 70 2c 20 28  rint(pData->p, (
1a8e0 75 36 34 2a 29 26 70 49 74 65 72 2d 3e 69 52 6f  u64*)&pIter->iRo
1a8f0 77 69 64 29 3b 0a 20 20 20 20 20 20 70 49 74 65  wid);.      pIte
1a900 72 2d 3e 69 45 6e 64 6f 66 44 6f 63 6c 69 73 74  r->iEndofDoclist
1a910 20 3d 20 70 44 61 74 61 2d 3e 6e 6e 3b 0a 20 20   = pData->nn;.  
1a920 20 20 20 20 70 4e 65 77 2d 3e 61 46 69 72 73 74      pNew->aFirst
1a930 5b 31 5d 2e 69 46 69 72 73 74 20 3d 20 31 3b 0a  [1].iFirst = 1;.
1a940 20 20 20 20 20 20 69 66 28 20 62 44 65 73 63 20        if( bDesc 
1a950 29 7b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d  ){.        pNew-
1a960 3e 62 52 65 76 20 3d 20 31 3b 0a 20 20 20 20 20  >bRev = 1;.     
1a970 20 20 20 70 49 74 65 72 2d 3e 66 6c 61 67 73 20     pIter->flags 
1a980 7c 3d 20 46 54 53 35 5f 53 45 47 49 54 45 52 5f  |= FTS5_SEGITER_
1a990 52 45 56 45 52 53 45 3b 0a 20 20 20 20 20 20 20  REVERSE;.       
1a9a0 20 66 74 73 35 53 65 67 49 74 65 72 52 65 76 65   fts5SegIterReve
1a9b0 72 73 65 49 6e 69 74 50 61 67 65 28 70 2c 20 70  rseInitPage(p, p
1a9c0 49 74 65 72 29 3b 0a 20 20 20 20 20 20 7d 65 6c  Iter);.      }el
1a9d0 73 65 7b 0a 20 20 20 20 20 20 20 20 66 74 73 35  se{.        fts5
1a9e0 53 65 67 49 74 65 72 4c 6f 61 64 4e 50 6f 73 28  SegIterLoadNPos(
1a9f0 70 2c 20 70 49 74 65 72 29 3b 0a 20 20 20 20 20  p, pIter);.     
1aa00 20 7d 0a 20 20 20 20 20 20 70 44 61 74 61 20 3d   }.      pData =
1aa10 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   0;.    }else{. 
1aa20 20 20 20 20 20 70 4e 65 77 2d 3e 62 61 73 65 2e       pNew->base.
1aa30 62 45 6f 66 20 3d 20 31 3b 0a 20 20 20 20 7d 0a  bEof = 1;.    }.
1aa40 20 20 20 20 66 74 73 35 53 65 67 49 74 65 72 53      fts5SegIterS
1aa50 65 74 4e 65 78 74 28 70 2c 20 70 49 74 65 72 29  etNext(p, pIter)
1aa60 3b 0a 0a 20 20 20 20 2a 70 70 4f 75 74 20 3d 20  ;..    *ppOut = 
1aa70 70 4e 65 77 3b 0a 20 20 7d 0a 0a 20 20 66 74 73  pNew;.  }..  fts
1aa80 35 44 61 74 61 52 65 6c 65 61 73 65 28 70 44 61  5DataRelease(pDa
1aa90 74 61 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  ta);.}../*.** Re
1aaa0 74 75 72 6e 20 74 72 75 65 20 69 66 20 74 68 65  turn true if the
1aab0 20 69 74 65 72 61 74 6f 72 20 69 73 20 61 74 20   iterator is at 
1aac0 45 4f 46 20 6f 72 20 69 66 20 61 6e 20 65 72 72  EOF or if an err
1aad0 6f 72 20 68 61 73 20 6f 63 63 75 72 72 65 64 2e  or has occurred.
1aae0 20 0a 2a 2a 20 46 61 6c 73 65 20 6f 74 68 65 72   .** False other
1aaf0 77 69 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  wise..*/.static 
1ab00 69 6e 74 20 66 74 73 35 4d 75 6c 74 69 49 74 65  int fts5MultiIte
1ab10 72 45 6f 66 28 46 74 73 35 49 6e 64 65 78 20 2a  rEof(Fts5Index *
1ab20 70 2c 20 46 74 73 35 49 74 65 72 20 2a 70 49 74  p, Fts5Iter *pIt
1ab30 65 72 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70  er){.  assert( p
1ab40 2d 3e 72 63 20 0a 20 20 20 20 20 20 7c 7c 20 28  ->rc .      || (
1ab50 70 49 74 65 72 2d 3e 61 53 65 67 5b 20 70 49 74  pIter->aSeg[ pIt
1ab60 65 72 2d 3e 61 46 69 72 73 74 5b 31 5d 2e 69 46  er->aFirst[1].iF
1ab70 69 72 73 74 20 5d 2e 70 4c 65 61 66 3d 3d 30 29  irst ].pLeaf==0)
1ab80 3d 3d 70 49 74 65 72 2d 3e 62 61 73 65 2e 62 45  ==pIter->base.bE
1ab90 6f 66 20 0a 20 20 29 3b 0a 20 20 72 65 74 75 72  of .  );.  retur
1aba0 6e 20 28 70 2d 3e 72 63 20 7c 7c 20 70 49 74 65  n (p->rc || pIte
1abb0 72 2d 3e 62 61 73 65 2e 62 45 6f 66 29 3b 0a 7d  r->base.bEof);.}
1abc0 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
1abd0 68 65 20 72 6f 77 69 64 20 6f 66 20 74 68 65 20  he rowid of the 
1abe0 65 6e 74 72 79 20 74 68 61 74 20 74 68 65 20 69  entry that the i
1abf0 74 65 72 61 74 6f 72 20 63 75 72 72 65 6e 74 6c  terator currentl
1ac00 79 20 70 6f 69 6e 74 73 0a 2a 2a 20 74 6f 2e 20  y points.** to. 
1ac10 49 66 20 74 68 65 20 69 74 65 72 61 74 6f 72 20  If the iterator 
1ac20 70 6f 69 6e 74 73 20 74 6f 20 45 4f 46 20 77 68  points to EOF wh
1ac30 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
1ac40 20 69 73 20 63 61 6c 6c 65 64 20 74 68 65 0a 2a   is called the.*
1ac50 2a 20 72 65 73 75 6c 74 73 20 61 72 65 20 75 6e  * results are un
1ac60 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74  defined..*/.stat
1ac70 69 63 20 69 36 34 20 66 74 73 35 4d 75 6c 74 69  ic i64 fts5Multi
1ac80 49 74 65 72 52 6f 77 69 64 28 46 74 73 35 49 74  IterRowid(Fts5It
1ac90 65 72 20 2a 70 49 74 65 72 29 7b 0a 20 20 61 73  er *pIter){.  as
1aca0 73 65 72 74 28 20 70 49 74 65 72 2d 3e 61 53 65  sert( pIter->aSe
1acb0 67 5b 20 70 49 74 65 72 2d 3e 61 46 69 72 73 74  g[ pIter->aFirst
1acc0 5b 31 5d 2e 69 46 69 72 73 74 20 5d 2e 70 4c 65  [1].iFirst ].pLe
1acd0 61 66 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 70  af );.  return p
1ace0 49 74 65 72 2d 3e 61 53 65 67 5b 20 70 49 74 65  Iter->aSeg[ pIte
1acf0 72 2d 3e 61 46 69 72 73 74 5b 31 5d 2e 69 46 69  r->aFirst[1].iFi
1ad00 72 73 74 20 5d 2e 69 52 6f 77 69 64 3b 0a 7d 0a  rst ].iRowid;.}.
1ad10 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20  ./*.** Move the 
1ad20 69 74 65 72 61 74 6f 72 20 74 6f 20 74 68 65 20  iterator to the 
1ad30 6e 65 78 74 20 65 6e 74 72 79 20 61 74 20 6f 72  next entry at or
1ad40 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 4d 61 74 63   following iMatc
1ad50 68 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  h..*/.static voi
1ad60 64 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 4e  d fts5MultiIterN
1ad70 65 78 74 46 72 6f 6d 28 0a 20 20 46 74 73 35 49  extFrom(.  Fts5I
1ad80 6e 64 65 78 20 2a 70 2c 20 0a 20 20 46 74 73 35  ndex *p, .  Fts5
1ad90 49 74 65 72 20 2a 70 49 74 65 72 2c 20 0a 20 20  Iter *pIter, .  
1ada0 69 36 34 20 69 4d 61 74 63 68 0a 29 7b 0a 20 20  i64 iMatch.){.  
1adb0 77 68 69 6c 65 28 20 31 20 29 7b 0a 20 20 20 20  while( 1 ){.    
1adc0 69 36 34 20 69 52 6f 77 69 64 3b 0a 20 20 20 20  i64 iRowid;.    
1add0 66 74 73 35 4d 75 6c 74 69 49 74 65 72 4e 65 78  fts5MultiIterNex
1ade0 74 28 70 2c 20 70 49 74 65 72 2c 20 31 2c 20 69  t(p, pIter, 1, i
1adf0 4d 61 74 63 68 29 3b 0a 20 20 20 20 69 66 28 20  Match);.    if( 
1ae00 66 74 73 35 4d 75 6c 74 69 49 74 65 72 45 6f 66  fts5MultiIterEof
1ae10 28 70 2c 20 70 49 74 65 72 29 20 29 20 62 72 65  (p, pIter) ) bre
1ae20 61 6b 3b 0a 20 20 20 20 69 52 6f 77 69 64 20 3d  ak;.    iRowid =
1ae30 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 52 6f   fts5MultiIterRo
1ae40 77 69 64 28 70 49 74 65 72 29 3b 0a 20 20 20 20  wid(pIter);.    
1ae50 69 66 28 20 70 49 74 65 72 2d 3e 62 52 65 76 3d  if( pIter->bRev=
1ae60 3d 30 20 26 26 20 69 52 6f 77 69 64 3e 3d 69 4d  =0 && iRowid>=iM
1ae70 61 74 63 68 20 29 20 62 72 65 61 6b 3b 0a 20 20  atch ) break;.  
1ae80 20 20 69 66 28 20 70 49 74 65 72 2d 3e 62 52 65    if( pIter->bRe
1ae90 76 21 3d 30 20 26 26 20 69 52 6f 77 69 64 3c 3d  v!=0 && iRowid<=
1aea0 69 4d 61 74 63 68 20 29 20 62 72 65 61 6b 3b 0a  iMatch ) break;.
1aeb0 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74    }.}../*.** Ret
1aec0 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
1aed0 20 61 20 62 75 66 66 65 72 20 63 6f 6e 74 61 69   a buffer contai
1aee0 6e 69 6e 67 20 74 68 65 20 74 65 72 6d 20 61 73  ning the term as
1aef0 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68  sociated with th
1af00 65 20 0a 2a 2a 20 65 6e 74 72 79 20 74 68 61 74  e .** entry that
1af10 20 74 68 65 20 69 74 65 72 61 74 6f 72 20 63 75   the iterator cu
1af20 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 73 20 74  rrently points t
1af30 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e  o..*/.static con
1af40 73 74 20 75 38 20 2a 66 74 73 35 4d 75 6c 74 69  st u8 *fts5Multi
1af50 49 74 65 72 54 65 72 6d 28 46 74 73 35 49 74 65  IterTerm(Fts5Ite
1af60 72 20 2a 70 49 74 65 72 2c 20 69 6e 74 20 2a 70  r *pIter, int *p
1af70 6e 29 7b 0a 20 20 46 74 73 35 53 65 67 49 74 65  n){.  Fts5SegIte
1af80 72 20 2a 70 20 3d 20 26 70 49 74 65 72 2d 3e 61  r *p = &pIter->a
1af90 53 65 67 5b 20 70 49 74 65 72 2d 3e 61 46 69 72  Seg[ pIter->aFir
1afa0 73 74 5b 31 5d 2e 69 46 69 72 73 74 20 5d 3b 0a  st[1].iFirst ];.
1afb0 20 20 2a 70 6e 20 3d 20 70 2d 3e 74 65 72 6d 2e    *pn = p->term.
1afc0 6e 3b 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e 74  n;.  return p->t
1afd0 65 72 6d 2e 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  erm.p;.}../*.** 
1afe0 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 73  Allocate a new s
1aff0 65 67 6d 65 6e 74 2d 69 64 20 66 6f 72 20 74 68  egment-id for th
1b000 65 20 73 74 72 75 63 74 75 72 65 20 70 53 74 72  e structure pStr
1b010 75 63 74 2e 20 54 68 65 20 6e 65 77 20 73 65 67  uct. The new seg
1b020 6d 65 6e 74 0a 2a 2a 20 69 64 20 6d 75 73 74 20  ment.** id must 
1b030 62 65 20 62 65 74 77 65 65 6e 20 31 20 61 6e 64  be between 1 and
1b040 20 36 35 33 33 35 20 69 6e 63 6c 75 73 69 76 65   65335 inclusive
1b050 2c 20 61 6e 64 20 6d 75 73 74 20 6e 6f 74 20 62  , and must not b
1b060 65 20 75 73 65 64 20 62 79 20 0a 2a 2a 20 61 6e  e used by .** an
1b070 79 20 63 75 72 72 65 6e 74 6c 79 20 65 78 69 73  y currently exis
1b080 74 69 6e 67 20 73 65 67 6d 65 6e 74 2e 20 49 66  ting segment. If
1b090 20 61 20 66 72 65 65 20 73 65 67 6d 65 6e 74 20   a free segment 
1b0a0 69 64 20 63 61 6e 6e 6f 74 20 62 65 20 66 6f 75  id cannot be fou
1b0b0 6e 64 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 46 55  nd,.** SQLITE_FU
1b0c0 4c 4c 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  LL is returned..
1b0d0 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f  **.** If an erro
1b0e0 72 20 68 61 73 20 61 6c 72 65 61 64 79 20 6f 63  r has already oc
1b0f0 63 75 72 72 65 64 2c 20 74 68 69 73 20 66 75 6e  curred, this fun
1b100 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70  ction is a no-op
1b110 2e 20 30 20 69 73 20 0a 2a 2a 20 72 65 74 75 72  . 0 is .** retur
1b120 6e 65 64 20 69 6e 20 74 68 69 73 20 63 61 73 65  ned in this case
1b130 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1b140 66 74 73 35 41 6c 6c 6f 63 61 74 65 53 65 67 69  fts5AllocateSegi
1b150 64 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20  d(Fts5Index *p, 
1b160 46 74 73 35 53 74 72 75 63 74 75 72 65 20 2a 70  Fts5Structure *p
1b170 53 74 72 75 63 74 29 7b 0a 20 20 69 6e 74 20 69  Struct){.  int i
1b180 53 65 67 69 64 20 3d 20 30 3b 0a 0a 20 20 69 66  Segid = 0;..  if
1b190 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
1b1a0 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 70 53  OK ){.    if( pS
1b1b0 74 72 75 63 74 2d 3e 6e 53 65 67 6d 65 6e 74 3e  truct->nSegment>
1b1c0 3d 46 54 53 35 5f 4d 41 58 5f 53 45 47 4d 45 4e  =FTS5_MAX_SEGMEN
1b1d0 54 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 72 63  T ){.      p->rc
1b1e0 20 3d 20 53 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a   = SQLITE_FULL;.
1b1f0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1b200 20 2f 2a 20 46 54 53 35 5f 4d 41 58 5f 53 45 47   /* FTS5_MAX_SEG
1b210 4d 45 4e 54 20 69 73 20 63 75 72 72 65 6e 74 6c  MENT is currentl
1b220 79 20 64 65 66 69 6e 65 64 20 61 73 20 32 30 30  y defined as 200
1b230 30 2e 20 53 6f 20 74 68 65 20 66 6f 6c 6c 6f 77  0. So the follow
1b240 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 61 72 72  ing.      ** arr
1b250 61 79 20 69 73 20 36 33 20 65 6c 65 6d 65 6e 74  ay is 63 element
1b260 73 2c 20 6f 72 20 32 35 32 20 62 79 74 65 73 2c  s, or 252 bytes,
1b270 20 69 6e 20 73 69 7a 65 2e 20 20 2a 2f 0a 20 20   in size.  */.  
1b280 20 20 20 20 75 33 32 20 61 55 73 65 64 5b 28 46      u32 aUsed[(F
1b290 54 53 35 5f 4d 41 58 5f 53 45 47 4d 45 4e 54 2b  TS5_MAX_SEGMENT+
1b2a0 33 31 29 20 2f 20 33 32 5d 3b 0a 20 20 20 20 20  31) / 32];.     
1b2b0 20 69 6e 74 20 69 4c 76 6c 2c 20 69 53 65 67 3b   int iLvl, iSeg;
1b2c0 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  .      int i;.  
1b2d0 20 20 20 20 75 33 32 20 6d 61 73 6b 3b 0a 20 20      u32 mask;.  
1b2e0 20 20 20 20 6d 65 6d 73 65 74 28 61 55 73 65 64      memset(aUsed
1b2f0 2c 20 30 2c 20 73 69 7a 65 6f 66 28 61 55 73 65  , 0, sizeof(aUse
1b300 64 29 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  d));.      for(i
1b310 4c 76 6c 3d 30 3b 20 69 4c 76 6c 3c 70 53 74 72  Lvl=0; iLvl<pStr
1b320 75 63 74 2d 3e 6e 4c 65 76 65 6c 3b 20 69 4c 76  uct->nLevel; iLv
1b330 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 66 6f  l++){.        fo
1b340 72 28 69 53 65 67 3d 30 3b 20 69 53 65 67 3c 70  r(iSeg=0; iSeg<p
1b350 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69  Struct->aLevel[i
1b360 4c 76 6c 5d 2e 6e 53 65 67 3b 20 69 53 65 67 2b  Lvl].nSeg; iSeg+
1b370 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e  +){.          in
1b380 74 20 69 49 64 20 3d 20 70 53 74 72 75 63 74 2d  t iId = pStruct-
1b390 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d 2e 61 53  >aLevel[iLvl].aS
1b3a0 65 67 5b 69 53 65 67 5d 2e 69 53 65 67 69 64 3b  eg[iSeg].iSegid;
1b3b0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69  .          if( i
1b3c0 49 64 3c 3d 46 54 53 35 5f 4d 41 58 5f 53 45 47  Id<=FTS5_MAX_SEG
1b3d0 4d 45 4e 54 20 29 7b 0a 20 20 20 20 20 20 20 20  MENT ){.        
1b3e0 20 20 20 20 61 55 73 65 64 5b 28 69 49 64 2d 31      aUsed[(iId-1
1b3f0 29 20 2f 20 33 32 5d 20 7c 3d 20 31 20 3c 3c 20  ) / 32] |= 1 << 
1b400 28 28 69 49 64 2d 31 29 20 25 20 33 32 29 3b 0a  ((iId-1) % 32);.
1b410 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
1b420 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20      }.      }.. 
1b430 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 61 55       for(i=0; aU
1b440 73 65 64 5b 69 5d 3d 3d 30 78 46 46 46 46 46 46  sed[i]==0xFFFFFF
1b450 46 46 3b 20 69 2b 2b 29 3b 0a 20 20 20 20 20 20  FF; i++);.      
1b460 6d 61 73 6b 20 3d 20 61 55 73 65 64 5b 69 5d 3b  mask = aUsed[i];
1b470 0a 20 20 20 20 20 20 66 6f 72 28 69 53 65 67 69  .      for(iSegi
1b480 64 3d 30 3b 20 6d 61 73 6b 20 26 20 28 31 20 3c  d=0; mask & (1 <
1b490 3c 20 69 53 65 67 69 64 29 3b 20 69 53 65 67 69  < iSegid); iSegi
1b4a0 64 2b 2b 29 3b 0a 20 20 20 20 20 20 69 53 65 67  d++);.      iSeg
1b4b0 69 64 20 2b 3d 20 31 20 2b 20 69 2a 33 32 3b 0a  id += 1 + i*32;.
1b4c0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
1b4d0 45 42 55 47 0a 20 20 20 20 20 20 66 6f 72 28 69  EBUG.      for(i
1b4e0 4c 76 6c 3d 30 3b 20 69 4c 76 6c 3c 70 53 74 72  Lvl=0; iLvl<pStr
1b4f0 75 63 74 2d 3e 6e 4c 65 76 65 6c 3b 20 69 4c 76  uct->nLevel; iLv
1b500 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 66 6f  l++){.        fo
1b510 72 28 69 53 65 67 3d 30 3b 20 69 53 65 67 3c 70  r(iSeg=0; iSeg<p
1b520 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69  Struct->aLevel[i
1b530 4c 76 6c 5d 2e 6e 53 65 67 3b 20 69 53 65 67 2b  Lvl].nSeg; iSeg+
1b540 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73  +){.          as
1b550 73 65 72 74 28 20 69 53 65 67 69 64 21 3d 70 53  sert( iSegid!=pS
1b560 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c  truct->aLevel[iL
1b570 76 6c 5d 2e 61 53 65 67 5b 69 53 65 67 5d 2e 69  vl].aSeg[iSeg].i
1b580 53 65 67 69 64 20 29 3b 0a 20 20 20 20 20 20 20  Segid );.       
1b590 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
1b5a0 20 61 73 73 65 72 74 28 20 69 53 65 67 69 64 3e   assert( iSegid>
1b5b0 30 20 26 26 20 69 53 65 67 69 64 3c 3d 46 54 53  0 && iSegid<=FTS
1b5c0 35 5f 4d 41 58 5f 53 45 47 4d 45 4e 54 20 29 3b  5_MAX_SEGMENT );
1b5d0 0a 0a 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20  ..      {.      
1b5e0 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
1b5f0 70 49 64 78 53 65 6c 65 63 74 20 3d 20 66 74 73  pIdxSelect = fts
1b600 35 49 64 78 53 65 6c 65 63 74 53 74 6d 74 28 70  5IdxSelectStmt(p
1b610 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
1b620 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
1b630 29 7b 0a 20 20 20 20 20 20 20 20 20 20 75 38 20  ){.          u8 
1b640 61 42 6c 6f 62 5b 32 5d 20 3d 20 7b 30 78 66 66  aBlob[2] = {0xff
1b650 2c 20 30 78 66 66 7d 3b 0a 20 20 20 20 20 20 20  , 0xff};.       
1b660 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f     sqlite3_bind_
1b670 69 6e 74 28 70 49 64 78 53 65 6c 65 63 74 2c 20  int(pIdxSelect, 
1b680 31 2c 20 69 53 65 67 69 64 29 3b 0a 20 20 20 20  1, iSegid);.    
1b690 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69        sqlite3_bi
1b6a0 6e 64 5f 62 6c 6f 62 28 70 49 64 78 53 65 6c 65  nd_blob(pIdxSele
1b6b0 63 74 2c 20 32 2c 20 61 42 6c 6f 62 2c 20 32 2c  ct, 2, aBlob, 2,
1b6c0 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b   SQLITE_STATIC);
1b6d0 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
1b6e0 74 28 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28  t( sqlite3_step(
1b6f0 70 49 64 78 53 65 6c 65 63 74 29 21 3d 53 51 4c  pIdxSelect)!=SQL
1b700 49 54 45 5f 52 4f 57 20 29 3b 0a 20 20 20 20 20  ITE_ROW );.     
1b710 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 73 71 6c       p->rc = sql
1b720 69 74 65 33 5f 72 65 73 65 74 28 70 49 64 78 53  ite3_reset(pIdxS
1b730 65 6c 65 63 74 29 3b 0a 20 20 20 20 20 20 20 20  elect);.        
1b740 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 6e    sqlite3_bind_n
1b750 75 6c 6c 28 70 49 64 78 53 65 6c 65 63 74 2c 20  ull(pIdxSelect, 
1b760 32 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  2);.        }.  
1b770 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
1b780 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e   }.  }..  return
1b790 20 69 53 65 67 69 64 3b 0a 7d 0a 0a 2f 2a 0a 2a   iSegid;.}../*.*
1b7a0 2a 20 44 69 73 63 61 72 64 20 61 6c 6c 20 64 61  * Discard all da
1b7b0 74 61 20 63 75 72 72 65 6e 74 6c 79 20 63 61 63  ta currently cac
1b7c0 68 65 64 20 69 6e 20 74 68 65 20 68 61 73 68 2d  hed in the hash-
1b7d0 74 61 62 6c 65 73 2e 0a 2a 2f 0a 73 74 61 74 69  tables..*/.stati
1b7e0 63 20 76 6f 69 64 20 66 74 73 35 49 6e 64 65 78  c void fts5Index
1b7f0 44 69 73 63 61 72 64 44 61 74 61 28 46 74 73 35  DiscardData(Fts5
1b800 49 6e 64 65 78 20 2a 70 29 7b 0a 20 20 61 73 73  Index *p){.  ass
1b810 65 72 74 28 20 70 2d 3e 70 48 61 73 68 20 7c 7c  ert( p->pHash ||
1b820 20 70 2d 3e 6e 50 65 6e 64 69 6e 67 44 61 74 61   p->nPendingData
1b830 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e  ==0 );.  if( p->
1b840 70 48 61 73 68 20 29 7b 0a 20 20 20 20 73 71 6c  pHash ){.    sql
1b850 69 74 65 33 46 74 73 35 48 61 73 68 43 6c 65 61  ite3Fts5HashClea
1b860 72 28 70 2d 3e 70 48 61 73 68 29 3b 0a 20 20 20  r(p->pHash);.   
1b870 20 70 2d 3e 6e 50 65 6e 64 69 6e 67 44 61 74 61   p->nPendingData
1b880 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a   = 0;.  }.}../*.
1b890 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 73 69  ** Return the si
1b8a0 7a 65 20 6f 66 20 74 68 65 20 70 72 65 66 69 78  ze of the prefix
1b8b0 2c 20 69 6e 20 62 79 74 65 73 2c 20 74 68 61 74  , in bytes, that
1b8c0 20 62 75 66 66 65 72 20 0a 2a 2a 20 28 70 4e 65   buffer .** (pNe
1b8d0 77 2f 3c 6c 65 6e 67 74 68 2d 75 6e 6b 6e 6f 77  w/<length-unknow
1b8e0 6e 3e 29 20 73 68 61 72 65 73 20 77 69 74 68 20  n>) shares with 
1b8f0 62 75 66 66 65 72 20 28 70 4f 6c 64 2f 6e 4f 6c  buffer (pOld/nOl
1b900 64 29 2e 0a 2a 2a 0a 2a 2a 20 42 75 66 66 65 72  d)..**.** Buffer
1b910 20 28 70 4e 65 77 2f 3c 6c 65 6e 67 74 68 2d 75   (pNew/<length-u
1b920 6e 6b 6e 6f 77 6e 3e 29 20 69 73 20 67 75 61 72  nknown>) is guar
1b930 61 6e 74 65 65 64 20 74 6f 20 62 65 20 67 72 65  anteed to be gre
1b940 61 74 65 72 20 0a 2a 2a 20 74 68 61 6e 20 62 75  ater .** than bu
1b950 66 66 65 72 20 28 70 4f 6c 64 2f 6e 4f 6c 64 29  ffer (pOld/nOld)
1b960 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1b970 66 74 73 35 50 72 65 66 69 78 43 6f 6d 70 72 65  fts5PrefixCompre
1b980 73 73 28 69 6e 74 20 6e 4f 6c 64 2c 20 63 6f 6e  ss(int nOld, con
1b990 73 74 20 75 38 20 2a 70 4f 6c 64 2c 20 63 6f 6e  st u8 *pOld, con
1b9a0 73 74 20 75 38 20 2a 70 4e 65 77 29 7b 0a 20 20  st u8 *pNew){.  
1b9b0 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30  int i;.  for(i=0
1b9c0 3b 20 69 3c 6e 4f 6c 64 3b 20 69 2b 2b 29 7b 0a  ; i<nOld; i++){.
1b9d0 20 20 20 20 69 66 28 20 70 4f 6c 64 5b 69 5d 21      if( pOld[i]!
1b9e0 3d 70 4e 65 77 5b 69 5d 20 29 20 62 72 65 61 6b  =pNew[i] ) break
1b9f0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 69  ;.  }.  return i
1ba00 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64  ;.}..static void
1ba10 20 66 74 73 35 57 72 69 74 65 44 6c 69 64 78 43   fts5WriteDlidxC
1ba20 6c 65 61 72 28 0a 20 20 46 74 73 35 49 6e 64 65  lear(.  Fts5Inde
1ba30 78 20 2a 70 2c 20 0a 20 20 46 74 73 35 53 65 67  x *p, .  Fts5Seg
1ba40 57 72 69 74 65 72 20 2a 70 57 72 69 74 65 72 2c  Writer *pWriter,
1ba50 0a 20 20 69 6e 74 20 62 46 6c 75 73 68 20 20 20  .  int bFlush   
1ba60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ba70 20 20 20 2f 2a 20 49 66 20 74 72 75 65 2c 20 77     /* If true, w
1ba80 72 69 74 65 20 64 6c 69 64 78 20 74 6f 20 64 69  rite dlidx to di
1ba90 73 6b 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69  sk */.){.  int i
1baa0 3b 0a 20 20 61 73 73 65 72 74 28 20 62 46 6c 75  ;.  assert( bFlu
1bab0 73 68 3d 3d 30 20 7c 7c 20 28 70 57 72 69 74 65  sh==0 || (pWrite
1bac0 72 2d 3e 6e 44 6c 69 64 78 3e 30 20 26 26 20 70  r->nDlidx>0 && p
1bad0 57 72 69 74 65 72 2d 3e 61 44 6c 69 64 78 5b 30  Writer->aDlidx[0
1bae0 5d 2e 62 75 66 2e 6e 3e 30 29 20 29 3b 0a 20 20  ].buf.n>0) );.  
1baf0 66 6f 72 28 69 3d 30 3b 20 69 3c 70 57 72 69 74  for(i=0; i<pWrit
1bb00 65 72 2d 3e 6e 44 6c 69 64 78 3b 20 69 2b 2b 29  er->nDlidx; i++)
1bb10 7b 0a 20 20 20 20 46 74 73 35 44 6c 69 64 78 57  {.    Fts5DlidxW
1bb20 72 69 74 65 72 20 2a 70 44 6c 69 64 78 20 3d 20  riter *pDlidx = 
1bb30 26 70 57 72 69 74 65 72 2d 3e 61 44 6c 69 64 78  &pWriter->aDlidx
1bb40 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20 70 44 6c  [i];.    if( pDl
1bb50 69 64 78 2d 3e 62 75 66 2e 6e 3d 3d 30 20 29 20  idx->buf.n==0 ) 
1bb60 62 72 65 61 6b 3b 0a 20 20 20 20 69 66 28 20 62  break;.    if( b
1bb70 46 6c 75 73 68 20 29 7b 0a 20 20 20 20 20 20 61  Flush ){.      a
1bb80 73 73 65 72 74 28 20 70 44 6c 69 64 78 2d 3e 70  ssert( pDlidx->p
1bb90 67 6e 6f 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  gno!=0 );.      
1bba0 66 74 73 35 44 61 74 61 57 72 69 74 65 28 70 2c  fts5DataWrite(p,
1bbb0 20 0a 20 20 20 20 20 20 20 20 20 20 46 54 53 35   .          FTS5
1bbc0 5f 44 4c 49 44 58 5f 52 4f 57 49 44 28 70 57 72  _DLIDX_ROWID(pWr
1bbd0 69 74 65 72 2d 3e 69 53 65 67 69 64 2c 20 69 2c  iter->iSegid, i,
1bbe0 20 70 44 6c 69 64 78 2d 3e 70 67 6e 6f 29 2c 0a   pDlidx->pgno),.
1bbf0 20 20 20 20 20 20 20 20 20 20 70 44 6c 69 64 78            pDlidx
1bc00 2d 3e 62 75 66 2e 70 2c 20 70 44 6c 69 64 78 2d  ->buf.p, pDlidx-
1bc10 3e 62 75 66 2e 6e 0a 20 20 20 20 20 20 29 3b 0a  >buf.n.      );.
1bc20 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
1bc30 33 46 74 73 35 42 75 66 66 65 72 5a 65 72 6f 28  3Fts5BufferZero(
1bc40 26 70 44 6c 69 64 78 2d 3e 62 75 66 29 3b 0a 20  &pDlidx->buf);. 
1bc50 20 20 20 70 44 6c 69 64 78 2d 3e 62 50 72 65 76     pDlidx->bPrev
1bc60 56 61 6c 69 64 20 3d 20 30 3b 0a 20 20 7d 0a 7d  Valid = 0;.  }.}
1bc70 0a 0a 2f 2a 0a 2a 2a 20 47 72 6f 77 20 74 68 65  ../*.** Grow the
1bc80 20 70 57 72 69 74 65 72 2d 3e 61 44 6c 69 64 78   pWriter->aDlidx
1bc90 5b 5d 20 61 72 72 61 79 20 74 6f 20 61 74 20 6c  [] array to at l
1bca0 65 61 73 74 20 6e 4c 76 6c 20 65 6c 65 6d 65 6e  east nLvl elemen
1bcb0 74 73 20 69 6e 20 73 69 7a 65 2e 0a 2a 2a 20 41  ts in size..** A
1bcc0 6e 79 20 6e 65 77 20 61 72 72 61 79 20 65 6c 65  ny new array ele
1bcd0 6d 65 6e 74 73 20 61 72 65 20 7a 65 72 6f 65 64  ments are zeroed
1bce0 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e   before returnin
1bcf0 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  g..*/.static int
1bd00 20 66 74 73 35 57 72 69 74 65 44 6c 69 64 78 47   fts5WriteDlidxG
1bd10 72 6f 77 28 0a 20 20 46 74 73 35 49 6e 64 65 78  row(.  Fts5Index
1bd20 20 2a 70 2c 0a 20 20 46 74 73 35 53 65 67 57 72   *p,.  Fts5SegWr
1bd30 69 74 65 72 20 2a 70 57 72 69 74 65 72 2c 0a 20  iter *pWriter,. 
1bd40 20 69 6e 74 20 6e 4c 76 6c 0a 29 7b 0a 20 20 69   int nLvl.){.  i
1bd50 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  f( p->rc==SQLITE
1bd60 5f 4f 4b 20 26 26 20 6e 4c 76 6c 3e 3d 70 57 72  _OK && nLvl>=pWr
1bd70 69 74 65 72 2d 3e 6e 44 6c 69 64 78 20 29 7b 0a  iter->nDlidx ){.
1bd80 20 20 20 20 46 74 73 35 44 6c 69 64 78 57 72 69      Fts5DlidxWri
1bd90 74 65 72 20 2a 61 44 6c 69 64 78 20 3d 20 28 46  ter *aDlidx = (F
1bda0 74 73 35 44 6c 69 64 78 57 72 69 74 65 72 2a 29  ts5DlidxWriter*)
1bdb0 73 71 6c 69 74 65 33 5f 72 65 61 6c 6c 6f 63 28  sqlite3_realloc(
1bdc0 0a 20 20 20 20 20 20 20 20 70 57 72 69 74 65 72  .        pWriter
1bdd0 2d 3e 61 44 6c 69 64 78 2c 20 73 69 7a 65 6f 66  ->aDlidx, sizeof
1bde0 28 46 74 73 35 44 6c 69 64 78 57 72 69 74 65 72  (Fts5DlidxWriter
1bdf0 29 20 2a 20 6e 4c 76 6c 0a 20 20 20 20 29 3b 0a  ) * nLvl.    );.
1be00 20 20 20 20 69 66 28 20 61 44 6c 69 64 78 3d 3d      if( aDlidx==
1be10 30 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 72 63  0 ){.      p->rc
1be20 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
1be30 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1be40 20 20 69 6e 74 20 6e 42 79 74 65 20 3d 20 73 69    int nByte = si
1be50 7a 65 6f 66 28 46 74 73 35 44 6c 69 64 78 57 72  zeof(Fts5DlidxWr
1be60 69 74 65 72 29 20 2a 20 28 6e 4c 76 6c 20 2d 20  iter) * (nLvl - 
1be70 70 57 72 69 74 65 72 2d 3e 6e 44 6c 69 64 78 29  pWriter->nDlidx)
1be80 3b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 26  ;.      memset(&
1be90 61 44 6c 69 64 78 5b 70 57 72 69 74 65 72 2d 3e  aDlidx[pWriter->
1bea0 6e 44 6c 69 64 78 5d 2c 20 30 2c 20 6e 42 79 74  nDlidx], 0, nByt
1beb0 65 29 3b 0a 20 20 20 20 20 20 70 57 72 69 74 65  e);.      pWrite
1bec0 72 2d 3e 61 44 6c 69 64 78 20 3d 20 61 44 6c 69  r->aDlidx = aDli
1bed0 64 78 3b 0a 20 20 20 20 20 20 70 57 72 69 74 65  dx;.      pWrite
1bee0 72 2d 3e 6e 44 6c 69 64 78 20 3d 20 6e 4c 76 6c  r->nDlidx = nLvl
1bef0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
1bf00 74 75 72 6e 20 70 2d 3e 72 63 3b 0a 7d 0a 0a 2f  turn p->rc;.}../
1bf10 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 75 72 72  *.** If the curr
1bf20 65 6e 74 20 64 6f 63 6c 69 73 74 2d 69 6e 64 65  ent doclist-inde
1bf30 78 20 61 63 63 75 6d 75 6c 61 74 69 6e 67 20 69  x accumulating i
1bf40 6e 20 70 57 72 69 74 65 72 2d 3e 61 44 6c 69 64  n pWriter->aDlid
1bf50 78 5b 5d 20 69 73 20 6c 61 72 67 65 0a 2a 2a 20  x[] is large.** 
1bf60 65 6e 6f 75 67 68 2c 20 66 6c 75 73 68 20 69 74  enough, flush it
1bf70 20 74 6f 20 64 69 73 6b 20 61 6e 64 20 72 65 74   to disk and ret
1bf80 75 72 6e 20 31 2e 20 4f 74 68 65 72 77 69 73 65  urn 1. Otherwise
1bf90 20 64 69 73 63 61 72 64 20 69 74 20 61 6e 64 20   discard it and 
1bfa0 72 65 74 75 72 6e 0a 2a 2a 20 7a 65 72 6f 2e 0a  return.** zero..
1bfb0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74  */.static int ft
1bfc0 73 35 57 72 69 74 65 46 6c 75 73 68 44 6c 69 64  s5WriteFlushDlid
1bfd0 78 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20  x(Fts5Index *p, 
1bfe0 46 74 73 35 53 65 67 57 72 69 74 65 72 20 2a 70  Fts5SegWriter *p
1bff0 57 72 69 74 65 72 29 7b 0a 20 20 69 6e 74 20 62  Writer){.  int b
1c000 46 6c 61 67 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20  Flag = 0;..  /* 
1c010 49 66 20 74 68 65 72 65 20 77 65 72 65 20 46 54  If there were FT
1c020 53 35 5f 4d 49 4e 5f 44 4c 49 44 58 5f 53 49 5a  S5_MIN_DLIDX_SIZ
1c030 45 20 6f 72 20 6d 6f 72 65 20 65 6d 70 74 79 20  E or more empty 
1c040 6c 65 61 66 20 70 61 67 65 73 20 77 72 69 74 74  leaf pages writt
1c050 65 6e 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20 64  en.  ** to the d
1c060 61 74 61 62 61 73 65 2c 20 61 6c 73 6f 20 77 72  atabase, also wr
1c070 69 74 65 20 74 68 65 20 64 6f 63 6c 69 73 74 2d  ite the doclist-
1c080 69 6e 64 65 78 20 74 6f 20 64 69 73 6b 2e 20 20  index to disk.  
1c090 2a 2f 0a 20 20 69 66 28 20 70 57 72 69 74 65 72  */.  if( pWriter
1c0a0 2d 3e 61 44 6c 69 64 78 5b 30 5d 2e 62 75 66 2e  ->aDlidx[0].buf.
1c0b0 6e 3e 30 20 26 26 20 70 57 72 69 74 65 72 2d 3e  n>0 && pWriter->
1c0c0 6e 45 6d 70 74 79 3e 3d 46 54 53 35 5f 4d 49 4e  nEmpty>=FTS5_MIN
1c0d0 5f 44 4c 49 44 58 5f 53 49 5a 45 20 29 7b 0a 20  _DLIDX_SIZE ){. 
1c0e0 20 20 20 62 46 6c 61 67 20 3d 20 31 3b 0a 20 20     bFlag = 1;.  
1c0f0 7d 0a 20 20 66 74 73 35 57 72 69 74 65 44 6c 69  }.  fts5WriteDli
1c100 64 78 43 6c 65 61 72 28 70 2c 20 70 57 72 69 74  dxClear(p, pWrit
1c110 65 72 2c 20 62 46 6c 61 67 29 3b 0a 20 20 70 57  er, bFlag);.  pW
1c120 72 69 74 65 72 2d 3e 6e 45 6d 70 74 79 20 3d 20  riter->nEmpty = 
1c130 30 3b 0a 20 20 72 65 74 75 72 6e 20 62 46 6c 61  0;.  return bFla
1c140 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  g;.}../*.** This
1c150 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
1c160 6c 65 64 20 77 68 65 6e 65 76 65 72 20 70 72 6f  led whenever pro
1c170 63 65 73 73 69 6e 67 20 6f 66 20 74 68 65 20 64  cessing of the d
1c180 6f 63 6c 69 73 74 20 66 6f 72 20 74 68 65 20 0a  oclist for the .
1c190 2a 2a 20 6c 61 73 74 20 74 65 72 6d 20 6f 6e 20  ** last term on 
1c1a0 6c 65 61 66 20 70 61 67 65 20 28 70 57 72 69 74  leaf page (pWrit
1c1b0 65 72 2d 3e 69 42 74 50 61 67 65 29 20 69 73 20  er->iBtPage) is 
1c1c0 63 6f 6d 70 6c 65 74 65 64 2e 20 0a 2a 2a 0a 2a  completed. .**.*
1c1d0 2a 20 54 68 65 20 64 6f 63 6c 69 73 74 2d 69 6e  * The doclist-in
1c1e0 64 65 78 20 66 6f 72 20 74 68 61 74 20 74 65 72  dex for that ter
1c1f0 6d 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 73  m is currently s
1c200 74 6f 72 65 64 20 69 6e 2d 6d 65 6d 6f 72 79 20  tored in-memory 
1c210 77 69 74 68 69 6e 20 74 68 65 0a 2a 2a 20 46 74  within the.** Ft
1c220 73 35 53 65 67 57 72 69 74 65 72 2e 61 44 6c 69  s5SegWriter.aDli
1c230 64 78 5b 5d 20 61 72 72 61 79 2e 20 49 66 20 69  dx[] array. If i
1c240 74 20 69 73 20 6c 61 72 67 65 20 65 6e 6f 75 67  t is large enoug
1c250 68 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  h, this function
1c260 0a 2a 2a 20 77 72 69 74 65 73 20 69 74 20 6f 75  .** writes it ou
1c270 74 20 74 6f 20 64 69 73 6b 2e 20 4f 72 2c 20 69  t to disk. Or, i
1c280 66 20 69 74 20 69 73 20 74 6f 6f 20 73 6d 61 6c  f it is too smal
1c290 6c 20 74 6f 20 62 6f 74 68 65 72 20 77 69 74 68  l to bother with
1c2a0 2c 20 64 69 73 63 61 72 64 73 0a 2a 2a 20 69 74  , discards.** it
1c2b0 2e 0a 2a 2a 0a 2a 2a 20 46 74 73 35 53 65 67 57  ..**.** Fts5SegW
1c2c0 72 69 74 65 72 2e 62 74 74 65 72 6d 20 63 75 72  riter.btterm cur
1c2d0 72 65 6e 74 6c 79 20 63 6f 6e 74 61 69 6e 73 20  rently contains 
1c2e0 74 68 65 20 66 69 72 73 74 20 74 65 72 6d 20 6f  the first term o
1c2f0 6e 20 70 61 67 65 20 69 42 74 50 61 67 65 2e 0a  n page iBtPage..
1c300 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
1c310 74 73 35 57 72 69 74 65 46 6c 75 73 68 42 74 72  ts5WriteFlushBtr
1c320 65 65 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c  ee(Fts5Index *p,
1c330 20 46 74 73 35 53 65 67 57 72 69 74 65 72 20 2a   Fts5SegWriter *
1c340 70 57 72 69 74 65 72 29 7b 0a 20 20 69 6e 74 20  pWriter){.  int 
1c350 62 46 6c 61 67 3b 0a 0a 20 20 61 73 73 65 72 74  bFlag;..  assert
1c360 28 20 70 57 72 69 74 65 72 2d 3e 69 42 74 50 61  ( pWriter->iBtPa
1c370 67 65 20 7c 7c 20 70 57 72 69 74 65 72 2d 3e 6e  ge || pWriter->n
1c380 45 6d 70 74 79 3d 3d 30 20 29 3b 0a 20 20 69 66  Empty==0 );.  if
1c390 28 20 70 57 72 69 74 65 72 2d 3e 69 42 74 50 61  ( pWriter->iBtPa
1c3a0 67 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  ge==0 ) return;.
1c3b0 20 20 62 46 6c 61 67 20 3d 20 66 74 73 35 57 72    bFlag = fts5Wr
1c3c0 69 74 65 46 6c 75 73 68 44 6c 69 64 78 28 70 2c  iteFlushDlidx(p,
1c3d0 20 70 57 72 69 74 65 72 29 3b 0a 0a 20 20 69 66   pWriter);..  if
1c3e0 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
1c3f0 4f 4b 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20  OK ){.    const 
1c400 63 68 61 72 20 2a 7a 20 3d 20 28 70 57 72 69 74  char *z = (pWrit
1c410 65 72 2d 3e 62 74 74 65 72 6d 2e 6e 3e 30 3f 28  er->btterm.n>0?(
1c420 63 6f 6e 73 74 20 63 68 61 72 2a 29 70 57 72 69  const char*)pWri
1c430 74 65 72 2d 3e 62 74 74 65 72 6d 2e 70 3a 22 22  ter->btterm.p:""
1c440 29 3b 0a 20 20 20 20 2f 2a 20 54 68 65 20 66 6f  );.    /* The fo
1c450 6c 6c 6f 77 69 6e 67 20 77 61 73 20 61 6c 72 65  llowing was alre
1c460 61 64 79 20 64 6f 6e 65 20 69 6e 20 66 74 73 35  ady done in fts5
1c470 57 72 69 74 65 49 6e 69 74 28 29 3a 20 2a 2f 0a  WriteInit(): */.
1c480 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f 62      /* sqlite3_b
1c490 69 6e 64 5f 69 6e 74 28 70 2d 3e 70 49 64 78 57  ind_int(p->pIdxW
1c4a0 72 69 74 65 72 2c 20 31 2c 20 70 57 72 69 74 65  riter, 1, pWrite
1c4b0 72 2d 3e 69 53 65 67 69 64 29 3b 20 2a 2f 0a 20  r->iSegid); */. 
1c4c0 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f     sqlite3_bind_
1c4d0 62 6c 6f 62 28 70 2d 3e 70 49 64 78 57 72 69 74  blob(p->pIdxWrit
1c4e0 65 72 2c 20 32 2c 20 7a 2c 20 70 57 72 69 74 65  er, 2, z, pWrite
1c4f0 72 2d 3e 62 74 74 65 72 6d 2e 6e 2c 20 53 51 4c  r->btterm.n, SQL
1c500 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 20  ITE_STATIC);.   
1c510 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e   sqlite3_bind_in
1c520 74 36 34 28 70 2d 3e 70 49 64 78 57 72 69 74 65  t64(p->pIdxWrite
1c530 72 2c 20 33 2c 20 62 46 6c 61 67 20 2b 20 28 28  r, 3, bFlag + ((
1c540 69 36 34 29 70 57 72 69 74 65 72 2d 3e 69 42 74  i64)pWriter->iBt
1c550 50 61 67 65 3c 3c 31 29 29 3b 0a 20 20 20 20 73  Page<<1));.    s
1c560 71 6c 69 74 65 33 5f 73 74 65 70 28 70 2d 3e 70  qlite3_step(p->p
1c570 49 64 78 57 72 69 74 65 72 29 3b 0a 20 20 20 20  IdxWriter);.    
1c580 70 2d 3e 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  p->rc = sqlite3_
1c590 72 65 73 65 74 28 70 2d 3e 70 49 64 78 57 72 69  reset(p->pIdxWri
1c5a0 74 65 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ter);.    sqlite
1c5b0 33 5f 62 69 6e 64 5f 6e 75 6c 6c 28 70 2d 3e 70  3_bind_null(p->p
1c5c0 49 64 78 57 72 69 74 65 72 2c 20 32 29 3b 0a 20  IdxWriter, 2);. 
1c5d0 20 7d 0a 20 20 70 57 72 69 74 65 72 2d 3e 69 42   }.  pWriter->iB
1c5e0 74 50 61 67 65 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a  tPage = 0;.}../*
1c5f0 0a 2a 2a 20 54 68 69 73 20 69 73 20 63 61 6c 6c  .** This is call
1c600 65 64 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68  ed once for each
1c610 20 6c 65 61 66 20 70 61 67 65 20 65 78 63 65 70   leaf page excep
1c620 74 20 74 68 65 20 66 69 72 73 74 20 74 68 61 74  t the first that
1c630 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20 61 74 20   contains.** at 
1c640 6c 65 61 73 74 20 6f 6e 65 20 74 65 72 6d 2e 20  least one term. 
1c650 41 72 67 75 6d 65 6e 74 20 28 6e 54 65 72 6d 2f  Argument (nTerm/
1c660 70 54 65 72 6d 29 20 69 73 20 74 68 65 20 73 70  pTerm) is the sp
1c670 6c 69 74 2d 6b 65 79 20 2d 20 61 20 74 65 72 6d  lit-key - a term
1c680 20 74 68 61 74 0a 2a 2a 20 69 73 20 6c 61 72 67   that.** is larg
1c690 65 72 20 74 68 61 6e 20 61 6c 6c 20 74 65 72 6d  er than all term
1c6a0 73 20 77 72 69 74 74 65 6e 20 74 6f 20 65 61 72  s written to ear
1c6b0 6c 69 65 72 20 6c 65 61 76 65 73 2c 20 61 6e 64  lier leaves, and
1c6c0 20 65 71 75 61 6c 20 74 6f 20 6f 72 0a 2a 2a 20   equal to or.** 
1c6d0 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 74 68 65  smaller than the
1c6e0 20 66 69 72 73 74 20 74 65 72 6d 20 6f 6e 20 74   first term on t
1c6f0 68 65 20 6e 65 77 20 6c 65 61 66 2e 0a 2a 2a 0a  he new leaf..**.
1c700 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  ** If an error o
1c710 63 63 75 72 73 2c 20 61 6e 20 65 72 72 6f 72 20  ccurs, an error 
1c720 63 6f 64 65 20 69 73 20 6c 65 66 74 20 69 6e 20  code is left in 
1c730 46 74 73 35 49 6e 64 65 78 2e 72 63 2e 20 49 66  Fts5Index.rc. If
1c740 20 61 6e 20 65 72 72 6f 72 0a 2a 2a 20 68 61 73   an error.** has
1c750 20 61 6c 72 65 61 64 79 20 6f 63 63 75 72 72 65   already occurre
1c760 64 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63  d when this func
1c770 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20  tion is called, 
1c780 69 74 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a  it is a no-op..*
1c790 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  /.static void ft
1c7a0 73 35 57 72 69 74 65 42 74 72 65 65 54 65 72 6d  s5WriteBtreeTerm
1c7b0 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70  (.  Fts5Index *p
1c7c0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1c7d0 20 20 20 20 2f 2a 20 46 54 53 35 20 62 61 63 6b      /* FTS5 back
1c7e0 65 6e 64 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  end object */.  
1c7f0 46 74 73 35 53 65 67 57 72 69 74 65 72 20 2a 70  Fts5SegWriter *p
1c800 57 72 69 74 65 72 2c 20 20 20 20 20 20 20 20 20  Writer,         
1c810 2f 2a 20 57 72 69 74 65 72 20 6f 62 6a 65 63 74  /* Writer object
1c820 20 2a 2f 0a 20 20 69 6e 74 20 6e 54 65 72 6d 2c   */.  int nTerm,
1c830 20 63 6f 6e 73 74 20 75 38 20 2a 70 54 65 72 6d   const u8 *pTerm
1c840 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 74        /* First t
1c850 65 72 6d 20 6f 6e 20 6e 65 77 20 70 61 67 65 20  erm on new page 
1c860 2a 2f 0a 29 7b 0a 20 20 66 74 73 35 57 72 69 74  */.){.  fts5Writ
1c870 65 46 6c 75 73 68 42 74 72 65 65 28 70 2c 20 70  eFlushBtree(p, p
1c880 57 72 69 74 65 72 29 3b 0a 20 20 66 74 73 35 42  Writer);.  fts5B
1c890 75 66 66 65 72 53 65 74 28 26 70 2d 3e 72 63 2c  ufferSet(&p->rc,
1c8a0 20 26 70 57 72 69 74 65 72 2d 3e 62 74 74 65 72   &pWriter->btter
1c8b0 6d 2c 20 6e 54 65 72 6d 2c 20 70 54 65 72 6d 29  m, nTerm, pTerm)
1c8c0 3b 0a 20 20 70 57 72 69 74 65 72 2d 3e 69 42 74  ;.  pWriter->iBt
1c8d0 50 61 67 65 20 3d 20 70 57 72 69 74 65 72 2d 3e  Page = pWriter->
1c8e0 77 72 69 74 65 72 2e 70 67 6e 6f 3b 0a 7d 0a 0a  writer.pgno;.}..
1c8f0 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
1c900 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 77 68  ion is called wh
1c910 65 6e 20 66 6c 75 73 68 69 6e 67 20 61 20 6c 65  en flushing a le
1c920 61 66 20 70 61 67 65 20 74 68 61 74 20 63 6f 6e  af page that con
1c930 74 61 69 6e 73 20 6e 6f 0a 2a 2a 20 74 65 72 6d  tains no.** term
1c940 73 20 61 74 20 61 6c 6c 20 74 6f 20 64 69 73 6b  s at all to disk
1c950 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
1c960 20 66 74 73 35 57 72 69 74 65 42 74 72 65 65 4e   fts5WriteBtreeN
1c970 6f 54 65 72 6d 28 0a 20 20 46 74 73 35 49 6e 64  oTerm(.  Fts5Ind
1c980 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  ex *p,          
1c990 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53 35           /* FTS5
1c9a0 20 62 61 63 6b 65 6e 64 20 6f 62 6a 65 63 74 20   backend object 
1c9b0 2a 2f 0a 20 20 46 74 73 35 53 65 67 57 72 69 74  */.  Fts5SegWrit
1c9c0 65 72 20 2a 70 57 72 69 74 65 72 20 20 20 20 20  er *pWriter     
1c9d0 20 20 20 20 20 2f 2a 20 57 72 69 74 65 72 20 6f       /* Writer o
1c9e0 62 6a 65 63 74 20 2a 2f 0a 29 7b 0a 20 20 2f 2a  bject */.){.  /*
1c9f0 20 49 66 20 74 68 65 72 65 20 77 65 72 65 20 6e   If there were n
1ca00 6f 20 72 6f 77 69 64 73 20 6f 6e 20 74 68 65 20  o rowids on the 
1ca10 6c 65 61 66 20 70 61 67 65 20 65 69 74 68 65 72  leaf page either
1ca20 20 61 6e 64 20 74 68 65 20 64 6f 63 6c 69 73 74   and the doclist
1ca30 2d 69 6e 64 65 78 0a 20 20 2a 2a 20 68 61 73 20  -index.  ** has 
1ca40 61 6c 72 65 61 64 79 20 62 65 65 6e 20 73 74 61  already been sta
1ca50 72 74 65 64 2c 20 61 70 70 65 6e 64 20 61 6e 20  rted, append an 
1ca60 30 78 30 30 20 62 79 74 65 20 74 6f 20 69 74 2e  0x00 byte to it.
1ca70 20 20 2a 2f 0a 20 20 69 66 28 20 70 57 72 69 74    */.  if( pWrit
1ca80 65 72 2d 3e 62 46 69 72 73 74 52 6f 77 69 64 49  er->bFirstRowidI
1ca90 6e 50 61 67 65 20 26 26 20 70 57 72 69 74 65 72  nPage && pWriter
1caa0 2d 3e 61 44 6c 69 64 78 5b 30 5d 2e 62 75 66 2e  ->aDlidx[0].buf.
1cab0 6e 3e 30 20 29 7b 0a 20 20 20 20 46 74 73 35 44  n>0 ){.    Fts5D
1cac0 6c 69 64 78 57 72 69 74 65 72 20 2a 70 44 6c 69  lidxWriter *pDli
1cad0 64 78 20 3d 20 26 70 57 72 69 74 65 72 2d 3e 61  dx = &pWriter->a
1cae0 44 6c 69 64 78 5b 30 5d 3b 0a 20 20 20 20 61 73  Dlidx[0];.    as
1caf0 73 65 72 74 28 20 70 44 6c 69 64 78 2d 3e 62 50  sert( pDlidx->bP
1cb00 72 65 76 56 61 6c 69 64 20 29 3b 0a 20 20 20 20  revValid );.    
1cb10 73 71 6c 69 74 65 33 46 74 73 35 42 75 66 66 65  sqlite3Fts5Buffe
1cb20 72 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26 70  rAppendVarint(&p
1cb30 2d 3e 72 63 2c 20 26 70 44 6c 69 64 78 2d 3e 62  ->rc, &pDlidx->b
1cb40 75 66 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20 20 2f  uf, 0);.  }..  /
1cb50 2a 20 49 6e 63 72 65 6d 65 6e 74 20 74 68 65 20  * Increment the 
1cb60 22 6e 75 6d 62 65 72 20 6f 66 20 73 65 71 75 65  "number of seque
1cb70 6e 74 69 61 6c 20 6c 65 61 76 65 73 20 77 69 74  ntial leaves wit
1cb80 68 6f 75 74 20 61 20 74 65 72 6d 22 20 63 6f 75  hout a term" cou
1cb90 6e 74 65 72 2e 20 2a 2f 0a 20 20 70 57 72 69 74  nter. */.  pWrit
1cba0 65 72 2d 3e 6e 45 6d 70 74 79 2b 2b 3b 0a 7d 0a  er->nEmpty++;.}.
1cbb0 0a 73 74 61 74 69 63 20 69 36 34 20 66 74 73 35  .static i64 fts5
1cbc0 44 6c 69 64 78 45 78 74 72 61 63 74 46 69 72 73  DlidxExtractFirs
1cbd0 74 52 6f 77 69 64 28 46 74 73 35 42 75 66 66 65  tRowid(Fts5Buffe
1cbe0 72 20 2a 70 42 75 66 29 7b 0a 20 20 69 36 34 20  r *pBuf){.  i64 
1cbf0 69 52 6f 77 69 64 3b 0a 20 20 69 6e 74 20 69 4f  iRowid;.  int iO
1cc00 66 66 3b 0a 0a 20 20 69 4f 66 66 20 3d 20 31 20  ff;..  iOff = 1 
1cc10 2b 20 66 74 73 35 47 65 74 56 61 72 69 6e 74 28  + fts5GetVarint(
1cc20 26 70 42 75 66 2d 3e 70 5b 31 5d 2c 20 28 75 36  &pBuf->p[1], (u6
1cc30 34 2a 29 26 69 52 6f 77 69 64 29 3b 0a 20 20 66  4*)&iRowid);.  f
1cc40 74 73 35 47 65 74 56 61 72 69 6e 74 28 26 70 42  ts5GetVarint(&pB
1cc50 75 66 2d 3e 70 5b 69 4f 66 66 5d 2c 20 28 75 36  uf->p[iOff], (u6
1cc60 34 2a 29 26 69 52 6f 77 69 64 29 3b 0a 20 20 72  4*)&iRowid);.  r
1cc70 65 74 75 72 6e 20 69 52 6f 77 69 64 3b 0a 7d 0a  eturn iRowid;.}.
1cc80 0a 2f 2a 0a 2a 2a 20 52 6f 77 69 64 20 69 52 6f  ./*.** Rowid iRo
1cc90 77 69 64 20 68 61 73 20 6a 75 73 74 20 62 65 65  wid has just bee
1cca0 6e 20 61 70 70 65 6e 64 65 64 20 74 6f 20 74 68  n appended to th
1ccb0 65 20 63 75 72 72 65 6e 74 20 6c 65 61 66 20 70  e current leaf p
1ccc0 61 67 65 2e 20 49 74 20 69 73 20 74 68 65 0a 2a  age. It is the.*
1ccd0 2a 20 66 69 72 73 74 20 6f 6e 20 74 68 65 20 70  * first on the p
1cce0 61 67 65 2e 20 54 68 69 73 20 66 75 6e 63 74 69  age. This functi
1ccf0 6f 6e 20 61 70 70 65 6e 64 73 20 61 6e 20 61 70  on appends an ap
1cd00 70 72 6f 70 72 69 61 74 65 20 65 6e 74 72 79 20  propriate entry 
1cd10 74 6f 20 74 68 65 20 63 75 72 72 65 6e 74 0a 2a  to the current.*
1cd20 2a 20 64 6f 63 6c 69 73 74 2d 69 6e 64 65 78 2e  * doclist-index.
1cd30 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
1cd40 66 74 73 35 57 72 69 74 65 44 6c 69 64 78 41 70  fts5WriteDlidxAp
1cd50 70 65 6e 64 28 0a 20 20 46 74 73 35 49 6e 64 65  pend(.  Fts5Inde
1cd60 78 20 2a 70 2c 20 0a 20 20 46 74 73 35 53 65 67  x *p, .  Fts5Seg
1cd70 57 72 69 74 65 72 20 2a 70 57 72 69 74 65 72 2c  Writer *pWriter,
1cd80 20 0a 20 20 69 36 34 20 69 52 6f 77 69 64 0a 29   .  i64 iRowid.)
1cd90 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74  {.  int i;.  int
1cda0 20 62 44 6f 6e 65 20 3d 20 30 3b 0a 0a 20 20 66   bDone = 0;..  f
1cdb0 6f 72 28 69 3d 30 3b 20 70 2d 3e 72 63 3d 3d 53  or(i=0; p->rc==S
1cdc0 51 4c 49 54 45 5f 4f 4b 20 26 26 20 62 44 6f 6e  QLITE_OK && bDon
1cdd0 65 3d 3d 30 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  e==0; i++){.    
1cde0 69 36 34 20 69 56 61 6c 3b 0a 20 20 20 20 46 74  i64 iVal;.    Ft
1cdf0 73 35 44 6c 69 64 78 57 72 69 74 65 72 20 2a 70  s5DlidxWriter *p
1ce00 44 6c 69 64 78 20 3d 20 26 70 57 72 69 74 65 72  Dlidx = &pWriter
1ce10 2d 3e 61 44 6c 69 64 78 5b 69 5d 3b 0a 0a 20 20  ->aDlidx[i];..  
1ce20 20 20 69 66 28 20 70 44 6c 69 64 78 2d 3e 62 75    if( pDlidx->bu
1ce30 66 2e 6e 3e 3d 70 2d 3e 70 43 6f 6e 66 69 67 2d  f.n>=p->pConfig-
1ce40 3e 70 67 73 7a 20 29 7b 0a 20 20 20 20 20 20 2f  >pgsz ){.      /
1ce50 2a 20 54 68 65 20 63 75 72 72 65 6e 74 20 64 6f  * The current do
1ce60 63 6c 69 73 74 2d 69 6e 64 65 78 20 70 61 67 65  clist-index page
1ce70 20 69 73 20 66 75 6c 6c 2e 20 57 72 69 74 65 20   is full. Write 
1ce80 69 74 20 74 6f 20 64 69 73 6b 20 61 6e 64 20 70  it to disk and p
1ce90 75 73 68 0a 20 20 20 20 20 20 2a 2a 20 61 20 63  ush.      ** a c
1cea0 6f 70 79 20 6f 66 20 69 52 6f 77 69 64 20 28 77  opy of iRowid (w
1ceb0 68 69 63 68 20 77 69 6c 6c 20 62 65 63 6f 6d 65  hich will become
1cec0 20 74 68 65 20 66 69 72 73 74 20 72 6f 77 69 64   the first rowid
1ced0 20 6f 6e 20 74 68 65 20 6e 65 78 74 0a 20 20 20   on the next.   
1cee0 20 20 20 2a 2a 20 64 6f 63 6c 69 73 74 2d 69 6e     ** doclist-in
1cef0 64 65 78 20 6c 65 61 66 20 70 61 67 65 29 20 75  dex leaf page) u
1cf00 70 20 69 6e 74 6f 20 74 68 65 20 6e 65 78 74 20  p into the next 
1cf10 6c 65 76 65 6c 20 6f 66 20 74 68 65 20 62 2d 74  level of the b-t
1cf20 72 65 65 20 0a 20 20 20 20 20 20 2a 2a 20 68 69  ree .      ** hi
1cf30 65 72 61 72 63 68 79 2e 20 49 66 20 74 68 65 20  erarchy. If the 
1cf40 6e 6f 64 65 20 62 65 69 6e 67 20 66 6c 75 73 68  node being flush
1cf50 65 64 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20  ed is currently 
1cf60 74 68 65 20 72 6f 6f 74 20 6e 6f 64 65 2c 0a 20  the root node,. 
1cf70 20 20 20 20 20 2a 2a 20 61 6c 73 6f 20 70 75 73       ** also pus
1cf80 68 20 69 74 73 20 66 69 72 73 74 20 72 6f 77 69  h its first rowi
1cf90 64 20 75 70 77 61 72 64 73 2e 20 2a 2f 0a 20 20  d upwards. */.  
1cfa0 20 20 20 20 70 44 6c 69 64 78 2d 3e 62 75 66 2e      pDlidx->buf.
1cfb0 70 5b 30 5d 20 3d 20 30 78 30 31 3b 20 20 20 20  p[0] = 0x01;    
1cfc0 2f 2a 20 4e 6f 74 20 74 68 65 20 72 6f 6f 74 20  /* Not the root 
1cfd0 6e 6f 64 65 20 2a 2f 0a 20 20 20 20 20 20 66 74  node */.      ft
1cfe0 73 35 44 61 74 61 57 72 69 74 65 28 70 2c 20 0a  s5DataWrite(p, .
1cff0 20 20 20 20 20 20 20 20 20 20 46 54 53 35 5f 44            FTS5_D
1d000 4c 49 44 58 5f 52 4f 57 49 44 28 70 57 72 69 74  LIDX_ROWID(pWrit
1d010 65 72 2d 3e 69 53 65 67 69 64 2c 20 69 2c 20 70  er->iSegid, i, p
1d020 44 6c 69 64 78 2d 3e 70 67 6e 6f 29 2c 0a 20 20  Dlidx->pgno),.  
1d030 20 20 20 20 20 20 20 20 70 44 6c 69 64 78 2d 3e          pDlidx->
1d040 62 75 66 2e 70 2c 20 70 44 6c 69 64 78 2d 3e 62  buf.p, pDlidx->b
1d050 75 66 2e 6e 0a 20 20 20 20 20 20 29 3b 0a 20 20  uf.n.      );.  
1d060 20 20 20 20 66 74 73 35 57 72 69 74 65 44 6c 69      fts5WriteDli
1d070 64 78 47 72 6f 77 28 70 2c 20 70 57 72 69 74 65  dxGrow(p, pWrite
1d080 72 2c 20 69 2b 32 29 3b 0a 20 20 20 20 20 20 70  r, i+2);.      p
1d090 44 6c 69 64 78 20 3d 20 26 70 57 72 69 74 65 72  Dlidx = &pWriter
1d0a0 2d 3e 61 44 6c 69 64 78 5b 69 5d 3b 0a 20 20 20  ->aDlidx[i];.   
1d0b0 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51     if( p->rc==SQ
1d0c0 4c 49 54 45 5f 4f 4b 20 26 26 20 70 44 6c 69 64  LITE_OK && pDlid
1d0d0 78 5b 31 5d 2e 62 75 66 2e 6e 3d 3d 30 20 29 7b  x[1].buf.n==0 ){
1d0e0 0a 20 20 20 20 20 20 20 20 69 36 34 20 69 46 69  .        i64 iFi
1d0f0 72 73 74 20 3d 20 66 74 73 35 44 6c 69 64 78 45  rst = fts5DlidxE
1d100 78 74 72 61 63 74 46 69 72 73 74 52 6f 77 69 64  xtractFirstRowid
1d110 28 26 70 44 6c 69 64 78 2d 3e 62 75 66 29 3b 0a  (&pDlidx->buf);.
1d120 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73  .        /* This
1d130 20 77 61 73 20 74 68 65 20 72 6f 6f 74 20 6e 6f   was the root no
1d140 64 65 2e 20 50 75 73 68 20 69 74 73 20 66 69 72  de. Push its fir
1d150 73 74 20 72 6f 77 69 64 20 75 70 20 74 6f 20 74  st rowid up to t
1d160 68 65 20 6e 65 77 20 72 6f 6f 74 2e 20 2a 2f 0a  he new root. */.
1d170 20 20 20 20 20 20 20 20 70 44 6c 69 64 78 5b 31          pDlidx[1
1d180 5d 2e 70 67 6e 6f 20 3d 20 70 44 6c 69 64 78 2d  ].pgno = pDlidx-
1d190 3e 70 67 6e 6f 3b 0a 20 20 20 20 20 20 20 20 73  >pgno;.        s
1d1a0 71 6c 69 74 65 33 46 74 73 35 42 75 66 66 65 72  qlite3Fts5Buffer
1d1b0 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26 70 2d  AppendVarint(&p-
1d1c0 3e 72 63 2c 20 26 70 44 6c 69 64 78 5b 31 5d 2e  >rc, &pDlidx[1].
1d1d0 62 75 66 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  buf, 0);.       
1d1e0 20 73 71 6c 69 74 65 33 46 74 73 35 42 75 66 66   sqlite3Fts5Buff
1d1f0 65 72 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26  erAppendVarint(&
1d200 70 2d 3e 72 63 2c 20 26 70 44 6c 69 64 78 5b 31  p->rc, &pDlidx[1
1d210 5d 2e 62 75 66 2c 20 70 44 6c 69 64 78 2d 3e 70  ].buf, pDlidx->p
1d220 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 73 71  gno);.        sq
1d230 6c 69 74 65 33 46 74 73 35 42 75 66 66 65 72 41  lite3Fts5BufferA
1d240 70 70 65 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e  ppendVarint(&p->
1d250 72 63 2c 20 26 70 44 6c 69 64 78 5b 31 5d 2e 62  rc, &pDlidx[1].b
1d260 75 66 2c 20 69 46 69 72 73 74 29 3b 0a 20 20 20  uf, iFirst);.   
1d270 20 20 20 20 20 70 44 6c 69 64 78 5b 31 5d 2e 62       pDlidx[1].b
1d280 50 72 65 76 56 61 6c 69 64 20 3d 20 31 3b 0a 20  PrevValid = 1;. 
1d290 20 20 20 20 20 20 20 70 44 6c 69 64 78 5b 31 5d         pDlidx[1]
1d2a0 2e 69 50 72 65 76 20 3d 20 69 46 69 72 73 74 3b  .iPrev = iFirst;
1d2b0 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
1d2c0 73 71 6c 69 74 65 33 46 74 73 35 42 75 66 66 65  sqlite3Fts5Buffe
1d2d0 72 5a 65 72 6f 28 26 70 44 6c 69 64 78 2d 3e 62  rZero(&pDlidx->b
1d2e0 75 66 29 3b 0a 20 20 20 20 20 20 70 44 6c 69 64  uf);.      pDlid
1d2f0 78 2d 3e 62 50 72 65 76 56 61 6c 69 64 20 3d 20  x->bPrevValid = 
1d300 30 3b 0a 20 20 20 20 20 20 70 44 6c 69 64 78 2d  0;.      pDlidx-
1d310 3e 70 67 6e 6f 2b 2b 3b 0a 20 20 20 20 7d 65 6c  >pgno++;.    }el
1d320 73 65 7b 0a 20 20 20 20 20 20 62 44 6f 6e 65 20  se{.      bDone 
1d330 3d 20 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  = 1;.    }..    
1d340 69 66 28 20 70 44 6c 69 64 78 2d 3e 62 50 72 65  if( pDlidx->bPre
1d350 76 56 61 6c 69 64 20 29 7b 0a 20 20 20 20 20 20  vValid ){.      
1d360 69 56 61 6c 20 3d 20 69 52 6f 77 69 64 20 2d 20  iVal = iRowid - 
1d370 70 44 6c 69 64 78 2d 3e 69 50 72 65 76 3b 0a 20  pDlidx->iPrev;. 
1d380 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1d390 69 36 34 20 69 50 67 6e 6f 20 3d 20 28 69 3d 3d  i64 iPgno = (i==
1d3a0 30 20 3f 20 70 57 72 69 74 65 72 2d 3e 77 72 69  0 ? pWriter->wri
1d3b0 74 65 72 2e 70 67 6e 6f 20 3a 20 70 44 6c 69 64  ter.pgno : pDlid
1d3c0 78 5b 2d 31 5d 2e 70 67 6e 6f 29 3b 0a 20 20 20  x[-1].pgno);.   
1d3d0 20 20 20 61 73 73 65 72 74 28 20 70 44 6c 69 64     assert( pDlid
1d3e0 78 2d 3e 62 75 66 2e 6e 3d 3d 30 20 29 3b 0a 20  x->buf.n==0 );. 
1d3f0 20 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35       sqlite3Fts5
1d400 42 75 66 66 65 72 41 70 70 65 6e 64 56 61 72 69  BufferAppendVari
1d410 6e 74 28 26 70 2d 3e 72 63 2c 20 26 70 44 6c 69  nt(&p->rc, &pDli
1d420 64 78 2d 3e 62 75 66 2c 20 21 62 44 6f 6e 65 29  dx->buf, !bDone)
1d430 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 46  ;.      sqlite3F
1d440 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 56  ts5BufferAppendV
1d450 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26 70  arint(&p->rc, &p
1d460 44 6c 69 64 78 2d 3e 62 75 66 2c 20 69 50 67 6e  Dlidx->buf, iPgn
1d470 6f 29 3b 0a 20 20 20 20 20 20 69 56 61 6c 20 3d  o);.      iVal =
1d480 20 69 52 6f 77 69 64 3b 0a 20 20 20 20 7d 0a 0a   iRowid;.    }..
1d490 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 42      sqlite3Fts5B
1d4a0 75 66 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e  ufferAppendVarin
1d4b0 74 28 26 70 2d 3e 72 63 2c 20 26 70 44 6c 69 64  t(&p->rc, &pDlid
1d4c0 78 2d 3e 62 75 66 2c 20 69 56 61 6c 29 3b 0a 20  x->buf, iVal);. 
1d4d0 20 20 20 70 44 6c 69 64 78 2d 3e 62 50 72 65 76     pDlidx->bPrev
1d4e0 56 61 6c 69 64 20 3d 20 31 3b 0a 20 20 20 20 70  Valid = 1;.    p
1d4f0 44 6c 69 64 78 2d 3e 69 50 72 65 76 20 3d 20 69  Dlidx->iPrev = i
1d500 52 6f 77 69 64 3b 0a 20 20 7d 0a 7d 0a 0a 73 74  Rowid;.  }.}..st
1d510 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 57 72  atic void fts5Wr
1d520 69 74 65 46 6c 75 73 68 4c 65 61 66 28 46 74 73  iteFlushLeaf(Fts
1d530 35 49 6e 64 65 78 20 2a 70 2c 20 46 74 73 35 53  5Index *p, Fts5S
1d540 65 67 57 72 69 74 65 72 20 2a 70 57 72 69 74 65  egWriter *pWrite
1d550 72 29 7b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e  r){.  static con
1d560 73 74 20 75 38 20 7a 65 72 6f 5b 5d 20 3d 20 7b  st u8 zero[] = {
1d570 20 30 78 30 30 2c 20 30 78 30 30 2c 20 30 78 30   0x00, 0x00, 0x0
1d580 30 2c 20 30 78 30 30 20 7d 3b 0a 20 20 46 74 73  0, 0x00 };.  Fts
1d590 35 50 61 67 65 57 72 69 74 65 72 20 2a 70 50 61  5PageWriter *pPa
1d5a0 67 65 20 3d 20 26 70 57 72 69 74 65 72 2d 3e 77  ge = &pWriter->w
1d5b0 72 69 74 65 72 3b 0a 20 20 69 36 34 20 69 52 6f  riter;.  i64 iRo
1d5c0 77 69 64 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  wid;..  assert( 
1d5d0 28 70 50 61 67 65 2d 3e 70 67 69 64 78 2e 6e 3d  (pPage->pgidx.n=
1d5e0 3d 30 29 3d 3d 28 70 57 72 69 74 65 72 2d 3e 62  =0)==(pWriter->b
1d5f0 46 69 72 73 74 54 65 72 6d 49 6e 50 61 67 65 29  FirstTermInPage)
1d600 20 29 3b 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68   );..  /* Set th
1d610 65 20 73 7a 4c 65 61 66 20 68 65 61 64 65 72 20  e szLeaf header 
1d620 66 69 65 6c 64 2e 20 2a 2f 0a 20 20 61 73 73 65  field. */.  asse
1d630 72 74 28 20 30 3d 3d 66 74 73 35 47 65 74 55 31  rt( 0==fts5GetU1
1d640 36 28 26 70 50 61 67 65 2d 3e 62 75 66 2e 70 5b  6(&pPage->buf.p[
1d650 32 5d 29 20 29 3b 0a 20 20 66 74 73 35 50 75 74  2]) );.  fts5Put
1d660 55 31 36 28 26 70 50 61 67 65 2d 3e 62 75 66 2e  U16(&pPage->buf.
1d670 70 5b 32 5d 2c 20 28 75 31 36 29 70 50 61 67 65  p[2], (u16)pPage
1d680 2d 3e 62 75 66 2e 6e 29 3b 0a 0a 20 20 69 66 28  ->buf.n);..  if(
1d690 20 70 57 72 69 74 65 72 2d 3e 62 46 69 72 73 74   pWriter->bFirst
1d6a0 54 65 72 6d 49 6e 50 61 67 65 20 29 7b 0a 20 20  TermInPage ){.  
1d6b0 20 20 2f 2a 20 4e 6f 20 74 65 72 6d 20 77 61 73    /* No term was
1d6c0 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 69 73   written to this
1d6d0 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20 61 73   page. */.    as
1d6e0 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70 67 69  sert( pPage->pgi
1d6f0 64 78 2e 6e 3d 3d 30 20 29 3b 0a 20 20 20 20 66  dx.n==0 );.    f
1d700 74 73 35 57 72 69 74 65 42 74 72 65 65 4e 6f 54  ts5WriteBtreeNoT
1d710 65 72 6d 28 70 2c 20 70 57 72 69 74 65 72 29 3b  erm(p, pWriter);
1d720 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
1d730 20 41 70 70 65 6e 64 20 74 68 65 20 70 67 69 64   Append the pgid
1d740 78 20 74 6f 20 74 68 65 20 70 61 67 65 20 62 75  x to the page bu
1d750 66 66 65 72 2e 20 53 65 74 20 74 68 65 20 73 7a  ffer. Set the sz
1d760 4c 65 61 66 20 68 65 61 64 65 72 20 66 69 65 6c  Leaf header fiel
1d770 64 2e 20 2a 2f 0a 20 20 20 20 66 74 73 35 42 75  d. */.    fts5Bu
1d780 66 66 65 72 41 70 70 65 6e 64 42 6c 6f 62 28 26  fferAppendBlob(&
1d790 70 2d 3e 72 63 2c 20 26 70 50 61 67 65 2d 3e 62  p->rc, &pPage->b
1d7a0 75 66 2c 20 70 50 61 67 65 2d 3e 70 67 69 64 78  uf, pPage->pgidx
1d7b0 2e 6e 2c 20 70 50 61 67 65 2d 3e 70 67 69 64 78  .n, pPage->pgidx
1d7c0 2e 70 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57  .p);.  }..  /* W
1d7d0 72 69 74 65 20 74 68 65 20 70 61 67 65 20 6f 75  rite the page ou
1d7e0 74 20 74 6f 20 64 69 73 6b 20 2a 2f 0a 20 20 69  t to disk */.  i
1d7f0 52 6f 77 69 64 20 3d 20 46 54 53 35 5f 53 45 47  Rowid = FTS5_SEG
1d800 4d 45 4e 54 5f 52 4f 57 49 44 28 70 57 72 69 74  MENT_ROWID(pWrit
1d810 65 72 2d 3e 69 53 65 67 69 64 2c 20 70 50 61 67  er->iSegid, pPag
1d820 65 2d 3e 70 67 6e 6f 29 3b 0a 20 20 66 74 73 35  e->pgno);.  fts5
1d830 44 61 74 61 57 72 69 74 65 28 70 2c 20 69 52 6f  DataWrite(p, iRo
1d840 77 69 64 2c 20 70 50 61 67 65 2d 3e 62 75 66 2e  wid, pPage->buf.
1d850 70 2c 20 70 50 61 67 65 2d 3e 62 75 66 2e 6e 29  p, pPage->buf.n)
1d860 3b 0a 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69  ;..  /* Initiali
1d870 7a 65 20 74 68 65 20 6e 65 78 74 20 70 61 67 65  ze the next page
1d880 2e 20 2a 2f 0a 20 20 66 74 73 35 42 75 66 66 65  . */.  fts5Buffe
1d890 72 5a 65 72 6f 28 26 70 50 61 67 65 2d 3e 62 75  rZero(&pPage->bu
1d8a0 66 29 3b 0a 20 20 66 74 73 35 42 75 66 66 65 72  f);.  fts5Buffer
1d8b0 5a 65 72 6f 28 26 70 50 61 67 65 2d 3e 70 67 69  Zero(&pPage->pgi
1d8c0 64 78 29 3b 0a 20 20 66 74 73 35 42 75 66 66 65  dx);.  fts5Buffe
1d8d0 72 41 70 70 65 6e 64 42 6c 6f 62 28 26 70 2d 3e  rAppendBlob(&p->
1d8e0 72 63 2c 20 26 70 50 61 67 65 2d 3e 62 75 66 2c  rc, &pPage->buf,
1d8f0 20 34 2c 20 7a 65 72 6f 29 3b 0a 20 20 70 50 61   4, zero);.  pPa
1d900 67 65 2d 3e 69 50 72 65 76 50 67 69 64 78 20 3d  ge->iPrevPgidx =
1d910 20 30 3b 0a 20 20 70 50 61 67 65 2d 3e 70 67 6e   0;.  pPage->pgn
1d920 6f 2b 2b 3b 0a 0a 20 20 2f 2a 20 49 6e 63 72 65  o++;..  /* Incre
1d930 61 73 65 20 74 68 65 20 6c 65 61 76 65 73 20 77  ase the leaves w
1d940 72 69 74 74 65 6e 20 63 6f 75 6e 74 65 72 20 2a  ritten counter *
1d950 2f 0a 20 20 70 57 72 69 74 65 72 2d 3e 6e 4c 65  /.  pWriter->nLe
1d960 61 66 57 72 69 74 74 65 6e 2b 2b 3b 0a 0a 20 20  afWritten++;..  
1d970 2f 2a 20 54 68 65 20 6e 65 77 20 6c 65 61 66 20  /* The new leaf 
1d980 68 6f 6c 64 73 20 6e 6f 20 74 65 72 6d 73 20 6f  holds no terms o
1d990 72 20 72 6f 77 69 64 73 20 2a 2f 0a 20 20 70 57  r rowids */.  pW
1d9a0 72 69 74 65 72 2d 3e 62 46 69 72 73 74 54 65 72  riter->bFirstTer
1d9b0 6d 49 6e 50 61 67 65 20 3d 20 31 3b 0a 20 20 70  mInPage = 1;.  p
1d9c0 57 72 69 74 65 72 2d 3e 62 46 69 72 73 74 52 6f  Writer->bFirstRo
1d9d0 77 69 64 49 6e 50 61 67 65 20 3d 20 31 3b 0a 7d  widInPage = 1;.}
1d9e0 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64 20 74  ../*.** Append t
1d9f0 65 72 6d 20 70 54 65 72 6d 2f 6e 54 65 72 6d 20  erm pTerm/nTerm 
1da00 74 6f 20 74 68 65 20 73 65 67 6d 65 6e 74 20 62  to the segment b
1da10 65 69 6e 67 20 77 72 69 74 74 65 6e 20 62 79 20  eing written by 
1da20 74 68 65 20 77 72 69 74 65 72 20 70 61 73 73 65  the writer passe
1da30 64 0a 2a 2a 20 61 73 20 74 68 65 20 73 65 63 6f  d.** as the seco
1da40 6e 64 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a 0a  nd argument..**.
1da50 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  ** If an error o
1da60 63 63 75 72 73 2c 20 73 65 74 20 74 68 65 20 46  ccurs, set the F
1da70 74 73 35 49 6e 64 65 78 2e 72 63 20 65 72 72 6f  ts5Index.rc erro
1da80 72 20 63 6f 64 65 2e 20 49 66 20 61 6e 20 65 72  r code. If an er
1da90 72 6f 72 20 68 61 73 20 0a 2a 2a 20 61 6c 72 65  ror has .** alre
1daa0 61 64 79 20 6f 63 63 75 72 72 65 64 2c 20 74 68  ady occurred, th
1dab0 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61  is function is a
1dac0 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69   no-op..*/.stati
1dad0 63 20 76 6f 69 64 20 66 74 73 35 57 72 69 74 65  c void fts5Write
1dae0 41 70 70 65 6e 64 54 65 72 6d 28 0a 20 20 46 74  AppendTerm(.  Ft
1daf0 73 35 49 6e 64 65 78 20 2a 70 2c 20 0a 20 20 46  s5Index *p, .  F
1db00 74 73 35 53 65 67 57 72 69 74 65 72 20 2a 70 57  ts5SegWriter *pW
1db10 72 69 74 65 72 2c 0a 20 20 69 6e 74 20 6e 54 65  riter,.  int nTe
1db20 72 6d 2c 20 63 6f 6e 73 74 20 75 38 20 2a 70 54  rm, const u8 *pT
1db30 65 72 6d 20 0a 29 7b 0a 20 20 69 6e 74 20 6e 50  erm .){.  int nP
1db40 72 65 66 69 78 3b 20 20 20 20 20 20 20 20 20 20  refix;          
1db50 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74            /* Byt
1db60 65 73 20 6f 66 20 70 72 65 66 69 78 20 63 6f 6d  es of prefix com
1db70 70 72 65 73 73 69 6f 6e 20 66 6f 72 20 74 65 72  pression for ter
1db80 6d 20 2a 2f 0a 20 20 46 74 73 35 50 61 67 65 57  m */.  Fts5PageW
1db90 72 69 74 65 72 20 2a 70 50 61 67 65 20 3d 20 26  riter *pPage = &
1dba0 70 57 72 69 74 65 72 2d 3e 77 72 69 74 65 72 3b  pWriter->writer;
1dbb0 0a 20 20 46 74 73 35 42 75 66 66 65 72 20 2a 70  .  Fts5Buffer *p
1dbc0 50 67 69 64 78 20 3d 20 26 70 57 72 69 74 65 72  Pgidx = &pWriter
1dbd0 2d 3e 77 72 69 74 65 72 2e 70 67 69 64 78 3b 0a  ->writer.pgidx;.
1dbe0 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72 63  .  assert( p->rc
1dbf0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20  ==SQLITE_OK );. 
1dc00 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
1dc10 62 75 66 2e 6e 3e 3d 34 20 29 3b 0a 20 20 61 73  buf.n>=4 );.  as
1dc20 73 65 72 74 28 20 70 50 61 67 65 2d 3e 62 75 66  sert( pPage->buf
1dc30 2e 6e 3e 34 20 7c 7c 20 70 57 72 69 74 65 72 2d  .n>4 || pWriter-
1dc40 3e 62 46 69 72 73 74 54 65 72 6d 49 6e 50 61 67  >bFirstTermInPag
1dc50 65 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  e );..  /* If th
1dc60 65 20 63 75 72 72 65 6e 74 20 6c 65 61 66 20 70  e current leaf p
1dc70 61 67 65 20 69 73 20 66 75 6c 6c 2c 20 66 6c 75  age is full, flu
1dc80 73 68 20 69 74 20 74 6f 20 64 69 73 6b 2e 20 2a  sh it to disk. *
1dc90 2f 0a 20 20 69 66 28 20 28 70 50 61 67 65 2d 3e  /.  if( (pPage->
1dca0 62 75 66 2e 6e 20 2b 20 70 50 67 69 64 78 2d 3e  buf.n + pPgidx->
1dcb0 6e 20 2b 20 6e 54 65 72 6d 20 2b 20 32 29 3e 3d  n + nTerm + 2)>=
1dcc0 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e 70 67 73 7a  p->pConfig->pgsz
1dcd0 20 29 7b 0a 20 20 20 20 69 66 28 20 70 50 61 67   ){.    if( pPag
1dce0 65 2d 3e 62 75 66 2e 6e 3e 34 20 29 7b 0a 20 20  e->buf.n>4 ){.  
1dcf0 20 20 20 20 66 74 73 35 57 72 69 74 65 46 6c 75      fts5WriteFlu
1dd00 73 68 4c 65 61 66 28 70 2c 20 70 57 72 69 74 65  shLeaf(p, pWrite
1dd10 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 74  r);.    }.    ft
1dd20 73 35 42 75 66 66 65 72 47 72 6f 77 28 26 70 2d  s5BufferGrow(&p-
1dd30 3e 72 63 2c 20 26 70 50 61 67 65 2d 3e 62 75 66  >rc, &pPage->buf
1dd40 2c 20 6e 54 65 72 6d 2b 46 54 53 35 5f 44 41 54  , nTerm+FTS5_DAT
1dd50 41 5f 50 41 44 44 49 4e 47 29 3b 0a 20 20 7d 0a  A_PADDING);.  }.
1dd60 20 20 0a 20 20 2f 2a 20 54 4f 44 4f 31 3a 20 55    .  /* TODO1: U
1dd70 70 64 61 74 69 6e 67 20 70 67 69 64 78 20 68 65  pdating pgidx he
1dd80 72 65 2e 20 2a 2f 0a 20 20 70 50 67 69 64 78 2d  re. */.  pPgidx-
1dd90 3e 6e 20 2b 3d 20 73 71 6c 69 74 65 33 46 74 73  >n += sqlite3Fts
1dda0 35 50 75 74 56 61 72 69 6e 74 28 0a 20 20 20 20  5PutVarint(.    
1ddb0 20 20 26 70 50 67 69 64 78 2d 3e 70 5b 70 50 67    &pPgidx->p[pPg
1ddc0 69 64 78 2d 3e 6e 5d 2c 20 70 50 61 67 65 2d 3e  idx->n], pPage->
1ddd0 62 75 66 2e 6e 20 2d 20 70 50 61 67 65 2d 3e 69  buf.n - pPage->i
1dde0 50 72 65 76 50 67 69 64 78 0a 20 20 29 3b 0a 20  PrevPgidx.  );. 
1ddf0 20 70 50 61 67 65 2d 3e 69 50 72 65 76 50 67 69   pPage->iPrevPgi
1de00 64 78 20 3d 20 70 50 61 67 65 2d 3e 62 75 66 2e  dx = pPage->buf.
1de10 6e 3b 0a 23 69 66 20 30 0a 20 20 66 74 73 35 50  n;.#if 0.  fts5P
1de20 75 74 55 31 36 28 26 70 50 67 69 64 78 2d 3e 70  utU16(&pPgidx->p
1de30 5b 70 50 67 69 64 78 2d 3e 6e 5d 2c 20 70 50 61  [pPgidx->n], pPa
1de40 67 65 2d 3e 62 75 66 2e 6e 29 3b 0a 20 20 70 50  ge->buf.n);.  pP
1de50 67 69 64 78 2d 3e 6e 20 2b 3d 20 32 3b 0a 23 65  gidx->n += 2;.#e
1de60 6e 64 69 66 0a 0a 20 20 69 66 28 20 70 57 72 69  ndif..  if( pWri
1de70 74 65 72 2d 3e 62 46 69 72 73 74 54 65 72 6d 49  ter->bFirstTermI
1de80 6e 50 61 67 65 20 29 7b 0a 20 20 20 20 6e 50 72  nPage ){.    nPr
1de90 65 66 69 78 20 3d 20 30 3b 0a 20 20 20 20 69 66  efix = 0;.    if
1dea0 28 20 70 50 61 67 65 2d 3e 70 67 6e 6f 21 3d 31  ( pPage->pgno!=1
1deb0 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 69   ){.      /* Thi
1dec0 73 20 69 73 20 74 68 65 20 66 69 72 73 74 20 74  s is the first t
1ded0 65 72 6d 20 6f 6e 20 61 20 6c 65 61 66 20 74 68  erm on a leaf th
1dee0 61 74 20 69 73 20 6e 6f 74 20 74 68 65 20 6c 65  at is not the le
1def0 66 74 6d 6f 73 74 20 6c 65 61 66 20 69 6e 0a 20  ftmost leaf in. 
1df00 20 20 20 20 20 2a 2a 20 74 68 65 20 73 65 67 6d       ** the segm
1df10 65 6e 74 20 62 2d 74 72 65 65 2e 20 49 6e 20 74  ent b-tree. In t
1df20 68 69 73 20 63 61 73 65 20 69 74 20 69 73 20 6e  his case it is n
1df30 65 63 65 73 73 61 72 79 20 74 6f 20 61 64 64 20  ecessary to add 
1df40 61 20 74 65 72 6d 20 74 6f 0a 20 20 20 20 20 20  a term to.      
1df50 2a 2a 20 74 68 65 20 62 2d 74 72 65 65 20 68 69  ** the b-tree hi
1df60 65 72 61 72 63 68 79 20 74 68 61 74 20 69 73 20  erarchy that is 
1df70 28 61 29 20 6c 61 72 67 65 72 20 74 68 61 6e 20  (a) larger than 
1df80 74 68 65 20 6c 61 72 67 65 73 74 20 74 65 72 6d  the largest term
1df90 20 0a 20 20 20 20 20 20 2a 2a 20 61 6c 72 65 61   .      ** alrea
1dfa0 64 79 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68  dy written to th
1dfb0 65 20 73 65 67 6d 65 6e 74 20 61 6e 64 20 28 62  e segment and (b
1dfc0 29 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 6f  ) smaller than o
1dfd0 72 20 65 71 75 61 6c 20 74 6f 0a 20 20 20 20 20  r equal to.     
1dfe0 20 2a 2a 20 74 68 69 73 20 74 65 72 6d 2e 20 49   ** this term. I
1dff0 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 61  n other words, a
1e000 20 70 72 65 66 69 78 20 6f 66 20 28 70 54 65 72   prefix of (pTer
1e010 6d 2f 6e 54 65 72 6d 29 20 74 68 61 74 20 69 73  m/nTerm) that is
1e020 20 6f 6e 65 0a 20 20 20 20 20 20 2a 2a 20 62 79   one.      ** by
1e030 74 65 20 6c 6f 6e 67 65 72 20 74 68 61 6e 20 74  te longer than t
1e040 68 65 20 6c 6f 6e 67 65 73 74 20 70 72 65 66 69  he longest prefi
1e050 78 20 28 70 54 65 72 6d 2f 6e 54 65 72 6d 29 20  x (pTerm/nTerm) 
1e060 73 68 61 72 65 73 20 77 69 74 68 20 74 68 65 0a  shares with the.
1e070 20 20 20 20 20 20 2a 2a 20 70 72 65 76 69 6f 75        ** previou
1e080 73 20 74 65 72 6d 2e 20 0a 20 20 20 20 20 20 2a  s term. .      *
1e090 2a 0a 20 20 20 20 20 20 2a 2a 20 55 73 75 61 6c  *.      ** Usual
1e0a0 6c 79 2c 20 74 68 65 20 70 72 65 76 69 6f 75 73  ly, the previous
1e0b0 20 74 65 72 6d 20 69 73 20 61 76 61 69 6c 61 62   term is availab
1e0c0 6c 65 20 69 6e 20 70 50 61 67 65 2d 3e 74 65 72  le in pPage->ter
1e0d0 6d 2e 20 54 68 65 20 65 78 63 65 70 74 69 6f 6e  m. The exception
1e0e0 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 69 66 20  .      ** is if 
1e0f0 74 68 69 73 20 69 73 20 74 68 65 20 66 69 72 73  this is the firs
1e100 74 20 74 65 72 6d 20 77 72 69 74 74 65 6e 20 69  t term written i
1e110 6e 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c  n an incremental
1e120 2d 6d 65 72 67 65 20 73 74 65 70 2e 0a 20 20 20  -merge step..   
1e130 20 20 20 2a 2a 20 49 6e 20 74 68 69 73 20 63 61     ** In this ca
1e140 73 65 20 74 68 65 20 70 72 65 76 69 6f 75 73 20  se the previous 
1e150 74 65 72 6d 20 69 73 20 6e 6f 74 20 61 76 61 69  term is not avai
1e160 6c 61 62 6c 65 2c 20 73 6f 20 6a 75 73 74 20 77  lable, so just w
1e170 72 69 74 65 20 61 0a 20 20 20 20 20 20 2a 2a 20  rite a.      ** 
1e180 63 6f 70 79 20 6f 66 20 28 70 54 65 72 6d 2f 6e  copy of (pTerm/n
1e190 54 65 72 6d 29 20 69 6e 74 6f 20 74 68 65 20 70  Term) into the p
1e1a0 61 72 65 6e 74 20 6e 6f 64 65 2e 20 54 68 69 73  arent node. This
1e1b0 20 69 73 20 73 6c 69 67 68 74 6c 79 0a 20 20 20   is slightly.   
1e1c0 20 20 20 2a 2a 20 69 6e 65 66 66 69 63 69 65 6e     ** inefficien
1e1d0 74 2c 20 62 75 74 20 73 74 69 6c 6c 20 63 6f 72  t, but still cor
1e1e0 72 65 63 74 2e 20 20 2a 2f 0a 20 20 20 20 20 20  rect.  */.      
1e1f0 69 6e 74 20 6e 20 3d 20 6e 54 65 72 6d 3b 0a 20  int n = nTerm;. 
1e200 20 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e       if( pPage->
1e210 74 65 72 6d 2e 6e 20 29 7b 0a 20 20 20 20 20 20  term.n ){.      
1e220 20 20 6e 20 3d 20 31 20 2b 20 66 74 73 35 50 72    n = 1 + fts5Pr
1e230 65 66 69 78 43 6f 6d 70 72 65 73 73 28 70 50 61  efixCompress(pPa
1e240 67 65 2d 3e 74 65 72 6d 2e 6e 2c 20 70 50 61 67  ge->term.n, pPag
1e250 65 2d 3e 74 65 72 6d 2e 70 2c 20 70 54 65 72 6d  e->term.p, pTerm
1e260 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
1e270 20 66 74 73 35 57 72 69 74 65 42 74 72 65 65 54   fts5WriteBtreeT
1e280 65 72 6d 28 70 2c 20 70 57 72 69 74 65 72 2c 20  erm(p, pWriter, 
1e290 6e 2c 20 70 54 65 72 6d 29 3b 0a 20 20 20 20 20  n, pTerm);.     
1e2a0 20 70 50 61 67 65 20 3d 20 26 70 57 72 69 74 65   pPage = &pWrite
1e2b0 72 2d 3e 77 72 69 74 65 72 3b 0a 20 20 20 20 7d  r->writer;.    }
1e2c0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 50  .  }else{.    nP
1e2d0 72 65 66 69 78 20 3d 20 66 74 73 35 50 72 65 66  refix = fts5Pref
1e2e0 69 78 43 6f 6d 70 72 65 73 73 28 70 50 61 67 65  ixCompress(pPage
1e2f0 2d 3e 74 65 72 6d 2e 6e 2c 20 70 50 61 67 65 2d  ->term.n, pPage-
1e300 3e 74 65 72 6d 2e 70 2c 20 70 54 65 72 6d 29 3b  >term.p, pTerm);
1e310 0a 20 20 20 20 66 74 73 35 42 75 66 66 65 72 41  .    fts5BufferA
1e320 70 70 65 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e  ppendVarint(&p->
1e330 72 63 2c 20 26 70 50 61 67 65 2d 3e 62 75 66 2c  rc, &pPage->buf,
1e340 20 6e 50 72 65 66 69 78 29 3b 0a 20 20 7d 0a 0a   nPrefix);.  }..
1e350 20 20 2f 2a 20 41 70 70 65 6e 64 20 74 68 65 20    /* Append the 
1e360 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  number of bytes 
1e370 6f 66 20 6e 65 77 20 64 61 74 61 2c 20 74 68 65  of new data, the
1e380 6e 20 74 68 65 20 74 65 72 6d 20 64 61 74 61 20  n the term data 
1e390 69 74 73 65 6c 66 0a 20 20 2a 2a 20 74 6f 20 74  itself.  ** to t
1e3a0 68 65 20 70 61 67 65 2e 20 2a 2f 0a 20 20 66 74  he page. */.  ft
1e3b0 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 56 61  s5BufferAppendVa
1e3c0 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26 70 50  rint(&p->rc, &pP
1e3d0 61 67 65 2d 3e 62 75 66 2c 20 6e 54 65 72 6d 20  age->buf, nTerm 
1e3e0 2d 20 6e 50 72 65 66 69 78 29 3b 0a 20 20 66 74  - nPrefix);.  ft
1e3f0 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 42 6c  s5BufferAppendBl
1e400 6f 62 28 26 70 2d 3e 72 63 2c 20 26 70 50 61 67  ob(&p->rc, &pPag
1e410 65 2d 3e 62 75 66 2c 20 6e 54 65 72 6d 20 2d 20  e->buf, nTerm - 
1e420 6e 50 72 65 66 69 78 2c 20 26 70 54 65 72 6d 5b  nPrefix, &pTerm[
1e430 6e 50 72 65 66 69 78 5d 29 3b 0a 0a 20 20 2f 2a  nPrefix]);..  /*
1e440 20 55 70 64 61 74 65 20 74 68 65 20 46 74 73 35   Update the Fts5
1e450 50 61 67 65 57 72 69 74 65 72 2e 74 65 72 6d 20  PageWriter.term 
1e460 66 69 65 6c 64 2e 20 2a 2f 0a 20 20 66 74 73 35  field. */.  fts5
1e470 42 75 66 66 65 72 53 65 74 28 26 70 2d 3e 72 63  BufferSet(&p->rc
1e480 2c 20 26 70 50 61 67 65 2d 3e 74 65 72 6d 2c 20  , &pPage->term, 
1e490 6e 54 65 72 6d 2c 20 70 54 65 72 6d 29 3b 0a 20  nTerm, pTerm);. 
1e4a0 20 70 57 72 69 74 65 72 2d 3e 62 46 69 72 73 74   pWriter->bFirst
1e4b0 54 65 72 6d 49 6e 50 61 67 65 20 3d 20 30 3b 0a  TermInPage = 0;.
1e4c0 0a 20 20 70 57 72 69 74 65 72 2d 3e 62 46 69 72  .  pWriter->bFir
1e4d0 73 74 52 6f 77 69 64 49 6e 50 61 67 65 20 3d 20  stRowidInPage = 
1e4e0 30 3b 0a 20 20 70 57 72 69 74 65 72 2d 3e 62 46  0;.  pWriter->bF
1e4f0 69 72 73 74 52 6f 77 69 64 49 6e 44 6f 63 6c 69  irstRowidInDocli
1e500 73 74 20 3d 20 31 3b 0a 0a 20 20 61 73 73 65 72  st = 1;..  asser
1e510 74 28 20 70 2d 3e 72 63 20 7c 7c 20 28 70 57 72  t( p->rc || (pWr
1e520 69 74 65 72 2d 3e 6e 44 6c 69 64 78 3e 30 20 26  iter->nDlidx>0 &
1e530 26 20 70 57 72 69 74 65 72 2d 3e 61 44 6c 69 64  & pWriter->aDlid
1e540 78 5b 30 5d 2e 62 75 66 2e 6e 3d 3d 30 29 20 29  x[0].buf.n==0) )
1e550 3b 0a 20 20 70 57 72 69 74 65 72 2d 3e 61 44 6c  ;.  pWriter->aDl
1e560 69 64 78 5b 30 5d 2e 70 67 6e 6f 20 3d 20 70 50  idx[0].pgno = pP
1e570 61 67 65 2d 3e 70 67 6e 6f 3b 0a 7d 0a 0a 2f 2a  age->pgno;.}../*
1e580 0a 2a 2a 20 41 70 70 65 6e 64 20 61 20 72 6f 77  .** Append a row
1e590 69 64 20 61 6e 64 20 70 6f 73 69 74 69 6f 6e 2d  id and position-
1e5a0 6c 69 73 74 20 73 69 7a 65 20 66 69 65 6c 64 20  list size field 
1e5b0 74 6f 20 74 68 65 20 77 72 69 74 65 72 73 20 6f  to the writers o
1e5c0 75 74 70 75 74 2e 20 0a 2a 2f 0a 73 74 61 74 69  utput. .*/.stati
1e5d0 63 20 76 6f 69 64 20 66 74 73 35 57 72 69 74 65  c void fts5Write
1e5e0 41 70 70 65 6e 64 52 6f 77 69 64 28 0a 20 20 46  AppendRowid(.  F
1e5f0 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 0a 20 20  ts5Index *p, .  
1e600 46 74 73 35 53 65 67 57 72 69 74 65 72 20 2a 70  Fts5SegWriter *p
1e610 57 72 69 74 65 72 2c 0a 20 20 69 36 34 20 69 52  Writer,.  i64 iR
1e620 6f 77 69 64 0a 29 7b 0a 20 20 69 66 28 20 70 2d  owid.){.  if( p-
1e630 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  >rc==SQLITE_OK )
1e640 7b 0a 20 20 20 20 46 74 73 35 50 61 67 65 57 72  {.    Fts5PageWr
1e650 69 74 65 72 20 2a 70 50 61 67 65 20 3d 20 26 70  iter *pPage = &p
1e660 57 72 69 74 65 72 2d 3e 77 72 69 74 65 72 3b 0a  Writer->writer;.
1e670 0a 20 20 20 20 69 66 28 20 28 70 50 61 67 65 2d  .    if( (pPage-
1e680 3e 62 75 66 2e 6e 20 2b 20 70 50 61 67 65 2d 3e  >buf.n + pPage->
1e690 70 67 69 64 78 2e 6e 29 3e 3d 70 2d 3e 70 43 6f  pgidx.n)>=p->pCo
1e6a0 6e 66 69 67 2d 3e 70 67 73 7a 20 29 7b 0a 20 20  nfig->pgsz ){.  
1e6b0 20 20 20 20 66 74 73 35 57 72 69 74 65 46 6c 75      fts5WriteFlu
1e6c0 73 68 4c 65 61 66 28 70 2c 20 70 57 72 69 74 65  shLeaf(p, pWrite
1e6d0 72 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  r);.    }..    /
1e6e0 2a 20 49 66 20 74 68 69 73 20 69 73 20 74 6f 20  * If this is to 
1e6f0 62 65 20 74 68 65 20 66 69 72 73 74 20 72 6f 77  be the first row
1e700 69 64 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68  id written to th
1e710 65 20 70 61 67 65 2c 20 73 65 74 20 74 68 65 20  e page, set the 
1e720 0a 20 20 20 20 2a 2a 20 72 6f 77 69 64 2d 70 6f  .    ** rowid-po
1e730 69 6e 74 65 72 20 69 6e 20 74 68 65 20 70 61 67  inter in the pag
1e740 65 2d 68 65 61 64 65 72 2e 20 41 6c 73 6f 20 61  e-header. Also a
1e750 70 70 65 6e 64 20 61 20 76 61 6c 75 65 20 74 6f  ppend a value to
1e760 20 74 68 65 20 64 6c 69 64 78 0a 20 20 20 20 2a   the dlidx.    *
1e770 2a 20 62 75 66 66 65 72 2c 20 69 6e 20 63 61 73  * buffer, in cas
1e780 65 20 61 20 64 6f 63 6c 69 73 74 2d 69 6e 64 65  e a doclist-inde
1e790 78 20 69 73 20 72 65 71 75 69 72 65 64 2e 20 20  x is required.  
1e7a0 2a 2f 0a 20 20 20 20 69 66 28 20 70 57 72 69 74  */.    if( pWrit
1e7b0 65 72 2d 3e 62 46 69 72 73 74 52 6f 77 69 64 49  er->bFirstRowidI
1e7c0 6e 50 61 67 65 20 29 7b 0a 20 20 20 20 20 20 66  nPage ){.      f
1e7d0 74 73 35 50 75 74 55 31 36 28 70 50 61 67 65 2d  ts5PutU16(pPage-
1e7e0 3e 62 75 66 2e 70 2c 20 28 75 31 36 29 70 50 61  >buf.p, (u16)pPa
1e7f0 67 65 2d 3e 62 75 66 2e 6e 29 3b 0a 20 20 20 20  ge->buf.n);.    
1e800 20 20 66 74 73 35 57 72 69 74 65 44 6c 69 64 78    fts5WriteDlidx
1e810 41 70 70 65 6e 64 28 70 2c 20 70 57 72 69 74 65  Append(p, pWrite
1e820 72 2c 20 69 52 6f 77 69 64 29 3b 0a 20 20 20 20  r, iRowid);.    
1e830 7d 0a 0a 20 20 20 20 2f 2a 20 57 72 69 74 65 20  }..    /* Write 
1e840 74 68 65 20 72 6f 77 69 64 2e 20 2a 2f 0a 20 20  the rowid. */.  
1e850 20 20 69 66 28 20 70 57 72 69 74 65 72 2d 3e 62    if( pWriter->b
1e860 46 69 72 73 74 52 6f 77 69 64 49 6e 44 6f 63 6c  FirstRowidInDocl
1e870 69 73 74 20 7c 7c 20 70 57 72 69 74 65 72 2d 3e  ist || pWriter->
1e880 62 46 69 72 73 74 52 6f 77 69 64 49 6e 50 61 67  bFirstRowidInPag
1e890 65 20 29 7b 0a 20 20 20 20 20 20 66 74 73 35 42  e ){.      fts5B
1e8a0 75 66 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e  ufferAppendVarin
1e8b0 74 28 26 70 2d 3e 72 63 2c 20 26 70 50 61 67 65  t(&p->rc, &pPage
1e8c0 2d 3e 62 75 66 2c 20 69 52 6f 77 69 64 29 3b 0a  ->buf, iRowid);.
1e8d0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1e8e0 20 61 73 73 65 72 74 28 20 70 2d 3e 72 63 20 7c   assert( p->rc |
1e8f0 7c 20 69 52 6f 77 69 64 3e 70 57 72 69 74 65 72  | iRowid>pWriter
1e900 2d 3e 69 50 72 65 76 52 6f 77 69 64 20 29 3b 0a  ->iPrevRowid );.
1e910 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72        fts5Buffer
1e920 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26 70 2d  AppendVarint(&p-
1e930 3e 72 63 2c 20 26 70 50 61 67 65 2d 3e 62 75 66  >rc, &pPage->buf
1e940 2c 20 69 52 6f 77 69 64 20 2d 20 70 57 72 69 74  , iRowid - pWrit
1e950 65 72 2d 3e 69 50 72 65 76 52 6f 77 69 64 29 3b  er->iPrevRowid);
1e960 0a 20 20 20 20 7d 0a 20 20 20 20 70 57 72 69 74  .    }.    pWrit
1e970 65 72 2d 3e 69 50 72 65 76 52 6f 77 69 64 20 3d  er->iPrevRowid =
1e980 20 69 52 6f 77 69 64 3b 0a 20 20 20 20 70 57 72   iRowid;.    pWr
1e990 69 74 65 72 2d 3e 62 46 69 72 73 74 52 6f 77 69  iter->bFirstRowi
1e9a0 64 49 6e 44 6f 63 6c 69 73 74 20 3d 20 30 3b 0a  dInDoclist = 0;.
1e9b0 20 20 20 20 70 57 72 69 74 65 72 2d 3e 62 46 69      pWriter->bFi
1e9c0 72 73 74 52 6f 77 69 64 49 6e 50 61 67 65 20 3d  rstRowidInPage =
1e9d0 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69   0;.  }.}..stati
1e9e0 63 20 76 6f 69 64 20 66 74 73 35 57 72 69 74 65  c void fts5Write
1e9f0 41 70 70 65 6e 64 50 6f 73 6c 69 73 74 44 61 74  AppendPoslistDat
1ea00 61 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a  a(.  Fts5Index *
1ea10 70 2c 20 0a 20 20 46 74 73 35 53 65 67 57 72 69  p, .  Fts5SegWri
1ea20 74 65 72 20 2a 70 57 72 69 74 65 72 2c 20 0a 20  ter *pWriter, . 
1ea30 20 63 6f 6e 73 74 20 75 38 20 2a 61 44 61 74 61   const u8 *aData
1ea40 2c 20 0a 20 20 69 6e 74 20 6e 44 61 74 61 0a 29  , .  int nData.)
1ea50 7b 0a 20 20 46 74 73 35 50 61 67 65 57 72 69 74  {.  Fts5PageWrit
1ea60 65 72 20 2a 70 50 61 67 65 20 3d 20 26 70 57 72  er *pPage = &pWr
1ea70 69 74 65 72 2d 3e 77 72 69 74 65 72 3b 0a 20 20  iter->writer;.  
1ea80 63 6f 6e 73 74 20 75 38 20 2a 61 20 3d 20 61 44  const u8 *a = aD
1ea90 61 74 61 3b 0a 20 20 69 6e 74 20 6e 20 3d 20 6e  ata;.  int n = n
1eaa0 44 61 74 61 3b 0a 20 20 0a 20 20 61 73 73 65 72  Data;.  .  asser
1eab0 74 28 20 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e 70  t( p->pConfig->p
1eac0 67 73 7a 3e 30 20 29 3b 0a 20 20 77 68 69 6c 65  gsz>0 );.  while
1ead0 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
1eae0 4f 4b 20 0a 20 20 20 20 20 26 26 20 28 70 50 61  OK .     && (pPa
1eaf0 67 65 2d 3e 62 75 66 2e 6e 20 2b 20 70 50 61 67  ge->buf.n + pPag
1eb00 65 2d 3e 70 67 69 64 78 2e 6e 20 2b 20 6e 29 3e  e->pgidx.n + n)>
1eb10 3d 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e 70 67 73  =p->pConfig->pgs
1eb20 7a 20 0a 20 20 29 7b 0a 20 20 20 20 69 6e 74 20  z .  ){.    int 
1eb30 6e 52 65 71 20 3d 20 70 2d 3e 70 43 6f 6e 66 69  nReq = p->pConfi
1eb40 67 2d 3e 70 67 73 7a 20 2d 20 70 50 61 67 65 2d  g->pgsz - pPage-
1eb50 3e 62 75 66 2e 6e 20 2d 20 70 50 61 67 65 2d 3e  >buf.n - pPage->
1eb60 70 67 69 64 78 2e 6e 3b 0a 20 20 20 20 69 6e 74  pgidx.n;.    int
1eb70 20 6e 43 6f 70 79 20 3d 20 30 3b 0a 20 20 20 20   nCopy = 0;.    
1eb80 77 68 69 6c 65 28 20 6e 43 6f 70 79 3c 6e 52 65  while( nCopy<nRe
1eb90 71 20 29 7b 0a 20 20 20 20 20 20 69 36 34 20 64  q ){.      i64 d
1eba0 75 6d 6d 79 3b 0a 20 20 20 20 20 20 6e 43 6f 70  ummy;.      nCop
1ebb0 79 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69  y += fts5GetVari
1ebc0 6e 74 28 26 61 5b 6e 43 6f 70 79 5d 2c 20 28 75  nt(&a[nCopy], (u
1ebd0 36 34 2a 29 26 64 75 6d 6d 79 29 3b 0a 20 20 20  64*)&dummy);.   
1ebe0 20 7d 0a 20 20 20 20 66 74 73 35 42 75 66 66 65   }.    fts5Buffe
1ebf0 72 41 70 70 65 6e 64 42 6c 6f 62 28 26 70 2d 3e  rAppendBlob(&p->
1ec00 72 63 2c 20 26 70 50 61 67 65 2d 3e 62 75 66 2c  rc, &pPage->buf,
1ec10 20 6e 43 6f 70 79 2c 20 61 29 3b 0a 20 20 20 20   nCopy, a);.    
1ec20 61 20 2b 3d 20 6e 43 6f 70 79 3b 0a 20 20 20 20  a += nCopy;.    
1ec30 6e 20 2d 3d 20 6e 43 6f 70 79 3b 0a 20 20 20 20  n -= nCopy;.    
1ec40 66 74 73 35 57 72 69 74 65 46 6c 75 73 68 4c 65  fts5WriteFlushLe
1ec50 61 66 28 70 2c 20 70 57 72 69 74 65 72 29 3b 0a  af(p, pWriter);.
1ec60 20 20 7d 0a 20 20 69 66 28 20 6e 3e 30 20 29 7b    }.  if( n>0 ){
1ec70 0a 20 20 20 20 66 74 73 35 42 75 66 66 65 72 41  .    fts5BufferA
1ec80 70 70 65 6e 64 42 6c 6f 62 28 26 70 2d 3e 72 63  ppendBlob(&p->rc
1ec90 2c 20 26 70 50 61 67 65 2d 3e 62 75 66 2c 20 6e  , &pPage->buf, n
1eca0 2c 20 61 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  , a);.  }.}../*.
1ecb0 2a 2a 20 46 6c 75 73 68 20 61 6e 79 20 64 61 74  ** Flush any dat
1ecc0 61 20 63 61 63 68 65 64 20 62 79 20 74 68 65 20  a cached by the 
1ecd0 77 72 69 74 65 72 20 6f 62 6a 65 63 74 20 74 6f  writer object to
1ece0 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 46   the database. F
1ecf0 72 65 65 20 61 6e 79 0a 2a 2a 20 61 6c 6c 6f 63  ree any.** alloc
1ed00 61 74 69 6f 6e 73 20 61 73 73 6f 63 69 61 74 65  ations associate
1ed10 64 20 77 69 74 68 20 74 68 65 20 77 72 69 74 65  d with the write
1ed20 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  r..*/.static voi
1ed30 64 20 66 74 73 35 57 72 69 74 65 46 69 6e 69 73  d fts5WriteFinis
1ed40 68 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a  h(.  Fts5Index *
1ed50 70 2c 20 0a 20 20 46 74 73 35 53 65 67 57 72 69  p, .  Fts5SegWri
1ed60 74 65 72 20 2a 70 57 72 69 74 65 72 2c 20 20 20  ter *pWriter,   
1ed70 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 72 20        /* Writer 
1ed80 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20  object */.  int 
1ed90 2a 70 6e 4c 65 61 66 20 20 20 20 20 20 20 20 20  *pnLeaf         
1eda0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
1edb0 55 54 3a 20 4e 75 6d 62 65 72 20 6f 66 20 6c 65  UT: Number of le
1edc0 61 66 20 70 61 67 65 73 20 69 6e 20 62 2d 74 72  af pages in b-tr
1edd0 65 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69  ee */.){.  int i
1ede0 3b 0a 20 20 46 74 73 35 50 61 67 65 57 72 69 74  ;.  Fts5PageWrit
1edf0 65 72 20 2a 70 4c 65 61 66 20 3d 20 26 70 57 72  er *pLeaf = &pWr
1ee00 69 74 65 72 2d 3e 77 72 69 74 65 72 3b 0a 20 20  iter->writer;.  
1ee10 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  if( p->rc==SQLIT
1ee20 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73 73 65  E_OK ){.    asse
1ee30 72 74 28 20 70 4c 65 61 66 2d 3e 70 67 6e 6f 3e  rt( pLeaf->pgno>
1ee40 3d 31 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4c  =1 );.    if( pL
1ee50 65 61 66 2d 3e 62 75 66 2e 6e 3e 34 20 29 7b 0a  eaf->buf.n>4 ){.
1ee60 20 20 20 20 20 20 66 74 73 35 57 72 69 74 65 46        fts5WriteF
1ee70 6c 75 73 68 4c 65 61 66 28 70 2c 20 70 57 72 69  lushLeaf(p, pWri
1ee80 74 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ter);.    }.    
1ee90 2a 70 6e 4c 65 61 66 20 3d 20 70 4c 65 61 66 2d  *pnLeaf = pLeaf-
1eea0 3e 70 67 6e 6f 2d 31 3b 0a 20 20 20 20 69 66 28  >pgno-1;.    if(
1eeb0 20 70 4c 65 61 66 2d 3e 70 67 6e 6f 3e 31 20 29   pLeaf->pgno>1 )
1eec0 7b 0a 20 20 20 20 20 20 66 74 73 35 57 72 69 74  {.      fts5Writ
1eed0 65 46 6c 75 73 68 42 74 72 65 65 28 70 2c 20 70  eFlushBtree(p, p
1eee0 57 72 69 74 65 72 29 3b 0a 20 20 20 20 7d 0a 20  Writer);.    }. 
1eef0 20 7d 0a 20 20 66 74 73 35 42 75 66 66 65 72 46   }.  fts5BufferF
1ef00 72 65 65 28 26 70 4c 65 61 66 2d 3e 74 65 72 6d  ree(&pLeaf->term
1ef10 29 3b 0a 20 20 66 74 73 35 42 75 66 66 65 72 46  );.  fts5BufferF
1ef20 72 65 65 28 26 70 4c 65 61 66 2d 3e 62 75 66 29  ree(&pLeaf->buf)
1ef30 3b 0a 20 20 66 74 73 35 42 75 66 66 65 72 46 72  ;.  fts5BufferFr
1ef40 65 65 28 26 70 4c 65 61 66 2d 3e 70 67 69 64 78  ee(&pLeaf->pgidx
1ef50 29 3b 0a 20 20 66 74 73 35 42 75 66 66 65 72 46  );.  fts5BufferF
1ef60 72 65 65 28 26 70 57 72 69 74 65 72 2d 3e 62 74  ree(&pWriter->bt
1ef70 74 65 72 6d 29 3b 0a 0a 20 20 66 6f 72 28 69 3d  term);..  for(i=
1ef80 30 3b 20 69 3c 70 57 72 69 74 65 72 2d 3e 6e 44  0; i<pWriter->nD
1ef90 6c 69 64 78 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  lidx; i++){.    
1efa0 73 71 6c 69 74 65 33 46 74 73 35 42 75 66 66 65  sqlite3Fts5Buffe
1efb0 72 46 72 65 65 28 26 70 57 72 69 74 65 72 2d 3e  rFree(&pWriter->
1efc0 61 44 6c 69 64 78 5b 69 5d 2e 62 75 66 29 3b 0a  aDlidx[i].buf);.
1efd0 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 72    }.  sqlite3_fr
1efe0 65 65 28 70 57 72 69 74 65 72 2d 3e 61 44 6c 69  ee(pWriter->aDli
1eff0 64 78 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76  dx);.}..static v
1f000 6f 69 64 20 66 74 73 35 57 72 69 74 65 49 6e 69  oid fts5WriteIni
1f010 74 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a  t(.  Fts5Index *
1f020 70 2c 20 0a 20 20 46 74 73 35 53 65 67 57 72 69  p, .  Fts5SegWri
1f030 74 65 72 20 2a 70 57 72 69 74 65 72 2c 20 0a 20  ter *pWriter, . 
1f040 20 69 6e 74 20 69 53 65 67 69 64 0a 29 7b 0a 20   int iSegid.){. 
1f050 20 63 6f 6e 73 74 20 69 6e 74 20 6e 42 75 66 66   const int nBuff
1f060 65 72 20 3d 20 70 2d 3e 70 43 6f 6e 66 69 67 2d  er = p->pConfig-
1f070 3e 70 67 73 7a 20 2b 20 46 54 53 35 5f 44 41 54  >pgsz + FTS5_DAT
1f080 41 5f 50 41 44 44 49 4e 47 3b 0a 0a 20 20 6d 65  A_PADDING;..  me
1f090 6d 73 65 74 28 70 57 72 69 74 65 72 2c 20 30 2c  mset(pWriter, 0,
1f0a0 20 73 69 7a 65 6f 66 28 46 74 73 35 53 65 67 57   sizeof(Fts5SegW
1f0b0 72 69 74 65 72 29 29 3b 0a 20 20 70 57 72 69 74  riter));.  pWrit
1f0c0 65 72 2d 3e 69 53 65 67 69 64 20 3d 20 69 53 65  er->iSegid = iSe
1f0d0 67 69 64 3b 0a 0a 20 20 66 74 73 35 57 72 69 74  gid;..  fts5Writ
1f0e0 65 44 6c 69 64 78 47 72 6f 77 28 70 2c 20 70 57  eDlidxGrow(p, pW
1f0f0 72 69 74 65 72 2c 20 31 29 3b 0a 20 20 70 57 72  riter, 1);.  pWr
1f100 69 74 65 72 2d 3e 77 72 69 74 65 72 2e 70 67 6e  iter->writer.pgn
1f110 6f 20 3d 20 31 3b 0a 20 20 70 57 72 69 74 65 72  o = 1;.  pWriter
1f120 2d 3e 62 46 69 72 73 74 54 65 72 6d 49 6e 50 61  ->bFirstTermInPa
1f130 67 65 20 3d 20 31 3b 0a 20 20 70 57 72 69 74 65  ge = 1;.  pWrite
1f140 72 2d 3e 69 42 74 50 61 67 65 20 3d 20 31 3b 0a  r->iBtPage = 1;.
1f150 0a 20 20 61 73 73 65 72 74 28 20 70 57 72 69 74  .  assert( pWrit
1f160 65 72 2d 3e 77 72 69 74 65 72 2e 62 75 66 2e 6e  er->writer.buf.n
1f170 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
1f180 20 70 57 72 69 74 65 72 2d 3e 77 72 69 74 65 72   pWriter->writer
1f190 2e 70 67 69 64 78 2e 6e 3d 3d 30 20 29 3b 0a 0a  .pgidx.n==0 );..
1f1a0 20 20 2f 2a 20 47 72 6f 77 20 74 68 65 20 74 77    /* Grow the tw
1f1b0 6f 20 62 75 66 66 65 72 73 20 74 6f 20 70 67 73  o buffers to pgs
1f1c0 7a 20 2b 20 70 61 64 64 69 6e 67 20 62 79 74 65  z + padding byte
1f1d0 73 20 69 6e 20 73 69 7a 65 2e 20 2a 2f 0a 20 20  s in size. */.  
1f1e0 73 71 6c 69 74 65 33 46 74 73 35 42 75 66 66 65  sqlite3Fts5Buffe
1f1f0 72 53 69 7a 65 28 26 70 2d 3e 72 63 2c 20 26 70  rSize(&p->rc, &p
1f200 57 72 69 74 65 72 2d 3e 77 72 69 74 65 72 2e 70  Writer->writer.p
1f210 67 69 64 78 2c 20 6e 42 75 66 66 65 72 29 3b 0a  gidx, nBuffer);.
1f220 20 20 73 71 6c 69 74 65 33 46 74 73 35 42 75 66    sqlite3Fts5Buf
1f230 66 65 72 53 69 7a 65 28 26 70 2d 3e 72 63 2c 20  ferSize(&p->rc, 
1f240 26 70 57 72 69 74 65 72 2d 3e 77 72 69 74 65 72  &pWriter->writer
1f250 2e 62 75 66 2c 20 6e 42 75 66 66 65 72 29 3b 0a  .buf, nBuffer);.
1f260 0a 20 20 69 66 28 20 70 2d 3e 70 49 64 78 57 72  .  if( p->pIdxWr
1f270 69 74 65 72 3d 3d 30 20 29 7b 0a 20 20 20 20 46  iter==0 ){.    F
1f280 74 73 35 43 6f 6e 66 69 67 20 2a 70 43 6f 6e 66  ts5Config *pConf
1f290 69 67 20 3d 20 70 2d 3e 70 43 6f 6e 66 69 67 3b  ig = p->pConfig;
1f2a0 0a 20 20 20 20 66 74 73 35 49 6e 64 65 78 50 72  .    fts5IndexPr
1f2b0 65 70 61 72 65 53 74 6d 74 28 70 2c 20 26 70 2d  epareStmt(p, &p-
1f2c0 3e 70 49 64 78 57 72 69 74 65 72 2c 20 73 71 6c  >pIdxWriter, sql
1f2d0 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 0a 20 20  ite3_mprintf(.  
1f2e0 20 20 20 20 20 20 20 20 22 49 4e 53 45 52 54 20          "INSERT 
1f2f0 49 4e 54 4f 20 27 25 71 27 2e 27 25 71 5f 69 64  INTO '%q'.'%q_id
1f300 78 27 28 73 65 67 69 64 2c 74 65 72 6d 2c 70 67  x'(segid,term,pg
1f310 6e 6f 29 20 56 41 4c 55 45 53 28 3f 2c 3f 2c 3f  no) VALUES(?,?,?
1f320 29 22 2c 20 0a 20 20 20 20 20 20 20 20 20 20 70  )", .          p
1f330 43 6f 6e 66 69 67 2d 3e 7a 44 62 2c 20 70 43 6f  Config->zDb, pCo
1f340 6e 66 69 67 2d 3e 7a 4e 61 6d 65 0a 20 20 20 20  nfig->zName.    
1f350 29 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70  ));.  }..  if( p
1f360 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
1f370 29 7b 0a 20 20 20 20 2f 2a 20 49 6e 69 74 69 61  ){.    /* Initia
1f380 6c 69 7a 65 20 74 68 65 20 34 2d 62 79 74 65 20  lize the 4-byte 
1f390 6c 65 61 66 2d 70 61 67 65 20 68 65 61 64 65 72  leaf-page header
1f3a0 20 74 6f 20 30 78 30 30 2e 20 2a 2f 0a 20 20 20   to 0x00. */.   
1f3b0 20 6d 65 6d 73 65 74 28 70 57 72 69 74 65 72 2d   memset(pWriter-
1f3c0 3e 77 72 69 74 65 72 2e 62 75 66 2e 70 2c 20 30  >writer.buf.p, 0
1f3d0 2c 20 34 29 3b 0a 20 20 20 20 70 57 72 69 74 65  , 4);.    pWrite
1f3e0 72 2d 3e 77 72 69 74 65 72 2e 62 75 66 2e 6e 20  r->writer.buf.n 
1f3f0 3d 20 34 3b 0a 0a 20 20 20 20 2f 2a 20 42 69 6e  = 4;..    /* Bin
1f400 64 20 74 68 65 20 63 75 72 72 65 6e 74 20 6f 75  d the current ou
1f410 74 70 75 74 20 73 65 67 6d 65 6e 74 20 69 64 20  tput segment id 
1f420 74 6f 20 74 68 65 20 69 6e 64 65 78 2d 77 72 69  to the index-wri
1f430 74 65 72 2e 20 54 68 69 73 20 69 73 20 61 6e 0a  ter. This is an.
1f440 20 20 20 20 2a 2a 20 6f 70 74 69 6d 69 7a 61 74      ** optimizat
1f450 69 6f 6e 20 6f 76 65 72 20 62 69 6e 64 69 6e 67  ion over binding
1f460 20 74 68 65 20 73 61 6d 65 20 76 61 6c 75 65 20   the same value 
1f470 6f 76 65 72 20 61 6e 64 20 6f 76 65 72 20 61 73  over and over as
1f480 20 72 6f 77 73 20 61 72 65 0a 20 20 20 20 2a 2a   rows are.    **
1f490 20 69 6e 73 65 72 74 65 64 20 69 6e 74 6f 20 25   inserted into %
1f4a0 5f 69 64 78 20 62 79 20 74 68 65 20 63 75 72 72  _idx by the curr
1f4b0 65 6e 74 20 77 72 69 74 65 72 2e 20 20 2a 2f 0a  ent writer.  */.
1f4c0 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64      sqlite3_bind
1f4d0 5f 69 6e 74 28 70 2d 3e 70 49 64 78 57 72 69 74  _int(p->pIdxWrit
1f4e0 65 72 2c 20 31 2c 20 70 57 72 69 74 65 72 2d 3e  er, 1, pWriter->
1f4f0 69 53 65 67 69 64 29 3b 0a 20 20 7d 0a 7d 0a 0a  iSegid);.  }.}..
1f500 2f 2a 0a 2a 2a 20 49 74 65 72 61 74 6f 72 20 70  /*.** Iterator p
1f510 49 74 65 72 20 77 61 73 20 75 73 65 64 20 74 6f  Iter was used to
1f520 20 69 74 65 72 61 74 65 20 74 68 72 6f 75 67 68   iterate through
1f530 20 74 68 65 20 69 6e 70 75 74 20 73 65 67 6d 65   the input segme
1f540 6e 74 73 20 6f 66 20 6f 6e 20 61 6e 0a 2a 2a 20  nts of on an.** 
1f550 69 6e 63 72 65 6d 65 6e 74 61 6c 20 6d 65 72 67  incremental merg
1f560 65 20 6f 70 65 72 61 74 69 6f 6e 2e 20 54 68 69  e operation. Thi
1f570 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
1f580 6c 6c 65 64 20 69 66 20 74 68 65 20 69 6e 63 72  lled if the incr
1f590 65 6d 65 6e 74 61 6c 0a 2a 2a 20 6d 65 72 67 65  emental.** merge
1f5a0 20 73 74 65 70 20 68 61 73 20 66 69 6e 69 73 68   step has finish
1f5b0 65 64 20 62 75 74 20 74 68 65 20 69 6e 70 75 74  ed but the input
1f5c0 20 68 61 73 20 6e 6f 74 20 62 65 65 6e 20 63 6f   has not been co
1f5d0 6d 70 6c 65 74 65 6c 79 20 65 78 68 61 75 73 74  mpletely exhaust
1f5e0 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ed..*/.static vo
1f5f0 69 64 20 66 74 73 35 54 72 69 6d 53 65 67 6d 65  id fts5TrimSegme
1f600 6e 74 73 28 46 74 73 35 49 6e 64 65 78 20 2a 70  nts(Fts5Index *p
1f610 2c 20 46 74 73 35 49 74 65 72 20 2a 70 49 74 65  , Fts5Iter *pIte
1f620 72 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 46  r){.  int i;.  F
1f630 74 73 35 42 75 66 66 65 72 20 62 75 66 3b 0a 20  ts5Buffer buf;. 
1f640 20 6d 65 6d 73 65 74 28 26 62 75 66 2c 20 30 2c   memset(&buf, 0,
1f650 20 73 69 7a 65 6f 66 28 46 74 73 35 42 75 66 66   sizeof(Fts5Buff
1f660 65 72 29 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  er));.  for(i=0;
1f670 20 69 3c 70 49 74 65 72 2d 3e 6e 53 65 67 3b 20   i<pIter->nSeg; 
1f680 69 2b 2b 29 7b 0a 20 20 20 20 46 74 73 35 53 65  i++){.    Fts5Se
1f690 67 49 74 65 72 20 2a 70 53 65 67 20 3d 20 26 70  gIter *pSeg = &p
1f6a0 49 74 65 72 2d 3e 61 53 65 67 5b 69 5d 3b 0a 20  Iter->aSeg[i];. 
1f6b0 20 20 20 69 66 28 20 70 53 65 67 2d 3e 70 53 65     if( pSeg->pSe
1f6c0 67 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a  g==0 ){.      /*
1f6d0 20 6e 6f 2d 6f 70 20 2a 2f 0a 20 20 20 20 7d 65   no-op */.    }e
1f6e0 6c 73 65 20 69 66 28 20 70 53 65 67 2d 3e 70 4c  lse if( pSeg->pL
1f6f0 65 61 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  eaf==0 ){.      
1f700 2f 2a 20 41 6c 6c 20 6b 65 79 73 20 66 72 6f 6d  /* All keys from
1f710 20 74 68 69 73 20 69 6e 70 75 74 20 73 65 67 6d   this input segm
1f720 65 6e 74 20 68 61 76 65 20 62 65 65 6e 20 74 72  ent have been tr
1f730 61 6e 73 66 65 72 65 64 20 74 6f 20 74 68 65 20  ansfered to the 
1f740 6f 75 74 70 75 74 2e 0a 20 20 20 20 20 20 2a 2a  output..      **
1f750 20 53 65 74 20 62 6f 74 68 20 74 68 65 20 66 69   Set both the fi
1f760 72 73 74 20 61 6e 64 20 6c 61 73 74 20 70 61 67  rst and last pag
1f770 65 2d 6e 75 6d 62 65 72 73 20 74 6f 20 30 20 74  e-numbers to 0 t
1f780 6f 20 69 6e 64 69 63 61 74 65 20 74 68 61 74 20  o indicate that 
1f790 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 73 65 67  the.      ** seg
1f7a0 6d 65 6e 74 20 69 73 20 6e 6f 77 20 65 6d 70 74  ment is now empt
1f7b0 79 2e 20 2a 2f 0a 20 20 20 20 20 20 70 53 65 67  y. */.      pSeg
1f7c0 2d 3e 70 53 65 67 2d 3e 70 67 6e 6f 4c 61 73 74  ->pSeg->pgnoLast
1f7d0 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 53 65 67   = 0;.      pSeg
1f7e0 2d 3e 70 53 65 67 2d 3e 70 67 6e 6f 46 69 72 73  ->pSeg->pgnoFirs
1f7f0 74 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65  t = 0;.    }else
1f800 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 4f 66 66  {.      int iOff
1f810 20 3d 20 70 53 65 67 2d 3e 69 54 65 72 6d 4c 65   = pSeg->iTermLe
1f820 61 66 4f 66 66 73 65 74 3b 20 20 20 20 20 2f 2a  afOffset;     /*
1f830 20 4f 66 66 73 65 74 20 6f 6e 20 6e 65 77 20 66   Offset on new f
1f840 69 72 73 74 20 6c 65 61 66 20 70 61 67 65 20 2a  irst leaf page *
1f850 2f 0a 20 20 20 20 20 20 69 36 34 20 69 4c 65 61  /.      i64 iLea
1f860 66 52 6f 77 69 64 3b 0a 20 20 20 20 20 20 46 74  fRowid;.      Ft
1f870 73 35 44 61 74 61 20 2a 70 44 61 74 61 3b 0a 20  s5Data *pData;. 
1f880 20 20 20 20 20 69 6e 74 20 69 49 64 20 3d 20 70       int iId = p
1f890 53 65 67 2d 3e 70 53 65 67 2d 3e 69 53 65 67 69  Seg->pSeg->iSegi
1f8a0 64 3b 0a 20 20 20 20 20 20 75 38 20 61 48 64 72  d;.      u8 aHdr
1f8b0 5b 34 5d 20 3d 20 7b 30 78 30 30 2c 20 30 78 30  [4] = {0x00, 0x0
1f8c0 30 2c 20 30 78 30 30 2c 20 30 78 30 30 7d 3b 0a  0, 0x00, 0x00};.
1f8d0 0a 20 20 20 20 20 20 69 4c 65 61 66 52 6f 77 69  .      iLeafRowi
1f8e0 64 20 3d 20 46 54 53 35 5f 53 45 47 4d 45 4e 54  d = FTS5_SEGMENT
1f8f0 5f 52 4f 57 49 44 28 69 49 64 2c 20 70 53 65 67  _ROWID(iId, pSeg
1f900 2d 3e 69 54 65 72 6d 4c 65 61 66 50 67 6e 6f 29  ->iTermLeafPgno)
1f910 3b 0a 20 20 20 20 20 20 70 44 61 74 61 20 3d 20  ;.      pData = 
1f920 66 74 73 35 44 61 74 61 52 65 61 64 28 70 2c 20  fts5DataRead(p, 
1f930 69 4c 65 61 66 52 6f 77 69 64 29 3b 0a 20 20 20  iLeafRowid);.   
1f940 20 20 20 69 66 28 20 70 44 61 74 61 20 29 7b 0a     if( pData ){.
1f950 20 20 20 20 20 20 20 20 66 74 73 35 42 75 66 66          fts5Buff
1f960 65 72 5a 65 72 6f 28 26 62 75 66 29 3b 0a 20 20  erZero(&buf);.  
1f970 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72        fts5Buffer
1f980 47 72 6f 77 28 26 70 2d 3e 72 63 2c 20 26 62 75  Grow(&p->rc, &bu
1f990 66 2c 20 70 44 61 74 61 2d 3e 6e 6e 29 3b 0a 20  f, pData->nn);. 
1f9a0 20 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65         fts5Buffe
1f9b0 72 41 70 70 65 6e 64 42 6c 6f 62 28 26 70 2d 3e  rAppendBlob(&p->
1f9c0 72 63 2c 20 26 62 75 66 2c 20 73 69 7a 65 6f 66  rc, &buf, sizeof
1f9d0 28 61 48 64 72 29 2c 20 61 48 64 72 29 3b 0a 20  (aHdr), aHdr);. 
1f9e0 20 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65         fts5Buffe
1f9f0 72 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26 70  rAppendVarint(&p
1fa00 2d 3e 72 63 2c 20 26 62 75 66 2c 20 70 53 65 67  ->rc, &buf, pSeg
1fa10 2d 3e 74 65 72 6d 2e 6e 29 3b 0a 20 20 20 20 20  ->term.n);.     
1fa20 20 20 20 66 74 73 35 42 75 66 66 65 72 41 70 70     fts5BufferApp
1fa30 65 6e 64 42 6c 6f 62 28 26 70 2d 3e 72 63 2c 20  endBlob(&p->rc, 
1fa40 26 62 75 66 2c 20 70 53 65 67 2d 3e 74 65 72 6d  &buf, pSeg->term
1fa50 2e 6e 2c 20 70 53 65 67 2d 3e 74 65 72 6d 2e 70  .n, pSeg->term.p
1fa60 29 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35 42  );.        fts5B
1fa70 75 66 66 65 72 41 70 70 65 6e 64 42 6c 6f 62 28  ufferAppendBlob(
1fa80 26 70 2d 3e 72 63 2c 20 26 62 75 66 2c 20 70 44  &p->rc, &buf, pD
1fa90 61 74 61 2d 3e 73 7a 4c 65 61 66 2d 69 4f 66 66  ata->szLeaf-iOff
1faa0 2c 20 26 70 44 61 74 61 2d 3e 70 5b 69 4f 66 66  , &pData->p[iOff
1fab0 5d 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ]);.        if( 
1fac0 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
1fad0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a   ){.          /*
1fae0 20 53 65 74 20 74 68 65 20 73 7a 4c 65 61 66 20   Set the szLeaf 
1faf0 66 69 65 6c 64 20 2a 2f 0a 20 20 20 20 20 20 20  field */.       
1fb00 20 20 20 66 74 73 35 50 75 74 55 31 36 28 26 62     fts5PutU16(&b
1fb10 75 66 2e 70 5b 32 5d 2c 20 28 75 31 36 29 62 75  uf.p[2], (u16)bu
1fb20 66 2e 6e 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  f.n);.        }.
1fb30 0a 20 20 20 20 20 20 20 20 2f 2a 20 53 65 74 20  .        /* Set 
1fb40 75 70 20 74 68 65 20 6e 65 77 20 70 61 67 65 2d  up the new page-
1fb50 69 6e 64 65 78 20 61 72 72 61 79 20 2a 2f 0a 20  index array */. 
1fb60 20 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65         fts5Buffe
1fb70 72 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26 70  rAppendVarint(&p
1fb80 2d 3e 72 63 2c 20 26 62 75 66 2c 20 34 29 3b 0a  ->rc, &buf, 4);.
1fb90 20 20 20 20 20 20 20 20 69 66 28 20 70 53 65 67          if( pSeg
1fba0 2d 3e 69 4c 65 61 66 50 67 6e 6f 3d 3d 70 53 65  ->iLeafPgno==pSe
1fbb0 67 2d 3e 69 54 65 72 6d 4c 65 61 66 50 67 6e 6f  g->iTermLeafPgno
1fbc0 20 0a 20 20 20 20 20 20 20 20 20 26 26 20 70 53   .         && pS
1fbd0 65 67 2d 3e 69 45 6e 64 6f 66 44 6f 63 6c 69 73  eg->iEndofDoclis
1fbe0 74 3c 70 44 61 74 61 2d 3e 73 7a 4c 65 61 66 20  t<pData->szLeaf 
1fbf0 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20  .        ){.    
1fc00 20 20 20 20 20 20 69 6e 74 20 6e 44 69 66 66 20        int nDiff 
1fc10 3d 20 70 44 61 74 61 2d 3e 73 7a 4c 65 61 66 20  = pData->szLeaf 
1fc20 2d 20 70 53 65 67 2d 3e 69 45 6e 64 6f 66 44 6f  - pSeg->iEndofDo
1fc30 63 6c 69 73 74 3b 0a 20 20 20 20 20 20 20 20 20  clist;.         
1fc40 20 66 74 73 35 42 75 66 66 65 72 41 70 70 65 6e   fts5BufferAppen
1fc50 64 56 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20  dVarint(&p->rc, 
1fc60 26 62 75 66 2c 20 62 75 66 2e 6e 20 2d 20 31 20  &buf, buf.n - 1 
1fc70 2d 20 6e 44 69 66 66 20 2d 20 34 29 3b 0a 20 20  - nDiff - 4);.  
1fc80 20 20 20 20 20 20 20 20 66 74 73 35 42 75 66 66          fts5Buff
1fc90 65 72 41 70 70 65 6e 64 42 6c 6f 62 28 26 70 2d  erAppendBlob(&p-
1fca0 3e 72 63 2c 20 26 62 75 66 2c 20 0a 20 20 20 20  >rc, &buf, .    
1fcb0 20 20 20 20 20 20 20 20 20 20 70 44 61 74 61 2d            pData-
1fcc0 3e 6e 6e 20 2d 20 70 53 65 67 2d 3e 69 50 67 69  >nn - pSeg->iPgi
1fcd0 64 78 4f 66 66 2c 20 26 70 44 61 74 61 2d 3e 70  dxOff, &pData->p
1fce0 5b 70 53 65 67 2d 3e 69 50 67 69 64 78 4f 66 66  [pSeg->iPgidxOff
1fcf0 5d 0a 20 20 20 20 20 20 20 20 20 20 29 3b 0a 20  ].          );. 
1fd00 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20         }..      
1fd10 20 20 66 74 73 35 44 61 74 61 52 65 6c 65 61 73    fts5DataReleas
1fd20 65 28 70 44 61 74 61 29 3b 0a 20 20 20 20 20 20  e(pData);.      
1fd30 20 20 70 53 65 67 2d 3e 70 53 65 67 2d 3e 70 67    pSeg->pSeg->pg
1fd40 6e 6f 46 69 72 73 74 20 3d 20 70 53 65 67 2d 3e  noFirst = pSeg->
1fd50 69 54 65 72 6d 4c 65 61 66 50 67 6e 6f 3b 0a 20  iTermLeafPgno;. 
1fd60 20 20 20 20 20 20 20 66 74 73 35 44 61 74 61 44         fts5DataD
1fd70 65 6c 65 74 65 28 70 2c 20 46 54 53 35 5f 53 45  elete(p, FTS5_SE
1fd80 47 4d 45 4e 54 5f 52 4f 57 49 44 28 69 49 64 2c  GMENT_ROWID(iId,
1fd90 20 31 29 2c 20 69 4c 65 61 66 52 6f 77 69 64 29   1), iLeafRowid)
1fda0 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35 44 61  ;.        fts5Da
1fdb0 74 61 57 72 69 74 65 28 70 2c 20 69 4c 65 61 66  taWrite(p, iLeaf
1fdc0 52 6f 77 69 64 2c 20 62 75 66 2e 70 2c 20 62 75  Rowid, buf.p, bu
1fdd0 66 2e 6e 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  f.n);.      }.  
1fde0 20 20 7d 0a 20 20 7d 0a 20 20 66 74 73 35 42 75    }.  }.  fts5Bu
1fdf0 66 66 65 72 46 72 65 65 28 26 62 75 66 29 3b 0a  fferFree(&buf);.
1fe00 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  }..static void f
1fe10 74 73 35 4d 65 72 67 65 43 68 75 6e 6b 43 61 6c  ts5MergeChunkCal
1fe20 6c 62 61 63 6b 28 0a 20 20 46 74 73 35 49 6e 64  lback(.  Fts5Ind
1fe30 65 78 20 2a 70 2c 20 0a 20 20 76 6f 69 64 20 2a  ex *p, .  void *
1fe40 70 43 74 78 2c 20 0a 20 20 63 6f 6e 73 74 20 75  pCtx, .  const u
1fe50 38 20 2a 70 43 68 75 6e 6b 2c 20 69 6e 74 20 6e  8 *pChunk, int n
1fe60 43 68 75 6e 6b 0a 29 7b 0a 20 20 46 74 73 35 53  Chunk.){.  Fts5S
1fe70 65 67 57 72 69 74 65 72 20 2a 70 57 72 69 74 65  egWriter *pWrite
1fe80 72 20 3d 20 28 46 74 73 35 53 65 67 57 72 69 74  r = (Fts5SegWrit
1fe90 65 72 2a 29 70 43 74 78 3b 0a 20 20 66 74 73 35  er*)pCtx;.  fts5
1fea0 57 72 69 74 65 41 70 70 65 6e 64 50 6f 73 6c 69  WriteAppendPosli
1feb0 73 74 44 61 74 61 28 70 2c 20 70 57 72 69 74 65  stData(p, pWrite
1fec0 72 2c 20 70 43 68 75 6e 6b 2c 20 6e 43 68 75 6e  r, pChunk, nChun
1fed0 6b 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 0a 2a 2f 0a  k);.}../*.**.*/.
1fee0 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
1fef0 49 6e 64 65 78 4d 65 72 67 65 4c 65 76 65 6c 28  IndexMergeLevel(
1ff00 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c  .  Fts5Index *p,
1ff10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ff20 20 20 20 2f 2a 20 46 54 53 35 20 62 61 63 6b 65     /* FTS5 backe
1ff30 6e 64 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 46  nd object */.  F
1ff40 74 73 35 53 74 72 75 63 74 75 72 65 20 2a 2a 70  ts5Structure **p
1ff50 70 53 74 72 75 63 74 2c 20 20 20 20 20 20 20 2f  pStruct,       /
1ff60 2a 20 49 4e 2f 4f 55 54 3a 20 53 74 75 63 74 75  * IN/OUT: Stuctu
1ff70 72 65 20 6f 66 20 69 6e 64 65 78 20 2a 2f 0a 20  re of index */. 
1ff80 20 69 6e 74 20 69 4c 76 6c 2c 20 20 20 20 20 20   int iLvl,      
1ff90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ffa0 20 2f 2a 20 4c 65 76 65 6c 20 74 6f 20 72 65 61   /* Level to rea
1ffb0 64 20 69 6e 70 75 74 20 66 72 6f 6d 20 2a 2f 0a  d input from */.
1ffc0 20 20 69 6e 74 20 2a 70 6e 52 65 6d 20 20 20 20    int *pnRem    
1ffd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ffe0 20 20 2f 2a 20 57 72 69 74 65 20 75 70 20 74 6f    /* Write up to
1fff0 20 74 68 69 73 20 6d 61 6e 79 20 6f 75 74 70 75   this many outpu
20000 74 20 6c 65 61 76 65 73 20 2a 2f 0a 29 7b 0a 20  t leaves */.){. 
20010 20 46 74 73 35 53 74 72 75 63 74 75 72 65 20 2a   Fts5Structure *
20020 70 53 74 72 75 63 74 20 3d 20 2a 70 70 53 74 72  pStruct = *ppStr
20030 75 63 74 3b 0a 20 20 46 74 73 35 53 74 72 75 63  uct;.  Fts5Struc
20040 74 75 72 65 4c 65 76 65 6c 20 2a 70 4c 76 6c 20  tureLevel *pLvl 
20050 3d 20 26 70 53 74 72 75 63 74 2d 3e 61 4c 65 76  = &pStruct->aLev
20060 65 6c 5b 69 4c 76 6c 5d 3b 0a 20 20 46 74 73 35  el[iLvl];.  Fts5
20070 53 74 72 75 63 74 75 72 65 4c 65 76 65 6c 20 2a  StructureLevel *
20080 70 4c 76 6c 4f 75 74 3b 0a 20 20 46 74 73 35 49  pLvlOut;.  Fts5I
20090 74 65 72 20 2a 70 49 74 65 72 20 3d 20 30 3b 20  ter *pIter = 0; 
200a0 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74 6f        /* Iterato
200b0 72 20 74 6f 20 72 65 61 64 20 69 6e 70 75 74 20  r to read input 
200c0 64 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20 6e 52  data */.  int nR
200d0 65 6d 20 3d 20 70 6e 52 65 6d 20 3f 20 2a 70 6e  em = pnRem ? *pn
200e0 52 65 6d 20 3a 20 30 3b 20 20 2f 2a 20 4f 75 74  Rem : 0;  /* Out
200f0 70 75 74 20 6c 65 61 66 20 70 61 67 65 73 20 6c  put leaf pages l
20100 65 66 74 20 74 6f 20 77 72 69 74 65 20 2a 2f 0a  eft to write */.
20110 20 20 69 6e 74 20 6e 49 6e 70 75 74 3b 20 20 20    int nInput;   
20120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20130 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 69    /* Number of i
20140 6e 70 75 74 20 73 65 67 6d 65 6e 74 73 20 2a 2f  nput segments */
20150 0a 20 20 46 74 73 35 53 65 67 57 72 69 74 65 72  .  Fts5SegWriter
20160 20 77 72 69 74 65 72 3b 20 20 20 20 20 20 20 20   writer;        
20170 20 20 20 2f 2a 20 57 72 69 74 65 72 20 6f 62 6a     /* Writer obj
20180 65 63 74 20 2a 2f 0a 20 20 46 74 73 35 53 74 72  ect */.  Fts5Str
20190 75 63 74 75 72 65 53 65 67 6d 65 6e 74 20 2a 70  uctureSegment *p
201a0 53 65 67 3b 20 20 20 20 20 2f 2a 20 4f 75 74 70  Seg;     /* Outp
201b0 75 74 20 73 65 67 6d 65 6e 74 20 2a 2f 0a 20 20  ut segment */.  
201c0 46 74 73 35 42 75 66 66 65 72 20 74 65 72 6d 3b  Fts5Buffer term;
201d0 0a 20 20 69 6e 74 20 62 4f 6c 64 65 73 74 3b 20  .  int bOldest; 
201e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
201f0 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68     /* True if th
20200 65 20 6f 75 74 70 75 74 20 73 65 67 6d 65 6e 74  e output segment
20210 20 69 73 20 74 68 65 20 6f 6c 64 65 73 74 20 2a   is the oldest *
20220 2f 0a 20 20 69 6e 74 20 65 44 65 74 61 69 6c 20  /.  int eDetail 
20230 3d 20 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e 65 44  = p->pConfig->eD
20240 65 74 61 69 6c 3b 0a 20 20 63 6f 6e 73 74 20 69  etail;.  const i
20250 6e 74 20 66 6c 61 67 73 20 3d 20 46 54 53 35 49  nt flags = FTS5I
20260 4e 44 45 58 5f 51 55 45 52 59 5f 4e 4f 4f 55 54  NDEX_QUERY_NOOUT
20270 50 55 54 3b 0a 20 20 69 6e 74 20 62 54 65 72 6d  PUT;.  int bTerm
20280 57 72 69 74 74 65 6e 20 3d 20 30 3b 20 20 20 20  Written = 0;    
20290 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
202a0 66 20 63 75 72 72 65 6e 74 20 74 65 72 6d 20 61  f current term a
202b0 6c 72 65 61 64 79 20 6f 75 74 70 75 74 20 2a 2f  lready output */
202c0 0a 0a 20 20 61 73 73 65 72 74 28 20 69 4c 76 6c  ..  assert( iLvl
202d0 3c 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c  <pStruct->nLevel
202e0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4c   );.  assert( pL
202f0 76 6c 2d 3e 6e 4d 65 72 67 65 3c 3d 70 4c 76 6c  vl->nMerge<=pLvl
20300 2d 3e 6e 53 65 67 20 29 3b 0a 0a 20 20 6d 65 6d  ->nSeg );..  mem
20310 73 65 74 28 26 77 72 69 74 65 72 2c 20 30 2c 20  set(&writer, 0, 
20320 73 69 7a 65 6f 66 28 46 74 73 35 53 65 67 57 72  sizeof(Fts5SegWr
20330 69 74 65 72 29 29 3b 0a 20 20 6d 65 6d 73 65 74  iter));.  memset
20340 28 26 74 65 72 6d 2c 20 30 2c 20 73 69 7a 65 6f  (&term, 0, sizeo
20350 66 28 46 74 73 35 42 75 66 66 65 72 29 29 3b 0a  f(Fts5Buffer));.
20360 20 20 69 66 28 20 70 4c 76 6c 2d 3e 6e 4d 65 72    if( pLvl->nMer
20370 67 65 20 29 7b 0a 20 20 20 20 70 4c 76 6c 4f 75  ge ){.    pLvlOu
20380 74 20 3d 20 26 70 53 74 72 75 63 74 2d 3e 61 4c  t = &pStruct->aL
20390 65 76 65 6c 5b 69 4c 76 6c 2b 31 5d 3b 0a 20 20  evel[iLvl+1];.  
203a0 20 20 61 73 73 65 72 74 28 20 70 4c 76 6c 4f 75    assert( pLvlOu
203b0 74 2d 3e 6e 53 65 67 3e 30 20 29 3b 0a 20 20 20  t->nSeg>0 );.   
203c0 20 6e 49 6e 70 75 74 20 3d 20 70 4c 76 6c 2d 3e   nInput = pLvl->
203d0 6e 4d 65 72 67 65 3b 0a 20 20 20 20 70 53 65 67  nMerge;.    pSeg
203e0 20 3d 20 26 70 4c 76 6c 4f 75 74 2d 3e 61 53 65   = &pLvlOut->aSe
203f0 67 5b 70 4c 76 6c 4f 75 74 2d 3e 6e 53 65 67 2d  g[pLvlOut->nSeg-
20400 31 5d 3b 0a 0a 20 20 20 20 66 74 73 35 57 72 69  1];..    fts5Wri
20410 74 65 49 6e 69 74 28 70 2c 20 26 77 72 69 74 65  teInit(p, &write
20420 72 2c 20 70 53 65 67 2d 3e 69 53 65 67 69 64 29  r, pSeg->iSegid)
20430 3b 0a 20 20 20 20 77 72 69 74 65 72 2e 77 72 69  ;.    writer.wri
20440 74 65 72 2e 70 67 6e 6f 20 3d 20 70 53 65 67 2d  ter.pgno = pSeg-
20450 3e 70 67 6e 6f 4c 61 73 74 2b 31 3b 0a 20 20 20  >pgnoLast+1;.   
20460 20 77 72 69 74 65 72 2e 69 42 74 50 61 67 65 20   writer.iBtPage 
20470 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  = 0;.  }else{.  
20480 20 20 69 6e 74 20 69 53 65 67 69 64 20 3d 20 66    int iSegid = f
20490 74 73 35 41 6c 6c 6f 63 61 74 65 53 65 67 69 64  ts5AllocateSegid
204a0 28 70 2c 20 70 53 74 72 75 63 74 29 3b 0a 0a 20  (p, pStruct);.. 
204b0 20 20 20 2f 2a 20 45 78 74 65 6e 64 20 74 68 65     /* Extend the
204c0 20 46 74 73 35 53 74 72 75 63 74 75 72 65 20 6f   Fts5Structure o
204d0 62 6a 65 63 74 20 61 73 20 72 65 71 75 69 72 65  bject as require
204e0 64 20 74 6f 20 65 6e 73 75 72 65 20 74 68 65 20  d to ensure the 
204f0 6f 75 74 70 75 74 0a 20 20 20 20 2a 2a 20 73 65  output.    ** se
20500 67 6d 65 6e 74 20 65 78 69 73 74 73 2e 20 2a 2f  gment exists. */
20510 0a 20 20 20 20 69 66 28 20 69 4c 76 6c 3d 3d 70  .    if( iLvl==p
20520 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 2d 31  Struct->nLevel-1
20530 20 29 7b 0a 20 20 20 20 20 20 66 74 73 35 53 74   ){.      fts5St
20540 72 75 63 74 75 72 65 41 64 64 4c 65 76 65 6c 28  ructureAddLevel(
20550 26 70 2d 3e 72 63 2c 20 70 70 53 74 72 75 63 74  &p->rc, ppStruct
20560 29 3b 0a 20 20 20 20 20 20 70 53 74 72 75 63 74  );.      pStruct
20570 20 3d 20 2a 70 70 53 74 72 75 63 74 3b 0a 20 20   = *ppStruct;.  
20580 20 20 7d 0a 20 20 20 20 66 74 73 35 53 74 72 75    }.    fts5Stru
20590 63 74 75 72 65 45 78 74 65 6e 64 4c 65 76 65 6c  ctureExtendLevel
205a0 28 26 70 2d 3e 72 63 2c 20 70 53 74 72 75 63 74  (&p->rc, pStruct
205b0 2c 20 69 4c 76 6c 2b 31 2c 20 31 2c 20 30 29 3b  , iLvl+1, 1, 0);
205c0 0a 20 20 20 20 69 66 28 20 70 2d 3e 72 63 20 29  .    if( p->rc )
205d0 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 70 4c 76   return;.    pLv
205e0 6c 20 3d 20 26 70 53 74 72 75 63 74 2d 3e 61 4c  l = &pStruct->aL
205f0 65 76 65 6c 5b 69 4c 76 6c 5d 3b 0a 20 20 20 20  evel[iLvl];.    
20600 70 4c 76 6c 4f 75 74 20 3d 20 26 70 53 74 72 75  pLvlOut = &pStru
20610 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c 2b  ct->aLevel[iLvl+
20620 31 5d 3b 0a 0a 20 20 20 20 66 74 73 35 57 72 69  1];..    fts5Wri
20630 74 65 49 6e 69 74 28 70 2c 20 26 77 72 69 74 65  teInit(p, &write
20640 72 2c 20 69 53 65 67 69 64 29 3b 0a 0a 20 20 20  r, iSegid);..   
20650 20 2f 2a 20 41 64 64 20 74 68 65 20 6e 65 77 20   /* Add the new 
20660 73 65 67 6d 65 6e 74 20 74 6f 20 74 68 65 20 6f  segment to the o
20670 75 74 70 75 74 20 6c 65 76 65 6c 20 2a 2f 0a 20  utput level */. 
20680 20 20 20 70 53 65 67 20 3d 20 26 70 4c 76 6c 4f     pSeg = &pLvlO
20690 75 74 2d 3e 61 53 65 67 5b 70 4c 76 6c 4f 75 74  ut->aSeg[pLvlOut
206a0 2d 3e 6e 53 65 67 5d 3b 0a 20 20 20 20 70 4c 76  ->nSeg];.    pLv
206b0 6c 4f 75 74 2d 3e 6e 53 65 67 2b 2b 3b 0a 20 20  lOut->nSeg++;.  
206c0 20 20 70 53 65 67 2d 3e 70 67 6e 6f 46 69 72 73    pSeg->pgnoFirs
206d0 74 20 3d 20 31 3b 0a 20 20 20 20 70 53 65 67 2d  t = 1;.    pSeg-
206e0 3e 69 53 65 67 69 64 20 3d 20 69 53 65 67 69 64  >iSegid = iSegid
206f0 3b 0a 20 20 20 20 70 53 74 72 75 63 74 2d 3e 6e  ;.    pStruct->n
20700 53 65 67 6d 65 6e 74 2b 2b 3b 0a 0a 20 20 20 20  Segment++;..    
20710 2f 2a 20 52 65 61 64 20 69 6e 70 75 74 20 66 72  /* Read input fr
20720 6f 6d 20 61 6c 6c 20 73 65 67 6d 65 6e 74 73 20  om all segments 
20730 69 6e 20 74 68 65 20 69 6e 70 75 74 20 6c 65 76  in the input lev
20740 65 6c 20 2a 2f 0a 20 20 20 20 6e 49 6e 70 75 74  el */.    nInput
20750 20 3d 20 70 4c 76 6c 2d 3e 6e 53 65 67 3b 0a 20   = pLvl->nSeg;. 
20760 20 7d 0a 20 20 62 4f 6c 64 65 73 74 20 3d 20 28   }.  bOldest = (
20770 70 4c 76 6c 4f 75 74 2d 3e 6e 53 65 67 3d 3d 31  pLvlOut->nSeg==1
20780 20 26 26 20 70 53 74 72 75 63 74 2d 3e 6e 4c 65   && pStruct->nLe
20790 76 65 6c 3d 3d 69 4c 76 6c 2b 32 29 3b 0a 0a 20  vel==iLvl+2);.. 
207a0 20 61 73 73 65 72 74 28 20 69 4c 76 6c 3e 3d 30   assert( iLvl>=0
207b0 20 29 3b 0a 20 20 66 6f 72 28 66 74 73 35 4d 75   );.  for(fts5Mu
207c0 6c 74 69 49 74 65 72 4e 65 77 28 70 2c 20 70 53  ltiIterNew(p, pS
207d0 74 72 75 63 74 2c 20 66 6c 61 67 73 2c 20 30 2c  truct, flags, 0,
207e0 20 30 2c 20 30 2c 20 69 4c 76 6c 2c 20 6e 49 6e   0, 0, iLvl, nIn
207f0 70 75 74 2c 20 26 70 49 74 65 72 29 3b 0a 20 20  put, &pIter);.  
20800 20 20 20 20 66 74 73 35 4d 75 6c 74 69 49 74 65      fts5MultiIte
20810 72 45 6f 66 28 70 2c 20 70 49 74 65 72 29 3d 3d  rEof(p, pIter)==
20820 30 3b 0a 20 20 20 20 20 20 66 74 73 35 4d 75 6c  0;.      fts5Mul
20830 74 69 49 74 65 72 4e 65 78 74 28 70 2c 20 70 49  tiIterNext(p, pI
20840 74 65 72 2c 20 30 2c 20 30 29 0a 20 20 29 7b 0a  ter, 0, 0).  ){.
20850 20 20 20 20 46 74 73 35 53 65 67 49 74 65 72 20      Fts5SegIter 
20860 2a 70 53 65 67 49 74 65 72 20 3d 20 26 70 49 74  *pSegIter = &pIt
20870 65 72 2d 3e 61 53 65 67 5b 20 70 49 74 65 72 2d  er->aSeg[ pIter-
20880 3e 61 46 69 72 73 74 5b 31 5d 2e 69 46 69 72 73  >aFirst[1].iFirs
20890 74 20 5d 3b 0a 20 20 20 20 69 6e 74 20 6e 50 6f  t ];.    int nPo
208a0 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s;              
208b0 20 20 20 20 20 20 20 2f 2a 20 70 6f 73 69 74 69         /* positi
208c0 6f 6e 2d 6c 69 73 74 20 73 69 7a 65 20 66 69 65  on-list size fie
208d0 6c 64 20 76 61 6c 75 65 20 2a 2f 0a 20 20 20 20  ld value */.    
208e0 69 6e 74 20 6e 54 65 72 6d 3b 0a 20 20 20 20 63  int nTerm;.    c
208f0 6f 6e 73 74 20 75 38 20 2a 70 54 65 72 6d 3b 0a  onst u8 *pTerm;.
20900 0a 20 20 20 20 70 54 65 72 6d 20 3d 20 66 74 73  .    pTerm = fts
20910 35 4d 75 6c 74 69 49 74 65 72 54 65 72 6d 28 70  5MultiIterTerm(p
20920 49 74 65 72 2c 20 26 6e 54 65 72 6d 29 3b 0a 20  Iter, &nTerm);. 
20930 20 20 20 69 66 28 20 6e 54 65 72 6d 21 3d 74 65     if( nTerm!=te
20940 72 6d 2e 6e 20 7c 7c 20 6d 65 6d 63 6d 70 28 70  rm.n || memcmp(p
20950 54 65 72 6d 2c 20 74 65 72 6d 2e 70 2c 20 6e 54  Term, term.p, nT
20960 65 72 6d 29 20 29 7b 0a 20 20 20 20 20 20 69 66  erm) ){.      if
20970 28 20 70 6e 52 65 6d 20 26 26 20 77 72 69 74 65  ( pnRem && write
20980 72 2e 6e 4c 65 61 66 57 72 69 74 74 65 6e 3e 6e  r.nLeafWritten>n
20990 52 65 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 62  Rem ){.        b
209a0 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
209b0 20 20 20 20 66 74 73 35 42 75 66 66 65 72 53 65      fts5BufferSe
209c0 74 28 26 70 2d 3e 72 63 2c 20 26 74 65 72 6d 2c  t(&p->rc, &term,
209d0 20 6e 54 65 72 6d 2c 20 70 54 65 72 6d 29 3b 0a   nTerm, pTerm);.
209e0 20 20 20 20 20 20 62 54 65 72 6d 57 72 69 74 74        bTermWritt
209f0 65 6e 20 3d 30 3b 0a 20 20 20 20 7d 0a 0a 20 20  en =0;.    }..  
20a00 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20 6b    /* Check for k
20a10 65 79 20 61 6e 6e 69 68 69 6c 61 74 69 6f 6e 2e  ey annihilation.
20a20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 53 65 67   */.    if( pSeg
20a30 49 74 65 72 2d 3e 6e 50 6f 73 3d 3d 30 20 26 26  Iter->nPos==0 &&
20a40 20 28 62 4f 6c 64 65 73 74 20 7c 7c 20 70 53 65   (bOldest || pSe
20a50 67 49 74 65 72 2d 3e 62 44 65 6c 3d 3d 30 29 20  gIter->bDel==0) 
20a60 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 0a 20 20 20  ) continue;..   
20a70 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49   if( p->rc==SQLI
20a80 54 45 5f 4f 4b 20 26 26 20 62 54 65 72 6d 57 72  TE_OK && bTermWr
20a90 69 74 74 65 6e 3d 3d 30 20 29 7b 0a 20 20 20 20  itten==0 ){.    
20aa0 20 20 2f 2a 20 54 68 69 73 20 69 73 20 61 20 6e    /* This is a n
20ab0 65 77 20 74 65 72 6d 2e 20 41 70 70 65 6e 64 20  ew term. Append 
20ac0 61 20 74 65 72 6d 20 74 6f 20 74 68 65 20 6f 75  a term to the ou
20ad0 74 70 75 74 20 73 65 67 6d 65 6e 74 2e 20 2a 2f  tput segment. */
20ae0 0a 20 20 20 20 20 20 66 74 73 35 57 72 69 74 65  .      fts5Write
20af0 41 70 70 65 6e 64 54 65 72 6d 28 70 2c 20 26 77  AppendTerm(p, &w
20b00 72 69 74 65 72 2c 20 6e 54 65 72 6d 2c 20 70 54  riter, nTerm, pT
20b10 65 72 6d 29 3b 0a 20 20 20 20 20 20 62 54 65 72  erm);.      bTer
20b20 6d 57 72 69 74 74 65 6e 20 3d 20 31 3b 0a 20 20  mWritten = 1;.  
20b30 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 70 70 65    }..    /* Appe
20b40 6e 64 20 74 68 65 20 72 6f 77 69 64 20 74 6f 20  nd the rowid to 
20b50 74 68 65 20 6f 75 74 70 75 74 20 2a 2f 0a 20 20  the output */.  
20b60 20 20 2f 2a 20 57 52 49 54 45 50 4f 53 4c 49 53    /* WRITEPOSLIS
20b70 54 53 49 5a 45 20 2a 2f 0a 20 20 20 20 66 74 73  TSIZE */.    fts
20b80 35 57 72 69 74 65 41 70 70 65 6e 64 52 6f 77 69  5WriteAppendRowi
20b90 64 28 70 2c 20 26 77 72 69 74 65 72 2c 20 66 74  d(p, &writer, ft
20ba0 73 35 4d 75 6c 74 69 49 74 65 72 52 6f 77 69 64  s5MultiIterRowid
20bb0 28 70 49 74 65 72 29 29 3b 0a 0a 20 20 20 20 69  (pIter));..    i
20bc0 66 28 20 65 44 65 74 61 69 6c 3d 3d 46 54 53 35  f( eDetail==FTS5
20bd0 5f 44 45 54 41 49 4c 5f 4e 4f 4e 45 20 29 7b 0a  _DETAIL_NONE ){.
20be0 20 20 20 20 20 20 69 66 28 20 70 53 65 67 49 74        if( pSegIt
20bf0 65 72 2d 3e 62 44 65 6c 20 29 7b 0a 20 20 20 20  er->bDel ){.    
20c00 20 20 20 20 66 74 73 35 42 75 66 66 65 72 41 70      fts5BufferAp
20c10 70 65 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e 72  pendVarint(&p->r
20c20 63 2c 20 26 77 72 69 74 65 72 2e 77 72 69 74 65  c, &writer.write
20c30 72 2e 62 75 66 2c 20 30 29 3b 0a 20 20 20 20 20  r.buf, 0);.     
20c40 20 20 20 69 66 28 20 70 53 65 67 49 74 65 72 2d     if( pSegIter-
20c50 3e 6e 50 6f 73 3e 30 20 29 7b 0a 20 20 20 20 20  >nPos>0 ){.     
20c60 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72 41       fts5BufferA
20c70 70 70 65 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e  ppendVarint(&p->
20c80 72 63 2c 20 26 77 72 69 74 65 72 2e 77 72 69 74  rc, &writer.writ
20c90 65 72 2e 62 75 66 2c 20 30 29 3b 0a 20 20 20 20  er.buf, 0);.    
20ca0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
20cb0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f    }else{.      /
20cc0 2a 20 41 70 70 65 6e 64 20 74 68 65 20 70 6f 73  * Append the pos
20cd0 69 74 69 6f 6e 2d 6c 69 73 74 20 64 61 74 61 20  ition-list data 
20ce0 74 6f 20 74 68 65 20 6f 75 74 70 75 74 20 2a 2f  to the output */
20cf0 0a 20 20 20 20 20 20 6e 50 6f 73 20 3d 20 70 53  .      nPos = pS
20d00 65 67 49 74 65 72 2d 3e 6e 50 6f 73 2a 32 20 2b  egIter->nPos*2 +
20d10 20 70 53 65 67 49 74 65 72 2d 3e 62 44 65 6c 3b   pSegIter->bDel;
20d20 0a 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65  .      fts5Buffe
20d30 72 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26 70  rAppendVarint(&p
20d40 2d 3e 72 63 2c 20 26 77 72 69 74 65 72 2e 77 72  ->rc, &writer.wr
20d50 69 74 65 72 2e 62 75 66 2c 20 6e 50 6f 73 29 3b  iter.buf, nPos);
20d60 0a 20 20 20 20 20 20 66 74 73 35 43 68 75 6e 6b  .      fts5Chunk
20d70 49 74 65 72 61 74 65 28 70 2c 20 70 53 65 67 49  Iterate(p, pSegI
20d80 74 65 72 2c 20 28 76 6f 69 64 2a 29 26 77 72 69  ter, (void*)&wri
20d90 74 65 72 2c 20 66 74 73 35 4d 65 72 67 65 43 68  ter, fts5MergeCh
20da0 75 6e 6b 43 61 6c 6c 62 61 63 6b 29 3b 0a 20 20  unkCallback);.  
20db0 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 6c    }.  }..  /* Fl
20dc0 75 73 68 20 74 68 65 20 6c 61 73 74 20 6c 65 61  ush the last lea
20dd0 66 20 70 61 67 65 20 74 6f 20 64 69 73 6b 2e 20  f page to disk. 
20de0 53 65 74 20 74 68 65 20 6f 75 74 70 75 74 20 73  Set the output s
20df0 65 67 6d 65 6e 74 20 62 2d 74 72 65 65 20 68 65  egment b-tree he
20e00 69 67 68 74 0a 20 20 2a 2a 20 61 6e 64 20 6c 61  ight.  ** and la
20e10 73 74 20 6c 65 61 66 20 70 61 67 65 20 6e 75 6d  st leaf page num
20e20 62 65 72 20 61 74 20 74 68 65 20 73 61 6d 65 20  ber at the same 
20e30 74 69 6d 65 2e 20 20 2a 2f 0a 20 20 66 74 73 35  time.  */.  fts5
20e40 57 72 69 74 65 46 69 6e 69 73 68 28 70 2c 20 26  WriteFinish(p, &
20e50 77 72 69 74 65 72 2c 20 26 70 53 65 67 2d 3e 70  writer, &pSeg->p
20e60 67 6e 6f 4c 61 73 74 29 3b 0a 0a 20 20 69 66 28  gnoLast);..  if(
20e70 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 45 6f   fts5MultiIterEo
20e80 66 28 70 2c 20 70 49 74 65 72 29 20 29 7b 0a 20  f(p, pIter) ){. 
20e90 20 20 20 69 6e 74 20 69 3b 0a 0a 20 20 20 20 2f     int i;..    /
20ea0 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 72 65 64  * Remove the red
20eb0 75 6e 64 61 6e 74 20 73 65 67 6d 65 6e 74 73 20  undant segments 
20ec0 66 72 6f 6d 20 74 68 65 20 25 5f 64 61 74 61 20  from the %_data 
20ed0 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 66 6f 72  table */.    for
20ee0 28 69 3d 30 3b 20 69 3c 6e 49 6e 70 75 74 3b 20  (i=0; i<nInput; 
20ef0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 66 74 73 35  i++){.      fts5
20f00 44 61 74 61 52 65 6d 6f 76 65 53 65 67 6d 65 6e  DataRemoveSegmen
20f10 74 28 70 2c 20 70 4c 76 6c 2d 3e 61 53 65 67 5b  t(p, pLvl->aSeg[
20f20 69 5d 2e 69 53 65 67 69 64 29 3b 0a 20 20 20 20  i].iSegid);.    
20f30 7d 0a 0a 20 20 20 20 2f 2a 20 52 65 6d 6f 76 65  }..    /* Remove
20f40 20 74 68 65 20 72 65 64 75 6e 64 61 6e 74 20 73   the redundant s
20f50 65 67 6d 65 6e 74 73 20 66 72 6f 6d 20 74 68 65  egments from the
20f60 20 69 6e 70 75 74 20 6c 65 76 65 6c 20 2a 2f 0a   input level */.
20f70 20 20 20 20 69 66 28 20 70 4c 76 6c 2d 3e 6e 53      if( pLvl->nS
20f80 65 67 21 3d 6e 49 6e 70 75 74 20 29 7b 0a 20 20  eg!=nInput ){.  
20f90 20 20 20 20 69 6e 74 20 6e 4d 6f 76 65 20 3d 20      int nMove = 
20fa0 28 70 4c 76 6c 2d 3e 6e 53 65 67 20 2d 20 6e 49  (pLvl->nSeg - nI
20fb0 6e 70 75 74 29 20 2a 20 73 69 7a 65 6f 66 28 46  nput) * sizeof(F
20fc0 74 73 35 53 74 72 75 63 74 75 72 65 53 65 67 6d  ts5StructureSegm
20fd0 65 6e 74 29 3b 0a 20 20 20 20 20 20 6d 65 6d 6d  ent);.      memm
20fe0 6f 76 65 28 70 4c 76 6c 2d 3e 61 53 65 67 2c 20  ove(pLvl->aSeg, 
20ff0 26 70 4c 76 6c 2d 3e 61 53 65 67 5b 6e 49 6e 70  &pLvl->aSeg[nInp
21000 75 74 5d 2c 20 6e 4d 6f 76 65 29 3b 0a 20 20 20  ut], nMove);.   
21010 20 7d 0a 20 20 20 20 70 53 74 72 75 63 74 2d 3e   }.    pStruct->
21020 6e 53 65 67 6d 65 6e 74 20 2d 3d 20 6e 49 6e 70  nSegment -= nInp
21030 75 74 3b 0a 20 20 20 20 70 4c 76 6c 2d 3e 6e 53  ut;.    pLvl->nS
21040 65 67 20 2d 3d 20 6e 49 6e 70 75 74 3b 0a 20 20  eg -= nInput;.  
21050 20 20 70 4c 76 6c 2d 3e 6e 4d 65 72 67 65 20 3d    pLvl->nMerge =
21060 20 30 3b 0a 20 20 20 20 69 66 28 20 70 53 65 67   0;.    if( pSeg
21070 2d 3e 70 67 6e 6f 4c 61 73 74 3d 3d 30 20 29 7b  ->pgnoLast==0 ){
21080 0a 20 20 20 20 20 20 70 4c 76 6c 4f 75 74 2d 3e  .      pLvlOut->
21090 6e 53 65 67 2d 2d 3b 0a 20 20 20 20 20 20 70 53  nSeg--;.      pS
210a0 74 72 75 63 74 2d 3e 6e 53 65 67 6d 65 6e 74 2d  truct->nSegment-
210b0 2d 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  -;.    }.  }else
210c0 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 53  {.    assert( pS
210d0 65 67 2d 3e 70 67 6e 6f 4c 61 73 74 3e 30 20 29  eg->pgnoLast>0 )
210e0 3b 0a 20 20 20 20 66 74 73 35 54 72 69 6d 53 65  ;.    fts5TrimSe
210f0 67 6d 65 6e 74 73 28 70 2c 20 70 49 74 65 72 29  gments(p, pIter)
21100 3b 0a 20 20 20 20 70 4c 76 6c 2d 3e 6e 4d 65 72  ;.    pLvl->nMer
21110 67 65 20 3d 20 6e 49 6e 70 75 74 3b 0a 20 20 7d  ge = nInput;.  }
21120 0a 0a 20 20 66 74 73 35 4d 75 6c 74 69 49 74 65  ..  fts5MultiIte
21130 72 46 72 65 65 28 70 49 74 65 72 29 3b 0a 20 20  rFree(pIter);.  
21140 66 74 73 35 42 75 66 66 65 72 46 72 65 65 28 26  fts5BufferFree(&
21150 74 65 72 6d 29 3b 0a 20 20 69 66 28 20 70 6e 52  term);.  if( pnR
21160 65 6d 20 29 20 2a 70 6e 52 65 6d 20 2d 3d 20 77  em ) *pnRem -= w
21170 72 69 74 65 72 2e 6e 4c 65 61 66 57 72 69 74 74  riter.nLeafWritt
21180 65 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20  en;.}../*.** Do 
21190 75 70 20 74 6f 20 6e 50 67 20 70 61 67 65 73 20  up to nPg pages 
211a0 6f 66 20 61 75 74 6f 6d 65 72 67 65 20 77 6f 72  of automerge wor
211b0 6b 20 6f 6e 20 74 68 65 20 69 6e 64 65 78 2e 0a  k on the index..
211c0 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75  **.** Return tru
211d0 65 20 69 66 20 61 6e 79 20 63 68 61 6e 67 65 73  e if any changes
211e0 20 77 65 72 65 20 61 63 74 75 61 6c 6c 79 20 6d   were actually m
211f0 61 64 65 2c 20 6f 72 20 66 61 6c 73 65 20 6f 74  ade, or false ot
21200 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 73 74 61 74  herwise..*/.stat
21210 69 63 20 69 6e 74 20 66 74 73 35 49 6e 64 65 78  ic int fts5Index
21220 4d 65 72 67 65 28 0a 20 20 46 74 73 35 49 6e 64  Merge(.  Fts5Ind
21230 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  ex *p,          
21240 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53 35           /* FTS5
21250 20 62 61 63 6b 65 6e 64 20 6f 62 6a 65 63 74 20   backend object 
21260 2a 2f 0a 20 20 46 74 73 35 53 74 72 75 63 74 75  */.  Fts5Structu
21270 72 65 20 2a 2a 70 70 53 74 72 75 63 74 2c 20 20  re **ppStruct,  
21280 20 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20       /* IN/OUT: 
21290 43 75 72 72 65 6e 74 20 73 74 72 75 63 74 75 72  Current structur
212a0 65 20 6f 66 20 69 6e 64 65 78 20 2a 2f 0a 20 20  e of index */.  
212b0 69 6e 74 20 6e 50 67 2c 20 20 20 20 20 20 20 20  int nPg,        
212c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
212d0 2f 2a 20 50 61 67 65 73 20 6f 66 20 77 6f 72 6b  /* Pages of work
212e0 20 74 6f 20 64 6f 20 2a 2f 0a 20 20 69 6e 74 20   to do */.  int 
212f0 6e 4d 69 6e 20 20 20 20 20 20 20 20 20 20 20 20  nMin            
21300 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
21310 69 6e 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66  inimum number of
21320 20 73 65 67 6d 65 6e 74 73 20 74 6f 20 6d 65 72   segments to mer
21330 67 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e  ge */.){.  int n
21340 52 65 6d 20 3d 20 6e 50 67 3b 0a 20 20 69 6e 74  Rem = nPg;.  int
21350 20 62 52 65 74 20 3d 20 30 3b 0a 20 20 46 74 73   bRet = 0;.  Fts
21360 35 53 74 72 75 63 74 75 72 65 20 2a 70 53 74 72  5Structure *pStr
21370 75 63 74 20 3d 20 2a 70 70 53 74 72 75 63 74 3b  uct = *ppStruct;
21380 0a 20 20 77 68 69 6c 65 28 20 6e 52 65 6d 3e 30  .  while( nRem>0
21390 20 26 26 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54   && p->rc==SQLIT
213a0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 6e 74 20  E_OK ){.    int 
213b0 69 4c 76 6c 3b 20 20 20 20 20 20 20 20 20 20 20  iLvl;           
213c0 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 20 69 74          /* To it
213d0 65 72 61 74 65 20 74 68 72 6f 75 67 68 20 6c 65  erate through le
213e0 76 65 6c 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20  vels */.    int 
213f0 69 42 65 73 74 4c 76 6c 20 3d 20 30 3b 20 20 20  iBestLvl = 0;   
21400 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 76 65 6c          /* Level
21410 20 6f 66 66 65 72 69 6e 67 20 74 68 65 20 6d 6f   offering the mo
21420 73 74 20 69 6e 70 75 74 20 73 65 67 6d 65 6e 74  st input segment
21430 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 42 65  s */.    int nBe
21440 73 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  st = 0;         
21450 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
21460 66 20 69 6e 70 75 74 20 73 65 67 6d 65 6e 74 73  f input segments
21470 20 6f 6e 20 62 65 73 74 20 6c 65 76 65 6c 20 2a   on best level *
21480 2f 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20 69 42  /..    /* Set iB
21490 65 73 74 4c 76 6c 20 74 6f 20 74 68 65 20 6c 65  estLvl to the le
214a0 76 65 6c 20 74 6f 20 72 65 61 64 20 69 6e 70 75  vel to read inpu
214b0 74 20 73 65 67 6d 65 6e 74 73 20 66 72 6f 6d 2e  t segments from.
214c0 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
214d0 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 3e  pStruct->nLevel>
214e0 30 20 29 3b 0a 20 20 20 20 66 6f 72 28 69 4c 76  0 );.    for(iLv
214f0 6c 3d 30 3b 20 69 4c 76 6c 3c 70 53 74 72 75 63  l=0; iLvl<pStruc
21500 74 2d 3e 6e 4c 65 76 65 6c 3b 20 69 4c 76 6c 2b  t->nLevel; iLvl+
21510 2b 29 7b 0a 20 20 20 20 20 20 46 74 73 35 53 74  +){.      Fts5St
21520 72 75 63 74 75 72 65 4c 65 76 65 6c 20 2a 70 4c  ructureLevel *pL
21530 76 6c 20 3d 20 26 70 53 74 72 75 63 74 2d 3e 61  vl = &pStruct->a
21540 4c 65 76 65 6c 5b 69 4c 76 6c 5d 3b 0a 20 20 20  Level[iLvl];.   
21550 20 20 20 69 66 28 20 70 4c 76 6c 2d 3e 6e 4d 65     if( pLvl->nMe
21560 72 67 65 20 29 7b 0a 20 20 20 20 20 20 20 20 69  rge ){.        i
21570 66 28 20 70 4c 76 6c 2d 3e 6e 4d 65 72 67 65 3e  f( pLvl->nMerge>
21580 6e 42 65 73 74 20 29 7b 0a 20 20 20 20 20 20 20  nBest ){.       
21590 20 20 20 69 42 65 73 74 4c 76 6c 20 3d 20 69 4c     iBestLvl = iL
215a0 76 6c 3b 0a 20 20 20 20 20 20 20 20 20 20 6e 42  vl;.          nB
215b0 65 73 74 20 3d 20 70 4c 76 6c 2d 3e 6e 4d 65 72  est = pLvl->nMer
215c0 67 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ge;.        }.  
215d0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
215e0 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70     }.      if( p
215f0 4c 76 6c 2d 3e 6e 53 65 67 3e 6e 42 65 73 74 20  Lvl->nSeg>nBest 
21600 29 7b 0a 20 20 20 20 20 20 20 20 6e 42 65 73 74  ){.        nBest
21610 20 3d 20 70 4c 76 6c 2d 3e 6e 53 65 67 3b 0a 20   = pLvl->nSeg;. 
21620 20 20 20 20 20 20 20 69 42 65 73 74 4c 76 6c 20         iBestLvl 
21630 3d 20 69 4c 76 6c 3b 0a 20 20 20 20 20 20 7d 0a  = iLvl;.      }.
21640 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66      }..    /* If
21650 20 6e 42 65 73 74 20 69 73 20 73 74 69 6c 6c 20   nBest is still 
21660 30 2c 20 74 68 65 6e 20 74 68 65 20 69 6e 64 65  0, then the inde
21670 78 20 6d 75 73 74 20 62 65 20 65 6d 70 74 79 2e  x must be empty.
21680 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54   */.#ifdef SQLIT
21690 45 5f 44 45 42 55 47 0a 20 20 20 20 66 6f 72 28  E_DEBUG.    for(
216a0 69 4c 76 6c 3d 30 3b 20 6e 42 65 73 74 3d 3d 30  iLvl=0; nBest==0
216b0 20 26 26 20 69 4c 76 6c 3c 70 53 74 72 75 63 74   && iLvl<pStruct
216c0 2d 3e 6e 4c 65 76 65 6c 3b 20 69 4c 76 6c 2b 2b  ->nLevel; iLvl++
216d0 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
216e0 20 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c   pStruct->aLevel
216f0 5b 69 4c 76 6c 5d 2e 6e 53 65 67 3d 3d 30 20 29  [iLvl].nSeg==0 )
21700 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  ;.    }.#endif..
21710 20 20 20 20 69 66 28 20 6e 42 65 73 74 3c 6e 4d      if( nBest<nM
21720 69 6e 20 26 26 20 70 53 74 72 75 63 74 2d 3e 61  in && pStruct->a
21730 4c 65 76 65 6c 5b 69 42 65 73 74 4c 76 6c 5d 2e  Level[iBestLvl].
21740 6e 4d 65 72 67 65 3d 3d 30 20 29 7b 0a 20 20 20  nMerge==0 ){.   
21750 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
21760 20 20 20 20 62 52 65 74 20 3d 20 31 3b 0a 20 20      bRet = 1;.  
21770 20 20 66 74 73 35 49 6e 64 65 78 4d 65 72 67 65    fts5IndexMerge
21780 4c 65 76 65 6c 28 70 2c 20 26 70 53 74 72 75 63  Level(p, &pStruc
21790 74 2c 20 69 42 65 73 74 4c 76 6c 2c 20 26 6e 52  t, iBestLvl, &nR
217a0 65 6d 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e  em);.    if( p->
217b0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
217c0 20 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c   pStruct->aLevel
217d0 5b 69 42 65 73 74 4c 76 6c 5d 2e 6e 4d 65 72 67  [iBestLvl].nMerg
217e0 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 66 74  e==0 ){.      ft
217f0 73 35 53 74 72 75 63 74 75 72 65 50 72 6f 6d 6f  s5StructurePromo
21800 74 65 28 70 2c 20 69 42 65 73 74 4c 76 6c 2b 31  te(p, iBestLvl+1
21810 2c 20 70 53 74 72 75 63 74 29 3b 0a 20 20 20 20  , pStruct);.    
21820 7d 0a 20 20 7d 0a 20 20 2a 70 70 53 74 72 75 63  }.  }.  *ppStruc
21830 74 20 3d 20 70 53 74 72 75 63 74 3b 0a 20 20 72  t = pStruct;.  r
21840 65 74 75 72 6e 20 62 52 65 74 3b 0a 7d 0a 0a 2f  eturn bRet;.}../
21850 2a 0a 2a 2a 20 41 20 74 6f 74 61 6c 20 6f 66 20  *.** A total of 
21860 6e 4c 65 61 66 20 6c 65 61 66 20 70 61 67 65 73  nLeaf leaf pages
21870 20 6f 66 20 64 61 74 61 20 68 61 73 20 6a 75 73   of data has jus
21880 74 20 62 65 65 6e 20 66 6c 75 73 68 65 64 20 74  t been flushed t
21890 6f 20 61 20 6c 65 76 65 6c 2d 30 0a 2a 2a 20 73  o a level-0.** s
218a0 65 67 6d 65 6e 74 2e 20 54 68 69 73 20 66 75 6e  egment. This fun
218b0 63 74 69 6f 6e 20 75 70 64 61 74 65 73 20 74 68  ction updates th
218c0 65 20 77 72 69 74 65 2d 63 6f 75 6e 74 65 72 20  e write-counter 
218d0 61 63 63 6f 72 64 69 6e 67 6c 79 20 61 6e 64 2c  accordingly and,
218e0 20 69 66 0a 2a 2a 20 6e 65 63 65 73 73 61 72 79   if.** necessary
218f0 2c 20 70 65 72 66 6f 72 6d 73 20 69 6e 63 72 65  , performs incre
21900 6d 65 6e 74 61 6c 20 6d 65 72 67 65 20 77 6f 72  mental merge wor
21910 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65  k..**.** If an e
21920 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 73 65 74  rror occurs, set
21930 20 74 68 65 20 46 74 73 35 49 6e 64 65 78 2e 72   the Fts5Index.r
21940 63 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 49 66  c error code. If
21950 20 61 6e 20 65 72 72 6f 72 20 68 61 73 20 0a 2a   an error has .*
21960 2a 20 61 6c 72 65 61 64 79 20 6f 63 63 75 72 72  * already occurr
21970 65 64 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ed, this functio
21980 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f  n is a no-op..*/
21990 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
219a0 35 49 6e 64 65 78 41 75 74 6f 6d 65 72 67 65 28  5IndexAutomerge(
219b0 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c  .  Fts5Index *p,
219c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
219d0 20 20 20 2f 2a 20 46 54 53 35 20 62 61 63 6b 65     /* FTS5 backe
219e0 6e 64 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 46  nd object */.  F
219f0 74 73 35 53 74 72 75 63 74 75 72 65 20 2a 2a 70  ts5Structure **p
21a00 70 53 74 72 75 63 74 2c 20 20 20 20 20 20 20 2f  pStruct,       /
21a10 2a 20 49 4e 2f 4f 55 54 3a 20 43 75 72 72 65 6e  * IN/OUT: Curren
21a20 74 20 73 74 72 75 63 74 75 72 65 20 6f 66 20 69  t structure of i
21a30 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20 6e 4c  ndex */.  int nL
21a40 65 61 66 20 20 20 20 20 20 20 20 20 20 20 20 20  eaf             
21a50 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
21a60 62 65 72 20 6f 66 20 6f 75 74 70 75 74 20 6c 65  ber of output le
21a70 61 76 65 73 20 6a 75 73 74 20 77 72 69 74 74 65  aves just writte
21a80 6e 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 70 2d  n */.){.  if( p-
21a90 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26  >rc==SQLITE_OK &
21aa0 26 20 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e 6e 41  & p->pConfig->nA
21ab0 75 74 6f 6d 65 72 67 65 3e 30 20 29 7b 0a 20 20  utomerge>0 ){.  
21ac0 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65 20    Fts5Structure 
21ad0 2a 70 53 74 72 75 63 74 20 3d 20 2a 70 70 53 74  *pStruct = *ppSt
21ae0 72 75 63 74 3b 0a 20 20 20 20 75 36 34 20 6e 57  ruct;.    u64 nW
21af0 72 69 74 65 3b 20 20 20 20 20 20 20 20 20 20 20  rite;           
21b00 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 69 74 69          /* Initi
21b10 61 6c 20 76 61 6c 75 65 20 6f 66 20 77 72 69 74  al value of writ
21b20 65 2d 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20  e-counter */.   
21b30 20 69 6e 74 20 6e 57 6f 72 6b 3b 20 20 20 20 20   int nWork;     
21b40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
21b50 2a 20 4e 75 6d 62 65 72 20 6f 66 20 77 6f 72 6b  * Number of work
21b60 2d 71 75 61 6e 74 61 20 74 6f 20 70 65 72 66 6f  -quanta to perfo
21b70 72 6d 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 52  rm */.    int nR
21b80 65 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  em;             
21b90 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
21ba0 72 20 6f 66 20 6c 65 61 66 20 70 61 67 65 73 20  r of leaf pages 
21bb0 6c 65 66 74 20 74 6f 20 77 72 69 74 65 20 2a 2f  left to write */
21bc0 0a 0a 20 20 20 20 2f 2a 20 55 70 64 61 74 65 20  ..    /* Update 
21bd0 74 68 65 20 77 72 69 74 65 2d 63 6f 75 6e 74 65  the write-counte
21be0 72 2e 20 57 68 69 6c 65 20 64 6f 69 6e 67 20 73  r. While doing s
21bf0 6f 2c 20 73 65 74 20 6e 57 6f 72 6b 2e 20 2a 2f  o, set nWork. */
21c00 0a 20 20 20 20 6e 57 72 69 74 65 20 3d 20 70 53  .    nWrite = pS
21c10 74 72 75 63 74 2d 3e 6e 57 72 69 74 65 43 6f 75  truct->nWriteCou
21c20 6e 74 65 72 3b 0a 20 20 20 20 6e 57 6f 72 6b 20  nter;.    nWork 
21c30 3d 20 28 69 6e 74 29 28 28 28 6e 57 72 69 74 65  = (int)(((nWrite
21c40 20 2b 20 6e 4c 65 61 66 29 20 2f 20 70 2d 3e 6e   + nLeaf) / p->n
21c50 57 6f 72 6b 55 6e 69 74 29 20 2d 20 28 6e 57 72  WorkUnit) - (nWr
21c60 69 74 65 20 2f 20 70 2d 3e 6e 57 6f 72 6b 55 6e  ite / p->nWorkUn
21c70 69 74 29 29 3b 0a 20 20 20 20 70 53 74 72 75 63  it));.    pStruc
21c80 74 2d 3e 6e 57 72 69 74 65 43 6f 75 6e 74 65 72  t->nWriteCounter
21c90 20 2b 3d 20 6e 4c 65 61 66 3b 0a 20 20 20 20 6e   += nLeaf;.    n
21ca0 52 65 6d 20 3d 20 28 69 6e 74 29 28 70 2d 3e 6e  Rem = (int)(p->n
21cb0 57 6f 72 6b 55 6e 69 74 20 2a 20 6e 57 6f 72 6b  WorkUnit * nWork
21cc0 20 2a 20 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76   * pStruct->nLev
21cd0 65 6c 29 3b 0a 0a 20 20 20 20 66 74 73 35 49 6e  el);..    fts5In
21ce0 64 65 78 4d 65 72 67 65 28 70 2c 20 70 70 53 74  dexMerge(p, ppSt
21cf0 72 75 63 74 2c 20 6e 52 65 6d 2c 20 70 2d 3e 70  ruct, nRem, p->p
21d00 43 6f 6e 66 69 67 2d 3e 6e 41 75 74 6f 6d 65 72  Config->nAutomer
21d10 67 65 29 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74  ge);.  }.}..stat
21d20 69 63 20 76 6f 69 64 20 66 74 73 35 49 6e 64 65  ic void fts5Inde
21d30 78 43 72 69 73 69 73 6d 65 72 67 65 28 0a 20 20  xCrisismerge(.  
21d40 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 20 20  Fts5Index *p,   
21d50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21d60 2f 2a 20 46 54 53 35 20 62 61 63 6b 65 6e 64 20  /* FTS5 backend 
21d70 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 46 74 73 35  object */.  Fts5
21d80 53 74 72 75 63 74 75 72 65 20 2a 2a 70 70 53 74  Structure **ppSt
21d90 72 75 63 74 20 20 20 20 20 20 20 20 2f 2a 20 49  ruct        /* I
21da0 4e 2f 4f 55 54 3a 20 43 75 72 72 65 6e 74 20 73  N/OUT: Current s
21db0 74 72 75 63 74 75 72 65 20 6f 66 20 69 6e 64 65  tructure of inde
21dc0 78 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20  x */.){.  const 
21dd0 69 6e 74 20 6e 43 72 69 73 69 73 20 3d 20 70 2d  int nCrisis = p-
21de0 3e 70 43 6f 6e 66 69 67 2d 3e 6e 43 72 69 73 69  >pConfig->nCrisi
21df0 73 4d 65 72 67 65 3b 0a 20 20 46 74 73 35 53 74  sMerge;.  Fts5St
21e00 72 75 63 74 75 72 65 20 2a 70 53 74 72 75 63 74  ructure *pStruct
21e10 20 3d 20 2a 70 70 53 74 72 75 63 74 3b 0a 20 20   = *ppStruct;.  
21e20 69 6e 74 20 69 4c 76 6c 20 3d 20 30 3b 0a 0a 20  int iLvl = 0;.. 
21e30 20 61 73 73 65 72 74 28 20 70 2d 3e 72 63 21 3d   assert( p->rc!=
21e40 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 53 74  SQLITE_OK || pSt
21e50 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 3e 30 20 29  ruct->nLevel>0 )
21e60 3b 0a 20 20 77 68 69 6c 65 28 20 70 2d 3e 72 63  ;.  while( p->rc
21e70 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70  ==SQLITE_OK && p
21e80 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69  Struct->aLevel[i
21e90 4c 76 6c 5d 2e 6e 53 65 67 3e 3d 6e 43 72 69 73  Lvl].nSeg>=nCris
21ea0 69 73 20 29 7b 0a 20 20 20 20 66 74 73 35 49 6e  is ){.    fts5In
21eb0 64 65 78 4d 65 72 67 65 4c 65 76 65 6c 28 70 2c  dexMergeLevel(p,
21ec0 20 26 70 53 74 72 75 63 74 2c 20 69 4c 76 6c 2c   &pStruct, iLvl,
21ed0 20 30 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28   0);.    assert(
21ee0 20 70 2d 3e 72 63 21 3d 53 51 4c 49 54 45 5f 4f   p->rc!=SQLITE_O
21ef0 4b 20 7c 7c 20 70 53 74 72 75 63 74 2d 3e 6e 4c  K || pStruct->nL
21f00 65 76 65 6c 3e 28 69 4c 76 6c 2b 31 29 20 29 3b  evel>(iLvl+1) );
21f10 0a 20 20 20 20 66 74 73 35 53 74 72 75 63 74 75  .    fts5Structu
21f20 72 65 50 72 6f 6d 6f 74 65 28 70 2c 20 69 4c 76  rePromote(p, iLv
21f30 6c 2b 31 2c 20 70 53 74 72 75 63 74 29 3b 0a 20  l+1, pStruct);. 
21f40 20 20 20 69 4c 76 6c 2b 2b 3b 0a 20 20 7d 0a 20     iLvl++;.  }. 
21f50 20 2a 70 70 53 74 72 75 63 74 20 3d 20 70 53 74   *ppStruct = pSt
21f60 72 75 63 74 3b 0a 7d 0a 0a 73 74 61 74 69 63 20  ruct;.}..static 
21f70 69 6e 74 20 66 74 73 35 49 6e 64 65 78 52 65 74  int fts5IndexRet
21f80 75 72 6e 28 46 74 73 35 49 6e 64 65 78 20 2a 70  urn(Fts5Index *p
21f90 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 70 2d  ){.  int rc = p-
21fa0 3e 72 63 3b 0a 20 20 70 2d 3e 72 63 20 3d 20 53  >rc;.  p->rc = S
21fb0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 72 65 74 75  QLITE_OK;.  retu
21fc0 72 6e 20 72 63 3b 0a 7d 0a 0a 74 79 70 65 64 65  rn rc;.}..typede
21fd0 66 20 73 74 72 75 63 74 20 46 74 73 35 46 6c 75  f struct Fts5Flu
21fe0 73 68 43 74 78 20 46 74 73 35 46 6c 75 73 68 43  shCtx Fts5FlushC
21ff0 74 78 3b 0a 73 74 72 75 63 74 20 46 74 73 35 46  tx;.struct Fts5F
22000 6c 75 73 68 43 74 78 20 7b 0a 20 20 46 74 73 35  lushCtx {.  Fts5
22010 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20 46  Index *pIdx;.  F
22020 74 73 35 53 65 67 57 72 69 74 65 72 20 77 72 69  ts5SegWriter wri
22030 74 65 72 3b 20 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  ter; .};../*.** 
22040 42 75 66 66 65 72 20 61 42 75 66 5b 5d 20 63 6f  Buffer aBuf[] co
22050 6e 74 61 69 6e 73 20 61 20 6c 69 73 74 20 6f 66  ntains a list of
22060 20 76 61 72 69 6e 74 73 2c 20 61 6c 6c 20 73 6d   varints, all sm
22070 61 6c 6c 20 65 6e 6f 75 67 68 20 74 6f 20 66 69  all enough to fi
22080 74 0a 2a 2a 20 69 6e 20 61 20 33 32 2d 62 69 74  t.** in a 32-bit
22090 20 69 6e 74 65 67 65 72 2e 20 52 65 74 75 72 6e   integer. Return
220a0 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
220b0 20 6c 61 72 67 65 73 74 20 70 72 65 66 69 78 20   largest prefix 
220c0 6f 66 20 74 68 69 73 20 0a 2a 2a 20 6c 69 73 74  of this .** list
220d0 20 6e 4d 61 78 20 62 79 74 65 73 20 6f 72 20 6c   nMax bytes or l
220e0 65 73 73 20 69 6e 20 73 69 7a 65 2e 0a 2a 2f 0a  ess in size..*/.
220f0 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 35 50  static int fts5P
22100 6f 73 6c 69 73 74 50 72 65 66 69 78 28 63 6f 6e  oslistPrefix(con
22110 73 74 20 75 38 20 2a 61 42 75 66 2c 20 69 6e 74  st u8 *aBuf, int
22120 20 6e 4d 61 78 29 7b 0a 20 20 69 6e 74 20 72 65   nMax){.  int re
22130 74 3b 0a 20 20 75 33 32 20 64 75 6d 6d 79 3b 0a  t;.  u32 dummy;.
22140 20 20 72 65 74 20 3d 20 66 74 73 35 47 65 74 56    ret = fts5GetV
22150 61 72 69 6e 74 33 32 28 61 42 75 66 2c 20 64 75  arint32(aBuf, du
22160 6d 6d 79 29 3b 0a 20 20 69 66 28 20 72 65 74 3c  mmy);.  if( ret<
22170 6e 4d 61 78 20 29 7b 0a 20 20 20 20 77 68 69 6c  nMax ){.    whil
22180 65 28 20 31 20 29 7b 0a 20 20 20 20 20 20 69 6e  e( 1 ){.      in
22190 74 20 69 20 3d 20 66 74 73 35 47 65 74 56 61 72  t i = fts5GetVar
221a0 69 6e 74 33 32 28 26 61 42 75 66 5b 72 65 74 5d  int32(&aBuf[ret]
221b0 2c 20 64 75 6d 6d 79 29 3b 0a 20 20 20 20 20 20  , dummy);.      
221c0 69 66 28 20 28 72 65 74 20 2b 20 69 29 20 3e 20  if( (ret + i) > 
221d0 6e 4d 61 78 20 29 20 62 72 65 61 6b 3b 0a 20 20  nMax ) break;.  
221e0 20 20 20 20 72 65 74 20 2b 3d 20 69 3b 0a 20 20      ret += i;.  
221f0 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
22200 20 72 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46   ret;.}../*.** F
22210 6c 75 73 68 20 74 68 65 20 63 6f 6e 74 65 6e 74  lush the content
22220 73 20 6f 66 20 69 6e 2d 6d 65 6d 6f 72 79 20 68  s of in-memory h
22230 61 73 68 20 74 61 62 6c 65 20 69 48 61 73 68 20  ash table iHash 
22240 74 6f 20 61 20 6e 65 77 20 6c 65 76 65 6c 2d 30  to a new level-0
22250 20 0a 2a 2a 20 73 65 67 6d 65 6e 74 20 6f 6e 20   .** segment on 
22260 64 69 73 6b 2e 20 41 6c 73 6f 20 75 70 64 61 74  disk. Also updat
22270 65 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64  e the correspond
22280 69 6e 67 20 73 74 72 75 63 74 75 72 65 20 72 65  ing structure re
22290 63 6f 72 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  cord..**.** If a
222a0 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  n error occurs, 
222b0 73 65 74 20 74 68 65 20 46 74 73 35 49 6e 64 65  set the Fts5Inde
222c0 78 2e 72 63 20 65 72 72 6f 72 20 63 6f 64 65 2e  x.rc error code.
222d0 20 49 66 20 61 6e 20 65 72 72 6f 72 20 68 61 73   If an error has
222e0 20 0a 2a 2a 20 61 6c 72 65 61 64 79 20 6f 63 63   .** already occ
222f0 75 72 72 65 64 2c 20 74 68 69 73 20 66 75 6e 63  urred, this func
22300 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  tion is a no-op.
22310 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
22320 66 74 73 35 46 6c 75 73 68 4f 6e 65 48 61 73 68  fts5FlushOneHash
22330 28 46 74 73 35 49 6e 64 65 78 20 2a 70 29 7b 0a  (Fts5Index *p){.
22340 20 20 46 74 73 35 48 61 73 68 20 2a 70 48 61 73    Fts5Hash *pHas
22350 68 20 3d 20 70 2d 3e 70 48 61 73 68 3b 0a 20 20  h = p->pHash;.  
22360 46 74 73 35 53 74 72 75 63 74 75 72 65 20 2a 70  Fts5Structure *p
22370 53 74 72 75 63 74 3b 0a 20 20 69 6e 74 20 69 53  Struct;.  int iS
22380 65 67 69 64 3b 0a 20 20 69 6e 74 20 70 67 6e 6f  egid;.  int pgno
22390 4c 61 73 74 20 3d 20 30 3b 20 20 20 20 20 20 20  Last = 0;       
223a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 61 73            /* Las
223b0 74 20 6c 65 61 66 20 70 61 67 65 20 6e 75 6d 62  t leaf page numb
223c0 65 72 20 69 6e 20 73 65 67 6d 65 6e 74 20 2a 2f  er in segment */
223d0 0a 0a 20 20 2f 2a 20 4f 62 74 61 69 6e 20 61 20  ..  /* Obtain a 
223e0 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65  reference to the
223f0 20 69 6e 64 65 78 20 73 74 72 75 63 74 75 72 65   index structure
22400 20 61 6e 64 20 61 6c 6c 6f 63 61 74 65 20 61 20   and allocate a 
22410 6e 65 77 20 73 65 67 6d 65 6e 74 2d 69 64 0a 20  new segment-id. 
22420 20 2a 2a 20 66 6f 72 20 74 68 65 20 6e 65 77 20   ** for the new 
22430 6c 65 76 65 6c 2d 30 20 73 65 67 6d 65 6e 74 2e  level-0 segment.
22440 20 20 2a 2f 0a 20 20 70 53 74 72 75 63 74 20 3d    */.  pStruct =
22450 20 66 74 73 35 53 74 72 75 63 74 75 72 65 52 65   fts5StructureRe
22460 61 64 28 70 29 3b 0a 20 20 69 53 65 67 69 64 20  ad(p);.  iSegid 
22470 3d 20 66 74 73 35 41 6c 6c 6f 63 61 74 65 53 65  = fts5AllocateSe
22480 67 69 64 28 70 2c 20 70 53 74 72 75 63 74 29 3b  gid(p, pStruct);
22490 0a 20 20 66 74 73 35 53 74 72 75 63 74 75 72 65  .  fts5Structure
224a0 49 6e 76 61 6c 69 64 61 74 65 28 70 29 3b 0a 0a  Invalidate(p);..
224b0 20 20 69 66 28 20 69 53 65 67 69 64 20 29 7b 0a    if( iSegid ){.
224c0 20 20 20 20 63 6f 6e 73 74 20 69 6e 74 20 70 67      const int pg
224d0 73 7a 20 3d 20 70 2d 3e 70 43 6f 6e 66 69 67 2d  sz = p->pConfig-
224e0 3e 70 67 73 7a 3b 0a 20 20 20 20 69 6e 74 20 65  >pgsz;.    int e
224f0 44 65 74 61 69 6c 20 3d 20 70 2d 3e 70 43 6f 6e  Detail = p->pCon
22500 66 69 67 2d 3e 65 44 65 74 61 69 6c 3b 0a 20 20  fig->eDetail;.  
22510 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65 53    Fts5StructureS
22520 65 67 6d 65 6e 74 20 2a 70 53 65 67 3b 20 20 20  egment *pSeg;   
22530 2f 2a 20 4e 65 77 20 73 65 67 6d 65 6e 74 20 77  /* New segment w
22540 69 74 68 69 6e 20 70 53 74 72 75 63 74 20 2a 2f  ithin pStruct */
22550 0a 20 20 20 20 46 74 73 35 42 75 66 66 65 72 20  .    Fts5Buffer 
22560 2a 70 42 75 66 3b 20 20 20 20 20 20 20 20 20 20  *pBuf;          
22570 20 20 20 2f 2a 20 42 75 66 66 65 72 20 69 6e 20     /* Buffer in 
22580 77 68 69 63 68 20 74 6f 20 61 73 73 65 6d 62 6c  which to assembl
22590 65 20 6c 65 61 66 20 70 61 67 65 20 2a 2f 0a 20  e leaf page */. 
225a0 20 20 20 46 74 73 35 42 75 66 66 65 72 20 2a 70     Fts5Buffer *p
225b0 50 67 69 64 78 3b 20 20 20 20 20 20 20 20 20 20  Pgidx;          
225c0 20 2f 2a 20 42 75 66 66 65 72 20 69 6e 20 77 68   /* Buffer in wh
225d0 69 63 68 20 74 6f 20 61 73 73 65 6d 62 6c 65 20  ich to assemble 
225e0 70 67 69 64 78 20 2a 2f 0a 0a 20 20 20 20 46 74  pgidx */..    Ft
225f0 73 35 53 65 67 57 72 69 74 65 72 20 77 72 69 74  s5SegWriter writ
22600 65 72 3b 0a 20 20 20 20 66 74 73 35 57 72 69 74  er;.    fts5Writ
22610 65 49 6e 69 74 28 70 2c 20 26 77 72 69 74 65 72  eInit(p, &writer
22620 2c 20 69 53 65 67 69 64 29 3b 0a 0a 20 20 20 20  , iSegid);..    
22630 70 42 75 66 20 3d 20 26 77 72 69 74 65 72 2e 77  pBuf = &writer.w
22640 72 69 74 65 72 2e 62 75 66 3b 0a 20 20 20 20 70  riter.buf;.    p
22650 50 67 69 64 78 20 3d 20 26 77 72 69 74 65 72 2e  Pgidx = &writer.
22660 77 72 69 74 65 72 2e 70 67 69 64 78 3b 0a 0a 20  writer.pgidx;.. 
22670 20 20 20 2f 2a 20 66 74 73 35 57 72 69 74 65 49     /* fts5WriteI
22680 6e 69 74 28 29 20 73 68 6f 75 6c 64 20 68 61 76  nit() should hav
22690 65 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 68  e initialized th
226a0 65 20 62 75 66 66 65 72 73 20 74 6f 20 28 6d 6f  e buffers to (mo
226b0 73 74 20 6c 69 6b 65 6c 79 29 0a 20 20 20 20 2a  st likely).    *
226c0 2a 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 73 70  * the maximum sp
226d0 61 63 65 20 72 65 71 75 69 72 65 64 2e 20 2a 2f  ace required. */
226e0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e  .    assert( p->
226f0 72 63 20 7c 7c 20 70 42 75 66 2d 3e 6e 53 70 61  rc || pBuf->nSpa
22700 63 65 3e 3d 28 70 67 73 7a 20 2b 20 46 54 53 35  ce>=(pgsz + FTS5
22710 5f 44 41 54 41 5f 50 41 44 44 49 4e 47 29 20 29  _DATA_PADDING) )
22720 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d  ;.    assert( p-
22730 3e 72 63 20 7c 7c 20 70 50 67 69 64 78 2d 3e 6e  >rc || pPgidx->n
22740 53 70 61 63 65 3e 3d 28 70 67 73 7a 20 2b 20 46  Space>=(pgsz + F
22750 54 53 35 5f 44 41 54 41 5f 50 41 44 44 49 4e 47  TS5_DATA_PADDING
22760 29 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 42 65 67  ) );..    /* Beg
22770 69 6e 20 73 63 61 6e 6e 69 6e 67 20 74 68 72 6f  in scanning thro
22780 75 67 68 20 68 61 73 68 20 74 61 62 6c 65 20 65  ugh hash table e
22790 6e 74 72 69 65 73 2e 20 54 68 69 73 20 6c 6f 6f  ntries. This loo
227a0 70 20 72 75 6e 73 20 6f 6e 63 65 20 66 6f 72 20  p runs once for 
227b0 65 61 63 68 0a 20 20 20 20 2a 2a 20 74 65 72 6d  each.    ** term
227c0 2f 64 6f 63 6c 69 73 74 20 63 75 72 72 65 6e 74  /doclist current
227d0 6c 79 20 73 74 6f 72 65 64 20 77 69 74 68 69 6e  ly stored within
227e0 20 74 68 65 20 68 61 73 68 20 74 61 62 6c 65 2e   the hash table.
227f0 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e 72   */.    if( p->r
22800 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
22810 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 73 71        p->rc = sq
22820 6c 69 74 65 33 46 74 73 35 48 61 73 68 53 63 61  lite3Fts5HashSca
22830 6e 49 6e 69 74 28 70 48 61 73 68 2c 20 30 2c 20  nInit(pHash, 0, 
22840 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 77 68  0);.    }.    wh
22850 69 6c 65 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49  ile( p->rc==SQLI
22860 54 45 5f 4f 4b 20 26 26 20 30 3d 3d 73 71 6c 69  TE_OK && 0==sqli
22870 74 65 33 46 74 73 35 48 61 73 68 53 63 61 6e 45  te3Fts5HashScanE
22880 6f 66 28 70 48 61 73 68 29 20 29 7b 0a 20 20 20  of(pHash) ){.   
22890 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
228a0 54 65 72 6d 3b 20 20 20 20 20 20 20 20 20 20 2f  Term;          /
228b0 2a 20 42 75 66 66 65 72 20 63 6f 6e 74 61 69 6e  * Buffer contain
228c0 69 6e 67 20 74 65 72 6d 20 2a 2f 0a 20 20 20 20  ing term */.    
228d0 20 20 63 6f 6e 73 74 20 75 38 20 2a 70 44 6f 63    const u8 *pDoc
228e0 6c 69 73 74 3b 20 20 20 20 20 20 20 20 20 2f 2a  list;         /*
228f0 20 50 6f 69 6e 74 65 72 20 74 6f 20 64 6f 63 6c   Pointer to docl
22900 69 73 74 20 66 6f 72 20 74 68 69 73 20 74 65 72  ist for this ter
22910 6d 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e  m */.      int n
22920 44 6f 63 6c 69 73 74 3b 20 20 20 20 20 20 20 20  Doclist;        
22930 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
22940 66 20 64 6f 63 6c 69 73 74 20 69 6e 20 62 79 74  f doclist in byt
22950 65 73 20 2a 2f 0a 0a 20 20 20 20 20 20 2f 2a 20  es */..      /* 
22960 57 72 69 74 65 20 74 68 65 20 74 65 72 6d 20 66  Write the term f
22970 6f 72 20 74 68 69 73 20 65 6e 74 72 79 20 74 6f  or this entry to
22980 20 64 69 73 6b 2e 20 2a 2f 0a 20 20 20 20 20 20   disk. */.      
22990 73 71 6c 69 74 65 33 46 74 73 35 48 61 73 68 53  sqlite3Fts5HashS
229a0 63 61 6e 45 6e 74 72 79 28 70 48 61 73 68 2c 20  canEntry(pHash, 
229b0 26 7a 54 65 72 6d 2c 20 26 70 44 6f 63 6c 69 73  &zTerm, &pDoclis
229c0 74 2c 20 26 6e 44 6f 63 6c 69 73 74 29 3b 0a 20  t, &nDoclist);. 
229d0 20 20 20 20 20 66 74 73 35 57 72 69 74 65 41 70       fts5WriteAp
229e0 70 65 6e 64 54 65 72 6d 28 70 2c 20 26 77 72 69  pendTerm(p, &wri
229f0 74 65 72 2c 20 28 69 6e 74 29 73 74 72 6c 65 6e  ter, (int)strlen
22a00 28 7a 54 65 72 6d 29 2c 20 28 63 6f 6e 73 74 20  (zTerm), (const 
22a10 75 38 2a 29 7a 54 65 72 6d 29 3b 0a 0a 20 20 20  u8*)zTerm);..   
22a20 20 20 20 61 73 73 65 72 74 28 20 77 72 69 74 65     assert( write
22a30 72 2e 62 46 69 72 73 74 52 6f 77 69 64 49 6e 50  r.bFirstRowidInP
22a40 61 67 65 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  age==0 );.      
22a50 69 66 28 20 70 67 73 7a 3e 3d 28 70 42 75 66 2d  if( pgsz>=(pBuf-
22a60 3e 6e 20 2b 20 70 50 67 69 64 78 2d 3e 6e 20 2b  >n + pPgidx->n +
22a70 20 6e 44 6f 63 6c 69 73 74 20 2b 20 31 29 20 29   nDoclist + 1) )
22a80 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  {.        /* The
22a90 20 65 6e 74 69 72 65 20 64 6f 63 6c 69 73 74 20   entire doclist 
22aa0 77 69 6c 6c 20 66 69 74 20 6f 6e 20 74 68 65 20  will fit on the 
22ab0 63 75 72 72 65 6e 74 20 6c 65 61 66 2e 20 2a 2f  current leaf. */
22ac0 0a 20 20 20 20 20 20 20 20 66 74 73 35 42 75 66  .        fts5Buf
22ad0 66 65 72 53 61 66 65 41 70 70 65 6e 64 42 6c 6f  ferSafeAppendBlo
22ae0 62 28 70 42 75 66 2c 20 70 44 6f 63 6c 69 73 74  b(pBuf, pDoclist
22af0 2c 20 6e 44 6f 63 6c 69 73 74 29 3b 0a 20 20 20  , nDoclist);.   
22b00 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
22b10 20 20 69 36 34 20 69 52 6f 77 69 64 20 3d 20 30    i64 iRowid = 0
22b20 3b 0a 20 20 20 20 20 20 20 20 69 36 34 20 69 44  ;.        i64 iD
22b30 65 6c 74 61 20 3d 20 30 3b 0a 20 20 20 20 20 20  elta = 0;.      
22b40 20 20 69 6e 74 20 69 4f 66 66 20 3d 20 30 3b 0a    int iOff = 0;.
22b50 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  .        /* The 
22b60 65 6e 74 69 72 65 20 64 6f 63 6c 69 73 74 20 77  entire doclist w
22b70 69 6c 6c 20 6e 6f 74 20 66 69 74 20 6f 6e 20 74  ill not fit on t
22b80 68 69 73 20 6c 65 61 66 2e 20 54 68 65 20 66 6f  his leaf. The fo
22b90 6c 6c 6f 77 69 6e 67 20 0a 20 20 20 20 20 20 20  llowing .       
22ba0 20 2a 2a 20 6c 6f 6f 70 20 69 74 65 72 61 74 65   ** loop iterate
22bb0 73 20 74 68 72 6f 75 67 68 20 74 68 65 20 70 6f  s through the po
22bc0 73 6c 69 73 74 73 20 74 68 61 74 20 6d 61 6b 65  slists that make
22bd0 20 75 70 20 74 68 65 20 63 75 72 72 65 6e 74 20   up the current 
22be0 0a 20 20 20 20 20 20 20 20 2a 2a 20 64 6f 63 6c  .        ** docl
22bf0 69 73 74 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20  ist.  */.       
22c00 20 77 68 69 6c 65 28 20 70 2d 3e 72 63 3d 3d 53   while( p->rc==S
22c10 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 4f 66 66  QLITE_OK && iOff
22c20 3c 6e 44 6f 63 6c 69 73 74 20 29 7b 0a 20 20 20  <nDoclist ){.   
22c30 20 20 20 20 20 20 20 69 4f 66 66 20 2b 3d 20 66         iOff += f
22c40 74 73 35 47 65 74 56 61 72 69 6e 74 28 26 70 44  ts5GetVarint(&pD
22c50 6f 63 6c 69 73 74 5b 69 4f 66 66 5d 2c 20 28 75  oclist[iOff], (u
22c60 36 34 2a 29 26 69 44 65 6c 74 61 29 3b 0a 20 20  64*)&iDelta);.  
22c70 20 20 20 20 20 20 20 20 69 52 6f 77 69 64 20 2b          iRowid +
22c80 3d 20 69 44 65 6c 74 61 3b 0a 20 20 20 20 20 20  = iDelta;.      
22c90 20 20 20 20 0a 20 20 20 20 20 20 20 20 20 20 69      .          i
22ca0 66 28 20 77 72 69 74 65 72 2e 62 46 69 72 73 74  f( writer.bFirst
22cb0 52 6f 77 69 64 49 6e 50 61 67 65 20 29 7b 0a 20  RowidInPage ){. 
22cc0 20 20 20 20 20 20 20 20 20 20 20 66 74 73 35 50             fts5P
22cd0 75 74 55 31 36 28 26 70 42 75 66 2d 3e 70 5b 30  utU16(&pBuf->p[0
22ce0 5d 2c 20 28 75 31 36 29 70 42 75 66 2d 3e 6e 29  ], (u16)pBuf->n)
22cf0 3b 20 20 20 2f 2a 20 66 69 72 73 74 20 72 6f 77  ;   /* first row
22d00 69 64 20 6f 6e 20 70 61 67 65 20 2a 2f 0a 20 20  id on page */.  
22d10 20 20 20 20 20 20 20 20 20 20 70 42 75 66 2d 3e            pBuf->
22d20 6e 20 2b 3d 20 73 71 6c 69 74 65 33 46 74 73 35  n += sqlite3Fts5
22d30 50 75 74 56 61 72 69 6e 74 28 26 70 42 75 66 2d  PutVarint(&pBuf-
22d40 3e 70 5b 70 42 75 66 2d 3e 6e 5d 2c 20 69 52 6f  >p[pBuf->n], iRo
22d50 77 69 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20  wid);.          
22d60 20 20 77 72 69 74 65 72 2e 62 46 69 72 73 74 52    writer.bFirstR
22d70 6f 77 69 64 49 6e 50 61 67 65 20 3d 20 30 3b 0a  owidInPage = 0;.
22d80 20 20 20 20 20 20 20 20 20 20 20 20 66 74 73 35              fts5
22d90 57 72 69 74 65 44 6c 69 64 78 41 70 70 65 6e 64  WriteDlidxAppend
22da0 28 70 2c 20 26 77 72 69 74 65 72 2c 20 69 52 6f  (p, &writer, iRo
22db0 77 69 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20  wid);.          
22dc0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
22dd0 20 20 20 70 42 75 66 2d 3e 6e 20 2b 3d 20 73 71     pBuf->n += sq
22de0 6c 69 74 65 33 46 74 73 35 50 75 74 56 61 72 69  lite3Fts5PutVari
22df0 6e 74 28 26 70 42 75 66 2d 3e 70 5b 70 42 75 66  nt(&pBuf->p[pBuf
22e00 2d 3e 6e 5d 2c 20 69 44 65 6c 74 61 29 3b 0a 20  ->n], iDelta);. 
22e10 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
22e20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 42 75       assert( pBu
22e30 66 2d 3e 6e 3c 3d 70 42 75 66 2d 3e 6e 53 70 61  f->n<=pBuf->nSpa
22e40 63 65 20 29 3b 0a 0a 20 20 20 20 20 20 20 20 20  ce );..         
22e50 20 69 66 28 20 65 44 65 74 61 69 6c 3d 3d 46 54   if( eDetail==FT
22e60 53 35 5f 44 45 54 41 49 4c 5f 4e 4f 4e 45 20 29  S5_DETAIL_NONE )
22e70 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  {.            if
22e80 28 20 69 4f 66 66 3c 6e 44 6f 63 6c 69 73 74 20  ( iOff<nDoclist 
22e90 26 26 20 70 44 6f 63 6c 69 73 74 5b 69 4f 66 66  && pDoclist[iOff
22ea0 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  ]==0 ){.        
22eb0 20 20 20 20 20 20 70 42 75 66 2d 3e 70 5b 70 42        pBuf->p[pB
22ec0 75 66 2d 3e 6e 2b 2b 5d 20 3d 20 30 3b 0a 20 20  uf->n++] = 0;.  
22ed0 20 20 20 20 20 20 20 20 20 20 20 20 69 4f 66 66              iOff
22ee0 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ++;.            
22ef0 20 20 69 66 28 20 69 4f 66 66 3c 6e 44 6f 63 6c    if( iOff<nDocl
22f00 69 73 74 20 26 26 20 70 44 6f 63 6c 69 73 74 5b  ist && pDoclist[
22f10 69 4f 66 66 5d 3d 3d 30 20 29 7b 0a 20 20 20 20  iOff]==0 ){.    
22f20 20 20 20 20 20 20 20 20 20 20 20 20 70 42 75 66              pBuf
22f30 2d 3e 70 5b 70 42 75 66 2d 3e 6e 2b 2b 5d 20 3d  ->p[pBuf->n++] =
22f40 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   0;.            
22f50 20 20 20 20 69 4f 66 66 2b 2b 3b 0a 20 20 20 20      iOff++;.    
22f60 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
22f70 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
22f80 20 20 20 20 20 20 69 66 28 20 28 70 42 75 66 2d        if( (pBuf-
22f90 3e 6e 20 2b 20 70 50 67 69 64 78 2d 3e 6e 29 3e  >n + pPgidx->n)>
22fa0 3d 70 67 73 7a 20 29 7b 0a 20 20 20 20 20 20 20  =pgsz ){.       
22fb0 20 20 20 20 20 20 20 66 74 73 35 57 72 69 74 65         fts5Write
22fc0 46 6c 75 73 68 4c 65 61 66 28 70 2c 20 26 77 72  FlushLeaf(p, &wr
22fd0 69 74 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20  iter);.         
22fe0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d     }.          }
22ff0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
23000 20 20 69 6e 74 20 62 44 75 6d 6d 79 3b 0a 20 20    int bDummy;.  
23010 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 6e 50            int nP
23020 6f 73 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  os;.            
23030 69 6e 74 20 6e 43 6f 70 79 20 3d 20 66 74 73 35  int nCopy = fts5
23040 47 65 74 50 6f 73 6c 69 73 74 53 69 7a 65 28 26  GetPoslistSize(&
23050 70 44 6f 63 6c 69 73 74 5b 69 4f 66 66 5d 2c 20  pDoclist[iOff], 
23060 26 6e 50 6f 73 2c 20 26 62 44 75 6d 6d 79 29 3b  &nPos, &bDummy);
23070 0a 20 20 20 20 20 20 20 20 20 20 20 20 6e 43 6f  .            nCo
23080 70 79 20 2b 3d 20 6e 50 6f 73 3b 0a 20 20 20 20  py += nPos;.    
23090 20 20 20 20 20 20 20 20 69 66 28 20 28 70 42 75          if( (pBu
230a0 66 2d 3e 6e 20 2b 20 70 50 67 69 64 78 2d 3e 6e  f->n + pPgidx->n
230b0 20 2b 20 6e 43 6f 70 79 29 20 3c 3d 20 70 67 73   + nCopy) <= pgs
230c0 7a 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  z ){.           
230d0 20 20 20 2f 2a 20 54 68 65 20 65 6e 74 69 72 65     /* The entire
230e0 20 70 6f 73 6c 69 73 74 20 77 69 6c 6c 20 66 69   poslist will fi
230f0 74 20 6f 6e 20 74 68 65 20 63 75 72 72 65 6e 74  t on the current
23100 20 6c 65 61 66 2e 20 53 6f 20 63 6f 70 79 0a 20   leaf. So copy. 
23110 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20               ** 
23120 69 74 20 69 6e 20 6f 6e 65 20 67 6f 2e 20 2a 2f  it in one go. */
23130 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66  .              f
23140 74 73 35 42 75 66 66 65 72 53 61 66 65 41 70 70  ts5BufferSafeApp
23150 65 6e 64 42 6c 6f 62 28 70 42 75 66 2c 20 26 70  endBlob(pBuf, &p
23160 44 6f 63 6c 69 73 74 5b 69 4f 66 66 5d 2c 20 6e  Doclist[iOff], n
23170 43 6f 70 79 29 3b 0a 20 20 20 20 20 20 20 20 20  Copy);.         
23180 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
23190 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 65          /* The e
231a0 6e 74 69 72 65 20 70 6f 73 6c 69 73 74 20 77 69  ntire poslist wi
231b0 6c 6c 20 6e 6f 74 20 66 69 74 20 6f 6e 20 74 68  ll not fit on th
231c0 69 73 20 6c 65 61 66 2e 20 53 6f 20 69 74 20 6e  is leaf. So it n
231d0 65 65 64 73 0a 20 20 20 20 20 20 20 20 20 20 20  eeds.           
231e0 20 20 20 2a 2a 20 74 6f 20 62 65 20 62 72 6f 6b     ** to be brok
231f0 65 6e 20 69 6e 74 6f 20 73 65 63 74 69 6f 6e 73  en into sections
23200 2e 20 54 68 65 20 6f 6e 6c 79 20 71 75 61 6c 69  . The only quali
23210 66 69 63 61 74 69 6f 6e 20 62 65 69 6e 67 0a 20  fication being. 
23220 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20               ** 
23230 74 68 61 74 20 65 61 63 68 20 76 61 72 69 6e 74  that each varint
23240 20 6d 75 73 74 20 62 65 20 73 74 6f 72 65 64 20   must be stored 
23250 63 6f 6e 74 69 67 75 6f 75 73 6c 79 2e 20 20 2a  contiguously.  *
23260 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /.              
23270 63 6f 6e 73 74 20 75 38 20 2a 70 50 6f 73 6c 69  const u8 *pPosli
23280 73 74 20 3d 20 26 70 44 6f 63 6c 69 73 74 5b 69  st = &pDoclist[i
23290 4f 66 66 5d 3b 0a 20 20 20 20 20 20 20 20 20 20  Off];.          
232a0 20 20 20 20 69 6e 74 20 69 50 6f 73 20 3d 20 30      int iPos = 0
232b0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
232c0 77 68 69 6c 65 28 20 70 2d 3e 72 63 3d 3d 53 51  while( p->rc==SQ
232d0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
232e0 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 6e             int n
232f0 53 70 61 63 65 20 3d 20 70 67 73 7a 20 2d 20 70  Space = pgsz - p
23300 42 75 66 2d 3e 6e 20 2d 20 70 50 67 69 64 78 2d  Buf->n - pPgidx-
23310 3e 6e 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  >n;.            
23320 20 20 20 20 69 6e 74 20 6e 20 3d 20 30 3b 0a 20      int n = 0;. 
23330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
23340 66 28 20 28 6e 43 6f 70 79 20 2d 20 69 50 6f 73  f( (nCopy - iPos
23350 29 3c 3d 6e 53 70 61 63 65 20 29 7b 0a 20 20 20  )<=nSpace ){.   
23360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6e                 n
23370 20 3d 20 6e 43 6f 70 79 20 2d 20 69 50 6f 73 3b   = nCopy - iPos;
23380 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
23390 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
233a0 20 20 20 20 20 20 20 20 20 20 6e 20 3d 20 66 74            n = ft
233b0 73 35 50 6f 73 6c 69 73 74 50 72 65 66 69 78 28  s5PoslistPrefix(
233c0 26 70 50 6f 73 6c 69 73 74 5b 69 50 6f 73 5d 2c  &pPoslist[iPos],
233d0 20 6e 53 70 61 63 65 29 3b 0a 20 20 20 20 20 20   nSpace);.      
233e0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
233f0 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73 65              asse
23400 72 74 28 20 6e 3e 30 20 29 3b 0a 20 20 20 20 20  rt( n>0 );.     
23410 20 20 20 20 20 20 20 20 20 20 20 66 74 73 35 42             fts5B
23420 75 66 66 65 72 53 61 66 65 41 70 70 65 6e 64 42  ufferSafeAppendB
23430 6c 6f 62 28 70 42 75 66 2c 20 26 70 50 6f 73 6c  lob(pBuf, &pPosl
23440 69 73 74 5b 69 50 6f 73 5d 2c 20 6e 29 3b 0a 20  ist[iPos], n);. 
23450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
23460 50 6f 73 20 2b 3d 20 6e 3b 0a 20 20 20 20 20 20  Pos += n;.      
23470 20 20 20 20 20 20 20 20 20 20 69 66 28 20 28 70            if( (p
23480 42 75 66 2d 3e 6e 20 2b 20 70 50 67 69 64 78 2d  Buf->n + pPgidx-
23490 3e 6e 29 3e 3d 70 67 73 7a 20 29 7b 0a 20 20 20  >n)>=pgsz ){.   
234a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66                 f
234b0 74 73 35 57 72 69 74 65 46 6c 75 73 68 4c 65 61  ts5WriteFlushLea
234c0 66 28 70 2c 20 26 77 72 69 74 65 72 29 3b 0a 20  f(p, &writer);. 
234d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
234e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
234f0 20 69 66 28 20 69 50 6f 73 3e 3d 6e 43 6f 70 79   if( iPos>=nCopy
23500 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
23510 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
23520 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
23530 20 20 20 20 69 4f 66 66 20 2b 3d 20 6e 43 6f 70      iOff += nCop
23540 79 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  y;.          }. 
23550 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
23560 0a 0a 20 20 20 20 20 20 2f 2a 20 54 4f 44 4f 32  ..      /* TODO2
23570 3a 20 44 6f 63 6c 69 73 74 20 74 65 72 6d 69 6e  : Doclist termin
23580 61 74 6f 72 20 77 72 69 74 74 65 6e 20 68 65 72  ator written her
23590 65 2e 20 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 70  e. */.      /* p
235a0 42 75 66 2d 3e 70 5b 70 42 75 66 2d 3e 6e 2b 2b  Buf->p[pBuf->n++
235b0 5d 20 3d 20 27 5c 30 27 3b 20 2a 2f 0a 20 20 20  ] = '\0'; */.   
235c0 20 20 20 61 73 73 65 72 74 28 20 70 42 75 66 2d     assert( pBuf-
235d0 3e 6e 3c 3d 70 42 75 66 2d 3e 6e 53 70 61 63 65  >n<=pBuf->nSpace
235e0 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   );.      sqlite
235f0 33 46 74 73 35 48 61 73 68 53 63 61 6e 4e 65 78  3Fts5HashScanNex
23600 74 28 70 48 61 73 68 29 3b 0a 20 20 20 20 7d 0a  t(pHash);.    }.
23610 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 48      sqlite3Fts5H
23620 61 73 68 43 6c 65 61 72 28 70 48 61 73 68 29 3b  ashClear(pHash);
23630 0a 20 20 20 20 66 74 73 35 57 72 69 74 65 46 69  .    fts5WriteFi
23640 6e 69 73 68 28 70 2c 20 26 77 72 69 74 65 72 2c  nish(p, &writer,
23650 20 26 70 67 6e 6f 4c 61 73 74 29 3b 0a 0a 20 20   &pgnoLast);..  
23660 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20    /* Update the 
23670 46 74 73 35 53 74 72 75 63 74 75 72 65 2e 20 49  Fts5Structure. I
23680 74 20 69 73 20 77 72 69 74 74 65 6e 20 62 61 63  t is written bac
23690 6b 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  k to the databas
236a0 65 20 62 79 20 74 68 65 0a 20 20 20 20 2a 2a 20  e by the.    ** 
236b0 66 74 73 35 53 74 72 75 63 74 75 72 65 52 65 6c  fts5StructureRel
236c0 65 61 73 65 28 29 20 63 61 6c 6c 20 62 65 6c 6f  ease() call belo
236d0 77 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70  w.  */.    if( p
236e0 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 3d 3d  Struct->nLevel==
236f0 30 20 29 7b 0a 20 20 20 20 20 20 66 74 73 35 53  0 ){.      fts5S
23700 74 72 75 63 74 75 72 65 41 64 64 4c 65 76 65 6c  tructureAddLevel
23710 28 26 70 2d 3e 72 63 2c 20 26 70 53 74 72 75 63  (&p->rc, &pStruc
23720 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 74  t);.    }.    ft
23730 73 35 53 74 72 75 63 74 75 72 65 45 78 74 65 6e  s5StructureExten
23740 64 4c 65 76 65 6c 28 26 70 2d 3e 72 63 2c 20 70  dLevel(&p->rc, p
23750 53 74 72 75 63 74 2c 20 30 2c 20 31 2c 20 30 29  Struct, 0, 1, 0)
23760 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d  ;.    if( p->rc=
23770 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
23780 20 20 20 20 70 53 65 67 20 3d 20 26 70 53 74 72      pSeg = &pStr
23790 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 30 5d 2e 61  uct->aLevel[0].a
237a0 53 65 67 5b 20 70 53 74 72 75 63 74 2d 3e 61 4c  Seg[ pStruct->aL
237b0 65 76 65 6c 5b 30 5d 2e 6e 53 65 67 2b 2b 20 5d  evel[0].nSeg++ ]
237c0 3b 0a 20 20 20 20 20 20 70 53 65 67 2d 3e 69 53  ;.      pSeg->iS
237d0 65 67 69 64 20 3d 20 69 53 65 67 69 64 3b 0a 20  egid = iSegid;. 
237e0 20 20 20 20 20 70 53 65 67 2d 3e 70 67 6e 6f 46       pSeg->pgnoF
237f0 69 72 73 74 20 3d 20 31 3b 0a 20 20 20 20 20 20  irst = 1;.      
23800 70 53 65 67 2d 3e 70 67 6e 6f 4c 61 73 74 20 3d  pSeg->pgnoLast =
23810 20 70 67 6e 6f 4c 61 73 74 3b 0a 20 20 20 20 20   pgnoLast;.     
23820 20 70 53 74 72 75 63 74 2d 3e 6e 53 65 67 6d 65   pStruct->nSegme
23830 6e 74 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  nt++;.    }.    
23840 66 74 73 35 53 74 72 75 63 74 75 72 65 50 72 6f  fts5StructurePro
23850 6d 6f 74 65 28 70 2c 20 30 2c 20 70 53 74 72 75  mote(p, 0, pStru
23860 63 74 29 3b 0a 20 20 7d 0a 0a 20 20 66 74 73 35  ct);.  }..  fts5
23870 49 6e 64 65 78 41 75 74 6f 6d 65 72 67 65 28 70  IndexAutomerge(p
23880 2c 20 26 70 53 74 72 75 63 74 2c 20 70 67 6e 6f  , &pStruct, pgno
23890 4c 61 73 74 29 3b 0a 20 20 66 74 73 35 49 6e 64  Last);.  fts5Ind
238a0 65 78 43 72 69 73 69 73 6d 65 72 67 65 28 70 2c  exCrisismerge(p,
238b0 20 26 70 53 74 72 75 63 74 29 3b 0a 20 20 66 74   &pStruct);.  ft
238c0 73 35 53 74 72 75 63 74 75 72 65 57 72 69 74 65  s5StructureWrite
238d0 28 70 2c 20 70 53 74 72 75 63 74 29 3b 0a 20 20  (p, pStruct);.  
238e0 66 74 73 35 53 74 72 75 63 74 75 72 65 52 65 6c  fts5StructureRel
238f0 65 61 73 65 28 70 53 74 72 75 63 74 29 3b 0a 7d  ease(pStruct);.}
23900 0a 0a 2f 2a 0a 2a 2a 20 46 6c 75 73 68 20 61 6e  ../*.** Flush an
23910 79 20 64 61 74 61 20 73 74 6f 72 65 64 20 69 6e  y data stored in
23920 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 68   the in-memory h
23930 61 73 68 20 74 61 62 6c 65 73 20 74 6f 20 74 68  ash tables to th
23940 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2f 0a 73  e database..*/.s
23950 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 49  tatic void fts5I
23960 6e 64 65 78 46 6c 75 73 68 28 46 74 73 35 49 6e  ndexFlush(Fts5In
23970 64 65 78 20 2a 70 29 7b 0a 20 20 2f 2a 20 55 6e  dex *p){.  /* Un
23980 6c 65 73 73 20 69 74 20 69 73 20 65 6d 70 74 79  less it is empty
23990 2c 20 66 6c 75 73 68 20 74 68 65 20 68 61 73 68  , flush the hash
239a0 20 74 61 62 6c 65 20 74 6f 20 64 69 73 6b 20 2a   table to disk *
239b0 2f 0a 20 20 69 66 28 20 70 2d 3e 6e 50 65 6e 64  /.  if( p->nPend
239c0 69 6e 67 44 61 74 61 20 29 7b 0a 20 20 20 20 61  ingData ){.    a
239d0 73 73 65 72 74 28 20 70 2d 3e 70 48 61 73 68 20  ssert( p->pHash 
239e0 29 3b 0a 20 20 20 20 70 2d 3e 6e 50 65 6e 64 69  );.    p->nPendi
239f0 6e 67 44 61 74 61 20 3d 20 30 3b 0a 20 20 20 20  ngData = 0;.    
23a00 66 74 73 35 46 6c 75 73 68 4f 6e 65 48 61 73 68  fts5FlushOneHash
23a10 28 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74  (p);.  }.}..stat
23a20 69 63 20 46 74 73 35 53 74 72 75 63 74 75 72 65  ic Fts5Structure
23a30 20 2a 66 74 73 35 49 6e 64 65 78 4f 70 74 69 6d   *fts5IndexOptim
23a40 69 7a 65 53 74 72 75 63 74 28 0a 20 20 46 74 73  izeStruct(.  Fts
23a50 35 49 6e 64 65 78 20 2a 70 2c 20 0a 20 20 46 74  5Index *p, .  Ft
23a60 73 35 53 74 72 75 63 74 75 72 65 20 2a 70 53 74  s5Structure *pSt
23a70 72 75 63 74 0a 29 7b 0a 20 20 46 74 73 35 53 74  ruct.){.  Fts5St
23a80 72 75 63 74 75 72 65 20 2a 70 4e 65 77 20 3d 20  ructure *pNew = 
23a90 30 3b 0a 20 20 69 6e 74 20 6e 42 79 74 65 20 3d  0;.  int nByte =
23aa0 20 73 69 7a 65 6f 66 28 46 74 73 35 53 74 72 75   sizeof(Fts5Stru
23ab0 63 74 75 72 65 29 3b 0a 20 20 69 6e 74 20 6e 53  cture);.  int nS
23ac0 65 67 20 3d 20 70 53 74 72 75 63 74 2d 3e 6e 53  eg = pStruct->nS
23ad0 65 67 6d 65 6e 74 3b 0a 20 20 69 6e 74 20 69 3b  egment;.  int i;
23ae0 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75  ..  /* Figure ou
23af0 74 20 69 66 20 74 68 69 73 20 73 74 72 75 63 74  t if this struct
23b00 75 72 65 20 72 65 71 75 69 72 65 73 20 6f 70 74  ure requires opt
23b10 69 6d 69 7a 61 74 69 6f 6e 2e 20 41 20 73 74 72  imization. A str
23b20 75 63 74 75 72 65 20 64 6f 65 73 0a 20 20 2a 2a  ucture does.  **
23b30 20 6e 6f 74 20 72 65 71 75 69 72 65 20 6f 70 74   not require opt
23b40 69 6d 69 7a 61 74 69 6f 6e 20 69 66 20 65 69 74  imization if eit
23b50 68 65 72 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  her:.  **.  **  
23b60 2b 20 69 74 20 63 6f 6e 73 69 73 74 73 20 6f 66  + it consists of
23b70 20 66 65 77 65 72 20 74 68 61 6e 20 74 77 6f 20   fewer than two 
23b80 73 65 67 6d 65 6e 74 73 2c 20 6f 72 20 0a 20 20  segments, or .  
23b90 2a 2a 20 20 2b 20 61 6c 6c 20 73 65 67 6d 65 6e  **  + all segmen
23ba0 74 73 20 61 72 65 20 6f 6e 20 74 68 65 20 73 61  ts are on the sa
23bb0 6d 65 20 6c 65 76 65 6c 2c 20 6f 72 0a 20 20 2a  me level, or.  *
23bc0 2a 20 20 2b 20 61 6c 6c 20 73 65 67 6d 65 6e 74  *  + all segment
23bd0 73 20 65 78 63 65 70 74 20 6f 6e 65 20 61 72 65  s except one are
23be0 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 70 75 74   currently input
23bf0 73 20 74 6f 20 61 20 6d 65 72 67 65 20 6f 70 65  s to a merge ope
23c00 72 61 74 69 6f 6e 2e 0a 20 20 2a 2a 0a 20 20 2a  ration..  **.  *
23c10 2a 20 49 6e 20 74 68 65 20 66 69 72 73 74 20 63  * In the first c
23c20 61 73 65 2c 20 72 65 74 75 72 6e 20 4e 55 4c 4c  ase, return NULL
23c30 2e 20 49 6e 20 74 68 65 20 73 65 63 6f 6e 64 2c  . In the second,
23c40 20 69 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 72   increment the r
23c50 65 66 2d 63 6f 75 6e 74 0a 20 20 2a 2a 20 6f 6e  ef-count.  ** on
23c60 20 2a 70 53 74 72 75 63 74 20 61 6e 64 20 72 65   *pStruct and re
23c70 74 75 72 6e 20 61 20 63 6f 70 79 20 6f 66 20 74  turn a copy of t
23c80 68 65 20 70 6f 69 6e 74 65 72 20 74 6f 20 69 74  he pointer to it
23c90 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6e 53 65  ..  */.  if( nSe
23ca0 67 3c 32 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  g<2 ) return 0;.
23cb0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 53 74    for(i=0; i<pSt
23cc0 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 3b 20 69 2b  ruct->nLevel; i+
23cd0 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6e 54 68 69  +){.    int nThi
23ce0 73 20 3d 20 70 53 74 72 75 63 74 2d 3e 61 4c 65  s = pStruct->aLe
23cf0 76 65 6c 5b 69 5d 2e 6e 53 65 67 3b 0a 20 20 20  vel[i].nSeg;.   
23d00 20 69 66 28 20 6e 54 68 69 73 3d 3d 6e 53 65 67   if( nThis==nSeg
23d10 20 7c 7c 20 28 6e 54 68 69 73 3d 3d 6e 53 65 67   || (nThis==nSeg
23d20 2d 31 20 26 26 20 70 53 74 72 75 63 74 2d 3e 61  -1 && pStruct->a
23d30 4c 65 76 65 6c 5b 69 5d 2e 6e 4d 65 72 67 65 3d  Level[i].nMerge=
23d40 3d 6e 54 68 69 73 29 20 29 7b 0a 20 20 20 20 20  =nThis) ){.     
23d50 20 66 74 73 35 53 74 72 75 63 74 75 72 65 52 65   fts5StructureRe
23d60 66 28 70 53 74 72 75 63 74 29 3b 0a 20 20 20 20  f(pStruct);.    
23d70 20 20 72 65 74 75 72 6e 20 70 53 74 72 75 63 74    return pStruct
23d80 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  ;.    }.    asse
23d90 72 74 28 20 70 53 74 72 75 63 74 2d 3e 61 4c 65  rt( pStruct->aLe
23da0 76 65 6c 5b 69 5d 2e 6e 4d 65 72 67 65 3c 3d 6e  vel[i].nMerge<=n
23db0 54 68 69 73 20 29 3b 0a 20 20 7d 0a 0a 20 20 6e  This );.  }..  n
23dc0 42 79 74 65 20 2b 3d 20 28 70 53 74 72 75 63 74  Byte += (pStruct
23dd0 2d 3e 6e 4c 65 76 65 6c 2b 31 29 20 2a 20 73 69  ->nLevel+1) * si
23de0 7a 65 6f 66 28 46 74 73 35 53 74 72 75 63 74 75  zeof(Fts5Structu
23df0 72 65 4c 65 76 65 6c 29 3b 0a 20 20 70 4e 65 77  reLevel);.  pNew
23e00 20 3d 20 28 46 74 73 35 53 74 72 75 63 74 75 72   = (Fts5Structur
23e10 65 2a 29 73 71 6c 69 74 65 33 46 74 73 35 4d 61  e*)sqlite3Fts5Ma
23e20 6c 6c 6f 63 5a 65 72 6f 28 26 70 2d 3e 72 63 2c  llocZero(&p->rc,
23e30 20 6e 42 79 74 65 29 3b 0a 0a 20 20 69 66 28 20   nByte);..  if( 
23e40 70 4e 65 77 20 29 7b 0a 20 20 20 20 46 74 73 35  pNew ){.    Fts5
23e50 53 74 72 75 63 74 75 72 65 4c 65 76 65 6c 20 2a  StructureLevel *
23e60 70 4c 76 6c 3b 0a 20 20 20 20 6e 42 79 74 65 20  pLvl;.    nByte 
23e70 3d 20 6e 53 65 67 20 2a 20 73 69 7a 65 6f 66 28  = nSeg * sizeof(
23e80 46 74 73 35 53 74 72 75 63 74 75 72 65 53 65 67  Fts5StructureSeg
23e90 6d 65 6e 74 29 3b 0a 20 20 20 20 70 4e 65 77 2d  ment);.    pNew-
23ea0 3e 6e 4c 65 76 65 6c 20 3d 20 70 53 74 72 75 63  >nLevel = pStruc
23eb0 74 2d 3e 6e 4c 65 76 65 6c 2b 31 3b 0a 20 20 20  t->nLevel+1;.   
23ec0 20 70 4e 65 77 2d 3e 6e 52 65 66 20 3d 20 31 3b   pNew->nRef = 1;
23ed0 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 57 72 69 74  .    pNew->nWrit
23ee0 65 43 6f 75 6e 74 65 72 20 3d 20 70 53 74 72 75  eCounter = pStru
23ef0 63 74 2d 3e 6e 57 72 69 74 65 43 6f 75 6e 74 65  ct->nWriteCounte
23f00 72 3b 0a 20 20 20 20 70 4c 76 6c 20 3d 20 26 70  r;.    pLvl = &p
23f10 4e 65 77 2d 3e 61 4c 65 76 65 6c 5b 70 53 74 72  New->aLevel[pStr
23f20 75 63 74 2d 3e 6e 4c 65 76 65 6c 5d 3b 0a 20 20  uct->nLevel];.  
23f30 20 20 70 4c 76 6c 2d 3e 61 53 65 67 20 3d 20 28    pLvl->aSeg = (
23f40 46 74 73 35 53 74 72 75 63 74 75 72 65 53 65 67  Fts5StructureSeg
23f50 6d 65 6e 74 2a 29 73 71 6c 69 74 65 33 46 74 73  ment*)sqlite3Fts
23f60 35 4d 61 6c 6c 6f 63 5a 65 72 6f 28 26 70 2d 3e  5MallocZero(&p->
23f70 72 63 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20 20  rc, nByte);.    
23f80 69 66 28 20 70 4c 76 6c 2d 3e 61 53 65 67 20 29  if( pLvl->aSeg )
23f90 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 4c 76 6c  {.      int iLvl
23fa0 2c 20 69 53 65 67 3b 0a 20 20 20 20 20 20 69 6e  , iSeg;.      in
23fb0 74 20 69 53 65 67 4f 75 74 20 3d 20 30 3b 0a 20  t iSegOut = 0;. 
23fc0 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74 65 20       /* Iterate 
23fd0 74 68 72 6f 75 67 68 20 61 6c 6c 20 73 65 67 6d  through all segm
23fe0 65 6e 74 73 2c 20 66 72 6f 6d 20 6f 6c 64 65 73  ents, from oldes
23ff0 74 20 74 6f 20 6e 65 77 65 73 74 2e 20 41 64 64  t to newest. Add
24000 20 74 68 65 6d 20 74 6f 0a 20 20 20 20 20 20 2a   them to.      *
24010 2a 20 74 68 65 20 6e 65 77 20 46 74 73 35 4c 65  * the new Fts5Le
24020 76 65 6c 20 6f 62 6a 65 63 74 20 73 6f 20 74 68  vel object so th
24030 61 74 20 70 4c 76 6c 2d 3e 61 53 65 67 5b 30 5d  at pLvl->aSeg[0]
24040 20 69 73 20 74 68 65 20 6f 6c 64 65 73 74 0a 20   is the oldest. 
24050 20 20 20 20 20 2a 2a 20 73 65 67 6d 65 6e 74 20       ** segment 
24060 69 6e 20 74 68 65 20 64 61 74 61 20 73 74 72 75  in the data stru
24070 63 74 75 72 65 2e 20 20 2a 2f 0a 20 20 20 20 20  cture.  */.     
24080 20 66 6f 72 28 69 4c 76 6c 3d 70 53 74 72 75 63   for(iLvl=pStruc
24090 74 2d 3e 6e 4c 65 76 65 6c 2d 31 3b 20 69 4c 76  t->nLevel-1; iLv
240a0 6c 3e 3d 30 3b 20 69 4c 76 6c 2d 2d 29 7b 0a 20  l>=0; iLvl--){. 
240b0 20 20 20 20 20 20 20 66 6f 72 28 69 53 65 67 3d         for(iSeg=
240c0 30 3b 20 69 53 65 67 3c 70 53 74 72 75 63 74 2d  0; iSeg<pStruct-
240d0 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d 2e 6e 53  >aLevel[iLvl].nS
240e0 65 67 3b 20 69 53 65 67 2b 2b 29 7b 0a 20 20 20  eg; iSeg++){.   
240f0 20 20 20 20 20 20 20 70 4c 76 6c 2d 3e 61 53 65         pLvl->aSe
24100 67 5b 69 53 65 67 4f 75 74 5d 20 3d 20 70 53 74  g[iSegOut] = pSt
24110 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76  ruct->aLevel[iLv
24120 6c 5d 2e 61 53 65 67 5b 69 53 65 67 5d 3b 0a 20  l].aSeg[iSeg];. 
24130 20 20 20 20 20 20 20 20 20 69 53 65 67 4f 75 74           iSegOut
24140 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ++;.        }.  
24150 20 20 20 20 7d 0a 20 20 20 20 20 20 70 4e 65 77      }.      pNew
24160 2d 3e 6e 53 65 67 6d 65 6e 74 20 3d 20 70 4c 76  ->nSegment = pLv
24170 6c 2d 3e 6e 53 65 67 20 3d 20 6e 53 65 67 3b 0a  l->nSeg = nSeg;.
24180 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
24190 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4e   sqlite3_free(pN
241a0 65 77 29 3b 0a 20 20 20 20 20 20 70 4e 65 77 20  ew);.      pNew 
241b0 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  = 0;.    }.  }..
241c0 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d    return pNew;.}
241d0 0a 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73  ..int sqlite3Fts
241e0 35 49 6e 64 65 78 4f 70 74 69 6d 69 7a 65 28 46  5IndexOptimize(F
241f0 74 73 35 49 6e 64 65 78 20 2a 70 29 7b 0a 20 20  ts5Index *p){.  
24200 46 74 73 35 53 74 72 75 63 74 75 72 65 20 2a 70  Fts5Structure *p
24210 53 74 72 75 63 74 3b 0a 20 20 46 74 73 35 53 74  Struct;.  Fts5St
24220 72 75 63 74 75 72 65 20 2a 70 4e 65 77 20 3d 20  ructure *pNew = 
24230 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 2d  0;..  assert( p-
24240 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  >rc==SQLITE_OK )
24250 3b 0a 20 20 66 74 73 35 49 6e 64 65 78 46 6c 75  ;.  fts5IndexFlu
24260 73 68 28 70 29 3b 0a 20 20 70 53 74 72 75 63 74  sh(p);.  pStruct
24270 20 3d 20 66 74 73 35 53 74 72 75 63 74 75 72 65   = fts5Structure
24280 52 65 61 64 28 70 29 3b 0a 20 20 66 74 73 35 53  Read(p);.  fts5S
24290 74 72 75 63 74 75 72 65 49 6e 76 61 6c 69 64 61  tructureInvalida
242a0 74 65 28 70 29 3b 0a 0a 20 20 69 66 28 20 70 53  te(p);..  if( pS
242b0 74 72 75 63 74 20 29 7b 0a 20 20 20 20 70 4e 65  truct ){.    pNe
242c0 77 20 3d 20 66 74 73 35 49 6e 64 65 78 4f 70 74  w = fts5IndexOpt
242d0 69 6d 69 7a 65 53 74 72 75 63 74 28 70 2c 20 70  imizeStruct(p, p
242e0 53 74 72 75 63 74 29 3b 0a 20 20 7d 0a 20 20 66  Struct);.  }.  f
242f0 74 73 35 53 74 72 75 63 74 75 72 65 52 65 6c 65  ts5StructureRele
24300 61 73 65 28 70 53 74 72 75 63 74 29 3b 0a 0a 20  ase(pStruct);.. 
24310 20 61 73 73 65 72 74 28 20 70 4e 65 77 3d 3d 30   assert( pNew==0
24320 20 7c 7c 20 70 4e 65 77 2d 3e 6e 53 65 67 6d 65   || pNew->nSegme
24330 6e 74 3e 30 20 29 3b 0a 20 20 69 66 28 20 70 4e  nt>0 );.  if( pN
24340 65 77 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 4c  ew ){.    int iL
24350 76 6c 3b 0a 20 20 20 20 66 6f 72 28 69 4c 76 6c  vl;.    for(iLvl
24360 3d 30 3b 20 70 4e 65 77 2d 3e 61 4c 65 76 65 6c  =0; pNew->aLevel
24370 5b 69 4c 76 6c 5d 2e 6e 53 65 67 3d 3d 30 3b 20  [iLvl].nSeg==0; 
24380 69 4c 76 6c 2b 2b 29 7b 7d 0a 20 20 20 20 77 68  iLvl++){}.    wh
24390 69 6c 65 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49  ile( p->rc==SQLI
243a0 54 45 5f 4f 4b 20 26 26 20 70 4e 65 77 2d 3e 61  TE_OK && pNew->a
243b0 4c 65 76 65 6c 5b 69 4c 76 6c 5d 2e 6e 53 65 67  Level[iLvl].nSeg
243c0 3e 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  >0 ){.      int 
243d0 6e 52 65 6d 20 3d 20 46 54 53 35 5f 4f 50 54 5f  nRem = FTS5_OPT_
243e0 57 4f 52 4b 5f 55 4e 49 54 3b 0a 20 20 20 20 20  WORK_UNIT;.     
243f0 20 66 74 73 35 49 6e 64 65 78 4d 65 72 67 65 4c   fts5IndexMergeL
24400 65 76 65 6c 28 70 2c 20 26 70 4e 65 77 2c 20 69  evel(p, &pNew, i
24410 4c 76 6c 2c 20 26 6e 52 65 6d 29 3b 0a 20 20 20  Lvl, &nRem);.   
24420 20 7d 0a 0a 20 20 20 20 66 74 73 35 53 74 72 75   }..    fts5Stru
24430 63 74 75 72 65 57 72 69 74 65 28 70 2c 20 70 4e  ctureWrite(p, pN
24440 65 77 29 3b 0a 20 20 20 20 66 74 73 35 53 74 72  ew);.    fts5Str
24450 75 63 74 75 72 65 52 65 6c 65 61 73 65 28 70 4e  uctureRelease(pN
24460 65 77 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75  ew);.  }..  retu
24470 72 6e 20 66 74 73 35 49 6e 64 65 78 52 65 74 75  rn fts5IndexRetu
24480 72 6e 28 70 29 3b 20 0a 7d 0a 0a 2f 2a 0a 2a 2a  rn(p); .}../*.**
24490 20 54 68 69 73 20 69 73 20 63 61 6c 6c 65 64 20   This is called 
244a0 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65  to implement the
244b0 20 73 70 65 63 69 61 6c 20 22 56 41 4c 55 45 53   special "VALUES
244c0 28 27 6d 65 72 67 65 27 2c 20 24 6e 4d 65 72 67  ('merge', $nMerg
244d0 65 29 22 0a 2a 2a 20 49 4e 53 45 52 54 20 63 6f  e)".** INSERT co
244e0 6d 6d 61 6e 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  mmand..*/.int sq
244f0 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78 4d 65  lite3Fts5IndexMe
24500 72 67 65 28 46 74 73 35 49 6e 64 65 78 20 2a 70  rge(Fts5Index *p
24510 2c 20 69 6e 74 20 6e 4d 65 72 67 65 29 7b 0a 20  , int nMerge){. 
24520 20 46 74 73 35 53 74 72 75 63 74 75 72 65 20 2a   Fts5Structure *
24530 70 53 74 72 75 63 74 20 3d 20 66 74 73 35 53 74  pStruct = fts5St
24540 72 75 63 74 75 72 65 52 65 61 64 28 70 29 3b 0a  ructureRead(p);.
24550 20 20 69 66 28 20 70 53 74 72 75 63 74 20 29 7b    if( pStruct ){
24560 0a 20 20 20 20 69 6e 74 20 6e 4d 69 6e 20 3d 20  .    int nMin = 
24570 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e 6e 55 73 65  p->pConfig->nUse
24580 72 6d 65 72 67 65 3b 0a 20 20 20 20 66 74 73 35  rmerge;.    fts5
24590 53 74 72 75 63 74 75 72 65 49 6e 76 61 6c 69 64  StructureInvalid
245a0 61 74 65 28 70 29 3b 0a 20 20 20 20 69 66 28 20  ate(p);.    if( 
245b0 6e 4d 65 72 67 65 3c 30 20 29 7b 0a 20 20 20 20  nMerge<0 ){.    
245c0 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65 20    Fts5Structure 
245d0 2a 70 4e 65 77 20 3d 20 66 74 73 35 49 6e 64 65  *pNew = fts5Inde
245e0 78 4f 70 74 69 6d 69 7a 65 53 74 72 75 63 74 28  xOptimizeStruct(
245f0 70 2c 20 70 53 74 72 75 63 74 29 3b 0a 20 20 20  p, pStruct);.   
24600 20 20 20 66 74 73 35 53 74 72 75 63 74 75 72 65     fts5Structure
24610 52 65 6c 65 61 73 65 28 70 53 74 72 75 63 74 29  Release(pStruct)
24620 3b 0a 20 20 20 20 20 20 70 53 74 72 75 63 74 20  ;.      pStruct 
24630 3d 20 70 4e 65 77 3b 0a 20 20 20 20 20 20 6e 4d  = pNew;.      nM
24640 69 6e 20 3d 20 32 3b 0a 20 20 20 20 20 20 6e 4d  in = 2;.      nM
24650 65 72 67 65 20 3d 20 6e 4d 65 72 67 65 2a 2d 31  erge = nMerge*-1
24660 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
24670 70 53 74 72 75 63 74 20 26 26 20 70 53 74 72 75  pStruct && pStru
24680 63 74 2d 3e 6e 4c 65 76 65 6c 20 29 7b 0a 20 20  ct->nLevel ){.  
24690 20 20 20 20 69 66 28 20 66 74 73 35 49 6e 64 65      if( fts5Inde
246a0 78 4d 65 72 67 65 28 70 2c 20 26 70 53 74 72 75  xMerge(p, &pStru
246b0 63 74 2c 20 6e 4d 65 72 67 65 2c 20 6e 4d 69 6e  ct, nMerge, nMin
246c0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 66 74 73  ) ){.        fts
246d0 35 53 74 72 75 63 74 75 72 65 57 72 69 74 65 28  5StructureWrite(
246e0 70 2c 20 70 53 74 72 75 63 74 29 3b 0a 20 20 20  p, pStruct);.   
246f0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 66     }.    }.    f
24700 74 73 35 53 74 72 75 63 74 75 72 65 52 65 6c 65  ts5StructureRele
24710 61 73 65 28 70 53 74 72 75 63 74 29 3b 0a 20 20  ase(pStruct);.  
24720 7d 0a 20 20 72 65 74 75 72 6e 20 66 74 73 35 49  }.  return fts5I
24730 6e 64 65 78 52 65 74 75 72 6e 28 70 29 3b 0a 7d  ndexReturn(p);.}
24740 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  ..static void ft
24750 73 35 41 70 70 65 6e 64 52 6f 77 69 64 28 0a 20  s5AppendRowid(. 
24760 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 0a 20   Fts5Index *p,. 
24770 20 69 36 34 20 69 44 65 6c 74 61 2c 0a 20 20 46   i64 iDelta,.  F
24780 74 73 35 49 74 65 72 20 2a 70 55 6e 75 73 65 64  ts5Iter *pUnused
24790 2c 0a 20 20 46 74 73 35 42 75 66 66 65 72 20 2a  ,.  Fts5Buffer *
247a0 70 42 75 66 0a 29 7b 0a 20 20 55 4e 55 53 45 44  pBuf.){.  UNUSED
247b0 5f 50 41 52 41 4d 28 70 55 6e 75 73 65 64 29 3b  _PARAM(pUnused);
247c0 0a 20 20 66 74 73 35 42 75 66 66 65 72 41 70 70  .  fts5BufferApp
247d0 65 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e 72 63  endVarint(&p->rc
247e0 2c 20 70 42 75 66 2c 20 69 44 65 6c 74 61 29 3b  , pBuf, iDelta);
247f0 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .}..static void 
24800 66 74 73 35 41 70 70 65 6e 64 50 6f 73 6c 69 73  fts5AppendPoslis
24810 74 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a  t(.  Fts5Index *
24820 70 2c 0a 20 20 69 36 34 20 69 44 65 6c 74 61 2c  p,.  i64 iDelta,
24830 0a 20 20 46 74 73 35 49 74 65 72 20 2a 70 4d 75  .  Fts5Iter *pMu
24840 6c 74 69 2c 0a 20 20 46 74 73 35 42 75 66 66 65  lti,.  Fts5Buffe
24850 72 20 2a 70 42 75 66 0a 29 7b 0a 20 20 69 6e 74  r *pBuf.){.  int
24860 20 6e 44 61 74 61 20 3d 20 70 4d 75 6c 74 69 2d   nData = pMulti-
24870 3e 62 61 73 65 2e 6e 44 61 74 61 3b 0a 20 20 61  >base.nData;.  a
24880 73 73 65 72 74 28 20 6e 44 61 74 61 3e 30 20 29  ssert( nData>0 )
24890 3b 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53  ;.  if( p->rc==S
248a0 51 4c 49 54 45 5f 4f 4b 20 26 26 20 30 3d 3d 66  QLITE_OK && 0==f
248b0 74 73 35 42 75 66 66 65 72 47 72 6f 77 28 26 70  ts5BufferGrow(&p
248c0 2d 3e 72 63 2c 20 70 42 75 66 2c 20 6e 44 61 74  ->rc, pBuf, nDat
248d0 61 2b 39 2b 39 29 20 29 7b 0a 20 20 20 20 66 74  a+9+9) ){.    ft
248e0 73 35 42 75 66 66 65 72 53 61 66 65 41 70 70 65  s5BufferSafeAppe
248f0 6e 64 56 61 72 69 6e 74 28 70 42 75 66 2c 20 69  ndVarint(pBuf, i
24900 44 65 6c 74 61 29 3b 0a 20 20 20 20 66 74 73 35  Delta);.    fts5
24910 42 75 66 66 65 72 53 61 66 65 41 70 70 65 6e 64  BufferSafeAppend
24920 56 61 72 69 6e 74 28 70 42 75 66 2c 20 6e 44 61  Varint(pBuf, nDa
24930 74 61 2a 32 29 3b 0a 20 20 20 20 66 74 73 35 42  ta*2);.    fts5B
24940 75 66 66 65 72 53 61 66 65 41 70 70 65 6e 64 42  ufferSafeAppendB
24950 6c 6f 62 28 70 42 75 66 2c 20 70 4d 75 6c 74 69  lob(pBuf, pMulti
24960 2d 3e 62 61 73 65 2e 70 44 61 74 61 2c 20 6e 44  ->base.pData, nD
24970 61 74 61 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a 73 74  ata);.  }.}...st
24980 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 44 6f  atic void fts5Do
24990 63 6c 69 73 74 49 74 65 72 4e 65 78 74 28 46 74  clistIterNext(Ft
249a0 73 35 44 6f 63 6c 69 73 74 49 74 65 72 20 2a 70  s5DoclistIter *p
249b0 49 74 65 72 29 7b 0a 20 20 75 38 20 2a 70 20 3d  Iter){.  u8 *p =
249c0 20 70 49 74 65 72 2d 3e 61 50 6f 73 6c 69 73 74   pIter->aPoslist
249d0 20 2b 20 70 49 74 65 72 2d 3e 6e 53 69 7a 65 20   + pIter->nSize 
249e0 2b 20 70 49 74 65 72 2d 3e 6e 50 6f 73 6c 69 73  + pIter->nPoslis
249f0 74 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 49  t;..  assert( pI
24a00 74 65 72 2d 3e 61 50 6f 73 6c 69 73 74 20 29 3b  ter->aPoslist );
24a10 0a 20 20 69 66 28 20 70 3e 3d 70 49 74 65 72 2d  .  if( p>=pIter-
24a20 3e 61 45 6f 66 20 29 7b 0a 20 20 20 20 70 49 74  >aEof ){.    pIt
24a30 65 72 2d 3e 61 50 6f 73 6c 69 73 74 20 3d 20 30  er->aPoslist = 0
24a40 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  ;.  }else{.    i
24a50 36 34 20 69 44 65 6c 74 61 3b 0a 0a 20 20 20 20  64 iDelta;..    
24a60 70 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69  p += fts5GetVari
24a70 6e 74 28 70 2c 20 28 75 36 34 2a 29 26 69 44 65  nt(p, (u64*)&iDe
24a80 6c 74 61 29 3b 0a 20 20 20 20 70 49 74 65 72 2d  lta);.    pIter-
24a90 3e 69 52 6f 77 69 64 20 2b 3d 20 69 44 65 6c 74  >iRowid += iDelt
24aa0 61 3b 0a 0a 20 20 20 20 2f 2a 20 52 65 61 64 20  a;..    /* Read 
24ab0 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74 20 73 69  position list si
24ac0 7a 65 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 5b  ze */.    if( p[
24ad0 30 5d 20 26 20 30 78 38 30 20 29 7b 0a 20 20 20  0] & 0x80 ){.   
24ae0 20 20 20 69 6e 74 20 6e 50 6f 73 3b 0a 20 20 20     int nPos;.   
24af0 20 20 20 70 49 74 65 72 2d 3e 6e 53 69 7a 65 20     pIter->nSize 
24b00 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e 74 33  = fts5GetVarint3
24b10 32 28 70 2c 20 6e 50 6f 73 29 3b 0a 20 20 20 20  2(p, nPos);.    
24b20 20 20 70 49 74 65 72 2d 3e 6e 50 6f 73 6c 69 73    pIter->nPoslis
24b30 74 20 3d 20 28 6e 50 6f 73 3e 3e 31 29 3b 0a 20  t = (nPos>>1);. 
24b40 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
24b50 70 49 74 65 72 2d 3e 6e 50 6f 73 6c 69 73 74 20  pIter->nPoslist 
24b60 3d 20 28 28 69 6e 74 29 28 70 5b 30 5d 29 29 20  = ((int)(p[0])) 
24b70 3e 3e 20 31 3b 0a 20 20 20 20 20 20 70 49 74 65  >> 1;.      pIte
24b80 72 2d 3e 6e 53 69 7a 65 20 3d 20 31 3b 0a 20 20  r->nSize = 1;.  
24b90 20 20 7d 0a 0a 20 20 20 20 70 49 74 65 72 2d 3e    }..    pIter->
24ba0 61 50 6f 73 6c 69 73 74 20 3d 20 70 3b 0a 20 20  aPoslist = p;.  
24bb0 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64  }.}..static void
24bc0 20 66 74 73 35 44 6f 63 6c 69 73 74 49 74 65 72   fts5DoclistIter
24bd0 49 6e 69 74 28 0a 20 20 46 74 73 35 42 75 66 66  Init(.  Fts5Buff
24be0 65 72 20 2a 70 42 75 66 2c 20 0a 20 20 46 74 73  er *pBuf, .  Fts
24bf0 35 44 6f 63 6c 69 73 74 49 74 65 72 20 2a 70 49  5DoclistIter *pI
24c00 74 65 72 0a 29 7b 0a 20 20 6d 65 6d 73 65 74 28  ter.){.  memset(
24c10 70 49 74 65 72 2c 20 30 2c 20 73 69 7a 65 6f 66  pIter, 0, sizeof
24c20 28 2a 70 49 74 65 72 29 29 3b 0a 20 20 70 49 74  (*pIter));.  pIt
24c30 65 72 2d 3e 61 50 6f 73 6c 69 73 74 20 3d 20 70  er->aPoslist = p
24c40 42 75 66 2d 3e 70 3b 0a 20 20 70 49 74 65 72 2d  Buf->p;.  pIter-
24c50 3e 61 45 6f 66 20 3d 20 26 70 42 75 66 2d 3e 70  >aEof = &pBuf->p
24c60 5b 70 42 75 66 2d 3e 6e 5d 3b 0a 20 20 66 74 73  [pBuf->n];.  fts
24c70 35 44 6f 63 6c 69 73 74 49 74 65 72 4e 65 78 74  5DoclistIterNext
24c80 28 70 49 74 65 72 29 3b 0a 7d 0a 0a 23 69 66 20  (pIter);.}..#if 
24c90 30 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64 20 61  0./*.** Append a
24ca0 20 64 6f 63 6c 69 73 74 20 74 6f 20 62 75 66 66   doclist to buff
24cb0 65 72 20 70 42 75 66 2e 0a 2a 2a 0a 2a 2a 20 54  er pBuf..**.** T
24cc0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 73 73  his function ass
24cd0 75 6d 65 73 20 74 68 61 74 20 73 70 61 63 65 20  umes that space 
24ce0 77 69 74 68 69 6e 20 74 68 65 20 62 75 66 66 65  within the buffe
24cf0 72 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65  r has already be
24d00 65 6e 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 2e  en.** allocated.
24d10 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
24d20 66 74 73 35 4d 65 72 67 65 41 70 70 65 6e 64 44  fts5MergeAppendD
24d30 6f 63 69 64 28 0a 20 20 46 74 73 35 42 75 66 66  ocid(.  Fts5Buff
24d40 65 72 20 2a 70 42 75 66 2c 20 20 20 20 20 20 20  er *pBuf,       
24d50 20 20 20 20 20 20 20 20 2f 2a 20 42 75 66 66 65          /* Buffe
24d60 72 20 74 6f 20 77 72 69 74 65 20 74 6f 20 2a 2f  r to write to */
24d70 0a 20 20 69 36 34 20 2a 70 69 4c 61 73 74 52 6f  .  i64 *piLastRo
24d80 77 69 64 2c 20 20 20 20 20 20 20 20 20 20 20 20  wid,            
24d90 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 50 72     /* IN/OUT: Pr
24da0 65 76 69 6f 75 73 20 72 6f 77 69 64 20 77 72 69  evious rowid wri
24db0 74 74 65 6e 20 28 69 66 20 61 6e 79 29 20 2a 2f  tten (if any) */
24dc0 0a 20 20 69 36 34 20 69 52 6f 77 69 64 20 20 20  .  i64 iRowid   
24dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24de0 20 20 20 2f 2a 20 52 6f 77 69 64 20 74 6f 20 61     /* Rowid to a
24df0 70 70 65 6e 64 20 2a 2f 0a 29 7b 0a 20 20 61 73  ppend */.){.  as
24e00 73 65 72 74 28 20 70 42 75 66 2d 3e 6e 21 3d 30  sert( pBuf->n!=0
24e10 20 7c 7c 20 28 2a 70 69 4c 61 73 74 52 6f 77 69   || (*piLastRowi
24e20 64 29 3d 3d 30 20 29 3b 0a 20 20 66 74 73 35 42  d)==0 );.  fts5B
24e30 75 66 66 65 72 53 61 66 65 41 70 70 65 6e 64 56  ufferSafeAppendV
24e40 61 72 69 6e 74 28 70 42 75 66 2c 20 69 52 6f 77  arint(pBuf, iRow
24e50 69 64 20 2d 20 2a 70 69 4c 61 73 74 52 6f 77 69  id - *piLastRowi
24e60 64 29 3b 0a 20 20 2a 70 69 4c 61 73 74 52 6f 77  d);.  *piLastRow
24e70 69 64 20 3d 20 69 52 6f 77 69 64 3b 0a 7d 0a 23  id = iRowid;.}.#
24e80 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 66  endif..#define f
24e90 74 73 35 4d 65 72 67 65 41 70 70 65 6e 64 44 6f  ts5MergeAppendDo
24ea0 63 69 64 28 70 42 75 66 2c 20 69 4c 61 73 74 52  cid(pBuf, iLastR
24eb0 6f 77 69 64 2c 20 69 52 6f 77 69 64 29 20 7b 20  owid, iRowid) { 
24ec0 20 20 20 20 20 20 5c 0a 20 20 61 73 73 65 72 74        \.  assert
24ed0 28 20 28 70 42 75 66 29 2d 3e 6e 21 3d 30 20 7c  ( (pBuf)->n!=0 |
24ee0 7c 20 28 69 4c 61 73 74 52 6f 77 69 64 29 3d 3d  | (iLastRowid)==
24ef0 30 20 29 3b 20 20 20 20 20 20 20 20 20 20 20 20  0 );            
24f00 20 20 20 20 20 20 20 5c 0a 20 20 66 74 73 35 42         \.  fts5B
24f10 75 66 66 65 72 53 61 66 65 41 70 70 65 6e 64 56  ufferSafeAppendV
24f20 61 72 69 6e 74 28 28 70 42 75 66 29 2c 20 28 69  arint((pBuf), (i
24f30 52 6f 77 69 64 29 20 2d 20 28 69 4c 61 73 74 52  Rowid) - (iLastR
24f40 6f 77 69 64 29 29 3b 20 5c 0a 20 20 28 69 4c 61  owid)); \.  (iLa
24f50 73 74 52 6f 77 69 64 29 20 3d 20 28 69 52 6f 77  stRowid) = (iRow
24f60 69 64 29 3b 20 20 20 20 20 20 20 20 20 20 20 20  id);            
24f70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24f80 20 20 20 20 20 20 20 20 20 5c 0a 7d 0a 0a 2f 2a           \.}../*
24f90 0a 2a 2a 20 53 77 61 70 20 74 68 65 20 63 6f 6e  .** Swap the con
24fa0 74 65 6e 74 73 20 6f 66 20 62 75 66 66 65 72 20  tents of buffer 
24fb0 2a 70 31 20 77 69 74 68 20 74 68 61 74 20 6f 66  *p1 with that of
24fc0 20 2a 70 32 2e 0a 2a 2f 0a 73 74 61 74 69 63 20   *p2..*/.static 
24fd0 76 6f 69 64 20 66 74 73 35 42 75 66 66 65 72 53  void fts5BufferS
24fe0 77 61 70 28 46 74 73 35 42 75 66 66 65 72 20 2a  wap(Fts5Buffer *
24ff0 70 31 2c 20 46 74 73 35 42 75 66 66 65 72 20 2a  p1, Fts5Buffer *
25000 70 32 29 7b 0a 20 20 46 74 73 35 42 75 66 66 65  p2){.  Fts5Buffe
25010 72 20 74 6d 70 20 3d 20 2a 70 31 3b 0a 20 20 2a  r tmp = *p1;.  *
25020 70 31 20 3d 20 2a 70 32 3b 0a 20 20 2a 70 32 20  p1 = *p2;.  *p2 
25030 3d 20 74 6d 70 3b 0a 7d 0a 0a 73 74 61 74 69 63  = tmp;.}..static
25040 20 76 6f 69 64 20 66 74 73 35 4e 65 78 74 52 6f   void fts5NextRo
25050 77 69 64 28 46 74 73 35 42 75 66 66 65 72 20 2a  wid(Fts5Buffer *
25060 70 42 75 66 2c 20 69 6e 74 20 2a 70 69 4f 66 66  pBuf, int *piOff
25070 2c 20 69 36 34 20 2a 70 69 52 6f 77 69 64 29 7b  , i64 *piRowid){
25080 0a 20 20 69 6e 74 20 69 20 3d 20 2a 70 69 4f 66  .  int i = *piOf
25090 66 3b 0a 20 20 69 66 28 20 69 3e 3d 70 42 75 66  f;.  if( i>=pBuf
250a0 2d 3e 6e 20 29 7b 0a 20 20 20 20 2a 70 69 4f 66  ->n ){.    *piOf
250b0 66 20 3d 20 2d 31 3b 0a 20 20 7d 65 6c 73 65 7b  f = -1;.  }else{
250c0 0a 20 20 20 20 75 36 34 20 69 56 61 6c 3b 0a 20  .    u64 iVal;. 
250d0 20 20 20 2a 70 69 4f 66 66 20 3d 20 69 20 2b 20     *piOff = i + 
250e0 73 71 6c 69 74 65 33 46 74 73 35 47 65 74 56 61  sqlite3Fts5GetVa
250f0 72 69 6e 74 28 26 70 42 75 66 2d 3e 70 5b 69 5d  rint(&pBuf->p[i]
25100 2c 20 26 69 56 61 6c 29 3b 0a 20 20 20 20 2a 70  , &iVal);.    *p
25110 69 52 6f 77 69 64 20 2b 3d 20 69 56 61 6c 3b 0a  iRowid += iVal;.
25120 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69    }.}../*.** Thi
25130 73 20 69 73 20 74 68 65 20 65 71 75 69 76 61 6c  s is the equival
25140 65 6e 74 20 6f 66 20 66 74 73 35 4d 65 72 67 65  ent of fts5Merge
25150 50 72 65 66 69 78 4c 69 73 74 73 28 29 20 66 6f  PrefixLists() fo
25160 72 20 64 65 74 61 69 6c 3d 6e 6f 6e 65 20 6d 6f  r detail=none mo
25170 64 65 2e 0a 2a 2a 20 49 6e 20 74 68 69 73 20 63  de..** In this c
25180 61 73 65 20 74 68 65 20 62 75 66 66 65 72 73 20  ase the buffers 
25190 63 6f 6e 73 69 73 74 20 6f 66 20 61 20 64 65 6c  consist of a del
251a0 74 61 2d 65 6e 63 6f 64 65 64 20 6c 69 73 74 20  ta-encoded list 
251b0 6f 66 20 72 6f 77 69 64 73 20 6f 6e 6c 79 2e 0a  of rowids only..
251c0 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
251d0 74 73 35 4d 65 72 67 65 52 6f 77 69 64 4c 69 73  ts5MergeRowidLis
251e0 74 73 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20  ts(.  Fts5Index 
251f0 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  *p,             
25200 20 20 20 20 20 20 2f 2a 20 46 54 53 35 20 62 61        /* FTS5 ba
25210 63 6b 65 6e 64 20 6f 62 6a 65 63 74 20 2a 2f 0a  ckend object */.
25220 20 20 46 74 73 35 42 75 66 66 65 72 20 2a 70 31    Fts5Buffer *p1
25230 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
25240 20 20 2f 2a 20 46 69 72 73 74 20 6c 69 73 74 20    /* First list 
25250 74 6f 20 6d 65 72 67 65 20 2a 2f 0a 20 20 46 74  to merge */.  Ft
25260 73 35 42 75 66 66 65 72 20 2a 70 32 20 20 20 20  s5Buffer *p2    
25270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
25280 20 53 65 63 6f 6e 64 20 6c 69 73 74 20 74 6f 20   Second list to 
25290 6d 65 72 67 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e  merge */.){.  in
252a0 74 20 69 31 20 3d 20 30 3b 0a 20 20 69 6e 74 20  t i1 = 0;.  int 
252b0 69 32 20 3d 20 30 3b 0a 20 20 69 36 34 20 69 52  i2 = 0;.  i64 iR
252c0 6f 77 69 64 31 20 3d 20 30 3b 0a 20 20 69 36 34  owid1 = 0;.  i64
252d0 20 69 52 6f 77 69 64 32 20 3d 20 30 3b 0a 20 20   iRowid2 = 0;.  
252e0 69 36 34 20 69 4f 75 74 20 3d 20 30 3b 0a 0a 20  i64 iOut = 0;.. 
252f0 20 46 74 73 35 42 75 66 66 65 72 20 6f 75 74 3b   Fts5Buffer out;
25300 0a 20 20 6d 65 6d 73 65 74 28 26 6f 75 74 2c 20  .  memset(&out, 
25310 30 2c 20 73 69 7a 65 6f 66 28 6f 75 74 29 29 3b  0, sizeof(out));
25320 0a 20 20 73 71 6c 69 74 65 33 46 74 73 35 42 75  .  sqlite3Fts5Bu
25330 66 66 65 72 53 69 7a 65 28 26 70 2d 3e 72 63 2c  fferSize(&p->rc,
25340 20 26 6f 75 74 2c 20 70 31 2d 3e 6e 20 2b 20 70   &out, p1->n + p
25350 32 2d 3e 6e 29 3b 0a 20 20 69 66 28 20 70 2d 3e  2->n);.  if( p->
25360 72 63 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20  rc ) return;..  
25370 66 74 73 35 4e 65 78 74 52 6f 77 69 64 28 70 31  fts5NextRowid(p1
25380 2c 20 26 69 31 2c 20 26 69 52 6f 77 69 64 31 29  , &i1, &iRowid1)
25390 3b 0a 20 20 66 74 73 35 4e 65 78 74 52 6f 77 69  ;.  fts5NextRowi
253a0 64 28 70 32 2c 20 26 69 32 2c 20 26 69 52 6f 77  d(p2, &i2, &iRow
253b0 69 64 32 29 3b 0a 20 20 77 68 69 6c 65 28 20 69  id2);.  while( i
253c0 31 3e 3d 30 20 7c 7c 20 69 32 3e 3d 30 20 29 7b  1>=0 || i2>=0 ){
253d0 0a 20 20 20 20 69 66 28 20 69 31 3e 3d 30 20 26  .    if( i1>=0 &
253e0 26 20 28 69 32 3c 30 20 7c 7c 20 69 52 6f 77 69  & (i2<0 || iRowi
253f0 64 31 3c 69 52 6f 77 69 64 32 29 20 29 7b 0a 20  d1<iRowid2) ){. 
25400 20 20 20 20 20 61 73 73 65 72 74 28 20 69 4f 75       assert( iOu
25410 74 3d 3d 30 20 7c 7c 20 69 52 6f 77 69 64 31 3e  t==0 || iRowid1>
25420 69 4f 75 74 20 29 3b 0a 20 20 20 20 20 20 66 74  iOut );.      ft
25430 73 35 42 75 66 66 65 72 53 61 66 65 41 70 70 65  s5BufferSafeAppe
25440 6e 64 56 61 72 69 6e 74 28 26 6f 75 74 2c 20 69  ndVarint(&out, i
25450 52 6f 77 69 64 31 20 2d 20 69 4f 75 74 29 3b 0a  Rowid1 - iOut);.
25460 20 20 20 20 20 20 69 4f 75 74 20 3d 20 69 52 6f        iOut = iRo
25470 77 69 64 31 3b 0a 20 20 20 20 20 20 66 74 73 35  wid1;.      fts5
25480 4e 65 78 74 52 6f 77 69 64 28 70 31 2c 20 26 69  NextRowid(p1, &i
25490 31 2c 20 26 69 52 6f 77 69 64 31 29 3b 0a 20 20  1, &iRowid1);.  
254a0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61    }else{.      a
254b0 73 73 65 72 74 28 20 69 4f 75 74 3d 3d 30 20 7c  ssert( iOut==0 |
254c0 7c 20 69 52 6f 77 69 64 32 3e 69 4f 75 74 20 29  | iRowid2>iOut )
254d0 3b 0a 20 20 20 20 20 20 66 74 73 35 42 75 66 66  ;.      fts5Buff
254e0 65 72 53 61 66 65 41 70 70 65 6e 64 56 61 72 69  erSafeAppendVari
254f0 6e 74 28 26 6f 75 74 2c 20 69 52 6f 77 69 64 32  nt(&out, iRowid2
25500 20 2d 20 69 4f 75 74 29 3b 0a 20 20 20 20 20 20   - iOut);.      
25510 69 4f 75 74 20 3d 20 69 52 6f 77 69 64 32 3b 0a  iOut = iRowid2;.
25520 20 20 20 20 20 20 69 66 28 20 69 31 3e 3d 30 20        if( i1>=0 
25530 26 26 20 69 52 6f 77 69 64 31 3d 3d 69 52 6f 77  && iRowid1==iRow
25540 69 64 32 20 29 7b 0a 20 20 20 20 20 20 20 20 66  id2 ){.        f
25550 74 73 35 4e 65 78 74 52 6f 77 69 64 28 70 31 2c  ts5NextRowid(p1,
25560 20 26 69 31 2c 20 26 69 52 6f 77 69 64 31 29 3b   &i1, &iRowid1);
25570 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66  .      }.      f
25580 74 73 35 4e 65 78 74 52 6f 77 69 64 28 70 32 2c  ts5NextRowid(p2,
25590 20 26 69 32 2c 20 26 69 52 6f 77 69 64 32 29 3b   &i2, &iRowid2);
255a0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 66 74  .    }.  }..  ft
255b0 73 35 42 75 66 66 65 72 53 77 61 70 28 26 6f 75  s5BufferSwap(&ou
255c0 74 2c 20 70 31 29 3b 0a 20 20 66 74 73 35 42 75  t, p1);.  fts5Bu
255d0 66 66 65 72 46 72 65 65 28 26 6f 75 74 29 3b 0a  fferFree(&out);.
255e0 7d 0a 0a 2f 2a 0a 2a 2a 20 42 75 66 66 65 72 73  }../*.** Buffers
255f0 20 70 31 20 61 6e 64 20 70 32 20 63 6f 6e 74 61   p1 and p2 conta
25600 69 6e 20 64 6f 63 6c 69 73 74 73 2e 20 54 68 69  in doclists. Thi
25610 73 20 66 75 6e 63 74 69 6f 6e 20 6d 65 72 67 65  s function merge
25620 73 20 74 68 65 20 63 6f 6e 74 65 6e 74 0a 2a 2a  s the content.**
25630 20 6f 66 20 74 68 65 20 74 77 6f 20 64 6f 63 6c   of the two docl
25640 69 73 74 73 20 74 6f 67 65 74 68 65 72 20 61 6e  ists together an
25650 64 20 73 65 74 73 20 62 75 66 66 65 72 20 70 31  d sets buffer p1
25660 20 74 6f 20 74 68 65 20 72 65 73 75 6c 74 20 62   to the result b
25670 65 66 6f 72 65 0a 2a 2a 20 72 65 74 75 72 6e 69  efore.** returni
25680 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  ng..**.** If an 
25690 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 61 6e  error occurs, an
256a0 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 6c   error code is l
256b0 65 66 74 20 69 6e 20 70 2d 3e 72 63 2e 20 49 66  eft in p->rc. If
256c0 20 61 6e 20 65 72 72 6f 72 20 68 61 73 0a 2a 2a   an error has.**
256d0 20 61 6c 72 65 61 64 79 20 6f 63 63 75 72 72 65   already occurre
256e0 64 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  d, this function
256f0 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a   is a no-op..*/.
25700 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
25710 4d 65 72 67 65 50 72 65 66 69 78 4c 69 73 74 73  MergePrefixLists
25720 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70  (.  Fts5Index *p
25730 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
25740 20 20 20 20 2f 2a 20 46 54 53 35 20 62 61 63 6b      /* FTS5 back
25750 65 6e 64 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  end object */.  
25760 46 74 73 35 42 75 66 66 65 72 20 2a 70 31 2c 20  Fts5Buffer *p1, 
25770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25780 2f 2a 20 46 69 72 73 74 20 6c 69 73 74 20 74 6f  /* First list to
25790 20 6d 65 72 67 65 20 2a 2f 0a 20 20 46 74 73 35   merge */.  Fts5
257a0 42 75 66 66 65 72 20 2a 70 32 20 20 20 20 20 20  Buffer *p2      
257b0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
257c0 65 63 6f 6e 64 20 6c 69 73 74 20 74 6f 20 6d 65  econd list to me
257d0 72 67 65 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20  rge */.){.  if( 
257e0 70 32 2d 3e 6e 20 29 7b 0a 20 20 20 20 69 36 34  p2->n ){.    i64
257f0 20 69 4c 61 73 74 52 6f 77 69 64 20 3d 20 30 3b   iLastRowid = 0;
25800 0a 20 20 20 20 46 74 73 35 44 6f 63 6c 69 73 74  .    Fts5Doclist
25810 49 74 65 72 20 69 31 3b 0a 20 20 20 20 46 74 73  Iter i1;.    Fts
25820 35 44 6f 63 6c 69 73 74 49 74 65 72 20 69 32 3b  5DoclistIter i2;
25830 0a 20 20 20 20 46 74 73 35 42 75 66 66 65 72 20  .    Fts5Buffer 
25840 6f 75 74 20 3d 20 7b 30 2c 20 30 2c 20 30 7d 3b  out = {0, 0, 0};
25850 0a 20 20 20 20 46 74 73 35 42 75 66 66 65 72 20  .    Fts5Buffer 
25860 74 6d 70 20 3d 20 7b 30 2c 20 30 2c 20 30 7d 3b  tmp = {0, 0, 0};
25870 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 6d 61 78  ..    /* The max
25880 69 6d 75 6d 20 73 69 7a 65 20 6f 66 20 74 68 65  imum size of the
25890 20 6f 75 74 70 75 74 20 69 73 20 65 71 75 61 6c   output is equal
258a0 20 74 6f 20 74 68 65 20 73 75 6d 20 6f 66 20 74   to the sum of t
258b0 68 65 20 74 77 6f 20 0a 20 20 20 20 2a 2a 20 69  he two .    ** i
258c0 6e 70 75 74 20 73 69 7a 65 73 20 2b 20 31 20 76  nput sizes + 1 v
258d0 61 72 69 6e 74 20 28 39 20 62 79 74 65 73 29 2e  arint (9 bytes).
258e0 20 54 68 65 20 65 78 74 72 61 20 76 61 72 69 6e   The extra varin
258f0 74 20 69 73 20 62 65 63 61 75 73 65 20 69 66 20  t is because if 
25900 74 68 65 0a 20 20 20 20 2a 2a 20 66 69 72 73 74  the.    ** first
25910 20 72 6f 77 69 64 20 69 6e 20 6f 6e 65 20 69 6e   rowid in one in
25920 70 75 74 20 69 73 20 61 20 6c 61 72 67 65 20 6e  put is a large n
25930 65 67 61 74 69 76 65 20 6e 75 6d 62 65 72 2c 20  egative number, 
25940 61 6e 64 20 74 68 65 20 66 69 72 73 74 20 69 6e  and the first in
25950 0a 20 20 20 20 2a 2a 20 74 68 65 20 6f 74 68 65  .    ** the othe
25960 72 20 61 20 6e 6f 6e 2d 6e 65 67 61 74 69 76 65  r a non-negative
25970 20 6e 75 6d 62 65 72 2c 20 74 68 65 20 64 65 6c   number, the del
25980 74 61 20 66 6f 72 20 74 68 65 20 6e 6f 6e 2d 6e  ta for the non-n
25990 65 67 61 74 69 76 65 0a 20 20 20 20 2a 2a 20 6e  egative.    ** n
259a0 75 6d 62 65 72 20 77 69 6c 6c 20 62 65 20 6c 61  umber will be la
259b0 72 67 65 72 20 6f 6e 20 64 69 73 6b 20 74 68 61  rger on disk tha
259c0 6e 20 74 68 65 20 6c 69 74 65 72 61 6c 20 69 6e  n the literal in
259d0 74 65 67 65 72 20 76 61 6c 75 65 0a 20 20 20 20  teger value.    
259e0 2a 2a 20 77 61 73 2e 20 20 2a 2f 0a 20 20 20 20  ** was.  */.    
259f0 69 66 28 20 73 71 6c 69 74 65 33 46 74 73 35 42  if( sqlite3Fts5B
25a00 75 66 66 65 72 53 69 7a 65 28 26 70 2d 3e 72 63  ufferSize(&p->rc
25a10 2c 20 26 6f 75 74 2c 20 70 31 2d 3e 6e 20 2b 20  , &out, p1->n + 
25a20 70 32 2d 3e 6e 20 2b 20 39 29 20 29 20 72 65 74  p2->n + 9) ) ret
25a30 75 72 6e 3b 0a 20 20 20 20 66 74 73 35 44 6f 63  urn;.    fts5Doc
25a40 6c 69 73 74 49 74 65 72 49 6e 69 74 28 70 31 2c  listIterInit(p1,
25a50 20 26 69 31 29 3b 0a 20 20 20 20 66 74 73 35 44   &i1);.    fts5D
25a60 6f 63 6c 69 73 74 49 74 65 72 49 6e 69 74 28 70  oclistIterInit(p
25a70 32 2c 20 26 69 32 29 3b 0a 0a 20 20 20 20 77 68  2, &i2);..    wh
25a80 69 6c 65 28 20 31 20 29 7b 0a 20 20 20 20 20 20  ile( 1 ){.      
25a90 69 66 28 20 69 31 2e 69 52 6f 77 69 64 3c 69 32  if( i1.iRowid<i2
25aa0 2e 69 52 6f 77 69 64 20 29 7b 0a 20 20 20 20 20  .iRowid ){.     
25ab0 20 20 20 2f 2a 20 43 6f 70 79 20 65 6e 74 72 79     /* Copy entry
25ac0 20 66 72 6f 6d 20 69 31 20 2a 2f 0a 20 20 20 20   from i1 */.    
25ad0 20 20 20 20 66 74 73 35 4d 65 72 67 65 41 70 70      fts5MergeApp
25ae0 65 6e 64 44 6f 63 69 64 28 26 6f 75 74 2c 20 69  endDocid(&out, i
25af0 4c 61 73 74 52 6f 77 69 64 2c 20 69 31 2e 69 52  LastRowid, i1.iR
25b00 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 20 20 66  owid);.        f
25b10 74 73 35 42 75 66 66 65 72 53 61 66 65 41 70 70  ts5BufferSafeApp
25b20 65 6e 64 42 6c 6f 62 28 26 6f 75 74 2c 20 69 31  endBlob(&out, i1
25b30 2e 61 50 6f 73 6c 69 73 74 2c 20 69 31 2e 6e 50  .aPoslist, i1.nP
25b40 6f 73 6c 69 73 74 2b 69 31 2e 6e 53 69 7a 65 29  oslist+i1.nSize)
25b50 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35 44 6f  ;.        fts5Do
25b60 63 6c 69 73 74 49 74 65 72 4e 65 78 74 28 26 69  clistIterNext(&i
25b70 31 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  1);.        if( 
25b80 69 31 2e 61 50 6f 73 6c 69 73 74 3d 3d 30 20 29  i1.aPoslist==0 )
25b90 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
25ba0 20 20 20 20 20 20 65 6c 73 65 20 69 66 28 20 69        else if( i
25bb0 32 2e 69 52 6f 77 69 64 21 3d 69 31 2e 69 52 6f  2.iRowid!=i1.iRo
25bc0 77 69 64 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  wid ){.        /
25bd0 2a 20 43 6f 70 79 20 65 6e 74 72 79 20 66 72 6f  * Copy entry fro
25be0 6d 20 69 32 20 2a 2f 0a 20 20 20 20 20 20 20 20  m i2 */.        
25bf0 66 74 73 35 4d 65 72 67 65 41 70 70 65 6e 64 44  fts5MergeAppendD
25c00 6f 63 69 64 28 26 6f 75 74 2c 20 69 4c 61 73 74  ocid(&out, iLast
25c10 52 6f 77 69 64 2c 20 69 32 2e 69 52 6f 77 69 64  Rowid, i2.iRowid
25c20 29 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35 42  );.        fts5B
25c30 75 66 66 65 72 53 61 66 65 41 70 70 65 6e 64 42  ufferSafeAppendB
25c40 6c 6f 62 28 26 6f 75 74 2c 20 69 32 2e 61 50 6f  lob(&out, i2.aPo
25c50 73 6c 69 73 74 2c 20 69 32 2e 6e 50 6f 73 6c 69  slist, i2.nPosli
25c60 73 74 2b 69 32 2e 6e 53 69 7a 65 29 3b 0a 20 20  st+i2.nSize);.  
25c70 20 20 20 20 20 20 66 74 73 35 44 6f 63 6c 69 73        fts5Doclis
25c80 74 49 74 65 72 4e 65 78 74 28 26 69 32 29 3b 0a  tIterNext(&i2);.
25c90 20 20 20 20 20 20 20 20 69 66 28 20 69 32 2e 61          if( i2.a
25ca0 50 6f 73 6c 69 73 74 3d 3d 30 20 29 20 62 72 65  Poslist==0 ) bre
25cb0 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
25cc0 20 20 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20    else{.        
25cd0 2f 2a 20 4d 65 72 67 65 20 74 68 65 20 74 77 6f  /* Merge the two
25ce0 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74 73 2e   position lists.
25cf0 20 2a 2f 20 0a 20 20 20 20 20 20 20 20 69 36 34   */ .        i64
25d00 20 69 50 6f 73 31 20 3d 20 30 3b 0a 20 20 20 20   iPos1 = 0;.    
25d10 20 20 20 20 69 36 34 20 69 50 6f 73 32 20 3d 20      i64 iPos2 = 
25d20 30 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69  0;.        int i
25d30 4f 66 66 31 20 3d 20 30 3b 0a 20 20 20 20 20 20  Off1 = 0;.      
25d40 20 20 69 6e 74 20 69 4f 66 66 32 20 3d 20 30 3b    int iOff2 = 0;
25d50 0a 20 20 20 20 20 20 20 20 75 38 20 2a 61 31 20  .        u8 *a1 
25d60 3d 20 26 69 31 2e 61 50 6f 73 6c 69 73 74 5b 69  = &i1.aPoslist[i
25d70 31 2e 6e 53 69 7a 65 5d 3b 0a 20 20 20 20 20 20  1.nSize];.      
25d80 20 20 75 38 20 2a 61 32 20 3d 20 26 69 32 2e 61    u8 *a2 = &i2.a
25d90 50 6f 73 6c 69 73 74 5b 69 32 2e 6e 53 69 7a 65  Poslist[i2.nSize
25da0 5d 3b 0a 0a 20 20 20 20 20 20 20 20 69 36 34 20  ];..        i64 
25db0 69 50 72 65 76 20 3d 20 30 3b 0a 20 20 20 20 20  iPrev = 0;.     
25dc0 20 20 20 46 74 73 35 50 6f 73 6c 69 73 74 57 72     Fts5PoslistWr
25dd0 69 74 65 72 20 77 72 69 74 65 72 3b 0a 20 20 20  iter writer;.   
25de0 20 20 20 20 20 6d 65 6d 73 65 74 28 26 77 72 69       memset(&wri
25df0 74 65 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 77  ter, 0, sizeof(w
25e00 72 69 74 65 72 29 29 3b 0a 0a 20 20 20 20 20 20  riter));..      
25e10 20 20 66 74 73 35 4d 65 72 67 65 41 70 70 65 6e    fts5MergeAppen
25e20 64 44 6f 63 69 64 28 26 6f 75 74 2c 20 69 4c 61  dDocid(&out, iLa
25e30 73 74 52 6f 77 69 64 2c 20 69 32 2e 69 52 6f 77  stRowid, i2.iRow
25e40 69 64 29 3b 0a 20 20 20 20 20 20 20 20 66 74 73  id);.        fts
25e50 35 42 75 66 66 65 72 5a 65 72 6f 28 26 74 6d 70  5BufferZero(&tmp
25e60 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
25e70 65 33 46 74 73 35 42 75 66 66 65 72 53 69 7a 65  e3Fts5BufferSize
25e80 28 26 70 2d 3e 72 63 2c 20 26 74 6d 70 2c 20 69  (&p->rc, &tmp, i
25e90 31 2e 6e 50 6f 73 6c 69 73 74 20 2b 20 69 32 2e  1.nPoslist + i2.
25ea0 6e 50 6f 73 6c 69 73 74 29 3b 0a 20 20 20 20 20  nPoslist);.     
25eb0 20 20 20 69 66 28 20 70 2d 3e 72 63 20 29 20 62     if( p->rc ) b
25ec0 72 65 61 6b 3b 0a 0a 20 20 20 20 20 20 20 20 73  reak;..        s
25ed0 71 6c 69 74 65 33 46 74 73 35 50 6f 73 6c 69 73  qlite3Fts5Poslis
25ee0 74 4e 65 78 74 36 34 28 61 31 2c 20 69 31 2e 6e  tNext64(a1, i1.n
25ef0 50 6f 73 6c 69 73 74 2c 20 26 69 4f 66 66 31 2c  Poslist, &iOff1,
25f00 20 26 69 50 6f 73 31 29 3b 0a 20 20 20 20 20 20   &iPos1);.      
25f10 20 20 73 71 6c 69 74 65 33 46 74 73 35 50 6f 73    sqlite3Fts5Pos
25f20 6c 69 73 74 4e 65 78 74 36 34 28 61 32 2c 20 69  listNext64(a2, i
25f30 32 2e 6e 50 6f 73 6c 69 73 74 2c 20 26 69 4f 66  2.nPoslist, &iOf
25f40 66 32 2c 20 26 69 50 6f 73 32 29 3b 0a 20 20 20  f2, &iPos2);.   
25f50 20 20 20 20 20 61 73 73 65 72 74 28 20 69 50 6f       assert( iPo
25f60 73 31 3e 3d 30 20 26 26 20 69 50 6f 73 32 3e 3d  s1>=0 && iPos2>=
25f70 30 20 29 3b 0a 0a 20 20 20 20 20 20 20 20 69 66  0 );..        if
25f80 28 20 69 50 6f 73 31 3c 69 50 6f 73 32 20 29 7b  ( iPos1<iPos2 ){
25f90 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
25fa0 65 33 46 74 73 35 50 6f 73 6c 69 73 74 53 61 66  e3Fts5PoslistSaf
25fb0 65 41 70 70 65 6e 64 28 26 74 6d 70 2c 20 26 69  eAppend(&tmp, &i
25fc0 50 72 65 76 2c 20 69 50 6f 73 31 29 3b 0a 20 20  Prev, iPos1);.  
25fd0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 46          sqlite3F
25fe0 74 73 35 50 6f 73 6c 69 73 74 4e 65 78 74 36 34  ts5PoslistNext64
25ff0 28 61 31 2c 20 69 31 2e 6e 50 6f 73 6c 69 73 74  (a1, i1.nPoslist
26000 2c 20 26 69 4f 66 66 31 2c 20 26 69 50 6f 73 31  , &iOff1, &iPos1
26010 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  );.        }else
26020 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
26030 74 65 33 46 74 73 35 50 6f 73 6c 69 73 74 53 61  te3Fts5PoslistSa
26040 66 65 41 70 70 65 6e 64 28 26 74 6d 70 2c 20 26  feAppend(&tmp, &
26050 69 50 72 65 76 2c 20 69 50 6f 73 32 29 3b 0a 20  iPrev, iPos2);. 
26060 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
26070 46 74 73 35 50 6f 73 6c 69 73 74 4e 65 78 74 36  Fts5PoslistNext6
26080 34 28 61 32 2c 20 69 32 2e 6e 50 6f 73 6c 69 73  4(a2, i2.nPoslis
26090 74 2c 20 26 69 4f 66 66 32 2c 20 26 69 50 6f 73  t, &iOff2, &iPos
260a0 32 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20  2);.        }.. 
260b0 20 20 20 20 20 20 20 69 66 28 20 69 50 6f 73 31         if( iPos1
260c0 3e 3d 30 20 26 26 20 69 50 6f 73 32 3e 3d 30 20  >=0 && iPos2>=0 
260d0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 77 68 69  ){.          whi
260e0 6c 65 28 20 31 20 29 7b 0a 20 20 20 20 20 20 20  le( 1 ){.       
260f0 20 20 20 20 20 69 66 28 20 69 50 6f 73 31 3c 69       if( iPos1<i
26100 50 6f 73 32 20 29 7b 0a 20 20 20 20 20 20 20 20  Pos2 ){.        
26110 20 20 20 20 20 20 69 66 28 20 69 50 6f 73 31 21        if( iPos1!
26120 3d 69 50 72 65 76 20 29 7b 0a 20 20 20 20 20 20  =iPrev ){.      
26130 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
26140 33 46 74 73 35 50 6f 73 6c 69 73 74 53 61 66 65  3Fts5PoslistSafe
26150 41 70 70 65 6e 64 28 26 74 6d 70 2c 20 26 69 50  Append(&tmp, &iP
26160 72 65 76 2c 20 69 50 6f 73 31 29 3b 0a 20 20 20  rev, iPos1);.   
26170 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
26180 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
26190 65 33 46 74 73 35 50 6f 73 6c 69 73 74 4e 65 78  e3Fts5PoslistNex
261a0 74 36 34 28 61 31 2c 20 69 31 2e 6e 50 6f 73 6c  t64(a1, i1.nPosl
261b0 69 73 74 2c 20 26 69 4f 66 66 31 2c 20 26 69 50  ist, &iOff1, &iP
261c0 6f 73 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20  os1);.          
261d0 20 20 20 20 69 66 28 20 69 50 6f 73 31 3c 30 20      if( iPos1<0 
261e0 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20  ) break;.       
261f0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
26200 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
26210 28 20 69 50 6f 73 32 21 3d 69 50 72 65 76 20 29  ( iPos2!=iPrev )
26220 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
26230 73 71 6c 69 74 65 33 46 74 73 35 50 6f 73 6c 69  sqlite3Fts5Posli
26240 73 74 53 61 66 65 41 70 70 65 6e 64 28 26 74 6d  stSafeAppend(&tm
26250 70 2c 20 26 69 50 72 65 76 2c 20 69 50 6f 73 32  p, &iPrev, iPos2
26260 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
26270 20 73 71 6c 69 74 65 33 46 74 73 35 50 6f 73 6c   sqlite3Fts5Posl
26280 69 73 74 4e 65 78 74 36 34 28 61 32 2c 20 69 32  istNext64(a2, i2
26290 2e 6e 50 6f 73 6c 69 73 74 2c 20 26 69 4f 66 66  .nPoslist, &iOff
262a0 32 2c 20 26 69 50 6f 73 32 29 3b 0a 20 20 20 20  2, &iPos2);.    
262b0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69 50            if( iP
262c0 6f 73 32 3c 30 20 29 20 62 72 65 61 6b 3b 0a 20  os2<0 ) break;. 
262d0 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
262e0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
262f0 20 7d 0a 0a 20 20 20 20 20 20 20 20 69 66 28 20   }..        if( 
26300 69 50 6f 73 31 3e 3d 30 20 29 7b 0a 20 20 20 20  iPos1>=0 ){.    
26310 20 20 20 20 20 20 69 66 28 20 69 50 6f 73 31 21        if( iPos1!
26320 3d 69 50 72 65 76 20 29 7b 0a 20 20 20 20 20 20  =iPrev ){.      
26330 20 20 20 20 20 20 73 71 6c 69 74 65 33 46 74 73        sqlite3Fts
26340 35 50 6f 73 6c 69 73 74 53 61 66 65 41 70 70 65  5PoslistSafeAppe
26350 6e 64 28 26 74 6d 70 2c 20 26 69 50 72 65 76 2c  nd(&tmp, &iPrev,
26360 20 69 50 6f 73 31 29 3b 0a 20 20 20 20 20 20 20   iPos1);.       
26370 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 66     }.          f
26380 74 73 35 42 75 66 66 65 72 53 61 66 65 41 70 70  ts5BufferSafeApp
26390 65 6e 64 42 6c 6f 62 28 26 74 6d 70 2c 20 26 61  endBlob(&tmp, &a
263a0 31 5b 69 4f 66 66 31 5d 2c 20 69 31 2e 6e 50 6f  1[iOff1], i1.nPo
263b0 73 6c 69 73 74 2d 69 4f 66 66 31 29 3b 0a 20 20  slist-iOff1);.  
263c0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
263d0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69         assert( i
263e0 50 6f 73 32 3e 3d 30 20 26 26 20 69 50 6f 73 32  Pos2>=0 && iPos2
263f0 21 3d 69 50 72 65 76 20 29 3b 0a 20 20 20 20 20  !=iPrev );.     
26400 20 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35       sqlite3Fts5
26410 50 6f 73 6c 69 73 74 53 61 66 65 41 70 70 65 6e  PoslistSafeAppen
26420 64 28 26 74 6d 70 2c 20 26 69 50 72 65 76 2c 20  d(&tmp, &iPrev, 
26430 69 50 6f 73 32 29 3b 0a 20 20 20 20 20 20 20 20  iPos2);.        
26440 20 20 66 74 73 35 42 75 66 66 65 72 53 61 66 65    fts5BufferSafe
26450 41 70 70 65 6e 64 42 6c 6f 62 28 26 74 6d 70 2c  AppendBlob(&tmp,
26460 20 26 61 32 5b 69 4f 66 66 32 5d 2c 20 69 32 2e   &a2[iOff2], i2.
26470 6e 50 6f 73 6c 69 73 74 2d 69 4f 66 66 32 29 3b  nPoslist-iOff2);
26480 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  .        }..    
26490 20 20 20 20 2f 2a 20 57 52 49 54 45 50 4f 53 4c      /* WRITEPOSL
264a0 49 53 54 53 49 5a 45 20 2a 2f 0a 20 20 20 20 20  ISTSIZE */.     
264b0 20 20 20 66 74 73 35 42 75 66 66 65 72 53 61 66     fts5BufferSaf
264c0 65 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26 6f  eAppendVarint(&o
264d0 75 74 2c 20 74 6d 70 2e 6e 20 2a 20 32 29 3b 0a  ut, tmp.n * 2);.
264e0 20 20 20 20 20 20 20 20 66 74 73 35 42 75 66 66          fts5Buff
264f0 65 72 53 61 66 65 41 70 70 65 6e 64 42 6c 6f 62  erSafeAppendBlob
26500 28 26 6f 75 74 2c 20 74 6d 70 2e 70 2c 20 74 6d  (&out, tmp.p, tm
26510 70 2e 6e 29 3b 0a 20 20 20 20 20 20 20 20 66 74  p.n);.        ft
26520 73 35 44 6f 63 6c 69 73 74 49 74 65 72 4e 65 78  s5DoclistIterNex
26530 74 28 26 69 31 29 3b 0a 20 20 20 20 20 20 20 20  t(&i1);.        
26540 66 74 73 35 44 6f 63 6c 69 73 74 49 74 65 72 4e  fts5DoclistIterN
26550 65 78 74 28 26 69 32 29 3b 0a 20 20 20 20 20 20  ext(&i2);.      
26560 20 20 69 66 28 20 69 31 2e 61 50 6f 73 6c 69 73    if( i1.aPoslis
26570 74 3d 3d 30 20 7c 7c 20 69 32 2e 61 50 6f 73 6c  t==0 || i2.aPosl
26580 69 73 74 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a  ist==0 ) break;.
26590 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
265a0 20 20 20 69 66 28 20 69 31 2e 61 50 6f 73 6c 69     if( i1.aPosli
265b0 73 74 20 29 7b 0a 20 20 20 20 20 20 66 74 73 35  st ){.      fts5
265c0 4d 65 72 67 65 41 70 70 65 6e 64 44 6f 63 69 64  MergeAppendDocid
265d0 28 26 6f 75 74 2c 20 69 4c 61 73 74 52 6f 77 69  (&out, iLastRowi
265e0 64 2c 20 69 31 2e 69 52 6f 77 69 64 29 3b 0a 20  d, i1.iRowid);. 
265f0 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72 53       fts5BufferS
26600 61 66 65 41 70 70 65 6e 64 42 6c 6f 62 28 26 6f  afeAppendBlob(&o
26610 75 74 2c 20 69 31 2e 61 50 6f 73 6c 69 73 74 2c  ut, i1.aPoslist,
26620 20 69 31 2e 61 45 6f 66 20 2d 20 69 31 2e 61 50   i1.aEof - i1.aP
26630 6f 73 6c 69 73 74 29 3b 0a 20 20 20 20 7d 0a 20  oslist);.    }. 
26640 20 20 20 65 6c 73 65 20 69 66 28 20 69 32 2e 61     else if( i2.a
26650 50 6f 73 6c 69 73 74 20 29 7b 0a 20 20 20 20 20  Poslist ){.     
26660 20 66 74 73 35 4d 65 72 67 65 41 70 70 65 6e 64   fts5MergeAppend
26670 44 6f 63 69 64 28 26 6f 75 74 2c 20 69 4c 61 73  Docid(&out, iLas
26680 74 52 6f 77 69 64 2c 20 69 32 2e 69 52 6f 77 69  tRowid, i2.iRowi
26690 64 29 3b 0a 20 20 20 20 20 20 66 74 73 35 42 75  d);.      fts5Bu
266a0 66 66 65 72 53 61 66 65 41 70 70 65 6e 64 42 6c  fferSafeAppendBl
266b0 6f 62 28 26 6f 75 74 2c 20 69 32 2e 61 50 6f 73  ob(&out, i2.aPos
266c0 6c 69 73 74 2c 20 69 32 2e 61 45 6f 66 20 2d 20  list, i2.aEof - 
266d0 69 32 2e 61 50 6f 73 6c 69 73 74 29 3b 0a 20 20  i2.aPoslist);.  
266e0 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20    }.    assert( 
266f0 6f 75 74 2e 6e 3c 3d 28 70 31 2d 3e 6e 2b 70 32  out.n<=(p1->n+p2
26700 2d 3e 6e 2b 39 29 20 29 3b 0a 0a 20 20 20 20 66  ->n+9) );..    f
26710 74 73 35 42 75 66 66 65 72 53 65 74 28 26 70 2d  ts5BufferSet(&p-
26720 3e 72 63 2c 20 70 31 2c 20 6f 75 74 2e 6e 2c 20  >rc, p1, out.n, 
26730 6f 75 74 2e 70 29 3b 0a 20 20 20 20 66 74 73 35  out.p);.    fts5
26740 42 75 66 66 65 72 46 72 65 65 28 26 74 6d 70 29  BufferFree(&tmp)
26750 3b 0a 20 20 20 20 66 74 73 35 42 75 66 66 65 72  ;.    fts5Buffer
26760 46 72 65 65 28 26 6f 75 74 29 3b 0a 20 20 7d 0a  Free(&out);.  }.
26770 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  }..static void f
26780 74 73 35 53 65 74 75 70 50 72 65 66 69 78 49 74  ts5SetupPrefixIt
26790 65 72 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20  er(.  Fts5Index 
267a0 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  *p,             
267b0 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 74        /* Index t
267c0 6f 20 72 65 61 64 20 66 72 6f 6d 20 2a 2f 0a 20  o read from */. 
267d0 20 69 6e 74 20 62 44 65 73 63 2c 20 20 20 20 20   int bDesc,     
267e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
267f0 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 22 4f 52   /* True for "OR
26800 44 45 52 20 42 59 20 72 6f 77 69 64 20 44 45 53  DER BY rowid DES
26810 43 22 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 75 38  C" */.  const u8
26820 20 2a 70 54 6f 6b 65 6e 2c 20 20 20 20 20 20 20   *pToken,       
26830 20 20 20 20 20 20 20 20 2f 2a 20 42 75 66 66 65          /* Buffe
26840 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 70 72 65  r containing pre
26850 66 69 78 20 74 6f 20 6d 61 74 63 68 20 2a 2f 0a  fix to match */.
26860 20 20 69 6e 74 20 6e 54 6f 6b 65 6e 2c 20 20 20    int nToken,   
26870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26880 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 62 75 66    /* Size of buf
26890 66 65 72 20 70 54 6f 6b 65 6e 20 69 6e 20 62 79  fer pToken in by
268a0 74 65 73 20 2a 2f 0a 20 20 46 74 73 35 43 6f 6c  tes */.  Fts5Col
268b0 73 65 74 20 2a 70 43 6f 6c 73 65 74 2c 20 20 20  set *pColset,   
268c0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74           /* Rest
268d0 72 69 63 74 20 6d 61 74 63 68 65 73 20 74 6f 20  rict matches to 
268e0 74 68 65 73 65 20 63 6f 6c 75 6d 6e 73 20 2a 2f  these columns */
268f0 0a 20 20 46 74 73 35 49 74 65 72 20 2a 2a 70 70  .  Fts5Iter **pp
26900 49 74 65 72 20 20 20 20 20 20 20 20 20 20 2f 2a  Iter          /*
26910 20 4f 55 54 3a 20 4e 65 77 20 69 74 65 72 61 74   OUT: New iterat
26920 6f 72 20 2a 2f 0a 29 7b 0a 20 20 46 74 73 35 53  or */.){.  Fts5S
26930 74 72 75 63 74 75 72 65 20 2a 70 53 74 72 75 63  tructure *pStruc
26940 74 3b 0a 20 20 46 74 73 35 42 75 66 66 65 72 20  t;.  Fts5Buffer 
26950 2a 61 42 75 66 3b 0a 20 20 63 6f 6e 73 74 20 69  *aBuf;.  const i
26960 6e 74 20 6e 42 75 66 20 3d 20 33 32 3b 0a 0a 20  nt nBuf = 32;.. 
26970 20 76 6f 69 64 20 28 2a 78 4d 65 72 67 65 29 28   void (*xMerge)(
26980 46 74 73 35 49 6e 64 65 78 2a 2c 20 46 74 73 35  Fts5Index*, Fts5
26990 42 75 66 66 65 72 2a 2c 20 46 74 73 35 42 75 66  Buffer*, Fts5Buf
269a0 66 65 72 2a 29 3b 0a 20 20 76 6f 69 64 20 28 2a  fer*);.  void (*
269b0 78 41 70 70 65 6e 64 29 28 46 74 73 35 49 6e 64  xAppend)(Fts5Ind
269c0 65 78 2a 2c 20 69 36 34 2c 20 46 74 73 35 49 74  ex*, i64, Fts5It
269d0 65 72 2a 2c 20 46 74 73 35 42 75 66 66 65 72 2a  er*, Fts5Buffer*
269e0 29 3b 0a 20 20 69 66 28 20 70 2d 3e 70 43 6f 6e  );.  if( p->pCon
269f0 66 69 67 2d 3e 65 44 65 74 61 69 6c 3d 3d 46 54  fig->eDetail==FT
26a00 53 35 5f 44 45 54 41 49 4c 5f 4e 4f 4e 45 20 29  S5_DETAIL_NONE )
26a10 7b 0a 20 20 20 20 78 4d 65 72 67 65 20 3d 20 66  {.    xMerge = f
26a20 74 73 35 4d 65 72 67 65 52 6f 77 69 64 4c 69 73  ts5MergeRowidLis
26a30 74 73 3b 0a 20 20 20 20 78 41 70 70 65 6e 64 20  ts;.    xAppend 
26a40 3d 20 66 74 73 35 41 70 70 65 6e 64 52 6f 77 69  = fts5AppendRowi
26a50 64 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  d;.  }else{.    
26a60 78 4d 65 72 67 65 20 3d 20 66 74 73 35 4d 65 72  xMerge = fts5Mer
26a70 67 65 50 72 65 66 69 78 4c 69 73 74 73 3b 0a 20  gePrefixLists;. 
26a80 20 20 20 78 41 70 70 65 6e 64 20 3d 20 66 74 73     xAppend = fts
26a90 35 41 70 70 65 6e 64 50 6f 73 6c 69 73 74 3b 0a  5AppendPoslist;.
26aa0 20 20 7d 0a 0a 20 20 61 42 75 66 20 3d 20 28 46    }..  aBuf = (F
26ab0 74 73 35 42 75 66 66 65 72 2a 29 66 74 73 35 49  ts5Buffer*)fts5I
26ac0 64 78 4d 61 6c 6c 6f 63 28 70 2c 20 73 69 7a 65  dxMalloc(p, size
26ad0 6f 66 28 46 74 73 35 42 75 66 66 65 72 29 2a 6e  of(Fts5Buffer)*n
26ae0 42 75 66 29 3b 0a 20 20 70 53 74 72 75 63 74 20  Buf);.  pStruct 
26af0 3d 20 66 74 73 35 53 74 72 75 63 74 75 72 65 52  = fts5StructureR
26b00 65 61 64 28 70 29 3b 0a 0a 20 20 69 66 28 20 61  ead(p);..  if( a
26b10 42 75 66 20 26 26 20 70 53 74 72 75 63 74 20 29  Buf && pStruct )
26b20 7b 0a 20 20 20 20 63 6f 6e 73 74 20 69 6e 74 20  {.    const int 
26b30 66 6c 61 67 73 20 3d 20 46 54 53 35 49 4e 44 45  flags = FTS5INDE
26b40 58 5f 51 55 45 52 59 5f 53 43 41 4e 20 0a 20 20  X_QUERY_SCAN .  
26b50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26b60 20 20 7c 20 46 54 53 35 49 4e 44 45 58 5f 51 55    | FTS5INDEX_QU
26b70 45 52 59 5f 53 4b 49 50 45 4d 50 54 59 20 0a 20  ERY_SKIPEMPTY . 
26b80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26b90 20 20 20 7c 20 46 54 53 35 49 4e 44 45 58 5f 51     | FTS5INDEX_Q
26ba0 55 45 52 59 5f 4e 4f 4f 55 54 50 55 54 3b 0a 20  UERY_NOOUTPUT;. 
26bb0 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 69 36     int i;.    i6
26bc0 34 20 69 4c 61 73 74 52 6f 77 69 64 20 3d 20 30  4 iLastRowid = 0
26bd0 3b 0a 20 20 20 20 46 74 73 35 49 74 65 72 20 2a  ;.    Fts5Iter *
26be0 70 31 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 49  p1 = 0;     /* I
26bf0 74 65 72 61 74 6f 72 20 75 73 65 64 20 74 6f 20  terator used to 
26c00 67 61 74 68 65 72 20 64 61 74 61 20 66 72 6f 6d  gather data from
26c10 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 46 74   index */.    Ft
26c20 73 35 44 61 74 61 20 2a 70 44 61 74 61 3b 0a 20  s5Data *pData;. 
26c30 20 20 20 46 74 73 35 42 75 66 66 65 72 20 64 6f     Fts5Buffer do
26c40 63 6c 69 73 74 3b 0a 20 20 20 20 69 6e 74 20 62  clist;.    int b
26c50 4e 65 77 54 65 72 6d 20 3d 20 31 3b 0a 0a 20 20  NewTerm = 1;..  
26c60 20 20 6d 65 6d 73 65 74 28 26 64 6f 63 6c 69 73    memset(&doclis
26c70 74 2c 20 30 2c 20 73 69 7a 65 6f 66 28 64 6f 63  t, 0, sizeof(doc
26c80 6c 69 73 74 29 29 3b 0a 20 20 20 20 66 74 73 35  list));.    fts5
26c90 4d 75 6c 74 69 49 74 65 72 4e 65 77 28 70 2c 20  MultiIterNew(p, 
26ca0 70 53 74 72 75 63 74 2c 20 66 6c 61 67 73 2c 20  pStruct, flags, 
26cb0 70 43 6f 6c 73 65 74 2c 20 70 54 6f 6b 65 6e 2c  pColset, pToken,
26cc0 20 6e 54 6f 6b 65 6e 2c 20 2d 31 2c 20 30 2c 20   nToken, -1, 0, 
26cd0 26 70 31 29 3b 0a 20 20 20 20 66 74 73 35 49 74  &p1);.    fts5It
26ce0 65 72 53 65 74 4f 75 74 70 75 74 43 62 28 26 70  erSetOutputCb(&p
26cf0 2d 3e 72 63 2c 20 70 31 29 3b 0a 20 20 20 20 66  ->rc, p1);.    f
26d00 6f 72 28 20 2f 2a 20 6e 6f 2d 6f 70 20 2a 2f 20  or( /* no-op */ 
26d10 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35 4d 75  ;.        fts5Mu
26d20 6c 74 69 49 74 65 72 45 6f 66 28 70 2c 20 70 31  ltiIterEof(p, p1
26d30 29 3d 3d 30 3b 0a 20 20 20 20 20 20 20 20 66 74  )==0;.        ft
26d40 73 35 4d 75 6c 74 69 49 74 65 72 4e 65 78 74 32  s5MultiIterNext2
26d50 28 70 2c 20 70 31 2c 20 26 62 4e 65 77 54 65 72  (p, p1, &bNewTer
26d60 6d 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  m).    ){.      
26d70 46 74 73 35 53 65 67 49 74 65 72 20 2a 70 53 65  Fts5SegIter *pSe
26d80 67 20 3d 20 26 70 31 2d 3e 61 53 65 67 5b 20 70  g = &p1->aSeg[ p
26d90 31 2d 3e 61 46 69 72 73 74 5b 31 5d 2e 69 46 69  1->aFirst[1].iFi
26da0 72 73 74 20 5d 3b 0a 20 20 20 20 20 20 69 6e 74  rst ];.      int
26db0 20 6e 54 65 72 6d 20 3d 20 70 53 65 67 2d 3e 74   nTerm = pSeg->t
26dc0 65 72 6d 2e 6e 3b 0a 20 20 20 20 20 20 63 6f 6e  erm.n;.      con
26dd0 73 74 20 75 38 20 2a 70 54 65 72 6d 20 3d 20 70  st u8 *pTerm = p
26de0 53 65 67 2d 3e 74 65 72 6d 2e 70 3b 0a 20 20 20  Seg->term.p;.   
26df0 20 20 20 70 31 2d 3e 78 53 65 74 4f 75 74 70 75     p1->xSetOutpu
26e00 74 73 28 70 31 2c 20 70 53 65 67 29 3b 0a 0a 20  ts(p1, pSeg);.. 
26e10 20 20 20 20 20 61 73 73 65 72 74 5f 6e 63 28 20       assert_nc( 
26e20 6d 65 6d 63 6d 70 28 70 54 6f 6b 65 6e 2c 20 70  memcmp(pToken, p
26e30 54 65 72 6d 2c 20 4d 49 4e 28 6e 54 6f 6b 65 6e  Term, MIN(nToken
26e40 2c 20 6e 54 65 72 6d 29 29 3c 3d 30 20 29 3b 0a  , nTerm))<=0 );.
26e50 20 20 20 20 20 20 69 66 28 20 62 4e 65 77 54 65        if( bNewTe
26e60 72 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  rm ){.        if
26e70 28 20 6e 54 65 72 6d 3c 6e 54 6f 6b 65 6e 20 7c  ( nTerm<nToken |
26e80 7c 20 6d 65 6d 63 6d 70 28 70 54 6f 6b 65 6e 2c  | memcmp(pToken,
26e90 20 70 54 65 72 6d 2c 20 6e 54 6f 6b 65 6e 29 20   pTerm, nToken) 
26ea0 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d  ) break;.      }
26eb0 0a 0a 20 20 20 20 20 20 69 66 28 20 70 31 2d 3e  ..      if( p1->
26ec0 62 61 73 65 2e 6e 44 61 74 61 3d 3d 30 20 29 20  base.nData==0 ) 
26ed0 63 6f 6e 74 69 6e 75 65 3b 0a 0a 20 20 20 20 20  continue;..     
26ee0 20 69 66 28 20 70 31 2d 3e 62 61 73 65 2e 69 52   if( p1->base.iR
26ef0 6f 77 69 64 3c 3d 69 4c 61 73 74 52 6f 77 69 64  owid<=iLastRowid
26f00 20 26 26 20 64 6f 63 6c 69 73 74 2e 6e 3e 30 20   && doclist.n>0 
26f10 29 7b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69  ){.        for(i
26f20 3d 30 3b 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  =0; p->rc==SQLIT
26f30 45 5f 4f 4b 20 26 26 20 64 6f 63 6c 69 73 74 2e  E_OK && doclist.
26f40 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  n; i++){.       
26f50 20 20 20 61 73 73 65 72 74 28 20 69 3c 6e 42 75     assert( i<nBu
26f60 66 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  f );.          i
26f70 66 28 20 61 42 75 66 5b 69 5d 2e 6e 3d 3d 30 20  f( aBuf[i].n==0 
26f80 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 66  ){.            f
26f90 74 73 35 42 75 66 66 65 72 53 77 61 70 28 26 64  ts5BufferSwap(&d
26fa0 6f 63 6c 69 73 74 2c 20 26 61 42 75 66 5b 69 5d  oclist, &aBuf[i]
26fb0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 66  );.            f
26fc0 74 73 35 42 75 66 66 65 72 5a 65 72 6f 28 26 64  ts5BufferZero(&d
26fd0 6f 63 6c 69 73 74 29 3b 0a 20 20 20 20 20 20 20  oclist);.       
26fe0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
26ff0 20 20 20 20 20 20 78 4d 65 72 67 65 28 70 2c 20        xMerge(p, 
27000 26 64 6f 63 6c 69 73 74 2c 20 26 61 42 75 66 5b  &doclist, &aBuf[
27010 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  i]);.           
27020 20 66 74 73 35 42 75 66 66 65 72 5a 65 72 6f 28   fts5BufferZero(
27030 26 61 42 75 66 5b 69 5d 29 3b 0a 20 20 20 20 20  &aBuf[i]);.     
27040 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
27050 0a 20 20 20 20 20 20 20 20 69 4c 61 73 74 52 6f  .        iLastRo
27060 77 69 64 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  wid = 0;.      }
27070 0a 0a 20 20 20 20 20 20 78 41 70 70 65 6e 64 28  ..      xAppend(
27080 70 2c 20 70 31 2d 3e 62 61 73 65 2e 69 52 6f 77  p, p1->base.iRow
27090 69 64 2d 69 4c 61 73 74 52 6f 77 69 64 2c 20 70  id-iLastRowid, p
270a0 31 2c 20 26 64 6f 63 6c 69 73 74 29 3b 0a 20 20  1, &doclist);.  
270b0 20 20 20 20 69 4c 61 73 74 52 6f 77 69 64 20 3d      iLastRowid =
270c0 20 70 31 2d 3e 62 61 73 65 2e 69 52 6f 77 69 64   p1->base.iRowid
270d0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 66 6f 72  ;.    }..    for
270e0 28 69 3d 30 3b 20 69 3c 6e 42 75 66 3b 20 69 2b  (i=0; i<nBuf; i+
270f0 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d  +){.      if( p-
27100 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  >rc==SQLITE_OK )
27110 7b 0a 20 20 20 20 20 20 20 20 78 4d 65 72 67 65  {.        xMerge
27120 28 70 2c 20 26 64 6f 63 6c 69 73 74 2c 20 26 61  (p, &doclist, &a
27130 42 75 66 5b 69 5d 29 3b 0a 20 20 20 20 20 20 7d  Buf[i]);.      }
27140 0a 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65  .      fts5Buffe
27150 72 46 72 65 65 28 26 61 42 75 66 5b 69 5d 29 3b  rFree(&aBuf[i]);
27160 0a 20 20 20 20 7d 0a 20 20 20 20 66 74 73 35 4d  .    }.    fts5M
27170 75 6c 74 69 49 74 65 72 46 72 65 65 28 70 31 29  ultiIterFree(p1)
27180 3b 0a 0a 20 20 20 20 70 44 61 74 61 20 3d 20 66  ;..    pData = f
27190 74 73 35 49 64 78 4d 61 6c 6c 6f 63 28 70 2c 20  ts5IdxMalloc(p, 
271a0 73 69 7a 65 6f 66 28 46 74 73 35 44 61 74 61 29  sizeof(Fts5Data)
271b0 20 2b 20 64 6f 63 6c 69 73 74 2e 6e 29 3b 0a 20   + doclist.n);. 
271c0 20 20 20 69 66 28 20 70 44 61 74 61 20 29 7b 0a     if( pData ){.
271d0 20 20 20 20 20 20 70 44 61 74 61 2d 3e 70 20 3d        pData->p =
271e0 20 28 75 38 2a 29 26 70 44 61 74 61 5b 31 5d 3b   (u8*)&pData[1];
271f0 0a 20 20 20 20 20 20 70 44 61 74 61 2d 3e 6e 6e  .      pData->nn
27200 20 3d 20 70 44 61 74 61 2d 3e 73 7a 4c 65 61 66   = pData->szLeaf
27210 20 3d 20 64 6f 63 6c 69 73 74 2e 6e 3b 0a 20 20   = doclist.n;.  
27220 20 20 20 20 69 66 28 20 64 6f 63 6c 69 73 74 2e      if( doclist.
27230 6e 20 29 20 6d 65 6d 63 70 79 28 70 44 61 74 61  n ) memcpy(pData
27240 2d 3e 70 2c 20 64 6f 63 6c 69 73 74 2e 70 2c 20  ->p, doclist.p, 
27250 64 6f 63 6c 69 73 74 2e 6e 29 3b 0a 20 20 20 20  doclist.n);.    
27260 20 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 4e    fts5MultiIterN
27270 65 77 32 28 70 2c 20 70 44 61 74 61 2c 20 62 44  ew2(p, pData, bD
27280 65 73 63 2c 20 70 70 49 74 65 72 29 3b 0a 20 20  esc, ppIter);.  
27290 20 20 7d 0a 20 20 20 20 66 74 73 35 42 75 66 66    }.    fts5Buff
272a0 65 72 46 72 65 65 28 26 64 6f 63 6c 69 73 74 29  erFree(&doclist)
272b0 3b 0a 20 20 7d 0a 0a 20 20 66 74 73 35 53 74 72  ;.  }..  fts5Str
272c0 75 63 74 75 72 65 52 65 6c 65 61 73 65 28 70 53  uctureRelease(pS
272d0 74 72 75 63 74 29 3b 0a 20 20 73 71 6c 69 74 65  truct);.  sqlite
272e0 33 5f 66 72 65 65 28 61 42 75 66 29 3b 0a 7d 0a  3_free(aBuf);.}.
272f0 0a 0a 2f 2a 0a 2a 2a 20 49 6e 64 69 63 61 74 65  ../*.** Indicate
27300 20 74 68 61 74 20 61 6c 6c 20 73 75 62 73 65 71   that all subseq
27310 75 65 6e 74 20 63 61 6c 6c 73 20 74 6f 20 73 71  uent calls to sq
27320 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78 57 72  lite3Fts5IndexWr
27330 69 74 65 28 29 20 70 65 72 74 61 69 6e 0a 2a 2a  ite() pertain.**
27340 20 74 6f 20 74 68 65 20 64 6f 63 75 6d 65 6e 74   to the document
27350 20 77 69 74 68 20 72 6f 77 69 64 20 69 52 6f 77   with rowid iRow
27360 69 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  id..*/.int sqlit
27370 65 33 46 74 73 35 49 6e 64 65 78 42 65 67 69 6e  e3Fts5IndexBegin
27380 57 72 69 74 65 28 46 74 73 35 49 6e 64 65 78 20  Write(Fts5Index 
27390 2a 70 2c 20 69 6e 74 20 62 44 65 6c 65 74 65 2c  *p, int bDelete,
273a0 20 69 36 34 20 69 52 6f 77 69 64 29 7b 0a 20 20   i64 iRowid){.  
273b0 61 73 73 65 72 74 28 20 70 2d 3e 72 63 3d 3d 53  assert( p->rc==S
273c0 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 0a 20 20 2f  QLITE_OK );..  /
273d0 2a 20 41 6c 6c 6f 63 61 74 65 20 74 68 65 20 68  * Allocate the h
273e0 61 73 68 20 74 61 62 6c 65 20 69 66 20 69 74 20  ash table if it 
273f0 68 61 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20  has not already 
27400 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20 2a  been allocated *
27410 2f 0a 20 20 69 66 28 20 70 2d 3e 70 48 61 73 68  /.  if( p->pHash
27420 3d 3d 30 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63  ==0 ){.    p->rc
27430 20 3d 20 73 71 6c 69 74 65 33 46 74 73 35 48 61   = sqlite3Fts5Ha
27440 73 68 4e 65 77 28 70 2d 3e 70 43 6f 6e 66 69 67  shNew(p->pConfig
27450 2c 20 26 70 2d 3e 70 48 61 73 68 2c 20 26 70 2d  , &p->pHash, &p-
27460 3e 6e 50 65 6e 64 69 6e 67 44 61 74 61 29 3b 0a  >nPendingData);.
27470 20 20 7d 0a 0a 20 20 2f 2a 20 46 6c 75 73 68 20    }..  /* Flush 
27480 74 68 65 20 68 61 73 68 20 74 61 62 6c 65 20 74  the hash table t
27490 6f 20 64 69 73 6b 20 69 66 20 72 65 71 75 69 72  o disk if requir
274a0 65 64 20 2a 2f 0a 20 20 69 66 28 20 69 52 6f 77  ed */.  if( iRow
274b0 69 64 3c 70 2d 3e 69 57 72 69 74 65 52 6f 77 69  id<p->iWriteRowi
274c0 64 20 0a 20 20 20 7c 7c 20 28 69 52 6f 77 69 64  d .   || (iRowid
274d0 3d 3d 70 2d 3e 69 57 72 69 74 65 52 6f 77 69 64  ==p->iWriteRowid
274e0 20 26 26 20 70 2d 3e 62 44 65 6c 65 74 65 3d 3d   && p->bDelete==
274f0 30 29 0a 20 20 20 7c 7c 20 28 70 2d 3e 6e 50 65  0).   || (p->nPe
27500 6e 64 69 6e 67 44 61 74 61 20 3e 20 70 2d 3e 70  ndingData > p->p
27510 43 6f 6e 66 69 67 2d 3e 6e 48 61 73 68 53 69 7a  Config->nHashSiz
27520 65 29 20 0a 20 20 29 7b 0a 20 20 20 20 66 74 73  e) .  ){.    fts
27530 35 49 6e 64 65 78 46 6c 75 73 68 28 70 29 3b 0a  5IndexFlush(p);.
27540 20 20 7d 0a 0a 20 20 70 2d 3e 69 57 72 69 74 65    }..  p->iWrite
27550 52 6f 77 69 64 20 3d 20 69 52 6f 77 69 64 3b 0a  Rowid = iRowid;.
27560 20 20 70 2d 3e 62 44 65 6c 65 74 65 20 3d 20 62    p->bDelete = b
27570 44 65 6c 65 74 65 3b 0a 20 20 72 65 74 75 72 6e  Delete;.  return
27580 20 66 74 73 35 49 6e 64 65 78 52 65 74 75 72 6e   fts5IndexReturn
27590 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f  (p);.}../*.** Co
275a0 6d 6d 69 74 20 64 61 74 61 20 74 6f 20 64 69 73  mmit data to dis
275b0 6b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  k..*/.int sqlite
275c0 33 46 74 73 35 49 6e 64 65 78 53 79 6e 63 28 46  3Fts5IndexSync(F
275d0 74 73 35 49 6e 64 65 78 20 2a 70 29 7b 0a 20 20  ts5Index *p){.  
275e0 61 73 73 65 72 74 28 20 70 2d 3e 72 63 3d 3d 53  assert( p->rc==S
275f0 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 66 74  QLITE_OK );.  ft
27600 73 35 49 6e 64 65 78 46 6c 75 73 68 28 70 29 3b  s5IndexFlush(p);
27610 0a 20 20 66 74 73 35 43 6c 6f 73 65 52 65 61 64  .  fts5CloseRead
27620 65 72 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  er(p);.  return 
27630 66 74 73 35 49 6e 64 65 78 52 65 74 75 72 6e 28  fts5IndexReturn(
27640 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 69 73  p);.}../*.** Dis
27650 63 61 72 64 20 61 6e 79 20 64 61 74 61 20 73 74  card any data st
27660 6f 72 65 64 20 69 6e 20 74 68 65 20 69 6e 2d 6d  ored in the in-m
27670 65 6d 6f 72 79 20 68 61 73 68 20 74 61 62 6c 65  emory hash table
27680 73 2e 20 44 6f 20 6e 6f 74 20 77 72 69 74 65 20  s. Do not write 
27690 69 74 0a 2a 2a 20 74 6f 20 74 68 65 20 64 61 74  it.** to the dat
276a0 61 62 61 73 65 2e 20 41 64 64 69 74 69 6f 6e 61  abase. Additiona
276b0 6c 6c 79 2c 20 61 73 73 75 6d 65 20 74 68 61 74  lly, assume that
276c0 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
276d0 20 74 68 65 20 25 5f 64 61 74 61 0a 2a 2a 20 74   the %_data.** t
276e0 61 62 6c 65 20 6d 61 79 20 68 61 76 65 20 63 68  able may have ch
276f0 61 6e 67 65 64 20 6f 6e 20 64 69 73 6b 2e 20 53  anged on disk. S
27700 6f 20 61 6e 79 20 69 6e 2d 6d 65 6d 6f 72 79 20  o any in-memory 
27710 63 61 63 68 65 73 20 6f 66 20 25 5f 64 61 74 61  caches of %_data
27720 20 0a 2a 2a 20 72 65 63 6f 72 64 73 20 6d 75 73   .** records mus
27730 74 20 62 65 20 69 6e 76 61 6c 69 64 61 74 65 64  t be invalidated
27740 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
27750 46 74 73 35 49 6e 64 65 78 52 6f 6c 6c 62 61 63  Fts5IndexRollbac
27760 6b 28 46 74 73 35 49 6e 64 65 78 20 2a 70 29 7b  k(Fts5Index *p){
27770 0a 20 20 66 74 73 35 43 6c 6f 73 65 52 65 61 64  .  fts5CloseRead
27780 65 72 28 70 29 3b 0a 20 20 66 74 73 35 49 6e 64  er(p);.  fts5Ind
27790 65 78 44 69 73 63 61 72 64 44 61 74 61 28 70 29  exDiscardData(p)
277a0 3b 0a 20 20 66 74 73 35 53 74 72 75 63 74 75 72  ;.  fts5Structur
277b0 65 49 6e 76 61 6c 69 64 61 74 65 28 70 29 3b 0a  eInvalidate(p);.
277c0 20 20 2f 2a 20 61 73 73 65 72 74 28 20 70 2d 3e    /* assert( p->
277d0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  rc==SQLITE_OK );
277e0 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 53 51 4c   */.  return SQL
277f0 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
27800 20 54 68 65 20 25 5f 64 61 74 61 20 74 61 62 6c   The %_data tabl
27810 65 20 69 73 20 63 6f 6d 70 6c 65 74 65 6c 79 20  e is completely 
27820 65 6d 70 74 79 20 77 68 65 6e 20 74 68 69 73 20  empty when this 
27830 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
27840 65 64 2e 20 54 68 69 73 0a 2a 2a 20 66 75 6e 63  ed. This.** func
27850 74 69 6f 6e 20 70 6f 70 75 6c 61 74 65 73 20 69  tion populates i
27860 74 20 77 69 74 68 20 74 68 65 20 69 6e 69 74 69  t with the initi
27870 61 6c 20 73 74 72 75 63 74 75 72 65 20 6f 62 6a  al structure obj
27880 65 63 74 73 20 66 6f 72 20 65 61 63 68 20 69 6e  ects for each in
27890 64 65 78 2c 0a 2a 2a 20 61 6e 64 20 74 68 65 20  dex,.** and the 
278a0 69 6e 69 74 69 61 6c 20 76 65 72 73 69 6f 6e 20  initial version 
278b0 6f 66 20 74 68 65 20 22 61 76 65 72 61 67 65 73  of the "averages
278c0 22 20 72 65 63 6f 72 64 20 28 61 20 7a 65 72 6f  " record (a zero
278d0 2d 62 79 74 65 20 62 6c 6f 62 29 2e 0a 2a 2f 0a  -byte blob)..*/.
278e0 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 49  int sqlite3Fts5I
278f0 6e 64 65 78 52 65 69 6e 69 74 28 46 74 73 35 49  ndexReinit(Fts5I
27900 6e 64 65 78 20 2a 70 29 7b 0a 20 20 46 74 73 35  ndex *p){.  Fts5
27910 53 74 72 75 63 74 75 72 65 20 73 3b 0a 20 20 66  Structure s;.  f
27920 74 73 35 53 74 72 75 63 74 75 72 65 49 6e 76 61  ts5StructureInva
27930 6c 69 64 61 74 65 28 70 29 3b 0a 20 20 6d 65 6d  lidate(p);.  mem
27940 73 65 74 28 26 73 2c 20 30 2c 20 73 69 7a 65 6f  set(&s, 0, sizeo
27950 66 28 46 74 73 35 53 74 72 75 63 74 75 72 65 29  f(Fts5Structure)
27960 29 3b 0a 20 20 66 74 73 35 44 61 74 61 57 72 69  );.  fts5DataWri
27970 74 65 28 70 2c 20 46 54 53 35 5f 41 56 45 52 41  te(p, FTS5_AVERA
27980 47 45 53 5f 52 4f 57 49 44 2c 20 28 63 6f 6e 73  GES_ROWID, (cons
27990 74 20 75 38 2a 29 22 22 2c 20 30 29 3b 0a 20 20  t u8*)"", 0);.  
279a0 66 74 73 35 53 74 72 75 63 74 75 72 65 57 72 69  fts5StructureWri
279b0 74 65 28 70 2c 20 26 73 29 3b 0a 20 20 72 65 74  te(p, &s);.  ret
279c0 75 72 6e 20 66 74 73 35 49 6e 64 65 78 52 65 74  urn fts5IndexRet
279d0 75 72 6e 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn(p);.}../*.**
279e0 20 4f 70 65 6e 20 61 20 6e 65 77 20 46 74 73 35   Open a new Fts5
279f0 49 6e 64 65 78 20 68 61 6e 64 6c 65 2e 20 49 66  Index handle. If
27a00 20 74 68 65 20 62 43 72 65 61 74 65 20 61 72 67   the bCreate arg
27a10 75 6d 65 6e 74 20 69 73 20 74 72 75 65 2c 20 63  ument is true, c
27a20 72 65 61 74 65 0a 2a 2a 20 61 6e 64 20 69 6e 69  reate.** and ini
27a30 74 69 61 6c 69 7a 65 20 74 68 65 20 75 6e 64 65  tialize the unde
27a40 72 6c 79 69 6e 67 20 25 5f 64 61 74 61 20 74 61  rlying %_data ta
27a50 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75  ble..**.** If su
27a60 63 63 65 73 73 66 75 6c 2c 20 73 65 74 20 2a 70  ccessful, set *p
27a70 70 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68  p to point to th
27a80 65 20 6e 65 77 20 6f 62 6a 65 63 74 20 61 6e 64  e new object and
27a90 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
27aa0 4b 2e 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c  K..** Otherwise,
27ab0 20 73 65 74 20 2a 70 70 20 74 6f 20 4e 55 4c 4c   set *pp to NULL
27ac0 20 61 6e 64 20 72 65 74 75 72 6e 20 61 6e 20 53   and return an S
27ad0 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65  QLite error code
27ae0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
27af0 46 74 73 35 49 6e 64 65 78 4f 70 65 6e 28 0a 20  Fts5IndexOpen(. 
27b00 20 46 74 73 35 43 6f 6e 66 69 67 20 2a 70 43 6f   Fts5Config *pCo
27b10 6e 66 69 67 2c 20 0a 20 20 69 6e 74 20 62 43 72  nfig, .  int bCr
27b20 65 61 74 65 2c 20 0a 20 20 46 74 73 35 49 6e 64  eate, .  Fts5Ind
27b30 65 78 20 2a 2a 70 70 2c 0a 20 20 63 68 61 72 20  ex **pp,.  char 
27b40 2a 2a 70 7a 45 72 72 0a 29 7b 0a 20 20 69 6e 74  **pzErr.){.  int
27b50 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
27b60 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 3b  .  Fts5Index *p;
27b70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27b80 20 20 20 2f 2a 20 4e 65 77 20 6f 62 6a 65 63 74     /* New object
27b90 20 2a 2f 0a 0a 20 20 2a 70 70 20 3d 20 70 20 3d   */..  *pp = p =
27ba0 20 28 46 74 73 35 49 6e 64 65 78 2a 29 73 71 6c   (Fts5Index*)sql
27bb0 69 74 65 33 46 74 73 35 4d 61 6c 6c 6f 63 5a 65  ite3Fts5MallocZe
27bc0 72 6f 28 26 72 63 2c 20 73 69 7a 65 6f 66 28 46  ro(&rc, sizeof(F
27bd0 74 73 35 49 6e 64 65 78 29 29 3b 0a 20 20 69 66  ts5Index));.  if
27be0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
27bf0 29 7b 0a 20 20 20 20 70 2d 3e 70 43 6f 6e 66 69  ){.    p->pConfi
27c00 67 20 3d 20 70 43 6f 6e 66 69 67 3b 0a 20 20 20  g = pConfig;.   
27c10 20 70 2d 3e 6e 57 6f 72 6b 55 6e 69 74 20 3d 20   p->nWorkUnit = 
27c20 46 54 53 35 5f 57 4f 52 4b 5f 55 4e 49 54 3b 0a  FTS5_WORK_UNIT;.
27c30 20 20 20 20 70 2d 3e 7a 44 61 74 61 54 62 6c 20      p->zDataTbl 
27c40 3d 20 73 71 6c 69 74 65 33 46 74 73 35 4d 70 72  = sqlite3Fts5Mpr
27c50 69 6e 74 66 28 26 72 63 2c 20 22 25 73 5f 64 61  intf(&rc, "%s_da
27c60 74 61 22 2c 20 70 43 6f 6e 66 69 67 2d 3e 7a 4e  ta", pConfig->zN
27c70 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 70 2d  ame);.    if( p-
27c80 3e 7a 44 61 74 61 54 62 6c 20 26 26 20 62 43 72  >zDataTbl && bCr
27c90 65 61 74 65 20 29 7b 0a 20 20 20 20 20 20 72 63  eate ){.      rc
27ca0 20 3d 20 73 71 6c 69 74 65 33 46 74 73 35 43 72   = sqlite3Fts5Cr
27cb0 65 61 74 65 54 61 62 6c 65 28 0a 20 20 20 20 20  eateTable(.     
27cc0 20 20 20 20 20 70 43 6f 6e 66 69 67 2c 20 22 64       pConfig, "d
27cd0 61 74 61 22 2c 20 22 69 64 20 49 4e 54 45 47 45  ata", "id INTEGE
27ce0 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 62  R PRIMARY KEY, b
27cf0 6c 6f 63 6b 20 42 4c 4f 42 22 2c 20 30 2c 20 70  lock BLOB", 0, p
27d00 7a 45 72 72 0a 20 20 20 20 20 20 29 3b 0a 20 20  zErr.      );.  
27d10 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
27d20 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
27d30 20 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74 73   rc = sqlite3Fts
27d40 35 43 72 65 61 74 65 54 61 62 6c 65 28 70 43 6f  5CreateTable(pCo
27d50 6e 66 69 67 2c 20 22 69 64 78 22 2c 20 0a 20 20  nfig, "idx", .  
27d60 20 20 20 20 20 20 20 20 20 20 22 73 65 67 69 64            "segid
27d70 2c 20 74 65 72 6d 2c 20 70 67 6e 6f 2c 20 50 52  , term, pgno, PR
27d80 49 4d 41 52 59 20 4b 45 59 28 73 65 67 69 64 2c  IMARY KEY(segid,
27d90 20 74 65 72 6d 29 22 2c 20 0a 20 20 20 20 20 20   term)", .      
27da0 20 20 20 20 20 20 31 2c 20 70 7a 45 72 72 0a 20        1, pzErr. 
27db0 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20         );.      
27dc0 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  }.      if( rc==
27dd0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
27de0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
27df0 33 46 74 73 35 49 6e 64 65 78 52 65 69 6e 69 74  3Fts5IndexReinit
27e00 28 70 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  (p);.      }.   
27e10 20 7d 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74   }.  }..  assert
27e20 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
27e30 7c 7c 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  || p->rc==SQLITE
27e40 5f 4f 4b 20 29 3b 0a 20 20 69 66 28 20 72 63 20  _OK );.  if( rc 
27e50 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 46 74  ){.    sqlite3Ft
27e60 73 35 49 6e 64 65 78 43 6c 6f 73 65 28 70 29 3b  s5IndexClose(p);
27e70 0a 20 20 20 20 2a 70 70 20 3d 20 30 3b 0a 20 20  .    *pp = 0;.  
27e80 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
27e90 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20  ../*.** Close a 
27ea0 68 61 6e 64 6c 65 20 6f 70 65 6e 65 64 20 62 79  handle opened by
27eb0 20 61 6e 20 65 61 72 6c 69 65 72 20 63 61 6c 6c   an earlier call
27ec0 20 74 6f 20 73 71 6c 69 74 65 33 46 74 73 35 49   to sqlite3Fts5I
27ed0 6e 64 65 78 4f 70 65 6e 28 29 2e 0a 2a 2f 0a 69  ndexOpen()..*/.i
27ee0 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e  nt sqlite3Fts5In
27ef0 64 65 78 43 6c 6f 73 65 28 46 74 73 35 49 6e 64  dexClose(Fts5Ind
27f00 65 78 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63  ex *p){.  int rc
27f10 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
27f20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 61 73 73  if( p ){.    ass
27f30 65 72 74 28 20 70 2d 3e 70 52 65 61 64 65 72 3d  ert( p->pReader=
27f40 3d 30 20 29 3b 0a 20 20 20 20 66 74 73 35 53 74  =0 );.    fts5St
27f50 72 75 63 74 75 72 65 49 6e 76 61 6c 69 64 61 74  ructureInvalidat
27f60 65 28 70 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  e(p);.    sqlite
27f70 33 5f 66 69 6e 61 6c 69 7a 65 28 70 2d 3e 70 57  3_finalize(p->pW
27f80 72 69 74 65 72 29 3b 0a 20 20 20 20 73 71 6c 69  riter);.    sqli
27f90 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 2d 3e  te3_finalize(p->
27fa0 70 44 65 6c 65 74 65 72 29 3b 0a 20 20 20 20 73  pDeleter);.    s
27fb0 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28  qlite3_finalize(
27fc0 70 2d 3e 70 49 64 78 57 72 69 74 65 72 29 3b 0a  p->pIdxWriter);.
27fd0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61      sqlite3_fina
27fe0 6c 69 7a 65 28 70 2d 3e 70 49 64 78 44 65 6c 65  lize(p->pIdxDele
27ff0 74 65 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ter);.    sqlite
28000 33 5f 66 69 6e 61 6c 69 7a 65 28 70 2d 3e 70 49  3_finalize(p->pI
28010 64 78 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 73  dxSelect);.    s
28020 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28  qlite3_finalize(
28030 70 2d 3e 70 44 61 74 61 56 65 72 73 69 6f 6e 29  p->pDataVersion)
28040 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 46 74 73  ;.    sqlite3Fts
28050 35 48 61 73 68 46 72 65 65 28 70 2d 3e 70 48 61  5HashFree(p->pHa
28060 73 68 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  sh);.    sqlite3
28070 5f 66 72 65 65 28 70 2d 3e 7a 44 61 74 61 54 62  _free(p->zDataTb
28080 6c 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  l);.    sqlite3_
28090 66 72 65 65 28 70 29 3b 0a 20 20 7d 0a 20 20 72  free(p);.  }.  r
280a0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
280b0 2a 2a 20 41 72 67 75 6d 65 6e 74 20 70 20 70 6f  ** Argument p po
280c0 69 6e 74 73 20 74 6f 20 61 20 62 75 66 66 65 72  ints to a buffer
280d0 20 63 6f 6e 74 61 69 6e 69 6e 67 20 75 74 66 2d   containing utf-
280e0 38 20 74 65 78 74 20 74 68 61 74 20 69 73 20 6e  8 text that is n
280f0 20 62 79 74 65 73 20 69 6e 20 0a 2a 2a 20 73 69   bytes in .** si
28100 7a 65 2e 20 52 65 74 75 72 6e 20 74 68 65 20 6e  ze. Return the n
28110 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 69  umber of bytes i
28120 6e 20 74 68 65 20 6e 43 68 61 72 20 63 68 61 72  n the nChar char
28130 61 63 74 65 72 20 70 72 65 66 69 78 20 6f 66 20  acter prefix of 
28140 74 68 65 0a 2a 2a 20 62 75 66 66 65 72 2c 20 6f  the.** buffer, o
28150 72 20 30 20 69 66 20 74 68 65 72 65 20 61 72 65  r 0 if there are
28160 20 6c 65 73 73 20 74 68 61 6e 20 6e 43 68 61 72   less than nChar
28170 20 63 68 61 72 61 63 74 65 72 73 20 69 6e 20 74   characters in t
28180 6f 74 61 6c 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  otal..*/.int sql
28190 69 74 65 33 46 74 73 35 49 6e 64 65 78 43 68 61  ite3Fts5IndexCha
281a0 72 6c 65 6e 54 6f 42 79 74 65 6c 65 6e 28 0a 20  rlenToBytelen(. 
281b0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 70 2c 20   const char *p, 
281c0 0a 20 20 69 6e 74 20 6e 42 79 74 65 2c 20 0a 20  .  int nByte, . 
281d0 20 69 6e 74 20 6e 43 68 61 72 0a 29 7b 0a 20 20   int nChar.){.  
281e0 69 6e 74 20 6e 20 3d 20 30 3b 0a 20 20 69 6e 74  int n = 0;.  int
281f0 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   i;.  for(i=0; i
28200 3c 6e 43 68 61 72 3b 20 69 2b 2b 29 7b 0a 20 20  <nChar; i++){.  
28210 20 20 69 66 28 20 6e 3e 3d 6e 42 79 74 65 20 29    if( n>=nByte )
28220 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20   return 0;      
28230 2f 2a 20 49 6e 70 75 74 20 63 6f 6e 74 61 69 6e  /* Input contain
28240 73 20 66 65 77 65 72 20 74 68 61 6e 20 6e 43 68  s fewer than nCh
28250 61 72 20 63 68 61 72 73 20 2a 2f 0a 20 20 20 20  ar chars */.    
28260 69 66 28 20 28 75 6e 73 69 67 6e 65 64 20 63 68  if( (unsigned ch
28270 61 72 29 70 5b 6e 2b 2b 5d 3e 3d 30 78 63 30 20  ar)p[n++]>=0xc0 
28280 29 7b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20  ){.      while( 
28290 28 70 5b 6e 5d 20 26 20 30 78 63 30 29 3d 3d 30  (p[n] & 0xc0)==0
282a0 78 38 30 20 29 7b 0a 20 20 20 20 20 20 20 20 6e  x80 ){.        n
282b0 2b 2b 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ++;.        if( 
282c0 6e 3e 3d 6e 42 79 74 65 20 29 20 62 72 65 61 6b  n>=nByte ) break
282d0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
282e0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a    }.  return n;.
282f0 7d 0a 0a 2f 2a 0a 2a 2a 20 70 49 6e 20 69 73 20  }../*.** pIn is 
28300 61 20 55 54 46 2d 38 20 65 6e 63 6f 64 65 64 20  a UTF-8 encoded 
28310 73 74 72 69 6e 67 2c 20 6e 49 6e 20 62 79 74 65  string, nIn byte
28320 73 20 69 6e 20 73 69 7a 65 2e 20 52 65 74 75 72  s in size. Retur
28330 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a  n the number of.
28340 2a 2a 20 75 6e 69 63 6f 64 65 20 63 68 61 72 61  ** unicode chara
28350 63 74 65 72 73 20 69 6e 20 74 68 65 20 73 74 72  cters in the str
28360 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ing..*/.static i
28370 6e 74 20 66 74 73 35 49 6e 64 65 78 43 68 61 72  nt fts5IndexChar
28380 6c 65 6e 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  len(const char *
28390 70 49 6e 2c 20 69 6e 74 20 6e 49 6e 29 7b 0a 20  pIn, int nIn){. 
283a0 20 69 6e 74 20 6e 43 68 61 72 20 3d 20 30 3b 20   int nChar = 0; 
283b0 20 20 20 20 20 20 20 20 20 20 20 0a 20 20 69 6e             .  in
283c0 74 20 69 20 3d 20 30 3b 0a 20 20 77 68 69 6c 65  t i = 0;.  while
283d0 28 20 69 3c 6e 49 6e 20 29 7b 0a 20 20 20 20 69  ( i<nIn ){.    i
283e0 66 28 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61  f( (unsigned cha
283f0 72 29 70 49 6e 5b 69 2b 2b 5d 3e 3d 30 78 63 30  r)pIn[i++]>=0xc0
28400 20 29 7b 0a 20 20 20 20 20 20 77 68 69 6c 65 28   ){.      while(
28410 20 69 3c 6e 49 6e 20 26 26 20 28 70 49 6e 5b 69   i<nIn && (pIn[i
28420 5d 20 26 20 30 78 63 30 29 3d 3d 30 78 38 30 20  ] & 0xc0)==0x80 
28430 29 20 69 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20  ) i++;.    }.   
28440 20 6e 43 68 61 72 2b 2b 3b 0a 20 20 7d 0a 20 20   nChar++;.  }.  
28450 72 65 74 75 72 6e 20 6e 43 68 61 72 3b 0a 7d 0a  return nChar;.}.
28460 0a 2f 2a 0a 2a 2a 20 49 6e 73 65 72 74 20 6f 72  ./*.** Insert or
28470 20 72 65 6d 6f 76 65 20 64 61 74 61 20 74 6f 20   remove data to 
28480 6f 72 20 66 72 6f 6d 20 74 68 65 20 69 6e 64 65  or from the inde
28490 78 2e 20 45 61 63 68 20 74 69 6d 65 20 61 20 64  x. Each time a d
284a0 6f 63 75 6d 65 6e 74 20 69 73 20 0a 2a 2a 20 61  ocument is .** a
284b0 64 64 65 64 20 74 6f 20 6f 72 20 72 65 6d 6f 76  dded to or remov
284c0 65 64 20 66 72 6f 6d 20 74 68 65 20 69 6e 64 65  ed from the inde
284d0 78 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  x, this function
284e0 20 69 73 20 63 61 6c 6c 65 64 20 6f 6e 65 20 6f   is called one o
284f0 72 20 6d 6f 72 65 0a 2a 2a 20 74 69 6d 65 73 2e  r more.** times.
28500 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 61 6e 20 69 6e  .**.** For an in
28510 73 65 72 74 2c 20 69 74 20 6d 75 73 74 20 62 65  sert, it must be
28520 20 63 61 6c 6c 65 64 20 6f 6e 63 65 20 66 6f 72   called once for
28530 20 65 61 63 68 20 74 6f 6b 65 6e 20 69 6e 20 74   each token in t
28540 68 65 20 6e 65 77 20 64 6f 63 75 6d 65 6e 74 2e  he new document.
28550 0a 2a 2a 20 49 66 20 74 68 65 20 6f 70 65 72 61  .** If the opera
28560 74 69 6f 6e 20 69 73 20 61 20 64 65 6c 65 74 65  tion is a delete
28570 2c 20 69 74 20 6d 75 73 74 20 62 65 20 63 61 6c  , it must be cal
28580 6c 65 64 20 28 61 74 20 6c 65 61 73 74 29 20 6f  led (at least) o
28590 6e 63 65 20 66 6f 72 20 65 61 63 68 0a 2a 2a 20  nce for each.** 
285a0 75 6e 69 71 75 65 20 74 6f 6b 65 6e 20 69 6e 20  unique token in 
285b0 74 68 65 20 64 6f 63 75 6d 65 6e 74 20 77 69 74  the document wit
285c0 68 20 61 6e 20 69 43 6f 6c 20 76 61 6c 75 65 20  h an iCol value 
285d0 6c 65 73 73 20 74 68 61 6e 20 7a 65 72 6f 2e 20  less than zero. 
285e0 54 68 65 20 69 50 6f 73 0a 2a 2a 20 61 72 67 75  The iPos.** argu
285f0 6d 65 6e 74 20 69 73 20 69 67 6e 6f 72 65 64 20  ment is ignored 
28600 66 6f 72 20 61 20 64 65 6c 65 74 65 2e 0a 2a 2f  for a delete..*/
28610 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35  .int sqlite3Fts5
28620 49 6e 64 65 78 57 72 69 74 65 28 0a 20 20 46 74  IndexWrite(.  Ft
28630 73 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20  s5Index *p,     
28640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
28650 20 49 6e 64 65 78 20 74 6f 20 77 72 69 74 65 20   Index to write 
28660 74 6f 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c  to */.  int iCol
28670 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
28680 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d          /* Colum
28690 6e 20 74 6f 6b 65 6e 20 61 70 70 65 61 72 73 20  n token appears 
286a0 69 6e 20 28 2d 76 65 20 2d 3e 20 64 65 6c 65 74  in (-ve -> delet
286b0 65 29 20 2a 2f 0a 20 20 69 6e 74 20 69 50 6f 73  e) */.  int iPos
286c0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
286d0 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 73 69 74          /* Posit
286e0 69 6f 6e 20 6f 66 20 74 6f 6b 65 6e 20 77 69 74  ion of token wit
286f0 68 69 6e 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20  hin column */.  
28700 63 6f 6e 73 74 20 63 68 61 72 20 2a 70 54 6f 6b  const char *pTok
28710 65 6e 2c 20 69 6e 74 20 6e 54 6f 6b 65 6e 20 20  en, int nToken  
28720 2f 2a 20 54 6f 6b 65 6e 20 74 6f 20 61 64 64 20  /* Token to add 
28730 6f 72 20 72 65 6d 6f 76 65 20 74 6f 20 6f 72 20  or remove to or 
28740 66 72 6f 6d 20 69 6e 64 65 78 20 2a 2f 0a 29 7b  from index */.){
28750 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20  .  int i;       
28760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28770 20 20 20 2f 2a 20 55 73 65 64 20 74 6f 20 69 74     /* Used to it
28780 65 72 61 74 65 20 74 68 72 6f 75 67 68 20 69 6e  erate through in
28790 64 65 78 65 73 20 2a 2f 0a 20 20 69 6e 74 20 72  dexes */.  int r
287a0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  c = SQLITE_OK;  
287b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
287c0 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 46  turn code */.  F
287d0 74 73 35 43 6f 6e 66 69 67 20 2a 70 43 6f 6e 66  ts5Config *pConf
287e0 69 67 20 3d 20 70 2d 3e 70 43 6f 6e 66 69 67 3b  ig = p->pConfig;
287f0 0a 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72  ..  assert( p->r
28800 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  c==SQLITE_OK );.
28810 20 20 61 73 73 65 72 74 28 20 28 69 43 6f 6c 3c    assert( (iCol<
28820 30 29 3d 3d 70 2d 3e 62 44 65 6c 65 74 65 20 29  0)==p->bDelete )
28830 3b 0a 0a 20 20 2f 2a 20 41 64 64 20 74 68 65 20  ;..  /* Add the 
28840 65 6e 74 72 79 20 74 6f 20 74 68 65 20 6d 61 69  entry to the mai
28850 6e 20 74 65 72 6d 73 20 69 6e 64 65 78 2e 20 2a  n terms index. *
28860 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  /.  rc = sqlite3
28870 46 74 73 35 48 61 73 68 57 72 69 74 65 28 0a 20  Fts5HashWrite(. 
28880 20 20 20 20 20 70 2d 3e 70 48 61 73 68 2c 20 70       p->pHash, p
28890 2d 3e 69 57 72 69 74 65 52 6f 77 69 64 2c 20 69  ->iWriteRowid, i
288a0 43 6f 6c 2c 20 69 50 6f 73 2c 20 46 54 53 35 5f  Col, iPos, FTS5_
288b0 4d 41 49 4e 5f 50 52 45 46 49 58 2c 20 70 54 6f  MAIN_PREFIX, pTo
288c0 6b 65 6e 2c 20 6e 54 6f 6b 65 6e 0a 20 20 29 3b  ken, nToken.  );
288d0 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ..  for(i=0; i<p
288e0 43 6f 6e 66 69 67 2d 3e 6e 50 72 65 66 69 78 20  Config->nPrefix 
288f0 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  && rc==SQLITE_OK
28900 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63 6f 6e 73  ; i++){.    cons
28910 74 20 69 6e 74 20 6e 43 68 61 72 20 3d 20 70 43  t int nChar = pC
28920 6f 6e 66 69 67 2d 3e 61 50 72 65 66 69 78 5b 69  onfig->aPrefix[i
28930 5d 3b 0a 20 20 20 20 69 6e 74 20 6e 42 79 74 65  ];.    int nByte
28940 20 3d 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e   = sqlite3Fts5In
28950 64 65 78 43 68 61 72 6c 65 6e 54 6f 42 79 74 65  dexCharlenToByte
28960 6c 65 6e 28 70 54 6f 6b 65 6e 2c 20 6e 54 6f 6b  len(pToken, nTok
28970 65 6e 2c 20 6e 43 68 61 72 29 3b 0a 20 20 20 20  en, nChar);.    
28980 69 66 28 20 6e 42 79 74 65 20 29 7b 0a 20 20 20  if( nByte ){.   
28990 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 46     rc = sqlite3F
289a0 74 73 35 48 61 73 68 57 72 69 74 65 28 70 2d 3e  ts5HashWrite(p->
289b0 70 48 61 73 68 2c 20 0a 20 20 20 20 20 20 20 20  pHash, .        
289c0 20 20 70 2d 3e 69 57 72 69 74 65 52 6f 77 69 64    p->iWriteRowid
289d0 2c 20 69 43 6f 6c 2c 20 69 50 6f 73 2c 20 28 63  , iCol, iPos, (c
289e0 68 61 72 29 28 46 54 53 35 5f 4d 41 49 4e 5f 50  har)(FTS5_MAIN_P
289f0 52 45 46 49 58 2b 69 2b 31 29 2c 20 70 54 6f 6b  REFIX+i+1), pTok
28a00 65 6e 2c 0a 20 20 20 20 20 20 20 20 20 20 6e 42  en,.          nB
28a10 79 74 65 0a 20 20 20 20 20 20 29 3b 0a 20 20 20  yte.      );.   
28a20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e   }.  }..  return
28a30 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70   rc;.}../*.** Op
28a40 65 6e 20 61 20 6e 65 77 20 69 74 65 72 61 74 6f  en a new iterato
28a50 72 20 74 6f 20 69 74 65 72 61 74 65 20 74 68 6f  r to iterate tho
28a60 75 67 68 20 61 6c 6c 20 72 6f 77 69 64 20 74 68  ugh all rowid th
28a70 61 74 20 6d 61 74 63 68 20 74 68 65 20 0a 2a 2a  at match the .**
28a80 20 73 70 65 63 69 66 69 65 64 20 74 6f 6b 65 6e   specified token
28a90 20 6f 72 20 74 6f 6b 65 6e 20 70 72 65 66 69 78   or token prefix
28aa0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
28ab0 46 74 73 35 49 6e 64 65 78 51 75 65 72 79 28 0a  Fts5IndexQuery(.
28ac0 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20    Fts5Index *p, 
28ad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28ae0 20 20 2f 2a 20 46 54 53 20 69 6e 64 65 78 20 74    /* FTS index t
28af0 6f 20 71 75 65 72 79 20 2a 2f 0a 20 20 63 6f 6e  o query */.  con
28b00 73 74 20 63 68 61 72 20 2a 70 54 6f 6b 65 6e 2c  st char *pToken,
28b10 20 69 6e 74 20 6e 54 6f 6b 65 6e 2c 20 2f 2a 20   int nToken, /* 
28b20 54 6f 6b 65 6e 20 28 6f 72 20 70 72 65 66 69 78  Token (or prefix
28b30 29 20 74 6f 20 71 75 65 72 79 20 66 6f 72 20 2a  ) to query for *
28b40 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c 20 20  /.  int flags,  
28b50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28b60 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 46      /* Mask of F
28b70 54 53 35 49 4e 44 45 58 5f 51 55 45 52 59 5f 58  TS5INDEX_QUERY_X
28b80 20 66 6c 61 67 73 20 2a 2f 0a 20 20 46 74 73 35   flags */.  Fts5
28b90 43 6f 6c 73 65 74 20 2a 70 43 6f 6c 73 65 74 2c  Colset *pColset,
28ba0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
28bb0 61 74 63 68 20 74 68 65 73 65 20 63 6f 6c 75 6d  atch these colum
28bc0 6e 73 20 6f 6e 6c 79 20 2a 2f 0a 20 20 46 74 73  ns only */.  Fts
28bd0 35 49 6e 64 65 78 49 74 65 72 20 2a 2a 70 70 49  5IndexIter **ppI
28be0 74 65 72 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ter          /* 
28bf0 4f 55 54 3a 20 4e 65 77 20 69 74 65 72 61 74 6f  OUT: New iterato
28c00 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 29 7b 0a 20  r object */.){. 
28c10 20 46 74 73 35 43 6f 6e 66 69 67 20 2a 70 43 6f   Fts5Config *pCo
28c20 6e 66 69 67 20 3d 20 70 2d 3e 70 43 6f 6e 66 69  nfig = p->pConfi
28c30 67 3b 0a 20 20 46 74 73 35 49 74 65 72 20 2a 70  g;.  Fts5Iter *p
28c40 52 65 74 20 3d 20 30 3b 0a 20 20 46 74 73 35 42  Ret = 0;.  Fts5B
28c50 75 66 66 65 72 20 62 75 66 20 3d 20 7b 30 2c 20  uffer buf = {0, 
28c60 30 2c 20 30 7d 3b 0a 0a 20 20 2f 2a 20 49 66 20  0, 0};..  /* If 
28c70 74 68 65 20 51 55 45 52 59 5f 53 43 41 4e 20 66  the QUERY_SCAN f
28c80 6c 61 67 20 69 73 20 73 65 74 2c 20 61 6c 6c 20  lag is set, all 
28c90 6f 74 68 65 72 20 66 6c 61 67 73 20 6d 75 73 74  other flags must
28ca0 20 62 65 20 63 6c 65 61 72 2e 20 2a 2f 0a 20 20   be clear. */.  
28cb0 61 73 73 65 72 74 28 20 28 66 6c 61 67 73 20 26  assert( (flags &
28cc0 20 46 54 53 35 49 4e 44 45 58 5f 51 55 45 52 59   FTS5INDEX_QUERY
28cd0 5f 53 43 41 4e 29 3d 3d 30 20 7c 7c 20 66 6c 61  _SCAN)==0 || fla
28ce0 67 73 3d 3d 46 54 53 35 49 4e 44 45 58 5f 51 55  gs==FTS5INDEX_QU
28cf0 45 52 59 5f 53 43 41 4e 20 29 3b 0a 0a 20 20 69  ERY_SCAN );..  i
28d00 66 28 20 73 71 6c 69 74 65 33 46 74 73 35 42 75  f( sqlite3Fts5Bu
28d10 66 66 65 72 53 69 7a 65 28 26 70 2d 3e 72 63 2c  fferSize(&p->rc,
28d20 20 26 62 75 66 2c 20 6e 54 6f 6b 65 6e 2b 31 29   &buf, nToken+1)
28d30 3d 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  ==0 ){.    int i
28d40 49 64 78 20 3d 20 30 3b 20 20 20 20 20 20 20 20  Idx = 0;        
28d50 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
28d60 78 20 74 6f 20 73 65 61 72 63 68 20 2a 2f 0a 20  x to search */. 
28d70 20 20 20 69 66 28 20 6e 54 6f 6b 65 6e 20 29 20     if( nToken ) 
28d80 6d 65 6d 63 70 79 28 26 62 75 66 2e 70 5b 31 5d  memcpy(&buf.p[1]
28d90 2c 20 70 54 6f 6b 65 6e 2c 20 6e 54 6f 6b 65 6e  , pToken, nToken
28da0 29 3b 0a 0a 20 20 20 20 2f 2a 20 46 69 67 75 72  );..    /* Figur
28db0 65 20 6f 75 74 20 77 68 69 63 68 20 69 6e 64 65  e out which inde
28dc0 78 20 74 6f 20 73 65 61 72 63 68 20 61 6e 64 20  x to search and 
28dd0 73 65 74 20 69 49 64 78 20 61 63 63 6f 72 64 69  set iIdx accordi
28de0 6e 67 6c 79 2e 20 49 66 20 74 68 69 73 0a 20 20  ngly. If this.  
28df0 20 20 2a 2a 20 69 73 20 61 20 70 72 65 66 69 78    ** is a prefix
28e00 20 71 75 65 72 79 20 66 6f 72 20 77 68 69 63 68   query for which
28e10 20 74 68 65 72 65 20 69 73 20 6e 6f 20 70 72 65   there is no pre
28e20 66 69 78 20 69 6e 64 65 78 2c 20 73 65 74 20 69  fix index, set i
28e30 49 64 78 20 74 6f 0a 20 20 20 20 2a 2a 20 67 72  Idx to.    ** gr
28e40 65 61 74 65 72 20 74 68 61 6e 20 70 43 6f 6e 66  eater than pConf
28e50 69 67 2d 3e 6e 50 72 65 66 69 78 20 74 6f 20 69  ig->nPrefix to i
28e60 6e 64 69 63 61 74 65 20 74 68 61 74 20 74 68 65  ndicate that the
28e70 20 71 75 65 72 79 20 77 69 6c 6c 20 62 65 0a 20   query will be. 
28e80 20 20 20 2a 2a 20 73 61 74 69 73 66 69 65 64 20     ** satisfied 
28e90 62 79 20 73 63 61 6e 6e 69 6e 67 20 6d 75 6c 74  by scanning mult
28ea0 69 70 6c 65 20 74 65 72 6d 73 20 69 6e 20 74 68  iple terms in th
28eb0 65 20 6d 61 69 6e 20 69 6e 64 65 78 2e 0a 20 20  e main index..  
28ec0 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20 74    **.    ** If t
28ed0 68 65 20 51 55 45 52 59 5f 54 45 53 54 5f 4e 4f  he QUERY_TEST_NO
28ee0 49 44 58 20 66 6c 61 67 20 77 61 73 20 73 70 65  IDX flag was spe
28ef0 63 69 66 69 65 64 2c 20 74 68 65 6e 20 74 68 69  cified, then thi
28f00 73 20 6d 75 73 74 20 62 65 20 61 0a 20 20 20 20  s must be a.    
28f10 2a 2a 20 70 72 65 66 69 78 2d 71 75 65 72 79 2e  ** prefix-query.
28f20 20 49 6e 73 74 65 61 64 20 6f 66 20 75 73 69 6e   Instead of usin
28f30 67 20 61 20 70 72 65 66 69 78 2d 69 6e 64 65 78  g a prefix-index
28f40 20 28 69 66 20 6f 6e 65 20 65 78 69 73 74 73 29   (if one exists)
28f50 2c 20 0a 20 20 20 20 2a 2a 20 65 76 61 6c 75 61  , .    ** evalua
28f60 74 65 20 74 68 65 20 70 72 65 66 69 78 20 71 75  te the prefix qu
28f70 65 72 79 20 75 73 69 6e 67 20 74 68 65 20 6d 61  ery using the ma
28f80 69 6e 20 46 54 53 20 69 6e 64 65 78 2e 20 54 68  in FTS index. Th
28f90 69 73 20 69 73 20 75 73 65 64 0a 20 20 20 20 2a  is is used.    *
28fa0 2a 20 66 6f 72 20 69 6e 74 65 72 6e 61 6c 20 73  * for internal s
28fb0 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67 20 62  anity checking b
28fc0 79 20 74 68 65 20 69 6e 74 65 67 72 69 74 79 2d  y the integrity-
28fd0 63 68 65 63 6b 20 69 6e 20 64 65 62 75 67 20 0a  check in debug .
28fe0 20 20 20 20 2a 2a 20 6d 6f 64 65 20 6f 6e 6c 79      ** mode only
28ff0 2e 20 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  .  */.#ifdef SQL
29000 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20 69 66  ITE_DEBUG.    if
29010 28 20 70 43 6f 6e 66 69 67 2d 3e 62 50 72 65 66  ( pConfig->bPref
29020 69 78 49 6e 64 65 78 3d 3d 30 20 7c 7c 20 28 66  ixIndex==0 || (f
29030 6c 61 67 73 20 26 20 46 54 53 35 49 4e 44 45 58  lags & FTS5INDEX
29040 5f 51 55 45 52 59 5f 54 45 53 54 5f 4e 4f 49 44  _QUERY_TEST_NOID
29050 58 29 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  X) ){.      asse
29060 72 74 28 20 66 6c 61 67 73 20 26 20 46 54 53 35  rt( flags & FTS5
29070 49 4e 44 45 58 5f 51 55 45 52 59 5f 50 52 45 46  INDEX_QUERY_PREF
29080 49 58 20 29 3b 0a 20 20 20 20 20 20 69 49 64 78  IX );.      iIdx
29090 20 3d 20 31 2b 70 43 6f 6e 66 69 67 2d 3e 6e 50   = 1+pConfig->nP
290a0 72 65 66 69 78 3b 0a 20 20 20 20 7d 65 6c 73 65  refix;.    }else
290b0 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28 20  .#endif.    if( 
290c0 66 6c 61 67 73 20 26 20 46 54 53 35 49 4e 44 45  flags & FTS5INDE
290d0 58 5f 51 55 45 52 59 5f 50 52 45 46 49 58 20 29  X_QUERY_PREFIX )
290e0 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 43 68 61  {.      int nCha
290f0 72 20 3d 20 66 74 73 35 49 6e 64 65 78 43 68 61  r = fts5IndexCha
29100 72 6c 65 6e 28 70 54 6f 6b 65 6e 2c 20 6e 54 6f  rlen(pToken, nTo
29110 6b 65 6e 29 3b 0a 20 20 20 20 20 20 66 6f 72 28  ken);.      for(
29120 69 49 64 78 3d 31 3b 20 69 49 64 78 3c 3d 70 43  iIdx=1; iIdx<=pC
29130 6f 6e 66 69 67 2d 3e 6e 50 72 65 66 69 78 3b 20  onfig->nPrefix; 
29140 69 49 64 78 2b 2b 29 7b 0a 20 20 20 20 20 20 20  iIdx++){.       
29150 20 69 66 28 20 70 43 6f 6e 66 69 67 2d 3e 61 50   if( pConfig->aP
29160 72 65 66 69 78 5b 69 49 64 78 2d 31 5d 3d 3d 6e  refix[iIdx-1]==n
29170 43 68 61 72 20 29 20 62 72 65 61 6b 3b 0a 20 20  Char ) break;.  
29180 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
29190 20 69 66 28 20 69 49 64 78 3c 3d 70 43 6f 6e 66   if( iIdx<=pConf
291a0 69 67 2d 3e 6e 50 72 65 66 69 78 20 29 7b 0a 20  ig->nPrefix ){. 
291b0 20 20 20 20 20 2f 2a 20 53 74 72 61 69 67 68 74       /* Straight
291c0 20 69 6e 64 65 78 20 6c 6f 6f 6b 75 70 20 2a 2f   index lookup */
291d0 0a 20 20 20 20 20 20 46 74 73 35 53 74 72 75 63  .      Fts5Struc
291e0 74 75 72 65 20 2a 70 53 74 72 75 63 74 20 3d 20  ture *pStruct = 
291f0 66 74 73 35 53 74 72 75 63 74 75 72 65 52 65 61  fts5StructureRea
29200 64 28 70 29 3b 0a 20 20 20 20 20 20 62 75 66 2e  d(p);.      buf.
29210 70 5b 30 5d 20 3d 20 28 75 38 29 28 46 54 53 35  p[0] = (u8)(FTS5
29220 5f 4d 41 49 4e 5f 50 52 45 46 49 58 20 2b 20 69  _MAIN_PREFIX + i
29230 49 64 78 29 3b 0a 20 20 20 20 20 20 69 66 28 20  Idx);.      if( 
29240 70 53 74 72 75 63 74 20 29 7b 0a 20 20 20 20 20  pStruct ){.     
29250 20 20 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72     fts5MultiIter
29260 4e 65 77 28 70 2c 20 70 53 74 72 75 63 74 2c 20  New(p, pStruct, 
29270 66 6c 61 67 73 20 7c 20 46 54 53 35 49 4e 44 45  flags | FTS5INDE
29280 58 5f 51 55 45 52 59 5f 53 4b 49 50 45 4d 50 54  X_QUERY_SKIPEMPT
29290 59 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  Y, .            
292a0 70 43 6f 6c 73 65 74 2c 20 62 75 66 2e 70 2c 20  pColset, buf.p, 
292b0 6e 54 6f 6b 65 6e 2b 31 2c 20 2d 31 2c 20 30 2c  nToken+1, -1, 0,
292c0 20 26 70 52 65 74 0a 20 20 20 20 20 20 20 20 29   &pRet.        )
292d0 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35 53 74  ;.        fts5St
292e0 72 75 63 74 75 72 65 52 65 6c 65 61 73 65 28 70  ructureRelease(p
292f0 53 74 72 75 63 74 29 3b 0a 20 20 20 20 20 20 7d  Struct);.      }
29300 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
29310 20 20 2f 2a 20 53 63 61 6e 20 6d 75 6c 74 69 70    /* Scan multip
29320 6c 65 20 74 65 72 6d 73 20 69 6e 20 74 68 65 20  le terms in the 
29330 6d 61 69 6e 20 69 6e 64 65 78 20 2a 2f 0a 20 20  main index */.  
29340 20 20 20 20 69 6e 74 20 62 44 65 73 63 20 3d 20      int bDesc = 
29350 28 66 6c 61 67 73 20 26 20 46 54 53 35 49 4e 44  (flags & FTS5IND
29360 45 58 5f 51 55 45 52 59 5f 44 45 53 43 29 21 3d  EX_QUERY_DESC)!=
29370 30 3b 0a 20 20 20 20 20 20 62 75 66 2e 70 5b 30  0;.      buf.p[0
29380 5d 20 3d 20 46 54 53 35 5f 4d 41 49 4e 5f 50 52  ] = FTS5_MAIN_PR
29390 45 46 49 58 3b 0a 20 20 20 20 20 20 66 74 73 35  EFIX;.      fts5
293a0 53 65 74 75 70 50 72 65 66 69 78 49 74 65 72 28  SetupPrefixIter(
293b0 70 2c 20 62 44 65 73 63 2c 20 62 75 66 2e 70 2c  p, bDesc, buf.p,
293c0 20 6e 54 6f 6b 65 6e 2b 31 2c 20 70 43 6f 6c 73   nToken+1, pCols
293d0 65 74 2c 20 26 70 52 65 74 29 3b 0a 20 20 20 20  et, &pRet);.    
293e0 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72 63 21    assert( p->rc!
293f0 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 52  =SQLITE_OK || pR
29400 65 74 2d 3e 70 43 6f 6c 73 65 74 3d 3d 30 20 29  et->pColset==0 )
29410 3b 0a 20 20 20 20 20 20 66 74 73 35 49 74 65 72  ;.      fts5Iter
29420 53 65 74 4f 75 74 70 75 74 43 62 28 26 70 2d 3e  SetOutputCb(&p->
29430 72 63 2c 20 70 52 65 74 29 3b 0a 20 20 20 20 20  rc, pRet);.     
29440 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49   if( p->rc==SQLI
29450 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
29460 20 46 74 73 35 53 65 67 49 74 65 72 20 2a 70 53   Fts5SegIter *pS
29470 65 67 20 3d 20 26 70 52 65 74 2d 3e 61 53 65 67  eg = &pRet->aSeg
29480 5b 70 52 65 74 2d 3e 61 46 69 72 73 74 5b 31 5d  [pRet->aFirst[1]
29490 2e 69 46 69 72 73 74 5d 3b 0a 20 20 20 20 20 20  .iFirst];.      
294a0 20 20 69 66 28 20 70 53 65 67 2d 3e 70 4c 65 61    if( pSeg->pLea
294b0 66 20 29 20 70 52 65 74 2d 3e 78 53 65 74 4f 75  f ) pRet->xSetOu
294c0 74 70 75 74 73 28 70 52 65 74 2c 20 70 53 65 67  tputs(pRet, pSeg
294d0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
294e0 0a 0a 20 20 20 20 69 66 28 20 70 2d 3e 72 63 20  ..    if( p->rc 
294f0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
29500 46 74 73 35 49 74 65 72 43 6c 6f 73 65 28 28 46  Fts5IterClose((F
29510 74 73 35 49 6e 64 65 78 49 74 65 72 2a 29 70 52  ts5IndexIter*)pR
29520 65 74 29 3b 0a 20 20 20 20 20 20 70 52 65 74 20  et);.      pRet 
29530 3d 20 30 3b 0a 20 20 20 20 20 20 66 74 73 35 43  = 0;.      fts5C
29540 6c 6f 73 65 52 65 61 64 65 72 28 70 29 3b 0a 20  loseReader(p);. 
29550 20 20 20 7d 0a 0a 20 20 20 20 2a 70 70 49 74 65     }..    *ppIte
29560 72 20 3d 20 28 46 74 73 35 49 6e 64 65 78 49 74  r = (Fts5IndexIt
29570 65 72 2a 29 70 52 65 74 3b 0a 20 20 20 20 73 71  er*)pRet;.    sq
29580 6c 69 74 65 33 46 74 73 35 42 75 66 66 65 72 46  lite3Fts5BufferF
29590 72 65 65 28 26 62 75 66 29 3b 0a 20 20 7d 0a 20  ree(&buf);.  }. 
295a0 20 72 65 74 75 72 6e 20 66 74 73 35 49 6e 64 65   return fts5Inde
295b0 78 52 65 74 75 72 6e 28 70 29 3b 0a 7d 0a 0a 2f  xReturn(p);.}../
295c0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65  *.** Return true
295d0 20 69 66 20 74 68 65 20 69 74 65 72 61 74 6f 72   if the iterator
295e0 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 6f   passed as the o
295f0 6e 6c 79 20 61 72 67 75 6d 65 6e 74 20 69 73 20  nly argument is 
29600 61 74 20 45 4f 46 2e 0a 2a 2f 0a 2f 2a 0a 2a 2a  at EOF..*/./*.**
29610 20 4d 6f 76 65 20 74 6f 20 74 68 65 20 6e 65 78   Move to the nex
29620 74 20 6d 61 74 63 68 69 6e 67 20 72 6f 77 69 64  t matching rowid
29630 2e 20 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  . .*/.int sqlite
29640 33 46 74 73 35 49 74 65 72 4e 65 78 74 28 46 74  3Fts5IterNext(Ft
29650 73 35 49 6e 64 65 78 49 74 65 72 20 2a 70 49 6e  s5IndexIter *pIn
29660 64 65 78 49 74 65 72 29 7b 0a 20 20 46 74 73 35  dexIter){.  Fts5
29670 49 74 65 72 20 2a 70 49 74 65 72 20 3d 20 28 46  Iter *pIter = (F
29680 74 73 35 49 74 65 72 2a 29 70 49 6e 64 65 78 49  ts5Iter*)pIndexI
29690 74 65 72 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ter;.  assert( p
296a0 49 74 65 72 2d 3e 70 49 6e 64 65 78 2d 3e 72 63  Iter->pIndex->rc
296b0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20  ==SQLITE_OK );. 
296c0 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 4e 65   fts5MultiIterNe
296d0 78 74 28 70 49 74 65 72 2d 3e 70 49 6e 64 65 78  xt(pIter->pIndex
296e0 2c 20 70 49 74 65 72 2c 20 30 2c 20 30 29 3b 0a  , pIter, 0, 0);.
296f0 20 20 72 65 74 75 72 6e 20 66 74 73 35 49 6e 64    return fts5Ind
29700 65 78 52 65 74 75 72 6e 28 70 49 74 65 72 2d 3e  exReturn(pIter->
29710 70 49 6e 64 65 78 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  pIndex);.}../*.*
29720 2a 20 4d 6f 76 65 20 74 6f 20 74 68 65 20 6e 65  * Move to the ne
29730 78 74 20 6d 61 74 63 68 69 6e 67 20 74 65 72 6d  xt matching term
29740 2f 72 6f 77 69 64 2e 20 55 73 65 64 20 62 79 20  /rowid. Used by 
29750 74 68 65 20 66 74 73 35 76 6f 63 61 62 20 6d 6f  the fts5vocab mo
29760 64 75 6c 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  dule..*/.int sql
29770 69 74 65 33 46 74 73 35 49 74 65 72 4e 65 78 74  ite3Fts5IterNext
29780 53 63 61 6e 28 46 74 73 35 49 6e 64 65 78 49 74  Scan(Fts5IndexIt
29790 65 72 20 2a 70 49 6e 64 65 78 49 74 65 72 29 7b  er *pIndexIter){
297a0 0a 20 20 46 74 73 35 49 74 65 72 20 2a 70 49 74  .  Fts5Iter *pIt
297b0 65 72 20 3d 20 28 46 74 73 35 49 74 65 72 2a 29  er = (Fts5Iter*)
297c0 70 49 6e 64 65 78 49 74 65 72 3b 0a 20 20 46 74  pIndexIter;.  Ft
297d0 73 35 49 6e 64 65 78 20 2a 70 20 3d 20 70 49 74  s5Index *p = pIt
297e0 65 72 2d 3e 70 49 6e 64 65 78 3b 0a 0a 20 20 61  er->pIndex;..  a
297f0 73 73 65 72 74 28 20 70 49 74 65 72 2d 3e 70 49  ssert( pIter->pI
29800 6e 64 65 78 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  ndex->rc==SQLITE
29810 5f 4f 4b 20 29 3b 0a 0a 20 20 66 74 73 35 4d 75  _OK );..  fts5Mu
29820 6c 74 69 49 74 65 72 4e 65 78 74 28 70 2c 20 70  ltiIterNext(p, p
29830 49 74 65 72 2c 20 30 2c 20 30 29 3b 0a 20 20 69  Iter, 0, 0);.  i
29840 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  f( p->rc==SQLITE
29850 5f 4f 4b 20 29 7b 0a 20 20 20 20 46 74 73 35 53  _OK ){.    Fts5S
29860 65 67 49 74 65 72 20 2a 70 53 65 67 20 3d 20 26  egIter *pSeg = &
29870 70 49 74 65 72 2d 3e 61 53 65 67 5b 20 70 49 74  pIter->aSeg[ pIt
29880 65 72 2d 3e 61 46 69 72 73 74 5b 31 5d 2e 69 46  er->aFirst[1].iF
29890 69 72 73 74 20 5d 3b 0a 20 20 20 20 69 66 28 20  irst ];.    if( 
298a0 70 53 65 67 2d 3e 70 4c 65 61 66 20 26 26 20 70  pSeg->pLeaf && p
298b0 53 65 67 2d 3e 74 65 72 6d 2e 70 5b 30 5d 21 3d  Seg->term.p[0]!=
298c0 46 54 53 35 5f 4d 41 49 4e 5f 50 52 45 46 49 58  FTS5_MAIN_PREFIX
298d0 20 29 7b 0a 20 20 20 20 20 20 66 74 73 35 44 61   ){.      fts5Da
298e0 74 61 52 65 6c 65 61 73 65 28 70 53 65 67 2d 3e  taRelease(pSeg->
298f0 70 4c 65 61 66 29 3b 0a 20 20 20 20 20 20 70 53  pLeaf);.      pS
29900 65 67 2d 3e 70 4c 65 61 66 20 3d 20 30 3b 0a 20  eg->pLeaf = 0;. 
29910 20 20 20 20 20 70 49 74 65 72 2d 3e 62 61 73 65       pIter->base
29920 2e 62 45 6f 66 20 3d 20 31 3b 0a 20 20 20 20 7d  .bEof = 1;.    }
29930 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 66  .  }..  return f
29940 74 73 35 49 6e 64 65 78 52 65 74 75 72 6e 28 70  ts5IndexReturn(p
29950 49 74 65 72 2d 3e 70 49 6e 64 65 78 29 3b 0a 7d  Iter->pIndex);.}
29960 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 6f 20  ../*.** Move to 
29970 74 68 65 20 6e 65 78 74 20 6d 61 74 63 68 69 6e  the next matchin
29980 67 20 72 6f 77 69 64 20 74 68 61 74 20 6f 63 63  g rowid that occ
29990 75 72 73 20 61 74 20 6f 72 20 61 66 74 65 72 20  urs at or after 
299a0 69 4d 61 74 63 68 2e 20 54 68 65 0a 2a 2a 20 64  iMatch. The.** d
299b0 65 66 69 6e 69 74 69 6f 6e 20 6f 66 20 22 61 74  efinition of "at
299c0 20 6f 72 20 61 66 74 65 72 22 20 64 65 70 65 6e   or after" depen
299d0 64 73 20 6f 6e 20 77 68 65 74 68 65 72 20 74 68  ds on whether th
299e0 69 73 20 69 74 65 72 61 74 6f 72 20 69 74 65 72  is iterator iter
299f0 61 74 65 73 0a 2a 2a 20 69 6e 20 61 73 63 65 6e  ates.** in ascen
29a00 64 69 6e 67 20 6f 72 20 64 65 73 63 65 6e 64 69  ding or descendi
29a10 6e 67 20 72 6f 77 69 64 20 6f 72 64 65 72 2e 0a  ng rowid order..
29a20 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74  */.int sqlite3Ft
29a30 73 35 49 74 65 72 4e 65 78 74 46 72 6f 6d 28 46  s5IterNextFrom(F
29a40 74 73 35 49 6e 64 65 78 49 74 65 72 20 2a 70 49  ts5IndexIter *pI
29a50 6e 64 65 78 49 74 65 72 2c 20 69 36 34 20 69 4d  ndexIter, i64 iM
29a60 61 74 63 68 29 7b 0a 20 20 46 74 73 35 49 74 65  atch){.  Fts5Ite
29a70 72 20 2a 70 49 74 65 72 20 3d 20 28 46 74 73 35  r *pIter = (Fts5
29a80 49 74 65 72 2a 29 70 49 6e 64 65 78 49 74 65 72  Iter*)pIndexIter
29a90 3b 0a 20 20 66 74 73 35 4d 75 6c 74 69 49 74 65  ;.  fts5MultiIte
29aa0 72 4e 65 78 74 46 72 6f 6d 28 70 49 74 65 72 2d  rNextFrom(pIter-
29ab0 3e 70 49 6e 64 65 78 2c 20 70 49 74 65 72 2c 20  >pIndex, pIter, 
29ac0 69 4d 61 74 63 68 29 3b 0a 20 20 72 65 74 75 72  iMatch);.  retur
29ad0 6e 20 66 74 73 35 49 6e 64 65 78 52 65 74 75 72  n fts5IndexRetur
29ae0 6e 28 70 49 74 65 72 2d 3e 70 49 6e 64 65 78 29  n(pIter->pIndex)
29af0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
29b00 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 65  n the current te
29b10 72 6d 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61  rm..*/.const cha
29b20 72 20 2a 73 71 6c 69 74 65 33 46 74 73 35 49 74  r *sqlite3Fts5It
29b30 65 72 54 65 72 6d 28 46 74 73 35 49 6e 64 65 78  erTerm(Fts5Index
29b40 49 74 65 72 20 2a 70 49 6e 64 65 78 49 74 65 72  Iter *pIndexIter
29b50 2c 20 69 6e 74 20 2a 70 6e 29 7b 0a 20 20 69 6e  , int *pn){.  in
29b60 74 20 6e 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61  t n;.  const cha
29b70 72 20 2a 7a 20 3d 20 28 63 6f 6e 73 74 20 63 68  r *z = (const ch
29b80 61 72 2a 29 66 74 73 35 4d 75 6c 74 69 49 74 65  ar*)fts5MultiIte
29b90 72 54 65 72 6d 28 28 46 74 73 35 49 74 65 72 2a  rTerm((Fts5Iter*
29ba0 29 70 49 6e 64 65 78 49 74 65 72 2c 20 26 6e 29  )pIndexIter, &n)
29bb0 3b 0a 20 20 2a 70 6e 20 3d 20 6e 2d 31 3b 0a 20  ;.  *pn = n-1;. 
29bc0 20 72 65 74 75 72 6e 20 26 7a 5b 31 5d 3b 0a 7d   return &z[1];.}
29bd0 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 6e  ../*.** Close an
29be0 20 69 74 65 72 61 74 6f 72 20 6f 70 65 6e 65 64   iterator opened
29bf0 20 62 79 20 61 6e 20 65 61 72 6c 69 65 72 20 63   by an earlier c
29c00 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 46 74  all to sqlite3Ft
29c10 73 35 49 6e 64 65 78 51 75 65 72 79 28 29 2e 0a  s5IndexQuery()..
29c20 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 46  */.void sqlite3F
29c30 74 73 35 49 74 65 72 43 6c 6f 73 65 28 46 74 73  ts5IterClose(Fts
29c40 35 49 6e 64 65 78 49 74 65 72 20 2a 70 49 6e 64  5IndexIter *pInd
29c50 65 78 49 74 65 72 29 7b 0a 20 20 69 66 28 20 70  exIter){.  if( p
29c60 49 6e 64 65 78 49 74 65 72 20 29 7b 0a 20 20 20  IndexIter ){.   
29c70 20 46 74 73 35 49 74 65 72 20 2a 70 49 74 65 72   Fts5Iter *pIter
29c80 20 3d 20 28 46 74 73 35 49 74 65 72 2a 29 70 49   = (Fts5Iter*)pI
29c90 6e 64 65 78 49 74 65 72 3b 0a 20 20 20 20 46 74  ndexIter;.    Ft
29ca0 73 35 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 20  s5Index *pIndex 
29cb0 3d 20 70 49 74 65 72 2d 3e 70 49 6e 64 65 78 3b  = pIter->pIndex;
29cc0 0a 20 20 20 20 66 74 73 35 4d 75 6c 74 69 49 74  .    fts5MultiIt
29cd0 65 72 46 72 65 65 28 70 49 74 65 72 29 3b 0a 20  erFree(pIter);. 
29ce0 20 20 20 66 74 73 35 43 6c 6f 73 65 52 65 61 64     fts5CloseRead
29cf0 65 72 28 70 49 6e 64 65 78 29 3b 0a 20 20 7d 0a  er(pIndex);.  }.
29d00 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 61 6e  }../*.** Read an
29d10 64 20 64 65 63 6f 64 65 20 74 68 65 20 22 61 76  d decode the "av
29d20 65 72 61 67 65 73 22 20 72 65 63 6f 72 64 20 66  erages" record f
29d30 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65  rom the database
29d40 2e 20 0a 2a 2a 0a 2a 2a 20 50 61 72 61 6d 65 74  . .**.** Paramet
29d50 65 72 20 61 6e 53 69 7a 65 20 6d 75 73 74 20 70  er anSize must p
29d60 6f 69 6e 74 20 74 6f 20 61 6e 20 61 72 72 61 79  oint to an array
29d70 20 6f 66 20 73 69 7a 65 20 6e 43 6f 6c 2c 20 77   of size nCol, w
29d80 68 65 72 65 20 6e 43 6f 6c 20 69 73 0a 2a 2a 20  here nCol is.** 
29d90 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 75 73  the number of us
29da0 65 72 20 64 65 66 69 6e 65 64 20 63 6f 6c 75 6d  er defined colum
29db0 6e 73 20 69 6e 20 74 68 65 20 46 54 53 20 74 61  ns in the FTS ta
29dc0 62 6c 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ble..*/.int sqli
29dd0 74 65 33 46 74 73 35 49 6e 64 65 78 47 65 74 41  te3Fts5IndexGetA
29de0 76 65 72 61 67 65 73 28 46 74 73 35 49 6e 64 65  verages(Fts5Inde
29df0 78 20 2a 70 2c 20 69 36 34 20 2a 70 6e 52 6f 77  x *p, i64 *pnRow
29e00 2c 20 69 36 34 20 2a 61 6e 53 69 7a 65 29 7b 0a  , i64 *anSize){.
29e10 20 20 69 6e 74 20 6e 43 6f 6c 20 3d 20 70 2d 3e    int nCol = p->
29e20 70 43 6f 6e 66 69 67 2d 3e 6e 43 6f 6c 3b 0a 20  pConfig->nCol;. 
29e30 20 46 74 73 35 44 61 74 61 20 2a 70 44 61 74 61   Fts5Data *pData
29e40 3b 0a 0a 20 20 2a 70 6e 52 6f 77 20 3d 20 30 3b  ;..  *pnRow = 0;
29e50 0a 20 20 6d 65 6d 73 65 74 28 61 6e 53 69 7a 65  .  memset(anSize
29e60 2c 20 30 2c 20 73 69 7a 65 6f 66 28 69 36 34 29  , 0, sizeof(i64)
29e70 20 2a 20 6e 43 6f 6c 29 3b 0a 20 20 70 44 61 74   * nCol);.  pDat
29e80 61 20 3d 20 66 74 73 35 44 61 74 61 52 65 61 64  a = fts5DataRead
29e90 28 70 2c 20 46 54 53 35 5f 41 56 45 52 41 47 45  (p, FTS5_AVERAGE
29ea0 53 5f 52 4f 57 49 44 29 3b 0a 20 20 69 66 28 20  S_ROWID);.  if( 
29eb0 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
29ec0 20 26 26 20 70 44 61 74 61 2d 3e 6e 6e 20 29 7b   && pData->nn ){
29ed0 0a 20 20 20 20 69 6e 74 20 69 20 3d 20 30 3b 0a  .    int i = 0;.
29ee0 20 20 20 20 69 6e 74 20 69 43 6f 6c 3b 0a 20 20      int iCol;.  
29ef0 20 20 69 20 2b 3d 20 66 74 73 35 47 65 74 56 61    i += fts5GetVa
29f00 72 69 6e 74 28 26 70 44 61 74 61 2d 3e 70 5b 69  rint(&pData->p[i
29f10 5d 2c 20 28 75 36 34 2a 29 70 6e 52 6f 77 29 3b  ], (u64*)pnRow);
29f20 0a 20 20 20 20 66 6f 72 28 69 43 6f 6c 3d 30 3b  .    for(iCol=0;
29f30 20 69 3c 70 44 61 74 61 2d 3e 6e 6e 20 26 26 20   i<pData->nn && 
29f40 69 43 6f 6c 3c 6e 43 6f 6c 3b 20 69 43 6f 6c 2b  iCol<nCol; iCol+
29f50 2b 29 7b 0a 20 20 20 20 20 20 69 20 2b 3d 20 66  +){.      i += f
29f60 74 73 35 47 65 74 56 61 72 69 6e 74 28 26 70 44  ts5GetVarint(&pD
29f70 61 74 61 2d 3e 70 5b 69 5d 2c 20 28 75 36 34 2a  ata->p[i], (u64*
29f80 29 26 61 6e 53 69 7a 65 5b 69 43 6f 6c 5d 29 3b  )&anSize[iCol]);
29f90 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 66 74  .    }.  }..  ft
29fa0 73 35 44 61 74 61 52 65 6c 65 61 73 65 28 70 44  s5DataRelease(pD
29fb0 61 74 61 29 3b 0a 20 20 72 65 74 75 72 6e 20 66  ata);.  return f
29fc0 74 73 35 49 6e 64 65 78 52 65 74 75 72 6e 28 70  ts5IndexReturn(p
29fd0 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 70 6c  );.}../*.** Repl
29fe0 61 63 65 20 74 68 65 20 63 75 72 72 65 6e 74 20  ace the current 
29ff0 22 61 76 65 72 61 67 65 73 22 20 72 65 63 6f 72  "averages" recor
2a000 64 20 77 69 74 68 20 74 68 65 20 63 6f 6e 74 65  d with the conte
2a010 6e 74 73 20 6f 66 20 74 68 65 20 62 75 66 66 65  nts of the buffe
2a020 72 20 0a 2a 2a 20 73 75 70 70 6c 69 65 64 20 61  r .** supplied a
2a030 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67  s the second arg
2a040 75 6d 65 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ument..*/.int sq
2a050 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78 53 65  lite3Fts5IndexSe
2a060 74 41 76 65 72 61 67 65 73 28 46 74 73 35 49 6e  tAverages(Fts5In
2a070 64 65 78 20 2a 70 2c 20 63 6f 6e 73 74 20 75 38  dex *p, const u8
2a080 20 2a 70 44 61 74 61 2c 20 69 6e 74 20 6e 44 61   *pData, int nDa
2a090 74 61 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70  ta){.  assert( p
2a0a0 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
2a0b0 29 3b 0a 20 20 66 74 73 35 44 61 74 61 57 72 69  );.  fts5DataWri
2a0c0 74 65 28 70 2c 20 46 54 53 35 5f 41 56 45 52 41  te(p, FTS5_AVERA
2a0d0 47 45 53 5f 52 4f 57 49 44 2c 20 70 44 61 74 61  GES_ROWID, pData
2a0e0 2c 20 6e 44 61 74 61 29 3b 0a 20 20 72 65 74 75  , nData);.  retu
2a0f0 72 6e 20 66 74 73 35 49 6e 64 65 78 52 65 74 75  rn fts5IndexRetu
2a100 72 6e 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn(p);.}../*.** 
2a110 52 65 74 75 72 6e 20 74 68 65 20 74 6f 74 61 6c  Return the total
2a120 20 6e 75 6d 62 65 72 20 6f 66 20 62 6c 6f 63 6b   number of block
2a130 73 20 74 68 69 73 20 6d 6f 64 75 6c 65 20 68 61  s this module ha
2a140 73 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20  s read from the 
2a150 25 5f 64 61 74 61 0a 2a 2a 20 74 61 62 6c 65 20  %_data.** table 
2a160 73 69 6e 63 65 20 69 74 20 77 61 73 20 63 72 65  since it was cre
2a170 61 74 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ated..*/.int sql
2a180 69 74 65 33 46 74 73 35 49 6e 64 65 78 52 65 61  ite3Fts5IndexRea
2a190 64 73 28 46 74 73 35 49 6e 64 65 78 20 2a 70 29  ds(Fts5Index *p)
2a1a0 7b 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e 6e 52  {.  return p->nR
2a1b0 65 61 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65  ead;.}../*.** Se
2a1c0 74 20 74 68 65 20 33 32 2d 62 69 74 20 63 6f 6f  t the 32-bit coo
2a1d0 6b 69 65 20 76 61 6c 75 65 20 73 74 6f 72 65 64  kie value stored
2a1e0 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66   at the start of
2a1f0 20 61 6c 6c 20 73 74 72 75 63 74 75 72 65 20 0a   all structure .
2a200 2a 2a 20 72 65 63 6f 72 64 73 20 74 6f 20 74 68  ** records to th
2a210 65 20 76 61 6c 75 65 20 70 61 73 73 65 64 20 61  e value passed a
2a220 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67  s the second arg
2a230 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 52 65 74  ument..**.** Ret
2a240 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66  urn SQLITE_OK if
2a250 20 73 75 63 63 65 73 73 66 75 6c 2c 20 6f 72 20   successful, or 
2a260 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20  an SQLite error 
2a270 63 6f 64 65 20 69 66 20 61 6e 20 65 72 72 6f 72  code if an error
2a280 0a 2a 2a 20 6f 63 63 75 72 73 2e 0a 2a 2f 0a 69  .** occurs..*/.i
2a290 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e  nt sqlite3Fts5In
2a2a0 64 65 78 53 65 74 43 6f 6f 6b 69 65 28 46 74 73  dexSetCookie(Fts
2a2b0 35 49 6e 64 65 78 20 2a 70 2c 20 69 6e 74 20 69  5Index *p, int i
2a2c0 4e 65 77 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20  New){.  int rc; 
2a2d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a2e0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2a2f0 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20  Return code */. 
2a300 20 46 74 73 35 43 6f 6e 66 69 67 20 2a 70 43 6f   Fts5Config *pCo
2a310 6e 66 69 67 20 3d 20 70 2d 3e 70 43 6f 6e 66 69  nfig = p->pConfi
2a320 67 3b 20 20 20 20 2f 2a 20 43 6f 6e 66 69 67 75  g;    /* Configu
2a330 72 61 74 69 6f 6e 20 6f 62 6a 65 63 74 20 2a 2f  ration object */
2a340 0a 20 20 75 38 20 61 43 6f 6f 6b 69 65 5b 34 5d  .  u8 aCookie[4]
2a350 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2a360 20 20 20 20 20 20 20 20 2f 2a 20 42 69 6e 61 72          /* Binar
2a370 79 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e  y representation
2a380 20 6f 66 20 69 4e 65 77 20 2a 2f 0a 20 20 73 71   of iNew */.  sq
2a390 6c 69 74 65 33 5f 62 6c 6f 62 20 2a 70 42 6c 6f  lite3_blob *pBlo
2a3a0 62 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74  b = 0;..  assert
2a3b0 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
2a3c0 4f 4b 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 46  OK );.  sqlite3F
2a3d0 74 73 35 50 75 74 33 32 28 61 43 6f 6f 6b 69 65  ts5Put32(aCookie
2a3e0 2c 20 69 4e 65 77 29 3b 0a 0a 20 20 72 63 20 3d  , iNew);..  rc =
2a3f0 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 6f 70   sqlite3_blob_op
2a400 65 6e 28 70 43 6f 6e 66 69 67 2d 3e 64 62 2c 20  en(pConfig->db, 
2a410 70 43 6f 6e 66 69 67 2d 3e 7a 44 62 2c 20 70 2d  pConfig->zDb, p-
2a420 3e 7a 44 61 74 61 54 62 6c 2c 20 0a 20 20 20 20  >zDataTbl, .    
2a430 20 20 22 62 6c 6f 63 6b 22 2c 20 46 54 53 35 5f    "block", FTS5_
2a440 53 54 52 55 43 54 55 52 45 5f 52 4f 57 49 44 2c  STRUCTURE_ROWID,
2a450 20 31 2c 20 26 70 42 6c 6f 62 0a 20 20 29 3b 0a   1, &pBlob.  );.
2a460 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
2a470 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  _OK ){.    sqlit
2a480 65 33 5f 62 6c 6f 62 5f 77 72 69 74 65 28 70 42  e3_blob_write(pB
2a490 6c 6f 62 2c 20 61 43 6f 6f 6b 69 65 2c 20 34 2c  lob, aCookie, 4,
2a4a0 20 30 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71   0);.    rc = sq
2a4b0 6c 69 74 65 33 5f 62 6c 6f 62 5f 63 6c 6f 73 65  lite3_blob_close
2a4c0 28 70 42 6c 6f 62 29 3b 0a 20 20 7d 0a 0a 20 20  (pBlob);.  }..  
2a4d0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 69 6e  return rc;.}..in
2a4e0 74 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64  t sqlite3Fts5Ind
2a4f0 65 78 4c 6f 61 64 43 6f 6e 66 69 67 28 46 74 73  exLoadConfig(Fts
2a500 35 49 6e 64 65 78 20 2a 70 29 7b 0a 20 20 46 74  5Index *p){.  Ft
2a510 73 35 53 74 72 75 63 74 75 72 65 20 2a 70 53 74  s5Structure *pSt
2a520 72 75 63 74 3b 0a 20 20 70 53 74 72 75 63 74 20  ruct;.  pStruct 
2a530 3d 20 66 74 73 35 53 74 72 75 63 74 75 72 65 52  = fts5StructureR
2a540 65 61 64 28 70 29 3b 0a 20 20 66 74 73 35 53 74  ead(p);.  fts5St
2a550 72 75 63 74 75 72 65 52 65 6c 65 61 73 65 28 70  ructureRelease(p
2a560 53 74 72 75 63 74 29 3b 0a 20 20 72 65 74 75 72  Struct);.  retur
2a570 6e 20 66 74 73 35 49 6e 64 65 78 52 65 74 75 72  n fts5IndexRetur
2a580 6e 28 70 29 3b 0a 7d 0a 0a 0a 2f 2a 2a 2a 2a 2a  n(p);.}.../*****
2a590 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2a5a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2a5b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2a5c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2a5d0 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****.***********
2a5e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2a5f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2a600 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2a610 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
2a620 2a 2a 20 42 65 6c 6f 77 20 74 68 69 73 20 70 6f  ** Below this po
2a630 69 6e 74 20 69 73 20 74 68 65 20 69 6d 70 6c 65  int is the imple
2a640 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65  mentation of the
2a650 20 69 6e 74 65 67 72 69 74 79 2d 63 68 65 63 6b   integrity-check
2a660 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 61 6c 69   .** functionali
2a670 74 79 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65  ty..*/../*.** Re
2a680 74 75 72 6e 20 61 20 73 69 6d 70 6c 65 20 63 68  turn a simple ch
2a690 65 63 6b 73 75 6d 20 76 61 6c 75 65 20 62 61 73  ecksum value bas
2a6a0 65 64 20 6f 6e 20 74 68 65 20 61 72 67 75 6d 65  ed on the argume
2a6b0 6e 74 73 2e 0a 2a 2f 0a 75 36 34 20 73 71 6c 69  nts..*/.u64 sqli
2a6c0 74 65 33 46 74 73 35 49 6e 64 65 78 45 6e 74 72  te3Fts5IndexEntr
2a6d0 79 43 6b 73 75 6d 28 0a 20 20 69 36 34 20 69 52  yCksum(.  i64 iR
2a6e0 6f 77 69 64 2c 20 0a 20 20 69 6e 74 20 69 43 6f  owid, .  int iCo
2a6f0 6c 2c 20 0a 20 20 69 6e 74 20 69 50 6f 73 2c 20  l, .  int iPos, 
2a700 0a 20 20 69 6e 74 20 69 49 64 78 2c 0a 20 20 63  .  int iIdx,.  c
2a710 6f 6e 73 74 20 63 68 61 72 20 2a 70 54 65 72 6d  onst char *pTerm
2a720 2c 0a 20 20 69 6e 74 20 6e 54 65 72 6d 0a 29 7b  ,.  int nTerm.){
2a730 0a 20 20 69 6e 74 20 69 3b 0a 20 20 75 36 34 20  .  int i;.  u64 
2a740 72 65 74 20 3d 20 69 52 6f 77 69 64 3b 0a 20 20  ret = iRowid;.  
2a750 72 65 74 20 2b 3d 20 28 72 65 74 3c 3c 33 29 20  ret += (ret<<3) 
2a760 2b 20 69 43 6f 6c 3b 0a 20 20 72 65 74 20 2b 3d  + iCol;.  ret +=
2a770 20 28 72 65 74 3c 3c 33 29 20 2b 20 69 50 6f 73   (ret<<3) + iPos
2a780 3b 0a 20 20 69 66 28 20 69 49 64 78 3e 3d 30 20  ;.  if( iIdx>=0 
2a790 29 20 72 65 74 20 2b 3d 20 28 72 65 74 3c 3c 33  ) ret += (ret<<3
2a7a0 29 20 2b 20 28 46 54 53 35 5f 4d 41 49 4e 5f 50  ) + (FTS5_MAIN_P
2a7b0 52 45 46 49 58 20 2b 20 69 49 64 78 29 3b 0a 20  REFIX + iIdx);. 
2a7c0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 54 65 72   for(i=0; i<nTer
2a7d0 6d 3b 20 69 2b 2b 29 20 72 65 74 20 2b 3d 20 28  m; i++) ret += (
2a7e0 72 65 74 3c 3c 33 29 20 2b 20 70 54 65 72 6d 5b  ret<<3) + pTerm[
2a7f0 69 5d 3b 0a 20 20 72 65 74 75 72 6e 20 72 65 74  i];.  return ret
2a800 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  ;.}..#ifdef SQLI
2a810 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 54  TE_DEBUG./*.** T
2a820 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
2a830 70 75 72 65 6c 79 20 61 6e 20 69 6e 74 65 72 6e  purely an intern
2a840 61 6c 20 74 65 73 74 2e 20 49 74 20 64 6f 65 73  al test. It does
2a850 20 6e 6f 74 20 63 6f 6e 74 72 69 62 75 74 65 20   not contribute 
2a860 74 6f 20 0a 2a 2a 20 46 54 53 20 66 75 6e 63 74  to .** FTS funct
2a870 69 6f 6e 61 6c 69 74 79 2c 20 6f 72 20 65 76 65  ionality, or eve
2a880 6e 20 74 68 65 20 69 6e 74 65 67 72 69 74 79 2d  n the integrity-
2a890 63 68 65 63 6b 2c 20 69 6e 20 61 6e 79 20 77 61  check, in any wa
2a8a0 79 2e 0a 2a 2a 0a 2a 2a 20 49 6e 73 74 65 61 64  y..**.** Instead
2a8b0 2c 20 69 74 20 74 65 73 74 73 20 74 68 61 74 20  , it tests that 
2a8c0 74 68 65 20 73 61 6d 65 20 73 65 74 20 6f 66 20  the same set of 
2a8d0 70 67 6e 6f 2f 72 6f 77 69 64 20 63 6f 6d 62 69  pgno/rowid combi
2a8e0 6e 61 74 69 6f 6e 73 20 61 72 65 20 0a 2a 2a 20  nations are .** 
2a8f0 76 69 73 69 74 65 64 20 72 65 67 61 72 64 6c 65  visited regardle
2a900 73 73 20 6f 66 20 77 68 65 74 68 65 72 20 74 68  ss of whether th
2a910 65 20 64 6f 63 6c 69 73 74 2d 69 6e 64 65 78 20  e doclist-index 
2a920 69 64 65 6e 74 69 66 69 65 64 20 62 79 20 70 61  identified by pa
2a930 72 61 6d 65 74 65 72 73 0a 2a 2a 20 69 53 65 67  rameters.** iSeg
2a940 69 64 2f 69 4c 65 61 66 20 69 73 20 69 74 65 72  id/iLeaf is iter
2a950 61 74 65 64 20 69 6e 20 66 6f 72 77 61 72 64 73  ated in forwards
2a960 20 6f 72 20 72 65 76 65 72 73 65 20 6f 72 64 65   or reverse orde
2a970 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  r..*/.static voi
2a980 64 20 66 74 73 35 54 65 73 74 44 6c 69 64 78 52  d fts5TestDlidxR
2a990 65 76 65 72 73 65 28 0a 20 20 46 74 73 35 49 6e  everse(.  Fts5In
2a9a0 64 65 78 20 2a 70 2c 20 0a 20 20 69 6e 74 20 69  dex *p, .  int i
2a9b0 53 65 67 69 64 2c 20 20 20 20 20 20 20 20 20 20  Segid,          
2a9c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65             /* Se
2a9d0 67 6d 65 6e 74 20 69 64 20 74 6f 20 6c 6f 61 64  gment id to load
2a9e0 20 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20 69   from */.  int i
2a9f0 4c 65 61 66 20 20 20 20 20 20 20 20 20 20 20 20  Leaf            
2aa00 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
2aa10 61 64 20 64 6f 63 6c 69 73 74 2d 69 6e 64 65 78  ad doclist-index
2aa20 20 66 6f 72 20 74 68 69 73 20 6c 65 61 66 20 2a   for this leaf *
2aa30 2f 0a 29 7b 0a 20 20 46 74 73 35 44 6c 69 64 78  /.){.  Fts5Dlidx
2aa40 49 74 65 72 20 2a 70 44 6c 69 64 78 20 3d 20 30  Iter *pDlidx = 0
2aa50 3b 0a 20 20 75 36 34 20 63 6b 73 75 6d 31 20 3d  ;.  u64 cksum1 =
2aa60 20 31 33 3b 0a 20 20 75 36 34 20 63 6b 73 75 6d   13;.  u64 cksum
2aa70 32 20 3d 20 31 33 3b 0a 0a 20 20 66 6f 72 28 70  2 = 13;..  for(p
2aa80 44 6c 69 64 78 3d 66 74 73 35 44 6c 69 64 78 49  Dlidx=fts5DlidxI
2aa90 74 65 72 49 6e 69 74 28 70 2c 20 30 2c 20 69 53  terInit(p, 0, iS
2aaa0 65 67 69 64 2c 20 69 4c 65 61 66 29 3b 0a 20 20  egid, iLeaf);.  
2aab0 20 20 20 20 66 74 73 35 44 6c 69 64 78 49 74 65      fts5DlidxIte
2aac0 72 45 6f 66 28 70 2c 20 70 44 6c 69 64 78 29 3d  rEof(p, pDlidx)=
2aad0 3d 30 3b 0a 20 20 20 20 20 20 66 74 73 35 44 6c  =0;.      fts5Dl
2aae0 69 64 78 49 74 65 72 4e 65 78 74 28 70 2c 20 70  idxIterNext(p, p
2aaf0 44 6c 69 64 78 29 0a 20 20 29 7b 0a 20 20 20 20  Dlidx).  ){.    
2ab00 69 36 34 20 69 52 6f 77 69 64 20 3d 20 66 74 73  i64 iRowid = fts
2ab10 35 44 6c 69 64 78 49 74 65 72 52 6f 77 69 64 28  5DlidxIterRowid(
2ab20 70 44 6c 69 64 78 29 3b 0a 20 20 20 20 69 6e 74  pDlidx);.    int
2ab30 20 70 67 6e 6f 20 3d 20 66 74 73 35 44 6c 69 64   pgno = fts5Dlid
2ab40 78 49 74 65 72 50 67 6e 6f 28 70 44 6c 69 64 78  xIterPgno(pDlidx
2ab50 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
2ab60 67 6e 6f 3e 69 4c 65 61 66 20 29 3b 0a 20 20 20  gno>iLeaf );.   
2ab70 20 63 6b 73 75 6d 31 20 2b 3d 20 69 52 6f 77 69   cksum1 += iRowi
2ab80 64 20 2b 20 28 28 69 36 34 29 70 67 6e 6f 3c 3c  d + ((i64)pgno<<
2ab90 33 32 29 3b 0a 20 20 7d 0a 20 20 66 74 73 35 44  32);.  }.  fts5D
2aba0 6c 69 64 78 49 74 65 72 46 72 65 65 28 70 44 6c  lidxIterFree(pDl
2abb0 69 64 78 29 3b 0a 20 20 70 44 6c 69 64 78 20 3d  idx);.  pDlidx =
2abc0 20 30 3b 0a 0a 20 20 66 6f 72 28 70 44 6c 69 64   0;..  for(pDlid
2abd0 78 3d 66 74 73 35 44 6c 69 64 78 49 74 65 72 49  x=fts5DlidxIterI
2abe0 6e 69 74 28 70 2c 20 31 2c 20 69 53 65 67 69 64  nit(p, 1, iSegid
2abf0 2c 20 69 4c 65 61 66 29 3b 0a 20 20 20 20 20 20  , iLeaf);.      
2ac00 66 74 73 35 44 6c 69 64 78 49 74 65 72 45 6f 66  fts5DlidxIterEof
2ac10 28 70 2c 20 70 44 6c 69 64 78 29 3d 3d 30 3b 0a  (p, pDlidx)==0;.
2ac20 20 20 20 20 20 20 66 74 73 35 44 6c 69 64 78 49        fts5DlidxI
2ac30 74 65 72 50 72 65 76 28 70 2c 20 70 44 6c 69 64  terPrev(p, pDlid
2ac40 78 29 0a 20 20 29 7b 0a 20 20 20 20 69 36 34 20  x).  ){.    i64 
2ac50 69 52 6f 77 69 64 20 3d 20 66 74 73 35 44 6c 69  iRowid = fts5Dli
2ac60 64 78 49 74 65 72 52 6f 77 69 64 28 70 44 6c 69  dxIterRowid(pDli
2ac70 64 78 29 3b 0a 20 20 20 20 69 6e 74 20 70 67 6e  dx);.    int pgn
2ac80 6f 20 3d 20 66 74 73 35 44 6c 69 64 78 49 74 65  o = fts5DlidxIte
2ac90 72 50 67 6e 6f 28 70 44 6c 69 64 78 29 3b 0a 20  rPgno(pDlidx);. 
2aca0 20 20 20 61 73 73 65 72 74 28 20 66 74 73 35 44     assert( fts5D
2acb0 6c 69 64 78 49 74 65 72 50 67 6e 6f 28 70 44 6c  lidxIterPgno(pDl
2acc0 69 64 78 29 3e 69 4c 65 61 66 20 29 3b 0a 20 20  idx)>iLeaf );.  
2acd0 20 20 63 6b 73 75 6d 32 20 2b 3d 20 69 52 6f 77    cksum2 += iRow
2ace0 69 64 20 2b 20 28 28 69 36 34 29 70 67 6e 6f 3c  id + ((i64)pgno<
2acf0 3c 33 32 29 3b 0a 20 20 7d 0a 20 20 66 74 73 35  <32);.  }.  fts5
2ad00 44 6c 69 64 78 49 74 65 72 46 72 65 65 28 70 44  DlidxIterFree(pD
2ad10 6c 69 64 78 29 3b 0a 20 20 70 44 6c 69 64 78 20  lidx);.  pDlidx 
2ad20 3d 20 30 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 72  = 0;..  if( p->r
2ad30 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
2ad40 63 6b 73 75 6d 31 21 3d 63 6b 73 75 6d 32 20 29  cksum1!=cksum2 )
2ad50 20 70 2d 3e 72 63 20 3d 20 46 54 53 35 5f 43 4f   p->rc = FTS5_CO
2ad60 52 52 55 50 54 3b 0a 7d 0a 0a 73 74 61 74 69 63  RRUPT;.}..static
2ad70 20 69 6e 74 20 66 74 73 35 51 75 65 72 79 43 6b   int fts5QueryCk
2ad80 73 75 6d 28 0a 20 20 46 74 73 35 49 6e 64 65 78  sum(.  Fts5Index
2ad90 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
2ada0 20 20 20 20 20 20 20 2f 2a 20 46 74 73 35 20 69         /* Fts5 i
2adb0 6e 64 65 78 20 6f 62 6a 65 63 74 20 2a 2f 0a 20  ndex object */. 
2adc0 20 69 6e 74 20 69 49 64 78 2c 0a 20 20 63 6f 6e   int iIdx,.  con
2add0 73 74 20 63 68 61 72 20 2a 7a 2c 20 20 20 20 20  st char *z,     
2ade0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2adf0 49 6e 64 65 78 20 6b 65 79 20 74 6f 20 71 75 65  Index key to que
2ae00 72 79 20 66 6f 72 20 2a 2f 0a 20 20 69 6e 74 20  ry for */.  int 
2ae10 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n,              
2ae20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
2ae30 69 7a 65 20 6f 66 20 69 6e 64 65 78 20 6b 65 79  ize of index key
2ae40 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 69   in bytes */.  i
2ae50 6e 74 20 66 6c 61 67 73 2c 20 20 20 20 20 20 20  nt flags,       
2ae60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2ae70 2a 20 46 6c 61 67 73 20 66 6f 72 20 46 74 73 35  * Flags for Fts5
2ae80 49 6e 64 65 78 51 75 65 72 79 20 2a 2f 0a 20 20  IndexQuery */.  
2ae90 75 36 34 20 2a 70 43 6b 73 75 6d 20 20 20 20 20  u64 *pCksum     
2aea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2aeb0 2f 2a 20 49 4e 2f 4f 55 54 3a 20 43 68 65 63 6b  /* IN/OUT: Check
2aec0 73 75 6d 20 76 61 6c 75 65 20 2a 2f 0a 29 7b 0a  sum value */.){.
2aed0 20 20 69 6e 74 20 65 44 65 74 61 69 6c 20 3d 20    int eDetail = 
2aee0 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e 65 44 65 74  p->pConfig->eDet
2aef0 61 69 6c 3b 0a 20 20 75 36 34 20 63 6b 73 75 6d  ail;.  u64 cksum
2af00 20 3d 20 2a 70 43 6b 73 75 6d 3b 0a 20 20 46 74   = *pCksum;.  Ft
2af10 73 35 49 6e 64 65 78 49 74 65 72 20 2a 70 49 74  s5IndexIter *pIt
2af20 65 72 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63  er = 0;.  int rc
2af30 20 3d 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e   = sqlite3Fts5In
2af40 64 65 78 51 75 65 72 79 28 70 2c 20 7a 2c 20 6e  dexQuery(p, z, n
2af50 2c 20 66 6c 61 67 73 2c 20 30 2c 20 26 70 49 74  , flags, 0, &pIt
2af60 65 72 29 3b 0a 0a 20 20 77 68 69 6c 65 28 20 72  er);..  while( r
2af70 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
2af80 30 3d 3d 73 71 6c 69 74 65 33 46 74 73 35 49 74  0==sqlite3Fts5It
2af90 65 72 45 6f 66 28 70 49 74 65 72 29 20 29 7b 0a  erEof(pIter) ){.
2afa0 20 20 20 20 69 36 34 20 72 6f 77 69 64 20 3d 20      i64 rowid = 
2afb0 70 49 74 65 72 2d 3e 69 52 6f 77 69 64 3b 0a 0a  pIter->iRowid;..
2afc0 20 20 20 20 69 66 28 20 65 44 65 74 61 69 6c 3d      if( eDetail=
2afd0 3d 46 54 53 35 5f 44 45 54 41 49 4c 5f 4e 4f 4e  =FTS5_DETAIL_NON
2afe0 45 20 29 7b 0a 20 20 20 20 20 20 63 6b 73 75 6d  E ){.      cksum
2aff0 20 5e 3d 20 73 71 6c 69 74 65 33 46 74 73 35 49   ^= sqlite3Fts5I
2b000 6e 64 65 78 45 6e 74 72 79 43 6b 73 75 6d 28 72  ndexEntryCksum(r
2b010 6f 77 69 64 2c 20 30 2c 20 30 2c 20 69 49 64 78  owid, 0, 0, iIdx
2b020 2c 20 7a 2c 20 6e 29 3b 0a 20 20 20 20 7d 65 6c  , z, n);.    }el
2b030 73 65 7b 0a 20 20 20 20 20 20 46 74 73 35 50 6f  se{.      Fts5Po
2b040 73 6c 69 73 74 52 65 61 64 65 72 20 73 52 65 61  slistReader sRea
2b050 64 65 72 3b 0a 20 20 20 20 20 20 66 6f 72 28 73  der;.      for(s
2b060 71 6c 69 74 65 33 46 74 73 35 50 6f 73 6c 69 73  qlite3Fts5Poslis
2b070 74 52 65 61 64 65 72 49 6e 69 74 28 70 49 74 65  tReaderInit(pIte
2b080 72 2d 3e 70 44 61 74 61 2c 20 70 49 74 65 72 2d  r->pData, pIter-
2b090 3e 6e 44 61 74 61 2c 20 26 73 52 65 61 64 65 72  >nData, &sReader
2b0a0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 52 65  );.          sRe
2b0b0 61 64 65 72 2e 62 45 6f 66 3d 3d 30 3b 0a 20 20  ader.bEof==0;.  
2b0c0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 46          sqlite3F
2b0d0 74 73 35 50 6f 73 6c 69 73 74 52 65 61 64 65 72  ts5PoslistReader
2b0e0 4e 65 78 74 28 26 73 52 65 61 64 65 72 29 0a 20  Next(&sReader). 
2b0f0 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
2b100 69 6e 74 20 69 43 6f 6c 20 3d 20 46 54 53 35 5f  int iCol = FTS5_
2b110 50 4f 53 32 43 4f 4c 55 4d 4e 28 73 52 65 61 64  POS2COLUMN(sRead
2b120 65 72 2e 69 50 6f 73 29 3b 0a 20 20 20 20 20 20  er.iPos);.      
2b130 20 20 69 6e 74 20 69 4f 66 66 20 3d 20 46 54 53    int iOff = FTS
2b140 35 5f 50 4f 53 32 4f 46 46 53 45 54 28 73 52 65  5_POS2OFFSET(sRe
2b150 61 64 65 72 2e 69 50 6f 73 29 3b 0a 20 20 20 20  ader.iPos);.    
2b160 20 20 20 20 63 6b 73 75 6d 20 5e 3d 20 73 71 6c      cksum ^= sql
2b170 69 74 65 33 46 74 73 35 49 6e 64 65 78 45 6e 74  ite3Fts5IndexEnt
2b180 72 79 43 6b 73 75 6d 28 72 6f 77 69 64 2c 20 69  ryCksum(rowid, i
2b190 43 6f 6c 2c 20 69 4f 66 66 2c 20 69 49 64 78 2c  Col, iOff, iIdx,
2b1a0 20 7a 2c 20 6e 29 3b 0a 20 20 20 20 20 20 7d 0a   z, n);.      }.
2b1b0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63      }.    if( rc
2b1c0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
2b1d0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
2b1e0 33 46 74 73 35 49 74 65 72 4e 65 78 74 28 70 49  3Fts5IterNext(pI
2b1f0 74 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ter);.    }.  }.
2b200 20 20 73 71 6c 69 74 65 33 46 74 73 35 49 74 65    sqlite3Fts5Ite
2b210 72 43 6c 6f 73 65 28 70 49 74 65 72 29 3b 0a 0a  rClose(pIter);..
2b220 20 20 2a 70 43 6b 73 75 6d 20 3d 20 63 6b 73 75    *pCksum = cksu
2b230 6d 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  m;.  return rc;.
2b240 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  }.../*.** This f
2b250 75 6e 63 74 69 6f 6e 20 69 73 20 61 6c 73 6f 20  unction is also 
2b260 70 75 72 65 6c 79 20 61 6e 20 69 6e 74 65 72 6e  purely an intern
2b270 61 6c 20 74 65 73 74 2e 20 49 74 20 64 6f 65 73  al test. It does
2b280 20 6e 6f 74 20 63 6f 6e 74 72 69 62 75 74 65 20   not contribute 
2b290 74 6f 20 0a 2a 2a 20 46 54 53 20 66 75 6e 63 74  to .** FTS funct
2b2a0 69 6f 6e 61 6c 69 74 79 2c 20 6f 72 20 65 76 65  ionality, or eve
2b2b0 6e 20 74 68 65 20 69 6e 74 65 67 72 69 74 79 2d  n the integrity-
2b2c0 63 68 65 63 6b 2c 20 69 6e 20 61 6e 79 20 77 61  check, in any wa
2b2d0 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  y..*/.static voi
2b2e0 64 20 66 74 73 35 54 65 73 74 54 65 72 6d 28 0a  d fts5TestTerm(.
2b2f0 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20    Fts5Index *p, 
2b300 0a 20 20 46 74 73 35 42 75 66 66 65 72 20 2a 70  .  Fts5Buffer *p
2b310 50 72 65 76 2c 20 20 20 20 20 20 20 20 20 20 20  Prev,           
2b320 20 20 20 2f 2a 20 50 72 65 76 69 6f 75 73 20 74     /* Previous t
2b330 65 72 6d 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  erm */.  const c
2b340 68 61 72 20 2a 7a 2c 20 69 6e 74 20 6e 2c 20 20  har *z, int n,  
2b350 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 73 73           /* Poss
2b360 69 62 6c 79 20 6e 65 77 20 74 65 72 6d 20 74 6f  ibly new term to
2b370 20 74 65 73 74 20 2a 2f 0a 20 20 75 36 34 20 65   test */.  u64 e
2b380 78 70 65 63 74 65 64 2c 0a 20 20 75 36 34 20 2a  xpected,.  u64 *
2b390 70 43 6b 73 75 6d 0a 29 7b 0a 20 20 69 6e 74 20  pCksum.){.  int 
2b3a0 72 63 20 3d 20 70 2d 3e 72 63 3b 0a 20 20 69 66  rc = p->rc;.  if
2b3b0 28 20 70 50 72 65 76 2d 3e 6e 3d 3d 30 20 29 7b  ( pPrev->n==0 ){
2b3c0 0a 20 20 20 20 66 74 73 35 42 75 66 66 65 72 53  .    fts5BufferS
2b3d0 65 74 28 26 72 63 2c 20 70 50 72 65 76 2c 20 6e  et(&rc, pPrev, n
2b3e0 2c 20 28 63 6f 6e 73 74 20 75 38 2a 29 7a 29 3b  , (const u8*)z);
2b3f0 0a 20 20 7d 65 6c 73 65 0a 20 20 69 66 28 20 72  .  }else.  if( r
2b400 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
2b410 28 70 50 72 65 76 2d 3e 6e 21 3d 6e 20 7c 7c 20  (pPrev->n!=n || 
2b420 6d 65 6d 63 6d 70 28 70 50 72 65 76 2d 3e 70 2c  memcmp(pPrev->p,
2b430 20 7a 2c 20 6e 29 29 20 29 7b 0a 20 20 20 20 75   z, n)) ){.    u
2b440 36 34 20 63 6b 73 75 6d 33 20 3d 20 2a 70 43 6b  64 cksum3 = *pCk
2b450 73 75 6d 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63  sum;.    const c
2b460 68 61 72 20 2a 7a 54 65 72 6d 20 3d 20 28 63 6f  har *zTerm = (co
2b470 6e 73 74 20 63 68 61 72 2a 29 26 70 50 72 65 76  nst char*)&pPrev
2b480 2d 3e 70 5b 31 5d 3b 20 20 2f 2a 20 74 65 72 6d  ->p[1];  /* term
2b490 20 73 61 6e 73 20 70 72 65 66 69 78 2d 62 79 74   sans prefix-byt
2b4a0 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 54 65  e */.    int nTe
2b4b0 72 6d 20 3d 20 70 50 72 65 76 2d 3e 6e 2d 31 3b  rm = pPrev->n-1;
2b4c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
2b4d0 69 7a 65 20 6f 66 20 7a 54 65 72 6d 20 69 6e 20  ize of zTerm in 
2b4e0 62 79 74 65 73 20 2a 2f 0a 20 20 20 20 69 6e 74  bytes */.    int
2b4f0 20 69 49 64 78 20 3d 20 28 70 50 72 65 76 2d 3e   iIdx = (pPrev->
2b500 70 5b 30 5d 20 2d 20 46 54 53 35 5f 4d 41 49 4e  p[0] - FTS5_MAIN
2b510 5f 50 52 45 46 49 58 29 3b 0a 20 20 20 20 69 6e  _PREFIX);.    in
2b520 74 20 66 6c 61 67 73 20 3d 20 28 69 49 64 78 3d  t flags = (iIdx=
2b530 3d 30 20 3f 20 30 20 3a 20 46 54 53 35 49 4e 44  =0 ? 0 : FTS5IND
2b540 45 58 5f 51 55 45 52 59 5f 50 52 45 46 49 58 29  EX_QUERY_PREFIX)
2b550 3b 0a 20 20 20 20 75 36 34 20 63 6b 31 20 3d 20  ;.    u64 ck1 = 
2b560 30 3b 0a 20 20 20 20 75 36 34 20 63 6b 32 20 3d  0;.    u64 ck2 =
2b570 20 30 3b 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63   0;..    /* Chec
2b580 6b 20 74 68 61 74 20 74 68 65 20 72 65 73 75 6c  k that the resul
2b590 74 73 20 72 65 74 75 72 6e 65 64 20 66 6f 72 20  ts returned for 
2b5a0 41 53 43 20 61 6e 64 20 44 45 53 43 20 71 75 65  ASC and DESC que
2b5b0 72 69 65 73 20 61 72 65 0a 20 20 20 20 2a 2a 20  ries are.    ** 
2b5c0 74 68 65 20 73 61 6d 65 2e 20 49 66 20 6e 6f 74  the same. If not
2b5d0 2c 20 63 61 6c 6c 20 74 68 69 73 20 63 6f 72 72  , call this corr
2b5e0 75 70 74 69 6f 6e 2e 20 20 2a 2f 0a 20 20 20 20  uption.  */.    
2b5f0 72 63 20 3d 20 66 74 73 35 51 75 65 72 79 43 6b  rc = fts5QueryCk
2b600 73 75 6d 28 70 2c 20 69 49 64 78 2c 20 7a 54 65  sum(p, iIdx, zTe
2b610 72 6d 2c 20 6e 54 65 72 6d 2c 20 66 6c 61 67 73  rm, nTerm, flags
2b620 2c 20 26 63 6b 31 29 3b 0a 20 20 20 20 69 66 28  , &ck1);.    if(
2b630 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
2b640 7b 0a 20 20 20 20 20 20 69 6e 74 20 66 20 3d 20  {.      int f = 
2b650 66 6c 61 67 73 7c 46 54 53 35 49 4e 44 45 58 5f  flags|FTS5INDEX_
2b660 51 55 45 52 59 5f 44 45 53 43 3b 0a 20 20 20 20  QUERY_DESC;.    
2b670 20 20 72 63 20 3d 20 66 74 73 35 51 75 65 72 79    rc = fts5Query
2b680 43 6b 73 75 6d 28 70 2c 20 69 49 64 78 2c 20 7a  Cksum(p, iIdx, z
2b690 54 65 72 6d 2c 20 6e 54 65 72 6d 2c 20 66 2c 20  Term, nTerm, f, 
2b6a0 26 63 6b 32 29 3b 0a 20 20 20 20 7d 0a 20 20 20  &ck2);.    }.   
2b6b0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
2b6c0 4f 4b 20 26 26 20 63 6b 31 21 3d 63 6b 32 20 29  OK && ck1!=ck2 )
2b6d0 20 72 63 20 3d 20 46 54 53 35 5f 43 4f 52 52 55   rc = FTS5_CORRU
2b6e0 50 54 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74  PT;..    /* If t
2b6f0 68 69 73 20 69 73 20 61 20 70 72 65 66 69 78 20  his is a prefix 
2b700 71 75 65 72 79 2c 20 63 68 65 63 6b 20 74 68 61  query, check tha
2b710 74 20 74 68 65 20 72 65 73 75 6c 74 73 20 72 65  t the results re
2b720 74 75 72 6e 65 64 20 69 66 20 74 68 65 0a 20 20  turned if the.  
2b730 20 20 2a 2a 20 74 68 65 20 69 6e 64 65 78 20 69    ** the index i
2b740 73 20 64 69 73 61 62 6c 65 64 20 61 72 65 20 74  s disabled are t
2b750 68 65 20 73 61 6d 65 2e 20 49 6e 20 62 6f 74 68  he same. In both
2b760 20 41 53 43 20 61 6e 64 20 44 45 53 43 20 6f 72   ASC and DESC or
2b770 64 65 72 2e 20 0a 20 20 20 20 2a 2a 0a 20 20 20  der. .    **.   
2b780 20 2a 2a 20 54 68 69 73 20 63 68 65 63 6b 20 6d   ** This check m
2b790 61 79 20 6f 6e 6c 79 20 62 65 20 70 65 72 66 6f  ay only be perfo
2b7a0 72 6d 65 64 20 69 66 20 74 68 65 20 68 61 73 68  rmed if the hash
2b7b0 20 74 61 62 6c 65 20 69 73 20 65 6d 70 74 79 2e   table is empty.
2b7c0 20 54 68 69 73 0a 20 20 20 20 2a 2a 20 69 73 20   This.    ** is 
2b7d0 62 65 63 61 75 73 65 20 74 68 65 20 68 61 73 68  because the hash
2b7e0 20 74 61 62 6c 65 20 6f 6e 6c 79 20 73 75 70 70   table only supp
2b7f0 6f 72 74 73 20 61 20 73 69 6e 67 6c 65 20 73 63  orts a single sc
2b800 61 6e 20 71 75 65 72 79 20 61 74 0a 20 20 20 20  an query at.    
2b810 2a 2a 20 61 20 74 69 6d 65 2c 20 61 6e 64 20 74  ** a time, and t
2b820 68 65 20 6d 75 6c 74 69 2d 69 74 65 72 20 6c 6f  he multi-iter lo
2b830 6f 70 20 66 72 6f 6d 20 77 68 69 63 68 20 74 68  op from which th
2b840 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
2b850 61 6c 6c 65 64 0a 20 20 20 20 2a 2a 20 69 73 20  alled.    ** is 
2b860 61 6c 72 65 61 64 79 20 70 65 72 66 6f 72 6d 69  already performi
2b870 6e 67 20 73 75 63 68 20 61 20 73 63 61 6e 2e 20  ng such a scan. 
2b880 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e 6e 50  */.    if( p->nP
2b890 65 6e 64 69 6e 67 44 61 74 61 3d 3d 30 20 29 7b  endingData==0 ){
2b8a0 0a 20 20 20 20 20 20 69 66 28 20 69 49 64 78 3e  .      if( iIdx>
2b8b0 30 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f  0 && rc==SQLITE_
2b8c0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  OK ){.        in
2b8d0 74 20 66 20 3d 20 66 6c 61 67 73 7c 46 54 53 35  t f = flags|FTS5
2b8e0 49 4e 44 45 58 5f 51 55 45 52 59 5f 54 45 53 54  INDEX_QUERY_TEST
2b8f0 5f 4e 4f 49 44 58 3b 0a 20 20 20 20 20 20 20 20  _NOIDX;.        
2b900 63 6b 32 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  ck2 = 0;.       
2b910 20 72 63 20 3d 20 66 74 73 35 51 75 65 72 79 43   rc = fts5QueryC
2b920 6b 73 75 6d 28 70 2c 20 69 49 64 78 2c 20 7a 54  ksum(p, iIdx, zT
2b930 65 72 6d 2c 20 6e 54 65 72 6d 2c 20 66 2c 20 26  erm, nTerm, f, &
2b940 63 6b 32 29 3b 0a 20 20 20 20 20 20 20 20 69 66  ck2);.        if
2b950 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
2b960 26 26 20 63 6b 31 21 3d 63 6b 32 20 29 20 72 63  && ck1!=ck2 ) rc
2b970 20 3d 20 46 54 53 35 5f 43 4f 52 52 55 50 54 3b   = FTS5_CORRUPT;
2b980 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
2b990 66 28 20 69 49 64 78 3e 30 20 26 26 20 72 63 3d  f( iIdx>0 && rc=
2b9a0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2b9b0 20 20 20 20 20 20 69 6e 74 20 66 20 3d 20 66 6c        int f = fl
2b9c0 61 67 73 7c 46 54 53 35 49 4e 44 45 58 5f 51 55  ags|FTS5INDEX_QU
2b9d0 45 52 59 5f 54 45 53 54 5f 4e 4f 49 44 58 7c 46  ERY_TEST_NOIDX|F
2b9e0 54 53 35 49 4e 44 45 58 5f 51 55 45 52 59 5f 44  TS5INDEX_QUERY_D
2b9f0 45 53 43 3b 0a 20 20 20 20 20 20 20 20 63 6b 32  ESC;.        ck2
2ba00 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 72 63   = 0;.        rc
2ba10 20 3d 20 66 74 73 35 51 75 65 72 79 43 6b 73 75   = fts5QueryCksu
2ba20 6d 28 70 2c 20 69 49 64 78 2c 20 7a 54 65 72 6d  m(p, iIdx, zTerm
2ba30 2c 20 6e 54 65 72 6d 2c 20 66 2c 20 26 63 6b 32  , nTerm, f, &ck2
2ba40 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
2ba50 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
2ba60 63 6b 31 21 3d 63 6b 32 20 29 20 72 63 20 3d 20  ck1!=ck2 ) rc = 
2ba70 46 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20  FTS5_CORRUPT;.  
2ba80 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
2ba90 20 63 6b 73 75 6d 33 20 5e 3d 20 63 6b 31 3b 0a   cksum3 ^= ck1;.
2baa0 20 20 20 20 66 74 73 35 42 75 66 66 65 72 53 65      fts5BufferSe
2bab0 74 28 26 72 63 2c 20 70 50 72 65 76 2c 20 6e 2c  t(&rc, pPrev, n,
2bac0 20 28 63 6f 6e 73 74 20 75 38 2a 29 7a 29 3b 0a   (const u8*)z);.
2bad0 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
2bae0 49 54 45 5f 4f 4b 20 26 26 20 63 6b 73 75 6d 33  ITE_OK && cksum3
2baf0 21 3d 65 78 70 65 63 74 65 64 20 29 7b 0a 20 20  !=expected ){.  
2bb00 20 20 20 20 72 63 20 3d 20 46 54 53 35 5f 43 4f      rc = FTS5_CO
2bb10 52 52 55 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20  RRUPT;.    }.   
2bb20 20 2a 70 43 6b 73 75 6d 20 3d 20 63 6b 73 75 6d   *pCksum = cksum
2bb30 33 3b 0a 20 20 7d 0a 20 20 70 2d 3e 72 63 20 3d  3;.  }.  p->rc =
2bb40 20 72 63 3b 0a 7d 0a 20 0a 23 65 6c 73 65 0a 23   rc;.}. .#else.#
2bb50 20 64 65 66 69 6e 65 20 66 74 73 35 54 65 73 74   define fts5Test
2bb60 44 6c 69 64 78 52 65 76 65 72 73 65 28 78 2c 79  DlidxReverse(x,y
2bb70 2c 7a 29 0a 23 20 64 65 66 69 6e 65 20 66 74 73  ,z).# define fts
2bb80 35 54 65 73 74 54 65 72 6d 28 75 2c 76 2c 77 2c  5TestTerm(u,v,w,
2bb90 78 2c 79 2c 7a 29 0a 23 65 6e 64 69 66 0a 0a 2f  x,y,z).#endif../
2bba0 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 68 61 74 3a  *.** Check that:
2bbb0 0a 2a 2a 0a 2a 2a 20 20 20 31 29 20 41 6c 6c 20  .**.**   1) All 
2bbc0 6c 65 61 76 65 73 20 6f 66 20 70 53 65 67 20 62  leaves of pSeg b
2bbd0 65 74 77 65 65 6e 20 69 46 69 72 73 74 20 61 6e  etween iFirst an
2bbe0 64 20 69 4c 61 73 74 20 28 69 6e 63 6c 75 73 69  d iLast (inclusi
2bbf0 76 65 29 20 65 78 69 73 74 20 61 6e 64 0a 2a 2a  ve) exist and.**
2bc00 20 20 20 20 20 20 63 6f 6e 74 61 69 6e 20 7a 65        contain ze
2bc10 72 6f 20 74 65 72 6d 73 2e 0a 2a 2a 20 20 20 32  ro terms..**   2
2bc20 29 20 41 6c 6c 20 6c 65 61 76 65 73 20 6f 66 20  ) All leaves of 
2bc30 70 53 65 67 20 62 65 74 77 65 65 6e 20 69 4e 6f  pSeg between iNo
2bc40 52 6f 77 69 64 20 61 6e 64 20 69 4c 61 73 74 20  Rowid and iLast 
2bc50 28 69 6e 63 6c 75 73 69 76 65 29 20 65 78 69 73  (inclusive) exis
2bc60 74 20 61 6e 64 0a 2a 2a 20 20 20 20 20 20 63 6f  t and.**      co
2bc70 6e 74 61 69 6e 20 7a 65 72 6f 20 72 6f 77 69 64  ntain zero rowid
2bc80 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  s..*/.static voi
2bc90 64 20 66 74 73 35 49 6e 64 65 78 49 6e 74 65 67  d fts5IndexInteg
2bca0 72 69 74 79 43 68 65 63 6b 45 6d 70 74 79 28 0a  rityCheckEmpty(.
2bcb0 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 0a    Fts5Index *p,.
2bcc0 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65 53    Fts5StructureS
2bcd0 65 67 6d 65 6e 74 20 2a 70 53 65 67 2c 20 20 20  egment *pSeg,   
2bce0 20 20 2f 2a 20 53 65 67 6d 65 6e 74 20 74 6f 20    /* Segment to 
2bcf0 63 68 65 63 6b 20 69 6e 74 65 72 6e 61 6c 20 63  check internal c
2bd00 6f 6e 73 69 73 74 65 6e 63 79 20 2a 2f 0a 20 20  onsistency */.  
2bd10 69 6e 74 20 69 46 69 72 73 74 2c 0a 20 20 69 6e  int iFirst,.  in
2bd20 74 20 69 4e 6f 52 6f 77 69 64 2c 0a 20 20 69 6e  t iNoRowid,.  in
2bd30 74 20 69 4c 61 73 74 0a 29 7b 0a 20 20 69 6e 74  t iLast.){.  int
2bd40 20 69 3b 0a 0a 20 20 2f 2a 20 4e 6f 77 20 63 68   i;..  /* Now ch
2bd50 65 63 6b 20 74 68 61 74 20 74 68 65 20 69 74 65  eck that the ite
2bd60 72 2e 6e 45 6d 70 74 79 20 6c 65 61 76 65 73 20  r.nEmpty leaves 
2bd70 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 63 75  following the cu
2bd80 72 72 65 6e 74 20 6c 65 61 66 0a 20 20 2a 2a 20  rrent leaf.  ** 
2bd90 28 61 29 20 65 78 69 73 74 20 61 6e 64 20 28 62  (a) exist and (b
2bda0 29 20 63 6f 6e 74 61 69 6e 20 6e 6f 20 74 65 72  ) contain no ter
2bdb0 6d 73 2e 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 69  ms. */.  for(i=i
2bdc0 46 69 72 73 74 3b 20 70 2d 3e 72 63 3d 3d 53 51  First; p->rc==SQ
2bdd0 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c 3d 69 4c  LITE_OK && i<=iL
2bde0 61 73 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 46  ast; i++){.    F
2bdf0 74 73 35 44 61 74 61 20 2a 70 4c 65 61 66 20 3d  ts5Data *pLeaf =
2be00 20 66 74 73 35 44 61 74 61 52 65 61 64 28 70 2c   fts5DataRead(p,
2be10 20 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f 52 4f   FTS5_SEGMENT_RO
2be20 57 49 44 28 70 53 65 67 2d 3e 69 53 65 67 69 64  WID(pSeg->iSegid
2be30 2c 20 69 29 29 3b 0a 20 20 20 20 69 66 28 20 70  , i));.    if( p
2be40 4c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 69 66  Leaf ){.      if
2be50 28 20 21 66 74 73 35 4c 65 61 66 49 73 54 65 72  ( !fts5LeafIsTer
2be60 6d 6c 65 73 73 28 70 4c 65 61 66 29 20 29 20 70  mless(pLeaf) ) p
2be70 2d 3e 72 63 20 3d 20 46 54 53 35 5f 43 4f 52 52  ->rc = FTS5_CORR
2be80 55 50 54 3b 0a 20 20 20 20 20 20 69 66 28 20 69  UPT;.      if( i
2be90 3e 3d 69 4e 6f 52 6f 77 69 64 20 26 26 20 30 21  >=iNoRowid && 0!
2bea0 3d 66 74 73 35 4c 65 61 66 46 69 72 73 74 52 6f  =fts5LeafFirstRo
2beb0 77 69 64 4f 66 66 28 70 4c 65 61 66 29 20 29 20  widOff(pLeaf) ) 
2bec0 70 2d 3e 72 63 20 3d 20 46 54 53 35 5f 43 4f 52  p->rc = FTS5_COR
2bed0 52 55 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20  RUPT;.    }.    
2bee0 66 74 73 35 44 61 74 61 52 65 6c 65 61 73 65 28  fts5DataRelease(
2bef0 70 4c 65 61 66 29 3b 0a 20 20 7d 0a 7d 0a 0a 73  pLeaf);.  }.}..s
2bf00 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 49  tatic void fts5I
2bf10 6e 74 65 67 72 69 74 79 43 68 65 63 6b 50 67 69  ntegrityCheckPgi
2bf20 64 78 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c  dx(Fts5Index *p,
2bf30 20 46 74 73 35 44 61 74 61 20 2a 70 4c 65 61 66   Fts5Data *pLeaf
2bf40 29 7b 0a 20 20 69 6e 74 20 69 54 65 72 6d 4f 66  ){.  int iTermOf
2bf50 66 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 69 3b  f = 0;.  int ii;
2bf60 0a 0a 20 20 46 74 73 35 42 75 66 66 65 72 20 62  ..  Fts5Buffer b
2bf70 75 66 31 20 3d 20 7b 30 2c 30 2c 30 7d 3b 0a 20  uf1 = {0,0,0};. 
2bf80 20 46 74 73 35 42 75 66 66 65 72 20 62 75 66 32   Fts5Buffer buf2
2bf90 20 3d 20 7b 30 2c 30 2c 30 7d 3b 0a 0a 20 20 69   = {0,0,0};..  i
2bfa0 69 20 3d 20 70 4c 65 61 66 2d 3e 73 7a 4c 65 61  i = pLeaf->szLea
2bfb0 66 3b 0a 20 20 77 68 69 6c 65 28 20 69 69 3c 70  f;.  while( ii<p
2bfc0 4c 65 61 66 2d 3e 6e 6e 20 26 26 20 70 2d 3e 72  Leaf->nn && p->r
2bfd0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
2bfe0 20 20 20 20 69 6e 74 20 72 65 73 3b 0a 20 20 20      int res;.   
2bff0 20 69 6e 74 20 69 4f 66 66 3b 0a 20 20 20 20 69   int iOff;.    i
2c000 6e 74 20 6e 49 6e 63 72 3b 0a 0a 20 20 20 20 69  nt nIncr;..    i
2c010 69 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69  i += fts5GetVari
2c020 6e 74 33 32 28 26 70 4c 65 61 66 2d 3e 70 5b 69  nt32(&pLeaf->p[i
2c030 69 5d 2c 20 6e 49 6e 63 72 29 3b 0a 20 20 20 20  i], nIncr);.    
2c040 69 54 65 72 6d 4f 66 66 20 2b 3d 20 6e 49 6e 63  iTermOff += nInc
2c050 72 3b 0a 20 20 20 20 69 4f 66 66 20 3d 20 69 54  r;.    iOff = iT
2c060 65 72 6d 4f 66 66 3b 0a 0a 20 20 20 20 69 66 28  ermOff;..    if(
2c070 20 69 4f 66 66 3e 3d 70 4c 65 61 66 2d 3e 73 7a   iOff>=pLeaf->sz
2c080 4c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 70 2d  Leaf ){.      p-
2c090 3e 72 63 20 3d 20 46 54 53 35 5f 43 4f 52 52 55  >rc = FTS5_CORRU
2c0a0 50 54 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  PT;.    }else if
2c0b0 28 20 69 54 65 72 6d 4f 66 66 3d 3d 6e 49 6e 63  ( iTermOff==nInc
2c0c0 72 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e  r ){.      int n
2c0d0 42 79 74 65 3b 0a 20 20 20 20 20 20 69 4f 66 66  Byte;.      iOff
2c0e0 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e   += fts5GetVarin
2c0f0 74 33 32 28 26 70 4c 65 61 66 2d 3e 70 5b 69 4f  t32(&pLeaf->p[iO
2c100 66 66 5d 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20  ff], nByte);.   
2c110 20 20 20 69 66 28 20 28 69 4f 66 66 2b 6e 42 79     if( (iOff+nBy
2c120 74 65 29 3e 70 4c 65 61 66 2d 3e 73 7a 4c 65 61  te)>pLeaf->szLea
2c130 66 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e  f ){.        p->
2c140 72 63 20 3d 20 46 54 53 35 5f 43 4f 52 52 55 50  rc = FTS5_CORRUP
2c150 54 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  T;.      }else{.
2c160 20 20 20 20 20 20 20 20 66 74 73 35 42 75 66 66          fts5Buff
2c170 65 72 53 65 74 28 26 70 2d 3e 72 63 2c 20 26 62  erSet(&p->rc, &b
2c180 75 66 31 2c 20 6e 42 79 74 65 2c 20 26 70 4c 65  uf1, nByte, &pLe
2c190 61 66 2d 3e 70 5b 69 4f 66 66 5d 29 3b 0a 20 20  af->p[iOff]);.  
2c1a0 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b      }.    }else{
2c1b0 0a 20 20 20 20 20 20 69 6e 74 20 6e 4b 65 65 70  .      int nKeep
2c1c0 2c 20 6e 42 79 74 65 3b 0a 20 20 20 20 20 20 69  , nByte;.      i
2c1d0 4f 66 66 20 2b 3d 20 66 74 73 35 47 65 74 56 61  Off += fts5GetVa
2c1e0 72 69 6e 74 33 32 28 26 70 4c 65 61 66 2d 3e 70  rint32(&pLeaf->p
2c1f0 5b 69 4f 66 66 5d 2c 20 6e 4b 65 65 70 29 3b 0a  [iOff], nKeep);.
2c200 20 20 20 20 20 20 69 4f 66 66 20 2b 3d 20 66 74        iOff += ft
2c210 73 35 47 65 74 56 61 72 69 6e 74 33 32 28 26 70  s5GetVarint32(&p
2c220 4c 65 61 66 2d 3e 70 5b 69 4f 66 66 5d 2c 20 6e  Leaf->p[iOff], n
2c230 42 79 74 65 29 3b 0a 20 20 20 20 20 20 69 66 28  Byte);.      if(
2c240 20 6e 4b 65 65 70 3e 62 75 66 31 2e 6e 20 7c 7c   nKeep>buf1.n ||
2c250 20 28 69 4f 66 66 2b 6e 42 79 74 65 29 3e 70 4c   (iOff+nByte)>pL
2c260 65 61 66 2d 3e 73 7a 4c 65 61 66 20 29 7b 0a 20  eaf->szLeaf ){. 
2c270 20 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 46         p->rc = F
2c280 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20  TS5_CORRUPT;.   
2c290 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2c2a0 20 20 62 75 66 31 2e 6e 20 3d 20 6e 4b 65 65 70    buf1.n = nKeep
2c2b0 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35 42 75  ;.        fts5Bu
2c2c0 66 66 65 72 41 70 70 65 6e 64 42 6c 6f 62 28 26  fferAppendBlob(&
2c2d0 70 2d 3e 72 63 2c 20 26 62 75 66 31 2c 20 6e 42  p->rc, &buf1, nB
2c2e0 79 74 65 2c 20 26 70 4c 65 61 66 2d 3e 70 5b 69  yte, &pLeaf->p[i
2c2f0 4f 66 66 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 0a  Off]);.      }..
2c300 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d        if( p->rc=
2c310 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2c320 20 20 20 20 20 20 72 65 73 20 3d 20 66 74 73 35        res = fts5
2c330 42 75 66 66 65 72 43 6f 6d 70 61 72 65 28 26 62  BufferCompare(&b
2c340 75 66 31 2c 20 26 62 75 66 32 29 3b 0a 20 20 20  uf1, &buf2);.   
2c350 20 20 20 20 20 69 66 28 20 72 65 73 3c 3d 30 20       if( res<=0 
2c360 29 20 70 2d 3e 72 63 20 3d 20 46 54 53 35 5f 43  ) p->rc = FTS5_C
2c370 4f 52 52 55 50 54 3b 0a 20 20 20 20 20 20 7d 0a  ORRUPT;.      }.
2c380 20 20 20 20 7d 0a 20 20 20 20 66 74 73 35 42 75      }.    fts5Bu
2c390 66 66 65 72 53 65 74 28 26 70 2d 3e 72 63 2c 20  fferSet(&p->rc, 
2c3a0 26 62 75 66 32 2c 20 62 75 66 31 2e 6e 2c 20 62  &buf2, buf1.n, b
2c3b0 75 66 31 2e 70 29 3b 0a 20 20 7d 0a 0a 20 20 66  uf1.p);.  }..  f
2c3c0 74 73 35 42 75 66 66 65 72 46 72 65 65 28 26 62  ts5BufferFree(&b
2c3d0 75 66 31 29 3b 0a 20 20 66 74 73 35 42 75 66 66  uf1);.  fts5Buff
2c3e0 65 72 46 72 65 65 28 26 62 75 66 32 29 3b 0a 7d  erFree(&buf2);.}
2c3f0 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  ..static void ft
2c400 73 35 49 6e 64 65 78 49 6e 74 65 67 72 69 74 79  s5IndexIntegrity
2c410 43 68 65 63 6b 53 65 67 6d 65 6e 74 28 0a 20 20  CheckSegment(.  
2c420 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 20 20  Fts5Index *p,   
2c430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c440 2f 2a 20 46 54 53 35 20 62 61 63 6b 65 6e 64 20  /* FTS5 backend 
2c450 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 46 74 73 35  object */.  Fts5
2c460 53 74 72 75 63 74 75 72 65 53 65 67 6d 65 6e 74  StructureSegment
2c470 20 2a 70 53 65 67 20 20 20 20 20 20 2f 2a 20 53   *pSeg      /* S
2c480 65 67 6d 65 6e 74 20 74 6f 20 63 68 65 63 6b 20  egment to check 
2c490 69 6e 74 65 72 6e 61 6c 20 63 6f 6e 73 69 73 74  internal consist
2c4a0 65 6e 63 79 20 2a 2f 0a 29 7b 0a 20 20 46 74 73  ency */.){.  Fts
2c4b0 35 43 6f 6e 66 69 67 20 2a 70 43 6f 6e 66 69 67  5Config *pConfig
2c4c0 20 3d 20 70 2d 3e 70 43 6f 6e 66 69 67 3b 0a 20   = p->pConfig;. 
2c4d0 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
2c4e0 53 74 6d 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20  Stmt = 0;.  int 
2c4f0 72 63 32 3b 0a 20 20 69 6e 74 20 69 49 64 78 50  rc2;.  int iIdxP
2c500 72 65 76 4c 65 61 66 20 3d 20 70 53 65 67 2d 3e  revLeaf = pSeg->
2c510 70 67 6e 6f 46 69 72 73 74 2d 31 3b 0a 20 20 69  pgnoFirst-1;.  i
2c520 6e 74 20 69 44 6c 69 64 78 50 72 65 76 4c 65 61  nt iDlidxPrevLea
2c530 66 20 3d 20 70 53 65 67 2d 3e 70 67 6e 6f 4c 61  f = pSeg->pgnoLa
2c540 73 74 3b 0a 0a 20 20 69 66 28 20 70 53 65 67 2d  st;..  if( pSeg-
2c550 3e 70 67 6e 6f 46 69 72 73 74 3d 3d 30 20 29 20  >pgnoFirst==0 ) 
2c560 72 65 74 75 72 6e 3b 0a 0a 20 20 66 74 73 35 49  return;..  fts5I
2c570 6e 64 65 78 50 72 65 70 61 72 65 53 74 6d 74 28  ndexPrepareStmt(
2c580 70 2c 20 26 70 53 74 6d 74 2c 20 73 71 6c 69 74  p, &pStmt, sqlit
2c590 65 33 5f 6d 70 72 69 6e 74 66 28 0a 20 20 20 20  e3_mprintf(.    
2c5a0 20 20 22 53 45 4c 45 43 54 20 73 65 67 69 64 2c    "SELECT segid,
2c5b0 20 74 65 72 6d 2c 20 28 70 67 6e 6f 3e 3e 31 29   term, (pgno>>1)
2c5c0 2c 20 28 70 67 6e 6f 26 31 29 20 46 52 4f 4d 20  , (pgno&1) FROM 
2c5d0 25 51 2e 27 25 71 5f 69 64 78 27 20 57 48 45 52  %Q.'%q_idx' WHER
2c5e0 45 20 73 65 67 69 64 3d 25 64 22 2c 0a 20 20 20  E segid=%d",.   
2c5f0 20 20 20 70 43 6f 6e 66 69 67 2d 3e 7a 44 62 2c     pConfig->zDb,
2c600 20 70 43 6f 6e 66 69 67 2d 3e 7a 4e 61 6d 65 2c   pConfig->zName,
2c610 20 70 53 65 67 2d 3e 69 53 65 67 69 64 0a 20 20   pSeg->iSegid.  
2c620 29 29 3b 0a 0a 20 20 2f 2a 20 49 74 65 72 61 74  ));..  /* Iterat
2c630 65 20 74 68 72 6f 75 67 68 20 74 68 65 20 62 2d  e through the b-
2c640 74 72 65 65 20 68 69 65 72 61 72 63 68 79 2e 20  tree hierarchy. 
2c650 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20 70 2d 3e   */.  while( p->
2c660 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
2c670 20 53 51 4c 49 54 45 5f 52 4f 57 3d 3d 73 71 6c   SQLITE_ROW==sql
2c680 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29  ite3_step(pStmt)
2c690 20 29 7b 0a 20 20 20 20 69 36 34 20 69 52 6f 77   ){.    i64 iRow
2c6a0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2c6b0 20 20 20 20 20 20 2f 2a 20 52 6f 77 69 64 20 66        /* Rowid f
2c6c0 6f 72 20 74 68 69 73 20 6c 65 61 66 20 2a 2f 0a  or this leaf */.
2c6d0 20 20 20 20 46 74 73 35 44 61 74 61 20 2a 70 4c      Fts5Data *pL
2c6e0 65 61 66 3b 20 20 20 20 20 20 20 20 20 20 20 20  eaf;            
2c6f0 20 20 2f 2a 20 44 61 74 61 20 66 6f 72 20 74 68    /* Data for th
2c700 69 73 20 6c 65 61 66 20 2a 2f 0a 0a 20 20 20 20  is leaf */..    
2c710 69 6e 74 20 6e 49 64 78 54 65 72 6d 20 3d 20 73  int nIdxTerm = s
2c720 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 79  qlite3_column_by
2c730 74 65 73 28 70 53 74 6d 74 2c 20 31 29 3b 0a 20  tes(pStmt, 1);. 
2c740 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
2c750 49 64 78 54 65 72 6d 20 3d 20 28 63 6f 6e 73 74  IdxTerm = (const
2c760 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 63   char*)sqlite3_c
2c770 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53 74 6d 74  olumn_text(pStmt
2c780 2c 20 31 29 3b 0a 20 20 20 20 69 6e 74 20 69 49  , 1);.    int iI
2c790 64 78 4c 65 61 66 20 3d 20 73 71 6c 69 74 65 33  dxLeaf = sqlite3
2c7a0 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 53 74 6d  _column_int(pStm
2c7b0 74 2c 20 32 29 3b 0a 20 20 20 20 69 6e 74 20 62  t, 2);.    int b
2c7c0 49 64 78 44 6c 69 64 78 20 3d 20 73 71 6c 69 74  IdxDlidx = sqlit
2c7d0 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 53  e3_column_int(pS
2c7e0 74 6d 74 2c 20 33 29 3b 0a 0a 20 20 20 20 2f 2a  tmt, 3);..    /*
2c7f0 20 49 66 20 74 68 65 20 6c 65 61 66 20 69 6e 20   If the leaf in 
2c800 71 75 65 73 74 69 6f 6e 20 68 61 73 20 61 6c 72  question has alr
2c810 65 61 64 79 20 62 65 65 6e 20 74 72 69 6d 6d 65  eady been trimme
2c820 64 20 66 72 6f 6d 20 74 68 65 20 73 65 67 6d 65  d from the segme
2c830 6e 74 2c 20 0a 20 20 20 20 2a 2a 20 69 67 6e 6f  nt, .    ** igno
2c840 72 65 20 74 68 69 73 20 62 2d 74 72 65 65 20 65  re this b-tree e
2c850 6e 74 72 79 2e 20 4f 74 68 65 72 77 69 73 65 2c  ntry. Otherwise,
2c860 20 6c 6f 61 64 20 69 74 20 69 6e 74 6f 20 6d 65   load it into me
2c870 6d 6f 72 79 2e 20 2a 2f 0a 20 20 20 20 69 66 28  mory. */.    if(
2c880 20 69 49 64 78 4c 65 61 66 3c 70 53 65 67 2d 3e   iIdxLeaf<pSeg->
2c890 70 67 6e 6f 46 69 72 73 74 20 29 20 63 6f 6e 74  pgnoFirst ) cont
2c8a0 69 6e 75 65 3b 0a 20 20 20 20 69 52 6f 77 20 3d  inue;.    iRow =
2c8b0 20 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f 52 4f   FTS5_SEGMENT_RO
2c8c0 57 49 44 28 70 53 65 67 2d 3e 69 53 65 67 69 64  WID(pSeg->iSegid
2c8d0 2c 20 69 49 64 78 4c 65 61 66 29 3b 0a 20 20 20  , iIdxLeaf);.   
2c8e0 20 70 4c 65 61 66 20 3d 20 66 74 73 35 4c 65 61   pLeaf = fts5Lea
2c8f0 66 52 65 61 64 28 70 2c 20 69 52 6f 77 29 3b 0a  fRead(p, iRow);.
2c900 20 20 20 20 69 66 28 20 70 4c 65 61 66 3d 3d 30      if( pLeaf==0
2c910 20 29 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 2f   ) break;..    /
2c920 2a 20 43 68 65 63 6b 20 74 68 61 74 20 74 68 65  * Check that the
2c930 20 6c 65 61 66 20 63 6f 6e 74 61 69 6e 73 20 61   leaf contains a
2c940 74 20 6c 65 61 73 74 20 6f 6e 65 20 74 65 72 6d  t least one term
2c950 2c 20 61 6e 64 20 74 68 61 74 20 69 74 20 69 73  , and that it is
2c960 20 65 71 75 61 6c 0a 20 20 20 20 2a 2a 20 74 6f   equal.    ** to
2c970 20 6f 72 20 6c 61 72 67 65 72 20 74 68 61 6e 20   or larger than 
2c980 74 68 65 20 73 70 6c 69 74 2d 6b 65 79 20 69 6e  the split-key in
2c990 20 7a 49 64 78 54 65 72 6d 2e 20 20 41 6c 73 6f   zIdxTerm.  Also
2c9a0 20 63 68 65 63 6b 20 74 68 61 74 20 69 66 20 74   check that if t
2c9b0 68 65 72 65 0a 20 20 20 20 2a 2a 20 69 73 20 61  here.    ** is a
2c9c0 6c 73 6f 20 61 20 72 6f 77 69 64 20 70 6f 69 6e  lso a rowid poin
2c9d0 74 65 72 20 77 69 74 68 69 6e 20 74 68 65 20 6c  ter within the l
2c9e0 65 61 66 20 70 61 67 65 20 68 65 61 64 65 72 2c  eaf page header,
2c9f0 20 69 74 20 70 6f 69 6e 74 73 20 74 6f 20 61 0a   it points to a.
2ca00 20 20 20 20 2a 2a 20 6c 6f 63 61 74 69 6f 6e 20      ** location 
2ca10 62 65 66 6f 72 65 20 74 68 65 20 74 65 72 6d 2e  before the term.
2ca20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 4c 65    */.    if( pLe
2ca30 61 66 2d 3e 6e 6e 3c 3d 70 4c 65 61 66 2d 3e 73  af->nn<=pLeaf->s
2ca40 7a 4c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 70  zLeaf ){.      p
2ca50 2d 3e 72 63 20 3d 20 46 54 53 35 5f 43 4f 52 52  ->rc = FTS5_CORR
2ca60 55 50 54 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  UPT;.    }else{.
2ca70 20 20 20 20 20 20 69 6e 74 20 69 4f 66 66 3b 20        int iOff; 
2ca80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ca90 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66 20 66    /* Offset of f
2caa0 69 72 73 74 20 74 65 72 6d 20 6f 6e 20 6c 65 61  irst term on lea
2cab0 66 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 69  f */.      int i
2cac0 52 6f 77 69 64 4f 66 66 3b 20 20 20 20 20 20 20  RowidOff;       
2cad0 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74         /* Offset
2cae0 20 6f 66 20 66 69 72 73 74 20 72 6f 77 69 64 20   of first rowid 
2caf0 6f 6e 20 6c 65 61 66 20 2a 2f 0a 20 20 20 20 20  on leaf */.     
2cb00 20 69 6e 74 20 6e 54 65 72 6d 3b 20 20 20 20 20   int nTerm;     
2cb10 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2cb20 53 69 7a 65 20 6f 66 20 74 65 72 6d 20 6f 6e 20  Size of term on 
2cb30 6c 65 61 66 20 69 6e 20 62 79 74 65 73 20 2a 2f  leaf in bytes */
2cb40 0a 20 20 20 20 20 20 69 6e 74 20 72 65 73 3b 20  .      int res; 
2cb50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2cb60 20 20 20 2f 2a 20 43 6f 6d 70 61 72 69 73 6f 6e     /* Comparison
2cb70 20 6f 66 20 74 65 72 6d 20 61 6e 64 20 73 70 6c   of term and spl
2cb80 69 74 2d 6b 65 79 20 2a 2f 0a 0a 20 20 20 20 20  it-key */..     
2cb90 20 69 4f 66 66 20 3d 20 66 74 73 35 4c 65 61 66   iOff = fts5Leaf
2cba0 46 69 72 73 74 54 65 72 6d 4f 66 66 28 70 4c 65  FirstTermOff(pLe
2cbb0 61 66 29 3b 0a 20 20 20 20 20 20 69 52 6f 77 69  af);.      iRowi
2cbc0 64 4f 66 66 20 3d 20 66 74 73 35 4c 65 61 66 46  dOff = fts5LeafF
2cbd0 69 72 73 74 52 6f 77 69 64 4f 66 66 28 70 4c 65  irstRowidOff(pLe
2cbe0 61 66 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69  af);.      if( i
2cbf0 52 6f 77 69 64 4f 66 66 3e 3d 69 4f 66 66 20 29  RowidOff>=iOff )
2cc00 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 72 63 20  {.        p->rc 
2cc10 3d 20 46 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a  = FTS5_CORRUPT;.
2cc20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
2cc30 20 20 20 20 20 69 4f 66 66 20 2b 3d 20 66 74 73       iOff += fts
2cc40 35 47 65 74 56 61 72 69 6e 74 33 32 28 26 70 4c  5GetVarint32(&pL
2cc50 65 61 66 2d 3e 70 5b 69 4f 66 66 5d 2c 20 6e 54  eaf->p[iOff], nT
2cc60 65 72 6d 29 3b 0a 20 20 20 20 20 20 20 20 72 65  erm);.        re
2cc70 73 20 3d 20 6d 65 6d 63 6d 70 28 26 70 4c 65 61  s = memcmp(&pLea
2cc80 66 2d 3e 70 5b 69 4f 66 66 5d 2c 20 7a 49 64 78  f->p[iOff], zIdx
2cc90 54 65 72 6d 2c 20 4d 49 4e 28 6e 54 65 72 6d 2c  Term, MIN(nTerm,
2cca0 20 6e 49 64 78 54 65 72 6d 29 29 3b 0a 20 20 20   nIdxTerm));.   
2ccb0 20 20 20 20 20 69 66 28 20 72 65 73 3d 3d 30 20       if( res==0 
2ccc0 29 20 72 65 73 20 3d 20 6e 54 65 72 6d 20 2d 20  ) res = nTerm - 
2ccd0 6e 49 64 78 54 65 72 6d 3b 0a 20 20 20 20 20 20  nIdxTerm;.      
2cce0 20 20 69 66 28 20 72 65 73 3c 30 20 29 20 70 2d    if( res<0 ) p-
2ccf0 3e 72 63 20 3d 20 46 54 53 35 5f 43 4f 52 52 55  >rc = FTS5_CORRU
2cd00 50 54 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  PT;.      }..   
2cd10 20 20 20 66 74 73 35 49 6e 74 65 67 72 69 74 79     fts5Integrity
2cd20 43 68 65 63 6b 50 67 69 64 78 28 70 2c 20 70 4c  CheckPgidx(p, pL
2cd30 65 61 66 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  eaf);.    }.    
2cd40 66 74 73 35 44 61 74 61 52 65 6c 65 61 73 65 28  fts5DataRelease(
2cd50 70 4c 65 61 66 29 3b 0a 20 20 20 20 69 66 28 20  pLeaf);.    if( 
2cd60 70 2d 3e 72 63 20 29 20 62 72 65 61 6b 3b 0a 0a  p->rc ) break;..
2cd70 20 20 20 20 2f 2a 20 4e 6f 77 20 63 68 65 63 6b      /* Now check
2cd80 20 74 68 61 74 20 74 68 65 20 69 74 65 72 2e 6e   that the iter.n
2cd90 45 6d 70 74 79 20 6c 65 61 76 65 73 20 66 6f 6c  Empty leaves fol
2cda0 6c 6f 77 69 6e 67 20 74 68 65 20 63 75 72 72 65  lowing the curre
2cdb0 6e 74 20 6c 65 61 66 0a 20 20 20 20 2a 2a 20 28  nt leaf.    ** (
2cdc0 61 29 20 65 78 69 73 74 20 61 6e 64 20 28 62 29  a) exist and (b)
2cdd0 20 63 6f 6e 74 61 69 6e 20 6e 6f 20 74 65 72 6d   contain no term
2cde0 73 2e 20 2a 2f 0a 20 20 20 20 66 74 73 35 49 6e  s. */.    fts5In
2cdf0 64 65 78 49 6e 74 65 67 72 69 74 79 43 68 65 63  dexIntegrityChec
2ce00 6b 45 6d 70 74 79 28 0a 20 20 20 20 20 20 20 20  kEmpty(.        
2ce10 70 2c 20 70 53 65 67 2c 20 69 49 64 78 50 72 65  p, pSeg, iIdxPre
2ce20 76 4c 65 61 66 2b 31 2c 20 69 44 6c 69 64 78 50  vLeaf+1, iDlidxP
2ce30 72 65 76 4c 65 61 66 2b 31 2c 20 69 49 64 78 4c  revLeaf+1, iIdxL
2ce40 65 61 66 2d 31 0a 20 20 20 20 29 3b 0a 20 20 20  eaf-1.    );.   
2ce50 20 69 66 28 20 70 2d 3e 72 63 20 29 20 62 72 65   if( p->rc ) bre
2ce60 61 6b 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74  ak;..    /* If t
2ce70 68 65 72 65 20 69 73 20 61 20 64 6f 63 6c 69 73  here is a doclis
2ce80 74 2d 69 6e 64 65 78 2c 20 63 68 65 63 6b 20 74  t-index, check t
2ce90 68 61 74 20 69 74 20 6c 6f 6f 6b 73 20 72 69 67  hat it looks rig
2cea0 68 74 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 62  ht. */.    if( b
2ceb0 49 64 78 44 6c 69 64 78 20 29 7b 0a 20 20 20 20  IdxDlidx ){.    
2cec0 20 20 46 74 73 35 44 6c 69 64 78 49 74 65 72 20    Fts5DlidxIter 
2ced0 2a 70 44 6c 69 64 78 20 3d 20 30 3b 20 20 2f 2a  *pDlidx = 0;  /*
2cee0 20 46 6f 72 20 69 74 65 72 61 74 69 6e 67 20 74   For iterating t
2cef0 68 72 6f 75 67 68 20 64 6f 63 6c 69 73 74 20 69  hrough doclist i
2cf00 6e 64 65 78 20 2a 2f 0a 20 20 20 20 20 20 69 6e  ndex */.      in
2cf10 74 20 69 50 72 65 76 4c 65 61 66 20 3d 20 69 49  t iPrevLeaf = iI
2cf20 64 78 4c 65 61 66 3b 0a 20 20 20 20 20 20 69 6e  dxLeaf;.      in
2cf30 74 20 69 53 65 67 69 64 20 3d 20 70 53 65 67 2d  t iSegid = pSeg-
2cf40 3e 69 53 65 67 69 64 3b 0a 20 20 20 20 20 20 69  >iSegid;.      i
2cf50 6e 74 20 69 50 67 20 3d 20 30 3b 0a 20 20 20 20  nt iPg = 0;.    
2cf60 20 20 69 36 34 20 69 4b 65 79 3b 0a 0a 20 20 20    i64 iKey;..   
2cf70 20 20 20 66 6f 72 28 70 44 6c 69 64 78 3d 66 74     for(pDlidx=ft
2cf80 73 35 44 6c 69 64 78 49 74 65 72 49 6e 69 74 28  s5DlidxIterInit(
2cf90 70 2c 20 30 2c 20 69 53 65 67 69 64 2c 20 69 49  p, 0, iSegid, iI
2cfa0 64 78 4c 65 61 66 29 3b 0a 20 20 20 20 20 20 20  dxLeaf);.       
2cfb0 20 20 20 66 74 73 35 44 6c 69 64 78 49 74 65 72     fts5DlidxIter
2cfc0 45 6f 66 28 70 2c 20 70 44 6c 69 64 78 29 3d 3d  Eof(p, pDlidx)==
2cfd0 30 3b 0a 20 20 20 20 20 20 20 20 20 20 66 74 73  0;.          fts
2cfe0 35 44 6c 69 64 78 49 74 65 72 4e 65 78 74 28 70  5DlidxIterNext(p
2cff0 2c 20 70 44 6c 69 64 78 29 0a 20 20 20 20 20 20  , pDlidx).      
2d000 29 7b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 43  ){..        /* C
2d010 68 65 63 6b 20 61 6e 79 20 72 6f 77 69 64 2d 6c  heck any rowid-l
2d020 65 73 73 20 70 61 67 65 73 20 74 68 61 74 20 6f  ess pages that o
2d030 63 63 75 72 20 62 65 66 6f 72 65 20 74 68 65 20  ccur before the 
2d040 63 75 72 72 65 6e 74 20 6c 65 61 66 2e 20 2a 2f  current leaf. */
2d050 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 50 67  .        for(iPg
2d060 3d 69 50 72 65 76 4c 65 61 66 2b 31 3b 20 69 50  =iPrevLeaf+1; iP
2d070 67 3c 66 74 73 35 44 6c 69 64 78 49 74 65 72 50  g<fts5DlidxIterP
2d080 67 6e 6f 28 70 44 6c 69 64 78 29 3b 20 69 50 67  gno(pDlidx); iPg
2d090 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  ++){.          i
2d0a0 4b 65 79 20 3d 20 46 54 53 35 5f 53 45 47 4d 45  Key = FTS5_SEGME
2d0b0 4e 54 5f 52 4f 57 49 44 28 69 53 65 67 69 64 2c  NT_ROWID(iSegid,
2d0c0 20 69 50 67 29 3b 0a 20 20 20 20 20 20 20 20 20   iPg);.         
2d0d0 20 70 4c 65 61 66 20 3d 20 66 74 73 35 44 61 74   pLeaf = fts5Dat
2d0e0 61 52 65 61 64 28 70 2c 20 69 4b 65 79 29 3b 0a  aRead(p, iKey);.
2d0f0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 4c            if( pL
2d100 65 61 66 20 29 7b 0a 20 20 20 20 20 20 20 20 20  eaf ){.         
2d110 20 20 20 69 66 28 20 66 74 73 35 4c 65 61 66 46     if( fts5LeafF
2d120 69 72 73 74 52 6f 77 69 64 4f 66 66 28 70 4c 65  irstRowidOff(pLe
2d130 61 66 29 21 3d 30 20 29 20 70 2d 3e 72 63 20 3d  af)!=0 ) p->rc =
2d140 20 46 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20   FTS5_CORRUPT;. 
2d150 20 20 20 20 20 20 20 20 20 20 20 66 74 73 35 44             fts5D
2d160 61 74 61 52 65 6c 65 61 73 65 28 70 4c 65 61 66  ataRelease(pLeaf
2d170 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
2d180 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2d190 20 69 50 72 65 76 4c 65 61 66 20 3d 20 66 74 73   iPrevLeaf = fts
2d1a0 35 44 6c 69 64 78 49 74 65 72 50 67 6e 6f 28 70  5DlidxIterPgno(p
2d1b0 44 6c 69 64 78 29 3b 0a 0a 20 20 20 20 20 20 20  Dlidx);..       
2d1c0 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20 74   /* Check that t
2d1d0 68 65 20 6c 65 61 66 20 70 61 67 65 20 69 6e 64  he leaf page ind
2d1e0 69 63 61 74 65 64 20 62 79 20 74 68 65 20 69 74  icated by the it
2d1f0 65 72 61 74 6f 72 20 72 65 61 6c 6c 79 20 64 6f  erator really do
2d200 65 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 6f  es.        ** co
2d210 6e 74 61 69 6e 20 74 68 65 20 72 6f 77 69 64 20  ntain the rowid 
2d220 73 75 67 67 65 73 74 65 64 20 62 79 20 74 68 65  suggested by the
2d230 20 73 61 6d 65 2e 20 2a 2f 0a 20 20 20 20 20 20   same. */.      
2d240 20 20 69 4b 65 79 20 3d 20 46 54 53 35 5f 53 45    iKey = FTS5_SE
2d250 47 4d 45 4e 54 5f 52 4f 57 49 44 28 69 53 65 67  GMENT_ROWID(iSeg
2d260 69 64 2c 20 69 50 72 65 76 4c 65 61 66 29 3b 0a  id, iPrevLeaf);.
2d270 20 20 20 20 20 20 20 20 70 4c 65 61 66 20 3d 20          pLeaf = 
2d280 66 74 73 35 44 61 74 61 52 65 61 64 28 70 2c 20  fts5DataRead(p, 
2d290 69 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20 69  iKey);.        i
2d2a0 66 28 20 70 4c 65 61 66 20 29 7b 0a 20 20 20 20  f( pLeaf ){.    
2d2b0 20 20 20 20 20 20 69 36 34 20 69 52 6f 77 69 64        i64 iRowid
2d2c0 3b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20  ;.          int 
2d2d0 69 52 6f 77 69 64 4f 66 66 20 3d 20 66 74 73 35  iRowidOff = fts5
2d2e0 4c 65 61 66 46 69 72 73 74 52 6f 77 69 64 4f 66  LeafFirstRowidOf
2d2f0 66 28 70 4c 65 61 66 29 3b 0a 20 20 20 20 20 20  f(pLeaf);.      
2d300 20 20 20 20 41 53 53 45 52 54 5f 53 5a 4c 45 41      ASSERT_SZLEA
2d310 46 5f 4f 4b 28 70 4c 65 61 66 29 3b 0a 20 20 20  F_OK(pLeaf);.   
2d320 20 20 20 20 20 20 20 69 66 28 20 69 52 6f 77 69         if( iRowi
2d330 64 4f 66 66 3e 3d 70 4c 65 61 66 2d 3e 73 7a 4c  dOff>=pLeaf->szL
2d340 65 61 66 20 29 7b 0a 20 20 20 20 20 20 20 20 20  eaf ){.         
2d350 20 20 20 70 2d 3e 72 63 20 3d 20 46 54 53 35 5f     p->rc = FTS5_
2d360 43 4f 52 52 55 50 54 3b 0a 20 20 20 20 20 20 20  CORRUPT;.       
2d370 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2d380 20 20 20 20 20 20 66 74 73 35 47 65 74 56 61 72        fts5GetVar
2d390 69 6e 74 28 26 70 4c 65 61 66 2d 3e 70 5b 69 52  int(&pLeaf->p[iR
2d3a0 6f 77 69 64 4f 66 66 5d 2c 20 28 75 36 34 2a 29  owidOff], (u64*)
2d3b0 26 69 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20  &iRowid);.      
2d3c0 20 20 20 20 20 20 69 66 28 20 69 52 6f 77 69 64        if( iRowid
2d3d0 21 3d 66 74 73 35 44 6c 69 64 78 49 74 65 72 52  !=fts5DlidxIterR
2d3e0 6f 77 69 64 28 70 44 6c 69 64 78 29 20 29 20 70  owid(pDlidx) ) p
2d3f0 2d 3e 72 63 20 3d 20 46 54 53 35 5f 43 4f 52 52  ->rc = FTS5_CORR
2d400 55 50 54 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  UPT;.          }
2d410 0a 20 20 20 20 20 20 20 20 20 20 66 74 73 35 44  .          fts5D
2d420 61 74 61 52 65 6c 65 61 73 65 28 70 4c 65 61 66  ataRelease(pLeaf
2d430 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
2d440 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 44 6c 69     }..      iDli
2d450 64 78 50 72 65 76 4c 65 61 66 20 3d 20 69 50 67  dxPrevLeaf = iPg
2d460 3b 0a 20 20 20 20 20 20 66 74 73 35 44 6c 69 64  ;.      fts5Dlid
2d470 78 49 74 65 72 46 72 65 65 28 70 44 6c 69 64 78  xIterFree(pDlidx
2d480 29 3b 0a 20 20 20 20 20 20 66 74 73 35 54 65 73  );.      fts5Tes
2d490 74 44 6c 69 64 78 52 65 76 65 72 73 65 28 70 2c  tDlidxReverse(p,
2d4a0 20 69 53 65 67 69 64 2c 20 69 49 64 78 4c 65 61   iSegid, iIdxLea
2d4b0 66 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  f);.    }else{. 
2d4c0 20 20 20 20 20 69 44 6c 69 64 78 50 72 65 76 4c       iDlidxPrevL
2d4d0 65 61 66 20 3d 20 70 53 65 67 2d 3e 70 67 6e 6f  eaf = pSeg->pgno
2d4e0 4c 61 73 74 3b 0a 20 20 20 20 20 20 2f 2a 20 54  Last;.      /* T
2d4f0 4f 44 4f 3a 20 43 68 65 63 6b 20 74 68 65 72 65  ODO: Check there
2d500 20 69 73 20 6e 6f 20 64 6f 63 6c 69 73 74 20 69   is no doclist i
2d510 6e 64 65 78 20 2a 2f 0a 20 20 20 20 7d 0a 0a 20  ndex */.    }.. 
2d520 20 20 20 69 49 64 78 50 72 65 76 4c 65 61 66 20     iIdxPrevLeaf 
2d530 3d 20 69 49 64 78 4c 65 61 66 3b 0a 20 20 7d 0a  = iIdxLeaf;.  }.
2d540 0a 20 20 72 63 32 20 3d 20 73 71 6c 69 74 65 33  .  rc2 = sqlite3
2d550 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29  _finalize(pStmt)
2d560 3b 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53  ;.  if( p->rc==S
2d570 51 4c 49 54 45 5f 4f 4b 20 29 20 70 2d 3e 72 63  QLITE_OK ) p->rc
2d580 20 3d 20 72 63 32 3b 0a 0a 20 20 2f 2a 20 50 61   = rc2;..  /* Pa
2d590 67 65 20 69 74 65 72 2e 69 4c 65 61 66 20 6d 75  ge iter.iLeaf mu
2d5a0 73 74 20 6e 6f 77 20 62 65 20 74 68 65 20 72 69  st now be the ri
2d5b0 67 68 74 6d 6f 73 74 20 6c 65 61 66 2d 70 61 67  ghtmost leaf-pag
2d5c0 65 20 69 6e 20 74 68 65 20 73 65 67 6d 65 6e 74  e in the segment
2d5d0 20 2a 2f 0a 23 69 66 20 30 0a 20 20 69 66 28 20   */.#if 0.  if( 
2d5e0 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
2d5f0 20 26 26 20 69 74 65 72 2e 69 4c 65 61 66 21 3d   && iter.iLeaf!=
2d600 70 53 65 67 2d 3e 70 67 6e 6f 4c 61 73 74 20 29  pSeg->pgnoLast )
2d610 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 46 54  {.    p->rc = FT
2d620 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20 7d 0a  S5_CORRUPT;.  }.
2d630 23 65 6e 64 69 66 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  #endif.}.../*.**
2d640 20 52 75 6e 20 69 6e 74 65 72 6e 61 6c 20 63 68   Run internal ch
2d650 65 63 6b 73 20 74 6f 20 65 6e 73 75 72 65 20 74  ecks to ensure t
2d660 68 61 74 20 74 68 65 20 46 54 53 20 69 6e 64 65  hat the FTS inde
2d670 78 20 28 61 29 20 69 73 20 69 6e 74 65 72 6e 61  x (a) is interna
2d680 6c 6c 79 20 0a 2a 2a 20 63 6f 6e 73 69 73 74 65  lly .** consiste
2d690 6e 74 20 61 6e 64 20 28 62 29 20 63 6f 6e 74 61  nt and (b) conta
2d6a0 69 6e 73 20 65 6e 74 72 69 65 73 20 66 6f 72 20  ins entries for 
2d6b0 77 68 69 63 68 20 74 68 65 20 58 4f 52 20 6f 66  which the XOR of
2d6c0 20 74 68 65 20 63 68 65 63 6b 73 75 6d 73 0a 2a   the checksums.*
2d6d0 2a 20 61 73 20 63 61 6c 63 75 6c 61 74 65 64 20  * as calculated 
2d6e0 62 79 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e  by sqlite3Fts5In
2d6f0 64 65 78 45 6e 74 72 79 43 6b 73 75 6d 28 29 20  dexEntryCksum() 
2d700 69 73 20 63 6b 73 75 6d 2e 0a 2a 2a 0a 2a 2a 20  is cksum..**.** 
2d710 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  Return SQLITE_CO
2d720 52 52 55 50 54 20 69 66 20 61 6e 79 20 6f 66 20  RRUPT if any of 
2d730 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 63 68 65  the internal che
2d740 63 6b 73 20 66 61 69 6c 2c 20 6f 72 20 69 66 20  cks fail, or if 
2d750 74 68 65 0a 2a 2a 20 63 68 65 63 6b 73 75 6d 20  the.** checksum 
2d760 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68 2e 20  does not match. 
2d770 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
2d780 20 69 66 20 61 6c 6c 20 63 68 65 63 6b 73 20 70   if all checks p
2d790 61 73 73 20 77 69 74 68 6f 75 74 0a 2a 2a 20 65  ass without.** e
2d7a0 72 72 6f 72 2c 20 6f 72 20 73 6f 6d 65 20 6f 74  rror, or some ot
2d7b0 68 65 72 20 53 51 4c 69 74 65 20 65 72 72 6f 72  her SQLite error
2d7c0 20 63 6f 64 65 20 69 66 20 61 6e 6f 74 68 65 72   code if another
2d7d0 20 65 72 72 6f 72 20 28 65 2e 67 2e 20 4f 4f 4d   error (e.g. OOM
2d7e0 29 0a 2a 2a 20 6f 63 63 75 72 73 2e 0a 2a 2f 0a  ).** occurs..*/.
2d7f0 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 49  int sqlite3Fts5I
2d800 6e 64 65 78 49 6e 74 65 67 72 69 74 79 43 68 65  ndexIntegrityChe
2d810 63 6b 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c  ck(Fts5Index *p,
2d820 20 75 36 34 20 63 6b 73 75 6d 29 7b 0a 20 20 69   u64 cksum){.  i
2d830 6e 74 20 65 44 65 74 61 69 6c 20 3d 20 70 2d 3e  nt eDetail = p->
2d840 70 43 6f 6e 66 69 67 2d 3e 65 44 65 74 61 69 6c  pConfig->eDetail
2d850 3b 0a 20 20 75 36 34 20 63 6b 73 75 6d 32 20 3d  ;.  u64 cksum2 =
2d860 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
2d870 20 20 20 20 2f 2a 20 43 68 65 63 6b 73 75 6d 20      /* Checksum 
2d880 62 61 73 65 64 20 6f 6e 20 63 6f 6e 74 65 6e 74  based on content
2d890 73 20 6f 66 20 69 6e 64 65 78 65 73 20 2a 2f 0a  s of indexes */.
2d8a0 20 20 46 74 73 35 42 75 66 66 65 72 20 70 6f 73    Fts5Buffer pos
2d8b0 6c 69 73 74 20 3d 20 7b 30 2c 30 2c 30 7d 3b 20  list = {0,0,0}; 
2d8c0 20 20 2f 2a 20 42 75 66 66 65 72 20 75 73 65 64    /* Buffer used
2d8d0 20 74 6f 20 68 6f 6c 64 20 61 20 70 6f 73 6c 69   to hold a posli
2d8e0 73 74 20 2a 2f 0a 20 20 46 74 73 35 49 74 65 72  st */.  Fts5Iter
2d8f0 20 2a 70 49 74 65 72 3b 20 20 20 20 20 20 20 20   *pIter;        
2d900 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20          /* Used 
2d910 74 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f 75  to iterate throu
2d920 67 68 20 65 6e 74 69 72 65 20 69 6e 64 65 78 20  gh entire index 
2d930 2a 2f 0a 20 20 46 74 73 35 53 74 72 75 63 74 75  */.  Fts5Structu
2d940 72 65 20 2a 70 53 74 72 75 63 74 3b 20 20 20 20  re *pStruct;    
2d950 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 73 74       /* Index st
2d960 72 75 63 74 75 72 65 20 2a 2f 0a 0a 23 69 66 64  ructure */..#ifd
2d970 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
2d980 20 20 2f 2a 20 55 73 65 64 20 62 79 20 65 78 74    /* Used by ext
2d990 72 61 20 69 6e 74 65 72 6e 61 6c 20 74 65 73 74  ra internal test
2d9a0 73 20 6f 6e 6c 79 20 72 75 6e 20 69 66 20 4e 44  s only run if ND
2d9b0 45 42 55 47 20 69 73 20 6e 6f 74 20 64 65 66 69  EBUG is not defi
2d9c0 6e 65 64 20 2a 2f 0a 20 20 75 36 34 20 63 6b 73  ned */.  u64 cks
2d9d0 75 6d 33 20 3d 20 30 3b 20 20 20 20 20 20 20 20  um3 = 0;        
2d9e0 20 20 20 20 20 20 20 20 20 2f 2a 20 43 68 65 63           /* Chec
2d9f0 6b 73 75 6d 20 62 61 73 65 64 20 6f 6e 20 63 6f  ksum based on co
2da00 6e 74 65 6e 74 73 20 6f 66 20 69 6e 64 65 78 65  ntents of indexe
2da10 73 20 2a 2f 0a 20 20 46 74 73 35 42 75 66 66 65  s */.  Fts5Buffe
2da20 72 20 74 65 72 6d 20 3d 20 7b 30 2c 30 2c 30 7d  r term = {0,0,0}
2da30 3b 20 20 20 20 20 20 2f 2a 20 42 75 66 66 65 72  ;      /* Buffer
2da40 20 75 73 65 64 20 74 6f 20 68 6f 6c 64 20 6d 6f   used to hold mo
2da50 73 74 20 72 65 63 65 6e 74 20 74 65 72 6d 20 2a  st recent term *
2da60 2f 0a 23 65 6e 64 69 66 0a 20 20 63 6f 6e 73 74  /.#endif.  const
2da70 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 46 54 53   int flags = FTS
2da80 35 49 4e 44 45 58 5f 51 55 45 52 59 5f 4e 4f 4f  5INDEX_QUERY_NOO
2da90 55 54 50 55 54 3b 0a 20 20 0a 20 20 2f 2a 20 4c  UTPUT;.  .  /* L
2daa0 6f 61 64 20 74 68 65 20 46 54 53 20 69 6e 64 65  oad the FTS inde
2dab0 78 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20  x structure */. 
2dac0 20 70 53 74 72 75 63 74 20 3d 20 66 74 73 35 53   pStruct = fts5S
2dad0 74 72 75 63 74 75 72 65 52 65 61 64 28 70 29 3b  tructureRead(p);
2dae0 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61  ..  /* Check tha
2daf0 74 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 6e  t the internal n
2db00 6f 64 65 73 20 6f 66 20 65 61 63 68 20 73 65 67  odes of each seg
2db10 6d 65 6e 74 20 6d 61 74 63 68 20 74 68 65 20 6c  ment match the l
2db20 65 61 76 65 73 20 2a 2f 0a 20 20 69 66 28 20 70  eaves */.  if( p
2db30 53 74 72 75 63 74 20 29 7b 0a 20 20 20 20 69 6e  Struct ){.    in
2db40 74 20 69 4c 76 6c 2c 20 69 53 65 67 3b 0a 20 20  t iLvl, iSeg;.  
2db50 20 20 66 6f 72 28 69 4c 76 6c 3d 30 3b 20 69 4c    for(iLvl=0; iL
2db60 76 6c 3c 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76  vl<pStruct->nLev
2db70 65 6c 3b 20 69 4c 76 6c 2b 2b 29 7b 0a 20 20 20  el; iLvl++){.   
2db80 20 20 20 66 6f 72 28 69 53 65 67 3d 30 3b 20 69     for(iSeg=0; i
2db90 53 65 67 3c 70 53 74 72 75 63 74 2d 3e 61 4c 65  Seg<pStruct->aLe
2dba0 76 65 6c 5b 69 4c 76 6c 5d 2e 6e 53 65 67 3b 20  vel[iLvl].nSeg; 
2dbb0 69 53 65 67 2b 2b 29 7b 0a 20 20 20 20 20 20 20  iSeg++){.       
2dbc0 20 46 74 73 35 53 74 72 75 63 74 75 72 65 53 65   Fts5StructureSe
2dbd0 67 6d 65 6e 74 20 2a 70 53 65 67 20 3d 20 26 70  gment *pSeg = &p
2dbe0 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69  Struct->aLevel[i
2dbf0 4c 76 6c 5d 2e 61 53 65 67 5b 69 53 65 67 5d 3b  Lvl].aSeg[iSeg];
2dc00 0a 20 20 20 20 20 20 20 20 66 74 73 35 49 6e 64  .        fts5Ind
2dc10 65 78 49 6e 74 65 67 72 69 74 79 43 68 65 63 6b  exIntegrityCheck
2dc20 53 65 67 6d 65 6e 74 28 70 2c 20 70 53 65 67 29  Segment(p, pSeg)
2dc30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
2dc40 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 63 6b    }..  /* The ck
2dc50 73 75 6d 20 61 72 67 75 6d 65 6e 74 20 70 61 73  sum argument pas
2dc60 73 65 64 20 74 6f 20 74 68 69 73 20 66 75 6e 63  sed to this func
2dc70 74 69 6f 6e 20 69 73 20 61 20 63 68 65 63 6b 73  tion is a checks
2dc80 75 6d 20 63 61 6c 63 75 6c 61 74 65 64 0a 20 20  um calculated.  
2dc90 2a 2a 20 62 61 73 65 64 20 6f 6e 20 61 6c 6c 20  ** based on all 
2dca0 65 78 70 65 63 74 65 64 20 65 6e 74 72 69 65 73  expected entries
2dcb0 20 69 6e 20 74 68 65 20 46 54 53 20 69 6e 64 65   in the FTS inde
2dcc0 78 20 28 69 6e 63 6c 75 64 69 6e 67 20 70 72 65  x (including pre
2dcd0 66 69 78 20 69 6e 64 65 78 0a 20 20 2a 2a 20 65  fix index.  ** e
2dce0 6e 74 72 69 65 73 29 2e 20 54 68 69 73 20 62 6c  ntries). This bl
2dcf0 6f 63 6b 20 63 68 65 63 6b 73 20 74 68 61 74 20  ock checks that 
2dd00 61 20 63 68 65 63 6b 73 75 6d 20 63 61 6c 63 75  a checksum calcu
2dd10 6c 61 74 65 64 20 62 61 73 65 64 20 6f 6e 20 74  lated based on t
2dd20 68 65 0a 20 20 2a 2a 20 61 63 74 75 61 6c 20 63  he.  ** actual c
2dd30 6f 6e 74 65 6e 74 73 20 6f 66 20 46 54 53 20 69  ontents of FTS i
2dd40 6e 64 65 78 20 69 73 20 69 64 65 6e 74 69 63 61  ndex is identica
2dd50 6c 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 77 6f  l..  **.  ** Two
2dd60 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 74 68 65   versions of the
2dd70 20 73 61 6d 65 20 63 68 65 63 6b 73 75 6d 20 61   same checksum a
2dd80 72 65 20 63 61 6c 63 75 6c 61 74 65 64 2e 20 54  re calculated. T
2dd90 68 65 20 66 69 72 73 74 20 28 73 74 61 63 6b 0a  he first (stack.
2dda0 20 20 2a 2a 20 76 61 72 69 61 62 6c 65 20 63 6b    ** variable ck
2ddb0 73 75 6d 32 29 20 62 61 73 65 64 20 6f 6e 20 65  sum2) based on e
2ddc0 6e 74 72 69 65 73 20 65 78 74 72 61 63 74 65 64  ntries extracted
2ddd0 20 66 72 6f 6d 20 74 68 65 20 66 75 6c 6c 2d 74   from the full-t
2dde0 65 78 74 20 69 6e 64 65 78 0a 20 20 2a 2a 20 77  ext index.  ** w
2ddf0 68 69 6c 65 20 64 6f 69 6e 67 20 61 20 6c 69 6e  hile doing a lin
2de00 65 61 72 20 73 63 61 6e 20 6f 66 20 65 61 63 68  ear scan of each
2de10 20 69 6e 64 69 76 69 64 75 61 6c 20 69 6e 64 65   individual inde
2de20 78 20 69 6e 20 74 75 72 6e 2e 20 0a 20 20 2a 2a  x in turn. .  **
2de30 0a 20 20 2a 2a 20 41 73 20 65 61 63 68 20 74 65  .  ** As each te
2de40 72 6d 20 76 69 73 69 74 65 64 20 62 79 20 74 68  rm visited by th
2de50 65 20 6c 69 6e 65 61 72 20 73 63 61 6e 73 2c 20  e linear scans, 
2de60 61 20 73 65 70 61 72 61 74 65 20 71 75 65 72 79  a separate query
2de70 20 66 6f 72 20 74 68 65 0a 20 20 2a 2a 20 73 61   for the.  ** sa
2de80 6d 65 20 74 65 72 6d 20 69 73 20 70 65 72 66 6f  me term is perfo
2de90 72 6d 65 64 2e 20 63 6b 73 75 6d 33 20 69 73 20  rmed. cksum3 is 
2dea0 63 61 6c 63 75 6c 61 74 65 64 20 62 61 73 65 64  calculated based
2deb0 20 6f 6e 20 74 68 65 20 65 6e 74 72 69 65 73 0a   on the entries.
2dec0 20 20 2a 2a 20 65 78 74 72 61 63 74 65 64 20 62    ** extracted b
2ded0 79 20 74 68 65 73 65 20 71 75 65 72 69 65 73 2e  y these queries.
2dee0 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 66 74 73 35  .  */.  for(fts5
2def0 4d 75 6c 74 69 49 74 65 72 4e 65 77 28 70 2c 20  MultiIterNew(p, 
2df00 70 53 74 72 75 63 74 2c 20 66 6c 61 67 73 2c 20  pStruct, flags, 
2df10 30 2c 20 30 2c 20 30 2c 20 2d 31 2c 20 30 2c 20  0, 0, 0, -1, 0, 
2df20 26 70 49 74 65 72 29 3b 0a 20 20 20 20 20 20 66  &pIter);.      f
2df30 74 73 35 4d 75 6c 74 69 49 74 65 72 45 6f 66 28  ts5MultiIterEof(
2df40 70 2c 20 70 49 74 65 72 29 3d 3d 30 3b 0a 20 20  p, pIter)==0;.  
2df50 20 20 20 20 66 74 73 35 4d 75 6c 74 69 49 74 65      fts5MultiIte
2df60 72 4e 65 78 74 28 70 2c 20 70 49 74 65 72 2c 20  rNext(p, pIter, 
2df70 30 2c 20 30 29 0a 20 20 29 7b 0a 20 20 20 20 69  0, 0).  ){.    i
2df80 6e 74 20 6e 3b 20 20 20 20 20 20 20 20 20 20 20  nt n;           
2df90 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
2dfa0 7a 65 20 6f 66 20 74 65 72 6d 20 69 6e 20 62 79  ze of term in by
2dfb0 74 65 73 20 2a 2f 0a 20 20 20 20 69 36 34 20 69  tes */.    i64 i
2dfc0 50 6f 73 20 3d 20 30 3b 20 20 20 20 20 20 20 20  Pos = 0;        
2dfd0 20 20 20 20 20 20 20 2f 2a 20 50 6f 73 69 74 69         /* Positi
2dfe0 6f 6e 20 72 65 61 64 20 66 72 6f 6d 20 70 6f 73  on read from pos
2dff0 6c 69 73 74 20 2a 2f 0a 20 20 20 20 69 6e 74 20  list */.    int 
2e000 69 4f 66 66 20 3d 20 30 3b 20 20 20 20 20 20 20  iOff = 0;       
2e010 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65          /* Offse
2e020 74 20 77 69 74 68 69 6e 20 70 6f 73 6c 69 73 74  t within poslist
2e030 20 2a 2f 0a 20 20 20 20 69 36 34 20 69 52 6f 77   */.    i64 iRow
2e040 69 64 20 3d 20 66 74 73 35 4d 75 6c 74 69 49 74  id = fts5MultiIt
2e050 65 72 52 6f 77 69 64 28 70 49 74 65 72 29 3b 0a  erRowid(pIter);.
2e060 20 20 20 20 63 68 61 72 20 2a 7a 20 3d 20 28 63      char *z = (c
2e070 68 61 72 2a 29 66 74 73 35 4d 75 6c 74 69 49 74  har*)fts5MultiIt
2e080 65 72 54 65 72 6d 28 70 49 74 65 72 2c 20 26 6e  erTerm(pIter, &n
2e090 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  );..    /* If th
2e0a0 69 73 20 69 73 20 61 20 6e 65 77 20 74 65 72 6d  is is a new term
2e0b0 2c 20 71 75 65 72 79 20 66 6f 72 20 69 74 2e 20  , query for it. 
2e0c0 55 70 64 61 74 65 20 63 6b 73 75 6d 33 20 77 69  Update cksum3 wi
2e0d0 74 68 20 74 68 65 20 72 65 73 75 6c 74 73 2e 20  th the results. 
2e0e0 2a 2f 0a 20 20 20 20 66 74 73 35 54 65 73 74 54  */.    fts5TestT
2e0f0 65 72 6d 28 70 2c 20 26 74 65 72 6d 2c 20 7a 2c  erm(p, &term, z,
2e100 20 6e 2c 20 63 6b 73 75 6d 32 2c 20 26 63 6b 73   n, cksum2, &cks
2e110 75 6d 33 29 3b 0a 0a 20 20 20 20 69 66 28 20 65  um3);..    if( e
2e120 44 65 74 61 69 6c 3d 3d 46 54 53 35 5f 44 45 54  Detail==FTS5_DET
2e130 41 49 4c 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20  AIL_NONE ){.    
2e140 20 20 69 66 28 20 30 3d 3d 66 74 73 35 4d 75 6c    if( 0==fts5Mul
2e150 74 69 49 74 65 72 49 73 45 6d 70 74 79 28 70 2c  tiIterIsEmpty(p,
2e160 20 70 49 74 65 72 29 20 29 7b 0a 20 20 20 20 20   pIter) ){.     
2e170 20 20 20 63 6b 73 75 6d 32 20 5e 3d 20 73 71 6c     cksum2 ^= sql
2e180 69 74 65 33 46 74 73 35 49 6e 64 65 78 45 6e 74  ite3Fts5IndexEnt
2e190 72 79 43 6b 73 75 6d 28 69 52 6f 77 69 64 2c 20  ryCksum(iRowid, 
2e1a0 30 2c 20 30 2c 20 2d 31 2c 20 7a 2c 20 6e 29 3b  0, 0, -1, z, n);
2e1b0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
2e1c0 73 65 7b 0a 20 20 20 20 20 20 70 6f 73 6c 69 73  se{.      poslis
2e1d0 74 2e 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 66  t.n = 0;.      f
2e1e0 74 73 35 53 65 67 69 74 65 72 50 6f 73 6c 69 73  ts5SegiterPoslis
2e1f0 74 28 70 2c 20 26 70 49 74 65 72 2d 3e 61 53 65  t(p, &pIter->aSe
2e200 67 5b 70 49 74 65 72 2d 3e 61 46 69 72 73 74 5b  g[pIter->aFirst[
2e210 31 5d 2e 69 46 69 72 73 74 5d 2c 20 30 2c 20 26  1].iFirst], 0, &
2e220 70 6f 73 6c 69 73 74 29 3b 0a 20 20 20 20 20 20  poslist);.      
2e230 77 68 69 6c 65 28 20 30 3d 3d 73 71 6c 69 74 65  while( 0==sqlite
2e240 33 46 74 73 35 50 6f 73 6c 69 73 74 4e 65 78 74  3Fts5PoslistNext
2e250 36 34 28 70 6f 73 6c 69 73 74 2e 70 2c 20 70 6f  64(poslist.p, po
2e260 73 6c 69 73 74 2e 6e 2c 20 26 69 4f 66 66 2c 20  slist.n, &iOff, 
2e270 26 69 50 6f 73 29 20 29 7b 0a 20 20 20 20 20 20  &iPos) ){.      
2e280 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 46 54 53    int iCol = FTS
2e290 35 5f 50 4f 53 32 43 4f 4c 55 4d 4e 28 69 50 6f  5_POS2COLUMN(iPo
2e2a0 73 29 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  s);.        int 
2e2b0 69 54 6f 6b 4f 66 66 20 3d 20 46 54 53 35 5f 50  iTokOff = FTS5_P
2e2c0 4f 53 32 4f 46 46 53 45 54 28 69 50 6f 73 29 3b  OS2OFFSET(iPos);
2e2d0 0a 20 20 20 20 20 20 20 20 63 6b 73 75 6d 32 20  .        cksum2 
2e2e0 5e 3d 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e  ^= sqlite3Fts5In
2e2f0 64 65 78 45 6e 74 72 79 43 6b 73 75 6d 28 69 52  dexEntryCksum(iR
2e300 6f 77 69 64 2c 20 69 43 6f 6c 2c 20 69 54 6f 6b  owid, iCol, iTok
2e310 4f 66 66 2c 20 2d 31 2c 20 7a 2c 20 6e 29 3b 0a  Off, -1, z, n);.
2e320 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
2e330 7d 0a 20 20 66 74 73 35 54 65 73 74 54 65 72 6d  }.  fts5TestTerm
2e340 28 70 2c 20 26 74 65 72 6d 2c 20 30 2c 20 30 2c  (p, &term, 0, 0,
2e350 20 63 6b 73 75 6d 32 2c 20 26 63 6b 73 75 6d 33   cksum2, &cksum3
2e360 29 3b 0a 0a 20 20 66 74 73 35 4d 75 6c 74 69 49  );..  fts5MultiI
2e370 74 65 72 46 72 65 65 28 70 49 74 65 72 29 3b 0a  terFree(pIter);.
2e380 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c    if( p->rc==SQL
2e390 49 54 45 5f 4f 4b 20 26 26 20 63 6b 73 75 6d 21  ITE_OK && cksum!
2e3a0 3d 63 6b 73 75 6d 32 20 29 20 70 2d 3e 72 63 20  =cksum2 ) p->rc 
2e3b0 3d 20 46 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a  = FTS5_CORRUPT;.
2e3c0 0a 20 20 66 74 73 35 53 74 72 75 63 74 75 72 65  .  fts5Structure
2e3d0 52 65 6c 65 61 73 65 28 70 53 74 72 75 63 74 29  Release(pStruct)
2e3e0 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
2e3f0 44 45 42 55 47 0a 20 20 66 74 73 35 42 75 66 66  DEBUG.  fts5Buff
2e400 65 72 46 72 65 65 28 26 74 65 72 6d 29 3b 0a 23  erFree(&term);.#
2e410 65 6e 64 69 66 0a 20 20 66 74 73 35 42 75 66 66  endif.  fts5Buff
2e420 65 72 46 72 65 65 28 26 70 6f 73 6c 69 73 74 29  erFree(&poslist)
2e430 3b 0a 20 20 72 65 74 75 72 6e 20 66 74 73 35 49  ;.  return fts5I
2e440 6e 64 65 78 52 65 74 75 72 6e 28 70 29 3b 0a 7d  ndexReturn(p);.}
2e450 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ../*************
2e460 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2e470 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2e480 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2e490 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a  ************.***
2e4a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2e4b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2e4c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2e4d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2e4e0 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 42 65 6c 6f 77  *******.** Below
2e4f0 20 74 68 69 73 20 70 6f 69 6e 74 20 69 73 20 74   this point is t
2e500 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  he implementatio
2e510 6e 20 6f 66 20 74 68 65 20 66 74 73 35 5f 64 65  n of the fts5_de
2e520 63 6f 64 65 28 29 20 73 63 61 6c 61 72 0a 2a 2a  code() scalar.**
2e530 20 66 75 6e 63 74 69 6f 6e 20 6f 6e 6c 79 2e 0a   function only..
2e540 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 6f 64 65  */../*.** Decode
2e550 20 61 20 73 65 67 6d 65 6e 74 2d 64 61 74 61 20   a segment-data 
2e560 72 6f 77 69 64 20 66 72 6f 6d 20 74 68 65 20 25  rowid from the %
2e570 5f 64 61 74 61 20 74 61 62 6c 65 2e 20 54 68 69  _data table. Thi
2e580 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 0a 2a 2a  s function is.**
2e590 20 74 68 65 20 6f 70 70 6f 73 69 74 65 20 6f 66   the opposite of
2e5a0 20 6d 61 63 72 6f 20 46 54 53 35 5f 53 45 47 4d   macro FTS5_SEGM
2e5b0 45 4e 54 5f 52 4f 57 49 44 28 29 2e 0a 2a 2f 0a  ENT_ROWID()..*/.
2e5c0 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
2e5d0 44 65 63 6f 64 65 52 6f 77 69 64 28 0a 20 20 69  DecodeRowid(.  i
2e5e0 36 34 20 69 52 6f 77 69 64 2c 20 20 20 20 20 20  64 iRowid,      
2e5f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2e600 2a 20 52 6f 77 69 64 20 66 72 6f 6d 20 25 5f 64  * Rowid from %_d
2e610 61 74 61 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69  ata table */.  i
2e620 6e 74 20 2a 70 69 53 65 67 69 64 2c 20 20 20 20  nt *piSegid,    
2e630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2e640 2a 20 4f 55 54 3a 20 53 65 67 6d 65 6e 74 20 69  * OUT: Segment i
2e650 64 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 62 44 6c  d */.  int *pbDl
2e660 69 64 78 2c 20 20 20 20 20 20 20 20 20 20 20 20  idx,            
2e670 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 44         /* OUT: D
2e680 6c 69 64 78 20 66 6c 61 67 20 2a 2f 0a 20 20 69  lidx flag */.  i
2e690 6e 74 20 2a 70 69 48 65 69 67 68 74 2c 20 20 20  nt *piHeight,   
2e6a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2e6b0 2a 20 4f 55 54 3a 20 48 65 69 67 68 74 20 2a 2f  * OUT: Height */
2e6c0 0a 20 20 69 6e 74 20 2a 70 69 50 67 6e 6f 20 20  .  int *piPgno  
2e6d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e6e0 20 20 20 2f 2a 20 4f 55 54 3a 20 50 61 67 65 20     /* OUT: Page 
2e6f0 6e 75 6d 62 65 72 20 2a 2f 0a 29 7b 0a 20 20 2a  number */.){.  *
2e700 70 69 50 67 6e 6f 20 3d 20 28 69 6e 74 29 28 69  piPgno = (int)(i
2e710 52 6f 77 69 64 20 26 20 28 28 28 69 36 34 29 31  Rowid & (((i64)1
2e720 20 3c 3c 20 46 54 53 35 5f 44 41 54 41 5f 50 41   << FTS5_DATA_PA
2e730 47 45 5f 42 29 20 2d 20 31 29 29 3b 0a 20 20 69  GE_B) - 1));.  i
2e740 52 6f 77 69 64 20 3e 3e 3d 20 46 54 53 35 5f 44  Rowid >>= FTS5_D
2e750 41 54 41 5f 50 41 47 45 5f 42 3b 0a 0a 20 20 2a  ATA_PAGE_B;..  *
2e760 70 69 48 65 69 67 68 74 20 3d 20 28 69 6e 74 29  piHeight = (int)
2e770 28 69 52 6f 77 69 64 20 26 20 28 28 28 69 36 34  (iRowid & (((i64
2e780 29 31 20 3c 3c 20 46 54 53 35 5f 44 41 54 41 5f  )1 << FTS5_DATA_
2e790 48 45 49 47 48 54 5f 42 29 20 2d 20 31 29 29 3b  HEIGHT_B) - 1));
2e7a0 0a 20 20 69 52 6f 77 69 64 20 3e 3e 3d 20 46 54  .  iRowid >>= FT
2e7b0 53 35 5f 44 41 54 41 5f 48 45 49 47 48 54 5f 42  S5_DATA_HEIGHT_B
2e7c0 3b 0a 0a 20 20 2a 70 62 44 6c 69 64 78 20 3d 20  ;..  *pbDlidx = 
2e7d0 28 69 6e 74 29 28 69 52 6f 77 69 64 20 26 20 30  (int)(iRowid & 0
2e7e0 78 30 30 30 31 29 3b 0a 20 20 69 52 6f 77 69 64  x0001);.  iRowid
2e7f0 20 3e 3e 3d 20 46 54 53 35 5f 44 41 54 41 5f 44   >>= FTS5_DATA_D
2e800 4c 49 5f 42 3b 0a 0a 20 20 2a 70 69 53 65 67 69  LI_B;..  *piSegi
2e810 64 20 3d 20 28 69 6e 74 29 28 69 52 6f 77 69 64  d = (int)(iRowid
2e820 20 26 20 28 28 28 69 36 34 29 31 20 3c 3c 20 46   & (((i64)1 << F
2e830 54 53 35 5f 44 41 54 41 5f 49 44 5f 42 29 20 2d  TS5_DATA_ID_B) -
2e840 20 31 29 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20   1));.}..static 
2e850 76 6f 69 64 20 66 74 73 35 44 65 62 75 67 52 6f  void fts5DebugRo
2e860 77 69 64 28 69 6e 74 20 2a 70 52 63 2c 20 46 74  wid(int *pRc, Ft
2e870 73 35 42 75 66 66 65 72 20 2a 70 42 75 66 2c 20  s5Buffer *pBuf, 
2e880 69 36 34 20 69 4b 65 79 29 7b 0a 20 20 69 6e 74  i64 iKey){.  int
2e890 20 69 53 65 67 69 64 2c 20 69 48 65 69 67 68 74   iSegid, iHeight
2e8a0 2c 20 69 50 67 6e 6f 2c 20 62 44 6c 69 64 78 3b  , iPgno, bDlidx;
2e8b0 20 20 20 20 20 20 20 2f 2a 20 52 6f 77 69 64 20         /* Rowid 
2e8c0 63 6f 6d 70 65 6e 65 6e 74 73 20 2a 2f 0a 20 20  compenents */.  
2e8d0 66 74 73 35 44 65 63 6f 64 65 52 6f 77 69 64 28  fts5DecodeRowid(
2e8e0 69 4b 65 79 2c 20 26 69 53 65 67 69 64 2c 20 26  iKey, &iSegid, &
2e8f0 62 44 6c 69 64 78 2c 20 26 69 48 65 69 67 68 74  bDlidx, &iHeight
2e900 2c 20 26 69 50 67 6e 6f 29 3b 0a 0a 20 20 69 66  , &iPgno);..  if
2e910 28 20 69 53 65 67 69 64 3d 3d 30 20 29 7b 0a 20  ( iSegid==0 ){. 
2e920 20 20 20 69 66 28 20 69 4b 65 79 3d 3d 46 54 53     if( iKey==FTS
2e930 35 5f 41 56 45 52 41 47 45 53 5f 52 4f 57 49 44  5_AVERAGES_ROWID
2e940 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
2e950 33 46 74 73 35 42 75 66 66 65 72 41 70 70 65 6e  3Fts5BufferAppen
2e960 64 50 72 69 6e 74 66 28 70 52 63 2c 20 70 42 75  dPrintf(pRc, pBu
2e970 66 2c 20 22 7b 61 76 65 72 61 67 65 73 7d 20 22  f, "{averages} "
2e980 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
2e990 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 42      sqlite3Fts5B
2e9a0 75 66 66 65 72 41 70 70 65 6e 64 50 72 69 6e 74  ufferAppendPrint
2e9b0 66 28 70 52 63 2c 20 70 42 75 66 2c 20 22 7b 73  f(pRc, pBuf, "{s
2e9c0 74 72 75 63 74 75 72 65 7d 22 29 3b 0a 20 20 20  tructure}");.   
2e9d0 20 7d 0a 20 20 7d 0a 20 20 65 6c 73 65 7b 0a 20   }.  }.  else{. 
2e9e0 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 42 75     sqlite3Fts5Bu
2e9f0 66 66 65 72 41 70 70 65 6e 64 50 72 69 6e 74 66  fferAppendPrintf
2ea00 28 70 52 63 2c 20 70 42 75 66 2c 20 22 7b 25 73  (pRc, pBuf, "{%s
2ea10 73 65 67 69 64 3d 25 64 20 68 3d 25 64 20 70 67  segid=%d h=%d pg
2ea20 6e 6f 3d 25 64 7d 22 2c 0a 20 20 20 20 20 20 20  no=%d}",.       
2ea30 20 62 44 6c 69 64 78 20 3f 20 22 64 6c 69 64 78   bDlidx ? "dlidx
2ea40 20 22 20 3a 20 22 22 2c 20 69 53 65 67 69 64 2c   " : "", iSegid,
2ea50 20 69 48 65 69 67 68 74 2c 20 69 50 67 6e 6f 0a   iHeight, iPgno.
2ea60 20 20 20 20 29 3b 0a 20 20 7d 0a 7d 0a 0a 73 74      );.  }.}..st
2ea70 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 44 65  atic void fts5De
2ea80 62 75 67 53 74 72 75 63 74 75 72 65 28 0a 20 20  bugStructure(.  
2ea90 69 6e 74 20 2a 70 52 63 2c 20 20 20 20 20 20 20  int *pRc,       
2eaa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2eab0 2f 2a 20 49 4e 2f 4f 55 54 3a 20 65 72 72 6f 72  /* IN/OUT: error
2eac0 20 63 6f 64 65 20 2a 2f 0a 20 20 46 74 73 35 42   code */.  Fts5B
2ead0 75 66 66 65 72 20 2a 70 42 75 66 2c 0a 20 20 46  uffer *pBuf,.  F
2eae0 74 73 35 53 74 72 75 63 74 75 72 65 20 2a 70 0a  ts5Structure *p.
2eaf0 29 7b 0a 20 20 69 6e 74 20 69 4c 76 6c 2c 20 69  ){.  int iLvl, i
2eb00 53 65 67 3b 20 20 20 20 20 20 20 20 20 20 20 20  Seg;            
2eb10 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74 65 20       /* Iterate 
2eb20 74 68 72 6f 75 67 68 20 6c 65 76 65 6c 73 2c 20  through levels, 
2eb30 73 65 67 6d 65 6e 74 73 20 2a 2f 0a 0a 20 20 66  segments */..  f
2eb40 6f 72 28 69 4c 76 6c 3d 30 3b 20 69 4c 76 6c 3c  or(iLvl=0; iLvl<
2eb50 70 2d 3e 6e 4c 65 76 65 6c 3b 20 69 4c 76 6c 2b  p->nLevel; iLvl+
2eb60 2b 29 7b 0a 20 20 20 20 46 74 73 35 53 74 72 75  +){.    Fts5Stru
2eb70 63 74 75 72 65 4c 65 76 65 6c 20 2a 70 4c 76 6c  ctureLevel *pLvl
2eb80 20 3d 20 26 70 2d 3e 61 4c 65 76 65 6c 5b 69 4c   = &p->aLevel[iL
2eb90 76 6c 5d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  vl];.    sqlite3
2eba0 46 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64  Fts5BufferAppend
2ebb0 50 72 69 6e 74 66 28 70 52 63 2c 20 70 42 75 66  Printf(pRc, pBuf
2ebc0 2c 20 0a 20 20 20 20 20 20 20 20 22 20 7b 6c 76  , .        " {lv
2ebd0 6c 3d 25 64 20 6e 4d 65 72 67 65 3d 25 64 20 6e  l=%d nMerge=%d n
2ebe0 53 65 67 3d 25 64 22 2c 20 69 4c 76 6c 2c 20 70  Seg=%d", iLvl, p
2ebf0 4c 76 6c 2d 3e 6e 4d 65 72 67 65 2c 20 70 4c 76  Lvl->nMerge, pLv
2ec00 6c 2d 3e 6e 53 65 67 0a 20 20 20 20 29 3b 0a 20  l->nSeg.    );. 
2ec10 20 20 20 66 6f 72 28 69 53 65 67 3d 30 3b 20 69     for(iSeg=0; i
2ec20 53 65 67 3c 70 4c 76 6c 2d 3e 6e 53 65 67 3b 20  Seg<pLvl->nSeg; 
2ec30 69 53 65 67 2b 2b 29 7b 0a 20 20 20 20 20 20 46  iSeg++){.      F
2ec40 74 73 35 53 74 72 75 63 74 75 72 65 53 65 67 6d  ts5StructureSegm
2ec50 65 6e 74 20 2a 70 53 65 67 20 3d 20 26 70 4c 76  ent *pSeg = &pLv
2ec60 6c 2d 3e 61 53 65 67 5b 69 53 65 67 5d 3b 0a 20  l->aSeg[iSeg];. 
2ec70 20 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35       sqlite3Fts5
2ec80 42 75 66 66 65 72 41 70 70 65 6e 64 50 72 69 6e  BufferAppendPrin
2ec90 74 66 28 70 52 63 2c 20 70 42 75 66 2c 20 22 20  tf(pRc, pBuf, " 
2eca0 7b 69 64 3d 25 64 20 6c 65 61 76 65 73 3d 25 64  {id=%d leaves=%d
2ecb0 2e 2e 25 64 7d 22 2c 20 0a 20 20 20 20 20 20 20  ..%d}", .       
2ecc0 20 20 20 70 53 65 67 2d 3e 69 53 65 67 69 64 2c     pSeg->iSegid,
2ecd0 20 70 53 65 67 2d 3e 70 67 6e 6f 46 69 72 73 74   pSeg->pgnoFirst
2ece0 2c 20 70 53 65 67 2d 3e 70 67 6e 6f 4c 61 73 74  , pSeg->pgnoLast
2ecf0 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a  .      );.    }.
2ed00 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 42      sqlite3Fts5B
2ed10 75 66 66 65 72 41 70 70 65 6e 64 50 72 69 6e 74  ufferAppendPrint
2ed20 66 28 70 52 63 2c 20 70 42 75 66 2c 20 22 7d 22  f(pRc, pBuf, "}"
2ed30 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
2ed40 54 68 69 73 20 69 73 20 70 61 72 74 20 6f 66 20  This is part of 
2ed50 74 68 65 20 66 74 73 35 5f 64 65 63 6f 64 65 28  the fts5_decode(
2ed60 29 20 64 65 62 75 67 67 69 6e 67 20 61 69 64 2e  ) debugging aid.
2ed70 0a 2a 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 73  .**.** Arguments
2ed80 20 70 42 6c 6f 62 2f 6e 42 6c 6f 62 20 63 6f 6e   pBlob/nBlob con
2ed90 74 61 69 6e 20 61 20 73 65 72 69 61 6c 69 7a 65  tain a serialize
2eda0 64 20 46 74 73 35 53 74 72 75 63 74 75 72 65 20  d Fts5Structure 
2edb0 6f 62 6a 65 63 74 2e 20 54 68 69 73 0a 2a 2a 20  object. This.** 
2edc0 66 75 6e 63 74 69 6f 6e 20 61 70 70 65 6e 64 73  function appends
2edd0 20 61 20 68 75 6d 61 6e 2d 72 65 61 64 61 62 6c   a human-readabl
2ede0 65 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e  e representation
2edf0 20 6f 66 20 74 68 65 20 73 61 6d 65 20 6f 62 6a   of the same obj
2ee00 65 63 74 0a 2a 2a 20 74 6f 20 74 68 65 20 62 75  ect.** to the bu
2ee10 66 66 65 72 20 70 61 73 73 65 64 20 61 73 20 74  ffer passed as t
2ee20 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
2ee30 6e 74 2e 20 0a 2a 2f 0a 73 74 61 74 69 63 20 76  nt. .*/.static v
2ee40 6f 69 64 20 66 74 73 35 44 65 63 6f 64 65 53 74  oid fts5DecodeSt
2ee50 72 75 63 74 75 72 65 28 0a 20 20 69 6e 74 20 2a  ructure(.  int *
2ee60 70 52 63 2c 20 20 20 20 20 20 20 20 20 20 20 20  pRc,            
2ee70 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 4e             /* IN
2ee80 2f 4f 55 54 3a 20 65 72 72 6f 72 20 63 6f 64 65  /OUT: error code
2ee90 20 2a 2f 0a 20 20 46 74 73 35 42 75 66 66 65 72   */.  Fts5Buffer
2eea0 20 2a 70 42 75 66 2c 0a 20 20 63 6f 6e 73 74 20   *pBuf,.  const 
2eeb0 75 38 20 2a 70 42 6c 6f 62 2c 20 69 6e 74 20 6e  u8 *pBlob, int n
2eec0 42 6c 6f 62 0a 29 7b 0a 20 20 69 6e 74 20 72 63  Blob.){.  int rc
2eed0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2eee0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
2eef0 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 46 74  urn code */.  Ft
2ef00 73 35 53 74 72 75 63 74 75 72 65 20 2a 70 20 3d  s5Structure *p =
2ef10 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a   0;           /*
2ef20 20 44 65 63 6f 64 65 64 20 73 74 72 75 63 74 75   Decoded structu
2ef30 72 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 0a 20 20  re object */..  
2ef40 72 63 20 3d 20 66 74 73 35 53 74 72 75 63 74 75  rc = fts5Structu
2ef50 72 65 44 65 63 6f 64 65 28 70 42 6c 6f 62 2c 20  reDecode(pBlob, 
2ef60 6e 42 6c 6f 62 2c 20 30 2c 20 26 70 29 3b 0a 20  nBlob, 0, &p);. 
2ef70 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
2ef80 4f 4b 20 29 7b 0a 20 20 20 20 2a 70 52 63 20 3d  OK ){.    *pRc =
2ef90 20 72 63 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b   rc;.    return;
2efa0 0a 20 20 7d 0a 0a 20 20 66 74 73 35 44 65 62 75  .  }..  fts5Debu
2efb0 67 53 74 72 75 63 74 75 72 65 28 70 52 63 2c 20  gStructure(pRc, 
2efc0 70 42 75 66 2c 20 70 29 3b 0a 20 20 66 74 73 35  pBuf, p);.  fts5
2efd0 53 74 72 75 63 74 75 72 65 52 65 6c 65 61 73 65  StructureRelease
2efe0 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  (p);.}../*.** Th
2eff0 69 73 20 69 73 20 70 61 72 74 20 6f 66 20 74 68  is is part of th
2f000 65 20 66 74 73 35 5f 64 65 63 6f 64 65 28 29 20  e fts5_decode() 
2f010 64 65 62 75 67 67 69 6e 67 20 61 69 64 2e 0a 2a  debugging aid..*
2f020 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 73 20 70  *.** Arguments p
2f030 42 6c 6f 62 2f 6e 42 6c 6f 62 20 63 6f 6e 74 61  Blob/nBlob conta
2f040 69 6e 20 61 6e 20 22 61 76 65 72 61 67 65 73 22  in an "averages"
2f050 20 72 65 63 6f 72 64 2e 20 54 68 69 73 20 66 75   record. This fu
2f060 6e 63 74 69 6f 6e 20 0a 2a 2a 20 61 70 70 65 6e  nction .** appen
2f070 64 73 20 61 20 68 75 6d 61 6e 2d 72 65 61 64 61  ds a human-reada
2f080 62 6c 65 20 72 65 70 72 65 73 65 6e 74 61 74 69  ble representati
2f090 6f 6e 20 6f 66 20 72 65 63 6f 72 64 20 74 6f 20  on of record to 
2f0a0 74 68 65 20 62 75 66 66 65 72 20 70 61 73 73 65  the buffer passe
2f0b0 64 20 0a 2a 2a 20 61 73 20 74 68 65 20 73 65 63  d .** as the sec
2f0c0 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2e 20 0a 2a  ond argument. .*
2f0d0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  /.static void ft
2f0e0 73 35 44 65 63 6f 64 65 41 76 65 72 61 67 65 73  s5DecodeAverages
2f0f0 28 0a 20 20 69 6e 74 20 2a 70 52 63 2c 20 20 20  (.  int *pRc,   
2f100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f110 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 65      /* IN/OUT: e
2f120 72 72 6f 72 20 63 6f 64 65 20 2a 2f 0a 20 20 46  rror code */.  F
2f130 74 73 35 42 75 66 66 65 72 20 2a 70 42 75 66 2c  ts5Buffer *pBuf,
2f140 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 70 42 6c  .  const u8 *pBl
2f150 6f 62 2c 20 69 6e 74 20 6e 42 6c 6f 62 0a 29 7b  ob, int nBlob.){
2f160 0a 20 20 69 6e 74 20 69 20 3d 20 30 3b 0a 20 20  .  int i = 0;.  
2f170 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 70 61  const char *zSpa
2f180 63 65 20 3d 20 22 22 3b 0a 0a 20 20 77 68 69 6c  ce = "";..  whil
2f190 65 28 20 69 3c 6e 42 6c 6f 62 20 29 7b 0a 20 20  e( i<nBlob ){.  
2f1a0 20 20 75 36 34 20 69 56 61 6c 3b 0a 20 20 20 20    u64 iVal;.    
2f1b0 69 20 2b 3d 20 73 71 6c 69 74 65 33 46 74 73 35  i += sqlite3Fts5
2f1c0 47 65 74 56 61 72 69 6e 74 28 26 70 42 6c 6f 62  GetVarint(&pBlob
2f1d0 5b 69 5d 2c 20 26 69 56 61 6c 29 3b 0a 20 20 20  [i], &iVal);.   
2f1e0 20 73 71 6c 69 74 65 33 46 74 73 35 42 75 66 66   sqlite3Fts5Buff
2f1f0 65 72 41 70 70 65 6e 64 50 72 69 6e 74 66 28 70  erAppendPrintf(p
2f200 52 63 2c 20 70 42 75 66 2c 20 22 25 73 25 64 22  Rc, pBuf, "%s%d"
2f210 2c 20 7a 53 70 61 63 65 2c 20 28 69 6e 74 29 69  , zSpace, (int)i
2f220 56 61 6c 29 3b 0a 20 20 20 20 7a 53 70 61 63 65  Val);.    zSpace
2f230 20 3d 20 22 20 22 3b 0a 20 20 7d 0a 7d 0a 0a 2f   = " ";.  }.}../
2f240 2a 0a 2a 2a 20 42 75 66 66 65 72 20 28 61 2f 6e  *.** Buffer (a/n
2f250 29 20 69 73 20 61 73 73 75 6d 65 64 20 74 6f 20  ) is assumed to 
2f260 63 6f 6e 74 61 69 6e 20 61 20 6c 69 73 74 20 6f  contain a list o
2f270 66 20 73 65 72 69 61 6c 69 7a 65 64 20 76 61 72  f serialized var
2f280 69 6e 74 73 2e 20 52 65 61 64 0a 2a 2a 20 65 61  ints. Read.** ea
2f290 63 68 20 76 61 72 69 6e 74 20 61 6e 64 20 61 70  ch varint and ap
2f2a0 70 65 6e 64 20 69 74 73 20 73 74 72 69 6e 67 20  pend its string 
2f2b0 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 74  representation t
2f2c0 6f 20 62 75 66 66 65 72 20 70 42 75 66 2e 20 52  o buffer pBuf. R
2f2d0 65 74 75 72 6e 0a 2a 2a 20 61 66 74 65 72 20 65  eturn.** after e
2f2e0 69 74 68 65 72 20 74 68 65 20 69 6e 70 75 74 20  ither the input 
2f2f0 62 75 66 66 65 72 20 69 73 20 65 78 68 61 75 73  buffer is exhaus
2f300 74 65 64 20 6f 72 20 61 20 30 20 76 61 6c 75 65  ted or a 0 value
2f310 20 69 73 20 72 65 61 64 2e 0a 2a 2a 0a 2a 2a 20   is read..**.** 
2f320 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65  The return value
2f330 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   is the number o
2f340 66 20 62 79 74 65 73 20 72 65 61 64 20 66 72 6f  f bytes read fro
2f350 6d 20 74 68 65 20 69 6e 70 75 74 20 62 75 66 66  m the input buff
2f360 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  er..*/.static in
2f370 74 20 66 74 73 35 44 65 63 6f 64 65 50 6f 73 6c  t fts5DecodePosl
2f380 69 73 74 28 69 6e 74 20 2a 70 52 63 2c 20 46 74  ist(int *pRc, Ft
2f390 73 35 42 75 66 66 65 72 20 2a 70 42 75 66 2c 20  s5Buffer *pBuf, 
2f3a0 63 6f 6e 73 74 20 75 38 20 2a 61 2c 20 69 6e 74  const u8 *a, int
2f3b0 20 6e 29 7b 0a 20 20 69 6e 74 20 69 4f 66 66 20   n){.  int iOff 
2f3c0 3d 20 30 3b 0a 20 20 77 68 69 6c 65 28 20 69 4f  = 0;.  while( iO
2f3d0 66 66 3c 6e 20 29 7b 0a 20 20 20 20 69 6e 74 20  ff<n ){.    int 
2f3e0 69 56 61 6c 3b 0a 20 20 20 20 69 4f 66 66 20 2b  iVal;.    iOff +
2f3f0 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e 74 33  = fts5GetVarint3
2f400 32 28 26 61 5b 69 4f 66 66 5d 2c 20 69 56 61 6c  2(&a[iOff], iVal
2f410 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 46 74  );.    sqlite3Ft
2f420 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 50 72  s5BufferAppendPr
2f430 69 6e 74 66 28 70 52 63 2c 20 70 42 75 66 2c 20  intf(pRc, pBuf, 
2f440 22 20 25 64 22 2c 20 69 56 61 6c 29 3b 0a 20 20  " %d", iVal);.  
2f450 7d 0a 20 20 72 65 74 75 72 6e 20 69 4f 66 66 3b  }.  return iOff;
2f460 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73 74  .}../*.** The st
2f470 61 72 74 20 6f 66 20 62 75 66 66 65 72 20 28 61  art of buffer (a
2f480 2f 6e 29 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  /n) contains the
2f490 20 73 74 61 72 74 20 6f 66 20 61 20 64 6f 63 6c   start of a docl
2f4a0 69 73 74 2e 20 54 68 65 20 64 6f 63 6c 69 73 74  ist. The doclist
2f4b0 0a 2a 2a 20 6d 61 79 20 6f 72 20 6d 61 79 20 6e  .** may or may n
2f4c0 6f 74 20 66 69 6e 69 73 68 20 77 69 74 68 69 6e  ot finish within
2f4d0 20 74 68 65 20 62 75 66 66 65 72 2e 20 54 68 69   the buffer. Thi
2f4e0 73 20 66 75 6e 63 74 69 6f 6e 20 61 70 70 65 6e  s function appen
2f4f0 64 73 20 61 20 74 65 78 74 0a 2a 2a 20 72 65 70  ds a text.** rep
2f500 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74  resentation of t
2f510 68 65 20 70 61 72 74 20 6f 66 20 74 68 65 20 64  he part of the d
2f520 6f 63 6c 69 73 74 20 74 68 61 74 20 69 73 20 70  oclist that is p
2f530 72 65 73 65 6e 74 20 74 6f 20 62 75 66 66 65 72  resent to buffer
2f540 0a 2a 2a 20 70 42 75 66 2e 20 0a 2a 2a 0a 2a 2a  .** pBuf. .**.**
2f550 20 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75   The return valu
2f560 65 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20  e is the number 
2f570 6f 66 20 62 79 74 65 73 20 72 65 61 64 20 66 72  of bytes read fr
2f580 6f 6d 20 74 68 65 20 69 6e 70 75 74 20 62 75 66  om the input buf
2f590 66 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  fer..*/.static i
2f5a0 6e 74 20 66 74 73 35 44 65 63 6f 64 65 44 6f 63  nt fts5DecodeDoc
2f5b0 6c 69 73 74 28 69 6e 74 20 2a 70 52 63 2c 20 46  list(int *pRc, F
2f5c0 74 73 35 42 75 66 66 65 72 20 2a 70 42 75 66 2c  ts5Buffer *pBuf,
2f5d0 20 63 6f 6e 73 74 20 75 38 20 2a 61 2c 20 69 6e   const u8 *a, in
2f5e0 74 20 6e 29 7b 0a 20 20 69 36 34 20 69 44 6f 63  t n){.  i64 iDoc
2f5f0 69 64 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 4f  id = 0;.  int iO
2f600 66 66 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20 6e  ff = 0;..  if( n
2f610 3e 30 20 29 7b 0a 20 20 20 20 69 4f 66 66 20 3d  >0 ){.    iOff =
2f620 20 73 71 6c 69 74 65 33 46 74 73 35 47 65 74 56   sqlite3Fts5GetV
2f630 61 72 69 6e 74 28 61 2c 20 28 75 36 34 2a 29 26  arint(a, (u64*)&
2f640 69 44 6f 63 69 64 29 3b 0a 20 20 20 20 73 71 6c  iDocid);.    sql
2f650 69 74 65 33 46 74 73 35 42 75 66 66 65 72 41 70  ite3Fts5BufferAp
2f660 70 65 6e 64 50 72 69 6e 74 66 28 70 52 63 2c 20  pendPrintf(pRc, 
2f670 70 42 75 66 2c 20 22 20 69 64 3d 25 6c 6c 64 22  pBuf, " id=%lld"
2f680 2c 20 69 44 6f 63 69 64 29 3b 0a 20 20 7d 0a 20  , iDocid);.  }. 
2f690 20 77 68 69 6c 65 28 20 69 4f 66 66 3c 6e 20 29   while( iOff<n )
2f6a0 7b 0a 20 20 20 20 69 6e 74 20 6e 50 6f 73 3b 0a  {.    int nPos;.
2f6b0 20 20 20 20 69 6e 74 20 62 44 65 6c 3b 0a 20 20      int bDel;.  
2f6c0 20 20 69 4f 66 66 20 2b 3d 20 66 74 73 35 47 65    iOff += fts5Ge
2f6d0 74 50 6f 73 6c 69 73 74 53 69 7a 65 28 26 61 5b  tPoslistSize(&a[
2f6e0 69 4f 66 66 5d 2c 20 26 6e 50 6f 73 2c 20 26 62  iOff], &nPos, &b
2f6f0 44 65 6c 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  Del);.    sqlite
2f700 33 46 74 73 35 42 75 66 66 65 72 41 70 70 65 6e  3Fts5BufferAppen
2f710 64 50 72 69 6e 74 66 28 70 52 63 2c 20 70 42 75  dPrintf(pRc, pBu
2f720 66 2c 20 22 20 6e 50 6f 73 3d 25 64 25 73 22 2c  f, " nPos=%d%s",
2f730 20 6e 50 6f 73 2c 20 62 44 65 6c 3f 22 2a 22 3a   nPos, bDel?"*":
2f740 22 22 29 3b 0a 20 20 20 20 69 4f 66 66 20 2b 3d  "");.    iOff +=
2f750 20 66 74 73 35 44 65 63 6f 64 65 50 6f 73 6c 69   fts5DecodePosli
2f760 73 74 28 70 52 63 2c 20 70 42 75 66 2c 20 26 61  st(pRc, pBuf, &a
2f770 5b 69 4f 66 66 5d 2c 20 4d 49 4e 28 6e 2d 69 4f  [iOff], MIN(n-iO
2f780 66 66 2c 20 6e 50 6f 73 29 29 3b 0a 20 20 20 20  ff, nPos));.    
2f790 69 66 28 20 69 4f 66 66 3c 6e 20 29 7b 0a 20 20  if( iOff<n ){.  
2f7a0 20 20 20 20 69 36 34 20 69 44 65 6c 74 61 3b 0a      i64 iDelta;.
2f7b0 20 20 20 20 20 20 69 4f 66 66 20 2b 3d 20 73 71        iOff += sq
2f7c0 6c 69 74 65 33 46 74 73 35 47 65 74 56 61 72 69  lite3Fts5GetVari
2f7d0 6e 74 28 26 61 5b 69 4f 66 66 5d 2c 20 28 75 36  nt(&a[iOff], (u6
2f7e0 34 2a 29 26 69 44 65 6c 74 61 29 3b 0a 20 20 20  4*)&iDelta);.   
2f7f0 20 20 20 69 44 6f 63 69 64 20 2b 3d 20 69 44 65     iDocid += iDe
2f800 6c 74 61 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  lta;.      sqlit
2f810 65 33 46 74 73 35 42 75 66 66 65 72 41 70 70 65  e3Fts5BufferAppe
2f820 6e 64 50 72 69 6e 74 66 28 70 52 63 2c 20 70 42  ndPrintf(pRc, pB
2f830 75 66 2c 20 22 20 69 64 3d 25 6c 6c 64 22 2c 20  uf, " id=%lld", 
2f840 69 44 6f 63 69 64 29 3b 0a 20 20 20 20 7d 0a 20  iDocid);.    }. 
2f850 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 69 4f 66   }..  return iOf
2f860 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  f;.}../*.** This
2f870 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 70 61 72   function is par
2f880 74 20 6f 66 20 74 68 65 20 66 74 73 35 5f 64 65  t of the fts5_de
2f890 63 6f 64 65 28 29 20 64 65 62 75 67 67 69 6e 67  code() debugging
2f8a0 20 66 75 6e 63 74 69 6f 6e 2e 20 49 74 20 69 73   function. It is
2f8b0 20 0a 2a 2a 20 6f 6e 6c 79 20 65 76 65 72 20 75   .** only ever u
2f8c0 73 65 64 20 77 69 74 68 20 64 65 74 61 69 6c 3d  sed with detail=
2f8d0 6e 6f 6e 65 20 74 61 62 6c 65 73 2e 0a 2a 2a 0a  none tables..**.
2f8e0 2a 2a 20 42 75 66 66 65 72 20 28 70 44 61 74 61  ** Buffer (pData
2f8f0 2f 6e 44 61 74 61 29 20 63 6f 6e 74 61 69 6e 73  /nData) contains
2f900 20 61 20 64 6f 63 6c 69 73 74 20 69 6e 20 74 68   a doclist in th
2f910 65 20 66 6f 72 6d 61 74 20 75 73 65 64 20 62 79  e format used by
2f920 20 64 65 74 61 69 6c 3d 6e 6f 6e 65 0a 2a 2a 20   detail=none.** 
2f930 74 61 62 6c 65 73 2e 20 54 68 69 73 20 66 75 6e  tables. This fun
2f940 63 74 69 6f 6e 20 61 70 70 65 6e 64 73 20 61 20  ction appends a 
2f950 68 75 6d 61 6e 2d 72 65 61 64 61 62 6c 65 20 76  human-readable v
2f960 65 72 73 69 6f 6e 20 6f 66 20 74 68 61 74 20 6c  ersion of that l
2f970 69 73 74 20 74 6f 0a 2a 2a 20 62 75 66 66 65 72  ist to.** buffer
2f980 20 70 42 75 66 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   pBuf..**.** If 
2f990 2a 70 52 63 20 69 73 20 6f 74 68 65 72 20 74 68  *pRc is other th
2f9a0 61 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 77 68 65  an SQLITE_OK whe
2f9b0 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  n this function 
2f9c0 69 73 20 63 61 6c 6c 65 64 2c 20 69 74 20 69 73  is called, it is
2f9d0 20 61 0a 2a 2a 20 6e 6f 2d 6f 70 2e 20 49 66 20   a.** no-op. If 
2f9e0 61 6e 20 4f 4f 4d 20 6f 72 20 6f 74 68 65 72 20  an OOM or other 
2f9f0 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 69 74  error occurs wit
2fa00 68 69 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hin this functio
2fa10 6e 2c 20 2a 70 52 63 20 69 73 0a 2a 2a 20 73 65  n, *pRc is.** se
2fa20 74 20 74 6f 20 61 6e 20 53 51 4c 69 74 65 20 65  t to an SQLite e
2fa30 72 72 6f 72 20 63 6f 64 65 20 62 65 66 6f 72 65  rror code before
2fa40 20 72 65 74 75 72 6e 69 6e 67 2e 20 54 68 65 20   returning. The 
2fa50 66 69 6e 61 6c 20 73 74 61 74 65 20 6f 66 20 62  final state of b
2fa60 75 66 66 65 72 0a 2a 2a 20 70 42 75 66 20 69 73  uffer.** pBuf is
2fa70 20 75 6e 64 65 66 69 6e 65 64 20 69 6e 20 74 68   undefined in th
2fa80 69 73 20 63 61 73 65 2e 0a 2a 2f 0a 73 74 61 74  is case..*/.stat
2fa90 69 63 20 76 6f 69 64 20 66 74 73 35 44 65 63 6f  ic void fts5Deco
2faa0 64 65 52 6f 77 69 64 4c 69 73 74 28 0a 20 20 69  deRowidList(.  i
2fab0 6e 74 20 2a 70 52 63 2c 20 20 20 20 20 20 20 20  nt *pRc,        
2fac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2fad0 2a 20 49 4e 2f 4f 55 54 3a 20 45 72 72 6f 72 20  * IN/OUT: Error 
2fae0 63 6f 64 65 20 2a 2f 0a 20 20 46 74 73 35 42 75  code */.  Fts5Bu
2faf0 66 66 65 72 20 2a 70 42 75 66 2c 20 20 20 20 20  ffer *pBuf,     
2fb00 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 75 66            /* Buf
2fb10 66 65 72 20 74 6f 20 61 70 70 65 6e 64 20 74 65  fer to append te
2fb20 78 74 20 74 6f 20 2a 2f 0a 20 20 63 6f 6e 73 74  xt to */.  const
2fb30 20 75 38 20 2a 70 44 61 74 61 2c 20 69 6e 74 20   u8 *pData, int 
2fb40 6e 44 61 74 61 20 20 20 20 20 20 2f 2a 20 44 61  nData      /* Da
2fb50 74 61 20 74 6f 20 64 65 63 6f 64 65 20 6c 69 73  ta to decode lis
2fb60 74 2d 6f 66 2d 72 6f 77 69 64 73 20 66 72 6f 6d  t-of-rowids from
2fb70 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 20 3d   */.){.  int i =
2fb80 20 30 3b 0a 20 20 69 36 34 20 69 52 6f 77 69 64   0;.  i64 iRowid
2fb90 20 3d 20 30 3b 0a 0a 20 20 77 68 69 6c 65 28 20   = 0;..  while( 
2fba0 69 3c 6e 44 61 74 61 20 29 7b 0a 20 20 20 20 63  i<nData ){.    c
2fbb0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41 70 70 20  onst char *zApp 
2fbc0 3d 20 22 22 3b 0a 20 20 20 20 75 36 34 20 69 56  = "";.    u64 iV
2fbd0 61 6c 3b 0a 20 20 20 20 69 20 2b 3d 20 73 71 6c  al;.    i += sql
2fbe0 69 74 65 33 46 74 73 35 47 65 74 56 61 72 69 6e  ite3Fts5GetVarin
2fbf0 74 28 26 70 44 61 74 61 5b 69 5d 2c 20 26 69 56  t(&pData[i], &iV
2fc00 61 6c 29 3b 0a 20 20 20 20 69 52 6f 77 69 64 20  al);.    iRowid 
2fc10 2b 3d 20 69 56 61 6c 3b 0a 0a 20 20 20 20 69 66  += iVal;..    if
2fc20 28 20 69 3c 6e 44 61 74 61 20 26 26 20 70 44 61  ( i<nData && pDa
2fc30 74 61 5b 69 5d 3d 3d 30 78 30 30 20 29 7b 0a 20  ta[i]==0x00 ){. 
2fc40 20 20 20 20 20 69 2b 2b 3b 0a 20 20 20 20 20 20       i++;.      
2fc50 69 66 28 20 69 3c 6e 44 61 74 61 20 26 26 20 70  if( i<nData && p
2fc60 44 61 74 61 5b 69 5d 3d 3d 30 78 30 30 20 29 7b  Data[i]==0x00 ){
2fc70 0a 20 20 20 20 20 20 20 20 69 2b 2b 3b 0a 20 20  .        i++;.  
2fc80 20 20 20 20 20 20 7a 41 70 70 20 3d 20 22 2b 22        zApp = "+"
2fc90 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
2fca0 20 20 20 20 20 20 20 7a 41 70 70 20 3d 20 22 2a         zApp = "*
2fcb0 22 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  ";.      }.    }
2fcc0 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 46 74 73  ..    sqlite3Fts
2fcd0 35 42 75 66 66 65 72 41 70 70 65 6e 64 50 72 69  5BufferAppendPri
2fce0 6e 74 66 28 70 52 63 2c 20 70 42 75 66 2c 20 22  ntf(pRc, pBuf, "
2fcf0 20 25 6c 6c 64 25 73 22 2c 20 69 52 6f 77 69 64   %lld%s", iRowid
2fd00 2c 20 7a 41 70 70 29 3b 0a 20 20 7d 0a 7d 0a 0a  , zApp);.  }.}..
2fd10 2f 2a 0a 2a 2a 20 54 68 65 20 69 6d 70 6c 65 6d  /*.** The implem
2fd20 65 6e 74 61 74 69 6f 6e 20 6f 66 20 75 73 65 72  entation of user
2fd30 2d 64 65 66 69 6e 65 64 20 73 63 61 6c 61 72 20  -defined scalar 
2fd40 66 75 6e 63 74 69 6f 6e 20 66 74 73 35 5f 64 65  function fts5_de
2fd50 63 6f 64 65 28 29 2e 0a 2a 2f 0a 73 74 61 74 69  code()..*/.stati
2fd60 63 20 76 6f 69 64 20 66 74 73 35 44 65 63 6f 64  c void fts5Decod
2fd70 65 46 75 6e 63 74 69 6f 6e 28 0a 20 20 73 71 6c  eFunction(.  sql
2fd80 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43  ite3_context *pC
2fd90 74 78 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  tx,          /* 
2fda0 46 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 20 63 6f  Function call co
2fdb0 6e 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20 6e  ntext */.  int n
2fdc0 41 72 67 2c 20 20 20 20 20 20 20 20 20 20 20 20  Arg,            
2fdd0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
2fde0 6d 62 65 72 20 6f 66 20 61 72 67 73 20 28 61 6c  mber of args (al
2fdf0 77 61 79 73 20 32 29 20 2a 2f 0a 20 20 73 71 6c  ways 2) */.  sql
2fe00 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 70 56  ite3_value **apV
2fe10 61 6c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  al           /* 
2fe20 46 75 6e 63 74 69 6f 6e 20 61 72 67 75 6d 65 6e  Function argumen
2fe30 74 73 20 2a 2f 0a 29 7b 0a 20 20 69 36 34 20 69  ts */.){.  i64 i
2fe40 52 6f 77 69 64 3b 20 20 20 20 20 20 20 20 20 20  Rowid;          
2fe50 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f             /* Ro
2fe60 77 69 64 20 66 6f 72 20 72 65 63 6f 72 64 20 62  wid for record b
2fe70 65 69 6e 67 20 64 65 63 6f 64 65 64 20 2a 2f 0a  eing decoded */.
2fe80 20 20 69 6e 74 20 69 53 65 67 69 64 2c 69 48 65    int iSegid,iHe
2fe90 69 67 68 74 2c 69 50 67 6e 6f 2c 62 44 6c 69 64  ight,iPgno,bDlid
2fea0 78 3b 2f 2a 20 52 6f 77 69 64 20 63 6f 6d 70 6f  x;/* Rowid compo
2feb0 6e 65 6e 74 73 20 2a 2f 0a 20 20 63 6f 6e 73 74  nents */.  const
2fec0 20 75 38 20 2a 61 42 6c 6f 62 3b 20 69 6e 74 20   u8 *aBlob; int 
2fed0 6e 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65  n;         /* Re
2fee0 63 6f 72 64 20 74 6f 20 64 65 63 6f 64 65 20 2a  cord to decode *
2fef0 2f 0a 20 20 75 38 20 2a 61 20 3d 20 30 3b 0a 20  /.  u8 *a = 0;. 
2ff00 20 46 74 73 35 42 75 66 66 65 72 20 73 3b 20 20   Fts5Buffer s;  
2ff10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ff20 20 2f 2a 20 42 75 69 6c 64 20 75 70 20 74 65 78   /* Build up tex
2ff30 74 20 74 6f 20 72 65 74 75 72 6e 20 68 65 72 65  t to return here
2ff40 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53   */.  int rc = S
2ff50 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20  QLITE_OK;       
2ff60 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
2ff70 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 53  code */.  int nS
2ff80 70 61 63 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20  pace = 0;.  int 
2ff90 65 44 65 74 61 69 6c 4e 6f 6e 65 20 3d 20 28 73  eDetailNone = (s
2ffa0 71 6c 69 74 65 33 5f 75 73 65 72 5f 64 61 74 61  qlite3_user_data
2ffb0 28 70 43 74 78 29 21 3d 30 29 3b 0a 0a 20 20 61  (pCtx)!=0);..  a
2ffc0 73 73 65 72 74 28 20 6e 41 72 67 3d 3d 32 20 29  ssert( nArg==2 )
2ffd0 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ;.  UNUSED_PARAM
2ffe0 28 6e 41 72 67 29 3b 0a 20 20 6d 65 6d 73 65 74  (nArg);.  memset
2fff0 28 26 73 2c 20 30 2c 20 73 69 7a 65 6f 66 28 46  (&s, 0, sizeof(F
30000 74 73 35 42 75 66 66 65 72 29 29 3b 0a 20 20 69  ts5Buffer));.  i
30010 52 6f 77 69 64 20 3d 20 73 71 6c 69 74 65 33 5f  Rowid = sqlite3_
30020 76 61 6c 75 65 5f 69 6e 74 36 34 28 61 70 56 61  value_int64(apVa
30030 6c 5b 30 5d 29 3b 0a 0a 20 20 2f 2a 20 4d 61 6b  l[0]);..  /* Mak
30040 65 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20  e a copy of the 
30050 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20  second argument 
30060 28 61 20 62 6c 6f 62 29 20 69 6e 20 61 42 6c 6f  (a blob) in aBlo
30070 62 5b 5d 2e 20 54 68 65 20 61 42 6c 6f 62 5b 5d  b[]. The aBlob[]
30080 0a 20 20 2a 2a 20 63 6f 70 79 20 69 73 20 66 6f  .  ** copy is fo
30090 6c 6c 6f 77 65 64 20 62 79 20 46 54 53 35 5f 44  llowed by FTS5_D
300a0 41 54 41 5f 5a 45 52 4f 5f 50 41 44 44 49 4e 47  ATA_ZERO_PADDING
300b0 20 30 78 30 30 20 62 79 74 65 73 2c 20 77 68 69   0x00 bytes, whi
300c0 63 68 20 70 72 65 76 65 6e 74 73 0a 20 20 2a 2a  ch prevents.  **
300d0 20 62 75 66 66 65 72 20 6f 76 65 72 72 65 61 64   buffer overread
300e0 73 20 65 76 65 6e 20 69 66 20 74 68 65 20 72 65  s even if the re
300f0 63 6f 72 64 20 69 73 20 63 6f 72 72 75 70 74 2e  cord is corrupt.
30100 20 20 2a 2f 0a 20 20 6e 20 3d 20 73 71 6c 69 74    */.  n = sqlit
30110 65 33 5f 76 61 6c 75 65 5f 62 79 74 65 73 28 61  e3_value_bytes(a
30120 70 56 61 6c 5b 31 5d 29 3b 0a 20 20 61 42 6c 6f  pVal[1]);.  aBlo
30130 62 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  b = sqlite3_valu
30140 65 5f 62 6c 6f 62 28 61 70 56 61 6c 5b 31 5d 29  e_blob(apVal[1])
30150 3b 0a 20 20 6e 53 70 61 63 65 20 3d 20 6e 20 2b  ;.  nSpace = n +
30160 20 46 54 53 35 5f 44 41 54 41 5f 5a 45 52 4f 5f   FTS5_DATA_ZERO_
30170 50 41 44 44 49 4e 47 3b 0a 20 20 61 20 3d 20 28  PADDING;.  a = (
30180 75 38 2a 29 73 71 6c 69 74 65 33 46 74 73 35 4d  u8*)sqlite3Fts5M
30190 61 6c 6c 6f 63 5a 65 72 6f 28 26 72 63 2c 20 6e  allocZero(&rc, n
301a0 53 70 61 63 65 29 3b 0a 20 20 69 66 28 20 61 3d  Space);.  if( a=
301b0 3d 30 20 29 20 67 6f 74 6f 20 64 65 63 6f 64 65  =0 ) goto decode
301c0 5f 6f 75 74 3b 0a 20 20 6d 65 6d 63 70 79 28 61  _out;.  memcpy(a
301d0 2c 20 61 42 6c 6f 62 2c 20 6e 29 3b 0a 0a 0a 20  , aBlob, n);... 
301e0 20 66 74 73 35 44 65 63 6f 64 65 52 6f 77 69 64   fts5DecodeRowid
301f0 28 69 52 6f 77 69 64 2c 20 26 69 53 65 67 69 64  (iRowid, &iSegid
30200 2c 20 26 62 44 6c 69 64 78 2c 20 26 69 48 65 69  , &bDlidx, &iHei
30210 67 68 74 2c 20 26 69 50 67 6e 6f 29 3b 0a 0a 20  ght, &iPgno);.. 
30220 20 66 74 73 35 44 65 62 75 67 52 6f 77 69 64 28   fts5DebugRowid(
30230 26 72 63 2c 20 26 73 2c 20 69 52 6f 77 69 64 29  &rc, &s, iRowid)
30240 3b 0a 20 20 69 66 28 20 62 44 6c 69 64 78 20 29  ;.  if( bDlidx )
30250 7b 0a 20 20 20 20 46 74 73 35 44 61 74 61 20 64  {.    Fts5Data d
30260 6c 69 64 78 3b 0a 20 20 20 20 46 74 73 35 44 6c  lidx;.    Fts5Dl
30270 69 64 78 4c 76 6c 20 6c 76 6c 3b 0a 0a 20 20 20  idxLvl lvl;..   
30280 20 64 6c 69 64 78 2e 70 20 3d 20 61 3b 0a 20 20   dlidx.p = a;.  
30290 20 20 64 6c 69 64 78 2e 6e 6e 20 3d 20 6e 3b 0a    dlidx.nn = n;.
302a0 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 6c 76 6c  .    memset(&lvl
302b0 2c 20 30 2c 20 73 69 7a 65 6f 66 28 46 74 73 35  , 0, sizeof(Fts5
302c0 44 6c 69 64 78 4c 76 6c 29 29 3b 0a 20 20 20 20  DlidxLvl));.    
302d0 6c 76 6c 2e 70 44 61 74 61 20 3d 20 26 64 6c 69  lvl.pData = &dli
302e0 64 78 3b 0a 20 20 20 20 6c 76 6c 2e 69 4c 65 61  dx;.    lvl.iLea
302f0 66 50 67 6e 6f 20 3d 20 69 50 67 6e 6f 3b 0a 0a  fPgno = iPgno;..
30300 20 20 20 20 66 6f 72 28 66 74 73 35 44 6c 69 64      for(fts5Dlid
30310 78 4c 76 6c 4e 65 78 74 28 26 6c 76 6c 29 3b 20  xLvlNext(&lvl); 
30320 6c 76 6c 2e 62 45 6f 66 3d 3d 30 3b 20 66 74 73  lvl.bEof==0; fts
30330 35 44 6c 69 64 78 4c 76 6c 4e 65 78 74 28 26 6c  5DlidxLvlNext(&l
30340 76 6c 29 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  vl)){.      sqli
30350 74 65 33 46 74 73 35 42 75 66 66 65 72 41 70 70  te3Fts5BufferApp
30360 65 6e 64 50 72 69 6e 74 66 28 26 72 63 2c 20 26  endPrintf(&rc, &
30370 73 2c 20 0a 20 20 20 20 20 20 20 20 20 20 22 20  s, .          " 
30380 25 64 28 25 6c 6c 64 29 22 2c 20 6c 76 6c 2e 69  %d(%lld)", lvl.i
30390 4c 65 61 66 50 67 6e 6f 2c 20 6c 76 6c 2e 69 52  LeafPgno, lvl.iR
303a0 6f 77 69 64 0a 20 20 20 20 20 20 29 3b 0a 20 20  owid.      );.  
303b0 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20    }.  }else if( 
303c0 69 53 65 67 69 64 3d 3d 30 20 29 7b 0a 20 20 20  iSegid==0 ){.   
303d0 20 69 66 28 20 69 52 6f 77 69 64 3d 3d 46 54 53   if( iRowid==FTS
303e0 35 5f 41 56 45 52 41 47 45 53 5f 52 4f 57 49 44  5_AVERAGES_ROWID
303f0 20 29 7b 0a 20 20 20 20 20 20 66 74 73 35 44 65   ){.      fts5De
30400 63 6f 64 65 41 76 65 72 61 67 65 73 28 26 72 63  codeAverages(&rc
30410 2c 20 26 73 2c 20 61 2c 20 6e 29 3b 0a 20 20 20  , &s, a, n);.   
30420 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 66 74   }else{.      ft
30430 73 35 44 65 63 6f 64 65 53 74 72 75 63 74 75 72  s5DecodeStructur
30440 65 28 26 72 63 2c 20 26 73 2c 20 61 2c 20 6e 29  e(&rc, &s, a, n)
30450 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20  ;.    }.  }else 
30460 69 66 28 20 65 44 65 74 61 69 6c 4e 6f 6e 65 20  if( eDetailNone 
30470 29 7b 0a 20 20 20 20 46 74 73 35 42 75 66 66 65  ){.    Fts5Buffe
30480 72 20 74 65 72 6d 3b 20 20 20 20 20 20 20 20 20  r term;         
30490 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20       /* Current 
304a0 74 65 72 6d 20 72 65 61 64 20 66 72 6f 6d 20 70  term read from p
304b0 61 67 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 73  age */.    int s
304c0 7a 4c 65 61 66 3b 0a 20 20 20 20 69 6e 74 20 69  zLeaf;.    int i
304d0 50 67 69 64 78 4f 66 66 20 3d 20 73 7a 4c 65 61  PgidxOff = szLea
304e0 66 20 3d 20 66 74 73 35 47 65 74 55 31 36 28 26  f = fts5GetU16(&
304f0 61 5b 32 5d 29 3b 0a 20 20 20 20 69 6e 74 20 69  a[2]);.    int i
30500 54 65 72 6d 4f 66 66 3b 0a 20 20 20 20 69 6e 74  TermOff;.    int
30510 20 6e 4b 65 65 70 20 3d 20 30 3b 0a 20 20 20 20   nKeep = 0;.    
30520 69 6e 74 20 69 4f 66 66 3b 0a 0a 20 20 20 20 6d  int iOff;..    m
30530 65 6d 73 65 74 28 26 74 65 72 6d 2c 20 30 2c 20  emset(&term, 0, 
30540 73 69 7a 65 6f 66 28 46 74 73 35 42 75 66 66 65  sizeof(Fts5Buffe
30550 72 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 44 65 63  r));..    /* Dec
30560 6f 64 65 20 61 6e 79 20 65 6e 74 72 69 65 73 20  ode any entries 
30570 74 68 61 74 20 6f 63 63 75 72 20 62 65 66 6f 72  that occur befor
30580 65 20 74 68 65 20 66 69 72 73 74 20 74 65 72 6d  e the first term
30590 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 7a 4c  . */.    if( szL
305a0 65 61 66 3c 6e 20 29 7b 0a 20 20 20 20 20 20 69  eaf<n ){.      i
305b0 50 67 69 64 78 4f 66 66 20 2b 3d 20 66 74 73 35  PgidxOff += fts5
305c0 47 65 74 56 61 72 69 6e 74 33 32 28 26 61 5b 69  GetVarint32(&a[i
305d0 50 67 69 64 78 4f 66 66 5d 2c 20 69 54 65 72 6d  PgidxOff], iTerm
305e0 4f 66 66 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  Off);.    }else{
305f0 0a 20 20 20 20 20 20 69 54 65 72 6d 4f 66 66 20  .      iTermOff 
30600 3d 20 73 7a 4c 65 61 66 3b 0a 20 20 20 20 7d 0a  = szLeaf;.    }.
30610 20 20 20 20 66 74 73 35 44 65 63 6f 64 65 52 6f      fts5DecodeRo
30620 77 69 64 4c 69 73 74 28 26 72 63 2c 20 26 73 2c  widList(&rc, &s,
30630 20 26 61 5b 34 5d 2c 20 69 54 65 72 6d 4f 66 66   &a[4], iTermOff
30640 2d 34 29 3b 0a 0a 20 20 20 20 69 4f 66 66 20 3d  -4);..    iOff =
30650 20 69 54 65 72 6d 4f 66 66 3b 0a 20 20 20 20 77   iTermOff;.    w
30660 68 69 6c 65 28 20 69 4f 66 66 3c 73 7a 4c 65 61  hile( iOff<szLea
30670 66 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e  f ){.      int n
30680 41 70 70 65 6e 64 3b 0a 0a 20 20 20 20 20 20 2f  Append;..      /
30690 2a 20 52 65 61 64 20 74 68 65 20 74 65 72 6d 20  * Read the term 
306a0 64 61 74 61 20 66 6f 72 20 74 68 65 20 6e 65 78  data for the nex
306b0 74 20 74 65 72 6d 2a 2f 0a 20 20 20 20 20 20 69  t term*/.      i
306c0 4f 66 66 20 2b 3d 20 66 74 73 35 47 65 74 56 61  Off += fts5GetVa
306d0 72 69 6e 74 33 32 28 26 61 5b 69 4f 66 66 5d 2c  rint32(&a[iOff],
306e0 20 6e 41 70 70 65 6e 64 29 3b 0a 20 20 20 20 20   nAppend);.     
306f0 20 74 65 72 6d 2e 6e 20 3d 20 6e 4b 65 65 70 3b   term.n = nKeep;
30700 0a 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65  .      fts5Buffe
30710 72 41 70 70 65 6e 64 42 6c 6f 62 28 26 72 63 2c  rAppendBlob(&rc,
30720 20 26 74 65 72 6d 2c 20 6e 41 70 70 65 6e 64 2c   &term, nAppend,
30730 20 26 61 5b 69 4f 66 66 5d 29 3b 0a 20 20 20 20   &a[iOff]);.    
30740 20 20 73 71 6c 69 74 65 33 46 74 73 35 42 75 66    sqlite3Fts5Buf
30750 66 65 72 41 70 70 65 6e 64 50 72 69 6e 74 66 28  ferAppendPrintf(
30760 0a 20 20 20 20 20 20 20 20 20 20 26 72 63 2c 20  .          &rc, 
30770 26 73 2c 20 22 20 74 65 72 6d 3d 25 2e 2a 73 22  &s, " term=%.*s"
30780 2c 20 74 65 72 6d 2e 6e 2c 20 28 63 6f 6e 73 74  , term.n, (const
30790 20 63 68 61 72 2a 29 74 65 72 6d 2e 70 0a 20 20   char*)term.p.  
307a0 20 20 20 20 29 3b 0a 20 20 20 20 20 20 69 4f 66      );.      iOf
307b0 66 20 2b 3d 20 6e 41 70 70 65 6e 64 3b 0a 0a 20  f += nAppend;.. 
307c0 20 20 20 20 20 2f 2a 20 46 69 67 75 72 65 20 6f       /* Figure o
307d0 75 74 20 77 68 65 72 65 20 74 68 65 20 64 6f 63  ut where the doc
307e0 6c 69 73 74 20 66 6f 72 20 74 68 69 73 20 74 65  list for this te
307f0 72 6d 20 65 6e 64 73 20 2a 2f 0a 20 20 20 20 20  rm ends */.     
30800 20 69 66 28 20 69 50 67 69 64 78 4f 66 66 3c 6e   if( iPgidxOff<n
30810 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20   ){.        int 
30820 6e 49 6e 63 72 3b 0a 20 20 20 20 20 20 20 20 69  nIncr;.        i
30830 50 67 69 64 78 4f 66 66 20 2b 3d 20 66 74 73 35  PgidxOff += fts5
30840 47 65 74 56 61 72 69 6e 74 33 32 28 26 61 5b 69  GetVarint32(&a[i
30850 50 67 69 64 78 4f 66 66 5d 2c 20 6e 49 6e 63 72  PgidxOff], nIncr
30860 29 3b 0a 20 20 20 20 20 20 20 20 69 54 65 72 6d  );.        iTerm
30870 4f 66 66 20 2b 3d 20 6e 49 6e 63 72 3b 0a 20 20  Off += nIncr;.  
30880 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
30890 20 20 20 69 54 65 72 6d 4f 66 66 20 3d 20 73 7a     iTermOff = sz
308a0 4c 65 61 66 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  Leaf;.      }.. 
308b0 20 20 20 20 20 66 74 73 35 44 65 63 6f 64 65 52       fts5DecodeR
308c0 6f 77 69 64 4c 69 73 74 28 26 72 63 2c 20 26 73  owidList(&rc, &s
308d0 2c 20 26 61 5b 69 4f 66 66 5d 2c 20 69 54 65 72  , &a[iOff], iTer
308e0 6d 4f 66 66 2d 69 4f 66 66 29 3b 0a 20 20 20 20  mOff-iOff);.    
308f0 20 20 69 4f 66 66 20 3d 20 69 54 65 72 6d 4f 66    iOff = iTermOf
30900 66 3b 0a 20 20 20 20 20 20 69 66 28 20 69 4f 66  f;.      if( iOf
30910 66 3c 73 7a 4c 65 61 66 20 29 7b 0a 20 20 20 20  f<szLeaf ){.    
30920 20 20 20 20 69 4f 66 66 20 2b 3d 20 66 74 73 35      iOff += fts5
30930 47 65 74 56 61 72 69 6e 74 33 32 28 26 61 5b 69  GetVarint32(&a[i
30940 4f 66 66 5d 2c 20 6e 4b 65 65 70 29 3b 0a 20 20  Off], nKeep);.  
30950 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
30960 20 66 74 73 35 42 75 66 66 65 72 46 72 65 65 28   fts5BufferFree(
30970 26 74 65 72 6d 29 3b 0a 20 20 7d 65 6c 73 65 7b  &term);.  }else{
30980 0a 20 20 20 20 46 74 73 35 42 75 66 66 65 72 20  .    Fts5Buffer 
30990 74 65 72 6d 3b 20 20 20 20 20 20 20 20 20 20 20  term;           
309a0 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 74 65     /* Current te
309b0 72 6d 20 72 65 61 64 20 66 72 6f 6d 20 70 61 67  rm read from pag
309c0 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 73 7a 4c  e */.    int szL
309d0 65 61 66 3b 20 20 20 20 20 20 20 20 20 20 20 20  eaf;            
309e0 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74         /* Offset
309f0 20 6f 66 20 70 67 69 64 78 20 69 6e 20 61 5b 5d   of pgidx in a[]
30a00 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 50 67 69   */.    int iPgi
30a10 64 78 4f 66 66 3b 0a 20 20 20 20 69 6e 74 20 69  dxOff;.    int i
30a20 50 67 69 64 78 50 72 65 76 20 3d 20 30 3b 20 20  PgidxPrev = 0;  
30a30 20 20 20 20 20 20 20 20 20 2f 2a 20 50 72 65 76           /* Prev
30a40 69 6f 75 73 20 76 61 6c 75 65 20 72 65 61 64 20  ious value read 
30a50 66 72 6f 6d 20 70 67 69 64 78 20 2a 2f 0a 20 20  from pgidx */.  
30a60 20 20 69 6e 74 20 69 54 65 72 6d 4f 66 66 20 3d    int iTermOff =
30a70 20 30 3b 0a 20 20 20 20 69 6e 74 20 69 52 6f 77   0;.    int iRow
30a80 69 64 4f 66 66 20 3d 20 30 3b 0a 20 20 20 20 69  idOff = 0;.    i
30a90 6e 74 20 69 4f 66 66 3b 0a 20 20 20 20 69 6e 74  nt iOff;.    int
30aa0 20 6e 44 6f 63 6c 69 73 74 3b 0a 0a 20 20 20 20   nDoclist;..    
30ab0 6d 65 6d 73 65 74 28 26 74 65 72 6d 2c 20 30 2c  memset(&term, 0,
30ac0 20 73 69 7a 65 6f 66 28 46 74 73 35 42 75 66 66   sizeof(Fts5Buff
30ad0 65 72 29 29 3b 0a 0a 20 20 20 20 69 66 28 20 6e  er));..    if( n
30ae0 3c 34 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  <4 ){.      sqli
30af0 74 65 33 46 74 73 35 42 75 66 66 65 72 53 65 74  te3Fts5BufferSet
30b00 28 26 72 63 2c 20 26 73 2c 20 37 2c 20 28 63 6f  (&rc, &s, 7, (co
30b10 6e 73 74 20 75 38 2a 29 22 63 6f 72 72 75 70 74  nst u8*)"corrupt
30b20 22 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 64  ");.      goto d
30b30 65 63 6f 64 65 5f 6f 75 74 3b 0a 20 20 20 20 7d  ecode_out;.    }
30b40 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 52 6f 77  else{.      iRow
30b50 69 64 4f 66 66 20 3d 20 66 74 73 35 47 65 74 55  idOff = fts5GetU
30b60 31 36 28 26 61 5b 30 5d 29 3b 0a 20 20 20 20 20  16(&a[0]);.     
30b70 20 69 50 67 69 64 78 4f 66 66 20 3d 20 73 7a 4c   iPgidxOff = szL
30b80 65 61 66 20 3d 20 66 74 73 35 47 65 74 55 31 36  eaf = fts5GetU16
30b90 28 26 61 5b 32 5d 29 3b 0a 20 20 20 20 20 20 69  (&a[2]);.      i
30ba0 66 28 20 69 50 67 69 64 78 4f 66 66 3c 6e 20 29  f( iPgidxOff<n )
30bb0 7b 0a 20 20 20 20 20 20 20 20 66 74 73 35 47 65  {.        fts5Ge
30bc0 74 56 61 72 69 6e 74 33 32 28 26 61 5b 69 50 67  tVarint32(&a[iPg
30bd0 69 64 78 4f 66 66 5d 2c 20 69 54 65 72 6d 4f 66  idxOff], iTermOf
30be0 66 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  f);.      }.    
30bf0 7d 0a 0a 20 20 20 20 2f 2a 20 44 65 63 6f 64 65  }..    /* Decode
30c00 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 20 6c 69   the position li
30c10 73 74 20 74 61 69 6c 20 61 74 20 74 68 65 20 73  st tail at the s
30c20 74 61 72 74 20 6f 66 20 74 68 65 20 70 61 67 65  tart of the page
30c30 20 2a 2f 0a 20 20 20 20 69 66 28 20 69 52 6f 77   */.    if( iRow
30c40 69 64 4f 66 66 21 3d 30 20 29 7b 0a 20 20 20 20  idOff!=0 ){.    
30c50 20 20 69 4f 66 66 20 3d 20 69 52 6f 77 69 64 4f    iOff = iRowidO
30c60 66 66 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  ff;.    }else if
30c70 28 20 69 54 65 72 6d 4f 66 66 21 3d 30 20 29 7b  ( iTermOff!=0 ){
30c80 0a 20 20 20 20 20 20 69 4f 66 66 20 3d 20 69 54  .      iOff = iT
30c90 65 72 6d 4f 66 66 3b 0a 20 20 20 20 7d 65 6c 73  ermOff;.    }els
30ca0 65 7b 0a 20 20 20 20 20 20 69 4f 66 66 20 3d 20  e{.      iOff = 
30cb0 73 7a 4c 65 61 66 3b 0a 20 20 20 20 7d 0a 20 20  szLeaf;.    }.  
30cc0 20 20 66 74 73 35 44 65 63 6f 64 65 50 6f 73 6c    fts5DecodePosl
30cd0 69 73 74 28 26 72 63 2c 20 26 73 2c 20 26 61 5b  ist(&rc, &s, &a[
30ce0 34 5d 2c 20 69 4f 66 66 2d 34 29 3b 0a 0a 20 20  4], iOff-4);..  
30cf0 20 20 2f 2a 20 44 65 63 6f 64 65 20 61 6e 79 20    /* Decode any 
30d00 6d 6f 72 65 20 64 6f 63 6c 69 73 74 20 64 61 74  more doclist dat
30d10 61 20 74 68 61 74 20 61 70 70 65 61 72 73 20 6f  a that appears o
30d20 6e 20 74 68 65 20 70 61 67 65 20 62 65 66 6f 72  n the page befor
30d30 65 20 74 68 65 0a 20 20 20 20 2a 2a 20 66 69 72  e the.    ** fir
30d40 73 74 20 74 65 72 6d 2e 20 2a 2f 0a 20 20 20 20  st term. */.    
30d50 6e 44 6f 63 6c 69 73 74 20 3d 20 28 69 54 65 72  nDoclist = (iTer
30d60 6d 4f 66 66 20 3f 20 69 54 65 72 6d 4f 66 66 20  mOff ? iTermOff 
30d70 3a 20 73 7a 4c 65 61 66 29 20 2d 20 69 4f 66 66  : szLeaf) - iOff
30d80 3b 0a 20 20 20 20 66 74 73 35 44 65 63 6f 64 65  ;.    fts5Decode
30d90 44 6f 63 6c 69 73 74 28 26 72 63 2c 20 26 73 2c  Doclist(&rc, &s,
30da0 20 26 61 5b 69 4f 66 66 5d 2c 20 6e 44 6f 63 6c   &a[iOff], nDocl
30db0 69 73 74 29 3b 0a 0a 20 20 20 20 77 68 69 6c 65  ist);..    while
30dc0 28 20 69 50 67 69 64 78 4f 66 66 3c 6e 20 29 7b  ( iPgidxOff<n ){
30dd0 0a 20 20 20 20 20 20 69 6e 74 20 62 46 69 72 73  .      int bFirs
30de0 74 20 3d 20 28 69 50 67 69 64 78 4f 66 66 3d 3d  t = (iPgidxOff==
30df0 73 7a 4c 65 61 66 29 3b 20 20 20 20 20 2f 2a 20  szLeaf);     /* 
30e00 54 72 75 65 20 66 6f 72 20 66 69 72 73 74 20 74  True for first t
30e10 65 72 6d 20 6f 6e 20 70 61 67 65 20 2a 2f 0a 20  erm on page */. 
30e20 20 20 20 20 20 69 6e 74 20 6e 42 79 74 65 3b 20       int nByte; 
30e30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30e40 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79             /* By
30e50 74 65 73 20 6f 66 20 64 61 74 61 20 2a 2f 0a 20  tes of data */. 
30e60 20 20 20 20 20 69 6e 74 20 69 45 6e 64 3b 0a 20       int iEnd;. 
30e70 20 20 20 20 20 0a 20 20 20 20 20 20 69 50 67 69       .      iPgi
30e80 64 78 4f 66 66 20 2b 3d 20 66 74 73 35 47 65 74  dxOff += fts5Get
30e90 56 61 72 69 6e 74 33 32 28 26 61 5b 69 50 67 69  Varint32(&a[iPgi
30ea0 64 78 4f 66 66 5d 2c 20 6e 42 79 74 65 29 3b 0a  dxOff], nByte);.
30eb0 20 20 20 20 20 20 69 50 67 69 64 78 50 72 65 76        iPgidxPrev
30ec0 20 2b 3d 20 6e 42 79 74 65 3b 0a 20 20 20 20 20   += nByte;.     
30ed0 20 69 4f 66 66 20 3d 20 69 50 67 69 64 78 50 72   iOff = iPgidxPr
30ee0 65 76 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 69  ev;..      if( i
30ef0 50 67 69 64 78 4f 66 66 3c 6e 20 29 7b 0a 20 20  PgidxOff<n ){.  
30f00 20 20 20 20 20 20 66 74 73 35 47 65 74 56 61 72        fts5GetVar
30f10 69 6e 74 33 32 28 26 61 5b 69 50 67 69 64 78 4f  int32(&a[iPgidxO
30f20 66 66 5d 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20  ff], nByte);.   
30f30 20 20 20 20 20 69 45 6e 64 20 3d 20 69 50 67 69       iEnd = iPgi
30f40 64 78 50 72 65 76 20 2b 20 6e 42 79 74 65 3b 0a  dxPrev + nByte;.
30f50 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
30f60 20 20 20 20 20 69 45 6e 64 20 3d 20 73 7a 4c 65       iEnd = szLe
30f70 61 66 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  af;.      }..   
30f80 20 20 20 69 66 28 20 62 46 69 72 73 74 3d 3d 30     if( bFirst==0
30f90 20 29 7b 0a 20 20 20 20 20 20 20 20 69 4f 66 66   ){.        iOff
30fa0 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e   += fts5GetVarin
30fb0 74 33 32 28 26 61 5b 69 4f 66 66 5d 2c 20 6e 42  t32(&a[iOff], nB
30fc0 79 74 65 29 3b 0a 20 20 20 20 20 20 20 20 74 65  yte);.        te
30fd0 72 6d 2e 6e 20 3d 20 6e 42 79 74 65 3b 0a 20 20  rm.n = nByte;.  
30fe0 20 20 20 20 7d 0a 20 20 20 20 20 20 69 4f 66 66      }.      iOff
30ff0 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e   += fts5GetVarin
31000 74 33 32 28 26 61 5b 69 4f 66 66 5d 2c 20 6e 42  t32(&a[iOff], nB
31010 79 74 65 29 3b 0a 20 20 20 20 20 20 66 74 73 35  yte);.      fts5
31020 42 75 66 66 65 72 41 70 70 65 6e 64 42 6c 6f 62  BufferAppendBlob
31030 28 26 72 63 2c 20 26 74 65 72 6d 2c 20 6e 42 79  (&rc, &term, nBy
31040 74 65 2c 20 26 61 5b 69 4f 66 66 5d 29 3b 0a 20  te, &a[iOff]);. 
31050 20 20 20 20 20 69 4f 66 66 20 2b 3d 20 6e 42 79       iOff += nBy
31060 74 65 3b 0a 0a 20 20 20 20 20 20 73 71 6c 69 74  te;..      sqlit
31070 65 33 46 74 73 35 42 75 66 66 65 72 41 70 70 65  e3Fts5BufferAppe
31080 6e 64 50 72 69 6e 74 66 28 0a 20 20 20 20 20 20  ndPrintf(.      
31090 20 20 20 20 26 72 63 2c 20 26 73 2c 20 22 20 74      &rc, &s, " t
310a0 65 72 6d 3d 25 2e 2a 73 22 2c 20 74 65 72 6d 2e  erm=%.*s", term.
310b0 6e 2c 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29  n, (const char*)
310c0 74 65 72 6d 2e 70 0a 20 20 20 20 20 20 29 3b 0a  term.p.      );.
310d0 20 20 20 20 20 20 69 4f 66 66 20 2b 3d 20 66 74        iOff += ft
310e0 73 35 44 65 63 6f 64 65 44 6f 63 6c 69 73 74 28  s5DecodeDoclist(
310f0 26 72 63 2c 20 26 73 2c 20 26 61 5b 69 4f 66 66  &rc, &s, &a[iOff
31100 5d 2c 20 69 45 6e 64 2d 69 4f 66 66 29 3b 0a 20  ], iEnd-iOff);. 
31110 20 20 20 7d 0a 0a 20 20 20 20 66 74 73 35 42 75     }..    fts5Bu
31120 66 66 65 72 46 72 65 65 28 26 74 65 72 6d 29 3b  fferFree(&term);
31130 0a 20 20 7d 0a 20 20 0a 20 64 65 63 6f 64 65 5f  .  }.  . decode_
31140 6f 75 74 3a 0a 20 20 73 71 6c 69 74 65 33 5f 66  out:.  sqlite3_f
31150 72 65 65 28 61 29 3b 0a 20 20 69 66 28 20 72 63  ree(a);.  if( rc
31160 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
31170 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
31180 74 5f 74 65 78 74 28 70 43 74 78 2c 20 28 63 6f  t_text(pCtx, (co
31190 6e 73 74 20 63 68 61 72 2a 29 73 2e 70 2c 20 73  nst char*)s.p, s
311a0 2e 6e 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53  .n, SQLITE_TRANS
311b0 49 45 4e 54 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  IENT);.  }else{.
311c0 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
311d0 6c 74 5f 65 72 72 6f 72 5f 63 6f 64 65 28 70 43  lt_error_code(pC
311e0 74 78 2c 20 72 63 29 3b 0a 20 20 7d 0a 20 20 66  tx, rc);.  }.  f
311f0 74 73 35 42 75 66 66 65 72 46 72 65 65 28 26 73  ts5BufferFree(&s
31200 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  );.}../*.** The 
31210 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f  implementation o
31220 66 20 75 73 65 72 2d 64 65 66 69 6e 65 64 20 73  f user-defined s
31230 63 61 6c 61 72 20 66 75 6e 63 74 69 6f 6e 20 66  calar function f
31240 74 73 35 5f 72 6f 77 69 64 28 29 2e 0a 2a 2f 0a  ts5_rowid()..*/.
31250 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
31260 52 6f 77 69 64 46 75 6e 63 74 69 6f 6e 28 0a 20  RowidFunction(. 
31270 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74   sqlite3_context
31280 20 2a 70 43 74 78 2c 20 20 20 20 20 20 20 20 20   *pCtx,         
31290 20 2f 2a 20 46 75 6e 63 74 69 6f 6e 20 63 61 6c   /* Function cal
312a0 6c 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 69  l context */.  i
312b0 6e 74 20 6e 41 72 67 2c 20 20 20 20 20 20 20 20  nt nArg,        
312c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
312d0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 73  * Number of args
312e0 20 28 61 6c 77 61 79 73 20 32 29 20 2a 2f 0a 20   (always 2) */. 
312f0 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
31300 2a 61 70 56 61 6c 20 20 20 20 20 20 20 20 20 20  *apVal          
31310 20 2f 2a 20 46 75 6e 63 74 69 6f 6e 20 61 72 67   /* Function arg
31320 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 63  uments */.){.  c
31330 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41 72 67 3b  onst char *zArg;
31340 0a 20 20 69 66 28 20 6e 41 72 67 3d 3d 30 20 29  .  if( nArg==0 )
31350 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65  {.    sqlite3_re
31360 73 75 6c 74 5f 65 72 72 6f 72 28 70 43 74 78 2c  sult_error(pCtx,
31370 20 22 73 68 6f 75 6c 64 20 62 65 3a 20 66 74 73   "should be: fts
31380 35 5f 72 6f 77 69 64 28 73 75 62 6a 65 63 74 2c  5_rowid(subject,
31390 20 2e 2e 2e 2e 29 22 2c 20 2d 31 29 3b 0a 20 20   ....)", -1);.  
313a0 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 41 72 67 20  }else{.    zArg 
313b0 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73  = (const char*)s
313c0 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78  qlite3_value_tex
313d0 74 28 61 70 56 61 6c 5b 30 5d 29 3b 0a 20 20 20  t(apVal[0]);.   
313e0 20 69 66 28 20 30 3d 3d 73 71 6c 69 74 65 33 5f   if( 0==sqlite3_
313f0 73 74 72 69 63 6d 70 28 7a 41 72 67 2c 20 22 73  stricmp(zArg, "s
31400 65 67 6d 65 6e 74 22 29 20 29 7b 0a 20 20 20 20  egment") ){.    
31410 20 20 69 36 34 20 69 52 6f 77 69 64 3b 0a 20 20    i64 iRowid;.  
31420 20 20 20 20 69 6e 74 20 73 65 67 69 64 2c 20 70      int segid, p
31430 67 6e 6f 3b 0a 20 20 20 20 20 20 69 66 28 20 6e  gno;.      if( n
31440 41 72 67 21 3d 33 20 29 7b 0a 20 20 20 20 20 20  Arg!=3 ){.      
31450 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
31460 5f 65 72 72 6f 72 28 70 43 74 78 2c 20 0a 20 20  _error(pCtx, .  
31470 20 20 20 20 20 20 20 20 20 20 22 73 68 6f 75 6c            "shoul
31480 64 20 62 65 3a 20 66 74 73 35 5f 72 6f 77 69 64  d be: fts5_rowid
31490 28 27 73 65 67 6d 65 6e 74 27 2c 20 73 65 67 69  ('segment', segi
314a0 64 2c 20 70 67 6e 6f 29 29 22 2c 20 2d 31 0a 20  d, pgno))", -1. 
314b0 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20         );.      
314c0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
314d0 65 67 69 64 20 3d 20 73 71 6c 69 74 65 33 5f 76  egid = sqlite3_v
314e0 61 6c 75 65 5f 69 6e 74 28 61 70 56 61 6c 5b 31  alue_int(apVal[1
314f0 5d 29 3b 0a 20 20 20 20 20 20 20 20 70 67 6e 6f  ]);.        pgno
31500 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65   = sqlite3_value
31510 5f 69 6e 74 28 61 70 56 61 6c 5b 32 5d 29 3b 0a  _int(apVal[2]);.
31520 20 20 20 20 20 20 20 20 69 52 6f 77 69 64 20 3d          iRowid =
31530 20 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f 52 4f   FTS5_SEGMENT_RO
31540 57 49 44 28 73 65 67 69 64 2c 20 70 67 6e 6f 29  WID(segid, pgno)
31550 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
31560 33 5f 72 65 73 75 6c 74 5f 69 6e 74 36 34 28 70  3_result_int64(p
31570 43 74 78 2c 20 69 52 6f 77 69 64 29 3b 0a 20 20  Ctx, iRowid);.  
31580 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b      }.    }else{
31590 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72  .      sqlite3_r
315a0 65 73 75 6c 74 5f 65 72 72 6f 72 28 70 43 74 78  esult_error(pCtx
315b0 2c 20 0a 20 20 20 20 20 20 20 20 22 66 69 72 73  , .        "firs
315c0 74 20 61 72 67 20 74 6f 20 66 74 73 35 5f 72 6f  t arg to fts5_ro
315d0 77 69 64 28 29 20 6d 75 73 74 20 62 65 20 27 73  wid() must be 's
315e0 65 67 6d 65 6e 74 27 22 20 2c 20 2d 31 0a 20 20  egment'" , -1.  
315f0 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d      );.    }.  }
31600 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69  .}../*.** This i
31610 73 20 63 61 6c 6c 65 64 20 61 73 20 70 61 72 74  s called as part
31620 20 6f 66 20 72 65 67 69 73 74 65 72 69 6e 67 20   of registering 
31630 74 68 65 20 46 54 53 35 20 6d 6f 64 75 6c 65 20  the FTS5 module 
31640 77 69 74 68 20 64 61 74 61 62 61 73 65 0a 2a 2a  with database.**
31650 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 64 62 2e 20   connection db. 
31660 49 74 20 72 65 67 69 73 74 65 72 73 20 73 65 76  It registers sev
31670 65 72 61 6c 20 75 73 65 72 2d 64 65 66 69 6e 65  eral user-define
31680 64 20 73 63 61 6c 61 72 20 66 75 6e 63 74 69 6f  d scalar functio
31690 6e 73 20 75 73 65 66 75 6c 0a 2a 2a 20 77 69 74  ns useful.** wit
316a0 68 20 46 54 53 35 2e 0a 2a 2a 0a 2a 2a 20 49 66  h FTS5..**.** If
316b0 20 73 75 63 63 65 73 73 66 75 6c 2c 20 53 51 4c   successful, SQL
316c0 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
316d0 65 64 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20  ed. If an error 
316e0 6f 63 63 75 72 73 2c 20 73 6f 6d 65 20 6f 74 68  occurs, some oth
316f0 65 72 0a 2a 2a 20 53 51 4c 69 74 65 20 65 72 72  er.** SQLite err
31700 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72  or code is retur
31710 6e 65 64 20 69 6e 73 74 65 61 64 2e 0a 2a 2f 0a  ned instead..*/.
31720 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 49  int sqlite3Fts5I
31730 6e 64 65 78 49 6e 69 74 28 73 71 6c 69 74 65 33  ndexInit(sqlite3
31740 20 2a 64 62 29 7b 0a 20 20 69 6e 74 20 72 63 20   *db){.  int rc 
31750 3d 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65  = sqlite3_create
31760 5f 66 75 6e 63 74 69 6f 6e 28 0a 20 20 20 20 20  _function(.     
31770 20 64 62 2c 20 22 66 74 73 35 5f 64 65 63 6f 64   db, "fts5_decod
31780 65 22 2c 20 32 2c 20 53 51 4c 49 54 45 5f 55 54  e", 2, SQLITE_UT
31790 46 38 2c 20 30 2c 20 66 74 73 35 44 65 63 6f 64  F8, 0, fts5Decod
317a0 65 46 75 6e 63 74 69 6f 6e 2c 20 30 2c 20 30 0a  eFunction, 0, 0.
317b0 20 20 29 3b 0a 0a 20 20 69 66 28 20 72 63 3d 3d    );..  if( rc==
317c0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
317d0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 63 72   rc = sqlite3_cr
317e0 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 0a 20  eate_function(. 
317f0 20 20 20 20 20 20 20 64 62 2c 20 22 66 74 73 35         db, "fts5
31800 5f 64 65 63 6f 64 65 5f 6e 6f 6e 65 22 2c 20 32  _decode_none", 2
31810 2c 20 0a 20 20 20 20 20 20 20 20 53 51 4c 49 54  , .        SQLIT
31820 45 5f 55 54 46 38 2c 20 28 76 6f 69 64 2a 29 64  E_UTF8, (void*)d
31830 62 2c 20 66 74 73 35 44 65 63 6f 64 65 46 75 6e  b, fts5DecodeFun
31840 63 74 69 6f 6e 2c 20 30 2c 20 30 0a 20 20 20 20  ction, 0, 0.    
31850 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63  );.  }..  if( rc
31860 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
31870 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f     rc = sqlite3_
31880 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28  create_function(
31890 0a 20 20 20 20 20 20 20 20 64 62 2c 20 22 66 74  .        db, "ft
318a0 73 35 5f 72 6f 77 69 64 22 2c 20 2d 31 2c 20 53  s5_rowid", -1, S
318b0 51 4c 49 54 45 5f 55 54 46 38 2c 20 30 2c 20 66  QLITE_UTF8, 0, f
318c0 74 73 35 52 6f 77 69 64 46 75 6e 63 74 69 6f 6e  ts5RowidFunction
318d0 2c 20 30 2c 20 30 0a 20 20 20 20 29 3b 0a 20 20  , 0, 0.    );.  
318e0 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
318f0 0a 0a 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74  ...int sqlite3Ft
31900 73 35 49 6e 64 65 78 52 65 73 65 74 28 46 74 73  s5IndexReset(Fts
31910 35 49 6e 64 65 78 20 2a 70 29 7b 0a 20 20 61 73  5Index *p){.  as
31920 73 65 72 74 28 20 70 2d 3e 70 53 74 72 75 63 74  sert( p->pStruct
31930 3d 3d 30 20 7c 7c 20 70 2d 3e 69 53 74 72 75 63  ==0 || p->iStruc
31940 74 56 65 72 73 69 6f 6e 21 3d 30 20 29 3b 0a 20  tVersion!=0 );. 
31950 20 69 66 28 20 66 74 73 35 49 6e 64 65 78 44 61   if( fts5IndexDa
31960 74 61 56 65 72 73 69 6f 6e 28 70 29 21 3d 70 2d  taVersion(p)!=p-
31970 3e 69 53 74 72 75 63 74 56 65 72 73 69 6f 6e 20  >iStructVersion 
31980 29 7b 0a 20 20 20 20 66 74 73 35 53 74 72 75 63  ){.    fts5Struc
31990 74 75 72 65 49 6e 76 61 6c 69 64 61 74 65 28 70  tureInvalidate(p
319a0 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
319b0 66 74 73 35 49 6e 64 65 78 52 65 74 75 72 6e 28  fts5IndexReturn(
319c0 70 29 3b 0a 7d 0a                                p);.}.