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

Artifact 11e2b566b8b29fb42bb970969c92f3a33c2c1125:


0000: 2f 2a 0a 2a 2a 20 32 30 31 34 20 4d 61 79 20 33  /*.** 2014 May 3
0010: 31 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74 68  1.**.** The auth
0020: 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f 70  or disclaims cop
0030: 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20 73  yright to this s
0040: 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e 20  ource code.  In 
0050: 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c 65  place of.** a le
0060: 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72 65  gal notice, here
0070: 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a 0a   is a blessing:.
0080: 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f 75  **.**    May you
0090: 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f 74   do good and not
00a0: 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61 79   evil..**    May
00b0: 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69 76   you find forgiv
00c0: 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73 65  eness for yourse
00d0: 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20 6f  lf and forgive o
00e0: 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61 79  thers..**    May
00f0: 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65 6c   you share freel
0100: 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67 20  y, never taking 
0110: 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67 69  more than you gi
0120: 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ve..**.*********
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 4c 6f 77 20  *****.**.** Low 
0180: 6c 65 76 65 6c 20 61 63 63 65 73 73 20 74 6f 20  level access to 
0190: 74 68 65 20 46 54 53 20 69 6e 64 65 78 20 73 74  the FTS index st
01a0: 6f 72 65 64 20 69 6e 20 74 68 65 20 64 61 74 61  ored in the data
01b0: 62 61 73 65 20 66 69 6c 65 2e 20 54 68 65 20 0a  base file. The .
01c0: 2a 2a 20 72 6f 75 74 69 6e 65 73 20 69 6e 20 74  ** routines in t
01d0: 68 69 73 20 66 69 6c 65 20 66 69 6c 65 20 69 6d  his file file im
01e0: 70 6c 65 6d 65 6e 74 20 61 6c 6c 20 72 65 61 64  plement all read
01f0: 20 61 6e 64 20 77 72 69 74 65 20 61 63 63 65 73   and write acces
0200: 73 20 74 6f 20 74 68 65 0a 2a 2a 20 25 5f 64 61  s to the.** %_da
0210: 74 61 20 74 61 62 6c 65 2e 20 4f 74 68 65 72 20  ta table. Other 
0220: 70 61 72 74 73 20 6f 66 20 74 68 65 20 73 79 73  parts of the sys
0230: 74 65 6d 20 61 63 63 65 73 73 20 74 68 69 73 20  tem access this 
0240: 66 75 6e 63 74 69 6f 6e 61 6c 69 74 79 20 76 69  functionality vi
0250: 61 0a 2a 2a 20 74 68 65 20 69 6e 74 65 72 66 61  a.** the interfa
0260: 63 65 20 64 65 66 69 6e 65 64 20 69 6e 20 66 74  ce defined in ft
0270: 73 35 49 6e 74 2e 68 2e 0a 2a 2f 0a 0a 0a 23 69  s5Int.h..*/...#i
0280: 6e 63 6c 75 64 65 20 22 66 74 73 35 49 6e 74 2e  nclude "fts5Int.
0290: 68 22 0a 0a 2f 2a 0a 2a 2a 20 4f 76 65 72 76 69  h"../*.** Overvi
02a0: 65 77 3a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 25 5f  ew:.**.** The %_
02b0: 64 61 74 61 20 74 61 62 6c 65 20 63 6f 6e 74 61  data table conta
02c0: 69 6e 73 20 61 6c 6c 20 74 68 65 20 46 54 53 20  ins all the FTS 
02d0: 69 6e 64 65 78 65 73 20 66 6f 72 20 61 6e 20 46  indexes for an F
02e0: 54 53 35 20 76 69 72 74 75 61 6c 20 74 61 62 6c  TS5 virtual tabl
02f0: 65 2e 0a 2a 2a 20 41 73 20 77 65 6c 6c 20 61 73  e..** As well as
0300: 20 74 68 65 20 6d 61 69 6e 20 74 65 72 6d 20 69   the main term i
0310: 6e 64 65 78 2c 20 74 68 65 72 65 20 6d 61 79 20  ndex, there may 
0320: 62 65 20 75 70 20 74 6f 20 33 31 20 70 72 65 66  be up to 31 pref
0330: 69 78 20 69 6e 64 65 78 65 73 2e 0a 2a 2a 20 54  ix indexes..** T
0340: 68 65 20 66 6f 72 6d 61 74 20 69 73 20 73 69 6d  he format is sim
0350: 69 6c 61 72 20 74 6f 20 46 54 53 33 2f 34 2c 20  ilar to FTS3/4, 
0360: 65 78 63 65 70 74 20 74 68 61 74 3a 0a 2a 2a 0a  except that:.**.
0370: 2a 2a 20 20 20 2a 20 61 6c 6c 20 73 65 67 6d 65  **   * all segme
0380: 6e 74 20 62 2d 74 72 65 65 20 6c 65 61 66 20 64  nt b-tree leaf d
0390: 61 74 61 20 69 73 20 73 74 6f 72 65 64 20 69 6e  ata is stored in
03a0: 20 66 69 78 65 64 20 73 69 7a 65 20 70 61 67 65   fixed size page
03b0: 20 72 65 63 6f 72 64 73 20 0a 2a 2a 20 20 20 20   records .**    
03c0: 20 28 65 2e 67 2e 20 31 30 30 30 20 62 79 74 65   (e.g. 1000 byte
03d0: 73 29 2e 20 41 20 73 69 6e 67 6c 65 20 64 6f 63  s). A single doc
03e0: 6c 69 73 74 20 6d 61 79 20 73 70 61 6e 20 6d 75  list may span mu
03f0: 6c 74 69 70 6c 65 20 70 61 67 65 73 2e 20 43 61  ltiple pages. Ca
0400: 72 65 20 69 73 20 0a 2a 2a 20 20 20 20 20 74 61  re is .**     ta
0410: 6b 65 6e 20 74 6f 20 65 6e 73 75 72 65 20 69 74  ken to ensure it
0420: 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74 6f 20   is possible to 
0430: 69 74 65 72 61 74 65 20 69 6e 20 65 69 74 68 65  iterate in eithe
0440: 72 20 64 69 72 65 63 74 69 6f 6e 20 74 68 72 6f  r direction thro
0450: 75 67 68 20 0a 2a 2a 20 20 20 20 20 74 68 65 20  ugh .**     the 
0460: 65 6e 74 72 69 65 73 20 69 6e 20 61 20 64 6f 63  entries in a doc
0470: 6c 69 73 74 2c 20 6f 72 20 74 6f 20 73 65 65 6b  list, or to seek
0480: 20 74 6f 20 61 20 73 70 65 63 69 66 69 63 20 65   to a specific e
0490: 6e 74 72 79 20 77 69 74 68 69 6e 20 61 20 0a 2a  ntry within a .*
04a0: 2a 20 20 20 20 20 64 6f 63 6c 69 73 74 2c 20 77  *     doclist, w
04b0: 69 74 68 6f 75 74 20 6c 6f 61 64 69 6e 67 20 69  ithout loading i
04c0: 74 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 2e 0a 2a  t into memory..*
04d0: 2a 0a 2a 2a 20 20 20 2a 20 6c 61 72 67 65 20 64  *.**   * large d
04e0: 6f 63 6c 69 73 74 73 20 74 68 61 74 20 73 70 61  oclists that spa
04f0: 6e 20 6d 61 6e 79 20 70 61 67 65 73 20 68 61 76  n many pages hav
0500: 65 20 61 73 73 6f 63 69 61 74 65 64 20 22 64 6f  e associated "do
0510: 63 6c 69 73 74 20 69 6e 64 65 78 22 0a 2a 2a 20  clist index".** 
0520: 20 20 20 20 72 65 63 6f 72 64 73 20 74 68 61 74      records that
0530: 20 63 6f 6e 74 61 69 6e 20 61 20 63 6f 70 79 20   contain a copy 
0540: 6f 66 20 74 68 65 20 66 69 72 73 74 20 72 6f 77  of the first row
0550: 69 64 20 6f 6e 20 65 61 63 68 20 70 61 67 65 20  id on each page 
0560: 73 70 61 6e 6e 65 64 20 62 79 0a 2a 2a 20 20 20  spanned by.**   
0570: 20 20 74 68 65 20 64 6f 63 6c 69 73 74 2e 20 54    the doclist. T
0580: 68 69 73 20 69 73 20 75 73 65 64 20 74 6f 20 73  his is used to s
0590: 70 65 65 64 20 75 70 20 73 65 65 6b 20 6f 70 65  peed up seek ope
05a0: 72 61 74 69 6f 6e 73 2c 20 61 6e 64 20 6d 65 72  rations, and mer
05b0: 67 65 73 20 6f 66 0a 2a 2a 20 20 20 20 20 6c 61  ges of.**     la
05c0: 72 67 65 20 64 6f 63 6c 69 73 74 73 20 77 69 74  rge doclists wit
05d0: 68 20 76 65 72 79 20 73 6d 61 6c 6c 20 64 6f 63  h very small doc
05e0: 6c 69 73 74 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a  lists..**.**   *
05f0: 20 65 78 74 72 61 20 66 69 65 6c 64 73 20 69 6e   extra fields in
0600: 20 74 68 65 20 22 73 74 72 75 63 74 75 72 65 20   the "structure 
0610: 72 65 63 6f 72 64 22 20 72 65 63 6f 72 64 20 74  record" record t
0620: 68 65 20 73 74 61 74 65 20 6f 66 20 6f 6e 67 6f  he state of ongo
0630: 69 6e 67 0a 2a 2a 20 20 20 20 20 69 6e 63 72 65  ing.**     incre
0640: 6d 65 6e 74 61 6c 20 6d 65 72 67 65 20 6f 70 65  mental merge ope
0650: 72 61 74 69 6f 6e 73 2e 0a 2a 2a 0a 2a 2f 0a 0a  rations..**.*/..
0660: 0a 23 64 65 66 69 6e 65 20 46 54 53 35 5f 4f 50  .#define FTS5_OP
0670: 54 5f 57 4f 52 4b 5f 55 4e 49 54 20 20 31 30 30  T_WORK_UNIT  100
0680: 30 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20  0  /* Number of 
0690: 6c 65 61 66 20 70 61 67 65 73 20 70 65 72 20 6f  leaf pages per o
06a0: 70 74 69 6d 69 7a 65 20 73 74 65 70 20 2a 2f 0a  ptimize step */.
06b0: 23 64 65 66 69 6e 65 20 46 54 53 35 5f 57 4f 52  #define FTS5_WOR
06c0: 4b 5f 55 4e 49 54 20 20 20 20 20 20 36 34 20 20  K_UNIT      64  
06d0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6c    /* Number of l
06e0: 65 61 66 20 70 61 67 65 73 20 69 6e 20 75 6e 69  eaf pages in uni
06f0: 74 20 6f 66 20 77 6f 72 6b 20 2a 2f 0a 0a 23 64  t of work */..#d
0700: 65 66 69 6e 65 20 46 54 53 35 5f 4d 49 4e 5f 44  efine FTS5_MIN_D
0710: 4c 49 44 58 5f 53 49 5a 45 20 34 20 20 20 20 20  LIDX_SIZE 4     
0720: 2f 2a 20 41 64 64 20 64 6c 69 64 78 20 69 66 20  /* Add dlidx if 
0730: 74 68 69 73 20 6d 61 6e 79 20 65 6d 70 74 79 20  this many empty 
0740: 70 61 67 65 73 20 2a 2f 0a 0a 23 64 65 66 69 6e  pages */..#defin
0750: 65 20 46 54 53 35 5f 4d 41 49 4e 5f 50 52 45 46  e FTS5_MAIN_PREF
0760: 49 58 20 27 30 27 0a 0a 23 69 66 20 46 54 53 35  IX '0'..#if FTS5
0770: 5f 4d 41 58 5f 50 52 45 46 49 58 5f 49 4e 44 45  _MAX_PREFIX_INDE
0780: 58 45 53 20 3e 20 33 31 0a 23 20 65 72 72 6f 72  XES > 31.# error
0790: 20 22 46 54 53 35 5f 4d 41 58 5f 50 52 45 46 49   "FTS5_MAX_PREFI
07a0: 58 5f 49 4e 44 45 58 45 53 20 69 73 20 74 6f 6f  X_INDEXES is too
07b0: 20 6c 61 72 67 65 22 0a 23 65 6e 64 69 66 0a 0a   large".#endif..
07c0: 2f 2a 0a 2a 2a 20 44 65 74 61 69 6c 73 3a 0a 2a  /*.** Details:.*
07d0: 2a 0a 2a 2a 20 54 68 65 20 25 5f 64 61 74 61 20  *.** The %_data 
07e0: 74 61 62 6c 65 20 6d 61 6e 61 67 65 64 20 62 79  table managed by
07f0: 20 74 68 69 73 20 6d 6f 64 75 6c 65 2c 0a 2a 2a   this module,.**
0800: 0a 2a 2a 20 20 20 20 20 43 52 45 41 54 45 20 54  .**     CREATE T
0810: 41 42 4c 45 20 25 5f 64 61 74 61 28 69 64 20 49  ABLE %_data(id I
0820: 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b  NTEGER PRIMARY K
0830: 45 59 2c 20 62 6c 6f 63 6b 20 42 4c 4f 42 29 3b  EY, block BLOB);
0840: 0a 2a 2a 0a 2a 2a 20 2c 20 63 6f 6e 74 61 69 6e  .**.** , contain
0850: 73 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  s the following 
0860: 35 20 74 79 70 65 73 20 6f 66 20 72 65 63 6f 72  5 types of recor
0870: 64 73 2e 20 53 65 65 20 74 68 65 20 63 6f 6d 6d  ds. See the comm
0880: 65 6e 74 73 20 73 75 72 72 6f 75 6e 64 69 6e 67  ents surrounding
0890: 0a 2a 2a 20 74 68 65 20 46 54 53 35 5f 2a 5f 52  .** the FTS5_*_R
08a0: 4f 57 49 44 20 6d 61 63 72 6f 73 20 62 65 6c 6f  OWID macros belo
08b0: 77 20 66 6f 72 20 61 20 64 65 73 63 72 69 70 74  w for a descript
08c0: 69 6f 6e 20 6f 66 20 68 6f 77 20 25 5f 64 61 74  ion of how %_dat
08d0: 61 20 72 6f 77 69 64 73 20 61 72 65 20 0a 2a 2a  a rowids are .**
08e0: 20 61 73 73 69 67 6e 65 64 20 74 6f 20 65 61 63   assigned to eac
08f0: 68 20 66 6f 20 74 68 65 6d 2e 0a 2a 2a 0a 2a 2a  h fo them..**.**
0900: 20 31 2e 20 53 74 72 75 63 74 75 72 65 20 52 65   1. Structure Re
0910: 63 6f 72 64 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 54  cords:.**.**   T
0920: 68 65 20 73 65 74 20 6f 66 20 73 65 67 6d 65 6e  he set of segmen
0930: 74 73 20 74 68 61 74 20 6d 61 6b 65 20 75 70 20  ts that make up 
0940: 61 6e 20 69 6e 64 65 78 20 2d 20 74 68 65 20 69  an index - the i
0950: 6e 64 65 78 20 73 74 72 75 63 74 75 72 65 20 2d  ndex structure -
0960: 20 61 72 65 0a 2a 2a 20 20 20 72 65 63 6f 72 64   are.**   record
0970: 65 64 20 69 6e 20 61 20 73 69 6e 67 6c 65 20 72  ed in a single r
0980: 65 63 6f 72 64 20 77 69 74 68 69 6e 20 74 68 65  ecord within the
0990: 20 25 5f 64 61 74 61 20 74 61 62 6c 65 2e 20 54   %_data table. T
09a0: 68 65 20 72 65 63 6f 72 64 20 63 6f 6e 73 69 73  he record consis
09b0: 74 73 0a 2a 2a 20 20 20 6f 66 20 61 20 73 69 6e  ts.**   of a sin
09c0: 67 6c 65 20 33 32 2d 62 69 74 20 63 6f 6e 66 69  gle 32-bit confi
09d0: 67 75 72 61 74 69 6f 6e 20 63 6f 6f 6b 69 65 20  guration cookie 
09e0: 76 61 6c 75 65 20 66 6f 6c 6c 6f 77 65 64 20 62  value followed b
09f0: 79 20 61 20 6c 69 73 74 20 6f 66 20 0a 2a 2a 20  y a list of .** 
0a00: 20 20 53 51 4c 69 74 65 20 76 61 72 69 6e 74 73    SQLite varints
0a10: 2e 20 49 66 20 74 68 65 20 46 54 53 20 74 61 62  . If the FTS tab
0a20: 6c 65 20 66 65 61 74 75 72 65 73 20 6d 6f 72 65  le features more
0a30: 20 74 68 61 6e 20 6f 6e 65 20 69 6e 64 65 78 20   than one index 
0a40: 28 62 65 63 61 75 73 65 0a 2a 2a 20 20 20 74 68  (because.**   th
0a50: 65 72 65 20 61 72 65 20 6f 6e 65 20 6f 72 20 6d  ere are one or m
0a60: 6f 72 65 20 70 72 65 66 69 78 20 69 6e 64 65 78  ore prefix index
0a70: 65 73 29 2c 20 69 74 20 69 73 20 67 75 61 72 61  es), it is guara
0a80: 6e 74 65 65 64 20 74 68 61 74 20 61 6c 6c 20 73  nteed that all s
0a90: 68 61 72 65 0a 2a 2a 20 20 20 74 68 65 20 73 61  hare.**   the sa
0aa0: 6d 65 20 63 6f 6f 6b 69 65 20 76 61 6c 75 65 2e  me cookie value.
0ab0: 0a 2a 2a 0a 2a 2a 20 20 20 49 6d 6d 65 64 69 61  .**.**   Immedia
0ac0: 74 65 6c 79 20 66 6f 6c 6c 6f 77 69 6e 67 20 74  tely following t
0ad0: 68 65 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e  he configuration
0ae0: 20 63 6f 6f 6b 69 65 2c 20 74 68 65 20 72 65 63   cookie, the rec
0af0: 6f 72 64 20 62 65 67 69 6e 73 20 77 69 74 68 0a  ord begins with.
0b00: 2a 2a 20 20 20 74 68 72 65 65 20 76 61 72 69 6e  **   three varin
0b10: 74 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2b 20  ts:.**.**     + 
0b20: 6e 75 6d 62 65 72 20 6f 66 20 6c 65 76 65 6c 73  number of levels
0b30: 2c 0a 2a 2a 20 20 20 20 20 2b 20 74 6f 74 61 6c  ,.**     + total
0b40: 20 6e 75 6d 62 65 72 20 6f 66 20 73 65 67 6d 65   number of segme
0b50: 6e 74 73 20 6f 6e 20 61 6c 6c 20 6c 65 76 65 6c  nts on all level
0b60: 73 2c 0a 2a 2a 20 20 20 20 20 2b 20 76 61 6c 75  s,.**     + valu
0b70: 65 20 6f 66 20 77 72 69 74 65 20 63 6f 75 6e 74  e of write count
0b80: 65 72 2e 0a 2a 2a 0a 2a 2a 20 20 20 54 68 65 6e  er..**.**   Then
0b90: 2c 20 66 6f 72 20 65 61 63 68 20 6c 65 76 65 6c  , for each level
0ba0: 20 66 72 6f 6d 20 30 20 74 6f 20 6e 4d 61 78 3a   from 0 to nMax:
0bb0: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2b 20 6e 75 6d  .**.**     + num
0bc0: 62 65 72 20 6f 66 20 69 6e 70 75 74 20 73 65 67  ber of input seg
0bd0: 6d 65 6e 74 73 20 69 6e 20 6f 6e 67 6f 69 6e 67  ments in ongoing
0be0: 20 6d 65 72 67 65 2e 0a 2a 2a 20 20 20 20 20 2b   merge..**     +
0bf0: 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66   total number of
0c00: 20 73 65 67 6d 65 6e 74 73 20 69 6e 20 6c 65 76   segments in lev
0c10: 65 6c 2e 0a 2a 2a 20 20 20 20 20 2b 20 66 6f 72  el..**     + for
0c20: 20 65 61 63 68 20 73 65 67 6d 65 6e 74 20 66 72   each segment fr
0c30: 6f 6d 20 6f 6c 64 65 73 74 20 74 6f 20 6e 65 77  om oldest to new
0c40: 65 73 74 3a 0a 2a 2a 20 20 20 20 20 20 20 20 20  est:.**         
0c50: 2b 20 73 65 67 6d 65 6e 74 20 69 64 20 28 61 6c  + segment id (al
0c60: 77 61 79 73 20 3e 20 30 29 0a 2a 2a 20 20 20 20  ways > 0).**    
0c70: 20 20 20 20 20 2b 20 66 69 72 73 74 20 6c 65 61       + first lea
0c80: 66 20 70 61 67 65 20 6e 75 6d 62 65 72 20 28 6f  f page number (o
0c90: 66 74 65 6e 20 31 2c 20 61 6c 77 61 79 73 20 67  ften 1, always g
0ca0: 72 65 61 74 65 72 20 74 68 61 6e 20 30 29 0a 2a  reater than 0).*
0cb0: 2a 20 20 20 20 20 20 20 20 20 2b 20 66 69 6e 61  *         + fina
0cc0: 6c 20 6c 65 61 66 20 70 61 67 65 20 6e 75 6d 62  l leaf page numb
0cd0: 65 72 0a 2a 2a 0a 2a 2a 20 32 2e 20 54 68 65 20  er.**.** 2. The 
0ce0: 41 76 65 72 61 67 65 73 20 52 65 63 6f 72 64 3a  Averages Record:
0cf0: 0a 2a 2a 0a 2a 2a 20 20 20 41 20 73 69 6e 67 6c  .**.**   A singl
0d00: 65 20 72 65 63 6f 72 64 20 77 69 74 68 69 6e 20  e record within 
0d10: 74 68 65 20 25 5f 64 61 74 61 20 74 61 62 6c 65  the %_data table
0d20: 2e 20 54 68 65 20 64 61 74 61 20 69 73 20 61 20  . The data is a 
0d30: 6c 69 73 74 20 6f 66 20 76 61 72 69 6e 74 73 2e  list of varints.
0d40: 0a 2a 2a 20 20 20 54 68 65 20 66 69 72 73 74 20  .**   The first 
0d50: 76 61 6c 75 65 20 69 73 20 74 68 65 20 6e 75 6d  value is the num
0d60: 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e 20 74  ber of rows in t
0d70: 68 65 20 69 6e 64 65 78 2e 20 54 68 65 6e 2c 20  he index. Then, 
0d80: 66 6f 72 20 65 61 63 68 20 63 6f 6c 75 6d 6e 0a  for each column.
0d90: 2a 2a 20 20 20 66 72 6f 6d 20 6c 65 66 74 20 74  **   from left t
0da0: 6f 20 72 69 67 68 74 2c 20 74 68 65 20 74 6f 74  o right, the tot
0db0: 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 74 6f 6b  al number of tok
0dc0: 65 6e 73 20 69 6e 20 74 68 65 20 63 6f 6c 75 6d  ens in the colum
0dd0: 6e 20 66 6f 72 20 61 6c 6c 0a 2a 2a 20 20 20 72  n for all.**   r
0de0: 6f 77 73 20 6f 66 20 74 68 65 20 74 61 62 6c 65  ows of the table
0df0: 2e 0a 2a 2a 0a 2a 2a 20 33 2e 20 53 65 67 6d 65  ..**.** 3. Segme
0e00: 6e 74 20 6c 65 61 76 65 73 3a 0a 2a 2a 0a 2a 2a  nt leaves:.**.**
0e10: 20 20 20 54 45 52 4d 2f 44 4f 43 4c 49 53 54 20     TERM/DOCLIST 
0e20: 46 4f 52 4d 41 54 3a 0a 2a 2a 0a 2a 2a 20 20 20  FORMAT:.**.**   
0e30: 20 20 4d 6f 73 74 20 6f 66 20 65 61 63 68 20 73    Most of each s
0e40: 65 67 6d 65 6e 74 20 6c 65 61 66 20 69 73 20 74  egment leaf is t
0e50: 61 6b 65 6e 20 75 70 20 62 79 20 74 65 72 6d 2f  aken up by term/
0e60: 64 6f 63 6c 69 73 74 20 64 61 74 61 2e 20 54 68  doclist data. Th
0e70: 65 20 0a 2a 2a 20 20 20 20 20 67 65 6e 65 72 61  e .**     genera
0e80: 6c 20 66 6f 72 6d 61 74 20 6f 66 20 74 65 72 6d  l format of term
0e90: 2f 64 6f 63 6c 69 73 74 2c 20 73 74 61 72 74 69  /doclist, starti
0ea0: 6e 67 20 77 69 74 68 20 74 68 65 20 66 69 72 73  ng with the firs
0eb0: 74 20 74 65 72 6d 0a 2a 2a 20 20 20 20 20 6f 6e  t term.**     on
0ec0: 20 74 68 65 20 6c 65 61 66 20 70 61 67 65 2c 20   the leaf page, 
0ed0: 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20  is:.**.**       
0ee0: 20 20 76 61 72 69 6e 74 20 3a 20 73 69 7a 65 20    varint : size 
0ef0: 6f 66 20 66 69 72 73 74 20 74 65 72 6d 0a 2a 2a  of first term.**
0f00: 20 20 20 20 20 20 20 20 20 62 6c 6f 62 3a 20 20           blob:  
0f10: 20 20 66 69 72 73 74 20 74 65 72 6d 20 64 61 74    first term dat
0f20: 61 0a 2a 2a 20 20 20 20 20 20 20 20 20 64 6f 63  a.**         doc
0f30: 6c 69 73 74 3a 20 66 69 72 73 74 20 64 6f 63 6c  list: first docl
0f40: 69 73 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 7a  ist.**         z
0f50: 65 72 6f 2d 6f 72 2d 6d 6f 72 65 20 7b 0a 2a 2a  ero-or-more {.**
0f60: 20 20 20 20 20 20 20 20 20 20 20 76 61 72 69 6e             varin
0f70: 74 3a 20 20 6e 75 6d 62 65 72 20 6f 66 20 62 79  t:  number of by
0f80: 74 65 73 20 69 6e 20 63 6f 6d 6d 6f 6e 20 77 69  tes in common wi
0f90: 74 68 20 70 72 65 76 69 6f 75 73 20 74 65 72 6d  th previous term
0fa0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 76 61  .**           va
0fb0: 72 69 6e 74 3a 20 20 6e 75 6d 62 65 72 20 6f 66  rint:  number of
0fc0: 20 62 79 74 65 73 20 6f 66 20 6e 65 77 20 74 65   bytes of new te
0fd0: 72 6d 20 64 61 74 61 20 28 6e 4e 65 77 29 0a 2a  rm data (nNew).*
0fe0: 2a 20 20 20 20 20 20 20 20 20 20 20 62 6c 6f 62  *           blob
0ff0: 3a 20 20 20 20 6e 4e 65 77 20 62 79 74 65 73 20  :    nNew bytes 
1000: 6f 66 20 6e 65 77 20 74 65 72 6d 20 64 61 74 61  of new term data
1010: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 64 6f  .**           do
1020: 63 6c 69 73 74 3a 20 6e 65 78 74 20 64 6f 63 6c  clist: next docl
1030: 69 73 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 7d  ist.**         }
1040: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 64 6f 63 6c 69  .**.**     docli
1050: 73 74 20 66 6f 72 6d 61 74 3a 0a 2a 2a 0a 2a 2a  st format:.**.**
1060: 20 20 20 20 20 20 20 20 20 76 61 72 69 6e 74 3a           varint:
1070: 20 20 66 69 72 73 74 20 72 6f 77 69 64 0a 2a 2a    first rowid.**
1080: 20 20 20 20 20 20 20 20 20 70 6f 73 6c 69 73 74           poslist
1090: 3a 20 66 69 72 73 74 20 70 6f 73 6c 69 73 74 0a  : first poslist.
10a0: 2a 2a 20 20 20 20 20 20 20 20 20 7a 65 72 6f 2d  **         zero-
10b0: 6f 72 2d 6d 6f 72 65 20 7b 0a 2a 2a 20 20 20 20  or-more {.**    
10c0: 20 20 20 20 20 20 20 76 61 72 69 6e 74 3a 20 20         varint:  
10d0: 72 6f 77 69 64 20 64 65 6c 74 61 20 28 61 6c 77  rowid delta (alw
10e0: 61 79 73 20 3e 20 30 29 0a 2a 2a 20 20 20 20 20  ays > 0).**     
10f0: 20 20 20 20 20 20 70 6f 73 6c 69 73 74 3a 20 6e        poslist: n
1100: 65 78 74 20 70 6f 73 6c 69 73 74 0a 2a 2a 20 20  ext poslist.**  
1110: 20 20 20 20 20 20 20 7d 0a 2a 2a 0a 2a 2a 20 20         }.**.**  
1120: 20 20 20 70 6f 73 6c 69 73 74 20 66 6f 72 6d 61     poslist forma
1130: 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20  t:.**.**        
1140: 20 76 61 72 69 6e 74 3a 20 73 69 7a 65 20 6f 66   varint: size of
1150: 20 70 6f 73 6c 69 73 74 20 69 6e 20 62 79 74 65   poslist in byte
1160: 73 20 6d 75 6c 74 69 70 6c 69 65 64 20 62 79 20  s multiplied by 
1170: 32 2c 20 6e 6f 74 20 69 6e 63 6c 75 64 69 6e 67  2, not including
1180: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
1190: 20 20 20 20 74 68 69 73 20 66 69 65 6c 64 2e 20      this field. 
11a0: 50 6c 75 73 20 31 20 69 66 20 74 68 69 73 20 65  Plus 1 if this e
11b0: 6e 74 72 79 20 63 61 72 72 69 65 73 20 74 68 65  ntry carries the
11c0: 20 22 64 65 6c 65 74 65 22 20 66 6c 61 67 2e 0a   "delete" flag..
11d0: 2a 2a 20 20 20 20 20 20 20 20 20 63 6f 6c 6c 69  **         colli
11e0: 73 74 3a 20 63 6f 6c 6c 69 73 74 20 66 6f 72 20  st: collist for 
11f0: 63 6f 6c 75 6d 6e 20 30 0a 2a 2a 20 20 20 20 20  column 0.**     
1200: 20 20 20 20 7a 65 72 6f 2d 6f 72 2d 6d 6f 72 65      zero-or-more
1210: 20 7b 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20   {.**           
1220: 30 78 30 31 20 62 79 74 65 0a 2a 2a 20 20 20 20  0x01 byte.**    
1230: 20 20 20 20 20 20 20 76 61 72 69 6e 74 3a 20 63         varint: c
1240: 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20 28 49 29  olumn number (I)
1250: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 63 6f  .**           co
1260: 6c 6c 69 73 74 3a 20 63 6f 6c 6c 69 73 74 20 66  llist: collist f
1270: 6f 72 20 63 6f 6c 75 6d 6e 20 49 0a 2a 2a 20 20  or column I.**  
1280: 20 20 20 20 20 20 20 7d 0a 2a 2a 0a 2a 2a 20 20         }.**.**  
1290: 20 20 20 63 6f 6c 6c 69 73 74 20 66 6f 72 6d 61     collist forma
12a0: 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20  t:.**.**        
12b0: 20 76 61 72 69 6e 74 3a 20 66 69 72 73 74 20 6f   varint: first o
12c0: 66 66 73 65 74 20 2b 20 32 0a 2a 2a 20 20 20 20  ffset + 2.**    
12d0: 20 20 20 20 20 7a 65 72 6f 2d 6f 72 2d 6d 6f 72       zero-or-mor
12e0: 65 20 7b 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  e {.**          
12f0: 20 76 61 72 69 6e 74 3a 20 6f 66 66 73 65 74 20   varint: offset 
1300: 64 65 6c 74 61 20 2b 20 32 0a 2a 2a 20 20 20 20  delta + 2.**    
1310: 20 20 20 20 20 7d 0a 2a 2a 0a 2a 2a 20 20 20 50       }.**.**   P
1320: 41 47 45 20 46 4f 52 4d 41 54 0a 2a 2a 0a 2a 2a  AGE FORMAT.**.**
1330: 20 20 20 20 20 45 61 63 68 20 6c 65 61 66 20 70       Each leaf p
1340: 61 67 65 20 62 65 67 69 6e 73 20 77 69 74 68 20  age begins with 
1350: 61 20 34 2d 62 79 74 65 20 68 65 61 64 65 72 20  a 4-byte header 
1360: 63 6f 6e 74 61 69 6e 69 6e 67 20 32 20 31 36 2d  containing 2 16-
1370: 62 69 74 20 0a 2a 2a 20 20 20 20 20 75 6e 73 69  bit .**     unsi
1380: 67 6e 65 64 20 69 6e 74 65 67 65 72 20 66 69 65  gned integer fie
1390: 6c 64 73 20 69 6e 20 62 69 67 2d 65 6e 64 69 61  lds in big-endia
13a0: 6e 20 66 6f 72 6d 61 74 2e 20 54 68 65 79 20 61  n format. They a
13b0: 72 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20  re:.**.**       
13c0: 2a 20 54 68 65 20 62 79 74 65 20 6f 66 66 73 65  * The byte offse
13d0: 74 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 72  t of the first r
13e0: 6f 77 69 64 20 6f 6e 20 74 68 65 20 70 61 67 65  owid on the page
13f0: 2c 20 69 66 20 69 74 20 65 78 69 73 74 73 0a 2a  , if it exists.*
1400: 2a 20 20 20 20 20 20 20 20 20 61 6e 64 20 6f 63  *         and oc
1410: 63 75 72 73 20 62 65 66 6f 72 65 20 74 68 65 20  curs before the 
1420: 66 69 72 73 74 20 74 65 72 6d 20 28 6f 74 68 65  first term (othe
1430: 72 77 69 73 65 20 30 29 2e 0a 2a 2a 0a 2a 2a 20  rwise 0)..**.** 
1440: 20 20 20 20 20 20 2a 20 54 68 65 20 62 79 74 65        * The byte
1450: 20 6f 66 66 73 65 74 20 6f 66 20 74 68 65 20 73   offset of the s
1460: 74 61 72 74 20 6f 66 20 74 68 65 20 70 61 67 65  tart of the page
1470: 20 66 6f 6f 74 65 72 2e 20 49 66 20 74 68 65 20   footer. If the 
1480: 70 61 67 65 0a 2a 2a 20 20 20 20 20 20 20 20 20  page.**         
1490: 66 6f 6f 74 65 72 20 69 73 20 30 20 62 79 74 65  footer is 0 byte
14a0: 73 20 69 6e 20 73 69 7a 65 2c 20 74 68 65 6e 20  s in size, then 
14b0: 74 68 69 73 20 66 69 65 6c 64 20 69 73 20 74 68  this field is th
14c0: 65 20 73 61 6d 65 20 61 73 20 74 68 65 0a 2a 2a  e same as the.**
14d0: 20 20 20 20 20 20 20 20 20 73 69 7a 65 20 6f 66           size of
14e0: 20 74 68 65 20 6c 65 61 66 20 70 61 67 65 20 69   the leaf page i
14f0: 6e 20 62 79 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 20  n bytes..**.**  
1500: 20 20 20 54 68 65 20 70 61 67 65 20 66 6f 6f 74     The page foot
1510: 65 72 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 61  er consists of a
1520: 20 73 69 6e 67 6c 65 20 76 61 72 69 6e 74 20 66   single varint f
1530: 6f 72 20 65 61 63 68 20 74 65 72 6d 20 6c 6f 63  or each term loc
1540: 61 74 65 64 0a 2a 2a 20 20 20 20 20 6f 6e 20 74  ated.**     on t
1550: 68 65 20 70 61 67 65 2e 20 45 61 63 68 20 76 61  he page. Each va
1560: 72 69 6e 74 20 69 73 20 74 68 65 20 62 79 74 65  rint is the byte
1570: 20 6f 66 66 73 65 74 20 6f 66 20 74 68 65 20 63   offset of the c
1580: 75 72 72 65 6e 74 20 74 65 72 6d 0a 2a 2a 20 20  urrent term.**  
1590: 20 20 20 77 69 74 68 69 6e 20 74 68 65 20 70 61     within the pa
15a0: 67 65 2c 20 64 65 6c 74 61 2d 63 6f 6d 70 72 65  ge, delta-compre
15b0: 73 73 65 64 20 61 67 61 69 6e 73 74 20 74 68 65  ssed against the
15c0: 20 70 72 65 76 69 6f 75 73 20 76 61 6c 75 65 2e   previous value.
15d0: 20 49 6e 0a 2a 2a 20 20 20 20 20 6f 74 68 65 72   In.**     other
15e0: 20 77 6f 72 64 73 2c 20 74 68 65 20 66 69 72 73   words, the firs
15f0: 74 20 76 61 72 69 6e 74 20 69 6e 20 74 68 65 20  t varint in the 
1600: 66 6f 6f 74 65 72 20 69 73 20 74 68 65 20 62 79  footer is the by
1610: 74 65 20 6f 66 66 73 65 74 20 6f 66 0a 2a 2a 20  te offset of.** 
1620: 20 20 20 20 74 68 65 20 66 69 72 73 74 20 74 65      the first te
1630: 72 6d 2c 20 74 68 65 20 73 65 63 6f 6e 64 20 69  rm, the second i
1640: 73 20 74 68 65 20 62 79 74 65 20 6f 66 66 73 65  s the byte offse
1650: 74 20 6f 66 20 74 68 65 20 73 65 63 6f 6e 64 20  t of the second 
1660: 6c 65 73 73 20 74 68 61 74 0a 2a 2a 20 20 20 20  less that.**    
1670: 20 6f 66 20 74 68 65 20 66 69 72 73 74 2c 20 61   of the first, a
1680: 6e 64 20 73 6f 20 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  nd so on..**.** 
1690: 20 20 20 20 54 68 65 20 74 65 72 6d 2f 64 6f 63      The term/doc
16a0: 6c 69 73 74 20 66 6f 72 6d 61 74 20 64 65 73 63  list format desc
16b0: 72 69 62 65 64 20 61 62 6f 76 65 20 69 73 20 61  ribed above is a
16c0: 63 63 75 72 61 74 65 20 69 66 20 74 68 65 20 65  ccurate if the e
16d0: 6e 74 69 72 65 0a 2a 2a 20 20 20 20 20 74 65 72  ntire.**     ter
16e0: 6d 2f 64 6f 63 6c 69 73 74 20 64 61 74 61 20 66  m/doclist data f
16f0: 69 74 73 20 6f 6e 20 61 20 73 69 6e 67 6c 65 20  its on a single 
1700: 6c 65 61 66 20 70 61 67 65 2e 20 49 66 20 74 68  leaf page. If th
1710: 69 73 20 69 73 20 6e 6f 74 20 74 68 65 20 63 61  is is not the ca
1720: 73 65 2c 0a 2a 2a 20 20 20 20 20 74 68 65 20 66  se,.**     the f
1730: 6f 72 6d 61 74 20 69 73 20 63 68 61 6e 67 65 64  ormat is changed
1740: 20 69 6e 20 74 77 6f 20 77 61 79 73 3a 0a 2a 2a   in two ways:.**
1750: 0a 2a 2a 20 20 20 20 20 20 20 2b 20 69 66 20 74  .**       + if t
1760: 68 65 20 66 69 72 73 74 20 72 6f 77 69 64 20 6f  he first rowid o
1770: 6e 20 61 20 70 61 67 65 20 6f 63 63 75 72 73 20  n a page occurs 
1780: 62 65 66 6f 72 65 20 74 68 65 20 66 69 72 73 74  before the first
1790: 20 74 65 72 6d 2c 20 69 74 0a 2a 2a 20 20 20 20   term, it.**    
17a0: 20 20 20 20 20 69 73 20 73 74 6f 72 65 64 20 61       is stored a
17b0: 73 20 61 20 6c 69 74 65 72 61 6c 20 76 61 6c 75  s a literal valu
17c0: 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20  e:.**.**        
17d0: 20 20 20 20 20 76 61 72 69 6e 74 3a 20 20 66 69       varint:  fi
17e0: 72 73 74 20 72 6f 77 69 64 0a 2a 2a 0a 2a 2a 20  rst rowid.**.** 
17f0: 20 20 20 20 20 20 2b 20 74 68 65 20 66 69 72 73        + the firs
1800: 74 20 74 65 72 6d 20 6f 6e 20 65 61 63 68 20 70  t term on each p
1810: 61 67 65 20 69 73 20 73 74 6f 72 65 64 20 69 6e  age is stored in
1820: 20 74 68 65 20 73 61 6d 65 20 77 61 79 20 61 73   the same way as
1830: 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 20   the.**         
1840: 76 65 72 79 20 66 69 72 73 74 20 74 65 72 6d 20  very first term 
1850: 6f 66 20 74 68 65 20 73 65 67 6d 65 6e 74 3a 0a  of the segment:.
1860: 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  **.**           
1870: 20 20 76 61 72 69 6e 74 20 3a 20 73 69 7a 65 20    varint : size 
1880: 6f 66 20 66 69 72 73 74 20 74 65 72 6d 0a 2a 2a  of first term.**
1890: 20 20 20 20 20 20 20 20 20 20 20 20 20 62 6c 6f               blo
18a0: 62 3a 20 20 20 20 66 69 72 73 74 20 74 65 72 6d  b:    first term
18b0: 20 64 61 74 61 0a 2a 2a 0a 2a 2a 20 35 2e 20 53   data.**.** 5. S
18c0: 65 67 6d 65 6e 74 20 64 6f 63 6c 69 73 74 20 69  egment doclist i
18d0: 6e 64 65 78 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  ndexes:.**.**   
18e0: 44 6f 63 6c 69 73 74 20 69 6e 64 65 78 65 73 20  Doclist indexes 
18f0: 61 72 65 20 74 68 65 6d 73 65 6c 76 65 73 20 62  are themselves b
1900: 2d 74 72 65 65 73 2c 20 68 6f 77 65 76 65 72 20  -trees, however 
1910: 74 68 65 79 20 75 73 75 61 6c 6c 79 20 63 6f 6e  they usually con
1920: 73 69 73 74 20 6f 66 0a 2a 2a 20 20 20 61 20 73  sist of.**   a s
1930: 69 6e 67 6c 65 20 6c 65 61 66 20 72 65 63 6f 72  ingle leaf recor
1940: 64 20 6f 6e 6c 79 2e 20 54 68 65 20 66 6f 72 6d  d only. The form
1950: 61 74 20 6f 66 20 65 61 63 68 20 64 6f 63 6c 69  at of each docli
1960: 73 74 20 69 6e 64 65 78 20 6c 65 61 66 20 70 61  st index leaf pa
1970: 67 65 20 0a 2a 2a 20 20 20 69 73 3a 0a 2a 2a 0a  ge .**   is:.**.
1980: 2a 2a 20 20 20 20 20 2a 20 46 6c 61 67 73 20 62  **     * Flags b
1990: 79 74 65 2e 20 42 69 74 73 20 61 72 65 3a 0a 2a  yte. Bits are:.*
19a0: 2a 20 20 20 20 20 20 20 20 20 30 78 30 31 3a 20  *         0x01: 
19b0: 43 6c 65 61 72 20 69 66 20 6c 65 61 66 20 69 73  Clear if leaf is
19c0: 20 61 6c 73 6f 20 74 68 65 20 72 6f 6f 74 20 70   also the root p
19d0: 61 67 65 2c 20 6f 74 68 65 72 77 69 73 65 20 73  age, otherwise s
19e0: 65 74 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 20  et..**.**     * 
19f0: 50 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 66  Page number of f
1a00: 74 73 20 69 6e 64 65 78 20 6c 65 61 66 20 70 61  ts index leaf pa
1a10: 67 65 2e 20 41 73 20 61 20 76 61 72 69 6e 74 2e  ge. As a varint.
1a20: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 20 46 69 72  .**.**     * Fir
1a30: 73 74 20 72 6f 77 69 64 20 6f 6e 20 70 61 67 65  st rowid on page
1a40: 20 69 6e 64 69 63 61 74 65 64 20 62 79 20 70 72   indicated by pr
1a50: 65 76 69 6f 75 73 20 66 69 65 6c 64 2e 20 41 73  evious field. As
1a60: 20 61 20 76 61 72 69 6e 74 2e 0a 2a 2a 0a 2a 2a   a varint..**.**
1a70: 20 20 20 20 20 2a 20 41 20 6c 69 73 74 20 6f 66       * A list of
1a80: 20 76 61 72 69 6e 74 73 2c 20 6f 6e 65 20 66 6f   varints, one fo
1a90: 72 20 65 61 63 68 20 73 75 62 73 65 71 75 65 6e  r each subsequen
1aa0: 74 20 74 65 72 6d 6c 65 73 73 20 70 61 67 65 2e  t termless page.
1ab0: 20 41 20 0a 2a 2a 20 20 20 20 20 20 20 70 6f 73   A .**       pos
1ac0: 69 74 69 76 65 20 64 65 6c 74 61 20 69 66 20 74  itive delta if t
1ad0: 68 65 20 74 65 72 6d 6c 65 73 73 20 70 61 67 65  he termless page
1ae0: 20 63 6f 6e 74 61 69 6e 73 20 61 74 20 6c 65 61   contains at lea
1af0: 73 74 20 6f 6e 65 20 72 6f 77 69 64 2c 20 0a 2a  st one rowid, .*
1b00: 2a 20 20 20 20 20 20 20 6f 72 20 61 6e 20 30 78  *       or an 0x
1b10: 30 30 20 62 79 74 65 20 6f 74 68 65 72 77 69 73  00 byte otherwis
1b20: 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 49 6e 74 65 72  e..**.**   Inter
1b30: 6e 61 6c 20 64 6f 63 6c 69 73 74 20 69 6e 64 65  nal doclist inde
1b40: 78 20 6e 6f 64 65 73 20 61 72 65 3a 0a 2a 2a 0a  x nodes are:.**.
1b50: 2a 2a 20 20 20 20 20 2a 20 46 6c 61 67 73 20 62  **     * Flags b
1b60: 79 74 65 2e 20 42 69 74 73 20 61 72 65 3a 0a 2a  yte. Bits are:.*
1b70: 2a 20 20 20 20 20 20 20 20 20 30 78 30 31 3a 20  *         0x01: 
1b80: 43 6c 65 61 72 20 66 6f 72 20 72 6f 6f 74 20 70  Clear for root p
1b90: 61 67 65 2c 20 6f 74 68 65 72 77 69 73 65 20 73  age, otherwise s
1ba0: 65 74 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 20  et..**.**     * 
1bb0: 50 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 66  Page number of f
1bc0: 69 72 73 74 20 63 68 69 6c 64 20 70 61 67 65 2e  irst child page.
1bd0: 20 41 73 20 61 20 76 61 72 69 6e 74 2e 0a 2a 2a   As a varint..**
1be0: 0a 2a 2a 20 20 20 20 20 2a 20 43 6f 70 79 20 6f  .**     * Copy o
1bf0: 66 20 66 69 72 73 74 20 72 6f 77 69 64 20 6f 6e  f first rowid on
1c00: 20 70 61 67 65 20 69 6e 64 69 63 61 74 65 64 20   page indicated 
1c10: 62 79 20 70 72 65 76 69 6f 75 73 20 66 69 65 6c  by previous fiel
1c20: 64 2e 20 41 73 20 61 20 76 61 72 69 6e 74 2e 0a  d. As a varint..
1c30: 2a 2a 0a 2a 2a 20 20 20 20 20 2a 20 41 20 6c 69  **.**     * A li
1c40: 73 74 20 6f 66 20 64 65 6c 74 61 2d 65 6e 63 6f  st of delta-enco
1c50: 64 65 64 20 76 61 72 69 6e 74 73 20 2d 20 74 68  ded varints - th
1c60: 65 20 66 69 72 73 74 20 72 6f 77 69 64 20 6f 6e  e first rowid on
1c70: 20 65 61 63 68 20 73 75 62 73 65 71 75 65 6e 74   each subsequent
1c80: 0a 2a 2a 20 20 20 20 20 20 20 63 68 69 6c 64 20  .**       child 
1c90: 70 61 67 65 2e 20 0a 2a 2a 0a 2a 2f 0a 0a 2f 2a  page. .**.*/../*
1ca0: 0a 2a 2a 20 52 6f 77 69 64 73 20 66 6f 72 20 74  .** Rowids for t
1cb0: 68 65 20 61 76 65 72 61 67 65 73 20 61 6e 64 20  he averages and 
1cc0: 73 74 72 75 63 74 75 72 65 20 72 65 63 6f 72 64  structure record
1cd0: 73 20 69 6e 20 74 68 65 20 25 5f 64 61 74 61 20  s in the %_data 
1ce0: 74 61 62 6c 65 2e 0a 2a 2f 0a 23 64 65 66 69 6e  table..*/.#defin
1cf0: 65 20 46 54 53 35 5f 41 56 45 52 41 47 45 53 5f  e FTS5_AVERAGES_
1d00: 52 4f 57 49 44 20 20 20 20 20 31 20 20 20 20 2f  ROWID     1    /
1d10: 2a 20 52 6f 77 69 64 20 75 73 65 64 20 66 6f 72  * Rowid used for
1d20: 20 74 68 65 20 61 76 65 72 61 67 65 73 20 72 65   the averages re
1d30: 63 6f 72 64 20 2a 2f 0a 23 64 65 66 69 6e 65 20  cord */.#define 
1d40: 46 54 53 35 5f 53 54 52 55 43 54 55 52 45 5f 52  FTS5_STRUCTURE_R
1d50: 4f 57 49 44 20 20 20 31 30 20 20 20 20 2f 2a 20  OWID   10    /* 
1d60: 54 68 65 20 73 74 72 75 63 74 75 72 65 20 72 65  The structure re
1d70: 63 6f 72 64 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 4d  cord */../*.** M
1d80: 61 63 72 6f 73 20 64 65 74 65 72 6d 69 6e 69 6e  acros determinin
1d90: 67 20 74 68 65 20 72 6f 77 69 64 73 20 75 73 65  g the rowids use
1da0: 64 20 62 79 20 73 65 67 6d 65 6e 74 20 6c 65 61  d by segment lea
1db0: 76 65 73 20 61 6e 64 20 64 6c 69 64 78 20 6c 65  ves and dlidx le
1dc0: 61 76 65 73 0a 2a 2a 20 61 6e 64 20 6e 6f 64 65  aves.** and node
1dd0: 73 2e 20 41 6c 6c 20 6e 6f 64 65 73 20 61 6e 64  s. All nodes and
1de0: 20 6c 65 61 76 65 73 20 61 72 65 20 73 74 6f 72   leaves are stor
1df0: 65 64 20 69 6e 20 74 68 65 20 25 5f 64 61 74 61  ed in the %_data
1e00: 20 74 61 62 6c 65 20 77 69 74 68 20 6c 61 72 67   table with larg
1e10: 65 0a 2a 2a 20 70 6f 73 69 74 69 76 65 20 72 6f  e.** positive ro
1e20: 77 69 64 73 2e 0a 2a 2a 0a 2a 2a 20 45 61 63 68  wids..**.** Each
1e30: 20 73 65 67 6d 65 6e 74 20 68 61 73 20 61 20 75   segment has a u
1e40: 6e 69 71 75 65 20 6e 6f 6e 2d 7a 65 72 6f 20 31  nique non-zero 1
1e50: 36 2d 62 69 74 20 69 64 2e 0a 2a 2a 0a 2a 2a 20  6-bit id..**.** 
1e60: 54 68 65 20 72 6f 77 69 64 20 66 6f 72 20 65 61  The rowid for ea
1e70: 63 68 20 73 65 67 6d 65 6e 74 20 6c 65 61 66 20  ch segment leaf 
1e80: 69 73 20 66 6f 75 6e 64 20 62 79 20 70 61 73 73  is found by pass
1e90: 69 6e 67 20 74 68 65 20 73 65 67 6d 65 6e 74 20  ing the segment 
1ea0: 69 64 20 61 6e 64 20 0a 2a 2a 20 74 68 65 20 6c  id and .** the l
1eb0: 65 61 66 20 70 61 67 65 20 6e 75 6d 62 65 72 20  eaf page number 
1ec0: 74 6f 20 74 68 65 20 46 54 53 35 5f 53 45 47 4d  to the FTS5_SEGM
1ed0: 45 4e 54 5f 52 4f 57 49 44 20 6d 61 63 72 6f 2e  ENT_ROWID macro.
1ee0: 20 4c 65 61 76 65 73 20 61 72 65 20 6e 75 6d 62   Leaves are numb
1ef0: 65 72 65 64 0a 2a 2a 20 73 65 71 75 65 6e 74 69  ered.** sequenti
1f00: 61 6c 6c 79 20 73 74 61 72 74 69 6e 67 20 66 72  ally starting fr
1f10: 6f 6d 20 31 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  om 1..*/.#define
1f20: 20 46 54 53 35 5f 44 41 54 41 5f 49 44 5f 42 20   FTS5_DATA_ID_B 
1f30: 20 20 20 20 31 36 20 20 20 20 20 2f 2a 20 4d 61      16     /* Ma
1f40: 78 20 73 65 67 20 69 64 20 6e 75 6d 62 65 72 20  x seg id number 
1f50: 36 35 35 33 35 20 2a 2f 0a 23 64 65 66 69 6e 65  65535 */.#define
1f60: 20 46 54 53 35 5f 44 41 54 41 5f 44 4c 49 5f 42   FTS5_DATA_DLI_B
1f70: 20 20 20 20 20 31 20 20 20 20 20 2f 2a 20 44 6f       1     /* Do
1f80: 63 6c 69 73 74 2d 69 6e 64 65 78 20 66 6c 61 67  clist-index flag
1f90: 20 28 31 20 62 69 74 29 20 2a 2f 0a 23 64 65 66   (1 bit) */.#def
1fa0: 69 6e 65 20 46 54 53 35 5f 44 41 54 41 5f 48 45  ine FTS5_DATA_HE
1fb0: 49 47 48 54 5f 42 20 20 35 20 20 20 20 20 2f 2a  IGHT_B  5     /*
1fc0: 20 4d 61 78 20 64 6c 69 64 78 20 74 72 65 65 20   Max dlidx tree 
1fd0: 68 65 69 67 68 74 20 6f 66 20 33 32 20 2a 2f 0a  height of 32 */.
1fe0: 23 64 65 66 69 6e 65 20 46 54 53 35 5f 44 41 54  #define FTS5_DAT
1ff0: 41 5f 50 41 47 45 5f 42 20 20 20 33 31 20 20 20  A_PAGE_B   31   
2000: 20 20 2f 2a 20 4d 61 78 20 70 61 67 65 20 6e 75    /* Max page nu
2010: 6d 62 65 72 20 6f 66 20 32 31 34 37 34 38 33 36  mber of 21474836
2020: 34 38 20 2a 2f 0a 0a 23 64 65 66 69 6e 65 20 66  48 */..#define f
2030: 74 73 35 5f 64 72 69 28 73 65 67 69 64 2c 20 64  ts5_dri(segid, d
2040: 6c 69 64 78 2c 20 68 65 69 67 68 74 2c 20 70 67  lidx, height, pg
2050: 6e 6f 29 20 28 20 20 20 20 20 20 20 20 20 20 20  no) (           
2060: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2070: 20 20 20 20 20 20 5c 0a 20 28 28 69 36 34 29 28        \. ((i64)(
2080: 73 65 67 69 64 29 20 20 3c 3c 20 28 46 54 53 35  segid)  << (FTS5
2090: 5f 44 41 54 41 5f 50 41 47 45 5f 42 2b 46 54 53  _DATA_PAGE_B+FTS
20a0: 35 5f 44 41 54 41 5f 48 45 49 47 48 54 5f 42 2b  5_DATA_HEIGHT_B+
20b0: 46 54 53 35 5f 44 41 54 41 5f 44 4c 49 5f 42 29  FTS5_DATA_DLI_B)
20c0: 29 20 2b 20 20 20 20 5c 0a 20 28 28 69 36 34 29  ) +    \. ((i64)
20d0: 28 64 6c 69 64 78 29 20 20 3c 3c 20 28 46 54 53  (dlidx)  << (FTS
20e0: 35 5f 44 41 54 41 5f 50 41 47 45 5f 42 20 2b 20  5_DATA_PAGE_B + 
20f0: 46 54 53 35 5f 44 41 54 41 5f 48 45 49 47 48 54  FTS5_DATA_HEIGHT
2100: 5f 42 29 29 20 2b 20 20 20 20 20 20 20 20 20 20  _B)) +          
2110: 20 20 20 20 20 20 20 20 5c 0a 20 28 28 69 36 34          \. ((i64
2120: 29 28 68 65 69 67 68 74 29 20 3c 3c 20 28 46 54  )(height) << (FT
2130: 53 35 5f 44 41 54 41 5f 50 41 47 45 5f 42 29 29  S5_DATA_PAGE_B))
2140: 20 2b 20 20 20 20 20 20 20 20 20 20 20 20 20 20   +              
2150: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2160: 20 20 20 20 20 20 20 20 20 5c 0a 20 28 28 69 36           \. ((i6
2170: 34 29 28 70 67 6e 6f 29 29 20 20 20 20 20 20 20  4)(pgno))       
2180: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21b0: 20 20 20 20 20 20 20 20 20 20 5c 0a 29 0a 0a 23            \.)..#
21c0: 64 65 66 69 6e 65 20 46 54 53 35 5f 53 45 47 4d  define FTS5_SEGM
21d0: 45 4e 54 5f 52 4f 57 49 44 28 73 65 67 69 64 2c  ENT_ROWID(segid,
21e0: 20 70 67 6e 6f 29 20 20 20 20 20 20 20 66 74 73   pgno)       fts
21f0: 35 5f 64 72 69 28 73 65 67 69 64 2c 20 30 2c 20  5_dri(segid, 0, 
2200: 30 2c 20 70 67 6e 6f 29 0a 23 64 65 66 69 6e 65  0, pgno).#define
2210: 20 46 54 53 35 5f 44 4c 49 44 58 5f 52 4f 57 49   FTS5_DLIDX_ROWI
2220: 44 28 73 65 67 69 64 2c 20 68 65 69 67 68 74 2c  D(segid, height,
2230: 20 70 67 6e 6f 29 20 66 74 73 35 5f 64 72 69 28   pgno) fts5_dri(
2240: 73 65 67 69 64 2c 20 31 2c 20 68 65 69 67 68 74  segid, 1, height
2250: 2c 20 70 67 6e 6f 29 0a 0a 2f 2a 0a 2a 2a 20 4d  , pgno)../*.** M
2260: 61 78 69 6d 75 6d 20 73 65 67 6d 65 6e 74 73 20  aximum segments 
2270: 70 65 72 6d 69 74 74 65 64 20 69 6e 20 61 20 73  permitted in a s
2280: 69 6e 67 6c 65 20 69 6e 64 65 78 20 0a 2a 2f 0a  ingle index .*/.
2290: 23 64 65 66 69 6e 65 20 46 54 53 35 5f 4d 41 58  #define FTS5_MAX
22a0: 5f 53 45 47 4d 45 4e 54 20 32 30 30 30 0a 0a 23  _SEGMENT 2000..#
22b0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
22c0: 55 47 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74  UG.int sqlite3Ft
22d0: 73 35 43 6f 72 72 75 70 74 28 29 20 7b 20 72 65  s5Corrupt() { re
22e0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
22f0: 55 50 54 5f 56 54 41 42 3b 20 7d 0a 23 65 6e 64  UPT_VTAB; }.#end
2300: 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 45 61 63 68 20  if.../*.** Each 
2310: 74 69 6d 65 20 61 20 62 6c 6f 62 20 69 73 20 72  time a blob is r
2320: 65 61 64 20 66 72 6f 6d 20 74 68 65 20 25 5f 64  ead from the %_d
2330: 61 74 61 20 74 61 62 6c 65 2c 20 69 74 20 69 73  ata table, it is
2340: 20 70 61 64 64 65 64 20 77 69 74 68 20 74 68 69   padded with thi
2350: 73 0a 2a 2a 20 6d 61 6e 79 20 7a 65 72 6f 20 62  s.** many zero b
2360: 79 74 65 73 2e 20 54 68 69 73 20 6d 61 6b 65 73  ytes. This makes
2370: 20 69 74 20 65 61 73 69 65 72 20 74 6f 20 64 65   it easier to de
2380: 63 6f 64 65 20 74 68 65 20 76 61 72 69 6f 75 73  code the various
2390: 20 72 65 63 6f 72 64 20 66 6f 72 6d 61 74 73 0a   record formats.
23a0: 2a 2a 20 77 69 74 68 6f 75 74 20 6f 76 65 72 72  ** without overr
23b0: 65 61 64 69 6e 67 20 69 66 20 74 68 65 20 72 65  eading if the re
23c0: 63 6f 72 64 73 20 61 72 65 20 63 6f 72 72 75 70  cords are corrup
23d0: 74 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 46 54  t..*/.#define FT
23e0: 53 35 5f 44 41 54 41 5f 5a 45 52 4f 5f 50 41 44  S5_DATA_ZERO_PAD
23f0: 44 49 4e 47 20 38 0a 23 64 65 66 69 6e 65 20 46  DING 8.#define F
2400: 54 53 35 5f 44 41 54 41 5f 50 41 44 44 49 4e 47  TS5_DATA_PADDING
2410: 20 32 30 0a 0a 74 79 70 65 64 65 66 20 73 74 72   20..typedef str
2420: 75 63 74 20 46 74 73 35 44 61 74 61 20 46 74 73  uct Fts5Data Fts
2430: 35 44 61 74 61 3b 0a 74 79 70 65 64 65 66 20 73  5Data;.typedef s
2440: 74 72 75 63 74 20 46 74 73 35 44 6c 69 64 78 49  truct Fts5DlidxI
2450: 74 65 72 20 46 74 73 35 44 6c 69 64 78 49 74 65  ter Fts5DlidxIte
2460: 72 3b 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  r;.typedef struc
2470: 74 20 46 74 73 35 44 6c 69 64 78 4c 76 6c 20 46  t Fts5DlidxLvl F
2480: 74 73 35 44 6c 69 64 78 4c 76 6c 3b 0a 74 79 70  ts5DlidxLvl;.typ
2490: 65 64 65 66 20 73 74 72 75 63 74 20 46 74 73 35  edef struct Fts5
24a0: 44 6c 69 64 78 57 72 69 74 65 72 20 46 74 73 35  DlidxWriter Fts5
24b0: 44 6c 69 64 78 57 72 69 74 65 72 3b 0a 74 79 70  DlidxWriter;.typ
24c0: 65 64 65 66 20 73 74 72 75 63 74 20 46 74 73 35  edef struct Fts5
24d0: 50 61 67 65 57 72 69 74 65 72 20 46 74 73 35 50  PageWriter Fts5P
24e0: 61 67 65 57 72 69 74 65 72 3b 0a 74 79 70 65 64  ageWriter;.typed
24f0: 65 66 20 73 74 72 75 63 74 20 46 74 73 35 53 65  ef struct Fts5Se
2500: 67 49 74 65 72 20 46 74 73 35 53 65 67 49 74 65  gIter Fts5SegIte
2510: 72 3b 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  r;.typedef struc
2520: 74 20 46 74 73 35 44 6f 63 6c 69 73 74 49 74 65  t Fts5DoclistIte
2530: 72 20 46 74 73 35 44 6f 63 6c 69 73 74 49 74 65  r Fts5DoclistIte
2540: 72 3b 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  r;.typedef struc
2550: 74 20 46 74 73 35 53 65 67 57 72 69 74 65 72 20  t Fts5SegWriter 
2560: 46 74 73 35 53 65 67 57 72 69 74 65 72 3b 0a 74  Fts5SegWriter;.t
2570: 79 70 65 64 65 66 20 73 74 72 75 63 74 20 46 74  ypedef struct Ft
2580: 73 35 53 74 72 75 63 74 75 72 65 20 46 74 73 35  s5Structure Fts5
2590: 53 74 72 75 63 74 75 72 65 3b 0a 74 79 70 65 64  Structure;.typed
25a0: 65 66 20 73 74 72 75 63 74 20 46 74 73 35 53 74  ef struct Fts5St
25b0: 72 75 63 74 75 72 65 4c 65 76 65 6c 20 46 74 73  ructureLevel Fts
25c0: 35 53 74 72 75 63 74 75 72 65 4c 65 76 65 6c 3b  5StructureLevel;
25d0: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
25e0: 46 74 73 35 53 74 72 75 63 74 75 72 65 53 65 67  Fts5StructureSeg
25f0: 6d 65 6e 74 20 46 74 73 35 53 74 72 75 63 74 75  ment Fts5Structu
2600: 72 65 53 65 67 6d 65 6e 74 3b 0a 0a 73 74 72 75  reSegment;..stru
2610: 63 74 20 46 74 73 35 44 61 74 61 20 7b 0a 20 20  ct Fts5Data {.  
2620: 75 38 20 2a 70 3b 20 20 20 20 20 20 20 20 20 20  u8 *p;          
2630: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2640: 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 62 75  /* Pointer to bu
2650: 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20  ffer containing 
2660: 72 65 63 6f 72 64 20 2a 2f 0a 20 20 69 6e 74 20  record */.  int 
2670: 6e 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  nn;             
2680: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
2690: 69 7a 65 20 6f 66 20 72 65 63 6f 72 64 20 69 6e  ize of record in
26a0: 20 62 79 74 65 73 20 2a 2f 0a 20 20 69 6e 74 20   bytes */.  int 
26b0: 73 7a 4c 65 61 66 3b 20 20 20 20 20 20 20 20 20  szLeaf;         
26c0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
26d0: 69 7a 65 20 6f 66 20 6c 65 61 66 20 77 69 74 68  ize of leaf with
26e0: 6f 75 74 20 70 61 67 65 2d 69 6e 64 65 78 20 2a  out page-index *
26f0: 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 4f 6e 65 20  /.};../*.** One 
2700: 6f 62 6a 65 63 74 20 70 65 72 20 25 5f 64 61 74  object per %_dat
2710: 61 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 72 75  a table..*/.stru
2720: 63 74 20 46 74 73 35 49 6e 64 65 78 20 7b 0a 20  ct Fts5Index {. 
2730: 20 46 74 73 35 43 6f 6e 66 69 67 20 2a 70 43 6f   Fts5Config *pCo
2740: 6e 66 69 67 3b 20 20 20 20 20 20 20 20 20 20 20  nfig;           
2750: 20 2f 2a 20 56 69 72 74 75 61 6c 20 74 61 62 6c   /* Virtual tabl
2760: 65 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20  e configuration 
2770: 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 44 61 74 61  */.  char *zData
2780: 54 62 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  Tbl;            
2790: 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
27a0: 25 5f 64 61 74 61 20 74 61 62 6c 65 20 2a 2f 0a  %_data table */.
27b0: 20 20 69 6e 74 20 6e 57 6f 72 6b 55 6e 69 74 3b    int nWorkUnit;
27c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27d0: 20 20 2f 2a 20 4c 65 61 66 20 70 61 67 65 73 20    /* Leaf pages 
27e0: 69 6e 20 61 20 22 75 6e 69 74 22 20 6f 66 20 77  in a "unit" of w
27f0: 6f 72 6b 20 2a 2f 0a 0a 20 20 2f 2a 0a 20 20 2a  ork */..  /*.  *
2800: 2a 20 56 61 72 69 61 62 6c 65 73 20 72 65 6c 61  * Variables rela
2810: 74 65 64 20 74 6f 20 74 68 65 20 61 63 63 75 6d  ted to the accum
2820: 75 6c 61 74 69 6f 6e 20 6f 66 20 74 6f 6b 65 6e  ulation of token
2830: 73 20 61 6e 64 20 64 6f 63 6c 69 73 74 73 20 77  s and doclists w
2840: 69 74 68 69 6e 20 74 68 65 0a 20 20 2a 2a 20 69  ithin the.  ** i
2850: 6e 2d 6d 65 6d 6f 72 79 20 68 61 73 68 20 74 61  n-memory hash ta
2860: 62 6c 65 73 20 62 65 66 6f 72 65 20 74 68 65 79  bles before they
2870: 20 61 72 65 20 66 6c 75 73 68 65 64 20 74 6f 20   are flushed to 
2880: 64 69 73 6b 2e 0a 20 20 2a 2f 0a 20 20 46 74 73  disk..  */.  Fts
2890: 35 48 61 73 68 20 2a 70 48 61 73 68 3b 20 20 20  5Hash *pHash;   
28a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
28b0: 48 61 73 68 20 74 61 62 6c 65 20 66 6f 72 20 69  Hash table for i
28c0: 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 20 2a 2f  n-memory data */
28d0: 0a 20 20 69 6e 74 20 6e 50 65 6e 64 69 6e 67 44  .  int nPendingD
28e0: 61 74 61 3b 20 20 20 20 20 20 20 20 20 20 20 20  ata;            
28f0: 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 62 79     /* Current by
2900: 74 65 73 20 6f 66 20 70 65 6e 64 69 6e 67 20 64  tes of pending d
2910: 61 74 61 20 2a 2f 0a 20 20 69 36 34 20 69 57 72  ata */.  i64 iWr
2920: 69 74 65 52 6f 77 69 64 3b 20 20 20 20 20 20 20  iteRowid;       
2930: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 77 69           /* Rowi
2940: 64 20 66 6f 72 20 63 75 72 72 65 6e 74 20 64 6f  d for current do
2950: 63 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e 20  c being written 
2960: 2a 2f 0a 20 20 69 6e 74 20 62 44 65 6c 65 74 65  */.  int bDelete
2970: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2980: 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20       /* Current 
2990: 77 72 69 74 65 20 69 73 20 61 20 64 65 6c 65 74  write is a delet
29a0: 65 20 2a 2f 0a 0a 20 20 2f 2a 20 45 72 72 6f 72  e */..  /* Error
29b0: 20 73 74 61 74 65 2e 20 2a 2f 0a 20 20 69 6e 74   state. */.  int
29c0: 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
29d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
29e0: 43 75 72 72 65 6e 74 20 65 72 72 6f 72 20 63 6f  Current error co
29f0: 64 65 20 2a 2f 0a 0a 20 20 2f 2a 20 53 74 61 74  de */..  /* Stat
2a00: 65 20 75 73 65 64 20 62 79 20 74 68 65 20 66 74  e used by the ft
2a10: 73 35 44 61 74 61 58 58 58 28 29 20 66 75 6e 63  s5DataXXX() func
2a20: 74 69 6f 6e 73 2e 20 2a 2f 0a 20 20 73 71 6c 69  tions. */.  sqli
2a30: 74 65 33 5f 62 6c 6f 62 20 2a 70 52 65 61 64 65  te3_blob *pReade
2a40: 72 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52  r;          /* R
2a50: 4f 20 69 6e 63 72 2d 62 6c 6f 62 20 6f 70 65 6e  O incr-blob open
2a60: 20 6f 6e 20 25 5f 64 61 74 61 20 74 61 62 6c 65   on %_data table
2a70: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 74   */.  sqlite3_st
2a80: 6d 74 20 2a 70 57 72 69 74 65 72 3b 20 20 20 20  mt *pWriter;    
2a90: 20 20 20 20 20 20 2f 2a 20 22 49 4e 53 45 52 54        /* "INSERT
2aa0: 20 2e 2e 2e 20 25 5f 64 61 74 61 20 56 41 4c 55   ... %_data VALU
2ab0: 45 53 28 3f 2c 3f 29 22 20 2a 2f 0a 20 20 73 71  ES(?,?)" */.  sq
2ac0: 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 44 65 6c  lite3_stmt *pDel
2ad0: 65 74 65 72 3b 20 20 20 20 20 20 20 20 20 2f 2a  eter;         /*
2ae0: 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 25 5f   "DELETE FROM %_
2af0: 64 61 74 61 20 2e 2e 2e 20 69 64 3e 3d 3f 20 41  data ... id>=? A
2b00: 4e 44 20 69 64 3c 3d 3f 22 20 2a 2f 0a 20 20 73  ND id<=?" */.  s
2b10: 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 49 64  qlite3_stmt *pId
2b20: 78 57 72 69 74 65 72 3b 20 20 20 20 20 20 20 2f  xWriter;       /
2b30: 2a 20 22 49 4e 53 45 52 54 20 2e 2e 2e 20 25 5f  * "INSERT ... %_
2b40: 69 64 78 20 56 41 4c 55 45 53 28 3f 2c 3f 2c 3f  idx VALUES(?,?,?
2b50: 2c 3f 29 22 20 2a 2f 0a 20 20 73 71 6c 69 74 65  ,?)" */.  sqlite
2b60: 33 5f 73 74 6d 74 20 2a 70 49 64 78 44 65 6c 65  3_stmt *pIdxDele
2b70: 74 65 72 3b 20 20 20 20 20 20 2f 2a 20 22 44 45  ter;      /* "DE
2b80: 4c 45 54 45 20 46 52 4f 4d 20 25 5f 69 64 78 20  LETE FROM %_idx 
2b90: 57 48 45 52 45 20 73 65 67 69 64 3d 3f 20 2a 2f  WHERE segid=? */
2ba0: 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20  .  sqlite3_stmt 
2bb0: 2a 70 49 64 78 53 65 6c 65 63 74 3b 0a 20 20 69  *pIdxSelect;.  i
2bc0: 6e 74 20 6e 52 65 61 64 3b 20 20 20 20 20 20 20  nt nRead;       
2bd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2be0: 2a 20 54 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f  * Total number o
2bf0: 66 20 62 6c 6f 63 6b 73 20 72 65 61 64 20 2a 2f  f blocks read */
2c00: 0a 7d 3b 0a 0a 73 74 72 75 63 74 20 46 74 73 35  .};..struct Fts5
2c10: 44 6f 63 6c 69 73 74 49 74 65 72 20 7b 0a 20 20  DoclistIter {.  
2c20: 75 38 20 2a 61 45 6f 66 3b 20 20 20 20 20 20 20  u8 *aEof;       
2c30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c40: 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 31 20  /* Pointer to 1 
2c50: 62 79 74 65 20 70 61 73 74 20 65 6e 64 20 6f 66  byte past end of
2c60: 20 64 6f 63 6c 69 73 74 20 2a 2f 0a 0a 20 20 2f   doclist */..  /
2c70: 2a 20 4f 75 74 70 75 74 20 76 61 72 69 61 62 6c  * Output variabl
2c80: 65 73 2e 20 61 50 6f 73 6c 69 73 74 3d 3d 30 20  es. aPoslist==0 
2c90: 61 74 20 45 4f 46 20 2a 2f 0a 20 20 69 36 34 20  at EOF */.  i64 
2ca0: 69 52 6f 77 69 64 3b 0a 20 20 75 38 20 2a 61 50  iRowid;.  u8 *aP
2cb0: 6f 73 6c 69 73 74 3b 0a 20 20 69 6e 74 20 6e 50  oslist;.  int nP
2cc0: 6f 73 6c 69 73 74 3b 0a 20 20 69 6e 74 20 6e 53  oslist;.  int nS
2cd0: 69 7a 65 3b 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54  ize;.};../*.** T
2ce0: 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  he contents of t
2cf0: 68 65 20 22 73 74 72 75 63 74 75 72 65 22 20 72  he "structure" r
2d00: 65 63 6f 72 64 20 66 6f 72 20 65 61 63 68 20 69  ecord for each i
2d10: 6e 64 65 78 20 61 72 65 20 72 65 70 72 65 73 65  ndex are represe
2d20: 6e 74 65 64 0a 2a 2a 20 75 73 69 6e 67 20 61 6e  nted.** using an
2d30: 20 46 74 73 35 53 74 72 75 63 74 75 72 65 20 72   Fts5Structure r
2d40: 65 63 6f 72 64 20 69 6e 20 6d 65 6d 6f 72 79 2e  ecord in memory.
2d50: 20 57 68 69 63 68 20 75 73 65 73 20 69 6e 73 74   Which uses inst
2d60: 61 6e 63 65 73 20 6f 66 20 74 68 65 20 0a 2a 2a  ances of the .**
2d70: 20 6f 74 68 65 72 20 46 74 73 35 53 74 72 75 63   other Fts5Struc
2d80: 74 75 72 65 58 58 58 20 74 79 70 65 73 20 61 73  tureXXX types as
2d90: 20 63 6f 6d 70 6f 6e 65 6e 74 73 2e 0a 2a 2f 0a   components..*/.
2da0: 73 74 72 75 63 74 20 46 74 73 35 53 74 72 75 63  struct Fts5Struc
2db0: 74 75 72 65 53 65 67 6d 65 6e 74 20 7b 0a 20 20  tureSegment {.  
2dc0: 69 6e 74 20 69 53 65 67 69 64 3b 20 20 20 20 20  int iSegid;     
2dd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2de0: 2f 2a 20 53 65 67 6d 65 6e 74 20 69 64 20 2a 2f  /* Segment id */
2df0: 0a 20 20 69 6e 74 20 70 67 6e 6f 46 69 72 73 74  .  int pgnoFirst
2e00: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2e10: 20 20 20 2f 2a 20 46 69 72 73 74 20 6c 65 61 66     /* First leaf
2e20: 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 6e 20   page number in 
2e30: 73 65 67 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74  segment */.  int
2e40: 20 70 67 6e 6f 4c 61 73 74 3b 20 20 20 20 20 20   pgnoLast;      
2e50: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2e60: 4c 61 73 74 20 6c 65 61 66 20 70 61 67 65 20 6e  Last leaf page n
2e70: 75 6d 62 65 72 20 69 6e 20 73 65 67 6d 65 6e 74  umber in segment
2e80: 20 2a 2f 0a 7d 3b 0a 73 74 72 75 63 74 20 46 74   */.};.struct Ft
2e90: 73 35 53 74 72 75 63 74 75 72 65 4c 65 76 65 6c  s5StructureLevel
2ea0: 20 7b 0a 20 20 69 6e 74 20 6e 4d 65 72 67 65 3b   {.  int nMerge;
2eb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ec0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
2ed0: 66 20 73 65 67 6d 65 6e 74 73 20 69 6e 20 69 6e  f segments in in
2ee0: 63 72 2d 6d 65 72 67 65 20 2a 2f 0a 20 20 69 6e  cr-merge */.  in
2ef0: 74 20 6e 53 65 67 3b 20 20 20 20 20 20 20 20 20  t nSeg;         
2f00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2f10: 20 54 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66   Total number of
2f20: 20 73 65 67 6d 65 6e 74 73 20 6f 6e 20 6c 65 76   segments on lev
2f30: 65 6c 20 2a 2f 0a 20 20 46 74 73 35 53 74 72 75  el */.  Fts5Stru
2f40: 63 74 75 72 65 53 65 67 6d 65 6e 74 20 2a 61 53  ctureSegment *aS
2f50: 65 67 3b 20 20 20 20 20 2f 2a 20 41 72 72 61 79  eg;     /* Array
2f60: 20 6f 66 20 73 65 67 6d 65 6e 74 73 2e 20 61 53   of segments. aS
2f70: 65 67 5b 30 5d 20 69 73 20 6f 6c 64 65 73 74 2e  eg[0] is oldest.
2f80: 20 2a 2f 0a 7d 3b 0a 73 74 72 75 63 74 20 46 74   */.};.struct Ft
2f90: 73 35 53 74 72 75 63 74 75 72 65 20 7b 0a 20 20  s5Structure {.  
2fa0: 69 6e 74 20 6e 52 65 66 3b 20 20 20 20 20 20 20  int nRef;       
2fb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2fc0: 2f 2a 20 4f 62 6a 65 63 74 20 72 65 66 65 72 65  /* Object refere
2fd0: 6e 63 65 20 63 6f 75 6e 74 20 2a 2f 0a 20 20 75  nce count */.  u
2fe0: 36 34 20 6e 57 72 69 74 65 43 6f 75 6e 74 65 72  64 nWriteCounter
2ff0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
3000: 2a 20 54 6f 74 61 6c 20 6c 65 61 76 65 73 20 77  * Total leaves w
3010: 72 69 74 74 65 6e 20 74 6f 20 6c 65 76 65 6c 20  ritten to level 
3020: 30 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 65 67 6d  0 */.  int nSegm
3030: 65 6e 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  ent;            
3040: 20 20 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20         /* Total 
3050: 73 65 67 6d 65 6e 74 73 20 69 6e 20 74 68 69 73  segments in this
3060: 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20   structure */.  
3070: 69 6e 74 20 6e 4c 65 76 65 6c 3b 20 20 20 20 20  int nLevel;     
3080: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3090: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6c 65 76  /* Number of lev
30a0: 65 6c 73 20 69 6e 20 74 68 69 73 20 69 6e 64 65  els in this inde
30b0: 78 20 2a 2f 0a 20 20 46 74 73 35 53 74 72 75 63  x */.  Fts5Struc
30c0: 74 75 72 65 4c 65 76 65 6c 20 61 4c 65 76 65 6c  tureLevel aLevel
30d0: 5b 31 5d 3b 20 20 20 2f 2a 20 41 72 72 61 79 20  [1];   /* Array 
30e0: 6f 66 20 6e 4c 65 76 65 6c 20 6c 65 76 65 6c 20  of nLevel level 
30f0: 6f 62 6a 65 63 74 73 20 2a 2f 0a 7d 3b 0a 0a 2f  objects */.};../
3100: 2a 0a 2a 2a 20 41 6e 20 6f 62 6a 65 63 74 20 6f  *.** An object o
3110: 66 20 74 79 70 65 20 46 74 73 35 53 65 67 57 72  f type Fts5SegWr
3120: 69 74 65 72 20 69 73 20 75 73 65 64 20 74 6f 20  iter is used to 
3130: 77 72 69 74 65 20 74 6f 20 73 65 67 6d 65 6e 74  write to segment
3140: 73 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 46 74 73  s..*/.struct Fts
3150: 35 50 61 67 65 57 72 69 74 65 72 20 7b 0a 20 20  5PageWriter {.  
3160: 69 6e 74 20 70 67 6e 6f 3b 20 20 20 20 20 20 20  int pgno;       
3170: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3180: 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20 66  /* Page number f
3190: 6f 72 20 74 68 69 73 20 70 61 67 65 20 2a 2f 0a  or this page */.
31a0: 20 20 69 6e 74 20 69 50 72 65 76 50 67 69 64 78    int iPrevPgidx
31b0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
31c0: 20 20 2f 2a 20 50 72 65 76 69 6f 75 73 20 76 61    /* Previous va
31d0: 6c 75 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f  lue written into
31e0: 20 70 67 69 64 78 20 2a 2f 0a 20 20 46 74 73 35   pgidx */.  Fts5
31f0: 42 75 66 66 65 72 20 62 75 66 3b 20 20 20 20 20  Buffer buf;     
3200: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42              /* B
3210: 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67  uffer containing
3220: 20 6c 65 61 66 20 64 61 74 61 20 2a 2f 0a 20 20   leaf data */.  
3230: 46 74 73 35 42 75 66 66 65 72 20 70 67 69 64 78  Fts5Buffer pgidx
3240: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
3250: 2f 2a 20 42 75 66 66 65 72 20 63 6f 6e 74 61 69  /* Buffer contai
3260: 6e 69 6e 67 20 70 61 67 65 2d 69 6e 64 65 78 20  ning page-index 
3270: 2a 2f 0a 20 20 46 74 73 35 42 75 66 66 65 72 20  */.  Fts5Buffer 
3280: 74 65 72 6d 3b 20 20 20 20 20 20 20 20 20 20 20  term;           
3290: 20 20 20 20 20 2f 2a 20 42 75 66 66 65 72 20 63       /* Buffer c
32a0: 6f 6e 74 61 69 6e 69 6e 67 20 70 72 65 76 69 6f  ontaining previo
32b0: 75 73 20 74 65 72 6d 20 6f 6e 20 70 61 67 65 20  us term on page 
32c0: 2a 2f 0a 7d 3b 0a 73 74 72 75 63 74 20 46 74 73  */.};.struct Fts
32d0: 35 44 6c 69 64 78 57 72 69 74 65 72 20 7b 0a 20  5DlidxWriter {. 
32e0: 20 69 6e 74 20 70 67 6e 6f 3b 20 20 20 20 20 20   int pgno;      
32f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3300: 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20   /* Page number 
3310: 66 6f 72 20 74 68 69 73 20 70 61 67 65 20 2a 2f  for this page */
3320: 0a 20 20 69 6e 74 20 62 50 72 65 76 56 61 6c 69  .  int bPrevVali
3330: 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d;              
3340: 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 69 50     /* True if iP
3350: 72 65 76 20 69 73 20 76 61 6c 69 64 20 2a 2f 0a  rev is valid */.
3360: 20 20 69 36 34 20 69 50 72 65 76 3b 20 20 20 20    i64 iPrev;    
3370: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3380: 20 20 2f 2a 20 50 72 65 76 69 6f 75 73 20 72 6f    /* Previous ro
3390: 77 69 64 20 76 61 6c 75 65 20 77 72 69 74 74 65  wid value writte
33a0: 6e 20 74 6f 20 70 61 67 65 20 2a 2f 0a 20 20 46  n to page */.  F
33b0: 74 73 35 42 75 66 66 65 72 20 62 75 66 3b 20 20  ts5Buffer buf;  
33c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
33d0: 2a 20 42 75 66 66 65 72 20 63 6f 6e 74 61 69 6e  * Buffer contain
33e0: 69 6e 67 20 70 61 67 65 20 64 61 74 61 20 2a 2f  ing page data */
33f0: 0a 7d 3b 0a 73 74 72 75 63 74 20 46 74 73 35 53  .};.struct Fts5S
3400: 65 67 57 72 69 74 65 72 20 7b 0a 20 20 69 6e 74  egWriter {.  int
3410: 20 69 53 65 67 69 64 3b 20 20 20 20 20 20 20 20   iSegid;        
3420: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3430: 53 65 67 69 64 20 74 6f 20 77 72 69 74 65 20 74  Segid to write t
3440: 6f 20 2a 2f 0a 20 20 46 74 73 35 50 61 67 65 57  o */.  Fts5PageW
3450: 72 69 74 65 72 20 77 72 69 74 65 72 3b 20 20 20  riter writer;   
3460: 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 57 72         /* PageWr
3470: 69 74 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20  iter object */. 
3480: 20 69 36 34 20 69 50 72 65 76 52 6f 77 69 64 3b   i64 iPrevRowid;
3490: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34a0: 20 2f 2a 20 50 72 65 76 69 6f 75 73 20 72 6f 77   /* Previous row
34b0: 69 64 20 77 72 69 74 74 65 6e 20 74 6f 20 63 75  id written to cu
34c0: 72 72 65 6e 74 20 6c 65 61 66 20 2a 2f 0a 20 20  rrent leaf */.  
34d0: 75 38 20 62 46 69 72 73 74 52 6f 77 69 64 49 6e  u8 bFirstRowidIn
34e0: 44 6f 63 6c 69 73 74 3b 20 20 20 20 20 20 20 20  Doclist;        
34f0: 2f 2a 20 54 72 75 65 20 69 66 20 6e 65 78 74 20  /* True if next 
3500: 72 6f 77 69 64 20 69 73 20 66 69 72 73 74 20 69  rowid is first i
3510: 6e 20 64 6f 63 6c 69 73 74 20 2a 2f 0a 20 20 75  n doclist */.  u
3520: 38 20 62 46 69 72 73 74 52 6f 77 69 64 49 6e 50  8 bFirstRowidInP
3530: 61 67 65 3b 20 20 20 20 20 20 20 20 20 20 20 2f  age;           /
3540: 2a 20 54 72 75 65 20 69 66 20 6e 65 78 74 20 72  * True if next r
3550: 6f 77 69 64 20 69 73 20 66 69 72 73 74 20 69 6e  owid is first in
3560: 20 70 61 67 65 20 2a 2f 0a 20 20 2f 2a 20 54 4f   page */.  /* TO
3570: 44 4f 31 3a 20 43 61 6e 20 75 73 65 20 28 77 72  DO1: Can use (wr
3580: 69 74 65 72 2e 70 67 69 64 78 2e 6e 3d 3d 30 29  iter.pgidx.n==0)
3590: 20 69 6e 73 74 65 61 64 20 6f 66 20 62 46 69 72   instead of bFir
35a0: 73 74 54 65 72 6d 49 6e 50 61 67 65 20 2a 2f 0a  stTermInPage */.
35b0: 20 20 75 38 20 62 46 69 72 73 74 54 65 72 6d 49    u8 bFirstTermI
35c0: 6e 50 61 67 65 3b 20 20 20 20 20 20 20 20 20 20  nPage;          
35d0: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 6e 65 78    /* True if nex
35e0: 74 20 74 65 72 6d 20 77 69 6c 6c 20 62 65 20 66  t term will be f
35f0: 69 72 73 74 20 69 6e 20 6c 65 61 66 20 2a 2f 0a  irst in leaf */.
3600: 20 20 69 6e 74 20 6e 4c 65 61 66 57 72 69 74 74    int nLeafWritt
3610: 65 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  en;             
3620: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6c    /* Number of l
3630: 65 61 66 20 70 61 67 65 73 20 77 72 69 74 74 65  eaf pages writte
3640: 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 6d 70 74  n */.  int nEmpt
3650: 79 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  y;              
3660: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
3670: 20 6f 66 20 63 6f 6e 74 69 67 75 6f 75 73 20 74   of contiguous t
3680: 65 72 6d 2d 6c 65 73 73 20 6e 6f 64 65 73 20 2a  erm-less nodes *
3690: 2f 0a 0a 20 20 69 6e 74 20 6e 44 6c 69 64 78 3b  /..  int nDlidx;
36a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36b0: 20 20 20 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65       /* Allocate
36c0: 64 20 73 69 7a 65 20 6f 66 20 61 44 6c 69 64 78  d size of aDlidx
36d0: 5b 5d 20 61 72 72 61 79 20 2a 2f 0a 20 20 46 74  [] array */.  Ft
36e0: 73 35 44 6c 69 64 78 57 72 69 74 65 72 20 2a 61  s5DlidxWriter *a
36f0: 44 6c 69 64 78 3b 20 20 20 20 20 20 20 20 2f 2a  Dlidx;        /*
3700: 20 41 72 72 61 79 20 6f 66 20 46 74 73 35 44 6c   Array of Fts5Dl
3710: 69 64 78 57 72 69 74 65 72 20 6f 62 6a 65 63 74  idxWriter object
3720: 73 20 2a 2f 0a 0a 20 20 2f 2a 20 56 61 6c 75 65  s */..  /* Value
3730: 73 20 74 6f 20 69 6e 73 65 72 74 20 69 6e 74 6f  s to insert into
3740: 20 74 68 65 20 25 5f 69 64 78 20 74 61 62 6c 65   the %_idx table
3750: 20 2a 2f 0a 20 20 46 74 73 35 42 75 66 66 65 72   */.  Fts5Buffer
3760: 20 62 74 74 65 72 6d 3b 20 20 20 20 20 20 20 20   btterm;        
3770: 20 20 20 20 20 20 2f 2a 20 4e 65 78 74 20 74 65        /* Next te
3780: 72 6d 20 74 6f 20 69 6e 73 65 72 74 20 69 6e 74  rm to insert int
3790: 6f 20 25 5f 69 64 78 20 74 61 62 6c 65 20 2a 2f  o %_idx table */
37a0: 0a 20 20 69 6e 74 20 69 42 74 50 61 67 65 3b 20  .  int iBtPage; 
37b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37c0: 20 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65     /* Page numbe
37d0: 72 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  r corresponding 
37e0: 74 6f 20 62 74 74 65 72 6d 20 2a 2f 0a 7d 3b 0a  to btterm */.};.
37f0: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
3800: 46 74 73 35 43 52 65 73 75 6c 74 20 46 74 73 35  Fts5CResult Fts5
3810: 43 52 65 73 75 6c 74 3b 0a 73 74 72 75 63 74 20  CResult;.struct 
3820: 46 74 73 35 43 52 65 73 75 6c 74 20 7b 0a 20 20  Fts5CResult {.  
3830: 75 31 36 20 69 46 69 72 73 74 3b 20 20 20 20 20  u16 iFirst;     
3840: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3850: 2f 2a 20 61 53 65 67 5b 5d 20 69 6e 64 65 78 20  /* aSeg[] index 
3860: 6f 66 20 66 69 72 73 74 65 73 74 20 69 74 65 72  of firstest iter
3870: 61 74 6f 72 20 2a 2f 0a 20 20 75 38 20 62 54 65  ator */.  u8 bTe
3880: 72 6d 45 71 3b 20 20 20 20 20 20 20 20 20 20 20  rmEq;           
3890: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
38a0: 65 20 69 66 20 74 68 65 20 74 65 72 6d 73 20 61  e if the terms a
38b0: 72 65 20 65 71 75 61 6c 20 2a 2f 0a 7d 3b 0a 0a  re equal */.};..
38c0: 2f 2a 0a 2a 2a 20 4f 62 6a 65 63 74 20 66 6f 72  /*.** Object for
38d0: 20 69 74 65 72 61 74 69 6e 67 20 74 68 72 6f 75   iterating throu
38e0: 67 68 20 61 20 73 69 6e 67 6c 65 20 73 65 67 6d  gh a single segm
38f0: 65 6e 74 2c 20 76 69 73 69 74 69 6e 67 20 65 61  ent, visiting ea
3900: 63 68 20 74 65 72 6d 2f 72 6f 77 69 64 0a 2a 2a  ch term/rowid.**
3910: 20 70 61 69 72 20 69 6e 20 74 68 65 20 73 65 67   pair in the seg
3920: 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 70 53 65 67  ment..**.** pSeg
3930: 3a 0a 2a 2a 20 20 20 54 68 65 20 73 65 67 6d 65  :.**   The segme
3940: 6e 74 20 74 6f 20 69 74 65 72 61 74 65 20 74 68  nt to iterate th
3950: 72 6f 75 67 68 2e 0a 2a 2a 0a 2a 2a 20 69 4c 65  rough..**.** iLe
3960: 61 66 50 67 6e 6f 3a 0a 2a 2a 20 20 20 43 75 72  afPgno:.**   Cur
3970: 72 65 6e 74 20 6c 65 61 66 20 70 61 67 65 20 6e  rent leaf page n
3980: 75 6d 62 65 72 20 77 69 74 68 69 6e 20 73 65 67  umber within seg
3990: 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 69 4c 65 61  ment..**.** iLea
39a0: 66 4f 66 66 73 65 74 3a 0a 2a 2a 20 20 20 42 79  fOffset:.**   By
39b0: 74 65 20 6f 66 66 73 65 74 20 77 69 74 68 69 6e  te offset within
39c0: 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c 65 61   the current lea
39d0: 66 20 74 68 61 74 20 69 73 20 74 68 65 20 66 69  f that is the fi
39e0: 72 73 74 20 62 79 74 65 20 6f 66 20 74 68 65 20  rst byte of the 
39f0: 0a 2a 2a 20 20 20 70 6f 73 69 74 69 6f 6e 20 6c  .**   position l
3a00: 69 73 74 20 64 61 74 61 20 28 6f 6e 65 20 62 79  ist data (one by
3a10: 74 65 20 70 61 73 73 65 64 20 74 68 65 20 70 6f  te passed the po
3a20: 73 69 74 69 6f 6e 2d 6c 69 73 74 20 73 69 7a 65  sition-list size
3a30: 20 66 69 65 6c 64 29 2e 0a 2a 2a 20 20 20 72 6f   field)..**   ro
3a40: 77 69 64 20 66 69 65 6c 64 20 6f 66 20 74 68 65  wid field of the
3a50: 20 63 75 72 72 65 6e 74 20 65 6e 74 72 79 2e 20   current entry. 
3a60: 55 73 75 61 6c 6c 79 20 74 68 69 73 20 69 73 20  Usually this is 
3a70: 74 68 65 20 73 69 7a 65 20 66 69 65 6c 64 20 6f  the size field o
3a80: 66 20 74 68 65 0a 2a 2a 20 20 20 70 6f 73 69 74  f the.**   posit
3a90: 69 6f 6e 20 6c 69 73 74 20 64 61 74 61 2e 20 54  ion list data. T
3aa0: 68 65 20 65 78 63 65 70 74 69 6f 6e 20 69 73 20  he exception is 
3ab0: 69 66 20 74 68 65 20 72 6f 77 69 64 20 66 6f 72  if the rowid for
3ac0: 20 74 68 65 20 63 75 72 72 65 6e 74 20 65 6e 74   the current ent
3ad0: 72 79 20 0a 2a 2a 20 20 20 69 73 20 74 68 65 20  ry .**   is the 
3ae0: 6c 61 73 74 20 74 68 69 6e 67 20 6f 6e 20 74 68  last thing on th
3af0: 65 20 6c 65 61 66 20 70 61 67 65 2e 0a 2a 2a 0a  e leaf page..**.
3b00: 2a 2a 20 70 4c 65 61 66 3a 0a 2a 2a 20 20 20 42  ** pLeaf:.**   B
3b10: 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67  uffer containing
3b20: 20 63 75 72 72 65 6e 74 20 6c 65 61 66 20 70 61   current leaf pa
3b30: 67 65 20 64 61 74 61 2e 20 53 65 74 20 74 6f 20  ge data. Set to 
3b40: 4e 55 4c 4c 20 61 74 20 45 4f 46 2e 0a 2a 2a 0a  NULL at EOF..**.
3b50: 2a 2a 20 69 54 65 72 6d 4c 65 61 66 50 67 6e 6f  ** iTermLeafPgno
3b60: 2c 20 69 54 65 72 6d 4c 65 61 66 4f 66 66 73 65  , iTermLeafOffse
3b70: 74 3a 0a 2a 2a 20 20 20 4c 65 61 66 20 70 61 67  t:.**   Leaf pag
3b80: 65 20 6e 75 6d 62 65 72 20 63 6f 6e 74 61 69 6e  e number contain
3b90: 69 6e 67 20 74 68 65 20 6c 61 73 74 20 74 65 72  ing the last ter
3ba0: 6d 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20  m read from the 
3bb0: 73 65 67 6d 65 6e 74 2e 20 41 6e 64 0a 2a 2a 20  segment. And.** 
3bc0: 20 20 74 68 65 20 6f 66 66 73 65 74 20 69 6d 6d    the offset imm
3bd0: 65 64 69 61 74 65 6c 79 20 66 6f 6c 6c 6f 77 69  ediately followi
3be0: 6e 67 20 74 68 65 20 74 65 72 6d 20 64 61 74 61  ng the term data
3bf0: 2e 0a 2a 2a 0a 2a 2a 20 66 6c 61 67 73 3a 0a 2a  ..**.** flags:.*
3c00: 2a 20 20 20 4d 61 73 6b 20 6f 66 20 46 54 53 35  *   Mask of FTS5
3c10: 5f 53 45 47 49 54 45 52 5f 58 58 58 20 76 61 6c  _SEGITER_XXX val
3c20: 75 65 73 2e 20 49 6e 74 65 72 70 72 65 74 65 64  ues. Interpreted
3c30: 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a   as follows:.**.
3c40: 2a 2a 20 20 20 46 54 53 35 5f 53 45 47 49 54 45  **   FTS5_SEGITE
3c50: 52 5f 4f 4e 45 54 45 52 4d 3a 0a 2a 2a 20 20 20  R_ONETERM:.**   
3c60: 20 20 49 66 20 73 65 74 2c 20 73 65 74 20 74 68    If set, set th
3c70: 65 20 69 74 65 72 61 74 6f 72 20 74 6f 20 70 6f  e iterator to po
3c80: 69 6e 74 20 74 6f 20 45 4f 46 20 61 66 74 65 72  int to EOF after
3c90: 20 74 68 65 20 63 75 72 72 65 6e 74 20 64 6f 63   the current doc
3ca0: 6c 69 73 74 20 0a 2a 2a 20 20 20 20 20 68 61 73  list .**     has
3cb0: 20 62 65 65 6e 20 65 78 68 61 75 73 74 65 64 2e   been exhausted.
3cc0: 20 44 6f 20 6e 6f 74 20 70 72 6f 63 65 65 64 20   Do not proceed 
3cd0: 74 6f 20 74 68 65 20 6e 65 78 74 20 74 65 72 6d  to the next term
3ce0: 20 69 6e 20 74 68 65 20 73 65 67 6d 65 6e 74 2e   in the segment.
3cf0: 0a 2a 2a 0a 2a 2a 20 20 20 46 54 53 35 5f 53 45  .**.**   FTS5_SE
3d00: 47 49 54 45 52 5f 52 45 56 45 52 53 45 3a 0a 2a  GITER_REVERSE:.*
3d10: 2a 20 20 20 20 20 54 68 69 73 20 66 6c 61 67 20  *     This flag 
3d20: 69 73 20 6f 6e 6c 79 20 65 76 65 72 20 73 65 74  is only ever set
3d30: 20 69 66 20 46 54 53 35 5f 53 45 47 49 54 45 52   if FTS5_SEGITER
3d40: 5f 4f 4e 45 54 45 52 4d 20 69 73 20 61 6c 73 6f  _ONETERM is also
3d50: 20 73 65 74 2e 20 49 66 0a 2a 2a 20 20 20 20 20   set. If.**     
3d60: 69 74 20 69 73 20 73 65 74 2c 20 69 74 65 72 61  it is set, itera
3d70: 74 65 20 74 68 72 6f 75 67 68 20 72 6f 77 69 64  te through rowid
3d80: 20 69 6e 20 64 65 73 63 65 6e 64 69 6e 67 20 6f   in descending o
3d90: 72 64 65 72 20 69 6e 73 74 65 61 64 20 6f 66 20  rder instead of 
3da0: 74 68 65 0a 2a 2a 20 20 20 20 20 64 65 66 61 75  the.**     defau
3db0: 6c 74 20 61 73 63 65 6e 64 69 6e 67 20 6f 72 64  lt ascending ord
3dc0: 65 72 2e 0a 2a 2a 0a 2a 2a 20 69 52 6f 77 69 64  er..**.** iRowid
3dd0: 4f 66 66 73 65 74 2f 6e 52 6f 77 69 64 4f 66 66  Offset/nRowidOff
3de0: 73 65 74 2f 61 52 6f 77 69 64 4f 66 66 73 65 74  set/aRowidOffset
3df0: 3a 0a 2a 2a 20 20 20 20 20 54 68 65 73 65 20 61  :.**     These a
3e00: 72 65 20 75 73 65 64 20 69 66 20 74 68 65 20 46  re used if the F
3e10: 54 53 35 5f 53 45 47 49 54 45 52 5f 52 45 56 45  TS5_SEGITER_REVE
3e20: 52 53 45 20 66 6c 61 67 20 69 73 20 73 65 74 2e  RSE flag is set.
3e30: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 46 6f 72 20 65  .**.**     For e
3e40: 61 63 68 20 72 6f 77 69 64 20 6f 6e 20 74 68 65  ach rowid on the
3e50: 20 70 61 67 65 20 63 6f 72 72 65 73 70 6f 6e 64   page correspond
3e60: 69 6e 67 20 74 6f 20 74 68 65 20 63 75 72 72 65  ing to the curre
3e70: 6e 74 20 74 65 72 6d 2c 20 74 68 65 0a 2a 2a 20  nt term, the.** 
3e80: 20 20 20 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e      correspondin
3e90: 67 20 61 52 6f 77 69 64 4f 66 66 73 65 74 5b 5d  g aRowidOffset[]
3ea0: 20 65 6e 74 72 79 20 69 73 20 73 65 74 20 74 6f   entry is set to
3eb0: 20 74 68 65 20 62 79 74 65 20 6f 66 66 73 65 74   the byte offset
3ec0: 20 6f 66 20 74 68 65 0a 2a 2a 20 20 20 20 20 73   of the.**     s
3ed0: 74 61 72 74 20 6f 66 20 74 68 65 20 22 70 6f 73  tart of the "pos
3ee0: 69 74 69 6f 6e 2d 6c 69 73 74 2d 73 69 7a 65 22  ition-list-size"
3ef0: 20 66 69 65 6c 64 20 77 69 74 68 69 6e 20 74 68   field within th
3f00: 65 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 69 54  e page..**.** iT
3f10: 65 72 6d 49 64 78 3a 0a 2a 2a 20 20 20 20 20 49  ermIdx:.**     I
3f20: 6e 64 65 78 20 6f 66 20 63 75 72 72 65 6e 74 20  ndex of current 
3f30: 74 65 72 6d 20 6f 6e 20 69 54 65 72 6d 4c 65 61  term on iTermLea
3f40: 66 50 67 6e 6f 2e 0a 2a 2f 0a 73 74 72 75 63 74  fPgno..*/.struct
3f50: 20 46 74 73 35 53 65 67 49 74 65 72 20 7b 0a 20   Fts5SegIter {. 
3f60: 20 46 74 73 35 53 74 72 75 63 74 75 72 65 53 65   Fts5StructureSe
3f70: 67 6d 65 6e 74 20 2a 70 53 65 67 3b 20 20 20 20  gment *pSeg;    
3f80: 20 2f 2a 20 53 65 67 6d 65 6e 74 20 74 6f 20 69   /* Segment to i
3f90: 74 65 72 61 74 65 20 74 68 72 6f 75 67 68 20 2a  terate through *
3fa0: 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 3b 20 20  /.  int flags;  
3fb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3fc0: 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 63      /* Mask of c
3fd0: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 66 6c 61  onfiguration fla
3fe0: 67 73 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 65 61  gs */.  int iLea
3ff0: 66 50 67 6e 6f 3b 20 20 20 20 20 20 20 20 20 20  fPgno;          
4000: 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65          /* Curre
4010: 6e 74 20 6c 65 61 66 20 70 61 67 65 20 6e 75 6d  nt leaf page num
4020: 62 65 72 20 2a 2f 0a 20 20 46 74 73 35 44 61 74  ber */.  Fts5Dat
4030: 61 20 2a 70 4c 65 61 66 3b 20 20 20 20 20 20 20  a *pLeaf;       
4040: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72           /* Curr
4050: 65 6e 74 20 6c 65 61 66 20 64 61 74 61 20 2a 2f  ent leaf data */
4060: 0a 20 20 46 74 73 35 44 61 74 61 20 2a 70 4e 65  .  Fts5Data *pNe
4070: 78 74 4c 65 61 66 3b 20 20 20 20 20 20 20 20 20  xtLeaf;         
4080: 20 20 20 2f 2a 20 4c 65 61 66 20 70 61 67 65 20     /* Leaf page 
4090: 28 69 4c 65 61 66 50 67 6e 6f 2b 31 29 20 2a 2f  (iLeafPgno+1) */
40a0: 0a 20 20 69 6e 74 20 69 4c 65 61 66 4f 66 66 73  .  int iLeafOffs
40b0: 65 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  et;             
40c0: 20 20 20 2f 2a 20 42 79 74 65 20 6f 66 66 73 65     /* Byte offse
40d0: 74 20 77 69 74 68 69 6e 20 63 75 72 72 65 6e 74  t within current
40e0: 20 6c 65 61 66 20 2a 2f 0a 0a 20 20 2f 2a 20 4e   leaf */..  /* N
40f0: 65 78 74 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20  ext method */.  
4100: 76 6f 69 64 20 28 2a 78 4e 65 78 74 29 28 46 74  void (*xNext)(Ft
4110: 73 35 49 6e 64 65 78 2a 2c 20 46 74 73 35 53 65  s5Index*, Fts5Se
4120: 67 49 74 65 72 2a 2c 20 69 6e 74 2a 29 3b 0a 0a  gIter*, int*);..
4130: 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20 61 6e    /* The page an
4140: 64 20 6f 66 66 73 65 74 20 66 72 6f 6d 20 77 68  d offset from wh
4150: 69 63 68 20 74 68 65 20 63 75 72 72 65 6e 74 20  ich the current 
4160: 74 65 72 6d 20 77 61 73 20 72 65 61 64 2e 20 54  term was read. T
4170: 68 65 20 6f 66 66 73 65 74 20 0a 20 20 2a 2a 20  he offset .  ** 
4180: 69 73 20 74 68 65 20 6f 66 66 73 65 74 20 6f 66  is the offset of
4190: 20 74 68 65 20 66 69 72 73 74 20 72 6f 77 69 64   the first rowid
41a0: 20 69 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20   in the current 
41b0: 64 6f 63 6c 69 73 74 2e 20 20 2a 2f 0a 20 20 69  doclist.  */.  i
41c0: 6e 74 20 69 54 65 72 6d 4c 65 61 66 50 67 6e 6f  nt iTermLeafPgno
41d0: 3b 0a 20 20 69 6e 74 20 69 54 65 72 6d 4c 65 61  ;.  int iTermLea
41e0: 66 4f 66 66 73 65 74 3b 0a 0a 20 20 69 6e 74 20  fOffset;..  int 
41f0: 69 50 67 69 64 78 4f 66 66 3b 20 20 20 20 20 20  iPgidxOff;      
4200: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
4210: 65 78 74 20 6f 66 66 73 65 74 20 69 6e 20 70 67  ext offset in pg
4220: 69 64 78 20 2a 2f 0a 20 20 69 6e 74 20 69 45 6e  idx */.  int iEn
4230: 64 6f 66 44 6f 63 6c 69 73 74 3b 0a 0a 20 20 2f  dofDoclist;..  /
4240: 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
4250: 61 72 65 20 6f 6e 6c 79 20 75 73 65 64 20 69 66  are only used if
4260: 20 74 68 65 20 46 54 53 35 5f 53 45 47 49 54 45   the FTS5_SEGITE
4270: 52 5f 52 45 56 45 52 53 45 20 66 6c 61 67 20 69  R_REVERSE flag i
4280: 73 20 73 65 74 2e 20 2a 2f 0a 20 20 69 6e 74 20  s set. */.  int 
4290: 69 52 6f 77 69 64 4f 66 66 73 65 74 3b 20 20 20  iRowidOffset;   
42a0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
42b0: 75 72 72 65 6e 74 20 65 6e 74 72 79 20 69 6e 20  urrent entry in 
42c0: 61 52 6f 77 69 64 4f 66 66 73 65 74 5b 5d 20 2a  aRowidOffset[] *
42d0: 2f 0a 20 20 69 6e 74 20 6e 52 6f 77 69 64 4f 66  /.  int nRowidOf
42e0: 66 73 65 74 3b 20 20 20 20 20 20 20 20 20 20 20  fset;           
42f0: 20 20 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 64      /* Allocated
4300: 20 73 69 7a 65 20 6f 66 20 61 52 6f 77 69 64 4f   size of aRowidO
4310: 66 66 73 65 74 5b 5d 20 61 72 72 61 79 20 2a 2f  ffset[] array */
4320: 0a 20 20 69 6e 74 20 2a 61 52 6f 77 69 64 4f 66  .  int *aRowidOf
4330: 66 73 65 74 3b 20 20 20 20 20 20 20 20 20 20 20  fset;           
4340: 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 6f     /* Array of o
4350: 66 66 73 65 74 20 74 6f 20 72 6f 77 69 64 20 66  ffset to rowid f
4360: 69 65 6c 64 73 20 2a 2f 0a 0a 20 20 46 74 73 35  ields */..  Fts5
4370: 44 6c 69 64 78 49 74 65 72 20 2a 70 44 6c 69 64  DlidxIter *pDlid
4380: 78 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49  x;          /* I
4390: 66 20 74 68 65 72 65 20 69 73 20 61 20 64 6f 63  f there is a doc
43a0: 6c 69 73 74 2d 69 6e 64 65 78 20 2a 2f 0a 0a 20  list-index */.. 
43b0: 20 2f 2a 20 56 61 72 69 61 62 6c 65 73 20 70 6f   /* Variables po
43c0: 70 75 6c 61 74 65 64 20 62 61 73 65 64 20 6f 6e  pulated based on
43d0: 20 63 75 72 72 65 6e 74 20 65 6e 74 72 79 2e 20   current entry. 
43e0: 2a 2f 0a 20 20 46 74 73 35 42 75 66 66 65 72 20  */.  Fts5Buffer 
43f0: 74 65 72 6d 3b 20 20 20 20 20 20 20 20 20 20 20  term;           
4400: 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20       /* Current 
4410: 74 65 72 6d 20 2a 2f 0a 20 20 69 36 34 20 69 52  term */.  i64 iR
4420: 6f 77 69 64 3b 20 20 20 20 20 20 20 20 20 20 20  owid;           
4430: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72            /* Cur
4440: 72 65 6e 74 20 72 6f 77 69 64 20 2a 2f 0a 20 20  rent rowid */.  
4450: 69 6e 74 20 6e 50 6f 73 3b 20 20 20 20 20 20 20  int nPos;       
4460: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4470: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74  /* Number of byt
4480: 65 73 20 69 6e 20 63 75 72 72 65 6e 74 20 70 6f  es in current po
4490: 73 69 74 69 6f 6e 20 6c 69 73 74 20 2a 2f 0a 20  sition list */. 
44a0: 20 75 38 20 62 44 65 6c 3b 20 20 20 20 20 20 20   u8 bDel;       
44b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
44c0: 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65 20   /* True if the 
44d0: 64 65 6c 65 74 65 20 66 6c 61 67 20 69 73 20 73  delete flag is s
44e0: 65 74 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  et */.};../*.** 
44f0: 41 72 67 75 6d 65 6e 74 20 69 73 20 61 20 70 6f  Argument is a po
4500: 69 6e 74 65 72 20 74 6f 20 61 6e 20 46 74 73 35  inter to an Fts5
4510: 44 61 74 61 20 73 74 72 75 63 74 75 72 65 20 74  Data structure t
4520: 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 61 20 0a  hat contains a .
4530: 2a 2a 20 6c 65 61 66 20 70 61 67 65 2e 0a 2a 2f  ** leaf page..*/
4540: 0a 23 64 65 66 69 6e 65 20 41 53 53 45 52 54 5f  .#define ASSERT_
4550: 53 5a 4c 45 41 46 5f 4f 4b 28 78 29 20 61 73 73  SZLEAF_OK(x) ass
4560: 65 72 74 28 20 5c 0a 20 20 20 20 28 78 29 2d 3e  ert( \.    (x)->
4570: 73 7a 4c 65 61 66 3d 3d 28 78 29 2d 3e 6e 6e 20  szLeaf==(x)->nn 
4580: 7c 7c 20 28 78 29 2d 3e 73 7a 4c 65 61 66 3d 3d  || (x)->szLeaf==
4590: 66 74 73 35 47 65 74 55 31 36 28 26 28 78 29 2d  fts5GetU16(&(x)-
45a0: 3e 70 5b 32 5d 29 20 5c 0a 29 0a 0a 23 64 65 66  >p[2]) \.)..#def
45b0: 69 6e 65 20 46 54 53 35 5f 53 45 47 49 54 45 52  ine FTS5_SEGITER
45c0: 5f 4f 4e 45 54 45 52 4d 20 30 78 30 31 0a 23 64  _ONETERM 0x01.#d
45d0: 65 66 69 6e 65 20 46 54 53 35 5f 53 45 47 49 54  efine FTS5_SEGIT
45e0: 45 52 5f 52 45 56 45 52 53 45 20 30 78 30 32 0a  ER_REVERSE 0x02.
45f0: 0a 2f 2a 20 0a 2a 2a 20 41 72 67 75 6d 65 6e 74  ./* .** Argument
4600: 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f   is a pointer to
4610: 20 61 6e 20 46 74 73 35 44 61 74 61 20 73 74 72   an Fts5Data str
4620: 75 63 74 75 72 65 20 74 68 61 74 20 63 6f 6e 74  ucture that cont
4630: 61 69 6e 73 20 61 20 6c 65 61 66 0a 2a 2a 20 70  ains a leaf.** p
4640: 61 67 65 2e 20 54 68 69 73 20 6d 61 63 72 6f 20  age. This macro 
4650: 65 76 61 6c 75 61 74 65 73 20 74 6f 20 74 72 75  evaluates to tru
4660: 65 20 69 66 20 74 68 65 20 6c 65 61 66 20 63 6f  e if the leaf co
4670: 6e 74 61 69 6e 73 20 6e 6f 20 74 65 72 6d 73 2c  ntains no terms,
4680: 20 6f 72 0a 2a 2a 20 66 61 6c 73 65 20 69 66 20   or.** false if 
4690: 69 74 20 63 6f 6e 74 61 69 6e 73 20 61 74 20 6c  it contains at l
46a0: 65 61 73 74 20 6f 6e 65 20 74 65 72 6d 2e 0a 2a  east one term..*
46b0: 2f 0a 23 64 65 66 69 6e 65 20 66 74 73 35 4c 65  /.#define fts5Le
46c0: 61 66 49 73 54 65 72 6d 6c 65 73 73 28 78 29 20  afIsTermless(x) 
46d0: 28 28 78 29 2d 3e 73 7a 4c 65 61 66 20 3e 3d 20  ((x)->szLeaf >= 
46e0: 28 78 29 2d 3e 6e 6e 29 0a 0a 23 64 65 66 69 6e  (x)->nn)..#defin
46f0: 65 20 66 74 73 35 4c 65 61 66 54 65 72 6d 4f 66  e fts5LeafTermOf
4700: 66 28 78 2c 20 69 29 20 28 66 74 73 35 47 65 74  f(x, i) (fts5Get
4710: 55 31 36 28 26 28 78 29 2d 3e 70 5b 28 78 29 2d  U16(&(x)->p[(x)-
4720: 3e 73 7a 4c 65 61 66 20 2b 20 28 69 29 2a 32 5d  >szLeaf + (i)*2]
4730: 29 29 0a 0a 23 64 65 66 69 6e 65 20 66 74 73 35  ))..#define fts5
4740: 4c 65 61 66 46 69 72 73 74 52 6f 77 69 64 4f 66  LeafFirstRowidOf
4750: 66 28 78 29 20 28 66 74 73 35 47 65 74 55 31 36  f(x) (fts5GetU16
4760: 28 28 78 29 2d 3e 70 29 29 0a 0a 2f 2a 0a 2a 2a  ((x)->p))../*.**
4770: 20 4f 62 6a 65 63 74 20 66 6f 72 20 69 74 65 72   Object for iter
4780: 61 74 69 6e 67 20 74 68 72 6f 75 67 68 20 74 68  ating through th
4790: 65 20 6d 65 72 67 65 64 20 72 65 73 75 6c 74 73  e merged results
47a0: 20 6f 66 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20   of one or more 
47b0: 73 65 67 6d 65 6e 74 73 2c 0a 2a 2a 20 76 69 73  segments,.** vis
47c0: 69 74 69 6e 67 20 65 61 63 68 20 74 65 72 6d 2f  iting each term/
47d0: 72 6f 77 69 64 20 70 61 69 72 20 69 6e 20 74 68  rowid pair in th
47e0: 65 20 6d 65 72 67 65 64 20 64 61 74 61 2e 0a 2a  e merged data..*
47f0: 2a 0a 2a 2a 20 6e 53 65 67 20 69 73 20 61 6c 77  *.** nSeg is alw
4800: 61 79 73 20 61 20 70 6f 77 65 72 20 6f 66 20 74  ays a power of t
4810: 77 6f 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  wo greater than 
4820: 6f 72 20 65 71 75 61 6c 20 74 6f 20 74 68 65 20  or equal to the 
4830: 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 73 65 67  number of.** seg
4840: 6d 65 6e 74 73 20 74 68 61 74 20 74 68 69 73 20  ments that this 
4850: 6f 62 6a 65 63 74 20 69 73 20 6d 65 72 67 69 6e  object is mergin
4860: 67 20 64 61 74 61 20 66 72 6f 6d 2e 20 42 6f 74  g data from. Bot
4870: 68 20 74 68 65 20 61 53 65 67 5b 5d 20 61 6e 64  h the aSeg[] and
4880: 0a 2a 2a 20 61 46 69 72 73 74 5b 5d 20 61 72 72  .** aFirst[] arr
4890: 61 79 73 20 61 72 65 20 73 69 7a 65 64 20 61 74  ays are sized at
48a0: 20 6e 53 65 67 20 65 6e 74 72 69 65 73 2e 20 54   nSeg entries. T
48b0: 68 65 20 61 53 65 67 5b 5d 20 61 72 72 61 79 20  he aSeg[] array 
48c0: 69 73 20 70 61 64 64 65 64 0a 2a 2a 20 77 69 74  is padded.** wit
48d0: 68 20 7a 65 72 6f 65 64 20 6f 62 6a 65 63 74 73  h zeroed objects
48e0: 20 2d 20 74 68 65 73 65 20 61 72 65 20 68 61 6e   - these are han
48f0: 64 6c 65 64 20 61 73 20 69 66 20 74 68 65 79 20  dled as if they 
4900: 77 65 72 65 20 69 74 65 72 61 74 6f 72 73 20 6f  were iterators o
4910: 70 65 6e 65 64 0a 2a 2a 20 6f 6e 20 65 6d 70 74  pened.** on empt
4920: 79 20 73 65 67 6d 65 6e 74 73 2e 0a 2a 2a 0a 2a  y segments..**.*
4930: 2a 20 54 68 65 20 72 65 73 75 6c 74 73 20 6f 66  * The results of
4940: 20 63 6f 6d 70 61 72 69 6e 67 20 73 65 67 6d 65   comparing segme
4950: 6e 74 73 20 61 53 65 67 5b 4e 5d 20 61 6e 64 20  nts aSeg[N] and 
4960: 61 53 65 67 5b 4e 2b 31 5d 2c 20 77 68 65 72 65  aSeg[N+1], where
4970: 20 4e 20 69 73 20 61 6e 0a 2a 2a 20 65 76 65 6e   N is an.** even
4980: 20 6e 75 6d 62 65 72 2c 20 69 73 20 73 74 6f 72   number, is stor
4990: 65 64 20 69 6e 20 61 46 69 72 73 74 5b 28 6e 53  ed in aFirst[(nS
49a0: 65 67 2b 4e 29 2f 32 5d 2e 20 54 68 65 20 22 72  eg+N)/2]. The "r
49b0: 65 73 75 6c 74 22 20 6f 66 20 74 68 65 20 0a 2a  esult" of the .*
49c0: 2a 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69 6e 20  * comparison in 
49d0: 74 68 69 73 20 63 6f 6e 74 65 78 74 20 69 73 20  this context is 
49e0: 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65  the index of the
49f0: 20 69 74 65 72 61 74 6f 72 20 74 68 61 74 20 63   iterator that c
4a00: 75 72 72 65 6e 74 6c 79 0a 2a 2a 20 70 6f 69 6e  urrently.** poin
4a10: 74 73 20 74 6f 20 74 68 65 20 73 6d 61 6c 6c 65  ts to the smalle
4a20: 72 20 74 65 72 6d 2f 72 6f 77 69 64 20 63 6f 6d  r term/rowid com
4a30: 62 69 6e 61 74 69 6f 6e 2e 20 49 74 65 72 61 74  bination. Iterat
4a40: 6f 72 73 20 61 74 20 45 4f 46 20 61 72 65 0a 2a  ors at EOF are.*
4a50: 2a 20 63 6f 6e 73 69 64 65 72 65 64 20 74 6f 20  * considered to 
4a60: 62 65 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  be greater than 
4a70: 61 6c 6c 20 6f 74 68 65 72 20 69 74 65 72 61 74  all other iterat
4a80: 6f 72 73 2e 0a 2a 2a 0a 2a 2a 20 61 46 69 72 73  ors..**.** aFirs
4a90: 74 5b 31 5d 20 63 6f 6e 74 61 69 6e 73 20 74 68  t[1] contains th
4aa0: 65 20 69 6e 64 65 78 20 69 6e 20 61 53 65 67 5b  e index in aSeg[
4ab0: 5d 20 6f 66 20 74 68 65 20 69 74 65 72 61 74 6f  ] of the iterato
4ac0: 72 20 74 68 61 74 20 70 6f 69 6e 74 73 20 74 6f  r that points to
4ad0: 0a 2a 2a 20 74 68 65 20 73 6d 61 6c 6c 65 73 74  .** the smallest
4ae0: 20 6b 65 79 20 6f 76 65 72 61 6c 6c 2e 20 61 46   key overall. aF
4af0: 69 72 73 74 5b 30 5d 20 69 73 20 75 6e 75 73 65  irst[0] is unuse
4b00: 64 2e 20 0a 2a 2a 0a 2a 2a 20 70 6f 73 6c 69 73  d. .**.** poslis
4b10: 74 3a 0a 2a 2a 20 20 20 55 73 65 64 20 62 79 20  t:.**   Used by 
4b20: 73 71 6c 69 74 65 33 46 74 73 35 49 74 65 72 50  sqlite3Fts5IterP
4b30: 6f 73 6c 69 73 74 28 29 20 77 68 65 6e 20 74 68  oslist() when th
4b40: 65 20 70 6f 73 6c 69 73 74 20 6e 65 65 64 73 20  e poslist needs 
4b50: 74 6f 20 62 65 20 62 75 66 66 65 72 65 64 2e 0a  to be buffered..
4b60: 2a 2a 20 20 20 54 68 65 72 65 20 69 73 20 6e 6f  **   There is no
4b70: 20 77 61 79 20 74 6f 20 74 65 6c 6c 20 69 66 20   way to tell if 
4b80: 74 68 69 73 20 69 73 20 70 6f 70 75 6c 61 74 65  this is populate
4b90: 64 20 6f 72 20 6e 6f 74 2e 0a 2a 2f 0a 73 74 72  d or not..*/.str
4ba0: 75 63 74 20 46 74 73 35 49 6e 64 65 78 49 74 65  uct Fts5IndexIte
4bb0: 72 20 7b 0a 20 20 46 74 73 35 49 6e 64 65 78 20  r {.  Fts5Index 
4bc0: 2a 70 49 6e 64 65 78 3b 20 20 20 20 20 20 20 20  *pIndex;        
4bd0: 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 74        /* Index t
4be0: 68 61 74 20 6f 77 6e 73 20 74 68 69 73 20 69 74  hat owns this it
4bf0: 65 72 61 74 6f 72 20 2a 2f 0a 20 20 46 74 73 35  erator */.  Fts5
4c00: 53 74 72 75 63 74 75 72 65 20 2a 70 53 74 72 75  Structure *pStru
4c10: 63 74 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 44  ct;         /* D
4c20: 61 74 61 62 61 73 65 20 73 74 72 75 63 74 75 72  atabase structur
4c30: 65 20 66 6f 72 20 74 68 69 73 20 69 74 65 72 61  e for this itera
4c40: 74 6f 72 20 2a 2f 0a 20 20 46 74 73 35 42 75 66  tor */.  Fts5Buf
4c50: 66 65 72 20 70 6f 73 6c 69 73 74 3b 20 20 20 20  fer poslist;    
4c60: 20 20 20 20 20 20 20 20 20 2f 2a 20 42 75 66 66           /* Buff
4c70: 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 63 75  er containing cu
4c80: 72 72 65 6e 74 20 70 6f 73 6c 69 73 74 20 2a 2f  rrent poslist */
4c90: 0a 0a 20 20 69 6e 74 20 6e 53 65 67 3b 20 20 20  ..  int nSeg;   
4ca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4cb0: 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 61      /* Size of a
4cc0: 53 65 67 5b 5d 20 61 72 72 61 79 20 2a 2f 0a 20  Seg[] array */. 
4cd0: 20 69 6e 74 20 62 52 65 76 3b 20 20 20 20 20 20   int bRev;      
4ce0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4cf0: 20 2f 2a 20 54 72 75 65 20 74 6f 20 69 74 65 72   /* True to iter
4d00: 61 74 65 20 69 6e 20 72 65 76 65 72 73 65 20 6f  ate in reverse o
4d10: 72 64 65 72 20 2a 2f 0a 20 20 75 38 20 62 53 6b  rder */.  u8 bSk
4d20: 69 70 45 6d 70 74 79 3b 20 20 20 20 20 20 20 20  ipEmpty;        
4d30: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
4d40: 65 20 74 6f 20 73 6b 69 70 20 64 65 6c 65 74 65  e to skip delete
4d50: 64 20 65 6e 74 72 69 65 73 20 2a 2f 0a 20 20 75  d entries */.  u
4d60: 38 20 62 45 6f 66 3b 20 20 20 20 20 20 20 20 20  8 bEof;         
4d70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
4d80: 2a 20 54 72 75 65 20 61 74 20 45 4f 46 20 2a 2f  * True at EOF */
4d90: 0a 20 20 75 38 20 62 46 69 6c 74 65 72 65 64 3b  .  u8 bFiltered;
4da0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4db0: 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 63 6f     /* True if co
4dc0: 6c 75 6d 6e 2d 66 69 6c 74 65 72 20 61 6c 72 65  lumn-filter alre
4dd0: 61 64 79 20 61 70 70 6c 69 65 64 20 2a 2f 0a 0a  ady applied */..
4de0: 20 20 69 36 34 20 69 53 77 69 74 63 68 52 6f 77    i64 iSwitchRow
4df0: 69 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  id;             
4e00: 20 20 2f 2a 20 46 69 72 73 74 65 73 74 20 72 6f    /* Firstest ro
4e10: 77 69 64 20 6f 66 20 6f 74 68 65 72 20 74 68 61  wid of other tha
4e20: 6e 20 61 46 69 72 73 74 5b 31 5d 20 2a 2f 0a 20  n aFirst[1] */. 
4e30: 20 46 74 73 35 43 52 65 73 75 6c 74 20 2a 61 46   Fts5CResult *aF
4e40: 69 72 73 74 3b 20 20 20 20 20 20 20 20 20 20 20  irst;           
4e50: 20 2f 2a 20 43 75 72 72 65 6e 74 20 6d 65 72 67   /* Current merg
4e60: 65 20 73 74 61 74 65 20 28 73 65 65 20 61 62 6f  e state (see abo
4e70: 76 65 29 20 2a 2f 0a 20 20 46 74 73 35 53 65 67  ve) */.  Fts5Seg
4e80: 49 74 65 72 20 61 53 65 67 5b 31 5d 3b 20 20 20  Iter aSeg[1];   
4e90: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61           /* Arra
4ea0: 79 20 6f 66 20 73 65 67 6d 65 6e 74 20 69 74 65  y of segment ite
4eb0: 72 61 74 6f 72 73 20 2a 2f 0a 7d 3b 0a 0a 0a 2f  rators */.};.../
4ec0: 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65  *.** An instance
4ed0: 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
4ee0: 67 20 74 79 70 65 20 69 73 20 75 73 65 64 20 74  g type is used t
4ef0: 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f 75 67  o iterate throug
4f00: 68 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 0a 2a  h the contents.*
4f10: 2a 20 6f 66 20 61 20 64 6f 63 6c 69 73 74 2d 69  * of a doclist-i
4f20: 6e 64 65 78 20 72 65 63 6f 72 64 2e 0a 2a 2a 0a  ndex record..**.
4f30: 2a 2a 20 70 44 61 74 61 3a 0a 2a 2a 20 20 20 52  ** pData:.**   R
4f40: 65 63 6f 72 64 20 63 6f 6e 74 61 69 6e 69 6e 67  ecord containing
4f50: 20 74 68 65 20 64 6f 63 6c 69 73 74 2d 69 6e 64   the doclist-ind
4f60: 65 78 20 64 61 74 61 2e 0a 2a 2a 0a 2a 2a 20 62  ex data..**.** b
4f70: 45 6f 66 3a 0a 2a 2a 20 20 20 53 65 74 20 74 6f  Eof:.**   Set to
4f80: 20 74 72 75 65 20 6f 6e 63 65 20 69 74 65 72 61   true once itera
4f90: 74 6f 72 20 68 61 73 20 72 65 61 63 68 65 64 20  tor has reached 
4fa0: 45 4f 46 2e 0a 2a 2a 0a 2a 2a 20 69 4f 66 66 3a  EOF..**.** iOff:
4fb0: 0a 2a 2a 20 20 20 53 65 74 20 74 6f 20 74 68 65  .**   Set to the
4fc0: 20 63 75 72 72 65 6e 74 20 6f 66 66 73 65 74 20   current offset 
4fd0: 77 69 74 68 69 6e 20 72 65 63 6f 72 64 20 70 44  within record pD
4fe0: 61 74 61 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 46  ata..*/.struct F
4ff0: 74 73 35 44 6c 69 64 78 4c 76 6c 20 7b 0a 20 20  ts5DlidxLvl {.  
5000: 46 74 73 35 44 61 74 61 20 2a 70 44 61 74 61 3b  Fts5Data *pData;
5010: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
5020: 20 44 61 74 61 20 66 6f 72 20 63 75 72 72 65 6e   Data for curren
5030: 74 20 70 61 67 65 20 6f 66 20 74 68 69 73 20 6c  t page of this l
5040: 65 76 65 6c 20 2a 2f 0a 20 20 69 6e 74 20 69 4f  evel */.  int iO
5050: 66 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ff;             
5060: 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65          /* Curre
5070: 6e 74 20 6f 66 66 73 65 74 20 69 6e 74 6f 20 70  nt offset into p
5080: 44 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20 62 45  Data */.  int bE
5090: 6f 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  of;             
50a0: 20 20 20 20 20 20 20 20 2f 2a 20 41 74 20 45 4f          /* At EO
50b0: 46 20 61 6c 72 65 61 64 79 20 2a 2f 0a 20 20 69  F already */.  i
50c0: 6e 74 20 69 46 69 72 73 74 4f 66 66 3b 20 20 20  nt iFirstOff;   
50d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
50e0: 55 73 65 64 20 62 79 20 72 65 76 65 72 73 65 20  Used by reverse 
50f0: 69 74 65 72 61 74 6f 72 73 20 2a 2f 0a 0a 20 20  iterators */..  
5100: 2f 2a 20 4f 75 74 70 75 74 20 76 61 72 69 61 62  /* Output variab
5110: 6c 65 73 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 65  les */.  int iLe
5120: 61 66 50 67 6e 6f 3b 20 20 20 20 20 20 20 20 20  afPgno;         
5130: 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 6e         /* Page n
5140: 75 6d 62 65 72 20 6f 66 20 63 75 72 72 65 6e 74  umber of current
5150: 20 6c 65 61 66 20 70 61 67 65 20 2a 2f 0a 20 20   leaf page */.  
5160: 69 36 34 20 69 52 6f 77 69 64 3b 20 20 20 20 20  i64 iRowid;     
5170: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
5180: 20 46 69 72 73 74 20 72 6f 77 69 64 20 6f 6e 20   First rowid on 
5190: 6c 65 61 66 20 69 4c 65 61 66 50 67 6e 6f 20 2a  leaf iLeafPgno *
51a0: 2f 0a 7d 3b 0a 73 74 72 75 63 74 20 46 74 73 35  /.};.struct Fts5
51b0: 44 6c 69 64 78 49 74 65 72 20 7b 0a 20 20 69 6e  DlidxIter {.  in
51c0: 74 20 6e 4c 76 6c 3b 0a 20 20 69 6e 74 20 69 53  t nLvl;.  int iS
51d0: 65 67 69 64 3b 0a 20 20 46 74 73 35 44 6c 69 64  egid;.  Fts5Dlid
51e0: 78 4c 76 6c 20 61 4c 76 6c 5b 31 5d 3b 0a 7d 3b  xLvl aLvl[1];.};
51f0: 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  ..static void ft
5200: 73 35 50 75 74 55 31 36 28 75 38 20 2a 61 4f 75  s5PutU16(u8 *aOu
5210: 74 2c 20 75 31 36 20 69 56 61 6c 29 7b 0a 20 20  t, u16 iVal){.  
5220: 61 4f 75 74 5b 30 5d 20 3d 20 28 69 56 61 6c 3e  aOut[0] = (iVal>
5230: 3e 38 29 3b 0a 20 20 61 4f 75 74 5b 31 5d 20 3d  >8);.  aOut[1] =
5240: 20 28 69 56 61 6c 26 30 78 46 46 29 3b 0a 7d 0a   (iVal&0xFF);.}.
5250: 0a 73 74 61 74 69 63 20 75 31 36 20 66 74 73 35  .static u16 fts5
5260: 47 65 74 55 31 36 28 63 6f 6e 73 74 20 75 38 20  GetU16(const u8 
5270: 2a 61 49 6e 29 7b 0a 20 20 72 65 74 75 72 6e 20  *aIn){.  return 
5280: 28 28 75 31 36 29 61 49 6e 5b 30 5d 20 3c 3c 20  ((u16)aIn[0] << 
5290: 38 29 20 2b 20 61 49 6e 5b 31 5d 3b 0a 7d 20 0a  8) + aIn[1];.} .
52a0: 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20  ./*.** Allocate 
52b0: 61 6e 64 20 72 65 74 75 72 6e 20 61 20 62 75 66  and return a buf
52c0: 66 65 72 20 61 74 20 6c 65 61 73 74 20 6e 42 79  fer at least nBy
52d0: 74 65 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65  te bytes in size
52e0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 4f 4f  ..**.** If an OO
52f0: 4d 20 65 72 72 6f 72 20 69 73 20 65 6e 63 6f 75  M error is encou
5300: 6e 74 65 72 65 64 2c 20 72 65 74 75 72 6e 20 4e  ntered, return N
5310: 55 4c 4c 20 61 6e 64 20 73 65 74 20 74 68 65 20  ULL and set the 
5320: 65 72 72 6f 72 20 63 6f 64 65 20 69 6e 0a 2a 2a  error code in.**
5330: 20 74 68 65 20 46 74 73 35 49 6e 64 65 78 20 68   the Fts5Index h
5340: 61 6e 64 6c 65 20 70 61 73 73 65 64 20 61 73 20  andle passed as 
5350: 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65  the first argume
5360: 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  nt..*/.static vo
5370: 69 64 20 2a 66 74 73 35 49 64 78 4d 61 6c 6c 6f  id *fts5IdxMallo
5380: 63 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20  c(Fts5Index *p, 
5390: 69 6e 74 20 6e 42 79 74 65 29 7b 0a 20 20 72 65  int nByte){.  re
53a0: 74 75 72 6e 20 73 71 6c 69 74 65 33 46 74 73 35  turn sqlite3Fts5
53b0: 4d 61 6c 6c 6f 63 5a 65 72 6f 28 26 70 2d 3e 72  MallocZero(&p->r
53c0: 63 2c 20 6e 42 79 74 65 29 3b 0a 7d 0a 0a 2f 2a  c, nByte);.}../*
53d0: 0a 2a 2a 20 43 6f 6d 70 61 72 65 20 74 68 65 20  .** Compare the 
53e0: 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
53f0: 70 4c 65 66 74 20 62 75 66 66 65 72 20 77 69 74  pLeft buffer wit
5400: 68 20 74 68 65 20 70 52 69 67 68 74 2f 6e 52 69  h the pRight/nRi
5410: 67 68 74 20 62 6c 6f 62 2e 0a 2a 2a 0a 2a 2a 20  ght blob..**.** 
5420: 52 65 74 75 72 6e 20 2d 76 65 20 69 66 20 70 4c  Return -ve if pL
5430: 65 66 74 20 69 73 20 73 6d 61 6c 6c 65 72 20 74  eft is smaller t
5440: 68 61 6e 20 70 52 69 67 68 74 2c 20 30 20 69 66  han pRight, 0 if
5450: 20 74 68 65 79 20 61 72 65 20 65 71 75 61 6c 20   they are equal 
5460: 6f 72 0a 2a 2a 20 2b 76 65 20 69 66 20 70 52 69  or.** +ve if pRi
5470: 67 68 74 20 69 73 20 73 6d 61 6c 6c 65 72 20 74  ght is smaller t
5480: 68 61 6e 20 70 4c 65 66 74 2e 20 49 6e 20 6f 74  han pLeft. In ot
5490: 68 65 72 20 77 6f 72 64 73 3a 0a 2a 2a 0a 2a 2a  her words:.**.**
54a0: 20 20 20 20 20 72 65 73 20 3d 20 2a 70 4c 65 66       res = *pLef
54b0: 74 20 2d 20 2a 70 52 69 67 68 74 0a 2a 2f 0a 23  t - *pRight.*/.#
54c0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
54d0: 55 47 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74  UG.static int ft
54e0: 73 35 42 75 66 66 65 72 43 6f 6d 70 61 72 65 42  s5BufferCompareB
54f0: 6c 6f 62 28 0a 20 20 46 74 73 35 42 75 66 66 65  lob(.  Fts5Buffe
5500: 72 20 2a 70 4c 65 66 74 2c 20 20 20 20 20 20 20  r *pLeft,       
5510: 20 20 20 20 20 20 20 2f 2a 20 4c 65 66 74 20 68         /* Left h
5520: 61 6e 64 20 73 69 64 65 20 6f 66 20 63 6f 6d 70  and side of comp
5530: 61 72 69 73 6f 6e 20 2a 2f 0a 20 20 63 6f 6e 73  arison */.  cons
5540: 74 20 75 38 20 2a 70 52 69 67 68 74 2c 20 69 6e  t u8 *pRight, in
5550: 74 20 6e 52 69 67 68 74 20 20 20 20 2f 2a 20 52  t nRight    /* R
5560: 69 67 68 74 20 68 61 6e 64 20 73 69 64 65 20 6f  ight hand side o
5570: 66 20 63 6f 6d 70 61 72 69 73 6f 6e 20 2a 2f 0a  f comparison */.
5580: 29 7b 0a 20 20 69 6e 74 20 6e 43 6d 70 20 3d 20  ){.  int nCmp = 
5590: 4d 49 4e 28 70 4c 65 66 74 2d 3e 6e 2c 20 6e 52  MIN(pLeft->n, nR
55a0: 69 67 68 74 29 3b 0a 20 20 69 6e 74 20 72 65 73  ight);.  int res
55b0: 20 3d 20 6d 65 6d 63 6d 70 28 70 4c 65 66 74 2d   = memcmp(pLeft-
55c0: 3e 70 2c 20 70 52 69 67 68 74 2c 20 6e 43 6d 70  >p, pRight, nCmp
55d0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 72 65 73  );.  return (res
55e0: 3d 3d 30 20 3f 20 28 70 4c 65 66 74 2d 3e 6e 20  ==0 ? (pLeft->n 
55f0: 2d 20 6e 52 69 67 68 74 29 20 3a 20 72 65 73 29  - nRight) : res)
5600: 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ;.}.#endif../*.*
5610: 2a 20 43 6f 6d 70 61 72 65 20 74 68 65 20 63 6f  * Compare the co
5620: 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 74 77  ntents of the tw
5630: 6f 20 62 75 66 66 65 72 73 20 75 73 69 6e 67 20  o buffers using 
5640: 6d 65 6d 63 6d 70 28 29 2e 20 49 66 20 6f 6e 65  memcmp(). If one
5650: 20 62 75 66 66 65 72 0a 2a 2a 20 69 73 20 61 20   buffer.** is a 
5660: 70 72 65 66 69 78 20 6f 66 20 74 68 65 20 6f 74  prefix of the ot
5670: 68 65 72 2c 20 69 74 20 69 73 20 63 6f 6e 73 69  her, it is consi
5680: 64 65 72 65 64 20 74 68 65 20 6c 65 73 73 65 72  dered the lesser
5690: 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 2d  ..**.** Return -
56a0: 76 65 20 69 66 20 70 4c 65 66 74 20 69 73 20 73  ve if pLeft is s
56b0: 6d 61 6c 6c 65 72 20 74 68 61 6e 20 70 52 69 67  maller than pRig
56c0: 68 74 2c 20 30 20 69 66 20 74 68 65 79 20 61 72  ht, 0 if they ar
56d0: 65 20 65 71 75 61 6c 20 6f 72 0a 2a 2a 20 2b 76  e equal or.** +v
56e0: 65 20 69 66 20 70 52 69 67 68 74 20 69 73 20 73  e if pRight is s
56f0: 6d 61 6c 6c 65 72 20 74 68 61 6e 20 70 4c 65 66  maller than pLef
5700: 74 2e 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64  t. In other word
5710: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 72 65 73  s:.**.**     res
5720: 20 3d 20 2a 70 4c 65 66 74 20 2d 20 2a 70 52 69   = *pLeft - *pRi
5730: 67 68 74 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ght.*/.static in
5740: 74 20 66 74 73 35 42 75 66 66 65 72 43 6f 6d 70  t fts5BufferComp
5750: 61 72 65 28 46 74 73 35 42 75 66 66 65 72 20 2a  are(Fts5Buffer *
5760: 70 4c 65 66 74 2c 20 46 74 73 35 42 75 66 66 65  pLeft, Fts5Buffe
5770: 72 20 2a 70 52 69 67 68 74 29 7b 0a 20 20 69 6e  r *pRight){.  in
5780: 74 20 6e 43 6d 70 20 3d 20 4d 49 4e 28 70 4c 65  t nCmp = MIN(pLe
5790: 66 74 2d 3e 6e 2c 20 70 52 69 67 68 74 2d 3e 6e  ft->n, pRight->n
57a0: 29 3b 0a 20 20 69 6e 74 20 72 65 73 20 3d 20 6d  );.  int res = m
57b0: 65 6d 63 6d 70 28 70 4c 65 66 74 2d 3e 70 2c 20  emcmp(pLeft->p, 
57c0: 70 52 69 67 68 74 2d 3e 70 2c 20 6e 43 6d 70 29  pRight->p, nCmp)
57d0: 3b 0a 20 20 72 65 74 75 72 6e 20 28 72 65 73 3d  ;.  return (res=
57e0: 3d 30 20 3f 20 28 70 4c 65 66 74 2d 3e 6e 20 2d  =0 ? (pLeft->n -
57f0: 20 70 52 69 67 68 74 2d 3e 6e 29 20 3a 20 72 65   pRight->n) : re
5800: 73 29 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51  s);.}..#ifdef SQ
5810: 4c 49 54 45 5f 44 45 42 55 47 0a 73 74 61 74 69  LITE_DEBUG.stati
5820: 63 20 69 6e 74 20 66 74 73 35 42 6c 6f 62 43 6f  c int fts5BlobCo
5830: 6d 70 61 72 65 28 0a 20 20 63 6f 6e 73 74 20 75  mpare(.  const u
5840: 38 20 2a 70 4c 65 66 74 2c 20 69 6e 74 20 6e 4c  8 *pLeft, int nL
5850: 65 66 74 2c 20 0a 20 20 63 6f 6e 73 74 20 75 38  eft, .  const u8
5860: 20 2a 70 52 69 67 68 74 2c 20 69 6e 74 20 6e 52   *pRight, int nR
5870: 69 67 68 74 0a 29 7b 0a 20 20 69 6e 74 20 6e 43  ight.){.  int nC
5880: 6d 70 20 3d 20 4d 49 4e 28 6e 4c 65 66 74 2c 20  mp = MIN(nLeft, 
5890: 6e 52 69 67 68 74 29 3b 0a 20 20 69 6e 74 20 72  nRight);.  int r
58a0: 65 73 20 3d 20 6d 65 6d 63 6d 70 28 70 4c 65 66  es = memcmp(pLef
58b0: 74 2c 20 70 52 69 67 68 74 2c 20 6e 43 6d 70 29  t, pRight, nCmp)
58c0: 3b 0a 20 20 72 65 74 75 72 6e 20 28 72 65 73 3d  ;.  return (res=
58d0: 3d 30 20 3f 20 28 6e 4c 65 66 74 20 2d 20 6e 52  =0 ? (nLeft - nR
58e0: 69 67 68 74 29 20 3a 20 72 65 73 29 3b 0a 7d 0a  ight) : res);.}.
58f0: 23 65 6e 64 69 66 0a 0a 73 74 61 74 69 63 20 69  #endif..static i
5900: 6e 74 20 66 74 73 35 4c 65 61 66 46 69 72 73 74  nt fts5LeafFirst
5910: 54 65 72 6d 4f 66 66 28 46 74 73 35 44 61 74 61  TermOff(Fts5Data
5920: 20 2a 70 4c 65 61 66 29 7b 0a 20 20 69 6e 74 20   *pLeaf){.  int 
5930: 72 65 74 3b 0a 20 20 66 74 73 35 47 65 74 56 61  ret;.  fts5GetVa
5940: 72 69 6e 74 33 32 28 26 70 4c 65 61 66 2d 3e 70  rint32(&pLeaf->p
5950: 5b 70 4c 65 61 66 2d 3e 73 7a 4c 65 61 66 5d 2c  [pLeaf->szLeaf],
5960: 20 72 65 74 29 3b 0a 20 20 72 65 74 75 72 6e 20   ret);.  return 
5970: 72 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c  ret;.}../*.** Cl
5980: 6f 73 65 20 74 68 65 20 72 65 61 64 2d 6f 6e 6c  ose the read-onl
5990: 79 20 62 6c 6f 62 20 68 61 6e 64 6c 65 2c 20 69  y blob handle, i
59a0: 66 20 69 74 20 69 73 20 6f 70 65 6e 2e 0a 2a 2f  f it is open..*/
59b0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
59c0: 35 43 6c 6f 73 65 52 65 61 64 65 72 28 46 74 73  5CloseReader(Fts
59d0: 35 49 6e 64 65 78 20 2a 70 29 7b 0a 20 20 69 66  5Index *p){.  if
59e0: 28 20 70 2d 3e 70 52 65 61 64 65 72 20 29 7b 0a  ( p->pReader ){.
59f0: 20 20 20 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62      sqlite3_blob
5a00: 20 2a 70 52 65 61 64 65 72 20 3d 20 70 2d 3e 70   *pReader = p->p
5a10: 52 65 61 64 65 72 3b 0a 20 20 20 20 70 2d 3e 70  Reader;.    p->p
5a20: 52 65 61 64 65 72 20 3d 20 30 3b 0a 20 20 20 20  Reader = 0;.    
5a30: 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 63 6c 6f  sqlite3_blob_clo
5a40: 73 65 28 70 52 65 61 64 65 72 29 3b 0a 20 20 7d  se(pReader);.  }
5a50: 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 72 69  .}.../*.** Retri
5a60: 65 76 65 20 61 20 72 65 63 6f 72 64 20 66 72 6f  eve a record fro
5a70: 6d 20 74 68 65 20 25 5f 64 61 74 61 20 74 61 62  m the %_data tab
5a80: 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  le..**.** If an 
5a90: 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 4e 55  error occurs, NU
5aa0: 4c 4c 20 69 73 20 72 65 74 75 72 6e 65 64 20 61  LL is returned a
5ab0: 6e 64 20 61 6e 20 65 72 72 6f 72 20 6c 65 66 74  nd an error left
5ac0: 20 69 6e 20 74 68 65 20 0a 2a 2a 20 46 74 73 35   in the .** Fts5
5ad0: 49 6e 64 65 78 20 6f 62 6a 65 63 74 2e 0a 2a 2f  Index object..*/
5ae0: 0a 73 74 61 74 69 63 20 46 74 73 35 44 61 74 61  .static Fts5Data
5af0: 20 2a 66 74 73 35 44 61 74 61 52 65 61 64 28 46   *fts5DataRead(F
5b00: 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 69 36 34  ts5Index *p, i64
5b10: 20 69 52 6f 77 69 64 29 7b 0a 20 20 46 74 73 35   iRowid){.  Fts5
5b20: 44 61 74 61 20 2a 70 52 65 74 20 3d 20 30 3b 0a  Data *pRet = 0;.
5b30: 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c    if( p->rc==SQL
5b40: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 6e  ITE_OK ){.    in
5b50: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
5b60: 3b 0a 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 52  ;..    if( p->pR
5b70: 65 61 64 65 72 20 29 7b 0a 20 20 20 20 20 20 2f  eader ){.      /
5b80: 2a 20 54 68 69 73 20 63 61 6c 6c 20 6d 61 79 20  * This call may 
5b90: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 41 42  return SQLITE_AB
5ba0: 4f 52 54 20 69 66 20 74 68 65 72 65 20 68 61 73  ORT if there has
5bb0: 20 62 65 65 6e 20 61 20 73 61 76 65 70 6f 69 6e   been a savepoin
5bc0: 74 0a 20 20 20 20 20 20 2a 2a 20 72 6f 6c 6c 62  t.      ** rollb
5bd0: 61 63 6b 20 73 69 6e 63 65 20 69 74 20 77 61 73  ack since it was
5be0: 20 6c 61 73 74 20 75 73 65 64 2e 20 49 6e 20 74   last used. In t
5bf0: 68 69 73 20 63 61 73 65 20 61 20 6e 65 77 20 62  his case a new b
5c00: 6c 6f 62 20 68 61 6e 64 6c 65 0a 20 20 20 20 20  lob handle.     
5c10: 20 2a 2a 20 69 73 20 72 65 71 75 69 72 65 64 2e   ** is required.
5c20: 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74    */.      sqlit
5c30: 65 33 5f 62 6c 6f 62 20 2a 70 42 6c 6f 62 20 3d  e3_blob *pBlob =
5c40: 20 70 2d 3e 70 52 65 61 64 65 72 3b 0a 20 20 20   p->pReader;.   
5c50: 20 20 20 70 2d 3e 70 52 65 61 64 65 72 20 3d 20     p->pReader = 
5c60: 30 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  0;.      rc = sq
5c70: 6c 69 74 65 33 5f 62 6c 6f 62 5f 72 65 6f 70 65  lite3_blob_reope
5c80: 6e 28 70 42 6c 6f 62 2c 20 69 52 6f 77 69 64 29  n(pBlob, iRowid)
5c90: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
5ca0: 70 2d 3e 70 52 65 61 64 65 72 3d 3d 30 20 29 3b  p->pReader==0 );
5cb0: 0a 20 20 20 20 20 20 70 2d 3e 70 52 65 61 64 65  .      p->pReade
5cc0: 72 20 3d 20 70 42 6c 6f 62 3b 0a 20 20 20 20 20  r = pBlob;.     
5cd0: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
5ce0: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 66 74  OK ){.        ft
5cf0: 73 35 43 6c 6f 73 65 52 65 61 64 65 72 28 70 29  s5CloseReader(p)
5d00: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
5d10: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 41  if( rc==SQLITE_A
5d20: 42 4f 52 54 20 29 20 72 63 20 3d 20 53 51 4c 49  BORT ) rc = SQLI
5d30: 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 0a 20 20  TE_OK;.    }..  
5d40: 20 20 2f 2a 20 49 66 20 74 68 65 20 62 6c 6f 62    /* If the blob
5d50: 20 68 61 6e 64 6c 65 20 69 73 20 6e 6f 74 20 6f   handle is not o
5d60: 70 65 6e 20 61 74 20 74 68 69 73 20 70 6f 69 6e  pen at this poin
5d70: 74 2c 20 6f 70 65 6e 20 69 74 20 61 6e 64 20 73  t, open it and s
5d80: 65 65 6b 20 0a 20 20 20 20 2a 2a 20 74 6f 20 74  eek .    ** to t
5d90: 68 65 20 72 65 71 75 65 73 74 65 64 20 65 6e 74  he requested ent
5da0: 72 79 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  ry.  */.    if( 
5db0: 70 2d 3e 70 52 65 61 64 65 72 3d 3d 30 20 26 26  p->pReader==0 &&
5dc0: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
5dd0: 7b 0a 20 20 20 20 20 20 46 74 73 35 43 6f 6e 66  {.      Fts5Conf
5de0: 69 67 20 2a 70 43 6f 6e 66 69 67 20 3d 20 70 2d  ig *pConfig = p-
5df0: 3e 70 43 6f 6e 66 69 67 3b 0a 20 20 20 20 20 20  >pConfig;.      
5e00: 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 62 6c 6f  rc = sqlite3_blo
5e10: 62 5f 6f 70 65 6e 28 70 43 6f 6e 66 69 67 2d 3e  b_open(pConfig->
5e20: 64 62 2c 20 0a 20 20 20 20 20 20 20 20 20 20 70  db, .          p
5e30: 43 6f 6e 66 69 67 2d 3e 7a 44 62 2c 20 70 2d 3e  Config->zDb, p->
5e40: 7a 44 61 74 61 54 62 6c 2c 20 22 62 6c 6f 63 6b  zDataTbl, "block
5e50: 22 2c 20 69 52 6f 77 69 64 2c 20 30 2c 20 26 70  ", iRowid, 0, &p
5e60: 2d 3e 70 52 65 61 64 65 72 0a 20 20 20 20 20 20  ->pReader.      
5e70: 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  );.    }..    /*
5e80: 20 49 66 20 65 69 74 68 65 72 20 6f 66 20 74 68   If either of th
5e90: 65 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 6f  e sqlite3_blob_o
5ea0: 70 65 6e 28 29 20 6f 72 20 73 71 6c 69 74 65 33  pen() or sqlite3
5eb0: 5f 62 6c 6f 62 5f 72 65 6f 70 65 6e 28 29 20 63  _blob_reopen() c
5ec0: 61 6c 6c 73 0a 20 20 20 20 2a 2a 20 61 62 6f 76  alls.    ** abov
5ed0: 65 20 72 65 74 75 72 6e 65 64 20 53 51 4c 49 54  e returned SQLIT
5ee0: 45 5f 45 52 52 4f 52 2c 20 72 65 74 75 72 6e 20  E_ERROR, return 
5ef0: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 56  SQLITE_CORRUPT_V
5f00: 54 41 42 20 69 6e 73 74 65 61 64 2e 0a 20 20 20  TAB instead..   
5f10: 20 2a 2a 20 41 6c 6c 20 74 68 65 20 72 65 61 73   ** All the reas
5f20: 6f 6e 73 20 74 68 6f 73 65 20 66 75 6e 63 74 69  ons those functi
5f30: 6f 6e 73 20 6d 69 67 68 74 20 72 65 74 75 72 6e  ons might return
5f40: 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 20 2d 20   SQLITE_ERROR - 
5f50: 6d 69 73 73 69 6e 67 0a 20 20 20 20 2a 2a 20 74  missing.    ** t
5f60: 61 62 6c 65 2c 20 6d 69 73 73 69 6e 67 20 72 6f  able, missing ro
5f70: 77 2c 20 6e 6f 6e 2d 62 6c 6f 62 2f 74 65 78 74  w, non-blob/text
5f80: 20 69 6e 20 62 6c 6f 63 6b 20 63 6f 6c 75 6d 6e   in block column
5f90: 20 2d 20 69 6e 64 69 63 61 74 65 20 0a 20 20 20   - indicate .   
5fa0: 20 2a 2a 20 62 61 63 6b 69 6e 67 20 73 74 6f 72   ** backing stor
5fb0: 65 20 63 6f 72 72 75 70 74 69 6f 6e 2e 20 20 2a  e corruption.  *
5fc0: 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  /.    if( rc==SQ
5fd0: 4c 49 54 45 5f 45 52 52 4f 52 20 29 20 72 63 20  LITE_ERROR ) rc 
5fe0: 3d 20 46 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a  = FTS5_CORRUPT;.
5ff0: 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
6000: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
6010: 75 38 20 2a 61 4f 75 74 20 3d 20 30 3b 20 20 20  u8 *aOut = 0;   
6020: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
6030: 65 61 64 20 62 6c 6f 62 20 64 61 74 61 20 69 6e  ead blob data in
6040: 74 6f 20 74 68 69 73 20 62 75 66 66 65 72 20 2a  to this buffer *
6050: 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e 42 79 74  /.      int nByt
6060: 65 20 3d 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62  e = sqlite3_blob
6070: 5f 62 79 74 65 73 28 70 2d 3e 70 52 65 61 64 65  _bytes(p->pReade
6080: 72 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 41  r);.      int nA
6090: 6c 6c 6f 63 20 3d 20 73 69 7a 65 6f 66 28 46 74  lloc = sizeof(Ft
60a0: 73 35 44 61 74 61 29 20 2b 20 6e 42 79 74 65 20  s5Data) + nByte 
60b0: 2b 20 46 54 53 35 5f 44 41 54 41 5f 50 41 44 44  + FTS5_DATA_PADD
60c0: 49 4e 47 3b 0a 20 20 20 20 20 20 70 52 65 74 20  ING;.      pRet 
60d0: 3d 20 28 46 74 73 35 44 61 74 61 2a 29 73 71 6c  = (Fts5Data*)sql
60e0: 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 6e 41 6c 6c  ite3_malloc(nAll
60f0: 6f 63 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  oc);.      if( p
6100: 52 65 74 20 29 7b 0a 20 20 20 20 20 20 20 20 70  Ret ){.        p
6110: 52 65 74 2d 3e 6e 6e 20 3d 20 6e 42 79 74 65 3b  Ret->nn = nByte;
6120: 0a 20 20 20 20 20 20 20 20 61 4f 75 74 20 3d 20  .        aOut = 
6130: 70 52 65 74 2d 3e 70 20 3d 20 28 75 38 2a 29 26  pRet->p = (u8*)&
6140: 70 52 65 74 5b 31 5d 3b 0a 20 20 20 20 20 20 7d  pRet[1];.      }
6150: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 63  else{.        rc
6160: 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
6170: 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
6180: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
6190: 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  K ){.        rc 
61a0: 3d 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 72  = sqlite3_blob_r
61b0: 65 61 64 28 70 2d 3e 70 52 65 61 64 65 72 2c 20  ead(p->pReader, 
61c0: 61 4f 75 74 2c 20 6e 42 79 74 65 2c 20 30 29 3b  aOut, nByte, 0);
61d0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
61e0: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
61f0: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
6200: 74 65 33 5f 66 72 65 65 28 70 52 65 74 29 3b 0a  te3_free(pRet);.
6210: 20 20 20 20 20 20 20 20 70 52 65 74 20 3d 20 30          pRet = 0
6220: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
6230: 20 20 20 20 20 20 20 2f 2a 20 54 4f 44 4f 31 3a         /* TODO1:
6240: 20 46 69 78 20 74 68 69 73 20 2a 2f 0a 20 20 20   Fix this */.   
6250: 20 20 20 20 20 70 52 65 74 2d 3e 73 7a 4c 65 61       pRet->szLea
6260: 66 20 3d 20 66 74 73 35 47 65 74 55 31 36 28 26  f = fts5GetU16(&
6270: 70 52 65 74 2d 3e 70 5b 32 5d 29 3b 0a 20 20 20  pRet->p[2]);.   
6280: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70     }.    }.    p
6290: 2d 3e 72 63 20 3d 20 72 63 3b 0a 20 20 20 20 70  ->rc = rc;.    p
62a0: 2d 3e 6e 52 65 61 64 2b 2b 3b 0a 20 20 7d 0a 0a  ->nRead++;.  }..
62b0: 20 20 61 73 73 65 72 74 28 20 28 70 52 65 74 3d    assert( (pRet=
62c0: 3d 30 29 3d 3d 28 70 2d 3e 72 63 21 3d 53 51 4c  =0)==(p->rc!=SQL
62d0: 49 54 45 5f 4f 4b 29 20 29 3b 0a 20 20 72 65 74  ITE_OK) );.  ret
62e0: 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a  urn pRet;.}../*.
62f0: 2a 2a 20 52 65 6c 65 61 73 65 20 61 20 72 65 66  ** Release a ref
6300: 65 72 65 6e 63 65 20 74 6f 20 64 61 74 61 20 72  erence to data r
6310: 65 63 6f 72 64 20 72 65 74 75 72 6e 65 64 20 62  ecord returned b
6320: 79 20 61 6e 20 65 61 72 6c 69 65 72 20 63 61 6c  y an earlier cal
6330: 6c 20 74 6f 0a 2a 2a 20 66 74 73 35 44 61 74 61  l to.** fts5Data
6340: 52 65 61 64 28 29 2e 0a 2a 2f 0a 73 74 61 74 69  Read()..*/.stati
6350: 63 20 76 6f 69 64 20 66 74 73 35 44 61 74 61 52  c void fts5DataR
6360: 65 6c 65 61 73 65 28 46 74 73 35 44 61 74 61 20  elease(Fts5Data 
6370: 2a 70 44 61 74 61 29 7b 0a 20 20 73 71 6c 69 74  *pData){.  sqlit
6380: 65 33 5f 66 72 65 65 28 70 44 61 74 61 29 3b 0a  e3_free(pData);.
6390: 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74  }..static int ft
63a0: 73 35 49 6e 64 65 78 50 72 65 70 61 72 65 53 74  s5IndexPrepareSt
63b0: 6d 74 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20  mt(.  Fts5Index 
63c0: 2a 70 2c 0a 20 20 73 71 6c 69 74 65 33 5f 73 74  *p,.  sqlite3_st
63d0: 6d 74 20 2a 2a 70 70 53 74 6d 74 2c 0a 20 20 63  mt **ppStmt,.  c
63e0: 68 61 72 20 2a 7a 53 71 6c 0a 29 7b 0a 20 20 69  har *zSql.){.  i
63f0: 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  f( p->rc==SQLITE
6400: 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 7a  _OK ){.    if( z
6410: 53 71 6c 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e  Sql ){.      p->
6420: 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65  rc = sqlite3_pre
6430: 70 61 72 65 5f 76 32 28 70 2d 3e 70 43 6f 6e 66  pare_v2(p->pConf
6440: 69 67 2d 3e 64 62 2c 20 7a 53 71 6c 2c 20 2d 31  ig->db, zSql, -1
6450: 2c 20 70 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20  , ppStmt, 0);.  
6460: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
6470: 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f  ->rc = SQLITE_NO
6480: 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  MEM;.    }.  }. 
6490: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 53   sqlite3_free(zS
64a0: 71 6c 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 2d  ql);.  return p-
64b0: 3e 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 49  >rc;.}.../*.** I
64c0: 4e 53 45 52 54 20 4f 52 20 52 45 50 4c 41 43 45  NSERT OR REPLACE
64d0: 20 61 20 72 65 63 6f 72 64 20 69 6e 74 6f 20 74   a record into t
64e0: 68 65 20 25 5f 64 61 74 61 20 74 61 62 6c 65 2e  he %_data table.
64f0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
6500: 66 74 73 35 44 61 74 61 57 72 69 74 65 28 46 74  fts5DataWrite(Ft
6510: 73 35 49 6e 64 65 78 20 2a 70 2c 20 69 36 34 20  s5Index *p, i64 
6520: 69 52 6f 77 69 64 2c 20 63 6f 6e 73 74 20 75 38  iRowid, const u8
6530: 20 2a 70 44 61 74 61 2c 20 69 6e 74 20 6e 44 61   *pData, int nDa
6540: 74 61 29 7b 0a 20 20 69 66 28 20 70 2d 3e 72 63  ta){.  if( p->rc
6550: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65  !=SQLITE_OK ) re
6560: 74 75 72 6e 3b 0a 0a 20 20 69 66 28 20 70 2d 3e  turn;..  if( p->
6570: 70 57 72 69 74 65 72 3d 3d 30 20 29 7b 0a 20 20  pWriter==0 ){.  
6580: 20 20 46 74 73 35 43 6f 6e 66 69 67 20 2a 70 43    Fts5Config *pC
6590: 6f 6e 66 69 67 20 3d 20 70 2d 3e 70 43 6f 6e 66  onfig = p->pConf
65a0: 69 67 3b 0a 20 20 20 20 66 74 73 35 49 6e 64 65  ig;.    fts5Inde
65b0: 78 50 72 65 70 61 72 65 53 74 6d 74 28 70 2c 20  xPrepareStmt(p, 
65c0: 26 70 2d 3e 70 57 72 69 74 65 72 2c 20 73 71 6c  &p->pWriter, sql
65d0: 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 0a 20 20  ite3_mprintf(.  
65e0: 20 20 20 20 20 20 20 20 22 52 45 50 4c 41 43 45          "REPLACE
65f0: 20 49 4e 54 4f 20 27 25 71 27 2e 27 25 71 5f 64   INTO '%q'.'%q_d
6600: 61 74 61 27 28 69 64 2c 20 62 6c 6f 63 6b 29 20  ata'(id, block) 
6610: 56 41 4c 55 45 53 28 3f 2c 3f 29 22 2c 20 0a 20  VALUES(?,?)", . 
6620: 20 20 20 20 20 20 20 20 20 70 43 6f 6e 66 69 67           pConfig
6630: 2d 3e 7a 44 62 2c 20 70 43 6f 6e 66 69 67 2d 3e  ->zDb, pConfig->
6640: 7a 4e 61 6d 65 0a 20 20 20 20 29 29 3b 0a 20 20  zName.    ));.  
6650: 20 20 69 66 28 20 70 2d 3e 72 63 20 29 20 72 65    if( p->rc ) re
6660: 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20 73 71 6c  turn;.  }..  sql
6670: 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 36 34 28  ite3_bind_int64(
6680: 70 2d 3e 70 57 72 69 74 65 72 2c 20 31 2c 20 69  p->pWriter, 1, i
6690: 52 6f 77 69 64 29 3b 0a 20 20 73 71 6c 69 74 65  Rowid);.  sqlite
66a0: 33 5f 62 69 6e 64 5f 62 6c 6f 62 28 70 2d 3e 70  3_bind_blob(p->p
66b0: 57 72 69 74 65 72 2c 20 32 2c 20 70 44 61 74 61  Writer, 2, pData
66c0: 2c 20 6e 44 61 74 61 2c 20 53 51 4c 49 54 45 5f  , nData, SQLITE_
66d0: 53 54 41 54 49 43 29 3b 0a 20 20 73 71 6c 69 74  STATIC);.  sqlit
66e0: 65 33 5f 73 74 65 70 28 70 2d 3e 70 57 72 69 74  e3_step(p->pWrit
66f0: 65 72 29 3b 0a 20 20 70 2d 3e 72 63 20 3d 20 73  er);.  p->rc = s
6700: 71 6c 69 74 65 33 5f 72 65 73 65 74 28 70 2d 3e  qlite3_reset(p->
6710: 70 57 72 69 74 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a  pWriter);.}../*.
6720: 2a 2a 20 45 78 65 63 75 74 65 20 74 68 65 20 66  ** Execute the f
6730: 6f 6c 6c 6f 77 69 6e 67 20 53 51 4c 3a 0a 2a 2a  ollowing SQL:.**
6740: 0a 2a 2a 20 20 20 20 20 44 45 4c 45 54 45 20 46  .**     DELETE F
6750: 52 4f 4d 20 25 5f 64 61 74 61 20 57 48 45 52 45  ROM %_data WHERE
6760: 20 69 64 20 42 45 54 57 45 45 4e 20 24 69 46 69   id BETWEEN $iFi
6770: 72 73 74 20 41 4e 44 20 24 69 4c 61 73 74 0a 2a  rst AND $iLast.*
6780: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  /.static void ft
6790: 73 35 44 61 74 61 44 65 6c 65 74 65 28 46 74 73  s5DataDelete(Fts
67a0: 35 49 6e 64 65 78 20 2a 70 2c 20 69 36 34 20 69  5Index *p, i64 i
67b0: 46 69 72 73 74 2c 20 69 36 34 20 69 4c 61 73 74  First, i64 iLast
67c0: 29 7b 0a 20 20 69 66 28 20 70 2d 3e 72 63 21 3d  ){.  if( p->rc!=
67d0: 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75  SQLITE_OK ) retu
67e0: 72 6e 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 70 44  rn;..  if( p->pD
67f0: 65 6c 65 74 65 72 3d 3d 30 20 29 7b 0a 20 20 20  eleter==0 ){.   
6800: 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 46 74 73   int rc;.    Fts
6810: 35 43 6f 6e 66 69 67 20 2a 70 43 6f 6e 66 69 67  5Config *pConfig
6820: 20 3d 20 70 2d 3e 70 43 6f 6e 66 69 67 3b 0a 20   = p->pConfig;. 
6830: 20 20 20 63 68 61 72 20 2a 7a 53 71 6c 20 3d 20     char *zSql = 
6840: 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
6850: 0a 20 20 20 20 20 20 20 20 22 44 45 4c 45 54 45  .        "DELETE
6860: 20 46 52 4f 4d 20 27 25 71 27 2e 27 25 71 5f 64   FROM '%q'.'%q_d
6870: 61 74 61 27 20 57 48 45 52 45 20 69 64 3e 3d 3f  ata' WHERE id>=?
6880: 20 41 4e 44 20 69 64 3c 3d 3f 22 2c 20 0a 20 20   AND id<=?", .  
6890: 20 20 20 20 20 20 20 20 70 43 6f 6e 66 69 67 2d          pConfig-
68a0: 3e 7a 44 62 2c 20 70 43 6f 6e 66 69 67 2d 3e 7a  >zDb, pConfig->z
68b0: 4e 61 6d 65 0a 20 20 20 20 29 3b 0a 20 20 20 20  Name.    );.    
68c0: 69 66 28 20 7a 53 71 6c 3d 3d 30 20 29 7b 0a 20  if( zSql==0 ){. 
68d0: 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
68e0: 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 65 6c 73  _NOMEM;.    }els
68f0: 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  e{.      rc = sq
6900: 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32  lite3_prepare_v2
6910: 28 70 43 6f 6e 66 69 67 2d 3e 64 62 2c 20 7a 53  (pConfig->db, zS
6920: 71 6c 2c 20 2d 31 2c 20 26 70 2d 3e 70 44 65 6c  ql, -1, &p->pDel
6930: 65 74 65 72 2c 20 30 29 3b 0a 20 20 20 20 20 20  eter, 0);.      
6940: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 53 71  sqlite3_free(zSq
6950: 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  l);.    }.    if
6960: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
6970: 29 7b 0a 20 20 20 20 20 20 70 2d 3e 72 63 20 3d  ){.      p->rc =
6980: 20 72 63 3b 0a 20 20 20 20 20 20 72 65 74 75 72   rc;.      retur
6990: 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  n;.    }.  }..  
69a0: 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74  sqlite3_bind_int
69b0: 36 34 28 70 2d 3e 70 44 65 6c 65 74 65 72 2c 20  64(p->pDeleter, 
69c0: 31 2c 20 69 46 69 72 73 74 29 3b 0a 20 20 73 71  1, iFirst);.  sq
69d0: 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 36 34  lite3_bind_int64
69e0: 28 70 2d 3e 70 44 65 6c 65 74 65 72 2c 20 32 2c  (p->pDeleter, 2,
69f0: 20 69 4c 61 73 74 29 3b 0a 20 20 73 71 6c 69 74   iLast);.  sqlit
6a00: 65 33 5f 73 74 65 70 28 70 2d 3e 70 44 65 6c 65  e3_step(p->pDele
6a10: 74 65 72 29 3b 0a 20 20 70 2d 3e 72 63 20 3d 20  ter);.  p->rc = 
6a20: 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28 70 2d  sqlite3_reset(p-
6a30: 3e 70 44 65 6c 65 74 65 72 29 3b 0a 7d 0a 0a 2f  >pDeleter);.}../
6a40: 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20 61 6c 6c 20  *.** Remove all 
6a50: 72 65 63 6f 72 64 73 20 61 73 73 6f 63 69 61 74  records associat
6a60: 65 64 20 77 69 74 68 20 73 65 67 6d 65 6e 74 20  ed with segment 
6a70: 69 53 65 67 69 64 2e 0a 2a 2f 0a 73 74 61 74 69  iSegid..*/.stati
6a80: 63 20 76 6f 69 64 20 66 74 73 35 44 61 74 61 52  c void fts5DataR
6a90: 65 6d 6f 76 65 53 65 67 6d 65 6e 74 28 46 74 73  emoveSegment(Fts
6aa0: 35 49 6e 64 65 78 20 2a 70 2c 20 69 6e 74 20 69  5Index *p, int i
6ab0: 53 65 67 69 64 29 7b 0a 20 20 69 36 34 20 69 46  Segid){.  i64 iF
6ac0: 69 72 73 74 20 3d 20 46 54 53 35 5f 53 45 47 4d  irst = FTS5_SEGM
6ad0: 45 4e 54 5f 52 4f 57 49 44 28 69 53 65 67 69 64  ENT_ROWID(iSegid
6ae0: 2c 20 30 29 3b 0a 20 20 69 36 34 20 69 4c 61 73  , 0);.  i64 iLas
6af0: 74 20 3d 20 46 54 53 35 5f 53 45 47 4d 45 4e 54  t = FTS5_SEGMENT
6b00: 5f 52 4f 57 49 44 28 69 53 65 67 69 64 2b 31 2c  _ROWID(iSegid+1,
6b10: 20 30 29 2d 31 3b 0a 20 20 66 74 73 35 44 61 74   0)-1;.  fts5Dat
6b20: 61 44 65 6c 65 74 65 28 70 2c 20 69 46 69 72 73  aDelete(p, iFirs
6b30: 74 2c 20 69 4c 61 73 74 29 3b 0a 20 20 69 66 28  t, iLast);.  if(
6b40: 20 70 2d 3e 70 49 64 78 44 65 6c 65 74 65 72 3d   p->pIdxDeleter=
6b50: 3d 30 20 29 7b 0a 20 20 20 20 46 74 73 35 43 6f  =0 ){.    Fts5Co
6b60: 6e 66 69 67 20 2a 70 43 6f 6e 66 69 67 20 3d 20  nfig *pConfig = 
6b70: 70 2d 3e 70 43 6f 6e 66 69 67 3b 0a 20 20 20 20  p->pConfig;.    
6b80: 66 74 73 35 49 6e 64 65 78 50 72 65 70 61 72 65  fts5IndexPrepare
6b90: 53 74 6d 74 28 70 2c 20 26 70 2d 3e 70 49 64 78  Stmt(p, &p->pIdx
6ba0: 44 65 6c 65 74 65 72 2c 20 73 71 6c 69 74 65 33  Deleter, sqlite3
6bb0: 5f 6d 70 72 69 6e 74 66 28 0a 20 20 20 20 20 20  _mprintf(.      
6bc0: 20 20 20 20 22 44 45 4c 45 54 45 20 46 52 4f 4d      "DELETE FROM
6bd0: 20 27 25 71 27 2e 27 25 71 5f 69 64 78 27 20 57   '%q'.'%q_idx' W
6be0: 48 45 52 45 20 73 65 67 69 64 3d 3f 22 2c 0a 20  HERE segid=?",. 
6bf0: 20 20 20 20 20 20 20 20 20 70 43 6f 6e 66 69 67           pConfig
6c00: 2d 3e 7a 44 62 2c 20 70 43 6f 6e 66 69 67 2d 3e  ->zDb, pConfig->
6c10: 7a 4e 61 6d 65 0a 20 20 20 20 29 29 3b 0a 20 20  zName.    ));.  
6c20: 7d 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53  }.  if( p->rc==S
6c30: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
6c40: 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74  sqlite3_bind_int
6c50: 28 70 2d 3e 70 49 64 78 44 65 6c 65 74 65 72 2c  (p->pIdxDeleter,
6c60: 20 31 2c 20 69 53 65 67 69 64 29 3b 0a 20 20 20   1, iSegid);.   
6c70: 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 2d   sqlite3_step(p-
6c80: 3e 70 49 64 78 44 65 6c 65 74 65 72 29 3b 0a 20  >pIdxDeleter);. 
6c90: 20 20 20 70 2d 3e 72 63 20 3d 20 73 71 6c 69 74     p->rc = sqlit
6ca0: 65 33 5f 72 65 73 65 74 28 70 2d 3e 70 49 64 78  e3_reset(p->pIdx
6cb0: 44 65 6c 65 74 65 72 29 3b 0a 20 20 7d 0a 7d 0a  Deleter);.  }.}.
6cc0: 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61  ./*.** Release a
6cd0: 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 61 6e   reference to an
6ce0: 20 46 74 73 35 53 74 72 75 63 74 75 72 65 20 6f   Fts5Structure o
6cf0: 62 6a 65 63 74 20 72 65 74 75 72 6e 65 64 20 62  bject returned b
6d00: 79 20 61 6e 20 65 61 72 6c 69 65 72 20 0a 2a 2a  y an earlier .**
6d10: 20 63 61 6c 6c 20 74 6f 20 66 74 73 35 53 74 72   call to fts5Str
6d20: 75 63 74 75 72 65 52 65 61 64 28 29 20 6f 72 20  uctureRead() or 
6d30: 66 74 73 35 53 74 72 75 63 74 75 72 65 44 65 63  fts5StructureDec
6d40: 6f 64 65 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63  ode()..*/.static
6d50: 20 76 6f 69 64 20 66 74 73 35 53 74 72 75 63 74   void fts5Struct
6d60: 75 72 65 52 65 6c 65 61 73 65 28 46 74 73 35 53  ureRelease(Fts5S
6d70: 74 72 75 63 74 75 72 65 20 2a 70 53 74 72 75 63  tructure *pStruc
6d80: 74 29 7b 0a 20 20 69 66 28 20 70 53 74 72 75 63  t){.  if( pStruc
6d90: 74 20 26 26 20 30 3e 3d 28 2d 2d 70 53 74 72 75  t && 0>=(--pStru
6da0: 63 74 2d 3e 6e 52 65 66 29 20 29 7b 0a 20 20 20  ct->nRef) ){.   
6db0: 20 69 6e 74 20 69 3b 0a 20 20 20 20 61 73 73 65   int i;.    asse
6dc0: 72 74 28 20 70 53 74 72 75 63 74 2d 3e 6e 52 65  rt( pStruct->nRe
6dd0: 66 3d 3d 30 20 29 3b 0a 20 20 20 20 66 6f 72 28  f==0 );.    for(
6de0: 69 3d 30 3b 20 69 3c 70 53 74 72 75 63 74 2d 3e  i=0; i<pStruct->
6df0: 6e 4c 65 76 65 6c 3b 20 69 2b 2b 29 7b 0a 20 20  nLevel; i++){.  
6e00: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
6e10: 28 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c  (pStruct->aLevel
6e20: 5b 69 5d 2e 61 53 65 67 29 3b 0a 20 20 20 20 7d  [i].aSeg);.    }
6e30: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
6e40: 65 28 70 53 74 72 75 63 74 29 3b 0a 20 20 7d 0a  e(pStruct);.  }.
6e50: 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  }..static void f
6e60: 74 73 35 53 74 72 75 63 74 75 72 65 52 65 66 28  ts5StructureRef(
6e70: 46 74 73 35 53 74 72 75 63 74 75 72 65 20 2a 70  Fts5Structure *p
6e80: 53 74 72 75 63 74 29 7b 0a 20 20 70 53 74 72 75  Struct){.  pStru
6e90: 63 74 2d 3e 6e 52 65 66 2b 2b 3b 0a 7d 0a 0a 2f  ct->nRef++;.}../
6ea0: 2a 0a 2a 2a 20 44 65 73 65 72 69 61 6c 69 7a 65  *.** Deserialize
6eb0: 20 61 6e 64 20 72 65 74 75 72 6e 20 74 68 65 20   and return the 
6ec0: 73 74 72 75 63 74 75 72 65 20 72 65 63 6f 72 64  structure record
6ed0: 20 63 75 72 72 65 6e 74 6c 79 20 73 74 6f 72 65   currently store
6ee0: 64 20 69 6e 20 73 65 72 69 61 6c 69 7a 65 64 0a  d in serialized.
6ef0: 2a 2a 20 66 6f 72 6d 20 77 69 74 68 69 6e 20 62  ** form within b
6f00: 75 66 66 65 72 20 70 44 61 74 61 2f 6e 44 61 74  uffer pData/nDat
6f10: 61 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 46 74 73  a..**.** The Fts
6f20: 35 53 74 72 75 63 74 75 72 65 2e 61 4c 65 76 65  5Structure.aLeve
6f30: 6c 5b 5d 20 61 6e 64 20 65 61 63 68 20 46 74 73  l[] and each Fts
6f40: 35 53 74 72 75 63 74 75 72 65 4c 65 76 65 6c 2e  5StructureLevel.
6f50: 61 53 65 67 5b 5d 20 61 72 72 61 79 0a 2a 2a 20  aSeg[] array.** 
6f60: 61 72 65 20 6f 76 65 72 2d 61 6c 6c 6f 63 61 74  are over-allocat
6f70: 65 64 20 62 79 20 6f 6e 65 20 73 6c 6f 74 2e 20  ed by one slot. 
6f80: 54 68 69 73 20 61 6c 6c 6f 77 73 20 74 68 65 20  This allows the 
6f90: 73 74 72 75 63 74 75 72 65 20 63 6f 6e 74 65 6e  structure conten
6fa0: 74 73 0a 2a 2a 20 74 6f 20 62 65 20 6d 6f 72 65  ts.** to be more
6fb0: 20 65 61 73 69 6c 79 20 65 64 69 74 65 64 2e 0a   easily edited..
6fc0: 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f  **.** If an erro
6fd0: 72 20 6f 63 63 75 72 73 2c 20 2a 70 70 4f 75 74  r occurs, *ppOut
6fe0: 20 69 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c 20   is set to NULL 
6ff0: 61 6e 64 20 61 6e 20 53 51 4c 69 74 65 20 65 72  and an SQLite er
7000: 72 6f 72 20 63 6f 64 65 0a 2a 2a 20 72 65 74 75  ror code.** retu
7010: 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c  rned. Otherwise,
7020: 20 2a 70 70 4f 75 74 20 69 73 20 73 65 74 20 74   *ppOut is set t
7030: 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 6e  o point to the n
7040: 65 77 20 6f 62 6a 65 63 74 20 61 6e 64 0a 2a 2a  ew object and.**
7050: 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72   SQLITE_OK retur
7060: 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ned..*/.static i
7070: 6e 74 20 66 74 73 35 53 74 72 75 63 74 75 72 65  nt fts5Structure
7080: 44 65 63 6f 64 65 28 0a 20 20 63 6f 6e 73 74 20  Decode(.  const 
7090: 75 38 20 2a 70 44 61 74 61 2c 20 20 20 20 20 20  u8 *pData,      
70a0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 75 66            /* Buf
70b0: 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 73  fer containing s
70c0: 65 72 69 61 6c 69 7a 65 64 20 73 74 72 75 63 74  erialized struct
70d0: 75 72 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 44 61  ure */.  int nDa
70e0: 74 61 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ta,             
70f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
7100: 20 6f 66 20 62 75 66 66 65 72 20 70 44 61 74 61   of buffer pData
7110: 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 69   in bytes */.  i
7120: 6e 74 20 2a 70 69 43 6f 6f 6b 69 65 2c 20 20 20  nt *piCookie,   
7130: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
7140: 2a 20 43 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20  * Configuration 
7150: 63 6f 6f 6b 69 65 20 76 61 6c 75 65 20 2a 2f 0a  cookie value */.
7160: 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65 20    Fts5Structure 
7170: 2a 2a 70 70 4f 75 74 20 20 20 20 20 20 20 20 20  **ppOut         
7180: 20 20 2f 2a 20 4f 55 54 3a 20 44 65 73 65 72 69    /* OUT: Deseri
7190: 61 6c 69 7a 65 64 20 6f 62 6a 65 63 74 20 2a 2f  alized object */
71a0: 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  .){.  int rc = S
71b0: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20  QLITE_OK;.  int 
71c0: 69 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 4c 76  i = 0;.  int iLv
71d0: 6c 3b 0a 20 20 69 6e 74 20 6e 4c 65 76 65 6c 20  l;.  int nLevel 
71e0: 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 53 65 67 6d  = 0;.  int nSegm
71f0: 65 6e 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e  ent = 0;.  int n
7200: 42 79 74 65 3b 20 20 20 20 20 20 20 20 20 20 20  Byte;           
7210: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79             /* By
7220: 74 65 73 20 6f 66 20 73 70 61 63 65 20 74 6f 20  tes of space to 
7230: 61 6c 6c 6f 63 61 74 65 20 61 74 20 70 52 65 74  allocate at pRet
7240: 20 2a 2f 0a 20 20 46 74 73 35 53 74 72 75 63 74   */.  Fts5Struct
7250: 75 72 65 20 2a 70 52 65 74 20 3d 20 30 3b 20 20  ure *pRet = 0;  
7260: 20 20 20 20 20 20 2f 2a 20 53 74 72 75 63 74 75        /* Structu
7270: 72 65 20 6f 62 6a 65 63 74 20 74 6f 20 72 65 74  re object to ret
7280: 75 72 6e 20 2a 2f 0a 0a 20 20 2f 2a 20 47 72 61  urn */..  /* Gra
7290: 62 20 74 68 65 20 63 6f 6f 6b 69 65 20 76 61 6c  b the cookie val
72a0: 75 65 20 2a 2f 0a 20 20 69 66 28 20 70 69 43 6f  ue */.  if( piCo
72b0: 6f 6b 69 65 20 29 20 2a 70 69 43 6f 6f 6b 69 65  okie ) *piCookie
72c0: 20 3d 20 73 71 6c 69 74 65 33 46 74 73 35 47 65   = sqlite3Fts5Ge
72d0: 74 33 32 28 70 44 61 74 61 29 3b 0a 20 20 69 20  t32(pData);.  i 
72e0: 3d 20 34 3b 0a 0a 20 20 2f 2a 20 52 65 61 64 20  = 4;..  /* Read 
72f0: 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72  the total number
7300: 20 6f 66 20 6c 65 76 65 6c 73 20 61 6e 64 20 73   of levels and s
7310: 65 67 6d 65 6e 74 73 20 66 72 6f 6d 20 74 68 65  egments from the
7320: 20 73 74 61 72 74 20 6f 66 20 74 68 65 0a 20 20   start of the.  
7330: 2a 2a 20 73 74 72 75 63 74 75 72 65 20 72 65 63  ** structure rec
7340: 6f 72 64 2e 20 20 2a 2f 0a 20 20 69 20 2b 3d 20  ord.  */.  i += 
7350: 66 74 73 35 47 65 74 56 61 72 69 6e 74 33 32 28  fts5GetVarint32(
7360: 26 70 44 61 74 61 5b 69 5d 2c 20 6e 4c 65 76 65  &pData[i], nLeve
7370: 6c 29 3b 0a 20 20 69 20 2b 3d 20 66 74 73 35 47  l);.  i += fts5G
7380: 65 74 56 61 72 69 6e 74 33 32 28 26 70 44 61 74  etVarint32(&pDat
7390: 61 5b 69 5d 2c 20 6e 53 65 67 6d 65 6e 74 29 3b  a[i], nSegment);
73a0: 0a 20 20 6e 42 79 74 65 20 3d 20 28 0a 20 20 20  .  nByte = (.   
73b0: 20 20 20 73 69 7a 65 6f 66 28 46 74 73 35 53 74     sizeof(Fts5St
73c0: 72 75 63 74 75 72 65 29 20 2b 20 20 20 20 20 20  ructure) +      
73d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
73e0: 20 4d 61 69 6e 20 73 74 72 75 63 74 75 72 65 20   Main structure 
73f0: 2a 2f 0a 20 20 20 20 20 20 73 69 7a 65 6f 66 28  */.      sizeof(
7400: 46 74 73 35 53 74 72 75 63 74 75 72 65 4c 65 76  Fts5StructureLev
7410: 65 6c 29 20 2a 20 28 6e 4c 65 76 65 6c 2d 31 29  el) * (nLevel-1)
7420: 20 20 20 20 2f 2a 20 61 4c 65 76 65 6c 5b 5d 20      /* aLevel[] 
7430: 61 72 72 61 79 20 2a 2f 0a 20 20 29 3b 0a 20 20  array */.  );.  
7440: 70 52 65 74 20 3d 20 28 46 74 73 35 53 74 72 75  pRet = (Fts5Stru
7450: 63 74 75 72 65 2a 29 73 71 6c 69 74 65 33 46 74  cture*)sqlite3Ft
7460: 73 35 4d 61 6c 6c 6f 63 5a 65 72 6f 28 26 72 63  s5MallocZero(&rc
7470: 2c 20 6e 42 79 74 65 29 3b 0a 0a 20 20 69 66 28  , nByte);..  if(
7480: 20 70 52 65 74 20 29 7b 0a 20 20 20 20 70 52 65   pRet ){.    pRe
7490: 74 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20 20  t->nRef = 1;.   
74a0: 20 70 52 65 74 2d 3e 6e 4c 65 76 65 6c 20 3d 20   pRet->nLevel = 
74b0: 6e 4c 65 76 65 6c 3b 0a 20 20 20 20 70 52 65 74  nLevel;.    pRet
74c0: 2d 3e 6e 53 65 67 6d 65 6e 74 20 3d 20 6e 53 65  ->nSegment = nSe
74d0: 67 6d 65 6e 74 3b 0a 20 20 20 20 69 20 2b 3d 20  gment;.    i += 
74e0: 73 71 6c 69 74 65 33 46 74 73 35 47 65 74 56 61  sqlite3Fts5GetVa
74f0: 72 69 6e 74 28 26 70 44 61 74 61 5b 69 5d 2c 20  rint(&pData[i], 
7500: 26 70 52 65 74 2d 3e 6e 57 72 69 74 65 43 6f 75  &pRet->nWriteCou
7510: 6e 74 65 72 29 3b 0a 0a 20 20 20 20 66 6f 72 28  nter);..    for(
7520: 69 4c 76 6c 3d 30 3b 20 72 63 3d 3d 53 51 4c 49  iLvl=0; rc==SQLI
7530: 54 45 5f 4f 4b 20 26 26 20 69 4c 76 6c 3c 6e 4c  TE_OK && iLvl<nL
7540: 65 76 65 6c 3b 20 69 4c 76 6c 2b 2b 29 7b 0a 20  evel; iLvl++){. 
7550: 20 20 20 20 20 46 74 73 35 53 74 72 75 63 74 75       Fts5Structu
7560: 72 65 4c 65 76 65 6c 20 2a 70 4c 76 6c 20 3d 20  reLevel *pLvl = 
7570: 26 70 52 65 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c  &pRet->aLevel[iL
7580: 76 6c 5d 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e  vl];.      int n
7590: 54 6f 74 61 6c 3b 0a 20 20 20 20 20 20 69 6e 74  Total;.      int
75a0: 20 69 53 65 67 3b 0a 0a 20 20 20 20 20 20 69 20   iSeg;..      i 
75b0: 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e 74  += fts5GetVarint
75c0: 33 32 28 26 70 44 61 74 61 5b 69 5d 2c 20 70 4c  32(&pData[i], pL
75d0: 76 6c 2d 3e 6e 4d 65 72 67 65 29 3b 0a 20 20 20  vl->nMerge);.   
75e0: 20 20 20 69 20 2b 3d 20 66 74 73 35 47 65 74 56     i += fts5GetV
75f0: 61 72 69 6e 74 33 32 28 26 70 44 61 74 61 5b 69  arint32(&pData[i
7600: 5d 2c 20 6e 54 6f 74 61 6c 29 3b 0a 20 20 20 20  ], nTotal);.    
7610: 20 20 61 73 73 65 72 74 28 20 6e 54 6f 74 61 6c    assert( nTotal
7620: 3e 3d 70 4c 76 6c 2d 3e 6e 4d 65 72 67 65 20 29  >=pLvl->nMerge )
7630: 3b 0a 20 20 20 20 20 20 70 4c 76 6c 2d 3e 61 53  ;.      pLvl->aS
7640: 65 67 20 3d 20 28 46 74 73 35 53 74 72 75 63 74  eg = (Fts5Struct
7650: 75 72 65 53 65 67 6d 65 6e 74 2a 29 73 71 6c 69  ureSegment*)sqli
7660: 74 65 33 46 74 73 35 4d 61 6c 6c 6f 63 5a 65 72  te3Fts5MallocZer
7670: 6f 28 26 72 63 2c 20 0a 20 20 20 20 20 20 20 20  o(&rc, .        
7680: 20 20 6e 54 6f 74 61 6c 20 2a 20 73 69 7a 65 6f    nTotal * sizeo
7690: 66 28 46 74 73 35 53 74 72 75 63 74 75 72 65 53  f(Fts5StructureS
76a0: 65 67 6d 65 6e 74 29 0a 20 20 20 20 20 20 29 3b  egment).      );
76b0: 0a 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ..      if( rc==
76c0: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
76d0: 20 20 20 20 20 70 4c 76 6c 2d 3e 6e 53 65 67 20       pLvl->nSeg 
76e0: 3d 20 6e 54 6f 74 61 6c 3b 0a 20 20 20 20 20 20  = nTotal;.      
76f0: 20 20 66 6f 72 28 69 53 65 67 3d 30 3b 20 69 53    for(iSeg=0; iS
7700: 65 67 3c 6e 54 6f 74 61 6c 3b 20 69 53 65 67 2b  eg<nTotal; iSeg+
7710: 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 20  +){.          i 
7720: 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e 74  += fts5GetVarint
7730: 33 32 28 26 70 44 61 74 61 5b 69 5d 2c 20 70 4c  32(&pData[i], pL
7740: 76 6c 2d 3e 61 53 65 67 5b 69 53 65 67 5d 2e 69  vl->aSeg[iSeg].i
7750: 53 65 67 69 64 29 3b 0a 20 20 20 20 20 20 20 20  Segid);.        
7760: 20 20 69 20 2b 3d 20 66 74 73 35 47 65 74 56 61    i += fts5GetVa
7770: 72 69 6e 74 33 32 28 26 70 44 61 74 61 5b 69 5d  rint32(&pData[i]
7780: 2c 20 70 4c 76 6c 2d 3e 61 53 65 67 5b 69 53 65  , pLvl->aSeg[iSe
7790: 67 5d 2e 70 67 6e 6f 46 69 72 73 74 29 3b 0a 20  g].pgnoFirst);. 
77a0: 20 20 20 20 20 20 20 20 20 69 20 2b 3d 20 66 74           i += ft
77b0: 73 35 47 65 74 56 61 72 69 6e 74 33 32 28 26 70  s5GetVarint32(&p
77c0: 44 61 74 61 5b 69 5d 2c 20 70 4c 76 6c 2d 3e 61  Data[i], pLvl->a
77d0: 53 65 67 5b 69 53 65 67 5d 2e 70 67 6e 6f 4c 61  Seg[iSeg].pgnoLa
77e0: 73 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  st);.        }. 
77f0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
7800: 20 20 20 20 66 74 73 35 53 74 72 75 63 74 75 72      fts5Structur
7810: 65 52 65 6c 65 61 73 65 28 70 52 65 74 29 3b 0a  eRelease(pRet);.
7820: 20 20 20 20 20 20 20 20 70 52 65 74 20 3d 20 30          pRet = 0
7830: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
7840: 20 20 7d 0a 0a 20 20 2a 70 70 4f 75 74 20 3d 20    }..  *ppOut = 
7850: 70 52 65 74 3b 0a 20 20 72 65 74 75 72 6e 20 72  pRet;.  return r
7860: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 0a 2a 2f 0a 73  c;.}../*.**.*/.s
7870: 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 53  tatic void fts5S
7880: 74 72 75 63 74 75 72 65 41 64 64 4c 65 76 65 6c  tructureAddLevel
7890: 28 69 6e 74 20 2a 70 52 63 2c 20 46 74 73 35 53  (int *pRc, Fts5S
78a0: 74 72 75 63 74 75 72 65 20 2a 2a 70 70 53 74 72  tructure **ppStr
78b0: 75 63 74 29 7b 0a 20 20 69 66 28 20 2a 70 52 63  uct){.  if( *pRc
78c0: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
78d0: 20 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65     Fts5Structure
78e0: 20 2a 70 53 74 72 75 63 74 20 3d 20 2a 70 70 53   *pStruct = *ppS
78f0: 74 72 75 63 74 3b 0a 20 20 20 20 69 6e 74 20 6e  truct;.    int n
7900: 4c 65 76 65 6c 20 3d 20 70 53 74 72 75 63 74 2d  Level = pStruct-
7910: 3e 6e 4c 65 76 65 6c 3b 0a 20 20 20 20 69 6e 74  >nLevel;.    int
7920: 20 6e 42 79 74 65 20 3d 20 28 0a 20 20 20 20 20   nByte = (.     
7930: 20 20 20 73 69 7a 65 6f 66 28 46 74 73 35 53 74     sizeof(Fts5St
7940: 72 75 63 74 75 72 65 29 20 2b 20 20 20 20 20 20  ructure) +      
7950: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
7960: 61 69 6e 20 73 74 72 75 63 74 75 72 65 20 2a 2f  ain structure */
7970: 0a 20 20 20 20 20 20 20 20 73 69 7a 65 6f 66 28  .        sizeof(
7980: 46 74 73 35 53 74 72 75 63 74 75 72 65 4c 65 76  Fts5StructureLev
7990: 65 6c 29 20 2a 20 28 6e 4c 65 76 65 6c 2b 31 29  el) * (nLevel+1)
79a0: 20 20 2f 2a 20 61 4c 65 76 65 6c 5b 5d 20 61 72    /* aLevel[] ar
79b0: 72 61 79 20 2a 2f 0a 20 20 20 20 29 3b 0a 0a 20  ray */.    );.. 
79c0: 20 20 20 70 53 74 72 75 63 74 20 3d 20 73 71 6c     pStruct = sql
79d0: 69 74 65 33 5f 72 65 61 6c 6c 6f 63 28 70 53 74  ite3_realloc(pSt
79e0: 72 75 63 74 2c 20 6e 42 79 74 65 29 3b 0a 20 20  ruct, nByte);.  
79f0: 20 20 69 66 28 20 70 53 74 72 75 63 74 20 29 7b    if( pStruct ){
7a00: 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 26 70  .      memset(&p
7a10: 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 6e  Struct->aLevel[n
7a20: 4c 65 76 65 6c 5d 2c 20 30 2c 20 73 69 7a 65 6f  Level], 0, sizeo
7a30: 66 28 46 74 73 35 53 74 72 75 63 74 75 72 65 4c  f(Fts5StructureL
7a40: 65 76 65 6c 29 29 3b 0a 20 20 20 20 20 20 70 53  evel));.      pS
7a50: 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 2b 2b 3b  truct->nLevel++;
7a60: 0a 20 20 20 20 20 20 2a 70 70 53 74 72 75 63 74  .      *ppStruct
7a70: 20 3d 20 70 53 74 72 75 63 74 3b 0a 20 20 20 20   = pStruct;.    
7a80: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2a 70 52  }else{.      *pR
7a90: 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
7aa0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  ;.    }.  }.}../
7ab0: 2a 0a 2a 2a 20 45 78 74 65 6e 64 20 6c 65 76 65  *.** Extend leve
7ac0: 6c 20 69 4c 76 6c 20 73 6f 20 74 68 61 74 20 74  l iLvl so that t
7ad0: 68 65 72 65 20 69 73 20 72 6f 6f 6d 20 66 6f 72  here is room for
7ae0: 20 61 74 20 6c 65 61 73 74 20 6e 45 78 74 72 61   at least nExtra
7af0: 20 6d 6f 72 65 0a 2a 2a 20 73 65 67 6d 65 6e 74   more.** segment
7b00: 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  s..*/.static voi
7b10: 64 20 66 74 73 35 53 74 72 75 63 74 75 72 65 45  d fts5StructureE
7b20: 78 74 65 6e 64 4c 65 76 65 6c 28 0a 20 20 69 6e  xtendLevel(.  in
7b30: 74 20 2a 70 52 63 2c 20 0a 20 20 46 74 73 35 53  t *pRc, .  Fts5S
7b40: 74 72 75 63 74 75 72 65 20 2a 70 53 74 72 75 63  tructure *pStruc
7b50: 74 2c 20 0a 20 20 69 6e 74 20 69 4c 76 6c 2c 20  t, .  int iLvl, 
7b60: 0a 20 20 69 6e 74 20 6e 45 78 74 72 61 2c 20 0a  .  int nExtra, .
7b70: 20 20 69 6e 74 20 62 49 6e 73 65 72 74 0a 29 7b    int bInsert.){
7b80: 0a 20 20 69 66 28 20 2a 70 52 63 3d 3d 53 51 4c  .  if( *pRc==SQL
7b90: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 46 74  ITE_OK ){.    Ft
7ba0: 73 35 53 74 72 75 63 74 75 72 65 4c 65 76 65 6c  s5StructureLevel
7bb0: 20 2a 70 4c 76 6c 20 3d 20 26 70 53 74 72 75 63   *pLvl = &pStruc
7bc0: 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d 3b  t->aLevel[iLvl];
7bd0: 0a 20 20 20 20 46 74 73 35 53 74 72 75 63 74 75  .    Fts5Structu
7be0: 72 65 53 65 67 6d 65 6e 74 20 2a 61 4e 65 77 3b  reSegment *aNew;
7bf0: 0a 20 20 20 20 69 6e 74 20 6e 42 79 74 65 3b 0a  .    int nByte;.
7c00: 0a 20 20 20 20 6e 42 79 74 65 20 3d 20 28 70 4c  .    nByte = (pL
7c10: 76 6c 2d 3e 6e 53 65 67 20 2b 20 6e 45 78 74 72  vl->nSeg + nExtr
7c20: 61 29 20 2a 20 73 69 7a 65 6f 66 28 46 74 73 35  a) * sizeof(Fts5
7c30: 53 74 72 75 63 74 75 72 65 53 65 67 6d 65 6e 74  StructureSegment
7c40: 29 3b 0a 20 20 20 20 61 4e 65 77 20 3d 20 73 71  );.    aNew = sq
7c50: 6c 69 74 65 33 5f 72 65 61 6c 6c 6f 63 28 70 4c  lite3_realloc(pL
7c60: 76 6c 2d 3e 61 53 65 67 2c 20 6e 42 79 74 65 29  vl->aSeg, nByte)
7c70: 3b 0a 20 20 20 20 69 66 28 20 61 4e 65 77 20 29  ;.    if( aNew )
7c80: 7b 0a 20 20 20 20 20 20 69 66 28 20 62 49 6e 73  {.      if( bIns
7c90: 65 72 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ert==0 ){.      
7ca0: 20 20 6d 65 6d 73 65 74 28 26 61 4e 65 77 5b 70    memset(&aNew[p
7cb0: 4c 76 6c 2d 3e 6e 53 65 67 5d 2c 20 30 2c 20 73  Lvl->nSeg], 0, s
7cc0: 69 7a 65 6f 66 28 46 74 73 35 53 74 72 75 63 74  izeof(Fts5Struct
7cd0: 75 72 65 53 65 67 6d 65 6e 74 29 20 2a 20 6e 45  ureSegment) * nE
7ce0: 78 74 72 61 29 3b 0a 20 20 20 20 20 20 7d 65 6c  xtra);.      }el
7cf0: 73 65 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  se{.        int 
7d00: 6e 4d 6f 76 65 20 3d 20 70 4c 76 6c 2d 3e 6e 53  nMove = pLvl->nS
7d10: 65 67 20 2a 20 73 69 7a 65 6f 66 28 46 74 73 35  eg * sizeof(Fts5
7d20: 53 74 72 75 63 74 75 72 65 53 65 67 6d 65 6e 74  StructureSegment
7d30: 29 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 6d 6f  );.        memmo
7d40: 76 65 28 26 61 4e 65 77 5b 6e 45 78 74 72 61 5d  ve(&aNew[nExtra]
7d50: 2c 20 61 4e 65 77 2c 20 6e 4d 6f 76 65 29 3b 0a  , aNew, nMove);.
7d60: 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28 61          memset(a
7d70: 4e 65 77 2c 20 30 2c 20 73 69 7a 65 6f 66 28 46  New, 0, sizeof(F
7d80: 74 73 35 53 74 72 75 63 74 75 72 65 53 65 67 6d  ts5StructureSegm
7d90: 65 6e 74 29 20 2a 20 6e 45 78 74 72 61 29 3b 0a  ent) * nExtra);.
7da0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 4c        }.      pL
7db0: 76 6c 2d 3e 61 53 65 67 20 3d 20 61 4e 65 77 3b  vl->aSeg = aNew;
7dc0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
7dd0: 20 20 2a 70 52 63 20 3d 20 53 51 4c 49 54 45 5f    *pRc = SQLITE_
7de0: 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 7d  NOMEM;.    }.  }
7df0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 2c 20  .}../*.** Read, 
7e00: 64 65 73 65 72 69 61 6c 69 7a 65 20 61 6e 64 20  deserialize and 
7e10: 72 65 74 75 72 6e 20 74 68 65 20 73 74 72 75 63  return the struc
7e20: 74 75 72 65 20 72 65 63 6f 72 64 2e 0a 2a 2a 0a  ture record..**.
7e30: 2a 2a 20 54 68 65 20 46 74 73 35 53 74 72 75 63  ** The Fts5Struc
7e40: 74 75 72 65 2e 61 4c 65 76 65 6c 5b 5d 20 61 6e  ture.aLevel[] an
7e50: 64 20 65 61 63 68 20 46 74 73 35 53 74 72 75 63  d each Fts5Struc
7e60: 74 75 72 65 4c 65 76 65 6c 2e 61 53 65 67 5b 5d  tureLevel.aSeg[]
7e70: 20 61 72 72 61 79 0a 2a 2a 20 61 72 65 20 6f 76   array.** are ov
7e80: 65 72 2d 61 6c 6c 6f 63 61 74 65 64 20 61 73 20  er-allocated as 
7e90: 64 65 73 63 72 69 62 65 64 20 66 6f 72 20 66 75  described for fu
7ea0: 6e 63 74 69 6f 6e 20 66 74 73 35 53 74 72 75 63  nction fts5Struc
7eb0: 74 75 72 65 44 65 63 6f 64 65 28 29 20 0a 2a 2a  tureDecode() .**
7ec0: 20 61 62 6f 76 65 2e 0a 2a 2a 0a 2a 2a 20 49 66   above..**.** If
7ed0: 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
7ee0: 2c 20 4e 55 4c 4c 20 69 73 20 72 65 74 75 72 6e  , NULL is return
7ef0: 65 64 20 61 6e 64 20 61 6e 20 65 72 72 6f 72 20  ed and an error 
7f00: 63 6f 64 65 20 6c 65 66 74 20 69 6e 20 74 68 65  code left in the
7f10: 0a 2a 2a 20 46 74 73 35 49 6e 64 65 78 20 68 61  .** Fts5Index ha
7f20: 6e 64 6c 65 2e 20 49 66 20 61 6e 20 65 72 72 6f  ndle. If an erro
7f30: 72 20 68 61 73 20 61 6c 72 65 61 64 79 20 6f 63  r has already oc
7f40: 63 75 72 72 65 64 20 77 68 65 6e 20 74 68 69 73  curred when this
7f50: 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69 73 20   function.** is 
7f60: 63 61 6c 6c 65 64 2c 20 69 74 20 69 73 20 61 20  called, it is a 
7f70: 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63  no-op..*/.static
7f80: 20 46 74 73 35 53 74 72 75 63 74 75 72 65 20 2a   Fts5Structure *
7f90: 66 74 73 35 53 74 72 75 63 74 75 72 65 52 65 61  fts5StructureRea
7fa0: 64 28 46 74 73 35 49 6e 64 65 78 20 2a 70 29 7b  d(Fts5Index *p){
7fb0: 0a 20 20 46 74 73 35 43 6f 6e 66 69 67 20 2a 70  .  Fts5Config *p
7fc0: 43 6f 6e 66 69 67 20 3d 20 70 2d 3e 70 43 6f 6e  Config = p->pCon
7fd0: 66 69 67 3b 0a 20 20 46 74 73 35 53 74 72 75 63  fig;.  Fts5Struc
7fe0: 74 75 72 65 20 2a 70 52 65 74 20 3d 20 30 3b 20  ture *pRet = 0; 
7ff0: 20 20 20 20 20 20 20 2f 2a 20 4f 62 6a 65 63 74         /* Object
8000: 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20   to return */.  
8010: 69 6e 74 20 69 43 6f 6f 6b 69 65 3b 20 20 20 20  int iCookie;    
8020: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8030: 2f 2a 20 43 6f 6e 66 69 67 75 72 61 74 69 6f 6e  /* Configuration
8040: 20 63 6f 6f 6b 69 65 20 2a 2f 0a 20 20 46 74 73   cookie */.  Fts
8050: 35 44 61 74 61 20 2a 70 44 61 74 61 3b 0a 0a 20  5Data *pData;.. 
8060: 20 70 44 61 74 61 20 3d 20 66 74 73 35 44 61 74   pData = fts5Dat
8070: 61 52 65 61 64 28 70 2c 20 46 54 53 35 5f 53 54  aRead(p, FTS5_ST
8080: 52 55 43 54 55 52 45 5f 52 4f 57 49 44 29 3b 0a  RUCTURE_ROWID);.
8090: 20 20 69 66 28 20 70 2d 3e 72 63 20 29 20 72 65    if( p->rc ) re
80a0: 74 75 72 6e 20 30 3b 0a 20 20 2f 2a 20 54 4f 44  turn 0;.  /* TOD
80b0: 4f 3a 20 44 6f 20 77 65 20 6e 65 65 64 20 74 68  O: Do we need th
80c0: 69 73 20 69 66 20 74 68 65 20 6c 65 61 66 2d 69  is if the leaf-i
80d0: 6e 64 65 78 20 69 73 20 61 70 70 65 6e 64 65 64  ndex is appended
80e0: 3f 20 50 72 6f 62 61 62 6c 79 2e 2e 2e 20 2a 2f  ? Probably... */
80f0: 0a 20 20 6d 65 6d 73 65 74 28 26 70 44 61 74 61  .  memset(&pData
8100: 2d 3e 70 5b 70 44 61 74 61 2d 3e 6e 6e 5d 2c 20  ->p[pData->nn], 
8110: 30 2c 20 46 54 53 35 5f 44 41 54 41 5f 50 41 44  0, FTS5_DATA_PAD
8120: 44 49 4e 47 29 3b 0a 20 20 70 2d 3e 72 63 20 3d  DING);.  p->rc =
8130: 20 66 74 73 35 53 74 72 75 63 74 75 72 65 44 65   fts5StructureDe
8140: 63 6f 64 65 28 70 44 61 74 61 2d 3e 70 2c 20 70  code(pData->p, p
8150: 44 61 74 61 2d 3e 6e 6e 2c 20 26 69 43 6f 6f 6b  Data->nn, &iCook
8160: 69 65 2c 20 26 70 52 65 74 29 3b 0a 20 20 69 66  ie, &pRet);.  if
8170: 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
8180: 4f 4b 20 26 26 20 70 43 6f 6e 66 69 67 2d 3e 69  OK && pConfig->i
8190: 43 6f 6f 6b 69 65 21 3d 69 43 6f 6f 6b 69 65 20  Cookie!=iCookie 
81a0: 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 73  ){.    p->rc = s
81b0: 71 6c 69 74 65 33 46 74 73 35 43 6f 6e 66 69 67  qlite3Fts5Config
81c0: 4c 6f 61 64 28 70 43 6f 6e 66 69 67 2c 20 69 43  Load(pConfig, iC
81d0: 6f 6f 6b 69 65 29 3b 0a 20 20 7d 0a 0a 20 20 66  ookie);.  }..  f
81e0: 74 73 35 44 61 74 61 52 65 6c 65 61 73 65 28 70  ts5DataRelease(p
81f0: 44 61 74 61 29 3b 0a 20 20 69 66 28 20 70 2d 3e  Data);.  if( p->
8200: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
8210: 0a 20 20 20 20 66 74 73 35 53 74 72 75 63 74 75  .    fts5Structu
8220: 72 65 52 65 6c 65 61 73 65 28 70 52 65 74 29 3b  reRelease(pRet);
8230: 0a 20 20 20 20 70 52 65 74 20 3d 20 30 3b 0a 20  .    pRet = 0;. 
8240: 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 52 65 74   }.  return pRet
8250: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
8260: 6e 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62  n the total numb
8270: 65 72 20 6f 66 20 73 65 67 6d 65 6e 74 73 20 69  er of segments i
8280: 6e 20 69 6e 64 65 78 20 73 74 72 75 63 74 75 72  n index structur
8290: 65 20 70 53 74 72 75 63 74 2e 20 54 68 69 73 0a  e pStruct. This.
82a0: 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 6f  ** function is o
82b0: 6e 6c 79 20 65 76 65 72 20 75 73 65 64 20 61 73  nly ever used as
82c0: 20 70 61 72 74 20 6f 66 20 61 73 73 65 72 74 28   part of assert(
82d0: 29 20 63 6f 6e 64 69 74 69 6f 6e 73 2e 0a 2a 2f  ) conditions..*/
82e0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
82f0: 45 42 55 47 0a 73 74 61 74 69 63 20 69 6e 74 20  EBUG.static int 
8300: 66 74 73 35 53 74 72 75 63 74 75 72 65 43 6f 75  fts5StructureCou
8310: 6e 74 53 65 67 6d 65 6e 74 73 28 46 74 73 35 53  ntSegments(Fts5S
8320: 74 72 75 63 74 75 72 65 20 2a 70 53 74 72 75 63  tructure *pStruc
8330: 74 29 7b 0a 20 20 69 6e 74 20 6e 53 65 67 6d 65  t){.  int nSegme
8340: 6e 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  nt = 0;         
8350: 20 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 6e        /* Total n
8360: 75 6d 62 65 72 20 6f 66 20 73 65 67 6d 65 6e 74  umber of segment
8370: 73 20 2a 2f 0a 20 20 69 66 28 20 70 53 74 72 75  s */.  if( pStru
8380: 63 74 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 4c  ct ){.    int iL
8390: 76 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  vl;             
83a0: 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20          /* Used 
83b0: 74 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f 75  to iterate throu
83c0: 67 68 20 6c 65 76 65 6c 73 20 2a 2f 0a 20 20 20  gh levels */.   
83d0: 20 66 6f 72 28 69 4c 76 6c 3d 30 3b 20 69 4c 76   for(iLvl=0; iLv
83e0: 6c 3c 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65  l<pStruct->nLeve
83f0: 6c 3b 20 69 4c 76 6c 2b 2b 29 7b 0a 20 20 20 20  l; iLvl++){.    
8400: 20 20 6e 53 65 67 6d 65 6e 74 20 2b 3d 20 70 53    nSegment += pS
8410: 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c  truct->aLevel[iL
8420: 76 6c 5d 2e 6e 53 65 67 3b 0a 20 20 20 20 7d 0a  vl].nSeg;.    }.
8430: 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 6e 53    }..  return nS
8440: 65 67 6d 65 6e 74 3b 0a 7d 0a 23 65 6e 64 69 66  egment;.}.#endif
8450: 0a 0a 23 64 65 66 69 6e 65 20 66 74 73 35 42 75  ..#define fts5Bu
8460: 66 66 65 72 53 61 66 65 41 70 70 65 6e 64 42 6c  fferSafeAppendBl
8470: 6f 62 28 70 42 75 66 2c 20 70 42 6c 6f 62 2c 20  ob(pBuf, pBlob, 
8480: 6e 42 6c 6f 62 29 20 7b 20 20 20 20 20 5c 0a 20  nBlob) {     \. 
8490: 20 61 73 73 65 72 74 28 20 28 70 42 75 66 29 2d   assert( (pBuf)-
84a0: 3e 6e 53 70 61 63 65 3e 3d 28 28 70 42 75 66 29  >nSpace>=((pBuf)
84b0: 2d 3e 6e 2b 6e 42 6c 6f 62 29 20 29 3b 20 20 20  ->n+nBlob) );   
84c0: 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 6d 65            \.  me
84d0: 6d 63 70 79 28 26 28 70 42 75 66 29 2d 3e 70 5b  mcpy(&(pBuf)->p[
84e0: 28 70 42 75 66 29 2d 3e 6e 5d 2c 20 70 42 6c 6f  (pBuf)->n], pBlo
84f0: 62 2c 20 6e 42 6c 6f 62 29 3b 20 20 20 20 20 20  b, nBlob);      
8500: 20 20 20 20 20 20 20 5c 0a 20 20 28 70 42 75 66         \.  (pBuf
8510: 29 2d 3e 6e 20 2b 3d 20 6e 42 6c 6f 62 3b 20 20  )->n += nBlob;  
8520: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8530: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8540: 20 20 20 20 5c 0a 7d 0a 0a 23 64 65 66 69 6e 65      \.}..#define
8550: 20 66 74 73 35 42 75 66 66 65 72 53 61 66 65 41   fts5BufferSafeA
8560: 70 70 65 6e 64 56 61 72 69 6e 74 28 70 42 75 66  ppendVarint(pBuf
8570: 2c 20 69 56 61 6c 29 20 7b 20 20 20 20 20 20 20  , iVal) {       
8580: 20 20 20 20 20 20 20 20 20 5c 0a 20 20 28 70 42           \.  (pB
8590: 75 66 29 2d 3e 6e 20 2b 3d 20 73 71 6c 69 74 65  uf)->n += sqlite
85a0: 33 46 74 73 35 50 75 74 56 61 72 69 6e 74 28 26  3Fts5PutVarint(&
85b0: 28 70 42 75 66 29 2d 3e 70 5b 28 70 42 75 66 29  (pBuf)->p[(pBuf)
85c0: 2d 3e 6e 5d 2c 20 28 69 56 61 6c 29 29 3b 20 20  ->n], (iVal));  
85d0: 5c 0a 20 20 61 73 73 65 72 74 28 20 28 70 42 75  \.  assert( (pBu
85e0: 66 29 2d 3e 6e 53 70 61 63 65 3e 3d 28 70 42 75  f)->nSpace>=(pBu
85f0: 66 29 2d 3e 6e 20 29 3b 20 20 20 20 20 20 20 20  f)->n );        
8600: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8610: 20 20 5c 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 53 65    \.}.../*.** Se
8620: 72 69 61 6c 69 7a 65 20 61 6e 64 20 73 74 6f 72  rialize and stor
8630: 65 20 74 68 65 20 22 73 74 72 75 63 74 75 72 65  e the "structure
8640: 22 20 72 65 63 6f 72 64 2e 0a 2a 2a 0a 2a 2a 20  " record..**.** 
8650: 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
8660: 72 73 2c 20 6c 65 61 76 65 20 61 6e 20 65 72 72  rs, leave an err
8670: 6f 72 20 63 6f 64 65 20 69 6e 20 74 68 65 20 46  or code in the F
8680: 74 73 35 49 6e 64 65 78 20 6f 62 6a 65 63 74 2e  ts5Index object.
8690: 20 49 66 20 61 6e 0a 2a 2a 20 65 72 72 6f 72 20   If an.** error 
86a0: 68 61 73 20 61 6c 72 65 61 64 79 20 6f 63 63 75  has already occu
86b0: 72 72 65 64 2c 20 74 68 69 73 20 66 75 6e 63 74  rred, this funct
86c0: 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a  ion is a no-op..
86d0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
86e0: 74 73 35 53 74 72 75 63 74 75 72 65 57 72 69 74  ts5StructureWrit
86f0: 65 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20  e(Fts5Index *p, 
8700: 46 74 73 35 53 74 72 75 63 74 75 72 65 20 2a 70  Fts5Structure *p
8710: 53 74 72 75 63 74 29 7b 0a 20 20 69 66 28 20 70  Struct){.  if( p
8720: 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
8730: 29 7b 0a 20 20 20 20 46 74 73 35 42 75 66 66 65  ){.    Fts5Buffe
8740: 72 20 62 75 66 3b 20 20 20 20 20 20 20 20 20 20  r buf;          
8750: 20 20 20 20 20 2f 2a 20 42 75 66 66 65 72 20 74       /* Buffer t
8760: 6f 20 73 65 72 69 61 6c 69 7a 65 20 72 65 63 6f  o serialize reco
8770: 72 64 20 69 6e 74 6f 20 2a 2f 0a 20 20 20 20 69  rd into */.    i
8780: 6e 74 20 69 4c 76 6c 3b 20 20 20 20 20 20 20 20  nt iLvl;        
8790: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
87a0: 55 73 65 64 20 74 6f 20 69 74 65 72 61 74 65 20  Used to iterate 
87b0: 74 68 72 6f 75 67 68 20 6c 65 76 65 6c 73 20 2a  through levels *
87c0: 2f 0a 20 20 20 20 69 6e 74 20 69 43 6f 6f 6b 69  /.    int iCooki
87d0: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
87e0: 20 20 20 20 2f 2a 20 43 6f 6f 6b 69 65 20 76 61      /* Cookie va
87f0: 6c 75 65 20 74 6f 20 73 74 6f 72 65 20 2a 2f 0a  lue to store */.
8800: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 53 74  .    assert( pSt
8810: 72 75 63 74 2d 3e 6e 53 65 67 6d 65 6e 74 3d 3d  ruct->nSegment==
8820: 66 74 73 35 53 74 72 75 63 74 75 72 65 43 6f 75  fts5StructureCou
8830: 6e 74 53 65 67 6d 65 6e 74 73 28 70 53 74 72 75  ntSegments(pStru
8840: 63 74 29 20 29 3b 0a 20 20 20 20 6d 65 6d 73 65  ct) );.    memse
8850: 74 28 26 62 75 66 2c 20 30 2c 20 73 69 7a 65 6f  t(&buf, 0, sizeo
8860: 66 28 46 74 73 35 42 75 66 66 65 72 29 29 3b 0a  f(Fts5Buffer));.
8870: 0a 20 20 20 20 2f 2a 20 41 70 70 65 6e 64 20 74  .    /* Append t
8880: 68 65 20 63 75 72 72 65 6e 74 20 63 6f 6e 66 69  he current confi
8890: 67 75 72 61 74 69 6f 6e 20 63 6f 6f 6b 69 65 20  guration cookie 
88a0: 2a 2f 0a 20 20 20 20 69 43 6f 6f 6b 69 65 20 3d  */.    iCookie =
88b0: 20 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e 69 43 6f   p->pConfig->iCo
88c0: 6f 6b 69 65 3b 0a 20 20 20 20 69 66 28 20 69 43  okie;.    if( iC
88d0: 6f 6f 6b 69 65 3c 30 20 29 20 69 43 6f 6f 6b 69  ookie<0 ) iCooki
88e0: 65 20 3d 20 30 3b 0a 0a 20 20 20 20 69 66 28 20  e = 0;..    if( 
88f0: 30 3d 3d 73 71 6c 69 74 65 33 46 74 73 35 42 75  0==sqlite3Fts5Bu
8900: 66 66 65 72 53 69 7a 65 28 26 70 2d 3e 72 63 2c  fferSize(&p->rc,
8910: 20 26 62 75 66 2c 20 34 2b 39 2b 39 2b 39 29 20   &buf, 4+9+9+9) 
8920: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
8930: 46 74 73 35 50 75 74 33 32 28 62 75 66 2e 70 2c  Fts5Put32(buf.p,
8940: 20 69 43 6f 6f 6b 69 65 29 3b 0a 20 20 20 20 20   iCookie);.     
8950: 20 62 75 66 2e 6e 20 3d 20 34 3b 0a 20 20 20 20   buf.n = 4;.    
8960: 20 20 66 74 73 35 42 75 66 66 65 72 53 61 66 65    fts5BufferSafe
8970: 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26 62 75  AppendVarint(&bu
8980: 66 2c 20 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76  f, pStruct->nLev
8990: 65 6c 29 3b 0a 20 20 20 20 20 20 66 74 73 35 42  el);.      fts5B
89a0: 75 66 66 65 72 53 61 66 65 41 70 70 65 6e 64 56  ufferSafeAppendV
89b0: 61 72 69 6e 74 28 26 62 75 66 2c 20 70 53 74 72  arint(&buf, pStr
89c0: 75 63 74 2d 3e 6e 53 65 67 6d 65 6e 74 29 3b 0a  uct->nSegment);.
89d0: 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72        fts5Buffer
89e0: 53 61 66 65 41 70 70 65 6e 64 56 61 72 69 6e 74  SafeAppendVarint
89f0: 28 26 62 75 66 2c 20 28 69 36 34 29 70 53 74 72  (&buf, (i64)pStr
8a00: 75 63 74 2d 3e 6e 57 72 69 74 65 43 6f 75 6e 74  uct->nWriteCount
8a10: 65 72 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  er);.    }..    
8a20: 66 6f 72 28 69 4c 76 6c 3d 30 3b 20 69 4c 76 6c  for(iLvl=0; iLvl
8a30: 3c 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c  <pStruct->nLevel
8a40: 3b 20 69 4c 76 6c 2b 2b 29 7b 0a 20 20 20 20 20  ; iLvl++){.     
8a50: 20 69 6e 74 20 69 53 65 67 3b 20 20 20 20 20 20   int iSeg;      
8a60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
8a70: 2a 20 55 73 65 64 20 74 6f 20 69 74 65 72 61 74  * Used to iterat
8a80: 65 20 74 68 72 6f 75 67 68 20 73 65 67 6d 65 6e  e through segmen
8a90: 74 73 20 2a 2f 0a 20 20 20 20 20 20 46 74 73 35  ts */.      Fts5
8aa0: 53 74 72 75 63 74 75 72 65 4c 65 76 65 6c 20 2a  StructureLevel *
8ab0: 70 4c 76 6c 20 3d 20 26 70 53 74 72 75 63 74 2d  pLvl = &pStruct-
8ac0: 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d 3b 0a 20  >aLevel[iLvl];. 
8ad0: 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72 41       fts5BufferA
8ae0: 70 70 65 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e  ppendVarint(&p->
8af0: 72 63 2c 20 26 62 75 66 2c 20 70 4c 76 6c 2d 3e  rc, &buf, pLvl->
8b00: 6e 4d 65 72 67 65 29 3b 0a 20 20 20 20 20 20 66  nMerge);.      f
8b10: 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 56  ts5BufferAppendV
8b20: 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26 62  arint(&p->rc, &b
8b30: 75 66 2c 20 70 4c 76 6c 2d 3e 6e 53 65 67 29 3b  uf, pLvl->nSeg);
8b40: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
8b50: 4c 76 6c 2d 3e 6e 4d 65 72 67 65 3c 3d 70 4c 76  Lvl->nMerge<=pLv
8b60: 6c 2d 3e 6e 53 65 67 20 29 3b 0a 0a 20 20 20 20  l->nSeg );..    
8b70: 20 20 66 6f 72 28 69 53 65 67 3d 30 3b 20 69 53    for(iSeg=0; iS
8b80: 65 67 3c 70 4c 76 6c 2d 3e 6e 53 65 67 3b 20 69  eg<pLvl->nSeg; i
8b90: 53 65 67 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  Seg++){.        
8ba0: 66 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64  fts5BufferAppend
8bb0: 56 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26  Varint(&p->rc, &
8bc0: 62 75 66 2c 20 70 4c 76 6c 2d 3e 61 53 65 67 5b  buf, pLvl->aSeg[
8bd0: 69 53 65 67 5d 2e 69 53 65 67 69 64 29 3b 0a 20  iSeg].iSegid);. 
8be0: 20 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65         fts5Buffe
8bf0: 72 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26 70  rAppendVarint(&p
8c00: 2d 3e 72 63 2c 20 26 62 75 66 2c 20 70 4c 76 6c  ->rc, &buf, pLvl
8c10: 2d 3e 61 53 65 67 5b 69 53 65 67 5d 2e 70 67 6e  ->aSeg[iSeg].pgn
8c20: 6f 46 69 72 73 74 29 3b 0a 20 20 20 20 20 20 20  oFirst);.       
8c30: 20 66 74 73 35 42 75 66 66 65 72 41 70 70 65 6e   fts5BufferAppen
8c40: 64 56 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20  dVarint(&p->rc, 
8c50: 26 62 75 66 2c 20 70 4c 76 6c 2d 3e 61 53 65 67  &buf, pLvl->aSeg
8c60: 5b 69 53 65 67 5d 2e 70 67 6e 6f 4c 61 73 74 29  [iSeg].pgnoLast)
8c70: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
8c80: 0a 20 20 20 20 66 74 73 35 44 61 74 61 57 72 69  .    fts5DataWri
8c90: 74 65 28 70 2c 20 46 54 53 35 5f 53 54 52 55 43  te(p, FTS5_STRUC
8ca0: 54 55 52 45 5f 52 4f 57 49 44 2c 20 62 75 66 2e  TURE_ROWID, buf.
8cb0: 70 2c 20 62 75 66 2e 6e 29 3b 0a 20 20 20 20 66  p, buf.n);.    f
8cc0: 74 73 35 42 75 66 66 65 72 46 72 65 65 28 26 62  ts5BufferFree(&b
8cd0: 75 66 29 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 20  uf);.  }.}..#if 
8ce0: 30 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  0.static void ft
8cf0: 73 35 44 65 62 75 67 53 74 72 75 63 74 75 72 65  s5DebugStructure
8d00: 28 69 6e 74 2a 2c 46 74 73 35 42 75 66 66 65 72  (int*,Fts5Buffer
8d10: 2a 2c 46 74 73 35 53 74 72 75 63 74 75 72 65 2a  *,Fts5Structure*
8d20: 29 3b 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  );.static void f
8d30: 74 73 35 50 72 69 6e 74 53 74 72 75 63 74 75 72  ts5PrintStructur
8d40: 65 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43  e(const char *zC
8d50: 61 70 74 69 6f 6e 2c 20 46 74 73 35 53 74 72 75  aption, Fts5Stru
8d60: 63 74 75 72 65 20 2a 70 53 74 72 75 63 74 29 7b  cture *pStruct){
8d70: 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
8d80: 54 45 5f 4f 4b 3b 0a 20 20 46 74 73 35 42 75 66  TE_OK;.  Fts5Buf
8d90: 66 65 72 20 62 75 66 3b 0a 20 20 6d 65 6d 73 65  fer buf;.  memse
8da0: 74 28 26 62 75 66 2c 20 30 2c 20 73 69 7a 65 6f  t(&buf, 0, sizeo
8db0: 66 28 62 75 66 29 29 3b 0a 20 20 66 74 73 35 44  f(buf));.  fts5D
8dc0: 65 62 75 67 53 74 72 75 63 74 75 72 65 28 26 72  ebugStructure(&r
8dd0: 63 2c 20 26 62 75 66 2c 20 70 53 74 72 75 63 74  c, &buf, pStruct
8de0: 29 3b 0a 20 20 66 70 72 69 6e 74 66 28 73 74 64  );.  fprintf(std
8df0: 6f 75 74 2c 20 22 25 73 3a 20 25 73 5c 6e 22 2c  out, "%s: %s\n",
8e00: 20 7a 43 61 70 74 69 6f 6e 2c 20 62 75 66 2e 70   zCaption, buf.p
8e10: 29 3b 0a 20 20 66 66 6c 75 73 68 28 73 74 64 6f  );.  fflush(stdo
8e20: 75 74 29 3b 0a 20 20 66 74 73 35 42 75 66 66 65  ut);.  fts5Buffe
8e30: 72 46 72 65 65 28 26 62 75 66 29 3b 0a 7d 0a 23  rFree(&buf);.}.#
8e40: 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 66 74  else.# define ft
8e50: 73 35 50 72 69 6e 74 53 74 72 75 63 74 75 72 65  s5PrintStructure
8e60: 28 78 2c 79 29 0a 23 65 6e 64 69 66 0a 0a 73 74  (x,y).#endif..st
8e70: 61 74 69 63 20 69 6e 74 20 66 74 73 35 53 65 67  atic int fts5Seg
8e80: 6d 65 6e 74 53 69 7a 65 28 46 74 73 35 53 74 72  mentSize(Fts5Str
8e90: 75 63 74 75 72 65 53 65 67 6d 65 6e 74 20 2a 70  uctureSegment *p
8ea0: 53 65 67 29 7b 0a 20 20 72 65 74 75 72 6e 20 31  Seg){.  return 1
8eb0: 20 2b 20 70 53 65 67 2d 3e 70 67 6e 6f 4c 61 73   + pSeg->pgnoLas
8ec0: 74 20 2d 20 70 53 65 67 2d 3e 70 67 6e 6f 46 69  t - pSeg->pgnoFi
8ed0: 72 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  rst;.}../*.** Re
8ee0: 74 75 72 6e 20 61 20 63 6f 70 79 20 6f 66 20 69  turn a copy of i
8ef0: 6e 64 65 78 20 73 74 72 75 63 74 75 72 65 20 70  ndex structure p
8f00: 53 74 72 75 63 74 2e 20 45 78 63 65 70 74 2c 20  Struct. Except, 
8f10: 70 72 6f 6d 6f 74 65 20 61 73 20 6d 61 6e 79 20  promote as many 
8f20: 0a 2a 2a 20 73 65 67 6d 65 6e 74 73 20 61 73 20  .** segments as 
8f30: 70 6f 73 73 69 62 6c 65 20 74 6f 20 6c 65 76 65  possible to leve
8f40: 6c 20 69 50 72 6f 6d 6f 74 65 2e 20 49 66 20 61  l iPromote. If a
8f50: 6e 20 4f 4f 4d 20 6f 63 63 75 72 73 2c 20 4e 55  n OOM occurs, NU
8f60: 4c 4c 20 69 73 20 0a 2a 2a 20 72 65 74 75 72 6e  LL is .** return
8f70: 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ed..*/.static vo
8f80: 69 64 20 66 74 73 35 53 74 72 75 63 74 75 72 65  id fts5Structure
8f90: 50 72 6f 6d 6f 74 65 54 6f 28 0a 20 20 46 74 73  PromoteTo(.  Fts
8fa0: 35 49 6e 64 65 78 20 2a 70 2c 0a 20 20 69 6e 74  5Index *p,.  int
8fb0: 20 69 50 72 6f 6d 6f 74 65 2c 0a 20 20 69 6e 74   iPromote,.  int
8fc0: 20 73 7a 50 72 6f 6d 6f 74 65 2c 0a 20 20 46 74   szPromote,.  Ft
8fd0: 73 35 53 74 72 75 63 74 75 72 65 20 2a 70 53 74  s5Structure *pSt
8fe0: 72 75 63 74 0a 29 7b 0a 20 20 69 6e 74 20 69 6c  ruct.){.  int il
8ff0: 2c 20 69 73 3b 0a 20 20 46 74 73 35 53 74 72 75  , is;.  Fts5Stru
9000: 63 74 75 72 65 4c 65 76 65 6c 20 2a 70 4f 75 74  ctureLevel *pOut
9010: 20 3d 20 26 70 53 74 72 75 63 74 2d 3e 61 4c 65   = &pStruct->aLe
9020: 76 65 6c 5b 69 50 72 6f 6d 6f 74 65 5d 3b 0a 0a  vel[iPromote];..
9030: 20 20 69 66 28 20 70 4f 75 74 2d 3e 6e 4d 65 72    if( pOut->nMer
9040: 67 65 3d 3d 30 20 29 7b 0a 20 20 20 20 66 6f 72  ge==0 ){.    for
9050: 28 69 6c 3d 69 50 72 6f 6d 6f 74 65 2b 31 3b 20  (il=iPromote+1; 
9060: 69 6c 3c 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76  il<pStruct->nLev
9070: 65 6c 3b 20 69 6c 2b 2b 29 7b 0a 20 20 20 20 20  el; il++){.     
9080: 20 46 74 73 35 53 74 72 75 63 74 75 72 65 4c 65   Fts5StructureLe
9090: 76 65 6c 20 2a 70 4c 76 6c 20 3d 20 26 70 53 74  vel *pLvl = &pSt
90a0: 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 6c 5d  ruct->aLevel[il]
90b0: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4c 76 6c  ;.      if( pLvl
90c0: 2d 3e 6e 4d 65 72 67 65 20 29 20 72 65 74 75 72  ->nMerge ) retur
90d0: 6e 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 73 3d  n;.      for(is=
90e0: 70 4c 76 6c 2d 3e 6e 53 65 67 2d 31 3b 20 69 73  pLvl->nSeg-1; is
90f0: 3e 3d 30 3b 20 69 73 2d 2d 29 7b 0a 20 20 20 20  >=0; is--){.    
9100: 20 20 20 20 69 6e 74 20 73 7a 20 3d 20 66 74 73      int sz = fts
9110: 35 53 65 67 6d 65 6e 74 53 69 7a 65 28 26 70 4c  5SegmentSize(&pL
9120: 76 6c 2d 3e 61 53 65 67 5b 69 73 5d 29 3b 0a 20  vl->aSeg[is]);. 
9130: 20 20 20 20 20 20 20 69 66 28 20 73 7a 3e 73 7a         if( sz>sz
9140: 50 72 6f 6d 6f 74 65 20 29 20 72 65 74 75 72 6e  Promote ) return
9150: 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35 53 74  ;.        fts5St
9160: 72 75 63 74 75 72 65 45 78 74 65 6e 64 4c 65 76  ructureExtendLev
9170: 65 6c 28 26 70 2d 3e 72 63 2c 20 70 53 74 72 75  el(&p->rc, pStru
9180: 63 74 2c 20 69 50 72 6f 6d 6f 74 65 2c 20 31 2c  ct, iPromote, 1,
9190: 20 31 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28   1);.        if(
91a0: 20 70 2d 3e 72 63 20 29 20 72 65 74 75 72 6e 3b   p->rc ) return;
91b0: 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28  .        memcpy(
91c0: 70 4f 75 74 2d 3e 61 53 65 67 2c 20 26 70 4c 76  pOut->aSeg, &pLv
91d0: 6c 2d 3e 61 53 65 67 5b 69 73 5d 2c 20 73 69 7a  l->aSeg[is], siz
91e0: 65 6f 66 28 46 74 73 35 53 74 72 75 63 74 75 72  eof(Fts5Structur
91f0: 65 53 65 67 6d 65 6e 74 29 29 3b 0a 20 20 20 20  eSegment));.    
9200: 20 20 20 20 70 4f 75 74 2d 3e 6e 53 65 67 2b 2b      pOut->nSeg++
9210: 3b 0a 20 20 20 20 20 20 20 20 70 4c 76 6c 2d 3e  ;.        pLvl->
9220: 6e 53 65 67 2d 2d 3b 0a 20 20 20 20 20 20 7d 0a  nSeg--;.      }.
9230: 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
9240: 2a 2a 20 41 20 6e 65 77 20 73 65 67 6d 65 6e 74  ** A new segment
9250: 20 68 61 73 20 6a 75 73 74 20 62 65 65 6e 20 77   has just been w
9260: 72 69 74 74 65 6e 20 74 6f 20 6c 65 76 65 6c 20  ritten to level 
9270: 69 4c 76 6c 20 6f 66 20 69 6e 64 65 78 20 73 74  iLvl of index st
9280: 72 75 63 74 75 72 65 0a 2a 2a 20 70 53 74 72 75  ructure.** pStru
9290: 63 74 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f  ct. This functio
92a0: 6e 20 64 65 74 65 72 6d 69 6e 65 73 20 69 66 20  n determines if 
92b0: 61 6e 79 20 73 65 67 6d 65 6e 74 73 20 73 68 6f  any segments sho
92c0: 75 6c 64 20 62 65 20 70 72 6f 6d 6f 74 65 64 0a  uld be promoted.
92d0: 2a 2a 20 61 73 20 61 20 72 65 73 75 6c 74 2e 20  ** as a result. 
92e0: 53 65 67 6d 65 6e 74 73 20 61 72 65 20 70 72 6f  Segments are pro
92f0: 6d 6f 74 65 64 20 69 6e 20 74 77 6f 20 73 63 65  moted in two sce
9300: 6e 61 72 69 6f 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  narios:.**.**   
9310: 61 29 20 49 66 20 74 68 65 20 73 65 67 6d 65 6e  a) If the segmen
9320: 74 20 6a 75 73 74 20 77 72 69 74 74 65 6e 20 69  t just written i
9330: 73 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 6f  s smaller than o
9340: 6e 65 20 6f 72 20 6d 6f 72 65 20 73 65 67 6d 65  ne or more segme
9350: 6e 74 73 0a 2a 2a 20 20 20 20 20 20 77 69 74 68  nts.**      with
9360: 69 6e 20 74 68 65 20 70 72 65 76 69 6f 75 73 20  in the previous 
9370: 70 6f 70 75 6c 61 74 65 64 20 6c 65 76 65 6c 2c  populated level,
9380: 20 69 74 20 69 73 20 70 72 6f 6d 6f 74 65 64 20   it is promoted 
9390: 74 6f 20 74 68 65 20 70 72 65 76 69 6f 75 73 0a  to the previous.
93a0: 2a 2a 20 20 20 20 20 20 70 6f 70 75 6c 61 74 65  **      populate
93b0: 64 20 6c 65 76 65 6c 2e 0a 2a 2a 0a 2a 2a 20 20  d level..**.**  
93c0: 20 62 29 20 49 66 20 74 68 65 20 73 65 67 6d 65   b) If the segme
93d0: 6e 74 20 6a 75 73 74 20 77 72 69 74 74 65 6e 20  nt just written 
93e0: 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74  is larger than t
93f0: 68 65 20 6e 65 77 65 73 74 20 73 65 67 6d 65 6e  he newest segmen
9400: 74 20 6f 6e 0a 2a 2a 20 20 20 20 20 20 74 68 65  t on.**      the
9410: 20 6e 65 78 74 20 70 6f 70 75 6c 61 74 65 64 20   next populated 
9420: 6c 65 76 65 6c 2c 20 74 68 65 6e 20 74 68 61 74  level, then that
9430: 20 73 65 67 6d 65 6e 74 2c 20 61 6e 64 20 61 6e   segment, and an
9440: 79 20 6f 74 68 65 72 20 61 64 6a 61 63 65 6e 74  y other adjacent
9450: 0a 2a 2a 20 20 20 20 20 20 73 65 67 6d 65 6e 74  .**      segment
9460: 73 20 74 68 61 74 20 61 72 65 20 61 6c 73 6f 20  s that are also 
9470: 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 74 68 65  smaller than the
9480: 20 6f 6e 65 20 6a 75 73 74 20 77 72 69 74 74 65   one just writte
9490: 6e 2c 20 61 72 65 20 0a 2a 2a 20 20 20 20 20 20  n, are .**      
94a0: 70 72 6f 6d 6f 74 65 64 2e 20 0a 2a 2a 0a 2a 2a  promoted. .**.**
94b0: 20 49 66 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20   If one or more 
94c0: 73 65 67 6d 65 6e 74 73 20 61 72 65 20 70 72 6f  segments are pro
94d0: 6d 6f 74 65 64 2c 20 74 68 65 20 73 74 72 75 63  moted, the struc
94e0: 74 75 72 65 20 6f 62 6a 65 63 74 20 69 73 20 75  ture object is u
94f0: 70 64 61 74 65 64 0a 2a 2a 20 74 6f 20 72 65 66  pdated.** to ref
9500: 6c 65 63 74 20 74 68 69 73 2e 0a 2a 2f 0a 73 74  lect this..*/.st
9510: 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 53 74  atic void fts5St
9520: 72 75 63 74 75 72 65 50 72 6f 6d 6f 74 65 28 0a  ructurePromote(.
9530: 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20    Fts5Index *p, 
9540: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9550: 20 20 2f 2a 20 46 54 53 35 20 62 61 63 6b 65 6e    /* FTS5 backen
9560: 64 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e  d object */.  in
9570: 74 20 69 4c 76 6c 2c 20 20 20 20 20 20 20 20 20  t iLvl,         
9580: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
9590: 20 49 6e 64 65 78 20 6c 65 76 65 6c 20 6a 75 73   Index level jus
95a0: 74 20 75 70 64 61 74 65 64 20 2a 2f 0a 20 20 46  t updated */.  F
95b0: 74 73 35 53 74 72 75 63 74 75 72 65 20 2a 70 53  ts5Structure *pS
95c0: 74 72 75 63 74 20 20 20 20 20 20 20 20 20 20 2f  truct          /
95d0: 2a 20 49 6e 64 65 78 20 73 74 72 75 63 74 75 72  * Index structur
95e0: 65 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 70 2d  e */.){.  if( p-
95f0: 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  >rc==SQLITE_OK )
9600: 7b 0a 20 20 20 20 69 6e 74 20 69 54 73 74 3b 0a  {.    int iTst;.
9610: 20 20 20 20 69 6e 74 20 69 50 72 6f 6d 6f 74 65      int iPromote
9620: 20 3d 20 2d 31 3b 0a 20 20 20 20 69 6e 74 20 73   = -1;.    int s
9630: 7a 50 72 6f 6d 6f 74 65 20 3d 20 30 3b 20 20 20  zPromote = 0;   
9640: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 72 6f 6d           /* Prom
9650: 6f 74 65 20 61 6e 79 74 68 69 6e 67 20 74 68 69  ote anything thi
9660: 73 20 73 69 7a 65 20 6f 72 20 73 6d 61 6c 6c 65  s size or smalle
9670: 72 20 2a 2f 0a 20 20 20 20 46 74 73 35 53 74 72  r */.    Fts5Str
9680: 75 63 74 75 72 65 53 65 67 6d 65 6e 74 20 2a 70  uctureSegment *p
9690: 53 65 67 3b 20 20 20 2f 2a 20 53 65 67 6d 65 6e  Seg;   /* Segmen
96a0: 74 20 6a 75 73 74 20 77 72 69 74 74 65 6e 20 2a  t just written *
96b0: 2f 0a 20 20 20 20 69 6e 74 20 73 7a 53 65 67 3b  /.    int szSeg;
96c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
96d0: 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 73      /* Size of s
96e0: 65 67 6d 65 6e 74 20 6a 75 73 74 20 77 72 69 74  egment just writ
96f0: 74 65 6e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e  ten */.    int n
9700: 53 65 67 20 3d 20 70 53 74 72 75 63 74 2d 3e 61  Seg = pStruct->a
9710: 4c 65 76 65 6c 5b 69 4c 76 6c 5d 2e 6e 53 65 67  Level[iLvl].nSeg
9720: 3b 0a 0a 20 20 20 20 69 66 28 20 6e 53 65 67 3d  ;..    if( nSeg=
9730: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20  =0 ) return;.   
9740: 20 70 53 65 67 20 3d 20 26 70 53 74 72 75 63 74   pSeg = &pStruct
9750: 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d 2e 61  ->aLevel[iLvl].a
9760: 53 65 67 5b 70 53 74 72 75 63 74 2d 3e 61 4c 65  Seg[pStruct->aLe
9770: 76 65 6c 5b 69 4c 76 6c 5d 2e 6e 53 65 67 2d 31  vel[iLvl].nSeg-1
9780: 5d 3b 0a 20 20 20 20 73 7a 53 65 67 20 3d 20 28  ];.    szSeg = (
9790: 31 20 2b 20 70 53 65 67 2d 3e 70 67 6e 6f 4c 61  1 + pSeg->pgnoLa
97a0: 73 74 20 2d 20 70 53 65 67 2d 3e 70 67 6e 6f 46  st - pSeg->pgnoF
97b0: 69 72 73 74 29 3b 0a 0a 20 20 20 20 2f 2a 20 43  irst);..    /* C
97c0: 68 65 63 6b 20 66 6f 72 20 63 6f 6e 64 69 74 69  heck for conditi
97d0: 6f 6e 20 28 61 29 20 2a 2f 0a 20 20 20 20 66 6f  on (a) */.    fo
97e0: 72 28 69 54 73 74 3d 69 4c 76 6c 2d 31 3b 20 69  r(iTst=iLvl-1; i
97f0: 54 73 74 3e 3d 30 20 26 26 20 70 53 74 72 75 63  Tst>=0 && pStruc
9800: 74 2d 3e 61 4c 65 76 65 6c 5b 69 54 73 74 5d 2e  t->aLevel[iTst].
9810: 6e 53 65 67 3d 3d 30 3b 20 69 54 73 74 2d 2d 29  nSeg==0; iTst--)
9820: 3b 0a 20 20 20 20 69 66 28 20 69 54 73 74 3e 3d  ;.    if( iTst>=
9830: 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  0 ){.      int i
9840: 3b 0a 20 20 20 20 20 20 69 6e 74 20 73 7a 4d 61  ;.      int szMa
9850: 78 20 3d 20 30 3b 0a 20 20 20 20 20 20 46 74 73  x = 0;.      Fts
9860: 35 53 74 72 75 63 74 75 72 65 4c 65 76 65 6c 20  5StructureLevel 
9870: 2a 70 54 73 74 20 3d 20 26 70 53 74 72 75 63 74  *pTst = &pStruct
9880: 2d 3e 61 4c 65 76 65 6c 5b 69 54 73 74 5d 3b 0a  ->aLevel[iTst];.
9890: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54        assert( pT
98a0: 73 74 2d 3e 6e 4d 65 72 67 65 3d 3d 30 20 29 3b  st->nMerge==0 );
98b0: 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
98c0: 69 3c 70 54 73 74 2d 3e 6e 53 65 67 3b 20 69 2b  i<pTst->nSeg; i+
98d0: 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  +){.        int 
98e0: 73 7a 20 3d 20 70 54 73 74 2d 3e 61 53 65 67 5b  sz = pTst->aSeg[
98f0: 69 5d 2e 70 67 6e 6f 4c 61 73 74 20 2d 20 70 54  i].pgnoLast - pT
9900: 73 74 2d 3e 61 53 65 67 5b 69 5d 2e 70 67 6e 6f  st->aSeg[i].pgno
9910: 46 69 72 73 74 20 2b 20 31 3b 0a 20 20 20 20 20  First + 1;.     
9920: 20 20 20 69 66 28 20 73 7a 3e 73 7a 4d 61 78 20     if( sz>szMax 
9930: 29 20 73 7a 4d 61 78 20 3d 20 73 7a 3b 0a 20 20  ) szMax = sz;.  
9940: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
9950: 73 7a 4d 61 78 3e 3d 73 7a 53 65 67 20 29 7b 0a  szMax>=szSeg ){.
9960: 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 64 69          /* Condi
9970: 74 69 6f 6e 20 28 61 29 20 69 73 20 74 72 75 65  tion (a) is true
9980: 2e 20 50 72 6f 6d 6f 74 65 20 74 68 65 20 6e 65  . Promote the ne
9990: 77 65 73 74 20 73 65 67 6d 65 6e 74 20 6f 6e 20  west segment on 
99a0: 6c 65 76 65 6c 20 0a 20 20 20 20 20 20 20 20 2a  level .        *
99b0: 2a 20 69 4c 76 6c 20 74 6f 20 6c 65 76 65 6c 20  * iLvl to level 
99c0: 69 54 73 74 2e 20 20 2a 2f 0a 20 20 20 20 20 20  iTst.  */.      
99d0: 20 20 69 50 72 6f 6d 6f 74 65 20 3d 20 69 54 73    iPromote = iTs
99e0: 74 3b 0a 20 20 20 20 20 20 20 20 73 7a 50 72 6f  t;.        szPro
99f0: 6d 6f 74 65 20 3d 20 73 7a 4d 61 78 3b 0a 20 20  mote = szMax;.  
9a00: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
9a10: 20 2f 2a 20 49 66 20 63 6f 6e 64 69 74 69 6f 6e   /* If condition
9a20: 20 28 61 29 20 69 73 20 6e 6f 74 20 6d 65 74 2c   (a) is not met,
9a30: 20 61 73 73 75 6d 65 20 28 62 29 20 69 73 20 74   assume (b) is t
9a40: 72 75 65 2e 20 53 74 72 75 63 74 75 72 65 50 72  rue. StructurePr
9a50: 6f 6d 6f 74 65 54 6f 28 29 0a 20 20 20 20 2a 2a  omoteTo().    **
9a60: 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20 69   is a no-op if i
9a70: 74 20 69 73 20 6e 6f 74 2e 20 20 2a 2f 0a 20 20  t is not.  */.  
9a80: 20 20 69 66 28 20 69 50 72 6f 6d 6f 74 65 3c 30    if( iPromote<0
9a90: 20 29 7b 0a 20 20 20 20 20 20 69 50 72 6f 6d 6f   ){.      iPromo
9aa0: 74 65 20 3d 20 69 4c 76 6c 3b 0a 20 20 20 20 20  te = iLvl;.     
9ab0: 20 73 7a 50 72 6f 6d 6f 74 65 20 3d 20 73 7a 53   szPromote = szS
9ac0: 65 67 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 74  eg;.    }.    ft
9ad0: 73 35 53 74 72 75 63 74 75 72 65 50 72 6f 6d 6f  s5StructurePromo
9ae0: 74 65 54 6f 28 70 2c 20 69 50 72 6f 6d 6f 74 65  teTo(p, iPromote
9af0: 2c 20 73 7a 50 72 6f 6d 6f 74 65 2c 20 70 53 74  , szPromote, pSt
9b00: 72 75 63 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f  ruct);.  }.}.../
9b10: 2a 0a 2a 2a 20 41 64 76 61 6e 63 65 20 74 68 65  *.** Advance the
9b20: 20 69 74 65 72 61 74 6f 72 20 70 61 73 73 65 64   iterator passed
9b30: 20 61 73 20 74 68 65 20 6f 6e 6c 79 20 61 72 67   as the only arg
9b40: 75 6d 65 6e 74 2e 20 49 66 20 74 68 65 20 65 6e  ument. If the en
9b50: 64 20 6f 66 20 74 68 65 20 0a 2a 2a 20 64 6f 63  d of the .** doc
9b60: 6c 69 73 74 2d 69 6e 64 65 78 20 70 61 67 65 20  list-index page 
9b70: 69 73 20 72 65 61 63 68 65 64 2c 20 72 65 74 75  is reached, retu
9b80: 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 2e 0a 2a 2f 0a  rn non-zero..*/.
9b90: 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 35 44  static int fts5D
9ba0: 6c 69 64 78 4c 76 6c 4e 65 78 74 28 46 74 73 35  lidxLvlNext(Fts5
9bb0: 44 6c 69 64 78 4c 76 6c 20 2a 70 4c 76 6c 29 7b  DlidxLvl *pLvl){
9bc0: 0a 20 20 46 74 73 35 44 61 74 61 20 2a 70 44 61  .  Fts5Data *pDa
9bd0: 74 61 20 3d 20 70 4c 76 6c 2d 3e 70 44 61 74 61  ta = pLvl->pData
9be0: 3b 0a 0a 20 20 69 66 28 20 70 4c 76 6c 2d 3e 69  ;..  if( pLvl->i
9bf0: 4f 66 66 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73  Off==0 ){.    as
9c00: 73 65 72 74 28 20 70 4c 76 6c 2d 3e 62 45 6f 66  sert( pLvl->bEof
9c10: 3d 3d 30 20 29 3b 0a 20 20 20 20 70 4c 76 6c 2d  ==0 );.    pLvl-
9c20: 3e 69 4f 66 66 20 3d 20 31 3b 0a 20 20 20 20 70  >iOff = 1;.    p
9c30: 4c 76 6c 2d 3e 69 4f 66 66 20 2b 3d 20 66 74 73  Lvl->iOff += fts
9c40: 35 47 65 74 56 61 72 69 6e 74 33 32 28 26 70 44  5GetVarint32(&pD
9c50: 61 74 61 2d 3e 70 5b 31 5d 2c 20 70 4c 76 6c 2d  ata->p[1], pLvl-
9c60: 3e 69 4c 65 61 66 50 67 6e 6f 29 3b 0a 20 20 20  >iLeafPgno);.   
9c70: 20 70 4c 76 6c 2d 3e 69 4f 66 66 20 2b 3d 20 66   pLvl->iOff += f
9c80: 74 73 35 47 65 74 56 61 72 69 6e 74 28 26 70 44  ts5GetVarint(&pD
9c90: 61 74 61 2d 3e 70 5b 70 4c 76 6c 2d 3e 69 4f 66  ata->p[pLvl->iOf
9ca0: 66 5d 2c 20 28 75 36 34 2a 29 26 70 4c 76 6c 2d  f], (u64*)&pLvl-
9cb0: 3e 69 52 6f 77 69 64 29 3b 0a 20 20 20 20 70 4c  >iRowid);.    pL
9cc0: 76 6c 2d 3e 69 46 69 72 73 74 4f 66 66 20 3d 20  vl->iFirstOff = 
9cd0: 70 4c 76 6c 2d 3e 69 4f 66 66 3b 0a 20 20 7d 65  pLvl->iOff;.  }e
9ce0: 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 69 4f 66  lse{.    int iOf
9cf0: 66 3b 0a 20 20 20 20 66 6f 72 28 69 4f 66 66 3d  f;.    for(iOff=
9d00: 70 4c 76 6c 2d 3e 69 4f 66 66 3b 20 69 4f 66 66  pLvl->iOff; iOff
9d10: 3c 70 44 61 74 61 2d 3e 6e 6e 3b 20 69 4f 66 66  <pData->nn; iOff
9d20: 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  ++){.      if( p
9d30: 44 61 74 61 2d 3e 70 5b 69 4f 66 66 5d 20 29 20  Data->p[iOff] ) 
9d40: 62 72 65 61 6b 3b 20 0a 20 20 20 20 7d 0a 0a 20  break; .    }.. 
9d50: 20 20 20 69 66 28 20 69 4f 66 66 3c 70 44 61 74     if( iOff<pDat
9d60: 61 2d 3e 6e 6e 20 29 7b 0a 20 20 20 20 20 20 69  a->nn ){.      i
9d70: 36 34 20 69 56 61 6c 3b 0a 20 20 20 20 20 20 70  64 iVal;.      p
9d80: 4c 76 6c 2d 3e 69 4c 65 61 66 50 67 6e 6f 20 2b  Lvl->iLeafPgno +
9d90: 3d 20 28 69 4f 66 66 20 2d 20 70 4c 76 6c 2d 3e  = (iOff - pLvl->
9da0: 69 4f 66 66 29 20 2b 20 31 3b 0a 20 20 20 20 20  iOff) + 1;.     
9db0: 20 69 4f 66 66 20 2b 3d 20 66 74 73 35 47 65 74   iOff += fts5Get
9dc0: 56 61 72 69 6e 74 28 26 70 44 61 74 61 2d 3e 70  Varint(&pData->p
9dd0: 5b 69 4f 66 66 5d 2c 20 28 75 36 34 2a 29 26 69  [iOff], (u64*)&i
9de0: 56 61 6c 29 3b 0a 20 20 20 20 20 20 70 4c 76 6c  Val);.      pLvl
9df0: 2d 3e 69 52 6f 77 69 64 20 2b 3d 20 69 56 61 6c  ->iRowid += iVal
9e00: 3b 0a 20 20 20 20 20 20 70 4c 76 6c 2d 3e 69 4f  ;.      pLvl->iO
9e10: 66 66 20 3d 20 69 4f 66 66 3b 0a 20 20 20 20 7d  ff = iOff;.    }
9e20: 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 4c 76 6c  else{.      pLvl
9e30: 2d 3e 62 45 6f 66 20 3d 20 31 3b 0a 20 20 20 20  ->bEof = 1;.    
9e40: 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  }.  }..  return 
9e50: 70 4c 76 6c 2d 3e 62 45 6f 66 3b 0a 7d 0a 0a 2f  pLvl->bEof;.}../
9e60: 2a 0a 2a 2a 20 41 64 76 61 6e 63 65 20 74 68 65  *.** Advance the
9e70: 20 69 74 65 72 61 74 6f 72 20 70 61 73 73 65 64   iterator passed
9e80: 20 61 73 20 74 68 65 20 6f 6e 6c 79 20 61 72 67   as the only arg
9e90: 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  ument..*/.static
9ea0: 20 69 6e 74 20 66 74 73 35 44 6c 69 64 78 49 74   int fts5DlidxIt
9eb0: 65 72 4e 65 78 74 52 28 46 74 73 35 49 6e 64 65  erNextR(Fts5Inde
9ec0: 78 20 2a 70 2c 20 46 74 73 35 44 6c 69 64 78 49  x *p, Fts5DlidxI
9ed0: 74 65 72 20 2a 70 49 74 65 72 2c 20 69 6e 74 20  ter *pIter, int 
9ee0: 69 4c 76 6c 29 7b 0a 20 20 46 74 73 35 44 6c 69  iLvl){.  Fts5Dli
9ef0: 64 78 4c 76 6c 20 2a 70 4c 76 6c 20 3d 20 26 70  dxLvl *pLvl = &p
9f00: 49 74 65 72 2d 3e 61 4c 76 6c 5b 69 4c 76 6c 5d  Iter->aLvl[iLvl]
9f10: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 69 4c 76  ;..  assert( iLv
9f20: 6c 3c 70 49 74 65 72 2d 3e 6e 4c 76 6c 20 29 3b  l<pIter->nLvl );
9f30: 0a 20 20 69 66 28 20 66 74 73 35 44 6c 69 64 78  .  if( fts5Dlidx
9f40: 4c 76 6c 4e 65 78 74 28 70 4c 76 6c 29 20 29 7b  LvlNext(pLvl) ){
9f50: 0a 20 20 20 20 69 66 28 20 28 69 4c 76 6c 2b 31  .    if( (iLvl+1
9f60: 29 20 3c 20 70 49 74 65 72 2d 3e 6e 4c 76 6c 20  ) < pIter->nLvl 
9f70: 29 7b 0a 20 20 20 20 20 20 66 74 73 35 44 6c 69  ){.      fts5Dli
9f80: 64 78 49 74 65 72 4e 65 78 74 52 28 70 2c 20 70  dxIterNextR(p, p
9f90: 49 74 65 72 2c 20 69 4c 76 6c 2b 31 29 3b 0a 20  Iter, iLvl+1);. 
9fa0: 20 20 20 20 20 69 66 28 20 70 4c 76 6c 5b 31 5d       if( pLvl[1]
9fb0: 2e 62 45 6f 66 3d 3d 30 20 29 7b 0a 20 20 20 20  .bEof==0 ){.    
9fc0: 20 20 20 20 66 74 73 35 44 61 74 61 52 65 6c 65      fts5DataRele
9fd0: 61 73 65 28 70 4c 76 6c 2d 3e 70 44 61 74 61 29  ase(pLvl->pData)
9fe0: 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74  ;.        memset
9ff0: 28 70 4c 76 6c 2c 20 30 2c 20 73 69 7a 65 6f 66  (pLvl, 0, sizeof
a000: 28 46 74 73 35 44 6c 69 64 78 4c 76 6c 29 29 3b  (Fts5DlidxLvl));
a010: 0a 20 20 20 20 20 20 20 20 70 4c 76 6c 2d 3e 70  .        pLvl->p
a020: 44 61 74 61 20 3d 20 66 74 73 35 44 61 74 61 52  Data = fts5DataR
a030: 65 61 64 28 70 2c 20 0a 20 20 20 20 20 20 20 20  ead(p, .        
a040: 20 20 20 20 46 54 53 35 5f 44 4c 49 44 58 5f 52      FTS5_DLIDX_R
a050: 4f 57 49 44 28 70 49 74 65 72 2d 3e 69 53 65 67  OWID(pIter->iSeg
a060: 69 64 2c 20 69 4c 76 6c 2c 20 70 4c 76 6c 5b 31  id, iLvl, pLvl[1
a070: 5d 2e 69 4c 65 61 66 50 67 6e 6f 29 0a 20 20 20  ].iLeafPgno).   
a080: 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20       );.        
a090: 69 66 28 20 70 4c 76 6c 2d 3e 70 44 61 74 61 20  if( pLvl->pData 
a0a0: 29 20 66 74 73 35 44 6c 69 64 78 4c 76 6c 4e 65  ) fts5DlidxLvlNe
a0b0: 78 74 28 70 4c 76 6c 29 3b 0a 20 20 20 20 20 20  xt(pLvl);.      
a0c0: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72  }.    }.  }..  r
a0d0: 65 74 75 72 6e 20 70 49 74 65 72 2d 3e 61 4c 76  eturn pIter->aLv
a0e0: 6c 5b 30 5d 2e 62 45 6f 66 3b 0a 7d 0a 73 74 61  l[0].bEof;.}.sta
a0f0: 74 69 63 20 69 6e 74 20 66 74 73 35 44 6c 69 64  tic int fts5Dlid
a100: 78 49 74 65 72 4e 65 78 74 28 46 74 73 35 49 6e  xIterNext(Fts5In
a110: 64 65 78 20 2a 70 2c 20 46 74 73 35 44 6c 69 64  dex *p, Fts5Dlid
a120: 78 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a 20  xIter *pIter){. 
a130: 20 72 65 74 75 72 6e 20 66 74 73 35 44 6c 69 64   return fts5Dlid
a140: 78 49 74 65 72 4e 65 78 74 52 28 70 2c 20 70 49  xIterNextR(p, pI
a150: 74 65 72 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  ter, 0);.}../*.*
a160: 2a 20 54 68 65 20 69 74 65 72 61 74 6f 72 20 70  * The iterator p
a170: 61 73 73 65 64 20 61 73 20 74 68 65 20 66 69 72  assed as the fir
a180: 73 74 20 61 72 67 75 6d 65 6e 74 20 68 61 73 20  st argument has 
a190: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 69  the following fi
a1a0: 65 6c 64 73 20 73 65 74 0a 2a 2a 20 61 73 20 66  elds set.** as f
a1b0: 6f 6c 6c 6f 77 73 2e 20 54 68 69 73 20 66 75 6e  ollows. This fun
a1c0: 63 74 69 6f 6e 20 73 65 74 73 20 75 70 20 74 68  ction sets up th
a1d0: 65 20 72 65 73 74 20 6f 66 20 74 68 65 20 69 74  e rest of the it
a1e0: 65 72 61 74 6f 72 20 73 6f 20 74 68 61 74 20 69  erator so that i
a1f0: 74 0a 2a 2a 20 70 6f 69 6e 74 73 20 74 6f 20 74  t.** points to t
a200: 68 65 20 66 69 72 73 74 20 72 6f 77 69 64 20 69  he first rowid i
a210: 6e 20 74 68 65 20 64 6f 63 6c 69 73 74 2d 69 6e  n the doclist-in
a220: 64 65 78 2e 0a 2a 2a 0a 2a 2a 20 20 20 70 44 61  dex..**.**   pDa
a230: 74 61 3a 0a 2a 2a 20 20 20 20 20 70 6f 69 6e 74  ta:.**     point
a240: 65 72 20 74 6f 20 64 6f 63 6c 69 73 74 2d 69 6e  er to doclist-in
a250: 64 65 78 20 72 65 63 6f 72 64 2c 20 0a 2a 2a 0a  dex record, .**.
a260: 2a 2a 20 57 68 65 6e 20 74 68 69 73 20 66 75 6e  ** When this fun
a270: 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20  ction is called 
a280: 70 49 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f  pIter->iLeafPgno
a290: 20 69 73 20 74 68 65 20 70 61 67 65 20 6e 75 6d   is the page num
a2a0: 62 65 72 20 74 68 65 0a 2a 2a 20 64 6f 63 6c 69  ber the.** docli
a2b0: 73 74 20 69 73 20 61 73 73 6f 63 69 61 74 65 64  st is associated
a2c0: 20 77 69 74 68 20 28 74 68 65 20 6f 6e 65 20 66   with (the one f
a2d0: 65 61 74 75 72 69 6e 67 20 74 68 65 20 74 65 72  eaturing the ter
a2e0: 6d 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  m)..*/.static in
a2f0: 74 20 66 74 73 35 44 6c 69 64 78 49 74 65 72 46  t fts5DlidxIterF
a300: 69 72 73 74 28 46 74 73 35 44 6c 69 64 78 49 74  irst(Fts5DlidxIt
a310: 65 72 20 2a 70 49 74 65 72 29 7b 0a 20 20 69 6e  er *pIter){.  in
a320: 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  t i;.  for(i=0; 
a330: 69 3c 70 49 74 65 72 2d 3e 6e 4c 76 6c 3b 20 69  i<pIter->nLvl; i
a340: 2b 2b 29 7b 0a 20 20 20 20 66 74 73 35 44 6c 69  ++){.    fts5Dli
a350: 64 78 4c 76 6c 4e 65 78 74 28 26 70 49 74 65 72  dxLvlNext(&pIter
a360: 2d 3e 61 4c 76 6c 5b 69 5d 29 3b 0a 20 20 7d 0a  ->aLvl[i]);.  }.
a370: 20 20 72 65 74 75 72 6e 20 70 49 74 65 72 2d 3e    return pIter->
a380: 61 4c 76 6c 5b 30 5d 2e 62 45 6f 66 3b 0a 7d 0a  aLvl[0].bEof;.}.
a390: 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73  ..static int fts
a3a0: 35 44 6c 69 64 78 49 74 65 72 45 6f 66 28 46 74  5DlidxIterEof(Ft
a3b0: 73 35 49 6e 64 65 78 20 2a 70 2c 20 46 74 73 35  s5Index *p, Fts5
a3c0: 44 6c 69 64 78 49 74 65 72 20 2a 70 49 74 65 72  DlidxIter *pIter
a3d0: 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e 72  ){.  return p->r
a3e0: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c!=SQLITE_OK || 
a3f0: 70 49 74 65 72 2d 3e 61 4c 76 6c 5b 30 5d 2e 62  pIter->aLvl[0].b
a400: 45 6f 66 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76  Eof;.}..static v
a410: 6f 69 64 20 66 74 73 35 44 6c 69 64 78 49 74 65  oid fts5DlidxIte
a420: 72 4c 61 73 74 28 46 74 73 35 49 6e 64 65 78 20  rLast(Fts5Index 
a430: 2a 70 2c 20 46 74 73 35 44 6c 69 64 78 49 74 65  *p, Fts5DlidxIte
a440: 72 20 2a 70 49 74 65 72 29 7b 0a 20 20 69 6e 74  r *pIter){.  int
a450: 20 69 3b 0a 0a 20 20 2f 2a 20 41 64 76 61 6e 63   i;..  /* Advanc
a460: 65 20 65 61 63 68 20 6c 65 76 65 6c 20 74 6f 20  e each level to 
a470: 74 68 65 20 6c 61 73 74 20 65 6e 74 72 79 20 6f  the last entry o
a480: 6e 20 74 68 65 20 6c 61 73 74 20 70 61 67 65 20  n the last page 
a490: 2a 2f 0a 20 20 66 6f 72 28 69 3d 70 49 74 65 72  */.  for(i=pIter
a4a0: 2d 3e 6e 4c 76 6c 2d 31 3b 20 70 2d 3e 72 63 3d  ->nLvl-1; p->rc=
a4b0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3e  =SQLITE_OK && i>
a4c0: 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 46 74  =0; i--){.    Ft
a4d0: 73 35 44 6c 69 64 78 4c 76 6c 20 2a 70 4c 76 6c  s5DlidxLvl *pLvl
a4e0: 20 3d 20 26 70 49 74 65 72 2d 3e 61 4c 76 6c 5b   = &pIter->aLvl[
a4f0: 69 5d 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 66  i];.    while( f
a500: 74 73 35 44 6c 69 64 78 4c 76 6c 4e 65 78 74 28  ts5DlidxLvlNext(
a510: 70 4c 76 6c 29 3d 3d 30 20 29 3b 0a 20 20 20 20  pLvl)==0 );.    
a520: 70 4c 76 6c 2d 3e 62 45 6f 66 20 3d 20 30 3b 0a  pLvl->bEof = 0;.
a530: 0a 20 20 20 20 69 66 28 20 69 3e 30 20 29 7b 0a  .    if( i>0 ){.
a540: 20 20 20 20 20 20 46 74 73 35 44 6c 69 64 78 4c        Fts5DlidxL
a550: 76 6c 20 2a 70 43 68 69 6c 64 20 3d 20 26 70 4c  vl *pChild = &pL
a560: 76 6c 5b 2d 31 5d 3b 0a 20 20 20 20 20 20 66 74  vl[-1];.      ft
a570: 73 35 44 61 74 61 52 65 6c 65 61 73 65 28 70 43  s5DataRelease(pC
a580: 68 69 6c 64 2d 3e 70 44 61 74 61 29 3b 0a 20 20  hild->pData);.  
a590: 20 20 20 20 6d 65 6d 73 65 74 28 70 43 68 69 6c      memset(pChil
a5a0: 64 2c 20 30 2c 20 73 69 7a 65 6f 66 28 46 74 73  d, 0, sizeof(Fts
a5b0: 35 44 6c 69 64 78 4c 76 6c 29 29 3b 0a 20 20 20  5DlidxLvl));.   
a5c0: 20 20 20 70 43 68 69 6c 64 2d 3e 70 44 61 74 61     pChild->pData
a5d0: 20 3d 20 66 74 73 35 44 61 74 61 52 65 61 64 28   = fts5DataRead(
a5e0: 70 2c 20 0a 20 20 20 20 20 20 20 20 20 20 46 54  p, .          FT
a5f0: 53 35 5f 44 4c 49 44 58 5f 52 4f 57 49 44 28 70  S5_DLIDX_ROWID(p
a600: 49 74 65 72 2d 3e 69 53 65 67 69 64 2c 20 69 2d  Iter->iSegid, i-
a610: 31 2c 20 70 4c 76 6c 2d 3e 69 4c 65 61 66 50 67  1, pLvl->iLeafPg
a620: 6e 6f 29 0a 20 20 20 20 20 20 29 3b 0a 20 20 20  no).      );.   
a630: 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
a640: 4d 6f 76 65 20 74 68 65 20 69 74 65 72 61 74 6f  Move the iterato
a650: 72 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  r passed as the 
a660: 6f 6e 6c 79 20 61 72 67 75 6d 65 6e 74 20 74 6f  only argument to
a670: 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 65 6e   the previous en
a680: 74 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  try..*/.static i
a690: 6e 74 20 66 74 73 35 44 6c 69 64 78 4c 76 6c 50  nt fts5DlidxLvlP
a6a0: 72 65 76 28 46 74 73 35 44 6c 69 64 78 4c 76 6c  rev(Fts5DlidxLvl
a6b0: 20 2a 70 4c 76 6c 29 7b 0a 20 20 69 6e 74 20 69   *pLvl){.  int i
a6c0: 4f 66 66 20 3d 20 70 4c 76 6c 2d 3e 69 4f 66 66  Off = pLvl->iOff
a6d0: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 4c 76  ;..  assert( pLv
a6e0: 6c 2d 3e 62 45 6f 66 3d 3d 30 20 29 3b 0a 20 20  l->bEof==0 );.  
a6f0: 69 66 28 20 69 4f 66 66 3c 3d 70 4c 76 6c 2d 3e  if( iOff<=pLvl->
a700: 69 46 69 72 73 74 4f 66 66 20 29 7b 0a 20 20 20  iFirstOff ){.   
a710: 20 70 4c 76 6c 2d 3e 62 45 6f 66 20 3d 20 31 3b   pLvl->bEof = 1;
a720: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 75 38  .  }else{.    u8
a730: 20 2a 61 20 3d 20 70 4c 76 6c 2d 3e 70 44 61 74   *a = pLvl->pDat
a740: 61 2d 3e 70 3b 0a 20 20 20 20 69 36 34 20 69 56  a->p;.    i64 iV
a750: 61 6c 3b 0a 20 20 20 20 69 6e 74 20 69 4c 69 6d  al;.    int iLim
a760: 69 74 3b 0a 20 20 20 20 69 6e 74 20 69 69 3b 0a  it;.    int ii;.
a770: 20 20 20 20 69 6e 74 20 6e 5a 65 72 6f 20 3d 20      int nZero = 
a780: 30 3b 0a 0a 20 20 20 20 2f 2a 20 43 75 72 72 65  0;..    /* Curre
a790: 6e 74 6c 79 20 69 4f 66 66 20 70 6f 69 6e 74 73  ntly iOff points
a7a0: 20 74 6f 20 74 68 65 20 66 69 72 73 74 20 62 79   to the first by
a7b0: 74 65 20 6f 66 20 61 20 76 61 72 69 6e 74 2e 20  te of a varint. 
a7c0: 54 68 69 73 20 62 6c 6f 63 6b 20 0a 20 20 20 20  This block .    
a7d0: 2a 2a 20 64 65 63 72 65 6d 65 6e 74 73 20 69 4f  ** decrements iO
a7e0: 66 66 20 75 6e 74 69 6c 20 69 74 20 70 6f 69 6e  ff until it poin
a7f0: 74 73 20 74 6f 20 74 68 65 20 66 69 72 73 74 20  ts to the first 
a800: 62 79 74 65 20 6f 66 20 74 68 65 20 70 72 65 76  byte of the prev
a810: 69 6f 75 73 20 0a 20 20 20 20 2a 2a 20 76 61 72  ious .    ** var
a820: 69 6e 74 2e 20 54 61 6b 69 6e 67 20 63 61 72 65  int. Taking care
a830: 20 6e 6f 74 20 74 6f 20 72 65 61 64 20 61 6e 79   not to read any
a840: 20 6d 65 6d 6f 72 79 20 6c 6f 63 61 74 69 6f 6e   memory location
a850: 73 20 74 68 61 74 20 6f 63 63 75 72 0a 20 20 20  s that occur.   
a860: 20 2a 2a 20 62 65 66 6f 72 65 20 74 68 65 20 62   ** before the b
a870: 75 66 66 65 72 20 69 6e 20 6d 65 6d 6f 72 79 2e  uffer in memory.
a880: 20 20 2a 2f 0a 20 20 20 20 69 4c 69 6d 69 74 20    */.    iLimit 
a890: 3d 20 28 69 4f 66 66 3e 39 20 3f 20 69 4f 66 66  = (iOff>9 ? iOff
a8a0: 2d 39 20 3a 20 30 29 3b 0a 20 20 20 20 66 6f 72  -9 : 0);.    for
a8b0: 28 69 4f 66 66 2d 2d 3b 20 69 4f 66 66 3e 69 4c  (iOff--; iOff>iL
a8c0: 69 6d 69 74 3b 20 69 4f 66 66 2d 2d 29 7b 0a 20  imit; iOff--){. 
a8d0: 20 20 20 20 20 69 66 28 20 28 61 5b 69 4f 66 66       if( (a[iOff
a8e0: 2d 31 5d 20 26 20 30 78 38 30 29 3d 3d 30 20 29  -1] & 0x80)==0 )
a8f0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20   break;.    }.. 
a900: 20 20 20 66 74 73 35 47 65 74 56 61 72 69 6e 74     fts5GetVarint
a910: 28 26 61 5b 69 4f 66 66 5d 2c 20 28 75 36 34 2a  (&a[iOff], (u64*
a920: 29 26 69 56 61 6c 29 3b 0a 20 20 20 20 70 4c 76  )&iVal);.    pLv
a930: 6c 2d 3e 69 52 6f 77 69 64 20 2d 3d 20 69 56 61  l->iRowid -= iVa
a940: 6c 3b 0a 20 20 20 20 70 4c 76 6c 2d 3e 69 4c 65  l;.    pLvl->iLe
a950: 61 66 50 67 6e 6f 2d 2d 3b 0a 0a 20 20 20 20 2f  afPgno--;..    /
a960: 2a 20 53 6b 69 70 20 62 61 63 6b 77 61 72 64 73  * Skip backwards
a970: 20 70 61 73 74 20 61 6e 79 20 30 78 30 30 20 76   past any 0x00 v
a980: 61 72 69 6e 74 73 2e 20 2a 2f 0a 20 20 20 20 66  arints. */.    f
a990: 6f 72 28 69 69 3d 69 4f 66 66 2d 31 3b 20 69 69  or(ii=iOff-1; ii
a9a0: 3e 3d 70 4c 76 6c 2d 3e 69 46 69 72 73 74 4f 66  >=pLvl->iFirstOf
a9b0: 66 20 26 26 20 61 5b 69 69 5d 3d 3d 30 78 30 30  f && a[ii]==0x00
a9c0: 3b 20 69 69 2d 2d 29 7b 0a 20 20 20 20 20 20 6e  ; ii--){.      n
a9d0: 5a 65 72 6f 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20  Zero++;.    }.  
a9e0: 20 20 69 66 28 20 69 69 3e 3d 70 4c 76 6c 2d 3e    if( ii>=pLvl->
a9f0: 69 46 69 72 73 74 4f 66 66 20 26 26 20 28 61 5b  iFirstOff && (a[
aa00: 69 69 5d 20 26 20 30 78 38 30 29 20 29 7b 0a 20  ii] & 0x80) ){. 
aa10: 20 20 20 20 20 2f 2a 20 54 68 65 20 62 79 74 65       /* The byte
aa20: 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 62 65 66   immediately bef
aa30: 6f 72 65 20 74 68 65 20 6c 61 73 74 20 30 78 30  ore the last 0x0
aa40: 30 20 62 79 74 65 20 68 61 73 20 74 68 65 20 30  0 byte has the 0
aa50: 78 38 30 20 62 69 74 0a 20 20 20 20 20 20 2a 2a  x80 bit.      **
aa60: 20 73 65 74 2e 20 53 6f 20 74 68 65 20 6c 61 73   set. So the las
aa70: 74 20 30 78 30 30 20 69 73 20 6f 6e 6c 79 20 61  t 0x00 is only a
aa80: 20 76 61 72 69 6e 74 20 30 20 69 66 20 74 68 65   varint 0 if the
aa90: 72 65 20 61 72 65 20 38 20 6d 6f 72 65 20 30 78  re are 8 more 0x
aaa0: 38 30 0a 20 20 20 20 20 20 2a 2a 20 62 79 74 65  80.      ** byte
aab0: 73 20 62 65 66 6f 72 65 20 61 5b 69 69 5d 2e 20  s before a[ii]. 
aac0: 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 62 5a 65  */.      int bZe
aad0: 72 6f 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ro = 0;         
aae0: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
aaf0: 6c 61 73 74 20 30 78 30 30 20 63 6f 75 6e 74 73  last 0x00 counts
ab00: 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 28 69   */.      if( (i
ab10: 69 2d 38 29 3e 3d 70 4c 76 6c 2d 3e 69 46 69 72  i-8)>=pLvl->iFir
ab20: 73 74 4f 66 66 20 29 7b 0a 20 20 20 20 20 20 20  stOff ){.       
ab30: 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 20 20   int j;.        
ab40: 66 6f 72 28 6a 3d 31 3b 20 6a 3c 3d 38 20 26 26  for(j=1; j<=8 &&
ab50: 20 28 61 5b 69 69 2d 6a 5d 20 26 20 30 78 38 30   (a[ii-j] & 0x80
ab60: 29 3b 20 6a 2b 2b 29 3b 0a 20 20 20 20 20 20 20  ); j++);.       
ab70: 20 62 5a 65 72 6f 20 3d 20 28 6a 3e 38 29 3b 0a   bZero = (j>8);.
ab80: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
ab90: 28 20 62 5a 65 72 6f 3d 3d 30 20 29 20 6e 5a 65  ( bZero==0 ) nZe
aba0: 72 6f 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ro--;.    }.    
abb0: 70 4c 76 6c 2d 3e 69 4c 65 61 66 50 67 6e 6f 20  pLvl->iLeafPgno 
abc0: 2d 3d 20 6e 5a 65 72 6f 3b 0a 20 20 20 20 70 4c  -= nZero;.    pL
abd0: 76 6c 2d 3e 69 4f 66 66 20 3d 20 69 4f 66 66 20  vl->iOff = iOff 
abe0: 2d 20 6e 5a 65 72 6f 3b 0a 20 20 7d 0a 0a 20 20  - nZero;.  }..  
abf0: 72 65 74 75 72 6e 20 70 4c 76 6c 2d 3e 62 45 6f  return pLvl->bEo
ac00: 66 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74  f;.}..static int
ac10: 20 66 74 73 35 44 6c 69 64 78 49 74 65 72 50 72   fts5DlidxIterPr
ac20: 65 76 52 28 46 74 73 35 49 6e 64 65 78 20 2a 70  evR(Fts5Index *p
ac30: 2c 20 46 74 73 35 44 6c 69 64 78 49 74 65 72 20  , Fts5DlidxIter 
ac40: 2a 70 49 74 65 72 2c 20 69 6e 74 20 69 4c 76 6c  *pIter, int iLvl
ac50: 29 7b 0a 20 20 46 74 73 35 44 6c 69 64 78 4c 76  ){.  Fts5DlidxLv
ac60: 6c 20 2a 70 4c 76 6c 20 3d 20 26 70 49 74 65 72  l *pLvl = &pIter
ac70: 2d 3e 61 4c 76 6c 5b 69 4c 76 6c 5d 3b 0a 0a 20  ->aLvl[iLvl];.. 
ac80: 20 61 73 73 65 72 74 28 20 69 4c 76 6c 3c 70 49   assert( iLvl<pI
ac90: 74 65 72 2d 3e 6e 4c 76 6c 20 29 3b 0a 20 20 69  ter->nLvl );.  i
aca0: 66 28 20 66 74 73 35 44 6c 69 64 78 4c 76 6c 50  f( fts5DlidxLvlP
acb0: 72 65 76 28 70 4c 76 6c 29 20 29 7b 0a 20 20 20  rev(pLvl) ){.   
acc0: 20 69 66 28 20 28 69 4c 76 6c 2b 31 29 20 3c 20   if( (iLvl+1) < 
acd0: 70 49 74 65 72 2d 3e 6e 4c 76 6c 20 29 7b 0a 20  pIter->nLvl ){. 
ace0: 20 20 20 20 20 66 74 73 35 44 6c 69 64 78 49 74       fts5DlidxIt
acf0: 65 72 50 72 65 76 52 28 70 2c 20 70 49 74 65 72  erPrevR(p, pIter
ad00: 2c 20 69 4c 76 6c 2b 31 29 3b 0a 20 20 20 20 20  , iLvl+1);.     
ad10: 20 69 66 28 20 70 4c 76 6c 5b 31 5d 2e 62 45 6f   if( pLvl[1].bEo
ad20: 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  f==0 ){.        
ad30: 66 74 73 35 44 61 74 61 52 65 6c 65 61 73 65 28  fts5DataRelease(
ad40: 70 4c 76 6c 2d 3e 70 44 61 74 61 29 3b 0a 20 20  pLvl->pData);.  
ad50: 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70 4c 76        memset(pLv
ad60: 6c 2c 20 30 2c 20 73 69 7a 65 6f 66 28 46 74 73  l, 0, sizeof(Fts
ad70: 35 44 6c 69 64 78 4c 76 6c 29 29 3b 0a 20 20 20  5DlidxLvl));.   
ad80: 20 20 20 20 20 70 4c 76 6c 2d 3e 70 44 61 74 61       pLvl->pData
ad90: 20 3d 20 66 74 73 35 44 61 74 61 52 65 61 64 28   = fts5DataRead(
ada0: 70 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  p, .            
adb0: 46 54 53 35 5f 44 4c 49 44 58 5f 52 4f 57 49 44  FTS5_DLIDX_ROWID
adc0: 28 70 49 74 65 72 2d 3e 69 53 65 67 69 64 2c 20  (pIter->iSegid, 
add0: 69 4c 76 6c 2c 20 70 4c 76 6c 5b 31 5d 2e 69 4c  iLvl, pLvl[1].iL
ade0: 65 61 66 50 67 6e 6f 29 0a 20 20 20 20 20 20 20  eafPgno).       
adf0: 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
ae00: 70 4c 76 6c 2d 3e 70 44 61 74 61 20 29 7b 0a 20  pLvl->pData ){. 
ae10: 20 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20           while( 
ae20: 66 74 73 35 44 6c 69 64 78 4c 76 6c 4e 65 78 74  fts5DlidxLvlNext
ae30: 28 70 4c 76 6c 29 3d 3d 30 20 29 3b 0a 20 20 20  (pLvl)==0 );.   
ae40: 20 20 20 20 20 20 20 70 4c 76 6c 2d 3e 62 45 6f         pLvl->bEo
ae50: 66 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d  f = 0;.        }
ae60: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
ae70: 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70 49 74   }..  return pIt
ae80: 65 72 2d 3e 61 4c 76 6c 5b 30 5d 2e 62 45 6f 66  er->aLvl[0].bEof
ae90: 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74 20 66  ;.}.static int f
aea0: 74 73 35 44 6c 69 64 78 49 74 65 72 50 72 65 76  ts5DlidxIterPrev
aeb0: 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 46  (Fts5Index *p, F
aec0: 74 73 35 44 6c 69 64 78 49 74 65 72 20 2a 70 49  ts5DlidxIter *pI
aed0: 74 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 66  ter){.  return f
aee0: 74 73 35 44 6c 69 64 78 49 74 65 72 50 72 65 76  ts5DlidxIterPrev
aef0: 52 28 70 2c 20 70 49 74 65 72 2c 20 30 29 3b 0a  R(p, pIter, 0);.
af00: 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 20  }../*.** Free a 
af10: 64 6f 63 6c 69 73 74 2d 69 6e 64 65 78 20 69 74  doclist-index it
af20: 65 72 61 74 6f 72 20 6f 62 6a 65 63 74 20 61 6c  erator object al
af30: 6c 6f 63 61 74 65 64 20 62 79 20 66 74 73 35 44  located by fts5D
af40: 6c 69 64 78 49 74 65 72 49 6e 69 74 28 29 2e 0a  lidxIterInit()..
af50: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
af60: 74 73 35 44 6c 69 64 78 49 74 65 72 46 72 65 65  ts5DlidxIterFree
af70: 28 46 74 73 35 44 6c 69 64 78 49 74 65 72 20 2a  (Fts5DlidxIter *
af80: 70 49 74 65 72 29 7b 0a 20 20 69 66 28 20 70 49  pIter){.  if( pI
af90: 74 65 72 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  ter ){.    int i
afa0: 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
afb0: 3c 70 49 74 65 72 2d 3e 6e 4c 76 6c 3b 20 69 2b  <pIter->nLvl; i+
afc0: 2b 29 7b 0a 20 20 20 20 20 20 66 74 73 35 44 61  +){.      fts5Da
afd0: 74 61 52 65 6c 65 61 73 65 28 70 49 74 65 72 2d  taRelease(pIter-
afe0: 3e 61 4c 76 6c 5b 69 5d 2e 70 44 61 74 61 29 3b  >aLvl[i].pData);
aff0: 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
b000: 65 33 5f 66 72 65 65 28 70 49 74 65 72 29 3b 0a  e3_free(pIter);.
b010: 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 46 74    }.}..static Ft
b020: 73 35 44 6c 69 64 78 49 74 65 72 20 2a 66 74 73  s5DlidxIter *fts
b030: 35 44 6c 69 64 78 49 74 65 72 49 6e 69 74 28 0a  5DlidxIterInit(.
b040: 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20    Fts5Index *p, 
b050: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b060: 20 20 2f 2a 20 46 74 73 35 20 42 61 63 6b 65 6e    /* Fts5 Backen
b070: 64 20 74 6f 20 69 74 65 72 61 74 65 20 77 69 74  d to iterate wit
b080: 68 69 6e 20 2a 2f 0a 20 20 69 6e 74 20 62 52 65  hin */.  int bRe
b090: 76 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  v,              
b0a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
b0b0: 20 66 6f 72 20 4f 52 44 45 52 20 42 59 20 41 53   for ORDER BY AS
b0c0: 43 20 2a 2f 0a 20 20 69 6e 74 20 69 53 65 67 69  C */.  int iSegi
b0d0: 64 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d,              
b0e0: 20 20 20 20 20 20 20 2f 2a 20 53 65 67 6d 65 6e         /* Segmen
b0f0: 74 20 69 64 20 2a 2f 0a 20 20 69 6e 74 20 69 4c  t id */.  int iL
b100: 65 61 66 50 67 20 20 20 20 20 20 20 20 20 20 20  eafPg           
b110: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 61            /* Lea
b120: 66 20 70 61 67 65 20 6e 75 6d 62 65 72 20 74 6f  f page number to
b130: 20 6c 6f 61 64 20 64 6c 69 64 78 20 66 6f 72 20   load dlidx for 
b140: 2a 2f 0a 29 7b 0a 20 20 46 74 73 35 44 6c 69 64  */.){.  Fts5Dlid
b150: 78 49 74 65 72 20 2a 70 49 74 65 72 20 3d 20 30  xIter *pIter = 0
b160: 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74  ;.  int i;.  int
b170: 20 62 44 6f 6e 65 20 3d 20 30 3b 0a 0a 20 20 66   bDone = 0;..  f
b180: 6f 72 28 69 3d 30 3b 20 70 2d 3e 72 63 3d 3d 53  or(i=0; p->rc==S
b190: 51 4c 49 54 45 5f 4f 4b 20 26 26 20 62 44 6f 6e  QLITE_OK && bDon
b1a0: 65 3d 3d 30 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  e==0; i++){.    
b1b0: 69 6e 74 20 6e 42 79 74 65 20 3d 20 73 69 7a 65  int nByte = size
b1c0: 6f 66 28 46 74 73 35 44 6c 69 64 78 49 74 65 72  of(Fts5DlidxIter
b1d0: 29 20 2b 20 69 20 2a 20 73 69 7a 65 6f 66 28 46  ) + i * sizeof(F
b1e0: 74 73 35 44 6c 69 64 78 4c 76 6c 29 3b 0a 20 20  ts5DlidxLvl);.  
b1f0: 20 20 46 74 73 35 44 6c 69 64 78 49 74 65 72 20    Fts5DlidxIter 
b200: 2a 70 4e 65 77 3b 0a 0a 20 20 20 20 70 4e 65 77  *pNew;..    pNew
b210: 20 3d 20 28 46 74 73 35 44 6c 69 64 78 49 74 65   = (Fts5DlidxIte
b220: 72 2a 29 73 71 6c 69 74 65 33 5f 72 65 61 6c 6c  r*)sqlite3_reall
b230: 6f 63 28 70 49 74 65 72 2c 20 6e 42 79 74 65 29  oc(pIter, nByte)
b240: 3b 0a 20 20 20 20 69 66 28 20 70 4e 65 77 3d 3d  ;.    if( pNew==
b250: 30 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 72 63  0 ){.      p->rc
b260: 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
b270: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
b280: 20 20 69 36 34 20 69 52 6f 77 69 64 20 3d 20 46    i64 iRowid = F
b290: 54 53 35 5f 44 4c 49 44 58 5f 52 4f 57 49 44 28  TS5_DLIDX_ROWID(
b2a0: 69 53 65 67 69 64 2c 20 69 2c 20 69 4c 65 61 66  iSegid, i, iLeaf
b2b0: 50 67 29 3b 0a 20 20 20 20 20 20 46 74 73 35 44  Pg);.      Fts5D
b2c0: 6c 69 64 78 4c 76 6c 20 2a 70 4c 76 6c 20 3d 20  lidxLvl *pLvl = 
b2d0: 26 70 4e 65 77 2d 3e 61 4c 76 6c 5b 69 5d 3b 0a  &pNew->aLvl[i];.
b2e0: 20 20 20 20 20 20 70 49 74 65 72 20 3d 20 70 4e        pIter = pN
b2f0: 65 77 3b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74  ew;.      memset
b300: 28 70 4c 76 6c 2c 20 30 2c 20 73 69 7a 65 6f 66  (pLvl, 0, sizeof
b310: 28 46 74 73 35 44 6c 69 64 78 4c 76 6c 29 29 3b  (Fts5DlidxLvl));
b320: 0a 20 20 20 20 20 20 70 4c 76 6c 2d 3e 70 44 61  .      pLvl->pDa
b330: 74 61 20 3d 20 66 74 73 35 44 61 74 61 52 65 61  ta = fts5DataRea
b340: 64 28 70 2c 20 69 52 6f 77 69 64 29 3b 0a 20 20  d(p, iRowid);.  
b350: 20 20 20 20 69 66 28 20 70 4c 76 6c 2d 3e 70 44      if( pLvl->pD
b360: 61 74 61 20 26 26 20 28 70 4c 76 6c 2d 3e 70 44  ata && (pLvl->pD
b370: 61 74 61 2d 3e 70 5b 30 5d 20 26 20 30 78 30 30  ata->p[0] & 0x00
b380: 30 31 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  01)==0 ){.      
b390: 20 20 62 44 6f 6e 65 20 3d 20 31 3b 0a 20 20 20    bDone = 1;.   
b3a0: 20 20 20 7d 0a 20 20 20 20 20 20 70 49 74 65 72     }.      pIter
b3b0: 2d 3e 6e 4c 76 6c 20 3d 20 69 2b 31 3b 0a 20 20  ->nLvl = i+1;.  
b3c0: 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70    }.  }..  if( p
b3d0: 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
b3e0: 29 7b 0a 20 20 20 20 70 49 74 65 72 2d 3e 69 53  ){.    pIter->iS
b3f0: 65 67 69 64 20 3d 20 69 53 65 67 69 64 3b 0a 20  egid = iSegid;. 
b400: 20 20 20 69 66 28 20 62 52 65 76 3d 3d 30 20 29     if( bRev==0 )
b410: 7b 0a 20 20 20 20 20 20 66 74 73 35 44 6c 69 64  {.      fts5Dlid
b420: 78 49 74 65 72 46 69 72 73 74 28 70 49 74 65 72  xIterFirst(pIter
b430: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
b440: 20 20 20 20 66 74 73 35 44 6c 69 64 78 49 74 65      fts5DlidxIte
b450: 72 4c 61 73 74 28 70 2c 20 70 49 74 65 72 29 3b  rLast(p, pIter);
b460: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66  .    }.  }..  if
b470: 28 20 70 2d 3e 72 63 21 3d 53 51 4c 49 54 45 5f  ( p->rc!=SQLITE_
b480: 4f 4b 20 29 7b 0a 20 20 20 20 66 74 73 35 44 6c  OK ){.    fts5Dl
b490: 69 64 78 49 74 65 72 46 72 65 65 28 70 49 74 65  idxIterFree(pIte
b4a0: 72 29 3b 0a 20 20 20 20 70 49 74 65 72 20 3d 20  r);.    pIter = 
b4b0: 30 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  0;.  }..  return
b4c0: 20 70 49 74 65 72 3b 0a 7d 0a 0a 73 74 61 74 69   pIter;.}..stati
b4d0: 63 20 69 36 34 20 66 74 73 35 44 6c 69 64 78 49  c i64 fts5DlidxI
b4e0: 74 65 72 52 6f 77 69 64 28 46 74 73 35 44 6c 69  terRowid(Fts5Dli
b4f0: 64 78 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a  dxIter *pIter){.
b500: 20 20 72 65 74 75 72 6e 20 70 49 74 65 72 2d 3e    return pIter->
b510: 61 4c 76 6c 5b 30 5d 2e 69 52 6f 77 69 64 3b 0a  aLvl[0].iRowid;.
b520: 7d 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73  }.static int fts
b530: 35 44 6c 69 64 78 49 74 65 72 50 67 6e 6f 28 46  5DlidxIterPgno(F
b540: 74 73 35 44 6c 69 64 78 49 74 65 72 20 2a 70 49  ts5DlidxIter *pI
b550: 74 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70  ter){.  return p
b560: 49 74 65 72 2d 3e 61 4c 76 6c 5b 30 5d 2e 69 4c  Iter->aLvl[0].iL
b570: 65 61 66 50 67 6e 6f 3b 0a 7d 0a 0a 2f 2a 0a 2a  eafPgno;.}../*.*
b580: 2a 20 4c 6f 61 64 20 74 68 65 20 6e 65 78 74 20  * Load the next 
b590: 6c 65 61 66 20 70 61 67 65 20 69 6e 74 6f 20 74  leaf page into t
b5a0: 68 65 20 73 65 67 6d 65 6e 74 20 69 74 65 72 61  he segment itera
b5b0: 74 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  tor..*/.static v
b5c0: 6f 69 64 20 66 74 73 35 53 65 67 49 74 65 72 4e  oid fts5SegIterN
b5d0: 65 78 74 50 61 67 65 28 0a 20 20 46 74 73 35 49  extPage(.  Fts5I
b5e0: 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20  ndex *p,        
b5f0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54             /* FT
b600: 53 35 20 62 61 63 6b 65 6e 64 20 6f 62 6a 65 63  S5 backend objec
b610: 74 20 2a 2f 0a 20 20 46 74 73 35 53 65 67 49 74  t */.  Fts5SegIt
b620: 65 72 20 2a 70 49 74 65 72 20 20 20 20 20 20 20  er *pIter       
b630: 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74         /* Iterat
b640: 6f 72 20 74 6f 20 61 64 76 61 6e 63 65 20 74 6f  or to advance to
b650: 20 6e 65 78 74 20 70 61 67 65 20 2a 2f 0a 29 7b   next page */.){
b660: 0a 20 20 46 74 73 35 44 61 74 61 20 2a 70 4c 65  .  Fts5Data *pLe
b670: 61 66 3b 0a 20 20 46 74 73 35 53 74 72 75 63 74  af;.  Fts5Struct
b680: 75 72 65 53 65 67 6d 65 6e 74 20 2a 70 53 65 67  ureSegment *pSeg
b690: 20 3d 20 70 49 74 65 72 2d 3e 70 53 65 67 3b 0a   = pIter->pSeg;.
b6a0: 20 20 66 74 73 35 44 61 74 61 52 65 6c 65 61 73    fts5DataReleas
b6b0: 65 28 70 49 74 65 72 2d 3e 70 4c 65 61 66 29 3b  e(pIter->pLeaf);
b6c0: 0a 20 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 50  .  pIter->iLeafP
b6d0: 67 6e 6f 2b 2b 3b 0a 20 20 69 66 28 20 70 49 74  gno++;.  if( pIt
b6e0: 65 72 2d 3e 70 4e 65 78 74 4c 65 61 66 20 29 7b  er->pNextLeaf ){
b6f0: 0a 20 20 20 20 70 49 74 65 72 2d 3e 70 4c 65 61  .    pIter->pLea
b700: 66 20 3d 20 70 49 74 65 72 2d 3e 70 4e 65 78 74  f = pIter->pNext
b710: 4c 65 61 66 3b 0a 20 20 20 20 70 49 74 65 72 2d  Leaf;.    pIter-
b720: 3e 70 4e 65 78 74 4c 65 61 66 20 3d 20 30 3b 0a  >pNextLeaf = 0;.
b730: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 49 74 65    }else if( pIte
b740: 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 3c 3d 70 53  r->iLeafPgno<=pS
b750: 65 67 2d 3e 70 67 6e 6f 4c 61 73 74 20 29 7b 0a  eg->pgnoLast ){.
b760: 20 20 20 20 70 49 74 65 72 2d 3e 70 4c 65 61 66      pIter->pLeaf
b770: 20 3d 20 66 74 73 35 44 61 74 61 52 65 61 64 28   = fts5DataRead(
b780: 70 2c 20 0a 20 20 20 20 20 20 20 20 46 54 53 35  p, .        FTS5
b790: 5f 53 45 47 4d 45 4e 54 5f 52 4f 57 49 44 28 70  _SEGMENT_ROWID(p
b7a0: 53 65 67 2d 3e 69 53 65 67 69 64 2c 20 70 49 74  Seg->iSegid, pIt
b7b0: 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 29 0a 20  er->iLeafPgno). 
b7c0: 20 20 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20     );.  }else{. 
b7d0: 20 20 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 20     pIter->pLeaf 
b7e0: 3d 20 30 3b 0a 20 20 7d 0a 20 20 70 4c 65 61 66  = 0;.  }.  pLeaf
b7f0: 20 3d 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 3b   = pIter->pLeaf;
b800: 0a 0a 20 20 69 66 28 20 70 4c 65 61 66 20 29 7b  ..  if( pLeaf ){
b810: 0a 20 20 20 20 70 49 74 65 72 2d 3e 69 50 67 69  .    pIter->iPgi
b820: 64 78 4f 66 66 20 3d 20 70 4c 65 61 66 2d 3e 73  dxOff = pLeaf->s
b830: 7a 4c 65 61 66 3b 0a 20 20 20 20 69 66 28 20 66  zLeaf;.    if( f
b840: 74 73 35 4c 65 61 66 49 73 54 65 72 6d 6c 65 73  ts5LeafIsTermles
b850: 73 28 70 4c 65 61 66 29 20 29 7b 0a 20 20 20 20  s(pLeaf) ){.    
b860: 20 20 70 49 74 65 72 2d 3e 69 45 6e 64 6f 66 44    pIter->iEndofD
b870: 6f 63 6c 69 73 74 20 3d 20 70 4c 65 61 66 2d 3e  oclist = pLeaf->
b880: 6e 6e 2b 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  nn+1;.    }else{
b890: 0a 20 20 20 20 20 20 70 49 74 65 72 2d 3e 69 50  .      pIter->iP
b8a0: 67 69 64 78 4f 66 66 20 2b 3d 20 66 74 73 35 47  gidxOff += fts5G
b8b0: 65 74 56 61 72 69 6e 74 33 32 28 26 70 4c 65 61  etVarint32(&pLea
b8c0: 66 2d 3e 70 5b 70 49 74 65 72 2d 3e 69 50 67 69  f->p[pIter->iPgi
b8d0: 64 78 4f 66 66 5d 2c 0a 20 20 20 20 20 20 20 20  dxOff],.        
b8e0: 20 20 70 49 74 65 72 2d 3e 69 45 6e 64 6f 66 44    pIter->iEndofD
b8f0: 6f 63 6c 69 73 74 0a 20 20 20 20 20 20 29 3b 0a  oclist.      );.
b900: 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
b910: 2a 2a 20 41 72 67 75 6d 65 6e 74 20 70 20 70 6f  ** Argument p po
b920: 69 6e 74 73 20 74 6f 20 61 20 62 75 66 66 65 72  ints to a buffer
b930: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 61 20 76 61   containing a va
b940: 72 69 6e 74 20 74 6f 20 62 65 20 69 6e 74 65 72  rint to be inter
b950: 70 72 65 74 65 64 20 61 73 20 61 0a 2a 2a 20 70  preted as a.** p
b960: 6f 73 69 74 69 6f 6e 20 6c 69 73 74 20 73 69 7a  osition list siz
b970: 65 20 66 69 65 6c 64 2e 20 52 65 61 64 20 74 68  e field. Read th
b980: 65 20 76 61 72 69 6e 74 20 61 6e 64 20 72 65 74  e varint and ret
b990: 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  urn the number o
b9a0: 66 20 62 79 74 65 73 0a 2a 2a 20 72 65 61 64 2e  f bytes.** read.
b9b0: 20 42 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e   Before returnin
b9c0: 67 2c 20 73 65 74 20 2a 70 6e 53 7a 20 74 6f 20  g, set *pnSz to 
b9d0: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79  the number of by
b9e0: 74 65 73 20 69 6e 20 74 68 65 20 70 6f 73 69 74  tes in the posit
b9f0: 69 6f 6e 0a 2a 2a 20 6c 69 73 74 2c 20 61 6e 64  ion.** list, and
ba00: 20 2a 70 62 44 65 6c 20 74 6f 20 74 72 75 65 20   *pbDel to true 
ba10: 69 66 20 74 68 65 20 64 65 6c 65 74 65 20 66 6c  if the delete fl
ba20: 61 67 20 69 73 20 73 65 74 2c 20 6f 72 20 66 61  ag is set, or fa
ba30: 6c 73 65 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a  lse otherwise..*
ba40: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73  /.static int fts
ba50: 35 47 65 74 50 6f 73 6c 69 73 74 53 69 7a 65 28  5GetPoslistSize(
ba60: 63 6f 6e 73 74 20 75 38 20 2a 70 2c 20 69 6e 74  const u8 *p, int
ba70: 20 2a 70 6e 53 7a 2c 20 69 6e 74 20 2a 70 62 44   *pnSz, int *pbD
ba80: 65 6c 29 7b 0a 20 20 69 6e 74 20 6e 53 7a 3b 0a  el){.  int nSz;.
ba90: 20 20 69 6e 74 20 6e 20 3d 20 30 3b 0a 20 20 66    int n = 0;.  f
baa0: 74 73 35 46 61 73 74 47 65 74 56 61 72 69 6e 74  ts5FastGetVarint
bab0: 33 32 28 70 2c 20 6e 2c 20 6e 53 7a 29 3b 0a 20  32(p, n, nSz);. 
bac0: 20 61 73 73 65 72 74 5f 6e 63 28 20 6e 53 7a 3e   assert_nc( nSz>
bad0: 3d 30 20 29 3b 0a 20 20 2a 70 6e 53 7a 20 3d 20  =0 );.  *pnSz = 
bae0: 6e 53 7a 2f 32 3b 0a 20 20 2a 70 62 44 65 6c 20  nSz/2;.  *pbDel 
baf0: 3d 20 6e 53 7a 20 26 20 30 78 30 30 30 31 3b 0a  = nSz & 0x0001;.
bb00: 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f    return n;.}../
bb10: 2a 0a 2a 2a 20 46 74 73 35 53 65 67 49 74 65 72  *.** Fts5SegIter
bb20: 2e 69 4c 65 61 66 4f 66 66 73 65 74 20 63 75 72  .iLeafOffset cur
bb30: 72 65 6e 74 6c 79 20 70 6f 69 6e 74 73 20 74 6f  rently points to
bb40: 20 74 68 65 20 66 69 72 73 74 20 62 79 74 65 20   the first byte 
bb50: 6f 66 20 61 0a 2a 2a 20 70 6f 73 69 74 69 6f 6e  of a.** position
bb60: 2d 6c 69 73 74 20 73 69 7a 65 20 66 69 65 6c 64  -list size field
bb70: 2e 20 52 65 61 64 20 74 68 65 20 76 61 6c 75 65  . Read the value
bb80: 20 6f 66 20 74 68 65 20 66 69 65 6c 64 20 61 6e   of the field an
bb90: 64 20 73 74 6f 72 65 20 69 74 0a 2a 2a 20 69 6e  d store it.** in
bba0: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 76   the following v
bbb0: 61 72 69 61 62 6c 65 73 3a 0a 2a 2a 0a 2a 2a 20  ariables:.**.** 
bbc0: 20 20 46 74 73 35 53 65 67 49 74 65 72 2e 6e 50    Fts5SegIter.nP
bbd0: 6f 73 0a 2a 2a 20 20 20 46 74 73 35 53 65 67 49  os.**   Fts5SegI
bbe0: 74 65 72 2e 62 44 65 6c 0a 2a 2a 0a 2a 2a 20 4c  ter.bDel.**.** L
bbf0: 65 61 76 65 20 46 74 73 35 53 65 67 49 74 65 72  eave Fts5SegIter
bc00: 2e 69 4c 65 61 66 4f 66 66 73 65 74 20 70 6f 69  .iLeafOffset poi
bc10: 6e 74 69 6e 67 20 74 6f 20 74 68 65 20 66 69 72  nting to the fir
bc20: 73 74 20 62 79 74 65 20 6f 66 20 74 68 65 20 0a  st byte of the .
bc30: 2a 2a 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74  ** position list
bc40: 20 63 6f 6e 74 65 6e 74 20 28 69 66 20 61 6e 79   content (if any
bc50: 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  )..*/.static voi
bc60: 64 20 66 74 73 35 53 65 67 49 74 65 72 4c 6f 61  d fts5SegIterLoa
bc70: 64 4e 50 6f 73 28 46 74 73 35 49 6e 64 65 78 20  dNPos(Fts5Index 
bc80: 2a 70 2c 20 46 74 73 35 53 65 67 49 74 65 72 20  *p, Fts5SegIter 
bc90: 2a 70 49 74 65 72 29 7b 0a 20 20 69 66 28 20 70  *pIter){.  if( p
bca0: 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
bcb0: 29 7b 0a 20 20 20 20 69 6e 74 20 69 4f 66 66 20  ){.    int iOff 
bcc0: 3d 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66  = pIter->iLeafOf
bcd0: 66 73 65 74 3b 20 20 2f 2a 20 4f 66 66 73 65 74  fset;  /* Offset
bce0: 20 74 6f 20 72 65 61 64 20 61 74 20 2a 2f 0a 20   to read at */. 
bcf0: 20 20 20 41 53 53 45 52 54 5f 53 5a 4c 45 41 46     ASSERT_SZLEAF
bd00: 5f 4f 4b 28 70 49 74 65 72 2d 3e 70 4c 65 61 66  _OK(pIter->pLeaf
bd10: 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 43  );.    if( p->pC
bd20: 6f 6e 66 69 67 2d 3e 65 44 65 74 61 69 6c 3d 3d  onfig->eDetail==
bd30: 46 54 53 35 5f 44 45 54 41 49 4c 5f 4e 4f 4e 45  FTS5_DETAIL_NONE
bd40: 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 45   ){.      int iE
bd50: 6f 64 20 3d 20 4d 49 4e 28 70 49 74 65 72 2d 3e  od = MIN(pIter->
bd60: 69 45 6e 64 6f 66 44 6f 63 6c 69 73 74 2c 20 70  iEndofDoclist, p
bd70: 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 73 7a 4c  Iter->pLeaf->szL
bd80: 65 61 66 29 3b 0a 20 20 20 20 20 20 70 49 74 65  eaf);.      pIte
bd90: 72 2d 3e 62 44 65 6c 20 3d 20 30 3b 0a 20 20 20  r->bDel = 0;.   
bda0: 20 20 20 70 49 74 65 72 2d 3e 6e 50 6f 73 20 3d     pIter->nPos =
bdb0: 20 31 3b 0a 20 20 20 20 20 20 69 66 28 20 69 4f   1;.      if( iO
bdc0: 66 66 3c 69 45 6f 64 20 26 26 20 70 49 74 65 72  ff<iEod && pIter
bdd0: 2d 3e 70 4c 65 61 66 2d 3e 70 5b 69 4f 66 66 5d  ->pLeaf->p[iOff]
bde0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ==0 ){.        p
bdf0: 49 74 65 72 2d 3e 62 44 65 6c 20 3d 20 31 3b 0a  Iter->bDel = 1;.
be00: 20 20 20 20 20 20 20 20 69 4f 66 66 2b 2b 3b 0a          iOff++;.
be10: 20 20 20 20 20 20 20 20 69 66 28 20 69 4f 66 66          if( iOff
be20: 3c 69 45 6f 64 20 26 26 20 70 49 74 65 72 2d 3e  <iEod && pIter->
be30: 70 4c 65 61 66 2d 3e 70 5b 69 4f 66 66 5d 3d 3d  pLeaf->p[iOff]==
be40: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  0 ){.          p
be50: 49 74 65 72 2d 3e 6e 50 6f 73 20 3d 20 31 3b 0a  Iter->nPos = 1;.
be60: 20 20 20 20 20 20 20 20 20 20 69 4f 66 66 2b 2b            iOff++
be70: 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
be80: 0a 20 20 20 20 20 20 20 20 20 20 70 49 74 65 72  .          pIter
be90: 2d 3e 6e 50 6f 73 20 3d 20 30 3b 0a 20 20 20 20  ->nPos = 0;.    
bea0: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
beb0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69    }else{.      i
bec0: 6e 74 20 6e 53 7a 3b 0a 20 20 20 20 20 20 66 74  nt nSz;.      ft
bed0: 73 35 46 61 73 74 47 65 74 56 61 72 69 6e 74 33  s5FastGetVarint3
bee0: 32 28 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e  2(pIter->pLeaf->
bef0: 70 2c 20 69 4f 66 66 2c 20 6e 53 7a 29 3b 0a 20  p, iOff, nSz);. 
bf00: 20 20 20 20 20 70 49 74 65 72 2d 3e 62 44 65 6c       pIter->bDel
bf10: 20 3d 20 28 6e 53 7a 20 26 20 30 78 30 30 30 31   = (nSz & 0x0001
bf20: 29 3b 0a 20 20 20 20 20 20 70 49 74 65 72 2d 3e  );.      pIter->
bf30: 6e 50 6f 73 20 3d 20 6e 53 7a 3e 3e 31 3b 0a 20  nPos = nSz>>1;. 
bf40: 20 20 20 20 20 61 73 73 65 72 74 5f 6e 63 28 20       assert_nc( 
bf50: 70 49 74 65 72 2d 3e 6e 50 6f 73 3e 3d 30 20 29  pIter->nPos>=0 )
bf60: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 49 74 65  ;.    }.    pIte
bf70: 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 20 3d  r->iLeafOffset =
bf80: 20 69 4f 66 66 3b 0a 20 20 7d 0a 7d 0a 0a 73 74   iOff;.  }.}..st
bf90: 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 53 65  atic void fts5Se
bfa0: 67 49 74 65 72 4c 6f 61 64 52 6f 77 69 64 28 46  gIterLoadRowid(F
bfb0: 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 46 74 73  ts5Index *p, Fts
bfc0: 35 53 65 67 49 74 65 72 20 2a 70 49 74 65 72 29  5SegIter *pIter)
bfd0: 7b 0a 20 20 75 38 20 2a 61 20 3d 20 70 49 74 65  {.  u8 *a = pIte
bfe0: 72 2d 3e 70 4c 65 61 66 2d 3e 70 3b 20 20 20 20  r->pLeaf->p;    
bff0: 20 20 20 20 2f 2a 20 42 75 66 66 65 72 20 74 6f      /* Buffer to
c000: 20 72 65 61 64 20 64 61 74 61 20 66 72 6f 6d 20   read data from 
c010: 2a 2f 0a 20 20 69 6e 74 20 69 4f 66 66 20 3d 20  */.  int iOff = 
c020: 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73  pIter->iLeafOffs
c030: 65 74 3b 0a 0a 20 20 41 53 53 45 52 54 5f 53 5a  et;..  ASSERT_SZ
c040: 4c 45 41 46 5f 4f 4b 28 70 49 74 65 72 2d 3e 70  LEAF_OK(pIter->p
c050: 4c 65 61 66 29 3b 0a 20 20 69 66 28 20 69 4f 66  Leaf);.  if( iOf
c060: 66 3e 3d 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d  f>=pIter->pLeaf-
c070: 3e 73 7a 4c 65 61 66 20 29 7b 0a 20 20 20 20 66  >szLeaf ){.    f
c080: 74 73 35 53 65 67 49 74 65 72 4e 65 78 74 50 61  ts5SegIterNextPa
c090: 67 65 28 70 2c 20 70 49 74 65 72 29 3b 0a 20 20  ge(p, pIter);.  
c0a0: 20 20 69 66 28 20 70 49 74 65 72 2d 3e 70 4c 65    if( pIter->pLe
c0b0: 61 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  af==0 ){.      i
c0c0: 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  f( p->rc==SQLITE
c0d0: 5f 4f 4b 20 29 20 70 2d 3e 72 63 20 3d 20 46 54  _OK ) p->rc = FT
c0e0: 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20 20  S5_CORRUPT;.    
c0f0: 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a    return;.    }.
c100: 20 20 20 20 69 4f 66 66 20 3d 20 34 3b 0a 20 20      iOff = 4;.  
c110: 20 20 61 20 3d 20 70 49 74 65 72 2d 3e 70 4c 65    a = pIter->pLe
c120: 61 66 2d 3e 70 3b 0a 20 20 7d 0a 20 20 69 4f 66  af->p;.  }.  iOf
c130: 66 20 2b 3d 20 73 71 6c 69 74 65 33 46 74 73 35  f += sqlite3Fts5
c140: 47 65 74 56 61 72 69 6e 74 28 26 61 5b 69 4f 66  GetVarint(&a[iOf
c150: 66 5d 2c 20 28 75 36 34 2a 29 26 70 49 74 65 72  f], (u64*)&pIter
c160: 2d 3e 69 52 6f 77 69 64 29 3b 0a 20 20 70 49 74  ->iRowid);.  pIt
c170: 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 20  er->iLeafOffset 
c180: 3d 20 69 4f 66 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  = iOff;.}../*.**
c190: 20 46 74 73 35 53 65 67 49 74 65 72 2e 69 4c 65   Fts5SegIter.iLe
c1a0: 61 66 4f 66 66 73 65 74 20 63 75 72 72 65 6e 74  afOffset current
c1b0: 6c 79 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65  ly points to the
c1c0: 20 66 69 72 73 74 20 62 79 74 65 20 6f 66 20 74   first byte of t
c1d0: 68 65 20 0a 2a 2a 20 22 6e 53 75 66 66 69 78 22  he .** "nSuffix"
c1e0: 20 66 69 65 6c 64 20 6f 66 20 61 20 74 65 72 6d   field of a term
c1f0: 2e 20 46 75 6e 63 74 69 6f 6e 20 70 61 72 61 6d  . Function param
c200: 65 74 65 72 20 6e 4b 65 65 70 20 63 6f 6e 74 61  eter nKeep conta
c210: 69 6e 73 20 74 68 65 20 76 61 6c 75 65 0a 2a 2a  ins the value.**
c220: 20 6f 66 20 74 68 65 20 22 6e 50 72 65 66 69 78   of the "nPrefix
c230: 22 20 66 69 65 6c 64 20 28 69 66 20 74 68 65 72  " field (if ther
c240: 65 20 77 61 73 20 6f 6e 65 20 2d 20 69 74 20 69  e was one - it i
c250: 73 20 70 61 73 73 65 64 20 30 20 69 66 20 74 68  s passed 0 if th
c260: 69 73 20 69 73 0a 2a 2a 20 74 68 65 20 66 69 72  is is.** the fir
c270: 73 74 20 74 65 72 6d 20 69 6e 20 74 68 65 20 73  st term in the s
c280: 65 67 6d 65 6e 74 29 2e 0a 2a 2a 0a 2a 2a 20 54  egment)..**.** T
c290: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 70 6f 70  his function pop
c2a0: 75 6c 61 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  ulates:.**.**   
c2b0: 46 74 73 35 53 65 67 49 74 65 72 2e 74 65 72 6d  Fts5SegIter.term
c2c0: 0a 2a 2a 20 20 20 46 74 73 35 53 65 67 49 74 65  .**   Fts5SegIte
c2d0: 72 2e 72 6f 77 69 64 0a 2a 2a 0a 2a 2a 20 61 63  r.rowid.**.** ac
c2e0: 63 6f 72 64 69 6e 67 6c 79 20 61 6e 64 20 6c 65  cordingly and le
c2f0: 61 76 65 73 20 28 46 74 73 35 53 65 67 49 74 65  aves (Fts5SegIte
c300: 72 2e 69 4c 65 61 66 4f 66 66 73 65 74 29 20 73  r.iLeafOffset) s
c310: 65 74 20 74 6f 20 74 68 65 20 63 6f 6e 74 65 6e  et to the conten
c320: 74 20 6f 66 0a 2a 2a 20 74 68 65 20 66 69 72 73  t of.** the firs
c330: 74 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74 2e  t position list.
c340: 20 54 68 65 20 70 6f 73 69 74 69 6f 6e 20 6c 69   The position li
c350: 73 74 20 62 65 6c 6f 6e 67 69 6e 67 20 74 6f 20  st belonging to 
c360: 64 6f 63 75 6d 65 6e 74 20 0a 2a 2a 20 28 46 74  document .** (Ft
c370: 73 35 53 65 67 49 74 65 72 2e 69 52 6f 77 69 64  s5SegIter.iRowid
c380: 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  )..*/.static voi
c390: 64 20 66 74 73 35 53 65 67 49 74 65 72 4c 6f 61  d fts5SegIterLoa
c3a0: 64 54 65 72 6d 28 46 74 73 35 49 6e 64 65 78 20  dTerm(Fts5Index 
c3b0: 2a 70 2c 20 46 74 73 35 53 65 67 49 74 65 72 20  *p, Fts5SegIter 
c3c0: 2a 70 49 74 65 72 2c 20 69 6e 74 20 6e 4b 65 65  *pIter, int nKee
c3d0: 70 29 7b 0a 20 20 75 38 20 2a 61 20 3d 20 70 49  p){.  u8 *a = pI
c3e0: 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 70 3b 20 20  ter->pLeaf->p;  
c3f0: 20 20 20 20 20 20 2f 2a 20 42 75 66 66 65 72 20        /* Buffer 
c400: 74 6f 20 72 65 61 64 20 64 61 74 61 20 66 72 6f  to read data fro
c410: 6d 20 2a 2f 0a 20 20 69 6e 74 20 69 4f 66 66 20  m */.  int iOff 
c420: 3d 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66  = pIter->iLeafOf
c430: 66 73 65 74 3b 20 20 2f 2a 20 4f 66 66 73 65 74  fset;  /* Offset
c440: 20 74 6f 20 72 65 61 64 20 61 74 20 2a 2f 0a 20   to read at */. 
c450: 20 69 6e 74 20 6e 4e 65 77 3b 20 20 20 20 20 20   int nNew;      
c460: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c470: 20 2f 2a 20 42 79 74 65 73 20 6f 66 20 6e 65 77   /* Bytes of new
c480: 20 64 61 74 61 20 2a 2f 0a 0a 20 20 69 4f 66 66   data */..  iOff
c490: 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e   += fts5GetVarin
c4a0: 74 33 32 28 26 61 5b 69 4f 66 66 5d 2c 20 6e 4e  t32(&a[iOff], nN
c4b0: 65 77 29 3b 0a 20 20 70 49 74 65 72 2d 3e 74 65  ew);.  pIter->te
c4c0: 72 6d 2e 6e 20 3d 20 6e 4b 65 65 70 3b 0a 20 20  rm.n = nKeep;.  
c4d0: 66 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64  fts5BufferAppend
c4e0: 42 6c 6f 62 28 26 70 2d 3e 72 63 2c 20 26 70 49  Blob(&p->rc, &pI
c4f0: 74 65 72 2d 3e 74 65 72 6d 2c 20 6e 4e 65 77 2c  ter->term, nNew,
c500: 20 26 61 5b 69 4f 66 66 5d 29 3b 0a 20 20 69 4f   &a[iOff]);.  iO
c510: 66 66 20 2b 3d 20 6e 4e 65 77 3b 0a 20 20 70 49  ff += nNew;.  pI
c520: 74 65 72 2d 3e 69 54 65 72 6d 4c 65 61 66 4f 66  ter->iTermLeafOf
c530: 66 73 65 74 20 3d 20 69 4f 66 66 3b 0a 20 20 70  fset = iOff;.  p
c540: 49 74 65 72 2d 3e 69 54 65 72 6d 4c 65 61 66 50  Iter->iTermLeafP
c550: 67 6e 6f 20 3d 20 70 49 74 65 72 2d 3e 69 4c 65  gno = pIter->iLe
c560: 61 66 50 67 6e 6f 3b 0a 20 20 70 49 74 65 72 2d  afPgno;.  pIter-
c570: 3e 69 4c 65 61 66 4f 66 66 73 65 74 20 3d 20 69  >iLeafOffset = i
c580: 4f 66 66 3b 0a 0a 20 20 69 66 28 20 70 49 74 65  Off;..  if( pIte
c590: 72 2d 3e 69 50 67 69 64 78 4f 66 66 3e 3d 70 49  r->iPgidxOff>=pI
c5a0: 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 6e 6e 20 29  ter->pLeaf->nn )
c5b0: 7b 0a 20 20 20 20 70 49 74 65 72 2d 3e 69 45 6e  {.    pIter->iEn
c5c0: 64 6f 66 44 6f 63 6c 69 73 74 20 3d 20 70 49 74  dofDoclist = pIt
c5d0: 65 72 2d 3e 70 4c 65 61 66 2d 3e 6e 6e 2b 31 3b  er->pLeaf->nn+1;
c5e0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e  .  }else{.    in
c5f0: 74 20 6e 45 78 74 72 61 3b 0a 20 20 20 20 70 49  t nExtra;.    pI
c600: 74 65 72 2d 3e 69 50 67 69 64 78 4f 66 66 20 2b  ter->iPgidxOff +
c610: 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e 74 33  = fts5GetVarint3
c620: 32 28 26 61 5b 70 49 74 65 72 2d 3e 69 50 67 69  2(&a[pIter->iPgi
c630: 64 78 4f 66 66 5d 2c 20 6e 45 78 74 72 61 29 3b  dxOff], nExtra);
c640: 0a 20 20 20 20 70 49 74 65 72 2d 3e 69 45 6e 64  .    pIter->iEnd
c650: 6f 66 44 6f 63 6c 69 73 74 20 2b 3d 20 6e 45 78  ofDoclist += nEx
c660: 74 72 61 3b 0a 20 20 7d 0a 0a 20 20 66 74 73 35  tra;.  }..  fts5
c670: 53 65 67 49 74 65 72 4c 6f 61 64 52 6f 77 69 64  SegIterLoadRowid
c680: 28 70 2c 20 70 49 74 65 72 29 3b 0a 7d 0a 0a 73  (p, pIter);.}..s
c690: 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 53  tatic void fts5S
c6a0: 65 67 49 74 65 72 4e 65 78 74 28 46 74 73 35 49  egIterNext(Fts5I
c6b0: 6e 64 65 78 2a 2c 20 46 74 73 35 53 65 67 49 74  ndex*, Fts5SegIt
c6c0: 65 72 2a 2c 20 69 6e 74 2a 29 3b 0a 73 74 61 74  er*, int*);.stat
c6d0: 69 63 20 76 6f 69 64 20 66 74 73 35 53 65 67 49  ic void fts5SegI
c6e0: 74 65 72 4e 65 78 74 5f 52 65 76 65 72 73 65 28  terNext_Reverse(
c6f0: 46 74 73 35 49 6e 64 65 78 2a 2c 20 46 74 73 35  Fts5Index*, Fts5
c700: 53 65 67 49 74 65 72 2a 2c 20 69 6e 74 2a 29 3b  SegIter*, int*);
c710: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
c720: 35 53 65 67 49 74 65 72 4e 65 78 74 5f 4e 6f 6e  5SegIterNext_Non
c730: 65 28 46 74 73 35 49 6e 64 65 78 2a 2c 20 46 74  e(Fts5Index*, Ft
c740: 73 35 53 65 67 49 74 65 72 2a 2c 20 69 6e 74 2a  s5SegIter*, int*
c750: 29 3b 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20  );..static void 
c760: 66 74 73 35 53 65 67 49 74 65 72 53 65 74 4e 65  fts5SegIterSetNe
c770: 78 74 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c  xt(Fts5Index *p,
c780: 20 46 74 73 35 53 65 67 49 74 65 72 20 2a 70 49   Fts5SegIter *pI
c790: 74 65 72 29 7b 0a 20 20 69 66 28 20 70 49 74 65  ter){.  if( pIte
c7a0: 72 2d 3e 66 6c 61 67 73 20 26 20 46 54 53 35 5f  r->flags & FTS5_
c7b0: 53 45 47 49 54 45 52 5f 52 45 56 45 52 53 45 20  SEGITER_REVERSE 
c7c0: 29 7b 0a 20 20 20 20 70 49 74 65 72 2d 3e 78 4e  ){.    pIter->xN
c7d0: 65 78 74 20 3d 20 66 74 73 35 53 65 67 49 74 65  ext = fts5SegIte
c7e0: 72 4e 65 78 74 5f 52 65 76 65 72 73 65 3b 0a 20  rNext_Reverse;. 
c7f0: 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 70 43   }else if( p->pC
c800: 6f 6e 66 69 67 2d 3e 65 44 65 74 61 69 6c 3d 3d  onfig->eDetail==
c810: 46 54 53 35 5f 44 45 54 41 49 4c 5f 4e 4f 4e 45  FTS5_DETAIL_NONE
c820: 20 29 7b 0a 20 20 20 20 70 49 74 65 72 2d 3e 78   ){.    pIter->x
c830: 4e 65 78 74 20 3d 20 66 74 73 35 53 65 67 49 74  Next = fts5SegIt
c840: 65 72 4e 65 78 74 5f 4e 6f 6e 65 3b 0a 20 20 7d  erNext_None;.  }
c850: 65 6c 73 65 7b 0a 20 20 20 20 70 49 74 65 72 2d  else{.    pIter-
c860: 3e 78 4e 65 78 74 20 3d 20 66 74 73 35 53 65 67  >xNext = fts5Seg
c870: 49 74 65 72 4e 65 78 74 3b 0a 20 20 7d 0a 7d 0a  IterNext;.  }.}.
c880: 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a  ./*.** Initializ
c890: 65 20 74 68 65 20 69 74 65 72 61 74 6f 72 20 6f  e the iterator o
c8a0: 62 6a 65 63 74 20 70 49 74 65 72 20 74 6f 20 69  bject pIter to i
c8b0: 74 65 72 61 74 65 20 74 68 72 6f 75 67 68 20 74  terate through t
c8c0: 68 65 20 65 6e 74 72 69 65 73 20 69 6e 0a 2a 2a  he entries in.**
c8d0: 20 73 65 67 6d 65 6e 74 20 70 53 65 67 2e 20 54   segment pSeg. T
c8e0: 68 65 20 69 74 65 72 61 74 6f 72 20 69 73 20 6c  he iterator is l
c8f0: 65 66 74 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20  eft pointing to 
c900: 74 68 65 20 66 69 72 73 74 20 65 6e 74 72 79 20  the first entry 
c910: 77 68 65 6e 20 0a 2a 2a 20 74 68 69 73 20 66 75  when .** this fu
c920: 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 2e 0a  nction returns..
c930: 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f  **.** If an erro
c940: 72 20 6f 63 63 75 72 73 2c 20 46 74 73 35 49 6e  r occurs, Fts5In
c950: 64 65 78 2e 72 63 20 69 73 20 73 65 74 20 74 6f  dex.rc is set to
c960: 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65 20   an appropriate 
c970: 65 72 72 6f 72 20 63 6f 64 65 2e 20 49 66 20 0a  error code. If .
c980: 2a 2a 20 61 6e 20 65 72 72 6f 72 20 68 61 73 20  ** an error has 
c990: 61 6c 72 65 61 64 79 20 6f 63 63 75 72 72 65 64  already occurred
c9a0: 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74   when this funct
c9b0: 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20 69  ion is called, i
c9c0: 74 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f  t is a no-op..*/
c9d0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
c9e0: 35 53 65 67 49 74 65 72 49 6e 69 74 28 0a 20 20  5SegIterInit(.  
c9f0: 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 20 20  Fts5Index *p,   
ca00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ca10: 2f 2a 20 46 54 53 20 69 6e 64 65 78 20 6f 62 6a  /* FTS index obj
ca20: 65 63 74 20 2a 2f 0a 20 20 46 74 73 35 53 74 72  ect */.  Fts5Str
ca30: 75 63 74 75 72 65 53 65 67 6d 65 6e 74 20 2a 70  uctureSegment *p
ca40: 53 65 67 2c 20 20 20 20 20 2f 2a 20 44 65 73 63  Seg,     /* Desc
ca50: 72 69 70 74 69 6f 6e 20 6f 66 20 73 65 67 6d 65  ription of segme
ca60: 6e 74 20 2a 2f 0a 20 20 46 74 73 35 53 65 67 49  nt */.  Fts5SegI
ca70: 74 65 72 20 2a 70 49 74 65 72 20 20 20 20 20 20  ter *pIter      
ca80: 20 20 20 20 20 20 20 20 2f 2a 20 4f 62 6a 65 63          /* Objec
ca90: 74 20 74 6f 20 70 6f 70 75 6c 61 74 65 20 2a 2f  t to populate */
caa0: 0a 29 7b 0a 20 20 69 66 28 20 70 53 65 67 2d 3e  .){.  if( pSeg->
cab0: 70 67 6e 6f 46 69 72 73 74 3d 3d 30 20 29 7b 0a  pgnoFirst==0 ){.
cac0: 20 20 20 20 2f 2a 20 54 68 69 73 20 68 61 70 70      /* This happ
cad0: 65 6e 73 20 69 66 20 74 68 65 20 73 65 67 6d 65  ens if the segme
cae0: 6e 74 20 69 73 20 62 65 69 6e 67 20 75 73 65 64  nt is being used
caf0: 20 61 73 20 61 6e 20 69 6e 70 75 74 20 74 6f 20   as an input to 
cb00: 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c 0a 20  an incremental. 
cb10: 20 20 20 2a 2a 20 6d 65 72 67 65 20 61 6e 64 20     ** merge and 
cb20: 61 6c 6c 20 64 61 74 61 20 68 61 73 20 61 6c 72  all data has alr
cb30: 65 61 64 79 20 62 65 65 6e 20 22 74 72 69 6d 6d  eady been "trimm
cb40: 65 64 22 2e 20 53 65 65 20 66 75 6e 63 74 69 6f  ed". See functio
cb50: 6e 0a 20 20 20 20 2a 2a 20 66 74 73 35 54 72 69  n.    ** fts5Tri
cb60: 6d 53 65 67 6d 65 6e 74 73 28 29 20 66 6f 72 20  mSegments() for 
cb70: 64 65 74 61 69 6c 73 2e 20 49 6e 20 74 68 69 73  details. In this
cb80: 20 63 61 73 65 20 6c 65 61 76 65 20 74 68 65 20   case leave the 
cb90: 69 74 65 72 61 74 6f 72 20 65 6d 70 74 79 2e 0a  iterator empty..
cba0: 20 20 20 20 2a 2a 20 54 68 65 20 63 61 6c 6c 65      ** The calle
cbb0: 72 20 77 69 6c 6c 20 73 65 65 20 74 68 65 20 28  r will see the (
cbc0: 70 49 74 65 72 2d 3e 70 4c 65 61 66 3d 3d 30 29  pIter->pLeaf==0)
cbd0: 20 61 6e 64 20 61 73 73 75 6d 65 20 74 68 65 20   and assume the 
cbe0: 69 74 65 72 61 74 6f 72 20 69 73 0a 20 20 20 20  iterator is.    
cbf0: 2a 2a 20 61 74 20 45 4f 46 20 61 6c 72 65 61 64  ** at EOF alread
cc00: 79 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74  y. */.    assert
cc10: 28 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 3d 3d  ( pIter->pLeaf==
cc20: 30 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b  0 );.    return;
cc30: 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 2d 3e 72  .  }..  if( p->r
cc40: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
cc50: 20 20 20 20 6d 65 6d 73 65 74 28 70 49 74 65 72      memset(pIter
cc60: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70 49 74  , 0, sizeof(*pIt
cc70: 65 72 29 29 3b 0a 20 20 20 20 66 74 73 35 53 65  er));.    fts5Se
cc80: 67 49 74 65 72 53 65 74 4e 65 78 74 28 70 2c 20  gIterSetNext(p, 
cc90: 70 49 74 65 72 29 3b 0a 20 20 20 20 70 49 74 65  pIter);.    pIte
cca0: 72 2d 3e 70 53 65 67 20 3d 20 70 53 65 67 3b 0a  r->pSeg = pSeg;.
ccb0: 20 20 20 20 70 49 74 65 72 2d 3e 69 4c 65 61 66      pIter->iLeaf
ccc0: 50 67 6e 6f 20 3d 20 70 53 65 67 2d 3e 70 67 6e  Pgno = pSeg->pgn
ccd0: 6f 46 69 72 73 74 2d 31 3b 0a 20 20 20 20 66 74  oFirst-1;.    ft
cce0: 73 35 53 65 67 49 74 65 72 4e 65 78 74 50 61 67  s5SegIterNextPag
ccf0: 65 28 70 2c 20 70 49 74 65 72 29 3b 0a 20 20 7d  e(p, pIter);.  }
cd00: 0a 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53  ..  if( p->rc==S
cd10: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
cd20: 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73  pIter->iLeafOffs
cd30: 65 74 20 3d 20 34 3b 0a 20 20 20 20 61 73 73 65  et = 4;.    asse
cd40: 72 74 5f 6e 63 28 20 70 49 74 65 72 2d 3e 70 4c  rt_nc( pIter->pL
cd50: 65 61 66 2d 3e 6e 6e 3e 34 20 29 3b 0a 20 20 20  eaf->nn>4 );.   
cd60: 20 61 73 73 65 72 74 28 20 66 74 73 35 4c 65 61   assert( fts5Lea
cd70: 66 46 69 72 73 74 54 65 72 6d 4f 66 66 28 70 49  fFirstTermOff(pI
cd80: 74 65 72 2d 3e 70 4c 65 61 66 29 3d 3d 34 20 29  ter->pLeaf)==4 )
cd90: 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 69 50 67  ;.    pIter->iPg
cda0: 69 64 78 4f 66 66 20 3d 20 70 49 74 65 72 2d 3e  idxOff = pIter->
cdb0: 70 4c 65 61 66 2d 3e 73 7a 4c 65 61 66 2b 31 3b  pLeaf->szLeaf+1;
cdc0: 0a 20 20 20 20 66 74 73 35 53 65 67 49 74 65 72  .    fts5SegIter
cdd0: 4c 6f 61 64 54 65 72 6d 28 70 2c 20 70 49 74 65  LoadTerm(p, pIte
cde0: 72 2c 20 30 29 3b 0a 20 20 20 20 66 74 73 35 53  r, 0);.    fts5S
cdf0: 65 67 49 74 65 72 4c 6f 61 64 4e 50 6f 73 28 70  egIterLoadNPos(p
ce00: 2c 20 70 49 74 65 72 29 3b 0a 20 20 7d 0a 7d 0a  , pIter);.  }.}.
ce10: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
ce20: 74 69 6f 6e 20 69 73 20 6f 6e 6c 79 20 65 76 65  tion is only eve
ce30: 72 20 63 61 6c 6c 65 64 20 6f 6e 20 69 74 65 72  r called on iter
ce40: 61 74 6f 72 73 20 63 72 65 61 74 65 64 20 62 79  ators created by
ce50: 20 63 61 6c 6c 73 20 74 6f 0a 2a 2a 20 46 74 73   calls to.** Fts
ce60: 35 49 6e 64 65 78 51 75 65 72 79 28 29 20 77 69  5IndexQuery() wi
ce70: 74 68 20 74 68 65 20 46 54 53 35 49 4e 44 45 58  th the FTS5INDEX
ce80: 5f 51 55 45 52 59 5f 44 45 53 43 20 66 6c 61 67  _QUERY_DESC flag
ce90: 20 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20   set..**.** The 
cea0: 69 74 65 72 61 74 6f 72 20 69 73 20 69 6e 20 61  iterator is in a
ceb0: 6e 20 75 6e 75 73 75 61 6c 20 73 74 61 74 65 20  n unusual state 
cec0: 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69  when this functi
ced0: 6f 6e 20 69 73 20 63 61 6c 6c 65 64 3a 20 74 68  on is called: th
cee0: 65 0a 2a 2a 20 46 74 73 35 53 65 67 49 74 65 72  e.** Fts5SegIter
cef0: 2e 69 4c 65 61 66 4f 66 66 73 65 74 20 76 61 72  .iLeafOffset var
cf00: 69 61 62 6c 65 20 69 73 20 73 65 74 20 74 6f 20  iable is set to 
cf10: 74 68 65 20 6f 66 66 73 65 74 20 6f 66 20 74 68  the offset of th
cf20: 65 20 73 74 61 72 74 20 6f 66 0a 2a 2a 20 74 68  e start of.** th
cf30: 65 20 70 6f 73 69 74 69 6f 6e 2d 6c 69 73 74 20  e position-list 
cf40: 73 69 7a 65 20 66 69 65 6c 64 20 66 6f 72 20 74  size field for t
cf50: 68 65 20 66 69 72 73 74 20 72 65 6c 65 76 61 6e  he first relevan
cf60: 74 20 72 6f 77 69 64 20 6f 6e 20 74 68 65 20 70  t rowid on the p
cf70: 61 67 65 2e 0a 2a 2a 20 46 74 73 35 53 65 67 49  age..** Fts5SegI
cf80: 74 65 72 2e 72 6f 77 69 64 20 69 73 20 73 65 74  ter.rowid is set
cf90: 2c 20 62 75 74 20 6e 50 6f 73 20 61 6e 64 20 62  , but nPos and b
cfa0: 44 65 6c 20 61 72 65 20 6e 6f 74 2e 0a 2a 2a 0a  Del are not..**.
cfb0: 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
cfc0: 20 61 64 76 61 6e 63 65 73 20 74 68 65 20 69 74   advances the it
cfd0: 65 72 61 74 6f 72 20 73 6f 20 74 68 61 74 20 69  erator so that i
cfe0: 74 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20  t points to the 
cff0: 6c 61 73 74 20 0a 2a 2a 20 72 65 6c 65 76 61 6e  last .** relevan
d000: 74 20 72 6f 77 69 64 20 6f 6e 20 74 68 65 20 70  t rowid on the p
d010: 61 67 65 20 61 6e 64 2c 20 69 66 20 6e 65 63 65  age and, if nece
d020: 73 73 61 72 79 2c 20 69 6e 69 74 69 61 6c 69 7a  ssary, initializ
d030: 65 73 20 74 68 65 20 0a 2a 2a 20 61 52 6f 77 69  es the .** aRowi
d040: 64 4f 66 66 73 65 74 5b 5d 20 61 6e 64 20 69 52  dOffset[] and iR
d050: 6f 77 69 64 4f 66 66 73 65 74 20 76 61 72 69 61  owidOffset varia
d060: 62 6c 65 73 2e 20 41 74 20 74 68 69 73 20 70 6f  bles. At this po
d070: 69 6e 74 20 74 68 65 20 69 74 65 72 61 74 6f 72  int the iterator
d080: 0a 2a 2a 20 69 73 20 69 6e 20 69 74 73 20 72 65  .** is in its re
d090: 67 75 6c 61 72 20 73 74 61 74 65 20 2d 20 46 74  gular state - Ft
d0a0: 73 35 53 65 67 49 74 65 72 2e 69 4c 65 61 66 4f  s5SegIter.iLeafO
d0b0: 66 66 73 65 74 20 70 6f 69 6e 74 73 20 74 6f 20  ffset points to 
d0c0: 74 68 65 20 66 69 72 73 74 0a 2a 2a 20 62 79 74  the first.** byt
d0d0: 65 20 6f 66 20 74 68 65 20 70 6f 73 69 74 69 6f  e of the positio
d0e0: 6e 20 6c 69 73 74 20 63 6f 6e 74 65 6e 74 20 61  n list content a
d0f0: 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 73  ssociated with s
d100: 61 69 64 20 72 6f 77 69 64 2e 0a 2a 2f 0a 73 74  aid rowid..*/.st
d110: 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 53 65  atic void fts5Se
d120: 67 49 74 65 72 52 65 76 65 72 73 65 49 6e 69 74  gIterReverseInit
d130: 50 61 67 65 28 46 74 73 35 49 6e 64 65 78 20 2a  Page(Fts5Index *
d140: 70 2c 20 46 74 73 35 53 65 67 49 74 65 72 20 2a  p, Fts5SegIter *
d150: 70 49 74 65 72 29 7b 0a 20 20 69 6e 74 20 65 44  pIter){.  int eD
d160: 65 74 61 69 6c 20 3d 20 70 2d 3e 70 43 6f 6e 66  etail = p->pConf
d170: 69 67 2d 3e 65 44 65 74 61 69 6c 3b 0a 20 20 69  ig->eDetail;.  i
d180: 6e 74 20 6e 20 3d 20 70 49 74 65 72 2d 3e 70 4c  nt n = pIter->pL
d190: 65 61 66 2d 3e 73 7a 4c 65 61 66 3b 0a 20 20 69  eaf->szLeaf;.  i
d1a0: 6e 74 20 69 20 3d 20 70 49 74 65 72 2d 3e 69 4c  nt i = pIter->iL
d1b0: 65 61 66 4f 66 66 73 65 74 3b 0a 20 20 75 38 20  eafOffset;.  u8 
d1c0: 2a 61 20 3d 20 70 49 74 65 72 2d 3e 70 4c 65 61  *a = pIter->pLea
d1d0: 66 2d 3e 70 3b 0a 20 20 69 6e 74 20 69 52 6f 77  f->p;.  int iRow
d1e0: 69 64 4f 66 66 73 65 74 20 3d 20 30 3b 0a 0a 20  idOffset = 0;.. 
d1f0: 20 69 66 28 20 6e 3e 70 49 74 65 72 2d 3e 69 45   if( n>pIter->iE
d200: 6e 64 6f 66 44 6f 63 6c 69 73 74 20 29 7b 0a 20  ndofDoclist ){. 
d210: 20 20 20 6e 20 3d 20 70 49 74 65 72 2d 3e 69 45     n = pIter->iE
d220: 6e 64 6f 66 44 6f 63 6c 69 73 74 3b 0a 20 20 7d  ndofDoclist;.  }
d230: 0a 0a 20 20 41 53 53 45 52 54 5f 53 5a 4c 45 41  ..  ASSERT_SZLEA
d240: 46 5f 4f 4b 28 70 49 74 65 72 2d 3e 70 4c 65 61  F_OK(pIter->pLea
d250: 66 29 3b 0a 20 20 77 68 69 6c 65 28 20 31 20 29  f);.  while( 1 )
d260: 7b 0a 20 20 20 20 69 36 34 20 69 44 65 6c 74 61  {.    i64 iDelta
d270: 20 3d 20 30 3b 0a 0a 20 20 20 20 69 66 28 20 65   = 0;..    if( e
d280: 44 65 74 61 69 6c 3d 3d 46 54 53 35 5f 44 45 54  Detail==FTS5_DET
d290: 41 49 4c 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20  AIL_NONE ){.    
d2a0: 20 20 2f 2a 20 74 6f 64 6f 20 2a 2f 0a 20 20 20    /* todo */.   
d2b0: 20 20 20 69 66 28 20 69 3c 6e 20 26 26 20 61 5b     if( i<n && a[
d2c0: 69 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  i]==0 ){.       
d2d0: 20 69 2b 2b 3b 0a 20 20 20 20 20 20 20 20 69 66   i++;.        if
d2e0: 28 20 69 3c 6e 20 26 26 20 61 5b 69 5d 3d 3d 30  ( i<n && a[i]==0
d2f0: 20 29 20 69 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a   ) i++;.      }.
d300: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
d310: 20 69 6e 74 20 6e 50 6f 73 3b 0a 20 20 20 20 20   int nPos;.     
d320: 20 69 6e 74 20 62 44 75 6d 6d 79 3b 0a 20 20 20   int bDummy;.   
d330: 20 20 20 69 20 2b 3d 20 66 74 73 35 47 65 74 50     i += fts5GetP
d340: 6f 73 6c 69 73 74 53 69 7a 65 28 26 61 5b 69 5d  oslistSize(&a[i]
d350: 2c 20 26 6e 50 6f 73 2c 20 26 62 44 75 6d 6d 79  , &nPos, &bDummy
d360: 29 3b 0a 20 20 20 20 20 20 69 20 2b 3d 20 6e 50  );.      i += nP
d370: 6f 73 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  os;.    }.    if
d380: 28 20 69 3e 3d 6e 20 29 20 62 72 65 61 6b 3b 0a  ( i>=n ) break;.
d390: 20 20 20 20 69 20 2b 3d 20 66 74 73 35 47 65 74      i += fts5Get
d3a0: 56 61 72 69 6e 74 28 26 61 5b 69 5d 2c 20 28 75  Varint(&a[i], (u
d3b0: 36 34 2a 29 26 69 44 65 6c 74 61 29 3b 0a 20 20  64*)&iDelta);.  
d3c0: 20 20 70 49 74 65 72 2d 3e 69 52 6f 77 69 64 20    pIter->iRowid 
d3d0: 2b 3d 20 69 44 65 6c 74 61 3b 0a 0a 20 20 20 20  += iDelta;..    
d3e0: 2f 2a 20 49 66 20 6e 65 63 65 73 73 61 72 79 2c  /* If necessary,
d3f0: 20 67 72 6f 77 20 74 68 65 20 70 49 74 65 72 2d   grow the pIter-
d400: 3e 61 52 6f 77 69 64 4f 66 66 73 65 74 5b 5d 20  >aRowidOffset[] 
d410: 61 72 72 61 79 2e 20 2a 2f 0a 20 20 20 20 69 66  array. */.    if
d420: 28 20 69 52 6f 77 69 64 4f 66 66 73 65 74 3e 3d  ( iRowidOffset>=
d430: 70 49 74 65 72 2d 3e 6e 52 6f 77 69 64 4f 66 66  pIter->nRowidOff
d440: 73 65 74 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  set ){.      int
d450: 20 6e 4e 65 77 20 3d 20 70 49 74 65 72 2d 3e 6e   nNew = pIter->n
d460: 52 6f 77 69 64 4f 66 66 73 65 74 20 2b 20 38 3b  RowidOffset + 8;
d470: 0a 20 20 20 20 20 20 69 6e 74 20 2a 61 4e 65 77  .      int *aNew
d480: 20 3d 20 28 69 6e 74 2a 29 73 71 6c 69 74 65 33   = (int*)sqlite3
d490: 5f 72 65 61 6c 6c 6f 63 28 70 49 74 65 72 2d 3e  _realloc(pIter->
d4a0: 61 52 6f 77 69 64 4f 66 66 73 65 74 2c 20 6e 4e  aRowidOffset, nN
d4b0: 65 77 2a 73 69 7a 65 6f 66 28 69 6e 74 29 29 3b  ew*sizeof(int));
d4c0: 0a 20 20 20 20 20 20 69 66 28 20 61 4e 65 77 3d  .      if( aNew=
d4d0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d  =0 ){.        p-
d4e0: 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d  >rc = SQLITE_NOM
d4f0: 45 4d 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  EM;.        brea
d500: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
d510: 20 70 49 74 65 72 2d 3e 61 52 6f 77 69 64 4f 66   pIter->aRowidOf
d520: 66 73 65 74 20 3d 20 61 4e 65 77 3b 0a 20 20 20  fset = aNew;.   
d530: 20 20 20 70 49 74 65 72 2d 3e 6e 52 6f 77 69 64     pIter->nRowid
d540: 4f 66 66 73 65 74 20 3d 20 6e 4e 65 77 3b 0a 20  Offset = nNew;. 
d550: 20 20 20 7d 0a 0a 20 20 20 20 70 49 74 65 72 2d     }..    pIter-
d560: 3e 61 52 6f 77 69 64 4f 66 66 73 65 74 5b 69 52  >aRowidOffset[iR
d570: 6f 77 69 64 4f 66 66 73 65 74 2b 2b 5d 20 3d 20  owidOffset++] = 
d580: 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73  pIter->iLeafOffs
d590: 65 74 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 69  et;.    pIter->i
d5a0: 4c 65 61 66 4f 66 66 73 65 74 20 3d 20 69 3b 0a  LeafOffset = i;.
d5b0: 20 20 7d 0a 20 20 70 49 74 65 72 2d 3e 69 52 6f    }.  pIter->iRo
d5c0: 77 69 64 4f 66 66 73 65 74 20 3d 20 69 52 6f 77  widOffset = iRow
d5d0: 69 64 4f 66 66 73 65 74 3b 0a 20 20 66 74 73 35  idOffset;.  fts5
d5e0: 53 65 67 49 74 65 72 4c 6f 61 64 4e 50 6f 73 28  SegIterLoadNPos(
d5f0: 70 2c 20 70 49 74 65 72 29 3b 0a 7d 0a 0a 2f 2a  p, pIter);.}../*
d600: 0a 2a 2a 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  .**.*/.static vo
d610: 69 64 20 66 74 73 35 53 65 67 49 74 65 72 52 65  id fts5SegIterRe
d620: 76 65 72 73 65 4e 65 77 50 61 67 65 28 46 74 73  verseNewPage(Fts
d630: 35 49 6e 64 65 78 20 2a 70 2c 20 46 74 73 35 53  5Index *p, Fts5S
d640: 65 67 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a  egIter *pIter){.
d650: 20 20 61 73 73 65 72 74 28 20 70 49 74 65 72 2d    assert( pIter-
d660: 3e 66 6c 61 67 73 20 26 20 46 54 53 35 5f 53 45  >flags & FTS5_SE
d670: 47 49 54 45 52 5f 52 45 56 45 52 53 45 20 29 3b  GITER_REVERSE );
d680: 0a 20 20 61 73 73 65 72 74 28 20 70 49 74 65 72  .  assert( pIter
d690: 2d 3e 66 6c 61 67 73 20 26 20 46 54 53 35 5f 53  ->flags & FTS5_S
d6a0: 45 47 49 54 45 52 5f 4f 4e 45 54 45 52 4d 20 29  EGITER_ONETERM )
d6b0: 3b 0a 0a 20 20 66 74 73 35 44 61 74 61 52 65 6c  ;..  fts5DataRel
d6c0: 65 61 73 65 28 70 49 74 65 72 2d 3e 70 4c 65 61  ease(pIter->pLea
d6d0: 66 29 3b 0a 20 20 70 49 74 65 72 2d 3e 70 4c 65  f);.  pIter->pLe
d6e0: 61 66 20 3d 20 30 3b 0a 20 20 77 68 69 6c 65 28  af = 0;.  while(
d6f0: 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
d700: 4b 20 26 26 20 70 49 74 65 72 2d 3e 69 4c 65 61  K && pIter->iLea
d710: 66 50 67 6e 6f 3e 70 49 74 65 72 2d 3e 69 54 65  fPgno>pIter->iTe
d720: 72 6d 4c 65 61 66 50 67 6e 6f 20 29 7b 0a 20 20  rmLeafPgno ){.  
d730: 20 20 46 74 73 35 44 61 74 61 20 2a 70 4e 65 77    Fts5Data *pNew
d740: 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 69 4c 65  ;.    pIter->iLe
d750: 61 66 50 67 6e 6f 2d 2d 3b 0a 20 20 20 20 70 4e  afPgno--;.    pN
d760: 65 77 20 3d 20 66 74 73 35 44 61 74 61 52 65 61  ew = fts5DataRea
d770: 64 28 70 2c 20 46 54 53 35 5f 53 45 47 4d 45 4e  d(p, FTS5_SEGMEN
d780: 54 5f 52 4f 57 49 44 28 0a 20 20 20 20 20 20 20  T_ROWID(.       
d790: 20 20 20 70 49 74 65 72 2d 3e 70 53 65 67 2d 3e     pIter->pSeg->
d7a0: 69 53 65 67 69 64 2c 20 70 49 74 65 72 2d 3e 69  iSegid, pIter->i
d7b0: 4c 65 61 66 50 67 6e 6f 0a 20 20 20 20 29 29 3b  LeafPgno.    ));
d7c0: 0a 20 20 20 20 69 66 28 20 70 4e 65 77 20 29 7b  .    if( pNew ){
d7d0: 0a 20 20 20 20 20 20 2f 2a 20 69 54 65 72 6d 4c  .      /* iTermL
d7e0: 65 61 66 4f 66 66 73 65 74 20 6d 61 79 20 62 65  eafOffset may be
d7f0: 20 65 71 75 61 6c 20 74 6f 20 73 7a 4c 65 61 66   equal to szLeaf
d800: 20 69 66 20 74 68 65 20 74 65 72 6d 20 69 73 20   if the term is 
d810: 74 68 65 20 6c 61 73 74 0a 20 20 20 20 20 20 2a  the last.      *
d820: 2a 20 74 68 69 6e 67 20 6f 6e 20 74 68 65 20 70  * thing on the p
d830: 61 67 65 20 2d 20 69 2e 65 2e 20 74 68 65 20 66  age - i.e. the f
d840: 69 72 73 74 20 72 6f 77 69 64 20 69 73 20 6f 6e  irst rowid is on
d850: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 70   the following p
d860: 61 67 65 2e 0a 20 20 20 20 20 20 2a 2a 20 49 6e  age..      ** In
d870: 20 74 68 69 73 20 63 61 73 65 20 6c 65 61 76 65   this case leave
d880: 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 3d 3d 30   pIter->pLeaf==0
d890: 2c 20 74 68 69 73 20 69 74 65 72 61 74 6f 72 20  , this iterator 
d8a0: 69 73 20 61 74 20 45 4f 46 2e 20 2a 2f 0a 20 20  is at EOF. */.  
d8b0: 20 20 20 20 69 66 28 20 70 49 74 65 72 2d 3e 69      if( pIter->i
d8c0: 4c 65 61 66 50 67 6e 6f 3d 3d 70 49 74 65 72 2d  LeafPgno==pIter-
d8d0: 3e 69 54 65 72 6d 4c 65 61 66 50 67 6e 6f 20 29  >iTermLeafPgno )
d8e0: 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
d8f0: 28 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 3d 3d  ( pIter->pLeaf==
d900: 30 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  0 );.        if(
d910: 20 70 49 74 65 72 2d 3e 69 54 65 72 6d 4c 65 61   pIter->iTermLea
d920: 66 4f 66 66 73 65 74 3c 70 4e 65 77 2d 3e 73 7a  fOffset<pNew->sz
d930: 4c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 20 20  Leaf ){.        
d940: 20 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 20 3d    pIter->pLeaf =
d950: 20 70 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 20   pNew;.         
d960: 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66   pIter->iLeafOff
d970: 73 65 74 20 3d 20 70 49 74 65 72 2d 3e 69 54 65  set = pIter->iTe
d980: 72 6d 4c 65 61 66 4f 66 66 73 65 74 3b 0a 20 20  rmLeafOffset;.  
d990: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65        }.      }e
d9a0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  lse{.        int
d9b0: 20 69 52 6f 77 69 64 4f 66 66 3b 0a 20 20 20 20   iRowidOff;.    
d9c0: 20 20 20 20 69 52 6f 77 69 64 4f 66 66 20 3d 20      iRowidOff = 
d9d0: 66 74 73 35 4c 65 61 66 46 69 72 73 74 52 6f 77  fts5LeafFirstRow
d9e0: 69 64 4f 66 66 28 70 4e 65 77 29 3b 0a 20 20 20  idOff(pNew);.   
d9f0: 20 20 20 20 20 69 66 28 20 69 52 6f 77 69 64 4f       if( iRowidO
da00: 66 66 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ff ){.          
da10: 70 49 74 65 72 2d 3e 70 4c 65 61 66 20 3d 20 70  pIter->pLeaf = p
da20: 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 20 20 70  New;.          p
da30: 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65  Iter->iLeafOffse
da40: 74 20 3d 20 69 52 6f 77 69 64 4f 66 66 3b 0a 20  t = iRowidOff;. 
da50: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
da60: 0a 0a 20 20 20 20 20 20 69 66 28 20 70 49 74 65  ..      if( pIte
da70: 72 2d 3e 70 4c 65 61 66 20 29 7b 0a 20 20 20 20  r->pLeaf ){.    
da80: 20 20 20 20 75 38 20 2a 61 20 3d 20 26 70 49 74      u8 *a = &pIt
da90: 65 72 2d 3e 70 4c 65 61 66 2d 3e 70 5b 70 49 74  er->pLeaf->p[pIt
daa0: 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 5d  er->iLeafOffset]
dab0: 3b 0a 20 20 20 20 20 20 20 20 70 49 74 65 72 2d  ;.        pIter-
dac0: 3e 69 4c 65 61 66 4f 66 66 73 65 74 20 2b 3d 20  >iLeafOffset += 
dad0: 66 74 73 35 47 65 74 56 61 72 69 6e 74 28 61 2c  fts5GetVarint(a,
dae0: 20 28 75 36 34 2a 29 26 70 49 74 65 72 2d 3e 69   (u64*)&pIter->i
daf0: 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 20 20  Rowid);.        
db00: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 65 6c  break;.      }el
db10: 73 65 7b 0a 20 20 20 20 20 20 20 20 66 74 73 35  se{.        fts5
db20: 44 61 74 61 52 65 6c 65 61 73 65 28 70 4e 65 77  DataRelease(pNew
db30: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
db40: 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 49 74 65  .  }..  if( pIte
db50: 72 2d 3e 70 4c 65 61 66 20 29 7b 0a 20 20 20 20  r->pLeaf ){.    
db60: 70 49 74 65 72 2d 3e 69 45 6e 64 6f 66 44 6f 63  pIter->iEndofDoc
db70: 6c 69 73 74 20 3d 20 70 49 74 65 72 2d 3e 70 4c  list = pIter->pL
db80: 65 61 66 2d 3e 6e 6e 2b 31 3b 0a 20 20 20 20 66  eaf->nn+1;.    f
db90: 74 73 35 53 65 67 49 74 65 72 52 65 76 65 72 73  ts5SegIterRevers
dba0: 65 49 6e 69 74 50 61 67 65 28 70 2c 20 70 49 74  eInitPage(p, pIt
dbb0: 65 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  er);.  }.}../*.*
dbc0: 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66  * Return true if
dbd0: 20 74 68 65 20 69 74 65 72 61 74 6f 72 20 70 61   the iterator pa
dbe0: 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f  ssed as the seco
dbf0: 6e 64 20 61 72 67 75 6d 65 6e 74 20 63 75 72 72  nd argument curr
dc00: 65 6e 74 6c 79 0a 2a 2a 20 70 6f 69 6e 74 73 20  ently.** points 
dc10: 74 6f 20 61 20 64 65 6c 65 74 65 20 6d 61 72 6b  to a delete mark
dc20: 65 72 2e 20 41 20 64 65 6c 65 74 65 20 6d 61 72  er. A delete mar
dc30: 6b 65 72 20 69 73 20 61 6e 20 65 6e 74 72 79 20  ker is an entry 
dc40: 77 69 74 68 20 61 20 30 20 62 79 74 65 0a 2a 2a  with a 0 byte.**
dc50: 20 70 6f 73 69 74 69 6f 6e 2d 6c 69 73 74 2e 0a   position-list..
dc60: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74  */.static int ft
dc70: 73 35 4d 75 6c 74 69 49 74 65 72 49 73 45 6d 70  s5MultiIterIsEmp
dc80: 74 79 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c  ty(Fts5Index *p,
dc90: 20 46 74 73 35 49 6e 64 65 78 49 74 65 72 20 2a   Fts5IndexIter *
dca0: 70 49 74 65 72 29 7b 0a 20 20 46 74 73 35 53 65  pIter){.  Fts5Se
dcb0: 67 49 74 65 72 20 2a 70 53 65 67 20 3d 20 26 70  gIter *pSeg = &p
dcc0: 49 74 65 72 2d 3e 61 53 65 67 5b 70 49 74 65 72  Iter->aSeg[pIter
dcd0: 2d 3e 61 46 69 72 73 74 5b 31 5d 2e 69 46 69 72  ->aFirst[1].iFir
dce0: 73 74 5d 3b 0a 20 20 72 65 74 75 72 6e 20 28 70  st];.  return (p
dcf0: 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
dd00: 26 26 20 70 53 65 67 2d 3e 70 4c 65 61 66 20 26  && pSeg->pLeaf &
dd10: 26 20 70 53 65 67 2d 3e 6e 50 6f 73 3d 3d 30 29  & pSeg->nPos==0)
dd20: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 76 61 6e  ;.}../*.** Advan
dd30: 63 65 20 69 74 65 72 61 74 6f 72 20 70 49 74 65  ce iterator pIte
dd40: 72 20 74 6f 20 74 68 65 20 6e 65 78 74 20 65 6e  r to the next en
dd50: 74 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  try..**.** This 
dd60: 76 65 72 73 69 6f 6e 20 6f 66 20 66 74 73 35 53  version of fts5S
dd70: 65 67 49 74 65 72 4e 65 78 74 28 29 20 69 73 20  egIterNext() is 
dd80: 6f 6e 6c 79 20 75 73 65 64 20 62 79 20 72 65 76  only used by rev
dd90: 65 72 73 65 20 69 74 65 72 61 74 6f 72 73 2e 0a  erse iterators..
dda0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
ddb0: 74 73 35 53 65 67 49 74 65 72 4e 65 78 74 5f 52  ts5SegIterNext_R
ddc0: 65 76 65 72 73 65 28 0a 20 20 46 74 73 35 49 6e  everse(.  Fts5In
ddd0: 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20 20  dex *p,         
dde0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53            /* FTS
ddf0: 35 20 62 61 63 6b 65 6e 64 20 6f 62 6a 65 63 74  5 backend object
de00: 20 2a 2f 0a 20 20 46 74 73 35 53 65 67 49 74 65   */.  Fts5SegIte
de10: 72 20 2a 70 49 74 65 72 2c 20 20 20 20 20 20 20  r *pIter,       
de20: 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74 6f        /* Iterato
de30: 72 20 74 6f 20 61 64 76 61 6e 63 65 20 2a 2f 0a  r to advance */.
de40: 20 20 69 6e 74 20 2a 70 62 4e 65 77 54 65 72 6d    int *pbNewTerm
de50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
de60: 20 20 2f 2a 20 4f 55 54 3a 20 53 65 74 20 66 6f    /* OUT: Set fo
de70: 72 20 6e 65 77 20 74 65 72 6d 20 2a 2f 0a 29 7b  r new term */.){
de80: 0a 20 20 61 73 73 65 72 74 28 20 70 49 74 65 72  .  assert( pIter
de90: 2d 3e 66 6c 61 67 73 20 26 20 46 54 53 35 5f 53  ->flags & FTS5_S
dea0: 45 47 49 54 45 52 5f 52 45 56 45 52 53 45 20 29  EGITER_REVERSE )
deb0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 49 74 65  ;.  assert( pIte
dec0: 72 2d 3e 70 4e 65 78 74 4c 65 61 66 3d 3d 30 20  r->pNextLeaf==0 
ded0: 29 3b 0a 20 20 69 66 28 20 70 49 74 65 72 2d 3e  );.  if( pIter->
dee0: 69 52 6f 77 69 64 4f 66 66 73 65 74 3e 30 20 29  iRowidOffset>0 )
def0: 7b 0a 20 20 20 20 75 38 20 2a 61 20 3d 20 70 49  {.    u8 *a = pI
df00: 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 70 3b 0a 20  ter->pLeaf->p;. 
df10: 20 20 20 69 6e 74 20 69 4f 66 66 3b 0a 20 20 20     int iOff;.   
df20: 20 69 36 34 20 69 44 65 6c 74 61 3b 0a 0a 20 20   i64 iDelta;..  
df30: 20 20 70 49 74 65 72 2d 3e 69 52 6f 77 69 64 4f    pIter->iRowidO
df40: 66 66 73 65 74 2d 2d 3b 0a 20 20 20 20 70 49 74  ffset--;.    pIt
df50: 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 20  er->iLeafOffset 
df60: 3d 20 70 49 74 65 72 2d 3e 61 52 6f 77 69 64 4f  = pIter->aRowidO
df70: 66 66 73 65 74 5b 70 49 74 65 72 2d 3e 69 52 6f  ffset[pIter->iRo
df80: 77 69 64 4f 66 66 73 65 74 5d 3b 0a 20 20 20 20  widOffset];.    
df90: 66 74 73 35 53 65 67 49 74 65 72 4c 6f 61 64 4e  fts5SegIterLoadN
dfa0: 50 6f 73 28 70 2c 20 70 49 74 65 72 29 3b 0a 20  Pos(p, pIter);. 
dfb0: 20 20 20 69 4f 66 66 20 3d 20 70 49 74 65 72 2d     iOff = pIter-
dfc0: 3e 69 4c 65 61 66 4f 66 66 73 65 74 3b 0a 20 20  >iLeafOffset;.  
dfd0: 20 20 69 66 28 20 70 2d 3e 70 43 6f 6e 66 69 67    if( p->pConfig
dfe0: 2d 3e 65 44 65 74 61 69 6c 21 3d 46 54 53 35 5f  ->eDetail!=FTS5_
dff0: 44 45 54 41 49 4c 5f 4e 4f 4e 45 20 29 7b 0a 20  DETAIL_NONE ){. 
e000: 20 20 20 20 20 69 4f 66 66 20 2b 3d 20 70 49 74       iOff += pIt
e010: 65 72 2d 3e 6e 50 6f 73 3b 0a 20 20 20 20 7d 0a  er->nPos;.    }.
e020: 20 20 20 20 66 74 73 35 47 65 74 56 61 72 69 6e      fts5GetVarin
e030: 74 28 26 61 5b 69 4f 66 66 5d 2c 20 28 75 36 34  t(&a[iOff], (u64
e040: 2a 29 26 69 44 65 6c 74 61 29 3b 0a 20 20 20 20  *)&iDelta);.    
e050: 70 49 74 65 72 2d 3e 69 52 6f 77 69 64 20 2d 3d  pIter->iRowid -=
e060: 20 69 44 65 6c 74 61 3b 0a 20 20 7d 65 6c 73 65   iDelta;.  }else
e070: 7b 0a 20 20 20 20 66 74 73 35 53 65 67 49 74 65  {.    fts5SegIte
e080: 72 52 65 76 65 72 73 65 4e 65 77 50 61 67 65 28  rReverseNewPage(
e090: 70 2c 20 70 49 74 65 72 29 3b 0a 20 20 7d 0a 7d  p, pIter);.  }.}
e0a0: 0a 0a 2f 2a 0a 2a 2a 20 41 64 76 61 6e 63 65 20  ../*.** Advance 
e0b0: 69 74 65 72 61 74 6f 72 20 70 49 74 65 72 20 74  iterator pIter t
e0c0: 6f 20 74 68 65 20 6e 65 78 74 20 65 6e 74 72 79  o the next entry
e0d0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 76 65 72  ..**.** This ver
e0e0: 73 69 6f 6e 20 6f 66 20 66 74 73 35 53 65 67 49  sion of fts5SegI
e0f0: 74 65 72 4e 65 78 74 28 29 20 69 73 20 6f 6e 6c  terNext() is onl
e100: 79 20 75 73 65 64 20 69 66 20 64 65 74 61 69 6c  y used if detail
e110: 3d 6e 6f 6e 65 20 61 6e 64 20 74 68 65 0a 2a 2a  =none and the.**
e120: 20 69 74 65 72 61 74 6f 72 20 69 73 20 6e 6f 74   iterator is not
e130: 20 61 20 72 65 76 65 72 73 65 20 64 69 72 65 63   a reverse direc
e140: 74 69 6f 6e 20 69 74 65 72 61 74 6f 72 2e 0a 2a  tion iterator..*
e150: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  /.static void ft
e160: 73 35 53 65 67 49 74 65 72 4e 65 78 74 5f 4e 6f  s5SegIterNext_No
e170: 6e 65 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20  ne(.  Fts5Index 
e180: 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  *p,             
e190: 20 20 20 20 20 20 2f 2a 20 46 54 53 35 20 62 61        /* FTS5 ba
e1a0: 63 6b 65 6e 64 20 6f 62 6a 65 63 74 20 2a 2f 0a  ckend object */.
e1b0: 20 20 46 74 73 35 53 65 67 49 74 65 72 20 2a 70    Fts5SegIter *p
e1c0: 49 74 65 72 2c 20 20 20 20 20 20 20 20 20 20 20  Iter,           
e1d0: 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 74 6f    /* Iterator to
e1e0: 20 61 64 76 61 6e 63 65 20 2a 2f 0a 20 20 69 6e   advance */.  in
e1f0: 74 20 2a 70 62 4e 65 77 54 65 72 6d 20 20 20 20  t *pbNewTerm    
e200: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
e210: 20 4f 55 54 3a 20 53 65 74 20 66 6f 72 20 6e 65   OUT: Set for ne
e220: 77 20 74 65 72 6d 20 2a 2f 0a 29 7b 0a 20 20 69  w term */.){.  i
e230: 6e 74 20 69 4f 66 66 3b 0a 0a 20 20 61 73 73 65  nt iOff;..  asse
e240: 72 74 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  rt( p->rc==SQLIT
e250: 45 5f 4f 4b 20 29 3b 0a 20 20 61 73 73 65 72 74  E_OK );.  assert
e260: 28 20 28 70 49 74 65 72 2d 3e 66 6c 61 67 73 20  ( (pIter->flags 
e270: 26 20 46 54 53 35 5f 53 45 47 49 54 45 52 5f 52  & FTS5_SEGITER_R
e280: 45 56 45 52 53 45 29 3d 3d 30 20 29 3b 0a 20 20  EVERSE)==0 );.  
e290: 61 73 73 65 72 74 28 20 70 2d 3e 70 43 6f 6e 66  assert( p->pConf
e2a0: 69 67 2d 3e 65 44 65 74 61 69 6c 3d 3d 46 54 53  ig->eDetail==FTS
e2b0: 35 5f 44 45 54 41 49 4c 5f 4e 4f 4e 45 20 29 3b  5_DETAIL_NONE );
e2c0: 0a 0a 20 20 41 53 53 45 52 54 5f 53 5a 4c 45 41  ..  ASSERT_SZLEA
e2d0: 46 5f 4f 4b 28 70 49 74 65 72 2d 3e 70 4c 65 61  F_OK(pIter->pLea
e2e0: 66 29 3b 0a 20 20 69 4f 66 66 20 3d 20 70 49 74  f);.  iOff = pIt
e2f0: 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 3b  er->iLeafOffset;
e300: 0a 0a 20 20 2f 2a 20 4e 65 78 74 20 65 6e 74 72  ..  /* Next entr
e310: 79 20 69 73 20 6f 6e 20 74 68 65 20 6e 65 78 74  y is on the next
e320: 20 70 61 67 65 20 2a 2f 0a 20 20 69 66 28 20 70   page */.  if( p
e330: 49 74 65 72 2d 3e 70 53 65 67 20 26 26 20 69 4f  Iter->pSeg && iO
e340: 66 66 3e 3d 70 49 74 65 72 2d 3e 70 4c 65 61 66  ff>=pIter->pLeaf
e350: 2d 3e 73 7a 4c 65 61 66 20 29 7b 0a 20 20 20 20  ->szLeaf ){.    
e360: 66 74 73 35 53 65 67 49 74 65 72 4e 65 78 74 50  fts5SegIterNextP
e370: 61 67 65 28 70 2c 20 70 49 74 65 72 29 3b 0a 20  age(p, pIter);. 
e380: 20 20 20 69 66 28 20 70 2d 3e 72 63 20 7c 7c 20     if( p->rc || 
e390: 70 49 74 65 72 2d 3e 70 4c 65 61 66 3d 3d 30 20  pIter->pLeaf==0 
e3a0: 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 70 49  ) return;.    pI
e3b0: 74 65 72 2d 3e 69 52 6f 77 69 64 20 3d 20 30 3b  ter->iRowid = 0;
e3c0: 0a 20 20 20 20 69 4f 66 66 20 3d 20 34 3b 0a 20  .    iOff = 4;. 
e3d0: 20 7d 0a 0a 20 20 69 66 28 20 69 4f 66 66 3c 70   }..  if( iOff<p
e3e0: 49 74 65 72 2d 3e 69 45 6e 64 6f 66 44 6f 63 6c  Iter->iEndofDocl
e3f0: 69 73 74 20 29 7b 0a 20 20 20 20 2f 2a 20 4e 65  ist ){.    /* Ne
e400: 78 74 20 65 6e 74 72 79 20 69 73 20 6f 6e 20 74  xt entry is on t
e410: 68 65 20 63 75 72 72 65 6e 74 20 70 61 67 65 20  he current page 
e420: 2a 2f 0a 20 20 20 20 69 36 34 20 69 44 65 6c 74  */.    i64 iDelt
e430: 61 3b 0a 20 20 20 20 69 4f 66 66 20 2b 3d 20 73  a;.    iOff += s
e440: 71 6c 69 74 65 33 46 74 73 35 47 65 74 56 61 72  qlite3Fts5GetVar
e450: 69 6e 74 28 26 70 49 74 65 72 2d 3e 70 4c 65 61  int(&pIter->pLea
e460: 66 2d 3e 70 5b 69 4f 66 66 5d 2c 20 28 75 36 34  f->p[iOff], (u64
e470: 2a 29 26 69 44 65 6c 74 61 29 3b 0a 20 20 20 20  *)&iDelta);.    
e480: 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73  pIter->iLeafOffs
e490: 65 74 20 3d 20 69 4f 66 66 3b 0a 20 20 20 20 70  et = iOff;.    p
e4a0: 49 74 65 72 2d 3e 69 52 6f 77 69 64 20 2b 3d 20  Iter->iRowid += 
e4b0: 69 44 65 6c 74 61 3b 0a 20 20 7d 65 6c 73 65 20  iDelta;.  }else 
e4c0: 69 66 28 20 28 70 49 74 65 72 2d 3e 66 6c 61 67  if( (pIter->flag
e4d0: 73 20 26 20 46 54 53 35 5f 53 45 47 49 54 45 52  s & FTS5_SEGITER
e4e0: 5f 4f 4e 45 54 45 52 4d 29 3d 3d 30 20 29 7b 0a  _ONETERM)==0 ){.
e4f0: 20 20 20 20 69 66 28 20 70 49 74 65 72 2d 3e 70      if( pIter->p
e500: 53 65 67 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  Seg ){.      int
e510: 20 6e 4b 65 65 70 20 3d 20 30 3b 0a 20 20 20 20   nKeep = 0;.    
e520: 20 20 69 66 28 20 69 4f 66 66 21 3d 66 74 73 35    if( iOff!=fts5
e530: 4c 65 61 66 46 69 72 73 74 54 65 72 6d 4f 66 66  LeafFirstTermOff
e540: 28 70 49 74 65 72 2d 3e 70 4c 65 61 66 29 20 29  (pIter->pLeaf) )
e550: 7b 0a 20 20 20 20 20 20 20 20 69 4f 66 66 20 2b  {.        iOff +
e560: 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e 74 33  = fts5GetVarint3
e570: 32 28 26 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d  2(&pIter->pLeaf-
e580: 3e 70 5b 69 4f 66 66 5d 2c 20 6e 4b 65 65 70 29  >p[iOff], nKeep)
e590: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
e5a0: 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73  pIter->iLeafOffs
e5b0: 65 74 20 3d 20 69 4f 66 66 3b 0a 20 20 20 20 20  et = iOff;.     
e5c0: 20 66 74 73 35 53 65 67 49 74 65 72 4c 6f 61 64   fts5SegIterLoad
e5d0: 54 65 72 6d 28 70 2c 20 70 49 74 65 72 2c 20 6e  Term(p, pIter, n
e5e0: 4b 65 65 70 29 3b 0a 20 20 20 20 7d 65 6c 73 65  Keep);.    }else
e5f0: 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 75 38  {.      const u8
e600: 20 2a 70 4c 69 73 74 20 3d 20 30 3b 0a 20 20 20   *pList = 0;.   
e610: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
e620: 54 65 72 6d 20 3d 20 30 3b 0a 20 20 20 20 20 20  Term = 0;.      
e630: 69 6e 74 20 6e 4c 69 73 74 3b 0a 20 20 20 20 20  int nList;.     
e640: 20 73 71 6c 69 74 65 33 46 74 73 35 48 61 73 68   sqlite3Fts5Hash
e650: 53 63 61 6e 4e 65 78 74 28 70 2d 3e 70 48 61 73  ScanNext(p->pHas
e660: 68 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  h);.      sqlite
e670: 33 46 74 73 35 48 61 73 68 53 63 61 6e 45 6e 74  3Fts5HashScanEnt
e680: 72 79 28 70 2d 3e 70 48 61 73 68 2c 20 26 7a 54  ry(p->pHash, &zT
e690: 65 72 6d 2c 20 26 70 4c 69 73 74 2c 20 26 6e 4c  erm, &pList, &nL
e6a0: 69 73 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ist);.      if( 
e6b0: 70 4c 69 73 74 3d 3d 30 20 29 20 67 6f 74 6f 20  pList==0 ) goto 
e6c0: 6e 65 78 74 5f 6e 6f 6e 65 5f 65 6f 66 3b 0a 20  next_none_eof;. 
e6d0: 20 20 20 20 20 70 49 74 65 72 2d 3e 70 4c 65 61       pIter->pLea
e6e0: 66 2d 3e 70 20 3d 20 28 75 38 2a 29 70 4c 69 73  f->p = (u8*)pLis
e6f0: 74 3b 0a 20 20 20 20 20 20 70 49 74 65 72 2d 3e  t;.      pIter->
e700: 70 4c 65 61 66 2d 3e 6e 6e 20 3d 20 6e 4c 69 73  pLeaf->nn = nLis
e710: 74 3b 0a 20 20 20 20 20 20 70 49 74 65 72 2d 3e  t;.      pIter->
e720: 70 4c 65 61 66 2d 3e 73 7a 4c 65 61 66 20 3d 20  pLeaf->szLeaf = 
e730: 6e 4c 69 73 74 3b 0a 20 20 20 20 20 20 70 49 74  nList;.      pIt
e740: 65 72 2d 3e 69 45 6e 64 6f 66 44 6f 63 6c 69 73  er->iEndofDoclis
e750: 74 20 3d 20 6e 4c 69 73 74 3b 0a 20 20 20 20 20  t = nList;.     
e760: 20 73 71 6c 69 74 65 33 46 74 73 35 42 75 66 66   sqlite3Fts5Buff
e770: 65 72 53 65 74 28 26 70 2d 3e 72 63 2c 26 70 49  erSet(&p->rc,&pI
e780: 74 65 72 2d 3e 74 65 72 6d 2c 20 28 69 6e 74 29  ter->term, (int)
e790: 73 74 72 6c 65 6e 28 7a 54 65 72 6d 29 2c 20 28  strlen(zTerm), (
e7a0: 75 38 2a 29 7a 54 65 72 6d 29 3b 0a 20 20 20 20  u8*)zTerm);.    
e7b0: 20 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66    pIter->iLeafOf
e7c0: 66 73 65 74 20 3d 20 66 74 73 35 47 65 74 56 61  fset = fts5GetVa
e7d0: 72 69 6e 74 28 70 4c 69 73 74 2c 20 28 75 36 34  rint(pList, (u64
e7e0: 2a 29 26 70 49 74 65 72 2d 3e 69 52 6f 77 69 64  *)&pIter->iRowid
e7f0: 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66  );.    }..    if
e800: 28 20 70 62 4e 65 77 54 65 72 6d 20 29 20 2a 70  ( pbNewTerm ) *p
e810: 62 4e 65 77 54 65 72 6d 20 3d 20 31 3b 0a 20 20  bNewTerm = 1;.  
e820: 7d 65 6c 73 65 7b 0a 20 20 20 20 67 6f 74 6f 20  }else{.    goto 
e830: 6e 65 78 74 5f 6e 6f 6e 65 5f 65 6f 66 3b 0a 20  next_none_eof;. 
e840: 20 7d 0a 0a 20 20 66 74 73 35 53 65 67 49 74 65   }..  fts5SegIte
e850: 72 4c 6f 61 64 4e 50 6f 73 28 70 2c 20 70 49 74  rLoadNPos(p, pIt
e860: 65 72 29 3b 0a 0a 20 20 72 65 74 75 72 6e 3b 0a  er);..  return;.
e870: 20 6e 65 78 74 5f 6e 6f 6e 65 5f 65 6f 66 3a 0a   next_none_eof:.
e880: 20 20 66 74 73 35 44 61 74 61 52 65 6c 65 61 73    fts5DataReleas
e890: 65 28 70 49 74 65 72 2d 3e 70 4c 65 61 66 29 3b  e(pIter->pLeaf);
e8a0: 0a 20 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 20  .  pIter->pLeaf 
e8b0: 3d 20 30 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 41  = 0;.}.../*.** A
e8c0: 64 76 61 6e 63 65 20 69 74 65 72 61 74 6f 72 20  dvance iterator 
e8d0: 70 49 74 65 72 20 74 6f 20 74 68 65 20 6e 65 78  pIter to the nex
e8e0: 74 20 65 6e 74 72 79 2e 20 0a 2a 2a 0a 2a 2a 20  t entry. .**.** 
e8f0: 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
e900: 72 73 2c 20 46 74 73 35 49 6e 64 65 78 2e 72 63  rs, Fts5Index.rc
e910: 20 69 73 20 73 65 74 20 74 6f 20 61 6e 20 61 70   is set to an ap
e920: 70 72 6f 70 72 69 61 74 65 20 65 72 72 6f 72 20  propriate error 
e930: 63 6f 64 65 2e 20 49 74 20 0a 2a 2a 20 69 73 20  code. It .** is 
e940: 6e 6f 74 20 63 6f 6e 73 69 64 65 72 65 64 20 61  not considered a
e950: 6e 20 65 72 72 6f 72 20 69 66 20 74 68 65 20 69  n error if the i
e960: 74 65 72 61 74 6f 72 20 72 65 61 63 68 65 73 20  terator reaches 
e970: 45 4f 46 2e 20 49 66 20 61 6e 20 65 72 72 6f 72  EOF. If an error
e980: 20 68 61 73 20 0a 2a 2a 20 61 6c 72 65 61 64 79   has .** already
e990: 20 6f 63 63 75 72 72 65 64 20 77 68 65 6e 20 74   occurred when t
e9a0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
e9b0: 63 61 6c 6c 65 64 2c 20 69 74 20 69 73 20 61 20  called, it is a 
e9c0: 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63  no-op..*/.static
e9d0: 20 76 6f 69 64 20 66 74 73 35 53 65 67 49 74 65   void fts5SegIte
e9e0: 72 4e 65 78 74 28 0a 20 20 46 74 73 35 49 6e 64  rNext(.  Fts5Ind
e9f0: 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  ex *p,          
ea00: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53 35           /* FTS5
ea10: 20 62 61 63 6b 65 6e 64 20 6f 62 6a 65 63 74 20   backend object 
ea20: 2a 2f 0a 20 20 46 74 73 35 53 65 67 49 74 65 72  */.  Fts5SegIter
ea30: 20 2a 70 49 74 65 72 2c 20 20 20 20 20 20 20 20   *pIter,        
ea40: 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72       /* Iterator
ea50: 20 74 6f 20 61 64 76 61 6e 63 65 20 2a 2f 0a 20   to advance */. 
ea60: 20 69 6e 74 20 2a 70 62 4e 65 77 54 65 72 6d 20   int *pbNewTerm 
ea70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ea80: 20 2f 2a 20 4f 55 54 3a 20 53 65 74 20 66 6f 72   /* OUT: Set for
ea90: 20 6e 65 77 20 74 65 72 6d 20 2a 2f 0a 29 7b 0a   new term */.){.
eaa0: 20 20 46 74 73 35 44 61 74 61 20 2a 70 4c 65 61    Fts5Data *pLea
eab0: 66 20 3d 20 70 49 74 65 72 2d 3e 70 4c 65 61 66  f = pIter->pLeaf
eac0: 3b 0a 20 20 69 6e 74 20 69 4f 66 66 3b 0a 20 20  ;.  int iOff;.  
ead0: 69 6e 74 20 62 4e 65 77 54 65 72 6d 20 3d 20 30  int bNewTerm = 0
eae0: 3b 0a 20 20 69 6e 74 20 6e 4b 65 65 70 20 3d 20  ;.  int nKeep = 
eaf0: 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 62  0;..  assert( pb
eb00: 4e 65 77 54 65 72 6d 3d 3d 30 20 7c 7c 20 2a 70  NewTerm==0 || *p
eb10: 62 4e 65 77 54 65 72 6d 3d 3d 30 20 29 3b 0a 20  bNewTerm==0 );. 
eb20: 20 61 73 73 65 72 74 28 20 70 2d 3e 70 43 6f 6e   assert( p->pCon
eb30: 66 69 67 2d 3e 65 44 65 74 61 69 6c 21 3d 46 54  fig->eDetail!=FT
eb40: 53 35 5f 44 45 54 41 49 4c 5f 4e 4f 4e 45 20 29  S5_DETAIL_NONE )
eb50: 3b 0a 0a 20 20 2f 2a 20 53 65 61 72 63 68 20 66  ;..  /* Search f
eb60: 6f 72 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  or the end of th
eb70: 65 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74 20  e position list 
eb80: 77 69 74 68 69 6e 20 74 68 65 20 63 75 72 72 65  within the curre
eb90: 6e 74 20 70 61 67 65 2e 20 2a 2f 0a 20 20 75 38  nt page. */.  u8
eba0: 20 2a 61 20 3d 20 70 4c 65 61 66 2d 3e 70 3b 0a   *a = pLeaf->p;.
ebb0: 20 20 69 6e 74 20 6e 20 3d 20 70 4c 65 61 66 2d    int n = pLeaf-
ebc0: 3e 73 7a 4c 65 61 66 3b 0a 0a 20 20 41 53 53 45  >szLeaf;..  ASSE
ebd0: 52 54 5f 53 5a 4c 45 41 46 5f 4f 4b 28 70 4c 65  RT_SZLEAF_OK(pLe
ebe0: 61 66 29 3b 0a 20 20 69 4f 66 66 20 3d 20 70 49  af);.  iOff = pI
ebf0: 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74  ter->iLeafOffset
ec00: 20 2b 20 70 49 74 65 72 2d 3e 6e 50 6f 73 3b 0a   + pIter->nPos;.
ec10: 0a 20 20 69 66 28 20 69 4f 66 66 3c 6e 20 29 7b  .  if( iOff<n ){
ec20: 0a 20 20 20 20 2f 2a 20 54 68 65 20 6e 65 78 74  .    /* The next
ec30: 20 65 6e 74 72 79 20 69 73 20 6f 6e 20 74 68 65   entry is on the
ec40: 20 63 75 72 72 65 6e 74 20 70 61 67 65 2e 20 2a   current page. *
ec50: 2f 0a 20 20 20 20 61 73 73 65 72 74 5f 6e 63 28  /.    assert_nc(
ec60: 20 69 4f 66 66 3c 3d 70 49 74 65 72 2d 3e 69 45   iOff<=pIter->iE
ec70: 6e 64 6f 66 44 6f 63 6c 69 73 74 20 29 3b 0a 20  ndofDoclist );. 
ec80: 20 20 20 69 66 28 20 69 4f 66 66 3e 3d 70 49 74     if( iOff>=pIt
ec90: 65 72 2d 3e 69 45 6e 64 6f 66 44 6f 63 6c 69 73  er->iEndofDoclis
eca0: 74 20 29 7b 0a 20 20 20 20 20 20 62 4e 65 77 54  t ){.      bNewT
ecb0: 65 72 6d 20 3d 20 31 3b 0a 20 20 20 20 20 20 69  erm = 1;.      i
ecc0: 66 28 20 69 4f 66 66 21 3d 66 74 73 35 4c 65 61  f( iOff!=fts5Lea
ecd0: 66 46 69 72 73 74 54 65 72 6d 4f 66 66 28 70 4c  fFirstTermOff(pL
ece0: 65 61 66 29 20 29 7b 0a 20 20 20 20 20 20 20 20  eaf) ){.        
ecf0: 69 4f 66 66 20 2b 3d 20 66 74 73 35 47 65 74 56  iOff += fts5GetV
ed00: 61 72 69 6e 74 33 32 28 26 61 5b 69 4f 66 66 5d  arint32(&a[iOff]
ed10: 2c 20 6e 4b 65 65 70 29 3b 0a 20 20 20 20 20 20  , nKeep);.      
ed20: 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  }.    }else{.   
ed30: 20 20 20 75 36 34 20 69 44 65 6c 74 61 3b 0a 20     u64 iDelta;. 
ed40: 20 20 20 20 20 69 4f 66 66 20 2b 3d 20 73 71 6c       iOff += sql
ed50: 69 74 65 33 46 74 73 35 47 65 74 56 61 72 69 6e  ite3Fts5GetVarin
ed60: 74 28 26 61 5b 69 4f 66 66 5d 2c 20 26 69 44 65  t(&a[iOff], &iDe
ed70: 6c 74 61 29 3b 0a 20 20 20 20 20 20 70 49 74 65  lta);.      pIte
ed80: 72 2d 3e 69 52 6f 77 69 64 20 2b 3d 20 69 44 65  r->iRowid += iDe
ed90: 6c 74 61 3b 0a 20 20 20 20 20 20 61 73 73 65 72  lta;.      asser
eda0: 74 5f 6e 63 28 20 69 44 65 6c 74 61 3e 30 20 29  t_nc( iDelta>0 )
edb0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 49 74 65  ;.    }.    pIte
edc0: 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 20 3d  r->iLeafOffset =
edd0: 20 69 4f 66 66 3b 0a 0a 20 20 7d 65 6c 73 65 20   iOff;..  }else 
ede0: 69 66 28 20 70 49 74 65 72 2d 3e 70 53 65 67 3d  if( pIter->pSeg=
edf0: 3d 30 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20  =0 ){.    const 
ee00: 75 38 20 2a 70 4c 69 73 74 20 3d 20 30 3b 0a 20  u8 *pList = 0;. 
ee10: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
ee20: 54 65 72 6d 20 3d 20 30 3b 0a 20 20 20 20 69 6e  Term = 0;.    in
ee30: 74 20 6e 4c 69 73 74 20 3d 20 30 3b 0a 20 20 20  t nList = 0;.   
ee40: 20 61 73 73 65 72 74 28 20 28 70 49 74 65 72 2d   assert( (pIter-
ee50: 3e 66 6c 61 67 73 20 26 20 46 54 53 35 5f 53 45  >flags & FTS5_SE
ee60: 47 49 54 45 52 5f 4f 4e 45 54 45 52 4d 29 20 7c  GITER_ONETERM) |
ee70: 7c 20 70 62 4e 65 77 54 65 72 6d 20 29 3b 0a 20  | pbNewTerm );. 
ee80: 20 20 20 69 66 28 20 30 3d 3d 28 70 49 74 65 72     if( 0==(pIter
ee90: 2d 3e 66 6c 61 67 73 20 26 20 46 54 53 35 5f 53  ->flags & FTS5_S
eea0: 45 47 49 54 45 52 5f 4f 4e 45 54 45 52 4d 29 20  EGITER_ONETERM) 
eeb0: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
eec0: 46 74 73 35 48 61 73 68 53 63 61 6e 4e 65 78 74  Fts5HashScanNext
eed0: 28 70 2d 3e 70 48 61 73 68 29 3b 0a 20 20 20 20  (p->pHash);.    
eee0: 20 20 73 71 6c 69 74 65 33 46 74 73 35 48 61 73    sqlite3Fts5Has
eef0: 68 53 63 61 6e 45 6e 74 72 79 28 70 2d 3e 70 48  hScanEntry(p->pH
ef00: 61 73 68 2c 20 26 7a 54 65 72 6d 2c 20 26 70 4c  ash, &zTerm, &pL
ef10: 69 73 74 2c 20 26 6e 4c 69 73 74 29 3b 0a 20 20  ist, &nList);.  
ef20: 20 20 7d 0a 20 20 20 20 69 66 28 20 70 4c 69 73    }.    if( pLis
ef30: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 66 74  t==0 ){.      ft
ef40: 73 35 44 61 74 61 52 65 6c 65 61 73 65 28 70 49  s5DataRelease(pI
ef50: 74 65 72 2d 3e 70 4c 65 61 66 29 3b 0a 20 20 20  ter->pLeaf);.   
ef60: 20 20 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 20     pIter->pLeaf 
ef70: 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  = 0;.    }else{.
ef80: 20 20 20 20 20 20 70 49 74 65 72 2d 3e 70 4c 65        pIter->pLe
ef90: 61 66 2d 3e 70 20 3d 20 28 75 38 2a 29 70 4c 69  af->p = (u8*)pLi
efa0: 73 74 3b 0a 20 20 20 20 20 20 70 49 74 65 72 2d  st;.      pIter-
efb0: 3e 70 4c 65 61 66 2d 3e 6e 6e 20 3d 20 6e 4c 69  >pLeaf->nn = nLi
efc0: 73 74 3b 0a 20 20 20 20 20 20 70 49 74 65 72 2d  st;.      pIter-
efd0: 3e 70 4c 65 61 66 2d 3e 73 7a 4c 65 61 66 20 3d  >pLeaf->szLeaf =
efe0: 20 6e 4c 69 73 74 3b 0a 20 20 20 20 20 20 70 49   nList;.      pI
eff0: 74 65 72 2d 3e 69 45 6e 64 6f 66 44 6f 63 6c 69  ter->iEndofDocli
f000: 73 74 20 3d 20 6e 4c 69 73 74 2b 31 3b 0a 20 20  st = nList+1;.  
f010: 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 42      sqlite3Fts5B
f020: 75 66 66 65 72 53 65 74 28 26 70 2d 3e 72 63 2c  ufferSet(&p->rc,
f030: 20 26 70 49 74 65 72 2d 3e 74 65 72 6d 2c 20 28   &pIter->term, (
f040: 69 6e 74 29 73 74 72 6c 65 6e 28 7a 54 65 72 6d  int)strlen(zTerm
f050: 29 2c 0a 20 20 20 20 20 20 20 20 20 20 28 75 38  ),.          (u8
f060: 2a 29 7a 54 65 72 6d 29 3b 0a 20 20 20 20 20 20  *)zTerm);.      
f070: 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73  pIter->iLeafOffs
f080: 65 74 20 3d 20 66 74 73 35 47 65 74 56 61 72 69  et = fts5GetVari
f090: 6e 74 28 70 4c 69 73 74 2c 20 28 75 36 34 2a 29  nt(pList, (u64*)
f0a0: 26 70 49 74 65 72 2d 3e 69 52 6f 77 69 64 29 3b  &pIter->iRowid);
f0b0: 0a 20 20 20 20 20 20 2a 70 62 4e 65 77 54 65 72  .      *pbNewTer
f0c0: 6d 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d  m = 1;.    }.  }
f0d0: 65 6c 73 65 7b 0a 20 20 20 20 69 4f 66 66 20 3d  else{.    iOff =
f0e0: 20 30 3b 0a 20 20 20 20 2f 2a 20 4e 65 78 74 20   0;.    /* Next 
f0f0: 65 6e 74 72 79 20 69 73 20 6e 6f 74 20 6f 6e 20  entry is not on 
f100: 74 68 65 20 63 75 72 72 65 6e 74 20 70 61 67 65  the current page
f110: 20 2a 2f 0a 20 20 20 20 77 68 69 6c 65 28 20 69   */.    while( i
f120: 4f 66 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Off==0 ){.      
f130: 66 74 73 35 53 65 67 49 74 65 72 4e 65 78 74 50  fts5SegIterNextP
f140: 61 67 65 28 70 2c 20 70 49 74 65 72 29 3b 0a 20  age(p, pIter);. 
f150: 20 20 20 20 20 70 4c 65 61 66 20 3d 20 70 49 74       pLeaf = pIt
f160: 65 72 2d 3e 70 4c 65 61 66 3b 0a 20 20 20 20 20  er->pLeaf;.     
f170: 20 69 66 28 20 70 4c 65 61 66 3d 3d 30 20 29 20   if( pLeaf==0 ) 
f180: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 41 53 53  break;.      ASS
f190: 45 52 54 5f 53 5a 4c 45 41 46 5f 4f 4b 28 70 4c  ERT_SZLEAF_OK(pL
f1a0: 65 61 66 29 3b 0a 20 20 20 20 20 20 69 66 28 20  eaf);.      if( 
f1b0: 28 69 4f 66 66 20 3d 20 66 74 73 35 4c 65 61 66  (iOff = fts5Leaf
f1c0: 46 69 72 73 74 52 6f 77 69 64 4f 66 66 28 70 4c  FirstRowidOff(pL
f1d0: 65 61 66 29 29 20 26 26 20 69 4f 66 66 3c 70 4c  eaf)) && iOff<pL
f1e0: 65 61 66 2d 3e 73 7a 4c 65 61 66 20 29 7b 0a 20  eaf->szLeaf ){. 
f1f0: 20 20 20 20 20 20 20 69 4f 66 66 20 2b 3d 20 73         iOff += s
f200: 71 6c 69 74 65 33 46 74 73 35 47 65 74 56 61 72  qlite3Fts5GetVar
f210: 69 6e 74 28 26 70 4c 65 61 66 2d 3e 70 5b 69 4f  int(&pLeaf->p[iO
f220: 66 66 5d 2c 20 28 75 36 34 2a 29 26 70 49 74 65  ff], (u64*)&pIte
f230: 72 2d 3e 69 52 6f 77 69 64 29 3b 0a 20 20 20 20  r->iRowid);.    
f240: 20 20 20 20 70 49 74 65 72 2d 3e 69 4c 65 61 66      pIter->iLeaf
f250: 4f 66 66 73 65 74 20 3d 20 69 4f 66 66 3b 0a 0a  Offset = iOff;..
f260: 20 20 20 20 20 20 20 20 69 66 28 20 70 4c 65 61          if( pLea
f270: 66 2d 3e 6e 6e 3e 70 4c 65 61 66 2d 3e 73 7a 4c  f->nn>pLeaf->szL
f280: 65 61 66 20 29 7b 0a 20 20 20 20 20 20 20 20 20  eaf ){.         
f290: 20 70 49 74 65 72 2d 3e 69 50 67 69 64 78 4f 66   pIter->iPgidxOf
f2a0: 66 20 3d 20 70 4c 65 61 66 2d 3e 73 7a 4c 65 61  f = pLeaf->szLea
f2b0: 66 20 2b 20 66 74 73 35 47 65 74 56 61 72 69 6e  f + fts5GetVarin
f2c0: 74 33 32 28 0a 20 20 20 20 20 20 20 20 20 20 20  t32(.           
f2d0: 20 20 20 26 70 4c 65 61 66 2d 3e 70 5b 70 4c 65     &pLeaf->p[pLe
f2e0: 61 66 2d 3e 73 7a 4c 65 61 66 5d 2c 20 70 49 74  af->szLeaf], pIt
f2f0: 65 72 2d 3e 69 45 6e 64 6f 66 44 6f 63 6c 69 73  er->iEndofDoclis
f300: 74 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t.              
f310: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20  );.        }..  
f320: 20 20 20 20 7d 0a 20 20 20 20 20 20 65 6c 73 65      }.      else
f330: 20 69 66 28 20 70 4c 65 61 66 2d 3e 6e 6e 3e 70   if( pLeaf->nn>p
f340: 4c 65 61 66 2d 3e 73 7a 4c 65 61 66 20 29 7b 0a  Leaf->szLeaf ){.
f350: 20 20 20 20 20 20 20 20 70 49 74 65 72 2d 3e 69          pIter->i
f360: 50 67 69 64 78 4f 66 66 20 3d 20 70 4c 65 61 66  PgidxOff = pLeaf
f370: 2d 3e 73 7a 4c 65 61 66 20 2b 20 66 74 73 35 47  ->szLeaf + fts5G
f380: 65 74 56 61 72 69 6e 74 33 32 28 0a 20 20 20 20  etVarint32(.    
f390: 20 20 20 20 20 20 20 20 26 70 4c 65 61 66 2d 3e          &pLeaf->
f3a0: 70 5b 70 4c 65 61 66 2d 3e 73 7a 4c 65 61 66 5d  p[pLeaf->szLeaf]
f3b0: 2c 20 69 4f 66 66 0a 20 20 20 20 20 20 20 20 20  , iOff.         
f3c0: 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 70 49     );.        pI
f3d0: 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74  ter->iLeafOffset
f3e0: 20 3d 20 69 4f 66 66 3b 0a 20 20 20 20 20 20 20   = iOff;.       
f3f0: 20 70 49 74 65 72 2d 3e 69 45 6e 64 6f 66 44 6f   pIter->iEndofDo
f400: 63 6c 69 73 74 20 3d 20 69 4f 66 66 3b 0a 20 20  clist = iOff;.  
f410: 20 20 20 20 20 20 62 4e 65 77 54 65 72 6d 20 3d        bNewTerm =
f420: 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   1;.      }.    
f430: 20 20 61 73 73 65 72 74 5f 6e 63 28 20 69 4f 66    assert_nc( iOf
f440: 66 3c 70 4c 65 61 66 2d 3e 73 7a 4c 65 61 66 20  f<pLeaf->szLeaf 
f450: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69 4f 66  );.      if( iOf
f460: 66 3e 70 4c 65 61 66 2d 3e 73 7a 4c 65 61 66 20  f>pLeaf->szLeaf 
f470: 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 72 63  ){.        p->rc
f480: 20 3d 20 46 54 53 35 5f 43 4f 52 52 55 50 54 3b   = FTS5_CORRUPT;
f490: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 3b  .        return;
f4a0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
f4b0: 20 7d 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69   }..  /* Check i
f4c0: 66 20 74 68 65 20 69 74 65 72 61 74 6f 72 20 69  f the iterator i
f4d0: 73 20 6e 6f 77 20 61 74 20 45 4f 46 2e 20 49 66  s now at EOF. If
f4e0: 20 73 6f 2c 20 72 65 74 75 72 6e 20 65 61 72 6c   so, return earl
f4f0: 79 2e 20 2a 2f 0a 20 20 69 66 28 20 70 49 74 65  y. */.  if( pIte
f500: 72 2d 3e 70 4c 65 61 66 20 29 7b 0a 20 20 20 20  r->pLeaf ){.    
f510: 69 66 28 20 62 4e 65 77 54 65 72 6d 20 29 7b 0a  if( bNewTerm ){.
f520: 20 20 20 20 20 20 69 66 28 20 70 49 74 65 72 2d        if( pIter-
f530: 3e 66 6c 61 67 73 20 26 20 46 54 53 35 5f 53 45  >flags & FTS5_SE
f540: 47 49 54 45 52 5f 4f 4e 45 54 45 52 4d 20 29 7b  GITER_ONETERM ){
f550: 0a 20 20 20 20 20 20 20 20 66 74 73 35 44 61 74  .        fts5Dat
f560: 61 52 65 6c 65 61 73 65 28 70 49 74 65 72 2d 3e  aRelease(pIter->
f570: 70 4c 65 61 66 29 3b 0a 20 20 20 20 20 20 20 20  pLeaf);.        
f580: 70 49 74 65 72 2d 3e 70 4c 65 61 66 20 3d 20 30  pIter->pLeaf = 0
f590: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
f5a0: 20 20 20 20 20 20 20 66 74 73 35 53 65 67 49 74         fts5SegIt
f5b0: 65 72 4c 6f 61 64 54 65 72 6d 28 70 2c 20 70 49  erLoadTerm(p, pI
f5c0: 74 65 72 2c 20 6e 4b 65 65 70 29 3b 0a 20 20 20  ter, nKeep);.   
f5d0: 20 20 20 20 20 66 74 73 35 53 65 67 49 74 65 72       fts5SegIter
f5e0: 4c 6f 61 64 4e 50 6f 73 28 70 2c 20 70 49 74 65  LoadNPos(p, pIte
f5f0: 72 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  r);.        if( 
f600: 70 62 4e 65 77 54 65 72 6d 20 29 20 2a 70 62 4e  pbNewTerm ) *pbN
f610: 65 77 54 65 72 6d 20 3d 20 31 3b 0a 20 20 20 20  ewTerm = 1;.    
f620: 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20    }.    }else{. 
f630: 20 20 20 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c       /* The foll
f640: 6f 77 69 6e 67 20 63 6f 75 6c 64 20 62 65 20 64  owing could be d
f650: 6f 6e 65 20 62 79 20 63 61 6c 6c 69 6e 67 20 66  one by calling f
f660: 74 73 35 53 65 67 49 74 65 72 4c 6f 61 64 4e 50  ts5SegIterLoadNP
f670: 6f 73 28 29 2e 20 42 75 74 0a 20 20 20 20 20 20  os(). But.      
f680: 2a 2a 20 74 68 69 73 20 62 6c 6f 63 6b 20 69 73  ** this block is
f690: 20 70 61 72 74 69 63 75 6c 61 72 6c 79 20 70 65   particularly pe
f6a0: 72 66 6f 72 6d 61 6e 63 65 20 63 72 69 74 69 63  rformance critic
f6b0: 61 6c 2c 20 73 6f 20 65 71 75 69 76 61 6c 65 6e  al, so equivalen
f6c0: 74 0a 20 20 20 20 20 20 2a 2a 20 63 6f 64 65 20  t.      ** code 
f6d0: 69 73 20 69 6e 6c 69 6e 65 64 2e 20 0a 20 20 20  is inlined. .   
f6e0: 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 4c     **.      ** L
f6f0: 61 74 65 72 3a 20 53 77 69 74 63 68 65 64 20 62  ater: Switched b
f700: 61 63 6b 20 74 6f 20 66 74 73 35 53 65 67 49 74  ack to fts5SegIt
f710: 65 72 4c 6f 61 64 4e 50 6f 73 28 29 20 62 65 63  erLoadNPos() bec
f720: 61 75 73 65 20 69 74 20 73 75 70 70 6f 72 74 73  ause it supports
f730: 0a 20 20 20 20 20 20 2a 2a 20 64 65 74 61 69 6c  .      ** detail
f740: 3d 6e 6f 6e 65 20 6d 6f 64 65 2e 20 4e 6f 74 20  =none mode. Not 
f750: 69 64 65 61 6c 2e 0a 20 20 20 20 20 20 2a 2f 0a  ideal..      */.
f760: 20 20 20 20 20 20 69 6e 74 20 6e 53 7a 3b 0a 20        int nSz;. 
f770: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e       assert( p->
f780: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  rc==SQLITE_OK );
f790: 0a 20 20 20 20 20 20 66 74 73 35 46 61 73 74 47  .      fts5FastG
f7a0: 65 74 56 61 72 69 6e 74 33 32 28 70 49 74 65 72  etVarint32(pIter
f7b0: 2d 3e 70 4c 65 61 66 2d 3e 70 2c 20 70 49 74 65  ->pLeaf->p, pIte
f7c0: 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 2c 20  r->iLeafOffset, 
f7d0: 6e 53 7a 29 3b 0a 20 20 20 20 20 20 70 49 74 65  nSz);.      pIte
f7e0: 72 2d 3e 62 44 65 6c 20 3d 20 28 6e 53 7a 20 26  r->bDel = (nSz &
f7f0: 20 30 78 30 30 30 31 29 3b 0a 20 20 20 20 20 20   0x0001);.      
f800: 70 49 74 65 72 2d 3e 6e 50 6f 73 20 3d 20 6e 53  pIter->nPos = nS
f810: 7a 3e 3e 31 3b 0a 20 20 20 20 20 20 61 73 73 65  z>>1;.      asse
f820: 72 74 5f 6e 63 28 20 70 49 74 65 72 2d 3e 6e 50  rt_nc( pIter->nP
f830: 6f 73 3e 3d 30 20 29 3b 0a 20 20 20 20 7d 0a 20  os>=0 );.    }. 
f840: 20 7d 0a 7d 0a 0a 23 64 65 66 69 6e 65 20 53 57   }.}..#define SW
f850: 41 50 56 41 4c 28 54 2c 20 61 2c 20 62 29 20 7b  APVAL(T, a, b) {
f860: 20 54 20 74 6d 70 3b 20 74 6d 70 3d 61 3b 20 61   T tmp; tmp=a; a
f870: 3d 62 3b 20 62 3d 74 6d 70 3b 20 7d 0a 0a 23 64  =b; b=tmp; }..#d
f880: 65 66 69 6e 65 20 66 74 73 35 49 6e 64 65 78 53  efine fts5IndexS
f890: 6b 69 70 56 61 72 69 6e 74 28 61 2c 20 69 4f 66  kipVarint(a, iOf
f8a0: 66 29 20 7b 20 20 20 20 20 20 20 20 20 20 20 20  f) {            
f8b0: 5c 0a 20 20 69 6e 74 20 69 45 6e 64 20 3d 20 69  \.  int iEnd = i
f8c0: 4f 66 66 2b 39 3b 20 20 20 20 20 20 20 20 20 20  Off+9;          
f8d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f8e0: 20 20 20 20 5c 0a 20 20 77 68 69 6c 65 28 20 28      \.  while( (
f8f0: 61 5b 69 4f 66 66 2b 2b 5d 20 26 20 30 78 38 30  a[iOff++] & 0x80
f900: 29 20 26 26 20 69 4f 66 66 3c 69 45 6e 64 20 29  ) && iOff<iEnd )
f910: 3b 20 20 20 20 20 20 20 5c 0a 7d 0a 0a 2f 2a 0a  ;       \.}../*.
f920: 2a 2a 20 49 74 65 72 61 74 6f 72 20 70 49 74 65  ** Iterator pIte
f930: 72 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e  r currently poin
f940: 74 73 20 74 6f 20 74 68 65 20 66 69 72 73 74 20  ts to the first 
f950: 72 6f 77 69 64 20 69 6e 20 61 20 64 6f 63 6c 69  rowid in a docli
f960: 73 74 2e 20 54 68 69 73 0a 2a 2a 20 66 75 6e 63  st. This.** func
f970: 74 69 6f 6e 20 73 65 74 73 20 74 68 65 20 69 74  tion sets the it
f980: 65 72 61 74 6f 72 20 75 70 20 73 6f 20 74 68 61  erator up so tha
f990: 74 20 69 74 65 72 61 74 65 73 20 69 6e 20 72 65  t iterates in re
f9a0: 76 65 72 73 65 20 6f 72 64 65 72 20 74 68 72 6f  verse order thro
f9b0: 75 67 68 0a 2a 2a 20 74 68 65 20 64 6f 63 6c 69  ugh.** the docli
f9c0: 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  st..*/.static vo
f9d0: 69 64 20 66 74 73 35 53 65 67 49 74 65 72 52 65  id fts5SegIterRe
f9e0: 76 65 72 73 65 28 46 74 73 35 49 6e 64 65 78 20  verse(Fts5Index 
f9f0: 2a 70 2c 20 46 74 73 35 53 65 67 49 74 65 72 20  *p, Fts5SegIter 
fa00: 2a 70 49 74 65 72 29 7b 0a 20 20 69 6e 74 20 65  *pIter){.  int e
fa10: 44 65 74 61 69 6c 20 3d 20 70 2d 3e 70 43 6f 6e  Detail = p->pCon
fa20: 66 69 67 2d 3e 65 44 65 74 61 69 6c 3b 0a 20 20  fig->eDetail;.  
fa30: 46 74 73 35 44 6c 69 64 78 49 74 65 72 20 2a 70  Fts5DlidxIter *p
fa40: 44 6c 69 64 78 20 3d 20 70 49 74 65 72 2d 3e 70  Dlidx = pIter->p
fa50: 44 6c 69 64 78 3b 0a 20 20 46 74 73 35 44 61 74  Dlidx;.  Fts5Dat
fa60: 61 20 2a 70 4c 61 73 74 20 3d 20 30 3b 0a 20 20  a *pLast = 0;.  
fa70: 69 6e 74 20 70 67 6e 6f 4c 61 73 74 20 3d 20 30  int pgnoLast = 0
fa80: 3b 0a 0a 20 20 69 66 28 20 70 44 6c 69 64 78 20  ;..  if( pDlidx 
fa90: 29 7b 0a 20 20 20 20 69 6e 74 20 69 53 65 67 69  ){.    int iSegi
faa0: 64 20 3d 20 70 49 74 65 72 2d 3e 70 53 65 67 2d  d = pIter->pSeg-
fab0: 3e 69 53 65 67 69 64 3b 0a 20 20 20 20 70 67 6e  >iSegid;.    pgn
fac0: 6f 4c 61 73 74 20 3d 20 66 74 73 35 44 6c 69 64  oLast = fts5Dlid
fad0: 78 49 74 65 72 50 67 6e 6f 28 70 44 6c 69 64 78  xIterPgno(pDlidx
fae0: 29 3b 0a 20 20 20 20 70 4c 61 73 74 20 3d 20 66  );.    pLast = f
faf0: 74 73 35 44 61 74 61 52 65 61 64 28 70 2c 20 46  ts5DataRead(p, F
fb00: 54 53 35 5f 53 45 47 4d 45 4e 54 5f 52 4f 57 49  TS5_SEGMENT_ROWI
fb10: 44 28 69 53 65 67 69 64 2c 20 70 67 6e 6f 4c 61  D(iSegid, pgnoLa
fb20: 73 74 29 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  st));.  }else{. 
fb30: 20 20 20 46 74 73 35 44 61 74 61 20 2a 70 4c 65     Fts5Data *pLe
fb40: 61 66 20 3d 20 70 49 74 65 72 2d 3e 70 4c 65 61  af = pIter->pLea
fb50: 66 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75  f;         /* Cu
fb60: 72 72 65 6e 74 20 6c 65 61 66 20 64 61 74 61 20  rrent leaf data 
fb70: 2a 2f 0a 0a 20 20 20 20 2f 2a 20 43 75 72 72 65  */..    /* Curre
fb80: 6e 74 6c 79 2c 20 46 74 73 35 53 65 67 49 74 65  ntly, Fts5SegIte
fb90: 72 2e 69 4c 65 61 66 4f 66 66 73 65 74 20 70 6f  r.iLeafOffset po
fba0: 69 6e 74 73 20 74 6f 20 74 68 65 20 66 69 72 73  ints to the firs
fbb0: 74 20 62 79 74 65 20 6f 66 0a 20 20 20 20 2a 2a  t byte of.    **
fbc0: 20 70 6f 73 69 74 69 6f 6e 2d 6c 69 73 74 20 63   position-list c
fbd0: 6f 6e 74 65 6e 74 20 66 6f 72 20 74 68 65 20 63  ontent for the c
fbe0: 75 72 72 65 6e 74 20 72 6f 77 69 64 2e 20 42 61  urrent rowid. Ba
fbf0: 63 6b 20 69 74 20 75 70 20 73 6f 20 74 68 61 74  ck it up so that
fc00: 20 69 74 0a 20 20 20 20 2a 2a 20 70 6f 69 6e 74   it.    ** point
fc10: 73 20 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f  s to the start o
fc20: 66 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 2d 6c  f the position-l
fc30: 69 73 74 20 73 69 7a 65 20 66 69 65 6c 64 2e 20  ist size field. 
fc40: 2a 2f 0a 23 69 66 20 30 0a 20 20 20 20 69 66 28  */.#if 0.    if(
fc50: 20 65 44 65 74 61 69 6c 21 3d 46 54 53 35 5f 44   eDetail!=FTS5_D
fc60: 45 54 41 49 4c 5f 4e 4f 4e 45 20 29 7b 0a 20 20  ETAIL_NONE ){.  
fc70: 20 20 20 20 70 49 74 65 72 2d 3e 69 4c 65 61 66      pIter->iLeaf
fc80: 4f 66 66 73 65 74 20 2d 3d 20 73 71 6c 69 74 65  Offset -= sqlite
fc90: 33 46 74 73 35 47 65 74 56 61 72 69 6e 74 4c 65  3Fts5GetVarintLe
fca0: 6e 28 70 49 74 65 72 2d 3e 6e 50 6f 73 2a 32 2b  n(pIter->nPos*2+
fcb0: 70 49 74 65 72 2d 3e 62 44 65 6c 29 3b 0a 20 20  pIter->bDel);.  
fcc0: 20 20 7d 0a 23 65 6c 73 65 0a 20 20 20 20 69 6e    }.#else.    in
fcd0: 74 20 69 50 6f 73 6c 69 73 74 3b 0a 20 20 20 20  t iPoslist;.    
fce0: 69 66 28 20 70 49 74 65 72 2d 3e 69 54 65 72 6d  if( pIter->iTerm
fcf0: 4c 65 61 66 50 67 6e 6f 3d 3d 70 49 74 65 72 2d  LeafPgno==pIter-
fd00: 3e 69 4c 65 61 66 50 67 6e 6f 20 29 7b 0a 20 20  >iLeafPgno ){.  
fd10: 20 20 20 20 69 50 6f 73 6c 69 73 74 20 3d 20 70      iPoslist = p
fd20: 49 74 65 72 2d 3e 69 54 65 72 6d 4c 65 61 66 4f  Iter->iTermLeafO
fd30: 66 66 73 65 74 3b 0a 20 20 20 20 7d 65 6c 73 65  ffset;.    }else
fd40: 7b 0a 20 20 20 20 20 20 69 50 6f 73 6c 69 73 74  {.      iPoslist
fd50: 20 3d 20 34 3b 0a 20 20 20 20 7d 0a 20 20 20 20   = 4;.    }.    
fd60: 66 74 73 35 49 6e 64 65 78 53 6b 69 70 56 61 72  fts5IndexSkipVar
fd70: 69 6e 74 28 70 4c 65 61 66 2d 3e 70 2c 20 69 50  int(pLeaf->p, iP
fd80: 6f 73 6c 69 73 74 29 3b 0a 20 20 20 20 61 73 73  oslist);.    ass
fd90: 65 72 74 28 20 65 44 65 74 61 69 6c 3d 3d 46 54  ert( eDetail==FT
fda0: 53 35 5f 44 45 54 41 49 4c 5f 4e 4f 4e 45 20 7c  S5_DETAIL_NONE |
fdb0: 7c 20 69 50 6f 73 6c 69 73 74 3d 3d 28 0a 20 20  | iPoslist==(.  
fdc0: 20 20 20 20 20 20 70 49 74 65 72 2d 3e 69 4c 65        pIter->iLe
fdd0: 61 66 4f 66 66 73 65 74 20 2d 20 73 71 6c 69 74  afOffset - sqlit
fde0: 65 33 46 74 73 35 47 65 74 56 61 72 69 6e 74 4c  e3Fts5GetVarintL
fdf0: 65 6e 28 70 49 74 65 72 2d 3e 6e 50 6f 73 2a 32  en(pIter->nPos*2
fe00: 2b 70 49 74 65 72 2d 3e 62 44 65 6c 29 0a 20 20  +pIter->bDel).  
fe10: 20 20 29 29 3b 0a 20 20 20 20 70 49 74 65 72 2d    ));.    pIter-
fe20: 3e 69 4c 65 61 66 4f 66 66 73 65 74 20 3d 20 69  >iLeafOffset = i
fe30: 50 6f 73 6c 69 73 74 3b 0a 23 65 6e 64 69 66 0a  Poslist;.#endif.
fe40: 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20  .    /* If this 
fe50: 63 6f 6e 64 69 74 69 6f 6e 20 69 73 20 74 72 75  condition is tru
fe60: 65 20 74 68 65 6e 20 74 68 65 20 6c 61 72 67 65  e then the large
fe70: 73 74 20 72 6f 77 69 64 20 66 6f 72 20 74 68 65  st rowid for the
fe80: 20 63 75 72 72 65 6e 74 0a 20 20 20 20 2a 2a 20   current.    ** 
fe90: 74 65 72 6d 20 6d 61 79 20 6e 6f 74 20 62 65 20  term may not be 
fea0: 73 74 6f 72 65 64 20 6f 6e 20 74 68 65 20 63 75  stored on the cu
feb0: 72 72 65 6e 74 20 70 61 67 65 2e 20 53 6f 20 73  rrent page. So s
fec0: 65 61 72 63 68 20 66 6f 72 77 61 72 64 20 74 6f  earch forward to
fed0: 0a 20 20 20 20 2a 2a 20 73 65 65 20 77 68 65 72  .    ** see wher
fee0: 65 20 73 61 69 64 20 72 6f 77 69 64 20 72 65 61  e said rowid rea
fef0: 6c 6c 79 20 69 73 2e 20 20 2a 2f 0a 20 20 20 20  lly is.  */.    
ff00: 69 66 28 20 70 49 74 65 72 2d 3e 69 45 6e 64 6f  if( pIter->iEndo
ff10: 66 44 6f 63 6c 69 73 74 3e 3d 70 4c 65 61 66 2d  fDoclist>=pLeaf-
ff20: 3e 73 7a 4c 65 61 66 20 29 7b 0a 20 20 20 20 20  >szLeaf ){.     
ff30: 20 69 6e 74 20 70 67 6e 6f 3b 0a 20 20 20 20 20   int pgno;.     
ff40: 20 46 74 73 35 53 74 72 75 63 74 75 72 65 53 65   Fts5StructureSe
ff50: 67 6d 65 6e 74 20 2a 70 53 65 67 20 3d 20 70 49  gment *pSeg = pI
ff60: 74 65 72 2d 3e 70 53 65 67 3b 0a 0a 20 20 20 20  ter->pSeg;..    
ff70: 20 20 2f 2a 20 54 68 65 20 6c 61 73 74 20 72 6f    /* The last ro
ff80: 77 69 64 20 69 6e 20 74 68 65 20 64 6f 63 6c 69  wid in the docli
ff90: 73 74 20 6d 61 79 20 6e 6f 74 20 62 65 20 6f 6e  st may not be on
ffa0: 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 61 67   the current pag
ffb0: 65 2e 20 53 65 61 72 63 68 0a 20 20 20 20 20 20  e. Search.      
ffc0: 2a 2a 20 66 6f 72 77 61 72 64 20 74 6f 20 66 69  ** forward to fi
ffd0: 6e 64 20 74 68 65 20 70 61 67 65 20 63 6f 6e 74  nd the page cont
ffe0: 61 69 6e 69 6e 67 20 74 68 65 20 6c 61 73 74 20  aining the last 
fff0: 72 6f 77 69 64 2e 20 20 2a 2f 0a 20 20 20 20 20  rowid.  */.     
10000 20 66 6f 72 28 70 67 6e 6f 3d 70 49 74 65 72 2d   for(pgno=pIter-
10010 3e 69 4c 65 61 66 50 67 6e 6f 2b 31 3b 20 21 70  >iLeafPgno+1; !p
10020 2d 3e 72 63 20 26 26 20 70 67 6e 6f 3c 3d 70 53  ->rc && pgno<=pS
10030 65 67 2d 3e 70 67 6e 6f 4c 61 73 74 3b 20 70 67  eg->pgnoLast; pg
10040 6e 6f 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69  no++){.        i
10050 36 34 20 69 41 62 73 20 3d 20 46 54 53 35 5f 53  64 iAbs = FTS5_S
10060 45 47 4d 45 4e 54 5f 52 4f 57 49 44 28 70 53 65  EGMENT_ROWID(pSe
10070 67 2d 3e 69 53 65 67 69 64 2c 20 70 67 6e 6f 29  g->iSegid, pgno)
10080 3b 0a 20 20 20 20 20 20 20 20 46 74 73 35 44 61  ;.        Fts5Da
10090 74 61 20 2a 70 4e 65 77 20 3d 20 66 74 73 35 44  ta *pNew = fts5D
100a0 61 74 61 52 65 61 64 28 70 2c 20 69 41 62 73 29  ataRead(p, iAbs)
100b0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4e  ;.        if( pN
100c0 65 77 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ew ){.          
100d0 69 6e 74 20 69 52 6f 77 69 64 2c 20 62 54 65 72  int iRowid, bTer
100e0 6d 6c 65 73 73 3b 0a 20 20 20 20 20 20 20 20 20  mless;.         
100f0 20 69 52 6f 77 69 64 20 3d 20 66 74 73 35 4c 65   iRowid = fts5Le
10100 61 66 46 69 72 73 74 52 6f 77 69 64 4f 66 66 28  afFirstRowidOff(
10110 70 4e 65 77 29 3b 0a 20 20 20 20 20 20 20 20 20  pNew);.         
10120 20 62 54 65 72 6d 6c 65 73 73 20 3d 20 66 74 73   bTermless = fts
10130 35 4c 65 61 66 49 73 54 65 72 6d 6c 65 73 73 28  5LeafIsTermless(
10140 70 4e 65 77 29 3b 0a 20 20 20 20 20 20 20 20 20  pNew);.         
10150 20 69 66 28 20 69 52 6f 77 69 64 20 29 7b 0a 20   if( iRowid ){. 
10160 20 20 20 20 20 20 20 20 20 20 20 53 57 41 50 56             SWAPV
10170 41 4c 28 46 74 73 35 44 61 74 61 2a 2c 20 70 4e  AL(Fts5Data*, pN
10180 65 77 2c 20 70 4c 61 73 74 29 3b 0a 20 20 20 20  ew, pLast);.    
10190 20 20 20 20 20 20 20 20 70 67 6e 6f 4c 61 73 74          pgnoLast
101a0 20 3d 20 70 67 6e 6f 3b 0a 20 20 20 20 20 20 20   = pgno;.       
101b0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 66     }.          f
101c0 74 73 35 44 61 74 61 52 65 6c 65 61 73 65 28 70  ts5DataRelease(p
101d0 4e 65 77 29 3b 0a 20 20 20 20 20 20 20 20 20 20  New);.          
101e0 69 66 28 20 62 54 65 72 6d 6c 65 73 73 3d 3d 30  if( bTermless==0
101f0 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
10200 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
10210 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 70  }.  }..  /* If p
10220 4c 61 73 74 20 69 73 20 4e 55 4c 4c 20 61 74 20  Last is NULL at 
10230 74 68 69 73 20 70 6f 69 6e 74 2c 20 74 68 65 6e  this point, then
10240 20 74 68 65 20 6c 61 73 74 20 72 6f 77 69 64 20   the last rowid 
10250 66 6f 72 20 74 68 69 73 20 64 6f 63 6c 69 73 74  for this doclist
10260 0a 20 20 2a 2a 20 6c 69 65 73 20 6f 6e 20 74 68  .  ** lies on th
10270 65 20 70 61 67 65 20 63 75 72 72 65 6e 74 6c 79  e page currently
10280 20 69 6e 64 69 63 61 74 65 64 20 62 79 20 74 68   indicated by th
10290 65 20 69 74 65 72 61 74 6f 72 2e 20 49 6e 20 74  e iterator. In t
102a0 68 69 73 20 63 61 73 65 20 0a 20 20 2a 2a 20 70  his case .  ** p
102b0 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65  Iter->iLeafOffse
102c0 74 20 69 73 20 61 6c 72 65 61 64 79 20 73 65 74  t is already set
102d0 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65   to point to the
102e0 20 70 6f 73 69 74 69 6f 6e 2d 6c 69 73 74 20 73   position-list s
102f0 69 7a 65 0a 20 20 2a 2a 20 66 69 65 6c 64 20 61  ize.  ** field a
10300 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74  ssociated with t
10310 68 65 20 66 69 72 73 74 20 72 65 6c 65 76 61 6e  he first relevan
10320 74 20 72 6f 77 69 64 20 6f 6e 20 74 68 65 20 70  t rowid on the p
10330 61 67 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4f  age..  **.  ** O
10340 72 2c 20 69 66 20 70 4c 61 73 74 20 69 73 20 6e  r, if pLast is n
10350 6f 6e 2d 4e 55 4c 4c 2c 20 74 68 65 6e 20 69 74  on-NULL, then it
10360 20 69 73 20 74 68 65 20 70 61 67 65 20 74 68 61   is the page tha
10370 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 6c  t contains the l
10380 61 73 74 0a 20 20 2a 2a 20 72 6f 77 69 64 2e 20  ast.  ** rowid. 
10390 49 6e 20 74 68 69 73 20 63 61 73 65 20 63 6f 6e  In this case con
103a0 66 69 67 75 72 65 20 74 68 65 20 69 74 65 72 61  figure the itera
103b0 74 6f 72 20 73 6f 20 74 68 61 74 20 69 74 20 70  tor so that it p
103c0 6f 69 6e 74 73 20 74 6f 20 74 68 65 0a 20 20 2a  oints to the.  *
103d0 2a 20 66 69 72 73 74 20 72 6f 77 69 64 20 6f 6e  * first rowid on
103e0 20 74 68 69 73 20 70 61 67 65 2e 0a 20 20 2a 2f   this page..  */
103f0 0a 20 20 69 66 28 20 70 4c 61 73 74 20 29 7b 0a  .  if( pLast ){.
10400 20 20 20 20 69 6e 74 20 69 4f 66 66 3b 0a 20 20      int iOff;.  
10410 20 20 66 74 73 35 44 61 74 61 52 65 6c 65 61 73    fts5DataReleas
10420 65 28 70 49 74 65 72 2d 3e 70 4c 65 61 66 29 3b  e(pIter->pLeaf);
10430 0a 20 20 20 20 70 49 74 65 72 2d 3e 70 4c 65 61  .    pIter->pLea
10440 66 20 3d 20 70 4c 61 73 74 3b 0a 20 20 20 20 70  f = pLast;.    p
10450 49 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 20  Iter->iLeafPgno 
10460 3d 20 70 67 6e 6f 4c 61 73 74 3b 0a 20 20 20 20  = pgnoLast;.    
10470 69 4f 66 66 20 3d 20 66 74 73 35 4c 65 61 66 46  iOff = fts5LeafF
10480 69 72 73 74 52 6f 77 69 64 4f 66 66 28 70 4c 61  irstRowidOff(pLa
10490 73 74 29 3b 0a 20 20 20 20 69 4f 66 66 20 2b 3d  st);.    iOff +=
104a0 20 66 74 73 35 47 65 74 56 61 72 69 6e 74 28 26   fts5GetVarint(&
104b0 70 4c 61 73 74 2d 3e 70 5b 69 4f 66 66 5d 2c 20  pLast->p[iOff], 
104c0 28 75 36 34 2a 29 26 70 49 74 65 72 2d 3e 69 52  (u64*)&pIter->iR
104d0 6f 77 69 64 29 3b 0a 20 20 20 20 70 49 74 65 72  owid);.    pIter
104e0 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 20 3d 20  ->iLeafOffset = 
104f0 69 4f 66 66 3b 0a 0a 20 20 20 20 69 66 28 20 66  iOff;..    if( f
10500 74 73 35 4c 65 61 66 49 73 54 65 72 6d 6c 65 73  ts5LeafIsTermles
10510 73 28 70 4c 61 73 74 29 20 29 7b 0a 20 20 20 20  s(pLast) ){.    
10520 20 20 70 49 74 65 72 2d 3e 69 45 6e 64 6f 66 44    pIter->iEndofD
10530 6f 63 6c 69 73 74 20 3d 20 70 4c 61 73 74 2d 3e  oclist = pLast->
10540 6e 6e 2b 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  nn+1;.    }else{
10550 0a 20 20 20 20 20 20 70 49 74 65 72 2d 3e 69 45  .      pIter->iE
10560 6e 64 6f 66 44 6f 63 6c 69 73 74 20 3d 20 66 74  ndofDoclist = ft
10570 73 35 4c 65 61 66 46 69 72 73 74 54 65 72 6d 4f  s5LeafFirstTermO
10580 66 66 28 70 4c 61 73 74 29 3b 0a 20 20 20 20 7d  ff(pLast);.    }
10590 0a 0a 20 20 7d 0a 0a 20 20 66 74 73 35 53 65 67  ..  }..  fts5Seg
105a0 49 74 65 72 52 65 76 65 72 73 65 49 6e 69 74 50  IterReverseInitP
105b0 61 67 65 28 70 2c 20 70 49 74 65 72 29 3b 0a 7d  age(p, pIter);.}
105c0 0a 0a 2f 2a 0a 2a 2a 20 49 74 65 72 61 74 6f 72  ../*.** Iterator
105d0 20 70 49 74 65 72 20 63 75 72 72 65 6e 74 6c 79   pIter currently
105e0 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 66   points to the f
105f0 69 72 73 74 20 72 6f 77 69 64 20 6f 66 20 61 20  irst rowid of a 
10600 64 6f 63 6c 69 73 74 2e 0a 2a 2a 20 54 68 65 72  doclist..** Ther
10610 65 20 69 73 20 61 20 64 6f 63 6c 69 73 74 2d 69  e is a doclist-i
10620 6e 64 65 78 20 61 73 73 6f 63 69 61 74 65 64 20  ndex associated 
10630 77 69 74 68 20 74 68 65 20 66 69 6e 61 6c 20 74  with the final t
10640 65 72 6d 20 6f 6e 20 74 68 65 20 63 75 72 72 65  erm on the curre
10650 6e 74 20 0a 2a 2a 20 70 61 67 65 2e 20 49 66 20  nt .** page. If 
10660 74 68 65 20 63 75 72 72 65 6e 74 20 74 65 72 6d  the current term
10670 20 69 73 20 74 68 65 20 6c 61 73 74 20 74 65 72   is the last ter
10680 6d 20 6f 6e 20 74 68 65 20 70 61 67 65 2c 20 6c  m on the page, l
10690 6f 61 64 20 74 68 65 20 0a 2a 2a 20 64 6f 63 6c  oad the .** docl
106a0 69 73 74 2d 69 6e 64 65 78 20 66 72 6f 6d 20 64  ist-index from d
106b0 69 73 6b 20 61 6e 64 20 69 6e 69 74 69 61 6c 69  isk and initiali
106c0 7a 65 20 61 6e 20 69 74 65 72 61 74 6f 72 20 61  ze an iterator a
106d0 74 20 28 70 49 74 65 72 2d 3e 70 44 6c 69 64 78  t (pIter->pDlidx
106e0 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  )..*/.static voi
106f0 64 20 66 74 73 35 53 65 67 49 74 65 72 4c 6f 61  d fts5SegIterLoa
10700 64 44 6c 69 64 78 28 46 74 73 35 49 6e 64 65 78  dDlidx(Fts5Index
10710 20 2a 70 2c 20 46 74 73 35 53 65 67 49 74 65 72   *p, Fts5SegIter
10720 20 2a 70 49 74 65 72 29 7b 0a 20 20 69 6e 74 20   *pIter){.  int 
10730 69 53 65 67 20 3d 20 70 49 74 65 72 2d 3e 70 53  iSeg = pIter->pS
10740 65 67 2d 3e 69 53 65 67 69 64 3b 0a 20 20 69 6e  eg->iSegid;.  in
10750 74 20 62 52 65 76 20 3d 20 28 70 49 74 65 72 2d  t bRev = (pIter-
10760 3e 66 6c 61 67 73 20 26 20 46 54 53 35 5f 53 45  >flags & FTS5_SE
10770 47 49 54 45 52 5f 52 45 56 45 52 53 45 29 3b 0a  GITER_REVERSE);.
10780 20 20 46 74 73 35 44 61 74 61 20 2a 70 4c 65 61    Fts5Data *pLea
10790 66 20 3d 20 70 49 74 65 72 2d 3e 70 4c 65 61 66  f = pIter->pLeaf
107a0 3b 20 2f 2a 20 43 75 72 72 65 6e 74 20 6c 65 61  ; /* Current lea
107b0 66 20 64 61 74 61 20 2a 2f 0a 0a 20 20 61 73 73  f data */..  ass
107c0 65 72 74 28 20 70 49 74 65 72 2d 3e 66 6c 61 67  ert( pIter->flag
107d0 73 20 26 20 46 54 53 35 5f 53 45 47 49 54 45 52  s & FTS5_SEGITER
107e0 5f 4f 4e 45 54 45 52 4d 20 29 3b 0a 20 20 61 73  _ONETERM );.  as
107f0 73 65 72 74 28 20 70 49 74 65 72 2d 3e 70 44 6c  sert( pIter->pDl
10800 69 64 78 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20  idx==0 );..  /* 
10810 43 68 65 63 6b 20 69 66 20 74 68 65 20 63 75 72  Check if the cur
10820 72 65 6e 74 20 64 6f 63 6c 69 73 74 20 65 6e 64  rent doclist end
10830 73 20 6f 6e 20 74 68 69 73 20 70 61 67 65 2e 20  s on this page. 
10840 49 66 20 69 74 20 64 6f 65 73 2c 20 72 65 74 75  If it does, retu
10850 72 6e 0a 20 20 2a 2a 20 65 61 72 6c 79 20 77 69  rn.  ** early wi
10860 74 68 6f 75 74 20 6c 6f 61 64 69 6e 67 20 74 68  thout loading th
10870 65 20 64 6f 63 6c 69 73 74 2d 69 6e 64 65 78 20  e doclist-index 
10880 28 61 73 20 69 74 20 62 65 6c 6f 6e 67 73 20 74  (as it belongs t
10890 6f 20 61 20 64 69 66 66 65 72 65 6e 74 0a 20 20  o a different.  
108a0 2a 2a 20 74 65 72 6d 2e 20 2a 2f 0a 20 20 69 66  ** term. */.  if
108b0 28 20 70 49 74 65 72 2d 3e 69 54 65 72 6d 4c 65  ( pIter->iTermLe
108c0 61 66 50 67 6e 6f 3d 3d 70 49 74 65 72 2d 3e 69  afPgno==pIter->i
108d0 4c 65 61 66 50 67 6e 6f 20 0a 20 20 20 26 26 20  LeafPgno .   && 
108e0 70 49 74 65 72 2d 3e 69 45 6e 64 6f 66 44 6f 63  pIter->iEndofDoc
108f0 6c 69 73 74 3c 70 4c 65 61 66 2d 3e 73 7a 4c 65  list<pLeaf->szLe
10900 61 66 20 0a 20 20 29 7b 0a 20 20 20 20 72 65 74  af .  ){.    ret
10910 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20 70 49 74 65  urn;.  }..  pIte
10920 72 2d 3e 70 44 6c 69 64 78 20 3d 20 66 74 73 35  r->pDlidx = fts5
10930 44 6c 69 64 78 49 74 65 72 49 6e 69 74 28 70 2c  DlidxIterInit(p,
10940 20 62 52 65 76 2c 20 69 53 65 67 2c 20 70 49 74   bRev, iSeg, pIt
10950 65 72 2d 3e 69 54 65 72 6d 4c 65 61 66 50 67 6e  er->iTermLeafPgn
10960 6f 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  o);.}../*.** The
10970 20 69 74 65 72 61 74 6f 72 20 6f 62 6a 65 63 74   iterator object
10980 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73   passed as the s
10990 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 63  econd argument c
109a0 75 72 72 65 6e 74 6c 79 20 63 6f 6e 74 61 69 6e  urrently contain
109b0 73 0a 2a 2a 20 6e 6f 20 76 61 6c 69 64 20 76 61  s.** no valid va
109c0 6c 75 65 73 20 65 78 63 65 70 74 20 66 6f 72 20  lues except for 
109d0 74 68 65 20 46 74 73 35 53 65 67 49 74 65 72 2e  the Fts5SegIter.
109e0 70 4c 65 61 66 20 6d 65 6d 62 65 72 20 76 61 72  pLeaf member var
109f0 69 61 62 6c 65 2e 20 54 68 69 73 0a 2a 2a 20 66  iable. This.** f
10a00 75 6e 63 74 69 6f 6e 20 73 65 61 72 63 68 65 73  unction searches
10a10 20 74 68 65 20 6c 65 61 66 20 70 61 67 65 20 66   the leaf page f
10a20 6f 72 20 61 20 74 65 72 6d 20 6d 61 74 63 68 69  or a term matchi
10a30 6e 67 20 28 70 54 65 72 6d 2f 6e 54 65 72 6d 29  ng (pTerm/nTerm)
10a40 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 73  ..**.** If the s
10a50 70 65 63 69 66 69 65 64 20 74 65 72 6d 20 69 73  pecified term is
10a60 20 66 6f 75 6e 64 20 6f 6e 20 74 68 65 20 70 61   found on the pa
10a70 67 65 2c 20 74 68 65 6e 20 74 68 65 20 69 74 65  ge, then the ite
10a80 72 61 74 6f 72 20 69 73 20 6c 65 66 74 0a 2a 2a  rator is left.**
10a90 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 69 74 2e   pointing to it.
10aa0 20 49 66 20 61 72 67 75 6d 65 6e 74 20 62 47 65   If argument bGe
10ab0 20 69 73 20 7a 65 72 6f 20 61 6e 64 20 74 68 65   is zero and the
10ac0 20 74 65 72 6d 20 69 73 20 6e 6f 74 20 66 6f 75   term is not fou
10ad0 6e 64 2c 0a 2a 2a 20 74 68 65 20 69 74 65 72 61  nd,.** the itera
10ae0 74 6f 72 20 69 73 20 6c 65 66 74 20 70 6f 69 6e  tor is left poin
10af0 74 69 6e 67 20 61 74 20 45 4f 46 2e 0a 2a 2a 0a  ting at EOF..**.
10b00 2a 2a 20 49 66 20 62 47 65 20 69 73 20 6e 6f 6e  ** If bGe is non
10b10 2d 7a 65 72 6f 20 61 6e 64 20 74 68 65 20 73 70  -zero and the sp
10b20 65 63 69 66 69 65 64 20 74 65 72 6d 20 69 73 20  ecified term is 
10b30 6e 6f 74 20 66 6f 75 6e 64 2c 20 74 68 65 6e 20  not found, then 
10b40 74 68 65 0a 2a 2a 20 69 74 65 72 61 74 6f 72 20  the.** iterator 
10b50 69 73 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67  is left pointing
10b60 20 74 6f 20 74 68 65 20 73 6d 61 6c 6c 65 73 74   to the smallest
10b70 20 74 65 72 6d 20 69 6e 20 74 68 65 20 73 65 67   term in the seg
10b80 6d 65 6e 74 20 74 68 61 74 0a 2a 2a 20 69 73 20  ment that.** is 
10b90 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68 65 20  larger than the 
10ba0 73 70 65 63 69 66 69 65 64 20 74 65 72 6d 2c 20  specified term, 
10bb0 65 76 65 6e 20 69 66 20 74 68 69 73 20 74 65 72  even if this ter
10bc0 6d 20 69 73 20 6e 6f 74 20 6f 6e 20 74 68 65 0a  m is not on the.
10bd0 2a 2a 20 63 75 72 72 65 6e 74 20 70 61 67 65 2e  ** current page.
10be0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
10bf0 66 74 73 35 4c 65 61 66 53 65 65 6b 28 0a 20 20  fts5LeafSeek(.  
10c00 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 20 20  Fts5Index *p,   
10c10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10c20 2f 2a 20 4c 65 61 76 65 20 61 6e 79 20 65 72 72  /* Leave any err
10c30 6f 72 20 63 6f 64 65 20 68 65 72 65 20 2a 2f 0a  or code here */.
10c40 20 20 69 6e 74 20 62 47 65 2c 20 20 20 20 20 20    int bGe,      
10c50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10c60 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 61 20    /* True for a 
10c70 3e 3d 20 73 65 61 72 63 68 20 2a 2f 0a 20 20 46  >= search */.  F
10c80 74 73 35 53 65 67 49 74 65 72 20 2a 70 49 74 65  ts5SegIter *pIte
10c90 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  r,             /
10ca0 2a 20 49 74 65 72 61 74 6f 72 20 74 6f 20 73 65  * Iterator to se
10cb0 65 6b 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 75 38  ek */.  const u8
10cc0 20 2a 70 54 65 72 6d 2c 20 69 6e 74 20 6e 54 65   *pTerm, int nTe
10cd0 72 6d 20 20 20 20 20 20 2f 2a 20 54 65 72 6d 20  rm      /* Term 
10ce0 74 6f 20 73 65 61 72 63 68 20 66 6f 72 20 2a 2f  to search for */
10cf0 0a 29 7b 0a 20 20 69 6e 74 20 69 4f 66 66 3b 0a  .){.  int iOff;.
10d00 20 20 63 6f 6e 73 74 20 75 38 20 2a 61 20 3d 20    const u8 *a = 
10d10 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 70 3b  pIter->pLeaf->p;
10d20 0a 20 20 69 6e 74 20 73 7a 4c 65 61 66 20 3d 20  .  int szLeaf = 
10d30 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 73 7a  pIter->pLeaf->sz
10d40 4c 65 61 66 3b 0a 20 20 69 6e 74 20 6e 20 3d 20  Leaf;.  int n = 
10d50 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 6e 6e  pIter->pLeaf->nn
10d60 3b 0a 0a 20 20 69 6e 74 20 6e 4d 61 74 63 68 20  ;..  int nMatch 
10d70 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 4b 65 65 70  = 0;.  int nKeep
10d80 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 4e 65 77   = 0;.  int nNew
10d90 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 54 65 72   = 0;.  int iTer
10da0 6d 4f 66 66 3b 0a 20 20 69 6e 74 20 69 50 67 69  mOff;.  int iPgi
10db0 64 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  dx;             
10dc0 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65          /* Curre
10dd0 6e 74 20 6f 66 66 73 65 74 20 69 6e 20 70 67 69  nt offset in pgi
10de0 64 78 20 2a 2f 0a 20 20 69 6e 74 20 62 45 6e 64  dx */.  int bEnd
10df0 4f 66 50 61 67 65 20 3d 20 30 3b 0a 0a 20 20 61  OfPage = 0;..  a
10e00 73 73 65 72 74 28 20 70 2d 3e 72 63 3d 3d 53 51  ssert( p->rc==SQ
10e10 4c 49 54 45 5f 4f 4b 20 29 3b 0a 0a 20 20 69 50  LITE_OK );..  iP
10e20 67 69 64 78 20 3d 20 73 7a 4c 65 61 66 3b 0a 20  gidx = szLeaf;. 
10e30 20 69 50 67 69 64 78 20 2b 3d 20 66 74 73 35 47   iPgidx += fts5G
10e40 65 74 56 61 72 69 6e 74 33 32 28 26 61 5b 69 50  etVarint32(&a[iP
10e50 67 69 64 78 5d 2c 20 69 54 65 72 6d 4f 66 66 29  gidx], iTermOff)
10e60 3b 0a 20 20 69 4f 66 66 20 3d 20 69 54 65 72 6d  ;.  iOff = iTerm
10e70 4f 66 66 3b 0a 0a 20 20 77 68 69 6c 65 28 20 31  Off;..  while( 1
10e80 20 29 7b 0a 0a 20 20 20 20 2f 2a 20 46 69 67 75   ){..    /* Figu
10e90 72 65 20 6f 75 74 20 68 6f 77 20 6d 61 6e 79 20  re out how many 
10ea0 6e 65 77 20 62 79 74 65 73 20 61 72 65 20 69 6e  new bytes are in
10eb0 20 74 68 69 73 20 74 65 72 6d 20 2a 2f 0a 20 20   this term */.  
10ec0 20 20 66 74 73 35 46 61 73 74 47 65 74 56 61 72    fts5FastGetVar
10ed0 69 6e 74 33 32 28 61 2c 20 69 4f 66 66 2c 20 6e  int32(a, iOff, n
10ee0 4e 65 77 29 3b 0a 20 20 20 20 69 66 28 20 6e 4b  New);.    if( nK
10ef0 65 65 70 3c 6e 4d 61 74 63 68 20 29 7b 0a 20 20  eep<nMatch ){.  
10f00 20 20 20 20 67 6f 74 6f 20 73 65 61 72 63 68 5f      goto search_
10f10 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 0a 20  failed;.    }.. 
10f20 20 20 20 61 73 73 65 72 74 28 20 6e 4b 65 65 70     assert( nKeep
10f30 3e 3d 6e 4d 61 74 63 68 20 29 3b 0a 20 20 20 20  >=nMatch );.    
10f40 69 66 28 20 6e 4b 65 65 70 3d 3d 6e 4d 61 74 63  if( nKeep==nMatc
10f50 68 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e  h ){.      int n
10f60 43 6d 70 3b 0a 20 20 20 20 20 20 69 6e 74 20 69  Cmp;.      int i
10f70 3b 0a 20 20 20 20 20 20 6e 43 6d 70 20 3d 20 4d  ;.      nCmp = M
10f80 49 4e 28 6e 4e 65 77 2c 20 6e 54 65 72 6d 2d 6e  IN(nNew, nTerm-n
10f90 4d 61 74 63 68 29 3b 0a 20 20 20 20 20 20 66 6f  Match);.      fo
10fa0 72 28 69 3d 30 3b 20 69 3c 6e 43 6d 70 3b 20 69  r(i=0; i<nCmp; i
10fb0 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  ++){.        if(
10fc0 20 61 5b 69 4f 66 66 2b 69 5d 21 3d 70 54 65 72   a[iOff+i]!=pTer
10fd0 6d 5b 6e 4d 61 74 63 68 2b 69 5d 20 29 20 62 72  m[nMatch+i] ) br
10fe0 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
10ff0 20 20 20 6e 4d 61 74 63 68 20 2b 3d 20 69 3b 0a     nMatch += i;.
11000 0a 20 20 20 20 20 20 69 66 28 20 6e 54 65 72 6d  .      if( nTerm
11010 3d 3d 6e 4d 61 74 63 68 20 29 7b 0a 20 20 20 20  ==nMatch ){.    
11020 20 20 20 20 69 66 28 20 69 3d 3d 6e 4e 65 77 20      if( i==nNew 
11030 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74  ){.          got
11040 6f 20 73 65 61 72 63 68 5f 73 75 63 63 65 73 73  o search_success
11050 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
11060 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20  .          goto 
11070 73 65 61 72 63 68 5f 66 61 69 6c 65 64 3b 0a 20  search_failed;. 
11080 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
11090 65 6c 73 65 20 69 66 28 20 69 3c 6e 4e 65 77 20  else if( i<nNew 
110a0 26 26 20 61 5b 69 4f 66 66 2b 69 5d 3e 70 54 65  && a[iOff+i]>pTe
110b0 72 6d 5b 6e 4d 61 74 63 68 5d 20 29 7b 0a 20 20  rm[nMatch] ){.  
110c0 20 20 20 20 20 20 67 6f 74 6f 20 73 65 61 72 63        goto searc
110d0 68 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 20 20  h_failed;.      
110e0 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28  }.    }..    if(
110f0 20 69 50 67 69 64 78 3e 3d 6e 20 29 7b 0a 20 20   iPgidx>=n ){.  
11100 20 20 20 20 62 45 6e 64 4f 66 50 61 67 65 20 3d      bEndOfPage =
11110 20 31 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   1;.      break;
11120 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 50 67 69  .    }..    iPgi
11130 64 78 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72  dx += fts5GetVar
11140 69 6e 74 33 32 28 26 61 5b 69 50 67 69 64 78 5d  int32(&a[iPgidx]
11150 2c 20 6e 4b 65 65 70 29 3b 0a 20 20 20 20 69 54  , nKeep);.    iT
11160 65 72 6d 4f 66 66 20 2b 3d 20 6e 4b 65 65 70 3b  ermOff += nKeep;
11170 0a 20 20 20 20 69 4f 66 66 20 3d 20 69 54 65 72  .    iOff = iTer
11180 6d 4f 66 66 3b 0a 0a 20 20 20 20 2f 2a 20 52 65  mOff;..    /* Re
11190 61 64 20 74 68 65 20 6e 4b 65 65 70 20 66 69 65  ad the nKeep fie
111a0 6c 64 20 6f 66 20 74 68 65 20 6e 65 78 74 20 74  ld of the next t
111b0 65 72 6d 2e 20 2a 2f 0a 20 20 20 20 66 74 73 35  erm. */.    fts5
111c0 46 61 73 74 47 65 74 56 61 72 69 6e 74 33 32 28  FastGetVarint32(
111d0 61 2c 20 69 4f 66 66 2c 20 6e 4b 65 65 70 29 3b  a, iOff, nKeep);
111e0 0a 20 20 7d 0a 0a 20 73 65 61 72 63 68 5f 66 61  .  }.. search_fa
111f0 69 6c 65 64 3a 0a 20 20 69 66 28 20 62 47 65 3d  iled:.  if( bGe=
11200 3d 30 20 29 7b 0a 20 20 20 20 66 74 73 35 44 61  =0 ){.    fts5Da
11210 74 61 52 65 6c 65 61 73 65 28 70 49 74 65 72 2d  taRelease(pIter-
11220 3e 70 4c 65 61 66 29 3b 0a 20 20 20 20 70 49 74  >pLeaf);.    pIt
11230 65 72 2d 3e 70 4c 65 61 66 20 3d 20 30 3b 0a 20  er->pLeaf = 0;. 
11240 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 65 6c     return;.  }el
11250 73 65 20 69 66 28 20 62 45 6e 64 4f 66 50 61 67  se if( bEndOfPag
11260 65 20 29 7b 0a 20 20 20 20 64 6f 20 7b 0a 20 20  e ){.    do {.  
11270 20 20 20 20 66 74 73 35 53 65 67 49 74 65 72 4e      fts5SegIterN
11280 65 78 74 50 61 67 65 28 70 2c 20 70 49 74 65 72  extPage(p, pIter
11290 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49 74  );.      if( pIt
112a0 65 72 2d 3e 70 4c 65 61 66 3d 3d 30 20 29 20 72  er->pLeaf==0 ) r
112b0 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 61 20 3d  eturn;.      a =
112c0 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 70   pIter->pLeaf->p
112d0 3b 0a 20 20 20 20 20 20 69 66 28 20 66 74 73 35  ;.      if( fts5
112e0 4c 65 61 66 49 73 54 65 72 6d 6c 65 73 73 28 70  LeafIsTermless(p
112f0 49 74 65 72 2d 3e 70 4c 65 61 66 29 3d 3d 30 20  Iter->pLeaf)==0 
11300 29 7b 0a 20 20 20 20 20 20 20 20 69 50 67 69 64  ){.        iPgid
11310 78 20 3d 20 70 49 74 65 72 2d 3e 70 4c 65 61 66  x = pIter->pLeaf
11320 2d 3e 73 7a 4c 65 61 66 3b 0a 20 20 20 20 20 20  ->szLeaf;.      
11330 20 20 69 50 67 69 64 78 20 2b 3d 20 66 74 73 35    iPgidx += fts5
11340 47 65 74 56 61 72 69 6e 74 33 32 28 26 70 49 74  GetVarint32(&pIt
11350 65 72 2d 3e 70 4c 65 61 66 2d 3e 70 5b 69 50 67  er->pLeaf->p[iPg
11360 69 64 78 5d 2c 20 69 4f 66 66 29 3b 0a 20 20 20  idx], iOff);.   
11370 20 20 20 20 20 69 66 28 20 69 4f 66 66 3c 34 20       if( iOff<4 
11380 7c 7c 20 69 4f 66 66 3e 3d 70 49 74 65 72 2d 3e  || iOff>=pIter->
11390 70 4c 65 61 66 2d 3e 73 7a 4c 65 61 66 20 29 7b  pLeaf->szLeaf ){
113a0 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 72 63  .          p->rc
113b0 20 3d 20 46 54 53 35 5f 43 4f 52 52 55 50 54 3b   = FTS5_CORRUPT;
113c0 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
113d0 20 20 20 20 20 20 20 20 20 20 6e 4b 65 65 70 20            nKeep 
113e0 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 69  = 0;.          i
113f0 54 65 72 6d 4f 66 66 20 3d 20 69 4f 66 66 3b 0a  TermOff = iOff;.
11400 20 20 20 20 20 20 20 20 20 20 6e 20 3d 20 70 49            n = pI
11410 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 6e 6e 3b 0a  ter->pLeaf->nn;.
11420 20 20 20 20 20 20 20 20 20 20 69 4f 66 66 20 2b            iOff +
11430 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e 74 33  = fts5GetVarint3
11440 32 28 26 61 5b 69 4f 66 66 5d 2c 20 6e 4e 65 77  2(&a[iOff], nNew
11450 29 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65  );.          bre
11460 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ak;.        }.  
11470 20 20 20 20 7d 0a 20 20 20 20 7d 77 68 69 6c 65      }.    }while
11480 28 20 31 20 29 3b 0a 20 20 7d 0a 0a 20 73 65 61  ( 1 );.  }.. sea
11490 72 63 68 5f 73 75 63 63 65 73 73 3a 0a 0a 20 20  rch_success:..  
114a0 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73  pIter->iLeafOffs
114b0 65 74 20 3d 20 69 4f 66 66 20 2b 20 6e 4e 65 77  et = iOff + nNew
114c0 3b 0a 20 20 70 49 74 65 72 2d 3e 69 54 65 72 6d  ;.  pIter->iTerm
114d0 4c 65 61 66 4f 66 66 73 65 74 20 3d 20 70 49 74  LeafOffset = pIt
114e0 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 3b  er->iLeafOffset;
114f0 0a 20 20 70 49 74 65 72 2d 3e 69 54 65 72 6d 4c  .  pIter->iTermL
11500 65 61 66 50 67 6e 6f 20 3d 20 70 49 74 65 72 2d  eafPgno = pIter-
11510 3e 69 4c 65 61 66 50 67 6e 6f 3b 0a 0a 20 20 66  >iLeafPgno;..  f
11520 74 73 35 42 75 66 66 65 72 53 65 74 28 26 70 2d  ts5BufferSet(&p-
11530 3e 72 63 2c 20 26 70 49 74 65 72 2d 3e 74 65 72  >rc, &pIter->ter
11540 6d 2c 20 6e 4b 65 65 70 2c 20 70 54 65 72 6d 29  m, nKeep, pTerm)
11550 3b 0a 20 20 66 74 73 35 42 75 66 66 65 72 41 70  ;.  fts5BufferAp
11560 70 65 6e 64 42 6c 6f 62 28 26 70 2d 3e 72 63 2c  pendBlob(&p->rc,
11570 20 26 70 49 74 65 72 2d 3e 74 65 72 6d 2c 20 6e   &pIter->term, n
11580 4e 65 77 2c 20 26 61 5b 69 4f 66 66 5d 29 3b 0a  New, &a[iOff]);.
11590 0a 20 20 69 66 28 20 69 50 67 69 64 78 3e 3d 6e  .  if( iPgidx>=n
115a0 20 29 7b 0a 20 20 20 20 70 49 74 65 72 2d 3e 69   ){.    pIter->i
115b0 45 6e 64 6f 66 44 6f 63 6c 69 73 74 20 3d 20 70  EndofDoclist = p
115c0 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 6e 6e 2b  Iter->pLeaf->nn+
115d0 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  1;.  }else{.    
115e0 69 6e 74 20 6e 45 78 74 72 61 3b 0a 20 20 20 20  int nExtra;.    
115f0 69 50 67 69 64 78 20 2b 3d 20 66 74 73 35 47 65  iPgidx += fts5Ge
11600 74 56 61 72 69 6e 74 33 32 28 26 61 5b 69 50 67  tVarint32(&a[iPg
11610 69 64 78 5d 2c 20 6e 45 78 74 72 61 29 3b 0a 20  idx], nExtra);. 
11620 20 20 20 70 49 74 65 72 2d 3e 69 45 6e 64 6f 66     pIter->iEndof
11630 44 6f 63 6c 69 73 74 20 3d 20 69 54 65 72 6d 4f  Doclist = iTermO
11640 66 66 20 2b 20 6e 45 78 74 72 61 3b 0a 20 20 7d  ff + nExtra;.  }
11650 0a 20 20 70 49 74 65 72 2d 3e 69 50 67 69 64 78  .  pIter->iPgidx
11660 4f 66 66 20 3d 20 69 50 67 69 64 78 3b 0a 0a 20  Off = iPgidx;.. 
11670 20 66 74 73 35 53 65 67 49 74 65 72 4c 6f 61 64   fts5SegIterLoad
11680 52 6f 77 69 64 28 70 2c 20 70 49 74 65 72 29 3b  Rowid(p, pIter);
11690 0a 20 20 66 74 73 35 53 65 67 49 74 65 72 4c 6f  .  fts5SegIterLo
116a0 61 64 4e 50 6f 73 28 70 2c 20 70 49 74 65 72 29  adNPos(p, pIter)
116b0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69  ;.}../*.** Initi
116c0 61 6c 69 7a 65 20 74 68 65 20 6f 62 6a 65 63 74  alize the object
116d0 20 70 49 74 65 72 20 74 6f 20 70 6f 69 6e 74 20   pIter to point 
116e0 74 6f 20 74 65 72 6d 20 70 54 65 72 6d 2f 6e 54  to term pTerm/nT
116f0 65 72 6d 20 77 69 74 68 69 6e 20 73 65 67 6d 65  erm within segme
11700 6e 74 0a 2a 2a 20 70 53 65 67 2e 20 49 66 20 74  nt.** pSeg. If t
11710 68 65 72 65 20 69 73 20 6e 6f 20 73 75 63 68 20  here is no such 
11720 74 65 72 6d 20 69 6e 20 74 68 65 20 69 6e 64 65  term in the inde
11730 78 2c 20 74 68 65 20 69 74 65 72 61 74 6f 72 20  x, the iterator 
11740 69 73 20 73 65 74 20 74 6f 20 45 4f 46 2e 0a 2a  is set to EOF..*
11750 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72  *.** If an error
11760 20 6f 63 63 75 72 73 2c 20 46 74 73 35 49 6e 64   occurs, Fts5Ind
11770 65 78 2e 72 63 20 69 73 20 73 65 74 20 74 6f 20  ex.rc is set to 
11780 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65 20 65  an appropriate e
11790 72 72 6f 72 20 63 6f 64 65 2e 20 49 66 20 0a 2a  rror code. If .*
117a0 2a 20 61 6e 20 65 72 72 6f 72 20 68 61 73 20 61  * an error has a
117b0 6c 72 65 61 64 79 20 6f 63 63 75 72 72 65 64 20  lready occurred 
117c0 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69  when this functi
117d0 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20 69 74  on is called, it
117e0 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a   is a no-op..*/.
117f0 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
11800 53 65 67 49 74 65 72 53 65 65 6b 49 6e 69 74 28  SegIterSeekInit(
11810 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c  .  Fts5Index *p,
11820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11830 20 20 20 2f 2a 20 46 54 53 35 20 62 61 63 6b 65     /* FTS5 backe
11840 6e 64 20 2a 2f 0a 20 20 46 74 73 35 42 75 66 66  nd */.  Fts5Buff
11850 65 72 20 2a 70 42 75 66 2c 20 20 20 20 20 20 20  er *pBuf,       
11860 20 20 20 20 20 20 20 20 2f 2a 20 42 75 66 66 65          /* Buffe
11870 72 20 74 6f 20 75 73 65 20 66 6f 72 20 6c 6f 61  r to use for loa
11880 64 69 6e 67 20 70 61 67 65 73 20 2a 2f 0a 20 20  ding pages */.  
11890 63 6f 6e 73 74 20 75 38 20 2a 70 54 65 72 6d 2c  const u8 *pTerm,
118a0 20 69 6e 74 20 6e 54 65 72 6d 2c 20 20 20 20 20   int nTerm,     
118b0 2f 2a 20 54 65 72 6d 20 74 6f 20 73 65 65 6b 20  /* Term to seek 
118c0 74 6f 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67  to */.  int flag
118d0 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s,              
118e0 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20          /* Mask 
118f0 6f 66 20 46 54 53 35 49 4e 44 45 58 5f 58 58 58  of FTS5INDEX_XXX
11900 20 66 6c 61 67 73 20 2a 2f 0a 20 20 46 74 73 35   flags */.  Fts5
11910 53 74 72 75 63 74 75 72 65 53 65 67 6d 65 6e 74  StructureSegment
11920 20 2a 70 53 65 67 2c 20 20 20 20 20 2f 2a 20 44   *pSeg,     /* D
11930 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 73 65  escription of se
11940 67 6d 65 6e 74 20 2a 2f 0a 20 20 46 74 73 35 53  gment */.  Fts5S
11950 65 67 49 74 65 72 20 2a 70 49 74 65 72 20 20 20  egIter *pIter   
11960 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 62             /* Ob
11970 6a 65 63 74 20 74 6f 20 70 6f 70 75 6c 61 74 65  ject to populate
11980 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 50 67   */.){.  int iPg
11990 20 3d 20 31 3b 0a 20 20 69 6e 74 20 62 47 65 20   = 1;.  int bGe 
119a0 3d 20 28 66 6c 61 67 73 20 26 20 46 54 53 35 49  = (flags & FTS5I
119b0 4e 44 45 58 5f 51 55 45 52 59 5f 53 43 41 4e 29  NDEX_QUERY_SCAN)
119c0 3b 0a 20 20 69 6e 74 20 62 44 6c 69 64 78 20 3d  ;.  int bDlidx =
119d0 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
119e0 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74      /* True if t
119f0 68 65 72 65 20 69 73 20 61 20 64 6f 63 6c 69 73  here is a doclis
11a00 74 2d 69 6e 64 65 78 20 2a 2f 0a 0a 20 20 73 74  t-index */..  st
11a10 61 74 69 63 20 69 6e 74 20 6e 43 61 6c 6c 20 3d  atic int nCall =
11a20 20 30 3b 0a 20 20 6e 43 61 6c 6c 2b 2b 3b 0a 0a   0;.  nCall++;..
11a30 20 20 61 73 73 65 72 74 28 20 62 47 65 3d 3d 30    assert( bGe==0
11a40 20 7c 7c 20 28 66 6c 61 67 73 20 26 20 46 54 53   || (flags & FTS
11a50 35 49 4e 44 45 58 5f 51 55 45 52 59 5f 44 45 53  5INDEX_QUERY_DES
11a60 43 29 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  C)==0 );.  asser
11a70 74 28 20 70 54 65 72 6d 20 26 26 20 6e 54 65 72  t( pTerm && nTer
11a80 6d 20 29 3b 0a 20 20 6d 65 6d 73 65 74 28 70 49  m );.  memset(pI
11a90 74 65 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a  ter, 0, sizeof(*
11aa0 70 49 74 65 72 29 29 3b 0a 20 20 70 49 74 65 72  pIter));.  pIter
11ab0 2d 3e 70 53 65 67 20 3d 20 70 53 65 67 3b 0a 0a  ->pSeg = pSeg;..
11ac0 20 20 2f 2a 20 54 68 69 73 20 62 6c 6f 63 6b 20    /* This block 
11ad0 73 65 74 73 20 73 74 61 63 6b 20 76 61 72 69 61  sets stack varia
11ae0 62 6c 65 20 69 50 67 20 74 6f 20 74 68 65 20 6c  ble iPg to the l
11af0 65 61 66 20 70 61 67 65 20 6e 75 6d 62 65 72 20  eaf page number 
11b00 74 68 61 74 20 6d 61 79 0a 20 20 2a 2a 20 63 6f  that may.  ** co
11b10 6e 74 61 69 6e 20 74 65 72 6d 20 28 70 54 65 72  ntain term (pTer
11b20 6d 2f 6e 54 65 72 6d 29 2c 20 69 66 20 69 74 20  m/nTerm), if it 
11b30 69 73 20 70 72 65 73 65 6e 74 20 69 6e 20 74 68  is present in th
11b40 65 20 73 65 67 6d 65 6e 74 2e 20 2a 2f 0a 20 20  e segment. */.  
11b50 69 66 28 20 70 2d 3e 70 49 64 78 53 65 6c 65 63  if( p->pIdxSelec
11b60 74 3d 3d 30 20 29 7b 0a 20 20 20 20 46 74 73 35  t==0 ){.    Fts5
11b70 43 6f 6e 66 69 67 20 2a 70 43 6f 6e 66 69 67 20  Config *pConfig 
11b80 3d 20 70 2d 3e 70 43 6f 6e 66 69 67 3b 0a 20 20  = p->pConfig;.  
11b90 20 20 66 74 73 35 49 6e 64 65 78 50 72 65 70 61    fts5IndexPrepa
11ba0 72 65 53 74 6d 74 28 70 2c 20 26 70 2d 3e 70 49  reStmt(p, &p->pI
11bb0 64 78 53 65 6c 65 63 74 2c 20 73 71 6c 69 74 65  dxSelect, sqlite
11bc0 33 5f 6d 70 72 69 6e 74 66 28 0a 20 20 20 20 20  3_mprintf(.     
11bd0 20 20 20 20 20 22 53 45 4c 45 43 54 20 70 67 6e       "SELECT pgn
11be0 6f 20 46 52 4f 4d 20 27 25 71 27 2e 27 25 71 5f  o FROM '%q'.'%q_
11bf0 69 64 78 27 20 57 48 45 52 45 20 22 0a 20 20 20  idx' WHERE ".   
11c00 20 20 20 20 20 20 20 22 73 65 67 69 64 3d 3f 20         "segid=? 
11c10 41 4e 44 20 74 65 72 6d 3c 3d 3f 20 4f 52 44 45  AND term<=? ORDE
11c20 52 20 42 59 20 74 65 72 6d 20 44 45 53 43 20 4c  R BY term DESC L
11c30 49 4d 49 54 20 31 22 2c 0a 20 20 20 20 20 20 20  IMIT 1",.       
11c40 20 20 20 70 43 6f 6e 66 69 67 2d 3e 7a 44 62 2c     pConfig->zDb,
11c50 20 70 43 6f 6e 66 69 67 2d 3e 7a 4e 61 6d 65 0a   pConfig->zName.
11c60 20 20 20 20 29 29 3b 0a 20 20 7d 0a 20 20 69 66      ));.  }.  if
11c70 28 20 70 2d 3e 72 63 20 29 20 72 65 74 75 72 6e  ( p->rc ) return
11c80 3b 0a 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64  ;.  sqlite3_bind
11c90 5f 69 6e 74 28 70 2d 3e 70 49 64 78 53 65 6c 65  _int(p->pIdxSele
11ca0 63 74 2c 20 31 2c 20 70 53 65 67 2d 3e 69 53 65  ct, 1, pSeg->iSe
11cb0 67 69 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  gid);.  sqlite3_
11cc0 62 69 6e 64 5f 62 6c 6f 62 28 70 2d 3e 70 49 64  bind_blob(p->pId
11cd0 78 53 65 6c 65 63 74 2c 20 32 2c 20 70 54 65 72  xSelect, 2, pTer
11ce0 6d 2c 20 6e 54 65 72 6d 2c 20 53 51 4c 49 54 45  m, nTerm, SQLITE
11cf0 5f 53 54 41 54 49 43 29 3b 0a 20 20 69 66 28 20  _STATIC);.  if( 
11d00 53 51 4c 49 54 45 5f 52 4f 57 3d 3d 73 71 6c 69  SQLITE_ROW==sqli
11d10 74 65 33 5f 73 74 65 70 28 70 2d 3e 70 49 64 78  te3_step(p->pIdx
11d20 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 69  Select) ){.    i
11d30 36 34 20 76 61 6c 20 3d 20 73 71 6c 69 74 65 33  64 val = sqlite3
11d40 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 2d 3e 70  _column_int(p->p
11d50 49 64 78 53 65 6c 65 63 74 2c 20 30 29 3b 0a 20  IdxSelect, 0);. 
11d60 20 20 20 69 50 67 20 3d 20 28 69 6e 74 29 28 76     iPg = (int)(v
11d70 61 6c 3e 3e 31 29 3b 0a 20 20 20 20 62 44 6c 69  al>>1);.    bDli
11d80 64 78 20 3d 20 28 76 61 6c 20 26 20 30 78 30 30  dx = (val & 0x00
11d90 30 31 29 3b 0a 20 20 7d 0a 20 20 70 2d 3e 72 63  01);.  }.  p->rc
11da0 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74   = sqlite3_reset
11db0 28 70 2d 3e 70 49 64 78 53 65 6c 65 63 74 29 3b  (p->pIdxSelect);
11dc0 0a 0a 20 20 69 66 28 20 69 50 67 3c 70 53 65 67  ..  if( iPg<pSeg
11dd0 2d 3e 70 67 6e 6f 46 69 72 73 74 20 29 7b 0a 20  ->pgnoFirst ){. 
11de0 20 20 20 69 50 67 20 3d 20 70 53 65 67 2d 3e 70     iPg = pSeg->p
11df0 67 6e 6f 46 69 72 73 74 3b 0a 20 20 20 20 62 44  gnoFirst;.    bD
11e00 6c 69 64 78 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20  lidx = 0;.  }.. 
11e10 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e   pIter->iLeafPgn
11e20 6f 20 3d 20 69 50 67 20 2d 20 31 3b 0a 20 20 66  o = iPg - 1;.  f
11e30 74 73 35 53 65 67 49 74 65 72 4e 65 78 74 50 61  ts5SegIterNextPa
11e40 67 65 28 70 2c 20 70 49 74 65 72 29 3b 0a 0a 20  ge(p, pIter);.. 
11e50 20 69 66 28 20 70 49 74 65 72 2d 3e 70 4c 65 61   if( pIter->pLea
11e60 66 20 29 7b 0a 20 20 20 20 66 74 73 35 4c 65 61  f ){.    fts5Lea
11e70 66 53 65 65 6b 28 70 2c 20 62 47 65 2c 20 70 49  fSeek(p, bGe, pI
11e80 74 65 72 2c 20 70 54 65 72 6d 2c 20 6e 54 65 72  ter, pTerm, nTer
11e90 6d 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70  m);.  }..  if( p
11ea0 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
11eb0 26 26 20 62 47 65 3d 3d 30 20 29 7b 0a 20 20 20  && bGe==0 ){.   
11ec0 20 70 49 74 65 72 2d 3e 66 6c 61 67 73 20 7c 3d   pIter->flags |=
11ed0 20 46 54 53 35 5f 53 45 47 49 54 45 52 5f 4f 4e   FTS5_SEGITER_ON
11ee0 45 54 45 52 4d 3b 0a 20 20 20 20 69 66 28 20 70  ETERM;.    if( p
11ef0 49 74 65 72 2d 3e 70 4c 65 61 66 20 29 7b 0a 20  Iter->pLeaf ){. 
11f00 20 20 20 20 20 69 66 28 20 66 6c 61 67 73 20 26       if( flags &
11f10 20 46 54 53 35 49 4e 44 45 58 5f 51 55 45 52 59   FTS5INDEX_QUERY
11f20 5f 44 45 53 43 20 29 7b 0a 20 20 20 20 20 20 20  _DESC ){.       
11f30 20 70 49 74 65 72 2d 3e 66 6c 61 67 73 20 7c 3d   pIter->flags |=
11f40 20 46 54 53 35 5f 53 45 47 49 54 45 52 5f 52 45   FTS5_SEGITER_RE
11f50 56 45 52 53 45 3b 0a 20 20 20 20 20 20 7d 0a 20  VERSE;.      }. 
11f60 20 20 20 20 20 69 66 28 20 62 44 6c 69 64 78 20       if( bDlidx 
11f70 29 7b 0a 20 20 20 20 20 20 20 20 66 74 73 35 53  ){.        fts5S
11f80 65 67 49 74 65 72 4c 6f 61 64 44 6c 69 64 78 28  egIterLoadDlidx(
11f90 70 2c 20 70 49 74 65 72 29 3b 0a 20 20 20 20 20  p, pIter);.     
11fa0 20 7d 0a 20 20 20 20 20 20 69 66 28 20 66 6c 61   }.      if( fla
11fb0 67 73 20 26 20 46 54 53 35 49 4e 44 45 58 5f 51  gs & FTS5INDEX_Q
11fc0 55 45 52 59 5f 44 45 53 43 20 29 7b 0a 20 20 20  UERY_DESC ){.   
11fd0 20 20 20 20 20 66 74 73 35 53 65 67 49 74 65 72       fts5SegIter
11fe0 52 65 76 65 72 73 65 28 70 2c 20 70 49 74 65 72  Reverse(p, pIter
11ff0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
12000 0a 20 20 7d 0a 0a 20 20 66 74 73 35 53 65 67 49  .  }..  fts5SegI
12010 74 65 72 53 65 74 4e 65 78 74 28 70 2c 20 70 49  terSetNext(p, pI
12020 74 65 72 29 3b 0a 0a 20 20 2f 2a 20 45 69 74 68  ter);..  /* Eith
12030 65 72 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  er:.  **.  **   
12040 31 29 20 61 6e 20 65 72 72 6f 72 20 68 61 73 20  1) an error has 
12050 6f 63 63 75 72 72 65 64 2c 20 6f 72 0a 20 20 2a  occurred, or.  *
12060 2a 20 20 20 32 29 20 74 68 65 20 69 74 65 72 61  *   2) the itera
12070 74 6f 72 20 70 6f 69 6e 74 73 20 74 6f 20 45 4f  tor points to EO
12080 46 2c 20 6f 72 0a 20 20 2a 2a 20 20 20 33 29 20  F, or.  **   3) 
12090 74 68 65 20 69 74 65 72 61 74 6f 72 20 70 6f 69  the iterator poi
120a0 6e 74 73 20 74 6f 20 61 6e 20 65 6e 74 72 79 20  nts to an entry 
120b0 77 69 74 68 20 74 65 72 6d 20 28 70 54 65 72 6d  with term (pTerm
120c0 2f 6e 54 65 72 6d 29 2c 20 6f 72 0a 20 20 2a 2a  /nTerm), or.  **
120d0 20 20 20 34 29 20 74 68 65 20 46 54 53 35 49 4e     4) the FTS5IN
120e0 44 45 58 5f 51 55 45 52 59 5f 53 43 41 4e 20 66  DEX_QUERY_SCAN f
120f0 6c 61 67 20 77 61 73 20 73 65 74 20 61 6e 64 20  lag was set and 
12100 74 68 65 20 69 74 65 72 61 74 6f 72 20 70 6f 69  the iterator poi
12110 6e 74 73 0a 20 20 2a 2a 20 20 20 20 20 20 74 6f  nts.  **      to
12120 20 61 6e 20 65 6e 74 72 79 20 77 69 74 68 20 61   an entry with a
12130 20 74 65 72 6d 20 67 72 65 61 74 65 72 20 74 68   term greater th
12140 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 28  an or equal to (
12150 70 54 65 72 6d 2f 6e 54 65 72 6d 29 2e 0a 20 20  pTerm/nTerm)..  
12160 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  */.  assert( p->
12170 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 20 20  rc!=SQLITE_OK   
12180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
121a0 20 20 20 20 20 20 20 2f 2a 20 31 20 2a 2f 0a 20         /* 1 */. 
121b0 20 20 7c 7c 20 70 49 74 65 72 2d 3e 70 4c 65 61    || pIter->pLea
121c0 66 3d 3d 30 20 20 20 20 20 20 20 20 20 20 20 20  f==0            
121d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
121e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
121f0 20 20 20 2f 2a 20 32 20 2a 2f 0a 20 20 20 7c 7c     /* 2 */.   ||
12200 20 66 74 73 35 42 75 66 66 65 72 43 6f 6d 70 61   fts5BufferCompa
12210 72 65 42 6c 6f 62 28 26 70 49 74 65 72 2d 3e 74  reBlob(&pIter->t
12220 65 72 6d 2c 20 70 54 65 72 6d 2c 20 6e 54 65 72  erm, pTerm, nTer
12230 6d 29 3d 3d 30 20 20 20 20 20 20 20 20 20 20 2f  m)==0          /
12240 2a 20 33 20 2a 2f 0a 20 20 20 7c 7c 20 28 62 47  * 3 */.   || (bG
12250 65 20 26 26 20 66 74 73 35 42 75 66 66 65 72 43  e && fts5BufferC
12260 6f 6d 70 61 72 65 42 6c 6f 62 28 26 70 49 74 65  ompareBlob(&pIte
12270 72 2d 3e 74 65 72 6d 2c 20 70 54 65 72 6d 2c 20  r->term, pTerm, 
12280 6e 54 65 72 6d 29 3e 30 29 20 20 2f 2a 20 34 20  nTerm)>0)  /* 4 
12290 2a 2f 0a 20 20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  */.  );.}../*.**
122a0 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20   Initialize the 
122b0 6f 62 6a 65 63 74 20 70 49 74 65 72 20 74 6f 20  object pIter to 
122c0 70 6f 69 6e 74 20 74 6f 20 74 65 72 6d 20 70 54  point to term pT
122d0 65 72 6d 2f 6e 54 65 72 6d 20 77 69 74 68 69 6e  erm/nTerm within
122e0 20 74 68 65 0a 2a 2a 20 69 6e 2d 6d 65 6d 6f 72   the.** in-memor
122f0 79 20 68 61 73 68 20 74 61 62 6c 65 2e 20 49 66  y hash table. If
12300 20 74 68 65 72 65 20 69 73 20 6e 6f 20 73 75 63   there is no suc
12310 68 20 74 65 72 6d 20 69 6e 20 74 68 65 20 68 61  h term in the ha
12320 73 68 2d 74 61 62 6c 65 2c 20 74 68 65 20 0a 2a  sh-table, the .*
12330 2a 20 69 74 65 72 61 74 6f 72 20 69 73 20 73 65  * iterator is se
12340 74 20 74 6f 20 45 4f 46 2e 0a 2a 2a 0a 2a 2a 20  t to EOF..**.** 
12350 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
12360 72 73 2c 20 46 74 73 35 49 6e 64 65 78 2e 72 63  rs, Fts5Index.rc
12370 20 69 73 20 73 65 74 20 74 6f 20 61 6e 20 61 70   is set to an ap
12380 70 72 6f 70 72 69 61 74 65 20 65 72 72 6f 72 20  propriate error 
12390 63 6f 64 65 2e 20 49 66 20 0a 2a 2a 20 61 6e 20  code. If .** an 
123a0 65 72 72 6f 72 20 68 61 73 20 61 6c 72 65 61 64  error has alread
123b0 79 20 6f 63 63 75 72 72 65 64 20 77 68 65 6e 20  y occurred when 
123c0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
123d0 20 63 61 6c 6c 65 64 2c 20 69 74 20 69 73 20 61   called, it is a
123e0 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69   no-op..*/.stati
123f0 63 20 76 6f 69 64 20 66 74 73 35 53 65 67 49 74  c void fts5SegIt
12400 65 72 48 61 73 68 49 6e 69 74 28 0a 20 20 46 74  erHashInit(.  Ft
12410 73 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20  s5Index *p,     
12420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
12430 20 46 54 53 35 20 62 61 63 6b 65 6e 64 20 2a 2f   FTS5 backend */
12440 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 70 54 65  .  const u8 *pTe
12450 72 6d 2c 20 69 6e 74 20 6e 54 65 72 6d 2c 20 20  rm, int nTerm,  
12460 20 20 20 2f 2a 20 54 65 72 6d 20 74 6f 20 73 65     /* Term to se
12470 65 6b 20 74 6f 20 2a 2f 0a 20 20 69 6e 74 20 66  ek to */.  int f
12480 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20 20 20  lags,           
12490 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61             /* Ma
124a0 73 6b 20 6f 66 20 46 54 53 35 49 4e 44 45 58 5f  sk of FTS5INDEX_
124b0 58 58 58 20 66 6c 61 67 73 20 2a 2f 0a 20 20 46  XXX flags */.  F
124c0 74 73 35 53 65 67 49 74 65 72 20 2a 70 49 74 65  ts5SegIter *pIte
124d0 72 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  r              /
124e0 2a 20 4f 62 6a 65 63 74 20 74 6f 20 70 6f 70 75  * Object to popu
124f0 6c 61 74 65 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e  late */.){.  con
12500 73 74 20 75 38 20 2a 70 4c 69 73 74 20 3d 20 30  st u8 *pList = 0
12510 3b 0a 20 20 69 6e 74 20 6e 4c 69 73 74 20 3d 20  ;.  int nList = 
12520 30 3b 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 7a  0;.  const u8 *z
12530 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 20 3d 20   = 0;.  int n = 
12540 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 2d  0;..  assert( p-
12550 3e 70 48 61 73 68 20 29 3b 0a 20 20 61 73 73 65  >pHash );.  asse
12560 72 74 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  rt( p->rc==SQLIT
12570 45 5f 4f 4b 20 29 3b 0a 0a 20 20 69 66 28 20 70  E_OK );..  if( p
12580 54 65 72 6d 3d 3d 30 20 7c 7c 20 28 66 6c 61 67  Term==0 || (flag
12590 73 20 26 20 46 54 53 35 49 4e 44 45 58 5f 51 55  s & FTS5INDEX_QU
125a0 45 52 59 5f 53 43 41 4e 29 20 29 7b 0a 20 20 20  ERY_SCAN) ){.   
125b0 20 70 2d 3e 72 63 20 3d 20 73 71 6c 69 74 65 33   p->rc = sqlite3
125c0 46 74 73 35 48 61 73 68 53 63 61 6e 49 6e 69 74  Fts5HashScanInit
125d0 28 70 2d 3e 70 48 61 73 68 2c 20 28 63 6f 6e 73  (p->pHash, (cons
125e0 74 20 63 68 61 72 2a 29 70 54 65 72 6d 2c 20 6e  t char*)pTerm, n
125f0 54 65 72 6d 29 3b 0a 20 20 20 20 73 71 6c 69 74  Term);.    sqlit
12600 65 33 46 74 73 35 48 61 73 68 53 63 61 6e 45 6e  e3Fts5HashScanEn
12610 74 72 79 28 70 2d 3e 70 48 61 73 68 2c 20 28 63  try(p->pHash, (c
12620 6f 6e 73 74 20 63 68 61 72 2a 2a 29 26 7a 2c 20  onst char**)&z, 
12630 26 70 4c 69 73 74 2c 20 26 6e 4c 69 73 74 29 3b  &pList, &nList);
12640 0a 20 20 20 20 6e 20 3d 20 28 7a 20 3f 20 28 69  .    n = (z ? (i
12650 6e 74 29 73 74 72 6c 65 6e 28 28 63 6f 6e 73 74  nt)strlen((const
12660 20 63 68 61 72 2a 29 7a 29 20 3a 20 30 29 3b 0a   char*)z) : 0);.
12670 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 49 74    }else{.    pIt
12680 65 72 2d 3e 66 6c 61 67 73 20 7c 3d 20 46 54 53  er->flags |= FTS
12690 35 5f 53 45 47 49 54 45 52 5f 4f 4e 45 54 45 52  5_SEGITER_ONETER
126a0 4d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 46 74  M;.    sqlite3Ft
126b0 73 35 48 61 73 68 51 75 65 72 79 28 70 2d 3e 70  s5HashQuery(p->p
126c0 48 61 73 68 2c 20 28 63 6f 6e 73 74 20 63 68 61  Hash, (const cha
126d0 72 2a 29 70 54 65 72 6d 2c 20 6e 54 65 72 6d 2c  r*)pTerm, nTerm,
126e0 20 26 70 4c 69 73 74 2c 20 26 6e 4c 69 73 74 29   &pList, &nList)
126f0 3b 0a 20 20 20 20 7a 20 3d 20 70 54 65 72 6d 3b  ;.    z = pTerm;
12700 0a 20 20 20 20 6e 20 3d 20 6e 54 65 72 6d 3b 0a  .    n = nTerm;.
12710 20 20 7d 0a 0a 20 20 69 66 28 20 70 4c 69 73 74    }..  if( pList
12720 20 29 7b 0a 20 20 20 20 46 74 73 35 44 61 74 61   ){.    Fts5Data
12730 20 2a 70 4c 65 61 66 3b 0a 20 20 20 20 73 71 6c   *pLeaf;.    sql
12740 69 74 65 33 46 74 73 35 42 75 66 66 65 72 53 65  ite3Fts5BufferSe
12750 74 28 26 70 2d 3e 72 63 2c 20 26 70 49 74 65 72  t(&p->rc, &pIter
12760 2d 3e 74 65 72 6d 2c 20 6e 2c 20 7a 29 3b 0a 20  ->term, n, z);. 
12770 20 20 20 70 4c 65 61 66 20 3d 20 66 74 73 35 49     pLeaf = fts5I
12780 64 78 4d 61 6c 6c 6f 63 28 70 2c 20 73 69 7a 65  dxMalloc(p, size
12790 6f 66 28 46 74 73 35 44 61 74 61 29 29 3b 0a 20  of(Fts5Data));. 
127a0 20 20 20 69 66 28 20 70 4c 65 61 66 3d 3d 30 20     if( pLeaf==0 
127b0 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 70 4c  ) return;.    pL
127c0 65 61 66 2d 3e 70 20 3d 20 28 75 38 2a 29 70 4c  eaf->p = (u8*)pL
127d0 69 73 74 3b 0a 20 20 20 20 70 4c 65 61 66 2d 3e  ist;.    pLeaf->
127e0 6e 6e 20 3d 20 70 4c 65 61 66 2d 3e 73 7a 4c 65  nn = pLeaf->szLe
127f0 61 66 20 3d 20 6e 4c 69 73 74 3b 0a 20 20 20 20  af = nList;.    
12800 70 49 74 65 72 2d 3e 70 4c 65 61 66 20 3d 20 70  pIter->pLeaf = p
12810 4c 65 61 66 3b 0a 20 20 20 20 70 49 74 65 72 2d  Leaf;.    pIter-
12820 3e 69 4c 65 61 66 4f 66 66 73 65 74 20 3d 20 66  >iLeafOffset = f
12830 74 73 35 47 65 74 56 61 72 69 6e 74 28 70 4c 65  ts5GetVarint(pLe
12840 61 66 2d 3e 70 2c 20 28 75 36 34 2a 29 26 70 49  af->p, (u64*)&pI
12850 74 65 72 2d 3e 69 52 6f 77 69 64 29 3b 0a 20 20  ter->iRowid);.  
12860 20 20 70 49 74 65 72 2d 3e 69 45 6e 64 6f 66 44    pIter->iEndofD
12870 6f 63 6c 69 73 74 20 3d 20 70 4c 65 61 66 2d 3e  oclist = pLeaf->
12880 6e 6e 3b 0a 0a 20 20 20 20 69 66 28 20 66 6c 61  nn;..    if( fla
12890 67 73 20 26 20 46 54 53 35 49 4e 44 45 58 5f 51  gs & FTS5INDEX_Q
128a0 55 45 52 59 5f 44 45 53 43 20 29 7b 0a 20 20 20  UERY_DESC ){.   
128b0 20 20 20 70 49 74 65 72 2d 3e 66 6c 61 67 73 20     pIter->flags 
128c0 7c 3d 20 46 54 53 35 5f 53 45 47 49 54 45 52 5f  |= FTS5_SEGITER_
128d0 52 45 56 45 52 53 45 3b 0a 20 20 20 20 20 20 66  REVERSE;.      f
128e0 74 73 35 53 65 67 49 74 65 72 52 65 76 65 72 73  ts5SegIterRevers
128f0 65 49 6e 69 74 50 61 67 65 28 70 2c 20 70 49 74  eInitPage(p, pIt
12900 65 72 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  er);.    }else{.
12910 20 20 20 20 20 20 66 74 73 35 53 65 67 49 74 65        fts5SegIte
12920 72 4c 6f 61 64 4e 50 6f 73 28 70 2c 20 70 49 74  rLoadNPos(p, pIt
12930 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  er);.    }.  }..
12940 20 20 66 74 73 35 53 65 67 49 74 65 72 53 65 74    fts5SegIterSet
12950 4e 65 78 74 28 70 2c 20 70 49 74 65 72 29 3b 0a  Next(p, pIter);.
12960 7d 0a 0a 2f 2a 0a 2a 2a 20 5a 65 72 6f 20 74 68  }../*.** Zero th
12970 65 20 69 74 65 72 61 74 6f 72 20 70 61 73 73 65  e iterator passe
12980 64 20 61 73 20 74 68 65 20 6f 6e 6c 79 20 61 72  d as the only ar
12990 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69  gument..*/.stati
129a0 63 20 76 6f 69 64 20 66 74 73 35 53 65 67 49 74  c void fts5SegIt
129b0 65 72 43 6c 65 61 72 28 46 74 73 35 53 65 67 49  erClear(Fts5SegI
129c0 74 65 72 20 2a 70 49 74 65 72 29 7b 0a 20 20 66  ter *pIter){.  f
129d0 74 73 35 42 75 66 66 65 72 46 72 65 65 28 26 70  ts5BufferFree(&p
129e0 49 74 65 72 2d 3e 74 65 72 6d 29 3b 0a 20 20 66  Iter->term);.  f
129f0 74 73 35 44 61 74 61 52 65 6c 65 61 73 65 28 70  ts5DataRelease(p
12a00 49 74 65 72 2d 3e 70 4c 65 61 66 29 3b 0a 20 20  Iter->pLeaf);.  
12a10 66 74 73 35 44 61 74 61 52 65 6c 65 61 73 65 28  fts5DataRelease(
12a20 70 49 74 65 72 2d 3e 70 4e 65 78 74 4c 65 61 66  pIter->pNextLeaf
12a30 29 3b 0a 20 20 66 74 73 35 44 6c 69 64 78 49 74  );.  fts5DlidxIt
12a40 65 72 46 72 65 65 28 70 49 74 65 72 2d 3e 70 44  erFree(pIter->pD
12a50 6c 69 64 78 29 3b 0a 20 20 73 71 6c 69 74 65 33  lidx);.  sqlite3
12a60 5f 66 72 65 65 28 70 49 74 65 72 2d 3e 61 52 6f  _free(pIter->aRo
12a70 77 69 64 4f 66 66 73 65 74 29 3b 0a 20 20 6d 65  widOffset);.  me
12a80 6d 73 65 74 28 70 49 74 65 72 2c 20 30 2c 20 73  mset(pIter, 0, s
12a90 69 7a 65 6f 66 28 46 74 73 35 53 65 67 49 74 65  izeof(Fts5SegIte
12aa0 72 29 29 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53  r));.}..#ifdef S
12ab0 51 4c 49 54 45 5f 44 45 42 55 47 0a 0a 2f 2a 0a  QLITE_DEBUG../*.
12ac0 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
12ad0 20 69 73 20 75 73 65 64 20 61 73 20 70 61 72 74   is used as part
12ae0 20 6f 66 20 74 68 65 20 62 69 67 20 61 73 73 65   of the big asse
12af0 72 74 28 29 20 70 72 6f 63 65 64 75 72 65 20 69  rt() procedure i
12b00 6d 70 6c 65 6d 65 6e 74 65 64 20 62 79 0a 2a 2a  mplemented by.**
12b10 20 66 74 73 35 41 73 73 65 72 74 4d 75 6c 74 69   fts5AssertMulti
12b20 49 74 65 72 53 65 74 75 70 28 29 2e 20 49 74 20  IterSetup(). It 
12b30 65 6e 73 75 72 65 73 20 74 68 61 74 20 74 68 65  ensures that the
12b40 20 72 65 73 75 6c 74 20 63 75 72 72 65 6e 74 6c   result currentl
12b50 79 20 73 74 6f 72 65 64 0a 2a 2a 20 69 6e 20 2a  y stored.** in *
12b60 70 52 65 73 20 69 73 20 74 68 65 20 63 6f 72 72  pRes is the corr
12b70 65 63 74 20 72 65 73 75 6c 74 20 6f 66 20 63 6f  ect result of co
12b80 6d 70 61 72 69 6e 67 20 74 68 65 20 63 75 72 72  mparing the curr
12b90 65 6e 74 20 70 6f 73 69 74 69 6f 6e 73 20 6f 66  ent positions of
12ba0 20 74 68 65 0a 2a 2a 20 74 77 6f 20 69 74 65 72   the.** two iter
12bb0 61 74 6f 72 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  ators..*/.static
12bc0 20 76 6f 69 64 20 66 74 73 35 41 73 73 65 72 74   void fts5Assert
12bd0 43 6f 6d 70 61 72 69 73 6f 6e 52 65 73 75 6c 74  ComparisonResult
12be0 28 0a 20 20 46 74 73 35 49 6e 64 65 78 49 74 65  (.  Fts5IndexIte
12bf0 72 20 2a 70 49 74 65 72 2c 20 0a 20 20 46 74 73  r *pIter, .  Fts
12c00 35 53 65 67 49 74 65 72 20 2a 70 31 2c 0a 20 20  5SegIter *p1,.  
12c10 46 74 73 35 53 65 67 49 74 65 72 20 2a 70 32 2c  Fts5SegIter *p2,
12c20 0a 20 20 46 74 73 35 43 52 65 73 75 6c 74 20 2a  .  Fts5CResult *
12c30 70 52 65 73 0a 29 7b 0a 20 20 69 6e 74 20 69 31  pRes.){.  int i1
12c40 20 3d 20 70 31 20 2d 20 70 49 74 65 72 2d 3e 61   = p1 - pIter->a
12c50 53 65 67 3b 0a 20 20 69 6e 74 20 69 32 20 3d 20  Seg;.  int i2 = 
12c60 70 32 20 2d 20 70 49 74 65 72 2d 3e 61 53 65 67  p2 - pIter->aSeg
12c70 3b 0a 0a 20 20 69 66 28 20 70 31 2d 3e 70 4c 65  ;..  if( p1->pLe
12c80 61 66 20 7c 7c 20 70 32 2d 3e 70 4c 65 61 66 20  af || p2->pLeaf 
12c90 29 7b 0a 20 20 20 20 69 66 28 20 70 31 2d 3e 70  ){.    if( p1->p
12ca0 4c 65 61 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Leaf==0 ){.     
12cb0 20 61 73 73 65 72 74 28 20 70 52 65 73 2d 3e 69   assert( pRes->i
12cc0 46 69 72 73 74 3d 3d 69 32 20 29 3b 0a 20 20 20  First==i2 );.   
12cd0 20 7d 65 6c 73 65 20 69 66 28 20 70 32 2d 3e 70   }else if( p2->p
12ce0 4c 65 61 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Leaf==0 ){.     
12cf0 20 61 73 73 65 72 74 28 20 70 52 65 73 2d 3e 69   assert( pRes->i
12d00 46 69 72 73 74 3d 3d 69 31 20 29 3b 0a 20 20 20  First==i1 );.   
12d10 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e   }else{.      in
12d20 74 20 6e 4d 69 6e 20 3d 20 4d 49 4e 28 70 31 2d  t nMin = MIN(p1-
12d30 3e 74 65 72 6d 2e 6e 2c 20 70 32 2d 3e 74 65 72  >term.n, p2->ter
12d40 6d 2e 6e 29 3b 0a 20 20 20 20 20 20 69 6e 74 20  m.n);.      int 
12d50 72 65 73 20 3d 20 6d 65 6d 63 6d 70 28 70 31 2d  res = memcmp(p1-
12d60 3e 74 65 72 6d 2e 70 2c 20 70 32 2d 3e 74 65 72  >term.p, p2->ter
12d70 6d 2e 70 2c 20 6e 4d 69 6e 29 3b 0a 20 20 20 20  m.p, nMin);.    
12d80 20 20 69 66 28 20 72 65 73 3d 3d 30 20 29 20 72    if( res==0 ) r
12d90 65 73 20 3d 20 70 31 2d 3e 74 65 72 6d 2e 6e 20  es = p1->term.n 
12da0 2d 20 70 32 2d 3e 74 65 72 6d 2e 6e 3b 0a 0a 20  - p2->term.n;.. 
12db0 20 20 20 20 20 69 66 28 20 72 65 73 3d 3d 30 20       if( res==0 
12dc0 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ){.        asser
12dd0 74 28 20 70 52 65 73 2d 3e 62 54 65 72 6d 45 71  t( pRes->bTermEq
12de0 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 20 20 61  ==1 );.        a
12df0 73 73 65 72 74 28 20 70 31 2d 3e 69 52 6f 77 69  ssert( p1->iRowi
12e00 64 21 3d 70 32 2d 3e 69 52 6f 77 69 64 20 29 3b  d!=p2->iRowid );
12e10 0a 20 20 20 20 20 20 20 20 72 65 73 20 3d 20 28  .        res = (
12e20 28 70 31 2d 3e 69 52 6f 77 69 64 20 3e 20 70 32  (p1->iRowid > p2
12e30 2d 3e 69 52 6f 77 69 64 29 3d 3d 70 49 74 65 72  ->iRowid)==pIter
12e40 2d 3e 62 52 65 76 29 20 3f 20 2d 31 20 3a 20 31  ->bRev) ? -1 : 1
12e50 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
12e60 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
12e70 52 65 73 2d 3e 62 54 65 72 6d 45 71 3d 3d 30 20  Res->bTermEq==0 
12e80 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  );.      }..    
12e90 20 20 69 66 28 20 72 65 73 3c 30 20 29 7b 0a 20    if( res<0 ){. 
12ea0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
12eb0 52 65 73 2d 3e 69 46 69 72 73 74 3d 3d 69 31 20  Res->iFirst==i1 
12ec0 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
12ed0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
12ee0 70 52 65 73 2d 3e 69 46 69 72 73 74 3d 3d 69 32  pRes->iFirst==i2
12ef0 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   );.      }.    
12f00 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  }.  }.}../*.** T
12f10 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
12f20 61 20 6e 6f 2d 6f 70 20 75 6e 6c 65 73 73 20 53  a no-op unless S
12f30 51 4c 49 54 45 5f 44 45 42 55 47 20 69 73 20 64  QLITE_DEBUG is d
12f40 65 66 69 6e 65 64 20 77 68 65 6e 20 74 68 69 73  efined when this
12f50 20 6d 6f 64 75 6c 65 0a 2a 2a 20 69 73 20 63 6f   module.** is co
12f60 6d 70 69 6c 65 64 2e 20 49 6e 20 74 68 61 74 20  mpiled. In that 
12f70 63 61 73 65 2c 20 74 68 69 73 20 66 75 6e 63 74  case, this funct
12f80 69 6f 6e 20 69 73 20 65 73 73 65 6e 74 69 61 6c  ion is essential
12f90 6c 79 20 61 6e 20 61 73 73 65 72 74 28 29 20 0a  ly an assert() .
12fa0 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 75 73 65  ** statement use
12fb0 64 20 74 6f 20 76 65 72 69 66 79 20 74 68 61 74  d to verify that
12fc0 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
12fd0 20 74 68 65 20 70 49 74 65 72 2d 3e 61 46 69 72   the pIter->aFir
12fe0 73 74 5b 5d 20 61 72 72 61 79 0a 2a 2a 20 61 72  st[] array.** ar
12ff0 65 20 63 6f 72 72 65 63 74 2e 0a 2a 2f 0a 73 74  e correct..*/.st
13000 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 41 73  atic void fts5As
13010 73 65 72 74 4d 75 6c 74 69 49 74 65 72 53 65 74  sertMultiIterSet
13020 75 70 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c  up(Fts5Index *p,
13030 20 46 74 73 35 49 6e 64 65 78 49 74 65 72 20 2a   Fts5IndexIter *
13040 70 49 74 65 72 29 7b 0a 20 20 69 66 28 20 70 2d  pIter){.  if( p-
13050 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  >rc==SQLITE_OK )
13060 7b 0a 20 20 20 20 46 74 73 35 53 65 67 49 74 65  {.    Fts5SegIte
13070 72 20 2a 70 46 69 72 73 74 20 3d 20 26 70 49 74  r *pFirst = &pIt
13080 65 72 2d 3e 61 53 65 67 5b 20 70 49 74 65 72 2d  er->aSeg[ pIter-
13090 3e 61 46 69 72 73 74 5b 31 5d 2e 69 46 69 72 73  >aFirst[1].iFirs
130a0 74 20 5d 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  t ];.    int i;.
130b0 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 70 46  .    assert( (pF
130c0 69 72 73 74 2d 3e 70 4c 65 61 66 3d 3d 30 29 3d  irst->pLeaf==0)=
130d0 3d 70 49 74 65 72 2d 3e 62 45 6f 66 20 29 3b 0a  =pIter->bEof );.
130e0 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 68  .    /* Check th
130f0 61 74 20 70 49 74 65 72 2d 3e 69 53 77 69 74 63  at pIter->iSwitc
13100 68 52 6f 77 69 64 20 69 73 20 73 65 74 20 63 6f  hRowid is set co
13110 72 72 65 63 74 6c 79 2e 20 2a 2f 0a 20 20 20 20  rrectly. */.    
13120 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49 74 65 72  for(i=0; i<pIter
13130 2d 3e 6e 53 65 67 3b 20 69 2b 2b 29 7b 0a 20 20  ->nSeg; i++){.  
13140 20 20 20 20 46 74 73 35 53 65 67 49 74 65 72 20      Fts5SegIter 
13150 2a 70 31 20 3d 20 26 70 49 74 65 72 2d 3e 61 53  *p1 = &pIter->aS
13160 65 67 5b 69 5d 3b 0a 20 20 20 20 20 20 61 73 73  eg[i];.      ass
13170 65 72 74 28 20 70 31 3d 3d 70 46 69 72 73 74 20  ert( p1==pFirst 
13180 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70  .           || p
13190 31 2d 3e 70 4c 65 61 66 3d 3d 30 20 0a 20 20 20  1->pLeaf==0 .   
131a0 20 20 20 20 20 20 20 20 7c 7c 20 66 74 73 35 42          || fts5B
131b0 75 66 66 65 72 43 6f 6d 70 61 72 65 28 26 70 46  ufferCompare(&pF
131c0 69 72 73 74 2d 3e 74 65 72 6d 2c 20 26 70 31 2d  irst->term, &p1-
131d0 3e 74 65 72 6d 29 20 0a 20 20 20 20 20 20 20 20  >term) .        
131e0 20 20 20 7c 7c 20 70 31 2d 3e 69 52 6f 77 69 64     || p1->iRowid
131f0 3d 3d 70 49 74 65 72 2d 3e 69 53 77 69 74 63 68  ==pIter->iSwitch
13200 52 6f 77 69 64 0a 20 20 20 20 20 20 20 20 20 20  Rowid.          
13210 20 7c 7c 20 28 70 31 2d 3e 69 52 6f 77 69 64 3c   || (p1->iRowid<
13220 70 49 74 65 72 2d 3e 69 53 77 69 74 63 68 52 6f  pIter->iSwitchRo
13230 77 69 64 29 3d 3d 70 49 74 65 72 2d 3e 62 52 65  wid)==pIter->bRe
13240 76 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d  v.      );.    }
13250 0a 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ..    for(i=0; i
13260 3c 70 49 74 65 72 2d 3e 6e 53 65 67 3b 20 69 2b  <pIter->nSeg; i+
13270 3d 32 29 7b 0a 20 20 20 20 20 20 46 74 73 35 53  =2){.      Fts5S
13280 65 67 49 74 65 72 20 2a 70 31 20 3d 20 26 70 49  egIter *p1 = &pI
13290 74 65 72 2d 3e 61 53 65 67 5b 69 5d 3b 0a 20 20  ter->aSeg[i];.  
132a0 20 20 20 20 46 74 73 35 53 65 67 49 74 65 72 20      Fts5SegIter 
132b0 2a 70 32 20 3d 20 26 70 49 74 65 72 2d 3e 61 53  *p2 = &pIter->aS
132c0 65 67 5b 69 2b 31 5d 3b 0a 20 20 20 20 20 20 46  eg[i+1];.      F
132d0 74 73 35 43 52 65 73 75 6c 74 20 2a 70 52 65 73  ts5CResult *pRes
132e0 20 3d 20 26 70 49 74 65 72 2d 3e 61 46 69 72 73   = &pIter->aFirs
132f0 74 5b 28 70 49 74 65 72 2d 3e 6e 53 65 67 20 2b  t[(pIter->nSeg +
13300 20 69 29 20 2f 20 32 5d 3b 0a 20 20 20 20 20 20   i) / 2];.      
13310 66 74 73 35 41 73 73 65 72 74 43 6f 6d 70 61 72  fts5AssertCompar
13320 69 73 6f 6e 52 65 73 75 6c 74 28 70 49 74 65 72  isonResult(pIter
13330 2c 20 70 31 2c 20 70 32 2c 20 70 52 65 73 29 3b  , p1, p2, pRes);
13340 0a 20 20 20 20 7d 0a 0a 20 20 20 20 66 6f 72 28  .    }..    for(
13350 69 3d 31 3b 20 69 3c 28 70 49 74 65 72 2d 3e 6e  i=1; i<(pIter->n
13360 53 65 67 20 2f 20 32 29 3b 20 69 2b 3d 32 29 7b  Seg / 2); i+=2){
13370 0a 20 20 20 20 20 20 46 74 73 35 53 65 67 49 74  .      Fts5SegIt
13380 65 72 20 2a 70 31 20 3d 20 26 70 49 74 65 72 2d  er *p1 = &pIter-
13390 3e 61 53 65 67 5b 20 70 49 74 65 72 2d 3e 61 46  >aSeg[ pIter->aF
133a0 69 72 73 74 5b 69 2a 32 5d 2e 69 46 69 72 73 74  irst[i*2].iFirst
133b0 20 5d 3b 0a 20 20 20 20 20 20 46 74 73 35 53 65   ];.      Fts5Se
133c0 67 49 74 65 72 20 2a 70 32 20 3d 20 26 70 49 74  gIter *p2 = &pIt
133d0 65 72 2d 3e 61 53 65 67 5b 20 70 49 74 65 72 2d  er->aSeg[ pIter-
133e0 3e 61 46 69 72 73 74 5b 69 2a 32 2b 31 5d 2e 69  >aFirst[i*2+1].i
133f0 46 69 72 73 74 20 5d 3b 0a 20 20 20 20 20 20 46  First ];.      F
13400 74 73 35 43 52 65 73 75 6c 74 20 2a 70 52 65 73  ts5CResult *pRes
13410 20 3d 20 26 70 49 74 65 72 2d 3e 61 46 69 72 73   = &pIter->aFirs
13420 74 5b 69 5d 3b 0a 20 20 20 20 20 20 66 74 73 35  t[i];.      fts5
13430 41 73 73 65 72 74 43 6f 6d 70 61 72 69 73 6f 6e  AssertComparison
13440 52 65 73 75 6c 74 28 70 49 74 65 72 2c 20 70 31  Result(pIter, p1
13450 2c 20 70 32 2c 20 70 52 65 73 29 3b 0a 20 20 20  , p2, pRes);.   
13460 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23   }.  }.}.#else.#
13470 20 64 65 66 69 6e 65 20 66 74 73 35 41 73 73 65   define fts5Asse
13480 72 74 4d 75 6c 74 69 49 74 65 72 53 65 74 75 70  rtMultiIterSetup
13490 28 78 2c 79 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a  (x,y).#endif../*
134a0 0a 2a 2a 20 44 6f 20 74 68 65 20 63 6f 6d 70 61  .** Do the compa
134b0 72 69 73 6f 6e 20 6e 65 63 65 73 73 61 72 79 20  rison necessary 
134c0 74 6f 20 70 6f 70 75 6c 61 74 65 20 70 49 74 65  to populate pIte
134d0 72 2d 3e 61 46 69 72 73 74 5b 69 4f 75 74 5d 2e  r->aFirst[iOut].
134e0 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 72 65  .**.** If the re
134f0 74 75 72 6e 65 64 20 76 61 6c 75 65 20 69 73 20  turned value is 
13500 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 69  non-zero, then i
13510 74 20 69 73 20 74 68 65 20 69 6e 64 65 78 20 6f  t is the index o
13520 66 20 61 6e 20 65 6e 74 72 79 0a 2a 2a 20 69 6e  f an entry.** in
13530 20 74 68 65 20 70 49 74 65 72 2d 3e 61 53 65 67   the pIter->aSeg
13540 5b 5d 20 61 72 72 61 79 20 74 68 61 74 20 69 73  [] array that is
13550 20 28 61 29 20 6e 6f 74 20 61 74 20 45 4f 46 2c   (a) not at EOF,
13560 20 61 6e 64 20 28 62 29 20 70 6f 69 6e 74 69 6e   and (b) pointin
13570 67 0a 2a 2a 20 74 6f 20 61 20 6b 65 79 20 74 68  g.** to a key th
13580 61 74 20 69 73 20 61 20 64 75 70 6c 69 63 61 74  at is a duplicat
13590 65 20 6f 66 20 61 6e 6f 74 68 65 72 2c 20 68 69  e of another, hi
135a0 67 68 65 72 20 70 72 69 6f 72 69 74 79 2c 20 0a  gher priority, .
135b0 2a 2a 20 73 65 67 6d 65 6e 74 2d 69 74 65 72 61  ** segment-itera
135c0 74 6f 72 20 69 6e 20 74 68 65 20 70 53 65 67 2d  tor in the pSeg-
135d0 3e 61 53 65 67 5b 5d 20 61 72 72 61 79 2e 0a 2a  >aSeg[] array..*
135e0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73  /.static int fts
135f0 35 4d 75 6c 74 69 49 74 65 72 44 6f 43 6f 6d 70  5MultiIterDoComp
13600 61 72 65 28 46 74 73 35 49 6e 64 65 78 49 74 65  are(Fts5IndexIte
13610 72 20 2a 70 49 74 65 72 2c 20 69 6e 74 20 69 4f  r *pIter, int iO
13620 75 74 29 7b 0a 20 20 69 6e 74 20 69 31 3b 20 20  ut){.  int i1;  
13630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13640 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
13650 6f 66 20 6c 65 66 74 2d 68 61 6e 64 20 46 74 73  of left-hand Fts
13660 35 53 65 67 49 74 65 72 20 2a 2f 0a 20 20 69 6e  5SegIter */.  in
13670 74 20 69 32 3b 20 20 20 20 20 20 20 20 20 20 20  t i2;           
13680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
13690 20 49 6e 64 65 78 20 6f 66 20 72 69 67 68 74 2d   Index of right-
136a0 68 61 6e 64 20 46 74 73 35 53 65 67 49 74 65 72  hand Fts5SegIter
136b0 20 2a 2f 0a 20 20 69 6e 74 20 69 52 65 73 3b 0a   */.  int iRes;.
136c0 20 20 46 74 73 35 53 65 67 49 74 65 72 20 2a 70    Fts5SegIter *p
136d0 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  1;              
136e0 20 20 2f 2a 20 4c 65 66 74 2d 68 61 6e 64 20 46    /* Left-hand F
136f0 74 73 35 53 65 67 49 74 65 72 20 2a 2f 0a 20 20  ts5SegIter */.  
13700 46 74 73 35 53 65 67 49 74 65 72 20 2a 70 32 3b  Fts5SegIter *p2;
13710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13720 2f 2a 20 52 69 67 68 74 2d 68 61 6e 64 20 46 74  /* Right-hand Ft
13730 73 35 53 65 67 49 74 65 72 20 2a 2f 0a 20 20 46  s5SegIter */.  F
13740 74 73 35 43 52 65 73 75 6c 74 20 2a 70 52 65 73  ts5CResult *pRes
13750 20 3d 20 26 70 49 74 65 72 2d 3e 61 46 69 72 73   = &pIter->aFirs
13760 74 5b 69 4f 75 74 5d 3b 0a 0a 20 20 61 73 73 65  t[iOut];..  asse
13770 72 74 28 20 69 4f 75 74 3c 70 49 74 65 72 2d 3e  rt( iOut<pIter->
13780 6e 53 65 67 20 26 26 20 69 4f 75 74 3e 30 20 29  nSeg && iOut>0 )
13790 3b 0a 20 20 61 73 73 65 72 74 28 20 70 49 74 65  ;.  assert( pIte
137a0 72 2d 3e 62 52 65 76 3d 3d 30 20 7c 7c 20 70 49  r->bRev==0 || pI
137b0 74 65 72 2d 3e 62 52 65 76 3d 3d 31 20 29 3b 0a  ter->bRev==1 );.
137c0 0a 20 20 69 66 28 20 69 4f 75 74 3e 3d 28 70 49  .  if( iOut>=(pI
137d0 74 65 72 2d 3e 6e 53 65 67 2f 32 29 20 29 7b 0a  ter->nSeg/2) ){.
137e0 20 20 20 20 69 31 20 3d 20 28 69 4f 75 74 20 2d      i1 = (iOut -
137f0 20 70 49 74 65 72 2d 3e 6e 53 65 67 2f 32 29 20   pIter->nSeg/2) 
13800 2a 20 32 3b 0a 20 20 20 20 69 32 20 3d 20 69 31  * 2;.    i2 = i1
13810 20 2b 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   + 1;.  }else{. 
13820 20 20 20 69 31 20 3d 20 70 49 74 65 72 2d 3e 61     i1 = pIter->a
13830 46 69 72 73 74 5b 69 4f 75 74 2a 32 5d 2e 69 46  First[iOut*2].iF
13840 69 72 73 74 3b 0a 20 20 20 20 69 32 20 3d 20 70  irst;.    i2 = p
13850 49 74 65 72 2d 3e 61 46 69 72 73 74 5b 69 4f 75  Iter->aFirst[iOu
13860 74 2a 32 2b 31 5d 2e 69 46 69 72 73 74 3b 0a 20  t*2+1].iFirst;. 
13870 20 7d 0a 20 20 70 31 20 3d 20 26 70 49 74 65 72   }.  p1 = &pIter
13880 2d 3e 61 53 65 67 5b 69 31 5d 3b 0a 20 20 70 32  ->aSeg[i1];.  p2
13890 20 3d 20 26 70 49 74 65 72 2d 3e 61 53 65 67 5b   = &pIter->aSeg[
138a0 69 32 5d 3b 0a 0a 20 20 70 52 65 73 2d 3e 62 54  i2];..  pRes->bT
138b0 65 72 6d 45 71 20 3d 20 30 3b 0a 20 20 69 66 28  ermEq = 0;.  if(
138c0 20 70 31 2d 3e 70 4c 65 61 66 3d 3d 30 20 29 7b   p1->pLeaf==0 ){
138d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66             /* If
138e0 20 70 31 20 69 73 20 61 74 20 45 4f 46 20 2a 2f   p1 is at EOF */
138f0 0a 20 20 20 20 69 52 65 73 20 3d 20 69 32 3b 0a  .    iRes = i2;.
13900 20 20 7d 65 6c 73 65 20 69 66 28 20 70 32 2d 3e    }else if( p2->
13910 70 4c 65 61 66 3d 3d 30 20 29 7b 20 20 20 20 20  pLeaf==0 ){     
13920 2f 2a 20 49 66 20 70 32 20 69 73 20 61 74 20 45  /* If p2 is at E
13930 4f 46 20 2a 2f 0a 20 20 20 20 69 52 65 73 20 3d  OF */.    iRes =
13940 20 69 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20   i1;.  }else{.  
13950 20 20 69 6e 74 20 72 65 73 20 3d 20 66 74 73 35    int res = fts5
13960 42 75 66 66 65 72 43 6f 6d 70 61 72 65 28 26 70  BufferCompare(&p
13970 31 2d 3e 74 65 72 6d 2c 20 26 70 32 2d 3e 74 65  1->term, &p2->te
13980 72 6d 29 3b 0a 20 20 20 20 69 66 28 20 72 65 73  rm);.    if( res
13990 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 61 73 73  ==0 ){.      ass
139a0 65 72 74 28 20 69 32 3e 69 31 20 29 3b 0a 20 20  ert( i2>i1 );.  
139b0 20 20 20 20 61 73 73 65 72 74 28 20 69 32 21 3d      assert( i2!=
139c0 30 20 29 3b 0a 20 20 20 20 20 20 70 52 65 73 2d  0 );.      pRes-
139d0 3e 62 54 65 72 6d 45 71 20 3d 20 31 3b 0a 20 20  >bTermEq = 1;.  
139e0 20 20 20 20 69 66 28 20 70 31 2d 3e 69 52 6f 77      if( p1->iRow
139f0 69 64 3d 3d 70 32 2d 3e 69 52 6f 77 69 64 20 29  id==p2->iRowid )
13a00 7b 0a 20 20 20 20 20 20 20 20 70 31 2d 3e 62 44  {.        p1->bD
13a10 65 6c 20 3d 20 70 32 2d 3e 62 44 65 6c 3b 0a 20  el = p2->bDel;. 
13a20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 69 32         return i2
13a30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
13a40 72 65 73 20 3d 20 28 28 70 31 2d 3e 69 52 6f 77  res = ((p1->iRow
13a50 69 64 20 3e 20 70 32 2d 3e 69 52 6f 77 69 64 29  id > p2->iRowid)
13a60 3d 3d 70 49 74 65 72 2d 3e 62 52 65 76 29 20 3f  ==pIter->bRev) ?
13a70 20 2d 31 20 3a 20 2b 31 3b 0a 20 20 20 20 7d 0a   -1 : +1;.    }.
13a80 20 20 20 20 61 73 73 65 72 74 28 20 72 65 73 21      assert( res!
13a90 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 72 65  =0 );.    if( re
13aa0 73 3c 30 20 29 7b 0a 20 20 20 20 20 20 69 52 65  s<0 ){.      iRe
13ab0 73 20 3d 20 69 31 3b 0a 20 20 20 20 7d 65 6c 73  s = i1;.    }els
13ac0 65 7b 0a 20 20 20 20 20 20 69 52 65 73 20 3d 20  e{.      iRes = 
13ad0 69 32 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  i2;.    }.  }.. 
13ae0 20 70 52 65 73 2d 3e 69 46 69 72 73 74 20 3d 20   pRes->iFirst = 
13af0 28 75 31 36 29 69 52 65 73 3b 0a 20 20 72 65 74  (u16)iRes;.  ret
13b00 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
13b10 4d 6f 76 65 20 74 68 65 20 73 65 67 2d 69 74 65  Move the seg-ite
13b20 72 20 73 6f 20 74 68 61 74 20 69 74 20 70 6f 69  r so that it poi
13b30 6e 74 73 20 74 6f 20 74 68 65 20 66 69 72 73 74  nts to the first
13b40 20 72 6f 77 69 64 20 6f 6e 20 70 61 67 65 20 69   rowid on page i
13b50 4c 65 61 66 50 67 6e 6f 2e 0a 2a 2a 20 49 74 20  LeafPgno..** It 
13b60 69 73 20 61 6e 20 65 72 72 6f 72 20 69 66 20 6c  is an error if l
13b70 65 61 66 20 69 4c 65 61 66 50 67 6e 6f 20 64 6f  eaf iLeafPgno do
13b80 65 73 20 6e 6f 74 20 65 78 69 73 74 20 6f 72 20  es not exist or 
13b90 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 72 6f 77 69  contains no rowi
13ba0 64 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ds..*/.static vo
13bb0 69 64 20 66 74 73 35 53 65 67 49 74 65 72 47 6f  id fts5SegIterGo
13bc0 74 6f 50 61 67 65 28 0a 20 20 46 74 73 35 49 6e  toPage(.  Fts5In
13bd0 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20 20  dex *p,         
13be0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53            /* FTS
13bf0 35 20 62 61 63 6b 65 6e 64 20 6f 62 6a 65 63 74  5 backend object
13c00 20 2a 2f 0a 20 20 46 74 73 35 53 65 67 49 74 65   */.  Fts5SegIte
13c10 72 20 2a 70 49 74 65 72 2c 20 20 20 20 20 20 20  r *pIter,       
13c20 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74 6f        /* Iterato
13c30 72 20 74 6f 20 61 64 76 61 6e 63 65 20 2a 2f 0a  r to advance */.
13c40 20 20 69 6e 74 20 69 4c 65 61 66 50 67 6e 6f 0a    int iLeafPgno.
13c50 29 7b 0a 20 20 61 73 73 65 72 74 28 20 69 4c 65  ){.  assert( iLe
13c60 61 66 50 67 6e 6f 3e 70 49 74 65 72 2d 3e 69 4c  afPgno>pIter->iL
13c70 65 61 66 50 67 6e 6f 20 29 3b 0a 0a 20 20 69 66  eafPgno );..  if
13c80 28 20 69 4c 65 61 66 50 67 6e 6f 3e 70 49 74 65  ( iLeafPgno>pIte
13c90 72 2d 3e 70 53 65 67 2d 3e 70 67 6e 6f 4c 61 73  r->pSeg->pgnoLas
13ca0 74 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d  t ){.    p->rc =
13cb0 20 46 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20   FTS5_CORRUPT;. 
13cc0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66 74 73 35   }else{.    fts5
13cd0 44 61 74 61 52 65 6c 65 61 73 65 28 70 49 74 65  DataRelease(pIte
13ce0 72 2d 3e 70 4e 65 78 74 4c 65 61 66 29 3b 0a 20  r->pNextLeaf);. 
13cf0 20 20 20 70 49 74 65 72 2d 3e 70 4e 65 78 74 4c     pIter->pNextL
13d00 65 61 66 20 3d 20 30 3b 0a 20 20 20 20 70 49 74  eaf = 0;.    pIt
13d10 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 20 3d 20  er->iLeafPgno = 
13d20 69 4c 65 61 66 50 67 6e 6f 2d 31 3b 0a 20 20 20  iLeafPgno-1;.   
13d30 20 66 74 73 35 53 65 67 49 74 65 72 4e 65 78 74   fts5SegIterNext
13d40 50 61 67 65 28 70 2c 20 70 49 74 65 72 29 3b 0a  Page(p, pIter);.
13d50 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72      assert( p->r
13d60 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c!=SQLITE_OK || 
13d70 70 49 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f  pIter->iLeafPgno
13d80 3d 3d 69 4c 65 61 66 50 67 6e 6f 20 29 3b 0a 0a  ==iLeafPgno );..
13d90 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53      if( p->rc==S
13da0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
13db0 20 20 69 6e 74 20 69 4f 66 66 3b 0a 20 20 20 20    int iOff;.    
13dc0 20 20 75 38 20 2a 61 20 3d 20 70 49 74 65 72 2d    u8 *a = pIter-
13dd0 3e 70 4c 65 61 66 2d 3e 70 3b 0a 20 20 20 20 20  >pLeaf->p;.     
13de0 20 69 6e 74 20 6e 20 3d 20 70 49 74 65 72 2d 3e   int n = pIter->
13df0 70 4c 65 61 66 2d 3e 73 7a 4c 65 61 66 3b 0a 0a  pLeaf->szLeaf;..
13e00 20 20 20 20 20 20 69 4f 66 66 20 3d 20 66 74 73        iOff = fts
13e10 35 4c 65 61 66 46 69 72 73 74 52 6f 77 69 64 4f  5LeafFirstRowidO
13e20 66 66 28 70 49 74 65 72 2d 3e 70 4c 65 61 66 29  ff(pIter->pLeaf)
13e30 3b 0a 20 20 20 20 20 20 69 66 28 20 69 4f 66 66  ;.      if( iOff
13e40 3c 34 20 7c 7c 20 69 4f 66 66 3e 3d 6e 20 29 7b  <4 || iOff>=n ){
13e50 0a 20 20 20 20 20 20 20 20 70 2d 3e 72 63 20 3d  .        p->rc =
13e60 20 46 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20   FTS5_CORRUPT;. 
13e70 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
13e80 20 20 20 20 69 4f 66 66 20 2b 3d 20 66 74 73 35      iOff += fts5
13e90 47 65 74 56 61 72 69 6e 74 28 26 61 5b 69 4f 66  GetVarint(&a[iOf
13ea0 66 5d 2c 20 28 75 36 34 2a 29 26 70 49 74 65 72  f], (u64*)&pIter
13eb0 2d 3e 69 52 6f 77 69 64 29 3b 0a 20 20 20 20 20  ->iRowid);.     
13ec0 20 20 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f     pIter->iLeafO
13ed0 66 66 73 65 74 20 3d 20 69 4f 66 66 3b 0a 20 20  ffset = iOff;.  
13ee0 20 20 20 20 20 20 66 74 73 35 53 65 67 49 74 65        fts5SegIte
13ef0 72 4c 6f 61 64 4e 50 6f 73 28 70 2c 20 70 49 74  rLoadNPos(p, pIt
13f00 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  er);.      }.   
13f10 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
13f20 41 64 76 61 6e 63 65 20 74 68 65 20 69 74 65 72  Advance the iter
13f30 61 74 6f 72 20 70 61 73 73 65 64 20 61 73 20 74  ator passed as t
13f40 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
13f50 6e 74 20 75 6e 74 69 6c 20 69 74 20 69 73 20 61  nt until it is a
13f60 74 20 6f 72 20 0a 2a 2a 20 70 61 73 74 20 72 6f  t or .** past ro
13f70 77 69 64 20 69 46 72 6f 6d 2e 20 52 65 67 61 72  wid iFrom. Regar
13f80 64 6c 65 73 73 20 6f 66 20 74 68 65 20 76 61 6c  dless of the val
13f90 75 65 20 6f 66 20 69 46 72 6f 6d 2c 20 74 68 65  ue of iFrom, the
13fa0 20 69 74 65 72 61 74 6f 72 20 69 73 0a 2a 2a 20   iterator is.** 
13fb0 61 6c 77 61 79 73 20 61 64 76 61 6e 63 65 64 20  always advanced 
13fc0 61 74 20 6c 65 61 73 74 20 6f 6e 63 65 2e 0a 2a  at least once..*
13fd0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  /.static void ft
13fe0 73 35 53 65 67 49 74 65 72 4e 65 78 74 46 72 6f  s5SegIterNextFro
13ff0 6d 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a  m(.  Fts5Index *
14000 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
14010 20 20 20 20 20 2f 2a 20 46 54 53 35 20 62 61 63       /* FTS5 bac
14020 6b 65 6e 64 20 6f 62 6a 65 63 74 20 2a 2f 0a 20  kend object */. 
14030 20 46 74 73 35 53 65 67 49 74 65 72 20 2a 70 49   Fts5SegIter *pI
14040 74 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 20  ter,            
14050 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 74 6f 20   /* Iterator to 
14060 61 64 76 61 6e 63 65 20 2a 2f 0a 20 20 69 36 34  advance */.  i64
14070 20 69 4d 61 74 63 68 20 20 20 20 20 20 20 20 20   iMatch         
14080 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
14090 41 64 76 61 6e 63 65 20 69 74 65 72 61 74 6f 72  Advance iterator
140a0 20 61 74 20 6c 65 61 73 74 20 74 68 69 73 20 66   at least this f
140b0 61 72 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 62  ar */.){.  int b
140c0 52 65 76 20 3d 20 28 70 49 74 65 72 2d 3e 66 6c  Rev = (pIter->fl
140d0 61 67 73 20 26 20 46 54 53 35 5f 53 45 47 49 54  ags & FTS5_SEGIT
140e0 45 52 5f 52 45 56 45 52 53 45 29 3b 0a 20 20 46  ER_REVERSE);.  F
140f0 74 73 35 44 6c 69 64 78 49 74 65 72 20 2a 70 44  ts5DlidxIter *pD
14100 6c 69 64 78 20 3d 20 70 49 74 65 72 2d 3e 70 44  lidx = pIter->pD
14110 6c 69 64 78 3b 0a 20 20 69 6e 74 20 69 4c 65 61  lidx;.  int iLea
14120 66 50 67 6e 6f 20 3d 20 70 49 74 65 72 2d 3e 69  fPgno = pIter->i
14130 4c 65 61 66 50 67 6e 6f 3b 0a 20 20 69 6e 74 20  LeafPgno;.  int 
14140 62 4d 6f 76 65 20 3d 20 31 3b 0a 0a 20 20 61 73  bMove = 1;..  as
14150 73 65 72 74 28 20 70 49 74 65 72 2d 3e 66 6c 61  sert( pIter->fla
14160 67 73 20 26 20 46 54 53 35 5f 53 45 47 49 54 45  gs & FTS5_SEGITE
14170 52 5f 4f 4e 45 54 45 52 4d 20 29 3b 0a 20 20 61  R_ONETERM );.  a
14180 73 73 65 72 74 28 20 70 49 74 65 72 2d 3e 70 44  ssert( pIter->pD
14190 6c 69 64 78 20 29 3b 0a 20 20 61 73 73 65 72 74  lidx );.  assert
141a0 28 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 20 29  ( pIter->pLeaf )
141b0 3b 0a 0a 20 20 69 66 28 20 62 52 65 76 3d 3d 30  ;..  if( bRev==0
141c0 20 29 7b 0a 20 20 20 20 77 68 69 6c 65 28 20 21   ){.    while( !
141d0 66 74 73 35 44 6c 69 64 78 49 74 65 72 45 6f 66  fts5DlidxIterEof
141e0 28 70 2c 20 70 44 6c 69 64 78 29 20 26 26 20 69  (p, pDlidx) && i
141f0 4d 61 74 63 68 3e 66 74 73 35 44 6c 69 64 78 49  Match>fts5DlidxI
14200 74 65 72 52 6f 77 69 64 28 70 44 6c 69 64 78 29  terRowid(pDlidx)
14210 20 29 7b 0a 20 20 20 20 20 20 69 4c 65 61 66 50   ){.      iLeafP
14220 67 6e 6f 20 3d 20 66 74 73 35 44 6c 69 64 78 49  gno = fts5DlidxI
14230 74 65 72 50 67 6e 6f 28 70 44 6c 69 64 78 29 3b  terPgno(pDlidx);
14240 0a 20 20 20 20 20 20 66 74 73 35 44 6c 69 64 78  .      fts5Dlidx
14250 49 74 65 72 4e 65 78 74 28 70 2c 20 70 44 6c 69  IterNext(p, pDli
14260 64 78 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61  dx);.    }.    a
14270 73 73 65 72 74 5f 6e 63 28 20 69 4c 65 61 66 50  ssert_nc( iLeafP
14280 67 6e 6f 3e 3d 70 49 74 65 72 2d 3e 69 4c 65 61  gno>=pIter->iLea
14290 66 50 67 6e 6f 20 7c 7c 20 70 2d 3e 72 63 20 29  fPgno || p->rc )
142a0 3b 0a 20 20 20 20 69 66 28 20 69 4c 65 61 66 50  ;.    if( iLeafP
142b0 67 6e 6f 3e 70 49 74 65 72 2d 3e 69 4c 65 61 66  gno>pIter->iLeaf
142c0 50 67 6e 6f 20 29 7b 0a 20 20 20 20 20 20 66 74  Pgno ){.      ft
142d0 73 35 53 65 67 49 74 65 72 47 6f 74 6f 50 61 67  s5SegIterGotoPag
142e0 65 28 70 2c 20 70 49 74 65 72 2c 20 69 4c 65 61  e(p, pIter, iLea
142f0 66 50 67 6e 6f 29 3b 0a 20 20 20 20 20 20 62 4d  fPgno);.      bM
14300 6f 76 65 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  ove = 0;.    }. 
14310 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65   }else{.    asse
14320 72 74 28 20 70 49 74 65 72 2d 3e 70 4e 65 78 74  rt( pIter->pNext
14330 4c 65 61 66 3d 3d 30 20 29 3b 0a 20 20 20 20 61  Leaf==0 );.    a
14340 73 73 65 72 74 28 20 69 4d 61 74 63 68 3c 70 49  ssert( iMatch<pI
14350 74 65 72 2d 3e 69 52 6f 77 69 64 20 29 3b 0a 20  ter->iRowid );. 
14360 20 20 20 77 68 69 6c 65 28 20 21 66 74 73 35 44     while( !fts5D
14370 6c 69 64 78 49 74 65 72 45 6f 66 28 70 2c 20 70  lidxIterEof(p, p
14380 44 6c 69 64 78 29 20 26 26 20 69 4d 61 74 63 68  Dlidx) && iMatch
14390 3c 66 74 73 35 44 6c 69 64 78 49 74 65 72 52 6f  <fts5DlidxIterRo
143a0 77 69 64 28 70 44 6c 69 64 78 29 20 29 7b 0a 20  wid(pDlidx) ){. 
143b0 20 20 20 20 20 66 74 73 35 44 6c 69 64 78 49 74       fts5DlidxIt
143c0 65 72 50 72 65 76 28 70 2c 20 70 44 6c 69 64 78  erPrev(p, pDlidx
143d0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 4c 65  );.    }.    iLe
143e0 61 66 50 67 6e 6f 20 3d 20 66 74 73 35 44 6c 69  afPgno = fts5Dli
143f0 64 78 49 74 65 72 50 67 6e 6f 28 70 44 6c 69 64  dxIterPgno(pDlid
14400 78 29 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28  x);..    assert(
14410 20 66 74 73 35 44 6c 69 64 78 49 74 65 72 45 6f   fts5DlidxIterEo
14420 66 28 70 2c 20 70 44 6c 69 64 78 29 20 7c 7c 20  f(p, pDlidx) || 
14430 69 4c 65 61 66 50 67 6e 6f 3c 3d 70 49 74 65 72  iLeafPgno<=pIter
14440 2d 3e 69 4c 65 61 66 50 67 6e 6f 20 29 3b 0a 0a  ->iLeafPgno );..
14450 20 20 20 20 69 66 28 20 69 4c 65 61 66 50 67 6e      if( iLeafPgn
14460 6f 3c 70 49 74 65 72 2d 3e 69 4c 65 61 66 50 67  o<pIter->iLeafPg
14470 6e 6f 20 29 7b 0a 20 20 20 20 20 20 70 49 74 65  no ){.      pIte
14480 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 20 3d 20 69  r->iLeafPgno = i
14490 4c 65 61 66 50 67 6e 6f 2b 31 3b 0a 20 20 20 20  LeafPgno+1;.    
144a0 20 20 66 74 73 35 53 65 67 49 74 65 72 52 65 76    fts5SegIterRev
144b0 65 72 73 65 4e 65 77 50 61 67 65 28 70 2c 20 70  erseNewPage(p, p
144c0 49 74 65 72 29 3b 0a 20 20 20 20 20 20 62 4d 6f  Iter);.      bMo
144d0 76 65 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  ve = 0;.    }.  
144e0 7d 0a 0a 20 20 64 6f 7b 0a 20 20 20 20 69 66 28  }..  do{.    if(
144f0 20 62 4d 6f 76 65 20 26 26 20 70 2d 3e 72 63 3d   bMove && p->rc=
14500 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 70 49 74  =SQLITE_OK ) pIt
14510 65 72 2d 3e 78 4e 65 78 74 28 70 2c 20 70 49 74  er->xNext(p, pIt
14520 65 72 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20  er, 0);.    if( 
14530 70 49 74 65 72 2d 3e 70 4c 65 61 66 3d 3d 30 20  pIter->pLeaf==0 
14540 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 69 66 28  ) break;.    if(
14550 20 62 52 65 76 3d 3d 30 20 26 26 20 70 49 74 65   bRev==0 && pIte
14560 72 2d 3e 69 52 6f 77 69 64 3e 3d 69 4d 61 74 63  r->iRowid>=iMatc
14570 68 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 69  h ) break;.    i
14580 66 28 20 62 52 65 76 21 3d 30 20 26 26 20 70 49  f( bRev!=0 && pI
14590 74 65 72 2d 3e 69 52 6f 77 69 64 3c 3d 69 4d 61  ter->iRowid<=iMa
145a0 74 63 68 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  tch ) break;.   
145b0 20 62 4d 6f 76 65 20 3d 20 31 3b 0a 20 20 7d 77   bMove = 1;.  }w
145c0 68 69 6c 65 28 20 70 2d 3e 72 63 3d 3d 53 51 4c  hile( p->rc==SQL
145d0 49 54 45 5f 4f 4b 20 29 3b 0a 7d 0a 0a 0a 2f 2a  ITE_OK );.}.../*
145e0 0a 2a 2a 20 46 72 65 65 20 74 68 65 20 69 74 65  .** Free the ite
145f0 72 61 74 6f 72 20 6f 62 6a 65 63 74 20 70 61 73  rator object pas
14600 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e  sed as the secon
14610 64 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73  d argument..*/.s
14620 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 4d  tatic void fts5M
14630 75 6c 74 69 49 74 65 72 46 72 65 65 28 46 74 73  ultiIterFree(Fts
14640 35 49 6e 64 65 78 20 2a 70 2c 20 46 74 73 35 49  5Index *p, Fts5I
14650 6e 64 65 78 49 74 65 72 20 2a 70 49 74 65 72 29  ndexIter *pIter)
14660 7b 0a 20 20 69 66 28 20 70 49 74 65 72 20 29 7b  {.  if( pIter ){
14670 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
14680 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49 74 65 72  for(i=0; i<pIter
14690 2d 3e 6e 53 65 67 3b 20 69 2b 2b 29 7b 0a 20 20  ->nSeg; i++){.  
146a0 20 20 20 20 66 74 73 35 53 65 67 49 74 65 72 43      fts5SegIterC
146b0 6c 65 61 72 28 26 70 49 74 65 72 2d 3e 61 53 65  lear(&pIter->aSe
146c0 67 5b 69 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 20  g[i]);.    }.   
146d0 20 66 74 73 35 53 74 72 75 63 74 75 72 65 52 65   fts5StructureRe
146e0 6c 65 61 73 65 28 70 49 74 65 72 2d 3e 70 53 74  lease(pIter->pSt
146f0 72 75 63 74 29 3b 0a 20 20 20 20 66 74 73 35 42  ruct);.    fts5B
14700 75 66 66 65 72 46 72 65 65 28 26 70 49 74 65 72  ufferFree(&pIter
14710 2d 3e 70 6f 73 6c 69 73 74 29 3b 0a 20 20 20 20  ->poslist);.    
14720 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 49 74  sqlite3_free(pIt
14730 65 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74  er);.  }.}..stat
14740 69 63 20 76 6f 69 64 20 66 74 73 35 4d 75 6c 74  ic void fts5Mult
14750 69 49 74 65 72 41 64 76 61 6e 63 65 64 28 0a 20  iIterAdvanced(. 
14760 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 20   Fts5Index *p,  
14770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14780 20 2f 2a 20 46 54 53 35 20 62 61 63 6b 65 6e 64   /* FTS5 backend
14790 20 74 6f 20 69 74 65 72 61 74 65 20 77 69 74 68   to iterate with
147a0 69 6e 20 2a 2f 0a 20 20 46 74 73 35 49 6e 64 65  in */.  Fts5Inde
147b0 78 49 74 65 72 20 2a 70 49 74 65 72 2c 20 20 20  xIter *pIter,   
147c0 20 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61          /* Itera
147d0 74 6f 72 20 74 6f 20 75 70 64 61 74 65 20 61 46  tor to update aF
147e0 69 72 73 74 5b 5d 20 61 72 72 61 79 20 66 6f 72  irst[] array for
147f0 20 2a 2f 0a 20 20 69 6e 74 20 69 43 68 61 6e 67   */.  int iChang
14800 65 64 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ed,             
14810 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f        /* Index o
14820 66 20 73 75 62 2d 69 74 65 72 61 74 6f 72 20 6a  f sub-iterator j
14830 75 73 74 20 61 64 76 61 6e 63 65 64 20 2a 2f 0a  ust advanced */.
14840 20 20 69 6e 74 20 69 4d 69 6e 73 65 74 20 20 20    int iMinset   
14850 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14860 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 65 6e 74    /* Minimum ent
14870 72 79 20 69 6e 20 61 46 69 72 73 74 5b 5d 20 74  ry in aFirst[] t
14880 6f 20 73 65 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e  o set */.){.  in
14890 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 28 70 49  t i;.  for(i=(pI
148a0 74 65 72 2d 3e 6e 53 65 67 2b 69 43 68 61 6e 67  ter->nSeg+iChang
148b0 65 64 29 2f 32 3b 20 69 3e 3d 69 4d 69 6e 73 65  ed)/2; i>=iMinse
148c0 74 20 26 26 20 70 2d 3e 72 63 3d 3d 53 51 4c 49  t && p->rc==SQLI
148d0 54 45 5f 4f 4b 3b 20 69 3d 69 2f 32 29 7b 0a 20  TE_OK; i=i/2){. 
148e0 20 20 20 69 6e 74 20 69 45 71 3b 0a 20 20 20 20     int iEq;.    
148f0 69 66 28 20 28 69 45 71 20 3d 20 66 74 73 35 4d  if( (iEq = fts5M
14900 75 6c 74 69 49 74 65 72 44 6f 43 6f 6d 70 61 72  ultiIterDoCompar
14910 65 28 70 49 74 65 72 2c 20 69 29 29 20 29 7b 0a  e(pIter, i)) ){.
14920 20 20 20 20 20 20 46 74 73 35 53 65 67 49 74 65        Fts5SegIte
14930 72 20 2a 70 53 65 67 20 3d 20 26 70 49 74 65 72  r *pSeg = &pIter
14940 2d 3e 61 53 65 67 5b 69 45 71 5d 3b 0a 20 20 20  ->aSeg[iEq];.   
14950 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72 63     assert( p->rc
14960 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20  ==SQLITE_OK );. 
14970 20 20 20 20 20 70 53 65 67 2d 3e 78 4e 65 78 74       pSeg->xNext
14980 28 70 2c 20 70 53 65 67 2c 20 30 29 3b 0a 20 20  (p, pSeg, 0);.  
14990 20 20 20 20 69 20 3d 20 70 49 74 65 72 2d 3e 6e      i = pIter->n
149a0 53 65 67 20 2b 20 69 45 71 3b 0a 20 20 20 20 7d  Seg + iEq;.    }
149b0 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 75  .  }.}../*.** Su
149c0 62 2d 69 74 65 72 61 74 6f 72 20 69 43 68 61 6e  b-iterator iChan
149d0 67 65 64 20 6f 66 20 69 74 65 72 61 74 6f 72 20  ged of iterator 
149e0 70 49 74 65 72 20 68 61 73 20 6a 75 73 74 20 62  pIter has just b
149f0 65 65 6e 20 61 64 76 61 6e 63 65 64 2e 20 49 74  een advanced. It
14a00 20 73 74 69 6c 6c 0a 2a 2a 20 70 6f 69 6e 74 73   still.** points
14a10 20 74 6f 20 74 68 65 20 73 61 6d 65 20 74 65 72   to the same ter
14a20 6d 20 74 68 6f 75 67 68 20 2d 20 6a 75 73 74 20  m though - just 
14a30 61 20 64 69 66 66 65 72 65 6e 74 20 72 6f 77 69  a different rowi
14a40 64 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  d. This function
14a50 0a 2a 2a 20 61 74 74 65 6d 70 74 73 20 74 6f 20  .** attempts to 
14a60 75 70 64 61 74 65 20 74 68 65 20 63 6f 6e 74 65  update the conte
14a70 6e 74 73 20 6f 66 20 74 68 65 20 70 49 74 65 72  nts of the pIter
14a80 2d 3e 61 46 69 72 73 74 5b 5d 20 61 63 63 6f 72  ->aFirst[] accor
14a90 64 69 6e 67 6c 79 2e 0a 2a 2a 20 49 66 20 69 74  dingly..** If it
14aa0 20 64 6f 65 73 20 73 6f 20 73 75 63 63 65 73 73   does so success
14ab0 66 75 6c 6c 79 2c 20 30 20 69 73 20 72 65 74 75  fully, 0 is retu
14ac0 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65 20  rned. Otherwise 
14ad0 31 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 6e 2d  1..**.** If non-
14ae0 7a 65 72 6f 20 69 73 20 72 65 74 75 72 6e 65 64  zero is returned
14af0 2c 20 74 68 65 20 63 61 6c 6c 65 72 20 73 68 6f  , the caller sho
14b00 75 6c 64 20 63 61 6c 6c 20 66 74 73 35 4d 75 6c  uld call fts5Mul
14b10 74 69 49 74 65 72 41 64 76 61 6e 63 65 64 28 29  tiIterAdvanced()
14b20 0a 2a 2a 20 6f 6e 20 74 68 65 20 69 74 65 72 61  .** on the itera
14b30 74 6f 72 20 69 6e 73 74 65 61 64 2e 20 54 68 61  tor instead. Tha
14b40 74 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20  t function does 
14b50 74 68 65 20 73 61 6d 65 20 61 73 20 74 68 69 73  the same as this
14b60 20 6f 6e 65 2c 20 65 78 63 65 70 74 0a 2a 2a 20   one, except.** 
14b70 74 68 61 74 20 69 74 20 64 65 61 6c 73 20 77 69  that it deals wi
14b80 74 68 20 6d 6f 72 65 20 63 6f 6d 70 6c 69 63 61  th more complica
14b90 74 65 64 20 63 61 73 65 73 20 61 73 20 77 65 6c  ted cases as wel
14ba0 6c 2e 0a 2a 2f 20 0a 73 74 61 74 69 63 20 69 6e  l..*/ .static in
14bb0 74 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 41  t fts5MultiIterA
14bc0 64 76 61 6e 63 65 52 6f 77 69 64 28 0a 20 20 46  dvanceRowid(.  F
14bd0 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20  ts5Index *p,    
14be0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
14bf0 2a 20 46 54 53 35 20 62 61 63 6b 65 6e 64 20 74  * FTS5 backend t
14c00 6f 20 69 74 65 72 61 74 65 20 77 69 74 68 69 6e  o iterate within
14c10 20 2a 2f 0a 20 20 46 74 73 35 49 6e 64 65 78 49   */.  Fts5IndexI
14c20 74 65 72 20 2a 70 49 74 65 72 2c 20 20 20 20 20  ter *pIter,     
14c30 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74 6f        /* Iterato
14c40 72 20 74 6f 20 75 70 64 61 74 65 20 61 46 69 72  r to update aFir
14c50 73 74 5b 5d 20 61 72 72 61 79 20 66 6f 72 20 2a  st[] array for *
14c60 2f 0a 20 20 69 6e 74 20 69 43 68 61 6e 67 65 64  /.  int iChanged
14c70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14c80 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20      /* Index of 
14c90 73 75 62 2d 69 74 65 72 61 74 6f 72 20 6a 75 73  sub-iterator jus
14ca0 74 20 61 64 76 61 6e 63 65 64 20 2a 2f 0a 29 7b  t advanced */.){
14cb0 0a 20 20 46 74 73 35 53 65 67 49 74 65 72 20 2a  .  Fts5SegIter *
14cc0 70 4e 65 77 20 3d 20 26 70 49 74 65 72 2d 3e 61  pNew = &pIter->a
14cd0 53 65 67 5b 69 43 68 61 6e 67 65 64 5d 3b 0a 0a  Seg[iChanged];..
14ce0 20 20 69 66 28 20 70 4e 65 77 2d 3e 69 52 6f 77    if( pNew->iRow
14cf0 69 64 3d 3d 70 49 74 65 72 2d 3e 69 53 77 69 74  id==pIter->iSwit
14d00 63 68 52 6f 77 69 64 0a 20 20 20 7c 7c 20 28 70  chRowid.   || (p
14d10 4e 65 77 2d 3e 69 52 6f 77 69 64 3c 70 49 74 65  New->iRowid<pIte
14d20 72 2d 3e 69 53 77 69 74 63 68 52 6f 77 69 64 29  r->iSwitchRowid)
14d30 3d 3d 70 49 74 65 72 2d 3e 62 52 65 76 0a 20 20  ==pIter->bRev.  
14d40 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  ){.    int i;.  
14d50 20 20 46 74 73 35 53 65 67 49 74 65 72 20 2a 70    Fts5SegIter *p
14d60 4f 74 68 65 72 20 3d 20 26 70 49 74 65 72 2d 3e  Other = &pIter->
14d70 61 53 65 67 5b 69 43 68 61 6e 67 65 64 20 5e 20  aSeg[iChanged ^ 
14d80 30 78 30 30 30 31 5d 3b 0a 20 20 20 20 70 49 74  0x0001];.    pIt
14d90 65 72 2d 3e 69 53 77 69 74 63 68 52 6f 77 69 64  er->iSwitchRowid
14da0 20 3d 20 70 49 74 65 72 2d 3e 62 52 65 76 20 3f   = pIter->bRev ?
14db0 20 53 4d 41 4c 4c 45 53 54 5f 49 4e 54 36 34 20   SMALLEST_INT64 
14dc0 3a 20 4c 41 52 47 45 53 54 5f 49 4e 54 36 34 3b  : LARGEST_INT64;
14dd0 0a 20 20 20 20 66 6f 72 28 69 3d 28 70 49 74 65  .    for(i=(pIte
14de0 72 2d 3e 6e 53 65 67 2b 69 43 68 61 6e 67 65 64  r->nSeg+iChanged
14df0 29 2f 32 3b 20 31 3b 20 69 3d 69 2f 32 29 7b 0a  )/2; 1; i=i/2){.
14e00 20 20 20 20 20 20 46 74 73 35 43 52 65 73 75 6c        Fts5CResul
14e10 74 20 2a 70 52 65 73 20 3d 20 26 70 49 74 65 72  t *pRes = &pIter
14e20 2d 3e 61 46 69 72 73 74 5b 69 5d 3b 0a 0a 20 20  ->aFirst[i];..  
14e30 20 20 20 20 61 73 73 65 72 74 28 20 70 4e 65 77      assert( pNew
14e40 2d 3e 70 4c 65 61 66 20 29 3b 0a 20 20 20 20 20  ->pLeaf );.     
14e50 20 61 73 73 65 72 74 28 20 70 52 65 73 2d 3e 62   assert( pRes->b
14e60 54 65 72 6d 45 71 3d 3d 30 20 7c 7c 20 70 4f 74  TermEq==0 || pOt
14e70 68 65 72 2d 3e 70 4c 65 61 66 20 29 3b 0a 0a 20  her->pLeaf );.. 
14e80 20 20 20 20 20 69 66 28 20 70 52 65 73 2d 3e 62       if( pRes->b
14e90 54 65 72 6d 45 71 20 29 7b 0a 20 20 20 20 20 20  TermEq ){.      
14ea0 20 20 69 66 28 20 70 4e 65 77 2d 3e 69 52 6f 77    if( pNew->iRow
14eb0 69 64 3d 3d 70 4f 74 68 65 72 2d 3e 69 52 6f 77  id==pOther->iRow
14ec0 69 64 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  id ){.          
14ed0 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20  return 1;.      
14ee0 20 20 7d 65 6c 73 65 20 69 66 28 20 28 70 4f 74    }else if( (pOt
14ef0 68 65 72 2d 3e 69 52 6f 77 69 64 3e 70 4e 65 77  her->iRowid>pNew
14f00 2d 3e 69 52 6f 77 69 64 29 3d 3d 70 49 74 65 72  ->iRowid)==pIter
14f10 2d 3e 62 52 65 76 20 29 7b 0a 20 20 20 20 20 20  ->bRev ){.      
14f20 20 20 20 20 70 49 74 65 72 2d 3e 69 53 77 69 74      pIter->iSwit
14f30 63 68 52 6f 77 69 64 20 3d 20 70 4f 74 68 65 72  chRowid = pOther
14f40 2d 3e 69 52 6f 77 69 64 3b 0a 20 20 20 20 20 20  ->iRowid;.      
14f50 20 20 20 20 70 4e 65 77 20 3d 20 70 4f 74 68 65      pNew = pOthe
14f60 72 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  r;.        }else
14f70 20 69 66 28 20 28 70 4f 74 68 65 72 2d 3e 69 52   if( (pOther->iR
14f80 6f 77 69 64 3e 70 49 74 65 72 2d 3e 69 53 77 69  owid>pIter->iSwi
14f90 74 63 68 52 6f 77 69 64 29 3d 3d 70 49 74 65 72  tchRowid)==pIter
14fa0 2d 3e 62 52 65 76 20 29 7b 0a 20 20 20 20 20 20  ->bRev ){.      
14fb0 20 20 20 20 70 49 74 65 72 2d 3e 69 53 77 69 74      pIter->iSwit
14fc0 63 68 52 6f 77 69 64 20 3d 20 70 4f 74 68 65 72  chRowid = pOther
14fd0 2d 3e 69 52 6f 77 69 64 3b 0a 20 20 20 20 20 20  ->iRowid;.      
14fe0 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
14ff0 20 20 70 52 65 73 2d 3e 69 46 69 72 73 74 20 3d    pRes->iFirst =
15000 20 28 75 31 36 29 28 70 4e 65 77 20 2d 20 70 49   (u16)(pNew - pI
15010 74 65 72 2d 3e 61 53 65 67 29 3b 0a 20 20 20 20  ter->aSeg);.    
15020 20 20 69 66 28 20 69 3d 3d 31 20 29 20 62 72 65    if( i==1 ) bre
15030 61 6b 3b 0a 0a 20 20 20 20 20 20 70 4f 74 68 65  ak;..      pOthe
15040 72 20 3d 20 26 70 49 74 65 72 2d 3e 61 53 65 67  r = &pIter->aSeg
15050 5b 20 70 49 74 65 72 2d 3e 61 46 69 72 73 74 5b  [ pIter->aFirst[
15060 69 20 5e 20 30 78 30 30 30 31 5d 2e 69 46 69 72  i ^ 0x0001].iFir
15070 73 74 20 5d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  st ];.    }.  }.
15080 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
15090 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 70 49  /*.** Set the pI
150a0 74 65 72 2d 3e 62 45 6f 66 20 76 61 72 69 61 62  ter->bEof variab
150b0 6c 65 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20  le based on the 
150c0 73 74 61 74 65 20 6f 66 20 74 68 65 20 73 75 62  state of the sub
150d0 2d 69 74 65 72 61 74 6f 72 73 2e 0a 2a 2f 0a 73  -iterators..*/.s
150e0 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 4d  tatic void fts5M
150f0 75 6c 74 69 49 74 65 72 53 65 74 45 6f 66 28 46  ultiIterSetEof(F
15100 74 73 35 49 6e 64 65 78 49 74 65 72 20 2a 70 49  ts5IndexIter *pI
15110 74 65 72 29 7b 0a 20 20 46 74 73 35 53 65 67 49  ter){.  Fts5SegI
15120 74 65 72 20 2a 70 53 65 67 20 3d 20 26 70 49 74  ter *pSeg = &pIt
15130 65 72 2d 3e 61 53 65 67 5b 20 70 49 74 65 72 2d  er->aSeg[ pIter-
15140 3e 61 46 69 72 73 74 5b 31 5d 2e 69 46 69 72 73  >aFirst[1].iFirs
15150 74 20 5d 3b 0a 20 20 70 49 74 65 72 2d 3e 62 45  t ];.  pIter->bE
15160 6f 66 20 3d 20 70 53 65 67 2d 3e 70 4c 65 61 66  of = pSeg->pLeaf
15170 3d 3d 30 3b 0a 20 20 70 49 74 65 72 2d 3e 69 53  ==0;.  pIter->iS
15180 77 69 74 63 68 52 6f 77 69 64 20 3d 20 70 53 65  witchRowid = pSe
15190 67 2d 3e 69 52 6f 77 69 64 3b 0a 7d 0a 0a 2f 2a  g->iRowid;.}../*
151a0 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 69 74 65  .** Move the ite
151b0 72 61 74 6f 72 20 74 6f 20 74 68 65 20 6e 65 78  rator to the nex
151c0 74 20 65 6e 74 72 79 2e 20 0a 2a 2a 0a 2a 2a 20  t entry. .**.** 
151d0 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
151e0 72 73 2c 20 61 6e 20 65 72 72 6f 72 20 63 6f 64  rs, an error cod
151f0 65 20 69 73 20 6c 65 66 74 20 69 6e 20 46 74 73  e is left in Fts
15200 35 49 6e 64 65 78 2e 72 63 2e 20 49 74 20 69 73  5Index.rc. It is
15210 20 6e 6f 74 20 0a 2a 2a 20 63 6f 6e 73 69 64 65   not .** conside
15220 72 65 64 20 61 6e 20 65 72 72 6f 72 20 69 66 20  red an error if 
15230 74 68 65 20 69 74 65 72 61 74 6f 72 20 72 65 61  the iterator rea
15240 63 68 65 73 20 45 4f 46 2c 20 6f 72 20 69 66 20  ches EOF, or if 
15250 69 74 20 69 73 20 61 6c 72 65 61 64 79 20 61 74  it is already at
15260 20 0a 2a 2a 20 45 4f 46 20 77 68 65 6e 20 74 68   .** EOF when th
15270 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
15280 61 6c 6c 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  alled..*/.static
15290 20 76 6f 69 64 20 66 74 73 35 4d 75 6c 74 69 49   void fts5MultiI
152a0 74 65 72 4e 65 78 74 28 0a 20 20 46 74 73 35 49  terNext(.  Fts5I
152b0 6e 64 65 78 20 2a 70 2c 20 0a 20 20 46 74 73 35  ndex *p, .  Fts5
152c0 49 6e 64 65 78 49 74 65 72 20 2a 70 49 74 65 72  IndexIter *pIter
152d0 2c 0a 20 20 69 6e 74 20 62 46 72 6f 6d 2c 20 20  ,.  int bFrom,  
152e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
152f0 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 61      /* True if a
15300 72 67 75 6d 65 6e 74 20 69 46 72 6f 6d 20 69 73  rgument iFrom is
15310 20 76 61 6c 69 64 20 2a 2f 0a 20 20 69 36 34 20   valid */.  i64 
15320 69 46 72 6f 6d 20 20 20 20 20 20 20 20 20 20 20  iFrom           
15330 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
15340 64 76 61 6e 63 65 20 61 74 20 6c 65 61 73 74 20  dvance at least 
15350 61 73 20 66 61 72 20 61 73 20 74 68 69 73 20 2a  as far as this *
15360 2f 0a 29 7b 0a 20 20 69 66 28 20 70 2d 3e 72 63  /.){.  if( p->rc
15370 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
15380 20 20 20 69 6e 74 20 62 55 73 65 46 72 6f 6d 20     int bUseFrom 
15390 3d 20 62 46 72 6f 6d 3b 0a 20 20 20 20 64 6f 20  = bFrom;.    do 
153a0 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 46 69 72  {.      int iFir
153b0 73 74 20 3d 20 70 49 74 65 72 2d 3e 61 46 69 72  st = pIter->aFir
153c0 73 74 5b 31 5d 2e 69 46 69 72 73 74 3b 0a 20 20  st[1].iFirst;.  
153d0 20 20 20 20 69 6e 74 20 62 4e 65 77 54 65 72 6d      int bNewTerm
153e0 20 3d 20 30 3b 0a 20 20 20 20 20 20 46 74 73 35   = 0;.      Fts5
153f0 53 65 67 49 74 65 72 20 2a 70 53 65 67 20 3d 20  SegIter *pSeg = 
15400 26 70 49 74 65 72 2d 3e 61 53 65 67 5b 69 46 69  &pIter->aSeg[iFi
15410 72 73 74 5d 3b 0a 20 20 20 20 20 20 61 73 73 65  rst];.      asse
15420 72 74 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  rt( p->rc==SQLIT
15430 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 69 66  E_OK );.      if
15440 28 20 62 55 73 65 46 72 6f 6d 20 26 26 20 70 53  ( bUseFrom && pS
15450 65 67 2d 3e 70 44 6c 69 64 78 20 29 7b 0a 20 20  eg->pDlidx ){.  
15460 20 20 20 20 20 20 66 74 73 35 53 65 67 49 74 65        fts5SegIte
15470 72 4e 65 78 74 46 72 6f 6d 28 70 2c 20 70 53 65  rNextFrom(p, pSe
15480 67 2c 20 69 46 72 6f 6d 29 3b 0a 20 20 20 20 20  g, iFrom);.     
15490 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
154a0 70 53 65 67 2d 3e 78 4e 65 78 74 28 70 2c 20 70  pSeg->xNext(p, p
154b0 53 65 67 2c 20 26 62 4e 65 77 54 65 72 6d 29 3b  Seg, &bNewTerm);
154c0 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
154d0 69 66 28 20 70 53 65 67 2d 3e 70 4c 65 61 66 3d  if( pSeg->pLeaf=
154e0 3d 30 20 7c 7c 20 62 4e 65 77 54 65 72 6d 20 0a  =0 || bNewTerm .
154f0 20 20 20 20 20 20 20 7c 7c 20 66 74 73 35 4d 75         || fts5Mu
15500 6c 74 69 49 74 65 72 41 64 76 61 6e 63 65 52 6f  ltiIterAdvanceRo
15510 77 69 64 28 70 2c 20 70 49 74 65 72 2c 20 69 46  wid(p, pIter, iF
15520 69 72 73 74 29 0a 20 20 20 20 20 20 29 7b 0a 20  irst).      ){. 
15530 20 20 20 20 20 20 20 66 74 73 35 4d 75 6c 74 69         fts5Multi
15540 49 74 65 72 41 64 76 61 6e 63 65 64 28 70 2c 20  IterAdvanced(p, 
15550 70 49 74 65 72 2c 20 69 46 69 72 73 74 2c 20 31  pIter, iFirst, 1
15560 29 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35 4d  );.        fts5M
15570 75 6c 74 69 49 74 65 72 53 65 74 45 6f 66 28 70  ultiIterSetEof(p
15580 49 74 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Iter);.      }. 
15590 20 20 20 20 20 66 74 73 35 41 73 73 65 72 74 4d       fts5AssertM
155a0 75 6c 74 69 49 74 65 72 53 65 74 75 70 28 70 2c  ultiIterSetup(p,
155b0 20 70 49 74 65 72 29 3b 0a 0a 20 20 20 20 20 20   pIter);..      
155c0 62 55 73 65 46 72 6f 6d 20 3d 20 30 3b 0a 20 20  bUseFrom = 0;.  
155d0 20 20 7d 77 68 69 6c 65 28 20 70 49 74 65 72 2d    }while( pIter-
155e0 3e 62 53 6b 69 70 45 6d 70 74 79 20 26 26 20 66  >bSkipEmpty && f
155f0 74 73 35 4d 75 6c 74 69 49 74 65 72 49 73 45 6d  ts5MultiIterIsEm
15600 70 74 79 28 70 2c 20 70 49 74 65 72 29 20 29 3b  pty(p, pIter) );
15610 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 76  .  }.}..static v
15620 6f 69 64 20 66 74 73 35 4d 75 6c 74 69 49 74 65  oid fts5MultiIte
15630 72 4e 65 78 74 32 28 0a 20 20 46 74 73 35 49 6e  rNext2(.  Fts5In
15640 64 65 78 20 2a 70 2c 20 0a 20 20 46 74 73 35 49  dex *p, .  Fts5I
15650 6e 64 65 78 49 74 65 72 20 2a 70 49 74 65 72 2c  ndexIter *pIter,
15660 0a 20 20 69 6e 74 20 2a 70 62 4e 65 77 54 65 72  .  int *pbNewTer
15670 6d 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m               
15680 20 20 20 2f 2a 20 4f 55 54 3a 20 54 72 75 65 20     /* OUT: True 
15690 69 66 20 2a 6d 69 67 68 74 2a 20 62 65 20 6e 65  if *might* be ne
156a0 77 20 74 65 72 6d 20 2a 2f 0a 29 7b 0a 20 20 61  w term */.){.  a
156b0 73 73 65 72 74 28 20 70 49 74 65 72 2d 3e 62 53  ssert( pIter->bS
156c0 6b 69 70 45 6d 70 74 79 20 29 3b 0a 20 20 69 66  kipEmpty );.  if
156d0 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
156e0 4f 4b 20 29 7b 0a 20 20 20 20 64 6f 20 7b 0a 20  OK ){.    do {. 
156f0 20 20 20 20 20 69 6e 74 20 69 46 69 72 73 74 20       int iFirst 
15700 3d 20 70 49 74 65 72 2d 3e 61 46 69 72 73 74 5b  = pIter->aFirst[
15710 31 5d 2e 69 46 69 72 73 74 3b 0a 20 20 20 20 20  1].iFirst;.     
15720 20 46 74 73 35 53 65 67 49 74 65 72 20 2a 70 53   Fts5SegIter *pS
15730 65 67 20 3d 20 26 70 49 74 65 72 2d 3e 61 53 65  eg = &pIter->aSe
15740 67 5b 69 46 69 72 73 74 5d 3b 0a 20 20 20 20 20  g[iFirst];.     
15750 20 69 6e 74 20 62 4e 65 77 54 65 72 6d 20 3d 20   int bNewTerm = 
15760 30 3b 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74  0;..      assert
15770 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
15780 4f 4b 20 29 3b 0a 20 20 20 20 20 20 70 53 65 67  OK );.      pSeg
15790 2d 3e 78 4e 65 78 74 28 70 2c 20 70 53 65 67 2c  ->xNext(p, pSeg,
157a0 20 26 62 4e 65 77 54 65 72 6d 29 3b 0a 20 20 20   &bNewTerm);.   
157b0 20 20 20 69 66 28 20 70 53 65 67 2d 3e 70 4c 65     if( pSeg->pLe
157c0 61 66 3d 3d 30 20 7c 7c 20 62 4e 65 77 54 65 72  af==0 || bNewTer
157d0 6d 20 0a 20 20 20 20 20 20 20 7c 7c 20 66 74 73  m .       || fts
157e0 35 4d 75 6c 74 69 49 74 65 72 41 64 76 61 6e 63  5MultiIterAdvanc
157f0 65 52 6f 77 69 64 28 70 2c 20 70 49 74 65 72 2c  eRowid(p, pIter,
15800 20 69 46 69 72 73 74 29 0a 20 20 20 20 20 20 29   iFirst).      )
15810 7b 0a 20 20 20 20 20 20 20 20 66 74 73 35 4d 75  {.        fts5Mu
15820 6c 74 69 49 74 65 72 41 64 76 61 6e 63 65 64 28  ltiIterAdvanced(
15830 70 2c 20 70 49 74 65 72 2c 20 69 46 69 72 73 74  p, pIter, iFirst
15840 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 66 74  , 1);.        ft
15850 73 35 4d 75 6c 74 69 49 74 65 72 53 65 74 45 6f  s5MultiIterSetEo
15860 66 28 70 49 74 65 72 29 3b 0a 20 20 20 20 20 20  f(pIter);.      
15870 20 20 2a 70 62 4e 65 77 54 65 72 6d 20 3d 20 31    *pbNewTerm = 1
15880 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
15890 20 20 20 20 20 20 20 2a 70 62 4e 65 77 54 65 72         *pbNewTer
158a0 6d 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20  m = 0;.      }. 
158b0 20 20 20 20 20 66 74 73 35 41 73 73 65 72 74 4d       fts5AssertM
158c0 75 6c 74 69 49 74 65 72 53 65 74 75 70 28 70 2c  ultiIterSetup(p,
158d0 20 70 49 74 65 72 29 3b 0a 0a 20 20 20 20 7d 77   pIter);..    }w
158e0 68 69 6c 65 28 20 66 74 73 35 4d 75 6c 74 69 49  hile( fts5MultiI
158f0 74 65 72 49 73 45 6d 70 74 79 28 70 2c 20 70 49  terIsEmpty(p, pI
15900 74 65 72 29 20 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a  ter) );.  }.}...
15910 73 74 61 74 69 63 20 46 74 73 35 49 6e 64 65 78  static Fts5Index
15920 49 74 65 72 20 2a 66 74 73 35 4d 75 6c 74 69 49  Iter *fts5MultiI
15930 74 65 72 41 6c 6c 6f 63 28 0a 20 20 46 74 73 35  terAlloc(.  Fts5
15940 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20  Index *p,       
15950 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
15960 54 53 35 20 62 61 63 6b 65 6e 64 20 74 6f 20 69  TS5 backend to i
15970 74 65 72 61 74 65 20 77 69 74 68 69 6e 20 2a 2f  terate within */
15980 0a 20 20 69 6e 74 20 6e 53 65 67 0a 29 7b 0a 20  .  int nSeg.){. 
15990 20 46 74 73 35 49 6e 64 65 78 49 74 65 72 20 2a   Fts5IndexIter *
159a0 70 4e 65 77 3b 0a 20 20 69 6e 74 20 6e 53 6c 6f  pNew;.  int nSlo
159b0 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
159c0 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 77 65 72          /* Power
159d0 20 6f 66 20 74 77 6f 20 3e 3d 20 6e 53 65 67 20   of two >= nSeg 
159e0 2a 2f 0a 0a 20 20 66 6f 72 28 6e 53 6c 6f 74 3d  */..  for(nSlot=
159f0 32 3b 20 6e 53 6c 6f 74 3c 6e 53 65 67 3b 20 6e  2; nSlot<nSeg; n
15a00 53 6c 6f 74 3d 6e 53 6c 6f 74 2a 32 29 3b 0a 20  Slot=nSlot*2);. 
15a10 20 70 4e 65 77 20 3d 20 66 74 73 35 49 64 78 4d   pNew = fts5IdxM
15a20 61 6c 6c 6f 63 28 70 2c 20 0a 20 20 20 20 20 20  alloc(p, .      
15a30 73 69 7a 65 6f 66 28 46 74 73 35 49 6e 64 65 78  sizeof(Fts5Index
15a40 49 74 65 72 29 20 2b 20 20 20 20 20 20 20 20 20  Iter) +         
15a50 20 20 20 20 2f 2a 20 70 4e 65 77 20 2a 2f 0a 20      /* pNew */. 
15a60 20 20 20 20 20 73 69 7a 65 6f 66 28 46 74 73 35       sizeof(Fts5
15a70 53 65 67 49 74 65 72 29 20 2a 20 28 6e 53 6c 6f  SegIter) * (nSlo
15a80 74 2d 31 29 20 2b 20 20 20 2f 2a 20 70 4e 65 77  t-1) +   /* pNew
15a90 2d 3e 61 53 65 67 5b 5d 20 2a 2f 0a 20 20 20 20  ->aSeg[] */.    
15aa0 20 20 73 69 7a 65 6f 66 28 46 74 73 35 43 52 65    sizeof(Fts5CRe
15ab0 73 75 6c 74 29 20 2a 20 6e 53 6c 6f 74 20 20 20  sult) * nSlot   
15ac0 20 20 20 20 20 20 2f 2a 20 70 4e 65 77 2d 3e 61        /* pNew->a
15ad0 46 69 72 73 74 5b 5d 20 2a 2f 0a 20 20 29 3b 0a  First[] */.  );.
15ae0 20 20 69 66 28 20 70 4e 65 77 20 29 7b 0a 20 20    if( pNew ){.  
15af0 20 20 70 4e 65 77 2d 3e 6e 53 65 67 20 3d 20 6e    pNew->nSeg = n
15b00 53 6c 6f 74 3b 0a 20 20 20 20 70 4e 65 77 2d 3e  Slot;.    pNew->
15b10 61 46 69 72 73 74 20 3d 20 28 46 74 73 35 43 52  aFirst = (Fts5CR
15b20 65 73 75 6c 74 2a 29 26 70 4e 65 77 2d 3e 61 53  esult*)&pNew->aS
15b30 65 67 5b 6e 53 6c 6f 74 5d 3b 0a 20 20 20 20 70  eg[nSlot];.    p
15b40 4e 65 77 2d 3e 70 49 6e 64 65 78 20 3d 20 70 3b  New->pIndex = p;
15b50 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 4e  .  }.  return pN
15b60 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c  ew;.}../*.** All
15b70 6f 63 61 74 65 20 61 20 6e 65 77 20 46 74 73 35  ocate a new Fts5
15b80 49 6e 64 65 78 49 74 65 72 20 6f 62 6a 65 63 74  IndexIter object
15b90 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 65 77 20  ..**.** The new 
15ba0 6f 62 6a 65 63 74 20 77 69 6c 6c 20 62 65 20 75  object will be u
15bb0 73 65 64 20 74 6f 20 69 74 65 72 61 74 65 20 74  sed to iterate t
15bc0 68 72 6f 75 67 68 20 64 61 74 61 20 69 6e 20 73  hrough data in s
15bd0 74 72 75 63 74 75 72 65 20 70 53 74 72 75 63 74  tructure pStruct
15be0 2e 0a 2a 2a 20 49 66 20 69 4c 65 76 65 6c 20 69  ..** If iLevel i
15bf0 73 20 2d 76 65 2c 20 74 68 65 6e 20 61 6c 6c 20  s -ve, then all 
15c00 64 61 74 61 20 69 6e 20 61 6c 6c 20 73 65 67 6d  data in all segm
15c10 65 6e 74 73 20 69 73 20 6d 65 72 67 65 64 2e 20  ents is merged. 
15c20 4f 72 2c 20 69 66 20 69 4c 65 76 65 6c 0a 2a 2a  Or, if iLevel.**
15c30 20 69 73 20 7a 65 72 6f 20 6f 72 20 67 72 65 61   is zero or grea
15c40 74 65 72 2c 20 64 61 74 61 20 66 72 6f 6d 20 74  ter, data from t
15c50 68 65 20 66 69 72 73 74 20 6e 53 65 67 6d 65 6e  he first nSegmen
15c60 74 20 73 65 67 6d 65 6e 74 73 20 6f 6e 20 6c 65  t segments on le
15c70 76 65 6c 20 69 4c 65 76 65 6c 0a 2a 2a 20 69 73  vel iLevel.** is
15c80 20 6d 65 72 67 65 64 2e 0a 2a 2a 0a 2a 2a 20 54   merged..**.** T
15c90 68 65 20 69 74 65 72 61 74 6f 72 20 69 6e 69 74  he iterator init
15ca0 69 61 6c 6c 79 20 70 6f 69 6e 74 73 20 74 6f 20  ially points to 
15cb0 74 68 65 20 66 69 72 73 74 20 74 65 72 6d 2f 72  the first term/r
15cc0 6f 77 69 64 20 65 6e 74 72 79 20 69 6e 20 74 68  owid entry in th
15cd0 65 20 0a 2a 2a 20 69 74 65 72 61 74 65 64 20 64  e .** iterated d
15ce0 61 74 61 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ata..*/.static v
15cf0 6f 69 64 20 66 74 73 35 4d 75 6c 74 69 49 74 65  oid fts5MultiIte
15d00 72 4e 65 77 28 0a 20 20 46 74 73 35 49 6e 64 65  rNew(.  Fts5Inde
15d10 78 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  x *p,           
15d20 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53 35 20          /* FTS5 
15d30 62 61 63 6b 65 6e 64 20 74 6f 20 69 74 65 72 61  backend to itera
15d40 74 65 20 77 69 74 68 69 6e 20 2a 2f 0a 20 20 46  te within */.  F
15d50 74 73 35 53 74 72 75 63 74 75 72 65 20 2a 70 53  ts5Structure *pS
15d60 74 72 75 63 74 2c 20 20 20 20 20 20 20 20 20 2f  truct,         /
15d70 2a 20 53 74 72 75 63 74 75 72 65 20 6f 66 20 73  * Structure of s
15d80 70 65 63 69 66 69 63 20 69 6e 64 65 78 20 2a 2f  pecific index */
15d90 0a 20 20 69 6e 74 20 62 53 6b 69 70 45 6d 70 74  .  int bSkipEmpt
15da0 79 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  y,              
15db0 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 69 67     /* True to ig
15dc0 6e 6f 72 65 20 64 65 6c 65 74 65 2d 6b 65 79 73  nore delete-keys
15dd0 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c   */.  int flags,
15de0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15df0 20 20 20 20 20 20 2f 2a 20 46 54 53 35 49 4e 44        /* FTS5IND
15e00 45 58 5f 51 55 45 52 59 5f 58 58 58 20 66 6c 61  EX_QUERY_XXX fla
15e10 67 73 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 75 38  gs */.  const u8
15e20 20 2a 70 54 65 72 6d 2c 20 69 6e 74 20 6e 54 65   *pTerm, int nTe
15e30 72 6d 2c 20 20 20 20 20 2f 2a 20 54 65 72 6d 20  rm,     /* Term 
15e40 74 6f 20 73 65 65 6b 20 74 6f 20 28 6f 72 20 4e  to seek to (or N
15e50 55 4c 4c 2f 30 29 20 2a 2f 0a 20 20 69 6e 74 20  ULL/0) */.  int 
15e60 69 4c 65 76 65 6c 2c 20 20 20 20 20 20 20 20 20  iLevel,         
15e70 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
15e80 65 76 65 6c 20 74 6f 20 69 74 65 72 61 74 65 20  evel to iterate 
15e90 28 2d 31 20 66 6f 72 20 61 6c 6c 29 20 2a 2f 0a  (-1 for all) */.
15ea0 20 20 69 6e 74 20 6e 53 65 67 6d 65 6e 74 2c 20    int nSegment, 
15eb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15ec0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 73    /* Number of s
15ed0 65 67 6d 65 6e 74 73 20 74 6f 20 6d 65 72 67 65  egments to merge
15ee0 20 28 69 4c 65 76 65 6c 3e 3d 30 29 20 2a 2f 0a   (iLevel>=0) */.
15ef0 20 20 46 74 73 35 49 6e 64 65 78 49 74 65 72 20    Fts5IndexIter 
15f00 2a 2a 70 70 4f 75 74 20 20 20 20 20 20 20 20 20  **ppOut         
15f10 20 20 2f 2a 20 4e 65 77 20 6f 62 6a 65 63 74 20    /* New object 
15f20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 53 65 67  */.){.  int nSeg
15f30 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
15f40 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
15f50 72 20 6f 66 20 73 65 67 6d 65 6e 74 2d 69 74 65  r of segment-ite
15f60 72 73 20 69 6e 20 75 73 65 20 2a 2f 0a 20 20 69  rs in use */.  i
15f70 6e 74 20 69 49 74 65 72 20 3d 20 30 3b 20 20 20  nt iIter = 0;   
15f80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
15f90 2a 20 2a 2f 0a 20 20 69 6e 74 20 69 53 65 67 3b  * */.  int iSeg;
15fa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15fb0 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20 74         /* Used t
15fc0 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f 75 67  o iterate throug
15fd0 68 20 73 65 67 6d 65 6e 74 73 20 2a 2f 0a 20 20  h segments */.  
15fe0 46 74 73 35 42 75 66 66 65 72 20 62 75 66 20 3d  Fts5Buffer buf =
15ff0 20 7b 30 2c 30 2c 30 7d 3b 20 20 20 20 20 20 20   {0,0,0};       
16000 2f 2a 20 42 75 66 66 65 72 20 75 73 65 64 20 62  /* Buffer used b
16010 79 20 66 74 73 35 53 65 67 49 74 65 72 53 65 65  y fts5SegIterSee
16020 6b 49 6e 69 74 28 29 20 2a 2f 0a 20 20 46 74 73  kInit() */.  Fts
16030 35 53 74 72 75 63 74 75 72 65 4c 65 76 65 6c 20  5StructureLevel 
16040 2a 70 4c 76 6c 3b 0a 20 20 46 74 73 35 49 6e 64  *pLvl;.  Fts5Ind
16050 65 78 49 74 65 72 20 2a 70 4e 65 77 3b 0a 0a 20  exIter *pNew;.. 
16060 20 61 73 73 65 72 74 28 20 28 70 54 65 72 6d 3d   assert( (pTerm=
16070 3d 30 20 26 26 20 6e 54 65 72 6d 3d 3d 30 29 20  =0 && nTerm==0) 
16080 7c 7c 20 69 4c 65 76 65 6c 3c 30 20 29 3b 0a 0a  || iLevel<0 );..
16090 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 73 70    /* Allocate sp
160a0 61 63 65 20 66 6f 72 20 74 68 65 20 6e 65 77 20  ace for the new 
160b0 6d 75 6c 74 69 2d 73 65 67 2d 69 74 65 72 61 74  multi-seg-iterat
160c0 6f 72 2e 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e  or. */.  if( p->
160d0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
160e0 0a 20 20 20 20 69 66 28 20 69 4c 65 76 65 6c 3c  .    if( iLevel<
160f0 30 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  0 ){.      asser
16100 74 28 20 70 53 74 72 75 63 74 2d 3e 6e 53 65 67  t( pStruct->nSeg
16110 6d 65 6e 74 3d 3d 66 74 73 35 53 74 72 75 63 74  ment==fts5Struct
16120 75 72 65 43 6f 75 6e 74 53 65 67 6d 65 6e 74 73  ureCountSegments
16130 28 70 53 74 72 75 63 74 29 20 29 3b 0a 20 20 20  (pStruct) );.   
16140 20 20 20 6e 53 65 67 20 3d 20 70 53 74 72 75 63     nSeg = pStruc
16150 74 2d 3e 6e 53 65 67 6d 65 6e 74 3b 0a 20 20 20  t->nSegment;.   
16160 20 20 20 6e 53 65 67 20 2b 3d 20 28 70 2d 3e 70     nSeg += (p->p
16170 48 61 73 68 20 3f 20 31 20 3a 20 30 29 3b 0a 20  Hash ? 1 : 0);. 
16180 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
16190 6e 53 65 67 20 3d 20 4d 49 4e 28 70 53 74 72 75  nSeg = MIN(pStru
161a0 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c 65 76 65  ct->aLevel[iLeve
161b0 6c 5d 2e 6e 53 65 67 2c 20 6e 53 65 67 6d 65 6e  l].nSeg, nSegmen
161c0 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  t);.    }.  }.  
161d0 2a 70 70 4f 75 74 20 3d 20 70 4e 65 77 20 3d 20  *ppOut = pNew = 
161e0 66 74 73 35 4d 75 6c 74 69 49 74 65 72 41 6c 6c  fts5MultiIterAll
161f0 6f 63 28 70 2c 20 6e 53 65 67 29 3b 0a 20 20 69  oc(p, nSeg);.  i
16200 66 28 20 70 4e 65 77 3d 3d 30 20 29 20 72 65 74  f( pNew==0 ) ret
16210 75 72 6e 3b 0a 20 20 70 4e 65 77 2d 3e 62 52 65  urn;.  pNew->bRe
16220 76 20 3d 20 28 30 21 3d 28 66 6c 61 67 73 20 26  v = (0!=(flags &
16230 20 46 54 53 35 49 4e 44 45 58 5f 51 55 45 52 59   FTS5INDEX_QUERY
16240 5f 44 45 53 43 29 29 3b 0a 20 20 70 4e 65 77 2d  _DESC));.  pNew-
16250 3e 62 53 6b 69 70 45 6d 70 74 79 20 3d 20 28 75  >bSkipEmpty = (u
16260 38 29 62 53 6b 69 70 45 6d 70 74 79 3b 0a 20 20  8)bSkipEmpty;.  
16270 70 4e 65 77 2d 3e 70 53 74 72 75 63 74 20 3d 20  pNew->pStruct = 
16280 70 53 74 72 75 63 74 3b 0a 20 20 66 74 73 35 53  pStruct;.  fts5S
16290 74 72 75 63 74 75 72 65 52 65 66 28 70 53 74 72  tructureRef(pStr
162a0 75 63 74 29 3b 0a 0a 20 20 2f 2a 20 49 6e 69 74  uct);..  /* Init
162b0 69 61 6c 69 7a 65 20 65 61 63 68 20 6f 66 20 74  ialize each of t
162c0 68 65 20 63 6f 6d 70 6f 6e 65 6e 74 20 73 65 67  he component seg
162d0 6d 65 6e 74 20 69 74 65 72 61 74 6f 72 73 2e 20  ment iterators. 
162e0 2a 2f 0a 20 20 69 66 28 20 69 4c 65 76 65 6c 3c  */.  if( iLevel<
162f0 30 20 29 7b 0a 20 20 20 20 46 74 73 35 53 74 72  0 ){.    Fts5Str
16300 75 63 74 75 72 65 4c 65 76 65 6c 20 2a 70 45 6e  uctureLevel *pEn
16310 64 20 3d 20 26 70 53 74 72 75 63 74 2d 3e 61 4c  d = &pStruct->aL
16320 65 76 65 6c 5b 70 53 74 72 75 63 74 2d 3e 6e 4c  evel[pStruct->nL
16330 65 76 65 6c 5d 3b 0a 20 20 20 20 69 66 28 20 70  evel];.    if( p
16340 2d 3e 70 48 61 73 68 20 29 7b 0a 20 20 20 20 20  ->pHash ){.     
16350 20 2f 2a 20 41 64 64 20 61 20 73 65 67 6d 65 6e   /* Add a segmen
16360 74 20 69 74 65 72 61 74 6f 72 20 66 6f 72 20 74  t iterator for t
16370 68 65 20 63 75 72 72 65 6e 74 20 63 6f 6e 74 65  he current conte
16380 6e 74 73 20 6f 66 20 74 68 65 20 68 61 73 68 20  nts of the hash 
16390 74 61 62 6c 65 2e 20 2a 2f 0a 20 20 20 20 20 20  table. */.      
163a0 46 74 73 35 53 65 67 49 74 65 72 20 2a 70 49 74  Fts5SegIter *pIt
163b0 65 72 20 3d 20 26 70 4e 65 77 2d 3e 61 53 65 67  er = &pNew->aSeg
163c0 5b 69 49 74 65 72 2b 2b 5d 3b 0a 20 20 20 20 20  [iIter++];.     
163d0 20 66 74 73 35 53 65 67 49 74 65 72 48 61 73 68   fts5SegIterHash
163e0 49 6e 69 74 28 70 2c 20 70 54 65 72 6d 2c 20 6e  Init(p, pTerm, n
163f0 54 65 72 6d 2c 20 66 6c 61 67 73 2c 20 70 49 74  Term, flags, pIt
16400 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66  er);.    }.    f
16410 6f 72 28 70 4c 76 6c 3d 26 70 53 74 72 75 63 74  or(pLvl=&pStruct
16420 2d 3e 61 4c 65 76 65 6c 5b 30 5d 3b 20 70 4c 76  ->aLevel[0]; pLv
16430 6c 3c 70 45 6e 64 3b 20 70 4c 76 6c 2b 2b 29 7b  l<pEnd; pLvl++){
16440 0a 20 20 20 20 20 20 66 6f 72 28 69 53 65 67 3d  .      for(iSeg=
16450 70 4c 76 6c 2d 3e 6e 53 65 67 2d 31 3b 20 69 53  pLvl->nSeg-1; iS
16460 65 67 3e 3d 30 3b 20 69 53 65 67 2d 2d 29 7b 0a  eg>=0; iSeg--){.
16470 20 20 20 20 20 20 20 20 46 74 73 35 53 74 72 75          Fts5Stru
16480 63 74 75 72 65 53 65 67 6d 65 6e 74 20 2a 70 53  ctureSegment *pS
16490 65 67 20 3d 20 26 70 4c 76 6c 2d 3e 61 53 65 67  eg = &pLvl->aSeg
164a0 5b 69 53 65 67 5d 3b 0a 20 20 20 20 20 20 20 20  [iSeg];.        
164b0 46 74 73 35 53 65 67 49 74 65 72 20 2a 70 49 74  Fts5SegIter *pIt
164c0 65 72 20 3d 20 26 70 4e 65 77 2d 3e 61 53 65 67  er = &pNew->aSeg
164d0 5b 69 49 74 65 72 2b 2b 5d 3b 0a 20 20 20 20 20  [iIter++];.     
164e0 20 20 20 69 66 28 20 70 54 65 72 6d 3d 3d 30 20     if( pTerm==0 
164f0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 66 74 73  ){.          fts
16500 35 53 65 67 49 74 65 72 49 6e 69 74 28 70 2c 20  5SegIterInit(p, 
16510 70 53 65 67 2c 20 70 49 74 65 72 29 3b 0a 20 20  pSeg, pIter);.  
16520 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
16530 20 20 20 20 20 20 20 66 74 73 35 53 65 67 49 74         fts5SegIt
16540 65 72 53 65 65 6b 49 6e 69 74 28 70 2c 20 26 62  erSeekInit(p, &b
16550 75 66 2c 20 70 54 65 72 6d 2c 20 6e 54 65 72 6d  uf, pTerm, nTerm
16560 2c 20 66 6c 61 67 73 2c 20 70 53 65 67 2c 20 70  , flags, pSeg, p
16570 49 74 65 72 29 3b 0a 20 20 20 20 20 20 20 20 7d  Iter);.        }
16580 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
16590 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 4c 76 6c   }else{.    pLvl
165a0 20 3d 20 26 70 53 74 72 75 63 74 2d 3e 61 4c 65   = &pStruct->aLe
165b0 76 65 6c 5b 69 4c 65 76 65 6c 5d 3b 0a 20 20 20  vel[iLevel];.   
165c0 20 66 6f 72 28 69 53 65 67 3d 6e 53 65 67 2d 31   for(iSeg=nSeg-1
165d0 3b 20 69 53 65 67 3e 3d 30 3b 20 69 53 65 67 2d  ; iSeg>=0; iSeg-
165e0 2d 29 7b 0a 20 20 20 20 20 20 66 74 73 35 53 65  -){.      fts5Se
165f0 67 49 74 65 72 49 6e 69 74 28 70 2c 20 26 70 4c  gIterInit(p, &pL
16600 76 6c 2d 3e 61 53 65 67 5b 69 53 65 67 5d 2c 20  vl->aSeg[iSeg], 
16610 26 70 4e 65 77 2d 3e 61 53 65 67 5b 69 49 74 65  &pNew->aSeg[iIte
16620 72 2b 2b 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  r++]);.    }.  }
16630 0a 20 20 61 73 73 65 72 74 28 20 69 49 74 65 72  .  assert( iIter
16640 3d 3d 6e 53 65 67 20 29 3b 0a 0a 20 20 2f 2a 20  ==nSeg );..  /* 
16650 49 66 20 74 68 65 20 61 62 6f 76 65 20 77 61 73  If the above was
16660 20 73 75 63 63 65 73 73 66 75 6c 2c 20 65 61 63   successful, eac
16670 68 20 63 6f 6d 70 6f 6e 65 6e 74 20 69 74 65 72  h component iter
16680 61 74 6f 72 73 20 6e 6f 77 20 70 6f 69 6e 74 73  ators now points
16690 20 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20 66 69   .  ** to the fi
166a0 72 73 74 20 65 6e 74 72 79 20 69 6e 20 69 74 73  rst entry in its
166b0 20 73 65 67 6d 65 6e 74 2e 20 49 6e 20 74 68 69   segment. In thi
166c0 73 20 63 61 73 65 20 69 6e 69 74 69 61 6c 69 7a  s case initializ
166d0 65 20 74 68 65 20 0a 20 20 2a 2a 20 61 46 69 72  e the .  ** aFir
166e0 73 74 5b 5d 20 61 72 72 61 79 2e 20 4f 72 2c 20  st[] array. Or, 
166f0 69 66 20 61 6e 20 65 72 72 6f 72 20 68 61 73 20  if an error has 
16700 6f 63 63 75 72 72 65 64 2c 20 66 72 65 65 20 74  occurred, free t
16710 68 65 20 69 74 65 72 61 74 6f 72 0a 20 20 2a 2a  he iterator.  **
16720 20 6f 62 6a 65 63 74 20 61 6e 64 20 73 65 74 20   object and set 
16730 74 68 65 20 6f 75 74 70 75 74 20 76 61 72 69 61  the output varia
16740 62 6c 65 20 74 6f 20 4e 55 4c 4c 2e 20 20 2a 2f  ble to NULL.  */
16750 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51  .  if( p->rc==SQ
16760 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 66  LITE_OK ){.    f
16770 6f 72 28 69 49 74 65 72 3d 70 4e 65 77 2d 3e 6e  or(iIter=pNew->n
16780 53 65 67 2d 31 3b 20 69 49 74 65 72 3e 30 3b 20  Seg-1; iIter>0; 
16790 69 49 74 65 72 2d 2d 29 7b 0a 20 20 20 20 20 20  iIter--){.      
167a0 69 6e 74 20 69 45 71 3b 0a 20 20 20 20 20 20 69  int iEq;.      i
167b0 66 28 20 28 69 45 71 20 3d 20 66 74 73 35 4d 75  f( (iEq = fts5Mu
167c0 6c 74 69 49 74 65 72 44 6f 43 6f 6d 70 61 72 65  ltiIterDoCompare
167d0 28 70 4e 65 77 2c 20 69 49 74 65 72 29 29 20 29  (pNew, iIter)) )
167e0 7b 0a 20 20 20 20 20 20 20 20 46 74 73 35 53 65  {.        Fts5Se
167f0 67 49 74 65 72 20 2a 70 53 65 67 20 3d 20 26 70  gIter *pSeg = &p
16800 4e 65 77 2d 3e 61 53 65 67 5b 69 45 71 5d 3b 0a  New->aSeg[iEq];.
16810 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72          if( p->r
16820 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 70  c==SQLITE_OK ) p
16830 53 65 67 2d 3e 78 4e 65 78 74 28 70 2c 20 70 53  Seg->xNext(p, pS
16840 65 67 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  eg, 0);.        
16850 66 74 73 35 4d 75 6c 74 69 49 74 65 72 41 64 76  fts5MultiIterAdv
16860 61 6e 63 65 64 28 70 2c 20 70 4e 65 77 2c 20 69  anced(p, pNew, i
16870 45 71 2c 20 69 49 74 65 72 29 3b 0a 20 20 20 20  Eq, iIter);.    
16880 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 66 74    }.    }.    ft
16890 73 35 4d 75 6c 74 69 49 74 65 72 53 65 74 45 6f  s5MultiIterSetEo
168a0 66 28 70 4e 65 77 29 3b 0a 20 20 20 20 66 74 73  f(pNew);.    fts
168b0 35 41 73 73 65 72 74 4d 75 6c 74 69 49 74 65 72  5AssertMultiIter
168c0 53 65 74 75 70 28 70 2c 20 70 4e 65 77 29 3b 0a  Setup(p, pNew);.
168d0 0a 20 20 20 20 69 66 28 20 70 4e 65 77 2d 3e 62  .    if( pNew->b
168e0 53 6b 69 70 45 6d 70 74 79 20 26 26 20 66 74 73  SkipEmpty && fts
168f0 35 4d 75 6c 74 69 49 74 65 72 49 73 45 6d 70 74  5MultiIterIsEmpt
16900 79 28 70 2c 20 70 4e 65 77 29 20 29 7b 0a 20 20  y(p, pNew) ){.  
16910 20 20 20 20 66 74 73 35 4d 75 6c 74 69 49 74 65      fts5MultiIte
16920 72 4e 65 78 74 28 70 2c 20 70 4e 65 77 2c 20 30  rNext(p, pNew, 0
16930 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  , 0);.    }.  }e
16940 6c 73 65 7b 0a 20 20 20 20 66 74 73 35 4d 75 6c  lse{.    fts5Mul
16950 74 69 49 74 65 72 46 72 65 65 28 70 2c 20 70 4e  tiIterFree(p, pN
16960 65 77 29 3b 0a 20 20 20 20 2a 70 70 4f 75 74 20  ew);.    *ppOut 
16970 3d 20 30 3b 0a 20 20 7d 0a 20 20 66 74 73 35 42  = 0;.  }.  fts5B
16980 75 66 66 65 72 46 72 65 65 28 26 62 75 66 29 3b  ufferFree(&buf);
16990 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65  .}../*.** Create
169a0 20 61 6e 20 46 74 73 35 49 6e 64 65 78 49 74 65   an Fts5IndexIte
169b0 72 20 74 68 61 74 20 69 74 65 72 61 74 65 73 20  r that iterates 
169c0 74 68 72 6f 75 67 68 20 74 68 65 20 64 6f 63 6c  through the docl
169d0 69 73 74 20 70 72 6f 76 69 64 65 64 0a 2a 2a 20  ist provided.** 
169e0 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72  as the second ar
169f0 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69  gument..*/.stati
16a00 63 20 76 6f 69 64 20 66 74 73 35 4d 75 6c 74 69  c void fts5Multi
16a10 49 74 65 72 4e 65 77 32 28 0a 20 20 46 74 73 35  IterNew2(.  Fts5
16a20 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20  Index *p,       
16a30 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
16a40 54 53 35 20 62 61 63 6b 65 6e 64 20 74 6f 20 69  TS5 backend to i
16a50 74 65 72 61 74 65 20 77 69 74 68 69 6e 20 2a 2f  terate within */
16a60 0a 20 20 46 74 73 35 44 61 74 61 20 2a 70 44 61  .  Fts5Data *pDa
16a70 74 61 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ta,             
16a80 20 20 20 2f 2a 20 44 6f 63 6c 69 73 74 20 74 6f     /* Doclist to
16a90 20 69 74 65 72 61 74 65 20 74 68 72 6f 75 67 68   iterate through
16aa0 20 2a 2f 0a 20 20 69 6e 74 20 62 44 65 73 63 2c   */.  int bDesc,
16ab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16ac0 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f        /* True fo
16ad0 72 20 64 65 73 63 65 6e 64 69 6e 67 20 72 6f 77  r descending row
16ae0 69 64 20 6f 72 64 65 72 20 2a 2f 0a 20 20 46 74  id order */.  Ft
16af0 73 35 49 6e 64 65 78 49 74 65 72 20 2a 2a 70 70  s5IndexIter **pp
16b00 4f 75 74 20 20 20 20 20 20 20 20 20 20 20 2f 2a  Out           /*
16b10 20 4e 65 77 20 6f 62 6a 65 63 74 20 2a 2f 0a 29   New object */.)
16b20 7b 0a 20 20 46 74 73 35 49 6e 64 65 78 49 74 65  {.  Fts5IndexIte
16b30 72 20 2a 70 4e 65 77 3b 0a 20 20 70 4e 65 77 20  r *pNew;.  pNew 
16b40 3d 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 41  = fts5MultiIterA
16b50 6c 6c 6f 63 28 70 2c 20 32 29 3b 0a 20 20 69 66  lloc(p, 2);.  if
16b60 28 20 70 4e 65 77 20 29 7b 0a 20 20 20 20 46 74  ( pNew ){.    Ft
16b70 73 35 53 65 67 49 74 65 72 20 2a 70 49 74 65 72  s5SegIter *pIter
16b80 20 3d 20 26 70 4e 65 77 2d 3e 61 53 65 67 5b 31   = &pNew->aSeg[1
16b90 5d 3b 0a 0a 20 20 20 20 70 4e 65 77 2d 3e 62 46  ];..    pNew->bF
16ba0 69 6c 74 65 72 65 64 20 3d 20 31 3b 0a 20 20 20  iltered = 1;.   
16bb0 20 70 49 74 65 72 2d 3e 66 6c 61 67 73 20 3d 20   pIter->flags = 
16bc0 46 54 53 35 5f 53 45 47 49 54 45 52 5f 4f 4e 45  FTS5_SEGITER_ONE
16bd0 54 45 52 4d 3b 0a 20 20 20 20 69 66 28 20 70 44  TERM;.    if( pD
16be0 61 74 61 2d 3e 73 7a 4c 65 61 66 3e 30 20 29 7b  ata->szLeaf>0 ){
16bf0 0a 20 20 20 20 20 20 70 49 74 65 72 2d 3e 70 4c  .      pIter->pL
16c00 65 61 66 20 3d 20 70 44 61 74 61 3b 0a 20 20 20  eaf = pData;.   
16c10 20 20 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f     pIter->iLeafO
16c20 66 66 73 65 74 20 3d 20 66 74 73 35 47 65 74 56  ffset = fts5GetV
16c30 61 72 69 6e 74 28 70 44 61 74 61 2d 3e 70 2c 20  arint(pData->p, 
16c40 28 75 36 34 2a 29 26 70 49 74 65 72 2d 3e 69 52  (u64*)&pIter->iR
16c50 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 70 49 74  owid);.      pIt
16c60 65 72 2d 3e 69 45 6e 64 6f 66 44 6f 63 6c 69 73  er->iEndofDoclis
16c70 74 20 3d 20 70 44 61 74 61 2d 3e 6e 6e 3b 0a 20  t = pData->nn;. 
16c80 20 20 20 20 20 70 4e 65 77 2d 3e 61 46 69 72 73       pNew->aFirs
16c90 74 5b 31 5d 2e 69 46 69 72 73 74 20 3d 20 31 3b  t[1].iFirst = 1;
16ca0 0a 20 20 20 20 20 20 69 66 28 20 62 44 65 73 63  .      if( bDesc
16cb0 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4e 65 77   ){.        pNew
16cc0 2d 3e 62 52 65 76 20 3d 20 31 3b 0a 20 20 20 20  ->bRev = 1;.    
16cd0 20 20 20 20 70 49 74 65 72 2d 3e 66 6c 61 67 73      pIter->flags
16ce0 20 7c 3d 20 46 54 53 35 5f 53 45 47 49 54 45 52   |= FTS5_SEGITER
16cf0 5f 52 45 56 45 52 53 45 3b 0a 20 20 20 20 20 20  _REVERSE;.      
16d00 20 20 66 74 73 35 53 65 67 49 74 65 72 52 65 76    fts5SegIterRev
16d10 65 72 73 65 49 6e 69 74 50 61 67 65 28 70 2c 20  erseInitPage(p, 
16d20 70 49 74 65 72 29 3b 0a 20 20 20 20 20 20 7d 65  pIter);.      }e
16d30 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 66 74 73  lse{.        fts
16d40 35 53 65 67 49 74 65 72 4c 6f 61 64 4e 50 6f 73  5SegIterLoadNPos
16d50 28 70 2c 20 70 49 74 65 72 29 3b 0a 20 20 20 20  (p, pIter);.    
16d60 20 20 7d 0a 20 20 20 20 20 20 70 44 61 74 61 20    }.      pData 
16d70 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  = 0;.    }else{.
16d80 20 20 20 20 20 20 70 4e 65 77 2d 3e 62 45 6f 66        pNew->bEof
16d90 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20   = 1;.    }.    
16da0 66 74 73 35 53 65 67 49 74 65 72 53 65 74 4e 65  fts5SegIterSetNe
16db0 78 74 28 70 2c 20 70 49 74 65 72 29 3b 0a 0a 20  xt(p, pIter);.. 
16dc0 20 20 20 2a 70 70 4f 75 74 20 3d 20 70 4e 65 77     *ppOut = pNew
16dd0 3b 0a 20 20 7d 0a 0a 20 20 66 74 73 35 44 61 74  ;.  }..  fts5Dat
16de0 61 52 65 6c 65 61 73 65 28 70 44 61 74 61 29 3b  aRelease(pData);
16df0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
16e00 20 74 72 75 65 20 69 66 20 74 68 65 20 69 74 65   true if the ite
16e10 72 61 74 6f 72 20 69 73 20 61 74 20 45 4f 46 20  rator is at EOF 
16e20 6f 72 20 69 66 20 61 6e 20 65 72 72 6f 72 20 68  or if an error h
16e30 61 73 20 6f 63 63 75 72 72 65 64 2e 20 0a 2a 2a  as occurred. .**
16e40 20 46 61 6c 73 65 20 6f 74 68 65 72 77 69 73 65   False otherwise
16e50 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
16e60 66 74 73 35 4d 75 6c 74 69 49 74 65 72 45 6f 66  fts5MultiIterEof
16e70 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 46  (Fts5Index *p, F
16e80 74 73 35 49 6e 64 65 78 49 74 65 72 20 2a 70 49  ts5IndexIter *pI
16e90 74 65 72 29 7b 0a 20 20 61 73 73 65 72 74 28 20  ter){.  assert( 
16ea0 70 2d 3e 72 63 20 0a 20 20 20 20 20 20 7c 7c 20  p->rc .      || 
16eb0 28 70 49 74 65 72 2d 3e 61 53 65 67 5b 20 70 49  (pIter->aSeg[ pI
16ec0 74 65 72 2d 3e 61 46 69 72 73 74 5b 31 5d 2e 69  ter->aFirst[1].i
16ed0 46 69 72 73 74 20 5d 2e 70 4c 65 61 66 3d 3d 30  First ].pLeaf==0
16ee0 29 3d 3d 70 49 74 65 72 2d 3e 62 45 6f 66 20 0a  )==pIter->bEof .
16ef0 20 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 70    );.  return (p
16f00 2d 3e 72 63 20 7c 7c 20 70 49 74 65 72 2d 3e 62  ->rc || pIter->b
16f10 45 6f 66 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  Eof);.}../*.** R
16f20 65 74 75 72 6e 20 74 68 65 20 72 6f 77 69 64 20  eturn the rowid 
16f30 6f 66 20 74 68 65 20 65 6e 74 72 79 20 74 68 61  of the entry tha
16f40 74 20 74 68 65 20 69 74 65 72 61 74 6f 72 20 63  t the iterator c
16f50 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 73 0a  urrently points.
16f60 2a 2a 20 74 6f 2e 20 49 66 20 74 68 65 20 69 74  ** to. If the it
16f70 65 72 61 74 6f 72 20 70 6f 69 6e 74 73 20 74 6f  erator points to
16f80 20 45 4f 46 20 77 68 65 6e 20 74 68 69 73 20 66   EOF when this f
16f90 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
16fa0 64 20 74 68 65 0a 2a 2a 20 72 65 73 75 6c 74 73  d the.** results
16fb0 20 61 72 65 20 75 6e 64 65 66 69 6e 65 64 2e 0a   are undefined..
16fc0 2a 2f 0a 73 74 61 74 69 63 20 69 36 34 20 66 74  */.static i64 ft
16fd0 73 35 4d 75 6c 74 69 49 74 65 72 52 6f 77 69 64  s5MultiIterRowid
16fe0 28 46 74 73 35 49 6e 64 65 78 49 74 65 72 20 2a  (Fts5IndexIter *
16ff0 70 49 74 65 72 29 7b 0a 20 20 61 73 73 65 72 74  pIter){.  assert
17000 28 20 70 49 74 65 72 2d 3e 61 53 65 67 5b 20 70  ( pIter->aSeg[ p
17010 49 74 65 72 2d 3e 61 46 69 72 73 74 5b 31 5d 2e  Iter->aFirst[1].
17020 69 46 69 72 73 74 20 5d 2e 70 4c 65 61 66 20 29  iFirst ].pLeaf )
17030 3b 0a 20 20 72 65 74 75 72 6e 20 70 49 74 65 72  ;.  return pIter
17040 2d 3e 61 53 65 67 5b 20 70 49 74 65 72 2d 3e 61  ->aSeg[ pIter->a
17050 46 69 72 73 74 5b 31 5d 2e 69 46 69 72 73 74 20  First[1].iFirst 
17060 5d 2e 69 52 6f 77 69 64 3b 0a 7d 0a 0a 2f 2a 0a  ].iRowid;.}../*.
17070 2a 2a 20 4d 6f 76 65 20 74 68 65 20 69 74 65 72  ** Move the iter
17080 61 74 6f 72 20 74 6f 20 74 68 65 20 6e 65 78 74  ator to the next
17090 20 65 6e 74 72 79 20 61 74 20 6f 72 20 66 6f 6c   entry at or fol
170a0 6c 6f 77 69 6e 67 20 69 4d 61 74 63 68 2e 0a 2a  lowing iMatch..*
170b0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  /.static void ft
170c0 73 35 4d 75 6c 74 69 49 74 65 72 4e 65 78 74 46  s5MultiIterNextF
170d0 72 6f 6d 28 0a 20 20 46 74 73 35 49 6e 64 65 78  rom(.  Fts5Index
170e0 20 2a 70 2c 20 0a 20 20 46 74 73 35 49 6e 64 65   *p, .  Fts5Inde
170f0 78 49 74 65 72 20 2a 70 49 74 65 72 2c 20 0a 20  xIter *pIter, . 
17100 20 69 36 34 20 69 4d 61 74 63 68 0a 29 7b 0a 20   i64 iMatch.){. 
17110 20 77 68 69 6c 65 28 20 31 20 29 7b 0a 20 20 20   while( 1 ){.   
17120 20 69 36 34 20 69 52 6f 77 69 64 3b 0a 20 20 20   i64 iRowid;.   
17130 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 4e 65   fts5MultiIterNe
17140 78 74 28 70 2c 20 70 49 74 65 72 2c 20 31 2c 20  xt(p, pIter, 1, 
17150 69 4d 61 74 63 68 29 3b 0a 20 20 20 20 69 66 28  iMatch);.    if(
17160 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 45 6f   fts5MultiIterEo
17170 66 28 70 2c 20 70 49 74 65 72 29 20 29 20 62 72  f(p, pIter) ) br
17180 65 61 6b 3b 0a 20 20 20 20 69 52 6f 77 69 64 20  eak;.    iRowid 
17190 3d 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 52  = fts5MultiIterR
171a0 6f 77 69 64 28 70 49 74 65 72 29 3b 0a 20 20 20  owid(pIter);.   
171b0 20 69 66 28 20 70 49 74 65 72 2d 3e 62 52 65 76   if( pIter->bRev
171c0 3d 3d 30 20 26 26 20 69 52 6f 77 69 64 3e 3d 69  ==0 && iRowid>=i
171d0 4d 61 74 63 68 20 29 20 62 72 65 61 6b 3b 0a 20  Match ) break;. 
171e0 20 20 20 69 66 28 20 70 49 74 65 72 2d 3e 62 52     if( pIter->bR
171f0 65 76 21 3d 30 20 26 26 20 69 52 6f 77 69 64 3c  ev!=0 && iRowid<
17200 3d 69 4d 61 74 63 68 20 29 20 62 72 65 61 6b 3b  =iMatch ) break;
17210 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  .  }.}../*.** Re
17220 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
17230 6f 20 61 20 62 75 66 66 65 72 20 63 6f 6e 74 61  o a buffer conta
17240 69 6e 69 6e 67 20 74 68 65 20 74 65 72 6d 20 61  ining the term a
17250 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74  ssociated with t
17260 68 65 20 0a 2a 2a 20 65 6e 74 72 79 20 74 68 61  he .** entry tha
17270 74 20 74 68 65 20 69 74 65 72 61 74 6f 72 20 63  t the iterator c
17280 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 73 20  urrently points 
17290 74 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f  to..*/.static co
172a0 6e 73 74 20 75 38 20 2a 66 74 73 35 4d 75 6c 74  nst u8 *fts5Mult
172b0 69 49 74 65 72 54 65 72 6d 28 46 74 73 35 49 6e  iIterTerm(Fts5In
172c0 64 65 78 49 74 65 72 20 2a 70 49 74 65 72 2c 20  dexIter *pIter, 
172d0 69 6e 74 20 2a 70 6e 29 7b 0a 20 20 46 74 73 35  int *pn){.  Fts5
172e0 53 65 67 49 74 65 72 20 2a 70 20 3d 20 26 70 49  SegIter *p = &pI
172f0 74 65 72 2d 3e 61 53 65 67 5b 20 70 49 74 65 72  ter->aSeg[ pIter
17300 2d 3e 61 46 69 72 73 74 5b 31 5d 2e 69 46 69 72  ->aFirst[1].iFir
17310 73 74 20 5d 3b 0a 20 20 2a 70 6e 20 3d 20 70 2d  st ];.  *pn = p-
17320 3e 74 65 72 6d 2e 6e 3b 0a 20 20 72 65 74 75 72  >term.n;.  retur
17330 6e 20 70 2d 3e 74 65 72 6d 2e 70 3b 0a 7d 0a 0a  n p->term.p;.}..
17340 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
17350 43 68 75 6e 6b 49 74 65 72 61 74 65 28 0a 20 20  ChunkIterate(.  
17360 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 20 20  Fts5Index *p,   
17370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17380 2f 2a 20 49 6e 64 65 78 20 6f 62 6a 65 63 74 20  /* Index object 
17390 2a 2f 0a 20 20 46 74 73 35 53 65 67 49 74 65 72  */.  Fts5SegIter
173a0 20 2a 70 53 65 67 2c 20 20 20 20 20 20 20 20 20   *pSeg,         
173b0 20 20 20 20 20 2f 2a 20 50 6f 73 6c 69 73 74 20       /* Poslist 
173c0 6f 66 20 74 68 69 73 20 69 74 65 72 61 74 6f 72  of this iterator
173d0 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 43 74 78   */.  void *pCtx
173e0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
173f0 20 20 20 20 20 20 2f 2a 20 43 6f 6e 74 65 78 74        /* Context
17400 20 70 6f 69 6e 74 65 72 20 66 6f 72 20 78 43 68   pointer for xCh
17410 75 6e 6b 20 63 61 6c 6c 62 61 63 6b 20 2a 2f 0a  unk callback */.
17420 20 20 76 6f 69 64 20 28 2a 78 43 68 75 6e 6b 29    void (*xChunk)
17430 28 46 74 73 35 49 6e 64 65 78 2a 2c 20 76 6f 69  (Fts5Index*, voi
17440 64 2a 2c 20 63 6f 6e 73 74 20 75 38 2a 2c 20 69  d*, const u8*, i
17450 6e 74 29 0a 29 7b 0a 20 20 69 6e 74 20 6e 52 65  nt).){.  int nRe
17460 6d 20 3d 20 70 53 65 67 2d 3e 6e 50 6f 73 3b 20  m = pSeg->nPos; 
17470 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
17480 65 72 20 6f 66 20 62 79 74 65 73 20 73 74 69 6c  er of bytes stil
17490 6c 20 74 6f 20 63 6f 6d 65 20 2a 2f 0a 20 20 46  l to come */.  F
174a0 74 73 35 44 61 74 61 20 2a 70 44 61 74 61 20 3d  ts5Data *pData =
174b0 20 30 3b 0a 20 20 75 38 20 2a 70 43 68 75 6e 6b   0;.  u8 *pChunk
174c0 20 3d 20 26 70 53 65 67 2d 3e 70 4c 65 61 66 2d   = &pSeg->pLeaf-
174d0 3e 70 5b 70 53 65 67 2d 3e 69 4c 65 61 66 4f 66  >p[pSeg->iLeafOf
174e0 66 73 65 74 5d 3b 0a 20 20 69 6e 74 20 6e 43 68  fset];.  int nCh
174f0 75 6e 6b 20 3d 20 4d 49 4e 28 6e 52 65 6d 2c 20  unk = MIN(nRem, 
17500 70 53 65 67 2d 3e 70 4c 65 61 66 2d 3e 73 7a 4c  pSeg->pLeaf->szL
17510 65 61 66 20 2d 20 70 53 65 67 2d 3e 69 4c 65 61  eaf - pSeg->iLea
17520 66 4f 66 66 73 65 74 29 3b 0a 20 20 69 6e 74 20  fOffset);.  int 
17530 70 67 6e 6f 20 3d 20 70 53 65 67 2d 3e 69 4c 65  pgno = pSeg->iLe
17540 61 66 50 67 6e 6f 3b 0a 20 20 69 6e 74 20 70 67  afPgno;.  int pg
17550 6e 6f 53 61 76 65 20 3d 20 30 3b 0a 0a 20 20 2f  noSave = 0;..  /
17560 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
17570 64 6f 65 73 20 6e 6f 74 6d 77 6f 72 6b 20 77 69  does notmwork wi
17580 74 68 20 64 65 74 61 69 6c 3d 6e 6f 6e 65 20 64  th detail=none d
17590 61 74 61 62 61 73 65 73 2e 20 2a 2f 0a 20 20 61  atabases. */.  a
175a0 73 73 65 72 74 28 20 70 2d 3e 70 43 6f 6e 66 69  ssert( p->pConfi
175b0 67 2d 3e 65 44 65 74 61 69 6c 21 3d 46 54 53 35  g->eDetail!=FTS5
175c0 5f 44 45 54 41 49 4c 5f 4e 4f 4e 45 20 29 3b 0a  _DETAIL_NONE );.
175d0 0a 20 20 69 66 28 20 28 70 53 65 67 2d 3e 66 6c  .  if( (pSeg->fl
175e0 61 67 73 20 26 20 46 54 53 35 5f 53 45 47 49 54  ags & FTS5_SEGIT
175f0 45 52 5f 52 45 56 45 52 53 45 29 3d 3d 30 20 29  ER_REVERSE)==0 )
17600 7b 0a 20 20 20 20 70 67 6e 6f 53 61 76 65 20 3d  {.    pgnoSave =
17610 20 70 67 6e 6f 2b 31 3b 0a 20 20 7d 0a 0a 20 20   pgno+1;.  }..  
17620 77 68 69 6c 65 28 20 31 20 29 7b 0a 20 20 20 20  while( 1 ){.    
17630 78 43 68 75 6e 6b 28 70 2c 20 70 43 74 78 2c 20  xChunk(p, pCtx, 
17640 70 43 68 75 6e 6b 2c 20 6e 43 68 75 6e 6b 29 3b  pChunk, nChunk);
17650 0a 20 20 20 20 6e 52 65 6d 20 2d 3d 20 6e 43 68  .    nRem -= nCh
17660 75 6e 6b 3b 0a 20 20 20 20 66 74 73 35 44 61 74  unk;.    fts5Dat
17670 61 52 65 6c 65 61 73 65 28 70 44 61 74 61 29 3b  aRelease(pData);
17680 0a 20 20 20 20 69 66 28 20 6e 52 65 6d 3c 3d 30  .    if( nRem<=0
17690 20 29 7b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   ){.      break;
176a0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
176b0 20 20 70 67 6e 6f 2b 2b 3b 0a 20 20 20 20 20 20    pgno++;.      
176c0 70 44 61 74 61 20 3d 20 66 74 73 35 44 61 74 61  pData = fts5Data
176d0 52 65 61 64 28 70 2c 20 46 54 53 35 5f 53 45 47  Read(p, FTS5_SEG
176e0 4d 45 4e 54 5f 52 4f 57 49 44 28 70 53 65 67 2d  MENT_ROWID(pSeg-
176f0 3e 70 53 65 67 2d 3e 69 53 65 67 69 64 2c 20 70  >pSeg->iSegid, p
17700 67 6e 6f 29 29 3b 0a 20 20 20 20 20 20 69 66 28  gno));.      if(
17710 20 70 44 61 74 61 3d 3d 30 20 29 20 62 72 65 61   pData==0 ) brea
17720 6b 3b 0a 20 20 20 20 20 20 70 43 68 75 6e 6b 20  k;.      pChunk 
17730 3d 20 26 70 44 61 74 61 2d 3e 70 5b 34 5d 3b 0a  = &pData->p[4];.
17740 20 20 20 20 20 20 6e 43 68 75 6e 6b 20 3d 20 4d        nChunk = M
17750 49 4e 28 6e 52 65 6d 2c 20 70 44 61 74 61 2d 3e  IN(nRem, pData->
17760 73 7a 4c 65 61 66 20 2d 20 34 29 3b 0a 20 20 20  szLeaf - 4);.   
17770 20 20 20 69 66 28 20 70 67 6e 6f 3d 3d 70 67 6e     if( pgno==pgn
17780 6f 53 61 76 65 20 29 7b 0a 20 20 20 20 20 20 20  oSave ){.       
17790 20 61 73 73 65 72 74 28 20 70 53 65 67 2d 3e 70   assert( pSeg->p
177a0 4e 65 78 74 4c 65 61 66 3d 3d 30 20 29 3b 0a 20  NextLeaf==0 );. 
177b0 20 20 20 20 20 20 20 70 53 65 67 2d 3e 70 4e 65         pSeg->pNe
177c0 78 74 4c 65 61 66 20 3d 20 70 44 61 74 61 3b 0a  xtLeaf = pData;.
177d0 20 20 20 20 20 20 20 20 70 44 61 74 61 20 3d 20          pData = 
177e0 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  0;.      }.    }
177f0 0a 20 20 7d 0a 7d 0a 0a 0a 0a 2f 2a 0a 2a 2a 20  .  }.}..../*.** 
17800 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 73  Allocate a new s
17810 65 67 6d 65 6e 74 2d 69 64 20 66 6f 72 20 74 68  egment-id for th
17820 65 20 73 74 72 75 63 74 75 72 65 20 70 53 74 72  e structure pStr
17830 75 63 74 2e 20 54 68 65 20 6e 65 77 20 73 65 67  uct. The new seg
17840 6d 65 6e 74 0a 2a 2a 20 69 64 20 6d 75 73 74 20  ment.** id must 
17850 62 65 20 62 65 74 77 65 65 6e 20 31 20 61 6e 64  be between 1 and
17860 20 36 35 33 33 35 20 69 6e 63 6c 75 73 69 76 65   65335 inclusive
17870 2c 20 61 6e 64 20 6d 75 73 74 20 6e 6f 74 20 62  , and must not b
17880 65 20 75 73 65 64 20 62 79 20 0a 2a 2a 20 61 6e  e used by .** an
17890 79 20 63 75 72 72 65 6e 74 6c 79 20 65 78 69 73  y currently exis
178a0 74 69 6e 67 20 73 65 67 6d 65 6e 74 2e 20 49 66  ting segment. If
178b0 20 61 20 66 72 65 65 20 73 65 67 6d 65 6e 74 20   a free segment 
178c0 69 64 20 63 61 6e 6e 6f 74 20 62 65 20 66 6f 75  id cannot be fou
178d0 6e 64 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 46 55  nd,.** SQLITE_FU
178e0 4c 4c 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  LL is returned..
178f0 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f  **.** If an erro
17900 72 20 68 61 73 20 61 6c 72 65 61 64 79 20 6f 63  r has already oc
17910 63 75 72 72 65 64 2c 20 74 68 69 73 20 66 75 6e  curred, this fun
17920 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70  ction is a no-op
17930 2e 20 30 20 69 73 20 0a 2a 2a 20 72 65 74 75 72  . 0 is .** retur
17940 6e 65 64 20 69 6e 20 74 68 69 73 20 63 61 73 65  ned in this case
17950 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
17960 66 74 73 35 41 6c 6c 6f 63 61 74 65 53 65 67 69  fts5AllocateSegi
17970 64 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20  d(Fts5Index *p, 
17980 46 74 73 35 53 74 72 75 63 74 75 72 65 20 2a 70  Fts5Structure *p
17990 53 74 72 75 63 74 29 7b 0a 20 20 69 6e 74 20 69  Struct){.  int i
179a0 53 65 67 69 64 20 3d 20 30 3b 0a 0a 20 20 69 66  Segid = 0;..  if
179b0 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
179c0 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 70 53  OK ){.    if( pS
179d0 74 72 75 63 74 2d 3e 6e 53 65 67 6d 65 6e 74 3e  truct->nSegment>
179e0 3d 46 54 53 35 5f 4d 41 58 5f 53 45 47 4d 45 4e  =FTS5_MAX_SEGMEN
179f0 54 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 72 63  T ){.      p->rc
17a00 20 3d 20 53 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a   = SQLITE_FULL;.
17a10 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
17a20 20 77 68 69 6c 65 28 20 69 53 65 67 69 64 3d 3d   while( iSegid==
17a30 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  0 ){.        int
17a40 20 69 4c 76 6c 2c 20 69 53 65 67 3b 0a 20 20 20   iLvl, iSeg;.   
17a50 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 61 6e       sqlite3_ran
17a60 64 6f 6d 6e 65 73 73 28 73 69 7a 65 6f 66 28 75  domness(sizeof(u
17a70 33 32 29 2c 20 28 76 6f 69 64 2a 29 26 69 53 65  32), (void*)&iSe
17a80 67 69 64 29 3b 0a 20 20 20 20 20 20 20 20 69 53  gid);.        iS
17a90 65 67 69 64 20 3d 20 69 53 65 67 69 64 20 26 20  egid = iSegid & 
17aa0 28 28 31 20 3c 3c 20 46 54 53 35 5f 44 41 54 41  ((1 << FTS5_DATA
17ab0 5f 49 44 5f 42 29 2d 31 29 3b 0a 20 20 20 20 20  _ID_B)-1);.     
17ac0 20 20 20 66 6f 72 28 69 4c 76 6c 3d 30 3b 20 69     for(iLvl=0; i
17ad0 4c 76 6c 3c 70 53 74 72 75 63 74 2d 3e 6e 4c 65  Lvl<pStruct->nLe
17ae0 76 65 6c 3b 20 69 4c 76 6c 2b 2b 29 7b 0a 20 20  vel; iLvl++){.  
17af0 20 20 20 20 20 20 20 20 66 6f 72 28 69 53 65 67          for(iSeg
17b00 3d 30 3b 20 69 53 65 67 3c 70 53 74 72 75 63 74  =0; iSeg<pStruct
17b10 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d 2e 6e  ->aLevel[iLvl].n
17b20 53 65 67 3b 20 69 53 65 67 2b 2b 29 7b 0a 20 20  Seg; iSeg++){.  
17b30 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69 53            if( iS
17b40 65 67 69 64 3d 3d 70 53 74 72 75 63 74 2d 3e 61  egid==pStruct->a
17b50 4c 65 76 65 6c 5b 69 4c 76 6c 5d 2e 61 53 65 67  Level[iLvl].aSeg
17b60 5b 69 53 65 67 5d 2e 69 53 65 67 69 64 20 29 7b  [iSeg].iSegid ){
17b70 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  .              i
17b80 53 65 67 69 64 20 3d 20 30 3b 0a 20 20 20 20 20  Segid = 0;.     
17b90 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
17ba0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
17bb0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
17bc0 0a 0a 20 20 72 65 74 75 72 6e 20 69 53 65 67 69  ..  return iSegi
17bd0 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 69 73 63  d;.}../*.** Disc
17be0 61 72 64 20 61 6c 6c 20 64 61 74 61 20 63 75 72  ard all data cur
17bf0 72 65 6e 74 6c 79 20 63 61 63 68 65 64 20 69 6e  rently cached in
17c00 20 74 68 65 20 68 61 73 68 2d 74 61 62 6c 65 73   the hash-tables
17c10 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
17c20 20 66 74 73 35 49 6e 64 65 78 44 69 73 63 61 72   fts5IndexDiscar
17c30 64 44 61 74 61 28 46 74 73 35 49 6e 64 65 78 20  dData(Fts5Index 
17c40 2a 70 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70  *p){.  assert( p
17c50 2d 3e 70 48 61 73 68 20 7c 7c 20 70 2d 3e 6e 50  ->pHash || p->nP
17c60 65 6e 64 69 6e 67 44 61 74 61 3d 3d 30 20 29 3b  endingData==0 );
17c70 0a 20 20 69 66 28 20 70 2d 3e 70 48 61 73 68 20  .  if( p->pHash 
17c80 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 46 74  ){.    sqlite3Ft
17c90 73 35 48 61 73 68 43 6c 65 61 72 28 70 2d 3e 70  s5HashClear(p->p
17ca0 48 61 73 68 29 3b 0a 20 20 20 20 70 2d 3e 6e 50  Hash);.    p->nP
17cb0 65 6e 64 69 6e 67 44 61 74 61 20 3d 20 30 3b 0a  endingData = 0;.
17cc0 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74    }.}../*.** Ret
17cd0 75 72 6e 20 74 68 65 20 73 69 7a 65 20 6f 66 20  urn the size of 
17ce0 74 68 65 20 70 72 65 66 69 78 2c 20 69 6e 20 62  the prefix, in b
17cf0 79 74 65 73 2c 20 74 68 61 74 20 62 75 66 66 65  ytes, that buffe
17d00 72 20 28 6e 4e 65 77 2f 70 4e 65 77 29 20 73 68  r (nNew/pNew) sh
17d10 61 72 65 73 0a 2a 2a 20 77 69 74 68 20 62 75 66  ares.** with buf
17d20 66 65 72 20 28 6e 4f 6c 64 2f 70 4f 6c 64 29 2e  fer (nOld/pOld).
17d30 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .*/.static int f
17d40 74 73 35 50 72 65 66 69 78 43 6f 6d 70 72 65 73  ts5PrefixCompres
17d50 73 28 0a 20 20 69 6e 74 20 6e 4f 6c 64 2c 20 63  s(.  int nOld, c
17d60 6f 6e 73 74 20 75 38 20 2a 70 4f 6c 64 2c 0a 20  onst u8 *pOld,. 
17d70 20 69 6e 74 20 6e 4e 65 77 2c 20 63 6f 6e 73 74   int nNew, const
17d80 20 75 38 20 2a 70 4e 65 77 0a 29 7b 0a 20 20 69   u8 *pNew.){.  i
17d90 6e 74 20 69 3b 0a 20 20 61 73 73 65 72 74 28 20  nt i;.  assert( 
17da0 66 74 73 35 42 6c 6f 62 43 6f 6d 70 61 72 65 28  fts5BlobCompare(
17db0 70 4f 6c 64 2c 20 6e 4f 6c 64 2c 20 70 4e 65 77  pOld, nOld, pNew
17dc0 2c 20 6e 4e 65 77 29 3c 30 20 29 3b 0a 20 20 66  , nNew)<0 );.  f
17dd0 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f 6c 64 3b 20  or(i=0; i<nOld; 
17de0 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 4f  i++){.    if( pO
17df0 6c 64 5b 69 5d 21 3d 70 4e 65 77 5b 69 5d 20 29  ld[i]!=pNew[i] )
17e00 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72 65   break;.  }.  re
17e10 74 75 72 6e 20 69 3b 0a 7d 0a 0a 73 74 61 74 69  turn i;.}..stati
17e20 63 20 76 6f 69 64 20 66 74 73 35 57 72 69 74 65  c void fts5Write
17e30 44 6c 69 64 78 43 6c 65 61 72 28 0a 20 20 46 74  DlidxClear(.  Ft
17e40 73 35 49 6e 64 65 78 20 2a 70 2c 20 0a 20 20 46  s5Index *p, .  F
17e50 74 73 35 53 65 67 57 72 69 74 65 72 20 2a 70 57  ts5SegWriter *pW
17e60 72 69 74 65 72 2c 0a 20 20 69 6e 74 20 62 46 6c  riter,.  int bFl
17e70 75 73 68 20 20 20 20 20 20 20 20 20 20 20 20 20  ush             
17e80 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74           /* If t
17e90 72 75 65 2c 20 77 72 69 74 65 20 64 6c 69 64 78  rue, write dlidx
17ea0 20 74 6f 20 64 69 73 6b 20 2a 2f 0a 29 7b 0a 20   to disk */.){. 
17eb0 20 69 6e 74 20 69 3b 0a 20 20 61 73 73 65 72 74   int i;.  assert
17ec0 28 20 62 46 6c 75 73 68 3d 3d 30 20 7c 7c 20 28  ( bFlush==0 || (
17ed0 70 57 72 69 74 65 72 2d 3e 6e 44 6c 69 64 78 3e  pWriter->nDlidx>
17ee0 30 20 26 26 20 70 57 72 69 74 65 72 2d 3e 61 44  0 && pWriter->aD
17ef0 6c 69 64 78 5b 30 5d 2e 62 75 66 2e 6e 3e 30 29  lidx[0].buf.n>0)
17f00 20 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   );.  for(i=0; i
17f10 3c 70 57 72 69 74 65 72 2d 3e 6e 44 6c 69 64 78  <pWriter->nDlidx
17f20 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 46 74 73 35  ; i++){.    Fts5
17f30 44 6c 69 64 78 57 72 69 74 65 72 20 2a 70 44 6c  DlidxWriter *pDl
17f40 69 64 78 20 3d 20 26 70 57 72 69 74 65 72 2d 3e  idx = &pWriter->
17f50 61 44 6c 69 64 78 5b 69 5d 3b 0a 20 20 20 20 69  aDlidx[i];.    i
17f60 66 28 20 70 44 6c 69 64 78 2d 3e 62 75 66 2e 6e  f( pDlidx->buf.n
17f70 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ==0 ) break;.   
17f80 20 69 66 28 20 62 46 6c 75 73 68 20 29 7b 0a 20   if( bFlush ){. 
17f90 20 20 20 20 20 61 73 73 65 72 74 28 20 70 44 6c       assert( pDl
17fa0 69 64 78 2d 3e 70 67 6e 6f 21 3d 30 20 29 3b 0a  idx->pgno!=0 );.
17fb0 20 20 20 20 20 20 66 74 73 35 44 61 74 61 57 72        fts5DataWr
17fc0 69 74 65 28 70 2c 20 0a 20 20 20 20 20 20 20 20  ite(p, .        
17fd0 20 20 46 54 53 35 5f 44 4c 49 44 58 5f 52 4f 57    FTS5_DLIDX_ROW
17fe0 49 44 28 70 57 72 69 74 65 72 2d 3e 69 53 65 67  ID(pWriter->iSeg
17ff0 69 64 2c 20 69 2c 20 70 44 6c 69 64 78 2d 3e 70  id, i, pDlidx->p
18000 67 6e 6f 29 2c 0a 20 20 20 20 20 20 20 20 20 20  gno),.          
18010 70 44 6c 69 64 78 2d 3e 62 75 66 2e 70 2c 20 70  pDlidx->buf.p, p
18020 44 6c 69 64 78 2d 3e 62 75 66 2e 6e 0a 20 20 20  Dlidx->buf.n.   
18030 20 20 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20     );.    }.    
18040 73 71 6c 69 74 65 33 46 74 73 35 42 75 66 66 65  sqlite3Fts5Buffe
18050 72 5a 65 72 6f 28 26 70 44 6c 69 64 78 2d 3e 62  rZero(&pDlidx->b
18060 75 66 29 3b 0a 20 20 20 20 70 44 6c 69 64 78 2d  uf);.    pDlidx-
18070 3e 62 50 72 65 76 56 61 6c 69 64 20 3d 20 30 3b  >bPrevValid = 0;
18080 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 72  .  }.}../*.** Gr
18090 6f 77 20 74 68 65 20 70 57 72 69 74 65 72 2d 3e  ow the pWriter->
180a0 61 44 6c 69 64 78 5b 5d 20 61 72 72 61 79 20 74  aDlidx[] array t
180b0 6f 20 61 74 20 6c 65 61 73 74 20 6e 4c 76 6c 20  o at least nLvl 
180c0 65 6c 65 6d 65 6e 74 73 20 69 6e 20 73 69 7a 65  elements in size
180d0 2e 0a 2a 2a 20 41 6e 79 20 6e 65 77 20 61 72 72  ..** Any new arr
180e0 61 79 20 65 6c 65 6d 65 6e 74 73 20 61 72 65 20  ay elements are 
180f0 7a 65 72 6f 65 64 20 62 65 66 6f 72 65 20 72 65  zeroed before re
18100 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74  turning..*/.stat
18110 69 63 20 69 6e 74 20 66 74 73 35 57 72 69 74 65  ic int fts5Write
18120 44 6c 69 64 78 47 72 6f 77 28 0a 20 20 46 74 73  DlidxGrow(.  Fts
18130 35 49 6e 64 65 78 20 2a 70 2c 0a 20 20 46 74 73  5Index *p,.  Fts
18140 35 53 65 67 57 72 69 74 65 72 20 2a 70 57 72 69  5SegWriter *pWri
18150 74 65 72 2c 0a 20 20 69 6e 74 20 6e 4c 76 6c 0a  ter,.  int nLvl.
18160 29 7b 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d  ){.  if( p->rc==
18170 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 6e 4c 76  SQLITE_OK && nLv
18180 6c 3e 3d 70 57 72 69 74 65 72 2d 3e 6e 44 6c 69  l>=pWriter->nDli
18190 64 78 20 29 7b 0a 20 20 20 20 46 74 73 35 44 6c  dx ){.    Fts5Dl
181a0 69 64 78 57 72 69 74 65 72 20 2a 61 44 6c 69 64  idxWriter *aDlid
181b0 78 20 3d 20 28 46 74 73 35 44 6c 69 64 78 57 72  x = (Fts5DlidxWr
181c0 69 74 65 72 2a 29 73 71 6c 69 74 65 33 5f 72 65  iter*)sqlite3_re
181d0 61 6c 6c 6f 63 28 0a 20 20 20 20 20 20 20 20 70  alloc(.        p
181e0 57 72 69 74 65 72 2d 3e 61 44 6c 69 64 78 2c 20  Writer->aDlidx, 
181f0 73 69 7a 65 6f 66 28 46 74 73 35 44 6c 69 64 78  sizeof(Fts5Dlidx
18200 57 72 69 74 65 72 29 20 2a 20 6e 4c 76 6c 0a 20  Writer) * nLvl. 
18210 20 20 20 29 3b 0a 20 20 20 20 69 66 28 20 61 44     );.    if( aD
18220 6c 69 64 78 3d 3d 30 20 29 7b 0a 20 20 20 20 20  lidx==0 ){.     
18230 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f   p->rc = SQLITE_
18240 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 65 6c 73 65  NOMEM;.    }else
18250 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 42 79 74  {.      int nByt
18260 65 20 3d 20 73 69 7a 65 6f 66 28 46 74 73 35 44  e = sizeof(Fts5D
18270 6c 69 64 78 57 72 69 74 65 72 29 20 2a 20 28 6e  lidxWriter) * (n
18280 4c 76 6c 20 2d 20 70 57 72 69 74 65 72 2d 3e 6e  Lvl - pWriter->n
18290 44 6c 69 64 78 29 3b 0a 20 20 20 20 20 20 6d 65  Dlidx);.      me
182a0 6d 73 65 74 28 26 61 44 6c 69 64 78 5b 70 57 72  mset(&aDlidx[pWr
182b0 69 74 65 72 2d 3e 6e 44 6c 69 64 78 5d 2c 20 30  iter->nDlidx], 0
182c0 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20 20 20 20  , nByte);.      
182d0 70 57 72 69 74 65 72 2d 3e 61 44 6c 69 64 78 20  pWriter->aDlidx 
182e0 3d 20 61 44 6c 69 64 78 3b 0a 20 20 20 20 20 20  = aDlidx;.      
182f0 70 57 72 69 74 65 72 2d 3e 6e 44 6c 69 64 78 20  pWriter->nDlidx 
18300 3d 20 6e 4c 76 6c 3b 0a 20 20 20 20 7d 0a 20 20  = nLvl;.    }.  
18310 7d 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e 72 63  }.  return p->rc
18320 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68  ;.}../*.** If th
18330 65 20 63 75 72 72 65 6e 74 20 64 6f 63 6c 69 73  e current doclis
18340 74 2d 69 6e 64 65 78 20 61 63 63 75 6d 75 6c 61  t-index accumula
18350 74 69 6e 67 20 69 6e 20 70 57 72 69 74 65 72 2d  ting in pWriter-
18360 3e 61 44 6c 69 64 78 5b 5d 20 69 73 20 6c 61 72  >aDlidx[] is lar
18370 67 65 0a 2a 2a 20 65 6e 6f 75 67 68 2c 20 66 6c  ge.** enough, fl
18380 75 73 68 20 69 74 20 74 6f 20 64 69 73 6b 20 61  ush it to disk a
18390 6e 64 20 72 65 74 75 72 6e 20 31 2e 20 4f 74 68  nd return 1. Oth
183a0 65 72 77 69 73 65 20 64 69 73 63 61 72 64 20 69  erwise discard i
183b0 74 20 61 6e 64 20 72 65 74 75 72 6e 0a 2a 2a 20  t and return.** 
183c0 7a 65 72 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  zero..*/.static 
183d0 69 6e 74 20 66 74 73 35 57 72 69 74 65 46 6c 75  int fts5WriteFlu
183e0 73 68 44 6c 69 64 78 28 46 74 73 35 49 6e 64 65  shDlidx(Fts5Inde
183f0 78 20 2a 70 2c 20 46 74 73 35 53 65 67 57 72 69  x *p, Fts5SegWri
18400 74 65 72 20 2a 70 57 72 69 74 65 72 29 7b 0a 20  ter *pWriter){. 
18410 20 69 6e 74 20 62 46 6c 61 67 20 3d 20 30 3b 0a   int bFlag = 0;.
18420 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 77  .  /* If there w
18430 65 72 65 20 46 54 53 35 5f 4d 49 4e 5f 44 4c 49  ere FTS5_MIN_DLI
18440 44 58 5f 53 49 5a 45 20 6f 72 20 6d 6f 72 65 20  DX_SIZE or more 
18450 65 6d 70 74 79 20 6c 65 61 66 20 70 61 67 65 73  empty leaf pages
18460 20 77 72 69 74 74 65 6e 0a 20 20 2a 2a 20 74 6f   written.  ** to
18470 20 74 68 65 20 64 61 74 61 62 61 73 65 2c 20 61   the database, a
18480 6c 73 6f 20 77 72 69 74 65 20 74 68 65 20 64 6f  lso write the do
18490 63 6c 69 73 74 2d 69 6e 64 65 78 20 74 6f 20 64  clist-index to d
184a0 69 73 6b 2e 20 20 2a 2f 0a 20 20 69 66 28 20 70  isk.  */.  if( p
184b0 57 72 69 74 65 72 2d 3e 61 44 6c 69 64 78 5b 30  Writer->aDlidx[0
184c0 5d 2e 62 75 66 2e 6e 3e 30 20 26 26 20 70 57 72  ].buf.n>0 && pWr
184d0 69 74 65 72 2d 3e 6e 45 6d 70 74 79 3e 3d 46 54  iter->nEmpty>=FT
184e0 53 35 5f 4d 49 4e 5f 44 4c 49 44 58 5f 53 49 5a  S5_MIN_DLIDX_SIZ
184f0 45 20 29 7b 0a 20 20 20 20 62 46 6c 61 67 20 3d  E ){.    bFlag =
18500 20 31 3b 0a 20 20 7d 0a 20 20 66 74 73 35 57 72   1;.  }.  fts5Wr
18510 69 74 65 44 6c 69 64 78 43 6c 65 61 72 28 70 2c  iteDlidxClear(p,
18520 20 70 57 72 69 74 65 72 2c 20 62 46 6c 61 67 29   pWriter, bFlag)
18530 3b 0a 20 20 70 57 72 69 74 65 72 2d 3e 6e 45 6d  ;.  pWriter->nEm
18540 70 74 79 20 3d 20 30 3b 0a 20 20 72 65 74 75 72  pty = 0;.  retur
18550 6e 20 62 46 6c 61 67 3b 0a 7d 0a 0a 2f 2a 0a 2a  n bFlag;.}../*.*
18560 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
18570 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 65 76  is called whenev
18580 65 72 20 70 72 6f 63 65 73 73 69 6e 67 20 6f 66  er processing of
18590 20 74 68 65 20 64 6f 63 6c 69 73 74 20 66 6f 72   the doclist for
185a0 20 74 68 65 20 0a 2a 2a 20 6c 61 73 74 20 74 65   the .** last te
185b0 72 6d 20 6f 6e 20 6c 65 61 66 20 70 61 67 65 20  rm on leaf page 
185c0 28 70 57 72 69 74 65 72 2d 3e 69 42 74 50 61 67  (pWriter->iBtPag
185d0 65 29 20 69 73 20 63 6f 6d 70 6c 65 74 65 64 2e  e) is completed.
185e0 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 6f 63 6c   .**.** The docl
185f0 69 73 74 2d 69 6e 64 65 78 20 66 6f 72 20 74 68  ist-index for th
18600 61 74 20 74 65 72 6d 20 69 73 20 63 75 72 72 65  at term is curre
18610 6e 74 6c 79 20 73 74 6f 72 65 64 20 69 6e 2d 6d  ntly stored in-m
18620 65 6d 6f 72 79 20 77 69 74 68 69 6e 20 74 68 65  emory within the
18630 0a 2a 2a 20 46 74 73 35 53 65 67 57 72 69 74 65  .** Fts5SegWrite
18640 72 2e 61 44 6c 69 64 78 5b 5d 20 61 72 72 61 79  r.aDlidx[] array
18650 2e 20 49 66 20 69 74 20 69 73 20 6c 61 72 67 65  . If it is large
18660 20 65 6e 6f 75 67 68 2c 20 74 68 69 73 20 66 75   enough, this fu
18670 6e 63 74 69 6f 6e 0a 2a 2a 20 77 72 69 74 65 73  nction.** writes
18680 20 69 74 20 6f 75 74 20 74 6f 20 64 69 73 6b 2e   it out to disk.
18690 20 4f 72 2c 20 69 66 20 69 74 20 69 73 20 74 6f   Or, if it is to
186a0 6f 20 73 6d 61 6c 6c 20 74 6f 20 62 6f 74 68 65  o small to bothe
186b0 72 20 77 69 74 68 2c 20 64 69 73 63 61 72 64 73  r with, discards
186c0 0a 2a 2a 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 46 74  .** it..**.** Ft
186d0 73 35 53 65 67 57 72 69 74 65 72 2e 62 74 74 65  s5SegWriter.btte
186e0 72 6d 20 63 75 72 72 65 6e 74 6c 79 20 63 6f 6e  rm currently con
186f0 74 61 69 6e 73 20 74 68 65 20 66 69 72 73 74 20  tains the first 
18700 74 65 72 6d 20 6f 6e 20 70 61 67 65 20 69 42 74  term on page iBt
18710 50 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  Page..*/.static 
18720 76 6f 69 64 20 66 74 73 35 57 72 69 74 65 46 6c  void fts5WriteFl
18730 75 73 68 42 74 72 65 65 28 46 74 73 35 49 6e 64  ushBtree(Fts5Ind
18740 65 78 20 2a 70 2c 20 46 74 73 35 53 65 67 57 72  ex *p, Fts5SegWr
18750 69 74 65 72 20 2a 70 57 72 69 74 65 72 29 7b 0a  iter *pWriter){.
18760 20 20 69 6e 74 20 62 46 6c 61 67 3b 0a 0a 20 20    int bFlag;..  
18770 61 73 73 65 72 74 28 20 70 57 72 69 74 65 72 2d  assert( pWriter-
18780 3e 69 42 74 50 61 67 65 20 7c 7c 20 70 57 72 69  >iBtPage || pWri
18790 74 65 72 2d 3e 6e 45 6d 70 74 79 3d 3d 30 20 29  ter->nEmpty==0 )
187a0 3b 0a 20 20 69 66 28 20 70 57 72 69 74 65 72 2d  ;.  if( pWriter-
187b0 3e 69 42 74 50 61 67 65 3d 3d 30 20 29 20 72 65  >iBtPage==0 ) re
187c0 74 75 72 6e 3b 0a 20 20 62 46 6c 61 67 20 3d 20  turn;.  bFlag = 
187d0 66 74 73 35 57 72 69 74 65 46 6c 75 73 68 44 6c  fts5WriteFlushDl
187e0 69 64 78 28 70 2c 20 70 57 72 69 74 65 72 29 3b  idx(p, pWriter);
187f0 0a 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53  ..  if( p->rc==S
18800 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
18810 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20  const char *z = 
18820 28 70 57 72 69 74 65 72 2d 3e 62 74 74 65 72 6d  (pWriter->btterm
18830 2e 6e 3e 30 3f 28 63 6f 6e 73 74 20 63 68 61 72  .n>0?(const char
18840 2a 29 70 57 72 69 74 65 72 2d 3e 62 74 74 65 72  *)pWriter->btter
18850 6d 2e 70 3a 22 22 29 3b 0a 20 20 20 20 2f 2a 20  m.p:"");.    /* 
18860 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 77 61  The following wa
18870 73 20 61 6c 72 65 61 64 79 20 64 6f 6e 65 20 69  s already done i
18880 6e 20 66 74 73 35 57 72 69 74 65 49 6e 69 74 28  n fts5WriteInit(
18890 29 3a 20 2a 2f 0a 20 20 20 20 2f 2a 20 73 71 6c  ): */.    /* sql
188a0 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 28 70 2d  ite3_bind_int(p-
188b0 3e 70 49 64 78 57 72 69 74 65 72 2c 20 31 2c 20  >pIdxWriter, 1, 
188c0 70 57 72 69 74 65 72 2d 3e 69 53 65 67 69 64 29  pWriter->iSegid)
188d0 3b 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33  ; */.    sqlite3
188e0 5f 62 69 6e 64 5f 62 6c 6f 62 28 70 2d 3e 70 49  _bind_blob(p->pI
188f0 64 78 57 72 69 74 65 72 2c 20 32 2c 20 7a 2c 20  dxWriter, 2, z, 
18900 70 57 72 69 74 65 72 2d 3e 62 74 74 65 72 6d 2e  pWriter->btterm.
18910 6e 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43  n, SQLITE_STATIC
18920 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62  );.    sqlite3_b
18930 69 6e 64 5f 69 6e 74 36 34 28 70 2d 3e 70 49 64  ind_int64(p->pId
18940 78 57 72 69 74 65 72 2c 20 33 2c 20 62 46 6c 61  xWriter, 3, bFla
18950 67 20 2b 20 28 28 69 36 34 29 70 57 72 69 74 65  g + ((i64)pWrite
18960 72 2d 3e 69 42 74 50 61 67 65 3c 3c 31 29 29 3b  r->iBtPage<<1));
18970 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 65  .    sqlite3_ste
18980 70 28 70 2d 3e 70 49 64 78 57 72 69 74 65 72 29  p(p->pIdxWriter)
18990 3b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 73 71  ;.    p->rc = sq
189a0 6c 69 74 65 33 5f 72 65 73 65 74 28 70 2d 3e 70  lite3_reset(p->p
189b0 49 64 78 57 72 69 74 65 72 29 3b 0a 20 20 7d 0a  IdxWriter);.  }.
189c0 20 20 70 57 72 69 74 65 72 2d 3e 69 42 74 50 61    pWriter->iBtPa
189d0 67 65 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ge = 0;.}../*.**
189e0 20 54 68 69 73 20 69 73 20 63 61 6c 6c 65 64 20   This is called 
189f0 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20 6c 65  once for each le
18a00 61 66 20 70 61 67 65 20 65 78 63 65 70 74 20 74  af page except t
18a10 68 65 20 66 69 72 73 74 20 74 68 61 74 20 63 6f  he first that co
18a20 6e 74 61 69 6e 73 0a 2a 2a 20 61 74 20 6c 65 61  ntains.** at lea
18a30 73 74 20 6f 6e 65 20 74 65 72 6d 2e 20 41 72 67  st one term. Arg
18a40 75 6d 65 6e 74 20 28 6e 54 65 72 6d 2f 70 54 65  ument (nTerm/pTe
18a50 72 6d 29 20 69 73 20 74 68 65 20 73 70 6c 69 74  rm) is the split
18a60 2d 6b 65 79 20 2d 20 61 20 74 65 72 6d 20 74 68  -key - a term th
18a70 61 74 0a 2a 2a 20 69 73 20 6c 61 72 67 65 72 20  at.** is larger 
18a80 74 68 61 6e 20 61 6c 6c 20 74 65 72 6d 73 20 77  than all terms w
18a90 72 69 74 74 65 6e 20 74 6f 20 65 61 72 6c 69 65  ritten to earlie
18aa0 72 20 6c 65 61 76 65 73 2c 20 61 6e 64 20 65 71  r leaves, and eq
18ab0 75 61 6c 20 74 6f 20 6f 72 0a 2a 2a 20 73 6d 61  ual to or.** sma
18ac0 6c 6c 65 72 20 74 68 61 6e 20 74 68 65 20 66 69  ller than the fi
18ad0 72 73 74 20 74 65 72 6d 20 6f 6e 20 74 68 65 20  rst term on the 
18ae0 6e 65 77 20 6c 65 61 66 2e 0a 2a 2a 0a 2a 2a 20  new leaf..**.** 
18af0 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
18b00 72 73 2c 20 61 6e 20 65 72 72 6f 72 20 63 6f 64  rs, an error cod
18b10 65 20 69 73 20 6c 65 66 74 20 69 6e 20 46 74 73  e is left in Fts
18b20 35 49 6e 64 65 78 2e 72 63 2e 20 49 66 20 61 6e  5Index.rc. If an
18b30 20 65 72 72 6f 72 0a 2a 2a 20 68 61 73 20 61 6c   error.** has al
18b40 72 65 61 64 79 20 6f 63 63 75 72 72 65 64 20 77  ready occurred w
18b50 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hen this functio
18b60 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20 69 74 20  n is called, it 
18b70 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73  is a no-op..*/.s
18b80 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 57  tatic void fts5W
18b90 72 69 74 65 42 74 72 65 65 54 65 72 6d 28 0a 20  riteBtreeTerm(. 
18ba0 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 20   Fts5Index *p,  
18bb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18bc0 20 2f 2a 20 46 54 53 35 20 62 61 63 6b 65 6e 64   /* FTS5 backend
18bd0 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 46 74 73   object */.  Fts
18be0 35 53 65 67 57 72 69 74 65 72 20 2a 70 57 72 69  5SegWriter *pWri
18bf0 74 65 72 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  ter,         /* 
18c00 57 72 69 74 65 72 20 6f 62 6a 65 63 74 20 2a 2f  Writer object */
18c10 0a 20 20 69 6e 74 20 6e 54 65 72 6d 2c 20 63 6f  .  int nTerm, co
18c20 6e 73 74 20 75 38 20 2a 70 54 65 72 6d 20 20 20  nst u8 *pTerm   
18c30 20 20 20 2f 2a 20 46 69 72 73 74 20 74 65 72 6d     /* First term
18c40 20 6f 6e 20 6e 65 77 20 70 61 67 65 20 2a 2f 0a   on new page */.
18c50 29 7b 0a 20 20 66 74 73 35 57 72 69 74 65 46 6c  ){.  fts5WriteFl
18c60 75 73 68 42 74 72 65 65 28 70 2c 20 70 57 72 69  ushBtree(p, pWri
18c70 74 65 72 29 3b 0a 20 20 66 74 73 35 42 75 66 66  ter);.  fts5Buff
18c80 65 72 53 65 74 28 26 70 2d 3e 72 63 2c 20 26 70  erSet(&p->rc, &p
18c90 57 72 69 74 65 72 2d 3e 62 74 74 65 72 6d 2c 20  Writer->btterm, 
18ca0 6e 54 65 72 6d 2c 20 70 54 65 72 6d 29 3b 0a 20  nTerm, pTerm);. 
18cb0 20 70 57 72 69 74 65 72 2d 3e 69 42 74 50 61 67   pWriter->iBtPag
18cc0 65 20 3d 20 70 57 72 69 74 65 72 2d 3e 77 72 69  e = pWriter->wri
18cd0 74 65 72 2e 70 67 6e 6f 3b 0a 7d 0a 0a 2f 2a 0a  ter.pgno;.}../*.
18ce0 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
18cf0 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20   is called when 
18d00 66 6c 75 73 68 69 6e 67 20 61 20 6c 65 61 66 20  flushing a leaf 
18d10 70 61 67 65 20 74 68 61 74 20 63 6f 6e 74 61 69  page that contai
18d20 6e 73 20 6e 6f 0a 2a 2a 20 74 65 72 6d 73 20 61  ns no.** terms a
18d30 74 20 61 6c 6c 20 74 6f 20 64 69 73 6b 2e 0a 2a  t all to disk..*
18d40 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  /.static void ft
18d50 73 35 57 72 69 74 65 42 74 72 65 65 4e 6f 54 65  s5WriteBtreeNoTe
18d60 72 6d 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20  rm(.  Fts5Index 
18d70 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  *p,             
18d80 20 20 20 20 20 20 2f 2a 20 46 54 53 35 20 62 61        /* FTS5 ba
18d90 63 6b 65 6e 64 20 6f 62 6a 65 63 74 20 2a 2f 0a  ckend object */.
18da0 20 20 46 74 73 35 53 65 67 57 72 69 74 65 72 20    Fts5SegWriter 
18db0 2a 70 57 72 69 74 65 72 20 20 20 20 20 20 20 20  *pWriter        
18dc0 20 20 2f 2a 20 57 72 69 74 65 72 20 6f 62 6a 65    /* Writer obje
18dd0 63 74 20 2a 2f 0a 29 7b 0a 20 20 2f 2a 20 49 66  ct */.){.  /* If
18de0 20 74 68 65 72 65 20 77 65 72 65 20 6e 6f 20 72   there were no r
18df0 6f 77 69 64 73 20 6f 6e 20 74 68 65 20 6c 65 61  owids on the lea
18e00 66 20 70 61 67 65 20 65 69 74 68 65 72 20 61 6e  f page either an
18e10 64 20 74 68 65 20 64 6f 63 6c 69 73 74 2d 69 6e  d the doclist-in
18e20 64 65 78 0a 20 20 2a 2a 20 68 61 73 20 61 6c 72  dex.  ** has alr
18e30 65 61 64 79 20 62 65 65 6e 20 73 74 61 72 74 65  eady been starte
18e40 64 2c 20 61 70 70 65 6e 64 20 61 6e 20 30 78 30  d, append an 0x0
18e50 30 20 62 79 74 65 20 74 6f 20 69 74 2e 20 20 2a  0 byte to it.  *
18e60 2f 0a 20 20 69 66 28 20 70 57 72 69 74 65 72 2d  /.  if( pWriter-
18e70 3e 62 46 69 72 73 74 52 6f 77 69 64 49 6e 50 61  >bFirstRowidInPa
18e80 67 65 20 26 26 20 70 57 72 69 74 65 72 2d 3e 61  ge && pWriter->a
18e90 44 6c 69 64 78 5b 30 5d 2e 62 75 66 2e 6e 3e 30  Dlidx[0].buf.n>0
18ea0 20 29 7b 0a 20 20 20 20 46 74 73 35 44 6c 69 64   ){.    Fts5Dlid
18eb0 78 57 72 69 74 65 72 20 2a 70 44 6c 69 64 78 20  xWriter *pDlidx 
18ec0 3d 20 26 70 57 72 69 74 65 72 2d 3e 61 44 6c 69  = &pWriter->aDli
18ed0 64 78 5b 30 5d 3b 0a 20 20 20 20 61 73 73 65 72  dx[0];.    asser
18ee0 74 28 20 70 44 6c 69 64 78 2d 3e 62 50 72 65 76  t( pDlidx->bPrev
18ef0 56 61 6c 69 64 20 29 3b 0a 20 20 20 20 73 71 6c  Valid );.    sql
18f00 69 74 65 33 46 74 73 35 42 75 66 66 65 72 41 70  ite3Fts5BufferAp
18f10 70 65 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e 72  pendVarint(&p->r
18f20 63 2c 20 26 70 44 6c 69 64 78 2d 3e 62 75 66 2c  c, &pDlidx->buf,
18f30 20 30 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49   0);.  }..  /* I
18f40 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 22 6e 75  ncrement the "nu
18f50 6d 62 65 72 20 6f 66 20 73 65 71 75 65 6e 74 69  mber of sequenti
18f60 61 6c 20 6c 65 61 76 65 73 20 77 69 74 68 6f 75  al leaves withou
18f70 74 20 61 20 74 65 72 6d 22 20 63 6f 75 6e 74 65  t a term" counte
18f80 72 2e 20 2a 2f 0a 20 20 70 57 72 69 74 65 72 2d  r. */.  pWriter-
18f90 3e 6e 45 6d 70 74 79 2b 2b 3b 0a 7d 0a 0a 73 74  >nEmpty++;.}..st
18fa0 61 74 69 63 20 69 36 34 20 66 74 73 35 44 6c 69  atic i64 fts5Dli
18fb0 64 78 45 78 74 72 61 63 74 46 69 72 73 74 52 6f  dxExtractFirstRo
18fc0 77 69 64 28 46 74 73 35 42 75 66 66 65 72 20 2a  wid(Fts5Buffer *
18fd0 70 42 75 66 29 7b 0a 20 20 69 36 34 20 69 52 6f  pBuf){.  i64 iRo
18fe0 77 69 64 3b 0a 20 20 69 6e 74 20 69 4f 66 66 3b  wid;.  int iOff;
18ff0 0a 0a 20 20 69 4f 66 66 20 3d 20 31 20 2b 20 66  ..  iOff = 1 + f
19000 74 73 35 47 65 74 56 61 72 69 6e 74 28 26 70 42  ts5GetVarint(&pB
19010 75 66 2d 3e 70 5b 31 5d 2c 20 28 75 36 34 2a 29  uf->p[1], (u64*)
19020 26 69 52 6f 77 69 64 29 3b 0a 20 20 66 74 73 35  &iRowid);.  fts5
19030 47 65 74 56 61 72 69 6e 74 28 26 70 42 75 66 2d  GetVarint(&pBuf-
19040 3e 70 5b 69 4f 66 66 5d 2c 20 28 75 36 34 2a 29  >p[iOff], (u64*)
19050 26 69 52 6f 77 69 64 29 3b 0a 20 20 72 65 74 75  &iRowid);.  retu
19060 72 6e 20 69 52 6f 77 69 64 3b 0a 7d 0a 0a 2f 2a  rn iRowid;.}../*
19070 0a 2a 2a 20 52 6f 77 69 64 20 69 52 6f 77 69 64  .** Rowid iRowid
19080 20 68 61 73 20 6a 75 73 74 20 62 65 65 6e 20 61   has just been a
19090 70 70 65 6e 64 65 64 20 74 6f 20 74 68 65 20 63  ppended to the c
190a0 75 72 72 65 6e 74 20 6c 65 61 66 20 70 61 67 65  urrent leaf page
190b0 2e 20 49 74 20 69 73 20 74 68 65 0a 2a 2a 20 66  . It is the.** f
190c0 69 72 73 74 20 6f 6e 20 74 68 65 20 70 61 67 65  irst on the page
190d0 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  . This function 
190e0 61 70 70 65 6e 64 73 20 61 6e 20 61 70 70 72 6f  appends an appro
190f0 70 72 69 61 74 65 20 65 6e 74 72 79 20 74 6f 20  priate entry to 
19100 74 68 65 20 63 75 72 72 65 6e 74 0a 2a 2a 20 64  the current.** d
19110 6f 63 6c 69 73 74 2d 69 6e 64 65 78 2e 0a 2a 2f  oclist-index..*/
19120 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
19130 35 57 72 69 74 65 44 6c 69 64 78 41 70 70 65 6e  5WriteDlidxAppen
19140 64 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a  d(.  Fts5Index *
19150 70 2c 20 0a 20 20 46 74 73 35 53 65 67 57 72 69  p, .  Fts5SegWri
19160 74 65 72 20 2a 70 57 72 69 74 65 72 2c 20 0a 20  ter *pWriter, . 
19170 20 69 36 34 20 69 52 6f 77 69 64 0a 29 7b 0a 20   i64 iRowid.){. 
19180 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 62 44   int i;.  int bD
19190 6f 6e 65 20 3d 20 30 3b 0a 0a 20 20 66 6f 72 28  one = 0;..  for(
191a0 69 3d 30 3b 20 70 2d 3e 72 63 3d 3d 53 51 4c 49  i=0; p->rc==SQLI
191b0 54 45 5f 4f 4b 20 26 26 20 62 44 6f 6e 65 3d 3d  TE_OK && bDone==
191c0 30 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 36 34  0; i++){.    i64
191d0 20 69 56 61 6c 3b 0a 20 20 20 20 46 74 73 35 44   iVal;.    Fts5D
191e0 6c 69 64 78 57 72 69 74 65 72 20 2a 70 44 6c 69  lidxWriter *pDli
191f0 64 78 20 3d 20 26 70 57 72 69 74 65 72 2d 3e 61  dx = &pWriter->a
19200 44 6c 69 64 78 5b 69 5d 3b 0a 0a 20 20 20 20 69  Dlidx[i];..    i
19210 66 28 20 70 44 6c 69 64 78 2d 3e 62 75 66 2e 6e  f( pDlidx->buf.n
19220 3e 3d 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e 70 67  >=p->pConfig->pg
19230 73 7a 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54  sz ){.      /* T
19240 68 65 20 63 75 72 72 65 6e 74 20 64 6f 63 6c 69  he current docli
19250 73 74 2d 69 6e 64 65 78 20 70 61 67 65 20 69 73  st-index page is
19260 20 66 75 6c 6c 2e 20 57 72 69 74 65 20 69 74 20   full. Write it 
19270 74 6f 20 64 69 73 6b 20 61 6e 64 20 70 75 73 68  to disk and push
19280 0a 20 20 20 20 20 20 2a 2a 20 61 20 63 6f 70 79  .      ** a copy
19290 20 6f 66 20 69 52 6f 77 69 64 20 28 77 68 69 63   of iRowid (whic
192a0 68 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20 74 68  h will become th
192b0 65 20 66 69 72 73 74 20 72 6f 77 69 64 20 6f 6e  e first rowid on
192c0 20 74 68 65 20 6e 65 78 74 0a 20 20 20 20 20 20   the next.      
192d0 2a 2a 20 64 6f 63 6c 69 73 74 2d 69 6e 64 65 78  ** doclist-index
192e0 20 6c 65 61 66 20 70 61 67 65 29 20 75 70 20 69   leaf page) up i
192f0 6e 74 6f 20 74 68 65 20 6e 65 78 74 20 6c 65 76  nto the next lev
19300 65 6c 20 6f 66 20 74 68 65 20 62 2d 74 72 65 65  el of the b-tree
19310 20 0a 20 20 20 20 20 20 2a 2a 20 68 69 65 72 61   .      ** hiera
19320 72 63 68 79 2e 20 49 66 20 74 68 65 20 6e 6f 64  rchy. If the nod
19330 65 20 62 65 69 6e 67 20 66 6c 75 73 68 65 64 20  e being flushed 
19340 69 73 20 63 75 72 72 65 6e 74 6c 79 20 74 68 65  is currently the
19350 20 72 6f 6f 74 20 6e 6f 64 65 2c 0a 20 20 20 20   root node,.    
19360 20 20 2a 2a 20 61 6c 73 6f 20 70 75 73 68 20 69    ** also push i
19370 74 73 20 66 69 72 73 74 20 72 6f 77 69 64 20 75  ts first rowid u
19380 70 77 61 72 64 73 2e 20 2a 2f 0a 20 20 20 20 20  pwards. */.     
19390 20 70 44 6c 69 64 78 2d 3e 62 75 66 2e 70 5b 30   pDlidx->buf.p[0
193a0 5d 20 3d 20 30 78 30 31 3b 20 20 20 20 2f 2a 20  ] = 0x01;    /* 
193b0 4e 6f 74 20 74 68 65 20 72 6f 6f 74 20 6e 6f 64  Not the root nod
193c0 65 20 2a 2f 0a 20 20 20 20 20 20 66 74 73 35 44  e */.      fts5D
193d0 61 74 61 57 72 69 74 65 28 70 2c 20 0a 20 20 20  ataWrite(p, .   
193e0 20 20 20 20 20 20 20 46 54 53 35 5f 44 4c 49 44         FTS5_DLID
193f0 58 5f 52 4f 57 49 44 28 70 57 72 69 74 65 72 2d  X_ROWID(pWriter-
19400 3e 69 53 65 67 69 64 2c 20 69 2c 20 70 44 6c 69  >iSegid, i, pDli
19410 64 78 2d 3e 70 67 6e 6f 29 2c 0a 20 20 20 20 20  dx->pgno),.     
19420 20 20 20 20 20 70 44 6c 69 64 78 2d 3e 62 75 66       pDlidx->buf
19430 2e 70 2c 20 70 44 6c 69 64 78 2d 3e 62 75 66 2e  .p, pDlidx->buf.
19440 6e 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20  n.      );.     
19450 20 66 74 73 35 57 72 69 74 65 44 6c 69 64 78 47   fts5WriteDlidxG
19460 72 6f 77 28 70 2c 20 70 57 72 69 74 65 72 2c 20  row(p, pWriter, 
19470 69 2b 32 29 3b 0a 20 20 20 20 20 20 70 44 6c 69  i+2);.      pDli
19480 64 78 20 3d 20 26 70 57 72 69 74 65 72 2d 3e 61  dx = &pWriter->a
19490 44 6c 69 64 78 5b 69 5d 3b 0a 20 20 20 20 20 20  Dlidx[i];.      
194a0 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  if( p->rc==SQLIT
194b0 45 5f 4f 4b 20 26 26 20 70 44 6c 69 64 78 5b 31  E_OK && pDlidx[1
194c0 5d 2e 62 75 66 2e 6e 3d 3d 30 20 29 7b 0a 20 20  ].buf.n==0 ){.  
194d0 20 20 20 20 20 20 69 36 34 20 69 46 69 72 73 74        i64 iFirst
194e0 20 3d 20 66 74 73 35 44 6c 69 64 78 45 78 74 72   = fts5DlidxExtr
194f0 61 63 74 46 69 72 73 74 52 6f 77 69 64 28 26 70  actFirstRowid(&p
19500 44 6c 69 64 78 2d 3e 62 75 66 29 3b 0a 0a 20 20  Dlidx->buf);..  
19510 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 77 61        /* This wa
19520 73 20 74 68 65 20 72 6f 6f 74 20 6e 6f 64 65 2e  s the root node.
19530 20 50 75 73 68 20 69 74 73 20 66 69 72 73 74 20   Push its first 
19540 72 6f 77 69 64 20 75 70 20 74 6f 20 74 68 65 20  rowid up to the 
19550 6e 65 77 20 72 6f 6f 74 2e 20 2a 2f 0a 20 20 20  new root. */.   
19560 20 20 20 20 20 70 44 6c 69 64 78 5b 31 5d 2e 70       pDlidx[1].p
19570 67 6e 6f 20 3d 20 70 44 6c 69 64 78 2d 3e 70 67  gno = pDlidx->pg
19580 6e 6f 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  no;.        sqli
19590 74 65 33 46 74 73 35 42 75 66 66 65 72 41 70 70  te3Fts5BufferApp
195a0 65 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e 72 63  endVarint(&p->rc
195b0 2c 20 26 70 44 6c 69 64 78 5b 31 5d 2e 62 75 66  , &pDlidx[1].buf
195c0 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71  , 0);.        sq
195d0 6c 69 74 65 33 46 74 73 35 42 75 66 66 65 72 41  lite3Fts5BufferA
195e0 70 70 65 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e  ppendVarint(&p->
195f0 72 63 2c 20 26 70 44 6c 69 64 78 5b 31 5d 2e 62  rc, &pDlidx[1].b
19600 75 66 2c 20 70 44 6c 69 64 78 2d 3e 70 67 6e 6f  uf, pDlidx->pgno
19610 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
19620 65 33 46 74 73 35 42 75 66 66 65 72 41 70 70 65  e3Fts5BufferAppe
19630 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c  ndVarint(&p->rc,
19640 20 26 70 44 6c 69 64 78 5b 31 5d 2e 62 75 66 2c   &pDlidx[1].buf,
19650 20 69 46 69 72 73 74 29 3b 0a 20 20 20 20 20 20   iFirst);.      
19660 20 20 70 44 6c 69 64 78 5b 31 5d 2e 62 50 72 65    pDlidx[1].bPre
19670 76 56 61 6c 69 64 20 3d 20 31 3b 0a 20 20 20 20  vValid = 1;.    
19680 20 20 20 20 70 44 6c 69 64 78 5b 31 5d 2e 69 50      pDlidx[1].iP
19690 72 65 76 20 3d 20 69 46 69 72 73 74 3b 0a 20 20  rev = iFirst;.  
196a0 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 73 71 6c      }..      sql
196b0 69 74 65 33 46 74 73 35 42 75 66 66 65 72 5a 65  ite3Fts5BufferZe
196c0 72 6f 28 26 70 44 6c 69 64 78 2d 3e 62 75 66 29  ro(&pDlidx->buf)
196d0 3b 0a 20 20 20 20 20 20 70 44 6c 69 64 78 2d 3e  ;.      pDlidx->
196e0 62 50 72 65 76 56 61 6c 69 64 20 3d 20 30 3b 0a  bPrevValid = 0;.
196f0 20 20 20 20 20 20 70 44 6c 69 64 78 2d 3e 70 67        pDlidx->pg
19700 6e 6f 2b 2b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  no++;.    }else{
19710 0a 20 20 20 20 20 20 62 44 6f 6e 65 20 3d 20 31  .      bDone = 1
19720 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28  ;.    }..    if(
19730 20 70 44 6c 69 64 78 2d 3e 62 50 72 65 76 56 61   pDlidx->bPrevVa
19740 6c 69 64 20 29 7b 0a 20 20 20 20 20 20 69 56 61  lid ){.      iVa
19750 6c 20 3d 20 69 52 6f 77 69 64 20 2d 20 70 44 6c  l = iRowid - pDl
19760 69 64 78 2d 3e 69 50 72 65 76 3b 0a 20 20 20 20  idx->iPrev;.    
19770 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 36 34  }else{.      i64
19780 20 69 50 67 6e 6f 20 3d 20 28 69 3d 3d 30 20 3f   iPgno = (i==0 ?
19790 20 70 57 72 69 74 65 72 2d 3e 77 72 69 74 65 72   pWriter->writer
197a0 2e 70 67 6e 6f 20 3a 20 70 44 6c 69 64 78 5b 2d  .pgno : pDlidx[-
197b0 31 5d 2e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20  1].pgno);.      
197c0 61 73 73 65 72 74 28 20 70 44 6c 69 64 78 2d 3e  assert( pDlidx->
197d0 62 75 66 2e 6e 3d 3d 30 20 29 3b 0a 20 20 20 20  buf.n==0 );.    
197e0 20 20 73 71 6c 69 74 65 33 46 74 73 35 42 75 66    sqlite3Fts5Buf
197f0 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e 74 28  ferAppendVarint(
19800 26 70 2d 3e 72 63 2c 20 26 70 44 6c 69 64 78 2d  &p->rc, &pDlidx-
19810 3e 62 75 66 2c 20 21 62 44 6f 6e 65 29 3b 0a 20  >buf, !bDone);. 
19820 20 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35       sqlite3Fts5
19830 42 75 66 66 65 72 41 70 70 65 6e 64 56 61 72 69  BufferAppendVari
19840 6e 74 28 26 70 2d 3e 72 63 2c 20 26 70 44 6c 69  nt(&p->rc, &pDli
19850 64 78 2d 3e 62 75 66 2c 20 69 50 67 6e 6f 29 3b  dx->buf, iPgno);
19860 0a 20 20 20 20 20 20 69 56 61 6c 20 3d 20 69 52  .      iVal = iR
19870 6f 77 69 64 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  owid;.    }..   
19880 20 73 71 6c 69 74 65 33 46 74 73 35 42 75 66 66   sqlite3Fts5Buff
19890 65 72 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26  erAppendVarint(&
198a0 70 2d 3e 72 63 2c 20 26 70 44 6c 69 64 78 2d 3e  p->rc, &pDlidx->
198b0 62 75 66 2c 20 69 56 61 6c 29 3b 0a 20 20 20 20  buf, iVal);.    
198c0 70 44 6c 69 64 78 2d 3e 62 50 72 65 76 56 61 6c  pDlidx->bPrevVal
198d0 69 64 20 3d 20 31 3b 0a 20 20 20 20 70 44 6c 69  id = 1;.    pDli
198e0 64 78 2d 3e 69 50 72 65 76 20 3d 20 69 52 6f 77  dx->iPrev = iRow
198f0 69 64 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69  id;.  }.}..stati
19900 63 20 76 6f 69 64 20 66 74 73 35 57 72 69 74 65  c void fts5Write
19910 46 6c 75 73 68 4c 65 61 66 28 46 74 73 35 49 6e  FlushLeaf(Fts5In
19920 64 65 78 20 2a 70 2c 20 46 74 73 35 53 65 67 57  dex *p, Fts5SegW
19930 72 69 74 65 72 20 2a 70 57 72 69 74 65 72 29 7b  riter *pWriter){
19940 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20  .  static const 
19950 75 38 20 7a 65 72 6f 5b 5d 20 3d 20 7b 20 30 78  u8 zero[] = { 0x
19960 30 30 2c 20 30 78 30 30 2c 20 30 78 30 30 2c 20  00, 0x00, 0x00, 
19970 30 78 30 30 20 7d 3b 0a 20 20 46 74 73 35 50 61  0x00 };.  Fts5Pa
19980 67 65 57 72 69 74 65 72 20 2a 70 50 61 67 65 20  geWriter *pPage 
19990 3d 20 26 70 57 72 69 74 65 72 2d 3e 77 72 69 74  = &pWriter->writ
199a0 65 72 3b 0a 20 20 69 36 34 20 69 52 6f 77 69 64  er;.  i64 iRowid
199b0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 28 70 50  ;..  assert( (pP
199c0 61 67 65 2d 3e 70 67 69 64 78 2e 6e 3d 3d 30 29  age->pgidx.n==0)
199d0 3d 3d 28 70 57 72 69 74 65 72 2d 3e 62 46 69 72  ==(pWriter->bFir
199e0 73 74 54 65 72 6d 49 6e 50 61 67 65 29 20 29 3b  stTermInPage) );
199f0 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20 73  ..  /* Set the s
19a00 7a 4c 65 61 66 20 68 65 61 64 65 72 20 66 69 65  zLeaf header fie
19a10 6c 64 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ld. */.  assert(
19a20 20 30 3d 3d 66 74 73 35 47 65 74 55 31 36 28 26   0==fts5GetU16(&
19a30 70 50 61 67 65 2d 3e 62 75 66 2e 70 5b 32 5d 29  pPage->buf.p[2])
19a40 20 29 3b 0a 20 20 66 74 73 35 50 75 74 55 31 36   );.  fts5PutU16
19a50 28 26 70 50 61 67 65 2d 3e 62 75 66 2e 70 5b 32  (&pPage->buf.p[2
19a60 5d 2c 20 28 75 31 36 29 70 50 61 67 65 2d 3e 62  ], (u16)pPage->b
19a70 75 66 2e 6e 29 3b 0a 0a 20 20 69 66 28 20 70 57  uf.n);..  if( pW
19a80 72 69 74 65 72 2d 3e 62 46 69 72 73 74 54 65 72  riter->bFirstTer
19a90 6d 49 6e 50 61 67 65 20 29 7b 0a 20 20 20 20 2f  mInPage ){.    /
19aa0 2a 20 4e 6f 20 74 65 72 6d 20 77 61 73 20 77 72  * No term was wr
19ab0 69 74 74 65 6e 20 74 6f 20 74 68 69 73 20 70 61  itten to this pa
19ac0 67 65 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72  ge. */.    asser
19ad0 74 28 20 70 50 61 67 65 2d 3e 70 67 69 64 78 2e  t( pPage->pgidx.
19ae0 6e 3d 3d 30 20 29 3b 0a 20 20 20 20 66 74 73 35  n==0 );.    fts5
19af0 57 72 69 74 65 42 74 72 65 65 4e 6f 54 65 72 6d  WriteBtreeNoTerm
19b00 28 70 2c 20 70 57 72 69 74 65 72 29 3b 0a 20 20  (p, pWriter);.  
19b10 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 41 70  }else{.    /* Ap
19b20 70 65 6e 64 20 74 68 65 20 70 67 69 64 78 20 74  pend the pgidx t
19b30 6f 20 74 68 65 20 70 61 67 65 20 62 75 66 66 65  o the page buffe
19b40 72 2e 20 53 65 74 20 74 68 65 20 73 7a 4c 65 61  r. Set the szLea
19b50 66 20 68 65 61 64 65 72 20 66 69 65 6c 64 2e 20  f header field. 
19b60 2a 2f 0a 20 20 20 20 66 74 73 35 42 75 66 66 65  */.    fts5Buffe
19b70 72 41 70 70 65 6e 64 42 6c 6f 62 28 26 70 2d 3e  rAppendBlob(&p->
19b80 72 63 2c 20 26 70 50 61 67 65 2d 3e 62 75 66 2c  rc, &pPage->buf,
19b90 20 70 50 61 67 65 2d 3e 70 67 69 64 78 2e 6e 2c   pPage->pgidx.n,
19ba0 20 70 50 61 67 65 2d 3e 70 67 69 64 78 2e 70 29   pPage->pgidx.p)
19bb0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 72 69 74  ;.  }..  /* Writ
19bc0 65 20 74 68 65 20 70 61 67 65 20 6f 75 74 20 74  e the page out t
19bd0 6f 20 64 69 73 6b 20 2a 2f 0a 20 20 69 52 6f 77  o disk */.  iRow
19be0 69 64 20 3d 20 46 54 53 35 5f 53 45 47 4d 45 4e  id = FTS5_SEGMEN
19bf0 54 5f 52 4f 57 49 44 28 70 57 72 69 74 65 72 2d  T_ROWID(pWriter-
19c00 3e 69 53 65 67 69 64 2c 20 70 50 61 67 65 2d 3e  >iSegid, pPage->
19c10 70 67 6e 6f 29 3b 0a 20 20 66 74 73 35 44 61 74  pgno);.  fts5Dat
19c20 61 57 72 69 74 65 28 70 2c 20 69 52 6f 77 69 64  aWrite(p, iRowid
19c30 2c 20 70 50 61 67 65 2d 3e 62 75 66 2e 70 2c 20  , pPage->buf.p, 
19c40 70 50 61 67 65 2d 3e 62 75 66 2e 6e 29 3b 0a 0a  pPage->buf.n);..
19c50 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20    /* Initialize 
19c60 74 68 65 20 6e 65 78 74 20 70 61 67 65 2e 20 2a  the next page. *
19c70 2f 0a 20 20 66 74 73 35 42 75 66 66 65 72 5a 65  /.  fts5BufferZe
19c80 72 6f 28 26 70 50 61 67 65 2d 3e 62 75 66 29 3b  ro(&pPage->buf);
19c90 0a 20 20 66 74 73 35 42 75 66 66 65 72 5a 65 72  .  fts5BufferZer
19ca0 6f 28 26 70 50 61 67 65 2d 3e 70 67 69 64 78 29  o(&pPage->pgidx)
19cb0 3b 0a 20 20 66 74 73 35 42 75 66 66 65 72 41 70  ;.  fts5BufferAp
19cc0 70 65 6e 64 42 6c 6f 62 28 26 70 2d 3e 72 63 2c  pendBlob(&p->rc,
19cd0 20 26 70 50 61 67 65 2d 3e 62 75 66 2c 20 34 2c   &pPage->buf, 4,
19ce0 20 7a 65 72 6f 29 3b 0a 20 20 70 50 61 67 65 2d   zero);.  pPage-
19cf0 3e 69 50 72 65 76 50 67 69 64 78 20 3d 20 30 3b  >iPrevPgidx = 0;
19d00 0a 20 20 70 50 61 67 65 2d 3e 70 67 6e 6f 2b 2b  .  pPage->pgno++
19d10 3b 0a 0a 20 20 2f 2a 20 49 6e 63 72 65 61 73 65  ;..  /* Increase
19d20 20 74 68 65 20 6c 65 61 76 65 73 20 77 72 69 74   the leaves writ
19d30 74 65 6e 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  ten counter */. 
19d40 20 70 57 72 69 74 65 72 2d 3e 6e 4c 65 61 66 57   pWriter->nLeafW
19d50 72 69 74 74 65 6e 2b 2b 3b 0a 0a 20 20 2f 2a 20  ritten++;..  /* 
19d60 54 68 65 20 6e 65 77 20 6c 65 61 66 20 68 6f 6c  The new leaf hol
19d70 64 73 20 6e 6f 20 74 65 72 6d 73 20 6f 72 20 72  ds no terms or r
19d80 6f 77 69 64 73 20 2a 2f 0a 20 20 70 57 72 69 74  owids */.  pWrit
19d90 65 72 2d 3e 62 46 69 72 73 74 54 65 72 6d 49 6e  er->bFirstTermIn
19da0 50 61 67 65 20 3d 20 31 3b 0a 20 20 70 57 72 69  Page = 1;.  pWri
19db0 74 65 72 2d 3e 62 46 69 72 73 74 52 6f 77 69 64  ter->bFirstRowid
19dc0 49 6e 50 61 67 65 20 3d 20 31 3b 0a 7d 0a 0a 2f  InPage = 1;.}../
19dd0 2a 0a 2a 2a 20 41 70 70 65 6e 64 20 74 65 72 6d  *.** Append term
19de0 20 70 54 65 72 6d 2f 6e 54 65 72 6d 20 74 6f 20   pTerm/nTerm to 
19df0 74 68 65 20 73 65 67 6d 65 6e 74 20 62 65 69 6e  the segment bein
19e00 67 20 77 72 69 74 74 65 6e 20 62 79 20 74 68 65  g written by the
19e10 20 77 72 69 74 65 72 20 70 61 73 73 65 64 0a 2a   writer passed.*
19e20 2a 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20  * as the second 
19e30 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20  argument..**.** 
19e40 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
19e50 72 73 2c 20 73 65 74 20 74 68 65 20 46 74 73 35  rs, set the Fts5
19e60 49 6e 64 65 78 2e 72 63 20 65 72 72 6f 72 20 63  Index.rc error c
19e70 6f 64 65 2e 20 49 66 20 61 6e 20 65 72 72 6f 72  ode. If an error
19e80 20 68 61 73 20 0a 2a 2a 20 61 6c 72 65 61 64 79   has .** already
19e90 20 6f 63 63 75 72 72 65 64 2c 20 74 68 69 73 20   occurred, this 
19ea0 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f  function is a no
19eb0 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  -op..*/.static v
19ec0 6f 69 64 20 66 74 73 35 57 72 69 74 65 41 70 70  oid fts5WriteApp
19ed0 65 6e 64 54 65 72 6d 28 0a 20 20 46 74 73 35 49  endTerm(.  Fts5I
19ee0 6e 64 65 78 20 2a 70 2c 20 0a 20 20 46 74 73 35  ndex *p, .  Fts5
19ef0 53 65 67 57 72 69 74 65 72 20 2a 70 57 72 69 74  SegWriter *pWrit
19f00 65 72 2c 0a 20 20 69 6e 74 20 6e 54 65 72 6d 2c  er,.  int nTerm,
19f10 20 63 6f 6e 73 74 20 75 38 20 2a 70 54 65 72 6d   const u8 *pTerm
19f20 20 0a 29 7b 0a 20 20 69 6e 74 20 6e 50 72 65 66   .){.  int nPref
19f30 69 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ix;             
19f40 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20         /* Bytes 
19f50 6f 66 20 70 72 65 66 69 78 20 63 6f 6d 70 72 65  of prefix compre
19f60 73 73 69 6f 6e 20 66 6f 72 20 74 65 72 6d 20 2a  ssion for term *
19f70 2f 0a 20 20 46 74 73 35 50 61 67 65 57 72 69 74  /.  Fts5PageWrit
19f80 65 72 20 2a 70 50 61 67 65 20 3d 20 26 70 57 72  er *pPage = &pWr
19f90 69 74 65 72 2d 3e 77 72 69 74 65 72 3b 0a 20 20  iter->writer;.  
19fa0 46 74 73 35 42 75 66 66 65 72 20 2a 70 50 67 69  Fts5Buffer *pPgi
19fb0 64 78 20 3d 20 26 70 57 72 69 74 65 72 2d 3e 77  dx = &pWriter->w
19fc0 72 69 74 65 72 2e 70 67 69 64 78 3b 0a 0a 20 20  riter.pgidx;..  
19fd0 61 73 73 65 72 74 28 20 70 2d 3e 72 63 3d 3d 53  assert( p->rc==S
19fe0 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 61 73  QLITE_OK );.  as
19ff0 73 65 72 74 28 20 70 50 61 67 65 2d 3e 62 75 66  sert( pPage->buf
1a000 2e 6e 3e 3d 34 20 29 3b 0a 20 20 61 73 73 65 72  .n>=4 );.  asser
1a010 74 28 20 70 50 61 67 65 2d 3e 62 75 66 2e 6e 3e  t( pPage->buf.n>
1a020 34 20 7c 7c 20 70 57 72 69 74 65 72 2d 3e 62 46  4 || pWriter->bF
1a030 69 72 73 74 54 65 72 6d 49 6e 50 61 67 65 20 29  irstTermInPage )
1a040 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 63  ;..  /* If the c
1a050 75 72 72 65 6e 74 20 6c 65 61 66 20 70 61 67 65  urrent leaf page
1a060 20 69 73 20 66 75 6c 6c 2c 20 66 6c 75 73 68 20   is full, flush 
1a070 69 74 20 74 6f 20 64 69 73 6b 2e 20 2a 2f 0a 20  it to disk. */. 
1a080 20 69 66 28 20 28 70 50 61 67 65 2d 3e 62 75 66   if( (pPage->buf
1a090 2e 6e 20 2b 20 70 50 67 69 64 78 2d 3e 6e 20 2b  .n + pPgidx->n +
1a0a0 20 6e 54 65 72 6d 20 2b 20 32 29 3e 3d 70 2d 3e   nTerm + 2)>=p->
1a0b0 70 43 6f 6e 66 69 67 2d 3e 70 67 73 7a 20 29 7b  pConfig->pgsz ){
1a0c0 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e  .    if( pPage->
1a0d0 62 75 66 2e 6e 3e 34 20 29 7b 0a 20 20 20 20 20  buf.n>4 ){.     
1a0e0 20 66 74 73 35 57 72 69 74 65 46 6c 75 73 68 4c   fts5WriteFlushL
1a0f0 65 61 66 28 70 2c 20 70 57 72 69 74 65 72 29 3b  eaf(p, pWriter);
1a100 0a 20 20 20 20 7d 0a 20 20 20 20 66 74 73 35 42  .    }.    fts5B
1a110 75 66 66 65 72 47 72 6f 77 28 26 70 2d 3e 72 63  ufferGrow(&p->rc
1a120 2c 20 26 70 50 61 67 65 2d 3e 62 75 66 2c 20 6e  , &pPage->buf, n
1a130 54 65 72 6d 2b 46 54 53 35 5f 44 41 54 41 5f 50  Term+FTS5_DATA_P
1a140 41 44 44 49 4e 47 29 3b 0a 20 20 7d 0a 20 20 0a  ADDING);.  }.  .
1a150 20 20 2f 2a 20 54 4f 44 4f 31 3a 20 55 70 64 61    /* TODO1: Upda
1a160 74 69 6e 67 20 70 67 69 64 78 20 68 65 72 65 2e  ting pgidx here.
1a170 20 2a 2f 0a 20 20 70 50 67 69 64 78 2d 3e 6e 20   */.  pPgidx->n 
1a180 2b 3d 20 73 71 6c 69 74 65 33 46 74 73 35 50 75  += sqlite3Fts5Pu
1a190 74 56 61 72 69 6e 74 28 0a 20 20 20 20 20 20 26  tVarint(.      &
1a1a0 70 50 67 69 64 78 2d 3e 70 5b 70 50 67 69 64 78  pPgidx->p[pPgidx
1a1b0 2d 3e 6e 5d 2c 20 70 50 61 67 65 2d 3e 62 75 66  ->n], pPage->buf
1a1c0 2e 6e 20 2d 20 70 50 61 67 65 2d 3e 69 50 72 65  .n - pPage->iPre
1a1d0 76 50 67 69 64 78 0a 20 20 29 3b 0a 20 20 70 50  vPgidx.  );.  pP
1a1e0 61 67 65 2d 3e 69 50 72 65 76 50 67 69 64 78 20  age->iPrevPgidx 
1a1f0 3d 20 70 50 61 67 65 2d 3e 62 75 66 2e 6e 3b 0a  = pPage->buf.n;.
1a200 23 69 66 20 30 0a 20 20 66 74 73 35 50 75 74 55  #if 0.  fts5PutU
1a210 31 36 28 26 70 50 67 69 64 78 2d 3e 70 5b 70 50  16(&pPgidx->p[pP
1a220 67 69 64 78 2d 3e 6e 5d 2c 20 70 50 61 67 65 2d  gidx->n], pPage-
1a230 3e 62 75 66 2e 6e 29 3b 0a 20 20 70 50 67 69 64  >buf.n);.  pPgid
1a240 78 2d 3e 6e 20 2b 3d 20 32 3b 0a 23 65 6e 64 69  x->n += 2;.#endi
1a250 66 0a 0a 20 20 69 66 28 20 70 57 72 69 74 65 72  f..  if( pWriter
1a260 2d 3e 62 46 69 72 73 74 54 65 72 6d 49 6e 50 61  ->bFirstTermInPa
1a270 67 65 20 29 7b 0a 20 20 20 20 6e 50 72 65 66 69  ge ){.    nPrefi
1a280 78 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 70  x = 0;.    if( p
1a290 50 61 67 65 2d 3e 70 67 6e 6f 21 3d 31 20 29 7b  Page->pgno!=1 ){
1a2a0 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 69  .      /* This i
1a2b0 73 20 74 68 65 20 66 69 72 73 74 20 74 65 72 6d  s the first term
1a2c0 20 6f 6e 20 61 20 6c 65 61 66 20 74 68 61 74 20   on a leaf that 
1a2d0 69 73 20 6e 6f 74 20 74 68 65 20 6c 65 66 74 6d  is not the leftm
1a2e0 6f 73 74 20 6c 65 61 66 20 69 6e 0a 20 20 20 20  ost leaf in.    
1a2f0 20 20 2a 2a 20 74 68 65 20 73 65 67 6d 65 6e 74    ** the segment
1a300 20 62 2d 74 72 65 65 2e 20 49 6e 20 74 68 69 73   b-tree. In this
1a310 20 63 61 73 65 20 69 74 20 69 73 20 6e 65 63 65   case it is nece
1a320 73 73 61 72 79 20 74 6f 20 61 64 64 20 61 20 74  ssary to add a t
1a330 65 72 6d 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20  erm to.      ** 
1a340 74 68 65 20 62 2d 74 72 65 65 20 68 69 65 72 61  the b-tree hiera
1a350 72 63 68 79 20 74 68 61 74 20 69 73 20 28 61 29  rchy that is (a)
1a360 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68 65   larger than the
1a370 20 6c 61 72 67 65 73 74 20 74 65 72 6d 20 0a 20   largest term . 
1a380 20 20 20 20 20 2a 2a 20 61 6c 72 65 61 64 79 20       ** already 
1a390 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 73  written to the s
1a3a0 65 67 6d 65 6e 74 20 61 6e 64 20 28 62 29 20 73  egment and (b) s
1a3b0 6d 61 6c 6c 65 72 20 74 68 61 6e 20 6f 72 20 65  maller than or e
1a3c0 71 75 61 6c 20 74 6f 0a 20 20 20 20 20 20 2a 2a  qual to.      **
1a3d0 20 74 68 69 73 20 74 65 72 6d 2e 20 49 6e 20 6f   this term. In o
1a3e0 74 68 65 72 20 77 6f 72 64 73 2c 20 61 20 70 72  ther words, a pr
1a3f0 65 66 69 78 20 6f 66 20 28 70 54 65 72 6d 2f 6e  efix of (pTerm/n
1a400 54 65 72 6d 29 20 74 68 61 74 20 69 73 20 6f 6e  Term) that is on
1a410 65 0a 20 20 20 20 20 20 2a 2a 20 62 79 74 65 20  e.      ** byte 
1a420 6c 6f 6e 67 65 72 20 74 68 61 6e 20 74 68 65 20  longer than the 
1a430 6c 6f 6e 67 65 73 74 20 70 72 65 66 69 78 20 28  longest prefix (
1a440 70 54 65 72 6d 2f 6e 54 65 72 6d 29 20 73 68 61  pTerm/nTerm) sha
1a450 72 65 73 20 77 69 74 68 20 74 68 65 0a 20 20 20  res with the.   
1a460 20 20 20 2a 2a 20 70 72 65 76 69 6f 75 73 20 74     ** previous t
1a470 65 72 6d 2e 20 0a 20 20 20 20 20 20 2a 2a 0a 20  erm. .      **. 
1a480 20 20 20 20 20 2a 2a 20 55 73 75 61 6c 6c 79 2c       ** Usually,
1a490 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 74 65   the previous te
1a4a0 72 6d 20 69 73 20 61 76 61 69 6c 61 62 6c 65 20  rm is available 
1a4b0 69 6e 20 70 50 61 67 65 2d 3e 74 65 72 6d 2e 20  in pPage->term. 
1a4c0 54 68 65 20 65 78 63 65 70 74 69 6f 6e 0a 20 20  The exception.  
1a4d0 20 20 20 20 2a 2a 20 69 73 20 69 66 20 74 68 69      ** is if thi
1a4e0 73 20 69 73 20 74 68 65 20 66 69 72 73 74 20 74  s is the first t
1a4f0 65 72 6d 20 77 72 69 74 74 65 6e 20 69 6e 20 61  erm written in a
1a500 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c 2d 6d 65  n incremental-me
1a510 72 67 65 20 73 74 65 70 2e 0a 20 20 20 20 20 20  rge step..      
1a520 2a 2a 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  ** In this case 
1a530 74 68 65 20 70 72 65 76 69 6f 75 73 20 74 65 72  the previous ter
1a540 6d 20 69 73 20 6e 6f 74 20 61 76 61 69 6c 61 62  m is not availab
1a550 6c 65 2c 20 73 6f 20 6a 75 73 74 20 77 72 69 74  le, so just writ
1a560 65 20 61 0a 20 20 20 20 20 20 2a 2a 20 63 6f 70  e a.      ** cop
1a570 79 20 6f 66 20 28 70 54 65 72 6d 2f 6e 54 65 72  y of (pTerm/nTer
1a580 6d 29 20 69 6e 74 6f 20 74 68 65 20 70 61 72 65  m) into the pare
1a590 6e 74 20 6e 6f 64 65 2e 20 54 68 69 73 20 69 73  nt node. This is
1a5a0 20 73 6c 69 67 68 74 6c 79 0a 20 20 20 20 20 20   slightly.      
1a5b0 2a 2a 20 69 6e 65 66 66 69 63 69 65 6e 74 2c 20  ** inefficient, 
1a5c0 62 75 74 20 73 74 69 6c 6c 20 63 6f 72 72 65 63  but still correc
1a5d0 74 2e 20 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  t.  */.      int
1a5e0 20 6e 20 3d 20 6e 54 65 72 6d 3b 0a 20 20 20 20   n = nTerm;.    
1a5f0 20 20 69 66 28 20 70 50 61 67 65 2d 3e 74 65 72    if( pPage->ter
1a600 6d 2e 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 6e  m.n ){.        n
1a610 20 3d 20 31 20 2b 20 66 74 73 35 50 72 65 66 69   = 1 + fts5Prefi
1a620 78 43 6f 6d 70 72 65 73 73 28 70 50 61 67 65 2d  xCompress(pPage-
1a630 3e 74 65 72 6d 2e 6e 2c 20 70 50 61 67 65 2d 3e  >term.n, pPage->
1a640 74 65 72 6d 2e 70 2c 20 6e 54 65 72 6d 2c 20 70  term.p, nTerm, p
1a650 54 65 72 6d 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Term);.      }. 
1a660 20 20 20 20 20 66 74 73 35 57 72 69 74 65 42 74       fts5WriteBt
1a670 72 65 65 54 65 72 6d 28 70 2c 20 70 57 72 69 74  reeTerm(p, pWrit
1a680 65 72 2c 20 6e 2c 20 70 54 65 72 6d 29 3b 0a 20  er, n, pTerm);. 
1a690 20 20 20 20 20 70 50 61 67 65 20 3d 20 26 70 57       pPage = &pW
1a6a0 72 69 74 65 72 2d 3e 77 72 69 74 65 72 3b 0a 20  riter->writer;. 
1a6b0 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20     }.  }else{.  
1a6c0 20 20 6e 50 72 65 66 69 78 20 3d 20 66 74 73 35    nPrefix = fts5
1a6d0 50 72 65 66 69 78 43 6f 6d 70 72 65 73 73 28 70  PrefixCompress(p
1a6e0 50 61 67 65 2d 3e 74 65 72 6d 2e 6e 2c 20 70 50  Page->term.n, pP
1a6f0 61 67 65 2d 3e 74 65 72 6d 2e 70 2c 20 6e 54 65  age->term.p, nTe
1a700 72 6d 2c 20 70 54 65 72 6d 29 3b 0a 20 20 20 20  rm, pTerm);.    
1a710 66 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64  fts5BufferAppend
1a720 56 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26  Varint(&p->rc, &
1a730 70 50 61 67 65 2d 3e 62 75 66 2c 20 6e 50 72 65  pPage->buf, nPre
1a740 66 69 78 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  fix);.  }..  /* 
1a750 41 70 70 65 6e 64 20 74 68 65 20 6e 75 6d 62 65  Append the numbe
1a760 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20 6e 65  r of bytes of ne
1a770 77 20 64 61 74 61 2c 20 74 68 65 6e 20 74 68 65  w data, then the
1a780 20 74 65 72 6d 20 64 61 74 61 20 69 74 73 65 6c   term data itsel
1a790 66 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20 70 61  f.  ** to the pa
1a7a0 67 65 2e 20 2a 2f 0a 20 20 66 74 73 35 42 75 66  ge. */.  fts5Buf
1a7b0 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e 74 28  ferAppendVarint(
1a7c0 26 70 2d 3e 72 63 2c 20 26 70 50 61 67 65 2d 3e  &p->rc, &pPage->
1a7d0 62 75 66 2c 20 6e 54 65 72 6d 20 2d 20 6e 50 72  buf, nTerm - nPr
1a7e0 65 66 69 78 29 3b 0a 20 20 66 74 73 35 42 75 66  efix);.  fts5Buf
1a7f0 66 65 72 41 70 70 65 6e 64 42 6c 6f 62 28 26 70  ferAppendBlob(&p
1a800 2d 3e 72 63 2c 20 26 70 50 61 67 65 2d 3e 62 75  ->rc, &pPage->bu
1a810 66 2c 20 6e 54 65 72 6d 20 2d 20 6e 50 72 65 66  f, nTerm - nPref
1a820 69 78 2c 20 26 70 54 65 72 6d 5b 6e 50 72 65 66  ix, &pTerm[nPref
1a830 69 78 5d 29 3b 0a 0a 20 20 2f 2a 20 55 70 64 61  ix]);..  /* Upda
1a840 74 65 20 74 68 65 20 46 74 73 35 50 61 67 65 57  te the Fts5PageW
1a850 72 69 74 65 72 2e 74 65 72 6d 20 66 69 65 6c 64  riter.term field
1a860 2e 20 2a 2f 0a 20 20 66 74 73 35 42 75 66 66 65  . */.  fts5Buffe
1a870 72 53 65 74 28 26 70 2d 3e 72 63 2c 20 26 70 50  rSet(&p->rc, &pP
1a880 61 67 65 2d 3e 74 65 72 6d 2c 20 6e 54 65 72 6d  age->term, nTerm
1a890 2c 20 70 54 65 72 6d 29 3b 0a 20 20 70 57 72 69  , pTerm);.  pWri
1a8a0 74 65 72 2d 3e 62 46 69 72 73 74 54 65 72 6d 49  ter->bFirstTermI
1a8b0 6e 50 61 67 65 20 3d 20 30 3b 0a 0a 20 20 70 57  nPage = 0;..  pW
1a8c0 72 69 74 65 72 2d 3e 62 46 69 72 73 74 52 6f 77  riter->bFirstRow
1a8d0 69 64 49 6e 50 61 67 65 20 3d 20 30 3b 0a 20 20  idInPage = 0;.  
1a8e0 70 57 72 69 74 65 72 2d 3e 62 46 69 72 73 74 52  pWriter->bFirstR
1a8f0 6f 77 69 64 49 6e 44 6f 63 6c 69 73 74 20 3d 20  owidInDoclist = 
1a900 31 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 2d  1;..  assert( p-
1a910 3e 72 63 20 7c 7c 20 28 70 57 72 69 74 65 72 2d  >rc || (pWriter-
1a920 3e 6e 44 6c 69 64 78 3e 30 20 26 26 20 70 57 72  >nDlidx>0 && pWr
1a930 69 74 65 72 2d 3e 61 44 6c 69 64 78 5b 30 5d 2e  iter->aDlidx[0].
1a940 62 75 66 2e 6e 3d 3d 30 29 20 29 3b 0a 20 20 70  buf.n==0) );.  p
1a950 57 72 69 74 65 72 2d 3e 61 44 6c 69 64 78 5b 30  Writer->aDlidx[0
1a960 5d 2e 70 67 6e 6f 20 3d 20 70 50 61 67 65 2d 3e  ].pgno = pPage->
1a970 70 67 6e 6f 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  pgno;.}../*.** A
1a980 70 70 65 6e 64 20 61 20 72 6f 77 69 64 20 61 6e  ppend a rowid an
1a990 64 20 70 6f 73 69 74 69 6f 6e 2d 6c 69 73 74 20  d position-list 
1a9a0 73 69 7a 65 20 66 69 65 6c 64 20 74 6f 20 74 68  size field to th
1a9b0 65 20 77 72 69 74 65 72 73 20 6f 75 74 70 75 74  e writers output
1a9c0 2e 20 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  . .*/.static voi
1a9d0 64 20 66 74 73 35 57 72 69 74 65 41 70 70 65 6e  d fts5WriteAppen
1a9e0 64 52 6f 77 69 64 28 0a 20 20 46 74 73 35 49 6e  dRowid(.  Fts5In
1a9f0 64 65 78 20 2a 70 2c 20 0a 20 20 46 74 73 35 53  dex *p, .  Fts5S
1aa00 65 67 57 72 69 74 65 72 20 2a 70 57 72 69 74 65  egWriter *pWrite
1aa10 72 2c 0a 20 20 69 36 34 20 69 52 6f 77 69 64 0a  r,.  i64 iRowid.
1aa20 29 7b 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d  ){.  if( p->rc==
1aa30 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1aa40 20 46 74 73 35 50 61 67 65 57 72 69 74 65 72 20   Fts5PageWriter 
1aa50 2a 70 50 61 67 65 20 3d 20 26 70 57 72 69 74 65  *pPage = &pWrite
1aa60 72 2d 3e 77 72 69 74 65 72 3b 0a 0a 20 20 20 20  r->writer;..    
1aa70 69 66 28 20 28 70 50 61 67 65 2d 3e 62 75 66 2e  if( (pPage->buf.
1aa80 6e 20 2b 20 70 50 61 67 65 2d 3e 70 67 69 64 78  n + pPage->pgidx
1aa90 2e 6e 29 3e 3d 70 2d 3e 70 43 6f 6e 66 69 67 2d  .n)>=p->pConfig-
1aaa0 3e 70 67 73 7a 20 29 7b 0a 20 20 20 20 20 20 66  >pgsz ){.      f
1aab0 74 73 35 57 72 69 74 65 46 6c 75 73 68 4c 65 61  ts5WriteFlushLea
1aac0 66 28 70 2c 20 70 57 72 69 74 65 72 29 3b 0a 20  f(p, pWriter);. 
1aad0 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20     }..    /* If 
1aae0 74 68 69 73 20 69 73 20 74 6f 20 62 65 20 74 68  this is to be th
1aaf0 65 20 66 69 72 73 74 20 72 6f 77 69 64 20 77 72  e first rowid wr
1ab00 69 74 74 65 6e 20 74 6f 20 74 68 65 20 70 61 67  itten to the pag
1ab10 65 2c 20 73 65 74 20 74 68 65 20 0a 20 20 20 20  e, set the .    
1ab20 2a 2a 20 72 6f 77 69 64 2d 70 6f 69 6e 74 65 72  ** rowid-pointer
1ab30 20 69 6e 20 74 68 65 20 70 61 67 65 2d 68 65 61   in the page-hea
1ab40 64 65 72 2e 20 41 6c 73 6f 20 61 70 70 65 6e 64  der. Also append
1ab50 20 61 20 76 61 6c 75 65 20 74 6f 20 74 68 65 20   a value to the 
1ab60 64 6c 69 64 78 0a 20 20 20 20 2a 2a 20 62 75 66  dlidx.    ** buf
1ab70 66 65 72 2c 20 69 6e 20 63 61 73 65 20 61 20 64  fer, in case a d
1ab80 6f 63 6c 69 73 74 2d 69 6e 64 65 78 20 69 73 20  oclist-index is 
1ab90 72 65 71 75 69 72 65 64 2e 20 20 2a 2f 0a 20 20  required.  */.  
1aba0 20 20 69 66 28 20 70 57 72 69 74 65 72 2d 3e 62    if( pWriter->b
1abb0 46 69 72 73 74 52 6f 77 69 64 49 6e 50 61 67 65  FirstRowidInPage
1abc0 20 29 7b 0a 20 20 20 20 20 20 66 74 73 35 50 75   ){.      fts5Pu
1abd0 74 55 31 36 28 70 50 61 67 65 2d 3e 62 75 66 2e  tU16(pPage->buf.
1abe0 70 2c 20 28 75 31 36 29 70 50 61 67 65 2d 3e 62  p, (u16)pPage->b
1abf0 75 66 2e 6e 29 3b 0a 20 20 20 20 20 20 66 74 73  uf.n);.      fts
1ac00 35 57 72 69 74 65 44 6c 69 64 78 41 70 70 65 6e  5WriteDlidxAppen
1ac10 64 28 70 2c 20 70 57 72 69 74 65 72 2c 20 69 52  d(p, pWriter, iR
1ac20 6f 77 69 64 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  owid);.    }..  
1ac30 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 72    /* Write the r
1ac40 6f 77 69 64 2e 20 2a 2f 0a 20 20 20 20 69 66 28  owid. */.    if(
1ac50 20 70 57 72 69 74 65 72 2d 3e 62 46 69 72 73 74   pWriter->bFirst
1ac60 52 6f 77 69 64 49 6e 44 6f 63 6c 69 73 74 20 7c  RowidInDoclist |
1ac70 7c 20 70 57 72 69 74 65 72 2d 3e 62 46 69 72 73  | pWriter->bFirs
1ac80 74 52 6f 77 69 64 49 6e 50 61 67 65 20 29 7b 0a  tRowidInPage ){.
1ac90 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72        fts5Buffer
1aca0 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26 70 2d  AppendVarint(&p-
1acb0 3e 72 63 2c 20 26 70 50 61 67 65 2d 3e 62 75 66  >rc, &pPage->buf
1acc0 2c 20 69 52 6f 77 69 64 29 3b 0a 20 20 20 20 7d  , iRowid);.    }
1acd0 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65  else{.      asse
1ace0 72 74 28 20 70 2d 3e 72 63 20 7c 7c 20 69 52 6f  rt( p->rc || iRo
1acf0 77 69 64 3e 70 57 72 69 74 65 72 2d 3e 69 50 72  wid>pWriter->iPr
1ad00 65 76 52 6f 77 69 64 20 29 3b 0a 20 20 20 20 20  evRowid );.     
1ad10 20 66 74 73 35 42 75 66 66 65 72 41 70 70 65 6e   fts5BufferAppen
1ad20 64 56 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20  dVarint(&p->rc, 
1ad30 26 70 50 61 67 65 2d 3e 62 75 66 2c 20 69 52 6f  &pPage->buf, iRo
1ad40 77 69 64 20 2d 20 70 57 72 69 74 65 72 2d 3e 69  wid - pWriter->i
1ad50 50 72 65 76 52 6f 77 69 64 29 3b 0a 20 20 20 20  PrevRowid);.    
1ad60 7d 0a 20 20 20 20 70 57 72 69 74 65 72 2d 3e 69  }.    pWriter->i
1ad70 50 72 65 76 52 6f 77 69 64 20 3d 20 69 52 6f 77  PrevRowid = iRow
1ad80 69 64 3b 0a 20 20 20 20 70 57 72 69 74 65 72 2d  id;.    pWriter-
1ad90 3e 62 46 69 72 73 74 52 6f 77 69 64 49 6e 44 6f  >bFirstRowidInDo
1ada0 63 6c 69 73 74 20 3d 20 30 3b 0a 20 20 20 20 70  clist = 0;.    p
1adb0 57 72 69 74 65 72 2d 3e 62 46 69 72 73 74 52 6f  Writer->bFirstRo
1adc0 77 69 64 49 6e 50 61 67 65 20 3d 20 30 3b 0a 20  widInPage = 0;. 
1add0 20 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69   }.}..static voi
1ade0 64 20 66 74 73 35 57 72 69 74 65 41 70 70 65 6e  d fts5WriteAppen
1adf0 64 50 6f 73 6c 69 73 74 44 61 74 61 28 0a 20 20  dPoslistData(.  
1ae00 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 0a 20  Fts5Index *p, . 
1ae10 20 46 74 73 35 53 65 67 57 72 69 74 65 72 20 2a   Fts5SegWriter *
1ae20 70 57 72 69 74 65 72 2c 20 0a 20 20 63 6f 6e 73  pWriter, .  cons
1ae30 74 20 75 38 20 2a 61 44 61 74 61 2c 20 0a 20 20  t u8 *aData, .  
1ae40 69 6e 74 20 6e 44 61 74 61 0a 29 7b 0a 20 20 46  int nData.){.  F
1ae50 74 73 35 50 61 67 65 57 72 69 74 65 72 20 2a 70  ts5PageWriter *p
1ae60 50 61 67 65 20 3d 20 26 70 57 72 69 74 65 72 2d  Page = &pWriter-
1ae70 3e 77 72 69 74 65 72 3b 0a 20 20 63 6f 6e 73 74  >writer;.  const
1ae80 20 75 38 20 2a 61 20 3d 20 61 44 61 74 61 3b 0a   u8 *a = aData;.
1ae90 20 20 69 6e 74 20 6e 20 3d 20 6e 44 61 74 61 3b    int n = nData;
1aea0 0a 20 20 0a 20 20 61 73 73 65 72 74 28 20 70 2d  .  .  assert( p-
1aeb0 3e 70 43 6f 6e 66 69 67 2d 3e 70 67 73 7a 3e 30  >pConfig->pgsz>0
1aec0 20 29 3b 0a 20 20 77 68 69 6c 65 28 20 70 2d 3e   );.  while( p->
1aed0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 0a 20  rc==SQLITE_OK . 
1aee0 20 20 20 20 26 26 20 28 70 50 61 67 65 2d 3e 62      && (pPage->b
1aef0 75 66 2e 6e 20 2b 20 70 50 61 67 65 2d 3e 70 67  uf.n + pPage->pg
1af00 69 64 78 2e 6e 20 2b 20 6e 29 3e 3d 70 2d 3e 70  idx.n + n)>=p->p
1af10 43 6f 6e 66 69 67 2d 3e 70 67 73 7a 20 0a 20 20  Config->pgsz .  
1af20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 52 65 71 20  ){.    int nReq 
1af30 3d 20 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e 70 67  = p->pConfig->pg
1af40 73 7a 20 2d 20 70 50 61 67 65 2d 3e 62 75 66 2e  sz - pPage->buf.
1af50 6e 20 2d 20 70 50 61 67 65 2d 3e 70 67 69 64 78  n - pPage->pgidx
1af60 2e 6e 3b 0a 20 20 20 20 69 6e 74 20 6e 43 6f 70  .n;.    int nCop
1af70 79 20 3d 20 30 3b 0a 20 20 20 20 77 68 69 6c 65  y = 0;.    while
1af80 28 20 6e 43 6f 70 79 3c 6e 52 65 71 20 29 7b 0a  ( nCopy<nReq ){.
1af90 20 20 20 20 20 20 69 36 34 20 64 75 6d 6d 79 3b        i64 dummy;
1afa0 0a 20 20 20 20 20 20 6e 43 6f 70 79 20 2b 3d 20  .      nCopy += 
1afb0 66 74 73 35 47 65 74 56 61 72 69 6e 74 28 26 61  fts5GetVarint(&a
1afc0 5b 6e 43 6f 70 79 5d 2c 20 28 75 36 34 2a 29 26  [nCopy], (u64*)&
1afd0 64 75 6d 6d 79 29 3b 0a 20 20 20 20 7d 0a 20 20  dummy);.    }.  
1afe0 20 20 66 74 73 35 42 75 66 66 65 72 41 70 70 65    fts5BufferAppe
1aff0 6e 64 42 6c 6f 62 28 26 70 2d 3e 72 63 2c 20 26  ndBlob(&p->rc, &
1b000 70 50 61 67 65 2d 3e 62 75 66 2c 20 6e 43 6f 70  pPage->buf, nCop
1b010 79 2c 20 61 29 3b 0a 20 20 20 20 61 20 2b 3d 20  y, a);.    a += 
1b020 6e 43 6f 70 79 3b 0a 20 20 20 20 6e 20 2d 3d 20  nCopy;.    n -= 
1b030 6e 43 6f 70 79 3b 0a 20 20 20 20 66 74 73 35 57  nCopy;.    fts5W
1b040 72 69 74 65 46 6c 75 73 68 4c 65 61 66 28 70 2c  riteFlushLeaf(p,
1b050 20 70 57 72 69 74 65 72 29 3b 0a 20 20 7d 0a 20   pWriter);.  }. 
1b060 20 69 66 28 20 6e 3e 30 20 29 7b 0a 20 20 20 20   if( n>0 ){.    
1b070 66 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64  fts5BufferAppend
1b080 42 6c 6f 62 28 26 70 2d 3e 72 63 2c 20 26 70 50  Blob(&p->rc, &pP
1b090 61 67 65 2d 3e 62 75 66 2c 20 6e 2c 20 61 29 3b  age->buf, n, a);
1b0a0 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 6c  .  }.}../*.** Fl
1b0b0 75 73 68 20 61 6e 79 20 64 61 74 61 20 63 61 63  ush any data cac
1b0c0 68 65 64 20 62 79 20 74 68 65 20 77 72 69 74 65  hed by the write
1b0d0 72 20 6f 62 6a 65 63 74 20 74 6f 20 74 68 65 20  r object to the 
1b0e0 64 61 74 61 62 61 73 65 2e 20 46 72 65 65 20 61  database. Free a
1b0f0 6e 79 0a 2a 2a 20 61 6c 6c 6f 63 61 74 69 6f 6e  ny.** allocation
1b100 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  s associated wit
1b110 68 20 74 68 65 20 77 72 69 74 65 72 2e 0a 2a 2f  h the writer..*/
1b120 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
1b130 35 57 72 69 74 65 46 69 6e 69 73 68 28 0a 20 20  5WriteFinish(.  
1b140 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 0a 20  Fts5Index *p, . 
1b150 20 46 74 73 35 53 65 67 57 72 69 74 65 72 20 2a   Fts5SegWriter *
1b160 70 57 72 69 74 65 72 2c 20 20 20 20 20 20 20 20  pWriter,        
1b170 20 2f 2a 20 57 72 69 74 65 72 20 6f 62 6a 65 63   /* Writer objec
1b180 74 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 4c 65  t */.  int *pnLe
1b190 61 66 20 20 20 20 20 20 20 20 20 20 20 20 20 20  af              
1b1a0 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 4e         /* OUT: N
1b1b0 75 6d 62 65 72 20 6f 66 20 6c 65 61 66 20 70 61  umber of leaf pa
1b1c0 67 65 73 20 69 6e 20 62 2d 74 72 65 65 20 2a 2f  ges in b-tree */
1b1d0 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 46  .){.  int i;.  F
1b1e0 74 73 35 50 61 67 65 57 72 69 74 65 72 20 2a 70  ts5PageWriter *p
1b1f0 4c 65 61 66 20 3d 20 26 70 57 72 69 74 65 72 2d  Leaf = &pWriter-
1b200 3e 77 72 69 74 65 72 3b 0a 20 20 69 66 28 20 70  >writer;.  if( p
1b210 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
1b220 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
1b230 4c 65 61 66 2d 3e 70 67 6e 6f 3e 3d 31 20 29 3b  Leaf->pgno>=1 );
1b240 0a 20 20 20 20 69 66 28 20 70 4c 65 61 66 2d 3e  .    if( pLeaf->
1b250 62 75 66 2e 6e 3e 34 20 29 7b 0a 20 20 20 20 20  buf.n>4 ){.     
1b260 20 66 74 73 35 57 72 69 74 65 46 6c 75 73 68 4c   fts5WriteFlushL
1b270 65 61 66 28 70 2c 20 70 57 72 69 74 65 72 29 3b  eaf(p, pWriter);
1b280 0a 20 20 20 20 7d 0a 20 20 20 20 2a 70 6e 4c 65  .    }.    *pnLe
1b290 61 66 20 3d 20 70 4c 65 61 66 2d 3e 70 67 6e 6f  af = pLeaf->pgno
1b2a0 2d 31 3b 0a 20 20 20 20 66 74 73 35 57 72 69 74  -1;.    fts5Writ
1b2b0 65 46 6c 75 73 68 42 74 72 65 65 28 70 2c 20 70  eFlushBtree(p, p
1b2c0 57 72 69 74 65 72 29 3b 0a 20 20 7d 0a 20 20 66  Writer);.  }.  f
1b2d0 74 73 35 42 75 66 66 65 72 46 72 65 65 28 26 70  ts5BufferFree(&p
1b2e0 4c 65 61 66 2d 3e 74 65 72 6d 29 3b 0a 20 20 66  Leaf->term);.  f
1b2f0 74 73 35 42 75 66 66 65 72 46 72 65 65 28 26 70  ts5BufferFree(&p
1b300 4c 65 61 66 2d 3e 62 75 66 29 3b 0a 20 20 66 74  Leaf->buf);.  ft
1b310 73 35 42 75 66 66 65 72 46 72 65 65 28 26 70 4c  s5BufferFree(&pL
1b320 65 61 66 2d 3e 70 67 69 64 78 29 3b 0a 20 20 66  eaf->pgidx);.  f
1b330 74 73 35 42 75 66 66 65 72 46 72 65 65 28 26 70  ts5BufferFree(&p
1b340 57 72 69 74 65 72 2d 3e 62 74 74 65 72 6d 29 3b  Writer->btterm);
1b350 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ..  for(i=0; i<p
1b360 57 72 69 74 65 72 2d 3e 6e 44 6c 69 64 78 3b 20  Writer->nDlidx; 
1b370 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  i++){.    sqlite
1b380 33 46 74 73 35 42 75 66 66 65 72 46 72 65 65 28  3Fts5BufferFree(
1b390 26 70 57 72 69 74 65 72 2d 3e 61 44 6c 69 64 78  &pWriter->aDlidx
1b3a0 5b 69 5d 2e 62 75 66 29 3b 0a 20 20 7d 0a 20 20  [i].buf);.  }.  
1b3b0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 57 72  sqlite3_free(pWr
1b3c0 69 74 65 72 2d 3e 61 44 6c 69 64 78 29 3b 0a 7d  iter->aDlidx);.}
1b3d0 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  ..static void ft
1b3e0 73 35 57 72 69 74 65 49 6e 69 74 28 0a 20 20 46  s5WriteInit(.  F
1b3f0 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 0a 20 20  ts5Index *p, .  
1b400 46 74 73 35 53 65 67 57 72 69 74 65 72 20 2a 70  Fts5SegWriter *p
1b410 57 72 69 74 65 72 2c 20 0a 20 20 69 6e 74 20 69  Writer, .  int i
1b420 53 65 67 69 64 0a 29 7b 0a 20 20 63 6f 6e 73 74  Segid.){.  const
1b430 20 69 6e 74 20 6e 42 75 66 66 65 72 20 3d 20 70   int nBuffer = p
1b440 2d 3e 70 43 6f 6e 66 69 67 2d 3e 70 67 73 7a 20  ->pConfig->pgsz 
1b450 2b 20 46 54 53 35 5f 44 41 54 41 5f 50 41 44 44  + FTS5_DATA_PADD
1b460 49 4e 47 3b 0a 0a 20 20 6d 65 6d 73 65 74 28 70  ING;..  memset(p
1b470 57 72 69 74 65 72 2c 20 30 2c 20 73 69 7a 65 6f  Writer, 0, sizeo
1b480 66 28 46 74 73 35 53 65 67 57 72 69 74 65 72 29  f(Fts5SegWriter)
1b490 29 3b 0a 20 20 70 57 72 69 74 65 72 2d 3e 69 53  );.  pWriter->iS
1b4a0 65 67 69 64 20 3d 20 69 53 65 67 69 64 3b 0a 0a  egid = iSegid;..
1b4b0 20 20 66 74 73 35 57 72 69 74 65 44 6c 69 64 78    fts5WriteDlidx
1b4c0 47 72 6f 77 28 70 2c 20 70 57 72 69 74 65 72 2c  Grow(p, pWriter,
1b4d0 20 31 29 3b 0a 20 20 70 57 72 69 74 65 72 2d 3e   1);.  pWriter->
1b4e0 77 72 69 74 65 72 2e 70 67 6e 6f 20 3d 20 31 3b  writer.pgno = 1;
1b4f0 0a 20 20 70 57 72 69 74 65 72 2d 3e 62 46 69 72  .  pWriter->bFir
1b500 73 74 54 65 72 6d 49 6e 50 61 67 65 20 3d 20 31  stTermInPage = 1
1b510 3b 0a 20 20 70 57 72 69 74 65 72 2d 3e 69 42 74  ;.  pWriter->iBt
1b520 50 61 67 65 20 3d 20 31 3b 0a 0a 20 20 61 73 73  Page = 1;..  ass
1b530 65 72 74 28 20 70 57 72 69 74 65 72 2d 3e 77 72  ert( pWriter->wr
1b540 69 74 65 72 2e 62 75 66 2e 6e 3d 3d 30 20 29 3b  iter.buf.n==0 );
1b550 0a 20 20 61 73 73 65 72 74 28 20 70 57 72 69 74  .  assert( pWrit
1b560 65 72 2d 3e 77 72 69 74 65 72 2e 70 67 69 64 78  er->writer.pgidx
1b570 2e 6e 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 47  .n==0 );..  /* G
1b580 72 6f 77 20 74 68 65 20 74 77 6f 20 62 75 66 66  row the two buff
1b590 65 72 73 20 74 6f 20 70 67 73 7a 20 2b 20 70 61  ers to pgsz + pa
1b5a0 64 64 69 6e 67 20 62 79 74 65 73 20 69 6e 20 73  dding bytes in s
1b5b0 69 7a 65 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65  ize. */.  sqlite
1b5c0 33 46 74 73 35 42 75 66 66 65 72 53 69 7a 65 28  3Fts5BufferSize(
1b5d0 26 70 2d 3e 72 63 2c 20 26 70 57 72 69 74 65 72  &p->rc, &pWriter
1b5e0 2d 3e 77 72 69 74 65 72 2e 70 67 69 64 78 2c 20  ->writer.pgidx, 
1b5f0 6e 42 75 66 66 65 72 29 3b 0a 20 20 73 71 6c 69  nBuffer);.  sqli
1b600 74 65 33 46 74 73 35 42 75 66 66 65 72 53 69 7a  te3Fts5BufferSiz
1b610 65 28 26 70 2d 3e 72 63 2c 20 26 70 57 72 69 74  e(&p->rc, &pWrit
1b620 65 72 2d 3e 77 72 69 74 65 72 2e 62 75 66 2c 20  er->writer.buf, 
1b630 6e 42 75 66 66 65 72 29 3b 0a 0a 20 20 69 66 28  nBuffer);..  if(
1b640 20 70 2d 3e 70 49 64 78 57 72 69 74 65 72 3d 3d   p->pIdxWriter==
1b650 30 20 29 7b 0a 20 20 20 20 46 74 73 35 43 6f 6e  0 ){.    Fts5Con
1b660 66 69 67 20 2a 70 43 6f 6e 66 69 67 20 3d 20 70  fig *pConfig = p
1b670 2d 3e 70 43 6f 6e 66 69 67 3b 0a 20 20 20 20 66  ->pConfig;.    f
1b680 74 73 35 49 6e 64 65 78 50 72 65 70 61 72 65 53  ts5IndexPrepareS
1b690 74 6d 74 28 70 2c 20 26 70 2d 3e 70 49 64 78 57  tmt(p, &p->pIdxW
1b6a0 72 69 74 65 72 2c 20 73 71 6c 69 74 65 33 5f 6d  riter, sqlite3_m
1b6b0 70 72 69 6e 74 66 28 0a 20 20 20 20 20 20 20 20  printf(.        
1b6c0 20 20 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 27    "INSERT INTO '
1b6d0 25 71 27 2e 27 25 71 5f 69 64 78 27 28 73 65 67  %q'.'%q_idx'(seg
1b6e0 69 64 2c 74 65 72 6d 2c 70 67 6e 6f 29 20 56 41  id,term,pgno) VA
1b6f0 4c 55 45 53 28 3f 2c 3f 2c 3f 29 22 2c 20 0a 20  LUES(?,?,?)", . 
1b700 20 20 20 20 20 20 20 20 20 70 43 6f 6e 66 69 67           pConfig
1b710 2d 3e 7a 44 62 2c 20 70 43 6f 6e 66 69 67 2d 3e  ->zDb, pConfig->
1b720 7a 4e 61 6d 65 0a 20 20 20 20 29 29 3b 0a 20 20  zName.    ));.  
1b730 7d 0a 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d  }..  if( p->rc==
1b740 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1b750 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74   /* Initialize t
1b760 68 65 20 34 2d 62 79 74 65 20 6c 65 61 66 2d 70  he 4-byte leaf-p
1b770 61 67 65 20 68 65 61 64 65 72 20 74 6f 20 30 78  age header to 0x
1b780 30 30 2e 20 2a 2f 0a 20 20 20 20 6d 65 6d 73 65  00. */.    memse
1b790 74 28 70 57 72 69 74 65 72 2d 3e 77 72 69 74 65  t(pWriter->write
1b7a0 72 2e 62 75 66 2e 70 2c 20 30 2c 20 34 29 3b 0a  r.buf.p, 0, 4);.
1b7b0 20 20 20 20 70 57 72 69 74 65 72 2d 3e 77 72 69      pWriter->wri
1b7c0 74 65 72 2e 62 75 66 2e 6e 20 3d 20 34 3b 0a 0a  ter.buf.n = 4;..
1b7d0 20 20 20 20 2f 2a 20 42 69 6e 64 20 74 68 65 20      /* Bind the 
1b7e0 63 75 72 72 65 6e 74 20 6f 75 74 70 75 74 20 73  current output s
1b7f0 65 67 6d 65 6e 74 20 69 64 20 74 6f 20 74 68 65  egment id to the
1b800 20 69 6e 64 65 78 2d 77 72 69 74 65 72 2e 20 54   index-writer. T
1b810 68 69 73 20 69 73 20 61 6e 0a 20 20 20 20 2a 2a  his is an.    **
1b820 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 6f 76   optimization ov
1b830 65 72 20 62 69 6e 64 69 6e 67 20 74 68 65 20 73  er binding the s
1b840 61 6d 65 20 76 61 6c 75 65 20 6f 76 65 72 20 61  ame value over a
1b850 6e 64 20 6f 76 65 72 20 61 73 20 72 6f 77 73 20  nd over as rows 
1b860 61 72 65 0a 20 20 20 20 2a 2a 20 69 6e 73 65 72  are.    ** inser
1b870 74 65 64 20 69 6e 74 6f 20 25 5f 69 64 78 20 62  ted into %_idx b
1b880 79 20 74 68 65 20 63 75 72 72 65 6e 74 20 77 72  y the current wr
1b890 69 74 65 72 2e 20 20 2a 2f 0a 20 20 20 20 73 71  iter.  */.    sq
1b8a0 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 28 70  lite3_bind_int(p
1b8b0 2d 3e 70 49 64 78 57 72 69 74 65 72 2c 20 31 2c  ->pIdxWriter, 1,
1b8c0 20 70 57 72 69 74 65 72 2d 3e 69 53 65 67 69 64   pWriter->iSegid
1b8d0 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
1b8e0 49 74 65 72 61 74 6f 72 20 70 49 74 65 72 20 77  Iterator pIter w
1b8f0 61 73 20 75 73 65 64 20 74 6f 20 69 74 65 72 61  as used to itera
1b900 74 65 20 74 68 72 6f 75 67 68 20 74 68 65 20 69  te through the i
1b910 6e 70 75 74 20 73 65 67 6d 65 6e 74 73 20 6f 66  nput segments of
1b920 20 6f 6e 20 61 6e 0a 2a 2a 20 69 6e 63 72 65 6d   on an.** increm
1b930 65 6e 74 61 6c 20 6d 65 72 67 65 20 6f 70 65 72  ental merge oper
1b940 61 74 69 6f 6e 2e 20 54 68 69 73 20 66 75 6e 63  ation. This func
1b950 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 69  tion is called i
1b960 66 20 74 68 65 20 69 6e 63 72 65 6d 65 6e 74 61  f the incrementa
1b970 6c 0a 2a 2a 20 6d 65 72 67 65 20 73 74 65 70 20  l.** merge step 
1b980 68 61 73 20 66 69 6e 69 73 68 65 64 20 62 75 74  has finished but
1b990 20 74 68 65 20 69 6e 70 75 74 20 68 61 73 20 6e   the input has n
1b9a0 6f 74 20 62 65 65 6e 20 63 6f 6d 70 6c 65 74 65  ot been complete
1b9b0 6c 79 20 65 78 68 61 75 73 74 65 64 2e 0a 2a 2f  ly exhausted..*/
1b9c0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
1b9d0 35 54 72 69 6d 53 65 67 6d 65 6e 74 73 28 46 74  5TrimSegments(Ft
1b9e0 73 35 49 6e 64 65 78 20 2a 70 2c 20 46 74 73 35  s5Index *p, Fts5
1b9f0 49 6e 64 65 78 49 74 65 72 20 2a 70 49 74 65 72  IndexIter *pIter
1ba00 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 46 74  ){.  int i;.  Ft
1ba10 73 35 42 75 66 66 65 72 20 62 75 66 3b 0a 20 20  s5Buffer buf;.  
1ba20 6d 65 6d 73 65 74 28 26 62 75 66 2c 20 30 2c 20  memset(&buf, 0, 
1ba30 73 69 7a 65 6f 66 28 46 74 73 35 42 75 66 66 65  sizeof(Fts5Buffe
1ba40 72 29 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  r));.  for(i=0; 
1ba50 69 3c 70 49 74 65 72 2d 3e 6e 53 65 67 3b 20 69  i<pIter->nSeg; i
1ba60 2b 2b 29 7b 0a 20 20 20 20 46 74 73 35 53 65 67  ++){.    Fts5Seg
1ba70 49 74 65 72 20 2a 70 53 65 67 20 3d 20 26 70 49  Iter *pSeg = &pI
1ba80 74 65 72 2d 3e 61 53 65 67 5b 69 5d 3b 0a 20 20  ter->aSeg[i];.  
1ba90 20 20 69 66 28 20 70 53 65 67 2d 3e 70 53 65 67    if( pSeg->pSeg
1baa0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  ==0 ){.      /* 
1bab0 6e 6f 2d 6f 70 20 2a 2f 0a 20 20 20 20 7d 65 6c  no-op */.    }el
1bac0 73 65 20 69 66 28 20 70 53 65 67 2d 3e 70 4c 65  se if( pSeg->pLe
1bad0 61 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f  af==0 ){.      /
1bae0 2a 20 41 6c 6c 20 6b 65 79 73 20 66 72 6f 6d 20  * All keys from 
1baf0 74 68 69 73 20 69 6e 70 75 74 20 73 65 67 6d 65  this input segme
1bb00 6e 74 20 68 61 76 65 20 62 65 65 6e 20 74 72 61  nt have been tra
1bb10 6e 73 66 65 72 65 64 20 74 6f 20 74 68 65 20 6f  nsfered to the o
1bb20 75 74 70 75 74 2e 0a 20 20 20 20 20 20 2a 2a 20  utput..      ** 
1bb30 53 65 74 20 62 6f 74 68 20 74 68 65 20 66 69 72  Set both the fir
1bb40 73 74 20 61 6e 64 20 6c 61 73 74 20 70 61 67 65  st and last page
1bb50 2d 6e 75 6d 62 65 72 73 20 74 6f 20 30 20 74 6f  -numbers to 0 to
1bb60 20 69 6e 64 69 63 61 74 65 20 74 68 61 74 20 74   indicate that t
1bb70 68 65 0a 20 20 20 20 20 20 2a 2a 20 73 65 67 6d  he.      ** segm
1bb80 65 6e 74 20 69 73 20 6e 6f 77 20 65 6d 70 74 79  ent is now empty
1bb90 2e 20 2a 2f 0a 20 20 20 20 20 20 70 53 65 67 2d  . */.      pSeg-
1bba0 3e 70 53 65 67 2d 3e 70 67 6e 6f 4c 61 73 74 20  >pSeg->pgnoLast 
1bbb0 3d 20 30 3b 0a 20 20 20 20 20 20 70 53 65 67 2d  = 0;.      pSeg-
1bbc0 3e 70 53 65 67 2d 3e 70 67 6e 6f 46 69 72 73 74  >pSeg->pgnoFirst
1bbd0 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b   = 0;.    }else{
1bbe0 0a 20 20 20 20 20 20 69 6e 74 20 69 4f 66 66 20  .      int iOff 
1bbf0 3d 20 70 53 65 67 2d 3e 69 54 65 72 6d 4c 65 61  = pSeg->iTermLea
1bc00 66 4f 66 66 73 65 74 3b 20 20 20 20 20 2f 2a 20  fOffset;     /* 
1bc10 4f 66 66 73 65 74 20 6f 6e 20 6e 65 77 20 66 69  Offset on new fi
1bc20 72 73 74 20 6c 65 61 66 20 70 61 67 65 20 2a 2f  rst leaf page */
1bc30 0a 20 20 20 20 20 20 69 36 34 20 69 4c 65 61 66  .      i64 iLeaf
1bc40 52 6f 77 69 64 3b 0a 20 20 20 20 20 20 46 74 73  Rowid;.      Fts
1bc50 35 44 61 74 61 20 2a 70 44 61 74 61 3b 0a 20 20  5Data *pData;.  
1bc60 20 20 20 20 69 6e 74 20 69 49 64 20 3d 20 70 53      int iId = pS
1bc70 65 67 2d 3e 70 53 65 67 2d 3e 69 53 65 67 69 64  eg->pSeg->iSegid
1bc80 3b 0a 20 20 20 20 20 20 75 38 20 61 48 64 72 5b  ;.      u8 aHdr[
1bc90 34 5d 20 3d 20 7b 30 78 30 30 2c 20 30 78 30 30  4] = {0x00, 0x00
1bca0 2c 20 30 78 30 30 2c 20 30 78 30 30 7d 3b 0a 0a  , 0x00, 0x00};..
1bcb0 20 20 20 20 20 20 69 4c 65 61 66 52 6f 77 69 64        iLeafRowid
1bcc0 20 3d 20 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f   = FTS5_SEGMENT_
1bcd0 52 4f 57 49 44 28 69 49 64 2c 20 70 53 65 67 2d  ROWID(iId, pSeg-
1bce0 3e 69 54 65 72 6d 4c 65 61 66 50 67 6e 6f 29 3b  >iTermLeafPgno);
1bcf0 0a 20 20 20 20 20 20 70 44 61 74 61 20 3d 20 66  .      pData = f
1bd00 74 73 35 44 61 74 61 52 65 61 64 28 70 2c 20 69  ts5DataRead(p, i
1bd10 4c 65 61 66 52 6f 77 69 64 29 3b 0a 20 20 20 20  LeafRowid);.    
1bd20 20 20 69 66 28 20 70 44 61 74 61 20 29 7b 0a 20    if( pData ){. 
1bd30 20 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65         fts5Buffe
1bd40 72 5a 65 72 6f 28 26 62 75 66 29 3b 0a 20 20 20  rZero(&buf);.   
1bd50 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72 47       fts5BufferG
1bd60 72 6f 77 28 26 70 2d 3e 72 63 2c 20 26 62 75 66  row(&p->rc, &buf
1bd70 2c 20 70 44 61 74 61 2d 3e 6e 6e 29 3b 0a 20 20  , pData->nn);.  
1bd80 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72        fts5Buffer
1bd90 41 70 70 65 6e 64 42 6c 6f 62 28 26 70 2d 3e 72  AppendBlob(&p->r
1bda0 63 2c 20 26 62 75 66 2c 20 73 69 7a 65 6f 66 28  c, &buf, sizeof(
1bdb0 61 48 64 72 29 2c 20 61 48 64 72 29 3b 0a 20 20  aHdr), aHdr);.  
1bdc0 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72        fts5Buffer
1bdd0 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26 70 2d  AppendVarint(&p-
1bde0 3e 72 63 2c 20 26 62 75 66 2c 20 70 53 65 67 2d  >rc, &buf, pSeg-
1bdf0 3e 74 65 72 6d 2e 6e 29 3b 0a 20 20 20 20 20 20  >term.n);.      
1be00 20 20 66 74 73 35 42 75 66 66 65 72 41 70 70 65    fts5BufferAppe
1be10 6e 64 42 6c 6f 62 28 26 70 2d 3e 72 63 2c 20 26  ndBlob(&p->rc, &
1be20 62 75 66 2c 20 70 53 65 67 2d 3e 74 65 72 6d 2e  buf, pSeg->term.
1be30 6e 2c 20 70 53 65 67 2d 3e 74 65 72 6d 2e 70 29  n, pSeg->term.p)
1be40 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35 42 75  ;.        fts5Bu
1be50 66 66 65 72 41 70 70 65 6e 64 42 6c 6f 62 28 26  fferAppendBlob(&
1be60 70 2d 3e 72 63 2c 20 26 62 75 66 2c 20 70 44 61  p->rc, &buf, pDa
1be70 74 61 2d 3e 73 7a 4c 65 61 66 2d 69 4f 66 66 2c  ta->szLeaf-iOff,
1be80 20 26 70 44 61 74 61 2d 3e 70 5b 69 4f 66 66 5d   &pData->p[iOff]
1be90 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
1bea0 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
1beb0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ){.          /* 
1bec0 53 65 74 20 74 68 65 20 73 7a 4c 65 61 66 20 66  Set the szLeaf f
1bed0 69 65 6c 64 20 2a 2f 0a 20 20 20 20 20 20 20 20  ield */.        
1bee0 20 20 66 74 73 35 50 75 74 55 31 36 28 26 62 75    fts5PutU16(&bu
1bef0 66 2e 70 5b 32 5d 2c 20 28 75 31 36 29 62 75 66  f.p[2], (u16)buf
1bf00 2e 6e 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a  .n);.        }..
1bf10 20 20 20 20 20 20 20 20 2f 2a 20 53 65 74 20 75          /* Set u
1bf20 70 20 74 68 65 20 6e 65 77 20 70 61 67 65 2d 69  p the new page-i
1bf30 6e 64 65 78 20 61 72 72 61 79 20 2a 2f 0a 20 20  ndex array */.  
1bf40 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72        fts5Buffer
1bf50 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26 70 2d  AppendVarint(&p-
1bf60 3e 72 63 2c 20 26 62 75 66 2c 20 34 29 3b 0a 20  >rc, &buf, 4);. 
1bf70 20 20 20 20 20 20 20 69 66 28 20 70 53 65 67 2d         if( pSeg-
1bf80 3e 69 4c 65 61 66 50 67 6e 6f 3d 3d 70 53 65 67  >iLeafPgno==pSeg
1bf90 2d 3e 69 54 65 72 6d 4c 65 61 66 50 67 6e 6f 20  ->iTermLeafPgno 
1bfa0 0a 20 20 20 20 20 20 20 20 20 26 26 20 70 53 65  .         && pSe
1bfb0 67 2d 3e 69 45 6e 64 6f 66 44 6f 63 6c 69 73 74  g->iEndofDoclist
1bfc0 3c 70 44 61 74 61 2d 3e 73 7a 4c 65 61 66 20 0a  <pData->szLeaf .
1bfd0 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20          ){.     
1bfe0 20 20 20 20 20 69 6e 74 20 6e 44 69 66 66 20 3d       int nDiff =
1bff0 20 70 44 61 74 61 2d 3e 73 7a 4c 65 61 66 20 2d   pData->szLeaf -
1c000 20 70 53 65 67 2d 3e 69 45 6e 64 6f 66 44 6f 63   pSeg->iEndofDoc
1c010 6c 69 73 74 3b 0a 20 20 20 20 20 20 20 20 20 20  list;.          
1c020 66 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64  fts5BufferAppend
1c030 56 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26  Varint(&p->rc, &
1c040 62 75 66 2c 20 62 75 66 2e 6e 20 2d 20 31 20 2d  buf, buf.n - 1 -
1c050 20 6e 44 69 66 66 20 2d 20 34 29 3b 0a 20 20 20   nDiff - 4);.   
1c060 20 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65         fts5Buffe
1c070 72 41 70 70 65 6e 64 42 6c 6f 62 28 26 70 2d 3e  rAppendBlob(&p->
1c080 72 63 2c 20 26 62 75 66 2c 20 0a 20 20 20 20 20  rc, &buf, .     
1c090 20 20 20 20 20 20 20 20 20 70 44 61 74 61 2d 3e           pData->
1c0a0 6e 6e 20 2d 20 70 53 65 67 2d 3e 69 50 67 69 64  nn - pSeg->iPgid
1c0b0 78 4f 66 66 2c 20 26 70 44 61 74 61 2d 3e 70 5b  xOff, &pData->p[
1c0c0 70 53 65 67 2d 3e 69 50 67 69 64 78 4f 66 66 5d  pSeg->iPgidxOff]
1c0d0 0a 20 20 20 20 20 20 20 20 20 20 29 3b 0a 20 20  .          );.  
1c0e0 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20        }..       
1c0f0 20 66 74 73 35 44 61 74 61 52 65 6c 65 61 73 65   fts5DataRelease
1c100 28 70 44 61 74 61 29 3b 0a 20 20 20 20 20 20 20  (pData);.       
1c110 20 70 53 65 67 2d 3e 70 53 65 67 2d 3e 70 67 6e   pSeg->pSeg->pgn
1c120 6f 46 69 72 73 74 20 3d 20 70 53 65 67 2d 3e 69  oFirst = pSeg->i
1c130 54 65 72 6d 4c 65 61 66 50 67 6e 6f 3b 0a 20 20  TermLeafPgno;.  
1c140 20 20 20 20 20 20 66 74 73 35 44 61 74 61 44 65        fts5DataDe
1c150 6c 65 74 65 28 70 2c 20 46 54 53 35 5f 53 45 47  lete(p, FTS5_SEG
1c160 4d 45 4e 54 5f 52 4f 57 49 44 28 69 49 64 2c 20  MENT_ROWID(iId, 
1c170 31 29 2c 20 69 4c 65 61 66 52 6f 77 69 64 29 3b  1), iLeafRowid);
1c180 0a 20 20 20 20 20 20 20 20 66 74 73 35 44 61 74  .        fts5Dat
1c190 61 57 72 69 74 65 28 70 2c 20 69 4c 65 61 66 52  aWrite(p, iLeafR
1c1a0 6f 77 69 64 2c 20 62 75 66 2e 70 2c 20 62 75 66  owid, buf.p, buf
1c1b0 2e 6e 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  .n);.      }.   
1c1c0 20 7d 0a 20 20 7d 0a 20 20 66 74 73 35 42 75 66   }.  }.  fts5Buf
1c1d0 66 65 72 46 72 65 65 28 26 62 75 66 29 3b 0a 7d  ferFree(&buf);.}
1c1e0 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  ..static void ft
1c1f0 73 35 4d 65 72 67 65 43 68 75 6e 6b 43 61 6c 6c  s5MergeChunkCall
1c200 62 61 63 6b 28 0a 20 20 46 74 73 35 49 6e 64 65  back(.  Fts5Inde
1c210 78 20 2a 70 2c 20 0a 20 20 76 6f 69 64 20 2a 70  x *p, .  void *p
1c220 43 74 78 2c 20 0a 20 20 63 6f 6e 73 74 20 75 38  Ctx, .  const u8
1c230 20 2a 70 43 68 75 6e 6b 2c 20 69 6e 74 20 6e 43   *pChunk, int nC
1c240 68 75 6e 6b 0a 29 7b 0a 20 20 46 74 73 35 53 65  hunk.){.  Fts5Se
1c250 67 57 72 69 74 65 72 20 2a 70 57 72 69 74 65 72  gWriter *pWriter
1c260 20 3d 20 28 46 74 73 35 53 65 67 57 72 69 74 65   = (Fts5SegWrite
1c270 72 2a 29 70 43 74 78 3b 0a 20 20 66 74 73 35 57  r*)pCtx;.  fts5W
1c280 72 69 74 65 41 70 70 65 6e 64 50 6f 73 6c 69 73  riteAppendPoslis
1c290 74 44 61 74 61 28 70 2c 20 70 57 72 69 74 65 72  tData(p, pWriter
1c2a0 2c 20 70 43 68 75 6e 6b 2c 20 6e 43 68 75 6e 6b  , pChunk, nChunk
1c2b0 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 0a 2a 2f 0a 73  );.}../*.**.*/.s
1c2c0 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 49  tatic void fts5I
1c2d0 6e 64 65 78 4d 65 72 67 65 4c 65 76 65 6c 28 0a  ndexMergeLevel(.
1c2e0 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20    Fts5Index *p, 
1c2f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c300 20 20 2f 2a 20 46 54 53 35 20 62 61 63 6b 65 6e    /* FTS5 backen
1c310 64 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 46 74  d object */.  Ft
1c320 73 35 53 74 72 75 63 74 75 72 65 20 2a 2a 70 70  s5Structure **pp
1c330 53 74 72 75 63 74 2c 20 20 20 20 20 20 20 2f 2a  Struct,       /*
1c340 20 49 4e 2f 4f 55 54 3a 20 53 74 75 63 74 75 72   IN/OUT: Stuctur
1c350 65 20 6f 66 20 69 6e 64 65 78 20 2a 2f 0a 20 20  e of index */.  
1c360 69 6e 74 20 69 4c 76 6c 2c 20 20 20 20 20 20 20  int iLvl,       
1c370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c380 2f 2a 20 4c 65 76 65 6c 20 74 6f 20 72 65 61 64  /* Level to read
1c390 20 69 6e 70 75 74 20 66 72 6f 6d 20 2a 2f 0a 20   input from */. 
1c3a0 20 69 6e 74 20 2a 70 6e 52 65 6d 20 20 20 20 20   int *pnRem     
1c3b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c3c0 20 2f 2a 20 57 72 69 74 65 20 75 70 20 74 6f 20   /* Write up to 
1c3d0 74 68 69 73 20 6d 61 6e 79 20 6f 75 74 70 75 74  this many output
1c3e0 20 6c 65 61 76 65 73 20 2a 2f 0a 29 7b 0a 20 20   leaves */.){.  
1c3f0 46 74 73 35 53 74 72 75 63 74 75 72 65 20 2a 70  Fts5Structure *p
1c400 53 74 72 75 63 74 20 3d 20 2a 70 70 53 74 72 75  Struct = *ppStru
1c410 63 74 3b 0a 20 20 46 74 73 35 53 74 72 75 63 74  ct;.  Fts5Struct
1c420 75 72 65 4c 65 76 65 6c 20 2a 70 4c 76 6c 20 3d  ureLevel *pLvl =
1c430 20 26 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65   &pStruct->aLeve
1c440 6c 5b 69 4c 76 6c 5d 3b 0a 20 20 46 74 73 35 53  l[iLvl];.  Fts5S
1c450 74 72 75 63 74 75 72 65 4c 65 76 65 6c 20 2a 70  tructureLevel *p
1c460 4c 76 6c 4f 75 74 3b 0a 20 20 46 74 73 35 49 6e  LvlOut;.  Fts5In
1c470 64 65 78 49 74 65 72 20 2a 70 49 74 65 72 20 3d  dexIter *pIter =
1c480 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 49 74 65   0;       /* Ite
1c490 72 61 74 6f 72 20 74 6f 20 72 65 61 64 20 69 6e  rator to read in
1c4a0 70 75 74 20 64 61 74 61 20 2a 2f 0a 20 20 69 6e  put data */.  in
1c4b0 74 20 6e 52 65 6d 20 3d 20 70 6e 52 65 6d 20 3f  t nRem = pnRem ?
1c4c0 20 2a 70 6e 52 65 6d 20 3a 20 30 3b 20 20 2f 2a   *pnRem : 0;  /*
1c4d0 20 4f 75 74 70 75 74 20 6c 65 61 66 20 70 61 67   Output leaf pag
1c4e0 65 73 20 6c 65 66 74 20 74 6f 20 77 72 69 74 65  es left to write
1c4f0 20 2a 2f 0a 20 20 69 6e 74 20 6e 49 6e 70 75 74   */.  int nInput
1c500 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1c510 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
1c520 6f 66 20 69 6e 70 75 74 20 73 65 67 6d 65 6e 74  of input segment
1c530 73 20 2a 2f 0a 20 20 46 74 73 35 53 65 67 57 72  s */.  Fts5SegWr
1c540 69 74 65 72 20 77 72 69 74 65 72 3b 20 20 20 20  iter writer;    
1c550 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 72         /* Writer
1c560 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 46 74 73   object */.  Fts
1c570 35 53 74 72 75 63 74 75 72 65 53 65 67 6d 65 6e  5StructureSegmen
1c580 74 20 2a 70 53 65 67 3b 20 20 20 20 20 2f 2a 20  t *pSeg;     /* 
1c590 4f 75 74 70 75 74 20 73 65 67 6d 65 6e 74 20 2a  Output segment *
1c5a0 2f 0a 20 20 46 74 73 35 42 75 66 66 65 72 20 74  /.  Fts5Buffer t
1c5b0 65 72 6d 3b 0a 20 20 69 6e 74 20 62 4f 6c 64 65  erm;.  int bOlde
1c5c0 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  st;             
1c5d0 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
1c5e0 66 20 74 68 65 20 6f 75 74 70 75 74 20 73 65 67  f the output seg
1c5f0 6d 65 6e 74 20 69 73 20 74 68 65 20 6f 6c 64 65  ment is the olde
1c600 73 74 20 2a 2f 0a 20 20 69 6e 74 20 65 44 65 74  st */.  int eDet
1c610 61 69 6c 20 3d 20 70 2d 3e 70 43 6f 6e 66 69 67  ail = p->pConfig
1c620 2d 3e 65 44 65 74 61 69 6c 3b 0a 0a 20 20 61 73  ->eDetail;..  as
1c630 73 65 72 74 28 20 69 4c 76 6c 3c 70 53 74 72 75  sert( iLvl<pStru
1c640 63 74 2d 3e 6e 4c 65 76 65 6c 20 29 3b 0a 20 20  ct->nLevel );.  
1c650 61 73 73 65 72 74 28 20 70 4c 76 6c 2d 3e 6e 4d  assert( pLvl->nM
1c660 65 72 67 65 3c 3d 70 4c 76 6c 2d 3e 6e 53 65 67  erge<=pLvl->nSeg
1c670 20 29 3b 0a 0a 20 20 6d 65 6d 73 65 74 28 26 77   );..  memset(&w
1c680 72 69 74 65 72 2c 20 30 2c 20 73 69 7a 65 6f 66  riter, 0, sizeof
1c690 28 46 74 73 35 53 65 67 57 72 69 74 65 72 29 29  (Fts5SegWriter))
1c6a0 3b 0a 20 20 6d 65 6d 73 65 74 28 26 74 65 72 6d  ;.  memset(&term
1c6b0 2c 20 30 2c 20 73 69 7a 65 6f 66 28 46 74 73 35  , 0, sizeof(Fts5
1c6c0 42 75 66 66 65 72 29 29 3b 0a 20 20 69 66 28 20  Buffer));.  if( 
1c6d0 70 4c 76 6c 2d 3e 6e 4d 65 72 67 65 20 29 7b 0a  pLvl->nMerge ){.
1c6e0 20 20 20 20 70 4c 76 6c 4f 75 74 20 3d 20 26 70      pLvlOut = &p
1c6f0 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69  Struct->aLevel[i
1c700 4c 76 6c 2b 31 5d 3b 0a 20 20 20 20 61 73 73 65  Lvl+1];.    asse
1c710 72 74 28 20 70 4c 76 6c 4f 75 74 2d 3e 6e 53 65  rt( pLvlOut->nSe
1c720 67 3e 30 20 29 3b 0a 20 20 20 20 6e 49 6e 70 75  g>0 );.    nInpu
1c730 74 20 3d 20 70 4c 76 6c 2d 3e 6e 4d 65 72 67 65  t = pLvl->nMerge
1c740 3b 0a 20 20 20 20 70 53 65 67 20 3d 20 26 70 4c  ;.    pSeg = &pL
1c750 76 6c 4f 75 74 2d 3e 61 53 65 67 5b 70 4c 76 6c  vlOut->aSeg[pLvl
1c760 4f 75 74 2d 3e 6e 53 65 67 2d 31 5d 3b 0a 0a 20  Out->nSeg-1];.. 
1c770 20 20 20 66 74 73 35 57 72 69 74 65 49 6e 69 74     fts5WriteInit
1c780 28 70 2c 20 26 77 72 69 74 65 72 2c 20 70 53 65  (p, &writer, pSe
1c790 67 2d 3e 69 53 65 67 69 64 29 3b 0a 20 20 20 20  g->iSegid);.    
1c7a0 77 72 69 74 65 72 2e 77 72 69 74 65 72 2e 70 67  writer.writer.pg
1c7b0 6e 6f 20 3d 20 70 53 65 67 2d 3e 70 67 6e 6f 4c  no = pSeg->pgnoL
1c7c0 61 73 74 2b 31 3b 0a 20 20 20 20 77 72 69 74 65  ast+1;.    write
1c7d0 72 2e 69 42 74 50 61 67 65 20 3d 20 30 3b 0a 20  r.iBtPage = 0;. 
1c7e0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20   }else{.    int 
1c7f0 69 53 65 67 69 64 20 3d 20 66 74 73 35 41 6c 6c  iSegid = fts5All
1c800 6f 63 61 74 65 53 65 67 69 64 28 70 2c 20 70 53  ocateSegid(p, pS
1c810 74 72 75 63 74 29 3b 0a 0a 20 20 20 20 2f 2a 20  truct);..    /* 
1c820 45 78 74 65 6e 64 20 74 68 65 20 46 74 73 35 53  Extend the Fts5S
1c830 74 72 75 63 74 75 72 65 20 6f 62 6a 65 63 74 20  tructure object 
1c840 61 73 20 72 65 71 75 69 72 65 64 20 74 6f 20 65  as required to e
1c850 6e 73 75 72 65 20 74 68 65 20 6f 75 74 70 75 74  nsure the output
1c860 0a 20 20 20 20 2a 2a 20 73 65 67 6d 65 6e 74 20  .    ** segment 
1c870 65 78 69 73 74 73 2e 20 2a 2f 0a 20 20 20 20 69  exists. */.    i
1c880 66 28 20 69 4c 76 6c 3d 3d 70 53 74 72 75 63 74  f( iLvl==pStruct
1c890 2d 3e 6e 4c 65 76 65 6c 2d 31 20 29 7b 0a 20 20  ->nLevel-1 ){.  
1c8a0 20 20 20 20 66 74 73 35 53 74 72 75 63 74 75 72      fts5Structur
1c8b0 65 41 64 64 4c 65 76 65 6c 28 26 70 2d 3e 72 63  eAddLevel(&p->rc
1c8c0 2c 20 70 70 53 74 72 75 63 74 29 3b 0a 20 20 20  , ppStruct);.   
1c8d0 20 20 20 70 53 74 72 75 63 74 20 3d 20 2a 70 70     pStruct = *pp
1c8e0 53 74 72 75 63 74 3b 0a 20 20 20 20 7d 0a 20 20  Struct;.    }.  
1c8f0 20 20 66 74 73 35 53 74 72 75 63 74 75 72 65 45    fts5StructureE
1c900 78 74 65 6e 64 4c 65 76 65 6c 28 26 70 2d 3e 72  xtendLevel(&p->r
1c910 63 2c 20 70 53 74 72 75 63 74 2c 20 69 4c 76 6c  c, pStruct, iLvl
1c920 2b 31 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 69  +1, 1, 0);.    i
1c930 66 28 20 70 2d 3e 72 63 20 29 20 72 65 74 75 72  f( p->rc ) retur
1c940 6e 3b 0a 20 20 20 20 70 4c 76 6c 20 3d 20 26 70  n;.    pLvl = &p
1c950 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69  Struct->aLevel[i
1c960 4c 76 6c 5d 3b 0a 20 20 20 20 70 4c 76 6c 4f 75  Lvl];.    pLvlOu
1c970 74 20 3d 20 26 70 53 74 72 75 63 74 2d 3e 61 4c  t = &pStruct->aL
1c980 65 76 65 6c 5b 69 4c 76 6c 2b 31 5d 3b 0a 0a 20  evel[iLvl+1];.. 
1c990 20 20 20 66 74 73 35 57 72 69 74 65 49 6e 69 74     fts5WriteInit
1c9a0 28 70 2c 20 26 77 72 69 74 65 72 2c 20 69 53 65  (p, &writer, iSe
1c9b0 67 69 64 29 3b 0a 0a 20 20 20 20 2f 2a 20 41 64  gid);..    /* Ad
1c9c0 64 20 74 68 65 20 6e 65 77 20 73 65 67 6d 65 6e  d the new segmen
1c9d0 74 20 74 6f 20 74 68 65 20 6f 75 74 70 75 74 20  t to the output 
1c9e0 6c 65 76 65 6c 20 2a 2f 0a 20 20 20 20 70 53 65  level */.    pSe
1c9f0 67 20 3d 20 26 70 4c 76 6c 4f 75 74 2d 3e 61 53  g = &pLvlOut->aS
1ca00 65 67 5b 70 4c 76 6c 4f 75 74 2d 3e 6e 53 65 67  eg[pLvlOut->nSeg
1ca10 5d 3b 0a 20 20 20 20 70 4c 76 6c 4f 75 74 2d 3e  ];.    pLvlOut->
1ca20 6e 53 65 67 2b 2b 3b 0a 20 20 20 20 70 53 65 67  nSeg++;.    pSeg
1ca30 2d 3e 70 67 6e 6f 46 69 72 73 74 20 3d 20 31 3b  ->pgnoFirst = 1;
1ca40 0a 20 20 20 20 70 53 65 67 2d 3e 69 53 65 67 69  .    pSeg->iSegi
1ca50 64 20 3d 20 69 53 65 67 69 64 3b 0a 20 20 20 20  d = iSegid;.    
1ca60 70 53 74 72 75 63 74 2d 3e 6e 53 65 67 6d 65 6e  pStruct->nSegmen
1ca70 74 2b 2b 3b 0a 0a 20 20 20 20 2f 2a 20 52 65 61  t++;..    /* Rea
1ca80 64 20 69 6e 70 75 74 20 66 72 6f 6d 20 61 6c 6c  d input from all
1ca90 20 73 65 67 6d 65 6e 74 73 20 69 6e 20 74 68 65   segments in the
1caa0 20 69 6e 70 75 74 20 6c 65 76 65 6c 20 2a 2f 0a   input level */.
1cab0 20 20 20 20 6e 49 6e 70 75 74 20 3d 20 70 4c 76      nInput = pLv
1cac0 6c 2d 3e 6e 53 65 67 3b 0a 20 20 7d 0a 20 20 62  l->nSeg;.  }.  b
1cad0 4f 6c 64 65 73 74 20 3d 20 28 70 4c 76 6c 4f 75  Oldest = (pLvlOu
1cae0 74 2d 3e 6e 53 65 67 3d 3d 31 20 26 26 20 70 53  t->nSeg==1 && pS
1caf0 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 3d 3d 69  truct->nLevel==i
1cb00 4c 76 6c 2b 32 29 3b 0a 0a 20 20 61 73 73 65 72  Lvl+2);..  asser
1cb10 74 28 20 69 4c 76 6c 3e 3d 30 20 29 3b 0a 20 20  t( iLvl>=0 );.  
1cb20 66 6f 72 28 66 74 73 35 4d 75 6c 74 69 49 74 65  for(fts5MultiIte
1cb30 72 4e 65 77 28 70 2c 20 70 53 74 72 75 63 74 2c  rNew(p, pStruct,
1cb40 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 69 4c 76   0, 0, 0, 0, iLv
1cb50 6c 2c 20 6e 49 6e 70 75 74 2c 20 26 70 49 74 65  l, nInput, &pIte
1cb60 72 29 3b 0a 20 20 20 20 20 20 66 74 73 35 4d 75  r);.      fts5Mu
1cb70 6c 74 69 49 74 65 72 45 6f 66 28 70 2c 20 70 49  ltiIterEof(p, pI
1cb80 74 65 72 29 3d 3d 30 3b 0a 20 20 20 20 20 20 66  ter)==0;.      f
1cb90 74 73 35 4d 75 6c 74 69 49 74 65 72 4e 65 78 74  ts5MultiIterNext
1cba0 28 70 2c 20 70 49 74 65 72 2c 20 30 2c 20 30 29  (p, pIter, 0, 0)
1cbb0 0a 20 20 29 7b 0a 20 20 20 20 46 74 73 35 53 65  .  ){.    Fts5Se
1cbc0 67 49 74 65 72 20 2a 70 53 65 67 49 74 65 72 20  gIter *pSegIter 
1cbd0 3d 20 26 70 49 74 65 72 2d 3e 61 53 65 67 5b 20  = &pIter->aSeg[ 
1cbe0 70 49 74 65 72 2d 3e 61 46 69 72 73 74 5b 31 5d  pIter->aFirst[1]
1cbf0 2e 69 46 69 72 73 74 20 5d 3b 0a 20 20 20 20 69  .iFirst ];.    i
1cc00 6e 74 20 6e 50 6f 73 3b 20 20 20 20 20 20 20 20  nt nPos;        
1cc10 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1cc20 70 6f 73 69 74 69 6f 6e 2d 6c 69 73 74 20 73 69  position-list si
1cc30 7a 65 20 66 69 65 6c 64 20 76 61 6c 75 65 20 2a  ze field value *
1cc40 2f 0a 20 20 20 20 69 6e 74 20 6e 54 65 72 6d 3b  /.    int nTerm;
1cc50 0a 20 20 20 20 63 6f 6e 73 74 20 75 38 20 2a 70  .    const u8 *p
1cc60 54 65 72 6d 3b 0a 0a 20 20 20 20 2f 2a 20 43 68  Term;..    /* Ch
1cc70 65 63 6b 20 66 6f 72 20 6b 65 79 20 61 6e 6e 69  eck for key anni
1cc80 68 69 6c 61 74 69 6f 6e 2e 20 2a 2f 0a 20 20 20  hilation. */.   
1cc90 20 69 66 28 20 70 53 65 67 49 74 65 72 2d 3e 6e   if( pSegIter->n
1cca0 50 6f 73 3d 3d 30 20 26 26 20 28 62 4f 6c 64 65  Pos==0 && (bOlde
1ccb0 73 74 20 7c 7c 20 70 53 65 67 49 74 65 72 2d 3e  st || pSegIter->
1ccc0 62 44 65 6c 3d 3d 30 29 20 29 20 63 6f 6e 74 69  bDel==0) ) conti
1ccd0 6e 75 65 3b 0a 0a 20 20 20 20 70 54 65 72 6d 20  nue;..    pTerm 
1cce0 3d 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 54  = fts5MultiIterT
1ccf0 65 72 6d 28 70 49 74 65 72 2c 20 26 6e 54 65 72  erm(pIter, &nTer
1cd00 6d 29 3b 0a 20 20 20 20 69 66 28 20 6e 54 65 72  m);.    if( nTer
1cd10 6d 21 3d 74 65 72 6d 2e 6e 20 7c 7c 20 6d 65 6d  m!=term.n || mem
1cd20 63 6d 70 28 70 54 65 72 6d 2c 20 74 65 72 6d 2e  cmp(pTerm, term.
1cd30 70 2c 20 6e 54 65 72 6d 29 20 29 7b 0a 20 20 20  p, nTerm) ){.   
1cd40 20 20 20 69 66 28 20 70 6e 52 65 6d 20 26 26 20     if( pnRem && 
1cd50 77 72 69 74 65 72 2e 6e 4c 65 61 66 57 72 69 74  writer.nLeafWrit
1cd60 74 65 6e 3e 6e 52 65 6d 20 29 7b 0a 20 20 20 20  ten>nRem ){.    
1cd70 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
1cd80 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 54 68 69   }..      /* Thi
1cd90 73 20 69 73 20 61 20 6e 65 77 20 74 65 72 6d 2e  s is a new term.
1cda0 20 41 70 70 65 6e 64 20 61 20 74 65 72 6d 20 74   Append a term t
1cdb0 6f 20 74 68 65 20 6f 75 74 70 75 74 20 73 65 67  o the output seg
1cdc0 6d 65 6e 74 2e 20 2a 2f 0a 20 20 20 20 20 20 66  ment. */.      f
1cdd0 74 73 35 57 72 69 74 65 41 70 70 65 6e 64 54 65  ts5WriteAppendTe
1cde0 72 6d 28 70 2c 20 26 77 72 69 74 65 72 2c 20 6e  rm(p, &writer, n
1cdf0 54 65 72 6d 2c 20 70 54 65 72 6d 29 3b 0a 20 20  Term, pTerm);.  
1ce00 20 20 20 20 66 74 73 35 42 75 66 66 65 72 53 65      fts5BufferSe
1ce10 74 28 26 70 2d 3e 72 63 2c 20 26 74 65 72 6d 2c  t(&p->rc, &term,
1ce20 20 6e 54 65 72 6d 2c 20 70 54 65 72 6d 29 3b 0a   nTerm, pTerm);.
1ce30 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 70      }..    /* Ap
1ce40 70 65 6e 64 20 74 68 65 20 72 6f 77 69 64 20 74  pend the rowid t
1ce50 6f 20 74 68 65 20 6f 75 74 70 75 74 20 2a 2f 0a  o the output */.
1ce60 20 20 20 20 2f 2a 20 57 52 49 54 45 50 4f 53 4c      /* WRITEPOSL
1ce70 49 53 54 53 49 5a 45 20 2a 2f 0a 20 20 20 20 66  ISTSIZE */.    f
1ce80 74 73 35 57 72 69 74 65 41 70 70 65 6e 64 52 6f  ts5WriteAppendRo
1ce90 77 69 64 28 70 2c 20 26 77 72 69 74 65 72 2c 20  wid(p, &writer, 
1cea0 66 74 73 35 4d 75 6c 74 69 49 74 65 72 52 6f 77  fts5MultiIterRow
1ceb0 69 64 28 70 49 74 65 72 29 29 3b 0a 0a 20 20 20  id(pIter));..   
1cec0 20 69 66 28 20 65 44 65 74 61 69 6c 3d 3d 46 54   if( eDetail==FT
1ced0 53 35 5f 44 45 54 41 49 4c 5f 4e 4f 4e 45 20 29  S5_DETAIL_NONE )
1cee0 7b 0a 20 20 20 20 20 20 69 66 28 20 70 53 65 67  {.      if( pSeg
1cef0 49 74 65 72 2d 3e 62 44 65 6c 20 29 7b 0a 20 20  Iter->bDel ){.  
1cf00 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72        fts5Buffer
1cf10 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26 70 2d  AppendVarint(&p-
1cf20 3e 72 63 2c 20 26 77 72 69 74 65 72 2e 77 72 69  >rc, &writer.wri
1cf30 74 65 72 2e 62 75 66 2c 20 30 29 3b 0a 20 20 20  ter.buf, 0);.   
1cf40 20 20 20 20 20 69 66 28 20 70 53 65 67 49 74 65       if( pSegIte
1cf50 72 2d 3e 6e 50 6f 73 3e 30 20 29 7b 0a 20 20 20  r->nPos>0 ){.   
1cf60 20 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65         fts5Buffe
1cf70 72 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26 70  rAppendVarint(&p
1cf80 2d 3e 72 63 2c 20 26 77 72 69 74 65 72 2e 77 72  ->rc, &writer.wr
1cf90 69 74 65 72 2e 62 75 66 2c 20 30 29 3b 0a 20 20  iter.buf, 0);.  
1cfa0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
1cfb0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1cfc0 20 2f 2a 20 41 70 70 65 6e 64 20 74 68 65 20 70   /* Append the p
1cfd0 6f 73 69 74 69 6f 6e 2d 6c 69 73 74 20 64 61 74  osition-list dat
1cfe0 61 20 74 6f 20 74 68 65 20 6f 75 74 70 75 74 20  a to the output 
1cff0 2a 2f 0a 20 20 20 20 20 20 6e 50 6f 73 20 3d 20  */.      nPos = 
1d000 70 53 65 67 49 74 65 72 2d 3e 6e 50 6f 73 2a 32  pSegIter->nPos*2
1d010 20 2b 20 70 53 65 67 49 74 65 72 2d 3e 62 44 65   + pSegIter->bDe
1d020 6c 3b 0a 20 20 20 20 20 20 66 74 73 35 42 75 66  l;.      fts5Buf
1d030 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e 74 28  ferAppendVarint(
1d040 26 70 2d 3e 72 63 2c 20 26 77 72 69 74 65 72 2e  &p->rc, &writer.
1d050 77 72 69 74 65 72 2e 62 75 66 2c 20 6e 50 6f 73  writer.buf, nPos
1d060 29 3b 0a 20 20 20 20 20 20 66 74 73 35 43 68 75  );.      fts5Chu
1d070 6e 6b 49 74 65 72 61 74 65 28 70 2c 20 70 53 65  nkIterate(p, pSe
1d080 67 49 74 65 72 2c 20 28 76 6f 69 64 2a 29 26 77  gIter, (void*)&w
1d090 72 69 74 65 72 2c 20 66 74 73 35 4d 65 72 67 65  riter, fts5Merge
1d0a0 43 68 75 6e 6b 43 61 6c 6c 62 61 63 6b 29 3b 0a  ChunkCallback);.
1d0b0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
1d0c0 46 6c 75 73 68 20 74 68 65 20 6c 61 73 74 20 6c  Flush the last l
1d0d0 65 61 66 20 70 61 67 65 20 74 6f 20 64 69 73 6b  eaf page to disk
1d0e0 2e 20 53 65 74 20 74 68 65 20 6f 75 74 70 75 74  . Set the output
1d0f0 20 73 65 67 6d 65 6e 74 20 62 2d 74 72 65 65 20   segment b-tree 
1d100 68 65 69 67 68 74 0a 20 20 2a 2a 20 61 6e 64 20  height.  ** and 
1d110 6c 61 73 74 20 6c 65 61 66 20 70 61 67 65 20 6e  last leaf page n
1d120 75 6d 62 65 72 20 61 74 20 74 68 65 20 73 61 6d  umber at the sam
1d130 65 20 74 69 6d 65 2e 20 20 2a 2f 0a 20 20 66 74  e time.  */.  ft
1d140 73 35 57 72 69 74 65 46 69 6e 69 73 68 28 70 2c  s5WriteFinish(p,
1d150 20 26 77 72 69 74 65 72 2c 20 26 70 53 65 67 2d   &writer, &pSeg-
1d160 3e 70 67 6e 6f 4c 61 73 74 29 3b 0a 0a 20 20 69  >pgnoLast);..  i
1d170 66 28 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72  f( fts5MultiIter
1d180 45 6f 66 28 70 2c 20 70 49 74 65 72 29 20 29 7b  Eof(p, pIter) ){
1d190 0a 20 20 20 20 69 6e 74 20 69 3b 0a 0a 20 20 20  .    int i;..   
1d1a0 20 2f 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 72   /* Remove the r
1d1b0 65 64 75 6e 64 61 6e 74 20 73 65 67 6d 65 6e 74  edundant segment
1d1c0 73 20 66 72 6f 6d 20 74 68 65 20 25 5f 64 61 74  s from the %_dat
1d1d0 61 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 66  a table */.    f
1d1e0 6f 72 28 69 3d 30 3b 20 69 3c 6e 49 6e 70 75 74  or(i=0; i<nInput
1d1f0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 66 74  ; i++){.      ft
1d200 73 35 44 61 74 61 52 65 6d 6f 76 65 53 65 67 6d  s5DataRemoveSegm
1d210 65 6e 74 28 70 2c 20 70 4c 76 6c 2d 3e 61 53 65  ent(p, pLvl->aSe
1d220 67 5b 69 5d 2e 69 53 65 67 69 64 29 3b 0a 20 20  g[i].iSegid);.  
1d230 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 65 6d 6f    }..    /* Remo
1d240 76 65 20 74 68 65 20 72 65 64 75 6e 64 61 6e 74  ve the redundant
1d250 20 73 65 67 6d 65 6e 74 73 20 66 72 6f 6d 20 74   segments from t
1d260 68 65 20 69 6e 70 75 74 20 6c 65 76 65 6c 20 2a  he input level *
1d270 2f 0a 20 20 20 20 69 66 28 20 70 4c 76 6c 2d 3e  /.    if( pLvl->
1d280 6e 53 65 67 21 3d 6e 49 6e 70 75 74 20 29 7b 0a  nSeg!=nInput ){.
1d290 20 20 20 20 20 20 69 6e 74 20 6e 4d 6f 76 65 20        int nMove 
1d2a0 3d 20 28 70 4c 76 6c 2d 3e 6e 53 65 67 20 2d 20  = (pLvl->nSeg - 
1d2b0 6e 49 6e 70 75 74 29 20 2a 20 73 69 7a 65 6f 66  nInput) * sizeof
1d2c0 28 46 74 73 35 53 74 72 75 63 74 75 72 65 53 65  (Fts5StructureSe
1d2d0 67 6d 65 6e 74 29 3b 0a 20 20 20 20 20 20 6d 65  gment);.      me
1d2e0 6d 6d 6f 76 65 28 70 4c 76 6c 2d 3e 61 53 65 67  mmove(pLvl->aSeg
1d2f0 2c 20 26 70 4c 76 6c 2d 3e 61 53 65 67 5b 6e 49  , &pLvl->aSeg[nI
1d300 6e 70 75 74 5d 2c 20 6e 4d 6f 76 65 29 3b 0a 20  nput], nMove);. 
1d310 20 20 20 7d 0a 20 20 20 20 70 53 74 72 75 63 74     }.    pStruct
1d320 2d 3e 6e 53 65 67 6d 65 6e 74 20 2d 3d 20 6e 49  ->nSegment -= nI
1d330 6e 70 75 74 3b 0a 20 20 20 20 70 4c 76 6c 2d 3e  nput;.    pLvl->
1d340 6e 53 65 67 20 2d 3d 20 6e 49 6e 70 75 74 3b 0a  nSeg -= nInput;.
1d350 20 20 20 20 70 4c 76 6c 2d 3e 6e 4d 65 72 67 65      pLvl->nMerge
1d360 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 70 53   = 0;.    if( pS
1d370 65 67 2d 3e 70 67 6e 6f 4c 61 73 74 3d 3d 30 20  eg->pgnoLast==0 
1d380 29 7b 0a 20 20 20 20 20 20 70 4c 76 6c 4f 75 74  ){.      pLvlOut
1d390 2d 3e 6e 53 65 67 2d 2d 3b 0a 20 20 20 20 20 20  ->nSeg--;.      
1d3a0 70 53 74 72 75 63 74 2d 3e 6e 53 65 67 6d 65 6e  pStruct->nSegmen
1d3b0 74 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  t--;.    }.  }el
1d3c0 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20  se{.    assert( 
1d3d0 70 53 65 67 2d 3e 70 67 6e 6f 4c 61 73 74 3e 30  pSeg->pgnoLast>0
1d3e0 20 29 3b 0a 20 20 20 20 66 74 73 35 54 72 69 6d   );.    fts5Trim
1d3f0 53 65 67 6d 65 6e 74 73 28 70 2c 20 70 49 74 65  Segments(p, pIte
1d400 72 29 3b 0a 20 20 20 20 70 4c 76 6c 2d 3e 6e 4d  r);.    pLvl->nM
1d410 65 72 67 65 20 3d 20 6e 49 6e 70 75 74 3b 0a 20  erge = nInput;. 
1d420 20 7d 0a 0a 20 20 66 74 73 35 4d 75 6c 74 69 49   }..  fts5MultiI
1d430 74 65 72 46 72 65 65 28 70 2c 20 70 49 74 65 72  terFree(p, pIter
1d440 29 3b 0a 20 20 66 74 73 35 42 75 66 66 65 72 46  );.  fts5BufferF
1d450 72 65 65 28 26 74 65 72 6d 29 3b 0a 20 20 69 66  ree(&term);.  if
1d460 28 20 70 6e 52 65 6d 20 29 20 2a 70 6e 52 65 6d  ( pnRem ) *pnRem
1d470 20 2d 3d 20 77 72 69 74 65 72 2e 6e 4c 65 61 66   -= writer.nLeaf
1d480 57 72 69 74 74 65 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a  Written;.}../*.*
1d490 2a 20 44 6f 20 75 70 20 74 6f 20 6e 50 67 20 70  * Do up to nPg p
1d4a0 61 67 65 73 20 6f 66 20 61 75 74 6f 6d 65 72 67  ages of automerg
1d4b0 65 20 77 6f 72 6b 20 6f 6e 20 74 68 65 20 69 6e  e work on the in
1d4c0 64 65 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  dex..*/.static v
1d4d0 6f 69 64 20 66 74 73 35 49 6e 64 65 78 4d 65 72  oid fts5IndexMer
1d4e0 67 65 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20  ge(.  Fts5Index 
1d4f0 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  *p,             
1d500 20 20 20 20 20 20 2f 2a 20 46 54 53 35 20 62 61        /* FTS5 ba
1d510 63 6b 65 6e 64 20 6f 62 6a 65 63 74 20 2a 2f 0a  ckend object */.
1d520 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65 20    Fts5Structure 
1d530 2a 2a 70 70 53 74 72 75 63 74 2c 20 20 20 20 20  **ppStruct,     
1d540 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 43 75 72    /* IN/OUT: Cur
1d550 72 65 6e 74 20 73 74 72 75 63 74 75 72 65 20 6f  rent structure o
1d560 66 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74  f index */.  int
1d570 20 6e 50 67 20 20 20 20 20 20 20 20 20 20 20 20   nPg            
1d580 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1d590 50 61 67 65 73 20 6f 66 20 77 6f 72 6b 20 74 6f  Pages of work to
1d5a0 20 64 6f 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20   do */.){.  int 
1d5b0 6e 52 65 6d 20 3d 20 6e 50 67 3b 0a 20 20 46 74  nRem = nPg;.  Ft
1d5c0 73 35 53 74 72 75 63 74 75 72 65 20 2a 70 53 74  s5Structure *pSt
1d5d0 72 75 63 74 20 3d 20 2a 70 70 53 74 72 75 63 74  ruct = *ppStruct
1d5e0 3b 0a 20 20 77 68 69 6c 65 28 20 6e 52 65 6d 3e  ;.  while( nRem>
1d5f0 30 20 26 26 20 70 2d 3e 72 63 3d 3d 53 51 4c 49  0 && p->rc==SQLI
1d600 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 6e 74  TE_OK ){.    int
1d610 20 69 4c 76 6c 3b 20 20 20 20 20 20 20 20 20 20   iLvl;          
1d620 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 20 69           /* To i
1d630 74 65 72 61 74 65 20 74 68 72 6f 75 67 68 20 6c  terate through l
1d640 65 76 65 6c 73 20 2a 2f 0a 20 20 20 20 69 6e 74  evels */.    int
1d650 20 69 42 65 73 74 4c 76 6c 20 3d 20 30 3b 20 20   iBestLvl = 0;  
1d660 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 76 65           /* Leve
1d670 6c 20 6f 66 66 65 72 69 6e 67 20 74 68 65 20 6d  l offering the m
1d680 6f 73 74 20 69 6e 70 75 74 20 73 65 67 6d 65 6e  ost input segmen
1d690 74 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 42  ts */.    int nB
1d6a0 65 73 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20  est = 0;        
1d6b0 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
1d6c0 6f 66 20 69 6e 70 75 74 20 73 65 67 6d 65 6e 74  of input segment
1d6d0 73 20 6f 6e 20 62 65 73 74 20 6c 65 76 65 6c 20  s on best level 
1d6e0 2a 2f 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20 69  */..    /* Set i
1d6f0 42 65 73 74 4c 76 6c 20 74 6f 20 74 68 65 20 6c  BestLvl to the l
1d700 65 76 65 6c 20 74 6f 20 72 65 61 64 20 69 6e 70  evel to read inp
1d710 75 74 20 73 65 67 6d 65 6e 74 73 20 66 72 6f 6d  ut segments from
1d720 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28  . */.    assert(
1d730 20 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c   pStruct->nLevel
1d740 3e 30 20 29 3b 0a 20 20 20 20 66 6f 72 28 69 4c  >0 );.    for(iL
1d750 76 6c 3d 30 3b 20 69 4c 76 6c 3c 70 53 74 72 75  vl=0; iLvl<pStru
1d760 63 74 2d 3e 6e 4c 65 76 65 6c 3b 20 69 4c 76 6c  ct->nLevel; iLvl
1d770 2b 2b 29 7b 0a 20 20 20 20 20 20 46 74 73 35 53  ++){.      Fts5S
1d780 74 72 75 63 74 75 72 65 4c 65 76 65 6c 20 2a 70  tructureLevel *p
1d790 4c 76 6c 20 3d 20 26 70 53 74 72 75 63 74 2d 3e  Lvl = &pStruct->
1d7a0 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d 3b 0a 20 20  aLevel[iLvl];.  
1d7b0 20 20 20 20 69 66 28 20 70 4c 76 6c 2d 3e 6e 4d      if( pLvl->nM
1d7c0 65 72 67 65 20 29 7b 0a 20 20 20 20 20 20 20 20  erge ){.        
1d7d0 69 66 28 20 70 4c 76 6c 2d 3e 6e 4d 65 72 67 65  if( pLvl->nMerge
1d7e0 3e 6e 42 65 73 74 20 29 7b 0a 20 20 20 20 20 20  >nBest ){.      
1d7f0 20 20 20 20 69 42 65 73 74 4c 76 6c 20 3d 20 69      iBestLvl = i
1d800 4c 76 6c 3b 0a 20 20 20 20 20 20 20 20 20 20 6e  Lvl;.          n
1d810 42 65 73 74 20 3d 20 70 4c 76 6c 2d 3e 6e 4d 65  Best = pLvl->nMe
1d820 72 67 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  rge;.        }. 
1d830 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
1d840 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
1d850 70 4c 76 6c 2d 3e 6e 53 65 67 3e 6e 42 65 73 74  pLvl->nSeg>nBest
1d860 20 29 7b 0a 20 20 20 20 20 20 20 20 6e 42 65 73   ){.        nBes
1d870 74 20 3d 20 70 4c 76 6c 2d 3e 6e 53 65 67 3b 0a  t = pLvl->nSeg;.
1d880 20 20 20 20 20 20 20 20 69 42 65 73 74 4c 76 6c          iBestLvl
1d890 20 3d 20 69 4c 76 6c 3b 0a 20 20 20 20 20 20 7d   = iLvl;.      }
1d8a0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49  .    }..    /* I
1d8b0 66 20 6e 42 65 73 74 20 69 73 20 73 74 69 6c 6c  f nBest is still
1d8c0 20 30 2c 20 74 68 65 6e 20 74 68 65 20 69 6e 64   0, then the ind
1d8d0 65 78 20 6d 75 73 74 20 62 65 20 65 6d 70 74 79  ex must be empty
1d8e0 2e 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  . */.#ifdef SQLI
1d8f0 54 45 5f 44 45 42 55 47 0a 20 20 20 20 66 6f 72  TE_DEBUG.    for
1d900 28 69 4c 76 6c 3d 30 3b 20 6e 42 65 73 74 3d 3d  (iLvl=0; nBest==
1d910 30 20 26 26 20 69 4c 76 6c 3c 70 53 74 72 75 63  0 && iLvl<pStruc
1d920 74 2d 3e 6e 4c 65 76 65 6c 3b 20 69 4c 76 6c 2b  t->nLevel; iLvl+
1d930 2b 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  +){.      assert
1d940 28 20 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65  ( pStruct->aLeve
1d950 6c 5b 69 4c 76 6c 5d 2e 6e 53 65 67 3d 3d 30 20  l[iLvl].nSeg==0 
1d960 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  );.    }.#endif.
1d970 0a 20 20 20 20 69 66 28 20 6e 42 65 73 74 3c 70  .    if( nBest<p
1d980 2d 3e 70 43 6f 6e 66 69 67 2d 3e 6e 41 75 74 6f  ->pConfig->nAuto
1d990 6d 65 72 67 65 20 0a 20 20 20 20 20 20 20 20 26  merge .        &
1d9a0 26 20 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65  & pStruct->aLeve
1d9b0 6c 5b 69 42 65 73 74 4c 76 6c 5d 2e 6e 4d 65 72  l[iBestLvl].nMer
1d9c0 67 65 3d 3d 30 20 0a 20 20 20 20 20 20 29 7b 0a  ge==0 .      ){.
1d9d0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1d9e0 20 7d 0a 20 20 20 20 66 74 73 35 49 6e 64 65 78   }.    fts5Index
1d9f0 4d 65 72 67 65 4c 65 76 65 6c 28 70 2c 20 26 70  MergeLevel(p, &p
1da00 53 74 72 75 63 74 2c 20 69 42 65 73 74 4c 76 6c  Struct, iBestLvl
1da10 2c 20 26 6e 52 65 6d 29 3b 0a 20 20 20 20 69 66  , &nRem);.    if
1da20 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
1da30 4f 4b 20 26 26 20 70 53 74 72 75 63 74 2d 3e 61  OK && pStruct->a
1da40 4c 65 76 65 6c 5b 69 42 65 73 74 4c 76 6c 5d 2e  Level[iBestLvl].
1da50 6e 4d 65 72 67 65 3d 3d 30 20 29 7b 0a 20 20 20  nMerge==0 ){.   
1da60 20 20 20 66 74 73 35 53 74 72 75 63 74 75 72 65     fts5Structure
1da70 50 72 6f 6d 6f 74 65 28 70 2c 20 69 42 65 73 74  Promote(p, iBest
1da80 4c 76 6c 2b 31 2c 20 70 53 74 72 75 63 74 29 3b  Lvl+1, pStruct);
1da90 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2a 70 70  .    }.  }.  *pp
1daa0 53 74 72 75 63 74 20 3d 20 70 53 74 72 75 63 74  Struct = pStruct
1dab0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 74 6f 74  ;.}../*.** A tot
1dac0 61 6c 20 6f 66 20 6e 4c 65 61 66 20 6c 65 61 66  al of nLeaf leaf
1dad0 20 70 61 67 65 73 20 6f 66 20 64 61 74 61 20 68   pages of data h
1dae0 61 73 20 6a 75 73 74 20 62 65 65 6e 20 66 6c 75  as just been flu
1daf0 73 68 65 64 20 74 6f 20 61 20 6c 65 76 65 6c 2d  shed to a level-
1db00 30 0a 2a 2a 20 73 65 67 6d 65 6e 74 2e 20 54 68  0.** segment. Th
1db10 69 73 20 66 75 6e 63 74 69 6f 6e 20 75 70 64 61  is function upda
1db20 74 65 73 20 74 68 65 20 77 72 69 74 65 2d 63 6f  tes the write-co
1db30 75 6e 74 65 72 20 61 63 63 6f 72 64 69 6e 67 6c  unter accordingl
1db40 79 20 61 6e 64 2c 20 69 66 0a 2a 2a 20 6e 65 63  y and, if.** nec
1db50 65 73 73 61 72 79 2c 20 70 65 72 66 6f 72 6d 73  essary, performs
1db60 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 6d 65 72   incremental mer
1db70 67 65 20 77 6f 72 6b 2e 0a 2a 2a 0a 2a 2a 20 49  ge work..**.** I
1db80 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
1db90 73 2c 20 73 65 74 20 74 68 65 20 46 74 73 35 49  s, set the Fts5I
1dba0 6e 64 65 78 2e 72 63 20 65 72 72 6f 72 20 63 6f  ndex.rc error co
1dbb0 64 65 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20  de. If an error 
1dbc0 68 61 73 20 0a 2a 2a 20 61 6c 72 65 61 64 79 20  has .** already 
1dbd0 6f 63 63 75 72 72 65 64 2c 20 74 68 69 73 20 66  occurred, this f
1dbe0 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d  unction is a no-
1dbf0 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  op..*/.static vo
1dc00 69 64 20 66 74 73 35 49 6e 64 65 78 41 75 74 6f  id fts5IndexAuto
1dc10 6d 65 72 67 65 28 0a 20 20 46 74 73 35 49 6e 64  merge(.  Fts5Ind
1dc20 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  ex *p,          
1dc30 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53 35           /* FTS5
1dc40 20 62 61 63 6b 65 6e 64 20 6f 62 6a 65 63 74 20   backend object 
1dc50 2a 2f 0a 20 20 46 74 73 35 53 74 72 75 63 74 75  */.  Fts5Structu
1dc60 72 65 20 2a 2a 70 70 53 74 72 75 63 74 2c 20 20  re **ppStruct,  
1dc70 20 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20       /* IN/OUT: 
1dc80 43 75 72 72 65 6e 74 20 73 74 72 75 63 74 75 72  Current structur
1dc90 65 20 6f 66 20 69 6e 64 65 78 20 2a 2f 0a 20 20  e of index */.  
1dca0 69 6e 74 20 6e 4c 65 61 66 20 20 20 20 20 20 20  int nLeaf       
1dcb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dcc0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6f 75 74  /* Number of out
1dcd0 70 75 74 20 6c 65 61 76 65 73 20 6a 75 73 74 20  put leaves just 
1dce0 77 72 69 74 74 65 6e 20 2a 2f 0a 29 7b 0a 20 20  written */.){.  
1dcf0 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  if( p->rc==SQLIT
1dd00 45 5f 4f 4b 20 26 26 20 70 2d 3e 70 43 6f 6e 66  E_OK && p->pConf
1dd10 69 67 2d 3e 6e 41 75 74 6f 6d 65 72 67 65 3e 30  ig->nAutomerge>0
1dd20 20 29 7b 0a 20 20 20 20 46 74 73 35 53 74 72 75   ){.    Fts5Stru
1dd30 63 74 75 72 65 20 2a 70 53 74 72 75 63 74 20 3d  cture *pStruct =
1dd40 20 2a 70 70 53 74 72 75 63 74 3b 0a 20 20 20 20   *ppStruct;.    
1dd50 75 36 34 20 6e 57 72 69 74 65 3b 20 20 20 20 20  u64 nWrite;     
1dd60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1dd70 20 49 6e 69 74 69 61 6c 20 76 61 6c 75 65 20 6f   Initial value o
1dd80 66 20 77 72 69 74 65 2d 63 6f 75 6e 74 65 72 20  f write-counter 
1dd90 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 57 6f 72 6b  */.    int nWork
1dda0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1ddb0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
1ddc0 66 20 77 6f 72 6b 2d 71 75 61 6e 74 61 20 74 6f  f work-quanta to
1ddd0 20 70 65 72 66 6f 72 6d 20 2a 2f 0a 20 20 20 20   perform */.    
1dde0 69 6e 74 20 6e 52 65 6d 3b 20 20 20 20 20 20 20  int nRem;       
1ddf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1de00 20 4e 75 6d 62 65 72 20 6f 66 20 6c 65 61 66 20   Number of leaf 
1de10 70 61 67 65 73 20 6c 65 66 74 20 74 6f 20 77 72  pages left to wr
1de20 69 74 65 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 55  ite */..    /* U
1de30 70 64 61 74 65 20 74 68 65 20 77 72 69 74 65 2d  pdate the write-
1de40 63 6f 75 6e 74 65 72 2e 20 57 68 69 6c 65 20 64  counter. While d
1de50 6f 69 6e 67 20 73 6f 2c 20 73 65 74 20 6e 57 6f  oing so, set nWo
1de60 72 6b 2e 20 2a 2f 0a 20 20 20 20 6e 57 72 69 74  rk. */.    nWrit
1de70 65 20 3d 20 70 53 74 72 75 63 74 2d 3e 6e 57 72  e = pStruct->nWr
1de80 69 74 65 43 6f 75 6e 74 65 72 3b 0a 20 20 20 20  iteCounter;.    
1de90 6e 57 6f 72 6b 20 3d 20 28 69 6e 74 29 28 28 28  nWork = (int)(((
1dea0 6e 57 72 69 74 65 20 2b 20 6e 4c 65 61 66 29 20  nWrite + nLeaf) 
1deb0 2f 20 70 2d 3e 6e 57 6f 72 6b 55 6e 69 74 29 20  / p->nWorkUnit) 
1dec0 2d 20 28 6e 57 72 69 74 65 20 2f 20 70 2d 3e 6e  - (nWrite / p->n
1ded0 57 6f 72 6b 55 6e 69 74 29 29 3b 0a 20 20 20 20  WorkUnit));.    
1dee0 70 53 74 72 75 63 74 2d 3e 6e 57 72 69 74 65 43  pStruct->nWriteC
1def0 6f 75 6e 74 65 72 20 2b 3d 20 6e 4c 65 61 66 3b  ounter += nLeaf;
1df00 0a 20 20 20 20 6e 52 65 6d 20 3d 20 28 69 6e 74  .    nRem = (int
1df10 29 28 70 2d 3e 6e 57 6f 72 6b 55 6e 69 74 20 2a  )(p->nWorkUnit *
1df20 20 6e 57 6f 72 6b 20 2a 20 70 53 74 72 75 63 74   nWork * pStruct
1df30 2d 3e 6e 4c 65 76 65 6c 29 3b 0a 0a 20 20 20 20  ->nLevel);..    
1df40 66 74 73 35 49 6e 64 65 78 4d 65 72 67 65 28 70  fts5IndexMerge(p
1df50 2c 20 70 70 53 74 72 75 63 74 2c 20 6e 52 65 6d  , ppStruct, nRem
1df60 29 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63  );.  }.}..static
1df70 20 76 6f 69 64 20 66 74 73 35 49 6e 64 65 78 43   void fts5IndexC
1df80 72 69 73 69 73 6d 65 72 67 65 28 0a 20 20 46 74  risismerge(.  Ft
1df90 73 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20  s5Index *p,     
1dfa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1dfb0 20 46 54 53 35 20 62 61 63 6b 65 6e 64 20 6f 62   FTS5 backend ob
1dfc0 6a 65 63 74 20 2a 2f 0a 20 20 46 74 73 35 53 74  ject */.  Fts5St
1dfd0 72 75 63 74 75 72 65 20 2a 2a 70 70 53 74 72 75  ructure **ppStru
1dfe0 63 74 20 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f  ct        /* IN/
1dff0 4f 55 54 3a 20 43 75 72 72 65 6e 74 20 73 74 72  OUT: Current str
1e000 75 63 74 75 72 65 20 6f 66 20 69 6e 64 65 78 20  ucture of index 
1e010 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 69 6e  */.){.  const in
1e020 74 20 6e 43 72 69 73 69 73 20 3d 20 70 2d 3e 70  t nCrisis = p->p
1e030 43 6f 6e 66 69 67 2d 3e 6e 43 72 69 73 69 73 4d  Config->nCrisisM
1e040 65 72 67 65 3b 0a 20 20 46 74 73 35 53 74 72 75  erge;.  Fts5Stru
1e050 63 74 75 72 65 20 2a 70 53 74 72 75 63 74 20 3d  cture *pStruct =
1e060 20 2a 70 70 53 74 72 75 63 74 3b 0a 20 20 69 6e   *ppStruct;.  in
1e070 74 20 69 4c 76 6c 20 3d 20 30 3b 0a 0a 20 20 61  t iLvl = 0;..  a
1e080 73 73 65 72 74 28 20 70 2d 3e 72 63 21 3d 53 51  ssert( p->rc!=SQ
1e090 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 53 74 72 75  LITE_OK || pStru
1e0a0 63 74 2d 3e 6e 4c 65 76 65 6c 3e 30 20 29 3b 0a  ct->nLevel>0 );.
1e0b0 20 20 77 68 69 6c 65 28 20 70 2d 3e 72 63 3d 3d    while( p->rc==
1e0c0 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 53 74  SQLITE_OK && pSt
1e0d0 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76  ruct->aLevel[iLv
1e0e0 6c 5d 2e 6e 53 65 67 3e 3d 6e 43 72 69 73 69 73  l].nSeg>=nCrisis
1e0f0 20 29 7b 0a 20 20 20 20 66 74 73 35 49 6e 64 65   ){.    fts5Inde
1e100 78 4d 65 72 67 65 4c 65 76 65 6c 28 70 2c 20 26  xMergeLevel(p, &
1e110 70 53 74 72 75 63 74 2c 20 69 4c 76 6c 2c 20 30  pStruct, iLvl, 0
1e120 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
1e130 2d 3e 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc!=SQLITE_OK 
1e140 7c 7c 20 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76  || pStruct->nLev
1e150 65 6c 3e 28 69 4c 76 6c 2b 31 29 20 29 3b 0a 20  el>(iLvl+1) );. 
1e160 20 20 20 66 74 73 35 53 74 72 75 63 74 75 72 65     fts5Structure
1e170 50 72 6f 6d 6f 74 65 28 70 2c 20 69 4c 76 6c 2b  Promote(p, iLvl+
1e180 31 2c 20 70 53 74 72 75 63 74 29 3b 0a 20 20 20  1, pStruct);.   
1e190 20 69 4c 76 6c 2b 2b 3b 0a 20 20 7d 0a 20 20 2a   iLvl++;.  }.  *
1e1a0 70 70 53 74 72 75 63 74 20 3d 20 70 53 74 72 75  ppStruct = pStru
1e1b0 63 74 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e  ct;.}..static in
1e1c0 74 20 66 74 73 35 49 6e 64 65 78 52 65 74 75 72  t fts5IndexRetur
1e1d0 6e 28 46 74 73 35 49 6e 64 65 78 20 2a 70 29 7b  n(Fts5Index *p){
1e1e0 0a 20 20 69 6e 74 20 72 63 20 3d 20 70 2d 3e 72  .  int rc = p->r
1e1f0 63 3b 0a 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c  c;.  p->rc = SQL
1e200 49 54 45 5f 4f 4b 3b 0a 20 20 72 65 74 75 72 6e  ITE_OK;.  return
1e210 20 72 63 3b 0a 7d 0a 0a 74 79 70 65 64 65 66 20   rc;.}..typedef 
1e220 73 74 72 75 63 74 20 46 74 73 35 46 6c 75 73 68  struct Fts5Flush
1e230 43 74 78 20 46 74 73 35 46 6c 75 73 68 43 74 78  Ctx Fts5FlushCtx
1e240 3b 0a 73 74 72 75 63 74 20 46 74 73 35 46 6c 75  ;.struct Fts5Flu
1e250 73 68 43 74 78 20 7b 0a 20 20 46 74 73 35 49 6e  shCtx {.  Fts5In
1e260 64 65 78 20 2a 70 49 64 78 3b 0a 20 20 46 74 73  dex *pIdx;.  Fts
1e270 35 53 65 67 57 72 69 74 65 72 20 77 72 69 74 65  5SegWriter write
1e280 72 3b 20 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 42 75  r; .};../*.** Bu
1e290 66 66 65 72 20 61 42 75 66 5b 5d 20 63 6f 6e 74  ffer aBuf[] cont
1e2a0 61 69 6e 73 20 61 20 6c 69 73 74 20 6f 66 20 76  ains a list of v
1e2b0 61 72 69 6e 74 73 2c 20 61 6c 6c 20 73 6d 61 6c  arints, all smal
1e2c0 6c 20 65 6e 6f 75 67 68 20 74 6f 20 66 69 74 0a  l enough to fit.
1e2d0 2a 2a 20 69 6e 20 61 20 33 32 2d 62 69 74 20 69  ** in a 32-bit i
1e2e0 6e 74 65 67 65 72 2e 20 52 65 74 75 72 6e 20 74  nteger. Return t
1e2f0 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6c  he size of the l
1e300 61 72 67 65 73 74 20 70 72 65 66 69 78 20 6f 66  argest prefix of
1e310 20 74 68 69 73 20 0a 2a 2a 20 6c 69 73 74 20 6e   this .** list n
1e320 4d 61 78 20 62 79 74 65 73 20 6f 72 20 6c 65 73  Max bytes or les
1e330 73 20 69 6e 20 73 69 7a 65 2e 0a 2a 2f 0a 73 74  s in size..*/.st
1e340 61 74 69 63 20 69 6e 74 20 66 74 73 35 50 6f 73  atic int fts5Pos
1e350 6c 69 73 74 50 72 65 66 69 78 28 63 6f 6e 73 74  listPrefix(const
1e360 20 75 38 20 2a 61 42 75 66 2c 20 69 6e 74 20 6e   u8 *aBuf, int n
1e370 4d 61 78 29 7b 0a 20 20 69 6e 74 20 72 65 74 3b  Max){.  int ret;
1e380 0a 20 20 75 33 32 20 64 75 6d 6d 79 3b 0a 20 20  .  u32 dummy;.  
1e390 72 65 74 20 3d 20 66 74 73 35 47 65 74 56 61 72  ret = fts5GetVar
1e3a0 69 6e 74 33 32 28 61 42 75 66 2c 20 64 75 6d 6d  int32(aBuf, dumm
1e3b0 79 29 3b 0a 20 20 69 66 28 20 72 65 74 3c 6e 4d  y);.  if( ret<nM
1e3c0 61 78 20 29 7b 0a 20 20 20 20 77 68 69 6c 65 28  ax ){.    while(
1e3d0 20 31 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20   1 ){.      int 
1e3e0 69 20 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e  i = fts5GetVarin
1e3f0 74 33 32 28 26 61 42 75 66 5b 72 65 74 5d 2c 20  t32(&aBuf[ret], 
1e400 64 75 6d 6d 79 29 3b 0a 20 20 20 20 20 20 69 66  dummy);.      if
1e410 28 20 28 72 65 74 20 2b 20 69 29 20 3e 20 6e 4d  ( (ret + i) > nM
1e420 61 78 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  ax ) break;.    
1e430 20 20 72 65 74 20 2b 3d 20 69 3b 0a 20 20 20 20    ret += i;.    
1e440 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  }.  }.  return r
1e450 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 6c 75  et;.}../*.** Flu
1e460 73 68 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  sh the contents 
1e470 6f 66 20 69 6e 2d 6d 65 6d 6f 72 79 20 68 61 73  of in-memory has
1e480 68 20 74 61 62 6c 65 20 69 48 61 73 68 20 74 6f  h table iHash to
1e490 20 61 20 6e 65 77 20 6c 65 76 65 6c 2d 30 20 0a   a new level-0 .
1e4a0 2a 2a 20 73 65 67 6d 65 6e 74 20 6f 6e 20 64 69  ** segment on di
1e4b0 73 6b 2e 20 41 6c 73 6f 20 75 70 64 61 74 65 20  sk. Also update 
1e4c0 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  the correspondin
1e4d0 67 20 73 74 72 75 63 74 75 72 65 20 72 65 63 6f  g structure reco
1e4e0 72 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  rd..**.** If an 
1e4f0 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 73 65  error occurs, se
1e500 74 20 74 68 65 20 46 74 73 35 49 6e 64 65 78 2e  t the Fts5Index.
1e510 72 63 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 49  rc error code. I
1e520 66 20 61 6e 20 65 72 72 6f 72 20 68 61 73 20 0a  f an error has .
1e530 2a 2a 20 61 6c 72 65 61 64 79 20 6f 63 63 75 72  ** already occur
1e540 72 65 64 2c 20 74 68 69 73 20 66 75 6e 63 74 69  red, this functi
1e550 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a  on is a no-op..*
1e560 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  /.static void ft
1e570 73 35 46 6c 75 73 68 4f 6e 65 48 61 73 68 28 46  s5FlushOneHash(F
1e580 74 73 35 49 6e 64 65 78 20 2a 70 29 7b 0a 20 20  ts5Index *p){.  
1e590 46 74 73 35 48 61 73 68 20 2a 70 48 61 73 68 20  Fts5Hash *pHash 
1e5a0 3d 20 70 2d 3e 70 48 61 73 68 3b 0a 20 20 46 74  = p->pHash;.  Ft
1e5b0 73 35 53 74 72 75 63 74 75 72 65 20 2a 70 53 74  s5Structure *pSt
1e5c0 72 75 63 74 3b 0a 20 20 69 6e 74 20 69 53 65 67  ruct;.  int iSeg
1e5d0 69 64 3b 0a 20 20 69 6e 74 20 70 67 6e 6f 4c 61  id;.  int pgnoLa
1e5e0 73 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  st = 0;         
1e5f0 20 20 20 20 20 20 20 20 2f 2a 20 4c 61 73 74 20          /* Last 
1e600 6c 65 61 66 20 70 61 67 65 20 6e 75 6d 62 65 72  leaf page number
1e610 20 69 6e 20 73 65 67 6d 65 6e 74 20 2a 2f 0a 0a   in segment */..
1e620 20 20 2f 2a 20 4f 62 74 61 69 6e 20 61 20 72 65    /* Obtain a re
1e630 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20 69  ference to the i
1e640 6e 64 65 78 20 73 74 72 75 63 74 75 72 65 20 61  ndex structure a
1e650 6e 64 20 61 6c 6c 6f 63 61 74 65 20 61 20 6e 65  nd allocate a ne
1e660 77 20 73 65 67 6d 65 6e 74 2d 69 64 0a 20 20 2a  w segment-id.  *
1e670 2a 20 66 6f 72 20 74 68 65 20 6e 65 77 20 6c 65  * for the new le
1e680 76 65 6c 2d 30 20 73 65 67 6d 65 6e 74 2e 20 20  vel-0 segment.  
1e690 2a 2f 0a 20 20 70 53 74 72 75 63 74 20 3d 20 66  */.  pStruct = f
1e6a0 74 73 35 53 74 72 75 63 74 75 72 65 52 65 61 64  ts5StructureRead
1e6b0 28 70 29 3b 0a 20 20 69 53 65 67 69 64 20 3d 20  (p);.  iSegid = 
1e6c0 66 74 73 35 41 6c 6c 6f 63 61 74 65 53 65 67 69  fts5AllocateSegi
1e6d0 64 28 70 2c 20 70 53 74 72 75 63 74 29 3b 0a 0a  d(p, pStruct);..
1e6e0 20 20 69 66 28 20 69 53 65 67 69 64 20 29 7b 0a    if( iSegid ){.
1e6f0 20 20 20 20 63 6f 6e 73 74 20 69 6e 74 20 70 67      const int pg
1e700 73 7a 20 3d 20 70 2d 3e 70 43 6f 6e 66 69 67 2d  sz = p->pConfig-
1e710 3e 70 67 73 7a 3b 0a 20 20 20 20 69 6e 74 20 65  >pgsz;.    int e
1e720 44 65 74 61 69 6c 20 3d 20 70 2d 3e 70 43 6f 6e  Detail = p->pCon
1e730 66 69 67 2d 3e 65 44 65 74 61 69 6c 3b 0a 20 20  fig->eDetail;.  
1e740 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65 53    Fts5StructureS
1e750 65 67 6d 65 6e 74 20 2a 70 53 65 67 3b 20 20 20  egment *pSeg;   
1e760 2f 2a 20 4e 65 77 20 73 65 67 6d 65 6e 74 20 77  /* New segment w
1e770 69 74 68 69 6e 20 70 53 74 72 75 63 74 20 2a 2f  ithin pStruct */
1e780 0a 20 20 20 20 46 74 73 35 42 75 66 66 65 72 20  .    Fts5Buffer 
1e790 2a 70 42 75 66 3b 20 20 20 20 20 20 20 20 20 20  *pBuf;          
1e7a0 20 20 20 2f 2a 20 42 75 66 66 65 72 20 69 6e 20     /* Buffer in 
1e7b0 77 68 69 63 68 20 74 6f 20 61 73 73 65 6d 62 6c  which to assembl
1e7c0 65 20 6c 65 61 66 20 70 61 67 65 20 2a 2f 0a 20  e leaf page */. 
1e7d0 20 20 20 46 74 73 35 42 75 66 66 65 72 20 2a 70     Fts5Buffer *p
1e7e0 50 67 69 64 78 3b 20 20 20 20 20 20 20 20 20 20  Pgidx;          
1e7f0 20 2f 2a 20 42 75 66 66 65 72 20 69 6e 20 77 68   /* Buffer in wh
1e800 69 63 68 20 74 6f 20 61 73 73 65 6d 62 6c 65 20  ich to assemble 
1e810 70 67 69 64 78 20 2a 2f 0a 0a 20 20 20 20 46 74  pgidx */..    Ft
1e820 73 35 53 65 67 57 72 69 74 65 72 20 77 72 69 74  s5SegWriter writ
1e830 65 72 3b 0a 20 20 20 20 66 74 73 35 57 72 69 74  er;.    fts5Writ
1e840 65 49 6e 69 74 28 70 2c 20 26 77 72 69 74 65 72  eInit(p, &writer
1e850 2c 20 69 53 65 67 69 64 29 3b 0a 0a 20 20 20 20  , iSegid);..    
1e860 70 42 75 66 20 3d 20 26 77 72 69 74 65 72 2e 77  pBuf = &writer.w
1e870 72 69 74 65 72 2e 62 75 66 3b 0a 20 20 20 20 70  riter.buf;.    p
1e880 50 67 69 64 78 20 3d 20 26 77 72 69 74 65 72 2e  Pgidx = &writer.
1e890 77 72 69 74 65 72 2e 70 67 69 64 78 3b 0a 0a 20  writer.pgidx;.. 
1e8a0 20 20 20 2f 2a 20 66 74 73 35 57 72 69 74 65 49     /* fts5WriteI
1e8b0 6e 69 74 28 29 20 73 68 6f 75 6c 64 20 68 61 76  nit() should hav
1e8c0 65 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 68  e initialized th
1e8d0 65 20 62 75 66 66 65 72 73 20 74 6f 20 28 6d 6f  e buffers to (mo
1e8e0 73 74 20 6c 69 6b 65 6c 79 29 0a 20 20 20 20 2a  st likely).    *
1e8f0 2a 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 73 70  * the maximum sp
1e900 61 63 65 20 72 65 71 75 69 72 65 64 2e 20 2a 2f  ace required. */
1e910 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e  .    assert( p->
1e920 72 63 20 7c 7c 20 70 42 75 66 2d 3e 6e 53 70 61  rc || pBuf->nSpa
1e930 63 65 3e 3d 28 70 67 73 7a 20 2b 20 46 54 53 35  ce>=(pgsz + FTS5
1e940 5f 44 41 54 41 5f 50 41 44 44 49 4e 47 29 20 29  _DATA_PADDING) )
1e950 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d  ;.    assert( p-
1e960 3e 72 63 20 7c 7c 20 70 50 67 69 64 78 2d 3e 6e  >rc || pPgidx->n
1e970 53 70 61 63 65 3e 3d 28 70 67 73 7a 20 2b 20 46  Space>=(pgsz + F
1e980 54 53 35 5f 44 41 54 41 5f 50 41 44 44 49 4e 47  TS5_DATA_PADDING
1e990 29 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 42 65 67  ) );..    /* Beg
1e9a0 69 6e 20 73 63 61 6e 6e 69 6e 67 20 74 68 72 6f  in scanning thro
1e9b0 75 67 68 20 68 61 73 68 20 74 61 62 6c 65 20 65  ugh hash table e
1e9c0 6e 74 72 69 65 73 2e 20 54 68 69 73 20 6c 6f 6f  ntries. This loo
1e9d0 70 20 72 75 6e 73 20 6f 6e 63 65 20 66 6f 72 20  p runs once for 
1e9e0 65 61 63 68 0a 20 20 20 20 2a 2a 20 74 65 72 6d  each.    ** term
1e9f0 2f 64 6f 63 6c 69 73 74 20 63 75 72 72 65 6e 74  /doclist current
1ea00 6c 79 20 73 74 6f 72 65 64 20 77 69 74 68 69 6e  ly stored within
1ea10 20 74 68 65 20 68 61 73 68 20 74 61 62 6c 65 2e   the hash table.
1ea20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e 72   */.    if( p->r
1ea30 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
1ea40 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 73 71        p->rc = sq
1ea50 6c 69 74 65 33 46 74 73 35 48 61 73 68 53 63 61  lite3Fts5HashSca
1ea60 6e 49 6e 69 74 28 70 48 61 73 68 2c 20 30 2c 20  nInit(pHash, 0, 
1ea70 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 77 68  0);.    }.    wh
1ea80 69 6c 65 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49  ile( p->rc==SQLI
1ea90 54 45 5f 4f 4b 20 26 26 20 30 3d 3d 73 71 6c 69  TE_OK && 0==sqli
1eaa0 74 65 33 46 74 73 35 48 61 73 68 53 63 61 6e 45  te3Fts5HashScanE
1eab0 6f 66 28 70 48 61 73 68 29 20 29 7b 0a 20 20 20  of(pHash) ){.   
1eac0 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
1ead0 54 65 72 6d 3b 20 20 20 20 20 20 20 20 20 20 2f  Term;          /
1eae0 2a 20 42 75 66 66 65 72 20 63 6f 6e 74 61 69 6e  * Buffer contain
1eaf0 69 6e 67 20 74 65 72 6d 20 2a 2f 0a 20 20 20 20  ing term */.    
1eb00 20 20 63 6f 6e 73 74 20 75 38 20 2a 70 44 6f 63    const u8 *pDoc
1eb10 6c 69 73 74 3b 20 20 20 20 20 20 20 20 20 2f 2a  list;         /*
1eb20 20 50 6f 69 6e 74 65 72 20 74 6f 20 64 6f 63 6c   Pointer to docl
1eb30 69 73 74 20 66 6f 72 20 74 68 69 73 20 74 65 72  ist for this ter
1eb40 6d 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e  m */.      int n
1eb50 44 6f 63 6c 69 73 74 3b 20 20 20 20 20 20 20 20  Doclist;        
1eb60 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
1eb70 66 20 64 6f 63 6c 69 73 74 20 69 6e 20 62 79 74  f doclist in byt
1eb80 65 73 20 2a 2f 0a 0a 20 20 20 20 20 20 2f 2a 20  es */..      /* 
1eb90 57 72 69 74 65 20 74 68 65 20 74 65 72 6d 20 66  Write the term f
1eba0 6f 72 20 74 68 69 73 20 65 6e 74 72 79 20 74 6f  or this entry to
1ebb0 20 64 69 73 6b 2e 20 2a 2f 0a 20 20 20 20 20 20   disk. */.      
1ebc0 73 71 6c 69 74 65 33 46 74 73 35 48 61 73 68 53  sqlite3Fts5HashS
1ebd0 63 61 6e 45 6e 74 72 79 28 70 48 61 73 68 2c 20  canEntry(pHash, 
1ebe0 26 7a 54 65 72 6d 2c 20 26 70 44 6f 63 6c 69 73  &zTerm, &pDoclis
1ebf0 74 2c 20 26 6e 44 6f 63 6c 69 73 74 29 3b 0a 20  t, &nDoclist);. 
1ec00 20 20 20 20 20 66 74 73 35 57 72 69 74 65 41 70       fts5WriteAp
1ec10 70 65 6e 64 54 65 72 6d 28 70 2c 20 26 77 72 69  pendTerm(p, &wri
1ec20 74 65 72 2c 20 28 69 6e 74 29 73 74 72 6c 65 6e  ter, (int)strlen
1ec30 28 7a 54 65 72 6d 29 2c 20 28 63 6f 6e 73 74 20  (zTerm), (const 
1ec40 75 38 2a 29 7a 54 65 72 6d 29 3b 0a 0a 20 20 20  u8*)zTerm);..   
1ec50 20 20 20 61 73 73 65 72 74 28 20 77 72 69 74 65     assert( write
1ec60 72 2e 62 46 69 72 73 74 52 6f 77 69 64 49 6e 50  r.bFirstRowidInP
1ec70 61 67 65 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  age==0 );.      
1ec80 69 66 28 20 70 67 73 7a 3e 3d 28 70 42 75 66 2d  if( pgsz>=(pBuf-
1ec90 3e 6e 20 2b 20 70 50 67 69 64 78 2d 3e 6e 20 2b  >n + pPgidx->n +
1eca0 20 6e 44 6f 63 6c 69 73 74 20 2b 20 31 29 20 29   nDoclist + 1) )
1ecb0 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  {.        /* The
1ecc0 20 65 6e 74 69 72 65 20 64 6f 63 6c 69 73 74 20   entire doclist 
1ecd0 77 69 6c 6c 20 66 69 74 20 6f 6e 20 74 68 65 20  will fit on the 
1ece0 63 75 72 72 65 6e 74 20 6c 65 61 66 2e 20 2a 2f  current leaf. */
1ecf0 0a 20 20 20 20 20 20 20 20 66 74 73 35 42 75 66  .        fts5Buf
1ed00 66 65 72 53 61 66 65 41 70 70 65 6e 64 42 6c 6f  ferSafeAppendBlo
1ed10 62 28 70 42 75 66 2c 20 70 44 6f 63 6c 69 73 74  b(pBuf, pDoclist
1ed20 2c 20 6e 44 6f 63 6c 69 73 74 29 3b 0a 20 20 20  , nDoclist);.   
1ed30 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1ed40 20 20 69 36 34 20 69 52 6f 77 69 64 20 3d 20 30    i64 iRowid = 0
1ed50 3b 0a 20 20 20 20 20 20 20 20 69 36 34 20 69 44  ;.        i64 iD
1ed60 65 6c 74 61 20 3d 20 30 3b 0a 20 20 20 20 20 20  elta = 0;.      
1ed70 20 20 69 6e 74 20 69 4f 66 66 20 3d 20 30 3b 0a    int iOff = 0;.
1ed80 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  .        /* The 
1ed90 65 6e 74 69 72 65 20 64 6f 63 6c 69 73 74 20 77  entire doclist w
1eda0 69 6c 6c 20 6e 6f 74 20 66 69 74 20 6f 6e 20 74  ill not fit on t
1edb0 68 69 73 20 6c 65 61 66 2e 20 54 68 65 20 66 6f  his leaf. The fo
1edc0 6c 6c 6f 77 69 6e 67 20 0a 20 20 20 20 20 20 20  llowing .       
1edd0 20 2a 2a 20 6c 6f 6f 70 20 69 74 65 72 61 74 65   ** loop iterate
1ede0 73 20 74 68 72 6f 75 67 68 20 74 68 65 20 70 6f  s through the po
1edf0 73 6c 69 73 74 73 20 74 68 61 74 20 6d 61 6b 65  slists that make
1ee00 20 75 70 20 74 68 65 20 63 75 72 72 65 6e 74 20   up the current 
1ee10 0a 20 20 20 20 20 20 20 20 2a 2a 20 64 6f 63 6c  .        ** docl
1ee20 69 73 74 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20  ist.  */.       
1ee30 20 77 68 69 6c 65 28 20 70 2d 3e 72 63 3d 3d 53   while( p->rc==S
1ee40 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 4f 66 66  QLITE_OK && iOff
1ee50 3c 6e 44 6f 63 6c 69 73 74 20 29 7b 0a 20 20 20  <nDoclist ){.   
1ee60 20 20 20 20 20 20 20 69 4f 66 66 20 2b 3d 20 66         iOff += f
1ee70 74 73 35 47 65 74 56 61 72 69 6e 74 28 26 70 44  ts5GetVarint(&pD
1ee80 6f 63 6c 69 73 74 5b 69 4f 66 66 5d 2c 20 28 75  oclist[iOff], (u
1ee90 36 34 2a 29 26 69 44 65 6c 74 61 29 3b 0a 20 20  64*)&iDelta);.  
1eea0 20 20 20 20 20 20 20 20 69 52 6f 77 69 64 20 2b          iRowid +
1eeb0 3d 20 69 44 65 6c 74 61 3b 0a 20 20 20 20 20 20  = iDelta;.      
1eec0 20 20 20 20 0a 20 20 20 20 20 20 20 20 20 20 69      .          i
1eed0 66 28 20 77 72 69 74 65 72 2e 62 46 69 72 73 74  f( writer.bFirst
1eee0 52 6f 77 69 64 49 6e 50 61 67 65 20 29 7b 0a 20  RowidInPage ){. 
1eef0 20 20 20 20 20 20 20 20 20 20 20 66 74 73 35 50             fts5P
1ef00 75 74 55 31 36 28 26 70 42 75 66 2d 3e 70 5b 30  utU16(&pBuf->p[0
1ef10 5d 2c 20 28 75 31 36 29 70 42 75 66 2d 3e 6e 29  ], (u16)pBuf->n)
1ef20 3b 20 20 20 2f 2a 20 66 69 72 73 74 20 72 6f 77  ;   /* first row
1ef30 69 64 20 6f 6e 20 70 61 67 65 20 2a 2f 0a 20 20  id on page */.  
1ef40 20 20 20 20 20 20 20 20 20 20 70 42 75 66 2d 3e            pBuf->
1ef50 6e 20 2b 3d 20 73 71 6c 69 74 65 33 46 74 73 35  n += sqlite3Fts5
1ef60 50 75 74 56 61 72 69 6e 74 28 26 70 42 75 66 2d  PutVarint(&pBuf-
1ef70 3e 70 5b 70 42 75 66 2d 3e 6e 5d 2c 20 69 52 6f  >p[pBuf->n], iRo
1ef80 77 69 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20  wid);.          
1ef90 20 20 77 72 69 74 65 72 2e 62 46 69 72 73 74 52    writer.bFirstR
1efa0 6f 77 69 64 49 6e 50 61 67 65 20 3d 20 30 3b 0a  owidInPage = 0;.
1efb0 20 20 20 20 20 20 20 20 20 20 20 20 66 74 73 35              fts5
1efc0 57 72 69 74 65 44 6c 69 64 78 41 70 70 65 6e 64  WriteDlidxAppend
1efd0 28 70 2c 20 26 77 72 69 74 65 72 2c 20 69 52 6f  (p, &writer, iRo
1efe0 77 69 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20  wid);.          
1eff0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
1f000 20 20 20 70 42 75 66 2d 3e 6e 20 2b 3d 20 73 71     pBuf->n += sq
1f010 6c 69 74 65 33 46 74 73 35 50 75 74 56 61 72 69  lite3Fts5PutVari
1f020 6e 74 28 26 70 42 75 66 2d 3e 70 5b 70 42 75 66  nt(&pBuf->p[pBuf
1f030 2d 3e 6e 5d 2c 20 69 44 65 6c 74 61 29 3b 0a 20  ->n], iDelta);. 
1f040 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
1f050 20 20 20 20 20 61 73 73 65 72 74 28 20 70 42 75       assert( pBu
1f060 66 2d 3e 6e 3c 3d 70 42 75 66 2d 3e 6e 53 70 61  f->n<=pBuf->nSpa
1f070 63 65 20 29 3b 0a 0a 20 20 20 20 20 20 20 20 20  ce );..         
1f080 20 69 66 28 20 65 44 65 74 61 69 6c 3d 3d 46 54   if( eDetail==FT
1f090 53 35 5f 44 45 54 41 49 4c 5f 4e 4f 4e 45 20 29  S5_DETAIL_NONE )
1f0a0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  {.            if
1f0b0 28 20 69 4f 66 66 3c 6e 44 6f 63 6c 69 73 74 20  ( iOff<nDoclist 
1f0c0 26 26 20 70 44 6f 63 6c 69 73 74 5b 69 4f 66 66  && pDoclist[iOff
1f0d0 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  ]==0 ){.        
1f0e0 20 20 20 20 20 20 70 42 75 66 2d 3e 70 5b 70 42        pBuf->p[pB
1f0f0 75 66 2d 3e 6e 2b 2b 5d 20 3d 20 30 3b 0a 20 20  uf->n++] = 0;.  
1f100 20 20 20 20 20 20 20 20 20 20 20 20 69 4f 66 66              iOff
1f110 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ++;.            
1f120 20 20 69 66 28 20 69 4f 66 66 3c 6e 44 6f 63 6c    if( iOff<nDocl
1f130 69 73 74 20 26 26 20 70 44 6f 63 6c 69 73 74 5b  ist && pDoclist[
1f140 69 4f 66 66 5d 3d 3d 30 20 29 7b 0a 20 20 20 20  iOff]==0 ){.    
1f150 20 20 20 20 20 20 20 20 20 20 20 20 70 42 75 66              pBuf
1f160 2d 3e 70 5b 70 42 75 66 2d 3e 6e 2b 2b 5d 20 3d  ->p[pBuf->n++] =
1f170 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   0;.            
1f180 20 20 20 20 69 4f 66 66 2b 2b 3b 0a 20 20 20 20      iOff++;.    
1f190 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
1f1a0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1f1b0 20 20 20 20 20 20 69 66 28 20 28 70 42 75 66 2d        if( (pBuf-
1f1c0 3e 6e 20 2b 20 70 50 67 69 64 78 2d 3e 6e 29 3e  >n + pPgidx->n)>
1f1d0 3d 70 67 73 7a 20 29 7b 0a 20 20 20 20 20 20 20  =pgsz ){.       
1f1e0 20 20 20 20 20 20 20 66 74 73 35 57 72 69 74 65         fts5Write
1f1f0 46 6c 75 73 68 4c 65 61 66 28 70 2c 20 26 77 72  FlushLeaf(p, &wr
1f200 69 74 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20  iter);.         
1f210 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d     }.          }
1f220 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
1f230 20 20 69 6e 74 20 62 44 75 6d 6d 79 3b 0a 20 20    int bDummy;.  
1f240 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 6e 50            int nP
1f250 6f 73 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  os;.            
1f260 69 6e 74 20 6e 43 6f 70 79 20 3d 20 66 74 73 35  int nCopy = fts5
1f270 47 65 74 50 6f 73 6c 69 73 74 53 69 7a 65 28 26  GetPoslistSize(&
1f280 70 44 6f 63 6c 69 73 74 5b 69 4f 66 66 5d 2c 20  pDoclist[iOff], 
1f290 26 6e 50 6f 73 2c 20 26 62 44 75 6d 6d 79 29 3b  &nPos, &bDummy);
1f2a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 6e 43 6f  .            nCo
1f2b0 70 79 20 2b 3d 20 6e 50 6f 73 3b 0a 20 20 20 20  py += nPos;.    
1f2c0 20 20 20 20 20 20 20 20 69 66 28 20 28 70 42 75          if( (pBu
1f2d0 66 2d 3e 6e 20 2b 20 70 50 67 69 64 78 2d 3e 6e  f->n + pPgidx->n
1f2e0 20 2b 20 6e 43 6f 70 79 29 20 3c 3d 20 70 67 73   + nCopy) <= pgs
1f2f0 7a 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  z ){.           
1f300 20 20 20 2f 2a 20 54 68 65 20 65 6e 74 69 72 65     /* The entire
1f310 20 70 6f 73 6c 69 73 74 20 77 69 6c 6c 20 66 69   poslist will fi
1f320 74 20 6f 6e 20 74 68 65 20 63 75 72 72 65 6e 74  t on the current
1f330 20 6c 65 61 66 2e 20 53 6f 20 63 6f 70 79 0a 20   leaf. So copy. 
1f340 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20               ** 
1f350 69 74 20 69 6e 20 6f 6e 65 20 67 6f 2e 20 2a 2f  it in one go. */
1f360 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66  .              f
1f370 74 73 35 42 75 66 66 65 72 53 61 66 65 41 70 70  ts5BufferSafeApp
1f380 65 6e 64 42 6c 6f 62 28 70 42 75 66 2c 20 26 70  endBlob(pBuf, &p
1f390 44 6f 63 6c 69 73 74 5b 69 4f 66 66 5d 2c 20 6e  Doclist[iOff], n
1f3a0 43 6f 70 79 29 3b 0a 20 20 20 20 20 20 20 20 20  Copy);.         
1f3b0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1f3c0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 65          /* The e
1f3d0 6e 74 69 72 65 20 70 6f 73 6c 69 73 74 20 77 69  ntire poslist wi
1f3e0 6c 6c 20 6e 6f 74 20 66 69 74 20 6f 6e 20 74 68  ll not fit on th
1f3f0 69 73 20 6c 65 61 66 2e 20 53 6f 20 69 74 20 6e  is leaf. So it n
1f400 65 65 64 73 0a 20 20 20 20 20 20 20 20 20 20 20  eeds.           
1f410 20 20 20 2a 2a 20 74 6f 20 62 65 20 62 72 6f 6b     ** to be brok
1f420 65 6e 20 69 6e 74 6f 20 73 65 63 74 69 6f 6e 73  en into sections
1f430 2e 20 54 68 65 20 6f 6e 6c 79 20 71 75 61 6c 69  . The only quali
1f440 66 69 63 61 74 69 6f 6e 20 62 65 69 6e 67 0a 20  fication being. 
1f450 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20               ** 
1f460 74 68 61 74 20 65 61 63 68 20 76 61 72 69 6e 74  that each varint
1f470 20 6d 75 73 74 20 62 65 20 73 74 6f 72 65 64 20   must be stored 
1f480 63 6f 6e 74 69 67 75 6f 75 73 6c 79 2e 20 20 2a  contiguously.  *
1f490 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /.              
1f4a0 63 6f 6e 73 74 20 75 38 20 2a 70 50 6f 73 6c 69  const u8 *pPosli
1f4b0 73 74 20 3d 20 26 70 44 6f 63 6c 69 73 74 5b 69  st = &pDoclist[i
1f4c0 4f 66 66 5d 3b 0a 20 20 20 20 20 20 20 20 20 20  Off];.          
1f4d0 20 20 20 20 69 6e 74 20 69 50 6f 73 20 3d 20 30      int iPos = 0
1f4e0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
1f4f0 77 68 69 6c 65 28 20 70 2d 3e 72 63 3d 3d 53 51  while( p->rc==SQ
1f500 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1f510 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 6e             int n
1f520 53 70 61 63 65 20 3d 20 70 67 73 7a 20 2d 20 70  Space = pgsz - p
1f530 42 75 66 2d 3e 6e 20 2d 20 70 50 67 69 64 78 2d  Buf->n - pPgidx-
1f540 3e 6e 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  >n;.            
1f550 20 20 20 20 69 6e 74 20 6e 20 3d 20 30 3b 0a 20      int n = 0;. 
1f560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
1f570 66 28 20 28 6e 43 6f 70 79 20 2d 20 69 50 6f 73  f( (nCopy - iPos
1f580 29 3c 3d 6e 53 70 61 63 65 20 29 7b 0a 20 20 20  )<=nSpace ){.   
1f590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6e                 n
1f5a0 20 3d 20 6e 43 6f 70 79 20 2d 20 69 50 6f 73 3b   = nCopy - iPos;
1f5b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1f5c0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1f5d0 20 20 20 20 20 20 20 20 20 20 6e 20 3d 20 66 74            n = ft
1f5e0 73 35 50 6f 73 6c 69 73 74 50 72 65 66 69 78 28  s5PoslistPrefix(
1f5f0 26 70 50 6f 73 6c 69 73 74 5b 69 50 6f 73 5d 2c  &pPoslist[iPos],
1f600 20 6e 53 70 61 63 65 29 3b 0a 20 20 20 20 20 20   nSpace);.      
1f610 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
1f620 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73 65              asse
1f630 72 74 28 20 6e 3e 30 20 29 3b 0a 20 20 20 20 20  rt( n>0 );.     
1f640 20 20 20 20 20 20 20 20 20 20 20 66 74 73 35 42             fts5B
1f650 75 66 66 65 72 53 61 66 65 41 70 70 65 6e 64 42  ufferSafeAppendB
1f660 6c 6f 62 28 70 42 75 66 2c 20 26 70 50 6f 73 6c  lob(pBuf, &pPosl
1f670 69 73 74 5b 69 50 6f 73 5d 2c 20 6e 29 3b 0a 20  ist[iPos], n);. 
1f680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
1f690 50 6f 73 20 2b 3d 20 6e 3b 0a 20 20 20 20 20 20  Pos += n;.      
1f6a0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 28 70            if( (p
1f6b0 42 75 66 2d 3e 6e 20 2b 20 70 50 67 69 64 78 2d  Buf->n + pPgidx-
1f6c0 3e 6e 29 3e 3d 70 67 73 7a 20 29 7b 0a 20 20 20  >n)>=pgsz ){.   
1f6d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66                 f
1f6e0 74 73 35 57 72 69 74 65 46 6c 75 73 68 4c 65 61  ts5WriteFlushLea
1f6f0 66 28 70 2c 20 26 77 72 69 74 65 72 29 3b 0a 20  f(p, &writer);. 
1f700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
1f710 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1f720 20 69 66 28 20 69 50 6f 73 3e 3d 6e 43 6f 70 79   if( iPos>=nCopy
1f730 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
1f740 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1f750 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1f760 20 20 20 20 69 4f 66 66 20 2b 3d 20 6e 43 6f 70      iOff += nCop
1f770 79 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  y;.          }. 
1f780 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
1f790 0a 0a 20 20 20 20 20 20 2f 2a 20 54 4f 44 4f 32  ..      /* TODO2
1f7a0 3a 20 44 6f 63 6c 69 73 74 20 74 65 72 6d 69 6e  : Doclist termin
1f7b0 61 74 6f 72 20 77 72 69 74 74 65 6e 20 68 65 72  ator written her
1f7c0 65 2e 20 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 70  e. */.      /* p
1f7d0 42 75 66 2d 3e 70 5b 70 42 75 66 2d 3e 6e 2b 2b  Buf->p[pBuf->n++
1f7e0 5d 20 3d 20 27 5c 30 27 3b 20 2a 2f 0a 20 20 20  ] = '\0'; */.   
1f7f0 20 20 20 61 73 73 65 72 74 28 20 70 42 75 66 2d     assert( pBuf-
1f800 3e 6e 3c 3d 70 42 75 66 2d 3e 6e 53 70 61 63 65  >n<=pBuf->nSpace
1f810 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   );.      sqlite
1f820 33 46 74 73 35 48 61 73 68 53 63 61 6e 4e 65 78  3Fts5HashScanNex
1f830 74 28 70 48 61 73 68 29 3b 0a 20 20 20 20 7d 0a  t(pHash);.    }.
1f840 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 48      sqlite3Fts5H
1f850 61 73 68 43 6c 65 61 72 28 70 48 61 73 68 29 3b  ashClear(pHash);
1f860 0a 20 20 20 20 66 74 73 35 57 72 69 74 65 46 69  .    fts5WriteFi
1f870 6e 69 73 68 28 70 2c 20 26 77 72 69 74 65 72 2c  nish(p, &writer,
1f880 20 26 70 67 6e 6f 4c 61 73 74 29 3b 0a 0a 20 20   &pgnoLast);..  
1f890 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20    /* Update the 
1f8a0 46 74 73 35 53 74 72 75 63 74 75 72 65 2e 20 49  Fts5Structure. I
1f8b0 74 20 69 73 20 77 72 69 74 74 65 6e 20 62 61 63  t is written bac
1f8c0 6b 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  k to the databas
1f8d0 65 20 62 79 20 74 68 65 0a 20 20 20 20 2a 2a 20  e by the.    ** 
1f8e0 66 74 73 35 53 74 72 75 63 74 75 72 65 52 65 6c  fts5StructureRel
1f8f0 65 61 73 65 28 29 20 63 61 6c 6c 20 62 65 6c 6f  ease() call belo
1f900 77 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70  w.  */.    if( p
1f910 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 3d 3d  Struct->nLevel==
1f920 30 20 29 7b 0a 20 20 20 20 20 20 66 74 73 35 53  0 ){.      fts5S
1f930 74 72 75 63 74 75 72 65 41 64 64 4c 65 76 65 6c  tructureAddLevel
1f940 28 26 70 2d 3e 72 63 2c 20 26 70 53 74 72 75 63  (&p->rc, &pStruc
1f950 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 74  t);.    }.    ft
1f960 73 35 53 74 72 75 63 74 75 72 65 45 78 74 65 6e  s5StructureExten
1f970 64 4c 65 76 65 6c 28 26 70 2d 3e 72 63 2c 20 70  dLevel(&p->rc, p
1f980 53 74 72 75 63 74 2c 20 30 2c 20 31 2c 20 30 29  Struct, 0, 1, 0)
1f990 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d  ;.    if( p->rc=
1f9a0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1f9b0 20 20 20 20 70 53 65 67 20 3d 20 26 70 53 74 72      pSeg = &pStr
1f9c0 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 30 5d 2e 61  uct->aLevel[0].a
1f9d0 53 65 67 5b 20 70 53 74 72 75 63 74 2d 3e 61 4c  Seg[ pStruct->aL
1f9e0 65 76 65 6c 5b 30 5d 2e 6e 53 65 67 2b 2b 20 5d  evel[0].nSeg++ ]
1f9f0 3b 0a 20 20 20 20 20 20 70 53 65 67 2d 3e 69 53  ;.      pSeg->iS
1fa00 65 67 69 64 20 3d 20 69 53 65 67 69 64 3b 0a 20  egid = iSegid;. 
1fa10 20 20 20 20 20 70 53 65 67 2d 3e 70 67 6e 6f 46       pSeg->pgnoF
1fa20 69 72 73 74 20 3d 20 31 3b 0a 20 20 20 20 20 20  irst = 1;.      
1fa30 70 53 65 67 2d 3e 70 67 6e 6f 4c 61 73 74 20 3d  pSeg->pgnoLast =
1fa40 20 70 67 6e 6f 4c 61 73 74 3b 0a 20 20 20 20 20   pgnoLast;.     
1fa50 20 70 53 74 72 75 63 74 2d 3e 6e 53 65 67 6d 65   pStruct->nSegme
1fa60 6e 74 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  nt++;.    }.    
1fa70 66 74 73 35 53 74 72 75 63 74 75 72 65 50 72 6f  fts5StructurePro
1fa80 6d 6f 74 65 28 70 2c 20 30 2c 20 70 53 74 72 75  mote(p, 0, pStru
1fa90 63 74 29 3b 0a 20 20 7d 0a 0a 20 20 66 74 73 35  ct);.  }..  fts5
1faa0 49 6e 64 65 78 41 75 74 6f 6d 65 72 67 65 28 70  IndexAutomerge(p
1fab0 2c 20 26 70 53 74 72 75 63 74 2c 20 70 67 6e 6f  , &pStruct, pgno
1fac0 4c 61 73 74 29 3b 0a 20 20 66 74 73 35 49 6e 64  Last);.  fts5Ind
1fad0 65 78 43 72 69 73 69 73 6d 65 72 67 65 28 70 2c  exCrisismerge(p,
1fae0 20 26 70 53 74 72 75 63 74 29 3b 0a 20 20 66 74   &pStruct);.  ft
1faf0 73 35 53 74 72 75 63 74 75 72 65 57 72 69 74 65  s5StructureWrite
1fb00 28 70 2c 20 70 53 74 72 75 63 74 29 3b 0a 20 20  (p, pStruct);.  
1fb10 66 74 73 35 53 74 72 75 63 74 75 72 65 52 65 6c  fts5StructureRel
1fb20 65 61 73 65 28 70 53 74 72 75 63 74 29 3b 0a 7d  ease(pStruct);.}
1fb30 0a 0a 2f 2a 0a 2a 2a 20 46 6c 75 73 68 20 61 6e  ../*.** Flush an
1fb40 79 20 64 61 74 61 20 73 74 6f 72 65 64 20 69 6e  y data stored in
1fb50 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 68   the in-memory h
1fb60 61 73 68 20 74 61 62 6c 65 73 20 74 6f 20 74 68  ash tables to th
1fb70 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2f 0a 73  e database..*/.s
1fb80 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 49  tatic void fts5I
1fb90 6e 64 65 78 46 6c 75 73 68 28 46 74 73 35 49 6e  ndexFlush(Fts5In
1fba0 64 65 78 20 2a 70 29 7b 0a 20 20 2f 2a 20 55 6e  dex *p){.  /* Un
1fbb0 6c 65 73 73 20 69 74 20 69 73 20 65 6d 70 74 79  less it is empty
1fbc0 2c 20 66 6c 75 73 68 20 74 68 65 20 68 61 73 68  , flush the hash
1fbd0 20 74 61 62 6c 65 20 74 6f 20 64 69 73 6b 20 2a   table to disk *
1fbe0 2f 0a 20 20 69 66 28 20 70 2d 3e 6e 50 65 6e 64  /.  if( p->nPend
1fbf0 69 6e 67 44 61 74 61 20 29 7b 0a 20 20 20 20 61  ingData ){.    a
1fc00 73 73 65 72 74 28 20 70 2d 3e 70 48 61 73 68 20  ssert( p->pHash 
1fc10 29 3b 0a 20 20 20 20 70 2d 3e 6e 50 65 6e 64 69  );.    p->nPendi
1fc20 6e 67 44 61 74 61 20 3d 20 30 3b 0a 20 20 20 20  ngData = 0;.    
1fc30 66 74 73 35 46 6c 75 73 68 4f 6e 65 48 61 73 68  fts5FlushOneHash
1fc40 28 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a 69 6e 74  (p);.  }.}...int
1fc50 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65   sqlite3Fts5Inde
1fc60 78 4f 70 74 69 6d 69 7a 65 28 46 74 73 35 49 6e  xOptimize(Fts5In
1fc70 64 65 78 20 2a 70 29 7b 0a 20 20 46 74 73 35 53  dex *p){.  Fts5S
1fc80 74 72 75 63 74 75 72 65 20 2a 70 53 74 72 75 63  tructure *pStruc
1fc90 74 3b 0a 20 20 46 74 73 35 53 74 72 75 63 74 75  t;.  Fts5Structu
1fca0 72 65 20 2a 70 4e 65 77 20 3d 20 30 3b 0a 20 20  re *pNew = 0;.  
1fcb0 69 6e 74 20 6e 53 65 67 20 3d 20 30 3b 0a 0a 20  int nSeg = 0;.. 
1fcc0 20 61 73 73 65 72 74 28 20 70 2d 3e 72 63 3d 3d   assert( p->rc==
1fcd0 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 66  SQLITE_OK );.  f
1fce0 74 73 35 49 6e 64 65 78 46 6c 75 73 68 28 70 29  ts5IndexFlush(p)
1fcf0 3b 0a 20 20 70 53 74 72 75 63 74 20 3d 20 66 74  ;.  pStruct = ft
1fd00 73 35 53 74 72 75 63 74 75 72 65 52 65 61 64 28  s5StructureRead(
1fd10 70 29 3b 0a 0a 20 20 69 66 28 20 70 53 74 72 75  p);..  if( pStru
1fd20 63 74 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  ct ){.    assert
1fd30 28 20 70 53 74 72 75 63 74 2d 3e 6e 53 65 67 6d  ( pStruct->nSegm
1fd40 65 6e 74 3d 3d 66 74 73 35 53 74 72 75 63 74 75  ent==fts5Structu
1fd50 72 65 43 6f 75 6e 74 53 65 67 6d 65 6e 74 73 28  reCountSegments(
1fd60 70 53 74 72 75 63 74 29 20 29 3b 0a 20 20 20 20  pStruct) );.    
1fd70 6e 53 65 67 20 3d 20 70 53 74 72 75 63 74 2d 3e  nSeg = pStruct->
1fd80 6e 53 65 67 6d 65 6e 74 3b 0a 20 20 20 20 69 66  nSegment;.    if
1fd90 28 20 6e 53 65 67 3e 31 20 29 7b 0a 20 20 20 20  ( nSeg>1 ){.    
1fda0 20 20 69 6e 74 20 6e 42 79 74 65 20 3d 20 73 69    int nByte = si
1fdb0 7a 65 6f 66 28 46 74 73 35 53 74 72 75 63 74 75  zeof(Fts5Structu
1fdc0 72 65 29 3b 0a 20 20 20 20 20 20 6e 42 79 74 65  re);.      nByte
1fdd0 20 2b 3d 20 28 70 53 74 72 75 63 74 2d 3e 6e 4c   += (pStruct->nL
1fde0 65 76 65 6c 2b 31 29 20 2a 20 73 69 7a 65 6f 66  evel+1) * sizeof
1fdf0 28 46 74 73 35 53 74 72 75 63 74 75 72 65 4c 65  (Fts5StructureLe
1fe00 76 65 6c 29 3b 0a 20 20 20 20 20 20 70 4e 65 77  vel);.      pNew
1fe10 20 3d 20 28 46 74 73 35 53 74 72 75 63 74 75 72   = (Fts5Structur
1fe20 65 2a 29 73 71 6c 69 74 65 33 46 74 73 35 4d 61  e*)sqlite3Fts5Ma
1fe30 6c 6c 6f 63 5a 65 72 6f 28 26 70 2d 3e 72 63 2c  llocZero(&p->rc,
1fe40 20 6e 42 79 74 65 29 3b 0a 20 20 20 20 7d 0a 20   nByte);.    }. 
1fe50 20 7d 0a 20 20 69 66 28 20 70 4e 65 77 20 29 7b   }.  if( pNew ){
1fe60 0a 20 20 20 20 46 74 73 35 53 74 72 75 63 74 75  .    Fts5Structu
1fe70 72 65 4c 65 76 65 6c 20 2a 70 4c 76 6c 3b 0a 20  reLevel *pLvl;. 
1fe80 20 20 20 69 6e 74 20 6e 42 79 74 65 20 3d 20 6e     int nByte = n
1fe90 53 65 67 20 2a 20 73 69 7a 65 6f 66 28 46 74 73  Seg * sizeof(Fts
1fea0 35 53 74 72 75 63 74 75 72 65 53 65 67 6d 65 6e  5StructureSegmen
1feb0 74 29 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 4c  t);.    pNew->nL
1fec0 65 76 65 6c 20 3d 20 70 53 74 72 75 63 74 2d 3e  evel = pStruct->
1fed0 6e 4c 65 76 65 6c 2b 31 3b 0a 20 20 20 20 70 4e  nLevel+1;.    pN
1fee0 65 77 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20  ew->nRef = 1;.  
1fef0 20 20 70 4e 65 77 2d 3e 6e 57 72 69 74 65 43 6f    pNew->nWriteCo
1ff00 75 6e 74 65 72 20 3d 20 70 53 74 72 75 63 74 2d  unter = pStruct-
1ff10 3e 6e 57 72 69 74 65 43 6f 75 6e 74 65 72 3b 0a  >nWriteCounter;.
1ff20 20 20 20 20 70 4c 76 6c 20 3d 20 26 70 4e 65 77      pLvl = &pNew
1ff30 2d 3e 61 4c 65 76 65 6c 5b 70 53 74 72 75 63 74  ->aLevel[pStruct
1ff40 2d 3e 6e 4c 65 76 65 6c 5d 3b 0a 20 20 20 20 70  ->nLevel];.    p
1ff50 4c 76 6c 2d 3e 61 53 65 67 20 3d 20 28 46 74 73  Lvl->aSeg = (Fts
1ff60 35 53 74 72 75 63 74 75 72 65 53 65 67 6d 65 6e  5StructureSegmen
1ff70 74 2a 29 73 71 6c 69 74 65 33 46 74 73 35 4d 61  t*)sqlite3Fts5Ma
1ff80 6c 6c 6f 63 5a 65 72 6f 28 26 70 2d 3e 72 63 2c  llocZero(&p->rc,
1ff90 20 6e 42 79 74 65 29 3b 0a 20 20 20 20 69 66 28   nByte);.    if(
1ffa0 20 70 4c 76 6c 2d 3e 61 53 65 67 20 29 7b 0a 20   pLvl->aSeg ){. 
1ffb0 20 20 20 20 20 69 6e 74 20 69 4c 76 6c 2c 20 69       int iLvl, i
1ffc0 53 65 67 3b 0a 20 20 20 20 20 20 69 6e 74 20 69  Seg;.      int i
1ffd0 53 65 67 4f 75 74 20 3d 20 30 3b 0a 20 20 20 20  SegOut = 0;.    
1ffe0 20 20 66 6f 72 28 69 4c 76 6c 3d 30 3b 20 69 4c    for(iLvl=0; iL
1fff0 76 6c 3c 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76  vl<pStruct->nLev
20000 65 6c 3b 20 69 4c 76 6c 2b 2b 29 7b 0a 20 20 20  el; iLvl++){.   
20010 20 20 20 20 20 66 6f 72 28 69 53 65 67 3d 30 3b       for(iSeg=0;
20020 20 69 53 65 67 3c 70 53 74 72 75 63 74 2d 3e 61   iSeg<pStruct->a
20030 4c 65 76 65 6c 5b 69 4c 76 6c 5d 2e 6e 53 65 67  Level[iLvl].nSeg
20040 3b 20 69 53 65 67 2b 2b 29 7b 0a 20 20 20 20 20  ; iSeg++){.     
20050 20 20 20 20 20 70 4c 76 6c 2d 3e 61 53 65 67 5b       pLvl->aSeg[
20060 69 53 65 67 4f 75 74 5d 20 3d 20 70 53 74 72 75  iSegOut] = pStru
20070 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d  ct->aLevel[iLvl]
20080 2e 61 53 65 67 5b 69 53 65 67 5d 3b 0a 20 20 20  .aSeg[iSeg];.   
20090 20 20 20 20 20 20 20 69 53 65 67 4f 75 74 2b 2b         iSegOut++
200a0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
200b0 20 20 7d 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e    }.      pNew->
200c0 6e 53 65 67 6d 65 6e 74 20 3d 20 70 4c 76 6c 2d  nSegment = pLvl-
200d0 3e 6e 53 65 67 20 3d 20 6e 53 65 67 3b 0a 20 20  >nSeg = nSeg;.  
200e0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73    }else{.      s
200f0 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4e 65 77  qlite3_free(pNew
20100 29 3b 0a 20 20 20 20 20 20 70 4e 65 77 20 3d 20  );.      pNew = 
20110 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  0;.    }.  }..  
20120 69 66 28 20 70 4e 65 77 20 29 7b 0a 20 20 20 20  if( pNew ){.    
20130 69 6e 74 20 69 4c 76 6c 20 3d 20 70 4e 65 77 2d  int iLvl = pNew-
20140 3e 6e 4c 65 76 65 6c 2d 31 3b 0a 20 20 20 20 77  >nLevel-1;.    w
20150 68 69 6c 65 28 20 70 2d 3e 72 63 3d 3d 53 51 4c  hile( p->rc==SQL
20160 49 54 45 5f 4f 4b 20 26 26 20 70 4e 65 77 2d 3e  ITE_OK && pNew->
20170 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d 2e 6e 53 65  aLevel[iLvl].nSe
20180 67 3e 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  g>0 ){.      int
20190 20 6e 52 65 6d 20 3d 20 46 54 53 35 5f 4f 50 54   nRem = FTS5_OPT
201a0 5f 57 4f 52 4b 5f 55 4e 49 54 3b 0a 20 20 20 20  _WORK_UNIT;.    
201b0 20 20 66 74 73 35 49 6e 64 65 78 4d 65 72 67 65    fts5IndexMerge
201c0 4c 65 76 65 6c 28 70 2c 20 26 70 4e 65 77 2c 20  Level(p, &pNew, 
201d0 69 4c 76 6c 2c 20 26 6e 52 65 6d 29 3b 0a 20 20  iLvl, &nRem);.  
201e0 20 20 7d 0a 0a 20 20 20 20 66 74 73 35 53 74 72    }..    fts5Str
201f0 75 63 74 75 72 65 57 72 69 74 65 28 70 2c 20 70  uctureWrite(p, p
20200 4e 65 77 29 3b 0a 20 20 20 20 66 74 73 35 53 74  New);.    fts5St
20210 72 75 63 74 75 72 65 52 65 6c 65 61 73 65 28 70  ructureRelease(p
20220 4e 65 77 29 3b 0a 20 20 7d 0a 0a 20 20 66 74 73  New);.  }..  fts
20230 35 53 74 72 75 63 74 75 72 65 52 65 6c 65 61 73  5StructureReleas
20240 65 28 70 53 74 72 75 63 74 29 3b 0a 20 20 72 65  e(pStruct);.  re
20250 74 75 72 6e 20 66 74 73 35 49 6e 64 65 78 52 65  turn fts5IndexRe
20260 74 75 72 6e 28 70 29 3b 20 0a 7d 0a 0a 69 6e 74  turn(p); .}..int
20270 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65   sqlite3Fts5Inde
20280 78 4d 65 72 67 65 28 46 74 73 35 49 6e 64 65 78  xMerge(Fts5Index
20290 20 2a 70 2c 20 69 6e 74 20 6e 4d 65 72 67 65 29   *p, int nMerge)
202a0 7b 0a 20 20 46 74 73 35 53 74 72 75 63 74 75 72  {.  Fts5Structur
202b0 65 20 2a 70 53 74 72 75 63 74 3b 0a 0a 20 20 70  e *pStruct;..  p
202c0 53 74 72 75 63 74 20 3d 20 66 74 73 35 53 74 72  Struct = fts5Str
202d0 75 63 74 75 72 65 52 65 61 64 28 70 29 3b 0a 20  uctureRead(p);. 
202e0 20 69 66 28 20 70 53 74 72 75 63 74 20 26 26 20   if( pStruct && 
202f0 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 20  pStruct->nLevel 
20300 29 7b 0a 20 20 20 20 66 74 73 35 49 6e 64 65 78  ){.    fts5Index
20310 4d 65 72 67 65 28 70 2c 20 26 70 53 74 72 75 63  Merge(p, &pStruc
20320 74 2c 20 6e 4d 65 72 67 65 29 3b 0a 20 20 20 20  t, nMerge);.    
20330 66 74 73 35 53 74 72 75 63 74 75 72 65 57 72 69  fts5StructureWri
20340 74 65 28 70 2c 20 70 53 74 72 75 63 74 29 3b 0a  te(p, pStruct);.
20350 20 20 7d 0a 20 20 66 74 73 35 53 74 72 75 63 74    }.  fts5Struct
20360 75 72 65 52 65 6c 65 61 73 65 28 70 53 74 72 75  ureRelease(pStru
20370 63 74 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 66  ct);..  return f
20380 74 73 35 49 6e 64 65 78 52 65 74 75 72 6e 28 70  ts5IndexReturn(p
20390 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69  );.}..static voi
203a0 64 20 66 74 73 35 50 6f 73 6c 69 73 74 43 61 6c  d fts5PoslistCal
203b0 6c 62 61 63 6b 28 0a 20 20 46 74 73 35 49 6e 64  lback(.  Fts5Ind
203c0 65 78 20 2a 70 2c 20 0a 20 20 76 6f 69 64 20 2a  ex *p, .  void *
203d0 70 43 6f 6e 74 65 78 74 2c 20 0a 20 20 63 6f 6e  pContext, .  con
203e0 73 74 20 75 38 20 2a 70 43 68 75 6e 6b 2c 20 69  st u8 *pChunk, i
203f0 6e 74 20 6e 43 68 75 6e 6b 0a 29 7b 0a 20 20 61  nt nChunk.){.  a
20400 73 73 65 72 74 5f 6e 63 28 20 6e 43 68 75 6e 6b  ssert_nc( nChunk
20410 3e 3d 30 20 29 3b 0a 20 20 69 66 28 20 6e 43 68  >=0 );.  if( nCh
20420 75 6e 6b 3e 30 20 29 7b 0a 20 20 20 20 66 74 73  unk>0 ){.    fts
20430 35 42 75 66 66 65 72 53 61 66 65 41 70 70 65 6e  5BufferSafeAppen
20440 64 42 6c 6f 62 28 28 46 74 73 35 42 75 66 66 65  dBlob((Fts5Buffe
20450 72 2a 29 70 43 6f 6e 74 65 78 74 2c 20 70 43 68  r*)pContext, pCh
20460 75 6e 6b 2c 20 6e 43 68 75 6e 6b 29 3b 0a 20 20  unk, nChunk);.  
20470 7d 0a 7d 0a 0a 74 79 70 65 64 65 66 20 73 74 72  }.}..typedef str
20480 75 63 74 20 50 6f 73 6c 69 73 74 43 61 6c 6c 62  uct PoslistCallb
20490 61 63 6b 43 74 78 20 50 6f 73 6c 69 73 74 43 61  ackCtx PoslistCa
204a0 6c 6c 62 61 63 6b 43 74 78 3b 0a 73 74 72 75 63  llbackCtx;.struc
204b0 74 20 50 6f 73 6c 69 73 74 43 61 6c 6c 62 61 63  t PoslistCallbac
204c0 6b 43 74 78 20 7b 0a 20 20 46 74 73 35 42 75 66  kCtx {.  Fts5Buf
204d0 66 65 72 20 2a 70 42 75 66 3b 20 20 20 20 20 20  fer *pBuf;      
204e0 20 20 20 20 20 20 20 20 20 2f 2a 20 41 70 70 65           /* Appe
204f0 6e 64 20 74 6f 20 74 68 69 73 20 62 75 66 66 65  nd to this buffe
20500 72 20 2a 2f 0a 20 20 46 74 73 35 43 6f 6c 73 65  r */.  Fts5Colse
20510 74 20 2a 70 43 6f 6c 73 65 74 3b 20 20 20 20 20  t *pColset;     
20520 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69         /* Restri
20530 63 74 20 6d 61 74 63 68 65 73 20 74 6f 20 74 68  ct matches to th
20540 69 73 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 69  is column */.  i
20550 6e 74 20 65 53 74 61 74 65 3b 20 20 20 20 20 20  nt eState;      
20560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
20570 2a 20 53 65 65 20 61 62 6f 76 65 20 2a 2f 0a 7d  * See above */.}
20580 3b 0a 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  ;..typedef struc
20590 74 20 50 6f 73 6c 69 73 74 4f 66 66 73 65 74 73  t PoslistOffsets
205a0 43 74 78 20 50 6f 73 6c 69 73 74 4f 66 66 73 65  Ctx PoslistOffse
205b0 74 73 43 74 78 3b 0a 73 74 72 75 63 74 20 50 6f  tsCtx;.struct Po
205c0 73 6c 69 73 74 4f 66 66 73 65 74 73 43 74 78 20  slistOffsetsCtx 
205d0 7b 0a 20 20 46 74 73 35 42 75 66 66 65 72 20 2a  {.  Fts5Buffer *
205e0 70 42 75 66 3b 20 20 20 20 20 20 20 20 20 20 20  pBuf;           
205f0 20 20 20 20 2f 2a 20 41 70 70 65 6e 64 20 74 6f      /* Append to
20600 20 74 68 69 73 20 62 75 66 66 65 72 20 2a 2f 0a   this buffer */.
20610 20 20 46 74 73 35 43 6f 6c 73 65 74 20 2a 70 43    Fts5Colset *pC
20620 6f 6c 73 65 74 3b 20 20 20 20 20 20 20 20 20 20  olset;          
20630 20 20 2f 2a 20 52 65 73 74 72 69 63 74 20 6d 61    /* Restrict ma
20640 74 63 68 65 73 20 74 6f 20 74 68 69 73 20 63 6f  tches to this co
20650 6c 75 6d 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 52  lumn */.  int iR
20660 65 61 64 3b 0a 20 20 69 6e 74 20 69 57 72 69 74  ead;.  int iWrit
20670 65 3b 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 4f 44  e;.};../*.** TOD
20680 4f 3a 20 4d 61 6b 65 20 74 68 69 73 20 6d 6f 72  O: Make this mor
20690 65 20 65 66 66 69 63 69 65 6e 74 21 0a 2a 2f 0a  e efficient!.*/.
206a0 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 35 49  static int fts5I
206b0 6e 64 65 78 43 6f 6c 73 65 74 54 65 73 74 28 46  ndexColsetTest(F
206c0 74 73 35 43 6f 6c 73 65 74 20 2a 70 43 6f 6c 73  ts5Colset *pCols
206d0 65 74 2c 20 69 6e 74 20 69 43 6f 6c 29 7b 0a 20  et, int iCol){. 
206e0 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d   int i;.  for(i=
206f0 30 3b 20 69 3c 70 43 6f 6c 73 65 74 2d 3e 6e 43  0; i<pColset->nC
20700 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66  ol; i++){.    if
20710 28 20 70 43 6f 6c 73 65 74 2d 3e 61 69 43 6f 6c  ( pColset->aiCol
20720 5b 69 5d 3d 3d 69 43 6f 6c 20 29 20 72 65 74 75  [i]==iCol ) retu
20730 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75  rn 1;.  }.  retu
20740 72 6e 20 30 3b 0a 7d 0a 0a 73 74 61 74 69 63 20  rn 0;.}..static 
20750 76 6f 69 64 20 66 74 73 35 50 6f 73 6c 69 73 74  void fts5Poslist
20760 4f 66 66 73 65 74 73 43 61 6c 6c 62 61 63 6b 28  OffsetsCallback(
20770 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c  .  Fts5Index *p,
20780 20 0a 20 20 76 6f 69 64 20 2a 70 43 6f 6e 74 65   .  void *pConte
20790 78 74 2c 20 0a 20 20 63 6f 6e 73 74 20 75 38 20  xt, .  const u8 
207a0 2a 70 43 68 75 6e 6b 2c 20 69 6e 74 20 6e 43 68  *pChunk, int nCh
207b0 75 6e 6b 0a 29 7b 0a 20 20 50 6f 73 6c 69 73 74  unk.){.  Poslist
207c0 4f 66 66 73 65 74 73 43 74 78 20 2a 70 43 74 78  OffsetsCtx *pCtx
207d0 20 3d 20 28 50 6f 73 6c 69 73 74 4f 66 66 73 65   = (PoslistOffse
207e0 74 73 43 74 78 2a 29 70 43 6f 6e 74 65 78 74 3b  tsCtx*)pContext;
207f0 0a 20 20 61 73 73 65 72 74 5f 6e 63 28 20 6e 43  .  assert_nc( nC
20800 68 75 6e 6b 3e 3d 30 20 29 3b 0a 20 20 69 66 28  hunk>=0 );.  if(
20810 20 6e 43 68 75 6e 6b 3e 30 20 29 7b 0a 20 20 20   nChunk>0 ){.   
20820 20 69 6e 74 20 69 20 3d 20 30 3b 0a 20 20 20 20   int i = 0;.    
20830 77 68 69 6c 65 28 20 69 3c 6e 43 68 75 6e 6b 20  while( i<nChunk 
20840 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 56 61  ){.      int iVa
20850 6c 3b 0a 20 20 20 20 20 20 69 20 2b 3d 20 66 74  l;.      i += ft
20860 73 35 47 65 74 56 61 72 69 6e 74 33 32 28 26 70  s5GetVarint32(&p
20870 43 68 75 6e 6b 5b 69 5d 2c 20 69 56 61 6c 29 3b  Chunk[i], iVal);
20880 0a 20 20 20 20 20 20 69 56 61 6c 20 2b 3d 20 70  .      iVal += p
20890 43 74 78 2d 3e 69 52 65 61 64 20 2d 20 32 3b 0a  Ctx->iRead - 2;.
208a0 20 20 20 20 20 20 70 43 74 78 2d 3e 69 52 65 61        pCtx->iRea
208b0 64 20 3d 20 69 56 61 6c 3b 0a 20 20 20 20 20 20  d = iVal;.      
208c0 69 66 28 20 66 74 73 35 49 6e 64 65 78 43 6f 6c  if( fts5IndexCol
208d0 73 65 74 54 65 73 74 28 70 43 74 78 2d 3e 70 43  setTest(pCtx->pC
208e0 6f 6c 73 65 74 2c 20 69 56 61 6c 29 20 29 7b 0a  olset, iVal) ){.
208f0 20 20 20 20 20 20 20 20 66 74 73 35 42 75 66 66          fts5Buff
20900 65 72 53 61 66 65 41 70 70 65 6e 64 56 61 72 69  erSafeAppendVari
20910 6e 74 28 70 43 74 78 2d 3e 70 42 75 66 2c 20 69  nt(pCtx->pBuf, i
20920 56 61 6c 20 2b 20 32 20 2d 20 70 43 74 78 2d 3e  Val + 2 - pCtx->
20930 69 57 72 69 74 65 29 3b 0a 20 20 20 20 20 20 20  iWrite);.       
20940 20 70 43 74 78 2d 3e 69 57 72 69 74 65 20 3d 20   pCtx->iWrite = 
20950 69 56 61 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20  iVal;.      }.  
20960 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69    }.  }.}..stati
20970 63 20 76 6f 69 64 20 66 74 73 35 50 6f 73 6c 69  c void fts5Posli
20980 73 74 46 69 6c 74 65 72 43 61 6c 6c 62 61 63 6b  stFilterCallback
20990 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70  (.  Fts5Index *p
209a0 2c 20 0a 20 20 76 6f 69 64 20 2a 70 43 6f 6e 74  , .  void *pCont
209b0 65 78 74 2c 20 0a 20 20 63 6f 6e 73 74 20 75 38  ext, .  const u8
209c0 20 2a 70 43 68 75 6e 6b 2c 20 69 6e 74 20 6e 43   *pChunk, int nC
209d0 68 75 6e 6b 0a 29 7b 0a 20 20 50 6f 73 6c 69 73  hunk.){.  Poslis
209e0 74 43 61 6c 6c 62 61 63 6b 43 74 78 20 2a 70 43  tCallbackCtx *pC
209f0 74 78 20 3d 20 28 50 6f 73 6c 69 73 74 43 61 6c  tx = (PoslistCal
20a00 6c 62 61 63 6b 43 74 78 2a 29 70 43 6f 6e 74 65  lbackCtx*)pConte
20a10 78 74 3b 0a 20 20 61 73 73 65 72 74 5f 6e 63 28  xt;.  assert_nc(
20a20 20 6e 43 68 75 6e 6b 3e 3d 30 20 29 3b 0a 20 20   nChunk>=0 );.  
20a30 69 66 28 20 6e 43 68 75 6e 6b 3e 30 20 29 7b 0a  if( nChunk>0 ){.
20a40 20 20 20 20 2f 2a 20 53 65 61 72 63 68 20 74 68      /* Search th
20a50 72 6f 75 67 68 20 74 6f 20 66 69 6e 64 20 74 68  rough to find th
20a60 65 20 66 69 72 73 74 20 76 61 72 69 6e 74 20 77  e first varint w
20a70 69 74 68 20 76 61 6c 75 65 20 31 2e 20 54 68 69  ith value 1. Thi
20a80 73 20 69 73 20 74 68 65 0a 20 20 20 20 2a 2a 20  s is the.    ** 
20a90 73 74 61 72 74 20 6f 66 20 74 68 65 20 6e 65 78  start of the nex
20aa0 74 20 63 6f 6c 75 6d 6e 73 20 68 69 74 73 2e 20  t columns hits. 
20ab0 2a 2f 0a 20 20 20 20 69 6e 74 20 69 20 3d 20 30  */.    int i = 0
20ac0 3b 0a 20 20 20 20 69 6e 74 20 69 53 74 61 72 74  ;.    int iStart
20ad0 20 3d 20 30 3b 0a 0a 20 20 20 20 69 66 28 20 70   = 0;..    if( p
20ae0 43 74 78 2d 3e 65 53 74 61 74 65 3d 3d 32 20 29  Ctx->eState==2 )
20af0 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6c  {.      int iCol
20b00 3b 0a 20 20 20 20 20 20 66 74 73 35 46 61 73 74  ;.      fts5Fast
20b10 47 65 74 56 61 72 69 6e 74 33 32 28 70 43 68 75  GetVarint32(pChu
20b20 6e 6b 2c 20 69 2c 20 69 43 6f 6c 29 3b 0a 20 20  nk, i, iCol);.  
20b30 20 20 20 20 69 66 28 20 66 74 73 35 49 6e 64 65      if( fts5Inde
20b40 78 43 6f 6c 73 65 74 54 65 73 74 28 70 43 74 78  xColsetTest(pCtx
20b50 2d 3e 70 43 6f 6c 73 65 74 2c 20 69 43 6f 6c 29  ->pColset, iCol)
20b60 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43 74 78   ){.        pCtx
20b70 2d 3e 65 53 74 61 74 65 20 3d 20 31 3b 0a 20 20  ->eState = 1;.  
20b80 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72        fts5Buffer
20b90 53 61 66 65 41 70 70 65 6e 64 56 61 72 69 6e 74  SafeAppendVarint
20ba0 28 70 43 74 78 2d 3e 70 42 75 66 2c 20 31 29 3b  (pCtx->pBuf, 1);
20bb0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
20bc0 20 20 20 20 20 20 70 43 74 78 2d 3e 65 53 74 61        pCtx->eSta
20bd0 74 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a  te = 0;.      }.
20be0 20 20 20 20 7d 0a 0a 20 20 20 20 64 6f 20 7b 0a      }..    do {.
20bf0 20 20 20 20 20 20 77 68 69 6c 65 28 20 69 3c 6e        while( i<n
20c00 43 68 75 6e 6b 20 26 26 20 70 43 68 75 6e 6b 5b  Chunk && pChunk[
20c10 69 5d 21 3d 30 78 30 31 20 29 7b 0a 20 20 20 20  i]!=0x01 ){.    
20c20 20 20 20 20 77 68 69 6c 65 28 20 70 43 68 75 6e      while( pChun
20c30 6b 5b 69 5d 20 26 20 30 78 38 30 20 29 20 69 2b  k[i] & 0x80 ) i+
20c40 2b 3b 0a 20 20 20 20 20 20 20 20 69 2b 2b 3b 0a  +;.        i++;.
20c50 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
20c60 28 20 70 43 74 78 2d 3e 65 53 74 61 74 65 20 29  ( pCtx->eState )
20c70 7b 0a 20 20 20 20 20 20 20 20 66 74 73 35 42 75  {.        fts5Bu
20c80 66 66 65 72 53 61 66 65 41 70 70 65 6e 64 42 6c  fferSafeAppendBl
20c90 6f 62 28 70 43 74 78 2d 3e 70 42 75 66 2c 20 26  ob(pCtx->pBuf, &
20ca0 70 43 68 75 6e 6b 5b 69 53 74 61 72 74 5d 2c 20  pChunk[iStart], 
20cb0 69 2d 69 53 74 61 72 74 29 3b 0a 20 20 20 20 20  i-iStart);.     
20cc0 20 7d 0a 20 20 20 20 20 20 69 66 28 20 69 3c 6e   }.      if( i<n
20cd0 43 68 75 6e 6b 20 29 7b 0a 20 20 20 20 20 20 20  Chunk ){.       
20ce0 20 69 6e 74 20 69 43 6f 6c 3b 0a 20 20 20 20 20   int iCol;.     
20cf0 20 20 20 69 53 74 61 72 74 20 3d 20 69 3b 0a 20     iStart = i;. 
20d00 20 20 20 20 20 20 20 69 2b 2b 3b 0a 20 20 20 20         i++;.    
20d10 20 20 20 20 69 66 28 20 69 3e 3d 6e 43 68 75 6e      if( i>=nChun
20d20 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  k ){.          p
20d30 43 74 78 2d 3e 65 53 74 61 74 65 20 3d 20 32 3b  Ctx->eState = 2;
20d40 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
20d50 20 20 20 20 20 20 20 20 20 20 66 74 73 35 46 61            fts5Fa
20d60 73 74 47 65 74 56 61 72 69 6e 74 33 32 28 70 43  stGetVarint32(pC
20d70 68 75 6e 6b 2c 20 69 2c 20 69 43 6f 6c 29 3b 0a  hunk, i, iCol);.
20d80 20 20 20 20 20 20 20 20 20 20 70 43 74 78 2d 3e            pCtx->
20d90 65 53 74 61 74 65 20 3d 20 66 74 73 35 49 6e 64  eState = fts5Ind
20da0 65 78 43 6f 6c 73 65 74 54 65 73 74 28 70 43 74  exColsetTest(pCt
20db0 78 2d 3e 70 43 6f 6c 73 65 74 2c 20 69 43 6f 6c  x->pColset, iCol
20dc0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
20dd0 20 70 43 74 78 2d 3e 65 53 74 61 74 65 20 29 7b   pCtx->eState ){
20de0 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 74 73  .            fts
20df0 35 42 75 66 66 65 72 53 61 66 65 41 70 70 65 6e  5BufferSafeAppen
20e00 64 42 6c 6f 62 28 70 43 74 78 2d 3e 70 42 75 66  dBlob(pCtx->pBuf
20e10 2c 20 26 70 43 68 75 6e 6b 5b 69 53 74 61 72 74  , &pChunk[iStart
20e20 5d 2c 20 69 2d 69 53 74 61 72 74 29 3b 0a 20 20  ], i-iStart);.  
20e30 20 20 20 20 20 20 20 20 20 20 69 53 74 61 72 74            iStart
20e40 20 3d 20 69 3b 0a 20 20 20 20 20 20 20 20 20 20   = i;.          
20e50 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
20e60 20 20 7d 0a 20 20 20 20 7d 77 68 69 6c 65 28 20    }.    }while( 
20e70 69 3c 6e 43 68 75 6e 6b 20 29 3b 0a 20 20 7d 0a  i<nChunk );.  }.
20e80 7d 0a 0a 2f 2a 0a 2a 2a 20 49 74 65 72 61 74 6f  }../*.** Iterato
20e90 72 20 70 49 74 65 72 20 63 75 72 72 65 6e 74 6c  r pIter currentl
20ea0 79 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 76 61  y points to a va
20eb0 6c 69 64 20 65 6e 74 72 79 20 28 6e 6f 74 20 45  lid entry (not E
20ec0 4f 46 29 2e 20 54 68 69 73 0a 2a 2a 20 66 75 6e  OF). This.** fun
20ed0 63 74 69 6f 6e 20 61 70 70 65 6e 64 73 20 74 68  ction appends th
20ee0 65 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74 20  e position list 
20ef0 64 61 74 61 20 66 6f 72 20 74 68 65 20 63 75 72  data for the cur
20f00 72 65 6e 74 20 65 6e 74 72 79 20 74 6f 0a 2a 2a  rent entry to.**
20f10 20 62 75 66 66 65 72 20 70 42 75 66 2e 20 49 74   buffer pBuf. It
20f20 20 64 6f 65 73 20 6e 6f 74 20 6d 61 6b 65 20 61   does not make a
20f30 20 63 6f 70 79 20 6f 66 20 74 68 65 20 70 6f 73   copy of the pos
20f40 69 74 69 6f 6e 2d 6c 69 73 74 20 73 69 7a 65 0a  ition-list size.
20f50 2a 2a 20 66 69 65 6c 64 2e 0a 2a 2f 0a 73 74 61  ** field..*/.sta
20f60 74 69 63 20 76 6f 69 64 20 66 74 73 35 53 65 67  tic void fts5Seg
20f70 69 74 65 72 50 6f 73 6c 69 73 74 28 0a 20 20 46  iterPoslist(.  F
20f80 74 73 35 49 6e 64 65 78 20 2a 70 2c 0a 20 20 46  ts5Index *p,.  F
20f90 74 73 35 53 65 67 49 74 65 72 20 2a 70 53 65 67  ts5SegIter *pSeg
20fa0 2c 0a 20 20 46 74 73 35 43 6f 6c 73 65 74 20 2a  ,.  Fts5Colset *
20fb0 70 43 6f 6c 73 65 74 2c 0a 20 20 46 74 73 35 42  pColset,.  Fts5B
20fc0 75 66 66 65 72 20 2a 70 42 75 66 0a 29 7b 0a 20  uffer *pBuf.){. 
20fd0 20 69 66 28 20 30 3d 3d 66 74 73 35 42 75 66 66   if( 0==fts5Buff
20fe0 65 72 47 72 6f 77 28 26 70 2d 3e 72 63 2c 20 70  erGrow(&p->rc, p
20ff0 42 75 66 2c 20 70 53 65 67 2d 3e 6e 50 6f 73 29  Buf, pSeg->nPos)
21000 20 29 7b 0a 20 20 20 20 69 66 28 20 70 43 6f 6c   ){.    if( pCol
21010 73 65 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  set==0 ){.      
21020 66 74 73 35 43 68 75 6e 6b 49 74 65 72 61 74 65  fts5ChunkIterate
21030 28 70 2c 20 70 53 65 67 2c 20 28 76 6f 69 64 2a  (p, pSeg, (void*
21040 29 70 42 75 66 2c 20 66 74 73 35 50 6f 73 6c 69  )pBuf, fts5Posli
21050 73 74 43 61 6c 6c 62 61 63 6b 29 3b 0a 20 20 20  stCallback);.   
21060 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 66   }else{.      if
21070 28 20 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e 65 44  ( p->pConfig->eD
21080 65 74 61 69 6c 3d 3d 46 54 53 35 5f 44 45 54 41  etail==FTS5_DETA
21090 49 4c 5f 46 55 4c 4c 20 29 7b 0a 20 20 20 20 20  IL_FULL ){.     
210a0 20 20 20 50 6f 73 6c 69 73 74 43 61 6c 6c 62 61     PoslistCallba
210b0 63 6b 43 74 78 20 73 43 74 78 3b 0a 20 20 20 20  ckCtx sCtx;.    
210c0 20 20 20 20 73 43 74 78 2e 70 42 75 66 20 3d 20      sCtx.pBuf = 
210d0 70 42 75 66 3b 0a 20 20 20 20 20 20 20 20 73 43  pBuf;.        sC
210e0 74 78 2e 70 43 6f 6c 73 65 74 20 3d 20 70 43 6f  tx.pColset = pCo
210f0 6c 73 65 74 3b 0a 20 20 20 20 20 20 20 20 73 43  lset;.        sC
21100 74 78 2e 65 53 74 61 74 65 20 3d 20 66 74 73 35  tx.eState = fts5
21110 49 6e 64 65 78 43 6f 6c 73 65 74 54 65 73 74 28  IndexColsetTest(
21120 70 43 6f 6c 73 65 74 2c 20 30 29 3b 0a 20 20 20  pColset, 0);.   
21130 20 20 20 20 20 61 73 73 65 72 74 28 20 73 43 74       assert( sCt
21140 78 2e 65 53 74 61 74 65 3d 3d 30 20 7c 7c 20 73  x.eState==0 || s
21150 43 74 78 2e 65 53 74 61 74 65 3d 3d 31 20 29 3b  Ctx.eState==1 );
21160 0a 20 20 20 20 20 20 20 20 66 74 73 35 43 68 75  .        fts5Chu
21170 6e 6b 49 74 65 72 61 74 65 28 70 2c 20 70 53 65  nkIterate(p, pSe
21180 67 2c 20 28 76 6f 69 64 2a 29 26 73 43 74 78 2c  g, (void*)&sCtx,
21190 20 66 74 73 35 50 6f 73 6c 69 73 74 46 69 6c 74   fts5PoslistFilt
211a0 65 72 43 61 6c 6c 62 61 63 6b 29 3b 0a 20 20 20  erCallback);.   
211b0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
211c0 20 20 50 6f 73 6c 69 73 74 4f 66 66 73 65 74 73    PoslistOffsets
211d0 43 74 78 20 73 43 74 78 3b 0a 20 20 20 20 20 20  Ctx sCtx;.      
211e0 20 20 6d 65 6d 73 65 74 28 26 73 43 74 78 2c 20    memset(&sCtx, 
211f0 30 2c 20 73 69 7a 65 6f 66 28 73 43 74 78 29 29  0, sizeof(sCtx))
21200 3b 0a 20 20 20 20 20 20 20 20 73 43 74 78 2e 70  ;.        sCtx.p
21210 42 75 66 20 3d 20 70 42 75 66 3b 0a 20 20 20 20  Buf = pBuf;.    
21220 20 20 20 20 73 43 74 78 2e 70 43 6f 6c 73 65 74      sCtx.pColset
21230 20 3d 20 70 43 6f 6c 73 65 74 3b 0a 20 20 20 20   = pColset;.    
21240 20 20 20 20 66 74 73 35 43 68 75 6e 6b 49 74 65      fts5ChunkIte
21250 72 61 74 65 28 70 2c 20 70 53 65 67 2c 20 28 76  rate(p, pSeg, (v
21260 6f 69 64 2a 29 26 73 43 74 78 2c 20 66 74 73 35  oid*)&sCtx, fts5
21270 50 6f 73 6c 69 73 74 4f 66 66 73 65 74 73 43 61  PoslistOffsetsCa
21280 6c 6c 62 61 63 6b 29 3b 0a 20 20 20 20 20 20 7d  llback);.      }
21290 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a  .    }.  }.}../*
212a0 0a 2a 2a 20 49 4e 2f 4f 55 54 20 70 61 72 61 6d  .** IN/OUT param
212b0 65 74 65 72 20 28 2a 70 61 29 20 70 6f 69 6e 74  eter (*pa) point
212c0 73 20 74 6f 20 61 20 70 6f 73 69 74 69 6f 6e 20  s to a position 
212d0 6c 69 73 74 20 6e 20 62 79 74 65 73 20 69 6e 20  list n bytes in 
212e0 73 69 7a 65 2e 20 49 66 0a 2a 2a 20 74 68 65 20  size. If.** the 
212f0 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74 20 63 6f  position list co
21300 6e 74 61 69 6e 73 20 65 6e 74 72 69 65 73 20 66  ntains entries f
21310 6f 72 20 63 6f 6c 75 6d 6e 20 69 43 6f 6c 2c 20  or column iCol, 
21320 74 68 65 6e 20 28 2a 70 61 29 20 69 73 20 73 65  then (*pa) is se
21330 74 0a 2a 2a 20 74 6f 20 70 6f 69 6e 74 20 74 6f  t.** to point to
21340 20 74 68 65 20 73 75 62 2d 70 6f 73 69 74 69 6f   the sub-positio
21350 6e 2d 6c 69 73 74 20 66 6f 72 20 74 68 61 74 20  n-list for that 
21360 63 6f 6c 75 6d 6e 20 61 6e 64 20 74 68 65 20 6e  column and the n
21370 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 62 79 74 65  umber of.** byte
21380 73 20 69 6e 20 69 74 20 72 65 74 75 72 6e 65 64  s in it returned
21390 2e 20 4f 72 2c 20 69 66 20 74 68 65 20 61 72 67  . Or, if the arg
213a0 75 6d 65 6e 74 20 70 6f 73 69 74 69 6f 6e 20 6c  ument position l
213b0 69 73 74 20 64 6f 65 73 20 6e 6f 74 0a 2a 2a 20  ist does not.** 
213c0 63 6f 6e 74 61 69 6e 20 61 6e 79 20 65 6e 74 72  contain any entr
213d0 69 65 73 20 66 6f 72 20 63 6f 6c 75 6d 6e 20 69  ies for column i
213e0 43 6f 6c 2c 20 72 65 74 75 72 6e 20 30 2e 0a 2a  Col, return 0..*
213f0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73  /.static int fts
21400 35 49 6e 64 65 78 45 78 74 72 61 63 74 43 6f 6c  5IndexExtractCol
21410 28 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 2a 70  (.  const u8 **p
21420 61 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  a,              
21430 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 50      /* IN/OUT: P
21440 6f 69 6e 74 65 72 20 74 6f 20 70 6f 73 6c 69 73  ointer to poslis
21450 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 2c 20 20 20  t */.  int n,   
21460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21470 20 20 20 20 20 20 20 2f 2a 20 49 4e 3a 20 53 69         /* IN: Si
21480 7a 65 20 6f 66 20 70 6f 73 6c 69 73 74 20 69 6e  ze of poslist in
21490 20 62 79 74 65 73 20 2a 2f 0a 20 20 69 6e 74 20   bytes */.  int 
214a0 69 43 6f 6c 20 20 20 20 20 20 20 20 20 20 20 20  iCol            
214b0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
214c0 6f 6c 75 6d 6e 20 74 6f 20 65 78 74 72 61 63 74  olumn to extract
214d0 20 66 72 6f 6d 20 70 6f 73 6c 69 73 74 20 2a 2f   from poslist */
214e0 0a 29 7b 0a 20 20 69 6e 74 20 69 43 75 72 72 65  .){.  int iCurre
214f0 6e 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  nt = 0;         
21500 20 20 20 20 20 20 2f 2a 20 41 6e 79 74 68 69 6e        /* Anythin
21510 67 20 62 65 66 6f 72 65 20 74 68 65 20 66 69 72  g before the fir
21520 73 74 20 30 78 30 31 20 69 73 20 63 6f 6c 20 30  st 0x01 is col 0
21530 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a   */.  const u8 *
21540 70 20 3d 20 2a 70 61 3b 0a 20 20 63 6f 6e 73 74  p = *pa;.  const
21550 20 75 38 20 2a 70 45 6e 64 20 3d 20 26 70 5b 6e   u8 *pEnd = &p[n
21560 5d 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e  ];         /* On
21570 65 20 62 79 74 65 20 70 61 73 74 20 65 6e 64 20  e byte past end 
21580 6f 66 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74  of position list
21590 20 2a 2f 0a 20 20 75 38 20 70 72 65 76 20 3d 20   */.  u8 prev = 
215a0 30 3b 0a 0a 20 20 77 68 69 6c 65 28 20 69 43 6f  0;..  while( iCo
215b0 6c 3e 69 43 75 72 72 65 6e 74 20 29 7b 0a 20 20  l>iCurrent ){.  
215c0 20 20 2f 2a 20 41 64 76 61 6e 63 65 20 70 6f 69    /* Advance poi
215d0 6e 74 65 72 20 70 20 75 6e 74 69 6c 20 69 74 20  nter p until it 
215e0 70 6f 69 6e 74 73 20 74 6f 20 70 45 6e 64 20 6f  points to pEnd o
215f0 72 20 61 6e 20 30 78 30 31 20 62 79 74 65 20 74  r an 0x01 byte t
21600 68 61 74 20 69 73 0a 20 20 20 20 2a 2a 20 6e 6f  hat is.    ** no
21610 74 20 70 61 72 74 20 6f 66 20 61 20 76 61 72 69  t part of a vari
21620 6e 74 20 2a 2f 0a 20 20 20 20 77 68 69 6c 65 28  nt */.    while(
21630 20 28 70 72 65 76 20 26 20 30 78 38 30 29 20 7c   (prev & 0x80) |
21640 7c 20 2a 70 21 3d 30 78 30 31 20 29 7b 0a 20 20  | *p!=0x01 ){.  
21650 20 20 20 20 70 72 65 76 20 3d 20 2a 70 2b 2b 3b      prev = *p++;
21660 0a 20 20 20 20 20 20 69 66 28 20 70 3d 3d 70 45  .      if( p==pE
21670 6e 64 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  nd ) return 0;. 
21680 20 20 20 7d 0a 20 20 20 20 2a 70 61 20 3d 20 70     }.    *pa = p
21690 2b 2b 3b 0a 20 20 20 20 70 20 2b 3d 20 66 74 73  ++;.    p += fts
216a0 35 47 65 74 56 61 72 69 6e 74 33 32 28 70 2c 20  5GetVarint32(p, 
216b0 69 43 75 72 72 65 6e 74 29 3b 0a 20 20 7d 0a 20  iCurrent);.  }. 
216c0 20 69 66 28 20 69 43 6f 6c 21 3d 69 43 75 72 72   if( iCol!=iCurr
216d0 65 6e 74 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ent ) return 0;.
216e0 0a 20 20 2f 2a 20 41 64 76 61 6e 63 65 20 70 6f  .  /* Advance po
216f0 69 6e 74 65 72 20 70 20 75 6e 74 69 6c 20 69 74  inter p until it
21700 20 70 6f 69 6e 74 73 20 74 6f 20 70 45 6e 64 20   points to pEnd 
21710 6f 72 20 61 6e 20 30 78 30 31 20 62 79 74 65 20  or an 0x01 byte 
21720 74 68 61 74 20 69 73 0a 20 20 2a 2a 20 6e 6f 74  that is.  ** not
21730 20 70 61 72 74 20 6f 66 20 61 20 76 61 72 69 6e   part of a varin
21740 74 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28  t */.  assert( (
21750 70 72 65 76 20 26 20 30 78 38 30 29 3d 3d 30 20  prev & 0x80)==0 
21760 29 3b 0a 20 20 77 68 69 6c 65 28 20 70 3c 70 45  );.  while( p<pE
21770 6e 64 20 26 26 20 28 28 70 72 65 76 20 26 20 30  nd && ((prev & 0
21780 78 38 30 29 20 7c 7c 20 2a 70 21 3d 30 78 30 31  x80) || *p!=0x01
21790 29 20 29 7b 0a 20 20 20 20 70 72 65 76 20 3d 20  ) ){.    prev = 
217a0 2a 70 2b 2b 3b 0a 20 20 7d 0a 20 20 72 65 74 75  *p++;.  }.  retu
217b0 72 6e 20 70 20 2d 20 28 2a 70 61 29 3b 0a 7d 0a  rn p - (*pa);.}.
217c0 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 35  .static int fts5
217d0 41 70 70 65 6e 64 52 6f 77 69 64 28 0a 20 20 46  AppendRowid(.  F
217e0 74 73 35 49 6e 64 65 78 20 2a 70 2c 0a 20 20 69  ts5Index *p,.  i
217f0 36 34 20 69 44 65 6c 74 61 2c 0a 20 20 46 74 73  64 iDelta,.  Fts
21800 35 49 6e 64 65 78 49 74 65 72 20 2a 70 4d 75 6c  5IndexIter *pMul
21810 74 69 2c 0a 20 20 46 74 73 35 43 6f 6c 73 65 74  ti,.  Fts5Colset
21820 20 2a 70 43 6f 6c 73 65 74 2c 0a 20 20 46 74 73   *pColset,.  Fts
21830 35 42 75 66 66 65 72 20 2a 70 42 75 66 0a 29 7b  5Buffer *pBuf.){
21840 0a 20 20 66 74 73 35 42 75 66 66 65 72 41 70 70  .  fts5BufferApp
21850 65 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e 72 63  endVarint(&p->rc
21860 2c 20 70 42 75 66 2c 20 69 44 65 6c 74 61 29 3b  , pBuf, iDelta);
21870 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
21880 2f 2a 0a 2a 2a 20 49 74 65 72 61 74 6f 72 20 70  /*.** Iterator p
21890 4d 75 6c 74 69 20 63 75 72 72 65 6e 74 6c 79 20  Multi currently 
218a0 70 6f 69 6e 74 73 20 74 6f 20 61 20 76 61 6c 69  points to a vali
218b0 64 20 65 6e 74 72 79 20 28 6e 6f 74 20 45 4f 46  d entry (not EOF
218c0 29 2e 20 54 68 69 73 0a 2a 2a 20 66 75 6e 63 74  ). This.** funct
218d0 69 6f 6e 20 61 70 70 65 6e 64 73 20 74 68 65 20  ion appends the 
218e0 66 6f 6c 6c 6f 77 69 6e 67 20 74 6f 20 62 75 66  following to buf
218f0 66 65 72 20 70 42 75 66 3a 0a 2a 2a 0a 2a 2a 20  fer pBuf:.**.** 
21900 20 20 2a 20 54 68 65 20 76 61 72 69 6e 74 20 69    * The varint i
21910 44 65 6c 74 61 2c 20 61 6e 64 0a 2a 2a 20 20 20  Delta, and.**   
21920 2a 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 20 6c  * the position l
21930 69 73 74 20 74 68 61 74 20 63 75 72 72 65 6e 74  ist that current
21940 6c 79 20 70 6f 69 6e 74 73 20 74 6f 2c 20 69 6e  ly points to, in
21950 63 6c 75 64 69 6e 67 20 74 68 65 20 73 69 7a 65  cluding the size
21960 20 66 69 65 6c 64 2e 0a 2a 2a 0a 2a 2a 20 49 66   field..**.** If
21970 20 61 72 67 75 6d 65 6e 74 20 70 43 6f 6c 73 65   argument pColse
21980 74 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65 6e 20  t is NULL, then 
21990 74 68 65 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73  the position lis
219a0 74 20 69 73 20 66 69 6c 74 65 72 65 64 20 61 63  t is filtered ac
219b0 63 6f 72 64 69 6e 67 0a 2a 2a 20 74 6f 20 70 43  cording.** to pC
219c0 6f 6c 73 65 74 20 62 65 66 6f 72 65 20 62 65 69  olset before bei
219d0 6e 67 20 61 70 70 65 6e 64 65 64 20 74 6f 20 74  ng appended to t
219e0 68 65 20 62 75 66 66 65 72 2e 20 49 66 20 74 68  he buffer. If th
219f0 69 73 20 6d 65 61 6e 73 20 74 68 65 72 65 20 61  is means there a
21a00 72 65 0a 2a 2a 20 6e 6f 20 65 6e 74 72 69 65 73  re.** no entries
21a10 20 69 6e 20 74 68 65 20 70 6f 73 69 74 69 6f 6e   in the position
21a20 20 6c 69 73 74 2c 20 6e 6f 74 68 69 6e 67 20 69   list, nothing i
21a30 73 20 61 70 70 65 6e 64 65 64 20 74 6f 20 74 68  s appended to th
21a40 65 20 62 75 66 66 65 72 20 28 6e 6f 74 0a 2a 2a  e buffer (not.**
21a50 20 65 76 65 6e 20 69 44 65 6c 74 61 29 2e 0a 2a   even iDelta)..*
21a60 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72  *.** If an error
21a70 20 6f 63 63 75 72 73 2c 20 61 6e 20 65 72 72 6f   occurs, an erro
21a80 72 20 63 6f 64 65 20 69 73 20 6c 65 66 74 20 69  r code is left i
21a90 6e 20 70 2d 3e 72 63 2e 20 0a 2a 2f 0a 73 74 61  n p->rc. .*/.sta
21aa0 74 69 63 20 69 6e 74 20 66 74 73 35 41 70 70 65  tic int fts5Appe
21ab0 6e 64 50 6f 73 6c 69 73 74 28 0a 20 20 46 74 73  ndPoslist(.  Fts
21ac0 35 49 6e 64 65 78 20 2a 70 2c 0a 20 20 69 36 34  5Index *p,.  i64
21ad0 20 69 44 65 6c 74 61 2c 0a 20 20 46 74 73 35 49   iDelta,.  Fts5I
21ae0 6e 64 65 78 49 74 65 72 20 2a 70 4d 75 6c 74 69  ndexIter *pMulti
21af0 2c 0a 20 20 46 74 73 35 43 6f 6c 73 65 74 20 2a  ,.  Fts5Colset *
21b00 70 43 6f 6c 73 65 74 2c 0a 20 20 46 74 73 35 42  pColset,.  Fts5B
21b10 75 66 66 65 72 20 2a 70 42 75 66 0a 29 7b 0a 20  uffer *pBuf.){. 
21b20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49   if( p->rc==SQLI
21b30 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 46 74 73  TE_OK ){.    Fts
21b40 35 53 65 67 49 74 65 72 20 2a 70 53 65 67 20 3d  5SegIter *pSeg =
21b50 20 26 70 4d 75 6c 74 69 2d 3e 61 53 65 67 5b 20   &pMulti->aSeg[ 
21b60 70 4d 75 6c 74 69 2d 3e 61 46 69 72 73 74 5b 31  pMulti->aFirst[1
21b70 5d 2e 69 46 69 72 73 74 20 5d 3b 0a 20 20 20 20  ].iFirst ];.    
21b80 61 73 73 65 72 74 28 20 66 74 73 35 4d 75 6c 74  assert( fts5Mult
21b90 69 49 74 65 72 45 6f 66 28 70 2c 20 70 4d 75 6c  iIterEof(p, pMul
21ba0 74 69 29 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73  ti)==0 );.    as
21bb0 73 65 72 74 28 20 70 53 65 67 2d 3e 6e 50 6f 73  sert( pSeg->nPos
21bc0 3e 30 20 29 3b 0a 20 20 20 20 69 66 28 20 30 3d  >0 );.    if( 0=
21bd0 3d 66 74 73 35 42 75 66 66 65 72 47 72 6f 77 28  =fts5BufferGrow(
21be0 26 70 2d 3e 72 63 2c 20 70 42 75 66 2c 20 70 53  &p->rc, pBuf, pS
21bf0 65 67 2d 3e 6e 50 6f 73 2b 39 2b 39 29 20 29 7b  eg->nPos+9+9) ){
21c00 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 70 43  .      if( p->pC
21c10 6f 6e 66 69 67 2d 3e 65 44 65 74 61 69 6c 3d 3d  onfig->eDetail==
21c20 46 54 53 35 5f 44 45 54 41 49 4c 5f 46 55 4c 4c  FTS5_DETAIL_FULL
21c30 0a 20 20 20 20 20 20 20 26 26 20 70 53 65 67 2d  .       && pSeg-
21c40 3e 69 4c 65 61 66 4f 66 66 73 65 74 2b 70 53 65  >iLeafOffset+pSe
21c50 67 2d 3e 6e 50 6f 73 3c 3d 70 53 65 67 2d 3e 70  g->nPos<=pSeg->p
21c60 4c 65 61 66 2d 3e 73 7a 4c 65 61 66 20 0a 20 20  Leaf->szLeaf .  
21c70 20 20 20 20 20 26 26 20 28 70 43 6f 6c 73 65 74       && (pColset
21c80 3d 3d 30 20 7c 7c 20 70 43 6f 6c 73 65 74 2d 3e  ==0 || pColset->
21c90 6e 43 6f 6c 3d 3d 31 29 0a 20 20 20 20 20 20 29  nCol==1).      )
21ca0 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20  {.        const 
21cb0 75 38 20 2a 70 50 6f 73 20 3d 20 26 70 53 65 67  u8 *pPos = &pSeg
21cc0 2d 3e 70 4c 65 61 66 2d 3e 70 5b 70 53 65 67 2d  ->pLeaf->p[pSeg-
21cd0 3e 69 4c 65 61 66 4f 66 66 73 65 74 5d 3b 0a 20  >iLeafOffset];. 
21ce0 20 20 20 20 20 20 20 69 6e 74 20 6e 50 6f 73 3b         int nPos;
21cf0 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 43 6f  .        if( pCo
21d00 6c 73 65 74 20 29 7b 0a 20 20 20 20 20 20 20 20  lset ){.        
21d10 20 20 6e 50 6f 73 20 3d 20 66 74 73 35 49 6e 64    nPos = fts5Ind
21d20 65 78 45 78 74 72 61 63 74 43 6f 6c 28 26 70 50  exExtractCol(&pP
21d30 6f 73 2c 20 70 53 65 67 2d 3e 6e 50 6f 73 2c 20  os, pSeg->nPos, 
21d40 70 43 6f 6c 73 65 74 2d 3e 61 69 43 6f 6c 5b 30  pColset->aiCol[0
21d50 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  ]);.          if
21d60 28 20 6e 50 6f 73 3d 3d 30 20 29 20 72 65 74 75  ( nPos==0 ) retu
21d70 72 6e 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 65  rn 1;.        }e
21d80 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 6e  lse{.          n
21d90 50 6f 73 20 3d 20 70 53 65 67 2d 3e 6e 50 6f 73  Pos = pSeg->nPos
21da0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
21db0 20 20 20 20 61 73 73 65 72 74 28 20 6e 50 6f 73      assert( nPos
21dc0 3e 30 20 29 3b 0a 20 20 20 20 20 20 20 20 66 74  >0 );.        ft
21dd0 73 35 42 75 66 66 65 72 53 61 66 65 41 70 70 65  s5BufferSafeAppe
21de0 6e 64 56 61 72 69 6e 74 28 70 42 75 66 2c 20 69  ndVarint(pBuf, i
21df0 44 65 6c 74 61 29 3b 0a 20 20 20 20 20 20 20 20  Delta);.        
21e00 66 74 73 35 42 75 66 66 65 72 53 61 66 65 41 70  fts5BufferSafeAp
21e10 70 65 6e 64 56 61 72 69 6e 74 28 70 42 75 66 2c  pendVarint(pBuf,
21e20 20 6e 50 6f 73 2a 32 29 3b 0a 20 20 20 20 20 20   nPos*2);.      
21e30 20 20 66 74 73 35 42 75 66 66 65 72 53 61 66 65    fts5BufferSafe
21e40 41 70 70 65 6e 64 42 6c 6f 62 28 70 42 75 66 2c  AppendBlob(pBuf,
21e50 20 70 50 6f 73 2c 20 6e 50 6f 73 29 3b 0a 20 20   pPos, nPos);.  
21e60 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
21e70 20 20 20 69 6e 74 20 69 53 76 31 3b 0a 20 20 20     int iSv1;.   
21e80 20 20 20 20 20 69 6e 74 20 69 53 76 32 3b 0a 20       int iSv2;. 
21e90 20 20 20 20 20 20 20 69 6e 74 20 69 44 61 74 61         int iData
21ea0 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 70  ;..        /* Ap
21eb0 70 65 6e 64 20 69 44 65 6c 74 61 20 2a 2f 0a 20  pend iDelta */. 
21ec0 20 20 20 20 20 20 20 69 53 76 31 20 3d 20 70 42         iSv1 = pB
21ed0 75 66 2d 3e 6e 3b 0a 20 20 20 20 20 20 20 20 66  uf->n;.        f
21ee0 74 73 35 42 75 66 66 65 72 53 61 66 65 41 70 70  ts5BufferSafeApp
21ef0 65 6e 64 56 61 72 69 6e 74 28 70 42 75 66 2c 20  endVarint(pBuf, 
21f00 69 44 65 6c 74 61 29 3b 0a 0a 20 20 20 20 20 20  iDelta);..      
21f10 20 20 2f 2a 20 57 52 49 54 45 50 4f 53 4c 49 53    /* WRITEPOSLIS
21f20 54 53 49 5a 45 20 2a 2f 0a 20 20 20 20 20 20 20  TSIZE */.       
21f30 20 69 53 76 32 20 3d 20 70 42 75 66 2d 3e 6e 3b   iSv2 = pBuf->n;
21f40 0a 20 20 20 20 20 20 20 20 66 74 73 35 42 75 66  .        fts5Buf
21f50 66 65 72 53 61 66 65 41 70 70 65 6e 64 56 61 72  ferSafeAppendVar
21f60 69 6e 74 28 70 42 75 66 2c 20 70 53 65 67 2d 3e  int(pBuf, pSeg->
21f70 6e 50 6f 73 2a 32 29 3b 0a 20 20 20 20 20 20 20  nPos*2);.       
21f80 20 69 44 61 74 61 20 3d 20 70 42 75 66 2d 3e 6e   iData = pBuf->n
21f90 3b 0a 0a 20 20 20 20 20 20 20 20 66 74 73 35 53  ;..        fts5S
21fa0 65 67 69 74 65 72 50 6f 73 6c 69 73 74 28 70 2c  egiterPoslist(p,
21fb0 20 70 53 65 67 2c 20 70 43 6f 6c 73 65 74 2c 20   pSeg, pColset, 
21fc0 70 42 75 66 29 3b 0a 0a 20 20 20 20 20 20 20 20  pBuf);..        
21fd0 69 66 28 20 70 43 6f 6c 73 65 74 20 29 7b 0a 20  if( pColset ){. 
21fe0 20 20 20 20 20 20 20 20 20 69 6e 74 20 6e 41 63           int nAc
21ff0 74 75 61 6c 20 3d 20 70 42 75 66 2d 3e 6e 20 2d  tual = pBuf->n -
22000 20 69 44 61 74 61 3b 0a 20 20 20 20 20 20 20 20   iData;.        
22010 20 20 69 66 28 20 6e 41 63 74 75 61 6c 21 3d 70    if( nActual!=p
22020 53 65 67 2d 3e 6e 50 6f 73 20 29 7b 0a 20 20 20  Seg->nPos ){.   
22030 20 20 20 20 20 20 20 20 20 69 66 28 20 6e 41 63           if( nAc
22040 74 75 61 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20  tual==0 ){.     
22050 20 20 20 20 20 20 20 20 20 70 42 75 66 2d 3e 6e           pBuf->n
22060 20 3d 20 69 53 76 31 3b 0a 20 20 20 20 20 20 20   = iSv1;.       
22070 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b         return 1;
22080 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 65 6c  .            }el
22090 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
220a0 20 20 69 6e 74 20 6e 52 65 71 20 3d 20 73 71 6c    int nReq = sql
220b0 69 74 65 33 46 74 73 35 47 65 74 56 61 72 69 6e  ite3Fts5GetVarin
220c0 74 4c 65 6e 28 28 75 33 32 29 28 6e 41 63 74 75  tLen((u32)(nActu
220d0 61 6c 2a 32 29 29 3b 0a 20 20 20 20 20 20 20 20  al*2));.        
220e0 20 20 20 20 20 20 77 68 69 6c 65 28 20 69 53 76        while( iSv
220f0 32 3c 28 69 44 61 74 61 2d 6e 52 65 71 29 20 29  2<(iData-nReq) )
22100 7b 20 70 42 75 66 2d 3e 70 5b 69 53 76 32 2b 2b  { pBuf->p[iSv2++
22110 5d 20 3d 20 30 78 38 30 3b 20 7d 0a 20 20 20 20  ] = 0x80; }.    
22120 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
22130 33 46 74 73 35 50 75 74 56 61 72 69 6e 74 28 26  3Fts5PutVarint(&
22140 70 42 75 66 2d 3e 70 5b 69 53 76 32 5d 2c 20 6e  pBuf->p[iSv2], n
22150 41 63 74 75 61 6c 2a 32 29 3b 0a 20 20 20 20 20  Actual*2);.     
22160 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
22170 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
22180 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
22190 0a 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  ..  return 0;.}.
221a0 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  ..static void ft
221b0 73 35 44 6f 63 6c 69 73 74 49 74 65 72 4e 65 78  s5DoclistIterNex
221c0 74 28 46 74 73 35 44 6f 63 6c 69 73 74 49 74 65  t(Fts5DoclistIte
221d0 72 20 2a 70 49 74 65 72 29 7b 0a 20 20 75 38 20  r *pIter){.  u8 
221e0 2a 70 20 3d 20 70 49 74 65 72 2d 3e 61 50 6f 73  *p = pIter->aPos
221f0 6c 69 73 74 20 2b 20 70 49 74 65 72 2d 3e 6e 53  list + pIter->nS
22200 69 7a 65 20 2b 20 70 49 74 65 72 2d 3e 6e 50 6f  ize + pIter->nPo
22210 73 6c 69 73 74 3b 0a 0a 20 20 61 73 73 65 72 74  slist;..  assert
22220 28 20 70 49 74 65 72 2d 3e 61 50 6f 73 6c 69 73  ( pIter->aPoslis
22230 74 20 29 3b 0a 20 20 69 66 28 20 70 3e 3d 70 49  t );.  if( p>=pI
22240 74 65 72 2d 3e 61 45 6f 66 20 29 7b 0a 20 20 20  ter->aEof ){.   
22250 20 70 49 74 65 72 2d 3e 61 50 6f 73 6c 69 73 74   pIter->aPoslist
22260 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   = 0;.  }else{. 
22270 20 20 20 69 36 34 20 69 44 65 6c 74 61 3b 0a 0a     i64 iDelta;..
22280 20 20 20 20 70 20 2b 3d 20 66 74 73 35 47 65 74      p += fts5Get
22290 56 61 72 69 6e 74 28 70 2c 20 28 75 36 34 2a 29  Varint(p, (u64*)
222a0 26 69 44 65 6c 74 61 29 3b 0a 20 20 20 20 70 49  &iDelta);.    pI
222b0 74 65 72 2d 3e 69 52 6f 77 69 64 20 2b 3d 20 69  ter->iRowid += i
222c0 44 65 6c 74 61 3b 0a 0a 20 20 20 20 2f 2a 20 52  Delta;..    /* R
222d0 65 61 64 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73  ead position lis
222e0 74 20 73 69 7a 65 20 2a 2f 0a 20 20 20 20 69 66  t size */.    if
222f0 28 20 70 5b 30 5d 20 26 20 30 78 38 30 20 29 7b  ( p[0] & 0x80 ){
22300 0a 20 20 20 20 20 20 69 6e 74 20 6e 50 6f 73 3b  .      int nPos;
22310 0a 20 20 20 20 20 20 70 49 74 65 72 2d 3e 6e 53  .      pIter->nS
22320 69 7a 65 20 3d 20 66 74 73 35 47 65 74 56 61 72  ize = fts5GetVar
22330 69 6e 74 33 32 28 70 2c 20 6e 50 6f 73 29 3b 0a  int32(p, nPos);.
22340 20 20 20 20 20 20 70 49 74 65 72 2d 3e 6e 50 6f        pIter->nPo
22350 73 6c 69 73 74 20 3d 20 28 6e 50 6f 73 3e 3e 31  slist = (nPos>>1
22360 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
22370 20 20 20 20 70 49 74 65 72 2d 3e 6e 50 6f 73 6c      pIter->nPosl
22380 69 73 74 20 3d 20 28 28 69 6e 74 29 28 70 5b 30  ist = ((int)(p[0
22390 5d 29 29 20 3e 3e 20 31 3b 0a 20 20 20 20 20 20  ])) >> 1;.      
223a0 70 49 74 65 72 2d 3e 6e 53 69 7a 65 20 3d 20 31  pIter->nSize = 1
223b0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 49 74  ;.    }..    pIt
223c0 65 72 2d 3e 61 50 6f 73 6c 69 73 74 20 3d 20 70  er->aPoslist = p
223d0 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63 20  ;.  }.}..static 
223e0 76 6f 69 64 20 66 74 73 35 44 6f 63 6c 69 73 74  void fts5Doclist
223f0 49 74 65 72 49 6e 69 74 28 0a 20 20 46 74 73 35  IterInit(.  Fts5
22400 42 75 66 66 65 72 20 2a 70 42 75 66 2c 20 0a 20  Buffer *pBuf, . 
22410 20 46 74 73 35 44 6f 63 6c 69 73 74 49 74 65 72   Fts5DoclistIter
22420 20 2a 70 49 74 65 72 0a 29 7b 0a 20 20 6d 65 6d   *pIter.){.  mem
22430 73 65 74 28 70 49 74 65 72 2c 20 30 2c 20 73 69  set(pIter, 0, si
22440 7a 65 6f 66 28 2a 70 49 74 65 72 29 29 3b 0a 20  zeof(*pIter));. 
22450 20 70 49 74 65 72 2d 3e 61 50 6f 73 6c 69 73 74   pIter->aPoslist
22460 20 3d 20 70 42 75 66 2d 3e 70 3b 0a 20 20 70 49   = pBuf->p;.  pI
22470 74 65 72 2d 3e 61 45 6f 66 20 3d 20 26 70 42 75  ter->aEof = &pBu
22480 66 2d 3e 70 5b 70 42 75 66 2d 3e 6e 5d 3b 0a 20  f->p[pBuf->n];. 
22490 20 66 74 73 35 44 6f 63 6c 69 73 74 49 74 65 72   fts5DoclistIter
224a0 4e 65 78 74 28 70 49 74 65 72 29 3b 0a 7d 0a 0a  Next(pIter);.}..
224b0 23 69 66 20 30 0a 2f 2a 0a 2a 2a 20 41 70 70 65  #if 0./*.** Appe
224c0 6e 64 20 61 20 64 6f 63 6c 69 73 74 20 74 6f 20  nd a doclist to 
224d0 62 75 66 66 65 72 20 70 42 75 66 2e 0a 2a 2a 0a  buffer pBuf..**.
224e0 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
224f0 20 61 73 73 75 6d 65 73 20 74 68 61 74 20 73 70   assumes that sp
22500 61 63 65 20 77 69 74 68 69 6e 20 74 68 65 20 62  ace within the b
22510 75 66 66 65 72 20 68 61 73 20 61 6c 72 65 61 64  uffer has alread
22520 79 20 62 65 65 6e 0a 2a 2a 20 61 6c 6c 6f 63 61  y been.** alloca
22530 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ted..*/.static v
22540 6f 69 64 20 66 74 73 35 4d 65 72 67 65 41 70 70  oid fts5MergeApp
22550 65 6e 64 44 6f 63 69 64 28 0a 20 20 46 74 73 35  endDocid(.  Fts5
22560 42 75 66 66 65 72 20 2a 70 42 75 66 2c 20 20 20  Buffer *pBuf,   
22570 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42              /* B
22580 75 66 66 65 72 20 74 6f 20 77 72 69 74 65 20 74  uffer to write t
22590 6f 20 2a 2f 0a 20 20 69 36 34 20 2a 70 69 4c 61  o */.  i64 *piLa
225a0 73 74 52 6f 77 69 64 2c 20 20 20 20 20 20 20 20  stRowid,        
225b0 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54         /* IN/OUT
225c0 3a 20 50 72 65 76 69 6f 75 73 20 72 6f 77 69 64  : Previous rowid
225d0 20 77 72 69 74 74 65 6e 20 28 69 66 20 61 6e 79   written (if any
225e0 29 20 2a 2f 0a 20 20 69 36 34 20 69 52 6f 77 69  ) */.  i64 iRowi
225f0 64 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d               
22600 20 20 20 20 20 20 20 2f 2a 20 52 6f 77 69 64 20         /* Rowid 
22610 74 6f 20 61 70 70 65 6e 64 20 2a 2f 0a 29 7b 0a  to append */.){.
22620 20 20 61 73 73 65 72 74 28 20 70 42 75 66 2d 3e    assert( pBuf->
22630 6e 21 3d 30 20 7c 7c 20 28 2a 70 69 4c 61 73 74  n!=0 || (*piLast
22640 52 6f 77 69 64 29 3d 3d 30 20 29 3b 0a 20 20 66  Rowid)==0 );.  f
22650 74 73 35 42 75 66 66 65 72 53 61 66 65 41 70 70  ts5BufferSafeApp
22660 65 6e 64 56 61 72 69 6e 74 28 70 42 75 66 2c 20  endVarint(pBuf, 
22670 69 52 6f 77 69 64 20 2d 20 2a 70 69 4c 61 73 74  iRowid - *piLast
22680 52 6f 77 69 64 29 3b 0a 20 20 2a 70 69 4c 61 73  Rowid);.  *piLas
22690 74 52 6f 77 69 64 20 3d 20 69 52 6f 77 69 64 3b  tRowid = iRowid;
226a0 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69  .}.#endif..#defi
226b0 6e 65 20 66 74 73 35 4d 65 72 67 65 41 70 70 65  ne fts5MergeAppe
226c0 6e 64 44 6f 63 69 64 28 70 42 75 66 2c 20 69 4c  ndDocid(pBuf, iL
226d0 61 73 74 52 6f 77 69 64 2c 20 69 52 6f 77 69 64  astRowid, iRowid
226e0 29 20 7b 20 20 20 20 20 20 20 5c 0a 20 20 61 73  ) {       \.  as
226f0 73 65 72 74 28 20 28 70 42 75 66 29 2d 3e 6e 21  sert( (pBuf)->n!
22700 3d 30 20 7c 7c 20 28 69 4c 61 73 74 52 6f 77 69  =0 || (iLastRowi
22710 64 29 3d 3d 30 20 29 3b 20 20 20 20 20 20 20 20  d)==0 );        
22720 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 66             \.  f
22730 74 73 35 42 75 66 66 65 72 53 61 66 65 41 70 70  ts5BufferSafeApp
22740 65 6e 64 56 61 72 69 6e 74 28 28 70 42 75 66 29  endVarint((pBuf)
22750 2c 20 28 69 52 6f 77 69 64 29 20 2d 20 28 69 4c  , (iRowid) - (iL
22760 61 73 74 52 6f 77 69 64 29 29 3b 20 5c 0a 20 20  astRowid)); \.  
22770 28 69 4c 61 73 74 52 6f 77 69 64 29 20 3d 20 28  (iLastRowid) = (
22780 69 52 6f 77 69 64 29 3b 20 20 20 20 20 20 20 20  iRowid);        
22790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
227a0 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 7d               \.}
227b0 0a 0a 2f 2a 0a 2a 2a 20 53 77 61 70 20 74 68 65  ../*.** Swap the
227c0 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 62 75 66   contents of buf
227d0 66 65 72 20 2a 70 31 20 77 69 74 68 20 74 68 61  fer *p1 with tha
227e0 74 20 6f 66 20 2a 70 32 2e 0a 2a 2f 0a 73 74 61  t of *p2..*/.sta
227f0 74 69 63 20 76 6f 69 64 20 66 74 73 35 42 75 66  tic void fts5Buf
22800 66 65 72 53 77 61 70 28 46 74 73 35 42 75 66 66  ferSwap(Fts5Buff
22810 65 72 20 2a 70 31 2c 20 46 74 73 35 42 75 66 66  er *p1, Fts5Buff
22820 65 72 20 2a 70 32 29 7b 0a 20 20 46 74 73 35 42  er *p2){.  Fts5B
22830 75 66 66 65 72 20 74 6d 70 20 3d 20 2a 70 31 3b  uffer tmp = *p1;
22840 0a 20 20 2a 70 31 20 3d 20 2a 70 32 3b 0a 20 20  .  *p1 = *p2;.  
22850 2a 70 32 20 3d 20 74 6d 70 3b 0a 7d 0a 0a 73 74  *p2 = tmp;.}..st
22860 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 4e 65  atic void fts5Ne
22870 78 74 52 6f 77 69 64 28 46 74 73 35 42 75 66 66  xtRowid(Fts5Buff
22880 65 72 20 2a 70 42 75 66 2c 20 69 6e 74 20 2a 70  er *pBuf, int *p
22890 69 4f 66 66 2c 20 69 36 34 20 2a 70 69 52 6f 77  iOff, i64 *piRow
228a0 69 64 29 7b 0a 20 20 69 6e 74 20 69 20 3d 20 2a  id){.  int i = *
228b0 70 69 4f 66 66 3b 0a 20 20 69 66 28 20 69 3e 3d  piOff;.  if( i>=
228c0 70 42 75 66 2d 3e 6e 20 29 7b 0a 20 20 20 20 2a  pBuf->n ){.    *
228d0 70 69 4f 66 66 20 3d 20 2d 31 3b 0a 20 20 7d 65  piOff = -1;.  }e
228e0 6c 73 65 7b 0a 20 20 20 20 75 36 34 20 69 56 61  lse{.    u64 iVa
228f0 6c 3b 0a 20 20 20 20 2a 70 69 4f 66 66 20 3d 20  l;.    *piOff = 
22900 69 20 2b 20 73 71 6c 69 74 65 33 46 74 73 35 47  i + sqlite3Fts5G
22910 65 74 56 61 72 69 6e 74 28 26 70 42 75 66 2d 3e  etVarint(&pBuf->
22920 70 5b 69 5d 2c 20 26 69 56 61 6c 29 3b 0a 20 20  p[i], &iVal);.  
22930 20 20 2a 70 69 52 6f 77 69 64 20 2b 3d 20 69 56    *piRowid += iV
22940 61 6c 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  al;.  }.}../*.**
22950 20 54 68 69 73 20 69 73 20 74 68 65 20 65 71 75   This is the equ
22960 69 76 61 6c 65 6e 74 20 6f 66 20 66 74 73 35 4d  ivalent of fts5M
22970 65 72 67 65 50 72 65 66 69 78 4c 69 73 74 73 28  ergePrefixLists(
22980 29 20 66 6f 72 20 64 65 74 61 69 6c 3d 6e 6f 6e  ) for detail=non
22990 65 20 6d 6f 64 65 2e 0a 2a 2a 20 49 6e 20 74 68  e mode..** In th
229a0 69 73 20 63 61 73 65 20 74 68 65 20 62 75 66 66  is case the buff
229b0 65 72 73 20 63 6f 6e 73 69 73 74 20 6f 66 20 61  ers consist of a
229c0 20 64 65 6c 74 61 2d 65 6e 63 6f 64 65 64 20 6c   delta-encoded l
229d0 69 73 74 20 6f 66 20 72 6f 77 69 64 73 20 6f 6e  ist of rowids on
229e0 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ly..*/.static vo
229f0 69 64 20 66 74 73 35 4d 65 72 67 65 52 6f 77 69  id fts5MergeRowi
22a00 64 4c 69 73 74 73 28 0a 20 20 46 74 73 35 49 6e  dLists(.  Fts5In
22a10 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20 20  dex *p,         
22a20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53            /* FTS
22a30 35 20 62 61 63 6b 65 6e 64 20 6f 62 6a 65 63 74  5 backend object
22a40 20 2a 2f 0a 20 20 46 74 73 35 42 75 66 66 65 72   */.  Fts5Buffer
22a50 20 2a 70 31 2c 20 20 20 20 20 20 20 20 20 20 20   *p1,           
22a60 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 6c        /* First l
22a70 69 73 74 20 74 6f 20 6d 65 72 67 65 20 2a 2f 0a  ist to merge */.
22a80 20 20 46 74 73 35 42 75 66 66 65 72 20 2a 70 32    Fts5Buffer *p2
22a90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22aa0 20 20 2f 2a 20 53 65 63 6f 6e 64 20 6c 69 73 74    /* Second list
22ab0 20 74 6f 20 6d 65 72 67 65 20 2a 2f 0a 29 7b 0a   to merge */.){.
22ac0 20 20 69 6e 74 20 69 31 20 3d 20 30 3b 0a 20 20    int i1 = 0;.  
22ad0 69 6e 74 20 69 32 20 3d 20 30 3b 0a 20 20 69 36  int i2 = 0;.  i6
22ae0 34 20 69 52 6f 77 69 64 31 20 3d 20 30 3b 0a 20  4 iRowid1 = 0;. 
22af0 20 69 36 34 20 69 52 6f 77 69 64 32 20 3d 20 30   i64 iRowid2 = 0
22b00 3b 0a 20 20 69 36 34 20 69 4f 75 74 20 3d 20 30  ;.  i64 iOut = 0
22b10 3b 0a 0a 20 20 46 74 73 35 42 75 66 66 65 72 20  ;..  Fts5Buffer 
22b20 6f 75 74 3b 0a 20 20 6d 65 6d 73 65 74 28 26 6f  out;.  memset(&o
22b30 75 74 2c 20 30 2c 20 73 69 7a 65 6f 66 28 6f 75  ut, 0, sizeof(ou
22b40 74 29 29 3b 0a 20 20 73 71 6c 69 74 65 33 46 74  t));.  sqlite3Ft
22b50 73 35 42 75 66 66 65 72 53 69 7a 65 28 26 70 2d  s5BufferSize(&p-
22b60 3e 72 63 2c 20 26 6f 75 74 2c 20 70 31 2d 3e 6e  >rc, &out, p1->n
22b70 20 2b 20 70 32 2d 3e 6e 29 3b 0a 20 20 69 66 28   + p2->n);.  if(
22b80 20 70 2d 3e 72 63 20 29 20 72 65 74 75 72 6e 3b   p->rc ) return;
22b90 0a 0a 20 20 66 74 73 35 4e 65 78 74 52 6f 77 69  ..  fts5NextRowi
22ba0 64 28 70 31 2c 20 26 69 31 2c 20 26 69 52 6f 77  d(p1, &i1, &iRow
22bb0 69 64 31 29 3b 0a 20 20 66 74 73 35 4e 65 78 74  id1);.  fts5Next
22bc0 52 6f 77 69 64 28 70 32 2c 20 26 69 32 2c 20 26  Rowid(p2, &i2, &
22bd0 69 52 6f 77 69 64 32 29 3b 0a 20 20 77 68 69 6c  iRowid2);.  whil
22be0 65 28 20 69 31 3e 3d 30 20 7c 7c 20 69 32 3e 3d  e( i1>=0 || i2>=
22bf0 30 20 29 7b 0a 20 20 20 20 69 66 28 20 69 31 3e  0 ){.    if( i1>
22c00 3d 30 20 26 26 20 28 69 32 3c 30 20 7c 7c 20 69  =0 && (i2<0 || i
22c10 52 6f 77 69 64 31 3c 69 52 6f 77 69 64 32 29 20  Rowid1<iRowid2) 
22c20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
22c30 20 69 4f 75 74 3d 3d 30 20 7c 7c 20 69 52 6f 77   iOut==0 || iRow
22c40 69 64 31 3e 69 4f 75 74 20 29 3b 0a 20 20 20 20  id1>iOut );.    
22c50 20 20 66 74 73 35 42 75 66 66 65 72 53 61 66 65    fts5BufferSafe
22c60 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26 6f 75  AppendVarint(&ou
22c70 74 2c 20 69 52 6f 77 69 64 31 20 2d 20 69 4f 75  t, iRowid1 - iOu
22c80 74 29 3b 0a 20 20 20 20 20 20 69 4f 75 74 20 3d  t);.      iOut =
22c90 20 69 52 6f 77 69 64 31 3b 0a 20 20 20 20 20 20   iRowid1;.      
22ca0 66 74 73 35 4e 65 78 74 52 6f 77 69 64 28 70 31  fts5NextRowid(p1
22cb0 2c 20 26 69 31 2c 20 26 69 52 6f 77 69 64 31 29  , &i1, &iRowid1)
22cc0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
22cd0 20 20 20 61 73 73 65 72 74 28 20 69 4f 75 74 3d     assert( iOut=
22ce0 3d 30 20 7c 7c 20 69 52 6f 77 69 64 32 3e 69 4f  =0 || iRowid2>iO
22cf0 75 74 20 29 3b 0a 20 20 20 20 20 20 66 74 73 35  ut );.      fts5
22d00 42 75 66 66 65 72 53 61 66 65 41 70 70 65 6e 64  BufferSafeAppend
22d10 56 61 72 69 6e 74 28 26 6f 75 74 2c 20 69 52 6f  Varint(&out, iRo
22d20 77 69 64 32 20 2d 20 69 4f 75 74 29 3b 0a 20 20  wid2 - iOut);.  
22d30 20 20 20 20 69 4f 75 74 20 3d 20 69 52 6f 77 69      iOut = iRowi
22d40 64 32 3b 0a 20 20 20 20 20 20 69 66 28 20 69 31  d2;.      if( i1
22d50 3e 3d 30 20 26 26 20 69 52 6f 77 69 64 31 3d 3d  >=0 && iRowid1==
22d60 69 52 6f 77 69 64 32 20 29 7b 0a 20 20 20 20 20  iRowid2 ){.     
22d70 20 20 20 66 74 73 35 4e 65 78 74 52 6f 77 69 64     fts5NextRowid
22d80 28 70 31 2c 20 26 69 31 2c 20 26 69 52 6f 77 69  (p1, &i1, &iRowi
22d90 64 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  d1);.      }.   
22da0 20 20 20 66 74 73 35 4e 65 78 74 52 6f 77 69 64     fts5NextRowid
22db0 28 70 32 2c 20 26 69 32 2c 20 26 69 52 6f 77 69  (p2, &i2, &iRowi
22dc0 64 32 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  d2);.    }.  }..
22dd0 20 20 66 74 73 35 42 75 66 66 65 72 53 77 61 70    fts5BufferSwap
22de0 28 26 6f 75 74 2c 20 70 31 29 3b 0a 20 20 66 74  (&out, p1);.  ft
22df0 73 35 42 75 66 66 65 72 46 72 65 65 28 26 6f 75  s5BufferFree(&ou
22e00 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42 75 66  t);.}../*.** Buf
22e10 66 65 72 73 20 70 31 20 61 6e 64 20 70 32 20 63  fers p1 and p2 c
22e20 6f 6e 74 61 69 6e 20 64 6f 63 6c 69 73 74 73 2e  ontain doclists.
22e30 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d   This function m
22e40 65 72 67 65 73 20 74 68 65 20 63 6f 6e 74 65 6e  erges the conten
22e50 74 0a 2a 2a 20 6f 66 20 74 68 65 20 74 77 6f 20  t.** of the two 
22e60 64 6f 63 6c 69 73 74 73 20 74 6f 67 65 74 68 65  doclists togethe
22e70 72 20 61 6e 64 20 73 65 74 73 20 62 75 66 66 65  r and sets buffe
22e80 72 20 70 31 20 74 6f 20 74 68 65 20 72 65 73 75  r p1 to the resu
22e90 6c 74 20 62 65 66 6f 72 65 0a 2a 2a 20 72 65 74  lt before.** ret
22ea0 75 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 66  urning..**.** If
22eb0 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
22ec0 2c 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20  , an error code 
22ed0 69 73 20 6c 65 66 74 20 69 6e 20 70 2d 3e 72 63  is left in p->rc
22ee0 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20 68 61  . If an error ha
22ef0 73 0a 2a 2a 20 61 6c 72 65 61 64 79 20 6f 63 63  s.** already occ
22f00 75 72 72 65 64 2c 20 74 68 69 73 20 66 75 6e 63  urred, this func
22f10 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  tion is a no-op.
22f20 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
22f30 66 74 73 35 4d 65 72 67 65 50 72 65 66 69 78 4c  fts5MergePrefixL
22f40 69 73 74 73 28 0a 20 20 46 74 73 35 49 6e 64 65  ists(.  Fts5Inde
22f50 78 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  x *p,           
22f60 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53 35 20          /* FTS5 
22f70 62 61 63 6b 65 6e 64 20 6f 62 6a 65 63 74 20 2a  backend object *
22f80 2f 0a 20 20 46 74 73 35 42 75 66 66 65 72 20 2a  /.  Fts5Buffer *
22f90 70 31 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  p1,             
22fa0 20 20 20 20 2f 2a 20 46 69 72 73 74 20 6c 69 73      /* First lis
22fb0 74 20 74 6f 20 6d 65 72 67 65 20 2a 2f 0a 20 20  t to merge */.  
22fc0 46 74 73 35 42 75 66 66 65 72 20 2a 70 32 20 20  Fts5Buffer *p2  
22fd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22fe0 2f 2a 20 53 65 63 6f 6e 64 20 6c 69 73 74 20 74  /* Second list t
22ff0 6f 20 6d 65 72 67 65 20 2a 2f 0a 29 7b 0a 20 20  o merge */.){.  
23000 69 66 28 20 70 32 2d 3e 6e 20 29 7b 0a 20 20 20  if( p2->n ){.   
23010 20 69 36 34 20 69 4c 61 73 74 52 6f 77 69 64 20   i64 iLastRowid 
23020 3d 20 30 3b 0a 20 20 20 20 46 74 73 35 44 6f 63  = 0;.    Fts5Doc
23030 6c 69 73 74 49 74 65 72 20 69 31 3b 0a 20 20 20  listIter i1;.   
23040 20 46 74 73 35 44 6f 63 6c 69 73 74 49 74 65 72   Fts5DoclistIter
23050 20 69 32 3b 0a 20 20 20 20 46 74 73 35 42 75 66   i2;.    Fts5Buf
23060 66 65 72 20 6f 75 74 3b 0a 20 20 20 20 46 74 73  fer out;.    Fts
23070 35 42 75 66 66 65 72 20 74 6d 70 3b 0a 20 20 20  5Buffer tmp;.   
23080 20 6d 65 6d 73 65 74 28 26 6f 75 74 2c 20 30 2c   memset(&out, 0,
23090 20 73 69 7a 65 6f 66 28 6f 75 74 29 29 3b 0a 20   sizeof(out));. 
230a0 20 20 20 6d 65 6d 73 65 74 28 26 74 6d 70 2c 20     memset(&tmp, 
230b0 30 2c 20 73 69 7a 65 6f 66 28 74 6d 70 29 29 3b  0, sizeof(tmp));
230c0 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 46 74 73  ..    sqlite3Fts
230d0 35 42 75 66 66 65 72 53 69 7a 65 28 26 70 2d 3e  5BufferSize(&p->
230e0 72 63 2c 20 26 6f 75 74 2c 20 70 31 2d 3e 6e 20  rc, &out, p1->n 
230f0 2b 20 70 32 2d 3e 6e 29 3b 0a 20 20 20 20 66 74  + p2->n);.    ft
23100 73 35 44 6f 63 6c 69 73 74 49 74 65 72 49 6e 69  s5DoclistIterIni
23110 74 28 70 31 2c 20 26 69 31 29 3b 0a 20 20 20 20  t(p1, &i1);.    
23120 66 74 73 35 44 6f 63 6c 69 73 74 49 74 65 72 49  fts5DoclistIterI
23130 6e 69 74 28 70 32 2c 20 26 69 32 29 3b 0a 20 20  nit(p2, &i2);.  
23140 20 20 77 68 69 6c 65 28 20 70 2d 3e 72 63 3d 3d    while( p->rc==
23150 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 28 69 31  SQLITE_OK && (i1
23160 2e 61 50 6f 73 6c 69 73 74 21 3d 30 20 7c 7c 20  .aPoslist!=0 || 
23170 69 32 2e 61 50 6f 73 6c 69 73 74 21 3d 30 29 20  i2.aPoslist!=0) 
23180 29 7b 0a 20 20 20 20 20 20 69 66 28 20 69 32 2e  ){.      if( i2.
23190 61 50 6f 73 6c 69 73 74 3d 3d 30 20 7c 7c 20 28  aPoslist==0 || (
231a0 69 31 2e 61 50 6f 73 6c 69 73 74 20 26 26 20 69  i1.aPoslist && i
231b0 31 2e 69 52 6f 77 69 64 3c 69 32 2e 69 52 6f 77  1.iRowid<i2.iRow
231c0 69 64 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  id) ){.        /
231d0 2a 20 43 6f 70 79 20 65 6e 74 72 79 20 66 72 6f  * Copy entry fro
231e0 6d 20 69 31 20 2a 2f 0a 20 20 20 20 20 20 20 20  m i1 */.        
231f0 66 74 73 35 4d 65 72 67 65 41 70 70 65 6e 64 44  fts5MergeAppendD
23200 6f 63 69 64 28 26 6f 75 74 2c 20 69 4c 61 73 74  ocid(&out, iLast
23210 52 6f 77 69 64 2c 20 69 31 2e 69 52 6f 77 69 64  Rowid, i1.iRowid
23220 29 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35 42  );.        fts5B
23230 75 66 66 65 72 53 61 66 65 41 70 70 65 6e 64 42  ufferSafeAppendB
23240 6c 6f 62 28 26 6f 75 74 2c 20 69 31 2e 61 50 6f  lob(&out, i1.aPo
23250 73 6c 69 73 74 2c 20 69 31 2e 6e 50 6f 73 6c 69  slist, i1.nPosli
23260 73 74 2b 69 31 2e 6e 53 69 7a 65 29 3b 0a 20 20  st+i1.nSize);.  
23270 20 20 20 20 20 20 66 74 73 35 44 6f 63 6c 69 73        fts5Doclis
23280 74 49 74 65 72 4e 65 78 74 28 26 69 31 29 3b 0a  tIterNext(&i1);.
23290 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 65 6c        }.      el
232a0 73 65 20 69 66 28 20 69 31 2e 61 50 6f 73 6c 69  se if( i1.aPosli
232b0 73 74 3d 3d 30 20 7c 7c 20 69 32 2e 69 52 6f 77  st==0 || i2.iRow
232c0 69 64 21 3d 69 31 2e 69 52 6f 77 69 64 20 29 7b  id!=i1.iRowid ){
232d0 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 70 79  .        /* Copy
232e0 20 65 6e 74 72 79 20 66 72 6f 6d 20 69 32 20 2a   entry from i2 *
232f0 2f 0a 20 20 20 20 20 20 20 20 66 74 73 35 4d 65  /.        fts5Me
23300 72 67 65 41 70 70 65 6e 64 44 6f 63 69 64 28 26  rgeAppendDocid(&
23310 6f 75 74 2c 20 69 4c 61 73 74 52 6f 77 69 64 2c  out, iLastRowid,
23320 20 69 32 2e 69 52 6f 77 69 64 29 3b 0a 20 20 20   i2.iRowid);.   
23330 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72 53       fts5BufferS
23340 61 66 65 41 70 70 65 6e 64 42 6c 6f 62 28 26 6f  afeAppendBlob(&o
23350 75 74 2c 20 69 32 2e 61 50 6f 73 6c 69 73 74 2c  ut, i2.aPoslist,
23360 20 69 32 2e 6e 50 6f 73 6c 69 73 74 2b 69 32 2e   i2.nPoslist+i2.
23370 6e 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 20 20  nSize);.        
23380 66 74 73 35 44 6f 63 6c 69 73 74 49 74 65 72 4e  fts5DoclistIterN
23390 65 78 74 28 26 69 32 29 3b 0a 20 20 20 20 20 20  ext(&i2);.      
233a0 7d 0a 20 20 20 20 20 20 65 6c 73 65 7b 0a 20 20  }.      else{.  
233b0 20 20 20 20 20 20 69 36 34 20 69 50 6f 73 31 20        i64 iPos1 
233c0 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 69 36 34  = 0;.        i64
233d0 20 69 50 6f 73 32 20 3d 20 30 3b 0a 20 20 20 20   iPos2 = 0;.    
233e0 20 20 20 20 69 6e 74 20 69 4f 66 66 31 20 3d 20      int iOff1 = 
233f0 30 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69  0;.        int i
23400 4f 66 66 32 20 3d 20 30 3b 0a 20 20 20 20 20 20  Off2 = 0;.      
23410 20 20 75 38 20 2a 61 31 20 3d 20 26 69 31 2e 61    u8 *a1 = &i1.a
23420 50 6f 73 6c 69 73 74 5b 69 31 2e 6e 53 69 7a 65  Poslist[i1.nSize
23430 5d 3b 0a 20 20 20 20 20 20 20 20 75 38 20 2a 61  ];.        u8 *a
23440 32 20 3d 20 26 69 32 2e 61 50 6f 73 6c 69 73 74  2 = &i2.aPoslist
23450 5b 69 32 2e 6e 53 69 7a 65 5d 3b 0a 0a 20 20 20  [i2.nSize];..   
23460 20 20 20 20 20 46 74 73 35 50 6f 73 6c 69 73 74       Fts5Poslist
23470 57 72 69 74 65 72 20 77 72 69 74 65 72 3b 0a 20  Writer writer;. 
23480 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28 26 77         memset(&w
23490 72 69 74 65 72 2c 20 30 2c 20 73 69 7a 65 6f 66  riter, 0, sizeof
234a0 28 77 72 69 74 65 72 29 29 3b 0a 0a 20 20 20 20  (writer));..    
234b0 20 20 20 20 2f 2a 20 4d 65 72 67 65 20 74 68 65      /* Merge the
234c0 20 74 77 6f 20 70 6f 73 69 74 69 6f 6e 20 6c 69   two position li
234d0 73 74 73 2e 20 2a 2f 20 0a 20 20 20 20 20 20 20  sts. */ .       
234e0 20 66 74 73 35 4d 65 72 67 65 41 70 70 65 6e 64   fts5MergeAppend
234f0 44 6f 63 69 64 28 26 6f 75 74 2c 20 69 4c 61 73  Docid(&out, iLas
23500 74 52 6f 77 69 64 2c 20 69 32 2e 69 52 6f 77 69  tRowid, i2.iRowi
23510 64 29 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35  d);.        fts5
23520 42 75 66 66 65 72 5a 65 72 6f 28 26 74 6d 70 29  BufferZero(&tmp)
23530 3b 0a 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ;..        sqlit
23540 65 33 46 74 73 35 50 6f 73 6c 69 73 74 4e 65 78  e3Fts5PoslistNex
23550 74 36 34 28 61 31 2c 20 69 31 2e 6e 50 6f 73 6c  t64(a1, i1.nPosl
23560 69 73 74 2c 20 26 69 4f 66 66 31 2c 20 26 69 50  ist, &iOff1, &iP
23570 6f 73 31 29 3b 0a 20 20 20 20 20 20 20 20 73 71  os1);.        sq
23580 6c 69 74 65 33 46 74 73 35 50 6f 73 6c 69 73 74  lite3Fts5Poslist
23590 4e 65 78 74 36 34 28 61 32 2c 20 69 32 2e 6e 50  Next64(a2, i2.nP
235a0 6f 73 6c 69 73 74 2c 20 26 69 4f 66 66 32 2c 20  oslist, &iOff2, 
235b0 26 69 50 6f 73 32 29 3b 0a 0a 20 20 20 20 20 20  &iPos2);..      
235c0 20 20 77 68 69 6c 65 28 20 70 2d 3e 72 63 3d 3d    while( p->rc==
235d0 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 28 69 50  SQLITE_OK && (iP
235e0 6f 73 31 3e 3d 30 20 7c 7c 20 69 50 6f 73 32 3e  os1>=0 || iPos2>
235f0 3d 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  =0) ){.         
23600 20 69 36 34 20 69 4e 65 77 3b 0a 20 20 20 20 20   i64 iNew;.     
23610 20 20 20 20 20 69 66 28 20 69 50 6f 73 32 3c 30       if( iPos2<0
23620 20 7c 7c 20 28 69 50 6f 73 31 3e 3d 30 20 26 26   || (iPos1>=0 &&
23630 20 69 50 6f 73 31 3c 69 50 6f 73 32 29 20 29 7b   iPos1<iPos2) ){
23640 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 4e 65  .            iNe
23650 77 20 3d 20 69 50 6f 73 31 3b 0a 20 20 20 20 20  w = iPos1;.     
23660 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 46 74         sqlite3Ft
23670 73 35 50 6f 73 6c 69 73 74 4e 65 78 74 36 34 28  s5PoslistNext64(
23680 61 31 2c 20 69 31 2e 6e 50 6f 73 6c 69 73 74 2c  a1, i1.nPoslist,
23690 20 26 69 4f 66 66 31 2c 20 26 69 50 6f 73 31 29   &iOff1, &iPos1)
236a0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73  ;.          }els
236b0 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  e{.            i
236c0 4e 65 77 20 3d 20 69 50 6f 73 32 3b 0a 20 20 20  New = iPos2;.   
236d0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
236e0 46 74 73 35 50 6f 73 6c 69 73 74 4e 65 78 74 36  Fts5PoslistNext6
236f0 34 28 61 32 2c 20 69 32 2e 6e 50 6f 73 6c 69 73  4(a2, i2.nPoslis
23700 74 2c 20 26 69 4f 66 66 32 2c 20 26 69 50 6f 73  t, &iOff2, &iPos
23710 32 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  2);.            
23720 69 66 28 20 69 50 6f 73 31 3d 3d 69 50 6f 73 32  if( iPos1==iPos2
23730 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
23740 20 20 73 71 6c 69 74 65 33 46 74 73 35 50 6f 73    sqlite3Fts5Pos
23750 6c 69 73 74 4e 65 78 74 36 34 28 61 31 2c 20 69  listNext64(a1, i
23760 31 2e 6e 50 6f 73 6c 69 73 74 2c 20 26 69 4f 66  1.nPoslist, &iOf
23770 66 31 2c 26 69 50 6f 73 31 29 3b 0a 20 20 20 20  f1,&iPos1);.    
23780 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
23790 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
237a0 69 66 28 20 69 4e 65 77 21 3d 77 72 69 74 65 72  if( iNew!=writer
237b0 2e 69 50 72 65 76 20 7c 7c 20 74 6d 70 2e 6e 3d  .iPrev || tmp.n=
237c0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
237d0 20 20 70 2d 3e 72 63 20 3d 20 73 71 6c 69 74 65    p->rc = sqlite
237e0 33 46 74 73 35 50 6f 73 6c 69 73 74 57 72 69 74  3Fts5PoslistWrit
237f0 65 72 41 70 70 65 6e 64 28 26 74 6d 70 2c 20 26  erAppend(&tmp, &
23800 77 72 69 74 65 72 2c 20 69 4e 65 77 29 3b 0a 20  writer, iNew);. 
23810 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
23820 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a     }..        /*
23830 20 57 52 49 54 45 50 4f 53 4c 49 53 54 53 49 5a   WRITEPOSLISTSIZ
23840 45 20 2a 2f 0a 20 20 20 20 20 20 20 20 66 74 73  E */.        fts
23850 35 42 75 66 66 65 72 53 61 66 65 41 70 70 65 6e  5BufferSafeAppen
23860 64 56 61 72 69 6e 74 28 26 6f 75 74 2c 20 74 6d  dVarint(&out, tm
23870 70 2e 6e 20 2a 20 32 29 3b 0a 20 20 20 20 20 20  p.n * 2);.      
23880 20 20 66 74 73 35 42 75 66 66 65 72 53 61 66 65    fts5BufferSafe
23890 41 70 70 65 6e 64 42 6c 6f 62 28 26 6f 75 74 2c  AppendBlob(&out,
238a0 20 74 6d 70 2e 70 2c 20 74 6d 70 2e 6e 29 3b 0a   tmp.p, tmp.n);.
238b0 20 20 20 20 20 20 20 20 66 74 73 35 44 6f 63 6c          fts5Docl
238c0 69 73 74 49 74 65 72 4e 65 78 74 28 26 69 31 29  istIterNext(&i1)
238d0 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35 44 6f  ;.        fts5Do
238e0 63 6c 69 73 74 49 74 65 72 4e 65 78 74 28 26 69  clistIterNext(&i
238f0 32 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  2);.      }.    
23900 7d 0a 0a 20 20 20 20 66 74 73 35 42 75 66 66 65  }..    fts5Buffe
23910 72 53 65 74 28 26 70 2d 3e 72 63 2c 20 70 31 2c  rSet(&p->rc, p1,
23920 20 6f 75 74 2e 6e 2c 20 6f 75 74 2e 70 29 3b 0a   out.n, out.p);.
23930 20 20 20 20 66 74 73 35 42 75 66 66 65 72 46 72      fts5BufferFr
23940 65 65 28 26 74 6d 70 29 3b 0a 20 20 20 20 66 74  ee(&tmp);.    ft
23950 73 35 42 75 66 66 65 72 46 72 65 65 28 26 6f 75  s5BufferFree(&ou
23960 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69  t);.  }.}..stati
23970 63 20 76 6f 69 64 20 66 74 73 35 53 65 74 75 70  c void fts5Setup
23980 50 72 65 66 69 78 49 74 65 72 28 0a 20 20 46 74  PrefixIter(.  Ft
23990 73 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20  s5Index *p,     
239a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
239b0 20 49 6e 64 65 78 20 74 6f 20 72 65 61 64 20 66   Index to read f
239c0 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20 62 44 65  rom */.  int bDe
239d0 73 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  sc,             
239e0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
239f0 20 66 6f 72 20 22 4f 52 44 45 52 20 42 59 20 72   for "ORDER BY r
23a00 6f 77 69 64 20 44 45 53 43 22 20 2a 2f 0a 20 20  owid DESC" */.  
23a10 63 6f 6e 73 74 20 75 38 20 2a 70 54 6f 6b 65 6e  const u8 *pToken
23a20 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
23a30 2f 2a 20 42 75 66 66 65 72 20 63 6f 6e 74 61 69  /* Buffer contai
23a40 6e 69 6e 67 20 70 72 65 66 69 78 20 74 6f 20 6d  ning prefix to m
23a50 61 74 63 68 20 2a 2f 0a 20 20 69 6e 74 20 6e 54  atch */.  int nT
23a60 6f 6b 65 6e 2c 20 20 20 20 20 20 20 20 20 20 20  oken,           
23a70 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
23a80 65 20 6f 66 20 62 75 66 66 65 72 20 70 54 6f 6b  e of buffer pTok
23a90 65 6e 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20  en in bytes */. 
23aa0 20 46 74 73 35 43 6f 6c 73 65 74 20 2a 70 43 6f   Fts5Colset *pCo
23ab0 6c 73 65 74 2c 20 20 20 20 20 20 20 20 20 20 20  lset,           
23ac0 20 2f 2a 20 52 65 73 74 72 69 63 74 20 6d 61 74   /* Restrict mat
23ad0 63 68 65 73 20 74 6f 20 74 68 65 73 65 20 63 6f  ches to these co
23ae0 6c 75 6d 6e 73 20 2a 2f 0a 20 20 46 74 73 35 49  lumns */.  Fts5I
23af0 6e 64 65 78 49 74 65 72 20 2a 2a 70 70 49 74 65  ndexIter **ppIte
23b00 72 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55  r          /* OU
23b10 54 3a 20 4e 65 77 20 69 74 65 72 61 74 6f 72 20  T: New iterator 
23b20 2a 2f 0a 29 7b 0a 20 20 46 74 73 35 53 74 72 75  */.){.  Fts5Stru
23b30 63 74 75 72 65 20 2a 70 53 74 72 75 63 74 3b 0a  cture *pStruct;.
23b40 20 20 46 74 73 35 42 75 66 66 65 72 20 2a 61 42    Fts5Buffer *aB
23b50 75 66 3b 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20  uf;.  const int 
23b60 6e 42 75 66 20 3d 20 33 32 3b 0a 0a 20 20 76 6f  nBuf = 32;..  vo
23b70 69 64 20 28 2a 78 4d 65 72 67 65 29 28 46 74 73  id (*xMerge)(Fts
23b80 35 49 6e 64 65 78 2a 2c 20 46 74 73 35 42 75 66  5Index*, Fts5Buf
23b90 66 65 72 2a 2c 20 46 74 73 35 42 75 66 66 65 72  fer*, Fts5Buffer
23ba0 2a 29 3b 0a 20 20 69 6e 74 20 28 2a 78 41 70 70  *);.  int (*xApp
23bb0 65 6e 64 29 28 46 74 73 35 49 6e 64 65 78 2a 2c  end)(Fts5Index*,
23bc0 20 69 36 34 2c 20 46 74 73 35 49 6e 64 65 78 49   i64, Fts5IndexI
23bd0 74 65 72 2a 2c 20 46 74 73 35 43 6f 6c 73 65 74  ter*, Fts5Colset
23be0 2a 2c 20 46 74 73 35 42 75 66 66 65 72 2a 29 3b  *, Fts5Buffer*);
23bf0 0a 20 20 69 66 28 20 70 2d 3e 70 43 6f 6e 66 69  .  if( p->pConfi
23c00 67 2d 3e 65 44 65 74 61 69 6c 3d 3d 46 54 53 35  g->eDetail==FTS5
23c10 5f 44 45 54 41 49 4c 5f 4e 4f 4e 45 20 29 7b 0a  _DETAIL_NONE ){.
23c20 20 20 20 20 78 4d 65 72 67 65 20 3d 20 66 74 73      xMerge = fts
23c30 35 4d 65 72 67 65 52 6f 77 69 64 4c 69 73 74 73  5MergeRowidLists
23c40 3b 0a 20 20 20 20 78 41 70 70 65 6e 64 20 3d 20  ;.    xAppend = 
23c50 66 74 73 35 41 70 70 65 6e 64 52 6f 77 69 64 3b  fts5AppendRowid;
23c60 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 78 4d  .  }else{.    xM
23c70 65 72 67 65 20 3d 20 66 74 73 35 4d 65 72 67 65  erge = fts5Merge
23c80 50 72 65 66 69 78 4c 69 73 74 73 3b 0a 20 20 20  PrefixLists;.   
23c90 20 78 41 70 70 65 6e 64 20 3d 20 66 74 73 35 41   xAppend = fts5A
23ca0 70 70 65 6e 64 50 6f 73 6c 69 73 74 3b 0a 20 20  ppendPoslist;.  
23cb0 7d 0a 0a 20 20 61 42 75 66 20 3d 20 28 46 74 73  }..  aBuf = (Fts
23cc0 35 42 75 66 66 65 72 2a 29 66 74 73 35 49 64 78  5Buffer*)fts5Idx
23cd0 4d 61 6c 6c 6f 63 28 70 2c 20 73 69 7a 65 6f 66  Malloc(p, sizeof
23ce0 28 46 74 73 35 42 75 66 66 65 72 29 2a 6e 42 75  (Fts5Buffer)*nBu
23cf0 66 29 3b 0a 20 20 70 53 74 72 75 63 74 20 3d 20  f);.  pStruct = 
23d00 66 74 73 35 53 74 72 75 63 74 75 72 65 52 65 61  fts5StructureRea
23d10 64 28 70 29 3b 0a 0a 20 20 69 66 28 20 61 42 75  d(p);..  if( aBu
23d20 66 20 26 26 20 70 53 74 72 75 63 74 20 29 7b 0a  f && pStruct ){.
23d30 20 20 20 20 63 6f 6e 73 74 20 69 6e 74 20 66 6c      const int fl
23d40 61 67 73 20 3d 20 46 54 53 35 49 4e 44 45 58 5f  ags = FTS5INDEX_
23d50 51 55 45 52 59 5f 53 43 41 4e 3b 0a 20 20 20 20  QUERY_SCAN;.    
23d60 69 6e 74 20 69 3b 0a 20 20 20 20 69 36 34 20 69  int i;.    i64 i
23d70 4c 61 73 74 52 6f 77 69 64 20 3d 20 30 3b 0a 20  LastRowid = 0;. 
23d80 20 20 20 46 74 73 35 49 6e 64 65 78 49 74 65 72     Fts5IndexIter
23d90 20 2a 70 31 20 3d 20 30 3b 20 20 20 20 20 2f 2a   *p1 = 0;     /*
23da0 20 49 74 65 72 61 74 6f 72 20 75 73 65 64 20 74   Iterator used t
23db0 6f 20 67 61 74 68 65 72 20 64 61 74 61 20 66 72  o gather data fr
23dc0 6f 6d 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20  om index */.    
23dd0 46 74 73 35 44 61 74 61 20 2a 70 44 61 74 61 3b  Fts5Data *pData;
23de0 0a 20 20 20 20 46 74 73 35 42 75 66 66 65 72 20  .    Fts5Buffer 
23df0 64 6f 63 6c 69 73 74 3b 0a 20 20 20 20 69 6e 74  doclist;.    int
23e00 20 62 4e 65 77 54 65 72 6d 20 3d 20 31 3b 0a 0a   bNewTerm = 1;..
23e10 20 20 20 20 6d 65 6d 73 65 74 28 26 64 6f 63 6c      memset(&docl
23e20 69 73 74 2c 20 30 2c 20 73 69 7a 65 6f 66 28 64  ist, 0, sizeof(d
23e30 6f 63 6c 69 73 74 29 29 3b 0a 20 20 20 20 66 6f  oclist));.    fo
23e40 72 28 66 74 73 35 4d 75 6c 74 69 49 74 65 72 4e  r(fts5MultiIterN
23e50 65 77 28 70 2c 20 70 53 74 72 75 63 74 2c 20 31  ew(p, pStruct, 1
23e60 2c 20 66 6c 61 67 73 2c 20 70 54 6f 6b 65 6e 2c  , flags, pToken,
23e70 20 6e 54 6f 6b 65 6e 2c 20 2d 31 2c 20 30 2c 20   nToken, -1, 0, 
23e80 26 70 31 29 3b 0a 20 20 20 20 20 20 20 20 66 74  &p1);.        ft
23e90 73 35 4d 75 6c 74 69 49 74 65 72 45 6f 66 28 70  s5MultiIterEof(p
23ea0 2c 20 70 31 29 3d 3d 30 3b 0a 20 20 20 20 20 20  , p1)==0;.      
23eb0 20 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 4e    fts5MultiIterN
23ec0 65 78 74 32 28 70 2c 20 70 31 2c 20 26 62 4e 65  ext2(p, p1, &bNe
23ed0 77 54 65 72 6d 29 0a 20 20 20 20 29 7b 0a 20 20  wTerm).    ){.  
23ee0 20 20 20 20 69 36 34 20 69 52 6f 77 69 64 20 3d      i64 iRowid =
23ef0 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 52 6f   fts5MultiIterRo
23f00 77 69 64 28 70 31 29 3b 0a 20 20 20 20 20 20 69  wid(p1);.      i
23f10 6e 74 20 6e 54 65 72 6d 3b 0a 20 20 20 20 20 20  nt nTerm;.      
23f20 63 6f 6e 73 74 20 75 38 20 2a 70 54 65 72 6d 20  const u8 *pTerm 
23f30 3d 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 54  = fts5MultiIterT
23f40 65 72 6d 28 70 31 2c 20 26 6e 54 65 72 6d 29 3b  erm(p1, &nTerm);
23f50 0a 20 20 20 20 20 20 61 73 73 65 72 74 5f 6e 63  .      assert_nc
23f60 28 20 6d 65 6d 63 6d 70 28 70 54 6f 6b 65 6e 2c  ( memcmp(pToken,
23f70 20 70 54 65 72 6d 2c 20 4d 49 4e 28 6e 54 6f 6b   pTerm, MIN(nTok
23f80 65 6e 2c 20 6e 54 65 72 6d 29 29 3c 3d 30 20 29  en, nTerm))<=0 )
23f90 3b 0a 20 20 20 20 20 20 69 66 28 20 62 4e 65 77  ;.      if( bNew
23fa0 54 65 72 6d 20 29 7b 0a 20 20 20 20 20 20 20 20  Term ){.        
23fb0 69 66 28 20 6e 54 65 72 6d 3c 6e 54 6f 6b 65 6e  if( nTerm<nToken
23fc0 20 7c 7c 20 6d 65 6d 63 6d 70 28 70 54 6f 6b 65   || memcmp(pToke
23fd0 6e 2c 20 70 54 65 72 6d 2c 20 6e 54 6f 6b 65 6e  n, pTerm, nToken
23fe0 29 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  ) ) break;.     
23ff0 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 64 6f   }..      if( do
24000 63 6c 69 73 74 2e 6e 3e 30 20 26 26 20 69 52 6f  clist.n>0 && iRo
24010 77 69 64 3c 3d 69 4c 61 73 74 52 6f 77 69 64 20  wid<=iLastRowid 
24020 29 7b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69  ){.        for(i
24030 3d 30 3b 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  =0; p->rc==SQLIT
24040 45 5f 4f 4b 20 26 26 20 64 6f 63 6c 69 73 74 2e  E_OK && doclist.
24050 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  n; i++){.       
24060 20 20 20 61 73 73 65 72 74 28 20 69 3c 6e 42 75     assert( i<nBu
24070 66 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  f );.          i
24080 66 28 20 61 42 75 66 5b 69 5d 2e 6e 3d 3d 30 20  f( aBuf[i].n==0 
24090 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 66  ){.            f
240a0 74 73 35 42 75 66 66 65 72 53 77 61 70 28 26 64  ts5BufferSwap(&d
240b0 6f 63 6c 69 73 74 2c 20 26 61 42 75 66 5b 69 5d  oclist, &aBuf[i]
240c0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 66  );.            f
240d0 74 73 35 42 75 66 66 65 72 5a 65 72 6f 28 26 64  ts5BufferZero(&d
240e0 6f 63 6c 69 73 74 29 3b 0a 20 20 20 20 20 20 20  oclist);.       
240f0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
24100 20 20 20 20 20 20 78 4d 65 72 67 65 28 70 2c 20        xMerge(p, 
24110 26 64 6f 63 6c 69 73 74 2c 20 26 61 42 75 66 5b  &doclist, &aBuf[
24120 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  i]);.           
24130 20 66 74 73 35 42 75 66 66 65 72 5a 65 72 6f 28   fts5BufferZero(
24140 26 61 42 75 66 5b 69 5d 29 3b 0a 20 20 20 20 20  &aBuf[i]);.     
24150 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
24160 0a 20 20 20 20 20 20 20 20 69 4c 61 73 74 52 6f  .        iLastRo
24170 77 69 64 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  wid = 0;.      }
24180 0a 0a 20 20 20 20 20 20 69 66 28 20 21 78 41 70  ..      if( !xAp
24190 70 65 6e 64 28 70 2c 20 69 52 6f 77 69 64 2d 69  pend(p, iRowid-i
241a0 4c 61 73 74 52 6f 77 69 64 2c 20 70 31 2c 20 70  LastRowid, p1, p
241b0 43 6f 6c 73 65 74 2c 20 26 64 6f 63 6c 69 73 74  Colset, &doclist
241c0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69 4c 61  ) ){.        iLa
241d0 73 74 52 6f 77 69 64 20 3d 20 69 52 6f 77 69 64  stRowid = iRowid
241e0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
241f0 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
24200 6e 42 75 66 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nBuf; i++){.    
24210 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c    if( p->rc==SQL
24220 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
24230 20 20 78 4d 65 72 67 65 28 70 2c 20 26 64 6f 63    xMerge(p, &doc
24240 6c 69 73 74 2c 20 26 61 42 75 66 5b 69 5d 29 3b  list, &aBuf[i]);
24250 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66  .      }.      f
24260 74 73 35 42 75 66 66 65 72 46 72 65 65 28 26 61  ts5BufferFree(&a
24270 42 75 66 5b 69 5d 29 3b 0a 20 20 20 20 7d 0a 20  Buf[i]);.    }. 
24280 20 20 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72     fts5MultiIter
24290 46 72 65 65 28 70 2c 20 70 31 29 3b 0a 0a 20 20  Free(p, p1);..  
242a0 20 20 70 44 61 74 61 20 3d 20 66 74 73 35 49 64    pData = fts5Id
242b0 78 4d 61 6c 6c 6f 63 28 70 2c 20 73 69 7a 65 6f  xMalloc(p, sizeo
242c0 66 28 46 74 73 35 44 61 74 61 29 20 2b 20 64 6f  f(Fts5Data) + do
242d0 63 6c 69 73 74 2e 6e 29 3b 0a 20 20 20 20 69 66  clist.n);.    if
242e0 28 20 70 44 61 74 61 20 29 7b 0a 20 20 20 20 20  ( pData ){.     
242f0 20 70 44 61 74 61 2d 3e 70 20 3d 20 28 75 38 2a   pData->p = (u8*
24300 29 26 70 44 61 74 61 5b 31 5d 3b 0a 20 20 20 20  )&pData[1];.    
24310 20 20 70 44 61 74 61 2d 3e 6e 6e 20 3d 20 70 44    pData->nn = pD
24320 61 74 61 2d 3e 73 7a 4c 65 61 66 20 3d 20 64 6f  ata->szLeaf = do
24330 63 6c 69 73 74 2e 6e 3b 0a 20 20 20 20 20 20 6d  clist.n;.      m
24340 65 6d 63 70 79 28 70 44 61 74 61 2d 3e 70 2c 20  emcpy(pData->p, 
24350 64 6f 63 6c 69 73 74 2e 70 2c 20 64 6f 63 6c 69  doclist.p, docli
24360 73 74 2e 6e 29 3b 0a 20 20 20 20 20 20 66 74 73  st.n);.      fts
24370 35 4d 75 6c 74 69 49 74 65 72 4e 65 77 32 28 70  5MultiIterNew2(p
24380 2c 20 70 44 61 74 61 2c 20 62 44 65 73 63 2c 20  , pData, bDesc, 
24390 70 70 49 74 65 72 29 3b 0a 20 20 20 20 7d 0a 20  ppIter);.    }. 
243a0 20 20 20 66 74 73 35 42 75 66 66 65 72 46 72 65     fts5BufferFre
243b0 65 28 26 64 6f 63 6c 69 73 74 29 3b 0a 20 20 7d  e(&doclist);.  }
243c0 0a 0a 20 20 66 74 73 35 53 74 72 75 63 74 75 72  ..  fts5Structur
243d0 65 52 65 6c 65 61 73 65 28 70 53 74 72 75 63 74  eRelease(pStruct
243e0 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  );.  sqlite3_fre
243f0 65 28 61 42 75 66 29 3b 0a 7d 0a 0a 0a 2f 2a 0a  e(aBuf);.}.../*.
24400 2a 2a 20 49 6e 64 69 63 61 74 65 20 74 68 61 74  ** Indicate that
24410 20 61 6c 6c 20 73 75 62 73 65 71 75 65 6e 74 20   all subsequent 
24420 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65 33  calls to sqlite3
24430 46 74 73 35 49 6e 64 65 78 57 72 69 74 65 28 29  Fts5IndexWrite()
24440 20 70 65 72 74 61 69 6e 0a 2a 2a 20 74 6f 20 74   pertain.** to t
24450 68 65 20 64 6f 63 75 6d 65 6e 74 20 77 69 74 68  he document with
24460 20 72 6f 77 69 64 20 69 52 6f 77 69 64 2e 0a 2a   rowid iRowid..*
24470 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73  /.int sqlite3Fts
24480 35 49 6e 64 65 78 42 65 67 69 6e 57 72 69 74 65  5IndexBeginWrite
24490 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 69  (Fts5Index *p, i
244a0 6e 74 20 62 44 65 6c 65 74 65 2c 20 69 36 34 20  nt bDelete, i64 
244b0 69 52 6f 77 69 64 29 7b 0a 20 20 61 73 73 65 72  iRowid){.  asser
244c0 74 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  t( p->rc==SQLITE
244d0 5f 4f 4b 20 29 3b 0a 0a 20 20 2f 2a 20 41 6c 6c  _OK );..  /* All
244e0 6f 63 61 74 65 20 74 68 65 20 68 61 73 68 20 74  ocate the hash t
244f0 61 62 6c 65 20 69 66 20 69 74 20 68 61 73 20 6e  able if it has n
24500 6f 74 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  ot already been 
24510 61 6c 6c 6f 63 61 74 65 64 20 2a 2f 0a 20 20 69  allocated */.  i
24520 66 28 20 70 2d 3e 70 48 61 73 68 3d 3d 30 20 29  f( p->pHash==0 )
24530 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 73 71  {.    p->rc = sq
24540 6c 69 74 65 33 46 74 73 35 48 61 73 68 4e 65 77  lite3Fts5HashNew
24550 28 70 2d 3e 70 43 6f 6e 66 69 67 2c 20 26 70 2d  (p->pConfig, &p-
24560 3e 70 48 61 73 68 2c 20 26 70 2d 3e 6e 50 65 6e  >pHash, &p->nPen
24570 64 69 6e 67 44 61 74 61 29 3b 0a 20 20 7d 0a 0a  dingData);.  }..
24580 20 20 2f 2a 20 46 6c 75 73 68 20 74 68 65 20 68    /* Flush the h
24590 61 73 68 20 74 61 62 6c 65 20 74 6f 20 64 69 73  ash table to dis
245a0 6b 20 69 66 20 72 65 71 75 69 72 65 64 20 2a 2f  k if required */
245b0 0a 20 20 69 66 28 20 69 52 6f 77 69 64 3c 70 2d  .  if( iRowid<p-
245c0 3e 69 57 72 69 74 65 52 6f 77 69 64 20 0a 20 20  >iWriteRowid .  
245d0 20 7c 7c 20 28 69 52 6f 77 69 64 3d 3d 70 2d 3e   || (iRowid==p->
245e0 69 57 72 69 74 65 52 6f 77 69 64 20 26 26 20 70  iWriteRowid && p
245f0 2d 3e 62 44 65 6c 65 74 65 3d 3d 30 29 0a 20 20  ->bDelete==0).  
24600 20 7c 7c 20 28 70 2d 3e 6e 50 65 6e 64 69 6e 67   || (p->nPending
24610 44 61 74 61 20 3e 20 70 2d 3e 70 43 6f 6e 66 69  Data > p->pConfi
24620 67 2d 3e 6e 48 61 73 68 53 69 7a 65 29 20 0a 20  g->nHashSize) . 
24630 20 29 7b 0a 20 20 20 20 66 74 73 35 49 6e 64 65   ){.    fts5Inde
24640 78 46 6c 75 73 68 28 70 29 3b 0a 20 20 7d 0a 0a  xFlush(p);.  }..
24650 20 20 70 2d 3e 69 57 72 69 74 65 52 6f 77 69 64    p->iWriteRowid
24660 20 3d 20 69 52 6f 77 69 64 3b 0a 20 20 70 2d 3e   = iRowid;.  p->
24670 62 44 65 6c 65 74 65 20 3d 20 62 44 65 6c 65 74  bDelete = bDelet
24680 65 3b 0a 20 20 72 65 74 75 72 6e 20 66 74 73 35  e;.  return fts5
24690 49 6e 64 65 78 52 65 74 75 72 6e 28 70 29 3b 0a  IndexReturn(p);.
246a0 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69 74 20  }../*.** Commit 
246b0 64 61 74 61 20 74 6f 20 64 69 73 6b 2e 0a 2a 2f  data to disk..*/
246c0 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35  .int sqlite3Fts5
246d0 49 6e 64 65 78 53 79 6e 63 28 46 74 73 35 49 6e  IndexSync(Fts5In
246e0 64 65 78 20 2a 70 2c 20 69 6e 74 20 62 43 6f 6d  dex *p, int bCom
246f0 6d 69 74 29 7b 0a 20 20 61 73 73 65 72 74 28 20  mit){.  assert( 
24700 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
24710 20 29 3b 0a 20 20 66 74 73 35 49 6e 64 65 78 46   );.  fts5IndexF
24720 6c 75 73 68 28 70 29 3b 0a 20 20 69 66 28 20 62  lush(p);.  if( b
24730 43 6f 6d 6d 69 74 20 29 20 66 74 73 35 43 6c 6f  Commit ) fts5Clo
24740 73 65 52 65 61 64 65 72 28 70 29 3b 0a 20 20 72  seReader(p);.  r
24750 65 74 75 72 6e 20 66 74 73 35 49 6e 64 65 78 52  eturn fts5IndexR
24760 65 74 75 72 6e 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a  eturn(p);.}../*.
24770 2a 2a 20 44 69 73 63 61 72 64 20 61 6e 79 20 64  ** Discard any d
24780 61 74 61 20 73 74 6f 72 65 64 20 69 6e 20 74 68  ata stored in th
24790 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 68 61 73 68  e in-memory hash
247a0 20 74 61 62 6c 65 73 2e 20 44 6f 20 6e 6f 74 20   tables. Do not 
247b0 77 72 69 74 65 20 69 74 0a 2a 2a 20 74 6f 20 74  write it.** to t
247c0 68 65 20 64 61 74 61 62 61 73 65 2e 20 41 64 64  he database. Add
247d0 69 74 69 6f 6e 61 6c 6c 79 2c 20 61 73 73 75 6d  itionally, assum
247e0 65 20 74 68 61 74 20 74 68 65 20 63 6f 6e 74 65  e that the conte
247f0 6e 74 73 20 6f 66 20 74 68 65 20 25 5f 64 61 74  nts of the %_dat
24800 61 0a 2a 2a 20 74 61 62 6c 65 20 6d 61 79 20 68  a.** table may h
24810 61 76 65 20 63 68 61 6e 67 65 64 20 6f 6e 20 64  ave changed on d
24820 69 73 6b 2e 20 53 6f 20 61 6e 79 20 69 6e 2d 6d  isk. So any in-m
24830 65 6d 6f 72 79 20 63 61 63 68 65 73 20 6f 66 20  emory caches of 
24840 25 5f 64 61 74 61 20 0a 2a 2a 20 72 65 63 6f 72  %_data .** recor
24850 64 73 20 6d 75 73 74 20 62 65 20 69 6e 76 61 6c  ds must be inval
24860 69 64 61 74 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73  idated..*/.int s
24870 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78 52  qlite3Fts5IndexR
24880 6f 6c 6c 62 61 63 6b 28 46 74 73 35 49 6e 64 65  ollback(Fts5Inde
24890 78 20 2a 70 29 7b 0a 20 20 66 74 73 35 43 6c 6f  x *p){.  fts5Clo
248a0 73 65 52 65 61 64 65 72 28 70 29 3b 0a 20 20 66  seReader(p);.  f
248b0 74 73 35 49 6e 64 65 78 44 69 73 63 61 72 64 44  ts5IndexDiscardD
248c0 61 74 61 28 70 29 3b 0a 20 20 61 73 73 65 72 74  ata(p);.  assert
248d0 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
248e0 4f 4b 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  OK );.  return S
248f0 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
24900 2a 2a 20 54 68 65 20 25 5f 64 61 74 61 20 74 61  ** The %_data ta
24910 62 6c 65 20 69 73 20 63 6f 6d 70 6c 65 74 65 6c  ble is completel
24920 79 20 65 6d 70 74 79 20 77 68 65 6e 20 74 68 69  y empty when thi
24930 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
24940 6c 6c 65 64 2e 20 54 68 69 73 0a 2a 2a 20 66 75  lled. This.** fu
24950 6e 63 74 69 6f 6e 20 70 6f 70 75 6c 61 74 65 73  nction populates
24960 20 69 74 20 77 69 74 68 20 74 68 65 20 69 6e 69   it with the ini
24970 74 69 61 6c 20 73 74 72 75 63 74 75 72 65 20 6f  tial structure o
24980 62 6a 65 63 74 73 20 66 6f 72 20 65 61 63 68 20  bjects for each 
24990 69 6e 64 65 78 2c 0a 2a 2a 20 61 6e 64 20 74 68  index,.** and th
249a0 65 20 69 6e 69 74 69 61 6c 20 76 65 72 73 69 6f  e initial versio
249b0 6e 20 6f 66 20 74 68 65 20 22 61 76 65 72 61 67  n of the "averag
249c0 65 73 22 20 72 65 63 6f 72 64 20 28 61 20 7a 65  es" record (a ze
249d0 72 6f 2d 62 79 74 65 20 62 6c 6f 62 29 2e 0a 2a  ro-byte blob)..*
249e0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73  /.int sqlite3Fts
249f0 35 49 6e 64 65 78 52 65 69 6e 69 74 28 46 74 73  5IndexReinit(Fts
24a00 35 49 6e 64 65 78 20 2a 70 29 7b 0a 20 20 46 74  5Index *p){.  Ft
24a10 73 35 53 74 72 75 63 74 75 72 65 20 73 3b 0a 20  s5Structure s;. 
24a20 20 6d 65 6d 73 65 74 28 26 73 2c 20 30 2c 20 73   memset(&s, 0, s
24a30 69 7a 65 6f 66 28 46 74 73 35 53 74 72 75 63 74  izeof(Fts5Struct
24a40 75 72 65 29 29 3b 0a 20 20 66 74 73 35 44 61 74  ure));.  fts5Dat
24a50 61 57 72 69 74 65 28 70 2c 20 46 54 53 35 5f 41  aWrite(p, FTS5_A
24a60 56 45 52 41 47 45 53 5f 52 4f 57 49 44 2c 20 28  VERAGES_ROWID, (
24a70 63 6f 6e 73 74 20 75 38 2a 29 22 22 2c 20 30 29  const u8*)"", 0)
24a80 3b 0a 20 20 66 74 73 35 53 74 72 75 63 74 75 72  ;.  fts5Structur
24a90 65 57 72 69 74 65 28 70 2c 20 26 73 29 3b 0a 20  eWrite(p, &s);. 
24aa0 20 72 65 74 75 72 6e 20 66 74 73 35 49 6e 64 65   return fts5Inde
24ab0 78 52 65 74 75 72 6e 28 70 29 3b 0a 7d 0a 0a 2f  xReturn(p);.}../
24ac0 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 6e 65 77 20  *.** Open a new 
24ad0 46 74 73 35 49 6e 64 65 78 20 68 61 6e 64 6c 65  Fts5Index handle
24ae0 2e 20 49 66 20 74 68 65 20 62 43 72 65 61 74 65  . If the bCreate
24af0 20 61 72 67 75 6d 65 6e 74 20 69 73 20 74 72 75   argument is tru
24b00 65 2c 20 63 72 65 61 74 65 0a 2a 2a 20 61 6e 64  e, create.** and
24b10 20 69 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20   initialize the 
24b20 75 6e 64 65 72 6c 79 69 6e 67 20 25 5f 64 61 74  underlying %_dat
24b30 61 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49  a table..**.** I
24b40 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 73 65  f successful, se
24b50 74 20 2a 70 70 20 74 6f 20 70 6f 69 6e 74 20 74  t *pp to point t
24b60 6f 20 74 68 65 20 6e 65 77 20 6f 62 6a 65 63 74  o the new object
24b70 20 61 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49   and return SQLI
24b80 54 45 5f 4f 4b 2e 0a 2a 2a 20 4f 74 68 65 72 77  TE_OK..** Otherw
24b90 69 73 65 2c 20 73 65 74 20 2a 70 70 20 74 6f 20  ise, set *pp to 
24ba0 4e 55 4c 4c 20 61 6e 64 20 72 65 74 75 72 6e 20  NULL and return 
24bb0 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20  an SQLite error 
24bc0 63 6f 64 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  code..*/.int sql
24bd0 69 74 65 33 46 74 73 35 49 6e 64 65 78 4f 70 65  ite3Fts5IndexOpe
24be0 6e 28 0a 20 20 46 74 73 35 43 6f 6e 66 69 67 20  n(.  Fts5Config 
24bf0 2a 70 43 6f 6e 66 69 67 2c 20 0a 20 20 69 6e 74  *pConfig, .  int
24c00 20 62 43 72 65 61 74 65 2c 20 0a 20 20 46 74 73   bCreate, .  Fts
24c10 35 49 6e 64 65 78 20 2a 2a 70 70 2c 0a 20 20 63  5Index **pp,.  c
24c20 68 61 72 20 2a 2a 70 7a 45 72 72 0a 29 7b 0a 20  har **pzErr.){. 
24c30 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
24c40 5f 4f 4b 3b 0a 20 20 46 74 73 35 49 6e 64 65 78  _OK;.  Fts5Index
24c50 20 2a 70 3b 20 20 20 20 20 20 20 20 20 20 20 20   *p;            
24c60 20 20 20 20 20 20 20 2f 2a 20 4e 65 77 20 6f 62         /* New ob
24c70 6a 65 63 74 20 2a 2f 0a 0a 20 20 2a 70 70 20 3d  ject */..  *pp =
24c80 20 70 20 3d 20 28 46 74 73 35 49 6e 64 65 78 2a   p = (Fts5Index*
24c90 29 73 71 6c 69 74 65 33 46 74 73 35 4d 61 6c 6c  )sqlite3Fts5Mall
24ca0 6f 63 5a 65 72 6f 28 26 72 63 2c 20 73 69 7a 65  ocZero(&rc, size
24cb0 6f 66 28 46 74 73 35 49 6e 64 65 78 29 29 3b 0a  of(Fts5Index));.
24cc0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
24cd0 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 2d 3e 70 43  _OK ){.    p->pC
24ce0 6f 6e 66 69 67 20 3d 20 70 43 6f 6e 66 69 67 3b  onfig = pConfig;
24cf0 0a 20 20 20 20 70 2d 3e 6e 57 6f 72 6b 55 6e 69  .    p->nWorkUni
24d00 74 20 3d 20 46 54 53 35 5f 57 4f 52 4b 5f 55 4e  t = FTS5_WORK_UN
24d10 49 54 3b 0a 20 20 20 20 70 2d 3e 7a 44 61 74 61  IT;.    p->zData
24d20 54 62 6c 20 3d 20 73 71 6c 69 74 65 33 46 74 73  Tbl = sqlite3Fts
24d30 35 4d 70 72 69 6e 74 66 28 26 72 63 2c 20 22 25  5Mprintf(&rc, "%
24d40 73 5f 64 61 74 61 22 2c 20 70 43 6f 6e 66 69 67  s_data", pConfig
24d50 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66  ->zName);.    if
24d60 28 20 70 2d 3e 7a 44 61 74 61 54 62 6c 20 26 26  ( p->zDataTbl &&
24d70 20 62 43 72 65 61 74 65 20 29 7b 0a 20 20 20 20   bCreate ){.    
24d80 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74    rc = sqlite3Ft
24d90 73 35 43 72 65 61 74 65 54 61 62 6c 65 28 0a 20  s5CreateTable(. 
24da0 20 20 20 20 20 20 20 20 20 70 43 6f 6e 66 69 67           pConfig
24db0 2c 20 22 64 61 74 61 22 2c 20 22 69 64 20 49 4e  , "data", "id IN
24dc0 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45  TEGER PRIMARY KE
24dd0 59 2c 20 62 6c 6f 63 6b 20 42 4c 4f 42 22 2c 20  Y, block BLOB", 
24de0 30 2c 20 70 7a 45 72 72 0a 20 20 20 20 20 20 29  0, pzErr.      )
24df0 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
24e00 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
24e10 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
24e20 33 46 74 73 35 43 72 65 61 74 65 54 61 62 6c 65  3Fts5CreateTable
24e30 28 70 43 6f 6e 66 69 67 2c 20 22 69 64 78 22 2c  (pConfig, "idx",
24e40 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 73   .            "s
24e50 65 67 69 64 2c 20 74 65 72 6d 2c 20 70 67 6e 6f  egid, term, pgno
24e60 2c 20 50 52 49 4d 41 52 59 20 4b 45 59 28 73 65  , PRIMARY KEY(se
24e70 67 69 64 2c 20 74 65 72 6d 29 22 2c 20 0a 20 20  gid, term)", .  
24e80 20 20 20 20 20 20 20 20 20 20 31 2c 20 70 7a 45            1, pzE
24e90 72 72 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20  rr.        );.  
24ea0 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
24eb0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
24ec0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
24ed0 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78 52 65  lite3Fts5IndexRe
24ee0 69 6e 69 74 28 70 29 3b 0a 20 20 20 20 20 20 7d  init(p);.      }
24ef0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 61 73  .    }.  }..  as
24f00 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45  sert( rc!=SQLITE
24f10 5f 4f 4b 20 7c 7c 20 70 2d 3e 72 63 3d 3d 53 51  _OK || p->rc==SQ
24f20 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 69 66 28  LITE_OK );.  if(
24f30 20 72 63 20 29 7b 0a 20 20 20 20 73 71 6c 69 74   rc ){.    sqlit
24f40 65 33 46 74 73 35 49 6e 64 65 78 43 6c 6f 73 65  e3Fts5IndexClose
24f50 28 70 29 3b 0a 20 20 20 20 2a 70 70 20 3d 20 30  (p);.    *pp = 0
24f60 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
24f70 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73  c;.}../*.** Clos
24f80 65 20 61 20 68 61 6e 64 6c 65 20 6f 70 65 6e 65  e a handle opene
24f90 64 20 62 79 20 61 6e 20 65 61 72 6c 69 65 72 20  d by an earlier 
24fa0 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 46  call to sqlite3F
24fb0 74 73 35 49 6e 64 65 78 4f 70 65 6e 28 29 2e 0a  ts5IndexOpen()..
24fc0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74  */.int sqlite3Ft
24fd0 73 35 49 6e 64 65 78 43 6c 6f 73 65 28 46 74 73  s5IndexClose(Fts
24fe0 35 49 6e 64 65 78 20 2a 70 29 7b 0a 20 20 69 6e  5Index *p){.  in
24ff0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
25000 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20  ;.  if( p ){.   
25010 20 61 73 73 65 72 74 28 20 70 2d 3e 70 52 65 61   assert( p->pRea
25020 64 65 72 3d 3d 30 20 29 3b 0a 20 20 20 20 73 71  der==0 );.    sq
25030 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70  lite3_finalize(p
25040 2d 3e 70 57 72 69 74 65 72 29 3b 0a 20 20 20 20  ->pWriter);.    
25050 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65  sqlite3_finalize
25060 28 70 2d 3e 70 44 65 6c 65 74 65 72 29 3b 0a 20  (p->pDeleter);. 
25070 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c     sqlite3_final
25080 69 7a 65 28 70 2d 3e 70 49 64 78 57 72 69 74 65  ize(p->pIdxWrite
25090 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  r);.    sqlite3_
250a0 66 69 6e 61 6c 69 7a 65 28 70 2d 3e 70 49 64 78  finalize(p->pIdx
250b0 44 65 6c 65 74 65 72 29 3b 0a 20 20 20 20 73 71  Deleter);.    sq
250c0 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70  lite3_finalize(p
250d0 2d 3e 70 49 64 78 53 65 6c 65 63 74 29 3b 0a 20  ->pIdxSelect);. 
250e0 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 48 61     sqlite3Fts5Ha
250f0 73 68 46 72 65 65 28 70 2d 3e 70 48 61 73 68 29  shFree(p->pHash)
25100 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ;.    sqlite3_fr
25110 65 65 28 70 2d 3e 7a 44 61 74 61 54 62 6c 29 3b  ee(p->zDataTbl);
25120 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
25130 65 28 70 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  e(p);.  }.  retu
25140 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
25150 41 72 67 75 6d 65 6e 74 20 70 20 70 6f 69 6e 74  Argument p point
25160 73 20 74 6f 20 61 20 62 75 66 66 65 72 20 63 6f  s to a buffer co
25170 6e 74 61 69 6e 69 6e 67 20 75 74 66 2d 38 20 74  ntaining utf-8 t
25180 65 78 74 20 74 68 61 74 20 69 73 20 6e 20 62 79  ext that is n by
25190 74 65 73 20 69 6e 20 0a 2a 2a 20 73 69 7a 65 2e  tes in .** size.
251a0 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62   Return the numb
251b0 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20 74  er of bytes in t
251c0 68 65 20 6e 43 68 61 72 20 63 68 61 72 61 63 74  he nChar charact
251d0 65 72 20 70 72 65 66 69 78 20 6f 66 20 74 68 65  er prefix of the
251e0 0a 2a 2a 20 62 75 66 66 65 72 2c 20 6f 72 20 30  .** buffer, or 0
251f0 20 69 66 20 74 68 65 72 65 20 61 72 65 20 6c 65   if there are le
25200 73 73 20 74 68 61 6e 20 6e 43 68 61 72 20 63 68  ss than nChar ch
25210 61 72 61 63 74 65 72 73 20 69 6e 20 74 6f 74 61  aracters in tota
25220 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  l..*/.static int
25230 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65   sqlite3Fts5Inde
25240 78 43 68 61 72 6c 65 6e 54 6f 42 79 74 65 6c 65  xCharlenToBytele
25250 6e 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  n(.  const char 
25260 2a 70 2c 20 0a 20 20 69 6e 74 20 6e 42 79 74 65  *p, .  int nByte
25270 2c 20 0a 20 20 69 6e 74 20 6e 43 68 61 72 0a 29  , .  int nChar.)
25280 7b 0a 20 20 69 6e 74 20 6e 20 3d 20 30 3b 0a 20  {.  int n = 0;. 
25290 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d   int i;.  for(i=
252a0 30 3b 20 69 3c 6e 43 68 61 72 3b 20 69 2b 2b 29  0; i<nChar; i++)
252b0 7b 0a 20 20 20 20 69 66 28 20 6e 3e 3d 6e 42 79  {.    if( n>=nBy
252c0 74 65 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20  te ) return 0;  
252d0 20 20 20 20 2f 2a 20 49 6e 70 75 74 20 63 6f 6e      /* Input con
252e0 74 61 69 6e 73 20 66 65 77 65 72 20 74 68 61 6e  tains fewer than
252f0 20 6e 43 68 61 72 20 63 68 61 72 73 20 2a 2f 0a   nChar chars */.
25300 20 20 20 20 69 66 28 20 28 75 6e 73 69 67 6e 65      if( (unsigne
25310 64 20 63 68 61 72 29 70 5b 6e 2b 2b 5d 3e 3d 30  d char)p[n++]>=0
25320 78 63 30 20 29 7b 0a 20 20 20 20 20 20 77 68 69  xc0 ){.      whi
25330 6c 65 28 20 28 70 5b 6e 5d 20 26 20 30 78 63 30  le( (p[n] & 0xc0
25340 29 3d 3d 30 78 38 30 20 29 20 6e 2b 2b 3b 0a 20  )==0x80 ) n++;. 
25350 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
25360 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70 49  n n;.}../*.** pI
25370 6e 20 69 73 20 61 20 55 54 46 2d 38 20 65 6e 63  n is a UTF-8 enc
25380 6f 64 65 64 20 73 74 72 69 6e 67 2c 20 6e 49 6e  oded string, nIn
25390 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2e 20   bytes in size. 
253a0 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65  Return the numbe
253b0 72 20 6f 66 0a 2a 2a 20 75 6e 69 63 6f 64 65 20  r of.** unicode 
253c0 63 68 61 72 61 63 74 65 72 73 20 69 6e 20 74 68  characters in th
253d0 65 20 73 74 72 69 6e 67 2e 0a 2a 2f 0a 73 74 61  e string..*/.sta
253e0 74 69 63 20 69 6e 74 20 66 74 73 35 49 6e 64 65  tic int fts5Inde
253f0 78 43 68 61 72 6c 65 6e 28 63 6f 6e 73 74 20 63  xCharlen(const c
25400 68 61 72 20 2a 70 49 6e 2c 20 69 6e 74 20 6e 49  har *pIn, int nI
25410 6e 29 7b 0a 20 20 69 6e 74 20 6e 43 68 61 72 20  n){.  int nChar 
25420 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
25430 0a 20 20 69 6e 74 20 69 20 3d 20 30 3b 0a 20 20  .  int i = 0;.  
25440 77 68 69 6c 65 28 20 69 3c 6e 49 6e 20 29 7b 0a  while( i<nIn ){.
25450 20 20 20 20 69 66 28 20 28 75 6e 73 69 67 6e 65      if( (unsigne
25460 64 20 63 68 61 72 29 70 49 6e 5b 69 2b 2b 5d 3e  d char)pIn[i++]>
25470 3d 30 78 63 30 20 29 7b 0a 20 20 20 20 20 20 77  =0xc0 ){.      w
25480 68 69 6c 65 28 20 69 3c 6e 49 6e 20 26 26 20 28  hile( i<nIn && (
25490 70 49 6e 5b 69 5d 20 26 20 30 78 63 30 29 3d 3d  pIn[i] & 0xc0)==
254a0 30 78 38 30 20 29 20 69 2b 2b 3b 0a 20 20 20 20  0x80 ) i++;.    
254b0 7d 0a 20 20 20 20 6e 43 68 61 72 2b 2b 3b 0a 20  }.    nChar++;. 
254c0 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 43 68 61   }.  return nCha
254d0 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 73 65  r;.}../*.** Inse
254e0 72 74 20 6f 72 20 72 65 6d 6f 76 65 20 64 61 74  rt or remove dat
254f0 61 20 74 6f 20 6f 72 20 66 72 6f 6d 20 74 68 65  a to or from the
25500 20 69 6e 64 65 78 2e 20 45 61 63 68 20 74 69 6d   index. Each tim
25510 65 20 61 20 64 6f 63 75 6d 65 6e 74 20 69 73 20  e a document is 
25520 0a 2a 2a 20 61 64 64 65 64 20 74 6f 20 6f 72 20  .** added to or 
25530 72 65 6d 6f 76 65 64 20 66 72 6f 6d 20 74 68 65  removed from the
25540 20 69 6e 64 65 78 2c 20 74 68 69 73 20 66 75 6e   index, this fun
25550 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20  ction is called 
25560 6f 6e 65 20 6f 72 20 6d 6f 72 65 0a 2a 2a 20 74  one or more.** t
25570 69 6d 65 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20  imes..**.** For 
25580 61 6e 20 69 6e 73 65 72 74 2c 20 69 74 20 6d 75  an insert, it mu
25590 73 74 20 62 65 20 63 61 6c 6c 65 64 20 6f 6e 63  st be called onc
255a0 65 20 66 6f 72 20 65 61 63 68 20 74 6f 6b 65 6e  e for each token
255b0 20 69 6e 20 74 68 65 20 6e 65 77 20 64 6f 63 75   in the new docu
255c0 6d 65 6e 74 2e 0a 2a 2a 20 49 66 20 74 68 65 20  ment..** If the 
255d0 6f 70 65 72 61 74 69 6f 6e 20 69 73 20 61 20 64  operation is a d
255e0 65 6c 65 74 65 2c 20 69 74 20 6d 75 73 74 20 62  elete, it must b
255f0 65 20 63 61 6c 6c 65 64 20 28 61 74 20 6c 65 61  e called (at lea
25600 73 74 29 20 6f 6e 63 65 20 66 6f 72 20 65 61 63  st) once for eac
25610 68 0a 2a 2a 20 75 6e 69 71 75 65 20 74 6f 6b 65  h.** unique toke
25620 6e 20 69 6e 20 74 68 65 20 64 6f 63 75 6d 65 6e  n in the documen
25630 74 20 77 69 74 68 20 61 6e 20 69 43 6f 6c 20 76  t with an iCol v
25640 61 6c 75 65 20 6c 65 73 73 20 74 68 61 6e 20 7a  alue less than z
25650 65 72 6f 2e 20 54 68 65 20 69 50 6f 73 0a 2a 2a  ero. The iPos.**
25660 20 61 72 67 75 6d 65 6e 74 20 69 73 20 69 67 6e   argument is ign
25670 6f 72 65 64 20 66 6f 72 20 61 20 64 65 6c 65 74  ored for a delet
25680 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  e..*/.int sqlite
25690 33 46 74 73 35 49 6e 64 65 78 57 72 69 74 65 28  3Fts5IndexWrite(
256a0 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c  .  Fts5Index *p,
256b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
256c0 20 20 20 2f 2a 20 49 6e 64 65 78 20 74 6f 20 77     /* Index to w
256d0 72 69 74 65 20 74 6f 20 2a 2f 0a 20 20 69 6e 74  rite to */.  int
256e0 20 69 43 6f 6c 2c 20 20 20 20 20 20 20 20 20 20   iCol,          
256f0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
25700 43 6f 6c 75 6d 6e 20 74 6f 6b 65 6e 20 61 70 70  Column token app
25710 65 61 72 73 20 69 6e 20 28 2d 76 65 20 2d 3e 20  ears in (-ve -> 
25720 64 65 6c 65 74 65 29 20 2a 2f 0a 20 20 69 6e 74  delete) */.  int
25730 20 69 50 6f 73 2c 20 20 20 20 20 20 20 20 20 20   iPos,          
25740 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
25750 50 6f 73 69 74 69 6f 6e 20 6f 66 20 74 6f 6b 65  Position of toke
25760 6e 20 77 69 74 68 69 6e 20 63 6f 6c 75 6d 6e 20  n within column 
25770 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
25780 2a 70 54 6f 6b 65 6e 2c 20 69 6e 74 20 6e 54 6f  *pToken, int nTo
25790 6b 65 6e 20 20 2f 2a 20 54 6f 6b 65 6e 20 74 6f  ken  /* Token to
257a0 20 61 64 64 20 6f 72 20 72 65 6d 6f 76 65 20 74   add or remove t
257b0 6f 20 6f 72 20 66 72 6f 6d 20 69 6e 64 65 78 20  o or from index 
257c0 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20  */.){.  int i;  
257d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
257e0 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20          /* Used 
257f0 74 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f 75  to iterate throu
25800 67 68 20 69 6e 64 65 78 65 73 20 2a 2f 0a 20 20  gh indexes */.  
25810 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
25820 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  OK;             
25830 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
25840 2f 0a 20 20 46 74 73 35 43 6f 6e 66 69 67 20 2a  /.  Fts5Config *
25850 70 43 6f 6e 66 69 67 20 3d 20 70 2d 3e 70 43 6f  pConfig = p->pCo
25860 6e 66 69 67 3b 0a 0a 20 20 61 73 73 65 72 74 28  nfig;..  assert(
25870 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
25880 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28  K );.  assert( (
25890 69 43 6f 6c 3c 30 29 3d 3d 70 2d 3e 62 44 65 6c  iCol<0)==p->bDel
258a0 65 74 65 20 29 3b 0a 0a 20 20 2f 2a 20 41 64 64  ete );..  /* Add
258b0 20 74 68 65 20 65 6e 74 72 79 20 74 6f 20 74 68   the entry to th
258c0 65 20 6d 61 69 6e 20 74 65 72 6d 73 20 69 6e 64  e main terms ind
258d0 65 78 2e 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71  ex. */.  rc = sq
258e0 6c 69 74 65 33 46 74 73 35 48 61 73 68 57 72 69  lite3Fts5HashWri
258f0 74 65 28 0a 20 20 20 20 20 20 70 2d 3e 70 48 61  te(.      p->pHa
25900 73 68 2c 20 70 2d 3e 69 57 72 69 74 65 52 6f 77  sh, p->iWriteRow
25910 69 64 2c 20 69 43 6f 6c 2c 20 69 50 6f 73 2c 20  id, iCol, iPos, 
25920 46 54 53 35 5f 4d 41 49 4e 5f 50 52 45 46 49 58  FTS5_MAIN_PREFIX
25930 2c 20 70 54 6f 6b 65 6e 2c 20 6e 54 6f 6b 65 6e  , pToken, nToken
25940 0a 20 20 29 3b 0a 0a 20 20 66 6f 72 28 69 3d 30  .  );..  for(i=0
25950 3b 20 69 3c 70 43 6f 6e 66 69 67 2d 3e 6e 50 72  ; i<pConfig->nPr
25960 65 66 69 78 20 26 26 20 72 63 3d 3d 53 51 4c 49  efix && rc==SQLI
25970 54 45 5f 4f 4b 3b 20 69 2b 2b 29 7b 0a 20 20 20  TE_OK; i++){.   
25980 20 63 6f 6e 73 74 20 69 6e 74 20 6e 43 68 61 72   const int nChar
25990 20 3d 20 70 43 6f 6e 66 69 67 2d 3e 61 50 72 65   = pConfig->aPre
259a0 66 69 78 5b 69 5d 3b 0a 20 20 20 20 69 6e 74 20  fix[i];.    int 
259b0 6e 42 79 74 65 20 3d 20 73 71 6c 69 74 65 33 46  nByte = sqlite3F
259c0 74 73 35 49 6e 64 65 78 43 68 61 72 6c 65 6e 54  ts5IndexCharlenT
259d0 6f 42 79 74 65 6c 65 6e 28 70 54 6f 6b 65 6e 2c  oBytelen(pToken,
259e0 20 6e 54 6f 6b 65 6e 2c 20 6e 43 68 61 72 29 3b   nToken, nChar);
259f0 0a 20 20 20 20 69 66 28 20 6e 42 79 74 65 20 29  .    if( nByte )
25a00 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
25a10 69 74 65 33 46 74 73 35 48 61 73 68 57 72 69 74  ite3Fts5HashWrit
25a20 65 28 70 2d 3e 70 48 61 73 68 2c 20 0a 20 20 20  e(p->pHash, .   
25a30 20 20 20 20 20 20 20 70 2d 3e 69 57 72 69 74 65         p->iWrite
25a40 52 6f 77 69 64 2c 20 69 43 6f 6c 2c 20 69 50 6f  Rowid, iCol, iPo
25a50 73 2c 20 28 63 68 61 72 29 28 46 54 53 35 5f 4d  s, (char)(FTS5_M
25a60 41 49 4e 5f 50 52 45 46 49 58 2b 69 2b 31 29 2c  AIN_PREFIX+i+1),
25a70 20 70 54 6f 6b 65 6e 2c 0a 20 20 20 20 20 20 20   pToken,.       
25a80 20 20 20 6e 42 79 74 65 0a 20 20 20 20 20 20 29     nByte.      )
25a90 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72  ;.    }.  }..  r
25aa0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
25ab0 2a 2a 20 4f 70 65 6e 20 61 20 6e 65 77 20 69 74  ** Open a new it
25ac0 65 72 61 74 6f 72 20 74 6f 20 69 74 65 72 61 74  erator to iterat
25ad0 65 20 74 68 6f 75 67 68 20 61 6c 6c 20 72 6f 77  e though all row
25ae0 69 64 20 74 68 61 74 20 6d 61 74 63 68 20 74 68  id that match th
25af0 65 20 0a 2a 2a 20 73 70 65 63 69 66 69 65 64 20  e .** specified 
25b00 74 6f 6b 65 6e 20 6f 72 20 74 6f 6b 65 6e 20 70  token or token p
25b10 72 65 66 69 78 2e 0a 2a 2f 0a 69 6e 74 20 73 71  refix..*/.int sq
25b20 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78 51 75  lite3Fts5IndexQu
25b30 65 72 79 28 0a 20 20 46 74 73 35 49 6e 64 65 78  ery(.  Fts5Index
25b40 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
25b50 20 20 20 20 20 20 20 2f 2a 20 46 54 53 20 69 6e         /* FTS in
25b60 64 65 78 20 74 6f 20 71 75 65 72 79 20 2a 2f 0a  dex to query */.
25b70 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 70 54    const char *pT
25b80 6f 6b 65 6e 2c 20 69 6e 74 20 6e 54 6f 6b 65 6e  oken, int nToken
25b90 2c 20 2f 2a 20 54 6f 6b 65 6e 20 28 6f 72 20 70  , /* Token (or p
25ba0 72 65 66 69 78 29 20 74 6f 20 71 75 65 72 79 20  refix) to query 
25bb0 66 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61  for */.  int fla
25bc0 67 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  gs,             
25bd0 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b           /* Mask
25be0 20 6f 66 20 46 54 53 35 49 4e 44 45 58 5f 51 55   of FTS5INDEX_QU
25bf0 45 52 59 5f 58 20 66 6c 61 67 73 20 2a 2f 0a 20  ERY_X flags */. 
25c00 20 46 74 73 35 43 6f 6c 73 65 74 20 2a 70 43 6f   Fts5Colset *pCo
25c10 6c 73 65 74 2c 20 20 20 20 20 20 20 20 20 20 20  lset,           
25c20 20 2f 2a 20 4d 61 74 63 68 20 74 68 65 73 65 20   /* Match these 
25c30 63 6f 6c 75 6d 6e 73 20 6f 6e 6c 79 20 2a 2f 0a  columns only */.
25c40 20 20 46 74 73 35 49 6e 64 65 78 49 74 65 72 20    Fts5IndexIter 
25c50 2a 2a 70 70 49 74 65 72 20 20 20 20 20 20 20 20  **ppIter        
25c60 20 20 2f 2a 20 4f 55 54 3a 20 4e 65 77 20 69 74    /* OUT: New it
25c70 65 72 61 74 6f 72 20 6f 62 6a 65 63 74 20 2a 2f  erator object */
25c80 0a 29 7b 0a 20 20 46 74 73 35 43 6f 6e 66 69 67  .){.  Fts5Config
25c90 20 2a 70 43 6f 6e 66 69 67 20 3d 20 70 2d 3e 70   *pConfig = p->p
25ca0 43 6f 6e 66 69 67 3b 0a 20 20 46 74 73 35 49 6e  Config;.  Fts5In
25cb0 64 65 78 49 74 65 72 20 2a 70 52 65 74 20 3d 20  dexIter *pRet = 
25cc0 30 3b 0a 20 20 69 6e 74 20 69 49 64 78 20 3d 20  0;.  int iIdx = 
25cd0 30 3b 0a 20 20 46 74 73 35 42 75 66 66 65 72 20  0;.  Fts5Buffer 
25ce0 62 75 66 20 3d 20 7b 30 2c 20 30 2c 20 30 7d 3b  buf = {0, 0, 0};
25cf0 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 51 55  ..  /* If the QU
25d00 45 52 59 5f 53 43 41 4e 20 66 6c 61 67 20 69 73  ERY_SCAN flag is
25d10 20 73 65 74 2c 20 61 6c 6c 20 6f 74 68 65 72 20   set, all other 
25d20 66 6c 61 67 73 20 6d 75 73 74 20 62 65 20 63 6c  flags must be cl
25d30 65 61 72 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74  ear. */.  assert
25d40 28 20 28 66 6c 61 67 73 20 26 20 46 54 53 35 49  ( (flags & FTS5I
25d50 4e 44 45 58 5f 51 55 45 52 59 5f 53 43 41 4e 29  NDEX_QUERY_SCAN)
25d60 3d 3d 30 20 7c 7c 20 66 6c 61 67 73 3d 3d 46 54  ==0 || flags==FT
25d70 53 35 49 4e 44 45 58 5f 51 55 45 52 59 5f 53 43  S5INDEX_QUERY_SC
25d80 41 4e 20 29 3b 0a 0a 20 20 69 66 28 20 73 71 6c  AN );..  if( sql
25d90 69 74 65 33 46 74 73 35 42 75 66 66 65 72 53 69  ite3Fts5BufferSi
25da0 7a 65 28 26 70 2d 3e 72 63 2c 20 26 62 75 66 2c  ze(&p->rc, &buf,
25db0 20 6e 54 6f 6b 65 6e 2b 31 29 3d 3d 30 20 29 7b   nToken+1)==0 ){
25dc0 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 62 75 66  .    memcpy(&buf
25dd0 2e 70 5b 31 5d 2c 20 70 54 6f 6b 65 6e 2c 20 6e  .p[1], pToken, n
25de0 54 6f 6b 65 6e 29 3b 0a 0a 23 69 66 64 65 66 20  Token);..#ifdef 
25df0 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20  SQLITE_DEBUG.   
25e00 20 2f 2a 20 49 66 20 74 68 65 20 51 55 45 52 59   /* If the QUERY
25e10 5f 54 45 53 54 5f 4e 4f 49 44 58 20 66 6c 61 67  _TEST_NOIDX flag
25e20 20 77 61 73 20 73 70 65 63 69 66 69 65 64 2c 20   was specified, 
25e30 74 68 65 6e 20 74 68 69 73 20 6d 75 73 74 20 62  then this must b
25e40 65 20 61 0a 20 20 20 20 2a 2a 20 70 72 65 66 69  e a.    ** prefi
25e50 78 2d 71 75 65 72 79 2e 20 49 6e 73 74 65 61 64  x-query. Instead
25e60 20 6f 66 20 75 73 69 6e 67 20 61 20 70 72 65 66   of using a pref
25e70 69 78 2d 69 6e 64 65 78 20 28 69 66 20 6f 6e 65  ix-index (if one
25e80 20 65 78 69 73 74 73 29 2c 20 0a 20 20 20 20 2a   exists), .    *
25e90 2a 20 65 76 61 6c 75 61 74 65 20 74 68 65 20 70  * evaluate the p
25ea0 72 65 66 69 78 20 71 75 65 72 79 20 75 73 69 6e  refix query usin
25eb0 67 20 74 68 65 20 6d 61 69 6e 20 46 54 53 20 69  g the main FTS i
25ec0 6e 64 65 78 2e 20 54 68 69 73 20 69 73 20 75 73  ndex. This is us
25ed0 65 64 0a 20 20 20 20 2a 2a 20 66 6f 72 20 69 6e  ed.    ** for in
25ee0 74 65 72 6e 61 6c 20 73 61 6e 69 74 79 20 63 68  ternal sanity ch
25ef0 65 63 6b 69 6e 67 20 62 79 20 74 68 65 20 69 6e  ecking by the in
25f00 74 65 67 72 69 74 79 2d 63 68 65 63 6b 20 69 6e  tegrity-check in
25f10 20 64 65 62 75 67 20 0a 20 20 20 20 2a 2a 20 6d   debug .    ** m
25f20 6f 64 65 20 6f 6e 6c 79 2e 20 20 2a 2f 0a 20 20  ode only.  */.  
25f30 20 20 69 66 28 20 70 43 6f 6e 66 69 67 2d 3e 62    if( pConfig->b
25f40 50 72 65 66 69 78 49 6e 64 65 78 3d 3d 30 20 7c  PrefixIndex==0 |
25f50 7c 20 28 66 6c 61 67 73 20 26 20 46 54 53 35 49  | (flags & FTS5I
25f60 4e 44 45 58 5f 51 55 45 52 59 5f 54 45 53 54 5f  NDEX_QUERY_TEST_
25f70 4e 4f 49 44 58 29 20 29 7b 0a 20 20 20 20 20 20  NOIDX) ){.      
25f80 61 73 73 65 72 74 28 20 66 6c 61 67 73 20 26 20  assert( flags & 
25f90 46 54 53 35 49 4e 44 45 58 5f 51 55 45 52 59 5f  FTS5INDEX_QUERY_
25fa0 50 52 45 46 49 58 20 29 3b 0a 20 20 20 20 20 20  PREFIX );.      
25fb0 69 49 64 78 20 3d 20 31 2b 70 43 6f 6e 66 69 67  iIdx = 1+pConfig
25fc0 2d 3e 6e 50 72 65 66 69 78 3b 0a 20 20 20 20 7d  ->nPrefix;.    }
25fd0 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 20 20  else.#endif.    
25fe0 69 66 28 20 66 6c 61 67 73 20 26 20 46 54 53 35  if( flags & FTS5
25ff0 49 4e 44 45 58 5f 51 55 45 52 59 5f 50 52 45 46  INDEX_QUERY_PREF
26000 49 58 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  IX ){.      int 
26010 6e 43 68 61 72 20 3d 20 66 74 73 35 49 6e 64 65  nChar = fts5Inde
26020 78 43 68 61 72 6c 65 6e 28 70 54 6f 6b 65 6e 2c  xCharlen(pToken,
26030 20 6e 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20   nToken);.      
26040 66 6f 72 28 69 49 64 78 3d 31 3b 20 69 49 64 78  for(iIdx=1; iIdx
26050 3c 3d 70 43 6f 6e 66 69 67 2d 3e 6e 50 72 65 66  <=pConfig->nPref
26060 69 78 3b 20 69 49 64 78 2b 2b 29 7b 0a 20 20 20  ix; iIdx++){.   
26070 20 20 20 20 20 69 66 28 20 70 43 6f 6e 66 69 67       if( pConfig
26080 2d 3e 61 50 72 65 66 69 78 5b 69 49 64 78 2d 31  ->aPrefix[iIdx-1
26090 5d 3d 3d 6e 43 68 61 72 20 29 20 62 72 65 61 6b  ]==nChar ) break
260a0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
260b0 0a 20 20 20 20 69 66 28 20 69 49 64 78 3c 3d 70  .    if( iIdx<=p
260c0 43 6f 6e 66 69 67 2d 3e 6e 50 72 65 66 69 78 20  Config->nPrefix 
260d0 29 7b 0a 20 20 20 20 20 20 46 74 73 35 53 74 72  ){.      Fts5Str
260e0 75 63 74 75 72 65 20 2a 70 53 74 72 75 63 74 20  ucture *pStruct 
260f0 3d 20 66 74 73 35 53 74 72 75 63 74 75 72 65 52  = fts5StructureR
26100 65 61 64 28 70 29 3b 0a 20 20 20 20 20 20 62 75  ead(p);.      bu
26110 66 2e 70 5b 30 5d 20 3d 20 28 75 38 29 28 46 54  f.p[0] = (u8)(FT
26120 53 35 5f 4d 41 49 4e 5f 50 52 45 46 49 58 20 2b  S5_MAIN_PREFIX +
26130 20 69 49 64 78 29 3b 0a 20 20 20 20 20 20 69 66   iIdx);.      if
26140 28 20 70 53 74 72 75 63 74 20 29 7b 0a 20 20 20  ( pStruct ){.   
26150 20 20 20 20 20 66 74 73 35 4d 75 6c 74 69 49 74       fts5MultiIt
26160 65 72 4e 65 77 28 70 2c 20 70 53 74 72 75 63 74  erNew(p, pStruct
26170 2c 20 31 2c 20 66 6c 61 67 73 2c 20 62 75 66 2e  , 1, flags, buf.
26180 70 2c 20 6e 54 6f 6b 65 6e 2b 31 2c 20 2d 31 2c  p, nToken+1, -1,
26190 20 30 2c 20 26 70 52 65 74 29 3b 0a 20 20 20 20   0, &pRet);.    
261a0 20 20 20 20 66 74 73 35 53 74 72 75 63 74 75 72      fts5Structur
261b0 65 52 65 6c 65 61 73 65 28 70 53 74 72 75 63 74  eRelease(pStruct
261c0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
261d0 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20  else{.      int 
261e0 62 44 65 73 63 20 3d 20 28 66 6c 61 67 73 20 26  bDesc = (flags &
261f0 20 46 54 53 35 49 4e 44 45 58 5f 51 55 45 52 59   FTS5INDEX_QUERY
26200 5f 44 45 53 43 29 21 3d 30 3b 0a 20 20 20 20 20  _DESC)!=0;.     
26210 20 62 75 66 2e 70 5b 30 5d 20 3d 20 46 54 53 35   buf.p[0] = FTS5
26220 5f 4d 41 49 4e 5f 50 52 45 46 49 58 3b 0a 20 20  _MAIN_PREFIX;.  
26230 20 20 20 20 66 74 73 35 53 65 74 75 70 50 72 65      fts5SetupPre
26240 66 69 78 49 74 65 72 28 70 2c 20 62 44 65 73 63  fixIter(p, bDesc
26250 2c 20 62 75 66 2e 70 2c 20 6e 54 6f 6b 65 6e 2b  , buf.p, nToken+
26260 31 2c 20 70 43 6f 6c 73 65 74 2c 20 26 70 52 65  1, pColset, &pRe
26270 74 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69  t);.    }..    i
26280 66 28 20 70 2d 3e 72 63 20 29 7b 0a 20 20 20 20  f( p->rc ){.    
26290 20 20 73 71 6c 69 74 65 33 46 74 73 35 49 74 65    sqlite3Fts5Ite
262a0 72 43 6c 6f 73 65 28 70 52 65 74 29 3b 0a 20 20  rClose(pRet);.  
262b0 20 20 20 20 70 52 65 74 20 3d 20 30 3b 0a 20 20      pRet = 0;.  
262c0 20 20 20 20 66 74 73 35 43 6c 6f 73 65 52 65 61      fts5CloseRea
262d0 64 65 72 28 70 29 3b 0a 20 20 20 20 7d 0a 20 20  der(p);.    }.  
262e0 20 20 2a 70 70 49 74 65 72 20 3d 20 70 52 65 74    *ppIter = pRet
262f0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 46 74 73  ;.    sqlite3Fts
26300 35 42 75 66 66 65 72 46 72 65 65 28 26 62 75 66  5BufferFree(&buf
26310 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
26320 66 74 73 35 49 6e 64 65 78 52 65 74 75 72 6e 28  fts5IndexReturn(
26330 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  p);.}../*.** Ret
26340 75 72 6e 20 74 72 75 65 20 69 66 20 74 68 65 20  urn true if the 
26350 69 74 65 72 61 74 6f 72 20 70 61 73 73 65 64 20  iterator passed 
26360 61 73 20 74 68 65 20 6f 6e 6c 79 20 61 72 67 75  as the only argu
26370 6d 65 6e 74 20 69 73 20 61 74 20 45 4f 46 2e 0a  ment is at EOF..
26380 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74  */.int sqlite3Ft
26390 73 35 49 74 65 72 45 6f 66 28 46 74 73 35 49 6e  s5IterEof(Fts5In
263a0 64 65 78 49 74 65 72 20 2a 70 49 74 65 72 29 7b  dexIter *pIter){
263b0 0a 20 20 61 73 73 65 72 74 28 20 70 49 74 65 72  .  assert( pIter
263c0 2d 3e 70 49 6e 64 65 78 2d 3e 72 63 3d 3d 53 51  ->pIndex->rc==SQ
263d0 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 72 65 74  LITE_OK );.  ret
263e0 75 72 6e 20 70 49 74 65 72 2d 3e 62 45 6f 66 3b  urn pIter->bEof;
263f0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74  .}../*.** Move t
26400 6f 20 74 68 65 20 6e 65 78 74 20 6d 61 74 63 68  o the next match
26410 69 6e 67 20 72 6f 77 69 64 2e 20 0a 2a 2f 0a 69  ing rowid. .*/.i
26420 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 49 74  nt sqlite3Fts5It
26430 65 72 4e 65 78 74 28 46 74 73 35 49 6e 64 65 78  erNext(Fts5Index
26440 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a 20 20  Iter *pIter){.  
26450 61 73 73 65 72 74 28 20 70 49 74 65 72 2d 3e 70  assert( pIter->p
26460 49 6e 64 65 78 2d 3e 72 63 3d 3d 53 51 4c 49 54  Index->rc==SQLIT
26470 45 5f 4f 4b 20 29 3b 0a 20 20 66 74 73 35 4d 75  E_OK );.  fts5Mu
26480 6c 74 69 49 74 65 72 4e 65 78 74 28 70 49 74 65  ltiIterNext(pIte
26490 72 2d 3e 70 49 6e 64 65 78 2c 20 70 49 74 65 72  r->pIndex, pIter
264a0 2c 20 30 2c 20 30 29 3b 0a 20 20 72 65 74 75 72  , 0, 0);.  retur
264b0 6e 20 66 74 73 35 49 6e 64 65 78 52 65 74 75 72  n fts5IndexRetur
264c0 6e 28 70 49 74 65 72 2d 3e 70 49 6e 64 65 78 29  n(pIter->pIndex)
264d0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20  ;.}../*.** Move 
264e0 74 6f 20 74 68 65 20 6e 65 78 74 20 6d 61 74 63  to the next matc
264f0 68 69 6e 67 20 74 65 72 6d 2f 72 6f 77 69 64 2e  hing term/rowid.
26500 20 55 73 65 64 20 62 79 20 74 68 65 20 66 74 73   Used by the fts
26510 35 76 6f 63 61 62 20 6d 6f 64 75 6c 65 2e 0a 2a  5vocab module..*
26520 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73  /.int sqlite3Fts
26530 35 49 74 65 72 4e 65 78 74 53 63 61 6e 28 46 74  5IterNextScan(Ft
26540 73 35 49 6e 64 65 78 49 74 65 72 20 2a 70 49 74  s5IndexIter *pIt
26550 65 72 29 7b 0a 20 20 46 74 73 35 49 6e 64 65 78  er){.  Fts5Index
26560 20 2a 70 20 3d 20 70 49 74 65 72 2d 3e 70 49 6e   *p = pIter->pIn
26570 64 65 78 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  dex;..  assert( 
26580 70 49 74 65 72 2d 3e 70 49 6e 64 65 78 2d 3e 72  pIter->pIndex->r
26590 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  c==SQLITE_OK );.
265a0 0a 20 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72  .  fts5MultiIter
265b0 4e 65 78 74 28 70 2c 20 70 49 74 65 72 2c 20 30  Next(p, pIter, 0
265c0 2c 20 30 29 3b 0a 20 20 69 66 28 20 70 2d 3e 72  , 0);.  if( p->r
265d0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
265e0 20 20 20 20 46 74 73 35 53 65 67 49 74 65 72 20      Fts5SegIter 
265f0 2a 70 53 65 67 20 3d 20 26 70 49 74 65 72 2d 3e  *pSeg = &pIter->
26600 61 53 65 67 5b 20 70 49 74 65 72 2d 3e 61 46 69  aSeg[ pIter->aFi
26610 72 73 74 5b 31 5d 2e 69 46 69 72 73 74 20 5d 3b  rst[1].iFirst ];
26620 0a 20 20 20 20 69 66 28 20 70 53 65 67 2d 3e 70  .    if( pSeg->p
26630 4c 65 61 66 20 26 26 20 70 53 65 67 2d 3e 74 65  Leaf && pSeg->te
26640 72 6d 2e 70 5b 30 5d 21 3d 46 54 53 35 5f 4d 41  rm.p[0]!=FTS5_MA
26650 49 4e 5f 50 52 45 46 49 58 20 29 7b 0a 20 20 20  IN_PREFIX ){.   
26660 20 20 20 66 74 73 35 44 61 74 61 52 65 6c 65 61     fts5DataRelea
26670 73 65 28 70 53 65 67 2d 3e 70 4c 65 61 66 29 3b  se(pSeg->pLeaf);
26680 0a 20 20 20 20 20 20 70 53 65 67 2d 3e 70 4c 65  .      pSeg->pLe
26690 61 66 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 49  af = 0;.      pI
266a0 74 65 72 2d 3e 62 45 6f 66 20 3d 20 31 3b 0a 20  ter->bEof = 1;. 
266b0 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75     }.  }..  retu
266c0 72 6e 20 66 74 73 35 49 6e 64 65 78 52 65 74 75  rn fts5IndexRetu
266d0 72 6e 28 70 49 74 65 72 2d 3e 70 49 6e 64 65 78  rn(pIter->pIndex
266e0 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65  );.}../*.** Move
266f0 20 74 6f 20 74 68 65 20 6e 65 78 74 20 6d 61 74   to the next mat
26700 63 68 69 6e 67 20 72 6f 77 69 64 20 74 68 61 74  ching rowid that
26710 20 6f 63 63 75 72 73 20 61 74 20 6f 72 20 61 66   occurs at or af
26720 74 65 72 20 69 4d 61 74 63 68 2e 20 54 68 65 0a  ter iMatch. The.
26730 2a 2a 20 64 65 66 69 6e 69 74 69 6f 6e 20 6f 66  ** definition of
26740 20 22 61 74 20 6f 72 20 61 66 74 65 72 22 20 64   "at or after" d
26750 65 70 65 6e 64 73 20 6f 6e 20 77 68 65 74 68 65  epends on whethe
26760 72 20 74 68 69 73 20 69 74 65 72 61 74 6f 72 20  r this iterator 
26770 69 74 65 72 61 74 65 73 0a 2a 2a 20 69 6e 20 61  iterates.** in a
26780 73 63 65 6e 64 69 6e 67 20 6f 72 20 64 65 73 63  scending or desc
26790 65 6e 64 69 6e 67 20 72 6f 77 69 64 20 6f 72 64  ending rowid ord
267a0 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  er..*/.int sqlit
267b0 65 33 46 74 73 35 49 74 65 72 4e 65 78 74 46 72  e3Fts5IterNextFr
267c0 6f 6d 28 46 74 73 35 49 6e 64 65 78 49 74 65 72  om(Fts5IndexIter
267d0 20 2a 70 49 74 65 72 2c 20 69 36 34 20 69 4d 61   *pIter, i64 iMa
267e0 74 63 68 29 7b 0a 20 20 66 74 73 35 4d 75 6c 74  tch){.  fts5Mult
267f0 69 49 74 65 72 4e 65 78 74 46 72 6f 6d 28 70 49  iIterNextFrom(pI
26800 74 65 72 2d 3e 70 49 6e 64 65 78 2c 20 70 49 74  ter->pIndex, pIt
26810 65 72 2c 20 69 4d 61 74 63 68 29 3b 0a 20 20 72  er, iMatch);.  r
26820 65 74 75 72 6e 20 66 74 73 35 49 6e 64 65 78 52  eturn fts5IndexR
26830 65 74 75 72 6e 28 70 49 74 65 72 2d 3e 70 49 6e  eturn(pIter->pIn
26840 64 65 78 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  dex);.}../*.** R
26850 65 74 75 72 6e 20 74 68 65 20 63 75 72 72 65 6e  eturn the curren
26860 74 20 72 6f 77 69 64 2e 0a 2a 2f 0a 69 36 34 20  t rowid..*/.i64 
26870 73 71 6c 69 74 65 33 46 74 73 35 49 74 65 72 52  sqlite3Fts5IterR
26880 6f 77 69 64 28 46 74 73 35 49 6e 64 65 78 49 74  owid(Fts5IndexIt
26890 65 72 20 2a 70 49 74 65 72 29 7b 0a 20 20 72 65  er *pIter){.  re
268a0 74 75 72 6e 20 66 74 73 35 4d 75 6c 74 69 49 74  turn fts5MultiIt
268b0 65 72 52 6f 77 69 64 28 70 49 74 65 72 29 3b 0a  erRowid(pIter);.
268c0 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
268d0 74 68 65 20 63 75 72 72 65 6e 74 20 74 65 72 6d  the current term
268e0 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20  ..*/.const char 
268f0 2a 73 71 6c 69 74 65 33 46 74 73 35 49 74 65 72  *sqlite3Fts5Iter
26900 54 65 72 6d 28 46 74 73 35 49 6e 64 65 78 49 74  Term(Fts5IndexIt
26910 65 72 20 2a 70 49 74 65 72 2c 20 69 6e 74 20 2a  er *pIter, int *
26920 70 6e 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20  pn){.  int n;.  
26930 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20  const char *z = 
26940 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 66 74 73  (const char*)fts
26950 35 4d 75 6c 74 69 49 74 65 72 54 65 72 6d 28 70  5MultiIterTerm(p
26960 49 74 65 72 2c 20 26 6e 29 3b 0a 20 20 2a 70 6e  Iter, &n);.  *pn
26970 20 3d 20 6e 2d 31 3b 0a 20 20 72 65 74 75 72 6e   = n-1;.  return
26980 20 26 7a 5b 31 5d 3b 0a 7d 0a 0a 0a 73 74 61 74   &z[1];.}...stat
26990 69 63 20 69 6e 74 20 66 74 73 35 49 6e 64 65 78  ic int fts5Index
269a0 45 78 74 72 61 63 74 43 6f 6c 73 65 74 20 28 0a  ExtractColset (.
269b0 20 20 46 74 73 35 43 6f 6c 73 65 74 20 2a 70 43    Fts5Colset *pC
269c0 6f 6c 73 65 74 2c 20 20 20 20 20 20 20 20 20 20  olset,          
269d0 20 20 2f 2a 20 43 6f 6c 73 65 74 20 74 6f 20 66    /* Colset to f
269e0 69 6c 74 65 72 20 6f 6e 20 2a 2f 0a 20 20 63 6f  ilter on */.  co
269f0 6e 73 74 20 75 38 20 2a 70 50 6f 73 2c 20 69 6e  nst u8 *pPos, in
26a00 74 20 6e 50 6f 73 2c 20 20 20 20 20 20 20 2f 2a  t nPos,       /*
26a10 20 50 6f 73 69 74 69 6f 6e 20 6c 69 73 74 20 2a   Position list *
26a20 2f 0a 20 20 46 74 73 35 42 75 66 66 65 72 20 2a  /.  Fts5Buffer *
26a30 70 42 75 66 20 20 20 20 20 20 20 20 20 20 20 20  pBuf            
26a40 20 20 20 20 2f 2a 20 4f 75 74 70 75 74 20 62 75      /* Output bu
26a50 66 66 65 72 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  ffer */.){.  int
26a60 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
26a70 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20 66 74 73  .  int i;..  fts
26a80 35 42 75 66 66 65 72 5a 65 72 6f 28 70 42 75 66  5BufferZero(pBuf
26a90 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  );.  for(i=0; i<
26aa0 70 43 6f 6c 73 65 74 2d 3e 6e 43 6f 6c 3b 20 69  pColset->nCol; i
26ab0 2b 2b 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 75  ++){.    const u
26ac0 38 20 2a 70 53 75 62 20 3d 20 70 50 6f 73 3b 0a  8 *pSub = pPos;.
26ad0 20 20 20 20 69 6e 74 20 6e 53 75 62 20 3d 20 66      int nSub = f
26ae0 74 73 35 49 6e 64 65 78 45 78 74 72 61 63 74 43  ts5IndexExtractC
26af0 6f 6c 28 26 70 53 75 62 2c 20 6e 50 6f 73 2c 20  ol(&pSub, nPos, 
26b00 70 43 6f 6c 73 65 74 2d 3e 61 69 43 6f 6c 5b 69  pColset->aiCol[i
26b10 5d 29 3b 0a 20 20 20 20 69 66 28 20 6e 53 75 62  ]);.    if( nSub
26b20 20 29 7b 0a 20 20 20 20 20 20 66 74 73 35 42 75   ){.      fts5Bu
26b30 66 66 65 72 41 70 70 65 6e 64 42 6c 6f 62 28 26  fferAppendBlob(&
26b40 72 63 2c 20 70 42 75 66 2c 20 6e 53 75 62 2c 20  rc, pBuf, nSub, 
26b50 70 53 75 62 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  pSub);.    }.  }
26b60 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
26b70 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61  ../*.** Return a
26b80 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 62 75   pointer to a bu
26b90 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20  ffer containing 
26ba0 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 70 6f  a copy of the po
26bb0 73 69 74 69 6f 6e 20 6c 69 73 74 20 66 6f 72 0a  sition list for.
26bc0 2a 2a 20 74 68 65 20 63 75 72 72 65 6e 74 20 65  ** the current e
26bd0 6e 74 72 79 2e 20 4f 75 74 70 75 74 20 76 61 72  ntry. Output var
26be0 69 61 62 6c 65 20 2a 70 6e 20 69 73 20 73 65 74  iable *pn is set
26bf0 20 74 6f 20 74 68 65 20 73 69 7a 65 20 6f 66 20   to the size of 
26c00 74 68 65 20 62 75 66 66 65 72 20 0a 2a 2a 20 69  the buffer .** i
26c10 6e 20 62 79 74 65 73 20 62 65 66 6f 72 65 20 72  n bytes before r
26c20 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20  eturning..**.** 
26c30 54 68 65 20 72 65 74 75 72 6e 65 64 20 70 6f 73  The returned pos
26c40 69 74 69 6f 6e 20 6c 69 73 74 20 64 6f 65 73 20  ition list does 
26c50 6e 6f 74 20 69 6e 63 6c 75 64 65 20 74 68 65 20  not include the 
26c60 22 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73  "number of bytes
26c70 22 20 76 61 72 69 6e 74 0a 2a 2a 20 66 69 65 6c  " varint.** fiel
26c80 64 20 74 68 61 74 20 73 74 61 72 74 73 20 74 68  d that starts th
26c90 65 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74 20  e position list 
26ca0 6f 6e 20 64 69 73 6b 2e 0a 2a 2f 0a 69 6e 74 20  on disk..*/.int 
26cb0 73 71 6c 69 74 65 33 46 74 73 35 49 74 65 72 50  sqlite3Fts5IterP
26cc0 6f 73 6c 69 73 74 28 0a 20 20 46 74 73 35 49 6e  oslist(.  Fts5In
26cd0 64 65 78 49 74 65 72 20 2a 70 49 74 65 72 2c 20  dexIter *pIter, 
26ce0 0a 20 20 46 74 73 35 43 6f 6c 73 65 74 20 2a 70  .  Fts5Colset *p
26cf0 43 6f 6c 73 65 74 2c 20 20 20 20 20 20 20 20 20  Colset,         
26d00 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 66 69 6c     /* Column fil
26d10 74 65 72 20 28 6f 72 20 4e 55 4c 4c 29 20 2a 2f  ter (or NULL) */
26d20 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 2a 70 70  .  const u8 **pp
26d30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
26d40 20 20 20 2f 2a 20 4f 55 54 3a 20 50 6f 69 6e 74     /* OUT: Point
26d50 65 72 20 74 6f 20 70 6f 73 69 74 69 6f 6e 2d 6c  er to position-l
26d60 69 73 74 20 64 61 74 61 20 2a 2f 0a 20 20 69 6e  ist data */.  in
26d70 74 20 2a 70 6e 2c 20 20 20 20 20 20 20 20 20 20  t *pn,          
26d80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
26d90 20 4f 55 54 3a 20 53 69 7a 65 20 6f 66 20 70 6f   OUT: Size of po
26da0 73 69 74 69 6f 6e 2d 6c 69 73 74 20 69 6e 20 62  sition-list in b
26db0 79 74 65 73 20 2a 2f 0a 20 20 69 36 34 20 2a 70  ytes */.  i64 *p
26dc0 69 52 6f 77 69 64 20 20 20 20 20 20 20 20 20 20  iRowid          
26dd0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54            /* OUT
26de0 3a 20 43 75 72 72 65 6e 74 20 72 6f 77 69 64 20  : Current rowid 
26df0 2a 2f 0a 29 7b 0a 20 20 46 74 73 35 53 65 67 49  */.){.  Fts5SegI
26e00 74 65 72 20 2a 70 53 65 67 20 3d 20 26 70 49 74  ter *pSeg = &pIt
26e10 65 72 2d 3e 61 53 65 67 5b 20 70 49 74 65 72 2d  er->aSeg[ pIter-
26e20 3e 61 46 69 72 73 74 5b 31 5d 2e 69 46 69 72 73  >aFirst[1].iFirs
26e30 74 20 5d 3b 0a 20 20 69 6e 74 20 65 44 65 74 61  t ];.  int eDeta
26e40 69 6c 20 3d 20 70 49 74 65 72 2d 3e 70 49 6e 64  il = pIter->pInd
26e50 65 78 2d 3e 70 43 6f 6e 66 69 67 2d 3e 65 44 65  ex->pConfig->eDe
26e60 74 61 69 6c 3b 0a 0a 20 20 61 73 73 65 72 74 28  tail;..  assert(
26e70 20 70 49 74 65 72 2d 3e 70 49 6e 64 65 78 2d 3e   pIter->pIndex->
26e80 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  rc==SQLITE_OK );
26e90 0a 20 20 2a 70 69 52 6f 77 69 64 20 3d 20 70 53  .  *piRowid = pS
26ea0 65 67 2d 3e 69 52 6f 77 69 64 3b 0a 20 20 69 66  eg->iRowid;.  if
26eb0 28 20 65 44 65 74 61 69 6c 3d 3d 46 54 53 35 5f  ( eDetail==FTS5_
26ec0 44 45 54 41 49 4c 5f 4e 4f 4e 45 20 29 7b 0a 20  DETAIL_NONE ){. 
26ed0 20 20 20 2a 70 6e 20 3d 20 70 53 65 67 2d 3e 6e     *pn = pSeg->n
26ee0 50 6f 73 3b 0a 20 20 7d 65 6c 73 65 0a 20 20 69  Pos;.  }else.  i
26ef0 66 28 20 65 44 65 74 61 69 6c 3d 3d 46 54 53 35  f( eDetail==FTS5
26f00 5f 44 45 54 41 49 4c 5f 46 55 4c 4c 20 0a 20 20  _DETAIL_FULL .  
26f10 20 26 26 20 70 53 65 67 2d 3e 69 4c 65 61 66 4f   && pSeg->iLeafO
26f20 66 66 73 65 74 2b 70 53 65 67 2d 3e 6e 50 6f 73  ffset+pSeg->nPos
26f30 3c 3d 70 53 65 67 2d 3e 70 4c 65 61 66 2d 3e 73  <=pSeg->pLeaf->s
26f40 7a 4c 65 61 66 20 0a 20 20 29 7b 0a 20 20 20 20  zLeaf .  ){.    
26f50 75 38 20 2a 70 50 6f 73 20 3d 20 26 70 53 65 67  u8 *pPos = &pSeg
26f60 2d 3e 70 4c 65 61 66 2d 3e 70 5b 70 53 65 67 2d  ->pLeaf->p[pSeg-
26f70 3e 69 4c 65 61 66 4f 66 66 73 65 74 5d 3b 0a 20  >iLeafOffset];. 
26f80 20 20 20 69 66 28 20 70 43 6f 6c 73 65 74 3d 3d     if( pColset==
26f90 30 20 7c 7c 20 70 49 74 65 72 2d 3e 62 46 69 6c  0 || pIter->bFil
26fa0 74 65 72 65 64 20 29 7b 0a 20 20 20 20 20 20 2a  tered ){.      *
26fb0 70 6e 20 3d 20 70 53 65 67 2d 3e 6e 50 6f 73 3b  pn = pSeg->nPos;
26fc0 0a 20 20 20 20 20 20 2a 70 70 20 3d 20 70 50 6f  .      *pp = pPo
26fd0 73 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  s;.    }else if(
26fe0 20 70 43 6f 6c 73 65 74 2d 3e 6e 43 6f 6c 3d 3d   pColset->nCol==
26ff0 31 20 29 7b 0a 20 20 20 20 20 20 2a 70 70 20 3d  1 ){.      *pp =
27000 20 70 50 6f 73 3b 0a 20 20 20 20 20 20 2a 70 6e   pPos;.      *pn
27010 20 3d 20 66 74 73 35 49 6e 64 65 78 45 78 74 72   = fts5IndexExtr
27020 61 63 74 43 6f 6c 28 70 70 2c 20 70 53 65 67 2d  actCol(pp, pSeg-
27030 3e 6e 50 6f 73 2c 20 70 43 6f 6c 73 65 74 2d 3e  >nPos, pColset->
27040 61 69 43 6f 6c 5b 30 5d 29 3b 0a 20 20 20 20 7d  aiCol[0]);.    }
27050 65 6c 73 65 7b 0a 20 20 20 20 20 20 66 74 73 35  else{.      fts5
27060 42 75 66 66 65 72 5a 65 72 6f 28 26 70 49 74 65  BufferZero(&pIte
27070 72 2d 3e 70 6f 73 6c 69 73 74 29 3b 0a 20 20 20  r->poslist);.   
27080 20 20 20 66 74 73 35 49 6e 64 65 78 45 78 74 72     fts5IndexExtr
27090 61 63 74 43 6f 6c 73 65 74 28 70 43 6f 6c 73 65  actColset(pColse
270a0 74 2c 20 70 50 6f 73 2c 20 70 53 65 67 2d 3e 6e  t, pPos, pSeg->n
270b0 50 6f 73 2c 20 26 70 49 74 65 72 2d 3e 70 6f 73  Pos, &pIter->pos
270c0 6c 69 73 74 29 3b 0a 20 20 20 20 20 20 2a 70 70  list);.      *pp
270d0 20 3d 20 70 49 74 65 72 2d 3e 70 6f 73 6c 69 73   = pIter->poslis
270e0 74 2e 70 3b 0a 20 20 20 20 20 20 2a 70 6e 20 3d  t.p;.      *pn =
270f0 20 70 49 74 65 72 2d 3e 70 6f 73 6c 69 73 74 2e   pIter->poslist.
27100 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  n;.    }.  }else
27110 7b 0a 20 20 20 20 66 74 73 35 42 75 66 66 65 72  {.    fts5Buffer
27120 5a 65 72 6f 28 26 70 49 74 65 72 2d 3e 70 6f 73  Zero(&pIter->pos
27130 6c 69 73 74 29 3b 0a 20 20 20 20 66 74 73 35 53  list);.    fts5S
27140 65 67 69 74 65 72 50 6f 73 6c 69 73 74 28 70 49  egiterPoslist(pI
27150 74 65 72 2d 3e 70 49 6e 64 65 78 2c 20 70 53 65  ter->pIndex, pSe
27160 67 2c 20 70 43 6f 6c 73 65 74 2c 20 26 70 49 74  g, pColset, &pIt
27170 65 72 2d 3e 70 6f 73 6c 69 73 74 29 3b 0a 20 20  er->poslist);.  
27180 20 20 69 66 28 20 65 44 65 74 61 69 6c 3d 3d 46    if( eDetail==F
27190 54 53 35 5f 44 45 54 41 49 4c 5f 46 55 4c 4c 20  TS5_DETAIL_FULL 
271a0 29 7b 0a 20 20 20 20 20 20 2a 70 70 20 3d 20 70  ){.      *pp = p
271b0 49 74 65 72 2d 3e 70 6f 73 6c 69 73 74 2e 70 3b  Iter->poslist.p;
271c0 0a 20 20 20 20 7d 0a 20 20 20 20 2a 70 6e 20 3d  .    }.    *pn =
271d0 20 70 49 74 65 72 2d 3e 70 6f 73 6c 69 73 74 2e   pIter->poslist.
271e0 6e 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  n;.  }.  return 
271f0 66 74 73 35 49 6e 64 65 78 52 65 74 75 72 6e 28  fts5IndexReturn(
27200 70 49 74 65 72 2d 3e 70 49 6e 64 65 78 29 3b 0a  pIter->pIndex);.
27210 7d 0a 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74  }..int sqlite3Ft
27220 73 35 49 74 65 72 43 6f 6c 6c 69 73 74 28 0a 20  s5IterCollist(. 
27230 20 46 74 73 35 49 6e 64 65 78 49 74 65 72 20 2a   Fts5IndexIter *
27240 70 49 74 65 72 2c 20 0a 20 20 63 6f 6e 73 74 20  pIter, .  const 
27250 75 38 20 2a 2a 70 70 2c 20 20 20 20 20 20 20 20  u8 **pp,        
27260 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54            /* OUT
27270 3a 20 50 6f 69 6e 74 65 72 20 74 6f 20 70 6f 73  : Pointer to pos
27280 69 74 69 6f 6e 2d 6c 69 73 74 20 64 61 74 61 20  ition-list data 
27290 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 20 20 20 20  */.  int *pn    
272a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
272b0 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 53 69 7a       /* OUT: Siz
272c0 65 20 6f 66 20 70 6f 73 69 74 69 6f 6e 2d 6c 69  e of position-li
272d0 73 74 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 29  st in bytes */.)
272e0 7b 0a 20 20 61 73 73 65 72 74 28 20 70 49 74 65  {.  assert( pIte
272f0 72 2d 3e 70 49 6e 64 65 78 2d 3e 70 43 6f 6e 66  r->pIndex->pConf
27300 69 67 2d 3e 65 44 65 74 61 69 6c 3d 3d 46 54 53  ig->eDetail==FTS
27310 35 5f 44 45 54 41 49 4c 5f 43 4f 4c 55 4d 4e 53  5_DETAIL_COLUMNS
27320 20 29 3b 0a 20 20 2a 70 70 20 3d 20 70 49 74 65   );.  *pp = pIte
27330 72 2d 3e 70 6f 73 6c 69 73 74 2e 70 3b 0a 20 20  r->poslist.p;.  
27340 2a 70 6e 20 3d 20 70 49 74 65 72 2d 3e 70 6f 73  *pn = pIter->pos
27350 6c 69 73 74 2e 6e 3b 0a 20 20 72 65 74 75 72 6e  list.n;.  return
27360 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
27370 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
27380 6f 6e 20 69 73 20 73 69 6d 69 6c 61 72 20 74 6f  on is similar to
27390 20 73 71 6c 69 74 65 33 46 74 73 35 49 74 65 72   sqlite3Fts5Iter
273a0 50 6f 73 6c 69 73 74 28 29 2c 20 65 78 63 65 70  Poslist(), excep
273b0 74 20 74 68 61 74 20 69 74 0a 2a 2a 20 63 6f 70  t that it.** cop
273c0 69 65 73 20 74 68 65 20 70 6f 73 69 74 69 6f 6e  ies the position
273d0 20 6c 69 73 74 20 69 6e 74 6f 20 74 68 65 20 62   list into the b
273e0 75 66 66 65 72 20 73 75 70 70 6c 69 65 64 20 61  uffer supplied a
273f0 73 20 74 68 65 20 73 65 63 6f 6e 64 20 0a 2a 2a  s the second .**
27400 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 69 6e   argument..*/.in
27410 74 20 73 71 6c 69 74 65 33 46 74 73 35 49 74 65  t sqlite3Fts5Ite
27420 72 50 6f 73 6c 69 73 74 42 75 66 66 65 72 28 46  rPoslistBuffer(F
27430 74 73 35 49 6e 64 65 78 49 74 65 72 20 2a 70 49  ts5IndexIter *pI
27440 74 65 72 2c 20 46 74 73 35 42 75 66 66 65 72 20  ter, Fts5Buffer 
27450 2a 70 42 75 66 29 7b 0a 20 20 46 74 73 35 49 6e  *pBuf){.  Fts5In
27460 64 65 78 20 2a 70 20 3d 20 70 49 74 65 72 2d 3e  dex *p = pIter->
27470 70 49 6e 64 65 78 3b 0a 20 20 46 74 73 35 53 65  pIndex;.  Fts5Se
27480 67 49 74 65 72 20 2a 70 53 65 67 20 3d 20 26 70  gIter *pSeg = &p
27490 49 74 65 72 2d 3e 61 53 65 67 5b 20 70 49 74 65  Iter->aSeg[ pIte
274a0 72 2d 3e 61 46 69 72 73 74 5b 31 5d 2e 69 46 69  r->aFirst[1].iFi
274b0 72 73 74 20 5d 3b 0a 20 20 61 73 73 65 72 74 28  rst ];.  assert(
274c0 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
274d0 4b 20 29 3b 0a 20 20 66 74 73 35 42 75 66 66 65  K );.  fts5Buffe
274e0 72 5a 65 72 6f 28 70 42 75 66 29 3b 0a 20 20 66  rZero(pBuf);.  f
274f0 74 73 35 53 65 67 69 74 65 72 50 6f 73 6c 69 73  ts5SegiterPoslis
27500 74 28 70 2c 20 70 53 65 67 2c 20 30 2c 20 70 42  t(p, pSeg, 0, pB
27510 75 66 29 3b 0a 20 20 72 65 74 75 72 6e 20 66 74  uf);.  return ft
27520 73 35 49 6e 64 65 78 52 65 74 75 72 6e 28 70 29  s5IndexReturn(p)
27530 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65  ;.}../*.** Close
27540 20 61 6e 20 69 74 65 72 61 74 6f 72 20 6f 70 65   an iterator ope
27550 6e 65 64 20 62 79 20 61 6e 20 65 61 72 6c 69 65  ned by an earlie
27560 72 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65  r call to sqlite
27570 33 46 74 73 35 49 6e 64 65 78 51 75 65 72 79 28  3Fts5IndexQuery(
27580 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  )..*/.void sqlit
27590 65 33 46 74 73 35 49 74 65 72 43 6c 6f 73 65 28  e3Fts5IterClose(
275a0 46 74 73 35 49 6e 64 65 78 49 74 65 72 20 2a 70  Fts5IndexIter *p
275b0 49 74 65 72 29 7b 0a 20 20 69 66 28 20 70 49 74  Iter){.  if( pIt
275c0 65 72 20 29 7b 0a 20 20 20 20 46 74 73 35 49 6e  er ){.    Fts5In
275d0 64 65 78 20 2a 70 49 6e 64 65 78 20 3d 20 70 49  dex *pIndex = pI
275e0 74 65 72 2d 3e 70 49 6e 64 65 78 3b 0a 20 20 20  ter->pIndex;.   
275f0 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 46 72   fts5MultiIterFr
27600 65 65 28 70 49 74 65 72 2d 3e 70 49 6e 64 65 78  ee(pIter->pIndex
27610 2c 20 70 49 74 65 72 29 3b 0a 20 20 20 20 66 74  , pIter);.    ft
27620 73 35 43 6c 6f 73 65 52 65 61 64 65 72 28 70 49  s5CloseReader(pI
27630 6e 64 65 78 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  ndex);.  }.}../*
27640 0a 2a 2a 20 52 65 61 64 20 61 6e 64 20 64 65 63  .** Read and dec
27650 6f 64 65 20 74 68 65 20 22 61 76 65 72 61 67 65  ode the "average
27660 73 22 20 72 65 63 6f 72 64 20 66 72 6f 6d 20 74  s" record from t
27670 68 65 20 64 61 74 61 62 61 73 65 2e 20 0a 2a 2a  he database. .**
27680 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72 20 61 6e  .** Parameter an
27690 53 69 7a 65 20 6d 75 73 74 20 70 6f 69 6e 74 20  Size must point 
276a0 74 6f 20 61 6e 20 61 72 72 61 79 20 6f 66 20 73  to an array of s
276b0 69 7a 65 20 6e 43 6f 6c 2c 20 77 68 65 72 65 20  ize nCol, where 
276c0 6e 43 6f 6c 20 69 73 0a 2a 2a 20 74 68 65 20 6e  nCol is.** the n
276d0 75 6d 62 65 72 20 6f 66 20 75 73 65 72 20 64 65  umber of user de
276e0 66 69 6e 65 64 20 63 6f 6c 75 6d 6e 73 20 69 6e  fined columns in
276f0 20 74 68 65 20 46 54 53 20 74 61 62 6c 65 2e 0a   the FTS table..
27700 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74  */.int sqlite3Ft
27710 73 35 49 6e 64 65 78 47 65 74 41 76 65 72 61 67  s5IndexGetAverag
27720 65 73 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c  es(Fts5Index *p,
27730 20 69 36 34 20 2a 70 6e 52 6f 77 2c 20 69 36 34   i64 *pnRow, i64
27740 20 2a 61 6e 53 69 7a 65 29 7b 0a 20 20 69 6e 74   *anSize){.  int
27750 20 6e 43 6f 6c 20 3d 20 70 2d 3e 70 43 6f 6e 66   nCol = p->pConf
27760 69 67 2d 3e 6e 43 6f 6c 3b 0a 20 20 46 74 73 35  ig->nCol;.  Fts5
27770 44 61 74 61 20 2a 70 44 61 74 61 3b 0a 0a 20 20  Data *pData;..  
27780 2a 70 6e 52 6f 77 20 3d 20 30 3b 0a 20 20 6d 65  *pnRow = 0;.  me
27790 6d 73 65 74 28 61 6e 53 69 7a 65 2c 20 30 2c 20  mset(anSize, 0, 
277a0 73 69 7a 65 6f 66 28 69 36 34 29 20 2a 20 6e 43  sizeof(i64) * nC
277b0 6f 6c 29 3b 0a 20 20 70 44 61 74 61 20 3d 20 66  ol);.  pData = f
277c0 74 73 35 44 61 74 61 52 65 61 64 28 70 2c 20 46  ts5DataRead(p, F
277d0 54 53 35 5f 41 56 45 52 41 47 45 53 5f 52 4f 57  TS5_AVERAGES_ROW
277e0 49 44 29 3b 0a 20 20 69 66 28 20 70 2d 3e 72 63  ID);.  if( p->rc
277f0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70  ==SQLITE_OK && p
27800 44 61 74 61 2d 3e 6e 6e 20 29 7b 0a 20 20 20 20  Data->nn ){.    
27810 69 6e 74 20 69 20 3d 20 30 3b 0a 20 20 20 20 69  int i = 0;.    i
27820 6e 74 20 69 43 6f 6c 3b 0a 20 20 20 20 69 20 2b  nt iCol;.    i +
27830 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e 74 28  = fts5GetVarint(
27840 26 70 44 61 74 61 2d 3e 70 5b 69 5d 2c 20 28 75  &pData->p[i], (u
27850 36 34 2a 29 70 6e 52 6f 77 29 3b 0a 20 20 20 20  64*)pnRow);.    
27860 66 6f 72 28 69 43 6f 6c 3d 30 3b 20 69 3c 70 44  for(iCol=0; i<pD
27870 61 74 61 2d 3e 6e 6e 20 26 26 20 69 43 6f 6c 3c  ata->nn && iCol<
27880 6e 43 6f 6c 3b 20 69 43 6f 6c 2b 2b 29 7b 0a 20  nCol; iCol++){. 
27890 20 20 20 20 20 69 20 2b 3d 20 66 74 73 35 47 65       i += fts5Ge
278a0 74 56 61 72 69 6e 74 28 26 70 44 61 74 61 2d 3e  tVarint(&pData->
278b0 70 5b 69 5d 2c 20 28 75 36 34 2a 29 26 61 6e 53  p[i], (u64*)&anS
278c0 69 7a 65 5b 69 43 6f 6c 5d 29 3b 0a 20 20 20 20  ize[iCol]);.    
278d0 7d 0a 20 20 7d 0a 0a 20 20 66 74 73 35 44 61 74  }.  }..  fts5Dat
278e0 61 52 65 6c 65 61 73 65 28 70 44 61 74 61 29 3b  aRelease(pData);
278f0 0a 20 20 72 65 74 75 72 6e 20 66 74 73 35 49 6e  .  return fts5In
27900 64 65 78 52 65 74 75 72 6e 28 70 29 3b 0a 7d 0a  dexReturn(p);.}.
27910 0a 2f 2a 0a 2a 2a 20 52 65 70 6c 61 63 65 20 74  ./*.** Replace t
27920 68 65 20 63 75 72 72 65 6e 74 20 22 61 76 65 72  he current "aver
27930 61 67 65 73 22 20 72 65 63 6f 72 64 20 77 69 74  ages" record wit
27940 68 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  h the contents o
27950 66 20 74 68 65 20 62 75 66 66 65 72 20 0a 2a 2a  f the buffer .**
27960 20 73 75 70 70 6c 69 65 64 20 61 73 20 74 68 65   supplied as the
27970 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
27980 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
27990 46 74 73 35 49 6e 64 65 78 53 65 74 41 76 65 72  Fts5IndexSetAver
279a0 61 67 65 73 28 46 74 73 35 49 6e 64 65 78 20 2a  ages(Fts5Index *
279b0 70 2c 20 63 6f 6e 73 74 20 75 38 20 2a 70 44 61  p, const u8 *pDa
279c0 74 61 2c 20 69 6e 74 20 6e 44 61 74 61 29 7b 0a  ta, int nData){.
279d0 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72 63 3d    assert( p->rc=
279e0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20  =SQLITE_OK );.  
279f0 66 74 73 35 44 61 74 61 57 72 69 74 65 28 70 2c  fts5DataWrite(p,
27a00 20 46 54 53 35 5f 41 56 45 52 41 47 45 53 5f 52   FTS5_AVERAGES_R
27a10 4f 57 49 44 2c 20 70 44 61 74 61 2c 20 6e 44 61  OWID, pData, nDa
27a20 74 61 29 3b 0a 20 20 72 65 74 75 72 6e 20 66 74  ta);.  return ft
27a30 73 35 49 6e 64 65 78 52 65 74 75 72 6e 28 70 29  s5IndexReturn(p)
27a40 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
27a50 6e 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62  n the total numb
27a60 65 72 20 6f 66 20 62 6c 6f 63 6b 73 20 74 68 69  er of blocks thi
27a70 73 20 6d 6f 64 75 6c 65 20 68 61 73 20 72 65 61  s module has rea
27a80 64 20 66 72 6f 6d 20 74 68 65 20 25 5f 64 61 74  d from the %_dat
27a90 61 0a 2a 2a 20 74 61 62 6c 65 20 73 69 6e 63 65  a.** table since
27aa0 20 69 74 20 77 61 73 20 63 72 65 61 74 65 64 2e   it was created.
27ab0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46  .*/.int sqlite3F
27ac0 74 73 35 49 6e 64 65 78 52 65 61 64 73 28 46 74  ts5IndexReads(Ft
27ad0 73 35 49 6e 64 65 78 20 2a 70 29 7b 0a 20 20 72  s5Index *p){.  r
27ae0 65 74 75 72 6e 20 70 2d 3e 6e 52 65 61 64 3b 0a  eturn p->nRead;.
27af0 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65  }../*.** Set the
27b00 20 33 32 2d 62 69 74 20 63 6f 6f 6b 69 65 20 76   32-bit cookie v
27b10 61 6c 75 65 20 73 74 6f 72 65 64 20 61 74 20 74  alue stored at t
27b20 68 65 20 73 74 61 72 74 20 6f 66 20 61 6c 6c 20  he start of all 
27b30 73 74 72 75 63 74 75 72 65 20 0a 2a 2a 20 72 65  structure .** re
27b40 63 6f 72 64 73 20 74 6f 20 74 68 65 20 76 61 6c  cords to the val
27b50 75 65 20 70 61 73 73 65 64 20 61 73 20 74 68 65  ue passed as the
27b60 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
27b70 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53  ..**.** Return S
27b80 51 4c 49 54 45 5f 4f 4b 20 69 66 20 73 75 63 63  QLITE_OK if succ
27b90 65 73 73 66 75 6c 2c 20 6f 72 20 61 6e 20 53 51  essful, or an SQ
27ba0 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20  Lite error code 
27bb0 69 66 20 61 6e 20 65 72 72 6f 72 0a 2a 2a 20 6f  if an error.** o
27bc0 63 63 75 72 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ccurs..*/.int sq
27bd0 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78 53 65  lite3Fts5IndexSe
27be0 74 43 6f 6f 6b 69 65 28 46 74 73 35 49 6e 64 65  tCookie(Fts5Inde
27bf0 78 20 2a 70 2c 20 69 6e 74 20 69 4e 65 77 29 7b  x *p, int iNew){
27c00 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
27c10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27c20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
27c30 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 46 74 73 35  n code */.  Fts5
27c40 43 6f 6e 66 69 67 20 2a 70 43 6f 6e 66 69 67 20  Config *pConfig 
27c50 3d 20 70 2d 3e 70 43 6f 6e 66 69 67 3b 20 20 20  = p->pConfig;   
27c60 20 2f 2a 20 43 6f 6e 66 69 67 75 72 61 74 69 6f   /* Configuratio
27c70 6e 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 75 38  n object */.  u8
27c80 20 61 43 6f 6f 6b 69 65 5b 34 5d 3b 20 20 20 20   aCookie[4];    
27c90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27ca0 20 20 20 2f 2a 20 42 69 6e 61 72 79 20 72 65 70     /* Binary rep
27cb0 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20 69  resentation of i
27cc0 4e 65 77 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  New */.  sqlite3
27cd0 5f 62 6c 6f 62 20 2a 70 42 6c 6f 62 20 3d 20 30  _blob *pBlob = 0
27ce0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  ;..  assert( p->
27cf0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  rc==SQLITE_OK );
27d00 0a 20 20 73 71 6c 69 74 65 33 46 74 73 35 50 75  .  sqlite3Fts5Pu
27d10 74 33 32 28 61 43 6f 6f 6b 69 65 2c 20 69 4e 65  t32(aCookie, iNe
27d20 77 29 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69  w);..  rc = sqli
27d30 74 65 33 5f 62 6c 6f 62 5f 6f 70 65 6e 28 70 43  te3_blob_open(pC
27d40 6f 6e 66 69 67 2d 3e 64 62 2c 20 70 43 6f 6e 66  onfig->db, pConf
27d50 69 67 2d 3e 7a 44 62 2c 20 70 2d 3e 7a 44 61 74  ig->zDb, p->zDat
27d60 61 54 62 6c 2c 20 0a 20 20 20 20 20 20 22 62 6c  aTbl, .      "bl
27d70 6f 63 6b 22 2c 20 46 54 53 35 5f 53 54 52 55 43  ock", FTS5_STRUC
27d80 54 55 52 45 5f 52 4f 57 49 44 2c 20 31 2c 20 26  TURE_ROWID, 1, &
27d90 70 42 6c 6f 62 0a 20 20 29 3b 0a 20 20 69 66 28  pBlob.  );.  if(
27da0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
27db0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62 6c  {.    sqlite3_bl
27dc0 6f 62 5f 77 72 69 74 65 28 70 42 6c 6f 62 2c 20  ob_write(pBlob, 
27dd0 61 43 6f 6f 6b 69 65 2c 20 34 2c 20 30 29 3b 0a  aCookie, 4, 0);.
27de0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
27df0 5f 62 6c 6f 62 5f 63 6c 6f 73 65 28 70 42 6c 6f  _blob_close(pBlo
27e00 62 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72  b);.  }..  retur
27e10 6e 20 72 63 3b 0a 7d 0a 0a 69 6e 74 20 73 71 6c  n rc;.}..int sql
27e20 69 74 65 33 46 74 73 35 49 6e 64 65 78 4c 6f 61  ite3Fts5IndexLoa
27e30 64 43 6f 6e 66 69 67 28 46 74 73 35 49 6e 64 65  dConfig(Fts5Inde
27e40 78 20 2a 70 29 7b 0a 20 20 46 74 73 35 53 74 72  x *p){.  Fts5Str
27e50 75 63 74 75 72 65 20 2a 70 53 74 72 75 63 74 3b  ucture *pStruct;
27e60 0a 20 20 70 53 74 72 75 63 74 20 3d 20 66 74 73  .  pStruct = fts
27e70 35 53 74 72 75 63 74 75 72 65 52 65 61 64 28 70  5StructureRead(p
27e80 29 3b 0a 20 20 66 74 73 35 53 74 72 75 63 74 75  );.  fts5Structu
27e90 72 65 52 65 6c 65 61 73 65 28 70 53 74 72 75 63  reRelease(pStruc
27ea0 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 66 74 73  t);.  return fts
27eb0 35 49 6e 64 65 78 52 65 74 75 72 6e 28 70 29 3b  5IndexReturn(p);
27ec0 0a 7d 0a 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .}.../**********
27ed0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
27ee0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
27ef0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
27f00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
27f10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
27f20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
27f30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
27f40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
27f50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 42 65  **********.** Be
27f60 6c 6f 77 20 74 68 69 73 20 70 6f 69 6e 74 20 69  low this point i
27f70 73 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61  s the implementa
27f80 74 69 6f 6e 20 6f 66 20 74 68 65 20 69 6e 74 65  tion of the inte
27f90 67 72 69 74 79 2d 63 68 65 63 6b 20 0a 2a 2a 20  grity-check .** 
27fa0 66 75 6e 63 74 69 6f 6e 61 6c 69 74 79 2e 0a 2a  functionality..*
27fb0 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  /../*.** Return 
27fc0 61 20 73 69 6d 70 6c 65 20 63 68 65 63 6b 73 75  a simple checksu
27fd0 6d 20 76 61 6c 75 65 20 62 61 73 65 64 20 6f 6e  m value based on
27fe0 20 74 68 65 20 61 72 67 75 6d 65 6e 74 73 2e 0a   the arguments..
27ff0 2a 2f 0a 75 36 34 20 73 71 6c 69 74 65 33 46 74  */.u64 sqlite3Ft
28000 73 35 49 6e 64 65 78 45 6e 74 72 79 43 6b 73 75  s5IndexEntryCksu
28010 6d 28 0a 20 20 69 36 34 20 69 52 6f 77 69 64 2c  m(.  i64 iRowid,
28020 20 0a 20 20 69 6e 74 20 69 43 6f 6c 2c 20 0a 20   .  int iCol, . 
28030 20 69 6e 74 20 69 50 6f 73 2c 20 0a 20 20 69 6e   int iPos, .  in
28040 74 20 69 49 64 78 2c 0a 20 20 63 6f 6e 73 74 20  t iIdx,.  const 
28050 63 68 61 72 20 2a 70 54 65 72 6d 2c 0a 20 20 69  char *pTerm,.  i
28060 6e 74 20 6e 54 65 72 6d 0a 29 7b 0a 20 20 69 6e  nt nTerm.){.  in
28070 74 20 69 3b 0a 20 20 75 36 34 20 72 65 74 20 3d  t i;.  u64 ret =
28080 20 69 52 6f 77 69 64 3b 0a 20 20 72 65 74 20 2b   iRowid;.  ret +
28090 3d 20 28 72 65 74 3c 3c 33 29 20 2b 20 69 43 6f  = (ret<<3) + iCo
280a0 6c 3b 0a 20 20 72 65 74 20 2b 3d 20 28 72 65 74  l;.  ret += (ret
280b0 3c 3c 33 29 20 2b 20 69 50 6f 73 3b 0a 20 20 69  <<3) + iPos;.  i
280c0 66 28 20 69 49 64 78 3e 3d 30 20 29 20 72 65 74  f( iIdx>=0 ) ret
280d0 20 2b 3d 20 28 72 65 74 3c 3c 33 29 20 2b 20 28   += (ret<<3) + (
280e0 46 54 53 35 5f 4d 41 49 4e 5f 50 52 45 46 49 58  FTS5_MAIN_PREFIX
280f0 20 2b 20 69 49 64 78 29 3b 0a 20 20 66 6f 72 28   + iIdx);.  for(
28100 69 3d 30 3b 20 69 3c 6e 54 65 72 6d 3b 20 69 2b  i=0; i<nTerm; i+
28110 2b 29 20 72 65 74 20 2b 3d 20 28 72 65 74 3c 3c  +) ret += (ret<<
28120 33 29 20 2b 20 70 54 65 72 6d 5b 69 5d 3b 0a 20  3) + pTerm[i];. 
28130 20 72 65 74 75 72 6e 20 72 65 74 3b 0a 7d 0a 0a   return ret;.}..
28140 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
28150 42 55 47 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  BUG./*.** This f
28160 75 6e 63 74 69 6f 6e 20 69 73 20 70 75 72 65 6c  unction is purel
28170 79 20 61 6e 20 69 6e 74 65 72 6e 61 6c 20 74 65  y an internal te
28180 73 74 2e 20 49 74 20 64 6f 65 73 20 6e 6f 74 20  st. It does not 
28190 63 6f 6e 74 72 69 62 75 74 65 20 74 6f 20 0a 2a  contribute to .*
281a0 2a 20 46 54 53 20 66 75 6e 63 74 69 6f 6e 61 6c  * FTS functional
281b0 69 74 79 2c 20 6f 72 20 65 76 65 6e 20 74 68 65  ity, or even the
281c0 20 69 6e 74 65 67 72 69 74 79 2d 63 68 65 63 6b   integrity-check
281d0 2c 20 69 6e 20 61 6e 79 20 77 61 79 2e 0a 2a 2a  , in any way..**
281e0 0a 2a 2a 20 49 6e 73 74 65 61 64 2c 20 69 74 20  .** Instead, it 
281f0 74 65 73 74 73 20 74 68 61 74 20 74 68 65 20 73  tests that the s
28200 61 6d 65 20 73 65 74 20 6f 66 20 70 67 6e 6f 2f  ame set of pgno/
28210 72 6f 77 69 64 20 63 6f 6d 62 69 6e 61 74 69 6f  rowid combinatio
28220 6e 73 20 61 72 65 20 0a 2a 2a 20 76 69 73 69 74  ns are .** visit
28230 65 64 20 72 65 67 61 72 64 6c 65 73 73 20 6f 66  ed regardless of
28240 20 77 68 65 74 68 65 72 20 74 68 65 20 64 6f 63   whether the doc
28250 6c 69 73 74 2d 69 6e 64 65 78 20 69 64 65 6e 74  list-index ident
28260 69 66 69 65 64 20 62 79 20 70 61 72 61 6d 65 74  ified by paramet
28270 65 72 73 0a 2a 2a 20 69 53 65 67 69 64 2f 69 4c  ers.** iSegid/iL
28280 65 61 66 20 69 73 20 69 74 65 72 61 74 65 64 20  eaf is iterated 
28290 69 6e 20 66 6f 72 77 61 72 64 73 20 6f 72 20 72  in forwards or r
282a0 65 76 65 72 73 65 20 6f 72 64 65 72 2e 0a 2a 2f  everse order..*/
282b0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
282c0 35 54 65 73 74 44 6c 69 64 78 52 65 76 65 72 73  5TestDlidxRevers
282d0 65 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a  e(.  Fts5Index *
282e0 70 2c 20 0a 20 20 69 6e 74 20 69 53 65 67 69 64  p, .  int iSegid
282f0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
28300 20 20 20 20 20 20 2f 2a 20 53 65 67 6d 65 6e 74        /* Segment
28310 20 69 64 20 74 6f 20 6c 6f 61 64 20 66 72 6f 6d   id to load from
28320 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 65 61 66 20   */.  int iLeaf 
28330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28340 20 20 20 20 20 20 2f 2a 20 4c 6f 61 64 20 64 6f        /* Load do
28350 63 6c 69 73 74 2d 69 6e 64 65 78 20 66 6f 72 20  clist-index for 
28360 74 68 69 73 20 6c 65 61 66 20 2a 2f 0a 29 7b 0a  this leaf */.){.
28370 20 20 46 74 73 35 44 6c 69 64 78 49 74 65 72 20    Fts5DlidxIter 
28380 2a 70 44 6c 69 64 78 20 3d 20 30 3b 0a 20 20 75  *pDlidx = 0;.  u
28390 36 34 20 63 6b 73 75 6d 31 20 3d 20 31 33 3b 0a  64 cksum1 = 13;.
283a0 20 20 75 36 34 20 63 6b 73 75 6d 32 20 3d 20 31    u64 cksum2 = 1
283b0 33 3b 0a 0a 20 20 66 6f 72 28 70 44 6c 69 64 78  3;..  for(pDlidx
283c0 3d 66 74 73 35 44 6c 69 64 78 49 74 65 72 49 6e  =fts5DlidxIterIn
283d0 69 74 28 70 2c 20 30 2c 20 69 53 65 67 69 64 2c  it(p, 0, iSegid,
283e0 20 69 4c 65 61 66 29 3b 0a 20 20 20 20 20 20 66   iLeaf);.      f
283f0 74 73 35 44 6c 69 64 78 49 74 65 72 45 6f 66 28  ts5DlidxIterEof(
28400 70 2c 20 70 44 6c 69 64 78 29 3d 3d 30 3b 0a 20  p, pDlidx)==0;. 
28410 20 20 20 20 20 66 74 73 35 44 6c 69 64 78 49 74       fts5DlidxIt
28420 65 72 4e 65 78 74 28 70 2c 20 70 44 6c 69 64 78  erNext(p, pDlidx
28430 29 0a 20 20 29 7b 0a 20 20 20 20 69 36 34 20 69  ).  ){.    i64 i
28440 52 6f 77 69 64 20 3d 20 66 74 73 35 44 6c 69 64  Rowid = fts5Dlid
28450 78 49 74 65 72 52 6f 77 69 64 28 70 44 6c 69 64  xIterRowid(pDlid
28460 78 29 3b 0a 20 20 20 20 69 6e 74 20 70 67 6e 6f  x);.    int pgno
28470 20 3d 20 66 74 73 35 44 6c 69 64 78 49 74 65 72   = fts5DlidxIter
28480 50 67 6e 6f 28 70 44 6c 69 64 78 29 3b 0a 20 20  Pgno(pDlidx);.  
28490 20 20 61 73 73 65 72 74 28 20 70 67 6e 6f 3e 69    assert( pgno>i
284a0 4c 65 61 66 20 29 3b 0a 20 20 20 20 63 6b 73 75  Leaf );.    cksu
284b0 6d 31 20 2b 3d 20 69 52 6f 77 69 64 20 2b 20 28  m1 += iRowid + (
284c0 28 69 36 34 29 70 67 6e 6f 3c 3c 33 32 29 3b 0a  (i64)pgno<<32);.
284d0 20 20 7d 0a 20 20 66 74 73 35 44 6c 69 64 78 49    }.  fts5DlidxI
284e0 74 65 72 46 72 65 65 28 70 44 6c 69 64 78 29 3b  terFree(pDlidx);
284f0 0a 20 20 70 44 6c 69 64 78 20 3d 20 30 3b 0a 0a  .  pDlidx = 0;..
28500 20 20 66 6f 72 28 70 44 6c 69 64 78 3d 66 74 73    for(pDlidx=fts
28510 35 44 6c 69 64 78 49 74 65 72 49 6e 69 74 28 70  5DlidxIterInit(p
28520 2c 20 31 2c 20 69 53 65 67 69 64 2c 20 69 4c 65  , 1, iSegid, iLe
28530 61 66 29 3b 0a 20 20 20 20 20 20 66 74 73 35 44  af);.      fts5D
28540 6c 69 64 78 49 74 65 72 45 6f 66 28 70 2c 20 70  lidxIterEof(p, p
28550 44 6c 69 64 78 29 3d 3d 30 3b 0a 20 20 20 20 20  Dlidx)==0;.     
28560 20 66 74 73 35 44 6c 69 64 78 49 74 65 72 50 72   fts5DlidxIterPr
28570 65 76 28 70 2c 20 70 44 6c 69 64 78 29 0a 20 20  ev(p, pDlidx).  
28580 29 7b 0a 20 20 20 20 69 36 34 20 69 52 6f 77 69  ){.    i64 iRowi
28590 64 20 3d 20 66 74 73 35 44 6c 69 64 78 49 74 65  d = fts5DlidxIte
285a0 72 52 6f 77 69 64 28 70 44 6c 69 64 78 29 3b 0a  rRowid(pDlidx);.
285b0 20 20 20 20 69 6e 74 20 70 67 6e 6f 20 3d 20 66      int pgno = f
285c0 74 73 35 44 6c 69 64 78 49 74 65 72 50 67 6e 6f  ts5DlidxIterPgno
285d0 28 70 44 6c 69 64 78 29 3b 0a 20 20 20 20 61 73  (pDlidx);.    as
285e0 73 65 72 74 28 20 66 74 73 35 44 6c 69 64 78 49  sert( fts5DlidxI
285f0 74 65 72 50 67 6e 6f 28 70 44 6c 69 64 78 29 3e  terPgno(pDlidx)>
28600 69 4c 65 61 66 20 29 3b 0a 20 20 20 20 63 6b 73  iLeaf );.    cks
28610 75 6d 32 20 2b 3d 20 69 52 6f 77 69 64 20 2b 20  um2 += iRowid + 
28620 28 28 69 36 34 29 70 67 6e 6f 3c 3c 33 32 29 3b  ((i64)pgno<<32);
28630 0a 20 20 7d 0a 20 20 66 74 73 35 44 6c 69 64 78  .  }.  fts5Dlidx
28640 49 74 65 72 46 72 65 65 28 70 44 6c 69 64 78 29  IterFree(pDlidx)
28650 3b 0a 20 20 70 44 6c 69 64 78 20 3d 20 30 3b 0a  ;.  pDlidx = 0;.
28660 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51  .  if( p->rc==SQ
28670 4c 49 54 45 5f 4f 4b 20 26 26 20 63 6b 73 75 6d  LITE_OK && cksum
28680 31 21 3d 63 6b 73 75 6d 32 20 29 20 70 2d 3e 72  1!=cksum2 ) p->r
28690 63 20 3d 20 46 54 53 35 5f 43 4f 52 52 55 50 54  c = FTS5_CORRUPT
286a0 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20  ;.}..static int 
286b0 66 74 73 35 51 75 65 72 79 43 6b 73 75 6d 28 0a  fts5QueryCksum(.
286c0 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20    Fts5Index *p, 
286d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
286e0 20 20 2f 2a 20 46 74 73 35 20 69 6e 64 65 78 20    /* Fts5 index 
286f0 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20  object */.  int 
28700 69 49 64 78 2c 0a 20 20 63 6f 6e 73 74 20 63 68  iIdx,.  const ch
28710 61 72 20 2a 7a 2c 20 20 20 20 20 20 20 20 20 20  ar *z,          
28720 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
28730 20 6b 65 79 20 74 6f 20 71 75 65 72 79 20 66 6f   key to query fo
28740 72 20 2a 2f 0a 20 20 69 6e 74 20 6e 2c 20 20 20  r */.  int n,   
28750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28760 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
28770 66 20 69 6e 64 65 78 20 6b 65 79 20 69 6e 20 62  f index key in b
28780 79 74 65 73 20 2a 2f 0a 20 20 69 6e 74 20 66 6c  ytes */.  int fl
28790 61 67 73 2c 20 20 20 20 20 20 20 20 20 20 20 20  ags,            
287a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61            /* Fla
287b0 67 73 20 66 6f 72 20 46 74 73 35 49 6e 64 65 78  gs for Fts5Index
287c0 51 75 65 72 79 20 2a 2f 0a 20 20 75 36 34 20 2a  Query */.  u64 *
287d0 70 43 6b 73 75 6d 20 20 20 20 20 20 20 20 20 20  pCksum          
287e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 4e             /* IN
287f0 2f 4f 55 54 3a 20 43 68 65 63 6b 73 75 6d 20 76  /OUT: Checksum v
28800 61 6c 75 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  alue */.){.  int
28810 20 65 44 65 74 61 69 6c 20 3d 20 70 2d 3e 70 43   eDetail = p->pC
28820 6f 6e 66 69 67 2d 3e 65 44 65 74 61 69 6c 3b 0a  onfig->eDetail;.
28830 20 20 75 36 34 20 63 6b 73 75 6d 20 3d 20 2a 70    u64 cksum = *p
28840 43 6b 73 75 6d 3b 0a 20 20 46 74 73 35 49 6e 64  Cksum;.  Fts5Ind
28850 65 78 49 74 65 72 20 2a 70 49 64 78 49 74 65 72  exIter *pIdxIter
28860 20 3d 20 30 3b 0a 20 20 46 74 73 35 42 75 66 66   = 0;.  Fts5Buff
28870 65 72 20 62 75 66 20 3d 20 7b 30 2c 20 30 2c 20  er buf = {0, 0, 
28880 30 7d 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 73  0};.  int rc = s
28890 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78 51  qlite3Fts5IndexQ
288a0 75 65 72 79 28 70 2c 20 7a 2c 20 6e 2c 20 66 6c  uery(p, z, n, fl
288b0 61 67 73 2c 20 30 2c 20 26 70 49 64 78 49 74 65  ags, 0, &pIdxIte
288c0 72 29 3b 0a 0a 20 20 77 68 69 6c 65 28 20 72 63  r);..  while( rc
288d0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 30  ==SQLITE_OK && 0
288e0 3d 3d 73 71 6c 69 74 65 33 46 74 73 35 49 74 65  ==sqlite3Fts5Ite
288f0 72 45 6f 66 28 70 49 64 78 49 74 65 72 29 20 29  rEof(pIdxIter) )
28900 7b 0a 20 20 20 20 69 36 34 20 72 6f 77 69 64 20  {.    i64 rowid 
28910 3d 20 73 71 6c 69 74 65 33 46 74 73 35 49 74 65  = sqlite3Fts5Ite
28920 72 52 6f 77 69 64 28 70 49 64 78 49 74 65 72 29  rRowid(pIdxIter)
28930 3b 0a 0a 20 20 20 20 69 66 28 20 65 44 65 74 61  ;..    if( eDeta
28940 69 6c 3d 3d 46 54 53 35 5f 44 45 54 41 49 4c 5f  il==FTS5_DETAIL_
28950 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 63 6b  NONE ){.      ck
28960 73 75 6d 20 5e 3d 20 73 71 6c 69 74 65 33 46 74  sum ^= sqlite3Ft
28970 73 35 49 6e 64 65 78 45 6e 74 72 79 43 6b 73 75  s5IndexEntryCksu
28980 6d 28 72 6f 77 69 64 2c 20 30 2c 20 30 2c 20 69  m(rowid, 0, 0, i
28990 49 64 78 2c 20 7a 2c 20 6e 29 3b 0a 20 20 20 20  Idx, z, n);.    
289a0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20  }else{.      rc 
289b0 3d 20 73 71 6c 69 74 65 33 46 74 73 35 49 74 65  = sqlite3Fts5Ite
289c0 72 50 6f 73 6c 69 73 74 42 75 66 66 65 72 28 70  rPoslistBuffer(p
289d0 49 64 78 49 74 65 72 2c 20 26 62 75 66 29 3b 0a  IdxIter, &buf);.
289e0 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
289f0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
28a00 20 20 20 46 74 73 35 50 6f 73 6c 69 73 74 52 65     Fts5PoslistRe
28a10 61 64 65 72 20 73 52 65 61 64 65 72 3b 0a 20 20  ader sReader;.  
28a20 20 20 20 20 20 20 66 6f 72 28 73 71 6c 69 74 65        for(sqlite
28a30 33 46 74 73 35 50 6f 73 6c 69 73 74 52 65 61 64  3Fts5PoslistRead
28a40 65 72 49 6e 69 74 28 62 75 66 2e 70 2c 20 62 75  erInit(buf.p, bu
28a50 66 2e 6e 2c 20 26 73 52 65 61 64 65 72 29 3b 0a  f.n, &sReader);.
28a60 20 20 20 20 20 20 20 20 20 20 20 20 73 52 65 61              sRea
28a70 64 65 72 2e 62 45 6f 66 3d 3d 30 3b 0a 20 20 20  der.bEof==0;.   
28a80 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
28a90 46 74 73 35 50 6f 73 6c 69 73 74 52 65 61 64 65  Fts5PoslistReade
28aa0 72 4e 65 78 74 28 26 73 52 65 61 64 65 72 29 0a  rNext(&sReader).
28ab0 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20          ){.     
28ac0 20 20 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20       int iCol = 
28ad0 46 54 53 35 5f 50 4f 53 32 43 4f 4c 55 4d 4e 28  FTS5_POS2COLUMN(
28ae0 73 52 65 61 64 65 72 2e 69 50 6f 73 29 3b 0a 20  sReader.iPos);. 
28af0 20 20 20 20 20 20 20 20 20 69 6e 74 20 69 4f 66           int iOf
28b00 66 20 3d 20 46 54 53 35 5f 50 4f 53 32 4f 46 46  f = FTS5_POS2OFF
28b10 53 45 54 28 73 52 65 61 64 65 72 2e 69 50 6f 73  SET(sReader.iPos
28b20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 63 6b 73  );.          cks
28b30 75 6d 20 5e 3d 20 73 71 6c 69 74 65 33 46 74 73  um ^= sqlite3Fts
28b40 35 49 6e 64 65 78 45 6e 74 72 79 43 6b 73 75 6d  5IndexEntryCksum
28b50 28 72 6f 77 69 64 2c 20 69 43 6f 6c 2c 20 69 4f  (rowid, iCol, iO
28b60 66 66 2c 20 69 49 64 78 2c 20 7a 2c 20 6e 29 3b  ff, iIdx, z, n);
28b70 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
28b80 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
28b90 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
28ba0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
28bb0 69 74 65 33 46 74 73 35 49 74 65 72 4e 65 78 74  ite3Fts5IterNext
28bc0 28 70 49 64 78 49 74 65 72 29 3b 0a 20 20 20 20  (pIdxIter);.    
28bd0 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 46  }.  }.  sqlite3F
28be0 74 73 35 49 74 65 72 43 6c 6f 73 65 28 70 49 64  ts5IterClose(pId
28bf0 78 49 74 65 72 29 3b 0a 20 20 66 74 73 35 42 75  xIter);.  fts5Bu
28c00 66 66 65 72 46 72 65 65 28 26 62 75 66 29 3b 0a  fferFree(&buf);.
28c10 0a 20 20 2a 70 43 6b 73 75 6d 20 3d 20 63 6b 73  .  *pCksum = cks
28c20 75 6d 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  um;.  return rc;
28c30 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  .}.../*.** This 
28c40 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 6c 73 6f  function is also
28c50 20 70 75 72 65 6c 79 20 61 6e 20 69 6e 74 65 72   purely an inter
28c60 6e 61 6c 20 74 65 73 74 2e 20 49 74 20 64 6f 65  nal test. It doe
28c70 73 20 6e 6f 74 20 63 6f 6e 74 72 69 62 75 74 65  s not contribute
28c80 20 74 6f 20 0a 2a 2a 20 46 54 53 20 66 75 6e 63   to .** FTS func
28c90 74 69 6f 6e 61 6c 69 74 79 2c 20 6f 72 20 65 76  tionality, or ev
28ca0 65 6e 20 74 68 65 20 69 6e 74 65 67 72 69 74 79  en the integrity
28cb0 2d 63 68 65 63 6b 2c 20 69 6e 20 61 6e 79 20 77  -check, in any w
28cc0 61 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ay..*/.static vo
28cd0 69 64 20 66 74 73 35 54 65 73 74 54 65 72 6d 28  id fts5TestTerm(
28ce0 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c  .  Fts5Index *p,
28cf0 20 0a 20 20 46 74 73 35 42 75 66 66 65 72 20 2a   .  Fts5Buffer *
28d00 70 50 72 65 76 2c 20 20 20 20 20 20 20 20 20 20  pPrev,          
28d10 20 20 20 20 2f 2a 20 50 72 65 76 69 6f 75 73 20      /* Previous 
28d20 74 65 72 6d 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  term */.  const 
28d30 63 68 61 72 20 2a 7a 2c 20 69 6e 74 20 6e 2c 20  char *z, int n, 
28d40 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 73            /* Pos
28d50 73 69 62 6c 79 20 6e 65 77 20 74 65 72 6d 20 74  sibly new term t
28d60 6f 20 74 65 73 74 20 2a 2f 0a 20 20 75 36 34 20  o test */.  u64 
28d70 65 78 70 65 63 74 65 64 2c 0a 20 20 75 36 34 20  expected,.  u64 
28d80 2a 70 43 6b 73 75 6d 0a 29 7b 0a 20 20 69 6e 74  *pCksum.){.  int
28d90 20 72 63 20 3d 20 70 2d 3e 72 63 3b 0a 20 20 69   rc = p->rc;.  i
28da0 66 28 20 70 50 72 65 76 2d 3e 6e 3d 3d 30 20 29  f( pPrev->n==0 )
28db0 7b 0a 20 20 20 20 66 74 73 35 42 75 66 66 65 72  {.    fts5Buffer
28dc0 53 65 74 28 26 72 63 2c 20 70 50 72 65 76 2c 20  Set(&rc, pPrev, 
28dd0 6e 2c 20 28 63 6f 6e 73 74 20 75 38 2a 29 7a 29  n, (const u8*)z)
28de0 3b 0a 20 20 7d 65 6c 73 65 0a 20 20 69 66 28 20  ;.  }else.  if( 
28df0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
28e00 20 28 70 50 72 65 76 2d 3e 6e 21 3d 6e 20 7c 7c   (pPrev->n!=n ||
28e10 20 6d 65 6d 63 6d 70 28 70 50 72 65 76 2d 3e 70   memcmp(pPrev->p
28e20 2c 20 7a 2c 20 6e 29 29 20 29 7b 0a 20 20 20 20  , z, n)) ){.    
28e30 75 36 34 20 63 6b 73 75 6d 33 20 3d 20 2a 70 43  u64 cksum3 = *pC
28e40 6b 73 75 6d 3b 0a 20 20 20 20 63 6f 6e 73 74 20  ksum;.    const 
28e50 63 68 61 72 20 2a 7a 54 65 72 6d 20 3d 20 28 63  char *zTerm = (c
28e60 6f 6e 73 74 20 63 68 61 72 2a 29 26 70 50 72 65  onst char*)&pPre
28e70 76 2d 3e 70 5b 31 5d 3b 20 20 2f 2a 20 74 65 72  v->p[1];  /* ter
28e80 6d 20 73 61 6e 73 20 70 72 65 66 69 78 2d 62 79  m sans prefix-by
28e90 74 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 54  te */.    int nT
28ea0 65 72 6d 20 3d 20 70 50 72 65 76 2d 3e 6e 2d 31  erm = pPrev->n-1
28eb0 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
28ec0 53 69 7a 65 20 6f 66 20 7a 54 65 72 6d 20 69 6e  Size of zTerm in
28ed0 20 62 79 74 65 73 20 2a 2f 0a 20 20 20 20 69 6e   bytes */.    in
28ee0 74 20 69 49 64 78 20 3d 20 28 70 50 72 65 76 2d  t iIdx = (pPrev-
28ef0 3e 70 5b 30 5d 20 2d 20 46 54 53 35 5f 4d 41 49  >p[0] - FTS5_MAI
28f00 4e 5f 50 52 45 46 49 58 29 3b 0a 20 20 20 20 69  N_PREFIX);.    i
28f10 6e 74 20 66 6c 61 67 73 20 3d 20 28 69 49 64 78  nt flags = (iIdx
28f20 3d 3d 30 20 3f 20 30 20 3a 20 46 54 53 35 49 4e  ==0 ? 0 : FTS5IN
28f30 44 45 58 5f 51 55 45 52 59 5f 50 52 45 46 49 58  DEX_QUERY_PREFIX
28f40 29 3b 0a 20 20 20 20 75 36 34 20 63 6b 31 20 3d  );.    u64 ck1 =
28f50 20 30 3b 0a 20 20 20 20 75 36 34 20 63 6b 32 20   0;.    u64 ck2 
28f60 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a 20 43 68 65  = 0;..    /* Che
28f70 63 6b 20 74 68 61 74 20 74 68 65 20 72 65 73 75  ck that the resu
28f80 6c 74 73 20 72 65 74 75 72 6e 65 64 20 66 6f 72  lts returned for
28f90 20 41 53 43 20 61 6e 64 20 44 45 53 43 20 71 75   ASC and DESC qu
28fa0 65 72 69 65 73 20 61 72 65 0a 20 20 20 20 2a 2a  eries are.    **
28fb0 20 74 68 65 20 73 61 6d 65 2e 20 49 66 20 6e 6f   the same. If no
28fc0 74 2c 20 63 61 6c 6c 20 74 68 69 73 20 63 6f 72  t, call this cor
28fd0 72 75 70 74 69 6f 6e 2e 20 20 2a 2f 0a 20 20 20  ruption.  */.   
28fe0 20 72 63 20 3d 20 66 74 73 35 51 75 65 72 79 43   rc = fts5QueryC
28ff0 6b 73 75 6d 28 70 2c 20 69 49 64 78 2c 20 7a 54  ksum(p, iIdx, zT
29000 65 72 6d 2c 20 6e 54 65 72 6d 2c 20 66 6c 61 67  erm, nTerm, flag
29010 73 2c 20 26 63 6b 31 29 3b 0a 20 20 20 20 69 66  s, &ck1);.    if
29020 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
29030 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 66 20 3d  ){.      int f =
29040 20 66 6c 61 67 73 7c 46 54 53 35 49 4e 44 45 58   flags|FTS5INDEX
29050 5f 51 55 45 52 59 5f 44 45 53 43 3b 0a 20 20 20  _QUERY_DESC;.   
29060 20 20 20 72 63 20 3d 20 66 74 73 35 51 75 65 72     rc = fts5Quer
29070 79 43 6b 73 75 6d 28 70 2c 20 69 49 64 78 2c 20  yCksum(p, iIdx, 
29080 7a 54 65 72 6d 2c 20 6e 54 65 72 6d 2c 20 66 2c  zTerm, nTerm, f,
29090 20 26 63 6b 32 29 3b 0a 20 20 20 20 7d 0a 20 20   &ck2);.    }.  
290a0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
290b0 5f 4f 4b 20 26 26 20 63 6b 31 21 3d 63 6b 32 20  _OK && ck1!=ck2 
290c0 29 20 72 63 20 3d 20 46 54 53 35 5f 43 4f 52 52  ) rc = FTS5_CORR
290d0 55 50 54 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20  UPT;..    /* If 
290e0 74 68 69 73 20 69 73 20 61 20 70 72 65 66 69 78  this is a prefix
290f0 20 71 75 65 72 79 2c 20 63 68 65 63 6b 20 74 68   query, check th
29100 61 74 20 74 68 65 20 72 65 73 75 6c 74 73 20 72  at the results r
29110 65 74 75 72 6e 65 64 20 69 66 20 74 68 65 0a 20  eturned if the. 
29120 20 20 20 2a 2a 20 74 68 65 20 69 6e 64 65 78 20     ** the index 
29130 69 73 20 64 69 73 61 62 6c 65 64 20 61 72 65 20  is disabled are 
29140 74 68 65 20 73 61 6d 65 2e 20 49 6e 20 62 6f 74  the same. In bot
29150 68 20 41 53 43 20 61 6e 64 20 44 45 53 43 20 6f  h ASC and DESC o
29160 72 64 65 72 2e 20 0a 20 20 20 20 2a 2a 0a 20 20  rder. .    **.  
29170 20 20 2a 2a 20 54 68 69 73 20 63 68 65 63 6b 20    ** This check 
29180 6d 61 79 20 6f 6e 6c 79 20 62 65 20 70 65 72 66  may only be perf
29190 6f 72 6d 65 64 20 69 66 20 74 68 65 20 68 61 73  ormed if the has
291a0 68 20 74 61 62 6c 65 20 69 73 20 65 6d 70 74 79  h table is empty
291b0 2e 20 54 68 69 73 0a 20 20 20 20 2a 2a 20 69 73  . This.    ** is
291c0 20 62 65 63 61 75 73 65 20 74 68 65 20 68 61 73   because the has
291d0 68 20 74 61 62 6c 65 20 6f 6e 6c 79 20 73 75 70  h table only sup
291e0 70 6f 72 74 73 20 61 20 73 69 6e 67 6c 65 20 73  ports a single s
291f0 63 61 6e 20 71 75 65 72 79 20 61 74 0a 20 20 20  can query at.   
29200 20 2a 2a 20 61 20 74 69 6d 65 2c 20 61 6e 64 20   ** a time, and 
29210 74 68 65 20 6d 75 6c 74 69 2d 69 74 65 72 20 6c  the multi-iter l
29220 6f 6f 70 20 66 72 6f 6d 20 77 68 69 63 68 20 74  oop from which t
29230 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
29240 63 61 6c 6c 65 64 0a 20 20 20 20 2a 2a 20 69 73  called.    ** is
29250 20 61 6c 72 65 61 64 79 20 70 65 72 66 6f 72 6d   already perform
29260 69 6e 67 20 73 75 63 68 20 61 20 73 63 61 6e 2e  ing such a scan.
29270 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e 6e   */.    if( p->n
29280 50 65 6e 64 69 6e 67 44 61 74 61 3d 3d 30 20 29  PendingData==0 )
29290 7b 0a 20 20 20 20 20 20 69 66 28 20 69 49 64 78  {.      if( iIdx
292a0 3e 30 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45  >0 && rc==SQLITE
292b0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 69  _OK ){.        i
292c0 6e 74 20 66 20 3d 20 66 6c 61 67 73 7c 46 54 53  nt f = flags|FTS
292d0 35 49 4e 44 45 58 5f 51 55 45 52 59 5f 54 45 53  5INDEX_QUERY_TES
292e0 54 5f 4e 4f 49 44 58 3b 0a 20 20 20 20 20 20 20  T_NOIDX;.       
292f0 20 63 6b 32 20 3d 20 30 3b 0a 20 20 20 20 20 20   ck2 = 0;.      
29300 20 20 72 63 20 3d 20 66 74 73 35 51 75 65 72 79    rc = fts5Query
29310 43 6b 73 75 6d 28 70 2c 20 69 49 64 78 2c 20 7a  Cksum(p, iIdx, z
29320 54 65 72 6d 2c 20 6e 54 65 72 6d 2c 20 66 2c 20  Term, nTerm, f, 
29330 26 63 6b 32 29 3b 0a 20 20 20 20 20 20 20 20 69  &ck2);.        i
29340 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
29350 20 26 26 20 63 6b 31 21 3d 63 6b 32 20 29 20 72   && ck1!=ck2 ) r
29360 63 20 3d 20 46 54 53 35 5f 43 4f 52 52 55 50 54  c = FTS5_CORRUPT
29370 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
29380 69 66 28 20 69 49 64 78 3e 30 20 26 26 20 72 63  if( iIdx>0 && rc
29390 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
293a0 20 20 20 20 20 20 20 69 6e 74 20 66 20 3d 20 66         int f = f
293b0 6c 61 67 73 7c 46 54 53 35 49 4e 44 45 58 5f 51  lags|FTS5INDEX_Q
293c0 55 45 52 59 5f 54 45 53 54 5f 4e 4f 49 44 58 7c  UERY_TEST_NOIDX|
293d0 46 54 53 35 49 4e 44 45 58 5f 51 55 45 52 59 5f  FTS5INDEX_QUERY_
293e0 44 45 53 43 3b 0a 20 20 20 20 20 20 20 20 63 6b  DESC;.        ck
293f0 32 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 72  2 = 0;.        r
29400 63 20 3d 20 66 74 73 35 51 75 65 72 79 43 6b 73  c = fts5QueryCks
29410 75 6d 28 70 2c 20 69 49 64 78 2c 20 7a 54 65 72  um(p, iIdx, zTer
29420 6d 2c 20 6e 54 65 72 6d 2c 20 66 2c 20 26 63 6b  m, nTerm, f, &ck
29430 32 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  2);.        if( 
29440 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
29450 20 63 6b 31 21 3d 63 6b 32 20 29 20 72 63 20 3d   ck1!=ck2 ) rc =
29460 20 46 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20   FTS5_CORRUPT;. 
29470 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
29480 20 20 63 6b 73 75 6d 33 20 5e 3d 20 63 6b 31 3b    cksum3 ^= ck1;
29490 0a 20 20 20 20 66 74 73 35 42 75 66 66 65 72 53  .    fts5BufferS
294a0 65 74 28 26 72 63 2c 20 70 50 72 65 76 2c 20 6e  et(&rc, pPrev, n
294b0 2c 20 28 63 6f 6e 73 74 20 75 38 2a 29 7a 29 3b  , (const u8*)z);
294c0 0a 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ..    if( rc==SQ
294d0 4c 49 54 45 5f 4f 4b 20 26 26 20 63 6b 73 75 6d  LITE_OK && cksum
294e0 33 21 3d 65 78 70 65 63 74 65 64 20 29 7b 0a 20  3!=expected ){. 
294f0 20 20 20 20 20 72 63 20 3d 20 46 54 53 35 5f 43       rc = FTS5_C
29500 4f 52 52 55 50 54 3b 0a 20 20 20 20 7d 0a 20 20  ORRUPT;.    }.  
29510 20 20 2a 70 43 6b 73 75 6d 20 3d 20 63 6b 73 75    *pCksum = cksu
29520 6d 33 3b 0a 20 20 7d 0a 20 20 70 2d 3e 72 63 20  m3;.  }.  p->rc 
29530 3d 20 72 63 3b 0a 7d 0a 20 0a 23 65 6c 73 65 0a  = rc;.}. .#else.
29540 23 20 64 65 66 69 6e 65 20 66 74 73 35 54 65 73  # define fts5Tes
29550 74 44 6c 69 64 78 52 65 76 65 72 73 65 28 78 2c  tDlidxReverse(x,
29560 79 2c 7a 29 0a 23 20 64 65 66 69 6e 65 20 66 74  y,z).# define ft
29570 73 35 54 65 73 74 54 65 72 6d 28 75 2c 76 2c 77  s5TestTerm(u,v,w
29580 2c 78 2c 79 2c 7a 29 0a 23 65 6e 64 69 66 0a 0a  ,x,y,z).#endif..
29590 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 68 61 74  /*.** Check that
295a0 3a 0a 2a 2a 0a 2a 2a 20 20 20 31 29 20 41 6c 6c  :.**.**   1) All
295b0 20 6c 65 61 76 65 73 20 6f 66 20 70 53 65 67 20   leaves of pSeg 
295c0 62 65 74 77 65 65 6e 20 69 46 69 72 73 74 20 61  between iFirst a
295d0 6e 64 20 69 4c 61 73 74 20 28 69 6e 63 6c 75 73  nd iLast (inclus
295e0 69 76 65 29 20 65 78 69 73 74 20 61 6e 64 0a 2a  ive) exist and.*
295f0 2a 20 20 20 20 20 20 63 6f 6e 74 61 69 6e 20 7a  *      contain z
29600 65 72 6f 20 74 65 72 6d 73 2e 0a 2a 2a 20 20 20  ero terms..**   
29610 32 29 20 41 6c 6c 20 6c 65 61 76 65 73 20 6f 66  2) All leaves of
29620 20 70 53 65 67 20 62 65 74 77 65 65 6e 20 69 4e   pSeg between iN
29630 6f 52 6f 77 69 64 20 61 6e 64 20 69 4c 61 73 74  oRowid and iLast
29640 20 28 69 6e 63 6c 75 73 69 76 65 29 20 65 78 69   (inclusive) exi
29650 73 74 20 61 6e 64 0a 2a 2a 20 20 20 20 20 20 63  st and.**      c
29660 6f 6e 74 61 69 6e 20 7a 65 72 6f 20 72 6f 77 69  ontain zero rowi
29670 64 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ds..*/.static vo
29680 69 64 20 66 74 73 35 49 6e 64 65 78 49 6e 74 65  id fts5IndexInte
29690 67 72 69 74 79 43 68 65 63 6b 45 6d 70 74 79 28  grityCheckEmpty(
296a0 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c  .  Fts5Index *p,
296b0 0a 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65  .  Fts5Structure
296c0 53 65 67 6d 65 6e 74 20 2a 70 53 65 67 2c 20 20  Segment *pSeg,  
296d0 20 20 20 2f 2a 20 53 65 67 6d 65 6e 74 20 74 6f     /* Segment to
296e0 20 63 68 65 63 6b 20 69 6e 74 65 72 6e 61 6c 20   check internal 
296f0 63 6f 6e 73 69 73 74 65 6e 63 79 20 2a 2f 0a 20  consistency */. 
29700 20 69 6e 74 20 69 46 69 72 73 74 2c 0a 20 20 69   int iFirst,.  i
29710 6e 74 20 69 4e 6f 52 6f 77 69 64 2c 0a 20 20 69  nt iNoRowid,.  i
29720 6e 74 20 69 4c 61 73 74 0a 29 7b 0a 20 20 69 6e  nt iLast.){.  in
29730 74 20 69 3b 0a 0a 20 20 2f 2a 20 4e 6f 77 20 63  t i;..  /* Now c
29740 68 65 63 6b 20 74 68 61 74 20 74 68 65 20 69 74  heck that the it
29750 65 72 2e 6e 45 6d 70 74 79 20 6c 65 61 76 65 73  er.nEmpty leaves
29760 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 63   following the c
29770 75 72 72 65 6e 74 20 6c 65 61 66 0a 20 20 2a 2a  urrent leaf.  **
29780 20 28 61 29 20 65 78 69 73 74 20 61 6e 64 20 28   (a) exist and (
29790 62 29 20 63 6f 6e 74 61 69 6e 20 6e 6f 20 74 65  b) contain no te
297a0 72 6d 73 2e 20 2a 2f 0a 20 20 66 6f 72 28 69 3d  rms. */.  for(i=
297b0 69 46 69 72 73 74 3b 20 70 2d 3e 72 63 3d 3d 53  iFirst; p->rc==S
297c0 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c 3d 69  QLITE_OK && i<=i
297d0 4c 61 73 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Last; i++){.    
297e0 46 74 73 35 44 61 74 61 20 2a 70 4c 65 61 66 20  Fts5Data *pLeaf 
297f0 3d 20 66 74 73 35 44 61 74 61 52 65 61 64 28 70  = fts5DataRead(p
29800 2c 20 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f 52  , FTS5_SEGMENT_R
29810 4f 57 49 44 28 70 53 65 67 2d 3e 69 53 65 67 69  OWID(pSeg->iSegi
29820 64 2c 20 69 29 29 3b 0a 20 20 20 20 69 66 28 20  d, i));.    if( 
29830 70 4c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 69  pLeaf ){.      i
29840 66 28 20 21 66 74 73 35 4c 65 61 66 49 73 54 65  f( !fts5LeafIsTe
29850 72 6d 6c 65 73 73 28 70 4c 65 61 66 29 20 29 20  rmless(pLeaf) ) 
29860 70 2d 3e 72 63 20 3d 20 46 54 53 35 5f 43 4f 52  p->rc = FTS5_COR
29870 52 55 50 54 3b 0a 20 20 20 20 20 20 69 66 28 20  RUPT;.      if( 
29880 69 3e 3d 69 4e 6f 52 6f 77 69 64 20 26 26 20 30  i>=iNoRowid && 0
29890 21 3d 66 74 73 35 4c 65 61 66 46 69 72 73 74 52  !=fts5LeafFirstR
298a0 6f 77 69 64 4f 66 66 28 70 4c 65 61 66 29 20 29  owidOff(pLeaf) )
298b0 20 70 2d 3e 72 63 20 3d 20 46 54 53 35 5f 43 4f   p->rc = FTS5_CO
298c0 52 52 55 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20  RRUPT;.    }.   
298d0 20 66 74 73 35 44 61 74 61 52 65 6c 65 61 73 65   fts5DataRelease
298e0 28 70 4c 65 61 66 29 3b 0a 20 20 7d 0a 7d 0a 0a  (pLeaf);.  }.}..
298f0 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
29900 49 6e 74 65 67 72 69 74 79 43 68 65 63 6b 50 67  IntegrityCheckPg
29910 69 64 78 28 46 74 73 35 49 6e 64 65 78 20 2a 70  idx(Fts5Index *p
29920 2c 20 46 74 73 35 44 61 74 61 20 2a 70 4c 65 61  , Fts5Data *pLea
29930 66 29 7b 0a 20 20 69 6e 74 20 69 54 65 72 6d 4f  f){.  int iTermO
29940 66 66 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 69  ff = 0;.  int ii
29950 3b 0a 0a 20 20 46 74 73 35 42 75 66 66 65 72 20  ;..  Fts5Buffer 
29960 62 75 66 31 20 3d 20 7b 30 2c 30 2c 30 7d 3b 0a  buf1 = {0,0,0};.
29970 20 20 46 74 73 35 42 75 66 66 65 72 20 62 75 66    Fts5Buffer buf
29980 32 20 3d 20 7b 30 2c 30 2c 30 7d 3b 0a 0a 20 20  2 = {0,0,0};..  
29990 69 69 20 3d 20 70 4c 65 61 66 2d 3e 73 7a 4c 65  ii = pLeaf->szLe
299a0 61 66 3b 0a 20 20 77 68 69 6c 65 28 20 69 69 3c  af;.  while( ii<
299b0 70 4c 65 61 66 2d 3e 6e 6e 20 26 26 20 70 2d 3e  pLeaf->nn && p->
299c0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
299d0 0a 20 20 20 20 69 6e 74 20 72 65 73 3b 0a 20 20  .    int res;.  
299e0 20 20 69 6e 74 20 69 4f 66 66 3b 0a 20 20 20 20    int iOff;.    
299f0 69 6e 74 20 6e 49 6e 63 72 3b 0a 0a 20 20 20 20  int nIncr;..    
29a00 69 69 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72  ii += fts5GetVar
29a10 69 6e 74 33 32 28 26 70 4c 65 61 66 2d 3e 70 5b  int32(&pLeaf->p[
29a20 69 69 5d 2c 20 6e 49 6e 63 72 29 3b 0a 20 20 20  ii], nIncr);.   
29a30 20 69 54 65 72 6d 4f 66 66 20 2b 3d 20 6e 49 6e   iTermOff += nIn
29a40 63 72 3b 0a 20 20 20 20 69 4f 66 66 20 3d 20 69  cr;.    iOff = i
29a50 54 65 72 6d 4f 66 66 3b 0a 0a 20 20 20 20 69 66  TermOff;..    if
29a60 28 20 69 4f 66 66 3e 3d 70 4c 65 61 66 2d 3e 73  ( iOff>=pLeaf->s
29a70 7a 4c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 70  zLeaf ){.      p
29a80 2d 3e 72 63 20 3d 20 46 54 53 35 5f 43 4f 52 52  ->rc = FTS5_CORR
29a90 55 50 54 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  UPT;.    }else i
29aa0 66 28 20 69 54 65 72 6d 4f 66 66 3d 3d 6e 49 6e  f( iTermOff==nIn
29ab0 63 72 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  cr ){.      int 
29ac0 6e 42 79 74 65 3b 0a 20 20 20 20 20 20 69 4f 66  nByte;.      iOf
29ad0 66 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69  f += fts5GetVari
29ae0 6e 74 33 32 28 26 70 4c 65 61 66 2d 3e 70 5b 69  nt32(&pLeaf->p[i
29af0 4f 66 66 5d 2c 20 6e 42 79 74 65 29 3b 0a 20 20  Off], nByte);.  
29b00 20 20 20 20 69 66 28 20 28 69 4f 66 66 2b 6e 42      if( (iOff+nB
29b10 79 74 65 29 3e 70 4c 65 61 66 2d 3e 73 7a 4c 65  yte)>pLeaf->szLe
29b20 61 66 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d  af ){.        p-
29b30 3e 72 63 20 3d 20 46 54 53 35 5f 43 4f 52 52 55  >rc = FTS5_CORRU
29b40 50 54 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  PT;.      }else{
29b50 0a 20 20 20 20 20 20 20 20 66 74 73 35 42 75 66  .        fts5Buf
29b60 66 65 72 53 65 74 28 26 70 2d 3e 72 63 2c 20 26  ferSet(&p->rc, &
29b70 62 75 66 31 2c 20 6e 42 79 74 65 2c 20 26 70 4c  buf1, nByte, &pL
29b80 65 61 66 2d 3e 70 5b 69 4f 66 66 5d 29 3b 0a 20  eaf->p[iOff]);. 
29b90 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
29ba0 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 4b 65 65  {.      int nKee
29bb0 70 2c 20 6e 42 79 74 65 3b 0a 20 20 20 20 20 20  p, nByte;.      
29bc0 69 4f 66 66 20 2b 3d 20 66 74 73 35 47 65 74 56  iOff += fts5GetV
29bd0 61 72 69 6e 74 33 32 28 26 70 4c 65 61 66 2d 3e  arint32(&pLeaf->
29be0 70 5b 69 4f 66 66 5d 2c 20 6e 4b 65 65 70 29 3b  p[iOff], nKeep);
29bf0 0a 20 20 20 20 20 20 69 4f 66 66 20 2b 3d 20 66  .      iOff += f
29c00 74 73 35 47 65 74 56 61 72 69 6e 74 33 32 28 26  ts5GetVarint32(&
29c10 70 4c 65 61 66 2d 3e 70 5b 69 4f 66 66 5d 2c 20  pLeaf->p[iOff], 
29c20 6e 42 79 74 65 29 3b 0a 20 20 20 20 20 20 69 66  nByte);.      if
29c30 28 20 6e 4b 65 65 70 3e 62 75 66 31 2e 6e 20 7c  ( nKeep>buf1.n |
29c40 7c 20 28 69 4f 66 66 2b 6e 42 79 74 65 29 3e 70  | (iOff+nByte)>p
29c50 4c 65 61 66 2d 3e 73 7a 4c 65 61 66 20 29 7b 0a  Leaf->szLeaf ){.
29c60 20 20 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20          p->rc = 
29c70 46 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20  FTS5_CORRUPT;.  
29c80 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
29c90 20 20 20 62 75 66 31 2e 6e 20 3d 20 6e 4b 65 65     buf1.n = nKee
29ca0 70 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35 42  p;.        fts5B
29cb0 75 66 66 65 72 41 70 70 65 6e 64 42 6c 6f 62 28  ufferAppendBlob(
29cc0 26 70 2d 3e 72 63 2c 20 26 62 75 66 31 2c 20 6e  &p->rc, &buf1, n
29cd0 42 79 74 65 2c 20 26 70 4c 65 61 66 2d 3e 70 5b  Byte, &pLeaf->p[
29ce0 69 4f 66 66 5d 29 3b 0a 20 20 20 20 20 20 7d 0a  iOff]);.      }.
29cf0 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72 63  .      if( p->rc
29d00 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
29d10 20 20 20 20 20 20 20 72 65 73 20 3d 20 66 74 73         res = fts
29d20 35 42 75 66 66 65 72 43 6f 6d 70 61 72 65 28 26  5BufferCompare(&
29d30 62 75 66 31 2c 20 26 62 75 66 32 29 3b 0a 20 20  buf1, &buf2);.  
29d40 20 20 20 20 20 20 69 66 28 20 72 65 73 3c 3d 30        if( res<=0
29d50 20 29 20 70 2d 3e 72 63 20 3d 20 46 54 53 35 5f   ) p->rc = FTS5_
29d60 43 4f 52 52 55 50 54 3b 0a 20 20 20 20 20 20 7d  CORRUPT;.      }
29d70 0a 20 20 20 20 7d 0a 20 20 20 20 66 74 73 35 42  .    }.    fts5B
29d80 75 66 66 65 72 53 65 74 28 26 70 2d 3e 72 63 2c  ufferSet(&p->rc,
29d90 20 26 62 75 66 32 2c 20 62 75 66 31 2e 6e 2c 20   &buf2, buf1.n, 
29da0 62 75 66 31 2e 70 29 3b 0a 20 20 7d 0a 0a 20 20  buf1.p);.  }..  
29db0 66 74 73 35 42 75 66 66 65 72 46 72 65 65 28 26  fts5BufferFree(&
29dc0 62 75 66 31 29 3b 0a 20 20 66 74 73 35 42 75 66  buf1);.  fts5Buf
29dd0 66 65 72 46 72 65 65 28 26 62 75 66 32 29 3b 0a  ferFree(&buf2);.
29de0 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  }..static void f
29df0 74 73 35 49 6e 64 65 78 49 6e 74 65 67 72 69 74  ts5IndexIntegrit
29e00 79 43 68 65 63 6b 53 65 67 6d 65 6e 74 28 0a 20  yCheckSegment(. 
29e10 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 20   Fts5Index *p,  
29e20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29e30 20 2f 2a 20 46 54 53 35 20 62 61 63 6b 65 6e 64   /* FTS5 backend
29e40 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 46 74 73   object */.  Fts
29e50 35 53 74 72 75 63 74 75 72 65 53 65 67 6d 65 6e  5StructureSegmen
29e60 74 20 2a 70 53 65 67 20 20 20 20 20 20 2f 2a 20  t *pSeg      /* 
29e70 53 65 67 6d 65 6e 74 20 74 6f 20 63 68 65 63 6b  Segment to check
29e80 20 69 6e 74 65 72 6e 61 6c 20 63 6f 6e 73 69 73   internal consis
29e90 74 65 6e 63 79 20 2a 2f 0a 29 7b 0a 20 20 46 74  tency */.){.  Ft
29ea0 73 35 43 6f 6e 66 69 67 20 2a 70 43 6f 6e 66 69  s5Config *pConfi
29eb0 67 20 3d 20 70 2d 3e 70 43 6f 6e 66 69 67 3b 0a  g = p->pConfig;.
29ec0 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
29ed0 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 69 6e 74  pStmt = 0;.  int
29ee0 20 72 63 32 3b 0a 20 20 69 6e 74 20 69 49 64 78   rc2;.  int iIdx
29ef0 50 72 65 76 4c 65 61 66 20 3d 20 70 53 65 67 2d  PrevLeaf = pSeg-
29f00 3e 70 67 6e 6f 46 69 72 73 74 2d 31 3b 0a 20 20  >pgnoFirst-1;.  
29f10 69 6e 74 20 69 44 6c 69 64 78 50 72 65 76 4c 65  int iDlidxPrevLe
29f20 61 66 20 3d 20 70 53 65 67 2d 3e 70 67 6e 6f 4c  af = pSeg->pgnoL
29f30 61 73 74 3b 0a 0a 20 20 69 66 28 20 70 53 65 67  ast;..  if( pSeg
29f40 2d 3e 70 67 6e 6f 46 69 72 73 74 3d 3d 30 20 29  ->pgnoFirst==0 )
29f50 20 72 65 74 75 72 6e 3b 0a 0a 20 20 66 74 73 35   return;..  fts5
29f60 49 6e 64 65 78 50 72 65 70 61 72 65 53 74 6d 74  IndexPrepareStmt
29f70 28 70 2c 20 26 70 53 74 6d 74 2c 20 73 71 6c 69  (p, &pStmt, sqli
29f80 74 65 33 5f 6d 70 72 69 6e 74 66 28 0a 20 20 20  te3_mprintf(.   
29f90 20 20 20 22 53 45 4c 45 43 54 20 73 65 67 69 64     "SELECT segid
29fa0 2c 20 74 65 72 6d 2c 20 28 70 67 6e 6f 3e 3e 31  , term, (pgno>>1
29fb0 29 2c 20 28 70 67 6e 6f 26 31 29 20 46 52 4f 4d  ), (pgno&1) FROM
29fc0 20 25 51 2e 27 25 71 5f 69 64 78 27 20 57 48 45   %Q.'%q_idx' WHE
29fd0 52 45 20 73 65 67 69 64 3d 25 64 22 2c 0a 20 20  RE segid=%d",.  
29fe0 20 20 20 20 70 43 6f 6e 66 69 67 2d 3e 7a 44 62      pConfig->zDb
29ff0 2c 20 70 43 6f 6e 66 69 67 2d 3e 7a 4e 61 6d 65  , pConfig->zName
2a000 2c 20 70 53 65 67 2d 3e 69 53 65 67 69 64 0a 20  , pSeg->iSegid. 
2a010 20 29 29 3b 0a 0a 20 20 2f 2a 20 49 74 65 72 61   ));..  /* Itera
2a020 74 65 20 74 68 72 6f 75 67 68 20 74 68 65 20 62  te through the b
2a030 2d 74 72 65 65 20 68 69 65 72 61 72 63 68 79 2e  -tree hierarchy.
2a040 20 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20 70 2d    */.  while( p-
2a050 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26  >rc==SQLITE_OK &
2a060 26 20 53 51 4c 49 54 45 5f 52 4f 57 3d 3d 73 71  & SQLITE_ROW==sq
2a070 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74  lite3_step(pStmt
2a080 29 20 29 7b 0a 20 20 20 20 69 36 34 20 69 52 6f  ) ){.    i64 iRo
2a090 77 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  w;              
2a0a0 20 20 20 20 20 20 20 2f 2a 20 52 6f 77 69 64 20         /* Rowid 
2a0b0 66 6f 72 20 74 68 69 73 20 6c 65 61 66 20 2a 2f  for this leaf */
2a0c0 0a 20 20 20 20 46 74 73 35 44 61 74 61 20 2a 70  .    Fts5Data *p
2a0d0 4c 65 61 66 3b 20 20 20 20 20 20 20 20 20 20 20  Leaf;           
2a0e0 20 20 20 2f 2a 20 44 61 74 61 20 66 6f 72 20 74     /* Data for t
2a0f0 68 69 73 20 6c 65 61 66 20 2a 2f 0a 0a 20 20 20  his leaf */..   
2a100 20 69 6e 74 20 6e 49 64 78 54 65 72 6d 20 3d 20   int nIdxTerm = 
2a110 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62  sqlite3_column_b
2a120 79 74 65 73 28 70 53 74 6d 74 2c 20 31 29 3b 0a  ytes(pStmt, 1);.
2a130 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
2a140 7a 49 64 78 54 65 72 6d 20 3d 20 28 63 6f 6e 73  zIdxTerm = (cons
2a150 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f  t char*)sqlite3_
2a160 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53 74 6d  column_text(pStm
2a170 74 2c 20 31 29 3b 0a 20 20 20 20 69 6e 74 20 69  t, 1);.    int i
2a180 49 64 78 4c 65 61 66 20 3d 20 73 71 6c 69 74 65  IdxLeaf = sqlite
2a190 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 53 74  3_column_int(pSt
2a1a0 6d 74 2c 20 32 29 3b 0a 20 20 20 20 69 6e 74 20  mt, 2);.    int 
2a1b0 62 49 64 78 44 6c 69 64 78 20 3d 20 73 71 6c 69  bIdxDlidx = sqli
2a1c0 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70  te3_column_int(p
2a1d0 53 74 6d 74 2c 20 33 29 3b 0a 0a 20 20 20 20 2f  Stmt, 3);..    /
2a1e0 2a 20 49 66 20 74 68 65 20 6c 65 61 66 20 69 6e  * If the leaf in
2a1f0 20 71 75 65 73 74 69 6f 6e 20 68 61 73 20 61 6c   question has al
2a200 72 65 61 64 79 20 62 65 65 6e 20 74 72 69 6d 6d  ready been trimm
2a210 65 64 20 66 72 6f 6d 20 74 68 65 20 73 65 67 6d  ed from the segm
2a220 65 6e 74 2c 20 0a 20 20 20 20 2a 2a 20 69 67 6e  ent, .    ** ign
2a230 6f 72 65 20 74 68 69 73 20 62 2d 74 72 65 65 20  ore this b-tree 
2a240 65 6e 74 72 79 2e 20 4f 74 68 65 72 77 69 73 65  entry. Otherwise
2a250 2c 20 6c 6f 61 64 20 69 74 20 69 6e 74 6f 20 6d  , load it into m
2a260 65 6d 6f 72 79 2e 20 2a 2f 0a 20 20 20 20 69 66  emory. */.    if
2a270 28 20 69 49 64 78 4c 65 61 66 3c 70 53 65 67 2d  ( iIdxLeaf<pSeg-
2a280 3e 70 67 6e 6f 46 69 72 73 74 20 29 20 63 6f 6e  >pgnoFirst ) con
2a290 74 69 6e 75 65 3b 0a 20 20 20 20 69 52 6f 77 20  tinue;.    iRow 
2a2a0 3d 20 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f 52  = FTS5_SEGMENT_R
2a2b0 4f 57 49 44 28 70 53 65 67 2d 3e 69 53 65 67 69  OWID(pSeg->iSegi
2a2c0 64 2c 20 69 49 64 78 4c 65 61 66 29 3b 0a 20 20  d, iIdxLeaf);.  
2a2d0 20 20 70 4c 65 61 66 20 3d 20 66 74 73 35 44 61    pLeaf = fts5Da
2a2e0 74 61 52 65 61 64 28 70 2c 20 69 52 6f 77 29 3b  taRead(p, iRow);
2a2f0 0a 20 20 20 20 69 66 28 20 70 4c 65 61 66 3d 3d  .    if( pLeaf==
2a300 30 20 29 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20  0 ) break;..    
2a310 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20 74 68  /* Check that th
2a320 65 20 6c 65 61 66 20 63 6f 6e 74 61 69 6e 73 20  e leaf contains 
2a330 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 74 65 72  at least one ter
2a340 6d 2c 20 61 6e 64 20 74 68 61 74 20 69 74 20 69  m, and that it i
2a350 73 20 65 71 75 61 6c 0a 20 20 20 20 2a 2a 20 74  s equal.    ** t
2a360 6f 20 6f 72 20 6c 61 72 67 65 72 20 74 68 61 6e  o or larger than
2a370 20 74 68 65 20 73 70 6c 69 74 2d 6b 65 79 20 69   the split-key i
2a380 6e 20 7a 49 64 78 54 65 72 6d 2e 20 20 41 6c 73  n zIdxTerm.  Als
2a390 6f 20 63 68 65 63 6b 20 74 68 61 74 20 69 66 20  o check that if 
2a3a0 74 68 65 72 65 0a 20 20 20 20 2a 2a 20 69 73 20  there.    ** is 
2a3b0 61 6c 73 6f 20 61 20 72 6f 77 69 64 20 70 6f 69  also a rowid poi
2a3c0 6e 74 65 72 20 77 69 74 68 69 6e 20 74 68 65 20  nter within the 
2a3d0 6c 65 61 66 20 70 61 67 65 20 68 65 61 64 65 72  leaf page header
2a3e0 2c 20 69 74 20 70 6f 69 6e 74 73 20 74 6f 20 61  , it points to a
2a3f0 0a 20 20 20 20 2a 2a 20 6c 6f 63 61 74 69 6f 6e  .    ** location
2a400 20 62 65 66 6f 72 65 20 74 68 65 20 74 65 72 6d   before the term
2a410 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 4c  .  */.    if( pL
2a420 65 61 66 2d 3e 6e 6e 3c 3d 70 4c 65 61 66 2d 3e  eaf->nn<=pLeaf->
2a430 73 7a 4c 65 61 66 20 29 7b 0a 20 20 20 20 20 20  szLeaf ){.      
2a440 70 2d 3e 72 63 20 3d 20 46 54 53 35 5f 43 4f 52  p->rc = FTS5_COR
2a450 52 55 50 54 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  RUPT;.    }else{
2a460 0a 20 20 20 20 20 20 69 6e 74 20 69 4f 66 66 3b  .      int iOff;
2a470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a480 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66 20     /* Offset of 
2a490 66 69 72 73 74 20 74 65 72 6d 20 6f 6e 20 6c 65  first term on le
2a4a0 61 66 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  af */.      int 
2a4b0 69 52 6f 77 69 64 4f 66 66 3b 20 20 20 20 20 20  iRowidOff;      
2a4c0 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65          /* Offse
2a4d0 74 20 6f 66 20 66 69 72 73 74 20 72 6f 77 69 64  t of first rowid
2a4e0 20 6f 6e 20 6c 65 61 66 20 2a 2f 0a 20 20 20 20   on leaf */.    
2a4f0 20 20 69 6e 74 20 6e 54 65 72 6d 3b 20 20 20 20    int nTerm;    
2a500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2a510 20 53 69 7a 65 20 6f 66 20 74 65 72 6d 20 6f 6e   Size of term on
2a520 20 6c 65 61 66 20 69 6e 20 62 79 74 65 73 20 2a   leaf in bytes *
2a530 2f 0a 20 20 20 20 20 20 69 6e 74 20 72 65 73 3b  /.      int res;
2a540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a550 20 20 20 20 2f 2a 20 43 6f 6d 70 61 72 69 73 6f      /* Compariso
2a560 6e 20 6f 66 20 74 65 72 6d 20 61 6e 64 20 73 70  n of term and sp
2a570 6c 69 74 2d 6b 65 79 20 2a 2f 0a 0a 20 20 20 20  lit-key */..    
2a580 20 20 69 4f 66 66 20 3d 20 66 74 73 35 4c 65 61    iOff = fts5Lea
2a590 66 46 69 72 73 74 54 65 72 6d 4f 66 66 28 70 4c  fFirstTermOff(pL
2a5a0 65 61 66 29 3b 0a 20 20 20 20 20 20 69 52 6f 77  eaf);.      iRow
2a5b0 69 64 4f 66 66 20 3d 20 66 74 73 35 4c 65 61 66  idOff = fts5Leaf
2a5c0 46 69 72 73 74 52 6f 77 69 64 4f 66 66 28 70 4c  FirstRowidOff(pL
2a5d0 65 61 66 29 3b 0a 20 20 20 20 20 20 69 66 28 20  eaf);.      if( 
2a5e0 69 52 6f 77 69 64 4f 66 66 3e 3d 69 4f 66 66 20  iRowidOff>=iOff 
2a5f0 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 72 63  ){.        p->rc
2a600 20 3d 20 46 54 53 35 5f 43 4f 52 52 55 50 54 3b   = FTS5_CORRUPT;
2a610 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
2a620 20 20 20 20 20 20 69 4f 66 66 20 2b 3d 20 66 74        iOff += ft
2a630 73 35 47 65 74 56 61 72 69 6e 74 33 32 28 26 70  s5GetVarint32(&p
2a640 4c 65 61 66 2d 3e 70 5b 69 4f 66 66 5d 2c 20 6e  Leaf->p[iOff], n
2a650 54 65 72 6d 29 3b 0a 20 20 20 20 20 20 20 20 72  Term);.        r
2a660 65 73 20 3d 20 6d 65 6d 63 6d 70 28 26 70 4c 65  es = memcmp(&pLe
2a670 61 66 2d 3e 70 5b 69 4f 66 66 5d 2c 20 7a 49 64  af->p[iOff], zId
2a680 78 54 65 72 6d 2c 20 4d 49 4e 28 6e 54 65 72 6d  xTerm, MIN(nTerm
2a690 2c 20 6e 49 64 78 54 65 72 6d 29 29 3b 0a 20 20  , nIdxTerm));.  
2a6a0 20 20 20 20 20 20 69 66 28 20 72 65 73 3d 3d 30        if( res==0
2a6b0 20 29 20 72 65 73 20 3d 20 6e 54 65 72 6d 20 2d   ) res = nTerm -
2a6c0 20 6e 49 64 78 54 65 72 6d 3b 0a 20 20 20 20 20   nIdxTerm;.     
2a6d0 20 20 20 69 66 28 20 72 65 73 3c 30 20 29 20 70     if( res<0 ) p
2a6e0 2d 3e 72 63 20 3d 20 46 54 53 35 5f 43 4f 52 52  ->rc = FTS5_CORR
2a6f0 55 50 54 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  UPT;.      }..  
2a700 20 20 20 20 66 74 73 35 49 6e 74 65 67 72 69 74      fts5Integrit
2a710 79 43 68 65 63 6b 50 67 69 64 78 28 70 2c 20 70  yCheckPgidx(p, p
2a720 4c 65 61 66 29 3b 0a 20 20 20 20 7d 0a 20 20 20  Leaf);.    }.   
2a730 20 66 74 73 35 44 61 74 61 52 65 6c 65 61 73 65   fts5DataRelease
2a740 28 70 4c 65 61 66 29 3b 0a 20 20 20 20 69 66 28  (pLeaf);.    if(
2a750 20 70 2d 3e 72 63 20 29 20 62 72 65 61 6b 3b 0a   p->rc ) break;.
2a760 0a 20 20 20 20 2f 2a 20 4e 6f 77 20 63 68 65 63  .    /* Now chec
2a770 6b 20 74 68 61 74 20 74 68 65 20 69 74 65 72 2e  k that the iter.
2a780 6e 45 6d 70 74 79 20 6c 65 61 76 65 73 20 66 6f  nEmpty leaves fo
2a790 6c 6c 6f 77 69 6e 67 20 74 68 65 20 63 75 72 72  llowing the curr
2a7a0 65 6e 74 20 6c 65 61 66 0a 20 20 20 20 2a 2a 20  ent leaf.    ** 
2a7b0 28 61 29 20 65 78 69 73 74 20 61 6e 64 20 28 62  (a) exist and (b
2a7c0 29 20 63 6f 6e 74 61 69 6e 20 6e 6f 20 74 65 72  ) contain no ter
2a7d0 6d 73 2e 20 2a 2f 0a 20 20 20 20 66 74 73 35 49  ms. */.    fts5I
2a7e0 6e 64 65 78 49 6e 74 65 67 72 69 74 79 43 68 65  ndexIntegrityChe
2a7f0 63 6b 45 6d 70 74 79 28 0a 20 20 20 20 20 20 20  ckEmpty(.       
2a800 20 70 2c 20 70 53 65 67 2c 20 69 49 64 78 50 72   p, pSeg, iIdxPr
2a810 65 76 4c 65 61 66 2b 31 2c 20 69 44 6c 69 64 78  evLeaf+1, iDlidx
2a820 50 72 65 76 4c 65 61 66 2b 31 2c 20 69 49 64 78  PrevLeaf+1, iIdx
2a830 4c 65 61 66 2d 31 0a 20 20 20 20 29 3b 0a 20 20  Leaf-1.    );.  
2a840 20 20 69 66 28 20 70 2d 3e 72 63 20 29 20 62 72    if( p->rc ) br
2a850 65 61 6b 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20  eak;..    /* If 
2a860 74 68 65 72 65 20 69 73 20 61 20 64 6f 63 6c 69  there is a docli
2a870 73 74 2d 69 6e 64 65 78 2c 20 63 68 65 63 6b 20  st-index, check 
2a880 74 68 61 74 20 69 74 20 6c 6f 6f 6b 73 20 72 69  that it looks ri
2a890 67 68 74 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20  ght. */.    if( 
2a8a0 62 49 64 78 44 6c 69 64 78 20 29 7b 0a 20 20 20  bIdxDlidx ){.   
2a8b0 20 20 20 46 74 73 35 44 6c 69 64 78 49 74 65 72     Fts5DlidxIter
2a8c0 20 2a 70 44 6c 69 64 78 20 3d 20 30 3b 20 20 2f   *pDlidx = 0;  /
2a8d0 2a 20 46 6f 72 20 69 74 65 72 61 74 69 6e 67 20  * For iterating 
2a8e0 74 68 72 6f 75 67 68 20 64 6f 63 6c 69 73 74 20  through doclist 
2a8f0 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 20 20 69  index */.      i
2a900 6e 74 20 69 50 72 65 76 4c 65 61 66 20 3d 20 69  nt iPrevLeaf = i
2a910 49 64 78 4c 65 61 66 3b 0a 20 20 20 20 20 20 69  IdxLeaf;.      i
2a920 6e 74 20 69 53 65 67 69 64 20 3d 20 70 53 65 67  nt iSegid = pSeg
2a930 2d 3e 69 53 65 67 69 64 3b 0a 20 20 20 20 20 20  ->iSegid;.      
2a940 69 6e 74 20 69 50 67 20 3d 20 30 3b 0a 20 20 20  int iPg = 0;.   
2a950 20 20 20 69 36 34 20 69 4b 65 79 3b 0a 0a 20 20     i64 iKey;..  
2a960 20 20 20 20 66 6f 72 28 70 44 6c 69 64 78 3d 66      for(pDlidx=f
2a970 74 73 35 44 6c 69 64 78 49 74 65 72 49 6e 69 74  ts5DlidxIterInit
2a980 28 70 2c 20 30 2c 20 69 53 65 67 69 64 2c 20 69  (p, 0, iSegid, i
2a990 49 64 78 4c 65 61 66 29 3b 0a 20 20 20 20 20 20  IdxLeaf);.      
2a9a0 20 20 20 20 66 74 73 35 44 6c 69 64 78 49 74 65      fts5DlidxIte
2a9b0 72 45 6f 66 28 70 2c 20 70 44 6c 69 64 78 29 3d  rEof(p, pDlidx)=
2a9c0 3d 30 3b 0a 20 20 20 20 20 20 20 20 20 20 66 74  =0;.          ft
2a9d0 73 35 44 6c 69 64 78 49 74 65 72 4e 65 78 74 28  s5DlidxIterNext(
2a9e0 70 2c 20 70 44 6c 69 64 78 29 0a 20 20 20 20 20  p, pDlidx).     
2a9f0 20 29 7b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20   ){..        /* 
2aa00 43 68 65 63 6b 20 61 6e 79 20 72 6f 77 69 64 2d  Check any rowid-
2aa10 6c 65 73 73 20 70 61 67 65 73 20 74 68 61 74 20  less pages that 
2aa20 6f 63 63 75 72 20 62 65 66 6f 72 65 20 74 68 65  occur before the
2aa30 20 63 75 72 72 65 6e 74 20 6c 65 61 66 2e 20 2a   current leaf. *
2aa40 2f 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 50  /.        for(iP
2aa50 67 3d 69 50 72 65 76 4c 65 61 66 2b 31 3b 20 69  g=iPrevLeaf+1; i
2aa60 50 67 3c 66 74 73 35 44 6c 69 64 78 49 74 65 72  Pg<fts5DlidxIter
2aa70 50 67 6e 6f 28 70 44 6c 69 64 78 29 3b 20 69 50  Pgno(pDlidx); iP
2aa80 67 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  g++){.          
2aa90 69 4b 65 79 20 3d 20 46 54 53 35 5f 53 45 47 4d  iKey = FTS5_SEGM
2aaa0 45 4e 54 5f 52 4f 57 49 44 28 69 53 65 67 69 64  ENT_ROWID(iSegid
2aab0 2c 20 69 50 67 29 3b 0a 20 20 20 20 20 20 20 20  , iPg);.        
2aac0 20 20 70 4c 65 61 66 20 3d 20 66 74 73 35 44 61    pLeaf = fts5Da
2aad0 74 61 52 65 61 64 28 70 2c 20 69 4b 65 79 29 3b  taRead(p, iKey);
2aae0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
2aaf0 4c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 20 20  Leaf ){.        
2ab00 20 20 20 20 69 66 28 20 66 74 73 35 4c 65 61 66      if( fts5Leaf
2ab10 46 69 72 73 74 52 6f 77 69 64 4f 66 66 28 70 4c  FirstRowidOff(pL
2ab20 65 61 66 29 21 3d 30 20 29 20 70 2d 3e 72 63 20  eaf)!=0 ) p->rc 
2ab30 3d 20 46 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a  = FTS5_CORRUPT;.
2ab40 20 20 20 20 20 20 20 20 20 20 20 20 66 74 73 35              fts5
2ab50 44 61 74 61 52 65 6c 65 61 73 65 28 70 4c 65 61  DataRelease(pLea
2ab60 66 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  f);.          }.
2ab70 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2ab80 20 20 69 50 72 65 76 4c 65 61 66 20 3d 20 66 74    iPrevLeaf = ft
2ab90 73 35 44 6c 69 64 78 49 74 65 72 50 67 6e 6f 28  s5DlidxIterPgno(
2aba0 70 44 6c 69 64 78 29 3b 0a 0a 20 20 20 20 20 20  pDlidx);..      
2abb0 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20    /* Check that 
2abc0 74 68 65 20 6c 65 61 66 20 70 61 67 65 20 69 6e  the leaf page in
2abd0 64 69 63 61 74 65 64 20 62 79 20 74 68 65 20 69  dicated by the i
2abe0 74 65 72 61 74 6f 72 20 72 65 61 6c 6c 79 20 64  terator really d
2abf0 6f 65 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 63  oes.        ** c
2ac00 6f 6e 74 61 69 6e 20 74 68 65 20 72 6f 77 69 64  ontain the rowid
2ac10 20 73 75 67 67 65 73 74 65 64 20 62 79 20 74 68   suggested by th
2ac20 65 20 73 61 6d 65 2e 20 2a 2f 0a 20 20 20 20 20  e same. */.     
2ac30 20 20 20 69 4b 65 79 20 3d 20 46 54 53 35 5f 53     iKey = FTS5_S
2ac40 45 47 4d 45 4e 54 5f 52 4f 57 49 44 28 69 53 65  EGMENT_ROWID(iSe
2ac50 67 69 64 2c 20 69 50 72 65 76 4c 65 61 66 29 3b  gid, iPrevLeaf);
2ac60 0a 20 20 20 20 20 20 20 20 70 4c 65 61 66 20 3d  .        pLeaf =
2ac70 20 66 74 73 35 44 61 74 61 52 65 61 64 28 70 2c   fts5DataRead(p,
2ac80 20 69 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20   iKey);.        
2ac90 69 66 28 20 70 4c 65 61 66 20 29 7b 0a 20 20 20  if( pLeaf ){.   
2aca0 20 20 20 20 20 20 20 69 36 34 20 69 52 6f 77 69         i64 iRowi
2acb0 64 3b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74  d;.          int
2acc0 20 69 52 6f 77 69 64 4f 66 66 20 3d 20 66 74 73   iRowidOff = fts
2acd0 35 4c 65 61 66 46 69 72 73 74 52 6f 77 69 64 4f  5LeafFirstRowidO
2ace0 66 66 28 70 4c 65 61 66 29 3b 0a 20 20 20 20 20  ff(pLeaf);.     
2acf0 20 20 20 20 20 41 53 53 45 52 54 5f 53 5a 4c 45       ASSERT_SZLE
2ad00 41 46 5f 4f 4b 28 70 4c 65 61 66 29 3b 0a 20 20  AF_OK(pLeaf);.  
2ad10 20 20 20 20 20 20 20 20 69 66 28 20 69 52 6f 77          if( iRow
2ad20 69 64 4f 66 66 3e 3d 70 4c 65 61 66 2d 3e 73 7a  idOff>=pLeaf->sz
2ad30 4c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 20 20  Leaf ){.        
2ad40 20 20 20 20 70 2d 3e 72 63 20 3d 20 46 54 53 35      p->rc = FTS5
2ad50 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20 20 20 20  _CORRUPT;.      
2ad60 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2ad70 20 20 20 20 20 20 20 66 74 73 35 47 65 74 56 61         fts5GetVa
2ad80 72 69 6e 74 28 26 70 4c 65 61 66 2d 3e 70 5b 69  rint(&pLeaf->p[i
2ad90 52 6f 77 69 64 4f 66 66 5d 2c 20 28 75 36 34 2a  RowidOff], (u64*
2ada0 29 26 69 52 6f 77 69 64 29 3b 0a 20 20 20 20 20  )&iRowid);.     
2adb0 20 20 20 20 20 20 20 69 66 28 20 69 52 6f 77 69         if( iRowi
2adc0 64 21 3d 66 74 73 35 44 6c 69 64 78 49 74 65 72  d!=fts5DlidxIter
2add0 52 6f 77 69 64 28 70 44 6c 69 64 78 29 20 29 20  Rowid(pDlidx) ) 
2ade0 70 2d 3e 72 63 20 3d 20 46 54 53 35 5f 43 4f 52  p->rc = FTS5_COR
2adf0 52 55 50 54 3b 0a 20 20 20 20 20 20 20 20 20 20  RUPT;.          
2ae00 7d 0a 20 20 20 20 20 20 20 20 20 20 66 74 73 35  }.          fts5
2ae10 44 61 74 61 52 65 6c 65 61 73 65 28 70 4c 65 61  DataRelease(pLea
2ae20 66 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  f);.        }.  
2ae30 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 44 6c      }..      iDl
2ae40 69 64 78 50 72 65 76 4c 65 61 66 20 3d 20 69 50  idxPrevLeaf = iP
2ae50 67 3b 0a 20 20 20 20 20 20 66 74 73 35 44 6c 69  g;.      fts5Dli
2ae60 64 78 49 74 65 72 46 72 65 65 28 70 44 6c 69 64  dxIterFree(pDlid
2ae70 78 29 3b 0a 20 20 20 20 20 20 66 74 73 35 54 65  x);.      fts5Te
2ae80 73 74 44 6c 69 64 78 52 65 76 65 72 73 65 28 70  stDlidxReverse(p
2ae90 2c 20 69 53 65 67 69 64 2c 20 69 49 64 78 4c 65  , iSegid, iIdxLe
2aea0 61 66 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  af);.    }else{.
2aeb0 20 20 20 20 20 20 69 44 6c 69 64 78 50 72 65 76        iDlidxPrev
2aec0 4c 65 61 66 20 3d 20 70 53 65 67 2d 3e 70 67 6e  Leaf = pSeg->pgn
2aed0 6f 4c 61 73 74 3b 0a 20 20 20 20 20 20 2f 2a 20  oLast;.      /* 
2aee0 54 4f 44 4f 3a 20 43 68 65 63 6b 20 74 68 65 72  TODO: Check ther
2aef0 65 20 69 73 20 6e 6f 20 64 6f 63 6c 69 73 74 20  e is no doclist 
2af00 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 7d 0a 0a  index */.    }..
2af10 20 20 20 20 69 49 64 78 50 72 65 76 4c 65 61 66      iIdxPrevLeaf
2af20 20 3d 20 69 49 64 78 4c 65 61 66 3b 0a 20 20 7d   = iIdxLeaf;.  }
2af30 0a 0a 20 20 72 63 32 20 3d 20 73 71 6c 69 74 65  ..  rc2 = sqlite
2af40 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74  3_finalize(pStmt
2af50 29 3b 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d  );.  if( p->rc==
2af60 53 51 4c 49 54 45 5f 4f 4b 20 29 20 70 2d 3e 72  SQLITE_OK ) p->r
2af70 63 20 3d 20 72 63 32 3b 0a 0a 20 20 2f 2a 20 50  c = rc2;..  /* P
2af80 61 67 65 20 69 74 65 72 2e 69 4c 65 61 66 20 6d  age iter.iLeaf m
2af90 75 73 74 20 6e 6f 77 20 62 65 20 74 68 65 20 72  ust now be the r
2afa0 69 67 68 74 6d 6f 73 74 20 6c 65 61 66 2d 70 61  ightmost leaf-pa
2afb0 67 65 20 69 6e 20 74 68 65 20 73 65 67 6d 65 6e  ge in the segmen
2afc0 74 20 2a 2f 0a 23 69 66 20 30 0a 20 20 69 66 28  t */.#if 0.  if(
2afd0 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
2afe0 4b 20 26 26 20 69 74 65 72 2e 69 4c 65 61 66 21  K && iter.iLeaf!
2aff0 3d 70 53 65 67 2d 3e 70 67 6e 6f 4c 61 73 74 20  =pSeg->pgnoLast 
2b000 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 46  ){.    p->rc = F
2b010 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20 7d  TS5_CORRUPT;.  }
2b020 0a 23 65 6e 64 69 66 0a 7d 0a 0a 0a 2f 2a 0a 2a  .#endif.}.../*.*
2b030 2a 20 52 75 6e 20 69 6e 74 65 72 6e 61 6c 20 63  * Run internal c
2b040 68 65 63 6b 73 20 74 6f 20 65 6e 73 75 72 65 20  hecks to ensure 
2b050 74 68 61 74 20 74 68 65 20 46 54 53 20 69 6e 64  that the FTS ind
2b060 65 78 20 28 61 29 20 69 73 20 69 6e 74 65 72 6e  ex (a) is intern
2b070 61 6c 6c 79 20 0a 2a 2a 20 63 6f 6e 73 69 73 74  ally .** consist
2b080 65 6e 74 20 61 6e 64 20 28 62 29 20 63 6f 6e 74  ent and (b) cont
2b090 61 69 6e 73 20 65 6e 74 72 69 65 73 20 66 6f 72  ains entries for
2b0a0 20 77 68 69 63 68 20 74 68 65 20 58 4f 52 20 6f   which the XOR o
2b0b0 66 20 74 68 65 20 63 68 65 63 6b 73 75 6d 73 0a  f the checksums.
2b0c0 2a 2a 20 61 73 20 63 61 6c 63 75 6c 61 74 65 64  ** as calculated
2b0d0 20 62 79 20 73 71 6c 69 74 65 33 46 74 73 35 49   by sqlite3Fts5I
2b0e0 6e 64 65 78 45 6e 74 72 79 43 6b 73 75 6d 28 29  ndexEntryCksum()
2b0f0 20 69 73 20 63 6b 73 75 6d 2e 0a 2a 2a 0a 2a 2a   is cksum..**.**
2b100 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   Return SQLITE_C
2b110 4f 52 52 55 50 54 20 69 66 20 61 6e 79 20 6f 66  ORRUPT if any of
2b120 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 63 68   the internal ch
2b130 65 63 6b 73 20 66 61 69 6c 2c 20 6f 72 20 69 66  ecks fail, or if
2b140 20 74 68 65 0a 2a 2a 20 63 68 65 63 6b 73 75 6d   the.** checksum
2b150 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68 2e   does not match.
2b160 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
2b170 4b 20 69 66 20 61 6c 6c 20 63 68 65 63 6b 73 20  K if all checks 
2b180 70 61 73 73 20 77 69 74 68 6f 75 74 0a 2a 2a 20  pass without.** 
2b190 65 72 72 6f 72 2c 20 6f 72 20 73 6f 6d 65 20 6f  error, or some o
2b1a0 74 68 65 72 20 53 51 4c 69 74 65 20 65 72 72 6f  ther SQLite erro
2b1b0 72 20 63 6f 64 65 20 69 66 20 61 6e 6f 74 68 65  r code if anothe
2b1c0 72 20 65 72 72 6f 72 20 28 65 2e 67 2e 20 4f 4f  r error (e.g. OO
2b1d0 4d 29 0a 2a 2a 20 6f 63 63 75 72 73 2e 0a 2a 2f  M).** occurs..*/
2b1e0 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35  .int sqlite3Fts5
2b1f0 49 6e 64 65 78 49 6e 74 65 67 72 69 74 79 43 68  IndexIntegrityCh
2b200 65 63 6b 28 46 74 73 35 49 6e 64 65 78 20 2a 70  eck(Fts5Index *p
2b210 2c 20 75 36 34 20 63 6b 73 75 6d 29 7b 0a 20 20  , u64 cksum){.  
2b220 69 6e 74 20 65 44 65 74 61 69 6c 20 3d 20 70 2d  int eDetail = p-
2b230 3e 70 43 6f 6e 66 69 67 2d 3e 65 44 65 74 61 69  >pConfig->eDetai
2b240 6c 3b 0a 20 20 75 36 34 20 63 6b 73 75 6d 32 20  l;.  u64 cksum2 
2b250 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
2b260 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 73 75 6d       /* Checksum
2b270 20 62 61 73 65 64 20 6f 6e 20 63 6f 6e 74 65 6e   based on conten
2b280 74 73 20 6f 66 20 69 6e 64 65 78 65 73 20 2a 2f  ts of indexes */
2b290 0a 20 20 46 74 73 35 42 75 66 66 65 72 20 70 6f  .  Fts5Buffer po
2b2a0 73 6c 69 73 74 20 3d 20 7b 30 2c 30 2c 30 7d 3b  slist = {0,0,0};
2b2b0 20 20 20 2f 2a 20 42 75 66 66 65 72 20 75 73 65     /* Buffer use
2b2c0 64 20 74 6f 20 68 6f 6c 64 20 61 20 70 6f 73 6c  d to hold a posl
2b2d0 69 73 74 20 2a 2f 0a 20 20 46 74 73 35 49 6e 64  ist */.  Fts5Ind
2b2e0 65 78 49 74 65 72 20 2a 70 49 74 65 72 3b 20 20  exIter *pIter;  
2b2f0 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64           /* Used
2b300 20 74 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f   to iterate thro
2b310 75 67 68 20 65 6e 74 69 72 65 20 69 6e 64 65 78  ugh entire index
2b320 20 2a 2f 0a 20 20 46 74 73 35 53 74 72 75 63 74   */.  Fts5Struct
2b330 75 72 65 20 2a 70 53 74 72 75 63 74 3b 20 20 20  ure *pStruct;   
2b340 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 73        /* Index s
2b350 74 72 75 63 74 75 72 65 20 2a 2f 0a 0a 23 69 66  tructure */..#if
2b360 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
2b370 0a 20 20 2f 2a 20 55 73 65 64 20 62 79 20 65 78  .  /* Used by ex
2b380 74 72 61 20 69 6e 74 65 72 6e 61 6c 20 74 65 73  tra internal tes
2b390 74 73 20 6f 6e 6c 79 20 72 75 6e 20 69 66 20 4e  ts only run if N
2b3a0 44 45 42 55 47 20 69 73 20 6e 6f 74 20 64 65 66  DEBUG is not def
2b3b0 69 6e 65 64 20 2a 2f 0a 20 20 75 36 34 20 63 6b  ined */.  u64 ck
2b3c0 73 75 6d 33 20 3d 20 30 3b 20 20 20 20 20 20 20  sum3 = 0;       
2b3d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 68 65            /* Che
2b3e0 63 6b 73 75 6d 20 62 61 73 65 64 20 6f 6e 20 63  cksum based on c
2b3f0 6f 6e 74 65 6e 74 73 20 6f 66 20 69 6e 64 65 78  ontents of index
2b400 65 73 20 2a 2f 0a 20 20 46 74 73 35 42 75 66 66  es */.  Fts5Buff
2b410 65 72 20 74 65 72 6d 20 3d 20 7b 30 2c 30 2c 30  er term = {0,0,0
2b420 7d 3b 20 20 20 20 20 20 2f 2a 20 42 75 66 66 65  };      /* Buffe
2b430 72 20 75 73 65 64 20 74 6f 20 68 6f 6c 64 20 6d  r used to hold m
2b440 6f 73 74 20 72 65 63 65 6e 74 20 74 65 72 6d 20  ost recent term 
2b450 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 0a 20 20 2f  */.#endif.  .  /
2b460 2a 20 4c 6f 61 64 20 74 68 65 20 46 54 53 20 69  * Load the FTS i
2b470 6e 64 65 78 20 73 74 72 75 63 74 75 72 65 20 2a  ndex structure *
2b480 2f 0a 20 20 70 53 74 72 75 63 74 20 3d 20 66 74  /.  pStruct = ft
2b490 73 35 53 74 72 75 63 74 75 72 65 52 65 61 64 28  s5StructureRead(
2b4a0 70 29 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20  p);..  /* Check 
2b4b0 74 68 61 74 20 74 68 65 20 69 6e 74 65 72 6e 61  that the interna
2b4c0 6c 20 6e 6f 64 65 73 20 6f 66 20 65 61 63 68 20  l nodes of each 
2b4d0 73 65 67 6d 65 6e 74 20 6d 61 74 63 68 20 74 68  segment match th
2b4e0 65 20 6c 65 61 76 65 73 20 2a 2f 0a 20 20 69 66  e leaves */.  if
2b4f0 28 20 70 53 74 72 75 63 74 20 29 7b 0a 20 20 20  ( pStruct ){.   
2b500 20 69 6e 74 20 69 4c 76 6c 2c 20 69 53 65 67 3b   int iLvl, iSeg;
2b510 0a 20 20 20 20 66 6f 72 28 69 4c 76 6c 3d 30 3b  .    for(iLvl=0;
2b520 20 69 4c 76 6c 3c 70 53 74 72 75 63 74 2d 3e 6e   iLvl<pStruct->n
2b530 4c 65 76 65 6c 3b 20 69 4c 76 6c 2b 2b 29 7b 0a  Level; iLvl++){.
2b540 20 20 20 20 20 20 66 6f 72 28 69 53 65 67 3d 30        for(iSeg=0
2b550 3b 20 69 53 65 67 3c 70 53 74 72 75 63 74 2d 3e  ; iSeg<pStruct->
2b560 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d 2e 6e 53 65  aLevel[iLvl].nSe
2b570 67 3b 20 69 53 65 67 2b 2b 29 7b 0a 20 20 20 20  g; iSeg++){.    
2b580 20 20 20 20 46 74 73 35 53 74 72 75 63 74 75 72      Fts5Structur
2b590 65 53 65 67 6d 65 6e 74 20 2a 70 53 65 67 20 3d  eSegment *pSeg =
2b5a0 20 26 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65   &pStruct->aLeve
2b5b0 6c 5b 69 4c 76 6c 5d 2e 61 53 65 67 5b 69 53 65  l[iLvl].aSeg[iSe
2b5c0 67 5d 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35  g];.        fts5
2b5d0 49 6e 64 65 78 49 6e 74 65 67 72 69 74 79 43 68  IndexIntegrityCh
2b5e0 65 63 6b 53 65 67 6d 65 6e 74 28 70 2c 20 70 53  eckSegment(p, pS
2b5f0 65 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eg);.      }.   
2b600 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65   }.  }..  /* The
2b610 20 63 6b 73 75 6d 20 61 72 67 75 6d 65 6e 74 20   cksum argument 
2b620 70 61 73 73 65 64 20 74 6f 20 74 68 69 73 20 66  passed to this f
2b630 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 63 68 65  unction is a che
2b640 63 6b 73 75 6d 20 63 61 6c 63 75 6c 61 74 65 64  cksum calculated
2b650 0a 20 20 2a 2a 20 62 61 73 65 64 20 6f 6e 20 61  .  ** based on a
2b660 6c 6c 20 65 78 70 65 63 74 65 64 20 65 6e 74 72  ll expected entr
2b670 69 65 73 20 69 6e 20 74 68 65 20 46 54 53 20 69  ies in the FTS i
2b680 6e 64 65 78 20 28 69 6e 63 6c 75 64 69 6e 67 20  ndex (including 
2b690 70 72 65 66 69 78 20 69 6e 64 65 78 0a 20 20 2a  prefix index.  *
2b6a0 2a 20 65 6e 74 72 69 65 73 29 2e 20 54 68 69 73  * entries). This
2b6b0 20 62 6c 6f 63 6b 20 63 68 65 63 6b 73 20 74 68   block checks th
2b6c0 61 74 20 61 20 63 68 65 63 6b 73 75 6d 20 63 61  at a checksum ca
2b6d0 6c 63 75 6c 61 74 65 64 20 62 61 73 65 64 20 6f  lculated based o
2b6e0 6e 20 74 68 65 0a 20 20 2a 2a 20 61 63 74 75 61  n the.  ** actua
2b6f0 6c 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 46 54  l contents of FT
2b700 53 20 69 6e 64 65 78 20 69 73 20 69 64 65 6e 74  S index is ident
2b710 69 63 61 6c 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ical..  **.  ** 
2b720 54 77 6f 20 76 65 72 73 69 6f 6e 73 20 6f 66 20  Two versions of 
2b730 74 68 65 20 73 61 6d 65 20 63 68 65 63 6b 73 75  the same checksu
2b740 6d 20 61 72 65 20 63 61 6c 63 75 6c 61 74 65 64  m are calculated
2b750 2e 20 54 68 65 20 66 69 72 73 74 20 28 73 74 61  . The first (sta
2b760 63 6b 0a 20 20 2a 2a 20 76 61 72 69 61 62 6c 65  ck.  ** variable
2b770 20 63 6b 73 75 6d 32 29 20 62 61 73 65 64 20 6f   cksum2) based o
2b780 6e 20 65 6e 74 72 69 65 73 20 65 78 74 72 61 63  n entries extrac
2b790 74 65 64 20 66 72 6f 6d 20 74 68 65 20 66 75 6c  ted from the ful
2b7a0 6c 2d 74 65 78 74 20 69 6e 64 65 78 0a 20 20 2a  l-text index.  *
2b7b0 2a 20 77 68 69 6c 65 20 64 6f 69 6e 67 20 61 20  * while doing a 
2b7c0 6c 69 6e 65 61 72 20 73 63 61 6e 20 6f 66 20 65  linear scan of e
2b7d0 61 63 68 20 69 6e 64 69 76 69 64 75 61 6c 20 69  ach individual i
2b7e0 6e 64 65 78 20 69 6e 20 74 75 72 6e 2e 20 0a 20  ndex in turn. . 
2b7f0 20 2a 2a 0a 20 20 2a 2a 20 41 73 20 65 61 63 68   **.  ** As each
2b800 20 74 65 72 6d 20 76 69 73 69 74 65 64 20 62 79   term visited by
2b810 20 74 68 65 20 6c 69 6e 65 61 72 20 73 63 61 6e   the linear scan
2b820 73 2c 20 61 20 73 65 70 61 72 61 74 65 20 71 75  s, a separate qu
2b830 65 72 79 20 66 6f 72 20 74 68 65 0a 20 20 2a 2a  ery for the.  **
2b840 20 73 61 6d 65 20 74 65 72 6d 20 69 73 20 70 65   same term is pe
2b850 72 66 6f 72 6d 65 64 2e 20 63 6b 73 75 6d 33 20  rformed. cksum3 
2b860 69 73 20 63 61 6c 63 75 6c 61 74 65 64 20 62 61  is calculated ba
2b870 73 65 64 20 6f 6e 20 74 68 65 20 65 6e 74 72 69  sed on the entri
2b880 65 73 0a 20 20 2a 2a 20 65 78 74 72 61 63 74 65  es.  ** extracte
2b890 64 20 62 79 20 74 68 65 73 65 20 71 75 65 72 69  d by these queri
2b8a0 65 73 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 66  es..  */.  for(f
2b8b0 74 73 35 4d 75 6c 74 69 49 74 65 72 4e 65 77 28  ts5MultiIterNew(
2b8c0 70 2c 20 70 53 74 72 75 63 74 2c 20 30 2c 20 30  p, pStruct, 0, 0
2b8d0 2c 20 30 2c 20 30 2c 20 2d 31 2c 20 30 2c 20 26  , 0, 0, -1, 0, &
2b8e0 70 49 74 65 72 29 3b 0a 20 20 20 20 20 20 66 74  pIter);.      ft
2b8f0 73 35 4d 75 6c 74 69 49 74 65 72 45 6f 66 28 70  s5MultiIterEof(p
2b900 2c 20 70 49 74 65 72 29 3d 3d 30 3b 0a 20 20 20  , pIter)==0;.   
2b910 20 20 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72     fts5MultiIter
2b920 4e 65 78 74 28 70 2c 20 70 49 74 65 72 2c 20 30  Next(p, pIter, 0
2b930 2c 20 30 29 0a 20 20 29 7b 0a 20 20 20 20 69 6e  , 0).  ){.    in
2b940 74 20 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20  t n;            
2b950 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
2b960 65 20 6f 66 20 74 65 72 6d 20 69 6e 20 62 79 74  e of term in byt
2b970 65 73 20 2a 2f 0a 20 20 20 20 69 36 34 20 69 50  es */.    i64 iP
2b980 6f 73 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  os = 0;         
2b990 20 20 20 20 20 20 2f 2a 20 50 6f 73 69 74 69 6f        /* Positio
2b9a0 6e 20 72 65 61 64 20 66 72 6f 6d 20 70 6f 73 6c  n read from posl
2b9b0 69 73 74 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69  ist */.    int i
2b9c0 4f 66 66 20 3d 20 30 3b 20 20 20 20 20 20 20 20  Off = 0;        
2b9d0 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74         /* Offset
2b9e0 20 77 69 74 68 69 6e 20 70 6f 73 6c 69 73 74 20   within poslist 
2b9f0 2a 2f 0a 20 20 20 20 69 36 34 20 69 52 6f 77 69  */.    i64 iRowi
2ba00 64 20 3d 20 66 74 73 35 4d 75 6c 74 69 49 74 65  d = fts5MultiIte
2ba10 72 52 6f 77 69 64 28 70 49 74 65 72 29 3b 0a 20  rRowid(pIter);. 
2ba20 20 20 20 63 68 61 72 20 2a 7a 20 3d 20 28 63 68     char *z = (ch
2ba30 61 72 2a 29 66 74 73 35 4d 75 6c 74 69 49 74 65  ar*)fts5MultiIte
2ba40 72 54 65 72 6d 28 70 49 74 65 72 2c 20 26 6e 29  rTerm(pIter, &n)
2ba50 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69  ;..    /* If thi
2ba60 73 20 69 73 20 61 20 6e 65 77 20 74 65 72 6d 2c  s is a new term,
2ba70 20 71 75 65 72 79 20 66 6f 72 20 69 74 2e 20 55   query for it. U
2ba80 70 64 61 74 65 20 63 6b 73 75 6d 33 20 77 69 74  pdate cksum3 wit
2ba90 68 20 74 68 65 20 72 65 73 75 6c 74 73 2e 20 2a  h the results. *
2baa0 2f 0a 20 20 20 20 66 74 73 35 54 65 73 74 54 65  /.    fts5TestTe
2bab0 72 6d 28 70 2c 20 26 74 65 72 6d 2c 20 7a 2c 20  rm(p, &term, z, 
2bac0 6e 2c 20 63 6b 73 75 6d 32 2c 20 26 63 6b 73 75  n, cksum2, &cksu
2bad0 6d 33 29 3b 0a 0a 20 20 20 20 69 66 28 20 65 44  m3);..    if( eD
2bae0 65 74 61 69 6c 3d 3d 46 54 53 35 5f 44 45 54 41  etail==FTS5_DETA
2baf0 49 4c 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 20  IL_NONE ){.     
2bb00 20 69 66 28 20 30 3d 3d 66 74 73 35 4d 75 6c 74   if( 0==fts5Mult
2bb10 69 49 74 65 72 49 73 45 6d 70 74 79 28 70 2c 20  iIterIsEmpty(p, 
2bb20 70 49 74 65 72 29 20 29 7b 0a 20 20 20 20 20 20  pIter) ){.      
2bb30 20 20 63 6b 73 75 6d 32 20 5e 3d 20 73 71 6c 69    cksum2 ^= sqli
2bb40 74 65 33 46 74 73 35 49 6e 64 65 78 45 6e 74 72  te3Fts5IndexEntr
2bb50 79 43 6b 73 75 6d 28 69 52 6f 77 69 64 2c 20 30  yCksum(iRowid, 0
2bb60 2c 20 30 2c 20 2d 31 2c 20 7a 2c 20 6e 29 3b 0a  , 0, -1, z, n);.
2bb70 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
2bb80 65 7b 0a 20 20 20 20 20 20 70 6f 73 6c 69 73 74  e{.      poslist
2bb90 2e 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 66 74  .n = 0;.      ft
2bba0 73 35 53 65 67 69 74 65 72 50 6f 73 6c 69 73 74  s5SegiterPoslist
2bbb0 28 70 2c 20 26 70 49 74 65 72 2d 3e 61 53 65 67  (p, &pIter->aSeg
2bbc0 5b 70 49 74 65 72 2d 3e 61 46 69 72 73 74 5b 31  [pIter->aFirst[1
2bbd0 5d 2e 69 46 69 72 73 74 5d 2c 20 30 2c 20 26 70  ].iFirst], 0, &p
2bbe0 6f 73 6c 69 73 74 29 3b 0a 20 20 20 20 20 20 77  oslist);.      w
2bbf0 68 69 6c 65 28 20 30 3d 3d 73 71 6c 69 74 65 33  hile( 0==sqlite3
2bc00 46 74 73 35 50 6f 73 6c 69 73 74 4e 65 78 74 36  Fts5PoslistNext6
2bc10 34 28 70 6f 73 6c 69 73 74 2e 70 2c 20 70 6f 73  4(poslist.p, pos
2bc20 6c 69 73 74 2e 6e 2c 20 26 69 4f 66 66 2c 20 26  list.n, &iOff, &
2bc30 69 50 6f 73 29 20 29 7b 0a 20 20 20 20 20 20 20  iPos) ){.       
2bc40 20 69 6e 74 20 69 43 6f 6c 20 3d 20 46 54 53 35   int iCol = FTS5
2bc50 5f 50 4f 53 32 43 4f 4c 55 4d 4e 28 69 50 6f 73  _POS2COLUMN(iPos
2bc60 29 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69  );.        int i
2bc70 54 6f 6b 4f 66 66 20 3d 20 46 54 53 35 5f 50 4f  TokOff = FTS5_PO
2bc80 53 32 4f 46 46 53 45 54 28 69 50 6f 73 29 3b 0a  S2OFFSET(iPos);.
2bc90 20 20 20 20 20 20 20 20 63 6b 73 75 6d 32 20 5e          cksum2 ^
2bca0 3d 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64  = sqlite3Fts5Ind
2bcb0 65 78 45 6e 74 72 79 43 6b 73 75 6d 28 69 52 6f  exEntryCksum(iRo
2bcc0 77 69 64 2c 20 69 43 6f 6c 2c 20 69 54 6f 6b 4f  wid, iCol, iTokO
2bcd0 66 66 2c 20 2d 31 2c 20 7a 2c 20 6e 29 3b 0a 20  ff, -1, z, n);. 
2bce0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
2bcf0 0a 20 20 66 74 73 35 54 65 73 74 54 65 72 6d 28  .  fts5TestTerm(
2bd00 70 2c 20 26 74 65 72 6d 2c 20 30 2c 20 30 2c 20  p, &term, 0, 0, 
2bd10 63 6b 73 75 6d 32 2c 20 26 63 6b 73 75 6d 33 29  cksum2, &cksum3)
2bd20 3b 0a 0a 20 20 66 74 73 35 4d 75 6c 74 69 49 74  ;..  fts5MultiIt
2bd30 65 72 46 72 65 65 28 70 2c 20 70 49 74 65 72 29  erFree(p, pIter)
2bd40 3b 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53  ;.  if( p->rc==S
2bd50 51 4c 49 54 45 5f 4f 4b 20 26 26 20 63 6b 73 75  QLITE_OK && cksu
2bd60 6d 21 3d 63 6b 73 75 6d 32 20 29 20 70 2d 3e 72  m!=cksum2 ) p->r
2bd70 63 20 3d 20 46 54 53 35 5f 43 4f 52 52 55 50 54  c = FTS5_CORRUPT
2bd80 3b 0a 0a 20 20 66 74 73 35 53 74 72 75 63 74 75  ;..  fts5Structu
2bd90 72 65 52 65 6c 65 61 73 65 28 70 53 74 72 75 63  reRelease(pStruc
2bda0 74 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  t);.#ifdef SQLIT
2bdb0 45 5f 44 45 42 55 47 0a 20 20 66 74 73 35 42 75  E_DEBUG.  fts5Bu
2bdc0 66 66 65 72 46 72 65 65 28 26 74 65 72 6d 29 3b  fferFree(&term);
2bdd0 0a 23 65 6e 64 69 66 0a 20 20 66 74 73 35 42 75  .#endif.  fts5Bu
2bde0 66 66 65 72 46 72 65 65 28 26 70 6f 73 6c 69 73  fferFree(&poslis
2bdf0 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 66 74 73  t);.  return fts
2be00 35 49 6e 64 65 78 52 65 74 75 72 6e 28 70 29 3b  5IndexReturn(p);
2be10 0a 7d 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .}../***********
2be20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2be30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2be40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2be50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a  **************.*
2be60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2be70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2be80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2be90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2bea0 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 42 65 6c  *********.** Bel
2beb0 6f 77 20 74 68 69 73 20 70 6f 69 6e 74 20 69 73  ow this point is
2bec0 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74   the implementat
2bed0 69 6f 6e 20 6f 66 20 74 68 65 20 66 74 73 35 5f  ion of the fts5_
2bee0 64 65 63 6f 64 65 28 29 20 73 63 61 6c 61 72 0a  decode() scalar.
2bef0 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 6f 6e 6c 79  ** function only
2bf00 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 6f  ..*/../*.** Deco
2bf10 64 65 20 61 20 73 65 67 6d 65 6e 74 2d 64 61 74  de a segment-dat
2bf20 61 20 72 6f 77 69 64 20 66 72 6f 6d 20 74 68 65  a rowid from the
2bf30 20 25 5f 64 61 74 61 20 74 61 62 6c 65 2e 20 54   %_data table. T
2bf40 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 0a  his function is.
2bf50 2a 2a 20 74 68 65 20 6f 70 70 6f 73 69 74 65 20  ** the opposite 
2bf60 6f 66 20 6d 61 63 72 6f 20 46 54 53 35 5f 53 45  of macro FTS5_SE
2bf70 47 4d 45 4e 54 5f 52 4f 57 49 44 28 29 2e 0a 2a  GMENT_ROWID()..*
2bf80 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  /.static void ft
2bf90 73 35 44 65 63 6f 64 65 52 6f 77 69 64 28 0a 20  s5DecodeRowid(. 
2bfa0 20 69 36 34 20 69 52 6f 77 69 64 2c 20 20 20 20   i64 iRowid,    
2bfb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bfc0 20 2f 2a 20 52 6f 77 69 64 20 66 72 6f 6d 20 25   /* Rowid from %
2bfd0 5f 64 61 74 61 20 74 61 62 6c 65 20 2a 2f 0a 20  _data table */. 
2bfe0 20 69 6e 74 20 2a 70 69 53 65 67 69 64 2c 20 20   int *piSegid,  
2bff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c000 20 2f 2a 20 4f 55 54 3a 20 53 65 67 6d 65 6e 74   /* OUT: Segment
2c010 20 69 64 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 62   id */.  int *pb
2c020 44 6c 69 64 78 2c 20 20 20 20 20 20 20 20 20 20  Dlidx,          
2c030 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a           /* OUT:
2c040 20 44 6c 69 64 78 20 66 6c 61 67 20 2a 2f 0a 20   Dlidx flag */. 
2c050 20 69 6e 74 20 2a 70 69 48 65 69 67 68 74 2c 20   int *piHeight, 
2c060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c070 20 2f 2a 20 4f 55 54 3a 20 48 65 69 67 68 74 20   /* OUT: Height 
2c080 2a 2f 0a 20 20 69 6e 74 20 2a 70 69 50 67 6e 6f  */.  int *piPgno
2c090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c0a0 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 50 61 67       /* OUT: Pag
2c0b0 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 29 7b 0a 20  e number */.){. 
2c0c0 20 2a 70 69 50 67 6e 6f 20 3d 20 28 69 6e 74 29   *piPgno = (int)
2c0d0 28 69 52 6f 77 69 64 20 26 20 28 28 28 69 36 34  (iRowid & (((i64
2c0e0 29 31 20 3c 3c 20 46 54 53 35 5f 44 41 54 41 5f  )1 << FTS5_DATA_
2c0f0 50 41 47 45 5f 42 29 20 2d 20 31 29 29 3b 0a 20  PAGE_B) - 1));. 
2c100 20 69 52 6f 77 69 64 20 3e 3e 3d 20 46 54 53 35   iRowid >>= FTS5
2c110 5f 44 41 54 41 5f 50 41 47 45 5f 42 3b 0a 0a 20  _DATA_PAGE_B;.. 
2c120 20 2a 70 69 48 65 69 67 68 74 20 3d 20 28 69 6e   *piHeight = (in
2c130 74 29 28 69 52 6f 77 69 64 20 26 20 28 28 28 69  t)(iRowid & (((i
2c140 36 34 29 31 20 3c 3c 20 46 54 53 35 5f 44 41 54  64)1 << FTS5_DAT
2c150 41 5f 48 45 49 47 48 54 5f 42 29 20 2d 20 31 29  A_HEIGHT_B) - 1)
2c160 29 3b 0a 20 20 69 52 6f 77 69 64 20 3e 3e 3d 20  );.  iRowid >>= 
2c170 46 54 53 35 5f 44 41 54 41 5f 48 45 49 47 48 54  FTS5_DATA_HEIGHT
2c180 5f 42 3b 0a 0a 20 20 2a 70 62 44 6c 69 64 78 20  _B;..  *pbDlidx 
2c190 3d 20 28 69 6e 74 29 28 69 52 6f 77 69 64 20 26  = (int)(iRowid &
2c1a0 20 30 78 30 30 30 31 29 3b 0a 20 20 69 52 6f 77   0x0001);.  iRow
2c1b0 69 64 20 3e 3e 3d 20 46 54 53 35 5f 44 41 54 41  id >>= FTS5_DATA
2c1c0 5f 44 4c 49 5f 42 3b 0a 0a 20 20 2a 70 69 53 65  _DLI_B;..  *piSe
2c1d0 67 69 64 20 3d 20 28 69 6e 74 29 28 69 52 6f 77  gid = (int)(iRow
2c1e0 69 64 20 26 20 28 28 28 69 36 34 29 31 20 3c 3c  id & (((i64)1 <<
2c1f0 20 46 54 53 35 5f 44 41 54 41 5f 49 44 5f 42 29   FTS5_DATA_ID_B)
2c200 20 2d 20 31 29 29 3b 0a 7d 0a 0a 73 74 61 74 69   - 1));.}..stati
2c210 63 20 76 6f 69 64 20 66 74 73 35 44 65 62 75 67  c void fts5Debug
2c220 52 6f 77 69 64 28 69 6e 74 20 2a 70 52 63 2c 20  Rowid(int *pRc, 
2c230 46 74 73 35 42 75 66 66 65 72 20 2a 70 42 75 66  Fts5Buffer *pBuf
2c240 2c 20 69 36 34 20 69 4b 65 79 29 7b 0a 20 20 69  , i64 iKey){.  i
2c250 6e 74 20 69 53 65 67 69 64 2c 20 69 48 65 69 67  nt iSegid, iHeig
2c260 68 74 2c 20 69 50 67 6e 6f 2c 20 62 44 6c 69 64  ht, iPgno, bDlid
2c270 78 3b 20 20 20 20 20 20 20 2f 2a 20 52 6f 77 69  x;       /* Rowi
2c280 64 20 63 6f 6d 70 65 6e 65 6e 74 73 20 2a 2f 0a  d compenents */.
2c290 20 20 66 74 73 35 44 65 63 6f 64 65 52 6f 77 69    fts5DecodeRowi
2c2a0 64 28 69 4b 65 79 2c 20 26 69 53 65 67 69 64 2c  d(iKey, &iSegid,
2c2b0 20 26 62 44 6c 69 64 78 2c 20 26 69 48 65 69 67   &bDlidx, &iHeig
2c2c0 68 74 2c 20 26 69 50 67 6e 6f 29 3b 0a 0a 20 20  ht, &iPgno);..  
2c2d0 69 66 28 20 69 53 65 67 69 64 3d 3d 30 20 29 7b  if( iSegid==0 ){
2c2e0 0a 20 20 20 20 69 66 28 20 69 4b 65 79 3d 3d 46  .    if( iKey==F
2c2f0 54 53 35 5f 41 56 45 52 41 47 45 53 5f 52 4f 57  TS5_AVERAGES_ROW
2c300 49 44 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  ID ){.      sqli
2c310 74 65 33 46 74 73 35 42 75 66 66 65 72 41 70 70  te3Fts5BufferApp
2c320 65 6e 64 50 72 69 6e 74 66 28 70 52 63 2c 20 70  endPrintf(pRc, p
2c330 42 75 66 2c 20 22 7b 61 76 65 72 61 67 65 73 7d  Buf, "{averages}
2c340 20 22 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a   ");.    }else{.
2c350 20 20 20 20 20 20 73 71 6c 69 74 65 33 46 74 73        sqlite3Fts
2c360 35 42 75 66 66 65 72 41 70 70 65 6e 64 50 72 69  5BufferAppendPri
2c370 6e 74 66 28 70 52 63 2c 20 70 42 75 66 2c 20 22  ntf(pRc, pBuf, "
2c380 7b 73 74 72 75 63 74 75 72 65 7d 22 29 3b 0a 20  {structure}");. 
2c390 20 20 20 7d 0a 20 20 7d 0a 20 20 65 6c 73 65 7b     }.  }.  else{
2c3a0 0a 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35  .    sqlite3Fts5
2c3b0 42 75 66 66 65 72 41 70 70 65 6e 64 50 72 69 6e  BufferAppendPrin
2c3c0 74 66 28 70 52 63 2c 20 70 42 75 66 2c 20 22 7b  tf(pRc, pBuf, "{
2c3d0 25 73 73 65 67 69 64 3d 25 64 20 68 3d 25 64 20  %ssegid=%d h=%d 
2c3e0 70 67 6e 6f 3d 25 64 7d 22 2c 0a 20 20 20 20 20  pgno=%d}",.     
2c3f0 20 20 20 62 44 6c 69 64 78 20 3f 20 22 64 6c 69     bDlidx ? "dli
2c400 64 78 20 22 20 3a 20 22 22 2c 20 69 53 65 67 69  dx " : "", iSegi
2c410 64 2c 20 69 48 65 69 67 68 74 2c 20 69 50 67 6e  d, iHeight, iPgn
2c420 6f 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 7d 0a 0a  o.    );.  }.}..
2c430 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
2c440 44 65 62 75 67 53 74 72 75 63 74 75 72 65 28 0a  DebugStructure(.
2c450 20 20 69 6e 74 20 2a 70 52 63 2c 20 20 20 20 20    int *pRc,     
2c460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c470 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 65 72 72    /* IN/OUT: err
2c480 6f 72 20 63 6f 64 65 20 2a 2f 0a 20 20 46 74 73  or code */.  Fts
2c490 35 42 75 66 66 65 72 20 2a 70 42 75 66 2c 0a 20  5Buffer *pBuf,. 
2c4a0 20 46 74 73 35 53 74 72 75 63 74 75 72 65 20 2a   Fts5Structure *
2c4b0 70 0a 29 7b 0a 20 20 69 6e 74 20 69 4c 76 6c 2c  p.){.  int iLvl,
2c4c0 20 69 53 65 67 3b 20 20 20 20 20 20 20 20 20 20   iSeg;          
2c4d0 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74         /* Iterat
2c4e0 65 20 74 68 72 6f 75 67 68 20 6c 65 76 65 6c 73  e through levels
2c4f0 2c 20 73 65 67 6d 65 6e 74 73 20 2a 2f 0a 0a 20  , segments */.. 
2c500 20 66 6f 72 28 69 4c 76 6c 3d 30 3b 20 69 4c 76   for(iLvl=0; iLv
2c510 6c 3c 70 2d 3e 6e 4c 65 76 65 6c 3b 20 69 4c 76  l<p->nLevel; iLv
2c520 6c 2b 2b 29 7b 0a 20 20 20 20 46 74 73 35 53 74  l++){.    Fts5St
2c530 72 75 63 74 75 72 65 4c 65 76 65 6c 20 2a 70 4c  ructureLevel *pL
2c540 76 6c 20 3d 20 26 70 2d 3e 61 4c 65 76 65 6c 5b  vl = &p->aLevel[
2c550 69 4c 76 6c 5d 3b 0a 20 20 20 20 73 71 6c 69 74  iLvl];.    sqlit
2c560 65 33 46 74 73 35 42 75 66 66 65 72 41 70 70 65  e3Fts5BufferAppe
2c570 6e 64 50 72 69 6e 74 66 28 70 52 63 2c 20 70 42  ndPrintf(pRc, pB
2c580 75 66 2c 20 0a 20 20 20 20 20 20 20 20 22 20 7b  uf, .        " {
2c590 6c 76 6c 3d 25 64 20 6e 4d 65 72 67 65 3d 25 64  lvl=%d nMerge=%d
2c5a0 20 6e 53 65 67 3d 25 64 22 2c 20 69 4c 76 6c 2c   nSeg=%d", iLvl,
2c5b0 20 70 4c 76 6c 2d 3e 6e 4d 65 72 67 65 2c 20 70   pLvl->nMerge, p
2c5c0 4c 76 6c 2d 3e 6e 53 65 67 0a 20 20 20 20 29 3b  Lvl->nSeg.    );
2c5d0 0a 20 20 20 20 66 6f 72 28 69 53 65 67 3d 30 3b  .    for(iSeg=0;
2c5e0 20 69 53 65 67 3c 70 4c 76 6c 2d 3e 6e 53 65 67   iSeg<pLvl->nSeg
2c5f0 3b 20 69 53 65 67 2b 2b 29 7b 0a 20 20 20 20 20  ; iSeg++){.     
2c600 20 46 74 73 35 53 74 72 75 63 74 75 72 65 53 65   Fts5StructureSe
2c610 67 6d 65 6e 74 20 2a 70 53 65 67 20 3d 20 26 70  gment *pSeg = &p
2c620 4c 76 6c 2d 3e 61 53 65 67 5b 69 53 65 67 5d 3b  Lvl->aSeg[iSeg];
2c630 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 46 74  .      sqlite3Ft
2c640 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 50 72  s5BufferAppendPr
2c650 69 6e 74 66 28 70 52 63 2c 20 70 42 75 66 2c 20  intf(pRc, pBuf, 
2c660 22 20 7b 69 64 3d 25 64 20 6c 65 61 76 65 73 3d  " {id=%d leaves=
2c670 25 64 2e 2e 25 64 7d 22 2c 20 0a 20 20 20 20 20  %d..%d}", .     
2c680 20 20 20 20 20 70 53 65 67 2d 3e 69 53 65 67 69       pSeg->iSegi
2c690 64 2c 20 70 53 65 67 2d 3e 70 67 6e 6f 46 69 72  d, pSeg->pgnoFir
2c6a0 73 74 2c 20 70 53 65 67 2d 3e 70 67 6e 6f 4c 61  st, pSeg->pgnoLa
2c6b0 73 74 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20  st.      );.    
2c6c0 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 46 74 73  }.    sqlite3Fts
2c6d0 35 42 75 66 66 65 72 41 70 70 65 6e 64 50 72 69  5BufferAppendPri
2c6e0 6e 74 66 28 70 52 63 2c 20 70 42 75 66 2c 20 22  ntf(pRc, pBuf, "
2c6f0 7d 22 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  }");.  }.}../*.*
2c700 2a 20 54 68 69 73 20 69 73 20 70 61 72 74 20 6f  * This is part o
2c710 66 20 74 68 65 20 66 74 73 35 5f 64 65 63 6f 64  f the fts5_decod
2c720 65 28 29 20 64 65 62 75 67 67 69 6e 67 20 61 69  e() debugging ai
2c730 64 2e 0a 2a 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e  d..**.** Argumen
2c740 74 73 20 70 42 6c 6f 62 2f 6e 42 6c 6f 62 20 63  ts pBlob/nBlob c
2c750 6f 6e 74 61 69 6e 20 61 20 73 65 72 69 61 6c 69  ontain a seriali
2c760 7a 65 64 20 46 74 73 35 53 74 72 75 63 74 75 72  zed Fts5Structur
2c770 65 20 6f 62 6a 65 63 74 2e 20 54 68 69 73 0a 2a  e object. This.*
2c780 2a 20 66 75 6e 63 74 69 6f 6e 20 61 70 70 65 6e  * function appen
2c790 64 73 20 61 20 68 75 6d 61 6e 2d 72 65 61 64 61  ds a human-reada
2c7a0 62 6c 65 20 72 65 70 72 65 73 65 6e 74 61 74 69  ble representati
2c7b0 6f 6e 20 6f 66 20 74 68 65 20 73 61 6d 65 20 6f  on of the same o
2c7c0 62 6a 65 63 74 0a 2a 2a 20 74 6f 20 74 68 65 20  bject.** to the 
2c7d0 62 75 66 66 65 72 20 70 61 73 73 65 64 20 61 73  buffer passed as
2c7e0 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
2c7f0 6d 65 6e 74 2e 20 0a 2a 2f 0a 73 74 61 74 69 63  ment. .*/.static
2c800 20 76 6f 69 64 20 66 74 73 35 44 65 63 6f 64 65   void fts5Decode
2c810 53 74 72 75 63 74 75 72 65 28 0a 20 20 69 6e 74  Structure(.  int
2c820 20 2a 70 52 63 2c 20 20 20 20 20 20 20 20 20 20   *pRc,          
2c830 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2c840 49 4e 2f 4f 55 54 3a 20 65 72 72 6f 72 20 63 6f  IN/OUT: error co
2c850 64 65 20 2a 2f 0a 20 20 46 74 73 35 42 75 66 66  de */.  Fts5Buff
2c860 65 72 20 2a 70 42 75 66 2c 0a 20 20 63 6f 6e 73  er *pBuf,.  cons
2c870 74 20 75 38 20 2a 70 42 6c 6f 62 2c 20 69 6e 74  t u8 *pBlob, int
2c880 20 6e 42 6c 6f 62 0a 29 7b 0a 20 20 69 6e 74 20   nBlob.){.  int 
2c890 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
2c8a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
2c8b0 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20  eturn code */.  
2c8c0 46 74 73 35 53 74 72 75 63 74 75 72 65 20 2a 70  Fts5Structure *p
2c8d0 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
2c8e0 2f 2a 20 44 65 63 6f 64 65 64 20 73 74 72 75 63  /* Decoded struc
2c8f0 74 75 72 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 0a  ture object */..
2c900 20 20 72 63 20 3d 20 66 74 73 35 53 74 72 75 63    rc = fts5Struc
2c910 74 75 72 65 44 65 63 6f 64 65 28 70 42 6c 6f 62  tureDecode(pBlob
2c920 2c 20 6e 42 6c 6f 62 2c 20 30 2c 20 26 70 29 3b  , nBlob, 0, &p);
2c930 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
2c940 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2a 70 52 63  E_OK ){.    *pRc
2c950 20 3d 20 72 63 3b 0a 20 20 20 20 72 65 74 75 72   = rc;.    retur
2c960 6e 3b 0a 20 20 7d 0a 0a 20 20 66 74 73 35 44 65  n;.  }..  fts5De
2c970 62 75 67 53 74 72 75 63 74 75 72 65 28 70 52 63  bugStructure(pRc
2c980 2c 20 70 42 75 66 2c 20 70 29 3b 0a 20 20 66 74  , pBuf, p);.  ft
2c990 73 35 53 74 72 75 63 74 75 72 65 52 65 6c 65 61  s5StructureRelea
2c9a0 73 65 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  se(p);.}../*.** 
2c9b0 54 68 69 73 20 69 73 20 70 61 72 74 20 6f 66 20  This is part of 
2c9c0 74 68 65 20 66 74 73 35 5f 64 65 63 6f 64 65 28  the fts5_decode(
2c9d0 29 20 64 65 62 75 67 67 69 6e 67 20 61 69 64 2e  ) debugging aid.
2c9e0 0a 2a 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 73  .**.** Arguments
2c9f0 20 70 42 6c 6f 62 2f 6e 42 6c 6f 62 20 63 6f 6e   pBlob/nBlob con
2ca00 74 61 69 6e 20 61 6e 20 22 61 76 65 72 61 67 65  tain an "average
2ca10 73 22 20 72 65 63 6f 72 64 2e 20 54 68 69 73 20  s" record. This 
2ca20 66 75 6e 63 74 69 6f 6e 20 0a 2a 2a 20 61 70 70  function .** app
2ca30 65 6e 64 73 20 61 20 68 75 6d 61 6e 2d 72 65 61  ends a human-rea
2ca40 64 61 62 6c 65 20 72 65 70 72 65 73 65 6e 74 61  dable representa
2ca50 74 69 6f 6e 20 6f 66 20 72 65 63 6f 72 64 20 74  tion of record t
2ca60 6f 20 74 68 65 20 62 75 66 66 65 72 20 70 61 73  o the buffer pas
2ca70 73 65 64 20 0a 2a 2a 20 61 73 20 74 68 65 20 73  sed .** as the s
2ca80 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2e 20  econd argument. 
2ca90 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
2caa0 66 74 73 35 44 65 63 6f 64 65 41 76 65 72 61 67  fts5DecodeAverag
2cab0 65 73 28 0a 20 20 69 6e 74 20 2a 70 52 63 2c 20  es(.  int *pRc, 
2cac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2cad0 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a        /* IN/OUT:
2cae0 20 65 72 72 6f 72 20 63 6f 64 65 20 2a 2f 0a 20   error code */. 
2caf0 20 46 74 73 35 42 75 66 66 65 72 20 2a 70 42 75   Fts5Buffer *pBu
2cb00 66 2c 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 70  f,.  const u8 *p
2cb10 42 6c 6f 62 2c 20 69 6e 74 20 6e 42 6c 6f 62 0a  Blob, int nBlob.
2cb20 29 7b 0a 20 20 69 6e 74 20 69 20 3d 20 30 3b 0a  ){.  int i = 0;.
2cb30 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53    const char *zS
2cb40 70 61 63 65 20 3d 20 22 22 3b 0a 0a 20 20 77 68  pace = "";..  wh
2cb50 69 6c 65 28 20 69 3c 6e 42 6c 6f 62 20 29 7b 0a  ile( i<nBlob ){.
2cb60 20 20 20 20 75 36 34 20 69 56 61 6c 3b 0a 20 20      u64 iVal;.  
2cb70 20 20 69 20 2b 3d 20 73 71 6c 69 74 65 33 46 74    i += sqlite3Ft
2cb80 73 35 47 65 74 56 61 72 69 6e 74 28 26 70 42 6c  s5GetVarint(&pBl
2cb90 6f 62 5b 69 5d 2c 20 26 69 56 61 6c 29 3b 0a 20  ob[i], &iVal);. 
2cba0 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 42 75     sqlite3Fts5Bu
2cbb0 66 66 65 72 41 70 70 65 6e 64 50 72 69 6e 74 66  fferAppendPrintf
2cbc0 28 70 52 63 2c 20 70 42 75 66 2c 20 22 25 73 25  (pRc, pBuf, "%s%
2cbd0 64 22 2c 20 7a 53 70 61 63 65 2c 20 28 69 6e 74  d", zSpace, (int
2cbe0 29 69 56 61 6c 29 3b 0a 20 20 20 20 7a 53 70 61  )iVal);.    zSpa
2cbf0 63 65 20 3d 20 22 20 22 3b 0a 20 20 7d 0a 7d 0a  ce = " ";.  }.}.
2cc00 0a 2f 2a 0a 2a 2a 20 42 75 66 66 65 72 20 28 61  ./*.** Buffer (a
2cc10 2f 6e 29 20 69 73 20 61 73 73 75 6d 65 64 20 74  /n) is assumed t
2cc20 6f 20 63 6f 6e 74 61 69 6e 20 61 20 6c 69 73 74  o contain a list
2cc30 20 6f 66 20 73 65 72 69 61 6c 69 7a 65 64 20 76   of serialized v
2cc40 61 72 69 6e 74 73 2e 20 52 65 61 64 0a 2a 2a 20  arints. Read.** 
2cc50 65 61 63 68 20 76 61 72 69 6e 74 20 61 6e 64 20  each varint and 
2cc60 61 70 70 65 6e 64 20 69 74 73 20 73 74 72 69 6e  append its strin
2cc70 67 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e  g representation
2cc80 20 74 6f 20 62 75 66 66 65 72 20 70 42 75 66 2e   to buffer pBuf.
2cc90 20 52 65 74 75 72 6e 0a 2a 2a 20 61 66 74 65 72   Return.** after
2cca0 20 65 69 74 68 65 72 20 74 68 65 20 69 6e 70 75   either the inpu
2ccb0 74 20 62 75 66 66 65 72 20 69 73 20 65 78 68 61  t buffer is exha
2ccc0 75 73 74 65 64 20 6f 72 20 61 20 30 20 76 61 6c  usted or a 0 val
2ccd0 75 65 20 69 73 20 72 65 61 64 2e 0a 2a 2a 0a 2a  ue is read..**.*
2cce0 2a 20 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c  * The return val
2ccf0 75 65 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72  ue is the number
2cd00 20 6f 66 20 62 79 74 65 73 20 72 65 61 64 20 66   of bytes read f
2cd10 72 6f 6d 20 74 68 65 20 69 6e 70 75 74 20 62 75  rom the input bu
2cd20 66 66 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ffer..*/.static 
2cd30 69 6e 74 20 66 74 73 35 44 65 63 6f 64 65 50 6f  int fts5DecodePo
2cd40 73 6c 69 73 74 28 69 6e 74 20 2a 70 52 63 2c 20  slist(int *pRc, 
2cd50 46 74 73 35 42 75 66 66 65 72 20 2a 70 42 75 66  Fts5Buffer *pBuf
2cd60 2c 20 63 6f 6e 73 74 20 75 38 20 2a 61 2c 20 69  , const u8 *a, i
2cd70 6e 74 20 6e 29 7b 0a 20 20 69 6e 74 20 69 4f 66  nt n){.  int iOf
2cd80 66 20 3d 20 30 3b 0a 20 20 77 68 69 6c 65 28 20  f = 0;.  while( 
2cd90 69 4f 66 66 3c 6e 20 29 7b 0a 20 20 20 20 69 6e  iOff<n ){.    in
2cda0 74 20 69 56 61 6c 3b 0a 20 20 20 20 69 4f 66 66  t iVal;.    iOff
2cdb0 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e   += fts5GetVarin
2cdc0 74 33 32 28 26 61 5b 69 4f 66 66 5d 2c 20 69 56  t32(&a[iOff], iV
2cdd0 61 6c 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  al);.    sqlite3
2cde0 46 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64  Fts5BufferAppend
2cdf0 50 72 69 6e 74 66 28 70 52 63 2c 20 70 42 75 66  Printf(pRc, pBuf
2ce00 2c 20 22 20 25 64 22 2c 20 69 56 61 6c 29 3b 0a  , " %d", iVal);.
2ce10 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 69 4f 66    }.  return iOf
2ce20 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  f;.}../*.** The 
2ce30 73 74 61 72 74 20 6f 66 20 62 75 66 66 65 72 20  start of buffer 
2ce40 28 61 2f 6e 29 20 63 6f 6e 74 61 69 6e 73 20 74  (a/n) contains t
2ce50 68 65 20 73 74 61 72 74 20 6f 66 20 61 20 64 6f  he start of a do
2ce60 63 6c 69 73 74 2e 20 54 68 65 20 64 6f 63 6c 69  clist. The docli
2ce70 73 74 0a 2a 2a 20 6d 61 79 20 6f 72 20 6d 61 79  st.** may or may
2ce80 20 6e 6f 74 20 66 69 6e 69 73 68 20 77 69 74 68   not finish with
2ce90 69 6e 20 74 68 65 20 62 75 66 66 65 72 2e 20 54  in the buffer. T
2cea0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 70 70  his function app
2ceb0 65 6e 64 73 20 61 20 74 65 78 74 0a 2a 2a 20 72  ends a text.** r
2cec0 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66  epresentation of
2ced0 20 74 68 65 20 70 61 72 74 20 6f 66 20 74 68 65   the part of the
2cee0 20 64 6f 63 6c 69 73 74 20 74 68 61 74 20 69 73   doclist that is
2cef0 20 70 72 65 73 65 6e 74 20 74 6f 20 62 75 66 66   present to buff
2cf00 65 72 0a 2a 2a 20 70 42 75 66 2e 20 0a 2a 2a 0a  er.** pBuf. .**.
2cf10 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 20 76 61  ** The return va
2cf20 6c 75 65 20 69 73 20 74 68 65 20 6e 75 6d 62 65  lue is the numbe
2cf30 72 20 6f 66 20 62 79 74 65 73 20 72 65 61 64 20  r of bytes read 
2cf40 66 72 6f 6d 20 74 68 65 20 69 6e 70 75 74 20 62  from the input b
2cf50 75 66 66 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  uffer..*/.static
2cf60 20 69 6e 74 20 66 74 73 35 44 65 63 6f 64 65 44   int fts5DecodeD
2cf70 6f 63 6c 69 73 74 28 69 6e 74 20 2a 70 52 63 2c  oclist(int *pRc,
2cf80 20 46 74 73 35 42 75 66 66 65 72 20 2a 70 42 75   Fts5Buffer *pBu
2cf90 66 2c 20 63 6f 6e 73 74 20 75 38 20 2a 61 2c 20  f, const u8 *a, 
2cfa0 69 6e 74 20 6e 29 7b 0a 20 20 69 36 34 20 69 44  int n){.  i64 iD
2cfb0 6f 63 69 64 20 3d 20 30 3b 0a 20 20 69 6e 74 20  ocid = 0;.  int 
2cfc0 69 4f 66 66 20 3d 20 30 3b 0a 0a 20 20 69 66 28  iOff = 0;..  if(
2cfd0 20 6e 3e 30 20 29 7b 0a 20 20 20 20 69 4f 66 66   n>0 ){.    iOff
2cfe0 20 3d 20 73 71 6c 69 74 65 33 46 74 73 35 47 65   = sqlite3Fts5Ge
2cff0 74 56 61 72 69 6e 74 28 61 2c 20 28 75 36 34 2a  tVarint(a, (u64*
2d000 29 26 69 44 6f 63 69 64 29 3b 0a 20 20 20 20 73  )&iDocid);.    s
2d010 71 6c 69 74 65 33 46 74 73 35 42 75 66 66 65 72  qlite3Fts5Buffer
2d020 41 70 70 65 6e 64 50 72 69 6e 74 66 28 70 52 63  AppendPrintf(pRc
2d030 2c 20 70 42 75 66 2c 20 22 20 69 64 3d 25 6c 6c  , pBuf, " id=%ll
2d040 64 22 2c 20 69 44 6f 63 69 64 29 3b 0a 20 20 7d  d", iDocid);.  }
2d050 0a 20 20 77 68 69 6c 65 28 20 69 4f 66 66 3c 6e  .  while( iOff<n
2d060 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 50 6f 73   ){.    int nPos
2d070 3b 0a 20 20 20 20 69 6e 74 20 62 44 65 6c 3b 0a  ;.    int bDel;.
2d080 20 20 20 20 69 4f 66 66 20 2b 3d 20 66 74 73 35      iOff += fts5
2d090 47 65 74 50 6f 73 6c 69 73 74 53 69 7a 65 28 26  GetPoslistSize(&
2d0a0 61 5b 69 4f 66 66 5d 2c 20 26 6e 50 6f 73 2c 20  a[iOff], &nPos, 
2d0b0 26 62 44 65 6c 29 3b 0a 20 20 20 20 73 71 6c 69  &bDel);.    sqli
2d0c0 74 65 33 46 74 73 35 42 75 66 66 65 72 41 70 70  te3Fts5BufferApp
2d0d0 65 6e 64 50 72 69 6e 74 66 28 70 52 63 2c 20 70  endPrintf(pRc, p
2d0e0 42 75 66 2c 20 22 20 6e 50 6f 73 3d 25 64 25 73  Buf, " nPos=%d%s
2d0f0 22 2c 20 6e 50 6f 73 2c 20 62 44 65 6c 3f 22 2a  ", nPos, bDel?"*
2d100 22 3a 22 22 29 3b 0a 20 20 20 20 69 4f 66 66 20  ":"");.    iOff 
2d110 2b 3d 20 66 74 73 35 44 65 63 6f 64 65 50 6f 73  += fts5DecodePos
2d120 6c 69 73 74 28 70 52 63 2c 20 70 42 75 66 2c 20  list(pRc, pBuf, 
2d130 26 61 5b 69 4f 66 66 5d 2c 20 4d 49 4e 28 6e 2d  &a[iOff], MIN(n-
2d140 69 4f 66 66 2c 20 6e 50 6f 73 29 29 3b 0a 20 20  iOff, nPos));.  
2d150 20 20 69 66 28 20 69 4f 66 66 3c 6e 20 29 7b 0a    if( iOff<n ){.
2d160 20 20 20 20 20 20 69 36 34 20 69 44 65 6c 74 61        i64 iDelta
2d170 3b 0a 20 20 20 20 20 20 69 4f 66 66 20 2b 3d 20  ;.      iOff += 
2d180 73 71 6c 69 74 65 33 46 74 73 35 47 65 74 56 61  sqlite3Fts5GetVa
2d190 72 69 6e 74 28 26 61 5b 69 4f 66 66 5d 2c 20 28  rint(&a[iOff], (
2d1a0 75 36 34 2a 29 26 69 44 65 6c 74 61 29 3b 0a 20  u64*)&iDelta);. 
2d1b0 20 20 20 20 20 69 44 6f 63 69 64 20 2b 3d 20 69       iDocid += i
2d1c0 44 65 6c 74 61 3b 0a 20 20 20 20 20 20 73 71 6c  Delta;.      sql
2d1d0 69 74 65 33 46 74 73 35 42 75 66 66 65 72 41 70  ite3Fts5BufferAp
2d1e0 70 65 6e 64 50 72 69 6e 74 66 28 70 52 63 2c 20  pendPrintf(pRc, 
2d1f0 70 42 75 66 2c 20 22 20 69 64 3d 25 6c 6c 64 22  pBuf, " id=%lld"
2d200 2c 20 69 44 6f 63 69 64 29 3b 0a 20 20 20 20 7d  , iDocid);.    }
2d210 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 69  .  }..  return i
2d220 4f 66 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  Off;.}../*.** Th
2d230 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  e implementation
2d240 20 6f 66 20 75 73 65 72 2d 64 65 66 69 6e 65 64   of user-defined
2d250 20 73 63 61 6c 61 72 20 66 75 6e 63 74 69 6f 6e   scalar function
2d260 20 66 74 73 35 5f 64 65 63 6f 64 65 28 29 2e 0a   fts5_decode()..
2d270 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
2d280 74 73 35 44 65 63 6f 64 65 46 75 6e 63 74 69 6f  ts5DecodeFunctio
2d290 6e 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e  n(.  sqlite3_con
2d2a0 74 65 78 74 20 2a 70 43 74 78 2c 20 20 20 20 20  text *pCtx,     
2d2b0 20 20 20 20 20 2f 2a 20 46 75 6e 63 74 69 6f 6e       /* Function
2d2c0 20 63 61 6c 6c 20 63 6f 6e 74 65 78 74 20 2a 2f   call context */
2d2d0 0a 20 20 69 6e 74 20 6e 41 72 67 2c 20 20 20 20  .  int nArg,    
2d2e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d2f0 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
2d300 61 72 67 73 20 28 61 6c 77 61 79 73 20 32 29 20  args (always 2) 
2d310 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c  */.  sqlite3_val
2d320 75 65 20 2a 2a 61 70 56 61 6c 20 20 20 20 20 20  ue **apVal      
2d330 20 20 20 20 20 2f 2a 20 46 75 6e 63 74 69 6f 6e       /* Function
2d340 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b   arguments */.){
2d350 0a 20 20 69 36 34 20 69 52 6f 77 69 64 3b 20 20  .  i64 iRowid;  
2d360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d370 20 20 20 2f 2a 20 52 6f 77 69 64 20 66 6f 72 20     /* Rowid for 
2d380 72 65 63 6f 72 64 20 62 65 69 6e 67 20 64 65 63  record being dec
2d390 6f 64 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69 53  oded */.  int iS
2d3a0 65 67 69 64 2c 69 48 65 69 67 68 74 2c 69 50 67  egid,iHeight,iPg
2d3b0 6e 6f 2c 62 44 6c 69 64 78 3b 2f 2a 20 52 6f 77  no,bDlidx;/* Row
2d3c0 69 64 20 63 6f 6d 70 6f 6e 65 6e 74 73 20 2a 2f  id components */
2d3d0 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 61 42 6c  .  const u8 *aBl
2d3e0 6f 62 3b 20 69 6e 74 20 6e 3b 20 20 20 20 20 20  ob; int n;      
2d3f0 20 20 20 2f 2a 20 52 65 63 6f 72 64 20 74 6f 20     /* Record to 
2d400 64 65 63 6f 64 65 20 2a 2f 0a 20 20 75 38 20 2a  decode */.  u8 *
2d410 61 20 3d 20 30 3b 0a 20 20 46 74 73 35 42 75 66  a = 0;.  Fts5Buf
2d420 66 65 72 20 73 3b 20 20 20 20 20 20 20 20 20 20  fer s;          
2d430 20 20 20 20 20 20 20 20 20 2f 2a 20 42 75 69 6c           /* Buil
2d440 64 20 75 70 20 74 65 78 74 20 74 6f 20 72 65 74  d up text to ret
2d450 75 72 6e 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e  urn here */.  in
2d460 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
2d470 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
2d480 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
2d490 20 20 69 6e 74 20 6e 53 70 61 63 65 20 3d 20 30    int nSpace = 0
2d4a0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 6e 41 72  ;..  assert( nAr
2d4b0 67 3d 3d 32 20 29 3b 0a 20 20 6d 65 6d 73 65 74  g==2 );.  memset
2d4c0 28 26 73 2c 20 30 2c 20 73 69 7a 65 6f 66 28 46  (&s, 0, sizeof(F
2d4d0 74 73 35 42 75 66 66 65 72 29 29 3b 0a 20 20 69  ts5Buffer));.  i
2d4e0 52 6f 77 69 64 20 3d 20 73 71 6c 69 74 65 33 5f  Rowid = sqlite3_
2d4f0 76 61 6c 75 65 5f 69 6e 74 36 34 28 61 70 56 61  value_int64(apVa
2d500 6c 5b 30 5d 29 3b 0a 0a 20 20 2f 2a 20 4d 61 6b  l[0]);..  /* Mak
2d510 65 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20  e a copy of the 
2d520 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20  second argument 
2d530 28 61 20 62 6c 6f 62 29 20 69 6e 20 61 42 6c 6f  (a blob) in aBlo
2d540 62 5b 5d 2e 20 54 68 65 20 61 42 6c 6f 62 5b 5d  b[]. The aBlob[]
2d550 0a 20 20 2a 2a 20 63 6f 70 79 20 69 73 20 66 6f  .  ** copy is fo
2d560 6c 6c 6f 77 65 64 20 62 79 20 46 54 53 35 5f 44  llowed by FTS5_D
2d570 41 54 41 5f 5a 45 52 4f 5f 50 41 44 44 49 4e 47  ATA_ZERO_PADDING
2d580 20 30 78 30 30 20 62 79 74 65 73 2c 20 77 68 69   0x00 bytes, whi
2d590 63 68 20 70 72 65 76 65 6e 74 73 0a 20 20 2a 2a  ch prevents.  **
2d5a0 20 62 75 66 66 65 72 20 6f 76 65 72 72 65 61 64   buffer overread
2d5b0 73 20 65 76 65 6e 20 69 66 20 74 68 65 20 72 65  s even if the re
2d5c0 63 6f 72 64 20 69 73 20 63 6f 72 72 75 70 74 2e  cord is corrupt.
2d5d0 20 20 2a 2f 0a 20 20 6e 20 3d 20 73 71 6c 69 74    */.  n = sqlit
2d5e0 65 33 5f 76 61 6c 75 65 5f 62 79 74 65 73 28 61  e3_value_bytes(a
2d5f0 70 56 61 6c 5b 31 5d 29 3b 0a 20 20 61 42 6c 6f  pVal[1]);.  aBlo
2d600 62 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  b = sqlite3_valu
2d610 65 5f 62 6c 6f 62 28 61 70 56 61 6c 5b 31 5d 29  e_blob(apVal[1])
2d620 3b 0a 20 20 6e 53 70 61 63 65 20 3d 20 6e 20 2b  ;.  nSpace = n +
2d630 20 46 54 53 35 5f 44 41 54 41 5f 5a 45 52 4f 5f   FTS5_DATA_ZERO_
2d640 50 41 44 44 49 4e 47 3b 0a 20 20 61 20 3d 20 28  PADDING;.  a = (
2d650 75 38 2a 29 73 71 6c 69 74 65 33 46 74 73 35 4d  u8*)sqlite3Fts5M
2d660 61 6c 6c 6f 63 5a 65 72 6f 28 26 72 63 2c 20 6e  allocZero(&rc, n
2d670 53 70 61 63 65 29 3b 0a 20 20 69 66 28 20 61 3d  Space);.  if( a=
2d680 3d 30 20 29 20 67 6f 74 6f 20 64 65 63 6f 64 65  =0 ) goto decode
2d690 5f 6f 75 74 3b 0a 20 20 6d 65 6d 63 70 79 28 61  _out;.  memcpy(a
2d6a0 2c 20 61 42 6c 6f 62 2c 20 6e 29 3b 0a 0a 0a 20  , aBlob, n);... 
2d6b0 20 66 74 73 35 44 65 63 6f 64 65 52 6f 77 69 64   fts5DecodeRowid
2d6c0 28 69 52 6f 77 69 64 2c 20 26 69 53 65 67 69 64  (iRowid, &iSegid
2d6d0 2c 20 26 62 44 6c 69 64 78 2c 20 26 69 48 65 69  , &bDlidx, &iHei
2d6e0 67 68 74 2c 20 26 69 50 67 6e 6f 29 3b 0a 0a 20  ght, &iPgno);.. 
2d6f0 20 66 74 73 35 44 65 62 75 67 52 6f 77 69 64 28   fts5DebugRowid(
2d700 26 72 63 2c 20 26 73 2c 20 69 52 6f 77 69 64 29  &rc, &s, iRowid)
2d710 3b 0a 20 20 69 66 28 20 62 44 6c 69 64 78 20 29  ;.  if( bDlidx )
2d720 7b 0a 20 20 20 20 46 74 73 35 44 61 74 61 20 64  {.    Fts5Data d
2d730 6c 69 64 78 3b 0a 20 20 20 20 46 74 73 35 44 6c  lidx;.    Fts5Dl
2d740 69 64 78 4c 76 6c 20 6c 76 6c 3b 0a 0a 20 20 20  idxLvl lvl;..   
2d750 20 64 6c 69 64 78 2e 70 20 3d 20 61 3b 0a 20 20   dlidx.p = a;.  
2d760 20 20 64 6c 69 64 78 2e 6e 6e 20 3d 20 6e 3b 0a    dlidx.nn = n;.
2d770 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 6c 76 6c  .    memset(&lvl
2d780 2c 20 30 2c 20 73 69 7a 65 6f 66 28 46 74 73 35  , 0, sizeof(Fts5
2d790 44 6c 69 64 78 4c 76 6c 29 29 3b 0a 20 20 20 20  DlidxLvl));.    
2d7a0 6c 76 6c 2e 70 44 61 74 61 20 3d 20 26 64 6c 69  lvl.pData = &dli
2d7b0 64 78 3b 0a 20 20 20 20 6c 76 6c 2e 69 4c 65 61  dx;.    lvl.iLea
2d7c0 66 50 67 6e 6f 20 3d 20 69 50 67 6e 6f 3b 0a 0a  fPgno = iPgno;..
2d7d0 20 20 20 20 66 6f 72 28 66 74 73 35 44 6c 69 64      for(fts5Dlid
2d7e0 78 4c 76 6c 4e 65 78 74 28 26 6c 76 6c 29 3b 20  xLvlNext(&lvl); 
2d7f0 6c 76 6c 2e 62 45 6f 66 3d 3d 30 3b 20 66 74 73  lvl.bEof==0; fts
2d800 35 44 6c 69 64 78 4c 76 6c 4e 65 78 74 28 26 6c  5DlidxLvlNext(&l
2d810 76 6c 29 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  vl)){.      sqli
2d820 74 65 33 46 74 73 35 42 75 66 66 65 72 41 70 70  te3Fts5BufferApp
2d830 65 6e 64 50 72 69 6e 74 66 28 26 72 63 2c 20 26  endPrintf(&rc, &
2d840 73 2c 20 0a 20 20 20 20 20 20 20 20 20 20 22 20  s, .          " 
2d850 25 64 28 25 6c 6c 64 29 22 2c 20 6c 76 6c 2e 69  %d(%lld)", lvl.i
2d860 4c 65 61 66 50 67 6e 6f 2c 20 6c 76 6c 2e 69 52  LeafPgno, lvl.iR
2d870 6f 77 69 64 0a 20 20 20 20 20 20 29 3b 0a 20 20  owid.      );.  
2d880 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20    }.  }else if( 
2d890 69 53 65 67 69 64 3d 3d 30 20 29 7b 0a 20 20 20  iSegid==0 ){.   
2d8a0 20 69 66 28 20 69 52 6f 77 69 64 3d 3d 46 54 53   if( iRowid==FTS
2d8b0 35 5f 41 56 45 52 41 47 45 53 5f 52 4f 57 49 44  5_AVERAGES_ROWID
2d8c0 20 29 7b 0a 20 20 20 20 20 20 66 74 73 35 44 65   ){.      fts5De
2d8d0 63 6f 64 65 41 76 65 72 61 67 65 73 28 26 72 63  codeAverages(&rc
2d8e0 2c 20 26 73 2c 20 61 2c 20 6e 29 3b 0a 20 20 20  , &s, a, n);.   
2d8f0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 66 74   }else{.      ft
2d900 73 35 44 65 63 6f 64 65 53 74 72 75 63 74 75 72  s5DecodeStructur
2d910 65 28 26 72 63 2c 20 26 73 2c 20 61 2c 20 6e 29  e(&rc, &s, a, n)
2d920 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b  ;.    }.  }else{
2d930 0a 20 20 20 20 46 74 73 35 42 75 66 66 65 72 20  .    Fts5Buffer 
2d940 74 65 72 6d 3b 20 20 20 20 20 20 20 20 20 20 20  term;           
2d950 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 74 65     /* Current te
2d960 72 6d 20 72 65 61 64 20 66 72 6f 6d 20 70 61 67  rm read from pag
2d970 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 73 7a 4c  e */.    int szL
2d980 65 61 66 3b 20 20 20 20 20 20 20 20 20 20 20 20  eaf;            
2d990 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74         /* Offset
2d9a0 20 6f 66 20 70 67 69 64 78 20 69 6e 20 61 5b 5d   of pgidx in a[]
2d9b0 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 50 67 69   */.    int iPgi
2d9c0 64 78 4f 66 66 3b 0a 20 20 20 20 69 6e 74 20 69  dxOff;.    int i
2d9d0 50 67 69 64 78 50 72 65 76 20 3d 20 30 3b 20 20  PgidxPrev = 0;  
2d9e0 20 20 20 20 20 20 20 20 20 2f 2a 20 50 72 65 76           /* Prev
2d9f0 69 6f 75 73 20 76 61 6c 75 65 20 72 65 61 64 20  ious value read 
2da00 66 72 6f 6d 20 70 67 69 64 78 20 2a 2f 0a 20 20  from pgidx */.  
2da10 20 20 69 6e 74 20 69 54 65 72 6d 4f 66 66 20 3d    int iTermOff =
2da20 20 30 3b 0a 20 20 20 20 69 6e 74 20 69 52 6f 77   0;.    int iRow
2da30 69 64 4f 66 66 20 3d 20 30 3b 0a 20 20 20 20 69  idOff = 0;.    i
2da40 6e 74 20 69 4f 66 66 3b 0a 20 20 20 20 69 6e 74  nt iOff;.    int
2da50 20 6e 44 6f 63 6c 69 73 74 3b 0a 0a 20 20 20 20   nDoclist;..    
2da60 6d 65 6d 73 65 74 28 26 74 65 72 6d 2c 20 30 2c  memset(&term, 0,
2da70 20 73 69 7a 65 6f 66 28 46 74 73 35 42 75 66 66   sizeof(Fts5Buff
2da80 65 72 29 29 3b 0a 0a 20 20 20 20 69 66 28 20 6e  er));..    if( n
2da90 3c 34 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  <4 ){.      sqli
2daa0 74 65 33 46 74 73 35 42 75 66 66 65 72 53 65 74  te3Fts5BufferSet
2dab0 28 26 72 63 2c 20 26 73 2c 20 37 2c 20 28 63 6f  (&rc, &s, 7, (co
2dac0 6e 73 74 20 75 38 2a 29 22 63 6f 72 72 75 70 74  nst u8*)"corrupt
2dad0 22 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 64  ");.      goto d
2dae0 65 63 6f 64 65 5f 6f 75 74 3b 0a 20 20 20 20 7d  ecode_out;.    }
2daf0 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 52 6f 77  else{.      iRow
2db00 69 64 4f 66 66 20 3d 20 66 74 73 35 47 65 74 55  idOff = fts5GetU
2db10 31 36 28 26 61 5b 30 5d 29 3b 0a 20 20 20 20 20  16(&a[0]);.     
2db20 20 69 50 67 69 64 78 4f 66 66 20 3d 20 73 7a 4c   iPgidxOff = szL
2db30 65 61 66 20 3d 20 66 74 73 35 47 65 74 55 31 36  eaf = fts5GetU16
2db40 28 26 61 5b 32 5d 29 3b 0a 20 20 20 20 20 20 69  (&a[2]);.      i
2db50 66 28 20 69 50 67 69 64 78 4f 66 66 3c 6e 20 29  f( iPgidxOff<n )
2db60 7b 0a 20 20 20 20 20 20 20 20 66 74 73 35 47 65  {.        fts5Ge
2db70 74 56 61 72 69 6e 74 33 32 28 26 61 5b 69 50 67  tVarint32(&a[iPg
2db80 69 64 78 4f 66 66 5d 2c 20 69 54 65 72 6d 4f 66  idxOff], iTermOf
2db90 66 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  f);.      }.    
2dba0 7d 0a 0a 20 20 20 20 2f 2a 20 44 65 63 6f 64 65  }..    /* Decode
2dbb0 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 20 6c 69   the position li
2dbc0 73 74 20 74 61 69 6c 20 61 74 20 74 68 65 20 73  st tail at the s
2dbd0 74 61 72 74 20 6f 66 20 74 68 65 20 70 61 67 65  tart of the page
2dbe0 20 2a 2f 0a 20 20 20 20 69 66 28 20 69 52 6f 77   */.    if( iRow
2dbf0 69 64 4f 66 66 21 3d 30 20 29 7b 0a 20 20 20 20  idOff!=0 ){.    
2dc00 20 20 69 4f 66 66 20 3d 20 69 52 6f 77 69 64 4f    iOff = iRowidO
2dc10 66 66 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  ff;.    }else if
2dc20 28 20 69 54 65 72 6d 4f 66 66 21 3d 30 20 29 7b  ( iTermOff!=0 ){
2dc30 0a 20 20 20 20 20 20 69 4f 66 66 20 3d 20 69 54  .      iOff = iT
2dc40 65 72 6d 4f 66 66 3b 0a 20 20 20 20 7d 65 6c 73  ermOff;.    }els
2dc50 65 7b 0a 20 20 20 20 20 20 69 4f 66 66 20 3d 20  e{.      iOff = 
2dc60 73 7a 4c 65 61 66 3b 0a 20 20 20 20 7d 0a 20 20  szLeaf;.    }.  
2dc70 20 20 66 74 73 35 44 65 63 6f 64 65 50 6f 73 6c    fts5DecodePosl
2dc80 69 73 74 28 26 72 63 2c 20 26 73 2c 20 26 61 5b  ist(&rc, &s, &a[
2dc90 34 5d 2c 20 69 4f 66 66 2d 34 29 3b 0a 0a 20 20  4], iOff-4);..  
2dca0 20 20 2f 2a 20 44 65 63 6f 64 65 20 61 6e 79 20    /* Decode any 
2dcb0 6d 6f 72 65 20 64 6f 63 6c 69 73 74 20 64 61 74  more doclist dat
2dcc0 61 20 74 68 61 74 20 61 70 70 65 61 72 73 20 6f  a that appears o
2dcd0 6e 20 74 68 65 20 70 61 67 65 20 62 65 66 6f 72  n the page befor
2dce0 65 20 74 68 65 0a 20 20 20 20 2a 2a 20 66 69 72  e the.    ** fir
2dcf0 73 74 20 74 65 72 6d 2e 20 2a 2f 0a 20 20 20 20  st term. */.    
2dd00 6e 44 6f 63 6c 69 73 74 20 3d 20 28 69 54 65 72  nDoclist = (iTer
2dd10 6d 4f 66 66 20 3f 20 69 54 65 72 6d 4f 66 66 20  mOff ? iTermOff 
2dd20 3a 20 73 7a 4c 65 61 66 29 20 2d 20 69 4f 66 66  : szLeaf) - iOff
2dd30 3b 0a 20 20 20 20 66 74 73 35 44 65 63 6f 64 65  ;.    fts5Decode
2dd40 44 6f 63 6c 69 73 74 28 26 72 63 2c 20 26 73 2c  Doclist(&rc, &s,
2dd50 20 26 61 5b 69 4f 66 66 5d 2c 20 6e 44 6f 63 6c   &a[iOff], nDocl
2dd60 69 73 74 29 3b 0a 0a 20 20 20 20 77 68 69 6c 65  ist);..    while
2dd70 28 20 69 50 67 69 64 78 4f 66 66 3c 6e 20 29 7b  ( iPgidxOff<n ){
2dd80 0a 20 20 20 20 20 20 69 6e 74 20 62 46 69 72 73  .      int bFirs
2dd90 74 20 3d 20 28 69 50 67 69 64 78 4f 66 66 3d 3d  t = (iPgidxOff==
2dda0 73 7a 4c 65 61 66 29 3b 20 20 20 20 20 2f 2a 20  szLeaf);     /* 
2ddb0 54 72 75 65 20 66 6f 72 20 66 69 72 73 74 20 74  True for first t
2ddc0 65 72 6d 20 6f 6e 20 70 61 67 65 20 2a 2f 0a 20  erm on page */. 
2ddd0 20 20 20 20 20 69 6e 74 20 6e 42 79 74 65 3b 20       int nByte; 
2dde0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ddf0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79             /* By
2de00 74 65 73 20 6f 66 20 64 61 74 61 20 2a 2f 0a 20  tes of data */. 
2de10 20 20 20 20 20 69 6e 74 20 69 45 6e 64 3b 0a 20       int iEnd;. 
2de20 20 20 20 20 20 0a 20 20 20 20 20 20 69 50 67 69       .      iPgi
2de30 64 78 4f 66 66 20 2b 3d 20 66 74 73 35 47 65 74  dxOff += fts5Get
2de40 56 61 72 69 6e 74 33 32 28 26 61 5b 69 50 67 69  Varint32(&a[iPgi
2de50 64 78 4f 66 66 5d 2c 20 6e 42 79 74 65 29 3b 0a  dxOff], nByte);.
2de60 20 20 20 20 20 20 69 50 67 69 64 78 50 72 65 76        iPgidxPrev
2de70 20 2b 3d 20 6e 42 79 74 65 3b 0a 20 20 20 20 20   += nByte;.     
2de80 20 69 4f 66 66 20 3d 20 69 50 67 69 64 78 50 72   iOff = iPgidxPr
2de90 65 76 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 69  ev;..      if( i
2dea0 50 67 69 64 78 4f 66 66 3c 6e 20 29 7b 0a 20 20  PgidxOff<n ){.  
2deb0 20 20 20 20 20 20 66 74 73 35 47 65 74 56 61 72        fts5GetVar
2dec0 69 6e 74 33 32 28 26 61 5b 69 50 67 69 64 78 4f  int32(&a[iPgidxO
2ded0 66 66 5d 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20  ff], nByte);.   
2dee0 20 20 20 20 20 69 45 6e 64 20 3d 20 69 50 67 69       iEnd = iPgi
2def0 64 78 50 72 65 76 20 2b 20 6e 42 79 74 65 3b 0a  dxPrev + nByte;.
2df00 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
2df10 20 20 20 20 20 69 45 6e 64 20 3d 20 73 7a 4c 65       iEnd = szLe
2df20 61 66 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  af;.      }..   
2df30 20 20 20 69 66 28 20 62 46 69 72 73 74 3d 3d 30     if( bFirst==0
2df40 20 29 7b 0a 20 20 20 20 20 20 20 20 69 4f 66 66   ){.        iOff
2df50 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e   += fts5GetVarin
2df60 74 33 32 28 26 61 5b 69 4f 66 66 5d 2c 20 6e 42  t32(&a[iOff], nB
2df70 79 74 65 29 3b 0a 20 20 20 20 20 20 20 20 74 65  yte);.        te
2df80 72 6d 2e 6e 20 3d 20 6e 42 79 74 65 3b 0a 20 20  rm.n = nByte;.  
2df90 20 20 20 20 7d 0a 20 20 20 20 20 20 69 4f 66 66      }.      iOff
2dfa0 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e   += fts5GetVarin
2dfb0 74 33 32 28 26 61 5b 69 4f 66 66 5d 2c 20 6e 42  t32(&a[iOff], nB
2dfc0 79 74 65 29 3b 0a 20 20 20 20 20 20 66 74 73 35  yte);.      fts5
2dfd0 42 75 66 66 65 72 41 70 70 65 6e 64 42 6c 6f 62  BufferAppendBlob
2dfe0 28 26 72 63 2c 20 26 74 65 72 6d 2c 20 6e 42 79  (&rc, &term, nBy
2dff0 74 65 2c 20 26 61 5b 69 4f 66 66 5d 29 3b 0a 20  te, &a[iOff]);. 
2e000 20 20 20 20 20 69 4f 66 66 20 2b 3d 20 6e 42 79       iOff += nBy
2e010 74 65 3b 0a 0a 20 20 20 20 20 20 73 71 6c 69 74  te;..      sqlit
2e020 65 33 46 74 73 35 42 75 66 66 65 72 41 70 70 65  e3Fts5BufferAppe
2e030 6e 64 50 72 69 6e 74 66 28 0a 20 20 20 20 20 20  ndPrintf(.      
2e040 20 20 20 20 26 72 63 2c 20 26 73 2c 20 22 20 74      &rc, &s, " t
2e050 65 72 6d 3d 25 2e 2a 73 22 2c 20 74 65 72 6d 2e  erm=%.*s", term.
2e060 6e 2c 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29  n, (const char*)
2e070 74 65 72 6d 2e 70 0a 20 20 20 20 20 20 29 3b 0a  term.p.      );.
2e080 20 20 20 20 20 20 69 4f 66 66 20 2b 3d 20 66 74        iOff += ft
2e090 73 35 44 65 63 6f 64 65 44 6f 63 6c 69 73 74 28  s5DecodeDoclist(
2e0a0 26 72 63 2c 20 26 73 2c 20 26 61 5b 69 4f 66 66  &rc, &s, &a[iOff
2e0b0 5d 2c 20 69 45 6e 64 2d 69 4f 66 66 29 3b 0a 20  ], iEnd-iOff);. 
2e0c0 20 20 20 7d 0a 0a 20 20 20 20 66 74 73 35 42 75     }..    fts5Bu
2e0d0 66 66 65 72 46 72 65 65 28 26 74 65 72 6d 29 3b  fferFree(&term);
2e0e0 0a 20 20 7d 0a 20 20 0a 20 64 65 63 6f 64 65 5f  .  }.  . decode_
2e0f0 6f 75 74 3a 0a 20 20 73 71 6c 69 74 65 33 5f 66  out:.  sqlite3_f
2e100 72 65 65 28 61 29 3b 0a 20 20 69 66 28 20 72 63  ree(a);.  if( rc
2e110 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
2e120 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
2e130 74 5f 74 65 78 74 28 70 43 74 78 2c 20 28 63 6f  t_text(pCtx, (co
2e140 6e 73 74 20 63 68 61 72 2a 29 73 2e 70 2c 20 73  nst char*)s.p, s
2e150 2e 6e 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53  .n, SQLITE_TRANS
2e160 49 45 4e 54 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  IENT);.  }else{.
2e170 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
2e180 6c 74 5f 65 72 72 6f 72 5f 63 6f 64 65 28 70 43  lt_error_code(pC
2e190 74 78 2c 20 72 63 29 3b 0a 20 20 7d 0a 20 20 66  tx, rc);.  }.  f
2e1a0 74 73 35 42 75 66 66 65 72 46 72 65 65 28 26 73  ts5BufferFree(&s
2e1b0 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  );.}../*.** The 
2e1c0 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f  implementation o
2e1d0 66 20 75 73 65 72 2d 64 65 66 69 6e 65 64 20 73  f user-defined s
2e1e0 63 61 6c 61 72 20 66 75 6e 63 74 69 6f 6e 20 66  calar function f
2e1f0 74 73 35 5f 72 6f 77 69 64 28 29 2e 0a 2a 2f 0a  ts5_rowid()..*/.
2e200 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
2e210 52 6f 77 69 64 46 75 6e 63 74 69 6f 6e 28 0a 20  RowidFunction(. 
2e220 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74   sqlite3_context
2e230 20 2a 70 43 74 78 2c 20 20 20 20 20 20 20 20 20   *pCtx,         
2e240 20 2f 2a 20 46 75 6e 63 74 69 6f 6e 20 63 61 6c   /* Function cal
2e250 6c 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 69  l context */.  i
2e260 6e 74 20 6e 41 72 67 2c 20 20 20 20 20 20 20 20  nt nArg,        
2e270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2e280 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 73  * Number of args
2e290 20 28 61 6c 77 61 79 73 20 32 29 20 2a 2f 0a 20   (always 2) */. 
2e2a0 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
2e2b0 2a 61 70 56 61 6c 20 20 20 20 20 20 20 20 20 20  *apVal          
2e2c0 20 2f 2a 20 46 75 6e 63 74 69 6f 6e 20 61 72 67   /* Function arg
2e2d0 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 63  uments */.){.  c
2e2e0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41 72 67 3b  onst char *zArg;
2e2f0 0a 20 20 69 66 28 20 6e 41 72 67 3d 3d 30 20 29  .  if( nArg==0 )
2e300 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65  {.    sqlite3_re
2e310 73 75 6c 74 5f 65 72 72 6f 72 28 70 43 74 78 2c  sult_error(pCtx,
2e320 20 22 73 68 6f 75 6c 64 20 62 65 3a 20 66 74 73   "should be: fts
2e330 35 5f 72 6f 77 69 64 28 73 75 62 6a 65 63 74 2c  5_rowid(subject,
2e340 20 2e 2e 2e 2e 29 22 2c 20 2d 31 29 3b 0a 20 20   ....)", -1);.  
2e350 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 41 72 67 20  }else{.    zArg 
2e360 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73  = (const char*)s
2e370 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78  qlite3_value_tex
2e380 74 28 61 70 56 61 6c 5b 30 5d 29 3b 0a 20 20 20  t(apVal[0]);.   
2e390 20 69 66 28 20 30 3d 3d 73 71 6c 69 74 65 33 5f   if( 0==sqlite3_
2e3a0 73 74 72 69 63 6d 70 28 7a 41 72 67 2c 20 22 73  stricmp(zArg, "s
2e3b0 65 67 6d 65 6e 74 22 29 20 29 7b 0a 20 20 20 20  egment") ){.    
2e3c0 20 20 69 36 34 20 69 52 6f 77 69 64 3b 0a 20 20    i64 iRowid;.  
2e3d0 20 20 20 20 69 6e 74 20 73 65 67 69 64 2c 20 70      int segid, p
2e3e0 67 6e 6f 3b 0a 20 20 20 20 20 20 69 66 28 20 6e  gno;.      if( n
2e3f0 41 72 67 21 3d 33 20 29 7b 0a 20 20 20 20 20 20  Arg!=3 ){.      
2e400 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
2e410 5f 65 72 72 6f 72 28 70 43 74 78 2c 20 0a 20 20  _error(pCtx, .  
2e420 20 20 20 20 20 20 20 20 20 20 22 73 68 6f 75 6c            "shoul
2e430 64 20 62 65 3a 20 66 74 73 35 5f 72 6f 77 69 64  d be: fts5_rowid
2e440 28 27 73 65 67 6d 65 6e 74 27 2c 20 73 65 67 69  ('segment', segi
2e450 64 2c 20 70 67 6e 6f 29 29 22 2c 20 2d 31 0a 20  d, pgno))", -1. 
2e460 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20         );.      
2e470 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
2e480 65 67 69 64 20 3d 20 73 71 6c 69 74 65 33 5f 76  egid = sqlite3_v
2e490 61 6c 75 65 5f 69 6e 74 28 61 70 56 61 6c 5b 31  alue_int(apVal[1
2e4a0 5d 29 3b 0a 20 20 20 20 20 20 20 20 70 67 6e 6f  ]);.        pgno
2e4b0 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65   = sqlite3_value
2e4c0 5f 69 6e 74 28 61 70 56 61 6c 5b 32 5d 29 3b 0a  _int(apVal[2]);.
2e4d0 20 20 20 20 20 20 20 20 69 52 6f 77 69 64 20 3d          iRowid =
2e4e0 20 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f 52 4f   FTS5_SEGMENT_RO
2e4f0 57 49 44 28 73 65 67 69 64 2c 20 70 67 6e 6f 29  WID(segid, pgno)
2e500 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
2e510 33 5f 72 65 73 75 6c 74 5f 69 6e 74 36 34 28 70  3_result_int64(p
2e520 43 74 78 2c 20 69 52 6f 77 69 64 29 3b 0a 20 20  Ctx, iRowid);.  
2e530 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b      }.    }else{
2e540 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72  .      sqlite3_r
2e550 65 73 75 6c 74 5f 65 72 72 6f 72 28 70 43 74 78  esult_error(pCtx
2e560 2c 20 0a 20 20 20 20 20 20 20 20 22 66 69 72 73  , .        "firs
2e570 74 20 61 72 67 20 74 6f 20 66 74 73 35 5f 72 6f  t arg to fts5_ro
2e580 77 69 64 28 29 20 6d 75 73 74 20 62 65 20 27 73  wid() must be 's
2e590 65 67 6d 65 6e 74 27 22 20 2c 20 2d 31 0a 20 20  egment'" , -1.  
2e5a0 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d      );.    }.  }
2e5b0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69  .}../*.** This i
2e5c0 73 20 63 61 6c 6c 65 64 20 61 73 20 70 61 72 74  s called as part
2e5d0 20 6f 66 20 72 65 67 69 73 74 65 72 69 6e 67 20   of registering 
2e5e0 74 68 65 20 46 54 53 35 20 6d 6f 64 75 6c 65 20  the FTS5 module 
2e5f0 77 69 74 68 20 64 61 74 61 62 61 73 65 0a 2a 2a  with database.**
2e600 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 64 62 2e 20   connection db. 
2e610 49 74 20 72 65 67 69 73 74 65 72 73 20 73 65 76  It registers sev
2e620 65 72 61 6c 20 75 73 65 72 2d 64 65 66 69 6e 65  eral user-define
2e630 64 20 73 63 61 6c 61 72 20 66 75 6e 63 74 69 6f  d scalar functio
2e640 6e 73 20 75 73 65 66 75 6c 0a 2a 2a 20 77 69 74  ns useful.** wit
2e650 68 20 46 54 53 35 2e 0a 2a 2a 0a 2a 2a 20 49 66  h FTS5..**.** If
2e660 20 73 75 63 63 65 73 73 66 75 6c 2c 20 53 51 4c   successful, SQL
2e670 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
2e680 65 64 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20  ed. If an error 
2e690 6f 63 63 75 72 73 2c 20 73 6f 6d 65 20 6f 74 68  occurs, some oth
2e6a0 65 72 0a 2a 2a 20 53 51 4c 69 74 65 20 65 72 72  er.** SQLite err
2e6b0 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72  or code is retur
2e6c0 6e 65 64 20 69 6e 73 74 65 61 64 2e 0a 2a 2f 0a  ned instead..*/.
2e6d0 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 49  int sqlite3Fts5I
2e6e0 6e 64 65 78 49 6e 69 74 28 73 71 6c 69 74 65 33  ndexInit(sqlite3
2e6f0 20 2a 64 62 29 7b 0a 20 20 69 6e 74 20 72 63 20   *db){.  int rc 
2e700 3d 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65  = sqlite3_create
2e710 5f 66 75 6e 63 74 69 6f 6e 28 0a 20 20 20 20 20  _function(.     
2e720 20 64 62 2c 20 22 66 74 73 35 5f 64 65 63 6f 64   db, "fts5_decod
2e730 65 22 2c 20 32 2c 20 53 51 4c 49 54 45 5f 55 54  e", 2, SQLITE_UT
2e740 46 38 2c 20 30 2c 20 66 74 73 35 44 65 63 6f 64  F8, 0, fts5Decod
2e750 65 46 75 6e 63 74 69 6f 6e 2c 20 30 2c 20 30 0a  eFunction, 0, 0.
2e760 20 20 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53    );.  if( rc==S
2e770 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2e780 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 63 72 65  rc = sqlite3_cre
2e790 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 0a 20 20  ate_function(.  
2e7a0 20 20 20 20 20 20 64 62 2c 20 22 66 74 73 35 5f        db, "fts5_
2e7b0 72 6f 77 69 64 22 2c 20 2d 31 2c 20 53 51 4c 49  rowid", -1, SQLI
2e7c0 54 45 5f 55 54 46 38 2c 20 30 2c 20 66 74 73 35  TE_UTF8, 0, fts5
2e7d0 52 6f 77 69 64 46 75 6e 63 74 69 6f 6e 2c 20 30  RowidFunction, 0
2e7e0 2c 20 30 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 20  , 0.    );.  }. 
2e7f0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a      return rc;.}..