/ Hex Artifact Content
Login
SQLite training in Houston TX on 2019-11-05 (details)
Part of the 2019 Tcl Conference

Artifact 6589ccacbaa049b714a8ae4ab495dc6876fb4b449b16c3041f71b85f12c75e5f:


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 42 75 66 66 65 72 20 70 6f 73 6c   Fts5Buffer posl
4d20: 69 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  ist;            
4d30: 20 2f 2a 20 42 75 66 66 65 72 20 63 6f 6e 74 61   /* Buffer conta
4d40: 69 6e 69 6e 67 20 63 75 72 72 65 6e 74 20 70 6f  ining current po
4d50: 73 6c 69 73 74 20 2a 2f 0a 20 20 46 74 73 35 43  slist */.  Fts5C
4d60: 6f 6c 73 65 74 20 2a 70 43 6f 6c 73 65 74 3b 20  olset *pColset; 
4d70: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
4d80: 73 74 72 69 63 74 20 6d 61 74 63 68 65 73 20 74  strict matches t
4d90: 6f 20 74 68 65 73 65 20 63 6f 6c 75 6d 6e 73 20  o these columns 
4da0: 2a 2f 0a 0a 20 20 2f 2a 20 49 6e 76 6f 6b 65 64  */..  /* Invoked
4db0: 20 74 6f 20 73 65 74 20 6f 75 74 70 75 74 20 76   to set output v
4dc0: 61 72 69 61 62 6c 65 73 2e 20 2a 2f 0a 20 20 76  ariables. */.  v
4dd0: 6f 69 64 20 28 2a 78 53 65 74 4f 75 74 70 75 74  oid (*xSetOutput
4de0: 73 29 28 46 74 73 35 49 74 65 72 2a 2c 20 46 74  s)(Fts5Iter*, Ft
4df0: 73 35 53 65 67 49 74 65 72 2a 29 3b 0a 0a 20 20  s5SegIter*);..  
4e00: 69 6e 74 20 6e 53 65 67 3b 20 20 20 20 20 20 20  int nSeg;       
4e10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4e20: 2f 2a 20 53 69 7a 65 20 6f 66 20 61 53 65 67 5b  /* Size of aSeg[
4e30: 5d 20 61 72 72 61 79 20 2a 2f 0a 20 20 69 6e 74  ] array */.  int
4e40: 20 62 52 65 76 3b 20 20 20 20 20 20 20 20 20 20   bRev;          
4e50: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
4e60: 54 72 75 65 20 74 6f 20 69 74 65 72 61 74 65 20  True to iterate 
4e70: 69 6e 20 72 65 76 65 72 73 65 20 6f 72 64 65 72  in reverse order
4e80: 20 2a 2f 0a 20 20 75 38 20 62 53 6b 69 70 45 6d   */.  u8 bSkipEm
4e90: 70 74 79 3b 20 20 20 20 20 20 20 20 20 20 20 20  pty;            
4ea0: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f        /* True to
4eb0: 20 73 6b 69 70 20 64 65 6c 65 74 65 64 20 65 6e   skip deleted en
4ec0: 74 72 69 65 73 20 2a 2f 0a 0a 20 20 69 36 34 20  tries */..  i64 
4ed0: 69 53 77 69 74 63 68 52 6f 77 69 64 3b 20 20 20  iSwitchRowid;   
4ee0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
4ef0: 69 72 73 74 65 73 74 20 72 6f 77 69 64 20 6f 66  irstest rowid of
4f00: 20 6f 74 68 65 72 20 74 68 61 6e 20 61 46 69 72   other than aFir
4f10: 73 74 5b 31 5d 20 2a 2f 0a 20 20 46 74 73 35 43  st[1] */.  Fts5C
4f20: 52 65 73 75 6c 74 20 2a 61 46 69 72 73 74 3b 20  Result *aFirst; 
4f30: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75             /* Cu
4f40: 72 72 65 6e 74 20 6d 65 72 67 65 20 73 74 61 74  rrent merge stat
4f50: 65 20 28 73 65 65 20 61 62 6f 76 65 29 20 2a 2f  e (see above) */
4f60: 0a 20 20 46 74 73 35 53 65 67 49 74 65 72 20 61  .  Fts5SegIter a
4f70: 53 65 67 5b 31 5d 3b 20 20 20 20 20 20 20 20 20  Seg[1];         
4f80: 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 73     /* Array of s
4f90: 65 67 6d 65 6e 74 20 69 74 65 72 61 74 6f 72 73  egment iterators
4fa0: 20 2a 2f 0a 7d 3b 0a 0a 0a 2f 2a 0a 2a 2a 20 41   */.};.../*.** A
4fb0: 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68  n instance of th
4fc0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 79 70 65  e following type
4fd0: 20 69 73 20 75 73 65 64 20 74 6f 20 69 74 65 72   is used to iter
4fe0: 61 74 65 20 74 68 72 6f 75 67 68 20 74 68 65 20  ate through the 
4ff0: 63 6f 6e 74 65 6e 74 73 0a 2a 2a 20 6f 66 20 61  contents.** of a
5000: 20 64 6f 63 6c 69 73 74 2d 69 6e 64 65 78 20 72   doclist-index r
5010: 65 63 6f 72 64 2e 0a 2a 2a 0a 2a 2a 20 70 44 61  ecord..**.** pDa
5020: 74 61 3a 0a 2a 2a 20 20 20 52 65 63 6f 72 64 20  ta:.**   Record 
5030: 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 64  containing the d
5040: 6f 63 6c 69 73 74 2d 69 6e 64 65 78 20 64 61 74  oclist-index dat
5050: 61 2e 0a 2a 2a 0a 2a 2a 20 62 45 6f 66 3a 0a 2a  a..**.** bEof:.*
5060: 2a 20 20 20 53 65 74 20 74 6f 20 74 72 75 65 20  *   Set to true 
5070: 6f 6e 63 65 20 69 74 65 72 61 74 6f 72 20 68 61  once iterator ha
5080: 73 20 72 65 61 63 68 65 64 20 45 4f 46 2e 0a 2a  s reached EOF..*
5090: 2a 0a 2a 2a 20 69 4f 66 66 3a 0a 2a 2a 20 20 20  *.** iOff:.**   
50a0: 53 65 74 20 74 6f 20 74 68 65 20 63 75 72 72 65  Set to the curre
50b0: 6e 74 20 6f 66 66 73 65 74 20 77 69 74 68 69 6e  nt offset within
50c0: 20 72 65 63 6f 72 64 20 70 44 61 74 61 2e 0a 2a   record pData..*
50d0: 2f 0a 73 74 72 75 63 74 20 46 74 73 35 44 6c 69  /.struct Fts5Dli
50e0: 64 78 4c 76 6c 20 7b 0a 20 20 46 74 73 35 44 61  dxLvl {.  Fts5Da
50f0: 74 61 20 2a 70 44 61 74 61 3b 20 20 20 20 20 20  ta *pData;      
5100: 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 20          /* Data 
5110: 66 6f 72 20 63 75 72 72 65 6e 74 20 70 61 67 65  for current page
5120: 20 6f 66 20 74 68 69 73 20 6c 65 76 65 6c 20 2a   of this level *
5130: 2f 0a 20 20 69 6e 74 20 69 4f 66 66 3b 20 20 20  /.  int iOff;   
5140: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5150: 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 6f 66 66    /* Current off
5160: 73 65 74 20 69 6e 74 6f 20 70 44 61 74 61 20 2a  set into pData *
5170: 2f 0a 20 20 69 6e 74 20 62 45 6f 66 3b 20 20 20  /.  int bEof;   
5180: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5190: 20 20 2f 2a 20 41 74 20 45 4f 46 20 61 6c 72 65    /* At EOF alre
51a0: 61 64 79 20 2a 2f 0a 20 20 69 6e 74 20 69 46 69  ady */.  int iFi
51b0: 72 73 74 4f 66 66 3b 20 20 20 20 20 20 20 20 20  rstOff;         
51c0: 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20 62         /* Used b
51d0: 79 20 72 65 76 65 72 73 65 20 69 74 65 72 61 74  y reverse iterat
51e0: 6f 72 73 20 2a 2f 0a 0a 20 20 2f 2a 20 4f 75 74  ors */..  /* Out
51f0: 70 75 74 20 76 61 72 69 61 62 6c 65 73 20 2a 2f  put variables */
5200: 0a 20 20 69 6e 74 20 69 4c 65 61 66 50 67 6e 6f  .  int iLeafPgno
5210: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
5220: 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20   /* Page number 
5230: 6f 66 20 63 75 72 72 65 6e 74 20 6c 65 61 66 20  of current leaf 
5240: 70 61 67 65 20 2a 2f 0a 20 20 69 36 34 20 69 52  page */.  i64 iR
5250: 6f 77 69 64 3b 20 20 20 20 20 20 20 20 20 20 20  owid;           
5260: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
5270: 20 72 6f 77 69 64 20 6f 6e 20 6c 65 61 66 20 69   rowid on leaf i
5280: 4c 65 61 66 50 67 6e 6f 20 2a 2f 0a 7d 3b 0a 73  LeafPgno */.};.s
5290: 74 72 75 63 74 20 46 74 73 35 44 6c 69 64 78 49  truct Fts5DlidxI
52a0: 74 65 72 20 7b 0a 20 20 69 6e 74 20 6e 4c 76 6c  ter {.  int nLvl
52b0: 3b 0a 20 20 69 6e 74 20 69 53 65 67 69 64 3b 0a  ;.  int iSegid;.
52c0: 20 20 46 74 73 35 44 6c 69 64 78 4c 76 6c 20 61    Fts5DlidxLvl a
52d0: 4c 76 6c 5b 31 5d 3b 0a 7d 3b 0a 0a 73 74 61 74  Lvl[1];.};..stat
52e0: 69 63 20 76 6f 69 64 20 66 74 73 35 50 75 74 55  ic void fts5PutU
52f0: 31 36 28 75 38 20 2a 61 4f 75 74 2c 20 75 31 36  16(u8 *aOut, u16
5300: 20 69 56 61 6c 29 7b 0a 20 20 61 4f 75 74 5b 30   iVal){.  aOut[0
5310: 5d 20 3d 20 28 69 56 61 6c 3e 3e 38 29 3b 0a 20  ] = (iVal>>8);. 
5320: 20 61 4f 75 74 5b 31 5d 20 3d 20 28 69 56 61 6c   aOut[1] = (iVal
5330: 26 30 78 46 46 29 3b 0a 7d 0a 0a 73 74 61 74 69  &0xFF);.}..stati
5340: 63 20 75 31 36 20 66 74 73 35 47 65 74 55 31 36  c u16 fts5GetU16
5350: 28 63 6f 6e 73 74 20 75 38 20 2a 61 49 6e 29 7b  (const u8 *aIn){
5360: 0a 20 20 72 65 74 75 72 6e 20 28 28 75 31 36 29  .  return ((u16)
5370: 61 49 6e 5b 30 5d 20 3c 3c 20 38 29 20 2b 20 61  aIn[0] << 8) + a
5380: 49 6e 5b 31 5d 3b 0a 7d 20 0a 0a 2f 2a 0a 2a 2a  In[1];.} ../*.**
5390: 20 41 6c 6c 6f 63 61 74 65 20 61 6e 64 20 72 65   Allocate and re
53a0: 74 75 72 6e 20 61 20 62 75 66 66 65 72 20 61 74  turn a buffer at
53b0: 20 6c 65 61 73 74 20 6e 42 79 74 65 20 62 79 74   least nByte byt
53c0: 65 73 20 69 6e 20 73 69 7a 65 2e 0a 2a 2a 0a 2a  es in size..**.*
53d0: 2a 20 49 66 20 61 6e 20 4f 4f 4d 20 65 72 72 6f  * If an OOM erro
53e0: 72 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64  r is encountered
53f0: 2c 20 72 65 74 75 72 6e 20 4e 55 4c 4c 20 61 6e  , return NULL an
5400: 64 20 73 65 74 20 74 68 65 20 65 72 72 6f 72 20  d set the error 
5410: 63 6f 64 65 20 69 6e 0a 2a 2a 20 74 68 65 20 46  code in.** the F
5420: 74 73 35 49 6e 64 65 78 20 68 61 6e 64 6c 65 20  ts5Index handle 
5430: 70 61 73 73 65 64 20 61 73 20 74 68 65 20 66 69  passed as the fi
5440: 72 73 74 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f  rst argument..*/
5450: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 2a 66 74  .static void *ft
5460: 73 35 49 64 78 4d 61 6c 6c 6f 63 28 46 74 73 35  s5IdxMalloc(Fts5
5470: 49 6e 64 65 78 20 2a 70 2c 20 73 71 6c 69 74 65  Index *p, sqlite
5480: 33 5f 69 6e 74 36 34 20 6e 42 79 74 65 29 7b 0a  3_int64 nByte){.
5490: 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
54a0: 46 74 73 35 4d 61 6c 6c 6f 63 5a 65 72 6f 28 26  Fts5MallocZero(&
54b0: 70 2d 3e 72 63 2c 20 6e 42 79 74 65 29 3b 0a 7d  p->rc, nByte);.}
54c0: 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65 20  ../*.** Compare 
54d0: 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
54e0: 74 68 65 20 70 4c 65 66 74 20 62 75 66 66 65 72  the pLeft buffer
54f0: 20 77 69 74 68 20 74 68 65 20 70 52 69 67 68 74   with the pRight
5500: 2f 6e 52 69 67 68 74 20 62 6c 6f 62 2e 0a 2a 2a  /nRight blob..**
5510: 0a 2a 2a 20 52 65 74 75 72 6e 20 2d 76 65 20 69  .** Return -ve i
5520: 66 20 70 4c 65 66 74 20 69 73 20 73 6d 61 6c 6c  f pLeft is small
5530: 65 72 20 74 68 61 6e 20 70 52 69 67 68 74 2c 20  er than pRight, 
5540: 30 20 69 66 20 74 68 65 79 20 61 72 65 20 65 71  0 if they are eq
5550: 75 61 6c 20 6f 72 0a 2a 2a 20 2b 76 65 20 69 66  ual or.** +ve if
5560: 20 70 52 69 67 68 74 20 69 73 20 73 6d 61 6c 6c   pRight is small
5570: 65 72 20 74 68 61 6e 20 70 4c 65 66 74 2e 20 49  er than pLeft. I
5580: 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 3a 0a 2a  n other words:.*
5590: 2a 0a 2a 2a 20 20 20 20 20 72 65 73 20 3d 20 2a  *.**     res = *
55a0: 70 4c 65 66 74 20 2d 20 2a 70 52 69 67 68 74 0a  pLeft - *pRight.
55b0: 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
55c0: 5f 44 45 42 55 47 0a 73 74 61 74 69 63 20 69 6e  _DEBUG.static in
55d0: 74 20 66 74 73 35 42 75 66 66 65 72 43 6f 6d 70  t fts5BufferComp
55e0: 61 72 65 42 6c 6f 62 28 0a 20 20 46 74 73 35 42  areBlob(.  Fts5B
55f0: 75 66 66 65 72 20 2a 70 4c 65 66 74 2c 20 20 20  uffer *pLeft,   
5600: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65             /* Le
5610: 66 74 20 68 61 6e 64 20 73 69 64 65 20 6f 66 20  ft hand side of 
5620: 63 6f 6d 70 61 72 69 73 6f 6e 20 2a 2f 0a 20 20  comparison */.  
5630: 63 6f 6e 73 74 20 75 38 20 2a 70 52 69 67 68 74  const u8 *pRight
5640: 2c 20 69 6e 74 20 6e 52 69 67 68 74 20 20 20 20  , int nRight    
5650: 2f 2a 20 52 69 67 68 74 20 68 61 6e 64 20 73 69  /* Right hand si
5660: 64 65 20 6f 66 20 63 6f 6d 70 61 72 69 73 6f 6e  de of comparison
5670: 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 43 6d   */.){.  int nCm
5680: 70 20 3d 20 4d 49 4e 28 70 4c 65 66 74 2d 3e 6e  p = MIN(pLeft->n
5690: 2c 20 6e 52 69 67 68 74 29 3b 0a 20 20 69 6e 74  , nRight);.  int
56a0: 20 72 65 73 20 3d 20 6d 65 6d 63 6d 70 28 70 4c   res = memcmp(pL
56b0: 65 66 74 2d 3e 70 2c 20 70 52 69 67 68 74 2c 20  eft->p, pRight, 
56c0: 6e 43 6d 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  nCmp);.  return 
56d0: 28 72 65 73 3d 3d 30 20 3f 20 28 70 4c 65 66 74  (res==0 ? (pLeft
56e0: 2d 3e 6e 20 2d 20 6e 52 69 67 68 74 29 20 3a 20  ->n - nRight) : 
56f0: 72 65 73 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  res);.}.#endif..
5700: 2f 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65 20 74 68  /*.** Compare th
5710: 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
5720: 65 20 74 77 6f 20 62 75 66 66 65 72 73 20 75 73  e two buffers us
5730: 69 6e 67 20 6d 65 6d 63 6d 70 28 29 2e 20 49 66  ing memcmp(). If
5740: 20 6f 6e 65 20 62 75 66 66 65 72 0a 2a 2a 20 69   one buffer.** i
5750: 73 20 61 20 70 72 65 66 69 78 20 6f 66 20 74 68  s a prefix of th
5760: 65 20 6f 74 68 65 72 2c 20 69 74 20 69 73 20 63  e other, it is c
5770: 6f 6e 73 69 64 65 72 65 64 20 74 68 65 20 6c 65  onsidered the le
5780: 73 73 65 72 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75  sser..**.** Retu
5790: 72 6e 20 2d 76 65 20 69 66 20 70 4c 65 66 74 20  rn -ve if pLeft 
57a0: 69 73 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20  is smaller than 
57b0: 70 52 69 67 68 74 2c 20 30 20 69 66 20 74 68 65  pRight, 0 if the
57c0: 79 20 61 72 65 20 65 71 75 61 6c 20 6f 72 0a 2a  y are equal or.*
57d0: 2a 20 2b 76 65 20 69 66 20 70 52 69 67 68 74 20  * +ve if pRight 
57e0: 69 73 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20  is smaller than 
57f0: 70 4c 65 66 74 2e 20 49 6e 20 6f 74 68 65 72 20  pLeft. In other 
5800: 77 6f 72 64 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  words:.**.**    
5810: 20 72 65 73 20 3d 20 2a 70 4c 65 66 74 20 2d 20   res = *pLeft - 
5820: 2a 70 52 69 67 68 74 0a 2a 2f 0a 73 74 61 74 69  *pRight.*/.stati
5830: 63 20 69 6e 74 20 66 74 73 35 42 75 66 66 65 72  c int fts5Buffer
5840: 43 6f 6d 70 61 72 65 28 46 74 73 35 42 75 66 66  Compare(Fts5Buff
5850: 65 72 20 2a 70 4c 65 66 74 2c 20 46 74 73 35 42  er *pLeft, Fts5B
5860: 75 66 66 65 72 20 2a 70 52 69 67 68 74 29 7b 0a  uffer *pRight){.
5870: 20 20 69 6e 74 20 6e 43 6d 70 20 3d 20 4d 49 4e    int nCmp = MIN
5880: 28 70 4c 65 66 74 2d 3e 6e 2c 20 70 52 69 67 68  (pLeft->n, pRigh
5890: 74 2d 3e 6e 29 3b 0a 20 20 69 6e 74 20 72 65 73  t->n);.  int res
58a0: 20 3d 20 66 74 73 35 4d 65 6d 63 6d 70 28 70 4c   = fts5Memcmp(pL
58b0: 65 66 74 2d 3e 70 2c 20 70 52 69 67 68 74 2d 3e  eft->p, pRight->
58c0: 70 2c 20 6e 43 6d 70 29 3b 0a 20 20 72 65 74 75  p, nCmp);.  retu
58d0: 72 6e 20 28 72 65 73 3d 3d 30 20 3f 20 28 70 4c  rn (res==0 ? (pL
58e0: 65 66 74 2d 3e 6e 20 2d 20 70 52 69 67 68 74 2d  eft->n - pRight-
58f0: 3e 6e 29 20 3a 20 72 65 73 29 3b 0a 7d 0a 0a 73  >n) : res);.}..s
5900: 74 61 74 69 63 20 69 6e 74 20 66 74 73 35 4c 65  tatic int fts5Le
5910: 61 66 46 69 72 73 74 54 65 72 6d 4f 66 66 28 46  afFirstTermOff(F
5920: 74 73 35 44 61 74 61 20 2a 70 4c 65 61 66 29 7b  ts5Data *pLeaf){
5930: 0a 20 20 69 6e 74 20 72 65 74 3b 0a 20 20 66 74  .  int ret;.  ft
5940: 73 35 47 65 74 56 61 72 69 6e 74 33 32 28 26 70  s5GetVarint32(&p
5950: 4c 65 61 66 2d 3e 70 5b 70 4c 65 61 66 2d 3e 73  Leaf->p[pLeaf->s
5960: 7a 4c 65 61 66 5d 2c 20 72 65 74 29 3b 0a 20 20  zLeaf], ret);.  
5970: 72 65 74 75 72 6e 20 72 65 74 3b 0a 7d 0a 0a 2f  return ret;.}../
5980: 2a 0a 2a 2a 20 43 6c 6f 73 65 20 74 68 65 20 72  *.** Close the r
5990: 65 61 64 2d 6f 6e 6c 79 20 62 6c 6f 62 20 68 61  ead-only blob ha
59a0: 6e 64 6c 65 2c 20 69 66 20 69 74 20 69 73 20 6f  ndle, if it is o
59b0: 70 65 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  pen..*/.static v
59c0: 6f 69 64 20 66 74 73 35 43 6c 6f 73 65 52 65 61  oid fts5CloseRea
59d0: 64 65 72 28 46 74 73 35 49 6e 64 65 78 20 2a 70  der(Fts5Index *p
59e0: 29 7b 0a 20 20 69 66 28 20 70 2d 3e 70 52 65 61  ){.  if( p->pRea
59f0: 64 65 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  der ){.    sqlit
5a00: 65 33 5f 62 6c 6f 62 20 2a 70 52 65 61 64 65 72  e3_blob *pReader
5a10: 20 3d 20 70 2d 3e 70 52 65 61 64 65 72 3b 0a 20   = p->pReader;. 
5a20: 20 20 20 70 2d 3e 70 52 65 61 64 65 72 20 3d 20     p->pReader = 
5a30: 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62  0;.    sqlite3_b
5a40: 6c 6f 62 5f 63 6c 6f 73 65 28 70 52 65 61 64 65  lob_close(pReade
5a50: 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  r);.  }.}../*.**
5a60: 20 52 65 74 72 69 65 76 65 20 61 20 72 65 63 6f   Retrieve a reco
5a70: 72 64 20 66 72 6f 6d 20 74 68 65 20 25 5f 64 61  rd from the %_da
5a80: 74 61 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20  ta table..**.** 
5a90: 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
5aa0: 72 73 2c 20 4e 55 4c 4c 20 69 73 20 72 65 74 75  rs, NULL is retu
5ab0: 72 6e 65 64 20 61 6e 64 20 61 6e 20 65 72 72 6f  rned and an erro
5ac0: 72 20 6c 65 66 74 20 69 6e 20 74 68 65 20 0a 2a  r left in the .*
5ad0: 2a 20 46 74 73 35 49 6e 64 65 78 20 6f 62 6a 65  * Fts5Index obje
5ae0: 63 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 46 74  ct..*/.static Ft
5af0: 73 35 44 61 74 61 20 2a 66 74 73 35 44 61 74 61  s5Data *fts5Data
5b00: 52 65 61 64 28 46 74 73 35 49 6e 64 65 78 20 2a  Read(Fts5Index *
5b10: 70 2c 20 69 36 34 20 69 52 6f 77 69 64 29 7b 0a  p, i64 iRowid){.
5b20: 20 20 46 74 73 35 44 61 74 61 20 2a 70 52 65 74    Fts5Data *pRet
5b30: 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 2d 3e 72   = 0;.  if( p->r
5b40: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
5b50: 20 20 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c      int rc = SQL
5b60: 49 54 45 5f 4f 4b 3b 0a 0a 20 20 20 20 69 66 28  ITE_OK;..    if(
5b70: 20 70 2d 3e 70 52 65 61 64 65 72 20 29 7b 0a 20   p->pReader ){. 
5b80: 20 20 20 20 20 2f 2a 20 54 68 69 73 20 63 61 6c       /* This cal
5b90: 6c 20 6d 61 79 20 72 65 74 75 72 6e 20 53 51 4c  l may return SQL
5ba0: 49 54 45 5f 41 42 4f 52 54 20 69 66 20 74 68 65  ITE_ABORT if the
5bb0: 72 65 20 68 61 73 20 62 65 65 6e 20 61 20 73 61  re has been a sa
5bc0: 76 65 70 6f 69 6e 74 0a 20 20 20 20 20 20 2a 2a  vepoint.      **
5bd0: 20 72 6f 6c 6c 62 61 63 6b 20 73 69 6e 63 65 20   rollback since 
5be0: 69 74 20 77 61 73 20 6c 61 73 74 20 75 73 65 64  it was last used
5bf0: 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 61  . In this case a
5c00: 20 6e 65 77 20 62 6c 6f 62 20 68 61 6e 64 6c 65   new blob handle
5c10: 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 72 65 71  .      ** is req
5c20: 75 69 72 65 64 2e 20 20 2a 2f 0a 20 20 20 20 20  uired.  */.     
5c30: 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62 20 2a 70   sqlite3_blob *p
5c40: 42 6c 6f 62 20 3d 20 70 2d 3e 70 52 65 61 64 65  Blob = p->pReade
5c50: 72 3b 0a 20 20 20 20 20 20 70 2d 3e 70 52 65 61  r;.      p->pRea
5c60: 64 65 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 72  der = 0;.      r
5c70: 63 20 3d 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62  c = sqlite3_blob
5c80: 5f 72 65 6f 70 65 6e 28 70 42 6c 6f 62 2c 20 69  _reopen(pBlob, i
5c90: 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 61 73  Rowid);.      as
5ca0: 73 65 72 74 28 20 70 2d 3e 70 52 65 61 64 65 72  sert( p->pReader
5cb0: 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 2d 3e  ==0 );.      p->
5cc0: 70 52 65 61 64 65 72 20 3d 20 70 42 6c 6f 62 3b  pReader = pBlob;
5cd0: 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
5ce0: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
5cf0: 20 20 20 20 66 74 73 35 43 6c 6f 73 65 52 65 61      fts5CloseRea
5d00: 64 65 72 28 70 29 3b 0a 20 20 20 20 20 20 7d 0a  der(p);.      }.
5d10: 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
5d20: 4c 49 54 45 5f 41 42 4f 52 54 20 29 20 72 63 20  LITE_ABORT ) rc 
5d30: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
5d40: 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68   }..    /* If th
5d50: 65 20 62 6c 6f 62 20 68 61 6e 64 6c 65 20 69 73  e blob handle is
5d60: 20 6e 6f 74 20 6f 70 65 6e 20 61 74 20 74 68 69   not open at thi
5d70: 73 20 70 6f 69 6e 74 2c 20 6f 70 65 6e 20 69 74  s point, open it
5d80: 20 61 6e 64 20 73 65 65 6b 20 0a 20 20 20 20 2a   and seek .    *
5d90: 2a 20 74 6f 20 74 68 65 20 72 65 71 75 65 73 74  * to the request
5da0: 65 64 20 65 6e 74 72 79 2e 20 20 2a 2f 0a 20 20  ed entry.  */.  
5db0: 20 20 69 66 28 20 70 2d 3e 70 52 65 61 64 65 72    if( p->pReader
5dc0: 3d 3d 30 20 26 26 20 72 63 3d 3d 53 51 4c 49 54  ==0 && rc==SQLIT
5dd0: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 46 74  E_OK ){.      Ft
5de0: 73 35 43 6f 6e 66 69 67 20 2a 70 43 6f 6e 66 69  s5Config *pConfi
5df0: 67 20 3d 20 70 2d 3e 70 43 6f 6e 66 69 67 3b 0a  g = p->pConfig;.
5e00: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
5e10: 65 33 5f 62 6c 6f 62 5f 6f 70 65 6e 28 70 43 6f  e3_blob_open(pCo
5e20: 6e 66 69 67 2d 3e 64 62 2c 20 0a 20 20 20 20 20  nfig->db, .     
5e30: 20 20 20 20 20 70 43 6f 6e 66 69 67 2d 3e 7a 44       pConfig->zD
5e40: 62 2c 20 70 2d 3e 7a 44 61 74 61 54 62 6c 2c 20  b, p->zDataTbl, 
5e50: 22 62 6c 6f 63 6b 22 2c 20 69 52 6f 77 69 64 2c  "block", iRowid,
5e60: 20 30 2c 20 26 70 2d 3e 70 52 65 61 64 65 72 0a   0, &p->pReader.
5e70: 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 0a        );.    }..
5e80: 20 20 20 20 2f 2a 20 49 66 20 65 69 74 68 65 72      /* If either
5e90: 20 6f 66 20 74 68 65 20 73 71 6c 69 74 65 33 5f   of the sqlite3_
5ea0: 62 6c 6f 62 5f 6f 70 65 6e 28 29 20 6f 72 20 73  blob_open() or s
5eb0: 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 72 65 6f 70  qlite3_blob_reop
5ec0: 65 6e 28 29 20 63 61 6c 6c 73 0a 20 20 20 20 2a  en() calls.    *
5ed0: 2a 20 61 62 6f 76 65 20 72 65 74 75 72 6e 65 64  * above returned
5ee0: 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 2c 20 72   SQLITE_ERROR, r
5ef0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
5f00: 52 55 50 54 5f 56 54 41 42 20 69 6e 73 74 65 61  RUPT_VTAB instea
5f10: 64 2e 0a 20 20 20 20 2a 2a 20 41 6c 6c 20 74 68  d..    ** All th
5f20: 65 20 72 65 61 73 6f 6e 73 20 74 68 6f 73 65 20  e reasons those 
5f30: 66 75 6e 63 74 69 6f 6e 73 20 6d 69 67 68 74 20  functions might 
5f40: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
5f50: 52 4f 52 20 2d 20 6d 69 73 73 69 6e 67 0a 20 20  ROR - missing.  
5f60: 20 20 2a 2a 20 74 61 62 6c 65 2c 20 6d 69 73 73    ** table, miss
5f70: 69 6e 67 20 72 6f 77 2c 20 6e 6f 6e 2d 62 6c 6f  ing row, non-blo
5f80: 62 2f 74 65 78 74 20 69 6e 20 62 6c 6f 63 6b 20  b/text in block 
5f90: 63 6f 6c 75 6d 6e 20 2d 20 69 6e 64 69 63 61 74  column - indicat
5fa0: 65 20 0a 20 20 20 20 2a 2a 20 62 61 63 6b 69 6e  e .    ** backin
5fb0: 67 20 73 74 6f 72 65 20 63 6f 72 72 75 70 74 69  g store corrupti
5fc0: 6f 6e 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  on.  */.    if( 
5fd0: 72 63 3d 3d 53 51 4c 49 54 45 5f 45 52 52 4f 52  rc==SQLITE_ERROR
5fe0: 20 29 20 72 63 20 3d 20 46 54 53 35 5f 43 4f 52   ) rc = FTS5_COR
5ff0: 52 55 50 54 3b 0a 0a 20 20 20 20 69 66 28 20 72  RUPT;..    if( r
6000: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
6010: 20 20 20 20 20 20 75 38 20 2a 61 4f 75 74 20 3d        u8 *aOut =
6020: 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
6030: 20 20 2f 2a 20 52 65 61 64 20 62 6c 6f 62 20 64    /* Read blob d
6040: 61 74 61 20 69 6e 74 6f 20 74 68 69 73 20 62 75  ata into this bu
6050: 66 66 65 72 20 2a 2f 0a 20 20 20 20 20 20 69 6e  ffer */.      in
6060: 74 20 6e 42 79 74 65 20 3d 20 73 71 6c 69 74 65  t nByte = sqlite
6070: 33 5f 62 6c 6f 62 5f 62 79 74 65 73 28 70 2d 3e  3_blob_bytes(p->
6080: 70 52 65 61 64 65 72 29 3b 0a 20 20 20 20 20 20  pReader);.      
6090: 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6e 41  sqlite3_int64 nA
60a0: 6c 6c 6f 63 20 3d 20 73 69 7a 65 6f 66 28 46 74  lloc = sizeof(Ft
60b0: 73 35 44 61 74 61 29 20 2b 20 6e 42 79 74 65 20  s5Data) + nByte 
60c0: 2b 20 46 54 53 35 5f 44 41 54 41 5f 50 41 44 44  + FTS5_DATA_PADD
60d0: 49 4e 47 3b 0a 20 20 20 20 20 20 70 52 65 74 20  ING;.      pRet 
60e0: 3d 20 28 46 74 73 35 44 61 74 61 2a 29 73 71 6c  = (Fts5Data*)sql
60f0: 69 74 65 33 5f 6d 61 6c 6c 6f 63 36 34 28 6e 41  ite3_malloc64(nA
6100: 6c 6c 6f 63 29 3b 0a 20 20 20 20 20 20 69 66 28  lloc);.      if(
6110: 20 70 52 65 74 20 29 7b 0a 20 20 20 20 20 20 20   pRet ){.       
6120: 20 70 52 65 74 2d 3e 6e 6e 20 3d 20 6e 42 79 74   pRet->nn = nByt
6130: 65 3b 0a 20 20 20 20 20 20 20 20 61 4f 75 74 20  e;.        aOut 
6140: 3d 20 70 52 65 74 2d 3e 70 20 3d 20 28 75 38 2a  = pRet->p = (u8*
6150: 29 26 70 52 65 74 5b 31 5d 3b 0a 20 20 20 20 20  )&pRet[1];.     
6160: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
6170: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
6180: 4d 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  M;.      }..    
6190: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
61a0: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72  _OK ){.        r
61b0: 63 20 3d 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62  c = sqlite3_blob
61c0: 5f 72 65 61 64 28 70 2d 3e 70 52 65 61 64 65 72  _read(p->pReader
61d0: 2c 20 61 4f 75 74 2c 20 6e 42 79 74 65 2c 20 30  , aOut, nByte, 0
61e0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
61f0: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
6200: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  OK ){.        sq
6210: 6c 69 74 65 33 5f 66 72 65 65 28 70 52 65 74 29  lite3_free(pRet)
6220: 3b 0a 20 20 20 20 20 20 20 20 70 52 65 74 20 3d  ;.        pRet =
6230: 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b   0;.      }else{
6240: 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 4f 44 4f  .        /* TODO
6250: 31 3a 20 46 69 78 20 74 68 69 73 20 2a 2f 0a 20  1: Fix this */. 
6260: 20 20 20 20 20 20 20 70 52 65 74 2d 3e 70 5b 6e         pRet->p[n
6270: 42 79 74 65 5d 20 3d 20 30 78 30 30 3b 0a 20 20  Byte] = 0x00;.  
6280: 20 20 20 20 20 20 70 52 65 74 2d 3e 73 7a 4c 65        pRet->szLe
6290: 61 66 20 3d 20 66 74 73 35 47 65 74 55 31 36 28  af = fts5GetU16(
62a0: 26 70 52 65 74 2d 3e 70 5b 32 5d 29 3b 0a 20 20  &pRet->p[2]);.  
62b0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
62c0: 70 2d 3e 72 63 20 3d 20 72 63 3b 0a 20 20 20 20  p->rc = rc;.    
62d0: 70 2d 3e 6e 52 65 61 64 2b 2b 3b 0a 20 20 7d 0a  p->nRead++;.  }.
62e0: 0a 20 20 61 73 73 65 72 74 28 20 28 70 52 65 74  .  assert( (pRet
62f0: 3d 3d 30 29 3d 3d 28 70 2d 3e 72 63 21 3d 53 51  ==0)==(p->rc!=SQ
6300: 4c 49 54 45 5f 4f 4b 29 20 29 3b 0a 20 20 72 65  LITE_OK) );.  re
6310: 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 0a 2f 2a  turn pRet;.}../*
6320: 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 20 72 65  .** Release a re
6330: 66 65 72 65 6e 63 65 20 74 6f 20 64 61 74 61 20  ference to data 
6340: 72 65 63 6f 72 64 20 72 65 74 75 72 6e 65 64 20  record returned 
6350: 62 79 20 61 6e 20 65 61 72 6c 69 65 72 20 63 61  by an earlier ca
6360: 6c 6c 20 74 6f 0a 2a 2a 20 66 74 73 35 44 61 74  ll to.** fts5Dat
6370: 61 52 65 61 64 28 29 2e 0a 2a 2f 0a 73 74 61 74  aRead()..*/.stat
6380: 69 63 20 76 6f 69 64 20 66 74 73 35 44 61 74 61  ic void fts5Data
6390: 52 65 6c 65 61 73 65 28 46 74 73 35 44 61 74 61  Release(Fts5Data
63a0: 20 2a 70 44 61 74 61 29 7b 0a 20 20 73 71 6c 69   *pData){.  sqli
63b0: 74 65 33 5f 66 72 65 65 28 70 44 61 74 61 29 3b  te3_free(pData);
63c0: 0a 7d 0a 0a 73 74 61 74 69 63 20 46 74 73 35 44  .}..static Fts5D
63d0: 61 74 61 20 2a 66 74 73 35 4c 65 61 66 52 65 61  ata *fts5LeafRea
63e0: 64 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20  d(Fts5Index *p, 
63f0: 69 36 34 20 69 52 6f 77 69 64 29 7b 0a 20 20 46  i64 iRowid){.  F
6400: 74 73 35 44 61 74 61 20 2a 70 52 65 74 20 3d 20  ts5Data *pRet = 
6410: 66 74 73 35 44 61 74 61 52 65 61 64 28 70 2c 20  fts5DataRead(p, 
6420: 69 52 6f 77 69 64 29 3b 0a 20 20 69 66 28 20 70  iRowid);.  if( p
6430: 52 65 74 20 29 7b 0a 20 20 20 20 69 66 28 20 70  Ret ){.    if( p
6440: 52 65 74 2d 3e 73 7a 4c 65 61 66 3e 70 52 65 74  Ret->szLeaf>pRet
6450: 2d 3e 6e 6e 20 29 7b 0a 20 20 20 20 20 20 70 2d  ->nn ){.      p-
6460: 3e 72 63 20 3d 20 46 54 53 35 5f 43 4f 52 52 55  >rc = FTS5_CORRU
6470: 50 54 3b 0a 20 20 20 20 20 20 66 74 73 35 44 61  PT;.      fts5Da
6480: 74 61 52 65 6c 65 61 73 65 28 70 52 65 74 29 3b  taRelease(pRet);
6490: 0a 20 20 20 20 20 20 70 52 65 74 20 3d 20 30 3b  .      pRet = 0;
64a0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
64b0: 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 0a 73 74 61  urn pRet;.}..sta
64c0: 74 69 63 20 69 6e 74 20 66 74 73 35 49 6e 64 65  tic int fts5Inde
64d0: 78 50 72 65 70 61 72 65 53 74 6d 74 28 0a 20 20  xPrepareStmt(.  
64e0: 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 0a 20 20  Fts5Index *p,.  
64f0: 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 2a 70  sqlite3_stmt **p
6500: 70 53 74 6d 74 2c 0a 20 20 63 68 61 72 20 2a 7a  pStmt,.  char *z
6510: 53 71 6c 0a 29 7b 0a 20 20 69 66 28 20 70 2d 3e  Sql.){.  if( p->
6520: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
6530: 0a 20 20 20 20 69 66 28 20 7a 53 71 6c 20 29 7b  .    if( zSql ){
6540: 0a 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 73  .      p->rc = s
6550: 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76  qlite3_prepare_v
6560: 33 28 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e 64 62  3(p->pConfig->db
6570: 2c 20 7a 53 71 6c 2c 20 2d 31 2c 0a 20 20 20 20  , zSql, -1,.    
6580: 20 20 20 20 20 20 53 51 4c 49 54 45 5f 50 52 45        SQLITE_PRE
6590: 50 41 52 45 5f 50 45 52 53 49 53 54 45 4e 54 7c  PARE_PERSISTENT|
65a0: 53 51 4c 49 54 45 5f 50 52 45 50 41 52 45 5f 4e  SQLITE_PREPARE_N
65b0: 4f 5f 56 54 41 42 2c 0a 20 20 20 20 20 20 20 20  O_VTAB,.        
65c0: 20 20 70 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20    ppStmt, 0);.  
65d0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
65e0: 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f  ->rc = SQLITE_NO
65f0: 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  MEM;.    }.  }. 
6600: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 53   sqlite3_free(zS
6610: 71 6c 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 2d  ql);.  return p-
6620: 3e 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 49  >rc;.}.../*.** I
6630: 4e 53 45 52 54 20 4f 52 20 52 45 50 4c 41 43 45  NSERT OR REPLACE
6640: 20 61 20 72 65 63 6f 72 64 20 69 6e 74 6f 20 74   a record into t
6650: 68 65 20 25 5f 64 61 74 61 20 74 61 62 6c 65 2e  he %_data table.
6660: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
6670: 66 74 73 35 44 61 74 61 57 72 69 74 65 28 46 74  fts5DataWrite(Ft
6680: 73 35 49 6e 64 65 78 20 2a 70 2c 20 69 36 34 20  s5Index *p, i64 
6690: 69 52 6f 77 69 64 2c 20 63 6f 6e 73 74 20 75 38  iRowid, const u8
66a0: 20 2a 70 44 61 74 61 2c 20 69 6e 74 20 6e 44 61   *pData, int nDa
66b0: 74 61 29 7b 0a 20 20 69 66 28 20 70 2d 3e 72 63  ta){.  if( p->rc
66c0: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65  !=SQLITE_OK ) re
66d0: 74 75 72 6e 3b 0a 0a 20 20 69 66 28 20 70 2d 3e  turn;..  if( p->
66e0: 70 57 72 69 74 65 72 3d 3d 30 20 29 7b 0a 20 20  pWriter==0 ){.  
66f0: 20 20 46 74 73 35 43 6f 6e 66 69 67 20 2a 70 43    Fts5Config *pC
6700: 6f 6e 66 69 67 20 3d 20 70 2d 3e 70 43 6f 6e 66  onfig = p->pConf
6710: 69 67 3b 0a 20 20 20 20 66 74 73 35 49 6e 64 65  ig;.    fts5Inde
6720: 78 50 72 65 70 61 72 65 53 74 6d 74 28 70 2c 20  xPrepareStmt(p, 
6730: 26 70 2d 3e 70 57 72 69 74 65 72 2c 20 73 71 6c  &p->pWriter, sql
6740: 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 0a 20 20  ite3_mprintf(.  
6750: 20 20 20 20 20 20 20 20 22 52 45 50 4c 41 43 45          "REPLACE
6760: 20 49 4e 54 4f 20 27 25 71 27 2e 27 25 71 5f 64   INTO '%q'.'%q_d
6770: 61 74 61 27 28 69 64 2c 20 62 6c 6f 63 6b 29 20  ata'(id, block) 
6780: 56 41 4c 55 45 53 28 3f 2c 3f 29 22 2c 20 0a 20  VALUES(?,?)", . 
6790: 20 20 20 20 20 20 20 20 20 70 43 6f 6e 66 69 67           pConfig
67a0: 2d 3e 7a 44 62 2c 20 70 43 6f 6e 66 69 67 2d 3e  ->zDb, pConfig->
67b0: 7a 4e 61 6d 65 0a 20 20 20 20 29 29 3b 0a 20 20  zName.    ));.  
67c0: 20 20 69 66 28 20 70 2d 3e 72 63 20 29 20 72 65    if( p->rc ) re
67d0: 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20 73 71 6c  turn;.  }..  sql
67e0: 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 36 34 28  ite3_bind_int64(
67f0: 70 2d 3e 70 57 72 69 74 65 72 2c 20 31 2c 20 69  p->pWriter, 1, i
6800: 52 6f 77 69 64 29 3b 0a 20 20 73 71 6c 69 74 65  Rowid);.  sqlite
6810: 33 5f 62 69 6e 64 5f 62 6c 6f 62 28 70 2d 3e 70  3_bind_blob(p->p
6820: 57 72 69 74 65 72 2c 20 32 2c 20 70 44 61 74 61  Writer, 2, pData
6830: 2c 20 6e 44 61 74 61 2c 20 53 51 4c 49 54 45 5f  , nData, SQLITE_
6840: 53 54 41 54 49 43 29 3b 0a 20 20 73 71 6c 69 74  STATIC);.  sqlit
6850: 65 33 5f 73 74 65 70 28 70 2d 3e 70 57 72 69 74  e3_step(p->pWrit
6860: 65 72 29 3b 0a 20 20 70 2d 3e 72 63 20 3d 20 73  er);.  p->rc = s
6870: 71 6c 69 74 65 33 5f 72 65 73 65 74 28 70 2d 3e  qlite3_reset(p->
6880: 70 57 72 69 74 65 72 29 3b 0a 20 20 73 71 6c 69  pWriter);.  sqli
6890: 74 65 33 5f 62 69 6e 64 5f 6e 75 6c 6c 28 70 2d  te3_bind_null(p-
68a0: 3e 70 57 72 69 74 65 72 2c 20 32 29 3b 0a 7d 0a  >pWriter, 2);.}.
68b0: 0a 2f 2a 0a 2a 2a 20 45 78 65 63 75 74 65 20 74  ./*.** Execute t
68c0: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 53 51 4c  he following SQL
68d0: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 44 45 4c 45  :.**.**     DELE
68e0: 54 45 20 46 52 4f 4d 20 25 5f 64 61 74 61 20 57  TE FROM %_data W
68f0: 48 45 52 45 20 69 64 20 42 45 54 57 45 45 4e 20  HERE id BETWEEN 
6900: 24 69 46 69 72 73 74 20 41 4e 44 20 24 69 4c 61  $iFirst AND $iLa
6910: 73 74 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  st.*/.static voi
6920: 64 20 66 74 73 35 44 61 74 61 44 65 6c 65 74 65  d fts5DataDelete
6930: 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 69  (Fts5Index *p, i
6940: 36 34 20 69 46 69 72 73 74 2c 20 69 36 34 20 69  64 iFirst, i64 i
6950: 4c 61 73 74 29 7b 0a 20 20 69 66 28 20 70 2d 3e  Last){.  if( p->
6960: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
6970: 72 65 74 75 72 6e 3b 0a 0a 20 20 69 66 28 20 70  return;..  if( p
6980: 2d 3e 70 44 65 6c 65 74 65 72 3d 3d 30 20 29 7b  ->pDeleter==0 ){
6990: 0a 20 20 20 20 46 74 73 35 43 6f 6e 66 69 67 20  .    Fts5Config 
69a0: 2a 70 43 6f 6e 66 69 67 20 3d 20 70 2d 3e 70 43  *pConfig = p->pC
69b0: 6f 6e 66 69 67 3b 0a 20 20 20 20 63 68 61 72 20  onfig;.    char 
69c0: 2a 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f  *zSql = sqlite3_
69d0: 6d 70 72 69 6e 74 66 28 0a 20 20 20 20 20 20 20  mprintf(.       
69e0: 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 27 25   "DELETE FROM '%
69f0: 71 27 2e 27 25 71 5f 64 61 74 61 27 20 57 48 45  q'.'%q_data' WHE
6a00: 52 45 20 69 64 3e 3d 3f 20 41 4e 44 20 69 64 3c  RE id>=? AND id<
6a10: 3d 3f 22 2c 20 0a 20 20 20 20 20 20 20 20 20 20  =?", .          
6a20: 70 43 6f 6e 66 69 67 2d 3e 7a 44 62 2c 20 70 43  pConfig->zDb, pC
6a30: 6f 6e 66 69 67 2d 3e 7a 4e 61 6d 65 0a 20 20 20  onfig->zName.   
6a40: 20 29 3b 0a 20 20 20 20 69 66 28 20 66 74 73 35   );.    if( fts5
6a50: 49 6e 64 65 78 50 72 65 70 61 72 65 53 74 6d 74  IndexPrepareStmt
6a60: 28 70 2c 20 26 70 2d 3e 70 44 65 6c 65 74 65 72  (p, &p->pDeleter
6a70: 2c 20 7a 53 71 6c 29 20 29 20 72 65 74 75 72 6e  , zSql) ) return
6a80: 3b 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33  ;.  }..  sqlite3
6a90: 5f 62 69 6e 64 5f 69 6e 74 36 34 28 70 2d 3e 70  _bind_int64(p->p
6aa0: 44 65 6c 65 74 65 72 2c 20 31 2c 20 69 46 69 72  Deleter, 1, iFir
6ab0: 73 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 62  st);.  sqlite3_b
6ac0: 69 6e 64 5f 69 6e 74 36 34 28 70 2d 3e 70 44 65  ind_int64(p->pDe
6ad0: 6c 65 74 65 72 2c 20 32 2c 20 69 4c 61 73 74 29  leter, 2, iLast)
6ae0: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 65 70  ;.  sqlite3_step
6af0: 28 70 2d 3e 70 44 65 6c 65 74 65 72 29 3b 0a 20  (p->pDeleter);. 
6b00: 20 70 2d 3e 72 63 20 3d 20 73 71 6c 69 74 65 33   p->rc = sqlite3
6b10: 5f 72 65 73 65 74 28 70 2d 3e 70 44 65 6c 65 74  _reset(p->pDelet
6b20: 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  er);.}../*.** Re
6b30: 6d 6f 76 65 20 61 6c 6c 20 72 65 63 6f 72 64 73  move all records
6b40: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
6b50: 20 73 65 67 6d 65 6e 74 20 69 53 65 67 69 64 2e   segment iSegid.
6b60: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
6b70: 66 74 73 35 44 61 74 61 52 65 6d 6f 76 65 53 65  fts5DataRemoveSe
6b80: 67 6d 65 6e 74 28 46 74 73 35 49 6e 64 65 78 20  gment(Fts5Index 
6b90: 2a 70 2c 20 69 6e 74 20 69 53 65 67 69 64 29 7b  *p, int iSegid){
6ba0: 0a 20 20 69 36 34 20 69 46 69 72 73 74 20 3d 20  .  i64 iFirst = 
6bb0: 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f 52 4f 57  FTS5_SEGMENT_ROW
6bc0: 49 44 28 69 53 65 67 69 64 2c 20 30 29 3b 0a 20  ID(iSegid, 0);. 
6bd0: 20 69 36 34 20 69 4c 61 73 74 20 3d 20 46 54 53   i64 iLast = FTS
6be0: 35 5f 53 45 47 4d 45 4e 54 5f 52 4f 57 49 44 28  5_SEGMENT_ROWID(
6bf0: 69 53 65 67 69 64 2b 31 2c 20 30 29 2d 31 3b 0a  iSegid+1, 0)-1;.
6c00: 20 20 66 74 73 35 44 61 74 61 44 65 6c 65 74 65    fts5DataDelete
6c10: 28 70 2c 20 69 46 69 72 73 74 2c 20 69 4c 61 73  (p, iFirst, iLas
6c20: 74 29 3b 0a 20 20 69 66 28 20 70 2d 3e 70 49 64  t);.  if( p->pId
6c30: 78 44 65 6c 65 74 65 72 3d 3d 30 20 29 7b 0a 20  xDeleter==0 ){. 
6c40: 20 20 20 46 74 73 35 43 6f 6e 66 69 67 20 2a 70     Fts5Config *p
6c50: 43 6f 6e 66 69 67 20 3d 20 70 2d 3e 70 43 6f 6e  Config = p->pCon
6c60: 66 69 67 3b 0a 20 20 20 20 66 74 73 35 49 6e 64  fig;.    fts5Ind
6c70: 65 78 50 72 65 70 61 72 65 53 74 6d 74 28 70 2c  exPrepareStmt(p,
6c80: 20 26 70 2d 3e 70 49 64 78 44 65 6c 65 74 65 72   &p->pIdxDeleter
6c90: 2c 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  , sqlite3_mprint
6ca0: 66 28 0a 20 20 20 20 20 20 20 20 20 20 22 44 45  f(.          "DE
6cb0: 4c 45 54 45 20 46 52 4f 4d 20 27 25 71 27 2e 27  LETE FROM '%q'.'
6cc0: 25 71 5f 69 64 78 27 20 57 48 45 52 45 20 73 65  %q_idx' WHERE se
6cd0: 67 69 64 3d 3f 22 2c 0a 20 20 20 20 20 20 20 20  gid=?",.        
6ce0: 20 20 70 43 6f 6e 66 69 67 2d 3e 7a 44 62 2c 20    pConfig->zDb, 
6cf0: 70 43 6f 6e 66 69 67 2d 3e 7a 4e 61 6d 65 0a 20  pConfig->zName. 
6d00: 20 20 20 29 29 3b 0a 20 20 7d 0a 20 20 69 66 28     ));.  }.  if(
6d10: 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
6d20: 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  K ){.    sqlite3
6d30: 5f 62 69 6e 64 5f 69 6e 74 28 70 2d 3e 70 49 64  _bind_int(p->pId
6d40: 78 44 65 6c 65 74 65 72 2c 20 31 2c 20 69 53 65  xDeleter, 1, iSe
6d50: 67 69 64 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  gid);.    sqlite
6d60: 33 5f 73 74 65 70 28 70 2d 3e 70 49 64 78 44 65  3_step(p->pIdxDe
6d70: 6c 65 74 65 72 29 3b 0a 20 20 20 20 70 2d 3e 72  leter);.    p->r
6d80: 63 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 73 65  c = sqlite3_rese
6d90: 74 28 70 2d 3e 70 49 64 78 44 65 6c 65 74 65 72  t(p->pIdxDeleter
6da0: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
6db0: 52 65 6c 65 61 73 65 20 61 20 72 65 66 65 72 65  Release a refere
6dc0: 6e 63 65 20 74 6f 20 61 6e 20 46 74 73 35 53 74  nce to an Fts5St
6dd0: 72 75 63 74 75 72 65 20 6f 62 6a 65 63 74 20 72  ructure object r
6de0: 65 74 75 72 6e 65 64 20 62 79 20 61 6e 20 65 61  eturned by an ea
6df0: 72 6c 69 65 72 20 0a 2a 2a 20 63 61 6c 6c 20 74  rlier .** call t
6e00: 6f 20 66 74 73 35 53 74 72 75 63 74 75 72 65 52  o fts5StructureR
6e10: 65 61 64 28 29 20 6f 72 20 66 74 73 35 53 74 72  ead() or fts5Str
6e20: 75 63 74 75 72 65 44 65 63 6f 64 65 28 29 2e 0a  uctureDecode()..
6e30: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
6e40: 74 73 35 53 74 72 75 63 74 75 72 65 52 65 6c 65  ts5StructureRele
6e50: 61 73 65 28 46 74 73 35 53 74 72 75 63 74 75 72  ase(Fts5Structur
6e60: 65 20 2a 70 53 74 72 75 63 74 29 7b 0a 20 20 69  e *pStruct){.  i
6e70: 66 28 20 70 53 74 72 75 63 74 20 26 26 20 30 3e  f( pStruct && 0>
6e80: 3d 28 2d 2d 70 53 74 72 75 63 74 2d 3e 6e 52 65  =(--pStruct->nRe
6e90: 66 29 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b  f) ){.    int i;
6ea0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 53 74  .    assert( pSt
6eb0: 72 75 63 74 2d 3e 6e 52 65 66 3d 3d 30 20 29 3b  ruct->nRef==0 );
6ec0: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
6ed0: 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 3b  pStruct->nLevel;
6ee0: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c   i++){.      sql
6ef0: 69 74 65 33 5f 66 72 65 65 28 70 53 74 72 75 63  ite3_free(pStruc
6f00: 74 2d 3e 61 4c 65 76 65 6c 5b 69 5d 2e 61 53 65  t->aLevel[i].aSe
6f10: 67 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  g);.    }.    sq
6f20: 6c 69 74 65 33 5f 66 72 65 65 28 70 53 74 72 75  lite3_free(pStru
6f30: 63 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74  ct);.  }.}..stat
6f40: 69 63 20 76 6f 69 64 20 66 74 73 35 53 74 72 75  ic void fts5Stru
6f50: 63 74 75 72 65 52 65 66 28 46 74 73 35 53 74 72  ctureRef(Fts5Str
6f60: 75 63 74 75 72 65 20 2a 70 53 74 72 75 63 74 29  ucture *pStruct)
6f70: 7b 0a 20 20 70 53 74 72 75 63 74 2d 3e 6e 52 65  {.  pStruct->nRe
6f80: 66 2b 2b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65  f++;.}../*.** De
6f90: 73 65 72 69 61 6c 69 7a 65 20 61 6e 64 20 72 65  serialize and re
6fa0: 74 75 72 6e 20 74 68 65 20 73 74 72 75 63 74 75  turn the structu
6fb0: 72 65 20 72 65 63 6f 72 64 20 63 75 72 72 65 6e  re record curren
6fc0: 74 6c 79 20 73 74 6f 72 65 64 20 69 6e 20 73 65  tly stored in se
6fd0: 72 69 61 6c 69 7a 65 64 0a 2a 2a 20 66 6f 72 6d  rialized.** form
6fe0: 20 77 69 74 68 69 6e 20 62 75 66 66 65 72 20 70   within buffer p
6ff0: 44 61 74 61 2f 6e 44 61 74 61 2e 0a 2a 2a 0a 2a  Data/nData..**.*
7000: 2a 20 54 68 65 20 46 74 73 35 53 74 72 75 63 74  * The Fts5Struct
7010: 75 72 65 2e 61 4c 65 76 65 6c 5b 5d 20 61 6e 64  ure.aLevel[] and
7020: 20 65 61 63 68 20 46 74 73 35 53 74 72 75 63 74   each Fts5Struct
7030: 75 72 65 4c 65 76 65 6c 2e 61 53 65 67 5b 5d 20  ureLevel.aSeg[] 
7040: 61 72 72 61 79 0a 2a 2a 20 61 72 65 20 6f 76 65  array.** are ove
7050: 72 2d 61 6c 6c 6f 63 61 74 65 64 20 62 79 20 6f  r-allocated by o
7060: 6e 65 20 73 6c 6f 74 2e 20 54 68 69 73 20 61 6c  ne slot. This al
7070: 6c 6f 77 73 20 74 68 65 20 73 74 72 75 63 74 75  lows the structu
7080: 72 65 20 63 6f 6e 74 65 6e 74 73 0a 2a 2a 20 74  re contents.** t
7090: 6f 20 62 65 20 6d 6f 72 65 20 65 61 73 69 6c 79  o be more easily
70a0: 20 65 64 69 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 49   edited..**.** I
70b0: 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
70c0: 73 2c 20 2a 70 70 4f 75 74 20 69 73 20 73 65 74  s, *ppOut is set
70d0: 20 74 6f 20 4e 55 4c 4c 20 61 6e 64 20 61 6e 20   to NULL and an 
70e0: 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64  SQLite error cod
70f0: 65 0a 2a 2a 20 72 65 74 75 72 6e 65 64 2e 20 4f  e.** returned. O
7100: 74 68 65 72 77 69 73 65 2c 20 2a 70 70 4f 75 74  therwise, *ppOut
7110: 20 69 73 20 73 65 74 20 74 6f 20 70 6f 69 6e 74   is set to point
7120: 20 74 6f 20 74 68 65 20 6e 65 77 20 6f 62 6a 65   to the new obje
7130: 63 74 20 61 6e 64 0a 2a 2a 20 53 51 4c 49 54 45  ct and.** SQLITE
7140: 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f  _OK returned..*/
7150: 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 35  .static int fts5
7160: 53 74 72 75 63 74 75 72 65 44 65 63 6f 64 65 28  StructureDecode(
7170: 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 70 44 61  .  const u8 *pDa
7180: 74 61 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ta,             
7190: 20 20 20 2f 2a 20 42 75 66 66 65 72 20 63 6f 6e     /* Buffer con
71a0: 74 61 69 6e 69 6e 67 20 73 65 72 69 61 6c 69 7a  taining serializ
71b0: 65 64 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a  ed structure */.
71c0: 20 20 69 6e 74 20 6e 44 61 74 61 2c 20 20 20 20    int nData,    
71d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
71e0: 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 62 75 66    /* Size of buf
71f0: 66 65 72 20 70 44 61 74 61 20 69 6e 20 62 79 74  fer pData in byt
7200: 65 73 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 69 43  es */.  int *piC
7210: 6f 6f 6b 69 65 2c 20 20 20 20 20 20 20 20 20 20  ookie,          
7220: 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 66 69          /* Confi
7230: 67 75 72 61 74 69 6f 6e 20 63 6f 6f 6b 69 65 20  guration cookie 
7240: 76 61 6c 75 65 20 2a 2f 0a 20 20 46 74 73 35 53  value */.  Fts5S
7250: 74 72 75 63 74 75 72 65 20 2a 2a 70 70 4f 75 74  tructure **ppOut
7260: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55             /* OU
7270: 54 3a 20 44 65 73 65 72 69 61 6c 69 7a 65 64 20  T: Deserialized 
7280: 6f 62 6a 65 63 74 20 2a 2f 0a 29 7b 0a 20 20 69  object */.){.  i
7290: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
72a0: 4b 3b 0a 20 20 69 6e 74 20 69 20 3d 20 30 3b 0a  K;.  int i = 0;.
72b0: 20 20 69 6e 74 20 69 4c 76 6c 3b 0a 20 20 69 6e    int iLvl;.  in
72c0: 74 20 6e 4c 65 76 65 6c 20 3d 20 30 3b 0a 20 20  t nLevel = 0;.  
72d0: 69 6e 74 20 6e 53 65 67 6d 65 6e 74 20 3d 20 30  int nSegment = 0
72e0: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36  ;.  sqlite3_int6
72f0: 34 20 6e 42 79 74 65 3b 20 20 20 20 20 20 20 20  4 nByte;        
7300: 20 20 20 20 2f 2a 20 42 79 74 65 73 20 6f 66 20      /* Bytes of 
7310: 73 70 61 63 65 20 74 6f 20 61 6c 6c 6f 63 61 74  space to allocat
7320: 65 20 61 74 20 70 52 65 74 20 2a 2f 0a 20 20 46  e at pRet */.  F
7330: 74 73 35 53 74 72 75 63 74 75 72 65 20 2a 70 52  ts5Structure *pR
7340: 65 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 2f  et = 0;        /
7350: 2a 20 53 74 72 75 63 74 75 72 65 20 6f 62 6a 65  * Structure obje
7360: 63 74 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a  ct to return */.
7370: 0a 20 20 2f 2a 20 47 72 61 62 20 74 68 65 20 63  .  /* Grab the c
7380: 6f 6f 6b 69 65 20 76 61 6c 75 65 20 2a 2f 0a 20  ookie value */. 
7390: 20 69 66 28 20 70 69 43 6f 6f 6b 69 65 20 29 20   if( piCookie ) 
73a0: 2a 70 69 43 6f 6f 6b 69 65 20 3d 20 73 71 6c 69  *piCookie = sqli
73b0: 74 65 33 46 74 73 35 47 65 74 33 32 28 70 44 61  te3Fts5Get32(pDa
73c0: 74 61 29 3b 0a 20 20 69 20 3d 20 34 3b 0a 0a 20  ta);.  i = 4;.. 
73d0: 20 2f 2a 20 52 65 61 64 20 74 68 65 20 74 6f 74   /* Read the tot
73e0: 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 6c 65 76  al number of lev
73f0: 65 6c 73 20 61 6e 64 20 73 65 67 6d 65 6e 74 73  els and segments
7400: 20 66 72 6f 6d 20 74 68 65 20 73 74 61 72 74 20   from the start 
7410: 6f 66 20 74 68 65 0a 20 20 2a 2a 20 73 74 72 75  of the.  ** stru
7420: 63 74 75 72 65 20 72 65 63 6f 72 64 2e 20 20 2a  cture record.  *
7430: 2f 0a 20 20 69 20 2b 3d 20 66 74 73 35 47 65 74  /.  i += fts5Get
7440: 56 61 72 69 6e 74 33 32 28 26 70 44 61 74 61 5b  Varint32(&pData[
7450: 69 5d 2c 20 6e 4c 65 76 65 6c 29 3b 0a 20 20 69  i], nLevel);.  i
7460: 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e   += fts5GetVarin
7470: 74 33 32 28 26 70 44 61 74 61 5b 69 5d 2c 20 6e  t32(&pData[i], n
7480: 53 65 67 6d 65 6e 74 29 3b 0a 20 20 69 66 28 20  Segment);.  if( 
7490: 6e 4c 65 76 65 6c 3e 46 54 53 35 5f 4d 41 58 5f  nLevel>FTS5_MAX_
74a0: 53 45 47 4d 45 4e 54 20 20 20 7c 7c 20 6e 4c 65  SEGMENT   || nLe
74b0: 76 65 6c 3c 30 0a 20 20 20 7c 7c 20 6e 53 65 67  vel<0.   || nSeg
74c0: 6d 65 6e 74 3e 46 54 53 35 5f 4d 41 58 5f 53 45  ment>FTS5_MAX_SE
74d0: 47 4d 45 4e 54 20 7c 7c 20 6e 53 65 67 6d 65 6e  GMENT || nSegmen
74e0: 74 3c 30 0a 20 20 29 7b 0a 20 20 20 20 72 65 74  t<0.  ){.    ret
74f0: 75 72 6e 20 46 54 53 35 5f 43 4f 52 52 55 50 54  urn FTS5_CORRUPT
7500: 3b 0a 20 20 7d 0a 20 20 6e 42 79 74 65 20 3d 20  ;.  }.  nByte = 
7510: 28 0a 20 20 20 20 20 20 73 69 7a 65 6f 66 28 46  (.      sizeof(F
7520: 74 73 35 53 74 72 75 63 74 75 72 65 29 20 2b 20  ts5Structure) + 
7530: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7540: 20 20 20 2f 2a 20 4d 61 69 6e 20 73 74 72 75 63     /* Main struc
7550: 74 75 72 65 20 2a 2f 0a 20 20 20 20 20 20 73 69  ture */.      si
7560: 7a 65 6f 66 28 46 74 73 35 53 74 72 75 63 74 75  zeof(Fts5Structu
7570: 72 65 4c 65 76 65 6c 29 20 2a 20 28 6e 4c 65 76  reLevel) * (nLev
7580: 65 6c 2d 31 29 20 20 20 20 2f 2a 20 61 4c 65 76  el-1)    /* aLev
7590: 65 6c 5b 5d 20 61 72 72 61 79 20 2a 2f 0a 20 20  el[] array */.  
75a0: 29 3b 0a 20 20 70 52 65 74 20 3d 20 28 46 74 73  );.  pRet = (Fts
75b0: 35 53 74 72 75 63 74 75 72 65 2a 29 73 71 6c 69  5Structure*)sqli
75c0: 74 65 33 46 74 73 35 4d 61 6c 6c 6f 63 5a 65 72  te3Fts5MallocZer
75d0: 6f 28 26 72 63 2c 20 6e 42 79 74 65 29 3b 0a 0a  o(&rc, nByte);..
75e0: 20 20 69 66 28 20 70 52 65 74 20 29 7b 0a 20 20    if( pRet ){.  
75f0: 20 20 70 52 65 74 2d 3e 6e 52 65 66 20 3d 20 31    pRet->nRef = 1
7600: 3b 0a 20 20 20 20 70 52 65 74 2d 3e 6e 4c 65 76  ;.    pRet->nLev
7610: 65 6c 20 3d 20 6e 4c 65 76 65 6c 3b 0a 20 20 20  el = nLevel;.   
7620: 20 70 52 65 74 2d 3e 6e 53 65 67 6d 65 6e 74 20   pRet->nSegment 
7630: 3d 20 6e 53 65 67 6d 65 6e 74 3b 0a 20 20 20 20  = nSegment;.    
7640: 69 20 2b 3d 20 73 71 6c 69 74 65 33 46 74 73 35  i += sqlite3Fts5
7650: 47 65 74 56 61 72 69 6e 74 28 26 70 44 61 74 61  GetVarint(&pData
7660: 5b 69 5d 2c 20 26 70 52 65 74 2d 3e 6e 57 72 69  [i], &pRet->nWri
7670: 74 65 43 6f 75 6e 74 65 72 29 3b 0a 0a 20 20 20  teCounter);..   
7680: 20 66 6f 72 28 69 4c 76 6c 3d 30 3b 20 72 63 3d   for(iLvl=0; rc=
7690: 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 4c  =SQLITE_OK && iL
76a0: 76 6c 3c 6e 4c 65 76 65 6c 3b 20 69 4c 76 6c 2b  vl<nLevel; iLvl+
76b0: 2b 29 7b 0a 20 20 20 20 20 20 46 74 73 35 53 74  +){.      Fts5St
76c0: 72 75 63 74 75 72 65 4c 65 76 65 6c 20 2a 70 4c  ructureLevel *pL
76d0: 76 6c 20 3d 20 26 70 52 65 74 2d 3e 61 4c 65 76  vl = &pRet->aLev
76e0: 65 6c 5b 69 4c 76 6c 5d 3b 0a 20 20 20 20 20 20  el[iLvl];.      
76f0: 69 6e 74 20 6e 54 6f 74 61 6c 20 3d 20 30 3b 0a  int nTotal = 0;.
7700: 20 20 20 20 20 20 69 6e 74 20 69 53 65 67 3b 0a        int iSeg;.
7710: 0a 20 20 20 20 20 20 69 66 28 20 69 3e 3d 6e 44  .      if( i>=nD
7720: 61 74 61 20 29 7b 0a 20 20 20 20 20 20 20 20 72  ata ){.        r
7730: 63 20 3d 20 46 54 53 35 5f 43 4f 52 52 55 50 54  c = FTS5_CORRUPT
7740: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
7750: 20 20 20 20 20 20 20 69 20 2b 3d 20 66 74 73 35         i += fts5
7760: 47 65 74 56 61 72 69 6e 74 33 32 28 26 70 44 61  GetVarint32(&pDa
7770: 74 61 5b 69 5d 2c 20 70 4c 76 6c 2d 3e 6e 4d 65  ta[i], pLvl->nMe
7780: 72 67 65 29 3b 0a 20 20 20 20 20 20 20 20 69 20  rge);.        i 
7790: 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e 74  += fts5GetVarint
77a0: 33 32 28 26 70 44 61 74 61 5b 69 5d 2c 20 6e 54  32(&pData[i], nT
77b0: 6f 74 61 6c 29 3b 0a 20 20 20 20 20 20 20 20 69  otal);.        i
77c0: 66 28 20 6e 54 6f 74 61 6c 3c 70 4c 76 6c 2d 3e  f( nTotal<pLvl->
77d0: 6e 4d 65 72 67 65 20 29 20 72 63 20 3d 20 46 54  nMerge ) rc = FT
77e0: 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20 20  S5_CORRUPT;.    
77f0: 20 20 20 20 70 4c 76 6c 2d 3e 61 53 65 67 20 3d      pLvl->aSeg =
7800: 20 28 46 74 73 35 53 74 72 75 63 74 75 72 65 53   (Fts5StructureS
7810: 65 67 6d 65 6e 74 2a 29 73 71 6c 69 74 65 33 46  egment*)sqlite3F
7820: 74 73 35 4d 61 6c 6c 6f 63 5a 65 72 6f 28 26 72  ts5MallocZero(&r
7830: 63 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  c, .            
7840: 6e 54 6f 74 61 6c 20 2a 20 73 69 7a 65 6f 66 28  nTotal * sizeof(
7850: 46 74 73 35 53 74 72 75 63 74 75 72 65 53 65 67  Fts5StructureSeg
7860: 6d 65 6e 74 29 0a 20 20 20 20 20 20 20 20 29 3b  ment).        );
7870: 0a 20 20 20 20 20 20 20 20 6e 53 65 67 6d 65 6e  .        nSegmen
7880: 74 20 2d 3d 20 6e 54 6f 74 61 6c 3b 0a 20 20 20  t -= nTotal;.   
7890: 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20     }..      if( 
78a0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
78b0: 0a 20 20 20 20 20 20 20 20 70 4c 76 6c 2d 3e 6e  .        pLvl->n
78c0: 53 65 67 20 3d 20 6e 54 6f 74 61 6c 3b 0a 20 20  Seg = nTotal;.  
78d0: 20 20 20 20 20 20 66 6f 72 28 69 53 65 67 3d 30        for(iSeg=0
78e0: 3b 20 69 53 65 67 3c 6e 54 6f 74 61 6c 3b 20 69  ; iSeg<nTotal; i
78f0: 53 65 67 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  Seg++){.        
7900: 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65 53    Fts5StructureS
7910: 65 67 6d 65 6e 74 20 2a 70 53 65 67 20 3d 20 26  egment *pSeg = &
7920: 70 4c 76 6c 2d 3e 61 53 65 67 5b 69 53 65 67 5d  pLvl->aSeg[iSeg]
7930: 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
7940: 69 3e 3d 6e 44 61 74 61 20 29 7b 0a 20 20 20 20  i>=nData ){.    
7950: 20 20 20 20 20 20 20 20 72 63 20 3d 20 46 54 53          rc = FTS
7960: 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20 20 20  5_CORRUPT;.     
7970: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
7980: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
7990: 20 20 20 20 69 20 2b 3d 20 66 74 73 35 47 65 74      i += fts5Get
79a0: 56 61 72 69 6e 74 33 32 28 26 70 44 61 74 61 5b  Varint32(&pData[
79b0: 69 5d 2c 20 70 53 65 67 2d 3e 69 53 65 67 69 64  i], pSeg->iSegid
79c0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 20 2b  );.          i +
79d0: 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e 74 33  = fts5GetVarint3
79e0: 32 28 26 70 44 61 74 61 5b 69 5d 2c 20 70 53 65  2(&pData[i], pSe
79f0: 67 2d 3e 70 67 6e 6f 46 69 72 73 74 29 3b 0a 20  g->pgnoFirst);. 
7a00: 20 20 20 20 20 20 20 20 20 69 20 2b 3d 20 66 74           i += ft
7a10: 73 35 47 65 74 56 61 72 69 6e 74 33 32 28 26 70  s5GetVarint32(&p
7a20: 44 61 74 61 5b 69 5d 2c 20 70 53 65 67 2d 3e 70  Data[i], pSeg->p
7a30: 67 6e 6f 4c 61 73 74 29 3b 0a 20 20 20 20 20 20  gnoLast);.      
7a40: 20 20 20 20 69 66 28 20 70 53 65 67 2d 3e 70 67      if( pSeg->pg
7a50: 6e 6f 4c 61 73 74 3c 70 53 65 67 2d 3e 70 67 6e  noLast<pSeg->pgn
7a60: 6f 46 69 72 73 74 20 29 7b 0a 20 20 20 20 20 20  oFirst ){.      
7a70: 20 20 20 20 20 20 72 63 20 3d 20 46 54 53 35 5f        rc = FTS5_
7a80: 43 4f 52 52 55 50 54 3b 0a 20 20 20 20 20 20 20  CORRUPT;.       
7a90: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
7aa0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
7ab0: 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 4c  }.        if( iL
7ac0: 76 6c 3e 30 20 26 26 20 70 4c 76 6c 5b 2d 31 5d  vl>0 && pLvl[-1]
7ad0: 2e 6e 4d 65 72 67 65 20 26 26 20 6e 54 6f 74 61  .nMerge && nTota
7ae0: 6c 3d 3d 30 20 29 20 72 63 20 3d 20 46 54 53 35  l==0 ) rc = FTS5
7af0: 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20 20 20 20  _CORRUPT;.      
7b00: 20 20 69 66 28 20 69 4c 76 6c 3d 3d 6e 4c 65 76    if( iLvl==nLev
7b10: 65 6c 2d 31 20 26 26 20 70 4c 76 6c 2d 3e 6e 4d  el-1 && pLvl->nM
7b20: 65 72 67 65 20 29 20 72 63 20 3d 20 46 54 53 35  erge ) rc = FTS5
7b30: 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20 20 20 20  _CORRUPT;.      
7b40: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
7b50: 6e 53 65 67 6d 65 6e 74 21 3d 30 20 26 26 20 72  nSegment!=0 && r
7b60: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c==SQLITE_OK ) r
7b70: 63 20 3d 20 46 54 53 35 5f 43 4f 52 52 55 50 54  c = FTS5_CORRUPT
7b80: 3b 0a 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  ;..    if( rc!=S
7b90: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
7ba0: 20 20 66 74 73 35 53 74 72 75 63 74 75 72 65 52    fts5StructureR
7bb0: 65 6c 65 61 73 65 28 70 52 65 74 29 3b 0a 20 20  elease(pRet);.  
7bc0: 20 20 20 20 70 52 65 74 20 3d 20 30 3b 0a 20 20      pRet = 0;.  
7bd0: 20 20 7d 0a 20 20 7d 0a 0a 20 20 2a 70 70 4f 75    }.  }..  *ppOu
7be0: 74 20 3d 20 70 52 65 74 3b 0a 20 20 72 65 74 75  t = pRet;.  retu
7bf0: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 0a  rn rc;.}../*.**.
7c00: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
7c10: 74 73 35 53 74 72 75 63 74 75 72 65 41 64 64 4c  ts5StructureAddL
7c20: 65 76 65 6c 28 69 6e 74 20 2a 70 52 63 2c 20 46  evel(int *pRc, F
7c30: 74 73 35 53 74 72 75 63 74 75 72 65 20 2a 2a 70  ts5Structure **p
7c40: 70 53 74 72 75 63 74 29 7b 0a 20 20 69 66 28 20  pStruct){.  if( 
7c50: 2a 70 52 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  *pRc==SQLITE_OK 
7c60: 29 7b 0a 20 20 20 20 46 74 73 35 53 74 72 75 63  ){.    Fts5Struc
7c70: 74 75 72 65 20 2a 70 53 74 72 75 63 74 20 3d 20  ture *pStruct = 
7c80: 2a 70 70 53 74 72 75 63 74 3b 0a 20 20 20 20 69  *ppStruct;.    i
7c90: 6e 74 20 6e 4c 65 76 65 6c 20 3d 20 70 53 74 72  nt nLevel = pStr
7ca0: 75 63 74 2d 3e 6e 4c 65 76 65 6c 3b 0a 20 20 20  uct->nLevel;.   
7cb0: 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6e   sqlite3_int64 n
7cc0: 42 79 74 65 20 3d 20 28 0a 20 20 20 20 20 20 20  Byte = (.       
7cd0: 20 73 69 7a 65 6f 66 28 46 74 73 35 53 74 72 75   sizeof(Fts5Stru
7ce0: 63 74 75 72 65 29 20 2b 20 20 20 20 20 20 20 20  cture) +        
7cf0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 69            /* Mai
7d00: 6e 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20  n structure */. 
7d10: 20 20 20 20 20 20 20 73 69 7a 65 6f 66 28 46 74         sizeof(Ft
7d20: 73 35 53 74 72 75 63 74 75 72 65 4c 65 76 65 6c  s5StructureLevel
7d30: 29 20 2a 20 28 6e 4c 65 76 65 6c 2b 31 29 20 20  ) * (nLevel+1)  
7d40: 2f 2a 20 61 4c 65 76 65 6c 5b 5d 20 61 72 72 61  /* aLevel[] arra
7d50: 79 20 2a 2f 0a 20 20 20 20 29 3b 0a 0a 20 20 20  y */.    );..   
7d60: 20 70 53 74 72 75 63 74 20 3d 20 73 71 6c 69 74   pStruct = sqlit
7d70: 65 33 5f 72 65 61 6c 6c 6f 63 36 34 28 70 53 74  e3_realloc64(pSt
7d80: 72 75 63 74 2c 20 6e 42 79 74 65 29 3b 0a 20 20  ruct, nByte);.  
7d90: 20 20 69 66 28 20 70 53 74 72 75 63 74 20 29 7b    if( pStruct ){
7da0: 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 26 70  .      memset(&p
7db0: 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 6e  Struct->aLevel[n
7dc0: 4c 65 76 65 6c 5d 2c 20 30 2c 20 73 69 7a 65 6f  Level], 0, sizeo
7dd0: 66 28 46 74 73 35 53 74 72 75 63 74 75 72 65 4c  f(Fts5StructureL
7de0: 65 76 65 6c 29 29 3b 0a 20 20 20 20 20 20 70 53  evel));.      pS
7df0: 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 2b 2b 3b  truct->nLevel++;
7e00: 0a 20 20 20 20 20 20 2a 70 70 53 74 72 75 63 74  .      *ppStruct
7e10: 20 3d 20 70 53 74 72 75 63 74 3b 0a 20 20 20 20   = pStruct;.    
7e20: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2a 70 52  }else{.      *pR
7e30: 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
7e40: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  ;.    }.  }.}../
7e50: 2a 0a 2a 2a 20 45 78 74 65 6e 64 20 6c 65 76 65  *.** Extend leve
7e60: 6c 20 69 4c 76 6c 20 73 6f 20 74 68 61 74 20 74  l iLvl so that t
7e70: 68 65 72 65 20 69 73 20 72 6f 6f 6d 20 66 6f 72  here is room for
7e80: 20 61 74 20 6c 65 61 73 74 20 6e 45 78 74 72 61   at least nExtra
7e90: 20 6d 6f 72 65 0a 2a 2a 20 73 65 67 6d 65 6e 74   more.** segment
7ea0: 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  s..*/.static voi
7eb0: 64 20 66 74 73 35 53 74 72 75 63 74 75 72 65 45  d fts5StructureE
7ec0: 78 74 65 6e 64 4c 65 76 65 6c 28 0a 20 20 69 6e  xtendLevel(.  in
7ed0: 74 20 2a 70 52 63 2c 20 0a 20 20 46 74 73 35 53  t *pRc, .  Fts5S
7ee0: 74 72 75 63 74 75 72 65 20 2a 70 53 74 72 75 63  tructure *pStruc
7ef0: 74 2c 20 0a 20 20 69 6e 74 20 69 4c 76 6c 2c 20  t, .  int iLvl, 
7f00: 0a 20 20 69 6e 74 20 6e 45 78 74 72 61 2c 20 0a  .  int nExtra, .
7f10: 20 20 69 6e 74 20 62 49 6e 73 65 72 74 0a 29 7b    int bInsert.){
7f20: 0a 20 20 69 66 28 20 2a 70 52 63 3d 3d 53 51 4c  .  if( *pRc==SQL
7f30: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 46 74  ITE_OK ){.    Ft
7f40: 73 35 53 74 72 75 63 74 75 72 65 4c 65 76 65 6c  s5StructureLevel
7f50: 20 2a 70 4c 76 6c 20 3d 20 26 70 53 74 72 75 63   *pLvl = &pStruc
7f60: 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d 3b  t->aLevel[iLvl];
7f70: 0a 20 20 20 20 46 74 73 35 53 74 72 75 63 74 75  .    Fts5Structu
7f80: 72 65 53 65 67 6d 65 6e 74 20 2a 61 4e 65 77 3b  reSegment *aNew;
7f90: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74  .    sqlite3_int
7fa0: 36 34 20 6e 42 79 74 65 3b 0a 0a 20 20 20 20 6e  64 nByte;..    n
7fb0: 42 79 74 65 20 3d 20 28 70 4c 76 6c 2d 3e 6e 53  Byte = (pLvl->nS
7fc0: 65 67 20 2b 20 6e 45 78 74 72 61 29 20 2a 20 73  eg + nExtra) * s
7fd0: 69 7a 65 6f 66 28 46 74 73 35 53 74 72 75 63 74  izeof(Fts5Struct
7fe0: 75 72 65 53 65 67 6d 65 6e 74 29 3b 0a 20 20 20  ureSegment);.   
7ff0: 20 61 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 5f   aNew = sqlite3_
8000: 72 65 61 6c 6c 6f 63 36 34 28 70 4c 76 6c 2d 3e  realloc64(pLvl->
8010: 61 53 65 67 2c 20 6e 42 79 74 65 29 3b 0a 20 20  aSeg, nByte);.  
8020: 20 20 69 66 28 20 61 4e 65 77 20 29 7b 0a 20 20    if( aNew ){.  
8030: 20 20 20 20 69 66 28 20 62 49 6e 73 65 72 74 3d      if( bInsert=
8040: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 65  =0 ){.        me
8050: 6d 73 65 74 28 26 61 4e 65 77 5b 70 4c 76 6c 2d  mset(&aNew[pLvl-
8060: 3e 6e 53 65 67 5d 2c 20 30 2c 20 73 69 7a 65 6f  >nSeg], 0, sizeo
8070: 66 28 46 74 73 35 53 74 72 75 63 74 75 72 65 53  f(Fts5StructureS
8080: 65 67 6d 65 6e 74 29 20 2a 20 6e 45 78 74 72 61  egment) * nExtra
8090: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
80a0: 20 20 20 20 20 20 20 20 69 6e 74 20 6e 4d 6f 76          int nMov
80b0: 65 20 3d 20 70 4c 76 6c 2d 3e 6e 53 65 67 20 2a  e = pLvl->nSeg *
80c0: 20 73 69 7a 65 6f 66 28 46 74 73 35 53 74 72 75   sizeof(Fts5Stru
80d0: 63 74 75 72 65 53 65 67 6d 65 6e 74 29 3b 0a 20  ctureSegment);. 
80e0: 20 20 20 20 20 20 20 6d 65 6d 6d 6f 76 65 28 26         memmove(&
80f0: 61 4e 65 77 5b 6e 45 78 74 72 61 5d 2c 20 61 4e  aNew[nExtra], aN
8100: 65 77 2c 20 6e 4d 6f 76 65 29 3b 0a 20 20 20 20  ew, nMove);.    
8110: 20 20 20 20 6d 65 6d 73 65 74 28 61 4e 65 77 2c      memset(aNew,
8120: 20 30 2c 20 73 69 7a 65 6f 66 28 46 74 73 35 53   0, sizeof(Fts5S
8130: 74 72 75 63 74 75 72 65 53 65 67 6d 65 6e 74 29  tructureSegment)
8140: 20 2a 20 6e 45 78 74 72 61 29 3b 0a 20 20 20 20   * nExtra);.    
8150: 20 20 7d 0a 20 20 20 20 20 20 70 4c 76 6c 2d 3e    }.      pLvl->
8160: 61 53 65 67 20 3d 20 61 4e 65 77 3b 0a 20 20 20  aSeg = aNew;.   
8170: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2a 70   }else{.      *p
8180: 52 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  Rc = SQLITE_NOME
8190: 4d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  M;.    }.  }.}..
81a0: 73 74 61 74 69 63 20 46 74 73 35 53 74 72 75 63  static Fts5Struc
81b0: 74 75 72 65 20 2a 66 74 73 35 53 74 72 75 63 74  ture *fts5Struct
81c0: 75 72 65 52 65 61 64 55 6e 63 61 63 68 65 64 28  ureReadUncached(
81d0: 46 74 73 35 49 6e 64 65 78 20 2a 70 29 7b 0a 20  Fts5Index *p){. 
81e0: 20 46 74 73 35 53 74 72 75 63 74 75 72 65 20 2a   Fts5Structure *
81f0: 70 52 65 74 20 3d 20 30 3b 0a 20 20 46 74 73 35  pRet = 0;.  Fts5
8200: 43 6f 6e 66 69 67 20 2a 70 43 6f 6e 66 69 67 20  Config *pConfig 
8210: 3d 20 70 2d 3e 70 43 6f 6e 66 69 67 3b 0a 20 20  = p->pConfig;.  
8220: 69 6e 74 20 69 43 6f 6f 6b 69 65 3b 20 20 20 20  int iCookie;    
8230: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8240: 2f 2a 20 43 6f 6e 66 69 67 75 72 61 74 69 6f 6e  /* Configuration
8250: 20 63 6f 6f 6b 69 65 20 2a 2f 0a 20 20 46 74 73   cookie */.  Fts
8260: 35 44 61 74 61 20 2a 70 44 61 74 61 3b 0a 0a 20  5Data *pData;.. 
8270: 20 70 44 61 74 61 20 3d 20 66 74 73 35 44 61 74   pData = fts5Dat
8280: 61 52 65 61 64 28 70 2c 20 46 54 53 35 5f 53 54  aRead(p, FTS5_ST
8290: 52 55 43 54 55 52 45 5f 52 4f 57 49 44 29 3b 0a  RUCTURE_ROWID);.
82a0: 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c    if( p->rc==SQL
82b0: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2f 2a  ITE_OK ){.    /*
82c0: 20 54 4f 44 4f 3a 20 44 6f 20 77 65 20 6e 65 65   TODO: Do we nee
82d0: 64 20 74 68 69 73 20 69 66 20 74 68 65 20 6c 65  d this if the le
82e0: 61 66 2d 69 6e 64 65 78 20 69 73 20 61 70 70 65  af-index is appe
82f0: 6e 64 65 64 3f 20 50 72 6f 62 61 62 6c 79 2e 2e  nded? Probably..
8300: 2e 20 2a 2f 0a 20 20 20 20 6d 65 6d 73 65 74 28  . */.    memset(
8310: 26 70 44 61 74 61 2d 3e 70 5b 70 44 61 74 61 2d  &pData->p[pData-
8320: 3e 6e 6e 5d 2c 20 30 2c 20 46 54 53 35 5f 44 41  >nn], 0, FTS5_DA
8330: 54 41 5f 50 41 44 44 49 4e 47 29 3b 0a 20 20 20  TA_PADDING);.   
8340: 20 70 2d 3e 72 63 20 3d 20 66 74 73 35 53 74 72   p->rc = fts5Str
8350: 75 63 74 75 72 65 44 65 63 6f 64 65 28 70 44 61  uctureDecode(pDa
8360: 74 61 2d 3e 70 2c 20 70 44 61 74 61 2d 3e 6e 6e  ta->p, pData->nn
8370: 2c 20 26 69 43 6f 6f 6b 69 65 2c 20 26 70 52 65  , &iCookie, &pRe
8380: 74 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 72  t);.    if( p->r
8390: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
83a0: 70 43 6f 6e 66 69 67 2d 3e 69 43 6f 6f 6b 69 65  pConfig->iCookie
83b0: 21 3d 69 43 6f 6f 6b 69 65 20 29 7b 0a 20 20 20  !=iCookie ){.   
83c0: 20 20 20 70 2d 3e 72 63 20 3d 20 73 71 6c 69 74     p->rc = sqlit
83d0: 65 33 46 74 73 35 43 6f 6e 66 69 67 4c 6f 61 64  e3Fts5ConfigLoad
83e0: 28 70 43 6f 6e 66 69 67 2c 20 69 43 6f 6f 6b 69  (pConfig, iCooki
83f0: 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 74  e);.    }.    ft
8400: 73 35 44 61 74 61 52 65 6c 65 61 73 65 28 70 44  s5DataRelease(pD
8410: 61 74 61 29 3b 0a 20 20 20 20 69 66 28 20 70 2d  ata);.    if( p-
8420: 3e 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  >rc!=SQLITE_OK )
8430: 7b 0a 20 20 20 20 20 20 66 74 73 35 53 74 72 75  {.      fts5Stru
8440: 63 74 75 72 65 52 65 6c 65 61 73 65 28 70 52 65  ctureRelease(pRe
8450: 74 29 3b 0a 20 20 20 20 20 20 70 52 65 74 20 3d  t);.      pRet =
8460: 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20   0;.    }.  }.. 
8470: 20 72 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a   return pRet;.}.
8480: 0a 73 74 61 74 69 63 20 69 36 34 20 66 74 73 35  .static i64 fts5
8490: 49 6e 64 65 78 44 61 74 61 56 65 72 73 69 6f 6e  IndexDataVersion
84a0: 28 46 74 73 35 49 6e 64 65 78 20 2a 70 29 7b 0a  (Fts5Index *p){.
84b0: 20 20 69 36 34 20 69 56 65 72 73 69 6f 6e 20 3d    i64 iVersion =
84c0: 20 30 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 72 63   0;..  if( p->rc
84d0: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
84e0: 20 20 20 69 66 28 20 70 2d 3e 70 44 61 74 61 56     if( p->pDataV
84f0: 65 72 73 69 6f 6e 3d 3d 30 20 29 7b 0a 20 20 20  ersion==0 ){.   
8500: 20 20 20 70 2d 3e 72 63 20 3d 20 66 74 73 35 49     p->rc = fts5I
8510: 6e 64 65 78 50 72 65 70 61 72 65 53 74 6d 74 28  ndexPrepareStmt(
8520: 70 2c 20 26 70 2d 3e 70 44 61 74 61 56 65 72 73  p, &p->pDataVers
8530: 69 6f 6e 2c 20 0a 20 20 20 20 20 20 20 20 20 20  ion, .          
8540: 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
8550: 22 50 52 41 47 4d 41 20 25 51 2e 64 61 74 61 5f  "PRAGMA %Q.data_
8560: 76 65 72 73 69 6f 6e 22 2c 20 70 2d 3e 70 43 6f  version", p->pCo
8570: 6e 66 69 67 2d 3e 7a 44 62 29 0a 20 20 20 20 20  nfig->zDb).     
8580: 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 69 66       );.      if
8590: 28 20 70 2d 3e 72 63 20 29 20 72 65 74 75 72 6e  ( p->rc ) return
85a0: 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69   0;.    }..    i
85b0: 66 28 20 53 51 4c 49 54 45 5f 52 4f 57 3d 3d 73  f( SQLITE_ROW==s
85c0: 71 6c 69 74 65 33 5f 73 74 65 70 28 70 2d 3e 70  qlite3_step(p->p
85d0: 44 61 74 61 56 65 72 73 69 6f 6e 29 20 29 7b 0a  DataVersion) ){.
85e0: 20 20 20 20 20 20 69 56 65 72 73 69 6f 6e 20 3d        iVersion =
85f0: 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
8600: 69 6e 74 36 34 28 70 2d 3e 70 44 61 74 61 56 65  int64(p->pDataVe
8610: 72 73 69 6f 6e 2c 20 30 29 3b 0a 20 20 20 20 7d  rsion, 0);.    }
8620: 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 73 71 6c  .    p->rc = sql
8630: 69 74 65 33 5f 72 65 73 65 74 28 70 2d 3e 70 44  ite3_reset(p->pD
8640: 61 74 61 56 65 72 73 69 6f 6e 29 3b 0a 20 20 7d  ataVersion);.  }
8650: 0a 0a 20 20 72 65 74 75 72 6e 20 69 56 65 72 73  ..  return iVers
8660: 69 6f 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  ion;.}../*.** Re
8670: 61 64 2c 20 64 65 73 65 72 69 61 6c 69 7a 65 20  ad, deserialize 
8680: 61 6e 64 20 72 65 74 75 72 6e 20 74 68 65 20 73  and return the s
8690: 74 72 75 63 74 75 72 65 20 72 65 63 6f 72 64 2e  tructure record.
86a0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 46 74 73 35 53  .**.** The Fts5S
86b0: 74 72 75 63 74 75 72 65 2e 61 4c 65 76 65 6c 5b  tructure.aLevel[
86c0: 5d 20 61 6e 64 20 65 61 63 68 20 46 74 73 35 53  ] and each Fts5S
86d0: 74 72 75 63 74 75 72 65 4c 65 76 65 6c 2e 61 53  tructureLevel.aS
86e0: 65 67 5b 5d 20 61 72 72 61 79 0a 2a 2a 20 61 72  eg[] array.** ar
86f0: 65 20 6f 76 65 72 2d 61 6c 6c 6f 63 61 74 65 64  e over-allocated
8700: 20 61 73 20 64 65 73 63 72 69 62 65 64 20 66 6f   as described fo
8710: 72 20 66 75 6e 63 74 69 6f 6e 20 66 74 73 35 53  r function fts5S
8720: 74 72 75 63 74 75 72 65 44 65 63 6f 64 65 28 29  tructureDecode()
8730: 20 0a 2a 2a 20 61 62 6f 76 65 2e 0a 2a 2a 0a 2a   .** above..**.*
8740: 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  * If an error oc
8750: 63 75 72 73 2c 20 4e 55 4c 4c 20 69 73 20 72 65  curs, NULL is re
8760: 74 75 72 6e 65 64 20 61 6e 64 20 61 6e 20 65 72  turned and an er
8770: 72 6f 72 20 63 6f 64 65 20 6c 65 66 74 20 69 6e  ror code left in
8780: 20 74 68 65 0a 2a 2a 20 46 74 73 35 49 6e 64 65   the.** Fts5Inde
8790: 78 20 68 61 6e 64 6c 65 2e 20 49 66 20 61 6e 20  x handle. If an 
87a0: 65 72 72 6f 72 20 68 61 73 20 61 6c 72 65 61 64  error has alread
87b0: 79 20 6f 63 63 75 72 72 65 64 20 77 68 65 6e 20  y occurred when 
87c0: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a  this function.**
87d0: 20 69 73 20 63 61 6c 6c 65 64 2c 20 69 74 20 69   is called, it i
87e0: 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74  s a no-op..*/.st
87f0: 61 74 69 63 20 46 74 73 35 53 74 72 75 63 74 75  atic Fts5Structu
8800: 72 65 20 2a 66 74 73 35 53 74 72 75 63 74 75 72  re *fts5Structur
8810: 65 52 65 61 64 28 46 74 73 35 49 6e 64 65 78 20  eRead(Fts5Index 
8820: 2a 70 29 7b 0a 0a 20 20 69 66 28 20 70 2d 3e 70  *p){..  if( p->p
8830: 53 74 72 75 63 74 3d 3d 30 20 29 7b 0a 20 20 20  Struct==0 ){.   
8840: 20 70 2d 3e 69 53 74 72 75 63 74 56 65 72 73 69   p->iStructVersi
8850: 6f 6e 20 3d 20 66 74 73 35 49 6e 64 65 78 44 61  on = fts5IndexDa
8860: 74 61 56 65 72 73 69 6f 6e 28 70 29 3b 0a 20 20  taVersion(p);.  
8870: 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c    if( p->rc==SQL
8880: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
8890: 70 2d 3e 70 53 74 72 75 63 74 20 3d 20 66 74 73  p->pStruct = fts
88a0: 35 53 74 72 75 63 74 75 72 65 52 65 61 64 55 6e  5StructureReadUn
88b0: 63 61 63 68 65 64 28 70 29 3b 0a 20 20 20 20 7d  cached(p);.    }
88c0: 0a 20 20 7d 0a 0a 23 69 66 20 30 0a 20 20 65 6c  .  }..#if 0.  el
88d0: 73 65 7b 0a 20 20 20 20 46 74 73 35 53 74 72 75  se{.    Fts5Stru
88e0: 63 74 75 72 65 20 2a 70 54 65 73 74 20 3d 20 66  cture *pTest = f
88f0: 74 73 35 53 74 72 75 63 74 75 72 65 52 65 61 64  ts5StructureRead
8900: 55 6e 63 61 63 68 65 64 28 70 29 3b 0a 20 20 20  Uncached(p);.   
8910: 20 69 66 28 20 70 54 65 73 74 20 29 7b 0a 20 20   if( pTest ){.  
8920: 20 20 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20      int i, j;.  
8930: 20 20 20 20 61 73 73 65 72 74 5f 6e 63 28 20 70      assert_nc( p
8940: 2d 3e 70 53 74 72 75 63 74 2d 3e 6e 53 65 67 6d  ->pStruct->nSegm
8950: 65 6e 74 3d 3d 70 54 65 73 74 2d 3e 6e 53 65 67  ent==pTest->nSeg
8960: 6d 65 6e 74 20 29 3b 0a 20 20 20 20 20 20 61 73  ment );.      as
8970: 73 65 72 74 5f 6e 63 28 20 70 2d 3e 70 53 74 72  sert_nc( p->pStr
8980: 75 63 74 2d 3e 6e 4c 65 76 65 6c 3d 3d 70 54 65  uct->nLevel==pTe
8990: 73 74 2d 3e 6e 4c 65 76 65 6c 20 29 3b 0a 20 20  st->nLevel );.  
89a0: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
89b0: 54 65 73 74 2d 3e 6e 4c 65 76 65 6c 3b 20 69 2b  Test->nLevel; i+
89c0: 2b 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65  +){.        asse
89d0: 72 74 5f 6e 63 28 20 70 2d 3e 70 53 74 72 75 63  rt_nc( p->pStruc
89e0: 74 2d 3e 61 4c 65 76 65 6c 5b 69 5d 2e 6e 4d 65  t->aLevel[i].nMe
89f0: 72 67 65 3d 3d 70 54 65 73 74 2d 3e 61 4c 65 76  rge==pTest->aLev
8a00: 65 6c 5b 69 5d 2e 6e 4d 65 72 67 65 20 29 3b 0a  el[i].nMerge );.
8a10: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 5f 6e          assert_n
8a20: 63 28 20 70 2d 3e 70 53 74 72 75 63 74 2d 3e 61  c( p->pStruct->a
8a30: 4c 65 76 65 6c 5b 69 5d 2e 6e 53 65 67 3d 3d 70  Level[i].nSeg==p
8a40: 54 65 73 74 2d 3e 61 4c 65 76 65 6c 5b 69 5d 2e  Test->aLevel[i].
8a50: 6e 53 65 67 20 29 3b 0a 20 20 20 20 20 20 20 20  nSeg );.        
8a60: 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 54 65 73 74  for(j=0; j<pTest
8a70: 2d 3e 61 4c 65 76 65 6c 5b 69 5d 2e 6e 53 65 67  ->aLevel[i].nSeg
8a80: 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; j++){.        
8a90: 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65 53    Fts5StructureS
8aa0: 65 67 6d 65 6e 74 20 2a 70 31 20 3d 20 26 70 54  egment *p1 = &pT
8ab0: 65 73 74 2d 3e 61 4c 65 76 65 6c 5b 69 5d 2e 61  est->aLevel[i].a
8ac0: 53 65 67 5b 6a 5d 3b 0a 20 20 20 20 20 20 20 20  Seg[j];.        
8ad0: 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65 53    Fts5StructureS
8ae0: 65 67 6d 65 6e 74 20 2a 70 32 20 3d 20 26 70 2d  egment *p2 = &p-
8af0: 3e 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c  >pStruct->aLevel
8b00: 5b 69 5d 2e 61 53 65 67 5b 6a 5d 3b 0a 20 20 20  [i].aSeg[j];.   
8b10: 20 20 20 20 20 20 20 61 73 73 65 72 74 5f 6e 63         assert_nc
8b20: 28 20 70 31 2d 3e 69 53 65 67 69 64 3d 3d 70 32  ( p1->iSegid==p2
8b30: 2d 3e 69 53 65 67 69 64 20 29 3b 0a 20 20 20 20  ->iSegid );.    
8b40: 20 20 20 20 20 20 61 73 73 65 72 74 5f 6e 63 28        assert_nc(
8b50: 20 70 31 2d 3e 70 67 6e 6f 46 69 72 73 74 3d 3d   p1->pgnoFirst==
8b60: 70 32 2d 3e 70 67 6e 6f 46 69 72 73 74 20 29 3b  p2->pgnoFirst );
8b70: 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
8b80: 74 5f 6e 63 28 20 70 31 2d 3e 70 67 6e 6f 4c 61  t_nc( p1->pgnoLa
8b90: 73 74 3d 3d 70 32 2d 3e 70 67 6e 6f 4c 61 73 74  st==p2->pgnoLast
8ba0: 20 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   );.        }.  
8bb0: 20 20 20 20 7d 0a 20 20 20 20 20 20 66 74 73 35      }.      fts5
8bc0: 53 74 72 75 63 74 75 72 65 52 65 6c 65 61 73 65  StructureRelease
8bd0: 28 70 54 65 73 74 29 3b 0a 20 20 20 20 7d 0a 20  (pTest);.    }. 
8be0: 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28   }.#endif..  if(
8bf0: 20 70 2d 3e 72 63 21 3d 53 51 4c 49 54 45 5f 4f   p->rc!=SQLITE_O
8c00: 4b 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  K ) return 0;.  
8c10: 61 73 73 65 72 74 28 20 70 2d 3e 69 53 74 72 75  assert( p->iStru
8c20: 63 74 56 65 72 73 69 6f 6e 21 3d 30 20 29 3b 0a  ctVersion!=0 );.
8c30: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 53 74    assert( p->pSt
8c40: 72 75 63 74 21 3d 30 20 29 3b 0a 20 20 66 74 73  ruct!=0 );.  fts
8c50: 35 53 74 72 75 63 74 75 72 65 52 65 66 28 70 2d  5StructureRef(p-
8c60: 3e 70 53 74 72 75 63 74 29 3b 0a 20 20 72 65 74  >pStruct);.  ret
8c70: 75 72 6e 20 70 2d 3e 70 53 74 72 75 63 74 3b 0a  urn p->pStruct;.
8c80: 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  }..static void f
8c90: 74 73 35 53 74 72 75 63 74 75 72 65 49 6e 76 61  ts5StructureInva
8ca0: 6c 69 64 61 74 65 28 46 74 73 35 49 6e 64 65 78  lidate(Fts5Index
8cb0: 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e 70   *p){.  if( p->p
8cc0: 53 74 72 75 63 74 20 29 7b 0a 20 20 20 20 66 74  Struct ){.    ft
8cd0: 73 35 53 74 72 75 63 74 75 72 65 52 65 6c 65 61  s5StructureRelea
8ce0: 73 65 28 70 2d 3e 70 53 74 72 75 63 74 29 3b 0a  se(p->pStruct);.
8cf0: 20 20 20 20 70 2d 3e 70 53 74 72 75 63 74 20 3d      p->pStruct =
8d00: 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a   0;.  }.}../*.**
8d10: 20 52 65 74 75 72 6e 20 74 68 65 20 74 6f 74 61   Return the tota
8d20: 6c 20 6e 75 6d 62 65 72 20 6f 66 20 73 65 67 6d  l number of segm
8d30: 65 6e 74 73 20 69 6e 20 69 6e 64 65 78 20 73 74  ents in index st
8d40: 72 75 63 74 75 72 65 20 70 53 74 72 75 63 74 2e  ructure pStruct.
8d50: 20 54 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f   This.** functio
8d60: 6e 20 69 73 20 6f 6e 6c 79 20 65 76 65 72 20 75  n is only ever u
8d70: 73 65 64 20 61 73 20 70 61 72 74 20 6f 66 20 61  sed as part of a
8d80: 73 73 65 72 74 28 29 20 63 6f 6e 64 69 74 69 6f  ssert() conditio
8d90: 6e 73 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51  ns..*/.#ifdef SQ
8da0: 4c 49 54 45 5f 44 45 42 55 47 0a 73 74 61 74 69  LITE_DEBUG.stati
8db0: 63 20 69 6e 74 20 66 74 73 35 53 74 72 75 63 74  c int fts5Struct
8dc0: 75 72 65 43 6f 75 6e 74 53 65 67 6d 65 6e 74 73  ureCountSegments
8dd0: 28 46 74 73 35 53 74 72 75 63 74 75 72 65 20 2a  (Fts5Structure *
8de0: 70 53 74 72 75 63 74 29 7b 0a 20 20 69 6e 74 20  pStruct){.  int 
8df0: 6e 53 65 67 6d 65 6e 74 20 3d 20 30 3b 20 20 20  nSegment = 0;   
8e00: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
8e10: 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 73  otal number of s
8e20: 65 67 6d 65 6e 74 73 20 2a 2f 0a 20 20 69 66 28  egments */.  if(
8e30: 20 70 53 74 72 75 63 74 20 29 7b 0a 20 20 20 20   pStruct ){.    
8e40: 69 6e 74 20 69 4c 76 6c 3b 20 20 20 20 20 20 20  int iLvl;       
8e50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
8e60: 20 55 73 65 64 20 74 6f 20 69 74 65 72 61 74 65   Used to iterate
8e70: 20 74 68 72 6f 75 67 68 20 6c 65 76 65 6c 73 20   through levels 
8e80: 2a 2f 0a 20 20 20 20 66 6f 72 28 69 4c 76 6c 3d  */.    for(iLvl=
8e90: 30 3b 20 69 4c 76 6c 3c 70 53 74 72 75 63 74 2d  0; iLvl<pStruct-
8ea0: 3e 6e 4c 65 76 65 6c 3b 20 69 4c 76 6c 2b 2b 29  >nLevel; iLvl++)
8eb0: 7b 0a 20 20 20 20 20 20 6e 53 65 67 6d 65 6e 74  {.      nSegment
8ec0: 20 2b 3d 20 70 53 74 72 75 63 74 2d 3e 61 4c 65   += pStruct->aLe
8ed0: 76 65 6c 5b 69 4c 76 6c 5d 2e 6e 53 65 67 3b 0a  vel[iLvl].nSeg;.
8ee0: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74      }.  }..  ret
8ef0: 75 72 6e 20 6e 53 65 67 6d 65 6e 74 3b 0a 7d 0a  urn nSegment;.}.
8f00: 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20  #endif..#define 
8f10: 66 74 73 35 42 75 66 66 65 72 53 61 66 65 41 70  fts5BufferSafeAp
8f20: 70 65 6e 64 42 6c 6f 62 28 70 42 75 66 2c 20 70  pendBlob(pBuf, p
8f30: 42 6c 6f 62 2c 20 6e 42 6c 6f 62 29 20 7b 20 20  Blob, nBlob) {  
8f40: 20 20 20 5c 0a 20 20 61 73 73 65 72 74 28 20 28     \.  assert( (
8f50: 70 42 75 66 29 2d 3e 6e 53 70 61 63 65 3e 3d 28  pBuf)->nSpace>=(
8f60: 28 70 42 75 66 29 2d 3e 6e 2b 6e 42 6c 6f 62 29  (pBuf)->n+nBlob)
8f70: 20 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   );             
8f80: 5c 0a 20 20 6d 65 6d 63 70 79 28 26 28 70 42 75  \.  memcpy(&(pBu
8f90: 66 29 2d 3e 70 5b 28 70 42 75 66 29 2d 3e 6e 5d  f)->p[(pBuf)->n]
8fa0: 2c 20 70 42 6c 6f 62 2c 20 6e 42 6c 6f 62 29 3b  , pBlob, nBlob);
8fb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
8fc0: 20 28 70 42 75 66 29 2d 3e 6e 20 2b 3d 20 6e 42   (pBuf)->n += nB
8fd0: 6c 6f 62 3b 20 20 20 20 20 20 20 20 20 20 20 20  lob;            
8fe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8ff0: 20 20 20 20 20 20 20 20 20 20 5c 0a 7d 0a 0a 23            \.}..#
9000: 64 65 66 69 6e 65 20 66 74 73 35 42 75 66 66 65  define fts5Buffe
9010: 72 53 61 66 65 41 70 70 65 6e 64 56 61 72 69 6e  rSafeAppendVarin
9020: 74 28 70 42 75 66 2c 20 69 56 61 6c 29 20 7b 20  t(pBuf, iVal) { 
9030: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
9040: 0a 20 20 28 70 42 75 66 29 2d 3e 6e 20 2b 3d 20  .  (pBuf)->n += 
9050: 73 71 6c 69 74 65 33 46 74 73 35 50 75 74 56 61  sqlite3Fts5PutVa
9060: 72 69 6e 74 28 26 28 70 42 75 66 29 2d 3e 70 5b  rint(&(pBuf)->p[
9070: 28 70 42 75 66 29 2d 3e 6e 5d 2c 20 28 69 56 61  (pBuf)->n], (iVa
9080: 6c 29 29 3b 20 20 5c 0a 20 20 61 73 73 65 72 74  l));  \.  assert
9090: 28 20 28 70 42 75 66 29 2d 3e 6e 53 70 61 63 65  ( (pBuf)->nSpace
90a0: 3e 3d 28 70 42 75 66 29 2d 3e 6e 20 29 3b 20 20  >=(pBuf)->n );  
90b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
90c0: 20 20 20 20 20 20 20 20 5c 0a 7d 0a 0a 0a 2f 2a          \.}.../*
90d0: 0a 2a 2a 20 53 65 72 69 61 6c 69 7a 65 20 61 6e  .** Serialize an
90e0: 64 20 73 74 6f 72 65 20 74 68 65 20 22 73 74 72  d store the "str
90f0: 75 63 74 75 72 65 22 20 72 65 63 6f 72 64 2e 0a  ucture" record..
9100: 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f  **.** If an erro
9110: 72 20 6f 63 63 75 72 73 2c 20 6c 65 61 76 65 20  r occurs, leave 
9120: 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 6e  an error code in
9130: 20 74 68 65 20 46 74 73 35 49 6e 64 65 78 20 6f   the Fts5Index o
9140: 62 6a 65 63 74 2e 20 49 66 20 61 6e 0a 2a 2a 20  bject. If an.** 
9150: 65 72 72 6f 72 20 68 61 73 20 61 6c 72 65 61 64  error has alread
9160: 79 20 6f 63 63 75 72 72 65 64 2c 20 74 68 69 73  y occurred, this
9170: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e   function is a n
9180: 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  o-op..*/.static 
9190: 76 6f 69 64 20 66 74 73 35 53 74 72 75 63 74 75  void fts5Structu
91a0: 72 65 57 72 69 74 65 28 46 74 73 35 49 6e 64 65  reWrite(Fts5Inde
91b0: 78 20 2a 70 2c 20 46 74 73 35 53 74 72 75 63 74  x *p, Fts5Struct
91c0: 75 72 65 20 2a 70 53 74 72 75 63 74 29 7b 0a 20  ure *pStruct){. 
91d0: 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49   if( p->rc==SQLI
91e0: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 46 74 73  TE_OK ){.    Fts
91f0: 35 42 75 66 66 65 72 20 62 75 66 3b 20 20 20 20  5Buffer buf;    
9200: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 75             /* Bu
9210: 66 66 65 72 20 74 6f 20 73 65 72 69 61 6c 69 7a  ffer to serializ
9220: 65 20 72 65 63 6f 72 64 20 69 6e 74 6f 20 2a 2f  e record into */
9230: 0a 20 20 20 20 69 6e 74 20 69 4c 76 6c 3b 20 20  .    int iLvl;  
9240: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9250: 20 20 20 2f 2a 20 55 73 65 64 20 74 6f 20 69 74     /* Used to it
9260: 65 72 61 74 65 20 74 68 72 6f 75 67 68 20 6c 65  erate through le
9270: 76 65 6c 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20  vels */.    int 
9280: 69 43 6f 6f 6b 69 65 3b 20 20 20 20 20 20 20 20  iCookie;        
9290: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6f            /* Coo
92a0: 6b 69 65 20 76 61 6c 75 65 20 74 6f 20 73 74 6f  kie value to sto
92b0: 72 65 20 2a 2f 0a 0a 20 20 20 20 61 73 73 65 72  re */..    asser
92c0: 74 28 20 70 53 74 72 75 63 74 2d 3e 6e 53 65 67  t( pStruct->nSeg
92d0: 6d 65 6e 74 3d 3d 66 74 73 35 53 74 72 75 63 74  ment==fts5Struct
92e0: 75 72 65 43 6f 75 6e 74 53 65 67 6d 65 6e 74 73  ureCountSegments
92f0: 28 70 53 74 72 75 63 74 29 20 29 3b 0a 20 20 20  (pStruct) );.   
9300: 20 6d 65 6d 73 65 74 28 26 62 75 66 2c 20 30 2c   memset(&buf, 0,
9310: 20 73 69 7a 65 6f 66 28 46 74 73 35 42 75 66 66   sizeof(Fts5Buff
9320: 65 72 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 41 70  er));..    /* Ap
9330: 70 65 6e 64 20 74 68 65 20 63 75 72 72 65 6e 74  pend the current
9340: 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 63   configuration c
9350: 6f 6f 6b 69 65 20 2a 2f 0a 20 20 20 20 69 43 6f  ookie */.    iCo
9360: 6f 6b 69 65 20 3d 20 70 2d 3e 70 43 6f 6e 66 69  okie = p->pConfi
9370: 67 2d 3e 69 43 6f 6f 6b 69 65 3b 0a 20 20 20 20  g->iCookie;.    
9380: 69 66 28 20 69 43 6f 6f 6b 69 65 3c 30 20 29 20  if( iCookie<0 ) 
9390: 69 43 6f 6f 6b 69 65 20 3d 20 30 3b 0a 0a 20 20  iCookie = 0;..  
93a0: 20 20 69 66 28 20 30 3d 3d 73 71 6c 69 74 65 33    if( 0==sqlite3
93b0: 46 74 73 35 42 75 66 66 65 72 53 69 7a 65 28 26  Fts5BufferSize(&
93c0: 70 2d 3e 72 63 2c 20 26 62 75 66 2c 20 34 2b 39  p->rc, &buf, 4+9
93d0: 2b 39 2b 39 29 20 29 7b 0a 20 20 20 20 20 20 73  +9+9) ){.      s
93e0: 71 6c 69 74 65 33 46 74 73 35 50 75 74 33 32 28  qlite3Fts5Put32(
93f0: 62 75 66 2e 70 2c 20 69 43 6f 6f 6b 69 65 29 3b  buf.p, iCookie);
9400: 0a 20 20 20 20 20 20 62 75 66 2e 6e 20 3d 20 34  .      buf.n = 4
9410: 3b 0a 20 20 20 20 20 20 66 74 73 35 42 75 66 66  ;.      fts5Buff
9420: 65 72 53 61 66 65 41 70 70 65 6e 64 56 61 72 69  erSafeAppendVari
9430: 6e 74 28 26 62 75 66 2c 20 70 53 74 72 75 63 74  nt(&buf, pStruct
9440: 2d 3e 6e 4c 65 76 65 6c 29 3b 0a 20 20 20 20 20  ->nLevel);.     
9450: 20 66 74 73 35 42 75 66 66 65 72 53 61 66 65 41   fts5BufferSafeA
9460: 70 70 65 6e 64 56 61 72 69 6e 74 28 26 62 75 66  ppendVarint(&buf
9470: 2c 20 70 53 74 72 75 63 74 2d 3e 6e 53 65 67 6d  , pStruct->nSegm
9480: 65 6e 74 29 3b 0a 20 20 20 20 20 20 66 74 73 35  ent);.      fts5
9490: 42 75 66 66 65 72 53 61 66 65 41 70 70 65 6e 64  BufferSafeAppend
94a0: 56 61 72 69 6e 74 28 26 62 75 66 2c 20 28 69 36  Varint(&buf, (i6
94b0: 34 29 70 53 74 72 75 63 74 2d 3e 6e 57 72 69 74  4)pStruct->nWrit
94c0: 65 43 6f 75 6e 74 65 72 29 3b 0a 20 20 20 20 7d  eCounter);.    }
94d0: 0a 0a 20 20 20 20 66 6f 72 28 69 4c 76 6c 3d 30  ..    for(iLvl=0
94e0: 3b 20 69 4c 76 6c 3c 70 53 74 72 75 63 74 2d 3e  ; iLvl<pStruct->
94f0: 6e 4c 65 76 65 6c 3b 20 69 4c 76 6c 2b 2b 29 7b  nLevel; iLvl++){
9500: 0a 20 20 20 20 20 20 69 6e 74 20 69 53 65 67 3b  .      int iSeg;
9510: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9520: 20 20 20 20 20 2f 2a 20 55 73 65 64 20 74 6f 20       /* Used to 
9530: 69 74 65 72 61 74 65 20 74 68 72 6f 75 67 68 20  iterate through 
9540: 73 65 67 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20  segments */.    
9550: 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65 4c    Fts5StructureL
9560: 65 76 65 6c 20 2a 70 4c 76 6c 20 3d 20 26 70 53  evel *pLvl = &pS
9570: 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c  truct->aLevel[iL
9580: 76 6c 5d 3b 0a 20 20 20 20 20 20 66 74 73 35 42  vl];.      fts5B
9590: 75 66 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e  ufferAppendVarin
95a0: 74 28 26 70 2d 3e 72 63 2c 20 26 62 75 66 2c 20  t(&p->rc, &buf, 
95b0: 70 4c 76 6c 2d 3e 6e 4d 65 72 67 65 29 3b 0a 20  pLvl->nMerge);. 
95c0: 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72 41       fts5BufferA
95d0: 70 70 65 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e  ppendVarint(&p->
95e0: 72 63 2c 20 26 62 75 66 2c 20 70 4c 76 6c 2d 3e  rc, &buf, pLvl->
95f0: 6e 53 65 67 29 3b 0a 20 20 20 20 20 20 61 73 73  nSeg);.      ass
9600: 65 72 74 28 20 70 4c 76 6c 2d 3e 6e 4d 65 72 67  ert( pLvl->nMerg
9610: 65 3c 3d 70 4c 76 6c 2d 3e 6e 53 65 67 20 29 3b  e<=pLvl->nSeg );
9620: 0a 0a 20 20 20 20 20 20 66 6f 72 28 69 53 65 67  ..      for(iSeg
9630: 3d 30 3b 20 69 53 65 67 3c 70 4c 76 6c 2d 3e 6e  =0; iSeg<pLvl->n
9640: 53 65 67 3b 20 69 53 65 67 2b 2b 29 7b 0a 20 20  Seg; iSeg++){.  
9650: 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72        fts5Buffer
9660: 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26 70 2d  AppendVarint(&p-
9670: 3e 72 63 2c 20 26 62 75 66 2c 20 70 4c 76 6c 2d  >rc, &buf, pLvl-
9680: 3e 61 53 65 67 5b 69 53 65 67 5d 2e 69 53 65 67  >aSeg[iSeg].iSeg
9690: 69 64 29 3b 0a 20 20 20 20 20 20 20 20 66 74 73  id);.        fts
96a0: 35 42 75 66 66 65 72 41 70 70 65 6e 64 56 61 72  5BufferAppendVar
96b0: 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26 62 75 66  int(&p->rc, &buf
96c0: 2c 20 70 4c 76 6c 2d 3e 61 53 65 67 5b 69 53 65  , pLvl->aSeg[iSe
96d0: 67 5d 2e 70 67 6e 6f 46 69 72 73 74 29 3b 0a 20  g].pgnoFirst);. 
96e0: 20 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65         fts5Buffe
96f0: 72 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26 70  rAppendVarint(&p
9700: 2d 3e 72 63 2c 20 26 62 75 66 2c 20 70 4c 76 6c  ->rc, &buf, pLvl
9710: 2d 3e 61 53 65 67 5b 69 53 65 67 5d 2e 70 67 6e  ->aSeg[iSeg].pgn
9720: 6f 4c 61 73 74 29 3b 0a 20 20 20 20 20 20 7d 0a  oLast);.      }.
9730: 20 20 20 20 7d 0a 0a 20 20 20 20 66 74 73 35 44      }..    fts5D
9740: 61 74 61 57 72 69 74 65 28 70 2c 20 46 54 53 35  ataWrite(p, FTS5
9750: 5f 53 54 52 55 43 54 55 52 45 5f 52 4f 57 49 44  _STRUCTURE_ROWID
9760: 2c 20 62 75 66 2e 70 2c 20 62 75 66 2e 6e 29 3b  , buf.p, buf.n);
9770: 0a 20 20 20 20 66 74 73 35 42 75 66 66 65 72 46  .    fts5BufferF
9780: 72 65 65 28 26 62 75 66 29 3b 0a 20 20 7d 0a 7d  ree(&buf);.  }.}
9790: 0a 0a 23 69 66 20 30 0a 73 74 61 74 69 63 20 76  ..#if 0.static v
97a0: 6f 69 64 20 66 74 73 35 44 65 62 75 67 53 74 72  oid fts5DebugStr
97b0: 75 63 74 75 72 65 28 69 6e 74 2a 2c 46 74 73 35  ucture(int*,Fts5
97c0: 42 75 66 66 65 72 2a 2c 46 74 73 35 53 74 72 75  Buffer*,Fts5Stru
97d0: 63 74 75 72 65 2a 29 3b 0a 73 74 61 74 69 63 20  cture*);.static 
97e0: 76 6f 69 64 20 66 74 73 35 50 72 69 6e 74 53 74  void fts5PrintSt
97f0: 72 75 63 74 75 72 65 28 63 6f 6e 73 74 20 63 68  ructure(const ch
9800: 61 72 20 2a 7a 43 61 70 74 69 6f 6e 2c 20 46 74  ar *zCaption, Ft
9810: 73 35 53 74 72 75 63 74 75 72 65 20 2a 70 53 74  s5Structure *pSt
9820: 72 75 63 74 29 7b 0a 20 20 69 6e 74 20 72 63 20  ruct){.  int rc 
9830: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 46  = SQLITE_OK;.  F
9840: 74 73 35 42 75 66 66 65 72 20 62 75 66 3b 0a 20  ts5Buffer buf;. 
9850: 20 6d 65 6d 73 65 74 28 26 62 75 66 2c 20 30 2c   memset(&buf, 0,
9860: 20 73 69 7a 65 6f 66 28 62 75 66 29 29 3b 0a 20   sizeof(buf));. 
9870: 20 66 74 73 35 44 65 62 75 67 53 74 72 75 63 74   fts5DebugStruct
9880: 75 72 65 28 26 72 63 2c 20 26 62 75 66 2c 20 70  ure(&rc, &buf, p
9890: 53 74 72 75 63 74 29 3b 0a 20 20 66 70 72 69 6e  Struct);.  fprin
98a0: 74 66 28 73 74 64 6f 75 74 2c 20 22 25 73 3a 20  tf(stdout, "%s: 
98b0: 25 73 5c 6e 22 2c 20 7a 43 61 70 74 69 6f 6e 2c  %s\n", zCaption,
98c0: 20 62 75 66 2e 70 29 3b 0a 20 20 66 66 6c 75 73   buf.p);.  fflus
98d0: 68 28 73 74 64 6f 75 74 29 3b 0a 20 20 66 74 73  h(stdout);.  fts
98e0: 35 42 75 66 66 65 72 46 72 65 65 28 26 62 75 66  5BufferFree(&buf
98f0: 29 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66  );.}.#else.# def
9900: 69 6e 65 20 66 74 73 35 50 72 69 6e 74 53 74 72  ine fts5PrintStr
9910: 75 63 74 75 72 65 28 78 2c 79 29 0a 23 65 6e 64  ucture(x,y).#end
9920: 69 66 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 66  if..static int f
9930: 74 73 35 53 65 67 6d 65 6e 74 53 69 7a 65 28 46  ts5SegmentSize(F
9940: 74 73 35 53 74 72 75 63 74 75 72 65 53 65 67 6d  ts5StructureSegm
9950: 65 6e 74 20 2a 70 53 65 67 29 7b 0a 20 20 72 65  ent *pSeg){.  re
9960: 74 75 72 6e 20 31 20 2b 20 70 53 65 67 2d 3e 70  turn 1 + pSeg->p
9970: 67 6e 6f 4c 61 73 74 20 2d 20 70 53 65 67 2d 3e  gnoLast - pSeg->
9980: 70 67 6e 6f 46 69 72 73 74 3b 0a 7d 0a 0a 2f 2a  pgnoFirst;.}../*
9990: 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 63 6f 70  .** Return a cop
99a0: 79 20 6f 66 20 69 6e 64 65 78 20 73 74 72 75 63  y of index struc
99b0: 74 75 72 65 20 70 53 74 72 75 63 74 2e 20 45 78  ture pStruct. Ex
99c0: 63 65 70 74 2c 20 70 72 6f 6d 6f 74 65 20 61 73  cept, promote as
99d0: 20 6d 61 6e 79 20 0a 2a 2a 20 73 65 67 6d 65 6e   many .** segmen
99e0: 74 73 20 61 73 20 70 6f 73 73 69 62 6c 65 20 74  ts as possible t
99f0: 6f 20 6c 65 76 65 6c 20 69 50 72 6f 6d 6f 74 65  o level iPromote
9a00: 2e 20 49 66 20 61 6e 20 4f 4f 4d 20 6f 63 63 75  . If an OOM occu
9a10: 72 73 2c 20 4e 55 4c 4c 20 69 73 20 0a 2a 2a 20  rs, NULL is .** 
9a20: 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61  returned..*/.sta
9a30: 74 69 63 20 76 6f 69 64 20 66 74 73 35 53 74 72  tic void fts5Str
9a40: 75 63 74 75 72 65 50 72 6f 6d 6f 74 65 54 6f 28  ucturePromoteTo(
9a50: 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c  .  Fts5Index *p,
9a60: 0a 20 20 69 6e 74 20 69 50 72 6f 6d 6f 74 65 2c  .  int iPromote,
9a70: 0a 20 20 69 6e 74 20 73 7a 50 72 6f 6d 6f 74 65  .  int szPromote
9a80: 2c 0a 20 20 46 74 73 35 53 74 72 75 63 74 75 72  ,.  Fts5Structur
9a90: 65 20 2a 70 53 74 72 75 63 74 0a 29 7b 0a 20 20  e *pStruct.){.  
9aa0: 69 6e 74 20 69 6c 2c 20 69 73 3b 0a 20 20 46 74  int il, is;.  Ft
9ab0: 73 35 53 74 72 75 63 74 75 72 65 4c 65 76 65 6c  s5StructureLevel
9ac0: 20 2a 70 4f 75 74 20 3d 20 26 70 53 74 72 75 63   *pOut = &pStruc
9ad0: 74 2d 3e 61 4c 65 76 65 6c 5b 69 50 72 6f 6d 6f  t->aLevel[iPromo
9ae0: 74 65 5d 3b 0a 0a 20 20 69 66 28 20 70 4f 75 74  te];..  if( pOut
9af0: 2d 3e 6e 4d 65 72 67 65 3d 3d 30 20 29 7b 0a 20  ->nMerge==0 ){. 
9b00: 20 20 20 66 6f 72 28 69 6c 3d 69 50 72 6f 6d 6f     for(il=iPromo
9b10: 74 65 2b 31 3b 20 69 6c 3c 70 53 74 72 75 63 74  te+1; il<pStruct
9b20: 2d 3e 6e 4c 65 76 65 6c 3b 20 69 6c 2b 2b 29 7b  ->nLevel; il++){
9b30: 0a 20 20 20 20 20 20 46 74 73 35 53 74 72 75 63  .      Fts5Struc
9b40: 74 75 72 65 4c 65 76 65 6c 20 2a 70 4c 76 6c 20  tureLevel *pLvl 
9b50: 3d 20 26 70 53 74 72 75 63 74 2d 3e 61 4c 65 76  = &pStruct->aLev
9b60: 65 6c 5b 69 6c 5d 3b 0a 20 20 20 20 20 20 69 66  el[il];.      if
9b70: 28 20 70 4c 76 6c 2d 3e 6e 4d 65 72 67 65 20 29  ( pLvl->nMerge )
9b80: 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 66   return;.      f
9b90: 6f 72 28 69 73 3d 70 4c 76 6c 2d 3e 6e 53 65 67  or(is=pLvl->nSeg
9ba0: 2d 31 3b 20 69 73 3e 3d 30 3b 20 69 73 2d 2d 29  -1; is>=0; is--)
9bb0: 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 73 7a  {.        int sz
9bc0: 20 3d 20 66 74 73 35 53 65 67 6d 65 6e 74 53 69   = fts5SegmentSi
9bd0: 7a 65 28 26 70 4c 76 6c 2d 3e 61 53 65 67 5b 69  ze(&pLvl->aSeg[i
9be0: 73 5d 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  s]);.        if(
9bf0: 20 73 7a 3e 73 7a 50 72 6f 6d 6f 74 65 20 29 20   sz>szPromote ) 
9c00: 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 20 20  return;.        
9c10: 66 74 73 35 53 74 72 75 63 74 75 72 65 45 78 74  fts5StructureExt
9c20: 65 6e 64 4c 65 76 65 6c 28 26 70 2d 3e 72 63 2c  endLevel(&p->rc,
9c30: 20 70 53 74 72 75 63 74 2c 20 69 50 72 6f 6d 6f   pStruct, iPromo
9c40: 74 65 2c 20 31 2c 20 31 29 3b 0a 20 20 20 20 20  te, 1, 1);.     
9c50: 20 20 20 69 66 28 20 70 2d 3e 72 63 20 29 20 72     if( p->rc ) r
9c60: 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 20 20 6d  eturn;.        m
9c70: 65 6d 63 70 79 28 70 4f 75 74 2d 3e 61 53 65 67  emcpy(pOut->aSeg
9c80: 2c 20 26 70 4c 76 6c 2d 3e 61 53 65 67 5b 69 73  , &pLvl->aSeg[is
9c90: 5d 2c 20 73 69 7a 65 6f 66 28 46 74 73 35 53 74  ], sizeof(Fts5St
9ca0: 72 75 63 74 75 72 65 53 65 67 6d 65 6e 74 29 29  ructureSegment))
9cb0: 3b 0a 20 20 20 20 20 20 20 20 70 4f 75 74 2d 3e  ;.        pOut->
9cc0: 6e 53 65 67 2b 2b 3b 0a 20 20 20 20 20 20 20 20  nSeg++;.        
9cd0: 70 4c 76 6c 2d 3e 6e 53 65 67 2d 2d 3b 0a 20 20  pLvl->nSeg--;.  
9ce0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
9cf0: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 6e 65 77 20 73  }../*.** A new s
9d00: 65 67 6d 65 6e 74 20 68 61 73 20 6a 75 73 74 20  egment has just 
9d10: 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20  been written to 
9d20: 6c 65 76 65 6c 20 69 4c 76 6c 20 6f 66 20 69 6e  level iLvl of in
9d30: 64 65 78 20 73 74 72 75 63 74 75 72 65 0a 2a 2a  dex structure.**
9d40: 20 70 53 74 72 75 63 74 2e 20 54 68 69 73 20 66   pStruct. This f
9d50: 75 6e 63 74 69 6f 6e 20 64 65 74 65 72 6d 69 6e  unction determin
9d60: 65 73 20 69 66 20 61 6e 79 20 73 65 67 6d 65 6e  es if any segmen
9d70: 74 73 20 73 68 6f 75 6c 64 20 62 65 20 70 72 6f  ts should be pro
9d80: 6d 6f 74 65 64 0a 2a 2a 20 61 73 20 61 20 72 65  moted.** as a re
9d90: 73 75 6c 74 2e 20 53 65 67 6d 65 6e 74 73 20 61  sult. Segments a
9da0: 72 65 20 70 72 6f 6d 6f 74 65 64 20 69 6e 20 74  re promoted in t
9db0: 77 6f 20 73 63 65 6e 61 72 69 6f 73 3a 0a 2a 2a  wo scenarios:.**
9dc0: 0a 2a 2a 20 20 20 61 29 20 49 66 20 74 68 65 20  .**   a) If the 
9dd0: 73 65 67 6d 65 6e 74 20 6a 75 73 74 20 77 72 69  segment just wri
9de0: 74 74 65 6e 20 69 73 20 73 6d 61 6c 6c 65 72 20  tten is smaller 
9df0: 74 68 61 6e 20 6f 6e 65 20 6f 72 20 6d 6f 72 65  than one or more
9e00: 20 73 65 67 6d 65 6e 74 73 0a 2a 2a 20 20 20 20   segments.**    
9e10: 20 20 77 69 74 68 69 6e 20 74 68 65 20 70 72 65    within the pre
9e20: 76 69 6f 75 73 20 70 6f 70 75 6c 61 74 65 64 20  vious populated 
9e30: 6c 65 76 65 6c 2c 20 69 74 20 69 73 20 70 72 6f  level, it is pro
9e40: 6d 6f 74 65 64 20 74 6f 20 74 68 65 20 70 72 65  moted to the pre
9e50: 76 69 6f 75 73 0a 2a 2a 20 20 20 20 20 20 70 6f  vious.**      po
9e60: 70 75 6c 61 74 65 64 20 6c 65 76 65 6c 2e 0a 2a  pulated level..*
9e70: 2a 0a 2a 2a 20 20 20 62 29 20 49 66 20 74 68 65  *.**   b) If the
9e80: 20 73 65 67 6d 65 6e 74 20 6a 75 73 74 20 77 72   segment just wr
9e90: 69 74 74 65 6e 20 69 73 20 6c 61 72 67 65 72 20  itten is larger 
9ea0: 74 68 61 6e 20 74 68 65 20 6e 65 77 65 73 74 20  than the newest 
9eb0: 73 65 67 6d 65 6e 74 20 6f 6e 0a 2a 2a 20 20 20  segment on.**   
9ec0: 20 20 20 74 68 65 20 6e 65 78 74 20 70 6f 70 75     the next popu
9ed0: 6c 61 74 65 64 20 6c 65 76 65 6c 2c 20 74 68 65  lated level, the
9ee0: 6e 20 74 68 61 74 20 73 65 67 6d 65 6e 74 2c 20  n that segment, 
9ef0: 61 6e 64 20 61 6e 79 20 6f 74 68 65 72 20 61 64  and any other ad
9f00: 6a 61 63 65 6e 74 0a 2a 2a 20 20 20 20 20 20 73  jacent.**      s
9f10: 65 67 6d 65 6e 74 73 20 74 68 61 74 20 61 72 65  egments that are
9f20: 20 61 6c 73 6f 20 73 6d 61 6c 6c 65 72 20 74 68   also smaller th
9f30: 61 6e 20 74 68 65 20 6f 6e 65 20 6a 75 73 74 20  an the one just 
9f40: 77 72 69 74 74 65 6e 2c 20 61 72 65 20 0a 2a 2a  written, are .**
9f50: 20 20 20 20 20 20 70 72 6f 6d 6f 74 65 64 2e 20        promoted. 
9f60: 0a 2a 2a 0a 2a 2a 20 49 66 20 6f 6e 65 20 6f 72  .**.** If one or
9f70: 20 6d 6f 72 65 20 73 65 67 6d 65 6e 74 73 20 61   more segments a
9f80: 72 65 20 70 72 6f 6d 6f 74 65 64 2c 20 74 68 65  re promoted, the
9f90: 20 73 74 72 75 63 74 75 72 65 20 6f 62 6a 65 63   structure objec
9fa0: 74 20 69 73 20 75 70 64 61 74 65 64 0a 2a 2a 20  t is updated.** 
9fb0: 74 6f 20 72 65 66 6c 65 63 74 20 74 68 69 73 2e  to reflect this.
9fc0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
9fd0: 66 74 73 35 53 74 72 75 63 74 75 72 65 50 72 6f  fts5StructurePro
9fe0: 6d 6f 74 65 28 0a 20 20 46 74 73 35 49 6e 64 65  mote(.  Fts5Inde
9ff0: 78 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  x *p,           
a000: 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53 35 20          /* FTS5 
a010: 62 61 63 6b 65 6e 64 20 6f 62 6a 65 63 74 20 2a  backend object *
a020: 2f 0a 20 20 69 6e 74 20 69 4c 76 6c 2c 20 20 20  /.  int iLvl,   
a030: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a040: 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6c 65 76      /* Index lev
a050: 65 6c 20 6a 75 73 74 20 75 70 64 61 74 65 64 20  el just updated 
a060: 2a 2f 0a 20 20 46 74 73 35 53 74 72 75 63 74 75  */.  Fts5Structu
a070: 72 65 20 2a 70 53 74 72 75 63 74 20 20 20 20 20  re *pStruct     
a080: 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 73 74       /* Index st
a090: 72 75 63 74 75 72 65 20 2a 2f 0a 29 7b 0a 20 20  ructure */.){.  
a0a0: 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  if( p->rc==SQLIT
a0b0: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 6e 74 20  E_OK ){.    int 
a0c0: 69 54 73 74 3b 0a 20 20 20 20 69 6e 74 20 69 50  iTst;.    int iP
a0d0: 72 6f 6d 6f 74 65 20 3d 20 2d 31 3b 0a 20 20 20  romote = -1;.   
a0e0: 20 69 6e 74 20 73 7a 50 72 6f 6d 6f 74 65 20 3d   int szPromote =
a0f0: 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f   0;            /
a100: 2a 20 50 72 6f 6d 6f 74 65 20 61 6e 79 74 68 69  * Promote anythi
a110: 6e 67 20 74 68 69 73 20 73 69 7a 65 20 6f 72 20  ng this size or 
a120: 73 6d 61 6c 6c 65 72 20 2a 2f 0a 20 20 20 20 46  smaller */.    F
a130: 74 73 35 53 74 72 75 63 74 75 72 65 53 65 67 6d  ts5StructureSegm
a140: 65 6e 74 20 2a 70 53 65 67 3b 20 20 20 2f 2a 20  ent *pSeg;   /* 
a150: 53 65 67 6d 65 6e 74 20 6a 75 73 74 20 77 72 69  Segment just wri
a160: 74 74 65 6e 20 2a 2f 0a 20 20 20 20 69 6e 74 20  tten */.    int 
a170: 73 7a 53 65 67 3b 20 20 20 20 20 20 20 20 20 20  szSeg;          
a180: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
a190: 65 20 6f 66 20 73 65 67 6d 65 6e 74 20 6a 75 73  e of segment jus
a1a0: 74 20 77 72 69 74 74 65 6e 20 2a 2f 0a 20 20 20  t written */.   
a1b0: 20 69 6e 74 20 6e 53 65 67 20 3d 20 70 53 74 72   int nSeg = pStr
a1c0: 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c  uct->aLevel[iLvl
a1d0: 5d 2e 6e 53 65 67 3b 0a 0a 20 20 20 20 69 66 28  ].nSeg;..    if(
a1e0: 20 6e 53 65 67 3d 3d 30 20 29 20 72 65 74 75 72   nSeg==0 ) retur
a1f0: 6e 3b 0a 20 20 20 20 70 53 65 67 20 3d 20 26 70  n;.    pSeg = &p
a200: 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69  Struct->aLevel[i
a210: 4c 76 6c 5d 2e 61 53 65 67 5b 70 53 74 72 75 63  Lvl].aSeg[pStruc
a220: 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d 2e  t->aLevel[iLvl].
a230: 6e 53 65 67 2d 31 5d 3b 0a 20 20 20 20 73 7a 53  nSeg-1];.    szS
a240: 65 67 20 3d 20 28 31 20 2b 20 70 53 65 67 2d 3e  eg = (1 + pSeg->
a250: 70 67 6e 6f 4c 61 73 74 20 2d 20 70 53 65 67 2d  pgnoLast - pSeg-
a260: 3e 70 67 6e 6f 46 69 72 73 74 29 3b 0a 0a 20 20  >pgnoFirst);..  
a270: 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20 63    /* Check for c
a280: 6f 6e 64 69 74 69 6f 6e 20 28 61 29 20 2a 2f 0a  ondition (a) */.
a290: 20 20 20 20 66 6f 72 28 69 54 73 74 3d 69 4c 76      for(iTst=iLv
a2a0: 6c 2d 31 3b 20 69 54 73 74 3e 3d 30 20 26 26 20  l-1; iTst>=0 && 
a2b0: 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b  pStruct->aLevel[
a2c0: 69 54 73 74 5d 2e 6e 53 65 67 3d 3d 30 3b 20 69  iTst].nSeg==0; i
a2d0: 54 73 74 2d 2d 29 3b 0a 20 20 20 20 69 66 28 20  Tst--);.    if( 
a2e0: 69 54 73 74 3e 3d 30 20 29 7b 0a 20 20 20 20 20  iTst>=0 ){.     
a2f0: 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 69 6e   int i;.      in
a300: 74 20 73 7a 4d 61 78 20 3d 20 30 3b 0a 20 20 20  t szMax = 0;.   
a310: 20 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65     Fts5Structure
a320: 4c 65 76 65 6c 20 2a 70 54 73 74 20 3d 20 26 70  Level *pTst = &p
a330: 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69  Struct->aLevel[i
a340: 54 73 74 5d 3b 0a 20 20 20 20 20 20 61 73 73 65  Tst];.      asse
a350: 72 74 28 20 70 54 73 74 2d 3e 6e 4d 65 72 67 65  rt( pTst->nMerge
a360: 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 66 6f 72  ==0 );.      for
a370: 28 69 3d 30 3b 20 69 3c 70 54 73 74 2d 3e 6e 53  (i=0; i<pTst->nS
a380: 65 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  eg; i++){.      
a390: 20 20 69 6e 74 20 73 7a 20 3d 20 70 54 73 74 2d    int sz = pTst-
a3a0: 3e 61 53 65 67 5b 69 5d 2e 70 67 6e 6f 4c 61 73  >aSeg[i].pgnoLas
a3b0: 74 20 2d 20 70 54 73 74 2d 3e 61 53 65 67 5b 69  t - pTst->aSeg[i
a3c0: 5d 2e 70 67 6e 6f 46 69 72 73 74 20 2b 20 31 3b  ].pgnoFirst + 1;
a3d0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 7a 3e  .        if( sz>
a3e0: 73 7a 4d 61 78 20 29 20 73 7a 4d 61 78 20 3d 20  szMax ) szMax = 
a3f0: 73 7a 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  sz;.      }.    
a400: 20 20 69 66 28 20 73 7a 4d 61 78 3e 3d 73 7a 53    if( szMax>=szS
a410: 65 67 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  eg ){.        /*
a420: 20 43 6f 6e 64 69 74 69 6f 6e 20 28 61 29 20 69   Condition (a) i
a430: 73 20 74 72 75 65 2e 20 50 72 6f 6d 6f 74 65 20  s true. Promote 
a440: 74 68 65 20 6e 65 77 65 73 74 20 73 65 67 6d 65  the newest segme
a450: 6e 74 20 6f 6e 20 6c 65 76 65 6c 20 0a 20 20 20  nt on level .   
a460: 20 20 20 20 20 2a 2a 20 69 4c 76 6c 20 74 6f 20       ** iLvl to 
a470: 6c 65 76 65 6c 20 69 54 73 74 2e 20 20 2a 2f 0a  level iTst.  */.
a480: 20 20 20 20 20 20 20 20 69 50 72 6f 6d 6f 74 65          iPromote
a490: 20 3d 20 69 54 73 74 3b 0a 20 20 20 20 20 20 20   = iTst;.       
a4a0: 20 73 7a 50 72 6f 6d 6f 74 65 20 3d 20 73 7a 4d   szPromote = szM
a4b0: 61 78 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ax;.      }.    
a4c0: 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 63 6f 6e  }..    /* If con
a4d0: 64 69 74 69 6f 6e 20 28 61 29 20 69 73 20 6e 6f  dition (a) is no
a4e0: 74 20 6d 65 74 2c 20 61 73 73 75 6d 65 20 28 62  t met, assume (b
a4f0: 29 20 69 73 20 74 72 75 65 2e 20 53 74 72 75 63  ) is true. Struc
a500: 74 75 72 65 50 72 6f 6d 6f 74 65 54 6f 28 29 0a  turePromoteTo().
a510: 20 20 20 20 2a 2a 20 69 73 20 61 20 6e 6f 2d 6f      ** is a no-o
a520: 70 20 69 66 20 69 74 20 69 73 20 6e 6f 74 2e 20  p if it is not. 
a530: 20 2a 2f 0a 20 20 20 20 69 66 28 20 69 50 72 6f   */.    if( iPro
a540: 6d 6f 74 65 3c 30 20 29 7b 0a 20 20 20 20 20 20  mote<0 ){.      
a550: 69 50 72 6f 6d 6f 74 65 20 3d 20 69 4c 76 6c 3b  iPromote = iLvl;
a560: 0a 20 20 20 20 20 20 73 7a 50 72 6f 6d 6f 74 65  .      szPromote
a570: 20 3d 20 73 7a 53 65 67 3b 0a 20 20 20 20 7d 0a   = szSeg;.    }.
a580: 20 20 20 20 66 74 73 35 53 74 72 75 63 74 75 72      fts5Structur
a590: 65 50 72 6f 6d 6f 74 65 54 6f 28 70 2c 20 69 50  ePromoteTo(p, iP
a5a0: 72 6f 6d 6f 74 65 2c 20 73 7a 50 72 6f 6d 6f 74  romote, szPromot
a5b0: 65 2c 20 70 53 74 72 75 63 74 29 3b 0a 20 20 7d  e, pStruct);.  }
a5c0: 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 41 64 76 61 6e  .}.../*.** Advan
a5d0: 63 65 20 74 68 65 20 69 74 65 72 61 74 6f 72 20  ce the iterator 
a5e0: 70 61 73 73 65 64 20 61 73 20 74 68 65 20 6f 6e  passed as the on
a5f0: 6c 79 20 61 72 67 75 6d 65 6e 74 2e 20 49 66 20  ly argument. If 
a600: 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 0a  the end of the .
a610: 2a 2a 20 64 6f 63 6c 69 73 74 2d 69 6e 64 65 78  ** doclist-index
a620: 20 70 61 67 65 20 69 73 20 72 65 61 63 68 65 64   page is reached
a630: 2c 20 72 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72  , return non-zer
a640: 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  o..*/.static int
a650: 20 66 74 73 35 44 6c 69 64 78 4c 76 6c 4e 65 78   fts5DlidxLvlNex
a660: 74 28 46 74 73 35 44 6c 69 64 78 4c 76 6c 20 2a  t(Fts5DlidxLvl *
a670: 70 4c 76 6c 29 7b 0a 20 20 46 74 73 35 44 61 74  pLvl){.  Fts5Dat
a680: 61 20 2a 70 44 61 74 61 20 3d 20 70 4c 76 6c 2d  a *pData = pLvl-
a690: 3e 70 44 61 74 61 3b 0a 0a 20 20 69 66 28 20 70  >pData;..  if( p
a6a0: 4c 76 6c 2d 3e 69 4f 66 66 3d 3d 30 20 29 7b 0a  Lvl->iOff==0 ){.
a6b0: 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 76 6c      assert( pLvl
a6c0: 2d 3e 62 45 6f 66 3d 3d 30 20 29 3b 0a 20 20 20  ->bEof==0 );.   
a6d0: 20 70 4c 76 6c 2d 3e 69 4f 66 66 20 3d 20 31 3b   pLvl->iOff = 1;
a6e0: 0a 20 20 20 20 70 4c 76 6c 2d 3e 69 4f 66 66 20  .    pLvl->iOff 
a6f0: 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e 74  += fts5GetVarint
a700: 33 32 28 26 70 44 61 74 61 2d 3e 70 5b 31 5d 2c  32(&pData->p[1],
a710: 20 70 4c 76 6c 2d 3e 69 4c 65 61 66 50 67 6e 6f   pLvl->iLeafPgno
a720: 29 3b 0a 20 20 20 20 70 4c 76 6c 2d 3e 69 4f 66  );.    pLvl->iOf
a730: 66 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69  f += fts5GetVari
a740: 6e 74 28 26 70 44 61 74 61 2d 3e 70 5b 70 4c 76  nt(&pData->p[pLv
a750: 6c 2d 3e 69 4f 66 66 5d 2c 20 28 75 36 34 2a 29  l->iOff], (u64*)
a760: 26 70 4c 76 6c 2d 3e 69 52 6f 77 69 64 29 3b 0a  &pLvl->iRowid);.
a770: 20 20 20 20 70 4c 76 6c 2d 3e 69 46 69 72 73 74      pLvl->iFirst
a780: 4f 66 66 20 3d 20 70 4c 76 6c 2d 3e 69 4f 66 66  Off = pLvl->iOff
a790: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  ;.  }else{.    i
a7a0: 6e 74 20 69 4f 66 66 3b 0a 20 20 20 20 66 6f 72  nt iOff;.    for
a7b0: 28 69 4f 66 66 3d 70 4c 76 6c 2d 3e 69 4f 66 66  (iOff=pLvl->iOff
a7c0: 3b 20 69 4f 66 66 3c 70 44 61 74 61 2d 3e 6e 6e  ; iOff<pData->nn
a7d0: 3b 20 69 4f 66 66 2b 2b 29 7b 0a 20 20 20 20 20  ; iOff++){.     
a7e0: 20 69 66 28 20 70 44 61 74 61 2d 3e 70 5b 69 4f   if( pData->p[iO
a7f0: 66 66 5d 20 29 20 62 72 65 61 6b 3b 20 0a 20 20  ff] ) break; .  
a800: 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 69 4f 66    }..    if( iOf
a810: 66 3c 70 44 61 74 61 2d 3e 6e 6e 20 29 7b 0a 20  f<pData->nn ){. 
a820: 20 20 20 20 20 69 36 34 20 69 56 61 6c 3b 0a 20       i64 iVal;. 
a830: 20 20 20 20 20 70 4c 76 6c 2d 3e 69 4c 65 61 66       pLvl->iLeaf
a840: 50 67 6e 6f 20 2b 3d 20 28 69 4f 66 66 20 2d 20  Pgno += (iOff - 
a850: 70 4c 76 6c 2d 3e 69 4f 66 66 29 20 2b 20 31 3b  pLvl->iOff) + 1;
a860: 0a 20 20 20 20 20 20 69 4f 66 66 20 2b 3d 20 66  .      iOff += f
a870: 74 73 35 47 65 74 56 61 72 69 6e 74 28 26 70 44  ts5GetVarint(&pD
a880: 61 74 61 2d 3e 70 5b 69 4f 66 66 5d 2c 20 28 75  ata->p[iOff], (u
a890: 36 34 2a 29 26 69 56 61 6c 29 3b 0a 20 20 20 20  64*)&iVal);.    
a8a0: 20 20 70 4c 76 6c 2d 3e 69 52 6f 77 69 64 20 2b    pLvl->iRowid +
a8b0: 3d 20 69 56 61 6c 3b 0a 20 20 20 20 20 20 70 4c  = iVal;.      pL
a8c0: 76 6c 2d 3e 69 4f 66 66 20 3d 20 69 4f 66 66 3b  vl->iOff = iOff;
a8d0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
a8e0: 20 20 70 4c 76 6c 2d 3e 62 45 6f 66 20 3d 20 31    pLvl->bEof = 1
a8f0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72  ;.    }.  }..  r
a900: 65 74 75 72 6e 20 70 4c 76 6c 2d 3e 62 45 6f 66  eturn pLvl->bEof
a910: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 76 61 6e  ;.}../*.** Advan
a920: 63 65 20 74 68 65 20 69 74 65 72 61 74 6f 72 20  ce the iterator 
a930: 70 61 73 73 65 64 20 61 73 20 74 68 65 20 6f 6e  passed as the on
a940: 6c 79 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a  ly argument..*/.
a950: 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 35 44  static int fts5D
a960: 6c 69 64 78 49 74 65 72 4e 65 78 74 52 28 46 74  lidxIterNextR(Ft
a970: 73 35 49 6e 64 65 78 20 2a 70 2c 20 46 74 73 35  s5Index *p, Fts5
a980: 44 6c 69 64 78 49 74 65 72 20 2a 70 49 74 65 72  DlidxIter *pIter
a990: 2c 20 69 6e 74 20 69 4c 76 6c 29 7b 0a 20 20 46  , int iLvl){.  F
a9a0: 74 73 35 44 6c 69 64 78 4c 76 6c 20 2a 70 4c 76  ts5DlidxLvl *pLv
a9b0: 6c 20 3d 20 26 70 49 74 65 72 2d 3e 61 4c 76 6c  l = &pIter->aLvl
a9c0: 5b 69 4c 76 6c 5d 3b 0a 0a 20 20 61 73 73 65 72  [iLvl];..  asser
a9d0: 74 28 20 69 4c 76 6c 3c 70 49 74 65 72 2d 3e 6e  t( iLvl<pIter->n
a9e0: 4c 76 6c 20 29 3b 0a 20 20 69 66 28 20 66 74 73  Lvl );.  if( fts
a9f0: 35 44 6c 69 64 78 4c 76 6c 4e 65 78 74 28 70 4c  5DlidxLvlNext(pL
aa00: 76 6c 29 20 29 7b 0a 20 20 20 20 69 66 28 20 28  vl) ){.    if( (
aa10: 69 4c 76 6c 2b 31 29 20 3c 20 70 49 74 65 72 2d  iLvl+1) < pIter-
aa20: 3e 6e 4c 76 6c 20 29 7b 0a 20 20 20 20 20 20 66  >nLvl ){.      f
aa30: 74 73 35 44 6c 69 64 78 49 74 65 72 4e 65 78 74  ts5DlidxIterNext
aa40: 52 28 70 2c 20 70 49 74 65 72 2c 20 69 4c 76 6c  R(p, pIter, iLvl
aa50: 2b 31 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  +1);.      if( p
aa60: 4c 76 6c 5b 31 5d 2e 62 45 6f 66 3d 3d 30 20 29  Lvl[1].bEof==0 )
aa70: 7b 0a 20 20 20 20 20 20 20 20 66 74 73 35 44 61  {.        fts5Da
aa80: 74 61 52 65 6c 65 61 73 65 28 70 4c 76 6c 2d 3e  taRelease(pLvl->
aa90: 70 44 61 74 61 29 3b 0a 20 20 20 20 20 20 20 20  pData);.        
aaa0: 6d 65 6d 73 65 74 28 70 4c 76 6c 2c 20 30 2c 20  memset(pLvl, 0, 
aab0: 73 69 7a 65 6f 66 28 46 74 73 35 44 6c 69 64 78  sizeof(Fts5Dlidx
aac0: 4c 76 6c 29 29 3b 0a 20 20 20 20 20 20 20 20 70  Lvl));.        p
aad0: 4c 76 6c 2d 3e 70 44 61 74 61 20 3d 20 66 74 73  Lvl->pData = fts
aae0: 35 44 61 74 61 52 65 61 64 28 70 2c 20 0a 20 20  5DataRead(p, .  
aaf0: 20 20 20 20 20 20 20 20 20 20 46 54 53 35 5f 44            FTS5_D
ab00: 4c 49 44 58 5f 52 4f 57 49 44 28 70 49 74 65 72  LIDX_ROWID(pIter
ab10: 2d 3e 69 53 65 67 69 64 2c 20 69 4c 76 6c 2c 20  ->iSegid, iLvl, 
ab20: 70 4c 76 6c 5b 31 5d 2e 69 4c 65 61 66 50 67 6e  pLvl[1].iLeafPgn
ab30: 6f 29 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20  o).        );.  
ab40: 20 20 20 20 20 20 69 66 28 20 70 4c 76 6c 2d 3e        if( pLvl->
ab50: 70 44 61 74 61 20 29 20 66 74 73 35 44 6c 69 64  pData ) fts5Dlid
ab60: 78 4c 76 6c 4e 65 78 74 28 70 4c 76 6c 29 3b 0a  xLvlNext(pLvl);.
ab70: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
ab80: 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70 49 74 65  }..  return pIte
ab90: 72 2d 3e 61 4c 76 6c 5b 30 5d 2e 62 45 6f 66 3b  r->aLvl[0].bEof;
aba0: 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74  .}.static int ft
abb0: 73 35 44 6c 69 64 78 49 74 65 72 4e 65 78 74 28  s5DlidxIterNext(
abc0: 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 46 74  Fts5Index *p, Ft
abd0: 73 35 44 6c 69 64 78 49 74 65 72 20 2a 70 49 74  s5DlidxIter *pIt
abe0: 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 66 74  er){.  return ft
abf0: 73 35 44 6c 69 64 78 49 74 65 72 4e 65 78 74 52  s5DlidxIterNextR
ac00: 28 70 2c 20 70 49 74 65 72 2c 20 30 29 3b 0a 7d  (p, pIter, 0);.}
ac10: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 69 74 65 72  ../*.** The iter
ac20: 61 74 6f 72 20 70 61 73 73 65 64 20 61 73 20 74  ator passed as t
ac30: 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e  he first argumen
ac40: 74 20 68 61 73 20 74 68 65 20 66 6f 6c 6c 6f 77  t has the follow
ac50: 69 6e 67 20 66 69 65 6c 64 73 20 73 65 74 0a 2a  ing fields set.*
ac60: 2a 20 61 73 20 66 6f 6c 6c 6f 77 73 2e 20 54 68  * as follows. Th
ac70: 69 73 20 66 75 6e 63 74 69 6f 6e 20 73 65 74 73  is function sets
ac80: 20 75 70 20 74 68 65 20 72 65 73 74 20 6f 66 20   up the rest of 
ac90: 74 68 65 20 69 74 65 72 61 74 6f 72 20 73 6f 20  the iterator so 
aca0: 74 68 61 74 20 69 74 0a 2a 2a 20 70 6f 69 6e 74  that it.** point
acb0: 73 20 74 6f 20 74 68 65 20 66 69 72 73 74 20 72  s to the first r
acc0: 6f 77 69 64 20 69 6e 20 74 68 65 20 64 6f 63 6c  owid in the docl
acd0: 69 73 74 2d 69 6e 64 65 78 2e 0a 2a 2a 0a 2a 2a  ist-index..**.**
ace0: 20 20 20 70 44 61 74 61 3a 0a 2a 2a 20 20 20 20     pData:.**    
acf0: 20 70 6f 69 6e 74 65 72 20 74 6f 20 64 6f 63 6c   pointer to docl
ad00: 69 73 74 2d 69 6e 64 65 78 20 72 65 63 6f 72 64  ist-index record
ad10: 2c 20 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68  , .**.** When th
ad20: 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
ad30: 61 6c 6c 65 64 20 70 49 74 65 72 2d 3e 69 4c 65  alled pIter->iLe
ad40: 61 66 50 67 6e 6f 20 69 73 20 74 68 65 20 70 61  afPgno is the pa
ad50: 67 65 20 6e 75 6d 62 65 72 20 74 68 65 0a 2a 2a  ge number the.**
ad60: 20 64 6f 63 6c 69 73 74 20 69 73 20 61 73 73 6f   doclist is asso
ad70: 63 69 61 74 65 64 20 77 69 74 68 20 28 74 68 65  ciated with (the
ad80: 20 6f 6e 65 20 66 65 61 74 75 72 69 6e 67 20 74   one featuring t
ad90: 68 65 20 74 65 72 6d 29 2e 0a 2a 2f 0a 73 74 61  he term)..*/.sta
ada0: 74 69 63 20 69 6e 74 20 66 74 73 35 44 6c 69 64  tic int fts5Dlid
adb0: 78 49 74 65 72 46 69 72 73 74 28 46 74 73 35 44  xIterFirst(Fts5D
adc0: 6c 69 64 78 49 74 65 72 20 2a 70 49 74 65 72 29  lidxIter *pIter)
add0: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72  {.  int i;.  for
ade0: 28 69 3d 30 3b 20 69 3c 70 49 74 65 72 2d 3e 6e  (i=0; i<pIter->n
adf0: 4c 76 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 66  Lvl; i++){.    f
ae00: 74 73 35 44 6c 69 64 78 4c 76 6c 4e 65 78 74 28  ts5DlidxLvlNext(
ae10: 26 70 49 74 65 72 2d 3e 61 4c 76 6c 5b 69 5d 29  &pIter->aLvl[i])
ae20: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  ;.  }.  return p
ae30: 49 74 65 72 2d 3e 61 4c 76 6c 5b 30 5d 2e 62 45  Iter->aLvl[0].bE
ae40: 6f 66 3b 0a 7d 0a 0a 0a 73 74 61 74 69 63 20 69  of;.}...static i
ae50: 6e 74 20 66 74 73 35 44 6c 69 64 78 49 74 65 72  nt fts5DlidxIter
ae60: 45 6f 66 28 46 74 73 35 49 6e 64 65 78 20 2a 70  Eof(Fts5Index *p
ae70: 2c 20 46 74 73 35 44 6c 69 64 78 49 74 65 72 20  , Fts5DlidxIter 
ae80: 2a 70 49 74 65 72 29 7b 0a 20 20 72 65 74 75 72  *pIter){.  retur
ae90: 6e 20 70 2d 3e 72 63 21 3d 53 51 4c 49 54 45 5f  n p->rc!=SQLITE_
aea0: 4f 4b 20 7c 7c 20 70 49 74 65 72 2d 3e 61 4c 76  OK || pIter->aLv
aeb0: 6c 5b 30 5d 2e 62 45 6f 66 3b 0a 7d 0a 0a 73 74  l[0].bEof;.}..st
aec0: 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 44 6c  atic void fts5Dl
aed0: 69 64 78 49 74 65 72 4c 61 73 74 28 46 74 73 35  idxIterLast(Fts5
aee0: 49 6e 64 65 78 20 2a 70 2c 20 46 74 73 35 44 6c  Index *p, Fts5Dl
aef0: 69 64 78 49 74 65 72 20 2a 70 49 74 65 72 29 7b  idxIter *pIter){
af00: 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20 2f 2a 20  .  int i;..  /* 
af10: 41 64 76 61 6e 63 65 20 65 61 63 68 20 6c 65 76  Advance each lev
af20: 65 6c 20 74 6f 20 74 68 65 20 6c 61 73 74 20 65  el to the last e
af30: 6e 74 72 79 20 6f 6e 20 74 68 65 20 6c 61 73 74  ntry on the last
af40: 20 70 61 67 65 20 2a 2f 0a 20 20 66 6f 72 28 69   page */.  for(i
af50: 3d 70 49 74 65 72 2d 3e 6e 4c 76 6c 2d 31 3b 20  =pIter->nLvl-1; 
af60: 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
af70: 20 26 26 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a   && i>=0; i--){.
af80: 20 20 20 20 46 74 73 35 44 6c 69 64 78 4c 76 6c      Fts5DlidxLvl
af90: 20 2a 70 4c 76 6c 20 3d 20 26 70 49 74 65 72 2d   *pLvl = &pIter-
afa0: 3e 61 4c 76 6c 5b 69 5d 3b 0a 20 20 20 20 77 68  >aLvl[i];.    wh
afb0: 69 6c 65 28 20 66 74 73 35 44 6c 69 64 78 4c 76  ile( fts5DlidxLv
afc0: 6c 4e 65 78 74 28 70 4c 76 6c 29 3d 3d 30 20 29  lNext(pLvl)==0 )
afd0: 3b 0a 20 20 20 20 70 4c 76 6c 2d 3e 62 45 6f 66  ;.    pLvl->bEof
afe0: 20 3d 20 30 3b 0a 0a 20 20 20 20 69 66 28 20 69   = 0;..    if( i
aff0: 3e 30 20 29 7b 0a 20 20 20 20 20 20 46 74 73 35  >0 ){.      Fts5
b000: 44 6c 69 64 78 4c 76 6c 20 2a 70 43 68 69 6c 64  DlidxLvl *pChild
b010: 20 3d 20 26 70 4c 76 6c 5b 2d 31 5d 3b 0a 20 20   = &pLvl[-1];.  
b020: 20 20 20 20 66 74 73 35 44 61 74 61 52 65 6c 65      fts5DataRele
b030: 61 73 65 28 70 43 68 69 6c 64 2d 3e 70 44 61 74  ase(pChild->pDat
b040: 61 29 3b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74  a);.      memset
b050: 28 70 43 68 69 6c 64 2c 20 30 2c 20 73 69 7a 65  (pChild, 0, size
b060: 6f 66 28 46 74 73 35 44 6c 69 64 78 4c 76 6c 29  of(Fts5DlidxLvl)
b070: 29 3b 0a 20 20 20 20 20 20 70 43 68 69 6c 64 2d  );.      pChild-
b080: 3e 70 44 61 74 61 20 3d 20 66 74 73 35 44 61 74  >pData = fts5Dat
b090: 61 52 65 61 64 28 70 2c 20 0a 20 20 20 20 20 20  aRead(p, .      
b0a0: 20 20 20 20 46 54 53 35 5f 44 4c 49 44 58 5f 52      FTS5_DLIDX_R
b0b0: 4f 57 49 44 28 70 49 74 65 72 2d 3e 69 53 65 67  OWID(pIter->iSeg
b0c0: 69 64 2c 20 69 2d 31 2c 20 70 4c 76 6c 2d 3e 69  id, i-1, pLvl->i
b0d0: 4c 65 61 66 50 67 6e 6f 29 0a 20 20 20 20 20 20  LeafPgno).      
b0e0: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  );.    }.  }.}..
b0f0: 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 69  /*.** Move the i
b100: 74 65 72 61 74 6f 72 20 70 61 73 73 65 64 20 61  terator passed a
b110: 73 20 74 68 65 20 6f 6e 6c 79 20 61 72 67 75 6d  s the only argum
b120: 65 6e 74 20 74 6f 20 74 68 65 20 70 72 65 76 69  ent to the previ
b130: 6f 75 73 20 65 6e 74 72 79 2e 0a 2a 2f 0a 73 74  ous entry..*/.st
b140: 61 74 69 63 20 69 6e 74 20 66 74 73 35 44 6c 69  atic int fts5Dli
b150: 64 78 4c 76 6c 50 72 65 76 28 46 74 73 35 44 6c  dxLvlPrev(Fts5Dl
b160: 69 64 78 4c 76 6c 20 2a 70 4c 76 6c 29 7b 0a 20  idxLvl *pLvl){. 
b170: 20 69 6e 74 20 69 4f 66 66 20 3d 20 70 4c 76 6c   int iOff = pLvl
b180: 2d 3e 69 4f 66 66 3b 0a 0a 20 20 61 73 73 65 72  ->iOff;..  asser
b190: 74 28 20 70 4c 76 6c 2d 3e 62 45 6f 66 3d 3d 30  t( pLvl->bEof==0
b1a0: 20 29 3b 0a 20 20 69 66 28 20 69 4f 66 66 3c 3d   );.  if( iOff<=
b1b0: 70 4c 76 6c 2d 3e 69 46 69 72 73 74 4f 66 66 20  pLvl->iFirstOff 
b1c0: 29 7b 0a 20 20 20 20 70 4c 76 6c 2d 3e 62 45 6f  ){.    pLvl->bEo
b1d0: 66 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a  f = 1;.  }else{.
b1e0: 20 20 20 20 75 38 20 2a 61 20 3d 20 70 4c 76 6c      u8 *a = pLvl
b1f0: 2d 3e 70 44 61 74 61 2d 3e 70 3b 0a 20 20 20 20  ->pData->p;.    
b200: 69 36 34 20 69 56 61 6c 3b 0a 20 20 20 20 69 6e  i64 iVal;.    in
b210: 74 20 69 4c 69 6d 69 74 3b 0a 20 20 20 20 69 6e  t iLimit;.    in
b220: 74 20 69 69 3b 0a 20 20 20 20 69 6e 74 20 6e 5a  t ii;.    int nZ
b230: 65 72 6f 20 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a  ero = 0;..    /*
b240: 20 43 75 72 72 65 6e 74 6c 79 20 69 4f 66 66 20   Currently iOff 
b250: 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 66 69  points to the fi
b260: 72 73 74 20 62 79 74 65 20 6f 66 20 61 20 76 61  rst byte of a va
b270: 72 69 6e 74 2e 20 54 68 69 73 20 62 6c 6f 63 6b  rint. This block
b280: 20 0a 20 20 20 20 2a 2a 20 64 65 63 72 65 6d 65   .    ** decreme
b290: 6e 74 73 20 69 4f 66 66 20 75 6e 74 69 6c 20 69  nts iOff until i
b2a0: 74 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20  t points to the 
b2b0: 66 69 72 73 74 20 62 79 74 65 20 6f 66 20 74 68  first byte of th
b2c0: 65 20 70 72 65 76 69 6f 75 73 20 0a 20 20 20 20  e previous .    
b2d0: 2a 2a 20 76 61 72 69 6e 74 2e 20 54 61 6b 69 6e  ** varint. Takin
b2e0: 67 20 63 61 72 65 20 6e 6f 74 20 74 6f 20 72 65  g care not to re
b2f0: 61 64 20 61 6e 79 20 6d 65 6d 6f 72 79 20 6c 6f  ad any memory lo
b300: 63 61 74 69 6f 6e 73 20 74 68 61 74 20 6f 63 63  cations that occ
b310: 75 72 0a 20 20 20 20 2a 2a 20 62 65 66 6f 72 65  ur.    ** before
b320: 20 74 68 65 20 62 75 66 66 65 72 20 69 6e 20 6d   the buffer in m
b330: 65 6d 6f 72 79 2e 20 20 2a 2f 0a 20 20 20 20 69  emory.  */.    i
b340: 4c 69 6d 69 74 20 3d 20 28 69 4f 66 66 3e 39 20  Limit = (iOff>9 
b350: 3f 20 69 4f 66 66 2d 39 20 3a 20 30 29 3b 0a 20  ? iOff-9 : 0);. 
b360: 20 20 20 66 6f 72 28 69 4f 66 66 2d 2d 3b 20 69     for(iOff--; i
b370: 4f 66 66 3e 69 4c 69 6d 69 74 3b 20 69 4f 66 66  Off>iLimit; iOff
b380: 2d 2d 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28  --){.      if( (
b390: 61 5b 69 4f 66 66 2d 31 5d 20 26 20 30 78 38 30  a[iOff-1] & 0x80
b3a0: 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20  )==0 ) break;.  
b3b0: 20 20 7d 0a 0a 20 20 20 20 66 74 73 35 47 65 74    }..    fts5Get
b3c0: 56 61 72 69 6e 74 28 26 61 5b 69 4f 66 66 5d 2c  Varint(&a[iOff],
b3d0: 20 28 75 36 34 2a 29 26 69 56 61 6c 29 3b 0a 20   (u64*)&iVal);. 
b3e0: 20 20 20 70 4c 76 6c 2d 3e 69 52 6f 77 69 64 20     pLvl->iRowid 
b3f0: 2d 3d 20 69 56 61 6c 3b 0a 20 20 20 20 70 4c 76  -= iVal;.    pLv
b400: 6c 2d 3e 69 4c 65 61 66 50 67 6e 6f 2d 2d 3b 0a  l->iLeafPgno--;.
b410: 0a 20 20 20 20 2f 2a 20 53 6b 69 70 20 62 61 63  .    /* Skip bac
b420: 6b 77 61 72 64 73 20 70 61 73 74 20 61 6e 79 20  kwards past any 
b430: 30 78 30 30 20 76 61 72 69 6e 74 73 2e 20 2a 2f  0x00 varints. */
b440: 0a 20 20 20 20 66 6f 72 28 69 69 3d 69 4f 66 66  .    for(ii=iOff
b450: 2d 31 3b 20 69 69 3e 3d 70 4c 76 6c 2d 3e 69 46  -1; ii>=pLvl->iF
b460: 69 72 73 74 4f 66 66 20 26 26 20 61 5b 69 69 5d  irstOff && a[ii]
b470: 3d 3d 30 78 30 30 3b 20 69 69 2d 2d 29 7b 0a 20  ==0x00; ii--){. 
b480: 20 20 20 20 20 6e 5a 65 72 6f 2b 2b 3b 0a 20 20       nZero++;.  
b490: 20 20 7d 0a 20 20 20 20 69 66 28 20 69 69 3e 3d    }.    if( ii>=
b4a0: 70 4c 76 6c 2d 3e 69 46 69 72 73 74 4f 66 66 20  pLvl->iFirstOff 
b4b0: 26 26 20 28 61 5b 69 69 5d 20 26 20 30 78 38 30  && (a[ii] & 0x80
b4c0: 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68  ) ){.      /* Th
b4d0: 65 20 62 79 74 65 20 69 6d 6d 65 64 69 61 74 65  e byte immediate
b4e0: 6c 79 20 62 65 66 6f 72 65 20 74 68 65 20 6c 61  ly before the la
b4f0: 73 74 20 30 78 30 30 20 62 79 74 65 20 68 61 73  st 0x00 byte has
b500: 20 74 68 65 20 30 78 38 30 20 62 69 74 0a 20 20   the 0x80 bit.  
b510: 20 20 20 20 2a 2a 20 73 65 74 2e 20 53 6f 20 74      ** set. So t
b520: 68 65 20 6c 61 73 74 20 30 78 30 30 20 69 73 20  he last 0x00 is 
b530: 6f 6e 6c 79 20 61 20 76 61 72 69 6e 74 20 30 20  only a varint 0 
b540: 69 66 20 74 68 65 72 65 20 61 72 65 20 38 20 6d  if there are 8 m
b550: 6f 72 65 20 30 78 38 30 0a 20 20 20 20 20 20 2a  ore 0x80.      *
b560: 2a 20 62 79 74 65 73 20 62 65 66 6f 72 65 20 61  * bytes before a
b570: 5b 69 69 5d 2e 20 2a 2f 0a 20 20 20 20 20 20 69  [ii]. */.      i
b580: 6e 74 20 62 5a 65 72 6f 20 3d 20 30 3b 20 20 20  nt bZero = 0;   
b590: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
b5a0: 75 65 20 69 66 20 6c 61 73 74 20 30 78 30 30 20  ue if last 0x00 
b5b0: 63 6f 75 6e 74 73 20 2a 2f 0a 20 20 20 20 20 20  counts */.      
b5c0: 69 66 28 20 28 69 69 2d 38 29 3e 3d 70 4c 76 6c  if( (ii-8)>=pLvl
b5d0: 2d 3e 69 46 69 72 73 74 4f 66 66 20 29 7b 0a 20  ->iFirstOff ){. 
b5e0: 20 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20         int j;.  
b5f0: 20 20 20 20 20 20 66 6f 72 28 6a 3d 31 3b 20 6a        for(j=1; j
b600: 3c 3d 38 20 26 26 20 28 61 5b 69 69 2d 6a 5d 20  <=8 && (a[ii-j] 
b610: 26 20 30 78 38 30 29 3b 20 6a 2b 2b 29 3b 0a 20  & 0x80); j++);. 
b620: 20 20 20 20 20 20 20 62 5a 65 72 6f 20 3d 20 28         bZero = (
b630: 6a 3e 38 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  j>8);.      }.  
b640: 20 20 20 20 69 66 28 20 62 5a 65 72 6f 3d 3d 30      if( bZero==0
b650: 20 29 20 6e 5a 65 72 6f 2d 2d 3b 0a 20 20 20 20   ) nZero--;.    
b660: 7d 0a 20 20 20 20 70 4c 76 6c 2d 3e 69 4c 65 61  }.    pLvl->iLea
b670: 66 50 67 6e 6f 20 2d 3d 20 6e 5a 65 72 6f 3b 0a  fPgno -= nZero;.
b680: 20 20 20 20 70 4c 76 6c 2d 3e 69 4f 66 66 20 3d      pLvl->iOff =
b690: 20 69 4f 66 66 20 2d 20 6e 5a 65 72 6f 3b 0a 20   iOff - nZero;. 
b6a0: 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70 4c 76   }..  return pLv
b6b0: 6c 2d 3e 62 45 6f 66 3b 0a 7d 0a 0a 73 74 61 74  l->bEof;.}..stat
b6c0: 69 63 20 69 6e 74 20 66 74 73 35 44 6c 69 64 78  ic int fts5Dlidx
b6d0: 49 74 65 72 50 72 65 76 52 28 46 74 73 35 49 6e  IterPrevR(Fts5In
b6e0: 64 65 78 20 2a 70 2c 20 46 74 73 35 44 6c 69 64  dex *p, Fts5Dlid
b6f0: 78 49 74 65 72 20 2a 70 49 74 65 72 2c 20 69 6e  xIter *pIter, in
b700: 74 20 69 4c 76 6c 29 7b 0a 20 20 46 74 73 35 44  t iLvl){.  Fts5D
b710: 6c 69 64 78 4c 76 6c 20 2a 70 4c 76 6c 20 3d 20  lidxLvl *pLvl = 
b720: 26 70 49 74 65 72 2d 3e 61 4c 76 6c 5b 69 4c 76  &pIter->aLvl[iLv
b730: 6c 5d 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 69  l];..  assert( i
b740: 4c 76 6c 3c 70 49 74 65 72 2d 3e 6e 4c 76 6c 20  Lvl<pIter->nLvl 
b750: 29 3b 0a 20 20 69 66 28 20 66 74 73 35 44 6c 69  );.  if( fts5Dli
b760: 64 78 4c 76 6c 50 72 65 76 28 70 4c 76 6c 29 20  dxLvlPrev(pLvl) 
b770: 29 7b 0a 20 20 20 20 69 66 28 20 28 69 4c 76 6c  ){.    if( (iLvl
b780: 2b 31 29 20 3c 20 70 49 74 65 72 2d 3e 6e 4c 76  +1) < pIter->nLv
b790: 6c 20 29 7b 0a 20 20 20 20 20 20 66 74 73 35 44  l ){.      fts5D
b7a0: 6c 69 64 78 49 74 65 72 50 72 65 76 52 28 70 2c  lidxIterPrevR(p,
b7b0: 20 70 49 74 65 72 2c 20 69 4c 76 6c 2b 31 29 3b   pIter, iLvl+1);
b7c0: 0a 20 20 20 20 20 20 69 66 28 20 70 4c 76 6c 5b  .      if( pLvl[
b7d0: 31 5d 2e 62 45 6f 66 3d 3d 30 20 29 7b 0a 20 20  1].bEof==0 ){.  
b7e0: 20 20 20 20 20 20 66 74 73 35 44 61 74 61 52 65        fts5DataRe
b7f0: 6c 65 61 73 65 28 70 4c 76 6c 2d 3e 70 44 61 74  lease(pLvl->pDat
b800: 61 29 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 73  a);.        mems
b810: 65 74 28 70 4c 76 6c 2c 20 30 2c 20 73 69 7a 65  et(pLvl, 0, size
b820: 6f 66 28 46 74 73 35 44 6c 69 64 78 4c 76 6c 29  of(Fts5DlidxLvl)
b830: 29 3b 0a 20 20 20 20 20 20 20 20 70 4c 76 6c 2d  );.        pLvl-
b840: 3e 70 44 61 74 61 20 3d 20 66 74 73 35 44 61 74  >pData = fts5Dat
b850: 61 52 65 61 64 28 70 2c 20 0a 20 20 20 20 20 20  aRead(p, .      
b860: 20 20 20 20 20 20 46 54 53 35 5f 44 4c 49 44 58        FTS5_DLIDX
b870: 5f 52 4f 57 49 44 28 70 49 74 65 72 2d 3e 69 53  _ROWID(pIter->iS
b880: 65 67 69 64 2c 20 69 4c 76 6c 2c 20 70 4c 76 6c  egid, iLvl, pLvl
b890: 5b 31 5d 2e 69 4c 65 61 66 50 67 6e 6f 29 0a 20  [1].iLeafPgno). 
b8a0: 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20         );.      
b8b0: 20 20 69 66 28 20 70 4c 76 6c 2d 3e 70 44 61 74    if( pLvl->pDat
b8c0: 61 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 77  a ){.          w
b8d0: 68 69 6c 65 28 20 66 74 73 35 44 6c 69 64 78 4c  hile( fts5DlidxL
b8e0: 76 6c 4e 65 78 74 28 70 4c 76 6c 29 3d 3d 30 20  vlNext(pLvl)==0 
b8f0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 4c 76  );.          pLv
b900: 6c 2d 3e 62 45 6f 66 20 3d 20 30 3b 0a 20 20 20  l->bEof = 0;.   
b910: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
b920: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75     }.  }..  retu
b930: 72 6e 20 70 49 74 65 72 2d 3e 61 4c 76 6c 5b 30  rn pIter->aLvl[0
b940: 5d 2e 62 45 6f 66 3b 0a 7d 0a 73 74 61 74 69 63  ].bEof;.}.static
b950: 20 69 6e 74 20 66 74 73 35 44 6c 69 64 78 49 74   int fts5DlidxIt
b960: 65 72 50 72 65 76 28 46 74 73 35 49 6e 64 65 78  erPrev(Fts5Index
b970: 20 2a 70 2c 20 46 74 73 35 44 6c 69 64 78 49 74   *p, Fts5DlidxIt
b980: 65 72 20 2a 70 49 74 65 72 29 7b 0a 20 20 72 65  er *pIter){.  re
b990: 74 75 72 6e 20 66 74 73 35 44 6c 69 64 78 49 74  turn fts5DlidxIt
b9a0: 65 72 50 72 65 76 52 28 70 2c 20 70 49 74 65 72  erPrevR(p, pIter
b9b0: 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46  , 0);.}../*.** F
b9c0: 72 65 65 20 61 20 64 6f 63 6c 69 73 74 2d 69 6e  ree a doclist-in
b9d0: 64 65 78 20 69 74 65 72 61 74 6f 72 20 6f 62 6a  dex iterator obj
b9e0: 65 63 74 20 61 6c 6c 6f 63 61 74 65 64 20 62 79  ect allocated by
b9f0: 20 66 74 73 35 44 6c 69 64 78 49 74 65 72 49 6e   fts5DlidxIterIn
ba00: 69 74 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  it()..*/.static 
ba10: 76 6f 69 64 20 66 74 73 35 44 6c 69 64 78 49 74  void fts5DlidxIt
ba20: 65 72 46 72 65 65 28 46 74 73 35 44 6c 69 64 78  erFree(Fts5Dlidx
ba30: 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a 20 20  Iter *pIter){.  
ba40: 69 66 28 20 70 49 74 65 72 20 29 7b 0a 20 20 20  if( pIter ){.   
ba50: 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28   int i;.    for(
ba60: 69 3d 30 3b 20 69 3c 70 49 74 65 72 2d 3e 6e 4c  i=0; i<pIter->nL
ba70: 76 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  vl; i++){.      
ba80: 66 74 73 35 44 61 74 61 52 65 6c 65 61 73 65 28  fts5DataRelease(
ba90: 70 49 74 65 72 2d 3e 61 4c 76 6c 5b 69 5d 2e 70  pIter->aLvl[i].p
baa0: 44 61 74 61 29 3b 0a 20 20 20 20 7d 0a 20 20 20  Data);.    }.   
bab0: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 49   sqlite3_free(pI
bac0: 74 65 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61  ter);.  }.}..sta
bad0: 74 69 63 20 46 74 73 35 44 6c 69 64 78 49 74 65  tic Fts5DlidxIte
bae0: 72 20 2a 66 74 73 35 44 6c 69 64 78 49 74 65 72  r *fts5DlidxIter
baf0: 49 6e 69 74 28 0a 20 20 46 74 73 35 49 6e 64 65  Init(.  Fts5Inde
bb00: 78 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  x *p,           
bb10: 20 20 20 20 20 20 20 20 2f 2a 20 46 74 73 35 20          /* Fts5 
bb20: 42 61 63 6b 65 6e 64 20 74 6f 20 69 74 65 72 61  Backend to itera
bb30: 74 65 20 77 69 74 68 69 6e 20 2a 2f 0a 20 20 69  te within */.  i
bb40: 6e 74 20 62 52 65 76 2c 20 20 20 20 20 20 20 20  nt bRev,        
bb50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
bb60: 2a 20 54 72 75 65 20 66 6f 72 20 4f 52 44 45 52  * True for ORDER
bb70: 20 42 59 20 41 53 43 20 2a 2f 0a 20 20 69 6e 74   BY ASC */.  int
bb80: 20 69 53 65 67 69 64 2c 20 20 20 20 20 20 20 20   iSegid,        
bb90: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
bba0: 53 65 67 6d 65 6e 74 20 69 64 20 2a 2f 0a 20 20  Segment id */.  
bbb0: 69 6e 74 20 69 4c 65 61 66 50 67 20 20 20 20 20  int iLeafPg     
bbc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bbd0: 2f 2a 20 4c 65 61 66 20 70 61 67 65 20 6e 75 6d  /* Leaf page num
bbe0: 62 65 72 20 74 6f 20 6c 6f 61 64 20 64 6c 69 64  ber to load dlid
bbf0: 78 20 66 6f 72 20 2a 2f 0a 29 7b 0a 20 20 46 74  x for */.){.  Ft
bc00: 73 35 44 6c 69 64 78 49 74 65 72 20 2a 70 49 74  s5DlidxIter *pIt
bc10: 65 72 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 3b  er = 0;.  int i;
bc20: 0a 20 20 69 6e 74 20 62 44 6f 6e 65 20 3d 20 30  .  int bDone = 0
bc30: 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20 70 2d  ;..  for(i=0; p-
bc40: 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26  >rc==SQLITE_OK &
bc50: 26 20 62 44 6f 6e 65 3d 3d 30 3b 20 69 2b 2b 29  & bDone==0; i++)
bc60: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e  {.    sqlite3_in
bc70: 74 36 34 20 6e 42 79 74 65 20 3d 20 73 69 7a 65  t64 nByte = size
bc80: 6f 66 28 46 74 73 35 44 6c 69 64 78 49 74 65 72  of(Fts5DlidxIter
bc90: 29 20 2b 20 69 20 2a 20 73 69 7a 65 6f 66 28 46  ) + i * sizeof(F
bca0: 74 73 35 44 6c 69 64 78 4c 76 6c 29 3b 0a 20 20  ts5DlidxLvl);.  
bcb0: 20 20 46 74 73 35 44 6c 69 64 78 49 74 65 72 20    Fts5DlidxIter 
bcc0: 2a 70 4e 65 77 3b 0a 0a 20 20 20 20 70 4e 65 77  *pNew;..    pNew
bcd0: 20 3d 20 28 46 74 73 35 44 6c 69 64 78 49 74 65   = (Fts5DlidxIte
bce0: 72 2a 29 73 71 6c 69 74 65 33 5f 72 65 61 6c 6c  r*)sqlite3_reall
bcf0: 6f 63 36 34 28 70 49 74 65 72 2c 20 6e 42 79 74  oc64(pIter, nByt
bd00: 65 29 3b 0a 20 20 20 20 69 66 28 20 70 4e 65 77  e);.    if( pNew
bd10: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e  ==0 ){.      p->
bd20: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
bd30: 4d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  M;.    }else{.  
bd40: 20 20 20 20 69 36 34 20 69 52 6f 77 69 64 20 3d      i64 iRowid =
bd50: 20 46 54 53 35 5f 44 4c 49 44 58 5f 52 4f 57 49   FTS5_DLIDX_ROWI
bd60: 44 28 69 53 65 67 69 64 2c 20 69 2c 20 69 4c 65  D(iSegid, i, iLe
bd70: 61 66 50 67 29 3b 0a 20 20 20 20 20 20 46 74 73  afPg);.      Fts
bd80: 35 44 6c 69 64 78 4c 76 6c 20 2a 70 4c 76 6c 20  5DlidxLvl *pLvl 
bd90: 3d 20 26 70 4e 65 77 2d 3e 61 4c 76 6c 5b 69 5d  = &pNew->aLvl[i]
bda0: 3b 0a 20 20 20 20 20 20 70 49 74 65 72 20 3d 20  ;.      pIter = 
bdb0: 70 4e 65 77 3b 0a 20 20 20 20 20 20 6d 65 6d 73  pNew;.      mems
bdc0: 65 74 28 70 4c 76 6c 2c 20 30 2c 20 73 69 7a 65  et(pLvl, 0, size
bdd0: 6f 66 28 46 74 73 35 44 6c 69 64 78 4c 76 6c 29  of(Fts5DlidxLvl)
bde0: 29 3b 0a 20 20 20 20 20 20 70 4c 76 6c 2d 3e 70  );.      pLvl->p
bdf0: 44 61 74 61 20 3d 20 66 74 73 35 44 61 74 61 52  Data = fts5DataR
be00: 65 61 64 28 70 2c 20 69 52 6f 77 69 64 29 3b 0a  ead(p, iRowid);.
be10: 20 20 20 20 20 20 69 66 28 20 70 4c 76 6c 2d 3e        if( pLvl->
be20: 70 44 61 74 61 20 26 26 20 28 70 4c 76 6c 2d 3e  pData && (pLvl->
be30: 70 44 61 74 61 2d 3e 70 5b 30 5d 20 26 20 30 78  pData->p[0] & 0x
be40: 30 30 30 31 29 3d 3d 30 20 29 7b 0a 20 20 20 20  0001)==0 ){.    
be50: 20 20 20 20 62 44 6f 6e 65 20 3d 20 31 3b 0a 20      bDone = 1;. 
be60: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 49 74       }.      pIt
be70: 65 72 2d 3e 6e 4c 76 6c 20 3d 20 69 2b 31 3b 0a  er->nLvl = i+1;.
be80: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28      }.  }..  if(
be90: 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
bea0: 4b 20 29 7b 0a 20 20 20 20 70 49 74 65 72 2d 3e  K ){.    pIter->
beb0: 69 53 65 67 69 64 20 3d 20 69 53 65 67 69 64 3b  iSegid = iSegid;
bec0: 0a 20 20 20 20 69 66 28 20 62 52 65 76 3d 3d 30  .    if( bRev==0
bed0: 20 29 7b 0a 20 20 20 20 20 20 66 74 73 35 44 6c   ){.      fts5Dl
bee0: 69 64 78 49 74 65 72 46 69 72 73 74 28 70 49 74  idxIterFirst(pIt
bef0: 65 72 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  er);.    }else{.
bf00: 20 20 20 20 20 20 66 74 73 35 44 6c 69 64 78 49        fts5DlidxI
bf10: 74 65 72 4c 61 73 74 28 70 2c 20 70 49 74 65 72  terLast(p, pIter
bf20: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
bf30: 69 66 28 20 70 2d 3e 72 63 21 3d 53 51 4c 49 54  if( p->rc!=SQLIT
bf40: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 66 74 73 35  E_OK ){.    fts5
bf50: 44 6c 69 64 78 49 74 65 72 46 72 65 65 28 70 49  DlidxIterFree(pI
bf60: 74 65 72 29 3b 0a 20 20 20 20 70 49 74 65 72 20  ter);.    pIter 
bf70: 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75  = 0;.  }..  retu
bf80: 72 6e 20 70 49 74 65 72 3b 0a 7d 0a 0a 73 74 61  rn pIter;.}..sta
bf90: 74 69 63 20 69 36 34 20 66 74 73 35 44 6c 69 64  tic i64 fts5Dlid
bfa0: 78 49 74 65 72 52 6f 77 69 64 28 46 74 73 35 44  xIterRowid(Fts5D
bfb0: 6c 69 64 78 49 74 65 72 20 2a 70 49 74 65 72 29  lidxIter *pIter)
bfc0: 7b 0a 20 20 72 65 74 75 72 6e 20 70 49 74 65 72  {.  return pIter
bfd0: 2d 3e 61 4c 76 6c 5b 30 5d 2e 69 52 6f 77 69 64  ->aLvl[0].iRowid
bfe0: 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74 20 66  ;.}.static int f
bff0: 74 73 35 44 6c 69 64 78 49 74 65 72 50 67 6e 6f  ts5DlidxIterPgno
c000: 28 46 74 73 35 44 6c 69 64 78 49 74 65 72 20 2a  (Fts5DlidxIter *
c010: 70 49 74 65 72 29 7b 0a 20 20 72 65 74 75 72 6e  pIter){.  return
c020: 20 70 49 74 65 72 2d 3e 61 4c 76 6c 5b 30 5d 2e   pIter->aLvl[0].
c030: 69 4c 65 61 66 50 67 6e 6f 3b 0a 7d 0a 0a 2f 2a  iLeafPgno;.}../*
c040: 0a 2a 2a 20 4c 6f 61 64 20 74 68 65 20 6e 65 78  .** Load the nex
c050: 74 20 6c 65 61 66 20 70 61 67 65 20 69 6e 74 6f  t leaf page into
c060: 20 74 68 65 20 73 65 67 6d 65 6e 74 20 69 74 65   the segment ite
c070: 72 61 74 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  rator..*/.static
c080: 20 76 6f 69 64 20 66 74 73 35 53 65 67 49 74 65   void fts5SegIte
c090: 72 4e 65 78 74 50 61 67 65 28 0a 20 20 46 74 73  rNextPage(.  Fts
c0a0: 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20  5Index *p,      
c0b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
c0c0: 46 54 53 35 20 62 61 63 6b 65 6e 64 20 6f 62 6a  FTS5 backend obj
c0d0: 65 63 74 20 2a 2f 0a 20 20 46 74 73 35 53 65 67  ect */.  Fts5Seg
c0e0: 49 74 65 72 20 2a 70 49 74 65 72 20 20 20 20 20  Iter *pIter     
c0f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72           /* Iter
c100: 61 74 6f 72 20 74 6f 20 61 64 76 61 6e 63 65 20  ator to advance 
c110: 74 6f 20 6e 65 78 74 20 70 61 67 65 20 2a 2f 0a  to next page */.
c120: 29 7b 0a 20 20 46 74 73 35 44 61 74 61 20 2a 70  ){.  Fts5Data *p
c130: 4c 65 61 66 3b 0a 20 20 46 74 73 35 53 74 72 75  Leaf;.  Fts5Stru
c140: 63 74 75 72 65 53 65 67 6d 65 6e 74 20 2a 70 53  ctureSegment *pS
c150: 65 67 20 3d 20 70 49 74 65 72 2d 3e 70 53 65 67  eg = pIter->pSeg
c160: 3b 0a 20 20 66 74 73 35 44 61 74 61 52 65 6c 65  ;.  fts5DataRele
c170: 61 73 65 28 70 49 74 65 72 2d 3e 70 4c 65 61 66  ase(pIter->pLeaf
c180: 29 3b 0a 20 20 70 49 74 65 72 2d 3e 69 4c 65 61  );.  pIter->iLea
c190: 66 50 67 6e 6f 2b 2b 3b 0a 20 20 69 66 28 20 70  fPgno++;.  if( p
c1a0: 49 74 65 72 2d 3e 70 4e 65 78 74 4c 65 61 66 20  Iter->pNextLeaf 
c1b0: 29 7b 0a 20 20 20 20 70 49 74 65 72 2d 3e 70 4c  ){.    pIter->pL
c1c0: 65 61 66 20 3d 20 70 49 74 65 72 2d 3e 70 4e 65  eaf = pIter->pNe
c1d0: 78 74 4c 65 61 66 3b 0a 20 20 20 20 70 49 74 65  xtLeaf;.    pIte
c1e0: 72 2d 3e 70 4e 65 78 74 4c 65 61 66 20 3d 20 30  r->pNextLeaf = 0
c1f0: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 49  ;.  }else if( pI
c200: 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 3c 3d  ter->iLeafPgno<=
c210: 70 53 65 67 2d 3e 70 67 6e 6f 4c 61 73 74 20 29  pSeg->pgnoLast )
c220: 7b 0a 20 20 20 20 70 49 74 65 72 2d 3e 70 4c 65  {.    pIter->pLe
c230: 61 66 20 3d 20 66 74 73 35 4c 65 61 66 52 65 61  af = fts5LeafRea
c240: 64 28 70 2c 20 0a 20 20 20 20 20 20 20 20 46 54  d(p, .        FT
c250: 53 35 5f 53 45 47 4d 45 4e 54 5f 52 4f 57 49 44  S5_SEGMENT_ROWID
c260: 28 70 53 65 67 2d 3e 69 53 65 67 69 64 2c 20 70  (pSeg->iSegid, p
c270: 49 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 29  Iter->iLeafPgno)
c280: 0a 20 20 20 20 29 3b 0a 20 20 7d 65 6c 73 65 7b  .    );.  }else{
c290: 0a 20 20 20 20 70 49 74 65 72 2d 3e 70 4c 65 61  .    pIter->pLea
c2a0: 66 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 70 4c 65  f = 0;.  }.  pLe
c2b0: 61 66 20 3d 20 70 49 74 65 72 2d 3e 70 4c 65 61  af = pIter->pLea
c2c0: 66 3b 0a 0a 20 20 69 66 28 20 70 4c 65 61 66 20  f;..  if( pLeaf 
c2d0: 29 7b 0a 20 20 20 20 70 49 74 65 72 2d 3e 69 50  ){.    pIter->iP
c2e0: 67 69 64 78 4f 66 66 20 3d 20 70 4c 65 61 66 2d  gidxOff = pLeaf-
c2f0: 3e 73 7a 4c 65 61 66 3b 0a 20 20 20 20 69 66 28  >szLeaf;.    if(
c300: 20 66 74 73 35 4c 65 61 66 49 73 54 65 72 6d 6c   fts5LeafIsTerml
c310: 65 73 73 28 70 4c 65 61 66 29 20 29 7b 0a 20 20  ess(pLeaf) ){.  
c320: 20 20 20 20 70 49 74 65 72 2d 3e 69 45 6e 64 6f      pIter->iEndo
c330: 66 44 6f 63 6c 69 73 74 20 3d 20 70 4c 65 61 66  fDoclist = pLeaf
c340: 2d 3e 6e 6e 2b 31 3b 0a 20 20 20 20 7d 65 6c 73  ->nn+1;.    }els
c350: 65 7b 0a 20 20 20 20 20 20 70 49 74 65 72 2d 3e  e{.      pIter->
c360: 69 50 67 69 64 78 4f 66 66 20 2b 3d 20 66 74 73  iPgidxOff += fts
c370: 35 47 65 74 56 61 72 69 6e 74 33 32 28 26 70 4c  5GetVarint32(&pL
c380: 65 61 66 2d 3e 70 5b 70 49 74 65 72 2d 3e 69 50  eaf->p[pIter->iP
c390: 67 69 64 78 4f 66 66 5d 2c 0a 20 20 20 20 20 20  gidxOff],.      
c3a0: 20 20 20 20 70 49 74 65 72 2d 3e 69 45 6e 64 6f      pIter->iEndo
c3b0: 66 44 6f 63 6c 69 73 74 0a 20 20 20 20 20 20 29  fDoclist.      )
c3c0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  ;.    }.  }.}../
c3d0: 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20 70 20  *.** Argument p 
c3e0: 70 6f 69 6e 74 73 20 74 6f 20 61 20 62 75 66 66  points to a buff
c3f0: 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 61 20  er containing a 
c400: 76 61 72 69 6e 74 20 74 6f 20 62 65 20 69 6e 74  varint to be int
c410: 65 72 70 72 65 74 65 64 20 61 73 20 61 0a 2a 2a  erpreted as a.**
c420: 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74 20 73   position list s
c430: 69 7a 65 20 66 69 65 6c 64 2e 20 52 65 61 64 20  ize field. Read 
c440: 74 68 65 20 76 61 72 69 6e 74 20 61 6e 64 20 72  the varint and r
c450: 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72  eturn the number
c460: 20 6f 66 20 62 79 74 65 73 0a 2a 2a 20 72 65 61   of bytes.** rea
c470: 64 2e 20 42 65 66 6f 72 65 20 72 65 74 75 72 6e  d. Before return
c480: 69 6e 67 2c 20 73 65 74 20 2a 70 6e 53 7a 20 74  ing, set *pnSz t
c490: 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  o the number of 
c4a0: 62 79 74 65 73 20 69 6e 20 74 68 65 20 70 6f 73  bytes in the pos
c4b0: 69 74 69 6f 6e 0a 2a 2a 20 6c 69 73 74 2c 20 61  ition.** list, a
c4c0: 6e 64 20 2a 70 62 44 65 6c 20 74 6f 20 74 72 75  nd *pbDel to tru
c4d0: 65 20 69 66 20 74 68 65 20 64 65 6c 65 74 65 20  e if the delete 
c4e0: 66 6c 61 67 20 69 73 20 73 65 74 2c 20 6f 72 20  flag is set, or 
c4f0: 66 61 6c 73 65 20 6f 74 68 65 72 77 69 73 65 2e  false otherwise.
c500: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .*/.static int f
c510: 74 73 35 47 65 74 50 6f 73 6c 69 73 74 53 69 7a  ts5GetPoslistSiz
c520: 65 28 63 6f 6e 73 74 20 75 38 20 2a 70 2c 20 69  e(const u8 *p, i
c530: 6e 74 20 2a 70 6e 53 7a 2c 20 69 6e 74 20 2a 70  nt *pnSz, int *p
c540: 62 44 65 6c 29 7b 0a 20 20 69 6e 74 20 6e 53 7a  bDel){.  int nSz
c550: 3b 0a 20 20 69 6e 74 20 6e 20 3d 20 30 3b 0a 20  ;.  int n = 0;. 
c560: 20 66 74 73 35 46 61 73 74 47 65 74 56 61 72 69   fts5FastGetVari
c570: 6e 74 33 32 28 70 2c 20 6e 2c 20 6e 53 7a 29 3b  nt32(p, n, nSz);
c580: 0a 20 20 61 73 73 65 72 74 5f 6e 63 28 20 6e 53  .  assert_nc( nS
c590: 7a 3e 3d 30 20 29 3b 0a 20 20 2a 70 6e 53 7a 20  z>=0 );.  *pnSz 
c5a0: 3d 20 6e 53 7a 2f 32 3b 0a 20 20 2a 70 62 44 65  = nSz/2;.  *pbDe
c5b0: 6c 20 3d 20 6e 53 7a 20 26 20 30 78 30 30 30 31  l = nSz & 0x0001
c5c0: 3b 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a  ;.  return n;.}.
c5d0: 0a 2f 2a 0a 2a 2a 20 46 74 73 35 53 65 67 49 74  ./*.** Fts5SegIt
c5e0: 65 72 2e 69 4c 65 61 66 4f 66 66 73 65 74 20 63  er.iLeafOffset c
c5f0: 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 73 20  urrently points 
c600: 74 6f 20 74 68 65 20 66 69 72 73 74 20 62 79 74  to the first byt
c610: 65 20 6f 66 20 61 0a 2a 2a 20 70 6f 73 69 74 69  e of a.** positi
c620: 6f 6e 2d 6c 69 73 74 20 73 69 7a 65 20 66 69 65  on-list size fie
c630: 6c 64 2e 20 52 65 61 64 20 74 68 65 20 76 61 6c  ld. Read the val
c640: 75 65 20 6f 66 20 74 68 65 20 66 69 65 6c 64 20  ue of the field 
c650: 61 6e 64 20 73 74 6f 72 65 20 69 74 0a 2a 2a 20  and store it.** 
c660: 69 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  in the following
c670: 20 76 61 72 69 61 62 6c 65 73 3a 0a 2a 2a 0a 2a   variables:.**.*
c680: 2a 20 20 20 46 74 73 35 53 65 67 49 74 65 72 2e  *   Fts5SegIter.
c690: 6e 50 6f 73 0a 2a 2a 20 20 20 46 74 73 35 53 65  nPos.**   Fts5Se
c6a0: 67 49 74 65 72 2e 62 44 65 6c 0a 2a 2a 0a 2a 2a  gIter.bDel.**.**
c6b0: 20 4c 65 61 76 65 20 46 74 73 35 53 65 67 49 74   Leave Fts5SegIt
c6c0: 65 72 2e 69 4c 65 61 66 4f 66 66 73 65 74 20 70  er.iLeafOffset p
c6d0: 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 65 20 66  ointing to the f
c6e0: 69 72 73 74 20 62 79 74 65 20 6f 66 20 74 68 65  irst byte of the
c6f0: 20 0a 2a 2a 20 70 6f 73 69 74 69 6f 6e 20 6c 69   .** position li
c700: 73 74 20 63 6f 6e 74 65 6e 74 20 28 69 66 20 61  st content (if a
c710: 6e 79 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ny)..*/.static v
c720: 6f 69 64 20 66 74 73 35 53 65 67 49 74 65 72 4c  oid fts5SegIterL
c730: 6f 61 64 4e 50 6f 73 28 46 74 73 35 49 6e 64 65  oadNPos(Fts5Inde
c740: 78 20 2a 70 2c 20 46 74 73 35 53 65 67 49 74 65  x *p, Fts5SegIte
c750: 72 20 2a 70 49 74 65 72 29 7b 0a 20 20 69 66 28  r *pIter){.  if(
c760: 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
c770: 4b 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 4f 66  K ){.    int iOf
c780: 66 20 3d 20 70 49 74 65 72 2d 3e 69 4c 65 61 66  f = pIter->iLeaf
c790: 4f 66 66 73 65 74 3b 20 20 2f 2a 20 4f 66 66 73  Offset;  /* Offs
c7a0: 65 74 20 74 6f 20 72 65 61 64 20 61 74 20 2a 2f  et to read at */
c7b0: 0a 20 20 20 20 41 53 53 45 52 54 5f 53 5a 4c 45  .    ASSERT_SZLE
c7c0: 41 46 5f 4f 4b 28 70 49 74 65 72 2d 3e 70 4c 65  AF_OK(pIter->pLe
c7d0: 61 66 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e  af);.    if( p->
c7e0: 70 43 6f 6e 66 69 67 2d 3e 65 44 65 74 61 69 6c  pConfig->eDetail
c7f0: 3d 3d 46 54 53 35 5f 44 45 54 41 49 4c 5f 4e 4f  ==FTS5_DETAIL_NO
c800: 4e 45 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  NE ){.      int 
c810: 69 45 6f 64 20 3d 20 4d 49 4e 28 70 49 74 65 72  iEod = MIN(pIter
c820: 2d 3e 69 45 6e 64 6f 66 44 6f 63 6c 69 73 74 2c  ->iEndofDoclist,
c830: 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 73   pIter->pLeaf->s
c840: 7a 4c 65 61 66 29 3b 0a 20 20 20 20 20 20 70 49  zLeaf);.      pI
c850: 74 65 72 2d 3e 62 44 65 6c 20 3d 20 30 3b 0a 20  ter->bDel = 0;. 
c860: 20 20 20 20 20 70 49 74 65 72 2d 3e 6e 50 6f 73       pIter->nPos
c870: 20 3d 20 31 3b 0a 20 20 20 20 20 20 69 66 28 20   = 1;.      if( 
c880: 69 4f 66 66 3c 69 45 6f 64 20 26 26 20 70 49 74  iOff<iEod && pIt
c890: 65 72 2d 3e 70 4c 65 61 66 2d 3e 70 5b 69 4f 66  er->pLeaf->p[iOf
c8a0: 66 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  f]==0 ){.       
c8b0: 20 70 49 74 65 72 2d 3e 62 44 65 6c 20 3d 20 31   pIter->bDel = 1
c8c0: 3b 0a 20 20 20 20 20 20 20 20 69 4f 66 66 2b 2b  ;.        iOff++
c8d0: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 4f  ;.        if( iO
c8e0: 66 66 3c 69 45 6f 64 20 26 26 20 70 49 74 65 72  ff<iEod && pIter
c8f0: 2d 3e 70 4c 65 61 66 2d 3e 70 5b 69 4f 66 66 5d  ->pLeaf->p[iOff]
c900: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
c910: 20 70 49 74 65 72 2d 3e 6e 50 6f 73 20 3d 20 31   pIter->nPos = 1
c920: 3b 0a 20 20 20 20 20 20 20 20 20 20 69 4f 66 66  ;.          iOff
c930: 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  ++;.        }els
c940: 65 7b 0a 20 20 20 20 20 20 20 20 20 20 70 49 74  e{.          pIt
c950: 65 72 2d 3e 6e 50 6f 73 20 3d 20 30 3b 0a 20 20  er->nPos = 0;.  
c960: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
c970: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
c980: 20 69 6e 74 20 6e 53 7a 3b 0a 20 20 20 20 20 20   int nSz;.      
c990: 66 74 73 35 46 61 73 74 47 65 74 56 61 72 69 6e  fts5FastGetVarin
c9a0: 74 33 32 28 70 49 74 65 72 2d 3e 70 4c 65 61 66  t32(pIter->pLeaf
c9b0: 2d 3e 70 2c 20 69 4f 66 66 2c 20 6e 53 7a 29 3b  ->p, iOff, nSz);
c9c0: 0a 20 20 20 20 20 20 70 49 74 65 72 2d 3e 62 44  .      pIter->bD
c9d0: 65 6c 20 3d 20 28 6e 53 7a 20 26 20 30 78 30 30  el = (nSz & 0x00
c9e0: 30 31 29 3b 0a 20 20 20 20 20 20 70 49 74 65 72  01);.      pIter
c9f0: 2d 3e 6e 50 6f 73 20 3d 20 6e 53 7a 3e 3e 31 3b  ->nPos = nSz>>1;
ca00: 0a 20 20 20 20 20 20 61 73 73 65 72 74 5f 6e 63  .      assert_nc
ca10: 28 20 70 49 74 65 72 2d 3e 6e 50 6f 73 3e 3d 30  ( pIter->nPos>=0
ca20: 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 49   );.    }.    pI
ca30: 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74  ter->iLeafOffset
ca40: 20 3d 20 69 4f 66 66 3b 0a 20 20 7d 0a 7d 0a 0a   = iOff;.  }.}..
ca50: 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
ca60: 53 65 67 49 74 65 72 4c 6f 61 64 52 6f 77 69 64  SegIterLoadRowid
ca70: 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 46  (Fts5Index *p, F
ca80: 74 73 35 53 65 67 49 74 65 72 20 2a 70 49 74 65  ts5SegIter *pIte
ca90: 72 29 7b 0a 20 20 75 38 20 2a 61 20 3d 20 70 49  r){.  u8 *a = pI
caa0: 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 70 3b 20 20  ter->pLeaf->p;  
cab0: 20 20 20 20 20 20 2f 2a 20 42 75 66 66 65 72 20        /* Buffer 
cac0: 74 6f 20 72 65 61 64 20 64 61 74 61 20 66 72 6f  to read data fro
cad0: 6d 20 2a 2f 0a 20 20 69 6e 74 20 69 4f 66 66 20  m */.  int iOff 
cae0: 3d 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66  = pIter->iLeafOf
caf0: 66 73 65 74 3b 0a 0a 20 20 41 53 53 45 52 54 5f  fset;..  ASSERT_
cb00: 53 5a 4c 45 41 46 5f 4f 4b 28 70 49 74 65 72 2d  SZLEAF_OK(pIter-
cb10: 3e 70 4c 65 61 66 29 3b 0a 20 20 69 66 28 20 69  >pLeaf);.  if( i
cb20: 4f 66 66 3e 3d 70 49 74 65 72 2d 3e 70 4c 65 61  Off>=pIter->pLea
cb30: 66 2d 3e 73 7a 4c 65 61 66 20 29 7b 0a 20 20 20  f->szLeaf ){.   
cb40: 20 66 74 73 35 53 65 67 49 74 65 72 4e 65 78 74   fts5SegIterNext
cb50: 50 61 67 65 28 70 2c 20 70 49 74 65 72 29 3b 0a  Page(p, pIter);.
cb60: 20 20 20 20 69 66 28 20 70 49 74 65 72 2d 3e 70      if( pIter->p
cb70: 4c 65 61 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Leaf==0 ){.     
cb80: 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49   if( p->rc==SQLI
cb90: 54 45 5f 4f 4b 20 29 20 70 2d 3e 72 63 20 3d 20  TE_OK ) p->rc = 
cba0: 46 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20  FTS5_CORRUPT;.  
cbb0: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20      return;.    
cbc0: 7d 0a 20 20 20 20 69 4f 66 66 20 3d 20 34 3b 0a  }.    iOff = 4;.
cbd0: 20 20 20 20 61 20 3d 20 70 49 74 65 72 2d 3e 70      a = pIter->p
cbe0: 4c 65 61 66 2d 3e 70 3b 0a 20 20 7d 0a 20 20 69  Leaf->p;.  }.  i
cbf0: 4f 66 66 20 2b 3d 20 73 71 6c 69 74 65 33 46 74  Off += sqlite3Ft
cc00: 73 35 47 65 74 56 61 72 69 6e 74 28 26 61 5b 69  s5GetVarint(&a[i
cc10: 4f 66 66 5d 2c 20 28 75 36 34 2a 29 26 70 49 74  Off], (u64*)&pIt
cc20: 65 72 2d 3e 69 52 6f 77 69 64 29 3b 0a 20 20 70  er->iRowid);.  p
cc30: 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65  Iter->iLeafOffse
cc40: 74 20 3d 20 69 4f 66 66 3b 0a 7d 0a 0a 2f 2a 0a  t = iOff;.}../*.
cc50: 2a 2a 20 46 74 73 35 53 65 67 49 74 65 72 2e 69  ** Fts5SegIter.i
cc60: 4c 65 61 66 4f 66 66 73 65 74 20 63 75 72 72 65  LeafOffset curre
cc70: 6e 74 6c 79 20 70 6f 69 6e 74 73 20 74 6f 20 74  ntly points to t
cc80: 68 65 20 66 69 72 73 74 20 62 79 74 65 20 6f 66  he first byte of
cc90: 20 74 68 65 20 0a 2a 2a 20 22 6e 53 75 66 66 69   the .** "nSuffi
cca0: 78 22 20 66 69 65 6c 64 20 6f 66 20 61 20 74 65  x" field of a te
ccb0: 72 6d 2e 20 46 75 6e 63 74 69 6f 6e 20 70 61 72  rm. Function par
ccc0: 61 6d 65 74 65 72 20 6e 4b 65 65 70 20 63 6f 6e  ameter nKeep con
ccd0: 74 61 69 6e 73 20 74 68 65 20 76 61 6c 75 65 0a  tains the value.
cce0: 2a 2a 20 6f 66 20 74 68 65 20 22 6e 50 72 65 66  ** of the "nPref
ccf0: 69 78 22 20 66 69 65 6c 64 20 28 69 66 20 74 68  ix" field (if th
cd00: 65 72 65 20 77 61 73 20 6f 6e 65 20 2d 20 69 74  ere was one - it
cd10: 20 69 73 20 70 61 73 73 65 64 20 30 20 69 66 20   is passed 0 if 
cd20: 74 68 69 73 20 69 73 0a 2a 2a 20 74 68 65 20 66  this is.** the f
cd30: 69 72 73 74 20 74 65 72 6d 20 69 6e 20 74 68 65  irst term in the
cd40: 20 73 65 67 6d 65 6e 74 29 2e 0a 2a 2a 0a 2a 2a   segment)..**.**
cd50: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 70   This function p
cd60: 6f 70 75 6c 61 74 65 73 3a 0a 2a 2a 0a 2a 2a 20  opulates:.**.** 
cd70: 20 20 46 74 73 35 53 65 67 49 74 65 72 2e 74 65    Fts5SegIter.te
cd80: 72 6d 0a 2a 2a 20 20 20 46 74 73 35 53 65 67 49  rm.**   Fts5SegI
cd90: 74 65 72 2e 72 6f 77 69 64 0a 2a 2a 0a 2a 2a 20  ter.rowid.**.** 
cda0: 61 63 63 6f 72 64 69 6e 67 6c 79 20 61 6e 64 20  accordingly and 
cdb0: 6c 65 61 76 65 73 20 28 46 74 73 35 53 65 67 49  leaves (Fts5SegI
cdc0: 74 65 72 2e 69 4c 65 61 66 4f 66 66 73 65 74 29  ter.iLeafOffset)
cdd0: 20 73 65 74 20 74 6f 20 74 68 65 20 63 6f 6e 74   set to the cont
cde0: 65 6e 74 20 6f 66 0a 2a 2a 20 74 68 65 20 66 69  ent of.** the fi
cdf0: 72 73 74 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73  rst position lis
ce00: 74 2e 20 54 68 65 20 70 6f 73 69 74 69 6f 6e 20  t. The position 
ce10: 6c 69 73 74 20 62 65 6c 6f 6e 67 69 6e 67 20 74  list belonging t
ce20: 6f 20 64 6f 63 75 6d 65 6e 74 20 0a 2a 2a 20 28  o document .** (
ce30: 46 74 73 35 53 65 67 49 74 65 72 2e 69 52 6f 77  Fts5SegIter.iRow
ce40: 69 64 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  id)..*/.static v
ce50: 6f 69 64 20 66 74 73 35 53 65 67 49 74 65 72 4c  oid fts5SegIterL
ce60: 6f 61 64 54 65 72 6d 28 46 74 73 35 49 6e 64 65  oadTerm(Fts5Inde
ce70: 78 20 2a 70 2c 20 46 74 73 35 53 65 67 49 74 65  x *p, Fts5SegIte
ce80: 72 20 2a 70 49 74 65 72 2c 20 69 6e 74 20 6e 4b  r *pIter, int nK
ce90: 65 65 70 29 7b 0a 20 20 75 38 20 2a 61 20 3d 20  eep){.  u8 *a = 
cea0: 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 70 3b  pIter->pLeaf->p;
ceb0: 20 20 20 20 20 20 20 20 2f 2a 20 42 75 66 66 65          /* Buffe
cec0: 72 20 74 6f 20 72 65 61 64 20 64 61 74 61 20 66  r to read data f
ced0: 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20 69 4f 66  rom */.  int iOf
cee0: 66 20 3d 20 70 49 74 65 72 2d 3e 69 4c 65 61 66  f = pIter->iLeaf
cef0: 4f 66 66 73 65 74 3b 20 20 2f 2a 20 4f 66 66 73  Offset;  /* Offs
cf00: 65 74 20 74 6f 20 72 65 61 64 20 61 74 20 2a 2f  et to read at */
cf10: 0a 20 20 69 6e 74 20 6e 4e 65 77 3b 20 20 20 20  .  int nNew;    
cf20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cf30: 20 20 20 2f 2a 20 42 79 74 65 73 20 6f 66 20 6e     /* Bytes of n
cf40: 65 77 20 64 61 74 61 20 2a 2f 0a 0a 20 20 69 4f  ew data */..  iO
cf50: 66 66 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72  ff += fts5GetVar
cf60: 69 6e 74 33 32 28 26 61 5b 69 4f 66 66 5d 2c 20  int32(&a[iOff], 
cf70: 6e 4e 65 77 29 3b 0a 20 20 69 66 28 20 69 4f 66  nNew);.  if( iOf
cf80: 66 2b 6e 4e 65 77 3e 70 49 74 65 72 2d 3e 70 4c  f+nNew>pIter->pL
cf90: 65 61 66 2d 3e 73 7a 4c 65 61 66 20 7c 7c 20 6e  eaf->szLeaf || n
cfa0: 4b 65 65 70 3e 70 49 74 65 72 2d 3e 74 65 72 6d  Keep>pIter->term
cfb0: 2e 6e 20 7c 7c 20 6e 4e 65 77 3d 3d 30 20 29 7b  .n || nNew==0 ){
cfc0: 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 46 54 53  .    p->rc = FTS
cfd0: 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20 20 72  5_CORRUPT;.    r
cfe0: 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 70 49 74  eturn;.  }.  pIt
cff0: 65 72 2d 3e 74 65 72 6d 2e 6e 20 3d 20 6e 4b 65  er->term.n = nKe
d000: 65 70 3b 0a 20 20 66 74 73 35 42 75 66 66 65 72  ep;.  fts5Buffer
d010: 41 70 70 65 6e 64 42 6c 6f 62 28 26 70 2d 3e 72  AppendBlob(&p->r
d020: 63 2c 20 26 70 49 74 65 72 2d 3e 74 65 72 6d 2c  c, &pIter->term,
d030: 20 6e 4e 65 77 2c 20 26 61 5b 69 4f 66 66 5d 29   nNew, &a[iOff])
d040: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 49 74 65  ;.  assert( pIte
d050: 72 2d 3e 74 65 72 6d 2e 6e 3c 3d 70 49 74 65 72  r->term.n<=pIter
d060: 2d 3e 74 65 72 6d 2e 6e 53 70 61 63 65 20 29 3b  ->term.nSpace );
d070: 0a 20 20 69 4f 66 66 20 2b 3d 20 6e 4e 65 77 3b  .  iOff += nNew;
d080: 0a 20 20 70 49 74 65 72 2d 3e 69 54 65 72 6d 4c  .  pIter->iTermL
d090: 65 61 66 4f 66 66 73 65 74 20 3d 20 69 4f 66 66  eafOffset = iOff
d0a0: 3b 0a 20 20 70 49 74 65 72 2d 3e 69 54 65 72 6d  ;.  pIter->iTerm
d0b0: 4c 65 61 66 50 67 6e 6f 20 3d 20 70 49 74 65 72  LeafPgno = pIter
d0c0: 2d 3e 69 4c 65 61 66 50 67 6e 6f 3b 0a 20 20 70  ->iLeafPgno;.  p
d0d0: 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65  Iter->iLeafOffse
d0e0: 74 20 3d 20 69 4f 66 66 3b 0a 0a 20 20 69 66 28  t = iOff;..  if(
d0f0: 20 70 49 74 65 72 2d 3e 69 50 67 69 64 78 4f 66   pIter->iPgidxOf
d100: 66 3e 3d 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d  f>=pIter->pLeaf-
d110: 3e 6e 6e 20 29 7b 0a 20 20 20 20 70 49 74 65 72  >nn ){.    pIter
d120: 2d 3e 69 45 6e 64 6f 66 44 6f 63 6c 69 73 74 20  ->iEndofDoclist 
d130: 3d 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e  = pIter->pLeaf->
d140: 6e 6e 2b 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  nn+1;.  }else{. 
d150: 20 20 20 69 6e 74 20 6e 45 78 74 72 61 3b 0a 20     int nExtra;. 
d160: 20 20 20 70 49 74 65 72 2d 3e 69 50 67 69 64 78     pIter->iPgidx
d170: 4f 66 66 20 2b 3d 20 66 74 73 35 47 65 74 56 61  Off += fts5GetVa
d180: 72 69 6e 74 33 32 28 26 61 5b 70 49 74 65 72 2d  rint32(&a[pIter-
d190: 3e 69 50 67 69 64 78 4f 66 66 5d 2c 20 6e 45 78  >iPgidxOff], nEx
d1a0: 74 72 61 29 3b 0a 20 20 20 20 70 49 74 65 72 2d  tra);.    pIter-
d1b0: 3e 69 45 6e 64 6f 66 44 6f 63 6c 69 73 74 20 2b  >iEndofDoclist +
d1c0: 3d 20 6e 45 78 74 72 61 3b 0a 20 20 7d 0a 0a 20  = nExtra;.  }.. 
d1d0: 20 66 74 73 35 53 65 67 49 74 65 72 4c 6f 61 64   fts5SegIterLoad
d1e0: 52 6f 77 69 64 28 70 2c 20 70 49 74 65 72 29 3b  Rowid(p, pIter);
d1f0: 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .}..static void 
d200: 66 74 73 35 53 65 67 49 74 65 72 4e 65 78 74 28  fts5SegIterNext(
d210: 46 74 73 35 49 6e 64 65 78 2a 2c 20 46 74 73 35  Fts5Index*, Fts5
d220: 53 65 67 49 74 65 72 2a 2c 20 69 6e 74 2a 29 3b  SegIter*, int*);
d230: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
d240: 35 53 65 67 49 74 65 72 4e 65 78 74 5f 52 65 76  5SegIterNext_Rev
d250: 65 72 73 65 28 46 74 73 35 49 6e 64 65 78 2a 2c  erse(Fts5Index*,
d260: 20 46 74 73 35 53 65 67 49 74 65 72 2a 2c 20 69   Fts5SegIter*, i
d270: 6e 74 2a 29 3b 0a 73 74 61 74 69 63 20 76 6f 69  nt*);.static voi
d280: 64 20 66 74 73 35 53 65 67 49 74 65 72 4e 65 78  d fts5SegIterNex
d290: 74 5f 4e 6f 6e 65 28 46 74 73 35 49 6e 64 65 78  t_None(Fts5Index
d2a0: 2a 2c 20 46 74 73 35 53 65 67 49 74 65 72 2a 2c  *, Fts5SegIter*,
d2b0: 20 69 6e 74 2a 29 3b 0a 0a 73 74 61 74 69 63 20   int*);..static 
d2c0: 76 6f 69 64 20 66 74 73 35 53 65 67 49 74 65 72  void fts5SegIter
d2d0: 53 65 74 4e 65 78 74 28 46 74 73 35 49 6e 64 65  SetNext(Fts5Inde
d2e0: 78 20 2a 70 2c 20 46 74 73 35 53 65 67 49 74 65  x *p, Fts5SegIte
d2f0: 72 20 2a 70 49 74 65 72 29 7b 0a 20 20 69 66 28  r *pIter){.  if(
d300: 20 70 49 74 65 72 2d 3e 66 6c 61 67 73 20 26 20   pIter->flags & 
d310: 46 54 53 35 5f 53 45 47 49 54 45 52 5f 52 45 56  FTS5_SEGITER_REV
d320: 45 52 53 45 20 29 7b 0a 20 20 20 20 70 49 74 65  ERSE ){.    pIte
d330: 72 2d 3e 78 4e 65 78 74 20 3d 20 66 74 73 35 53  r->xNext = fts5S
d340: 65 67 49 74 65 72 4e 65 78 74 5f 52 65 76 65 72  egIterNext_Rever
d350: 73 65 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  se;.  }else if( 
d360: 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e 65 44 65 74  p->pConfig->eDet
d370: 61 69 6c 3d 3d 46 54 53 35 5f 44 45 54 41 49 4c  ail==FTS5_DETAIL
d380: 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 70 49 74  _NONE ){.    pIt
d390: 65 72 2d 3e 78 4e 65 78 74 20 3d 20 66 74 73 35  er->xNext = fts5
d3a0: 53 65 67 49 74 65 72 4e 65 78 74 5f 4e 6f 6e 65  SegIterNext_None
d3b0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
d3c0: 49 74 65 72 2d 3e 78 4e 65 78 74 20 3d 20 66 74  Iter->xNext = ft
d3d0: 73 35 53 65 67 49 74 65 72 4e 65 78 74 3b 0a 20  s5SegIterNext;. 
d3e0: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74   }.}../*.** Init
d3f0: 69 61 6c 69 7a 65 20 74 68 65 20 69 74 65 72 61  ialize the itera
d400: 74 6f 72 20 6f 62 6a 65 63 74 20 70 49 74 65 72  tor object pIter
d410: 20 74 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f   to iterate thro
d420: 75 67 68 20 74 68 65 20 65 6e 74 72 69 65 73 20  ugh the entries 
d430: 69 6e 0a 2a 2a 20 73 65 67 6d 65 6e 74 20 70 53  in.** segment pS
d440: 65 67 2e 20 54 68 65 20 69 74 65 72 61 74 6f 72  eg. The iterator
d450: 20 69 73 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e   is left pointin
d460: 67 20 74 6f 20 74 68 65 20 66 69 72 73 74 20 65  g to the first e
d470: 6e 74 72 79 20 77 68 65 6e 20 0a 2a 2a 20 74 68  ntry when .** th
d480: 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75  is function retu
d490: 72 6e 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  rns..**.** If an
d4a0: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 46   error occurs, F
d4b0: 74 73 35 49 6e 64 65 78 2e 72 63 20 69 73 20 73  ts5Index.rc is s
d4c0: 65 74 20 74 6f 20 61 6e 20 61 70 70 72 6f 70 72  et to an appropr
d4d0: 69 61 74 65 20 65 72 72 6f 72 20 63 6f 64 65 2e  iate error code.
d4e0: 20 49 66 20 0a 2a 2a 20 61 6e 20 65 72 72 6f 72   If .** an error
d4f0: 20 68 61 73 20 61 6c 72 65 61 64 79 20 6f 63 63   has already occ
d500: 75 72 72 65 64 20 77 68 65 6e 20 74 68 69 73 20  urred when this 
d510: 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
d520: 65 64 2c 20 69 74 20 69 73 20 61 20 6e 6f 2d 6f  ed, it is a no-o
d530: 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  p..*/.static voi
d540: 64 20 66 74 73 35 53 65 67 49 74 65 72 49 6e 69  d fts5SegIterIni
d550: 74 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a  t(.  Fts5Index *
d560: 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
d570: 20 20 20 20 20 2f 2a 20 46 54 53 20 69 6e 64 65       /* FTS inde
d580: 78 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 46 74  x object */.  Ft
d590: 73 35 53 74 72 75 63 74 75 72 65 53 65 67 6d 65  s5StructureSegme
d5a0: 6e 74 20 2a 70 53 65 67 2c 20 20 20 20 20 2f 2a  nt *pSeg,     /*
d5b0: 20 44 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20   Description of 
d5c0: 73 65 67 6d 65 6e 74 20 2a 2f 0a 20 20 46 74 73  segment */.  Fts
d5d0: 35 53 65 67 49 74 65 72 20 2a 70 49 74 65 72 20  5SegIter *pIter 
d5e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
d5f0: 4f 62 6a 65 63 74 20 74 6f 20 70 6f 70 75 6c 61  Object to popula
d600: 74 65 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 70  te */.){.  if( p
d610: 53 65 67 2d 3e 70 67 6e 6f 46 69 72 73 74 3d 3d  Seg->pgnoFirst==
d620: 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73  0 ){.    /* This
d630: 20 68 61 70 70 65 6e 73 20 69 66 20 74 68 65 20   happens if the 
d640: 73 65 67 6d 65 6e 74 20 69 73 20 62 65 69 6e 67  segment is being
d650: 20 75 73 65 64 20 61 73 20 61 6e 20 69 6e 70 75   used as an inpu
d660: 74 20 74 6f 20 61 6e 20 69 6e 63 72 65 6d 65 6e  t to an incremen
d670: 74 61 6c 0a 20 20 20 20 2a 2a 20 6d 65 72 67 65  tal.    ** merge
d680: 20 61 6e 64 20 61 6c 6c 20 64 61 74 61 20 68 61   and all data ha
d690: 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 22  s already been "
d6a0: 74 72 69 6d 6d 65 64 22 2e 20 53 65 65 20 66 75  trimmed". See fu
d6b0: 6e 63 74 69 6f 6e 0a 20 20 20 20 2a 2a 20 66 74  nction.    ** ft
d6c0: 73 35 54 72 69 6d 53 65 67 6d 65 6e 74 73 28 29  s5TrimSegments()
d6d0: 20 66 6f 72 20 64 65 74 61 69 6c 73 2e 20 49 6e   for details. In
d6e0: 20 74 68 69 73 20 63 61 73 65 20 6c 65 61 76 65   this case leave
d6f0: 20 74 68 65 20 69 74 65 72 61 74 6f 72 20 65 6d   the iterator em
d700: 70 74 79 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20  pty..    ** The 
d710: 63 61 6c 6c 65 72 20 77 69 6c 6c 20 73 65 65 20  caller will see 
d720: 74 68 65 20 28 70 49 74 65 72 2d 3e 70 4c 65 61  the (pIter->pLea
d730: 66 3d 3d 30 29 20 61 6e 64 20 61 73 73 75 6d 65  f==0) and assume
d740: 20 74 68 65 20 69 74 65 72 61 74 6f 72 20 69 73   the iterator is
d750: 0a 20 20 20 20 2a 2a 20 61 74 20 45 4f 46 20 61  .    ** at EOF a
d760: 6c 72 65 61 64 79 2e 20 2a 2f 0a 20 20 20 20 61  lready. */.    a
d770: 73 73 65 72 74 28 20 70 49 74 65 72 2d 3e 70 4c  ssert( pIter->pL
d780: 65 61 66 3d 3d 30 20 29 3b 0a 20 20 20 20 72 65  eaf==0 );.    re
d790: 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  turn;.  }..  if(
d7a0: 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
d7b0: 4b 20 29 7b 0a 20 20 20 20 6d 65 6d 73 65 74 28  K ){.    memset(
d7c0: 70 49 74 65 72 2c 20 30 2c 20 73 69 7a 65 6f 66  pIter, 0, sizeof
d7d0: 28 2a 70 49 74 65 72 29 29 3b 0a 20 20 20 20 66  (*pIter));.    f
d7e0: 74 73 35 53 65 67 49 74 65 72 53 65 74 4e 65 78  ts5SegIterSetNex
d7f0: 74 28 70 2c 20 70 49 74 65 72 29 3b 0a 20 20 20  t(p, pIter);.   
d800: 20 70 49 74 65 72 2d 3e 70 53 65 67 20 3d 20 70   pIter->pSeg = p
d810: 53 65 67 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e  Seg;.    pIter->
d820: 69 4c 65 61 66 50 67 6e 6f 20 3d 20 70 53 65 67  iLeafPgno = pSeg
d830: 2d 3e 70 67 6e 6f 46 69 72 73 74 2d 31 3b 0a 20  ->pgnoFirst-1;. 
d840: 20 20 20 66 74 73 35 53 65 67 49 74 65 72 4e 65     fts5SegIterNe
d850: 78 74 50 61 67 65 28 70 2c 20 70 49 74 65 72 29  xtPage(p, pIter)
d860: 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 2d 3e  ;.  }..  if( p->
d870: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
d880: 0a 20 20 20 20 70 49 74 65 72 2d 3e 69 4c 65 61  .    pIter->iLea
d890: 66 4f 66 66 73 65 74 20 3d 20 34 3b 0a 20 20 20  fOffset = 4;.   
d8a0: 20 61 73 73 65 72 74 5f 6e 63 28 20 70 49 74 65   assert_nc( pIte
d8b0: 72 2d 3e 70 4c 65 61 66 2d 3e 6e 6e 3e 34 20 29  r->pLeaf->nn>4 )
d8c0: 3b 0a 20 20 20 20 61 73 73 65 72 74 5f 6e 63 28  ;.    assert_nc(
d8d0: 20 66 74 73 35 4c 65 61 66 46 69 72 73 74 54 65   fts5LeafFirstTe
d8e0: 72 6d 4f 66 66 28 70 49 74 65 72 2d 3e 70 4c 65  rmOff(pIter->pLe
d8f0: 61 66 29 3d 3d 34 20 29 3b 0a 20 20 20 20 70 49  af)==4 );.    pI
d900: 74 65 72 2d 3e 69 50 67 69 64 78 4f 66 66 20 3d  ter->iPgidxOff =
d910: 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 73   pIter->pLeaf->s
d920: 7a 4c 65 61 66 2b 31 3b 0a 20 20 20 20 66 74 73  zLeaf+1;.    fts
d930: 35 53 65 67 49 74 65 72 4c 6f 61 64 54 65 72 6d  5SegIterLoadTerm
d940: 28 70 2c 20 70 49 74 65 72 2c 20 30 29 3b 0a 20  (p, pIter, 0);. 
d950: 20 20 20 66 74 73 35 53 65 67 49 74 65 72 4c 6f     fts5SegIterLo
d960: 61 64 4e 50 6f 73 28 70 2c 20 70 49 74 65 72 29  adNPos(p, pIter)
d970: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  ;.  }.}../*.** T
d980: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
d990: 6f 6e 6c 79 20 65 76 65 72 20 63 61 6c 6c 65 64  only ever called
d9a0: 20 6f 6e 20 69 74 65 72 61 74 6f 72 73 20 63 72   on iterators cr
d9b0: 65 61 74 65 64 20 62 79 20 63 61 6c 6c 73 20 74  eated by calls t
d9c0: 6f 0a 2a 2a 20 46 74 73 35 49 6e 64 65 78 51 75  o.** Fts5IndexQu
d9d0: 65 72 79 28 29 20 77 69 74 68 20 74 68 65 20 46  ery() with the F
d9e0: 54 53 35 49 4e 44 45 58 5f 51 55 45 52 59 5f 44  TS5INDEX_QUERY_D
d9f0: 45 53 43 20 66 6c 61 67 20 73 65 74 2e 0a 2a 2a  ESC flag set..**
da00: 0a 2a 2a 20 54 68 65 20 69 74 65 72 61 74 6f 72  .** The iterator
da10: 20 69 73 20 69 6e 20 61 6e 20 75 6e 75 73 75 61   is in an unusua
da20: 6c 20 73 74 61 74 65 20 77 68 65 6e 20 74 68 69  l state when thi
da30: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
da40: 6c 6c 65 64 3a 20 74 68 65 0a 2a 2a 20 46 74 73  lled: the.** Fts
da50: 35 53 65 67 49 74 65 72 2e 69 4c 65 61 66 4f 66  5SegIter.iLeafOf
da60: 66 73 65 74 20 76 61 72 69 61 62 6c 65 20 69 73  fset variable is
da70: 20 73 65 74 20 74 6f 20 74 68 65 20 6f 66 66 73   set to the offs
da80: 65 74 20 6f 66 20 74 68 65 20 73 74 61 72 74 20  et of the start 
da90: 6f 66 0a 2a 2a 20 74 68 65 20 70 6f 73 69 74 69  of.** the positi
daa0: 6f 6e 2d 6c 69 73 74 20 73 69 7a 65 20 66 69 65  on-list size fie
dab0: 6c 64 20 66 6f 72 20 74 68 65 20 66 69 72 73 74  ld for the first
dac0: 20 72 65 6c 65 76 61 6e 74 20 72 6f 77 69 64 20   relevant rowid 
dad0: 6f 6e 20 74 68 65 20 70 61 67 65 2e 0a 2a 2a 20  on the page..** 
dae0: 46 74 73 35 53 65 67 49 74 65 72 2e 72 6f 77 69  Fts5SegIter.rowi
daf0: 64 20 69 73 20 73 65 74 2c 20 62 75 74 20 6e 50  d is set, but nP
db00: 6f 73 20 61 6e 64 20 62 44 65 6c 20 61 72 65 20  os and bDel are 
db10: 6e 6f 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  not..**.** This 
db20: 66 75 6e 63 74 69 6f 6e 20 61 64 76 61 6e 63 65  function advance
db30: 73 20 74 68 65 20 69 74 65 72 61 74 6f 72 20 73  s the iterator s
db40: 6f 20 74 68 61 74 20 69 74 20 70 6f 69 6e 74 73  o that it points
db50: 20 74 6f 20 74 68 65 20 6c 61 73 74 20 0a 2a 2a   to the last .**
db60: 20 72 65 6c 65 76 61 6e 74 20 72 6f 77 69 64 20   relevant rowid 
db70: 6f 6e 20 74 68 65 20 70 61 67 65 20 61 6e 64 2c  on the page and,
db80: 20 69 66 20 6e 65 63 65 73 73 61 72 79 2c 20 69   if necessary, i
db90: 6e 69 74 69 61 6c 69 7a 65 73 20 74 68 65 20 0a  nitializes the .
dba0: 2a 2a 20 61 52 6f 77 69 64 4f 66 66 73 65 74 5b  ** aRowidOffset[
dbb0: 5d 20 61 6e 64 20 69 52 6f 77 69 64 4f 66 66 73  ] and iRowidOffs
dbc0: 65 74 20 76 61 72 69 61 62 6c 65 73 2e 20 41 74  et variables. At
dbd0: 20 74 68 69 73 20 70 6f 69 6e 74 20 74 68 65 20   this point the 
dbe0: 69 74 65 72 61 74 6f 72 0a 2a 2a 20 69 73 20 69  iterator.** is i
dbf0: 6e 20 69 74 73 20 72 65 67 75 6c 61 72 20 73 74  n its regular st
dc00: 61 74 65 20 2d 20 46 74 73 35 53 65 67 49 74 65  ate - Fts5SegIte
dc10: 72 2e 69 4c 65 61 66 4f 66 66 73 65 74 20 70 6f  r.iLeafOffset po
dc20: 69 6e 74 73 20 74 6f 20 74 68 65 20 66 69 72 73  ints to the firs
dc30: 74 0a 2a 2a 20 62 79 74 65 20 6f 66 20 74 68 65  t.** byte of the
dc40: 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74 20 63   position list c
dc50: 6f 6e 74 65 6e 74 20 61 73 73 6f 63 69 61 74 65  ontent associate
dc60: 64 20 77 69 74 68 20 73 61 69 64 20 72 6f 77 69  d with said rowi
dc70: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  d..*/.static voi
dc80: 64 20 66 74 73 35 53 65 67 49 74 65 72 52 65 76  d fts5SegIterRev
dc90: 65 72 73 65 49 6e 69 74 50 61 67 65 28 46 74 73  erseInitPage(Fts
dca0: 35 49 6e 64 65 78 20 2a 70 2c 20 46 74 73 35 53  5Index *p, Fts5S
dcb0: 65 67 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a  egIter *pIter){.
dcc0: 20 20 69 6e 74 20 65 44 65 74 61 69 6c 20 3d 20    int eDetail = 
dcd0: 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e 65 44 65 74  p->pConfig->eDet
dce0: 61 69 6c 3b 0a 20 20 69 6e 74 20 6e 20 3d 20 70  ail;.  int n = p
dcf0: 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 73 7a 4c  Iter->pLeaf->szL
dd00: 65 61 66 3b 0a 20 20 69 6e 74 20 69 20 3d 20 70  eaf;.  int i = p
dd10: 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65  Iter->iLeafOffse
dd20: 74 3b 0a 20 20 75 38 20 2a 61 20 3d 20 70 49 74  t;.  u8 *a = pIt
dd30: 65 72 2d 3e 70 4c 65 61 66 2d 3e 70 3b 0a 20 20  er->pLeaf->p;.  
dd40: 69 6e 74 20 69 52 6f 77 69 64 4f 66 66 73 65 74  int iRowidOffset
dd50: 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20 6e 3e 70   = 0;..  if( n>p
dd60: 49 74 65 72 2d 3e 69 45 6e 64 6f 66 44 6f 63 6c  Iter->iEndofDocl
dd70: 69 73 74 20 29 7b 0a 20 20 20 20 6e 20 3d 20 70  ist ){.    n = p
dd80: 49 74 65 72 2d 3e 69 45 6e 64 6f 66 44 6f 63 6c  Iter->iEndofDocl
dd90: 69 73 74 3b 0a 20 20 7d 0a 0a 20 20 41 53 53 45  ist;.  }..  ASSE
dda0: 52 54 5f 53 5a 4c 45 41 46 5f 4f 4b 28 70 49 74  RT_SZLEAF_OK(pIt
ddb0: 65 72 2d 3e 70 4c 65 61 66 29 3b 0a 20 20 77 68  er->pLeaf);.  wh
ddc0: 69 6c 65 28 20 31 20 29 7b 0a 20 20 20 20 69 36  ile( 1 ){.    i6
ddd0: 34 20 69 44 65 6c 74 61 20 3d 20 30 3b 0a 0a 20  4 iDelta = 0;.. 
dde0: 20 20 20 69 66 28 20 65 44 65 74 61 69 6c 3d 3d     if( eDetail==
ddf0: 46 54 53 35 5f 44 45 54 41 49 4c 5f 4e 4f 4e 45  FTS5_DETAIL_NONE
de00: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 74 6f 64   ){.      /* tod
de10: 6f 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 69  o */.      if( i
de20: 3c 6e 20 26 26 20 61 5b 69 5d 3d 3d 30 20 29 7b  <n && a[i]==0 ){
de30: 0a 20 20 20 20 20 20 20 20 69 2b 2b 3b 0a 20 20  .        i++;.  
de40: 20 20 20 20 20 20 69 66 28 20 69 3c 6e 20 26 26        if( i<n &&
de50: 20 61 5b 69 5d 3d 3d 30 20 29 20 69 2b 2b 3b 0a   a[i]==0 ) i++;.
de60: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
de70: 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 50 6f  e{.      int nPo
de80: 73 3b 0a 20 20 20 20 20 20 69 6e 74 20 62 44 75  s;.      int bDu
de90: 6d 6d 79 3b 0a 20 20 20 20 20 20 69 20 2b 3d 20  mmy;.      i += 
dea0: 66 74 73 35 47 65 74 50 6f 73 6c 69 73 74 53 69  fts5GetPoslistSi
deb0: 7a 65 28 26 61 5b 69 5d 2c 20 26 6e 50 6f 73 2c  ze(&a[i], &nPos,
dec0: 20 26 62 44 75 6d 6d 79 29 3b 0a 20 20 20 20 20   &bDummy);.     
ded0: 20 69 20 2b 3d 20 6e 50 6f 73 3b 0a 20 20 20 20   i += nPos;.    
dee0: 7d 0a 20 20 20 20 69 66 28 20 69 3e 3d 6e 20 29  }.    if( i>=n )
def0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 69 20 2b 3d   break;.    i +=
df00: 20 66 74 73 35 47 65 74 56 61 72 69 6e 74 28 26   fts5GetVarint(&
df10: 61 5b 69 5d 2c 20 28 75 36 34 2a 29 26 69 44 65  a[i], (u64*)&iDe
df20: 6c 74 61 29 3b 0a 20 20 20 20 70 49 74 65 72 2d  lta);.    pIter-
df30: 3e 69 52 6f 77 69 64 20 2b 3d 20 69 44 65 6c 74  >iRowid += iDelt
df40: 61 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 6e 65  a;..    /* If ne
df50: 63 65 73 73 61 72 79 2c 20 67 72 6f 77 20 74 68  cessary, grow th
df60: 65 20 70 49 74 65 72 2d 3e 61 52 6f 77 69 64 4f  e pIter->aRowidO
df70: 66 66 73 65 74 5b 5d 20 61 72 72 61 79 2e 20 2a  ffset[] array. *
df80: 2f 0a 20 20 20 20 69 66 28 20 69 52 6f 77 69 64  /.    if( iRowid
df90: 4f 66 66 73 65 74 3e 3d 70 49 74 65 72 2d 3e 6e  Offset>=pIter->n
dfa0: 52 6f 77 69 64 4f 66 66 73 65 74 20 29 7b 0a 20  RowidOffset ){. 
dfb0: 20 20 20 20 20 69 6e 74 20 6e 4e 65 77 20 3d 20       int nNew = 
dfc0: 70 49 74 65 72 2d 3e 6e 52 6f 77 69 64 4f 66 66  pIter->nRowidOff
dfd0: 73 65 74 20 2b 20 38 3b 0a 20 20 20 20 20 20 69  set + 8;.      i
dfe0: 6e 74 20 2a 61 4e 65 77 20 3d 20 28 69 6e 74 2a  nt *aNew = (int*
dff0: 29 73 71 6c 69 74 65 33 5f 72 65 61 6c 6c 6f 63  )sqlite3_realloc
e000: 36 34 28 70 49 74 65 72 2d 3e 61 52 6f 77 69 64  64(pIter->aRowid
e010: 4f 66 66 73 65 74 2c 6e 4e 65 77 2a 73 69 7a 65  Offset,nNew*size
e020: 6f 66 28 69 6e 74 29 29 3b 0a 20 20 20 20 20 20  of(int));.      
e030: 69 66 28 20 61 4e 65 77 3d 3d 30 20 29 7b 0a 20  if( aNew==0 ){. 
e040: 20 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 53         p->rc = S
e050: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
e060: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
e070: 20 20 7d 0a 20 20 20 20 20 20 70 49 74 65 72 2d    }.      pIter-
e080: 3e 61 52 6f 77 69 64 4f 66 66 73 65 74 20 3d 20  >aRowidOffset = 
e090: 61 4e 65 77 3b 0a 20 20 20 20 20 20 70 49 74 65  aNew;.      pIte
e0a0: 72 2d 3e 6e 52 6f 77 69 64 4f 66 66 73 65 74 20  r->nRowidOffset 
e0b0: 3d 20 6e 4e 65 77 3b 0a 20 20 20 20 7d 0a 0a 20  = nNew;.    }.. 
e0c0: 20 20 20 70 49 74 65 72 2d 3e 61 52 6f 77 69 64     pIter->aRowid
e0d0: 4f 66 66 73 65 74 5b 69 52 6f 77 69 64 4f 66 66  Offset[iRowidOff
e0e0: 73 65 74 2b 2b 5d 20 3d 20 70 49 74 65 72 2d 3e  set++] = pIter->
e0f0: 69 4c 65 61 66 4f 66 66 73 65 74 3b 0a 20 20 20  iLeafOffset;.   
e100: 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66   pIter->iLeafOff
e110: 73 65 74 20 3d 20 69 3b 0a 20 20 7d 0a 20 20 70  set = i;.  }.  p
e120: 49 74 65 72 2d 3e 69 52 6f 77 69 64 4f 66 66 73  Iter->iRowidOffs
e130: 65 74 20 3d 20 69 52 6f 77 69 64 4f 66 66 73 65  et = iRowidOffse
e140: 74 3b 0a 20 20 66 74 73 35 53 65 67 49 74 65 72  t;.  fts5SegIter
e150: 4c 6f 61 64 4e 50 6f 73 28 70 2c 20 70 49 74 65  LoadNPos(p, pIte
e160: 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 0a 2a 2f 0a  r);.}../*.**.*/.
e170: 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
e180: 53 65 67 49 74 65 72 52 65 76 65 72 73 65 4e 65  SegIterReverseNe
e190: 77 50 61 67 65 28 46 74 73 35 49 6e 64 65 78 20  wPage(Fts5Index 
e1a0: 2a 70 2c 20 46 74 73 35 53 65 67 49 74 65 72 20  *p, Fts5SegIter 
e1b0: 2a 70 49 74 65 72 29 7b 0a 20 20 61 73 73 65 72  *pIter){.  asser
e1c0: 74 28 20 70 49 74 65 72 2d 3e 66 6c 61 67 73 20  t( pIter->flags 
e1d0: 26 20 46 54 53 35 5f 53 45 47 49 54 45 52 5f 52  & FTS5_SEGITER_R
e1e0: 45 56 45 52 53 45 20 29 3b 0a 20 20 61 73 73 65  EVERSE );.  asse
e1f0: 72 74 28 20 70 49 74 65 72 2d 3e 66 6c 61 67 73  rt( pIter->flags
e200: 20 26 20 46 54 53 35 5f 53 45 47 49 54 45 52 5f   & FTS5_SEGITER_
e210: 4f 4e 45 54 45 52 4d 20 29 3b 0a 0a 20 20 66 74  ONETERM );..  ft
e220: 73 35 44 61 74 61 52 65 6c 65 61 73 65 28 70 49  s5DataRelease(pI
e230: 74 65 72 2d 3e 70 4c 65 61 66 29 3b 0a 20 20 70  ter->pLeaf);.  p
e240: 49 74 65 72 2d 3e 70 4c 65 61 66 20 3d 20 30 3b  Iter->pLeaf = 0;
e250: 0a 20 20 77 68 69 6c 65 28 20 70 2d 3e 72 63 3d  .  while( p->rc=
e260: 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 49  =SQLITE_OK && pI
e270: 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 3e 70  ter->iLeafPgno>p
e280: 49 74 65 72 2d 3e 69 54 65 72 6d 4c 65 61 66 50  Iter->iTermLeafP
e290: 67 6e 6f 20 29 7b 0a 20 20 20 20 46 74 73 35 44  gno ){.    Fts5D
e2a0: 61 74 61 20 2a 70 4e 65 77 3b 0a 20 20 20 20 70  ata *pNew;.    p
e2b0: 49 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 2d  Iter->iLeafPgno-
e2c0: 2d 3b 0a 20 20 20 20 70 4e 65 77 20 3d 20 66 74  -;.    pNew = ft
e2d0: 73 35 44 61 74 61 52 65 61 64 28 70 2c 20 46 54  s5DataRead(p, FT
e2e0: 53 35 5f 53 45 47 4d 45 4e 54 5f 52 4f 57 49 44  S5_SEGMENT_ROWID
e2f0: 28 0a 20 20 20 20 20 20 20 20 20 20 70 49 74 65  (.          pIte
e300: 72 2d 3e 70 53 65 67 2d 3e 69 53 65 67 69 64 2c  r->pSeg->iSegid,
e310: 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e   pIter->iLeafPgn
e320: 6f 0a 20 20 20 20 29 29 3b 0a 20 20 20 20 69 66  o.    ));.    if
e330: 28 20 70 4e 65 77 20 29 7b 0a 20 20 20 20 20 20  ( pNew ){.      
e340: 2f 2a 20 69 54 65 72 6d 4c 65 61 66 4f 66 66 73  /* iTermLeafOffs
e350: 65 74 20 6d 61 79 20 62 65 20 65 71 75 61 6c 20  et may be equal 
e360: 74 6f 20 73 7a 4c 65 61 66 20 69 66 20 74 68 65  to szLeaf if the
e370: 20 74 65 72 6d 20 69 73 20 74 68 65 20 6c 61 73   term is the las
e380: 74 0a 20 20 20 20 20 20 2a 2a 20 74 68 69 6e 67  t.      ** thing
e390: 20 6f 6e 20 74 68 65 20 70 61 67 65 20 2d 20 69   on the page - i
e3a0: 2e 65 2e 20 74 68 65 20 66 69 72 73 74 20 72 6f  .e. the first ro
e3b0: 77 69 64 20 69 73 20 6f 6e 20 74 68 65 20 66 6f  wid is on the fo
e3c0: 6c 6c 6f 77 69 6e 67 20 70 61 67 65 2e 0a 20 20  llowing page..  
e3d0: 20 20 20 20 2a 2a 20 49 6e 20 74 68 69 73 20 63      ** In this c
e3e0: 61 73 65 20 6c 65 61 76 65 20 70 49 74 65 72 2d  ase leave pIter-
e3f0: 3e 70 4c 65 61 66 3d 3d 30 2c 20 74 68 69 73 20  >pLeaf==0, this 
e400: 69 74 65 72 61 74 6f 72 20 69 73 20 61 74 20 45  iterator is at E
e410: 4f 46 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66 28  OF. */.      if(
e420: 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e   pIter->iLeafPgn
e430: 6f 3d 3d 70 49 74 65 72 2d 3e 69 54 65 72 6d 4c  o==pIter->iTermL
e440: 65 61 66 50 67 6e 6f 20 29 7b 0a 20 20 20 20 20  eafPgno ){.     
e450: 20 20 20 61 73 73 65 72 74 28 20 70 49 74 65 72     assert( pIter
e460: 2d 3e 70 4c 65 61 66 3d 3d 30 20 29 3b 0a 20 20  ->pLeaf==0 );.  
e470: 20 20 20 20 20 20 69 66 28 20 70 49 74 65 72 2d        if( pIter-
e480: 3e 69 54 65 72 6d 4c 65 61 66 4f 66 66 73 65 74  >iTermLeafOffset
e490: 3c 70 4e 65 77 2d 3e 73 7a 4c 65 61 66 20 29 7b  <pNew->szLeaf ){
e4a0: 0a 20 20 20 20 20 20 20 20 20 20 70 49 74 65 72  .          pIter
e4b0: 2d 3e 70 4c 65 61 66 20 3d 20 70 4e 65 77 3b 0a  ->pLeaf = pNew;.
e4c0: 20 20 20 20 20 20 20 20 20 20 70 49 74 65 72 2d            pIter-
e4d0: 3e 69 4c 65 61 66 4f 66 66 73 65 74 20 3d 20 70  >iLeafOffset = p
e4e0: 49 74 65 72 2d 3e 69 54 65 72 6d 4c 65 61 66 4f  Iter->iTermLeafO
e4f0: 66 66 73 65 74 3b 0a 20 20 20 20 20 20 20 20 7d  ffset;.        }
e500: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
e510: 20 20 20 20 20 20 69 6e 74 20 69 52 6f 77 69 64        int iRowid
e520: 4f 66 66 3b 0a 20 20 20 20 20 20 20 20 69 52 6f  Off;.        iRo
e530: 77 69 64 4f 66 66 20 3d 20 66 74 73 35 4c 65 61  widOff = fts5Lea
e540: 66 46 69 72 73 74 52 6f 77 69 64 4f 66 66 28 70  fFirstRowidOff(p
e550: 4e 65 77 29 3b 0a 20 20 20 20 20 20 20 20 69 66  New);.        if
e560: 28 20 69 52 6f 77 69 64 4f 66 66 20 29 7b 0a 20  ( iRowidOff ){. 
e570: 20 20 20 20 20 20 20 20 20 70 49 74 65 72 2d 3e           pIter->
e580: 70 4c 65 61 66 20 3d 20 70 4e 65 77 3b 0a 20 20  pLeaf = pNew;.  
e590: 20 20 20 20 20 20 20 20 70 49 74 65 72 2d 3e 69          pIter->i
e5a0: 4c 65 61 66 4f 66 66 73 65 74 20 3d 20 69 52 6f  LeafOffset = iRo
e5b0: 77 69 64 4f 66 66 3b 0a 20 20 20 20 20 20 20 20  widOff;.        
e5c0: 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  }.      }..     
e5d0: 20 69 66 28 20 70 49 74 65 72 2d 3e 70 4c 65 61   if( pIter->pLea
e5e0: 66 20 29 7b 0a 20 20 20 20 20 20 20 20 75 38 20  f ){.        u8 
e5f0: 2a 61 20 3d 20 26 70 49 74 65 72 2d 3e 70 4c 65  *a = &pIter->pLe
e600: 61 66 2d 3e 70 5b 70 49 74 65 72 2d 3e 69 4c 65  af->p[pIter->iLe
e610: 61 66 4f 66 66 73 65 74 5d 3b 0a 20 20 20 20 20  afOffset];.     
e620: 20 20 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f     pIter->iLeafO
e630: 66 66 73 65 74 20 2b 3d 20 66 74 73 35 47 65 74  ffset += fts5Get
e640: 56 61 72 69 6e 74 28 61 2c 20 28 75 36 34 2a 29  Varint(a, (u64*)
e650: 26 70 49 74 65 72 2d 3e 69 52 6f 77 69 64 29 3b  &pIter->iRowid);
e660: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
e670: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
e680: 20 20 20 20 20 66 74 73 35 44 61 74 61 52 65 6c       fts5DataRel
e690: 65 61 73 65 28 70 4e 65 77 29 3b 0a 20 20 20 20  ease(pNew);.    
e6a0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
e6b0: 20 69 66 28 20 70 49 74 65 72 2d 3e 70 4c 65 61   if( pIter->pLea
e6c0: 66 20 29 7b 0a 20 20 20 20 70 49 74 65 72 2d 3e  f ){.    pIter->
e6d0: 69 45 6e 64 6f 66 44 6f 63 6c 69 73 74 20 3d 20  iEndofDoclist = 
e6e0: 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 6e 6e  pIter->pLeaf->nn
e6f0: 2b 31 3b 0a 20 20 20 20 66 74 73 35 53 65 67 49  +1;.    fts5SegI
e700: 74 65 72 52 65 76 65 72 73 65 49 6e 69 74 50 61  terReverseInitPa
e710: 67 65 28 70 2c 20 70 49 74 65 72 29 3b 0a 20 20  ge(p, pIter);.  
e720: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  }.}../*.** Retur
e730: 6e 20 74 72 75 65 20 69 66 20 74 68 65 20 69 74  n true if the it
e740: 65 72 61 74 6f 72 20 70 61 73 73 65 64 20 61 73  erator passed as
e750: 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
e760: 6d 65 6e 74 20 63 75 72 72 65 6e 74 6c 79 0a 2a  ment currently.*
e770: 2a 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 64 65  * points to a de
e780: 6c 65 74 65 20 6d 61 72 6b 65 72 2e 20 41 20 64  lete marker. A d
e790: 65 6c 65 74 65 20 6d 61 72 6b 65 72 20 69 73 20  elete marker is 
e7a0: 61 6e 20 65 6e 74 72 79 20 77 69 74 68 20 61 20  an entry with a 
e7b0: 30 20 62 79 74 65 0a 2a 2a 20 70 6f 73 69 74 69  0 byte.** positi
e7c0: 6f 6e 2d 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61 74  on-list..*/.stat
e7d0: 69 63 20 69 6e 74 20 66 74 73 35 4d 75 6c 74 69  ic int fts5Multi
e7e0: 49 74 65 72 49 73 45 6d 70 74 79 28 46 74 73 35  IterIsEmpty(Fts5
e7f0: 49 6e 64 65 78 20 2a 70 2c 20 46 74 73 35 49 74  Index *p, Fts5It
e800: 65 72 20 2a 70 49 74 65 72 29 7b 0a 20 20 46 74  er *pIter){.  Ft
e810: 73 35 53 65 67 49 74 65 72 20 2a 70 53 65 67 20  s5SegIter *pSeg 
e820: 3d 20 26 70 49 74 65 72 2d 3e 61 53 65 67 5b 70  = &pIter->aSeg[p
e830: 49 74 65 72 2d 3e 61 46 69 72 73 74 5b 31 5d 2e  Iter->aFirst[1].
e840: 69 46 69 72 73 74 5d 3b 0a 20 20 72 65 74 75 72  iFirst];.  retur
e850: 6e 20 28 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  n (p->rc==SQLITE
e860: 5f 4f 4b 20 26 26 20 70 53 65 67 2d 3e 70 4c 65  _OK && pSeg->pLe
e870: 61 66 20 26 26 20 70 53 65 67 2d 3e 6e 50 6f 73  af && pSeg->nPos
e880: 3d 3d 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  ==0);.}../*.** A
e890: 64 76 61 6e 63 65 20 69 74 65 72 61 74 6f 72 20  dvance iterator 
e8a0: 70 49 74 65 72 20 74 6f 20 74 68 65 20 6e 65 78  pIter to the nex
e8b0: 74 20 65 6e 74 72 79 2e 0a 2a 2a 0a 2a 2a 20 54  t entry..**.** T
e8c0: 68 69 73 20 76 65 72 73 69 6f 6e 20 6f 66 20 66  his version of f
e8d0: 74 73 35 53 65 67 49 74 65 72 4e 65 78 74 28 29  ts5SegIterNext()
e8e0: 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20 62 79   is only used by
e8f0: 20 72 65 76 65 72 73 65 20 69 74 65 72 61 74 6f   reverse iterato
e900: 72 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  rs..*/.static vo
e910: 69 64 20 66 74 73 35 53 65 67 49 74 65 72 4e 65  id fts5SegIterNe
e920: 78 74 5f 52 65 76 65 72 73 65 28 0a 20 20 46 74  xt_Reverse(.  Ft
e930: 73 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20  s5Index *p,     
e940: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
e950: 20 46 54 53 35 20 62 61 63 6b 65 6e 64 20 6f 62   FTS5 backend ob
e960: 6a 65 63 74 20 2a 2f 0a 20 20 46 74 73 35 53 65  ject */.  Fts5Se
e970: 67 49 74 65 72 20 2a 70 49 74 65 72 2c 20 20 20  gIter *pIter,   
e980: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 74 65            /* Ite
e990: 72 61 74 6f 72 20 74 6f 20 61 64 76 61 6e 63 65  rator to advance
e9a0: 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 62 55 6e 75   */.  int *pbUnu
e9b0: 73 65 64 20 20 20 20 20 20 20 20 20 20 20 20 20  sed             
e9c0: 20 20 20 20 20 20 2f 2a 20 55 6e 75 73 65 64 20        /* Unused 
e9d0: 2a 2f 0a 29 7b 0a 20 20 61 73 73 65 72 74 28 20  */.){.  assert( 
e9e0: 70 49 74 65 72 2d 3e 66 6c 61 67 73 20 26 20 46  pIter->flags & F
e9f0: 54 53 35 5f 53 45 47 49 54 45 52 5f 52 45 56 45  TS5_SEGITER_REVE
ea00: 52 53 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28  RSE );.  assert(
ea10: 20 70 49 74 65 72 2d 3e 70 4e 65 78 74 4c 65 61   pIter->pNextLea
ea20: 66 3d 3d 30 20 29 3b 0a 20 20 55 4e 55 53 45 44  f==0 );.  UNUSED
ea30: 5f 50 41 52 41 4d 28 70 62 55 6e 75 73 65 64 29  _PARAM(pbUnused)
ea40: 3b 0a 0a 20 20 69 66 28 20 70 49 74 65 72 2d 3e  ;..  if( pIter->
ea50: 69 52 6f 77 69 64 4f 66 66 73 65 74 3e 30 20 29  iRowidOffset>0 )
ea60: 7b 0a 20 20 20 20 75 38 20 2a 61 20 3d 20 70 49  {.    u8 *a = pI
ea70: 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 70 3b 0a 20  ter->pLeaf->p;. 
ea80: 20 20 20 69 6e 74 20 69 4f 66 66 3b 0a 20 20 20     int iOff;.   
ea90: 20 69 36 34 20 69 44 65 6c 74 61 3b 0a 0a 20 20   i64 iDelta;..  
eaa0: 20 20 70 49 74 65 72 2d 3e 69 52 6f 77 69 64 4f    pIter->iRowidO
eab0: 66 66 73 65 74 2d 2d 3b 0a 20 20 20 20 70 49 74  ffset--;.    pIt
eac0: 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 20  er->iLeafOffset 
ead0: 3d 20 70 49 74 65 72 2d 3e 61 52 6f 77 69 64 4f  = pIter->aRowidO
eae0: 66 66 73 65 74 5b 70 49 74 65 72 2d 3e 69 52 6f  ffset[pIter->iRo
eaf0: 77 69 64 4f 66 66 73 65 74 5d 3b 0a 20 20 20 20  widOffset];.    
eb00: 66 74 73 35 53 65 67 49 74 65 72 4c 6f 61 64 4e  fts5SegIterLoadN
eb10: 50 6f 73 28 70 2c 20 70 49 74 65 72 29 3b 0a 20  Pos(p, pIter);. 
eb20: 20 20 20 69 4f 66 66 20 3d 20 70 49 74 65 72 2d     iOff = pIter-
eb30: 3e 69 4c 65 61 66 4f 66 66 73 65 74 3b 0a 20 20  >iLeafOffset;.  
eb40: 20 20 69 66 28 20 70 2d 3e 70 43 6f 6e 66 69 67    if( p->pConfig
eb50: 2d 3e 65 44 65 74 61 69 6c 21 3d 46 54 53 35 5f  ->eDetail!=FTS5_
eb60: 44 45 54 41 49 4c 5f 4e 4f 4e 45 20 29 7b 0a 20  DETAIL_NONE ){. 
eb70: 20 20 20 20 20 69 4f 66 66 20 2b 3d 20 70 49 74       iOff += pIt
eb80: 65 72 2d 3e 6e 50 6f 73 3b 0a 20 20 20 20 7d 0a  er->nPos;.    }.
eb90: 20 20 20 20 66 74 73 35 47 65 74 56 61 72 69 6e      fts5GetVarin
eba0: 74 28 26 61 5b 69 4f 66 66 5d 2c 20 28 75 36 34  t(&a[iOff], (u64
ebb0: 2a 29 26 69 44 65 6c 74 61 29 3b 0a 20 20 20 20  *)&iDelta);.    
ebc0: 70 49 74 65 72 2d 3e 69 52 6f 77 69 64 20 2d 3d  pIter->iRowid -=
ebd0: 20 69 44 65 6c 74 61 3b 0a 20 20 7d 65 6c 73 65   iDelta;.  }else
ebe0: 7b 0a 20 20 20 20 66 74 73 35 53 65 67 49 74 65  {.    fts5SegIte
ebf0: 72 52 65 76 65 72 73 65 4e 65 77 50 61 67 65 28  rReverseNewPage(
ec00: 70 2c 20 70 49 74 65 72 29 3b 0a 20 20 7d 0a 7d  p, pIter);.  }.}
ec10: 0a 0a 2f 2a 0a 2a 2a 20 41 64 76 61 6e 63 65 20  ../*.** Advance 
ec20: 69 74 65 72 61 74 6f 72 20 70 49 74 65 72 20 74  iterator pIter t
ec30: 6f 20 74 68 65 20 6e 65 78 74 20 65 6e 74 72 79  o the next entry
ec40: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 76 65 72  ..**.** This ver
ec50: 73 69 6f 6e 20 6f 66 20 66 74 73 35 53 65 67 49  sion of fts5SegI
ec60: 74 65 72 4e 65 78 74 28 29 20 69 73 20 6f 6e 6c  terNext() is onl
ec70: 79 20 75 73 65 64 20 69 66 20 64 65 74 61 69 6c  y used if detail
ec80: 3d 6e 6f 6e 65 20 61 6e 64 20 74 68 65 0a 2a 2a  =none and the.**
ec90: 20 69 74 65 72 61 74 6f 72 20 69 73 20 6e 6f 74   iterator is not
eca0: 20 61 20 72 65 76 65 72 73 65 20 64 69 72 65 63   a reverse direc
ecb0: 74 69 6f 6e 20 69 74 65 72 61 74 6f 72 2e 0a 2a  tion iterator..*
ecc0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  /.static void ft
ecd0: 73 35 53 65 67 49 74 65 72 4e 65 78 74 5f 4e 6f  s5SegIterNext_No
ece0: 6e 65 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20  ne(.  Fts5Index 
ecf0: 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  *p,             
ed00: 20 20 20 20 20 20 2f 2a 20 46 54 53 35 20 62 61        /* FTS5 ba
ed10: 63 6b 65 6e 64 20 6f 62 6a 65 63 74 20 2a 2f 0a  ckend object */.
ed20: 20 20 46 74 73 35 53 65 67 49 74 65 72 20 2a 70    Fts5SegIter *p
ed30: 49 74 65 72 2c 20 20 20 20 20 20 20 20 20 20 20  Iter,           
ed40: 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 74 6f    /* Iterator to
ed50: 20 61 64 76 61 6e 63 65 20 2a 2f 0a 20 20 69 6e   advance */.  in
ed60: 74 20 2a 70 62 4e 65 77 54 65 72 6d 20 20 20 20  t *pbNewTerm    
ed70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
ed80: 20 4f 55 54 3a 20 53 65 74 20 66 6f 72 20 6e 65   OUT: Set for ne
ed90: 77 20 74 65 72 6d 20 2a 2f 0a 29 7b 0a 20 20 69  w term */.){.  i
eda0: 6e 74 20 69 4f 66 66 3b 0a 0a 20 20 61 73 73 65  nt iOff;..  asse
edb0: 72 74 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  rt( p->rc==SQLIT
edc0: 45 5f 4f 4b 20 29 3b 0a 20 20 61 73 73 65 72 74  E_OK );.  assert
edd0: 28 20 28 70 49 74 65 72 2d 3e 66 6c 61 67 73 20  ( (pIter->flags 
ede0: 26 20 46 54 53 35 5f 53 45 47 49 54 45 52 5f 52  & FTS5_SEGITER_R
edf0: 45 56 45 52 53 45 29 3d 3d 30 20 29 3b 0a 20 20  EVERSE)==0 );.  
ee00: 61 73 73 65 72 74 28 20 70 2d 3e 70 43 6f 6e 66  assert( p->pConf
ee10: 69 67 2d 3e 65 44 65 74 61 69 6c 3d 3d 46 54 53  ig->eDetail==FTS
ee20: 35 5f 44 45 54 41 49 4c 5f 4e 4f 4e 45 20 29 3b  5_DETAIL_NONE );
ee30: 0a 0a 20 20 41 53 53 45 52 54 5f 53 5a 4c 45 41  ..  ASSERT_SZLEA
ee40: 46 5f 4f 4b 28 70 49 74 65 72 2d 3e 70 4c 65 61  F_OK(pIter->pLea
ee50: 66 29 3b 0a 20 20 69 4f 66 66 20 3d 20 70 49 74  f);.  iOff = pIt
ee60: 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 3b  er->iLeafOffset;
ee70: 0a 0a 20 20 2f 2a 20 4e 65 78 74 20 65 6e 74 72  ..  /* Next entr
ee80: 79 20 69 73 20 6f 6e 20 74 68 65 20 6e 65 78 74  y is on the next
ee90: 20 70 61 67 65 20 2a 2f 0a 20 20 69 66 28 20 70   page */.  if( p
eea0: 49 74 65 72 2d 3e 70 53 65 67 20 26 26 20 69 4f  Iter->pSeg && iO
eeb0: 66 66 3e 3d 70 49 74 65 72 2d 3e 70 4c 65 61 66  ff>=pIter->pLeaf
eec0: 2d 3e 73 7a 4c 65 61 66 20 29 7b 0a 20 20 20 20  ->szLeaf ){.    
eed0: 66 74 73 35 53 65 67 49 74 65 72 4e 65 78 74 50  fts5SegIterNextP
eee0: 61 67 65 28 70 2c 20 70 49 74 65 72 29 3b 0a 20  age(p, pIter);. 
eef0: 20 20 20 69 66 28 20 70 2d 3e 72 63 20 7c 7c 20     if( p->rc || 
ef00: 70 49 74 65 72 2d 3e 70 4c 65 61 66 3d 3d 30 20  pIter->pLeaf==0 
ef10: 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 70 49  ) return;.    pI
ef20: 74 65 72 2d 3e 69 52 6f 77 69 64 20 3d 20 30 3b  ter->iRowid = 0;
ef30: 0a 20 20 20 20 69 4f 66 66 20 3d 20 34 3b 0a 20  .    iOff = 4;. 
ef40: 20 7d 0a 0a 20 20 69 66 28 20 69 4f 66 66 3c 70   }..  if( iOff<p
ef50: 49 74 65 72 2d 3e 69 45 6e 64 6f 66 44 6f 63 6c  Iter->iEndofDocl
ef60: 69 73 74 20 29 7b 0a 20 20 20 20 2f 2a 20 4e 65  ist ){.    /* Ne
ef70: 78 74 20 65 6e 74 72 79 20 69 73 20 6f 6e 20 74  xt entry is on t
ef80: 68 65 20 63 75 72 72 65 6e 74 20 70 61 67 65 20  he current page 
ef90: 2a 2f 0a 20 20 20 20 69 36 34 20 69 44 65 6c 74  */.    i64 iDelt
efa0: 61 3b 0a 20 20 20 20 69 4f 66 66 20 2b 3d 20 73  a;.    iOff += s
efb0: 71 6c 69 74 65 33 46 74 73 35 47 65 74 56 61 72  qlite3Fts5GetVar
efc0: 69 6e 74 28 26 70 49 74 65 72 2d 3e 70 4c 65 61  int(&pIter->pLea
efd0: 66 2d 3e 70 5b 69 4f 66 66 5d 2c 20 28 75 36 34  f->p[iOff], (u64
efe0: 2a 29 26 69 44 65 6c 74 61 29 3b 0a 20 20 20 20  *)&iDelta);.    
eff0: 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73  pIter->iLeafOffs
f000: 65 74 20 3d 20 69 4f 66 66 3b 0a 20 20 20 20 70  et = iOff;.    p
f010: 49 74 65 72 2d 3e 69 52 6f 77 69 64 20 2b 3d 20  Iter->iRowid += 
f020: 69 44 65 6c 74 61 3b 0a 20 20 7d 65 6c 73 65 20  iDelta;.  }else 
f030: 69 66 28 20 28 70 49 74 65 72 2d 3e 66 6c 61 67  if( (pIter->flag
f040: 73 20 26 20 46 54 53 35 5f 53 45 47 49 54 45 52  s & FTS5_SEGITER
f050: 5f 4f 4e 45 54 45 52 4d 29 3d 3d 30 20 29 7b 0a  _ONETERM)==0 ){.
f060: 20 20 20 20 69 66 28 20 70 49 74 65 72 2d 3e 70      if( pIter->p
f070: 53 65 67 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  Seg ){.      int
f080: 20 6e 4b 65 65 70 20 3d 20 30 3b 0a 20 20 20 20   nKeep = 0;.    
f090: 20 20 69 66 28 20 69 4f 66 66 21 3d 66 74 73 35    if( iOff!=fts5
f0a0: 4c 65 61 66 46 69 72 73 74 54 65 72 6d 4f 66 66  LeafFirstTermOff
f0b0: 28 70 49 74 65 72 2d 3e 70 4c 65 61 66 29 20 29  (pIter->pLeaf) )
f0c0: 7b 0a 20 20 20 20 20 20 20 20 69 4f 66 66 20 2b  {.        iOff +
f0d0: 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e 74 33  = fts5GetVarint3
f0e0: 32 28 26 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d  2(&pIter->pLeaf-
f0f0: 3e 70 5b 69 4f 66 66 5d 2c 20 6e 4b 65 65 70 29  >p[iOff], nKeep)
f100: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
f110: 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73  pIter->iLeafOffs
f120: 65 74 20 3d 20 69 4f 66 66 3b 0a 20 20 20 20 20  et = iOff;.     
f130: 20 66 74 73 35 53 65 67 49 74 65 72 4c 6f 61 64   fts5SegIterLoad
f140: 54 65 72 6d 28 70 2c 20 70 49 74 65 72 2c 20 6e  Term(p, pIter, n
f150: 4b 65 65 70 29 3b 0a 20 20 20 20 7d 65 6c 73 65  Keep);.    }else
f160: 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 75 38  {.      const u8
f170: 20 2a 70 4c 69 73 74 20 3d 20 30 3b 0a 20 20 20   *pList = 0;.   
f180: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
f190: 54 65 72 6d 20 3d 20 30 3b 0a 20 20 20 20 20 20  Term = 0;.      
f1a0: 69 6e 74 20 6e 4c 69 73 74 3b 0a 20 20 20 20 20  int nList;.     
f1b0: 20 73 71 6c 69 74 65 33 46 74 73 35 48 61 73 68   sqlite3Fts5Hash
f1c0: 53 63 61 6e 4e 65 78 74 28 70 2d 3e 70 48 61 73  ScanNext(p->pHas
f1d0: 68 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  h);.      sqlite
f1e0: 33 46 74 73 35 48 61 73 68 53 63 61 6e 45 6e 74  3Fts5HashScanEnt
f1f0: 72 79 28 70 2d 3e 70 48 61 73 68 2c 20 26 7a 54  ry(p->pHash, &zT
f200: 65 72 6d 2c 20 26 70 4c 69 73 74 2c 20 26 6e 4c  erm, &pList, &nL
f210: 69 73 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ist);.      if( 
f220: 70 4c 69 73 74 3d 3d 30 20 29 20 67 6f 74 6f 20  pList==0 ) goto 
f230: 6e 65 78 74 5f 6e 6f 6e 65 5f 65 6f 66 3b 0a 20  next_none_eof;. 
f240: 20 20 20 20 20 70 49 74 65 72 2d 3e 70 4c 65 61       pIter->pLea
f250: 66 2d 3e 70 20 3d 20 28 75 38 2a 29 70 4c 69 73  f->p = (u8*)pLis
f260: 74 3b 0a 20 20 20 20 20 20 70 49 74 65 72 2d 3e  t;.      pIter->
f270: 70 4c 65 61 66 2d 3e 6e 6e 20 3d 20 6e 4c 69 73  pLeaf->nn = nLis
f280: 74 3b 0a 20 20 20 20 20 20 70 49 74 65 72 2d 3e  t;.      pIter->
f290: 70 4c 65 61 66 2d 3e 73 7a 4c 65 61 66 20 3d 20  pLeaf->szLeaf = 
f2a0: 6e 4c 69 73 74 3b 0a 20 20 20 20 20 20 70 49 74  nList;.      pIt
f2b0: 65 72 2d 3e 69 45 6e 64 6f 66 44 6f 63 6c 69 73  er->iEndofDoclis
f2c0: 74 20 3d 20 6e 4c 69 73 74 3b 0a 20 20 20 20 20  t = nList;.     
f2d0: 20 73 71 6c 69 74 65 33 46 74 73 35 42 75 66 66   sqlite3Fts5Buff
f2e0: 65 72 53 65 74 28 26 70 2d 3e 72 63 2c 26 70 49  erSet(&p->rc,&pI
f2f0: 74 65 72 2d 3e 74 65 72 6d 2c 20 28 69 6e 74 29  ter->term, (int)
f300: 73 74 72 6c 65 6e 28 7a 54 65 72 6d 29 2c 20 28  strlen(zTerm), (
f310: 75 38 2a 29 7a 54 65 72 6d 29 3b 0a 20 20 20 20  u8*)zTerm);.    
f320: 20 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66    pIter->iLeafOf
f330: 66 73 65 74 20 3d 20 66 74 73 35 47 65 74 56 61  fset = fts5GetVa
f340: 72 69 6e 74 28 70 4c 69 73 74 2c 20 28 75 36 34  rint(pList, (u64
f350: 2a 29 26 70 49 74 65 72 2d 3e 69 52 6f 77 69 64  *)&pIter->iRowid
f360: 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66  );.    }..    if
f370: 28 20 70 62 4e 65 77 54 65 72 6d 20 29 20 2a 70  ( pbNewTerm ) *p
f380: 62 4e 65 77 54 65 72 6d 20 3d 20 31 3b 0a 20 20  bNewTerm = 1;.  
f390: 7d 65 6c 73 65 7b 0a 20 20 20 20 67 6f 74 6f 20  }else{.    goto 
f3a0: 6e 65 78 74 5f 6e 6f 6e 65 5f 65 6f 66 3b 0a 20  next_none_eof;. 
f3b0: 20 7d 0a 0a 20 20 66 74 73 35 53 65 67 49 74 65   }..  fts5SegIte
f3c0: 72 4c 6f 61 64 4e 50 6f 73 28 70 2c 20 70 49 74  rLoadNPos(p, pIt
f3d0: 65 72 29 3b 0a 0a 20 20 72 65 74 75 72 6e 3b 0a  er);..  return;.
f3e0: 20 6e 65 78 74 5f 6e 6f 6e 65 5f 65 6f 66 3a 0a   next_none_eof:.
f3f0: 20 20 66 74 73 35 44 61 74 61 52 65 6c 65 61 73    fts5DataReleas
f400: 65 28 70 49 74 65 72 2d 3e 70 4c 65 61 66 29 3b  e(pIter->pLeaf);
f410: 0a 20 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 20  .  pIter->pLeaf 
f420: 3d 20 30 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 41  = 0;.}.../*.** A
f430: 64 76 61 6e 63 65 20 69 74 65 72 61 74 6f 72 20  dvance iterator 
f440: 70 49 74 65 72 20 74 6f 20 74 68 65 20 6e 65 78  pIter to the nex
f450: 74 20 65 6e 74 72 79 2e 20 0a 2a 2a 0a 2a 2a 20  t entry. .**.** 
f460: 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
f470: 72 73 2c 20 46 74 73 35 49 6e 64 65 78 2e 72 63  rs, Fts5Index.rc
f480: 20 69 73 20 73 65 74 20 74 6f 20 61 6e 20 61 70   is set to an ap
f490: 70 72 6f 70 72 69 61 74 65 20 65 72 72 6f 72 20  propriate error 
f4a0: 63 6f 64 65 2e 20 49 74 20 0a 2a 2a 20 69 73 20  code. It .** is 
f4b0: 6e 6f 74 20 63 6f 6e 73 69 64 65 72 65 64 20 61  not considered a
f4c0: 6e 20 65 72 72 6f 72 20 69 66 20 74 68 65 20 69  n error if the i
f4d0: 74 65 72 61 74 6f 72 20 72 65 61 63 68 65 73 20  terator reaches 
f4e0: 45 4f 46 2e 20 49 66 20 61 6e 20 65 72 72 6f 72  EOF. If an error
f4f0: 20 68 61 73 20 0a 2a 2a 20 61 6c 72 65 61 64 79   has .** already
f500: 20 6f 63 63 75 72 72 65 64 20 77 68 65 6e 20 74   occurred when t
f510: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
f520: 63 61 6c 6c 65 64 2c 20 69 74 20 69 73 20 61 20  called, it is a 
f530: 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63  no-op..*/.static
f540: 20 76 6f 69 64 20 66 74 73 35 53 65 67 49 74 65   void fts5SegIte
f550: 72 4e 65 78 74 28 0a 20 20 46 74 73 35 49 6e 64  rNext(.  Fts5Ind
f560: 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  ex *p,          
f570: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53 35           /* FTS5
f580: 20 62 61 63 6b 65 6e 64 20 6f 62 6a 65 63 74 20   backend object 
f590: 2a 2f 0a 20 20 46 74 73 35 53 65 67 49 74 65 72  */.  Fts5SegIter
f5a0: 20 2a 70 49 74 65 72 2c 20 20 20 20 20 20 20 20   *pIter,        
f5b0: 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72       /* Iterator
f5c0: 20 74 6f 20 61 64 76 61 6e 63 65 20 2a 2f 0a 20   to advance */. 
f5d0: 20 69 6e 74 20 2a 70 62 4e 65 77 54 65 72 6d 20   int *pbNewTerm 
f5e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f5f0: 20 2f 2a 20 4f 55 54 3a 20 53 65 74 20 66 6f 72   /* OUT: Set for
f600: 20 6e 65 77 20 74 65 72 6d 20 2a 2f 0a 29 7b 0a   new term */.){.
f610: 20 20 46 74 73 35 44 61 74 61 20 2a 70 4c 65 61    Fts5Data *pLea
f620: 66 20 3d 20 70 49 74 65 72 2d 3e 70 4c 65 61 66  f = pIter->pLeaf
f630: 3b 0a 20 20 69 6e 74 20 69 4f 66 66 3b 0a 20 20  ;.  int iOff;.  
f640: 69 6e 74 20 62 4e 65 77 54 65 72 6d 20 3d 20 30  int bNewTerm = 0
f650: 3b 0a 20 20 69 6e 74 20 6e 4b 65 65 70 20 3d 20  ;.  int nKeep = 
f660: 30 3b 0a 20 20 75 38 20 2a 61 3b 0a 20 20 69 6e  0;.  u8 *a;.  in
f670: 74 20 6e 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  t n;..  assert( 
f680: 70 62 4e 65 77 54 65 72 6d 3d 3d 30 20 7c 7c 20  pbNewTerm==0 || 
f690: 2a 70 62 4e 65 77 54 65 72 6d 3d 3d 30 20 29 3b  *pbNewTerm==0 );
f6a0: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 43  .  assert( p->pC
f6b0: 6f 6e 66 69 67 2d 3e 65 44 65 74 61 69 6c 21 3d  onfig->eDetail!=
f6c0: 46 54 53 35 5f 44 45 54 41 49 4c 5f 4e 4f 4e 45  FTS5_DETAIL_NONE
f6d0: 20 29 3b 0a 0a 20 20 2f 2a 20 53 65 61 72 63 68   );..  /* Search
f6e0: 20 66 6f 72 20 74 68 65 20 65 6e 64 20 6f 66 20   for the end of 
f6f0: 74 68 65 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73  the position lis
f700: 74 20 77 69 74 68 69 6e 20 74 68 65 20 63 75 72  t within the cur
f710: 72 65 6e 74 20 70 61 67 65 2e 20 2a 2f 0a 20 20  rent page. */.  
f720: 61 20 3d 20 70 4c 65 61 66 2d 3e 70 3b 0a 20 20  a = pLeaf->p;.  
f730: 6e 20 3d 20 70 4c 65 61 66 2d 3e 73 7a 4c 65 61  n = pLeaf->szLea
f740: 66 3b 0a 0a 20 20 41 53 53 45 52 54 5f 53 5a 4c  f;..  ASSERT_SZL
f750: 45 41 46 5f 4f 4b 28 70 4c 65 61 66 29 3b 0a 20  EAF_OK(pLeaf);. 
f760: 20 69 4f 66 66 20 3d 20 70 49 74 65 72 2d 3e 69   iOff = pIter->i
f770: 4c 65 61 66 4f 66 66 73 65 74 20 2b 20 70 49 74  LeafOffset + pIt
f780: 65 72 2d 3e 6e 50 6f 73 3b 0a 0a 20 20 69 66 28  er->nPos;..  if(
f790: 20 69 4f 66 66 3c 6e 20 29 7b 0a 20 20 20 20 2f   iOff<n ){.    /
f7a0: 2a 20 54 68 65 20 6e 65 78 74 20 65 6e 74 72 79  * The next entry
f7b0: 20 69 73 20 6f 6e 20 74 68 65 20 63 75 72 72 65   is on the curre
f7c0: 6e 74 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20  nt page. */.    
f7d0: 61 73 73 65 72 74 5f 6e 63 28 20 69 4f 66 66 3c  assert_nc( iOff<
f7e0: 3d 70 49 74 65 72 2d 3e 69 45 6e 64 6f 66 44 6f  =pIter->iEndofDo
f7f0: 63 6c 69 73 74 20 29 3b 0a 20 20 20 20 69 66 28  clist );.    if(
f800: 20 69 4f 66 66 3e 3d 70 49 74 65 72 2d 3e 69 45   iOff>=pIter->iE
f810: 6e 64 6f 66 44 6f 63 6c 69 73 74 20 29 7b 0a 20  ndofDoclist ){. 
f820: 20 20 20 20 20 62 4e 65 77 54 65 72 6d 20 3d 20       bNewTerm = 
f830: 31 3b 0a 20 20 20 20 20 20 69 66 28 20 69 4f 66  1;.      if( iOf
f840: 66 21 3d 66 74 73 35 4c 65 61 66 46 69 72 73 74  f!=fts5LeafFirst
f850: 54 65 72 6d 4f 66 66 28 70 4c 65 61 66 29 20 29  TermOff(pLeaf) )
f860: 7b 0a 20 20 20 20 20 20 20 20 69 4f 66 66 20 2b  {.        iOff +
f870: 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e 74 33  = fts5GetVarint3
f880: 32 28 26 61 5b 69 4f 66 66 5d 2c 20 6e 4b 65 65  2(&a[iOff], nKee
f890: 70 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  p);.      }.    
f8a0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 75 36 34  }else{.      u64
f8b0: 20 69 44 65 6c 74 61 3b 0a 20 20 20 20 20 20 69   iDelta;.      i
f8c0: 4f 66 66 20 2b 3d 20 73 71 6c 69 74 65 33 46 74  Off += sqlite3Ft
f8d0: 73 35 47 65 74 56 61 72 69 6e 74 28 26 61 5b 69  s5GetVarint(&a[i
f8e0: 4f 66 66 5d 2c 20 26 69 44 65 6c 74 61 29 3b 0a  Off], &iDelta);.
f8f0: 20 20 20 20 20 20 70 49 74 65 72 2d 3e 69 52 6f        pIter->iRo
f900: 77 69 64 20 2b 3d 20 69 44 65 6c 74 61 3b 0a 20  wid += iDelta;. 
f910: 20 20 20 20 20 61 73 73 65 72 74 5f 6e 63 28 20       assert_nc( 
f920: 69 44 65 6c 74 61 3e 30 20 29 3b 0a 20 20 20 20  iDelta>0 );.    
f930: 7d 0a 20 20 20 20 70 49 74 65 72 2d 3e 69 4c 65  }.    pIter->iLe
f940: 61 66 4f 66 66 73 65 74 20 3d 20 69 4f 66 66 3b  afOffset = iOff;
f950: 0a 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 49  ..  }else if( pI
f960: 74 65 72 2d 3e 70 53 65 67 3d 3d 30 20 29 7b 0a  ter->pSeg==0 ){.
f970: 20 20 20 20 63 6f 6e 73 74 20 75 38 20 2a 70 4c      const u8 *pL
f980: 69 73 74 20 3d 20 30 3b 0a 20 20 20 20 63 6f 6e  ist = 0;.    con
f990: 73 74 20 63 68 61 72 20 2a 7a 54 65 72 6d 20 3d  st char *zTerm =
f9a0: 20 30 3b 0a 20 20 20 20 69 6e 74 20 6e 4c 69 73   0;.    int nLis
f9b0: 74 20 3d 20 30 3b 0a 20 20 20 20 61 73 73 65 72  t = 0;.    asser
f9c0: 74 28 20 28 70 49 74 65 72 2d 3e 66 6c 61 67 73  t( (pIter->flags
f9d0: 20 26 20 46 54 53 35 5f 53 45 47 49 54 45 52 5f   & FTS5_SEGITER_
f9e0: 4f 4e 45 54 45 52 4d 29 20 7c 7c 20 70 62 4e 65  ONETERM) || pbNe
f9f0: 77 54 65 72 6d 20 29 3b 0a 20 20 20 20 69 66 28  wTerm );.    if(
fa00: 20 30 3d 3d 28 70 49 74 65 72 2d 3e 66 6c 61 67   0==(pIter->flag
fa10: 73 20 26 20 46 54 53 35 5f 53 45 47 49 54 45 52  s & FTS5_SEGITER
fa20: 5f 4f 4e 45 54 45 52 4d 29 20 29 7b 0a 20 20 20  _ONETERM) ){.   
fa30: 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 48 61     sqlite3Fts5Ha
fa40: 73 68 53 63 61 6e 4e 65 78 74 28 70 2d 3e 70 48  shScanNext(p->pH
fa50: 61 73 68 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ash);.      sqli
fa60: 74 65 33 46 74 73 35 48 61 73 68 53 63 61 6e 45  te3Fts5HashScanE
fa70: 6e 74 72 79 28 70 2d 3e 70 48 61 73 68 2c 20 26  ntry(p->pHash, &
fa80: 7a 54 65 72 6d 2c 20 26 70 4c 69 73 74 2c 20 26  zTerm, &pList, &
fa90: 6e 4c 69 73 74 29 3b 0a 20 20 20 20 7d 0a 20 20  nList);.    }.  
faa0: 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29    if( pList==0 )
fab0: 7b 0a 20 20 20 20 20 20 66 74 73 35 44 61 74 61  {.      fts5Data
fac0: 52 65 6c 65 61 73 65 28 70 49 74 65 72 2d 3e 70  Release(pIter->p
fad0: 4c 65 61 66 29 3b 0a 20 20 20 20 20 20 70 49 74  Leaf);.      pIt
fae0: 65 72 2d 3e 70 4c 65 61 66 20 3d 20 30 3b 0a 20  er->pLeaf = 0;. 
faf0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
fb00: 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 70 20  pIter->pLeaf->p 
fb10: 3d 20 28 75 38 2a 29 70 4c 69 73 74 3b 0a 20 20  = (u8*)pList;.  
fb20: 20 20 20 20 70 49 74 65 72 2d 3e 70 4c 65 61 66      pIter->pLeaf
fb30: 2d 3e 6e 6e 20 3d 20 6e 4c 69 73 74 3b 0a 20 20  ->nn = nList;.  
fb40: 20 20 20 20 70 49 74 65 72 2d 3e 70 4c 65 61 66      pIter->pLeaf
fb50: 2d 3e 73 7a 4c 65 61 66 20 3d 20 6e 4c 69 73 74  ->szLeaf = nList
fb60: 3b 0a 20 20 20 20 20 20 70 49 74 65 72 2d 3e 69  ;.      pIter->i
fb70: 45 6e 64 6f 66 44 6f 63 6c 69 73 74 20 3d 20 6e  EndofDoclist = n
fb80: 4c 69 73 74 2b 31 3b 0a 20 20 20 20 20 20 73 71  List+1;.      sq
fb90: 6c 69 74 65 33 46 74 73 35 42 75 66 66 65 72 53  lite3Fts5BufferS
fba0: 65 74 28 26 70 2d 3e 72 63 2c 20 26 70 49 74 65  et(&p->rc, &pIte
fbb0: 72 2d 3e 74 65 72 6d 2c 20 28 69 6e 74 29 73 74  r->term, (int)st
fbc0: 72 6c 65 6e 28 7a 54 65 72 6d 29 2c 0a 20 20 20  rlen(zTerm),.   
fbd0: 20 20 20 20 20 20 20 28 75 38 2a 29 7a 54 65 72         (u8*)zTer
fbe0: 6d 29 3b 0a 20 20 20 20 20 20 70 49 74 65 72 2d  m);.      pIter-
fbf0: 3e 69 4c 65 61 66 4f 66 66 73 65 74 20 3d 20 66  >iLeafOffset = f
fc00: 74 73 35 47 65 74 56 61 72 69 6e 74 28 70 4c 69  ts5GetVarint(pLi
fc10: 73 74 2c 20 28 75 36 34 2a 29 26 70 49 74 65 72  st, (u64*)&pIter
fc20: 2d 3e 69 52 6f 77 69 64 29 3b 0a 20 20 20 20 20  ->iRowid);.     
fc30: 20 2a 70 62 4e 65 77 54 65 72 6d 20 3d 20 31 3b   *pbNewTerm = 1;
fc40: 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a  .    }.  }else{.
fc50: 20 20 20 20 69 4f 66 66 20 3d 20 30 3b 0a 20 20      iOff = 0;.  
fc60: 20 20 2f 2a 20 4e 65 78 74 20 65 6e 74 72 79 20    /* Next entry 
fc70: 69 73 20 6e 6f 74 20 6f 6e 20 74 68 65 20 63 75  is not on the cu
fc80: 72 72 65 6e 74 20 70 61 67 65 20 2a 2f 0a 20 20  rrent page */.  
fc90: 20 20 77 68 69 6c 65 28 20 69 4f 66 66 3d 3d 30    while( iOff==0
fca0: 20 29 7b 0a 20 20 20 20 20 20 66 74 73 35 53 65   ){.      fts5Se
fcb0: 67 49 74 65 72 4e 65 78 74 50 61 67 65 28 70 2c  gIterNextPage(p,
fcc0: 20 70 49 74 65 72 29 3b 0a 20 20 20 20 20 20 70   pIter);.      p
fcd0: 4c 65 61 66 20 3d 20 70 49 74 65 72 2d 3e 70 4c  Leaf = pIter->pL
fce0: 65 61 66 3b 0a 20 20 20 20 20 20 69 66 28 20 70  eaf;.      if( p
fcf0: 4c 65 61 66 3d 3d 30 20 29 20 62 72 65 61 6b 3b  Leaf==0 ) break;
fd00: 0a 20 20 20 20 20 20 41 53 53 45 52 54 5f 53 5a  .      ASSERT_SZ
fd10: 4c 45 41 46 5f 4f 4b 28 70 4c 65 61 66 29 3b 0a  LEAF_OK(pLeaf);.
fd20: 20 20 20 20 20 20 69 66 28 20 28 69 4f 66 66 20        if( (iOff 
fd30: 3d 20 66 74 73 35 4c 65 61 66 46 69 72 73 74 52  = fts5LeafFirstR
fd40: 6f 77 69 64 4f 66 66 28 70 4c 65 61 66 29 29 20  owidOff(pLeaf)) 
fd50: 26 26 20 69 4f 66 66 3c 70 4c 65 61 66 2d 3e 73  && iOff<pLeaf->s
fd60: 7a 4c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 20  zLeaf ){.       
fd70: 20 69 4f 66 66 20 2b 3d 20 73 71 6c 69 74 65 33   iOff += sqlite3
fd80: 46 74 73 35 47 65 74 56 61 72 69 6e 74 28 26 70  Fts5GetVarint(&p
fd90: 4c 65 61 66 2d 3e 70 5b 69 4f 66 66 5d 2c 20 28  Leaf->p[iOff], (
fda0: 75 36 34 2a 29 26 70 49 74 65 72 2d 3e 69 52 6f  u64*)&pIter->iRo
fdb0: 77 69 64 29 3b 0a 20 20 20 20 20 20 20 20 70 49  wid);.        pI
fdc0: 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74  ter->iLeafOffset
fdd0: 20 3d 20 69 4f 66 66 3b 0a 0a 20 20 20 20 20 20   = iOff;..      
fde0: 20 20 69 66 28 20 70 4c 65 61 66 2d 3e 6e 6e 3e    if( pLeaf->nn>
fdf0: 70 4c 65 61 66 2d 3e 73 7a 4c 65 61 66 20 29 7b  pLeaf->szLeaf ){
fe00: 0a 20 20 20 20 20 20 20 20 20 20 70 49 74 65 72  .          pIter
fe10: 2d 3e 69 50 67 69 64 78 4f 66 66 20 3d 20 70 4c  ->iPgidxOff = pL
fe20: 65 61 66 2d 3e 73 7a 4c 65 61 66 20 2b 20 66 74  eaf->szLeaf + ft
fe30: 73 35 47 65 74 56 61 72 69 6e 74 33 32 28 0a 20  s5GetVarint32(. 
fe40: 20 20 20 20 20 20 20 20 20 20 20 20 20 26 70 4c               &pL
fe50: 65 61 66 2d 3e 70 5b 70 4c 65 61 66 2d 3e 73 7a  eaf->p[pLeaf->sz
fe60: 4c 65 61 66 5d 2c 20 70 49 74 65 72 2d 3e 69 45  Leaf], pIter->iE
fe70: 6e 64 6f 66 44 6f 63 6c 69 73 74 0a 20 20 20 20  ndofDoclist.    
fe80: 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20        );.       
fe90: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
fea0: 20 65 6c 73 65 20 69 66 28 20 70 4c 65 61 66 2d   else if( pLeaf-
feb0: 3e 6e 6e 3e 70 4c 65 61 66 2d 3e 73 7a 4c 65 61  >nn>pLeaf->szLea
fec0: 66 20 29 7b 0a 20 20 20 20 20 20 20 20 70 49 74  f ){.        pIt
fed0: 65 72 2d 3e 69 50 67 69 64 78 4f 66 66 20 3d 20  er->iPgidxOff = 
fee0: 70 4c 65 61 66 2d 3e 73 7a 4c 65 61 66 20 2b 20  pLeaf->szLeaf + 
fef0: 66 74 73 35 47 65 74 56 61 72 69 6e 74 33 32 28  fts5GetVarint32(
ff00: 0a 20 20 20 20 20 20 20 20 20 20 20 20 26 70 4c  .            &pL
ff10: 65 61 66 2d 3e 70 5b 70 4c 65 61 66 2d 3e 73 7a  eaf->p[pLeaf->sz
ff20: 4c 65 61 66 5d 2c 20 69 4f 66 66 0a 20 20 20 20  Leaf], iOff.    
ff30: 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 70      );.        p
ff40: 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65  Iter->iLeafOffse
ff50: 74 20 3d 20 69 4f 66 66 3b 0a 20 20 20 20 20 20  t = iOff;.      
ff60: 20 20 70 49 74 65 72 2d 3e 69 45 6e 64 6f 66 44    pIter->iEndofD
ff70: 6f 63 6c 69 73 74 20 3d 20 69 4f 66 66 3b 0a 20  oclist = iOff;. 
ff80: 20 20 20 20 20 20 20 62 4e 65 77 54 65 72 6d 20         bNewTerm 
ff90: 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 1;.      }.   
ffa0: 20 20 20 61 73 73 65 72 74 5f 6e 63 28 20 69 4f     assert_nc( iO
ffb0: 66 66 3c 70 4c 65 61 66 2d 3e 73 7a 4c 65 61 66  ff<pLeaf->szLeaf
ffc0: 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69 4f   );.      if( iO
ffd0: 66 66 3e 70 4c 65 61 66 2d 3e 73 7a 4c 65 61 66  ff>pLeaf->szLeaf
ffe0: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 72   ){.        p->r
fff0: 63 20 3d 20 46 54 53 35 5f 43 4f 52 52 55 50 54  c = FTS5_CORRUPT
10000 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
10010 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
10020 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20    }..  /* Check 
10030 69 66 20 74 68 65 20 69 74 65 72 61 74 6f 72 20  if the iterator 
10040 69 73 20 6e 6f 77 20 61 74 20 45 4f 46 2e 20 49  is now at EOF. I
10050 66 20 73 6f 2c 20 72 65 74 75 72 6e 20 65 61 72  f so, return ear
10060 6c 79 2e 20 2a 2f 0a 20 20 69 66 28 20 70 49 74  ly. */.  if( pIt
10070 65 72 2d 3e 70 4c 65 61 66 20 29 7b 0a 20 20 20  er->pLeaf ){.   
10080 20 69 66 28 20 62 4e 65 77 54 65 72 6d 20 29 7b   if( bNewTerm ){
10090 0a 20 20 20 20 20 20 69 66 28 20 70 49 74 65 72  .      if( pIter
100a0 2d 3e 66 6c 61 67 73 20 26 20 46 54 53 35 5f 53  ->flags & FTS5_S
100b0 45 47 49 54 45 52 5f 4f 4e 45 54 45 52 4d 20 29  EGITER_ONETERM )
100c0 7b 0a 20 20 20 20 20 20 20 20 66 74 73 35 44 61  {.        fts5Da
100d0 74 61 52 65 6c 65 61 73 65 28 70 49 74 65 72 2d  taRelease(pIter-
100e0 3e 70 4c 65 61 66 29 3b 0a 20 20 20 20 20 20 20  >pLeaf);.       
100f0 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 20 3d 20   pIter->pLeaf = 
10100 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  0;.      }else{.
10110 20 20 20 20 20 20 20 20 66 74 73 35 53 65 67 49          fts5SegI
10120 74 65 72 4c 6f 61 64 54 65 72 6d 28 70 2c 20 70  terLoadTerm(p, p
10130 49 74 65 72 2c 20 6e 4b 65 65 70 29 3b 0a 20 20  Iter, nKeep);.  
10140 20 20 20 20 20 20 66 74 73 35 53 65 67 49 74 65        fts5SegIte
10150 72 4c 6f 61 64 4e 50 6f 73 28 70 2c 20 70 49 74  rLoadNPos(p, pIt
10160 65 72 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  er);.        if(
10170 20 70 62 4e 65 77 54 65 72 6d 20 29 20 2a 70 62   pbNewTerm ) *pb
10180 4e 65 77 54 65 72 6d 20 3d 20 31 3b 0a 20 20 20  NewTerm = 1;.   
10190 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a     }.    }else{.
101a0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 66 6f 6c        /* The fol
101b0 6c 6f 77 69 6e 67 20 63 6f 75 6c 64 20 62 65 20  lowing could be 
101c0 64 6f 6e 65 20 62 79 20 63 61 6c 6c 69 6e 67 20  done by calling 
101d0 66 74 73 35 53 65 67 49 74 65 72 4c 6f 61 64 4e  fts5SegIterLoadN
101e0 50 6f 73 28 29 2e 20 42 75 74 0a 20 20 20 20 20  Pos(). But.     
101f0 20 2a 2a 20 74 68 69 73 20 62 6c 6f 63 6b 20 69   ** this block i
10200 73 20 70 61 72 74 69 63 75 6c 61 72 6c 79 20 70  s particularly p
10210 65 72 66 6f 72 6d 61 6e 63 65 20 63 72 69 74 69  erformance criti
10220 63 61 6c 2c 20 73 6f 20 65 71 75 69 76 61 6c 65  cal, so equivale
10230 6e 74 0a 20 20 20 20 20 20 2a 2a 20 63 6f 64 65  nt.      ** code
10240 20 69 73 20 69 6e 6c 69 6e 65 64 2e 20 0a 20 20   is inlined. .  
10250 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
10260 4c 61 74 65 72 3a 20 53 77 69 74 63 68 65 64 20  Later: Switched 
10270 62 61 63 6b 20 74 6f 20 66 74 73 35 53 65 67 49  back to fts5SegI
10280 74 65 72 4c 6f 61 64 4e 50 6f 73 28 29 20 62 65  terLoadNPos() be
10290 63 61 75 73 65 20 69 74 20 73 75 70 70 6f 72 74  cause it support
102a0 73 0a 20 20 20 20 20 20 2a 2a 20 64 65 74 61 69  s.      ** detai
102b0 6c 3d 6e 6f 6e 65 20 6d 6f 64 65 2e 20 4e 6f 74  l=none mode. Not
102c0 20 69 64 65 61 6c 2e 0a 20 20 20 20 20 20 2a 2f   ideal..      */
102d0 0a 20 20 20 20 20 20 69 6e 74 20 6e 53 7a 3b 0a  .      int nSz;.
102e0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
102f0 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  >rc==SQLITE_OK )
10300 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
10310 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73  pIter->iLeafOffs
10320 65 74 3c 3d 70 49 74 65 72 2d 3e 70 4c 65 61 66  et<=pIter->pLeaf
10330 2d 3e 6e 6e 20 29 3b 0a 20 20 20 20 20 20 66 74  ->nn );.      ft
10340 73 35 46 61 73 74 47 65 74 56 61 72 69 6e 74 33  s5FastGetVarint3
10350 32 28 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e  2(pIter->pLeaf->
10360 70 2c 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f  p, pIter->iLeafO
10370 66 66 73 65 74 2c 20 6e 53 7a 29 3b 0a 20 20 20  ffset, nSz);.   
10380 20 20 20 70 49 74 65 72 2d 3e 62 44 65 6c 20 3d     pIter->bDel =
10390 20 28 6e 53 7a 20 26 20 30 78 30 30 30 31 29 3b   (nSz & 0x0001);
103a0 0a 20 20 20 20 20 20 70 49 74 65 72 2d 3e 6e 50  .      pIter->nP
103b0 6f 73 20 3d 20 6e 53 7a 3e 3e 31 3b 0a 20 20 20  os = nSz>>1;.   
103c0 20 20 20 61 73 73 65 72 74 5f 6e 63 28 20 70 49     assert_nc( pI
103d0 74 65 72 2d 3e 6e 50 6f 73 3e 3d 30 20 29 3b 0a  ter->nPos>=0 );.
103e0 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 23 64 65      }.  }.}..#de
103f0 66 69 6e 65 20 53 57 41 50 56 41 4c 28 54 2c 20  fine SWAPVAL(T, 
10400 61 2c 20 62 29 20 7b 20 54 20 74 6d 70 3b 20 74  a, b) { T tmp; t
10410 6d 70 3d 61 3b 20 61 3d 62 3b 20 62 3d 74 6d 70  mp=a; a=b; b=tmp
10420 3b 20 7d 0a 0a 23 64 65 66 69 6e 65 20 66 74 73  ; }..#define fts
10430 35 49 6e 64 65 78 53 6b 69 70 56 61 72 69 6e 74  5IndexSkipVarint
10440 28 61 2c 20 69 4f 66 66 29 20 7b 20 20 20 20 20  (a, iOff) {     
10450 20 20 20 20 20 20 20 5c 0a 20 20 69 6e 74 20 69         \.  int i
10460 45 6e 64 20 3d 20 69 4f 66 66 2b 39 3b 20 20 20  End = iOff+9;   
10470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10480 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 77             \.  w
10490 68 69 6c 65 28 20 28 61 5b 69 4f 66 66 2b 2b 5d  hile( (a[iOff++]
104a0 20 26 20 30 78 38 30 29 20 26 26 20 69 4f 66 66   & 0x80) && iOff
104b0 3c 69 45 6e 64 20 29 3b 20 20 20 20 20 20 20 5c  <iEnd );       \
104c0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 74 65 72 61 74  .}../*.** Iterat
104d0 6f 72 20 70 49 74 65 72 20 63 75 72 72 65 6e 74  or pIter current
104e0 6c 79 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65  ly points to the
104f0 20 66 69 72 73 74 20 72 6f 77 69 64 20 69 6e 20   first rowid in 
10500 61 20 64 6f 63 6c 69 73 74 2e 20 54 68 69 73 0a  a doclist. This.
10510 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 73 65 74 73  ** function sets
10520 20 74 68 65 20 69 74 65 72 61 74 6f 72 20 75 70   the iterator up
10530 20 73 6f 20 74 68 61 74 20 69 74 65 72 61 74 65   so that iterate
10540 73 20 69 6e 20 72 65 76 65 72 73 65 20 6f 72 64  s in reverse ord
10550 65 72 20 74 68 72 6f 75 67 68 0a 2a 2a 20 74 68  er through.** th
10560 65 20 64 6f 63 6c 69 73 74 2e 0a 2a 2f 0a 73 74  e doclist..*/.st
10570 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 53 65  atic void fts5Se
10580 67 49 74 65 72 52 65 76 65 72 73 65 28 46 74 73  gIterReverse(Fts
10590 35 49 6e 64 65 78 20 2a 70 2c 20 46 74 73 35 53  5Index *p, Fts5S
105a0 65 67 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a  egIter *pIter){.
105b0 20 20 46 74 73 35 44 6c 69 64 78 49 74 65 72 20    Fts5DlidxIter 
105c0 2a 70 44 6c 69 64 78 20 3d 20 70 49 74 65 72 2d  *pDlidx = pIter-
105d0 3e 70 44 6c 69 64 78 3b 0a 20 20 46 74 73 35 44  >pDlidx;.  Fts5D
105e0 61 74 61 20 2a 70 4c 61 73 74 20 3d 20 30 3b 0a  ata *pLast = 0;.
105f0 20 20 69 6e 74 20 70 67 6e 6f 4c 61 73 74 20 3d    int pgnoLast =
10600 20 30 3b 0a 0a 20 20 69 66 28 20 70 44 6c 69 64   0;..  if( pDlid
10610 78 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 53 65  x ){.    int iSe
10620 67 69 64 20 3d 20 70 49 74 65 72 2d 3e 70 53 65  gid = pIter->pSe
10630 67 2d 3e 69 53 65 67 69 64 3b 0a 20 20 20 20 70  g->iSegid;.    p
10640 67 6e 6f 4c 61 73 74 20 3d 20 66 74 73 35 44 6c  gnoLast = fts5Dl
10650 69 64 78 49 74 65 72 50 67 6e 6f 28 70 44 6c 69  idxIterPgno(pDli
10660 64 78 29 3b 0a 20 20 20 20 70 4c 61 73 74 20 3d  dx);.    pLast =
10670 20 66 74 73 35 44 61 74 61 52 65 61 64 28 70 2c   fts5DataRead(p,
10680 20 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f 52 4f   FTS5_SEGMENT_RO
10690 57 49 44 28 69 53 65 67 69 64 2c 20 70 67 6e 6f  WID(iSegid, pgno
106a0 4c 61 73 74 29 29 3b 0a 20 20 7d 65 6c 73 65 7b  Last));.  }else{
106b0 0a 20 20 20 20 46 74 73 35 44 61 74 61 20 2a 70  .    Fts5Data *p
106c0 4c 65 61 66 20 3d 20 70 49 74 65 72 2d 3e 70 4c  Leaf = pIter->pL
106d0 65 61 66 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  eaf;         /* 
106e0 43 75 72 72 65 6e 74 20 6c 65 61 66 20 64 61 74  Current leaf dat
106f0 61 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 43 75 72  a */..    /* Cur
10700 72 65 6e 74 6c 79 2c 20 46 74 73 35 53 65 67 49  rently, Fts5SegI
10710 74 65 72 2e 69 4c 65 61 66 4f 66 66 73 65 74 20  ter.iLeafOffset 
10720 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 66 69  points to the fi
10730 72 73 74 20 62 79 74 65 20 6f 66 0a 20 20 20 20  rst byte of.    
10740 2a 2a 20 70 6f 73 69 74 69 6f 6e 2d 6c 69 73 74  ** position-list
10750 20 63 6f 6e 74 65 6e 74 20 66 6f 72 20 74 68 65   content for the
10760 20 63 75 72 72 65 6e 74 20 72 6f 77 69 64 2e 20   current rowid. 
10770 42 61 63 6b 20 69 74 20 75 70 20 73 6f 20 74 68  Back it up so th
10780 61 74 20 69 74 0a 20 20 20 20 2a 2a 20 70 6f 69  at it.    ** poi
10790 6e 74 73 20 74 6f 20 74 68 65 20 73 74 61 72 74  nts to the start
107a0 20 6f 66 20 74 68 65 20 70 6f 73 69 74 69 6f 6e   of the position
107b0 2d 6c 69 73 74 20 73 69 7a 65 20 66 69 65 6c 64  -list size field
107c0 2e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 50 6f  . */.    int iPo
107d0 73 6c 69 73 74 3b 0a 20 20 20 20 69 66 28 20 70  slist;.    if( p
107e0 49 74 65 72 2d 3e 69 54 65 72 6d 4c 65 61 66 50  Iter->iTermLeafP
107f0 67 6e 6f 3d 3d 70 49 74 65 72 2d 3e 69 4c 65 61  gno==pIter->iLea
10800 66 50 67 6e 6f 20 29 7b 0a 20 20 20 20 20 20 69  fPgno ){.      i
10810 50 6f 73 6c 69 73 74 20 3d 20 70 49 74 65 72 2d  Poslist = pIter-
10820 3e 69 54 65 72 6d 4c 65 61 66 4f 66 66 73 65 74  >iTermLeafOffset
10830 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
10840 20 20 20 69 50 6f 73 6c 69 73 74 20 3d 20 34 3b     iPoslist = 4;
10850 0a 20 20 20 20 7d 0a 20 20 20 20 66 74 73 35 49  .    }.    fts5I
10860 6e 64 65 78 53 6b 69 70 56 61 72 69 6e 74 28 70  ndexSkipVarint(p
10870 4c 65 61 66 2d 3e 70 2c 20 69 50 6f 73 6c 69 73  Leaf->p, iPoslis
10880 74 29 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 69  t);.    pIter->i
10890 4c 65 61 66 4f 66 66 73 65 74 20 3d 20 69 50 6f  LeafOffset = iPo
108a0 73 6c 69 73 74 3b 0a 0a 20 20 20 20 2f 2a 20 49  slist;..    /* I
108b0 66 20 74 68 69 73 20 63 6f 6e 64 69 74 69 6f 6e  f this condition
108c0 20 69 73 20 74 72 75 65 20 74 68 65 6e 20 74 68   is true then th
108d0 65 20 6c 61 72 67 65 73 74 20 72 6f 77 69 64 20  e largest rowid 
108e0 66 6f 72 20 74 68 65 20 63 75 72 72 65 6e 74 0a  for the current.
108f0 20 20 20 20 2a 2a 20 74 65 72 6d 20 6d 61 79 20      ** term may 
10900 6e 6f 74 20 62 65 20 73 74 6f 72 65 64 20 6f 6e  not be stored on
10910 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 61 67   the current pag
10920 65 2e 20 53 6f 20 73 65 61 72 63 68 20 66 6f 72  e. So search for
10930 77 61 72 64 20 74 6f 0a 20 20 20 20 2a 2a 20 73  ward to.    ** s
10940 65 65 20 77 68 65 72 65 20 73 61 69 64 20 72 6f  ee where said ro
10950 77 69 64 20 72 65 61 6c 6c 79 20 69 73 2e 20 20  wid really is.  
10960 2a 2f 0a 20 20 20 20 69 66 28 20 70 49 74 65 72  */.    if( pIter
10970 2d 3e 69 45 6e 64 6f 66 44 6f 63 6c 69 73 74 3e  ->iEndofDoclist>
10980 3d 70 4c 65 61 66 2d 3e 73 7a 4c 65 61 66 20 29  =pLeaf->szLeaf )
10990 7b 0a 20 20 20 20 20 20 69 6e 74 20 70 67 6e 6f  {.      int pgno
109a0 3b 0a 20 20 20 20 20 20 46 74 73 35 53 74 72 75  ;.      Fts5Stru
109b0 63 74 75 72 65 53 65 67 6d 65 6e 74 20 2a 70 53  ctureSegment *pS
109c0 65 67 20 3d 20 70 49 74 65 72 2d 3e 70 53 65 67  eg = pIter->pSeg
109d0 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ;..      /* The 
109e0 6c 61 73 74 20 72 6f 77 69 64 20 69 6e 20 74 68  last rowid in th
109f0 65 20 64 6f 63 6c 69 73 74 20 6d 61 79 20 6e 6f  e doclist may no
10a00 74 20 62 65 20 6f 6e 20 74 68 65 20 63 75 72 72  t be on the curr
10a10 65 6e 74 20 70 61 67 65 2e 20 53 65 61 72 63 68  ent page. Search
10a20 0a 20 20 20 20 20 20 2a 2a 20 66 6f 72 77 61 72  .      ** forwar
10a30 64 20 74 6f 20 66 69 6e 64 20 74 68 65 20 70 61  d to find the pa
10a40 67 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  ge containing th
10a50 65 20 6c 61 73 74 20 72 6f 77 69 64 2e 20 20 2a  e last rowid.  *
10a60 2f 0a 20 20 20 20 20 20 66 6f 72 28 70 67 6e 6f  /.      for(pgno
10a70 3d 70 49 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e  =pIter->iLeafPgn
10a80 6f 2b 31 3b 20 21 70 2d 3e 72 63 20 26 26 20 70  o+1; !p->rc && p
10a90 67 6e 6f 3c 3d 70 53 65 67 2d 3e 70 67 6e 6f 4c  gno<=pSeg->pgnoL
10aa0 61 73 74 3b 20 70 67 6e 6f 2b 2b 29 7b 0a 20 20  ast; pgno++){.  
10ab0 20 20 20 20 20 20 69 36 34 20 69 41 62 73 20 3d        i64 iAbs =
10ac0 20 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f 52 4f   FTS5_SEGMENT_RO
10ad0 57 49 44 28 70 53 65 67 2d 3e 69 53 65 67 69 64  WID(pSeg->iSegid
10ae0 2c 20 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20  , pgno);.       
10af0 20 46 74 73 35 44 61 74 61 20 2a 70 4e 65 77 20   Fts5Data *pNew 
10b00 3d 20 66 74 73 35 44 61 74 61 52 65 61 64 28 70  = fts5DataRead(p
10b10 2c 20 69 41 62 73 29 3b 0a 20 20 20 20 20 20 20  , iAbs);.       
10b20 20 69 66 28 20 70 4e 65 77 20 29 7b 0a 20 20 20   if( pNew ){.   
10b30 20 20 20 20 20 20 20 69 6e 74 20 69 52 6f 77 69         int iRowi
10b40 64 2c 20 62 54 65 72 6d 6c 65 73 73 3b 0a 20 20  d, bTermless;.  
10b50 20 20 20 20 20 20 20 20 69 52 6f 77 69 64 20 3d          iRowid =
10b60 20 66 74 73 35 4c 65 61 66 46 69 72 73 74 52 6f   fts5LeafFirstRo
10b70 77 69 64 4f 66 66 28 70 4e 65 77 29 3b 0a 20 20  widOff(pNew);.  
10b80 20 20 20 20 20 20 20 20 62 54 65 72 6d 6c 65 73          bTermles
10b90 73 20 3d 20 66 74 73 35 4c 65 61 66 49 73 54 65  s = fts5LeafIsTe
10ba0 72 6d 6c 65 73 73 28 70 4e 65 77 29 3b 0a 20 20  rmless(pNew);.  
10bb0 20 20 20 20 20 20 20 20 69 66 28 20 69 52 6f 77          if( iRow
10bc0 69 64 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  id ){.          
10bd0 20 20 53 57 41 50 56 41 4c 28 46 74 73 35 44 61    SWAPVAL(Fts5Da
10be0 74 61 2a 2c 20 70 4e 65 77 2c 20 70 4c 61 73 74  ta*, pNew, pLast
10bf0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  );.            p
10c00 67 6e 6f 4c 61 73 74 20 3d 20 70 67 6e 6f 3b 0a  gnoLast = pgno;.
10c10 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
10c20 20 20 20 20 20 20 66 74 73 35 44 61 74 61 52 65        fts5DataRe
10c30 6c 65 61 73 65 28 70 4e 65 77 29 3b 0a 20 20 20  lease(pNew);.   
10c40 20 20 20 20 20 20 20 69 66 28 20 62 54 65 72 6d         if( bTerm
10c50 6c 65 73 73 3d 3d 30 20 29 20 62 72 65 61 6b 3b  less==0 ) break;
10c60 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
10c70 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20   }.    }.  }..  
10c80 2f 2a 20 49 66 20 70 4c 61 73 74 20 69 73 20 4e  /* If pLast is N
10c90 55 4c 4c 20 61 74 20 74 68 69 73 20 70 6f 69 6e  ULL at this poin
10ca0 74 2c 20 74 68 65 6e 20 74 68 65 20 6c 61 73 74  t, then the last
10cb0 20 72 6f 77 69 64 20 66 6f 72 20 74 68 69 73 20   rowid for this 
10cc0 64 6f 63 6c 69 73 74 0a 20 20 2a 2a 20 6c 69 65  doclist.  ** lie
10cd0 73 20 6f 6e 20 74 68 65 20 70 61 67 65 20 63 75  s on the page cu
10ce0 72 72 65 6e 74 6c 79 20 69 6e 64 69 63 61 74 65  rrently indicate
10cf0 64 20 62 79 20 74 68 65 20 69 74 65 72 61 74 6f  d by the iterato
10d00 72 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  r. In this case 
10d10 0a 20 20 2a 2a 20 70 49 74 65 72 2d 3e 69 4c 65  .  ** pIter->iLe
10d20 61 66 4f 66 66 73 65 74 20 69 73 20 61 6c 72 65  afOffset is alre
10d30 61 64 79 20 73 65 74 20 74 6f 20 70 6f 69 6e 74  ady set to point
10d40 20 74 6f 20 74 68 65 20 70 6f 73 69 74 69 6f 6e   to the position
10d50 2d 6c 69 73 74 20 73 69 7a 65 0a 20 20 2a 2a 20  -list size.  ** 
10d60 66 69 65 6c 64 20 61 73 73 6f 63 69 61 74 65 64  field associated
10d70 20 77 69 74 68 20 74 68 65 20 66 69 72 73 74 20   with the first 
10d80 72 65 6c 65 76 61 6e 74 20 72 6f 77 69 64 20 6f  relevant rowid o
10d90 6e 20 74 68 65 20 70 61 67 65 2e 0a 20 20 2a 2a  n the page..  **
10da0 0a 20 20 2a 2a 20 4f 72 2c 20 69 66 20 70 4c 61  .  ** Or, if pLa
10db0 73 74 20 69 73 20 6e 6f 6e 2d 4e 55 4c 4c 2c 20  st is non-NULL, 
10dc0 74 68 65 6e 20 69 74 20 69 73 20 74 68 65 20 70  then it is the p
10dd0 61 67 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e  age that contain
10de0 73 20 74 68 65 20 6c 61 73 74 0a 20 20 2a 2a 20  s the last.  ** 
10df0 72 6f 77 69 64 2e 20 49 6e 20 74 68 69 73 20 63  rowid. In this c
10e00 61 73 65 20 63 6f 6e 66 69 67 75 72 65 20 74 68  ase configure th
10e10 65 20 69 74 65 72 61 74 6f 72 20 73 6f 20 74 68  e iterator so th
10e20 61 74 20 69 74 20 70 6f 69 6e 74 73 20 74 6f 20  at it points to 
10e30 74 68 65 0a 20 20 2a 2a 20 66 69 72 73 74 20 72  the.  ** first r
10e40 6f 77 69 64 20 6f 6e 20 74 68 69 73 20 70 61 67  owid on this pag
10e50 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 4c  e..  */.  if( pL
10e60 61 73 74 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  ast ){.    int i
10e70 4f 66 66 3b 0a 20 20 20 20 66 74 73 35 44 61 74  Off;.    fts5Dat
10e80 61 52 65 6c 65 61 73 65 28 70 49 74 65 72 2d 3e  aRelease(pIter->
10e90 70 4c 65 61 66 29 3b 0a 20 20 20 20 70 49 74 65  pLeaf);.    pIte
10ea0 72 2d 3e 70 4c 65 61 66 20 3d 20 70 4c 61 73 74  r->pLeaf = pLast
10eb0 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 69 4c 65  ;.    pIter->iLe
10ec0 61 66 50 67 6e 6f 20 3d 20 70 67 6e 6f 4c 61 73  afPgno = pgnoLas
10ed0 74 3b 0a 20 20 20 20 69 4f 66 66 20 3d 20 66 74  t;.    iOff = ft
10ee0 73 35 4c 65 61 66 46 69 72 73 74 52 6f 77 69 64  s5LeafFirstRowid
10ef0 4f 66 66 28 70 4c 61 73 74 29 3b 0a 20 20 20 20  Off(pLast);.    
10f00 69 4f 66 66 20 2b 3d 20 66 74 73 35 47 65 74 56  iOff += fts5GetV
10f10 61 72 69 6e 74 28 26 70 4c 61 73 74 2d 3e 70 5b  arint(&pLast->p[
10f20 69 4f 66 66 5d 2c 20 28 75 36 34 2a 29 26 70 49  iOff], (u64*)&pI
10f30 74 65 72 2d 3e 69 52 6f 77 69 64 29 3b 0a 20 20  ter->iRowid);.  
10f40 20 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66    pIter->iLeafOf
10f50 66 73 65 74 20 3d 20 69 4f 66 66 3b 0a 0a 20 20  fset = iOff;..  
10f60 20 20 69 66 28 20 66 74 73 35 4c 65 61 66 49 73    if( fts5LeafIs
10f70 54 65 72 6d 6c 65 73 73 28 70 4c 61 73 74 29 20  Termless(pLast) 
10f80 29 7b 0a 20 20 20 20 20 20 70 49 74 65 72 2d 3e  ){.      pIter->
10f90 69 45 6e 64 6f 66 44 6f 63 6c 69 73 74 20 3d 20  iEndofDoclist = 
10fa0 70 4c 61 73 74 2d 3e 6e 6e 2b 31 3b 0a 20 20 20  pLast->nn+1;.   
10fb0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 49   }else{.      pI
10fc0 74 65 72 2d 3e 69 45 6e 64 6f 66 44 6f 63 6c 69  ter->iEndofDocli
10fd0 73 74 20 3d 20 66 74 73 35 4c 65 61 66 46 69 72  st = fts5LeafFir
10fe0 73 74 54 65 72 6d 4f 66 66 28 70 4c 61 73 74 29  stTermOff(pLast)
10ff0 3b 0a 20 20 20 20 7d 0a 0a 20 20 7d 0a 0a 20 20  ;.    }..  }..  
11000 66 74 73 35 53 65 67 49 74 65 72 52 65 76 65 72  fts5SegIterRever
11010 73 65 49 6e 69 74 50 61 67 65 28 70 2c 20 70 49  seInitPage(p, pI
11020 74 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  ter);.}../*.** I
11030 74 65 72 61 74 6f 72 20 70 49 74 65 72 20 63 75  terator pIter cu
11040 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 73 20 74  rrently points t
11050 6f 20 74 68 65 20 66 69 72 73 74 20 72 6f 77 69  o the first rowi
11060 64 20 6f 66 20 61 20 64 6f 63 6c 69 73 74 2e 0a  d of a doclist..
11070 2a 2a 20 54 68 65 72 65 20 69 73 20 61 20 64 6f  ** There is a do
11080 63 6c 69 73 74 2d 69 6e 64 65 78 20 61 73 73 6f  clist-index asso
11090 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20  ciated with the 
110a0 66 69 6e 61 6c 20 74 65 72 6d 20 6f 6e 20 74 68  final term on th
110b0 65 20 63 75 72 72 65 6e 74 20 0a 2a 2a 20 70 61  e current .** pa
110c0 67 65 2e 20 49 66 20 74 68 65 20 63 75 72 72 65  ge. If the curre
110d0 6e 74 20 74 65 72 6d 20 69 73 20 74 68 65 20 6c  nt term is the l
110e0 61 73 74 20 74 65 72 6d 20 6f 6e 20 74 68 65 20  ast term on the 
110f0 70 61 67 65 2c 20 6c 6f 61 64 20 74 68 65 20 0a  page, load the .
11100 2a 2a 20 64 6f 63 6c 69 73 74 2d 69 6e 64 65 78  ** doclist-index
11110 20 66 72 6f 6d 20 64 69 73 6b 20 61 6e 64 20 69   from disk and i
11120 6e 69 74 69 61 6c 69 7a 65 20 61 6e 20 69 74 65  nitialize an ite
11130 72 61 74 6f 72 20 61 74 20 28 70 49 74 65 72 2d  rator at (pIter-
11140 3e 70 44 6c 69 64 78 29 2e 0a 2a 2f 0a 73 74 61  >pDlidx)..*/.sta
11150 74 69 63 20 76 6f 69 64 20 66 74 73 35 53 65 67  tic void fts5Seg
11160 49 74 65 72 4c 6f 61 64 44 6c 69 64 78 28 46 74  IterLoadDlidx(Ft
11170 73 35 49 6e 64 65 78 20 2a 70 2c 20 46 74 73 35  s5Index *p, Fts5
11180 53 65 67 49 74 65 72 20 2a 70 49 74 65 72 29 7b  SegIter *pIter){
11190 0a 20 20 69 6e 74 20 69 53 65 67 20 3d 20 70 49  .  int iSeg = pI
111a0 74 65 72 2d 3e 70 53 65 67 2d 3e 69 53 65 67 69  ter->pSeg->iSegi
111b0 64 3b 0a 20 20 69 6e 74 20 62 52 65 76 20 3d 20  d;.  int bRev = 
111c0 28 70 49 74 65 72 2d 3e 66 6c 61 67 73 20 26 20  (pIter->flags & 
111d0 46 54 53 35 5f 53 45 47 49 54 45 52 5f 52 45 56  FTS5_SEGITER_REV
111e0 45 52 53 45 29 3b 0a 20 20 46 74 73 35 44 61 74  ERSE);.  Fts5Dat
111f0 61 20 2a 70 4c 65 61 66 20 3d 20 70 49 74 65 72  a *pLeaf = pIter
11200 2d 3e 70 4c 65 61 66 3b 20 2f 2a 20 43 75 72 72  ->pLeaf; /* Curr
11210 65 6e 74 20 6c 65 61 66 20 64 61 74 61 20 2a 2f  ent leaf data */
11220 0a 0a 20 20 61 73 73 65 72 74 28 20 70 49 74 65  ..  assert( pIte
11230 72 2d 3e 66 6c 61 67 73 20 26 20 46 54 53 35 5f  r->flags & FTS5_
11240 53 45 47 49 54 45 52 5f 4f 4e 45 54 45 52 4d 20  SEGITER_ONETERM 
11250 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 49 74  );.  assert( pIt
11260 65 72 2d 3e 70 44 6c 69 64 78 3d 3d 30 20 29 3b  er->pDlidx==0 );
11270 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20  ..  /* Check if 
11280 74 68 65 20 63 75 72 72 65 6e 74 20 64 6f 63 6c  the current docl
11290 69 73 74 20 65 6e 64 73 20 6f 6e 20 74 68 69 73  ist ends on this
112a0 20 70 61 67 65 2e 20 49 66 20 69 74 20 64 6f 65   page. If it doe
112b0 73 2c 20 72 65 74 75 72 6e 0a 20 20 2a 2a 20 65  s, return.  ** e
112c0 61 72 6c 79 20 77 69 74 68 6f 75 74 20 6c 6f 61  arly without loa
112d0 64 69 6e 67 20 74 68 65 20 64 6f 63 6c 69 73 74  ding the doclist
112e0 2d 69 6e 64 65 78 20 28 61 73 20 69 74 20 62 65  -index (as it be
112f0 6c 6f 6e 67 73 20 74 6f 20 61 20 64 69 66 66 65  longs to a diffe
11300 72 65 6e 74 0a 20 20 2a 2a 20 74 65 72 6d 2e 20  rent.  ** term. 
11310 2a 2f 0a 20 20 69 66 28 20 70 49 74 65 72 2d 3e  */.  if( pIter->
11320 69 54 65 72 6d 4c 65 61 66 50 67 6e 6f 3d 3d 70  iTermLeafPgno==p
11330 49 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 20  Iter->iLeafPgno 
11340 0a 20 20 20 26 26 20 70 49 74 65 72 2d 3e 69 45  .   && pIter->iE
11350 6e 64 6f 66 44 6f 63 6c 69 73 74 3c 70 4c 65 61  ndofDoclist<pLea
11360 66 2d 3e 73 7a 4c 65 61 66 20 0a 20 20 29 7b 0a  f->szLeaf .  ){.
11370 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
11380 0a 20 20 70 49 74 65 72 2d 3e 70 44 6c 69 64 78  .  pIter->pDlidx
11390 20 3d 20 66 74 73 35 44 6c 69 64 78 49 74 65 72   = fts5DlidxIter
113a0 49 6e 69 74 28 70 2c 20 62 52 65 76 2c 20 69 53  Init(p, bRev, iS
113b0 65 67 2c 20 70 49 74 65 72 2d 3e 69 54 65 72 6d  eg, pIter->iTerm
113c0 4c 65 61 66 50 67 6e 6f 29 3b 0a 7d 0a 0a 2f 2a  LeafPgno);.}../*
113d0 0a 2a 2a 20 54 68 65 20 69 74 65 72 61 74 6f 72  .** The iterator
113e0 20 6f 62 6a 65 63 74 20 70 61 73 73 65 64 20 61   object passed a
113f0 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67  s the second arg
11400 75 6d 65 6e 74 20 63 75 72 72 65 6e 74 6c 79 20  ument currently 
11410 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20 6e 6f 20 76  contains.** no v
11420 61 6c 69 64 20 76 61 6c 75 65 73 20 65 78 63 65  alid values exce
11430 70 74 20 66 6f 72 20 74 68 65 20 46 74 73 35 53  pt for the Fts5S
11440 65 67 49 74 65 72 2e 70 4c 65 61 66 20 6d 65 6d  egIter.pLeaf mem
11450 62 65 72 20 76 61 72 69 61 62 6c 65 2e 20 54 68  ber variable. Th
11460 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 73  is.** function s
11470 65 61 72 63 68 65 73 20 74 68 65 20 6c 65 61 66  earches the leaf
11480 20 70 61 67 65 20 66 6f 72 20 61 20 74 65 72 6d   page for a term
11490 20 6d 61 74 63 68 69 6e 67 20 28 70 54 65 72 6d   matching (pTerm
114a0 2f 6e 54 65 72 6d 29 2e 0a 2a 2a 0a 2a 2a 20 49  /nTerm)..**.** I
114b0 66 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20  f the specified 
114c0 74 65 72 6d 20 69 73 20 66 6f 75 6e 64 20 6f 6e  term is found on
114d0 20 74 68 65 20 70 61 67 65 2c 20 74 68 65 6e 20   the page, then 
114e0 74 68 65 20 69 74 65 72 61 74 6f 72 20 69 73 20  the iterator is 
114f0 6c 65 66 74 0a 2a 2a 20 70 6f 69 6e 74 69 6e 67  left.** pointing
11500 20 74 6f 20 69 74 2e 20 49 66 20 61 72 67 75 6d   to it. If argum
11510 65 6e 74 20 62 47 65 20 69 73 20 7a 65 72 6f 20  ent bGe is zero 
11520 61 6e 64 20 74 68 65 20 74 65 72 6d 20 69 73 20  and the term is 
11530 6e 6f 74 20 66 6f 75 6e 64 2c 0a 2a 2a 20 74 68  not found,.** th
11540 65 20 69 74 65 72 61 74 6f 72 20 69 73 20 6c 65  e iterator is le
11550 66 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 45  ft pointing at E
11560 4f 46 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 62 47 65  OF..**.** If bGe
11570 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 20 61 6e 64   is non-zero and
11580 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20 74   the specified t
11590 65 72 6d 20 69 73 20 6e 6f 74 20 66 6f 75 6e 64  erm is not found
115a0 2c 20 74 68 65 6e 20 74 68 65 0a 2a 2a 20 69 74  , then the.** it
115b0 65 72 61 74 6f 72 20 69 73 20 6c 65 66 74 20 70  erator is left p
115c0 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 65 20 73  ointing to the s
115d0 6d 61 6c 6c 65 73 74 20 74 65 72 6d 20 69 6e 20  mallest term in 
115e0 74 68 65 20 73 65 67 6d 65 6e 74 20 74 68 61 74  the segment that
115f0 0a 2a 2a 20 69 73 20 6c 61 72 67 65 72 20 74 68  .** is larger th
11600 61 6e 20 74 68 65 20 73 70 65 63 69 66 69 65 64  an the specified
11610 20 74 65 72 6d 2c 20 65 76 65 6e 20 69 66 20 74   term, even if t
11620 68 69 73 20 74 65 72 6d 20 69 73 20 6e 6f 74 20  his term is not 
11630 6f 6e 20 74 68 65 0a 2a 2a 20 63 75 72 72 65 6e  on the.** curren
11640 74 20 70 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69  t page..*/.stati
11650 63 20 76 6f 69 64 20 66 74 73 35 4c 65 61 66 53  c void fts5LeafS
11660 65 65 6b 28 0a 20 20 46 74 73 35 49 6e 64 65 78  eek(.  Fts5Index
11670 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
11680 20 20 20 20 20 20 20 2f 2a 20 4c 65 61 76 65 20         /* Leave 
11690 61 6e 79 20 65 72 72 6f 72 20 63 6f 64 65 20 68  any error code h
116a0 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20 62 47 65  ere */.  int bGe
116b0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
116c0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
116d0 20 66 6f 72 20 61 20 3e 3d 20 73 65 61 72 63 68   for a >= search
116e0 20 2a 2f 0a 20 20 46 74 73 35 53 65 67 49 74 65   */.  Fts5SegIte
116f0 72 20 2a 70 49 74 65 72 2c 20 20 20 20 20 20 20  r *pIter,       
11700 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74 6f        /* Iterato
11710 72 20 74 6f 20 73 65 65 6b 20 2a 2f 0a 20 20 63  r to seek */.  c
11720 6f 6e 73 74 20 75 38 20 2a 70 54 65 72 6d 2c 20  onst u8 *pTerm, 
11730 69 6e 74 20 6e 54 65 72 6d 20 20 20 20 20 20 2f  int nTerm      /
11740 2a 20 54 65 72 6d 20 74 6f 20 73 65 61 72 63 68  * Term to search
11750 20 66 6f 72 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74   for */.){.  int
11760 20 69 4f 66 66 3b 0a 20 20 63 6f 6e 73 74 20 75   iOff;.  const u
11770 38 20 2a 61 20 3d 20 70 49 74 65 72 2d 3e 70 4c  8 *a = pIter->pL
11780 65 61 66 2d 3e 70 3b 0a 20 20 69 6e 74 20 73 7a  eaf->p;.  int sz
11790 4c 65 61 66 20 3d 20 70 49 74 65 72 2d 3e 70 4c  Leaf = pIter->pL
117a0 65 61 66 2d 3e 73 7a 4c 65 61 66 3b 0a 20 20 69  eaf->szLeaf;.  i
117b0 6e 74 20 6e 20 3d 20 70 49 74 65 72 2d 3e 70 4c  nt n = pIter->pL
117c0 65 61 66 2d 3e 6e 6e 3b 0a 0a 20 20 75 33 32 20  eaf->nn;..  u32 
117d0 6e 4d 61 74 63 68 20 3d 20 30 3b 0a 20 20 75 33  nMatch = 0;.  u3
117e0 32 20 6e 4b 65 65 70 20 3d 20 30 3b 0a 20 20 75  2 nKeep = 0;.  u
117f0 33 32 20 6e 4e 65 77 20 3d 20 30 3b 0a 20 20 75  32 nNew = 0;.  u
11800 33 32 20 69 54 65 72 6d 4f 66 66 3b 0a 20 20 69  32 iTermOff;.  i
11810 6e 74 20 69 50 67 69 64 78 3b 20 20 20 20 20 20  nt iPgidx;      
11820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
11830 2a 20 43 75 72 72 65 6e 74 20 6f 66 66 73 65 74  * Current offset
11840 20 69 6e 20 70 67 69 64 78 20 2a 2f 0a 20 20 69   in pgidx */.  i
11850 6e 74 20 62 45 6e 64 4f 66 50 61 67 65 20 3d 20  nt bEndOfPage = 
11860 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 2d  0;..  assert( p-
11870 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  >rc==SQLITE_OK )
11880 3b 0a 0a 20 20 69 50 67 69 64 78 20 3d 20 73 7a  ;..  iPgidx = sz
11890 4c 65 61 66 3b 0a 20 20 69 50 67 69 64 78 20 2b  Leaf;.  iPgidx +
118a0 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e 74 33  = fts5GetVarint3
118b0 32 28 26 61 5b 69 50 67 69 64 78 5d 2c 20 69 54  2(&a[iPgidx], iT
118c0 65 72 6d 4f 66 66 29 3b 0a 20 20 69 4f 66 66 20  ermOff);.  iOff 
118d0 3d 20 69 54 65 72 6d 4f 66 66 3b 0a 20 20 69 66  = iTermOff;.  if
118e0 28 20 69 4f 66 66 3e 6e 20 29 7b 0a 20 20 20 20  ( iOff>n ){.    
118f0 70 2d 3e 72 63 20 3d 20 46 54 53 35 5f 43 4f 52  p->rc = FTS5_COR
11900 52 55 50 54 3b 0a 20 20 20 20 72 65 74 75 72 6e  RUPT;.    return
11910 3b 0a 20 20 7d 0a 0a 20 20 77 68 69 6c 65 28 20  ;.  }..  while( 
11920 31 20 29 7b 0a 0a 20 20 20 20 2f 2a 20 46 69 67  1 ){..    /* Fig
11930 75 72 65 20 6f 75 74 20 68 6f 77 20 6d 61 6e 79  ure out how many
11940 20 6e 65 77 20 62 79 74 65 73 20 61 72 65 20 69   new bytes are i
11950 6e 20 74 68 69 73 20 74 65 72 6d 20 2a 2f 0a 20  n this term */. 
11960 20 20 20 66 74 73 35 46 61 73 74 47 65 74 56 61     fts5FastGetVa
11970 72 69 6e 74 33 32 28 61 2c 20 69 4f 66 66 2c 20  rint32(a, iOff, 
11980 6e 4e 65 77 29 3b 0a 20 20 20 20 69 66 28 20 6e  nNew);.    if( n
11990 4b 65 65 70 3c 6e 4d 61 74 63 68 20 29 7b 0a 20  Keep<nMatch ){. 
119a0 20 20 20 20 20 67 6f 74 6f 20 73 65 61 72 63 68       goto search
119b0 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 0a  _failed;.    }..
119c0 20 20 20 20 61 73 73 65 72 74 28 20 6e 4b 65 65      assert( nKee
119d0 70 3e 3d 6e 4d 61 74 63 68 20 29 3b 0a 20 20 20  p>=nMatch );.   
119e0 20 69 66 28 20 6e 4b 65 65 70 3d 3d 6e 4d 61 74   if( nKeep==nMat
119f0 63 68 20 29 7b 0a 20 20 20 20 20 20 75 33 32 20  ch ){.      u32 
11a00 6e 43 6d 70 3b 0a 20 20 20 20 20 20 75 33 32 20  nCmp;.      u32 
11a10 69 3b 0a 20 20 20 20 20 20 6e 43 6d 70 20 3d 20  i;.      nCmp = 
11a20 28 75 33 32 29 4d 49 4e 28 6e 4e 65 77 2c 20 6e  (u32)MIN(nNew, n
11a30 54 65 72 6d 2d 6e 4d 61 74 63 68 29 3b 0a 20 20  Term-nMatch);.  
11a40 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
11a50 43 6d 70 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Cmp; i++){.     
11a60 20 20 20 69 66 28 20 61 5b 69 4f 66 66 2b 69 5d     if( a[iOff+i]
11a70 21 3d 70 54 65 72 6d 5b 6e 4d 61 74 63 68 2b 69  !=pTerm[nMatch+i
11a80 5d 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  ] ) break;.     
11a90 20 7d 0a 20 20 20 20 20 20 6e 4d 61 74 63 68 20   }.      nMatch 
11aa0 2b 3d 20 69 3b 0a 0a 20 20 20 20 20 20 69 66 28  += i;..      if(
11ab0 20 28 75 33 32 29 6e 54 65 72 6d 3d 3d 6e 4d 61   (u32)nTerm==nMa
11ac0 74 63 68 20 29 7b 0a 20 20 20 20 20 20 20 20 69  tch ){.        i
11ad0 66 28 20 69 3d 3d 6e 4e 65 77 20 29 7b 0a 20 20  f( i==nNew ){.  
11ae0 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73 65 61          goto sea
11af0 72 63 68 5f 73 75 63 63 65 73 73 3b 0a 20 20 20  rch_success;.   
11b00 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
11b10 20 20 20 20 20 20 67 6f 74 6f 20 73 65 61 72 63        goto searc
11b20 68 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 20 20  h_failed;.      
11b30 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 20    }.      }else 
11b40 69 66 28 20 69 3c 6e 4e 65 77 20 26 26 20 61 5b  if( i<nNew && a[
11b50 69 4f 66 66 2b 69 5d 3e 70 54 65 72 6d 5b 6e 4d  iOff+i]>pTerm[nM
11b60 61 74 63 68 5d 20 29 7b 0a 20 20 20 20 20 20 20  atch] ){.       
11b70 20 67 6f 74 6f 20 73 65 61 72 63 68 5f 66 61 69   goto search_fai
11b80 6c 65 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  led;.      }.   
11b90 20 7d 0a 0a 20 20 20 20 69 66 28 20 69 50 67 69   }..    if( iPgi
11ba0 64 78 3e 3d 6e 20 29 7b 0a 20 20 20 20 20 20 62  dx>=n ){.      b
11bb0 45 6e 64 4f 66 50 61 67 65 20 3d 20 31 3b 0a 20  EndOfPage = 1;. 
11bc0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
11bd0 7d 0a 0a 20 20 20 20 69 50 67 69 64 78 20 2b 3d  }..    iPgidx +=
11be0 20 66 74 73 35 47 65 74 56 61 72 69 6e 74 33 32   fts5GetVarint32
11bf0 28 26 61 5b 69 50 67 69 64 78 5d 2c 20 6e 4b 65  (&a[iPgidx], nKe
11c00 65 70 29 3b 0a 20 20 20 20 69 54 65 72 6d 4f 66  ep);.    iTermOf
11c10 66 20 2b 3d 20 6e 4b 65 65 70 3b 0a 20 20 20 20  f += nKeep;.    
11c20 69 4f 66 66 20 3d 20 69 54 65 72 6d 4f 66 66 3b  iOff = iTermOff;
11c30 0a 0a 20 20 20 20 69 66 28 20 69 4f 66 66 3e 3d  ..    if( iOff>=
11c40 6e 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 72 63  n ){.      p->rc
11c50 20 3d 20 46 54 53 35 5f 43 4f 52 52 55 50 54 3b   = FTS5_CORRUPT;
11c60 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  .      return;. 
11c70 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 65 61     }..    /* Rea
11c80 64 20 74 68 65 20 6e 4b 65 65 70 20 66 69 65 6c  d the nKeep fiel
11c90 64 20 6f 66 20 74 68 65 20 6e 65 78 74 20 74 65  d of the next te
11ca0 72 6d 2e 20 2a 2f 0a 20 20 20 20 66 74 73 35 46  rm. */.    fts5F
11cb0 61 73 74 47 65 74 56 61 72 69 6e 74 33 32 28 61  astGetVarint32(a
11cc0 2c 20 69 4f 66 66 2c 20 6e 4b 65 65 70 29 3b 0a  , iOff, nKeep);.
11cd0 20 20 7d 0a 0a 20 73 65 61 72 63 68 5f 66 61 69    }.. search_fai
11ce0 6c 65 64 3a 0a 20 20 69 66 28 20 62 47 65 3d 3d  led:.  if( bGe==
11cf0 30 20 29 7b 0a 20 20 20 20 66 74 73 35 44 61 74  0 ){.    fts5Dat
11d00 61 52 65 6c 65 61 73 65 28 70 49 74 65 72 2d 3e  aRelease(pIter->
11d10 70 4c 65 61 66 29 3b 0a 20 20 20 20 70 49 74 65  pLeaf);.    pIte
11d20 72 2d 3e 70 4c 65 61 66 20 3d 20 30 3b 0a 20 20  r->pLeaf = 0;.  
11d30 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 65 6c 73    return;.  }els
11d40 65 20 69 66 28 20 62 45 6e 64 4f 66 50 61 67 65  e if( bEndOfPage
11d50 20 29 7b 0a 20 20 20 20 64 6f 20 7b 0a 20 20 20   ){.    do {.   
11d60 20 20 20 66 74 73 35 53 65 67 49 74 65 72 4e 65     fts5SegIterNe
11d70 78 74 50 61 67 65 28 70 2c 20 70 49 74 65 72 29  xtPage(p, pIter)
11d80 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49 74 65  ;.      if( pIte
11d90 72 2d 3e 70 4c 65 61 66 3d 3d 30 20 29 20 72 65  r->pLeaf==0 ) re
11da0 74 75 72 6e 3b 0a 20 20 20 20 20 20 61 20 3d 20  turn;.      a = 
11db0 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 70 3b  pIter->pLeaf->p;
11dc0 0a 20 20 20 20 20 20 69 66 28 20 66 74 73 35 4c  .      if( fts5L
11dd0 65 61 66 49 73 54 65 72 6d 6c 65 73 73 28 70 49  eafIsTermless(pI
11de0 74 65 72 2d 3e 70 4c 65 61 66 29 3d 3d 30 20 29  ter->pLeaf)==0 )
11df0 7b 0a 20 20 20 20 20 20 20 20 69 50 67 69 64 78  {.        iPgidx
11e00 20 3d 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d   = pIter->pLeaf-
11e10 3e 73 7a 4c 65 61 66 3b 0a 20 20 20 20 20 20 20  >szLeaf;.       
11e20 20 69 50 67 69 64 78 20 2b 3d 20 66 74 73 35 47   iPgidx += fts5G
11e30 65 74 56 61 72 69 6e 74 33 32 28 26 70 49 74 65  etVarint32(&pIte
11e40 72 2d 3e 70 4c 65 61 66 2d 3e 70 5b 69 50 67 69  r->pLeaf->p[iPgi
11e50 64 78 5d 2c 20 69 4f 66 66 29 3b 0a 20 20 20 20  dx], iOff);.    
11e60 20 20 20 20 69 66 28 20 69 4f 66 66 3c 34 20 7c      if( iOff<4 |
11e70 7c 20 69 4f 66 66 3e 3d 70 49 74 65 72 2d 3e 70  | iOff>=pIter->p
11e80 4c 65 61 66 2d 3e 73 7a 4c 65 61 66 20 29 7b 0a  Leaf->szLeaf ){.
11e90 20 20 20 20 20 20 20 20 20 20 70 2d 3e 72 63 20            p->rc 
11ea0 3d 20 46 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a  = FTS5_CORRUPT;.
11eb0 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
11ec0 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
11ed0 0a 20 20 20 20 20 20 20 20 20 20 6e 4b 65 65 70  .          nKeep
11ee0 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
11ef0 69 54 65 72 6d 4f 66 66 20 3d 20 69 4f 66 66 3b  iTermOff = iOff;
11f00 0a 20 20 20 20 20 20 20 20 20 20 6e 20 3d 20 70  .          n = p
11f10 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 6e 6e 3b  Iter->pLeaf->nn;
11f20 0a 20 20 20 20 20 20 20 20 20 20 69 4f 66 66 20  .          iOff 
11f30 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e 74  += fts5GetVarint
11f40 33 32 28 26 61 5b 69 4f 66 66 5d 2c 20 6e 4e 65  32(&a[iOff], nNe
11f50 77 29 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72  w);.          br
11f60 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  eak;.        }. 
11f70 20 20 20 20 20 7d 0a 20 20 20 20 7d 77 68 69 6c       }.    }whil
11f80 65 28 20 31 20 29 3b 0a 20 20 7d 0a 0a 20 73 65  e( 1 );.  }.. se
11f90 61 72 63 68 5f 73 75 63 63 65 73 73 3a 0a 20 20  arch_success:.  
11fa0 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73  pIter->iLeafOffs
11fb0 65 74 20 3d 20 69 4f 66 66 20 2b 20 6e 4e 65 77  et = iOff + nNew
11fc0 3b 0a 20 20 69 66 28 20 70 49 74 65 72 2d 3e 69  ;.  if( pIter->i
11fd0 4c 65 61 66 4f 66 66 73 65 74 3e 6e 20 7c 7c 20  LeafOffset>n || 
11fe0 6e 4e 65 77 3c 31 20 29 7b 0a 20 20 20 20 70 2d  nNew<1 ){.    p-
11ff0 3e 72 63 20 3d 20 46 54 53 35 5f 43 4f 52 52 55  >rc = FTS5_CORRU
12000 50 54 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a  PT;.    return;.
12010 20 20 7d 0a 20 20 70 49 74 65 72 2d 3e 69 54 65    }.  pIter->iTe
12020 72 6d 4c 65 61 66 4f 66 66 73 65 74 20 3d 20 70  rmLeafOffset = p
12030 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65  Iter->iLeafOffse
12040 74 3b 0a 20 20 70 49 74 65 72 2d 3e 69 54 65 72  t;.  pIter->iTer
12050 6d 4c 65 61 66 50 67 6e 6f 20 3d 20 70 49 74 65  mLeafPgno = pIte
12060 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 3b 0a 0a 20  r->iLeafPgno;.. 
12070 20 66 74 73 35 42 75 66 66 65 72 53 65 74 28 26   fts5BufferSet(&
12080 70 2d 3e 72 63 2c 20 26 70 49 74 65 72 2d 3e 74  p->rc, &pIter->t
12090 65 72 6d 2c 20 6e 4b 65 65 70 2c 20 70 54 65 72  erm, nKeep, pTer
120a0 6d 29 3b 0a 20 20 66 74 73 35 42 75 66 66 65 72  m);.  fts5Buffer
120b0 41 70 70 65 6e 64 42 6c 6f 62 28 26 70 2d 3e 72  AppendBlob(&p->r
120c0 63 2c 20 26 70 49 74 65 72 2d 3e 74 65 72 6d 2c  c, &pIter->term,
120d0 20 6e 4e 65 77 2c 20 26 61 5b 69 4f 66 66 5d 29   nNew, &a[iOff])
120e0 3b 0a 0a 20 20 69 66 28 20 69 50 67 69 64 78 3e  ;..  if( iPgidx>
120f0 3d 6e 20 29 7b 0a 20 20 20 20 70 49 74 65 72 2d  =n ){.    pIter-
12100 3e 69 45 6e 64 6f 66 44 6f 63 6c 69 73 74 20 3d  >iEndofDoclist =
12110 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 6e   pIter->pLeaf->n
12120 6e 2b 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  n+1;.  }else{.  
12130 20 20 69 6e 74 20 6e 45 78 74 72 61 3b 0a 20 20    int nExtra;.  
12140 20 20 69 50 67 69 64 78 20 2b 3d 20 66 74 73 35    iPgidx += fts5
12150 47 65 74 56 61 72 69 6e 74 33 32 28 26 61 5b 69  GetVarint32(&a[i
12160 50 67 69 64 78 5d 2c 20 6e 45 78 74 72 61 29 3b  Pgidx], nExtra);
12170 0a 20 20 20 20 70 49 74 65 72 2d 3e 69 45 6e 64  .    pIter->iEnd
12180 6f 66 44 6f 63 6c 69 73 74 20 3d 20 69 54 65 72  ofDoclist = iTer
12190 6d 4f 66 66 20 2b 20 6e 45 78 74 72 61 3b 0a 20  mOff + nExtra;. 
121a0 20 7d 0a 20 20 70 49 74 65 72 2d 3e 69 50 67 69   }.  pIter->iPgi
121b0 64 78 4f 66 66 20 3d 20 69 50 67 69 64 78 3b 0a  dxOff = iPgidx;.
121c0 0a 20 20 66 74 73 35 53 65 67 49 74 65 72 4c 6f  .  fts5SegIterLo
121d0 61 64 52 6f 77 69 64 28 70 2c 20 70 49 74 65 72  adRowid(p, pIter
121e0 29 3b 0a 20 20 66 74 73 35 53 65 67 49 74 65 72  );.  fts5SegIter
121f0 4c 6f 61 64 4e 50 6f 73 28 70 2c 20 70 49 74 65  LoadNPos(p, pIte
12200 72 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 73 71  r);.}..static sq
12210 6c 69 74 65 33 5f 73 74 6d 74 20 2a 66 74 73 35  lite3_stmt *fts5
12220 49 64 78 53 65 6c 65 63 74 53 74 6d 74 28 46 74  IdxSelectStmt(Ft
12230 73 35 49 6e 64 65 78 20 2a 70 29 7b 0a 20 20 69  s5Index *p){.  i
12240 66 28 20 70 2d 3e 70 49 64 78 53 65 6c 65 63 74  f( p->pIdxSelect
12250 3d 3d 30 20 29 7b 0a 20 20 20 20 46 74 73 35 43  ==0 ){.    Fts5C
12260 6f 6e 66 69 67 20 2a 70 43 6f 6e 66 69 67 20 3d  onfig *pConfig =
12270 20 70 2d 3e 70 43 6f 6e 66 69 67 3b 0a 20 20 20   p->pConfig;.   
12280 20 66 74 73 35 49 6e 64 65 78 50 72 65 70 61 72   fts5IndexPrepar
12290 65 53 74 6d 74 28 70 2c 20 26 70 2d 3e 70 49 64  eStmt(p, &p->pId
122a0 78 53 65 6c 65 63 74 2c 20 73 71 6c 69 74 65 33  xSelect, sqlite3
122b0 5f 6d 70 72 69 6e 74 66 28 0a 20 20 20 20 20 20  _mprintf(.      
122c0 20 20 20 20 22 53 45 4c 45 43 54 20 70 67 6e 6f      "SELECT pgno
122d0 20 46 52 4f 4d 20 27 25 71 27 2e 27 25 71 5f 69   FROM '%q'.'%q_i
122e0 64 78 27 20 57 48 45 52 45 20 22 0a 20 20 20 20  dx' WHERE ".    
122f0 20 20 20 20 20 20 22 73 65 67 69 64 3d 3f 20 41        "segid=? A
12300 4e 44 20 74 65 72 6d 3c 3d 3f 20 4f 52 44 45 52  ND term<=? ORDER
12310 20 42 59 20 74 65 72 6d 20 44 45 53 43 20 4c 49   BY term DESC LI
12320 4d 49 54 20 31 22 2c 0a 20 20 20 20 20 20 20 20  MIT 1",.        
12330 20 20 70 43 6f 6e 66 69 67 2d 3e 7a 44 62 2c 20    pConfig->zDb, 
12340 70 43 6f 6e 66 69 67 2d 3e 7a 4e 61 6d 65 0a 20  pConfig->zName. 
12350 20 20 20 29 29 3b 0a 20 20 7d 0a 20 20 72 65 74     ));.  }.  ret
12360 75 72 6e 20 70 2d 3e 70 49 64 78 53 65 6c 65 63  urn p->pIdxSelec
12370 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74  t;.}../*.** Init
12380 69 61 6c 69 7a 65 20 74 68 65 20 6f 62 6a 65 63  ialize the objec
12390 74 20 70 49 74 65 72 20 74 6f 20 70 6f 69 6e 74  t pIter to point
123a0 20 74 6f 20 74 65 72 6d 20 70 54 65 72 6d 2f 6e   to term pTerm/n
123b0 54 65 72 6d 20 77 69 74 68 69 6e 20 73 65 67 6d  Term within segm
123c0 65 6e 74 0a 2a 2a 20 70 53 65 67 2e 20 49 66 20  ent.** pSeg. If 
123d0 74 68 65 72 65 20 69 73 20 6e 6f 20 73 75 63 68  there is no such
123e0 20 74 65 72 6d 20 69 6e 20 74 68 65 20 69 6e 64   term in the ind
123f0 65 78 2c 20 74 68 65 20 69 74 65 72 61 74 6f 72  ex, the iterator
12400 20 69 73 20 73 65 74 20 74 6f 20 45 4f 46 2e 0a   is set to EOF..
12410 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f  **.** If an erro
12420 72 20 6f 63 63 75 72 73 2c 20 46 74 73 35 49 6e  r occurs, Fts5In
12430 64 65 78 2e 72 63 20 69 73 20 73 65 74 20 74 6f  dex.rc is set to
12440 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65 20   an appropriate 
12450 65 72 72 6f 72 20 63 6f 64 65 2e 20 49 66 20 0a  error code. If .
12460 2a 2a 20 61 6e 20 65 72 72 6f 72 20 68 61 73 20  ** an error has 
12470 61 6c 72 65 61 64 79 20 6f 63 63 75 72 72 65 64  already occurred
12480 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74   when this funct
12490 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20 69  ion is called, i
124a0 74 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f  t is a no-op..*/
124b0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
124c0 35 53 65 67 49 74 65 72 53 65 65 6b 49 6e 69 74  5SegIterSeekInit
124d0 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70  (.  Fts5Index *p
124e0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
124f0 20 20 20 20 2f 2a 20 46 54 53 35 20 62 61 63 6b      /* FTS5 back
12500 65 6e 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 75  end */.  const u
12510 38 20 2a 70 54 65 72 6d 2c 20 69 6e 74 20 6e 54  8 *pTerm, int nT
12520 65 72 6d 2c 20 20 20 20 20 2f 2a 20 54 65 72 6d  erm,     /* Term
12530 20 74 6f 20 73 65 65 6b 20 74 6f 20 2a 2f 0a 20   to seek to */. 
12540 20 69 6e 74 20 66 6c 61 67 73 2c 20 20 20 20 20   int flags,     
12550 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12560 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 46 54 53 35   /* Mask of FTS5
12570 49 4e 44 45 58 5f 58 58 58 20 66 6c 61 67 73 20  INDEX_XXX flags 
12580 2a 2f 0a 20 20 46 74 73 35 53 74 72 75 63 74 75  */.  Fts5Structu
12590 72 65 53 65 67 6d 65 6e 74 20 2a 70 53 65 67 2c  reSegment *pSeg,
125a0 20 20 20 20 20 2f 2a 20 44 65 73 63 72 69 70 74       /* Descript
125b0 69 6f 6e 20 6f 66 20 73 65 67 6d 65 6e 74 20 2a  ion of segment *
125c0 2f 0a 20 20 46 74 73 35 53 65 67 49 74 65 72 20  /.  Fts5SegIter 
125d0 2a 70 49 74 65 72 20 20 20 20 20 20 20 20 20 20  *pIter          
125e0 20 20 20 20 2f 2a 20 4f 62 6a 65 63 74 20 74 6f      /* Object to
125f0 20 70 6f 70 75 6c 61 74 65 20 2a 2f 0a 29 7b 0a   populate */.){.
12600 20 20 69 6e 74 20 69 50 67 20 3d 20 31 3b 0a 20    int iPg = 1;. 
12610 20 69 6e 74 20 62 47 65 20 3d 20 28 66 6c 61 67   int bGe = (flag
12620 73 20 26 20 46 54 53 35 49 4e 44 45 58 5f 51 55  s & FTS5INDEX_QU
12630 45 52 59 5f 53 43 41 4e 29 3b 0a 20 20 69 6e 74  ERY_SCAN);.  int
12640 20 62 44 6c 69 64 78 20 3d 20 30 3b 20 20 20 20   bDlidx = 0;    
12650 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
12660 54 72 75 65 20 69 66 20 74 68 65 72 65 20 69 73  True if there is
12670 20 61 20 64 6f 63 6c 69 73 74 2d 69 6e 64 65 78   a doclist-index
12680 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 74   */.  sqlite3_st
12690 6d 74 20 2a 70 49 64 78 53 65 6c 65 63 74 20 3d  mt *pIdxSelect =
126a0 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 62   0;..  assert( b
126b0 47 65 3d 3d 30 20 7c 7c 20 28 66 6c 61 67 73 20  Ge==0 || (flags 
126c0 26 20 46 54 53 35 49 4e 44 45 58 5f 51 55 45 52  & FTS5INDEX_QUER
126d0 59 5f 44 45 53 43 29 3d 3d 30 20 29 3b 0a 20 20  Y_DESC)==0 );.  
126e0 61 73 73 65 72 74 28 20 70 54 65 72 6d 20 26 26  assert( pTerm &&
126f0 20 6e 54 65 72 6d 20 29 3b 0a 20 20 6d 65 6d 73   nTerm );.  mems
12700 65 74 28 70 49 74 65 72 2c 20 30 2c 20 73 69 7a  et(pIter, 0, siz
12710 65 6f 66 28 2a 70 49 74 65 72 29 29 3b 0a 20 20  eof(*pIter));.  
12720 70 49 74 65 72 2d 3e 70 53 65 67 20 3d 20 70 53  pIter->pSeg = pS
12730 65 67 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 62  eg;..  /* This b
12740 6c 6f 63 6b 20 73 65 74 73 20 73 74 61 63 6b 20  lock sets stack 
12750 76 61 72 69 61 62 6c 65 20 69 50 67 20 74 6f 20  variable iPg to 
12760 74 68 65 20 6c 65 61 66 20 70 61 67 65 20 6e 75  the leaf page nu
12770 6d 62 65 72 20 74 68 61 74 20 6d 61 79 0a 20 20  mber that may.  
12780 2a 2a 20 63 6f 6e 74 61 69 6e 20 74 65 72 6d 20  ** contain term 
12790 28 70 54 65 72 6d 2f 6e 54 65 72 6d 29 2c 20 69  (pTerm/nTerm), i
127a0 66 20 69 74 20 69 73 20 70 72 65 73 65 6e 74 20  f it is present 
127b0 69 6e 20 74 68 65 20 73 65 67 6d 65 6e 74 2e 20  in the segment. 
127c0 2a 2f 0a 20 20 70 49 64 78 53 65 6c 65 63 74 20  */.  pIdxSelect 
127d0 3d 20 66 74 73 35 49 64 78 53 65 6c 65 63 74 53  = fts5IdxSelectS
127e0 74 6d 74 28 70 29 3b 0a 20 20 69 66 28 20 70 2d  tmt(p);.  if( p-
127f0 3e 72 63 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  >rc ) return;.  
12800 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74  sqlite3_bind_int
12810 28 70 49 64 78 53 65 6c 65 63 74 2c 20 31 2c 20  (pIdxSelect, 1, 
12820 70 53 65 67 2d 3e 69 53 65 67 69 64 29 3b 0a 20  pSeg->iSegid);. 
12830 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 62 6c   sqlite3_bind_bl
12840 6f 62 28 70 49 64 78 53 65 6c 65 63 74 2c 20 32  ob(pIdxSelect, 2
12850 2c 20 70 54 65 72 6d 2c 20 6e 54 65 72 6d 2c 20  , pTerm, nTerm, 
12860 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a  SQLITE_STATIC);.
12870 20 20 69 66 28 20 53 51 4c 49 54 45 5f 52 4f 57    if( SQLITE_ROW
12880 3d 3d 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70  ==sqlite3_step(p
12890 49 64 78 53 65 6c 65 63 74 29 20 29 7b 0a 20 20  IdxSelect) ){.  
128a0 20 20 69 36 34 20 76 61 6c 20 3d 20 73 71 6c 69    i64 val = sqli
128b0 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70  te3_column_int(p
128c0 49 64 78 53 65 6c 65 63 74 2c 20 30 29 3b 0a 20  IdxSelect, 0);. 
128d0 20 20 20 69 50 67 20 3d 20 28 69 6e 74 29 28 76     iPg = (int)(v
128e0 61 6c 3e 3e 31 29 3b 0a 20 20 20 20 62 44 6c 69  al>>1);.    bDli
128f0 64 78 20 3d 20 28 76 61 6c 20 26 20 30 78 30 30  dx = (val & 0x00
12900 30 31 29 3b 0a 20 20 7d 0a 20 20 70 2d 3e 72 63  01);.  }.  p->rc
12910 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74   = sqlite3_reset
12920 28 70 49 64 78 53 65 6c 65 63 74 29 3b 0a 20 20  (pIdxSelect);.  
12930 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 6e 75 6c  sqlite3_bind_nul
12940 6c 28 70 49 64 78 53 65 6c 65 63 74 2c 20 32 29  l(pIdxSelect, 2)
12950 3b 0a 0a 20 20 69 66 28 20 69 50 67 3c 70 53 65  ;..  if( iPg<pSe
12960 67 2d 3e 70 67 6e 6f 46 69 72 73 74 20 29 7b 0a  g->pgnoFirst ){.
12970 20 20 20 20 69 50 67 20 3d 20 70 53 65 67 2d 3e      iPg = pSeg->
12980 70 67 6e 6f 46 69 72 73 74 3b 0a 20 20 20 20 62  pgnoFirst;.    b
12990 44 6c 69 64 78 20 3d 20 30 3b 0a 20 20 7d 0a 0a  Dlidx = 0;.  }..
129a0 20 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 50 67    pIter->iLeafPg
129b0 6e 6f 20 3d 20 69 50 67 20 2d 20 31 3b 0a 20 20  no = iPg - 1;.  
129c0 66 74 73 35 53 65 67 49 74 65 72 4e 65 78 74 50  fts5SegIterNextP
129d0 61 67 65 28 70 2c 20 70 49 74 65 72 29 3b 0a 0a  age(p, pIter);..
129e0 20 20 69 66 28 20 70 49 74 65 72 2d 3e 70 4c 65    if( pIter->pLe
129f0 61 66 20 29 7b 0a 20 20 20 20 66 74 73 35 4c 65  af ){.    fts5Le
12a00 61 66 53 65 65 6b 28 70 2c 20 62 47 65 2c 20 70  afSeek(p, bGe, p
12a10 49 74 65 72 2c 20 70 54 65 72 6d 2c 20 6e 54 65  Iter, pTerm, nTe
12a20 72 6d 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  rm);.  }..  if( 
12a30 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
12a40 20 26 26 20 62 47 65 3d 3d 30 20 29 7b 0a 20 20   && bGe==0 ){.  
12a50 20 20 70 49 74 65 72 2d 3e 66 6c 61 67 73 20 7c    pIter->flags |
12a60 3d 20 46 54 53 35 5f 53 45 47 49 54 45 52 5f 4f  = FTS5_SEGITER_O
12a70 4e 45 54 45 52 4d 3b 0a 20 20 20 20 69 66 28 20  NETERM;.    if( 
12a80 70 49 74 65 72 2d 3e 70 4c 65 61 66 20 29 7b 0a  pIter->pLeaf ){.
12a90 20 20 20 20 20 20 69 66 28 20 66 6c 61 67 73 20        if( flags 
12aa0 26 20 46 54 53 35 49 4e 44 45 58 5f 51 55 45 52  & FTS5INDEX_QUER
12ab0 59 5f 44 45 53 43 20 29 7b 0a 20 20 20 20 20 20  Y_DESC ){.      
12ac0 20 20 70 49 74 65 72 2d 3e 66 6c 61 67 73 20 7c    pIter->flags |
12ad0 3d 20 46 54 53 35 5f 53 45 47 49 54 45 52 5f 52  = FTS5_SEGITER_R
12ae0 45 56 45 52 53 45 3b 0a 20 20 20 20 20 20 7d 0a  EVERSE;.      }.
12af0 20 20 20 20 20 20 69 66 28 20 62 44 6c 69 64 78        if( bDlidx
12b00 20 29 7b 0a 20 20 20 20 20 20 20 20 66 74 73 35   ){.        fts5
12b10 53 65 67 49 74 65 72 4c 6f 61 64 44 6c 69 64 78  SegIterLoadDlidx
12b20 28 70 2c 20 70 49 74 65 72 29 3b 0a 20 20 20 20  (p, pIter);.    
12b30 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 66 6c    }.      if( fl
12b40 61 67 73 20 26 20 46 54 53 35 49 4e 44 45 58 5f  ags & FTS5INDEX_
12b50 51 55 45 52 59 5f 44 45 53 43 20 29 7b 0a 20 20  QUERY_DESC ){.  
12b60 20 20 20 20 20 20 66 74 73 35 53 65 67 49 74 65        fts5SegIte
12b70 72 52 65 76 65 72 73 65 28 70 2c 20 70 49 74 65  rReverse(p, pIte
12b80 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  r);.      }.    
12b90 7d 0a 20 20 7d 0a 0a 20 20 66 74 73 35 53 65 67  }.  }..  fts5Seg
12ba0 49 74 65 72 53 65 74 4e 65 78 74 28 70 2c 20 70  IterSetNext(p, p
12bb0 49 74 65 72 29 3b 0a 0a 20 20 2f 2a 20 45 69 74  Iter);..  /* Eit
12bc0 68 65 72 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  her:.  **.  **  
12bd0 20 31 29 20 61 6e 20 65 72 72 6f 72 20 68 61 73   1) an error has
12be0 20 6f 63 63 75 72 72 65 64 2c 20 6f 72 0a 20 20   occurred, or.  
12bf0 2a 2a 20 20 20 32 29 20 74 68 65 20 69 74 65 72  **   2) the iter
12c00 61 74 6f 72 20 70 6f 69 6e 74 73 20 74 6f 20 45  ator points to E
12c10 4f 46 2c 20 6f 72 0a 20 20 2a 2a 20 20 20 33 29  OF, or.  **   3)
12c20 20 74 68 65 20 69 74 65 72 61 74 6f 72 20 70 6f   the iterator po
12c30 69 6e 74 73 20 74 6f 20 61 6e 20 65 6e 74 72 79  ints to an entry
12c40 20 77 69 74 68 20 74 65 72 6d 20 28 70 54 65 72   with term (pTer
12c50 6d 2f 6e 54 65 72 6d 29 2c 20 6f 72 0a 20 20 2a  m/nTerm), or.  *
12c60 2a 20 20 20 34 29 20 74 68 65 20 46 54 53 35 49  *   4) the FTS5I
12c70 4e 44 45 58 5f 51 55 45 52 59 5f 53 43 41 4e 20  NDEX_QUERY_SCAN 
12c80 66 6c 61 67 20 77 61 73 20 73 65 74 20 61 6e 64  flag was set and
12c90 20 74 68 65 20 69 74 65 72 61 74 6f 72 20 70 6f   the iterator po
12ca0 69 6e 74 73 0a 20 20 2a 2a 20 20 20 20 20 20 74  ints.  **      t
12cb0 6f 20 61 6e 20 65 6e 74 72 79 20 77 69 74 68 20  o an entry with 
12cc0 61 20 74 65 72 6d 20 67 72 65 61 74 65 72 20 74  a term greater t
12cd0 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20  han or equal to 
12ce0 28 70 54 65 72 6d 2f 6e 54 65 72 6d 29 2e 0a 20  (pTerm/nTerm).. 
12cf0 20 2a 2f 0a 20 20 61 73 73 65 72 74 5f 6e 63 28   */.  assert_nc(
12d00 20 70 2d 3e 72 63 21 3d 53 51 4c 49 54 45 5f 4f   p->rc!=SQLITE_O
12d10 4b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  K               
12d20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12d30 20 20 20 20 20 20 20 20 2f 2a 20 31 20 2a 2f 0a          /* 1 */.
12d40 20 20 20 7c 7c 20 70 49 74 65 72 2d 3e 70 4c 65     || pIter->pLe
12d50 61 66 3d 3d 30 20 20 20 20 20 20 20 20 20 20 20  af==0           
12d60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12d70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12d80 20 20 20 20 2f 2a 20 32 20 2a 2f 0a 20 20 20 7c      /* 2 */.   |
12d90 7c 20 66 74 73 35 42 75 66 66 65 72 43 6f 6d 70  | fts5BufferComp
12da0 61 72 65 42 6c 6f 62 28 26 70 49 74 65 72 2d 3e  areBlob(&pIter->
12db0 74 65 72 6d 2c 20 70 54 65 72 6d 2c 20 6e 54 65  term, pTerm, nTe
12dc0 72 6d 29 3d 3d 30 20 20 20 20 20 20 20 20 20 20  rm)==0          
12dd0 2f 2a 20 33 20 2a 2f 0a 20 20 20 7c 7c 20 28 62  /* 3 */.   || (b
12de0 47 65 20 26 26 20 66 74 73 35 42 75 66 66 65 72  Ge && fts5Buffer
12df0 43 6f 6d 70 61 72 65 42 6c 6f 62 28 26 70 49 74  CompareBlob(&pIt
12e00 65 72 2d 3e 74 65 72 6d 2c 20 70 54 65 72 6d 2c  er->term, pTerm,
12e10 20 6e 54 65 72 6d 29 3e 30 29 20 20 2f 2a 20 34   nTerm)>0)  /* 4
12e20 20 2a 2f 0a 20 20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a   */.  );.}../*.*
12e30 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65  * Initialize the
12e40 20 6f 62 6a 65 63 74 20 70 49 74 65 72 20 74 6f   object pIter to
12e50 20 70 6f 69 6e 74 20 74 6f 20 74 65 72 6d 20 70   point to term p
12e60 54 65 72 6d 2f 6e 54 65 72 6d 20 77 69 74 68 69  Term/nTerm withi
12e70 6e 20 74 68 65 0a 2a 2a 20 69 6e 2d 6d 65 6d 6f  n the.** in-memo
12e80 72 79 20 68 61 73 68 20 74 61 62 6c 65 2e 20 49  ry hash table. I
12e90 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 73 75  f there is no su
12ea0 63 68 20 74 65 72 6d 20 69 6e 20 74 68 65 20 68  ch term in the h
12eb0 61 73 68 2d 74 61 62 6c 65 2c 20 74 68 65 20 0a  ash-table, the .
12ec0 2a 2a 20 69 74 65 72 61 74 6f 72 20 69 73 20 73  ** iterator is s
12ed0 65 74 20 74 6f 20 45 4f 46 2e 0a 2a 2a 0a 2a 2a  et to EOF..**.**
12ee0 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
12ef0 75 72 73 2c 20 46 74 73 35 49 6e 64 65 78 2e 72  urs, Fts5Index.r
12f00 63 20 69 73 20 73 65 74 20 74 6f 20 61 6e 20 61  c is set to an a
12f10 70 70 72 6f 70 72 69 61 74 65 20 65 72 72 6f 72  ppropriate error
12f20 20 63 6f 64 65 2e 20 49 66 20 0a 2a 2a 20 61 6e   code. If .** an
12f30 20 65 72 72 6f 72 20 68 61 73 20 61 6c 72 65 61   error has alrea
12f40 64 79 20 6f 63 63 75 72 72 65 64 20 77 68 65 6e  dy occurred when
12f50 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
12f60 73 20 63 61 6c 6c 65 64 2c 20 69 74 20 69 73 20  s called, it is 
12f70 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74  a no-op..*/.stat
12f80 69 63 20 76 6f 69 64 20 66 74 73 35 53 65 67 49  ic void fts5SegI
12f90 74 65 72 48 61 73 68 49 6e 69 74 28 0a 20 20 46  terHashInit(.  F
12fa0 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20  ts5Index *p,    
12fb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
12fc0 2a 20 46 54 53 35 20 62 61 63 6b 65 6e 64 20 2a  * FTS5 backend *
12fd0 2f 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 70 54  /.  const u8 *pT
12fe0 65 72 6d 2c 20 69 6e 74 20 6e 54 65 72 6d 2c 20  erm, int nTerm, 
12ff0 20 20 20 20 2f 2a 20 54 65 72 6d 20 74 6f 20 73      /* Term to s
13000 65 65 6b 20 74 6f 20 2a 2f 0a 20 20 69 6e 74 20  eek to */.  int 
13010 66 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20 20  flags,          
13020 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
13030 61 73 6b 20 6f 66 20 46 54 53 35 49 4e 44 45 58  ask of FTS5INDEX
13040 5f 58 58 58 20 66 6c 61 67 73 20 2a 2f 0a 20 20  _XXX flags */.  
13050 46 74 73 35 53 65 67 49 74 65 72 20 2a 70 49 74  Fts5SegIter *pIt
13060 65 72 20 20 20 20 20 20 20 20 20 20 20 20 20 20  er              
13070 2f 2a 20 4f 62 6a 65 63 74 20 74 6f 20 70 6f 70  /* Object to pop
13080 75 6c 61 74 65 20 2a 2f 0a 29 7b 0a 20 20 63 6f  ulate */.){.  co
13090 6e 73 74 20 75 38 20 2a 70 4c 69 73 74 20 3d 20  nst u8 *pList = 
130a0 30 3b 0a 20 20 69 6e 74 20 6e 4c 69 73 74 20 3d  0;.  int nList =
130b0 20 30 3b 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a   0;.  const u8 *
130c0 7a 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 20 3d  z = 0;.  int n =
130d0 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70   0;..  assert( p
130e0 2d 3e 70 48 61 73 68 20 29 3b 0a 20 20 61 73 73  ->pHash );.  ass
130f0 65 72 74 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49  ert( p->rc==SQLI
13100 54 45 5f 4f 4b 20 29 3b 0a 0a 20 20 69 66 28 20  TE_OK );..  if( 
13110 70 54 65 72 6d 3d 3d 30 20 7c 7c 20 28 66 6c 61  pTerm==0 || (fla
13120 67 73 20 26 20 46 54 53 35 49 4e 44 45 58 5f 51  gs & FTS5INDEX_Q
13130 55 45 52 59 5f 53 43 41 4e 29 20 29 7b 0a 20 20  UERY_SCAN) ){.  
13140 20 20 70 2d 3e 72 63 20 3d 20 73 71 6c 69 74 65    p->rc = sqlite
13150 33 46 74 73 35 48 61 73 68 53 63 61 6e 49 6e 69  3Fts5HashScanIni
13160 74 28 70 2d 3e 70 48 61 73 68 2c 20 28 63 6f 6e  t(p->pHash, (con
13170 73 74 20 63 68 61 72 2a 29 70 54 65 72 6d 2c 20  st char*)pTerm, 
13180 6e 54 65 72 6d 29 3b 0a 20 20 20 20 73 71 6c 69  nTerm);.    sqli
13190 74 65 33 46 74 73 35 48 61 73 68 53 63 61 6e 45  te3Fts5HashScanE
131a0 6e 74 72 79 28 70 2d 3e 70 48 61 73 68 2c 20 28  ntry(p->pHash, (
131b0 63 6f 6e 73 74 20 63 68 61 72 2a 2a 29 26 7a 2c  const char**)&z,
131c0 20 26 70 4c 69 73 74 2c 20 26 6e 4c 69 73 74 29   &pList, &nList)
131d0 3b 0a 20 20 20 20 6e 20 3d 20 28 7a 20 3f 20 28  ;.    n = (z ? (
131e0 69 6e 74 29 73 74 72 6c 65 6e 28 28 63 6f 6e 73  int)strlen((cons
131f0 74 20 63 68 61 72 2a 29 7a 29 20 3a 20 30 29 3b  t char*)z) : 0);
13200 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 49  .  }else{.    pI
13210 74 65 72 2d 3e 66 6c 61 67 73 20 7c 3d 20 46 54  ter->flags |= FT
13220 53 35 5f 53 45 47 49 54 45 52 5f 4f 4e 45 54 45  S5_SEGITER_ONETE
13230 52 4d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 46  RM;.    sqlite3F
13240 74 73 35 48 61 73 68 51 75 65 72 79 28 70 2d 3e  ts5HashQuery(p->
13250 70 48 61 73 68 2c 20 28 63 6f 6e 73 74 20 63 68  pHash, (const ch
13260 61 72 2a 29 70 54 65 72 6d 2c 20 6e 54 65 72 6d  ar*)pTerm, nTerm
13270 2c 20 26 70 4c 69 73 74 2c 20 26 6e 4c 69 73 74  , &pList, &nList
13280 29 3b 0a 20 20 20 20 7a 20 3d 20 70 54 65 72 6d  );.    z = pTerm
13290 3b 0a 20 20 20 20 6e 20 3d 20 6e 54 65 72 6d 3b  ;.    n = nTerm;
132a0 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 4c 69 73  .  }..  if( pLis
132b0 74 20 29 7b 0a 20 20 20 20 46 74 73 35 44 61 74  t ){.    Fts5Dat
132c0 61 20 2a 70 4c 65 61 66 3b 0a 20 20 20 20 73 71  a *pLeaf;.    sq
132d0 6c 69 74 65 33 46 74 73 35 42 75 66 66 65 72 53  lite3Fts5BufferS
132e0 65 74 28 26 70 2d 3e 72 63 2c 20 26 70 49 74 65  et(&p->rc, &pIte
132f0 72 2d 3e 74 65 72 6d 2c 20 6e 2c 20 7a 29 3b 0a  r->term, n, z);.
13300 20 20 20 20 70 4c 65 61 66 20 3d 20 66 74 73 35      pLeaf = fts5
13310 49 64 78 4d 61 6c 6c 6f 63 28 70 2c 20 73 69 7a  IdxMalloc(p, siz
13320 65 6f 66 28 46 74 73 35 44 61 74 61 29 29 3b 0a  eof(Fts5Data));.
13330 20 20 20 20 69 66 28 20 70 4c 65 61 66 3d 3d 30      if( pLeaf==0
13340 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 70   ) return;.    p
13350 4c 65 61 66 2d 3e 70 20 3d 20 28 75 38 2a 29 70  Leaf->p = (u8*)p
13360 4c 69 73 74 3b 0a 20 20 20 20 70 4c 65 61 66 2d  List;.    pLeaf-
13370 3e 6e 6e 20 3d 20 70 4c 65 61 66 2d 3e 73 7a 4c  >nn = pLeaf->szL
13380 65 61 66 20 3d 20 6e 4c 69 73 74 3b 0a 20 20 20  eaf = nList;.   
13390 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 20 3d 20   pIter->pLeaf = 
133a0 70 4c 65 61 66 3b 0a 20 20 20 20 70 49 74 65 72  pLeaf;.    pIter
133b0 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 20 3d 20  ->iLeafOffset = 
133c0 66 74 73 35 47 65 74 56 61 72 69 6e 74 28 70 4c  fts5GetVarint(pL
133d0 65 61 66 2d 3e 70 2c 20 28 75 36 34 2a 29 26 70  eaf->p, (u64*)&p
133e0 49 74 65 72 2d 3e 69 52 6f 77 69 64 29 3b 0a 20  Iter->iRowid);. 
133f0 20 20 20 70 49 74 65 72 2d 3e 69 45 6e 64 6f 66     pIter->iEndof
13400 44 6f 63 6c 69 73 74 20 3d 20 70 4c 65 61 66 2d  Doclist = pLeaf-
13410 3e 6e 6e 3b 0a 0a 20 20 20 20 69 66 28 20 66 6c  >nn;..    if( fl
13420 61 67 73 20 26 20 46 54 53 35 49 4e 44 45 58 5f  ags & FTS5INDEX_
13430 51 55 45 52 59 5f 44 45 53 43 20 29 7b 0a 20 20  QUERY_DESC ){.  
13440 20 20 20 20 70 49 74 65 72 2d 3e 66 6c 61 67 73      pIter->flags
13450 20 7c 3d 20 46 54 53 35 5f 53 45 47 49 54 45 52   |= FTS5_SEGITER
13460 5f 52 45 56 45 52 53 45 3b 0a 20 20 20 20 20 20  _REVERSE;.      
13470 66 74 73 35 53 65 67 49 74 65 72 52 65 76 65 72  fts5SegIterRever
13480 73 65 49 6e 69 74 50 61 67 65 28 70 2c 20 70 49  seInitPage(p, pI
13490 74 65 72 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  ter);.    }else{
134a0 0a 20 20 20 20 20 20 66 74 73 35 53 65 67 49 74  .      fts5SegIt
134b0 65 72 4c 6f 61 64 4e 50 6f 73 28 70 2c 20 70 49  erLoadNPos(p, pI
134c0 74 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ter);.    }.  }.
134d0 0a 20 20 66 74 73 35 53 65 67 49 74 65 72 53 65  .  fts5SegIterSe
134e0 74 4e 65 78 74 28 70 2c 20 70 49 74 65 72 29 3b  tNext(p, pIter);
134f0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 5a 65 72 6f 20 74  .}../*.** Zero t
13500 68 65 20 69 74 65 72 61 74 6f 72 20 70 61 73 73  he iterator pass
13510 65 64 20 61 73 20 74 68 65 20 6f 6e 6c 79 20 61  ed as the only a
13520 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74  rgument..*/.stat
13530 69 63 20 76 6f 69 64 20 66 74 73 35 53 65 67 49  ic void fts5SegI
13540 74 65 72 43 6c 65 61 72 28 46 74 73 35 53 65 67  terClear(Fts5Seg
13550 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a 20 20  Iter *pIter){.  
13560 66 74 73 35 42 75 66 66 65 72 46 72 65 65 28 26  fts5BufferFree(&
13570 70 49 74 65 72 2d 3e 74 65 72 6d 29 3b 0a 20 20  pIter->term);.  
13580 66 74 73 35 44 61 74 61 52 65 6c 65 61 73 65 28  fts5DataRelease(
13590 70 49 74 65 72 2d 3e 70 4c 65 61 66 29 3b 0a 20  pIter->pLeaf);. 
135a0 20 66 74 73 35 44 61 74 61 52 65 6c 65 61 73 65   fts5DataRelease
135b0 28 70 49 74 65 72 2d 3e 70 4e 65 78 74 4c 65 61  (pIter->pNextLea
135c0 66 29 3b 0a 20 20 66 74 73 35 44 6c 69 64 78 49  f);.  fts5DlidxI
135d0 74 65 72 46 72 65 65 28 70 49 74 65 72 2d 3e 70  terFree(pIter->p
135e0 44 6c 69 64 78 29 3b 0a 20 20 73 71 6c 69 74 65  Dlidx);.  sqlite
135f0 33 5f 66 72 65 65 28 70 49 74 65 72 2d 3e 61 52  3_free(pIter->aR
13600 6f 77 69 64 4f 66 66 73 65 74 29 3b 0a 20 20 6d  owidOffset);.  m
13610 65 6d 73 65 74 28 70 49 74 65 72 2c 20 30 2c 20  emset(pIter, 0, 
13620 73 69 7a 65 6f 66 28 46 74 73 35 53 65 67 49 74  sizeof(Fts5SegIt
13630 65 72 29 29 3b 0a 7d 0a 0a 23 69 66 64 65 66 20  er));.}..#ifdef 
13640 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 0a 2f 2a  SQLITE_DEBUG../*
13650 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
13660 6e 20 69 73 20 75 73 65 64 20 61 73 20 70 61 72  n is used as par
13670 74 20 6f 66 20 74 68 65 20 62 69 67 20 61 73 73  t of the big ass
13680 65 72 74 28 29 20 70 72 6f 63 65 64 75 72 65 20  ert() procedure 
13690 69 6d 70 6c 65 6d 65 6e 74 65 64 20 62 79 0a 2a  implemented by.*
136a0 2a 20 66 74 73 35 41 73 73 65 72 74 4d 75 6c 74  * fts5AssertMult
136b0 69 49 74 65 72 53 65 74 75 70 28 29 2e 20 49 74  iIterSetup(). It
136c0 20 65 6e 73 75 72 65 73 20 74 68 61 74 20 74 68   ensures that th
136d0 65 20 72 65 73 75 6c 74 20 63 75 72 72 65 6e 74  e result current
136e0 6c 79 20 73 74 6f 72 65 64 0a 2a 2a 20 69 6e 20  ly stored.** in 
136f0 2a 70 52 65 73 20 69 73 20 74 68 65 20 63 6f 72  *pRes is the cor
13700 72 65 63 74 20 72 65 73 75 6c 74 20 6f 66 20 63  rect result of c
13710 6f 6d 70 61 72 69 6e 67 20 74 68 65 20 63 75 72  omparing the cur
13720 72 65 6e 74 20 70 6f 73 69 74 69 6f 6e 73 20 6f  rent positions o
13730 66 20 74 68 65 0a 2a 2a 20 74 77 6f 20 69 74 65  f the.** two ite
13740 72 61 74 6f 72 73 2e 0a 2a 2f 0a 73 74 61 74 69  rators..*/.stati
13750 63 20 76 6f 69 64 20 66 74 73 35 41 73 73 65 72  c void fts5Asser
13760 74 43 6f 6d 70 61 72 69 73 6f 6e 52 65 73 75 6c  tComparisonResul
13770 74 28 0a 20 20 46 74 73 35 49 74 65 72 20 2a 70  t(.  Fts5Iter *p
13780 49 74 65 72 2c 20 0a 20 20 46 74 73 35 53 65 67  Iter, .  Fts5Seg
13790 49 74 65 72 20 2a 70 31 2c 0a 20 20 46 74 73 35  Iter *p1,.  Fts5
137a0 53 65 67 49 74 65 72 20 2a 70 32 2c 0a 20 20 46  SegIter *p2,.  F
137b0 74 73 35 43 52 65 73 75 6c 74 20 2a 70 52 65 73  ts5CResult *pRes
137c0 0a 29 7b 0a 20 20 69 6e 74 20 69 31 20 3d 20 70  .){.  int i1 = p
137d0 31 20 2d 20 70 49 74 65 72 2d 3e 61 53 65 67 3b  1 - pIter->aSeg;
137e0 0a 20 20 69 6e 74 20 69 32 20 3d 20 70 32 20 2d  .  int i2 = p2 -
137f0 20 70 49 74 65 72 2d 3e 61 53 65 67 3b 0a 0a 20   pIter->aSeg;.. 
13800 20 69 66 28 20 70 31 2d 3e 70 4c 65 61 66 20 7c   if( p1->pLeaf |
13810 7c 20 70 32 2d 3e 70 4c 65 61 66 20 29 7b 0a 20  | p2->pLeaf ){. 
13820 20 20 20 69 66 28 20 70 31 2d 3e 70 4c 65 61 66     if( p1->pLeaf
13830 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 61 73 73  ==0 ){.      ass
13840 65 72 74 28 20 70 52 65 73 2d 3e 69 46 69 72 73  ert( pRes->iFirs
13850 74 3d 3d 69 32 20 29 3b 0a 20 20 20 20 7d 65 6c  t==i2 );.    }el
13860 73 65 20 69 66 28 20 70 32 2d 3e 70 4c 65 61 66  se if( p2->pLeaf
13870 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 61 73 73  ==0 ){.      ass
13880 65 72 74 28 20 70 52 65 73 2d 3e 69 46 69 72 73  ert( pRes->iFirs
13890 74 3d 3d 69 31 20 29 3b 0a 20 20 20 20 7d 65 6c  t==i1 );.    }el
138a0 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 4d  se{.      int nM
138b0 69 6e 20 3d 20 4d 49 4e 28 70 31 2d 3e 74 65 72  in = MIN(p1->ter
138c0 6d 2e 6e 2c 20 70 32 2d 3e 74 65 72 6d 2e 6e 29  m.n, p2->term.n)
138d0 3b 0a 20 20 20 20 20 20 69 6e 74 20 72 65 73 20  ;.      int res 
138e0 3d 20 66 74 73 35 4d 65 6d 63 6d 70 28 70 31 2d  = fts5Memcmp(p1-
138f0 3e 74 65 72 6d 2e 70 2c 20 70 32 2d 3e 74 65 72  >term.p, p2->ter
13900 6d 2e 70 2c 20 6e 4d 69 6e 29 3b 0a 20 20 20 20  m.p, nMin);.    
13910 20 20 69 66 28 20 72 65 73 3d 3d 30 20 29 20 72    if( res==0 ) r
13920 65 73 20 3d 20 70 31 2d 3e 74 65 72 6d 2e 6e 20  es = p1->term.n 
13930 2d 20 70 32 2d 3e 74 65 72 6d 2e 6e 3b 0a 0a 20  - p2->term.n;.. 
13940 20 20 20 20 20 69 66 28 20 72 65 73 3d 3d 30 20       if( res==0 
13950 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ){.        asser
13960 74 28 20 70 52 65 73 2d 3e 62 54 65 72 6d 45 71  t( pRes->bTermEq
13970 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 20 20 61  ==1 );.        a
13980 73 73 65 72 74 28 20 70 31 2d 3e 69 52 6f 77 69  ssert( p1->iRowi
13990 64 21 3d 70 32 2d 3e 69 52 6f 77 69 64 20 29 3b  d!=p2->iRowid );
139a0 0a 20 20 20 20 20 20 20 20 72 65 73 20 3d 20 28  .        res = (
139b0 28 70 31 2d 3e 69 52 6f 77 69 64 20 3e 20 70 32  (p1->iRowid > p2
139c0 2d 3e 69 52 6f 77 69 64 29 3d 3d 70 49 74 65 72  ->iRowid)==pIter
139d0 2d 3e 62 52 65 76 29 20 3f 20 2d 31 20 3a 20 31  ->bRev) ? -1 : 1
139e0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
139f0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
13a00 52 65 73 2d 3e 62 54 65 72 6d 45 71 3d 3d 30 20  Res->bTermEq==0 
13a10 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  );.      }..    
13a20 20 20 69 66 28 20 72 65 73 3c 30 20 29 7b 0a 20    if( res<0 ){. 
13a30 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
13a40 52 65 73 2d 3e 69 46 69 72 73 74 3d 3d 69 31 20  Res->iFirst==i1 
13a50 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
13a60 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
13a70 70 52 65 73 2d 3e 69 46 69 72 73 74 3d 3d 69 32  pRes->iFirst==i2
13a80 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   );.      }.    
13a90 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  }.  }.}../*.** T
13aa0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
13ab0 61 20 6e 6f 2d 6f 70 20 75 6e 6c 65 73 73 20 53  a no-op unless S
13ac0 51 4c 49 54 45 5f 44 45 42 55 47 20 69 73 20 64  QLITE_DEBUG is d
13ad0 65 66 69 6e 65 64 20 77 68 65 6e 20 74 68 69 73  efined when this
13ae0 20 6d 6f 64 75 6c 65 0a 2a 2a 20 69 73 20 63 6f   module.** is co
13af0 6d 70 69 6c 65 64 2e 20 49 6e 20 74 68 61 74 20  mpiled. In that 
13b00 63 61 73 65 2c 20 74 68 69 73 20 66 75 6e 63 74  case, this funct
13b10 69 6f 6e 20 69 73 20 65 73 73 65 6e 74 69 61 6c  ion is essential
13b20 6c 79 20 61 6e 20 61 73 73 65 72 74 28 29 20 0a  ly an assert() .
13b30 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 75 73 65  ** statement use
13b40 64 20 74 6f 20 76 65 72 69 66 79 20 74 68 61 74  d to verify that
13b50 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
13b60 20 74 68 65 20 70 49 74 65 72 2d 3e 61 46 69 72   the pIter->aFir
13b70 73 74 5b 5d 20 61 72 72 61 79 0a 2a 2a 20 61 72  st[] array.** ar
13b80 65 20 63 6f 72 72 65 63 74 2e 0a 2a 2f 0a 73 74  e correct..*/.st
13b90 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 41 73  atic void fts5As
13ba0 73 65 72 74 4d 75 6c 74 69 49 74 65 72 53 65 74  sertMultiIterSet
13bb0 75 70 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c  up(Fts5Index *p,
13bc0 20 46 74 73 35 49 74 65 72 20 2a 70 49 74 65 72   Fts5Iter *pIter
13bd0 29 7b 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d  ){.  if( p->rc==
13be0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
13bf0 20 46 74 73 35 53 65 67 49 74 65 72 20 2a 70 46   Fts5SegIter *pF
13c00 69 72 73 74 20 3d 20 26 70 49 74 65 72 2d 3e 61  irst = &pIter->a
13c10 53 65 67 5b 20 70 49 74 65 72 2d 3e 61 46 69 72  Seg[ pIter->aFir
13c20 73 74 5b 31 5d 2e 69 46 69 72 73 74 20 5d 3b 0a  st[1].iFirst ];.
13c30 20 20 20 20 69 6e 74 20 69 3b 0a 0a 20 20 20 20      int i;..    
13c40 61 73 73 65 72 74 28 20 28 70 46 69 72 73 74 2d  assert( (pFirst-
13c50 3e 70 4c 65 61 66 3d 3d 30 29 3d 3d 70 49 74 65  >pLeaf==0)==pIte
13c60 72 2d 3e 62 61 73 65 2e 62 45 6f 66 20 29 3b 0a  r->base.bEof );.
13c70 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 68  .    /* Check th
13c80 61 74 20 70 49 74 65 72 2d 3e 69 53 77 69 74 63  at pIter->iSwitc
13c90 68 52 6f 77 69 64 20 69 73 20 73 65 74 20 63 6f  hRowid is set co
13ca0 72 72 65 63 74 6c 79 2e 20 2a 2f 0a 20 20 20 20  rrectly. */.    
13cb0 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49 74 65 72  for(i=0; i<pIter
13cc0 2d 3e 6e 53 65 67 3b 20 69 2b 2b 29 7b 0a 20 20  ->nSeg; i++){.  
13cd0 20 20 20 20 46 74 73 35 53 65 67 49 74 65 72 20      Fts5SegIter 
13ce0 2a 70 31 20 3d 20 26 70 49 74 65 72 2d 3e 61 53  *p1 = &pIter->aS
13cf0 65 67 5b 69 5d 3b 0a 20 20 20 20 20 20 61 73 73  eg[i];.      ass
13d00 65 72 74 28 20 70 31 3d 3d 70 46 69 72 73 74 20  ert( p1==pFirst 
13d10 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70  .           || p
13d20 31 2d 3e 70 4c 65 61 66 3d 3d 30 20 0a 20 20 20  1->pLeaf==0 .   
13d30 20 20 20 20 20 20 20 20 7c 7c 20 66 74 73 35 42          || fts5B
13d40 75 66 66 65 72 43 6f 6d 70 61 72 65 28 26 70 46  ufferCompare(&pF
13d50 69 72 73 74 2d 3e 74 65 72 6d 2c 20 26 70 31 2d  irst->term, &p1-
13d60 3e 74 65 72 6d 29 20 0a 20 20 20 20 20 20 20 20  >term) .        
13d70 20 20 20 7c 7c 20 70 31 2d 3e 69 52 6f 77 69 64     || p1->iRowid
13d80 3d 3d 70 49 74 65 72 2d 3e 69 53 77 69 74 63 68  ==pIter->iSwitch
13d90 52 6f 77 69 64 0a 20 20 20 20 20 20 20 20 20 20  Rowid.          
13da0 20 7c 7c 20 28 70 31 2d 3e 69 52 6f 77 69 64 3c   || (p1->iRowid<
13db0 70 49 74 65 72 2d 3e 69 53 77 69 74 63 68 52 6f  pIter->iSwitchRo
13dc0 77 69 64 29 3d 3d 70 49 74 65 72 2d 3e 62 52 65  wid)==pIter->bRe
13dd0 76 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d  v.      );.    }
13de0 0a 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ..    for(i=0; i
13df0 3c 70 49 74 65 72 2d 3e 6e 53 65 67 3b 20 69 2b  <pIter->nSeg; i+
13e00 3d 32 29 7b 0a 20 20 20 20 20 20 46 74 73 35 53  =2){.      Fts5S
13e10 65 67 49 74 65 72 20 2a 70 31 20 3d 20 26 70 49  egIter *p1 = &pI
13e20 74 65 72 2d 3e 61 53 65 67 5b 69 5d 3b 0a 20 20  ter->aSeg[i];.  
13e30 20 20 20 20 46 74 73 35 53 65 67 49 74 65 72 20      Fts5SegIter 
13e40 2a 70 32 20 3d 20 26 70 49 74 65 72 2d 3e 61 53  *p2 = &pIter->aS
13e50 65 67 5b 69 2b 31 5d 3b 0a 20 20 20 20 20 20 46  eg[i+1];.      F
13e60 74 73 35 43 52 65 73 75 6c 74 20 2a 70 52 65 73  ts5CResult *pRes
13e70 20 3d 20 26 70 49 74 65 72 2d 3e 61 46 69 72 73   = &pIter->aFirs
13e80 74 5b 28 70 49 74 65 72 2d 3e 6e 53 65 67 20 2b  t[(pIter->nSeg +
13e90 20 69 29 20 2f 20 32 5d 3b 0a 20 20 20 20 20 20   i) / 2];.      
13ea0 66 74 73 35 41 73 73 65 72 74 43 6f 6d 70 61 72  fts5AssertCompar
13eb0 69 73 6f 6e 52 65 73 75 6c 74 28 70 49 74 65 72  isonResult(pIter
13ec0 2c 20 70 31 2c 20 70 32 2c 20 70 52 65 73 29 3b  , p1, p2, pRes);
13ed0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 66 6f 72 28  .    }..    for(
13ee0 69 3d 31 3b 20 69 3c 28 70 49 74 65 72 2d 3e 6e  i=1; i<(pIter->n
13ef0 53 65 67 20 2f 20 32 29 3b 20 69 2b 3d 32 29 7b  Seg / 2); i+=2){
13f00 0a 20 20 20 20 20 20 46 74 73 35 53 65 67 49 74  .      Fts5SegIt
13f10 65 72 20 2a 70 31 20 3d 20 26 70 49 74 65 72 2d  er *p1 = &pIter-
13f20 3e 61 53 65 67 5b 20 70 49 74 65 72 2d 3e 61 46  >aSeg[ pIter->aF
13f30 69 72 73 74 5b 69 2a 32 5d 2e 69 46 69 72 73 74  irst[i*2].iFirst
13f40 20 5d 3b 0a 20 20 20 20 20 20 46 74 73 35 53 65   ];.      Fts5Se
13f50 67 49 74 65 72 20 2a 70 32 20 3d 20 26 70 49 74  gIter *p2 = &pIt
13f60 65 72 2d 3e 61 53 65 67 5b 20 70 49 74 65 72 2d  er->aSeg[ pIter-
13f70 3e 61 46 69 72 73 74 5b 69 2a 32 2b 31 5d 2e 69  >aFirst[i*2+1].i
13f80 46 69 72 73 74 20 5d 3b 0a 20 20 20 20 20 20 46  First ];.      F
13f90 74 73 35 43 52 65 73 75 6c 74 20 2a 70 52 65 73  ts5CResult *pRes
13fa0 20 3d 20 26 70 49 74 65 72 2d 3e 61 46 69 72 73   = &pIter->aFirs
13fb0 74 5b 69 5d 3b 0a 20 20 20 20 20 20 66 74 73 35  t[i];.      fts5
13fc0 41 73 73 65 72 74 43 6f 6d 70 61 72 69 73 6f 6e  AssertComparison
13fd0 52 65 73 75 6c 74 28 70 49 74 65 72 2c 20 70 31  Result(pIter, p1
13fe0 2c 20 70 32 2c 20 70 52 65 73 29 3b 0a 20 20 20  , p2, pRes);.   
13ff0 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23   }.  }.}.#else.#
14000 20 64 65 66 69 6e 65 20 66 74 73 35 41 73 73 65   define fts5Asse
14010 72 74 4d 75 6c 74 69 49 74 65 72 53 65 74 75 70  rtMultiIterSetup
14020 28 78 2c 79 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a  (x,y).#endif../*
14030 0a 2a 2a 20 44 6f 20 74 68 65 20 63 6f 6d 70 61  .** Do the compa
14040 72 69 73 6f 6e 20 6e 65 63 65 73 73 61 72 79 20  rison necessary 
14050 74 6f 20 70 6f 70 75 6c 61 74 65 20 70 49 74 65  to populate pIte
14060 72 2d 3e 61 46 69 72 73 74 5b 69 4f 75 74 5d 2e  r->aFirst[iOut].
14070 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 72 65  .**.** If the re
14080 74 75 72 6e 65 64 20 76 61 6c 75 65 20 69 73 20  turned value is 
14090 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 69  non-zero, then i
140a0 74 20 69 73 20 74 68 65 20 69 6e 64 65 78 20 6f  t is the index o
140b0 66 20 61 6e 20 65 6e 74 72 79 0a 2a 2a 20 69 6e  f an entry.** in
140c0 20 74 68 65 20 70 49 74 65 72 2d 3e 61 53 65 67   the pIter->aSeg
140d0 5b 5d 20 61 72 72 61 79 20 74 68 61 74 20 69 73  [] array that is
140e0 20 28 61 29 20 6e 6f 74 20 61 74 20 45 4f 46 2c   (a) not at EOF,
140f0 20 61 6e 64 20 28 62 29 20 70 6f 69 6e 74 69 6e   and (b) pointin
14100 67 0a 2a 2a 20 74 6f 20 61 20 6b 65 79 20 74 68  g.** to a key th
14110 61 74 20 69 73 20 61 20 64 75 70 6c 69 63 61 74  at is a duplicat
14120 65 20 6f 66 20 61 6e 6f 74 68 65 72 2c 20 68 69  e of another, hi
14130 67 68 65 72 20 70 72 69 6f 72 69 74 79 2c 20 0a  gher priority, .
14140 2a 2a 20 73 65 67 6d 65 6e 74 2d 69 74 65 72 61  ** segment-itera
14150 74 6f 72 20 69 6e 20 74 68 65 20 70 53 65 67 2d  tor in the pSeg-
14160 3e 61 53 65 67 5b 5d 20 61 72 72 61 79 2e 0a 2a  >aSeg[] array..*
14170 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73  /.static int fts
14180 35 4d 75 6c 74 69 49 74 65 72 44 6f 43 6f 6d 70  5MultiIterDoComp
14190 61 72 65 28 46 74 73 35 49 74 65 72 20 2a 70 49  are(Fts5Iter *pI
141a0 74 65 72 2c 20 69 6e 74 20 69 4f 75 74 29 7b 0a  ter, int iOut){.
141b0 20 20 69 6e 74 20 69 31 3b 20 20 20 20 20 20 20    int i1;       
141c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
141d0 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 6c 65    /* Index of le
141e0 66 74 2d 68 61 6e 64 20 46 74 73 35 53 65 67 49  ft-hand Fts5SegI
141f0 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 69 32 3b  ter */.  int i2;
14200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14210 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
14220 78 20 6f 66 20 72 69 67 68 74 2d 68 61 6e 64 20  x of right-hand 
14230 46 74 73 35 53 65 67 49 74 65 72 20 2a 2f 0a 20  Fts5SegIter */. 
14240 20 69 6e 74 20 69 52 65 73 3b 0a 20 20 46 74 73   int iRes;.  Fts
14250 35 53 65 67 49 74 65 72 20 2a 70 31 3b 20 20 20  5SegIter *p1;   
14260 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
14270 4c 65 66 74 2d 68 61 6e 64 20 46 74 73 35 53 65  Left-hand Fts5Se
14280 67 49 74 65 72 20 2a 2f 0a 20 20 46 74 73 35 53  gIter */.  Fts5S
14290 65 67 49 74 65 72 20 2a 70 32 3b 20 20 20 20 20  egIter *p2;     
142a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 69             /* Ri
142b0 67 68 74 2d 68 61 6e 64 20 46 74 73 35 53 65 67  ght-hand Fts5Seg
142c0 49 74 65 72 20 2a 2f 0a 20 20 46 74 73 35 43 52  Iter */.  Fts5CR
142d0 65 73 75 6c 74 20 2a 70 52 65 73 20 3d 20 26 70  esult *pRes = &p
142e0 49 74 65 72 2d 3e 61 46 69 72 73 74 5b 69 4f 75  Iter->aFirst[iOu
142f0 74 5d 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 69  t];..  assert( i
14300 4f 75 74 3c 70 49 74 65 72 2d 3e 6e 53 65 67 20  Out<pIter->nSeg 
14310 26 26 20 69 4f 75 74 3e 30 20 29 3b 0a 20 20 61  && iOut>0 );.  a
14320 73 73 65 72 74 28 20 70 49 74 65 72 2d 3e 62 52  ssert( pIter->bR
14330 65 76 3d 3d 30 20 7c 7c 20 70 49 74 65 72 2d 3e  ev==0 || pIter->
14340 62 52 65 76 3d 3d 31 20 29 3b 0a 0a 20 20 69 66  bRev==1 );..  if
14350 28 20 69 4f 75 74 3e 3d 28 70 49 74 65 72 2d 3e  ( iOut>=(pIter->
14360 6e 53 65 67 2f 32 29 20 29 7b 0a 20 20 20 20 69  nSeg/2) ){.    i
14370 31 20 3d 20 28 69 4f 75 74 20 2d 20 70 49 74 65  1 = (iOut - pIte
14380 72 2d 3e 6e 53 65 67 2f 32 29 20 2a 20 32 3b 0a  r->nSeg/2) * 2;.
14390 20 20 20 20 69 32 20 3d 20 69 31 20 2b 20 31 3b      i2 = i1 + 1;
143a0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 31  .  }else{.    i1
143b0 20 3d 20 70 49 74 65 72 2d 3e 61 46 69 72 73 74   = pIter->aFirst
143c0 5b 69 4f 75 74 2a 32 5d 2e 69 46 69 72 73 74 3b  [iOut*2].iFirst;
143d0 0a 20 20 20 20 69 32 20 3d 20 70 49 74 65 72 2d  .    i2 = pIter-
143e0 3e 61 46 69 72 73 74 5b 69 4f 75 74 2a 32 2b 31  >aFirst[iOut*2+1
143f0 5d 2e 69 46 69 72 73 74 3b 0a 20 20 7d 0a 20 20  ].iFirst;.  }.  
14400 70 31 20 3d 20 26 70 49 74 65 72 2d 3e 61 53 65  p1 = &pIter->aSe
14410 67 5b 69 31 5d 3b 0a 20 20 70 32 20 3d 20 26 70  g[i1];.  p2 = &p
14420 49 74 65 72 2d 3e 61 53 65 67 5b 69 32 5d 3b 0a  Iter->aSeg[i2];.
14430 0a 20 20 70 52 65 73 2d 3e 62 54 65 72 6d 45 71  .  pRes->bTermEq
14440 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 31 2d 3e   = 0;.  if( p1->
14450 70 4c 65 61 66 3d 3d 30 20 29 7b 20 20 20 20 20  pLeaf==0 ){     
14460 20 20 20 20 20 20 2f 2a 20 49 66 20 70 31 20 69        /* If p1 i
14470 73 20 61 74 20 45 4f 46 20 2a 2f 0a 20 20 20 20  s at EOF */.    
14480 69 52 65 73 20 3d 20 69 32 3b 0a 20 20 7d 65 6c  iRes = i2;.  }el
14490 73 65 20 69 66 28 20 70 32 2d 3e 70 4c 65 61 66  se if( p2->pLeaf
144a0 3d 3d 30 20 29 7b 20 20 20 20 20 2f 2a 20 49 66  ==0 ){     /* If
144b0 20 70 32 20 69 73 20 61 74 20 45 4f 46 20 2a 2f   p2 is at EOF */
144c0 0a 20 20 20 20 69 52 65 73 20 3d 20 69 31 3b 0a  .    iRes = i1;.
144d0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74    }else{.    int
144e0 20 72 65 73 20 3d 20 66 74 73 35 42 75 66 66 65   res = fts5Buffe
144f0 72 43 6f 6d 70 61 72 65 28 26 70 31 2d 3e 74 65  rCompare(&p1->te
14500 72 6d 2c 20 26 70 32 2d 3e 74 65 72 6d 29 3b 0a  rm, &p2->term);.
14510 20 20 20 20 69 66 28 20 72 65 73 3d 3d 30 20 29      if( res==0 )
14520 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
14530 69 32 3e 69 31 20 29 3b 0a 20 20 20 20 20 20 61  i2>i1 );.      a
14540 73 73 65 72 74 28 20 69 32 21 3d 30 20 29 3b 0a  ssert( i2!=0 );.
14550 20 20 20 20 20 20 70 52 65 73 2d 3e 62 54 65 72        pRes->bTer
14560 6d 45 71 20 3d 20 31 3b 0a 20 20 20 20 20 20 69  mEq = 1;.      i
14570 66 28 20 70 31 2d 3e 69 52 6f 77 69 64 3d 3d 70  f( p1->iRowid==p
14580 32 2d 3e 69 52 6f 77 69 64 20 29 7b 0a 20 20 20  2->iRowid ){.   
14590 20 20 20 20 20 70 31 2d 3e 62 44 65 6c 20 3d 20       p1->bDel = 
145a0 70 32 2d 3e 62 44 65 6c 3b 0a 20 20 20 20 20 20  p2->bDel;.      
145b0 20 20 72 65 74 75 72 6e 20 69 32 3b 0a 20 20 20    return i2;.   
145c0 20 20 20 7d 0a 20 20 20 20 20 20 72 65 73 20 3d     }.      res =
145d0 20 28 28 70 31 2d 3e 69 52 6f 77 69 64 20 3e 20   ((p1->iRowid > 
145e0 70 32 2d 3e 69 52 6f 77 69 64 29 3d 3d 70 49 74  p2->iRowid)==pIt
145f0 65 72 2d 3e 62 52 65 76 29 20 3f 20 2d 31 20 3a  er->bRev) ? -1 :
14600 20 2b 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61   +1;.    }.    a
14610 73 73 65 72 74 28 20 72 65 73 21 3d 30 20 29 3b  ssert( res!=0 );
14620 0a 20 20 20 20 69 66 28 20 72 65 73 3c 30 20 29  .    if( res<0 )
14630 7b 0a 20 20 20 20 20 20 69 52 65 73 20 3d 20 69  {.      iRes = i
14640 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  1;.    }else{.  
14650 20 20 20 20 69 52 65 73 20 3d 20 69 32 3b 0a 20      iRes = i2;. 
14660 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 52 65 73     }.  }..  pRes
14670 2d 3e 69 46 69 72 73 74 20 3d 20 28 75 31 36 29  ->iFirst = (u16)
14680 69 52 65 73 3b 0a 20 20 72 65 74 75 72 6e 20 30  iRes;.  return 0
14690 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20  ;.}../*.** Move 
146a0 74 68 65 20 73 65 67 2d 69 74 65 72 20 73 6f 20  the seg-iter so 
146b0 74 68 61 74 20 69 74 20 70 6f 69 6e 74 73 20 74  that it points t
146c0 6f 20 74 68 65 20 66 69 72 73 74 20 72 6f 77 69  o the first rowi
146d0 64 20 6f 6e 20 70 61 67 65 20 69 4c 65 61 66 50  d on page iLeafP
146e0 67 6e 6f 2e 0a 2a 2a 20 49 74 20 69 73 20 61 6e  gno..** It is an
146f0 20 65 72 72 6f 72 20 69 66 20 6c 65 61 66 20 69   error if leaf i
14700 4c 65 61 66 50 67 6e 6f 20 64 6f 65 73 20 6e 6f  LeafPgno does no
14710 74 20 65 78 69 73 74 20 6f 72 20 63 6f 6e 74 61  t exist or conta
14720 69 6e 73 20 6e 6f 20 72 6f 77 69 64 73 2e 0a 2a  ins no rowids..*
14730 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  /.static void ft
14740 73 35 53 65 67 49 74 65 72 47 6f 74 6f 50 61 67  s5SegIterGotoPag
14750 65 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a  e(.  Fts5Index *
14760 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
14770 20 20 20 20 20 2f 2a 20 46 54 53 35 20 62 61 63       /* FTS5 bac
14780 6b 65 6e 64 20 6f 62 6a 65 63 74 20 2a 2f 0a 20  kend object */. 
14790 20 46 74 73 35 53 65 67 49 74 65 72 20 2a 70 49   Fts5SegIter *pI
147a0 74 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 20  ter,            
147b0 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 74 6f 20   /* Iterator to 
147c0 61 64 76 61 6e 63 65 20 2a 2f 0a 20 20 69 6e 74  advance */.  int
147d0 20 69 4c 65 61 66 50 67 6e 6f 0a 29 7b 0a 20 20   iLeafPgno.){.  
147e0 61 73 73 65 72 74 28 20 69 4c 65 61 66 50 67 6e  assert( iLeafPgn
147f0 6f 3e 70 49 74 65 72 2d 3e 69 4c 65 61 66 50 67  o>pIter->iLeafPg
14800 6e 6f 20 29 3b 0a 0a 20 20 69 66 28 20 69 4c 65  no );..  if( iLe
14810 61 66 50 67 6e 6f 3e 70 49 74 65 72 2d 3e 70 53  afPgno>pIter->pS
14820 65 67 2d 3e 70 67 6e 6f 4c 61 73 74 20 29 7b 0a  eg->pgnoLast ){.
14830 20 20 20 20 70 2d 3e 72 63 20 3d 20 46 54 53 35      p->rc = FTS5
14840 5f 43 4f 52 52 55 50 54 3b 0a 20 20 7d 65 6c 73  _CORRUPT;.  }els
14850 65 7b 0a 20 20 20 20 66 74 73 35 44 61 74 61 52  e{.    fts5DataR
14860 65 6c 65 61 73 65 28 70 49 74 65 72 2d 3e 70 4e  elease(pIter->pN
14870 65 78 74 4c 65 61 66 29 3b 0a 20 20 20 20 70 49  extLeaf);.    pI
14880 74 65 72 2d 3e 70 4e 65 78 74 4c 65 61 66 20 3d  ter->pNextLeaf =
14890 20 30 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 69   0;.    pIter->i
148a0 4c 65 61 66 50 67 6e 6f 20 3d 20 69 4c 65 61 66  LeafPgno = iLeaf
148b0 50 67 6e 6f 2d 31 3b 0a 20 20 20 20 66 74 73 35  Pgno-1;.    fts5
148c0 53 65 67 49 74 65 72 4e 65 78 74 50 61 67 65 28  SegIterNextPage(
148d0 70 2c 20 70 49 74 65 72 29 3b 0a 20 20 20 20 61  p, pIter);.    a
148e0 73 73 65 72 74 28 20 70 2d 3e 72 63 21 3d 53 51  ssert( p->rc!=SQ
148f0 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 49 74 65 72  LITE_OK || pIter
14900 2d 3e 69 4c 65 61 66 50 67 6e 6f 3d 3d 69 4c 65  ->iLeafPgno==iLe
14910 61 66 50 67 6e 6f 20 29 3b 0a 0a 20 20 20 20 69  afPgno );..    i
14920 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  f( p->rc==SQLITE
14930 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  _OK ){.      int
14940 20 69 4f 66 66 3b 0a 20 20 20 20 20 20 75 38 20   iOff;.      u8 
14950 2a 61 20 3d 20 70 49 74 65 72 2d 3e 70 4c 65 61  *a = pIter->pLea
14960 66 2d 3e 70 3b 0a 20 20 20 20 20 20 69 6e 74 20  f->p;.      int 
14970 6e 20 3d 20 70 49 74 65 72 2d 3e 70 4c 65 61 66  n = pIter->pLeaf
14980 2d 3e 73 7a 4c 65 61 66 3b 0a 0a 20 20 20 20 20  ->szLeaf;..     
14990 20 69 4f 66 66 20 3d 20 66 74 73 35 4c 65 61 66   iOff = fts5Leaf
149a0 46 69 72 73 74 52 6f 77 69 64 4f 66 66 28 70 49  FirstRowidOff(pI
149b0 74 65 72 2d 3e 70 4c 65 61 66 29 3b 0a 20 20 20  ter->pLeaf);.   
149c0 20 20 20 69 66 28 20 69 4f 66 66 3c 34 20 7c 7c     if( iOff<4 ||
149d0 20 69 4f 66 66 3e 3d 6e 20 29 7b 0a 20 20 20 20   iOff>=n ){.    
149e0 20 20 20 20 70 2d 3e 72 63 20 3d 20 46 54 53 35      p->rc = FTS5
149f0 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20 20 20 20  _CORRUPT;.      
14a00 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69  }else{.        i
14a10 4f 66 66 20 2b 3d 20 66 74 73 35 47 65 74 56 61  Off += fts5GetVa
14a20 72 69 6e 74 28 26 61 5b 69 4f 66 66 5d 2c 20 28  rint(&a[iOff], (
14a30 75 36 34 2a 29 26 70 49 74 65 72 2d 3e 69 52 6f  u64*)&pIter->iRo
14a40 77 69 64 29 3b 0a 20 20 20 20 20 20 20 20 70 49  wid);.        pI
14a50 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74  ter->iLeafOffset
14a60 20 3d 20 69 4f 66 66 3b 0a 20 20 20 20 20 20 20   = iOff;.       
14a70 20 66 74 73 35 53 65 67 49 74 65 72 4c 6f 61 64   fts5SegIterLoad
14a80 4e 50 6f 73 28 70 2c 20 70 49 74 65 72 29 3b 0a  NPos(p, pIter);.
14a90 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
14aa0 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 76 61 6e  }.}../*.** Advan
14ab0 63 65 20 74 68 65 20 69 74 65 72 61 74 6f 72 20  ce the iterator 
14ac0 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65  passed as the se
14ad0 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 75 6e  cond argument un
14ae0 74 69 6c 20 69 74 20 69 73 20 61 74 20 6f 72 20  til it is at or 
14af0 0a 2a 2a 20 70 61 73 74 20 72 6f 77 69 64 20 69  .** past rowid i
14b00 46 72 6f 6d 2e 20 52 65 67 61 72 64 6c 65 73 73  From. Regardless
14b10 20 6f 66 20 74 68 65 20 76 61 6c 75 65 20 6f 66   of the value of
14b20 20 69 46 72 6f 6d 2c 20 74 68 65 20 69 74 65 72   iFrom, the iter
14b30 61 74 6f 72 20 69 73 0a 2a 2a 20 61 6c 77 61 79  ator is.** alway
14b40 73 20 61 64 76 61 6e 63 65 64 20 61 74 20 6c 65  s advanced at le
14b50 61 73 74 20 6f 6e 63 65 2e 0a 2a 2f 0a 73 74 61  ast once..*/.sta
14b60 74 69 63 20 76 6f 69 64 20 66 74 73 35 53 65 67  tic void fts5Seg
14b70 49 74 65 72 4e 65 78 74 46 72 6f 6d 28 0a 20 20  IterNextFrom(.  
14b80 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 20 20  Fts5Index *p,   
14b90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14ba0 2f 2a 20 46 54 53 35 20 62 61 63 6b 65 6e 64 20  /* FTS5 backend 
14bb0 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 46 74 73 35  object */.  Fts5
14bc0 53 65 67 49 74 65 72 20 2a 70 49 74 65 72 2c 20  SegIter *pIter, 
14bd0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
14be0 74 65 72 61 74 6f 72 20 74 6f 20 61 64 76 61 6e  terator to advan
14bf0 63 65 20 2a 2f 0a 20 20 69 36 34 20 69 4d 61 74  ce */.  i64 iMat
14c00 63 68 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ch              
14c10 20 20 20 20 20 20 20 20 2f 2a 20 41 64 76 61 6e          /* Advan
14c20 63 65 20 69 74 65 72 61 74 6f 72 20 61 74 20 6c  ce iterator at l
14c30 65 61 73 74 20 74 68 69 73 20 66 61 72 20 2a 2f  east this far */
14c40 0a 29 7b 0a 20 20 69 6e 74 20 62 52 65 76 20 3d  .){.  int bRev =
14c50 20 28 70 49 74 65 72 2d 3e 66 6c 61 67 73 20 26   (pIter->flags &
14c60 20 46 54 53 35 5f 53 45 47 49 54 45 52 5f 52 45   FTS5_SEGITER_RE
14c70 56 45 52 53 45 29 3b 0a 20 20 46 74 73 35 44 6c  VERSE);.  Fts5Dl
14c80 69 64 78 49 74 65 72 20 2a 70 44 6c 69 64 78 20  idxIter *pDlidx 
14c90 3d 20 70 49 74 65 72 2d 3e 70 44 6c 69 64 78 3b  = pIter->pDlidx;
14ca0 0a 20 20 69 6e 74 20 69 4c 65 61 66 50 67 6e 6f  .  int iLeafPgno
14cb0 20 3d 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 50   = pIter->iLeafP
14cc0 67 6e 6f 3b 0a 20 20 69 6e 74 20 62 4d 6f 76 65  gno;.  int bMove
14cd0 20 3d 20 31 3b 0a 0a 20 20 61 73 73 65 72 74 28   = 1;..  assert(
14ce0 20 70 49 74 65 72 2d 3e 66 6c 61 67 73 20 26 20   pIter->flags & 
14cf0 46 54 53 35 5f 53 45 47 49 54 45 52 5f 4f 4e 45  FTS5_SEGITER_ONE
14d00 54 45 52 4d 20 29 3b 0a 20 20 61 73 73 65 72 74  TERM );.  assert
14d10 28 20 70 49 74 65 72 2d 3e 70 44 6c 69 64 78 20  ( pIter->pDlidx 
14d20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 49 74  );.  assert( pIt
14d30 65 72 2d 3e 70 4c 65 61 66 20 29 3b 0a 0a 20 20  er->pLeaf );..  
14d40 69 66 28 20 62 52 65 76 3d 3d 30 20 29 7b 0a 20  if( bRev==0 ){. 
14d50 20 20 20 77 68 69 6c 65 28 20 21 66 74 73 35 44     while( !fts5D
14d60 6c 69 64 78 49 74 65 72 45 6f 66 28 70 2c 20 70  lidxIterEof(p, p
14d70 44 6c 69 64 78 29 20 26 26 20 69 4d 61 74 63 68  Dlidx) && iMatch
14d80 3e 66 74 73 35 44 6c 69 64 78 49 74 65 72 52 6f  >fts5DlidxIterRo
14d90 77 69 64 28 70 44 6c 69 64 78 29 20 29 7b 0a 20  wid(pDlidx) ){. 
14da0 20 20 20 20 20 69 4c 65 61 66 50 67 6e 6f 20 3d       iLeafPgno =
14db0 20 66 74 73 35 44 6c 69 64 78 49 74 65 72 50 67   fts5DlidxIterPg
14dc0 6e 6f 28 70 44 6c 69 64 78 29 3b 0a 20 20 20 20  no(pDlidx);.    
14dd0 20 20 66 74 73 35 44 6c 69 64 78 49 74 65 72 4e    fts5DlidxIterN
14de0 65 78 74 28 70 2c 20 70 44 6c 69 64 78 29 3b 0a  ext(p, pDlidx);.
14df0 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
14e00 5f 6e 63 28 20 69 4c 65 61 66 50 67 6e 6f 3e 3d  _nc( iLeafPgno>=
14e10 70 49 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f  pIter->iLeafPgno
14e20 20 7c 7c 20 70 2d 3e 72 63 20 29 3b 0a 20 20 20   || p->rc );.   
14e30 20 69 66 28 20 69 4c 65 61 66 50 67 6e 6f 3e 70   if( iLeafPgno>p
14e40 49 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 20  Iter->iLeafPgno 
14e50 29 7b 0a 20 20 20 20 20 20 66 74 73 35 53 65 67  ){.      fts5Seg
14e60 49 74 65 72 47 6f 74 6f 50 61 67 65 28 70 2c 20  IterGotoPage(p, 
14e70 70 49 74 65 72 2c 20 69 4c 65 61 66 50 67 6e 6f  pIter, iLeafPgno
14e80 29 3b 0a 20 20 20 20 20 20 62 4d 6f 76 65 20 3d  );.      bMove =
14e90 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73   0;.    }.  }els
14ea0 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  e{.    assert( p
14eb0 49 74 65 72 2d 3e 70 4e 65 78 74 4c 65 61 66 3d  Iter->pNextLeaf=
14ec0 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =0 );.    assert
14ed0 28 20 69 4d 61 74 63 68 3c 70 49 74 65 72 2d 3e  ( iMatch<pIter->
14ee0 69 52 6f 77 69 64 20 29 3b 0a 20 20 20 20 77 68  iRowid );.    wh
14ef0 69 6c 65 28 20 21 66 74 73 35 44 6c 69 64 78 49  ile( !fts5DlidxI
14f00 74 65 72 45 6f 66 28 70 2c 20 70 44 6c 69 64 78  terEof(p, pDlidx
14f10 29 20 26 26 20 69 4d 61 74 63 68 3c 66 74 73 35  ) && iMatch<fts5
14f20 44 6c 69 64 78 49 74 65 72 52 6f 77 69 64 28 70  DlidxIterRowid(p
14f30 44 6c 69 64 78 29 20 29 7b 0a 20 20 20 20 20 20  Dlidx) ){.      
14f40 66 74 73 35 44 6c 69 64 78 49 74 65 72 50 72 65  fts5DlidxIterPre
14f50 76 28 70 2c 20 70 44 6c 69 64 78 29 3b 0a 20 20  v(p, pDlidx);.  
14f60 20 20 7d 0a 20 20 20 20 69 4c 65 61 66 50 67 6e    }.    iLeafPgn
14f70 6f 20 3d 20 66 74 73 35 44 6c 69 64 78 49 74 65  o = fts5DlidxIte
14f80 72 50 67 6e 6f 28 70 44 6c 69 64 78 29 3b 0a 0a  rPgno(pDlidx);..
14f90 20 20 20 20 61 73 73 65 72 74 28 20 66 74 73 35      assert( fts5
14fa0 44 6c 69 64 78 49 74 65 72 45 6f 66 28 70 2c 20  DlidxIterEof(p, 
14fb0 70 44 6c 69 64 78 29 20 7c 7c 20 69 4c 65 61 66  pDlidx) || iLeaf
14fc0 50 67 6e 6f 3c 3d 70 49 74 65 72 2d 3e 69 4c 65  Pgno<=pIter->iLe
14fd0 61 66 50 67 6e 6f 20 29 3b 0a 0a 20 20 20 20 69  afPgno );..    i
14fe0 66 28 20 69 4c 65 61 66 50 67 6e 6f 3c 70 49 74  f( iLeafPgno<pIt
14ff0 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 20 29 7b  er->iLeafPgno ){
15000 0a 20 20 20 20 20 20 70 49 74 65 72 2d 3e 69 4c  .      pIter->iL
15010 65 61 66 50 67 6e 6f 20 3d 20 69 4c 65 61 66 50  eafPgno = iLeafP
15020 67 6e 6f 2b 31 3b 0a 20 20 20 20 20 20 66 74 73  gno+1;.      fts
15030 35 53 65 67 49 74 65 72 52 65 76 65 72 73 65 4e  5SegIterReverseN
15040 65 77 50 61 67 65 28 70 2c 20 70 49 74 65 72 29  ewPage(p, pIter)
15050 3b 0a 20 20 20 20 20 20 62 4d 6f 76 65 20 3d 20  ;.      bMove = 
15060 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  0;.    }.  }..  
15070 64 6f 7b 0a 20 20 20 20 69 66 28 20 62 4d 6f 76  do{.    if( bMov
15080 65 20 26 26 20 70 2d 3e 72 63 3d 3d 53 51 4c 49  e && p->rc==SQLI
15090 54 45 5f 4f 4b 20 29 20 70 49 74 65 72 2d 3e 78  TE_OK ) pIter->x
150a0 4e 65 78 74 28 70 2c 20 70 49 74 65 72 2c 20 30  Next(p, pIter, 0
150b0 29 3b 0a 20 20 20 20 69 66 28 20 70 49 74 65 72  );.    if( pIter
150c0 2d 3e 70 4c 65 61 66 3d 3d 30 20 29 20 62 72 65  ->pLeaf==0 ) bre
150d0 61 6b 3b 0a 20 20 20 20 69 66 28 20 62 52 65 76  ak;.    if( bRev
150e0 3d 3d 30 20 26 26 20 70 49 74 65 72 2d 3e 69 52  ==0 && pIter->iR
150f0 6f 77 69 64 3e 3d 69 4d 61 74 63 68 20 29 20 62  owid>=iMatch ) b
15100 72 65 61 6b 3b 0a 20 20 20 20 69 66 28 20 62 52  reak;.    if( bR
15110 65 76 21 3d 30 20 26 26 20 70 49 74 65 72 2d 3e  ev!=0 && pIter->
15120 69 52 6f 77 69 64 3c 3d 69 4d 61 74 63 68 20 29  iRowid<=iMatch )
15130 20 62 72 65 61 6b 3b 0a 20 20 20 20 62 4d 6f 76   break;.    bMov
15140 65 20 3d 20 31 3b 0a 20 20 7d 77 68 69 6c 65 28  e = 1;.  }while(
15150 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
15160 4b 20 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 46  K );.}.../*.** F
15170 72 65 65 20 74 68 65 20 69 74 65 72 61 74 6f 72  ree the iterator
15180 20 6f 62 6a 65 63 74 20 70 61 73 73 65 64 20 61   object passed a
15190 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67  s the second arg
151a0 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  ument..*/.static
151b0 20 76 6f 69 64 20 66 74 73 35 4d 75 6c 74 69 49   void fts5MultiI
151c0 74 65 72 46 72 65 65 28 46 74 73 35 49 74 65 72  terFree(Fts5Iter
151d0 20 2a 70 49 74 65 72 29 7b 0a 20 20 69 66 28 20   *pIter){.  if( 
151e0 70 49 74 65 72 20 29 7b 0a 20 20 20 20 69 6e 74  pIter ){.    int
151f0 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   i;.    for(i=0;
15200 20 69 3c 70 49 74 65 72 2d 3e 6e 53 65 67 3b 20   i<pIter->nSeg; 
15210 69 2b 2b 29 7b 0a 20 20 20 20 20 20 66 74 73 35  i++){.      fts5
15220 53 65 67 49 74 65 72 43 6c 65 61 72 28 26 70 49  SegIterClear(&pI
15230 74 65 72 2d 3e 61 53 65 67 5b 69 5d 29 3b 0a 20  ter->aSeg[i]);. 
15240 20 20 20 7d 0a 20 20 20 20 66 74 73 35 42 75 66     }.    fts5Buf
15250 66 65 72 46 72 65 65 28 26 70 49 74 65 72 2d 3e  ferFree(&pIter->
15260 70 6f 73 6c 69 73 74 29 3b 0a 20 20 20 20 73 71  poslist);.    sq
15270 6c 69 74 65 33 5f 66 72 65 65 28 70 49 74 65 72  lite3_free(pIter
15280 29 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63  );.  }.}..static
15290 20 76 6f 69 64 20 66 74 73 35 4d 75 6c 74 69 49   void fts5MultiI
152a0 74 65 72 41 64 76 61 6e 63 65 64 28 0a 20 20 46  terAdvanced(.  F
152b0 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20  ts5Index *p,    
152c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
152d0 2a 20 46 54 53 35 20 62 61 63 6b 65 6e 64 20 74  * FTS5 backend t
152e0 6f 20 69 74 65 72 61 74 65 20 77 69 74 68 69 6e  o iterate within
152f0 20 2a 2f 0a 20 20 46 74 73 35 49 74 65 72 20 2a   */.  Fts5Iter *
15300 70 49 74 65 72 2c 20 20 20 20 20 20 20 20 20 20  pIter,          
15310 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74 6f        /* Iterato
15320 72 20 74 6f 20 75 70 64 61 74 65 20 61 46 69 72  r to update aFir
15330 73 74 5b 5d 20 61 72 72 61 79 20 66 6f 72 20 2a  st[] array for *
15340 2f 0a 20 20 69 6e 74 20 69 43 68 61 6e 67 65 64  /.  int iChanged
15350 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
15360 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20      /* Index of 
15370 73 75 62 2d 69 74 65 72 61 74 6f 72 20 6a 75 73  sub-iterator jus
15380 74 20 61 64 76 61 6e 63 65 64 20 2a 2f 0a 20 20  t advanced */.  
15390 69 6e 74 20 69 4d 69 6e 73 65 74 20 20 20 20 20  int iMinset     
153a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
153b0 2f 2a 20 4d 69 6e 69 6d 75 6d 20 65 6e 74 72 79  /* Minimum entry
153c0 20 69 6e 20 61 46 69 72 73 74 5b 5d 20 74 6f 20   in aFirst[] to 
153d0 73 65 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  set */.){.  int 
153e0 69 3b 0a 20 20 66 6f 72 28 69 3d 28 70 49 74 65  i;.  for(i=(pIte
153f0 72 2d 3e 6e 53 65 67 2b 69 43 68 61 6e 67 65 64  r->nSeg+iChanged
15400 29 2f 32 3b 20 69 3e 3d 69 4d 69 6e 73 65 74 20  )/2; i>=iMinset 
15410 26 26 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  && p->rc==SQLITE
15420 5f 4f 4b 3b 20 69 3d 69 2f 32 29 7b 0a 20 20 20  _OK; i=i/2){.   
15430 20 69 6e 74 20 69 45 71 3b 0a 20 20 20 20 69 66   int iEq;.    if
15440 28 20 28 69 45 71 20 3d 20 66 74 73 35 4d 75 6c  ( (iEq = fts5Mul
15450 74 69 49 74 65 72 44 6f 43 6f 6d 70 61 72 65 28  tiIterDoCompare(
15460 70 49 74 65 72 2c 20 69 29 29 20 29 7b 0a 20 20  pIter, i)) ){.  
15470 20 20 20 20 46 74 73 35 53 65 67 49 74 65 72 20      Fts5SegIter 
15480 2a 70 53 65 67 20 3d 20 26 70 49 74 65 72 2d 3e  *pSeg = &pIter->
15490 61 53 65 67 5b 69 45 71 5d 3b 0a 20 20 20 20 20  aSeg[iEq];.     
154a0 20 61 73 73 65 72 74 28 20 70 2d 3e 72 63 3d 3d   assert( p->rc==
154b0 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20  SQLITE_OK );.   
154c0 20 20 20 70 53 65 67 2d 3e 78 4e 65 78 74 28 70     pSeg->xNext(p
154d0 2c 20 70 53 65 67 2c 20 30 29 3b 0a 20 20 20 20  , pSeg, 0);.    
154e0 20 20 69 20 3d 20 70 49 74 65 72 2d 3e 6e 53 65    i = pIter->nSe
154f0 67 20 2b 20 69 45 71 3b 0a 20 20 20 20 7d 0a 20  g + iEq;.    }. 
15500 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 75 62 2d   }.}../*.** Sub-
15510 69 74 65 72 61 74 6f 72 20 69 43 68 61 6e 67 65  iterator iChange
15520 64 20 6f 66 20 69 74 65 72 61 74 6f 72 20 70 49  d of iterator pI
15530 74 65 72 20 68 61 73 20 6a 75 73 74 20 62 65 65  ter has just bee
15540 6e 20 61 64 76 61 6e 63 65 64 2e 20 49 74 20 73  n advanced. It s
15550 74 69 6c 6c 0a 2a 2a 20 70 6f 69 6e 74 73 20 74  till.** points t
15560 6f 20 74 68 65 20 73 61 6d 65 20 74 65 72 6d 20  o the same term 
15570 74 68 6f 75 67 68 20 2d 20 6a 75 73 74 20 61 20  though - just a 
15580 64 69 66 66 65 72 65 6e 74 20 72 6f 77 69 64 2e  different rowid.
15590 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a   This function.*
155a0 2a 20 61 74 74 65 6d 70 74 73 20 74 6f 20 75 70  * attempts to up
155b0 64 61 74 65 20 74 68 65 20 63 6f 6e 74 65 6e 74  date the content
155c0 73 20 6f 66 20 74 68 65 20 70 49 74 65 72 2d 3e  s of the pIter->
155d0 61 46 69 72 73 74 5b 5d 20 61 63 63 6f 72 64 69  aFirst[] accordi
155e0 6e 67 6c 79 2e 0a 2a 2a 20 49 66 20 69 74 20 64  ngly..** If it d
155f0 6f 65 73 20 73 6f 20 73 75 63 63 65 73 73 66 75  oes so successfu
15600 6c 6c 79 2c 20 30 20 69 73 20 72 65 74 75 72 6e  lly, 0 is return
15610 65 64 2e 20 4f 74 68 65 72 77 69 73 65 20 31 2e  ed. Otherwise 1.
15620 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 6e 2d 7a 65  .**.** If non-ze
15630 72 6f 20 69 73 20 72 65 74 75 72 6e 65 64 2c 20  ro is returned, 
15640 74 68 65 20 63 61 6c 6c 65 72 20 73 68 6f 75 6c  the caller shoul
15650 64 20 63 61 6c 6c 20 66 74 73 35 4d 75 6c 74 69  d call fts5Multi
15660 49 74 65 72 41 64 76 61 6e 63 65 64 28 29 0a 2a  IterAdvanced().*
15670 2a 20 6f 6e 20 74 68 65 20 69 74 65 72 61 74 6f  * on the iterato
15680 72 20 69 6e 73 74 65 61 64 2e 20 54 68 61 74 20  r instead. That 
15690 66 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20 74 68  function does th
156a0 65 20 73 61 6d 65 20 61 73 20 74 68 69 73 20 6f  e same as this o
156b0 6e 65 2c 20 65 78 63 65 70 74 0a 2a 2a 20 74 68  ne, except.** th
156c0 61 74 20 69 74 20 64 65 61 6c 73 20 77 69 74 68  at it deals with
156d0 20 6d 6f 72 65 20 63 6f 6d 70 6c 69 63 61 74 65   more complicate
156e0 64 20 63 61 73 65 73 20 61 73 20 77 65 6c 6c 2e  d cases as well.
156f0 0a 2a 2f 20 0a 73 74 61 74 69 63 20 69 6e 74 20  .*/ .static int 
15700 66 74 73 35 4d 75 6c 74 69 49 74 65 72 41 64 76  fts5MultiIterAdv
15710 61 6e 63 65 52 6f 77 69 64 28 0a 20 20 46 74 73  anceRowid(.  Fts
15720 35 49 74 65 72 20 2a 70 49 74 65 72 2c 20 20 20  5Iter *pIter,   
15730 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
15740 49 74 65 72 61 74 6f 72 20 74 6f 20 75 70 64 61  Iterator to upda
15750 74 65 20 61 46 69 72 73 74 5b 5d 20 61 72 72 61  te aFirst[] arra
15760 79 20 66 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 69  y for */.  int i
15770 43 68 61 6e 67 65 64 2c 20 20 20 20 20 20 20 20  Changed,        
15780 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
15790 64 65 78 20 6f 66 20 73 75 62 2d 69 74 65 72 61  dex of sub-itera
157a0 74 6f 72 20 6a 75 73 74 20 61 64 76 61 6e 63 65  tor just advance
157b0 64 20 2a 2f 0a 20 20 46 74 73 35 53 65 67 49 74  d */.  Fts5SegIt
157c0 65 72 20 2a 2a 70 70 46 69 72 73 74 0a 29 7b 0a  er **ppFirst.){.
157d0 20 20 46 74 73 35 53 65 67 49 74 65 72 20 2a 70    Fts5SegIter *p
157e0 4e 65 77 20 3d 20 26 70 49 74 65 72 2d 3e 61 53  New = &pIter->aS
157f0 65 67 5b 69 43 68 61 6e 67 65 64 5d 3b 0a 0a 20  eg[iChanged];.. 
15800 20 69 66 28 20 70 4e 65 77 2d 3e 69 52 6f 77 69   if( pNew->iRowi
15810 64 3d 3d 70 49 74 65 72 2d 3e 69 53 77 69 74 63  d==pIter->iSwitc
15820 68 52 6f 77 69 64 0a 20 20 20 7c 7c 20 28 70 4e  hRowid.   || (pN
15830 65 77 2d 3e 69 52 6f 77 69 64 3c 70 49 74 65 72  ew->iRowid<pIter
15840 2d 3e 69 53 77 69 74 63 68 52 6f 77 69 64 29 3d  ->iSwitchRowid)=
15850 3d 70 49 74 65 72 2d 3e 62 52 65 76 0a 20 20 29  =pIter->bRev.  )
15860 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  {.    int i;.   
15870 20 46 74 73 35 53 65 67 49 74 65 72 20 2a 70 4f   Fts5SegIter *pO
15880 74 68 65 72 20 3d 20 26 70 49 74 65 72 2d 3e 61  ther = &pIter->a
15890 53 65 67 5b 69 43 68 61 6e 67 65 64 20 5e 20 30  Seg[iChanged ^ 0
158a0 78 30 30 30 31 5d 3b 0a 20 20 20 20 70 49 74 65  x0001];.    pIte
158b0 72 2d 3e 69 53 77 69 74 63 68 52 6f 77 69 64 20  r->iSwitchRowid 
158c0 3d 20 70 49 74 65 72 2d 3e 62 52 65 76 20 3f 20  = pIter->bRev ? 
158d0 53 4d 41 4c 4c 45 53 54 5f 49 4e 54 36 34 20 3a  SMALLEST_INT64 :
158e0 20 4c 41 52 47 45 53 54 5f 49 4e 54 36 34 3b 0a   LARGEST_INT64;.
158f0 20 20 20 20 66 6f 72 28 69 3d 28 70 49 74 65 72      for(i=(pIter
15900 2d 3e 6e 53 65 67 2b 69 43 68 61 6e 67 65 64 29  ->nSeg+iChanged)
15910 2f 32 3b 20 31 3b 20 69 3d 69 2f 32 29 7b 0a 20  /2; 1; i=i/2){. 
15920 20 20 20 20 20 46 74 73 35 43 52 65 73 75 6c 74       Fts5CResult
15930 20 2a 70 52 65 73 20 3d 20 26 70 49 74 65 72 2d   *pRes = &pIter-
15940 3e 61 46 69 72 73 74 5b 69 5d 3b 0a 0a 20 20 20  >aFirst[i];..   
15950 20 20 20 61 73 73 65 72 74 28 20 70 4e 65 77 2d     assert( pNew-
15960 3e 70 4c 65 61 66 20 29 3b 0a 20 20 20 20 20 20  >pLeaf );.      
15970 61 73 73 65 72 74 28 20 70 52 65 73 2d 3e 62 54  assert( pRes->bT
15980 65 72 6d 45 71 3d 3d 30 20 7c 7c 20 70 4f 74 68  ermEq==0 || pOth
15990 65 72 2d 3e 70 4c 65 61 66 20 29 3b 0a 0a 20 20  er->pLeaf );..  
159a0 20 20 20 20 69 66 28 20 70 52 65 73 2d 3e 62 54      if( pRes->bT
159b0 65 72 6d 45 71 20 29 7b 0a 20 20 20 20 20 20 20  ermEq ){.       
159c0 20 69 66 28 20 70 4e 65 77 2d 3e 69 52 6f 77 69   if( pNew->iRowi
159d0 64 3d 3d 70 4f 74 68 65 72 2d 3e 69 52 6f 77 69  d==pOther->iRowi
159e0 64 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  d ){.          r
159f0 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 20  eturn 1;.       
15a00 20 7d 65 6c 73 65 20 69 66 28 20 28 70 4f 74 68   }else if( (pOth
15a10 65 72 2d 3e 69 52 6f 77 69 64 3e 70 4e 65 77 2d  er->iRowid>pNew-
15a20 3e 69 52 6f 77 69 64 29 3d 3d 70 49 74 65 72 2d  >iRowid)==pIter-
15a30 3e 62 52 65 76 20 29 7b 0a 20 20 20 20 20 20 20  >bRev ){.       
15a40 20 20 20 70 49 74 65 72 2d 3e 69 53 77 69 74 63     pIter->iSwitc
15a50 68 52 6f 77 69 64 20 3d 20 70 4f 74 68 65 72 2d  hRowid = pOther-
15a60 3e 69 52 6f 77 69 64 3b 0a 20 20 20 20 20 20 20  >iRowid;.       
15a70 20 20 20 70 4e 65 77 20 3d 20 70 4f 74 68 65 72     pNew = pOther
15a80 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20  ;.        }else 
15a90 69 66 28 20 28 70 4f 74 68 65 72 2d 3e 69 52 6f  if( (pOther->iRo
15aa0 77 69 64 3e 70 49 74 65 72 2d 3e 69 53 77 69 74  wid>pIter->iSwit
15ab0 63 68 52 6f 77 69 64 29 3d 3d 70 49 74 65 72 2d  chRowid)==pIter-
15ac0 3e 62 52 65 76 20 29 7b 0a 20 20 20 20 20 20 20  >bRev ){.       
15ad0 20 20 20 70 49 74 65 72 2d 3e 69 53 77 69 74 63     pIter->iSwitc
15ae0 68 52 6f 77 69 64 20 3d 20 70 4f 74 68 65 72 2d  hRowid = pOther-
15af0 3e 69 52 6f 77 69 64 3b 0a 20 20 20 20 20 20 20  >iRowid;.       
15b00 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
15b10 20 70 52 65 73 2d 3e 69 46 69 72 73 74 20 3d 20   pRes->iFirst = 
15b20 28 75 31 36 29 28 70 4e 65 77 20 2d 20 70 49 74  (u16)(pNew - pIt
15b30 65 72 2d 3e 61 53 65 67 29 3b 0a 20 20 20 20 20  er->aSeg);.     
15b40 20 69 66 28 20 69 3d 3d 31 20 29 20 62 72 65 61   if( i==1 ) brea
15b50 6b 3b 0a 0a 20 20 20 20 20 20 70 4f 74 68 65 72  k;..      pOther
15b60 20 3d 20 26 70 49 74 65 72 2d 3e 61 53 65 67 5b   = &pIter->aSeg[
15b70 20 70 49 74 65 72 2d 3e 61 46 69 72 73 74 5b 69   pIter->aFirst[i
15b80 20 5e 20 30 78 30 30 30 31 5d 2e 69 46 69 72 73   ^ 0x0001].iFirs
15b90 74 20 5d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  t ];.    }.  }..
15ba0 20 20 2a 70 70 46 69 72 73 74 20 3d 20 70 4e 65    *ppFirst = pNe
15bb0 77 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d  w;.  return 0;.}
15bc0 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20  ../*.** Set the 
15bd0 70 49 74 65 72 2d 3e 62 45 6f 66 20 76 61 72 69  pIter->bEof vari
15be0 61 62 6c 65 20 62 61 73 65 64 20 6f 6e 20 74 68  able based on th
15bf0 65 20 73 74 61 74 65 20 6f 66 20 74 68 65 20 73  e state of the s
15c00 75 62 2d 69 74 65 72 61 74 6f 72 73 2e 0a 2a 2f  ub-iterators..*/
15c10 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
15c20 35 4d 75 6c 74 69 49 74 65 72 53 65 74 45 6f 66  5MultiIterSetEof
15c30 28 46 74 73 35 49 74 65 72 20 2a 70 49 74 65 72  (Fts5Iter *pIter
15c40 29 7b 0a 20 20 46 74 73 35 53 65 67 49 74 65 72  ){.  Fts5SegIter
15c50 20 2a 70 53 65 67 20 3d 20 26 70 49 74 65 72 2d   *pSeg = &pIter-
15c60 3e 61 53 65 67 5b 20 70 49 74 65 72 2d 3e 61 46  >aSeg[ pIter->aF
15c70 69 72 73 74 5b 31 5d 2e 69 46 69 72 73 74 20 5d  irst[1].iFirst ]
15c80 3b 0a 20 20 70 49 74 65 72 2d 3e 62 61 73 65 2e  ;.  pIter->base.
15c90 62 45 6f 66 20 3d 20 70 53 65 67 2d 3e 70 4c 65  bEof = pSeg->pLe
15ca0 61 66 3d 3d 30 3b 0a 20 20 70 49 74 65 72 2d 3e  af==0;.  pIter->
15cb0 69 53 77 69 74 63 68 52 6f 77 69 64 20 3d 20 70  iSwitchRowid = p
15cc0 53 65 67 2d 3e 69 52 6f 77 69 64 3b 0a 7d 0a 0a  Seg->iRowid;.}..
15cd0 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 69  /*.** Move the i
15ce0 74 65 72 61 74 6f 72 20 74 6f 20 74 68 65 20 6e  terator to the n
15cf0 65 78 74 20 65 6e 74 72 79 2e 20 0a 2a 2a 0a 2a  ext entry. .**.*
15d00 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  * If an error oc
15d10 63 75 72 73 2c 20 61 6e 20 65 72 72 6f 72 20 63  curs, an error c
15d20 6f 64 65 20 69 73 20 6c 65 66 74 20 69 6e 20 46  ode is left in F
15d30 74 73 35 49 6e 64 65 78 2e 72 63 2e 20 49 74 20  ts5Index.rc. It 
15d40 69 73 20 6e 6f 74 20 0a 2a 2a 20 63 6f 6e 73 69  is not .** consi
15d50 64 65 72 65 64 20 61 6e 20 65 72 72 6f 72 20 69  dered an error i
15d60 66 20 74 68 65 20 69 74 65 72 61 74 6f 72 20 72  f the iterator r
15d70 65 61 63 68 65 73 20 45 4f 46 2c 20 6f 72 20 69  eaches EOF, or i
15d80 66 20 69 74 20 69 73 20 61 6c 72 65 61 64 79 20  f it is already 
15d90 61 74 20 0a 2a 2a 20 45 4f 46 20 77 68 65 6e 20  at .** EOF when 
15da0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
15db0 20 63 61 6c 6c 65 64 2e 0a 2a 2f 0a 73 74 61 74   called..*/.stat
15dc0 69 63 20 76 6f 69 64 20 66 74 73 35 4d 75 6c 74  ic void fts5Mult
15dd0 69 49 74 65 72 4e 65 78 74 28 0a 20 20 46 74 73  iIterNext(.  Fts
15de0 35 49 6e 64 65 78 20 2a 70 2c 20 0a 20 20 46 74  5Index *p, .  Ft
15df0 73 35 49 74 65 72 20 2a 70 49 74 65 72 2c 0a 20  s5Iter *pIter,. 
15e00 20 69 6e 74 20 62 46 72 6f 6d 2c 20 20 20 20 20   int bFrom,     
15e10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15e20 20 2f 2a 20 54 72 75 65 20 69 66 20 61 72 67 75   /* True if argu
15e30 6d 65 6e 74 20 69 46 72 6f 6d 20 69 73 20 76 61  ment iFrom is va
15e40 6c 69 64 20 2a 2f 0a 20 20 69 36 34 20 69 46 72  lid */.  i64 iFr
15e50 6f 6d 20 20 20 20 20 20 20 20 20 20 20 20 20 20  om              
15e60 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 76 61           /* Adva
15e70 6e 63 65 20 61 74 20 6c 65 61 73 74 20 61 73 20  nce at least as 
15e80 66 61 72 20 61 73 20 74 68 69 73 20 2a 2f 0a 29  far as this */.)
15e90 7b 0a 20 20 69 6e 74 20 62 55 73 65 46 72 6f 6d  {.  int bUseFrom
15ea0 20 3d 20 62 46 72 6f 6d 3b 0a 20 20 61 73 73 65   = bFrom;.  asse
15eb0 72 74 28 20 70 49 74 65 72 2d 3e 62 61 73 65 2e  rt( pIter->base.
15ec0 62 45 6f 66 3d 3d 30 20 29 3b 0a 20 20 77 68 69  bEof==0 );.  whi
15ed0 6c 65 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  le( p->rc==SQLIT
15ee0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 6e 74 20  E_OK ){.    int 
15ef0 69 46 69 72 73 74 20 3d 20 70 49 74 65 72 2d 3e  iFirst = pIter->
15f00 61 46 69 72 73 74 5b 31 5d 2e 69 46 69 72 73 74  aFirst[1].iFirst
15f10 3b 0a 20 20 20 20 69 6e 74 20 62 4e 65 77 54 65  ;.    int bNewTe
15f20 72 6d 20 3d 20 30 3b 0a 20 20 20 20 46 74 73 35  rm = 0;.    Fts5
15f30 53 65 67 49 74 65 72 20 2a 70 53 65 67 20 3d 20  SegIter *pSeg = 
15f40 26 70 49 74 65 72 2d 3e 61 53 65 67 5b 69 46 69  &pIter->aSeg[iFi
15f50 72 73 74 5d 3b 0a 20 20 20 20 61 73 73 65 72 74  rst];.    assert
15f60 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
15f70 4f 4b 20 29 3b 0a 20 20 20 20 69 66 28 20 62 55  OK );.    if( bU
15f80 73 65 46 72 6f 6d 20 26 26 20 70 53 65 67 2d 3e  seFrom && pSeg->
15f90 70 44 6c 69 64 78 20 29 7b 0a 20 20 20 20 20 20  pDlidx ){.      
15fa0 66 74 73 35 53 65 67 49 74 65 72 4e 65 78 74 46  fts5SegIterNextF
15fb0 72 6f 6d 28 70 2c 20 70 53 65 67 2c 20 69 46 72  rom(p, pSeg, iFr
15fc0 6f 6d 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  om);.    }else{.
15fd0 20 20 20 20 20 20 70 53 65 67 2d 3e 78 4e 65 78        pSeg->xNex
15fe0 74 28 70 2c 20 70 53 65 67 2c 20 26 62 4e 65 77  t(p, pSeg, &bNew
15ff0 54 65 72 6d 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  Term);.    }..  
16000 20 20 69 66 28 20 70 53 65 67 2d 3e 70 4c 65 61    if( pSeg->pLea
16010 66 3d 3d 30 20 7c 7c 20 62 4e 65 77 54 65 72 6d  f==0 || bNewTerm
16020 20 0a 20 20 20 20 20 7c 7c 20 66 74 73 35 4d 75   .     || fts5Mu
16030 6c 74 69 49 74 65 72 41 64 76 61 6e 63 65 52 6f  ltiIterAdvanceRo
16040 77 69 64 28 70 49 74 65 72 2c 20 69 46 69 72 73  wid(pIter, iFirs
16050 74 2c 20 26 70 53 65 67 29 0a 20 20 20 20 29 7b  t, &pSeg).    ){
16060 0a 20 20 20 20 20 20 66 74 73 35 4d 75 6c 74 69  .      fts5Multi
16070 49 74 65 72 41 64 76 61 6e 63 65 64 28 70 2c 20  IterAdvanced(p, 
16080 70 49 74 65 72 2c 20 69 46 69 72 73 74 2c 20 31  pIter, iFirst, 1
16090 29 3b 0a 20 20 20 20 20 20 66 74 73 35 4d 75 6c  );.      fts5Mul
160a0 74 69 49 74 65 72 53 65 74 45 6f 66 28 70 49 74  tiIterSetEof(pIt
160b0 65 72 29 3b 0a 20 20 20 20 20 20 70 53 65 67 20  er);.      pSeg 
160c0 3d 20 26 70 49 74 65 72 2d 3e 61 53 65 67 5b 70  = &pIter->aSeg[p
160d0 49 74 65 72 2d 3e 61 46 69 72 73 74 5b 31 5d 2e  Iter->aFirst[1].
160e0 69 46 69 72 73 74 5d 3b 0a 20 20 20 20 20 20 69  iFirst];.      i
160f0 66 28 20 70 53 65 67 2d 3e 70 4c 65 61 66 3d 3d  f( pSeg->pLeaf==
16100 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20  0 ) return;.    
16110 7d 0a 0a 20 20 20 20 66 74 73 35 41 73 73 65 72  }..    fts5Asser
16120 74 4d 75 6c 74 69 49 74 65 72 53 65 74 75 70 28  tMultiIterSetup(
16130 70 2c 20 70 49 74 65 72 29 3b 0a 20 20 20 20 61  p, pIter);.    a
16140 73 73 65 72 74 28 20 70 53 65 67 3d 3d 26 70 49  ssert( pSeg==&pI
16150 74 65 72 2d 3e 61 53 65 67 5b 70 49 74 65 72 2d  ter->aSeg[pIter-
16160 3e 61 46 69 72 73 74 5b 31 5d 2e 69 46 69 72 73  >aFirst[1].iFirs
16170 74 5d 20 26 26 20 70 53 65 67 2d 3e 70 4c 65 61  t] && pSeg->pLea
16180 66 20 29 3b 0a 20 20 20 20 69 66 28 20 70 49 74  f );.    if( pIt
16190 65 72 2d 3e 62 53 6b 69 70 45 6d 70 74 79 3d 3d  er->bSkipEmpty==
161a0 30 20 7c 7c 20 70 53 65 67 2d 3e 6e 50 6f 73 20  0 || pSeg->nPos 
161b0 29 7b 0a 20 20 20 20 20 20 70 49 74 65 72 2d 3e  ){.      pIter->
161c0 78 53 65 74 4f 75 74 70 75 74 73 28 70 49 74 65  xSetOutputs(pIte
161d0 72 2c 20 70 53 65 67 29 3b 0a 20 20 20 20 20 20  r, pSeg);.      
161e0 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20  return;.    }.  
161f0 20 20 62 55 73 65 46 72 6f 6d 20 3d 20 30 3b 0a    bUseFrom = 0;.
16200 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f    }.}..static vo
16210 69 64 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72  id fts5MultiIter
16220 4e 65 78 74 32 28 0a 20 20 46 74 73 35 49 6e 64  Next2(.  Fts5Ind
16230 65 78 20 2a 70 2c 20 0a 20 20 46 74 73 35 49 74  ex *p, .  Fts5It
16240 65 72 20 2a 70 49 74 65 72 2c 0a 20 20 69 6e 74  er *pIter,.  int
16250 20 2a 70 62 4e 65 77 54 65 72 6d 20 20 20 20 20   *pbNewTerm     
16260 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
16270 4f 55 54 3a 20 54 72 75 65 20 69 66 20 2a 6d 69  OUT: True if *mi
16280 67 68 74 2a 20 62 65 20 6e 65 77 20 74 65 72 6d  ght* be new term
16290 20 2a 2f 0a 29 7b 0a 20 20 61 73 73 65 72 74 28   */.){.  assert(
162a0 20 70 49 74 65 72 2d 3e 62 53 6b 69 70 45 6d 70   pIter->bSkipEmp
162b0 74 79 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 72  ty );.  if( p->r
162c0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
162d0 20 20 20 20 2a 70 62 4e 65 77 54 65 72 6d 20 3d      *pbNewTerm =
162e0 20 30 3b 0a 20 20 20 20 64 6f 7b 0a 20 20 20 20   0;.    do{.    
162f0 20 20 69 6e 74 20 69 46 69 72 73 74 20 3d 20 70    int iFirst = p
16300 49 74 65 72 2d 3e 61 46 69 72 73 74 5b 31 5d 2e  Iter->aFirst[1].
16310 69 46 69 72 73 74 3b 0a 20 20 20 20 20 20 46 74  iFirst;.      Ft
16320 73 35 53 65 67 49 74 65 72 20 2a 70 53 65 67 20  s5SegIter *pSeg 
16330 3d 20 26 70 49 74 65 72 2d 3e 61 53 65 67 5b 69  = &pIter->aSeg[i
16340 46 69 72 73 74 5d 3b 0a 20 20 20 20 20 20 69 6e  First];.      in
16350 74 20 62 4e 65 77 54 65 72 6d 20 3d 20 30 3b 0a  t bNewTerm = 0;.
16360 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
16370 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
16380 29 3b 0a 20 20 20 20 20 20 70 53 65 67 2d 3e 78  );.      pSeg->x
16390 4e 65 78 74 28 70 2c 20 70 53 65 67 2c 20 26 62  Next(p, pSeg, &b
163a0 4e 65 77 54 65 72 6d 29 3b 0a 20 20 20 20 20 20  NewTerm);.      
163b0 69 66 28 20 70 53 65 67 2d 3e 70 4c 65 61 66 3d  if( pSeg->pLeaf=
163c0 3d 30 20 7c 7c 20 62 4e 65 77 54 65 72 6d 20 0a  =0 || bNewTerm .
163d0 20 20 20 20 20 20 20 7c 7c 20 66 74 73 35 4d 75         || fts5Mu
163e0 6c 74 69 49 74 65 72 41 64 76 61 6e 63 65 52 6f  ltiIterAdvanceRo
163f0 77 69 64 28 70 49 74 65 72 2c 20 69 46 69 72 73  wid(pIter, iFirs
16400 74 2c 20 26 70 53 65 67 29 0a 20 20 20 20 20 20  t, &pSeg).      
16410 29 7b 0a 20 20 20 20 20 20 20 20 66 74 73 35 4d  ){.        fts5M
16420 75 6c 74 69 49 74 65 72 41 64 76 61 6e 63 65 64  ultiIterAdvanced
16430 28 70 2c 20 70 49 74 65 72 2c 20 69 46 69 72 73  (p, pIter, iFirs
16440 74 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 66  t, 1);.        f
16450 74 73 35 4d 75 6c 74 69 49 74 65 72 53 65 74 45  ts5MultiIterSetE
16460 6f 66 28 70 49 74 65 72 29 3b 0a 20 20 20 20 20  of(pIter);.     
16470 20 20 20 2a 70 62 4e 65 77 54 65 72 6d 20 3d 20     *pbNewTerm = 
16480 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  1;.      }.     
16490 20 66 74 73 35 41 73 73 65 72 74 4d 75 6c 74 69   fts5AssertMulti
164a0 49 74 65 72 53 65 74 75 70 28 70 2c 20 70 49 74  IterSetup(p, pIt
164b0 65 72 29 3b 0a 0a 20 20 20 20 7d 77 68 69 6c 65  er);..    }while
164c0 28 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 49  ( fts5MultiIterI
164d0 73 45 6d 70 74 79 28 70 2c 20 70 49 74 65 72 29  sEmpty(p, pIter)
164e0 20 29 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69   );.  }.}..stati
164f0 63 20 76 6f 69 64 20 66 74 73 35 49 74 65 72 53  c void fts5IterS
16500 65 74 4f 75 74 70 75 74 73 5f 4e 6f 6f 70 28 46  etOutputs_Noop(F
16510 74 73 35 49 74 65 72 20 2a 70 55 6e 75 73 65 64  ts5Iter *pUnused
16520 31 2c 20 46 74 73 35 53 65 67 49 74 65 72 20 2a  1, Fts5SegIter *
16530 70 55 6e 75 73 65 64 32 29 7b 0a 20 20 55 4e 55  pUnused2){.  UNU
16540 53 45 44 5f 50 41 52 41 4d 32 28 70 55 6e 75 73  SED_PARAM2(pUnus
16550 65 64 31 2c 20 70 55 6e 75 73 65 64 32 29 3b 0a  ed1, pUnused2);.
16560 7d 0a 0a 73 74 61 74 69 63 20 46 74 73 35 49 74  }..static Fts5It
16570 65 72 20 2a 66 74 73 35 4d 75 6c 74 69 49 74 65  er *fts5MultiIte
16580 72 41 6c 6c 6f 63 28 0a 20 20 46 74 73 35 49 6e  rAlloc(.  Fts5In
16590 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20 20  dex *p,         
165a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53            /* FTS
165b0 35 20 62 61 63 6b 65 6e 64 20 74 6f 20 69 74 65  5 backend to ite
165c0 72 61 74 65 20 77 69 74 68 69 6e 20 2a 2f 0a 20  rate within */. 
165d0 20 69 6e 74 20 6e 53 65 67 0a 29 7b 0a 20 20 46   int nSeg.){.  F
165e0 74 73 35 49 74 65 72 20 2a 70 4e 65 77 3b 0a 20  ts5Iter *pNew;. 
165f0 20 69 6e 74 20 6e 53 6c 6f 74 3b 20 20 20 20 20   int nSlot;     
16600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16610 20 2f 2a 20 50 6f 77 65 72 20 6f 66 20 74 77 6f   /* Power of two
16620 20 3e 3d 20 6e 53 65 67 20 2a 2f 0a 0a 20 20 66   >= nSeg */..  f
16630 6f 72 28 6e 53 6c 6f 74 3d 32 3b 20 6e 53 6c 6f  or(nSlot=2; nSlo
16640 74 3c 6e 53 65 67 3b 20 6e 53 6c 6f 74 3d 6e 53  t<nSeg; nSlot=nS
16650 6c 6f 74 2a 32 29 3b 0a 20 20 70 4e 65 77 20 3d  lot*2);.  pNew =
16660 20 66 74 73 35 49 64 78 4d 61 6c 6c 6f 63 28 70   fts5IdxMalloc(p
16670 2c 20 0a 20 20 20 20 20 20 73 69 7a 65 6f 66 28  , .      sizeof(
16680 46 74 73 35 49 74 65 72 29 20 2b 20 20 20 20 20  Fts5Iter) +     
16690 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
166a0 70 4e 65 77 20 2a 2f 0a 20 20 20 20 20 20 73 69  pNew */.      si
166b0 7a 65 6f 66 28 46 74 73 35 53 65 67 49 74 65 72  zeof(Fts5SegIter
166c0 29 20 2a 20 28 6e 53 6c 6f 74 2d 31 29 20 2b 20  ) * (nSlot-1) + 
166d0 20 20 2f 2a 20 70 4e 65 77 2d 3e 61 53 65 67 5b    /* pNew->aSeg[
166e0 5d 20 2a 2f 0a 20 20 20 20 20 20 73 69 7a 65 6f  ] */.      sizeo
166f0 66 28 46 74 73 35 43 52 65 73 75 6c 74 29 20 2a  f(Fts5CResult) *
16700 20 6e 53 6c 6f 74 20 20 20 20 20 20 20 20 20 2f   nSlot         /
16710 2a 20 70 4e 65 77 2d 3e 61 46 69 72 73 74 5b 5d  * pNew->aFirst[]
16720 20 2a 2f 0a 20 20 29 3b 0a 20 20 69 66 28 20 70   */.  );.  if( p
16730 4e 65 77 20 29 7b 0a 20 20 20 20 70 4e 65 77 2d  New ){.    pNew-
16740 3e 6e 53 65 67 20 3d 20 6e 53 6c 6f 74 3b 0a 20  >nSeg = nSlot;. 
16750 20 20 20 70 4e 65 77 2d 3e 61 46 69 72 73 74 20     pNew->aFirst 
16760 3d 20 28 46 74 73 35 43 52 65 73 75 6c 74 2a 29  = (Fts5CResult*)
16770 26 70 4e 65 77 2d 3e 61 53 65 67 5b 6e 53 6c 6f  &pNew->aSeg[nSlo
16780 74 5d 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 70 49  t];.    pNew->pI
16790 6e 64 65 78 20 3d 20 70 3b 0a 20 20 20 20 70 4e  ndex = p;.    pN
167a0 65 77 2d 3e 78 53 65 74 4f 75 74 70 75 74 73 20  ew->xSetOutputs 
167b0 3d 20 66 74 73 35 49 74 65 72 53 65 74 4f 75 74  = fts5IterSetOut
167c0 70 75 74 73 5f 4e 6f 6f 70 3b 0a 20 20 7d 0a 20  puts_Noop;.  }. 
167d0 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a   return pNew;.}.
167e0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
167f0 35 50 6f 73 6c 69 73 74 43 61 6c 6c 62 61 63 6b  5PoslistCallback
16800 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70  (.  Fts5Index *p
16810 55 6e 75 73 65 64 2c 20 0a 20 20 76 6f 69 64 20  Unused, .  void 
16820 2a 70 43 6f 6e 74 65 78 74 2c 20 0a 20 20 63 6f  *pContext, .  co
16830 6e 73 74 20 75 38 20 2a 70 43 68 75 6e 6b 2c 20  nst u8 *pChunk, 
16840 69 6e 74 20 6e 43 68 75 6e 6b 0a 29 7b 0a 20 20  int nChunk.){.  
16850 55 4e 55 53 45 44 5f 50 41 52 41 4d 28 70 55 6e  UNUSED_PARAM(pUn
16860 75 73 65 64 29 3b 0a 20 20 61 73 73 65 72 74 5f  used);.  assert_
16870 6e 63 28 20 6e 43 68 75 6e 6b 3e 3d 30 20 29 3b  nc( nChunk>=0 );
16880 0a 20 20 69 66 28 20 6e 43 68 75 6e 6b 3e 30 20  .  if( nChunk>0 
16890 29 7b 0a 20 20 20 20 66 74 73 35 42 75 66 66 65  ){.    fts5Buffe
168a0 72 53 61 66 65 41 70 70 65 6e 64 42 6c 6f 62 28  rSafeAppendBlob(
168b0 28 46 74 73 35 42 75 66 66 65 72 2a 29 70 43 6f  (Fts5Buffer*)pCo
168c0 6e 74 65 78 74 2c 20 70 43 68 75 6e 6b 2c 20 6e  ntext, pChunk, n
168d0 43 68 75 6e 6b 29 3b 0a 20 20 7d 0a 7d 0a 0a 74  Chunk);.  }.}..t
168e0 79 70 65 64 65 66 20 73 74 72 75 63 74 20 50 6f  ypedef struct Po
168f0 73 6c 69 73 74 43 61 6c 6c 62 61 63 6b 43 74 78  slistCallbackCtx
16900 20 50 6f 73 6c 69 73 74 43 61 6c 6c 62 61 63 6b   PoslistCallback
16910 43 74 78 3b 0a 73 74 72 75 63 74 20 50 6f 73 6c  Ctx;.struct Posl
16920 69 73 74 43 61 6c 6c 62 61 63 6b 43 74 78 20 7b  istCallbackCtx {
16930 0a 20 20 46 74 73 35 42 75 66 66 65 72 20 2a 70  .  Fts5Buffer *p
16940 42 75 66 3b 20 20 20 20 20 20 20 20 20 20 20 20  Buf;            
16950 20 20 20 2f 2a 20 41 70 70 65 6e 64 20 74 6f 20     /* Append to 
16960 74 68 69 73 20 62 75 66 66 65 72 20 2a 2f 0a 20  this buffer */. 
16970 20 46 74 73 35 43 6f 6c 73 65 74 20 2a 70 43 6f   Fts5Colset *pCo
16980 6c 73 65 74 3b 20 20 20 20 20 20 20 20 20 20 20  lset;           
16990 20 2f 2a 20 52 65 73 74 72 69 63 74 20 6d 61 74   /* Restrict mat
169a0 63 68 65 73 20 74 6f 20 74 68 69 73 20 63 6f 6c  ches to this col
169b0 75 6d 6e 20 2a 2f 0a 20 20 69 6e 74 20 65 53 74  umn */.  int eSt
169c0 61 74 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ate;            
169d0 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 65 20           /* See 
169e0 61 62 6f 76 65 20 2a 2f 0a 7d 3b 0a 0a 74 79 70  above */.};..typ
169f0 65 64 65 66 20 73 74 72 75 63 74 20 50 6f 73 6c  edef struct Posl
16a00 69 73 74 4f 66 66 73 65 74 73 43 74 78 20 50 6f  istOffsetsCtx Po
16a10 73 6c 69 73 74 4f 66 66 73 65 74 73 43 74 78 3b  slistOffsetsCtx;
16a20 0a 73 74 72 75 63 74 20 50 6f 73 6c 69 73 74 4f  .struct PoslistO
16a30 66 66 73 65 74 73 43 74 78 20 7b 0a 20 20 46 74  ffsetsCtx {.  Ft
16a40 73 35 42 75 66 66 65 72 20 2a 70 42 75 66 3b 20  s5Buffer *pBuf; 
16a50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
16a60 20 41 70 70 65 6e 64 20 74 6f 20 74 68 69 73 20   Append to this 
16a70 62 75 66 66 65 72 20 2a 2f 0a 20 20 46 74 73 35  buffer */.  Fts5
16a80 43 6f 6c 73 65 74 20 2a 70 43 6f 6c 73 65 74 3b  Colset *pColset;
16a90 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
16aa0 65 73 74 72 69 63 74 20 6d 61 74 63 68 65 73 20  estrict matches 
16ab0 74 6f 20 74 68 69 73 20 63 6f 6c 75 6d 6e 20 2a  to this column *
16ac0 2f 0a 20 20 69 6e 74 20 69 52 65 61 64 3b 0a 20  /.  int iRead;. 
16ad0 20 69 6e 74 20 69 57 72 69 74 65 3b 0a 7d 3b 0a   int iWrite;.};.
16ae0 0a 2f 2a 0a 2a 2a 20 54 4f 44 4f 3a 20 4d 61 6b  ./*.** TODO: Mak
16af0 65 20 74 68 69 73 20 6d 6f 72 65 20 65 66 66 69  e this more effi
16b00 63 69 65 6e 74 21 0a 2a 2f 0a 73 74 61 74 69 63  cient!.*/.static
16b10 20 69 6e 74 20 66 74 73 35 49 6e 64 65 78 43 6f   int fts5IndexCo
16b20 6c 73 65 74 54 65 73 74 28 46 74 73 35 43 6f 6c  lsetTest(Fts5Col
16b30 73 65 74 20 2a 70 43 6f 6c 73 65 74 2c 20 69 6e  set *pColset, in
16b40 74 20 69 43 6f 6c 29 7b 0a 20 20 69 6e 74 20 69  t iCol){.  int i
16b50 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
16b60 43 6f 6c 73 65 74 2d 3e 6e 43 6f 6c 3b 20 69 2b  Colset->nCol; i+
16b70 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 43 6f 6c  +){.    if( pCol
16b80 73 65 74 2d 3e 61 69 43 6f 6c 5b 69 5d 3d 3d 69  set->aiCol[i]==i
16b90 43 6f 6c 20 29 20 72 65 74 75 72 6e 20 31 3b 0a  Col ) return 1;.
16ba0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
16bb0 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  }..static void f
16bc0 74 73 35 50 6f 73 6c 69 73 74 4f 66 66 73 65 74  ts5PoslistOffset
16bd0 73 43 61 6c 6c 62 61 63 6b 28 0a 20 20 46 74 73  sCallback(.  Fts
16be0 35 49 6e 64 65 78 20 2a 70 55 6e 75 73 65 64 2c  5Index *pUnused,
16bf0 20 0a 20 20 76 6f 69 64 20 2a 70 43 6f 6e 74 65   .  void *pConte
16c00 78 74 2c 20 0a 20 20 63 6f 6e 73 74 20 75 38 20  xt, .  const u8 
16c10 2a 70 43 68 75 6e 6b 2c 20 69 6e 74 20 6e 43 68  *pChunk, int nCh
16c20 75 6e 6b 0a 29 7b 0a 20 20 50 6f 73 6c 69 73 74  unk.){.  Poslist
16c30 4f 66 66 73 65 74 73 43 74 78 20 2a 70 43 74 78  OffsetsCtx *pCtx
16c40 20 3d 20 28 50 6f 73 6c 69 73 74 4f 66 66 73 65   = (PoslistOffse
16c50 74 73 43 74 78 2a 29 70 43 6f 6e 74 65 78 74 3b  tsCtx*)pContext;
16c60 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 28  .  UNUSED_PARAM(
16c70 70 55 6e 75 73 65 64 29 3b 0a 20 20 61 73 73 65  pUnused);.  asse
16c80 72 74 5f 6e 63 28 20 6e 43 68 75 6e 6b 3e 3d 30  rt_nc( nChunk>=0
16c90 20 29 3b 0a 20 20 69 66 28 20 6e 43 68 75 6e 6b   );.  if( nChunk
16ca0 3e 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 20  >0 ){.    int i 
16cb0 3d 20 30 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  = 0;.    while( 
16cc0 69 3c 6e 43 68 75 6e 6b 20 29 7b 0a 20 20 20 20  i<nChunk ){.    
16cd0 20 20 69 6e 74 20 69 56 61 6c 3b 0a 20 20 20 20    int iVal;.    
16ce0 20 20 69 20 2b 3d 20 66 74 73 35 47 65 74 56 61    i += fts5GetVa
16cf0 72 69 6e 74 33 32 28 26 70 43 68 75 6e 6b 5b 69  rint32(&pChunk[i
16d00 5d 2c 20 69 56 61 6c 29 3b 0a 20 20 20 20 20 20  ], iVal);.      
16d10 69 56 61 6c 20 2b 3d 20 70 43 74 78 2d 3e 69 52  iVal += pCtx->iR
16d20 65 61 64 20 2d 20 32 3b 0a 20 20 20 20 20 20 70  ead - 2;.      p
16d30 43 74 78 2d 3e 69 52 65 61 64 20 3d 20 69 56 61  Ctx->iRead = iVa
16d40 6c 3b 0a 20 20 20 20 20 20 69 66 28 20 66 74 73  l;.      if( fts
16d50 35 49 6e 64 65 78 43 6f 6c 73 65 74 54 65 73 74  5IndexColsetTest
16d60 28 70 43 74 78 2d 3e 70 43 6f 6c 73 65 74 2c 20  (pCtx->pColset, 
16d70 69 56 61 6c 29 20 29 7b 0a 20 20 20 20 20 20 20  iVal) ){.       
16d80 20 66 74 73 35 42 75 66 66 65 72 53 61 66 65 41   fts5BufferSafeA
16d90 70 70 65 6e 64 56 61 72 69 6e 74 28 70 43 74 78  ppendVarint(pCtx
16da0 2d 3e 70 42 75 66 2c 20 69 56 61 6c 20 2b 20 32  ->pBuf, iVal + 2
16db0 20 2d 20 70 43 74 78 2d 3e 69 57 72 69 74 65 29   - pCtx->iWrite)
16dc0 3b 0a 20 20 20 20 20 20 20 20 70 43 74 78 2d 3e  ;.        pCtx->
16dd0 69 57 72 69 74 65 20 3d 20 69 56 61 6c 3b 0a 20  iWrite = iVal;. 
16de0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
16df0 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .}..static void 
16e00 66 74 73 35 50 6f 73 6c 69 73 74 46 69 6c 74 65  fts5PoslistFilte
16e10 72 43 61 6c 6c 62 61 63 6b 28 0a 20 20 46 74 73  rCallback(.  Fts
16e20 35 49 6e 64 65 78 20 2a 70 55 6e 75 73 65 64 2c  5Index *pUnused,
16e30 0a 20 20 76 6f 69 64 20 2a 70 43 6f 6e 74 65 78  .  void *pContex
16e40 74 2c 20 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a  t, .  const u8 *
16e50 70 43 68 75 6e 6b 2c 20 69 6e 74 20 6e 43 68 75  pChunk, int nChu
16e60 6e 6b 0a 29 7b 0a 20 20 50 6f 73 6c 69 73 74 43  nk.){.  PoslistC
16e70 61 6c 6c 62 61 63 6b 43 74 78 20 2a 70 43 74 78  allbackCtx *pCtx
16e80 20 3d 20 28 50 6f 73 6c 69 73 74 43 61 6c 6c 62   = (PoslistCallb
16e90 61 63 6b 43 74 78 2a 29 70 43 6f 6e 74 65 78 74  ackCtx*)pContext
16ea0 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ;.  UNUSED_PARAM
16eb0 28 70 55 6e 75 73 65 64 29 3b 0a 20 20 61 73 73  (pUnused);.  ass
16ec0 65 72 74 5f 6e 63 28 20 6e 43 68 75 6e 6b 3e 3d  ert_nc( nChunk>=
16ed0 30 20 29 3b 0a 20 20 69 66 28 20 6e 43 68 75 6e  0 );.  if( nChun
16ee0 6b 3e 30 20 29 7b 0a 20 20 20 20 2f 2a 20 53 65  k>0 ){.    /* Se
16ef0 61 72 63 68 20 74 68 72 6f 75 67 68 20 74 6f 20  arch through to 
16f00 66 69 6e 64 20 74 68 65 20 66 69 72 73 74 20 76  find the first v
16f10 61 72 69 6e 74 20 77 69 74 68 20 76 61 6c 75 65  arint with value
16f20 20 31 2e 20 54 68 69 73 20 69 73 20 74 68 65 0a   1. This is the.
16f30 20 20 20 20 2a 2a 20 73 74 61 72 74 20 6f 66 20      ** start of 
16f40 74 68 65 20 6e 65 78 74 20 63 6f 6c 75 6d 6e 73  the next columns
16f50 20 68 69 74 73 2e 20 2a 2f 0a 20 20 20 20 69 6e   hits. */.    in
16f60 74 20 69 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74  t i = 0;.    int
16f70 20 69 53 74 61 72 74 20 3d 20 30 3b 0a 0a 20 20   iStart = 0;..  
16f80 20 20 69 66 28 20 70 43 74 78 2d 3e 65 53 74 61    if( pCtx->eSta
16f90 74 65 3d 3d 32 20 29 7b 0a 20 20 20 20 20 20 69  te==2 ){.      i
16fa0 6e 74 20 69 43 6f 6c 3b 0a 20 20 20 20 20 20 66  nt iCol;.      f
16fb0 74 73 35 46 61 73 74 47 65 74 56 61 72 69 6e 74  ts5FastGetVarint
16fc0 33 32 28 70 43 68 75 6e 6b 2c 20 69 2c 20 69 43  32(pChunk, i, iC
16fd0 6f 6c 29 3b 0a 20 20 20 20 20 20 69 66 28 20 66  ol);.      if( f
16fe0 74 73 35 49 6e 64 65 78 43 6f 6c 73 65 74 54 65  ts5IndexColsetTe
16ff0 73 74 28 70 43 74 78 2d 3e 70 43 6f 6c 73 65 74  st(pCtx->pColset
17000 2c 20 69 43 6f 6c 29 20 29 7b 0a 20 20 20 20 20  , iCol) ){.     
17010 20 20 20 70 43 74 78 2d 3e 65 53 74 61 74 65 20     pCtx->eState 
17020 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 66 74 73  = 1;.        fts
17030 35 42 75 66 66 65 72 53 61 66 65 41 70 70 65 6e  5BufferSafeAppen
17040 64 56 61 72 69 6e 74 28 70 43 74 78 2d 3e 70 42  dVarint(pCtx->pB
17050 75 66 2c 20 31 29 3b 0a 20 20 20 20 20 20 7d 65  uf, 1);.      }e
17060 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 43 74  lse{.        pCt
17070 78 2d 3e 65 53 74 61 74 65 20 3d 20 30 3b 0a 20  x->eState = 0;. 
17080 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
17090 20 20 64 6f 20 7b 0a 20 20 20 20 20 20 77 68 69    do {.      whi
170a0 6c 65 28 20 69 3c 6e 43 68 75 6e 6b 20 26 26 20  le( i<nChunk && 
170b0 70 43 68 75 6e 6b 5b 69 5d 21 3d 30 78 30 31 20  pChunk[i]!=0x01 
170c0 29 7b 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65  ){.        while
170d0 28 20 70 43 68 75 6e 6b 5b 69 5d 20 26 20 30 78  ( pChunk[i] & 0x
170e0 38 30 20 29 20 69 2b 2b 3b 0a 20 20 20 20 20 20  80 ) i++;.      
170f0 20 20 69 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20    i++;.      }. 
17100 20 20 20 20 20 69 66 28 20 70 43 74 78 2d 3e 65       if( pCtx->e
17110 53 74 61 74 65 20 29 7b 0a 20 20 20 20 20 20 20  State ){.       
17120 20 66 74 73 35 42 75 66 66 65 72 53 61 66 65 41   fts5BufferSafeA
17130 70 70 65 6e 64 42 6c 6f 62 28 70 43 74 78 2d 3e  ppendBlob(pCtx->
17140 70 42 75 66 2c 20 26 70 43 68 75 6e 6b 5b 69 53  pBuf, &pChunk[iS
17150 74 61 72 74 5d 2c 20 69 2d 69 53 74 61 72 74 29  tart], i-iStart)
17160 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
17170 69 66 28 20 69 3c 6e 43 68 75 6e 6b 20 29 7b 0a  if( i<nChunk ){.
17180 20 20 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6c          int iCol
17190 3b 0a 20 20 20 20 20 20 20 20 69 53 74 61 72 74  ;.        iStart
171a0 20 3d 20 69 3b 0a 20 20 20 20 20 20 20 20 69 2b   = i;.        i+
171b0 2b 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69  +;.        if( i
171c0 3e 3d 6e 43 68 75 6e 6b 20 29 7b 0a 20 20 20 20  >=nChunk ){.    
171d0 20 20 20 20 20 20 70 43 74 78 2d 3e 65 53 74 61        pCtx->eSta
171e0 74 65 20 3d 20 32 3b 0a 20 20 20 20 20 20 20 20  te = 2;.        
171f0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
17200 20 66 74 73 35 46 61 73 74 47 65 74 56 61 72 69   fts5FastGetVari
17210 6e 74 33 32 28 70 43 68 75 6e 6b 2c 20 69 2c 20  nt32(pChunk, i, 
17220 69 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20 20  iCol);.         
17230 20 70 43 74 78 2d 3e 65 53 74 61 74 65 20 3d 20   pCtx->eState = 
17240 66 74 73 35 49 6e 64 65 78 43 6f 6c 73 65 74 54  fts5IndexColsetT
17250 65 73 74 28 70 43 74 78 2d 3e 70 43 6f 6c 73 65  est(pCtx->pColse
17260 74 2c 20 69 43 6f 6c 29 3b 0a 20 20 20 20 20 20  t, iCol);.      
17270 20 20 20 20 69 66 28 20 70 43 74 78 2d 3e 65 53      if( pCtx->eS
17280 74 61 74 65 20 29 7b 0a 20 20 20 20 20 20 20 20  tate ){.        
17290 20 20 20 20 66 74 73 35 42 75 66 66 65 72 53 61      fts5BufferSa
172a0 66 65 41 70 70 65 6e 64 42 6c 6f 62 28 70 43 74  feAppendBlob(pCt
172b0 78 2d 3e 70 42 75 66 2c 20 26 70 43 68 75 6e 6b  x->pBuf, &pChunk
172c0 5b 69 53 74 61 72 74 5d 2c 20 69 2d 69 53 74 61  [iStart], i-iSta
172d0 72 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  rt);.           
172e0 20 69 53 74 61 72 74 20 3d 20 69 3b 0a 20 20 20   iStart = i;.   
172f0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
17300 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
17310 77 68 69 6c 65 28 20 69 3c 6e 43 68 75 6e 6b 20  while( i<nChunk 
17320 29 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63  );.  }.}..static
17330 20 76 6f 69 64 20 66 74 73 35 43 68 75 6e 6b 49   void fts5ChunkI
17340 74 65 72 61 74 65 28 0a 20 20 46 74 73 35 49 6e  terate(.  Fts5In
17350 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20 20  dex *p,         
17360 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
17370 65 78 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 46  ex object */.  F
17380 74 73 35 53 65 67 49 74 65 72 20 2a 70 53 65 67  ts5SegIter *pSeg
17390 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
173a0 2a 20 50 6f 73 6c 69 73 74 20 6f 66 20 74 68 69  * Poslist of thi
173b0 73 20 69 74 65 72 61 74 6f 72 20 2a 2f 0a 20 20  s iterator */.  
173c0 76 6f 69 64 20 2a 70 43 74 78 2c 20 20 20 20 20  void *pCtx,     
173d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
173e0 2f 2a 20 43 6f 6e 74 65 78 74 20 70 6f 69 6e 74  /* Context point
173f0 65 72 20 66 6f 72 20 78 43 68 75 6e 6b 20 63 61  er for xChunk ca
17400 6c 6c 62 61 63 6b 20 2a 2f 0a 20 20 76 6f 69 64  llback */.  void
17410 20 28 2a 78 43 68 75 6e 6b 29 28 46 74 73 35 49   (*xChunk)(Fts5I
17420 6e 64 65 78 2a 2c 20 76 6f 69 64 2a 2c 20 63 6f  ndex*, void*, co
17430 6e 73 74 20 75 38 2a 2c 20 69 6e 74 29 0a 29 7b  nst u8*, int).){
17440 0a 20 20 69 6e 74 20 6e 52 65 6d 20 3d 20 70 53  .  int nRem = pS
17450 65 67 2d 3e 6e 50 6f 73 3b 20 20 20 20 20 20 20  eg->nPos;       
17460 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
17470 62 79 74 65 73 20 73 74 69 6c 6c 20 74 6f 20 63  bytes still to c
17480 6f 6d 65 20 2a 2f 0a 20 20 46 74 73 35 44 61 74  ome */.  Fts5Dat
17490 61 20 2a 70 44 61 74 61 20 3d 20 30 3b 0a 20 20  a *pData = 0;.  
174a0 75 38 20 2a 70 43 68 75 6e 6b 20 3d 20 26 70 53  u8 *pChunk = &pS
174b0 65 67 2d 3e 70 4c 65 61 66 2d 3e 70 5b 70 53 65  eg->pLeaf->p[pSe
174c0 67 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 5d 3b  g->iLeafOffset];
174d0 0a 20 20 69 6e 74 20 6e 43 68 75 6e 6b 20 3d 20  .  int nChunk = 
174e0 4d 49 4e 28 6e 52 65 6d 2c 20 70 53 65 67 2d 3e  MIN(nRem, pSeg->
174f0 70 4c 65 61 66 2d 3e 73 7a 4c 65 61 66 20 2d 20  pLeaf->szLeaf - 
17500 70 53 65 67 2d 3e 69 4c 65 61 66 4f 66 66 73 65  pSeg->iLeafOffse
17510 74 29 3b 0a 20 20 69 6e 74 20 70 67 6e 6f 20 3d  t);.  int pgno =
17520 20 70 53 65 67 2d 3e 69 4c 65 61 66 50 67 6e 6f   pSeg->iLeafPgno
17530 3b 0a 20 20 69 6e 74 20 70 67 6e 6f 53 61 76 65  ;.  int pgnoSave
17540 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 54 68 69 73   = 0;..  /* This
17550 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20 6e   function does n
17560 6f 74 6d 77 6f 72 6b 20 77 69 74 68 20 64 65 74  otmwork with det
17570 61 69 6c 3d 6e 6f 6e 65 20 64 61 74 61 62 61 73  ail=none databas
17580 65 73 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  es. */.  assert(
17590 20 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e 65 44 65   p->pConfig->eDe
175a0 74 61 69 6c 21 3d 46 54 53 35 5f 44 45 54 41 49  tail!=FTS5_DETAI
175b0 4c 5f 4e 4f 4e 45 20 29 3b 0a 0a 20 20 69 66 28  L_NONE );..  if(
175c0 20 28 70 53 65 67 2d 3e 66 6c 61 67 73 20 26 20   (pSeg->flags & 
175d0 46 54 53 35 5f 53 45 47 49 54 45 52 5f 52 45 56  FTS5_SEGITER_REV
175e0 45 52 53 45 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ERSE)==0 ){.    
175f0 70 67 6e 6f 53 61 76 65 20 3d 20 70 67 6e 6f 2b  pgnoSave = pgno+
17600 31 3b 0a 20 20 7d 0a 0a 20 20 77 68 69 6c 65 28  1;.  }..  while(
17610 20 31 20 29 7b 0a 20 20 20 20 78 43 68 75 6e 6b   1 ){.    xChunk
17620 28 70 2c 20 70 43 74 78 2c 20 70 43 68 75 6e 6b  (p, pCtx, pChunk
17630 2c 20 6e 43 68 75 6e 6b 29 3b 0a 20 20 20 20 6e  , nChunk);.    n
17640 52 65 6d 20 2d 3d 20 6e 43 68 75 6e 6b 3b 0a 20  Rem -= nChunk;. 
17650 20 20 20 66 74 73 35 44 61 74 61 52 65 6c 65 61     fts5DataRelea
17660 73 65 28 70 44 61 74 61 29 3b 0a 20 20 20 20 69  se(pData);.    i
17670 66 28 20 6e 52 65 6d 3c 3d 30 20 29 7b 0a 20 20  f( nRem<=0 ){.  
17680 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
17690 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 67 6e 6f  else{.      pgno
176a0 2b 2b 3b 0a 20 20 20 20 20 20 70 44 61 74 61 20  ++;.      pData 
176b0 3d 20 66 74 73 35 4c 65 61 66 52 65 61 64 28 70  = fts5LeafRead(p
176c0 2c 20 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f 52  , FTS5_SEGMENT_R
176d0 4f 57 49 44 28 70 53 65 67 2d 3e 70 53 65 67 2d  OWID(pSeg->pSeg-
176e0 3e 69 53 65 67 69 64 2c 20 70 67 6e 6f 29 29 3b  >iSegid, pgno));
176f0 0a 20 20 20 20 20 20 69 66 28 20 70 44 61 74 61  .      if( pData
17700 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ==0 ) break;.   
17710 20 20 20 70 43 68 75 6e 6b 20 3d 20 26 70 44 61     pChunk = &pDa
17720 74 61 2d 3e 70 5b 34 5d 3b 0a 20 20 20 20 20 20  ta->p[4];.      
17730 6e 43 68 75 6e 6b 20 3d 20 4d 49 4e 28 6e 52 65  nChunk = MIN(nRe
17740 6d 2c 20 70 44 61 74 61 2d 3e 73 7a 4c 65 61 66  m, pData->szLeaf
17750 20 2d 20 34 29 3b 0a 20 20 20 20 20 20 69 66 28   - 4);.      if(
17760 20 70 67 6e 6f 3d 3d 70 67 6e 6f 53 61 76 65 20   pgno==pgnoSave 
17770 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ){.        asser
17780 74 28 20 70 53 65 67 2d 3e 70 4e 65 78 74 4c 65  t( pSeg->pNextLe
17790 61 66 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  af==0 );.       
177a0 20 70 53 65 67 2d 3e 70 4e 65 78 74 4c 65 61 66   pSeg->pNextLeaf
177b0 20 3d 20 70 44 61 74 61 3b 0a 20 20 20 20 20 20   = pData;.      
177c0 20 20 70 44 61 74 61 20 3d 20 30 3b 0a 20 20 20    pData = 0;.   
177d0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d     }.    }.  }.}
177e0 0a 0a 2f 2a 0a 2a 2a 20 49 74 65 72 61 74 6f 72  ../*.** Iterator
177f0 20 70 49 74 65 72 20 63 75 72 72 65 6e 74 6c 79   pIter currently
17800 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 76 61 6c   points to a val
17810 69 64 20 65 6e 74 72 79 20 28 6e 6f 74 20 45 4f  id entry (not EO
17820 46 29 2e 20 54 68 69 73 0a 2a 2a 20 66 75 6e 63  F). This.** func
17830 74 69 6f 6e 20 61 70 70 65 6e 64 73 20 74 68 65  tion appends the
17840 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74 20 64   position list d
17850 61 74 61 20 66 6f 72 20 74 68 65 20 63 75 72 72  ata for the curr
17860 65 6e 74 20 65 6e 74 72 79 20 74 6f 0a 2a 2a 20  ent entry to.** 
17870 62 75 66 66 65 72 20 70 42 75 66 2e 20 49 74 20  buffer pBuf. It 
17880 64 6f 65 73 20 6e 6f 74 20 6d 61 6b 65 20 61 20  does not make a 
17890 63 6f 70 79 20 6f 66 20 74 68 65 20 70 6f 73 69  copy of the posi
178a0 74 69 6f 6e 2d 6c 69 73 74 20 73 69 7a 65 0a 2a  tion-list size.*
178b0 2a 20 66 69 65 6c 64 2e 0a 2a 2f 0a 73 74 61 74  * field..*/.stat
178c0 69 63 20 76 6f 69 64 20 66 74 73 35 53 65 67 69  ic void fts5Segi
178d0 74 65 72 50 6f 73 6c 69 73 74 28 0a 20 20 46 74  terPoslist(.  Ft
178e0 73 35 49 6e 64 65 78 20 2a 70 2c 0a 20 20 46 74  s5Index *p,.  Ft
178f0 73 35 53 65 67 49 74 65 72 20 2a 70 53 65 67 2c  s5SegIter *pSeg,
17900 0a 20 20 46 74 73 35 43 6f 6c 73 65 74 20 2a 70  .  Fts5Colset *p
17910 43 6f 6c 73 65 74 2c 0a 20 20 46 74 73 35 42 75  Colset,.  Fts5Bu
17920 66 66 65 72 20 2a 70 42 75 66 0a 29 7b 0a 20 20  ffer *pBuf.){.  
17930 69 66 28 20 30 3d 3d 66 74 73 35 42 75 66 66 65  if( 0==fts5Buffe
17940 72 47 72 6f 77 28 26 70 2d 3e 72 63 2c 20 70 42  rGrow(&p->rc, pB
17950 75 66 2c 20 70 53 65 67 2d 3e 6e 50 6f 73 2b 46  uf, pSeg->nPos+F
17960 54 53 35 5f 44 41 54 41 5f 5a 45 52 4f 5f 50 41  TS5_DATA_ZERO_PA
17970 44 44 49 4e 47 29 20 29 7b 0a 20 20 20 20 6d 65  DDING) ){.    me
17980 6d 73 65 74 28 26 70 42 75 66 2d 3e 70 5b 70 42  mset(&pBuf->p[pB
17990 75 66 2d 3e 6e 2b 70 53 65 67 2d 3e 6e 50 6f 73  uf->n+pSeg->nPos
179a0 5d 2c 20 30 2c 20 46 54 53 35 5f 44 41 54 41 5f  ], 0, FTS5_DATA_
179b0 5a 45 52 4f 5f 50 41 44 44 49 4e 47 29 3b 0a 20  ZERO_PADDING);. 
179c0 20 20 20 69 66 28 20 70 43 6f 6c 73 65 74 3d 3d     if( pColset==
179d0 30 20 29 7b 0a 20 20 20 20 20 20 66 74 73 35 43  0 ){.      fts5C
179e0 68 75 6e 6b 49 74 65 72 61 74 65 28 70 2c 20 70  hunkIterate(p, p
179f0 53 65 67 2c 20 28 76 6f 69 64 2a 29 70 42 75 66  Seg, (void*)pBuf
17a00 2c 20 66 74 73 35 50 6f 73 6c 69 73 74 43 61 6c  , fts5PoslistCal
17a10 6c 62 61 63 6b 29 3b 0a 20 20 20 20 7d 65 6c 73  lback);.    }els
17a20 65 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e  e{.      if( p->
17a30 70 43 6f 6e 66 69 67 2d 3e 65 44 65 74 61 69 6c  pConfig->eDetail
17a40 3d 3d 46 54 53 35 5f 44 45 54 41 49 4c 5f 46 55  ==FTS5_DETAIL_FU
17a50 4c 4c 20 29 7b 0a 20 20 20 20 20 20 20 20 50 6f  LL ){.        Po
17a60 73 6c 69 73 74 43 61 6c 6c 62 61 63 6b 43 74 78  slistCallbackCtx
17a70 20 73 43 74 78 3b 0a 20 20 20 20 20 20 20 20 73   sCtx;.        s
17a80 43 74 78 2e 70 42 75 66 20 3d 20 70 42 75 66 3b  Ctx.pBuf = pBuf;
17a90 0a 20 20 20 20 20 20 20 20 73 43 74 78 2e 70 43  .        sCtx.pC
17aa0 6f 6c 73 65 74 20 3d 20 70 43 6f 6c 73 65 74 3b  olset = pColset;
17ab0 0a 20 20 20 20 20 20 20 20 73 43 74 78 2e 65 53  .        sCtx.eS
17ac0 74 61 74 65 20 3d 20 66 74 73 35 49 6e 64 65 78  tate = fts5Index
17ad0 43 6f 6c 73 65 74 54 65 73 74 28 70 43 6f 6c 73  ColsetTest(pCols
17ae0 65 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  et, 0);.        
17af0 61 73 73 65 72 74 28 20 73 43 74 78 2e 65 53 74  assert( sCtx.eSt
17b00 61 74 65 3d 3d 30 20 7c 7c 20 73 43 74 78 2e 65  ate==0 || sCtx.e
17b10 53 74 61 74 65 3d 3d 31 20 29 3b 0a 20 20 20 20  State==1 );.    
17b20 20 20 20 20 66 74 73 35 43 68 75 6e 6b 49 74 65      fts5ChunkIte
17b30 72 61 74 65 28 70 2c 20 70 53 65 67 2c 20 28 76  rate(p, pSeg, (v
17b40 6f 69 64 2a 29 26 73 43 74 78 2c 20 66 74 73 35  oid*)&sCtx, fts5
17b50 50 6f 73 6c 69 73 74 46 69 6c 74 65 72 43 61 6c  PoslistFilterCal
17b60 6c 62 61 63 6b 29 3b 0a 20 20 20 20 20 20 7d 65  lback);.      }e
17b70 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 50 6f 73  lse{.        Pos
17b80 6c 69 73 74 4f 66 66 73 65 74 73 43 74 78 20 73  listOffsetsCtx s
17b90 43 74 78 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d  Ctx;.        mem
17ba0 73 65 74 28 26 73 43 74 78 2c 20 30 2c 20 73 69  set(&sCtx, 0, si
17bb0 7a 65 6f 66 28 73 43 74 78 29 29 3b 0a 20 20 20  zeof(sCtx));.   
17bc0 20 20 20 20 20 73 43 74 78 2e 70 42 75 66 20 3d       sCtx.pBuf =
17bd0 20 70 42 75 66 3b 0a 20 20 20 20 20 20 20 20 73   pBuf;.        s
17be0 43 74 78 2e 70 43 6f 6c 73 65 74 20 3d 20 70 43  Ctx.pColset = pC
17bf0 6f 6c 73 65 74 3b 0a 20 20 20 20 20 20 20 20 66  olset;.        f
17c00 74 73 35 43 68 75 6e 6b 49 74 65 72 61 74 65 28  ts5ChunkIterate(
17c10 70 2c 20 70 53 65 67 2c 20 28 76 6f 69 64 2a 29  p, pSeg, (void*)
17c20 26 73 43 74 78 2c 20 66 74 73 35 50 6f 73 6c 69  &sCtx, fts5Posli
17c30 73 74 4f 66 66 73 65 74 73 43 61 6c 6c 62 61 63  stOffsetsCallbac
17c40 6b 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  k);.      }.    
17c50 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  }.  }.}../*.** I
17c60 4e 2f 4f 55 54 20 70 61 72 61 6d 65 74 65 72 20  N/OUT parameter 
17c70 28 2a 70 61 29 20 70 6f 69 6e 74 73 20 74 6f 20  (*pa) points to 
17c80 61 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74 20  a position list 
17c90 6e 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2e  n bytes in size.
17ca0 20 49 66 0a 2a 2a 20 74 68 65 20 70 6f 73 69 74   If.** the posit
17cb0 69 6f 6e 20 6c 69 73 74 20 63 6f 6e 74 61 69 6e  ion list contain
17cc0 73 20 65 6e 74 72 69 65 73 20 66 6f 72 20 63 6f  s entries for co
17cd0 6c 75 6d 6e 20 69 43 6f 6c 2c 20 74 68 65 6e 20  lumn iCol, then 
17ce0 28 2a 70 61 29 20 69 73 20 73 65 74 0a 2a 2a 20  (*pa) is set.** 
17cf0 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20  to point to the 
17d00 73 75 62 2d 70 6f 73 69 74 69 6f 6e 2d 6c 69 73  sub-position-lis
17d10 74 20 66 6f 72 20 74 68 61 74 20 63 6f 6c 75 6d  t for that colum
17d20 6e 20 61 6e 64 20 74 68 65 20 6e 75 6d 62 65 72  n and the number
17d30 20 6f 66 0a 2a 2a 20 62 79 74 65 73 20 69 6e 20   of.** bytes in 
17d40 69 74 20 72 65 74 75 72 6e 65 64 2e 20 4f 72 2c  it returned. Or,
17d50 20 69 66 20 74 68 65 20 61 72 67 75 6d 65 6e 74   if the argument
17d60 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74 20 64   position list d
17d70 6f 65 73 20 6e 6f 74 0a 2a 2a 20 63 6f 6e 74 61  oes not.** conta
17d80 69 6e 20 61 6e 79 20 65 6e 74 72 69 65 73 20 66  in any entries f
17d90 6f 72 20 63 6f 6c 75 6d 6e 20 69 43 6f 6c 2c 20  or column iCol, 
17da0 72 65 74 75 72 6e 20 30 2e 0a 2a 2f 0a 73 74 61  return 0..*/.sta
17db0 74 69 63 20 69 6e 74 20 66 74 73 35 49 6e 64 65  tic int fts5Inde
17dc0 78 45 78 74 72 61 63 74 43 6f 6c 28 0a 20 20 63  xExtractCol(.  c
17dd0 6f 6e 73 74 20 75 38 20 2a 2a 70 61 2c 20 20 20  onst u8 **pa,   
17de0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
17df0 2a 20 49 4e 2f 4f 55 54 3a 20 50 6f 69 6e 74 65  * IN/OUT: Pointe
17e00 72 20 74 6f 20 70 6f 73 6c 69 73 74 20 2a 2f 0a  r to poslist */.
17e10 20 20 69 6e 74 20 6e 2c 20 20 20 20 20 20 20 20    int n,        
17e20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17e30 20 20 2f 2a 20 49 4e 3a 20 53 69 7a 65 20 6f 66    /* IN: Size of
17e40 20 70 6f 73 6c 69 73 74 20 69 6e 20 62 79 74 65   poslist in byte
17e50 73 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 20  s */.  int iCol 
17e60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17e70 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e         /* Column
17e80 20 74 6f 20 65 78 74 72 61 63 74 20 66 72 6f 6d   to extract from
17e90 20 70 6f 73 6c 69 73 74 20 2a 2f 0a 29 7b 0a 20   poslist */.){. 
17ea0 20 69 6e 74 20 69 43 75 72 72 65 6e 74 20 3d 20   int iCurrent = 
17eb0 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
17ec0 20 2f 2a 20 41 6e 79 74 68 69 6e 67 20 62 65 66   /* Anything bef
17ed0 6f 72 65 20 74 68 65 20 66 69 72 73 74 20 30 78  ore the first 0x
17ee0 30 31 20 69 73 20 63 6f 6c 20 30 20 2a 2f 0a 20  01 is col 0 */. 
17ef0 20 63 6f 6e 73 74 20 75 38 20 2a 70 20 3d 20 2a   const u8 *p = *
17f00 70 61 3b 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a  pa;.  const u8 *
17f10 70 45 6e 64 20 3d 20 26 70 5b 6e 5d 3b 20 20 20  pEnd = &p[n];   
17f20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 62 79 74        /* One byt
17f30 65 20 70 61 73 74 20 65 6e 64 20 6f 66 20 70 6f  e past end of po
17f40 73 69 74 69 6f 6e 20 6c 69 73 74 20 2a 2f 0a 0a  sition list */..
17f50 20 20 77 68 69 6c 65 28 20 69 43 6f 6c 3e 69 43    while( iCol>iC
17f60 75 72 72 65 6e 74 20 29 7b 0a 20 20 20 20 2f 2a  urrent ){.    /*
17f70 20 41 64 76 61 6e 63 65 20 70 6f 69 6e 74 65 72   Advance pointer
17f80 20 70 20 75 6e 74 69 6c 20 69 74 20 70 6f 69 6e   p until it poin
17f90 74 73 20 74 6f 20 70 45 6e 64 20 6f 72 20 61 6e  ts to pEnd or an
17fa0 20 30 78 30 31 20 62 79 74 65 20 74 68 61 74 20   0x01 byte that 
17fb0 69 73 0a 20 20 20 20 2a 2a 20 6e 6f 74 20 70 61  is.    ** not pa
17fc0 72 74 20 6f 66 20 61 20 76 61 72 69 6e 74 2e 20  rt of a varint. 
17fd0 4e 6f 74 65 20 74 68 61 74 20 69 74 20 69 73 20  Note that it is 
17fe0 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 66 6f 72  not possible for
17ff0 20 61 20 6e 65 67 61 74 69 76 65 0a 20 20 20 20   a negative.    
18000 2a 2a 20 6f 72 20 65 78 74 72 65 6d 65 6c 79 20  ** or extremely 
18010 6c 61 72 67 65 20 76 61 72 69 6e 74 20 74 6f 20  large varint to 
18020 6f 63 63 75 72 20 77 69 74 68 69 6e 20 61 6e 20  occur within an 
18030 75 6e 63 6f 72 72 75 70 74 65 64 20 70 6f 73 69  uncorrupted posi
18040 74 69 6f 6e 20 0a 20 20 20 20 2a 2a 20 6c 69 73  tion .    ** lis
18050 74 2e 20 53 6f 20 74 68 65 20 6c 61 73 74 20 62  t. So the last b
18060 79 74 65 20 6f 66 20 65 61 63 68 20 76 61 72 69  yte of each vari
18070 6e 74 20 6d 61 79 20 62 65 20 61 73 73 75 6d 65  nt may be assume
18080 64 20 74 6f 20 68 61 76 65 20 61 20 63 6c 65 61  d to have a clea
18090 72 0a 20 20 20 20 2a 2a 20 30 78 38 30 20 62 69  r.    ** 0x80 bi
180a0 74 2e 20 20 2a 2f 0a 20 20 20 20 77 68 69 6c 65  t.  */.    while
180b0 28 20 2a 70 21 3d 30 78 30 31 20 29 7b 0a 20 20  ( *p!=0x01 ){.  
180c0 20 20 20 20 77 68 69 6c 65 28 20 2a 70 2b 2b 20      while( *p++ 
180d0 26 20 30 78 38 30 20 29 3b 0a 20 20 20 20 20 20  & 0x80 );.      
180e0 69 66 28 20 70 3e 3d 70 45 6e 64 20 29 20 72 65  if( p>=pEnd ) re
180f0 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20  turn 0;.    }.  
18100 20 20 2a 70 61 20 3d 20 70 2b 2b 3b 0a 20 20 20    *pa = p++;.   
18110 20 69 43 75 72 72 65 6e 74 20 3d 20 2a 70 2b 2b   iCurrent = *p++
18120 3b 0a 20 20 20 20 69 66 28 20 69 43 75 72 72 65  ;.    if( iCurre
18130 6e 74 20 26 20 30 78 38 30 20 29 7b 0a 20 20 20  nt & 0x80 ){.   
18140 20 20 20 70 2d 2d 3b 0a 20 20 20 20 20 20 70 20     p--;.      p 
18150 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e 74  += fts5GetVarint
18160 33 32 28 70 2c 20 69 43 75 72 72 65 6e 74 29 3b  32(p, iCurrent);
18170 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
18180 20 69 43 6f 6c 21 3d 69 43 75 72 72 65 6e 74 20   iCol!=iCurrent 
18190 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20 2f  ) return 0;..  /
181a0 2a 20 41 64 76 61 6e 63 65 20 70 6f 69 6e 74 65  * Advance pointe
181b0 72 20 70 20 75 6e 74 69 6c 20 69 74 20 70 6f 69  r p until it poi
181c0 6e 74 73 20 74 6f 20 70 45 6e 64 20 6f 72 20 61  nts to pEnd or a
181d0 6e 20 30 78 30 31 20 62 79 74 65 20 74 68 61 74  n 0x01 byte that
181e0 20 69 73 0a 20 20 2a 2a 20 6e 6f 74 20 70 61 72   is.  ** not par
181f0 74 20 6f 66 20 61 20 76 61 72 69 6e 74 20 2a 2f  t of a varint */
18200 0a 20 20 77 68 69 6c 65 28 20 70 3c 70 45 6e 64  .  while( p<pEnd
18210 20 26 26 20 2a 70 21 3d 30 78 30 31 20 29 7b 0a   && *p!=0x01 ){.
18220 20 20 20 20 77 68 69 6c 65 28 20 2a 70 2b 2b 20      while( *p++ 
18230 26 20 30 78 38 30 20 29 3b 0a 20 20 7d 0a 0a 20  & 0x80 );.  }.. 
18240 20 72 65 74 75 72 6e 20 70 20 2d 20 28 2a 70 61   return p - (*pa
18250 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69  );.}..static voi
18260 64 20 66 74 73 35 49 6e 64 65 78 45 78 74 72 61  d fts5IndexExtra
18270 63 74 43 6f 6c 73 65 74 28 0a 20 20 69 6e 74 20  ctColset(.  int 
18280 2a 70 52 63 2c 0a 20 20 46 74 73 35 43 6f 6c 73  *pRc,.  Fts5Cols
18290 65 74 20 2a 70 43 6f 6c 73 65 74 2c 20 20 20 20  et *pColset,    
182a0 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 73 65          /* Colse
182b0 74 20 74 6f 20 66 69 6c 74 65 72 20 6f 6e 20 2a  t to filter on *
182c0 2f 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 70 50  /.  const u8 *pP
182d0 6f 73 2c 20 69 6e 74 20 6e 50 6f 73 2c 20 20 20  os, int nPos,   
182e0 20 20 20 20 2f 2a 20 50 6f 73 69 74 69 6f 6e 20      /* Position 
182f0 6c 69 73 74 20 2a 2f 0a 20 20 46 74 73 35 42 75  list */.  Fts5Bu
18300 66 66 65 72 20 2a 70 42 75 66 20 20 20 20 20 20  ffer *pBuf      
18310 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 75 74            /* Out
18320 70 75 74 20 62 75 66 66 65 72 20 2a 2f 0a 29 7b  put buffer */.){
18330 0a 20 20 69 66 28 20 2a 70 52 63 3d 3d 53 51 4c  .  if( *pRc==SQL
18340 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 6e  ITE_OK ){.    in
18350 74 20 69 3b 0a 20 20 20 20 66 74 73 35 42 75 66  t i;.    fts5Buf
18360 66 65 72 5a 65 72 6f 28 70 42 75 66 29 3b 0a 20  ferZero(pBuf);. 
18370 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 43     for(i=0; i<pC
18380 6f 6c 73 65 74 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b  olset->nCol; i++
18390 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 75  ){.      const u
183a0 38 20 2a 70 53 75 62 20 3d 20 70 50 6f 73 3b 0a  8 *pSub = pPos;.
183b0 20 20 20 20 20 20 69 6e 74 20 6e 53 75 62 20 3d        int nSub =
183c0 20 66 74 73 35 49 6e 64 65 78 45 78 74 72 61 63   fts5IndexExtrac
183d0 74 43 6f 6c 28 26 70 53 75 62 2c 20 6e 50 6f 73  tCol(&pSub, nPos
183e0 2c 20 70 43 6f 6c 73 65 74 2d 3e 61 69 43 6f 6c  , pColset->aiCol
183f0 5b 69 5d 29 3b 0a 20 20 20 20 20 20 69 66 28 20  [i]);.      if( 
18400 6e 53 75 62 20 29 7b 0a 20 20 20 20 20 20 20 20  nSub ){.        
18410 66 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64  fts5BufferAppend
18420 42 6c 6f 62 28 70 52 63 2c 20 70 42 75 66 2c 20  Blob(pRc, pBuf, 
18430 6e 53 75 62 2c 20 70 53 75 62 29 3b 0a 20 20 20  nSub, pSub);.   
18440 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d     }.    }.  }.}
18450 0a 0a 2f 2a 0a 2a 2a 20 78 53 65 74 4f 75 74 70  ../*.** xSetOutp
18460 75 74 73 20 63 61 6c 6c 62 61 63 6b 20 75 73 65  uts callback use
18470 64 20 62 79 20 64 65 74 61 69 6c 3d 6e 6f 6e 65  d by detail=none
18480 20 74 61 62 6c 65 73 2e 0a 2a 2f 0a 73 74 61 74   tables..*/.stat
18490 69 63 20 76 6f 69 64 20 66 74 73 35 49 74 65 72  ic void fts5Iter
184a0 53 65 74 4f 75 74 70 75 74 73 5f 4e 6f 6e 65 28  SetOutputs_None(
184b0 46 74 73 35 49 74 65 72 20 2a 70 49 74 65 72 2c  Fts5Iter *pIter,
184c0 20 46 74 73 35 53 65 67 49 74 65 72 20 2a 70 53   Fts5SegIter *pS
184d0 65 67 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70  eg){.  assert( p
184e0 49 74 65 72 2d 3e 70 49 6e 64 65 78 2d 3e 70 43  Iter->pIndex->pC
184f0 6f 6e 66 69 67 2d 3e 65 44 65 74 61 69 6c 3d 3d  onfig->eDetail==
18500 46 54 53 35 5f 44 45 54 41 49 4c 5f 4e 4f 4e 45  FTS5_DETAIL_NONE
18510 20 29 3b 0a 20 20 70 49 74 65 72 2d 3e 62 61 73   );.  pIter->bas
18520 65 2e 69 52 6f 77 69 64 20 3d 20 70 53 65 67 2d  e.iRowid = pSeg-
18530 3e 69 52 6f 77 69 64 3b 0a 20 20 70 49 74 65 72  >iRowid;.  pIter
18540 2d 3e 62 61 73 65 2e 6e 44 61 74 61 20 3d 20 70  ->base.nData = p
18550 53 65 67 2d 3e 6e 50 6f 73 3b 0a 7d 0a 0a 2f 2a  Seg->nPos;.}../*
18560 0a 2a 2a 20 78 53 65 74 4f 75 74 70 75 74 73 20  .** xSetOutputs 
18570 63 61 6c 6c 62 61 63 6b 20 75 73 65 64 20 62 79  callback used by
18580 20 64 65 74 61 69 6c 3d 66 75 6c 6c 20 61 6e 64   detail=full and
18590 20 64 65 74 61 69 6c 3d 63 6f 6c 20 74 61 62 6c   detail=col tabl
185a0 65 73 20 77 68 65 6e 20 6e 6f 0a 2a 2a 20 63 6f  es when no.** co
185b0 6c 75 6d 6e 20 66 69 6c 74 65 72 73 20 61 72 65  lumn filters are
185c0 20 73 70 65 63 69 66 69 65 64 2e 0a 2a 2f 0a 73   specified..*/.s
185d0 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 49  tatic void fts5I
185e0 74 65 72 53 65 74 4f 75 74 70 75 74 73 5f 4e 6f  terSetOutputs_No
185f0 63 6f 6c 73 65 74 28 46 74 73 35 49 74 65 72 20  colset(Fts5Iter 
18600 2a 70 49 74 65 72 2c 20 46 74 73 35 53 65 67 49  *pIter, Fts5SegI
18610 74 65 72 20 2a 70 53 65 67 29 7b 0a 20 20 70 49  ter *pSeg){.  pI
18620 74 65 72 2d 3e 62 61 73 65 2e 69 52 6f 77 69 64  ter->base.iRowid
18630 20 3d 20 70 53 65 67 2d 3e 69 52 6f 77 69 64 3b   = pSeg->iRowid;
18640 0a 20 20 70 49 74 65 72 2d 3e 62 61 73 65 2e 6e  .  pIter->base.n
18650 44 61 74 61 20 3d 20 70 53 65 67 2d 3e 6e 50 6f  Data = pSeg->nPo
18660 73 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 49  s;..  assert( pI
18670 74 65 72 2d 3e 70 49 6e 64 65 78 2d 3e 70 43 6f  ter->pIndex->pCo
18680 6e 66 69 67 2d 3e 65 44 65 74 61 69 6c 21 3d 46  nfig->eDetail!=F
18690 54 53 35 5f 44 45 54 41 49 4c 5f 4e 4f 4e 45 20  TS5_DETAIL_NONE 
186a0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 49 74  );.  assert( pIt
186b0 65 72 2d 3e 70 43 6f 6c 73 65 74 3d 3d 30 20 29  er->pColset==0 )
186c0 3b 0a 0a 20 20 69 66 28 20 70 53 65 67 2d 3e 69  ;..  if( pSeg->i
186d0 4c 65 61 66 4f 66 66 73 65 74 2b 70 53 65 67 2d  LeafOffset+pSeg-
186e0 3e 6e 50 6f 73 3c 3d 70 53 65 67 2d 3e 70 4c 65  >nPos<=pSeg->pLe
186f0 61 66 2d 3e 73 7a 4c 65 61 66 20 29 7b 0a 20 20  af->szLeaf ){.  
18700 20 20 2f 2a 20 41 6c 6c 20 64 61 74 61 20 69 73    /* All data is
18710 20 73 74 6f 72 65 64 20 6f 6e 20 74 68 65 20 63   stored on the c
18720 75 72 72 65 6e 74 20 70 61 67 65 2e 20 50 6f 70  urrent page. Pop
18730 75 6c 61 74 65 20 74 68 65 20 6f 75 74 70 75 74  ulate the output
18740 20 0a 20 20 20 20 2a 2a 20 76 61 72 69 61 62 6c   .    ** variabl
18750 65 73 20 74 6f 20 70 6f 69 6e 74 20 69 6e 74 6f  es to point into
18760 20 74 68 65 20 62 6f 64 79 20 6f 66 20 74 68 65   the body of the
18770 20 70 61 67 65 20 6f 62 6a 65 63 74 2e 20 2a 2f   page object. */
18780 0a 20 20 20 20 70 49 74 65 72 2d 3e 62 61 73 65  .    pIter->base
18790 2e 70 44 61 74 61 20 3d 20 26 70 53 65 67 2d 3e  .pData = &pSeg->
187a0 70 4c 65 61 66 2d 3e 70 5b 70 53 65 67 2d 3e 69  pLeaf->p[pSeg->i
187b0 4c 65 61 66 4f 66 66 73 65 74 5d 3b 0a 20 20 7d  LeafOffset];.  }
187c0 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65  else{.    /* The
187d0 20 64 61 74 61 20 69 73 20 64 69 73 74 72 69 62   data is distrib
187e0 75 74 65 64 20 6f 76 65 72 20 74 77 6f 20 6f 72  uted over two or
187f0 20 6d 6f 72 65 20 70 61 67 65 73 2e 20 43 6f 70   more pages. Cop
18800 79 20 69 74 20 69 6e 74 6f 20 74 68 65 0a 20 20  y it into the.  
18810 20 20 2a 2a 20 46 74 73 35 49 74 65 72 2e 70 6f    ** Fts5Iter.po
18820 73 6c 69 73 74 20 62 75 66 66 65 72 20 61 6e 64  slist buffer and
18830 20 74 68 65 6e 20 73 65 74 20 74 68 65 20 6f 75   then set the ou
18840 74 70 75 74 20 70 6f 69 6e 74 65 72 20 74 6f 20  tput pointer to 
18850 70 6f 69 6e 74 0a 20 20 20 20 2a 2a 20 74 6f 20  point.    ** to 
18860 74 68 69 73 20 62 75 66 66 65 72 2e 20 20 2a 2f  this buffer.  */
18870 0a 20 20 20 20 66 74 73 35 42 75 66 66 65 72 5a  .    fts5BufferZ
18880 65 72 6f 28 26 70 49 74 65 72 2d 3e 70 6f 73 6c  ero(&pIter->posl
18890 69 73 74 29 3b 0a 20 20 20 20 66 74 73 35 53 65  ist);.    fts5Se
188a0 67 69 74 65 72 50 6f 73 6c 69 73 74 28 70 49 74  giterPoslist(pIt
188b0 65 72 2d 3e 70 49 6e 64 65 78 2c 20 70 53 65 67  er->pIndex, pSeg
188c0 2c 20 30 2c 20 26 70 49 74 65 72 2d 3e 70 6f 73  , 0, &pIter->pos
188d0 6c 69 73 74 29 3b 0a 20 20 20 20 70 49 74 65 72  list);.    pIter
188e0 2d 3e 62 61 73 65 2e 70 44 61 74 61 20 3d 20 70  ->base.pData = p
188f0 49 74 65 72 2d 3e 70 6f 73 6c 69 73 74 2e 70 3b  Iter->poslist.p;
18900 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 78 53  .  }.}../*.** xS
18910 65 74 4f 75 74 70 75 74 73 20 63 61 6c 6c 62 61  etOutputs callba
18920 63 6b 20 75 73 65 64 20 77 68 65 6e 20 74 68 65  ck used when the
18930 20 46 74 73 35 43 6f 6c 73 65 74 20 6f 62 6a 65   Fts5Colset obje
18940 63 74 20 68 61 73 20 6e 43 6f 6c 3d 3d 30 20 28  ct has nCol==0 (
18950 6d 61 74 63 68 0a 2a 2a 20 61 67 61 69 6e 73 74  match.** against
18960 20 6e 6f 20 63 6f 6c 75 6d 6e 73 20 61 74 20 61   no columns at a
18970 6c 6c 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ll)..*/.static v
18980 6f 69 64 20 66 74 73 35 49 74 65 72 53 65 74 4f  oid fts5IterSetO
18990 75 74 70 75 74 73 5f 5a 65 72 6f 43 6f 6c 73 65  utputs_ZeroColse
189a0 74 28 46 74 73 35 49 74 65 72 20 2a 70 49 74 65  t(Fts5Iter *pIte
189b0 72 2c 20 46 74 73 35 53 65 67 49 74 65 72 20 2a  r, Fts5SegIter *
189c0 70 53 65 67 29 7b 0a 20 20 55 4e 55 53 45 44 5f  pSeg){.  UNUSED_
189d0 50 41 52 41 4d 28 70 53 65 67 29 3b 0a 20 20 70  PARAM(pSeg);.  p
189e0 49 74 65 72 2d 3e 62 61 73 65 2e 6e 44 61 74 61  Iter->base.nData
189f0 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 78   = 0;.}../*.** x
18a00 53 65 74 4f 75 74 70 75 74 73 20 63 61 6c 6c 62  SetOutputs callb
18a10 61 63 6b 20 75 73 65 64 20 62 79 20 64 65 74 61  ack used by deta
18a20 69 6c 3d 63 6f 6c 20 77 68 65 6e 20 74 68 65 72  il=col when ther
18a30 65 20 69 73 20 61 20 63 6f 6c 75 6d 6e 20 66 69  e is a column fi
18a40 6c 74 65 72 0a 2a 2a 20 61 6e 64 20 74 68 65 72  lter.** and ther
18a50 65 20 61 72 65 20 31 30 30 20 6f 72 20 6d 6f 72  e are 100 or mor
18a60 65 20 63 6f 6c 75 6d 6e 73 2e 20 41 6c 73 6f 20  e columns. Also 
18a70 63 61 6c 6c 65 64 20 61 73 20 61 20 66 61 6c 6c  called as a fall
18a80 62 61 63 6b 20 66 72 6f 6d 0a 2a 2a 20 66 74 73  back from.** fts
18a90 35 49 74 65 72 53 65 74 4f 75 74 70 75 74 73 5f  5IterSetOutputs_
18aa0 43 6f 6c 31 30 30 20 69 66 20 74 68 65 20 63 6f  Col100 if the co
18ab0 6c 75 6d 6e 2d 6c 69 73 74 20 73 70 61 6e 73 20  lumn-list spans 
18ac0 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 70 61  more than one pa
18ad0 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ge..*/.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 28 46 74 73 35 49 74  tputs_Col(Fts5It
18b00 65 72 20 2a 70 49 74 65 72 2c 20 46 74 73 35 53  er *pIter, Fts5S
18b10 65 67 49 74 65 72 20 2a 70 53 65 67 29 7b 0a 20  egIter *pSeg){. 
18b20 20 66 74 73 35 42 75 66 66 65 72 5a 65 72 6f 28   fts5BufferZero(
18b30 26 70 49 74 65 72 2d 3e 70 6f 73 6c 69 73 74 29  &pIter->poslist)
18b40 3b 0a 20 20 66 74 73 35 53 65 67 69 74 65 72 50  ;.  fts5SegiterP
18b50 6f 73 6c 69 73 74 28 70 49 74 65 72 2d 3e 70 49  oslist(pIter->pI
18b60 6e 64 65 78 2c 20 70 53 65 67 2c 20 70 49 74 65  ndex, pSeg, pIte
18b70 72 2d 3e 70 43 6f 6c 73 65 74 2c 20 26 70 49 74  r->pColset, &pIt
18b80 65 72 2d 3e 70 6f 73 6c 69 73 74 29 3b 0a 20 20  er->poslist);.  
18b90 70 49 74 65 72 2d 3e 62 61 73 65 2e 69 52 6f 77  pIter->base.iRow
18ba0 69 64 20 3d 20 70 53 65 67 2d 3e 69 52 6f 77 69  id = pSeg->iRowi
18bb0 64 3b 0a 20 20 70 49 74 65 72 2d 3e 62 61 73 65  d;.  pIter->base
18bc0 2e 70 44 61 74 61 20 3d 20 70 49 74 65 72 2d 3e  .pData = pIter->
18bd0 70 6f 73 6c 69 73 74 2e 70 3b 0a 20 20 70 49 74  poslist.p;.  pIt
18be0 65 72 2d 3e 62 61 73 65 2e 6e 44 61 74 61 20 3d  er->base.nData =
18bf0 20 70 49 74 65 72 2d 3e 70 6f 73 6c 69 73 74 2e   pIter->poslist.
18c00 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 78 53 65 74  n;.}../*.** xSet
18c10 4f 75 74 70 75 74 73 20 63 61 6c 6c 62 61 63 6b  Outputs callback
18c20 20 75 73 65 64 20 77 68 65 6e 3a 20 0a 2a 2a 0a   used when: .**.
18c30 2a 2a 20 20 20 2a 20 64 65 74 61 69 6c 3d 63 6f  **   * detail=co
18c40 6c 2c 0a 2a 2a 20 20 20 2a 20 74 68 65 72 65 20  l,.**   * there 
18c50 69 73 20 61 20 63 6f 6c 75 6d 6e 20 66 69 6c 74  is a column filt
18c60 65 72 2c 20 61 6e 64 0a 2a 2a 20 20 20 2a 20 74  er, and.**   * t
18c70 68 65 20 74 61 62 6c 65 20 63 6f 6e 74 61 69 6e  he table contain
18c80 73 20 31 30 30 20 6f 72 20 66 65 77 65 72 20 63  s 100 or fewer c
18c90 6f 6c 75 6d 6e 73 2e 20 0a 2a 2a 0a 2a 2a 20 54  olumns. .**.** T
18ca0 68 65 20 6c 61 73 74 20 70 6f 69 6e 74 20 69 73  he last point is
18cb0 20 74 6f 20 65 6e 73 75 72 65 20 61 6c 6c 20 63   to ensure all c
18cc0 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 73 20 61 72  olumn numbers ar
18cd0 65 20 73 74 6f 72 65 64 20 61 73 20 0a 2a 2a 20  e stored as .** 
18ce0 73 69 6e 67 6c 65 2d 62 79 74 65 20 76 61 72 69  single-byte vari
18cf0 6e 74 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  nts..*/.static v
18d00 6f 69 64 20 66 74 73 35 49 74 65 72 53 65 74 4f  oid fts5IterSetO
18d10 75 74 70 75 74 73 5f 43 6f 6c 31 30 30 28 46 74  utputs_Col100(Ft
18d20 73 35 49 74 65 72 20 2a 70 49 74 65 72 2c 20 46  s5Iter *pIter, F
18d30 74 73 35 53 65 67 49 74 65 72 20 2a 70 53 65 67  ts5SegIter *pSeg
18d40 29 7b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 49  ){..  assert( pI
18d50 74 65 72 2d 3e 70 49 6e 64 65 78 2d 3e 70 43 6f  ter->pIndex->pCo
18d60 6e 66 69 67 2d 3e 65 44 65 74 61 69 6c 3d 3d 46  nfig->eDetail==F
18d70 54 53 35 5f 44 45 54 41 49 4c 5f 43 4f 4c 55 4d  TS5_DETAIL_COLUM
18d80 4e 53 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  NS );.  assert( 
18d90 70 49 74 65 72 2d 3e 70 43 6f 6c 73 65 74 20 29  pIter->pColset )
18da0 3b 0a 0a 20 20 69 66 28 20 70 53 65 67 2d 3e 69  ;..  if( pSeg->i
18db0 4c 65 61 66 4f 66 66 73 65 74 2b 70 53 65 67 2d  LeafOffset+pSeg-
18dc0 3e 6e 50 6f 73 3e 70 53 65 67 2d 3e 70 4c 65 61  >nPos>pSeg->pLea
18dd0 66 2d 3e 73 7a 4c 65 61 66 20 29 7b 0a 20 20 20  f->szLeaf ){.   
18de0 20 66 74 73 35 49 74 65 72 53 65 74 4f 75 74 70   fts5IterSetOutp
18df0 75 74 73 5f 43 6f 6c 28 70 49 74 65 72 2c 20 70  uts_Col(pIter, p
18e00 53 65 67 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  Seg);.  }else{. 
18e10 20 20 20 75 38 20 2a 61 20 3d 20 28 75 38 2a 29     u8 *a = (u8*)
18e20 26 70 53 65 67 2d 3e 70 4c 65 61 66 2d 3e 70 5b  &pSeg->pLeaf->p[
18e30 70 53 65 67 2d 3e 69 4c 65 61 66 4f 66 66 73 65  pSeg->iLeafOffse
18e40 74 5d 3b 0a 20 20 20 20 75 38 20 2a 70 45 6e 64  t];.    u8 *pEnd
18e50 20 3d 20 28 75 38 2a 29 26 61 5b 70 53 65 67 2d   = (u8*)&a[pSeg-
18e60 3e 6e 50 6f 73 5d 3b 20 0a 20 20 20 20 69 6e 74  >nPos]; .    int
18e70 20 69 50 72 65 76 20 3d 20 30 3b 0a 20 20 20 20   iPrev = 0;.    
18e80 69 6e 74 20 2a 61 69 43 6f 6c 20 3d 20 70 49 74  int *aiCol = pIt
18e90 65 72 2d 3e 70 43 6f 6c 73 65 74 2d 3e 61 69 43  er->pColset->aiC
18ea0 6f 6c 3b 0a 20 20 20 20 69 6e 74 20 2a 61 69 43  ol;.    int *aiC
18eb0 6f 6c 45 6e 64 20 3d 20 26 61 69 43 6f 6c 5b 70  olEnd = &aiCol[p
18ec0 49 74 65 72 2d 3e 70 43 6f 6c 73 65 74 2d 3e 6e  Iter->pColset->n
18ed0 43 6f 6c 5d 3b 0a 0a 20 20 20 20 75 38 20 2a 61  Col];..    u8 *a
18ee0 4f 75 74 20 3d 20 70 49 74 65 72 2d 3e 70 6f 73  Out = pIter->pos
18ef0 6c 69 73 74 2e 70 3b 0a 20 20 20 20 69 6e 74 20  list.p;.    int 
18f00 69 50 72 65 76 4f 75 74 20 3d 20 30 3b 0a 0a 20  iPrevOut = 0;.. 
18f10 20 20 20 70 49 74 65 72 2d 3e 62 61 73 65 2e 69     pIter->base.i
18f20 52 6f 77 69 64 20 3d 20 70 53 65 67 2d 3e 69 52  Rowid = pSeg->iR
18f30 6f 77 69 64 3b 0a 0a 20 20 20 20 77 68 69 6c 65  owid;..    while
18f40 28 20 61 3c 70 45 6e 64 20 29 7b 0a 20 20 20 20  ( a<pEnd ){.    
18f50 20 20 69 50 72 65 76 20 2b 3d 20 28 69 6e 74 29    iPrev += (int)
18f60 61 2b 2b 5b 30 5d 20 2d 20 32 3b 0a 20 20 20 20  a++[0] - 2;.    
18f70 20 20 77 68 69 6c 65 28 20 2a 61 69 43 6f 6c 3c    while( *aiCol<
18f80 69 50 72 65 76 20 29 7b 0a 20 20 20 20 20 20 20  iPrev ){.       
18f90 20 61 69 43 6f 6c 2b 2b 3b 0a 20 20 20 20 20 20   aiCol++;.      
18fa0 20 20 69 66 28 20 61 69 43 6f 6c 3d 3d 61 69 43    if( aiCol==aiC
18fb0 6f 6c 45 6e 64 20 29 20 67 6f 74 6f 20 73 65 74  olEnd ) goto set
18fc0 6f 75 74 70 75 74 73 5f 63 6f 6c 5f 6f 75 74 3b  outputs_col_out;
18fd0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
18fe0 66 28 20 2a 61 69 43 6f 6c 3d 3d 69 50 72 65 76  f( *aiCol==iPrev
18ff0 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 61 4f 75   ){.        *aOu
19000 74 2b 2b 20 3d 20 28 75 38 29 28 28 69 50 72 65  t++ = (u8)((iPre
19010 76 20 2d 20 69 50 72 65 76 4f 75 74 29 20 2b 20  v - iPrevOut) + 
19020 32 29 3b 0a 20 20 20 20 20 20 20 20 69 50 72 65  2);.        iPre
19030 76 4f 75 74 20 3d 20 69 50 72 65 76 3b 0a 20 20  vOut = iPrev;.  
19040 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 73 65 74      }.    }..set
19050 6f 75 74 70 75 74 73 5f 63 6f 6c 5f 6f 75 74 3a  outputs_col_out:
19060 0a 20 20 20 20 70 49 74 65 72 2d 3e 62 61 73 65  .    pIter->base
19070 2e 70 44 61 74 61 20 3d 20 70 49 74 65 72 2d 3e  .pData = pIter->
19080 70 6f 73 6c 69 73 74 2e 70 3b 0a 20 20 20 20 70  poslist.p;.    p
19090 49 74 65 72 2d 3e 62 61 73 65 2e 6e 44 61 74 61  Iter->base.nData
190a0 20 3d 20 61 4f 75 74 20 2d 20 70 49 74 65 72 2d   = aOut - pIter-
190b0 3e 70 6f 73 6c 69 73 74 2e 70 3b 0a 20 20 7d 0a  >poslist.p;.  }.
190c0 7d 0a 0a 2f 2a 0a 2a 2a 20 78 53 65 74 4f 75 74  }../*.** xSetOut
190d0 70 75 74 73 20 63 61 6c 6c 62 61 63 6b 20 75 73  puts callback us
190e0 65 64 20 62 79 20 64 65 74 61 69 6c 3d 66 75 6c  ed by detail=ful
190f0 6c 20 77 68 65 6e 20 74 68 65 72 65 20 69 73 20  l when there is 
19100 61 20 63 6f 6c 75 6d 6e 20 66 69 6c 74 65 72 2e  a column filter.
19110 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
19120 66 74 73 35 49 74 65 72 53 65 74 4f 75 74 70 75  fts5IterSetOutpu
19130 74 73 5f 46 75 6c 6c 28 46 74 73 35 49 74 65 72  ts_Full(Fts5Iter
19140 20 2a 70 49 74 65 72 2c 20 46 74 73 35 53 65 67   *pIter, Fts5Seg
19150 49 74 65 72 20 2a 70 53 65 67 29 7b 0a 20 20 46  Iter *pSeg){.  F
19160 74 73 35 43 6f 6c 73 65 74 20 2a 70 43 6f 6c 73  ts5Colset *pCols
19170 65 74 20 3d 20 70 49 74 65 72 2d 3e 70 43 6f 6c  et = pIter->pCol
19180 73 65 74 3b 0a 20 20 70 49 74 65 72 2d 3e 62 61  set;.  pIter->ba
19190 73 65 2e 69 52 6f 77 69 64 20 3d 20 70 53 65 67  se.iRowid = pSeg
191a0 2d 3e 69 52 6f 77 69 64 3b 0a 0a 20 20 61 73 73  ->iRowid;..  ass
191b0 65 72 74 28 20 70 49 74 65 72 2d 3e 70 49 6e 64  ert( pIter->pInd
191c0 65 78 2d 3e 70 43 6f 6e 66 69 67 2d 3e 65 44 65  ex->pConfig->eDe
191d0 74 61 69 6c 3d 3d 46 54 53 35 5f 44 45 54 41 49  tail==FTS5_DETAI
191e0 4c 5f 46 55 4c 4c 20 29 3b 0a 20 20 61 73 73 65  L_FULL );.  asse
191f0 72 74 28 20 70 43 6f 6c 73 65 74 20 29 3b 0a 0a  rt( pColset );..
19200 20 20 69 66 28 20 70 53 65 67 2d 3e 69 4c 65 61    if( pSeg->iLea
19210 66 4f 66 66 73 65 74 2b 70 53 65 67 2d 3e 6e 50  fOffset+pSeg->nP
19220 6f 73 3c 3d 70 53 65 67 2d 3e 70 4c 65 61 66 2d  os<=pSeg->pLeaf-
19230 3e 73 7a 4c 65 61 66 20 29 7b 0a 20 20 20 20 2f  >szLeaf ){.    /
19240 2a 20 41 6c 6c 20 64 61 74 61 20 69 73 20 73 74  * All data is st
19250 6f 72 65 64 20 6f 6e 20 74 68 65 20 63 75 72 72  ored on the curr
19260 65 6e 74 20 70 61 67 65 2e 20 50 6f 70 75 6c 61  ent page. Popula
19270 74 65 20 74 68 65 20 6f 75 74 70 75 74 20 0a 20  te the output . 
19280 20 20 20 2a 2a 20 76 61 72 69 61 62 6c 65 73 20     ** variables 
19290 74 6f 20 70 6f 69 6e 74 20 69 6e 74 6f 20 74 68  to point into th
192a0 65 20 62 6f 64 79 20 6f 66 20 74 68 65 20 70 61  e body of the pa
192b0 67 65 20 6f 62 6a 65 63 74 2e 20 2a 2f 0a 20 20  ge object. */.  
192c0 20 20 63 6f 6e 73 74 20 75 38 20 2a 61 20 3d 20    const u8 *a = 
192d0 26 70 53 65 67 2d 3e 70 4c 65 61 66 2d 3e 70 5b  &pSeg->pLeaf->p[
192e0 70 53 65 67 2d 3e 69 4c 65 61 66 4f 66 66 73 65  pSeg->iLeafOffse
192f0 74 5d 3b 0a 20 20 20 20 69 66 28 20 70 43 6f 6c  t];.    if( pCol
19300 73 65 74 2d 3e 6e 43 6f 6c 3d 3d 31 20 29 7b 0a  set->nCol==1 ){.
19310 20 20 20 20 20 20 70 49 74 65 72 2d 3e 62 61 73        pIter->bas
19320 65 2e 6e 44 61 74 61 20 3d 20 66 74 73 35 49 6e  e.nData = fts5In
19330 64 65 78 45 78 74 72 61 63 74 43 6f 6c 28 26 61  dexExtractCol(&a
19340 2c 20 70 53 65 67 2d 3e 6e 50 6f 73 2c 70 43 6f  , pSeg->nPos,pCo
19350 6c 73 65 74 2d 3e 61 69 43 6f 6c 5b 30 5d 29 3b  lset->aiCol[0]);
19360 0a 20 20 20 20 20 20 70 49 74 65 72 2d 3e 62 61  .      pIter->ba
19370 73 65 2e 70 44 61 74 61 20 3d 20 61 3b 0a 20 20  se.pData = a;.  
19380 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69    }else{.      i
19390 6e 74 20 2a 70 52 63 20 3d 20 26 70 49 74 65 72  nt *pRc = &pIter
193a0 2d 3e 70 49 6e 64 65 78 2d 3e 72 63 3b 0a 20 20  ->pIndex->rc;.  
193b0 20 20 20 20 66 74 73 35 42 75 66 66 65 72 5a 65      fts5BufferZe
193c0 72 6f 28 26 70 49 74 65 72 2d 3e 70 6f 73 6c 69  ro(&pIter->posli
193d0 73 74 29 3b 0a 20 20 20 20 20 20 66 74 73 35 49  st);.      fts5I
193e0 6e 64 65 78 45 78 74 72 61 63 74 43 6f 6c 73 65  ndexExtractColse
193f0 74 28 70 52 63 2c 20 70 43 6f 6c 73 65 74 2c 20  t(pRc, pColset, 
19400 61 2c 20 70 53 65 67 2d 3e 6e 50 6f 73 2c 20 26  a, pSeg->nPos, &
19410 70 49 74 65 72 2d 3e 70 6f 73 6c 69 73 74 29 3b  pIter->poslist);
19420 0a 20 20 20 20 20 20 70 49 74 65 72 2d 3e 62 61  .      pIter->ba
19430 73 65 2e 70 44 61 74 61 20 3d 20 70 49 74 65 72  se.pData = pIter
19440 2d 3e 70 6f 73 6c 69 73 74 2e 70 3b 0a 20 20 20  ->poslist.p;.   
19450 20 20 20 70 49 74 65 72 2d 3e 62 61 73 65 2e 6e     pIter->base.n
19460 44 61 74 61 20 3d 20 70 49 74 65 72 2d 3e 70 6f  Data = pIter->po
19470 73 6c 69 73 74 2e 6e 3b 0a 20 20 20 20 7d 0a 20  slist.n;.    }. 
19480 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54   }else{.    /* T
19490 68 65 20 64 61 74 61 20 69 73 20 64 69 73 74 72  he data is distr
194a0 69 62 75 74 65 64 20 6f 76 65 72 20 74 77 6f 20  ibuted over two 
194b0 6f 72 20 6d 6f 72 65 20 70 61 67 65 73 2e 20 43  or more pages. C
194c0 6f 70 79 20 69 74 20 69 6e 74 6f 20 74 68 65 0a  opy it into the.
194d0 20 20 20 20 2a 2a 20 46 74 73 35 49 74 65 72 2e      ** Fts5Iter.
194e0 70 6f 73 6c 69 73 74 20 62 75 66 66 65 72 20 61  poslist buffer a
194f0 6e 64 20 74 68 65 6e 20 73 65 74 20 74 68 65 20  nd then set the 
19500 6f 75 74 70 75 74 20 70 6f 69 6e 74 65 72 20 74  output pointer t
19510 6f 20 70 6f 69 6e 74 0a 20 20 20 20 2a 2a 20 74  o point.    ** t
19520 6f 20 74 68 69 73 20 62 75 66 66 65 72 2e 20 20  o this buffer.  
19530 2a 2f 0a 20 20 20 20 66 74 73 35 42 75 66 66 65  */.    fts5Buffe
19540 72 5a 65 72 6f 28 26 70 49 74 65 72 2d 3e 70 6f  rZero(&pIter->po
19550 73 6c 69 73 74 29 3b 0a 20 20 20 20 66 74 73 35  slist);.    fts5
19560 53 65 67 69 74 65 72 50 6f 73 6c 69 73 74 28 70  SegiterPoslist(p
19570 49 74 65 72 2d 3e 70 49 6e 64 65 78 2c 20 70 53  Iter->pIndex, pS
19580 65 67 2c 20 70 43 6f 6c 73 65 74 2c 20 26 70 49  eg, pColset, &pI
19590 74 65 72 2d 3e 70 6f 73 6c 69 73 74 29 3b 0a 20  ter->poslist);. 
195a0 20 20 20 70 49 74 65 72 2d 3e 62 61 73 65 2e 70     pIter->base.p
195b0 44 61 74 61 20 3d 20 70 49 74 65 72 2d 3e 70 6f  Data = pIter->po
195c0 73 6c 69 73 74 2e 70 3b 0a 20 20 20 20 70 49 74  slist.p;.    pIt
195d0 65 72 2d 3e 62 61 73 65 2e 6e 44 61 74 61 20 3d  er->base.nData =
195e0 20 70 49 74 65 72 2d 3e 70 6f 73 6c 69 73 74 2e   pIter->poslist.
195f0 6e 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63  n;.  }.}..static
19600 20 76 6f 69 64 20 66 74 73 35 49 74 65 72 53 65   void fts5IterSe
19610 74 4f 75 74 70 75 74 43 62 28 69 6e 74 20 2a 70  tOutputCb(int *p
19620 52 63 2c 20 46 74 73 35 49 74 65 72 20 2a 70 49  Rc, Fts5Iter *pI
19630 74 65 72 29 7b 0a 20 20 69 66 28 20 2a 70 52 63  ter){.  if( *pRc
19640 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
19650 20 20 20 46 74 73 35 43 6f 6e 66 69 67 20 2a 70     Fts5Config *p
19660 43 6f 6e 66 69 67 20 3d 20 70 49 74 65 72 2d 3e  Config = pIter->
19670 70 49 6e 64 65 78 2d 3e 70 43 6f 6e 66 69 67 3b  pIndex->pConfig;
19680 0a 20 20 20 20 69 66 28 20 70 43 6f 6e 66 69 67  .    if( pConfig
19690 2d 3e 65 44 65 74 61 69 6c 3d 3d 46 54 53 35 5f  ->eDetail==FTS5_
196a0 44 45 54 41 49 4c 5f 4e 4f 4e 45 20 29 7b 0a 20  DETAIL_NONE ){. 
196b0 20 20 20 20 20 70 49 74 65 72 2d 3e 78 53 65 74       pIter->xSet
196c0 4f 75 74 70 75 74 73 20 3d 20 66 74 73 35 49 74  Outputs = fts5It
196d0 65 72 53 65 74 4f 75 74 70 75 74 73 5f 4e 6f 6e  erSetOutputs_Non
196e0 65 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 65 6c  e;.    }..    el
196f0 73 65 20 69 66 28 20 70 49 74 65 72 2d 3e 70 43  se if( pIter->pC
19700 6f 6c 73 65 74 3d 3d 30 20 29 7b 0a 20 20 20 20  olset==0 ){.    
19710 20 20 70 49 74 65 72 2d 3e 78 53 65 74 4f 75 74    pIter->xSetOut
19720 70 75 74 73 20 3d 20 66 74 73 35 49 74 65 72 53  puts = fts5IterS
19730 65 74 4f 75 74 70 75 74 73 5f 4e 6f 63 6f 6c 73  etOutputs_Nocols
19740 65 74 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 65  et;.    }..    e
19750 6c 73 65 20 69 66 28 20 70 49 74 65 72 2d 3e 70  lse if( pIter->p
19760 43 6f 6c 73 65 74 2d 3e 6e 43 6f 6c 3d 3d 30 20  Colset->nCol==0 
19770 29 7b 0a 20 20 20 20 20 20 70 49 74 65 72 2d 3e  ){.      pIter->
19780 78 53 65 74 4f 75 74 70 75 74 73 20 3d 20 66 74  xSetOutputs = ft
19790 73 35 49 74 65 72 53 65 74 4f 75 74 70 75 74 73  s5IterSetOutputs
197a0 5f 5a 65 72 6f 43 6f 6c 73 65 74 3b 0a 20 20 20  _ZeroColset;.   
197b0 20 7d 0a 0a 20 20 20 20 65 6c 73 65 20 69 66 28   }..    else if(
197c0 20 70 43 6f 6e 66 69 67 2d 3e 65 44 65 74 61 69   pConfig->eDetai
197d0 6c 3d 3d 46 54 53 35 5f 44 45 54 41 49 4c 5f 46  l==FTS5_DETAIL_F
197e0 55 4c 4c 20 29 7b 0a 20 20 20 20 20 20 70 49 74  ULL ){.      pIt
197f0 65 72 2d 3e 78 53 65 74 4f 75 74 70 75 74 73 20  er->xSetOutputs 
19800 3d 20 66 74 73 35 49 74 65 72 53 65 74 4f 75 74  = fts5IterSetOut
19810 70 75 74 73 5f 46 75 6c 6c 3b 0a 20 20 20 20 7d  puts_Full;.    }
19820 0a 0a 20 20 20 20 65 6c 73 65 7b 0a 20 20 20 20  ..    else{.    
19830 20 20 61 73 73 65 72 74 28 20 70 43 6f 6e 66 69    assert( pConfi
19840 67 2d 3e 65 44 65 74 61 69 6c 3d 3d 46 54 53 35  g->eDetail==FTS5
19850 5f 44 45 54 41 49 4c 5f 43 4f 4c 55 4d 4e 53 20  _DETAIL_COLUMNS 
19860 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 43 6f  );.      if( pCo
19870 6e 66 69 67 2d 3e 6e 43 6f 6c 3c 3d 31 30 30 20  nfig->nCol<=100 
19880 29 7b 0a 20 20 20 20 20 20 20 20 70 49 74 65 72  ){.        pIter
19890 2d 3e 78 53 65 74 4f 75 74 70 75 74 73 20 3d 20  ->xSetOutputs = 
198a0 66 74 73 35 49 74 65 72 53 65 74 4f 75 74 70 75  fts5IterSetOutpu
198b0 74 73 5f 43 6f 6c 31 30 30 3b 0a 20 20 20 20 20  ts_Col100;.     
198c0 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 42 75     sqlite3Fts5Bu
198d0 66 66 65 72 53 69 7a 65 28 70 52 63 2c 20 26 70  fferSize(pRc, &p
198e0 49 74 65 72 2d 3e 70 6f 73 6c 69 73 74 2c 20 70  Iter->poslist, p
198f0 43 6f 6e 66 69 67 2d 3e 6e 43 6f 6c 29 3b 0a 20  Config->nCol);. 
19900 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
19910 20 20 20 20 70 49 74 65 72 2d 3e 78 53 65 74 4f      pIter->xSetO
19920 75 74 70 75 74 73 20 3d 20 66 74 73 35 49 74 65  utputs = fts5Ite
19930 72 53 65 74 4f 75 74 70 75 74 73 5f 43 6f 6c 3b  rSetOutputs_Col;
19940 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
19950 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c   }.}.../*.** All
19960 6f 63 61 74 65 20 61 20 6e 65 77 20 46 74 73 35  ocate a new Fts5
19970 49 74 65 72 20 6f 62 6a 65 63 74 2e 0a 2a 2a 0a  Iter object..**.
19980 2a 2a 20 54 68 65 20 6e 65 77 20 6f 62 6a 65 63  ** The new objec
19990 74 20 77 69 6c 6c 20 62 65 20 75 73 65 64 20 74  t will be used t
199a0 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f 75 67  o iterate throug
199b0 68 20 64 61 74 61 20 69 6e 20 73 74 72 75 63 74  h data in struct
199c0 75 72 65 20 70 53 74 72 75 63 74 2e 0a 2a 2a 20  ure pStruct..** 
199d0 49 66 20 69 4c 65 76 65 6c 20 69 73 20 2d 76 65  If iLevel is -ve
199e0 2c 20 74 68 65 6e 20 61 6c 6c 20 64 61 74 61 20  , then all data 
199f0 69 6e 20 61 6c 6c 20 73 65 67 6d 65 6e 74 73 20  in all segments 
19a00 69 73 20 6d 65 72 67 65 64 2e 20 4f 72 2c 20 69  is merged. Or, i
19a10 66 20 69 4c 65 76 65 6c 0a 2a 2a 20 69 73 20 7a  f iLevel.** is z
19a20 65 72 6f 20 6f 72 20 67 72 65 61 74 65 72 2c 20  ero or greater, 
19a30 64 61 74 61 20 66 72 6f 6d 20 74 68 65 20 66 69  data from the fi
19a40 72 73 74 20 6e 53 65 67 6d 65 6e 74 20 73 65 67  rst nSegment seg
19a50 6d 65 6e 74 73 20 6f 6e 20 6c 65 76 65 6c 20 69  ments on level i
19a60 4c 65 76 65 6c 0a 2a 2a 20 69 73 20 6d 65 72 67  Level.** is merg
19a70 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 74  ed..**.** The it
19a80 65 72 61 74 6f 72 20 69 6e 69 74 69 61 6c 6c 79  erator initially
19a90 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 66   points to the f
19aa0 69 72 73 74 20 74 65 72 6d 2f 72 6f 77 69 64 20  irst term/rowid 
19ab0 65 6e 74 72 79 20 69 6e 20 74 68 65 20 0a 2a 2a  entry in the .**
19ac0 20 69 74 65 72 61 74 65 64 20 64 61 74 61 2e 0a   iterated data..
19ad0 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
19ae0 74 73 35 4d 75 6c 74 69 49 74 65 72 4e 65 77 28  ts5MultiIterNew(
19af0 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c  .  Fts5Index *p,
19b00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19b10 20 20 20 2f 2a 20 46 54 53 35 20 62 61 63 6b 65     /* FTS5 backe
19b20 6e 64 20 74 6f 20 69 74 65 72 61 74 65 20 77 69  nd to iterate wi
19b30 74 68 69 6e 20 2a 2f 0a 20 20 46 74 73 35 53 74  thin */.  Fts5St
19b40 72 75 63 74 75 72 65 20 2a 70 53 74 72 75 63 74  ructure *pStruct
19b50 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74 72  ,         /* Str
19b60 75 63 74 75 72 65 20 6f 66 20 73 70 65 63 69 66  ucture of specif
19b70 69 63 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69 6e  ic index */.  in
19b80 74 20 66 6c 61 67 73 2c 20 20 20 20 20 20 20 20  t flags,        
19b90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
19ba0 20 46 54 53 35 49 4e 44 45 58 5f 51 55 45 52 59   FTS5INDEX_QUERY
19bb0 5f 58 58 58 20 66 6c 61 67 73 20 2a 2f 0a 20 20  _XXX flags */.  
19bc0 46 74 73 35 43 6f 6c 73 65 74 20 2a 70 43 6f 6c  Fts5Colset *pCol
19bd0 73 65 74 2c 20 20 20 20 20 20 20 20 20 20 20 20  set,            
19be0 2f 2a 20 43 6f 6c 73 65 74 20 74 6f 20 66 69 6c  /* Colset to fil
19bf0 74 65 72 20 6f 6e 20 28 6f 72 20 4e 55 4c 4c 29  ter on (or NULL)
19c00 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a   */.  const u8 *
19c10 70 54 65 72 6d 2c 20 69 6e 74 20 6e 54 65 72 6d  pTerm, int nTerm
19c20 2c 20 20 20 20 20 2f 2a 20 54 65 72 6d 20 74 6f  ,     /* Term to
19c30 20 73 65 65 6b 20 74 6f 20 28 6f 72 20 4e 55 4c   seek to (or NUL
19c40 4c 2f 30 29 20 2a 2f 0a 20 20 69 6e 74 20 69 4c  L/0) */.  int iL
19c50 65 76 65 6c 2c 20 20 20 20 20 20 20 20 20 20 20  evel,           
19c60 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 76            /* Lev
19c70 65 6c 20 74 6f 20 69 74 65 72 61 74 65 20 28 2d  el to iterate (-
19c80 31 20 66 6f 72 20 61 6c 6c 29 20 2a 2f 0a 20 20  1 for all) */.  
19c90 69 6e 74 20 6e 53 65 67 6d 65 6e 74 2c 20 20 20  int nSegment,   
19ca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19cb0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 73 65 67  /* Number of seg
19cc0 6d 65 6e 74 73 20 74 6f 20 6d 65 72 67 65 20 28  ments to merge (
19cd0 69 4c 65 76 65 6c 3e 3d 30 29 20 2a 2f 0a 20 20  iLevel>=0) */.  
19ce0 46 74 73 35 49 74 65 72 20 2a 2a 70 70 4f 75 74  Fts5Iter **ppOut
19cf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19d00 2f 2a 20 4e 65 77 20 6f 62 6a 65 63 74 20 2a 2f  /* New object */
19d10 0a 29 7b 0a 20 20 69 6e 74 20 6e 53 65 67 20 3d  .){.  int nSeg =
19d20 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
19d30 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
19d40 6f 66 20 73 65 67 6d 65 6e 74 2d 69 74 65 72 73  of segment-iters
19d50 20 69 6e 20 75 73 65 20 2a 2f 0a 20 20 69 6e 74   in use */.  int
19d60 20 69 49 74 65 72 20 3d 20 30 3b 20 20 20 20 20   iIter = 0;     
19d70 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
19d80 2a 2f 0a 20 20 69 6e 74 20 69 53 65 67 3b 20 20  */.  int iSeg;  
19d90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19da0 20 20 20 20 20 2f 2a 20 55 73 65 64 20 74 6f 20       /* Used to 
19db0 69 74 65 72 61 74 65 20 74 68 72 6f 75 67 68 20  iterate through 
19dc0 73 65 67 6d 65 6e 74 73 20 2a 2f 0a 20 20 46 74  segments */.  Ft
19dd0 73 35 53 74 72 75 63 74 75 72 65 4c 65 76 65 6c  s5StructureLevel
19de0 20 2a 70 4c 76 6c 3b 0a 20 20 46 74 73 35 49 74   *pLvl;.  Fts5It
19df0 65 72 20 2a 70 4e 65 77 3b 0a 0a 20 20 61 73 73  er *pNew;..  ass
19e00 65 72 74 28 20 28 70 54 65 72 6d 3d 3d 30 20 26  ert( (pTerm==0 &
19e10 26 20 6e 54 65 72 6d 3d 3d 30 29 20 7c 7c 20 69  & nTerm==0) || i
19e20 4c 65 76 65 6c 3c 30 20 29 3b 0a 0a 20 20 2f 2a  Level<0 );..  /*
19e30 20 41 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20   Allocate space 
19e40 66 6f 72 20 74 68 65 20 6e 65 77 20 6d 75 6c 74  for the new mult
19e50 69 2d 73 65 67 2d 69 74 65 72 61 74 6f 72 2e 20  i-seg-iterator. 
19e60 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d  */.  if( p->rc==
19e70 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
19e80 20 69 66 28 20 69 4c 65 76 65 6c 3c 30 20 29 7b   if( iLevel<0 ){
19e90 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
19ea0 53 74 72 75 63 74 2d 3e 6e 53 65 67 6d 65 6e 74  Struct->nSegment
19eb0 3d 3d 66 74 73 35 53 74 72 75 63 74 75 72 65 43  ==fts5StructureC
19ec0 6f 75 6e 74 53 65 67 6d 65 6e 74 73 28 70 53 74  ountSegments(pSt
19ed0 72 75 63 74 29 20 29 3b 0a 20 20 20 20 20 20 6e  ruct) );.      n
19ee0 53 65 67 20 3d 20 70 53 74 72 75 63 74 2d 3e 6e  Seg = pStruct->n
19ef0 53 65 67 6d 65 6e 74 3b 0a 20 20 20 20 20 20 6e  Segment;.      n
19f00 53 65 67 20 2b 3d 20 28 70 2d 3e 70 48 61 73 68  Seg += (p->pHash
19f10 20 3f 20 31 20 3a 20 30 29 3b 0a 20 20 20 20 7d   ? 1 : 0);.    }
19f20 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e 53 65 67  else{.      nSeg
19f30 20 3d 20 4d 49 4e 28 70 53 74 72 75 63 74 2d 3e   = MIN(pStruct->
19f40 61 4c 65 76 65 6c 5b 69 4c 65 76 65 6c 5d 2e 6e  aLevel[iLevel].n
19f50 53 65 67 2c 20 6e 53 65 67 6d 65 6e 74 29 3b 0a  Seg, nSegment);.
19f60 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2a 70 70 4f      }.  }.  *ppO
19f70 75 74 20 3d 20 70 4e 65 77 20 3d 20 66 74 73 35  ut = pNew = fts5
19f80 4d 75 6c 74 69 49 74 65 72 41 6c 6c 6f 63 28 70  MultiIterAlloc(p
19f90 2c 20 6e 53 65 67 29 3b 0a 20 20 69 66 28 20 70  , nSeg);.  if( p
19fa0 4e 65 77 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  New==0 ) return;
19fb0 0a 20 20 70 4e 65 77 2d 3e 62 52 65 76 20 3d 20  .  pNew->bRev = 
19fc0 28 30 21 3d 28 66 6c 61 67 73 20 26 20 46 54 53  (0!=(flags & FTS
19fd0 35 49 4e 44 45 58 5f 51 55 45 52 59 5f 44 45 53  5INDEX_QUERY_DES
19fe0 43 29 29 3b 0a 20 20 70 4e 65 77 2d 3e 62 53 6b  C));.  pNew->bSk
19ff0 69 70 45 6d 70 74 79 20 3d 20 28 30 21 3d 28 66  ipEmpty = (0!=(f
1a000 6c 61 67 73 20 26 20 46 54 53 35 49 4e 44 45 58  lags & FTS5INDEX
1a010 5f 51 55 45 52 59 5f 53 4b 49 50 45 4d 50 54 59  _QUERY_SKIPEMPTY
1a020 29 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 43 6f 6c  ));.  pNew->pCol
1a030 73 65 74 20 3d 20 70 43 6f 6c 73 65 74 3b 0a 20  set = pColset;. 
1a040 20 69 66 28 20 28 66 6c 61 67 73 20 26 20 46 54   if( (flags & FT
1a050 53 35 49 4e 44 45 58 5f 51 55 45 52 59 5f 4e 4f  S5INDEX_QUERY_NO
1a060 4f 55 54 50 55 54 29 3d 3d 30 20 29 7b 0a 20 20  OUTPUT)==0 ){.  
1a070 20 20 66 74 73 35 49 74 65 72 53 65 74 4f 75 74    fts5IterSetOut
1a080 70 75 74 43 62 28 26 70 2d 3e 72 63 2c 20 70 4e  putCb(&p->rc, pN
1a090 65 77 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  ew);.  }..  /* I
1a0a0 6e 69 74 69 61 6c 69 7a 65 20 65 61 63 68 20 6f  nitialize each o
1a0b0 66 20 74 68 65 20 63 6f 6d 70 6f 6e 65 6e 74 20  f the component 
1a0c0 73 65 67 6d 65 6e 74 20 69 74 65 72 61 74 6f 72  segment iterator
1a0d0 73 2e 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 72  s. */.  if( p->r
1a0e0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
1a0f0 20 20 20 20 69 66 28 20 69 4c 65 76 65 6c 3c 30      if( iLevel<0
1a100 20 29 7b 0a 20 20 20 20 20 20 46 74 73 35 53 74   ){.      Fts5St
1a110 72 75 63 74 75 72 65 4c 65 76 65 6c 20 2a 70 45  ructureLevel *pE
1a120 6e 64 20 3d 20 26 70 53 74 72 75 63 74 2d 3e 61  nd = &pStruct->a
1a130 4c 65 76 65 6c 5b 70 53 74 72 75 63 74 2d 3e 6e  Level[pStruct->n
1a140 4c 65 76 65 6c 5d 3b 0a 20 20 20 20 20 20 69 66  Level];.      if
1a150 28 20 70 2d 3e 70 48 61 73 68 20 29 7b 0a 20 20  ( p->pHash ){.  
1a160 20 20 20 20 20 20 2f 2a 20 41 64 64 20 61 20 73        /* Add a s
1a170 65 67 6d 65 6e 74 20 69 74 65 72 61 74 6f 72 20  egment iterator 
1a180 66 6f 72 20 74 68 65 20 63 75 72 72 65 6e 74 20  for the current 
1a190 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
1a1a0 68 61 73 68 20 74 61 62 6c 65 2e 20 2a 2f 0a 20  hash table. */. 
1a1b0 20 20 20 20 20 20 20 46 74 73 35 53 65 67 49 74         Fts5SegIt
1a1c0 65 72 20 2a 70 49 74 65 72 20 3d 20 26 70 4e 65  er *pIter = &pNe
1a1d0 77 2d 3e 61 53 65 67 5b 69 49 74 65 72 2b 2b 5d  w->aSeg[iIter++]
1a1e0 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35 53 65  ;.        fts5Se
1a1f0 67 49 74 65 72 48 61 73 68 49 6e 69 74 28 70 2c  gIterHashInit(p,
1a200 20 70 54 65 72 6d 2c 20 6e 54 65 72 6d 2c 20 66   pTerm, nTerm, f
1a210 6c 61 67 73 2c 20 70 49 74 65 72 29 3b 0a 20 20  lags, pIter);.  
1a220 20 20 20 20 7d 0a 20 20 20 20 20 20 66 6f 72 28      }.      for(
1a230 70 4c 76 6c 3d 26 70 53 74 72 75 63 74 2d 3e 61  pLvl=&pStruct->a
1a240 4c 65 76 65 6c 5b 30 5d 3b 20 70 4c 76 6c 3c 70  Level[0]; pLvl<p
1a250 45 6e 64 3b 20 70 4c 76 6c 2b 2b 29 7b 0a 20 20  End; pLvl++){.  
1a260 20 20 20 20 20 20 66 6f 72 28 69 53 65 67 3d 70        for(iSeg=p
1a270 4c 76 6c 2d 3e 6e 53 65 67 2d 31 3b 20 69 53 65  Lvl->nSeg-1; iSe
1a280 67 3e 3d 30 3b 20 69 53 65 67 2d 2d 29 7b 0a 20  g>=0; iSeg--){. 
1a290 20 20 20 20 20 20 20 20 20 46 74 73 35 53 74 72           Fts5Str
1a2a0 75 63 74 75 72 65 53 65 67 6d 65 6e 74 20 2a 70  uctureSegment *p
1a2b0 53 65 67 20 3d 20 26 70 4c 76 6c 2d 3e 61 53 65  Seg = &pLvl->aSe
1a2c0 67 5b 69 53 65 67 5d 3b 0a 20 20 20 20 20 20 20  g[iSeg];.       
1a2d0 20 20 20 46 74 73 35 53 65 67 49 74 65 72 20 2a     Fts5SegIter *
1a2e0 70 49 74 65 72 20 3d 20 26 70 4e 65 77 2d 3e 61  pIter = &pNew->a
1a2f0 53 65 67 5b 69 49 74 65 72 2b 2b 5d 3b 0a 20 20  Seg[iIter++];.  
1a300 20 20 20 20 20 20 20 20 69 66 28 20 70 54 65 72          if( pTer
1a310 6d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  m==0 ){.        
1a320 20 20 20 20 66 74 73 35 53 65 67 49 74 65 72 49      fts5SegIterI
1a330 6e 69 74 28 70 2c 20 70 53 65 67 2c 20 70 49 74  nit(p, pSeg, pIt
1a340 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  er);.          }
1a350 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
1a360 20 20 66 74 73 35 53 65 67 49 74 65 72 53 65 65    fts5SegIterSee
1a370 6b 49 6e 69 74 28 70 2c 20 70 54 65 72 6d 2c 20  kInit(p, pTerm, 
1a380 6e 54 65 72 6d 2c 20 66 6c 61 67 73 2c 20 70 53  nTerm, flags, pS
1a390 65 67 2c 20 70 49 74 65 72 29 3b 0a 20 20 20 20  eg, pIter);.    
1a3a0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1a3b0 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  }.      }.    }e
1a3c0 6c 73 65 7b 0a 20 20 20 20 20 20 70 4c 76 6c 20  lse{.      pLvl 
1a3d0 3d 20 26 70 53 74 72 75 63 74 2d 3e 61 4c 65 76  = &pStruct->aLev
1a3e0 65 6c 5b 69 4c 65 76 65 6c 5d 3b 0a 20 20 20 20  el[iLevel];.    
1a3f0 20 20 66 6f 72 28 69 53 65 67 3d 6e 53 65 67 2d    for(iSeg=nSeg-
1a400 31 3b 20 69 53 65 67 3e 3d 30 3b 20 69 53 65 67  1; iSeg>=0; iSeg
1a410 2d 2d 29 7b 0a 20 20 20 20 20 20 20 20 66 74 73  --){.        fts
1a420 35 53 65 67 49 74 65 72 49 6e 69 74 28 70 2c 20  5SegIterInit(p, 
1a430 26 70 4c 76 6c 2d 3e 61 53 65 67 5b 69 53 65 67  &pLvl->aSeg[iSeg
1a440 5d 2c 20 26 70 4e 65 77 2d 3e 61 53 65 67 5b 69  ], &pNew->aSeg[i
1a450 49 74 65 72 2b 2b 5d 29 3b 0a 20 20 20 20 20 20  Iter++]);.      
1a460 7d 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  }.    }.    asse
1a470 72 74 28 20 69 49 74 65 72 3d 3d 6e 53 65 67 20  rt( iIter==nSeg 
1a480 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20  );.  }..  /* If 
1a490 74 68 65 20 61 62 6f 76 65 20 77 61 73 20 73 75  the above was su
1a4a0 63 63 65 73 73 66 75 6c 2c 20 65 61 63 68 20 63  ccessful, each c
1a4b0 6f 6d 70 6f 6e 65 6e 74 20 69 74 65 72 61 74 6f  omponent iterato
1a4c0 72 73 20 6e 6f 77 20 70 6f 69 6e 74 73 20 0a 20  rs now points . 
1a4d0 20 2a 2a 20 74 6f 20 74 68 65 20 66 69 72 73 74   ** to the first
1a4e0 20 65 6e 74 72 79 20 69 6e 20 69 74 73 20 73 65   entry in its se
1a4f0 67 6d 65 6e 74 2e 20 49 6e 20 74 68 69 73 20 63  gment. In this c
1a500 61 73 65 20 69 6e 69 74 69 61 6c 69 7a 65 20 74  ase initialize t
1a510 68 65 20 0a 20 20 2a 2a 20 61 46 69 72 73 74 5b  he .  ** aFirst[
1a520 5d 20 61 72 72 61 79 2e 20 4f 72 2c 20 69 66 20  ] array. Or, if 
1a530 61 6e 20 65 72 72 6f 72 20 68 61 73 20 6f 63 63  an error has occ
1a540 75 72 72 65 64 2c 20 66 72 65 65 20 74 68 65 20  urred, free the 
1a550 69 74 65 72 61 74 6f 72 0a 20 20 2a 2a 20 6f 62  iterator.  ** ob
1a560 6a 65 63 74 20 61 6e 64 20 73 65 74 20 74 68 65  ject and set the
1a570 20 6f 75 74 70 75 74 20 76 61 72 69 61 62 6c 65   output variable
1a580 20 74 6f 20 4e 55 4c 4c 2e 20 20 2a 2f 0a 20 20   to NULL.  */.  
1a590 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  if( p->rc==SQLIT
1a5a0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 66 6f 72 28  E_OK ){.    for(
1a5b0 69 49 74 65 72 3d 70 4e 65 77 2d 3e 6e 53 65 67  iIter=pNew->nSeg
1a5c0 2d 31 3b 20 69 49 74 65 72 3e 30 3b 20 69 49 74  -1; iIter>0; iIt
1a5d0 65 72 2d 2d 29 7b 0a 20 20 20 20 20 20 69 6e 74  er--){.      int
1a5e0 20 69 45 71 3b 0a 20 20 20 20 20 20 69 66 28 20   iEq;.      if( 
1a5f0 28 69 45 71 20 3d 20 66 74 73 35 4d 75 6c 74 69  (iEq = fts5Multi
1a600 49 74 65 72 44 6f 43 6f 6d 70 61 72 65 28 70 4e  IterDoCompare(pN
1a610 65 77 2c 20 69 49 74 65 72 29 29 20 29 7b 0a 20  ew, iIter)) ){. 
1a620 20 20 20 20 20 20 20 46 74 73 35 53 65 67 49 74         Fts5SegIt
1a630 65 72 20 2a 70 53 65 67 20 3d 20 26 70 4e 65 77  er *pSeg = &pNew
1a640 2d 3e 61 53 65 67 5b 69 45 71 5d 3b 0a 20 20 20  ->aSeg[iEq];.   
1a650 20 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d       if( p->rc==
1a660 53 51 4c 49 54 45 5f 4f 4b 20 29 20 70 53 65 67  SQLITE_OK ) pSeg
1a670 2d 3e 78 4e 65 78 74 28 70 2c 20 70 53 65 67 2c  ->xNext(p, pSeg,
1a680 20 30 29 3b 0a 20 20 20 20 20 20 20 20 66 74 73   0);.        fts
1a690 35 4d 75 6c 74 69 49 74 65 72 41 64 76 61 6e 63  5MultiIterAdvanc
1a6a0 65 64 28 70 2c 20 70 4e 65 77 2c 20 69 45 71 2c  ed(p, pNew, iEq,
1a6b0 20 69 49 74 65 72 29 3b 0a 20 20 20 20 20 20 7d   iIter);.      }
1a6c0 0a 20 20 20 20 7d 0a 20 20 20 20 66 74 73 35 4d  .    }.    fts5M
1a6d0 75 6c 74 69 49 74 65 72 53 65 74 45 6f 66 28 70  ultiIterSetEof(p
1a6e0 4e 65 77 29 3b 0a 20 20 20 20 66 74 73 35 41 73  New);.    fts5As
1a6f0 73 65 72 74 4d 75 6c 74 69 49 74 65 72 53 65 74  sertMultiIterSet
1a700 75 70 28 70 2c 20 70 4e 65 77 29 3b 0a 0a 20 20  up(p, pNew);..  
1a710 20 20 69 66 28 20 70 4e 65 77 2d 3e 62 53 6b 69    if( pNew->bSki
1a720 70 45 6d 70 74 79 20 26 26 20 66 74 73 35 4d 75  pEmpty && fts5Mu
1a730 6c 74 69 49 74 65 72 49 73 45 6d 70 74 79 28 70  ltiIterIsEmpty(p
1a740 2c 20 70 4e 65 77 29 20 29 7b 0a 20 20 20 20 20  , pNew) ){.     
1a750 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 4e 65   fts5MultiIterNe
1a760 78 74 28 70 2c 20 70 4e 65 77 2c 20 30 2c 20 30  xt(p, pNew, 0, 0
1a770 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  );.    }else if(
1a780 20 70 4e 65 77 2d 3e 62 61 73 65 2e 62 45 6f 66   pNew->base.bEof
1a790 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 46 74 73  ==0 ){.      Fts
1a7a0 35 53 65 67 49 74 65 72 20 2a 70 53 65 67 20 3d  5SegIter *pSeg =
1a7b0 20 26 70 4e 65 77 2d 3e 61 53 65 67 5b 70 4e 65   &pNew->aSeg[pNe
1a7c0 77 2d 3e 61 46 69 72 73 74 5b 31 5d 2e 69 46 69  w->aFirst[1].iFi
1a7d0 72 73 74 5d 3b 0a 20 20 20 20 20 20 70 4e 65 77  rst];.      pNew
1a7e0 2d 3e 78 53 65 74 4f 75 74 70 75 74 73 28 70 4e  ->xSetOutputs(pN
1a7f0 65 77 2c 20 70 53 65 67 29 3b 0a 20 20 20 20 7d  ew, pSeg);.    }
1a800 0a 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66  ..  }else{.    f
1a810 74 73 35 4d 75 6c 74 69 49 74 65 72 46 72 65 65  ts5MultiIterFree
1a820 28 70 4e 65 77 29 3b 0a 20 20 20 20 2a 70 70 4f  (pNew);.    *ppO
1a830 75 74 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f  ut = 0;.  }.}../
1a840 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 6e 20 46  *.** Create an F
1a850 74 73 35 49 74 65 72 20 74 68 61 74 20 69 74 65  ts5Iter that ite
1a860 72 61 74 65 73 20 74 68 72 6f 75 67 68 20 74 68  rates through th
1a870 65 20 64 6f 63 6c 69 73 74 20 70 72 6f 76 69 64  e doclist provid
1a880 65 64 0a 2a 2a 20 61 73 20 74 68 65 20 73 65 63  ed.** as the sec
1a890 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f  ond argument..*/
1a8a0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
1a8b0 35 4d 75 6c 74 69 49 74 65 72 4e 65 77 32 28 0a  5MultiIterNew2(.
1a8c0 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20    Fts5Index *p, 
1a8d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a8e0 20 20 2f 2a 20 46 54 53 35 20 62 61 63 6b 65 6e    /* FTS5 backen
1a8f0 64 20 74 6f 20 69 74 65 72 61 74 65 20 77 69 74  d to iterate wit
1a900 68 69 6e 20 2a 2f 0a 20 20 46 74 73 35 44 61 74  hin */.  Fts5Dat
1a910 61 20 2a 70 44 61 74 61 2c 20 20 20 20 20 20 20  a *pData,       
1a920 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 63 6c           /* Docl
1a930 69 73 74 20 74 6f 20 69 74 65 72 61 74 65 20 74  ist to iterate t
1a940 68 72 6f 75 67 68 20 2a 2f 0a 20 20 69 6e 74 20  hrough */.  int 
1a950 62 44 65 73 63 2c 20 20 20 20 20 20 20 20 20 20  bDesc,          
1a960 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
1a970 72 75 65 20 66 6f 72 20 64 65 73 63 65 6e 64 69  rue for descendi
1a980 6e 67 20 72 6f 77 69 64 20 6f 72 64 65 72 20 2a  ng rowid order *
1a990 2f 0a 20 20 46 74 73 35 49 74 65 72 20 2a 2a 70  /.  Fts5Iter **p
1a9a0 70 4f 75 74 20 20 20 20 20 20 20 20 20 20 20 20  pOut            
1a9b0 20 20 20 20 2f 2a 20 4e 65 77 20 6f 62 6a 65 63      /* New objec
1a9c0 74 20 2a 2f 0a 29 7b 0a 20 20 46 74 73 35 49 74  t */.){.  Fts5It
1a9d0 65 72 20 2a 70 4e 65 77 3b 0a 20 20 70 4e 65 77  er *pNew;.  pNew
1a9e0 20 3d 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72   = fts5MultiIter
1a9f0 41 6c 6c 6f 63 28 70 2c 20 32 29 3b 0a 20 20 69  Alloc(p, 2);.  i
1aa00 66 28 20 70 4e 65 77 20 29 7b 0a 20 20 20 20 46  f( pNew ){.    F
1aa10 74 73 35 53 65 67 49 74 65 72 20 2a 70 49 74 65  ts5SegIter *pIte
1aa20 72 20 3d 20 26 70 4e 65 77 2d 3e 61 53 65 67 5b  r = &pNew->aSeg[
1aa30 31 5d 3b 0a 0a 20 20 20 20 70 49 74 65 72 2d 3e  1];..    pIter->
1aa40 66 6c 61 67 73 20 3d 20 46 54 53 35 5f 53 45 47  flags = FTS5_SEG
1aa50 49 54 45 52 5f 4f 4e 45 54 45 52 4d 3b 0a 20 20  ITER_ONETERM;.  
1aa60 20 20 69 66 28 20 70 44 61 74 61 2d 3e 73 7a 4c    if( pData->szL
1aa70 65 61 66 3e 30 20 29 7b 0a 20 20 20 20 20 20 70  eaf>0 ){.      p
1aa80 49 74 65 72 2d 3e 70 4c 65 61 66 20 3d 20 70 44  Iter->pLeaf = pD
1aa90 61 74 61 3b 0a 20 20 20 20 20 20 70 49 74 65 72  ata;.      pIter
1aaa0 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 20 3d 20  ->iLeafOffset = 
1aab0 66 74 73 35 47 65 74 56 61 72 69 6e 74 28 70 44  fts5GetVarint(pD
1aac0 61 74 61 2d 3e 70 2c 20 28 75 36 34 2a 29 26 70  ata->p, (u64*)&p
1aad0 49 74 65 72 2d 3e 69 52 6f 77 69 64 29 3b 0a 20  Iter->iRowid);. 
1aae0 20 20 20 20 20 70 49 74 65 72 2d 3e 69 45 6e 64       pIter->iEnd
1aaf0 6f 66 44 6f 63 6c 69 73 74 20 3d 20 70 44 61 74  ofDoclist = pDat
1ab00 61 2d 3e 6e 6e 3b 0a 20 20 20 20 20 20 70 4e 65  a->nn;.      pNe
1ab10 77 2d 3e 61 46 69 72 73 74 5b 31 5d 2e 69 46 69  w->aFirst[1].iFi
1ab20 72 73 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 69  rst = 1;.      i
1ab30 66 28 20 62 44 65 73 63 20 29 7b 0a 20 20 20 20  f( bDesc ){.    
1ab40 20 20 20 20 70 4e 65 77 2d 3e 62 52 65 76 20 3d      pNew->bRev =
1ab50 20 31 3b 0a 20 20 20 20 20 20 20 20 70 49 74 65   1;.        pIte
1ab60 72 2d 3e 66 6c 61 67 73 20 7c 3d 20 46 54 53 35  r->flags |= FTS5
1ab70 5f 53 45 47 49 54 45 52 5f 52 45 56 45 52 53 45  _SEGITER_REVERSE
1ab80 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35 53 65  ;.        fts5Se
1ab90 67 49 74 65 72 52 65 76 65 72 73 65 49 6e 69 74  gIterReverseInit
1aba0 50 61 67 65 28 70 2c 20 70 49 74 65 72 29 3b 0a  Page(p, pIter);.
1abb0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1abc0 20 20 20 20 20 66 74 73 35 53 65 67 49 74 65 72       fts5SegIter
1abd0 4c 6f 61 64 4e 50 6f 73 28 70 2c 20 70 49 74 65  LoadNPos(p, pIte
1abe0 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  r);.      }.    
1abf0 20 20 70 44 61 74 61 20 3d 20 30 3b 0a 20 20 20    pData = 0;.   
1ac00 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 4e   }else{.      pN
1ac10 65 77 2d 3e 62 61 73 65 2e 62 45 6f 66 20 3d 20  ew->base.bEof = 
1ac20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 74 73  1;.    }.    fts
1ac30 35 53 65 67 49 74 65 72 53 65 74 4e 65 78 74 28  5SegIterSetNext(
1ac40 70 2c 20 70 49 74 65 72 29 3b 0a 0a 20 20 20 20  p, pIter);..    
1ac50 2a 70 70 4f 75 74 20 3d 20 70 4e 65 77 3b 0a 20  *ppOut = pNew;. 
1ac60 20 7d 0a 0a 20 20 66 74 73 35 44 61 74 61 52 65   }..  fts5DataRe
1ac70 6c 65 61 73 65 28 70 44 61 74 61 29 3b 0a 7d 0a  lease(pData);.}.
1ac80 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72  ./*.** Return tr
1ac90 75 65 20 69 66 20 74 68 65 20 69 74 65 72 61 74  ue if the iterat
1aca0 6f 72 20 69 73 20 61 74 20 45 4f 46 20 6f 72 20  or is at EOF or 
1acb0 69 66 20 61 6e 20 65 72 72 6f 72 20 68 61 73 20  if an error has 
1acc0 6f 63 63 75 72 72 65 64 2e 20 0a 2a 2a 20 46 61  occurred. .** Fa
1acd0 6c 73 65 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a  lse otherwise..*
1ace0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73  /.static int fts
1acf0 35 4d 75 6c 74 69 49 74 65 72 45 6f 66 28 46 74  5MultiIterEof(Ft
1ad00 73 35 49 6e 64 65 78 20 2a 70 2c 20 46 74 73 35  s5Index *p, Fts5
1ad10 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a 20 20  Iter *pIter){.  
1ad20 61 73 73 65 72 74 28 20 70 2d 3e 72 63 20 0a 20  assert( p->rc . 
1ad30 20 20 20 20 20 7c 7c 20 28 70 49 74 65 72 2d 3e       || (pIter->
1ad40 61 53 65 67 5b 20 70 49 74 65 72 2d 3e 61 46 69  aSeg[ pIter->aFi
1ad50 72 73 74 5b 31 5d 2e 69 46 69 72 73 74 20 5d 2e  rst[1].iFirst ].
1ad60 70 4c 65 61 66 3d 3d 30 29 3d 3d 70 49 74 65 72  pLeaf==0)==pIter
1ad70 2d 3e 62 61 73 65 2e 62 45 6f 66 20 0a 20 20 29  ->base.bEof .  )
1ad80 3b 0a 20 20 72 65 74 75 72 6e 20 28 70 2d 3e 72  ;.  return (p->r
1ad90 63 20 7c 7c 20 70 49 74 65 72 2d 3e 62 61 73 65  c || pIter->base
1ada0 2e 62 45 6f 66 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  .bEof);.}../*.**
1adb0 20 52 65 74 75 72 6e 20 74 68 65 20 72 6f 77 69   Return the rowi
1adc0 64 20 6f 66 20 74 68 65 20 65 6e 74 72 79 20 74  d of the entry t
1add0 68 61 74 20 74 68 65 20 69 74 65 72 61 74 6f 72  hat the iterator
1ade0 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74   currently point
1adf0 73 0a 2a 2a 20 74 6f 2e 20 49 66 20 74 68 65 20  s.** to. If the 
1ae00 69 74 65 72 61 74 6f 72 20 70 6f 69 6e 74 73 20  iterator points 
1ae10 74 6f 20 45 4f 46 20 77 68 65 6e 20 74 68 69 73  to EOF when this
1ae20 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
1ae30 6c 65 64 20 74 68 65 0a 2a 2a 20 72 65 73 75 6c  led the.** resul
1ae40 74 73 20 61 72 65 20 75 6e 64 65 66 69 6e 65 64  ts are undefined
1ae50 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 36 34 20  ..*/.static i64 
1ae60 66 74 73 35 4d 75 6c 74 69 49 74 65 72 52 6f 77  fts5MultiIterRow
1ae70 69 64 28 46 74 73 35 49 74 65 72 20 2a 70 49 74  id(Fts5Iter *pIt
1ae80 65 72 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70  er){.  assert( p
1ae90 49 74 65 72 2d 3e 61 53 65 67 5b 20 70 49 74 65  Iter->aSeg[ pIte
1aea0 72 2d 3e 61 46 69 72 73 74 5b 31 5d 2e 69 46 69  r->aFirst[1].iFi
1aeb0 72 73 74 20 5d 2e 70 4c 65 61 66 20 29 3b 0a 20  rst ].pLeaf );. 
1aec0 20 72 65 74 75 72 6e 20 70 49 74 65 72 2d 3e 61   return pIter->a
1aed0 53 65 67 5b 20 70 49 74 65 72 2d 3e 61 46 69 72  Seg[ pIter->aFir
1aee0 73 74 5b 31 5d 2e 69 46 69 72 73 74 20 5d 2e 69  st[1].iFirst ].i
1aef0 52 6f 77 69 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Rowid;.}../*.** 
1af00 4d 6f 76 65 20 74 68 65 20 69 74 65 72 61 74 6f  Move the iterato
1af10 72 20 74 6f 20 74 68 65 20 6e 65 78 74 20 65 6e  r to the next en
1af20 74 72 79 20 61 74 20 6f 72 20 66 6f 6c 6c 6f 77  try at or follow
1af30 69 6e 67 20 69 4d 61 74 63 68 2e 0a 2a 2f 0a 73  ing iMatch..*/.s
1af40 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 4d  tatic void fts5M
1af50 75 6c 74 69 49 74 65 72 4e 65 78 74 46 72 6f 6d  ultiIterNextFrom
1af60 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70  (.  Fts5Index *p
1af70 2c 20 0a 20 20 46 74 73 35 49 74 65 72 20 2a 70  , .  Fts5Iter *p
1af80 49 74 65 72 2c 20 0a 20 20 69 36 34 20 69 4d 61  Iter, .  i64 iMa
1af90 74 63 68 0a 29 7b 0a 20 20 77 68 69 6c 65 28 20  tch.){.  while( 
1afa0 31 20 29 7b 0a 20 20 20 20 69 36 34 20 69 52 6f  1 ){.    i64 iRo
1afb0 77 69 64 3b 0a 20 20 20 20 66 74 73 35 4d 75 6c  wid;.    fts5Mul
1afc0 74 69 49 74 65 72 4e 65 78 74 28 70 2c 20 70 49  tiIterNext(p, pI
1afd0 74 65 72 2c 20 31 2c 20 69 4d 61 74 63 68 29 3b  ter, 1, iMatch);
1afe0 0a 20 20 20 20 69 66 28 20 66 74 73 35 4d 75 6c  .    if( fts5Mul
1aff0 74 69 49 74 65 72 45 6f 66 28 70 2c 20 70 49 74  tiIterEof(p, pIt
1b000 65 72 29 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  er) ) break;.   
1b010 20 69 52 6f 77 69 64 20 3d 20 66 74 73 35 4d 75   iRowid = fts5Mu
1b020 6c 74 69 49 74 65 72 52 6f 77 69 64 28 70 49 74  ltiIterRowid(pIt
1b030 65 72 29 3b 0a 20 20 20 20 69 66 28 20 70 49 74  er);.    if( pIt
1b040 65 72 2d 3e 62 52 65 76 3d 3d 30 20 26 26 20 69  er->bRev==0 && i
1b050 52 6f 77 69 64 3e 3d 69 4d 61 74 63 68 20 29 20  Rowid>=iMatch ) 
1b060 62 72 65 61 6b 3b 0a 20 20 20 20 69 66 28 20 70  break;.    if( p
1b070 49 74 65 72 2d 3e 62 52 65 76 21 3d 30 20 26 26  Iter->bRev!=0 &&
1b080 20 69 52 6f 77 69 64 3c 3d 69 4d 61 74 63 68 20   iRowid<=iMatch 
1b090 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 7d 0a 0a  ) break;.  }.}..
1b0a0 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70  /*.** Return a p
1b0b0 6f 69 6e 74 65 72 20 74 6f 20 61 20 62 75 66 66  ointer to a buff
1b0c0 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  er containing th
1b0d0 65 20 74 65 72 6d 20 61 73 73 6f 63 69 61 74 65  e term associate
1b0e0 64 20 77 69 74 68 20 74 68 65 20 0a 2a 2a 20 65  d with the .** e
1b0f0 6e 74 72 79 20 74 68 61 74 20 74 68 65 20 69 74  ntry that the it
1b100 65 72 61 74 6f 72 20 63 75 72 72 65 6e 74 6c 79  erator currently
1b110 20 70 6f 69 6e 74 73 20 74 6f 2e 0a 2a 2f 0a 73   points to..*/.s
1b120 74 61 74 69 63 20 63 6f 6e 73 74 20 75 38 20 2a  tatic const u8 *
1b130 66 74 73 35 4d 75 6c 74 69 49 74 65 72 54 65 72  fts5MultiIterTer
1b140 6d 28 46 74 73 35 49 74 65 72 20 2a 70 49 74 65  m(Fts5Iter *pIte
1b150 72 2c 20 69 6e 74 20 2a 70 6e 29 7b 0a 20 20 46  r, int *pn){.  F
1b160 74 73 35 53 65 67 49 74 65 72 20 2a 70 20 3d 20  ts5SegIter *p = 
1b170 26 70 49 74 65 72 2d 3e 61 53 65 67 5b 20 70 49  &pIter->aSeg[ pI
1b180 74 65 72 2d 3e 61 46 69 72 73 74 5b 31 5d 2e 69  ter->aFirst[1].i
1b190 46 69 72 73 74 20 5d 3b 0a 20 20 2a 70 6e 20 3d  First ];.  *pn =
1b1a0 20 70 2d 3e 74 65 72 6d 2e 6e 3b 0a 20 20 72 65   p->term.n;.  re
1b1b0 74 75 72 6e 20 70 2d 3e 74 65 72 6d 2e 70 3b 0a  turn p->term.p;.
1b1c0 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74  }../*.** Allocat
1b1d0 65 20 61 20 6e 65 77 20 73 65 67 6d 65 6e 74 2d  e a new segment-
1b1e0 69 64 20 66 6f 72 20 74 68 65 20 73 74 72 75 63  id for the struc
1b1f0 74 75 72 65 20 70 53 74 72 75 63 74 2e 20 54 68  ture pStruct. Th
1b200 65 20 6e 65 77 20 73 65 67 6d 65 6e 74 0a 2a 2a  e new segment.**
1b210 20 69 64 20 6d 75 73 74 20 62 65 20 62 65 74 77   id must be betw
1b220 65 65 6e 20 31 20 61 6e 64 20 36 35 33 33 35 20  een 1 and 65335 
1b230 69 6e 63 6c 75 73 69 76 65 2c 20 61 6e 64 20 6d  inclusive, and m
1b240 75 73 74 20 6e 6f 74 20 62 65 20 75 73 65 64 20  ust not be used 
1b250 62 79 20 0a 2a 2a 20 61 6e 79 20 63 75 72 72 65  by .** any curre
1b260 6e 74 6c 79 20 65 78 69 73 74 69 6e 67 20 73 65  ntly existing se
1b270 67 6d 65 6e 74 2e 20 49 66 20 61 20 66 72 65 65  gment. If a free
1b280 20 73 65 67 6d 65 6e 74 20 69 64 20 63 61 6e 6e   segment id cann
1b290 6f 74 20 62 65 20 66 6f 75 6e 64 2c 0a 2a 2a 20  ot be found,.** 
1b2a0 53 51 4c 49 54 45 5f 46 55 4c 4c 20 69 73 20 72  SQLITE_FULL is r
1b2b0 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49  eturned..**.** I
1b2c0 66 20 61 6e 20 65 72 72 6f 72 20 68 61 73 20 61  f an error has a
1b2d0 6c 72 65 61 64 79 20 6f 63 63 75 72 72 65 64 2c  lready occurred,
1b2e0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
1b2f0 73 20 61 20 6e 6f 2d 6f 70 2e 20 30 20 69 73 20  s a no-op. 0 is 
1b300 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 69 6e 20  .** returned in 
1b310 74 68 69 73 20 63 61 73 65 2e 0a 2a 2f 0a 73 74  this case..*/.st
1b320 61 74 69 63 20 69 6e 74 20 66 74 73 35 41 6c 6c  atic int fts5All
1b330 6f 63 61 74 65 53 65 67 69 64 28 46 74 73 35 49  ocateSegid(Fts5I
1b340 6e 64 65 78 20 2a 70 2c 20 46 74 73 35 53 74 72  ndex *p, Fts5Str
1b350 75 63 74 75 72 65 20 2a 70 53 74 72 75 63 74 29  ucture *pStruct)
1b360 7b 0a 20 20 69 6e 74 20 69 53 65 67 69 64 20 3d  {.  int iSegid =
1b370 20 30 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 72 63   0;..  if( p->rc
1b380 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
1b390 20 20 20 69 66 28 20 70 53 74 72 75 63 74 2d 3e     if( pStruct->
1b3a0 6e 53 65 67 6d 65 6e 74 3e 3d 46 54 53 35 5f 4d  nSegment>=FTS5_M
1b3b0 41 58 5f 53 45 47 4d 45 4e 54 20 29 7b 0a 20 20  AX_SEGMENT ){.  
1b3c0 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49      p->rc = SQLI
1b3d0 54 45 5f 46 55 4c 4c 3b 0a 20 20 20 20 7d 65 6c  TE_FULL;.    }el
1b3e0 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 46 54 53  se{.      /* FTS
1b3f0 35 5f 4d 41 58 5f 53 45 47 4d 45 4e 54 20 69 73  5_MAX_SEGMENT is
1b400 20 63 75 72 72 65 6e 74 6c 79 20 64 65 66 69 6e   currently defin
1b410 65 64 20 61 73 20 32 30 30 30 2e 20 53 6f 20 74  ed as 2000. So t
1b420 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 20 20 20  he following.   
1b430 20 20 20 2a 2a 20 61 72 72 61 79 20 69 73 20 36     ** array is 6
1b440 33 20 65 6c 65 6d 65 6e 74 73 2c 20 6f 72 20 32  3 elements, or 2
1b450 35 32 20 62 79 74 65 73 2c 20 69 6e 20 73 69 7a  52 bytes, in siz
1b460 65 2e 20 20 2a 2f 0a 20 20 20 20 20 20 75 33 32  e.  */.      u32
1b470 20 61 55 73 65 64 5b 28 46 54 53 35 5f 4d 41 58   aUsed[(FTS5_MAX
1b480 5f 53 45 47 4d 45 4e 54 2b 33 31 29 20 2f 20 33  _SEGMENT+31) / 3
1b490 32 5d 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 4c  2];.      int iL
1b4a0 76 6c 2c 20 69 53 65 67 3b 0a 20 20 20 20 20 20  vl, iSeg;.      
1b4b0 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 75 33 32  int i;.      u32
1b4c0 20 6d 61 73 6b 3b 0a 20 20 20 20 20 20 6d 65 6d   mask;.      mem
1b4d0 73 65 74 28 61 55 73 65 64 2c 20 30 2c 20 73 69  set(aUsed, 0, si
1b4e0 7a 65 6f 66 28 61 55 73 65 64 29 29 3b 0a 20 20  zeof(aUsed));.  
1b4f0 20 20 20 20 66 6f 72 28 69 4c 76 6c 3d 30 3b 20      for(iLvl=0; 
1b500 69 4c 76 6c 3c 70 53 74 72 75 63 74 2d 3e 6e 4c  iLvl<pStruct->nL
1b510 65 76 65 6c 3b 20 69 4c 76 6c 2b 2b 29 7b 0a 20  evel; iLvl++){. 
1b520 20 20 20 20 20 20 20 66 6f 72 28 69 53 65 67 3d         for(iSeg=
1b530 30 3b 20 69 53 65 67 3c 70 53 74 72 75 63 74 2d  0; iSeg<pStruct-
1b540 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d 2e 6e 53  >aLevel[iLvl].nS
1b550 65 67 3b 20 69 53 65 67 2b 2b 29 7b 0a 20 20 20  eg; iSeg++){.   
1b560 20 20 20 20 20 20 20 69 6e 74 20 69 49 64 20 3d         int iId =
1b570 20 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c   pStruct->aLevel
1b580 5b 69 4c 76 6c 5d 2e 61 53 65 67 5b 69 53 65 67  [iLvl].aSeg[iSeg
1b590 5d 2e 69 53 65 67 69 64 3b 0a 20 20 20 20 20 20  ].iSegid;.      
1b5a0 20 20 20 20 69 66 28 20 69 49 64 3c 3d 46 54 53      if( iId<=FTS
1b5b0 35 5f 4d 41 58 5f 53 45 47 4d 45 4e 54 20 26 26  5_MAX_SEGMENT &&
1b5c0 20 69 49 64 3e 30 20 29 7b 0a 20 20 20 20 20 20   iId>0 ){.      
1b5d0 20 20 20 20 20 20 61 55 73 65 64 5b 28 69 49 64        aUsed[(iId
1b5e0 2d 31 29 20 2f 20 33 32 5d 20 7c 3d 20 28 75 33  -1) / 32] |= (u3
1b5f0 32 29 31 20 3c 3c 20 28 28 69 49 64 2d 31 29 20  2)1 << ((iId-1) 
1b600 25 20 33 32 29 3b 0a 20 20 20 20 20 20 20 20 20  % 32);.         
1b610 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
1b620 20 20 20 7d 0a 0a 20 20 20 20 20 20 66 6f 72 28     }..      for(
1b630 69 3d 30 3b 20 61 55 73 65 64 5b 69 5d 3d 3d 30  i=0; aUsed[i]==0
1b640 78 46 46 46 46 46 46 46 46 3b 20 69 2b 2b 29 3b  xFFFFFFFF; i++);
1b650 0a 20 20 20 20 20 20 6d 61 73 6b 20 3d 20 61 55  .      mask = aU
1b660 73 65 64 5b 69 5d 3b 0a 20 20 20 20 20 20 66 6f  sed[i];.      fo
1b670 72 28 69 53 65 67 69 64 3d 30 3b 20 6d 61 73 6b  r(iSegid=0; mask
1b680 20 26 20 28 28 75 33 32 29 31 20 3c 3c 20 69 53   & ((u32)1 << iS
1b690 65 67 69 64 29 3b 20 69 53 65 67 69 64 2b 2b 29  egid); iSegid++)
1b6a0 3b 0a 20 20 20 20 20 20 69 53 65 67 69 64 20 2b  ;.      iSegid +
1b6b0 3d 20 31 20 2b 20 69 2a 33 32 3b 0a 0a 23 69 66  = 1 + i*32;..#if
1b6c0 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
1b6d0 0a 20 20 20 20 20 20 66 6f 72 28 69 4c 76 6c 3d  .      for(iLvl=
1b6e0 30 3b 20 69 4c 76 6c 3c 70 53 74 72 75 63 74 2d  0; iLvl<pStruct-
1b6f0 3e 6e 4c 65 76 65 6c 3b 20 69 4c 76 6c 2b 2b 29  >nLevel; iLvl++)
1b700 7b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 53  {.        for(iS
1b710 65 67 3d 30 3b 20 69 53 65 67 3c 70 53 74 72 75  eg=0; iSeg<pStru
1b720 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d  ct->aLevel[iLvl]
1b730 2e 6e 53 65 67 3b 20 69 53 65 67 2b 2b 29 7b 0a  .nSeg; iSeg++){.
1b740 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
1b750 5f 6e 63 28 20 69 53 65 67 69 64 21 3d 70 53 74  _nc( iSegid!=pSt
1b760 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76  ruct->aLevel[iLv
1b770 6c 5d 2e 61 53 65 67 5b 69 53 65 67 5d 2e 69 53  l].aSeg[iSeg].iS
1b780 65 67 69 64 20 29 3b 0a 20 20 20 20 20 20 20 20  egid );.        
1b790 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
1b7a0 61 73 73 65 72 74 5f 6e 63 28 20 69 53 65 67 69  assert_nc( iSegi
1b7b0 64 3e 30 20 26 26 20 69 53 65 67 69 64 3c 3d 46  d>0 && iSegid<=F
1b7c0 54 53 35 5f 4d 41 58 5f 53 45 47 4d 45 4e 54 20  TS5_MAX_SEGMENT 
1b7d0 29 3b 0a 0a 20 20 20 20 20 20 7b 0a 20 20 20 20  );..      {.    
1b7e0 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74      sqlite3_stmt
1b7f0 20 2a 70 49 64 78 53 65 6c 65 63 74 20 3d 20 66   *pIdxSelect = f
1b800 74 73 35 49 64 78 53 65 6c 65 63 74 53 74 6d 74  ts5IdxSelectStmt
1b810 28 70 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  (p);.        if(
1b820 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
1b830 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 75  K ){.          u
1b840 38 20 61 42 6c 6f 62 5b 32 5d 20 3d 20 7b 30 78  8 aBlob[2] = {0x
1b850 66 66 2c 20 30 78 66 66 7d 3b 0a 20 20 20 20 20  ff, 0xff};.     
1b860 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e       sqlite3_bin
1b870 64 5f 69 6e 74 28 70 49 64 78 53 65 6c 65 63 74  d_int(pIdxSelect
1b880 2c 20 31 2c 20 69 53 65 67 69 64 29 3b 0a 20 20  , 1, iSegid);.  
1b890 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
1b8a0 62 69 6e 64 5f 62 6c 6f 62 28 70 49 64 78 53 65  bind_blob(pIdxSe
1b8b0 6c 65 63 74 2c 20 32 2c 20 61 42 6c 6f 62 2c 20  lect, 2, aBlob, 
1b8c0 32 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43  2, SQLITE_STATIC
1b8d0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  );.          ass
1b8e0 65 72 74 5f 6e 63 28 20 73 71 6c 69 74 65 33 5f  ert_nc( sqlite3_
1b8f0 73 74 65 70 28 70 49 64 78 53 65 6c 65 63 74 29  step(pIdxSelect)
1b900 21 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29 3b 0a  !=SQLITE_ROW );.
1b910 20 20 20 20 20 20 20 20 20 20 70 2d 3e 72 63 20            p->rc 
1b920 3d 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28  = sqlite3_reset(
1b930 70 49 64 78 53 65 6c 65 63 74 29 3b 0a 20 20 20  pIdxSelect);.   
1b940 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62         sqlite3_b
1b950 69 6e 64 5f 6e 75 6c 6c 28 70 49 64 78 53 65 6c  ind_null(pIdxSel
1b960 65 63 74 2c 20 32 29 3b 0a 20 20 20 20 20 20 20  ect, 2);.       
1b970 20 7d 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69   }.      }.#endi
1b980 66 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72  f.    }.  }..  r
1b990 65 74 75 72 6e 20 69 53 65 67 69 64 3b 0a 7d 0a  eturn iSegid;.}.
1b9a0 0a 2f 2a 0a 2a 2a 20 44 69 73 63 61 72 64 20 61  ./*.** Discard a
1b9b0 6c 6c 20 64 61 74 61 20 63 75 72 72 65 6e 74 6c  ll data currentl
1b9c0 79 20 63 61 63 68 65 64 20 69 6e 20 74 68 65 20  y cached in the 
1b9d0 68 61 73 68 2d 74 61 62 6c 65 73 2e 0a 2a 2f 0a  hash-tables..*/.
1b9e0 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
1b9f0 49 6e 64 65 78 44 69 73 63 61 72 64 44 61 74 61  IndexDiscardData
1ba00 28 46 74 73 35 49 6e 64 65 78 20 2a 70 29 7b 0a  (Fts5Index *p){.
1ba10 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 48 61    assert( p->pHa
1ba20 73 68 20 7c 7c 20 70 2d 3e 6e 50 65 6e 64 69 6e  sh || p->nPendin
1ba30 67 44 61 74 61 3d 3d 30 20 29 3b 0a 20 20 69 66  gData==0 );.  if
1ba40 28 20 70 2d 3e 70 48 61 73 68 20 29 7b 0a 20 20  ( p->pHash ){.  
1ba50 20 20 73 71 6c 69 74 65 33 46 74 73 35 48 61 73    sqlite3Fts5Has
1ba60 68 43 6c 65 61 72 28 70 2d 3e 70 48 61 73 68 29  hClear(p->pHash)
1ba70 3b 0a 20 20 20 20 70 2d 3e 6e 50 65 6e 64 69 6e  ;.    p->nPendin
1ba80 67 44 61 74 61 20 3d 20 30 3b 0a 20 20 7d 0a 7d  gData = 0;.  }.}
1ba90 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
1baa0 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 70  he size of the p
1bab0 72 65 66 69 78 2c 20 69 6e 20 62 79 74 65 73 2c  refix, in bytes,
1bac0 20 74 68 61 74 20 62 75 66 66 65 72 20 0a 2a 2a   that buffer .**
1bad0 20 28 70 4e 65 77 2f 3c 6c 65 6e 67 74 68 2d 75   (pNew/<length-u
1bae0 6e 6b 6e 6f 77 6e 3e 29 20 73 68 61 72 65 73 20  nknown>) shares 
1baf0 77 69 74 68 20 62 75 66 66 65 72 20 28 70 4f 6c  with buffer (pOl
1bb00 64 2f 6e 4f 6c 64 29 2e 0a 2a 2a 0a 2a 2a 20 42  d/nOld)..**.** B
1bb10 75 66 66 65 72 20 28 70 4e 65 77 2f 3c 6c 65 6e  uffer (pNew/<len
1bb20 67 74 68 2d 75 6e 6b 6e 6f 77 6e 3e 29 20 69 73  gth-unknown>) is
1bb30 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20 62   guaranteed to b
1bb40 65 20 67 72 65 61 74 65 72 20 0a 2a 2a 20 74 68  e greater .** th
1bb50 61 6e 20 62 75 66 66 65 72 20 28 70 4f 6c 64 2f  an buffer (pOld/
1bb60 6e 4f 6c 64 29 2e 0a 2a 2f 0a 73 74 61 74 69 63  nOld)..*/.static
1bb70 20 69 6e 74 20 66 74 73 35 50 72 65 66 69 78 43   int fts5PrefixC
1bb80 6f 6d 70 72 65 73 73 28 69 6e 74 20 6e 4f 6c 64  ompress(int nOld
1bb90 2c 20 63 6f 6e 73 74 20 75 38 20 2a 70 4f 6c 64  , const u8 *pOld
1bba0 2c 20 63 6f 6e 73 74 20 75 38 20 2a 70 4e 65 77  , const u8 *pNew
1bbb0 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f  ){.  int i;.  fo
1bbc0 72 28 69 3d 30 3b 20 69 3c 6e 4f 6c 64 3b 20 69  r(i=0; i<nOld; i
1bbd0 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 4f 6c  ++){.    if( pOl
1bbe0 64 5b 69 5d 21 3d 70 4e 65 77 5b 69 5d 20 29 20  d[i]!=pNew[i] ) 
1bbf0 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72 65 74  break;.  }.  ret
1bc00 75 72 6e 20 69 3b 0a 7d 0a 0a 73 74 61 74 69 63  urn i;.}..static
1bc10 20 76 6f 69 64 20 66 74 73 35 57 72 69 74 65 44   void fts5WriteD
1bc20 6c 69 64 78 43 6c 65 61 72 28 0a 20 20 46 74 73  lidxClear(.  Fts
1bc30 35 49 6e 64 65 78 20 2a 70 2c 20 0a 20 20 46 74  5Index *p, .  Ft
1bc40 73 35 53 65 67 57 72 69 74 65 72 20 2a 70 57 72  s5SegWriter *pWr
1bc50 69 74 65 72 2c 0a 20 20 69 6e 74 20 62 46 6c 75  iter,.  int bFlu
1bc60 73 68 20 20 20 20 20 20 20 20 20 20 20 20 20 20  sh              
1bc70 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 72          /* If tr
1bc80 75 65 2c 20 77 72 69 74 65 20 64 6c 69 64 78 20  ue, write dlidx 
1bc90 74 6f 20 64 69 73 6b 20 2a 2f 0a 29 7b 0a 20 20  to disk */.){.  
1bca0 69 6e 74 20 69 3b 0a 20 20 61 73 73 65 72 74 28  int i;.  assert(
1bcb0 20 62 46 6c 75 73 68 3d 3d 30 20 7c 7c 20 28 70   bFlush==0 || (p
1bcc0 57 72 69 74 65 72 2d 3e 6e 44 6c 69 64 78 3e 30  Writer->nDlidx>0
1bcd0 20 26 26 20 70 57 72 69 74 65 72 2d 3e 61 44 6c   && pWriter->aDl
1bce0 69 64 78 5b 30 5d 2e 62 75 66 2e 6e 3e 30 29 20  idx[0].buf.n>0) 
1bcf0 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  );.  for(i=0; i<
1bd00 70 57 72 69 74 65 72 2d 3e 6e 44 6c 69 64 78 3b  pWriter->nDlidx;
1bd10 20 69 2b 2b 29 7b 0a 20 20 20 20 46 74 73 35 44   i++){.    Fts5D
1bd20 6c 69 64 78 57 72 69 74 65 72 20 2a 70 44 6c 69  lidxWriter *pDli
1bd30 64 78 20 3d 20 26 70 57 72 69 74 65 72 2d 3e 61  dx = &pWriter->a
1bd40 44 6c 69 64 78 5b 69 5d 3b 0a 20 20 20 20 69 66  Dlidx[i];.    if
1bd50 28 20 70 44 6c 69 64 78 2d 3e 62 75 66 2e 6e 3d  ( pDlidx->buf.n=
1bd60 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  =0 ) break;.    
1bd70 69 66 28 20 62 46 6c 75 73 68 20 29 7b 0a 20 20  if( bFlush ){.  
1bd80 20 20 20 20 61 73 73 65 72 74 28 20 70 44 6c 69      assert( pDli
1bd90 64 78 2d 3e 70 67 6e 6f 21 3d 30 20 29 3b 0a 20  dx->pgno!=0 );. 
1bda0 20 20 20 20 20 66 74 73 35 44 61 74 61 57 72 69       fts5DataWri
1bdb0 74 65 28 70 2c 20 0a 20 20 20 20 20 20 20 20 20  te(p, .         
1bdc0 20 46 54 53 35 5f 44 4c 49 44 58 5f 52 4f 57 49   FTS5_DLIDX_ROWI
1bdd0 44 28 70 57 72 69 74 65 72 2d 3e 69 53 65 67 69  D(pWriter->iSegi
1bde0 64 2c 20 69 2c 20 70 44 6c 69 64 78 2d 3e 70 67  d, i, pDlidx->pg
1bdf0 6e 6f 29 2c 0a 20 20 20 20 20 20 20 20 20 20 70  no),.          p
1be00 44 6c 69 64 78 2d 3e 62 75 66 2e 70 2c 20 70 44  Dlidx->buf.p, pD
1be10 6c 69 64 78 2d 3e 62 75 66 2e 6e 0a 20 20 20 20  lidx->buf.n.    
1be20 20 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73    );.    }.    s
1be30 71 6c 69 74 65 33 46 74 73 35 42 75 66 66 65 72  qlite3Fts5Buffer
1be40 5a 65 72 6f 28 26 70 44 6c 69 64 78 2d 3e 62 75  Zero(&pDlidx->bu
1be50 66 29 3b 0a 20 20 20 20 70 44 6c 69 64 78 2d 3e  f);.    pDlidx->
1be60 62 50 72 65 76 56 61 6c 69 64 20 3d 20 30 3b 0a  bPrevValid = 0;.
1be70 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 72 6f    }.}../*.** Gro
1be80 77 20 74 68 65 20 70 57 72 69 74 65 72 2d 3e 61  w the pWriter->a
1be90 44 6c 69 64 78 5b 5d 20 61 72 72 61 79 20 74 6f  Dlidx[] array to
1bea0 20 61 74 20 6c 65 61 73 74 20 6e 4c 76 6c 20 65   at least nLvl e
1beb0 6c 65 6d 65 6e 74 73 20 69 6e 20 73 69 7a 65 2e  lements in size.
1bec0 0a 2a 2a 20 41 6e 79 20 6e 65 77 20 61 72 72 61  .** Any new arra
1bed0 79 20 65 6c 65 6d 65 6e 74 73 20 61 72 65 20 7a  y elements are z
1bee0 65 72 6f 65 64 20 62 65 66 6f 72 65 20 72 65 74  eroed before ret
1bef0 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69  urning..*/.stati
1bf00 63 20 69 6e 74 20 66 74 73 35 57 72 69 74 65 44  c int fts5WriteD
1bf10 6c 69 64 78 47 72 6f 77 28 0a 20 20 46 74 73 35  lidxGrow(.  Fts5
1bf20 49 6e 64 65 78 20 2a 70 2c 0a 20 20 46 74 73 35  Index *p,.  Fts5
1bf30 53 65 67 57 72 69 74 65 72 20 2a 70 57 72 69 74  SegWriter *pWrit
1bf40 65 72 2c 0a 20 20 69 6e 74 20 6e 4c 76 6c 0a 29  er,.  int nLvl.)
1bf50 7b 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53  {.  if( p->rc==S
1bf60 51 4c 49 54 45 5f 4f 4b 20 26 26 20 6e 4c 76 6c  QLITE_OK && nLvl
1bf70 3e 3d 70 57 72 69 74 65 72 2d 3e 6e 44 6c 69 64  >=pWriter->nDlid
1bf80 78 20 29 7b 0a 20 20 20 20 46 74 73 35 44 6c 69  x ){.    Fts5Dli
1bf90 64 78 57 72 69 74 65 72 20 2a 61 44 6c 69 64 78  dxWriter *aDlidx
1bfa0 20 3d 20 28 46 74 73 35 44 6c 69 64 78 57 72 69   = (Fts5DlidxWri
1bfb0 74 65 72 2a 29 73 71 6c 69 74 65 33 5f 72 65 61  ter*)sqlite3_rea
1bfc0 6c 6c 6f 63 36 34 28 0a 20 20 20 20 20 20 20 20  lloc64(.        
1bfd0 70 57 72 69 74 65 72 2d 3e 61 44 6c 69 64 78 2c  pWriter->aDlidx,
1bfe0 20 73 69 7a 65 6f 66 28 46 74 73 35 44 6c 69 64   sizeof(Fts5Dlid
1bff0 78 57 72 69 74 65 72 29 20 2a 20 6e 4c 76 6c 0a  xWriter) * nLvl.
1c000 20 20 20 20 29 3b 0a 20 20 20 20 69 66 28 20 61      );.    if( a
1c010 44 6c 69 64 78 3d 3d 30 20 29 7b 0a 20 20 20 20  Dlidx==0 ){.    
1c020 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45    p->rc = SQLITE
1c030 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 65 6c 73  _NOMEM;.    }els
1c040 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 42 79  e{.      int nBy
1c050 74 65 20 3d 20 73 69 7a 65 6f 66 28 46 74 73 35  te = sizeof(Fts5
1c060 44 6c 69 64 78 57 72 69 74 65 72 29 20 2a 20 28  DlidxWriter) * (
1c070 6e 4c 76 6c 20 2d 20 70 57 72 69 74 65 72 2d 3e  nLvl - pWriter->
1c080 6e 44 6c 69 64 78 29 3b 0a 20 20 20 20 20 20 6d  nDlidx);.      m
1c090 65 6d 73 65 74 28 26 61 44 6c 69 64 78 5b 70 57  emset(&aDlidx[pW
1c0a0 72 69 74 65 72 2d 3e 6e 44 6c 69 64 78 5d 2c 20  riter->nDlidx], 
1c0b0 30 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20 20 20  0, nByte);.     
1c0c0 20 70 57 72 69 74 65 72 2d 3e 61 44 6c 69 64 78   pWriter->aDlidx
1c0d0 20 3d 20 61 44 6c 69 64 78 3b 0a 20 20 20 20 20   = aDlidx;.     
1c0e0 20 70 57 72 69 74 65 72 2d 3e 6e 44 6c 69 64 78   pWriter->nDlidx
1c0f0 20 3d 20 6e 4c 76 6c 3b 0a 20 20 20 20 7d 0a 20   = nLvl;.    }. 
1c100 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e 72   }.  return p->r
1c110 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74  c;.}../*.** If t
1c120 68 65 20 63 75 72 72 65 6e 74 20 64 6f 63 6c 69  he current docli
1c130 73 74 2d 69 6e 64 65 78 20 61 63 63 75 6d 75 6c  st-index accumul
1c140 61 74 69 6e 67 20 69 6e 20 70 57 72 69 74 65 72  ating in pWriter
1c150 2d 3e 61 44 6c 69 64 78 5b 5d 20 69 73 20 6c 61  ->aDlidx[] is la
1c160 72 67 65 0a 2a 2a 20 65 6e 6f 75 67 68 2c 20 66  rge.** enough, f
1c170 6c 75 73 68 20 69 74 20 74 6f 20 64 69 73 6b 20  lush it to disk 
1c180 61 6e 64 20 72 65 74 75 72 6e 20 31 2e 20 4f 74  and return 1. Ot
1c190 68 65 72 77 69 73 65 20 64 69 73 63 61 72 64 20  herwise discard 
1c1a0 69 74 20 61 6e 64 20 72 65 74 75 72 6e 0a 2a 2a  it and return.**
1c1b0 20 7a 65 72 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63   zero..*/.static
1c1c0 20 69 6e 74 20 66 74 73 35 57 72 69 74 65 46 6c   int fts5WriteFl
1c1d0 75 73 68 44 6c 69 64 78 28 46 74 73 35 49 6e 64  ushDlidx(Fts5Ind
1c1e0 65 78 20 2a 70 2c 20 46 74 73 35 53 65 67 57 72  ex *p, Fts5SegWr
1c1f0 69 74 65 72 20 2a 70 57 72 69 74 65 72 29 7b 0a  iter *pWriter){.
1c200 20 20 69 6e 74 20 62 46 6c 61 67 20 3d 20 30 3b    int bFlag = 0;
1c210 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20  ..  /* If there 
1c220 77 65 72 65 20 46 54 53 35 5f 4d 49 4e 5f 44 4c  were FTS5_MIN_DL
1c230 49 44 58 5f 53 49 5a 45 20 6f 72 20 6d 6f 72 65  IDX_SIZE or more
1c240 20 65 6d 70 74 79 20 6c 65 61 66 20 70 61 67 65   empty leaf page
1c250 73 20 77 72 69 74 74 65 6e 0a 20 20 2a 2a 20 74  s written.  ** t
1c260 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 2c 20  o the database, 
1c270 61 6c 73 6f 20 77 72 69 74 65 20 74 68 65 20 64  also write the d
1c280 6f 63 6c 69 73 74 2d 69 6e 64 65 78 20 74 6f 20  oclist-index to 
1c290 64 69 73 6b 2e 20 20 2a 2f 0a 20 20 69 66 28 20  disk.  */.  if( 
1c2a0 70 57 72 69 74 65 72 2d 3e 61 44 6c 69 64 78 5b  pWriter->aDlidx[
1c2b0 30 5d 2e 62 75 66 2e 6e 3e 30 20 26 26 20 70 57  0].buf.n>0 && pW
1c2c0 72 69 74 65 72 2d 3e 6e 45 6d 70 74 79 3e 3d 46  riter->nEmpty>=F
1c2d0 54 53 35 5f 4d 49 4e 5f 44 4c 49 44 58 5f 53 49  TS5_MIN_DLIDX_SI
1c2e0 5a 45 20 29 7b 0a 20 20 20 20 62 46 6c 61 67 20  ZE ){.    bFlag 
1c2f0 3d 20 31 3b 0a 20 20 7d 0a 20 20 66 74 73 35 57  = 1;.  }.  fts5W
1c300 72 69 74 65 44 6c 69 64 78 43 6c 65 61 72 28 70  riteDlidxClear(p
1c310 2c 20 70 57 72 69 74 65 72 2c 20 62 46 6c 61 67  , pWriter, bFlag
1c320 29 3b 0a 20 20 70 57 72 69 74 65 72 2d 3e 6e 45  );.  pWriter->nE
1c330 6d 70 74 79 20 3d 20 30 3b 0a 20 20 72 65 74 75  mpty = 0;.  retu
1c340 72 6e 20 62 46 6c 61 67 3b 0a 7d 0a 0a 2f 2a 0a  rn bFlag;.}../*.
1c350 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
1c360 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 65   is called whene
1c370 76 65 72 20 70 72 6f 63 65 73 73 69 6e 67 20 6f  ver processing o
1c380 66 20 74 68 65 20 64 6f 63 6c 69 73 74 20 66 6f  f the doclist fo
1c390 72 20 74 68 65 20 0a 2a 2a 20 6c 61 73 74 20 74  r the .** last t
1c3a0 65 72 6d 20 6f 6e 20 6c 65 61 66 20 70 61 67 65  erm on leaf page
1c3b0 20 28 70 57 72 69 74 65 72 2d 3e 69 42 74 50 61   (pWriter->iBtPa
1c3c0 67 65 29 20 69 73 20 63 6f 6d 70 6c 65 74 65 64  ge) is completed
1c3d0 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 6f 63  . .**.** The doc
1c3e0 6c 69 73 74 2d 69 6e 64 65 78 20 66 6f 72 20 74  list-index for t
1c3f0 68 61 74 20 74 65 72 6d 20 69 73 20 63 75 72 72  hat term is curr
1c400 65 6e 74 6c 79 20 73 74 6f 72 65 64 20 69 6e 2d  ently stored in-
1c410 6d 65 6d 6f 72 79 20 77 69 74 68 69 6e 20 74 68  memory within th
1c420 65 0a 2a 2a 20 46 74 73 35 53 65 67 57 72 69 74  e.** Fts5SegWrit
1c430 65 72 2e 61 44 6c 69 64 78 5b 5d 20 61 72 72 61  er.aDlidx[] arra
1c440 79 2e 20 49 66 20 69 74 20 69 73 20 6c 61 72 67  y. If it is larg
1c450 65 20 65 6e 6f 75 67 68 2c 20 74 68 69 73 20 66  e enough, this f
1c460 75 6e 63 74 69 6f 6e 0a 2a 2a 20 77 72 69 74 65  unction.** write
1c470 73 20 69 74 20 6f 75 74 20 74 6f 20 64 69 73 6b  s it out to disk
1c480 2e 20 4f 72 2c 20 69 66 20 69 74 20 69 73 20 74  . Or, if it is t
1c490 6f 6f 20 73 6d 61 6c 6c 20 74 6f 20 62 6f 74 68  oo small to both
1c4a0 65 72 20 77 69 74 68 2c 20 64 69 73 63 61 72 64  er with, discard
1c4b0 73 0a 2a 2a 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 46  s.** it..**.** F
1c4c0 74 73 35 53 65 67 57 72 69 74 65 72 2e 62 74 74  ts5SegWriter.btt
1c4d0 65 72 6d 20 63 75 72 72 65 6e 74 6c 79 20 63 6f  erm currently co
1c4e0 6e 74 61 69 6e 73 20 74 68 65 20 66 69 72 73 74  ntains the first
1c4f0 20 74 65 72 6d 20 6f 6e 20 70 61 67 65 20 69 42   term on page iB
1c500 74 50 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  tPage..*/.static
1c510 20 76 6f 69 64 20 66 74 73 35 57 72 69 74 65 46   void fts5WriteF
1c520 6c 75 73 68 42 74 72 65 65 28 46 74 73 35 49 6e  lushBtree(Fts5In
1c530 64 65 78 20 2a 70 2c 20 46 74 73 35 53 65 67 57  dex *p, Fts5SegW
1c540 72 69 74 65 72 20 2a 70 57 72 69 74 65 72 29 7b  riter *pWriter){
1c550 0a 20 20 69 6e 74 20 62 46 6c 61 67 3b 0a 0a 20  .  int bFlag;.. 
1c560 20 61 73 73 65 72 74 28 20 70 57 72 69 74 65 72   assert( pWriter
1c570 2d 3e 69 42 74 50 61 67 65 20 7c 7c 20 70 57 72  ->iBtPage || pWr
1c580 69 74 65 72 2d 3e 6e 45 6d 70 74 79 3d 3d 30 20  iter->nEmpty==0 
1c590 29 3b 0a 20 20 69 66 28 20 70 57 72 69 74 65 72  );.  if( pWriter
1c5a0 2d 3e 69 42 74 50 61 67 65 3d 3d 30 20 29 20 72  ->iBtPage==0 ) r
1c5b0 65 74 75 72 6e 3b 0a 20 20 62 46 6c 61 67 20 3d  eturn;.  bFlag =
1c5c0 20 66 74 73 35 57 72 69 74 65 46 6c 75 73 68 44   fts5WriteFlushD
1c5d0 6c 69 64 78 28 70 2c 20 70 57 72 69 74 65 72 29  lidx(p, pWriter)
1c5e0 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d  ;..  if( p->rc==
1c5f0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1c600 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d   const char *z =
1c610 20 28 70 57 72 69 74 65 72 2d 3e 62 74 74 65 72   (pWriter->btter
1c620 6d 2e 6e 3e 30 3f 28 63 6f 6e 73 74 20 63 68 61  m.n>0?(const cha
1c630 72 2a 29 70 57 72 69 74 65 72 2d 3e 62 74 74 65  r*)pWriter->btte
1c640 72 6d 2e 70 3a 22 22 29 3b 0a 20 20 20 20 2f 2a  rm.p:"");.    /*
1c650 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 77   The following w
1c660 61 73 20 61 6c 72 65 61 64 79 20 64 6f 6e 65 20  as already done 
1c670 69 6e 20 66 74 73 35 57 72 69 74 65 49 6e 69 74  in fts5WriteInit
1c680 28 29 3a 20 2a 2f 0a 20 20 20 20 2f 2a 20 73 71  (): */.    /* sq
1c690 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 28 70  lite3_bind_int(p
1c6a0 2d 3e 70 49 64 78 57 72 69 74 65 72 2c 20 31 2c  ->pIdxWriter, 1,
1c6b0 20 70 57 72 69 74 65 72 2d 3e 69 53 65 67 69 64   pWriter->iSegid
1c6c0 29 3b 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65  ); */.    sqlite
1c6d0 33 5f 62 69 6e 64 5f 62 6c 6f 62 28 70 2d 3e 70  3_bind_blob(p->p
1c6e0 49 64 78 57 72 69 74 65 72 2c 20 32 2c 20 7a 2c  IdxWriter, 2, z,
1c6f0 20 70 57 72 69 74 65 72 2d 3e 62 74 74 65 72 6d   pWriter->btterm
1c700 2e 6e 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49  .n, SQLITE_STATI
1c710 43 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  C);.    sqlite3_
1c720 62 69 6e 64 5f 69 6e 74 36 34 28 70 2d 3e 70 49  bind_int64(p->pI
1c730 64 78 57 72 69 74 65 72 2c 20 33 2c 20 62 46 6c  dxWriter, 3, bFl
1c740 61 67 20 2b 20 28 28 69 36 34 29 70 57 72 69 74  ag + ((i64)pWrit
1c750 65 72 2d 3e 69 42 74 50 61 67 65 3c 3c 31 29 29  er->iBtPage<<1))
1c760 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74  ;.    sqlite3_st
1c770 65 70 28 70 2d 3e 70 49 64 78 57 72 69 74 65 72  ep(p->pIdxWriter
1c780 29 3b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 73  );.    p->rc = s
1c790 71 6c 69 74 65 33 5f 72 65 73 65 74 28 70 2d 3e  qlite3_reset(p->
1c7a0 70 49 64 78 57 72 69 74 65 72 29 3b 0a 20 20 20  pIdxWriter);.   
1c7b0 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 6e 75   sqlite3_bind_nu
1c7c0 6c 6c 28 70 2d 3e 70 49 64 78 57 72 69 74 65 72  ll(p->pIdxWriter
1c7d0 2c 20 32 29 3b 0a 20 20 7d 0a 20 20 70 57 72 69  , 2);.  }.  pWri
1c7e0 74 65 72 2d 3e 69 42 74 50 61 67 65 20 3d 20 30  ter->iBtPage = 0
1c7f0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
1c800 69 73 20 63 61 6c 6c 65 64 20 6f 6e 63 65 20 66  is called once f
1c810 6f 72 20 65 61 63 68 20 6c 65 61 66 20 70 61 67  or each leaf pag
1c820 65 20 65 78 63 65 70 74 20 74 68 65 20 66 69 72  e except the fir
1c830 73 74 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73  st that contains
1c840 0a 2a 2a 20 61 74 20 6c 65 61 73 74 20 6f 6e 65  .** at least one
1c850 20 74 65 72 6d 2e 20 41 72 67 75 6d 65 6e 74 20   term. Argument 
1c860 28 6e 54 65 72 6d 2f 70 54 65 72 6d 29 20 69 73  (nTerm/pTerm) is
1c870 20 74 68 65 20 73 70 6c 69 74 2d 6b 65 79 20 2d   the split-key -
1c880 20 61 20 74 65 72 6d 20 74 68 61 74 0a 2a 2a 20   a term that.** 
1c890 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20 61  is larger than a
1c8a0 6c 6c 20 74 65 72 6d 73 20 77 72 69 74 74 65 6e  ll terms written
1c8b0 20 74 6f 20 65 61 72 6c 69 65 72 20 6c 65 61 76   to earlier leav
1c8c0 65 73 2c 20 61 6e 64 20 65 71 75 61 6c 20 74 6f  es, and equal to
1c8d0 20 6f 72 0a 2a 2a 20 73 6d 61 6c 6c 65 72 20 74   or.** smaller t
1c8e0 68 61 6e 20 74 68 65 20 66 69 72 73 74 20 74 65  han the first te
1c8f0 72 6d 20 6f 6e 20 74 68 65 20 6e 65 77 20 6c 65  rm on the new le
1c900 61 66 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  af..**.** If an 
1c910 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 61 6e  error occurs, an
1c920 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 6c   error code is l
1c930 65 66 74 20 69 6e 20 46 74 73 35 49 6e 64 65 78  eft in Fts5Index
1c940 2e 72 63 2e 20 49 66 20 61 6e 20 65 72 72 6f 72  .rc. If an error
1c950 0a 2a 2a 20 68 61 73 20 61 6c 72 65 61 64 79 20  .** has already 
1c960 6f 63 63 75 72 72 65 64 20 77 68 65 6e 20 74 68  occurred when th
1c970 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
1c980 61 6c 6c 65 64 2c 20 69 74 20 69 73 20 61 20 6e  alled, it is a n
1c990 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  o-op..*/.static 
1c9a0 76 6f 69 64 20 66 74 73 35 57 72 69 74 65 42 74  void fts5WriteBt
1c9b0 72 65 65 54 65 72 6d 28 0a 20 20 46 74 73 35 49  reeTerm(.  Fts5I
1c9c0 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20  ndex *p,        
1c9d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54             /* FT
1c9e0 53 35 20 62 61 63 6b 65 6e 64 20 6f 62 6a 65 63  S5 backend objec
1c9f0 74 20 2a 2f 0a 20 20 46 74 73 35 53 65 67 57 72  t */.  Fts5SegWr
1ca00 69 74 65 72 20 2a 70 57 72 69 74 65 72 2c 20 20  iter *pWriter,  
1ca10 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 72         /* Writer
1ca20 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74   object */.  int
1ca30 20 6e 54 65 72 6d 2c 20 63 6f 6e 73 74 20 75 38   nTerm, const u8
1ca40 20 2a 70 54 65 72 6d 20 20 20 20 20 20 2f 2a 20   *pTerm      /* 
1ca50 46 69 72 73 74 20 74 65 72 6d 20 6f 6e 20 6e 65  First term on ne
1ca60 77 20 70 61 67 65 20 2a 2f 0a 29 7b 0a 20 20 66  w page */.){.  f
1ca70 74 73 35 57 72 69 74 65 46 6c 75 73 68 42 74 72  ts5WriteFlushBtr
1ca80 65 65 28 70 2c 20 70 57 72 69 74 65 72 29 3b 0a  ee(p, pWriter);.
1ca90 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c    if( p->rc==SQL
1caa0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 66 74  ITE_OK ){.    ft
1cab0 73 35 42 75 66 66 65 72 53 65 74 28 26 70 2d 3e  s5BufferSet(&p->
1cac0 72 63 2c 20 26 70 57 72 69 74 65 72 2d 3e 62 74  rc, &pWriter->bt
1cad0 74 65 72 6d 2c 20 6e 54 65 72 6d 2c 20 70 54 65  term, nTerm, pTe
1cae0 72 6d 29 3b 0a 20 20 20 20 70 57 72 69 74 65 72  rm);.    pWriter
1caf0 2d 3e 69 42 74 50 61 67 65 20 3d 20 70 57 72 69  ->iBtPage = pWri
1cb00 74 65 72 2d 3e 77 72 69 74 65 72 2e 70 67 6e 6f  ter->writer.pgno
1cb10 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  ;.  }.}../*.** T
1cb20 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
1cb30 63 61 6c 6c 65 64 20 77 68 65 6e 20 66 6c 75 73  called when flus
1cb40 68 69 6e 67 20 61 20 6c 65 61 66 20 70 61 67 65  hing a leaf page
1cb50 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 6e   that contains n
1cb60 6f 0a 2a 2a 20 74 65 72 6d 73 20 61 74 20 61 6c  o.** terms at al
1cb70 6c 20 74 6f 20 64 69 73 6b 2e 0a 2a 2f 0a 73 74  l to disk..*/.st
1cb80 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 57 72  atic void fts5Wr
1cb90 69 74 65 42 74 72 65 65 4e 6f 54 65 72 6d 28 0a  iteBtreeNoTerm(.
1cba0 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20    Fts5Index *p, 
1cbb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cbc0 20 20 2f 2a 20 46 54 53 35 20 62 61 63 6b 65 6e    /* FTS5 backen
1cbd0 64 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 46 74  d object */.  Ft
1cbe0 73 35 53 65 67 57 72 69 74 65 72 20 2a 70 57 72  s5SegWriter *pWr
1cbf0 69 74 65 72 20 20 20 20 20 20 20 20 20 20 2f 2a  iter          /*
1cc00 20 57 72 69 74 65 72 20 6f 62 6a 65 63 74 20 2a   Writer object *
1cc10 2f 0a 29 7b 0a 20 20 2f 2a 20 49 66 20 74 68 65  /.){.  /* If the
1cc20 72 65 20 77 65 72 65 20 6e 6f 20 72 6f 77 69 64  re were no rowid
1cc30 73 20 6f 6e 20 74 68 65 20 6c 65 61 66 20 70 61  s on the leaf pa
1cc40 67 65 20 65 69 74 68 65 72 20 61 6e 64 20 74 68  ge either and th
1cc50 65 20 64 6f 63 6c 69 73 74 2d 69 6e 64 65 78 0a  e doclist-index.
1cc60 20 20 2a 2a 20 68 61 73 20 61 6c 72 65 61 64 79    ** has already
1cc70 20 62 65 65 6e 20 73 74 61 72 74 65 64 2c 20 61   been started, a
1cc80 70 70 65 6e 64 20 61 6e 20 30 78 30 30 20 62 79  ppend an 0x00 by
1cc90 74 65 20 74 6f 20 69 74 2e 20 20 2a 2f 0a 20 20  te to it.  */.  
1cca0 69 66 28 20 70 57 72 69 74 65 72 2d 3e 62 46 69  if( pWriter->bFi
1ccb0 72 73 74 52 6f 77 69 64 49 6e 50 61 67 65 20 26  rstRowidInPage &
1ccc0 26 20 70 57 72 69 74 65 72 2d 3e 61 44 6c 69 64  & pWriter->aDlid
1ccd0 78 5b 30 5d 2e 62 75 66 2e 6e 3e 30 20 29 7b 0a  x[0].buf.n>0 ){.
1cce0 20 20 20 20 46 74 73 35 44 6c 69 64 78 57 72 69      Fts5DlidxWri
1ccf0 74 65 72 20 2a 70 44 6c 69 64 78 20 3d 20 26 70  ter *pDlidx = &p
1cd00 57 72 69 74 65 72 2d 3e 61 44 6c 69 64 78 5b 30  Writer->aDlidx[0
1cd10 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ];.    assert( p
1cd20 44 6c 69 64 78 2d 3e 62 50 72 65 76 56 61 6c 69  Dlidx->bPrevVali
1cd30 64 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  d );.    sqlite3
1cd40 46 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64  Fts5BufferAppend
1cd50 56 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26  Varint(&p->rc, &
1cd60 70 44 6c 69 64 78 2d 3e 62 75 66 2c 20 30 29 3b  pDlidx->buf, 0);
1cd70 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 6e 63 72 65  .  }..  /* Incre
1cd80 6d 65 6e 74 20 74 68 65 20 22 6e 75 6d 62 65 72  ment the "number
1cd90 20 6f 66 20 73 65 71 75 65 6e 74 69 61 6c 20 6c   of sequential l
1cda0 65 61 76 65 73 20 77 69 74 68 6f 75 74 20 61 20  eaves without a 
1cdb0 74 65 72 6d 22 20 63 6f 75 6e 74 65 72 2e 20 2a  term" counter. *
1cdc0 2f 0a 20 20 70 57 72 69 74 65 72 2d 3e 6e 45 6d  /.  pWriter->nEm
1cdd0 70 74 79 2b 2b 3b 0a 7d 0a 0a 73 74 61 74 69 63  pty++;.}..static
1cde0 20 69 36 34 20 66 74 73 35 44 6c 69 64 78 45 78   i64 fts5DlidxEx
1cdf0 74 72 61 63 74 46 69 72 73 74 52 6f 77 69 64 28  tractFirstRowid(
1ce00 46 74 73 35 42 75 66 66 65 72 20 2a 70 42 75 66  Fts5Buffer *pBuf
1ce10 29 7b 0a 20 20 69 36 34 20 69 52 6f 77 69 64 3b  ){.  i64 iRowid;
1ce20 0a 20 20 69 6e 74 20 69 4f 66 66 3b 0a 0a 20 20  .  int iOff;..  
1ce30 69 4f 66 66 20 3d 20 31 20 2b 20 66 74 73 35 47  iOff = 1 + fts5G
1ce40 65 74 56 61 72 69 6e 74 28 26 70 42 75 66 2d 3e  etVarint(&pBuf->
1ce50 70 5b 31 5d 2c 20 28 75 36 34 2a 29 26 69 52 6f  p[1], (u64*)&iRo
1ce60 77 69 64 29 3b 0a 20 20 66 74 73 35 47 65 74 56  wid);.  fts5GetV
1ce70 61 72 69 6e 74 28 26 70 42 75 66 2d 3e 70 5b 69  arint(&pBuf->p[i
1ce80 4f 66 66 5d 2c 20 28 75 36 34 2a 29 26 69 52 6f  Off], (u64*)&iRo
1ce90 77 69 64 29 3b 0a 20 20 72 65 74 75 72 6e 20 69  wid);.  return i
1cea0 52 6f 77 69 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Rowid;.}../*.** 
1ceb0 52 6f 77 69 64 20 69 52 6f 77 69 64 20 68 61 73  Rowid iRowid has
1cec0 20 6a 75 73 74 20 62 65 65 6e 20 61 70 70 65 6e   just been appen
1ced0 64 65 64 20 74 6f 20 74 68 65 20 63 75 72 72 65  ded to the curre
1cee0 6e 74 20 6c 65 61 66 20 70 61 67 65 2e 20 49 74  nt leaf page. It
1cef0 20 69 73 20 74 68 65 0a 2a 2a 20 66 69 72 73 74   is the.** first
1cf00 20 6f 6e 20 74 68 65 20 70 61 67 65 2e 20 54 68   on the page. Th
1cf10 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 70 70 65  is function appe
1cf20 6e 64 73 20 61 6e 20 61 70 70 72 6f 70 72 69 61  nds an appropria
1cf30 74 65 20 65 6e 74 72 79 20 74 6f 20 74 68 65 20  te entry to the 
1cf40 63 75 72 72 65 6e 74 0a 2a 2a 20 64 6f 63 6c 69  current.** docli
1cf50 73 74 2d 69 6e 64 65 78 2e 0a 2a 2f 0a 73 74 61  st-index..*/.sta
1cf60 74 69 63 20 76 6f 69 64 20 66 74 73 35 57 72 69  tic void fts5Wri
1cf70 74 65 44 6c 69 64 78 41 70 70 65 6e 64 28 0a 20  teDlidxAppend(. 
1cf80 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 0a   Fts5Index *p, .
1cf90 20 20 46 74 73 35 53 65 67 57 72 69 74 65 72 20    Fts5SegWriter 
1cfa0 2a 70 57 72 69 74 65 72 2c 20 0a 20 20 69 36 34  *pWriter, .  i64
1cfb0 20 69 52 6f 77 69 64 0a 29 7b 0a 20 20 69 6e 74   iRowid.){.  int
1cfc0 20 69 3b 0a 20 20 69 6e 74 20 62 44 6f 6e 65 20   i;.  int bDone 
1cfd0 3d 20 30 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b  = 0;..  for(i=0;
1cfe0 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
1cff0 4b 20 26 26 20 62 44 6f 6e 65 3d 3d 30 3b 20 69  K && bDone==0; i
1d000 2b 2b 29 7b 0a 20 20 20 20 69 36 34 20 69 56 61  ++){.    i64 iVa
1d010 6c 3b 0a 20 20 20 20 46 74 73 35 44 6c 69 64 78  l;.    Fts5Dlidx
1d020 57 72 69 74 65 72 20 2a 70 44 6c 69 64 78 20 3d  Writer *pDlidx =
1d030 20 26 70 57 72 69 74 65 72 2d 3e 61 44 6c 69 64   &pWriter->aDlid
1d040 78 5b 69 5d 3b 0a 0a 20 20 20 20 69 66 28 20 70  x[i];..    if( p
1d050 44 6c 69 64 78 2d 3e 62 75 66 2e 6e 3e 3d 70 2d  Dlidx->buf.n>=p-
1d060 3e 70 43 6f 6e 66 69 67 2d 3e 70 67 73 7a 20 29  >pConfig->pgsz )
1d070 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63  {.      /* The c
1d080 75 72 72 65 6e 74 20 64 6f 63 6c 69 73 74 2d 69  urrent doclist-i
1d090 6e 64 65 78 20 70 61 67 65 20 69 73 20 66 75 6c  ndex page is ful
1d0a0 6c 2e 20 57 72 69 74 65 20 69 74 20 74 6f 20 64  l. Write it to d
1d0b0 69 73 6b 20 61 6e 64 20 70 75 73 68 0a 20 20 20  isk and push.   
1d0c0 20 20 20 2a 2a 20 61 20 63 6f 70 79 20 6f 66 20     ** a copy of 
1d0d0 69 52 6f 77 69 64 20 28 77 68 69 63 68 20 77 69  iRowid (which wi
1d0e0 6c 6c 20 62 65 63 6f 6d 65 20 74 68 65 20 66 69  ll become the fi
1d0f0 72 73 74 20 72 6f 77 69 64 20 6f 6e 20 74 68 65  rst rowid on the
1d100 20 6e 65 78 74 0a 20 20 20 20 20 20 2a 2a 20 64   next.      ** d
1d110 6f 63 6c 69 73 74 2d 69 6e 64 65 78 20 6c 65 61  oclist-index lea
1d120 66 20 70 61 67 65 29 20 75 70 20 69 6e 74 6f 20  f page) up into 
1d130 74 68 65 20 6e 65 78 74 20 6c 65 76 65 6c 20 6f  the next level o
1d140 66 20 74 68 65 20 62 2d 74 72 65 65 20 0a 20 20  f the b-tree .  
1d150 20 20 20 20 2a 2a 20 68 69 65 72 61 72 63 68 79      ** hierarchy
1d160 2e 20 49 66 20 74 68 65 20 6e 6f 64 65 20 62 65  . If the node be
1d170 69 6e 67 20 66 6c 75 73 68 65 64 20 69 73 20 63  ing flushed is c
1d180 75 72 72 65 6e 74 6c 79 20 74 68 65 20 72 6f 6f  urrently the roo
1d190 74 20 6e 6f 64 65 2c 0a 20 20 20 20 20 20 2a 2a  t node,.      **
1d1a0 20 61 6c 73 6f 20 70 75 73 68 20 69 74 73 20 66   also push its f
1d1b0 69 72 73 74 20 72 6f 77 69 64 20 75 70 77 61 72  irst rowid upwar
1d1c0 64 73 2e 20 2a 2f 0a 20 20 20 20 20 20 70 44 6c  ds. */.      pDl
1d1d0 69 64 78 2d 3e 62 75 66 2e 70 5b 30 5d 20 3d 20  idx->buf.p[0] = 
1d1e0 30 78 30 31 3b 20 20 20 20 2f 2a 20 4e 6f 74 20  0x01;    /* Not 
1d1f0 74 68 65 20 72 6f 6f 74 20 6e 6f 64 65 20 2a 2f  the root node */
1d200 0a 20 20 20 20 20 20 66 74 73 35 44 61 74 61 57  .      fts5DataW
1d210 72 69 74 65 28 70 2c 20 0a 20 20 20 20 20 20 20  rite(p, .       
1d220 20 20 20 46 54 53 35 5f 44 4c 49 44 58 5f 52 4f     FTS5_DLIDX_RO
1d230 57 49 44 28 70 57 72 69 74 65 72 2d 3e 69 53 65  WID(pWriter->iSe
1d240 67 69 64 2c 20 69 2c 20 70 44 6c 69 64 78 2d 3e  gid, i, pDlidx->
1d250 70 67 6e 6f 29 2c 0a 20 20 20 20 20 20 20 20 20  pgno),.         
1d260 20 70 44 6c 69 64 78 2d 3e 62 75 66 2e 70 2c 20   pDlidx->buf.p, 
1d270 70 44 6c 69 64 78 2d 3e 62 75 66 2e 6e 0a 20 20  pDlidx->buf.n.  
1d280 20 20 20 20 29 3b 0a 20 20 20 20 20 20 66 74 73      );.      fts
1d290 35 57 72 69 74 65 44 6c 69 64 78 47 72 6f 77 28  5WriteDlidxGrow(
1d2a0 70 2c 20 70 57 72 69 74 65 72 2c 20 69 2b 32 29  p, pWriter, i+2)
1d2b0 3b 0a 20 20 20 20 20 20 70 44 6c 69 64 78 20 3d  ;.      pDlidx =
1d2c0 20 26 70 57 72 69 74 65 72 2d 3e 61 44 6c 69 64   &pWriter->aDlid
1d2d0 78 5b 69 5d 3b 0a 20 20 20 20 20 20 69 66 28 20  x[i];.      if( 
1d2e0 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
1d2f0 20 26 26 20 70 44 6c 69 64 78 5b 31 5d 2e 62 75   && pDlidx[1].bu
1d300 66 2e 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  f.n==0 ){.      
1d310 20 20 69 36 34 20 69 46 69 72 73 74 20 3d 20 66    i64 iFirst = f
1d320 74 73 35 44 6c 69 64 78 45 78 74 72 61 63 74 46  ts5DlidxExtractF
1d330 69 72 73 74 52 6f 77 69 64 28 26 70 44 6c 69 64  irstRowid(&pDlid
1d340 78 2d 3e 62 75 66 29 3b 0a 0a 20 20 20 20 20 20  x->buf);..      
1d350 20 20 2f 2a 20 54 68 69 73 20 77 61 73 20 74 68    /* This was th
1d360 65 20 72 6f 6f 74 20 6e 6f 64 65 2e 20 50 75 73  e root node. Pus
1d370 68 20 69 74 73 20 66 69 72 73 74 20 72 6f 77 69  h its first rowi
1d380 64 20 75 70 20 74 6f 20 74 68 65 20 6e 65 77 20  d up to the new 
1d390 72 6f 6f 74 2e 20 2a 2f 0a 20 20 20 20 20 20 20  root. */.       
1d3a0 20 70 44 6c 69 64 78 5b 31 5d 2e 70 67 6e 6f 20   pDlidx[1].pgno 
1d3b0 3d 20 70 44 6c 69 64 78 2d 3e 70 67 6e 6f 3b 0a  = pDlidx->pgno;.
1d3c0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 46          sqlite3F
1d3d0 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 56  ts5BufferAppendV
1d3e0 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26 70  arint(&p->rc, &p
1d3f0 44 6c 69 64 78 5b 31 5d 2e 62 75 66 2c 20 30 29  Dlidx[1].buf, 0)
1d400 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
1d410 33 46 74 73 35 42 75 66 66 65 72 41 70 70 65 6e  3Fts5BufferAppen
1d420 64 56 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20  dVarint(&p->rc, 
1d430 26 70 44 6c 69 64 78 5b 31 5d 2e 62 75 66 2c 20  &pDlidx[1].buf, 
1d440 70 44 6c 69 64 78 2d 3e 70 67 6e 6f 29 3b 0a 20  pDlidx->pgno);. 
1d450 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 46 74         sqlite3Ft
1d460 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 56 61  s5BufferAppendVa
1d470 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26 70 44  rint(&p->rc, &pD
1d480 6c 69 64 78 5b 31 5d 2e 62 75 66 2c 20 69 46 69  lidx[1].buf, iFi
1d490 72 73 74 29 3b 0a 20 20 20 20 20 20 20 20 70 44  rst);.        pD
1d4a0 6c 69 64 78 5b 31 5d 2e 62 50 72 65 76 56 61 6c  lidx[1].bPrevVal
1d4b0 69 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  id = 1;.        
1d4c0 70 44 6c 69 64 78 5b 31 5d 2e 69 50 72 65 76 20  pDlidx[1].iPrev 
1d4d0 3d 20 69 46 69 72 73 74 3b 0a 20 20 20 20 20 20  = iFirst;.      
1d4e0 7d 0a 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  }..      sqlite3
1d4f0 46 74 73 35 42 75 66 66 65 72 5a 65 72 6f 28 26  Fts5BufferZero(&
1d500 70 44 6c 69 64 78 2d 3e 62 75 66 29 3b 0a 20 20  pDlidx->buf);.  
1d510 20 20 20 20 70 44 6c 69 64 78 2d 3e 62 50 72 65      pDlidx->bPre
1d520 76 56 61 6c 69 64 20 3d 20 30 3b 0a 20 20 20 20  vValid = 0;.    
1d530 20 20 70 44 6c 69 64 78 2d 3e 70 67 6e 6f 2b 2b    pDlidx->pgno++
1d540 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
1d550 20 20 20 62 44 6f 6e 65 20 3d 20 31 3b 0a 20 20     bDone = 1;.  
1d560 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 70 44 6c    }..    if( pDl
1d570 69 64 78 2d 3e 62 50 72 65 76 56 61 6c 69 64 20  idx->bPrevValid 
1d580 29 7b 0a 20 20 20 20 20 20 69 56 61 6c 20 3d 20  ){.      iVal = 
1d590 69 52 6f 77 69 64 20 2d 20 70 44 6c 69 64 78 2d  iRowid - pDlidx-
1d5a0 3e 69 50 72 65 76 3b 0a 20 20 20 20 7d 65 6c 73  >iPrev;.    }els
1d5b0 65 7b 0a 20 20 20 20 20 20 69 36 34 20 69 50 67  e{.      i64 iPg
1d5c0 6e 6f 20 3d 20 28 69 3d 3d 30 20 3f 20 70 57 72  no = (i==0 ? pWr
1d5d0 69 74 65 72 2d 3e 77 72 69 74 65 72 2e 70 67 6e  iter->writer.pgn
1d5e0 6f 20 3a 20 70 44 6c 69 64 78 5b 2d 31 5d 2e 70  o : pDlidx[-1].p
1d5f0 67 6e 6f 29 3b 0a 20 20 20 20 20 20 61 73 73 65  gno);.      asse
1d600 72 74 28 20 70 44 6c 69 64 78 2d 3e 62 75 66 2e  rt( pDlidx->buf.
1d610 6e 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 71  n==0 );.      sq
1d620 6c 69 74 65 33 46 74 73 35 42 75 66 66 65 72 41  lite3Fts5BufferA
1d630 70 70 65 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e  ppendVarint(&p->
1d640 72 63 2c 20 26 70 44 6c 69 64 78 2d 3e 62 75 66  rc, &pDlidx->buf
1d650 2c 20 21 62 44 6f 6e 65 29 3b 0a 20 20 20 20 20  , !bDone);.     
1d660 20 73 71 6c 69 74 65 33 46 74 73 35 42 75 66 66   sqlite3Fts5Buff
1d670 65 72 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26  erAppendVarint(&
1d680 70 2d 3e 72 63 2c 20 26 70 44 6c 69 64 78 2d 3e  p->rc, &pDlidx->
1d690 62 75 66 2c 20 69 50 67 6e 6f 29 3b 0a 20 20 20  buf, iPgno);.   
1d6a0 20 20 20 69 56 61 6c 20 3d 20 69 52 6f 77 69 64     iVal = iRowid
1d6b0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 73 71 6c  ;.    }..    sql
1d6c0 69 74 65 33 46 74 73 35 42 75 66 66 65 72 41 70  ite3Fts5BufferAp
1d6d0 70 65 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e 72  pendVarint(&p->r
1d6e0 63 2c 20 26 70 44 6c 69 64 78 2d 3e 62 75 66 2c  c, &pDlidx->buf,
1d6f0 20 69 56 61 6c 29 3b 0a 20 20 20 20 70 44 6c 69   iVal);.    pDli
1d700 64 78 2d 3e 62 50 72 65 76 56 61 6c 69 64 20 3d  dx->bPrevValid =
1d710 20 31 3b 0a 20 20 20 20 70 44 6c 69 64 78 2d 3e   1;.    pDlidx->
1d720 69 50 72 65 76 20 3d 20 69 52 6f 77 69 64 3b 0a  iPrev = iRowid;.
1d730 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f    }.}..static vo
1d740 69 64 20 66 74 73 35 57 72 69 74 65 46 6c 75 73  id fts5WriteFlus
1d750 68 4c 65 61 66 28 46 74 73 35 49 6e 64 65 78 20  hLeaf(Fts5Index 
1d760 2a 70 2c 20 46 74 73 35 53 65 67 57 72 69 74 65  *p, Fts5SegWrite
1d770 72 20 2a 70 57 72 69 74 65 72 29 7b 0a 20 20 73  r *pWriter){.  s
1d780 74 61 74 69 63 20 63 6f 6e 73 74 20 75 38 20 7a  tatic const u8 z
1d790 65 72 6f 5b 5d 20 3d 20 7b 20 30 78 30 30 2c 20  ero[] = { 0x00, 
1d7a0 30 78 30 30 2c 20 30 78 30 30 2c 20 30 78 30 30  0x00, 0x00, 0x00
1d7b0 20 7d 3b 0a 20 20 46 74 73 35 50 61 67 65 57 72   };.  Fts5PageWr
1d7c0 69 74 65 72 20 2a 70 50 61 67 65 20 3d 20 26 70  iter *pPage = &p
1d7d0 57 72 69 74 65 72 2d 3e 77 72 69 74 65 72 3b 0a  Writer->writer;.
1d7e0 20 20 69 36 34 20 69 52 6f 77 69 64 3b 0a 0a 20    i64 iRowid;.. 
1d7f0 20 61 73 73 65 72 74 28 20 28 70 50 61 67 65 2d   assert( (pPage-
1d800 3e 70 67 69 64 78 2e 6e 3d 3d 30 29 3d 3d 28 70  >pgidx.n==0)==(p
1d810 57 72 69 74 65 72 2d 3e 62 46 69 72 73 74 54 65  Writer->bFirstTe
1d820 72 6d 49 6e 50 61 67 65 29 20 29 3b 0a 0a 20 20  rmInPage) );..  
1d830 2f 2a 20 53 65 74 20 74 68 65 20 73 7a 4c 65 61  /* Set the szLea
1d840 66 20 68 65 61 64 65 72 20 66 69 65 6c 64 2e 20  f header field. 
1d850 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 30 3d 3d  */.  assert( 0==
1d860 66 74 73 35 47 65 74 55 31 36 28 26 70 50 61 67  fts5GetU16(&pPag
1d870 65 2d 3e 62 75 66 2e 70 5b 32 5d 29 20 29 3b 0a  e->buf.p[2]) );.
1d880 20 20 66 74 73 35 50 75 74 55 31 36 28 26 70 50    fts5PutU16(&pP
1d890 61 67 65 2d 3e 62 75 66 2e 70 5b 32 5d 2c 20 28  age->buf.p[2], (
1d8a0 75 31 36 29 70 50 61 67 65 2d 3e 62 75 66 2e 6e  u16)pPage->buf.n
1d8b0 29 3b 0a 0a 20 20 69 66 28 20 70 57 72 69 74 65  );..  if( pWrite
1d8c0 72 2d 3e 62 46 69 72 73 74 54 65 72 6d 49 6e 50  r->bFirstTermInP
1d8d0 61 67 65 20 29 7b 0a 20 20 20 20 2f 2a 20 4e 6f  age ){.    /* No
1d8e0 20 74 65 72 6d 20 77 61 73 20 77 72 69 74 74 65   term was writte
1d8f0 6e 20 74 6f 20 74 68 69 73 20 70 61 67 65 2e 20  n to this page. 
1d900 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  */.    assert( p
1d910 50 61 67 65 2d 3e 70 67 69 64 78 2e 6e 3d 3d 30  Page->pgidx.n==0
1d920 20 29 3b 0a 20 20 20 20 66 74 73 35 57 72 69 74   );.    fts5Writ
1d930 65 42 74 72 65 65 4e 6f 54 65 72 6d 28 70 2c 20  eBtreeNoTerm(p, 
1d940 70 57 72 69 74 65 72 29 3b 0a 20 20 7d 65 6c 73  pWriter);.  }els
1d950 65 7b 0a 20 20 20 20 2f 2a 20 41 70 70 65 6e 64  e{.    /* Append
1d960 20 74 68 65 20 70 67 69 64 78 20 74 6f 20 74 68   the pgidx to th
1d970 65 20 70 61 67 65 20 62 75 66 66 65 72 2e 20 53  e page buffer. S
1d980 65 74 20 74 68 65 20 73 7a 4c 65 61 66 20 68 65  et the szLeaf he
1d990 61 64 65 72 20 66 69 65 6c 64 2e 20 2a 2f 0a 20  ader field. */. 
1d9a0 20 20 20 66 74 73 35 42 75 66 66 65 72 41 70 70     fts5BufferApp
1d9b0 65 6e 64 42 6c 6f 62 28 26 70 2d 3e 72 63 2c 20  endBlob(&p->rc, 
1d9c0 26 70 50 61 67 65 2d 3e 62 75 66 2c 20 70 50 61  &pPage->buf, pPa
1d9d0 67 65 2d 3e 70 67 69 64 78 2e 6e 2c 20 70 50 61  ge->pgidx.n, pPa
1d9e0 67 65 2d 3e 70 67 69 64 78 2e 70 29 3b 0a 20 20  ge->pgidx.p);.  
1d9f0 7d 0a 0a 20 20 2f 2a 20 57 72 69 74 65 20 74 68  }..  /* Write th
1da00 65 20 70 61 67 65 20 6f 75 74 20 74 6f 20 64 69  e page out to di
1da10 73 6b 20 2a 2f 0a 20 20 69 52 6f 77 69 64 20 3d  sk */.  iRowid =
1da20 20 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f 52 4f   FTS5_SEGMENT_RO
1da30 57 49 44 28 70 57 72 69 74 65 72 2d 3e 69 53 65  WID(pWriter->iSe
1da40 67 69 64 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f  gid, pPage->pgno
1da50 29 3b 0a 20 20 66 74 73 35 44 61 74 61 57 72 69  );.  fts5DataWri
1da60 74 65 28 70 2c 20 69 52 6f 77 69 64 2c 20 70 50  te(p, iRowid, pP
1da70 61 67 65 2d 3e 62 75 66 2e 70 2c 20 70 50 61 67  age->buf.p, pPag
1da80 65 2d 3e 62 75 66 2e 6e 29 3b 0a 0a 20 20 2f 2a  e->buf.n);..  /*
1da90 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20   Initialize the 
1daa0 6e 65 78 74 20 70 61 67 65 2e 20 2a 2f 0a 20 20  next page. */.  
1dab0 66 74 73 35 42 75 66 66 65 72 5a 65 72 6f 28 26  fts5BufferZero(&
1dac0 70 50 61 67 65 2d 3e 62 75 66 29 3b 0a 20 20 66  pPage->buf);.  f
1dad0 74 73 35 42 75 66 66 65 72 5a 65 72 6f 28 26 70  ts5BufferZero(&p
1dae0 50 61 67 65 2d 3e 70 67 69 64 78 29 3b 0a 20 20  Page->pgidx);.  
1daf0 66 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64  fts5BufferAppend
1db00 42 6c 6f 62 28 26 70 2d 3e 72 63 2c 20 26 70 50  Blob(&p->rc, &pP
1db10 61 67 65 2d 3e 62 75 66 2c 20 34 2c 20 7a 65 72  age->buf, 4, zer
1db20 6f 29 3b 0a 20 20 70 50 61 67 65 2d 3e 69 50 72  o);.  pPage->iPr
1db30 65 76 50 67 69 64 78 20 3d 20 30 3b 0a 20 20 70  evPgidx = 0;.  p
1db40 50 61 67 65 2d 3e 70 67 6e 6f 2b 2b 3b 0a 0a 20  Page->pgno++;.. 
1db50 20 2f 2a 20 49 6e 63 72 65 61 73 65 20 74 68 65   /* Increase the
1db60 20 6c 65 61 76 65 73 20 77 72 69 74 74 65 6e 20   leaves written 
1db70 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 70 57 72  counter */.  pWr
1db80 69 74 65 72 2d 3e 6e 4c 65 61 66 57 72 69 74 74  iter->nLeafWritt
1db90 65 6e 2b 2b 3b 0a 0a 20 20 2f 2a 20 54 68 65 20  en++;..  /* The 
1dba0 6e 65 77 20 6c 65 61 66 20 68 6f 6c 64 73 20 6e  new leaf holds n
1dbb0 6f 20 74 65 72 6d 73 20 6f 72 20 72 6f 77 69 64  o terms or rowid
1dbc0 73 20 2a 2f 0a 20 20 70 57 72 69 74 65 72 2d 3e  s */.  pWriter->
1dbd0 62 46 69 72 73 74 54 65 72 6d 49 6e 50 61 67 65  bFirstTermInPage
1dbe0 20 3d 20 31 3b 0a 20 20 70 57 72 69 74 65 72 2d   = 1;.  pWriter-
1dbf0 3e 62 46 69 72 73 74 52 6f 77 69 64 49 6e 50 61  >bFirstRowidInPa
1dc00 67 65 20 3d 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ge = 1;.}../*.**
1dc10 20 41 70 70 65 6e 64 20 74 65 72 6d 20 70 54 65   Append term pTe
1dc20 72 6d 2f 6e 54 65 72 6d 20 74 6f 20 74 68 65 20  rm/nTerm to the 
1dc30 73 65 67 6d 65 6e 74 20 62 65 69 6e 67 20 77 72  segment being wr
1dc40 69 74 74 65 6e 20 62 79 20 74 68 65 20 77 72 69  itten by the wri
1dc50 74 65 72 20 70 61 73 73 65 64 0a 2a 2a 20 61 73  ter passed.** as
1dc60 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
1dc70 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  ment..**.** If a
1dc80 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  n error occurs, 
1dc90 73 65 74 20 74 68 65 20 46 74 73 35 49 6e 64 65  set the Fts5Inde
1dca0 78 2e 72 63 20 65 72 72 6f 72 20 63 6f 64 65 2e  x.rc error code.
1dcb0 20 49 66 20 61 6e 20 65 72 72 6f 72 20 68 61 73   If an error has
1dcc0 20 0a 2a 2a 20 61 6c 72 65 61 64 79 20 6f 63 63   .** already occ
1dcd0 75 72 72 65 64 2c 20 74 68 69 73 20 66 75 6e 63  urred, this func
1dce0 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  tion is a no-op.
1dcf0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
1dd00 66 74 73 35 57 72 69 74 65 41 70 70 65 6e 64 54  fts5WriteAppendT
1dd10 65 72 6d 28 0a 20 20 46 74 73 35 49 6e 64 65 78  erm(.  Fts5Index
1dd20 20 2a 70 2c 20 0a 20 20 46 74 73 35 53 65 67 57   *p, .  Fts5SegW
1dd30 72 69 74 65 72 20 2a 70 57 72 69 74 65 72 2c 0a  riter *pWriter,.
1dd40 20 20 69 6e 74 20 6e 54 65 72 6d 2c 20 63 6f 6e    int nTerm, con
1dd50 73 74 20 75 38 20 2a 70 54 65 72 6d 20 0a 29 7b  st u8 *pTerm .){
1dd60 0a 20 20 69 6e 74 20 6e 50 72 65 66 69 78 3b 20  .  int nPrefix; 
1dd70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dd80 20 20 20 2f 2a 20 42 79 74 65 73 20 6f 66 20 70     /* Bytes of p
1dd90 72 65 66 69 78 20 63 6f 6d 70 72 65 73 73 69 6f  refix compressio
1dda0 6e 20 66 6f 72 20 74 65 72 6d 20 2a 2f 0a 20 20  n for term */.  
1ddb0 46 74 73 35 50 61 67 65 57 72 69 74 65 72 20 2a  Fts5PageWriter *
1ddc0 70 50 61 67 65 20 3d 20 26 70 57 72 69 74 65 72  pPage = &pWriter
1ddd0 2d 3e 77 72 69 74 65 72 3b 0a 20 20 46 74 73 35  ->writer;.  Fts5
1dde0 42 75 66 66 65 72 20 2a 70 50 67 69 64 78 20 3d  Buffer *pPgidx =
1ddf0 20 26 70 57 72 69 74 65 72 2d 3e 77 72 69 74 65   &pWriter->write
1de00 72 2e 70 67 69 64 78 3b 0a 20 20 69 6e 74 20 6e  r.pgidx;.  int n
1de10 4d 69 6e 20 3d 20 4d 49 4e 28 70 50 61 67 65 2d  Min = MIN(pPage-
1de20 3e 74 65 72 6d 2e 6e 2c 20 6e 54 65 72 6d 29 3b  >term.n, nTerm);
1de30 0a 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72  ..  assert( p->r
1de40 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  c==SQLITE_OK );.
1de50 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
1de60 3e 62 75 66 2e 6e 3e 3d 34 20 29 3b 0a 20 20 61  >buf.n>=4 );.  a
1de70 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 62 75  ssert( pPage->bu
1de80 66 2e 6e 3e 34 20 7c 7c 20 70 57 72 69 74 65 72  f.n>4 || pWriter
1de90 2d 3e 62 46 69 72 73 74 54 65 72 6d 49 6e 50 61  ->bFirstTermInPa
1dea0 67 65 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  ge );..  /* If t
1deb0 68 65 20 63 75 72 72 65 6e 74 20 6c 65 61 66 20  he current leaf 
1dec0 70 61 67 65 20 69 73 20 66 75 6c 6c 2c 20 66 6c  page is full, fl
1ded0 75 73 68 20 69 74 20 74 6f 20 64 69 73 6b 2e 20  ush it to disk. 
1dee0 2a 2f 0a 20 20 69 66 28 20 28 70 50 61 67 65 2d  */.  if( (pPage-
1def0 3e 62 75 66 2e 6e 20 2b 20 70 50 67 69 64 78 2d  >buf.n + pPgidx-
1df00 3e 6e 20 2b 20 6e 54 65 72 6d 20 2b 20 32 29 3e  >n + nTerm + 2)>
1df10 3d 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e 70 67 73  =p->pConfig->pgs
1df20 7a 20 29 7b 0a 20 20 20 20 69 66 28 20 70 50 61  z ){.    if( pPa
1df30 67 65 2d 3e 62 75 66 2e 6e 3e 34 20 29 7b 0a 20  ge->buf.n>4 ){. 
1df40 20 20 20 20 20 66 74 73 35 57 72 69 74 65 46 6c       fts5WriteFl
1df50 75 73 68 4c 65 61 66 28 70 2c 20 70 57 72 69 74  ushLeaf(p, pWrit
1df60 65 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  er);.      if( p
1df70 2d 3e 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc!=SQLITE_OK 
1df80 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a  ) return;.    }.
1df90 20 20 20 20 66 74 73 35 42 75 66 66 65 72 47 72      fts5BufferGr
1dfa0 6f 77 28 26 70 2d 3e 72 63 2c 20 26 70 50 61 67  ow(&p->rc, &pPag
1dfb0 65 2d 3e 62 75 66 2c 20 6e 54 65 72 6d 2b 46 54  e->buf, nTerm+FT
1dfc0 53 35 5f 44 41 54 41 5f 50 41 44 44 49 4e 47 29  S5_DATA_PADDING)
1dfd0 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 54 4f  ;.  }.  .  /* TO
1dfe0 44 4f 31 3a 20 55 70 64 61 74 69 6e 67 20 70 67  DO1: Updating pg
1dff0 69 64 78 20 68 65 72 65 2e 20 2a 2f 0a 20 20 70  idx here. */.  p
1e000 50 67 69 64 78 2d 3e 6e 20 2b 3d 20 73 71 6c 69  Pgidx->n += sqli
1e010 74 65 33 46 74 73 35 50 75 74 56 61 72 69 6e 74  te3Fts5PutVarint
1e020 28 0a 20 20 20 20 20 20 26 70 50 67 69 64 78 2d  (.      &pPgidx-
1e030 3e 70 5b 70 50 67 69 64 78 2d 3e 6e 5d 2c 20 70  >p[pPgidx->n], p
1e040 50 61 67 65 2d 3e 62 75 66 2e 6e 20 2d 20 70 50  Page->buf.n - pP
1e050 61 67 65 2d 3e 69 50 72 65 76 50 67 69 64 78 0a  age->iPrevPgidx.
1e060 20 20 29 3b 0a 20 20 70 50 61 67 65 2d 3e 69 50    );.  pPage->iP
1e070 72 65 76 50 67 69 64 78 20 3d 20 70 50 61 67 65  revPgidx = pPage
1e080 2d 3e 62 75 66 2e 6e 3b 0a 23 69 66 20 30 0a 20  ->buf.n;.#if 0. 
1e090 20 66 74 73 35 50 75 74 55 31 36 28 26 70 50 67   fts5PutU16(&pPg
1e0a0 69 64 78 2d 3e 70 5b 70 50 67 69 64 78 2d 3e 6e  idx->p[pPgidx->n
1e0b0 5d 2c 20 70 50 61 67 65 2d 3e 62 75 66 2e 6e 29  ], pPage->buf.n)
1e0c0 3b 0a 20 20 70 50 67 69 64 78 2d 3e 6e 20 2b 3d  ;.  pPgidx->n +=
1e0d0 20 32 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66   2;.#endif..  if
1e0e0 28 20 70 57 72 69 74 65 72 2d 3e 62 46 69 72 73  ( pWriter->bFirs
1e0f0 74 54 65 72 6d 49 6e 50 61 67 65 20 29 7b 0a 20  tTermInPage ){. 
1e100 20 20 20 6e 50 72 65 66 69 78 20 3d 20 30 3b 0a     nPrefix = 0;.
1e110 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 70      if( pPage->p
1e120 67 6e 6f 21 3d 31 20 29 7b 0a 20 20 20 20 20 20  gno!=1 ){.      
1e130 2f 2a 20 54 68 69 73 20 69 73 20 74 68 65 20 66  /* This is the f
1e140 69 72 73 74 20 74 65 72 6d 20 6f 6e 20 61 20 6c  irst term on a l
1e150 65 61 66 20 74 68 61 74 20 69 73 20 6e 6f 74 20  eaf that is not 
1e160 74 68 65 20 6c 65 66 74 6d 6f 73 74 20 6c 65 61  the leftmost lea
1e170 66 20 69 6e 0a 20 20 20 20 20 20 2a 2a 20 74 68  f in.      ** th
1e180 65 20 73 65 67 6d 65 6e 74 20 62 2d 74 72 65 65  e segment b-tree
1e190 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 69  . In this case i
1e1a0 74 20 69 73 20 6e 65 63 65 73 73 61 72 79 20 74  t is necessary t
1e1b0 6f 20 61 64 64 20 61 20 74 65 72 6d 20 74 6f 0a  o add a term to.
1e1c0 20 20 20 20 20 20 2a 2a 20 74 68 65 20 62 2d 74        ** the b-t
1e1d0 72 65 65 20 68 69 65 72 61 72 63 68 79 20 74 68  ree hierarchy th
1e1e0 61 74 20 69 73 20 28 61 29 20 6c 61 72 67 65 72  at is (a) larger
1e1f0 20 74 68 61 6e 20 74 68 65 20 6c 61 72 67 65 73   than the larges
1e200 74 20 74 65 72 6d 20 0a 20 20 20 20 20 20 2a 2a  t term .      **
1e210 20 61 6c 72 65 61 64 79 20 77 72 69 74 74 65 6e   already written
1e220 20 74 6f 20 74 68 65 20 73 65 67 6d 65 6e 74 20   to the segment 
1e230 61 6e 64 20 28 62 29 20 73 6d 61 6c 6c 65 72 20  and (b) smaller 
1e240 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f  than or equal to
1e250 0a 20 20 20 20 20 20 2a 2a 20 74 68 69 73 20 74  .      ** this t
1e260 65 72 6d 2e 20 49 6e 20 6f 74 68 65 72 20 77 6f  erm. In other wo
1e270 72 64 73 2c 20 61 20 70 72 65 66 69 78 20 6f 66  rds, a prefix of
1e280 20 28 70 54 65 72 6d 2f 6e 54 65 72 6d 29 20 74   (pTerm/nTerm) t
1e290 68 61 74 20 69 73 20 6f 6e 65 0a 20 20 20 20 20  hat is one.     
1e2a0 20 2a 2a 20 62 79 74 65 20 6c 6f 6e 67 65 72 20   ** byte longer 
1e2b0 74 68 61 6e 20 74 68 65 20 6c 6f 6e 67 65 73 74  than the longest
1e2c0 20 70 72 65 66 69 78 20 28 70 54 65 72 6d 2f 6e   prefix (pTerm/n
1e2d0 54 65 72 6d 29 20 73 68 61 72 65 73 20 77 69 74  Term) shares wit
1e2e0 68 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 70  h the.      ** p
1e2f0 72 65 76 69 6f 75 73 20 74 65 72 6d 2e 20 0a 20  revious term. . 
1e300 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
1e310 20 55 73 75 61 6c 6c 79 2c 20 74 68 65 20 70 72   Usually, the pr
1e320 65 76 69 6f 75 73 20 74 65 72 6d 20 69 73 20 61  evious term is a
1e330 76 61 69 6c 61 62 6c 65 20 69 6e 20 70 50 61 67  vailable in pPag
1e340 65 2d 3e 74 65 72 6d 2e 20 54 68 65 20 65 78 63  e->term. The exc
1e350 65 70 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20  eption.      ** 
1e360 69 73 20 69 66 20 74 68 69 73 20 69 73 20 74 68  is if this is th
1e370 65 20 66 69 72 73 74 20 74 65 72 6d 20 77 72 69  e first term wri
1e380 74 74 65 6e 20 69 6e 20 61 6e 20 69 6e 63 72 65  tten in an incre
1e390 6d 65 6e 74 61 6c 2d 6d 65 72 67 65 20 73 74 65  mental-merge ste
1e3a0 70 2e 0a 20 20 20 20 20 20 2a 2a 20 49 6e 20 74  p..      ** In t
1e3b0 68 69 73 20 63 61 73 65 20 74 68 65 20 70 72 65  his case the pre
1e3c0 76 69 6f 75 73 20 74 65 72 6d 20 69 73 20 6e 6f  vious term is no
1e3d0 74 20 61 76 61 69 6c 61 62 6c 65 2c 20 73 6f 20  t available, so 
1e3e0 6a 75 73 74 20 77 72 69 74 65 20 61 0a 20 20 20  just write a.   
1e3f0 20 20 20 2a 2a 20 63 6f 70 79 20 6f 66 20 28 70     ** copy of (p
1e400 54 65 72 6d 2f 6e 54 65 72 6d 29 20 69 6e 74 6f  Term/nTerm) into
1e410 20 74 68 65 20 70 61 72 65 6e 74 20 6e 6f 64 65   the parent node
1e420 2e 20 54 68 69 73 20 69 73 20 73 6c 69 67 68 74  . This is slight
1e430 6c 79 0a 20 20 20 20 20 20 2a 2a 20 69 6e 65 66  ly.      ** inef
1e440 66 69 63 69 65 6e 74 2c 20 62 75 74 20 73 74 69  ficient, but sti
1e450 6c 6c 20 63 6f 72 72 65 63 74 2e 20 20 2a 2f 0a  ll correct.  */.
1e460 20 20 20 20 20 20 69 6e 74 20 6e 20 3d 20 6e 54        int n = nT
1e470 65 72 6d 3b 0a 20 20 20 20 20 20 69 66 28 20 70  erm;.      if( p
1e480 50 61 67 65 2d 3e 74 65 72 6d 2e 6e 20 29 7b 0a  Page->term.n ){.
1e490 20 20 20 20 20 20 20 20 6e 20 3d 20 31 20 2b 20          n = 1 + 
1e4a0 66 74 73 35 50 72 65 66 69 78 43 6f 6d 70 72 65  fts5PrefixCompre
1e4b0 73 73 28 6e 4d 69 6e 2c 20 70 50 61 67 65 2d 3e  ss(nMin, pPage->
1e4c0 74 65 72 6d 2e 70 2c 20 70 54 65 72 6d 29 3b 0a  term.p, pTerm);.
1e4d0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 74        }.      ft
1e4e0 73 35 57 72 69 74 65 42 74 72 65 65 54 65 72 6d  s5WriteBtreeTerm
1e4f0 28 70 2c 20 70 57 72 69 74 65 72 2c 20 6e 2c 20  (p, pWriter, n, 
1e500 70 54 65 72 6d 29 3b 0a 20 20 20 20 20 20 69 66  pTerm);.      if
1e510 28 20 70 2d 3e 72 63 21 3d 53 51 4c 49 54 45 5f  ( p->rc!=SQLITE_
1e520 4f 4b 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20  OK ) return;.   
1e530 20 20 20 70 50 61 67 65 20 3d 20 26 70 57 72 69     pPage = &pWri
1e540 74 65 72 2d 3e 77 72 69 74 65 72 3b 0a 20 20 20  ter->writer;.   
1e550 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20   }.  }else{.    
1e560 6e 50 72 65 66 69 78 20 3d 20 66 74 73 35 50 72  nPrefix = fts5Pr
1e570 65 66 69 78 43 6f 6d 70 72 65 73 73 28 6e 4d 69  efixCompress(nMi
1e580 6e 2c 20 70 50 61 67 65 2d 3e 74 65 72 6d 2e 70  n, pPage->term.p
1e590 2c 20 70 54 65 72 6d 29 3b 0a 20 20 20 20 66 74  , pTerm);.    ft
1e5a0 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 56 61  s5BufferAppendVa
1e5b0 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26 70 50  rint(&p->rc, &pP
1e5c0 61 67 65 2d 3e 62 75 66 2c 20 6e 50 72 65 66 69  age->buf, nPrefi
1e5d0 78 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 70  x);.  }..  /* Ap
1e5e0 70 65 6e 64 20 74 68 65 20 6e 75 6d 62 65 72 20  pend the number 
1e5f0 6f 66 20 62 79 74 65 73 20 6f 66 20 6e 65 77 20  of bytes of new 
1e600 64 61 74 61 2c 20 74 68 65 6e 20 74 68 65 20 74  data, then the t
1e610 65 72 6d 20 64 61 74 61 20 69 74 73 65 6c 66 0a  erm data itself.
1e620 20 20 2a 2a 20 74 6f 20 74 68 65 20 70 61 67 65    ** to the page
1e630 2e 20 2a 2f 0a 20 20 66 74 73 35 42 75 66 66 65  . */.  fts5Buffe
1e640 72 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26 70  rAppendVarint(&p
1e650 2d 3e 72 63 2c 20 26 70 50 61 67 65 2d 3e 62 75  ->rc, &pPage->bu
1e660 66 2c 20 6e 54 65 72 6d 20 2d 20 6e 50 72 65 66  f, nTerm - nPref
1e670 69 78 29 3b 0a 20 20 66 74 73 35 42 75 66 66 65  ix);.  fts5Buffe
1e680 72 41 70 70 65 6e 64 42 6c 6f 62 28 26 70 2d 3e  rAppendBlob(&p->
1e690 72 63 2c 20 26 70 50 61 67 65 2d 3e 62 75 66 2c  rc, &pPage->buf,
1e6a0 20 6e 54 65 72 6d 20 2d 20 6e 50 72 65 66 69 78   nTerm - nPrefix
1e6b0 2c 20 26 70 54 65 72 6d 5b 6e 50 72 65 66 69 78  , &pTerm[nPrefix
1e6c0 5d 29 3b 0a 0a 20 20 2f 2a 20 55 70 64 61 74 65  ]);..  /* Update
1e6d0 20 74 68 65 20 46 74 73 35 50 61 67 65 57 72 69   the Fts5PageWri
1e6e0 74 65 72 2e 74 65 72 6d 20 66 69 65 6c 64 2e 20  ter.term field. 
1e6f0 2a 2f 0a 20 20 66 74 73 35 42 75 66 66 65 72 53  */.  fts5BufferS
1e700 65 74 28 26 70 2d 3e 72 63 2c 20 26 70 50 61 67  et(&p->rc, &pPag
1e710 65 2d 3e 74 65 72 6d 2c 20 6e 54 65 72 6d 2c 20  e->term, nTerm, 
1e720 70 54 65 72 6d 29 3b 0a 20 20 70 57 72 69 74 65  pTerm);.  pWrite
1e730 72 2d 3e 62 46 69 72 73 74 54 65 72 6d 49 6e 50  r->bFirstTermInP
1e740 61 67 65 20 3d 20 30 3b 0a 0a 20 20 70 57 72 69  age = 0;..  pWri
1e750 74 65 72 2d 3e 62 46 69 72 73 74 52 6f 77 69 64  ter->bFirstRowid
1e760 49 6e 50 61 67 65 20 3d 20 30 3b 0a 20 20 70 57  InPage = 0;.  pW
1e770 72 69 74 65 72 2d 3e 62 46 69 72 73 74 52 6f 77  riter->bFirstRow
1e780 69 64 49 6e 44 6f 63 6c 69 73 74 20 3d 20 31 3b  idInDoclist = 1;
1e790 0a 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72  ..  assert( p->r
1e7a0 63 20 7c 7c 20 28 70 57 72 69 74 65 72 2d 3e 6e  c || (pWriter->n
1e7b0 44 6c 69 64 78 3e 30 20 26 26 20 70 57 72 69 74  Dlidx>0 && pWrit
1e7c0 65 72 2d 3e 61 44 6c 69 64 78 5b 30 5d 2e 62 75  er->aDlidx[0].bu
1e7d0 66 2e 6e 3d 3d 30 29 20 29 3b 0a 20 20 70 57 72  f.n==0) );.  pWr
1e7e0 69 74 65 72 2d 3e 61 44 6c 69 64 78 5b 30 5d 2e  iter->aDlidx[0].
1e7f0 70 67 6e 6f 20 3d 20 70 50 61 67 65 2d 3e 70 67  pgno = pPage->pg
1e800 6e 6f 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 70 70  no;.}../*.** App
1e810 65 6e 64 20 61 20 72 6f 77 69 64 20 61 6e 64 20  end a rowid and 
1e820 70 6f 73 69 74 69 6f 6e 2d 6c 69 73 74 20 73 69  position-list si
1e830 7a 65 20 66 69 65 6c 64 20 74 6f 20 74 68 65 20  ze field to the 
1e840 77 72 69 74 65 72 73 20 6f 75 74 70 75 74 2e 20  writers output. 
1e850 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
1e860 66 74 73 35 57 72 69 74 65 41 70 70 65 6e 64 52  fts5WriteAppendR
1e870 6f 77 69 64 28 0a 20 20 46 74 73 35 49 6e 64 65  owid(.  Fts5Inde
1e880 78 20 2a 70 2c 20 0a 20 20 46 74 73 35 53 65 67  x *p, .  Fts5Seg
1e890 57 72 69 74 65 72 20 2a 70 57 72 69 74 65 72 2c  Writer *pWriter,
1e8a0 0a 20 20 69 36 34 20 69 52 6f 77 69 64 0a 29 7b  .  i64 iRowid.){
1e8b0 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51  .  if( p->rc==SQ
1e8c0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 46  LITE_OK ){.    F
1e8d0 74 73 35 50 61 67 65 57 72 69 74 65 72 20 2a 70  ts5PageWriter *p
1e8e0 50 61 67 65 20 3d 20 26 70 57 72 69 74 65 72 2d  Page = &pWriter-
1e8f0 3e 77 72 69 74 65 72 3b 0a 0a 20 20 20 20 69 66  >writer;..    if
1e900 28 20 28 70 50 61 67 65 2d 3e 62 75 66 2e 6e 20  ( (pPage->buf.n 
1e910 2b 20 70 50 61 67 65 2d 3e 70 67 69 64 78 2e 6e  + pPage->pgidx.n
1e920 29 3e 3d 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e 70  )>=p->pConfig->p
1e930 67 73 7a 20 29 7b 0a 20 20 20 20 20 20 66 74 73  gsz ){.      fts
1e940 35 57 72 69 74 65 46 6c 75 73 68 4c 65 61 66 28  5WriteFlushLeaf(
1e950 70 2c 20 70 57 72 69 74 65 72 29 3b 0a 20 20 20  p, pWriter);.   
1e960 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68   }..    /* If th
1e970 69 73 20 69 73 20 74 6f 20 62 65 20 74 68 65 20  is is to be the 
1e980 66 69 72 73 74 20 72 6f 77 69 64 20 77 72 69 74  first rowid writ
1e990 74 65 6e 20 74 6f 20 74 68 65 20 70 61 67 65 2c  ten to the page,
1e9a0 20 73 65 74 20 74 68 65 20 0a 20 20 20 20 2a 2a   set the .    **
1e9b0 20 72 6f 77 69 64 2d 70 6f 69 6e 74 65 72 20 69   rowid-pointer i
1e9c0 6e 20 74 68 65 20 70 61 67 65 2d 68 65 61 64 65  n the page-heade
1e9d0 72 2e 20 41 6c 73 6f 20 61 70 70 65 6e 64 20 61  r. Also append a
1e9e0 20 76 61 6c 75 65 20 74 6f 20 74 68 65 20 64 6c   value to the dl
1e9f0 69 64 78 0a 20 20 20 20 2a 2a 20 62 75 66 66 65  idx.    ** buffe
1ea00 72 2c 20 69 6e 20 63 61 73 65 20 61 20 64 6f 63  r, in case a doc
1ea10 6c 69 73 74 2d 69 6e 64 65 78 20 69 73 20 72 65  list-index is re
1ea20 71 75 69 72 65 64 2e 20 20 2a 2f 0a 20 20 20 20  quired.  */.    
1ea30 69 66 28 20 70 57 72 69 74 65 72 2d 3e 62 46 69  if( pWriter->bFi
1ea40 72 73 74 52 6f 77 69 64 49 6e 50 61 67 65 20 29  rstRowidInPage )
1ea50 7b 0a 20 20 20 20 20 20 66 74 73 35 50 75 74 55  {.      fts5PutU
1ea60 31 36 28 70 50 61 67 65 2d 3e 62 75 66 2e 70 2c  16(pPage->buf.p,
1ea70 20 28 75 31 36 29 70 50 61 67 65 2d 3e 62 75 66   (u16)pPage->buf
1ea80 2e 6e 29 3b 0a 20 20 20 20 20 20 66 74 73 35 57  .n);.      fts5W
1ea90 72 69 74 65 44 6c 69 64 78 41 70 70 65 6e 64 28  riteDlidxAppend(
1eaa0 70 2c 20 70 57 72 69 74 65 72 2c 20 69 52 6f 77  p, pWriter, iRow
1eab0 69 64 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  id);.    }..    
1eac0 2f 2a 20 57 72 69 74 65 20 74 68 65 20 72 6f 77  /* Write the row
1ead0 69 64 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70  id. */.    if( p
1eae0 57 72 69 74 65 72 2d 3e 62 46 69 72 73 74 52 6f  Writer->bFirstRo
1eaf0 77 69 64 49 6e 44 6f 63 6c 69 73 74 20 7c 7c 20  widInDoclist || 
1eb00 70 57 72 69 74 65 72 2d 3e 62 46 69 72 73 74 52  pWriter->bFirstR
1eb10 6f 77 69 64 49 6e 50 61 67 65 20 29 7b 0a 20 20  owidInPage ){.  
1eb20 20 20 20 20 66 74 73 35 42 75 66 66 65 72 41 70      fts5BufferAp
1eb30 70 65 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e 72  pendVarint(&p->r
1eb40 63 2c 20 26 70 50 61 67 65 2d 3e 62 75 66 2c 20  c, &pPage->buf, 
1eb50 69 52 6f 77 69 64 29 3b 0a 20 20 20 20 7d 65 6c  iRowid);.    }el
1eb60 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  se{.      assert
1eb70 5f 6e 63 28 20 70 2d 3e 72 63 20 7c 7c 20 69 52  _nc( p->rc || iR
1eb80 6f 77 69 64 3e 70 57 72 69 74 65 72 2d 3e 69 50  owid>pWriter->iP
1eb90 72 65 76 52 6f 77 69 64 20 29 3b 0a 20 20 20 20  revRowid );.    
1eba0 20 20 66 74 73 35 42 75 66 66 65 72 41 70 70 65    fts5BufferAppe
1ebb0 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c  ndVarint(&p->rc,
1ebc0 20 26 70 50 61 67 65 2d 3e 62 75 66 2c 20 69 52   &pPage->buf, iR
1ebd0 6f 77 69 64 20 2d 20 70 57 72 69 74 65 72 2d 3e  owid - pWriter->
1ebe0 69 50 72 65 76 52 6f 77 69 64 29 3b 0a 20 20 20  iPrevRowid);.   
1ebf0 20 7d 0a 20 20 20 20 70 57 72 69 74 65 72 2d 3e   }.    pWriter->
1ec00 69 50 72 65 76 52 6f 77 69 64 20 3d 20 69 52 6f  iPrevRowid = iRo
1ec10 77 69 64 3b 0a 20 20 20 20 70 57 72 69 74 65 72  wid;.    pWriter
1ec20 2d 3e 62 46 69 72 73 74 52 6f 77 69 64 49 6e 44  ->bFirstRowidInD
1ec30 6f 63 6c 69 73 74 20 3d 20 30 3b 0a 20 20 20 20  oclist = 0;.    
1ec40 70 57 72 69 74 65 72 2d 3e 62 46 69 72 73 74 52  pWriter->bFirstR
1ec50 6f 77 69 64 49 6e 50 61 67 65 20 3d 20 30 3b 0a  owidInPage = 0;.
1ec60 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f    }.}..static vo
1ec70 69 64 20 66 74 73 35 57 72 69 74 65 41 70 70 65  id fts5WriteAppe
1ec80 6e 64 50 6f 73 6c 69 73 74 44 61 74 61 28 0a 20  ndPoslistData(. 
1ec90 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 0a   Fts5Index *p, .
1eca0 20 20 46 74 73 35 53 65 67 57 72 69 74 65 72 20    Fts5SegWriter 
1ecb0 2a 70 57 72 69 74 65 72 2c 20 0a 20 20 63 6f 6e  *pWriter, .  con
1ecc0 73 74 20 75 38 20 2a 61 44 61 74 61 2c 20 0a 20  st u8 *aData, . 
1ecd0 20 69 6e 74 20 6e 44 61 74 61 0a 29 7b 0a 20 20   int nData.){.  
1ece0 46 74 73 35 50 61 67 65 57 72 69 74 65 72 20 2a  Fts5PageWriter *
1ecf0 70 50 61 67 65 20 3d 20 26 70 57 72 69 74 65 72  pPage = &pWriter
1ed00 2d 3e 77 72 69 74 65 72 3b 0a 20 20 63 6f 6e 73  ->writer;.  cons
1ed10 74 20 75 38 20 2a 61 20 3d 20 61 44 61 74 61 3b  t u8 *a = aData;
1ed20 0a 20 20 69 6e 74 20 6e 20 3d 20 6e 44 61 74 61  .  int n = nData
1ed30 3b 0a 20 20 0a 20 20 61 73 73 65 72 74 28 20 70  ;.  .  assert( p
1ed40 2d 3e 70 43 6f 6e 66 69 67 2d 3e 70 67 73 7a 3e  ->pConfig->pgsz>
1ed50 30 20 29 3b 0a 20 20 77 68 69 6c 65 28 20 70 2d  0 );.  while( p-
1ed60 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 0a  >rc==SQLITE_OK .
1ed70 20 20 20 20 20 26 26 20 28 70 50 61 67 65 2d 3e       && (pPage->
1ed80 62 75 66 2e 6e 20 2b 20 70 50 61 67 65 2d 3e 70  buf.n + pPage->p
1ed90 67 69 64 78 2e 6e 20 2b 20 6e 29 3e 3d 70 2d 3e  gidx.n + n)>=p->
1eda0 70 43 6f 6e 66 69 67 2d 3e 70 67 73 7a 20 0a 20  pConfig->pgsz . 
1edb0 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 52 65 71   ){.    int nReq
1edc0 20 3d 20 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e 70   = p->pConfig->p
1edd0 67 73 7a 20 2d 20 70 50 61 67 65 2d 3e 62 75 66  gsz - pPage->buf
1ede0 2e 6e 20 2d 20 70 50 61 67 65 2d 3e 70 67 69 64  .n - pPage->pgid
1edf0 78 2e 6e 3b 0a 20 20 20 20 69 6e 74 20 6e 43 6f  x.n;.    int nCo
1ee00 70 79 20 3d 20 30 3b 0a 20 20 20 20 77 68 69 6c  py = 0;.    whil
1ee10 65 28 20 6e 43 6f 70 79 3c 6e 52 65 71 20 29 7b  e( nCopy<nReq ){
1ee20 0a 20 20 20 20 20 20 69 36 34 20 64 75 6d 6d 79  .      i64 dummy
1ee30 3b 0a 20 20 20 20 20 20 6e 43 6f 70 79 20 2b 3d  ;.      nCopy +=
1ee40 20 66 74 73 35 47 65 74 56 61 72 69 6e 74 28 26   fts5GetVarint(&
1ee50 61 5b 6e 43 6f 70 79 5d 2c 20 28 75 36 34 2a 29  a[nCopy], (u64*)
1ee60 26 64 75 6d 6d 79 29 3b 0a 20 20 20 20 7d 0a 20  &dummy);.    }. 
1ee70 20 20 20 66 74 73 35 42 75 66 66 65 72 41 70 70     fts5BufferApp
1ee80 65 6e 64 42 6c 6f 62 28 26 70 2d 3e 72 63 2c 20  endBlob(&p->rc, 
1ee90 26 70 50 61 67 65 2d 3e 62 75 66 2c 20 6e 43 6f  &pPage->buf, nCo
1eea0 70 79 2c 20 61 29 3b 0a 20 20 20 20 61 20 2b 3d  py, a);.    a +=
1eeb0 20 6e 43 6f 70 79 3b 0a 20 20 20 20 6e 20 2d 3d   nCopy;.    n -=
1eec0 20 6e 43 6f 70 79 3b 0a 20 20 20 20 66 74 73 35   nCopy;.    fts5
1eed0 57 72 69 74 65 46 6c 75 73 68 4c 65 61 66 28 70  WriteFlushLeaf(p
1eee0 2c 20 70 57 72 69 74 65 72 29 3b 0a 20 20 7d 0a  , pWriter);.  }.
1eef0 20 20 69 66 28 20 6e 3e 30 20 29 7b 0a 20 20 20    if( n>0 ){.   
1ef00 20 66 74 73 35 42 75 66 66 65 72 41 70 70 65 6e   fts5BufferAppen
1ef10 64 42 6c 6f 62 28 26 70 2d 3e 72 63 2c 20 26 70  dBlob(&p->rc, &p
1ef20 50 61 67 65 2d 3e 62 75 66 2c 20 6e 2c 20 61 29  Page->buf, n, a)
1ef30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46  ;.  }.}../*.** F
1ef40 6c 75 73 68 20 61 6e 79 20 64 61 74 61 20 63 61  lush any data ca
1ef50 63 68 65 64 20 62 79 20 74 68 65 20 77 72 69 74  ched by the writ
1ef60 65 72 20 6f 62 6a 65 63 74 20 74 6f 20 74 68 65  er object to the
1ef70 20 64 61 74 61 62 61 73 65 2e 20 46 72 65 65 20   database. Free 
1ef80 61 6e 79 0a 2a 2a 20 61 6c 6c 6f 63 61 74 69 6f  any.** allocatio
1ef90 6e 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  ns associated wi
1efa0 74 68 20 74 68 65 20 77 72 69 74 65 72 2e 0a 2a  th the writer..*
1efb0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  /.static void ft
1efc0 73 35 57 72 69 74 65 46 69 6e 69 73 68 28 0a 20  s5WriteFinish(. 
1efd0 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 0a   Fts5Index *p, .
1efe0 20 20 46 74 73 35 53 65 67 57 72 69 74 65 72 20    Fts5SegWriter 
1eff0 2a 70 57 72 69 74 65 72 2c 20 20 20 20 20 20 20  *pWriter,       
1f000 20 20 2f 2a 20 57 72 69 74 65 72 20 6f 62 6a 65    /* Writer obje
1f010 63 74 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 4c  ct */.  int *pnL
1f020 65 61 66 20 20 20 20 20 20 20 20 20 20 20 20 20  eaf             
1f030 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20          /* OUT: 
1f040 4e 75 6d 62 65 72 20 6f 66 20 6c 65 61 66 20 70  Number of leaf p
1f050 61 67 65 73 20 69 6e 20 62 2d 74 72 65 65 20 2a  ages in b-tree *
1f060 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  /.){.  int i;.  
1f070 46 74 73 35 50 61 67 65 57 72 69 74 65 72 20 2a  Fts5PageWriter *
1f080 70 4c 65 61 66 20 3d 20 26 70 57 72 69 74 65 72  pLeaf = &pWriter
1f090 2d 3e 77 72 69 74 65 72 3b 0a 20 20 69 66 28 20  ->writer;.  if( 
1f0a0 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
1f0b0 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
1f0c0 70 4c 65 61 66 2d 3e 70 67 6e 6f 3e 3d 31 20 29  pLeaf->pgno>=1 )
1f0d0 3b 0a 20 20 20 20 69 66 28 20 70 4c 65 61 66 2d  ;.    if( pLeaf-
1f0e0 3e 62 75 66 2e 6e 3e 34 20 29 7b 0a 20 20 20 20  >buf.n>4 ){.    
1f0f0 20 20 66 74 73 35 57 72 69 74 65 46 6c 75 73 68    fts5WriteFlush
1f100 4c 65 61 66 28 70 2c 20 70 57 72 69 74 65 72 29  Leaf(p, pWriter)
1f110 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2a 70 6e 4c  ;.    }.    *pnL
1f120 65 61 66 20 3d 20 70 4c 65 61 66 2d 3e 70 67 6e  eaf = pLeaf->pgn
1f130 6f 2d 31 3b 0a 20 20 20 20 69 66 28 20 70 4c 65  o-1;.    if( pLe
1f140 61 66 2d 3e 70 67 6e 6f 3e 31 20 29 7b 0a 20 20  af->pgno>1 ){.  
1f150 20 20 20 20 66 74 73 35 57 72 69 74 65 46 6c 75      fts5WriteFlu
1f160 73 68 42 74 72 65 65 28 70 2c 20 70 57 72 69 74  shBtree(p, pWrit
1f170 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  er);.    }.  }. 
1f180 20 66 74 73 35 42 75 66 66 65 72 46 72 65 65 28   fts5BufferFree(
1f190 26 70 4c 65 61 66 2d 3e 74 65 72 6d 29 3b 0a 20  &pLeaf->term);. 
1f1a0 20 66 74 73 35 42 75 66 66 65 72 46 72 65 65 28   fts5BufferFree(
1f1b0 26 70 4c 65 61 66 2d 3e 62 75 66 29 3b 0a 20 20  &pLeaf->buf);.  
1f1c0 66 74 73 35 42 75 66 66 65 72 46 72 65 65 28 26  fts5BufferFree(&
1f1d0 70 4c 65 61 66 2d 3e 70 67 69 64 78 29 3b 0a 20  pLeaf->pgidx);. 
1f1e0 20 66 74 73 35 42 75 66 66 65 72 46 72 65 65 28   fts5BufferFree(
1f1f0 26 70 57 72 69 74 65 72 2d 3e 62 74 74 65 72 6d  &pWriter->btterm
1f200 29 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  );..  for(i=0; i
1f210 3c 70 57 72 69 74 65 72 2d 3e 6e 44 6c 69 64 78  <pWriter->nDlidx
1f220 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69  ; i++){.    sqli
1f230 74 65 33 46 74 73 35 42 75 66 66 65 72 46 72 65  te3Fts5BufferFre
1f240 65 28 26 70 57 72 69 74 65 72 2d 3e 61 44 6c 69  e(&pWriter->aDli
1f250 64 78 5b 69 5d 2e 62 75 66 29 3b 0a 20 20 7d 0a  dx[i].buf);.  }.
1f260 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
1f270 57 72 69 74 65 72 2d 3e 61 44 6c 69 64 78 29 3b  Writer->aDlidx);
1f280 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .}..static void 
1f290 66 74 73 35 57 72 69 74 65 49 6e 69 74 28 0a 20  fts5WriteInit(. 
1f2a0 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 0a   Fts5Index *p, .
1f2b0 20 20 46 74 73 35 53 65 67 57 72 69 74 65 72 20    Fts5SegWriter 
1f2c0 2a 70 57 72 69 74 65 72 2c 20 0a 20 20 69 6e 74  *pWriter, .  int
1f2d0 20 69 53 65 67 69 64 0a 29 7b 0a 20 20 63 6f 6e   iSegid.){.  con
1f2e0 73 74 20 69 6e 74 20 6e 42 75 66 66 65 72 20 3d  st int nBuffer =
1f2f0 20 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e 70 67 73   p->pConfig->pgs
1f300 7a 20 2b 20 46 54 53 35 5f 44 41 54 41 5f 50 41  z + FTS5_DATA_PA
1f310 44 44 49 4e 47 3b 0a 0a 20 20 6d 65 6d 73 65 74  DDING;..  memset
1f320 28 70 57 72 69 74 65 72 2c 20 30 2c 20 73 69 7a  (pWriter, 0, siz
1f330 65 6f 66 28 46 74 73 35 53 65 67 57 72 69 74 65  eof(Fts5SegWrite
1f340 72 29 29 3b 0a 20 20 70 57 72 69 74 65 72 2d 3e  r));.  pWriter->
1f350 69 53 65 67 69 64 20 3d 20 69 53 65 67 69 64 3b  iSegid = iSegid;
1f360 0a 0a 20 20 66 74 73 35 57 72 69 74 65 44 6c 69  ..  fts5WriteDli
1f370 64 78 47 72 6f 77 28 70 2c 20 70 57 72 69 74 65  dxGrow(p, pWrite
1f380 72 2c 20 31 29 3b 0a 20 20 70 57 72 69 74 65 72  r, 1);.  pWriter
1f390 2d 3e 77 72 69 74 65 72 2e 70 67 6e 6f 20 3d 20  ->writer.pgno = 
1f3a0 31 3b 0a 20 20 70 57 72 69 74 65 72 2d 3e 62 46  1;.  pWriter->bF
1f3b0 69 72 73 74 54 65 72 6d 49 6e 50 61 67 65 20 3d  irstTermInPage =
1f3c0 20 31 3b 0a 20 20 70 57 72 69 74 65 72 2d 3e 69   1;.  pWriter->i
1f3d0 42 74 50 61 67 65 20 3d 20 31 3b 0a 0a 20 20 61  BtPage = 1;..  a
1f3e0 73 73 65 72 74 28 20 70 57 72 69 74 65 72 2d 3e  ssert( pWriter->
1f3f0 77 72 69 74 65 72 2e 62 75 66 2e 6e 3d 3d 30 20  writer.buf.n==0 
1f400 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 57 72  );.  assert( pWr
1f410 69 74 65 72 2d 3e 77 72 69 74 65 72 2e 70 67 69  iter->writer.pgi
1f420 64 78 2e 6e 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a  dx.n==0 );..  /*
1f430 20 47 72 6f 77 20 74 68 65 20 74 77 6f 20 62 75   Grow the two bu
1f440 66 66 65 72 73 20 74 6f 20 70 67 73 7a 20 2b 20  ffers to pgsz + 
1f450 70 61 64 64 69 6e 67 20 62 79 74 65 73 20 69 6e  padding bytes in
1f460 20 73 69 7a 65 2e 20 2a 2f 0a 20 20 73 71 6c 69   size. */.  sqli
1f470 74 65 33 46 74 73 35 42 75 66 66 65 72 53 69 7a  te3Fts5BufferSiz
1f480 65 28 26 70 2d 3e 72 63 2c 20 26 70 57 72 69 74  e(&p->rc, &pWrit
1f490 65 72 2d 3e 77 72 69 74 65 72 2e 70 67 69 64 78  er->writer.pgidx
1f4a0 2c 20 6e 42 75 66 66 65 72 29 3b 0a 20 20 73 71  , nBuffer);.  sq
1f4b0 6c 69 74 65 33 46 74 73 35 42 75 66 66 65 72 53  lite3Fts5BufferS
1f4c0 69 7a 65 28 26 70 2d 3e 72 63 2c 20 26 70 57 72  ize(&p->rc, &pWr
1f4d0 69 74 65 72 2d 3e 77 72 69 74 65 72 2e 62 75 66  iter->writer.buf
1f4e0 2c 20 6e 42 75 66 66 65 72 29 3b 0a 0a 20 20 69  , nBuffer);..  i
1f4f0 66 28 20 70 2d 3e 70 49 64 78 57 72 69 74 65 72  f( p->pIdxWriter
1f500 3d 3d 30 20 29 7b 0a 20 20 20 20 46 74 73 35 43  ==0 ){.    Fts5C
1f510 6f 6e 66 69 67 20 2a 70 43 6f 6e 66 69 67 20 3d  onfig *pConfig =
1f520 20 70 2d 3e 70 43 6f 6e 66 69 67 3b 0a 20 20 20   p->pConfig;.   
1f530 20 66 74 73 35 49 6e 64 65 78 50 72 65 70 61 72   fts5IndexPrepar
1f540 65 53 74 6d 74 28 70 2c 20 26 70 2d 3e 70 49 64  eStmt(p, &p->pId
1f550 78 57 72 69 74 65 72 2c 20 73 71 6c 69 74 65 33  xWriter, sqlite3
1f560 5f 6d 70 72 69 6e 74 66 28 0a 20 20 20 20 20 20  _mprintf(.      
1f570 20 20 20 20 22 49 4e 53 45 52 54 20 49 4e 54 4f      "INSERT INTO
1f580 20 27 25 71 27 2e 27 25 71 5f 69 64 78 27 28 73   '%q'.'%q_idx'(s
1f590 65 67 69 64 2c 74 65 72 6d 2c 70 67 6e 6f 29 20  egid,term,pgno) 
1f5a0 56 41 4c 55 45 53 28 3f 2c 3f 2c 3f 29 22 2c 20  VALUES(?,?,?)", 
1f5b0 0a 20 20 20 20 20 20 20 20 20 20 70 43 6f 6e 66  .          pConf
1f5c0 69 67 2d 3e 7a 44 62 2c 20 70 43 6f 6e 66 69 67  ig->zDb, pConfig
1f5d0 2d 3e 7a 4e 61 6d 65 0a 20 20 20 20 29 29 3b 0a  ->zName.    ));.
1f5e0 20 20 7d 0a 0a 20 20 69 66 28 20 70 2d 3e 72 63    }..  if( p->rc
1f5f0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
1f600 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65     /* Initialize
1f610 20 74 68 65 20 34 2d 62 79 74 65 20 6c 65 61 66   the 4-byte leaf
1f620 2d 70 61 67 65 20 68 65 61 64 65 72 20 74 6f 20  -page header to 
1f630 30 78 30 30 2e 20 2a 2f 0a 20 20 20 20 6d 65 6d  0x00. */.    mem
1f640 73 65 74 28 70 57 72 69 74 65 72 2d 3e 77 72 69  set(pWriter->wri
1f650 74 65 72 2e 62 75 66 2e 70 2c 20 30 2c 20 34 29  ter.buf.p, 0, 4)
1f660 3b 0a 20 20 20 20 70 57 72 69 74 65 72 2d 3e 77  ;.    pWriter->w
1f670 72 69 74 65 72 2e 62 75 66 2e 6e 20 3d 20 34 3b  riter.buf.n = 4;
1f680 0a 0a 20 20 20 20 2f 2a 20 42 69 6e 64 20 74 68  ..    /* Bind th
1f690 65 20 63 75 72 72 65 6e 74 20 6f 75 74 70 75 74  e current output
1f6a0 20 73 65 67 6d 65 6e 74 20 69 64 20 74 6f 20 74   segment id to t
1f6b0 68 65 20 69 6e 64 65 78 2d 77 72 69 74 65 72 2e  he index-writer.
1f6c0 20 54 68 69 73 20 69 73 20 61 6e 0a 20 20 20 20   This is an.    
1f6d0 2a 2a 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20  ** optimization 
1f6e0 6f 76 65 72 20 62 69 6e 64 69 6e 67 20 74 68 65  over binding the
1f6f0 20 73 61 6d 65 20 76 61 6c 75 65 20 6f 76 65 72   same value over
1f700 20 61 6e 64 20 6f 76 65 72 20 61 73 20 72 6f 77   and over as row
1f710 73 20 61 72 65 0a 20 20 20 20 2a 2a 20 69 6e 73  s are.    ** ins
1f720 65 72 74 65 64 20 69 6e 74 6f 20 25 5f 69 64 78  erted into %_idx
1f730 20 62 79 20 74 68 65 20 63 75 72 72 65 6e 74 20   by the current 
1f740 77 72 69 74 65 72 2e 20 20 2a 2f 0a 20 20 20 20  writer.  */.    
1f750 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74  sqlite3_bind_int
1f760 28 70 2d 3e 70 49 64 78 57 72 69 74 65 72 2c 20  (p->pIdxWriter, 
1f770 31 2c 20 70 57 72 69 74 65 72 2d 3e 69 53 65 67  1, pWriter->iSeg
1f780 69 64 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  id);.  }.}../*.*
1f790 2a 20 49 74 65 72 61 74 6f 72 20 70 49 74 65 72  * Iterator pIter
1f7a0 20 77 61 73 20 75 73 65 64 20 74 6f 20 69 74 65   was used to ite
1f7b0 72 61 74 65 20 74 68 72 6f 75 67 68 20 74 68 65  rate through the
1f7c0 20 69 6e 70 75 74 20 73 65 67 6d 65 6e 74 73 20   input segments 
1f7d0 6f 66 20 6f 6e 20 61 6e 0a 2a 2a 20 69 6e 63 72  of on an.** incr
1f7e0 65 6d 65 6e 74 61 6c 20 6d 65 72 67 65 20 6f 70  emental merge op
1f7f0 65 72 61 74 69 6f 6e 2e 20 54 68 69 73 20 66 75  eration. This fu
1f800 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
1f810 20 69 66 20 74 68 65 20 69 6e 63 72 65 6d 65 6e   if the incremen
1f820 74 61 6c 0a 2a 2a 20 6d 65 72 67 65 20 73 74 65  tal.** merge ste
1f830 70 20 68 61 73 20 66 69 6e 69 73 68 65 64 20 62  p has finished b
1f840 75 74 20 74 68 65 20 69 6e 70 75 74 20 68 61 73  ut the input has
1f850 20 6e 6f 74 20 62 65 65 6e 20 63 6f 6d 70 6c 65   not been comple
1f860 74 65 6c 79 20 65 78 68 61 75 73 74 65 64 2e 0a  tely exhausted..
1f870 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
1f880 74 73 35 54 72 69 6d 53 65 67 6d 65 6e 74 73 28  ts5TrimSegments(
1f890 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 46 74  Fts5Index *p, Ft
1f8a0 73 35 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a  s5Iter *pIter){.
1f8b0 20 20 69 6e 74 20 69 3b 0a 20 20 46 74 73 35 42    int i;.  Fts5B
1f8c0 75 66 66 65 72 20 62 75 66 3b 0a 20 20 6d 65 6d  uffer buf;.  mem
1f8d0 73 65 74 28 26 62 75 66 2c 20 30 2c 20 73 69 7a  set(&buf, 0, siz
1f8e0 65 6f 66 28 46 74 73 35 42 75 66 66 65 72 29 29  eof(Fts5Buffer))
1f8f0 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
1f900 49 74 65 72 2d 3e 6e 53 65 67 20 26 26 20 70 2d  Iter->nSeg && p-
1f910 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20  >rc==SQLITE_OK; 
1f920 69 2b 2b 29 7b 0a 20 20 20 20 46 74 73 35 53 65  i++){.    Fts5Se
1f930 67 49 74 65 72 20 2a 70 53 65 67 20 3d 20 26 70  gIter *pSeg = &p
1f940 49 74 65 72 2d 3e 61 53 65 67 5b 69 5d 3b 0a 20  Iter->aSeg[i];. 
1f950 20 20 20 69 66 28 20 70 53 65 67 2d 3e 70 53 65     if( pSeg->pSe
1f960 67 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a  g==0 ){.      /*
1f970 20 6e 6f 2d 6f 70 20 2a 2f 0a 20 20 20 20 7d 65   no-op */.    }e
1f980 6c 73 65 20 69 66 28 20 70 53 65 67 2d 3e 70 4c  lse if( pSeg->pL
1f990 65 61 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  eaf==0 ){.      
1f9a0 2f 2a 20 41 6c 6c 20 6b 65 79 73 20 66 72 6f 6d  /* All keys from
1f9b0 20 74 68 69 73 20 69 6e 70 75 74 20 73 65 67 6d   this input segm
1f9c0 65 6e 74 20 68 61 76 65 20 62 65 65 6e 20 74 72  ent have been tr
1f9d0 61 6e 73 66 65 72 65 64 20 74 6f 20 74 68 65 20  ansfered to the 
1f9e0 6f 75 74 70 75 74 2e 0a 20 20 20 20 20 20 2a 2a  output..      **
1f9f0 20 53 65 74 20 62 6f 74 68 20 74 68 65 20 66 69   Set both the fi
1fa00 72 73 74 20 61 6e 64 20 6c 61 73 74 20 70 61 67  rst and last pag
1fa10 65 2d 6e 75 6d 62 65 72 73 20 74 6f 20 30 20 74  e-numbers to 0 t
1fa20 6f 20 69 6e 64 69 63 61 74 65 20 74 68 61 74 20  o indicate that 
1fa30 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 73 65 67  the.      ** seg
1fa40 6d 65 6e 74 20 69 73 20 6e 6f 77 20 65 6d 70 74  ment is now empt
1fa50 79 2e 20 2a 2f 0a 20 20 20 20 20 20 70 53 65 67  y. */.      pSeg
1fa60 2d 3e 70 53 65 67 2d 3e 70 67 6e 6f 4c 61 73 74  ->pSeg->pgnoLast
1fa70 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 53 65 67   = 0;.      pSeg
1fa80 2d 3e 70 53 65 67 2d 3e 70 67 6e 6f 46 69 72 73  ->pSeg->pgnoFirs
1fa90 74 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65  t = 0;.    }else
1faa0 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 4f 66 66  {.      int iOff
1fab0 20 3d 20 70 53 65 67 2d 3e 69 54 65 72 6d 4c 65   = pSeg->iTermLe
1fac0 61 66 4f 66 66 73 65 74 3b 20 20 20 20 20 2f 2a  afOffset;     /*
1fad0 20 4f 66 66 73 65 74 20 6f 6e 20 6e 65 77 20 66   Offset on new f
1fae0 69 72 73 74 20 6c 65 61 66 20 70 61 67 65 20 2a  irst leaf page *
1faf0 2f 0a 20 20 20 20 20 20 69 36 34 20 69 4c 65 61  /.      i64 iLea
1fb00 66 52 6f 77 69 64 3b 0a 20 20 20 20 20 20 46 74  fRowid;.      Ft
1fb10 73 35 44 61 74 61 20 2a 70 44 61 74 61 3b 0a 20  s5Data *pData;. 
1fb20 20 20 20 20 20 69 6e 74 20 69 49 64 20 3d 20 70       int iId = p
1fb30 53 65 67 2d 3e 70 53 65 67 2d 3e 69 53 65 67 69  Seg->pSeg->iSegi
1fb40 64 3b 0a 20 20 20 20 20 20 75 38 20 61 48 64 72  d;.      u8 aHdr
1fb50 5b 34 5d 20 3d 20 7b 30 78 30 30 2c 20 30 78 30  [4] = {0x00, 0x0
1fb60 30 2c 20 30 78 30 30 2c 20 30 78 30 30 7d 3b 0a  0, 0x00, 0x00};.
1fb70 0a 20 20 20 20 20 20 69 4c 65 61 66 52 6f 77 69  .      iLeafRowi
1fb80 64 20 3d 20 46 54 53 35 5f 53 45 47 4d 45 4e 54  d = FTS5_SEGMENT
1fb90 5f 52 4f 57 49 44 28 69 49 64 2c 20 70 53 65 67  _ROWID(iId, pSeg
1fba0 2d 3e 69 54 65 72 6d 4c 65 61 66 50 67 6e 6f 29  ->iTermLeafPgno)
1fbb0 3b 0a 20 20 20 20 20 20 70 44 61 74 61 20 3d 20  ;.      pData = 
1fbc0 66 74 73 35 4c 65 61 66 52 65 61 64 28 70 2c 20  fts5LeafRead(p, 
1fbd0 69 4c 65 61 66 52 6f 77 69 64 29 3b 0a 20 20 20  iLeafRowid);.   
1fbe0 20 20 20 69 66 28 20 70 44 61 74 61 20 29 7b 0a     if( pData ){.
1fbf0 20 20 20 20 20 20 20 20 69 66 28 20 69 4f 66 66          if( iOff
1fc00 3e 70 44 61 74 61 2d 3e 73 7a 4c 65 61 66 20 29  >pData->szLeaf )
1fc10 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  {.          /* T
1fc20 68 69 73 20 63 61 6e 20 6f 63 63 75 72 20 69 66  his can occur if
1fc30 20 74 68 65 20 70 61 67 65 73 20 74 68 61 74 20   the pages that 
1fc40 74 68 65 20 73 65 67 6d 65 6e 74 73 20 6f 63 63  the segments occ
1fc50 75 70 79 20 6f 76 65 72 6c 61 70 20 2d 20 69 66  upy overlap - if
1fc60 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61 20  .          ** a 
1fc70 73 69 6e 67 6c 65 20 70 61 67 65 20 68 61 73 20  single page has 
1fc80 62 65 65 6e 20 61 73 73 69 67 6e 65 64 20 74 6f  been assigned to
1fc90 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 73   more than one s
1fca0 65 67 6d 65 6e 74 2e 20 49 6e 0a 20 20 20 20 20  egment. In.     
1fcb0 20 20 20 20 20 2a 2a 20 74 68 69 73 20 63 61 73       ** this cas
1fcc0 65 20 61 20 70 72 69 6f 72 20 69 74 65 72 61 74  e a prior iterat
1fcd0 69 6f 6e 20 6f 66 20 74 68 69 73 20 6c 6f 6f 70  ion of this loop
1fce0 20 6d 61 79 20 68 61 76 65 20 63 6f 72 72 75 70   may have corrup
1fcf0 74 65 64 20 74 68 65 0a 20 20 20 20 20 20 20 20  ted the.        
1fd00 20 20 2a 2a 20 73 65 67 6d 65 6e 74 20 63 75 72    ** segment cur
1fd10 72 65 6e 74 6c 79 20 62 65 69 6e 67 20 74 72 69  rently being tri
1fd20 6d 6d 65 64 2e 20 20 2a 2f 0a 20 20 20 20 20 20  mmed.  */.      
1fd30 20 20 20 20 70 2d 3e 72 63 20 3d 20 46 54 53 35      p->rc = FTS5
1fd40 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20 20 20 20  _CORRUPT;.      
1fd50 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
1fd60 20 20 20 66 74 73 35 42 75 66 66 65 72 5a 65 72     fts5BufferZer
1fd70 6f 28 26 62 75 66 29 3b 0a 20 20 20 20 20 20 20  o(&buf);.       
1fd80 20 20 20 66 74 73 35 42 75 66 66 65 72 47 72 6f     fts5BufferGro
1fd90 77 28 26 70 2d 3e 72 63 2c 20 26 62 75 66 2c 20  w(&p->rc, &buf, 
1fda0 70 44 61 74 61 2d 3e 6e 6e 29 3b 0a 20 20 20 20  pData->nn);.    
1fdb0 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72        fts5Buffer
1fdc0 41 70 70 65 6e 64 42 6c 6f 62 28 26 70 2d 3e 72  AppendBlob(&p->r
1fdd0 63 2c 20 26 62 75 66 2c 20 73 69 7a 65 6f 66 28  c, &buf, sizeof(
1fde0 61 48 64 72 29 2c 20 61 48 64 72 29 3b 0a 20 20  aHdr), aHdr);.  
1fdf0 20 20 20 20 20 20 20 20 66 74 73 35 42 75 66 66          fts5Buff
1fe00 65 72 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26  erAppendVarint(&
1fe10 70 2d 3e 72 63 2c 20 26 62 75 66 2c 20 70 53 65  p->rc, &buf, pSe
1fe20 67 2d 3e 74 65 72 6d 2e 6e 29 3b 0a 20 20 20 20  g->term.n);.    
1fe30 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72        fts5Buffer
1fe40 41 70 70 65 6e 64 42 6c 6f 62 28 26 70 2d 3e 72  AppendBlob(&p->r
1fe50 63 2c 20 26 62 75 66 2c 20 70 53 65 67 2d 3e 74  c, &buf, pSeg->t
1fe60 65 72 6d 2e 6e 2c 20 70 53 65 67 2d 3e 74 65 72  erm.n, pSeg->ter
1fe70 6d 2e 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20  m.p);.          
1fe80 66 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64  fts5BufferAppend
1fe90 42 6c 6f 62 28 26 70 2d 3e 72 63 2c 20 26 62 75  Blob(&p->rc, &bu
1fea0 66 2c 20 70 44 61 74 61 2d 3e 73 7a 4c 65 61 66  f, pData->szLeaf
1feb0 2d 69 4f 66 66 2c 26 70 44 61 74 61 2d 3e 70 5b  -iOff,&pData->p[
1fec0 69 4f 66 66 5d 29 3b 0a 20 20 20 20 20 20 20 20  iOff]);.        
1fed0 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c    if( p->rc==SQL
1fee0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1fef0 20 20 20 20 20 20 2f 2a 20 53 65 74 20 74 68 65        /* Set the
1ff00 20 73 7a 4c 65 61 66 20 66 69 65 6c 64 20 2a 2f   szLeaf field */
1ff10 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 74 73  .            fts
1ff20 35 50 75 74 55 31 36 28 26 62 75 66 2e 70 5b 32  5PutU16(&buf.p[2
1ff30 5d 2c 20 28 75 31 36 29 62 75 66 2e 6e 29 3b 0a  ], (u16)buf.n);.
1ff40 20 20 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20            }..   
1ff50 20 20 20 20 20 20 20 2f 2a 20 53 65 74 20 75 70         /* Set up
1ff60 20 74 68 65 20 6e 65 77 20 70 61 67 65 2d 69 6e   the new page-in
1ff70 64 65 78 20 61 72 72 61 79 20 2a 2f 0a 20 20 20  dex array */.   
1ff80 20 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65         fts5Buffe
1ff90 72 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26 70  rAppendVarint(&p
1ffa0 2d 3e 72 63 2c 20 26 62 75 66 2c 20 34 29 3b 0a  ->rc, &buf, 4);.
1ffb0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 53            if( pS
1ffc0 65 67 2d 3e 69 4c 65 61 66 50 67 6e 6f 3d 3d 70  eg->iLeafPgno==p
1ffd0 53 65 67 2d 3e 69 54 65 72 6d 4c 65 61 66 50 67  Seg->iTermLeafPg
1ffe0 6e 6f 20 0a 20 20 20 20 20 20 20 20 20 20 20 26  no .           &
1fff0 26 20 70 53 65 67 2d 3e 69 45 6e 64 6f 66 44 6f  & pSeg->iEndofDo
20000 63 6c 69 73 74 3c 70 44 61 74 61 2d 3e 73 7a 4c  clist<pData->szL
20010 65 61 66 0a 20 20 20 20 20 20 20 20 20 20 20 26  eaf.           &
20020 26 20 70 53 65 67 2d 3e 69 50 67 69 64 78 4f 66  & pSeg->iPgidxOf
20030 66 3c 3d 70 44 61 74 61 2d 3e 6e 6e 0a 20 20 20  f<=pData->nn.   
20040 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20         ){.      
20050 20 20 20 20 20 20 69 6e 74 20 6e 44 69 66 66 20        int nDiff 
20060 3d 20 70 44 61 74 61 2d 3e 73 7a 4c 65 61 66 20  = pData->szLeaf 
20070 2d 20 70 53 65 67 2d 3e 69 45 6e 64 6f 66 44 6f  - pSeg->iEndofDo
20080 63 6c 69 73 74 3b 0a 20 20 20 20 20 20 20 20 20  clist;.         
20090 20 20 20 66 74 73 35 42 75 66 66 65 72 41 70 70     fts5BufferApp
200a0 65 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e 72 63  endVarint(&p->rc
200b0 2c 20 26 62 75 66 2c 20 62 75 66 2e 6e 20 2d 20  , &buf, buf.n - 
200c0 31 20 2d 20 6e 44 69 66 66 20 2d 20 34 29 3b 0a  1 - nDiff - 4);.
200d0 20 20 20 20 20 20 20 20 20 20 20 20 66 74 73 35              fts5
200e0 42 75 66 66 65 72 41 70 70 65 6e 64 42 6c 6f 62  BufferAppendBlob
200f0 28 26 70 2d 3e 72 63 2c 20 26 62 75 66 2c 20 0a  (&p->rc, &buf, .
20100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20110 70 44 61 74 61 2d 3e 6e 6e 20 2d 20 70 53 65 67  pData->nn - pSeg
20120 2d 3e 69 50 67 69 64 78 4f 66 66 2c 20 26 70 44  ->iPgidxOff, &pD
20130 61 74 61 2d 3e 70 5b 70 53 65 67 2d 3e 69 50 67  ata->p[pSeg->iPg
20140 69 64 78 4f 66 66 5d 0a 20 20 20 20 20 20 20 20  idxOff].        
20150 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 20      );.         
20160 20 7d 0a 0a 20 20 20 20 20 20 20 20 20 20 70 53   }..          pS
20170 65 67 2d 3e 70 53 65 67 2d 3e 70 67 6e 6f 46 69  eg->pSeg->pgnoFi
20180 72 73 74 20 3d 20 70 53 65 67 2d 3e 69 54 65 72  rst = pSeg->iTer
20190 6d 4c 65 61 66 50 67 6e 6f 3b 0a 20 20 20 20 20  mLeafPgno;.     
201a0 20 20 20 20 20 66 74 73 35 44 61 74 61 44 65 6c       fts5DataDel
201b0 65 74 65 28 70 2c 20 46 54 53 35 5f 53 45 47 4d  ete(p, FTS5_SEGM
201c0 45 4e 54 5f 52 4f 57 49 44 28 69 49 64 2c 20 31  ENT_ROWID(iId, 1
201d0 29 2c 20 69 4c 65 61 66 52 6f 77 69 64 29 3b 0a  ), iLeafRowid);.
201e0 20 20 20 20 20 20 20 20 20 20 66 74 73 35 44 61            fts5Da
201f0 74 61 57 72 69 74 65 28 70 2c 20 69 4c 65 61 66  taWrite(p, iLeaf
20200 52 6f 77 69 64 2c 20 62 75 66 2e 70 2c 20 62 75  Rowid, buf.p, bu
20210 66 2e 6e 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  f.n);.        }.
20220 20 20 20 20 20 20 20 20 66 74 73 35 44 61 74 61          fts5Data
20230 52 65 6c 65 61 73 65 28 70 44 61 74 61 29 3b 0a  Release(pData);.
20240 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
20250 7d 0a 20 20 66 74 73 35 42 75 66 66 65 72 46 72  }.  fts5BufferFr
20260 65 65 28 26 62 75 66 29 3b 0a 7d 0a 0a 73 74 61  ee(&buf);.}..sta
20270 74 69 63 20 76 6f 69 64 20 66 74 73 35 4d 65 72  tic void fts5Mer
20280 67 65 43 68 75 6e 6b 43 61 6c 6c 62 61 63 6b 28  geChunkCallback(
20290 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c  .  Fts5Index *p,
202a0 20 0a 20 20 76 6f 69 64 20 2a 70 43 74 78 2c 20   .  void *pCtx, 
202b0 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 70 43 68  .  const u8 *pCh
202c0 75 6e 6b 2c 20 69 6e 74 20 6e 43 68 75 6e 6b 0a  unk, int nChunk.
202d0 29 7b 0a 20 20 46 74 73 35 53 65 67 57 72 69 74  ){.  Fts5SegWrit
202e0 65 72 20 2a 70 57 72 69 74 65 72 20 3d 20 28 46  er *pWriter = (F
202f0 74 73 35 53 65 67 57 72 69 74 65 72 2a 29 70 43  ts5SegWriter*)pC
20300 74 78 3b 0a 20 20 66 74 73 35 57 72 69 74 65 41  tx;.  fts5WriteA
20310 70 70 65 6e 64 50 6f 73 6c 69 73 74 44 61 74 61  ppendPoslistData
20320 28 70 2c 20 70 57 72 69 74 65 72 2c 20 70 43 68  (p, pWriter, pCh
20330 75 6e 6b 2c 20 6e 43 68 75 6e 6b 29 3b 0a 7d 0a  unk, nChunk);.}.
20340 0a 2f 2a 0a 2a 2a 0a 2a 2f 0a 73 74 61 74 69 63  ./*.**.*/.static
20350 20 76 6f 69 64 20 66 74 73 35 49 6e 64 65 78 4d   void fts5IndexM
20360 65 72 67 65 4c 65 76 65 6c 28 0a 20 20 46 74 73  ergeLevel(.  Fts
20370 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20  5Index *p,      
20380 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
20390 46 54 53 35 20 62 61 63 6b 65 6e 64 20 6f 62 6a  FTS5 backend obj
203a0 65 63 74 20 2a 2f 0a 20 20 46 74 73 35 53 74 72  ect */.  Fts5Str
203b0 75 63 74 75 72 65 20 2a 2a 70 70 53 74 72 75 63  ucture **ppStruc
203c0 74 2c 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f  t,       /* IN/O
203d0 55 54 3a 20 53 74 75 63 74 75 72 65 20 6f 66 20  UT: Stucture of 
203e0 69 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20 69  index */.  int i
203f0 4c 76 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20  Lvl,            
20400 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65             /* Le
20410 76 65 6c 20 74 6f 20 72 65 61 64 20 69 6e 70 75  vel to read inpu
20420 74 20 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20  t from */.  int 
20430 2a 70 6e 52 65 6d 20 20 20 20 20 20 20 20 20 20  *pnRem          
20440 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57              /* W
20450 72 69 74 65 20 75 70 20 74 6f 20 74 68 69 73 20  rite up to this 
20460 6d 61 6e 79 20 6f 75 74 70 75 74 20 6c 65 61 76  many output leav
20470 65 73 20 2a 2f 0a 29 7b 0a 20 20 46 74 73 35 53  es */.){.  Fts5S
20480 74 72 75 63 74 75 72 65 20 2a 70 53 74 72 75 63  tructure *pStruc
20490 74 20 3d 20 2a 70 70 53 74 72 75 63 74 3b 0a 20  t = *ppStruct;. 
204a0 20 46 74 73 35 53 74 72 75 63 74 75 72 65 4c 65   Fts5StructureLe
204b0 76 65 6c 20 2a 70 4c 76 6c 20 3d 20 26 70 53 74  vel *pLvl = &pSt
204c0 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76  ruct->aLevel[iLv
204d0 6c 5d 3b 0a 20 20 46 74 73 35 53 74 72 75 63 74  l];.  Fts5Struct
204e0 75 72 65 4c 65 76 65 6c 20 2a 70 4c 76 6c 4f 75  ureLevel *pLvlOu
204f0 74 3b 0a 20 20 46 74 73 35 49 74 65 72 20 2a 70  t;.  Fts5Iter *p
20500 49 74 65 72 20 3d 20 30 3b 20 20 20 20 20 20 20  Iter = 0;       
20510 2f 2a 20 49 74 65 72 61 74 6f 72 20 74 6f 20 72  /* Iterator to r
20520 65 61 64 20 69 6e 70 75 74 20 64 61 74 61 20 2a  ead input data *
20530 2f 0a 20 20 69 6e 74 20 6e 52 65 6d 20 3d 20 70  /.  int nRem = p
20540 6e 52 65 6d 20 3f 20 2a 70 6e 52 65 6d 20 3a 20  nRem ? *pnRem : 
20550 30 3b 20 20 2f 2a 20 4f 75 74 70 75 74 20 6c 65  0;  /* Output le
20560 61 66 20 70 61 67 65 73 20 6c 65 66 74 20 74 6f  af pages left to
20570 20 77 72 69 74 65 20 2a 2f 0a 20 20 69 6e 74 20   write */.  int 
20580 6e 49 6e 70 75 74 3b 20 20 20 20 20 20 20 20 20  nInput;         
20590 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
205a0 75 6d 62 65 72 20 6f 66 20 69 6e 70 75 74 20 73  umber of input s
205b0 65 67 6d 65 6e 74 73 20 2a 2f 0a 20 20 46 74 73  egments */.  Fts
205c0 35 53 65 67 57 72 69 74 65 72 20 77 72 69 74 65  5SegWriter write
205d0 72 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  r;           /* 
205e0 57 72 69 74 65 72 20 6f 62 6a 65 63 74 20 2a 2f  Writer object */
205f0 0a 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65  .  Fts5Structure
20600 53 65 67 6d 65 6e 74 20 2a 70 53 65 67 3b 20 20  Segment *pSeg;  
20610 20 20 20 2f 2a 20 4f 75 74 70 75 74 20 73 65 67     /* Output seg
20620 6d 65 6e 74 20 2a 2f 0a 20 20 46 74 73 35 42 75  ment */.  Fts5Bu
20630 66 66 65 72 20 74 65 72 6d 3b 0a 20 20 69 6e 74  ffer term;.  int
20640 20 62 4f 6c 64 65 73 74 3b 20 20 20 20 20 20 20   bOldest;       
20650 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
20660 54 72 75 65 20 69 66 20 74 68 65 20 6f 75 74 70  True if the outp
20670 75 74 20 73 65 67 6d 65 6e 74 20 69 73 20 74 68  ut segment is th
20680 65 20 6f 6c 64 65 73 74 20 2a 2f 0a 20 20 69 6e  e oldest */.  in
20690 74 20 65 44 65 74 61 69 6c 20 3d 20 70 2d 3e 70  t eDetail = p->p
206a0 43 6f 6e 66 69 67 2d 3e 65 44 65 74 61 69 6c 3b  Config->eDetail;
206b0 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 66 6c 61  .  const int fla
206c0 67 73 20 3d 20 46 54 53 35 49 4e 44 45 58 5f 51  gs = FTS5INDEX_Q
206d0 55 45 52 59 5f 4e 4f 4f 55 54 50 55 54 3b 0a 20  UERY_NOOUTPUT;. 
206e0 20 69 6e 74 20 62 54 65 72 6d 57 72 69 74 74 65   int bTermWritte
206f0 6e 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  n = 0;          
20700 20 2f 2a 20 54 72 75 65 20 69 66 20 63 75 72 72   /* True if curr
20710 65 6e 74 20 74 65 72 6d 20 61 6c 72 65 61 64 79  ent term already
20720 20 6f 75 74 70 75 74 20 2a 2f 0a 0a 20 20 61 73   output */..  as
20730 73 65 72 74 28 20 69 4c 76 6c 3c 70 53 74 72 75  sert( iLvl<pStru
20740 63 74 2d 3e 6e 4c 65 76 65 6c 20 29 3b 0a 20 20  ct->nLevel );.  
20750 61 73 73 65 72 74 28 20 70 4c 76 6c 2d 3e 6e 4d  assert( pLvl->nM
20760 65 72 67 65 3c 3d 70 4c 76 6c 2d 3e 6e 53 65 67  erge<=pLvl->nSeg
20770 20 29 3b 0a 0a 20 20 6d 65 6d 73 65 74 28 26 77   );..  memset(&w
20780 72 69 74 65 72 2c 20 30 2c 20 73 69 7a 65 6f 66  riter, 0, sizeof
20790 28 46 74 73 35 53 65 67 57 72 69 74 65 72 29 29  (Fts5SegWriter))
207a0 3b 0a 20 20 6d 65 6d 73 65 74 28 26 74 65 72 6d  ;.  memset(&term
207b0 2c 20 30 2c 20 73 69 7a 65 6f 66 28 46 74 73 35  , 0, sizeof(Fts5
207c0 42 75 66 66 65 72 29 29 3b 0a 20 20 69 66 28 20  Buffer));.  if( 
207d0 70 4c 76 6c 2d 3e 6e 4d 65 72 67 65 20 29 7b 0a  pLvl->nMerge ){.
207e0 20 20 20 20 70 4c 76 6c 4f 75 74 20 3d 20 26 70      pLvlOut = &p
207f0 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69  Struct->aLevel[i
20800 4c 76 6c 2b 31 5d 3b 0a 20 20 20 20 61 73 73 65  Lvl+1];.    asse
20810 72 74 28 20 70 4c 76 6c 4f 75 74 2d 3e 6e 53 65  rt( pLvlOut->nSe
20820 67 3e 30 20 29 3b 0a 20 20 20 20 6e 49 6e 70 75  g>0 );.    nInpu
20830 74 20 3d 20 70 4c 76 6c 2d 3e 6e 4d 65 72 67 65  t = pLvl->nMerge
20840 3b 0a 20 20 20 20 70 53 65 67 20 3d 20 26 70 4c  ;.    pSeg = &pL
20850 76 6c 4f 75 74 2d 3e 61 53 65 67 5b 70 4c 76 6c  vlOut->aSeg[pLvl
20860 4f 75 74 2d 3e 6e 53 65 67 2d 31 5d 3b 0a 0a 20  Out->nSeg-1];.. 
20870 20 20 20 66 74 73 35 57 72 69 74 65 49 6e 69 74     fts5WriteInit
20880 28 70 2c 20 26 77 72 69 74 65 72 2c 20 70 53 65  (p, &writer, pSe
20890 67 2d 3e 69 53 65 67 69 64 29 3b 0a 20 20 20 20  g->iSegid);.    
208a0 77 72 69 74 65 72 2e 77 72 69 74 65 72 2e 70 67  writer.writer.pg
208b0 6e 6f 20 3d 20 70 53 65 67 2d 3e 70 67 6e 6f 4c  no = pSeg->pgnoL
208c0 61 73 74 2b 31 3b 0a 20 20 20 20 77 72 69 74 65  ast+1;.    write
208d0 72 2e 69 42 74 50 61 67 65 20 3d 20 30 3b 0a 20  r.iBtPage = 0;. 
208e0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20   }else{.    int 
208f0 69 53 65 67 69 64 20 3d 20 66 74 73 35 41 6c 6c  iSegid = fts5All
20900 6f 63 61 74 65 53 65 67 69 64 28 70 2c 20 70 53  ocateSegid(p, pS
20910 74 72 75 63 74 29 3b 0a 0a 20 20 20 20 2f 2a 20  truct);..    /* 
20920 45 78 74 65 6e 64 20 74 68 65 20 46 74 73 35 53  Extend the Fts5S
20930 74 72 75 63 74 75 72 65 20 6f 62 6a 65 63 74 20  tructure object 
20940 61 73 20 72 65 71 75 69 72 65 64 20 74 6f 20 65  as required to e
20950 6e 73 75 72 65 20 74 68 65 20 6f 75 74 70 75 74  nsure the output
20960 0a 20 20 20 20 2a 2a 20 73 65 67 6d 65 6e 74 20  .    ** segment 
20970 65 78 69 73 74 73 2e 20 2a 2f 0a 20 20 20 20 69  exists. */.    i
20980 66 28 20 69 4c 76 6c 3d 3d 70 53 74 72 75 63 74  f( iLvl==pStruct
20990 2d 3e 6e 4c 65 76 65 6c 2d 31 20 29 7b 0a 20 20  ->nLevel-1 ){.  
209a0 20 20 20 20 66 74 73 35 53 74 72 75 63 74 75 72      fts5Structur
209b0 65 41 64 64 4c 65 76 65 6c 28 26 70 2d 3e 72 63  eAddLevel(&p->rc
209c0 2c 20 70 70 53 74 72 75 63 74 29 3b 0a 20 20 20  , ppStruct);.   
209d0 20 20 20 70 53 74 72 75 63 74 20 3d 20 2a 70 70     pStruct = *pp
209e0 53 74 72 75 63 74 3b 0a 20 20 20 20 7d 0a 20 20  Struct;.    }.  
209f0 20 20 66 74 73 35 53 74 72 75 63 74 75 72 65 45    fts5StructureE
20a00 78 74 65 6e 64 4c 65 76 65 6c 28 26 70 2d 3e 72  xtendLevel(&p->r
20a10 63 2c 20 70 53 74 72 75 63 74 2c 20 69 4c 76 6c  c, pStruct, iLvl
20a20 2b 31 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 69  +1, 1, 0);.    i
20a30 66 28 20 70 2d 3e 72 63 20 29 20 72 65 74 75 72  f( p->rc ) retur
20a40 6e 3b 0a 20 20 20 20 70 4c 76 6c 20 3d 20 26 70  n;.    pLvl = &p
20a50 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69  Struct->aLevel[i
20a60 4c 76 6c 5d 3b 0a 20 20 20 20 70 4c 76 6c 4f 75  Lvl];.    pLvlOu
20a70 74 20 3d 20 26 70 53 74 72 75 63 74 2d 3e 61 4c  t = &pStruct->aL
20a80 65 76 65 6c 5b 69 4c 76 6c 2b 31 5d 3b 0a 0a 20  evel[iLvl+1];.. 
20a90 20 20 20 66 74 73 35 57 72 69 74 65 49 6e 69 74     fts5WriteInit
20aa0 28 70 2c 20 26 77 72 69 74 65 72 2c 20 69 53 65  (p, &writer, iSe
20ab0 67 69 64 29 3b 0a 0a 20 20 20 20 2f 2a 20 41 64  gid);..    /* Ad
20ac0 64 20 74 68 65 20 6e 65 77 20 73 65 67 6d 65 6e  d the new segmen
20ad0 74 20 74 6f 20 74 68 65 20 6f 75 74 70 75 74 20  t to the output 
20ae0 6c 65 76 65 6c 20 2a 2f 0a 20 20 20 20 70 53 65  level */.    pSe
20af0 67 20 3d 20 26 70 4c 76 6c 4f 75 74 2d 3e 61 53  g = &pLvlOut->aS
20b00 65 67 5b 70 4c 76 6c 4f 75 74 2d 3e 6e 53 65 67  eg[pLvlOut->nSeg
20b10 5d 3b 0a 20 20 20 20 70 4c 76 6c 4f 75 74 2d 3e  ];.    pLvlOut->
20b20 6e 53 65 67 2b 2b 3b 0a 20 20 20 20 70 53 65 67  nSeg++;.    pSeg
20b30 2d 3e 70 67 6e 6f 46 69 72 73 74 20 3d 20 31 3b  ->pgnoFirst = 1;
20b40 0a 20 20 20 20 70 53 65 67 2d 3e 69 53 65 67 69  .    pSeg->iSegi
20b50 64 20 3d 20 69 53 65 67 69 64 3b 0a 20 20 20 20  d = iSegid;.    
20b60 70 53 74 72 75 63 74 2d 3e 6e 53 65 67 6d 65 6e  pStruct->nSegmen
20b70 74 2b 2b 3b 0a 0a 20 20 20 20 2f 2a 20 52 65 61  t++;..    /* Rea
20b80 64 20 69 6e 70 75 74 20 66 72 6f 6d 20 61 6c 6c  d input from all
20b90 20 73 65 67 6d 65 6e 74 73 20 69 6e 20 74 68 65   segments in the
20ba0 20 69 6e 70 75 74 20 6c 65 76 65 6c 20 2a 2f 0a   input level */.
20bb0 20 20 20 20 6e 49 6e 70 75 74 20 3d 20 70 4c 76      nInput = pLv
20bc0 6c 2d 3e 6e 53 65 67 3b 0a 20 20 7d 0a 20 20 62  l->nSeg;.  }.  b
20bd0 4f 6c 64 65 73 74 20 3d 20 28 70 4c 76 6c 4f 75  Oldest = (pLvlOu
20be0 74 2d 3e 6e 53 65 67 3d 3d 31 20 26 26 20 70 53  t->nSeg==1 && pS
20bf0 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 3d 3d 69  truct->nLevel==i
20c00 4c 76 6c 2b 32 29 3b 0a 0a 20 20 61 73 73 65 72  Lvl+2);..  asser
20c10 74 28 20 69 4c 76 6c 3e 3d 30 20 29 3b 0a 20 20  t( iLvl>=0 );.  
20c20 66 6f 72 28 66 74 73 35 4d 75 6c 74 69 49 74 65  for(fts5MultiIte
20c30 72 4e 65 77 28 70 2c 20 70 53 74 72 75 63 74 2c  rNew(p, pStruct,
20c40 20 66 6c 61 67 73 2c 20 30 2c 20 30 2c 20 30 2c   flags, 0, 0, 0,
20c50 20 69 4c 76 6c 2c 20 6e 49 6e 70 75 74 2c 20 26   iLvl, nInput, &
20c60 70 49 74 65 72 29 3b 0a 20 20 20 20 20 20 66 74  pIter);.      ft
20c70 73 35 4d 75 6c 74 69 49 74 65 72 45 6f 66 28 70  s5MultiIterEof(p
20c80 2c 20 70 49 74 65 72 29 3d 3d 30 3b 0a 20 20 20  , pIter)==0;.   
20c90 20 20 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72     fts5MultiIter
20ca0 4e 65 78 74 28 70 2c 20 70 49 74 65 72 2c 20 30  Next(p, pIter, 0
20cb0 2c 20 30 29 0a 20 20 29 7b 0a 20 20 20 20 46 74  , 0).  ){.    Ft
20cc0 73 35 53 65 67 49 74 65 72 20 2a 70 53 65 67 49  s5SegIter *pSegI
20cd0 74 65 72 20 3d 20 26 70 49 74 65 72 2d 3e 61 53  ter = &pIter->aS
20ce0 65 67 5b 20 70 49 74 65 72 2d 3e 61 46 69 72 73  eg[ pIter->aFirs
20cf0 74 5b 31 5d 2e 69 46 69 72 73 74 20 5d 3b 0a 20  t[1].iFirst ];. 
20d00 20 20 20 69 6e 74 20 6e 50 6f 73 3b 20 20 20 20     int nPos;    
20d10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20d20 20 2f 2a 20 70 6f 73 69 74 69 6f 6e 2d 6c 69 73   /* position-lis
20d30 74 20 73 69 7a 65 20 66 69 65 6c 64 20 76 61 6c  t size field val
20d40 75 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 54  ue */.    int nT
20d50 65 72 6d 3b 0a 20 20 20 20 63 6f 6e 73 74 20 75  erm;.    const u
20d60 38 20 2a 70 54 65 72 6d 3b 0a 0a 20 20 20 20 70  8 *pTerm;..    p
20d70 54 65 72 6d 20 3d 20 66 74 73 35 4d 75 6c 74 69  Term = fts5Multi
20d80 49 74 65 72 54 65 72 6d 28 70 49 74 65 72 2c 20  IterTerm(pIter, 
20d90 26 6e 54 65 72 6d 29 3b 0a 20 20 20 20 69 66 28  &nTerm);.    if(
20da0 20 6e 54 65 72 6d 21 3d 74 65 72 6d 2e 6e 20 7c   nTerm!=term.n |
20db0 7c 20 66 74 73 35 4d 65 6d 63 6d 70 28 70 54 65  | fts5Memcmp(pTe
20dc0 72 6d 2c 20 74 65 72 6d 2e 70 2c 20 6e 54 65 72  rm, term.p, nTer
20dd0 6d 29 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  m) ){.      if( 
20de0 70 6e 52 65 6d 20 26 26 20 77 72 69 74 65 72 2e  pnRem && writer.
20df0 6e 4c 65 61 66 57 72 69 74 74 65 6e 3e 6e 52 65  nLeafWritten>nRe
20e00 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 62 72 65  m ){.        bre
20e10 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
20e20 20 20 66 74 73 35 42 75 66 66 65 72 53 65 74 28    fts5BufferSet(
20e30 26 70 2d 3e 72 63 2c 20 26 74 65 72 6d 2c 20 6e  &p->rc, &term, n
20e40 54 65 72 6d 2c 20 70 54 65 72 6d 29 3b 0a 20 20  Term, pTerm);.  
20e50 20 20 20 20 62 54 65 72 6d 57 72 69 74 74 65 6e      bTermWritten
20e60 20 3d 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20   =0;.    }..    
20e70 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20 6b 65 79  /* Check for key
20e80 20 61 6e 6e 69 68 69 6c 61 74 69 6f 6e 2e 20 2a   annihilation. *
20e90 2f 0a 20 20 20 20 69 66 28 20 70 53 65 67 49 74  /.    if( pSegIt
20ea0 65 72 2d 3e 6e 50 6f 73 3d 3d 30 20 26 26 20 28  er->nPos==0 && (
20eb0 62 4f 6c 64 65 73 74 20 7c 7c 20 70 53 65 67 49  bOldest || pSegI
20ec0 74 65 72 2d 3e 62 44 65 6c 3d 3d 30 29 20 29 20  ter->bDel==0) ) 
20ed0 63 6f 6e 74 69 6e 75 65 3b 0a 0a 20 20 20 20 69  continue;..    i
20ee0 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  f( p->rc==SQLITE
20ef0 5f 4f 4b 20 26 26 20 62 54 65 72 6d 57 72 69 74  _OK && bTermWrit
20f00 74 65 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ten==0 ){.      
20f10 2f 2a 20 54 68 69 73 20 69 73 20 61 20 6e 65 77  /* This is a new
20f20 20 74 65 72 6d 2e 20 41 70 70 65 6e 64 20 61 20   term. Append a 
20f30 74 65 72 6d 20 74 6f 20 74 68 65 20 6f 75 74 70  term to the outp
20f40 75 74 20 73 65 67 6d 65 6e 74 2e 20 2a 2f 0a 20  ut segment. */. 
20f50 20 20 20 20 20 66 74 73 35 57 72 69 74 65 41 70       fts5WriteAp
20f60 70 65 6e 64 54 65 72 6d 28 70 2c 20 26 77 72 69  pendTerm(p, &wri
20f70 74 65 72 2c 20 6e 54 65 72 6d 2c 20 70 54 65 72  ter, nTerm, pTer
20f80 6d 29 3b 0a 20 20 20 20 20 20 62 54 65 72 6d 57  m);.      bTermW
20f90 72 69 74 74 65 6e 20 3d 20 31 3b 0a 20 20 20 20  ritten = 1;.    
20fa0 7d 0a 0a 20 20 20 20 2f 2a 20 41 70 70 65 6e 64  }..    /* Append
20fb0 20 74 68 65 20 72 6f 77 69 64 20 74 6f 20 74 68   the rowid to th
20fc0 65 20 6f 75 74 70 75 74 20 2a 2f 0a 20 20 20 20  e output */.    
20fd0 2f 2a 20 57 52 49 54 45 50 4f 53 4c 49 53 54 53  /* WRITEPOSLISTS
20fe0 49 5a 45 20 2a 2f 0a 20 20 20 20 66 74 73 35 57  IZE */.    fts5W
20ff0 72 69 74 65 41 70 70 65 6e 64 52 6f 77 69 64 28  riteAppendRowid(
21000 70 2c 20 26 77 72 69 74 65 72 2c 20 66 74 73 35  p, &writer, fts5
21010 4d 75 6c 74 69 49 74 65 72 52 6f 77 69 64 28 70  MultiIterRowid(p
21020 49 74 65 72 29 29 3b 0a 0a 20 20 20 20 69 66 28  Iter));..    if(
21030 20 65 44 65 74 61 69 6c 3d 3d 46 54 53 35 5f 44   eDetail==FTS5_D
21040 45 54 41 49 4c 5f 4e 4f 4e 45 20 29 7b 0a 20 20  ETAIL_NONE ){.  
21050 20 20 20 20 69 66 28 20 70 53 65 67 49 74 65 72      if( pSegIter
21060 2d 3e 62 44 65 6c 20 29 7b 0a 20 20 20 20 20 20  ->bDel ){.      
21070 20 20 66 74 73 35 42 75 66 66 65 72 41 70 70 65    fts5BufferAppe
21080 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c  ndVarint(&p->rc,
21090 20 26 77 72 69 74 65 72 2e 77 72 69 74 65 72 2e   &writer.writer.
210a0 62 75 66 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  buf, 0);.       
210b0 20 69 66 28 20 70 53 65 67 49 74 65 72 2d 3e 6e   if( pSegIter->n
210c0 50 6f 73 3e 30 20 29 7b 0a 20 20 20 20 20 20 20  Pos>0 ){.       
210d0 20 20 20 66 74 73 35 42 75 66 66 65 72 41 70 70     fts5BufferApp
210e0 65 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e 72 63  endVarint(&p->rc
210f0 2c 20 26 77 72 69 74 65 72 2e 77 72 69 74 65 72  , &writer.writer
21100 2e 62 75 66 2c 20 30 29 3b 0a 20 20 20 20 20 20  .buf, 0);.      
21110 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
21120 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20  }else{.      /* 
21130 41 70 70 65 6e 64 20 74 68 65 20 70 6f 73 69 74  Append the posit
21140 69 6f 6e 2d 6c 69 73 74 20 64 61 74 61 20 74 6f  ion-list data to
21150 20 74 68 65 20 6f 75 74 70 75 74 20 2a 2f 0a 20   the output */. 
21160 20 20 20 20 20 6e 50 6f 73 20 3d 20 70 53 65 67       nPos = pSeg
21170 49 74 65 72 2d 3e 6e 50 6f 73 2a 32 20 2b 20 70  Iter->nPos*2 + p
21180 53 65 67 49 74 65 72 2d 3e 62 44 65 6c 3b 0a 20  SegIter->bDel;. 
21190 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72 41       fts5BufferA
211a0 70 70 65 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e  ppendVarint(&p->
211b0 72 63 2c 20 26 77 72 69 74 65 72 2e 77 72 69 74  rc, &writer.writ
211c0 65 72 2e 62 75 66 2c 20 6e 50 6f 73 29 3b 0a 20  er.buf, nPos);. 
211d0 20 20 20 20 20 66 74 73 35 43 68 75 6e 6b 49 74       fts5ChunkIt
211e0 65 72 61 74 65 28 70 2c 20 70 53 65 67 49 74 65  erate(p, pSegIte
211f0 72 2c 20 28 76 6f 69 64 2a 29 26 77 72 69 74 65  r, (void*)&write
21200 72 2c 20 66 74 73 35 4d 65 72 67 65 43 68 75 6e  r, fts5MergeChun
21210 6b 43 61 6c 6c 62 61 63 6b 29 3b 0a 20 20 20 20  kCallback);.    
21220 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 6c 75 73  }.  }..  /* Flus
21230 68 20 74 68 65 20 6c 61 73 74 20 6c 65 61 66 20  h the last leaf 
21240 70 61 67 65 20 74 6f 20 64 69 73 6b 2e 20 53 65  page to disk. Se
21250 74 20 74 68 65 20 6f 75 74 70 75 74 20 73 65 67  t the output seg
21260 6d 65 6e 74 20 62 2d 74 72 65 65 20 68 65 69 67  ment b-tree heig
21270 68 74 0a 20 20 2a 2a 20 61 6e 64 20 6c 61 73 74  ht.  ** and last
21280 20 6c 65 61 66 20 70 61 67 65 20 6e 75 6d 62 65   leaf page numbe
21290 72 20 61 74 20 74 68 65 20 73 61 6d 65 20 74 69  r at the same ti
212a0 6d 65 2e 20 20 2a 2f 0a 20 20 66 74 73 35 57 72  me.  */.  fts5Wr
212b0 69 74 65 46 69 6e 69 73 68 28 70 2c 20 26 77 72  iteFinish(p, &wr
212c0 69 74 65 72 2c 20 26 70 53 65 67 2d 3e 70 67 6e  iter, &pSeg->pgn
212d0 6f 4c 61 73 74 29 3b 0a 0a 20 20 69 66 28 20 66  oLast);..  if( f
212e0 74 73 35 4d 75 6c 74 69 49 74 65 72 45 6f 66 28  ts5MultiIterEof(
212f0 70 2c 20 70 49 74 65 72 29 20 29 7b 0a 20 20 20  p, pIter) ){.   
21300 20 69 6e 74 20 69 3b 0a 0a 20 20 20 20 2f 2a 20   int i;..    /* 
21310 52 65 6d 6f 76 65 20 74 68 65 20 72 65 64 75 6e  Remove the redun
21320 64 61 6e 74 20 73 65 67 6d 65 6e 74 73 20 66 72  dant segments fr
21330 6f 6d 20 74 68 65 20 25 5f 64 61 74 61 20 74 61  om the %_data ta
21340 62 6c 65 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69  ble */.    for(i
21350 3d 30 3b 20 69 3c 6e 49 6e 70 75 74 3b 20 69 2b  =0; i<nInput; i+
21360 2b 29 7b 0a 20 20 20 20 20 20 66 74 73 35 44 61  +){.      fts5Da
21370 74 61 52 65 6d 6f 76 65 53 65 67 6d 65 6e 74 28  taRemoveSegment(
21380 70 2c 20 70 4c 76 6c 2d 3e 61 53 65 67 5b 69 5d  p, pLvl->aSeg[i]
21390 2e 69 53 65 67 69 64 29 3b 0a 20 20 20 20 7d 0a  .iSegid);.    }.
213a0 0a 20 20 20 20 2f 2a 20 52 65 6d 6f 76 65 20 74  .    /* Remove t
213b0 68 65 20 72 65 64 75 6e 64 61 6e 74 20 73 65 67  he redundant seg
213c0 6d 65 6e 74 73 20 66 72 6f 6d 20 74 68 65 20 69  ments from the i
213d0 6e 70 75 74 20 6c 65 76 65 6c 20 2a 2f 0a 20 20  nput level */.  
213e0 20 20 69 66 28 20 70 4c 76 6c 2d 3e 6e 53 65 67    if( pLvl->nSeg
213f0 21 3d 6e 49 6e 70 75 74 20 29 7b 0a 20 20 20 20  !=nInput ){.    
21400 20 20 69 6e 74 20 6e 4d 6f 76 65 20 3d 20 28 70    int nMove = (p
21410 4c 76 6c 2d 3e 6e 53 65 67 20 2d 20 6e 49 6e 70  Lvl->nSeg - nInp
21420 75 74 29 20 2a 20 73 69 7a 65 6f 66 28 46 74 73  ut) * sizeof(Fts
21430 35 53 74 72 75 63 74 75 72 65 53 65 67 6d 65 6e  5StructureSegmen
21440 74 29 3b 0a 20 20 20 20 20 20 6d 65 6d 6d 6f 76  t);.      memmov
21450 65 28 70 4c 76 6c 2d 3e 61 53 65 67 2c 20 26 70  e(pLvl->aSeg, &p
21460 4c 76 6c 2d 3e 61 53 65 67 5b 6e 49 6e 70 75 74  Lvl->aSeg[nInput
21470 5d 2c 20 6e 4d 6f 76 65 29 3b 0a 20 20 20 20 7d  ], nMove);.    }
21480 0a 20 20 20 20 70 53 74 72 75 63 74 2d 3e 6e 53  .    pStruct->nS
21490 65 67 6d 65 6e 74 20 2d 3d 20 6e 49 6e 70 75 74  egment -= nInput
214a0 3b 0a 20 20 20 20 70 4c 76 6c 2d 3e 6e 53 65 67  ;.    pLvl->nSeg
214b0 20 2d 3d 20 6e 49 6e 70 75 74 3b 0a 20 20 20 20   -= nInput;.    
214c0 70 4c 76 6c 2d 3e 6e 4d 65 72 67 65 20 3d 20 30  pLvl->nMerge = 0
214d0 3b 0a 20 20 20 20 69 66 28 20 70 53 65 67 2d 3e  ;.    if( pSeg->
214e0 70 67 6e 6f 4c 61 73 74 3d 3d 30 20 29 7b 0a 20  pgnoLast==0 ){. 
214f0 20 20 20 20 20 70 4c 76 6c 4f 75 74 2d 3e 6e 53       pLvlOut->nS
21500 65 67 2d 2d 3b 0a 20 20 20 20 20 20 70 53 74 72  eg--;.      pStr
21510 75 63 74 2d 3e 6e 53 65 67 6d 65 6e 74 2d 2d 3b  uct->nSegment--;
21520 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a  .    }.  }else{.
21530 20 20 20 20 61 73 73 65 72 74 28 20 70 53 65 67      assert( pSeg
21540 2d 3e 70 67 6e 6f 4c 61 73 74 3e 30 20 29 3b 0a  ->pgnoLast>0 );.
21550 20 20 20 20 66 74 73 35 54 72 69 6d 53 65 67 6d      fts5TrimSegm
21560 65 6e 74 73 28 70 2c 20 70 49 74 65 72 29 3b 0a  ents(p, pIter);.
21570 20 20 20 20 70 4c 76 6c 2d 3e 6e 4d 65 72 67 65      pLvl->nMerge
21580 20 3d 20 6e 49 6e 70 75 74 3b 0a 20 20 7d 0a 0a   = nInput;.  }..
21590 20 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 46    fts5MultiIterF
215a0 72 65 65 28 70 49 74 65 72 29 3b 0a 20 20 66 74  ree(pIter);.  ft
215b0 73 35 42 75 66 66 65 72 46 72 65 65 28 26 74 65  s5BufferFree(&te
215c0 72 6d 29 3b 0a 20 20 69 66 28 20 70 6e 52 65 6d  rm);.  if( pnRem
215d0 20 29 20 2a 70 6e 52 65 6d 20 2d 3d 20 77 72 69   ) *pnRem -= wri
215e0 74 65 72 2e 6e 4c 65 61 66 57 72 69 74 74 65 6e  ter.nLeafWritten
215f0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20 75 70  ;.}../*.** Do up
21600 20 74 6f 20 6e 50 67 20 70 61 67 65 73 20 6f 66   to nPg pages of
21610 20 61 75 74 6f 6d 65 72 67 65 20 77 6f 72 6b 20   automerge work 
21620 6f 6e 20 74 68 65 20 69 6e 64 65 78 2e 0a 2a 2a  on the index..**
21630 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20  .** Return true 
21640 69 66 20 61 6e 79 20 63 68 61 6e 67 65 73 20 77  if any changes w
21650 65 72 65 20 61 63 74 75 61 6c 6c 79 20 6d 61 64  ere actually mad
21660 65 2c 20 6f 72 20 66 61 6c 73 65 20 6f 74 68 65  e, or false othe
21670 72 77 69 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  rwise..*/.static
21680 20 69 6e 74 20 66 74 73 35 49 6e 64 65 78 4d 65   int fts5IndexMe
21690 72 67 65 28 0a 20 20 46 74 73 35 49 6e 64 65 78  rge(.  Fts5Index
216a0 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
216b0 20 20 20 20 20 20 20 2f 2a 20 46 54 53 35 20 62         /* FTS5 b
216c0 61 63 6b 65 6e 64 20 6f 62 6a 65 63 74 20 2a 2f  ackend object */
216d0 0a 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65  .  Fts5Structure
216e0 20 2a 2a 70 70 53 74 72 75 63 74 2c 20 20 20 20   **ppStruct,    
216f0 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 43 75     /* IN/OUT: Cu
21700 72 72 65 6e 74 20 73 74 72 75 63 74 75 72 65 20  rrent structure 
21710 6f 66 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69 6e  of index */.  in
21720 74 20 6e 50 67 2c 20 20 20 20 20 20 20 20 20 20  t nPg,          
21730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
21740 20 50 61 67 65 73 20 6f 66 20 77 6f 72 6b 20 74   Pages of work t
21750 6f 20 64 6f 20 2a 2f 0a 20 20 69 6e 74 20 6e 4d  o do */.  int nM
21760 69 6e 20 20 20 20 20 20 20 20 20 20 20 20 20 20  in              
21770 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 69 6e            /* Min
21780 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 73  imum number of s
21790 65 67 6d 65 6e 74 73 20 74 6f 20 6d 65 72 67 65  egments to merge
217a0 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 52 65   */.){.  int nRe
217b0 6d 20 3d 20 6e 50 67 3b 0a 20 20 69 6e 74 20 62  m = nPg;.  int b
217c0 52 65 74 20 3d 20 30 3b 0a 20 20 46 74 73 35 53  Ret = 0;.  Fts5S
217d0 74 72 75 63 74 75 72 65 20 2a 70 53 74 72 75 63  tructure *pStruc
217e0 74 20 3d 20 2a 70 70 53 74 72 75 63 74 3b 0a 20  t = *ppStruct;. 
217f0 20 77 68 69 6c 65 28 20 6e 52 65 6d 3e 30 20 26   while( nRem>0 &
21800 26 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  & p->rc==SQLITE_
21810 4f 4b 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 4c  OK ){.    int iL
21820 76 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  vl;             
21830 20 20 20 20 20 20 2f 2a 20 54 6f 20 69 74 65 72        /* To iter
21840 61 74 65 20 74 68 72 6f 75 67 68 20 6c 65 76 65  ate through leve
21850 6c 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 42  ls */.    int iB
21860 65 73 74 4c 76 6c 20 3d 20 30 3b 20 20 20 20 20  estLvl = 0;     
21870 20 20 20 20 20 20 2f 2a 20 4c 65 76 65 6c 20 6f        /* Level o
21880 66 66 65 72 69 6e 67 20 74 68 65 20 6d 6f 73 74  ffering the most
21890 20 69 6e 70 75 74 20 73 65 67 6d 65 6e 74 73 20   input segments 
218a0 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 42 65 73 74  */.    int nBest
218b0 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
218c0 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
218d0 69 6e 70 75 74 20 73 65 67 6d 65 6e 74 73 20 6f  input segments o
218e0 6e 20 62 65 73 74 20 6c 65 76 65 6c 20 2a 2f 0a  n best level */.
218f0 0a 20 20 20 20 2f 2a 20 53 65 74 20 69 42 65 73  .    /* Set iBes
21900 74 4c 76 6c 20 74 6f 20 74 68 65 20 6c 65 76 65  tLvl to the leve
21910 6c 20 74 6f 20 72 65 61 64 20 69 6e 70 75 74 20  l to read input 
21920 73 65 67 6d 65 6e 74 73 20 66 72 6f 6d 2e 20 2a  segments from. *
21930 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 53  /.    assert( pS
21940 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 3e 30 20  truct->nLevel>0 
21950 29 3b 0a 20 20 20 20 66 6f 72 28 69 4c 76 6c 3d  );.    for(iLvl=
21960 30 3b 20 69 4c 76 6c 3c 70 53 74 72 75 63 74 2d  0; iLvl<pStruct-
21970 3e 6e 4c 65 76 65 6c 3b 20 69 4c 76 6c 2b 2b 29  >nLevel; iLvl++)
21980 7b 0a 20 20 20 20 20 20 46 74 73 35 53 74 72 75  {.      Fts5Stru
21990 63 74 75 72 65 4c 65 76 65 6c 20 2a 70 4c 76 6c  ctureLevel *pLvl
219a0 20 3d 20 26 70 53 74 72 75 63 74 2d 3e 61 4c 65   = &pStruct->aLe
219b0 76 65 6c 5b 69 4c 76 6c 5d 3b 0a 20 20 20 20 20  vel[iLvl];.     
219c0 20 69 66 28 20 70 4c 76 6c 2d 3e 6e 4d 65 72 67   if( pLvl->nMerg
219d0 65 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  e ){.        if(
219e0 20 70 4c 76 6c 2d 3e 6e 4d 65 72 67 65 3e 6e 42   pLvl->nMerge>nB
219f0 65 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20  est ){.         
21a00 20 69 42 65 73 74 4c 76 6c 20 3d 20 69 4c 76 6c   iBestLvl = iLvl
21a10 3b 0a 20 20 20 20 20 20 20 20 20 20 6e 42 65 73  ;.          nBes
21a20 74 20 3d 20 70 4c 76 6c 2d 3e 6e 4d 65 72 67 65  t = pLvl->nMerge
21a30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
21a40 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
21a50 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 4c 76   }.      if( pLv
21a60 6c 2d 3e 6e 53 65 67 3e 6e 42 65 73 74 20 29 7b  l->nSeg>nBest ){
21a70 0a 20 20 20 20 20 20 20 20 6e 42 65 73 74 20 3d  .        nBest =
21a80 20 70 4c 76 6c 2d 3e 6e 53 65 67 3b 0a 20 20 20   pLvl->nSeg;.   
21a90 20 20 20 20 20 69 42 65 73 74 4c 76 6c 20 3d 20       iBestLvl = 
21aa0 69 4c 76 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20  iLvl;.      }.  
21ab0 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 6e    }..    /* If n
21ac0 42 65 73 74 20 69 73 20 73 74 69 6c 6c 20 30 2c  Best is still 0,
21ad0 20 74 68 65 6e 20 74 68 65 20 69 6e 64 65 78 20   then the index 
21ae0 6d 75 73 74 20 62 65 20 65 6d 70 74 79 2e 20 2a  must be empty. *
21af0 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
21b00 44 45 42 55 47 0a 20 20 20 20 66 6f 72 28 69 4c  DEBUG.    for(iL
21b10 76 6c 3d 30 3b 20 6e 42 65 73 74 3d 3d 30 20 26  vl=0; nBest==0 &
21b20 26 20 69 4c 76 6c 3c 70 53 74 72 75 63 74 2d 3e  & iLvl<pStruct->
21b30 6e 4c 65 76 65 6c 3b 20 69 4c 76 6c 2b 2b 29 7b  nLevel; iLvl++){
21b40 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
21b50 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69  Struct->aLevel[i
21b60 4c 76 6c 5d 2e 6e 53 65 67 3d 3d 30 20 29 3b 0a  Lvl].nSeg==0 );.
21b70 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20      }.#endif..  
21b80 20 20 69 66 28 20 6e 42 65 73 74 3c 6e 4d 69 6e    if( nBest<nMin
21b90 20 26 26 20 70 53 74 72 75 63 74 2d 3e 61 4c 65   && pStruct->aLe
21ba0 76 65 6c 5b 69 42 65 73 74 4c 76 6c 5d 2e 6e 4d  vel[iBestLvl].nM
21bb0 65 72 67 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20  erge==0 ){.     
21bc0 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
21bd0 20 20 62 52 65 74 20 3d 20 31 3b 0a 20 20 20 20    bRet = 1;.    
21be0 66 74 73 35 49 6e 64 65 78 4d 65 72 67 65 4c 65  fts5IndexMergeLe
21bf0 76 65 6c 28 70 2c 20 26 70 53 74 72 75 63 74 2c  vel(p, &pStruct,
21c00 20 69 42 65 73 74 4c 76 6c 2c 20 26 6e 52 65 6d   iBestLvl, &nRem
21c10 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 72 63  );.    if( p->rc
21c20 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70  ==SQLITE_OK && p
21c30 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69  Struct->aLevel[i
21c40 42 65 73 74 4c 76 6c 5d 2e 6e 4d 65 72 67 65 3d  BestLvl].nMerge=
21c50 3d 30 20 29 7b 0a 20 20 20 20 20 20 66 74 73 35  =0 ){.      fts5
21c60 53 74 72 75 63 74 75 72 65 50 72 6f 6d 6f 74 65  StructurePromote
21c70 28 70 2c 20 69 42 65 73 74 4c 76 6c 2b 31 2c 20  (p, iBestLvl+1, 
21c80 70 53 74 72 75 63 74 29 3b 0a 20 20 20 20 7d 0a  pStruct);.    }.
21c90 20 20 7d 0a 20 20 2a 70 70 53 74 72 75 63 74 20    }.  *ppStruct 
21ca0 3d 20 70 53 74 72 75 63 74 3b 0a 20 20 72 65 74  = pStruct;.  ret
21cb0 75 72 6e 20 62 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a  urn bRet;.}../*.
21cc0 2a 2a 20 41 20 74 6f 74 61 6c 20 6f 66 20 6e 4c  ** A total of nL
21cd0 65 61 66 20 6c 65 61 66 20 70 61 67 65 73 20 6f  eaf leaf pages o
21ce0 66 20 64 61 74 61 20 68 61 73 20 6a 75 73 74 20  f data has just 
21cf0 62 65 65 6e 20 66 6c 75 73 68 65 64 20 74 6f 20  been flushed to 
21d00 61 20 6c 65 76 65 6c 2d 30 0a 2a 2a 20 73 65 67  a level-0.** seg
21d10 6d 65 6e 74 2e 20 54 68 69 73 20 66 75 6e 63 74  ment. This funct
21d20 69 6f 6e 20 75 70 64 61 74 65 73 20 74 68 65 20  ion updates the 
21d30 77 72 69 74 65 2d 63 6f 75 6e 74 65 72 20 61 63  write-counter ac
21d40 63 6f 72 64 69 6e 67 6c 79 20 61 6e 64 2c 20 69  cordingly and, i
21d50 66 0a 2a 2a 20 6e 65 63 65 73 73 61 72 79 2c 20  f.** necessary, 
21d60 70 65 72 66 6f 72 6d 73 20 69 6e 63 72 65 6d 65  performs increme
21d70 6e 74 61 6c 20 6d 65 72 67 65 20 77 6f 72 6b 2e  ntal merge work.
21d80 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72  .**.** If an err
21d90 6f 72 20 6f 63 63 75 72 73 2c 20 73 65 74 20 74  or occurs, set t
21da0 68 65 20 46 74 73 35 49 6e 64 65 78 2e 72 63 20  he Fts5Index.rc 
21db0 65 72 72 6f 72 20 63 6f 64 65 2e 20 49 66 20 61  error code. If a
21dc0 6e 20 65 72 72 6f 72 20 68 61 73 20 0a 2a 2a 20  n error has .** 
21dd0 61 6c 72 65 61 64 79 20 6f 63 63 75 72 72 65 64  already occurred
21de0 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  , this function 
21df0 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73  is a no-op..*/.s
21e00 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 49  tatic void fts5I
21e10 6e 64 65 78 41 75 74 6f 6d 65 72 67 65 28 0a 20  ndexAutomerge(. 
21e20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 20   Fts5Index *p,  
21e30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21e40 20 2f 2a 20 46 54 53 35 20 62 61 63 6b 65 6e 64   /* FTS5 backend
21e50 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 46 74 73   object */.  Fts
21e60 35 53 74 72 75 63 74 75 72 65 20 2a 2a 70 70 53  5Structure **ppS
21e70 74 72 75 63 74 2c 20 20 20 20 20 20 20 2f 2a 20  truct,       /* 
21e80 49 4e 2f 4f 55 54 3a 20 43 75 72 72 65 6e 74 20  IN/OUT: Current 
21e90 73 74 72 75 63 74 75 72 65 20 6f 66 20 69 6e 64  structure of ind
21ea0 65 78 20 2a 2f 0a 20 20 69 6e 74 20 6e 4c 65 61  ex */.  int nLea
21eb0 66 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  f               
21ec0 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
21ed0 72 20 6f 66 20 6f 75 74 70 75 74 20 6c 65 61 76  r of output leav
21ee0 65 73 20 6a 75 73 74 20 77 72 69 74 74 65 6e 20  es just written 
21ef0 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 70 2d 3e 72  */.){.  if( p->r
21f00 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
21f10 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e 6e 41 75 74  p->pConfig->nAut
21f20 6f 6d 65 72 67 65 3e 30 20 29 7b 0a 20 20 20 20  omerge>0 ){.    
21f30 46 74 73 35 53 74 72 75 63 74 75 72 65 20 2a 70  Fts5Structure *p
21f40 53 74 72 75 63 74 20 3d 20 2a 70 70 53 74 72 75  Struct = *ppStru
21f50 63 74 3b 0a 20 20 20 20 75 36 34 20 6e 57 72 69  ct;.    u64 nWri
21f60 74 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  te;             
21f70 20 20 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c        /* Initial
21f80 20 76 61 6c 75 65 20 6f 66 20 77 72 69 74 65 2d   value of write-
21f90 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20 69  counter */.    i
21fa0 6e 74 20 6e 57 6f 72 6b 3b 20 20 20 20 20 20 20  nt nWork;       
21fb0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
21fc0 4e 75 6d 62 65 72 20 6f 66 20 77 6f 72 6b 2d 71  Number of work-q
21fd0 75 61 6e 74 61 20 74 6f 20 70 65 72 66 6f 72 6d  uanta to perform
21fe0 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 52 65 6d   */.    int nRem
21ff0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
22000 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
22010 6f 66 20 6c 65 61 66 20 70 61 67 65 73 20 6c 65  of leaf pages le
22020 66 74 20 74 6f 20 77 72 69 74 65 20 2a 2f 0a 0a  ft to write */..
22030 20 20 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68      /* Update th
22040 65 20 77 72 69 74 65 2d 63 6f 75 6e 74 65 72 2e  e write-counter.
22050 20 57 68 69 6c 65 20 64 6f 69 6e 67 20 73 6f 2c   While doing so,
22060 20 73 65 74 20 6e 57 6f 72 6b 2e 20 2a 2f 0a 20   set nWork. */. 
22070 20 20 20 6e 57 72 69 74 65 20 3d 20 70 53 74 72     nWrite = pStr
22080 75 63 74 2d 3e 6e 57 72 69 74 65 43 6f 75 6e 74  uct->nWriteCount
22090 65 72 3b 0a 20 20 20 20 6e 57 6f 72 6b 20 3d 20  er;.    nWork = 
220a0 28 69 6e 74 29 28 28 28 6e 57 72 69 74 65 20 2b  (int)(((nWrite +
220b0 20 6e 4c 65 61 66 29 20 2f 20 70 2d 3e 6e 57 6f   nLeaf) / p->nWo
220c0 72 6b 55 6e 69 74 29 20 2d 20 28 6e 57 72 69 74  rkUnit) - (nWrit
220d0 65 20 2f 20 70 2d 3e 6e 57 6f 72 6b 55 6e 69 74  e / p->nWorkUnit
220e0 29 29 3b 0a 20 20 20 20 70 53 74 72 75 63 74 2d  ));.    pStruct-
220f0 3e 6e 57 72 69 74 65 43 6f 75 6e 74 65 72 20 2b  >nWriteCounter +
22100 3d 20 6e 4c 65 61 66 3b 0a 20 20 20 20 6e 52 65  = nLeaf;.    nRe
22110 6d 20 3d 20 28 69 6e 74 29 28 70 2d 3e 6e 57 6f  m = (int)(p->nWo
22120 72 6b 55 6e 69 74 20 2a 20 6e 57 6f 72 6b 20 2a  rkUnit * nWork *
22130 20 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c   pStruct->nLevel
22140 29 3b 0a 0a 20 20 20 20 66 74 73 35 49 6e 64 65  );..    fts5Inde
22150 78 4d 65 72 67 65 28 70 2c 20 70 70 53 74 72 75  xMerge(p, ppStru
22160 63 74 2c 20 6e 52 65 6d 2c 20 70 2d 3e 70 43 6f  ct, nRem, p->pCo
22170 6e 66 69 67 2d 3e 6e 41 75 74 6f 6d 65 72 67 65  nfig->nAutomerge
22180 29 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63  );.  }.}..static
22190 20 76 6f 69 64 20 66 74 73 35 49 6e 64 65 78 43   void fts5IndexC
221a0 72 69 73 69 73 6d 65 72 67 65 28 0a 20 20 46 74  risismerge(.  Ft
221b0 73 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20  s5Index *p,     
221c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
221d0 20 46 54 53 35 20 62 61 63 6b 65 6e 64 20 6f 62   FTS5 backend ob
221e0 6a 65 63 74 20 2a 2f 0a 20 20 46 74 73 35 53 74  ject */.  Fts5St
221f0 72 75 63 74 75 72 65 20 2a 2a 70 70 53 74 72 75  ructure **ppStru
22200 63 74 20 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f  ct        /* IN/
22210 4f 55 54 3a 20 43 75 72 72 65 6e 74 20 73 74 72  OUT: Current str
22220 75 63 74 75 72 65 20 6f 66 20 69 6e 64 65 78 20  ucture of index 
22230 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 69 6e  */.){.  const in
22240 74 20 6e 43 72 69 73 69 73 20 3d 20 70 2d 3e 70  t nCrisis = p->p
22250 43 6f 6e 66 69 67 2d 3e 6e 43 72 69 73 69 73 4d  Config->nCrisisM
22260 65 72 67 65 3b 0a 20 20 46 74 73 35 53 74 72 75  erge;.  Fts5Stru
22270 63 74 75 72 65 20 2a 70 53 74 72 75 63 74 20 3d  cture *pStruct =
22280 20 2a 70 70 53 74 72 75 63 74 3b 0a 20 20 69 6e   *ppStruct;.  in
22290 74 20 69 4c 76 6c 20 3d 20 30 3b 0a 0a 20 20 61  t iLvl = 0;..  a
222a0 73 73 65 72 74 28 20 70 2d 3e 72 63 21 3d 53 51  ssert( p->rc!=SQ
222b0 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 53 74 72 75  LITE_OK || pStru
222c0 63 74 2d 3e 6e 4c 65 76 65 6c 3e 30 20 29 3b 0a  ct->nLevel>0 );.
222d0 20 20 77 68 69 6c 65 28 20 70 2d 3e 72 63 3d 3d    while( p->rc==
222e0 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 53 74  SQLITE_OK && pSt
222f0 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76  ruct->aLevel[iLv
22300 6c 5d 2e 6e 53 65 67 3e 3d 6e 43 72 69 73 69 73  l].nSeg>=nCrisis
22310 20 29 7b 0a 20 20 20 20 66 74 73 35 49 6e 64 65   ){.    fts5Inde
22320 78 4d 65 72 67 65 4c 65 76 65 6c 28 70 2c 20 26  xMergeLevel(p, &
22330 70 53 74 72 75 63 74 2c 20 69 4c 76 6c 2c 20 30  pStruct, iLvl, 0
22340 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
22350 2d 3e 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc!=SQLITE_OK 
22360 7c 7c 20 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76  || pStruct->nLev
22370 65 6c 3e 28 69 4c 76 6c 2b 31 29 20 29 3b 0a 20  el>(iLvl+1) );. 
22380 20 20 20 66 74 73 35 53 74 72 75 63 74 75 72 65     fts5Structure
22390 50 72 6f 6d 6f 74 65 28 70 2c 20 69 4c 76 6c 2b  Promote(p, iLvl+
223a0 31 2c 20 70 53 74 72 75 63 74 29 3b 0a 20 20 20  1, pStruct);.   
223b0 20 69 4c 76 6c 2b 2b 3b 0a 20 20 7d 0a 20 20 2a   iLvl++;.  }.  *
223c0 70 70 53 74 72 75 63 74 20 3d 20 70 53 74 72 75  ppStruct = pStru
223d0 63 74 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e  ct;.}..static in
223e0 74 20 66 74 73 35 49 6e 64 65 78 52 65 74 75 72  t fts5IndexRetur
223f0 6e 28 46 74 73 35 49 6e 64 65 78 20 2a 70 29 7b  n(Fts5Index *p){
22400 0a 20 20 69 6e 74 20 72 63 20 3d 20 70 2d 3e 72  .  int rc = p->r
22410 63 3b 0a 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c  c;.  p->rc = SQL
22420 49 54 45 5f 4f 4b 3b 0a 20 20 72 65 74 75 72 6e  ITE_OK;.  return
22430 20 72 63 3b 0a 7d 0a 0a 74 79 70 65 64 65 66 20   rc;.}..typedef 
22440 73 74 72 75 63 74 20 46 74 73 35 46 6c 75 73 68  struct Fts5Flush
22450 43 74 78 20 46 74 73 35 46 6c 75 73 68 43 74 78  Ctx Fts5FlushCtx
22460 3b 0a 73 74 72 75 63 74 20 46 74 73 35 46 6c 75  ;.struct Fts5Flu
22470 73 68 43 74 78 20 7b 0a 20 20 46 74 73 35 49 6e  shCtx {.  Fts5In
22480 64 65 78 20 2a 70 49 64 78 3b 0a 20 20 46 74 73  dex *pIdx;.  Fts
22490 35 53 65 67 57 72 69 74 65 72 20 77 72 69 74 65  5SegWriter write
224a0 72 3b 20 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 42 75  r; .};../*.** Bu
224b0 66 66 65 72 20 61 42 75 66 5b 5d 20 63 6f 6e 74  ffer aBuf[] cont
224c0 61 69 6e 73 20 61 20 6c 69 73 74 20 6f 66 20 76  ains a list of v
224d0 61 72 69 6e 74 73 2c 20 61 6c 6c 20 73 6d 61 6c  arints, all smal
224e0 6c 20 65 6e 6f 75 67 68 20 74 6f 20 66 69 74 0a  l enough to fit.
224f0 2a 2a 20 69 6e 20 61 20 33 32 2d 62 69 74 20 69  ** in a 32-bit i
22500 6e 74 65 67 65 72 2e 20 52 65 74 75 72 6e 20 74  nteger. Return t
22510 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6c  he size of the l
22520 61 72 67 65 73 74 20 70 72 65 66 69 78 20 6f 66  argest prefix of
22530 20 74 68 69 73 20 0a 2a 2a 20 6c 69 73 74 20 6e   this .** list n
22540 4d 61 78 20 62 79 74 65 73 20 6f 72 20 6c 65 73  Max bytes or les
22550 73 20 69 6e 20 73 69 7a 65 2e 0a 2a 2f 0a 73 74  s in size..*/.st
22560 61 74 69 63 20 69 6e 74 20 66 74 73 35 50 6f 73  atic int fts5Pos
22570 6c 69 73 74 50 72 65 66 69 78 28 63 6f 6e 73 74  listPrefix(const
22580 20 75 38 20 2a 61 42 75 66 2c 20 69 6e 74 20 6e   u8 *aBuf, int n
22590 4d 61 78 29 7b 0a 20 20 69 6e 74 20 72 65 74 3b  Max){.  int ret;
225a0 0a 20 20 75 33 32 20 64 75 6d 6d 79 3b 0a 20 20  .  u32 dummy;.  
225b0 72 65 74 20 3d 20 66 74 73 35 47 65 74 56 61 72  ret = fts5GetVar
225c0 69 6e 74 33 32 28 61 42 75 66 2c 20 64 75 6d 6d  int32(aBuf, dumm
225d0 79 29 3b 0a 20 20 69 66 28 20 72 65 74 3c 6e 4d  y);.  if( ret<nM
225e0 61 78 20 29 7b 0a 20 20 20 20 77 68 69 6c 65 28  ax ){.    while(
225f0 20 31 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20   1 ){.      int 
22600 69 20 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e  i = fts5GetVarin
22610 74 33 32 28 26 61 42 75 66 5b 72 65 74 5d 2c 20  t32(&aBuf[ret], 
22620 64 75 6d 6d 79 29 3b 0a 20 20 20 20 20 20 69 66  dummy);.      if
22630 28 20 28 72 65 74 20 2b 20 69 29 20 3e 20 6e 4d  ( (ret + i) > nM
22640 61 78 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  ax ) break;.    
22650 20 20 72 65 74 20 2b 3d 20 69 3b 0a 20 20 20 20    ret += i;.    
22660 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  }.  }.  return r
22670 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 6c 75  et;.}../*.** Flu
22680 73 68 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  sh the contents 
22690 6f 66 20 69 6e 2d 6d 65 6d 6f 72 79 20 68 61 73  of in-memory has
226a0 68 20 74 61 62 6c 65 20 69 48 61 73 68 20 74 6f  h table iHash to
226b0 20 61 20 6e 65 77 20 6c 65 76 65 6c 2d 30 20 0a   a new level-0 .
226c0 2a 2a 20 73 65 67 6d 65 6e 74 20 6f 6e 20 64 69  ** segment on di
226d0 73 6b 2e 20 41 6c 73 6f 20 75 70 64 61 74 65 20  sk. Also update 
226e0 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  the correspondin
226f0 67 20 73 74 72 75 63 74 75 72 65 20 72 65 63 6f  g structure reco
22700 72 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  rd..**.** If an 
22710 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 73 65  error occurs, se
22720 74 20 74 68 65 20 46 74 73 35 49 6e 64 65 78 2e  t the Fts5Index.
22730 72 63 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 49  rc error code. I
22740 66 20 61 6e 20 65 72 72 6f 72 20 68 61 73 20 0a  f an error has .
22750 2a 2a 20 61 6c 72 65 61 64 79 20 6f 63 63 75 72  ** already occur
22760 72 65 64 2c 20 74 68 69 73 20 66 75 6e 63 74 69  red, this functi
22770 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a  on is a no-op..*
22780 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  /.static void ft
22790 73 35 46 6c 75 73 68 4f 6e 65 48 61 73 68 28 46  s5FlushOneHash(F
227a0 74 73 35 49 6e 64 65 78 20 2a 70 29 7b 0a 20 20  ts5Index *p){.  
227b0 46 74 73 35 48 61 73 68 20 2a 70 48 61 73 68 20  Fts5Hash *pHash 
227c0 3d 20 70 2d 3e 70 48 61 73 68 3b 0a 20 20 46 74  = p->pHash;.  Ft
227d0 73 35 53 74 72 75 63 74 75 72 65 20 2a 70 53 74  s5Structure *pSt
227e0 72 75 63 74 3b 0a 20 20 69 6e 74 20 69 53 65 67  ruct;.  int iSeg
227f0 69 64 3b 0a 20 20 69 6e 74 20 70 67 6e 6f 4c 61  id;.  int pgnoLa
22800 73 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  st = 0;         
22810 20 20 20 20 20 20 20 20 2f 2a 20 4c 61 73 74 20          /* Last 
22820 6c 65 61 66 20 70 61 67 65 20 6e 75 6d 62 65 72  leaf page number
22830 20 69 6e 20 73 65 67 6d 65 6e 74 20 2a 2f 0a 0a   in segment */..
22840 20 20 2f 2a 20 4f 62 74 61 69 6e 20 61 20 72 65    /* Obtain a re
22850 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20 69  ference to the i
22860 6e 64 65 78 20 73 74 72 75 63 74 75 72 65 20 61  ndex structure a
22870 6e 64 20 61 6c 6c 6f 63 61 74 65 20 61 20 6e 65  nd allocate a ne
22880 77 20 73 65 67 6d 65 6e 74 2d 69 64 0a 20 20 2a  w segment-id.  *
22890 2a 20 66 6f 72 20 74 68 65 20 6e 65 77 20 6c 65  * for the new le
228a0 76 65 6c 2d 30 20 73 65 67 6d 65 6e 74 2e 20 20  vel-0 segment.  
228b0 2a 2f 0a 20 20 70 53 74 72 75 63 74 20 3d 20 66  */.  pStruct = f
228c0 74 73 35 53 74 72 75 63 74 75 72 65 52 65 61 64  ts5StructureRead
228d0 28 70 29 3b 0a 20 20 69 53 65 67 69 64 20 3d 20  (p);.  iSegid = 
228e0 66 74 73 35 41 6c 6c 6f 63 61 74 65 53 65 67 69  fts5AllocateSegi
228f0 64 28 70 2c 20 70 53 74 72 75 63 74 29 3b 0a 20  d(p, pStruct);. 
22900 20 66 74 73 35 53 74 72 75 63 74 75 72 65 49 6e   fts5StructureIn
22910 76 61 6c 69 64 61 74 65 28 70 29 3b 0a 0a 20 20  validate(p);..  
22920 69 66 28 20 69 53 65 67 69 64 20 29 7b 0a 20 20  if( iSegid ){.  
22930 20 20 63 6f 6e 73 74 20 69 6e 74 20 70 67 73 7a    const int pgsz
22940 20 3d 20 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e 70   = p->pConfig->p
22950 67 73 7a 3b 0a 20 20 20 20 69 6e 74 20 65 44 65  gsz;.    int eDe
22960 74 61 69 6c 20 3d 20 70 2d 3e 70 43 6f 6e 66 69  tail = p->pConfi
22970 67 2d 3e 65 44 65 74 61 69 6c 3b 0a 20 20 20 20  g->eDetail;.    
22980 46 74 73 35 53 74 72 75 63 74 75 72 65 53 65 67  Fts5StructureSeg
22990 6d 65 6e 74 20 2a 70 53 65 67 3b 20 20 20 2f 2a  ment *pSeg;   /*
229a0 20 4e 65 77 20 73 65 67 6d 65 6e 74 20 77 69 74   New segment wit
229b0 68 69 6e 20 70 53 74 72 75 63 74 20 2a 2f 0a 20  hin pStruct */. 
229c0 20 20 20 46 74 73 35 42 75 66 66 65 72 20 2a 70     Fts5Buffer *p
229d0 42 75 66 3b 20 20 20 20 20 20 20 20 20 20 20 20  Buf;            
229e0 20 2f 2a 20 42 75 66 66 65 72 20 69 6e 20 77 68   /* Buffer in wh
229f0 69 63 68 20 74 6f 20 61 73 73 65 6d 62 6c 65 20  ich to assemble 
22a00 6c 65 61 66 20 70 61 67 65 20 2a 2f 0a 20 20 20  leaf page */.   
22a10 20 46 74 73 35 42 75 66 66 65 72 20 2a 70 50 67   Fts5Buffer *pPg
22a20 69 64 78 3b 20 20 20 20 20 20 20 20 20 20 20 2f  idx;           /
22a30 2a 20 42 75 66 66 65 72 20 69 6e 20 77 68 69 63  * Buffer in whic
22a40 68 20 74 6f 20 61 73 73 65 6d 62 6c 65 20 70 67  h to assemble pg
22a50 69 64 78 20 2a 2f 0a 0a 20 20 20 20 46 74 73 35  idx */..    Fts5
22a60 53 65 67 57 72 69 74 65 72 20 77 72 69 74 65 72  SegWriter writer
22a70 3b 0a 20 20 20 20 66 74 73 35 57 72 69 74 65 49  ;.    fts5WriteI
22a80 6e 69 74 28 70 2c 20 26 77 72 69 74 65 72 2c 20  nit(p, &writer, 
22a90 69 53 65 67 69 64 29 3b 0a 0a 20 20 20 20 70 42  iSegid);..    pB
22aa0 75 66 20 3d 20 26 77 72 69 74 65 72 2e 77 72 69  uf = &writer.wri
22ab0 74 65 72 2e 62 75 66 3b 0a 20 20 20 20 70 50 67  ter.buf;.    pPg
22ac0 69 64 78 20 3d 20 26 77 72 69 74 65 72 2e 77 72  idx = &writer.wr
22ad0 69 74 65 72 2e 70 67 69 64 78 3b 0a 0a 20 20 20  iter.pgidx;..   
22ae0 20 2f 2a 20 66 74 73 35 57 72 69 74 65 49 6e 69   /* fts5WriteIni
22af0 74 28 29 20 73 68 6f 75 6c 64 20 68 61 76 65 20  t() should have 
22b00 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 68 65 20  initialized the 
22b10 62 75 66 66 65 72 73 20 74 6f 20 28 6d 6f 73 74  buffers to (most
22b20 20 6c 69 6b 65 6c 79 29 0a 20 20 20 20 2a 2a 20   likely).    ** 
22b30 74 68 65 20 6d 61 78 69 6d 75 6d 20 73 70 61 63  the maximum spac
22b40 65 20 72 65 71 75 69 72 65 64 2e 20 2a 2f 0a 20  e required. */. 
22b50 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72 63     assert( p->rc
22b60 20 7c 7c 20 70 42 75 66 2d 3e 6e 53 70 61 63 65   || pBuf->nSpace
22b70 3e 3d 28 70 67 73 7a 20 2b 20 46 54 53 35 5f 44  >=(pgsz + FTS5_D
22b80 41 54 41 5f 50 41 44 44 49 4e 47 29 20 29 3b 0a  ATA_PADDING) );.
22b90 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72      assert( p->r
22ba0 63 20 7c 7c 20 70 50 67 69 64 78 2d 3e 6e 53 70  c || pPgidx->nSp
22bb0 61 63 65 3e 3d 28 70 67 73 7a 20 2b 20 46 54 53  ace>=(pgsz + FTS
22bc0 35 5f 44 41 54 41 5f 50 41 44 44 49 4e 47 29 20  5_DATA_PADDING) 
22bd0 29 3b 0a 0a 20 20 20 20 2f 2a 20 42 65 67 69 6e  );..    /* Begin
22be0 20 73 63 61 6e 6e 69 6e 67 20 74 68 72 6f 75 67   scanning throug
22bf0 68 20 68 61 73 68 20 74 61 62 6c 65 20 65 6e 74  h hash table ent
22c00 72 69 65 73 2e 20 54 68 69 73 20 6c 6f 6f 70 20  ries. This loop 
22c10 72 75 6e 73 20 6f 6e 63 65 20 66 6f 72 20 65 61  runs once for ea
22c20 63 68 0a 20 20 20 20 2a 2a 20 74 65 72 6d 2f 64  ch.    ** term/d
22c30 6f 63 6c 69 73 74 20 63 75 72 72 65 6e 74 6c 79  oclist currently
22c40 20 73 74 6f 72 65 64 20 77 69 74 68 69 6e 20 74   stored within t
22c50 68 65 20 68 61 73 68 20 74 61 62 6c 65 2e 20 2a  he hash table. *
22c60 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d  /.    if( p->rc=
22c70 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
22c80 20 20 20 20 70 2d 3e 72 63 20 3d 20 73 71 6c 69      p->rc = sqli
22c90 74 65 33 46 74 73 35 48 61 73 68 53 63 61 6e 49  te3Fts5HashScanI
22ca0 6e 69 74 28 70 48 61 73 68 2c 20 30 2c 20 30 29  nit(pHash, 0, 0)
22cb0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 77 68 69 6c  ;.    }.    whil
22cc0 65 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  e( p->rc==SQLITE
22cd0 5f 4f 4b 20 26 26 20 30 3d 3d 73 71 6c 69 74 65  _OK && 0==sqlite
22ce0 33 46 74 73 35 48 61 73 68 53 63 61 6e 45 6f 66  3Fts5HashScanEof
22cf0 28 70 48 61 73 68 29 20 29 7b 0a 20 20 20 20 20  (pHash) ){.     
22d00 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 65   const char *zTe
22d10 72 6d 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  rm;          /* 
22d20 42 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e  Buffer containin
22d30 67 20 74 65 72 6d 20 2a 2f 0a 20 20 20 20 20 20  g term */.      
22d40 63 6f 6e 73 74 20 75 38 20 2a 70 44 6f 63 6c 69  const u8 *pDocli
22d50 73 74 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 50  st;         /* P
22d60 6f 69 6e 74 65 72 20 74 6f 20 64 6f 63 6c 69 73  ointer to doclis
22d70 74 20 66 6f 72 20 74 68 69 73 20 74 65 72 6d 20  t for this term 
22d80 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e 44 6f  */.      int nDo
22d90 63 6c 69 73 74 3b 20 20 20 20 20 20 20 20 20 20  clist;          
22da0 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
22db0 64 6f 63 6c 69 73 74 20 69 6e 20 62 79 74 65 73  doclist in bytes
22dc0 20 2a 2f 0a 0a 20 20 20 20 20 20 2f 2a 20 57 72   */..      /* Wr
22dd0 69 74 65 20 74 68 65 20 74 65 72 6d 20 66 6f 72  ite the term for
22de0 20 74 68 69 73 20 65 6e 74 72 79 20 74 6f 20 64   this entry to d
22df0 69 73 6b 2e 20 2a 2f 0a 20 20 20 20 20 20 73 71  isk. */.      sq
22e00 6c 69 74 65 33 46 74 73 35 48 61 73 68 53 63 61  lite3Fts5HashSca
22e10 6e 45 6e 74 72 79 28 70 48 61 73 68 2c 20 26 7a  nEntry(pHash, &z
22e20 54 65 72 6d 2c 20 26 70 44 6f 63 6c 69 73 74 2c  Term, &pDoclist,
22e30 20 26 6e 44 6f 63 6c 69 73 74 29 3b 0a 20 20 20   &nDoclist);.   
22e40 20 20 20 66 74 73 35 57 72 69 74 65 41 70 70 65     fts5WriteAppe
22e50 6e 64 54 65 72 6d 28 70 2c 20 26 77 72 69 74 65  ndTerm(p, &write
22e60 72 2c 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 7a  r, (int)strlen(z
22e70 54 65 72 6d 29 2c 20 28 63 6f 6e 73 74 20 75 38  Term), (const u8
22e80 2a 29 7a 54 65 72 6d 29 3b 0a 20 20 20 20 20 20  *)zTerm);.      
22e90 69 66 28 20 70 2d 3e 72 63 21 3d 53 51 4c 49 54  if( p->rc!=SQLIT
22ea0 45 5f 4f 4b 20 29 20 62 72 65 61 6b 3b 0a 0a 20  E_OK ) break;.. 
22eb0 20 20 20 20 20 61 73 73 65 72 74 28 20 77 72 69       assert( wri
22ec0 74 65 72 2e 62 46 69 72 73 74 52 6f 77 69 64 49  ter.bFirstRowidI
22ed0 6e 50 61 67 65 3d 3d 30 20 29 3b 0a 20 20 20 20  nPage==0 );.    
22ee0 20 20 69 66 28 20 70 67 73 7a 3e 3d 28 70 42 75    if( pgsz>=(pBu
22ef0 66 2d 3e 6e 20 2b 20 70 50 67 69 64 78 2d 3e 6e  f->n + pPgidx->n
22f00 20 2b 20 6e 44 6f 63 6c 69 73 74 20 2b 20 31 29   + nDoclist + 1)
22f10 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54   ){.        /* T
22f20 68 65 20 65 6e 74 69 72 65 20 64 6f 63 6c 69 73  he entire doclis
22f30 74 20 77 69 6c 6c 20 66 69 74 20 6f 6e 20 74 68  t will fit on th
22f40 65 20 63 75 72 72 65 6e 74 20 6c 65 61 66 2e 20  e current leaf. 
22f50 2a 2f 0a 20 20 20 20 20 20 20 20 66 74 73 35 42  */.        fts5B
22f60 75 66 66 65 72 53 61 66 65 41 70 70 65 6e 64 42  ufferSafeAppendB
22f70 6c 6f 62 28 70 42 75 66 2c 20 70 44 6f 63 6c 69  lob(pBuf, pDocli
22f80 73 74 2c 20 6e 44 6f 63 6c 69 73 74 29 3b 0a 20  st, nDoclist);. 
22f90 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
22fa0 20 20 20 20 69 36 34 20 69 52 6f 77 69 64 20 3d      i64 iRowid =
22fb0 20 30 3b 0a 20 20 20 20 20 20 20 20 69 36 34 20   0;.        i64 
22fc0 69 44 65 6c 74 61 20 3d 20 30 3b 0a 20 20 20 20  iDelta = 0;.    
22fd0 20 20 20 20 69 6e 74 20 69 4f 66 66 20 3d 20 30      int iOff = 0
22fe0 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ;..        /* Th
22ff0 65 20 65 6e 74 69 72 65 20 64 6f 63 6c 69 73 74  e entire doclist
23000 20 77 69 6c 6c 20 6e 6f 74 20 66 69 74 20 6f 6e   will not fit on
23010 20 74 68 69 73 20 6c 65 61 66 2e 20 54 68 65 20   this leaf. The 
23020 66 6f 6c 6c 6f 77 69 6e 67 20 0a 20 20 20 20 20  following .     
23030 20 20 20 2a 2a 20 6c 6f 6f 70 20 69 74 65 72 61     ** loop itera
23040 74 65 73 20 74 68 72 6f 75 67 68 20 74 68 65 20  tes through the 
23050 70 6f 73 6c 69 73 74 73 20 74 68 61 74 20 6d 61  poslists that ma
23060 6b 65 20 75 70 20 74 68 65 20 63 75 72 72 65 6e  ke up the curren
23070 74 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 64 6f  t .        ** do
23080 63 6c 69 73 74 2e 20 20 2a 2f 0a 20 20 20 20 20  clist.  */.     
23090 20 20 20 77 68 69 6c 65 28 20 70 2d 3e 72 63 3d     while( p->rc=
230a0 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 4f  =SQLITE_OK && iO
230b0 66 66 3c 6e 44 6f 63 6c 69 73 74 20 29 7b 0a 20  ff<nDoclist ){. 
230c0 20 20 20 20 20 20 20 20 20 69 4f 66 66 20 2b 3d           iOff +=
230d0 20 66 74 73 35 47 65 74 56 61 72 69 6e 74 28 26   fts5GetVarint(&
230e0 70 44 6f 63 6c 69 73 74 5b 69 4f 66 66 5d 2c 20  pDoclist[iOff], 
230f0 28 75 36 34 2a 29 26 69 44 65 6c 74 61 29 3b 0a  (u64*)&iDelta);.
23100 20 20 20 20 20 20 20 20 20 20 69 52 6f 77 69 64            iRowid
23110 20 2b 3d 20 69 44 65 6c 74 61 3b 0a 20 20 20 20   += iDelta;.    
23120 20 20 20 20 20 20 0a 20 20 20 20 20 20 20 20 20        .         
23130 20 69 66 28 20 77 72 69 74 65 72 2e 62 46 69 72   if( writer.bFir
23140 73 74 52 6f 77 69 64 49 6e 50 61 67 65 20 29 7b  stRowidInPage ){
23150 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 74 73  .            fts
23160 35 50 75 74 55 31 36 28 26 70 42 75 66 2d 3e 70  5PutU16(&pBuf->p
23170 5b 30 5d 2c 20 28 75 31 36 29 70 42 75 66 2d 3e  [0], (u16)pBuf->
23180 6e 29 3b 20 20 20 2f 2a 20 66 69 72 73 74 20 72  n);   /* first r
23190 6f 77 69 64 20 6f 6e 20 70 61 67 65 20 2a 2f 0a  owid on page */.
231a0 20 20 20 20 20 20 20 20 20 20 20 20 70 42 75 66              pBuf
231b0 2d 3e 6e 20 2b 3d 20 73 71 6c 69 74 65 33 46 74  ->n += sqlite3Ft
231c0 73 35 50 75 74 56 61 72 69 6e 74 28 26 70 42 75  s5PutVarint(&pBu
231d0 66 2d 3e 70 5b 70 42 75 66 2d 3e 6e 5d 2c 20 69  f->p[pBuf->n], i
231e0 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 20 20  Rowid);.        
231f0 20 20 20 20 77 72 69 74 65 72 2e 62 46 69 72 73      writer.bFirs
23200 74 52 6f 77 69 64 49 6e 50 61 67 65 20 3d 20 30  tRowidInPage = 0
23210 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 74  ;.            ft
23220 73 35 57 72 69 74 65 44 6c 69 64 78 41 70 70 65  s5WriteDlidxAppe
23230 6e 64 28 70 2c 20 26 77 72 69 74 65 72 2c 20 69  nd(p, &writer, i
23240 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 20 20  Rowid);.        
23250 20 20 20 20 69 66 28 20 70 2d 3e 72 63 21 3d 53      if( p->rc!=S
23260 51 4c 49 54 45 5f 4f 4b 20 29 20 62 72 65 61 6b  QLITE_OK ) break
23270 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73  ;.          }els
23280 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  e{.            p
23290 42 75 66 2d 3e 6e 20 2b 3d 20 73 71 6c 69 74 65  Buf->n += sqlite
232a0 33 46 74 73 35 50 75 74 56 61 72 69 6e 74 28 26  3Fts5PutVarint(&
232b0 70 42 75 66 2d 3e 70 5b 70 42 75 66 2d 3e 6e 5d  pBuf->p[pBuf->n]
232c0 2c 20 69 44 65 6c 74 61 29 3b 0a 20 20 20 20 20  , iDelta);.     
232d0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
232e0 20 61 73 73 65 72 74 28 20 70 42 75 66 2d 3e 6e   assert( pBuf->n
232f0 3c 3d 70 42 75 66 2d 3e 6e 53 70 61 63 65 20 29  <=pBuf->nSpace )
23300 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ;..          if(
23310 20 65 44 65 74 61 69 6c 3d 3d 46 54 53 35 5f 44   eDetail==FTS5_D
23320 45 54 41 49 4c 5f 4e 4f 4e 45 20 29 7b 0a 20 20  ETAIL_NONE ){.  
23330 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69 4f            if( iO
23340 66 66 3c 6e 44 6f 63 6c 69 73 74 20 26 26 20 70  ff<nDoclist && p
23350 44 6f 63 6c 69 73 74 5b 69 4f 66 66 5d 3d 3d 30  Doclist[iOff]==0
23360 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
23370 20 20 70 42 75 66 2d 3e 70 5b 70 42 75 66 2d 3e    pBuf->p[pBuf->
23380 6e 2b 2b 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20  n++] = 0;.      
23390 20 20 20 20 20 20 20 20 69 4f 66 66 2b 2b 3b 0a          iOff++;.
233a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
233b0 28 20 69 4f 66 66 3c 6e 44 6f 63 6c 69 73 74 20  ( iOff<nDoclist 
233c0 26 26 20 70 44 6f 63 6c 69 73 74 5b 69 4f 66 66  && pDoclist[iOff
233d0 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  ]==0 ){.        
233e0 20 20 20 20 20 20 20 20 70 42 75 66 2d 3e 70 5b          pBuf->p[
233f0 70 42 75 66 2d 3e 6e 2b 2b 5d 20 3d 20 30 3b 0a  pBuf->n++] = 0;.
23400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23410 69 4f 66 66 2b 2b 3b 0a 20 20 20 20 20 20 20 20  iOff++;.        
23420 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
23430 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
23440 20 20 69 66 28 20 28 70 42 75 66 2d 3e 6e 20 2b    if( (pBuf->n +
23450 20 70 50 67 69 64 78 2d 3e 6e 29 3e 3d 70 67 73   pPgidx->n)>=pgs
23460 7a 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  z ){.           
23470 20 20 20 66 74 73 35 57 72 69 74 65 46 6c 75 73     fts5WriteFlus
23480 68 4c 65 61 66 28 70 2c 20 26 77 72 69 74 65 72  hLeaf(p, &writer
23490 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  );.            }
234a0 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65  .          }else
234b0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 6e  {.            in
234c0 74 20 62 44 75 6d 6d 79 3b 0a 20 20 20 20 20 20  t bDummy;.      
234d0 20 20 20 20 20 20 69 6e 74 20 6e 50 6f 73 3b 0a        int nPos;.
234e0 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20              int 
234f0 6e 43 6f 70 79 20 3d 20 66 74 73 35 47 65 74 50  nCopy = fts5GetP
23500 6f 73 6c 69 73 74 53 69 7a 65 28 26 70 44 6f 63  oslistSize(&pDoc
23510 6c 69 73 74 5b 69 4f 66 66 5d 2c 20 26 6e 50 6f  list[iOff], &nPo
23520 73 2c 20 26 62 44 75 6d 6d 79 29 3b 0a 20 20 20  s, &bDummy);.   
23530 20 20 20 20 20 20 20 20 20 6e 43 6f 70 79 20 2b           nCopy +
23540 3d 20 6e 50 6f 73 3b 0a 20 20 20 20 20 20 20 20  = nPos;.        
23550 20 20 20 20 69 66 28 20 28 70 42 75 66 2d 3e 6e      if( (pBuf->n
23560 20 2b 20 70 50 67 69 64 78 2d 3e 6e 20 2b 20 6e   + pPgidx->n + n
23570 43 6f 70 79 29 20 3c 3d 20 70 67 73 7a 20 29 7b  Copy) <= pgsz ){
23580 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  .              /
23590 2a 20 54 68 65 20 65 6e 74 69 72 65 20 70 6f 73  * The entire pos
235a0 6c 69 73 74 20 77 69 6c 6c 20 66 69 74 20 6f 6e  list will fit on
235b0 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c 65 61   the current lea
235c0 66 2e 20 53 6f 20 63 6f 70 79 0a 20 20 20 20 20  f. So copy.     
235d0 20 20 20 20 20 20 20 20 20 2a 2a 20 69 74 20 69           ** it i
235e0 6e 20 6f 6e 65 20 67 6f 2e 20 2a 2f 0a 20 20 20  n one go. */.   
235f0 20 20 20 20 20 20 20 20 20 20 20 66 74 73 35 42             fts5B
23600 75 66 66 65 72 53 61 66 65 41 70 70 65 6e 64 42  ufferSafeAppendB
23610 6c 6f 62 28 70 42 75 66 2c 20 26 70 44 6f 63 6c  lob(pBuf, &pDocl
23620 69 73 74 5b 69 4f 66 66 5d 2c 20 6e 43 6f 70 79  ist[iOff], nCopy
23630 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  );.            }
23640 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
23650 20 20 20 20 2f 2a 20 54 68 65 20 65 6e 74 69 72      /* The entir
23660 65 20 70 6f 73 6c 69 73 74 20 77 69 6c 6c 20 6e  e poslist will n
23670 6f 74 20 66 69 74 20 6f 6e 20 74 68 69 73 20 6c  ot fit on this l
23680 65 61 66 2e 20 53 6f 20 69 74 20 6e 65 65 64 73  eaf. So it needs
23690 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a  .              *
236a0 2a 20 74 6f 20 62 65 20 62 72 6f 6b 65 6e 20 69  * to be broken i
236b0 6e 74 6f 20 73 65 63 74 69 6f 6e 73 2e 20 54 68  nto sections. Th
236c0 65 20 6f 6e 6c 79 20 71 75 61 6c 69 66 69 63 61  e only qualifica
236d0 74 69 6f 6e 20 62 65 69 6e 67 0a 20 20 20 20 20  tion being.     
236e0 20 20 20 20 20 20 20 20 20 2a 2a 20 74 68 61 74           ** that
236f0 20 65 61 63 68 20 76 61 72 69 6e 74 20 6d 75 73   each varint mus
23700 74 20 62 65 20 73 74 6f 72 65 64 20 63 6f 6e 74  t be stored cont
23710 69 67 75 6f 75 73 6c 79 2e 20 20 2a 2f 0a 20 20  iguously.  */.  
23720 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 73              cons
23730 74 20 75 38 20 2a 70 50 6f 73 6c 69 73 74 20 3d  t u8 *pPoslist =
23740 20 26 70 44 6f 63 6c 69 73 74 5b 69 4f 66 66 5d   &pDoclist[iOff]
23750 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
23760 69 6e 74 20 69 50 6f 73 20 3d 20 30 3b 0a 20 20  int iPos = 0;.  
23770 20 20 20 20 20 20 20 20 20 20 20 20 77 68 69 6c              whil
23780 65 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  e( p->rc==SQLITE
23790 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
237a0 20 20 20 20 20 20 20 69 6e 74 20 6e 53 70 61 63         int nSpac
237b0 65 20 3d 20 70 67 73 7a 20 2d 20 70 42 75 66 2d  e = pgsz - pBuf-
237c0 3e 6e 20 2d 20 70 50 67 69 64 78 2d 3e 6e 3b 0a  >n - pPgidx->n;.
237d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
237e0 69 6e 74 20 6e 20 3d 20 30 3b 0a 20 20 20 20 20  int n = 0;.     
237f0 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 28             if( (
23800 6e 43 6f 70 79 20 2d 20 69 50 6f 73 29 3c 3d 6e  nCopy - iPos)<=n
23810 53 70 61 63 65 20 29 7b 0a 20 20 20 20 20 20 20  Space ){.       
23820 20 20 20 20 20 20 20 20 20 20 20 6e 20 3d 20 6e             n = n
23830 43 6f 70 79 20 2d 20 69 50 6f 73 3b 0a 20 20 20  Copy - iPos;.   
23840 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 65 6c               }el
23850 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
23860 20 20 20 20 20 20 6e 20 3d 20 66 74 73 35 50 6f        n = fts5Po
23870 73 6c 69 73 74 50 72 65 66 69 78 28 26 70 50 6f  slistPrefix(&pPo
23880 73 6c 69 73 74 5b 69 50 6f 73 5d 2c 20 6e 53 70  slist[iPos], nSp
23890 61 63 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ace);.          
238a0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
238b0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
238c0 6e 3e 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20  n>0 );.         
238d0 20 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65         fts5Buffe
238e0 72 53 61 66 65 41 70 70 65 6e 64 42 6c 6f 62 28  rSafeAppendBlob(
238f0 70 42 75 66 2c 20 26 70 50 6f 73 6c 69 73 74 5b  pBuf, &pPoslist[
23900 69 50 6f 73 5d 2c 20 6e 29 3b 0a 20 20 20 20 20  iPos], n);.     
23910 20 20 20 20 20 20 20 20 20 20 20 69 50 6f 73 20             iPos 
23920 2b 3d 20 6e 3b 0a 20 20 20 20 20 20 20 20 20 20  += n;.          
23930 20 20 20 20 20 20 69 66 28 20 28 70 42 75 66 2d        if( (pBuf-
23940 3e 6e 20 2b 20 70 50 67 69 64 78 2d 3e 6e 29 3e  >n + pPgidx->n)>
23950 3d 70 67 73 7a 20 29 7b 0a 20 20 20 20 20 20 20  =pgsz ){.       
23960 20 20 20 20 20 20 20 20 20 20 20 66 74 73 35 57             fts5W
23970 72 69 74 65 46 6c 75 73 68 4c 65 61 66 28 70 2c  riteFlushLeaf(p,
23980 20 26 77 72 69 74 65 72 29 3b 0a 20 20 20 20 20   &writer);.     
23990 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
239a0 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28               if(
239b0 20 69 50 6f 73 3e 3d 6e 43 6f 70 79 20 29 20 62   iPos>=nCopy ) b
239c0 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  reak;.          
239d0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
239e0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
239f0 69 4f 66 66 20 2b 3d 20 6e 43 6f 70 79 3b 0a 20  iOff += nCopy;. 
23a00 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
23a10 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20     }.      }..  
23a20 20 20 20 20 2f 2a 20 54 4f 44 4f 32 3a 20 44 6f      /* TODO2: Do
23a30 63 6c 69 73 74 20 74 65 72 6d 69 6e 61 74 6f 72  clist terminator
23a40 20 77 72 69 74 74 65 6e 20 68 65 72 65 2e 20 2a   written here. *
23a50 2f 0a 20 20 20 20 20 20 2f 2a 20 70 42 75 66 2d  /.      /* pBuf-
23a60 3e 70 5b 70 42 75 66 2d 3e 6e 2b 2b 5d 20 3d 20  >p[pBuf->n++] = 
23a70 27 5c 30 27 3b 20 2a 2f 0a 20 20 20 20 20 20 61  '\0'; */.      a
23a80 73 73 65 72 74 28 20 70 42 75 66 2d 3e 6e 3c 3d  ssert( pBuf->n<=
23a90 70 42 75 66 2d 3e 6e 53 70 61 63 65 20 29 3b 0a  pBuf->nSpace );.
23aa0 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d        if( p->rc=
23ab0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 73 71 6c  =SQLITE_OK ) sql
23ac0 69 74 65 33 46 74 73 35 48 61 73 68 53 63 61 6e  ite3Fts5HashScan
23ad0 4e 65 78 74 28 70 48 61 73 68 29 3b 0a 20 20 20  Next(pHash);.   
23ae0 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 46 74   }.    sqlite3Ft
23af0 73 35 48 61 73 68 43 6c 65 61 72 28 70 48 61 73  s5HashClear(pHas
23b00 68 29 3b 0a 20 20 20 20 66 74 73 35 57 72 69 74  h);.    fts5Writ
23b10 65 46 69 6e 69 73 68 28 70 2c 20 26 77 72 69 74  eFinish(p, &writ
23b20 65 72 2c 20 26 70 67 6e 6f 4c 61 73 74 29 3b 0a  er, &pgnoLast);.
23b30 0a 20 20 20 20 2f 2a 20 55 70 64 61 74 65 20 74  .    /* Update t
23b40 68 65 20 46 74 73 35 53 74 72 75 63 74 75 72 65  he Fts5Structure
23b50 2e 20 49 74 20 69 73 20 77 72 69 74 74 65 6e 20  . It is written 
23b60 62 61 63 6b 20 74 6f 20 74 68 65 20 64 61 74 61  back to the data
23b70 62 61 73 65 20 62 79 20 74 68 65 0a 20 20 20 20  base by the.    
23b80 2a 2a 20 66 74 73 35 53 74 72 75 63 74 75 72 65  ** fts5Structure
23b90 52 65 6c 65 61 73 65 28 29 20 63 61 6c 6c 20 62  Release() call b
23ba0 65 6c 6f 77 2e 20 20 2a 2f 0a 20 20 20 20 69 66  elow.  */.    if
23bb0 28 20 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65  ( pStruct->nLeve
23bc0 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 66 74  l==0 ){.      ft
23bd0 73 35 53 74 72 75 63 74 75 72 65 41 64 64 4c 65  s5StructureAddLe
23be0 76 65 6c 28 26 70 2d 3e 72 63 2c 20 26 70 53 74  vel(&p->rc, &pSt
23bf0 72 75 63 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ruct);.    }.   
23c00 20 66 74 73 35 53 74 72 75 63 74 75 72 65 45 78   fts5StructureEx
23c10 74 65 6e 64 4c 65 76 65 6c 28 26 70 2d 3e 72 63  tendLevel(&p->rc
23c20 2c 20 70 53 74 72 75 63 74 2c 20 30 2c 20 31 2c  , pStruct, 0, 1,
23c30 20 30 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e   0);.    if( p->
23c40 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
23c50 0a 20 20 20 20 20 20 70 53 65 67 20 3d 20 26 70  .      pSeg = &p
23c60 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 30  Struct->aLevel[0
23c70 5d 2e 61 53 65 67 5b 20 70 53 74 72 75 63 74 2d  ].aSeg[ pStruct-
23c80 3e 61 4c 65 76 65 6c 5b 30 5d 2e 6e 53 65 67 2b  >aLevel[0].nSeg+
23c90 2b 20 5d 3b 0a 20 20 20 20 20 20 70 53 65 67 2d  + ];.      pSeg-
23ca0 3e 69 53 65 67 69 64 20 3d 20 69 53 65 67 69 64  >iSegid = iSegid
23cb0 3b 0a 20 20 20 20 20 20 70 53 65 67 2d 3e 70 67  ;.      pSeg->pg
23cc0 6e 6f 46 69 72 73 74 20 3d 20 31 3b 0a 20 20 20  noFirst = 1;.   
23cd0 20 20 20 70 53 65 67 2d 3e 70 67 6e 6f 4c 61 73     pSeg->pgnoLas
23ce0 74 20 3d 20 70 67 6e 6f 4c 61 73 74 3b 0a 20 20  t = pgnoLast;.  
23cf0 20 20 20 20 70 53 74 72 75 63 74 2d 3e 6e 53 65      pStruct->nSe
23d00 67 6d 65 6e 74 2b 2b 3b 0a 20 20 20 20 7d 0a 20  gment++;.    }. 
23d10 20 20 20 66 74 73 35 53 74 72 75 63 74 75 72 65     fts5Structure
23d20 50 72 6f 6d 6f 74 65 28 70 2c 20 30 2c 20 70 53  Promote(p, 0, pS
23d30 74 72 75 63 74 29 3b 0a 20 20 7d 0a 0a 20 20 66  truct);.  }..  f
23d40 74 73 35 49 6e 64 65 78 41 75 74 6f 6d 65 72 67  ts5IndexAutomerg
23d50 65 28 70 2c 20 26 70 53 74 72 75 63 74 2c 20 70  e(p, &pStruct, p
23d60 67 6e 6f 4c 61 73 74 29 3b 0a 20 20 66 74 73 35  gnoLast);.  fts5
23d70 49 6e 64 65 78 43 72 69 73 69 73 6d 65 72 67 65  IndexCrisismerge
23d80 28 70 2c 20 26 70 53 74 72 75 63 74 29 3b 0a 20  (p, &pStruct);. 
23d90 20 66 74 73 35 53 74 72 75 63 74 75 72 65 57 72   fts5StructureWr
23da0 69 74 65 28 70 2c 20 70 53 74 72 75 63 74 29 3b  ite(p, pStruct);
23db0 0a 20 20 66 74 73 35 53 74 72 75 63 74 75 72 65  .  fts5Structure
23dc0 52 65 6c 65 61 73 65 28 70 53 74 72 75 63 74 29  Release(pStruct)
23dd0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 6c 75 73 68  ;.}../*.** Flush
23de0 20 61 6e 79 20 64 61 74 61 20 73 74 6f 72 65 64   any data stored
23df0 20 69 6e 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72   in the in-memor
23e00 79 20 68 61 73 68 20 74 61 62 6c 65 73 20 74 6f  y hash tables to
23e10 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a   the database..*
23e20 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  /.static void ft
23e30 73 35 49 6e 64 65 78 46 6c 75 73 68 28 46 74 73  s5IndexFlush(Fts
23e40 35 49 6e 64 65 78 20 2a 70 29 7b 0a 20 20 2f 2a  5Index *p){.  /*
23e50 20 55 6e 6c 65 73 73 20 69 74 20 69 73 20 65 6d   Unless it is em
23e60 70 74 79 2c 20 66 6c 75 73 68 20 74 68 65 20 68  pty, flush the h
23e70 61 73 68 20 74 61 62 6c 65 20 74 6f 20 64 69 73  ash table to dis
23e80 6b 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 6e 50  k */.  if( p->nP
23e90 65 6e 64 69 6e 67 44 61 74 61 20 29 7b 0a 20 20  endingData ){.  
23ea0 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 48 61    assert( p->pHa
23eb0 73 68 20 29 3b 0a 20 20 20 20 70 2d 3e 6e 50 65  sh );.    p->nPe
23ec0 6e 64 69 6e 67 44 61 74 61 20 3d 20 30 3b 0a 20  ndingData = 0;. 
23ed0 20 20 20 66 74 73 35 46 6c 75 73 68 4f 6e 65 48     fts5FlushOneH
23ee0 61 73 68 28 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 73  ash(p);.  }.}..s
23ef0 74 61 74 69 63 20 46 74 73 35 53 74 72 75 63 74  tatic Fts5Struct
23f00 75 72 65 20 2a 66 74 73 35 49 6e 64 65 78 4f 70  ure *fts5IndexOp
23f10 74 69 6d 69 7a 65 53 74 72 75 63 74 28 0a 20 20  timizeStruct(.  
23f20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 0a 20  Fts5Index *p, . 
23f30 20 46 74 73 35 53 74 72 75 63 74 75 72 65 20 2a   Fts5Structure *
23f40 70 53 74 72 75 63 74 0a 29 7b 0a 20 20 46 74 73  pStruct.){.  Fts
23f50 35 53 74 72 75 63 74 75 72 65 20 2a 70 4e 65 77  5Structure *pNew
23f60 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f   = 0;.  sqlite3_
23f70 69 6e 74 36 34 20 6e 42 79 74 65 20 3d 20 73 69  int64 nByte = si
23f80 7a 65 6f 66 28 46 74 73 35 53 74 72 75 63 74 75  zeof(Fts5Structu
23f90 72 65 29 3b 0a 20 20 69 6e 74 20 6e 53 65 67 20  re);.  int nSeg 
23fa0 3d 20 70 53 74 72 75 63 74 2d 3e 6e 53 65 67 6d  = pStruct->nSegm
23fb0 65 6e 74 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20  ent;.  int i;.. 
23fc0 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20 69   /* Figure out i
23fd0 66 20 74 68 69 73 20 73 74 72 75 63 74 75 72 65  f this structure
23fe0 20 72 65 71 75 69 72 65 73 20 6f 70 74 69 6d 69   requires optimi
23ff0 7a 61 74 69 6f 6e 2e 20 41 20 73 74 72 75 63 74  zation. A struct
24000 75 72 65 20 64 6f 65 73 0a 20 20 2a 2a 20 6e 6f  ure does.  ** no
24010 74 20 72 65 71 75 69 72 65 20 6f 70 74 69 6d 69  t require optimi
24020 7a 61 74 69 6f 6e 20 69 66 20 65 69 74 68 65 72  zation if either
24030 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 2b 20 69  :.  **.  **  + i
24040 74 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 66 65  t consists of fe
24050 77 65 72 20 74 68 61 6e 20 74 77 6f 20 73 65 67  wer than two seg
24060 6d 65 6e 74 73 2c 20 6f 72 20 0a 20 20 2a 2a 20  ments, or .  ** 
24070 20 2b 20 61 6c 6c 20 73 65 67 6d 65 6e 74 73 20   + all segments 
24080 61 72 65 20 6f 6e 20 74 68 65 20 73 61 6d 65 20  are on the same 
24090 6c 65 76 65 6c 2c 20 6f 72 0a 20 20 2a 2a 20 20  level, or.  **  
240a0 2b 20 61 6c 6c 20 73 65 67 6d 65 6e 74 73 20 65  + all segments e
240b0 78 63 65 70 74 20 6f 6e 65 20 61 72 65 20 63 75  xcept one are cu
240c0 72 72 65 6e 74 6c 79 20 69 6e 70 75 74 73 20 74  rrently inputs t
240d0 6f 20 61 20 6d 65 72 67 65 20 6f 70 65 72 61 74  o a merge operat
240e0 69 6f 6e 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49  ion..  **.  ** I
240f0 6e 20 74 68 65 20 66 69 72 73 74 20 63 61 73 65  n the first case
24100 2c 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 20 49  , return NULL. I
24110 6e 20 74 68 65 20 73 65 63 6f 6e 64 2c 20 69 6e  n the second, in
24120 63 72 65 6d 65 6e 74 20 74 68 65 20 72 65 66 2d  crement the ref-
24130 63 6f 75 6e 74 0a 20 20 2a 2a 20 6f 6e 20 2a 70  count.  ** on *p
24140 53 74 72 75 63 74 20 61 6e 64 20 72 65 74 75 72  Struct and retur
24150 6e 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20  n a copy of the 
24160 70 6f 69 6e 74 65 72 20 74 6f 20 69 74 2e 0a 20  pointer to it.. 
24170 20 2a 2f 0a 20 20 69 66 28 20 6e 53 65 67 3c 32   */.  if( nSeg<2
24180 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 66   ) return 0;.  f
24190 6f 72 28 69 3d 30 3b 20 69 3c 70 53 74 72 75 63  or(i=0; i<pStruc
241a0 74 2d 3e 6e 4c 65 76 65 6c 3b 20 69 2b 2b 29 7b  t->nLevel; i++){
241b0 0a 20 20 20 20 69 6e 74 20 6e 54 68 69 73 20 3d  .    int nThis =
241c0 20 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c   pStruct->aLevel
241d0 5b 69 5d 2e 6e 53 65 67 3b 0a 20 20 20 20 69 66  [i].nSeg;.    if
241e0 28 20 6e 54 68 69 73 3d 3d 6e 53 65 67 20 7c 7c  ( nThis==nSeg ||
241f0 20 28 6e 54 68 69 73 3d 3d 6e 53 65 67 2d 31 20   (nThis==nSeg-1 
24200 26 26 20 70 53 74 72 75 63 74 2d 3e 61 4c 65 76  && pStruct->aLev
24210 65 6c 5b 69 5d 2e 6e 4d 65 72 67 65 3d 3d 6e 54  el[i].nMerge==nT
24220 68 69 73 29 20 29 7b 0a 20 20 20 20 20 20 66 74  his) ){.      ft
24230 73 35 53 74 72 75 63 74 75 72 65 52 65 66 28 70  s5StructureRef(p
24240 53 74 72 75 63 74 29 3b 0a 20 20 20 20 20 20 72  Struct);.      r
24250 65 74 75 72 6e 20 70 53 74 72 75 63 74 3b 0a 20  eturn pStruct;. 
24260 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28     }.    assert(
24270 20 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c   pStruct->aLevel
24280 5b 69 5d 2e 6e 4d 65 72 67 65 3c 3d 6e 54 68 69  [i].nMerge<=nThi
24290 73 20 29 3b 0a 20 20 7d 0a 0a 20 20 6e 42 79 74  s );.  }..  nByt
242a0 65 20 2b 3d 20 28 70 53 74 72 75 63 74 2d 3e 6e  e += (pStruct->n
242b0 4c 65 76 65 6c 2b 31 29 20 2a 20 73 69 7a 65 6f  Level+1) * sizeo
242c0 66 28 46 74 73 35 53 74 72 75 63 74 75 72 65 4c  f(Fts5StructureL
242d0 65 76 65 6c 29 3b 0a 20 20 70 4e 65 77 20 3d 20  evel);.  pNew = 
242e0 28 46 74 73 35 53 74 72 75 63 74 75 72 65 2a 29  (Fts5Structure*)
242f0 73 71 6c 69 74 65 33 46 74 73 35 4d 61 6c 6c 6f  sqlite3Fts5Mallo
24300 63 5a 65 72 6f 28 26 70 2d 3e 72 63 2c 20 6e 42  cZero(&p->rc, nB
24310 79 74 65 29 3b 0a 0a 20 20 69 66 28 20 70 4e 65  yte);..  if( pNe
24320 77 20 29 7b 0a 20 20 20 20 46 74 73 35 53 74 72  w ){.    Fts5Str
24330 75 63 74 75 72 65 4c 65 76 65 6c 20 2a 70 4c 76  uctureLevel *pLv
24340 6c 3b 0a 20 20 20 20 6e 42 79 74 65 20 3d 20 6e  l;.    nByte = n
24350 53 65 67 20 2a 20 73 69 7a 65 6f 66 28 46 74 73  Seg * sizeof(Fts
24360 35 53 74 72 75 63 74 75 72 65 53 65 67 6d 65 6e  5StructureSegmen
24370 74 29 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 4c  t);.    pNew->nL
24380 65 76 65 6c 20 3d 20 70 53 74 72 75 63 74 2d 3e  evel = pStruct->
24390 6e 4c 65 76 65 6c 2b 31 3b 0a 20 20 20 20 70 4e  nLevel+1;.    pN
243a0 65 77 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20  ew->nRef = 1;.  
243b0 20 20 70 4e 65 77 2d 3e 6e 57 72 69 74 65 43 6f    pNew->nWriteCo
243c0 75 6e 74 65 72 20 3d 20 70 53 74 72 75 63 74 2d  unter = pStruct-
243d0 3e 6e 57 72 69 74 65 43 6f 75 6e 74 65 72 3b 0a  >nWriteCounter;.
243e0 20 20 20 20 70 4c 76 6c 20 3d 20 26 70 4e 65 77      pLvl = &pNew
243f0 2d 3e 61 4c 65 76 65 6c 5b 70 53 74 72 75 63 74  ->aLevel[pStruct
24400 2d 3e 6e 4c 65 76 65 6c 5d 3b 0a 20 20 20 20 70  ->nLevel];.    p
24410 4c 76 6c 2d 3e 61 53 65 67 20 3d 20 28 46 74 73  Lvl->aSeg = (Fts
24420 35 53 74 72 75 63 74 75 72 65 53 65 67 6d 65 6e  5StructureSegmen
24430 74 2a 29 73 71 6c 69 74 65 33 46 74 73 35 4d 61  t*)sqlite3Fts5Ma
24440 6c 6c 6f 63 5a 65 72 6f 28 26 70 2d 3e 72 63 2c  llocZero(&p->rc,
24450 20 6e 42 79 74 65 29 3b 0a 20 20 20 20 69 66 28   nByte);.    if(
24460 20 70 4c 76 6c 2d 3e 61 53 65 67 20 29 7b 0a 20   pLvl->aSeg ){. 
24470 20 20 20 20 20 69 6e 74 20 69 4c 76 6c 2c 20 69       int iLvl, i
24480 53 65 67 3b 0a 20 20 20 20 20 20 69 6e 74 20 69  Seg;.      int i
24490 53 65 67 4f 75 74 20 3d 20 30 3b 0a 20 20 20 20  SegOut = 0;.    
244a0 20 20 2f 2a 20 49 74 65 72 61 74 65 20 74 68 72    /* Iterate thr
244b0 6f 75 67 68 20 61 6c 6c 20 73 65 67 6d 65 6e 74  ough all segment
244c0 73 2c 20 66 72 6f 6d 20 6f 6c 64 65 73 74 20 74  s, from oldest t
244d0 6f 20 6e 65 77 65 73 74 2e 20 41 64 64 20 74 68  o newest. Add th
244e0 65 6d 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 74  em to.      ** t
244f0 68 65 20 6e 65 77 20 46 74 73 35 4c 65 76 65 6c  he new Fts5Level
24500 20 6f 62 6a 65 63 74 20 73 6f 20 74 68 61 74 20   object so that 
24510 70 4c 76 6c 2d 3e 61 53 65 67 5b 30 5d 20 69 73  pLvl->aSeg[0] is
24520 20 74 68 65 20 6f 6c 64 65 73 74 0a 20 20 20 20   the oldest.    
24530 20 20 2a 2a 20 73 65 67 6d 65 6e 74 20 69 6e 20    ** segment in 
24540 74 68 65 20 64 61 74 61 20 73 74 72 75 63 74 75  the data structu
24550 72 65 2e 20 20 2a 2f 0a 20 20 20 20 20 20 66 6f  re.  */.      fo
24560 72 28 69 4c 76 6c 3d 70 53 74 72 75 63 74 2d 3e  r(iLvl=pStruct->
24570 6e 4c 65 76 65 6c 2d 31 3b 20 69 4c 76 6c 3e 3d  nLevel-1; iLvl>=
24580 30 3b 20 69 4c 76 6c 2d 2d 29 7b 0a 20 20 20 20  0; iLvl--){.    
24590 20 20 20 20 66 6f 72 28 69 53 65 67 3d 30 3b 20      for(iSeg=0; 
245a0 69 53 65 67 3c 70 53 74 72 75 63 74 2d 3e 61 4c  iSeg<pStruct->aL
245b0 65 76 65 6c 5b 69 4c 76 6c 5d 2e 6e 53 65 67 3b  evel[iLvl].nSeg;
245c0 20 69 53 65 67 2b 2b 29 7b 0a 20 20 20 20 20 20   iSeg++){.      
245d0 20 20 20 20 70 4c 76 6c 2d 3e 61 53 65 67 5b 69      pLvl->aSeg[i
245e0 53 65 67 4f 75 74 5d 20 3d 20 70 53 74 72 75 63  SegOut] = pStruc
245f0 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d 2e  t->aLevel[iLvl].
24600 61 53 65 67 5b 69 53 65 67 5d 3b 0a 20 20 20 20  aSeg[iSeg];.    
24610 20 20 20 20 20 20 69 53 65 67 4f 75 74 2b 2b 3b        iSegOut++;
24620 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
24630 20 7d 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e   }.      pNew->n
24640 53 65 67 6d 65 6e 74 20 3d 20 70 4c 76 6c 2d 3e  Segment = pLvl->
24650 6e 53 65 67 20 3d 20 6e 53 65 67 3b 0a 20 20 20  nSeg = nSeg;.   
24660 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71   }else{.      sq
24670 6c 69 74 65 33 5f 66 72 65 65 28 70 4e 65 77 29  lite3_free(pNew)
24680 3b 0a 20 20 20 20 20 20 70 4e 65 77 20 3d 20 30  ;.      pNew = 0
24690 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72  ;.    }.  }..  r
246a0 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 69  eturn pNew;.}..i
246b0 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e  nt sqlite3Fts5In
246c0 64 65 78 4f 70 74 69 6d 69 7a 65 28 46 74 73 35  dexOptimize(Fts5
246d0 49 6e 64 65 78 20 2a 70 29 7b 0a 20 20 46 74 73  Index *p){.  Fts
246e0 35 53 74 72 75 63 74 75 72 65 20 2a 70 53 74 72  5Structure *pStr
246f0 75 63 74 3b 0a 20 20 46 74 73 35 53 74 72 75 63  uct;.  Fts5Struc
24700 74 75 72 65 20 2a 70 4e 65 77 20 3d 20 30 3b 0a  ture *pNew = 0;.
24710 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72 63  .  assert( p->rc
24720 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20  ==SQLITE_OK );. 
24730 20 66 74 73 35 49 6e 64 65 78 46 6c 75 73 68 28   fts5IndexFlush(
24740 70 29 3b 0a 20 20 70 53 74 72 75 63 74 20 3d 20  p);.  pStruct = 
24750 66 74 73 35 53 74 72 75 63 74 75 72 65 52 65 61  fts5StructureRea
24760 64 28 70 29 3b 0a 20 20 66 74 73 35 53 74 72 75  d(p);.  fts5Stru
24770 63 74 75 72 65 49 6e 76 61 6c 69 64 61 74 65 28  ctureInvalidate(
24780 70 29 3b 0a 0a 20 20 69 66 28 20 70 53 74 72 75  p);..  if( pStru
24790 63 74 20 29 7b 0a 20 20 20 20 70 4e 65 77 20 3d  ct ){.    pNew =
247a0 20 66 74 73 35 49 6e 64 65 78 4f 70 74 69 6d 69   fts5IndexOptimi
247b0 7a 65 53 74 72 75 63 74 28 70 2c 20 70 53 74 72  zeStruct(p, pStr
247c0 75 63 74 29 3b 0a 20 20 7d 0a 20 20 66 74 73 35  uct);.  }.  fts5
247d0 53 74 72 75 63 74 75 72 65 52 65 6c 65 61 73 65  StructureRelease
247e0 28 70 53 74 72 75 63 74 29 3b 0a 0a 20 20 61 73  (pStruct);..  as
247f0 73 65 72 74 28 20 70 4e 65 77 3d 3d 30 20 7c 7c  sert( pNew==0 ||
24800 20 70 4e 65 77 2d 3e 6e 53 65 67 6d 65 6e 74 3e   pNew->nSegment>
24810 30 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 20  0 );.  if( pNew 
24820 29 7b 0a 20 20 20 20 69 6e 74 20 69 4c 76 6c 3b  ){.    int iLvl;
24830 0a 20 20 20 20 66 6f 72 28 69 4c 76 6c 3d 30 3b  .    for(iLvl=0;
24840 20 70 4e 65 77 2d 3e 61 4c 65 76 65 6c 5b 69 4c   pNew->aLevel[iL
24850 76 6c 5d 2e 6e 53 65 67 3d 3d 30 3b 20 69 4c 76  vl].nSeg==0; iLv
24860 6c 2b 2b 29 7b 7d 0a 20 20 20 20 77 68 69 6c 65  l++){}.    while
24870 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
24880 4f 4b 20 26 26 20 70 4e 65 77 2d 3e 61 4c 65 76  OK && pNew->aLev
24890 65 6c 5b 69 4c 76 6c 5d 2e 6e 53 65 67 3e 30 20  el[iLvl].nSeg>0 
248a0 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 52 65  ){.      int nRe
248b0 6d 20 3d 20 46 54 53 35 5f 4f 50 54 5f 57 4f 52  m = FTS5_OPT_WOR
248c0 4b 5f 55 4e 49 54 3b 0a 20 20 20 20 20 20 66 74  K_UNIT;.      ft
248d0 73 35 49 6e 64 65 78 4d 65 72 67 65 4c 65 76 65  s5IndexMergeLeve
248e0 6c 28 70 2c 20 26 70 4e 65 77 2c 20 69 4c 76 6c  l(p, &pNew, iLvl
248f0 2c 20 26 6e 52 65 6d 29 3b 0a 20 20 20 20 7d 0a  , &nRem);.    }.
24900 0a 20 20 20 20 66 74 73 35 53 74 72 75 63 74 75  .    fts5Structu
24910 72 65 57 72 69 74 65 28 70 2c 20 70 4e 65 77 29  reWrite(p, pNew)
24920 3b 0a 20 20 20 20 66 74 73 35 53 74 72 75 63 74  ;.    fts5Struct
24930 75 72 65 52 65 6c 65 61 73 65 28 70 4e 65 77 29  ureRelease(pNew)
24940 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
24950 66 74 73 35 49 6e 64 65 78 52 65 74 75 72 6e 28  fts5IndexReturn(
24960 70 29 3b 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  p); .}../*.** Th
24970 69 73 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20  is is called to 
24980 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 73 70  implement the sp
24990 65 63 69 61 6c 20 22 56 41 4c 55 45 53 28 27 6d  ecial "VALUES('m
249a0 65 72 67 65 27 2c 20 24 6e 4d 65 72 67 65 29 22  erge', $nMerge)"
249b0 0a 2a 2a 20 49 4e 53 45 52 54 20 63 6f 6d 6d 61  .** INSERT comma
249c0 6e 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  nd..*/.int sqlit
249d0 65 33 46 74 73 35 49 6e 64 65 78 4d 65 72 67 65  e3Fts5IndexMerge
249e0 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 69  (Fts5Index *p, i
249f0 6e 74 20 6e 4d 65 72 67 65 29 7b 0a 20 20 46 74  nt nMerge){.  Ft
24a00 73 35 53 74 72 75 63 74 75 72 65 20 2a 70 53 74  s5Structure *pSt
24a10 72 75 63 74 20 3d 20 66 74 73 35 53 74 72 75 63  ruct = fts5Struc
24a20 74 75 72 65 52 65 61 64 28 70 29 3b 0a 20 20 69  tureRead(p);.  i
24a30 66 28 20 70 53 74 72 75 63 74 20 29 7b 0a 20 20  f( pStruct ){.  
24a40 20 20 69 6e 74 20 6e 4d 69 6e 20 3d 20 70 2d 3e    int nMin = p->
24a50 70 43 6f 6e 66 69 67 2d 3e 6e 55 73 65 72 6d 65  pConfig->nUserme
24a60 72 67 65 3b 0a 20 20 20 20 66 74 73 35 53 74 72  rge;.    fts5Str
24a70 75 63 74 75 72 65 49 6e 76 61 6c 69 64 61 74 65  uctureInvalidate
24a80 28 70 29 3b 0a 20 20 20 20 69 66 28 20 6e 4d 65  (p);.    if( nMe
24a90 72 67 65 3c 30 20 29 7b 0a 20 20 20 20 20 20 46  rge<0 ){.      F
24aa0 74 73 35 53 74 72 75 63 74 75 72 65 20 2a 70 4e  ts5Structure *pN
24ab0 65 77 20 3d 20 66 74 73 35 49 6e 64 65 78 4f 70  ew = fts5IndexOp
24ac0 74 69 6d 69 7a 65 53 74 72 75 63 74 28 70 2c 20  timizeStruct(p, 
24ad0 70 53 74 72 75 63 74 29 3b 0a 20 20 20 20 20 20  pStruct);.      
24ae0 66 74 73 35 53 74 72 75 63 74 75 72 65 52 65 6c  fts5StructureRel
24af0 65 61 73 65 28 70 53 74 72 75 63 74 29 3b 0a 20  ease(pStruct);. 
24b00 20 20 20 20 20 70 53 74 72 75 63 74 20 3d 20 70       pStruct = p
24b10 4e 65 77 3b 0a 20 20 20 20 20 20 6e 4d 69 6e 20  New;.      nMin 
24b20 3d 20 32 3b 0a 20 20 20 20 20 20 6e 4d 65 72 67  = 2;.      nMerg
24b30 65 20 3d 20 6e 4d 65 72 67 65 2a 2d 31 3b 0a 20  e = nMerge*-1;. 
24b40 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 53 74     }.    if( pSt
24b50 72 75 63 74 20 26 26 20 70 53 74 72 75 63 74 2d  ruct && pStruct-
24b60 3e 6e 4c 65 76 65 6c 20 29 7b 0a 20 20 20 20 20  >nLevel ){.     
24b70 20 69 66 28 20 66 74 73 35 49 6e 64 65 78 4d 65   if( fts5IndexMe
24b80 72 67 65 28 70 2c 20 26 70 53 74 72 75 63 74 2c  rge(p, &pStruct,
24b90 20 6e 4d 65 72 67 65 2c 20 6e 4d 69 6e 29 20 29   nMerge, nMin) )
24ba0 7b 0a 20 20 20 20 20 20 20 20 66 74 73 35 53 74  {.        fts5St
24bb0 72 75 63 74 75 72 65 57 72 69 74 65 28 70 2c 20  ructureWrite(p, 
24bc0 70 53 74 72 75 63 74 29 3b 0a 20 20 20 20 20 20  pStruct);.      
24bd0 7d 0a 20 20 20 20 7d 0a 20 20 20 20 66 74 73 35  }.    }.    fts5
24be0 53 74 72 75 63 74 75 72 65 52 65 6c 65 61 73 65  StructureRelease
24bf0 28 70 53 74 72 75 63 74 29 3b 0a 20 20 7d 0a 20  (pStruct);.  }. 
24c00 20 72 65 74 75 72 6e 20 66 74 73 35 49 6e 64 65   return fts5Inde
24c10 78 52 65 74 75 72 6e 28 70 29 3b 0a 7d 0a 0a 73  xReturn(p);.}..s
24c20 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 41  tatic void fts5A
24c30 70 70 65 6e 64 52 6f 77 69 64 28 0a 20 20 46 74  ppendRowid(.  Ft
24c40 73 35 49 6e 64 65 78 20 2a 70 2c 0a 20 20 69 36  s5Index *p,.  i6
24c50 34 20 69 44 65 6c 74 61 2c 0a 20 20 46 74 73 35  4 iDelta,.  Fts5
24c60 49 74 65 72 20 2a 70 55 6e 75 73 65 64 2c 0a 20  Iter *pUnused,. 
24c70 20 46 74 73 35 42 75 66 66 65 72 20 2a 70 42 75   Fts5Buffer *pBu
24c80 66 0a 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41  f.){.  UNUSED_PA
24c90 52 41 4d 28 70 55 6e 75 73 65 64 29 3b 0a 20 20  RAM(pUnused);.  
24ca0 66 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64  fts5BufferAppend
24cb0 56 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20 70  Varint(&p->rc, p
24cc0 42 75 66 2c 20 69 44 65 6c 74 61 29 3b 0a 7d 0a  Buf, iDelta);.}.
24cd0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
24ce0 35 41 70 70 65 6e 64 50 6f 73 6c 69 73 74 28 0a  5AppendPoslist(.
24cf0 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 0a    Fts5Index *p,.
24d00 20 20 69 36 34 20 69 44 65 6c 74 61 2c 0a 20 20    i64 iDelta,.  
24d10 46 74 73 35 49 74 65 72 20 2a 70 4d 75 6c 74 69  Fts5Iter *pMulti
24d20 2c 0a 20 20 46 74 73 35 42 75 66 66 65 72 20 2a  ,.  Fts5Buffer *
24d30 70 42 75 66 0a 29 7b 0a 20 20 69 6e 74 20 6e 44  pBuf.){.  int nD
24d40 61 74 61 20 3d 20 70 4d 75 6c 74 69 2d 3e 62 61  ata = pMulti->ba
24d50 73 65 2e 6e 44 61 74 61 3b 0a 20 20 69 6e 74 20  se.nData;.  int 
24d60 6e 42 79 74 65 20 3d 20 6e 44 61 74 61 20 2b 20  nByte = nData + 
24d70 39 20 2b 20 39 20 2b 20 46 54 53 35 5f 44 41 54  9 + 9 + FTS5_DAT
24d80 41 5f 5a 45 52 4f 5f 50 41 44 44 49 4e 47 3b 0a  A_ZERO_PADDING;.
24d90 20 20 61 73 73 65 72 74 28 20 6e 44 61 74 61 3e    assert( nData>
24da0 30 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 72 63  0 );.  if( p->rc
24db0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 30  ==SQLITE_OK && 0
24dc0 3d 3d 66 74 73 35 42 75 66 66 65 72 47 72 6f 77  ==fts5BufferGrow
24dd0 28 26 70 2d 3e 72 63 2c 20 70 42 75 66 2c 20 6e  (&p->rc, pBuf, n
24de0 42 79 74 65 29 20 29 7b 0a 20 20 20 20 66 74 73  Byte) ){.    fts
24df0 35 42 75 66 66 65 72 53 61 66 65 41 70 70 65 6e  5BufferSafeAppen
24e00 64 56 61 72 69 6e 74 28 70 42 75 66 2c 20 69 44  dVarint(pBuf, iD
24e10 65 6c 74 61 29 3b 0a 20 20 20 20 66 74 73 35 42  elta);.    fts5B
24e20 75 66 66 65 72 53 61 66 65 41 70 70 65 6e 64 56  ufferSafeAppendV
24e30 61 72 69 6e 74 28 70 42 75 66 2c 20 6e 44 61 74  arint(pBuf, nDat
24e40 61 2a 32 29 3b 0a 20 20 20 20 66 74 73 35 42 75  a*2);.    fts5Bu
24e50 66 66 65 72 53 61 66 65 41 70 70 65 6e 64 42 6c  fferSafeAppendBl
24e60 6f 62 28 70 42 75 66 2c 20 70 4d 75 6c 74 69 2d  ob(pBuf, pMulti-
24e70 3e 62 61 73 65 2e 70 44 61 74 61 2c 20 6e 44 61  >base.pData, nDa
24e80 74 61 29 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28  ta);.    memset(
24e90 26 70 42 75 66 2d 3e 70 5b 70 42 75 66 2d 3e 6e  &pBuf->p[pBuf->n
24ea0 5d 2c 20 30 2c 20 46 54 53 35 5f 44 41 54 41 5f  ], 0, FTS5_DATA_
24eb0 5a 45 52 4f 5f 50 41 44 44 49 4e 47 29 3b 0a 20  ZERO_PADDING);. 
24ec0 20 7d 0a 7d 0a 0a 0a 73 74 61 74 69 63 20 76 6f   }.}...static vo
24ed0 69 64 20 66 74 73 35 44 6f 63 6c 69 73 74 49 74  id fts5DoclistIt
24ee0 65 72 4e 65 78 74 28 46 74 73 35 44 6f 63 6c 69  erNext(Fts5Docli
24ef0 73 74 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a  stIter *pIter){.
24f00 20 20 75 38 20 2a 70 20 3d 20 70 49 74 65 72 2d    u8 *p = pIter-
24f10 3e 61 50 6f 73 6c 69 73 74 20 2b 20 70 49 74 65  >aPoslist + pIte
24f20 72 2d 3e 6e 53 69 7a 65 20 2b 20 70 49 74 65 72  r->nSize + pIter
24f30 2d 3e 6e 50 6f 73 6c 69 73 74 3b 0a 0a 20 20 61  ->nPoslist;..  a
24f40 73 73 65 72 74 28 20 70 49 74 65 72 2d 3e 61 50  ssert( pIter->aP
24f50 6f 73 6c 69 73 74 20 29 3b 0a 20 20 69 66 28 20  oslist );.  if( 
24f60 70 3e 3d 70 49 74 65 72 2d 3e 61 45 6f 66 20 29  p>=pIter->aEof )
24f70 7b 0a 20 20 20 20 70 49 74 65 72 2d 3e 61 50 6f  {.    pIter->aPo
24f80 73 6c 69 73 74 20 3d 20 30 3b 0a 20 20 7d 65 6c  slist = 0;.  }el
24f90 73 65 7b 0a 20 20 20 20 69 36 34 20 69 44 65 6c  se{.    i64 iDel
24fa0 74 61 3b 0a 0a 20 20 20 20 70 20 2b 3d 20 66 74  ta;..    p += ft
24fb0 73 35 47 65 74 56 61 72 69 6e 74 28 70 2c 20 28  s5GetVarint(p, (
24fc0 75 36 34 2a 29 26 69 44 65 6c 74 61 29 3b 0a 20  u64*)&iDelta);. 
24fd0 20 20 20 70 49 74 65 72 2d 3e 69 52 6f 77 69 64     pIter->iRowid
24fe0 20 2b 3d 20 69 44 65 6c 74 61 3b 0a 0a 20 20 20   += iDelta;..   
24ff0 20 2f 2a 20 52 65 61 64 20 70 6f 73 69 74 69 6f   /* Read positio
25000 6e 20 6c 69 73 74 20 73 69 7a 65 20 2a 2f 0a 20  n list size */. 
25010 20 20 20 69 66 28 20 70 5b 30 5d 20 26 20 30 78     if( p[0] & 0x
25020 38 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  80 ){.      int 
25030 6e 50 6f 73 3b 0a 20 20 20 20 20 20 70 49 74 65  nPos;.      pIte
25040 72 2d 3e 6e 53 69 7a 65 20 3d 20 66 74 73 35 47  r->nSize = fts5G
25050 65 74 56 61 72 69 6e 74 33 32 28 70 2c 20 6e 50  etVarint32(p, nP
25060 6f 73 29 3b 0a 20 20 20 20 20 20 70 49 74 65 72  os);.      pIter
25070 2d 3e 6e 50 6f 73 6c 69 73 74 20 3d 20 28 6e 50  ->nPoslist = (nP
25080 6f 73 3e 3e 31 29 3b 0a 20 20 20 20 7d 65 6c 73  os>>1);.    }els
25090 65 7b 0a 20 20 20 20 20 20 70 49 74 65 72 2d 3e  e{.      pIter->
250a0 6e 50 6f 73 6c 69 73 74 20 3d 20 28 28 69 6e 74  nPoslist = ((int
250b0 29 28 70 5b 30 5d 29 29 20 3e 3e 20 31 3b 0a 20  )(p[0])) >> 1;. 
250c0 20 20 20 20 20 70 49 74 65 72 2d 3e 6e 53 69 7a       pIter->nSiz
250d0 65 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 0a 20 20  e = 1;.    }..  
250e0 20 20 70 49 74 65 72 2d 3e 61 50 6f 73 6c 69 73    pIter->aPoslis
250f0 74 20 3d 20 70 3b 0a 20 20 7d 0a 7d 0a 0a 73 74  t = p;.  }.}..st
25100 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 44 6f  atic void fts5Do
25110 63 6c 69 73 74 49 74 65 72 49 6e 69 74 28 0a 20  clistIterInit(. 
25120 20 46 74 73 35 42 75 66 66 65 72 20 2a 70 42 75   Fts5Buffer *pBu
25130 66 2c 20 0a 20 20 46 74 73 35 44 6f 63 6c 69 73  f, .  Fts5Doclis
25140 74 49 74 65 72 20 2a 70 49 74 65 72 0a 29 7b 0a  tIter *pIter.){.
25150 20 20 6d 65 6d 73 65 74 28 70 49 74 65 72 2c 20    memset(pIter, 
25160 30 2c 20 73 69 7a 65 6f 66 28 2a 70 49 74 65 72  0, sizeof(*pIter
25170 29 29 3b 0a 20 20 70 49 74 65 72 2d 3e 61 50 6f  ));.  pIter->aPo
25180 73 6c 69 73 74 20 3d 20 70 42 75 66 2d 3e 70 3b  slist = pBuf->p;
25190 0a 20 20 70 49 74 65 72 2d 3e 61 45 6f 66 20 3d  .  pIter->aEof =
251a0 20 26 70 42 75 66 2d 3e 70 5b 70 42 75 66 2d 3e   &pBuf->p[pBuf->
251b0 6e 5d 3b 0a 20 20 66 74 73 35 44 6f 63 6c 69 73  n];.  fts5Doclis
251c0 74 49 74 65 72 4e 65 78 74 28 70 49 74 65 72 29  tIterNext(pIter)
251d0 3b 0a 7d 0a 0a 23 69 66 20 30 0a 2f 2a 0a 2a 2a  ;.}..#if 0./*.**
251e0 20 41 70 70 65 6e 64 20 61 20 64 6f 63 6c 69 73   Append a doclis
251f0 74 20 74 6f 20 62 75 66 66 65 72 20 70 42 75 66  t to buffer pBuf
25200 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ..**.** This fun
25210 63 74 69 6f 6e 20 61 73 73 75 6d 65 73 20 74 68  ction assumes th
25220 61 74 20 73 70 61 63 65 20 77 69 74 68 69 6e 20  at space within 
25230 74 68 65 20 62 75 66 66 65 72 20 68 61 73 20 61  the buffer has a
25240 6c 72 65 61 64 79 20 62 65 65 6e 0a 2a 2a 20 61  lready been.** a
25250 6c 6c 6f 63 61 74 65 64 2e 0a 2a 2f 0a 73 74 61  llocated..*/.sta
25260 74 69 63 20 76 6f 69 64 20 66 74 73 35 4d 65 72  tic void fts5Mer
25270 67 65 41 70 70 65 6e 64 44 6f 63 69 64 28 0a 20  geAppendDocid(. 
25280 20 46 74 73 35 42 75 66 66 65 72 20 2a 70 42 75   Fts5Buffer *pBu
25290 66 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  f,              
252a0 20 2f 2a 20 42 75 66 66 65 72 20 74 6f 20 77 72   /* Buffer to wr
252b0 69 74 65 20 74 6f 20 2a 2f 0a 20 20 69 36 34 20  ite to */.  i64 
252c0 2a 70 69 4c 61 73 74 52 6f 77 69 64 2c 20 20 20  *piLastRowid,   
252d0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
252e0 4e 2f 4f 55 54 3a 20 50 72 65 76 69 6f 75 73 20  N/OUT: Previous 
252f0 72 6f 77 69 64 20 77 72 69 74 74 65 6e 20 28 69  rowid written (i
25300 66 20 61 6e 79 29 20 2a 2f 0a 20 20 69 36 34 20  f any) */.  i64 
25310 69 52 6f 77 69 64 20 20 20 20 20 20 20 20 20 20  iRowid          
25320 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
25330 6f 77 69 64 20 74 6f 20 61 70 70 65 6e 64 20 2a  owid to append *
25340 2f 0a 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70  /.){.  assert( p
25350 42 75 66 2d 3e 6e 21 3d 30 20 7c 7c 20 28 2a 70  Buf->n!=0 || (*p
25360 69 4c 61 73 74 52 6f 77 69 64 29 3d 3d 30 20 29  iLastRowid)==0 )
25370 3b 0a 20 20 66 74 73 35 42 75 66 66 65 72 53 61  ;.  fts5BufferSa
25380 66 65 41 70 70 65 6e 64 56 61 72 69 6e 74 28 70  feAppendVarint(p
25390 42 75 66 2c 20 69 52 6f 77 69 64 20 2d 20 2a 70  Buf, iRowid - *p
253a0 69 4c 61 73 74 52 6f 77 69 64 29 3b 0a 20 20 2a  iLastRowid);.  *
253b0 70 69 4c 61 73 74 52 6f 77 69 64 20 3d 20 69 52  piLastRowid = iR
253c0 6f 77 69 64 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  owid;.}.#endif..
253d0 23 64 65 66 69 6e 65 20 66 74 73 35 4d 65 72 67  #define fts5Merg
253e0 65 41 70 70 65 6e 64 44 6f 63 69 64 28 70 42 75  eAppendDocid(pBu
253f0 66 2c 20 69 4c 61 73 74 52 6f 77 69 64 2c 20 69  f, iLastRowid, i
25400 52 6f 77 69 64 29 20 7b 20 20 20 20 20 20 20 5c  Rowid) {       \
25410 0a 20 20 61 73 73 65 72 74 28 20 28 70 42 75 66  .  assert( (pBuf
25420 29 2d 3e 6e 21 3d 30 20 7c 7c 20 28 69 4c 61 73  )->n!=0 || (iLas
25430 74 52 6f 77 69 64 29 3d 3d 30 20 29 3b 20 20 20  tRowid)==0 );   
25440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25450 5c 0a 20 20 66 74 73 35 42 75 66 66 65 72 53 61  \.  fts5BufferSa
25460 66 65 41 70 70 65 6e 64 56 61 72 69 6e 74 28 28  feAppendVarint((
25470 70 42 75 66 29 2c 20 28 69 52 6f 77 69 64 29 20  pBuf), (iRowid) 
25480 2d 20 28 69 4c 61 73 74 52 6f 77 69 64 29 29 3b  - (iLastRowid));
25490 20 5c 0a 20 20 28 69 4c 61 73 74 52 6f 77 69 64   \.  (iLastRowid
254a0 29 20 3d 20 28 69 52 6f 77 69 64 29 3b 20 20 20  ) = (iRowid);   
254b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
254c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
254d0 20 20 5c 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 77 61    \.}../*.** Swa
254e0 70 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  p the contents o
254f0 66 20 62 75 66 66 65 72 20 2a 70 31 20 77 69 74  f buffer *p1 wit
25500 68 20 74 68 61 74 20 6f 66 20 2a 70 32 2e 0a 2a  h that of *p2..*
25510 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  /.static void ft
25520 73 35 42 75 66 66 65 72 53 77 61 70 28 46 74 73  s5BufferSwap(Fts
25530 35 42 75 66 66 65 72 20 2a 70 31 2c 20 46 74 73  5Buffer *p1, Fts
25540 35 42 75 66 66 65 72 20 2a 70 32 29 7b 0a 20 20  5Buffer *p2){.  
25550 46 74 73 35 42 75 66 66 65 72 20 74 6d 70 20 3d  Fts5Buffer tmp =
25560 20 2a 70 31 3b 0a 20 20 2a 70 31 20 3d 20 2a 70   *p1;.  *p1 = *p
25570 32 3b 0a 20 20 2a 70 32 20 3d 20 74 6d 70 3b 0a  2;.  *p2 = tmp;.
25580 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  }..static void f
25590 74 73 35 4e 65 78 74 52 6f 77 69 64 28 46 74 73  ts5NextRowid(Fts
255a0 35 42 75 66 66 65 72 20 2a 70 42 75 66 2c 20 69  5Buffer *pBuf, i
255b0 6e 74 20 2a 70 69 4f 66 66 2c 20 69 36 34 20 2a  nt *piOff, i64 *
255c0 70 69 52 6f 77 69 64 29 7b 0a 20 20 69 6e 74 20  piRowid){.  int 
255d0 69 20 3d 20 2a 70 69 4f 66 66 3b 0a 20 20 69 66  i = *piOff;.  if
255e0 28 20 69 3e 3d 70 42 75 66 2d 3e 6e 20 29 7b 0a  ( i>=pBuf->n ){.
255f0 20 20 20 20 2a 70 69 4f 66 66 20 3d 20 2d 31 3b      *piOff = -1;
25600 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 75 36  .  }else{.    u6
25610 34 20 69 56 61 6c 3b 0a 20 20 20 20 2a 70 69 4f  4 iVal;.    *piO
25620 66 66 20 3d 20 69 20 2b 20 73 71 6c 69 74 65 33  ff = i + sqlite3
25630 46 74 73 35 47 65 74 56 61 72 69 6e 74 28 26 70  Fts5GetVarint(&p
25640 42 75 66 2d 3e 70 5b 69 5d 2c 20 26 69 56 61 6c  Buf->p[i], &iVal
25650 29 3b 0a 20 20 20 20 2a 70 69 52 6f 77 69 64 20  );.    *piRowid 
25660 2b 3d 20 69 56 61 6c 3b 0a 20 20 7d 0a 7d 0a 0a  += iVal;.  }.}..
25670 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 74 68  /*.** This is th
25680 65 20 65 71 75 69 76 61 6c 65 6e 74 20 6f 66 20  e equivalent of 
25690 66 74 73 35 4d 65 72 67 65 50 72 65 66 69 78 4c  fts5MergePrefixL
256a0 69 73 74 73 28 29 20 66 6f 72 20 64 65 74 61 69  ists() for detai
256b0 6c 3d 6e 6f 6e 65 20 6d 6f 64 65 2e 0a 2a 2a 20  l=none mode..** 
256c0 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 65  In this case the
256d0 20 62 75 66 66 65 72 73 20 63 6f 6e 73 69 73 74   buffers consist
256e0 20 6f 66 20 61 20 64 65 6c 74 61 2d 65 6e 63 6f   of a delta-enco
256f0 64 65 64 20 6c 69 73 74 20 6f 66 20 72 6f 77 69  ded list of rowi
25700 64 73 20 6f 6e 6c 79 2e 0a 2a 2f 0a 73 74 61 74  ds only..*/.stat
25710 69 63 20 76 6f 69 64 20 66 74 73 35 4d 65 72 67  ic void fts5Merg
25720 65 52 6f 77 69 64 4c 69 73 74 73 28 0a 20 20 46  eRowidLists(.  F
25730 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20  ts5Index *p,    
25740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
25750 2a 20 46 54 53 35 20 62 61 63 6b 65 6e 64 20 6f  * FTS5 backend o
25760 62 6a 65 63 74 20 2a 2f 0a 20 20 46 74 73 35 42  bject */.  Fts5B
25770 75 66 66 65 72 20 2a 70 31 2c 20 20 20 20 20 20  uffer *p1,      
25780 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
25790 72 73 74 20 6c 69 73 74 20 74 6f 20 6d 65 72 67  rst list to merg
257a0 65 20 2a 2f 0a 20 20 46 74 73 35 42 75 66 66 65  e */.  Fts5Buffe
257b0 72 20 2a 70 32 20 20 20 20 20 20 20 20 20 20 20  r *p2           
257c0 20 20 20 20 20 20 20 2f 2a 20 53 65 63 6f 6e 64         /* Second
257d0 20 6c 69 73 74 20 74 6f 20 6d 65 72 67 65 20 2a   list to merge *
257e0 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 31 20 3d 20  /.){.  int i1 = 
257f0 30 3b 0a 20 20 69 6e 74 20 69 32 20 3d 20 30 3b  0;.  int i2 = 0;
25800 0a 20 20 69 36 34 20 69 52 6f 77 69 64 31 20 3d  .  i64 iRowid1 =
25810 20 30 3b 0a 20 20 69 36 34 20 69 52 6f 77 69 64   0;.  i64 iRowid
25820 32 20 3d 20 30 3b 0a 20 20 69 36 34 20 69 4f 75  2 = 0;.  i64 iOu
25830 74 20 3d 20 30 3b 0a 0a 20 20 46 74 73 35 42 75  t = 0;..  Fts5Bu
25840 66 66 65 72 20 6f 75 74 3b 0a 20 20 6d 65 6d 73  ffer out;.  mems
25850 65 74 28 26 6f 75 74 2c 20 30 2c 20 73 69 7a 65  et(&out, 0, size
25860 6f 66 28 6f 75 74 29 29 3b 0a 20 20 73 71 6c 69  of(out));.  sqli
25870 74 65 33 46 74 73 35 42 75 66 66 65 72 53 69 7a  te3Fts5BufferSiz
25880 65 28 26 70 2d 3e 72 63 2c 20 26 6f 75 74 2c 20  e(&p->rc, &out, 
25890 70 31 2d 3e 6e 20 2b 20 70 32 2d 3e 6e 29 3b 0a  p1->n + p2->n);.
258a0 20 20 69 66 28 20 70 2d 3e 72 63 20 29 20 72 65    if( p->rc ) re
258b0 74 75 72 6e 3b 0a 0a 20 20 66 74 73 35 4e 65 78  turn;..  fts5Nex
258c0 74 52 6f 77 69 64 28 70 31 2c 20 26 69 31 2c 20  tRowid(p1, &i1, 
258d0 26 69 52 6f 77 69 64 31 29 3b 0a 20 20 66 74 73  &iRowid1);.  fts
258e0 35 4e 65 78 74 52 6f 77 69 64 28 70 32 2c 20 26  5NextRowid(p2, &
258f0 69 32 2c 20 26 69 52 6f 77 69 64 32 29 3b 0a 20  i2, &iRowid2);. 
25900 20 77 68 69 6c 65 28 20 69 31 3e 3d 30 20 7c 7c   while( i1>=0 ||
25910 20 69 32 3e 3d 30 20 29 7b 0a 20 20 20 20 69 66   i2>=0 ){.    if
25920 28 20 69 31 3e 3d 30 20 26 26 20 28 69 32 3c 30  ( i1>=0 && (i2<0
25930 20 7c 7c 20 69 52 6f 77 69 64 31 3c 69 52 6f 77   || iRowid1<iRow
25940 69 64 32 29 20 29 7b 0a 20 20 20 20 20 20 61 73  id2) ){.      as
25950 73 65 72 74 28 20 69 4f 75 74 3d 3d 30 20 7c 7c  sert( iOut==0 ||
25960 20 69 52 6f 77 69 64 31 3e 69 4f 75 74 20 29 3b   iRowid1>iOut );
25970 0a 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65  .      fts5Buffe
25980 72 53 61 66 65 41 70 70 65 6e 64 56 61 72 69 6e  rSafeAppendVarin
25990 74 28 26 6f 75 74 2c 20 69 52 6f 77 69 64 31 20  t(&out, iRowid1 
259a0 2d 20 69 4f 75 74 29 3b 0a 20 20 20 20 20 20 69  - iOut);.      i
259b0 4f 75 74 20 3d 20 69 52 6f 77 69 64 31 3b 0a 20  Out = iRowid1;. 
259c0 20 20 20 20 20 66 74 73 35 4e 65 78 74 52 6f 77       fts5NextRow
259d0 69 64 28 70 31 2c 20 26 69 31 2c 20 26 69 52 6f  id(p1, &i1, &iRo
259e0 77 69 64 31 29 3b 0a 20 20 20 20 7d 65 6c 73 65  wid1);.    }else
259f0 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
25a00 69 4f 75 74 3d 3d 30 20 7c 7c 20 69 52 6f 77 69  iOut==0 || iRowi
25a10 64 32 3e 69 4f 75 74 20 29 3b 0a 20 20 20 20 20  d2>iOut );.     
25a20 20 66 74 73 35 42 75 66 66 65 72 53 61 66 65 41   fts5BufferSafeA
25a30 70 70 65 6e 64 56 61 72 69 6e 74 28 26 6f 75 74  ppendVarint(&out
25a40 2c 20 69 52 6f 77 69 64 32 20 2d 20 69 4f 75 74  , iRowid2 - iOut
25a50 29 3b 0a 20 20 20 20 20 20 69 4f 75 74 20 3d 20  );.      iOut = 
25a60 69 52 6f 77 69 64 32 3b 0a 20 20 20 20 20 20 69  iRowid2;.      i
25a70 66 28 20 69 31 3e 3d 30 20 26 26 20 69 52 6f 77  f( i1>=0 && iRow
25a80 69 64 31 3d 3d 69 52 6f 77 69 64 32 20 29 7b 0a  id1==iRowid2 ){.
25a90 20 20 20 20 20 20 20 20 66 74 73 35 4e 65 78 74          fts5Next
25aa0 52 6f 77 69 64 28 70 31 2c 20 26 69 31 2c 20 26  Rowid(p1, &i1, &
25ab0 69 52 6f 77 69 64 31 29 3b 0a 20 20 20 20 20 20  iRowid1);.      
25ac0 7d 0a 20 20 20 20 20 20 66 74 73 35 4e 65 78 74  }.      fts5Next
25ad0 52 6f 77 69 64 28 70 32 2c 20 26 69 32 2c 20 26  Rowid(p2, &i2, &
25ae0 69 52 6f 77 69 64 32 29 3b 0a 20 20 20 20 7d 0a  iRowid2);.    }.
25af0 20 20 7d 0a 0a 20 20 66 74 73 35 42 75 66 66 65    }..  fts5Buffe
25b00 72 53 77 61 70 28 26 6f 75 74 2c 20 70 31 29 3b  rSwap(&out, p1);
25b10 0a 20 20 66 74 73 35 42 75 66 66 65 72 46 72 65  .  fts5BufferFre
25b20 65 28 26 6f 75 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  e(&out);.}../*.*
25b30 2a 20 42 75 66 66 65 72 73 20 70 31 20 61 6e 64  * Buffers p1 and
25b40 20 70 32 20 63 6f 6e 74 61 69 6e 20 64 6f 63 6c   p2 contain docl
25b50 69 73 74 73 2e 20 54 68 69 73 20 66 75 6e 63 74  ists. This funct
25b60 69 6f 6e 20 6d 65 72 67 65 73 20 74 68 65 20 63  ion merges the c
25b70 6f 6e 74 65 6e 74 0a 2a 2a 20 6f 66 20 74 68 65  ontent.** of the
25b80 20 74 77 6f 20 64 6f 63 6c 69 73 74 73 20 74 6f   two doclists to
25b90 67 65 74 68 65 72 20 61 6e 64 20 73 65 74 73 20  gether and sets 
25ba0 62 75 66 66 65 72 20 70 31 20 74 6f 20 74 68 65  buffer p1 to the
25bb0 20 72 65 73 75 6c 74 20 62 65 66 6f 72 65 0a 2a   result before.*
25bc0 2a 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a  * returning..**.
25bd0 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  ** If an error o
25be0 63 63 75 72 73 2c 20 61 6e 20 65 72 72 6f 72 20  ccurs, an error 
25bf0 63 6f 64 65 20 69 73 20 6c 65 66 74 20 69 6e 20  code is left in 
25c00 70 2d 3e 72 63 2e 20 49 66 20 61 6e 20 65 72 72  p->rc. If an err
25c10 6f 72 20 68 61 73 0a 2a 2a 20 61 6c 72 65 61 64  or has.** alread
25c20 79 20 6f 63 63 75 72 72 65 64 2c 20 74 68 69 73  y occurred, this
25c30 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e   function is a n
25c40 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  o-op..*/.static 
25c50 76 6f 69 64 20 66 74 73 35 4d 65 72 67 65 50 72  void fts5MergePr
25c60 65 66 69 78 4c 69 73 74 73 28 0a 20 20 46 74 73  efixLists(.  Fts
25c70 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20  5Index *p,      
25c80 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
25c90 46 54 53 35 20 62 61 63 6b 65 6e 64 20 6f 62 6a  FTS5 backend obj
25ca0 65 63 74 20 2a 2f 0a 20 20 46 74 73 35 42 75 66  ect */.  Fts5Buf
25cb0 66 65 72 20 2a 70 31 2c 20 20 20 20 20 20 20 20  fer *p1,        
25cc0 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73           /* Firs
25cd0 74 20 6c 69 73 74 20 74 6f 20 6d 65 72 67 65 20  t list to merge 
25ce0 2a 2f 0a 20 20 46 74 73 35 42 75 66 66 65 72 20  */.  Fts5Buffer 
25cf0 2a 70 32 20 20 20 20 20 20 20 20 20 20 20 20 20  *p2             
25d00 20 20 20 20 20 2f 2a 20 53 65 63 6f 6e 64 20 6c       /* Second l
25d10 69 73 74 20 74 6f 20 6d 65 72 67 65 20 2a 2f 0a  ist to merge */.
25d20 29 7b 0a 20 20 69 66 28 20 70 32 2d 3e 6e 20 29  ){.  if( p2->n )
25d30 7b 0a 20 20 20 20 69 36 34 20 69 4c 61 73 74 52  {.    i64 iLastR
25d40 6f 77 69 64 20 3d 20 30 3b 0a 20 20 20 20 46 74  owid = 0;.    Ft
25d50 73 35 44 6f 63 6c 69 73 74 49 74 65 72 20 69 31  s5DoclistIter i1
25d60 3b 0a 20 20 20 20 46 74 73 35 44 6f 63 6c 69 73  ;.    Fts5Doclis
25d70 74 49 74 65 72 20 69 32 3b 0a 20 20 20 20 46 74  tIter i2;.    Ft
25d80 73 35 42 75 66 66 65 72 20 6f 75 74 20 3d 20 7b  s5Buffer out = {
25d90 30 2c 20 30 2c 20 30 7d 3b 0a 20 20 20 20 46 74  0, 0, 0};.    Ft
25da0 73 35 42 75 66 66 65 72 20 74 6d 70 20 3d 20 7b  s5Buffer tmp = {
25db0 30 2c 20 30 2c 20 30 7d 3b 0a 0a 20 20 20 20 2f  0, 0, 0};..    /
25dc0 2a 20 54 68 65 20 6d 61 78 69 6d 75 6d 20 73 69  * The maximum si
25dd0 7a 65 20 6f 66 20 74 68 65 20 6f 75 74 70 75 74  ze of the output
25de0 20 69 73 20 65 71 75 61 6c 20 74 6f 20 74 68 65   is equal to the
25df0 20 73 75 6d 20 6f 66 20 74 68 65 20 74 77 6f 20   sum of the two 
25e00 0a 20 20 20 20 2a 2a 20 69 6e 70 75 74 20 73 69  .    ** input si
25e10 7a 65 73 20 2b 20 31 20 76 61 72 69 6e 74 20 28  zes + 1 varint (
25e20 39 20 62 79 74 65 73 29 2e 20 54 68 65 20 65 78  9 bytes). The ex
25e30 74 72 61 20 76 61 72 69 6e 74 20 69 73 20 62 65  tra varint is be
25e40 63 61 75 73 65 20 69 66 20 74 68 65 0a 20 20 20  cause if the.   
25e50 20 2a 2a 20 66 69 72 73 74 20 72 6f 77 69 64 20   ** first rowid 
25e60 69 6e 20 6f 6e 65 20 69 6e 70 75 74 20 69 73 20  in one input is 
25e70 61 20 6c 61 72 67 65 20 6e 65 67 61 74 69 76 65  a large negative
25e80 20 6e 75 6d 62 65 72 2c 20 61 6e 64 20 74 68 65   number, and the
25e90 20 66 69 72 73 74 20 69 6e 0a 20 20 20 20 2a 2a   first in.    **
25ea0 20 74 68 65 20 6f 74 68 65 72 20 61 20 6e 6f 6e   the other a non
25eb0 2d 6e 65 67 61 74 69 76 65 20 6e 75 6d 62 65 72  -negative number
25ec0 2c 20 74 68 65 20 64 65 6c 74 61 20 66 6f 72 20  , the delta for 
25ed0 74 68 65 20 6e 6f 6e 2d 6e 65 67 61 74 69 76 65  the non-negative
25ee0 0a 20 20 20 20 2a 2a 20 6e 75 6d 62 65 72 20 77  .    ** number w
25ef0 69 6c 6c 20 62 65 20 6c 61 72 67 65 72 20 6f 6e  ill be larger on
25f00 20 64 69 73 6b 20 74 68 61 6e 20 74 68 65 20 6c   disk than the l
25f10 69 74 65 72 61 6c 20 69 6e 74 65 67 65 72 20 76  iteral integer v
25f20 61 6c 75 65 0a 20 20 20 20 2a 2a 20 77 61 73 2e  alue.    ** was.
25f30 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 71 6c    */.    if( sql
25f40 69 74 65 33 46 74 73 35 42 75 66 66 65 72 53 69  ite3Fts5BufferSi
25f50 7a 65 28 26 70 2d 3e 72 63 2c 20 26 6f 75 74 2c  ze(&p->rc, &out,
25f60 20 70 31 2d 3e 6e 20 2b 20 70 32 2d 3e 6e 20 2b   p1->n + p2->n +
25f70 20 39 29 20 29 20 72 65 74 75 72 6e 3b 0a 20 20   9) ) return;.  
25f80 20 20 66 74 73 35 44 6f 63 6c 69 73 74 49 74 65    fts5DoclistIte
25f90 72 49 6e 69 74 28 70 31 2c 20 26 69 31 29 3b 0a  rInit(p1, &i1);.
25fa0 20 20 20 20 66 74 73 35 44 6f 63 6c 69 73 74 49      fts5DoclistI
25fb0 74 65 72 49 6e 69 74 28 70 32 2c 20 26 69 32 29  terInit(p2, &i2)
25fc0 3b 0a 0a 20 20 20 20 77 68 69 6c 65 28 20 31 20  ;..    while( 1 
25fd0 29 7b 0a 20 20 20 20 20 20 69 66 28 20 69 31 2e  ){.      if( i1.
25fe0 69 52 6f 77 69 64 3c 69 32 2e 69 52 6f 77 69 64  iRowid<i2.iRowid
25ff0 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 43   ){.        /* C
26000 6f 70 79 20 65 6e 74 72 79 20 66 72 6f 6d 20 69  opy entry from i
26010 31 20 2a 2f 0a 20 20 20 20 20 20 20 20 66 74 73  1 */.        fts
26020 35 4d 65 72 67 65 41 70 70 65 6e 64 44 6f 63 69  5MergeAppendDoci
26030 64 28 26 6f 75 74 2c 20 69 4c 61 73 74 52 6f 77  d(&out, iLastRow
26040 69 64 2c 20 69 31 2e 69 52 6f 77 69 64 29 3b 0a  id, i1.iRowid);.
26050 20 20 20 20 20 20 20 20 66 74 73 35 42 75 66 66          fts5Buff
26060 65 72 53 61 66 65 41 70 70 65 6e 64 42 6c 6f 62  erSafeAppendBlob
26070 28 26 6f 75 74 2c 20 69 31 2e 61 50 6f 73 6c 69  (&out, i1.aPosli
26080 73 74 2c 20 69 31 2e 6e 50 6f 73 6c 69 73 74 2b  st, i1.nPoslist+
26090 69 31 2e 6e 53 69 7a 65 29 3b 0a 20 20 20 20 20  i1.nSize);.     
260a0 20 20 20 66 74 73 35 44 6f 63 6c 69 73 74 49 74     fts5DoclistIt
260b0 65 72 4e 65 78 74 28 26 69 31 29 3b 0a 20 20 20  erNext(&i1);.   
260c0 20 20 20 20 20 69 66 28 20 69 31 2e 61 50 6f 73       if( i1.aPos
260d0 6c 69 73 74 3d 3d 30 20 29 20 62 72 65 61 6b 3b  list==0 ) break;
260e0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 65  .      }.      e
260f0 6c 73 65 20 69 66 28 20 69 32 2e 69 52 6f 77 69  lse if( i2.iRowi
26100 64 21 3d 69 31 2e 69 52 6f 77 69 64 20 29 7b 0a  d!=i1.iRowid ){.
26110 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 70 79 20          /* Copy 
26120 65 6e 74 72 79 20 66 72 6f 6d 20 69 32 20 2a 2f  entry from i2 */
26130 0a 20 20 20 20 20 20 20 20 66 74 73 35 4d 65 72  .        fts5Mer
26140 67 65 41 70 70 65 6e 64 44 6f 63 69 64 28 26 6f  geAppendDocid(&o
26150 75 74 2c 20 69 4c 61 73 74 52 6f 77 69 64 2c 20  ut, iLastRowid, 
26160 69 32 2e 69 52 6f 77 69 64 29 3b 0a 20 20 20 20  i2.iRowid);.    
26170 20 20 20 20 66 74 73 35 42 75 66 66 65 72 53 61      fts5BufferSa
26180 66 65 41 70 70 65 6e 64 42 6c 6f 62 28 26 6f 75  feAppendBlob(&ou
26190 74 2c 20 69 32 2e 61 50 6f 73 6c 69 73 74 2c 20  t, i2.aPoslist, 
261a0 69 32 2e 6e 50 6f 73 6c 69 73 74 2b 69 32 2e 6e  i2.nPoslist+i2.n
261b0 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 20 20 66  Size);.        f
261c0 74 73 35 44 6f 63 6c 69 73 74 49 74 65 72 4e 65  ts5DoclistIterNe
261d0 78 74 28 26 69 32 29 3b 0a 20 20 20 20 20 20 20  xt(&i2);.       
261e0 20 69 66 28 20 69 32 2e 61 50 6f 73 6c 69 73 74   if( i2.aPoslist
261f0 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ==0 ) break;.   
26200 20 20 20 7d 0a 20 20 20 20 20 20 65 6c 73 65 7b     }.      else{
26210 0a 20 20 20 20 20 20 20 20 2f 2a 20 4d 65 72 67  .        /* Merg
26220 65 20 74 68 65 20 74 77 6f 20 70 6f 73 69 74 69  e the two positi
26230 6f 6e 20 6c 69 73 74 73 2e 20 2a 2f 20 0a 20 20  on lists. */ .  
26240 20 20 20 20 20 20 69 36 34 20 69 50 6f 73 31 20        i64 iPos1 
26250 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 69 36 34  = 0;.        i64
26260 20 69 50 6f 73 32 20 3d 20 30 3b 0a 20 20 20 20   iPos2 = 0;.    
26270 20 20 20 20 69 6e 74 20 69 4f 66 66 31 20 3d 20      int iOff1 = 
26280 30 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69  0;.        int i
26290 4f 66 66 32 20 3d 20 30 3b 0a 20 20 20 20 20 20  Off2 = 0;.      
262a0 20 20 75 38 20 2a 61 31 20 3d 20 26 69 31 2e 61    u8 *a1 = &i1.a
262b0 50 6f 73 6c 69 73 74 5b 69 31 2e 6e 53 69 7a 65  Poslist[i1.nSize
262c0 5d 3b 0a 20 20 20 20 20 20 20 20 75 38 20 2a 61  ];.        u8 *a
262d0 32 20 3d 20 26 69 32 2e 61 50 6f 73 6c 69 73 74  2 = &i2.aPoslist
262e0 5b 69 32 2e 6e 53 69 7a 65 5d 3b 0a 20 20 20 20  [i2.nSize];.    
262f0 20 20 20 20 69 6e 74 20 6e 43 6f 70 79 3b 0a 20      int nCopy;. 
26300 20 20 20 20 20 20 20 75 38 20 2a 61 43 6f 70 79         u8 *aCopy
26310 3b 0a 0a 20 20 20 20 20 20 20 20 69 36 34 20 69  ;..        i64 i
26320 50 72 65 76 20 3d 20 30 3b 0a 20 20 20 20 20 20  Prev = 0;.      
26330 20 20 46 74 73 35 50 6f 73 6c 69 73 74 57 72 69    Fts5PoslistWri
26340 74 65 72 20 77 72 69 74 65 72 3b 0a 20 20 20 20  ter writer;.    
26350 20 20 20 20 6d 65 6d 73 65 74 28 26 77 72 69 74      memset(&writ
26360 65 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 77 72  er, 0, sizeof(wr
26370 69 74 65 72 29 29 3b 0a 0a 20 20 20 20 20 20 20  iter));..       
26380 20 66 74 73 35 4d 65 72 67 65 41 70 70 65 6e 64   fts5MergeAppend
26390 44 6f 63 69 64 28 26 6f 75 74 2c 20 69 4c 61 73  Docid(&out, iLas
263a0 74 52 6f 77 69 64 2c 20 69 32 2e 69 52 6f 77 69  tRowid, i2.iRowi
263b0 64 29 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35  d);.        fts5
263c0 42 75 66 66 65 72 5a 65 72 6f 28 26 74 6d 70 29  BufferZero(&tmp)
263d0 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
263e0 33 46 74 73 35 42 75 66 66 65 72 53 69 7a 65 28  3Fts5BufferSize(
263f0 26 70 2d 3e 72 63 2c 20 26 74 6d 70 2c 20 69 31  &p->rc, &tmp, i1
26400 2e 6e 50 6f 73 6c 69 73 74 20 2b 20 69 32 2e 6e  .nPoslist + i2.n
26410 50 6f 73 6c 69 73 74 29 3b 0a 20 20 20 20 20 20  Poslist);.      
26420 20 20 69 66 28 20 70 2d 3e 72 63 20 29 20 62 72    if( p->rc ) br
26430 65 61 6b 3b 0a 0a 20 20 20 20 20 20 20 20 73 71  eak;..        sq
26440 6c 69 74 65 33 46 74 73 35 50 6f 73 6c 69 73 74  lite3Fts5Poslist
26450 4e 65 78 74 36 34 28 61 31 2c 20 69 31 2e 6e 50  Next64(a1, i1.nP
26460 6f 73 6c 69 73 74 2c 20 26 69 4f 66 66 31 2c 20  oslist, &iOff1, 
26470 26 69 50 6f 73 31 29 3b 0a 20 20 20 20 20 20 20  &iPos1);.       
26480 20 73 71 6c 69 74 65 33 46 74 73 35 50 6f 73 6c   sqlite3Fts5Posl
26490 69 73 74 4e 65 78 74 36 34 28 61 32 2c 20 69 32  istNext64(a2, i2
264a0 2e 6e 50 6f 73 6c 69 73 74 2c 20 26 69 4f 66 66  .nPoslist, &iOff
264b0 32 2c 20 26 69 50 6f 73 32 29 3b 0a 20 20 20 20  2, &iPos2);.    
264c0 20 20 20 20 61 73 73 65 72 74 28 20 69 50 6f 73      assert( iPos
264d0 31 3e 3d 30 20 26 26 20 69 50 6f 73 32 3e 3d 30  1>=0 && iPos2>=0
264e0 20 29 3b 0a 0a 20 20 20 20 20 20 20 20 69 66 28   );..        if(
264f0 20 69 50 6f 73 31 3c 69 50 6f 73 32 20 29 7b 0a   iPos1<iPos2 ){.
26500 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
26510 33 46 74 73 35 50 6f 73 6c 69 73 74 53 61 66 65  3Fts5PoslistSafe
26520 41 70 70 65 6e 64 28 26 74 6d 70 2c 20 26 69 50  Append(&tmp, &iP
26530 72 65 76 2c 20 69 50 6f 73 31 29 3b 0a 20 20 20  rev, iPos1);.   
26540 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 46 74         sqlite3Ft
26550 73 35 50 6f 73 6c 69 73 74 4e 65 78 74 36 34 28  s5PoslistNext64(
26560 61 31 2c 20 69 31 2e 6e 50 6f 73 6c 69 73 74 2c  a1, i1.nPoslist,
26570 20 26 69 4f 66 66 31 2c 20 26 69 50 6f 73 31 29   &iOff1, &iPos1)
26580 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
26590 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
265a0 65 33 46 74 73 35 50 6f 73 6c 69 73 74 53 61 66  e3Fts5PoslistSaf
265b0 65 41 70 70 65 6e 64 28 26 74 6d 70 2c 20 26 69  eAppend(&tmp, &i
265c0 50 72 65 76 2c 20 69 50 6f 73 32 29 3b 0a 20 20  Prev, iPos2);.  
265d0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 46          sqlite3F
265e0 74 73 35 50 6f 73 6c 69 73 74 4e 65 78 74 36 34  ts5PoslistNext64
265f0 28 61 32 2c 20 69 32 2e 6e 50 6f 73 6c 69 73 74  (a2, i2.nPoslist
26600 2c 20 26 69 4f 66 66 32 2c 20 26 69 50 6f 73 32  , &iOff2, &iPos2
26610 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20  );.        }..  
26620 20 20 20 20 20 20 69 66 28 20 69 50 6f 73 31 3e        if( iPos1>
26630 3d 30 20 26 26 20 69 50 6f 73 32 3e 3d 30 20 29  =0 && iPos2>=0 )
26640 7b 0a 20 20 20 20 20 20 20 20 20 20 77 68 69 6c  {.          whil
26650 65 28 20 31 20 29 7b 0a 20 20 20 20 20 20 20 20  e( 1 ){.        
26660 20 20 20 20 69 66 28 20 69 50 6f 73 31 3c 69 50      if( iPos1<iP
26670 6f 73 32 20 29 7b 0a 20 20 20 20 20 20 20 20 20  os2 ){.         
26680 20 20 20 20 20 69 66 28 20 69 50 6f 73 31 21 3d       if( iPos1!=
26690 69 50 72 65 76 20 29 7b 0a 20 20 20 20 20 20 20  iPrev ){.       
266a0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
266b0 46 74 73 35 50 6f 73 6c 69 73 74 53 61 66 65 41  Fts5PoslistSafeA
266c0 70 70 65 6e 64 28 26 74 6d 70 2c 20 26 69 50 72  ppend(&tmp, &iPr
266d0 65 76 2c 20 69 50 6f 73 31 29 3b 0a 20 20 20 20  ev, iPos1);.    
266e0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
266f0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
26700 33 46 74 73 35 50 6f 73 6c 69 73 74 4e 65 78 74  3Fts5PoslistNext
26710 36 34 28 61 31 2c 20 69 31 2e 6e 50 6f 73 6c 69  64(a1, i1.nPosli
26720 73 74 2c 20 26 69 4f 66 66 31 2c 20 26 69 50 6f  st, &iOff1, &iPo
26730 73 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  s1);.           
26740 20 20 20 69 66 28 20 69 50 6f 73 31 3c 30 20 29     if( iPos1<0 )
26750 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
26760 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
26770 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 5f           assert_
26780 6e 63 28 20 69 50 6f 73 32 21 3d 69 50 72 65 76  nc( iPos2!=iPrev
26790 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   );.            
267a0 20 20 73 71 6c 69 74 65 33 46 74 73 35 50 6f 73    sqlite3Fts5Pos
267b0 6c 69 73 74 53 61 66 65 41 70 70 65 6e 64 28 26  listSafeAppend(&
267c0 74 6d 70 2c 20 26 69 50 72 65 76 2c 20 69 50 6f  tmp, &iPrev, iPo
267d0 73 32 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  s2);.           
267e0 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 50 6f     sqlite3Fts5Po
267f0 73 6c 69 73 74 4e 65 78 74 36 34 28 61 32 2c 20  slistNext64(a2, 
26800 69 32 2e 6e 50 6f 73 6c 69 73 74 2c 20 26 69 4f  i2.nPoslist, &iO
26810 66 66 32 2c 20 26 69 50 6f 73 32 29 3b 0a 20 20  ff2, &iPos2);.  
26820 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
26830 69 50 6f 73 32 3c 30 20 29 20 62 72 65 61 6b 3b  iPos2<0 ) break;
26840 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
26850 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
26860 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 69 66     }..        if
26870 28 20 69 50 6f 73 31 3e 3d 30 20 29 7b 0a 20 20  ( iPos1>=0 ){.  
26880 20 20 20 20 20 20 20 20 69 66 28 20 69 50 6f 73          if( iPos
26890 31 21 3d 69 50 72 65 76 20 29 7b 0a 20 20 20 20  1!=iPrev ){.    
268a0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 46          sqlite3F
268b0 74 73 35 50 6f 73 6c 69 73 74 53 61 66 65 41 70  ts5PoslistSafeAp
268c0 70 65 6e 64 28 26 74 6d 70 2c 20 26 69 50 72 65  pend(&tmp, &iPre
268d0 76 2c 20 69 50 6f 73 31 29 3b 0a 20 20 20 20 20  v, iPos1);.     
268e0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
268f0 20 61 43 6f 70 79 20 3d 20 26 61 31 5b 69 4f 66   aCopy = &a1[iOf
26900 66 31 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 6e  f1];.          n
26910 43 6f 70 79 20 3d 20 69 31 2e 6e 50 6f 73 6c 69  Copy = i1.nPosli
26920 73 74 20 2d 20 69 4f 66 66 31 3b 0a 20 20 20 20  st - iOff1;.    
26930 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
26940 20 20 20 20 20 61 73 73 65 72 74 28 20 69 50 6f       assert( iPo
26950 73 32 3e 3d 30 20 26 26 20 69 50 6f 73 32 21 3d  s2>=0 && iPos2!=
26960 69 50 72 65 76 20 29 3b 0a 20 20 20 20 20 20 20  iPrev );.       
26970 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 50 6f     sqlite3Fts5Po
26980 73 6c 69 73 74 53 61 66 65 41 70 70 65 6e 64 28  slistSafeAppend(
26990 26 74 6d 70 2c 20 26 69 50 72 65 76 2c 20 69 50  &tmp, &iPrev, iP
269a0 6f 73 32 29 3b 0a 20 20 20 20 20 20 20 20 20 20  os2);.          
269b0 61 43 6f 70 79 20 3d 20 26 61 32 5b 69 4f 66 66  aCopy = &a2[iOff
269c0 32 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 6e 43  2];.          nC
269d0 6f 70 79 20 3d 20 69 32 2e 6e 50 6f 73 6c 69 73  opy = i2.nPoslis
269e0 74 20 2d 20 69 4f 66 66 32 3b 0a 20 20 20 20 20  t - iOff2;.     
269f0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
26a00 20 6e 43 6f 70 79 3e 30 20 29 7b 0a 20 20 20 20   nCopy>0 ){.    
26a10 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72        fts5Buffer
26a20 53 61 66 65 41 70 70 65 6e 64 42 6c 6f 62 28 26  SafeAppendBlob(&
26a30 74 6d 70 2c 20 61 43 6f 70 79 2c 20 6e 43 6f 70  tmp, aCopy, nCop
26a40 79 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20  y);.        }.. 
26a50 20 20 20 20 20 20 20 2f 2a 20 57 52 49 54 45 50         /* WRITEP
26a60 4f 53 4c 49 53 54 53 49 5a 45 20 2a 2f 0a 20 20  OSLISTSIZE */.  
26a70 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72        fts5Buffer
26a80 53 61 66 65 41 70 70 65 6e 64 56 61 72 69 6e 74  SafeAppendVarint
26a90 28 26 6f 75 74 2c 20 74 6d 70 2e 6e 20 2a 20 32  (&out, tmp.n * 2
26aa0 29 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35 42  );.        fts5B
26ab0 75 66 66 65 72 53 61 66 65 41 70 70 65 6e 64 42  ufferSafeAppendB
26ac0 6c 6f 62 28 26 6f 75 74 2c 20 74 6d 70 2e 70 2c  lob(&out, tmp.p,
26ad0 20 74 6d 70 2e 6e 29 3b 0a 20 20 20 20 20 20 20   tmp.n);.       
26ae0 20 66 74 73 35 44 6f 63 6c 69 73 74 49 74 65 72   fts5DoclistIter
26af0 4e 65 78 74 28 26 69 31 29 3b 0a 20 20 20 20 20  Next(&i1);.     
26b00 20 20 20 66 74 73 35 44 6f 63 6c 69 73 74 49 74     fts5DoclistIt
26b10 65 72 4e 65 78 74 28 26 69 32 29 3b 0a 20 20 20  erNext(&i2);.   
26b20 20 20 20 20 20 61 73 73 65 72 74 28 20 6f 75 74       assert( out
26b30 2e 6e 3c 3d 28 70 31 2d 3e 6e 2b 70 32 2d 3e 6e  .n<=(p1->n+p2->n
26b40 2b 39 29 20 29 3b 0a 20 20 20 20 20 20 20 20 69  +9) );.        i
26b50 66 28 20 69 31 2e 61 50 6f 73 6c 69 73 74 3d 3d  f( i1.aPoslist==
26b60 30 20 7c 7c 20 69 32 2e 61 50 6f 73 6c 69 73 74  0 || i2.aPoslist
26b70 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ==0 ) break;.   
26b80 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
26b90 69 66 28 20 69 31 2e 61 50 6f 73 6c 69 73 74 20  if( i1.aPoslist 
26ba0 29 7b 0a 20 20 20 20 20 20 66 74 73 35 4d 65 72  ){.      fts5Mer
26bb0 67 65 41 70 70 65 6e 64 44 6f 63 69 64 28 26 6f  geAppendDocid(&o
26bc0 75 74 2c 20 69 4c 61 73 74 52 6f 77 69 64 2c 20  ut, iLastRowid, 
26bd0 69 31 2e 69 52 6f 77 69 64 29 3b 0a 20 20 20 20  i1.iRowid);.    
26be0 20 20 66 74 73 35 42 75 66 66 65 72 53 61 66 65    fts5BufferSafe
26bf0 41 70 70 65 6e 64 42 6c 6f 62 28 26 6f 75 74 2c  AppendBlob(&out,
26c00 20 69 31 2e 61 50 6f 73 6c 69 73 74 2c 20 69 31   i1.aPoslist, i1
26c10 2e 61 45 6f 66 20 2d 20 69 31 2e 61 50 6f 73 6c  .aEof - i1.aPosl
26c20 69 73 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ist);.    }.    
26c30 65 6c 73 65 20 69 66 28 20 69 32 2e 61 50 6f 73  else if( i2.aPos
26c40 6c 69 73 74 20 29 7b 0a 20 20 20 20 20 20 66 74  list ){.      ft
26c50 73 35 4d 65 72 67 65 41 70 70 65 6e 64 44 6f 63  s5MergeAppendDoc
26c60 69 64 28 26 6f 75 74 2c 20 69 4c 61 73 74 52 6f  id(&out, iLastRo
26c70 77 69 64 2c 20 69 32 2e 69 52 6f 77 69 64 29 3b  wid, i2.iRowid);
26c80 0a 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65  .      fts5Buffe
26c90 72 53 61 66 65 41 70 70 65 6e 64 42 6c 6f 62 28  rSafeAppendBlob(
26ca0 26 6f 75 74 2c 20 69 32 2e 61 50 6f 73 6c 69 73  &out, i2.aPoslis
26cb0 74 2c 20 69 32 2e 61 45 6f 66 20 2d 20 69 32 2e  t, i2.aEof - i2.
26cc0 61 50 6f 73 6c 69 73 74 29 3b 0a 20 20 20 20 7d  aPoslist);.    }
26cd0 0a 20 20 20 20 61 73 73 65 72 74 28 20 6f 75 74  .    assert( out
26ce0 2e 6e 3c 3d 28 70 31 2d 3e 6e 2b 70 32 2d 3e 6e  .n<=(p1->n+p2->n
26cf0 2b 39 29 20 29 3b 0a 0a 20 20 20 20 66 74 73 35  +9) );..    fts5
26d00 42 75 66 66 65 72 53 65 74 28 26 70 2d 3e 72 63  BufferSet(&p->rc
26d10 2c 20 70 31 2c 20 6f 75 74 2e 6e 2c 20 6f 75 74  , p1, out.n, out
26d20 2e 70 29 3b 0a 20 20 20 20 66 74 73 35 42 75 66  .p);.    fts5Buf
26d30 66 65 72 46 72 65 65 28 26 74 6d 70 29 3b 0a 20  ferFree(&tmp);. 
26d40 20 20 20 66 74 73 35 42 75 66 66 65 72 46 72 65     fts5BufferFre
26d50 65 28 26 6f 75 74 29 3b 0a 20 20 7d 0a 7d 0a 0a  e(&out);.  }.}..
26d60 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
26d70 53 65 74 75 70 50 72 65 66 69 78 49 74 65 72 28  SetupPrefixIter(
26d80 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c  .  Fts5Index *p,
26d90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26da0 20 20 20 2f 2a 20 49 6e 64 65 78 20 74 6f 20 72     /* Index to r
26db0 65 61 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e  ead from */.  in
26dc0 74 20 62 44 65 73 63 2c 20 20 20 20 20 20 20 20  t bDesc,        
26dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
26de0 20 54 72 75 65 20 66 6f 72 20 22 4f 52 44 45 52   True for "ORDER
26df0 20 42 59 20 72 6f 77 69 64 20 44 45 53 43 22 20   BY rowid DESC" 
26e00 2a 2f 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 70  */.  const u8 *p
26e10 54 6f 6b 65 6e 2c 20 20 20 20 20 20 20 20 20 20  Token,          
26e20 20 20 20 20 20 2f 2a 20 42 75 66 66 65 72 20 63       /* Buffer c
26e30 6f 6e 74 61 69 6e 69 6e 67 20 70 72 65 66 69 78  ontaining prefix
26e40 20 74 6f 20 6d 61 74 63 68 20 2a 2f 0a 20 20 69   to match */.  i
26e50 6e 74 20 6e 54 6f 6b 65 6e 2c 20 20 20 20 20 20  nt nToken,      
26e60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
26e70 2a 20 53 69 7a 65 20 6f 66 20 62 75 66 66 65 72  * Size of buffer
26e80 20 70 54 6f 6b 65 6e 20 69 6e 20 62 79 74 65 73   pToken in bytes
26e90 20 2a 2f 0a 20 20 46 74 73 35 43 6f 6c 73 65 74   */.  Fts5Colset
26ea0 20 2a 70 43 6f 6c 73 65 74 2c 20 20 20 20 20 20   *pColset,      
26eb0 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63        /* Restric
26ec0 74 20 6d 61 74 63 68 65 73 20 74 6f 20 74 68 65  t matches to the
26ed0 73 65 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20  se columns */.  
26ee0 46 74 73 35 49 74 65 72 20 2a 2a 70 70 49 74 65  Fts5Iter **ppIte
26ef0 72 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55  r          /* OU
26f00 54 3a 20 4e 65 77 20 69 74 65 72 61 74 6f 72 20  T: New iterator 
26f10 2a 2f 0a 29 7b 0a 20 20 46 74 73 35 53 74 72 75  */.){.  Fts5Stru
26f20 63 74 75 72 65 20 2a 70 53 74 72 75 63 74 3b 0a  cture *pStruct;.
26f30 20 20 46 74 73 35 42 75 66 66 65 72 20 2a 61 42    Fts5Buffer *aB
26f40 75 66 3b 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20  uf;.  const int 
26f50 6e 42 75 66 20 3d 20 33 32 3b 0a 0a 20 20 76 6f  nBuf = 32;..  vo
26f60 69 64 20 28 2a 78 4d 65 72 67 65 29 28 46 74 73  id (*xMerge)(Fts
26f70 35 49 6e 64 65 78 2a 2c 20 46 74 73 35 42 75 66  5Index*, Fts5Buf
26f80 66 65 72 2a 2c 20 46 74 73 35 42 75 66 66 65 72  fer*, Fts5Buffer
26f90 2a 29 3b 0a 20 20 76 6f 69 64 20 28 2a 78 41 70  *);.  void (*xAp
26fa0 70 65 6e 64 29 28 46 74 73 35 49 6e 64 65 78 2a  pend)(Fts5Index*
26fb0 2c 20 69 36 34 2c 20 46 74 73 35 49 74 65 72 2a  , i64, Fts5Iter*
26fc0 2c 20 46 74 73 35 42 75 66 66 65 72 2a 29 3b 0a  , Fts5Buffer*);.
26fd0 20 20 69 66 28 20 70 2d 3e 70 43 6f 6e 66 69 67    if( p->pConfig
26fe0 2d 3e 65 44 65 74 61 69 6c 3d 3d 46 54 53 35 5f  ->eDetail==FTS5_
26ff0 44 45 54 41 49 4c 5f 4e 4f 4e 45 20 29 7b 0a 20  DETAIL_NONE ){. 
27000 20 20 20 78 4d 65 72 67 65 20 3d 20 66 74 73 35     xMerge = fts5
27010 4d 65 72 67 65 52 6f 77 69 64 4c 69 73 74 73 3b  MergeRowidLists;
27020 0a 20 20 20 20 78 41 70 70 65 6e 64 20 3d 20 66  .    xAppend = f
27030 74 73 35 41 70 70 65 6e 64 52 6f 77 69 64 3b 0a  ts5AppendRowid;.
27040 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 78 4d 65    }else{.    xMe
27050 72 67 65 20 3d 20 66 74 73 35 4d 65 72 67 65 50  rge = fts5MergeP
27060 72 65 66 69 78 4c 69 73 74 73 3b 0a 20 20 20 20  refixLists;.    
27070 78 41 70 70 65 6e 64 20 3d 20 66 74 73 35 41 70  xAppend = fts5Ap
27080 70 65 6e 64 50 6f 73 6c 69 73 74 3b 0a 20 20 7d  pendPoslist;.  }
27090 0a 0a 20 20 61 42 75 66 20 3d 20 28 46 74 73 35  ..  aBuf = (Fts5
270a0 42 75 66 66 65 72 2a 29 66 74 73 35 49 64 78 4d  Buffer*)fts5IdxM
270b0 61 6c 6c 6f 63 28 70 2c 20 73 69 7a 65 6f 66 28  alloc(p, sizeof(
270c0 46 74 73 35 42 75 66 66 65 72 29 2a 6e 42 75 66  Fts5Buffer)*nBuf
270d0 29 3b 0a 20 20 70 53 74 72 75 63 74 20 3d 20 66  );.  pStruct = f
270e0 74 73 35 53 74 72 75 63 74 75 72 65 52 65 61 64  ts5StructureRead
270f0 28 70 29 3b 0a 0a 20 20 69 66 28 20 61 42 75 66  (p);..  if( aBuf
27100 20 26 26 20 70 53 74 72 75 63 74 20 29 7b 0a 20   && pStruct ){. 
27110 20 20 20 63 6f 6e 73 74 20 69 6e 74 20 66 6c 61     const int fla
27120 67 73 20 3d 20 46 54 53 35 49 4e 44 45 58 5f 51  gs = FTS5INDEX_Q
27130 55 45 52 59 5f 53 43 41 4e 20 0a 20 20 20 20 20  UERY_SCAN .     
27140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
27150 20 46 54 53 35 49 4e 44 45 58 5f 51 55 45 52 59   FTS5INDEX_QUERY
27160 5f 53 4b 49 50 45 4d 50 54 59 20 0a 20 20 20 20  _SKIPEMPTY .    
27170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27180 7c 20 46 54 53 35 49 4e 44 45 58 5f 51 55 45 52  | FTS5INDEX_QUER
27190 59 5f 4e 4f 4f 55 54 50 55 54 3b 0a 20 20 20 20  Y_NOOUTPUT;.    
271a0 69 6e 74 20 69 3b 0a 20 20 20 20 69 36 34 20 69  int i;.    i64 i
271b0 4c 61 73 74 52 6f 77 69 64 20 3d 20 30 3b 0a 20  LastRowid = 0;. 
271c0 20 20 20 46 74 73 35 49 74 65 72 20 2a 70 31 20     Fts5Iter *p1 
271d0 3d 20 30 3b 20 20 20 20 20 2f 2a 20 49 74 65 72  = 0;     /* Iter
271e0 61 74 6f 72 20 75 73 65 64 20 74 6f 20 67 61 74  ator used to gat
271f0 68 65 72 20 64 61 74 61 20 66 72 6f 6d 20 69 6e  her data from in
27200 64 65 78 20 2a 2f 0a 20 20 20 20 46 74 73 35 44  dex */.    Fts5D
27210 61 74 61 20 2a 70 44 61 74 61 3b 0a 20 20 20 20  ata *pData;.    
27220 46 74 73 35 42 75 66 66 65 72 20 64 6f 63 6c 69  Fts5Buffer docli
27230 73 74 3b 0a 20 20 20 20 69 6e 74 20 62 4e 65 77  st;.    int bNew
27240 54 65 72 6d 20 3d 20 31 3b 0a 0a 20 20 20 20 6d  Term = 1;..    m
27250 65 6d 73 65 74 28 26 64 6f 63 6c 69 73 74 2c 20  emset(&doclist, 
27260 30 2c 20 73 69 7a 65 6f 66 28 64 6f 63 6c 69 73  0, sizeof(doclis
27270 74 29 29 3b 0a 20 20 20 20 66 74 73 35 4d 75 6c  t));.    fts5Mul
27280 74 69 49 74 65 72 4e 65 77 28 70 2c 20 70 53 74  tiIterNew(p, pSt
27290 72 75 63 74 2c 20 66 6c 61 67 73 2c 20 70 43 6f  ruct, flags, pCo
272a0 6c 73 65 74 2c 20 70 54 6f 6b 65 6e 2c 20 6e 54  lset, pToken, nT
272b0 6f 6b 65 6e 2c 20 2d 31 2c 20 30 2c 20 26 70 31  oken, -1, 0, &p1
272c0 29 3b 0a 20 20 20 20 66 74 73 35 49 74 65 72 53  );.    fts5IterS
272d0 65 74 4f 75 74 70 75 74 43 62 28 26 70 2d 3e 72  etOutputCb(&p->r
272e0 63 2c 20 70 31 29 3b 0a 20 20 20 20 66 6f 72 28  c, p1);.    for(
272f0 20 2f 2a 20 6e 6f 2d 6f 70 20 2a 2f 20 3b 0a 20   /* no-op */ ;. 
27300 20 20 20 20 20 20 20 66 74 73 35 4d 75 6c 74 69         fts5Multi
27310 49 74 65 72 45 6f 66 28 70 2c 20 70 31 29 3d 3d  IterEof(p, p1)==
27320 30 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35 4d  0;.        fts5M
27330 75 6c 74 69 49 74 65 72 4e 65 78 74 32 28 70 2c  ultiIterNext2(p,
27340 20 70 31 2c 20 26 62 4e 65 77 54 65 72 6d 29 0a   p1, &bNewTerm).
27350 20 20 20 20 29 7b 0a 20 20 20 20 20 20 46 74 73      ){.      Fts
27360 35 53 65 67 49 74 65 72 20 2a 70 53 65 67 20 3d  5SegIter *pSeg =
27370 20 26 70 31 2d 3e 61 53 65 67 5b 20 70 31 2d 3e   &p1->aSeg[ p1->
27380 61 46 69 72 73 74 5b 31 5d 2e 69 46 69 72 73 74  aFirst[1].iFirst
27390 20 5d 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 54   ];.      int nT
273a0 65 72 6d 20 3d 20 70 53 65 67 2d 3e 74 65 72 6d  erm = pSeg->term
273b0 2e 6e 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20  .n;.      const 
273c0 75 38 20 2a 70 54 65 72 6d 20 3d 20 70 53 65 67  u8 *pTerm = pSeg
273d0 2d 3e 74 65 72 6d 2e 70 3b 0a 20 20 20 20 20 20  ->term.p;.      
273e0 70 31 2d 3e 78 53 65 74 4f 75 74 70 75 74 73 28  p1->xSetOutputs(
273f0 70 31 2c 20 70 53 65 67 29 3b 0a 0a 20 20 20 20  p1, pSeg);..    
27400 20 20 61 73 73 65 72 74 5f 6e 63 28 20 6d 65 6d    assert_nc( mem
27410 63 6d 70 28 70 54 6f 6b 65 6e 2c 20 70 54 65 72  cmp(pToken, pTer
27420 6d 2c 20 4d 49 4e 28 6e 54 6f 6b 65 6e 2c 20 6e  m, MIN(nToken, n
27430 54 65 72 6d 29 29 3c 3d 30 20 29 3b 0a 20 20 20  Term))<=0 );.   
27440 20 20 20 69 66 28 20 62 4e 65 77 54 65 72 6d 20     if( bNewTerm 
27450 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e  ){.        if( n
27460 54 65 72 6d 3c 6e 54 6f 6b 65 6e 20 7c 7c 20 6d  Term<nToken || m
27470 65 6d 63 6d 70 28 70 54 6f 6b 65 6e 2c 20 70 54  emcmp(pToken, pT
27480 65 72 6d 2c 20 6e 54 6f 6b 65 6e 29 20 29 20 62  erm, nToken) ) b
27490 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  reak;.      }.. 
274a0 20 20 20 20 20 69 66 28 20 70 31 2d 3e 62 61 73       if( p1->bas
274b0 65 2e 6e 44 61 74 61 3d 3d 30 20 29 20 63 6f 6e  e.nData==0 ) con
274c0 74 69 6e 75 65 3b 0a 0a 20 20 20 20 20 20 69 66  tinue;..      if
274d0 28 20 70 31 2d 3e 62 61 73 65 2e 69 52 6f 77 69  ( p1->base.iRowi
274e0 64 3c 3d 69 4c 61 73 74 52 6f 77 69 64 20 26 26  d<=iLastRowid &&
274f0 20 64 6f 63 6c 69 73 74 2e 6e 3e 30 20 29 7b 0a   doclist.n>0 ){.
27500 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b          for(i=0;
27510 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
27520 4b 20 26 26 20 64 6f 63 6c 69 73 74 2e 6e 3b 20  K && doclist.n; 
27530 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  i++){.          
27540 61 73 73 65 72 74 28 20 69 3c 6e 42 75 66 20 29  assert( i<nBuf )
27550 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
27560 61 42 75 66 5b 69 5d 2e 6e 3d 3d 30 20 29 7b 0a  aBuf[i].n==0 ){.
27570 20 20 20 20 20 20 20 20 20 20 20 20 66 74 73 35              fts5
27580 42 75 66 66 65 72 53 77 61 70 28 26 64 6f 63 6c  BufferSwap(&docl
27590 69 73 74 2c 20 26 61 42 75 66 5b 69 5d 29 3b 0a  ist, &aBuf[i]);.
275a0 20 20 20 20 20 20 20 20 20 20 20 20 66 74 73 35              fts5
275b0 42 75 66 66 65 72 5a 65 72 6f 28 26 64 6f 63 6c  BufferZero(&docl
275c0 69 73 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ist);.          
275d0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
275e0 20 20 20 78 4d 65 72 67 65 28 70 2c 20 26 64 6f     xMerge(p, &do
275f0 63 6c 69 73 74 2c 20 26 61 42 75 66 5b 69 5d 29  clist, &aBuf[i])
27600 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 74  ;.            ft
27610 73 35 42 75 66 66 65 72 5a 65 72 6f 28 26 61 42  s5BufferZero(&aB
27620 75 66 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20  uf[i]);.        
27630 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
27640 20 20 20 20 20 20 69 4c 61 73 74 52 6f 77 69 64        iLastRowid
27650 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 0a 20   = 0;.      }.. 
27660 20 20 20 20 20 78 41 70 70 65 6e 64 28 70 2c 20       xAppend(p, 
27670 70 31 2d 3e 62 61 73 65 2e 69 52 6f 77 69 64 2d  p1->base.iRowid-
27680 69 4c 61 73 74 52 6f 77 69 64 2c 20 70 31 2c 20  iLastRowid, p1, 
27690 26 64 6f 63 6c 69 73 74 29 3b 0a 20 20 20 20 20  &doclist);.     
276a0 20 69 4c 61 73 74 52 6f 77 69 64 20 3d 20 70 31   iLastRowid = p1
276b0 2d 3e 62 61 73 65 2e 69 52 6f 77 69 64 3b 0a 20  ->base.iRowid;. 
276c0 20 20 20 7d 0a 0a 20 20 20 20 66 6f 72 28 69 3d     }..    for(i=
276d0 30 3b 20 69 3c 6e 42 75 66 3b 20 69 2b 2b 29 7b  0; i<nBuf; i++){
276e0 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72 63  .      if( p->rc
276f0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
27700 20 20 20 20 20 20 20 78 4d 65 72 67 65 28 70 2c         xMerge(p,
27710 20 26 64 6f 63 6c 69 73 74 2c 20 26 61 42 75 66   &doclist, &aBuf
27720 5b 69 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  [i]);.      }.  
27730 20 20 20 20 66 74 73 35 42 75 66 66 65 72 46 72      fts5BufferFr
27740 65 65 28 26 61 42 75 66 5b 69 5d 29 3b 0a 20 20  ee(&aBuf[i]);.  
27750 20 20 7d 0a 20 20 20 20 66 74 73 35 4d 75 6c 74    }.    fts5Mult
27760 69 49 74 65 72 46 72 65 65 28 70 31 29 3b 0a 0a  iIterFree(p1);..
27770 20 20 20 20 70 44 61 74 61 20 3d 20 66 74 73 35      pData = fts5
27780 49 64 78 4d 61 6c 6c 6f 63 28 70 2c 20 73 69 7a  IdxMalloc(p, siz
27790 65 6f 66 28 46 74 73 35 44 61 74 61 29 2b 64 6f  eof(Fts5Data)+do
277a0 63 6c 69 73 74 2e 6e 2b 46 54 53 35 5f 44 41 54  clist.n+FTS5_DAT
277b0 41 5f 5a 45 52 4f 5f 50 41 44 44 49 4e 47 29 3b  A_ZERO_PADDING);
277c0 0a 20 20 20 20 69 66 28 20 70 44 61 74 61 20 29  .    if( pData )
277d0 7b 0a 20 20 20 20 20 20 70 44 61 74 61 2d 3e 70  {.      pData->p
277e0 20 3d 20 28 75 38 2a 29 26 70 44 61 74 61 5b 31   = (u8*)&pData[1
277f0 5d 3b 0a 20 20 20 20 20 20 70 44 61 74 61 2d 3e  ];.      pData->
27800 6e 6e 20 3d 20 70 44 61 74 61 2d 3e 73 7a 4c 65  nn = pData->szLe
27810 61 66 20 3d 20 64 6f 63 6c 69 73 74 2e 6e 3b 0a  af = doclist.n;.
27820 20 20 20 20 20 20 69 66 28 20 64 6f 63 6c 69 73        if( doclis
27830 74 2e 6e 20 29 20 6d 65 6d 63 70 79 28 70 44 61  t.n ) memcpy(pDa
27840 74 61 2d 3e 70 2c 20 64 6f 63 6c 69 73 74 2e 70  ta->p, doclist.p
27850 2c 20 64 6f 63 6c 69 73 74 2e 6e 29 3b 0a 20 20  , doclist.n);.  
27860 20 20 20 20 66 74 73 35 4d 75 6c 74 69 49 74 65      fts5MultiIte
27870 72 4e 65 77 32 28 70 2c 20 70 44 61 74 61 2c 20  rNew2(p, pData, 
27880 62 44 65 73 63 2c 20 70 70 49 74 65 72 29 3b 0a  bDesc, ppIter);.
27890 20 20 20 20 7d 0a 20 20 20 20 66 74 73 35 42 75      }.    fts5Bu
278a0 66 66 65 72 46 72 65 65 28 26 64 6f 63 6c 69 73  fferFree(&doclis
278b0 74 29 3b 0a 20 20 7d 0a 0a 20 20 66 74 73 35 53  t);.  }..  fts5S
278c0 74 72 75 63 74 75 72 65 52 65 6c 65 61 73 65 28  tructureRelease(
278d0 70 53 74 72 75 63 74 29 3b 0a 20 20 73 71 6c 69  pStruct);.  sqli
278e0 74 65 33 5f 66 72 65 65 28 61 42 75 66 29 3b 0a  te3_free(aBuf);.
278f0 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 49 6e 64 69 63 61  }.../*.** Indica
27900 74 65 20 74 68 61 74 20 61 6c 6c 20 73 75 62 73  te that all subs
27910 65 71 75 65 6e 74 20 63 61 6c 6c 73 20 74 6f 20  equent calls to 
27920 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78  sqlite3Fts5Index
27930 57 72 69 74 65 28 29 20 70 65 72 74 61 69 6e 0a  Write() pertain.
27940 2a 2a 20 74 6f 20 74 68 65 20 64 6f 63 75 6d 65  ** to the docume
27950 6e 74 20 77 69 74 68 20 72 6f 77 69 64 20 69 52  nt with rowid iR
27960 6f 77 69 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  owid..*/.int sql
27970 69 74 65 33 46 74 73 35 49 6e 64 65 78 42 65 67  ite3Fts5IndexBeg
27980 69 6e 57 72 69 74 65 28 46 74 73 35 49 6e 64 65  inWrite(Fts5Inde
27990 78 20 2a 70 2c 20 69 6e 74 20 62 44 65 6c 65 74  x *p, int bDelet
279a0 65 2c 20 69 36 34 20 69 52 6f 77 69 64 29 7b 0a  e, i64 iRowid){.
279b0 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72 63 3d    assert( p->rc=
279c0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 0a 20  =SQLITE_OK );.. 
279d0 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 74 68 65   /* Allocate the
279e0 20 68 61 73 68 20 74 61 62 6c 65 20 69 66 20 69   hash table if i
279f0 74 20 68 61 73 20 6e 6f 74 20 61 6c 72 65 61 64  t has not alread
27a00 79 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64  y been allocated
27a10 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 48 61   */.  if( p->pHa
27a20 73 68 3d 3d 30 20 29 7b 0a 20 20 20 20 70 2d 3e  sh==0 ){.    p->
27a30 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74 73 35  rc = sqlite3Fts5
27a40 48 61 73 68 4e 65 77 28 70 2d 3e 70 43 6f 6e 66  HashNew(p->pConf
27a50 69 67 2c 20 26 70 2d 3e 70 48 61 73 68 2c 20 26  ig, &p->pHash, &
27a60 70 2d 3e 6e 50 65 6e 64 69 6e 67 44 61 74 61 29  p->nPendingData)
27a70 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 6c 75 73  ;.  }..  /* Flus
27a80 68 20 74 68 65 20 68 61 73 68 20 74 61 62 6c 65  h the hash table
27a90 20 74 6f 20 64 69 73 6b 20 69 66 20 72 65 71 75   to disk if requ
27aa0 69 72 65 64 20 2a 2f 0a 20 20 69 66 28 20 69 52  ired */.  if( iR
27ab0 6f 77 69 64 3c 70 2d 3e 69 57 72 69 74 65 52 6f  owid<p->iWriteRo
27ac0 77 69 64 20 0a 20 20 20 7c 7c 20 28 69 52 6f 77  wid .   || (iRow
27ad0 69 64 3d 3d 70 2d 3e 69 57 72 69 74 65 52 6f 77  id==p->iWriteRow
27ae0 69 64 20 26 26 20 70 2d 3e 62 44 65 6c 65 74 65  id && p->bDelete
27af0 3d 3d 30 29 0a 20 20 20 7c 7c 20 28 70 2d 3e 6e  ==0).   || (p->n
27b00 50 65 6e 64 69 6e 67 44 61 74 61 20 3e 20 70 2d  PendingData > p-
27b10 3e 70 43 6f 6e 66 69 67 2d 3e 6e 48 61 73 68 53  >pConfig->nHashS
27b20 69 7a 65 29 20 0a 20 20 29 7b 0a 20 20 20 20 66  ize) .  ){.    f
27b30 74 73 35 49 6e 64 65 78 46 6c 75 73 68 28 70 29  ts5IndexFlush(p)
27b40 3b 0a 20 20 7d 0a 0a 20 20 70 2d 3e 69 57 72 69  ;.  }..  p->iWri
27b50 74 65 52 6f 77 69 64 20 3d 20 69 52 6f 77 69 64  teRowid = iRowid
27b60 3b 0a 20 20 70 2d 3e 62 44 65 6c 65 74 65 20 3d  ;.  p->bDelete =
27b70 20 62 44 65 6c 65 74 65 3b 0a 20 20 72 65 74 75   bDelete;.  retu
27b80 72 6e 20 66 74 73 35 49 6e 64 65 78 52 65 74 75  rn fts5IndexRetu
27b90 72 6e 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn(p);.}../*.** 
27ba0 43 6f 6d 6d 69 74 20 64 61 74 61 20 74 6f 20 64  Commit data to d
27bb0 69 73 6b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  isk..*/.int sqli
27bc0 74 65 33 46 74 73 35 49 6e 64 65 78 53 79 6e 63  te3Fts5IndexSync
27bd0 28 46 74 73 35 49 6e 64 65 78 20 2a 70 29 7b 0a  (Fts5Index *p){.
27be0 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72 63 3d    assert( p->rc=
27bf0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20  =SQLITE_OK );.  
27c00 66 74 73 35 49 6e 64 65 78 46 6c 75 73 68 28 70  fts5IndexFlush(p
27c10 29 3b 0a 20 20 66 74 73 35 43 6c 6f 73 65 52 65  );.  fts5CloseRe
27c20 61 64 65 72 28 70 29 3b 0a 20 20 72 65 74 75 72  ader(p);.  retur
27c30 6e 20 66 74 73 35 49 6e 64 65 78 52 65 74 75 72  n fts5IndexRetur
27c40 6e 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  n(p);.}../*.** D
27c50 69 73 63 61 72 64 20 61 6e 79 20 64 61 74 61 20  iscard any data 
27c60 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 69 6e  stored in the in
27c70 2d 6d 65 6d 6f 72 79 20 68 61 73 68 20 74 61 62  -memory hash tab
27c80 6c 65 73 2e 20 44 6f 20 6e 6f 74 20 77 72 69 74  les. Do not writ
27c90 65 20 69 74 0a 2a 2a 20 74 6f 20 74 68 65 20 64  e it.** to the d
27ca0 61 74 61 62 61 73 65 2e 20 41 64 64 69 74 69 6f  atabase. Additio
27cb0 6e 61 6c 6c 79 2c 20 61 73 73 75 6d 65 20 74 68  nally, assume th
27cc0 61 74 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  at the contents 
27cd0 6f 66 20 74 68 65 20 25 5f 64 61 74 61 0a 2a 2a  of the %_data.**
27ce0 20 74 61 62 6c 65 20 6d 61 79 20 68 61 76 65 20   table may have 
27cf0 63 68 61 6e 67 65 64 20 6f 6e 20 64 69 73 6b 2e  changed on disk.
27d00 20 53 6f 20 61 6e 79 20 69 6e 2d 6d 65 6d 6f 72   So any in-memor
27d10 79 20 63 61 63 68 65 73 20 6f 66 20 25 5f 64 61  y caches of %_da
27d20 74 61 20 0a 2a 2a 20 72 65 63 6f 72 64 73 20 6d  ta .** records m
27d30 75 73 74 20 62 65 20 69 6e 76 61 6c 69 64 61 74  ust be invalidat
27d40 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ed..*/.int sqlit
27d50 65 33 46 74 73 35 49 6e 64 65 78 52 6f 6c 6c 62  e3Fts5IndexRollb
27d60 61 63 6b 28 46 74 73 35 49 6e 64 65 78 20 2a 70  ack(Fts5Index *p
27d70 29 7b 0a 20 20 66 74 73 35 43 6c 6f 73 65 52 65  ){.  fts5CloseRe
27d80 61 64 65 72 28 70 29 3b 0a 20 20 66 74 73 35 49  ader(p);.  fts5I
27d90 6e 64 65 78 44 69 73 63 61 72 64 44 61 74 61 28  ndexDiscardData(
27da0 70 29 3b 0a 20 20 66 74 73 35 53 74 72 75 63 74  p);.  fts5Struct
27db0 75 72 65 49 6e 76 61 6c 69 64 61 74 65 28 70 29  ureInvalidate(p)
27dc0 3b 0a 20 20 2f 2a 20 61 73 73 65 72 74 28 20 70  ;.  /* assert( p
27dd0 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
27de0 29 3b 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 53  ); */.  return S
27df0 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
27e00 2a 2a 20 54 68 65 20 25 5f 64 61 74 61 20 74 61  ** The %_data ta
27e10 62 6c 65 20 69 73 20 63 6f 6d 70 6c 65 74 65 6c  ble is completel
27e20 79 20 65 6d 70 74 79 20 77 68 65 6e 20 74 68 69  y empty when thi
27e30 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
27e40 6c 6c 65 64 2e 20 54 68 69 73 0a 2a 2a 20 66 75  lled. This.** fu
27e50 6e 63 74 69 6f 6e 20 70 6f 70 75 6c 61 74 65 73  nction populates
27e60 20 69 74 20 77 69 74 68 20 74 68 65 20 69 6e 69   it with the ini
27e70 74 69 61 6c 20 73 74 72 75 63 74 75 72 65 20 6f  tial structure o
27e80 62 6a 65 63 74 73 20 66 6f 72 20 65 61 63 68 20  bjects for each 
27e90 69 6e 64 65 78 2c 0a 2a 2a 20 61 6e 64 20 74 68  index,.** and th
27ea0 65 20 69 6e 69 74 69 61 6c 20 76 65 72 73 69 6f  e initial versio
27eb0 6e 20 6f 66 20 74 68 65 20 22 61 76 65 72 61 67  n of the "averag
27ec0 65 73 22 20 72 65 63 6f 72 64 20 28 61 20 7a 65  es" record (a ze
27ed0 72 6f 2d 62 79 74 65 20 62 6c 6f 62 29 2e 0a 2a  ro-byte blob)..*
27ee0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73  /.int sqlite3Fts
27ef0 35 49 6e 64 65 78 52 65 69 6e 69 74 28 46 74 73  5IndexReinit(Fts
27f00 35 49 6e 64 65 78 20 2a 70 29 7b 0a 20 20 46 74  5Index *p){.  Ft
27f10 73 35 53 74 72 75 63 74 75 72 65 20 73 3b 0a 20  s5Structure s;. 
27f20 20 66 74 73 35 53 74 72 75 63 74 75 72 65 49 6e   fts5StructureIn
27f30 76 61 6c 69 64 61 74 65 28 70 29 3b 0a 20 20 6d  validate(p);.  m
27f40 65 6d 73 65 74 28 26 73 2c 20 30 2c 20 73 69 7a  emset(&s, 0, siz
27f50 65 6f 66 28 46 74 73 35 53 74 72 75 63 74 75 72  eof(Fts5Structur
27f60 65 29 29 3b 0a 20 20 66 74 73 35 44 61 74 61 57  e));.  fts5DataW
27f70 72 69 74 65 28 70 2c 20 46 54 53 35 5f 41 56 45  rite(p, FTS5_AVE
27f80 52 41 47 45 53 5f 52 4f 57 49 44 2c 20 28 63 6f  RAGES_ROWID, (co
27f90 6e 73 74 20 75 38 2a 29 22 22 2c 20 30 29 3b 0a  nst u8*)"", 0);.
27fa0 20 20 66 74 73 35 53 74 72 75 63 74 75 72 65 57    fts5StructureW
27fb0 72 69 74 65 28 70 2c 20 26 73 29 3b 0a 20 20 72  rite(p, &s);.  r
27fc0 65 74 75 72 6e 20 66 74 73 35 49 6e 64 65 78 52  eturn fts5IndexR
27fd0 65 74 75 72 6e 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a  eturn(p);.}../*.
27fe0 2a 2a 20 4f 70 65 6e 20 61 20 6e 65 77 20 46 74  ** Open a new Ft
27ff0 73 35 49 6e 64 65 78 20 68 61 6e 64 6c 65 2e 20  s5Index handle. 
28000 49 66 20 74 68 65 20 62 43 72 65 61 74 65 20 61  If the bCreate a
28010 72 67 75 6d 65 6e 74 20 69 73 20 74 72 75 65 2c  rgument is true,
28020 20 63 72 65 61 74 65 0a 2a 2a 20 61 6e 64 20 69   create.** and i
28030 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 75 6e  nitialize the un
28040 64 65 72 6c 79 69 6e 67 20 25 5f 64 61 74 61 20  derlying %_data 
28050 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  table..**.** If 
28060 73 75 63 63 65 73 73 66 75 6c 2c 20 73 65 74 20  successful, set 
28070 2a 70 70 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20  *pp to point to 
28080 74 68 65 20 6e 65 77 20 6f 62 6a 65 63 74 20 61  the new object a
28090 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  nd return SQLITE
280a0 5f 4f 4b 2e 0a 2a 2a 20 4f 74 68 65 72 77 69 73  _OK..** Otherwis
280b0 65 2c 20 73 65 74 20 2a 70 70 20 74 6f 20 4e 55  e, set *pp to NU
280c0 4c 4c 20 61 6e 64 20 72 65 74 75 72 6e 20 61 6e  LL and return an
280d0 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f   SQLite error co
280e0 64 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  de..*/.int sqlit
280f0 65 33 46 74 73 35 49 6e 64 65 78 4f 70 65 6e 28  e3Fts5IndexOpen(
28100 0a 20 20 46 74 73 35 43 6f 6e 66 69 67 20 2a 70  .  Fts5Config *p
28110 43 6f 6e 66 69 67 2c 20 0a 20 20 69 6e 74 20 62  Config, .  int b
28120 43 72 65 61 74 65 2c 20 0a 20 20 46 74 73 35 49  Create, .  Fts5I
28130 6e 64 65 78 20 2a 2a 70 70 2c 0a 20 20 63 68 61  ndex **pp,.  cha
28140 72 20 2a 2a 70 7a 45 72 72 0a 29 7b 0a 20 20 69  r **pzErr.){.  i
28150 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
28160 4b 3b 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a  K;.  Fts5Index *
28170 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p;              
28180 20 20 20 20 20 2f 2a 20 4e 65 77 20 6f 62 6a 65       /* New obje
28190 63 74 20 2a 2f 0a 0a 20 20 2a 70 70 20 3d 20 70  ct */..  *pp = p
281a0 20 3d 20 28 46 74 73 35 49 6e 64 65 78 2a 29 73   = (Fts5Index*)s
281b0 71 6c 69 74 65 33 46 74 73 35 4d 61 6c 6c 6f 63  qlite3Fts5Malloc
281c0 5a 65 72 6f 28 26 72 63 2c 20 73 69 7a 65 6f 66  Zero(&rc, sizeof
281d0 28 46 74 73 35 49 6e 64 65 78 29 29 3b 0a 20 20  (Fts5Index));.  
281e0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
281f0 4b 20 29 7b 0a 20 20 20 20 70 2d 3e 70 43 6f 6e  K ){.    p->pCon
28200 66 69 67 20 3d 20 70 43 6f 6e 66 69 67 3b 0a 20  fig = pConfig;. 
28210 20 20 20 70 2d 3e 6e 57 6f 72 6b 55 6e 69 74 20     p->nWorkUnit 
28220 3d 20 46 54 53 35 5f 57 4f 52 4b 5f 55 4e 49 54  = FTS5_WORK_UNIT
28230 3b 0a 20 20 20 20 70 2d 3e 7a 44 61 74 61 54 62  ;.    p->zDataTb
28240 6c 20 3d 20 73 71 6c 69 74 65 33 46 74 73 35 4d  l = sqlite3Fts5M
28250 70 72 69 6e 74 66 28 26 72 63 2c 20 22 25 73 5f  printf(&rc, "%s_
28260 64 61 74 61 22 2c 20 70 43 6f 6e 66 69 67 2d 3e  data", pConfig->
28270 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20  zName);.    if( 
28280 70 2d 3e 7a 44 61 74 61 54 62 6c 20 26 26 20 62  p->zDataTbl && b
28290 43 72 65 61 74 65 20 29 7b 0a 20 20 20 20 20 20  Create ){.      
282a0 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74 73 35  rc = sqlite3Fts5
282b0 43 72 65 61 74 65 54 61 62 6c 65 28 0a 20 20 20  CreateTable(.   
282c0 20 20 20 20 20 20 20 70 43 6f 6e 66 69 67 2c 20         pConfig, 
282d0 22 64 61 74 61 22 2c 20 22 69 64 20 49 4e 54 45  "data", "id INTE
282e0 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c  GER PRIMARY KEY,
282f0 20 62 6c 6f 63 6b 20 42 4c 4f 42 22 2c 20 30 2c   block BLOB", 0,
28300 20 70 7a 45 72 72 0a 20 20 20 20 20 20 29 3b 0a   pzErr.      );.
28310 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
28320 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
28330 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 46     rc = sqlite3F
28340 74 73 35 43 72 65 61 74 65 54 61 62 6c 65 28 70  ts5CreateTable(p
28350 43 6f 6e 66 69 67 2c 20 22 69 64 78 22 2c 20 0a  Config, "idx", .
28360 20 20 20 20 20 20 20 20 20 20 20 20 22 73 65 67              "seg
28370 69 64 2c 20 74 65 72 6d 2c 20 70 67 6e 6f 2c 20  id, term, pgno, 
28380 50 52 49 4d 41 52 59 20 4b 45 59 28 73 65 67 69  PRIMARY KEY(segi
28390 64 2c 20 74 65 72 6d 29 22 2c 20 0a 20 20 20 20  d, term)", .    
283a0 20 20 20 20 20 20 20 20 31 2c 20 70 7a 45 72 72          1, pzErr
283b0 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20  .        );.    
283c0 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63    }.      if( rc
283d0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
283e0 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
283f0 74 65 33 46 74 73 35 49 6e 64 65 78 52 65 69 6e  te3Fts5IndexRein
28400 69 74 28 70 29 3b 0a 20 20 20 20 20 20 7d 0a 20  it(p);.      }. 
28410 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 61 73 73 65     }.  }..  asse
28420 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  rt( rc!=SQLITE_O
28430 4b 20 7c 7c 20 70 2d 3e 72 63 3d 3d 53 51 4c 49  K || p->rc==SQLI
28440 54 45 5f 4f 4b 20 29 3b 0a 20 20 69 66 28 20 72  TE_OK );.  if( r
28450 63 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  c ){.    sqlite3
28460 46 74 73 35 49 6e 64 65 78 43 6c 6f 73 65 28 70  Fts5IndexClose(p
28470 29 3b 0a 20 20 20 20 2a 70 70 20 3d 20 30 3b 0a  );.    *pp = 0;.
28480 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
28490 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20  .}../*.** Close 
284a0 61 20 68 61 6e 64 6c 65 20 6f 70 65 6e 65 64 20  a handle opened 
284b0 62 79 20 61 6e 20 65 61 72 6c 69 65 72 20 63 61  by an earlier ca
284c0 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 46 74 73  ll to sqlite3Fts
284d0 35 49 6e 64 65 78 4f 70 65 6e 28 29 2e 0a 2a 2f  5IndexOpen()..*/
284e0 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35  .int sqlite3Fts5
284f0 49 6e 64 65 78 43 6c 6f 73 65 28 46 74 73 35 49  IndexClose(Fts5I
28500 6e 64 65 78 20 2a 70 29 7b 0a 20 20 69 6e 74 20  ndex *p){.  int 
28510 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
28520 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 61    if( p ){.    a
28530 73 73 65 72 74 28 20 70 2d 3e 70 52 65 61 64 65  ssert( p->pReade
28540 72 3d 3d 30 20 29 3b 0a 20 20 20 20 66 74 73 35  r==0 );.    fts5
28550 53 74 72 75 63 74 75 72 65 49 6e 76 61 6c 69 64  StructureInvalid
28560 61 74 65 28 70 29 3b 0a 20 20 20 20 73 71 6c 69  ate(p);.    sqli
28570 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 2d 3e  te3_finalize(p->
28580 70 57 72 69 74 65 72 29 3b 0a 20 20 20 20 73 71  pWriter);.    sq
28590 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70  lite3_finalize(p
285a0 2d 3e 70 44 65 6c 65 74 65 72 29 3b 0a 20 20 20  ->pDeleter);.   
285b0 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a   sqlite3_finaliz
285c0 65 28 70 2d 3e 70 49 64 78 57 72 69 74 65 72 29  e(p->pIdxWriter)
285d0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69  ;.    sqlite3_fi
285e0 6e 61 6c 69 7a 65 28 70 2d 3e 70 49 64 78 44 65  nalize(p->pIdxDe
285f0 6c 65 74 65 72 29 3b 0a 20 20 20 20 73 71 6c 69  leter);.    sqli
28600 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 2d 3e  te3_finalize(p->
28610 70 49 64 78 53 65 6c 65 63 74 29 3b 0a 20 20 20  pIdxSelect);.   
28620 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a   sqlite3_finaliz
28630 65 28 70 2d 3e 70 44 61 74 61 56 65 72 73 69 6f  e(p->pDataVersio
28640 6e 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 46  n);.    sqlite3F
28650 74 73 35 48 61 73 68 46 72 65 65 28 70 2d 3e 70  ts5HashFree(p->p
28660 48 61 73 68 29 3b 0a 20 20 20 20 73 71 6c 69 74  Hash);.    sqlit
28670 65 33 5f 66 72 65 65 28 70 2d 3e 7a 44 61 74 61  e3_free(p->zData
28680 54 62 6c 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  Tbl);.    sqlite
28690 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 7d 0a 20  3_free(p);.  }. 
286a0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
286b0 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20 70 20  *.** Argument p 
286c0 70 6f 69 6e 74 73 20 74 6f 20 61 20 62 75 66 66  points to a buff
286d0 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 75 74  er containing ut
286e0 66 2d 38 20 74 65 78 74 20 74 68 61 74 20 69 73  f-8 text that is
286f0 20 6e 20 62 79 74 65 73 20 69 6e 20 0a 2a 2a 20   n bytes in .** 
28700 73 69 7a 65 2e 20 52 65 74 75 72 6e 20 74 68 65  size. Return the
28710 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   number of bytes
28720 20 69 6e 20 74 68 65 20 6e 43 68 61 72 20 63 68   in the nChar ch
28730 61 72 61 63 74 65 72 20 70 72 65 66 69 78 20 6f  aracter prefix o
28740 66 20 74 68 65 0a 2a 2a 20 62 75 66 66 65 72 2c  f the.** buffer,
28750 20 6f 72 20 30 20 69 66 20 74 68 65 72 65 20 61   or 0 if there a
28760 72 65 20 6c 65 73 73 20 74 68 61 6e 20 6e 43 68  re less than nCh
28770 61 72 20 63 68 61 72 61 63 74 65 72 73 20 69 6e  ar characters in
28780 20 74 6f 74 61 6c 2e 0a 2a 2f 0a 69 6e 74 20 73   total..*/.int s
28790 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78 43  qlite3Fts5IndexC
287a0 68 61 72 6c 65 6e 54 6f 42 79 74 65 6c 65 6e 28  harlenToBytelen(
287b0 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 70  .  const char *p
287c0 2c 20 0a 20 20 69 6e 74 20 6e 42 79 74 65 2c 20  , .  int nByte, 
287d0 0a 20 20 69 6e 74 20 6e 43 68 61 72 0a 29 7b 0a  .  int nChar.){.
287e0 20 20 69 6e 74 20 6e 20 3d 20 30 3b 0a 20 20 69    int n = 0;.  i
287f0 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  nt i;.  for(i=0;
28800 20 69 3c 6e 43 68 61 72 3b 20 69 2b 2b 29 7b 0a   i<nChar; i++){.
28810 20 20 20 20 69 66 28 20 6e 3e 3d 6e 42 79 74 65      if( n>=nByte
28820 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20   ) return 0;    
28830 20 20 2f 2a 20 49 6e 70 75 74 20 63 6f 6e 74 61    /* Input conta
28840 69 6e 73 20 66 65 77 65 72 20 74 68 61 6e 20 6e  ins fewer than n
28850 43 68 61 72 20 63 68 61 72 73 20 2a 2f 0a 20 20  Char chars */.  
28860 20 20 69 66 28 20 28 75 6e 73 69 67 6e 65 64 20    if( (unsigned 
28870 63 68 61 72 29 70 5b 6e 2b 2b 5d 3e 3d 30 78 63  char)p[n++]>=0xc
28880 30 20 29 7b 0a 20 20 20 20 20 20 77 68 69 6c 65  0 ){.      while
28890 28 20 28 70 5b 6e 5d 20 26 20 30 78 63 30 29 3d  ( (p[n] & 0xc0)=
288a0 3d 30 78 38 30 20 29 7b 0a 20 20 20 20 20 20 20  =0x80 ){.       
288b0 20 6e 2b 2b 3b 0a 20 20 20 20 20 20 20 20 69 66   n++;.        if
288c0 28 20 6e 3e 3d 6e 42 79 74 65 20 29 20 62 72 65  ( n>=nByte ) bre
288d0 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
288e0 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e  }.  }.  return n
288f0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70 49 6e 20 69  ;.}../*.** pIn i
28900 73 20 61 20 55 54 46 2d 38 20 65 6e 63 6f 64 65  s a UTF-8 encode
28910 64 20 73 74 72 69 6e 67 2c 20 6e 49 6e 20 62 79  d string, nIn by
28920 74 65 73 20 69 6e 20 73 69 7a 65 2e 20 52 65 74  tes in size. Ret
28930 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  urn the number o
28940 66 0a 2a 2a 20 75 6e 69 63 6f 64 65 20 63 68 61  f.** unicode cha
28950 72 61 63 74 65 72 73 20 69 6e 20 74 68 65 20 73  racters in the s
28960 74 72 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63  tring..*/.static
28970 20 69 6e 74 20 66 74 73 35 49 6e 64 65 78 43 68   int fts5IndexCh
28980 61 72 6c 65 6e 28 63 6f 6e 73 74 20 63 68 61 72  arlen(const char
28990 20 2a 70 49 6e 2c 20 69 6e 74 20 6e 49 6e 29 7b   *pIn, int nIn){
289a0 0a 20 20 69 6e 74 20 6e 43 68 61 72 20 3d 20 30  .  int nChar = 0
289b0 3b 20 20 20 20 20 20 20 20 20 20 20 20 0a 20 20  ;            .  
289c0 69 6e 74 20 69 20 3d 20 30 3b 0a 20 20 77 68 69  int i = 0;.  whi
289d0 6c 65 28 20 69 3c 6e 49 6e 20 29 7b 0a 20 20 20  le( i<nIn ){.   
289e0 20 69 66 28 20 28 75 6e 73 69 67 6e 65 64 20 63   if( (unsigned c
289f0 68 61 72 29 70 49 6e 5b 69 2b 2b 5d 3e 3d 30 78  har)pIn[i++]>=0x
28a00 63 30 20 29 7b 0a 20 20 20 20 20 20 77 68 69 6c  c0 ){.      whil
28a10 65 28 20 69 3c 6e 49 6e 20 26 26 20 28 70 49 6e  e( i<nIn && (pIn
28a20 5b 69 5d 20 26 20 30 78 63 30 29 3d 3d 30 78 38  [i] & 0xc0)==0x8
28a30 30 20 29 20 69 2b 2b 3b 0a 20 20 20 20 7d 0a 20  0 ) i++;.    }. 
28a40 20 20 20 6e 43 68 61 72 2b 2b 3b 0a 20 20 7d 0a     nChar++;.  }.
28a50 20 20 72 65 74 75 72 6e 20 6e 43 68 61 72 3b 0a    return nChar;.
28a60 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 73 65 72 74 20  }../*.** Insert 
28a70 6f 72 20 72 65 6d 6f 76 65 20 64 61 74 61 20 74  or remove data t
28a80 6f 20 6f 72 20 66 72 6f 6d 20 74 68 65 20 69 6e  o or from the in
28a90 64 65 78 2e 20 45 61 63 68 20 74 69 6d 65 20 61  dex. Each time a
28aa0 20 64 6f 63 75 6d 65 6e 74 20 69 73 20 0a 2a 2a   document is .**
28ab0 20 61 64 64 65 64 20 74 6f 20 6f 72 20 72 65 6d   added to or rem
28ac0 6f 76 65 64 20 66 72 6f 6d 20 74 68 65 20 69 6e  oved from the in
28ad0 64 65 78 2c 20 74 68 69 73 20 66 75 6e 63 74 69  dex, this functi
28ae0 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 6f 6e 65  on is called one
28af0 20 6f 72 20 6d 6f 72 65 0a 2a 2a 20 74 69 6d 65   or more.** time
28b00 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 61 6e 20  s..**.** For an 
28b10 69 6e 73 65 72 74 2c 20 69 74 20 6d 75 73 74 20  insert, it must 
28b20 62 65 20 63 61 6c 6c 65 64 20 6f 6e 63 65 20 66  be called once f
28b30 6f 72 20 65 61 63 68 20 74 6f 6b 65 6e 20 69 6e  or each token in
28b40 20 74 68 65 20 6e 65 77 20 64 6f 63 75 6d 65 6e   the new documen
28b50 74 2e 0a 2a 2a 20 49 66 20 74 68 65 20 6f 70 65  t..** If the ope
28b60 72 61 74 69 6f 6e 20 69 73 20 61 20 64 65 6c 65  ration is a dele
28b70 74 65 2c 20 69 74 20 6d 75 73 74 20 62 65 20 63  te, it must be c
28b80 61 6c 6c 65 64 20 28 61 74 20 6c 65 61 73 74 29  alled (at least)
28b90 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 0a 2a   once for each.*
28ba0 2a 20 75 6e 69 71 75 65 20 74 6f 6b 65 6e 20 69  * unique token i
28bb0 6e 20 74 68 65 20 64 6f 63 75 6d 65 6e 74 20 77  n the document w
28bc0 69 74 68 20 61 6e 20 69 43 6f 6c 20 76 61 6c 75  ith an iCol valu
28bd0 65 20 6c 65 73 73 20 74 68 61 6e 20 7a 65 72 6f  e less than zero
28be0 2e 20 54 68 65 20 69 50 6f 73 0a 2a 2a 20 61 72  . The iPos.** ar
28bf0 67 75 6d 65 6e 74 20 69 73 20 69 67 6e 6f 72 65  gument is ignore
28c00 64 20 66 6f 72 20 61 20 64 65 6c 65 74 65 2e 0a  d for a delete..
28c10 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74  */.int sqlite3Ft
28c20 73 35 49 6e 64 65 78 57 72 69 74 65 28 0a 20 20  s5IndexWrite(.  
28c30 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 20 20  Fts5Index *p,   
28c40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28c50 2f 2a 20 49 6e 64 65 78 20 74 6f 20 77 72 69 74  /* Index to writ
28c60 65 20 74 6f 20 2a 2f 0a 20 20 69 6e 74 20 69 43  e to */.  int iC
28c70 6f 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ol,             
28c80 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c            /* Col
28c90 75 6d 6e 20 74 6f 6b 65 6e 20 61 70 70 65 61 72  umn token appear
28ca0 73 20 69 6e 20 28 2d 76 65 20 2d 3e 20 64 65 6c  s in (-ve -> del
28cb0 65 74 65 29 20 2a 2f 0a 20 20 69 6e 74 20 69 50  ete) */.  int iP
28cc0 6f 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  os,             
28cd0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 73            /* Pos
28ce0 69 74 69 6f 6e 20 6f 66 20 74 6f 6b 65 6e 20 77  ition of token w
28cf0 69 74 68 69 6e 20 63 6f 6c 75 6d 6e 20 2a 2f 0a  ithin column */.
28d00 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 70 54    const char *pT
28d10 6f 6b 65 6e 2c 20 69 6e 74 20 6e 54 6f 6b 65 6e  oken, int nToken
28d20 20 20 2f 2a 20 54 6f 6b 65 6e 20 74 6f 20 61 64    /* Token to ad
28d30 64 20 6f 72 20 72 65 6d 6f 76 65 20 74 6f 20 6f  d or remove to o
28d40 72 20 66 72 6f 6d 20 69 6e 64 65 78 20 2a 2f 0a  r from index */.
28d50 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20  ){.  int i;     
28d60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28d70 20 20 20 20 20 2f 2a 20 55 73 65 64 20 74 6f 20       /* Used to 
28d80 69 74 65 72 61 74 65 20 74 68 72 6f 75 67 68 20  iterate through 
28d90 69 6e 64 65 78 65 73 20 2a 2f 0a 20 20 69 6e 74  indexes */.  int
28da0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
28db0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
28dc0 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20  Return code */. 
28dd0 20 46 74 73 35 43 6f 6e 66 69 67 20 2a 70 43 6f   Fts5Config *pCo
28de0 6e 66 69 67 20 3d 20 70 2d 3e 70 43 6f 6e 66 69  nfig = p->pConfi
28df0 67 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 2d  g;..  assert( p-
28e00 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  >rc==SQLITE_OK )
28e10 3b 0a 20 20 61 73 73 65 72 74 28 20 28 69 43 6f  ;.  assert( (iCo
28e20 6c 3c 30 29 3d 3d 70 2d 3e 62 44 65 6c 65 74 65  l<0)==p->bDelete
28e30 20 29 3b 0a 0a 20 20 2f 2a 20 41 64 64 20 74 68   );..  /* Add th
28e40 65 20 65 6e 74 72 79 20 74 6f 20 74 68 65 20 6d  e entry to the m
28e50 61 69 6e 20 74 65 72 6d 73 20 69 6e 64 65 78 2e  ain terms index.
28e60 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74   */.  rc = sqlit
28e70 65 33 46 74 73 35 48 61 73 68 57 72 69 74 65 28  e3Fts5HashWrite(
28e80 0a 20 20 20 20 20 20 70 2d 3e 70 48 61 73 68 2c  .      p->pHash,
28e90 20 70 2d 3e 69 57 72 69 74 65 52 6f 77 69 64 2c   p->iWriteRowid,
28ea0 20 69 43 6f 6c 2c 20 69 50 6f 73 2c 20 46 54 53   iCol, iPos, FTS
28eb0 35 5f 4d 41 49 4e 5f 50 52 45 46 49 58 2c 20 70  5_MAIN_PREFIX, p
28ec0 54 6f 6b 65 6e 2c 20 6e 54 6f 6b 65 6e 0a 20 20  Token, nToken.  
28ed0 29 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  );..  for(i=0; i
28ee0 3c 70 43 6f 6e 66 69 67 2d 3e 6e 50 72 65 66 69  <pConfig->nPrefi
28ef0 78 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f  x && rc==SQLITE_
28f00 4f 4b 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63 6f  OK; i++){.    co
28f10 6e 73 74 20 69 6e 74 20 6e 43 68 61 72 20 3d 20  nst int nChar = 
28f20 70 43 6f 6e 66 69 67 2d 3e 61 50 72 65 66 69 78  pConfig->aPrefix
28f30 5b 69 5d 3b 0a 20 20 20 20 69 6e 74 20 6e 42 79  [i];.    int nBy
28f40 74 65 20 3d 20 73 71 6c 69 74 65 33 46 74 73 35  te = sqlite3Fts5
28f50 49 6e 64 65 78 43 68 61 72 6c 65 6e 54 6f 42 79  IndexCharlenToBy
28f60 74 65 6c 65 6e 28 70 54 6f 6b 65 6e 2c 20 6e 54  telen(pToken, nT
28f70 6f 6b 65 6e 2c 20 6e 43 68 61 72 29 3b 0a 20 20  oken, nChar);.  
28f80 20 20 69 66 28 20 6e 42 79 74 65 20 29 7b 0a 20    if( nByte ){. 
28f90 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
28fa0 33 46 74 73 35 48 61 73 68 57 72 69 74 65 28 70  3Fts5HashWrite(p
28fb0 2d 3e 70 48 61 73 68 2c 20 0a 20 20 20 20 20 20  ->pHash, .      
28fc0 20 20 20 20 70 2d 3e 69 57 72 69 74 65 52 6f 77      p->iWriteRow
28fd0 69 64 2c 20 69 43 6f 6c 2c 20 69 50 6f 73 2c 20  id, iCol, iPos, 
28fe0 28 63 68 61 72 29 28 46 54 53 35 5f 4d 41 49 4e  (char)(FTS5_MAIN
28ff0 5f 50 52 45 46 49 58 2b 69 2b 31 29 2c 20 70 54  _PREFIX+i+1), pT
29000 6f 6b 65 6e 2c 0a 20 20 20 20 20 20 20 20 20 20  oken,.          
29010 6e 42 79 74 65 0a 20 20 20 20 20 20 29 3b 0a 20  nByte.      );. 
29020 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75     }.  }..  retu
29030 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
29040 4f 70 65 6e 20 61 20 6e 65 77 20 69 74 65 72 61  Open a new itera
29050 74 6f 72 20 74 6f 20 69 74 65 72 61 74 65 20 74  tor to iterate t
29060 68 6f 75 67 68 20 61 6c 6c 20 72 6f 77 69 64 20  hough all rowid 
29070 74 68 61 74 20 6d 61 74 63 68 20 74 68 65 20 0a  that match the .
29080 2a 2a 20 73 70 65 63 69 66 69 65 64 20 74 6f 6b  ** specified tok
29090 65 6e 20 6f 72 20 74 6f 6b 65 6e 20 70 72 65 66  en or token pref
290a0 69 78 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ix..*/.int sqlit
290b0 65 33 46 74 73 35 49 6e 64 65 78 51 75 65 72 79  e3Fts5IndexQuery
290c0 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70  (.  Fts5Index *p
290d0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
290e0 20 20 20 20 2f 2a 20 46 54 53 20 69 6e 64 65 78      /* FTS index
290f0 20 74 6f 20 71 75 65 72 79 20 2a 2f 0a 20 20 63   to query */.  c
29100 6f 6e 73 74 20 63 68 61 72 20 2a 70 54 6f 6b 65  onst char *pToke
29110 6e 2c 20 69 6e 74 20 6e 54 6f 6b 65 6e 2c 20 2f  n, int nToken, /
29120 2a 20 54 6f 6b 65 6e 20 28 6f 72 20 70 72 65 66  * Token (or pref
29130 69 78 29 20 74 6f 20 71 75 65 72 79 20 66 6f 72  ix) to query for
29140 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c   */.  int flags,
29150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29160 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66        /* Mask of
29170 20 46 54 53 35 49 4e 44 45 58 5f 51 55 45 52 59   FTS5INDEX_QUERY
29180 5f 58 20 66 6c 61 67 73 20 2a 2f 0a 20 20 46 74  _X flags */.  Ft
29190 73 35 43 6f 6c 73 65 74 20 2a 70 43 6f 6c 73 65  s5Colset *pColse
291a0 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  t,            /*
291b0 20 4d 61 74 63 68 20 74 68 65 73 65 20 63 6f 6c   Match these col
291c0 75 6d 6e 73 20 6f 6e 6c 79 20 2a 2f 0a 20 20 46  umns only */.  F
291d0 74 73 35 49 6e 64 65 78 49 74 65 72 20 2a 2a 70  ts5IndexIter **p
291e0 70 49 74 65 72 20 20 20 20 20 20 20 20 20 20 2f  pIter          /
291f0 2a 20 4f 55 54 3a 20 4e 65 77 20 69 74 65 72 61  * OUT: New itera
29200 74 6f 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 29 7b  tor object */.){
29210 0a 20 20 46 74 73 35 43 6f 6e 66 69 67 20 2a 70  .  Fts5Config *p
29220 43 6f 6e 66 69 67 20 3d 20 70 2d 3e 70 43 6f 6e  Config = p->pCon
29230 66 69 67 3b 0a 20 20 46 74 73 35 49 74 65 72 20  fig;.  Fts5Iter 
29240 2a 70 52 65 74 20 3d 20 30 3b 0a 20 20 46 74 73  *pRet = 0;.  Fts
29250 35 42 75 66 66 65 72 20 62 75 66 20 3d 20 7b 30  5Buffer buf = {0
29260 2c 20 30 2c 20 30 7d 3b 0a 0a 20 20 2f 2a 20 49  , 0, 0};..  /* I
29270 66 20 74 68 65 20 51 55 45 52 59 5f 53 43 41 4e  f the QUERY_SCAN
29280 20 66 6c 61 67 20 69 73 20 73 65 74 2c 20 61 6c   flag is set, al
29290 6c 20 6f 74 68 65 72 20 66 6c 61 67 73 20 6d 75  l other flags mu
292a0 73 74 20 62 65 20 63 6c 65 61 72 2e 20 2a 2f 0a  st be clear. */.
292b0 20 20 61 73 73 65 72 74 28 20 28 66 6c 61 67 73    assert( (flags
292c0 20 26 20 46 54 53 35 49 4e 44 45 58 5f 51 55 45   & FTS5INDEX_QUE
292d0 52 59 5f 53 43 41 4e 29 3d 3d 30 20 7c 7c 20 66  RY_SCAN)==0 || f
292e0 6c 61 67 73 3d 3d 46 54 53 35 49 4e 44 45 58 5f  lags==FTS5INDEX_
292f0 51 55 45 52 59 5f 53 43 41 4e 20 29 3b 0a 0a 20  QUERY_SCAN );.. 
29300 20 69 66 28 20 73 71 6c 69 74 65 33 46 74 73 35   if( sqlite3Fts5
29310 42 75 66 66 65 72 53 69 7a 65 28 26 70 2d 3e 72  BufferSize(&p->r
29320 63 2c 20 26 62 75 66 2c 20 6e 54 6f 6b 65 6e 2b  c, &buf, nToken+
29330 31 29 3d 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74  1)==0 ){.    int
29340 20 69 49 64 78 20 3d 20 30 3b 20 20 20 20 20 20   iIdx = 0;      
29350 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
29360 64 65 78 20 74 6f 20 73 65 61 72 63 68 20 2a 2f  dex to search */
29370 0a 20 20 20 20 69 66 28 20 6e 54 6f 6b 65 6e 20  .    if( nToken 
29380 29 20 6d 65 6d 63 70 79 28 26 62 75 66 2e 70 5b  ) memcpy(&buf.p[
29390 31 5d 2c 20 70 54 6f 6b 65 6e 2c 20 6e 54 6f 6b  1], pToken, nTok
293a0 65 6e 29 3b 0a 0a 20 20 20 20 2f 2a 20 46 69 67  en);..    /* Fig
293b0 75 72 65 20 6f 75 74 20 77 68 69 63 68 20 69 6e  ure out which in
293c0 64 65 78 20 74 6f 20 73 65 61 72 63 68 20 61 6e  dex to search an
293d0 64 20 73 65 74 20 69 49 64 78 20 61 63 63 6f 72  d set iIdx accor
293e0 64 69 6e 67 6c 79 2e 20 49 66 20 74 68 69 73 0a  dingly. If this.
293f0 20 20 20 20 2a 2a 20 69 73 20 61 20 70 72 65 66      ** is a pref
29400 69 78 20 71 75 65 72 79 20 66 6f 72 20 77 68 69  ix query for whi
29410 63 68 20 74 68 65 72 65 20 69 73 20 6e 6f 20 70  ch there is no p
29420 72 65 66 69 78 20 69 6e 64 65 78 2c 20 73 65 74  refix index, set
29430 20 69 49 64 78 20 74 6f 0a 20 20 20 20 2a 2a 20   iIdx to.    ** 
29440 67 72 65 61 74 65 72 20 74 68 61 6e 20 70 43 6f  greater than pCo
29450 6e 66 69 67 2d 3e 6e 50 72 65 66 69 78 20 74 6f  nfig->nPrefix to
29460 20 69 6e 64 69 63 61 74 65 20 74 68 61 74 20 74   indicate that t
29470 68 65 20 71 75 65 72 79 20 77 69 6c 6c 20 62 65  he query will be
29480 0a 20 20 20 20 2a 2a 20 73 61 74 69 73 66 69 65  .    ** satisfie
29490 64 20 62 79 20 73 63 61 6e 6e 69 6e 67 20 6d 75  d by scanning mu
294a0 6c 74 69 70 6c 65 20 74 65 72 6d 73 20 69 6e 20  ltiple terms in 
294b0 74 68 65 20 6d 61 69 6e 20 69 6e 64 65 78 2e 0a  the main index..
294c0 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66      **.    ** If
294d0 20 74 68 65 20 51 55 45 52 59 5f 54 45 53 54 5f   the QUERY_TEST_
294e0 4e 4f 49 44 58 20 66 6c 61 67 20 77 61 73 20 73  NOIDX flag was s
294f0 70 65 63 69 66 69 65 64 2c 20 74 68 65 6e 20 74  pecified, then t
29500 68 69 73 20 6d 75 73 74 20 62 65 20 61 0a 20 20  his must be a.  
29510 20 20 2a 2a 20 70 72 65 66 69 78 2d 71 75 65 72    ** prefix-quer
29520 79 2e 20 49 6e 73 74 65 61 64 20 6f 66 20 75 73  y. Instead of us
29530 69 6e 67 20 61 20 70 72 65 66 69 78 2d 69 6e 64  ing a prefix-ind
29540 65 78 20 28 69 66 20 6f 6e 65 20 65 78 69 73 74  ex (if one exist
29550 73 29 2c 20 0a 20 20 20 20 2a 2a 20 65 76 61 6c  s), .    ** eval
29560 75 61 74 65 20 74 68 65 20 70 72 65 66 69 78 20  uate the prefix 
29570 71 75 65 72 79 20 75 73 69 6e 67 20 74 68 65 20  query using the 
29580 6d 61 69 6e 20 46 54 53 20 69 6e 64 65 78 2e 20  main FTS index. 
29590 54 68 69 73 20 69 73 20 75 73 65 64 0a 20 20 20  This is used.   
295a0 20 2a 2a 20 66 6f 72 20 69 6e 74 65 72 6e 61 6c   ** for internal
295b0 20 73 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67   sanity checking
295c0 20 62 79 20 74 68 65 20 69 6e 74 65 67 72 69 74   by the integrit
295d0 79 2d 63 68 65 63 6b 20 69 6e 20 64 65 62 75 67  y-check in debug
295e0 20 0a 20 20 20 20 2a 2a 20 6d 6f 64 65 20 6f 6e   .    ** mode on
295f0 6c 79 2e 20 20 2a 2f 0a 23 69 66 64 65 66 20 53  ly.  */.#ifdef S
29600 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20  QLITE_DEBUG.    
29610 69 66 28 20 70 43 6f 6e 66 69 67 2d 3e 62 50 72  if( pConfig->bPr
29620 65 66 69 78 49 6e 64 65 78 3d 3d 30 20 7c 7c 20  efixIndex==0 || 
29630 28 66 6c 61 67 73 20 26 20 46 54 53 35 49 4e 44  (flags & FTS5IND
29640 45 58 5f 51 55 45 52 59 5f 54 45 53 54 5f 4e 4f  EX_QUERY_TEST_NO
29650 49 44 58 29 20 29 7b 0a 20 20 20 20 20 20 61 73  IDX) ){.      as
29660 73 65 72 74 28 20 66 6c 61 67 73 20 26 20 46 54  sert( flags & FT
29670 53 35 49 4e 44 45 58 5f 51 55 45 52 59 5f 50 52  S5INDEX_QUERY_PR
29680 45 46 49 58 20 29 3b 0a 20 20 20 20 20 20 69 49  EFIX );.      iI
29690 64 78 20 3d 20 31 2b 70 43 6f 6e 66 69 67 2d 3e  dx = 1+pConfig->
296a0 6e 50 72 65 66 69 78 3b 0a 20 20 20 20 7d 65 6c  nPrefix;.    }el
296b0 73 65 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66  se.#endif.    if
296c0 28 20 66 6c 61 67 73 20 26 20 46 54 53 35 49 4e  ( flags & FTS5IN
296d0 44 45 58 5f 51 55 45 52 59 5f 50 52 45 46 49 58  DEX_QUERY_PREFIX
296e0 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 43   ){.      int nC
296f0 68 61 72 20 3d 20 66 74 73 35 49 6e 64 65 78 43  har = fts5IndexC
29700 68 61 72 6c 65 6e 28 70 54 6f 6b 65 6e 2c 20 6e  harlen(pToken, n
29710 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20 66 6f  Token);.      fo
29720 72 28 69 49 64 78 3d 31 3b 20 69 49 64 78 3c 3d  r(iIdx=1; iIdx<=
29730 70 43 6f 6e 66 69 67 2d 3e 6e 50 72 65 66 69 78  pConfig->nPrefix
29740 3b 20 69 49 64 78 2b 2b 29 7b 0a 20 20 20 20 20  ; iIdx++){.     
29750 20 20 20 69 66 28 20 70 43 6f 6e 66 69 67 2d 3e     if( pConfig->
29760 61 50 72 65 66 69 78 5b 69 49 64 78 2d 31 5d 3d  aPrefix[iIdx-1]=
29770 3d 6e 43 68 61 72 20 29 20 62 72 65 61 6b 3b 0a  =nChar ) break;.
29780 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
29790 20 20 20 69 66 28 20 69 49 64 78 3c 3d 70 43 6f     if( iIdx<=pCo
297a0 6e 66 69 67 2d 3e 6e 50 72 65 66 69 78 20 29 7b  nfig->nPrefix ){
297b0 0a 20 20 20 20 20 20 2f 2a 20 53 74 72 61 69 67  .      /* Straig
297c0 68 74 20 69 6e 64 65 78 20 6c 6f 6f 6b 75 70 20  ht index lookup 
297d0 2a 2f 0a 20 20 20 20 20 20 46 74 73 35 53 74 72  */.      Fts5Str
297e0 75 63 74 75 72 65 20 2a 70 53 74 72 75 63 74 20  ucture *pStruct 
297f0 3d 20 66 74 73 35 53 74 72 75 63 74 75 72 65 52  = fts5StructureR
29800 65 61 64 28 70 29 3b 0a 20 20 20 20 20 20 62 75  ead(p);.      bu
29810 66 2e 70 5b 30 5d 20 3d 20 28 75 38 29 28 46 54  f.p[0] = (u8)(FT
29820 53 35 5f 4d 41 49 4e 5f 50 52 45 46 49 58 20 2b  S5_MAIN_PREFIX +
29830 20 69 49 64 78 29 3b 0a 20 20 20 20 20 20 69 66   iIdx);.      if
29840 28 20 70 53 74 72 75 63 74 20 29 7b 0a 20 20 20  ( pStruct ){.   
29850 20 20 20 20 20 66 74 73 35 4d 75 6c 74 69 49 74       fts5MultiIt
29860 65 72 4e 65 77 28 70 2c 20 70 53 74 72 75 63 74  erNew(p, pStruct
29870 2c 20 66 6c 61 67 73 20 7c 20 46 54 53 35 49 4e  , flags | FTS5IN
29880 44 45 58 5f 51 55 45 52 59 5f 53 4b 49 50 45 4d  DEX_QUERY_SKIPEM
29890 50 54 59 2c 20 0a 20 20 20 20 20 20 20 20 20 20  PTY, .          
298a0 20 20 70 43 6f 6c 73 65 74 2c 20 62 75 66 2e 70    pColset, buf.p
298b0 2c 20 6e 54 6f 6b 65 6e 2b 31 2c 20 2d 31 2c 20  , nToken+1, -1, 
298c0 30 2c 20 26 70 52 65 74 0a 20 20 20 20 20 20 20  0, &pRet.       
298d0 20 29 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35   );.        fts5
298e0 53 74 72 75 63 74 75 72 65 52 65 6c 65 61 73 65  StructureRelease
298f0 28 70 53 74 72 75 63 74 29 3b 0a 20 20 20 20 20  (pStruct);.     
29900 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
29910 20 20 20 20 2f 2a 20 53 63 61 6e 20 6d 75 6c 74      /* Scan mult
29920 69 70 6c 65 20 74 65 72 6d 73 20 69 6e 20 74 68  iple terms in th
29930 65 20 6d 61 69 6e 20 69 6e 64 65 78 20 2a 2f 0a  e main index */.
29940 20 20 20 20 20 20 69 6e 74 20 62 44 65 73 63 20        int bDesc 
29950 3d 20 28 66 6c 61 67 73 20 26 20 46 54 53 35 49  = (flags & FTS5I
29960 4e 44 45 58 5f 51 55 45 52 59 5f 44 45 53 43 29  NDEX_QUERY_DESC)
29970 21 3d 30 3b 0a 20 20 20 20 20 20 62 75 66 2e 70  !=0;.      buf.p
29980 5b 30 5d 20 3d 20 46 54 53 35 5f 4d 41 49 4e 5f  [0] = FTS5_MAIN_
29990 50 52 45 46 49 58 3b 0a 20 20 20 20 20 20 66 74  PREFIX;.      ft
299a0 73 35 53 65 74 75 70 50 72 65 66 69 78 49 74 65  s5SetupPrefixIte
299b0 72 28 70 2c 20 62 44 65 73 63 2c 20 62 75 66 2e  r(p, bDesc, buf.
299c0 70 2c 20 6e 54 6f 6b 65 6e 2b 31 2c 20 70 43 6f  p, nToken+1, pCo
299d0 6c 73 65 74 2c 20 26 70 52 65 74 29 3b 0a 20 20  lset, &pRet);.  
299e0 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72      assert( p->r
299f0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c!=SQLITE_OK || 
29a00 70 52 65 74 2d 3e 70 43 6f 6c 73 65 74 3d 3d 30  pRet->pColset==0
29a10 20 29 3b 0a 20 20 20 20 20 20 66 74 73 35 49 74   );.      fts5It
29a20 65 72 53 65 74 4f 75 74 70 75 74 43 62 28 26 70  erSetOutputCb(&p
29a30 2d 3e 72 63 2c 20 70 52 65 74 29 3b 0a 20 20 20  ->rc, pRet);.   
29a40 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51     if( p->rc==SQ
29a50 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
29a60 20 20 20 46 74 73 35 53 65 67 49 74 65 72 20 2a     Fts5SegIter *
29a70 70 53 65 67 20 3d 20 26 70 52 65 74 2d 3e 61 53  pSeg = &pRet->aS
29a80 65 67 5b 70 52 65 74 2d 3e 61 46 69 72 73 74 5b  eg[pRet->aFirst[
29a90 31 5d 2e 69 46 69 72 73 74 5d 3b 0a 20 20 20 20  1].iFirst];.    
29aa0 20 20 20 20 69 66 28 20 70 53 65 67 2d 3e 70 4c      if( pSeg->pL
29ab0 65 61 66 20 29 20 70 52 65 74 2d 3e 78 53 65 74  eaf ) pRet->xSet
29ac0 4f 75 74 70 75 74 73 28 70 52 65 74 2c 20 70 53  Outputs(pRet, pS
29ad0 65 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eg);.      }.   
29ae0 20 7d 0a 0a 20 20 20 20 69 66 28 20 70 2d 3e 72   }..    if( p->r
29af0 63 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  c ){.      sqlit
29b00 65 33 46 74 73 35 49 74 65 72 43 6c 6f 73 65 28  e3Fts5IterClose(
29b10 28 46 74 73 35 49 6e 64 65 78 49 74 65 72 2a 29  (Fts5IndexIter*)
29b20 70 52 65 74 29 3b 0a 20 20 20 20 20 20 70 52 65  pRet);.      pRe
29b30 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 66 74 73  t = 0;.      fts
29b40 35 43 6c 6f 73 65 52 65 61 64 65 72 28 70 29 3b  5CloseReader(p);
29b50 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2a 70 70 49  .    }..    *ppI
29b60 74 65 72 20 3d 20 28 46 74 73 35 49 6e 64 65 78  ter = (Fts5Index
29b70 49 74 65 72 2a 29 70 52 65 74 3b 0a 20 20 20 20  Iter*)pRet;.    
29b80 73 71 6c 69 74 65 33 46 74 73 35 42 75 66 66 65  sqlite3Fts5Buffe
29b90 72 46 72 65 65 28 26 62 75 66 29 3b 0a 20 20 7d  rFree(&buf);.  }
29ba0 0a 20 20 72 65 74 75 72 6e 20 66 74 73 35 49 6e  .  return fts5In
29bb0 64 65 78 52 65 74 75 72 6e 28 70 29 3b 0a 7d 0a  dexReturn(p);.}.
29bc0 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72  ./*.** Return tr
29bd0 75 65 20 69 66 20 74 68 65 20 69 74 65 72 61 74  ue if the iterat
29be0 6f 72 20 70 61 73 73 65 64 20 61 73 20 74 68 65  or passed as the
29bf0 20 6f 6e 6c 79 20 61 72 67 75 6d 65 6e 74 20 69   only argument i
29c00 73 20 61 74 20 45 4f 46 2e 0a 2a 2f 0a 2f 2a 0a  s at EOF..*/./*.
29c10 2a 2a 20 4d 6f 76 65 20 74 6f 20 74 68 65 20 6e  ** Move to the n
29c20 65 78 74 20 6d 61 74 63 68 69 6e 67 20 72 6f 77  ext matching row
29c30 69 64 2e 20 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  id. .*/.int sqli
29c40 74 65 33 46 74 73 35 49 74 65 72 4e 65 78 74 28  te3Fts5IterNext(
29c50 46 74 73 35 49 6e 64 65 78 49 74 65 72 20 2a 70  Fts5IndexIter *p
29c60 49 6e 64 65 78 49 74 65 72 29 7b 0a 20 20 46 74  IndexIter){.  Ft
29c70 73 35 49 74 65 72 20 2a 70 49 74 65 72 20 3d 20  s5Iter *pIter = 
29c80 28 46 74 73 35 49 74 65 72 2a 29 70 49 6e 64 65  (Fts5Iter*)pInde
29c90 78 49 74 65 72 3b 0a 20 20 61 73 73 65 72 74 28  xIter;.  assert(
29ca0 20 70 49 74 65 72 2d 3e 70 49 6e 64 65 78 2d 3e   pIter->pIndex->
29cb0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  rc==SQLITE_OK );
29cc0 0a 20 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72  .  fts5MultiIter
29cd0 4e 65 78 74 28 70 49 74 65 72 2d 3e 70 49 6e 64  Next(pIter->pInd
29ce0 65 78 2c 20 70 49 74 65 72 2c 20 30 2c 20 30 29  ex, pIter, 0, 0)
29cf0 3b 0a 20 20 72 65 74 75 72 6e 20 66 74 73 35 49  ;.  return fts5I
29d00 6e 64 65 78 52 65 74 75 72 6e 28 70 49 74 65 72  ndexReturn(pIter
29d10 2d 3e 70 49 6e 64 65 78 29 3b 0a 7d 0a 0a 2f 2a  ->pIndex);.}../*
29d20 0a 2a 2a 20 4d 6f 76 65 20 74 6f 20 74 68 65 20  .** Move to the 
29d30 6e 65 78 74 20 6d 61 74 63 68 69 6e 67 20 74 65  next matching te
29d40 72 6d 2f 72 6f 77 69 64 2e 20 55 73 65 64 20 62  rm/rowid. Used b
29d50 79 20 74 68 65 20 66 74 73 35 76 6f 63 61 62 20  y the fts5vocab 
29d60 6d 6f 64 75 6c 65 2e 0a 2a 2f 0a 69 6e 74 20 73  module..*/.int s
29d70 71 6c 69 74 65 33 46 74 73 35 49 74 65 72 4e 65  qlite3Fts5IterNe
29d80 78 74 53 63 61 6e 28 46 74 73 35 49 6e 64 65 78  xtScan(Fts5Index
29d90 49 74 65 72 20 2a 70 49 6e 64 65 78 49 74 65 72  Iter *pIndexIter
29da0 29 7b 0a 20 20 46 74 73 35 49 74 65 72 20 2a 70  ){.  Fts5Iter *p
29db0 49 74 65 72 20 3d 20 28 46 74 73 35 49 74 65 72  Iter = (Fts5Iter
29dc0 2a 29 70 49 6e 64 65 78 49 74 65 72 3b 0a 20 20  *)pIndexIter;.  
29dd0 46 74 73 35 49 6e 64 65 78 20 2a 70 20 3d 20 70  Fts5Index *p = p
29de0 49 74 65 72 2d 3e 70 49 6e 64 65 78 3b 0a 0a 20  Iter->pIndex;.. 
29df0 20 61 73 73 65 72 74 28 20 70 49 74 65 72 2d 3e   assert( pIter->
29e00 70 49 6e 64 65 78 2d 3e 72 63 3d 3d 53 51 4c 49  pIndex->rc==SQLI
29e10 54 45 5f 4f 4b 20 29 3b 0a 0a 20 20 66 74 73 35  TE_OK );..  fts5
29e20 4d 75 6c 74 69 49 74 65 72 4e 65 78 74 28 70 2c  MultiIterNext(p,
29e30 20 70 49 74 65 72 2c 20 30 2c 20 30 29 3b 0a 20   pIter, 0, 0);. 
29e40 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49   if( p->rc==SQLI
29e50 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 46 74 73  TE_OK ){.    Fts
29e60 35 53 65 67 49 74 65 72 20 2a 70 53 65 67 20 3d  5SegIter *pSeg =
29e70 20 26 70 49 74 65 72 2d 3e 61 53 65 67 5b 20 70   &pIter->aSeg[ p
29e80 49 74 65 72 2d 3e 61 46 69 72 73 74 5b 31 5d 2e  Iter->aFirst[1].
29e90 69 46 69 72 73 74 20 5d 3b 0a 20 20 20 20 69 66  iFirst ];.    if
29ea0 28 20 70 53 65 67 2d 3e 70 4c 65 61 66 20 26 26  ( pSeg->pLeaf &&
29eb0 20 70 53 65 67 2d 3e 74 65 72 6d 2e 70 5b 30 5d   pSeg->term.p[0]
29ec0 21 3d 46 54 53 35 5f 4d 41 49 4e 5f 50 52 45 46  !=FTS5_MAIN_PREF
29ed0 49 58 20 29 7b 0a 20 20 20 20 20 20 66 74 73 35  IX ){.      fts5
29ee0 44 61 74 61 52 65 6c 65 61 73 65 28 70 53 65 67  DataRelease(pSeg
29ef0 2d 3e 70 4c 65 61 66 29 3b 0a 20 20 20 20 20 20  ->pLeaf);.      
29f00 70 53 65 67 2d 3e 70 4c 65 61 66 20 3d 20 30 3b  pSeg->pLeaf = 0;
29f10 0a 20 20 20 20 20 20 70 49 74 65 72 2d 3e 62 61  .      pIter->ba
29f20 73 65 2e 62 45 6f 66 20 3d 20 31 3b 0a 20 20 20  se.bEof = 1;.   
29f30 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e   }.  }..  return
29f40 20 66 74 73 35 49 6e 64 65 78 52 65 74 75 72 6e   fts5IndexReturn
29f50 28 70 49 74 65 72 2d 3e 70 49 6e 64 65 78 29 3b  (pIter->pIndex);
29f60 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74  .}../*.** Move t
29f70 6f 20 74 68 65 20 6e 65 78 74 20 6d 61 74 63 68  o the next match
29f80 69 6e 67 20 72 6f 77 69 64 20 74 68 61 74 20 6f  ing rowid that o
29f90 63 63 75 72 73 20 61 74 20 6f 72 20 61 66 74 65  ccurs at or afte
29fa0 72 20 69 4d 61 74 63 68 2e 20 54 68 65 0a 2a 2a  r iMatch. The.**
29fb0 20 64 65 66 69 6e 69 74 69 6f 6e 20 6f 66 20 22   definition of "
29fc0 61 74 20 6f 72 20 61 66 74 65 72 22 20 64 65 70  at or after" dep
29fd0 65 6e 64 73 20 6f 6e 20 77 68 65 74 68 65 72 20  ends on whether 
29fe0 74 68 69 73 20 69 74 65 72 61 74 6f 72 20 69 74  this iterator it
29ff0 65 72 61 74 65 73 0a 2a 2a 20 69 6e 20 61 73 63  erates.** in asc
2a000 65 6e 64 69 6e 67 20 6f 72 20 64 65 73 63 65 6e  ending or descen
2a010 64 69 6e 67 20 72 6f 77 69 64 20 6f 72 64 65 72  ding rowid order
2a020 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
2a030 46 74 73 35 49 74 65 72 4e 65 78 74 46 72 6f 6d  Fts5IterNextFrom
2a040 28 46 74 73 35 49 6e 64 65 78 49 74 65 72 20 2a  (Fts5IndexIter *
2a050 70 49 6e 64 65 78 49 74 65 72 2c 20 69 36 34 20  pIndexIter, i64 
2a060 69 4d 61 74 63 68 29 7b 0a 20 20 46 74 73 35 49  iMatch){.  Fts5I
2a070 74 65 72 20 2a 70 49 74 65 72 20 3d 20 28 46 74  ter *pIter = (Ft
2a080 73 35 49 74 65 72 2a 29 70 49 6e 64 65 78 49 74  s5Iter*)pIndexIt
2a090 65 72 3b 0a 20 20 66 74 73 35 4d 75 6c 74 69 49  er;.  fts5MultiI
2a0a0 74 65 72 4e 65 78 74 46 72 6f 6d 28 70 49 74 65  terNextFrom(pIte
2a0b0 72 2d 3e 70 49 6e 64 65 78 2c 20 70 49 74 65 72  r->pIndex, pIter
2a0c0 2c 20 69 4d 61 74 63 68 29 3b 0a 20 20 72 65 74  , iMatch);.  ret
2a0d0 75 72 6e 20 66 74 73 35 49 6e 64 65 78 52 65 74  urn fts5IndexRet
2a0e0 75 72 6e 28 70 49 74 65 72 2d 3e 70 49 6e 64 65  urn(pIter->pInde
2a0f0 78 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  x);.}../*.** Ret
2a100 75 72 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20  urn the current 
2a110 74 65 72 6d 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63  term..*/.const c
2a120 68 61 72 20 2a 73 71 6c 69 74 65 33 46 74 73 35  har *sqlite3Fts5
2a130 49 74 65 72 54 65 72 6d 28 46 74 73 35 49 6e 64  IterTerm(Fts5Ind
2a140 65 78 49 74 65 72 20 2a 70 49 6e 64 65 78 49 74  exIter *pIndexIt
2a150 65 72 2c 20 69 6e 74 20 2a 70 6e 29 7b 0a 20 20  er, int *pn){.  
2a160 69 6e 74 20 6e 3b 0a 20 20 63 6f 6e 73 74 20 63  int n;.  const c
2a170 68 61 72 20 2a 7a 20 3d 20 28 63 6f 6e 73 74 20  har *z = (const 
2a180 63 68 61 72 2a 29 66 74 73 35 4d 75 6c 74 69 49  char*)fts5MultiI
2a190 74 65 72 54 65 72 6d 28 28 46 74 73 35 49 74 65  terTerm((Fts5Ite
2a1a0 72 2a 29 70 49 6e 64 65 78 49 74 65 72 2c 20 26  r*)pIndexIter, &
2a1b0 6e 29 3b 0a 20 20 2a 70 6e 20 3d 20 6e 2d 31 3b  n);.  *pn = n-1;
2a1c0 0a 20 20 72 65 74 75 72 6e 20 26 7a 5b 31 5d 3b  .  return &z[1];
2a1d0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20  .}../*.** Close 
2a1e0 61 6e 20 69 74 65 72 61 74 6f 72 20 6f 70 65 6e  an iterator open
2a1f0 65 64 20 62 79 20 61 6e 20 65 61 72 6c 69 65 72  ed by an earlier
2a200 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33   call to sqlite3
2a210 46 74 73 35 49 6e 64 65 78 51 75 65 72 79 28 29  Fts5IndexQuery()
2a220 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
2a230 33 46 74 73 35 49 74 65 72 43 6c 6f 73 65 28 46  3Fts5IterClose(F
2a240 74 73 35 49 6e 64 65 78 49 74 65 72 20 2a 70 49  ts5IndexIter *pI
2a250 6e 64 65 78 49 74 65 72 29 7b 0a 20 20 69 66 28  ndexIter){.  if(
2a260 20 70 49 6e 64 65 78 49 74 65 72 20 29 7b 0a 20   pIndexIter ){. 
2a270 20 20 20 46 74 73 35 49 74 65 72 20 2a 70 49 74     Fts5Iter *pIt
2a280 65 72 20 3d 20 28 46 74 73 35 49 74 65 72 2a 29  er = (Fts5Iter*)
2a290 70 49 6e 64 65 78 49 74 65 72 3b 0a 20 20 20 20  pIndexIter;.    
2a2a0 46 74 73 35 49 6e 64 65 78 20 2a 70 49 6e 64 65  Fts5Index *pInde
2a2b0 78 20 3d 20 70 49 74 65 72 2d 3e 70 49 6e 64 65  x = pIter->pInde
2a2c0 78 3b 0a 20 20 20 20 66 74 73 35 4d 75 6c 74 69  x;.    fts5Multi
2a2d0 49 74 65 72 46 72 65 65 28 70 49 74 65 72 29 3b  IterFree(pIter);
2a2e0 0a 20 20 20 20 66 74 73 35 43 6c 6f 73 65 52 65  .    fts5CloseRe
2a2f0 61 64 65 72 28 70 49 6e 64 65 78 29 3b 0a 20 20  ader(pIndex);.  
2a300 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20  }.}../*.** Read 
2a310 61 6e 64 20 64 65 63 6f 64 65 20 74 68 65 20 22  and decode the "
2a320 61 76 65 72 61 67 65 73 22 20 72 65 63 6f 72 64  averages" record
2a330 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61   from the databa
2a340 73 65 2e 20 0a 2a 2a 0a 2a 2a 20 50 61 72 61 6d  se. .**.** Param
2a350 65 74 65 72 20 61 6e 53 69 7a 65 20 6d 75 73 74  eter anSize must
2a360 20 70 6f 69 6e 74 20 74 6f 20 61 6e 20 61 72 72   point to an arr
2a370 61 79 20 6f 66 20 73 69 7a 65 20 6e 43 6f 6c 2c  ay of size nCol,
2a380 20 77 68 65 72 65 20 6e 43 6f 6c 20 69 73 0a 2a   where nCol is.*
2a390 2a 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  * the number of 
2a3a0 75 73 65 72 20 64 65 66 69 6e 65 64 20 63 6f 6c  user defined col
2a3b0 75 6d 6e 73 20 69 6e 20 74 68 65 20 46 54 53 20  umns in the FTS 
2a3c0 74 61 62 6c 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71  table..*/.int sq
2a3d0 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78 47 65  lite3Fts5IndexGe
2a3e0 74 41 76 65 72 61 67 65 73 28 46 74 73 35 49 6e  tAverages(Fts5In
2a3f0 64 65 78 20 2a 70 2c 20 69 36 34 20 2a 70 6e 52  dex *p, i64 *pnR
2a400 6f 77 2c 20 69 36 34 20 2a 61 6e 53 69 7a 65 29  ow, i64 *anSize)
2a410 7b 0a 20 20 69 6e 74 20 6e 43 6f 6c 20 3d 20 70  {.  int nCol = p
2a420 2d 3e 70 43 6f 6e 66 69 67 2d 3e 6e 43 6f 6c 3b  ->pConfig->nCol;
2a430 0a 20 20 46 74 73 35 44 61 74 61 20 2a 70 44 61  .  Fts5Data *pDa
2a440 74 61 3b 0a 0a 20 20 2a 70 6e 52 6f 77 20 3d 20  ta;..  *pnRow = 
2a450 30 3b 0a 20 20 6d 65 6d 73 65 74 28 61 6e 53 69  0;.  memset(anSi
2a460 7a 65 2c 20 30 2c 20 73 69 7a 65 6f 66 28 69 36  ze, 0, sizeof(i6
2a470 34 29 20 2a 20 6e 43 6f 6c 29 3b 0a 20 20 70 44  4) * nCol);.  pD
2a480 61 74 61 20 3d 20 66 74 73 35 44 61 74 61 52 65  ata = fts5DataRe
2a490 61 64 28 70 2c 20 46 54 53 35 5f 41 56 45 52 41  ad(p, FTS5_AVERA
2a4a0 47 45 53 5f 52 4f 57 49 44 29 3b 0a 20 20 69 66  GES_ROWID);.  if
2a4b0 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
2a4c0 4f 4b 20 26 26 20 70 44 61 74 61 2d 3e 6e 6e 20  OK && pData->nn 
2a4d0 29 7b 0a 20 20 20 20 69 6e 74 20 69 20 3d 20 30  ){.    int i = 0
2a4e0 3b 0a 20 20 20 20 69 6e 74 20 69 43 6f 6c 3b 0a  ;.    int iCol;.
2a4f0 20 20 20 20 69 20 2b 3d 20 66 74 73 35 47 65 74      i += fts5Get
2a500 56 61 72 69 6e 74 28 26 70 44 61 74 61 2d 3e 70  Varint(&pData->p
2a510 5b 69 5d 2c 20 28 75 36 34 2a 29 70 6e 52 6f 77  [i], (u64*)pnRow
2a520 29 3b 0a 20 20 20 20 66 6f 72 28 69 43 6f 6c 3d  );.    for(iCol=
2a530 30 3b 20 69 3c 70 44 61 74 61 2d 3e 6e 6e 20 26  0; i<pData->nn &
2a540 26 20 69 43 6f 6c 3c 6e 43 6f 6c 3b 20 69 43 6f  & iCol<nCol; iCo
2a550 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 69 20 2b 3d  l++){.      i +=
2a560 20 66 74 73 35 47 65 74 56 61 72 69 6e 74 28 26   fts5GetVarint(&
2a570 70 44 61 74 61 2d 3e 70 5b 69 5d 2c 20 28 75 36  pData->p[i], (u6
2a580 34 2a 29 26 61 6e 53 69 7a 65 5b 69 43 6f 6c 5d  4*)&anSize[iCol]
2a590 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
2a5a0 66 74 73 35 44 61 74 61 52 65 6c 65 61 73 65 28  fts5DataRelease(
2a5b0 70 44 61 74 61 29 3b 0a 20 20 72 65 74 75 72 6e  pData);.  return
2a5c0 20 66 74 73 35 49 6e 64 65 78 52 65 74 75 72 6e   fts5IndexReturn
2a5d0 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  (p);.}../*.** Re
2a5e0 70 6c 61 63 65 20 74 68 65 20 63 75 72 72 65 6e  place the curren
2a5f0 74 20 22 61 76 65 72 61 67 65 73 22 20 72 65 63  t "averages" rec
2a600 6f 72 64 20 77 69 74 68 20 74 68 65 20 63 6f 6e  ord with the con
2a610 74 65 6e 74 73 20 6f 66 20 74 68 65 20 62 75 66  tents of the buf
2a620 66 65 72 20 0a 2a 2a 20 73 75 70 70 6c 69 65 64  fer .** supplied
2a630 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61   as the second a
2a640 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 69 6e 74 20  rgument..*/.int 
2a650 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78  sqlite3Fts5Index
2a660 53 65 74 41 76 65 72 61 67 65 73 28 46 74 73 35  SetAverages(Fts5
2a670 49 6e 64 65 78 20 2a 70 2c 20 63 6f 6e 73 74 20  Index *p, const 
2a680 75 38 20 2a 70 44 61 74 61 2c 20 69 6e 74 20 6e  u8 *pData, int n
2a690 44 61 74 61 29 7b 0a 20 20 61 73 73 65 72 74 28  Data){.  assert(
2a6a0 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
2a6b0 4b 20 29 3b 0a 20 20 66 74 73 35 44 61 74 61 57  K );.  fts5DataW
2a6c0 72 69 74 65 28 70 2c 20 46 54 53 35 5f 41 56 45  rite(p, FTS5_AVE
2a6d0 52 41 47 45 53 5f 52 4f 57 49 44 2c 20 70 44 61  RAGES_ROWID, pDa
2a6e0 74 61 2c 20 6e 44 61 74 61 29 3b 0a 20 20 72 65  ta, nData);.  re
2a6f0 74 75 72 6e 20 66 74 73 35 49 6e 64 65 78 52 65  turn fts5IndexRe
2a700 74 75 72 6e 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn(p);.}../*.*
2a710 2a 20 52 65 74 75 72 6e 20 74 68 65 20 74 6f 74  * Return the tot
2a720 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 62 6c 6f  al number of blo
2a730 63 6b 73 20 74 68 69 73 20 6d 6f 64 75 6c 65 20  cks this module 
2a740 68 61 73 20 72 65 61 64 20 66 72 6f 6d 20 74 68  has read from th
2a750 65 20 25 5f 64 61 74 61 0a 2a 2a 20 74 61 62 6c  e %_data.** tabl
2a760 65 20 73 69 6e 63 65 20 69 74 20 77 61 73 20 63  e since it was c
2a770 72 65 61 74 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73  reated..*/.int s
2a780 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78 52  qlite3Fts5IndexR
2a790 65 61 64 73 28 46 74 73 35 49 6e 64 65 78 20 2a  eads(Fts5Index *
2a7a0 70 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e  p){.  return p->
2a7b0 6e 52 65 61 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  nRead;.}../*.** 
2a7c0 53 65 74 20 74 68 65 20 33 32 2d 62 69 74 20 63  Set the 32-bit c
2a7d0 6f 6f 6b 69 65 20 76 61 6c 75 65 20 73 74 6f 72  ookie value stor
2a7e0 65 64 20 61 74 20 74 68 65 20 73 74 61 72 74 20  ed at the start 
2a7f0 6f 66 20 61 6c 6c 20 73 74 72 75 63 74 75 72 65  of all structure
2a800 20 0a 2a 2a 20 72 65 63 6f 72 64 73 20 74 6f 20   .** records to 
2a810 74 68 65 20 76 61 6c 75 65 20 70 61 73 73 65 64  the value passed
2a820 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61   as the second a
2a830 72 67 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 52  rgument..**.** R
2a840 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20  eturn SQLITE_OK 
2a850 69 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 6f  if successful, o
2a860 72 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f  r an SQLite erro
2a870 72 20 63 6f 64 65 20 69 66 20 61 6e 20 65 72 72  r code if an err
2a880 6f 72 0a 2a 2a 20 6f 63 63 75 72 73 2e 0a 2a 2f  or.** occurs..*/
2a890 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35  .int sqlite3Fts5
2a8a0 49 6e 64 65 78 53 65 74 43 6f 6f 6b 69 65 28 46  IndexSetCookie(F
2a8b0 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 69 6e 74  ts5Index *p, int
2a8c0 20 69 4e 65 77 29 7b 0a 20 20 69 6e 74 20 72 63   iNew){.  int rc
2a8d0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2a8e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2a8f0 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
2a900 0a 20 20 46 74 73 35 43 6f 6e 66 69 67 20 2a 70  .  Fts5Config *p
2a910 43 6f 6e 66 69 67 20 3d 20 70 2d 3e 70 43 6f 6e  Config = p->pCon
2a920 66 69 67 3b 20 20 20 20 2f 2a 20 43 6f 6e 66 69  fig;    /* Confi
2a930 67 75 72 61 74 69 6f 6e 20 6f 62 6a 65 63 74 20  guration object 
2a940 2a 2f 0a 20 20 75 38 20 61 43 6f 6f 6b 69 65 5b  */.  u8 aCookie[
2a950 34 5d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  4];             
2a960 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 69 6e            /* Bin
2a970 61 72 79 20 72 65 70 72 65 73 65 6e 74 61 74 69  ary representati
2a980 6f 6e 20 6f 66 20 69 4e 65 77 20 2a 2f 0a 20 20  on of iNew */.  
2a990 73 71 6c 69 74 65 33 5f 62 6c 6f 62 20 2a 70 42  sqlite3_blob *pB
2a9a0 6c 6f 62 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65  lob = 0;..  asse
2a9b0 72 74 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  rt( p->rc==SQLIT
2a9c0 45 5f 4f 4b 20 29 3b 0a 20 20 73 71 6c 69 74 65  E_OK );.  sqlite
2a9d0 33 46 74 73 35 50 75 74 33 32 28 61 43 6f 6f 6b  3Fts5Put32(aCook
2a9e0 69 65 2c 20 69 4e 65 77 29 3b 0a 0a 20 20 72 63  ie, iNew);..  rc
2a9f0 20 3d 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f   = sqlite3_blob_
2aa00 6f 70 65 6e 28 70 43 6f 6e 66 69 67 2d 3e 64 62  open(pConfig->db
2aa10 2c 20 70 43 6f 6e 66 69 67 2d 3e 7a 44 62 2c 20  , pConfig->zDb, 
2aa20 70 2d 3e 7a 44 61 74 61 54 62 6c 2c 20 0a 20 20  p->zDataTbl, .  
2aa30 20 20 20 20 22 62 6c 6f 63 6b 22 2c 20 46 54 53      "block", FTS
2aa40 35 5f 53 54 52 55 43 54 55 52 45 5f 52 4f 57 49  5_STRUCTURE_ROWI
2aa50 44 2c 20 31 2c 20 26 70 42 6c 6f 62 0a 20 20 29  D, 1, &pBlob.  )
2aa60 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
2aa70 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c  TE_OK ){.    sql
2aa80 69 74 65 33 5f 62 6c 6f 62 5f 77 72 69 74 65 28  ite3_blob_write(
2aa90 70 42 6c 6f 62 2c 20 61 43 6f 6f 6b 69 65 2c 20  pBlob, aCookie, 
2aaa0 34 2c 20 30 29 3b 0a 20 20 20 20 72 63 20 3d 20  4, 0);.    rc = 
2aab0 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 63 6c 6f  sqlite3_blob_clo
2aac0 73 65 28 70 42 6c 6f 62 29 3b 0a 20 20 7d 0a 0a  se(pBlob);.  }..
2aad0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
2aae0 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 49  int sqlite3Fts5I
2aaf0 6e 64 65 78 4c 6f 61 64 43 6f 6e 66 69 67 28 46  ndexLoadConfig(F
2ab00 74 73 35 49 6e 64 65 78 20 2a 70 29 7b 0a 20 20  ts5Index *p){.  
2ab10 46 74 73 35 53 74 72 75 63 74 75 72 65 20 2a 70  Fts5Structure *p
2ab20 53 74 72 75 63 74 3b 0a 20 20 70 53 74 72 75 63  Struct;.  pStruc
2ab30 74 20 3d 20 66 74 73 35 53 74 72 75 63 74 75 72  t = fts5Structur
2ab40 65 52 65 61 64 28 70 29 3b 0a 20 20 66 74 73 35  eRead(p);.  fts5
2ab50 53 74 72 75 63 74 75 72 65 52 65 6c 65 61 73 65  StructureRelease
2ab60 28 70 53 74 72 75 63 74 29 3b 0a 20 20 72 65 74  (pStruct);.  ret
2ab70 75 72 6e 20 66 74 73 35 49 6e 64 65 78 52 65 74  urn fts5IndexRet
2ab80 75 72 6e 28 70 29 3b 0a 7d 0a 0a 0a 2f 2a 2a 2a  urn(p);.}.../***
2ab90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2aba0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2abb0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2abc0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2abd0 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ******.*********
2abe0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2abf0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2ac00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2ac10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2ac20 2a 0a 2a 2a 20 42 65 6c 6f 77 20 74 68 69 73 20  *.** Below this 
2ac30 70 6f 69 6e 74 20 69 73 20 74 68 65 20 69 6d 70  point is the imp
2ac40 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74  lementation of t
2ac50 68 65 20 69 6e 74 65 67 72 69 74 79 2d 63 68 65  he integrity-che
2ac60 63 6b 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 61  ck .** functiona
2ac70 6c 69 74 79 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  lity..*/../*.** 
2ac80 52 65 74 75 72 6e 20 61 20 73 69 6d 70 6c 65 20  Return a simple 
2ac90 63 68 65 63 6b 73 75 6d 20 76 61 6c 75 65 20 62  checksum value b
2aca0 61 73 65 64 20 6f 6e 20 74 68 65 20 61 72 67 75  ased on the argu
2acb0 6d 65 6e 74 73 2e 0a 2a 2f 0a 75 36 34 20 73 71  ments..*/.u64 sq
2acc0 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78 45 6e  lite3Fts5IndexEn
2acd0 74 72 79 43 6b 73 75 6d 28 0a 20 20 69 36 34 20  tryCksum(.  i64 
2ace0 69 52 6f 77 69 64 2c 20 0a 20 20 69 6e 74 20 69  iRowid, .  int i
2acf0 43 6f 6c 2c 20 0a 20 20 69 6e 74 20 69 50 6f 73  Col, .  int iPos
2ad00 2c 20 0a 20 20 69 6e 74 20 69 49 64 78 2c 0a 20  , .  int iIdx,. 
2ad10 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 70 54 65   const char *pTe
2ad20 72 6d 2c 0a 20 20 69 6e 74 20 6e 54 65 72 6d 0a  rm,.  int nTerm.
2ad30 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 75 36  ){.  int i;.  u6
2ad40 34 20 72 65 74 20 3d 20 69 52 6f 77 69 64 3b 0a  4 ret = iRowid;.
2ad50 20 20 72 65 74 20 2b 3d 20 28 72 65 74 3c 3c 33    ret += (ret<<3
2ad60 29 20 2b 20 69 43 6f 6c 3b 0a 20 20 72 65 74 20  ) + iCol;.  ret 
2ad70 2b 3d 20 28 72 65 74 3c 3c 33 29 20 2b 20 69 50  += (ret<<3) + iP
2ad80 6f 73 3b 0a 20 20 69 66 28 20 69 49 64 78 3e 3d  os;.  if( iIdx>=
2ad90 30 20 29 20 72 65 74 20 2b 3d 20 28 72 65 74 3c  0 ) ret += (ret<
2ada0 3c 33 29 20 2b 20 28 46 54 53 35 5f 4d 41 49 4e  <3) + (FTS5_MAIN
2adb0 5f 50 52 45 46 49 58 20 2b 20 69 49 64 78 29 3b  _PREFIX + iIdx);
2adc0 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 54  .  for(i=0; i<nT
2add0 65 72 6d 3b 20 69 2b 2b 29 20 72 65 74 20 2b 3d  erm; i++) ret +=
2ade0 20 28 72 65 74 3c 3c 33 29 20 2b 20 70 54 65 72   (ret<<3) + pTer
2adf0 6d 5b 69 5d 3b 0a 20 20 72 65 74 75 72 6e 20 72  m[i];.  return r
2ae00 65 74 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51  et;.}..#ifdef SQ
2ae10 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a  LITE_DEBUG./*.**
2ae20 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
2ae30 73 20 70 75 72 65 6c 79 20 61 6e 20 69 6e 74 65  s purely an inte
2ae40 72 6e 61 6c 20 74 65 73 74 2e 20 49 74 20 64 6f  rnal test. It do
2ae50 65 73 20 6e 6f 74 20 63 6f 6e 74 72 69 62 75 74  es not contribut
2ae60 65 20 74 6f 20 0a 2a 2a 20 46 54 53 20 66 75 6e  e to .** FTS fun
2ae70 63 74 69 6f 6e 61 6c 69 74 79 2c 20 6f 72 20 65  ctionality, or e
2ae80 76 65 6e 20 74 68 65 20 69 6e 74 65 67 72 69 74  ven the integrit
2ae90 79 2d 63 68 65 63 6b 2c 20 69 6e 20 61 6e 79 20  y-check, in any 
2aea0 77 61 79 2e 0a 2a 2a 0a 2a 2a 20 49 6e 73 74 65  way..**.** Inste
2aeb0 61 64 2c 20 69 74 20 74 65 73 74 73 20 74 68 61  ad, it tests tha
2aec0 74 20 74 68 65 20 73 61 6d 65 20 73 65 74 20 6f  t the same set o
2aed0 66 20 70 67 6e 6f 2f 72 6f 77 69 64 20 63 6f 6d  f pgno/rowid com
2aee0 62 69 6e 61 74 69 6f 6e 73 20 61 72 65 20 0a 2a  binations are .*
2aef0 2a 20 76 69 73 69 74 65 64 20 72 65 67 61 72 64  * visited regard
2af00 6c 65 73 73 20 6f 66 20 77 68 65 74 68 65 72 20  less of whether 
2af10 74 68 65 20 64 6f 63 6c 69 73 74 2d 69 6e 64 65  the doclist-inde
2af20 78 20 69 64 65 6e 74 69 66 69 65 64 20 62 79 20  x identified by 
2af30 70 61 72 61 6d 65 74 65 72 73 0a 2a 2a 20 69 53  parameters.** iS
2af40 65 67 69 64 2f 69 4c 65 61 66 20 69 73 20 69 74  egid/iLeaf is it
2af50 65 72 61 74 65 64 20 69 6e 20 66 6f 72 77 61 72  erated in forwar
2af60 64 73 20 6f 72 20 72 65 76 65 72 73 65 20 6f 72  ds or reverse or
2af70 64 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  der..*/.static v
2af80 6f 69 64 20 66 74 73 35 54 65 73 74 44 6c 69 64  oid fts5TestDlid
2af90 78 52 65 76 65 72 73 65 28 0a 20 20 46 74 73 35  xReverse(.  Fts5
2afa0 49 6e 64 65 78 20 2a 70 2c 20 0a 20 20 69 6e 74  Index *p, .  int
2afb0 20 69 53 65 67 69 64 2c 20 20 20 20 20 20 20 20   iSegid,        
2afc0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2afd0 53 65 67 6d 65 6e 74 20 69 64 20 74 6f 20 6c 6f  Segment id to lo
2afe0 61 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74  ad from */.  int
2aff0 20 69 4c 65 61 66 20 20 20 20 20 20 20 20 20 20   iLeaf          
2b000 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2b010 4c 6f 61 64 20 64 6f 63 6c 69 73 74 2d 69 6e 64  Load doclist-ind
2b020 65 78 20 66 6f 72 20 74 68 69 73 20 6c 65 61 66  ex for this leaf
2b030 20 2a 2f 0a 29 7b 0a 20 20 46 74 73 35 44 6c 69   */.){.  Fts5Dli
2b040 64 78 49 74 65 72 20 2a 70 44 6c 69 64 78 20 3d  dxIter *pDlidx =
2b050 20 30 3b 0a 20 20 75 36 34 20 63 6b 73 75 6d 31   0;.  u64 cksum1
2b060 20 3d 20 31 33 3b 0a 20 20 75 36 34 20 63 6b 73   = 13;.  u64 cks
2b070 75 6d 32 20 3d 20 31 33 3b 0a 0a 20 20 66 6f 72  um2 = 13;..  for
2b080 28 70 44 6c 69 64 78 3d 66 74 73 35 44 6c 69 64  (pDlidx=fts5Dlid
2b090 78 49 74 65 72 49 6e 69 74 28 70 2c 20 30 2c 20  xIterInit(p, 0, 
2b0a0 69 53 65 67 69 64 2c 20 69 4c 65 61 66 29 3b 0a  iSegid, iLeaf);.
2b0b0 20 20 20 20 20 20 66 74 73 35 44 6c 69 64 78 49        fts5DlidxI
2b0c0 74 65 72 45 6f 66 28 70 2c 20 70 44 6c 69 64 78  terEof(p, pDlidx
2b0d0 29 3d 3d 30 3b 0a 20 20 20 20 20 20 66 74 73 35  )==0;.      fts5
2b0e0 44 6c 69 64 78 49 74 65 72 4e 65 78 74 28 70 2c  DlidxIterNext(p,
2b0f0 20 70 44 6c 69 64 78 29 0a 20 20 29 7b 0a 20 20   pDlidx).  ){.  
2b100 20 20 69 36 34 20 69 52 6f 77 69 64 20 3d 20 66    i64 iRowid = f
2b110 74 73 35 44 6c 69 64 78 49 74 65 72 52 6f 77 69  ts5DlidxIterRowi
2b120 64 28 70 44 6c 69 64 78 29 3b 0a 20 20 20 20 69  d(pDlidx);.    i
2b130 6e 74 20 70 67 6e 6f 20 3d 20 66 74 73 35 44 6c  nt pgno = fts5Dl
2b140 69 64 78 49 74 65 72 50 67 6e 6f 28 70 44 6c 69  idxIterPgno(pDli
2b150 64 78 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  dx);.    assert(
2b160 20 70 67 6e 6f 3e 69 4c 65 61 66 20 29 3b 0a 20   pgno>iLeaf );. 
2b170 20 20 20 63 6b 73 75 6d 31 20 2b 3d 20 69 52 6f     cksum1 += iRo
2b180 77 69 64 20 2b 20 28 28 69 36 34 29 70 67 6e 6f  wid + ((i64)pgno
2b190 3c 3c 33 32 29 3b 0a 20 20 7d 0a 20 20 66 74 73  <<32);.  }.  fts
2b1a0 35 44 6c 69 64 78 49 74 65 72 46 72 65 65 28 70  5DlidxIterFree(p
2b1b0 44 6c 69 64 78 29 3b 0a 20 20 70 44 6c 69 64 78  Dlidx);.  pDlidx
2b1c0 20 3d 20 30 3b 0a 0a 20 20 66 6f 72 28 70 44 6c   = 0;..  for(pDl
2b1d0 69 64 78 3d 66 74 73 35 44 6c 69 64 78 49 74 65  idx=fts5DlidxIte
2b1e0 72 49 6e 69 74 28 70 2c 20 31 2c 20 69 53 65 67  rInit(p, 1, iSeg
2b1f0 69 64 2c 20 69 4c 65 61 66 29 3b 0a 20 20 20 20  id, iLeaf);.    
2b200 20 20 66 74 73 35 44 6c 69 64 78 49 74 65 72 45    fts5DlidxIterE
2b210 6f 66 28 70 2c 20 70 44 6c 69 64 78 29 3d 3d 30  of(p, pDlidx)==0
2b220 3b 0a 20 20 20 20 20 20 66 74 73 35 44 6c 69 64  ;.      fts5Dlid
2b230 78 49 74 65 72 50 72 65 76 28 70 2c 20 70 44 6c  xIterPrev(p, pDl
2b240 69 64 78 29 0a 20 20 29 7b 0a 20 20 20 20 69 36  idx).  ){.    i6
2b250 34 20 69 52 6f 77 69 64 20 3d 20 66 74 73 35 44  4 iRowid = fts5D
2b260 6c 69 64 78 49 74 65 72 52 6f 77 69 64 28 70 44  lidxIterRowid(pD
2b270 6c 69 64 78 29 3b 0a 20 20 20 20 69 6e 74 20 70  lidx);.    int p
2b280 67 6e 6f 20 3d 20 66 74 73 35 44 6c 69 64 78 49  gno = fts5DlidxI
2b290 74 65 72 50 67 6e 6f 28 70 44 6c 69 64 78 29 3b  terPgno(pDlidx);
2b2a0 0a 20 20 20 20 61 73 73 65 72 74 28 20 66 74 73  .    assert( fts
2b2b0 35 44 6c 69 64 78 49 74 65 72 50 67 6e 6f 28 70  5DlidxIterPgno(p
2b2c0 44 6c 69 64 78 29 3e 69 4c 65 61 66 20 29 3b 0a  Dlidx)>iLeaf );.
2b2d0 20 20 20 20 63 6b 73 75 6d 32 20 2b 3d 20 69 52      cksum2 += iR
2b2e0 6f 77 69 64 20 2b 20 28 28 69 36 34 29 70 67 6e  owid + ((i64)pgn
2b2f0 6f 3c 3c 33 32 29 3b 0a 20 20 7d 0a 20 20 66 74  o<<32);.  }.  ft
2b300 73 35 44 6c 69 64 78 49 74 65 72 46 72 65 65 28  s5DlidxIterFree(
2b310 70 44 6c 69 64 78 29 3b 0a 20 20 70 44 6c 69 64  pDlidx);.  pDlid
2b320 78 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20 70 2d  x = 0;..  if( p-
2b330 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26  >rc==SQLITE_OK &
2b340 26 20 63 6b 73 75 6d 31 21 3d 63 6b 73 75 6d 32  & cksum1!=cksum2
2b350 20 29 20 70 2d 3e 72 63 20 3d 20 46 54 53 35 5f   ) p->rc = FTS5_
2b360 43 4f 52 52 55 50 54 3b 0a 7d 0a 0a 73 74 61 74  CORRUPT;.}..stat
2b370 69 63 20 69 6e 74 20 66 74 73 35 51 75 65 72 79  ic int fts5Query
2b380 43 6b 73 75 6d 28 0a 20 20 46 74 73 35 49 6e 64  Cksum(.  Fts5Ind
2b390 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  ex *p,          
2b3a0 20 20 20 20 20 20 20 20 20 2f 2a 20 46 74 73 35           /* Fts5
2b3b0 20 69 6e 64 65 78 20 6f 62 6a 65 63 74 20 2a 2f   index object */
2b3c0 0a 20 20 69 6e 74 20 69 49 64 78 2c 0a 20 20 63  .  int iIdx,.  c
2b3d0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 2c 20 20 20  onst char *z,   
2b3e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2b3f0 2a 20 49 6e 64 65 78 20 6b 65 79 20 74 6f 20 71  * Index key to q
2b400 75 65 72 79 20 66 6f 72 20 2a 2f 0a 20 20 69 6e  uery for */.  in
2b410 74 20 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20  t n,            
2b420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2b430 20 53 69 7a 65 20 6f 66 20 69 6e 64 65 78 20 6b   Size of index k
2b440 65 79 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20  ey in bytes */. 
2b450 20 69 6e 74 20 66 6c 61 67 73 2c 20 20 20 20 20   int flags,     
2b460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b470 20 2f 2a 20 46 6c 61 67 73 20 66 6f 72 20 46 74   /* Flags for Ft
2b480 73 35 49 6e 64 65 78 51 75 65 72 79 20 2a 2f 0a  s5IndexQuery */.
2b490 20 20 75 36 34 20 2a 70 43 6b 73 75 6d 20 20 20    u64 *pCksum   
2b4a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b4b0 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 43 68 65    /* IN/OUT: Che
2b4c0 63 6b 73 75 6d 20 76 61 6c 75 65 20 2a 2f 0a 29  cksum value */.)
2b4d0 7b 0a 20 20 69 6e 74 20 65 44 65 74 61 69 6c 20  {.  int eDetail 
2b4e0 3d 20 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e 65 44  = p->pConfig->eD
2b4f0 65 74 61 69 6c 3b 0a 20 20 75 36 34 20 63 6b 73  etail;.  u64 cks
2b500 75 6d 20 3d 20 2a 70 43 6b 73 75 6d 3b 0a 20 20  um = *pCksum;.  
2b510 46 74 73 35 49 6e 64 65 78 49 74 65 72 20 2a 70  Fts5IndexIter *p
2b520 49 74 65 72 20 3d 20 30 3b 0a 20 20 69 6e 74 20  Iter = 0;.  int 
2b530 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74 73 35  rc = sqlite3Fts5
2b540 49 6e 64 65 78 51 75 65 72 79 28 70 2c 20 7a 2c  IndexQuery(p, z,
2b550 20 6e 2c 20 66 6c 61 67 73 2c 20 30 2c 20 26 70   n, flags, 0, &p
2b560 49 74 65 72 29 3b 0a 0a 20 20 77 68 69 6c 65 28  Iter);..  while(
2b570 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
2b580 26 20 30 3d 3d 73 71 6c 69 74 65 33 46 74 73 35  & 0==sqlite3Fts5
2b590 49 74 65 72 45 6f 66 28 70 49 74 65 72 29 20 29  IterEof(pIter) )
2b5a0 7b 0a 20 20 20 20 69 36 34 20 72 6f 77 69 64 20  {.    i64 rowid 
2b5b0 3d 20 70 49 74 65 72 2d 3e 69 52 6f 77 69 64 3b  = pIter->iRowid;
2b5c0 0a 0a 20 20 20 20 69 66 28 20 65 44 65 74 61 69  ..    if( eDetai
2b5d0 6c 3d 3d 46 54 53 35 5f 44 45 54 41 49 4c 5f 4e  l==FTS5_DETAIL_N
2b5e0 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 63 6b 73  ONE ){.      cks
2b5f0 75 6d 20 5e 3d 20 73 71 6c 69 74 65 33 46 74 73  um ^= sqlite3Fts
2b600 35 49 6e 64 65 78 45 6e 74 72 79 43 6b 73 75 6d  5IndexEntryCksum
2b610 28 72 6f 77 69 64 2c 20 30 2c 20 30 2c 20 69 49  (rowid, 0, 0, iI
2b620 64 78 2c 20 7a 2c 20 6e 29 3b 0a 20 20 20 20 7d  dx, z, n);.    }
2b630 65 6c 73 65 7b 0a 20 20 20 20 20 20 46 74 73 35  else{.      Fts5
2b640 50 6f 73 6c 69 73 74 52 65 61 64 65 72 20 73 52  PoslistReader sR
2b650 65 61 64 65 72 3b 0a 20 20 20 20 20 20 66 6f 72  eader;.      for
2b660 28 73 71 6c 69 74 65 33 46 74 73 35 50 6f 73 6c  (sqlite3Fts5Posl
2b670 69 73 74 52 65 61 64 65 72 49 6e 69 74 28 70 49  istReaderInit(pI
2b680 74 65 72 2d 3e 70 44 61 74 61 2c 20 70 49 74 65  ter->pData, pIte
2b690 72 2d 3e 6e 44 61 74 61 2c 20 26 73 52 65 61 64  r->nData, &sRead
2b6a0 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73  er);.          s
2b6b0 52 65 61 64 65 72 2e 62 45 6f 66 3d 3d 30 3b 0a  Reader.bEof==0;.
2b6c0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
2b6d0 33 46 74 73 35 50 6f 73 6c 69 73 74 52 65 61 64  3Fts5PoslistRead
2b6e0 65 72 4e 65 78 74 28 26 73 52 65 61 64 65 72 29  erNext(&sReader)
2b6f0 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20  .      ){.      
2b700 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 46 54 53    int iCol = FTS
2b710 35 5f 50 4f 53 32 43 4f 4c 55 4d 4e 28 73 52 65  5_POS2COLUMN(sRe
2b720 61 64 65 72 2e 69 50 6f 73 29 3b 0a 20 20 20 20  ader.iPos);.    
2b730 20 20 20 20 69 6e 74 20 69 4f 66 66 20 3d 20 46      int iOff = F
2b740 54 53 35 5f 50 4f 53 32 4f 46 46 53 45 54 28 73  TS5_POS2OFFSET(s
2b750 52 65 61 64 65 72 2e 69 50 6f 73 29 3b 0a 20 20  Reader.iPos);.  
2b760 20 20 20 20 20 20 63 6b 73 75 6d 20 5e 3d 20 73        cksum ^= s
2b770 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78 45  qlite3Fts5IndexE
2b780 6e 74 72 79 43 6b 73 75 6d 28 72 6f 77 69 64 2c  ntryCksum(rowid,
2b790 20 69 43 6f 6c 2c 20 69 4f 66 66 2c 20 69 49 64   iCol, iOff, iId
2b7a0 78 2c 20 7a 2c 20 6e 29 3b 0a 20 20 20 20 20 20  x, z, n);.      
2b7b0 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
2b7c0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
2b7d0 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
2b7e0 74 65 33 46 74 73 35 49 74 65 72 4e 65 78 74 28  te3Fts5IterNext(
2b7f0 70 49 74 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20  pIter);.    }.  
2b800 7d 0a 20 20 73 71 6c 69 74 65 33 46 74 73 35 49  }.  sqlite3Fts5I
2b810 74 65 72 43 6c 6f 73 65 28 70 49 74 65 72 29 3b  terClose(pIter);
2b820 0a 0a 20 20 2a 70 43 6b 73 75 6d 20 3d 20 63 6b  ..  *pCksum = ck
2b830 73 75 6d 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  sum;.  return rc
2b840 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  ;.}.../*.** This
2b850 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 6c 73   function is als
2b860 6f 20 70 75 72 65 6c 79 20 61 6e 20 69 6e 74 65  o purely an inte
2b870 72 6e 61 6c 20 74 65 73 74 2e 20 49 74 20 64 6f  rnal test. It do
2b880 65 73 20 6e 6f 74 20 63 6f 6e 74 72 69 62 75 74  es not contribut
2b890 65 20 74 6f 20 0a 2a 2a 20 46 54 53 20 66 75 6e  e to .** FTS fun
2b8a0 63 74 69 6f 6e 61 6c 69 74 79 2c 20 6f 72 20 65  ctionality, or e
2b8b0 76 65 6e 20 74 68 65 20 69 6e 74 65 67 72 69 74  ven the integrit
2b8c0 79 2d 63 68 65 63 6b 2c 20 69 6e 20 61 6e 79 20  y-check, in any 
2b8d0 77 61 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  way..*/.static v
2b8e0 6f 69 64 20 66 74 73 35 54 65 73 74 54 65 72 6d  oid fts5TestTerm
2b8f0 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70  (.  Fts5Index *p
2b900 2c 20 0a 20 20 46 74 73 35 42 75 66 66 65 72 20  , .  Fts5Buffer 
2b910 2a 70 50 72 65 76 2c 20 20 20 20 20 20 20 20 20  *pPrev,         
2b920 20 20 20 20 20 2f 2a 20 50 72 65 76 69 6f 75 73       /* Previous
2b930 20 74 65 72 6d 20 2a 2f 0a 20 20 63 6f 6e 73 74   term */.  const
2b940 20 63 68 61 72 20 2a 7a 2c 20 69 6e 74 20 6e 2c   char *z, int n,
2b950 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f             /* Po
2b960 73 73 69 62 6c 79 20 6e 65 77 20 74 65 72 6d 20  ssibly new term 
2b970 74 6f 20 74 65 73 74 20 2a 2f 0a 20 20 75 36 34  to test */.  u64
2b980 20 65 78 70 65 63 74 65 64 2c 0a 20 20 75 36 34   expected,.  u64
2b990 20 2a 70 43 6b 73 75 6d 0a 29 7b 0a 20 20 69 6e   *pCksum.){.  in
2b9a0 74 20 72 63 20 3d 20 70 2d 3e 72 63 3b 0a 20 20  t rc = p->rc;.  
2b9b0 69 66 28 20 70 50 72 65 76 2d 3e 6e 3d 3d 30 20  if( pPrev->n==0 
2b9c0 29 7b 0a 20 20 20 20 66 74 73 35 42 75 66 66 65  ){.    fts5Buffe
2b9d0 72 53 65 74 28 26 72 63 2c 20 70 50 72 65 76 2c  rSet(&rc, pPrev,
2b9e0 20 6e 2c 20 28 63 6f 6e 73 74 20 75 38 2a 29 7a   n, (const u8*)z
2b9f0 29 3b 0a 20 20 7d 65 6c 73 65 0a 20 20 69 66 28  );.  }else.  if(
2ba00 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
2ba10 26 20 28 70 50 72 65 76 2d 3e 6e 21 3d 6e 20 7c  & (pPrev->n!=n |
2ba20 7c 20 6d 65 6d 63 6d 70 28 70 50 72 65 76 2d 3e  | memcmp(pPrev->
2ba30 70 2c 20 7a 2c 20 6e 29 29 20 29 7b 0a 20 20 20  p, z, n)) ){.   
2ba40 20 75 36 34 20 63 6b 73 75 6d 33 20 3d 20 2a 70   u64 cksum3 = *p
2ba50 43 6b 73 75 6d 3b 0a 20 20 20 20 63 6f 6e 73 74  Cksum;.    const
2ba60 20 63 68 61 72 20 2a 7a 54 65 72 6d 20 3d 20 28   char *zTerm = (
2ba70 63 6f 6e 73 74 20 63 68 61 72 2a 29 26 70 50 72  const char*)&pPr
2ba80 65 76 2d 3e 70 5b 31 5d 3b 20 20 2f 2a 20 74 65  ev->p[1];  /* te
2ba90 72 6d 20 73 61 6e 73 20 70 72 65 66 69 78 2d 62  rm sans prefix-b
2baa0 79 74 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e  yte */.    int n
2bab0 54 65 72 6d 20 3d 20 70 50 72 65 76 2d 3e 6e 2d  Term = pPrev->n-
2bac0 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  1;            /*
2bad0 20 53 69 7a 65 20 6f 66 20 7a 54 65 72 6d 20 69   Size of zTerm i
2bae0 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 20 20 69  n bytes */.    i
2baf0 6e 74 20 69 49 64 78 20 3d 20 28 70 50 72 65 76  nt iIdx = (pPrev
2bb00 2d 3e 70 5b 30 5d 20 2d 20 46 54 53 35 5f 4d 41  ->p[0] - FTS5_MA
2bb10 49 4e 5f 50 52 45 46 49 58 29 3b 0a 20 20 20 20  IN_PREFIX);.    
2bb20 69 6e 74 20 66 6c 61 67 73 20 3d 20 28 69 49 64  int flags = (iId
2bb30 78 3d 3d 30 20 3f 20 30 20 3a 20 46 54 53 35 49  x==0 ? 0 : FTS5I
2bb40 4e 44 45 58 5f 51 55 45 52 59 5f 50 52 45 46 49  NDEX_QUERY_PREFI
2bb50 58 29 3b 0a 20 20 20 20 75 36 34 20 63 6b 31 20  X);.    u64 ck1 
2bb60 3d 20 30 3b 0a 20 20 20 20 75 36 34 20 63 6b 32  = 0;.    u64 ck2
2bb70 20 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a 20 43 68   = 0;..    /* Ch
2bb80 65 63 6b 20 74 68 61 74 20 74 68 65 20 72 65 73  eck that the res
2bb90 75 6c 74 73 20 72 65 74 75 72 6e 65 64 20 66 6f  ults returned fo
2bba0 72 20 41 53 43 20 61 6e 64 20 44 45 53 43 20 71  r ASC and DESC q
2bbb0 75 65 72 69 65 73 20 61 72 65 0a 20 20 20 20 2a  ueries are.    *
2bbc0 2a 20 74 68 65 20 73 61 6d 65 2e 20 49 66 20 6e  * the same. If n
2bbd0 6f 74 2c 20 63 61 6c 6c 20 74 68 69 73 20 63 6f  ot, call this co
2bbe0 72 72 75 70 74 69 6f 6e 2e 20 20 2a 2f 0a 20 20  rruption.  */.  
2bbf0 20 20 72 63 20 3d 20 66 74 73 35 51 75 65 72 79    rc = fts5Query
2bc00 43 6b 73 75 6d 28 70 2c 20 69 49 64 78 2c 20 7a  Cksum(p, iIdx, z
2bc10 54 65 72 6d 2c 20 6e 54 65 72 6d 2c 20 66 6c 61  Term, nTerm, fla
2bc20 67 73 2c 20 26 63 6b 31 29 3b 0a 20 20 20 20 69  gs, &ck1);.    i
2bc30 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
2bc40 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 66 20   ){.      int f 
2bc50 3d 20 66 6c 61 67 73 7c 46 54 53 35 49 4e 44 45  = flags|FTS5INDE
2bc60 58 5f 51 55 45 52 59 5f 44 45 53 43 3b 0a 20 20  X_QUERY_DESC;.  
2bc70 20 20 20 20 72 63 20 3d 20 66 74 73 35 51 75 65      rc = fts5Que
2bc80 72 79 43 6b 73 75 6d 28 70 2c 20 69 49 64 78 2c  ryCksum(p, iIdx,
2bc90 20 7a 54 65 72 6d 2c 20 6e 54 65 72 6d 2c 20 66   zTerm, nTerm, f
2bca0 2c 20 26 63 6b 32 29 3b 0a 20 20 20 20 7d 0a 20  , &ck2);.    }. 
2bcb0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
2bcc0 45 5f 4f 4b 20 26 26 20 63 6b 31 21 3d 63 6b 32  E_OK && ck1!=ck2
2bcd0 20 29 20 72 63 20 3d 20 46 54 53 35 5f 43 4f 52   ) rc = FTS5_COR
2bce0 52 55 50 54 3b 0a 0a 20 20 20 20 2f 2a 20 49 66  RUPT;..    /* If
2bcf0 20 74 68 69 73 20 69 73 20 61 20 70 72 65 66 69   this is a prefi
2bd00 78 20 71 75 65 72 79 2c 20 63 68 65 63 6b 20 74  x query, check t
2bd10 68 61 74 20 74 68 65 20 72 65 73 75 6c 74 73 20  hat the results 
2bd20 72 65 74 75 72 6e 65 64 20 69 66 20 74 68 65 0a  returned if the.
2bd30 20 20 20 20 2a 2a 20 74 68 65 20 69 6e 64 65 78      ** the index
2bd40 20 69 73 20 64 69 73 61 62 6c 65 64 20 61 72 65   is disabled are
2bd50 20 74 68 65 20 73 61 6d 65 2e 20 49 6e 20 62 6f   the same. In bo
2bd60 74 68 20 41 53 43 20 61 6e 64 20 44 45 53 43 20  th ASC and DESC 
2bd70 6f 72 64 65 72 2e 20 0a 20 20 20 20 2a 2a 0a 20  order. .    **. 
2bd80 20 20 20 2a 2a 20 54 68 69 73 20 63 68 65 63 6b     ** This check
2bd90 20 6d 61 79 20 6f 6e 6c 79 20 62 65 20 70 65 72   may only be per
2bda0 66 6f 72 6d 65 64 20 69 66 20 74 68 65 20 68 61  formed if the ha
2bdb0 73 68 20 74 61 62 6c 65 20 69 73 20 65 6d 70 74  sh table is empt
2bdc0 79 2e 20 54 68 69 73 0a 20 20 20 20 2a 2a 20 69  y. This.    ** i
2bdd0 73 20 62 65 63 61 75 73 65 20 74 68 65 20 68 61  s because the ha
2bde0 73 68 20 74 61 62 6c 65 20 6f 6e 6c 79 20 73 75  sh table only su
2bdf0 70 70 6f 72 74 73 20 61 20 73 69 6e 67 6c 65 20  pports a single 
2be00 73 63 61 6e 20 71 75 65 72 79 20 61 74 0a 20 20  scan query at.  
2be10 20 20 2a 2a 20 61 20 74 69 6d 65 2c 20 61 6e 64    ** a time, and
2be20 20 74 68 65 20 6d 75 6c 74 69 2d 69 74 65 72 20   the multi-iter 
2be30 6c 6f 6f 70 20 66 72 6f 6d 20 77 68 69 63 68 20  loop from which 
2be40 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
2be50 20 63 61 6c 6c 65 64 0a 20 20 20 20 2a 2a 20 69   called.    ** i
2be60 73 20 61 6c 72 65 61 64 79 20 70 65 72 66 6f 72  s already perfor
2be70 6d 69 6e 67 20 73 75 63 68 20 61 20 73 63 61 6e  ming such a scan
2be80 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e  . */.    if( p->
2be90 6e 50 65 6e 64 69 6e 67 44 61 74 61 3d 3d 30 20  nPendingData==0 
2bea0 29 7b 0a 20 20 20 20 20 20 69 66 28 20 69 49 64  ){.      if( iId
2beb0 78 3e 30 20 26 26 20 72 63 3d 3d 53 51 4c 49 54  x>0 && rc==SQLIT
2bec0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
2bed0 69 6e 74 20 66 20 3d 20 66 6c 61 67 73 7c 46 54  int f = flags|FT
2bee0 53 35 49 4e 44 45 58 5f 51 55 45 52 59 5f 54 45  S5INDEX_QUERY_TE
2bef0 53 54 5f 4e 4f 49 44 58 3b 0a 20 20 20 20 20 20  ST_NOIDX;.      
2bf00 20 20 63 6b 32 20 3d 20 30 3b 0a 20 20 20 20 20    ck2 = 0;.     
2bf10 20 20 20 72 63 20 3d 20 66 74 73 35 51 75 65 72     rc = fts5Quer
2bf20 79 43 6b 73 75 6d 28 70 2c 20 69 49 64 78 2c 20  yCksum(p, iIdx, 
2bf30 7a 54 65 72 6d 2c 20 6e 54 65 72 6d 2c 20 66 2c  zTerm, nTerm, f,
2bf40 20 26 63 6b 32 29 3b 0a 20 20 20 20 20 20 20 20   &ck2);.        
2bf50 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
2bf60 4b 20 26 26 20 63 6b 31 21 3d 63 6b 32 20 29 20  K && ck1!=ck2 ) 
2bf70 72 63 20 3d 20 46 54 53 35 5f 43 4f 52 52 55 50  rc = FTS5_CORRUP
2bf80 54 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  T;.      }.     
2bf90 20 69 66 28 20 69 49 64 78 3e 30 20 26 26 20 72   if( iIdx>0 && r
2bfa0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
2bfb0 20 20 20 20 20 20 20 20 69 6e 74 20 66 20 3d 20          int f = 
2bfc0 66 6c 61 67 73 7c 46 54 53 35 49 4e 44 45 58 5f  flags|FTS5INDEX_
2bfd0 51 55 45 52 59 5f 54 45 53 54 5f 4e 4f 49 44 58  QUERY_TEST_NOIDX
2bfe0 7c 46 54 53 35 49 4e 44 45 58 5f 51 55 45 52 59  |FTS5INDEX_QUERY
2bff0 5f 44 45 53 43 3b 0a 20 20 20 20 20 20 20 20 63  _DESC;.        c
2c000 6b 32 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  k2 = 0;.        
2c010 72 63 20 3d 20 66 74 73 35 51 75 65 72 79 43 6b  rc = fts5QueryCk
2c020 73 75 6d 28 70 2c 20 69 49 64 78 2c 20 7a 54 65  sum(p, iIdx, zTe
2c030 72 6d 2c 20 6e 54 65 72 6d 2c 20 66 2c 20 26 63  rm, nTerm, f, &c
2c040 6b 32 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  k2);.        if(
2c050 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
2c060 26 20 63 6b 31 21 3d 63 6b 32 20 29 20 72 63 20  & ck1!=ck2 ) rc 
2c070 3d 20 46 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a  = FTS5_CORRUPT;.
2c080 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
2c090 20 20 20 63 6b 73 75 6d 33 20 5e 3d 20 63 6b 31     cksum3 ^= ck1
2c0a0 3b 0a 20 20 20 20 66 74 73 35 42 75 66 66 65 72  ;.    fts5Buffer
2c0b0 53 65 74 28 26 72 63 2c 20 70 50 72 65 76 2c 20  Set(&rc, pPrev, 
2c0c0 6e 2c 20 28 63 6f 6e 73 74 20 75 38 2a 29 7a 29  n, (const u8*)z)
2c0d0 3b 0a 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  ;..    if( rc==S
2c0e0 51 4c 49 54 45 5f 4f 4b 20 26 26 20 63 6b 73 75  QLITE_OK && cksu
2c0f0 6d 33 21 3d 65 78 70 65 63 74 65 64 20 29 7b 0a  m3!=expected ){.
2c100 20 20 20 20 20 20 72 63 20 3d 20 46 54 53 35 5f        rc = FTS5_
2c110 43 4f 52 52 55 50 54 3b 0a 20 20 20 20 7d 0a 20  CORRUPT;.    }. 
2c120 20 20 20 2a 70 43 6b 73 75 6d 20 3d 20 63 6b 73     *pCksum = cks
2c130 75 6d 33 3b 0a 20 20 7d 0a 20 20 70 2d 3e 72 63  um3;.  }.  p->rc
2c140 20 3d 20 72 63 3b 0a 7d 0a 20 0a 23 65 6c 73 65   = rc;.}. .#else
2c150 0a 23 20 64 65 66 69 6e 65 20 66 74 73 35 54 65  .# define fts5Te
2c160 73 74 44 6c 69 64 78 52 65 76 65 72 73 65 28 78  stDlidxReverse(x
2c170 2c 79 2c 7a 29 0a 23 20 64 65 66 69 6e 65 20 66  ,y,z).# define f
2c180 74 73 35 54 65 73 74 54 65 72 6d 28 75 2c 76 2c  ts5TestTerm(u,v,
2c190 77 2c 78 2c 79 2c 7a 29 0a 23 65 6e 64 69 66 0a  w,x,y,z).#endif.
2c1a0 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 68 61  ./*.** Check tha
2c1b0 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 31 29 20 41 6c  t:.**.**   1) Al
2c1c0 6c 20 6c 65 61 76 65 73 20 6f 66 20 70 53 65 67  l leaves of pSeg
2c1d0 20 62 65 74 77 65 65 6e 20 69 46 69 72 73 74 20   between iFirst 
2c1e0 61 6e 64 20 69 4c 61 73 74 20 28 69 6e 63 6c 75  and iLast (inclu
2c1f0 73 69 76 65 29 20 65 78 69 73 74 20 61 6e 64 0a  sive) exist and.
2c200 2a 2a 20 20 20 20 20 20 63 6f 6e 74 61 69 6e 20  **      contain 
2c210 7a 65 72 6f 20 74 65 72 6d 73 2e 0a 2a 2a 20 20  zero terms..**  
2c220 20 32 29 20 41 6c 6c 20 6c 65 61 76 65 73 20 6f   2) All leaves o
2c230 66 20 70 53 65 67 20 62 65 74 77 65 65 6e 20 69  f pSeg between i
2c240 4e 6f 52 6f 77 69 64 20 61 6e 64 20 69 4c 61 73  NoRowid and iLas
2c250 74 20 28 69 6e 63 6c 75 73 69 76 65 29 20 65 78  t (inclusive) ex
2c260 69 73 74 20 61 6e 64 0a 2a 2a 20 20 20 20 20 20  ist and.**      
2c270 63 6f 6e 74 61 69 6e 20 7a 65 72 6f 20 72 6f 77  contain zero row
2c280 69 64 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ids..*/.static v
2c290 6f 69 64 20 66 74 73 35 49 6e 64 65 78 49 6e 74  oid fts5IndexInt
2c2a0 65 67 72 69 74 79 43 68 65 63 6b 45 6d 70 74 79  egrityCheckEmpty
2c2b0 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70  (.  Fts5Index *p
2c2c0 2c 0a 20 20 46 74 73 35 53 74 72 75 63 74 75 72  ,.  Fts5Structur
2c2d0 65 53 65 67 6d 65 6e 74 20 2a 70 53 65 67 2c 20  eSegment *pSeg, 
2c2e0 20 20 20 20 2f 2a 20 53 65 67 6d 65 6e 74 20 74      /* Segment t
2c2f0 6f 20 63 68 65 63 6b 20 69 6e 74 65 72 6e 61 6c  o check internal
2c300 20 63 6f 6e 73 69 73 74 65 6e 63 79 20 2a 2f 0a   consistency */.
2c310 20 20 69 6e 74 20 69 46 69 72 73 74 2c 0a 20 20    int iFirst,.  
2c320 69 6e 74 20 69 4e 6f 52 6f 77 69 64 2c 0a 20 20  int iNoRowid,.  
2c330 69 6e 74 20 69 4c 61 73 74 0a 29 7b 0a 20 20 69  int iLast.){.  i
2c340 6e 74 20 69 3b 0a 0a 20 20 2f 2a 20 4e 6f 77 20  nt i;..  /* Now 
2c350 63 68 65 63 6b 20 74 68 61 74 20 74 68 65 20 69  check that the i
2c360 74 65 72 2e 6e 45 6d 70 74 79 20 6c 65 61 76 65  ter.nEmpty leave
2c370 73 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20  s following the 
2c380 63 75 72 72 65 6e 74 20 6c 65 61 66 0a 20 20 2a  current leaf.  *
2c390 2a 20 28 61 29 20 65 78 69 73 74 20 61 6e 64 20  * (a) exist and 
2c3a0 28 62 29 20 63 6f 6e 74 61 69 6e 20 6e 6f 20 74  (b) contain no t
2c3b0 65 72 6d 73 2e 20 2a 2f 0a 20 20 66 6f 72 28 69  erms. */.  for(i
2c3c0 3d 69 46 69 72 73 74 3b 20 70 2d 3e 72 63 3d 3d  =iFirst; p->rc==
2c3d0 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c 3d  SQLITE_OK && i<=
2c3e0 69 4c 61 73 74 3b 20 69 2b 2b 29 7b 0a 20 20 20  iLast; i++){.   
2c3f0 20 46 74 73 35 44 61 74 61 20 2a 70 4c 65 61 66   Fts5Data *pLeaf
2c400 20 3d 20 66 74 73 35 44 61 74 61 52 65 61 64 28   = fts5DataRead(
2c410 70 2c 20 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f  p, FTS5_SEGMENT_
2c420 52 4f 57 49 44 28 70 53 65 67 2d 3e 69 53 65 67  ROWID(pSeg->iSeg
2c430 69 64 2c 20 69 29 29 3b 0a 20 20 20 20 69 66 28  id, i));.    if(
2c440 20 70 4c 65 61 66 20 29 7b 0a 20 20 20 20 20 20   pLeaf ){.      
2c450 69 66 28 20 21 66 74 73 35 4c 65 61 66 49 73 54  if( !fts5LeafIsT
2c460 65 72 6d 6c 65 73 73 28 70 4c 65 61 66 29 20 29  ermless(pLeaf) )
2c470 20 70 2d 3e 72 63 20 3d 20 46 54 53 35 5f 43 4f   p->rc = FTS5_CO
2c480 52 52 55 50 54 3b 0a 20 20 20 20 20 20 69 66 28  RRUPT;.      if(
2c490 20 69 3e 3d 69 4e 6f 52 6f 77 69 64 20 26 26 20   i>=iNoRowid && 
2c4a0 30 21 3d 66 74 73 35 4c 65 61 66 46 69 72 73 74  0!=fts5LeafFirst
2c4b0 52 6f 77 69 64 4f 66 66 28 70 4c 65 61 66 29 20  RowidOff(pLeaf) 
2c4c0 29 20 70 2d 3e 72 63 20 3d 20 46 54 53 35 5f 43  ) p->rc = FTS5_C
2c4d0 4f 52 52 55 50 54 3b 0a 20 20 20 20 7d 0a 20 20  ORRUPT;.    }.  
2c4e0 20 20 66 74 73 35 44 61 74 61 52 65 6c 65 61 73    fts5DataReleas
2c4f0 65 28 70 4c 65 61 66 29 3b 0a 20 20 7d 0a 7d 0a  e(pLeaf);.  }.}.
2c500 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
2c510 35 49 6e 74 65 67 72 69 74 79 43 68 65 63 6b 50  5IntegrityCheckP
2c520 67 69 64 78 28 46 74 73 35 49 6e 64 65 78 20 2a  gidx(Fts5Index *
2c530 70 2c 20 46 74 73 35 44 61 74 61 20 2a 70 4c 65  p, Fts5Data *pLe
2c540 61 66 29 7b 0a 20 20 69 6e 74 20 69 54 65 72 6d  af){.  int iTerm
2c550 4f 66 66 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69  Off = 0;.  int i
2c560 69 3b 0a 0a 20 20 46 74 73 35 42 75 66 66 65 72  i;..  Fts5Buffer
2c570 20 62 75 66 31 20 3d 20 7b 30 2c 30 2c 30 7d 3b   buf1 = {0,0,0};
2c580 0a 20 20 46 74 73 35 42 75 66 66 65 72 20 62 75  .  Fts5Buffer bu
2c590 66 32 20 3d 20 7b 30 2c 30 2c 30 7d 3b 0a 0a 20  f2 = {0,0,0};.. 
2c5a0 20 69 69 20 3d 20 70 4c 65 61 66 2d 3e 73 7a 4c   ii = pLeaf->szL
2c5b0 65 61 66 3b 0a 20 20 77 68 69 6c 65 28 20 69 69  eaf;.  while( ii
2c5c0 3c 70 4c 65 61 66 2d 3e 6e 6e 20 26 26 20 70 2d  <pLeaf->nn && p-
2c5d0 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  >rc==SQLITE_OK )
2c5e0 7b 0a 20 20 20 20 69 6e 74 20 72 65 73 3b 0a 20  {.    int res;. 
2c5f0 20 20 20 69 6e 74 20 69 4f 66 66 3b 0a 20 20 20     int iOff;.   
2c600 20 69 6e 74 20 6e 49 6e 63 72 3b 0a 0a 20 20 20   int nIncr;..   
2c610 20 69 69 20 2b 3d 20 66 74 73 35 47 65 74 56 61   ii += fts5GetVa
2c620 72 69 6e 74 33 32 28 26 70 4c 65 61 66 2d 3e 70  rint32(&pLeaf->p
2c630 5b 69 69 5d 2c 20 6e 49 6e 63 72 29 3b 0a 20 20  [ii], nIncr);.  
2c640 20 20 69 54 65 72 6d 4f 66 66 20 2b 3d 20 6e 49    iTermOff += nI
2c650 6e 63 72 3b 0a 20 20 20 20 69 4f 66 66 20 3d 20  ncr;.    iOff = 
2c660 69 54 65 72 6d 4f 66 66 3b 0a 0a 20 20 20 20 69  iTermOff;..    i
2c670 66 28 20 69 4f 66 66 3e 3d 70 4c 65 61 66 2d 3e  f( iOff>=pLeaf->
2c680 73 7a 4c 65 61 66 20 29 7b 0a 20 20 20 20 20 20  szLeaf ){.      
2c690 70 2d 3e 72 63 20 3d 20 46 54 53 35 5f 43 4f 52  p->rc = FTS5_COR
2c6a0 52 55 50 54 3b 0a 20 20 20 20 7d 65 6c 73 65 20  RUPT;.    }else 
2c6b0 69 66 28 20 69 54 65 72 6d 4f 66 66 3d 3d 6e 49  if( iTermOff==nI
2c6c0 6e 63 72 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  ncr ){.      int
2c6d0 20 6e 42 79 74 65 3b 0a 20 20 20 20 20 20 69 4f   nByte;.      iO
2c6e0 66 66 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72  ff += fts5GetVar
2c6f0 69 6e 74 33 32 28 26 70 4c 65 61 66 2d 3e 70 5b  int32(&pLeaf->p[
2c700 69 4f 66 66 5d 2c 20 6e 42 79 74 65 29 3b 0a 20  iOff], nByte);. 
2c710 20 20 20 20 20 69 66 28 20 28 69 4f 66 66 2b 6e       if( (iOff+n
2c720 42 79 74 65 29 3e 70 4c 65 61 66 2d 3e 73 7a 4c  Byte)>pLeaf->szL
2c730 65 61 66 20 29 7b 0a 20 20 20 20 20 20 20 20 70  eaf ){.        p
2c740 2d 3e 72 63 20 3d 20 46 54 53 35 5f 43 4f 52 52  ->rc = FTS5_CORR
2c750 55 50 54 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  UPT;.      }else
2c760 7b 0a 20 20 20 20 20 20 20 20 66 74 73 35 42 75  {.        fts5Bu
2c770 66 66 65 72 53 65 74 28 26 70 2d 3e 72 63 2c 20  fferSet(&p->rc, 
2c780 26 62 75 66 31 2c 20 6e 42 79 74 65 2c 20 26 70  &buf1, nByte, &p
2c790 4c 65 61 66 2d 3e 70 5b 69 4f 66 66 5d 29 3b 0a  Leaf->p[iOff]);.
2c7a0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
2c7b0 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 4b 65  e{.      int nKe
2c7c0 65 70 2c 20 6e 42 79 74 65 3b 0a 20 20 20 20 20  ep, nByte;.     
2c7d0 20 69 4f 66 66 20 2b 3d 20 66 74 73 35 47 65 74   iOff += fts5Get
2c7e0 56 61 72 69 6e 74 33 32 28 26 70 4c 65 61 66 2d  Varint32(&pLeaf-
2c7f0 3e 70 5b 69 4f 66 66 5d 2c 20 6e 4b 65 65 70 29  >p[iOff], nKeep)
2c800 3b 0a 20 20 20 20 20 20 69 4f 66 66 20 2b 3d 20  ;.      iOff += 
2c810 66 74 73 35 47 65 74 56 61 72 69 6e 74 33 32 28  fts5GetVarint32(
2c820 26 70 4c 65 61 66 2d 3e 70 5b 69 4f 66 66 5d 2c  &pLeaf->p[iOff],
2c830 20 6e 42 79 74 65 29 3b 0a 20 20 20 20 20 20 69   nByte);.      i
2c840 66 28 20 6e 4b 65 65 70 3e 62 75 66 31 2e 6e 20  f( nKeep>buf1.n 
2c850 7c 7c 20 28 69 4f 66 66 2b 6e 42 79 74 65 29 3e  || (iOff+nByte)>
2c860 70 4c 65 61 66 2d 3e 73 7a 4c 65 61 66 20 29 7b  pLeaf->szLeaf ){
2c870 0a 20 20 20 20 20 20 20 20 70 2d 3e 72 63 20 3d  .        p->rc =
2c880 20 46 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20   FTS5_CORRUPT;. 
2c890 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
2c8a0 20 20 20 20 62 75 66 31 2e 6e 20 3d 20 6e 4b 65      buf1.n = nKe
2c8b0 65 70 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35  ep;.        fts5
2c8c0 42 75 66 66 65 72 41 70 70 65 6e 64 42 6c 6f 62  BufferAppendBlob
2c8d0 28 26 70 2d 3e 72 63 2c 20 26 62 75 66 31 2c 20  (&p->rc, &buf1, 
2c8e0 6e 42 79 74 65 2c 20 26 70 4c 65 61 66 2d 3e 70  nByte, &pLeaf->p
2c8f0 5b 69 4f 66 66 5d 29 3b 0a 20 20 20 20 20 20 7d  [iOff]);.      }
2c900 0a 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72  ..      if( p->r
2c910 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
2c920 20 20 20 20 20 20 20 20 72 65 73 20 3d 20 66 74          res = ft
2c930 73 35 42 75 66 66 65 72 43 6f 6d 70 61 72 65 28  s5BufferCompare(
2c940 26 62 75 66 31 2c 20 26 62 75 66 32 29 3b 0a 20  &buf1, &buf2);. 
2c950 20 20 20 20 20 20 20 69 66 28 20 72 65 73 3c 3d         if( res<=
2c960 30 20 29 20 70 2d 3e 72 63 20 3d 20 46 54 53 35  0 ) p->rc = FTS5
2c970 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20 20 20 20  _CORRUPT;.      
2c980 7d 0a 20 20 20 20 7d 0a 20 20 20 20 66 74 73 35  }.    }.    fts5
2c990 42 75 66 66 65 72 53 65 74 28 26 70 2d 3e 72 63  BufferSet(&p->rc
2c9a0 2c 20 26 62 75 66 32 2c 20 62 75 66 31 2e 6e 2c  , &buf2, buf1.n,
2c9b0 20 62 75 66 31 2e 70 29 3b 0a 20 20 7d 0a 0a 20   buf1.p);.  }.. 
2c9c0 20 66 74 73 35 42 75 66 66 65 72 46 72 65 65 28   fts5BufferFree(
2c9d0 26 62 75 66 31 29 3b 0a 20 20 66 74 73 35 42 75  &buf1);.  fts5Bu
2c9e0 66 66 65 72 46 72 65 65 28 26 62 75 66 32 29 3b  fferFree(&buf2);
2c9f0 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .}..static void 
2ca00 66 74 73 35 49 6e 64 65 78 49 6e 74 65 67 72 69  fts5IndexIntegri
2ca10 74 79 43 68 65 63 6b 53 65 67 6d 65 6e 74 28 0a  tyCheckSegment(.
2ca20 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20    Fts5Index *p, 
2ca30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ca40 20 20 2f 2a 20 46 54 53 35 20 62 61 63 6b 65 6e    /* FTS5 backen
2ca50 64 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 46 74  d object */.  Ft
2ca60 73 35 53 74 72 75 63 74 75 72 65 53 65 67 6d 65  s5StructureSegme
2ca70 6e 74 20 2a 70 53 65 67 20 20 20 20 20 20 2f 2a  nt *pSeg      /*
2ca80 20 53 65 67 6d 65 6e 74 20 74 6f 20 63 68 65 63   Segment to chec
2ca90 6b 20 69 6e 74 65 72 6e 61 6c 20 63 6f 6e 73 69  k internal consi
2caa0 73 74 65 6e 63 79 20 2a 2f 0a 29 7b 0a 20 20 46  stency */.){.  F
2cab0 74 73 35 43 6f 6e 66 69 67 20 2a 70 43 6f 6e 66  ts5Config *pConf
2cac0 69 67 20 3d 20 70 2d 3e 70 43 6f 6e 66 69 67 3b  ig = p->pConfig;
2cad0 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20  .  sqlite3_stmt 
2cae0 2a 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 69 6e  *pStmt = 0;.  in
2caf0 74 20 72 63 32 3b 0a 20 20 69 6e 74 20 69 49 64  t rc2;.  int iId
2cb00 78 50 72 65 76 4c 65 61 66 20 3d 20 70 53 65 67  xPrevLeaf = pSeg
2cb10 2d 3e 70 67 6e 6f 46 69 72 73 74 2d 31 3b 0a 20  ->pgnoFirst-1;. 
2cb20 20 69 6e 74 20 69 44 6c 69 64 78 50 72 65 76 4c   int iDlidxPrevL
2cb30 65 61 66 20 3d 20 70 53 65 67 2d 3e 70 67 6e 6f  eaf = pSeg->pgno
2cb40 4c 61 73 74 3b 0a 0a 20 20 69 66 28 20 70 53 65  Last;..  if( pSe
2cb50 67 2d 3e 70 67 6e 6f 46 69 72 73 74 3d 3d 30 20  g->pgnoFirst==0 
2cb60 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 66 74 73  ) return;..  fts
2cb70 35 49 6e 64 65 78 50 72 65 70 61 72 65 53 74 6d  5IndexPrepareStm
2cb80 74 28 70 2c 20 26 70 53 74 6d 74 2c 20 73 71 6c  t(p, &pStmt, sql
2cb90 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 0a 20 20  ite3_mprintf(.  
2cba0 20 20 20 20 22 53 45 4c 45 43 54 20 73 65 67 69      "SELECT segi
2cbb0 64 2c 20 74 65 72 6d 2c 20 28 70 67 6e 6f 3e 3e  d, term, (pgno>>
2cbc0 31 29 2c 20 28 70 67 6e 6f 26 31 29 20 46 52 4f  1), (pgno&1) FRO
2cbd0 4d 20 25 51 2e 27 25 71 5f 69 64 78 27 20 57 48  M %Q.'%q_idx' WH
2cbe0 45 52 45 20 73 65 67 69 64 3d 25 64 22 2c 0a 20  ERE segid=%d",. 
2cbf0 20 20 20 20 20 70 43 6f 6e 66 69 67 2d 3e 7a 44       pConfig->zD
2cc00 62 2c 20 70 43 6f 6e 66 69 67 2d 3e 7a 4e 61 6d  b, pConfig->zNam
2cc10 65 2c 20 70 53 65 67 2d 3e 69 53 65 67 69 64 0a  e, pSeg->iSegid.
2cc20 20 20 29 29 3b 0a 0a 20 20 2f 2a 20 49 74 65 72    ));..  /* Iter
2cc30 61 74 65 20 74 68 72 6f 75 67 68 20 74 68 65 20  ate through the 
2cc40 62 2d 74 72 65 65 20 68 69 65 72 61 72 63 68 79  b-tree hierarchy
2cc50 2e 20 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20 70  .  */.  while( p
2cc60 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
2cc70 26 26 20 53 51 4c 49 54 45 5f 52 4f 57 3d 3d 73  && SQLITE_ROW==s
2cc80 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d  qlite3_step(pStm
2cc90 74 29 20 29 7b 0a 20 20 20 20 69 36 34 20 69 52  t) ){.    i64 iR
2cca0 6f 77 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ow;             
2ccb0 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 77 69 64          /* Rowid
2ccc0 20 66 6f 72 20 74 68 69 73 20 6c 65 61 66 20 2a   for this leaf *
2ccd0 2f 0a 20 20 20 20 46 74 73 35 44 61 74 61 20 2a  /.    Fts5Data *
2cce0 70 4c 65 61 66 3b 20 20 20 20 20 20 20 20 20 20  pLeaf;          
2ccf0 20 20 20 20 2f 2a 20 44 61 74 61 20 66 6f 72 20      /* Data for 
2cd00 74 68 69 73 20 6c 65 61 66 20 2a 2f 0a 0a 20 20  this leaf */..  
2cd10 20 20 69 6e 74 20 6e 49 64 78 54 65 72 6d 20 3d    int nIdxTerm =
2cd20 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
2cd30 62 79 74 65 73 28 70 53 74 6d 74 2c 20 31 29 3b  bytes(pStmt, 1);
2cd40 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
2cd50 2a 7a 49 64 78 54 65 72 6d 20 3d 20 28 63 6f 6e  *zIdxTerm = (con
2cd60 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33  st char*)sqlite3
2cd70 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53 74  _column_text(pSt
2cd80 6d 74 2c 20 31 29 3b 0a 20 20 20 20 69 6e 74 20  mt, 1);.    int 
2cd90 69 49 64 78 4c 65 61 66 20 3d 20 73 71 6c 69 74  iIdxLeaf = sqlit
2cda0 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 53  e3_column_int(pS
2cdb0 74 6d 74 2c 20 32 29 3b 0a 20 20 20 20 69 6e 74  tmt, 2);.    int
2cdc0 20 62 49 64 78 44 6c 69 64 78 20 3d 20 73 71 6c   bIdxDlidx = sql
2cdd0 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28  ite3_column_int(
2cde0 70 53 74 6d 74 2c 20 33 29 3b 0a 0a 20 20 20 20  pStmt, 3);..    
2cdf0 2f 2a 20 49 66 20 74 68 65 20 6c 65 61 66 20 69  /* If the leaf i
2ce00 6e 20 71 75 65 73 74 69 6f 6e 20 68 61 73 20 61  n question has a
2ce10 6c 72 65 61 64 79 20 62 65 65 6e 20 74 72 69 6d  lready been trim
2ce20 6d 65 64 20 66 72 6f 6d 20 74 68 65 20 73 65 67  med from the seg
2ce30 6d 65 6e 74 2c 20 0a 20 20 20 20 2a 2a 20 69 67  ment, .    ** ig
2ce40 6e 6f 72 65 20 74 68 69 73 20 62 2d 74 72 65 65  nore this b-tree
2ce50 20 65 6e 74 72 79 2e 20 4f 74 68 65 72 77 69 73   entry. Otherwis
2ce60 65 2c 20 6c 6f 61 64 20 69 74 20 69 6e 74 6f 20  e, load it into 
2ce70 6d 65 6d 6f 72 79 2e 20 2a 2f 0a 20 20 20 20 69  memory. */.    i
2ce80 66 28 20 69 49 64 78 4c 65 61 66 3c 70 53 65 67  f( iIdxLeaf<pSeg
2ce90 2d 3e 70 67 6e 6f 46 69 72 73 74 20 29 20 63 6f  ->pgnoFirst ) co
2cea0 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 52 6f 77  ntinue;.    iRow
2ceb0 20 3d 20 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f   = FTS5_SEGMENT_
2cec0 52 4f 57 49 44 28 70 53 65 67 2d 3e 69 53 65 67  ROWID(pSeg->iSeg
2ced0 69 64 2c 20 69 49 64 78 4c 65 61 66 29 3b 0a 20  id, iIdxLeaf);. 
2cee0 20 20 20 70 4c 65 61 66 20 3d 20 66 74 73 35 4c     pLeaf = fts5L
2cef0 65 61 66 52 65 61 64 28 70 2c 20 69 52 6f 77 29  eafRead(p, iRow)
2cf00 3b 0a 20 20 20 20 69 66 28 20 70 4c 65 61 66 3d  ;.    if( pLeaf=
2cf10 3d 30 20 29 20 62 72 65 61 6b 3b 0a 0a 20 20 20  =0 ) break;..   
2cf20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20 74   /* Check that t
2cf30 68 65 20 6c 65 61 66 20 63 6f 6e 74 61 69 6e 73  he leaf contains
2cf40 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 74 65   at least one te
2cf50 72 6d 2c 20 61 6e 64 20 74 68 61 74 20 69 74 20  rm, and that it 
2cf60 69 73 20 65 71 75 61 6c 0a 20 20 20 20 2a 2a 20  is equal.    ** 
2cf70 74 6f 20 6f 72 20 6c 61 72 67 65 72 20 74 68 61  to or larger tha
2cf80 6e 20 74 68 65 20 73 70 6c 69 74 2d 6b 65 79 20  n the split-key 
2cf90 69 6e 20 7a 49 64 78 54 65 72 6d 2e 20 20 41 6c  in zIdxTerm.  Al
2cfa0 73 6f 20 63 68 65 63 6b 20 74 68 61 74 20 69 66  so check that if
2cfb0 20 74 68 65 72 65 0a 20 20 20 20 2a 2a 20 69 73   there.    ** is
2cfc0 20 61 6c 73 6f 20 61 20 72 6f 77 69 64 20 70 6f   also a rowid po
2cfd0 69 6e 74 65 72 20 77 69 74 68 69 6e 20 74 68 65  inter within the
2cfe0 20 6c 65 61 66 20 70 61 67 65 20 68 65 61 64 65   leaf page heade
2cff0 72 2c 20 69 74 20 70 6f 69 6e 74 73 20 74 6f 20  r, it points to 
2d000 61 0a 20 20 20 20 2a 2a 20 6c 6f 63 61 74 69 6f  a.    ** locatio
2d010 6e 20 62 65 66 6f 72 65 20 74 68 65 20 74 65 72  n before the ter
2d020 6d 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70  m.  */.    if( p
2d030 4c 65 61 66 2d 3e 6e 6e 3c 3d 70 4c 65 61 66 2d  Leaf->nn<=pLeaf-
2d040 3e 73 7a 4c 65 61 66 20 29 7b 0a 20 20 20 20 20  >szLeaf ){.     
2d050 20 70 2d 3e 72 63 20 3d 20 46 54 53 35 5f 43 4f   p->rc = FTS5_CO
2d060 52 52 55 50 54 3b 0a 20 20 20 20 7d 65 6c 73 65  RRUPT;.    }else
2d070 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 4f 66 66  {.      int iOff
2d080 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2d090 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66      /* Offset of
2d0a0 20 66 69 72 73 74 20 74 65 72 6d 20 6f 6e 20 6c   first term on l
2d0b0 65 61 66 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  eaf */.      int
2d0c0 20 69 52 6f 77 69 64 4f 66 66 3b 20 20 20 20 20   iRowidOff;     
2d0d0 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73           /* Offs
2d0e0 65 74 20 6f 66 20 66 69 72 73 74 20 72 6f 77 69  et of first rowi
2d0f0 64 20 6f 6e 20 6c 65 61 66 20 2a 2f 0a 20 20 20  d on leaf */.   
2d100 20 20 20 69 6e 74 20 6e 54 65 72 6d 3b 20 20 20     int nTerm;   
2d110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2d120 2a 20 53 69 7a 65 20 6f 66 20 74 65 72 6d 20 6f  * Size of term o
2d130 6e 20 6c 65 61 66 20 69 6e 20 62 79 74 65 73 20  n leaf in bytes 
2d140 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 72 65 73  */.      int res
2d150 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2d160 20 20 20 20 20 2f 2a 20 43 6f 6d 70 61 72 69 73       /* Comparis
2d170 6f 6e 20 6f 66 20 74 65 72 6d 20 61 6e 64 20 73  on of term and s
2d180 70 6c 69 74 2d 6b 65 79 20 2a 2f 0a 0a 20 20 20  plit-key */..   
2d190 20 20 20 69 4f 66 66 20 3d 20 66 74 73 35 4c 65     iOff = fts5Le
2d1a0 61 66 46 69 72 73 74 54 65 72 6d 4f 66 66 28 70  afFirstTermOff(p
2d1b0 4c 65 61 66 29 3b 0a 20 20 20 20 20 20 69 52 6f  Leaf);.      iRo
2d1c0 77 69 64 4f 66 66 20 3d 20 66 74 73 35 4c 65 61  widOff = fts5Lea
2d1d0 66 46 69 72 73 74 52 6f 77 69 64 4f 66 66 28 70  fFirstRowidOff(p
2d1e0 4c 65 61 66 29 3b 0a 20 20 20 20 20 20 69 66 28  Leaf);.      if(
2d1f0 20 69 52 6f 77 69 64 4f 66 66 3e 3d 69 4f 66 66   iRowidOff>=iOff
2d200 20 7c 7c 20 69 4f 66 66 3e 3d 70 4c 65 61 66 2d   || iOff>=pLeaf-
2d210 3e 73 7a 4c 65 61 66 20 29 7b 0a 20 20 20 20 20  >szLeaf ){.     
2d220 20 20 20 70 2d 3e 72 63 20 3d 20 46 54 53 35 5f     p->rc = FTS5_
2d230 43 4f 52 52 55 50 54 3b 0a 20 20 20 20 20 20 7d  CORRUPT;.      }
2d240 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 4f  else{.        iO
2d250 66 66 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72  ff += fts5GetVar
2d260 69 6e 74 33 32 28 26 70 4c 65 61 66 2d 3e 70 5b  int32(&pLeaf->p[
2d270 69 4f 66 66 5d 2c 20 6e 54 65 72 6d 29 3b 0a 20  iOff], nTerm);. 
2d280 20 20 20 20 20 20 20 72 65 73 20 3d 20 66 74 73         res = fts
2d290 35 4d 65 6d 63 6d 70 28 26 70 4c 65 61 66 2d 3e  5Memcmp(&pLeaf->
2d2a0 70 5b 69 4f 66 66 5d 2c 20 7a 49 64 78 54 65 72  p[iOff], zIdxTer
2d2b0 6d 2c 20 4d 49 4e 28 6e 54 65 72 6d 2c 20 6e 49  m, MIN(nTerm, nI
2d2c0 64 78 54 65 72 6d 29 29 3b 0a 20 20 20 20 20 20  dxTerm));.      
2d2d0 20 20 69 66 28 20 72 65 73 3d 3d 30 20 29 20 72    if( res==0 ) r
2d2e0 65 73 20 3d 20 6e 54 65 72 6d 20 2d 20 6e 49 64  es = nTerm - nId
2d2f0 78 54 65 72 6d 3b 0a 20 20 20 20 20 20 20 20 69  xTerm;.        i
2d300 66 28 20 72 65 73 3c 30 20 29 20 70 2d 3e 72 63  f( res<0 ) p->rc
2d310 20 3d 20 46 54 53 35 5f 43 4f 52 52 55 50 54 3b   = FTS5_CORRUPT;
2d320 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
2d330 66 74 73 35 49 6e 74 65 67 72 69 74 79 43 68 65  fts5IntegrityChe
2d340 63 6b 50 67 69 64 78 28 70 2c 20 70 4c 65 61 66  ckPgidx(p, pLeaf
2d350 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 74 73  );.    }.    fts
2d360 35 44 61 74 61 52 65 6c 65 61 73 65 28 70 4c 65  5DataRelease(pLe
2d370 61 66 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e  af);.    if( p->
2d380 72 63 20 29 20 62 72 65 61 6b 3b 0a 0a 20 20 20  rc ) break;..   
2d390 20 2f 2a 20 4e 6f 77 20 63 68 65 63 6b 20 74 68   /* Now check th
2d3a0 61 74 20 74 68 65 20 69 74 65 72 2e 6e 45 6d 70  at the iter.nEmp
2d3b0 74 79 20 6c 65 61 76 65 73 20 66 6f 6c 6c 6f 77  ty leaves follow
2d3c0 69 6e 67 20 74 68 65 20 63 75 72 72 65 6e 74 20  ing the current 
2d3d0 6c 65 61 66 0a 20 20 20 20 2a 2a 20 28 61 29 20  leaf.    ** (a) 
2d3e0 65 78 69 73 74 20 61 6e 64 20 28 62 29 20 63 6f  exist and (b) co
2d3f0 6e 74 61 69 6e 20 6e 6f 20 74 65 72 6d 73 2e 20  ntain no terms. 
2d400 2a 2f 0a 20 20 20 20 66 74 73 35 49 6e 64 65 78  */.    fts5Index
2d410 49 6e 74 65 67 72 69 74 79 43 68 65 63 6b 45 6d  IntegrityCheckEm
2d420 70 74 79 28 0a 20 20 20 20 20 20 20 20 70 2c 20  pty(.        p, 
2d430 70 53 65 67 2c 20 69 49 64 78 50 72 65 76 4c 65  pSeg, iIdxPrevLe
2d440 61 66 2b 31 2c 20 69 44 6c 69 64 78 50 72 65 76  af+1, iDlidxPrev
2d450 4c 65 61 66 2b 31 2c 20 69 49 64 78 4c 65 61 66  Leaf+1, iIdxLeaf
2d460 2d 31 0a 20 20 20 20 29 3b 0a 20 20 20 20 69 66  -1.    );.    if
2d470 28 20 70 2d 3e 72 63 20 29 20 62 72 65 61 6b 3b  ( p->rc ) break;
2d480 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72  ..    /* If ther
2d490 65 20 69 73 20 61 20 64 6f 63 6c 69 73 74 2d 69  e is a doclist-i
2d4a0 6e 64 65 78 2c 20 63 68 65 63 6b 20 74 68 61 74  ndex, check that
2d4b0 20 69 74 20 6c 6f 6f 6b 73 20 72 69 67 68 74 2e   it looks right.
2d4c0 20 2a 2f 0a 20 20 20 20 69 66 28 20 62 49 64 78   */.    if( bIdx
2d4d0 44 6c 69 64 78 20 29 7b 0a 20 20 20 20 20 20 46  Dlidx ){.      F
2d4e0 74 73 35 44 6c 69 64 78 49 74 65 72 20 2a 70 44  ts5DlidxIter *pD
2d4f0 6c 69 64 78 20 3d 20 30 3b 20 20 2f 2a 20 46 6f  lidx = 0;  /* Fo
2d500 72 20 69 74 65 72 61 74 69 6e 67 20 74 68 72 6f  r iterating thro
2d510 75 67 68 20 64 6f 63 6c 69 73 74 20 69 6e 64 65  ugh doclist inde
2d520 78 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 69  x */.      int i
2d530 50 72 65 76 4c 65 61 66 20 3d 20 69 49 64 78 4c  PrevLeaf = iIdxL
2d540 65 61 66 3b 0a 20 20 20 20 20 20 69 6e 74 20 69  eaf;.      int i
2d550 53 65 67 69 64 20 3d 20 70 53 65 67 2d 3e 69 53  Segid = pSeg->iS
2d560 65 67 69 64 3b 0a 20 20 20 20 20 20 69 6e 74 20  egid;.      int 
2d570 69 50 67 20 3d 20 30 3b 0a 20 20 20 20 20 20 69  iPg = 0;.      i
2d580 36 34 20 69 4b 65 79 3b 0a 0a 20 20 20 20 20 20  64 iKey;..      
2d590 66 6f 72 28 70 44 6c 69 64 78 3d 66 74 73 35 44  for(pDlidx=fts5D
2d5a0 6c 69 64 78 49 74 65 72 49 6e 69 74 28 70 2c 20  lidxIterInit(p, 
2d5b0 30 2c 20 69 53 65 67 69 64 2c 20 69 49 64 78 4c  0, iSegid, iIdxL
2d5c0 65 61 66 29 3b 0a 20 20 20 20 20 20 20 20 20 20  eaf);.          
2d5d0 66 74 73 35 44 6c 69 64 78 49 74 65 72 45 6f 66  fts5DlidxIterEof
2d5e0 28 70 2c 20 70 44 6c 69 64 78 29 3d 3d 30 3b 0a  (p, pDlidx)==0;.
2d5f0 20 20 20 20 20 20 20 20 20 20 66 74 73 35 44 6c            fts5Dl
2d600 69 64 78 49 74 65 72 4e 65 78 74 28 70 2c 20 70  idxIterNext(p, p
2d610 44 6c 69 64 78 29 0a 20 20 20 20 20 20 29 7b 0a  Dlidx).      ){.
2d620 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 68 65 63  .        /* Chec
2d630 6b 20 61 6e 79 20 72 6f 77 69 64 2d 6c 65 73 73  k any rowid-less
2d640 20 70 61 67 65 73 20 74 68 61 74 20 6f 63 63 75   pages that occu
2d650 72 20 62 65 66 6f 72 65 20 74 68 65 20 63 75 72  r before the cur
2d660 72 65 6e 74 20 6c 65 61 66 2e 20 2a 2f 0a 20 20  rent leaf. */.  
2d670 20 20 20 20 20 20 66 6f 72 28 69 50 67 3d 69 50        for(iPg=iP
2d680 72 65 76 4c 65 61 66 2b 31 3b 20 69 50 67 3c 66  revLeaf+1; iPg<f
2d690 74 73 35 44 6c 69 64 78 49 74 65 72 50 67 6e 6f  ts5DlidxIterPgno
2d6a0 28 70 44 6c 69 64 78 29 3b 20 69 50 67 2b 2b 29  (pDlidx); iPg++)
2d6b0 7b 0a 20 20 20 20 20 20 20 20 20 20 69 4b 65 79  {.          iKey
2d6c0 20 3d 20 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f   = FTS5_SEGMENT_
2d6d0 52 4f 57 49 44 28 69 53 65 67 69 64 2c 20 69 50  ROWID(iSegid, iP
2d6e0 67 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 4c  g);.          pL
2d6f0 65 61 66 20 3d 20 66 74 73 35 44 61 74 61 52 65  eaf = fts5DataRe
2d700 61 64 28 70 2c 20 69 4b 65 79 29 3b 0a 20 20 20  ad(p, iKey);.   
2d710 20 20 20 20 20 20 20 69 66 28 20 70 4c 65 61 66         if( pLeaf
2d720 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
2d730 69 66 28 20 66 74 73 35 4c 65 61 66 46 69 72 73  if( fts5LeafFirs
2d740 74 52 6f 77 69 64 4f 66 66 28 70 4c 65 61 66 29  tRowidOff(pLeaf)
2d750 21 3d 30 20 29 20 70 2d 3e 72 63 20 3d 20 46 54  !=0 ) p->rc = FT
2d760 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20 20  S5_CORRUPT;.    
2d770 20 20 20 20 20 20 20 20 66 74 73 35 44 61 74 61          fts5Data
2d780 52 65 6c 65 61 73 65 28 70 4c 65 61 66 29 3b 0a  Release(pLeaf);.
2d790 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
2d7a0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 50      }.        iP
2d7b0 72 65 76 4c 65 61 66 20 3d 20 66 74 73 35 44 6c  revLeaf = fts5Dl
2d7c0 69 64 78 49 74 65 72 50 67 6e 6f 28 70 44 6c 69  idxIterPgno(pDli
2d7d0 64 78 29 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a  dx);..        /*
2d7e0 20 43 68 65 63 6b 20 74 68 61 74 20 74 68 65 20   Check that the 
2d7f0 6c 65 61 66 20 70 61 67 65 20 69 6e 64 69 63 61  leaf page indica
2d800 74 65 64 20 62 79 20 74 68 65 20 69 74 65 72 61  ted by the itera
2d810 74 6f 72 20 72 65 61 6c 6c 79 20 64 6f 65 73 0a  tor really does.
2d820 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 6e 74 61          ** conta
2d830 69 6e 20 74 68 65 20 72 6f 77 69 64 20 73 75 67  in the rowid sug
2d840 67 65 73 74 65 64 20 62 79 20 74 68 65 20 73 61  gested by the sa
2d850 6d 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 69  me. */.        i
2d860 4b 65 79 20 3d 20 46 54 53 35 5f 53 45 47 4d 45  Key = FTS5_SEGME
2d870 4e 54 5f 52 4f 57 49 44 28 69 53 65 67 69 64 2c  NT_ROWID(iSegid,
2d880 20 69 50 72 65 76 4c 65 61 66 29 3b 0a 20 20 20   iPrevLeaf);.   
2d890 20 20 20 20 20 70 4c 65 61 66 20 3d 20 66 74 73       pLeaf = fts
2d8a0 35 44 61 74 61 52 65 61 64 28 70 2c 20 69 4b 65  5DataRead(p, iKe
2d8b0 79 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  y);.        if( 
2d8c0 70 4c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 20  pLeaf ){.       
2d8d0 20 20 20 69 36 34 20 69 52 6f 77 69 64 3b 0a 20     i64 iRowid;. 
2d8e0 20 20 20 20 20 20 20 20 20 69 6e 74 20 69 52 6f           int iRo
2d8f0 77 69 64 4f 66 66 20 3d 20 66 74 73 35 4c 65 61  widOff = fts5Lea
2d900 66 46 69 72 73 74 52 6f 77 69 64 4f 66 66 28 70  fFirstRowidOff(p
2d910 4c 65 61 66 29 3b 0a 20 20 20 20 20 20 20 20 20  Leaf);.         
2d920 20 41 53 53 45 52 54 5f 53 5a 4c 45 41 46 5f 4f   ASSERT_SZLEAF_O
2d930 4b 28 70 4c 65 61 66 29 3b 0a 20 20 20 20 20 20  K(pLeaf);.      
2d940 20 20 20 20 69 66 28 20 69 52 6f 77 69 64 4f 66      if( iRowidOf
2d950 66 3e 3d 70 4c 65 61 66 2d 3e 73 7a 4c 65 61 66  f>=pLeaf->szLeaf
2d960 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
2d970 70 2d 3e 72 63 20 3d 20 46 54 53 35 5f 43 4f 52  p->rc = FTS5_COR
2d980 52 55 50 54 3b 0a 20 20 20 20 20 20 20 20 20 20  RUPT;.          
2d990 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
2d9a0 20 20 20 66 74 73 35 47 65 74 56 61 72 69 6e 74     fts5GetVarint
2d9b0 28 26 70 4c 65 61 66 2d 3e 70 5b 69 52 6f 77 69  (&pLeaf->p[iRowi
2d9c0 64 4f 66 66 5d 2c 20 28 75 36 34 2a 29 26 69 52  dOff], (u64*)&iR
2d9d0 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 20 20 20  owid);.         
2d9e0 20 20 20 69 66 28 20 69 52 6f 77 69 64 21 3d 66     if( iRowid!=f
2d9f0 74 73 35 44 6c 69 64 78 49 74 65 72 52 6f 77 69  ts5DlidxIterRowi
2da00 64 28 70 44 6c 69 64 78 29 20 29 20 70 2d 3e 72  d(pDlidx) ) p->r
2da10 63 20 3d 20 46 54 53 35 5f 43 4f 52 52 55 50 54  c = FTS5_CORRUPT
2da20 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
2da30 20 20 20 20 20 20 20 20 66 74 73 35 44 61 74 61          fts5Data
2da40 52 65 6c 65 61 73 65 28 70 4c 65 61 66 29 3b 0a  Release(pLeaf);.
2da50 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2da60 7d 0a 0a 20 20 20 20 20 20 69 44 6c 69 64 78 50  }..      iDlidxP
2da70 72 65 76 4c 65 61 66 20 3d 20 69 50 67 3b 0a 20  revLeaf = iPg;. 
2da80 20 20 20 20 20 66 74 73 35 44 6c 69 64 78 49 74       fts5DlidxIt
2da90 65 72 46 72 65 65 28 70 44 6c 69 64 78 29 3b 0a  erFree(pDlidx);.
2daa0 20 20 20 20 20 20 66 74 73 35 54 65 73 74 44 6c        fts5TestDl
2dab0 69 64 78 52 65 76 65 72 73 65 28 70 2c 20 69 53  idxReverse(p, iS
2dac0 65 67 69 64 2c 20 69 49 64 78 4c 65 61 66 29 3b  egid, iIdxLeaf);
2dad0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
2dae0 20 20 69 44 6c 69 64 78 50 72 65 76 4c 65 61 66    iDlidxPrevLeaf
2daf0 20 3d 20 70 53 65 67 2d 3e 70 67 6e 6f 4c 61 73   = pSeg->pgnoLas
2db00 74 3b 0a 20 20 20 20 20 20 2f 2a 20 54 4f 44 4f  t;.      /* TODO
2db10 3a 20 43 68 65 63 6b 20 74 68 65 72 65 20 69 73  : Check there is
2db20 20 6e 6f 20 64 6f 63 6c 69 73 74 20 69 6e 64 65   no doclist inde
2db30 78 20 2a 2f 0a 20 20 20 20 7d 0a 0a 20 20 20 20  x */.    }..    
2db40 69 49 64 78 50 72 65 76 4c 65 61 66 20 3d 20 69  iIdxPrevLeaf = i
2db50 49 64 78 4c 65 61 66 3b 0a 20 20 7d 0a 0a 20 20  IdxLeaf;.  }..  
2db60 72 63 32 20 3d 20 73 71 6c 69 74 65 33 5f 66 69  rc2 = sqlite3_fi
2db70 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20  nalize(pStmt);. 
2db80 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49   if( p->rc==SQLI
2db90 54 45 5f 4f 4b 20 29 20 70 2d 3e 72 63 20 3d 20  TE_OK ) p->rc = 
2dba0 72 63 32 3b 0a 0a 20 20 2f 2a 20 50 61 67 65 20  rc2;..  /* Page 
2dbb0 69 74 65 72 2e 69 4c 65 61 66 20 6d 75 73 74 20  iter.iLeaf must 
2dbc0 6e 6f 77 20 62 65 20 74 68 65 20 72 69 67 68 74  now be the right
2dbd0 6d 6f 73 74 20 6c 65 61 66 2d 70 61 67 65 20 69  most leaf-page i
2dbe0 6e 20 74 68 65 20 73 65 67 6d 65 6e 74 20 2a 2f  n the segment */
2dbf0 0a 23 69 66 20 30 0a 20 20 69 66 28 20 70 2d 3e  .#if 0.  if( p->
2dc00 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
2dc10 20 69 74 65 72 2e 69 4c 65 61 66 21 3d 70 53 65   iter.iLeaf!=pSe
2dc20 67 2d 3e 70 67 6e 6f 4c 61 73 74 20 29 7b 0a 20  g->pgnoLast ){. 
2dc30 20 20 20 70 2d 3e 72 63 20 3d 20 46 54 53 35 5f     p->rc = FTS5_
2dc40 43 4f 52 52 55 50 54 3b 0a 20 20 7d 0a 23 65 6e  CORRUPT;.  }.#en
2dc50 64 69 66 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 75  dif.}.../*.** Ru
2dc60 6e 20 69 6e 74 65 72 6e 61 6c 20 63 68 65 63 6b  n internal check
2dc70 73 20 74 6f 20 65 6e 73 75 72 65 20 74 68 61 74  s to ensure that
2dc80 20 74 68 65 20 46 54 53 20 69 6e 64 65 78 20 28   the FTS index (
2dc90 61 29 20 69 73 20 69 6e 74 65 72 6e 61 6c 6c 79  a) is internally
2dca0 20 0a 2a 2a 20 63 6f 6e 73 69 73 74 65 6e 74 20   .** consistent 
2dcb0 61 6e 64 20 28 62 29 20 63 6f 6e 74 61 69 6e 73  and (b) contains
2dcc0 20 65 6e 74 72 69 65 73 20 66 6f 72 20 77 68 69   entries for whi
2dcd0 63 68 20 74 68 65 20 58 4f 52 20 6f 66 20 74 68  ch the XOR of th
2dce0 65 20 63 68 65 63 6b 73 75 6d 73 0a 2a 2a 20 61  e checksums.** a
2dcf0 73 20 63 61 6c 63 75 6c 61 74 65 64 20 62 79 20  s calculated by 
2dd00 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78  sqlite3Fts5Index
2dd10 45 6e 74 72 79 43 6b 73 75 6d 28 29 20 69 73 20  EntryCksum() is 
2dd20 63 6b 73 75 6d 2e 0a 2a 2a 0a 2a 2a 20 52 65 74  cksum..**.** Ret
2dd30 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
2dd40 50 54 20 69 66 20 61 6e 79 20 6f 66 20 74 68 65  PT if any of the
2dd50 20 69 6e 74 65 72 6e 61 6c 20 63 68 65 63 6b 73   internal checks
2dd60 20 66 61 69 6c 2c 20 6f 72 20 69 66 20 74 68 65   fail, or if the
2dd70 0a 2a 2a 20 63 68 65 63 6b 73 75 6d 20 64 6f 65  .** checksum doe
2dd80 73 20 6e 6f 74 20 6d 61 74 63 68 2e 20 52 65 74  s not match. Ret
2dd90 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66  urn SQLITE_OK if
2dda0 20 61 6c 6c 20 63 68 65 63 6b 73 20 70 61 73 73   all checks pass
2ddb0 20 77 69 74 68 6f 75 74 0a 2a 2a 20 65 72 72 6f   without.** erro
2ddc0 72 2c 20 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72  r, or some other
2ddd0 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f   SQLite error co
2dde0 64 65 20 69 66 20 61 6e 6f 74 68 65 72 20 65 72  de if another er
2ddf0 72 6f 72 20 28 65 2e 67 2e 20 4f 4f 4d 29 0a 2a  ror (e.g. OOM).*
2de00 2a 20 6f 63 63 75 72 73 2e 0a 2a 2f 0a 69 6e 74  * occurs..*/.int
2de10 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65   sqlite3Fts5Inde
2de20 78 49 6e 74 65 67 72 69 74 79 43 68 65 63 6b 28  xIntegrityCheck(
2de30 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 75 36  Fts5Index *p, u6
2de40 34 20 63 6b 73 75 6d 29 7b 0a 20 20 69 6e 74 20  4 cksum){.  int 
2de50 65 44 65 74 61 69 6c 20 3d 20 70 2d 3e 70 43 6f  eDetail = p->pCo
2de60 6e 66 69 67 2d 3e 65 44 65 74 61 69 6c 3b 0a 20  nfig->eDetail;. 
2de70 20 75 36 34 20 63 6b 73 75 6d 32 20 3d 20 30 3b   u64 cksum2 = 0;
2de80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2de90 20 2f 2a 20 43 68 65 63 6b 73 75 6d 20 62 61 73   /* Checksum bas
2dea0 65 64 20 6f 6e 20 63 6f 6e 74 65 6e 74 73 20 6f  ed on contents o
2deb0 66 20 69 6e 64 65 78 65 73 20 2a 2f 0a 20 20 46  f indexes */.  F
2dec0 74 73 35 42 75 66 66 65 72 20 70 6f 73 6c 69 73  ts5Buffer poslis
2ded0 74 20 3d 20 7b 30 2c 30 2c 30 7d 3b 20 20 20 2f  t = {0,0,0};   /
2dee0 2a 20 42 75 66 66 65 72 20 75 73 65 64 20 74 6f  * Buffer used to
2def0 20 68 6f 6c 64 20 61 20 70 6f 73 6c 69 73 74 20   hold a poslist 
2df00 2a 2f 0a 20 20 46 74 73 35 49 74 65 72 20 2a 70  */.  Fts5Iter *p
2df10 49 74 65 72 3b 20 20 20 20 20 20 20 20 20 20 20  Iter;           
2df20 20 20 20 20 20 2f 2a 20 55 73 65 64 20 74 6f 20       /* Used to 
2df30 69 74 65 72 61 74 65 20 74 68 72 6f 75 67 68 20  iterate through 
2df40 65 6e 74 69 72 65 20 69 6e 64 65 78 20 2a 2f 0a  entire index */.
2df50 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65 20    Fts5Structure 
2df60 2a 70 53 74 72 75 63 74 3b 20 20 20 20 20 20 20  *pStruct;       
2df70 20 20 2f 2a 20 49 6e 64 65 78 20 73 74 72 75 63    /* Index struc
2df80 74 75 72 65 20 2a 2f 0a 0a 23 69 66 64 65 66 20  ture */..#ifdef 
2df90 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 2f  SQLITE_DEBUG.  /
2dfa0 2a 20 55 73 65 64 20 62 79 20 65 78 74 72 61 20  * Used by extra 
2dfb0 69 6e 74 65 72 6e 61 6c 20 74 65 73 74 73 20 6f  internal tests o
2dfc0 6e 6c 79 20 72 75 6e 20 69 66 20 4e 44 45 42 55  nly run if NDEBU
2dfd0 47 20 69 73 20 6e 6f 74 20 64 65 66 69 6e 65 64  G is not defined
2dfe0 20 2a 2f 0a 20 20 75 36 34 20 63 6b 73 75 6d 33   */.  u64 cksum3
2dff0 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
2e000 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 73 75        /* Checksu
2e010 6d 20 62 61 73 65 64 20 6f 6e 20 63 6f 6e 74 65  m based on conte
2e020 6e 74 73 20 6f 66 20 69 6e 64 65 78 65 73 20 2a  nts of indexes *
2e030 2f 0a 20 20 46 74 73 35 42 75 66 66 65 72 20 74  /.  Fts5Buffer t
2e040 65 72 6d 20 3d 20 7b 30 2c 30 2c 30 7d 3b 20 20  erm = {0,0,0};  
2e050 20 20 20 20 2f 2a 20 42 75 66 66 65 72 20 75 73      /* Buffer us
2e060 65 64 20 74 6f 20 68 6f 6c 64 20 6d 6f 73 74 20  ed to hold most 
2e070 72 65 63 65 6e 74 20 74 65 72 6d 20 2a 2f 0a 23  recent term */.#
2e080 65 6e 64 69 66 0a 20 20 63 6f 6e 73 74 20 69 6e  endif.  const in
2e090 74 20 66 6c 61 67 73 20 3d 20 46 54 53 35 49 4e  t flags = FTS5IN
2e0a0 44 45 58 5f 51 55 45 52 59 5f 4e 4f 4f 55 54 50  DEX_QUERY_NOOUTP
2e0b0 55 54 3b 0a 20 20 0a 20 20 2f 2a 20 4c 6f 61 64  UT;.  .  /* Load
2e0c0 20 74 68 65 20 46 54 53 20 69 6e 64 65 78 20 73   the FTS index s
2e0d0 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 70 53  tructure */.  pS
2e0e0 74 72 75 63 74 20 3d 20 66 74 73 35 53 74 72 75  truct = fts5Stru
2e0f0 63 74 75 72 65 52 65 61 64 28 70 29 3b 0a 0a 20  ctureRead(p);.. 
2e100 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20 74   /* Check that t
2e110 68 65 20 69 6e 74 65 72 6e 61 6c 20 6e 6f 64 65  he internal node
2e120 73 20 6f 66 20 65 61 63 68 20 73 65 67 6d 65 6e  s of each segmen
2e130 74 20 6d 61 74 63 68 20 74 68 65 20 6c 65 61 76  t match the leav
2e140 65 73 20 2a 2f 0a 20 20 69 66 28 20 70 53 74 72  es */.  if( pStr
2e150 75 63 74 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  uct ){.    int i
2e160 4c 76 6c 2c 20 69 53 65 67 3b 0a 20 20 20 20 66  Lvl, iSeg;.    f
2e170 6f 72 28 69 4c 76 6c 3d 30 3b 20 69 4c 76 6c 3c  or(iLvl=0; iLvl<
2e180 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 3b  pStruct->nLevel;
2e190 20 69 4c 76 6c 2b 2b 29 7b 0a 20 20 20 20 20 20   iLvl++){.      
2e1a0 66 6f 72 28 69 53 65 67 3d 30 3b 20 69 53 65 67  for(iSeg=0; iSeg
2e1b0 3c 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c  <pStruct->aLevel
2e1c0 5b 69 4c 76 6c 5d 2e 6e 53 65 67 3b 20 69 53 65  [iLvl].nSeg; iSe
2e1d0 67 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 46 74  g++){.        Ft
2e1e0 73 35 53 74 72 75 63 74 75 72 65 53 65 67 6d 65  s5StructureSegme
2e1f0 6e 74 20 2a 70 53 65 67 20 3d 20 26 70 53 74 72  nt *pSeg = &pStr
2e200 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c  uct->aLevel[iLvl
2e210 5d 2e 61 53 65 67 5b 69 53 65 67 5d 3b 0a 20 20  ].aSeg[iSeg];.  
2e220 20 20 20 20 20 20 66 74 73 35 49 6e 64 65 78 49        fts5IndexI
2e230 6e 74 65 67 72 69 74 79 43 68 65 63 6b 53 65 67  ntegrityCheckSeg
2e240 6d 65 6e 74 28 70 2c 20 70 53 65 67 29 3b 0a 20  ment(p, pSeg);. 
2e250 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
2e260 0a 0a 20 20 2f 2a 20 54 68 65 20 63 6b 73 75 6d  ..  /* The cksum
2e270 20 61 72 67 75 6d 65 6e 74 20 70 61 73 73 65 64   argument passed
2e280 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f   to this functio
2e290 6e 20 69 73 20 61 20 63 68 65 63 6b 73 75 6d 20  n is a checksum 
2e2a0 63 61 6c 63 75 6c 61 74 65 64 0a 20 20 2a 2a 20  calculated.  ** 
2e2b0 62 61 73 65 64 20 6f 6e 20 61 6c 6c 20 65 78 70  based on all exp
2e2c0 65 63 74 65 64 20 65 6e 74 72 69 65 73 20 69 6e  ected entries in
2e2d0 20 74 68 65 20 46 54 53 20 69 6e 64 65 78 20 28   the FTS index (
2e2e0 69 6e 63 6c 75 64 69 6e 67 20 70 72 65 66 69 78  including prefix
2e2f0 20 69 6e 64 65 78 0a 20 20 2a 2a 20 65 6e 74 72   index.  ** entr
2e300 69 65 73 29 2e 20 54 68 69 73 20 62 6c 6f 63 6b  ies). This block
2e310 20 63 68 65 63 6b 73 20 74 68 61 74 20 61 20 63   checks that a c
2e320 68 65 63 6b 73 75 6d 20 63 61 6c 63 75 6c 61 74  hecksum calculat
2e330 65 64 20 62 61 73 65 64 20 6f 6e 20 74 68 65 0a  ed based on the.
2e340 20 20 2a 2a 20 61 63 74 75 61 6c 20 63 6f 6e 74    ** actual cont
2e350 65 6e 74 73 20 6f 66 20 46 54 53 20 69 6e 64 65  ents of FTS inde
2e360 78 20 69 73 20 69 64 65 6e 74 69 63 61 6c 2e 0a  x is identical..
2e370 20 20 2a 2a 0a 20 20 2a 2a 20 54 77 6f 20 76 65    **.  ** Two ve
2e380 72 73 69 6f 6e 73 20 6f 66 20 74 68 65 20 73 61  rsions of the sa
2e390 6d 65 20 63 68 65 63 6b 73 75 6d 20 61 72 65 20  me checksum are 
2e3a0 63 61 6c 63 75 6c 61 74 65 64 2e 20 54 68 65 20  calculated. The 
2e3b0 66 69 72 73 74 20 28 73 74 61 63 6b 0a 20 20 2a  first (stack.  *
2e3c0 2a 20 76 61 72 69 61 62 6c 65 20 63 6b 73 75 6d  * variable cksum
2e3d0 32 29 20 62 61 73 65 64 20 6f 6e 20 65 6e 74 72  2) based on entr
2e3e0 69 65 73 20 65 78 74 72 61 63 74 65 64 20 66 72  ies extracted fr
2e3f0 6f 6d 20 74 68 65 20 66 75 6c 6c 2d 74 65 78 74  om the full-text
2e400 20 69 6e 64 65 78 0a 20 20 2a 2a 20 77 68 69 6c   index.  ** whil
2e410 65 20 64 6f 69 6e 67 20 61 20 6c 69 6e 65 61 72  e doing a linear
2e420 20 73 63 61 6e 20 6f 66 20 65 61 63 68 20 69 6e   scan of each in
2e430 64 69 76 69 64 75 61 6c 20 69 6e 64 65 78 20 69  dividual index i
2e440 6e 20 74 75 72 6e 2e 20 0a 20 20 2a 2a 0a 20 20  n turn. .  **.  
2e450 2a 2a 20 41 73 20 65 61 63 68 20 74 65 72 6d 20  ** As each term 
2e460 76 69 73 69 74 65 64 20 62 79 20 74 68 65 20 6c  visited by the l
2e470 69 6e 65 61 72 20 73 63 61 6e 73 2c 20 61 20 73  inear scans, a s
2e480 65 70 61 72 61 74 65 20 71 75 65 72 79 20 66 6f  eparate query fo
2e490 72 20 74 68 65 0a 20 20 2a 2a 20 73 61 6d 65 20  r the.  ** same 
2e4a0 74 65 72 6d 20 69 73 20 70 65 72 66 6f 72 6d 65  term is performe
2e4b0 64 2e 20 63 6b 73 75 6d 33 20 69 73 20 63 61 6c  d. cksum3 is cal
2e4c0 63 75 6c 61 74 65 64 20 62 61 73 65 64 20 6f 6e  culated based on
2e4d0 20 74 68 65 20 65 6e 74 72 69 65 73 0a 20 20 2a   the entries.  *
2e4e0 2a 20 65 78 74 72 61 63 74 65 64 20 62 79 20 74  * extracted by t
2e4f0 68 65 73 65 20 71 75 65 72 69 65 73 2e 0a 20 20  hese queries..  
2e500 2a 2f 0a 20 20 66 6f 72 28 66 74 73 35 4d 75 6c  */.  for(fts5Mul
2e510 74 69 49 74 65 72 4e 65 77 28 70 2c 20 70 53 74  tiIterNew(p, pSt
2e520 72 75 63 74 2c 20 66 6c 61 67 73 2c 20 30 2c 20  ruct, flags, 0, 
2e530 30 2c 20 30 2c 20 2d 31 2c 20 30 2c 20 26 70 49  0, 0, -1, 0, &pI
2e540 74 65 72 29 3b 0a 20 20 20 20 20 20 66 74 73 35  ter);.      fts5
2e550 4d 75 6c 74 69 49 74 65 72 45 6f 66 28 70 2c 20  MultiIterEof(p, 
2e560 70 49 74 65 72 29 3d 3d 30 3b 0a 20 20 20 20 20  pIter)==0;.     
2e570 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 4e 65   fts5MultiIterNe
2e580 78 74 28 70 2c 20 70 49 74 65 72 2c 20 30 2c 20  xt(p, pIter, 0, 
2e590 30 29 0a 20 20 29 7b 0a 20 20 20 20 69 6e 74 20  0).  ){.    int 
2e5a0 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n;              
2e5b0 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
2e5c0 6f 66 20 74 65 72 6d 20 69 6e 20 62 79 74 65 73  of term in bytes
2e5d0 20 2a 2f 0a 20 20 20 20 69 36 34 20 69 50 6f 73   */.    i64 iPos
2e5e0 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
2e5f0 20 20 20 20 2f 2a 20 50 6f 73 69 74 69 6f 6e 20      /* Position 
2e600 72 65 61 64 20 66 72 6f 6d 20 70 6f 73 6c 69 73  read from poslis
2e610 74 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 4f 66  t */.    int iOf
2e620 66 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  f = 0;          
2e630 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 77       /* Offset w
2e640 69 74 68 69 6e 20 70 6f 73 6c 69 73 74 20 2a 2f  ithin poslist */
2e650 0a 20 20 20 20 69 36 34 20 69 52 6f 77 69 64 20  .    i64 iRowid 
2e660 3d 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 52  = fts5MultiIterR
2e670 6f 77 69 64 28 70 49 74 65 72 29 3b 0a 20 20 20  owid(pIter);.   
2e680 20 63 68 61 72 20 2a 7a 20 3d 20 28 63 68 61 72   char *z = (char
2e690 2a 29 66 74 73 35 4d 75 6c 74 69 49 74 65 72 54  *)fts5MultiIterT
2e6a0 65 72 6d 28 70 49 74 65 72 2c 20 26 6e 29 3b 0a  erm(pIter, &n);.
2e6b0 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20  .    /* If this 
2e6c0 69 73 20 61 20 6e 65 77 20 74 65 72 6d 2c 20 71  is a new term, q
2e6d0 75 65 72 79 20 66 6f 72 20 69 74 2e 20 55 70 64  uery for it. Upd
2e6e0 61 74 65 20 63 6b 73 75 6d 33 20 77 69 74 68 20  ate cksum3 with 
2e6f0 74 68 65 20 72 65 73 75 6c 74 73 2e 20 2a 2f 0a  the results. */.
2e700 20 20 20 20 66 74 73 35 54 65 73 74 54 65 72 6d      fts5TestTerm
2e710 28 70 2c 20 26 74 65 72 6d 2c 20 7a 2c 20 6e 2c  (p, &term, z, n,
2e720 20 63 6b 73 75 6d 32 2c 20 26 63 6b 73 75 6d 33   cksum2, &cksum3
2e730 29 3b 0a 0a 20 20 20 20 69 66 28 20 65 44 65 74  );..    if( eDet
2e740 61 69 6c 3d 3d 46 54 53 35 5f 44 45 54 41 49 4c  ail==FTS5_DETAIL
2e750 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 69  _NONE ){.      i
2e760 66 28 20 30 3d 3d 66 74 73 35 4d 75 6c 74 69 49  f( 0==fts5MultiI
2e770 74 65 72 49 73 45 6d 70 74 79 28 70 2c 20 70 49  terIsEmpty(p, pI
2e780 74 65 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20  ter) ){.        
2e790 63 6b 73 75 6d 32 20 5e 3d 20 73 71 6c 69 74 65  cksum2 ^= sqlite
2e7a0 33 46 74 73 35 49 6e 64 65 78 45 6e 74 72 79 43  3Fts5IndexEntryC
2e7b0 6b 73 75 6d 28 69 52 6f 77 69 64 2c 20 30 2c 20  ksum(iRowid, 0, 
2e7c0 30 2c 20 2d 31 2c 20 7a 2c 20 6e 29 3b 0a 20 20  0, -1, z, n);.  
2e7d0 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b      }.    }else{
2e7e0 0a 20 20 20 20 20 20 70 6f 73 6c 69 73 74 2e 6e  .      poslist.n
2e7f0 20 3d 20 30 3b 0a 20 20 20 20 20 20 66 74 73 35   = 0;.      fts5
2e800 53 65 67 69 74 65 72 50 6f 73 6c 69 73 74 28 70  SegiterPoslist(p
2e810 2c 20 26 70 49 74 65 72 2d 3e 61 53 65 67 5b 70  , &pIter->aSeg[p
2e820 49 74 65 72 2d 3e 61 46 69 72 73 74 5b 31 5d 2e  Iter->aFirst[1].
2e830 69 46 69 72 73 74 5d 2c 20 30 2c 20 26 70 6f 73  iFirst], 0, &pos
2e840 6c 69 73 74 29 3b 0a 20 20 20 20 20 20 77 68 69  list);.      whi
2e850 6c 65 28 20 30 3d 3d 73 71 6c 69 74 65 33 46 74  le( 0==sqlite3Ft
2e860 73 35 50 6f 73 6c 69 73 74 4e 65 78 74 36 34 28  s5PoslistNext64(
2e870 70 6f 73 6c 69 73 74 2e 70 2c 20 70 6f 73 6c 69  poslist.p, posli
2e880 73 74 2e 6e 2c 20 26 69 4f 66 66 2c 20 26 69 50  st.n, &iOff, &iP
2e890 6f 73 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69  os) ){.        i
2e8a0 6e 74 20 69 43 6f 6c 20 3d 20 46 54 53 35 5f 50  nt iCol = FTS5_P
2e8b0 4f 53 32 43 4f 4c 55 4d 4e 28 69 50 6f 73 29 3b  OS2COLUMN(iPos);
2e8c0 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 54 6f  .        int iTo
2e8d0 6b 4f 66 66 20 3d 20 46 54 53 35 5f 50 4f 53 32  kOff = FTS5_POS2
2e8e0 4f 46 46 53 45 54 28 69 50 6f 73 29 3b 0a 20 20  OFFSET(iPos);.  
2e8f0 20 20 20 20 20 20 63 6b 73 75 6d 32 20 5e 3d 20        cksum2 ^= 
2e900 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78  sqlite3Fts5Index
2e910 45 6e 74 72 79 43 6b 73 75 6d 28 69 52 6f 77 69  EntryCksum(iRowi
2e920 64 2c 20 69 43 6f 6c 2c 20 69 54 6f 6b 4f 66 66  d, iCol, iTokOff
2e930 2c 20 2d 31 2c 20 7a 2c 20 6e 29 3b 0a 20 20 20  , -1, z, n);.   
2e940 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
2e950 20 66 74 73 35 54 65 73 74 54 65 72 6d 28 70 2c   fts5TestTerm(p,
2e960 20 26 74 65 72 6d 2c 20 30 2c 20 30 2c 20 63 6b   &term, 0, 0, ck
2e970 73 75 6d 32 2c 20 26 63 6b 73 75 6d 33 29 3b 0a  sum2, &cksum3);.
2e980 0a 20 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72  .  fts5MultiIter
2e990 46 72 65 65 28 70 49 74 65 72 29 3b 0a 20 20 69  Free(pIter);.  i
2e9a0 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  f( p->rc==SQLITE
2e9b0 5f 4f 4b 20 26 26 20 63 6b 73 75 6d 21 3d 63 6b  _OK && cksum!=ck
2e9c0 73 75 6d 32 20 29 20 70 2d 3e 72 63 20 3d 20 46  sum2 ) p->rc = F
2e9d0 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a 0a 20 20  TS5_CORRUPT;..  
2e9e0 66 74 73 35 53 74 72 75 63 74 75 72 65 52 65 6c  fts5StructureRel
2e9f0 65 61 73 65 28 70 53 74 72 75 63 74 29 3b 0a 23  ease(pStruct);.#
2ea00 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
2ea10 55 47 0a 20 20 66 74 73 35 42 75 66 66 65 72 46  UG.  fts5BufferF
2ea20 72 65 65 28 26 74 65 72 6d 29 3b 0a 23 65 6e 64  ree(&term);.#end
2ea30 69 66 0a 20 20 66 74 73 35 42 75 66 66 65 72 46  if.  fts5BufferF
2ea40 72 65 65 28 26 70 6f 73 6c 69 73 74 29 3b 0a 20  ree(&poslist);. 
2ea50 20 72 65 74 75 72 6e 20 66 74 73 35 49 6e 64 65   return fts5Inde
2ea60 78 52 65 74 75 72 6e 28 70 29 3b 0a 7d 0a 0a 2f  xReturn(p);.}../
2ea70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2ea80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2ea90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2eaa0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2eab0 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a  *********.******
2eac0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2ead0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2eae0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2eaf0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2eb00 2a 2a 2a 2a 0a 2a 2a 20 42 65 6c 6f 77 20 74 68  ****.** Below th
2eb10 69 73 20 70 6f 69 6e 74 20 69 73 20 74 68 65 20  is point is the 
2eb20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f  implementation o
2eb30 66 20 74 68 65 20 66 74 73 35 5f 64 65 63 6f 64  f the fts5_decod
2eb40 65 28 29 20 73 63 61 6c 61 72 0a 2a 2a 20 66 75  e() scalar.** fu
2eb50 6e 63 74 69 6f 6e 20 6f 6e 6c 79 2e 0a 2a 2f 0a  nction only..*/.
2eb60 0a 2f 2a 0a 2a 2a 20 44 65 63 6f 64 65 20 61 20  ./*.** Decode a 
2eb70 73 65 67 6d 65 6e 74 2d 64 61 74 61 20 72 6f 77  segment-data row
2eb80 69 64 20 66 72 6f 6d 20 74 68 65 20 25 5f 64 61  id from the %_da
2eb90 74 61 20 74 61 62 6c 65 2e 20 54 68 69 73 20 66  ta table. This f
2eba0 75 6e 63 74 69 6f 6e 20 69 73 0a 2a 2a 20 74 68  unction is.** th
2ebb0 65 20 6f 70 70 6f 73 69 74 65 20 6f 66 20 6d 61  e opposite of ma
2ebc0 63 72 6f 20 46 54 53 35 5f 53 45 47 4d 45 4e 54  cro FTS5_SEGMENT
2ebd0 5f 52 4f 57 49 44 28 29 2e 0a 2a 2f 0a 73 74 61  _ROWID()..*/.sta
2ebe0 74 69 63 20 76 6f 69 64 20 66 74 73 35 44 65 63  tic void fts5Dec
2ebf0 6f 64 65 52 6f 77 69 64 28 0a 20 20 69 36 34 20  odeRowid(.  i64 
2ec00 69 52 6f 77 69 64 2c 20 20 20 20 20 20 20 20 20  iRowid,         
2ec10 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
2ec20 6f 77 69 64 20 66 72 6f 6d 20 25 5f 64 61 74 61  owid from %_data
2ec30 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20   table */.  int 
2ec40 2a 70 69 53 65 67 69 64 2c 20 20 20 20 20 20 20  *piSegid,       
2ec50 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
2ec60 55 54 3a 20 53 65 67 6d 65 6e 74 20 69 64 20 2a  UT: Segment id *
2ec70 2f 0a 20 20 69 6e 74 20 2a 70 62 44 6c 69 64 78  /.  int *pbDlidx
2ec80 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
2ec90 20 20 20 20 2f 2a 20 4f 55 54 3a 20 44 6c 69 64      /* OUT: Dlid
2eca0 78 20 66 6c 61 67 20 2a 2f 0a 20 20 69 6e 74 20  x flag */.  int 
2ecb0 2a 70 69 48 65 69 67 68 74 2c 20 20 20 20 20 20  *piHeight,      
2ecc0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
2ecd0 55 54 3a 20 48 65 69 67 68 74 20 2a 2f 0a 20 20  UT: Height */.  
2ece0 69 6e 74 20 2a 70 69 50 67 6e 6f 20 20 20 20 20  int *piPgno     
2ecf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ed00 2f 2a 20 4f 55 54 3a 20 50 61 67 65 20 6e 75 6d  /* OUT: Page num
2ed10 62 65 72 20 2a 2f 0a 29 7b 0a 20 20 2a 70 69 50  ber */.){.  *piP
2ed20 67 6e 6f 20 3d 20 28 69 6e 74 29 28 69 52 6f 77  gno = (int)(iRow
2ed30 69 64 20 26 20 28 28 28 69 36 34 29 31 20 3c 3c  id & (((i64)1 <<
2ed40 20 46 54 53 35 5f 44 41 54 41 5f 50 41 47 45 5f   FTS5_DATA_PAGE_
2ed50 42 29 20 2d 20 31 29 29 3b 0a 20 20 69 52 6f 77  B) - 1));.  iRow
2ed60 69 64 20 3e 3e 3d 20 46 54 53 35 5f 44 41 54 41  id >>= FTS5_DATA
2ed70 5f 50 41 47 45 5f 42 3b 0a 0a 20 20 2a 70 69 48  _PAGE_B;..  *piH
2ed80 65 69 67 68 74 20 3d 20 28 69 6e 74 29 28 69 52  eight = (int)(iR
2ed90 6f 77 69 64 20 26 20 28 28 28 69 36 34 29 31 20  owid & (((i64)1 
2eda0 3c 3c 20 46 54 53 35 5f 44 41 54 41 5f 48 45 49  << FTS5_DATA_HEI
2edb0 47 48 54 5f 42 29 20 2d 20 31 29 29 3b 0a 20 20  GHT_B) - 1));.  
2edc0 69 52 6f 77 69 64 20 3e 3e 3d 20 46 54 53 35 5f  iRowid >>= FTS5_
2edd0 44 41 54 41 5f 48 45 49 47 48 54 5f 42 3b 0a 0a  DATA_HEIGHT_B;..
2ede0 20 20 2a 70 62 44 6c 69 64 78 20 3d 20 28 69 6e    *pbDlidx = (in
2edf0 74 29 28 69 52 6f 77 69 64 20 26 20 30 78 30 30  t)(iRowid & 0x00
2ee00 30 31 29 3b 0a 20 20 69 52 6f 77 69 64 20 3e 3e  01);.  iRowid >>
2ee10 3d 20 46 54 53 35 5f 44 41 54 41 5f 44 4c 49 5f  = FTS5_DATA_DLI_
2ee20 42 3b 0a 0a 20 20 2a 70 69 53 65 67 69 64 20 3d  B;..  *piSegid =
2ee30 20 28 69 6e 74 29 28 69 52 6f 77 69 64 20 26 20   (int)(iRowid & 
2ee40 28 28 28 69 36 34 29 31 20 3c 3c 20 46 54 53 35  (((i64)1 << FTS5
2ee50 5f 44 41 54 41 5f 49 44 5f 42 29 20 2d 20 31 29  _DATA_ID_B) - 1)
2ee60 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69  );.}..static voi
2ee70 64 20 66 74 73 35 44 65 62 75 67 52 6f 77 69 64  d fts5DebugRowid
2ee80 28 69 6e 74 20 2a 70 52 63 2c 20 46 74 73 35 42  (int *pRc, Fts5B
2ee90 75 66 66 65 72 20 2a 70 42 75 66 2c 20 69 36 34  uffer *pBuf, i64
2eea0 20 69 4b 65 79 29 7b 0a 20 20 69 6e 74 20 69 53   iKey){.  int iS
2eeb0 65 67 69 64 2c 20 69 48 65 69 67 68 74 2c 20 69  egid, iHeight, i
2eec0 50 67 6e 6f 2c 20 62 44 6c 69 64 78 3b 20 20 20  Pgno, bDlidx;   
2eed0 20 20 20 20 2f 2a 20 52 6f 77 69 64 20 63 6f 6d      /* Rowid com
2eee0 70 65 6e 65 6e 74 73 20 2a 2f 0a 20 20 66 74 73  penents */.  fts
2eef0 35 44 65 63 6f 64 65 52 6f 77 69 64 28 69 4b 65  5DecodeRowid(iKe
2ef00 79 2c 20 26 69 53 65 67 69 64 2c 20 26 62 44 6c  y, &iSegid, &bDl
2ef10 69 64 78 2c 20 26 69 48 65 69 67 68 74 2c 20 26  idx, &iHeight, &
2ef20 69 50 67 6e 6f 29 3b 0a 0a 20 20 69 66 28 20 69  iPgno);..  if( i
2ef30 53 65 67 69 64 3d 3d 30 20 29 7b 0a 20 20 20 20  Segid==0 ){.    
2ef40 69 66 28 20 69 4b 65 79 3d 3d 46 54 53 35 5f 41  if( iKey==FTS5_A
2ef50 56 45 52 41 47 45 53 5f 52 4f 57 49 44 20 29 7b  VERAGES_ROWID ){
2ef60 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 46 74  .      sqlite3Ft
2ef70 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 50 72  s5BufferAppendPr
2ef80 69 6e 74 66 28 70 52 63 2c 20 70 42 75 66 2c 20  intf(pRc, pBuf, 
2ef90 22 7b 61 76 65 72 61 67 65 73 7d 20 22 29 3b 0a  "{averages} ");.
2efa0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2efb0 20 73 71 6c 69 74 65 33 46 74 73 35 42 75 66 66   sqlite3Fts5Buff
2efc0 65 72 41 70 70 65 6e 64 50 72 69 6e 74 66 28 70  erAppendPrintf(p
2efd0 52 63 2c 20 70 42 75 66 2c 20 22 7b 73 74 72 75  Rc, pBuf, "{stru
2efe0 63 74 75 72 65 7d 22 29 3b 0a 20 20 20 20 7d 0a  cture}");.    }.
2eff0 20 20 7d 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20    }.  else{.    
2f000 73 71 6c 69 74 65 33 46 74 73 35 42 75 66 66 65  sqlite3Fts5Buffe
2f010 72 41 70 70 65 6e 64 50 72 69 6e 74 66 28 70 52  rAppendPrintf(pR
2f020 63 2c 20 70 42 75 66 2c 20 22 7b 25 73 73 65 67  c, pBuf, "{%sseg
2f030 69 64 3d 25 64 20 68 3d 25 64 20 70 67 6e 6f 3d  id=%d h=%d pgno=
2f040 25 64 7d 22 2c 0a 20 20 20 20 20 20 20 20 62 44  %d}",.        bD
2f050 6c 69 64 78 20 3f 20 22 64 6c 69 64 78 20 22 20  lidx ? "dlidx " 
2f060 3a 20 22 22 2c 20 69 53 65 67 69 64 2c 20 69 48  : "", iSegid, iH
2f070 65 69 67 68 74 2c 20 69 50 67 6e 6f 0a 20 20 20  eight, iPgno.   
2f080 20 29 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69   );.  }.}..stati
2f090 63 20 76 6f 69 64 20 66 74 73 35 44 65 62 75 67  c void fts5Debug
2f0a0 53 74 72 75 63 74 75 72 65 28 0a 20 20 69 6e 74  Structure(.  int
2f0b0 20 2a 70 52 63 2c 20 20 20 20 20 20 20 20 20 20   *pRc,          
2f0c0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2f0d0 49 4e 2f 4f 55 54 3a 20 65 72 72 6f 72 20 63 6f  IN/OUT: error co
2f0e0 64 65 20 2a 2f 0a 20 20 46 74 73 35 42 75 66 66  de */.  Fts5Buff
2f0f0 65 72 20 2a 70 42 75 66 2c 0a 20 20 46 74 73 35  er *pBuf,.  Fts5
2f100 53 74 72 75 63 74 75 72 65 20 2a 70 0a 29 7b 0a  Structure *p.){.
2f110 20 20 69 6e 74 20 69 4c 76 6c 2c 20 69 53 65 67    int iLvl, iSeg
2f120 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2f130 20 20 2f 2a 20 49 74 65 72 61 74 65 20 74 68 72    /* Iterate thr
2f140 6f 75 67 68 20 6c 65 76 65 6c 73 2c 20 73 65 67  ough levels, seg
2f150 6d 65 6e 74 73 20 2a 2f 0a 0a 20 20 66 6f 72 28  ments */..  for(
2f160 69 4c 76 6c 3d 30 3b 20 69 4c 76 6c 3c 70 2d 3e  iLvl=0; iLvl<p->
2f170 6e 4c 65 76 65 6c 3b 20 69 4c 76 6c 2b 2b 29 7b  nLevel; iLvl++){
2f180 0a 20 20 20 20 46 74 73 35 53 74 72 75 63 74 75  .    Fts5Structu
2f190 72 65 4c 65 76 65 6c 20 2a 70 4c 76 6c 20 3d 20  reLevel *pLvl = 
2f1a0 26 70 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d  &p->aLevel[iLvl]
2f1b0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 46 74 73  ;.    sqlite3Fts
2f1c0 35 42 75 66 66 65 72 41 70 70 65 6e 64 50 72 69  5BufferAppendPri
2f1d0 6e 74 66 28 70 52 63 2c 20 70 42 75 66 2c 20 0a  ntf(pRc, pBuf, .
2f1e0 20 20 20 20 20 20 20 20 22 20 7b 6c 76 6c 3d 25          " {lvl=%
2f1f0 64 20 6e 4d 65 72 67 65 3d 25 64 20 6e 53 65 67  d nMerge=%d nSeg
2f200 3d 25 64 22 2c 20 69 4c 76 6c 2c 20 70 4c 76 6c  =%d", iLvl, pLvl
2f210 2d 3e 6e 4d 65 72 67 65 2c 20 70 4c 76 6c 2d 3e  ->nMerge, pLvl->
2f220 6e 53 65 67 0a 20 20 20 20 29 3b 0a 20 20 20 20  nSeg.    );.    
2f230 66 6f 72 28 69 53 65 67 3d 30 3b 20 69 53 65 67  for(iSeg=0; iSeg
2f240 3c 70 4c 76 6c 2d 3e 6e 53 65 67 3b 20 69 53 65  <pLvl->nSeg; iSe
2f250 67 2b 2b 29 7b 0a 20 20 20 20 20 20 46 74 73 35  g++){.      Fts5
2f260 53 74 72 75 63 74 75 72 65 53 65 67 6d 65 6e 74  StructureSegment
2f270 20 2a 70 53 65 67 20 3d 20 26 70 4c 76 6c 2d 3e   *pSeg = &pLvl->
2f280 61 53 65 67 5b 69 53 65 67 5d 3b 0a 20 20 20 20  aSeg[iSeg];.    
2f290 20 20 73 71 6c 69 74 65 33 46 74 73 35 42 75 66    sqlite3Fts5Buf
2f2a0 66 65 72 41 70 70 65 6e 64 50 72 69 6e 74 66 28  ferAppendPrintf(
2f2b0 70 52 63 2c 20 70 42 75 66 2c 20 22 20 7b 69 64  pRc, pBuf, " {id
2f2c0 3d 25 64 20 6c 65 61 76 65 73 3d 25 64 2e 2e 25  =%d leaves=%d..%
2f2d0 64 7d 22 2c 20 0a 20 20 20 20 20 20 20 20 20 20  d}", .          
2f2e0 70 53 65 67 2d 3e 69 53 65 67 69 64 2c 20 70 53  pSeg->iSegid, pS
2f2f0 65 67 2d 3e 70 67 6e 6f 46 69 72 73 74 2c 20 70  eg->pgnoFirst, p
2f300 53 65 67 2d 3e 70 67 6e 6f 4c 61 73 74 0a 20 20  Seg->pgnoLast.  
2f310 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20      );.    }.   
2f320 20 73 71 6c 69 74 65 33 46 74 73 35 42 75 66 66   sqlite3Fts5Buff
2f330 65 72 41 70 70 65 6e 64 50 72 69 6e 74 66 28 70  erAppendPrintf(p
2f340 52 63 2c 20 70 42 75 66 2c 20 22 7d 22 29 3b 0a  Rc, pBuf, "}");.
2f350 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69    }.}../*.** Thi
2f360 73 20 69 73 20 70 61 72 74 20 6f 66 20 74 68 65  s is part of the
2f370 20 66 74 73 35 5f 64 65 63 6f 64 65 28 29 20 64   fts5_decode() d
2f380 65 62 75 67 67 69 6e 67 20 61 69 64 2e 0a 2a 2a  ebugging aid..**
2f390 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 73 20 70 42  .** Arguments pB
2f3a0 6c 6f 62 2f 6e 42 6c 6f 62 20 63 6f 6e 74 61 69  lob/nBlob contai
2f3b0 6e 20 61 20 73 65 72 69 61 6c 69 7a 65 64 20 46  n a serialized F
2f3c0 74 73 35 53 74 72 75 63 74 75 72 65 20 6f 62 6a  ts5Structure obj
2f3d0 65 63 74 2e 20 54 68 69 73 0a 2a 2a 20 66 75 6e  ect. This.** fun
2f3e0 63 74 69 6f 6e 20 61 70 70 65 6e 64 73 20 61 20  ction appends a 
2f3f0 68 75 6d 61 6e 2d 72 65 61 64 61 62 6c 65 20 72  human-readable r
2f400 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66  epresentation of
2f410 20 74 68 65 20 73 61 6d 65 20 6f 62 6a 65 63 74   the same object
2f420 0a 2a 2a 20 74 6f 20 74 68 65 20 62 75 66 66 65  .** to the buffe
2f430 72 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  r passed as the 
2f440 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2e  second argument.
2f450 20 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64   .*/.static void
2f460 20 66 74 73 35 44 65 63 6f 64 65 53 74 72 75 63   fts5DecodeStruc
2f470 74 75 72 65 28 0a 20 20 69 6e 74 20 2a 70 52 63  ture(.  int *pRc
2f480 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
2f490 20 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f 55          /* IN/OU
2f4a0 54 3a 20 65 72 72 6f 72 20 63 6f 64 65 20 2a 2f  T: error code */
2f4b0 0a 20 20 46 74 73 35 42 75 66 66 65 72 20 2a 70  .  Fts5Buffer *p
2f4c0 42 75 66 2c 0a 20 20 63 6f 6e 73 74 20 75 38 20  Buf,.  const u8 
2f4d0 2a 70 42 6c 6f 62 2c 20 69 6e 74 20 6e 42 6c 6f  *pBlob, int nBlo
2f4e0 62 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20  b.){.  int rc;  
2f4f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f500 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
2f510 20 63 6f 64 65 20 2a 2f 0a 20 20 46 74 73 35 53   code */.  Fts5S
2f520 74 72 75 63 74 75 72 65 20 2a 70 20 3d 20 30 3b  tructure *p = 0;
2f530 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 65             /* De
2f540 63 6f 64 65 64 20 73 74 72 75 63 74 75 72 65 20  coded structure 
2f550 6f 62 6a 65 63 74 20 2a 2f 0a 0a 20 20 72 63 20  object */..  rc 
2f560 3d 20 66 74 73 35 53 74 72 75 63 74 75 72 65 44  = fts5StructureD
2f570 65 63 6f 64 65 28 70 42 6c 6f 62 2c 20 6e 42 6c  ecode(pBlob, nBl
2f580 6f 62 2c 20 30 2c 20 26 70 29 3b 0a 20 20 69 66  ob, 0, &p);.  if
2f590 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
2f5a0 29 7b 0a 20 20 20 20 2a 70 52 63 20 3d 20 72 63  ){.    *pRc = rc
2f5b0 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  ;.    return;.  
2f5c0 7d 0a 0a 20 20 66 74 73 35 44 65 62 75 67 53 74  }..  fts5DebugSt
2f5d0 72 75 63 74 75 72 65 28 70 52 63 2c 20 70 42 75  ructure(pRc, pBu
2f5e0 66 2c 20 70 29 3b 0a 20 20 66 74 73 35 53 74 72  f, p);.  fts5Str
2f5f0 75 63 74 75 72 65 52 65 6c 65 61 73 65 28 70 29  uctureRelease(p)
2f600 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
2f610 69 73 20 70 61 72 74 20 6f 66 20 74 68 65 20 66  is part of the f
2f620 74 73 35 5f 64 65 63 6f 64 65 28 29 20 64 65 62  ts5_decode() deb
2f630 75 67 67 69 6e 67 20 61 69 64 2e 0a 2a 2a 0a 2a  ugging aid..**.*
2f640 2a 20 41 72 67 75 6d 65 6e 74 73 20 70 42 6c 6f  * Arguments pBlo
2f650 62 2f 6e 42 6c 6f 62 20 63 6f 6e 74 61 69 6e 20  b/nBlob contain 
2f660 61 6e 20 22 61 76 65 72 61 67 65 73 22 20 72 65  an "averages" re
2f670 63 6f 72 64 2e 20 54 68 69 73 20 66 75 6e 63 74  cord. This funct
2f680 69 6f 6e 20 0a 2a 2a 20 61 70 70 65 6e 64 73 20  ion .** appends 
2f690 61 20 68 75 6d 61 6e 2d 72 65 61 64 61 62 6c 65  a human-readable
2f6a0 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20   representation 
2f6b0 6f 66 20 72 65 63 6f 72 64 20 74 6f 20 74 68 65  of record to the
2f6c0 20 62 75 66 66 65 72 20 70 61 73 73 65 64 20 0a   buffer passed .
2f6d0 2a 2a 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64  ** as the second
2f6e0 20 61 72 67 75 6d 65 6e 74 2e 20 0a 2a 2f 0a 73   argument. .*/.s
2f6f0 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 44  tatic void fts5D
2f700 65 63 6f 64 65 41 76 65 72 61 67 65 73 28 0a 20  ecodeAverages(. 
2f710 20 69 6e 74 20 2a 70 52 63 2c 20 20 20 20 20 20   int *pRc,      
2f720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f730 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 65 72 72 6f   /* IN/OUT: erro
2f740 72 20 63 6f 64 65 20 2a 2f 0a 20 20 46 74 73 35  r code */.  Fts5
2f750 42 75 66 66 65 72 20 2a 70 42 75 66 2c 0a 20 20  Buffer *pBuf,.  
2f760 63 6f 6e 73 74 20 75 38 20 2a 70 42 6c 6f 62 2c  const u8 *pBlob,
2f770 20 69 6e 74 20 6e 42 6c 6f 62 0a 29 7b 0a 20 20   int nBlob.){.  
2f780 69 6e 74 20 69 20 3d 20 30 3b 0a 20 20 63 6f 6e  int i = 0;.  con
2f790 73 74 20 63 68 61 72 20 2a 7a 53 70 61 63 65 20  st char *zSpace 
2f7a0 3d 20 22 22 3b 0a 0a 20 20 77 68 69 6c 65 28 20  = "";..  while( 
2f7b0 69 3c 6e 42 6c 6f 62 20 29 7b 0a 20 20 20 20 75  i<nBlob ){.    u
2f7c0 36 34 20 69 56 61 6c 3b 0a 20 20 20 20 69 20 2b  64 iVal;.    i +
2f7d0 3d 20 73 71 6c 69 74 65 33 46 74 73 35 47 65 74  = sqlite3Fts5Get
2f7e0 56 61 72 69 6e 74 28 26 70 42 6c 6f 62 5b 69 5d  Varint(&pBlob[i]
2f7f0 2c 20 26 69 56 61 6c 29 3b 0a 20 20 20 20 73 71  , &iVal);.    sq
2f800 6c 69 74 65 33 46 74 73 35 42 75 66 66 65 72 41  lite3Fts5BufferA
2f810 70 70 65 6e 64 50 72 69 6e 74 66 28 70 52 63 2c  ppendPrintf(pRc,
2f820 20 70 42 75 66 2c 20 22 25 73 25 64 22 2c 20 7a   pBuf, "%s%d", z
2f830 53 70 61 63 65 2c 20 28 69 6e 74 29 69 56 61 6c  Space, (int)iVal
2f840 29 3b 0a 20 20 20 20 7a 53 70 61 63 65 20 3d 20  );.    zSpace = 
2f850 22 20 22 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  " ";.  }.}../*.*
2f860 2a 20 42 75 66 66 65 72 20 28 61 2f 6e 29 20 69  * Buffer (a/n) i
2f870 73 20 61 73 73 75 6d 65 64 20 74 6f 20 63 6f 6e  s assumed to con
2f880 74 61 69 6e 20 61 20 6c 69 73 74 20 6f 66 20 73  tain a list of s
2f890 65 72 69 61 6c 69 7a 65 64 20 76 61 72 69 6e 74  erialized varint
2f8a0 73 2e 20 52 65 61 64 0a 2a 2a 20 65 61 63 68 20  s. Read.** each 
2f8b0 76 61 72 69 6e 74 20 61 6e 64 20 61 70 70 65 6e  varint and appen
2f8c0 64 20 69 74 73 20 73 74 72 69 6e 67 20 72 65 70  d its string rep
2f8d0 72 65 73 65 6e 74 61 74 69 6f 6e 20 74 6f 20 62  resentation to b
2f8e0 75 66 66 65 72 20 70 42 75 66 2e 20 52 65 74 75  uffer pBuf. Retu
2f8f0 72 6e 0a 2a 2a 20 61 66 74 65 72 20 65 69 74 68  rn.** after eith
2f900 65 72 20 74 68 65 20 69 6e 70 75 74 20 62 75 66  er the input buf
2f910 66 65 72 20 69 73 20 65 78 68 61 75 73 74 65 64  fer is exhausted
2f920 20 6f 72 20 61 20 30 20 76 61 6c 75 65 20 69 73   or a 0 value is
2f930 20 72 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65   read..**.** The
2f940 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73   return value is
2f950 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62   the number of b
2f960 79 74 65 73 20 72 65 61 64 20 66 72 6f 6d 20 74  ytes read from t
2f970 68 65 20 69 6e 70 75 74 20 62 75 66 66 65 72 2e  he input buffer.
2f980 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .*/.static int f
2f990 74 73 35 44 65 63 6f 64 65 50 6f 73 6c 69 73 74  ts5DecodePoslist
2f9a0 28 69 6e 74 20 2a 70 52 63 2c 20 46 74 73 35 42  (int *pRc, Fts5B
2f9b0 75 66 66 65 72 20 2a 70 42 75 66 2c 20 63 6f 6e  uffer *pBuf, con
2f9c0 73 74 20 75 38 20 2a 61 2c 20 69 6e 74 20 6e 29  st u8 *a, int n)
2f9d0 7b 0a 20 20 69 6e 74 20 69 4f 66 66 20 3d 20 30  {.  int iOff = 0
2f9e0 3b 0a 20 20 77 68 69 6c 65 28 20 69 4f 66 66 3c  ;.  while( iOff<
2f9f0 6e 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 56 61  n ){.    int iVa
2fa00 6c 3b 0a 20 20 20 20 69 4f 66 66 20 2b 3d 20 66  l;.    iOff += f
2fa10 74 73 35 47 65 74 56 61 72 69 6e 74 33 32 28 26  ts5GetVarint32(&
2fa20 61 5b 69 4f 66 66 5d 2c 20 69 56 61 6c 29 3b 0a  a[iOff], iVal);.
2fa30 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 42      sqlite3Fts5B
2fa40 75 66 66 65 72 41 70 70 65 6e 64 50 72 69 6e 74  ufferAppendPrint
2fa50 66 28 70 52 63 2c 20 70 42 75 66 2c 20 22 20 25  f(pRc, pBuf, " %
2fa60 64 22 2c 20 69 56 61 6c 29 3b 0a 20 20 7d 0a 20  d", iVal);.  }. 
2fa70 20 72 65 74 75 72 6e 20 69 4f 66 66 3b 0a 7d 0a   return iOff;.}.
2fa80 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73 74 61 72 74  ./*.** The start
2fa90 20 6f 66 20 62 75 66 66 65 72 20 28 61 2f 6e 29   of buffer (a/n)
2faa0 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 73 74   contains the st
2fab0 61 72 74 20 6f 66 20 61 20 64 6f 63 6c 69 73 74  art of a doclist
2fac0 2e 20 54 68 65 20 64 6f 63 6c 69 73 74 0a 2a 2a  . The doclist.**
2fad0 20 6d 61 79 20 6f 72 20 6d 61 79 20 6e 6f 74 20   may or may not 
2fae0 66 69 6e 69 73 68 20 77 69 74 68 69 6e 20 74 68  finish within th
2faf0 65 20 62 75 66 66 65 72 2e 20 54 68 69 73 20 66  e buffer. This f
2fb00 75 6e 63 74 69 6f 6e 20 61 70 70 65 6e 64 73 20  unction appends 
2fb10 61 20 74 65 78 74 0a 2a 2a 20 72 65 70 72 65 73  a text.** repres
2fb20 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  entation of the 
2fb30 70 61 72 74 20 6f 66 20 74 68 65 20 64 6f 63 6c  part of the docl
2fb40 69 73 74 20 74 68 61 74 20 69 73 20 70 72 65 73  ist that is pres
2fb50 65 6e 74 20 74 6f 20 62 75 66 66 65 72 0a 2a 2a  ent to buffer.**
2fb60 20 70 42 75 66 2e 20 0a 2a 2a 0a 2a 2a 20 54 68   pBuf. .**.** Th
2fb70 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69  e return value i
2fb80 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
2fb90 62 79 74 65 73 20 72 65 61 64 20 66 72 6f 6d 20  bytes read from 
2fba0 74 68 65 20 69 6e 70 75 74 20 62 75 66 66 65 72  the input buffer
2fbb0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
2fbc0 66 74 73 35 44 65 63 6f 64 65 44 6f 63 6c 69 73  fts5DecodeDoclis
2fbd0 74 28 69 6e 74 20 2a 70 52 63 2c 20 46 74 73 35  t(int *pRc, Fts5
2fbe0 42 75 66 66 65 72 20 2a 70 42 75 66 2c 20 63 6f  Buffer *pBuf, co
2fbf0 6e 73 74 20 75 38 20 2a 61 2c 20 69 6e 74 20 6e  nst u8 *a, int n
2fc00 29 7b 0a 20 20 69 36 34 20 69 44 6f 63 69 64 20  ){.  i64 iDocid 
2fc10 3d 20 30 3b 0a 20 20 69 6e 74 20 69 4f 66 66 20  = 0;.  int iOff 
2fc20 3d 20 30 3b 0a 0a 20 20 69 66 28 20 6e 3e 30 20  = 0;..  if( n>0 
2fc30 29 7b 0a 20 20 20 20 69 4f 66 66 20 3d 20 73 71  ){.    iOff = sq
2fc40 6c 69 74 65 33 46 74 73 35 47 65 74 56 61 72 69  lite3Fts5GetVari
2fc50 6e 74 28 61 2c 20 28 75 36 34 2a 29 26 69 44 6f  nt(a, (u64*)&iDo
2fc60 63 69 64 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  cid);.    sqlite
2fc70 33 46 74 73 35 42 75 66 66 65 72 41 70 70 65 6e  3Fts5BufferAppen
2fc80 64 50 72 69 6e 74 66 28 70 52 63 2c 20 70 42 75  dPrintf(pRc, pBu
2fc90 66 2c 20 22 20 69 64 3d 25 6c 6c 64 22 2c 20 69  f, " id=%lld", i
2fca0 44 6f 63 69 64 29 3b 0a 20 20 7d 0a 20 20 77 68  Docid);.  }.  wh
2fcb0 69 6c 65 28 20 69 4f 66 66 3c 6e 20 29 7b 0a 20  ile( iOff<n ){. 
2fcc0 20 20 20 69 6e 74 20 6e 50 6f 73 3b 0a 20 20 20     int nPos;.   
2fcd0 20 69 6e 74 20 62 44 65 6c 3b 0a 20 20 20 20 69   int bDel;.    i
2fce0 4f 66 66 20 2b 3d 20 66 74 73 35 47 65 74 50 6f  Off += fts5GetPo
2fcf0 73 6c 69 73 74 53 69 7a 65 28 26 61 5b 69 4f 66  slistSize(&a[iOf
2fd00 66 5d 2c 20 26 6e 50 6f 73 2c 20 26 62 44 65 6c  f], &nPos, &bDel
2fd10 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 46 74  );.    sqlite3Ft
2fd20 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 50 72  s5BufferAppendPr
2fd30 69 6e 74 66 28 70 52 63 2c 20 70 42 75 66 2c 20  intf(pRc, pBuf, 
2fd40 22 20 6e 50 6f 73 3d 25 64 25 73 22 2c 20 6e 50  " nPos=%d%s", nP
2fd50 6f 73 2c 20 62 44 65 6c 3f 22 2a 22 3a 22 22 29  os, bDel?"*":"")
2fd60 3b 0a 20 20 20 20 69 4f 66 66 20 2b 3d 20 66 74  ;.    iOff += ft
2fd70 73 35 44 65 63 6f 64 65 50 6f 73 6c 69 73 74 28  s5DecodePoslist(
2fd80 70 52 63 2c 20 70 42 75 66 2c 20 26 61 5b 69 4f  pRc, pBuf, &a[iO
2fd90 66 66 5d 2c 20 4d 49 4e 28 6e 2d 69 4f 66 66 2c  ff], MIN(n-iOff,
2fda0 20 6e 50 6f 73 29 29 3b 0a 20 20 20 20 69 66 28   nPos));.    if(
2fdb0 20 69 4f 66 66 3c 6e 20 29 7b 0a 20 20 20 20 20   iOff<n ){.     
2fdc0 20 69 36 34 20 69 44 65 6c 74 61 3b 0a 20 20 20   i64 iDelta;.   
2fdd0 20 20 20 69 4f 66 66 20 2b 3d 20 73 71 6c 69 74     iOff += sqlit
2fde0 65 33 46 74 73 35 47 65 74 56 61 72 69 6e 74 28  e3Fts5GetVarint(
2fdf0 26 61 5b 69 4f 66 66 5d 2c 20 28 75 36 34 2a 29  &a[iOff], (u64*)
2fe00 26 69 44 65 6c 74 61 29 3b 0a 20 20 20 20 20 20  &iDelta);.      
2fe10 69 44 6f 63 69 64 20 2b 3d 20 69 44 65 6c 74 61  iDocid += iDelta
2fe20 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 46  ;.      sqlite3F
2fe30 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 50  ts5BufferAppendP
2fe40 72 69 6e 74 66 28 70 52 63 2c 20 70 42 75 66 2c  rintf(pRc, pBuf,
2fe50 20 22 20 69 64 3d 25 6c 6c 64 22 2c 20 69 44 6f   " id=%lld", iDo
2fe60 63 69 64 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  cid);.    }.  }.
2fe70 0a 20 20 72 65 74 75 72 6e 20 69 4f 66 66 3b 0a  .  return iOff;.
2fe80 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
2fe90 6e 63 74 69 6f 6e 20 69 73 20 70 61 72 74 20 6f  nction is part o
2fea0 66 20 74 68 65 20 66 74 73 35 5f 64 65 63 6f 64  f the fts5_decod
2feb0 65 28 29 20 64 65 62 75 67 67 69 6e 67 20 66 75  e() debugging fu
2fec0 6e 63 74 69 6f 6e 2e 20 49 74 20 69 73 20 0a 2a  nction. It is .*
2fed0 2a 20 6f 6e 6c 79 20 65 76 65 72 20 75 73 65 64  * only ever used
2fee0 20 77 69 74 68 20 64 65 74 61 69 6c 3d 6e 6f 6e   with detail=non
2fef0 65 20 74 61 62 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20  e tables..**.** 
2ff00 42 75 66 66 65 72 20 28 70 44 61 74 61 2f 6e 44  Buffer (pData/nD
2ff10 61 74 61 29 20 63 6f 6e 74 61 69 6e 73 20 61 20  ata) contains a 
2ff20 64 6f 63 6c 69 73 74 20 69 6e 20 74 68 65 20 66  doclist in the f
2ff30 6f 72 6d 61 74 20 75 73 65 64 20 62 79 20 64 65  ormat used by de
2ff40 74 61 69 6c 3d 6e 6f 6e 65 0a 2a 2a 20 74 61 62  tail=none.** tab
2ff50 6c 65 73 2e 20 54 68 69 73 20 66 75 6e 63 74 69  les. This functi
2ff60 6f 6e 20 61 70 70 65 6e 64 73 20 61 20 68 75 6d  on appends a hum
2ff70 61 6e 2d 72 65 61 64 61 62 6c 65 20 76 65 72 73  an-readable vers
2ff80 69 6f 6e 20 6f 66 20 74 68 61 74 20 6c 69 73 74  ion of that list
2ff90 20 74 6f 0a 2a 2a 20 62 75 66 66 65 72 20 70 42   to.** buffer pB
2ffa0 75 66 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 2a 70 52  uf..**.** If *pR
2ffb0 63 20 69 73 20 6f 74 68 65 72 20 74 68 61 6e 20  c is other than 
2ffc0 53 51 4c 49 54 45 5f 4f 4b 20 77 68 65 6e 20 74  SQLITE_OK when t
2ffd0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
2ffe0 63 61 6c 6c 65 64 2c 20 69 74 20 69 73 20 61 0a  called, it is a.
2fff0 2a 2a 20 6e 6f 2d 6f 70 2e 20 49 66 20 61 6e 20  ** no-op. If an 
30000 4f 4f 4d 20 6f 72 20 6f 74 68 65 72 20 65 72 72  OOM or other err
30010 6f 72 20 6f 63 63 75 72 73 20 77 69 74 68 69 6e  or occurs within
30020 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20   this function, 
30030 2a 70 52 63 20 69 73 0a 2a 2a 20 73 65 74 20 74  *pRc is.** set t
30040 6f 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f  o an SQLite erro
30050 72 20 63 6f 64 65 20 62 65 66 6f 72 65 20 72 65  r code before re
30060 74 75 72 6e 69 6e 67 2e 20 54 68 65 20 66 69 6e  turning. The fin
30070 61 6c 20 73 74 61 74 65 20 6f 66 20 62 75 66 66  al state of buff
30080 65 72 0a 2a 2a 20 70 42 75 66 20 69 73 20 75 6e  er.** pBuf is un
30090 64 65 66 69 6e 65 64 20 69 6e 20 74 68 69 73 20  defined in this 
300a0 63 61 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  case..*/.static 
300b0 76 6f 69 64 20 66 74 73 35 44 65 63 6f 64 65 52  void fts5DecodeR
300c0 6f 77 69 64 4c 69 73 74 28 0a 20 20 69 6e 74 20  owidList(.  int 
300d0 2a 70 52 63 2c 20 20 20 20 20 20 20 20 20 20 20  *pRc,           
300e0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
300f0 4e 2f 4f 55 54 3a 20 45 72 72 6f 72 20 63 6f 64  N/OUT: Error cod
30100 65 20 2a 2f 0a 20 20 46 74 73 35 42 75 66 66 65  e */.  Fts5Buffe
30110 72 20 2a 70 42 75 66 2c 20 20 20 20 20 20 20 20  r *pBuf,        
30120 20 20 20 20 20 20 20 2f 2a 20 42 75 66 66 65 72         /* Buffer
30130 20 74 6f 20 61 70 70 65 6e 64 20 74 65 78 74 20   to append text 
30140 74 6f 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 75 38  to */.  const u8
30150 20 2a 70 44 61 74 61 2c 20 69 6e 74 20 6e 44 61   *pData, int nDa
30160 74 61 20 20 20 20 20 20 2f 2a 20 44 61 74 61 20  ta      /* Data 
30170 74 6f 20 64 65 63 6f 64 65 20 6c 69 73 74 2d 6f  to decode list-o
30180 66 2d 72 6f 77 69 64 73 20 66 72 6f 6d 20 2a 2f  f-rowids from */
30190 0a 29 7b 0a 20 20 69 6e 74 20 69 20 3d 20 30 3b  .){.  int i = 0;
301a0 0a 20 20 69 36 34 20 69 52 6f 77 69 64 20 3d 20  .  i64 iRowid = 
301b0 30 3b 0a 0a 20 20 77 68 69 6c 65 28 20 69 3c 6e  0;..  while( i<n
301c0 44 61 74 61 20 29 7b 0a 20 20 20 20 63 6f 6e 73  Data ){.    cons
301d0 74 20 63 68 61 72 20 2a 7a 41 70 70 20 3d 20 22  t char *zApp = "
301e0 22 3b 0a 20 20 20 20 75 36 34 20 69 56 61 6c 3b  ";.    u64 iVal;
301f0 0a 20 20 20 20 69 20 2b 3d 20 73 71 6c 69 74 65  .    i += sqlite
30200 33 46 74 73 35 47 65 74 56 61 72 69 6e 74 28 26  3Fts5GetVarint(&
30210 70 44 61 74 61 5b 69 5d 2c 20 26 69 56 61 6c 29  pData[i], &iVal)
30220 3b 0a 20 20 20 20 69 52 6f 77 69 64 20 2b 3d 20  ;.    iRowid += 
30230 69 56 61 6c 3b 0a 0a 20 20 20 20 69 66 28 20 69  iVal;..    if( i
30240 3c 6e 44 61 74 61 20 26 26 20 70 44 61 74 61 5b  <nData && pData[
30250 69 5d 3d 3d 30 78 30 30 20 29 7b 0a 20 20 20 20  i]==0x00 ){.    
30260 20 20 69 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28    i++;.      if(
30270 20 69 3c 6e 44 61 74 61 20 26 26 20 70 44 61 74   i<nData && pDat
30280 61 5b 69 5d 3d 3d 30 78 30 30 20 29 7b 0a 20 20  a[i]==0x00 ){.  
30290 20 20 20 20 20 20 69 2b 2b 3b 0a 20 20 20 20 20        i++;.     
302a0 20 20 20 7a 41 70 70 20 3d 20 22 2b 22 3b 0a 20     zApp = "+";. 
302b0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
302c0 20 20 20 20 7a 41 70 70 20 3d 20 22 2a 22 3b 0a      zApp = "*";.
302d0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
302e0 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 42 75     sqlite3Fts5Bu
302f0 66 66 65 72 41 70 70 65 6e 64 50 72 69 6e 74 66  fferAppendPrintf
30300 28 70 52 63 2c 20 70 42 75 66 2c 20 22 20 25 6c  (pRc, pBuf, " %l
30310 6c 64 25 73 22 2c 20 69 52 6f 77 69 64 2c 20 7a  ld%s", iRowid, z
30320 41 70 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  App);.  }.}../*.
30330 2a 2a 20 54 68 65 20 69 6d 70 6c 65 6d 65 6e 74  ** The implement
30340 61 74 69 6f 6e 20 6f 66 20 75 73 65 72 2d 64 65  ation of user-de
30350 66 69 6e 65 64 20 73 63 61 6c 61 72 20 66 75 6e  fined scalar fun
30360 63 74 69 6f 6e 20 66 74 73 35 5f 64 65 63 6f 64  ction fts5_decod
30370 65 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  e()..*/.static v
30380 6f 69 64 20 66 74 73 35 44 65 63 6f 64 65 46 75  oid fts5DecodeFu
30390 6e 63 74 69 6f 6e 28 0a 20 20 73 71 6c 69 74 65  nction(.  sqlite
303a0 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74 78 2c  3_context *pCtx,
303b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 75 6e            /* Fun
303c0 63 74 69 6f 6e 20 63 61 6c 6c 20 63 6f 6e 74 65  ction call conte
303d0 78 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 41 72 67  xt */.  int nArg
303e0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
303f0 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
30400 72 20 6f 66 20 61 72 67 73 20 28 61 6c 77 61 79  r of args (alway
30410 73 20 32 29 20 2a 2f 0a 20 20 73 71 6c 69 74 65  s 2) */.  sqlite
30420 33 5f 76 61 6c 75 65 20 2a 2a 61 70 56 61 6c 20  3_value **apVal 
30430 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 75 6e            /* Fun
30440 63 74 69 6f 6e 20 61 72 67 75 6d 65 6e 74 73 20  ction arguments 
30450 2a 2f 0a 29 7b 0a 20 20 69 36 34 20 69 52 6f 77  */.){.  i64 iRow
30460 69 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  id;             
30470 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 77 69 64          /* Rowid
30480 20 66 6f 72 20 72 65 63 6f 72 64 20 62 65 69 6e   for record bein
30490 67 20 64 65 63 6f 64 65 64 20 2a 2f 0a 20 20 69  g decoded */.  i
304a0 6e 74 20 69 53 65 67 69 64 2c 69 48 65 69 67 68  nt iSegid,iHeigh
304b0 74 2c 69 50 67 6e 6f 2c 62 44 6c 69 64 78 3b 2f  t,iPgno,bDlidx;/
304c0 2a 20 52 6f 77 69 64 20 63 6f 6d 70 6f 6e 65 6e  * Rowid componen
304d0 74 73 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 75 38  ts */.  const u8
304e0 20 2a 61 42 6c 6f 62 3b 20 69 6e 74 20 6e 3b 20   *aBlob; int n; 
304f0 20 20 20 20 20 20 20 20 2f 2a 20 52 65 63 6f 72          /* Recor
30500 64 20 74 6f 20 64 65 63 6f 64 65 20 2a 2f 0a 20  d to decode */. 
30510 20 75 38 20 2a 61 20 3d 20 30 3b 0a 20 20 46 74   u8 *a = 0;.  Ft
30520 73 35 42 75 66 66 65 72 20 73 3b 20 20 20 20 20  s5Buffer s;     
30530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
30540 20 42 75 69 6c 64 20 75 70 20 74 65 78 74 20 74   Build up text t
30550 6f 20 72 65 74 75 72 6e 20 68 65 72 65 20 2a 2f  o return here */
30560 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
30570 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20  TE_OK;          
30580 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
30590 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69  e */.  sqlite3_i
305a0 6e 74 36 34 20 6e 53 70 61 63 65 20 3d 20 30 3b  nt64 nSpace = 0;
305b0 0a 20 20 69 6e 74 20 65 44 65 74 61 69 6c 4e 6f  .  int eDetailNo
305c0 6e 65 20 3d 20 28 73 71 6c 69 74 65 33 5f 75 73  ne = (sqlite3_us
305d0 65 72 5f 64 61 74 61 28 70 43 74 78 29 21 3d 30  er_data(pCtx)!=0
305e0 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 6e 41  );..  assert( nA
305f0 72 67 3d 3d 32 20 29 3b 0a 20 20 55 4e 55 53 45  rg==2 );.  UNUSE
30600 44 5f 50 41 52 41 4d 28 6e 41 72 67 29 3b 0a 20  D_PARAM(nArg);. 
30610 20 6d 65 6d 73 65 74 28 26 73 2c 20 30 2c 20 73   memset(&s, 0, s
30620 69 7a 65 6f 66 28 46 74 73 35 42 75 66 66 65 72  izeof(Fts5Buffer
30630 29 29 3b 0a 20 20 69 52 6f 77 69 64 20 3d 20 73  ));.  iRowid = s
30640 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74  qlite3_value_int
30650 36 34 28 61 70 56 61 6c 5b 30 5d 29 3b 0a 0a 20  64(apVal[0]);.. 
30660 20 2f 2a 20 4d 61 6b 65 20 61 20 63 6f 70 79 20   /* Make a copy 
30670 6f 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72  of the second ar
30680 67 75 6d 65 6e 74 20 28 61 20 62 6c 6f 62 29 20  gument (a blob) 
30690 69 6e 20 61 42 6c 6f 62 5b 5d 2e 20 54 68 65 20  in aBlob[]. The 
306a0 61 42 6c 6f 62 5b 5d 0a 20 20 2a 2a 20 63 6f 70  aBlob[].  ** cop
306b0 79 20 69 73 20 66 6f 6c 6c 6f 77 65 64 20 62 79  y is followed by
306c0 20 46 54 53 35 5f 44 41 54 41 5f 5a 45 52 4f 5f   FTS5_DATA_ZERO_
306d0 50 41 44 44 49 4e 47 20 30 78 30 30 20 62 79 74  PADDING 0x00 byt
306e0 65 73 2c 20 77 68 69 63 68 20 70 72 65 76 65 6e  es, which preven
306f0 74 73 0a 20 20 2a 2a 20 62 75 66 66 65 72 20 6f  ts.  ** buffer o
30700 76 65 72 72 65 61 64 73 20 65 76 65 6e 20 69 66  verreads even if
30710 20 74 68 65 20 72 65 63 6f 72 64 20 69 73 20 63   the record is c
30720 6f 72 72 75 70 74 2e 20 20 2a 2f 0a 20 20 6e 20  orrupt.  */.  n 
30730 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  = sqlite3_value_
30740 62 79 74 65 73 28 61 70 56 61 6c 5b 31 5d 29 3b  bytes(apVal[1]);
30750 0a 20 20 61 42 6c 6f 62 20 3d 20 73 71 6c 69 74  .  aBlob = sqlit
30760 65 33 5f 76 61 6c 75 65 5f 62 6c 6f 62 28 61 70  e3_value_blob(ap
30770 56 61 6c 5b 31 5d 29 3b 0a 20 20 6e 53 70 61 63  Val[1]);.  nSpac
30780 65 20 3d 20 6e 20 2b 20 46 54 53 35 5f 44 41 54  e = n + FTS5_DAT
30790 41 5f 5a 45 52 4f 5f 50 41 44 44 49 4e 47 3b 0a  A_ZERO_PADDING;.
307a0 20 20 61 20 3d 20 28 75 38 2a 29 73 71 6c 69 74    a = (u8*)sqlit
307b0 65 33 46 74 73 35 4d 61 6c 6c 6f 63 5a 65 72 6f  e3Fts5MallocZero
307c0 28 26 72 63 2c 20 6e 53 70 61 63 65 29 3b 0a 20  (&rc, nSpace);. 
307d0 20 69 66 28 20 61 3d 3d 30 20 29 20 67 6f 74 6f   if( a==0 ) goto
307e0 20 64 65 63 6f 64 65 5f 6f 75 74 3b 0a 20 20 69   decode_out;.  i
307f0 66 28 20 6e 3e 30 20 29 20 6d 65 6d 63 70 79 28  f( n>0 ) memcpy(
30800 61 2c 20 61 42 6c 6f 62 2c 20 6e 29 3b 0a 0a 20  a, aBlob, n);.. 
30810 20 66 74 73 35 44 65 63 6f 64 65 52 6f 77 69 64   fts5DecodeRowid
30820 28 69 52 6f 77 69 64 2c 20 26 69 53 65 67 69 64  (iRowid, &iSegid
30830 2c 20 26 62 44 6c 69 64 78 2c 20 26 69 48 65 69  , &bDlidx, &iHei
30840 67 68 74 2c 20 26 69 50 67 6e 6f 29 3b 0a 0a 20  ght, &iPgno);.. 
30850 20 66 74 73 35 44 65 62 75 67 52 6f 77 69 64 28   fts5DebugRowid(
30860 26 72 63 2c 20 26 73 2c 20 69 52 6f 77 69 64 29  &rc, &s, iRowid)
30870 3b 0a 20 20 69 66 28 20 62 44 6c 69 64 78 20 29  ;.  if( bDlidx )
30880 7b 0a 20 20 20 20 46 74 73 35 44 61 74 61 20 64  {.    Fts5Data d
30890 6c 69 64 78 3b 0a 20 20 20 20 46 74 73 35 44 6c  lidx;.    Fts5Dl
308a0 69 64 78 4c 76 6c 20 6c 76 6c 3b 0a 0a 20 20 20  idxLvl lvl;..   
308b0 20 64 6c 69 64 78 2e 70 20 3d 20 61 3b 0a 20 20   dlidx.p = a;.  
308c0 20 20 64 6c 69 64 78 2e 6e 6e 20 3d 20 6e 3b 0a    dlidx.nn = n;.
308d0 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 6c 76 6c  .    memset(&lvl
308e0 2c 20 30 2c 20 73 69 7a 65 6f 66 28 46 74 73 35  , 0, sizeof(Fts5
308f0 44 6c 69 64 78 4c 76 6c 29 29 3b 0a 20 20 20 20  DlidxLvl));.    
30900 6c 76 6c 2e 70 44 61 74 61 20 3d 20 26 64 6c 69  lvl.pData = &dli
30910 64 78 3b 0a 20 20 20 20 6c 76 6c 2e 69 4c 65 61  dx;.    lvl.iLea
30920 66 50 67 6e 6f 20 3d 20 69 50 67 6e 6f 3b 0a 0a  fPgno = iPgno;..
30930 20 20 20 20 66 6f 72 28 66 74 73 35 44 6c 69 64      for(fts5Dlid
30940 78 4c 76 6c 4e 65 78 74 28 26 6c 76 6c 29 3b 20  xLvlNext(&lvl); 
30950 6c 76 6c 2e 62 45 6f 66 3d 3d 30 3b 20 66 74 73  lvl.bEof==0; fts
30960 35 44 6c 69 64 78 4c 76 6c 4e 65 78 74 28 26 6c  5DlidxLvlNext(&l
30970 76 6c 29 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  vl)){.      sqli
30980 74 65 33 46 74 73 35 42 75 66 66 65 72 41 70 70  te3Fts5BufferApp
30990 65 6e 64 50 72 69 6e 74 66 28 26 72 63 2c 20 26  endPrintf(&rc, &
309a0 73 2c 20 0a 20 20 20 20 20 20 20 20 20 20 22 20  s, .          " 
309b0 25 64 28 25 6c 6c 64 29 22 2c 20 6c 76 6c 2e 69  %d(%lld)", lvl.i
309c0 4c 65 61 66 50 67 6e 6f 2c 20 6c 76 6c 2e 69 52  LeafPgno, lvl.iR
309d0 6f 77 69 64 0a 20 20 20 20 20 20 29 3b 0a 20 20  owid.      );.  
309e0 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20    }.  }else if( 
309f0 69 53 65 67 69 64 3d 3d 30 20 29 7b 0a 20 20 20  iSegid==0 ){.   
30a00 20 69 66 28 20 69 52 6f 77 69 64 3d 3d 46 54 53   if( iRowid==FTS
30a10 35 5f 41 56 45 52 41 47 45 53 5f 52 4f 57 49 44  5_AVERAGES_ROWID
30a20 20 29 7b 0a 20 20 20 20 20 20 66 74 73 35 44 65   ){.      fts5De
30a30 63 6f 64 65 41 76 65 72 61 67 65 73 28 26 72 63  codeAverages(&rc
30a40 2c 20 26 73 2c 20 61 2c 20 6e 29 3b 0a 20 20 20  , &s, a, n);.   
30a50 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 66 74   }else{.      ft
30a60 73 35 44 65 63 6f 64 65 53 74 72 75 63 74 75 72  s5DecodeStructur
30a70 65 28 26 72 63 2c 20 26 73 2c 20 61 2c 20 6e 29  e(&rc, &s, a, n)
30a80 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20  ;.    }.  }else 
30a90 69 66 28 20 65 44 65 74 61 69 6c 4e 6f 6e 65 20  if( eDetailNone 
30aa0 29 7b 0a 20 20 20 20 46 74 73 35 42 75 66 66 65  ){.    Fts5Buffe
30ab0 72 20 74 65 72 6d 3b 20 20 20 20 20 20 20 20 20  r term;         
30ac0 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20       /* Current 
30ad0 74 65 72 6d 20 72 65 61 64 20 66 72 6f 6d 20 70  term read from p
30ae0 61 67 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 73  age */.    int s
30af0 7a 4c 65 61 66 3b 0a 20 20 20 20 69 6e 74 20 69  zLeaf;.    int i
30b00 50 67 69 64 78 4f 66 66 20 3d 20 73 7a 4c 65 61  PgidxOff = szLea
30b10 66 20 3d 20 66 74 73 35 47 65 74 55 31 36 28 26  f = fts5GetU16(&
30b20 61 5b 32 5d 29 3b 0a 20 20 20 20 69 6e 74 20 69  a[2]);.    int i
30b30 54 65 72 6d 4f 66 66 3b 0a 20 20 20 20 69 6e 74  TermOff;.    int
30b40 20 6e 4b 65 65 70 20 3d 20 30 3b 0a 20 20 20 20   nKeep = 0;.    
30b50 69 6e 74 20 69 4f 66 66 3b 0a 0a 20 20 20 20 6d  int iOff;..    m
30b60 65 6d 73 65 74 28 26 74 65 72 6d 2c 20 30 2c 20  emset(&term, 0, 
30b70 73 69 7a 65 6f 66 28 46 74 73 35 42 75 66 66 65  sizeof(Fts5Buffe
30b80 72 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 44 65 63  r));..    /* Dec
30b90 6f 64 65 20 61 6e 79 20 65 6e 74 72 69 65 73 20  ode any entries 
30ba0 74 68 61 74 20 6f 63 63 75 72 20 62 65 66 6f 72  that occur befor
30bb0 65 20 74 68 65 20 66 69 72 73 74 20 74 65 72 6d  e the first term
30bc0 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 7a 4c  . */.    if( szL
30bd0 65 61 66 3c 6e 20 29 7b 0a 20 20 20 20 20 20 69  eaf<n ){.      i
30be0 50 67 69 64 78 4f 66 66 20 2b 3d 20 66 74 73 35  PgidxOff += fts5
30bf0 47 65 74 56 61 72 69 6e 74 33 32 28 26 61 5b 69  GetVarint32(&a[i
30c00 50 67 69 64 78 4f 66 66 5d 2c 20 69 54 65 72 6d  PgidxOff], iTerm
30c10 4f 66 66 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  Off);.    }else{
30c20 0a 20 20 20 20 20 20 69 54 65 72 6d 4f 66 66 20  .      iTermOff 
30c30 3d 20 73 7a 4c 65 61 66 3b 0a 20 20 20 20 7d 0a  = szLeaf;.    }.
30c40 20 20 20 20 66 74 73 35 44 65 63 6f 64 65 52 6f      fts5DecodeRo
30c50 77 69 64 4c 69 73 74 28 26 72 63 2c 20 26 73 2c  widList(&rc, &s,
30c60 20 26 61 5b 34 5d 2c 20 69 54 65 72 6d 4f 66 66   &a[4], iTermOff
30c70 2d 34 29 3b 0a 0a 20 20 20 20 69 4f 66 66 20 3d  -4);..    iOff =
30c80 20 69 54 65 72 6d 4f 66 66 3b 0a 20 20 20 20 77   iTermOff;.    w
30c90 68 69 6c 65 28 20 69 4f 66 66 3c 73 7a 4c 65 61  hile( iOff<szLea
30ca0 66 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e  f ){.      int n
30cb0 41 70 70 65 6e 64 3b 0a 0a 20 20 20 20 20 20 2f  Append;..      /
30cc0 2a 20 52 65 61 64 20 74 68 65 20 74 65 72 6d 20  * Read the term 
30cd0 64 61 74 61 20 66 6f 72 20 74 68 65 20 6e 65 78  data for the nex
30ce0 74 20 74 65 72 6d 2a 2f 0a 20 20 20 20 20 20 69  t term*/.      i
30cf0 4f 66 66 20 2b 3d 20 66 74 73 35 47 65 74 56 61  Off += fts5GetVa
30d00 72 69 6e 74 33 32 28 26 61 5b 69 4f 66 66 5d 2c  rint32(&a[iOff],
30d10 20 6e 41 70 70 65 6e 64 29 3b 0a 20 20 20 20 20   nAppend);.     
30d20 20 74 65 72 6d 2e 6e 20 3d 20 6e 4b 65 65 70 3b   term.n = nKeep;
30d30 0a 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65  .      fts5Buffe
30d40 72 41 70 70 65 6e 64 42 6c 6f 62 28 26 72 63 2c  rAppendBlob(&rc,
30d50 20 26 74 65 72 6d 2c 20 6e 41 70 70 65 6e 64 2c   &term, nAppend,
30d60 20 26 61 5b 69 4f 66 66 5d 29 3b 0a 20 20 20 20   &a[iOff]);.    
30d70 20 20 73 71 6c 69 74 65 33 46 74 73 35 42 75 66    sqlite3Fts5Buf
30d80 66 65 72 41 70 70 65 6e 64 50 72 69 6e 74 66 28  ferAppendPrintf(
30d90 0a 20 20 20 20 20 20 20 20 20 20 26 72 63 2c 20  .          &rc, 
30da0 26 73 2c 20 22 20 74 65 72 6d 3d 25 2e 2a 73 22  &s, " term=%.*s"
30db0 2c 20 74 65 72 6d 2e 6e 2c 20 28 63 6f 6e 73 74  , term.n, (const
30dc0 20 63 68 61 72 2a 29 74 65 72 6d 2e 70 0a 20 20   char*)term.p.  
30dd0 20 20 20 20 29 3b 0a 20 20 20 20 20 20 69 4f 66      );.      iOf
30de0 66 20 2b 3d 20 6e 41 70 70 65 6e 64 3b 0a 0a 20  f += nAppend;.. 
30df0 20 20 20 20 20 2f 2a 20 46 69 67 75 72 65 20 6f       /* Figure o
30e00 75 74 20 77 68 65 72 65 20 74 68 65 20 64 6f 63  ut where the doc
30e10 6c 69 73 74 20 66 6f 72 20 74 68 69 73 20 74 65  list for this te
30e20 72 6d 20 65 6e 64 73 20 2a 2f 0a 20 20 20 20 20  rm ends */.     
30e30 20 69 66 28 20 69 50 67 69 64 78 4f 66 66 3c 6e   if( iPgidxOff<n
30e40 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20   ){.        int 
30e50 6e 49 6e 63 72 3b 0a 20 20 20 20 20 20 20 20 69  nIncr;.        i
30e60 50 67 69 64 78 4f 66 66 20 2b 3d 20 66 74 73 35  PgidxOff += fts5
30e70 47 65 74 56 61 72 69 6e 74 33 32 28 26 61 5b 69  GetVarint32(&a[i
30e80 50 67 69 64 78 4f 66 66 5d 2c 20 6e 49 6e 63 72  PgidxOff], nIncr
30e90 29 3b 0a 20 20 20 20 20 20 20 20 69 54 65 72 6d  );.        iTerm
30ea0 4f 66 66 20 2b 3d 20 6e 49 6e 63 72 3b 0a 20 20  Off += nIncr;.  
30eb0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
30ec0 20 20 20 69 54 65 72 6d 4f 66 66 20 3d 20 73 7a     iTermOff = sz
30ed0 4c 65 61 66 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  Leaf;.      }.. 
30ee0 20 20 20 20 20 66 74 73 35 44 65 63 6f 64 65 52       fts5DecodeR
30ef0 6f 77 69 64 4c 69 73 74 28 26 72 63 2c 20 26 73  owidList(&rc, &s
30f00 2c 20 26 61 5b 69 4f 66 66 5d 2c 20 69 54 65 72  , &a[iOff], iTer
30f10 6d 4f 66 66 2d 69 4f 66 66 29 3b 0a 20 20 20 20  mOff-iOff);.    
30f20 20 20 69 4f 66 66 20 3d 20 69 54 65 72 6d 4f 66    iOff = iTermOf
30f30 66 3b 0a 20 20 20 20 20 20 69 66 28 20 69 4f 66  f;.      if( iOf
30f40 66 3c 73 7a 4c 65 61 66 20 29 7b 0a 20 20 20 20  f<szLeaf ){.    
30f50 20 20 20 20 69 4f 66 66 20 2b 3d 20 66 74 73 35      iOff += fts5
30f60 47 65 74 56 61 72 69 6e 74 33 32 28 26 61 5b 69  GetVarint32(&a[i
30f70 4f 66 66 5d 2c 20 6e 4b 65 65 70 29 3b 0a 20 20  Off], nKeep);.  
30f80 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
30f90 20 66 74 73 35 42 75 66 66 65 72 46 72 65 65 28   fts5BufferFree(
30fa0 26 74 65 72 6d 29 3b 0a 20 20 7d 65 6c 73 65 7b  &term);.  }else{
30fb0 0a 20 20 20 20 46 74 73 35 42 75 66 66 65 72 20  .    Fts5Buffer 
30fc0 74 65 72 6d 3b 20 20 20 20 20 20 20 20 20 20 20  term;           
30fd0 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 74 65     /* Current te
30fe0 72 6d 20 72 65 61 64 20 66 72 6f 6d 20 70 61 67  rm read from pag
30ff0 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 73 7a 4c  e */.    int szL
31000 65 61 66 3b 20 20 20 20 20 20 20 20 20 20 20 20  eaf;            
31010 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74         /* Offset
31020 20 6f 66 20 70 67 69 64 78 20 69 6e 20 61 5b 5d   of pgidx in a[]
31030 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 50 67 69   */.    int iPgi
31040 64 78 4f 66 66 3b 0a 20 20 20 20 69 6e 74 20 69  dxOff;.    int i
31050 50 67 69 64 78 50 72 65 76 20 3d 20 30 3b 20 20  PgidxPrev = 0;  
31060 20 20 20 20 20 20 20 20 20 2f 2a 20 50 72 65 76           /* Prev
31070 69 6f 75 73 20 76 61 6c 75 65 20 72 65 61 64 20  ious value read 
31080 66 72 6f 6d 20 70 67 69 64 78 20 2a 2f 0a 20 20  from pgidx */.  
31090 20 20 69 6e 74 20 69 54 65 72 6d 4f 66 66 20 3d    int iTermOff =
310a0 20 30 3b 0a 20 20 20 20 69 6e 74 20 69 52 6f 77   0;.    int iRow
310b0 69 64 4f 66 66 20 3d 20 30 3b 0a 20 20 20 20 69  idOff = 0;.    i
310c0 6e 74 20 69 4f 66 66 3b 0a 20 20 20 20 69 6e 74  nt iOff;.    int
310d0 20 6e 44 6f 63 6c 69 73 74 3b 0a 0a 20 20 20 20   nDoclist;..    
310e0 6d 65 6d 73 65 74 28 26 74 65 72 6d 2c 20 30 2c  memset(&term, 0,
310f0 20 73 69 7a 65 6f 66 28 46 74 73 35 42 75 66 66   sizeof(Fts5Buff
31100 65 72 29 29 3b 0a 0a 20 20 20 20 69 66 28 20 6e  er));..    if( n
31110 3c 34 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  <4 ){.      sqli
31120 74 65 33 46 74 73 35 42 75 66 66 65 72 53 65 74  te3Fts5BufferSet
31130 28 26 72 63 2c 20 26 73 2c 20 37 2c 20 28 63 6f  (&rc, &s, 7, (co
31140 6e 73 74 20 75 38 2a 29 22 63 6f 72 72 75 70 74  nst u8*)"corrupt
31150 22 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 64  ");.      goto d
31160 65 63 6f 64 65 5f 6f 75 74 3b 0a 20 20 20 20 7d  ecode_out;.    }
31170 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 52 6f 77  else{.      iRow
31180 69 64 4f 66 66 20 3d 20 66 74 73 35 47 65 74 55  idOff = fts5GetU
31190 31 36 28 26 61 5b 30 5d 29 3b 0a 20 20 20 20 20  16(&a[0]);.     
311a0 20 69 50 67 69 64 78 4f 66 66 20 3d 20 73 7a 4c   iPgidxOff = szL
311b0 65 61 66 20 3d 20 66 74 73 35 47 65 74 55 31 36  eaf = fts5GetU16
311c0 28 26 61 5b 32 5d 29 3b 0a 20 20 20 20 20 20 69  (&a[2]);.      i
311d0 66 28 20 69 50 67 69 64 78 4f 66 66 3c 6e 20 29  f( iPgidxOff<n )
311e0 7b 0a 20 20 20 20 20 20 20 20 66 74 73 35 47 65  {.        fts5Ge
311f0 74 56 61 72 69 6e 74 33 32 28 26 61 5b 69 50 67  tVarint32(&a[iPg
31200 69 64 78 4f 66 66 5d 2c 20 69 54 65 72 6d 4f 66  idxOff], iTermOf
31210 66 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  f);.      }else 
31220 69 66 28 20 69 50 67 69 64 78 4f 66 66 3e 6e 20  if( iPgidxOff>n 
31230 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
31240 46 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20  FTS5_CORRUPT;.  
31250 20 20 20 20 20 20 67 6f 74 6f 20 64 65 63 6f 64        goto decod
31260 65 5f 6f 75 74 3b 0a 20 20 20 20 20 20 7d 0a 20  e_out;.      }. 
31270 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 65 63     }..    /* Dec
31280 6f 64 65 20 74 68 65 20 70 6f 73 69 74 69 6f 6e  ode the position
31290 20 6c 69 73 74 20 74 61 69 6c 20 61 74 20 74 68   list tail at th
312a0 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 70  e start of the p
312b0 61 67 65 20 2a 2f 0a 20 20 20 20 69 66 28 20 69  age */.    if( i
312c0 52 6f 77 69 64 4f 66 66 21 3d 30 20 29 7b 0a 20  RowidOff!=0 ){. 
312d0 20 20 20 20 20 69 4f 66 66 20 3d 20 69 52 6f 77       iOff = iRow
312e0 69 64 4f 66 66 3b 0a 20 20 20 20 7d 65 6c 73 65  idOff;.    }else
312f0 20 69 66 28 20 69 54 65 72 6d 4f 66 66 21 3d 30   if( iTermOff!=0
31300 20 29 7b 0a 20 20 20 20 20 20 69 4f 66 66 20 3d   ){.      iOff =
31310 20 69 54 65 72 6d 4f 66 66 3b 0a 20 20 20 20 7d   iTermOff;.    }
31320 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 4f 66 66  else{.      iOff
31330 20 3d 20 73 7a 4c 65 61 66 3b 0a 20 20 20 20 7d   = szLeaf;.    }
31340 0a 20 20 20 20 69 66 28 20 69 4f 66 66 3e 6e 20  .    if( iOff>n 
31350 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 46 54  ){.      rc = FT
31360 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20 20  S5_CORRUPT;.    
31370 20 20 67 6f 74 6f 20 64 65 63 6f 64 65 5f 6f 75    goto decode_ou
31380 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 74 73  t;.    }.    fts
31390 35 44 65 63 6f 64 65 50 6f 73 6c 69 73 74 28 26  5DecodePoslist(&
313a0 72 63 2c 20 26 73 2c 20 26 61 5b 34 5d 2c 20 69  rc, &s, &a[4], i
313b0 4f 66 66 2d 34 29 3b 0a 0a 20 20 20 20 2f 2a 20  Off-4);..    /* 
313c0 44 65 63 6f 64 65 20 61 6e 79 20 6d 6f 72 65 20  Decode any more 
313d0 64 6f 63 6c 69 73 74 20 64 61 74 61 20 74 68 61  doclist data tha
313e0 74 20 61 70 70 65 61 72 73 20 6f 6e 20 74 68 65  t appears on the
313f0 20 70 61 67 65 20 62 65 66 6f 72 65 20 74 68 65   page before the
31400 0a 20 20 20 20 2a 2a 20 66 69 72 73 74 20 74 65  .    ** first te
31410 72 6d 2e 20 2a 2f 0a 20 20 20 20 6e 44 6f 63 6c  rm. */.    nDocl
31420 69 73 74 20 3d 20 28 69 54 65 72 6d 4f 66 66 20  ist = (iTermOff 
31430 3f 20 69 54 65 72 6d 4f 66 66 20 3a 20 73 7a 4c  ? iTermOff : szL
31440 65 61 66 29 20 2d 20 69 4f 66 66 3b 0a 20 20 20  eaf) - iOff;.   
31450 20 69 66 28 20 6e 44 6f 63 6c 69 73 74 2b 69 4f   if( nDoclist+iO
31460 66 66 3e 6e 20 29 7b 0a 20 20 20 20 20 20 72 63  ff>n ){.      rc
31470 20 3d 20 46 54 53 35 5f 43 4f 52 52 55 50 54 3b   = FTS5_CORRUPT;
31480 0a 20 20 20 20 20 20 67 6f 74 6f 20 64 65 63 6f  .      goto deco
31490 64 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20  de_out;.    }.  
314a0 20 20 66 74 73 35 44 65 63 6f 64 65 44 6f 63 6c    fts5DecodeDocl
314b0 69 73 74 28 26 72 63 2c 20 26 73 2c 20 26 61 5b  ist(&rc, &s, &a[
314c0 69 4f 66 66 5d 2c 20 6e 44 6f 63 6c 69 73 74 29  iOff], nDoclist)
314d0 3b 0a 0a 20 20 20 20 77 68 69 6c 65 28 20 69 50  ;..    while( iP
314e0 67 69 64 78 4f 66 66 3c 6e 20 26 26 20 72 63 3d  gidxOff<n && rc=
314f0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
31500 20 20 20 20 69 6e 74 20 62 46 69 72 73 74 20 3d      int bFirst =
31510 20 28 69 50 67 69 64 78 4f 66 66 3d 3d 73 7a 4c   (iPgidxOff==szL
31520 65 61 66 29 3b 20 20 20 20 20 2f 2a 20 54 72 75  eaf);     /* Tru
31530 65 20 66 6f 72 20 66 69 72 73 74 20 74 65 72 6d  e for first term
31540 20 6f 6e 20 70 61 67 65 20 2a 2f 0a 20 20 20 20   on page */.    
31550 20 20 69 6e 74 20 6e 42 79 74 65 3b 20 20 20 20    int nByte;    
31560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31570 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73          /* Bytes
31580 20 6f 66 20 64 61 74 61 20 2a 2f 0a 20 20 20 20   of data */.    
31590 20 20 69 6e 74 20 69 45 6e 64 3b 0a 20 20 20 20    int iEnd;.    
315a0 20 20 0a 20 20 20 20 20 20 69 50 67 69 64 78 4f    .      iPgidxO
315b0 66 66 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72  ff += fts5GetVar
315c0 69 6e 74 33 32 28 26 61 5b 69 50 67 69 64 78 4f  int32(&a[iPgidxO
315d0 66 66 5d 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20  ff], nByte);.   
315e0 20 20 20 69 50 67 69 64 78 50 72 65 76 20 2b 3d     iPgidxPrev +=
315f0 20 6e 42 79 74 65 3b 0a 20 20 20 20 20 20 69 4f   nByte;.      iO
31600 66 66 20 3d 20 69 50 67 69 64 78 50 72 65 76 3b  ff = iPgidxPrev;
31610 0a 0a 20 20 20 20 20 20 69 66 28 20 69 50 67 69  ..      if( iPgi
31620 64 78 4f 66 66 3c 6e 20 29 7b 0a 20 20 20 20 20  dxOff<n ){.     
31630 20 20 20 66 74 73 35 47 65 74 56 61 72 69 6e 74     fts5GetVarint
31640 33 32 28 26 61 5b 69 50 67 69 64 78 4f 66 66 5d  32(&a[iPgidxOff]
31650 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20 20 20 20  , nByte);.      
31660 20 20 69 45 6e 64 20 3d 20 69 50 67 69 64 78 50    iEnd = iPgidxP
31670 72 65 76 20 2b 20 6e 42 79 74 65 3b 0a 20 20 20  rev + nByte;.   
31680 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
31690 20 20 69 45 6e 64 20 3d 20 73 7a 4c 65 61 66 3b    iEnd = szLeaf;
316a0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
316b0 66 28 20 69 45 6e 64 3e 73 7a 4c 65 61 66 20 29  f( iEnd>szLeaf )
316c0 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 46  {.        rc = F
316d0 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20  TS5_CORRUPT;.   
316e0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
316f0 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 62    }..      if( b
31700 46 69 72 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20  First==0 ){.    
31710 20 20 20 20 69 4f 66 66 20 2b 3d 20 66 74 73 35      iOff += fts5
31720 47 65 74 56 61 72 69 6e 74 33 32 28 26 61 5b 69  GetVarint32(&a[i
31730 4f 66 66 5d 2c 20 6e 42 79 74 65 29 3b 0a 20 20  Off], nByte);.  
31740 20 20 20 20 20 20 69 66 28 20 6e 42 79 74 65 3e        if( nByte>
31750 74 65 72 6d 2e 6e 20 29 7b 0a 20 20 20 20 20 20  term.n ){.      
31760 20 20 20 20 72 63 20 3d 20 46 54 53 35 5f 43 4f      rc = FTS5_CO
31770 52 52 55 50 54 3b 0a 20 20 20 20 20 20 20 20 20  RRUPT;.         
31780 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
31790 7d 0a 20 20 20 20 20 20 20 20 74 65 72 6d 2e 6e  }.        term.n
317a0 20 3d 20 6e 42 79 74 65 3b 0a 20 20 20 20 20 20   = nByte;.      
317b0 7d 0a 20 20 20 20 20 20 69 4f 66 66 20 2b 3d 20  }.      iOff += 
317c0 66 74 73 35 47 65 74 56 61 72 69 6e 74 33 32 28  fts5GetVarint32(
317d0 26 61 5b 69 4f 66 66 5d 2c 20 6e 42 79 74 65 29  &a[iOff], nByte)
317e0 3b 0a 20 20 20 20 20 20 69 66 28 20 69 4f 66 66  ;.      if( iOff
317f0 2b 6e 42 79 74 65 3e 6e 20 29 7b 0a 20 20 20 20  +nByte>n ){.    
31800 20 20 20 20 72 63 20 3d 20 46 54 53 35 5f 43 4f      rc = FTS5_CO
31810 52 52 55 50 54 3b 0a 20 20 20 20 20 20 20 20 62  RRUPT;.        b
31820 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
31830 20 20 20 20 66 74 73 35 42 75 66 66 65 72 41 70      fts5BufferAp
31840 70 65 6e 64 42 6c 6f 62 28 26 72 63 2c 20 26 74  pendBlob(&rc, &t
31850 65 72 6d 2c 20 6e 42 79 74 65 2c 20 26 61 5b 69  erm, nByte, &a[i
31860 4f 66 66 5d 29 3b 0a 20 20 20 20 20 20 69 4f 66  Off]);.      iOf
31870 66 20 2b 3d 20 6e 42 79 74 65 3b 0a 0a 20 20 20  f += nByte;..   
31880 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 42 75     sqlite3Fts5Bu
31890 66 66 65 72 41 70 70 65 6e 64 50 72 69 6e 74 66  fferAppendPrintf
318a0 28 0a 20 20 20 20 20 20 20 20 20 20 26 72 63 2c  (.          &rc,
318b0 20 26 73 2c 20 22 20 74 65 72 6d 3d 25 2e 2a 73   &s, " term=%.*s
318c0 22 2c 20 74 65 72 6d 2e 6e 2c 20 28 63 6f 6e 73  ", term.n, (cons
318d0 74 20 63 68 61 72 2a 29 74 65 72 6d 2e 70 0a 20  t char*)term.p. 
318e0 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 69 4f       );.      iO
318f0 66 66 20 2b 3d 20 66 74 73 35 44 65 63 6f 64 65  ff += fts5Decode
31900 44 6f 63 6c 69 73 74 28 26 72 63 2c 20 26 73 2c  Doclist(&rc, &s,
31910 20 26 61 5b 69 4f 66 66 5d 2c 20 69 45 6e 64 2d   &a[iOff], iEnd-
31920 69 4f 66 66 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  iOff);.    }..  
31930 20 20 66 74 73 35 42 75 66 66 65 72 46 72 65 65    fts5BufferFree
31940 28 26 74 65 72 6d 29 3b 0a 20 20 7d 0a 20 20 0a  (&term);.  }.  .
31950 20 64 65 63 6f 64 65 5f 6f 75 74 3a 0a 20 20 73   decode_out:.  s
31960 71 6c 69 74 65 33 5f 66 72 65 65 28 61 29 3b 0a  qlite3_free(a);.
31970 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
31980 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  _OK ){.    sqlit
31990 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 28 70  e3_result_text(p
319a0 43 74 78 2c 20 28 63 6f 6e 73 74 20 63 68 61 72  Ctx, (const char
319b0 2a 29 73 2e 70 2c 20 73 2e 6e 2c 20 53 51 4c 49  *)s.p, s.n, SQLI
319c0 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20  TE_TRANSIENT);. 
319d0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69   }else{.    sqli
319e0 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72  te3_result_error
319f0 5f 63 6f 64 65 28 70 43 74 78 2c 20 72 63 29 3b  _code(pCtx, rc);
31a00 0a 20 20 7d 0a 20 20 66 74 73 35 42 75 66 66 65  .  }.  fts5Buffe
31a10 72 46 72 65 65 28 26 73 29 3b 0a 7d 0a 0a 2f 2a  rFree(&s);.}../*
31a20 0a 2a 2a 20 54 68 65 20 69 6d 70 6c 65 6d 65 6e  .** The implemen
31a30 74 61 74 69 6f 6e 20 6f 66 20 75 73 65 72 2d 64  tation of user-d
31a40 65 66 69 6e 65 64 20 73 63 61 6c 61 72 20 66 75  efined scalar fu
31a50 6e 63 74 69 6f 6e 20 66 74 73 35 5f 72 6f 77 69  nction fts5_rowi
31a60 64 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  d()..*/.static v
31a70 6f 69 64 20 66 74 73 35 52 6f 77 69 64 46 75 6e  oid fts5RowidFun
31a80 63 74 69 6f 6e 28 0a 20 20 73 71 6c 69 74 65 33  ction(.  sqlite3
31a90 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74 78 2c 20  _context *pCtx, 
31aa0 20 20 20 20 20 20 20 20 20 2f 2a 20 46 75 6e 63           /* Func
31ab0 74 69 6f 6e 20 63 61 6c 6c 20 63 6f 6e 74 65 78  tion call contex
31ac0 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 41 72 67 2c  t */.  int nArg,
31ad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31ae0 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
31af0 20 6f 66 20 61 72 67 73 20 28 61 6c 77 61 79 73   of args (always
31b00 20 32 29 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33   2) */.  sqlite3
31b10 5f 76 61 6c 75 65 20 2a 2a 61 70 56 61 6c 20 20  _value **apVal  
31b20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 75 6e 63           /* Func
31b30 74 69 6f 6e 20 61 72 67 75 6d 65 6e 74 73 20 2a  tion arguments *
31b40 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61  /.){.  const cha
31b50 72 20 2a 7a 41 72 67 3b 0a 20 20 69 66 28 20 6e  r *zArg;.  if( n
31b60 41 72 67 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71  Arg==0 ){.    sq
31b70 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72  lite3_result_err
31b80 6f 72 28 70 43 74 78 2c 20 22 73 68 6f 75 6c 64  or(pCtx, "should
31b90 20 62 65 3a 20 66 74 73 35 5f 72 6f 77 69 64 28   be: fts5_rowid(
31ba0 73 75 62 6a 65 63 74 2c 20 2e 2e 2e 2e 29 22 2c  subject, ....)",
31bb0 20 2d 31 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   -1);.  }else{. 
31bc0 20 20 20 7a 41 72 67 20 3d 20 28 63 6f 6e 73 74     zArg = (const
31bd0 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76   char*)sqlite3_v
31be0 61 6c 75 65 5f 74 65 78 74 28 61 70 56 61 6c 5b  alue_text(apVal[
31bf0 30 5d 29 3b 0a 20 20 20 20 69 66 28 20 30 3d 3d  0]);.    if( 0==
31c00 73 71 6c 69 74 65 33 5f 73 74 72 69 63 6d 70 28  sqlite3_stricmp(
31c10 7a 41 72 67 2c 20 22 73 65 67 6d 65 6e 74 22 29  zArg, "segment")
31c20 20 29 7b 0a 20 20 20 20 20 20 69 36 34 20 69 52   ){.      i64 iR
31c30 6f 77 69 64 3b 0a 20 20 20 20 20 20 69 6e 74 20  owid;.      int 
31c40 73 65 67 69 64 2c 20 70 67 6e 6f 3b 0a 20 20 20  segid, pgno;.   
31c50 20 20 20 69 66 28 20 6e 41 72 67 21 3d 33 20 29     if( nArg!=3 )
31c60 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
31c70 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 28 70  3_result_error(p
31c80 43 74 78 2c 20 0a 20 20 20 20 20 20 20 20 20 20  Ctx, .          
31c90 20 20 22 73 68 6f 75 6c 64 20 62 65 3a 20 66 74    "should be: ft
31ca0 73 35 5f 72 6f 77 69 64 28 27 73 65 67 6d 65 6e  s5_rowid('segmen
31cb0 74 27 2c 20 73 65 67 69 64 2c 20 70 67 6e 6f 29  t', segid, pgno)
31cc0 29 22 2c 20 2d 31 0a 20 20 20 20 20 20 20 20 29  )", -1.        )
31cd0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
31ce0 20 20 20 20 20 20 20 73 65 67 69 64 20 3d 20 73         segid = s
31cf0 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74  qlite3_value_int
31d00 28 61 70 56 61 6c 5b 31 5d 29 3b 0a 20 20 20 20  (apVal[1]);.    
31d10 20 20 20 20 70 67 6e 6f 20 3d 20 73 71 6c 69 74      pgno = sqlit
31d20 65 33 5f 76 61 6c 75 65 5f 69 6e 74 28 61 70 56  e3_value_int(apV
31d30 61 6c 5b 32 5d 29 3b 0a 20 20 20 20 20 20 20 20  al[2]);.        
31d40 69 52 6f 77 69 64 20 3d 20 46 54 53 35 5f 53 45  iRowid = FTS5_SE
31d50 47 4d 45 4e 54 5f 52 4f 57 49 44 28 73 65 67 69  GMENT_ROWID(segi
31d60 64 2c 20 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20  d, pgno);.      
31d70 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
31d80 5f 69 6e 74 36 34 28 70 43 74 78 2c 20 69 52 6f  _int64(pCtx, iRo
31d90 77 69 64 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  wid);.      }.  
31da0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73    }else{.      s
31db0 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72  qlite3_result_er
31dc0 72 6f 72 28 70 43 74 78 2c 20 0a 20 20 20 20 20  ror(pCtx, .     
31dd0 20 20 20 22 66 69 72 73 74 20 61 72 67 20 74 6f     "first arg to
31de0 20 66 74 73 35 5f 72 6f 77 69 64 28 29 20 6d 75   fts5_rowid() mu
31df0 73 74 20 62 65 20 27 73 65 67 6d 65 6e 74 27 22  st be 'segment'"
31e00 20 2c 20 2d 31 0a 20 20 20 20 20 20 29 3b 0a 20   , -1.      );. 
31e10 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
31e20 2a 20 54 68 69 73 20 69 73 20 63 61 6c 6c 65 64  * This is called
31e30 20 61 73 20 70 61 72 74 20 6f 66 20 72 65 67 69   as part of regi
31e40 73 74 65 72 69 6e 67 20 74 68 65 20 46 54 53 35  stering the FTS5
31e50 20 6d 6f 64 75 6c 65 20 77 69 74 68 20 64 61 74   module with dat
31e60 61 62 61 73 65 0a 2a 2a 20 63 6f 6e 6e 65 63 74  abase.** connect
31e70 69 6f 6e 20 64 62 2e 20 49 74 20 72 65 67 69 73  ion db. It regis
31e80 74 65 72 73 20 73 65 76 65 72 61 6c 20 75 73 65  ters several use
31e90 72 2d 64 65 66 69 6e 65 64 20 73 63 61 6c 61 72  r-defined scalar
31ea0 20 66 75 6e 63 74 69 6f 6e 73 20 75 73 65 66 75   functions usefu
31eb0 6c 0a 2a 2a 20 77 69 74 68 20 46 54 53 35 2e 0a  l.** with FTS5..
31ec0 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73  **.** If success
31ed0 66 75 6c 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69  ful, SQLITE_OK i
31ee0 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20 61  s returned. If a
31ef0 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  n error occurs, 
31f00 73 6f 6d 65 20 6f 74 68 65 72 0a 2a 2a 20 53 51  some other.** SQ
31f10 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20  Lite error code 
31f20 69 73 20 72 65 74 75 72 6e 65 64 20 69 6e 73 74  is returned inst
31f30 65 61 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ead..*/.int sqli
31f40 74 65 33 46 74 73 35 49 6e 64 65 78 49 6e 69 74  te3Fts5IndexInit
31f50 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20  (sqlite3 *db){. 
31f60 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65   int rc = sqlite
31f70 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f  3_create_functio
31f80 6e 28 0a 20 20 20 20 20 20 64 62 2c 20 22 66 74  n(.      db, "ft
31f90 73 35 5f 64 65 63 6f 64 65 22 2c 20 32 2c 20 53  s5_decode", 2, S
31fa0 51 4c 49 54 45 5f 55 54 46 38 2c 20 30 2c 20 66  QLITE_UTF8, 0, f
31fb0 74 73 35 44 65 63 6f 64 65 46 75 6e 63 74 69 6f  ts5DecodeFunctio
31fc0 6e 2c 20 30 2c 20 30 0a 20 20 29 3b 0a 0a 20 20  n, 0, 0.  );..  
31fd0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
31fe0 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  K ){.    rc = sq
31ff0 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e  lite3_create_fun
32000 63 74 69 6f 6e 28 0a 20 20 20 20 20 20 20 20 64  ction(.        d
32010 62 2c 20 22 66 74 73 35 5f 64 65 63 6f 64 65 5f  b, "fts5_decode_
32020 6e 6f 6e 65 22 2c 20 32 2c 20 0a 20 20 20 20 20  none", 2, .     
32030 20 20 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20     SQLITE_UTF8, 
32040 28 76 6f 69 64 2a 29 64 62 2c 20 66 74 73 35 44  (void*)db, fts5D
32050 65 63 6f 64 65 46 75 6e 63 74 69 6f 6e 2c 20 30  ecodeFunction, 0
32060 2c 20 30 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 0a  , 0.    );.  }..
32070 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
32080 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  _OK ){.    rc = 
32090 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66  sqlite3_create_f
320a0 75 6e 63 74 69 6f 6e 28 0a 20 20 20 20 20 20 20  unction(.       
320b0 20 64 62 2c 20 22 66 74 73 35 5f 72 6f 77 69 64   db, "fts5_rowid
320c0 22 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 55 54  ", -1, SQLITE_UT
320d0 46 38 2c 20 30 2c 20 66 74 73 35 52 6f 77 69 64  F8, 0, fts5Rowid
320e0 46 75 6e 63 74 69 6f 6e 2c 20 30 2c 20 30 0a 20  Function, 0, 0. 
320f0 20 20 20 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75     );.  }.  retu
32100 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 69 6e 74 20 73  rn rc;.}...int s
32110 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78 52  qlite3Fts5IndexR
32120 65 73 65 74 28 46 74 73 35 49 6e 64 65 78 20 2a  eset(Fts5Index *
32130 70 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 2d  p){.  assert( p-
32140 3e 70 53 74 72 75 63 74 3d 3d 30 20 7c 7c 20 70  >pStruct==0 || p
32150 2d 3e 69 53 74 72 75 63 74 56 65 72 73 69 6f 6e  ->iStructVersion
32160 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 66 74 73  !=0 );.  if( fts
32170 35 49 6e 64 65 78 44 61 74 61 56 65 72 73 69 6f  5IndexDataVersio
32180 6e 28 70 29 21 3d 70 2d 3e 69 53 74 72 75 63 74  n(p)!=p->iStruct
32190 56 65 72 73 69 6f 6e 20 29 7b 0a 20 20 20 20 66  Version ){.    f
321a0 74 73 35 53 74 72 75 63 74 75 72 65 49 6e 76 61  ts5StructureInva
321b0 6c 69 64 61 74 65 28 70 29 3b 0a 20 20 7d 0a 20  lidate(p);.  }. 
321c0 20 72 65 74 75 72 6e 20 66 74 73 35 49 6e 64 65   return fts5Inde
321d0 78 52 65 74 75 72 6e 28 70 29 3b 0a 7d 0a        xReturn(p);.}.