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

Artifact 12354c3871dc0e84621449ab52e8dc26ada82294:


0000: 2f 2a 0a 2a 2a 20 32 30 31 34 20 4d 61 79 20 33  /*.** 2014 May 3
0010: 31 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74 68  1.**.** The auth
0020: 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f 70  or disclaims cop
0030: 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20 73  yright to this s
0040: 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e 20  ource code.  In 
0050: 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c 65  place of.** a le
0060: 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72 65  gal notice, here
0070: 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a 0a   is a blessing:.
0080: 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f 75  **.**    May you
0090: 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f 74   do good and not
00a0: 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61 79   evil..**    May
00b0: 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69 76   you find forgiv
00c0: 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73 65  eness for yourse
00d0: 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20 6f  lf and forgive o
00e0: 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61 79  thers..**    May
00f0: 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65 6c   you share freel
0100: 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67 20  y, never taking 
0110: 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67 69  more than you gi
0120: 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ve..**.*********
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 4c 6f 77 20  *****.**.** Low 
0180: 6c 65 76 65 6c 20 61 63 63 65 73 73 20 74 6f 20  level access to 
0190: 74 68 65 20 46 54 53 20 69 6e 64 65 78 20 73 74  the FTS index st
01a0: 6f 72 65 64 20 69 6e 20 74 68 65 20 64 61 74 61  ored in the data
01b0: 62 61 73 65 20 66 69 6c 65 2e 20 54 68 65 20 0a  base file. The .
01c0: 2a 2a 20 72 6f 75 74 69 6e 65 73 20 69 6e 20 74  ** routines in t
01d0: 68 69 73 20 66 69 6c 65 20 66 69 6c 65 20 69 6d  his file file im
01e0: 70 6c 65 6d 65 6e 74 20 61 6c 6c 20 72 65 61 64  plement all read
01f0: 20 61 6e 64 20 77 72 69 74 65 20 61 63 63 65 73   and write acces
0200: 73 20 74 6f 20 74 68 65 0a 2a 2a 20 25 5f 64 61  s to the.** %_da
0210: 74 61 20 74 61 62 6c 65 2e 20 4f 74 68 65 72 20  ta table. Other 
0220: 70 61 72 74 73 20 6f 66 20 74 68 65 20 73 79 73  parts of the sys
0230: 74 65 6d 20 61 63 63 65 73 73 20 74 68 69 73 20  tem access this 
0240: 66 75 6e 63 74 69 6f 6e 61 6c 69 74 79 20 76 69  functionality vi
0250: 61 0a 2a 2a 20 74 68 65 20 69 6e 74 65 72 66 61  a.** the interfa
0260: 63 65 20 64 65 66 69 6e 65 64 20 69 6e 20 66 74  ce defined in ft
0270: 73 35 49 6e 74 2e 68 2e 0a 2a 2f 0a 0a 0a 23 69  s5Int.h..*/...#i
0280: 6e 63 6c 75 64 65 20 22 66 74 73 35 49 6e 74 2e  nclude "fts5Int.
0290: 68 22 0a 0a 2f 2a 0a 2a 2a 20 4f 76 65 72 76 69  h"../*.** Overvi
02a0: 65 77 3a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 25 5f  ew:.**.** The %_
02b0: 64 61 74 61 20 74 61 62 6c 65 20 63 6f 6e 74 61  data table conta
02c0: 69 6e 73 20 61 6c 6c 20 74 68 65 20 46 54 53 20  ins all the FTS 
02d0: 69 6e 64 65 78 65 73 20 66 6f 72 20 61 6e 20 46  indexes for an F
02e0: 54 53 35 20 76 69 72 74 75 61 6c 20 74 61 62 6c  TS5 virtual tabl
02f0: 65 2e 0a 2a 2a 20 41 73 20 77 65 6c 6c 20 61 73  e..** As well as
0300: 20 74 68 65 20 6d 61 69 6e 20 74 65 72 6d 20 69   the main term i
0310: 6e 64 65 78 2c 20 74 68 65 72 65 20 6d 61 79 20  ndex, there may 
0320: 62 65 20 75 70 20 74 6f 20 33 31 20 70 72 65 66  be up to 31 pref
0330: 69 78 20 69 6e 64 65 78 65 73 2e 0a 2a 2a 20 54  ix indexes..** T
0340: 68 65 20 66 6f 72 6d 61 74 20 69 73 20 73 69 6d  he format is sim
0350: 69 6c 61 72 20 74 6f 20 46 54 53 33 2f 34 2c 20  ilar to FTS3/4, 
0360: 65 78 63 65 70 74 20 74 68 61 74 3a 0a 2a 2a 0a  except that:.**.
0370: 2a 2a 20 20 20 2a 20 61 6c 6c 20 73 65 67 6d 65  **   * all segme
0380: 6e 74 20 62 2d 74 72 65 65 20 6c 65 61 66 20 64  nt b-tree leaf d
0390: 61 74 61 20 69 73 20 73 74 6f 72 65 64 20 69 6e  ata is stored in
03a0: 20 66 69 78 65 64 20 73 69 7a 65 20 70 61 67 65   fixed size page
03b0: 20 72 65 63 6f 72 64 73 20 0a 2a 2a 20 20 20 20   records .**    
03c0: 20 28 65 2e 67 2e 20 31 30 30 30 20 62 79 74 65   (e.g. 1000 byte
03d0: 73 29 2e 20 41 20 73 69 6e 67 6c 65 20 64 6f 63  s). A single doc
03e0: 6c 69 73 74 20 6d 61 79 20 73 70 61 6e 20 6d 75  list may span mu
03f0: 6c 74 69 70 6c 65 20 70 61 67 65 73 2e 20 43 61  ltiple pages. Ca
0400: 72 65 20 69 73 20 0a 2a 2a 20 20 20 20 20 74 61  re is .**     ta
0410: 6b 65 6e 20 74 6f 20 65 6e 73 75 72 65 20 69 74  ken to ensure it
0420: 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74 6f 20   is possible to 
0430: 69 74 65 72 61 74 65 20 69 6e 20 65 69 74 68 65  iterate in eithe
0440: 72 20 64 69 72 65 63 74 69 6f 6e 20 74 68 72 6f  r direction thro
0450: 75 67 68 20 0a 2a 2a 20 20 20 20 20 74 68 65 20  ugh .**     the 
0460: 65 6e 74 72 69 65 73 20 69 6e 20 61 20 64 6f 63  entries in a doc
0470: 6c 69 73 74 2c 20 6f 72 20 74 6f 20 73 65 65 6b  list, or to seek
0480: 20 74 6f 20 61 20 73 70 65 63 69 66 69 63 20 65   to a specific e
0490: 6e 74 72 79 20 77 69 74 68 69 6e 20 61 20 0a 2a  ntry within a .*
04a0: 2a 20 20 20 20 20 64 6f 63 6c 69 73 74 2c 20 77  *     doclist, w
04b0: 69 74 68 6f 75 74 20 6c 6f 61 64 69 6e 67 20 69  ithout loading i
04c0: 74 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 2e 0a 2a  t into memory..*
04d0: 2a 0a 2a 2a 20 20 20 2a 20 6c 61 72 67 65 20 64  *.**   * large d
04e0: 6f 63 6c 69 73 74 73 20 74 68 61 74 20 73 70 61  oclists that spa
04f0: 6e 20 6d 61 6e 79 20 70 61 67 65 73 20 68 61 76  n many pages hav
0500: 65 20 61 73 73 6f 63 69 61 74 65 64 20 22 64 6f  e associated "do
0510: 63 6c 69 73 74 20 69 6e 64 65 78 22 0a 2a 2a 20  clist index".** 
0520: 20 20 20 20 72 65 63 6f 72 64 73 20 74 68 61 74      records that
0530: 20 63 6f 6e 74 61 69 6e 20 61 20 63 6f 70 79 20   contain a copy 
0540: 6f 66 20 74 68 65 20 66 69 72 73 74 20 72 6f 77  of the first row
0550: 69 64 20 6f 6e 20 65 61 63 68 20 70 61 67 65 20  id on each page 
0560: 73 70 61 6e 6e 65 64 20 62 79 0a 2a 2a 20 20 20  spanned by.**   
0570: 20 20 74 68 65 20 64 6f 63 6c 69 73 74 2e 20 54    the doclist. T
0580: 68 69 73 20 69 73 20 75 73 65 64 20 74 6f 20 73  his is used to s
0590: 70 65 65 64 20 75 70 20 73 65 65 6b 20 6f 70 65  peed up seek ope
05a0: 72 61 74 69 6f 6e 73 2c 20 61 6e 64 20 6d 65 72  rations, and mer
05b0: 67 65 73 20 6f 66 0a 2a 2a 20 20 20 20 20 6c 61  ges of.**     la
05c0: 72 67 65 20 64 6f 63 6c 69 73 74 73 20 77 69 74  rge doclists wit
05d0: 68 20 76 65 72 79 20 73 6d 61 6c 6c 20 64 6f 63  h very small doc
05e0: 6c 69 73 74 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a  lists..**.**   *
05f0: 20 65 78 74 72 61 20 66 69 65 6c 64 73 20 69 6e   extra fields in
0600: 20 74 68 65 20 22 73 74 72 75 63 74 75 72 65 20   the "structure 
0610: 72 65 63 6f 72 64 22 20 72 65 63 6f 72 64 20 74  record" record t
0620: 68 65 20 73 74 61 74 65 20 6f 66 20 6f 6e 67 6f  he state of ongo
0630: 69 6e 67 0a 2a 2a 20 20 20 20 20 69 6e 63 72 65  ing.**     incre
0640: 6d 65 6e 74 61 6c 20 6d 65 72 67 65 20 6f 70 65  mental merge ope
0650: 72 61 74 69 6f 6e 73 2e 0a 2a 2a 0a 2a 2f 0a 0a  rations..**.*/..
0660: 0a 23 64 65 66 69 6e 65 20 46 54 53 35 5f 4f 50  .#define FTS5_OP
0670: 54 5f 57 4f 52 4b 5f 55 4e 49 54 20 20 31 30 30  T_WORK_UNIT  100
0680: 30 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20  0  /* Number of 
0690: 6c 65 61 66 20 70 61 67 65 73 20 70 65 72 20 6f  leaf pages per o
06a0: 70 74 69 6d 69 7a 65 20 73 74 65 70 20 2a 2f 0a  ptimize step */.
06b0: 23 64 65 66 69 6e 65 20 46 54 53 35 5f 57 4f 52  #define FTS5_WOR
06c0: 4b 5f 55 4e 49 54 20 20 20 20 20 20 36 34 20 20  K_UNIT      64  
06d0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6c    /* Number of l
06e0: 65 61 66 20 70 61 67 65 73 20 69 6e 20 75 6e 69  eaf pages in uni
06f0: 74 20 6f 66 20 77 6f 72 6b 20 2a 2f 0a 0a 23 64  t of work */..#d
0700: 65 66 69 6e 65 20 46 54 53 35 5f 4d 49 4e 5f 44  efine FTS5_MIN_D
0710: 4c 49 44 58 5f 53 49 5a 45 20 34 20 20 20 20 20  LIDX_SIZE 4     
0720: 2f 2a 20 41 64 64 20 64 6c 69 64 78 20 69 66 20  /* Add dlidx if 
0730: 74 68 69 73 20 6d 61 6e 79 20 65 6d 70 74 79 20  this many empty 
0740: 70 61 67 65 73 20 2a 2f 0a 0a 23 64 65 66 69 6e  pages */..#defin
0750: 65 20 46 54 53 35 5f 4d 41 49 4e 5f 50 52 45 46  e FTS5_MAIN_PREF
0760: 49 58 20 27 30 27 0a 0a 23 69 66 20 46 54 53 35  IX '0'..#if FTS5
0770: 5f 4d 41 58 5f 50 52 45 46 49 58 5f 49 4e 44 45  _MAX_PREFIX_INDE
0780: 58 45 53 20 3e 20 33 31 0a 23 20 65 72 72 6f 72  XES > 31.# error
0790: 20 22 46 54 53 35 5f 4d 41 58 5f 50 52 45 46 49   "FTS5_MAX_PREFI
07a0: 58 5f 49 4e 44 45 58 45 53 20 69 73 20 74 6f 6f  X_INDEXES is too
07b0: 20 6c 61 72 67 65 22 0a 23 65 6e 64 69 66 0a 0a   large".#endif..
07c0: 2f 2a 0a 2a 2a 20 44 65 74 61 69 6c 73 3a 0a 2a  /*.** Details:.*
07d0: 2a 0a 2a 2a 20 54 68 65 20 25 5f 64 61 74 61 20  *.** The %_data 
07e0: 74 61 62 6c 65 20 6d 61 6e 61 67 65 64 20 62 79  table managed by
07f0: 20 74 68 69 73 20 6d 6f 64 75 6c 65 2c 0a 2a 2a   this module,.**
0800: 0a 2a 2a 20 20 20 20 20 43 52 45 41 54 45 20 54  .**     CREATE T
0810: 41 42 4c 45 20 25 5f 64 61 74 61 28 69 64 20 49  ABLE %_data(id I
0820: 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b  NTEGER PRIMARY K
0830: 45 59 2c 20 62 6c 6f 63 6b 20 42 4c 4f 42 29 3b  EY, block BLOB);
0840: 0a 2a 2a 0a 2a 2a 20 2c 20 63 6f 6e 74 61 69 6e  .**.** , contain
0850: 73 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  s the following 
0860: 35 20 74 79 70 65 73 20 6f 66 20 72 65 63 6f 72  5 types of recor
0870: 64 73 2e 20 53 65 65 20 74 68 65 20 63 6f 6d 6d  ds. See the comm
0880: 65 6e 74 73 20 73 75 72 72 6f 75 6e 64 69 6e 67  ents surrounding
0890: 0a 2a 2a 20 74 68 65 20 46 54 53 35 5f 2a 5f 52  .** the FTS5_*_R
08a0: 4f 57 49 44 20 6d 61 63 72 6f 73 20 62 65 6c 6f  OWID macros belo
08b0: 77 20 66 6f 72 20 61 20 64 65 73 63 72 69 70 74  w for a descript
08c0: 69 6f 6e 20 6f 66 20 68 6f 77 20 25 5f 64 61 74  ion of how %_dat
08d0: 61 20 72 6f 77 69 64 73 20 61 72 65 20 0a 2a 2a  a rowids are .**
08e0: 20 61 73 73 69 67 6e 65 64 20 74 6f 20 65 61 63   assigned to eac
08f0: 68 20 66 6f 20 74 68 65 6d 2e 0a 2a 2a 0a 2a 2a  h fo them..**.**
0900: 20 31 2e 20 53 74 72 75 63 74 75 72 65 20 52 65   1. Structure Re
0910: 63 6f 72 64 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 54  cords:.**.**   T
0920: 68 65 20 73 65 74 20 6f 66 20 73 65 67 6d 65 6e  he set of segmen
0930: 74 73 20 74 68 61 74 20 6d 61 6b 65 20 75 70 20  ts that make up 
0940: 61 6e 20 69 6e 64 65 78 20 2d 20 74 68 65 20 69  an index - the i
0950: 6e 64 65 78 20 73 74 72 75 63 74 75 72 65 20 2d  ndex structure -
0960: 20 61 72 65 0a 2a 2a 20 20 20 72 65 63 6f 72 64   are.**   record
0970: 65 64 20 69 6e 20 61 20 73 69 6e 67 6c 65 20 72  ed in a single r
0980: 65 63 6f 72 64 20 77 69 74 68 69 6e 20 74 68 65  ecord within the
0990: 20 25 5f 64 61 74 61 20 74 61 62 6c 65 2e 20 54   %_data table. T
09a0: 68 65 20 72 65 63 6f 72 64 20 63 6f 6e 73 69 73  he record consis
09b0: 74 73 0a 2a 2a 20 20 20 6f 66 20 61 20 73 69 6e  ts.**   of a sin
09c0: 67 6c 65 20 33 32 2d 62 69 74 20 63 6f 6e 66 69  gle 32-bit confi
09d0: 67 75 72 61 74 69 6f 6e 20 63 6f 6f 6b 69 65 20  guration cookie 
09e0: 76 61 6c 75 65 20 66 6f 6c 6c 6f 77 65 64 20 62  value followed b
09f0: 79 20 61 20 6c 69 73 74 20 6f 66 20 0a 2a 2a 20  y a list of .** 
0a00: 20 20 53 51 4c 69 74 65 20 76 61 72 69 6e 74 73    SQLite varints
0a10: 2e 20 49 66 20 74 68 65 20 46 54 53 20 74 61 62  . If the FTS tab
0a20: 6c 65 20 66 65 61 74 75 72 65 73 20 6d 6f 72 65  le features more
0a30: 20 74 68 61 6e 20 6f 6e 65 20 69 6e 64 65 78 20   than one index 
0a40: 28 62 65 63 61 75 73 65 0a 2a 2a 20 20 20 74 68  (because.**   th
0a50: 65 72 65 20 61 72 65 20 6f 6e 65 20 6f 72 20 6d  ere are one or m
0a60: 6f 72 65 20 70 72 65 66 69 78 20 69 6e 64 65 78  ore prefix index
0a70: 65 73 29 2c 20 69 74 20 69 73 20 67 75 61 72 61  es), it is guara
0a80: 6e 74 65 65 64 20 74 68 61 74 20 61 6c 6c 20 73  nteed that all s
0a90: 68 61 72 65 0a 2a 2a 20 20 20 74 68 65 20 73 61  hare.**   the sa
0aa0: 6d 65 20 63 6f 6f 6b 69 65 20 76 61 6c 75 65 2e  me cookie value.
0ab0: 0a 2a 2a 0a 2a 2a 20 20 20 49 6d 6d 65 64 69 61  .**.**   Immedia
0ac0: 74 65 6c 79 20 66 6f 6c 6c 6f 77 69 6e 67 20 74  tely following t
0ad0: 68 65 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e  he configuration
0ae0: 20 63 6f 6f 6b 69 65 2c 20 74 68 65 20 72 65 63   cookie, the rec
0af0: 6f 72 64 20 62 65 67 69 6e 73 20 77 69 74 68 0a  ord begins with.
0b00: 2a 2a 20 20 20 74 68 72 65 65 20 76 61 72 69 6e  **   three varin
0b10: 74 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2b 20  ts:.**.**     + 
0b20: 6e 75 6d 62 65 72 20 6f 66 20 6c 65 76 65 6c 73  number of levels
0b30: 2c 0a 2a 2a 20 20 20 20 20 2b 20 74 6f 74 61 6c  ,.**     + total
0b40: 20 6e 75 6d 62 65 72 20 6f 66 20 73 65 67 6d 65   number of segme
0b50: 6e 74 73 20 6f 6e 20 61 6c 6c 20 6c 65 76 65 6c  nts on all level
0b60: 73 2c 0a 2a 2a 20 20 20 20 20 2b 20 76 61 6c 75  s,.**     + valu
0b70: 65 20 6f 66 20 77 72 69 74 65 20 63 6f 75 6e 74  e of write count
0b80: 65 72 2e 0a 2a 2a 0a 2a 2a 20 20 20 54 68 65 6e  er..**.**   Then
0b90: 2c 20 66 6f 72 20 65 61 63 68 20 6c 65 76 65 6c  , for each level
0ba0: 20 66 72 6f 6d 20 30 20 74 6f 20 6e 4d 61 78 3a   from 0 to nMax:
0bb0: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2b 20 6e 75 6d  .**.**     + num
0bc0: 62 65 72 20 6f 66 20 69 6e 70 75 74 20 73 65 67  ber of input seg
0bd0: 6d 65 6e 74 73 20 69 6e 20 6f 6e 67 6f 69 6e 67  ments in ongoing
0be0: 20 6d 65 72 67 65 2e 0a 2a 2a 20 20 20 20 20 2b   merge..**     +
0bf0: 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66   total number of
0c00: 20 73 65 67 6d 65 6e 74 73 20 69 6e 20 6c 65 76   segments in lev
0c10: 65 6c 2e 0a 2a 2a 20 20 20 20 20 2b 20 66 6f 72  el..**     + for
0c20: 20 65 61 63 68 20 73 65 67 6d 65 6e 74 20 66 72   each segment fr
0c30: 6f 6d 20 6f 6c 64 65 73 74 20 74 6f 20 6e 65 77  om oldest to new
0c40: 65 73 74 3a 0a 2a 2a 20 20 20 20 20 20 20 20 20  est:.**         
0c50: 2b 20 73 65 67 6d 65 6e 74 20 69 64 20 28 61 6c  + segment id (al
0c60: 77 61 79 73 20 3e 20 30 29 0a 2a 2a 20 20 20 20  ways > 0).**    
0c70: 20 20 20 20 20 2b 20 66 69 72 73 74 20 6c 65 61       + first lea
0c80: 66 20 70 61 67 65 20 6e 75 6d 62 65 72 20 28 6f  f page number (o
0c90: 66 74 65 6e 20 31 2c 20 61 6c 77 61 79 73 20 67  ften 1, always g
0ca0: 72 65 61 74 65 72 20 74 68 61 6e 20 30 29 0a 2a  reater than 0).*
0cb0: 2a 20 20 20 20 20 20 20 20 20 2b 20 66 69 6e 61  *         + fina
0cc0: 6c 20 6c 65 61 66 20 70 61 67 65 20 6e 75 6d 62  l leaf page numb
0cd0: 65 72 0a 2a 2a 0a 2a 2a 20 32 2e 20 54 68 65 20  er.**.** 2. The 
0ce0: 41 76 65 72 61 67 65 73 20 52 65 63 6f 72 64 3a  Averages Record:
0cf0: 0a 2a 2a 0a 2a 2a 20 20 20 41 20 73 69 6e 67 6c  .**.**   A singl
0d00: 65 20 72 65 63 6f 72 64 20 77 69 74 68 69 6e 20  e record within 
0d10: 74 68 65 20 25 5f 64 61 74 61 20 74 61 62 6c 65  the %_data table
0d20: 2e 20 54 68 65 20 64 61 74 61 20 69 73 20 61 20  . The data is a 
0d30: 6c 69 73 74 20 6f 66 20 76 61 72 69 6e 74 73 2e  list of varints.
0d40: 0a 2a 2a 20 20 20 54 68 65 20 66 69 72 73 74 20  .**   The first 
0d50: 76 61 6c 75 65 20 69 73 20 74 68 65 20 6e 75 6d  value is the num
0d60: 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e 20 74  ber of rows in t
0d70: 68 65 20 69 6e 64 65 78 2e 20 54 68 65 6e 2c 20  he index. Then, 
0d80: 66 6f 72 20 65 61 63 68 20 63 6f 6c 75 6d 6e 0a  for each column.
0d90: 2a 2a 20 20 20 66 72 6f 6d 20 6c 65 66 74 20 74  **   from left t
0da0: 6f 20 72 69 67 68 74 2c 20 74 68 65 20 74 6f 74  o right, the tot
0db0: 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 74 6f 6b  al number of tok
0dc0: 65 6e 73 20 69 6e 20 74 68 65 20 63 6f 6c 75 6d  ens in the colum
0dd0: 6e 20 66 6f 72 20 61 6c 6c 0a 2a 2a 20 20 20 72  n for all.**   r
0de0: 6f 77 73 20 6f 66 20 74 68 65 20 74 61 62 6c 65  ows of the table
0df0: 2e 0a 2a 2a 0a 2a 2a 20 33 2e 20 53 65 67 6d 65  ..**.** 3. Segme
0e00: 6e 74 20 6c 65 61 76 65 73 3a 0a 2a 2a 0a 2a 2a  nt leaves:.**.**
0e10: 20 20 20 54 45 52 4d 2f 44 4f 43 4c 49 53 54 20     TERM/DOCLIST 
0e20: 46 4f 52 4d 41 54 3a 0a 2a 2a 0a 2a 2a 20 20 20  FORMAT:.**.**   
0e30: 20 20 4d 6f 73 74 20 6f 66 20 65 61 63 68 20 73    Most of each s
0e40: 65 67 6d 65 6e 74 20 6c 65 61 66 20 69 73 20 74  egment leaf is t
0e50: 61 6b 65 6e 20 75 70 20 62 79 20 74 65 72 6d 2f  aken up by term/
0e60: 64 6f 63 6c 69 73 74 20 64 61 74 61 2e 20 54 68  doclist data. Th
0e70: 65 20 0a 2a 2a 20 20 20 20 20 67 65 6e 65 72 61  e .**     genera
0e80: 6c 20 66 6f 72 6d 61 74 20 6f 66 20 74 65 72 6d  l format of term
0e90: 2f 64 6f 63 6c 69 73 74 2c 20 73 74 61 72 74 69  /doclist, starti
0ea0: 6e 67 20 77 69 74 68 20 74 68 65 20 66 69 72 73  ng with the firs
0eb0: 74 20 74 65 72 6d 0a 2a 2a 20 20 20 20 20 6f 6e  t term.**     on
0ec0: 20 74 68 65 20 6c 65 61 66 20 70 61 67 65 2c 20   the leaf page, 
0ed0: 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20  is:.**.**       
0ee0: 20 20 76 61 72 69 6e 74 20 3a 20 73 69 7a 65 20    varint : size 
0ef0: 6f 66 20 66 69 72 73 74 20 74 65 72 6d 0a 2a 2a  of first term.**
0f00: 20 20 20 20 20 20 20 20 20 62 6c 6f 62 3a 20 20           blob:  
0f10: 20 20 66 69 72 73 74 20 74 65 72 6d 20 64 61 74    first term dat
0f20: 61 0a 2a 2a 20 20 20 20 20 20 20 20 20 64 6f 63  a.**         doc
0f30: 6c 69 73 74 3a 20 66 69 72 73 74 20 64 6f 63 6c  list: first docl
0f40: 69 73 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 7a  ist.**         z
0f50: 65 72 6f 2d 6f 72 2d 6d 6f 72 65 20 7b 0a 2a 2a  ero-or-more {.**
0f60: 20 20 20 20 20 20 20 20 20 20 20 76 61 72 69 6e             varin
0f70: 74 3a 20 20 6e 75 6d 62 65 72 20 6f 66 20 62 79  t:  number of by
0f80: 74 65 73 20 69 6e 20 63 6f 6d 6d 6f 6e 20 77 69  tes in common wi
0f90: 74 68 20 70 72 65 76 69 6f 75 73 20 74 65 72 6d  th previous term
0fa0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 76 61  .**           va
0fb0: 72 69 6e 74 3a 20 20 6e 75 6d 62 65 72 20 6f 66  rint:  number of
0fc0: 20 62 79 74 65 73 20 6f 66 20 6e 65 77 20 74 65   bytes of new te
0fd0: 72 6d 20 64 61 74 61 20 28 6e 4e 65 77 29 0a 2a  rm data (nNew).*
0fe0: 2a 20 20 20 20 20 20 20 20 20 20 20 62 6c 6f 62  *           blob
0ff0: 3a 20 20 20 20 6e 4e 65 77 20 62 79 74 65 73 20  :    nNew bytes 
1000: 6f 66 20 6e 65 77 20 74 65 72 6d 20 64 61 74 61  of new term data
1010: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 64 6f  .**           do
1020: 63 6c 69 73 74 3a 20 6e 65 78 74 20 64 6f 63 6c  clist: next docl
1030: 69 73 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 7d  ist.**         }
1040: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 64 6f 63 6c 69  .**.**     docli
1050: 73 74 20 66 6f 72 6d 61 74 3a 0a 2a 2a 0a 2a 2a  st format:.**.**
1060: 20 20 20 20 20 20 20 20 20 76 61 72 69 6e 74 3a           varint:
1070: 20 20 66 69 72 73 74 20 72 6f 77 69 64 0a 2a 2a    first rowid.**
1080: 20 20 20 20 20 20 20 20 20 70 6f 73 6c 69 73 74           poslist
1090: 3a 20 66 69 72 73 74 20 70 6f 73 6c 69 73 74 0a  : first poslist.
10a0: 2a 2a 20 20 20 20 20 20 20 20 20 7a 65 72 6f 2d  **         zero-
10b0: 6f 72 2d 6d 6f 72 65 20 7b 0a 2a 2a 20 20 20 20  or-more {.**    
10c0: 20 20 20 20 20 20 20 76 61 72 69 6e 74 3a 20 20         varint:  
10d0: 72 6f 77 69 64 20 64 65 6c 74 61 20 28 61 6c 77  rowid delta (alw
10e0: 61 79 73 20 3e 20 30 29 0a 2a 2a 20 20 20 20 20  ays > 0).**     
10f0: 20 20 20 20 20 20 70 6f 73 6c 69 73 74 3a 20 6e        poslist: n
1100: 65 78 74 20 70 6f 73 6c 69 73 74 0a 2a 2a 20 20  ext poslist.**  
1110: 20 20 20 20 20 20 20 7d 0a 2a 2a 0a 2a 2a 20 20         }.**.**  
1120: 20 20 20 70 6f 73 6c 69 73 74 20 66 6f 72 6d 61     poslist forma
1130: 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20  t:.**.**        
1140: 20 76 61 72 69 6e 74 3a 20 73 69 7a 65 20 6f 66   varint: size of
1150: 20 70 6f 73 6c 69 73 74 20 69 6e 20 62 79 74 65   poslist in byte
1160: 73 20 6d 75 6c 74 69 70 6c 69 65 64 20 62 79 20  s multiplied by 
1170: 32 2c 20 6e 6f 74 20 69 6e 63 6c 75 64 69 6e 67  2, not including
1180: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
1190: 20 20 20 20 74 68 69 73 20 66 69 65 6c 64 2e 20      this field. 
11a0: 50 6c 75 73 20 31 20 69 66 20 74 68 69 73 20 65  Plus 1 if this e
11b0: 6e 74 72 79 20 63 61 72 72 69 65 73 20 74 68 65  ntry carries the
11c0: 20 22 64 65 6c 65 74 65 22 20 66 6c 61 67 2e 0a   "delete" flag..
11d0: 2a 2a 20 20 20 20 20 20 20 20 20 63 6f 6c 6c 69  **         colli
11e0: 73 74 3a 20 63 6f 6c 6c 69 73 74 20 66 6f 72 20  st: collist for 
11f0: 63 6f 6c 75 6d 6e 20 30 0a 2a 2a 20 20 20 20 20  column 0.**     
1200: 20 20 20 20 7a 65 72 6f 2d 6f 72 2d 6d 6f 72 65      zero-or-more
1210: 20 7b 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20   {.**           
1220: 30 78 30 31 20 62 79 74 65 0a 2a 2a 20 20 20 20  0x01 byte.**    
1230: 20 20 20 20 20 20 20 76 61 72 69 6e 74 3a 20 63         varint: c
1240: 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20 28 49 29  olumn number (I)
1250: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 63 6f  .**           co
1260: 6c 6c 69 73 74 3a 20 63 6f 6c 6c 69 73 74 20 66  llist: collist f
1270: 6f 72 20 63 6f 6c 75 6d 6e 20 49 0a 2a 2a 20 20  or column I.**  
1280: 20 20 20 20 20 20 20 7d 0a 2a 2a 0a 2a 2a 20 20         }.**.**  
1290: 20 20 20 63 6f 6c 6c 69 73 74 20 66 6f 72 6d 61     collist forma
12a0: 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20  t:.**.**        
12b0: 20 76 61 72 69 6e 74 3a 20 66 69 72 73 74 20 6f   varint: first o
12c0: 66 66 73 65 74 20 2b 20 32 0a 2a 2a 20 20 20 20  ffset + 2.**    
12d0: 20 20 20 20 20 7a 65 72 6f 2d 6f 72 2d 6d 6f 72       zero-or-mor
12e0: 65 20 7b 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  e {.**          
12f0: 20 76 61 72 69 6e 74 3a 20 6f 66 66 73 65 74 20   varint: offset 
1300: 64 65 6c 74 61 20 2b 20 32 0a 2a 2a 20 20 20 20  delta + 2.**    
1310: 20 20 20 20 20 7d 0a 2a 2a 0a 2a 2a 20 20 20 50       }.**.**   P
1320: 41 47 45 20 46 4f 52 4d 41 54 0a 2a 2a 0a 2a 2a  AGE FORMAT.**.**
1330: 20 20 20 20 20 45 61 63 68 20 6c 65 61 66 20 70       Each leaf p
1340: 61 67 65 20 62 65 67 69 6e 73 20 77 69 74 68 20  age begins with 
1350: 61 20 34 2d 62 79 74 65 20 68 65 61 64 65 72 20  a 4-byte header 
1360: 63 6f 6e 74 61 69 6e 69 6e 67 20 32 20 31 36 2d  containing 2 16-
1370: 62 69 74 20 0a 2a 2a 20 20 20 20 20 75 6e 73 69  bit .**     unsi
1380: 67 6e 65 64 20 69 6e 74 65 67 65 72 20 66 69 65  gned integer fie
1390: 6c 64 73 20 69 6e 20 62 69 67 2d 65 6e 64 69 61  lds in big-endia
13a0: 6e 20 66 6f 72 6d 61 74 2e 20 54 68 65 79 20 61  n format. They a
13b0: 72 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20  re:.**.**       
13c0: 2a 20 54 68 65 20 62 79 74 65 20 6f 66 66 73 65  * The byte offse
13d0: 74 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 72  t of the first r
13e0: 6f 77 69 64 20 6f 6e 20 74 68 65 20 70 61 67 65  owid on the page
13f0: 2c 20 69 66 20 69 74 20 65 78 69 73 74 73 0a 2a  , if it exists.*
1400: 2a 20 20 20 20 20 20 20 20 20 61 6e 64 20 6f 63  *         and oc
1410: 63 75 72 73 20 62 65 66 6f 72 65 20 74 68 65 20  curs before the 
1420: 66 69 72 73 74 20 74 65 72 6d 20 28 6f 74 68 65  first term (othe
1430: 72 77 69 73 65 20 30 29 2e 0a 2a 2a 0a 2a 2a 20  rwise 0)..**.** 
1440: 20 20 20 20 20 20 2a 20 54 68 65 20 62 79 74 65        * The byte
1450: 20 6f 66 66 73 65 74 20 6f 66 20 74 68 65 20 73   offset of the s
1460: 74 61 72 74 20 6f 66 20 74 68 65 20 70 61 67 65  tart of the page
1470: 20 66 6f 6f 74 65 72 2e 20 49 66 20 74 68 65 20   footer. If the 
1480: 70 61 67 65 0a 2a 2a 20 20 20 20 20 20 20 20 20  page.**         
1490: 66 6f 6f 74 65 72 20 69 73 20 30 20 62 79 74 65  footer is 0 byte
14a0: 73 20 69 6e 20 73 69 7a 65 2c 20 74 68 65 6e 20  s in size, then 
14b0: 74 68 69 73 20 66 69 65 6c 64 20 69 73 20 74 68  this field is th
14c0: 65 20 73 61 6d 65 20 61 73 20 74 68 65 0a 2a 2a  e same as the.**
14d0: 20 20 20 20 20 20 20 20 20 73 69 7a 65 20 6f 66           size of
14e0: 20 74 68 65 20 6c 65 61 66 20 70 61 67 65 20 69   the leaf page i
14f0: 6e 20 62 79 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 20  n bytes..**.**  
1500: 20 20 20 54 68 65 20 70 61 67 65 20 66 6f 6f 74     The page foot
1510: 65 72 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 61  er consists of a
1520: 20 73 69 6e 67 6c 65 20 76 61 72 69 6e 74 20 66   single varint f
1530: 6f 72 20 65 61 63 68 20 74 65 72 6d 20 6c 6f 63  or each term loc
1540: 61 74 65 64 0a 2a 2a 20 20 20 20 20 6f 6e 20 74  ated.**     on t
1550: 68 65 20 70 61 67 65 2e 20 45 61 63 68 20 76 61  he page. Each va
1560: 72 69 6e 74 20 69 73 20 74 68 65 20 62 79 74 65  rint is the byte
1570: 20 6f 66 66 73 65 74 20 6f 66 20 74 68 65 20 63   offset of the c
1580: 75 72 72 65 6e 74 20 74 65 72 6d 0a 2a 2a 20 20  urrent term.**  
1590: 20 20 20 77 69 74 68 69 6e 20 74 68 65 20 70 61     within the pa
15a0: 67 65 2c 20 64 65 6c 74 61 2d 63 6f 6d 70 72 65  ge, delta-compre
15b0: 73 73 65 64 20 61 67 61 69 6e 73 74 20 74 68 65  ssed against the
15c0: 20 70 72 65 76 69 6f 75 73 20 76 61 6c 75 65 2e   previous value.
15d0: 20 49 6e 0a 2a 2a 20 20 20 20 20 6f 74 68 65 72   In.**     other
15e0: 20 77 6f 72 64 73 2c 20 74 68 65 20 66 69 72 73   words, the firs
15f0: 74 20 76 61 72 69 6e 74 20 69 6e 20 74 68 65 20  t varint in the 
1600: 66 6f 6f 74 65 72 20 69 73 20 74 68 65 20 62 79  footer is the by
1610: 74 65 20 6f 66 66 73 65 74 20 6f 66 0a 2a 2a 20  te offset of.** 
1620: 20 20 20 20 74 68 65 20 66 69 72 73 74 20 74 65      the first te
1630: 72 6d 2c 20 74 68 65 20 73 65 63 6f 6e 64 20 69  rm, the second i
1640: 73 20 74 68 65 20 62 79 74 65 20 6f 66 66 73 65  s the byte offse
1650: 74 20 6f 66 20 74 68 65 20 73 65 63 6f 6e 64 20  t of the second 
1660: 6c 65 73 73 20 74 68 61 74 0a 2a 2a 20 20 20 20  less that.**    
1670: 20 6f 66 20 74 68 65 20 66 69 72 73 74 2c 20 61   of the first, a
1680: 6e 64 20 73 6f 20 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  nd so on..**.** 
1690: 20 20 20 20 54 68 65 20 74 65 72 6d 2f 64 6f 63      The term/doc
16a0: 6c 69 73 74 20 66 6f 72 6d 61 74 20 64 65 73 63  list format desc
16b0: 72 69 62 65 64 20 61 62 6f 76 65 20 69 73 20 61  ribed above is a
16c0: 63 63 75 72 61 74 65 20 69 66 20 74 68 65 20 65  ccurate if the e
16d0: 6e 74 69 72 65 0a 2a 2a 20 20 20 20 20 74 65 72  ntire.**     ter
16e0: 6d 2f 64 6f 63 6c 69 73 74 20 64 61 74 61 20 66  m/doclist data f
16f0: 69 74 73 20 6f 6e 20 61 20 73 69 6e 67 6c 65 20  its on a single 
1700: 6c 65 61 66 20 70 61 67 65 2e 20 49 66 20 74 68  leaf page. If th
1710: 69 73 20 69 73 20 6e 6f 74 20 74 68 65 20 63 61  is is not the ca
1720: 73 65 2c 0a 2a 2a 20 20 20 20 20 74 68 65 20 66  se,.**     the f
1730: 6f 72 6d 61 74 20 69 73 20 63 68 61 6e 67 65 64  ormat is changed
1740: 20 69 6e 20 74 77 6f 20 77 61 79 73 3a 0a 2a 2a   in two ways:.**
1750: 0a 2a 2a 20 20 20 20 20 20 20 2b 20 69 66 20 74  .**       + if t
1760: 68 65 20 66 69 72 73 74 20 72 6f 77 69 64 20 6f  he first rowid o
1770: 6e 20 61 20 70 61 67 65 20 6f 63 63 75 72 73 20  n a page occurs 
1780: 62 65 66 6f 72 65 20 74 68 65 20 66 69 72 73 74  before the first
1790: 20 74 65 72 6d 2c 20 69 74 0a 2a 2a 20 20 20 20   term, it.**    
17a0: 20 20 20 20 20 69 73 20 73 74 6f 72 65 64 20 61       is stored a
17b0: 73 20 61 20 6c 69 74 65 72 61 6c 20 76 61 6c 75  s a literal valu
17c0: 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20  e:.**.**        
17d0: 20 20 20 20 20 76 61 72 69 6e 74 3a 20 20 66 69       varint:  fi
17e0: 72 73 74 20 72 6f 77 69 64 0a 2a 2a 0a 2a 2a 20  rst rowid.**.** 
17f0: 20 20 20 20 20 20 2b 20 74 68 65 20 66 69 72 73        + the firs
1800: 74 20 74 65 72 6d 20 6f 6e 20 65 61 63 68 20 70  t term on each p
1810: 61 67 65 20 69 73 20 73 74 6f 72 65 64 20 69 6e  age is stored in
1820: 20 74 68 65 20 73 61 6d 65 20 77 61 79 20 61 73   the same way as
1830: 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 20   the.**         
1840: 76 65 72 79 20 66 69 72 73 74 20 74 65 72 6d 20  very first term 
1850: 6f 66 20 74 68 65 20 73 65 67 6d 65 6e 74 3a 0a  of the segment:.
1860: 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  **.**           
1870: 20 20 76 61 72 69 6e 74 20 3a 20 73 69 7a 65 20    varint : size 
1880: 6f 66 20 66 69 72 73 74 20 74 65 72 6d 0a 2a 2a  of first term.**
1890: 20 20 20 20 20 20 20 20 20 20 20 20 20 62 6c 6f               blo
18a0: 62 3a 20 20 20 20 66 69 72 73 74 20 74 65 72 6d  b:    first term
18b0: 20 64 61 74 61 0a 2a 2a 0a 2a 2a 20 35 2e 20 53   data.**.** 5. S
18c0: 65 67 6d 65 6e 74 20 64 6f 63 6c 69 73 74 20 69  egment doclist i
18d0: 6e 64 65 78 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  ndexes:.**.**   
18e0: 44 6f 63 6c 69 73 74 20 69 6e 64 65 78 65 73 20  Doclist indexes 
18f0: 61 72 65 20 74 68 65 6d 73 65 6c 76 65 73 20 62  are themselves b
1900: 2d 74 72 65 65 73 2c 20 68 6f 77 65 76 65 72 20  -trees, however 
1910: 74 68 65 79 20 75 73 75 61 6c 6c 79 20 63 6f 6e  they usually con
1920: 73 69 73 74 20 6f 66 0a 2a 2a 20 20 20 61 20 73  sist of.**   a s
1930: 69 6e 67 6c 65 20 6c 65 61 66 20 72 65 63 6f 72  ingle leaf recor
1940: 64 20 6f 6e 6c 79 2e 20 54 68 65 20 66 6f 72 6d  d only. The form
1950: 61 74 20 6f 66 20 65 61 63 68 20 64 6f 63 6c 69  at of each docli
1960: 73 74 20 69 6e 64 65 78 20 6c 65 61 66 20 70 61  st index leaf pa
1970: 67 65 20 0a 2a 2a 20 20 20 69 73 3a 0a 2a 2a 0a  ge .**   is:.**.
1980: 2a 2a 20 20 20 20 20 2a 20 46 6c 61 67 73 20 62  **     * Flags b
1990: 79 74 65 2e 20 42 69 74 73 20 61 72 65 3a 0a 2a  yte. Bits are:.*
19a0: 2a 20 20 20 20 20 20 20 20 20 30 78 30 31 3a 20  *         0x01: 
19b0: 43 6c 65 61 72 20 69 66 20 6c 65 61 66 20 69 73  Clear if leaf is
19c0: 20 61 6c 73 6f 20 74 68 65 20 72 6f 6f 74 20 70   also the root p
19d0: 61 67 65 2c 20 6f 74 68 65 72 77 69 73 65 20 73  age, otherwise s
19e0: 65 74 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 20  et..**.**     * 
19f0: 50 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 66  Page number of f
1a00: 74 73 20 69 6e 64 65 78 20 6c 65 61 66 20 70 61  ts index leaf pa
1a10: 67 65 2e 20 41 73 20 61 20 76 61 72 69 6e 74 2e  ge. As a varint.
1a20: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 20 46 69 72  .**.**     * Fir
1a30: 73 74 20 72 6f 77 69 64 20 6f 6e 20 70 61 67 65  st rowid on page
1a40: 20 69 6e 64 69 63 61 74 65 64 20 62 79 20 70 72   indicated by pr
1a50: 65 76 69 6f 75 73 20 66 69 65 6c 64 2e 20 41 73  evious field. As
1a60: 20 61 20 76 61 72 69 6e 74 2e 0a 2a 2a 0a 2a 2a   a varint..**.**
1a70: 20 20 20 20 20 2a 20 41 20 6c 69 73 74 20 6f 66       * A list of
1a80: 20 76 61 72 69 6e 74 73 2c 20 6f 6e 65 20 66 6f   varints, one fo
1a90: 72 20 65 61 63 68 20 73 75 62 73 65 71 75 65 6e  r each subsequen
1aa0: 74 20 74 65 72 6d 6c 65 73 73 20 70 61 67 65 2e  t termless page.
1ab0: 20 41 20 0a 2a 2a 20 20 20 20 20 20 20 70 6f 73   A .**       pos
1ac0: 69 74 69 76 65 20 64 65 6c 74 61 20 69 66 20 74  itive delta if t
1ad0: 68 65 20 74 65 72 6d 6c 65 73 73 20 70 61 67 65  he termless page
1ae0: 20 63 6f 6e 74 61 69 6e 73 20 61 74 20 6c 65 61   contains at lea
1af0: 73 74 20 6f 6e 65 20 72 6f 77 69 64 2c 20 0a 2a  st one rowid, .*
1b00: 2a 20 20 20 20 20 20 20 6f 72 20 61 6e 20 30 78  *       or an 0x
1b10: 30 30 20 62 79 74 65 20 6f 74 68 65 72 77 69 73  00 byte otherwis
1b20: 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 49 6e 74 65 72  e..**.**   Inter
1b30: 6e 61 6c 20 64 6f 63 6c 69 73 74 20 69 6e 64 65  nal doclist inde
1b40: 78 20 6e 6f 64 65 73 20 61 72 65 3a 0a 2a 2a 0a  x nodes are:.**.
1b50: 2a 2a 20 20 20 20 20 2a 20 46 6c 61 67 73 20 62  **     * Flags b
1b60: 79 74 65 2e 20 42 69 74 73 20 61 72 65 3a 0a 2a  yte. Bits are:.*
1b70: 2a 20 20 20 20 20 20 20 20 20 30 78 30 31 3a 20  *         0x01: 
1b80: 43 6c 65 61 72 20 66 6f 72 20 72 6f 6f 74 20 70  Clear for root p
1b90: 61 67 65 2c 20 6f 74 68 65 72 77 69 73 65 20 73  age, otherwise s
1ba0: 65 74 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 20  et..**.**     * 
1bb0: 50 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 66  Page number of f
1bc0: 69 72 73 74 20 63 68 69 6c 64 20 70 61 67 65 2e  irst child page.
1bd0: 20 41 73 20 61 20 76 61 72 69 6e 74 2e 0a 2a 2a   As a varint..**
1be0: 0a 2a 2a 20 20 20 20 20 2a 20 43 6f 70 79 20 6f  .**     * Copy o
1bf0: 66 20 66 69 72 73 74 20 72 6f 77 69 64 20 6f 6e  f first rowid on
1c00: 20 70 61 67 65 20 69 6e 64 69 63 61 74 65 64 20   page indicated 
1c10: 62 79 20 70 72 65 76 69 6f 75 73 20 66 69 65 6c  by previous fiel
1c20: 64 2e 20 41 73 20 61 20 76 61 72 69 6e 74 2e 0a  d. As a varint..
1c30: 2a 2a 0a 2a 2a 20 20 20 20 20 2a 20 41 20 6c 69  **.**     * A li
1c40: 73 74 20 6f 66 20 64 65 6c 74 61 2d 65 6e 63 6f  st of delta-enco
1c50: 64 65 64 20 76 61 72 69 6e 74 73 20 2d 20 74 68  ded varints - th
1c60: 65 20 66 69 72 73 74 20 72 6f 77 69 64 20 6f 6e  e first rowid on
1c70: 20 65 61 63 68 20 73 75 62 73 65 71 75 65 6e 74   each subsequent
1c80: 0a 2a 2a 20 20 20 20 20 20 20 63 68 69 6c 64 20  .**       child 
1c90: 70 61 67 65 2e 20 0a 2a 2a 0a 2a 2f 0a 0a 2f 2a  page. .**.*/../*
1ca0: 0a 2a 2a 20 52 6f 77 69 64 73 20 66 6f 72 20 74  .** Rowids for t
1cb0: 68 65 20 61 76 65 72 61 67 65 73 20 61 6e 64 20  he averages and 
1cc0: 73 74 72 75 63 74 75 72 65 20 72 65 63 6f 72 64  structure record
1cd0: 73 20 69 6e 20 74 68 65 20 25 5f 64 61 74 61 20  s in the %_data 
1ce0: 74 61 62 6c 65 2e 0a 2a 2f 0a 23 64 65 66 69 6e  table..*/.#defin
1cf0: 65 20 46 54 53 35 5f 41 56 45 52 41 47 45 53 5f  e FTS5_AVERAGES_
1d00: 52 4f 57 49 44 20 20 20 20 20 31 20 20 20 20 2f  ROWID     1    /
1d10: 2a 20 52 6f 77 69 64 20 75 73 65 64 20 66 6f 72  * Rowid used for
1d20: 20 74 68 65 20 61 76 65 72 61 67 65 73 20 72 65   the averages re
1d30: 63 6f 72 64 20 2a 2f 0a 23 64 65 66 69 6e 65 20  cord */.#define 
1d40: 46 54 53 35 5f 53 54 52 55 43 54 55 52 45 5f 52  FTS5_STRUCTURE_R
1d50: 4f 57 49 44 20 20 20 31 30 20 20 20 20 2f 2a 20  OWID   10    /* 
1d60: 54 68 65 20 73 74 72 75 63 74 75 72 65 20 72 65  The structure re
1d70: 63 6f 72 64 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 4d  cord */../*.** M
1d80: 61 63 72 6f 73 20 64 65 74 65 72 6d 69 6e 69 6e  acros determinin
1d90: 67 20 74 68 65 20 72 6f 77 69 64 73 20 75 73 65  g the rowids use
1da0: 64 20 62 79 20 73 65 67 6d 65 6e 74 20 6c 65 61  d by segment lea
1db0: 76 65 73 20 61 6e 64 20 64 6c 69 64 78 20 6c 65  ves and dlidx le
1dc0: 61 76 65 73 0a 2a 2a 20 61 6e 64 20 6e 6f 64 65  aves.** and node
1dd0: 73 2e 20 41 6c 6c 20 6e 6f 64 65 73 20 61 6e 64  s. All nodes and
1de0: 20 6c 65 61 76 65 73 20 61 72 65 20 73 74 6f 72   leaves are stor
1df0: 65 64 20 69 6e 20 74 68 65 20 25 5f 64 61 74 61  ed in the %_data
1e00: 20 74 61 62 6c 65 20 77 69 74 68 20 6c 61 72 67   table with larg
1e10: 65 0a 2a 2a 20 70 6f 73 69 74 69 76 65 20 72 6f  e.** positive ro
1e20: 77 69 64 73 2e 0a 2a 2a 0a 2a 2a 20 45 61 63 68  wids..**.** Each
1e30: 20 73 65 67 6d 65 6e 74 20 68 61 73 20 61 20 75   segment has a u
1e40: 6e 69 71 75 65 20 6e 6f 6e 2d 7a 65 72 6f 20 31  nique non-zero 1
1e50: 36 2d 62 69 74 20 69 64 2e 0a 2a 2a 0a 2a 2a 20  6-bit id..**.** 
1e60: 54 68 65 20 72 6f 77 69 64 20 66 6f 72 20 65 61  The rowid for ea
1e70: 63 68 20 73 65 67 6d 65 6e 74 20 6c 65 61 66 20  ch segment leaf 
1e80: 69 73 20 66 6f 75 6e 64 20 62 79 20 70 61 73 73  is found by pass
1e90: 69 6e 67 20 74 68 65 20 73 65 67 6d 65 6e 74 20  ing the segment 
1ea0: 69 64 20 61 6e 64 20 0a 2a 2a 20 74 68 65 20 6c  id and .** the l
1eb0: 65 61 66 20 70 61 67 65 20 6e 75 6d 62 65 72 20  eaf page number 
1ec0: 74 6f 20 74 68 65 20 46 54 53 35 5f 53 45 47 4d  to the FTS5_SEGM
1ed0: 45 4e 54 5f 52 4f 57 49 44 20 6d 61 63 72 6f 2e  ENT_ROWID macro.
1ee0: 20 4c 65 61 76 65 73 20 61 72 65 20 6e 75 6d 62   Leaves are numb
1ef0: 65 72 65 64 0a 2a 2a 20 73 65 71 75 65 6e 74 69  ered.** sequenti
1f00: 61 6c 6c 79 20 73 74 61 72 74 69 6e 67 20 66 72  ally starting fr
1f10: 6f 6d 20 31 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  om 1..*/.#define
1f20: 20 46 54 53 35 5f 44 41 54 41 5f 49 44 5f 42 20   FTS5_DATA_ID_B 
1f30: 20 20 20 20 31 36 20 20 20 20 20 2f 2a 20 4d 61      16     /* Ma
1f40: 78 20 73 65 67 20 69 64 20 6e 75 6d 62 65 72 20  x seg id number 
1f50: 36 35 35 33 35 20 2a 2f 0a 23 64 65 66 69 6e 65  65535 */.#define
1f60: 20 46 54 53 35 5f 44 41 54 41 5f 44 4c 49 5f 42   FTS5_DATA_DLI_B
1f70: 20 20 20 20 20 31 20 20 20 20 20 2f 2a 20 44 6f       1     /* Do
1f80: 63 6c 69 73 74 2d 69 6e 64 65 78 20 66 6c 61 67  clist-index flag
1f90: 20 28 31 20 62 69 74 29 20 2a 2f 0a 23 64 65 66   (1 bit) */.#def
1fa0: 69 6e 65 20 46 54 53 35 5f 44 41 54 41 5f 48 45  ine FTS5_DATA_HE
1fb0: 49 47 48 54 5f 42 20 20 35 20 20 20 20 20 2f 2a  IGHT_B  5     /*
1fc0: 20 4d 61 78 20 64 6c 69 64 78 20 74 72 65 65 20   Max dlidx tree 
1fd0: 68 65 69 67 68 74 20 6f 66 20 33 32 20 2a 2f 0a  height of 32 */.
1fe0: 23 64 65 66 69 6e 65 20 46 54 53 35 5f 44 41 54  #define FTS5_DAT
1ff0: 41 5f 50 41 47 45 5f 42 20 20 20 33 31 20 20 20  A_PAGE_B   31   
2000: 20 20 2f 2a 20 4d 61 78 20 70 61 67 65 20 6e 75    /* Max page nu
2010: 6d 62 65 72 20 6f 66 20 32 31 34 37 34 38 33 36  mber of 21474836
2020: 34 38 20 2a 2f 0a 0a 23 64 65 66 69 6e 65 20 66  48 */..#define f
2030: 74 73 35 5f 64 72 69 28 73 65 67 69 64 2c 20 64  ts5_dri(segid, d
2040: 6c 69 64 78 2c 20 68 65 69 67 68 74 2c 20 70 67  lidx, height, pg
2050: 6e 6f 29 20 28 20 20 20 20 20 20 20 20 20 20 20  no) (           
2060: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2070: 20 20 20 20 20 20 5c 0a 20 28 28 69 36 34 29 28        \. ((i64)(
2080: 73 65 67 69 64 29 20 20 3c 3c 20 28 46 54 53 35  segid)  << (FTS5
2090: 5f 44 41 54 41 5f 50 41 47 45 5f 42 2b 46 54 53  _DATA_PAGE_B+FTS
20a0: 35 5f 44 41 54 41 5f 48 45 49 47 48 54 5f 42 2b  5_DATA_HEIGHT_B+
20b0: 46 54 53 35 5f 44 41 54 41 5f 44 4c 49 5f 42 29  FTS5_DATA_DLI_B)
20c0: 29 20 2b 20 20 20 20 5c 0a 20 28 28 69 36 34 29  ) +    \. ((i64)
20d0: 28 64 6c 69 64 78 29 20 20 3c 3c 20 28 46 54 53  (dlidx)  << (FTS
20e0: 35 5f 44 41 54 41 5f 50 41 47 45 5f 42 20 2b 20  5_DATA_PAGE_B + 
20f0: 46 54 53 35 5f 44 41 54 41 5f 48 45 49 47 48 54  FTS5_DATA_HEIGHT
2100: 5f 42 29 29 20 2b 20 20 20 20 20 20 20 20 20 20  _B)) +          
2110: 20 20 20 20 20 20 20 20 5c 0a 20 28 28 69 36 34          \. ((i64
2120: 29 28 68 65 69 67 68 74 29 20 3c 3c 20 28 46 54  )(height) << (FT
2130: 53 35 5f 44 41 54 41 5f 50 41 47 45 5f 42 29 29  S5_DATA_PAGE_B))
2140: 20 2b 20 20 20 20 20 20 20 20 20 20 20 20 20 20   +              
2150: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2160: 20 20 20 20 20 20 20 20 20 5c 0a 20 28 28 69 36           \. ((i6
2170: 34 29 28 70 67 6e 6f 29 29 20 20 20 20 20 20 20  4)(pgno))       
2180: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21b0: 20 20 20 20 20 20 20 20 20 20 5c 0a 29 0a 0a 23            \.)..#
21c0: 64 65 66 69 6e 65 20 46 54 53 35 5f 53 45 47 4d  define FTS5_SEGM
21d0: 45 4e 54 5f 52 4f 57 49 44 28 73 65 67 69 64 2c  ENT_ROWID(segid,
21e0: 20 70 67 6e 6f 29 20 20 20 20 20 20 20 66 74 73   pgno)       fts
21f0: 35 5f 64 72 69 28 73 65 67 69 64 2c 20 30 2c 20  5_dri(segid, 0, 
2200: 30 2c 20 70 67 6e 6f 29 0a 23 64 65 66 69 6e 65  0, pgno).#define
2210: 20 46 54 53 35 5f 44 4c 49 44 58 5f 52 4f 57 49   FTS5_DLIDX_ROWI
2220: 44 28 73 65 67 69 64 2c 20 68 65 69 67 68 74 2c  D(segid, height,
2230: 20 70 67 6e 6f 29 20 66 74 73 35 5f 64 72 69 28   pgno) fts5_dri(
2240: 73 65 67 69 64 2c 20 31 2c 20 68 65 69 67 68 74  segid, 1, height
2250: 2c 20 70 67 6e 6f 29 0a 0a 2f 2a 0a 2a 2a 20 4d  , pgno)../*.** M
2260: 61 78 69 6d 75 6d 20 73 65 67 6d 65 6e 74 73 20  aximum segments 
2270: 70 65 72 6d 69 74 74 65 64 20 69 6e 20 61 20 73  permitted in a s
2280: 69 6e 67 6c 65 20 69 6e 64 65 78 20 0a 2a 2f 0a  ingle index .*/.
2290: 23 64 65 66 69 6e 65 20 46 54 53 35 5f 4d 41 58  #define FTS5_MAX
22a0: 5f 53 45 47 4d 45 4e 54 20 32 30 30 30 0a 0a 23  _SEGMENT 2000..#
22b0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
22c0: 55 47 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74  UG.int sqlite3Ft
22d0: 73 35 43 6f 72 72 75 70 74 28 29 20 7b 20 72 65  s5Corrupt() { re
22e0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
22f0: 55 50 54 5f 56 54 41 42 3b 20 7d 0a 23 65 6e 64  UPT_VTAB; }.#end
2300: 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 45 61 63 68 20  if.../*.** Each 
2310: 74 69 6d 65 20 61 20 62 6c 6f 62 20 69 73 20 72  time a blob is r
2320: 65 61 64 20 66 72 6f 6d 20 74 68 65 20 25 5f 64  ead from the %_d
2330: 61 74 61 20 74 61 62 6c 65 2c 20 69 74 20 69 73  ata table, it is
2340: 20 70 61 64 64 65 64 20 77 69 74 68 20 74 68 69   padded with thi
2350: 73 0a 2a 2a 20 6d 61 6e 79 20 7a 65 72 6f 20 62  s.** many zero b
2360: 79 74 65 73 2e 20 54 68 69 73 20 6d 61 6b 65 73  ytes. This makes
2370: 20 69 74 20 65 61 73 69 65 72 20 74 6f 20 64 65   it easier to de
2380: 63 6f 64 65 20 74 68 65 20 76 61 72 69 6f 75 73  code the various
2390: 20 72 65 63 6f 72 64 20 66 6f 72 6d 61 74 73 0a   record formats.
23a0: 2a 2a 20 77 69 74 68 6f 75 74 20 6f 76 65 72 72  ** without overr
23b0: 65 61 64 69 6e 67 20 69 66 20 74 68 65 20 72 65  eading if the re
23c0: 63 6f 72 64 73 20 61 72 65 20 63 6f 72 72 75 70  cords are corrup
23d0: 74 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 46 54  t..*/.#define FT
23e0: 53 35 5f 44 41 54 41 5f 5a 45 52 4f 5f 50 41 44  S5_DATA_ZERO_PAD
23f0: 44 49 4e 47 20 38 0a 23 64 65 66 69 6e 65 20 46  DING 8.#define F
2400: 54 53 35 5f 44 41 54 41 5f 50 41 44 44 49 4e 47  TS5_DATA_PADDING
2410: 20 32 30 0a 0a 74 79 70 65 64 65 66 20 73 74 72   20..typedef str
2420: 75 63 74 20 46 74 73 35 44 61 74 61 20 46 74 73  uct Fts5Data Fts
2430: 35 44 61 74 61 3b 0a 74 79 70 65 64 65 66 20 73  5Data;.typedef s
2440: 74 72 75 63 74 20 46 74 73 35 44 6c 69 64 78 49  truct Fts5DlidxI
2450: 74 65 72 20 46 74 73 35 44 6c 69 64 78 49 74 65  ter Fts5DlidxIte
2460: 72 3b 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  r;.typedef struc
2470: 74 20 46 74 73 35 44 6c 69 64 78 4c 76 6c 20 46  t Fts5DlidxLvl F
2480: 74 73 35 44 6c 69 64 78 4c 76 6c 3b 0a 74 79 70  ts5DlidxLvl;.typ
2490: 65 64 65 66 20 73 74 72 75 63 74 20 46 74 73 35  edef struct Fts5
24a0: 44 6c 69 64 78 57 72 69 74 65 72 20 46 74 73 35  DlidxWriter Fts5
24b0: 44 6c 69 64 78 57 72 69 74 65 72 3b 0a 74 79 70  DlidxWriter;.typ
24c0: 65 64 65 66 20 73 74 72 75 63 74 20 46 74 73 35  edef struct Fts5
24d0: 49 74 65 72 20 46 74 73 35 49 74 65 72 3b 0a 74  Iter Fts5Iter;.t
24e0: 79 70 65 64 65 66 20 73 74 72 75 63 74 20 46 74  ypedef struct Ft
24f0: 73 35 50 61 67 65 57 72 69 74 65 72 20 46 74 73  s5PageWriter Fts
2500: 35 50 61 67 65 57 72 69 74 65 72 3b 0a 74 79 70  5PageWriter;.typ
2510: 65 64 65 66 20 73 74 72 75 63 74 20 46 74 73 35  edef struct Fts5
2520: 53 65 67 49 74 65 72 20 46 74 73 35 53 65 67 49  SegIter Fts5SegI
2530: 74 65 72 3b 0a 74 79 70 65 64 65 66 20 73 74 72  ter;.typedef str
2540: 75 63 74 20 46 74 73 35 44 6f 63 6c 69 73 74 49  uct Fts5DoclistI
2550: 74 65 72 20 46 74 73 35 44 6f 63 6c 69 73 74 49  ter Fts5DoclistI
2560: 74 65 72 3b 0a 74 79 70 65 64 65 66 20 73 74 72  ter;.typedef str
2570: 75 63 74 20 46 74 73 35 53 65 67 57 72 69 74 65  uct Fts5SegWrite
2580: 72 20 46 74 73 35 53 65 67 57 72 69 74 65 72 3b  r Fts5SegWriter;
2590: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
25a0: 46 74 73 35 53 74 72 75 63 74 75 72 65 20 46 74  Fts5Structure Ft
25b0: 73 35 53 74 72 75 63 74 75 72 65 3b 0a 74 79 70  s5Structure;.typ
25c0: 65 64 65 66 20 73 74 72 75 63 74 20 46 74 73 35  edef struct Fts5
25d0: 53 74 72 75 63 74 75 72 65 4c 65 76 65 6c 20 46  StructureLevel F
25e0: 74 73 35 53 74 72 75 63 74 75 72 65 4c 65 76 65  ts5StructureLeve
25f0: 6c 3b 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  l;.typedef struc
2600: 74 20 46 74 73 35 53 74 72 75 63 74 75 72 65 53  t Fts5StructureS
2610: 65 67 6d 65 6e 74 20 46 74 73 35 53 74 72 75 63  egment Fts5Struc
2620: 74 75 72 65 53 65 67 6d 65 6e 74 3b 0a 0a 73 74  tureSegment;..st
2630: 72 75 63 74 20 46 74 73 35 44 61 74 61 20 7b 0a  ruct Fts5Data {.
2640: 20 20 75 38 20 2a 70 3b 20 20 20 20 20 20 20 20    u8 *p;        
2650: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2660: 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
2670: 62 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e  buffer containin
2680: 67 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 69 6e  g record */.  in
2690: 74 20 6e 6e 3b 20 20 20 20 20 20 20 20 20 20 20  t nn;           
26a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
26b0: 20 53 69 7a 65 20 6f 66 20 72 65 63 6f 72 64 20   Size of record 
26c0: 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 69 6e  in bytes */.  in
26d0: 74 20 73 7a 4c 65 61 66 3b 20 20 20 20 20 20 20  t szLeaf;       
26e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
26f0: 20 53 69 7a 65 20 6f 66 20 6c 65 61 66 20 77 69   Size of leaf wi
2700: 74 68 6f 75 74 20 70 61 67 65 2d 69 6e 64 65 78  thout page-index
2710: 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 4f 6e   */.};../*.** On
2720: 65 20 6f 62 6a 65 63 74 20 70 65 72 20 25 5f 64  e object per %_d
2730: 61 74 61 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74  ata table..*/.st
2740: 72 75 63 74 20 46 74 73 35 49 6e 64 65 78 20 7b  ruct Fts5Index {
2750: 0a 20 20 46 74 73 35 43 6f 6e 66 69 67 20 2a 70  .  Fts5Config *p
2760: 43 6f 6e 66 69 67 3b 20 20 20 20 20 20 20 20 20  Config;         
2770: 20 20 20 2f 2a 20 56 69 72 74 75 61 6c 20 74 61     /* Virtual ta
2780: 62 6c 65 20 63 6f 6e 66 69 67 75 72 61 74 69 6f  ble configuratio
2790: 6e 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 44 61  n */.  char *zDa
27a0: 74 61 54 62 6c 3b 20 20 20 20 20 20 20 20 20 20  taTbl;          
27b0: 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
27c0: 66 20 25 5f 64 61 74 61 20 74 61 62 6c 65 20 2a  f %_data table *
27d0: 2f 0a 20 20 69 6e 74 20 6e 57 6f 72 6b 55 6e 69  /.  int nWorkUni
27e0: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
27f0: 20 20 20 20 2f 2a 20 4c 65 61 66 20 70 61 67 65      /* Leaf page
2800: 73 20 69 6e 20 61 20 22 75 6e 69 74 22 20 6f 66  s in a "unit" of
2810: 20 77 6f 72 6b 20 2a 2f 0a 0a 20 20 2f 2a 0a 20   work */..  /*. 
2820: 20 2a 2a 20 56 61 72 69 61 62 6c 65 73 20 72 65   ** Variables re
2830: 6c 61 74 65 64 20 74 6f 20 74 68 65 20 61 63 63  lated to the acc
2840: 75 6d 75 6c 61 74 69 6f 6e 20 6f 66 20 74 6f 6b  umulation of tok
2850: 65 6e 73 20 61 6e 64 20 64 6f 63 6c 69 73 74 73  ens and doclists
2860: 20 77 69 74 68 69 6e 20 74 68 65 0a 20 20 2a 2a   within the.  **
2870: 20 69 6e 2d 6d 65 6d 6f 72 79 20 68 61 73 68 20   in-memory hash 
2880: 74 61 62 6c 65 73 20 62 65 66 6f 72 65 20 74 68  tables before th
2890: 65 79 20 61 72 65 20 66 6c 75 73 68 65 64 20 74  ey are flushed t
28a0: 6f 20 64 69 73 6b 2e 0a 20 20 2a 2f 0a 20 20 46  o disk..  */.  F
28b0: 74 73 35 48 61 73 68 20 2a 70 48 61 73 68 3b 20  ts5Hash *pHash; 
28c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
28d0: 2a 20 48 61 73 68 20 74 61 62 6c 65 20 66 6f 72  * Hash table for
28e0: 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 20   in-memory data 
28f0: 2a 2f 0a 20 20 69 6e 74 20 6e 50 65 6e 64 69 6e  */.  int nPendin
2900: 67 44 61 74 61 3b 20 20 20 20 20 20 20 20 20 20  gData;          
2910: 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20       /* Current 
2920: 62 79 74 65 73 20 6f 66 20 70 65 6e 64 69 6e 67  bytes of pending
2930: 20 64 61 74 61 20 2a 2f 0a 20 20 69 36 34 20 69   data */.  i64 i
2940: 57 72 69 74 65 52 6f 77 69 64 3b 20 20 20 20 20  WriteRowid;     
2950: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f             /* Ro
2960: 77 69 64 20 66 6f 72 20 63 75 72 72 65 6e 74 20  wid for current 
2970: 64 6f 63 20 62 65 69 6e 67 20 77 72 69 74 74 65  doc being writte
2980: 6e 20 2a 2f 0a 20 20 69 6e 74 20 62 44 65 6c 65  n */.  int bDele
2990: 74 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  te;             
29a0: 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e         /* Curren
29b0: 74 20 77 72 69 74 65 20 69 73 20 61 20 64 65 6c  t write is a del
29c0: 65 74 65 20 2a 2f 0a 0a 20 20 2f 2a 20 45 72 72  ete */..  /* Err
29d0: 6f 72 20 73 74 61 74 65 2e 20 2a 2f 0a 20 20 69  or state. */.  i
29e0: 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
29f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2a00: 2a 20 43 75 72 72 65 6e 74 20 65 72 72 6f 72 20  * Current error 
2a10: 63 6f 64 65 20 2a 2f 0a 0a 20 20 2f 2a 20 53 74  code */..  /* St
2a20: 61 74 65 20 75 73 65 64 20 62 79 20 74 68 65 20  ate used by the 
2a30: 66 74 73 35 44 61 74 61 58 58 58 28 29 20 66 75  fts5DataXXX() fu
2a40: 6e 63 74 69 6f 6e 73 2e 20 2a 2f 0a 20 20 73 71  nctions. */.  sq
2a50: 6c 69 74 65 33 5f 62 6c 6f 62 20 2a 70 52 65 61  lite3_blob *pRea
2a60: 64 65 72 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  der;          /*
2a70: 20 52 4f 20 69 6e 63 72 2d 62 6c 6f 62 20 6f 70   RO incr-blob op
2a80: 65 6e 20 6f 6e 20 25 5f 64 61 74 61 20 74 61 62  en on %_data tab
2a90: 6c 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  le */.  sqlite3_
2aa0: 73 74 6d 74 20 2a 70 57 72 69 74 65 72 3b 20 20  stmt *pWriter;  
2ab0: 20 20 20 20 20 20 20 20 2f 2a 20 22 49 4e 53 45          /* "INSE
2ac0: 52 54 20 2e 2e 2e 20 25 5f 64 61 74 61 20 56 41  RT ... %_data VA
2ad0: 4c 55 45 53 28 3f 2c 3f 29 22 20 2a 2f 0a 20 20  LUES(?,?)" */.  
2ae0: 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 44  sqlite3_stmt *pD
2af0: 65 6c 65 74 65 72 3b 20 20 20 20 20 20 20 20 20  eleter;         
2b00: 2f 2a 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20  /* "DELETE FROM 
2b10: 25 5f 64 61 74 61 20 2e 2e 2e 20 69 64 3e 3d 3f  %_data ... id>=?
2b20: 20 41 4e 44 20 69 64 3c 3d 3f 22 20 2a 2f 0a 20   AND id<=?" */. 
2b30: 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
2b40: 49 64 78 57 72 69 74 65 72 3b 20 20 20 20 20 20  IdxWriter;      
2b50: 20 2f 2a 20 22 49 4e 53 45 52 54 20 2e 2e 2e 20   /* "INSERT ... 
2b60: 25 5f 69 64 78 20 56 41 4c 55 45 53 28 3f 2c 3f  %_idx VALUES(?,?
2b70: 2c 3f 2c 3f 29 22 20 2a 2f 0a 20 20 73 71 6c 69  ,?,?)" */.  sqli
2b80: 74 65 33 5f 73 74 6d 74 20 2a 70 49 64 78 44 65  te3_stmt *pIdxDe
2b90: 6c 65 74 65 72 3b 20 20 20 20 20 20 2f 2a 20 22  leter;      /* "
2ba0: 44 45 4c 45 54 45 20 46 52 4f 4d 20 25 5f 69 64  DELETE FROM %_id
2bb0: 78 20 57 48 45 52 45 20 73 65 67 69 64 3d 3f 20  x WHERE segid=? 
2bc0: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  */.  sqlite3_stm
2bd0: 74 20 2a 70 49 64 78 53 65 6c 65 63 74 3b 0a 20  t *pIdxSelect;. 
2be0: 20 69 6e 74 20 6e 52 65 61 64 3b 20 20 20 20 20   int nRead;     
2bf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c00: 20 2f 2a 20 54 6f 74 61 6c 20 6e 75 6d 62 65 72   /* Total number
2c10: 20 6f 66 20 62 6c 6f 63 6b 73 20 72 65 61 64 20   of blocks read 
2c20: 2a 2f 0a 7d 3b 0a 0a 73 74 72 75 63 74 20 46 74  */.};..struct Ft
2c30: 73 35 44 6f 63 6c 69 73 74 49 74 65 72 20 7b 0a  s5DoclistIter {.
2c40: 20 20 75 38 20 2a 61 45 6f 66 3b 20 20 20 20 20    u8 *aEof;     
2c50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c60: 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
2c70: 31 20 62 79 74 65 20 70 61 73 74 20 65 6e 64 20  1 byte past end 
2c80: 6f 66 20 64 6f 63 6c 69 73 74 20 2a 2f 0a 0a 20  of doclist */.. 
2c90: 20 2f 2a 20 4f 75 74 70 75 74 20 76 61 72 69 61   /* Output varia
2ca0: 62 6c 65 73 2e 20 61 50 6f 73 6c 69 73 74 3d 3d  bles. aPoslist==
2cb0: 30 20 61 74 20 45 4f 46 20 2a 2f 0a 20 20 69 36  0 at EOF */.  i6
2cc0: 34 20 69 52 6f 77 69 64 3b 0a 20 20 75 38 20 2a  4 iRowid;.  u8 *
2cd0: 61 50 6f 73 6c 69 73 74 3b 0a 20 20 69 6e 74 20  aPoslist;.  int 
2ce0: 6e 50 6f 73 6c 69 73 74 3b 0a 20 20 69 6e 74 20  nPoslist;.  int 
2cf0: 6e 53 69 7a 65 3b 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  nSize;.};../*.**
2d00: 20 54 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   The contents of
2d10: 20 74 68 65 20 22 73 74 72 75 63 74 75 72 65 22   the "structure"
2d20: 20 72 65 63 6f 72 64 20 66 6f 72 20 65 61 63 68   record for each
2d30: 20 69 6e 64 65 78 20 61 72 65 20 72 65 70 72 65   index are repre
2d40: 73 65 6e 74 65 64 0a 2a 2a 20 75 73 69 6e 67 20  sented.** using 
2d50: 61 6e 20 46 74 73 35 53 74 72 75 63 74 75 72 65  an Fts5Structure
2d60: 20 72 65 63 6f 72 64 20 69 6e 20 6d 65 6d 6f 72   record in memor
2d70: 79 2e 20 57 68 69 63 68 20 75 73 65 73 20 69 6e  y. Which uses in
2d80: 73 74 61 6e 63 65 73 20 6f 66 20 74 68 65 20 0a  stances of the .
2d90: 2a 2a 20 6f 74 68 65 72 20 46 74 73 35 53 74 72  ** other Fts5Str
2da0: 75 63 74 75 72 65 58 58 58 20 74 79 70 65 73 20  uctureXXX types 
2db0: 61 73 20 63 6f 6d 70 6f 6e 65 6e 74 73 2e 0a 2a  as components..*
2dc0: 2f 0a 73 74 72 75 63 74 20 46 74 73 35 53 74 72  /.struct Fts5Str
2dd0: 75 63 74 75 72 65 53 65 67 6d 65 6e 74 20 7b 0a  uctureSegment {.
2de0: 20 20 69 6e 74 20 69 53 65 67 69 64 3b 20 20 20    int iSegid;   
2df0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e00: 20 20 2f 2a 20 53 65 67 6d 65 6e 74 20 69 64 20    /* Segment id 
2e10: 2a 2f 0a 20 20 69 6e 74 20 70 67 6e 6f 46 69 72  */.  int pgnoFir
2e20: 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  st;             
2e30: 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 6c 65       /* First le
2e40: 61 66 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69  af page number i
2e50: 6e 20 73 65 67 6d 65 6e 74 20 2a 2f 0a 20 20 69  n segment */.  i
2e60: 6e 74 20 70 67 6e 6f 4c 61 73 74 3b 20 20 20 20  nt pgnoLast;    
2e70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2e80: 2a 20 4c 61 73 74 20 6c 65 61 66 20 70 61 67 65  * Last leaf page
2e90: 20 6e 75 6d 62 65 72 20 69 6e 20 73 65 67 6d 65   number in segme
2ea0: 6e 74 20 2a 2f 0a 7d 3b 0a 73 74 72 75 63 74 20  nt */.};.struct 
2eb0: 46 74 73 35 53 74 72 75 63 74 75 72 65 4c 65 76  Fts5StructureLev
2ec0: 65 6c 20 7b 0a 20 20 69 6e 74 20 6e 4d 65 72 67  el {.  int nMerg
2ed0: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
2ee0: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
2ef0: 20 6f 66 20 73 65 67 6d 65 6e 74 73 20 69 6e 20   of segments in 
2f00: 69 6e 63 72 2d 6d 65 72 67 65 20 2a 2f 0a 20 20  incr-merge */.  
2f10: 69 6e 74 20 6e 53 65 67 3b 20 20 20 20 20 20 20  int nSeg;       
2f20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f30: 2f 2a 20 54 6f 74 61 6c 20 6e 75 6d 62 65 72 20  /* Total number 
2f40: 6f 66 20 73 65 67 6d 65 6e 74 73 20 6f 6e 20 6c  of segments on l
2f50: 65 76 65 6c 20 2a 2f 0a 20 20 46 74 73 35 53 74  evel */.  Fts5St
2f60: 72 75 63 74 75 72 65 53 65 67 6d 65 6e 74 20 2a  ructureSegment *
2f70: 61 53 65 67 3b 20 20 20 20 20 2f 2a 20 41 72 72  aSeg;     /* Arr
2f80: 61 79 20 6f 66 20 73 65 67 6d 65 6e 74 73 2e 20  ay of segments. 
2f90: 61 53 65 67 5b 30 5d 20 69 73 20 6f 6c 64 65 73  aSeg[0] is oldes
2fa0: 74 2e 20 2a 2f 0a 7d 3b 0a 73 74 72 75 63 74 20  t. */.};.struct 
2fb0: 46 74 73 35 53 74 72 75 63 74 75 72 65 20 7b 0a  Fts5Structure {.
2fc0: 20 20 69 6e 74 20 6e 52 65 66 3b 20 20 20 20 20    int nRef;     
2fd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2fe0: 20 20 2f 2a 20 4f 62 6a 65 63 74 20 72 65 66 65    /* Object refe
2ff0: 72 65 6e 63 65 20 63 6f 75 6e 74 20 2a 2f 0a 20  rence count */. 
3000: 20 75 36 34 20 6e 57 72 69 74 65 43 6f 75 6e 74   u64 nWriteCount
3010: 65 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  er;             
3020: 20 2f 2a 20 54 6f 74 61 6c 20 6c 65 61 76 65 73   /* Total leaves
3030: 20 77 72 69 74 74 65 6e 20 74 6f 20 6c 65 76 65   written to leve
3040: 6c 20 30 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 65  l 0 */.  int nSe
3050: 67 6d 65 6e 74 3b 20 20 20 20 20 20 20 20 20 20  gment;          
3060: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 74 61           /* Tota
3070: 6c 20 73 65 67 6d 65 6e 74 73 20 69 6e 20 74 68  l segments in th
3080: 69 73 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a  is structure */.
3090: 20 20 69 6e 74 20 6e 4c 65 76 65 6c 3b 20 20 20    int nLevel;   
30a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30b0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6c    /* Number of l
30c0: 65 76 65 6c 73 20 69 6e 20 74 68 69 73 20 69 6e  evels in this in
30d0: 64 65 78 20 2a 2f 0a 20 20 46 74 73 35 53 74 72  dex */.  Fts5Str
30e0: 75 63 74 75 72 65 4c 65 76 65 6c 20 61 4c 65 76  uctureLevel aLev
30f0: 65 6c 5b 31 5d 3b 20 20 20 2f 2a 20 41 72 72 61  el[1];   /* Arra
3100: 79 20 6f 66 20 6e 4c 65 76 65 6c 20 6c 65 76 65  y of nLevel leve
3110: 6c 20 6f 62 6a 65 63 74 73 20 2a 2f 0a 7d 3b 0a  l objects */.};.
3120: 0a 2f 2a 0a 2a 2a 20 41 6e 20 6f 62 6a 65 63 74  ./*.** An object
3130: 20 6f 66 20 74 79 70 65 20 46 74 73 35 53 65 67   of type Fts5Seg
3140: 57 72 69 74 65 72 20 69 73 20 75 73 65 64 20 74  Writer is used t
3150: 6f 20 77 72 69 74 65 20 74 6f 20 73 65 67 6d 65  o write to segme
3160: 6e 74 73 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 46  nts..*/.struct F
3170: 74 73 35 50 61 67 65 57 72 69 74 65 72 20 7b 0a  ts5PageWriter {.
3180: 20 20 69 6e 74 20 70 67 6e 6f 3b 20 20 20 20 20    int pgno;     
3190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31a0: 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72    /* Page number
31b0: 20 66 6f 72 20 74 68 69 73 20 70 61 67 65 20 2a   for this page *
31c0: 2f 0a 20 20 69 6e 74 20 69 50 72 65 76 50 67 69  /.  int iPrevPgi
31d0: 64 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  dx;             
31e0: 20 20 20 20 2f 2a 20 50 72 65 76 69 6f 75 73 20      /* Previous 
31f0: 76 61 6c 75 65 20 77 72 69 74 74 65 6e 20 69 6e  value written in
3200: 74 6f 20 70 67 69 64 78 20 2a 2f 0a 20 20 46 74  to pgidx */.  Ft
3210: 73 35 42 75 66 66 65 72 20 62 75 66 3b 20 20 20  s5Buffer buf;   
3220: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
3230: 20 42 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69   Buffer containi
3240: 6e 67 20 6c 65 61 66 20 64 61 74 61 20 2a 2f 0a  ng leaf data */.
3250: 20 20 46 74 73 35 42 75 66 66 65 72 20 70 67 69    Fts5Buffer pgi
3260: 64 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  dx;             
3270: 20 20 2f 2a 20 42 75 66 66 65 72 20 63 6f 6e 74    /* Buffer cont
3280: 61 69 6e 69 6e 67 20 70 61 67 65 2d 69 6e 64 65  aining page-inde
3290: 78 20 2a 2f 0a 20 20 46 74 73 35 42 75 66 66 65  x */.  Fts5Buffe
32a0: 72 20 74 65 72 6d 3b 20 20 20 20 20 20 20 20 20  r term;         
32b0: 20 20 20 20 20 20 20 2f 2a 20 42 75 66 66 65 72         /* Buffer
32c0: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 70 72 65 76   containing prev
32d0: 69 6f 75 73 20 74 65 72 6d 20 6f 6e 20 70 61 67  ious term on pag
32e0: 65 20 2a 2f 0a 7d 3b 0a 73 74 72 75 63 74 20 46  e */.};.struct F
32f0: 74 73 35 44 6c 69 64 78 57 72 69 74 65 72 20 7b  ts5DlidxWriter {
3300: 0a 20 20 69 6e 74 20 70 67 6e 6f 3b 20 20 20 20  .  int pgno;    
3310: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3320: 20 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65     /* Page numbe
3330: 72 20 66 6f 72 20 74 68 69 73 20 70 61 67 65 20  r for this page 
3340: 2a 2f 0a 20 20 69 6e 74 20 62 50 72 65 76 56 61  */.  int bPrevVa
3350: 6c 69 64 3b 20 20 20 20 20 20 20 20 20 20 20 20  lid;            
3360: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
3370: 69 50 72 65 76 20 69 73 20 76 61 6c 69 64 20 2a  iPrev is valid *
3380: 2f 0a 20 20 69 36 34 20 69 50 72 65 76 3b 20 20  /.  i64 iPrev;  
3390: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33a0: 20 20 20 20 2f 2a 20 50 72 65 76 69 6f 75 73 20      /* Previous 
33b0: 72 6f 77 69 64 20 76 61 6c 75 65 20 77 72 69 74  rowid value writ
33c0: 74 65 6e 20 74 6f 20 70 61 67 65 20 2a 2f 0a 20  ten to page */. 
33d0: 20 46 74 73 35 42 75 66 66 65 72 20 62 75 66 3b   Fts5Buffer buf;
33e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33f0: 20 2f 2a 20 42 75 66 66 65 72 20 63 6f 6e 74 61   /* Buffer conta
3400: 69 6e 69 6e 67 20 70 61 67 65 20 64 61 74 61 20  ining page data 
3410: 2a 2f 0a 7d 3b 0a 73 74 72 75 63 74 20 46 74 73  */.};.struct Fts
3420: 35 53 65 67 57 72 69 74 65 72 20 7b 0a 20 20 69  5SegWriter {.  i
3430: 6e 74 20 69 53 65 67 69 64 3b 20 20 20 20 20 20  nt iSegid;      
3440: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
3450: 2a 20 53 65 67 69 64 20 74 6f 20 77 72 69 74 65  * Segid to write
3460: 20 74 6f 20 2a 2f 0a 20 20 46 74 73 35 50 61 67   to */.  Fts5Pag
3470: 65 57 72 69 74 65 72 20 77 72 69 74 65 72 3b 20  eWriter writer; 
3480: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65           /* Page
3490: 57 72 69 74 65 72 20 6f 62 6a 65 63 74 20 2a 2f  Writer object */
34a0: 0a 20 20 69 36 34 20 69 50 72 65 76 52 6f 77 69  .  i64 iPrevRowi
34b0: 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d;              
34c0: 20 20 20 2f 2a 20 50 72 65 76 69 6f 75 73 20 72     /* Previous r
34d0: 6f 77 69 64 20 77 72 69 74 74 65 6e 20 74 6f 20  owid written to 
34e0: 63 75 72 72 65 6e 74 20 6c 65 61 66 20 2a 2f 0a  current leaf */.
34f0: 20 20 75 38 20 62 46 69 72 73 74 52 6f 77 69 64    u8 bFirstRowid
3500: 49 6e 44 6f 63 6c 69 73 74 3b 20 20 20 20 20 20  InDoclist;      
3510: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 6e 65 78    /* True if nex
3520: 74 20 72 6f 77 69 64 20 69 73 20 66 69 72 73 74  t rowid is first
3530: 20 69 6e 20 64 6f 63 6c 69 73 74 20 2a 2f 0a 20   in doclist */. 
3540: 20 75 38 20 62 46 69 72 73 74 52 6f 77 69 64 49   u8 bFirstRowidI
3550: 6e 50 61 67 65 3b 20 20 20 20 20 20 20 20 20 20  nPage;          
3560: 20 2f 2a 20 54 72 75 65 20 69 66 20 6e 65 78 74   /* True if next
3570: 20 72 6f 77 69 64 20 69 73 20 66 69 72 73 74 20   rowid is first 
3580: 69 6e 20 70 61 67 65 20 2a 2f 0a 20 20 2f 2a 20  in page */.  /* 
3590: 54 4f 44 4f 31 3a 20 43 61 6e 20 75 73 65 20 28  TODO1: Can use (
35a0: 77 72 69 74 65 72 2e 70 67 69 64 78 2e 6e 3d 3d  writer.pgidx.n==
35b0: 30 29 20 69 6e 73 74 65 61 64 20 6f 66 20 62 46  0) instead of bF
35c0: 69 72 73 74 54 65 72 6d 49 6e 50 61 67 65 20 2a  irstTermInPage *
35d0: 2f 0a 20 20 75 38 20 62 46 69 72 73 74 54 65 72  /.  u8 bFirstTer
35e0: 6d 49 6e 50 61 67 65 3b 20 20 20 20 20 20 20 20  mInPage;        
35f0: 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 6e      /* True if n
3600: 65 78 74 20 74 65 72 6d 20 77 69 6c 6c 20 62 65  ext term will be
3610: 20 66 69 72 73 74 20 69 6e 20 6c 65 61 66 20 2a   first in leaf *
3620: 2f 0a 20 20 69 6e 74 20 6e 4c 65 61 66 57 72 69  /.  int nLeafWri
3630: 74 74 65 6e 3b 20 20 20 20 20 20 20 20 20 20 20  tten;           
3640: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
3650: 20 6c 65 61 66 20 70 61 67 65 73 20 77 72 69 74   leaf pages writ
3660: 74 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 6d  ten */.  int nEm
3670: 70 74 79 3b 20 20 20 20 20 20 20 20 20 20 20 20  pty;            
3680: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
3690: 65 72 20 6f 66 20 63 6f 6e 74 69 67 75 6f 75 73  er of contiguous
36a0: 20 74 65 72 6d 2d 6c 65 73 73 20 6e 6f 64 65 73   term-less nodes
36b0: 20 2a 2f 0a 0a 20 20 69 6e 74 20 6e 44 6c 69 64   */..  int nDlid
36c0: 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  x;              
36d0: 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c 6f 63 61         /* Alloca
36e0: 74 65 64 20 73 69 7a 65 20 6f 66 20 61 44 6c 69  ted size of aDli
36f0: 64 78 5b 5d 20 61 72 72 61 79 20 2a 2f 0a 20 20  dx[] array */.  
3700: 46 74 73 35 44 6c 69 64 78 57 72 69 74 65 72 20  Fts5DlidxWriter 
3710: 2a 61 44 6c 69 64 78 3b 20 20 20 20 20 20 20 20  *aDlidx;        
3720: 2f 2a 20 41 72 72 61 79 20 6f 66 20 46 74 73 35  /* Array of Fts5
3730: 44 6c 69 64 78 57 72 69 74 65 72 20 6f 62 6a 65  DlidxWriter obje
3740: 63 74 73 20 2a 2f 0a 0a 20 20 2f 2a 20 56 61 6c  cts */..  /* Val
3750: 75 65 73 20 74 6f 20 69 6e 73 65 72 74 20 69 6e  ues to insert in
3760: 74 6f 20 74 68 65 20 25 5f 69 64 78 20 74 61 62  to the %_idx tab
3770: 6c 65 20 2a 2f 0a 20 20 46 74 73 35 42 75 66 66  le */.  Fts5Buff
3780: 65 72 20 62 74 74 65 72 6d 3b 20 20 20 20 20 20  er btterm;      
3790: 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 78 74 20          /* Next 
37a0: 74 65 72 6d 20 74 6f 20 69 6e 73 65 72 74 20 69  term to insert i
37b0: 6e 74 6f 20 25 5f 69 64 78 20 74 61 62 6c 65 20  nto %_idx table 
37c0: 2a 2f 0a 20 20 69 6e 74 20 69 42 74 50 61 67 65  */.  int iBtPage
37d0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
37e0: 20 20 20 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d       /* Page num
37f0: 62 65 72 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  ber correspondin
3800: 67 20 74 6f 20 62 74 74 65 72 6d 20 2a 2f 0a 7d  g to btterm */.}
3810: 3b 0a 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  ;..typedef struc
3820: 74 20 46 74 73 35 43 52 65 73 75 6c 74 20 46 74  t Fts5CResult Ft
3830: 73 35 43 52 65 73 75 6c 74 3b 0a 73 74 72 75 63  s5CResult;.struc
3840: 74 20 46 74 73 35 43 52 65 73 75 6c 74 20 7b 0a  t Fts5CResult {.
3850: 20 20 75 31 36 20 69 46 69 72 73 74 3b 20 20 20    u16 iFirst;   
3860: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3870: 20 20 2f 2a 20 61 53 65 67 5b 5d 20 69 6e 64 65    /* aSeg[] inde
3880: 78 20 6f 66 20 66 69 72 73 74 65 73 74 20 69 74  x of firstest it
3890: 65 72 61 74 6f 72 20 2a 2f 0a 20 20 75 38 20 62  erator */.  u8 b
38a0: 54 65 72 6d 45 71 3b 20 20 20 20 20 20 20 20 20  TermEq;         
38b0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
38c0: 72 75 65 20 69 66 20 74 68 65 20 74 65 72 6d 73  rue if the terms
38d0: 20 61 72 65 20 65 71 75 61 6c 20 2a 2f 0a 7d 3b   are equal */.};
38e0: 0a 0a 2f 2a 0a 2a 2a 20 4f 62 6a 65 63 74 20 66  ../*.** Object f
38f0: 6f 72 20 69 74 65 72 61 74 69 6e 67 20 74 68 72  or iterating thr
3900: 6f 75 67 68 20 61 20 73 69 6e 67 6c 65 20 73 65  ough a single se
3910: 67 6d 65 6e 74 2c 20 76 69 73 69 74 69 6e 67 20  gment, visiting 
3920: 65 61 63 68 20 74 65 72 6d 2f 72 6f 77 69 64 0a  each term/rowid.
3930: 2a 2a 20 70 61 69 72 20 69 6e 20 74 68 65 20 73  ** pair in the s
3940: 65 67 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 70 53  egment..**.** pS
3950: 65 67 3a 0a 2a 2a 20 20 20 54 68 65 20 73 65 67  eg:.**   The seg
3960: 6d 65 6e 74 20 74 6f 20 69 74 65 72 61 74 65 20  ment to iterate 
3970: 74 68 72 6f 75 67 68 2e 0a 2a 2a 0a 2a 2a 20 69  through..**.** i
3980: 4c 65 61 66 50 67 6e 6f 3a 0a 2a 2a 20 20 20 43  LeafPgno:.**   C
3990: 75 72 72 65 6e 74 20 6c 65 61 66 20 70 61 67 65  urrent leaf page
39a0: 20 6e 75 6d 62 65 72 20 77 69 74 68 69 6e 20 73   number within s
39b0: 65 67 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 69 4c  egment..**.** iL
39c0: 65 61 66 4f 66 66 73 65 74 3a 0a 2a 2a 20 20 20  eafOffset:.**   
39d0: 42 79 74 65 20 6f 66 66 73 65 74 20 77 69 74 68  Byte offset with
39e0: 69 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c  in the current l
39f0: 65 61 66 20 74 68 61 74 20 69 73 20 74 68 65 20  eaf that is the 
3a00: 66 69 72 73 74 20 62 79 74 65 20 6f 66 20 74 68  first byte of th
3a10: 65 20 0a 2a 2a 20 20 20 70 6f 73 69 74 69 6f 6e  e .**   position
3a20: 20 6c 69 73 74 20 64 61 74 61 20 28 6f 6e 65 20   list data (one 
3a30: 62 79 74 65 20 70 61 73 73 65 64 20 74 68 65 20  byte passed the 
3a40: 70 6f 73 69 74 69 6f 6e 2d 6c 69 73 74 20 73 69  position-list si
3a50: 7a 65 20 66 69 65 6c 64 29 2e 0a 2a 2a 20 20 20  ze field)..**   
3a60: 72 6f 77 69 64 20 66 69 65 6c 64 20 6f 66 20 74  rowid field of t
3a70: 68 65 20 63 75 72 72 65 6e 74 20 65 6e 74 72 79  he current entry
3a80: 2e 20 55 73 75 61 6c 6c 79 20 74 68 69 73 20 69  . Usually this i
3a90: 73 20 74 68 65 20 73 69 7a 65 20 66 69 65 6c 64  s the size field
3aa0: 20 6f 66 20 74 68 65 0a 2a 2a 20 20 20 70 6f 73   of the.**   pos
3ab0: 69 74 69 6f 6e 20 6c 69 73 74 20 64 61 74 61 2e  ition list data.
3ac0: 20 54 68 65 20 65 78 63 65 70 74 69 6f 6e 20 69   The exception i
3ad0: 73 20 69 66 20 74 68 65 20 72 6f 77 69 64 20 66  s if the rowid f
3ae0: 6f 72 20 74 68 65 20 63 75 72 72 65 6e 74 20 65  or the current e
3af0: 6e 74 72 79 20 0a 2a 2a 20 20 20 69 73 20 74 68  ntry .**   is th
3b00: 65 20 6c 61 73 74 20 74 68 69 6e 67 20 6f 6e 20  e last thing on 
3b10: 74 68 65 20 6c 65 61 66 20 70 61 67 65 2e 0a 2a  the leaf page..*
3b20: 2a 0a 2a 2a 20 70 4c 65 61 66 3a 0a 2a 2a 20 20  *.** pLeaf:.**  
3b30: 20 42 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69   Buffer containi
3b40: 6e 67 20 63 75 72 72 65 6e 74 20 6c 65 61 66 20  ng current leaf 
3b50: 70 61 67 65 20 64 61 74 61 2e 20 53 65 74 20 74  page data. Set t
3b60: 6f 20 4e 55 4c 4c 20 61 74 20 45 4f 46 2e 0a 2a  o NULL at EOF..*
3b70: 2a 0a 2a 2a 20 69 54 65 72 6d 4c 65 61 66 50 67  *.** iTermLeafPg
3b80: 6e 6f 2c 20 69 54 65 72 6d 4c 65 61 66 4f 66 66  no, iTermLeafOff
3b90: 73 65 74 3a 0a 2a 2a 20 20 20 4c 65 61 66 20 70  set:.**   Leaf p
3ba0: 61 67 65 20 6e 75 6d 62 65 72 20 63 6f 6e 74 61  age number conta
3bb0: 69 6e 69 6e 67 20 74 68 65 20 6c 61 73 74 20 74  ining the last t
3bc0: 65 72 6d 20 72 65 61 64 20 66 72 6f 6d 20 74 68  erm read from th
3bd0: 65 20 73 65 67 6d 65 6e 74 2e 20 41 6e 64 0a 2a  e segment. And.*
3be0: 2a 20 20 20 74 68 65 20 6f 66 66 73 65 74 20 69  *   the offset i
3bf0: 6d 6d 65 64 69 61 74 65 6c 79 20 66 6f 6c 6c 6f  mmediately follo
3c00: 77 69 6e 67 20 74 68 65 20 74 65 72 6d 20 64 61  wing the term da
3c10: 74 61 2e 0a 2a 2a 0a 2a 2a 20 66 6c 61 67 73 3a  ta..**.** flags:
3c20: 0a 2a 2a 20 20 20 4d 61 73 6b 20 6f 66 20 46 54  .**   Mask of FT
3c30: 53 35 5f 53 45 47 49 54 45 52 5f 58 58 58 20 76  S5_SEGITER_XXX v
3c40: 61 6c 75 65 73 2e 20 49 6e 74 65 72 70 72 65 74  alues. Interpret
3c50: 65 64 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a  ed as follows:.*
3c60: 2a 0a 2a 2a 20 20 20 46 54 53 35 5f 53 45 47 49  *.**   FTS5_SEGI
3c70: 54 45 52 5f 4f 4e 45 54 45 52 4d 3a 0a 2a 2a 20  TER_ONETERM:.** 
3c80: 20 20 20 20 49 66 20 73 65 74 2c 20 73 65 74 20      If set, set 
3c90: 74 68 65 20 69 74 65 72 61 74 6f 72 20 74 6f 20  the iterator to 
3ca0: 70 6f 69 6e 74 20 74 6f 20 45 4f 46 20 61 66 74  point to EOF aft
3cb0: 65 72 20 74 68 65 20 63 75 72 72 65 6e 74 20 64  er the current d
3cc0: 6f 63 6c 69 73 74 20 0a 2a 2a 20 20 20 20 20 68  oclist .**     h
3cd0: 61 73 20 62 65 65 6e 20 65 78 68 61 75 73 74 65  as been exhauste
3ce0: 64 2e 20 44 6f 20 6e 6f 74 20 70 72 6f 63 65 65  d. Do not procee
3cf0: 64 20 74 6f 20 74 68 65 20 6e 65 78 74 20 74 65  d to the next te
3d00: 72 6d 20 69 6e 20 74 68 65 20 73 65 67 6d 65 6e  rm in the segmen
3d10: 74 2e 0a 2a 2a 0a 2a 2a 20 20 20 46 54 53 35 5f  t..**.**   FTS5_
3d20: 53 45 47 49 54 45 52 5f 52 45 56 45 52 53 45 3a  SEGITER_REVERSE:
3d30: 0a 2a 2a 20 20 20 20 20 54 68 69 73 20 66 6c 61  .**     This fla
3d40: 67 20 69 73 20 6f 6e 6c 79 20 65 76 65 72 20 73  g is only ever s
3d50: 65 74 20 69 66 20 46 54 53 35 5f 53 45 47 49 54  et if FTS5_SEGIT
3d60: 45 52 5f 4f 4e 45 54 45 52 4d 20 69 73 20 61 6c  ER_ONETERM is al
3d70: 73 6f 20 73 65 74 2e 20 49 66 0a 2a 2a 20 20 20  so set. If.**   
3d80: 20 20 69 74 20 69 73 20 73 65 74 2c 20 69 74 65    it is set, ite
3d90: 72 61 74 65 20 74 68 72 6f 75 67 68 20 72 6f 77  rate through row
3da0: 69 64 20 69 6e 20 64 65 73 63 65 6e 64 69 6e 67  id in descending
3db0: 20 6f 72 64 65 72 20 69 6e 73 74 65 61 64 20 6f   order instead o
3dc0: 66 20 74 68 65 0a 2a 2a 20 20 20 20 20 64 65 66  f the.**     def
3dd0: 61 75 6c 74 20 61 73 63 65 6e 64 69 6e 67 20 6f  ault ascending o
3de0: 72 64 65 72 2e 0a 2a 2a 0a 2a 2a 20 69 52 6f 77  rder..**.** iRow
3df0: 69 64 4f 66 66 73 65 74 2f 6e 52 6f 77 69 64 4f  idOffset/nRowidO
3e00: 66 66 73 65 74 2f 61 52 6f 77 69 64 4f 66 66 73  ffset/aRowidOffs
3e10: 65 74 3a 0a 2a 2a 20 20 20 20 20 54 68 65 73 65  et:.**     These
3e20: 20 61 72 65 20 75 73 65 64 20 69 66 20 74 68 65   are used if the
3e30: 20 46 54 53 35 5f 53 45 47 49 54 45 52 5f 52 45   FTS5_SEGITER_RE
3e40: 56 45 52 53 45 20 66 6c 61 67 20 69 73 20 73 65  VERSE flag is se
3e50: 74 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 46 6f 72  t..**.**     For
3e60: 20 65 61 63 68 20 72 6f 77 69 64 20 6f 6e 20 74   each rowid on t
3e70: 68 65 20 70 61 67 65 20 63 6f 72 72 65 73 70 6f  he page correspo
3e80: 6e 64 69 6e 67 20 74 6f 20 74 68 65 20 63 75 72  nding to the cur
3e90: 72 65 6e 74 20 74 65 72 6d 2c 20 74 68 65 0a 2a  rent term, the.*
3ea0: 2a 20 20 20 20 20 63 6f 72 72 65 73 70 6f 6e 64  *     correspond
3eb0: 69 6e 67 20 61 52 6f 77 69 64 4f 66 66 73 65 74  ing aRowidOffset
3ec0: 5b 5d 20 65 6e 74 72 79 20 69 73 20 73 65 74 20  [] entry is set 
3ed0: 74 6f 20 74 68 65 20 62 79 74 65 20 6f 66 66 73  to the byte offs
3ee0: 65 74 20 6f 66 20 74 68 65 0a 2a 2a 20 20 20 20  et of the.**    
3ef0: 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 22 70   start of the "p
3f00: 6f 73 69 74 69 6f 6e 2d 6c 69 73 74 2d 73 69 7a  osition-list-siz
3f10: 65 22 20 66 69 65 6c 64 20 77 69 74 68 69 6e 20  e" field within 
3f20: 74 68 65 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20  the page..**.** 
3f30: 69 54 65 72 6d 49 64 78 3a 0a 2a 2a 20 20 20 20  iTermIdx:.**    
3f40: 20 49 6e 64 65 78 20 6f 66 20 63 75 72 72 65 6e   Index of curren
3f50: 74 20 74 65 72 6d 20 6f 6e 20 69 54 65 72 6d 4c  t term on iTermL
3f60: 65 61 66 50 67 6e 6f 2e 0a 2a 2f 0a 73 74 72 75  eafPgno..*/.stru
3f70: 63 74 20 46 74 73 35 53 65 67 49 74 65 72 20 7b  ct Fts5SegIter {
3f80: 0a 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65  .  Fts5Structure
3f90: 53 65 67 6d 65 6e 74 20 2a 70 53 65 67 3b 20 20  Segment *pSeg;  
3fa0: 20 20 20 2f 2a 20 53 65 67 6d 65 6e 74 20 74 6f     /* Segment to
3fb0: 20 69 74 65 72 61 74 65 20 74 68 72 6f 75 67 68   iterate through
3fc0: 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 3b   */.  int flags;
3fd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3fe0: 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66        /* Mask of
3ff0: 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 66   configuration f
4000: 6c 61 67 73 20 2a 2f 0a 20 20 69 6e 74 20 69 4c  lags */.  int iL
4010: 65 61 66 50 67 6e 6f 3b 20 20 20 20 20 20 20 20  eafPgno;        
4020: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72            /* Cur
4030: 72 65 6e 74 20 6c 65 61 66 20 70 61 67 65 20 6e  rent leaf page n
4040: 75 6d 62 65 72 20 2a 2f 0a 20 20 46 74 73 35 44  umber */.  Fts5D
4050: 61 74 61 20 2a 70 4c 65 61 66 3b 20 20 20 20 20  ata *pLeaf;     
4060: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75             /* Cu
4070: 72 72 65 6e 74 20 6c 65 61 66 20 64 61 74 61 20  rrent leaf data 
4080: 2a 2f 0a 20 20 46 74 73 35 44 61 74 61 20 2a 70  */.  Fts5Data *p
4090: 4e 65 78 74 4c 65 61 66 3b 20 20 20 20 20 20 20  NextLeaf;       
40a0: 20 20 20 20 20 2f 2a 20 4c 65 61 66 20 70 61 67       /* Leaf pag
40b0: 65 20 28 69 4c 65 61 66 50 67 6e 6f 2b 31 29 20  e (iLeafPgno+1) 
40c0: 2a 2f 0a 20 20 69 6e 74 20 69 4c 65 61 66 4f 66  */.  int iLeafOf
40d0: 66 73 65 74 3b 20 20 20 20 20 20 20 20 20 20 20  fset;           
40e0: 20 20 20 20 20 2f 2a 20 42 79 74 65 20 6f 66 66       /* Byte off
40f0: 73 65 74 20 77 69 74 68 69 6e 20 63 75 72 72 65  set within curre
4100: 6e 74 20 6c 65 61 66 20 2a 2f 0a 0a 20 20 2f 2a  nt leaf */..  /*
4110: 20 4e 65 78 74 20 6d 65 74 68 6f 64 20 2a 2f 0a   Next method */.
4120: 20 20 76 6f 69 64 20 28 2a 78 4e 65 78 74 29 28    void (*xNext)(
4130: 46 74 73 35 49 6e 64 65 78 2a 2c 20 46 74 73 35  Fts5Index*, Fts5
4140: 53 65 67 49 74 65 72 2a 2c 20 69 6e 74 2a 29 3b  SegIter*, int*);
4150: 0a 0a 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20  ..  /* The page 
4160: 61 6e 64 20 6f 66 66 73 65 74 20 66 72 6f 6d 20  and offset from 
4170: 77 68 69 63 68 20 74 68 65 20 63 75 72 72 65 6e  which the curren
4180: 74 20 74 65 72 6d 20 77 61 73 20 72 65 61 64 2e  t term was read.
4190: 20 54 68 65 20 6f 66 66 73 65 74 20 0a 20 20 2a   The offset .  *
41a0: 2a 20 69 73 20 74 68 65 20 6f 66 66 73 65 74 20  * is the offset 
41b0: 6f 66 20 74 68 65 20 66 69 72 73 74 20 72 6f 77  of the first row
41c0: 69 64 20 69 6e 20 74 68 65 20 63 75 72 72 65 6e  id in the curren
41d0: 74 20 64 6f 63 6c 69 73 74 2e 20 20 2a 2f 0a 20  t doclist.  */. 
41e0: 20 69 6e 74 20 69 54 65 72 6d 4c 65 61 66 50 67   int iTermLeafPg
41f0: 6e 6f 3b 0a 20 20 69 6e 74 20 69 54 65 72 6d 4c  no;.  int iTermL
4200: 65 61 66 4f 66 66 73 65 74 3b 0a 0a 20 20 69 6e  eafOffset;..  in
4210: 74 20 69 50 67 69 64 78 4f 66 66 3b 20 20 20 20  t iPgidxOff;    
4220: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
4230: 20 4e 65 78 74 20 6f 66 66 73 65 74 20 69 6e 20   Next offset in 
4240: 70 67 69 64 78 20 2a 2f 0a 20 20 69 6e 74 20 69  pgidx */.  int i
4250: 45 6e 64 6f 66 44 6f 63 6c 69 73 74 3b 0a 0a 20  EndofDoclist;.. 
4260: 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e   /* The followin
4270: 67 20 61 72 65 20 6f 6e 6c 79 20 75 73 65 64 20  g are only used 
4280: 69 66 20 74 68 65 20 46 54 53 35 5f 53 45 47 49  if the FTS5_SEGI
4290: 54 45 52 5f 52 45 56 45 52 53 45 20 66 6c 61 67  TER_REVERSE flag
42a0: 20 69 73 20 73 65 74 2e 20 2a 2f 0a 20 20 69 6e   is set. */.  in
42b0: 74 20 69 52 6f 77 69 64 4f 66 66 73 65 74 3b 20  t iRowidOffset; 
42c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
42d0: 20 43 75 72 72 65 6e 74 20 65 6e 74 72 79 20 69   Current entry i
42e0: 6e 20 61 52 6f 77 69 64 4f 66 66 73 65 74 5b 5d  n aRowidOffset[]
42f0: 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 6f 77 69 64   */.  int nRowid
4300: 4f 66 66 73 65 74 3b 20 20 20 20 20 20 20 20 20  Offset;         
4310: 20 20 20 20 20 20 2f 2a 20 41 6c 6c 6f 63 61 74        /* Allocat
4320: 65 64 20 73 69 7a 65 20 6f 66 20 61 52 6f 77 69  ed size of aRowi
4330: 64 4f 66 66 73 65 74 5b 5d 20 61 72 72 61 79 20  dOffset[] array 
4340: 2a 2f 0a 20 20 69 6e 74 20 2a 61 52 6f 77 69 64  */.  int *aRowid
4350: 4f 66 66 73 65 74 3b 20 20 20 20 20 20 20 20 20  Offset;         
4360: 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66       /* Array of
4370: 20 6f 66 66 73 65 74 20 74 6f 20 72 6f 77 69 64   offset to rowid
4380: 20 66 69 65 6c 64 73 20 2a 2f 0a 0a 20 20 46 74   fields */..  Ft
4390: 73 35 44 6c 69 64 78 49 74 65 72 20 2a 70 44 6c  s5DlidxIter *pDl
43a0: 69 64 78 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  idx;          /*
43b0: 20 49 66 20 74 68 65 72 65 20 69 73 20 61 20 64   If there is a d
43c0: 6f 63 6c 69 73 74 2d 69 6e 64 65 78 20 2a 2f 0a  oclist-index */.
43d0: 0a 20 20 2f 2a 20 56 61 72 69 61 62 6c 65 73 20  .  /* Variables 
43e0: 70 6f 70 75 6c 61 74 65 64 20 62 61 73 65 64 20  populated based 
43f0: 6f 6e 20 63 75 72 72 65 6e 74 20 65 6e 74 72 79  on current entry
4400: 2e 20 2a 2f 0a 20 20 46 74 73 35 42 75 66 66 65  . */.  Fts5Buffe
4410: 72 20 74 65 72 6d 3b 20 20 20 20 20 20 20 20 20  r term;         
4420: 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e         /* Curren
4430: 74 20 74 65 72 6d 20 2a 2f 0a 20 20 69 36 34 20  t term */.  i64 
4440: 69 52 6f 77 69 64 3b 20 20 20 20 20 20 20 20 20  iRowid;         
4450: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
4460: 75 72 72 65 6e 74 20 72 6f 77 69 64 20 2a 2f 0a  urrent rowid */.
4470: 20 20 69 6e 74 20 6e 50 6f 73 3b 20 20 20 20 20    int nPos;     
4480: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4490: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62    /* Number of b
44a0: 79 74 65 73 20 69 6e 20 63 75 72 72 65 6e 74 20  ytes in current 
44b0: 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74 20 2a 2f  position list */
44c0: 0a 20 20 75 38 20 62 44 65 6c 3b 20 20 20 20 20  .  u8 bDel;     
44d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
44e0: 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68     /* True if th
44f0: 65 20 64 65 6c 65 74 65 20 66 6c 61 67 20 69 73  e delete flag is
4500: 20 73 65 74 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a   set */.};../*.*
4510: 2a 20 41 72 67 75 6d 65 6e 74 20 69 73 20 61 20  * Argument is a 
4520: 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 46 74  pointer to an Ft
4530: 73 35 44 61 74 61 20 73 74 72 75 63 74 75 72 65  s5Data structure
4540: 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 61   that contains a
4550: 20 0a 2a 2a 20 6c 65 61 66 20 70 61 67 65 2e 0a   .** leaf page..
4560: 2a 2f 0a 23 64 65 66 69 6e 65 20 41 53 53 45 52  */.#define ASSER
4570: 54 5f 53 5a 4c 45 41 46 5f 4f 4b 28 78 29 20 61  T_SZLEAF_OK(x) a
4580: 73 73 65 72 74 28 20 5c 0a 20 20 20 20 28 78 29  ssert( \.    (x)
4590: 2d 3e 73 7a 4c 65 61 66 3d 3d 28 78 29 2d 3e 6e  ->szLeaf==(x)->n
45a0: 6e 20 7c 7c 20 28 78 29 2d 3e 73 7a 4c 65 61 66  n || (x)->szLeaf
45b0: 3d 3d 66 74 73 35 47 65 74 55 31 36 28 26 28 78  ==fts5GetU16(&(x
45c0: 29 2d 3e 70 5b 32 5d 29 20 5c 0a 29 0a 0a 23 64  )->p[2]) \.)..#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 4f 4e 45 54 45 52 4d 20 30 78 30 31 0a  ER_ONETERM 0x01.
45f0: 23 64 65 66 69 6e 65 20 46 54 53 35 5f 53 45 47  #define FTS5_SEG
4600: 49 54 45 52 5f 52 45 56 45 52 53 45 20 30 78 30  ITER_REVERSE 0x0
4610: 32 0a 0a 2f 2a 20 0a 2a 2a 20 41 72 67 75 6d 65  2../* .** Argume
4620: 6e 74 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20  nt is a pointer 
4630: 74 6f 20 61 6e 20 46 74 73 35 44 61 74 61 20 73  to an Fts5Data s
4640: 74 72 75 63 74 75 72 65 20 74 68 61 74 20 63 6f  tructure that co
4650: 6e 74 61 69 6e 73 20 61 20 6c 65 61 66 0a 2a 2a  ntains a leaf.**
4660: 20 70 61 67 65 2e 20 54 68 69 73 20 6d 61 63 72   page. This macr
4670: 6f 20 65 76 61 6c 75 61 74 65 73 20 74 6f 20 74  o evaluates to t
4680: 72 75 65 20 69 66 20 74 68 65 20 6c 65 61 66 20  rue if the leaf 
4690: 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 74 65 72 6d  contains no term
46a0: 73 2c 20 6f 72 0a 2a 2a 20 66 61 6c 73 65 20 69  s, or.** false i
46b0: 66 20 69 74 20 63 6f 6e 74 61 69 6e 73 20 61 74  f it contains at
46c0: 20 6c 65 61 73 74 20 6f 6e 65 20 74 65 72 6d 2e   least one term.
46d0: 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 66 74 73 35  .*/.#define fts5
46e0: 4c 65 61 66 49 73 54 65 72 6d 6c 65 73 73 28 78  LeafIsTermless(x
46f0: 29 20 28 28 78 29 2d 3e 73 7a 4c 65 61 66 20 3e  ) ((x)->szLeaf >
4700: 3d 20 28 78 29 2d 3e 6e 6e 29 0a 0a 23 64 65 66  = (x)->nn)..#def
4710: 69 6e 65 20 66 74 73 35 4c 65 61 66 54 65 72 6d  ine fts5LeafTerm
4720: 4f 66 66 28 78 2c 20 69 29 20 28 66 74 73 35 47  Off(x, i) (fts5G
4730: 65 74 55 31 36 28 26 28 78 29 2d 3e 70 5b 28 78  etU16(&(x)->p[(x
4740: 29 2d 3e 73 7a 4c 65 61 66 20 2b 20 28 69 29 2a  )->szLeaf + (i)*
4750: 32 5d 29 29 0a 0a 23 64 65 66 69 6e 65 20 66 74  2]))..#define ft
4760: 73 35 4c 65 61 66 46 69 72 73 74 52 6f 77 69 64  s5LeafFirstRowid
4770: 4f 66 66 28 78 29 20 28 66 74 73 35 47 65 74 55  Off(x) (fts5GetU
4780: 31 36 28 28 78 29 2d 3e 70 29 29 0a 0a 2f 2a 0a  16((x)->p))../*.
4790: 2a 2a 20 4f 62 6a 65 63 74 20 66 6f 72 20 69 74  ** Object for it
47a0: 65 72 61 74 69 6e 67 20 74 68 72 6f 75 67 68 20  erating through 
47b0: 74 68 65 20 6d 65 72 67 65 64 20 72 65 73 75 6c  the merged resul
47c0: 74 73 20 6f 66 20 6f 6e 65 20 6f 72 20 6d 6f 72  ts of one or mor
47d0: 65 20 73 65 67 6d 65 6e 74 73 2c 0a 2a 2a 20 76  e segments,.** v
47e0: 69 73 69 74 69 6e 67 20 65 61 63 68 20 74 65 72  isiting each ter
47f0: 6d 2f 72 6f 77 69 64 20 70 61 69 72 20 69 6e 20  m/rowid pair in 
4800: 74 68 65 20 6d 65 72 67 65 64 20 64 61 74 61 2e  the merged data.
4810: 0a 2a 2a 0a 2a 2a 20 6e 53 65 67 20 69 73 20 61  .**.** nSeg is a
4820: 6c 77 61 79 73 20 61 20 70 6f 77 65 72 20 6f 66  lways a power of
4830: 20 74 77 6f 20 67 72 65 61 74 65 72 20 74 68 61   two greater tha
4840: 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 74 68  n or equal to th
4850: 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 73  e number of.** s
4860: 65 67 6d 65 6e 74 73 20 74 68 61 74 20 74 68 69  egments that thi
4870: 73 20 6f 62 6a 65 63 74 20 69 73 20 6d 65 72 67  s object is merg
4880: 69 6e 67 20 64 61 74 61 20 66 72 6f 6d 2e 20 42  ing data from. B
4890: 6f 74 68 20 74 68 65 20 61 53 65 67 5b 5d 20 61  oth the aSeg[] a
48a0: 6e 64 0a 2a 2a 20 61 46 69 72 73 74 5b 5d 20 61  nd.** aFirst[] a
48b0: 72 72 61 79 73 20 61 72 65 20 73 69 7a 65 64 20  rrays are sized 
48c0: 61 74 20 6e 53 65 67 20 65 6e 74 72 69 65 73 2e  at nSeg entries.
48d0: 20 54 68 65 20 61 53 65 67 5b 5d 20 61 72 72 61   The aSeg[] arra
48e0: 79 20 69 73 20 70 61 64 64 65 64 0a 2a 2a 20 77  y is padded.** w
48f0: 69 74 68 20 7a 65 72 6f 65 64 20 6f 62 6a 65 63  ith zeroed objec
4900: 74 73 20 2d 20 74 68 65 73 65 20 61 72 65 20 68  ts - these are h
4910: 61 6e 64 6c 65 64 20 61 73 20 69 66 20 74 68 65  andled as if the
4920: 79 20 77 65 72 65 20 69 74 65 72 61 74 6f 72 73  y were iterators
4930: 20 6f 70 65 6e 65 64 0a 2a 2a 20 6f 6e 20 65 6d   opened.** on em
4940: 70 74 79 20 73 65 67 6d 65 6e 74 73 2e 0a 2a 2a  pty segments..**
4950: 0a 2a 2a 20 54 68 65 20 72 65 73 75 6c 74 73 20  .** The results 
4960: 6f 66 20 63 6f 6d 70 61 72 69 6e 67 20 73 65 67  of comparing seg
4970: 6d 65 6e 74 73 20 61 53 65 67 5b 4e 5d 20 61 6e  ments aSeg[N] an
4980: 64 20 61 53 65 67 5b 4e 2b 31 5d 2c 20 77 68 65  d aSeg[N+1], whe
4990: 72 65 20 4e 20 69 73 20 61 6e 0a 2a 2a 20 65 76  re N is an.** ev
49a0: 65 6e 20 6e 75 6d 62 65 72 2c 20 69 73 20 73 74  en number, is st
49b0: 6f 72 65 64 20 69 6e 20 61 46 69 72 73 74 5b 28  ored in aFirst[(
49c0: 6e 53 65 67 2b 4e 29 2f 32 5d 2e 20 54 68 65 20  nSeg+N)/2]. The 
49d0: 22 72 65 73 75 6c 74 22 20 6f 66 20 74 68 65 20  "result" of the 
49e0: 0a 2a 2a 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69  .** comparison i
49f0: 6e 20 74 68 69 73 20 63 6f 6e 74 65 78 74 20 69  n this context i
4a00: 73 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74  s the index of t
4a10: 68 65 20 69 74 65 72 61 74 6f 72 20 74 68 61 74  he iterator that
4a20: 20 63 75 72 72 65 6e 74 6c 79 0a 2a 2a 20 70 6f   currently.** po
4a30: 69 6e 74 73 20 74 6f 20 74 68 65 20 73 6d 61 6c  ints to the smal
4a40: 6c 65 72 20 74 65 72 6d 2f 72 6f 77 69 64 20 63  ler term/rowid c
4a50: 6f 6d 62 69 6e 61 74 69 6f 6e 2e 20 49 74 65 72  ombination. Iter
4a60: 61 74 6f 72 73 20 61 74 20 45 4f 46 20 61 72 65  ators at EOF are
4a70: 0a 2a 2a 20 63 6f 6e 73 69 64 65 72 65 64 20 74  .** considered t
4a80: 6f 20 62 65 20 67 72 65 61 74 65 72 20 74 68 61  o be greater tha
4a90: 6e 20 61 6c 6c 20 6f 74 68 65 72 20 69 74 65 72  n all other iter
4aa0: 61 74 6f 72 73 2e 0a 2a 2a 0a 2a 2a 20 61 46 69  ators..**.** aFi
4ab0: 72 73 74 5b 31 5d 20 63 6f 6e 74 61 69 6e 73 20  rst[1] contains 
4ac0: 74 68 65 20 69 6e 64 65 78 20 69 6e 20 61 53 65  the index in aSe
4ad0: 67 5b 5d 20 6f 66 20 74 68 65 20 69 74 65 72 61  g[] of the itera
4ae0: 74 6f 72 20 74 68 61 74 20 70 6f 69 6e 74 73 20  tor that points 
4af0: 74 6f 0a 2a 2a 20 74 68 65 20 73 6d 61 6c 6c 65  to.** the smalle
4b00: 73 74 20 6b 65 79 20 6f 76 65 72 61 6c 6c 2e 20  st key overall. 
4b10: 61 46 69 72 73 74 5b 30 5d 20 69 73 20 75 6e 75  aFirst[0] is unu
4b20: 73 65 64 2e 20 0a 2a 2a 0a 2a 2a 20 70 6f 73 6c  sed. .**.** posl
4b30: 69 73 74 3a 0a 2a 2a 20 20 20 55 73 65 64 20 62  ist:.**   Used b
4b40: 79 20 73 71 6c 69 74 65 33 46 74 73 35 49 74 65  y sqlite3Fts5Ite
4b50: 72 50 6f 73 6c 69 73 74 28 29 20 77 68 65 6e 20  rPoslist() when 
4b60: 74 68 65 20 70 6f 73 6c 69 73 74 20 6e 65 65 64  the poslist need
4b70: 73 20 74 6f 20 62 65 20 62 75 66 66 65 72 65 64  s to be buffered
4b80: 2e 0a 2a 2a 20 20 20 54 68 65 72 65 20 69 73 20  ..**   There is 
4b90: 6e 6f 20 77 61 79 20 74 6f 20 74 65 6c 6c 20 69  no way to tell i
4ba0: 66 20 74 68 69 73 20 69 73 20 70 6f 70 75 6c 61  f this is popula
4bb0: 74 65 64 20 6f 72 20 6e 6f 74 2e 0a 2a 2f 0a 73  ted or not..*/.s
4bc0: 74 72 75 63 74 20 46 74 73 35 49 74 65 72 20 7b  truct Fts5Iter {
4bd0: 0a 20 20 46 74 73 35 49 6e 64 65 78 49 74 65 72  .  Fts5IndexIter
4be0: 20 62 61 73 65 3b 20 20 20 20 20 20 20 20 20 20   base;          
4bf0: 20 20 20 2f 2a 20 42 61 73 65 20 63 6c 61 73 73     /* Base class
4c00: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 6f 75 74 70   containing outp
4c10: 75 74 20 76 61 72 73 20 2a 2f 0a 0a 20 20 46 74  ut vars */..  Ft
4c20: 73 35 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 3b  s5Index *pIndex;
4c30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
4c40: 20 49 6e 64 65 78 20 74 68 61 74 20 6f 77 6e 73   Index that owns
4c50: 20 74 68 69 73 20 69 74 65 72 61 74 6f 72 20 2a   this iterator *
4c60: 2f 0a 20 20 46 74 73 35 53 74 72 75 63 74 75 72  /.  Fts5Structur
4c70: 65 20 2a 70 53 74 72 75 63 74 3b 20 20 20 20 20  e *pStruct;     
4c80: 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
4c90: 73 74 72 75 63 74 75 72 65 20 66 6f 72 20 74 68  structure for th
4ca0: 69 73 20 69 74 65 72 61 74 6f 72 20 2a 2f 0a 20  is iterator */. 
4cb0: 20 46 74 73 35 42 75 66 66 65 72 20 70 6f 73 6c   Fts5Buffer posl
4cc0: 69 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  ist;            
4cd0: 20 2f 2a 20 42 75 66 66 65 72 20 63 6f 6e 74 61   /* Buffer conta
4ce0: 69 6e 69 6e 67 20 63 75 72 72 65 6e 74 20 70 6f  ining current po
4cf0: 73 6c 69 73 74 20 2a 2f 0a 20 20 46 74 73 35 43  slist */.  Fts5C
4d00: 6f 6c 73 65 74 20 2a 70 43 6f 6c 73 65 74 3b 20  olset *pColset; 
4d10: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
4d20: 73 74 72 69 63 74 20 6d 61 74 63 68 65 73 20 74  strict matches t
4d30: 6f 20 74 68 65 73 65 20 63 6f 6c 75 6d 6e 73 20  o these columns 
4d40: 2a 2f 0a 0a 20 20 2f 2a 20 49 6e 76 6f 6b 65 64  */..  /* Invoked
4d50: 20 74 6f 20 73 65 74 20 6f 75 74 70 75 74 20 76   to set output v
4d60: 61 72 69 61 62 6c 65 73 2e 20 2a 2f 0a 20 20 76  ariables. */.  v
4d70: 6f 69 64 20 28 2a 78 53 65 74 4f 75 74 70 75 74  oid (*xSetOutput
4d80: 73 29 28 46 74 73 35 49 74 65 72 2a 2c 20 46 74  s)(Fts5Iter*, Ft
4d90: 73 35 53 65 67 49 74 65 72 2a 29 3b 0a 0a 20 20  s5SegIter*);..  
4da0: 69 6e 74 20 6e 53 65 67 3b 20 20 20 20 20 20 20  int nSeg;       
4db0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4dc0: 2f 2a 20 53 69 7a 65 20 6f 66 20 61 53 65 67 5b  /* Size of aSeg[
4dd0: 5d 20 61 72 72 61 79 20 2a 2f 0a 20 20 69 6e 74  ] array */.  int
4de0: 20 62 52 65 76 3b 20 20 20 20 20 20 20 20 20 20   bRev;          
4df0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
4e00: 54 72 75 65 20 74 6f 20 69 74 65 72 61 74 65 20  True to iterate 
4e10: 69 6e 20 72 65 76 65 72 73 65 20 6f 72 64 65 72  in reverse order
4e20: 20 2a 2f 0a 20 20 75 38 20 62 53 6b 69 70 45 6d   */.  u8 bSkipEm
4e30: 70 74 79 3b 20 20 20 20 20 20 20 20 20 20 20 20  pty;            
4e40: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f        /* True to
4e50: 20 73 6b 69 70 20 64 65 6c 65 74 65 64 20 65 6e   skip deleted en
4e60: 74 72 69 65 73 20 2a 2f 0a 0a 20 20 69 36 34 20  tries */..  i64 
4e70: 69 53 77 69 74 63 68 52 6f 77 69 64 3b 20 20 20  iSwitchRowid;   
4e80: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
4e90: 69 72 73 74 65 73 74 20 72 6f 77 69 64 20 6f 66  irstest rowid of
4ea0: 20 6f 74 68 65 72 20 74 68 61 6e 20 61 46 69 72   other than aFir
4eb0: 73 74 5b 31 5d 20 2a 2f 0a 20 20 46 74 73 35 43  st[1] */.  Fts5C
4ec0: 52 65 73 75 6c 74 20 2a 61 46 69 72 73 74 3b 20  Result *aFirst; 
4ed0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75             /* Cu
4ee0: 72 72 65 6e 74 20 6d 65 72 67 65 20 73 74 61 74  rrent merge stat
4ef0: 65 20 28 73 65 65 20 61 62 6f 76 65 29 20 2a 2f  e (see above) */
4f00: 0a 20 20 46 74 73 35 53 65 67 49 74 65 72 20 61  .  Fts5SegIter a
4f10: 53 65 67 5b 31 5d 3b 20 20 20 20 20 20 20 20 20  Seg[1];         
4f20: 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 73     /* Array of s
4f30: 65 67 6d 65 6e 74 20 69 74 65 72 61 74 6f 72 73  egment iterators
4f40: 20 2a 2f 0a 7d 3b 0a 0a 0a 2f 2a 0a 2a 2a 20 41   */.};.../*.** A
4f50: 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68  n instance of th
4f60: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 79 70 65  e following type
4f70: 20 69 73 20 75 73 65 64 20 74 6f 20 69 74 65 72   is used to iter
4f80: 61 74 65 20 74 68 72 6f 75 67 68 20 74 68 65 20  ate through the 
4f90: 63 6f 6e 74 65 6e 74 73 0a 2a 2a 20 6f 66 20 61  contents.** of a
4fa0: 20 64 6f 63 6c 69 73 74 2d 69 6e 64 65 78 20 72   doclist-index r
4fb0: 65 63 6f 72 64 2e 0a 2a 2a 0a 2a 2a 20 70 44 61  ecord..**.** pDa
4fc0: 74 61 3a 0a 2a 2a 20 20 20 52 65 63 6f 72 64 20  ta:.**   Record 
4fd0: 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 64  containing the d
4fe0: 6f 63 6c 69 73 74 2d 69 6e 64 65 78 20 64 61 74  oclist-index dat
4ff0: 61 2e 0a 2a 2a 0a 2a 2a 20 62 45 6f 66 3a 0a 2a  a..**.** bEof:.*
5000: 2a 20 20 20 53 65 74 20 74 6f 20 74 72 75 65 20  *   Set to true 
5010: 6f 6e 63 65 20 69 74 65 72 61 74 6f 72 20 68 61  once iterator ha
5020: 73 20 72 65 61 63 68 65 64 20 45 4f 46 2e 0a 2a  s reached EOF..*
5030: 2a 0a 2a 2a 20 69 4f 66 66 3a 0a 2a 2a 20 20 20  *.** iOff:.**   
5040: 53 65 74 20 74 6f 20 74 68 65 20 63 75 72 72 65  Set to the curre
5050: 6e 74 20 6f 66 66 73 65 74 20 77 69 74 68 69 6e  nt offset within
5060: 20 72 65 63 6f 72 64 20 70 44 61 74 61 2e 0a 2a   record pData..*
5070: 2f 0a 73 74 72 75 63 74 20 46 74 73 35 44 6c 69  /.struct Fts5Dli
5080: 64 78 4c 76 6c 20 7b 0a 20 20 46 74 73 35 44 61  dxLvl {.  Fts5Da
5090: 74 61 20 2a 70 44 61 74 61 3b 20 20 20 20 20 20  ta *pData;      
50a0: 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 20          /* Data 
50b0: 66 6f 72 20 63 75 72 72 65 6e 74 20 70 61 67 65  for current page
50c0: 20 6f 66 20 74 68 69 73 20 6c 65 76 65 6c 20 2a   of this level *
50d0: 2f 0a 20 20 69 6e 74 20 69 4f 66 66 3b 20 20 20  /.  int iOff;   
50e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
50f0: 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 6f 66 66    /* Current off
5100: 73 65 74 20 69 6e 74 6f 20 70 44 61 74 61 20 2a  set into pData *
5110: 2f 0a 20 20 69 6e 74 20 62 45 6f 66 3b 20 20 20  /.  int bEof;   
5120: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5130: 20 20 2f 2a 20 41 74 20 45 4f 46 20 61 6c 72 65    /* At EOF alre
5140: 61 64 79 20 2a 2f 0a 20 20 69 6e 74 20 69 46 69  ady */.  int iFi
5150: 72 73 74 4f 66 66 3b 20 20 20 20 20 20 20 20 20  rstOff;         
5160: 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20 62         /* Used b
5170: 79 20 72 65 76 65 72 73 65 20 69 74 65 72 61 74  y reverse iterat
5180: 6f 72 73 20 2a 2f 0a 0a 20 20 2f 2a 20 4f 75 74  ors */..  /* Out
5190: 70 75 74 20 76 61 72 69 61 62 6c 65 73 20 2a 2f  put variables */
51a0: 0a 20 20 69 6e 74 20 69 4c 65 61 66 50 67 6e 6f  .  int iLeafPgno
51b0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
51c0: 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20   /* Page number 
51d0: 6f 66 20 63 75 72 72 65 6e 74 20 6c 65 61 66 20  of current leaf 
51e0: 70 61 67 65 20 2a 2f 0a 20 20 69 36 34 20 69 52  page */.  i64 iR
51f0: 6f 77 69 64 3b 20 20 20 20 20 20 20 20 20 20 20  owid;           
5200: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
5210: 20 72 6f 77 69 64 20 6f 6e 20 6c 65 61 66 20 69   rowid on leaf i
5220: 4c 65 61 66 50 67 6e 6f 20 2a 2f 0a 7d 3b 0a 73  LeafPgno */.};.s
5230: 74 72 75 63 74 20 46 74 73 35 44 6c 69 64 78 49  truct Fts5DlidxI
5240: 74 65 72 20 7b 0a 20 20 69 6e 74 20 6e 4c 76 6c  ter {.  int nLvl
5250: 3b 0a 20 20 69 6e 74 20 69 53 65 67 69 64 3b 0a  ;.  int iSegid;.
5260: 20 20 46 74 73 35 44 6c 69 64 78 4c 76 6c 20 61    Fts5DlidxLvl a
5270: 4c 76 6c 5b 31 5d 3b 0a 7d 3b 0a 0a 73 74 61 74  Lvl[1];.};..stat
5280: 69 63 20 76 6f 69 64 20 66 74 73 35 50 75 74 55  ic void fts5PutU
5290: 31 36 28 75 38 20 2a 61 4f 75 74 2c 20 75 31 36  16(u8 *aOut, u16
52a0: 20 69 56 61 6c 29 7b 0a 20 20 61 4f 75 74 5b 30   iVal){.  aOut[0
52b0: 5d 20 3d 20 28 69 56 61 6c 3e 3e 38 29 3b 0a 20  ] = (iVal>>8);. 
52c0: 20 61 4f 75 74 5b 31 5d 20 3d 20 28 69 56 61 6c   aOut[1] = (iVal
52d0: 26 30 78 46 46 29 3b 0a 7d 0a 0a 73 74 61 74 69  &0xFF);.}..stati
52e0: 63 20 75 31 36 20 66 74 73 35 47 65 74 55 31 36  c u16 fts5GetU16
52f0: 28 63 6f 6e 73 74 20 75 38 20 2a 61 49 6e 29 7b  (const u8 *aIn){
5300: 0a 20 20 72 65 74 75 72 6e 20 28 28 75 31 36 29  .  return ((u16)
5310: 61 49 6e 5b 30 5d 20 3c 3c 20 38 29 20 2b 20 61  aIn[0] << 8) + a
5320: 49 6e 5b 31 5d 3b 0a 7d 20 0a 0a 2f 2a 0a 2a 2a  In[1];.} ../*.**
5330: 20 41 6c 6c 6f 63 61 74 65 20 61 6e 64 20 72 65   Allocate and re
5340: 74 75 72 6e 20 61 20 62 75 66 66 65 72 20 61 74  turn a buffer at
5350: 20 6c 65 61 73 74 20 6e 42 79 74 65 20 62 79 74   least nByte byt
5360: 65 73 20 69 6e 20 73 69 7a 65 2e 0a 2a 2a 0a 2a  es in size..**.*
5370: 2a 20 49 66 20 61 6e 20 4f 4f 4d 20 65 72 72 6f  * If an OOM erro
5380: 72 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64  r is encountered
5390: 2c 20 72 65 74 75 72 6e 20 4e 55 4c 4c 20 61 6e  , return NULL an
53a0: 64 20 73 65 74 20 74 68 65 20 65 72 72 6f 72 20  d set the error 
53b0: 63 6f 64 65 20 69 6e 0a 2a 2a 20 74 68 65 20 46  code in.** the F
53c0: 74 73 35 49 6e 64 65 78 20 68 61 6e 64 6c 65 20  ts5Index handle 
53d0: 70 61 73 73 65 64 20 61 73 20 74 68 65 20 66 69  passed as the fi
53e0: 72 73 74 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f  rst argument..*/
53f0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 2a 66 74  .static void *ft
5400: 73 35 49 64 78 4d 61 6c 6c 6f 63 28 46 74 73 35  s5IdxMalloc(Fts5
5410: 49 6e 64 65 78 20 2a 70 2c 20 69 6e 74 20 6e 42  Index *p, int nB
5420: 79 74 65 29 7b 0a 20 20 72 65 74 75 72 6e 20 73  yte){.  return s
5430: 71 6c 69 74 65 33 46 74 73 35 4d 61 6c 6c 6f 63  qlite3Fts5Malloc
5440: 5a 65 72 6f 28 26 70 2d 3e 72 63 2c 20 6e 42 79  Zero(&p->rc, nBy
5450: 74 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f  te);.}../*.** Co
5460: 6d 70 61 72 65 20 74 68 65 20 63 6f 6e 74 65 6e  mpare the conten
5470: 74 73 20 6f 66 20 74 68 65 20 70 4c 65 66 74 20  ts of the pLeft 
5480: 62 75 66 66 65 72 20 77 69 74 68 20 74 68 65 20  buffer with the 
5490: 70 52 69 67 68 74 2f 6e 52 69 67 68 74 20 62 6c  pRight/nRight bl
54a0: 6f 62 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  ob..**.** Return
54b0: 20 2d 76 65 20 69 66 20 70 4c 65 66 74 20 69 73   -ve if pLeft is
54c0: 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 70 52   smaller than pR
54d0: 69 67 68 74 2c 20 30 20 69 66 20 74 68 65 79 20  ight, 0 if they 
54e0: 61 72 65 20 65 71 75 61 6c 20 6f 72 0a 2a 2a 20  are equal or.** 
54f0: 2b 76 65 20 69 66 20 70 52 69 67 68 74 20 69 73  +ve if pRight is
5500: 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 70 4c   smaller than pL
5510: 65 66 74 2e 20 49 6e 20 6f 74 68 65 72 20 77 6f  eft. In other wo
5520: 72 64 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 72  rds:.**.**     r
5530: 65 73 20 3d 20 2a 70 4c 65 66 74 20 2d 20 2a 70  es = *pLeft - *p
5540: 52 69 67 68 74 0a 2a 2f 0a 23 69 66 64 65 66 20  Right.*/.#ifdef 
5550: 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 73 74 61  SQLITE_DEBUG.sta
5560: 74 69 63 20 69 6e 74 20 66 74 73 35 42 75 66 66  tic int fts5Buff
5570: 65 72 43 6f 6d 70 61 72 65 42 6c 6f 62 28 0a 20  erCompareBlob(. 
5580: 20 46 74 73 35 42 75 66 66 65 72 20 2a 70 4c 65   Fts5Buffer *pLe
5590: 66 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ft,             
55a0: 20 2f 2a 20 4c 65 66 74 20 68 61 6e 64 20 73 69   /* Left hand si
55b0: 64 65 20 6f 66 20 63 6f 6d 70 61 72 69 73 6f 6e  de of comparison
55c0: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a   */.  const u8 *
55d0: 70 52 69 67 68 74 2c 20 69 6e 74 20 6e 52 69 67  pRight, int nRig
55e0: 68 74 20 20 20 20 2f 2a 20 52 69 67 68 74 20 68  ht    /* Right h
55f0: 61 6e 64 20 73 69 64 65 20 6f 66 20 63 6f 6d 70  and side of comp
5600: 61 72 69 73 6f 6e 20 2a 2f 0a 29 7b 0a 20 20 69  arison */.){.  i
5610: 6e 74 20 6e 43 6d 70 20 3d 20 4d 49 4e 28 70 4c  nt nCmp = MIN(pL
5620: 65 66 74 2d 3e 6e 2c 20 6e 52 69 67 68 74 29 3b  eft->n, nRight);
5630: 0a 20 20 69 6e 74 20 72 65 73 20 3d 20 6d 65 6d  .  int res = mem
5640: 63 6d 70 28 70 4c 65 66 74 2d 3e 70 2c 20 70 52  cmp(pLeft->p, pR
5650: 69 67 68 74 2c 20 6e 43 6d 70 29 3b 0a 20 20 72  ight, nCmp);.  r
5660: 65 74 75 72 6e 20 28 72 65 73 3d 3d 30 20 3f 20  eturn (res==0 ? 
5670: 28 70 4c 65 66 74 2d 3e 6e 20 2d 20 6e 52 69 67  (pLeft->n - nRig
5680: 68 74 29 20 3a 20 72 65 73 29 3b 0a 7d 0a 23 65  ht) : res);.}.#e
5690: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70  ndif../*.** Comp
56a0: 61 72 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  are the contents
56b0: 20 6f 66 20 74 68 65 20 74 77 6f 20 62 75 66 66   of the two buff
56c0: 65 72 73 20 75 73 69 6e 67 20 6d 65 6d 63 6d 70  ers using memcmp
56d0: 28 29 2e 20 49 66 20 6f 6e 65 20 62 75 66 66 65  (). If one buffe
56e0: 72 0a 2a 2a 20 69 73 20 61 20 70 72 65 66 69 78  r.** is a prefix
56f0: 20 6f 66 20 74 68 65 20 6f 74 68 65 72 2c 20 69   of the other, i
5700: 74 20 69 73 20 63 6f 6e 73 69 64 65 72 65 64 20  t is considered 
5710: 74 68 65 20 6c 65 73 73 65 72 2e 0a 2a 2a 0a 2a  the lesser..**.*
5720: 2a 20 52 65 74 75 72 6e 20 2d 76 65 20 69 66 20  * Return -ve if 
5730: 70 4c 65 66 74 20 69 73 20 73 6d 61 6c 6c 65 72  pLeft is smaller
5740: 20 74 68 61 6e 20 70 52 69 67 68 74 2c 20 30 20   than pRight, 0 
5750: 69 66 20 74 68 65 79 20 61 72 65 20 65 71 75 61  if they are equa
5760: 6c 20 6f 72 0a 2a 2a 20 2b 76 65 20 69 66 20 70  l or.** +ve if p
5770: 52 69 67 68 74 20 69 73 20 73 6d 61 6c 6c 65 72  Right is smaller
5780: 20 74 68 61 6e 20 70 4c 65 66 74 2e 20 49 6e 20   than pLeft. In 
5790: 6f 74 68 65 72 20 77 6f 72 64 73 3a 0a 2a 2a 0a  other words:.**.
57a0: 2a 2a 20 20 20 20 20 72 65 73 20 3d 20 2a 70 4c  **     res = *pL
57b0: 65 66 74 20 2d 20 2a 70 52 69 67 68 74 0a 2a 2f  eft - *pRight.*/
57c0: 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 35  .static int fts5
57d0: 42 75 66 66 65 72 43 6f 6d 70 61 72 65 28 46 74  BufferCompare(Ft
57e0: 73 35 42 75 66 66 65 72 20 2a 70 4c 65 66 74 2c  s5Buffer *pLeft,
57f0: 20 46 74 73 35 42 75 66 66 65 72 20 2a 70 52 69   Fts5Buffer *pRi
5800: 67 68 74 29 7b 0a 20 20 69 6e 74 20 6e 43 6d 70  ght){.  int nCmp
5810: 20 3d 20 4d 49 4e 28 70 4c 65 66 74 2d 3e 6e 2c   = MIN(pLeft->n,
5820: 20 70 52 69 67 68 74 2d 3e 6e 29 3b 0a 20 20 69   pRight->n);.  i
5830: 6e 74 20 72 65 73 20 3d 20 6d 65 6d 63 6d 70 28  nt res = memcmp(
5840: 70 4c 65 66 74 2d 3e 70 2c 20 70 52 69 67 68 74  pLeft->p, pRight
5850: 2d 3e 70 2c 20 6e 43 6d 70 29 3b 0a 20 20 72 65  ->p, nCmp);.  re
5860: 74 75 72 6e 20 28 72 65 73 3d 3d 30 20 3f 20 28  turn (res==0 ? (
5870: 70 4c 65 66 74 2d 3e 6e 20 2d 20 70 52 69 67 68  pLeft->n - pRigh
5880: 74 2d 3e 6e 29 20 3a 20 72 65 73 29 3b 0a 7d 0a  t->n) : res);.}.
5890: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
58a0: 45 42 55 47 0a 73 74 61 74 69 63 20 69 6e 74 20  EBUG.static int 
58b0: 66 74 73 35 42 6c 6f 62 43 6f 6d 70 61 72 65 28  fts5BlobCompare(
58c0: 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 70 4c 65  .  const u8 *pLe
58d0: 66 74 2c 20 69 6e 74 20 6e 4c 65 66 74 2c 20 0a  ft, int nLeft, .
58e0: 20 20 63 6f 6e 73 74 20 75 38 20 2a 70 52 69 67    const u8 *pRig
58f0: 68 74 2c 20 69 6e 74 20 6e 52 69 67 68 74 0a 29  ht, int nRight.)
5900: 7b 0a 20 20 69 6e 74 20 6e 43 6d 70 20 3d 20 4d  {.  int nCmp = M
5910: 49 4e 28 6e 4c 65 66 74 2c 20 6e 52 69 67 68 74  IN(nLeft, nRight
5920: 29 3b 0a 20 20 69 6e 74 20 72 65 73 20 3d 20 6d  );.  int res = m
5930: 65 6d 63 6d 70 28 70 4c 65 66 74 2c 20 70 52 69  emcmp(pLeft, pRi
5940: 67 68 74 2c 20 6e 43 6d 70 29 3b 0a 20 20 72 65  ght, nCmp);.  re
5950: 74 75 72 6e 20 28 72 65 73 3d 3d 30 20 3f 20 28  turn (res==0 ? (
5960: 6e 4c 65 66 74 20 2d 20 6e 52 69 67 68 74 29 20  nLeft - nRight) 
5970: 3a 20 72 65 73 29 3b 0a 7d 0a 23 65 6e 64 69 66  : res);.}.#endif
5980: 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73  ..static int fts
5990: 35 4c 65 61 66 46 69 72 73 74 54 65 72 6d 4f 66  5LeafFirstTermOf
59a0: 66 28 46 74 73 35 44 61 74 61 20 2a 70 4c 65 61  f(Fts5Data *pLea
59b0: 66 29 7b 0a 20 20 69 6e 74 20 72 65 74 3b 0a 20  f){.  int ret;. 
59c0: 20 66 74 73 35 47 65 74 56 61 72 69 6e 74 33 32   fts5GetVarint32
59d0: 28 26 70 4c 65 61 66 2d 3e 70 5b 70 4c 65 61 66  (&pLeaf->p[pLeaf
59e0: 2d 3e 73 7a 4c 65 61 66 5d 2c 20 72 65 74 29 3b  ->szLeaf], ret);
59f0: 0a 20 20 72 65 74 75 72 6e 20 72 65 74 3b 0a 7d  .  return ret;.}
5a00: 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 74 68  ../*.** Close th
5a10: 65 20 72 65 61 64 2d 6f 6e 6c 79 20 62 6c 6f 62  e read-only blob
5a20: 20 68 61 6e 64 6c 65 2c 20 69 66 20 69 74 20 69   handle, if it i
5a30: 73 20 6f 70 65 6e 2e 0a 2a 2f 0a 73 74 61 74 69  s open..*/.stati
5a40: 63 20 76 6f 69 64 20 66 74 73 35 43 6c 6f 73 65  c void fts5Close
5a50: 52 65 61 64 65 72 28 46 74 73 35 49 6e 64 65 78  Reader(Fts5Index
5a60: 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e 70   *p){.  if( p->p
5a70: 52 65 61 64 65 72 20 29 7b 0a 20 20 20 20 73 71  Reader ){.    sq
5a80: 6c 69 74 65 33 5f 62 6c 6f 62 20 2a 70 52 65 61  lite3_blob *pRea
5a90: 64 65 72 20 3d 20 70 2d 3e 70 52 65 61 64 65 72  der = p->pReader
5aa0: 3b 0a 20 20 20 20 70 2d 3e 70 52 65 61 64 65 72  ;.    p->pReader
5ab0: 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65   = 0;.    sqlite
5ac0: 33 5f 62 6c 6f 62 5f 63 6c 6f 73 65 28 70 52 65  3_blob_close(pRe
5ad0: 61 64 65 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f  ader);.  }.}.../
5ae0: 2a 0a 2a 2a 20 52 65 74 72 69 65 76 65 20 61 20  *.** Retrieve a 
5af0: 72 65 63 6f 72 64 20 66 72 6f 6d 20 74 68 65 20  record from the 
5b00: 25 5f 64 61 74 61 20 74 61 62 6c 65 2e 0a 2a 2a  %_data table..**
5b10: 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20  .** If an error 
5b20: 6f 63 63 75 72 73 2c 20 4e 55 4c 4c 20 69 73 20  occurs, NULL is 
5b30: 72 65 74 75 72 6e 65 64 20 61 6e 64 20 61 6e 20  returned and an 
5b40: 65 72 72 6f 72 20 6c 65 66 74 20 69 6e 20 74 68  error left in th
5b50: 65 20 0a 2a 2a 20 46 74 73 35 49 6e 64 65 78 20  e .** Fts5Index 
5b60: 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 73 74 61 74 69  object..*/.stati
5b70: 63 20 46 74 73 35 44 61 74 61 20 2a 66 74 73 35  c Fts5Data *fts5
5b80: 44 61 74 61 52 65 61 64 28 46 74 73 35 49 6e 64  DataRead(Fts5Ind
5b90: 65 78 20 2a 70 2c 20 69 36 34 20 69 52 6f 77 69  ex *p, i64 iRowi
5ba0: 64 29 7b 0a 20 20 46 74 73 35 44 61 74 61 20 2a  d){.  Fts5Data *
5bb0: 70 52 65 74 20 3d 20 30 3b 0a 20 20 69 66 28 20  pRet = 0;.  if( 
5bc0: 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
5bd0: 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 20 3d   ){.    int rc =
5be0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 20   SQLITE_OK;..   
5bf0: 20 69 66 28 20 70 2d 3e 70 52 65 61 64 65 72 20   if( p->pReader 
5c00: 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73  ){.      /* This
5c10: 20 63 61 6c 6c 20 6d 61 79 20 72 65 74 75 72 6e   call may return
5c20: 20 53 51 4c 49 54 45 5f 41 42 4f 52 54 20 69 66   SQLITE_ABORT if
5c30: 20 74 68 65 72 65 20 68 61 73 20 62 65 65 6e 20   there has been 
5c40: 61 20 73 61 76 65 70 6f 69 6e 74 0a 20 20 20 20  a savepoint.    
5c50: 20 20 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 73 69    ** rollback si
5c60: 6e 63 65 20 69 74 20 77 61 73 20 6c 61 73 74 20  nce it was last 
5c70: 75 73 65 64 2e 20 49 6e 20 74 68 69 73 20 63 61  used. In this ca
5c80: 73 65 20 61 20 6e 65 77 20 62 6c 6f 62 20 68 61  se a new blob ha
5c90: 6e 64 6c 65 0a 20 20 20 20 20 20 2a 2a 20 69 73  ndle.      ** is
5ca0: 20 72 65 71 75 69 72 65 64 2e 20 20 2a 2f 0a 20   required.  */. 
5cb0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62 6c 6f       sqlite3_blo
5cc0: 62 20 2a 70 42 6c 6f 62 20 3d 20 70 2d 3e 70 52  b *pBlob = p->pR
5cd0: 65 61 64 65 72 3b 0a 20 20 20 20 20 20 70 2d 3e  eader;.      p->
5ce0: 70 52 65 61 64 65 72 20 3d 20 30 3b 0a 20 20 20  pReader = 0;.   
5cf0: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f     rc = sqlite3_
5d00: 62 6c 6f 62 5f 72 65 6f 70 65 6e 28 70 42 6c 6f  blob_reopen(pBlo
5d10: 62 2c 20 69 52 6f 77 69 64 29 3b 0a 20 20 20 20  b, iRowid);.    
5d20: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 52 65    assert( p->pRe
5d30: 61 64 65 72 3d 3d 30 20 29 3b 0a 20 20 20 20 20  ader==0 );.     
5d40: 20 70 2d 3e 70 52 65 61 64 65 72 20 3d 20 70 42   p->pReader = pB
5d50: 6c 6f 62 3b 0a 20 20 20 20 20 20 69 66 28 20 72  lob;.      if( r
5d60: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
5d70: 20 20 20 20 20 20 20 20 66 74 73 35 43 6c 6f 73          fts5Clos
5d80: 65 52 65 61 64 65 72 28 70 29 3b 0a 20 20 20 20  eReader(p);.    
5d90: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63    }.      if( rc
5da0: 3d 3d 53 51 4c 49 54 45 5f 41 42 4f 52 54 20 29  ==SQLITE_ABORT )
5db0: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
5dc0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49  .    }..    /* I
5dd0: 66 20 74 68 65 20 62 6c 6f 62 20 68 61 6e 64 6c  f the blob handl
5de0: 65 20 69 73 20 6e 6f 74 20 6f 70 65 6e 20 61 74  e is not open at
5df0: 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 6f 70 65   this point, ope
5e00: 6e 20 69 74 20 61 6e 64 20 73 65 65 6b 20 0a 20  n it and seek . 
5e10: 20 20 20 2a 2a 20 74 6f 20 74 68 65 20 72 65 71     ** to the req
5e20: 75 65 73 74 65 64 20 65 6e 74 72 79 2e 20 20 2a  uested entry.  *
5e30: 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 52 65  /.    if( p->pRe
5e40: 61 64 65 72 3d 3d 30 20 26 26 20 72 63 3d 3d 53  ader==0 && rc==S
5e50: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
5e60: 20 20 46 74 73 35 43 6f 6e 66 69 67 20 2a 70 43    Fts5Config *pC
5e70: 6f 6e 66 69 67 20 3d 20 70 2d 3e 70 43 6f 6e 66  onfig = p->pConf
5e80: 69 67 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73  ig;.      rc = s
5e90: 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 6f 70 65 6e  qlite3_blob_open
5ea0: 28 70 43 6f 6e 66 69 67 2d 3e 64 62 2c 20 0a 20  (pConfig->db, . 
5eb0: 20 20 20 20 20 20 20 20 20 70 43 6f 6e 66 69 67           pConfig
5ec0: 2d 3e 7a 44 62 2c 20 70 2d 3e 7a 44 61 74 61 54  ->zDb, p->zDataT
5ed0: 62 6c 2c 20 22 62 6c 6f 63 6b 22 2c 20 69 52 6f  bl, "block", iRo
5ee0: 77 69 64 2c 20 30 2c 20 26 70 2d 3e 70 52 65 61  wid, 0, &p->pRea
5ef0: 64 65 72 0a 20 20 20 20 20 20 29 3b 0a 20 20 20  der.      );.   
5f00: 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 65 69   }..    /* If ei
5f10: 74 68 65 72 20 6f 66 20 74 68 65 20 73 71 6c 69  ther of the sqli
5f20: 74 65 33 5f 62 6c 6f 62 5f 6f 70 65 6e 28 29 20  te3_blob_open() 
5f30: 6f 72 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f  or sqlite3_blob_
5f40: 72 65 6f 70 65 6e 28 29 20 63 61 6c 6c 73 0a 20  reopen() calls. 
5f50: 20 20 20 2a 2a 20 61 62 6f 76 65 20 72 65 74 75     ** above retu
5f60: 72 6e 65 64 20 53 51 4c 49 54 45 5f 45 52 52 4f  rned SQLITE_ERRO
5f70: 52 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  R, return SQLITE
5f80: 5f 43 4f 52 52 55 50 54 5f 56 54 41 42 20 69 6e  _CORRUPT_VTAB in
5f90: 73 74 65 61 64 2e 0a 20 20 20 20 2a 2a 20 41 6c  stead..    ** Al
5fa0: 6c 20 74 68 65 20 72 65 61 73 6f 6e 73 20 74 68  l the reasons th
5fb0: 6f 73 65 20 66 75 6e 63 74 69 6f 6e 73 20 6d 69  ose functions mi
5fc0: 67 68 74 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ght return SQLIT
5fd0: 45 5f 45 52 52 4f 52 20 2d 20 6d 69 73 73 69 6e  E_ERROR - missin
5fe0: 67 0a 20 20 20 20 2a 2a 20 74 61 62 6c 65 2c 20  g.    ** table, 
5ff0: 6d 69 73 73 69 6e 67 20 72 6f 77 2c 20 6e 6f 6e  missing row, non
6000: 2d 62 6c 6f 62 2f 74 65 78 74 20 69 6e 20 62 6c  -blob/text in bl
6010: 6f 63 6b 20 63 6f 6c 75 6d 6e 20 2d 20 69 6e 64  ock column - ind
6020: 69 63 61 74 65 20 0a 20 20 20 20 2a 2a 20 62 61  icate .    ** ba
6030: 63 6b 69 6e 67 20 73 74 6f 72 65 20 63 6f 72 72  cking store corr
6040: 75 70 74 69 6f 6e 2e 20 20 2a 2f 0a 20 20 20 20  uption.  */.    
6050: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 45  if( rc==SQLITE_E
6060: 52 52 4f 52 20 29 20 72 63 20 3d 20 46 54 53 35  RROR ) rc = FTS5
6070: 5f 43 4f 52 52 55 50 54 3b 0a 0a 20 20 20 20 69  _CORRUPT;..    i
6080: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
6090: 20 29 7b 0a 20 20 20 20 20 20 75 38 20 2a 61 4f   ){.      u8 *aO
60a0: 75 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ut = 0;         
60b0: 20 20 20 20 20 20 2f 2a 20 52 65 61 64 20 62 6c        /* Read bl
60c0: 6f 62 20 64 61 74 61 20 69 6e 74 6f 20 74 68 69  ob data into thi
60d0: 73 20 62 75 66 66 65 72 20 2a 2f 0a 20 20 20 20  s buffer */.    
60e0: 20 20 69 6e 74 20 6e 42 79 74 65 20 3d 20 73 71    int nByte = sq
60f0: 6c 69 74 65 33 5f 62 6c 6f 62 5f 62 79 74 65 73  lite3_blob_bytes
6100: 28 70 2d 3e 70 52 65 61 64 65 72 29 3b 0a 20 20  (p->pReader);.  
6110: 20 20 20 20 69 6e 74 20 6e 41 6c 6c 6f 63 20 3d      int nAlloc =
6120: 20 73 69 7a 65 6f 66 28 46 74 73 35 44 61 74 61   sizeof(Fts5Data
6130: 29 20 2b 20 6e 42 79 74 65 20 2b 20 46 54 53 35  ) + nByte + FTS5
6140: 5f 44 41 54 41 5f 50 41 44 44 49 4e 47 3b 0a 20  _DATA_PADDING;. 
6150: 20 20 20 20 20 70 52 65 74 20 3d 20 28 46 74 73       pRet = (Fts
6160: 35 44 61 74 61 2a 29 73 71 6c 69 74 65 33 5f 6d  5Data*)sqlite3_m
6170: 61 6c 6c 6f 63 28 6e 41 6c 6c 6f 63 29 3b 0a 20  alloc(nAlloc);. 
6180: 20 20 20 20 20 69 66 28 20 70 52 65 74 20 29 7b       if( pRet ){
6190: 0a 20 20 20 20 20 20 20 20 70 52 65 74 2d 3e 6e  .        pRet->n
61a0: 6e 20 3d 20 6e 42 79 74 65 3b 0a 20 20 20 20 20  n = nByte;.     
61b0: 20 20 20 61 4f 75 74 20 3d 20 70 52 65 74 2d 3e     aOut = pRet->
61c0: 70 20 3d 20 28 75 38 2a 29 26 70 52 65 74 5b 31  p = (u8*)&pRet[1
61d0: 5d 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  ];.      }else{.
61e0: 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
61f0: 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20  ITE_NOMEM;.     
6200: 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 72 63   }..      if( rc
6210: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
6220: 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
6230: 74 65 33 5f 62 6c 6f 62 5f 72 65 61 64 28 70 2d  te3_blob_read(p-
6240: 3e 70 52 65 61 64 65 72 2c 20 61 4f 75 74 2c 20  >pReader, aOut, 
6250: 6e 42 79 74 65 2c 20 30 29 3b 0a 20 20 20 20 20  nByte, 0);.     
6260: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63 21   }.      if( rc!
6270: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
6280: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
6290: 65 65 28 70 52 65 74 29 3b 0a 20 20 20 20 20 20  ee(pRet);.      
62a0: 20 20 70 52 65 74 20 3d 20 30 3b 0a 20 20 20 20    pRet = 0;.    
62b0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
62c0: 20 2f 2a 20 54 4f 44 4f 31 3a 20 46 69 78 20 74   /* TODO1: Fix t
62d0: 68 69 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 70  his */.        p
62e0: 52 65 74 2d 3e 73 7a 4c 65 61 66 20 3d 20 66 74  Ret->szLeaf = ft
62f0: 73 35 47 65 74 55 31 36 28 26 70 52 65 74 2d 3e  s5GetU16(&pRet->
6300: 70 5b 32 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20  p[2]);.      }. 
6310: 20 20 20 7d 0a 20 20 20 20 70 2d 3e 72 63 20 3d     }.    p->rc =
6320: 20 72 63 3b 0a 20 20 20 20 70 2d 3e 6e 52 65 61   rc;.    p->nRea
6330: 64 2b 2b 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65  d++;.  }..  asse
6340: 72 74 28 20 28 70 52 65 74 3d 3d 30 29 3d 3d 28  rt( (pRet==0)==(
6350: 70 2d 3e 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc!=SQLITE_OK
6360: 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 52  ) );.  return pR
6370: 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c  et;.}../*.** Rel
6380: 65 61 73 65 20 61 20 72 65 66 65 72 65 6e 63 65  ease a reference
6390: 20 74 6f 20 64 61 74 61 20 72 65 63 6f 72 64 20   to data record 
63a0: 72 65 74 75 72 6e 65 64 20 62 79 20 61 6e 20 65  returned by an e
63b0: 61 72 6c 69 65 72 20 63 61 6c 6c 20 74 6f 0a 2a  arlier call to.*
63c0: 2a 20 66 74 73 35 44 61 74 61 52 65 61 64 28 29  * fts5DataRead()
63d0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
63e0: 20 66 74 73 35 44 61 74 61 52 65 6c 65 61 73 65   fts5DataRelease
63f0: 28 46 74 73 35 44 61 74 61 20 2a 70 44 61 74 61  (Fts5Data *pData
6400: 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  ){.  sqlite3_fre
6410: 65 28 70 44 61 74 61 29 3b 0a 7d 0a 0a 73 74 61  e(pData);.}..sta
6420: 74 69 63 20 69 6e 74 20 66 74 73 35 49 6e 64 65  tic int fts5Inde
6430: 78 50 72 65 70 61 72 65 53 74 6d 74 28 0a 20 20  xPrepareStmt(.  
6440: 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 0a 20 20  Fts5Index *p,.  
6450: 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 2a 70  sqlite3_stmt **p
6460: 70 53 74 6d 74 2c 0a 20 20 63 68 61 72 20 2a 7a  pStmt,.  char *z
6470: 53 71 6c 0a 29 7b 0a 20 20 69 66 28 20 70 2d 3e  Sql.){.  if( p->
6480: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
6490: 0a 20 20 20 20 69 66 28 20 7a 53 71 6c 20 29 7b  .    if( zSql ){
64a0: 0a 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 73  .      p->rc = s
64b0: 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76  qlite3_prepare_v
64c0: 32 28 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e 64 62  2(p->pConfig->db
64d0: 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20 70 70 53 74  , zSql, -1, ppSt
64e0: 6d 74 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73  mt, 0);.    }els
64f0: 65 7b 0a 20 20 20 20 20 20 70 2d 3e 72 63 20 3d  e{.      p->rc =
6500: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
6510: 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74     }.  }.  sqlit
6520: 65 33 5f 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20  e3_free(zSql);. 
6530: 20 72 65 74 75 72 6e 20 70 2d 3e 72 63 3b 0a 7d   return p->rc;.}
6540: 0a 0a 0a 2f 2a 0a 2a 2a 20 49 4e 53 45 52 54 20  .../*.** INSERT 
6550: 4f 52 20 52 45 50 4c 41 43 45 20 61 20 72 65 63  OR REPLACE a rec
6560: 6f 72 64 20 69 6e 74 6f 20 74 68 65 20 25 5f 64  ord into the %_d
6570: 61 74 61 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74  ata table..*/.st
6580: 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 44 61  atic void fts5Da
6590: 74 61 57 72 69 74 65 28 46 74 73 35 49 6e 64 65  taWrite(Fts5Inde
65a0: 78 20 2a 70 2c 20 69 36 34 20 69 52 6f 77 69 64  x *p, i64 iRowid
65b0: 2c 20 63 6f 6e 73 74 20 75 38 20 2a 70 44 61 74  , const u8 *pDat
65c0: 61 2c 20 69 6e 74 20 6e 44 61 74 61 29 7b 0a 20  a, int nData){. 
65d0: 20 69 66 28 20 70 2d 3e 72 63 21 3d 53 51 4c 49   if( p->rc!=SQLI
65e0: 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 3b 0a  TE_OK ) return;.
65f0: 0a 20 20 69 66 28 20 70 2d 3e 70 57 72 69 74 65  .  if( p->pWrite
6600: 72 3d 3d 30 20 29 7b 0a 20 20 20 20 46 74 73 35  r==0 ){.    Fts5
6610: 43 6f 6e 66 69 67 20 2a 70 43 6f 6e 66 69 67 20  Config *pConfig 
6620: 3d 20 70 2d 3e 70 43 6f 6e 66 69 67 3b 0a 20 20  = p->pConfig;.  
6630: 20 20 66 74 73 35 49 6e 64 65 78 50 72 65 70 61    fts5IndexPrepa
6640: 72 65 53 74 6d 74 28 70 2c 20 26 70 2d 3e 70 57  reStmt(p, &p->pW
6650: 72 69 74 65 72 2c 20 73 71 6c 69 74 65 33 5f 6d  riter, sqlite3_m
6660: 70 72 69 6e 74 66 28 0a 20 20 20 20 20 20 20 20  printf(.        
6670: 20 20 22 52 45 50 4c 41 43 45 20 49 4e 54 4f 20    "REPLACE INTO 
6680: 27 25 71 27 2e 27 25 71 5f 64 61 74 61 27 28 69  '%q'.'%q_data'(i
6690: 64 2c 20 62 6c 6f 63 6b 29 20 56 41 4c 55 45 53  d, block) VALUES
66a0: 28 3f 2c 3f 29 22 2c 20 0a 20 20 20 20 20 20 20  (?,?)", .       
66b0: 20 20 20 70 43 6f 6e 66 69 67 2d 3e 7a 44 62 2c     pConfig->zDb,
66c0: 20 70 43 6f 6e 66 69 67 2d 3e 7a 4e 61 6d 65 0a   pConfig->zName.
66d0: 20 20 20 20 29 29 3b 0a 20 20 20 20 69 66 28 20      ));.    if( 
66e0: 70 2d 3e 72 63 20 29 20 72 65 74 75 72 6e 3b 0a  p->rc ) return;.
66f0: 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33 5f 62    }..  sqlite3_b
6700: 69 6e 64 5f 69 6e 74 36 34 28 70 2d 3e 70 57 72  ind_int64(p->pWr
6710: 69 74 65 72 2c 20 31 2c 20 69 52 6f 77 69 64 29  iter, 1, iRowid)
6720: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64  ;.  sqlite3_bind
6730: 5f 62 6c 6f 62 28 70 2d 3e 70 57 72 69 74 65 72  _blob(p->pWriter
6740: 2c 20 32 2c 20 70 44 61 74 61 2c 20 6e 44 61 74  , 2, pData, nDat
6750: 61 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43  a, SQLITE_STATIC
6760: 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 65  );.  sqlite3_ste
6770: 70 28 70 2d 3e 70 57 72 69 74 65 72 29 3b 0a 20  p(p->pWriter);. 
6780: 20 70 2d 3e 72 63 20 3d 20 73 71 6c 69 74 65 33   p->rc = sqlite3
6790: 5f 72 65 73 65 74 28 70 2d 3e 70 57 72 69 74 65  _reset(p->pWrite
67a0: 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 78 65  r);.}../*.** Exe
67b0: 63 75 74 65 20 74 68 65 20 66 6f 6c 6c 6f 77 69  cute the followi
67c0: 6e 67 20 53 51 4c 3a 0a 2a 2a 0a 2a 2a 20 20 20  ng SQL:.**.**   
67d0: 20 20 44 45 4c 45 54 45 20 46 52 4f 4d 20 25 5f    DELETE FROM %_
67e0: 64 61 74 61 20 57 48 45 52 45 20 69 64 20 42 45  data WHERE id BE
67f0: 54 57 45 45 4e 20 24 69 46 69 72 73 74 20 41 4e  TWEEN $iFirst AN
6800: 44 20 24 69 4c 61 73 74 0a 2a 2f 0a 73 74 61 74  D $iLast.*/.stat
6810: 69 63 20 76 6f 69 64 20 66 74 73 35 44 61 74 61  ic void fts5Data
6820: 44 65 6c 65 74 65 28 46 74 73 35 49 6e 64 65 78  Delete(Fts5Index
6830: 20 2a 70 2c 20 69 36 34 20 69 46 69 72 73 74 2c   *p, i64 iFirst,
6840: 20 69 36 34 20 69 4c 61 73 74 29 7b 0a 20 20 69   i64 iLast){.  i
6850: 66 28 20 70 2d 3e 72 63 21 3d 53 51 4c 49 54 45  f( p->rc!=SQLITE
6860: 5f 4f 4b 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20  _OK ) return;.. 
6870: 20 69 66 28 20 70 2d 3e 70 44 65 6c 65 74 65 72   if( p->pDeleter
6880: 3d 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 72  ==0 ){.    int r
6890: 63 3b 0a 20 20 20 20 46 74 73 35 43 6f 6e 66 69  c;.    Fts5Confi
68a0: 67 20 2a 70 43 6f 6e 66 69 67 20 3d 20 70 2d 3e  g *pConfig = p->
68b0: 70 43 6f 6e 66 69 67 3b 0a 20 20 20 20 63 68 61  pConfig;.    cha
68c0: 72 20 2a 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65  r *zSql = sqlite
68d0: 33 5f 6d 70 72 69 6e 74 66 28 0a 20 20 20 20 20  3_mprintf(.     
68e0: 20 20 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20     "DELETE FROM 
68f0: 27 25 71 27 2e 27 25 71 5f 64 61 74 61 27 20 57  '%q'.'%q_data' W
6900: 48 45 52 45 20 69 64 3e 3d 3f 20 41 4e 44 20 69  HERE id>=? AND i
6910: 64 3c 3d 3f 22 2c 20 0a 20 20 20 20 20 20 20 20  d<=?", .        
6920: 20 20 70 43 6f 6e 66 69 67 2d 3e 7a 44 62 2c 20    pConfig->zDb, 
6930: 70 43 6f 6e 66 69 67 2d 3e 7a 4e 61 6d 65 0a 20  pConfig->zName. 
6940: 20 20 20 29 3b 0a 20 20 20 20 69 66 28 20 7a 53     );.    if( zS
6950: 71 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72  ql==0 ){.      r
6960: 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
6970: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
6980: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f     rc = sqlite3_
6990: 70 72 65 70 61 72 65 5f 76 32 28 70 43 6f 6e 66  prepare_v2(pConf
69a0: 69 67 2d 3e 64 62 2c 20 7a 53 71 6c 2c 20 2d 31  ig->db, zSql, -1
69b0: 2c 20 26 70 2d 3e 70 44 65 6c 65 74 65 72 2c 20  , &p->pDeleter, 
69c0: 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  0);.      sqlite
69d0: 33 5f 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20  3_free(zSql);.  
69e0: 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 21 3d    }.    if( rc!=
69f0: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
6a00: 20 20 20 70 2d 3e 72 63 20 3d 20 72 63 3b 0a 20     p->rc = rc;. 
6a10: 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20       return;.   
6a20: 20 7d 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65   }.  }..  sqlite
6a30: 33 5f 62 69 6e 64 5f 69 6e 74 36 34 28 70 2d 3e  3_bind_int64(p->
6a40: 70 44 65 6c 65 74 65 72 2c 20 31 2c 20 69 46 69  pDeleter, 1, iFi
6a50: 72 73 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  rst);.  sqlite3_
6a60: 62 69 6e 64 5f 69 6e 74 36 34 28 70 2d 3e 70 44  bind_int64(p->pD
6a70: 65 6c 65 74 65 72 2c 20 32 2c 20 69 4c 61 73 74  eleter, 2, iLast
6a80: 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 65  );.  sqlite3_ste
6a90: 70 28 70 2d 3e 70 44 65 6c 65 74 65 72 29 3b 0a  p(p->pDeleter);.
6aa0: 20 20 70 2d 3e 72 63 20 3d 20 73 71 6c 69 74 65    p->rc = sqlite
6ab0: 33 5f 72 65 73 65 74 28 70 2d 3e 70 44 65 6c 65  3_reset(p->pDele
6ac0: 74 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  ter);.}../*.** R
6ad0: 65 6d 6f 76 65 20 61 6c 6c 20 72 65 63 6f 72 64  emove all record
6ae0: 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  s associated wit
6af0: 68 20 73 65 67 6d 65 6e 74 20 69 53 65 67 69 64  h segment iSegid
6b00: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
6b10: 20 66 74 73 35 44 61 74 61 52 65 6d 6f 76 65 53   fts5DataRemoveS
6b20: 65 67 6d 65 6e 74 28 46 74 73 35 49 6e 64 65 78  egment(Fts5Index
6b30: 20 2a 70 2c 20 69 6e 74 20 69 53 65 67 69 64 29   *p, int iSegid)
6b40: 7b 0a 20 20 69 36 34 20 69 46 69 72 73 74 20 3d  {.  i64 iFirst =
6b50: 20 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f 52 4f   FTS5_SEGMENT_RO
6b60: 57 49 44 28 69 53 65 67 69 64 2c 20 30 29 3b 0a  WID(iSegid, 0);.
6b70: 20 20 69 36 34 20 69 4c 61 73 74 20 3d 20 46 54    i64 iLast = FT
6b80: 53 35 5f 53 45 47 4d 45 4e 54 5f 52 4f 57 49 44  S5_SEGMENT_ROWID
6b90: 28 69 53 65 67 69 64 2b 31 2c 20 30 29 2d 31 3b  (iSegid+1, 0)-1;
6ba0: 0a 20 20 66 74 73 35 44 61 74 61 44 65 6c 65 74  .  fts5DataDelet
6bb0: 65 28 70 2c 20 69 46 69 72 73 74 2c 20 69 4c 61  e(p, iFirst, iLa
6bc0: 73 74 29 3b 0a 20 20 69 66 28 20 70 2d 3e 70 49  st);.  if( p->pI
6bd0: 64 78 44 65 6c 65 74 65 72 3d 3d 30 20 29 7b 0a  dxDeleter==0 ){.
6be0: 20 20 20 20 46 74 73 35 43 6f 6e 66 69 67 20 2a      Fts5Config *
6bf0: 70 43 6f 6e 66 69 67 20 3d 20 70 2d 3e 70 43 6f  pConfig = p->pCo
6c00: 6e 66 69 67 3b 0a 20 20 20 20 66 74 73 35 49 6e  nfig;.    fts5In
6c10: 64 65 78 50 72 65 70 61 72 65 53 74 6d 74 28 70  dexPrepareStmt(p
6c20: 2c 20 26 70 2d 3e 70 49 64 78 44 65 6c 65 74 65  , &p->pIdxDelete
6c30: 72 2c 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e  r, sqlite3_mprin
6c40: 74 66 28 0a 20 20 20 20 20 20 20 20 20 20 22 44  tf(.          "D
6c50: 45 4c 45 54 45 20 46 52 4f 4d 20 27 25 71 27 2e  ELETE FROM '%q'.
6c60: 27 25 71 5f 69 64 78 27 20 57 48 45 52 45 20 73  '%q_idx' WHERE s
6c70: 65 67 69 64 3d 3f 22 2c 0a 20 20 20 20 20 20 20  egid=?",.       
6c80: 20 20 20 70 43 6f 6e 66 69 67 2d 3e 7a 44 62 2c     pConfig->zDb,
6c90: 20 70 43 6f 6e 66 69 67 2d 3e 7a 4e 61 6d 65 0a   pConfig->zName.
6ca0: 20 20 20 20 29 29 3b 0a 20 20 7d 0a 20 20 69 66      ));.  }.  if
6cb0: 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
6cc0: 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  OK ){.    sqlite
6cd0: 33 5f 62 69 6e 64 5f 69 6e 74 28 70 2d 3e 70 49  3_bind_int(p->pI
6ce0: 64 78 44 65 6c 65 74 65 72 2c 20 31 2c 20 69 53  dxDeleter, 1, iS
6cf0: 65 67 69 64 29 3b 0a 20 20 20 20 73 71 6c 69 74  egid);.    sqlit
6d00: 65 33 5f 73 74 65 70 28 70 2d 3e 70 49 64 78 44  e3_step(p->pIdxD
6d10: 65 6c 65 74 65 72 29 3b 0a 20 20 20 20 70 2d 3e  eleter);.    p->
6d20: 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 73  rc = sqlite3_res
6d30: 65 74 28 70 2d 3e 70 49 64 78 44 65 6c 65 74 65  et(p->pIdxDelete
6d40: 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  r);.  }.}../*.**
6d50: 20 52 65 6c 65 61 73 65 20 61 20 72 65 66 65 72   Release a refer
6d60: 65 6e 63 65 20 74 6f 20 61 6e 20 46 74 73 35 53  ence to an Fts5S
6d70: 74 72 75 63 74 75 72 65 20 6f 62 6a 65 63 74 20  tructure object 
6d80: 72 65 74 75 72 6e 65 64 20 62 79 20 61 6e 20 65  returned by an e
6d90: 61 72 6c 69 65 72 20 0a 2a 2a 20 63 61 6c 6c 20  arlier .** call 
6da0: 74 6f 20 66 74 73 35 53 74 72 75 63 74 75 72 65  to fts5Structure
6db0: 52 65 61 64 28 29 20 6f 72 20 66 74 73 35 53 74  Read() or fts5St
6dc0: 72 75 63 74 75 72 65 44 65 63 6f 64 65 28 29 2e  ructureDecode().
6dd0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
6de0: 66 74 73 35 53 74 72 75 63 74 75 72 65 52 65 6c  fts5StructureRel
6df0: 65 61 73 65 28 46 74 73 35 53 74 72 75 63 74 75  ease(Fts5Structu
6e00: 72 65 20 2a 70 53 74 72 75 63 74 29 7b 0a 20 20  re *pStruct){.  
6e10: 69 66 28 20 70 53 74 72 75 63 74 20 26 26 20 30  if( pStruct && 0
6e20: 3e 3d 28 2d 2d 70 53 74 72 75 63 74 2d 3e 6e 52  >=(--pStruct->nR
6e30: 65 66 29 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  ef) ){.    int i
6e40: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 53  ;.    assert( pS
6e50: 74 72 75 63 74 2d 3e 6e 52 65 66 3d 3d 30 20 29  truct->nRef==0 )
6e60: 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
6e70: 3c 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c  <pStruct->nLevel
6e80: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71  ; i++){.      sq
6e90: 6c 69 74 65 33 5f 66 72 65 65 28 70 53 74 72 75  lite3_free(pStru
6ea0: 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 5d 2e 61 53  ct->aLevel[i].aS
6eb0: 65 67 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  eg);.    }.    s
6ec0: 71 6c 69 74 65 33 5f 66 72 65 65 28 70 53 74 72  qlite3_free(pStr
6ed0: 75 63 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61  uct);.  }.}..sta
6ee0: 74 69 63 20 76 6f 69 64 20 66 74 73 35 53 74 72  tic void fts5Str
6ef0: 75 63 74 75 72 65 52 65 66 28 46 74 73 35 53 74  uctureRef(Fts5St
6f00: 72 75 63 74 75 72 65 20 2a 70 53 74 72 75 63 74  ructure *pStruct
6f10: 29 7b 0a 20 20 70 53 74 72 75 63 74 2d 3e 6e 52  ){.  pStruct->nR
6f20: 65 66 2b 2b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  ef++;.}../*.** D
6f30: 65 73 65 72 69 61 6c 69 7a 65 20 61 6e 64 20 72  eserialize and r
6f40: 65 74 75 72 6e 20 74 68 65 20 73 74 72 75 63 74  eturn the struct
6f50: 75 72 65 20 72 65 63 6f 72 64 20 63 75 72 72 65  ure record curre
6f60: 6e 74 6c 79 20 73 74 6f 72 65 64 20 69 6e 20 73  ntly stored in s
6f70: 65 72 69 61 6c 69 7a 65 64 0a 2a 2a 20 66 6f 72  erialized.** for
6f80: 6d 20 77 69 74 68 69 6e 20 62 75 66 66 65 72 20  m within buffer 
6f90: 70 44 61 74 61 2f 6e 44 61 74 61 2e 0a 2a 2a 0a  pData/nData..**.
6fa0: 2a 2a 20 54 68 65 20 46 74 73 35 53 74 72 75 63  ** The Fts5Struc
6fb0: 74 75 72 65 2e 61 4c 65 76 65 6c 5b 5d 20 61 6e  ture.aLevel[] an
6fc0: 64 20 65 61 63 68 20 46 74 73 35 53 74 72 75 63  d each Fts5Struc
6fd0: 74 75 72 65 4c 65 76 65 6c 2e 61 53 65 67 5b 5d  tureLevel.aSeg[]
6fe0: 20 61 72 72 61 79 0a 2a 2a 20 61 72 65 20 6f 76   array.** are ov
6ff0: 65 72 2d 61 6c 6c 6f 63 61 74 65 64 20 62 79 20  er-allocated by 
7000: 6f 6e 65 20 73 6c 6f 74 2e 20 54 68 69 73 20 61  one slot. This a
7010: 6c 6c 6f 77 73 20 74 68 65 20 73 74 72 75 63 74  llows the struct
7020: 75 72 65 20 63 6f 6e 74 65 6e 74 73 0a 2a 2a 20  ure contents.** 
7030: 74 6f 20 62 65 20 6d 6f 72 65 20 65 61 73 69 6c  to be more easil
7040: 79 20 65 64 69 74 65 64 2e 0a 2a 2a 0a 2a 2a 20  y edited..**.** 
7050: 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
7060: 72 73 2c 20 2a 70 70 4f 75 74 20 69 73 20 73 65  rs, *ppOut is se
7070: 74 20 74 6f 20 4e 55 4c 4c 20 61 6e 64 20 61 6e  t to NULL and an
7080: 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f   SQLite error co
7090: 64 65 0a 2a 2a 20 72 65 74 75 72 6e 65 64 2e 20  de.** returned. 
70a0: 4f 74 68 65 72 77 69 73 65 2c 20 2a 70 70 4f 75  Otherwise, *ppOu
70b0: 74 20 69 73 20 73 65 74 20 74 6f 20 70 6f 69 6e  t is set to poin
70c0: 74 20 74 6f 20 74 68 65 20 6e 65 77 20 6f 62 6a  t to the new obj
70d0: 65 63 74 20 61 6e 64 0a 2a 2a 20 53 51 4c 49 54  ect and.** SQLIT
70e0: 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 0a 2a  E_OK returned..*
70f0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73  /.static int fts
7100: 35 53 74 72 75 63 74 75 72 65 44 65 63 6f 64 65  5StructureDecode
7110: 28 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 70 44  (.  const u8 *pD
7120: 61 74 61 2c 20 20 20 20 20 20 20 20 20 20 20 20  ata,            
7130: 20 20 20 20 2f 2a 20 42 75 66 66 65 72 20 63 6f      /* Buffer co
7140: 6e 74 61 69 6e 69 6e 67 20 73 65 72 69 61 6c 69  ntaining seriali
7150: 7a 65 64 20 73 74 72 75 63 74 75 72 65 20 2a 2f  zed structure */
7160: 0a 20 20 69 6e 74 20 6e 44 61 74 61 2c 20 20 20  .  int nData,   
7170: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7180: 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 62 75     /* Size of bu
7190: 66 66 65 72 20 70 44 61 74 61 20 69 6e 20 62 79  ffer pData in by
71a0: 74 65 73 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 69  tes */.  int *pi
71b0: 43 6f 6f 6b 69 65 2c 20 20 20 20 20 20 20 20 20  Cookie,         
71c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 66           /* Conf
71d0: 69 67 75 72 61 74 69 6f 6e 20 63 6f 6f 6b 69 65  iguration cookie
71e0: 20 76 61 6c 75 65 20 2a 2f 0a 20 20 46 74 73 35   value */.  Fts5
71f0: 53 74 72 75 63 74 75 72 65 20 2a 2a 70 70 4f 75  Structure **ppOu
7200: 74 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f  t           /* O
7210: 55 54 3a 20 44 65 73 65 72 69 61 6c 69 7a 65 64  UT: Deserialized
7220: 20 6f 62 6a 65 63 74 20 2a 2f 0a 29 7b 0a 20 20   object */.){.  
7230: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
7240: 4f 4b 3b 0a 20 20 69 6e 74 20 69 20 3d 20 30 3b  OK;.  int i = 0;
7250: 0a 20 20 69 6e 74 20 69 4c 76 6c 3b 0a 20 20 69  .  int iLvl;.  i
7260: 6e 74 20 6e 4c 65 76 65 6c 20 3d 20 30 3b 0a 20  nt nLevel = 0;. 
7270: 20 69 6e 74 20 6e 53 65 67 6d 65 6e 74 20 3d 20   int nSegment = 
7280: 30 3b 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b 20  0;.  int nByte; 
7290: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
72a0: 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20 6f 66       /* Bytes of
72b0: 20 73 70 61 63 65 20 74 6f 20 61 6c 6c 6f 63 61   space to alloca
72c0: 74 65 20 61 74 20 70 52 65 74 20 2a 2f 0a 20 20  te at pRet */.  
72d0: 46 74 73 35 53 74 72 75 63 74 75 72 65 20 2a 70  Fts5Structure *p
72e0: 52 65 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20  Ret = 0;        
72f0: 2f 2a 20 53 74 72 75 63 74 75 72 65 20 6f 62 6a  /* Structure obj
7300: 65 63 74 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f  ect to return */
7310: 0a 0a 20 20 2f 2a 20 47 72 61 62 20 74 68 65 20  ..  /* Grab the 
7320: 63 6f 6f 6b 69 65 20 76 61 6c 75 65 20 2a 2f 0a  cookie value */.
7330: 20 20 69 66 28 20 70 69 43 6f 6f 6b 69 65 20 29    if( piCookie )
7340: 20 2a 70 69 43 6f 6f 6b 69 65 20 3d 20 73 71 6c   *piCookie = sql
7350: 69 74 65 33 46 74 73 35 47 65 74 33 32 28 70 44  ite3Fts5Get32(pD
7360: 61 74 61 29 3b 0a 20 20 69 20 3d 20 34 3b 0a 0a  ata);.  i = 4;..
7370: 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20 74 6f    /* Read the to
7380: 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 6c 65  tal number of le
7390: 76 65 6c 73 20 61 6e 64 20 73 65 67 6d 65 6e 74  vels and segment
73a0: 73 20 66 72 6f 6d 20 74 68 65 20 73 74 61 72 74  s from the start
73b0: 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 73 74 72   of the.  ** str
73c0: 75 63 74 75 72 65 20 72 65 63 6f 72 64 2e 20 20  ucture record.  
73d0: 2a 2f 0a 20 20 69 20 2b 3d 20 66 74 73 35 47 65  */.  i += fts5Ge
73e0: 74 56 61 72 69 6e 74 33 32 28 26 70 44 61 74 61  tVarint32(&pData
73f0: 5b 69 5d 2c 20 6e 4c 65 76 65 6c 29 3b 0a 20 20  [i], nLevel);.  
7400: 69 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69  i += fts5GetVari
7410: 6e 74 33 32 28 26 70 44 61 74 61 5b 69 5d 2c 20  nt32(&pData[i], 
7420: 6e 53 65 67 6d 65 6e 74 29 3b 0a 20 20 6e 42 79  nSegment);.  nBy
7430: 74 65 20 3d 20 28 0a 20 20 20 20 20 20 73 69 7a  te = (.      siz
7440: 65 6f 66 28 46 74 73 35 53 74 72 75 63 74 75 72  eof(Fts5Structur
7450: 65 29 20 2b 20 20 20 20 20 20 20 20 20 20 20 20  e) +            
7460: 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 69 6e 20          /* Main 
7470: 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 20  structure */.   
7480: 20 20 20 73 69 7a 65 6f 66 28 46 74 73 35 53 74     sizeof(Fts5St
7490: 72 75 63 74 75 72 65 4c 65 76 65 6c 29 20 2a 20  ructureLevel) * 
74a0: 28 6e 4c 65 76 65 6c 2d 31 29 20 20 20 20 2f 2a  (nLevel-1)    /*
74b0: 20 61 4c 65 76 65 6c 5b 5d 20 61 72 72 61 79 20   aLevel[] array 
74c0: 2a 2f 0a 20 20 29 3b 0a 20 20 70 52 65 74 20 3d  */.  );.  pRet =
74d0: 20 28 46 74 73 35 53 74 72 75 63 74 75 72 65 2a   (Fts5Structure*
74e0: 29 73 71 6c 69 74 65 33 46 74 73 35 4d 61 6c 6c  )sqlite3Fts5Mall
74f0: 6f 63 5a 65 72 6f 28 26 72 63 2c 20 6e 42 79 74  ocZero(&rc, nByt
7500: 65 29 3b 0a 0a 20 20 69 66 28 20 70 52 65 74 20  e);..  if( pRet 
7510: 29 7b 0a 20 20 20 20 70 52 65 74 2d 3e 6e 52 65  ){.    pRet->nRe
7520: 66 20 3d 20 31 3b 0a 20 20 20 20 70 52 65 74 2d  f = 1;.    pRet-
7530: 3e 6e 4c 65 76 65 6c 20 3d 20 6e 4c 65 76 65 6c  >nLevel = nLevel
7540: 3b 0a 20 20 20 20 70 52 65 74 2d 3e 6e 53 65 67  ;.    pRet->nSeg
7550: 6d 65 6e 74 20 3d 20 6e 53 65 67 6d 65 6e 74 3b  ment = nSegment;
7560: 0a 20 20 20 20 69 20 2b 3d 20 73 71 6c 69 74 65  .    i += sqlite
7570: 33 46 74 73 35 47 65 74 56 61 72 69 6e 74 28 26  3Fts5GetVarint(&
7580: 70 44 61 74 61 5b 69 5d 2c 20 26 70 52 65 74 2d  pData[i], &pRet-
7590: 3e 6e 57 72 69 74 65 43 6f 75 6e 74 65 72 29 3b  >nWriteCounter);
75a0: 0a 0a 20 20 20 20 66 6f 72 28 69 4c 76 6c 3d 30  ..    for(iLvl=0
75b0: 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ; rc==SQLITE_OK 
75c0: 26 26 20 69 4c 76 6c 3c 6e 4c 65 76 65 6c 3b 20  && iLvl<nLevel; 
75d0: 69 4c 76 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 46  iLvl++){.      F
75e0: 74 73 35 53 74 72 75 63 74 75 72 65 4c 65 76 65  ts5StructureLeve
75f0: 6c 20 2a 70 4c 76 6c 20 3d 20 26 70 52 65 74 2d  l *pLvl = &pRet-
7600: 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d 3b 0a 20  >aLevel[iLvl];. 
7610: 20 20 20 20 20 69 6e 74 20 6e 54 6f 74 61 6c 3b       int nTotal;
7620: 0a 20 20 20 20 20 20 69 6e 74 20 69 53 65 67 3b  .      int iSeg;
7630: 0a 0a 20 20 20 20 20 20 69 20 2b 3d 20 66 74 73  ..      i += fts
7640: 35 47 65 74 56 61 72 69 6e 74 33 32 28 26 70 44  5GetVarint32(&pD
7650: 61 74 61 5b 69 5d 2c 20 70 4c 76 6c 2d 3e 6e 4d  ata[i], pLvl->nM
7660: 65 72 67 65 29 3b 0a 20 20 20 20 20 20 69 20 2b  erge);.      i +
7670: 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e 74 33  = fts5GetVarint3
7680: 32 28 26 70 44 61 74 61 5b 69 5d 2c 20 6e 54 6f  2(&pData[i], nTo
7690: 74 61 6c 29 3b 0a 20 20 20 20 20 20 61 73 73 65  tal);.      asse
76a0: 72 74 28 20 6e 54 6f 74 61 6c 3e 3d 70 4c 76 6c  rt( nTotal>=pLvl
76b0: 2d 3e 6e 4d 65 72 67 65 20 29 3b 0a 20 20 20 20  ->nMerge );.    
76c0: 20 20 70 4c 76 6c 2d 3e 61 53 65 67 20 3d 20 28    pLvl->aSeg = (
76d0: 46 74 73 35 53 74 72 75 63 74 75 72 65 53 65 67  Fts5StructureSeg
76e0: 6d 65 6e 74 2a 29 73 71 6c 69 74 65 33 46 74 73  ment*)sqlite3Fts
76f0: 35 4d 61 6c 6c 6f 63 5a 65 72 6f 28 26 72 63 2c  5MallocZero(&rc,
7700: 20 0a 20 20 20 20 20 20 20 20 20 20 6e 54 6f 74   .          nTot
7710: 61 6c 20 2a 20 73 69 7a 65 6f 66 28 46 74 73 35  al * sizeof(Fts5
7720: 53 74 72 75 63 74 75 72 65 53 65 67 6d 65 6e 74  StructureSegment
7730: 29 0a 20 20 20 20 20 20 29 3b 0a 0a 20 20 20 20  ).      );..    
7740: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
7750: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 70  _OK ){.        p
7760: 4c 76 6c 2d 3e 6e 53 65 67 20 3d 20 6e 54 6f 74  Lvl->nSeg = nTot
7770: 61 6c 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28  al;.        for(
7780: 69 53 65 67 3d 30 3b 20 69 53 65 67 3c 6e 54 6f  iSeg=0; iSeg<nTo
7790: 74 61 6c 3b 20 69 53 65 67 2b 2b 29 7b 0a 20 20  tal; iSeg++){.  
77a0: 20 20 20 20 20 20 20 20 69 20 2b 3d 20 66 74 73          i += fts
77b0: 35 47 65 74 56 61 72 69 6e 74 33 32 28 26 70 44  5GetVarint32(&pD
77c0: 61 74 61 5b 69 5d 2c 20 70 4c 76 6c 2d 3e 61 53  ata[i], pLvl->aS
77d0: 65 67 5b 69 53 65 67 5d 2e 69 53 65 67 69 64 29  eg[iSeg].iSegid)
77e0: 3b 0a 20 20 20 20 20 20 20 20 20 20 69 20 2b 3d  ;.          i +=
77f0: 20 66 74 73 35 47 65 74 56 61 72 69 6e 74 33 32   fts5GetVarint32
7800: 28 26 70 44 61 74 61 5b 69 5d 2c 20 70 4c 76 6c  (&pData[i], pLvl
7810: 2d 3e 61 53 65 67 5b 69 53 65 67 5d 2e 70 67 6e  ->aSeg[iSeg].pgn
7820: 6f 46 69 72 73 74 29 3b 0a 20 20 20 20 20 20 20  oFirst);.       
7830: 20 20 20 69 20 2b 3d 20 66 74 73 35 47 65 74 56     i += fts5GetV
7840: 61 72 69 6e 74 33 32 28 26 70 44 61 74 61 5b 69  arint32(&pData[i
7850: 5d 2c 20 70 4c 76 6c 2d 3e 61 53 65 67 5b 69 53  ], pLvl->aSeg[iS
7860: 65 67 5d 2e 70 67 6e 6f 4c 61 73 74 29 3b 0a 20  eg].pgnoLast);. 
7870: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
7880: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 66 74  else{.        ft
7890: 73 35 53 74 72 75 63 74 75 72 65 52 65 6c 65 61  s5StructureRelea
78a0: 73 65 28 70 52 65 74 29 3b 0a 20 20 20 20 20 20  se(pRet);.      
78b0: 20 20 70 52 65 74 20 3d 20 30 3b 0a 20 20 20 20    pRet = 0;.    
78c0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
78d0: 20 2a 70 70 4f 75 74 20 3d 20 70 52 65 74 3b 0a   *ppOut = pRet;.
78e0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
78f0: 2f 2a 0a 2a 2a 0a 2a 2f 0a 73 74 61 74 69 63 20  /*.**.*/.static 
7900: 76 6f 69 64 20 66 74 73 35 53 74 72 75 63 74 75  void fts5Structu
7910: 72 65 41 64 64 4c 65 76 65 6c 28 69 6e 74 20 2a  reAddLevel(int *
7920: 70 52 63 2c 20 46 74 73 35 53 74 72 75 63 74 75  pRc, Fts5Structu
7930: 72 65 20 2a 2a 70 70 53 74 72 75 63 74 29 7b 0a  re **ppStruct){.
7940: 20 20 69 66 28 20 2a 70 52 63 3d 3d 53 51 4c 49    if( *pRc==SQLI
7950: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 46 74 73  TE_OK ){.    Fts
7960: 35 53 74 72 75 63 74 75 72 65 20 2a 70 53 74 72  5Structure *pStr
7970: 75 63 74 20 3d 20 2a 70 70 53 74 72 75 63 74 3b  uct = *ppStruct;
7980: 0a 20 20 20 20 69 6e 74 20 6e 4c 65 76 65 6c 20  .    int nLevel 
7990: 3d 20 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65  = pStruct->nLeve
79a0: 6c 3b 0a 20 20 20 20 69 6e 74 20 6e 42 79 74 65  l;.    int nByte
79b0: 20 3d 20 28 0a 20 20 20 20 20 20 20 20 73 69 7a   = (.        siz
79c0: 65 6f 66 28 46 74 73 35 53 74 72 75 63 74 75 72  eof(Fts5Structur
79d0: 65 29 20 2b 20 20 20 20 20 20 20 20 20 20 20 20  e) +            
79e0: 20 20 20 20 20 20 2f 2a 20 4d 61 69 6e 20 73 74        /* Main st
79f0: 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 20 20 20  ructure */.     
7a00: 20 20 20 73 69 7a 65 6f 66 28 46 74 73 35 53 74     sizeof(Fts5St
7a10: 72 75 63 74 75 72 65 4c 65 76 65 6c 29 20 2a 20  ructureLevel) * 
7a20: 28 6e 4c 65 76 65 6c 2b 31 29 20 20 2f 2a 20 61  (nLevel+1)  /* a
7a30: 4c 65 76 65 6c 5b 5d 20 61 72 72 61 79 20 2a 2f  Level[] array */
7a40: 0a 20 20 20 20 29 3b 0a 0a 20 20 20 20 70 53 74  .    );..    pSt
7a50: 72 75 63 74 20 3d 20 73 71 6c 69 74 65 33 5f 72  ruct = sqlite3_r
7a60: 65 61 6c 6c 6f 63 28 70 53 74 72 75 63 74 2c 20  ealloc(pStruct, 
7a70: 6e 42 79 74 65 29 3b 0a 20 20 20 20 69 66 28 20  nByte);.    if( 
7a80: 70 53 74 72 75 63 74 20 29 7b 0a 20 20 20 20 20  pStruct ){.     
7a90: 20 6d 65 6d 73 65 74 28 26 70 53 74 72 75 63 74   memset(&pStruct
7aa0: 2d 3e 61 4c 65 76 65 6c 5b 6e 4c 65 76 65 6c 5d  ->aLevel[nLevel]
7ab0: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 46 74 73 35  , 0, sizeof(Fts5
7ac0: 53 74 72 75 63 74 75 72 65 4c 65 76 65 6c 29 29  StructureLevel))
7ad0: 3b 0a 20 20 20 20 20 20 70 53 74 72 75 63 74 2d  ;.      pStruct-
7ae0: 3e 6e 4c 65 76 65 6c 2b 2b 3b 0a 20 20 20 20 20  >nLevel++;.     
7af0: 20 2a 70 70 53 74 72 75 63 74 20 3d 20 70 53 74   *ppStruct = pSt
7b00: 72 75 63 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  ruct;.    }else{
7b10: 0a 20 20 20 20 20 20 2a 70 52 63 20 3d 20 53 51  .      *pRc = SQ
7b20: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
7b30: 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45  }.  }.}../*.** E
7b40: 78 74 65 6e 64 20 6c 65 76 65 6c 20 69 4c 76 6c  xtend level iLvl
7b50: 20 73 6f 20 74 68 61 74 20 74 68 65 72 65 20 69   so that there i
7b60: 73 20 72 6f 6f 6d 20 66 6f 72 20 61 74 20 6c 65  s room for at le
7b70: 61 73 74 20 6e 45 78 74 72 61 20 6d 6f 72 65 0a  ast nExtra more.
7b80: 2a 2a 20 73 65 67 6d 65 6e 74 73 2e 0a 2a 2f 0a  ** segments..*/.
7b90: 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
7ba0: 53 74 72 75 63 74 75 72 65 45 78 74 65 6e 64 4c  StructureExtendL
7bb0: 65 76 65 6c 28 0a 20 20 69 6e 74 20 2a 70 52 63  evel(.  int *pRc
7bc0: 2c 20 0a 20 20 46 74 73 35 53 74 72 75 63 74 75  , .  Fts5Structu
7bd0: 72 65 20 2a 70 53 74 72 75 63 74 2c 20 0a 20 20  re *pStruct, .  
7be0: 69 6e 74 20 69 4c 76 6c 2c 20 0a 20 20 69 6e 74  int iLvl, .  int
7bf0: 20 6e 45 78 74 72 61 2c 20 0a 20 20 69 6e 74 20   nExtra, .  int 
7c00: 62 49 6e 73 65 72 74 0a 29 7b 0a 20 20 69 66 28  bInsert.){.  if(
7c10: 20 2a 70 52 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b   *pRc==SQLITE_OK
7c20: 20 29 7b 0a 20 20 20 20 46 74 73 35 53 74 72 75   ){.    Fts5Stru
7c30: 63 74 75 72 65 4c 65 76 65 6c 20 2a 70 4c 76 6c  ctureLevel *pLvl
7c40: 20 3d 20 26 70 53 74 72 75 63 74 2d 3e 61 4c 65   = &pStruct->aLe
7c50: 76 65 6c 5b 69 4c 76 6c 5d 3b 0a 20 20 20 20 46  vel[iLvl];.    F
7c60: 74 73 35 53 74 72 75 63 74 75 72 65 53 65 67 6d  ts5StructureSegm
7c70: 65 6e 74 20 2a 61 4e 65 77 3b 0a 20 20 20 20 69  ent *aNew;.    i
7c80: 6e 74 20 6e 42 79 74 65 3b 0a 0a 20 20 20 20 6e  nt nByte;..    n
7c90: 42 79 74 65 20 3d 20 28 70 4c 76 6c 2d 3e 6e 53  Byte = (pLvl->nS
7ca0: 65 67 20 2b 20 6e 45 78 74 72 61 29 20 2a 20 73  eg + nExtra) * s
7cb0: 69 7a 65 6f 66 28 46 74 73 35 53 74 72 75 63 74  izeof(Fts5Struct
7cc0: 75 72 65 53 65 67 6d 65 6e 74 29 3b 0a 20 20 20  ureSegment);.   
7cd0: 20 61 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 5f   aNew = sqlite3_
7ce0: 72 65 61 6c 6c 6f 63 28 70 4c 76 6c 2d 3e 61 53  realloc(pLvl->aS
7cf0: 65 67 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20 20  eg, nByte);.    
7d00: 69 66 28 20 61 4e 65 77 20 29 7b 0a 20 20 20 20  if( aNew ){.    
7d10: 20 20 69 66 28 20 62 49 6e 73 65 72 74 3d 3d 30    if( bInsert==0
7d20: 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 73   ){.        mems
7d30: 65 74 28 26 61 4e 65 77 5b 70 4c 76 6c 2d 3e 6e  et(&aNew[pLvl->n
7d40: 53 65 67 5d 2c 20 30 2c 20 73 69 7a 65 6f 66 28  Seg], 0, sizeof(
7d50: 46 74 73 35 53 74 72 75 63 74 75 72 65 53 65 67  Fts5StructureSeg
7d60: 6d 65 6e 74 29 20 2a 20 6e 45 78 74 72 61 29 3b  ment) * nExtra);
7d70: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
7d80: 20 20 20 20 20 20 69 6e 74 20 6e 4d 6f 76 65 20        int nMove 
7d90: 3d 20 70 4c 76 6c 2d 3e 6e 53 65 67 20 2a 20 73  = pLvl->nSeg * s
7da0: 69 7a 65 6f 66 28 46 74 73 35 53 74 72 75 63 74  izeof(Fts5Struct
7db0: 75 72 65 53 65 67 6d 65 6e 74 29 3b 0a 20 20 20  ureSegment);.   
7dc0: 20 20 20 20 20 6d 65 6d 6d 6f 76 65 28 26 61 4e       memmove(&aN
7dd0: 65 77 5b 6e 45 78 74 72 61 5d 2c 20 61 4e 65 77  ew[nExtra], aNew
7de0: 2c 20 6e 4d 6f 76 65 29 3b 0a 20 20 20 20 20 20  , nMove);.      
7df0: 20 20 6d 65 6d 73 65 74 28 61 4e 65 77 2c 20 30    memset(aNew, 0
7e00: 2c 20 73 69 7a 65 6f 66 28 46 74 73 35 53 74 72  , sizeof(Fts5Str
7e10: 75 63 74 75 72 65 53 65 67 6d 65 6e 74 29 20 2a  uctureSegment) *
7e20: 20 6e 45 78 74 72 61 29 3b 0a 20 20 20 20 20 20   nExtra);.      
7e30: 7d 0a 20 20 20 20 20 20 70 4c 76 6c 2d 3e 61 53  }.      pLvl->aS
7e40: 65 67 20 3d 20 61 4e 65 77 3b 0a 20 20 20 20 7d  eg = aNew;.    }
7e50: 65 6c 73 65 7b 0a 20 20 20 20 20 20 2a 70 52 63  else{.      *pRc
7e60: 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
7e70: 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a  .    }.  }.}../*
7e80: 0a 2a 2a 20 52 65 61 64 2c 20 64 65 73 65 72 69  .** Read, deseri
7e90: 61 6c 69 7a 65 20 61 6e 64 20 72 65 74 75 72 6e  alize and return
7ea0: 20 74 68 65 20 73 74 72 75 63 74 75 72 65 20 72   the structure r
7eb0: 65 63 6f 72 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ecord..**.** The
7ec0: 20 46 74 73 35 53 74 72 75 63 74 75 72 65 2e 61   Fts5Structure.a
7ed0: 4c 65 76 65 6c 5b 5d 20 61 6e 64 20 65 61 63 68  Level[] and each
7ee0: 20 46 74 73 35 53 74 72 75 63 74 75 72 65 4c 65   Fts5StructureLe
7ef0: 76 65 6c 2e 61 53 65 67 5b 5d 20 61 72 72 61 79  vel.aSeg[] array
7f00: 0a 2a 2a 20 61 72 65 20 6f 76 65 72 2d 61 6c 6c  .** are over-all
7f10: 6f 63 61 74 65 64 20 61 73 20 64 65 73 63 72 69  ocated as descri
7f20: 62 65 64 20 66 6f 72 20 66 75 6e 63 74 69 6f 6e  bed for function
7f30: 20 66 74 73 35 53 74 72 75 63 74 75 72 65 44 65   fts5StructureDe
7f40: 63 6f 64 65 28 29 20 0a 2a 2a 20 61 62 6f 76 65  code() .** above
7f50: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72  ..**.** If an er
7f60: 72 6f 72 20 6f 63 63 75 72 73 2c 20 4e 55 4c 4c  ror occurs, NULL
7f70: 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64   is returned and
7f80: 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 6c   an error code l
7f90: 65 66 74 20 69 6e 20 74 68 65 0a 2a 2a 20 46 74  eft in the.** Ft
7fa0: 73 35 49 6e 64 65 78 20 68 61 6e 64 6c 65 2e 20  s5Index handle. 
7fb0: 49 66 20 61 6e 20 65 72 72 6f 72 20 68 61 73 20  If an error has 
7fc0: 61 6c 72 65 61 64 79 20 6f 63 63 75 72 72 65 64  already occurred
7fd0: 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74   when this funct
7fe0: 69 6f 6e 0a 2a 2a 20 69 73 20 63 61 6c 6c 65 64  ion.** is called
7ff0: 2c 20 69 74 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  , it is a no-op.
8000: 0a 2a 2f 0a 73 74 61 74 69 63 20 46 74 73 35 53  .*/.static Fts5S
8010: 74 72 75 63 74 75 72 65 20 2a 66 74 73 35 53 74  tructure *fts5St
8020: 72 75 63 74 75 72 65 52 65 61 64 28 46 74 73 35  ructureRead(Fts5
8030: 49 6e 64 65 78 20 2a 70 29 7b 0a 20 20 46 74 73  Index *p){.  Fts
8040: 35 43 6f 6e 66 69 67 20 2a 70 43 6f 6e 66 69 67  5Config *pConfig
8050: 20 3d 20 70 2d 3e 70 43 6f 6e 66 69 67 3b 0a 20   = p->pConfig;. 
8060: 20 46 74 73 35 53 74 72 75 63 74 75 72 65 20 2a   Fts5Structure *
8070: 70 52 65 74 20 3d 20 30 3b 20 20 20 20 20 20 20  pRet = 0;       
8080: 20 2f 2a 20 4f 62 6a 65 63 74 20 74 6f 20 72 65   /* Object to re
8090: 74 75 72 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 43  turn */.  int iC
80a0: 6f 6f 6b 69 65 3b 20 20 20 20 20 20 20 20 20 20  ookie;          
80b0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e            /* Con
80c0: 66 69 67 75 72 61 74 69 6f 6e 20 63 6f 6f 6b 69  figuration cooki
80d0: 65 20 2a 2f 0a 20 20 46 74 73 35 44 61 74 61 20  e */.  Fts5Data 
80e0: 2a 70 44 61 74 61 3b 0a 0a 20 20 70 44 61 74 61  *pData;..  pData
80f0: 20 3d 20 66 74 73 35 44 61 74 61 52 65 61 64 28   = fts5DataRead(
8100: 70 2c 20 46 54 53 35 5f 53 54 52 55 43 54 55 52  p, FTS5_STRUCTUR
8110: 45 5f 52 4f 57 49 44 29 3b 0a 20 20 69 66 28 20  E_ROWID);.  if( 
8120: 70 2d 3e 72 63 20 29 20 72 65 74 75 72 6e 20 30  p->rc ) return 0
8130: 3b 0a 20 20 2f 2a 20 54 4f 44 4f 3a 20 44 6f 20  ;.  /* TODO: Do 
8140: 77 65 20 6e 65 65 64 20 74 68 69 73 20 69 66 20  we need this if 
8150: 74 68 65 20 6c 65 61 66 2d 69 6e 64 65 78 20 69  the leaf-index i
8160: 73 20 61 70 70 65 6e 64 65 64 3f 20 50 72 6f 62  s appended? Prob
8170: 61 62 6c 79 2e 2e 2e 20 2a 2f 0a 20 20 6d 65 6d  ably... */.  mem
8180: 73 65 74 28 26 70 44 61 74 61 2d 3e 70 5b 70 44  set(&pData->p[pD
8190: 61 74 61 2d 3e 6e 6e 5d 2c 20 30 2c 20 46 54 53  ata->nn], 0, FTS
81a0: 35 5f 44 41 54 41 5f 50 41 44 44 49 4e 47 29 3b  5_DATA_PADDING);
81b0: 0a 20 20 70 2d 3e 72 63 20 3d 20 66 74 73 35 53  .  p->rc = fts5S
81c0: 74 72 75 63 74 75 72 65 44 65 63 6f 64 65 28 70  tructureDecode(p
81d0: 44 61 74 61 2d 3e 70 2c 20 70 44 61 74 61 2d 3e  Data->p, pData->
81e0: 6e 6e 2c 20 26 69 43 6f 6f 6b 69 65 2c 20 26 70  nn, &iCookie, &p
81f0: 52 65 74 29 3b 0a 20 20 69 66 28 20 70 2d 3e 72  Ret);.  if( p->r
8200: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
8210: 70 43 6f 6e 66 69 67 2d 3e 69 43 6f 6f 6b 69 65  pConfig->iCookie
8220: 21 3d 69 43 6f 6f 6b 69 65 20 29 7b 0a 20 20 20  !=iCookie ){.   
8230: 20 70 2d 3e 72 63 20 3d 20 73 71 6c 69 74 65 33   p->rc = sqlite3
8240: 46 74 73 35 43 6f 6e 66 69 67 4c 6f 61 64 28 70  Fts5ConfigLoad(p
8250: 43 6f 6e 66 69 67 2c 20 69 43 6f 6f 6b 69 65 29  Config, iCookie)
8260: 3b 0a 20 20 7d 0a 0a 20 20 66 74 73 35 44 61 74  ;.  }..  fts5Dat
8270: 61 52 65 6c 65 61 73 65 28 70 44 61 74 61 29 3b  aRelease(pData);
8280: 0a 20 20 69 66 28 20 70 2d 3e 72 63 21 3d 53 51  .  if( p->rc!=SQ
8290: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 66  LITE_OK ){.    f
82a0: 74 73 35 53 74 72 75 63 74 75 72 65 52 65 6c 65  ts5StructureRele
82b0: 61 73 65 28 70 52 65 74 29 3b 0a 20 20 20 20 70  ase(pRet);.    p
82c0: 52 65 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72  Ret = 0;.  }.  r
82d0: 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 0a 2f  eturn pRet;.}../
82e0: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
82f0: 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20  total number of 
8300: 73 65 67 6d 65 6e 74 73 20 69 6e 20 69 6e 64 65  segments in inde
8310: 78 20 73 74 72 75 63 74 75 72 65 20 70 53 74 72  x structure pStr
8320: 75 63 74 2e 20 54 68 69 73 0a 2a 2a 20 66 75 6e  uct. This.** fun
8330: 63 74 69 6f 6e 20 69 73 20 6f 6e 6c 79 20 65 76  ction is only ev
8340: 65 72 20 75 73 65 64 20 61 73 20 70 61 72 74 20  er used as part 
8350: 6f 66 20 61 73 73 65 72 74 28 29 20 63 6f 6e 64  of assert() cond
8360: 69 74 69 6f 6e 73 2e 0a 2a 2f 0a 23 69 66 64 65  itions..*/.#ifde
8370: 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 73  f SQLITE_DEBUG.s
8380: 74 61 74 69 63 20 69 6e 74 20 66 74 73 35 53 74  tatic int fts5St
8390: 72 75 63 74 75 72 65 43 6f 75 6e 74 53 65 67 6d  ructureCountSegm
83a0: 65 6e 74 73 28 46 74 73 35 53 74 72 75 63 74 75  ents(Fts5Structu
83b0: 72 65 20 2a 70 53 74 72 75 63 74 29 7b 0a 20 20  re *pStruct){.  
83c0: 69 6e 74 20 6e 53 65 67 6d 65 6e 74 20 3d 20 30  int nSegment = 0
83d0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
83e0: 2f 2a 20 54 6f 74 61 6c 20 6e 75 6d 62 65 72 20  /* Total number 
83f0: 6f 66 20 73 65 67 6d 65 6e 74 73 20 2a 2f 0a 20  of segments */. 
8400: 20 69 66 28 20 70 53 74 72 75 63 74 20 29 7b 0a   if( pStruct ){.
8410: 20 20 20 20 69 6e 74 20 69 4c 76 6c 3b 20 20 20      int iLvl;   
8420: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8430: 20 20 2f 2a 20 55 73 65 64 20 74 6f 20 69 74 65    /* Used to ite
8440: 72 61 74 65 20 74 68 72 6f 75 67 68 20 6c 65 76  rate through lev
8450: 65 6c 73 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69  els */.    for(i
8460: 4c 76 6c 3d 30 3b 20 69 4c 76 6c 3c 70 53 74 72  Lvl=0; iLvl<pStr
8470: 75 63 74 2d 3e 6e 4c 65 76 65 6c 3b 20 69 4c 76  uct->nLevel; iLv
8480: 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 6e 53 65 67  l++){.      nSeg
8490: 6d 65 6e 74 20 2b 3d 20 70 53 74 72 75 63 74 2d  ment += pStruct-
84a0: 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d 2e 6e 53  >aLevel[iLvl].nS
84b0: 65 67 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  eg;.    }.  }.. 
84c0: 20 72 65 74 75 72 6e 20 6e 53 65 67 6d 65 6e 74   return nSegment
84d0: 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66  ;.}.#endif..#def
84e0: 69 6e 65 20 66 74 73 35 42 75 66 66 65 72 53 61  ine fts5BufferSa
84f0: 66 65 41 70 70 65 6e 64 42 6c 6f 62 28 70 42 75  feAppendBlob(pBu
8500: 66 2c 20 70 42 6c 6f 62 2c 20 6e 42 6c 6f 62 29  f, pBlob, nBlob)
8510: 20 7b 20 20 20 20 20 5c 0a 20 20 61 73 73 65 72   {     \.  asser
8520: 74 28 20 28 70 42 75 66 29 2d 3e 6e 53 70 61 63  t( (pBuf)->nSpac
8530: 65 3e 3d 28 28 70 42 75 66 29 2d 3e 6e 2b 6e 42  e>=((pBuf)->n+nB
8540: 6c 6f 62 29 20 29 3b 20 20 20 20 20 20 20 20 20  lob) );         
8550: 20 20 20 20 5c 0a 20 20 6d 65 6d 63 70 79 28 26      \.  memcpy(&
8560: 28 70 42 75 66 29 2d 3e 70 5b 28 70 42 75 66 29  (pBuf)->p[(pBuf)
8570: 2d 3e 6e 5d 2c 20 70 42 6c 6f 62 2c 20 6e 42 6c  ->n], pBlob, nBl
8580: 6f 62 29 3b 20 20 20 20 20 20 20 20 20 20 20 20  ob);            
8590: 20 5c 0a 20 20 28 70 42 75 66 29 2d 3e 6e 20 2b   \.  (pBuf)->n +
85a0: 3d 20 6e 42 6c 6f 62 3b 20 20 20 20 20 20 20 20  = nBlob;        
85b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
85c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
85d0: 7d 0a 0a 23 64 65 66 69 6e 65 20 66 74 73 35 42  }..#define fts5B
85e0: 75 66 66 65 72 53 61 66 65 41 70 70 65 6e 64 56  ufferSafeAppendV
85f0: 61 72 69 6e 74 28 70 42 75 66 2c 20 69 56 61 6c  arint(pBuf, iVal
8600: 29 20 7b 20 20 20 20 20 20 20 20 20 20 20 20 20  ) {             
8610: 20 20 20 5c 0a 20 20 28 70 42 75 66 29 2d 3e 6e     \.  (pBuf)->n
8620: 20 2b 3d 20 73 71 6c 69 74 65 33 46 74 73 35 50   += sqlite3Fts5P
8630: 75 74 56 61 72 69 6e 74 28 26 28 70 42 75 66 29  utVarint(&(pBuf)
8640: 2d 3e 70 5b 28 70 42 75 66 29 2d 3e 6e 5d 2c 20  ->p[(pBuf)->n], 
8650: 28 69 56 61 6c 29 29 3b 20 20 5c 0a 20 20 61 73  (iVal));  \.  as
8660: 73 65 72 74 28 20 28 70 42 75 66 29 2d 3e 6e 53  sert( (pBuf)->nS
8670: 70 61 63 65 3e 3d 28 70 42 75 66 29 2d 3e 6e 20  pace>=(pBuf)->n 
8680: 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  );              
8690: 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 7d 0a              \.}.
86a0: 0a 0a 2f 2a 0a 2a 2a 20 53 65 72 69 61 6c 69 7a  ../*.** Serializ
86b0: 65 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65 20  e and store the 
86c0: 22 73 74 72 75 63 74 75 72 65 22 20 72 65 63 6f  "structure" reco
86d0: 72 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  rd..**.** If an 
86e0: 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 6c 65  error occurs, le
86f0: 61 76 65 20 61 6e 20 65 72 72 6f 72 20 63 6f 64  ave an error cod
8700: 65 20 69 6e 20 74 68 65 20 46 74 73 35 49 6e 64  e in the Fts5Ind
8710: 65 78 20 6f 62 6a 65 63 74 2e 20 49 66 20 61 6e  ex object. If an
8720: 0a 2a 2a 20 65 72 72 6f 72 20 68 61 73 20 61 6c  .** error has al
8730: 72 65 61 64 79 20 6f 63 63 75 72 72 65 64 2c 20  ready occurred, 
8740: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
8750: 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61   a no-op..*/.sta
8760: 74 69 63 20 76 6f 69 64 20 66 74 73 35 53 74 72  tic void fts5Str
8770: 75 63 74 75 72 65 57 72 69 74 65 28 46 74 73 35  uctureWrite(Fts5
8780: 49 6e 64 65 78 20 2a 70 2c 20 46 74 73 35 53 74  Index *p, Fts5St
8790: 72 75 63 74 75 72 65 20 2a 70 53 74 72 75 63 74  ructure *pStruct
87a0: 29 7b 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d  ){.  if( p->rc==
87b0: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
87c0: 20 46 74 73 35 42 75 66 66 65 72 20 62 75 66 3b   Fts5Buffer buf;
87d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
87e0: 2a 20 42 75 66 66 65 72 20 74 6f 20 73 65 72 69  * Buffer to seri
87f0: 61 6c 69 7a 65 20 72 65 63 6f 72 64 20 69 6e 74  alize record int
8800: 6f 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 4c 76  o */.    int iLv
8810: 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
8820: 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20 74         /* Used t
8830: 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f 75 67  o iterate throug
8840: 68 20 6c 65 76 65 6c 73 20 2a 2f 0a 20 20 20 20  h levels */.    
8850: 69 6e 74 20 69 43 6f 6f 6b 69 65 3b 20 20 20 20  int iCookie;    
8860: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
8870: 20 43 6f 6f 6b 69 65 20 76 61 6c 75 65 20 74 6f   Cookie value to
8880: 20 73 74 6f 72 65 20 2a 2f 0a 0a 20 20 20 20 61   store */..    a
8890: 73 73 65 72 74 28 20 70 53 74 72 75 63 74 2d 3e  ssert( pStruct->
88a0: 6e 53 65 67 6d 65 6e 74 3d 3d 66 74 73 35 53 74  nSegment==fts5St
88b0: 72 75 63 74 75 72 65 43 6f 75 6e 74 53 65 67 6d  ructureCountSegm
88c0: 65 6e 74 73 28 70 53 74 72 75 63 74 29 20 29 3b  ents(pStruct) );
88d0: 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 62 75 66  .    memset(&buf
88e0: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 46 74 73 35  , 0, sizeof(Fts5
88f0: 42 75 66 66 65 72 29 29 3b 0a 0a 20 20 20 20 2f  Buffer));..    /
8900: 2a 20 41 70 70 65 6e 64 20 74 68 65 20 63 75 72  * Append the cur
8910: 72 65 6e 74 20 63 6f 6e 66 69 67 75 72 61 74 69  rent configurati
8920: 6f 6e 20 63 6f 6f 6b 69 65 20 2a 2f 0a 20 20 20  on cookie */.   
8930: 20 69 43 6f 6f 6b 69 65 20 3d 20 70 2d 3e 70 43   iCookie = p->pC
8940: 6f 6e 66 69 67 2d 3e 69 43 6f 6f 6b 69 65 3b 0a  onfig->iCookie;.
8950: 20 20 20 20 69 66 28 20 69 43 6f 6f 6b 69 65 3c      if( iCookie<
8960: 30 20 29 20 69 43 6f 6f 6b 69 65 20 3d 20 30 3b  0 ) iCookie = 0;
8970: 0a 0a 20 20 20 20 69 66 28 20 30 3d 3d 73 71 6c  ..    if( 0==sql
8980: 69 74 65 33 46 74 73 35 42 75 66 66 65 72 53 69  ite3Fts5BufferSi
8990: 7a 65 28 26 70 2d 3e 72 63 2c 20 26 62 75 66 2c  ze(&p->rc, &buf,
89a0: 20 34 2b 39 2b 39 2b 39 29 20 29 7b 0a 20 20 20   4+9+9+9) ){.   
89b0: 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 50 75     sqlite3Fts5Pu
89c0: 74 33 32 28 62 75 66 2e 70 2c 20 69 43 6f 6f 6b  t32(buf.p, iCook
89d0: 69 65 29 3b 0a 20 20 20 20 20 20 62 75 66 2e 6e  ie);.      buf.n
89e0: 20 3d 20 34 3b 0a 20 20 20 20 20 20 66 74 73 35   = 4;.      fts5
89f0: 42 75 66 66 65 72 53 61 66 65 41 70 70 65 6e 64  BufferSafeAppend
8a00: 56 61 72 69 6e 74 28 26 62 75 66 2c 20 70 53 74  Varint(&buf, pSt
8a10: 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 29 3b 0a 20  ruct->nLevel);. 
8a20: 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72 53       fts5BufferS
8a30: 61 66 65 41 70 70 65 6e 64 56 61 72 69 6e 74 28  afeAppendVarint(
8a40: 26 62 75 66 2c 20 70 53 74 72 75 63 74 2d 3e 6e  &buf, pStruct->n
8a50: 53 65 67 6d 65 6e 74 29 3b 0a 20 20 20 20 20 20  Segment);.      
8a60: 66 74 73 35 42 75 66 66 65 72 53 61 66 65 41 70  fts5BufferSafeAp
8a70: 70 65 6e 64 56 61 72 69 6e 74 28 26 62 75 66 2c  pendVarint(&buf,
8a80: 20 28 69 36 34 29 70 53 74 72 75 63 74 2d 3e 6e   (i64)pStruct->n
8a90: 57 72 69 74 65 43 6f 75 6e 74 65 72 29 3b 0a 20  WriteCounter);. 
8aa0: 20 20 20 7d 0a 0a 20 20 20 20 66 6f 72 28 69 4c     }..    for(iL
8ab0: 76 6c 3d 30 3b 20 69 4c 76 6c 3c 70 53 74 72 75  vl=0; iLvl<pStru
8ac0: 63 74 2d 3e 6e 4c 65 76 65 6c 3b 20 69 4c 76 6c  ct->nLevel; iLvl
8ad0: 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  ++){.      int i
8ae0: 53 65 67 3b 20 20 20 20 20 20 20 20 20 20 20 20  Seg;            
8af0: 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64           /* Used
8b00: 20 74 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f   to iterate thro
8b10: 75 67 68 20 73 65 67 6d 65 6e 74 73 20 2a 2f 0a  ugh segments */.
8b20: 20 20 20 20 20 20 46 74 73 35 53 74 72 75 63 74        Fts5Struct
8b30: 75 72 65 4c 65 76 65 6c 20 2a 70 4c 76 6c 20 3d  ureLevel *pLvl =
8b40: 20 26 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65   &pStruct->aLeve
8b50: 6c 5b 69 4c 76 6c 5d 3b 0a 20 20 20 20 20 20 66  l[iLvl];.      f
8b60: 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 56  ts5BufferAppendV
8b70: 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26 62  arint(&p->rc, &b
8b80: 75 66 2c 20 70 4c 76 6c 2d 3e 6e 4d 65 72 67 65  uf, pLvl->nMerge
8b90: 29 3b 0a 20 20 20 20 20 20 66 74 73 35 42 75 66  );.      fts5Buf
8ba0: 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e 74 28  ferAppendVarint(
8bb0: 26 70 2d 3e 72 63 2c 20 26 62 75 66 2c 20 70 4c  &p->rc, &buf, pL
8bc0: 76 6c 2d 3e 6e 53 65 67 29 3b 0a 20 20 20 20 20  vl->nSeg);.     
8bd0: 20 61 73 73 65 72 74 28 20 70 4c 76 6c 2d 3e 6e   assert( pLvl->n
8be0: 4d 65 72 67 65 3c 3d 70 4c 76 6c 2d 3e 6e 53 65  Merge<=pLvl->nSe
8bf0: 67 20 29 3b 0a 0a 20 20 20 20 20 20 66 6f 72 28  g );..      for(
8c00: 69 53 65 67 3d 30 3b 20 69 53 65 67 3c 70 4c 76  iSeg=0; iSeg<pLv
8c10: 6c 2d 3e 6e 53 65 67 3b 20 69 53 65 67 2b 2b 29  l->nSeg; iSeg++)
8c20: 7b 0a 20 20 20 20 20 20 20 20 66 74 73 35 42 75  {.        fts5Bu
8c30: 66 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e 74  fferAppendVarint
8c40: 28 26 70 2d 3e 72 63 2c 20 26 62 75 66 2c 20 70  (&p->rc, &buf, p
8c50: 4c 76 6c 2d 3e 61 53 65 67 5b 69 53 65 67 5d 2e  Lvl->aSeg[iSeg].
8c60: 69 53 65 67 69 64 29 3b 0a 20 20 20 20 20 20 20  iSegid);.       
8c70: 20 66 74 73 35 42 75 66 66 65 72 41 70 70 65 6e   fts5BufferAppen
8c80: 64 56 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20  dVarint(&p->rc, 
8c90: 26 62 75 66 2c 20 70 4c 76 6c 2d 3e 61 53 65 67  &buf, pLvl->aSeg
8ca0: 5b 69 53 65 67 5d 2e 70 67 6e 6f 46 69 72 73 74  [iSeg].pgnoFirst
8cb0: 29 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35 42  );.        fts5B
8cc0: 75 66 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e  ufferAppendVarin
8cd0: 74 28 26 70 2d 3e 72 63 2c 20 26 62 75 66 2c 20  t(&p->rc, &buf, 
8ce0: 70 4c 76 6c 2d 3e 61 53 65 67 5b 69 53 65 67 5d  pLvl->aSeg[iSeg]
8cf0: 2e 70 67 6e 6f 4c 61 73 74 29 3b 0a 20 20 20 20  .pgnoLast);.    
8d00: 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 66    }.    }..    f
8d10: 74 73 35 44 61 74 61 57 72 69 74 65 28 70 2c 20  ts5DataWrite(p, 
8d20: 46 54 53 35 5f 53 54 52 55 43 54 55 52 45 5f 52  FTS5_STRUCTURE_R
8d30: 4f 57 49 44 2c 20 62 75 66 2e 70 2c 20 62 75 66  OWID, buf.p, buf
8d40: 2e 6e 29 3b 0a 20 20 20 20 66 74 73 35 42 75 66  .n);.    fts5Buf
8d50: 66 65 72 46 72 65 65 28 26 62 75 66 29 3b 0a 20  ferFree(&buf);. 
8d60: 20 7d 0a 7d 0a 0a 23 69 66 20 30 0a 73 74 61 74   }.}..#if 0.stat
8d70: 69 63 20 76 6f 69 64 20 66 74 73 35 44 65 62 75  ic void fts5Debu
8d80: 67 53 74 72 75 63 74 75 72 65 28 69 6e 74 2a 2c  gStructure(int*,
8d90: 46 74 73 35 42 75 66 66 65 72 2a 2c 46 74 73 35  Fts5Buffer*,Fts5
8da0: 53 74 72 75 63 74 75 72 65 2a 29 3b 0a 73 74 61  Structure*);.sta
8db0: 74 69 63 20 76 6f 69 64 20 66 74 73 35 50 72 69  tic void fts5Pri
8dc0: 6e 74 53 74 72 75 63 74 75 72 65 28 63 6f 6e 73  ntStructure(cons
8dd0: 74 20 63 68 61 72 20 2a 7a 43 61 70 74 69 6f 6e  t char *zCaption
8de0: 2c 20 46 74 73 35 53 74 72 75 63 74 75 72 65 20  , Fts5Structure 
8df0: 2a 70 53 74 72 75 63 74 29 7b 0a 20 20 69 6e 74  *pStruct){.  int
8e00: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
8e10: 0a 20 20 46 74 73 35 42 75 66 66 65 72 20 62 75  .  Fts5Buffer bu
8e20: 66 3b 0a 20 20 6d 65 6d 73 65 74 28 26 62 75 66  f;.  memset(&buf
8e30: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 62 75 66 29  , 0, sizeof(buf)
8e40: 29 3b 0a 20 20 66 74 73 35 44 65 62 75 67 53 74  );.  fts5DebugSt
8e50: 72 75 63 74 75 72 65 28 26 72 63 2c 20 26 62 75  ructure(&rc, &bu
8e60: 66 2c 20 70 53 74 72 75 63 74 29 3b 0a 20 20 66  f, pStruct);.  f
8e70: 70 72 69 6e 74 66 28 73 74 64 6f 75 74 2c 20 22  printf(stdout, "
8e80: 25 73 3a 20 25 73 5c 6e 22 2c 20 7a 43 61 70 74  %s: %s\n", zCapt
8e90: 69 6f 6e 2c 20 62 75 66 2e 70 29 3b 0a 20 20 66  ion, buf.p);.  f
8ea0: 66 6c 75 73 68 28 73 74 64 6f 75 74 29 3b 0a 20  flush(stdout);. 
8eb0: 20 66 74 73 35 42 75 66 66 65 72 46 72 65 65 28   fts5BufferFree(
8ec0: 26 62 75 66 29 3b 0a 7d 0a 23 65 6c 73 65 0a 23  &buf);.}.#else.#
8ed0: 20 64 65 66 69 6e 65 20 66 74 73 35 50 72 69 6e   define fts5Prin
8ee0: 74 53 74 72 75 63 74 75 72 65 28 78 2c 79 29 0a  tStructure(x,y).
8ef0: 23 65 6e 64 69 66 0a 0a 73 74 61 74 69 63 20 69  #endif..static i
8f00: 6e 74 20 66 74 73 35 53 65 67 6d 65 6e 74 53 69  nt fts5SegmentSi
8f10: 7a 65 28 46 74 73 35 53 74 72 75 63 74 75 72 65  ze(Fts5Structure
8f20: 53 65 67 6d 65 6e 74 20 2a 70 53 65 67 29 7b 0a  Segment *pSeg){.
8f30: 20 20 72 65 74 75 72 6e 20 31 20 2b 20 70 53 65    return 1 + pSe
8f40: 67 2d 3e 70 67 6e 6f 4c 61 73 74 20 2d 20 70 53  g->pgnoLast - pS
8f50: 65 67 2d 3e 70 67 6e 6f 46 69 72 73 74 3b 0a 7d  eg->pgnoFirst;.}
8f60: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61  ../*.** Return a
8f70: 20 63 6f 70 79 20 6f 66 20 69 6e 64 65 78 20 73   copy of index s
8f80: 74 72 75 63 74 75 72 65 20 70 53 74 72 75 63 74  tructure pStruct
8f90: 2e 20 45 78 63 65 70 74 2c 20 70 72 6f 6d 6f 74  . Except, promot
8fa0: 65 20 61 73 20 6d 61 6e 79 20 0a 2a 2a 20 73 65  e as many .** se
8fb0: 67 6d 65 6e 74 73 20 61 73 20 70 6f 73 73 69 62  gments as possib
8fc0: 6c 65 20 74 6f 20 6c 65 76 65 6c 20 69 50 72 6f  le to level iPro
8fd0: 6d 6f 74 65 2e 20 49 66 20 61 6e 20 4f 4f 4d 20  mote. If an OOM 
8fe0: 6f 63 63 75 72 73 2c 20 4e 55 4c 4c 20 69 73 20  occurs, NULL is 
8ff0: 0a 2a 2a 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f  .** returned..*/
9000: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
9010: 35 53 74 72 75 63 74 75 72 65 50 72 6f 6d 6f 74  5StructurePromot
9020: 65 54 6f 28 0a 20 20 46 74 73 35 49 6e 64 65 78  eTo(.  Fts5Index
9030: 20 2a 70 2c 0a 20 20 69 6e 74 20 69 50 72 6f 6d   *p,.  int iProm
9040: 6f 74 65 2c 0a 20 20 69 6e 74 20 73 7a 50 72 6f  ote,.  int szPro
9050: 6d 6f 74 65 2c 0a 20 20 46 74 73 35 53 74 72 75  mote,.  Fts5Stru
9060: 63 74 75 72 65 20 2a 70 53 74 72 75 63 74 0a 29  cture *pStruct.)
9070: 7b 0a 20 20 69 6e 74 20 69 6c 2c 20 69 73 3b 0a  {.  int il, is;.
9080: 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65 4c    Fts5StructureL
9090: 65 76 65 6c 20 2a 70 4f 75 74 20 3d 20 26 70 53  evel *pOut = &pS
90a0: 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 50  truct->aLevel[iP
90b0: 72 6f 6d 6f 74 65 5d 3b 0a 0a 20 20 69 66 28 20  romote];..  if( 
90c0: 70 4f 75 74 2d 3e 6e 4d 65 72 67 65 3d 3d 30 20  pOut->nMerge==0 
90d0: 29 7b 0a 20 20 20 20 66 6f 72 28 69 6c 3d 69 50  ){.    for(il=iP
90e0: 72 6f 6d 6f 74 65 2b 31 3b 20 69 6c 3c 70 53 74  romote+1; il<pSt
90f0: 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 3b 20 69 6c  ruct->nLevel; il
9100: 2b 2b 29 7b 0a 20 20 20 20 20 20 46 74 73 35 53  ++){.      Fts5S
9110: 74 72 75 63 74 75 72 65 4c 65 76 65 6c 20 2a 70  tructureLevel *p
9120: 4c 76 6c 20 3d 20 26 70 53 74 72 75 63 74 2d 3e  Lvl = &pStruct->
9130: 61 4c 65 76 65 6c 5b 69 6c 5d 3b 0a 20 20 20 20  aLevel[il];.    
9140: 20 20 69 66 28 20 70 4c 76 6c 2d 3e 6e 4d 65 72    if( pLvl->nMer
9150: 67 65 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20  ge ) return;.   
9160: 20 20 20 66 6f 72 28 69 73 3d 70 4c 76 6c 2d 3e     for(is=pLvl->
9170: 6e 53 65 67 2d 31 3b 20 69 73 3e 3d 30 3b 20 69  nSeg-1; is>=0; i
9180: 73 2d 2d 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  s--){.        in
9190: 74 20 73 7a 20 3d 20 66 74 73 35 53 65 67 6d 65  t sz = fts5Segme
91a0: 6e 74 53 69 7a 65 28 26 70 4c 76 6c 2d 3e 61 53  ntSize(&pLvl->aS
91b0: 65 67 5b 69 73 5d 29 3b 0a 20 20 20 20 20 20 20  eg[is]);.       
91c0: 20 69 66 28 20 73 7a 3e 73 7a 50 72 6f 6d 6f 74   if( sz>szPromot
91d0: 65 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20  e ) return;.    
91e0: 20 20 20 20 66 74 73 35 53 74 72 75 63 74 75 72      fts5Structur
91f0: 65 45 78 74 65 6e 64 4c 65 76 65 6c 28 26 70 2d  eExtendLevel(&p-
9200: 3e 72 63 2c 20 70 53 74 72 75 63 74 2c 20 69 50  >rc, pStruct, iP
9210: 72 6f 6d 6f 74 65 2c 20 31 2c 20 31 29 3b 0a 20  romote, 1, 1);. 
9220: 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72 63         if( p->rc
9230: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20   ) return;.     
9240: 20 20 20 6d 65 6d 63 70 79 28 70 4f 75 74 2d 3e     memcpy(pOut->
9250: 61 53 65 67 2c 20 26 70 4c 76 6c 2d 3e 61 53 65  aSeg, &pLvl->aSe
9260: 67 5b 69 73 5d 2c 20 73 69 7a 65 6f 66 28 46 74  g[is], sizeof(Ft
9270: 73 35 53 74 72 75 63 74 75 72 65 53 65 67 6d 65  s5StructureSegme
9280: 6e 74 29 29 3b 0a 20 20 20 20 20 20 20 20 70 4f  nt));.        pO
9290: 75 74 2d 3e 6e 53 65 67 2b 2b 3b 0a 20 20 20 20  ut->nSeg++;.    
92a0: 20 20 20 20 70 4c 76 6c 2d 3e 6e 53 65 67 2d 2d      pLvl->nSeg--
92b0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
92c0: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 6e    }.}../*.** A n
92d0: 65 77 20 73 65 67 6d 65 6e 74 20 68 61 73 20 6a  ew segment has j
92e0: 75 73 74 20 62 65 65 6e 20 77 72 69 74 74 65 6e  ust been written
92f0: 20 74 6f 20 6c 65 76 65 6c 20 69 4c 76 6c 20 6f   to level iLvl o
9300: 66 20 69 6e 64 65 78 20 73 74 72 75 63 74 75 72  f index structur
9310: 65 0a 2a 2a 20 70 53 74 72 75 63 74 2e 20 54 68  e.** pStruct. Th
9320: 69 73 20 66 75 6e 63 74 69 6f 6e 20 64 65 74 65  is function dete
9330: 72 6d 69 6e 65 73 20 69 66 20 61 6e 79 20 73 65  rmines if any se
9340: 67 6d 65 6e 74 73 20 73 68 6f 75 6c 64 20 62 65  gments should be
9350: 20 70 72 6f 6d 6f 74 65 64 0a 2a 2a 20 61 73 20   promoted.** as 
9360: 61 20 72 65 73 75 6c 74 2e 20 53 65 67 6d 65 6e  a result. Segmen
9370: 74 73 20 61 72 65 20 70 72 6f 6d 6f 74 65 64 20  ts are promoted 
9380: 69 6e 20 74 77 6f 20 73 63 65 6e 61 72 69 6f 73  in two scenarios
9390: 3a 0a 2a 2a 0a 2a 2a 20 20 20 61 29 20 49 66 20  :.**.**   a) If 
93a0: 74 68 65 20 73 65 67 6d 65 6e 74 20 6a 75 73 74  the segment just
93b0: 20 77 72 69 74 74 65 6e 20 69 73 20 73 6d 61 6c   written is smal
93c0: 6c 65 72 20 74 68 61 6e 20 6f 6e 65 20 6f 72 20  ler than one or 
93d0: 6d 6f 72 65 20 73 65 67 6d 65 6e 74 73 0a 2a 2a  more segments.**
93e0: 20 20 20 20 20 20 77 69 74 68 69 6e 20 74 68 65        within the
93f0: 20 70 72 65 76 69 6f 75 73 20 70 6f 70 75 6c 61   previous popula
9400: 74 65 64 20 6c 65 76 65 6c 2c 20 69 74 20 69 73  ted level, it is
9410: 20 70 72 6f 6d 6f 74 65 64 20 74 6f 20 74 68 65   promoted to the
9420: 20 70 72 65 76 69 6f 75 73 0a 2a 2a 20 20 20 20   previous.**    
9430: 20 20 70 6f 70 75 6c 61 74 65 64 20 6c 65 76 65    populated leve
9440: 6c 2e 0a 2a 2a 0a 2a 2a 20 20 20 62 29 20 49 66  l..**.**   b) If
9450: 20 74 68 65 20 73 65 67 6d 65 6e 74 20 6a 75 73   the segment jus
9460: 74 20 77 72 69 74 74 65 6e 20 69 73 20 6c 61 72  t written is lar
9470: 67 65 72 20 74 68 61 6e 20 74 68 65 20 6e 65 77  ger than the new
9480: 65 73 74 20 73 65 67 6d 65 6e 74 20 6f 6e 0a 2a  est segment on.*
9490: 2a 20 20 20 20 20 20 74 68 65 20 6e 65 78 74 20  *      the next 
94a0: 70 6f 70 75 6c 61 74 65 64 20 6c 65 76 65 6c 2c  populated level,
94b0: 20 74 68 65 6e 20 74 68 61 74 20 73 65 67 6d 65   then that segme
94c0: 6e 74 2c 20 61 6e 64 20 61 6e 79 20 6f 74 68 65  nt, and any othe
94d0: 72 20 61 64 6a 61 63 65 6e 74 0a 2a 2a 20 20 20  r adjacent.**   
94e0: 20 20 20 73 65 67 6d 65 6e 74 73 20 74 68 61 74     segments that
94f0: 20 61 72 65 20 61 6c 73 6f 20 73 6d 61 6c 6c 65   are also smalle
9500: 72 20 74 68 61 6e 20 74 68 65 20 6f 6e 65 20 6a  r than the one j
9510: 75 73 74 20 77 72 69 74 74 65 6e 2c 20 61 72 65  ust written, are
9520: 20 0a 2a 2a 20 20 20 20 20 20 70 72 6f 6d 6f 74   .**      promot
9530: 65 64 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 6f 6e  ed. .**.** If on
9540: 65 20 6f 72 20 6d 6f 72 65 20 73 65 67 6d 65 6e  e or more segmen
9550: 74 73 20 61 72 65 20 70 72 6f 6d 6f 74 65 64 2c  ts are promoted,
9560: 20 74 68 65 20 73 74 72 75 63 74 75 72 65 20 6f   the structure o
9570: 62 6a 65 63 74 20 69 73 20 75 70 64 61 74 65 64  bject is updated
9580: 0a 2a 2a 20 74 6f 20 72 65 66 6c 65 63 74 20 74  .** to reflect t
9590: 68 69 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  his..*/.static v
95a0: 6f 69 64 20 66 74 73 35 53 74 72 75 63 74 75 72  oid fts5Structur
95b0: 65 50 72 6f 6d 6f 74 65 28 0a 20 20 46 74 73 35  ePromote(.  Fts5
95c0: 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20  Index *p,       
95d0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
95e0: 54 53 35 20 62 61 63 6b 65 6e 64 20 6f 62 6a 65  TS5 backend obje
95f0: 63 74 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 76 6c  ct */.  int iLvl
9600: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
9610: 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
9620: 20 6c 65 76 65 6c 20 6a 75 73 74 20 75 70 64 61   level just upda
9630: 74 65 64 20 2a 2f 0a 20 20 46 74 73 35 53 74 72  ted */.  Fts5Str
9640: 75 63 74 75 72 65 20 2a 70 53 74 72 75 63 74 20  ucture *pStruct 
9650: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
9660: 78 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 29  x structure */.)
9670: 7b 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53  {.  if( p->rc==S
9680: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
9690: 69 6e 74 20 69 54 73 74 3b 0a 20 20 20 20 69 6e  int iTst;.    in
96a0: 74 20 69 50 72 6f 6d 6f 74 65 20 3d 20 2d 31 3b  t iPromote = -1;
96b0: 0a 20 20 20 20 69 6e 74 20 73 7a 50 72 6f 6d 6f  .    int szPromo
96c0: 74 65 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  te = 0;         
96d0: 20 20 20 2f 2a 20 50 72 6f 6d 6f 74 65 20 61 6e     /* Promote an
96e0: 79 74 68 69 6e 67 20 74 68 69 73 20 73 69 7a 65  ything this size
96f0: 20 6f 72 20 73 6d 61 6c 6c 65 72 20 2a 2f 0a 20   or smaller */. 
9700: 20 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65     Fts5Structure
9710: 53 65 67 6d 65 6e 74 20 2a 70 53 65 67 3b 20 20  Segment *pSeg;  
9720: 20 2f 2a 20 53 65 67 6d 65 6e 74 20 6a 75 73 74   /* Segment just
9730: 20 77 72 69 74 74 65 6e 20 2a 2f 0a 20 20 20 20   written */.    
9740: 69 6e 74 20 73 7a 53 65 67 3b 20 20 20 20 20 20  int szSeg;      
9750: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
9760: 20 53 69 7a 65 20 6f 66 20 73 65 67 6d 65 6e 74   Size of segment
9770: 20 6a 75 73 74 20 77 72 69 74 74 65 6e 20 2a 2f   just written */
9780: 0a 20 20 20 20 69 6e 74 20 6e 53 65 67 20 3d 20  .    int nSeg = 
9790: 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b  pStruct->aLevel[
97a0: 69 4c 76 6c 5d 2e 6e 53 65 67 3b 0a 0a 20 20 20  iLvl].nSeg;..   
97b0: 20 69 66 28 20 6e 53 65 67 3d 3d 30 20 29 20 72   if( nSeg==0 ) r
97c0: 65 74 75 72 6e 3b 0a 20 20 20 20 70 53 65 67 20  eturn;.    pSeg 
97d0: 3d 20 26 70 53 74 72 75 63 74 2d 3e 61 4c 65 76  = &pStruct->aLev
97e0: 65 6c 5b 69 4c 76 6c 5d 2e 61 53 65 67 5b 70 53  el[iLvl].aSeg[pS
97f0: 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c  truct->aLevel[iL
9800: 76 6c 5d 2e 6e 53 65 67 2d 31 5d 3b 0a 20 20 20  vl].nSeg-1];.   
9810: 20 73 7a 53 65 67 20 3d 20 28 31 20 2b 20 70 53   szSeg = (1 + pS
9820: 65 67 2d 3e 70 67 6e 6f 4c 61 73 74 20 2d 20 70  eg->pgnoLast - p
9830: 53 65 67 2d 3e 70 67 6e 6f 46 69 72 73 74 29 3b  Seg->pgnoFirst);
9840: 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 66  ..    /* Check f
9850: 6f 72 20 63 6f 6e 64 69 74 69 6f 6e 20 28 61 29  or condition (a)
9860: 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 54 73 74   */.    for(iTst
9870: 3d 69 4c 76 6c 2d 31 3b 20 69 54 73 74 3e 3d 30  =iLvl-1; iTst>=0
9880: 20 26 26 20 70 53 74 72 75 63 74 2d 3e 61 4c 65   && pStruct->aLe
9890: 76 65 6c 5b 69 54 73 74 5d 2e 6e 53 65 67 3d 3d  vel[iTst].nSeg==
98a0: 30 3b 20 69 54 73 74 2d 2d 29 3b 0a 20 20 20 20  0; iTst--);.    
98b0: 69 66 28 20 69 54 73 74 3e 3d 30 20 29 7b 0a 20  if( iTst>=0 ){. 
98c0: 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20       int i;.    
98d0: 20 20 69 6e 74 20 73 7a 4d 61 78 20 3d 20 30 3b    int szMax = 0;
98e0: 0a 20 20 20 20 20 20 46 74 73 35 53 74 72 75 63  .      Fts5Struc
98f0: 74 75 72 65 4c 65 76 65 6c 20 2a 70 54 73 74 20  tureLevel *pTst 
9900: 3d 20 26 70 53 74 72 75 63 74 2d 3e 61 4c 65 76  = &pStruct->aLev
9910: 65 6c 5b 69 54 73 74 5d 3b 0a 20 20 20 20 20 20  el[iTst];.      
9920: 61 73 73 65 72 74 28 20 70 54 73 74 2d 3e 6e 4d  assert( pTst->nM
9930: 65 72 67 65 3d 3d 30 20 29 3b 0a 20 20 20 20 20  erge==0 );.     
9940: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54 73 74   for(i=0; i<pTst
9950: 2d 3e 6e 53 65 67 3b 20 69 2b 2b 29 7b 0a 20 20  ->nSeg; i++){.  
9960: 20 20 20 20 20 20 69 6e 74 20 73 7a 20 3d 20 70        int sz = p
9970: 54 73 74 2d 3e 61 53 65 67 5b 69 5d 2e 70 67 6e  Tst->aSeg[i].pgn
9980: 6f 4c 61 73 74 20 2d 20 70 54 73 74 2d 3e 61 53  oLast - pTst->aS
9990: 65 67 5b 69 5d 2e 70 67 6e 6f 46 69 72 73 74 20  eg[i].pgnoFirst 
99a0: 2b 20 31 3b 0a 20 20 20 20 20 20 20 20 69 66 28  + 1;.        if(
99b0: 20 73 7a 3e 73 7a 4d 61 78 20 29 20 73 7a 4d 61   sz>szMax ) szMa
99c0: 78 20 3d 20 73 7a 3b 0a 20 20 20 20 20 20 7d 0a  x = sz;.      }.
99d0: 20 20 20 20 20 20 69 66 28 20 73 7a 4d 61 78 3e        if( szMax>
99e0: 3d 73 7a 53 65 67 20 29 7b 0a 20 20 20 20 20 20  =szSeg ){.      
99f0: 20 20 2f 2a 20 43 6f 6e 64 69 74 69 6f 6e 20 28    /* Condition (
9a00: 61 29 20 69 73 20 74 72 75 65 2e 20 50 72 6f 6d  a) is true. Prom
9a10: 6f 74 65 20 74 68 65 20 6e 65 77 65 73 74 20 73  ote the newest s
9a20: 65 67 6d 65 6e 74 20 6f 6e 20 6c 65 76 65 6c 20  egment on level 
9a30: 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 4c 76 6c  .        ** iLvl
9a40: 20 74 6f 20 6c 65 76 65 6c 20 69 54 73 74 2e 20   to level iTst. 
9a50: 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 50 72 6f   */.        iPro
9a60: 6d 6f 74 65 20 3d 20 69 54 73 74 3b 0a 20 20 20  mote = iTst;.   
9a70: 20 20 20 20 20 73 7a 50 72 6f 6d 6f 74 65 20 3d       szPromote =
9a80: 20 73 7a 4d 61 78 3b 0a 20 20 20 20 20 20 7d 0a   szMax;.      }.
9a90: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66      }..    /* If
9aa0: 20 63 6f 6e 64 69 74 69 6f 6e 20 28 61 29 20 69   condition (a) i
9ab0: 73 20 6e 6f 74 20 6d 65 74 2c 20 61 73 73 75 6d  s not met, assum
9ac0: 65 20 28 62 29 20 69 73 20 74 72 75 65 2e 20 53  e (b) is true. S
9ad0: 74 72 75 63 74 75 72 65 50 72 6f 6d 6f 74 65 54  tructurePromoteT
9ae0: 6f 28 29 0a 20 20 20 20 2a 2a 20 69 73 20 61 20  o().    ** is a 
9af0: 6e 6f 2d 6f 70 20 69 66 20 69 74 20 69 73 20 6e  no-op if it is n
9b00: 6f 74 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  ot.  */.    if( 
9b10: 69 50 72 6f 6d 6f 74 65 3c 30 20 29 7b 0a 20 20  iPromote<0 ){.  
9b20: 20 20 20 20 69 50 72 6f 6d 6f 74 65 20 3d 20 69      iPromote = i
9b30: 4c 76 6c 3b 0a 20 20 20 20 20 20 73 7a 50 72 6f  Lvl;.      szPro
9b40: 6d 6f 74 65 20 3d 20 73 7a 53 65 67 3b 0a 20 20  mote = szSeg;.  
9b50: 20 20 7d 0a 20 20 20 20 66 74 73 35 53 74 72 75    }.    fts5Stru
9b60: 63 74 75 72 65 50 72 6f 6d 6f 74 65 54 6f 28 70  cturePromoteTo(p
9b70: 2c 20 69 50 72 6f 6d 6f 74 65 2c 20 73 7a 50 72  , iPromote, szPr
9b80: 6f 6d 6f 74 65 2c 20 70 53 74 72 75 63 74 29 3b  omote, pStruct);
9b90: 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 41  .  }.}.../*.** A
9ba0: 64 76 61 6e 63 65 20 74 68 65 20 69 74 65 72 61  dvance the itera
9bb0: 74 6f 72 20 70 61 73 73 65 64 20 61 73 20 74 68  tor passed as th
9bc0: 65 20 6f 6e 6c 79 20 61 72 67 75 6d 65 6e 74 2e  e only argument.
9bd0: 20 49 66 20 74 68 65 20 65 6e 64 20 6f 66 20 74   If the end of t
9be0: 68 65 20 0a 2a 2a 20 64 6f 63 6c 69 73 74 2d 69  he .** doclist-i
9bf0: 6e 64 65 78 20 70 61 67 65 20 69 73 20 72 65 61  ndex page is rea
9c00: 63 68 65 64 2c 20 72 65 74 75 72 6e 20 6e 6f 6e  ched, return non
9c10: 2d 7a 65 72 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63  -zero..*/.static
9c20: 20 69 6e 74 20 66 74 73 35 44 6c 69 64 78 4c 76   int fts5DlidxLv
9c30: 6c 4e 65 78 74 28 46 74 73 35 44 6c 69 64 78 4c  lNext(Fts5DlidxL
9c40: 76 6c 20 2a 70 4c 76 6c 29 7b 0a 20 20 46 74 73  vl *pLvl){.  Fts
9c50: 35 44 61 74 61 20 2a 70 44 61 74 61 20 3d 20 70  5Data *pData = p
9c60: 4c 76 6c 2d 3e 70 44 61 74 61 3b 0a 0a 20 20 69  Lvl->pData;..  i
9c70: 66 28 20 70 4c 76 6c 2d 3e 69 4f 66 66 3d 3d 30  f( pLvl->iOff==0
9c80: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
9c90: 70 4c 76 6c 2d 3e 62 45 6f 66 3d 3d 30 20 29 3b  pLvl->bEof==0 );
9ca0: 0a 20 20 20 20 70 4c 76 6c 2d 3e 69 4f 66 66 20  .    pLvl->iOff 
9cb0: 3d 20 31 3b 0a 20 20 20 20 70 4c 76 6c 2d 3e 69  = 1;.    pLvl->i
9cc0: 4f 66 66 20 2b 3d 20 66 74 73 35 47 65 74 56 61  Off += fts5GetVa
9cd0: 72 69 6e 74 33 32 28 26 70 44 61 74 61 2d 3e 70  rint32(&pData->p
9ce0: 5b 31 5d 2c 20 70 4c 76 6c 2d 3e 69 4c 65 61 66  [1], pLvl->iLeaf
9cf0: 50 67 6e 6f 29 3b 0a 20 20 20 20 70 4c 76 6c 2d  Pgno);.    pLvl-
9d00: 3e 69 4f 66 66 20 2b 3d 20 66 74 73 35 47 65 74  >iOff += fts5Get
9d10: 56 61 72 69 6e 74 28 26 70 44 61 74 61 2d 3e 70  Varint(&pData->p
9d20: 5b 70 4c 76 6c 2d 3e 69 4f 66 66 5d 2c 20 28 75  [pLvl->iOff], (u
9d30: 36 34 2a 29 26 70 4c 76 6c 2d 3e 69 52 6f 77 69  64*)&pLvl->iRowi
9d40: 64 29 3b 0a 20 20 20 20 70 4c 76 6c 2d 3e 69 46  d);.    pLvl->iF
9d50: 69 72 73 74 4f 66 66 20 3d 20 70 4c 76 6c 2d 3e  irstOff = pLvl->
9d60: 69 4f 66 66 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  iOff;.  }else{. 
9d70: 20 20 20 69 6e 74 20 69 4f 66 66 3b 0a 20 20 20     int iOff;.   
9d80: 20 66 6f 72 28 69 4f 66 66 3d 70 4c 76 6c 2d 3e   for(iOff=pLvl->
9d90: 69 4f 66 66 3b 20 69 4f 66 66 3c 70 44 61 74 61  iOff; iOff<pData
9da0: 2d 3e 6e 6e 3b 20 69 4f 66 66 2b 2b 29 7b 0a 20  ->nn; iOff++){. 
9db0: 20 20 20 20 20 69 66 28 20 70 44 61 74 61 2d 3e       if( pData->
9dc0: 70 5b 69 4f 66 66 5d 20 29 20 62 72 65 61 6b 3b  p[iOff] ) break;
9dd0: 20 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28   .    }..    if(
9de0: 20 69 4f 66 66 3c 70 44 61 74 61 2d 3e 6e 6e 20   iOff<pData->nn 
9df0: 29 7b 0a 20 20 20 20 20 20 69 36 34 20 69 56 61  ){.      i64 iVa
9e00: 6c 3b 0a 20 20 20 20 20 20 70 4c 76 6c 2d 3e 69  l;.      pLvl->i
9e10: 4c 65 61 66 50 67 6e 6f 20 2b 3d 20 28 69 4f 66  LeafPgno += (iOf
9e20: 66 20 2d 20 70 4c 76 6c 2d 3e 69 4f 66 66 29 20  f - pLvl->iOff) 
9e30: 2b 20 31 3b 0a 20 20 20 20 20 20 69 4f 66 66 20  + 1;.      iOff 
9e40: 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e 74  += fts5GetVarint
9e50: 28 26 70 44 61 74 61 2d 3e 70 5b 69 4f 66 66 5d  (&pData->p[iOff]
9e60: 2c 20 28 75 36 34 2a 29 26 69 56 61 6c 29 3b 0a  , (u64*)&iVal);.
9e70: 20 20 20 20 20 20 70 4c 76 6c 2d 3e 69 52 6f 77        pLvl->iRow
9e80: 69 64 20 2b 3d 20 69 56 61 6c 3b 0a 20 20 20 20  id += iVal;.    
9e90: 20 20 70 4c 76 6c 2d 3e 69 4f 66 66 20 3d 20 69    pLvl->iOff = i
9ea0: 4f 66 66 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  Off;.    }else{.
9eb0: 20 20 20 20 20 20 70 4c 76 6c 2d 3e 62 45 6f 66        pLvl->bEof
9ec0: 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   = 1;.    }.  }.
9ed0: 0a 20 20 72 65 74 75 72 6e 20 70 4c 76 6c 2d 3e  .  return pLvl->
9ee0: 62 45 6f 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  bEof;.}../*.** A
9ef0: 64 76 61 6e 63 65 20 74 68 65 20 69 74 65 72 61  dvance the itera
9f00: 74 6f 72 20 70 61 73 73 65 64 20 61 73 20 74 68  tor passed as th
9f10: 65 20 6f 6e 6c 79 20 61 72 67 75 6d 65 6e 74 2e  e only argument.
9f20: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .*/.static int f
9f30: 74 73 35 44 6c 69 64 78 49 74 65 72 4e 65 78 74  ts5DlidxIterNext
9f40: 52 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20  R(Fts5Index *p, 
9f50: 46 74 73 35 44 6c 69 64 78 49 74 65 72 20 2a 70  Fts5DlidxIter *p
9f60: 49 74 65 72 2c 20 69 6e 74 20 69 4c 76 6c 29 7b  Iter, int iLvl){
9f70: 0a 20 20 46 74 73 35 44 6c 69 64 78 4c 76 6c 20  .  Fts5DlidxLvl 
9f80: 2a 70 4c 76 6c 20 3d 20 26 70 49 74 65 72 2d 3e  *pLvl = &pIter->
9f90: 61 4c 76 6c 5b 69 4c 76 6c 5d 3b 0a 0a 20 20 61  aLvl[iLvl];..  a
9fa0: 73 73 65 72 74 28 20 69 4c 76 6c 3c 70 49 74 65  ssert( iLvl<pIte
9fb0: 72 2d 3e 6e 4c 76 6c 20 29 3b 0a 20 20 69 66 28  r->nLvl );.  if(
9fc0: 20 66 74 73 35 44 6c 69 64 78 4c 76 6c 4e 65 78   fts5DlidxLvlNex
9fd0: 74 28 70 4c 76 6c 29 20 29 7b 0a 20 20 20 20 69  t(pLvl) ){.    i
9fe0: 66 28 20 28 69 4c 76 6c 2b 31 29 20 3c 20 70 49  f( (iLvl+1) < pI
9ff0: 74 65 72 2d 3e 6e 4c 76 6c 20 29 7b 0a 20 20 20  ter->nLvl ){.   
a000: 20 20 20 66 74 73 35 44 6c 69 64 78 49 74 65 72     fts5DlidxIter
a010: 4e 65 78 74 52 28 70 2c 20 70 49 74 65 72 2c 20  NextR(p, pIter, 
a020: 69 4c 76 6c 2b 31 29 3b 0a 20 20 20 20 20 20 69  iLvl+1);.      i
a030: 66 28 20 70 4c 76 6c 5b 31 5d 2e 62 45 6f 66 3d  f( pLvl[1].bEof=
a040: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 66 74  =0 ){.        ft
a050: 73 35 44 61 74 61 52 65 6c 65 61 73 65 28 70 4c  s5DataRelease(pL
a060: 76 6c 2d 3e 70 44 61 74 61 29 3b 0a 20 20 20 20  vl->pData);.    
a070: 20 20 20 20 6d 65 6d 73 65 74 28 70 4c 76 6c 2c      memset(pLvl,
a080: 20 30 2c 20 73 69 7a 65 6f 66 28 46 74 73 35 44   0, sizeof(Fts5D
a090: 6c 69 64 78 4c 76 6c 29 29 3b 0a 20 20 20 20 20  lidxLvl));.     
a0a0: 20 20 20 70 4c 76 6c 2d 3e 70 44 61 74 61 20 3d     pLvl->pData =
a0b0: 20 66 74 73 35 44 61 74 61 52 65 61 64 28 70 2c   fts5DataRead(p,
a0c0: 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 46 54   .            FT
a0d0: 53 35 5f 44 4c 49 44 58 5f 52 4f 57 49 44 28 70  S5_DLIDX_ROWID(p
a0e0: 49 74 65 72 2d 3e 69 53 65 67 69 64 2c 20 69 4c  Iter->iSegid, iL
a0f0: 76 6c 2c 20 70 4c 76 6c 5b 31 5d 2e 69 4c 65 61  vl, pLvl[1].iLea
a100: 66 50 67 6e 6f 29 0a 20 20 20 20 20 20 20 20 29  fPgno).        )
a110: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4c  ;.        if( pL
a120: 76 6c 2d 3e 70 44 61 74 61 20 29 20 66 74 73 35  vl->pData ) fts5
a130: 44 6c 69 64 78 4c 76 6c 4e 65 78 74 28 70 4c 76  DlidxLvlNext(pLv
a140: 6c 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  l);.      }.    
a150: 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  }.  }..  return 
a160: 70 49 74 65 72 2d 3e 61 4c 76 6c 5b 30 5d 2e 62  pIter->aLvl[0].b
a170: 45 6f 66 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e  Eof;.}.static in
a180: 74 20 66 74 73 35 44 6c 69 64 78 49 74 65 72 4e  t fts5DlidxIterN
a190: 65 78 74 28 46 74 73 35 49 6e 64 65 78 20 2a 70  ext(Fts5Index *p
a1a0: 2c 20 46 74 73 35 44 6c 69 64 78 49 74 65 72 20  , Fts5DlidxIter 
a1b0: 2a 70 49 74 65 72 29 7b 0a 20 20 72 65 74 75 72  *pIter){.  retur
a1c0: 6e 20 66 74 73 35 44 6c 69 64 78 49 74 65 72 4e  n fts5DlidxIterN
a1d0: 65 78 74 52 28 70 2c 20 70 49 74 65 72 2c 20 30  extR(p, pIter, 0
a1e0: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  );.}../*.** The 
a1f0: 69 74 65 72 61 74 6f 72 20 70 61 73 73 65 64 20  iterator passed 
a200: 61 73 20 74 68 65 20 66 69 72 73 74 20 61 72 67  as the first arg
a210: 75 6d 65 6e 74 20 68 61 73 20 74 68 65 20 66 6f  ument has the fo
a220: 6c 6c 6f 77 69 6e 67 20 66 69 65 6c 64 73 20 73  llowing fields s
a230: 65 74 0a 2a 2a 20 61 73 20 66 6f 6c 6c 6f 77 73  et.** as follows
a240: 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  . This function 
a250: 73 65 74 73 20 75 70 20 74 68 65 20 72 65 73 74  sets up the rest
a260: 20 6f 66 20 74 68 65 20 69 74 65 72 61 74 6f 72   of the iterator
a270: 20 73 6f 20 74 68 61 74 20 69 74 0a 2a 2a 20 70   so that it.** p
a280: 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 66 69 72  oints to the fir
a290: 73 74 20 72 6f 77 69 64 20 69 6e 20 74 68 65 20  st rowid in the 
a2a0: 64 6f 63 6c 69 73 74 2d 69 6e 64 65 78 2e 0a 2a  doclist-index..*
a2b0: 2a 0a 2a 2a 20 20 20 70 44 61 74 61 3a 0a 2a 2a  *.**   pData:.**
a2c0: 20 20 20 20 20 70 6f 69 6e 74 65 72 20 74 6f 20       pointer to 
a2d0: 64 6f 63 6c 69 73 74 2d 69 6e 64 65 78 20 72 65  doclist-index re
a2e0: 63 6f 72 64 2c 20 0a 2a 2a 0a 2a 2a 20 57 68 65  cord, .**.** Whe
a2f0: 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  n this function 
a300: 69 73 20 63 61 6c 6c 65 64 20 70 49 74 65 72 2d  is called pIter-
a310: 3e 69 4c 65 61 66 50 67 6e 6f 20 69 73 20 74 68  >iLeafPgno is th
a320: 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 74 68  e page number th
a330: 65 0a 2a 2a 20 64 6f 63 6c 69 73 74 20 69 73 20  e.** doclist is 
a340: 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
a350: 28 74 68 65 20 6f 6e 65 20 66 65 61 74 75 72 69  (the one featuri
a360: 6e 67 20 74 68 65 20 74 65 72 6d 29 2e 0a 2a 2f  ng the term)..*/
a370: 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 35  .static int fts5
a380: 44 6c 69 64 78 49 74 65 72 46 69 72 73 74 28 46  DlidxIterFirst(F
a390: 74 73 35 44 6c 69 64 78 49 74 65 72 20 2a 70 49  ts5DlidxIter *pI
a3a0: 74 65 72 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  ter){.  int i;. 
a3b0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49 74 65   for(i=0; i<pIte
a3c0: 72 2d 3e 6e 4c 76 6c 3b 20 69 2b 2b 29 7b 0a 20  r->nLvl; i++){. 
a3d0: 20 20 20 66 74 73 35 44 6c 69 64 78 4c 76 6c 4e     fts5DlidxLvlN
a3e0: 65 78 74 28 26 70 49 74 65 72 2d 3e 61 4c 76 6c  ext(&pIter->aLvl
a3f0: 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  [i]);.  }.  retu
a400: 72 6e 20 70 49 74 65 72 2d 3e 61 4c 76 6c 5b 30  rn pIter->aLvl[0
a410: 5d 2e 62 45 6f 66 3b 0a 7d 0a 0a 0a 73 74 61 74  ].bEof;.}...stat
a420: 69 63 20 69 6e 74 20 66 74 73 35 44 6c 69 64 78  ic int fts5Dlidx
a430: 49 74 65 72 45 6f 66 28 46 74 73 35 49 6e 64 65  IterEof(Fts5Inde
a440: 78 20 2a 70 2c 20 46 74 73 35 44 6c 69 64 78 49  x *p, Fts5DlidxI
a450: 74 65 72 20 2a 70 49 74 65 72 29 7b 0a 20 20 72  ter *pIter){.  r
a460: 65 74 75 72 6e 20 70 2d 3e 72 63 21 3d 53 51 4c  eturn p->rc!=SQL
a470: 49 54 45 5f 4f 4b 20 7c 7c 20 70 49 74 65 72 2d  ITE_OK || pIter-
a480: 3e 61 4c 76 6c 5b 30 5d 2e 62 45 6f 66 3b 0a 7d  >aLvl[0].bEof;.}
a490: 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  ..static void ft
a4a0: 73 35 44 6c 69 64 78 49 74 65 72 4c 61 73 74 28  s5DlidxIterLast(
a4b0: 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 46 74  Fts5Index *p, Ft
a4c0: 73 35 44 6c 69 64 78 49 74 65 72 20 2a 70 49 74  s5DlidxIter *pIt
a4d0: 65 72 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20  er){.  int i;.. 
a4e0: 20 2f 2a 20 41 64 76 61 6e 63 65 20 65 61 63 68   /* Advance each
a4f0: 20 6c 65 76 65 6c 20 74 6f 20 74 68 65 20 6c 61   level to the la
a500: 73 74 20 65 6e 74 72 79 20 6f 6e 20 74 68 65 20  st entry on the 
a510: 6c 61 73 74 20 70 61 67 65 20 2a 2f 0a 20 20 66  last page */.  f
a520: 6f 72 28 69 3d 70 49 74 65 72 2d 3e 6e 4c 76 6c  or(i=pIter->nLvl
a530: 2d 31 3b 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  -1; p->rc==SQLIT
a540: 45 5f 4f 4b 20 26 26 20 69 3e 3d 30 3b 20 69 2d  E_OK && i>=0; i-
a550: 2d 29 7b 0a 20 20 20 20 46 74 73 35 44 6c 69 64  -){.    Fts5Dlid
a560: 78 4c 76 6c 20 2a 70 4c 76 6c 20 3d 20 26 70 49  xLvl *pLvl = &pI
a570: 74 65 72 2d 3e 61 4c 76 6c 5b 69 5d 3b 0a 20 20  ter->aLvl[i];.  
a580: 20 20 77 68 69 6c 65 28 20 66 74 73 35 44 6c 69    while( fts5Dli
a590: 64 78 4c 76 6c 4e 65 78 74 28 70 4c 76 6c 29 3d  dxLvlNext(pLvl)=
a5a0: 3d 30 20 29 3b 0a 20 20 20 20 70 4c 76 6c 2d 3e  =0 );.    pLvl->
a5b0: 62 45 6f 66 20 3d 20 30 3b 0a 0a 20 20 20 20 69  bEof = 0;..    i
a5c0: 66 28 20 69 3e 30 20 29 7b 0a 20 20 20 20 20 20  f( i>0 ){.      
a5d0: 46 74 73 35 44 6c 69 64 78 4c 76 6c 20 2a 70 43  Fts5DlidxLvl *pC
a5e0: 68 69 6c 64 20 3d 20 26 70 4c 76 6c 5b 2d 31 5d  hild = &pLvl[-1]
a5f0: 3b 0a 20 20 20 20 20 20 66 74 73 35 44 61 74 61  ;.      fts5Data
a600: 52 65 6c 65 61 73 65 28 70 43 68 69 6c 64 2d 3e  Release(pChild->
a610: 70 44 61 74 61 29 3b 0a 20 20 20 20 20 20 6d 65  pData);.      me
a620: 6d 73 65 74 28 70 43 68 69 6c 64 2c 20 30 2c 20  mset(pChild, 0, 
a630: 73 69 7a 65 6f 66 28 46 74 73 35 44 6c 69 64 78  sizeof(Fts5Dlidx
a640: 4c 76 6c 29 29 3b 0a 20 20 20 20 20 20 70 43 68  Lvl));.      pCh
a650: 69 6c 64 2d 3e 70 44 61 74 61 20 3d 20 66 74 73  ild->pData = fts
a660: 35 44 61 74 61 52 65 61 64 28 70 2c 20 0a 20 20  5DataRead(p, .  
a670: 20 20 20 20 20 20 20 20 46 54 53 35 5f 44 4c 49          FTS5_DLI
a680: 44 58 5f 52 4f 57 49 44 28 70 49 74 65 72 2d 3e  DX_ROWID(pIter->
a690: 69 53 65 67 69 64 2c 20 69 2d 31 2c 20 70 4c 76  iSegid, i-1, pLv
a6a0: 6c 2d 3e 69 4c 65 61 66 50 67 6e 6f 29 0a 20 20  l->iLeafPgno).  
a6b0: 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d      );.    }.  }
a6c0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74  .}../*.** Move t
a6d0: 68 65 20 69 74 65 72 61 74 6f 72 20 70 61 73 73  he iterator pass
a6e0: 65 64 20 61 73 20 74 68 65 20 6f 6e 6c 79 20 61  ed as the only a
a6f0: 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 65 20 70  rgument to the p
a700: 72 65 76 69 6f 75 73 20 65 6e 74 72 79 2e 0a 2a  revious entry..*
a710: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73  /.static int fts
a720: 35 44 6c 69 64 78 4c 76 6c 50 72 65 76 28 46 74  5DlidxLvlPrev(Ft
a730: 73 35 44 6c 69 64 78 4c 76 6c 20 2a 70 4c 76 6c  s5DlidxLvl *pLvl
a740: 29 7b 0a 20 20 69 6e 74 20 69 4f 66 66 20 3d 20  ){.  int iOff = 
a750: 70 4c 76 6c 2d 3e 69 4f 66 66 3b 0a 0a 20 20 61  pLvl->iOff;..  a
a760: 73 73 65 72 74 28 20 70 4c 76 6c 2d 3e 62 45 6f  ssert( pLvl->bEo
a770: 66 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 69 4f  f==0 );.  if( iO
a780: 66 66 3c 3d 70 4c 76 6c 2d 3e 69 46 69 72 73 74  ff<=pLvl->iFirst
a790: 4f 66 66 20 29 7b 0a 20 20 20 20 70 4c 76 6c 2d  Off ){.    pLvl-
a7a0: 3e 62 45 6f 66 20 3d 20 31 3b 0a 20 20 7d 65 6c  >bEof = 1;.  }el
a7b0: 73 65 7b 0a 20 20 20 20 75 38 20 2a 61 20 3d 20  se{.    u8 *a = 
a7c0: 70 4c 76 6c 2d 3e 70 44 61 74 61 2d 3e 70 3b 0a  pLvl->pData->p;.
a7d0: 20 20 20 20 69 36 34 20 69 56 61 6c 3b 0a 20 20      i64 iVal;.  
a7e0: 20 20 69 6e 74 20 69 4c 69 6d 69 74 3b 0a 20 20    int iLimit;.  
a7f0: 20 20 69 6e 74 20 69 69 3b 0a 20 20 20 20 69 6e    int ii;.    in
a800: 74 20 6e 5a 65 72 6f 20 3d 20 30 3b 0a 0a 20 20  t nZero = 0;..  
a810: 20 20 2f 2a 20 43 75 72 72 65 6e 74 6c 79 20 69    /* Currently i
a820: 4f 66 66 20 70 6f 69 6e 74 73 20 74 6f 20 74 68  Off points to th
a830: 65 20 66 69 72 73 74 20 62 79 74 65 20 6f 66 20  e first byte of 
a840: 61 20 76 61 72 69 6e 74 2e 20 54 68 69 73 20 62  a varint. This b
a850: 6c 6f 63 6b 20 0a 20 20 20 20 2a 2a 20 64 65 63  lock .    ** dec
a860: 72 65 6d 65 6e 74 73 20 69 4f 66 66 20 75 6e 74  rements iOff unt
a870: 69 6c 20 69 74 20 70 6f 69 6e 74 73 20 74 6f 20  il it points to 
a880: 74 68 65 20 66 69 72 73 74 20 62 79 74 65 20 6f  the first byte o
a890: 66 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 0a  f the previous .
a8a0: 20 20 20 20 2a 2a 20 76 61 72 69 6e 74 2e 20 54      ** varint. T
a8b0: 61 6b 69 6e 67 20 63 61 72 65 20 6e 6f 74 20 74  aking care not t
a8c0: 6f 20 72 65 61 64 20 61 6e 79 20 6d 65 6d 6f 72  o read any memor
a8d0: 79 20 6c 6f 63 61 74 69 6f 6e 73 20 74 68 61 74  y locations that
a8e0: 20 6f 63 63 75 72 0a 20 20 20 20 2a 2a 20 62 65   occur.    ** be
a8f0: 66 6f 72 65 20 74 68 65 20 62 75 66 66 65 72 20  fore the buffer 
a900: 69 6e 20 6d 65 6d 6f 72 79 2e 20 20 2a 2f 0a 20  in memory.  */. 
a910: 20 20 20 69 4c 69 6d 69 74 20 3d 20 28 69 4f 66     iLimit = (iOf
a920: 66 3e 39 20 3f 20 69 4f 66 66 2d 39 20 3a 20 30  f>9 ? iOff-9 : 0
a930: 29 3b 0a 20 20 20 20 66 6f 72 28 69 4f 66 66 2d  );.    for(iOff-
a940: 2d 3b 20 69 4f 66 66 3e 69 4c 69 6d 69 74 3b 20  -; iOff>iLimit; 
a950: 69 4f 66 66 2d 2d 29 7b 0a 20 20 20 20 20 20 69  iOff--){.      i
a960: 66 28 20 28 61 5b 69 4f 66 66 2d 31 5d 20 26 20  f( (a[iOff-1] & 
a970: 30 78 38 30 29 3d 3d 30 20 29 20 62 72 65 61 6b  0x80)==0 ) break
a980: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 66 74 73  ;.    }..    fts
a990: 35 47 65 74 56 61 72 69 6e 74 28 26 61 5b 69 4f  5GetVarint(&a[iO
a9a0: 66 66 5d 2c 20 28 75 36 34 2a 29 26 69 56 61 6c  ff], (u64*)&iVal
a9b0: 29 3b 0a 20 20 20 20 70 4c 76 6c 2d 3e 69 52 6f  );.    pLvl->iRo
a9c0: 77 69 64 20 2d 3d 20 69 56 61 6c 3b 0a 20 20 20  wid -= iVal;.   
a9d0: 20 70 4c 76 6c 2d 3e 69 4c 65 61 66 50 67 6e 6f   pLvl->iLeafPgno
a9e0: 2d 2d 3b 0a 0a 20 20 20 20 2f 2a 20 53 6b 69 70  --;..    /* Skip
a9f0: 20 62 61 63 6b 77 61 72 64 73 20 70 61 73 74 20   backwards past 
aa00: 61 6e 79 20 30 78 30 30 20 76 61 72 69 6e 74 73  any 0x00 varints
aa10: 2e 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 69 3d  . */.    for(ii=
aa20: 69 4f 66 66 2d 31 3b 20 69 69 3e 3d 70 4c 76 6c  iOff-1; ii>=pLvl
aa30: 2d 3e 69 46 69 72 73 74 4f 66 66 20 26 26 20 61  ->iFirstOff && a
aa40: 5b 69 69 5d 3d 3d 30 78 30 30 3b 20 69 69 2d 2d  [ii]==0x00; ii--
aa50: 29 7b 0a 20 20 20 20 20 20 6e 5a 65 72 6f 2b 2b  ){.      nZero++
aa60: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
aa70: 69 69 3e 3d 70 4c 76 6c 2d 3e 69 46 69 72 73 74  ii>=pLvl->iFirst
aa80: 4f 66 66 20 26 26 20 28 61 5b 69 69 5d 20 26 20  Off && (a[ii] & 
aa90: 30 78 38 30 29 20 29 7b 0a 20 20 20 20 20 20 2f  0x80) ){.      /
aaa0: 2a 20 54 68 65 20 62 79 74 65 20 69 6d 6d 65 64  * The byte immed
aab0: 69 61 74 65 6c 79 20 62 65 66 6f 72 65 20 74 68  iately before th
aac0: 65 20 6c 61 73 74 20 30 78 30 30 20 62 79 74 65  e last 0x00 byte
aad0: 20 68 61 73 20 74 68 65 20 30 78 38 30 20 62 69   has the 0x80 bi
aae0: 74 0a 20 20 20 20 20 20 2a 2a 20 73 65 74 2e 20  t.      ** set. 
aaf0: 53 6f 20 74 68 65 20 6c 61 73 74 20 30 78 30 30  So the last 0x00
ab00: 20 69 73 20 6f 6e 6c 79 20 61 20 76 61 72 69 6e   is only a varin
ab10: 74 20 30 20 69 66 20 74 68 65 72 65 20 61 72 65  t 0 if there are
ab20: 20 38 20 6d 6f 72 65 20 30 78 38 30 0a 20 20 20   8 more 0x80.   
ab30: 20 20 20 2a 2a 20 62 79 74 65 73 20 62 65 66 6f     ** bytes befo
ab40: 72 65 20 61 5b 69 69 5d 2e 20 2a 2f 0a 20 20 20  re a[ii]. */.   
ab50: 20 20 20 69 6e 74 20 62 5a 65 72 6f 20 3d 20 30     int bZero = 0
ab60: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
ab70: 2a 20 54 72 75 65 20 69 66 20 6c 61 73 74 20 30  * True if last 0
ab80: 78 30 30 20 63 6f 75 6e 74 73 20 2a 2f 0a 20 20  x00 counts */.  
ab90: 20 20 20 20 69 66 28 20 28 69 69 2d 38 29 3e 3d      if( (ii-8)>=
aba0: 70 4c 76 6c 2d 3e 69 46 69 72 73 74 4f 66 66 20  pLvl->iFirstOff 
abb0: 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6a  ){.        int j
abc0: 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d  ;.        for(j=
abd0: 31 3b 20 6a 3c 3d 38 20 26 26 20 28 61 5b 69 69  1; j<=8 && (a[ii
abe0: 2d 6a 5d 20 26 20 30 78 38 30 29 3b 20 6a 2b 2b  -j] & 0x80); j++
abf0: 29 3b 0a 20 20 20 20 20 20 20 20 62 5a 65 72 6f  );.        bZero
ac00: 20 3d 20 28 6a 3e 38 29 3b 0a 20 20 20 20 20 20   = (j>8);.      
ac10: 7d 0a 20 20 20 20 20 20 69 66 28 20 62 5a 65 72  }.      if( bZer
ac20: 6f 3d 3d 30 20 29 20 6e 5a 65 72 6f 2d 2d 3b 0a  o==0 ) nZero--;.
ac30: 20 20 20 20 7d 0a 20 20 20 20 70 4c 76 6c 2d 3e      }.    pLvl->
ac40: 69 4c 65 61 66 50 67 6e 6f 20 2d 3d 20 6e 5a 65  iLeafPgno -= nZe
ac50: 72 6f 3b 0a 20 20 20 20 70 4c 76 6c 2d 3e 69 4f  ro;.    pLvl->iO
ac60: 66 66 20 3d 20 69 4f 66 66 20 2d 20 6e 5a 65 72  ff = iOff - nZer
ac70: 6f 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  o;.  }..  return
ac80: 20 70 4c 76 6c 2d 3e 62 45 6f 66 3b 0a 7d 0a 0a   pLvl->bEof;.}..
ac90: 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 35 44  static int fts5D
aca0: 6c 69 64 78 49 74 65 72 50 72 65 76 52 28 46 74  lidxIterPrevR(Ft
acb0: 73 35 49 6e 64 65 78 20 2a 70 2c 20 46 74 73 35  s5Index *p, Fts5
acc0: 44 6c 69 64 78 49 74 65 72 20 2a 70 49 74 65 72  DlidxIter *pIter
acd0: 2c 20 69 6e 74 20 69 4c 76 6c 29 7b 0a 20 20 46  , int iLvl){.  F
ace0: 74 73 35 44 6c 69 64 78 4c 76 6c 20 2a 70 4c 76  ts5DlidxLvl *pLv
acf0: 6c 20 3d 20 26 70 49 74 65 72 2d 3e 61 4c 76 6c  l = &pIter->aLvl
ad00: 5b 69 4c 76 6c 5d 3b 0a 0a 20 20 61 73 73 65 72  [iLvl];..  asser
ad10: 74 28 20 69 4c 76 6c 3c 70 49 74 65 72 2d 3e 6e  t( iLvl<pIter->n
ad20: 4c 76 6c 20 29 3b 0a 20 20 69 66 28 20 66 74 73  Lvl );.  if( fts
ad30: 35 44 6c 69 64 78 4c 76 6c 50 72 65 76 28 70 4c  5DlidxLvlPrev(pL
ad40: 76 6c 29 20 29 7b 0a 20 20 20 20 69 66 28 20 28  vl) ){.    if( (
ad50: 69 4c 76 6c 2b 31 29 20 3c 20 70 49 74 65 72 2d  iLvl+1) < pIter-
ad60: 3e 6e 4c 76 6c 20 29 7b 0a 20 20 20 20 20 20 66  >nLvl ){.      f
ad70: 74 73 35 44 6c 69 64 78 49 74 65 72 50 72 65 76  ts5DlidxIterPrev
ad80: 52 28 70 2c 20 70 49 74 65 72 2c 20 69 4c 76 6c  R(p, pIter, iLvl
ad90: 2b 31 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  +1);.      if( p
ada0: 4c 76 6c 5b 31 5d 2e 62 45 6f 66 3d 3d 30 20 29  Lvl[1].bEof==0 )
adb0: 7b 0a 20 20 20 20 20 20 20 20 66 74 73 35 44 61  {.        fts5Da
adc0: 74 61 52 65 6c 65 61 73 65 28 70 4c 76 6c 2d 3e  taRelease(pLvl->
add0: 70 44 61 74 61 29 3b 0a 20 20 20 20 20 20 20 20  pData);.        
ade0: 6d 65 6d 73 65 74 28 70 4c 76 6c 2c 20 30 2c 20  memset(pLvl, 0, 
adf0: 73 69 7a 65 6f 66 28 46 74 73 35 44 6c 69 64 78  sizeof(Fts5Dlidx
ae00: 4c 76 6c 29 29 3b 0a 20 20 20 20 20 20 20 20 70  Lvl));.        p
ae10: 4c 76 6c 2d 3e 70 44 61 74 61 20 3d 20 66 74 73  Lvl->pData = fts
ae20: 35 44 61 74 61 52 65 61 64 28 70 2c 20 0a 20 20  5DataRead(p, .  
ae30: 20 20 20 20 20 20 20 20 20 20 46 54 53 35 5f 44            FTS5_D
ae40: 4c 49 44 58 5f 52 4f 57 49 44 28 70 49 74 65 72  LIDX_ROWID(pIter
ae50: 2d 3e 69 53 65 67 69 64 2c 20 69 4c 76 6c 2c 20  ->iSegid, iLvl, 
ae60: 70 4c 76 6c 5b 31 5d 2e 69 4c 65 61 66 50 67 6e  pLvl[1].iLeafPgn
ae70: 6f 29 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20  o).        );.  
ae80: 20 20 20 20 20 20 69 66 28 20 70 4c 76 6c 2d 3e        if( pLvl->
ae90: 70 44 61 74 61 20 29 7b 0a 20 20 20 20 20 20 20  pData ){.       
aea0: 20 20 20 77 68 69 6c 65 28 20 66 74 73 35 44 6c     while( fts5Dl
aeb0: 69 64 78 4c 76 6c 4e 65 78 74 28 70 4c 76 6c 29  idxLvlNext(pLvl)
aec0: 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20  ==0 );.         
aed0: 20 70 4c 76 6c 2d 3e 62 45 6f 66 20 3d 20 30 3b   pLvl->bEof = 0;
aee0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
aef0: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20   }.    }.  }..  
af00: 72 65 74 75 72 6e 20 70 49 74 65 72 2d 3e 61 4c  return pIter->aL
af10: 76 6c 5b 30 5d 2e 62 45 6f 66 3b 0a 7d 0a 73 74  vl[0].bEof;.}.st
af20: 61 74 69 63 20 69 6e 74 20 66 74 73 35 44 6c 69  atic int fts5Dli
af30: 64 78 49 74 65 72 50 72 65 76 28 46 74 73 35 49  dxIterPrev(Fts5I
af40: 6e 64 65 78 20 2a 70 2c 20 46 74 73 35 44 6c 69  ndex *p, Fts5Dli
af50: 64 78 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a  dxIter *pIter){.
af60: 20 20 72 65 74 75 72 6e 20 66 74 73 35 44 6c 69    return fts5Dli
af70: 64 78 49 74 65 72 50 72 65 76 52 28 70 2c 20 70  dxIterPrevR(p, p
af80: 49 74 65 72 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a  Iter, 0);.}../*.
af90: 2a 2a 20 46 72 65 65 20 61 20 64 6f 63 6c 69 73  ** Free a doclis
afa0: 74 2d 69 6e 64 65 78 20 69 74 65 72 61 74 6f 72  t-index iterator
afb0: 20 6f 62 6a 65 63 74 20 61 6c 6c 6f 63 61 74 65   object allocate
afc0: 64 20 62 79 20 66 74 73 35 44 6c 69 64 78 49 74  d by fts5DlidxIt
afd0: 65 72 49 6e 69 74 28 29 2e 0a 2a 2f 0a 73 74 61  erInit()..*/.sta
afe0: 74 69 63 20 76 6f 69 64 20 66 74 73 35 44 6c 69  tic void fts5Dli
aff0: 64 78 49 74 65 72 46 72 65 65 28 46 74 73 35 44  dxIterFree(Fts5D
b000: 6c 69 64 78 49 74 65 72 20 2a 70 49 74 65 72 29  lidxIter *pIter)
b010: 7b 0a 20 20 69 66 28 20 70 49 74 65 72 20 29 7b  {.  if( pIter ){
b020: 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
b030: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49 74 65 72  for(i=0; i<pIter
b040: 2d 3e 6e 4c 76 6c 3b 20 69 2b 2b 29 7b 0a 20 20  ->nLvl; i++){.  
b050: 20 20 20 20 66 74 73 35 44 61 74 61 52 65 6c 65      fts5DataRele
b060: 61 73 65 28 70 49 74 65 72 2d 3e 61 4c 76 6c 5b  ase(pIter->aLvl[
b070: 69 5d 2e 70 44 61 74 61 29 3b 0a 20 20 20 20 7d  i].pData);.    }
b080: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
b090: 65 28 70 49 74 65 72 29 3b 0a 20 20 7d 0a 7d 0a  e(pIter);.  }.}.
b0a0: 0a 73 74 61 74 69 63 20 46 74 73 35 44 6c 69 64  .static Fts5Dlid
b0b0: 78 49 74 65 72 20 2a 66 74 73 35 44 6c 69 64 78  xIter *fts5Dlidx
b0c0: 49 74 65 72 49 6e 69 74 28 0a 20 20 46 74 73 35  IterInit(.  Fts5
b0d0: 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20  Index *p,       
b0e0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
b0f0: 74 73 35 20 42 61 63 6b 65 6e 64 20 74 6f 20 69  ts5 Backend to i
b100: 74 65 72 61 74 65 20 77 69 74 68 69 6e 20 2a 2f  terate within */
b110: 0a 20 20 69 6e 74 20 62 52 65 76 2c 20 20 20 20  .  int bRev,    
b120: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b130: 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 4f     /* True for O
b140: 52 44 45 52 20 42 59 20 41 53 43 20 2a 2f 0a 20  RDER BY ASC */. 
b150: 20 69 6e 74 20 69 53 65 67 69 64 2c 20 20 20 20   int iSegid,    
b160: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b170: 20 2f 2a 20 53 65 67 6d 65 6e 74 20 69 64 20 2a   /* Segment id *
b180: 2f 0a 20 20 69 6e 74 20 69 4c 65 61 66 50 67 20  /.  int iLeafPg 
b190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b1a0: 20 20 20 20 2f 2a 20 4c 65 61 66 20 70 61 67 65      /* Leaf page
b1b0: 20 6e 75 6d 62 65 72 20 74 6f 20 6c 6f 61 64 20   number to load 
b1c0: 64 6c 69 64 78 20 66 6f 72 20 2a 2f 0a 29 7b 0a  dlidx for */.){.
b1d0: 20 20 46 74 73 35 44 6c 69 64 78 49 74 65 72 20    Fts5DlidxIter 
b1e0: 2a 70 49 74 65 72 20 3d 20 30 3b 0a 20 20 69 6e  *pIter = 0;.  in
b1f0: 74 20 69 3b 0a 20 20 69 6e 74 20 62 44 6f 6e 65  t i;.  int bDone
b200: 20 3d 20 30 3b 0a 0a 20 20 66 6f 72 28 69 3d 30   = 0;..  for(i=0
b210: 3b 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ; p->rc==SQLITE_
b220: 4f 4b 20 26 26 20 62 44 6f 6e 65 3d 3d 30 3b 20  OK && bDone==0; 
b230: 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6e 42  i++){.    int nB
b240: 79 74 65 20 3d 20 73 69 7a 65 6f 66 28 46 74 73  yte = sizeof(Fts
b250: 35 44 6c 69 64 78 49 74 65 72 29 20 2b 20 69 20  5DlidxIter) + i 
b260: 2a 20 73 69 7a 65 6f 66 28 46 74 73 35 44 6c 69  * sizeof(Fts5Dli
b270: 64 78 4c 76 6c 29 3b 0a 20 20 20 20 46 74 73 35  dxLvl);.    Fts5
b280: 44 6c 69 64 78 49 74 65 72 20 2a 70 4e 65 77 3b  DlidxIter *pNew;
b290: 0a 0a 20 20 20 20 70 4e 65 77 20 3d 20 28 46 74  ..    pNew = (Ft
b2a0: 73 35 44 6c 69 64 78 49 74 65 72 2a 29 73 71 6c  s5DlidxIter*)sql
b2b0: 69 74 65 33 5f 72 65 61 6c 6c 6f 63 28 70 49 74  ite3_realloc(pIt
b2c0: 65 72 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20 20  er, nByte);.    
b2d0: 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20  if( pNew==0 ){. 
b2e0: 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c       p->rc = SQL
b2f0: 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d  ITE_NOMEM;.    }
b300: 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 36 34 20  else{.      i64 
b310: 69 52 6f 77 69 64 20 3d 20 46 54 53 35 5f 44 4c  iRowid = FTS5_DL
b320: 49 44 58 5f 52 4f 57 49 44 28 69 53 65 67 69 64  IDX_ROWID(iSegid
b330: 2c 20 69 2c 20 69 4c 65 61 66 50 67 29 3b 0a 20  , i, iLeafPg);. 
b340: 20 20 20 20 20 46 74 73 35 44 6c 69 64 78 4c 76       Fts5DlidxLv
b350: 6c 20 2a 70 4c 76 6c 20 3d 20 26 70 4e 65 77 2d  l *pLvl = &pNew-
b360: 3e 61 4c 76 6c 5b 69 5d 3b 0a 20 20 20 20 20 20  >aLvl[i];.      
b370: 70 49 74 65 72 20 3d 20 70 4e 65 77 3b 0a 20 20  pIter = pNew;.  
b380: 20 20 20 20 6d 65 6d 73 65 74 28 70 4c 76 6c 2c      memset(pLvl,
b390: 20 30 2c 20 73 69 7a 65 6f 66 28 46 74 73 35 44   0, sizeof(Fts5D
b3a0: 6c 69 64 78 4c 76 6c 29 29 3b 0a 20 20 20 20 20  lidxLvl));.     
b3b0: 20 70 4c 76 6c 2d 3e 70 44 61 74 61 20 3d 20 66   pLvl->pData = f
b3c0: 74 73 35 44 61 74 61 52 65 61 64 28 70 2c 20 69  ts5DataRead(p, i
b3d0: 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 69 66  Rowid);.      if
b3e0: 28 20 70 4c 76 6c 2d 3e 70 44 61 74 61 20 26 26  ( pLvl->pData &&
b3f0: 20 28 70 4c 76 6c 2d 3e 70 44 61 74 61 2d 3e 70   (pLvl->pData->p
b400: 5b 30 5d 20 26 20 30 78 30 30 30 31 29 3d 3d 30  [0] & 0x0001)==0
b410: 20 29 7b 0a 20 20 20 20 20 20 20 20 62 44 6f 6e   ){.        bDon
b420: 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20  e = 1;.      }. 
b430: 20 20 20 20 20 70 49 74 65 72 2d 3e 6e 4c 76 6c       pIter->nLvl
b440: 20 3d 20 69 2b 31 3b 0a 20 20 20 20 7d 0a 20 20   = i+1;.    }.  
b450: 7d 0a 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d  }..  if( p->rc==
b460: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
b470: 20 70 49 74 65 72 2d 3e 69 53 65 67 69 64 20 3d   pIter->iSegid =
b480: 20 69 53 65 67 69 64 3b 0a 20 20 20 20 69 66 28   iSegid;.    if(
b490: 20 62 52 65 76 3d 3d 30 20 29 7b 0a 20 20 20 20   bRev==0 ){.    
b4a0: 20 20 66 74 73 35 44 6c 69 64 78 49 74 65 72 46    fts5DlidxIterF
b4b0: 69 72 73 74 28 70 49 74 65 72 29 3b 0a 20 20 20  irst(pIter);.   
b4c0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 66 74   }else{.      ft
b4d0: 73 35 44 6c 69 64 78 49 74 65 72 4c 61 73 74 28  s5DlidxIterLast(
b4e0: 70 2c 20 70 49 74 65 72 29 3b 0a 20 20 20 20 7d  p, pIter);.    }
b4f0: 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 2d 3e 72  .  }..  if( p->r
b500: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
b510: 20 20 20 20 66 74 73 35 44 6c 69 64 78 49 74 65      fts5DlidxIte
b520: 72 46 72 65 65 28 70 49 74 65 72 29 3b 0a 20 20  rFree(pIter);.  
b530: 20 20 70 49 74 65 72 20 3d 20 30 3b 0a 20 20 7d    pIter = 0;.  }
b540: 0a 0a 20 20 72 65 74 75 72 6e 20 70 49 74 65 72  ..  return pIter
b550: 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 36 34 20  ;.}..static i64 
b560: 66 74 73 35 44 6c 69 64 78 49 74 65 72 52 6f 77  fts5DlidxIterRow
b570: 69 64 28 46 74 73 35 44 6c 69 64 78 49 74 65 72  id(Fts5DlidxIter
b580: 20 2a 70 49 74 65 72 29 7b 0a 20 20 72 65 74 75   *pIter){.  retu
b590: 72 6e 20 70 49 74 65 72 2d 3e 61 4c 76 6c 5b 30  rn pIter->aLvl[0
b5a0: 5d 2e 69 52 6f 77 69 64 3b 0a 7d 0a 73 74 61 74  ].iRowid;.}.stat
b5b0: 69 63 20 69 6e 74 20 66 74 73 35 44 6c 69 64 78  ic int fts5Dlidx
b5c0: 49 74 65 72 50 67 6e 6f 28 46 74 73 35 44 6c 69  IterPgno(Fts5Dli
b5d0: 64 78 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a  dxIter *pIter){.
b5e0: 20 20 72 65 74 75 72 6e 20 70 49 74 65 72 2d 3e    return pIter->
b5f0: 61 4c 76 6c 5b 30 5d 2e 69 4c 65 61 66 50 67 6e  aLvl[0].iLeafPgn
b600: 6f 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 61 64  o;.}../*.** Load
b610: 20 74 68 65 20 6e 65 78 74 20 6c 65 61 66 20 70   the next leaf p
b620: 61 67 65 20 69 6e 74 6f 20 74 68 65 20 73 65 67  age into the seg
b630: 6d 65 6e 74 20 69 74 65 72 61 74 6f 72 2e 0a 2a  ment iterator..*
b640: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  /.static void ft
b650: 73 35 53 65 67 49 74 65 72 4e 65 78 74 50 61 67  s5SegIterNextPag
b660: 65 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a  e(.  Fts5Index *
b670: 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
b680: 20 20 20 20 20 2f 2a 20 46 54 53 35 20 62 61 63       /* FTS5 bac
b690: 6b 65 6e 64 20 6f 62 6a 65 63 74 20 2a 2f 0a 20  kend object */. 
b6a0: 20 46 74 73 35 53 65 67 49 74 65 72 20 2a 70 49   Fts5SegIter *pI
b6b0: 74 65 72 20 20 20 20 20 20 20 20 20 20 20 20 20  ter             
b6c0: 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 74 6f 20   /* Iterator to 
b6d0: 61 64 76 61 6e 63 65 20 74 6f 20 6e 65 78 74 20  advance to next 
b6e0: 70 61 67 65 20 2a 2f 0a 29 7b 0a 20 20 46 74 73  page */.){.  Fts
b6f0: 35 44 61 74 61 20 2a 70 4c 65 61 66 3b 0a 20 20  5Data *pLeaf;.  
b700: 46 74 73 35 53 74 72 75 63 74 75 72 65 53 65 67  Fts5StructureSeg
b710: 6d 65 6e 74 20 2a 70 53 65 67 20 3d 20 70 49 74  ment *pSeg = pIt
b720: 65 72 2d 3e 70 53 65 67 3b 0a 20 20 66 74 73 35  er->pSeg;.  fts5
b730: 44 61 74 61 52 65 6c 65 61 73 65 28 70 49 74 65  DataRelease(pIte
b740: 72 2d 3e 70 4c 65 61 66 29 3b 0a 20 20 70 49 74  r->pLeaf);.  pIt
b750: 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 2b 2b 3b  er->iLeafPgno++;
b760: 0a 20 20 69 66 28 20 70 49 74 65 72 2d 3e 70 4e  .  if( pIter->pN
b770: 65 78 74 4c 65 61 66 20 29 7b 0a 20 20 20 20 70  extLeaf ){.    p
b780: 49 74 65 72 2d 3e 70 4c 65 61 66 20 3d 20 70 49  Iter->pLeaf = pI
b790: 74 65 72 2d 3e 70 4e 65 78 74 4c 65 61 66 3b 0a  ter->pNextLeaf;.
b7a0: 20 20 20 20 70 49 74 65 72 2d 3e 70 4e 65 78 74      pIter->pNext
b7b0: 4c 65 61 66 20 3d 20 30 3b 0a 20 20 7d 65 6c 73  Leaf = 0;.  }els
b7c0: 65 20 69 66 28 20 70 49 74 65 72 2d 3e 69 4c 65  e if( pIter->iLe
b7d0: 61 66 50 67 6e 6f 3c 3d 70 53 65 67 2d 3e 70 67  afPgno<=pSeg->pg
b7e0: 6e 6f 4c 61 73 74 20 29 7b 0a 20 20 20 20 70 49  noLast ){.    pI
b7f0: 74 65 72 2d 3e 70 4c 65 61 66 20 3d 20 66 74 73  ter->pLeaf = fts
b800: 35 44 61 74 61 52 65 61 64 28 70 2c 20 0a 20 20  5DataRead(p, .  
b810: 20 20 20 20 20 20 46 54 53 35 5f 53 45 47 4d 45        FTS5_SEGME
b820: 4e 54 5f 52 4f 57 49 44 28 70 53 65 67 2d 3e 69  NT_ROWID(pSeg->i
b830: 53 65 67 69 64 2c 20 70 49 74 65 72 2d 3e 69 4c  Segid, pIter->iL
b840: 65 61 66 50 67 6e 6f 29 0a 20 20 20 20 29 3b 0a  eafPgno).    );.
b850: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 49 74    }else{.    pIt
b860: 65 72 2d 3e 70 4c 65 61 66 20 3d 20 30 3b 0a 20  er->pLeaf = 0;. 
b870: 20 7d 0a 20 20 70 4c 65 61 66 20 3d 20 70 49 74   }.  pLeaf = pIt
b880: 65 72 2d 3e 70 4c 65 61 66 3b 0a 0a 20 20 69 66  er->pLeaf;..  if
b890: 28 20 70 4c 65 61 66 20 29 7b 0a 20 20 20 20 70  ( pLeaf ){.    p
b8a0: 49 74 65 72 2d 3e 69 50 67 69 64 78 4f 66 66 20  Iter->iPgidxOff 
b8b0: 3d 20 70 4c 65 61 66 2d 3e 73 7a 4c 65 61 66 3b  = pLeaf->szLeaf;
b8c0: 0a 20 20 20 20 69 66 28 20 66 74 73 35 4c 65 61  .    if( fts5Lea
b8d0: 66 49 73 54 65 72 6d 6c 65 73 73 28 70 4c 65 61  fIsTermless(pLea
b8e0: 66 29 20 29 7b 0a 20 20 20 20 20 20 70 49 74 65  f) ){.      pIte
b8f0: 72 2d 3e 69 45 6e 64 6f 66 44 6f 63 6c 69 73 74  r->iEndofDoclist
b900: 20 3d 20 70 4c 65 61 66 2d 3e 6e 6e 2b 31 3b 0a   = pLeaf->nn+1;.
b910: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
b920: 20 70 49 74 65 72 2d 3e 69 50 67 69 64 78 4f 66   pIter->iPgidxOf
b930: 66 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69  f += fts5GetVari
b940: 6e 74 33 32 28 26 70 4c 65 61 66 2d 3e 70 5b 70  nt32(&pLeaf->p[p
b950: 49 74 65 72 2d 3e 69 50 67 69 64 78 4f 66 66 5d  Iter->iPgidxOff]
b960: 2c 0a 20 20 20 20 20 20 20 20 20 20 70 49 74 65  ,.          pIte
b970: 72 2d 3e 69 45 6e 64 6f 66 44 6f 63 6c 69 73 74  r->iEndofDoclist
b980: 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a  .      );.    }.
b990: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 72 67    }.}../*.** Arg
b9a0: 75 6d 65 6e 74 20 70 20 70 6f 69 6e 74 73 20 74  ument p points t
b9b0: 6f 20 61 20 62 75 66 66 65 72 20 63 6f 6e 74 61  o a buffer conta
b9c0: 69 6e 69 6e 67 20 61 20 76 61 72 69 6e 74 20 74  ining a varint t
b9d0: 6f 20 62 65 20 69 6e 74 65 72 70 72 65 74 65 64  o be interpreted
b9e0: 20 61 73 20 61 0a 2a 2a 20 70 6f 73 69 74 69 6f   as a.** positio
b9f0: 6e 20 6c 69 73 74 20 73 69 7a 65 20 66 69 65 6c  n list size fiel
ba00: 64 2e 20 52 65 61 64 20 74 68 65 20 76 61 72 69  d. Read the vari
ba10: 6e 74 20 61 6e 64 20 72 65 74 75 72 6e 20 74 68  nt and return th
ba20: 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  e number of byte
ba30: 73 0a 2a 2a 20 72 65 61 64 2e 20 42 65 66 6f 72  s.** read. Befor
ba40: 65 20 72 65 74 75 72 6e 69 6e 67 2c 20 73 65 74  e returning, set
ba50: 20 2a 70 6e 53 7a 20 74 6f 20 74 68 65 20 6e 75   *pnSz to the nu
ba60: 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e  mber of bytes in
ba70: 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 0a 2a 2a   the position.**
ba80: 20 6c 69 73 74 2c 20 61 6e 64 20 2a 70 62 44 65   list, and *pbDe
ba90: 6c 20 74 6f 20 74 72 75 65 20 69 66 20 74 68 65  l to true if the
baa0: 20 64 65 6c 65 74 65 20 66 6c 61 67 20 69 73 20   delete flag is 
bab0: 73 65 74 2c 20 6f 72 20 66 61 6c 73 65 20 6f 74  set, or false ot
bac0: 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 73 74 61 74  herwise..*/.stat
bad0: 69 63 20 69 6e 74 20 66 74 73 35 47 65 74 50 6f  ic int fts5GetPo
bae0: 73 6c 69 73 74 53 69 7a 65 28 63 6f 6e 73 74 20  slistSize(const 
baf0: 75 38 20 2a 70 2c 20 69 6e 74 20 2a 70 6e 53 7a  u8 *p, int *pnSz
bb00: 2c 20 69 6e 74 20 2a 70 62 44 65 6c 29 7b 0a 20  , int *pbDel){. 
bb10: 20 69 6e 74 20 6e 53 7a 3b 0a 20 20 69 6e 74 20   int nSz;.  int 
bb20: 6e 20 3d 20 30 3b 0a 20 20 66 74 73 35 46 61 73  n = 0;.  fts5Fas
bb30: 74 47 65 74 56 61 72 69 6e 74 33 32 28 70 2c 20  tGetVarint32(p, 
bb40: 6e 2c 20 6e 53 7a 29 3b 0a 20 20 61 73 73 65 72  n, nSz);.  asser
bb50: 74 5f 6e 63 28 20 6e 53 7a 3e 3d 30 20 29 3b 0a  t_nc( nSz>=0 );.
bb60: 20 20 2a 70 6e 53 7a 20 3d 20 6e 53 7a 2f 32 3b    *pnSz = nSz/2;
bb70: 0a 20 20 2a 70 62 44 65 6c 20 3d 20 6e 53 7a 20  .  *pbDel = nSz 
bb80: 26 20 30 78 30 30 30 31 3b 0a 20 20 72 65 74 75  & 0x0001;.  retu
bb90: 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46  rn n;.}../*.** F
bba0: 74 73 35 53 65 67 49 74 65 72 2e 69 4c 65 61 66  ts5SegIter.iLeaf
bbb0: 4f 66 66 73 65 74 20 63 75 72 72 65 6e 74 6c 79  Offset currently
bbc0: 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 66   points to the f
bbd0: 69 72 73 74 20 62 79 74 65 20 6f 66 20 61 0a 2a  irst byte of a.*
bbe0: 2a 20 70 6f 73 69 74 69 6f 6e 2d 6c 69 73 74 20  * position-list 
bbf0: 73 69 7a 65 20 66 69 65 6c 64 2e 20 52 65 61 64  size field. Read
bc00: 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68   the value of th
bc10: 65 20 66 69 65 6c 64 20 61 6e 64 20 73 74 6f 72  e field and stor
bc20: 65 20 69 74 0a 2a 2a 20 69 6e 20 74 68 65 20 66  e it.** in the f
bc30: 6f 6c 6c 6f 77 69 6e 67 20 76 61 72 69 61 62 6c  ollowing variabl
bc40: 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 46 74 73 35  es:.**.**   Fts5
bc50: 53 65 67 49 74 65 72 2e 6e 50 6f 73 0a 2a 2a 20  SegIter.nPos.** 
bc60: 20 20 46 74 73 35 53 65 67 49 74 65 72 2e 62 44    Fts5SegIter.bD
bc70: 65 6c 0a 2a 2a 0a 2a 2a 20 4c 65 61 76 65 20 46  el.**.** Leave F
bc80: 74 73 35 53 65 67 49 74 65 72 2e 69 4c 65 61 66  ts5SegIter.iLeaf
bc90: 4f 66 66 73 65 74 20 70 6f 69 6e 74 69 6e 67 20  Offset pointing 
bca0: 74 6f 20 74 68 65 20 66 69 72 73 74 20 62 79 74  to the first byt
bcb0: 65 20 6f 66 20 74 68 65 20 0a 2a 2a 20 70 6f 73  e of the .** pos
bcc0: 69 74 69 6f 6e 20 6c 69 73 74 20 63 6f 6e 74 65  ition list conte
bcd0: 6e 74 20 28 69 66 20 61 6e 79 29 2e 0a 2a 2f 0a  nt (if any)..*/.
bce0: 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
bcf0: 53 65 67 49 74 65 72 4c 6f 61 64 4e 50 6f 73 28  SegIterLoadNPos(
bd00: 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 46 74  Fts5Index *p, Ft
bd10: 73 35 53 65 67 49 74 65 72 20 2a 70 49 74 65 72  s5SegIter *pIter
bd20: 29 7b 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d  ){.  if( p->rc==
bd30: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
bd40: 20 69 6e 74 20 69 4f 66 66 20 3d 20 70 49 74 65   int iOff = pIte
bd50: 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 3b 20  r->iLeafOffset; 
bd60: 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 72 65   /* Offset to re
bd70: 61 64 20 61 74 20 2a 2f 0a 20 20 20 20 41 53 53  ad at */.    ASS
bd80: 45 52 54 5f 53 5a 4c 45 41 46 5f 4f 4b 28 70 49  ERT_SZLEAF_OK(pI
bd90: 74 65 72 2d 3e 70 4c 65 61 66 29 3b 0a 20 20 20  ter->pLeaf);.   
bda0: 20 69 66 28 20 70 2d 3e 70 43 6f 6e 66 69 67 2d   if( p->pConfig-
bdb0: 3e 65 44 65 74 61 69 6c 3d 3d 46 54 53 35 5f 44  >eDetail==FTS5_D
bdc0: 45 54 41 49 4c 5f 4e 4f 4e 45 20 29 7b 0a 20 20  ETAIL_NONE ){.  
bdd0: 20 20 20 20 69 6e 74 20 69 45 6f 64 20 3d 20 4d      int iEod = M
bde0: 49 4e 28 70 49 74 65 72 2d 3e 69 45 6e 64 6f 66  IN(pIter->iEndof
bdf0: 44 6f 63 6c 69 73 74 2c 20 70 49 74 65 72 2d 3e  Doclist, pIter->
be00: 70 4c 65 61 66 2d 3e 73 7a 4c 65 61 66 29 3b 0a  pLeaf->szLeaf);.
be10: 20 20 20 20 20 20 70 49 74 65 72 2d 3e 62 44 65        pIter->bDe
be20: 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 49 74  l = 0;.      pIt
be30: 65 72 2d 3e 6e 50 6f 73 20 3d 20 31 3b 0a 20 20  er->nPos = 1;.  
be40: 20 20 20 20 69 66 28 20 69 4f 66 66 3c 69 45 6f      if( iOff<iEo
be50: 64 20 26 26 20 70 49 74 65 72 2d 3e 70 4c 65 61  d && pIter->pLea
be60: 66 2d 3e 70 5b 69 4f 66 66 5d 3d 3d 30 20 29 7b  f->p[iOff]==0 ){
be70: 0a 20 20 20 20 20 20 20 20 70 49 74 65 72 2d 3e  .        pIter->
be80: 62 44 65 6c 20 3d 20 31 3b 0a 20 20 20 20 20 20  bDel = 1;.      
be90: 20 20 69 4f 66 66 2b 2b 3b 0a 20 20 20 20 20 20    iOff++;.      
bea0: 20 20 69 66 28 20 69 4f 66 66 3c 69 45 6f 64 20    if( iOff<iEod 
beb0: 26 26 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d  && pIter->pLeaf-
bec0: 3e 70 5b 69 4f 66 66 5d 3d 3d 30 20 29 7b 0a 20  >p[iOff]==0 ){. 
bed0: 20 20 20 20 20 20 20 20 20 70 49 74 65 72 2d 3e           pIter->
bee0: 6e 50 6f 73 20 3d 20 31 3b 0a 20 20 20 20 20 20  nPos = 1;.      
bef0: 20 20 20 20 69 4f 66 66 2b 2b 3b 0a 20 20 20 20      iOff++;.    
bf00: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
bf10: 20 20 20 20 20 70 49 74 65 72 2d 3e 6e 50 6f 73       pIter->nPos
bf20: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a   = 0;.        }.
bf30: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
bf40: 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 53 7a  e{.      int nSz
bf50: 3b 0a 20 20 20 20 20 20 66 74 73 35 46 61 73 74  ;.      fts5Fast
bf60: 47 65 74 56 61 72 69 6e 74 33 32 28 70 49 74 65  GetVarint32(pIte
bf70: 72 2d 3e 70 4c 65 61 66 2d 3e 70 2c 20 69 4f 66  r->pLeaf->p, iOf
bf80: 66 2c 20 6e 53 7a 29 3b 0a 20 20 20 20 20 20 70  f, nSz);.      p
bf90: 49 74 65 72 2d 3e 62 44 65 6c 20 3d 20 28 6e 53  Iter->bDel = (nS
bfa0: 7a 20 26 20 30 78 30 30 30 31 29 3b 0a 20 20 20  z & 0x0001);.   
bfb0: 20 20 20 70 49 74 65 72 2d 3e 6e 50 6f 73 20 3d     pIter->nPos =
bfc0: 20 6e 53 7a 3e 3e 31 3b 0a 20 20 20 20 20 20 61   nSz>>1;.      a
bfd0: 73 73 65 72 74 5f 6e 63 28 20 70 49 74 65 72 2d  ssert_nc( pIter-
bfe0: 3e 6e 50 6f 73 3e 3d 30 20 29 3b 0a 20 20 20 20  >nPos>=0 );.    
bff0: 7d 0a 20 20 20 20 70 49 74 65 72 2d 3e 69 4c 65  }.    pIter->iLe
c000: 61 66 4f 66 66 73 65 74 20 3d 20 69 4f 66 66 3b  afOffset = iOff;
c010: 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 76  .  }.}..static v
c020: 6f 69 64 20 66 74 73 35 53 65 67 49 74 65 72 4c  oid fts5SegIterL
c030: 6f 61 64 52 6f 77 69 64 28 46 74 73 35 49 6e 64  oadRowid(Fts5Ind
c040: 65 78 20 2a 70 2c 20 46 74 73 35 53 65 67 49 74  ex *p, Fts5SegIt
c050: 65 72 20 2a 70 49 74 65 72 29 7b 0a 20 20 75 38  er *pIter){.  u8
c060: 20 2a 61 20 3d 20 70 49 74 65 72 2d 3e 70 4c 65   *a = pIter->pLe
c070: 61 66 2d 3e 70 3b 20 20 20 20 20 20 20 20 2f 2a  af->p;        /*
c080: 20 42 75 66 66 65 72 20 74 6f 20 72 65 61 64 20   Buffer to read 
c090: 64 61 74 61 20 66 72 6f 6d 20 2a 2f 0a 20 20 69  data from */.  i
c0a0: 6e 74 20 69 4f 66 66 20 3d 20 70 49 74 65 72 2d  nt iOff = pIter-
c0b0: 3e 69 4c 65 61 66 4f 66 66 73 65 74 3b 0a 0a 20  >iLeafOffset;.. 
c0c0: 20 41 53 53 45 52 54 5f 53 5a 4c 45 41 46 5f 4f   ASSERT_SZLEAF_O
c0d0: 4b 28 70 49 74 65 72 2d 3e 70 4c 65 61 66 29 3b  K(pIter->pLeaf);
c0e0: 0a 20 20 69 66 28 20 69 4f 66 66 3e 3d 70 49 74  .  if( iOff>=pIt
c0f0: 65 72 2d 3e 70 4c 65 61 66 2d 3e 73 7a 4c 65 61  er->pLeaf->szLea
c100: 66 20 29 7b 0a 20 20 20 20 66 74 73 35 53 65 67  f ){.    fts5Seg
c110: 49 74 65 72 4e 65 78 74 50 61 67 65 28 70 2c 20  IterNextPage(p, 
c120: 70 49 74 65 72 29 3b 0a 20 20 20 20 69 66 28 20  pIter);.    if( 
c130: 70 49 74 65 72 2d 3e 70 4c 65 61 66 3d 3d 30 20  pIter->pLeaf==0 
c140: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e  ){.      if( p->
c150: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc==SQLITE_OK ) 
c160: 70 2d 3e 72 63 20 3d 20 46 54 53 35 5f 43 4f 52  p->rc = FTS5_COR
c170: 52 55 50 54 3b 0a 20 20 20 20 20 20 72 65 74 75  RUPT;.      retu
c180: 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 4f  rn;.    }.    iO
c190: 66 66 20 3d 20 34 3b 0a 20 20 20 20 61 20 3d 20  ff = 4;.    a = 
c1a0: 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 70 3b  pIter->pLeaf->p;
c1b0: 0a 20 20 7d 0a 20 20 69 4f 66 66 20 2b 3d 20 73  .  }.  iOff += s
c1c0: 71 6c 69 74 65 33 46 74 73 35 47 65 74 56 61 72  qlite3Fts5GetVar
c1d0: 69 6e 74 28 26 61 5b 69 4f 66 66 5d 2c 20 28 75  int(&a[iOff], (u
c1e0: 36 34 2a 29 26 70 49 74 65 72 2d 3e 69 52 6f 77  64*)&pIter->iRow
c1f0: 69 64 29 3b 0a 20 20 70 49 74 65 72 2d 3e 69 4c  id);.  pIter->iL
c200: 65 61 66 4f 66 66 73 65 74 20 3d 20 69 4f 66 66  eafOffset = iOff
c210: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 74 73 35 53  ;.}../*.** Fts5S
c220: 65 67 49 74 65 72 2e 69 4c 65 61 66 4f 66 66 73  egIter.iLeafOffs
c230: 65 74 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69  et currently poi
c240: 6e 74 73 20 74 6f 20 74 68 65 20 66 69 72 73 74  nts to the first
c250: 20 62 79 74 65 20 6f 66 20 74 68 65 20 0a 2a 2a   byte of the .**
c260: 20 22 6e 53 75 66 66 69 78 22 20 66 69 65 6c 64   "nSuffix" field
c270: 20 6f 66 20 61 20 74 65 72 6d 2e 20 46 75 6e 63   of a term. Func
c280: 74 69 6f 6e 20 70 61 72 61 6d 65 74 65 72 20 6e  tion parameter n
c290: 4b 65 65 70 20 63 6f 6e 74 61 69 6e 73 20 74 68  Keep contains th
c2a0: 65 20 76 61 6c 75 65 0a 2a 2a 20 6f 66 20 74 68  e value.** of th
c2b0: 65 20 22 6e 50 72 65 66 69 78 22 20 66 69 65 6c  e "nPrefix" fiel
c2c0: 64 20 28 69 66 20 74 68 65 72 65 20 77 61 73 20  d (if there was 
c2d0: 6f 6e 65 20 2d 20 69 74 20 69 73 20 70 61 73 73  one - it is pass
c2e0: 65 64 20 30 20 69 66 20 74 68 69 73 20 69 73 0a  ed 0 if this is.
c2f0: 2a 2a 20 74 68 65 20 66 69 72 73 74 20 74 65 72  ** the first ter
c300: 6d 20 69 6e 20 74 68 65 20 73 65 67 6d 65 6e 74  m in the segment
c310: 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75  )..**.** This fu
c320: 6e 63 74 69 6f 6e 20 70 6f 70 75 6c 61 74 65 73  nction populates
c330: 3a 0a 2a 2a 0a 2a 2a 20 20 20 46 74 73 35 53 65  :.**.**   Fts5Se
c340: 67 49 74 65 72 2e 74 65 72 6d 0a 2a 2a 20 20 20  gIter.term.**   
c350: 46 74 73 35 53 65 67 49 74 65 72 2e 72 6f 77 69  Fts5SegIter.rowi
c360: 64 0a 2a 2a 0a 2a 2a 20 61 63 63 6f 72 64 69 6e  d.**.** accordin
c370: 67 6c 79 20 61 6e 64 20 6c 65 61 76 65 73 20 28  gly and leaves (
c380: 46 74 73 35 53 65 67 49 74 65 72 2e 69 4c 65 61  Fts5SegIter.iLea
c390: 66 4f 66 66 73 65 74 29 20 73 65 74 20 74 6f 20  fOffset) set to 
c3a0: 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 0a 2a  the content of.*
c3b0: 2a 20 74 68 65 20 66 69 72 73 74 20 70 6f 73 69  * the first posi
c3c0: 74 69 6f 6e 20 6c 69 73 74 2e 20 54 68 65 20 70  tion list. The p
c3d0: 6f 73 69 74 69 6f 6e 20 6c 69 73 74 20 62 65 6c  osition list bel
c3e0: 6f 6e 67 69 6e 67 20 74 6f 20 64 6f 63 75 6d 65  onging to docume
c3f0: 6e 74 20 0a 2a 2a 20 28 46 74 73 35 53 65 67 49  nt .** (Fts5SegI
c400: 74 65 72 2e 69 52 6f 77 69 64 29 2e 0a 2a 2f 0a  ter.iRowid)..*/.
c410: 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
c420: 53 65 67 49 74 65 72 4c 6f 61 64 54 65 72 6d 28  SegIterLoadTerm(
c430: 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 46 74  Fts5Index *p, Ft
c440: 73 35 53 65 67 49 74 65 72 20 2a 70 49 74 65 72  s5SegIter *pIter
c450: 2c 20 69 6e 74 20 6e 4b 65 65 70 29 7b 0a 20 20  , int nKeep){.  
c460: 75 38 20 2a 61 20 3d 20 70 49 74 65 72 2d 3e 70  u8 *a = pIter->p
c470: 4c 65 61 66 2d 3e 70 3b 20 20 20 20 20 20 20 20  Leaf->p;        
c480: 2f 2a 20 42 75 66 66 65 72 20 74 6f 20 72 65 61  /* Buffer to rea
c490: 64 20 64 61 74 61 20 66 72 6f 6d 20 2a 2f 0a 20  d data from */. 
c4a0: 20 69 6e 74 20 69 4f 66 66 20 3d 20 70 49 74 65   int iOff = pIte
c4b0: 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 3b 20  r->iLeafOffset; 
c4c0: 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 72 65   /* Offset to re
c4d0: 61 64 20 61 74 20 2a 2f 0a 20 20 69 6e 74 20 6e  ad at */.  int n
c4e0: 4e 65 77 3b 20 20 20 20 20 20 20 20 20 20 20 20  New;            
c4f0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79             /* By
c500: 74 65 73 20 6f 66 20 6e 65 77 20 64 61 74 61 20  tes of new data 
c510: 2a 2f 0a 0a 20 20 69 4f 66 66 20 2b 3d 20 66 74  */..  iOff += ft
c520: 73 35 47 65 74 56 61 72 69 6e 74 33 32 28 26 61  s5GetVarint32(&a
c530: 5b 69 4f 66 66 5d 2c 20 6e 4e 65 77 29 3b 0a 20  [iOff], nNew);. 
c540: 20 70 49 74 65 72 2d 3e 74 65 72 6d 2e 6e 20 3d   pIter->term.n =
c550: 20 6e 4b 65 65 70 3b 0a 20 20 66 74 73 35 42 75   nKeep;.  fts5Bu
c560: 66 66 65 72 41 70 70 65 6e 64 42 6c 6f 62 28 26  fferAppendBlob(&
c570: 70 2d 3e 72 63 2c 20 26 70 49 74 65 72 2d 3e 74  p->rc, &pIter->t
c580: 65 72 6d 2c 20 6e 4e 65 77 2c 20 26 61 5b 69 4f  erm, nNew, &a[iO
c590: 66 66 5d 29 3b 0a 20 20 69 4f 66 66 20 2b 3d 20  ff]);.  iOff += 
c5a0: 6e 4e 65 77 3b 0a 20 20 70 49 74 65 72 2d 3e 69  nNew;.  pIter->i
c5b0: 54 65 72 6d 4c 65 61 66 4f 66 66 73 65 74 20 3d  TermLeafOffset =
c5c0: 20 69 4f 66 66 3b 0a 20 20 70 49 74 65 72 2d 3e   iOff;.  pIter->
c5d0: 69 54 65 72 6d 4c 65 61 66 50 67 6e 6f 20 3d 20  iTermLeafPgno = 
c5e0: 70 49 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f  pIter->iLeafPgno
c5f0: 3b 0a 20 20 70 49 74 65 72 2d 3e 69 4c 65 61 66  ;.  pIter->iLeaf
c600: 4f 66 66 73 65 74 20 3d 20 69 4f 66 66 3b 0a 0a  Offset = iOff;..
c610: 20 20 69 66 28 20 70 49 74 65 72 2d 3e 69 50 67    if( pIter->iPg
c620: 69 64 78 4f 66 66 3e 3d 70 49 74 65 72 2d 3e 70  idxOff>=pIter->p
c630: 4c 65 61 66 2d 3e 6e 6e 20 29 7b 0a 20 20 20 20  Leaf->nn ){.    
c640: 70 49 74 65 72 2d 3e 69 45 6e 64 6f 66 44 6f 63  pIter->iEndofDoc
c650: 6c 69 73 74 20 3d 20 70 49 74 65 72 2d 3e 70 4c  list = pIter->pL
c660: 65 61 66 2d 3e 6e 6e 2b 31 3b 0a 20 20 7d 65 6c  eaf->nn+1;.  }el
c670: 73 65 7b 0a 20 20 20 20 69 6e 74 20 6e 45 78 74  se{.    int nExt
c680: 72 61 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 69  ra;.    pIter->i
c690: 50 67 69 64 78 4f 66 66 20 2b 3d 20 66 74 73 35  PgidxOff += fts5
c6a0: 47 65 74 56 61 72 69 6e 74 33 32 28 26 61 5b 70  GetVarint32(&a[p
c6b0: 49 74 65 72 2d 3e 69 50 67 69 64 78 4f 66 66 5d  Iter->iPgidxOff]
c6c0: 2c 20 6e 45 78 74 72 61 29 3b 0a 20 20 20 20 70  , nExtra);.    p
c6d0: 49 74 65 72 2d 3e 69 45 6e 64 6f 66 44 6f 63 6c  Iter->iEndofDocl
c6e0: 69 73 74 20 2b 3d 20 6e 45 78 74 72 61 3b 0a 20  ist += nExtra;. 
c6f0: 20 7d 0a 0a 20 20 66 74 73 35 53 65 67 49 74 65   }..  fts5SegIte
c700: 72 4c 6f 61 64 52 6f 77 69 64 28 70 2c 20 70 49  rLoadRowid(p, pI
c710: 74 65 72 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20  ter);.}..static 
c720: 76 6f 69 64 20 66 74 73 35 53 65 67 49 74 65 72  void fts5SegIter
c730: 4e 65 78 74 28 46 74 73 35 49 6e 64 65 78 2a 2c  Next(Fts5Index*,
c740: 20 46 74 73 35 53 65 67 49 74 65 72 2a 2c 20 69   Fts5SegIter*, i
c750: 6e 74 2a 29 3b 0a 73 74 61 74 69 63 20 76 6f 69  nt*);.static voi
c760: 64 20 66 74 73 35 53 65 67 49 74 65 72 4e 65 78  d fts5SegIterNex
c770: 74 5f 52 65 76 65 72 73 65 28 46 74 73 35 49 6e  t_Reverse(Fts5In
c780: 64 65 78 2a 2c 20 46 74 73 35 53 65 67 49 74 65  dex*, Fts5SegIte
c790: 72 2a 2c 20 69 6e 74 2a 29 3b 0a 73 74 61 74 69  r*, int*);.stati
c7a0: 63 20 76 6f 69 64 20 66 74 73 35 53 65 67 49 74  c void fts5SegIt
c7b0: 65 72 4e 65 78 74 5f 4e 6f 6e 65 28 46 74 73 35  erNext_None(Fts5
c7c0: 49 6e 64 65 78 2a 2c 20 46 74 73 35 53 65 67 49  Index*, Fts5SegI
c7d0: 74 65 72 2a 2c 20 69 6e 74 2a 29 3b 0a 0a 73 74  ter*, int*);..st
c7e0: 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 53 65  atic void fts5Se
c7f0: 67 49 74 65 72 53 65 74 4e 65 78 74 28 46 74 73  gIterSetNext(Fts
c800: 35 49 6e 64 65 78 20 2a 70 2c 20 46 74 73 35 53  5Index *p, Fts5S
c810: 65 67 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a  egIter *pIter){.
c820: 20 20 69 66 28 20 70 49 74 65 72 2d 3e 66 6c 61    if( pIter->fla
c830: 67 73 20 26 20 46 54 53 35 5f 53 45 47 49 54 45  gs & FTS5_SEGITE
c840: 52 5f 52 45 56 45 52 53 45 20 29 7b 0a 20 20 20  R_REVERSE ){.   
c850: 20 70 49 74 65 72 2d 3e 78 4e 65 78 74 20 3d 20   pIter->xNext = 
c860: 66 74 73 35 53 65 67 49 74 65 72 4e 65 78 74 5f  fts5SegIterNext_
c870: 52 65 76 65 72 73 65 3b 0a 20 20 7d 65 6c 73 65  Reverse;.  }else
c880: 20 69 66 28 20 70 2d 3e 70 43 6f 6e 66 69 67 2d   if( p->pConfig-
c890: 3e 65 44 65 74 61 69 6c 3d 3d 46 54 53 35 5f 44  >eDetail==FTS5_D
c8a0: 45 54 41 49 4c 5f 4e 4f 4e 45 20 29 7b 0a 20 20  ETAIL_NONE ){.  
c8b0: 20 20 70 49 74 65 72 2d 3e 78 4e 65 78 74 20 3d    pIter->xNext =
c8c0: 20 66 74 73 35 53 65 67 49 74 65 72 4e 65 78 74   fts5SegIterNext
c8d0: 5f 4e 6f 6e 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a  _None;.  }else{.
c8e0: 20 20 20 20 70 49 74 65 72 2d 3e 78 4e 65 78 74      pIter->xNext
c8f0: 20 3d 20 66 74 73 35 53 65 67 49 74 65 72 4e 65   = fts5SegIterNe
c900: 78 74 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  xt;.  }.}../*.**
c910: 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20   Initialize the 
c920: 69 74 65 72 61 74 6f 72 20 6f 62 6a 65 63 74 20  iterator object 
c930: 70 49 74 65 72 20 74 6f 20 69 74 65 72 61 74 65  pIter to iterate
c940: 20 74 68 72 6f 75 67 68 20 74 68 65 20 65 6e 74   through the ent
c950: 72 69 65 73 20 69 6e 0a 2a 2a 20 73 65 67 6d 65  ries in.** segme
c960: 6e 74 20 70 53 65 67 2e 20 54 68 65 20 69 74 65  nt pSeg. The ite
c970: 72 61 74 6f 72 20 69 73 20 6c 65 66 74 20 70 6f  rator is left po
c980: 69 6e 74 69 6e 67 20 74 6f 20 74 68 65 20 66 69  inting to the fi
c990: 72 73 74 20 65 6e 74 72 79 20 77 68 65 6e 20 0a  rst entry when .
c9a0: 2a 2a 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** this function
c9b0: 20 72 65 74 75 72 6e 73 2e 0a 2a 2a 0a 2a 2a 20   returns..**.** 
c9c0: 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
c9d0: 72 73 2c 20 46 74 73 35 49 6e 64 65 78 2e 72 63  rs, Fts5Index.rc
c9e0: 20 69 73 20 73 65 74 20 74 6f 20 61 6e 20 61 70   is set to an ap
c9f0: 70 72 6f 70 72 69 61 74 65 20 65 72 72 6f 72 20  propriate error 
ca00: 63 6f 64 65 2e 20 49 66 20 0a 2a 2a 20 61 6e 20  code. If .** an 
ca10: 65 72 72 6f 72 20 68 61 73 20 61 6c 72 65 61 64  error has alread
ca20: 79 20 6f 63 63 75 72 72 65 64 20 77 68 65 6e 20  y occurred when 
ca30: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
ca40: 20 63 61 6c 6c 65 64 2c 20 69 74 20 69 73 20 61   called, it is a
ca50: 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69   no-op..*/.stati
ca60: 63 20 76 6f 69 64 20 66 74 73 35 53 65 67 49 74  c void fts5SegIt
ca70: 65 72 49 6e 69 74 28 0a 20 20 46 74 73 35 49 6e  erInit(.  Fts5In
ca80: 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20 20  dex *p,         
ca90: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53            /* FTS
caa0: 20 69 6e 64 65 78 20 6f 62 6a 65 63 74 20 2a 2f   index object */
cab0: 0a 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65  .  Fts5Structure
cac0: 53 65 67 6d 65 6e 74 20 2a 70 53 65 67 2c 20 20  Segment *pSeg,  
cad0: 20 20 20 2f 2a 20 44 65 73 63 72 69 70 74 69 6f     /* Descriptio
cae0: 6e 20 6f 66 20 73 65 67 6d 65 6e 74 20 2a 2f 0a  n of segment */.
caf0: 20 20 46 74 73 35 53 65 67 49 74 65 72 20 2a 70    Fts5SegIter *p
cb00: 49 74 65 72 20 20 20 20 20 20 20 20 20 20 20 20  Iter            
cb10: 20 20 2f 2a 20 4f 62 6a 65 63 74 20 74 6f 20 70    /* Object to p
cb20: 6f 70 75 6c 61 74 65 20 2a 2f 0a 29 7b 0a 20 20  opulate */.){.  
cb30: 69 66 28 20 70 53 65 67 2d 3e 70 67 6e 6f 46 69  if( pSeg->pgnoFi
cb40: 72 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a  rst==0 ){.    /*
cb50: 20 54 68 69 73 20 68 61 70 70 65 6e 73 20 69 66   This happens if
cb60: 20 74 68 65 20 73 65 67 6d 65 6e 74 20 69 73 20   the segment is 
cb70: 62 65 69 6e 67 20 75 73 65 64 20 61 73 20 61 6e  being used as an
cb80: 20 69 6e 70 75 74 20 74 6f 20 61 6e 20 69 6e 63   input to an inc
cb90: 72 65 6d 65 6e 74 61 6c 0a 20 20 20 20 2a 2a 20  remental.    ** 
cba0: 6d 65 72 67 65 20 61 6e 64 20 61 6c 6c 20 64 61  merge and all da
cbb0: 74 61 20 68 61 73 20 61 6c 72 65 61 64 79 20 62  ta has already b
cbc0: 65 65 6e 20 22 74 72 69 6d 6d 65 64 22 2e 20 53  een "trimmed". S
cbd0: 65 65 20 66 75 6e 63 74 69 6f 6e 0a 20 20 20 20  ee function.    
cbe0: 2a 2a 20 66 74 73 35 54 72 69 6d 53 65 67 6d 65  ** fts5TrimSegme
cbf0: 6e 74 73 28 29 20 66 6f 72 20 64 65 74 61 69 6c  nts() for detail
cc00: 73 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  s. In this case 
cc10: 6c 65 61 76 65 20 74 68 65 20 69 74 65 72 61 74  leave the iterat
cc20: 6f 72 20 65 6d 70 74 79 2e 0a 20 20 20 20 2a 2a  or empty..    **
cc30: 20 54 68 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c   The caller will
cc40: 20 73 65 65 20 74 68 65 20 28 70 49 74 65 72 2d   see the (pIter-
cc50: 3e 70 4c 65 61 66 3d 3d 30 29 20 61 6e 64 20 61  >pLeaf==0) and a
cc60: 73 73 75 6d 65 20 74 68 65 20 69 74 65 72 61 74  ssume the iterat
cc70: 6f 72 20 69 73 0a 20 20 20 20 2a 2a 20 61 74 20  or is.    ** at 
cc80: 45 4f 46 20 61 6c 72 65 61 64 79 2e 20 2a 2f 0a  EOF already. */.
cc90: 20 20 20 20 61 73 73 65 72 74 28 20 70 49 74 65      assert( pIte
cca0: 72 2d 3e 70 4c 65 61 66 3d 3d 30 20 29 3b 0a 20  r->pLeaf==0 );. 
ccb0: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a     return;.  }..
ccc0: 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c    if( p->rc==SQL
ccd0: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 6d 65  ITE_OK ){.    me
cce0: 6d 73 65 74 28 70 49 74 65 72 2c 20 30 2c 20 73  mset(pIter, 0, s
ccf0: 69 7a 65 6f 66 28 2a 70 49 74 65 72 29 29 3b 0a  izeof(*pIter));.
cd00: 20 20 20 20 66 74 73 35 53 65 67 49 74 65 72 53      fts5SegIterS
cd10: 65 74 4e 65 78 74 28 70 2c 20 70 49 74 65 72 29  etNext(p, pIter)
cd20: 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 70 53 65  ;.    pIter->pSe
cd30: 67 20 3d 20 70 53 65 67 3b 0a 20 20 20 20 70 49  g = pSeg;.    pI
cd40: 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 20 3d  ter->iLeafPgno =
cd50: 20 70 53 65 67 2d 3e 70 67 6e 6f 46 69 72 73 74   pSeg->pgnoFirst
cd60: 2d 31 3b 0a 20 20 20 20 66 74 73 35 53 65 67 49  -1;.    fts5SegI
cd70: 74 65 72 4e 65 78 74 50 61 67 65 28 70 2c 20 70  terNextPage(p, p
cd80: 49 74 65 72 29 3b 0a 20 20 7d 0a 0a 20 20 69 66  Iter);.  }..  if
cd90: 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
cda0: 4f 4b 20 29 7b 0a 20 20 20 20 70 49 74 65 72 2d  OK ){.    pIter-
cdb0: 3e 69 4c 65 61 66 4f 66 66 73 65 74 20 3d 20 34  >iLeafOffset = 4
cdc0: 3b 0a 20 20 20 20 61 73 73 65 72 74 5f 6e 63 28  ;.    assert_nc(
cdd0: 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 6e   pIter->pLeaf->n
cde0: 6e 3e 34 20 29 3b 0a 20 20 20 20 61 73 73 65 72  n>4 );.    asser
cdf0: 74 28 20 66 74 73 35 4c 65 61 66 46 69 72 73 74  t( fts5LeafFirst
ce00: 54 65 72 6d 4f 66 66 28 70 49 74 65 72 2d 3e 70  TermOff(pIter->p
ce10: 4c 65 61 66 29 3d 3d 34 20 29 3b 0a 20 20 20 20  Leaf)==4 );.    
ce20: 70 49 74 65 72 2d 3e 69 50 67 69 64 78 4f 66 66  pIter->iPgidxOff
ce30: 20 3d 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d   = pIter->pLeaf-
ce40: 3e 73 7a 4c 65 61 66 2b 31 3b 0a 20 20 20 20 66  >szLeaf+1;.    f
ce50: 74 73 35 53 65 67 49 74 65 72 4c 6f 61 64 54 65  ts5SegIterLoadTe
ce60: 72 6d 28 70 2c 20 70 49 74 65 72 2c 20 30 29 3b  rm(p, pIter, 0);
ce70: 0a 20 20 20 20 66 74 73 35 53 65 67 49 74 65 72  .    fts5SegIter
ce80: 4c 6f 61 64 4e 50 6f 73 28 70 2c 20 70 49 74 65  LoadNPos(p, pIte
ce90: 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  r);.  }.}../*.**
cea0: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
ceb0: 73 20 6f 6e 6c 79 20 65 76 65 72 20 63 61 6c 6c  s only ever call
cec0: 65 64 20 6f 6e 20 69 74 65 72 61 74 6f 72 73 20  ed on iterators 
ced0: 63 72 65 61 74 65 64 20 62 79 20 63 61 6c 6c 73  created by calls
cee0: 20 74 6f 0a 2a 2a 20 46 74 73 35 49 6e 64 65 78   to.** Fts5Index
cef0: 51 75 65 72 79 28 29 20 77 69 74 68 20 74 68 65  Query() with the
cf00: 20 46 54 53 35 49 4e 44 45 58 5f 51 55 45 52 59   FTS5INDEX_QUERY
cf10: 5f 44 45 53 43 20 66 6c 61 67 20 73 65 74 2e 0a  _DESC flag set..
cf20: 2a 2a 0a 2a 2a 20 54 68 65 20 69 74 65 72 61 74  **.** The iterat
cf30: 6f 72 20 69 73 20 69 6e 20 61 6e 20 75 6e 75 73  or is in an unus
cf40: 75 61 6c 20 73 74 61 74 65 20 77 68 65 6e 20 74  ual state when t
cf50: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
cf60: 63 61 6c 6c 65 64 3a 20 74 68 65 0a 2a 2a 20 46  called: the.** F
cf70: 74 73 35 53 65 67 49 74 65 72 2e 69 4c 65 61 66  ts5SegIter.iLeaf
cf80: 4f 66 66 73 65 74 20 76 61 72 69 61 62 6c 65 20  Offset variable 
cf90: 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 6f 66  is set to the of
cfa0: 66 73 65 74 20 6f 66 20 74 68 65 20 73 74 61 72  fset of the star
cfb0: 74 20 6f 66 0a 2a 2a 20 74 68 65 20 70 6f 73 69  t of.** the posi
cfc0: 74 69 6f 6e 2d 6c 69 73 74 20 73 69 7a 65 20 66  tion-list size f
cfd0: 69 65 6c 64 20 66 6f 72 20 74 68 65 20 66 69 72  ield for the fir
cfe0: 73 74 20 72 65 6c 65 76 61 6e 74 20 72 6f 77 69  st relevant rowi
cff0: 64 20 6f 6e 20 74 68 65 20 70 61 67 65 2e 0a 2a  d on the page..*
d000: 2a 20 46 74 73 35 53 65 67 49 74 65 72 2e 72 6f  * Fts5SegIter.ro
d010: 77 69 64 20 69 73 20 73 65 74 2c 20 62 75 74 20  wid is set, but 
d020: 6e 50 6f 73 20 61 6e 64 20 62 44 65 6c 20 61 72  nPos and bDel ar
d030: 65 20 6e 6f 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  e not..**.** Thi
d040: 73 20 66 75 6e 63 74 69 6f 6e 20 61 64 76 61 6e  s function advan
d050: 63 65 73 20 74 68 65 20 69 74 65 72 61 74 6f 72  ces the iterator
d060: 20 73 6f 20 74 68 61 74 20 69 74 20 70 6f 69 6e   so that it poin
d070: 74 73 20 74 6f 20 74 68 65 20 6c 61 73 74 20 0a  ts to the last .
d080: 2a 2a 20 72 65 6c 65 76 61 6e 74 20 72 6f 77 69  ** relevant rowi
d090: 64 20 6f 6e 20 74 68 65 20 70 61 67 65 20 61 6e  d on the page an
d0a0: 64 2c 20 69 66 20 6e 65 63 65 73 73 61 72 79 2c  d, if necessary,
d0b0: 20 69 6e 69 74 69 61 6c 69 7a 65 73 20 74 68 65   initializes the
d0c0: 20 0a 2a 2a 20 61 52 6f 77 69 64 4f 66 66 73 65   .** aRowidOffse
d0d0: 74 5b 5d 20 61 6e 64 20 69 52 6f 77 69 64 4f 66  t[] and iRowidOf
d0e0: 66 73 65 74 20 76 61 72 69 61 62 6c 65 73 2e 20  fset variables. 
d0f0: 41 74 20 74 68 69 73 20 70 6f 69 6e 74 20 74 68  At this point th
d100: 65 20 69 74 65 72 61 74 6f 72 0a 2a 2a 20 69 73  e iterator.** is
d110: 20 69 6e 20 69 74 73 20 72 65 67 75 6c 61 72 20   in its regular 
d120: 73 74 61 74 65 20 2d 20 46 74 73 35 53 65 67 49  state - Fts5SegI
d130: 74 65 72 2e 69 4c 65 61 66 4f 66 66 73 65 74 20  ter.iLeafOffset 
d140: 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 66 69  points to the fi
d150: 72 73 74 0a 2a 2a 20 62 79 74 65 20 6f 66 20 74  rst.** byte of t
d160: 68 65 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74  he position list
d170: 20 63 6f 6e 74 65 6e 74 20 61 73 73 6f 63 69 61   content associa
d180: 74 65 64 20 77 69 74 68 20 73 61 69 64 20 72 6f  ted with said ro
d190: 77 69 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  wid..*/.static v
d1a0: 6f 69 64 20 66 74 73 35 53 65 67 49 74 65 72 52  oid fts5SegIterR
d1b0: 65 76 65 72 73 65 49 6e 69 74 50 61 67 65 28 46  everseInitPage(F
d1c0: 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 46 74 73  ts5Index *p, Fts
d1d0: 35 53 65 67 49 74 65 72 20 2a 70 49 74 65 72 29  5SegIter *pIter)
d1e0: 7b 0a 20 20 69 6e 74 20 65 44 65 74 61 69 6c 20  {.  int eDetail 
d1f0: 3d 20 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e 65 44  = p->pConfig->eD
d200: 65 74 61 69 6c 3b 0a 20 20 69 6e 74 20 6e 20 3d  etail;.  int n =
d210: 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 73   pIter->pLeaf->s
d220: 7a 4c 65 61 66 3b 0a 20 20 69 6e 74 20 69 20 3d  zLeaf;.  int i =
d230: 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66   pIter->iLeafOff
d240: 73 65 74 3b 0a 20 20 75 38 20 2a 61 20 3d 20 70  set;.  u8 *a = p
d250: 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 70 3b 0a  Iter->pLeaf->p;.
d260: 20 20 69 6e 74 20 69 52 6f 77 69 64 4f 66 66 73    int iRowidOffs
d270: 65 74 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20 6e  et = 0;..  if( n
d280: 3e 70 49 74 65 72 2d 3e 69 45 6e 64 6f 66 44 6f  >pIter->iEndofDo
d290: 63 6c 69 73 74 20 29 7b 0a 20 20 20 20 6e 20 3d  clist ){.    n =
d2a0: 20 70 49 74 65 72 2d 3e 69 45 6e 64 6f 66 44 6f   pIter->iEndofDo
d2b0: 63 6c 69 73 74 3b 0a 20 20 7d 0a 0a 20 20 41 53  clist;.  }..  AS
d2c0: 53 45 52 54 5f 53 5a 4c 45 41 46 5f 4f 4b 28 70  SERT_SZLEAF_OK(p
d2d0: 49 74 65 72 2d 3e 70 4c 65 61 66 29 3b 0a 20 20  Iter->pLeaf);.  
d2e0: 77 68 69 6c 65 28 20 31 20 29 7b 0a 20 20 20 20  while( 1 ){.    
d2f0: 69 36 34 20 69 44 65 6c 74 61 20 3d 20 30 3b 0a  i64 iDelta = 0;.
d300: 0a 20 20 20 20 69 66 28 20 65 44 65 74 61 69 6c  .    if( eDetail
d310: 3d 3d 46 54 53 35 5f 44 45 54 41 49 4c 5f 4e 4f  ==FTS5_DETAIL_NO
d320: 4e 45 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 74  NE ){.      /* t
d330: 6f 64 6f 20 2a 2f 0a 20 20 20 20 20 20 69 66 28  odo */.      if(
d340: 20 69 3c 6e 20 26 26 20 61 5b 69 5d 3d 3d 30 20   i<n && a[i]==0 
d350: 29 7b 0a 20 20 20 20 20 20 20 20 69 2b 2b 3b 0a  ){.        i++;.
d360: 20 20 20 20 20 20 20 20 69 66 28 20 69 3c 6e 20          if( i<n 
d370: 26 26 20 61 5b 69 5d 3d 3d 30 20 29 20 69 2b 2b  && a[i]==0 ) i++
d380: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
d390: 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e  lse{.      int n
d3a0: 50 6f 73 3b 0a 20 20 20 20 20 20 69 6e 74 20 62  Pos;.      int b
d3b0: 44 75 6d 6d 79 3b 0a 20 20 20 20 20 20 69 20 2b  Dummy;.      i +
d3c0: 3d 20 66 74 73 35 47 65 74 50 6f 73 6c 69 73 74  = fts5GetPoslist
d3d0: 53 69 7a 65 28 26 61 5b 69 5d 2c 20 26 6e 50 6f  Size(&a[i], &nPo
d3e0: 73 2c 20 26 62 44 75 6d 6d 79 29 3b 0a 20 20 20  s, &bDummy);.   
d3f0: 20 20 20 69 20 2b 3d 20 6e 50 6f 73 3b 0a 20 20     i += nPos;.  
d400: 20 20 7d 0a 20 20 20 20 69 66 28 20 69 3e 3d 6e    }.    if( i>=n
d410: 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 69 20   ) break;.    i 
d420: 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e 74  += fts5GetVarint
d430: 28 26 61 5b 69 5d 2c 20 28 75 36 34 2a 29 26 69  (&a[i], (u64*)&i
d440: 44 65 6c 74 61 29 3b 0a 20 20 20 20 70 49 74 65  Delta);.    pIte
d450: 72 2d 3e 69 52 6f 77 69 64 20 2b 3d 20 69 44 65  r->iRowid += iDe
d460: 6c 74 61 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20  lta;..    /* If 
d470: 6e 65 63 65 73 73 61 72 79 2c 20 67 72 6f 77 20  necessary, grow 
d480: 74 68 65 20 70 49 74 65 72 2d 3e 61 52 6f 77 69  the pIter->aRowi
d490: 64 4f 66 66 73 65 74 5b 5d 20 61 72 72 61 79 2e  dOffset[] array.
d4a0: 20 2a 2f 0a 20 20 20 20 69 66 28 20 69 52 6f 77   */.    if( iRow
d4b0: 69 64 4f 66 66 73 65 74 3e 3d 70 49 74 65 72 2d  idOffset>=pIter-
d4c0: 3e 6e 52 6f 77 69 64 4f 66 66 73 65 74 20 29 7b  >nRowidOffset ){
d4d0: 0a 20 20 20 20 20 20 69 6e 74 20 6e 4e 65 77 20  .      int nNew 
d4e0: 3d 20 70 49 74 65 72 2d 3e 6e 52 6f 77 69 64 4f  = pIter->nRowidO
d4f0: 66 66 73 65 74 20 2b 20 38 3b 0a 20 20 20 20 20  ffset + 8;.     
d500: 20 69 6e 74 20 2a 61 4e 65 77 20 3d 20 28 69 6e   int *aNew = (in
d510: 74 2a 29 73 71 6c 69 74 65 33 5f 72 65 61 6c 6c  t*)sqlite3_reall
d520: 6f 63 28 70 49 74 65 72 2d 3e 61 52 6f 77 69 64  oc(pIter->aRowid
d530: 4f 66 66 73 65 74 2c 20 6e 4e 65 77 2a 73 69 7a  Offset, nNew*siz
d540: 65 6f 66 28 69 6e 74 29 29 3b 0a 20 20 20 20 20  eof(int));.     
d550: 20 69 66 28 20 61 4e 65 77 3d 3d 30 20 29 7b 0a   if( aNew==0 ){.
d560: 20 20 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20          p->rc = 
d570: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
d580: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
d590: 20 20 20 7d 0a 20 20 20 20 20 20 70 49 74 65 72     }.      pIter
d5a0: 2d 3e 61 52 6f 77 69 64 4f 66 66 73 65 74 20 3d  ->aRowidOffset =
d5b0: 20 61 4e 65 77 3b 0a 20 20 20 20 20 20 70 49 74   aNew;.      pIt
d5c0: 65 72 2d 3e 6e 52 6f 77 69 64 4f 66 66 73 65 74  er->nRowidOffset
d5d0: 20 3d 20 6e 4e 65 77 3b 0a 20 20 20 20 7d 0a 0a   = nNew;.    }..
d5e0: 20 20 20 20 70 49 74 65 72 2d 3e 61 52 6f 77 69      pIter->aRowi
d5f0: 64 4f 66 66 73 65 74 5b 69 52 6f 77 69 64 4f 66  dOffset[iRowidOf
d600: 66 73 65 74 2b 2b 5d 20 3d 20 70 49 74 65 72 2d  fset++] = pIter-
d610: 3e 69 4c 65 61 66 4f 66 66 73 65 74 3b 0a 20 20  >iLeafOffset;.  
d620: 20 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66    pIter->iLeafOf
d630: 66 73 65 74 20 3d 20 69 3b 0a 20 20 7d 0a 20 20  fset = i;.  }.  
d640: 70 49 74 65 72 2d 3e 69 52 6f 77 69 64 4f 66 66  pIter->iRowidOff
d650: 73 65 74 20 3d 20 69 52 6f 77 69 64 4f 66 66 73  set = iRowidOffs
d660: 65 74 3b 0a 20 20 66 74 73 35 53 65 67 49 74 65  et;.  fts5SegIte
d670: 72 4c 6f 61 64 4e 50 6f 73 28 70 2c 20 70 49 74  rLoadNPos(p, pIt
d680: 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 0a 2a 2f  er);.}../*.**.*/
d690: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
d6a0: 35 53 65 67 49 74 65 72 52 65 76 65 72 73 65 4e  5SegIterReverseN
d6b0: 65 77 50 61 67 65 28 46 74 73 35 49 6e 64 65 78  ewPage(Fts5Index
d6c0: 20 2a 70 2c 20 46 74 73 35 53 65 67 49 74 65 72   *p, Fts5SegIter
d6d0: 20 2a 70 49 74 65 72 29 7b 0a 20 20 61 73 73 65   *pIter){.  asse
d6e0: 72 74 28 20 70 49 74 65 72 2d 3e 66 6c 61 67 73  rt( pIter->flags
d6f0: 20 26 20 46 54 53 35 5f 53 45 47 49 54 45 52 5f   & FTS5_SEGITER_
d700: 52 45 56 45 52 53 45 20 29 3b 0a 20 20 61 73 73  REVERSE );.  ass
d710: 65 72 74 28 20 70 49 74 65 72 2d 3e 66 6c 61 67  ert( pIter->flag
d720: 73 20 26 20 46 54 53 35 5f 53 45 47 49 54 45 52  s & FTS5_SEGITER
d730: 5f 4f 4e 45 54 45 52 4d 20 29 3b 0a 0a 20 20 66  _ONETERM );..  f
d740: 74 73 35 44 61 74 61 52 65 6c 65 61 73 65 28 70  ts5DataRelease(p
d750: 49 74 65 72 2d 3e 70 4c 65 61 66 29 3b 0a 20 20  Iter->pLeaf);.  
d760: 70 49 74 65 72 2d 3e 70 4c 65 61 66 20 3d 20 30  pIter->pLeaf = 0
d770: 3b 0a 20 20 77 68 69 6c 65 28 20 70 2d 3e 72 63  ;.  while( p->rc
d780: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70  ==SQLITE_OK && p
d790: 49 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 3e  Iter->iLeafPgno>
d7a0: 70 49 74 65 72 2d 3e 69 54 65 72 6d 4c 65 61 66  pIter->iTermLeaf
d7b0: 50 67 6e 6f 20 29 7b 0a 20 20 20 20 46 74 73 35  Pgno ){.    Fts5
d7c0: 44 61 74 61 20 2a 70 4e 65 77 3b 0a 20 20 20 20  Data *pNew;.    
d7d0: 70 49 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f  pIter->iLeafPgno
d7e0: 2d 2d 3b 0a 20 20 20 20 70 4e 65 77 20 3d 20 66  --;.    pNew = f
d7f0: 74 73 35 44 61 74 61 52 65 61 64 28 70 2c 20 46  ts5DataRead(p, F
d800: 54 53 35 5f 53 45 47 4d 45 4e 54 5f 52 4f 57 49  TS5_SEGMENT_ROWI
d810: 44 28 0a 20 20 20 20 20 20 20 20 20 20 70 49 74  D(.          pIt
d820: 65 72 2d 3e 70 53 65 67 2d 3e 69 53 65 67 69 64  er->pSeg->iSegid
d830: 2c 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 50 67  , pIter->iLeafPg
d840: 6e 6f 0a 20 20 20 20 29 29 3b 0a 20 20 20 20 69  no.    ));.    i
d850: 66 28 20 70 4e 65 77 20 29 7b 0a 20 20 20 20 20  f( pNew ){.     
d860: 20 2f 2a 20 69 54 65 72 6d 4c 65 61 66 4f 66 66   /* iTermLeafOff
d870: 73 65 74 20 6d 61 79 20 62 65 20 65 71 75 61 6c  set may be equal
d880: 20 74 6f 20 73 7a 4c 65 61 66 20 69 66 20 74 68   to szLeaf if th
d890: 65 20 74 65 72 6d 20 69 73 20 74 68 65 20 6c 61  e term is the la
d8a0: 73 74 0a 20 20 20 20 20 20 2a 2a 20 74 68 69 6e  st.      ** thin
d8b0: 67 20 6f 6e 20 74 68 65 20 70 61 67 65 20 2d 20  g on the page - 
d8c0: 69 2e 65 2e 20 74 68 65 20 66 69 72 73 74 20 72  i.e. the first r
d8d0: 6f 77 69 64 20 69 73 20 6f 6e 20 74 68 65 20 66  owid is on the f
d8e0: 6f 6c 6c 6f 77 69 6e 67 20 70 61 67 65 2e 0a 20  ollowing page.. 
d8f0: 20 20 20 20 20 2a 2a 20 49 6e 20 74 68 69 73 20       ** In this 
d900: 63 61 73 65 20 6c 65 61 76 65 20 70 49 74 65 72  case leave pIter
d910: 2d 3e 70 4c 65 61 66 3d 3d 30 2c 20 74 68 69 73  ->pLeaf==0, this
d920: 20 69 74 65 72 61 74 6f 72 20 69 73 20 61 74 20   iterator is at 
d930: 45 4f 46 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66  EOF. */.      if
d940: 28 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 50 67  ( pIter->iLeafPg
d950: 6e 6f 3d 3d 70 49 74 65 72 2d 3e 69 54 65 72 6d  no==pIter->iTerm
d960: 4c 65 61 66 50 67 6e 6f 20 29 7b 0a 20 20 20 20  LeafPgno ){.    
d970: 20 20 20 20 61 73 73 65 72 74 28 20 70 49 74 65      assert( pIte
d980: 72 2d 3e 70 4c 65 61 66 3d 3d 30 20 29 3b 0a 20  r->pLeaf==0 );. 
d990: 20 20 20 20 20 20 20 69 66 28 20 70 49 74 65 72         if( pIter
d9a0: 2d 3e 69 54 65 72 6d 4c 65 61 66 4f 66 66 73 65  ->iTermLeafOffse
d9b0: 74 3c 70 4e 65 77 2d 3e 73 7a 4c 65 61 66 20 29  t<pNew->szLeaf )
d9c0: 7b 0a 20 20 20 20 20 20 20 20 20 20 70 49 74 65  {.          pIte
d9d0: 72 2d 3e 70 4c 65 61 66 20 3d 20 70 4e 65 77 3b  r->pLeaf = pNew;
d9e0: 0a 20 20 20 20 20 20 20 20 20 20 70 49 74 65 72  .          pIter
d9f0: 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 20 3d 20  ->iLeafOffset = 
da00: 70 49 74 65 72 2d 3e 69 54 65 72 6d 4c 65 61 66  pIter->iTermLeaf
da10: 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20 20 20  Offset;.        
da20: 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  }.      }else{. 
da30: 20 20 20 20 20 20 20 69 6e 74 20 69 52 6f 77 69         int iRowi
da40: 64 4f 66 66 3b 0a 20 20 20 20 20 20 20 20 69 52  dOff;.        iR
da50: 6f 77 69 64 4f 66 66 20 3d 20 66 74 73 35 4c 65  owidOff = fts5Le
da60: 61 66 46 69 72 73 74 52 6f 77 69 64 4f 66 66 28  afFirstRowidOff(
da70: 70 4e 65 77 29 3b 0a 20 20 20 20 20 20 20 20 69  pNew);.        i
da80: 66 28 20 69 52 6f 77 69 64 4f 66 66 20 29 7b 0a  f( iRowidOff ){.
da90: 20 20 20 20 20 20 20 20 20 20 70 49 74 65 72 2d            pIter-
daa0: 3e 70 4c 65 61 66 20 3d 20 70 4e 65 77 3b 0a 20  >pLeaf = pNew;. 
dab0: 20 20 20 20 20 20 20 20 20 70 49 74 65 72 2d 3e           pIter->
dac0: 69 4c 65 61 66 4f 66 66 73 65 74 20 3d 20 69 52  iLeafOffset = iR
dad0: 6f 77 69 64 4f 66 66 3b 0a 20 20 20 20 20 20 20  owidOff;.       
dae0: 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20   }.      }..    
daf0: 20 20 69 66 28 20 70 49 74 65 72 2d 3e 70 4c 65    if( pIter->pLe
db00: 61 66 20 29 7b 0a 20 20 20 20 20 20 20 20 75 38  af ){.        u8
db10: 20 2a 61 20 3d 20 26 70 49 74 65 72 2d 3e 70 4c   *a = &pIter->pL
db20: 65 61 66 2d 3e 70 5b 70 49 74 65 72 2d 3e 69 4c  eaf->p[pIter->iL
db30: 65 61 66 4f 66 66 73 65 74 5d 3b 0a 20 20 20 20  eafOffset];.    
db40: 20 20 20 20 70 49 74 65 72 2d 3e 69 4c 65 61 66      pIter->iLeaf
db50: 4f 66 66 73 65 74 20 2b 3d 20 66 74 73 35 47 65  Offset += fts5Ge
db60: 74 56 61 72 69 6e 74 28 61 2c 20 28 75 36 34 2a  tVarint(a, (u64*
db70: 29 26 70 49 74 65 72 2d 3e 69 52 6f 77 69 64 29  )&pIter->iRowid)
db80: 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
db90: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
dba0: 20 20 20 20 20 20 66 74 73 35 44 61 74 61 52 65        fts5DataRe
dbb0: 6c 65 61 73 65 28 70 4e 65 77 29 3b 0a 20 20 20  lease(pNew);.   
dbc0: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
dbd0: 20 20 69 66 28 20 70 49 74 65 72 2d 3e 70 4c 65    if( pIter->pLe
dbe0: 61 66 20 29 7b 0a 20 20 20 20 70 49 74 65 72 2d  af ){.    pIter-
dbf0: 3e 69 45 6e 64 6f 66 44 6f 63 6c 69 73 74 20 3d  >iEndofDoclist =
dc00: 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 6e   pIter->pLeaf->n
dc10: 6e 2b 31 3b 0a 20 20 20 20 66 74 73 35 53 65 67  n+1;.    fts5Seg
dc20: 49 74 65 72 52 65 76 65 72 73 65 49 6e 69 74 50  IterReverseInitP
dc30: 61 67 65 28 70 2c 20 70 49 74 65 72 29 3b 0a 20  age(p, pIter);. 
dc40: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75   }.}../*.** Retu
dc50: 72 6e 20 74 72 75 65 20 69 66 20 74 68 65 20 69  rn true if the i
dc60: 74 65 72 61 74 6f 72 20 70 61 73 73 65 64 20 61  terator passed a
dc70: 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67  s the second arg
dc80: 75 6d 65 6e 74 20 63 75 72 72 65 6e 74 6c 79 0a  ument currently.
dc90: 2a 2a 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 64  ** points to a d
dca0: 65 6c 65 74 65 20 6d 61 72 6b 65 72 2e 20 41 20  elete marker. A 
dcb0: 64 65 6c 65 74 65 20 6d 61 72 6b 65 72 20 69 73  delete marker is
dcc0: 20 61 6e 20 65 6e 74 72 79 20 77 69 74 68 20 61   an entry with a
dcd0: 20 30 20 62 79 74 65 0a 2a 2a 20 70 6f 73 69 74   0 byte.** posit
dce0: 69 6f 6e 2d 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61  ion-list..*/.sta
dcf0: 74 69 63 20 69 6e 74 20 66 74 73 35 4d 75 6c 74  tic int fts5Mult
dd00: 69 49 74 65 72 49 73 45 6d 70 74 79 28 46 74 73  iIterIsEmpty(Fts
dd10: 35 49 6e 64 65 78 20 2a 70 2c 20 46 74 73 35 49  5Index *p, Fts5I
dd20: 74 65 72 20 2a 70 49 74 65 72 29 7b 0a 20 20 46  ter *pIter){.  F
dd30: 74 73 35 53 65 67 49 74 65 72 20 2a 70 53 65 67  ts5SegIter *pSeg
dd40: 20 3d 20 26 70 49 74 65 72 2d 3e 61 53 65 67 5b   = &pIter->aSeg[
dd50: 70 49 74 65 72 2d 3e 61 46 69 72 73 74 5b 31 5d  pIter->aFirst[1]
dd60: 2e 69 46 69 72 73 74 5d 3b 0a 20 20 72 65 74 75  .iFirst];.  retu
dd70: 72 6e 20 28 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  rn (p->rc==SQLIT
dd80: 45 5f 4f 4b 20 26 26 20 70 53 65 67 2d 3e 70 4c  E_OK && pSeg->pL
dd90: 65 61 66 20 26 26 20 70 53 65 67 2d 3e 6e 50 6f  eaf && pSeg->nPo
dda0: 73 3d 3d 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  s==0);.}../*.** 
ddb0: 41 64 76 61 6e 63 65 20 69 74 65 72 61 74 6f 72  Advance iterator
ddc0: 20 70 49 74 65 72 20 74 6f 20 74 68 65 20 6e 65   pIter to the ne
ddd0: 78 74 20 65 6e 74 72 79 2e 0a 2a 2a 0a 2a 2a 20  xt entry..**.** 
dde0: 54 68 69 73 20 76 65 72 73 69 6f 6e 20 6f 66 20  This version of 
ddf0: 66 74 73 35 53 65 67 49 74 65 72 4e 65 78 74 28  fts5SegIterNext(
de00: 29 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20 62  ) is only used b
de10: 79 20 72 65 76 65 72 73 65 20 69 74 65 72 61 74  y reverse iterat
de20: 6f 72 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ors..*/.static v
de30: 6f 69 64 20 66 74 73 35 53 65 67 49 74 65 72 4e  oid fts5SegIterN
de40: 65 78 74 5f 52 65 76 65 72 73 65 28 0a 20 20 46  ext_Reverse(.  F
de50: 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20  ts5Index *p,    
de60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
de70: 2a 20 46 54 53 35 20 62 61 63 6b 65 6e 64 20 6f  * FTS5 backend o
de80: 62 6a 65 63 74 20 2a 2f 0a 20 20 46 74 73 35 53  bject */.  Fts5S
de90: 65 67 49 74 65 72 20 2a 70 49 74 65 72 2c 20 20  egIter *pIter,  
dea0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 74             /* It
deb0: 65 72 61 74 6f 72 20 74 6f 20 61 64 76 61 6e 63  erator to advanc
dec0: 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 62 55 6e  e */.  int *pbUn
ded0: 75 73 65 64 20 20 20 20 20 20 20 20 20 20 20 20  used            
dee0: 20 20 20 20 20 20 20 2f 2a 20 55 6e 75 73 65 64         /* Unused
def0: 20 2a 2f 0a 29 7b 0a 20 20 61 73 73 65 72 74 28   */.){.  assert(
df00: 20 70 49 74 65 72 2d 3e 66 6c 61 67 73 20 26 20   pIter->flags & 
df10: 46 54 53 35 5f 53 45 47 49 54 45 52 5f 52 45 56  FTS5_SEGITER_REV
df20: 45 52 53 45 20 29 3b 0a 20 20 61 73 73 65 72 74  ERSE );.  assert
df30: 28 20 70 49 74 65 72 2d 3e 70 4e 65 78 74 4c 65  ( pIter->pNextLe
df40: 61 66 3d 3d 30 20 29 3b 0a 20 20 55 4e 55 53 45  af==0 );.  UNUSE
df50: 44 5f 50 41 52 41 4d 28 70 62 55 6e 75 73 65 64  D_PARAM(pbUnused
df60: 29 3b 0a 0a 20 20 69 66 28 20 70 49 74 65 72 2d  );..  if( pIter-
df70: 3e 69 52 6f 77 69 64 4f 66 66 73 65 74 3e 30 20  >iRowidOffset>0 
df80: 29 7b 0a 20 20 20 20 75 38 20 2a 61 20 3d 20 70  ){.    u8 *a = p
df90: 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 70 3b 0a  Iter->pLeaf->p;.
dfa0: 20 20 20 20 69 6e 74 20 69 4f 66 66 3b 0a 20 20      int iOff;.  
dfb0: 20 20 69 36 34 20 69 44 65 6c 74 61 3b 0a 0a 20    i64 iDelta;.. 
dfc0: 20 20 20 70 49 74 65 72 2d 3e 69 52 6f 77 69 64     pIter->iRowid
dfd0: 4f 66 66 73 65 74 2d 2d 3b 0a 20 20 20 20 70 49  Offset--;.    pI
dfe0: 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74  ter->iLeafOffset
dff0: 20 3d 20 70 49 74 65 72 2d 3e 61 52 6f 77 69 64   = pIter->aRowid
e000: 4f 66 66 73 65 74 5b 70 49 74 65 72 2d 3e 69 52  Offset[pIter->iR
e010: 6f 77 69 64 4f 66 66 73 65 74 5d 3b 0a 20 20 20  owidOffset];.   
e020: 20 66 74 73 35 53 65 67 49 74 65 72 4c 6f 61 64   fts5SegIterLoad
e030: 4e 50 6f 73 28 70 2c 20 70 49 74 65 72 29 3b 0a  NPos(p, pIter);.
e040: 20 20 20 20 69 4f 66 66 20 3d 20 70 49 74 65 72      iOff = pIter
e050: 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 3b 0a 20  ->iLeafOffset;. 
e060: 20 20 20 69 66 28 20 70 2d 3e 70 43 6f 6e 66 69     if( p->pConfi
e070: 67 2d 3e 65 44 65 74 61 69 6c 21 3d 46 54 53 35  g->eDetail!=FTS5
e080: 5f 44 45 54 41 49 4c 5f 4e 4f 4e 45 20 29 7b 0a  _DETAIL_NONE ){.
e090: 20 20 20 20 20 20 69 4f 66 66 20 2b 3d 20 70 49        iOff += pI
e0a0: 74 65 72 2d 3e 6e 50 6f 73 3b 0a 20 20 20 20 7d  ter->nPos;.    }
e0b0: 0a 20 20 20 20 66 74 73 35 47 65 74 56 61 72 69  .    fts5GetVari
e0c0: 6e 74 28 26 61 5b 69 4f 66 66 5d 2c 20 28 75 36  nt(&a[iOff], (u6
e0d0: 34 2a 29 26 69 44 65 6c 74 61 29 3b 0a 20 20 20  4*)&iDelta);.   
e0e0: 20 70 49 74 65 72 2d 3e 69 52 6f 77 69 64 20 2d   pIter->iRowid -
e0f0: 3d 20 69 44 65 6c 74 61 3b 0a 20 20 7d 65 6c 73  = iDelta;.  }els
e100: 65 7b 0a 20 20 20 20 66 74 73 35 53 65 67 49 74  e{.    fts5SegIt
e110: 65 72 52 65 76 65 72 73 65 4e 65 77 50 61 67 65  erReverseNewPage
e120: 28 70 2c 20 70 49 74 65 72 29 3b 0a 20 20 7d 0a  (p, pIter);.  }.
e130: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 76 61 6e 63 65  }../*.** Advance
e140: 20 69 74 65 72 61 74 6f 72 20 70 49 74 65 72 20   iterator pIter 
e150: 74 6f 20 74 68 65 20 6e 65 78 74 20 65 6e 74 72  to the next entr
e160: 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 76 65  y..**.** This ve
e170: 72 73 69 6f 6e 20 6f 66 20 66 74 73 35 53 65 67  rsion of fts5Seg
e180: 49 74 65 72 4e 65 78 74 28 29 20 69 73 20 6f 6e  IterNext() is on
e190: 6c 79 20 75 73 65 64 20 69 66 20 64 65 74 61 69  ly used if detai
e1a0: 6c 3d 6e 6f 6e 65 20 61 6e 64 20 74 68 65 0a 2a  l=none and the.*
e1b0: 2a 20 69 74 65 72 61 74 6f 72 20 69 73 20 6e 6f  * iterator is no
e1c0: 74 20 61 20 72 65 76 65 72 73 65 20 64 69 72 65  t a reverse dire
e1d0: 63 74 69 6f 6e 20 69 74 65 72 61 74 6f 72 2e 0a  ction iterator..
e1e0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
e1f0: 74 73 35 53 65 67 49 74 65 72 4e 65 78 74 5f 4e  ts5SegIterNext_N
e200: 6f 6e 65 28 0a 20 20 46 74 73 35 49 6e 64 65 78  one(.  Fts5Index
e210: 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
e220: 20 20 20 20 20 20 20 2f 2a 20 46 54 53 35 20 62         /* FTS5 b
e230: 61 63 6b 65 6e 64 20 6f 62 6a 65 63 74 20 2a 2f  ackend object */
e240: 0a 20 20 46 74 73 35 53 65 67 49 74 65 72 20 2a  .  Fts5SegIter *
e250: 70 49 74 65 72 2c 20 20 20 20 20 20 20 20 20 20  pIter,          
e260: 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 74     /* Iterator t
e270: 6f 20 61 64 76 61 6e 63 65 20 2a 2f 0a 20 20 69  o advance */.  i
e280: 6e 74 20 2a 70 62 4e 65 77 54 65 72 6d 20 20 20  nt *pbNewTerm   
e290: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
e2a0: 2a 20 4f 55 54 3a 20 53 65 74 20 66 6f 72 20 6e  * OUT: Set for n
e2b0: 65 77 20 74 65 72 6d 20 2a 2f 0a 29 7b 0a 20 20  ew term */.){.  
e2c0: 69 6e 74 20 69 4f 66 66 3b 0a 0a 20 20 61 73 73  int iOff;..  ass
e2d0: 65 72 74 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49  ert( p->rc==SQLI
e2e0: 54 45 5f 4f 4b 20 29 3b 0a 20 20 61 73 73 65 72  TE_OK );.  asser
e2f0: 74 28 20 28 70 49 74 65 72 2d 3e 66 6c 61 67 73  t( (pIter->flags
e300: 20 26 20 46 54 53 35 5f 53 45 47 49 54 45 52 5f   & FTS5_SEGITER_
e310: 52 45 56 45 52 53 45 29 3d 3d 30 20 29 3b 0a 20  REVERSE)==0 );. 
e320: 20 61 73 73 65 72 74 28 20 70 2d 3e 70 43 6f 6e   assert( p->pCon
e330: 66 69 67 2d 3e 65 44 65 74 61 69 6c 3d 3d 46 54  fig->eDetail==FT
e340: 53 35 5f 44 45 54 41 49 4c 5f 4e 4f 4e 45 20 29  S5_DETAIL_NONE )
e350: 3b 0a 0a 20 20 41 53 53 45 52 54 5f 53 5a 4c 45  ;..  ASSERT_SZLE
e360: 41 46 5f 4f 4b 28 70 49 74 65 72 2d 3e 70 4c 65  AF_OK(pIter->pLe
e370: 61 66 29 3b 0a 20 20 69 4f 66 66 20 3d 20 70 49  af);.  iOff = pI
e380: 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74  ter->iLeafOffset
e390: 3b 0a 0a 20 20 2f 2a 20 4e 65 78 74 20 65 6e 74  ;..  /* Next ent
e3a0: 72 79 20 69 73 20 6f 6e 20 74 68 65 20 6e 65 78  ry is on the nex
e3b0: 74 20 70 61 67 65 20 2a 2f 0a 20 20 69 66 28 20  t page */.  if( 
e3c0: 70 49 74 65 72 2d 3e 70 53 65 67 20 26 26 20 69  pIter->pSeg && i
e3d0: 4f 66 66 3e 3d 70 49 74 65 72 2d 3e 70 4c 65 61  Off>=pIter->pLea
e3e0: 66 2d 3e 73 7a 4c 65 61 66 20 29 7b 0a 20 20 20  f->szLeaf ){.   
e3f0: 20 66 74 73 35 53 65 67 49 74 65 72 4e 65 78 74   fts5SegIterNext
e400: 50 61 67 65 28 70 2c 20 70 49 74 65 72 29 3b 0a  Page(p, pIter);.
e410: 20 20 20 20 69 66 28 20 70 2d 3e 72 63 20 7c 7c      if( p->rc ||
e420: 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 3d 3d 30   pIter->pLeaf==0
e430: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 70   ) return;.    p
e440: 49 74 65 72 2d 3e 69 52 6f 77 69 64 20 3d 20 30  Iter->iRowid = 0
e450: 3b 0a 20 20 20 20 69 4f 66 66 20 3d 20 34 3b 0a  ;.    iOff = 4;.
e460: 20 20 7d 0a 0a 20 20 69 66 28 20 69 4f 66 66 3c    }..  if( iOff<
e470: 70 49 74 65 72 2d 3e 69 45 6e 64 6f 66 44 6f 63  pIter->iEndofDoc
e480: 6c 69 73 74 20 29 7b 0a 20 20 20 20 2f 2a 20 4e  list ){.    /* N
e490: 65 78 74 20 65 6e 74 72 79 20 69 73 20 6f 6e 20  ext entry is on 
e4a0: 74 68 65 20 63 75 72 72 65 6e 74 20 70 61 67 65  the current page
e4b0: 20 2a 2f 0a 20 20 20 20 69 36 34 20 69 44 65 6c   */.    i64 iDel
e4c0: 74 61 3b 0a 20 20 20 20 69 4f 66 66 20 2b 3d 20  ta;.    iOff += 
e4d0: 73 71 6c 69 74 65 33 46 74 73 35 47 65 74 56 61  sqlite3Fts5GetVa
e4e0: 72 69 6e 74 28 26 70 49 74 65 72 2d 3e 70 4c 65  rint(&pIter->pLe
e4f0: 61 66 2d 3e 70 5b 69 4f 66 66 5d 2c 20 28 75 36  af->p[iOff], (u6
e500: 34 2a 29 26 69 44 65 6c 74 61 29 3b 0a 20 20 20  4*)&iDelta);.   
e510: 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66   pIter->iLeafOff
e520: 73 65 74 20 3d 20 69 4f 66 66 3b 0a 20 20 20 20  set = iOff;.    
e530: 70 49 74 65 72 2d 3e 69 52 6f 77 69 64 20 2b 3d  pIter->iRowid +=
e540: 20 69 44 65 6c 74 61 3b 0a 20 20 7d 65 6c 73 65   iDelta;.  }else
e550: 20 69 66 28 20 28 70 49 74 65 72 2d 3e 66 6c 61   if( (pIter->fla
e560: 67 73 20 26 20 46 54 53 35 5f 53 45 47 49 54 45  gs & FTS5_SEGITE
e570: 52 5f 4f 4e 45 54 45 52 4d 29 3d 3d 30 20 29 7b  R_ONETERM)==0 ){
e580: 0a 20 20 20 20 69 66 28 20 70 49 74 65 72 2d 3e  .    if( pIter->
e590: 70 53 65 67 20 29 7b 0a 20 20 20 20 20 20 69 6e  pSeg ){.      in
e5a0: 74 20 6e 4b 65 65 70 20 3d 20 30 3b 0a 20 20 20  t nKeep = 0;.   
e5b0: 20 20 20 69 66 28 20 69 4f 66 66 21 3d 66 74 73     if( iOff!=fts
e5c0: 35 4c 65 61 66 46 69 72 73 74 54 65 72 6d 4f 66  5LeafFirstTermOf
e5d0: 66 28 70 49 74 65 72 2d 3e 70 4c 65 61 66 29 20  f(pIter->pLeaf) 
e5e0: 29 7b 0a 20 20 20 20 20 20 20 20 69 4f 66 66 20  ){.        iOff 
e5f0: 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e 74  += fts5GetVarint
e600: 33 32 28 26 70 49 74 65 72 2d 3e 70 4c 65 61 66  32(&pIter->pLeaf
e610: 2d 3e 70 5b 69 4f 66 66 5d 2c 20 6e 4b 65 65 70  ->p[iOff], nKeep
e620: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
e630: 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66   pIter->iLeafOff
e640: 73 65 74 20 3d 20 69 4f 66 66 3b 0a 20 20 20 20  set = iOff;.    
e650: 20 20 66 74 73 35 53 65 67 49 74 65 72 4c 6f 61    fts5SegIterLoa
e660: 64 54 65 72 6d 28 70 2c 20 70 49 74 65 72 2c 20  dTerm(p, pIter, 
e670: 6e 4b 65 65 70 29 3b 0a 20 20 20 20 7d 65 6c 73  nKeep);.    }els
e680: 65 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 75  e{.      const u
e690: 38 20 2a 70 4c 69 73 74 20 3d 20 30 3b 0a 20 20  8 *pList = 0;.  
e6a0: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
e6b0: 7a 54 65 72 6d 20 3d 20 30 3b 0a 20 20 20 20 20  zTerm = 0;.     
e6c0: 20 69 6e 74 20 6e 4c 69 73 74 3b 0a 20 20 20 20   int nList;.    
e6d0: 20 20 73 71 6c 69 74 65 33 46 74 73 35 48 61 73    sqlite3Fts5Has
e6e0: 68 53 63 61 6e 4e 65 78 74 28 70 2d 3e 70 48 61  hScanNext(p->pHa
e6f0: 73 68 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  sh);.      sqlit
e700: 65 33 46 74 73 35 48 61 73 68 53 63 61 6e 45 6e  e3Fts5HashScanEn
e710: 74 72 79 28 70 2d 3e 70 48 61 73 68 2c 20 26 7a  try(p->pHash, &z
e720: 54 65 72 6d 2c 20 26 70 4c 69 73 74 2c 20 26 6e  Term, &pList, &n
e730: 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 69 66 28  List);.      if(
e740: 20 70 4c 69 73 74 3d 3d 30 20 29 20 67 6f 74 6f   pList==0 ) goto
e750: 20 6e 65 78 74 5f 6e 6f 6e 65 5f 65 6f 66 3b 0a   next_none_eof;.
e760: 20 20 20 20 20 20 70 49 74 65 72 2d 3e 70 4c 65        pIter->pLe
e770: 61 66 2d 3e 70 20 3d 20 28 75 38 2a 29 70 4c 69  af->p = (u8*)pLi
e780: 73 74 3b 0a 20 20 20 20 20 20 70 49 74 65 72 2d  st;.      pIter-
e790: 3e 70 4c 65 61 66 2d 3e 6e 6e 20 3d 20 6e 4c 69  >pLeaf->nn = nLi
e7a0: 73 74 3b 0a 20 20 20 20 20 20 70 49 74 65 72 2d  st;.      pIter-
e7b0: 3e 70 4c 65 61 66 2d 3e 73 7a 4c 65 61 66 20 3d  >pLeaf->szLeaf =
e7c0: 20 6e 4c 69 73 74 3b 0a 20 20 20 20 20 20 70 49   nList;.      pI
e7d0: 74 65 72 2d 3e 69 45 6e 64 6f 66 44 6f 63 6c 69  ter->iEndofDocli
e7e0: 73 74 20 3d 20 6e 4c 69 73 74 3b 0a 20 20 20 20  st = nList;.    
e7f0: 20 20 73 71 6c 69 74 65 33 46 74 73 35 42 75 66    sqlite3Fts5Buf
e800: 66 65 72 53 65 74 28 26 70 2d 3e 72 63 2c 26 70  ferSet(&p->rc,&p
e810: 49 74 65 72 2d 3e 74 65 72 6d 2c 20 28 69 6e 74  Iter->term, (int
e820: 29 73 74 72 6c 65 6e 28 7a 54 65 72 6d 29 2c 20  )strlen(zTerm), 
e830: 28 75 38 2a 29 7a 54 65 72 6d 29 3b 0a 20 20 20  (u8*)zTerm);.   
e840: 20 20 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f     pIter->iLeafO
e850: 66 66 73 65 74 20 3d 20 66 74 73 35 47 65 74 56  ffset = fts5GetV
e860: 61 72 69 6e 74 28 70 4c 69 73 74 2c 20 28 75 36  arint(pList, (u6
e870: 34 2a 29 26 70 49 74 65 72 2d 3e 69 52 6f 77 69  4*)&pIter->iRowi
e880: 64 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69  d);.    }..    i
e890: 66 28 20 70 62 4e 65 77 54 65 72 6d 20 29 20 2a  f( pbNewTerm ) *
e8a0: 70 62 4e 65 77 54 65 72 6d 20 3d 20 31 3b 0a 20  pbNewTerm = 1;. 
e8b0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 67 6f 74 6f   }else{.    goto
e8c0: 20 6e 65 78 74 5f 6e 6f 6e 65 5f 65 6f 66 3b 0a   next_none_eof;.
e8d0: 20 20 7d 0a 0a 20 20 66 74 73 35 53 65 67 49 74    }..  fts5SegIt
e8e0: 65 72 4c 6f 61 64 4e 50 6f 73 28 70 2c 20 70 49  erLoadNPos(p, pI
e8f0: 74 65 72 29 3b 0a 0a 20 20 72 65 74 75 72 6e 3b  ter);..  return;
e900: 0a 20 6e 65 78 74 5f 6e 6f 6e 65 5f 65 6f 66 3a  . next_none_eof:
e910: 0a 20 20 66 74 73 35 44 61 74 61 52 65 6c 65 61  .  fts5DataRelea
e920: 73 65 28 70 49 74 65 72 2d 3e 70 4c 65 61 66 29  se(pIter->pLeaf)
e930: 3b 0a 20 20 70 49 74 65 72 2d 3e 70 4c 65 61 66  ;.  pIter->pLeaf
e940: 20 3d 20 30 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20   = 0;.}.../*.** 
e950: 41 64 76 61 6e 63 65 20 69 74 65 72 61 74 6f 72  Advance iterator
e960: 20 70 49 74 65 72 20 74 6f 20 74 68 65 20 6e 65   pIter to the ne
e970: 78 74 20 65 6e 74 72 79 2e 20 0a 2a 2a 0a 2a 2a  xt entry. .**.**
e980: 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
e990: 75 72 73 2c 20 46 74 73 35 49 6e 64 65 78 2e 72  urs, Fts5Index.r
e9a0: 63 20 69 73 20 73 65 74 20 74 6f 20 61 6e 20 61  c is set to an a
e9b0: 70 70 72 6f 70 72 69 61 74 65 20 65 72 72 6f 72  ppropriate error
e9c0: 20 63 6f 64 65 2e 20 49 74 20 0a 2a 2a 20 69 73   code. It .** is
e9d0: 20 6e 6f 74 20 63 6f 6e 73 69 64 65 72 65 64 20   not considered 
e9e0: 61 6e 20 65 72 72 6f 72 20 69 66 20 74 68 65 20  an error if the 
e9f0: 69 74 65 72 61 74 6f 72 20 72 65 61 63 68 65 73  iterator reaches
ea00: 20 45 4f 46 2e 20 49 66 20 61 6e 20 65 72 72 6f   EOF. If an erro
ea10: 72 20 68 61 73 20 0a 2a 2a 20 61 6c 72 65 61 64  r has .** alread
ea20: 79 20 6f 63 63 75 72 72 65 64 20 77 68 65 6e 20  y occurred when 
ea30: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
ea40: 20 63 61 6c 6c 65 64 2c 20 69 74 20 69 73 20 61   called, it is a
ea50: 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69   no-op..*/.stati
ea60: 63 20 76 6f 69 64 20 66 74 73 35 53 65 67 49 74  c void fts5SegIt
ea70: 65 72 4e 65 78 74 28 0a 20 20 46 74 73 35 49 6e  erNext(.  Fts5In
ea80: 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20 20  dex *p,         
ea90: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53            /* FTS
eaa0: 35 20 62 61 63 6b 65 6e 64 20 6f 62 6a 65 63 74  5 backend object
eab0: 20 2a 2f 0a 20 20 46 74 73 35 53 65 67 49 74 65   */.  Fts5SegIte
eac0: 72 20 2a 70 49 74 65 72 2c 20 20 20 20 20 20 20  r *pIter,       
ead0: 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74 6f        /* Iterato
eae0: 72 20 74 6f 20 61 64 76 61 6e 63 65 20 2a 2f 0a  r to advance */.
eaf0: 20 20 69 6e 74 20 2a 70 62 4e 65 77 54 65 72 6d    int *pbNewTerm
eb00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
eb10: 20 20 2f 2a 20 4f 55 54 3a 20 53 65 74 20 66 6f    /* OUT: Set fo
eb20: 72 20 6e 65 77 20 74 65 72 6d 20 2a 2f 0a 29 7b  r new term */.){
eb30: 0a 20 20 46 74 73 35 44 61 74 61 20 2a 70 4c 65  .  Fts5Data *pLe
eb40: 61 66 20 3d 20 70 49 74 65 72 2d 3e 70 4c 65 61  af = pIter->pLea
eb50: 66 3b 0a 20 20 69 6e 74 20 69 4f 66 66 3b 0a 20  f;.  int iOff;. 
eb60: 20 69 6e 74 20 62 4e 65 77 54 65 72 6d 20 3d 20   int bNewTerm = 
eb70: 30 3b 0a 20 20 69 6e 74 20 6e 4b 65 65 70 20 3d  0;.  int nKeep =
eb80: 20 30 3b 0a 20 20 75 38 20 2a 61 3b 0a 20 20 69   0;.  u8 *a;.  i
eb90: 6e 74 20 6e 3b 0a 0a 20 20 61 73 73 65 72 74 28  nt n;..  assert(
eba0: 20 70 62 4e 65 77 54 65 72 6d 3d 3d 30 20 7c 7c   pbNewTerm==0 ||
ebb0: 20 2a 70 62 4e 65 77 54 65 72 6d 3d 3d 30 20 29   *pbNewTerm==0 )
ebc0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70  ;.  assert( p->p
ebd0: 43 6f 6e 66 69 67 2d 3e 65 44 65 74 61 69 6c 21  Config->eDetail!
ebe0: 3d 46 54 53 35 5f 44 45 54 41 49 4c 5f 4e 4f 4e  =FTS5_DETAIL_NON
ebf0: 45 20 29 3b 0a 0a 20 20 2f 2a 20 53 65 61 72 63  E );..  /* Searc
ec00: 68 20 66 6f 72 20 74 68 65 20 65 6e 64 20 6f 66  h for the end of
ec10: 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 20 6c 69   the position li
ec20: 73 74 20 77 69 74 68 69 6e 20 74 68 65 20 63 75  st within the cu
ec30: 72 72 65 6e 74 20 70 61 67 65 2e 20 2a 2f 0a 20  rrent page. */. 
ec40: 20 61 20 3d 20 70 4c 65 61 66 2d 3e 70 3b 0a 20   a = pLeaf->p;. 
ec50: 20 6e 20 3d 20 70 4c 65 61 66 2d 3e 73 7a 4c 65   n = pLeaf->szLe
ec60: 61 66 3b 0a 0a 20 20 41 53 53 45 52 54 5f 53 5a  af;..  ASSERT_SZ
ec70: 4c 45 41 46 5f 4f 4b 28 70 4c 65 61 66 29 3b 0a  LEAF_OK(pLeaf);.
ec80: 20 20 69 4f 66 66 20 3d 20 70 49 74 65 72 2d 3e    iOff = pIter->
ec90: 69 4c 65 61 66 4f 66 66 73 65 74 20 2b 20 70 49  iLeafOffset + pI
eca0: 74 65 72 2d 3e 6e 50 6f 73 3b 0a 0a 20 20 69 66  ter->nPos;..  if
ecb0: 28 20 69 4f 66 66 3c 6e 20 29 7b 0a 20 20 20 20  ( iOff<n ){.    
ecc0: 2f 2a 20 54 68 65 20 6e 65 78 74 20 65 6e 74 72  /* The next entr
ecd0: 79 20 69 73 20 6f 6e 20 74 68 65 20 63 75 72 72  y is on the curr
ece0: 65 6e 74 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20  ent page. */.   
ecf0: 20 61 73 73 65 72 74 5f 6e 63 28 20 69 4f 66 66   assert_nc( iOff
ed00: 3c 3d 70 49 74 65 72 2d 3e 69 45 6e 64 6f 66 44  <=pIter->iEndofD
ed10: 6f 63 6c 69 73 74 20 29 3b 0a 20 20 20 20 69 66  oclist );.    if
ed20: 28 20 69 4f 66 66 3e 3d 70 49 74 65 72 2d 3e 69  ( iOff>=pIter->i
ed30: 45 6e 64 6f 66 44 6f 63 6c 69 73 74 20 29 7b 0a  EndofDoclist ){.
ed40: 20 20 20 20 20 20 62 4e 65 77 54 65 72 6d 20 3d        bNewTerm =
ed50: 20 31 3b 0a 20 20 20 20 20 20 69 66 28 20 69 4f   1;.      if( iO
ed60: 66 66 21 3d 66 74 73 35 4c 65 61 66 46 69 72 73  ff!=fts5LeafFirs
ed70: 74 54 65 72 6d 4f 66 66 28 70 4c 65 61 66 29 20  tTermOff(pLeaf) 
ed80: 29 7b 0a 20 20 20 20 20 20 20 20 69 4f 66 66 20  ){.        iOff 
ed90: 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e 74  += fts5GetVarint
eda0: 33 32 28 26 61 5b 69 4f 66 66 5d 2c 20 6e 4b 65  32(&a[iOff], nKe
edb0: 65 70 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ep);.      }.   
edc0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 75 36   }else{.      u6
edd0: 34 20 69 44 65 6c 74 61 3b 0a 20 20 20 20 20 20  4 iDelta;.      
ede0: 69 4f 66 66 20 2b 3d 20 73 71 6c 69 74 65 33 46  iOff += sqlite3F
edf0: 74 73 35 47 65 74 56 61 72 69 6e 74 28 26 61 5b  ts5GetVarint(&a[
ee00: 69 4f 66 66 5d 2c 20 26 69 44 65 6c 74 61 29 3b  iOff], &iDelta);
ee10: 0a 20 20 20 20 20 20 70 49 74 65 72 2d 3e 69 52  .      pIter->iR
ee20: 6f 77 69 64 20 2b 3d 20 69 44 65 6c 74 61 3b 0a  owid += iDelta;.
ee30: 20 20 20 20 20 20 61 73 73 65 72 74 5f 6e 63 28        assert_nc(
ee40: 20 69 44 65 6c 74 61 3e 30 20 29 3b 0a 20 20 20   iDelta>0 );.   
ee50: 20 7d 0a 20 20 20 20 70 49 74 65 72 2d 3e 69 4c   }.    pIter->iL
ee60: 65 61 66 4f 66 66 73 65 74 20 3d 20 69 4f 66 66  eafOffset = iOff
ee70: 3b 0a 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70  ;..  }else if( p
ee80: 49 74 65 72 2d 3e 70 53 65 67 3d 3d 30 20 29 7b  Iter->pSeg==0 ){
ee90: 0a 20 20 20 20 63 6f 6e 73 74 20 75 38 20 2a 70  .    const u8 *p
eea0: 4c 69 73 74 20 3d 20 30 3b 0a 20 20 20 20 63 6f  List = 0;.    co
eeb0: 6e 73 74 20 63 68 61 72 20 2a 7a 54 65 72 6d 20  nst char *zTerm 
eec0: 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 6e 4c 69  = 0;.    int nLi
eed0: 73 74 20 3d 20 30 3b 0a 20 20 20 20 61 73 73 65  st = 0;.    asse
eee0: 72 74 28 20 28 70 49 74 65 72 2d 3e 66 6c 61 67  rt( (pIter->flag
eef0: 73 20 26 20 46 54 53 35 5f 53 45 47 49 54 45 52  s & FTS5_SEGITER
ef00: 5f 4f 4e 45 54 45 52 4d 29 20 7c 7c 20 70 62 4e  _ONETERM) || pbN
ef10: 65 77 54 65 72 6d 20 29 3b 0a 20 20 20 20 69 66  ewTerm );.    if
ef20: 28 20 30 3d 3d 28 70 49 74 65 72 2d 3e 66 6c 61  ( 0==(pIter->fla
ef30: 67 73 20 26 20 46 54 53 35 5f 53 45 47 49 54 45  gs & FTS5_SEGITE
ef40: 52 5f 4f 4e 45 54 45 52 4d 29 20 29 7b 0a 20 20  R_ONETERM) ){.  
ef50: 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 48      sqlite3Fts5H
ef60: 61 73 68 53 63 61 6e 4e 65 78 74 28 70 2d 3e 70  ashScanNext(p->p
ef70: 48 61 73 68 29 3b 0a 20 20 20 20 20 20 73 71 6c  Hash);.      sql
ef80: 69 74 65 33 46 74 73 35 48 61 73 68 53 63 61 6e  ite3Fts5HashScan
ef90: 45 6e 74 72 79 28 70 2d 3e 70 48 61 73 68 2c 20  Entry(p->pHash, 
efa0: 26 7a 54 65 72 6d 2c 20 26 70 4c 69 73 74 2c 20  &zTerm, &pList, 
efb0: 26 6e 4c 69 73 74 29 3b 0a 20 20 20 20 7d 0a 20  &nList);.    }. 
efc0: 20 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20     if( pList==0 
efd0: 29 7b 0a 20 20 20 20 20 20 66 74 73 35 44 61 74  ){.      fts5Dat
efe0: 61 52 65 6c 65 61 73 65 28 70 49 74 65 72 2d 3e  aRelease(pIter->
eff0: 70 4c 65 61 66 29 3b 0a 20 20 20 20 20 20 70 49  pLeaf);.      pI
f000: 74 65 72 2d 3e 70 4c 65 61 66 20 3d 20 30 3b 0a  ter->pLeaf = 0;.
f010: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
f020: 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 70   pIter->pLeaf->p
f030: 20 3d 20 28 75 38 2a 29 70 4c 69 73 74 3b 0a 20   = (u8*)pList;. 
f040: 20 20 20 20 20 70 49 74 65 72 2d 3e 70 4c 65 61       pIter->pLea
f050: 66 2d 3e 6e 6e 20 3d 20 6e 4c 69 73 74 3b 0a 20  f->nn = nList;. 
f060: 20 20 20 20 20 70 49 74 65 72 2d 3e 70 4c 65 61       pIter->pLea
f070: 66 2d 3e 73 7a 4c 65 61 66 20 3d 20 6e 4c 69 73  f->szLeaf = nLis
f080: 74 3b 0a 20 20 20 20 20 20 70 49 74 65 72 2d 3e  t;.      pIter->
f090: 69 45 6e 64 6f 66 44 6f 63 6c 69 73 74 20 3d 20  iEndofDoclist = 
f0a0: 6e 4c 69 73 74 2b 31 3b 0a 20 20 20 20 20 20 73  nList+1;.      s
f0b0: 71 6c 69 74 65 33 46 74 73 35 42 75 66 66 65 72  qlite3Fts5Buffer
f0c0: 53 65 74 28 26 70 2d 3e 72 63 2c 20 26 70 49 74  Set(&p->rc, &pIt
f0d0: 65 72 2d 3e 74 65 72 6d 2c 20 28 69 6e 74 29 73  er->term, (int)s
f0e0: 74 72 6c 65 6e 28 7a 54 65 72 6d 29 2c 0a 20 20  trlen(zTerm),.  
f0f0: 20 20 20 20 20 20 20 20 28 75 38 2a 29 7a 54 65          (u8*)zTe
f100: 72 6d 29 3b 0a 20 20 20 20 20 20 70 49 74 65 72  rm);.      pIter
f110: 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 20 3d 20  ->iLeafOffset = 
f120: 66 74 73 35 47 65 74 56 61 72 69 6e 74 28 70 4c  fts5GetVarint(pL
f130: 69 73 74 2c 20 28 75 36 34 2a 29 26 70 49 74 65  ist, (u64*)&pIte
f140: 72 2d 3e 69 52 6f 77 69 64 29 3b 0a 20 20 20 20  r->iRowid);.    
f150: 20 20 2a 70 62 4e 65 77 54 65 72 6d 20 3d 20 31    *pbNewTerm = 1
f160: 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b  ;.    }.  }else{
f170: 0a 20 20 20 20 69 4f 66 66 20 3d 20 30 3b 0a 20  .    iOff = 0;. 
f180: 20 20 20 2f 2a 20 4e 65 78 74 20 65 6e 74 72 79     /* Next entry
f190: 20 69 73 20 6e 6f 74 20 6f 6e 20 74 68 65 20 63   is not on the c
f1a0: 75 72 72 65 6e 74 20 70 61 67 65 20 2a 2f 0a 20  urrent page */. 
f1b0: 20 20 20 77 68 69 6c 65 28 20 69 4f 66 66 3d 3d     while( iOff==
f1c0: 30 20 29 7b 0a 20 20 20 20 20 20 66 74 73 35 53  0 ){.      fts5S
f1d0: 65 67 49 74 65 72 4e 65 78 74 50 61 67 65 28 70  egIterNextPage(p
f1e0: 2c 20 70 49 74 65 72 29 3b 0a 20 20 20 20 20 20  , pIter);.      
f1f0: 70 4c 65 61 66 20 3d 20 70 49 74 65 72 2d 3e 70  pLeaf = pIter->p
f200: 4c 65 61 66 3b 0a 20 20 20 20 20 20 69 66 28 20  Leaf;.      if( 
f210: 70 4c 65 61 66 3d 3d 30 20 29 20 62 72 65 61 6b  pLeaf==0 ) break
f220: 3b 0a 20 20 20 20 20 20 41 53 53 45 52 54 5f 53  ;.      ASSERT_S
f230: 5a 4c 45 41 46 5f 4f 4b 28 70 4c 65 61 66 29 3b  ZLEAF_OK(pLeaf);
f240: 0a 20 20 20 20 20 20 69 66 28 20 28 69 4f 66 66  .      if( (iOff
f250: 20 3d 20 66 74 73 35 4c 65 61 66 46 69 72 73 74   = fts5LeafFirst
f260: 52 6f 77 69 64 4f 66 66 28 70 4c 65 61 66 29 29  RowidOff(pLeaf))
f270: 20 26 26 20 69 4f 66 66 3c 70 4c 65 61 66 2d 3e   && iOff<pLeaf->
f280: 73 7a 4c 65 61 66 20 29 7b 0a 20 20 20 20 20 20  szLeaf ){.      
f290: 20 20 69 4f 66 66 20 2b 3d 20 73 71 6c 69 74 65    iOff += sqlite
f2a0: 33 46 74 73 35 47 65 74 56 61 72 69 6e 74 28 26  3Fts5GetVarint(&
f2b0: 70 4c 65 61 66 2d 3e 70 5b 69 4f 66 66 5d 2c 20  pLeaf->p[iOff], 
f2c0: 28 75 36 34 2a 29 26 70 49 74 65 72 2d 3e 69 52  (u64*)&pIter->iR
f2d0: 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 20 20 70  owid);.        p
f2e0: 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65  Iter->iLeafOffse
f2f0: 74 20 3d 20 69 4f 66 66 3b 0a 0a 20 20 20 20 20  t = iOff;..     
f300: 20 20 20 69 66 28 20 70 4c 65 61 66 2d 3e 6e 6e     if( pLeaf->nn
f310: 3e 70 4c 65 61 66 2d 3e 73 7a 4c 65 61 66 20 29  >pLeaf->szLeaf )
f320: 7b 0a 20 20 20 20 20 20 20 20 20 20 70 49 74 65  {.          pIte
f330: 72 2d 3e 69 50 67 69 64 78 4f 66 66 20 3d 20 70  r->iPgidxOff = p
f340: 4c 65 61 66 2d 3e 73 7a 4c 65 61 66 20 2b 20 66  Leaf->szLeaf + f
f350: 74 73 35 47 65 74 56 61 72 69 6e 74 33 32 28 0a  ts5GetVarint32(.
f360: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26 70                &p
f370: 4c 65 61 66 2d 3e 70 5b 70 4c 65 61 66 2d 3e 73  Leaf->p[pLeaf->s
f380: 7a 4c 65 61 66 5d 2c 20 70 49 74 65 72 2d 3e 69  zLeaf], pIter->i
f390: 45 6e 64 6f 66 44 6f 63 6c 69 73 74 0a 20 20 20  EndofDoclist.   
f3a0: 20 20 20 20 20 20 20 20 20 20 20 29 3b 0a 20 20             );.  
f3b0: 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 7d        }..      }
f3c0: 0a 20 20 20 20 20 20 65 6c 73 65 20 69 66 28 20  .      else if( 
f3d0: 70 4c 65 61 66 2d 3e 6e 6e 3e 70 4c 65 61 66 2d  pLeaf->nn>pLeaf-
f3e0: 3e 73 7a 4c 65 61 66 20 29 7b 0a 20 20 20 20 20  >szLeaf ){.     
f3f0: 20 20 20 70 49 74 65 72 2d 3e 69 50 67 69 64 78     pIter->iPgidx
f400: 4f 66 66 20 3d 20 70 4c 65 61 66 2d 3e 73 7a 4c  Off = pLeaf->szL
f410: 65 61 66 20 2b 20 66 74 73 35 47 65 74 56 61 72  eaf + fts5GetVar
f420: 69 6e 74 33 32 28 0a 20 20 20 20 20 20 20 20 20  int32(.         
f430: 20 20 20 26 70 4c 65 61 66 2d 3e 70 5b 70 4c 65     &pLeaf->p[pLe
f440: 61 66 2d 3e 73 7a 4c 65 61 66 5d 2c 20 69 4f 66  af->szLeaf], iOf
f450: 66 0a 20 20 20 20 20 20 20 20 20 20 20 20 29 3b  f.            );
f460: 0a 20 20 20 20 20 20 20 20 70 49 74 65 72 2d 3e  .        pIter->
f470: 69 4c 65 61 66 4f 66 66 73 65 74 20 3d 20 69 4f  iLeafOffset = iO
f480: 66 66 3b 0a 20 20 20 20 20 20 20 20 70 49 74 65  ff;.        pIte
f490: 72 2d 3e 69 45 6e 64 6f 66 44 6f 63 6c 69 73 74  r->iEndofDoclist
f4a0: 20 3d 20 69 4f 66 66 3b 0a 20 20 20 20 20 20 20   = iOff;.       
f4b0: 20 62 4e 65 77 54 65 72 6d 20 3d 20 31 3b 0a 20   bNewTerm = 1;. 
f4c0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73       }.      ass
f4d0: 65 72 74 5f 6e 63 28 20 69 4f 66 66 3c 70 4c 65  ert_nc( iOff<pLe
f4e0: 61 66 2d 3e 73 7a 4c 65 61 66 20 29 3b 0a 20 20  af->szLeaf );.  
f4f0: 20 20 20 20 69 66 28 20 69 4f 66 66 3e 70 4c 65      if( iOff>pLe
f500: 61 66 2d 3e 73 7a 4c 65 61 66 20 29 7b 0a 20 20  af->szLeaf ){.  
f510: 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 46 54        p->rc = FT
f520: 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20 20  S5_CORRUPT;.    
f530: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20      return;.    
f540: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
f550: 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 74 68 65   /* Check if the
f560: 20 69 74 65 72 61 74 6f 72 20 69 73 20 6e 6f 77   iterator is now
f570: 20 61 74 20 45 4f 46 2e 20 49 66 20 73 6f 2c 20   at EOF. If so, 
f580: 72 65 74 75 72 6e 20 65 61 72 6c 79 2e 20 2a 2f  return early. */
f590: 0a 20 20 69 66 28 20 70 49 74 65 72 2d 3e 70 4c  .  if( pIter->pL
f5a0: 65 61 66 20 29 7b 0a 20 20 20 20 69 66 28 20 62  eaf ){.    if( b
f5b0: 4e 65 77 54 65 72 6d 20 29 7b 0a 20 20 20 20 20  NewTerm ){.     
f5c0: 20 69 66 28 20 70 49 74 65 72 2d 3e 66 6c 61 67   if( pIter->flag
f5d0: 73 20 26 20 46 54 53 35 5f 53 45 47 49 54 45 52  s & FTS5_SEGITER
f5e0: 5f 4f 4e 45 54 45 52 4d 20 29 7b 0a 20 20 20 20  _ONETERM ){.    
f5f0: 20 20 20 20 66 74 73 35 44 61 74 61 52 65 6c 65      fts5DataRele
f600: 61 73 65 28 70 49 74 65 72 2d 3e 70 4c 65 61 66  ase(pIter->pLeaf
f610: 29 3b 0a 20 20 20 20 20 20 20 20 70 49 74 65 72  );.        pIter
f620: 2d 3e 70 4c 65 61 66 20 3d 20 30 3b 0a 20 20 20  ->pLeaf = 0;.   
f630: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
f640: 20 20 66 74 73 35 53 65 67 49 74 65 72 4c 6f 61    fts5SegIterLoa
f650: 64 54 65 72 6d 28 70 2c 20 70 49 74 65 72 2c 20  dTerm(p, pIter, 
f660: 6e 4b 65 65 70 29 3b 0a 20 20 20 20 20 20 20 20  nKeep);.        
f670: 66 74 73 35 53 65 67 49 74 65 72 4c 6f 61 64 4e  fts5SegIterLoadN
f680: 50 6f 73 28 70 2c 20 70 49 74 65 72 29 3b 0a 20  Pos(p, pIter);. 
f690: 20 20 20 20 20 20 20 69 66 28 20 70 62 4e 65 77         if( pbNew
f6a0: 54 65 72 6d 20 29 20 2a 70 62 4e 65 77 54 65 72  Term ) *pbNewTer
f6b0: 6d 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20  m = 1;.      }. 
f6c0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
f6d0: 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  /* The following
f6e0: 20 63 6f 75 6c 64 20 62 65 20 64 6f 6e 65 20 62   could be done b
f6f0: 79 20 63 61 6c 6c 69 6e 67 20 66 74 73 35 53 65  y calling fts5Se
f700: 67 49 74 65 72 4c 6f 61 64 4e 50 6f 73 28 29 2e  gIterLoadNPos().
f710: 20 42 75 74 0a 20 20 20 20 20 20 2a 2a 20 74 68   But.      ** th
f720: 69 73 20 62 6c 6f 63 6b 20 69 73 20 70 61 72 74  is block is part
f730: 69 63 75 6c 61 72 6c 79 20 70 65 72 66 6f 72 6d  icularly perform
f740: 61 6e 63 65 20 63 72 69 74 69 63 61 6c 2c 20 73  ance critical, s
f750: 6f 20 65 71 75 69 76 61 6c 65 6e 74 0a 20 20 20  o equivalent.   
f760: 20 20 20 2a 2a 20 63 6f 64 65 20 69 73 20 69 6e     ** code is in
f770: 6c 69 6e 65 64 2e 20 0a 20 20 20 20 20 20 2a 2a  lined. .      **
f780: 0a 20 20 20 20 20 20 2a 2a 20 4c 61 74 65 72 3a  .      ** Later:
f790: 20 53 77 69 74 63 68 65 64 20 62 61 63 6b 20 74   Switched back t
f7a0: 6f 20 66 74 73 35 53 65 67 49 74 65 72 4c 6f 61  o fts5SegIterLoa
f7b0: 64 4e 50 6f 73 28 29 20 62 65 63 61 75 73 65 20  dNPos() because 
f7c0: 69 74 20 73 75 70 70 6f 72 74 73 0a 20 20 20 20  it supports.    
f7d0: 20 20 2a 2a 20 64 65 74 61 69 6c 3d 6e 6f 6e 65    ** detail=none
f7e0: 20 6d 6f 64 65 2e 20 4e 6f 74 20 69 64 65 61 6c   mode. Not ideal
f7f0: 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
f800: 20 69 6e 74 20 6e 53 7a 3b 0a 20 20 20 20 20 20   int nSz;.      
f810: 61 73 73 65 72 74 28 20 70 2d 3e 72 63 3d 3d 53  assert( p->rc==S
f820: 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20  QLITE_OK );.    
f830: 20 20 66 74 73 35 46 61 73 74 47 65 74 56 61 72    fts5FastGetVar
f840: 69 6e 74 33 32 28 70 49 74 65 72 2d 3e 70 4c 65  int32(pIter->pLe
f850: 61 66 2d 3e 70 2c 20 70 49 74 65 72 2d 3e 69 4c  af->p, pIter->iL
f860: 65 61 66 4f 66 66 73 65 74 2c 20 6e 53 7a 29 3b  eafOffset, nSz);
f870: 0a 20 20 20 20 20 20 70 49 74 65 72 2d 3e 62 44  .      pIter->bD
f880: 65 6c 20 3d 20 28 6e 53 7a 20 26 20 30 78 30 30  el = (nSz & 0x00
f890: 30 31 29 3b 0a 20 20 20 20 20 20 70 49 74 65 72  01);.      pIter
f8a0: 2d 3e 6e 50 6f 73 20 3d 20 6e 53 7a 3e 3e 31 3b  ->nPos = nSz>>1;
f8b0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 5f 6e 63  .      assert_nc
f8c0: 28 20 70 49 74 65 72 2d 3e 6e 50 6f 73 3e 3d 30  ( pIter->nPos>=0
f8d0: 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a   );.    }.  }.}.
f8e0: 0a 23 64 65 66 69 6e 65 20 53 57 41 50 56 41 4c  .#define SWAPVAL
f8f0: 28 54 2c 20 61 2c 20 62 29 20 7b 20 54 20 74 6d  (T, a, b) { T tm
f900: 70 3b 20 74 6d 70 3d 61 3b 20 61 3d 62 3b 20 62  p; tmp=a; a=b; b
f910: 3d 74 6d 70 3b 20 7d 0a 0a 23 64 65 66 69 6e 65  =tmp; }..#define
f920: 20 66 74 73 35 49 6e 64 65 78 53 6b 69 70 56 61   fts5IndexSkipVa
f930: 72 69 6e 74 28 61 2c 20 69 4f 66 66 29 20 7b 20  rint(a, iOff) { 
f940: 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 69             \.  i
f950: 6e 74 20 69 45 6e 64 20 3d 20 69 4f 66 66 2b 39  nt iEnd = iOff+9
f960: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
f970: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
f980: 0a 20 20 77 68 69 6c 65 28 20 28 61 5b 69 4f 66  .  while( (a[iOf
f990: 66 2b 2b 5d 20 26 20 30 78 38 30 29 20 26 26 20  f++] & 0x80) && 
f9a0: 69 4f 66 66 3c 69 45 6e 64 20 29 3b 20 20 20 20  iOff<iEnd );    
f9b0: 20 20 20 5c 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 74     \.}../*.** It
f9c0: 65 72 61 74 6f 72 20 70 49 74 65 72 20 63 75 72  erator pIter cur
f9d0: 72 65 6e 74 6c 79 20 70 6f 69 6e 74 73 20 74 6f  rently points to
f9e0: 20 74 68 65 20 66 69 72 73 74 20 72 6f 77 69 64   the first rowid
f9f0: 20 69 6e 20 61 20 64 6f 63 6c 69 73 74 2e 20 54   in a doclist. T
fa00: 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20  his.** function 
fa10: 73 65 74 73 20 74 68 65 20 69 74 65 72 61 74 6f  sets the iterato
fa20: 72 20 75 70 20 73 6f 20 74 68 61 74 20 69 74 65  r up so that ite
fa30: 72 61 74 65 73 20 69 6e 20 72 65 76 65 72 73 65  rates in reverse
fa40: 20 6f 72 64 65 72 20 74 68 72 6f 75 67 68 0a 2a   order through.*
fa50: 2a 20 74 68 65 20 64 6f 63 6c 69 73 74 2e 0a 2a  * the doclist..*
fa60: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  /.static void ft
fa70: 73 35 53 65 67 49 74 65 72 52 65 76 65 72 73 65  s5SegIterReverse
fa80: 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 46  (Fts5Index *p, F
fa90: 74 73 35 53 65 67 49 74 65 72 20 2a 70 49 74 65  ts5SegIter *pIte
faa0: 72 29 7b 0a 20 20 46 74 73 35 44 6c 69 64 78 49  r){.  Fts5DlidxI
fab0: 74 65 72 20 2a 70 44 6c 69 64 78 20 3d 20 70 49  ter *pDlidx = pI
fac0: 74 65 72 2d 3e 70 44 6c 69 64 78 3b 0a 20 20 46  ter->pDlidx;.  F
fad0: 74 73 35 44 61 74 61 20 2a 70 4c 61 73 74 20 3d  ts5Data *pLast =
fae0: 20 30 3b 0a 20 20 69 6e 74 20 70 67 6e 6f 4c 61   0;.  int pgnoLa
faf0: 73 74 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20 70  st = 0;..  if( p
fb00: 44 6c 69 64 78 20 29 7b 0a 20 20 20 20 69 6e 74  Dlidx ){.    int
fb10: 20 69 53 65 67 69 64 20 3d 20 70 49 74 65 72 2d   iSegid = pIter-
fb20: 3e 70 53 65 67 2d 3e 69 53 65 67 69 64 3b 0a 20  >pSeg->iSegid;. 
fb30: 20 20 20 70 67 6e 6f 4c 61 73 74 20 3d 20 66 74     pgnoLast = ft
fb40: 73 35 44 6c 69 64 78 49 74 65 72 50 67 6e 6f 28  s5DlidxIterPgno(
fb50: 70 44 6c 69 64 78 29 3b 0a 20 20 20 20 70 4c 61  pDlidx);.    pLa
fb60: 73 74 20 3d 20 66 74 73 35 44 61 74 61 52 65 61  st = fts5DataRea
fb70: 64 28 70 2c 20 46 54 53 35 5f 53 45 47 4d 45 4e  d(p, FTS5_SEGMEN
fb80: 54 5f 52 4f 57 49 44 28 69 53 65 67 69 64 2c 20  T_ROWID(iSegid, 
fb90: 70 67 6e 6f 4c 61 73 74 29 29 3b 0a 20 20 7d 65  pgnoLast));.  }e
fba0: 6c 73 65 7b 0a 20 20 20 20 46 74 73 35 44 61 74  lse{.    Fts5Dat
fbb0: 61 20 2a 70 4c 65 61 66 20 3d 20 70 49 74 65 72  a *pLeaf = pIter
fbc0: 2d 3e 70 4c 65 61 66 3b 20 20 20 20 20 20 20 20  ->pLeaf;        
fbd0: 20 2f 2a 20 43 75 72 72 65 6e 74 20 6c 65 61 66   /* Current leaf
fbe0: 20 64 61 74 61 20 2a 2f 0a 0a 20 20 20 20 2f 2a   data */..    /*
fbf0: 20 43 75 72 72 65 6e 74 6c 79 2c 20 46 74 73 35   Currently, Fts5
fc00: 53 65 67 49 74 65 72 2e 69 4c 65 61 66 4f 66 66  SegIter.iLeafOff
fc10: 73 65 74 20 70 6f 69 6e 74 73 20 74 6f 20 74 68  set points to th
fc20: 65 20 66 69 72 73 74 20 62 79 74 65 20 6f 66 0a  e first byte of.
fc30: 20 20 20 20 2a 2a 20 70 6f 73 69 74 69 6f 6e 2d      ** position-
fc40: 6c 69 73 74 20 63 6f 6e 74 65 6e 74 20 66 6f 72  list content for
fc50: 20 74 68 65 20 63 75 72 72 65 6e 74 20 72 6f 77   the current row
fc60: 69 64 2e 20 42 61 63 6b 20 69 74 20 75 70 20 73  id. Back it up s
fc70: 6f 20 74 68 61 74 20 69 74 0a 20 20 20 20 2a 2a  o that it.    **
fc80: 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 73   points to the s
fc90: 74 61 72 74 20 6f 66 20 74 68 65 20 70 6f 73 69  tart of the posi
fca0: 74 69 6f 6e 2d 6c 69 73 74 20 73 69 7a 65 20 66  tion-list size f
fcb0: 69 65 6c 64 2e 20 2a 2f 0a 20 20 20 20 69 6e 74  ield. */.    int
fcc0: 20 69 50 6f 73 6c 69 73 74 3b 0a 20 20 20 20 69   iPoslist;.    i
fcd0: 66 28 20 70 49 74 65 72 2d 3e 69 54 65 72 6d 4c  f( pIter->iTermL
fce0: 65 61 66 50 67 6e 6f 3d 3d 70 49 74 65 72 2d 3e  eafPgno==pIter->
fcf0: 69 4c 65 61 66 50 67 6e 6f 20 29 7b 0a 20 20 20  iLeafPgno ){.   
fd00: 20 20 20 69 50 6f 73 6c 69 73 74 20 3d 20 70 49     iPoslist = pI
fd10: 74 65 72 2d 3e 69 54 65 72 6d 4c 65 61 66 4f 66  ter->iTermLeafOf
fd20: 66 73 65 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  fset;.    }else{
fd30: 0a 20 20 20 20 20 20 69 50 6f 73 6c 69 73 74 20  .      iPoslist 
fd40: 3d 20 34 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66  = 4;.    }.    f
fd50: 74 73 35 49 6e 64 65 78 53 6b 69 70 56 61 72 69  ts5IndexSkipVari
fd60: 6e 74 28 70 4c 65 61 66 2d 3e 70 2c 20 69 50 6f  nt(pLeaf->p, iPo
fd70: 73 6c 69 73 74 29 3b 0a 20 20 20 20 70 49 74 65  slist);.    pIte
fd80: 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 20 3d  r->iLeafOffset =
fd90: 20 69 50 6f 73 6c 69 73 74 3b 0a 0a 20 20 20 20   iPoslist;..    
fda0: 2f 2a 20 49 66 20 74 68 69 73 20 63 6f 6e 64 69  /* If this condi
fdb0: 74 69 6f 6e 20 69 73 20 74 72 75 65 20 74 68 65  tion is true the
fdc0: 6e 20 74 68 65 20 6c 61 72 67 65 73 74 20 72 6f  n the largest ro
fdd0: 77 69 64 20 66 6f 72 20 74 68 65 20 63 75 72 72  wid for the curr
fde0: 65 6e 74 0a 20 20 20 20 2a 2a 20 74 65 72 6d 20  ent.    ** term 
fdf0: 6d 61 79 20 6e 6f 74 20 62 65 20 73 74 6f 72 65  may not be store
fe00: 64 20 6f 6e 20 74 68 65 20 63 75 72 72 65 6e 74  d on the current
fe10: 20 70 61 67 65 2e 20 53 6f 20 73 65 61 72 63 68   page. So search
fe20: 20 66 6f 72 77 61 72 64 20 74 6f 0a 20 20 20 20   forward to.    
fe30: 2a 2a 20 73 65 65 20 77 68 65 72 65 20 73 61 69  ** see where sai
fe40: 64 20 72 6f 77 69 64 20 72 65 61 6c 6c 79 20 69  d rowid really i
fe50: 73 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70  s.  */.    if( p
fe60: 49 74 65 72 2d 3e 69 45 6e 64 6f 66 44 6f 63 6c  Iter->iEndofDocl
fe70: 69 73 74 3e 3d 70 4c 65 61 66 2d 3e 73 7a 4c 65  ist>=pLeaf->szLe
fe80: 61 66 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  af ){.      int 
fe90: 70 67 6e 6f 3b 0a 20 20 20 20 20 20 46 74 73 35  pgno;.      Fts5
fea0: 53 74 72 75 63 74 75 72 65 53 65 67 6d 65 6e 74  StructureSegment
feb0: 20 2a 70 53 65 67 20 3d 20 70 49 74 65 72 2d 3e   *pSeg = pIter->
fec0: 70 53 65 67 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  pSeg;..      /* 
fed0: 54 68 65 20 6c 61 73 74 20 72 6f 77 69 64 20 69  The last rowid i
fee0: 6e 20 74 68 65 20 64 6f 63 6c 69 73 74 20 6d 61  n the doclist ma
fef0: 79 20 6e 6f 74 20 62 65 20 6f 6e 20 74 68 65 20  y not be on the 
ff00: 63 75 72 72 65 6e 74 20 70 61 67 65 2e 20 53 65  current page. Se
ff10: 61 72 63 68 0a 20 20 20 20 20 20 2a 2a 20 66 6f  arch.      ** fo
ff20: 72 77 61 72 64 20 74 6f 20 66 69 6e 64 20 74 68  rward to find th
ff30: 65 20 70 61 67 65 20 63 6f 6e 74 61 69 6e 69 6e  e page containin
ff40: 67 20 74 68 65 20 6c 61 73 74 20 72 6f 77 69 64  g the last rowid
ff50: 2e 20 20 2a 2f 0a 20 20 20 20 20 20 66 6f 72 28  .  */.      for(
ff60: 70 67 6e 6f 3d 70 49 74 65 72 2d 3e 69 4c 65 61  pgno=pIter->iLea
ff70: 66 50 67 6e 6f 2b 31 3b 20 21 70 2d 3e 72 63 20  fPgno+1; !p->rc 
ff80: 26 26 20 70 67 6e 6f 3c 3d 70 53 65 67 2d 3e 70  && pgno<=pSeg->p
ff90: 67 6e 6f 4c 61 73 74 3b 20 70 67 6e 6f 2b 2b 29  gnoLast; pgno++)
ffa0: 7b 0a 20 20 20 20 20 20 20 20 69 36 34 20 69 41  {.        i64 iA
ffb0: 62 73 20 3d 20 46 54 53 35 5f 53 45 47 4d 45 4e  bs = FTS5_SEGMEN
ffc0: 54 5f 52 4f 57 49 44 28 70 53 65 67 2d 3e 69 53  T_ROWID(pSeg->iS
ffd0: 65 67 69 64 2c 20 70 67 6e 6f 29 3b 0a 20 20 20  egid, pgno);.   
ffe0: 20 20 20 20 20 46 74 73 35 44 61 74 61 20 2a 70       Fts5Data *p
fff0: 4e 65 77 20 3d 20 66 74 73 35 44 61 74 61 52 65  New = fts5DataRe
10000 61 64 28 70 2c 20 69 41 62 73 29 3b 0a 20 20 20  ad(p, iAbs);.   
10010 20 20 20 20 20 69 66 28 20 70 4e 65 77 20 29 7b       if( pNew ){
10020 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 69  .          int i
10030 52 6f 77 69 64 2c 20 62 54 65 72 6d 6c 65 73 73  Rowid, bTermless
10040 3b 0a 20 20 20 20 20 20 20 20 20 20 69 52 6f 77  ;.          iRow
10050 69 64 20 3d 20 66 74 73 35 4c 65 61 66 46 69 72  id = fts5LeafFir
10060 73 74 52 6f 77 69 64 4f 66 66 28 70 4e 65 77 29  stRowidOff(pNew)
10070 3b 0a 20 20 20 20 20 20 20 20 20 20 62 54 65 72  ;.          bTer
10080 6d 6c 65 73 73 20 3d 20 66 74 73 35 4c 65 61 66  mless = fts5Leaf
10090 49 73 54 65 72 6d 6c 65 73 73 28 70 4e 65 77 29  IsTermless(pNew)
100a0 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
100b0 69 52 6f 77 69 64 20 29 7b 0a 20 20 20 20 20 20  iRowid ){.      
100c0 20 20 20 20 20 20 53 57 41 50 56 41 4c 28 46 74        SWAPVAL(Ft
100d0 73 35 44 61 74 61 2a 2c 20 70 4e 65 77 2c 20 70  s5Data*, pNew, p
100e0 4c 61 73 74 29 3b 0a 20 20 20 20 20 20 20 20 20  Last);.         
100f0 20 20 20 70 67 6e 6f 4c 61 73 74 20 3d 20 70 67     pgnoLast = pg
10100 6e 6f 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  no;.          }.
10110 20 20 20 20 20 20 20 20 20 20 66 74 73 35 44 61            fts5Da
10120 74 61 52 65 6c 65 61 73 65 28 70 4e 65 77 29 3b  taRelease(pNew);
10130 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 62  .          if( b
10140 54 65 72 6d 6c 65 73 73 3d 3d 30 20 29 20 62 72  Termless==0 ) br
10150 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  eak;.        }. 
10160 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
10170 0a 0a 20 20 2f 2a 20 49 66 20 70 4c 61 73 74 20  ..  /* If pLast 
10180 69 73 20 4e 55 4c 4c 20 61 74 20 74 68 69 73 20  is NULL at this 
10190 70 6f 69 6e 74 2c 20 74 68 65 6e 20 74 68 65 20  point, then the 
101a0 6c 61 73 74 20 72 6f 77 69 64 20 66 6f 72 20 74  last rowid for t
101b0 68 69 73 20 64 6f 63 6c 69 73 74 0a 20 20 2a 2a  his doclist.  **
101c0 20 6c 69 65 73 20 6f 6e 20 74 68 65 20 70 61 67   lies on the pag
101d0 65 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 64 69  e currently indi
101e0 63 61 74 65 64 20 62 79 20 74 68 65 20 69 74 65  cated by the ite
101f0 72 61 74 6f 72 2e 20 49 6e 20 74 68 69 73 20 63  rator. In this c
10200 61 73 65 20 0a 20 20 2a 2a 20 70 49 74 65 72 2d  ase .  ** pIter-
10210 3e 69 4c 65 61 66 4f 66 66 73 65 74 20 69 73 20  >iLeafOffset is 
10220 61 6c 72 65 61 64 79 20 73 65 74 20 74 6f 20 70  already set to p
10230 6f 69 6e 74 20 74 6f 20 74 68 65 20 70 6f 73 69  oint to the posi
10240 74 69 6f 6e 2d 6c 69 73 74 20 73 69 7a 65 0a 20  tion-list size. 
10250 20 2a 2a 20 66 69 65 6c 64 20 61 73 73 6f 63 69   ** field associ
10260 61 74 65 64 20 77 69 74 68 20 74 68 65 20 66 69  ated with the fi
10270 72 73 74 20 72 65 6c 65 76 61 6e 74 20 72 6f 77  rst relevant row
10280 69 64 20 6f 6e 20 74 68 65 20 70 61 67 65 2e 0a  id on the page..
10290 20 20 2a 2a 0a 20 20 2a 2a 20 4f 72 2c 20 69 66    **.  ** Or, if
102a0 20 70 4c 61 73 74 20 69 73 20 6e 6f 6e 2d 4e 55   pLast is non-NU
102b0 4c 4c 2c 20 74 68 65 6e 20 69 74 20 69 73 20 74  LL, then it is t
102c0 68 65 20 70 61 67 65 20 74 68 61 74 20 63 6f 6e  he page that con
102d0 74 61 69 6e 73 20 74 68 65 20 6c 61 73 74 0a 20  tains the last. 
102e0 20 2a 2a 20 72 6f 77 69 64 2e 20 49 6e 20 74 68   ** rowid. In th
102f0 69 73 20 63 61 73 65 20 63 6f 6e 66 69 67 75 72  is case configur
10300 65 20 74 68 65 20 69 74 65 72 61 74 6f 72 20 73  e the iterator s
10310 6f 20 74 68 61 74 20 69 74 20 70 6f 69 6e 74 73  o that it points
10320 20 74 6f 20 74 68 65 0a 20 20 2a 2a 20 66 69 72   to the.  ** fir
10330 73 74 20 72 6f 77 69 64 20 6f 6e 20 74 68 69 73  st rowid on this
10340 20 70 61 67 65 2e 0a 20 20 2a 2f 0a 20 20 69 66   page..  */.  if
10350 28 20 70 4c 61 73 74 20 29 7b 0a 20 20 20 20 69  ( pLast ){.    i
10360 6e 74 20 69 4f 66 66 3b 0a 20 20 20 20 66 74 73  nt iOff;.    fts
10370 35 44 61 74 61 52 65 6c 65 61 73 65 28 70 49 74  5DataRelease(pIt
10380 65 72 2d 3e 70 4c 65 61 66 29 3b 0a 20 20 20 20  er->pLeaf);.    
10390 70 49 74 65 72 2d 3e 70 4c 65 61 66 20 3d 20 70  pIter->pLeaf = p
103a0 4c 61 73 74 3b 0a 20 20 20 20 70 49 74 65 72 2d  Last;.    pIter-
103b0 3e 69 4c 65 61 66 50 67 6e 6f 20 3d 20 70 67 6e  >iLeafPgno = pgn
103c0 6f 4c 61 73 74 3b 0a 20 20 20 20 69 4f 66 66 20  oLast;.    iOff 
103d0 3d 20 66 74 73 35 4c 65 61 66 46 69 72 73 74 52  = fts5LeafFirstR
103e0 6f 77 69 64 4f 66 66 28 70 4c 61 73 74 29 3b 0a  owidOff(pLast);.
103f0 20 20 20 20 69 4f 66 66 20 2b 3d 20 66 74 73 35      iOff += fts5
10400 47 65 74 56 61 72 69 6e 74 28 26 70 4c 61 73 74  GetVarint(&pLast
10410 2d 3e 70 5b 69 4f 66 66 5d 2c 20 28 75 36 34 2a  ->p[iOff], (u64*
10420 29 26 70 49 74 65 72 2d 3e 69 52 6f 77 69 64 29  )&pIter->iRowid)
10430 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 69 4c 65  ;.    pIter->iLe
10440 61 66 4f 66 66 73 65 74 20 3d 20 69 4f 66 66 3b  afOffset = iOff;
10450 0a 0a 20 20 20 20 69 66 28 20 66 74 73 35 4c 65  ..    if( fts5Le
10460 61 66 49 73 54 65 72 6d 6c 65 73 73 28 70 4c 61  afIsTermless(pLa
10470 73 74 29 20 29 7b 0a 20 20 20 20 20 20 70 49 74  st) ){.      pIt
10480 65 72 2d 3e 69 45 6e 64 6f 66 44 6f 63 6c 69 73  er->iEndofDoclis
10490 74 20 3d 20 70 4c 61 73 74 2d 3e 6e 6e 2b 31 3b  t = pLast->nn+1;
104a0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
104b0 20 20 70 49 74 65 72 2d 3e 69 45 6e 64 6f 66 44    pIter->iEndofD
104c0 6f 63 6c 69 73 74 20 3d 20 66 74 73 35 4c 65 61  oclist = fts5Lea
104d0 66 46 69 72 73 74 54 65 72 6d 4f 66 66 28 70 4c  fFirstTermOff(pL
104e0 61 73 74 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 7d  ast);.    }..  }
104f0 0a 0a 20 20 66 74 73 35 53 65 67 49 74 65 72 52  ..  fts5SegIterR
10500 65 76 65 72 73 65 49 6e 69 74 50 61 67 65 28 70  everseInitPage(p
10510 2c 20 70 49 74 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a  , pIter);.}../*.
10520 2a 2a 20 49 74 65 72 61 74 6f 72 20 70 49 74 65  ** Iterator pIte
10530 72 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e  r currently poin
10540 74 73 20 74 6f 20 74 68 65 20 66 69 72 73 74 20  ts to the first 
10550 72 6f 77 69 64 20 6f 66 20 61 20 64 6f 63 6c 69  rowid of a docli
10560 73 74 2e 0a 2a 2a 20 54 68 65 72 65 20 69 73 20  st..** There is 
10570 61 20 64 6f 63 6c 69 73 74 2d 69 6e 64 65 78 20  a doclist-index 
10580 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
10590 74 68 65 20 66 69 6e 61 6c 20 74 65 72 6d 20 6f  the final term o
105a0 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 0a 2a  n the current .*
105b0 2a 20 70 61 67 65 2e 20 49 66 20 74 68 65 20 63  * page. If the c
105c0 75 72 72 65 6e 74 20 74 65 72 6d 20 69 73 20 74  urrent term is t
105d0 68 65 20 6c 61 73 74 20 74 65 72 6d 20 6f 6e 20  he last term on 
105e0 74 68 65 20 70 61 67 65 2c 20 6c 6f 61 64 20 74  the page, load t
105f0 68 65 20 0a 2a 2a 20 64 6f 63 6c 69 73 74 2d 69  he .** doclist-i
10600 6e 64 65 78 20 66 72 6f 6d 20 64 69 73 6b 20 61  ndex from disk a
10610 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 20 61 6e  nd initialize an
10620 20 69 74 65 72 61 74 6f 72 20 61 74 20 28 70 49   iterator at (pI
10630 74 65 72 2d 3e 70 44 6c 69 64 78 29 2e 0a 2a 2f  ter->pDlidx)..*/
10640 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
10650 35 53 65 67 49 74 65 72 4c 6f 61 64 44 6c 69 64  5SegIterLoadDlid
10660 78 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20  x(Fts5Index *p, 
10670 46 74 73 35 53 65 67 49 74 65 72 20 2a 70 49 74  Fts5SegIter *pIt
10680 65 72 29 7b 0a 20 20 69 6e 74 20 69 53 65 67 20  er){.  int iSeg 
10690 3d 20 70 49 74 65 72 2d 3e 70 53 65 67 2d 3e 69  = pIter->pSeg->i
106a0 53 65 67 69 64 3b 0a 20 20 69 6e 74 20 62 52 65  Segid;.  int bRe
106b0 76 20 3d 20 28 70 49 74 65 72 2d 3e 66 6c 61 67  v = (pIter->flag
106c0 73 20 26 20 46 54 53 35 5f 53 45 47 49 54 45 52  s & FTS5_SEGITER
106d0 5f 52 45 56 45 52 53 45 29 3b 0a 20 20 46 74 73  _REVERSE);.  Fts
106e0 35 44 61 74 61 20 2a 70 4c 65 61 66 20 3d 20 70  5Data *pLeaf = p
106f0 49 74 65 72 2d 3e 70 4c 65 61 66 3b 20 2f 2a 20  Iter->pLeaf; /* 
10700 43 75 72 72 65 6e 74 20 6c 65 61 66 20 64 61 74  Current leaf dat
10710 61 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  a */..  assert( 
10720 70 49 74 65 72 2d 3e 66 6c 61 67 73 20 26 20 46  pIter->flags & F
10730 54 53 35 5f 53 45 47 49 54 45 52 5f 4f 4e 45 54  TS5_SEGITER_ONET
10740 45 52 4d 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ERM );.  assert(
10750 20 70 49 74 65 72 2d 3e 70 44 6c 69 64 78 3d 3d   pIter->pDlidx==
10760 30 20 29 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b  0 );..  /* Check
10770 20 69 66 20 74 68 65 20 63 75 72 72 65 6e 74 20   if the current 
10780 64 6f 63 6c 69 73 74 20 65 6e 64 73 20 6f 6e 20  doclist ends on 
10790 74 68 69 73 20 70 61 67 65 2e 20 49 66 20 69 74  this page. If it
107a0 20 64 6f 65 73 2c 20 72 65 74 75 72 6e 0a 20 20   does, return.  
107b0 2a 2a 20 65 61 72 6c 79 20 77 69 74 68 6f 75 74  ** early without
107c0 20 6c 6f 61 64 69 6e 67 20 74 68 65 20 64 6f 63   loading the doc
107d0 6c 69 73 74 2d 69 6e 64 65 78 20 28 61 73 20 69  list-index (as i
107e0 74 20 62 65 6c 6f 6e 67 73 20 74 6f 20 61 20 64  t belongs to a d
107f0 69 66 66 65 72 65 6e 74 0a 20 20 2a 2a 20 74 65  ifferent.  ** te
10800 72 6d 2e 20 2a 2f 0a 20 20 69 66 28 20 70 49 74  rm. */.  if( pIt
10810 65 72 2d 3e 69 54 65 72 6d 4c 65 61 66 50 67 6e  er->iTermLeafPgn
10820 6f 3d 3d 70 49 74 65 72 2d 3e 69 4c 65 61 66 50  o==pIter->iLeafP
10830 67 6e 6f 20 0a 20 20 20 26 26 20 70 49 74 65 72  gno .   && pIter
10840 2d 3e 69 45 6e 64 6f 66 44 6f 63 6c 69 73 74 3c  ->iEndofDoclist<
10850 70 4c 65 61 66 2d 3e 73 7a 4c 65 61 66 20 0a 20  pLeaf->szLeaf . 
10860 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a   ){.    return;.
10870 20 20 7d 0a 0a 20 20 70 49 74 65 72 2d 3e 70 44    }..  pIter->pD
10880 6c 69 64 78 20 3d 20 66 74 73 35 44 6c 69 64 78  lidx = fts5Dlidx
10890 49 74 65 72 49 6e 69 74 28 70 2c 20 62 52 65 76  IterInit(p, bRev
108a0 2c 20 69 53 65 67 2c 20 70 49 74 65 72 2d 3e 69  , iSeg, pIter->i
108b0 54 65 72 6d 4c 65 61 66 50 67 6e 6f 29 3b 0a 7d  TermLeafPgno);.}
108c0 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 69 74 65 72  ../*.** The iter
108d0 61 74 6f 72 20 6f 62 6a 65 63 74 20 70 61 73 73  ator object pass
108e0 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64  ed as the second
108f0 20 61 72 67 75 6d 65 6e 74 20 63 75 72 72 65 6e   argument curren
10900 74 6c 79 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20  tly contains.** 
10910 6e 6f 20 76 61 6c 69 64 20 76 61 6c 75 65 73 20  no valid values 
10920 65 78 63 65 70 74 20 66 6f 72 20 74 68 65 20 46  except for the F
10930 74 73 35 53 65 67 49 74 65 72 2e 70 4c 65 61 66  ts5SegIter.pLeaf
10940 20 6d 65 6d 62 65 72 20 76 61 72 69 61 62 6c 65   member variable
10950 2e 20 54 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69  . This.** functi
10960 6f 6e 20 73 65 61 72 63 68 65 73 20 74 68 65 20  on searches the 
10970 6c 65 61 66 20 70 61 67 65 20 66 6f 72 20 61 20  leaf page for a 
10980 74 65 72 6d 20 6d 61 74 63 68 69 6e 67 20 28 70  term matching (p
10990 54 65 72 6d 2f 6e 54 65 72 6d 29 2e 0a 2a 2a 0a  Term/nTerm)..**.
109a0 2a 2a 20 49 66 20 74 68 65 20 73 70 65 63 69 66  ** If the specif
109b0 69 65 64 20 74 65 72 6d 20 69 73 20 66 6f 75 6e  ied term is foun
109c0 64 20 6f 6e 20 74 68 65 20 70 61 67 65 2c 20 74  d on the page, t
109d0 68 65 6e 20 74 68 65 20 69 74 65 72 61 74 6f 72  hen the iterator
109e0 20 69 73 20 6c 65 66 74 0a 2a 2a 20 70 6f 69 6e   is left.** poin
109f0 74 69 6e 67 20 74 6f 20 69 74 2e 20 49 66 20 61  ting to it. If a
10a00 72 67 75 6d 65 6e 74 20 62 47 65 20 69 73 20 7a  rgument bGe is z
10a10 65 72 6f 20 61 6e 64 20 74 68 65 20 74 65 72 6d  ero and the term
10a20 20 69 73 20 6e 6f 74 20 66 6f 75 6e 64 2c 0a 2a   is not found,.*
10a30 2a 20 74 68 65 20 69 74 65 72 61 74 6f 72 20 69  * the iterator i
10a40 73 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67 20  s left pointing 
10a50 61 74 20 45 4f 46 2e 0a 2a 2a 0a 2a 2a 20 49 66  at EOF..**.** If
10a60 20 62 47 65 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f   bGe is non-zero
10a70 20 61 6e 64 20 74 68 65 20 73 70 65 63 69 66 69   and the specifi
10a80 65 64 20 74 65 72 6d 20 69 73 20 6e 6f 74 20 66  ed term is not f
10a90 6f 75 6e 64 2c 20 74 68 65 6e 20 74 68 65 0a 2a  ound, then the.*
10aa0 2a 20 69 74 65 72 61 74 6f 72 20 69 73 20 6c 65  * iterator is le
10ab0 66 74 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74  ft pointing to t
10ac0 68 65 20 73 6d 61 6c 6c 65 73 74 20 74 65 72 6d  he smallest term
10ad0 20 69 6e 20 74 68 65 20 73 65 67 6d 65 6e 74 20   in the segment 
10ae0 74 68 61 74 0a 2a 2a 20 69 73 20 6c 61 72 67 65  that.** is large
10af0 72 20 74 68 61 6e 20 74 68 65 20 73 70 65 63 69  r than the speci
10b00 66 69 65 64 20 74 65 72 6d 2c 20 65 76 65 6e 20  fied term, even 
10b10 69 66 20 74 68 69 73 20 74 65 72 6d 20 69 73 20  if this term is 
10b20 6e 6f 74 20 6f 6e 20 74 68 65 0a 2a 2a 20 63 75  not on the.** cu
10b30 72 72 65 6e 74 20 70 61 67 65 2e 0a 2a 2f 0a 73  rrent page..*/.s
10b40 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 4c  tatic void fts5L
10b50 65 61 66 53 65 65 6b 28 0a 20 20 46 74 73 35 49  eafSeek(.  Fts5I
10b60 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20  ndex *p,        
10b70 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65             /* Le
10b80 61 76 65 20 61 6e 79 20 65 72 72 6f 72 20 63 6f  ave any error co
10b90 64 65 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74  de here */.  int
10ba0 20 62 47 65 2c 20 20 20 20 20 20 20 20 20 20 20   bGe,           
10bb0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
10bc0 54 72 75 65 20 66 6f 72 20 61 20 3e 3d 20 73 65  True for a >= se
10bd0 61 72 63 68 20 2a 2f 0a 20 20 46 74 73 35 53 65  arch */.  Fts5Se
10be0 67 49 74 65 72 20 2a 70 49 74 65 72 2c 20 20 20  gIter *pIter,   
10bf0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 74 65            /* Ite
10c00 72 61 74 6f 72 20 74 6f 20 73 65 65 6b 20 2a 2f  rator to seek */
10c10 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 70 54 65  .  const u8 *pTe
10c20 72 6d 2c 20 69 6e 74 20 6e 54 65 72 6d 20 20 20  rm, int nTerm   
10c30 20 20 20 2f 2a 20 54 65 72 6d 20 74 6f 20 73 65     /* Term to se
10c40 61 72 63 68 20 66 6f 72 20 2a 2f 0a 29 7b 0a 20  arch for */.){. 
10c50 20 69 6e 74 20 69 4f 66 66 3b 0a 20 20 63 6f 6e   int iOff;.  con
10c60 73 74 20 75 38 20 2a 61 20 3d 20 70 49 74 65 72  st u8 *a = pIter
10c70 2d 3e 70 4c 65 61 66 2d 3e 70 3b 0a 20 20 69 6e  ->pLeaf->p;.  in
10c80 74 20 73 7a 4c 65 61 66 20 3d 20 70 49 74 65 72  t szLeaf = pIter
10c90 2d 3e 70 4c 65 61 66 2d 3e 73 7a 4c 65 61 66 3b  ->pLeaf->szLeaf;
10ca0 0a 20 20 69 6e 74 20 6e 20 3d 20 70 49 74 65 72  .  int n = pIter
10cb0 2d 3e 70 4c 65 61 66 2d 3e 6e 6e 3b 0a 0a 20 20  ->pLeaf->nn;..  
10cc0 69 6e 74 20 6e 4d 61 74 63 68 20 3d 20 30 3b 0a  int nMatch = 0;.
10cd0 20 20 69 6e 74 20 6e 4b 65 65 70 20 3d 20 30 3b    int nKeep = 0;
10ce0 0a 20 20 69 6e 74 20 6e 4e 65 77 20 3d 20 30 3b  .  int nNew = 0;
10cf0 0a 20 20 69 6e 74 20 69 54 65 72 6d 4f 66 66 3b  .  int iTermOff;
10d00 0a 20 20 69 6e 74 20 69 50 67 69 64 78 3b 20 20  .  int iPgidx;  
10d10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10d20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 6f 66     /* Current of
10d30 66 73 65 74 20 69 6e 20 70 67 69 64 78 20 2a 2f  fset in pgidx */
10d40 0a 20 20 69 6e 74 20 62 45 6e 64 4f 66 50 61 67  .  int bEndOfPag
10d50 65 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74  e = 0;..  assert
10d60 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
10d70 4f 4b 20 29 3b 0a 0a 20 20 69 50 67 69 64 78 20  OK );..  iPgidx 
10d80 3d 20 73 7a 4c 65 61 66 3b 0a 20 20 69 50 67 69  = szLeaf;.  iPgi
10d90 64 78 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72  dx += fts5GetVar
10da0 69 6e 74 33 32 28 26 61 5b 69 50 67 69 64 78 5d  int32(&a[iPgidx]
10db0 2c 20 69 54 65 72 6d 4f 66 66 29 3b 0a 20 20 69  , iTermOff);.  i
10dc0 4f 66 66 20 3d 20 69 54 65 72 6d 4f 66 66 3b 0a  Off = iTermOff;.
10dd0 0a 20 20 77 68 69 6c 65 28 20 31 20 29 7b 0a 0a  .  while( 1 ){..
10de0 20 20 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75      /* Figure ou
10df0 74 20 68 6f 77 20 6d 61 6e 79 20 6e 65 77 20 62  t how many new b
10e00 79 74 65 73 20 61 72 65 20 69 6e 20 74 68 69 73  ytes are in this
10e10 20 74 65 72 6d 20 2a 2f 0a 20 20 20 20 66 74 73   term */.    fts
10e20 35 46 61 73 74 47 65 74 56 61 72 69 6e 74 33 32  5FastGetVarint32
10e30 28 61 2c 20 69 4f 66 66 2c 20 6e 4e 65 77 29 3b  (a, iOff, nNew);
10e40 0a 20 20 20 20 69 66 28 20 6e 4b 65 65 70 3c 6e  .    if( nKeep<n
10e50 4d 61 74 63 68 20 29 7b 0a 20 20 20 20 20 20 67  Match ){.      g
10e60 6f 74 6f 20 73 65 61 72 63 68 5f 66 61 69 6c 65  oto search_faile
10e70 64 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 61 73  d;.    }..    as
10e80 73 65 72 74 28 20 6e 4b 65 65 70 3e 3d 6e 4d 61  sert( nKeep>=nMa
10e90 74 63 68 20 29 3b 0a 20 20 20 20 69 66 28 20 6e  tch );.    if( n
10ea0 4b 65 65 70 3d 3d 6e 4d 61 74 63 68 20 29 7b 0a  Keep==nMatch ){.
10eb0 20 20 20 20 20 20 69 6e 74 20 6e 43 6d 70 3b 0a        int nCmp;.
10ec0 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20        int i;.   
10ed0 20 20 20 6e 43 6d 70 20 3d 20 4d 49 4e 28 6e 4e     nCmp = MIN(nN
10ee0 65 77 2c 20 6e 54 65 72 6d 2d 6e 4d 61 74 63 68  ew, nTerm-nMatch
10ef0 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30  );.      for(i=0
10f00 3b 20 69 3c 6e 43 6d 70 3b 20 69 2b 2b 29 7b 0a  ; i<nCmp; i++){.
10f10 20 20 20 20 20 20 20 20 69 66 28 20 61 5b 69 4f          if( a[iO
10f20 66 66 2b 69 5d 21 3d 70 54 65 72 6d 5b 6e 4d 61  ff+i]!=pTerm[nMa
10f30 74 63 68 2b 69 5d 20 29 20 62 72 65 61 6b 3b 0a  tch+i] ) break;.
10f40 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6e 4d        }.      nM
10f50 61 74 63 68 20 2b 3d 20 69 3b 0a 0a 20 20 20 20  atch += i;..    
10f60 20 20 69 66 28 20 6e 54 65 72 6d 3d 3d 6e 4d 61    if( nTerm==nMa
10f70 74 63 68 20 29 7b 0a 20 20 20 20 20 20 20 20 69  tch ){.        i
10f80 66 28 20 69 3d 3d 6e 4e 65 77 20 29 7b 0a 20 20  f( i==nNew ){.  
10f90 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73 65 61          goto sea
10fa0 72 63 68 5f 73 75 63 63 65 73 73 3b 0a 20 20 20  rch_success;.   
10fb0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
10fc0 20 20 20 20 20 20 67 6f 74 6f 20 73 65 61 72 63        goto searc
10fd0 68 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 20 20  h_failed;.      
10fe0 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 20    }.      }else 
10ff0 69 66 28 20 69 3c 6e 4e 65 77 20 26 26 20 61 5b  if( i<nNew && a[
11000 69 4f 66 66 2b 69 5d 3e 70 54 65 72 6d 5b 6e 4d  iOff+i]>pTerm[nM
11010 61 74 63 68 5d 20 29 7b 0a 20 20 20 20 20 20 20  atch] ){.       
11020 20 67 6f 74 6f 20 73 65 61 72 63 68 5f 66 61 69   goto search_fai
11030 6c 65 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  led;.      }.   
11040 20 7d 0a 0a 20 20 20 20 69 66 28 20 69 50 67 69   }..    if( iPgi
11050 64 78 3e 3d 6e 20 29 7b 0a 20 20 20 20 20 20 62  dx>=n ){.      b
11060 45 6e 64 4f 66 50 61 67 65 20 3d 20 31 3b 0a 20  EndOfPage = 1;. 
11070 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
11080 7d 0a 0a 20 20 20 20 69 50 67 69 64 78 20 2b 3d  }..    iPgidx +=
11090 20 66 74 73 35 47 65 74 56 61 72 69 6e 74 33 32   fts5GetVarint32
110a0 28 26 61 5b 69 50 67 69 64 78 5d 2c 20 6e 4b 65  (&a[iPgidx], nKe
110b0 65 70 29 3b 0a 20 20 20 20 69 54 65 72 6d 4f 66  ep);.    iTermOf
110c0 66 20 2b 3d 20 6e 4b 65 65 70 3b 0a 20 20 20 20  f += nKeep;.    
110d0 69 4f 66 66 20 3d 20 69 54 65 72 6d 4f 66 66 3b  iOff = iTermOff;
110e0 0a 0a 20 20 20 20 2f 2a 20 52 65 61 64 20 74 68  ..    /* Read th
110f0 65 20 6e 4b 65 65 70 20 66 69 65 6c 64 20 6f 66  e nKeep field of
11100 20 74 68 65 20 6e 65 78 74 20 74 65 72 6d 2e 20   the next term. 
11110 2a 2f 0a 20 20 20 20 66 74 73 35 46 61 73 74 47  */.    fts5FastG
11120 65 74 56 61 72 69 6e 74 33 32 28 61 2c 20 69 4f  etVarint32(a, iO
11130 66 66 2c 20 6e 4b 65 65 70 29 3b 0a 20 20 7d 0a  ff, nKeep);.  }.
11140 0a 20 73 65 61 72 63 68 5f 66 61 69 6c 65 64 3a  . search_failed:
11150 0a 20 20 69 66 28 20 62 47 65 3d 3d 30 20 29 7b  .  if( bGe==0 ){
11160 0a 20 20 20 20 66 74 73 35 44 61 74 61 52 65 6c  .    fts5DataRel
11170 65 61 73 65 28 70 49 74 65 72 2d 3e 70 4c 65 61  ease(pIter->pLea
11180 66 29 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 70  f);.    pIter->p
11190 4c 65 61 66 20 3d 20 30 3b 0a 20 20 20 20 72 65  Leaf = 0;.    re
111a0 74 75 72 6e 3b 0a 20 20 7d 65 6c 73 65 20 69 66  turn;.  }else if
111b0 28 20 62 45 6e 64 4f 66 50 61 67 65 20 29 7b 0a  ( bEndOfPage ){.
111c0 20 20 20 20 64 6f 20 7b 0a 20 20 20 20 20 20 66      do {.      f
111d0 74 73 35 53 65 67 49 74 65 72 4e 65 78 74 50 61  ts5SegIterNextPa
111e0 67 65 28 70 2c 20 70 49 74 65 72 29 3b 0a 20 20  ge(p, pIter);.  
111f0 20 20 20 20 69 66 28 20 70 49 74 65 72 2d 3e 70      if( pIter->p
11200 4c 65 61 66 3d 3d 30 20 29 20 72 65 74 75 72 6e  Leaf==0 ) return
11210 3b 0a 20 20 20 20 20 20 61 20 3d 20 70 49 74 65  ;.      a = pIte
11220 72 2d 3e 70 4c 65 61 66 2d 3e 70 3b 0a 20 20 20  r->pLeaf->p;.   
11230 20 20 20 69 66 28 20 66 74 73 35 4c 65 61 66 49     if( fts5LeafI
11240 73 54 65 72 6d 6c 65 73 73 28 70 49 74 65 72 2d  sTermless(pIter-
11250 3e 70 4c 65 61 66 29 3d 3d 30 20 29 7b 0a 20 20  >pLeaf)==0 ){.  
11260 20 20 20 20 20 20 69 50 67 69 64 78 20 3d 20 70        iPgidx = p
11270 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 73 7a 4c  Iter->pLeaf->szL
11280 65 61 66 3b 0a 20 20 20 20 20 20 20 20 69 50 67  eaf;.        iPg
11290 69 64 78 20 2b 3d 20 66 74 73 35 47 65 74 56 61  idx += fts5GetVa
112a0 72 69 6e 74 33 32 28 26 70 49 74 65 72 2d 3e 70  rint32(&pIter->p
112b0 4c 65 61 66 2d 3e 70 5b 69 50 67 69 64 78 5d 2c  Leaf->p[iPgidx],
112c0 20 69 4f 66 66 29 3b 0a 20 20 20 20 20 20 20 20   iOff);.        
112d0 69 66 28 20 69 4f 66 66 3c 34 20 7c 7c 20 69 4f  if( iOff<4 || iO
112e0 66 66 3e 3d 70 49 74 65 72 2d 3e 70 4c 65 61 66  ff>=pIter->pLeaf
112f0 2d 3e 73 7a 4c 65 61 66 20 29 7b 0a 20 20 20 20  ->szLeaf ){.    
11300 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 46 54        p->rc = FT
11310 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20 20  S5_CORRUPT;.    
11320 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
11330 20 20 20 20 20 6e 4b 65 65 70 20 3d 20 30 3b 0a       nKeep = 0;.
11340 20 20 20 20 20 20 20 20 20 20 69 54 65 72 6d 4f            iTermO
11350 66 66 20 3d 20 69 4f 66 66 3b 0a 20 20 20 20 20  ff = iOff;.     
11360 20 20 20 20 20 6e 20 3d 20 70 49 74 65 72 2d 3e       n = pIter->
11370 70 4c 65 61 66 2d 3e 6e 6e 3b 0a 20 20 20 20 20  pLeaf->nn;.     
11380 20 20 20 20 20 69 4f 66 66 20 2b 3d 20 66 74 73       iOff += fts
11390 35 47 65 74 56 61 72 69 6e 74 33 32 28 26 61 5b  5GetVarint32(&a[
113a0 69 4f 66 66 5d 2c 20 6e 4e 65 77 29 3b 0a 20 20  iOff], nNew);.  
113b0 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
113c0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
113d0 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 31 20 29  .    }while( 1 )
113e0 3b 0a 20 20 7d 0a 0a 20 73 65 61 72 63 68 5f 73  ;.  }.. search_s
113f0 75 63 63 65 73 73 3a 0a 0a 20 20 70 49 74 65 72  uccess:..  pIter
11400 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 20 3d 20  ->iLeafOffset = 
11410 69 4f 66 66 20 2b 20 6e 4e 65 77 3b 0a 20 20 70  iOff + nNew;.  p
11420 49 74 65 72 2d 3e 69 54 65 72 6d 4c 65 61 66 4f  Iter->iTermLeafO
11430 66 66 73 65 74 20 3d 20 70 49 74 65 72 2d 3e 69  ffset = pIter->i
11440 4c 65 61 66 4f 66 66 73 65 74 3b 0a 20 20 70 49  LeafOffset;.  pI
11450 74 65 72 2d 3e 69 54 65 72 6d 4c 65 61 66 50 67  ter->iTermLeafPg
11460 6e 6f 20 3d 20 70 49 74 65 72 2d 3e 69 4c 65 61  no = pIter->iLea
11470 66 50 67 6e 6f 3b 0a 0a 20 20 66 74 73 35 42 75  fPgno;..  fts5Bu
11480 66 66 65 72 53 65 74 28 26 70 2d 3e 72 63 2c 20  fferSet(&p->rc, 
11490 26 70 49 74 65 72 2d 3e 74 65 72 6d 2c 20 6e 4b  &pIter->term, nK
114a0 65 65 70 2c 20 70 54 65 72 6d 29 3b 0a 20 20 66  eep, pTerm);.  f
114b0 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 42  ts5BufferAppendB
114c0 6c 6f 62 28 26 70 2d 3e 72 63 2c 20 26 70 49 74  lob(&p->rc, &pIt
114d0 65 72 2d 3e 74 65 72 6d 2c 20 6e 4e 65 77 2c 20  er->term, nNew, 
114e0 26 61 5b 69 4f 66 66 5d 29 3b 0a 0a 20 20 69 66  &a[iOff]);..  if
114f0 28 20 69 50 67 69 64 78 3e 3d 6e 20 29 7b 0a 20  ( iPgidx>=n ){. 
11500 20 20 20 70 49 74 65 72 2d 3e 69 45 6e 64 6f 66     pIter->iEndof
11510 44 6f 63 6c 69 73 74 20 3d 20 70 49 74 65 72 2d  Doclist = pIter-
11520 3e 70 4c 65 61 66 2d 3e 6e 6e 2b 31 3b 0a 20 20  >pLeaf->nn+1;.  
11530 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 6e  }else{.    int n
11540 45 78 74 72 61 3b 0a 20 20 20 20 69 50 67 69 64  Extra;.    iPgid
11550 78 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69  x += fts5GetVari
11560 6e 74 33 32 28 26 61 5b 69 50 67 69 64 78 5d 2c  nt32(&a[iPgidx],
11570 20 6e 45 78 74 72 61 29 3b 0a 20 20 20 20 70 49   nExtra);.    pI
11580 74 65 72 2d 3e 69 45 6e 64 6f 66 44 6f 63 6c 69  ter->iEndofDocli
11590 73 74 20 3d 20 69 54 65 72 6d 4f 66 66 20 2b 20  st = iTermOff + 
115a0 6e 45 78 74 72 61 3b 0a 20 20 7d 0a 20 20 70 49  nExtra;.  }.  pI
115b0 74 65 72 2d 3e 69 50 67 69 64 78 4f 66 66 20 3d  ter->iPgidxOff =
115c0 20 69 50 67 69 64 78 3b 0a 0a 20 20 66 74 73 35   iPgidx;..  fts5
115d0 53 65 67 49 74 65 72 4c 6f 61 64 52 6f 77 69 64  SegIterLoadRowid
115e0 28 70 2c 20 70 49 74 65 72 29 3b 0a 20 20 66 74  (p, pIter);.  ft
115f0 73 35 53 65 67 49 74 65 72 4c 6f 61 64 4e 50 6f  s5SegIterLoadNPo
11600 73 28 70 2c 20 70 49 74 65 72 29 3b 0a 7d 0a 0a  s(p, pIter);.}..
11610 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65  /*.** Initialize
11620 20 74 68 65 20 6f 62 6a 65 63 74 20 70 49 74 65   the object pIte
11630 72 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 65  r to point to te
11640 72 6d 20 70 54 65 72 6d 2f 6e 54 65 72 6d 20 77  rm pTerm/nTerm w
11650 69 74 68 69 6e 20 73 65 67 6d 65 6e 74 0a 2a 2a  ithin segment.**
11660 20 70 53 65 67 2e 20 49 66 20 74 68 65 72 65 20   pSeg. If there 
11670 69 73 20 6e 6f 20 73 75 63 68 20 74 65 72 6d 20  is no such term 
11680 69 6e 20 74 68 65 20 69 6e 64 65 78 2c 20 74 68  in the index, th
11690 65 20 69 74 65 72 61 74 6f 72 20 69 73 20 73 65  e iterator is se
116a0 74 20 74 6f 20 45 4f 46 2e 0a 2a 2a 0a 2a 2a 20  t to EOF..**.** 
116b0 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
116c0 72 73 2c 20 46 74 73 35 49 6e 64 65 78 2e 72 63  rs, Fts5Index.rc
116d0 20 69 73 20 73 65 74 20 74 6f 20 61 6e 20 61 70   is set to an ap
116e0 70 72 6f 70 72 69 61 74 65 20 65 72 72 6f 72 20  propriate error 
116f0 63 6f 64 65 2e 20 49 66 20 0a 2a 2a 20 61 6e 20  code. If .** an 
11700 65 72 72 6f 72 20 68 61 73 20 61 6c 72 65 61 64  error has alread
11710 79 20 6f 63 63 75 72 72 65 64 20 77 68 65 6e 20  y occurred when 
11720 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
11730 20 63 61 6c 6c 65 64 2c 20 69 74 20 69 73 20 61   called, it is a
11740 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69   no-op..*/.stati
11750 63 20 76 6f 69 64 20 66 74 73 35 53 65 67 49 74  c void fts5SegIt
11760 65 72 53 65 65 6b 49 6e 69 74 28 0a 20 20 46 74  erSeekInit(.  Ft
11770 73 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20  s5Index *p,     
11780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
11790 20 46 54 53 35 20 62 61 63 6b 65 6e 64 20 2a 2f   FTS5 backend */
117a0 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 70 54 65  .  const u8 *pTe
117b0 72 6d 2c 20 69 6e 74 20 6e 54 65 72 6d 2c 20 20  rm, int nTerm,  
117c0 20 20 20 2f 2a 20 54 65 72 6d 20 74 6f 20 73 65     /* Term to se
117d0 65 6b 20 74 6f 20 2a 2f 0a 20 20 69 6e 74 20 66  ek to */.  int f
117e0 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20 20 20  lags,           
117f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61             /* Ma
11800 73 6b 20 6f 66 20 46 54 53 35 49 4e 44 45 58 5f  sk of FTS5INDEX_
11810 58 58 58 20 66 6c 61 67 73 20 2a 2f 0a 20 20 46  XXX flags */.  F
11820 74 73 35 53 74 72 75 63 74 75 72 65 53 65 67 6d  ts5StructureSegm
11830 65 6e 74 20 2a 70 53 65 67 2c 20 20 20 20 20 2f  ent *pSeg,     /
11840 2a 20 44 65 73 63 72 69 70 74 69 6f 6e 20 6f 66  * Description of
11850 20 73 65 67 6d 65 6e 74 20 2a 2f 0a 20 20 46 74   segment */.  Ft
11860 73 35 53 65 67 49 74 65 72 20 2a 70 49 74 65 72  s5SegIter *pIter
11870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
11880 20 4f 62 6a 65 63 74 20 74 6f 20 70 6f 70 75 6c   Object to popul
11890 61 74 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ate */.){.  int 
118a0 69 50 67 20 3d 20 31 3b 0a 20 20 69 6e 74 20 62  iPg = 1;.  int b
118b0 47 65 20 3d 20 28 66 6c 61 67 73 20 26 20 46 54  Ge = (flags & FT
118c0 53 35 49 4e 44 45 58 5f 51 55 45 52 59 5f 53 43  S5INDEX_QUERY_SC
118d0 41 4e 29 3b 0a 20 20 69 6e 74 20 62 44 6c 69 64  AN);.  int bDlid
118e0 78 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  x = 0;          
118f0 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
11900 66 20 74 68 65 72 65 20 69 73 20 61 20 64 6f 63  f there is a doc
11910 6c 69 73 74 2d 69 6e 64 65 78 20 2a 2f 0a 0a 20  list-index */.. 
11920 20 61 73 73 65 72 74 28 20 62 47 65 3d 3d 30 20   assert( bGe==0 
11930 7c 7c 20 28 66 6c 61 67 73 20 26 20 46 54 53 35  || (flags & FTS5
11940 49 4e 44 45 58 5f 51 55 45 52 59 5f 44 45 53 43  INDEX_QUERY_DESC
11950 29 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  )==0 );.  assert
11960 28 20 70 54 65 72 6d 20 26 26 20 6e 54 65 72 6d  ( pTerm && nTerm
11970 20 29 3b 0a 20 20 6d 65 6d 73 65 74 28 70 49 74   );.  memset(pIt
11980 65 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70  er, 0, sizeof(*p
11990 49 74 65 72 29 29 3b 0a 20 20 70 49 74 65 72 2d  Iter));.  pIter-
119a0 3e 70 53 65 67 20 3d 20 70 53 65 67 3b 0a 0a 20  >pSeg = pSeg;.. 
119b0 20 2f 2a 20 54 68 69 73 20 62 6c 6f 63 6b 20 73   /* This block s
119c0 65 74 73 20 73 74 61 63 6b 20 76 61 72 69 61 62  ets stack variab
119d0 6c 65 20 69 50 67 20 74 6f 20 74 68 65 20 6c 65  le iPg to the le
119e0 61 66 20 70 61 67 65 20 6e 75 6d 62 65 72 20 74  af page number t
119f0 68 61 74 20 6d 61 79 0a 20 20 2a 2a 20 63 6f 6e  hat may.  ** con
11a00 74 61 69 6e 20 74 65 72 6d 20 28 70 54 65 72 6d  tain term (pTerm
11a10 2f 6e 54 65 72 6d 29 2c 20 69 66 20 69 74 20 69  /nTerm), if it i
11a20 73 20 70 72 65 73 65 6e 74 20 69 6e 20 74 68 65  s present in the
11a30 20 73 65 67 6d 65 6e 74 2e 20 2a 2f 0a 20 20 69   segment. */.  i
11a40 66 28 20 70 2d 3e 70 49 64 78 53 65 6c 65 63 74  f( p->pIdxSelect
11a50 3d 3d 30 20 29 7b 0a 20 20 20 20 46 74 73 35 43  ==0 ){.    Fts5C
11a60 6f 6e 66 69 67 20 2a 70 43 6f 6e 66 69 67 20 3d  onfig *pConfig =
11a70 20 70 2d 3e 70 43 6f 6e 66 69 67 3b 0a 20 20 20   p->pConfig;.   
11a80 20 66 74 73 35 49 6e 64 65 78 50 72 65 70 61 72   fts5IndexPrepar
11a90 65 53 74 6d 74 28 70 2c 20 26 70 2d 3e 70 49 64  eStmt(p, &p->pId
11aa0 78 53 65 6c 65 63 74 2c 20 73 71 6c 69 74 65 33  xSelect, sqlite3
11ab0 5f 6d 70 72 69 6e 74 66 28 0a 20 20 20 20 20 20  _mprintf(.      
11ac0 20 20 20 20 22 53 45 4c 45 43 54 20 70 67 6e 6f      "SELECT pgno
11ad0 20 46 52 4f 4d 20 27 25 71 27 2e 27 25 71 5f 69   FROM '%q'.'%q_i
11ae0 64 78 27 20 57 48 45 52 45 20 22 0a 20 20 20 20  dx' WHERE ".    
11af0 20 20 20 20 20 20 22 73 65 67 69 64 3d 3f 20 41        "segid=? A
11b00 4e 44 20 74 65 72 6d 3c 3d 3f 20 4f 52 44 45 52  ND term<=? ORDER
11b10 20 42 59 20 74 65 72 6d 20 44 45 53 43 20 4c 49   BY term DESC LI
11b20 4d 49 54 20 31 22 2c 0a 20 20 20 20 20 20 20 20  MIT 1",.        
11b30 20 20 70 43 6f 6e 66 69 67 2d 3e 7a 44 62 2c 20    pConfig->zDb, 
11b40 70 43 6f 6e 66 69 67 2d 3e 7a 4e 61 6d 65 0a 20  pConfig->zName. 
11b50 20 20 20 29 29 3b 0a 20 20 7d 0a 20 20 69 66 28     ));.  }.  if(
11b60 20 70 2d 3e 72 63 20 29 20 72 65 74 75 72 6e 3b   p->rc ) return;
11b70 0a 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f  .  sqlite3_bind_
11b80 69 6e 74 28 70 2d 3e 70 49 64 78 53 65 6c 65 63  int(p->pIdxSelec
11b90 74 2c 20 31 2c 20 70 53 65 67 2d 3e 69 53 65 67  t, 1, pSeg->iSeg
11ba0 69 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 62  id);.  sqlite3_b
11bb0 69 6e 64 5f 62 6c 6f 62 28 70 2d 3e 70 49 64 78  ind_blob(p->pIdx
11bc0 53 65 6c 65 63 74 2c 20 32 2c 20 70 54 65 72 6d  Select, 2, pTerm
11bd0 2c 20 6e 54 65 72 6d 2c 20 53 51 4c 49 54 45 5f  , nTerm, SQLITE_
11be0 53 54 41 54 49 43 29 3b 0a 20 20 69 66 28 20 53  STATIC);.  if( S
11bf0 51 4c 49 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74  QLITE_ROW==sqlit
11c00 65 33 5f 73 74 65 70 28 70 2d 3e 70 49 64 78 53  e3_step(p->pIdxS
11c10 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 69 36  elect) ){.    i6
11c20 34 20 76 61 6c 20 3d 20 73 71 6c 69 74 65 33 5f  4 val = sqlite3_
11c30 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 2d 3e 70 49  column_int(p->pI
11c40 64 78 53 65 6c 65 63 74 2c 20 30 29 3b 0a 20 20  dxSelect, 0);.  
11c50 20 20 69 50 67 20 3d 20 28 69 6e 74 29 28 76 61    iPg = (int)(va
11c60 6c 3e 3e 31 29 3b 0a 20 20 20 20 62 44 6c 69 64  l>>1);.    bDlid
11c70 78 20 3d 20 28 76 61 6c 20 26 20 30 78 30 30 30  x = (val & 0x000
11c80 31 29 3b 0a 20 20 7d 0a 20 20 70 2d 3e 72 63 20  1);.  }.  p->rc 
11c90 3d 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28  = sqlite3_reset(
11ca0 70 2d 3e 70 49 64 78 53 65 6c 65 63 74 29 3b 0a  p->pIdxSelect);.
11cb0 0a 20 20 69 66 28 20 69 50 67 3c 70 53 65 67 2d  .  if( iPg<pSeg-
11cc0 3e 70 67 6e 6f 46 69 72 73 74 20 29 7b 0a 20 20  >pgnoFirst ){.  
11cd0 20 20 69 50 67 20 3d 20 70 53 65 67 2d 3e 70 67    iPg = pSeg->pg
11ce0 6e 6f 46 69 72 73 74 3b 0a 20 20 20 20 62 44 6c  noFirst;.    bDl
11cf0 69 64 78 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20  idx = 0;.  }..  
11d00 70 49 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f  pIter->iLeafPgno
11d10 20 3d 20 69 50 67 20 2d 20 31 3b 0a 20 20 66 74   = iPg - 1;.  ft
11d20 73 35 53 65 67 49 74 65 72 4e 65 78 74 50 61 67  s5SegIterNextPag
11d30 65 28 70 2c 20 70 49 74 65 72 29 3b 0a 0a 20 20  e(p, pIter);..  
11d40 69 66 28 20 70 49 74 65 72 2d 3e 70 4c 65 61 66  if( pIter->pLeaf
11d50 20 29 7b 0a 20 20 20 20 66 74 73 35 4c 65 61 66   ){.    fts5Leaf
11d60 53 65 65 6b 28 70 2c 20 62 47 65 2c 20 70 49 74  Seek(p, bGe, pIt
11d70 65 72 2c 20 70 54 65 72 6d 2c 20 6e 54 65 72 6d  er, pTerm, nTerm
11d80 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 2d  );.  }..  if( p-
11d90 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26  >rc==SQLITE_OK &
11da0 26 20 62 47 65 3d 3d 30 20 29 7b 0a 20 20 20 20  & bGe==0 ){.    
11db0 70 49 74 65 72 2d 3e 66 6c 61 67 73 20 7c 3d 20  pIter->flags |= 
11dc0 46 54 53 35 5f 53 45 47 49 54 45 52 5f 4f 4e 45  FTS5_SEGITER_ONE
11dd0 54 45 52 4d 3b 0a 20 20 20 20 69 66 28 20 70 49  TERM;.    if( pI
11de0 74 65 72 2d 3e 70 4c 65 61 66 20 29 7b 0a 20 20  ter->pLeaf ){.  
11df0 20 20 20 20 69 66 28 20 66 6c 61 67 73 20 26 20      if( flags & 
11e00 46 54 53 35 49 4e 44 45 58 5f 51 55 45 52 59 5f  FTS5INDEX_QUERY_
11e10 44 45 53 43 20 29 7b 0a 20 20 20 20 20 20 20 20  DESC ){.        
11e20 70 49 74 65 72 2d 3e 66 6c 61 67 73 20 7c 3d 20  pIter->flags |= 
11e30 46 54 53 35 5f 53 45 47 49 54 45 52 5f 52 45 56  FTS5_SEGITER_REV
11e40 45 52 53 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ERSE;.      }.  
11e50 20 20 20 20 69 66 28 20 62 44 6c 69 64 78 20 29      if( bDlidx )
11e60 7b 0a 20 20 20 20 20 20 20 20 66 74 73 35 53 65  {.        fts5Se
11e70 67 49 74 65 72 4c 6f 61 64 44 6c 69 64 78 28 70  gIterLoadDlidx(p
11e80 2c 20 70 49 74 65 72 29 3b 0a 20 20 20 20 20 20  , pIter);.      
11e90 7d 0a 20 20 20 20 20 20 69 66 28 20 66 6c 61 67  }.      if( flag
11ea0 73 20 26 20 46 54 53 35 49 4e 44 45 58 5f 51 55  s & FTS5INDEX_QU
11eb0 45 52 59 5f 44 45 53 43 20 29 7b 0a 20 20 20 20  ERY_DESC ){.    
11ec0 20 20 20 20 66 74 73 35 53 65 67 49 74 65 72 52      fts5SegIterR
11ed0 65 76 65 72 73 65 28 70 2c 20 70 49 74 65 72 29  everse(p, pIter)
11ee0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
11ef0 20 20 7d 0a 0a 20 20 66 74 73 35 53 65 67 49 74    }..  fts5SegIt
11f00 65 72 53 65 74 4e 65 78 74 28 70 2c 20 70 49 74  erSetNext(p, pIt
11f10 65 72 29 3b 0a 0a 20 20 2f 2a 20 45 69 74 68 65  er);..  /* Eithe
11f20 72 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 31  r:.  **.  **   1
11f30 29 20 61 6e 20 65 72 72 6f 72 20 68 61 73 20 6f  ) an error has o
11f40 63 63 75 72 72 65 64 2c 20 6f 72 0a 20 20 2a 2a  ccurred, or.  **
11f50 20 20 20 32 29 20 74 68 65 20 69 74 65 72 61 74     2) the iterat
11f60 6f 72 20 70 6f 69 6e 74 73 20 74 6f 20 45 4f 46  or points to EOF
11f70 2c 20 6f 72 0a 20 20 2a 2a 20 20 20 33 29 20 74  , or.  **   3) t
11f80 68 65 20 69 74 65 72 61 74 6f 72 20 70 6f 69 6e  he iterator poin
11f90 74 73 20 74 6f 20 61 6e 20 65 6e 74 72 79 20 77  ts to an entry w
11fa0 69 74 68 20 74 65 72 6d 20 28 70 54 65 72 6d 2f  ith term (pTerm/
11fb0 6e 54 65 72 6d 29 2c 20 6f 72 0a 20 20 2a 2a 20  nTerm), or.  ** 
11fc0 20 20 34 29 20 74 68 65 20 46 54 53 35 49 4e 44    4) the FTS5IND
11fd0 45 58 5f 51 55 45 52 59 5f 53 43 41 4e 20 66 6c  EX_QUERY_SCAN fl
11fe0 61 67 20 77 61 73 20 73 65 74 20 61 6e 64 20 74  ag was set and t
11ff0 68 65 20 69 74 65 72 61 74 6f 72 20 70 6f 69 6e  he iterator poin
12000 74 73 0a 20 20 2a 2a 20 20 20 20 20 20 74 6f 20  ts.  **      to 
12010 61 6e 20 65 6e 74 72 79 20 77 69 74 68 20 61 20  an entry with a 
12020 74 65 72 6d 20 67 72 65 61 74 65 72 20 74 68 61  term greater tha
12030 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 28 70  n or equal to (p
12040 54 65 72 6d 2f 6e 54 65 72 6d 29 2e 0a 20 20 2a  Term/nTerm)..  *
12050 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72  /.  assert( p->r
12060 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 20 20 20  c!=SQLITE_OK    
12070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12090 20 20 20 20 20 20 2f 2a 20 31 20 2a 2f 0a 20 20        /* 1 */.  
120a0 20 7c 7c 20 70 49 74 65 72 2d 3e 70 4c 65 61 66   || pIter->pLeaf
120b0 3d 3d 30 20 20 20 20 20 20 20 20 20 20 20 20 20  ==0             
120c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
120d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
120e0 20 20 2f 2a 20 32 20 2a 2f 0a 20 20 20 7c 7c 20    /* 2 */.   || 
120f0 66 74 73 35 42 75 66 66 65 72 43 6f 6d 70 61 72  fts5BufferCompar
12100 65 42 6c 6f 62 28 26 70 49 74 65 72 2d 3e 74 65  eBlob(&pIter->te
12110 72 6d 2c 20 70 54 65 72 6d 2c 20 6e 54 65 72 6d  rm, pTerm, nTerm
12120 29 3d 3d 30 20 20 20 20 20 20 20 20 20 20 2f 2a  )==0          /*
12130 20 33 20 2a 2f 0a 20 20 20 7c 7c 20 28 62 47 65   3 */.   || (bGe
12140 20 26 26 20 66 74 73 35 42 75 66 66 65 72 43 6f   && fts5BufferCo
12150 6d 70 61 72 65 42 6c 6f 62 28 26 70 49 74 65 72  mpareBlob(&pIter
12160 2d 3e 74 65 72 6d 2c 20 70 54 65 72 6d 2c 20 6e  ->term, pTerm, n
12170 54 65 72 6d 29 3e 30 29 20 20 2f 2a 20 34 20 2a  Term)>0)  /* 4 *
12180 2f 0a 20 20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  /.  );.}../*.** 
12190 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 6f  Initialize the o
121a0 62 6a 65 63 74 20 70 49 74 65 72 20 74 6f 20 70  bject pIter to p
121b0 6f 69 6e 74 20 74 6f 20 74 65 72 6d 20 70 54 65  oint to term pTe
121c0 72 6d 2f 6e 54 65 72 6d 20 77 69 74 68 69 6e 20  rm/nTerm within 
121d0 74 68 65 0a 2a 2a 20 69 6e 2d 6d 65 6d 6f 72 79  the.** in-memory
121e0 20 68 61 73 68 20 74 61 62 6c 65 2e 20 49 66 20   hash table. If 
121f0 74 68 65 72 65 20 69 73 20 6e 6f 20 73 75 63 68  there is no such
12200 20 74 65 72 6d 20 69 6e 20 74 68 65 20 68 61 73   term in the has
12210 68 2d 74 61 62 6c 65 2c 20 74 68 65 20 0a 2a 2a  h-table, the .**
12220 20 69 74 65 72 61 74 6f 72 20 69 73 20 73 65 74   iterator is set
12230 20 74 6f 20 45 4f 46 2e 0a 2a 2a 0a 2a 2a 20 49   to EOF..**.** I
12240 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
12250 73 2c 20 46 74 73 35 49 6e 64 65 78 2e 72 63 20  s, Fts5Index.rc 
12260 69 73 20 73 65 74 20 74 6f 20 61 6e 20 61 70 70  is set to an app
12270 72 6f 70 72 69 61 74 65 20 65 72 72 6f 72 20 63  ropriate error c
12280 6f 64 65 2e 20 49 66 20 0a 2a 2a 20 61 6e 20 65  ode. If .** an e
12290 72 72 6f 72 20 68 61 73 20 61 6c 72 65 61 64 79  rror has already
122a0 20 6f 63 63 75 72 72 65 64 20 77 68 65 6e 20 74   occurred when t
122b0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
122c0 63 61 6c 6c 65 64 2c 20 69 74 20 69 73 20 61 20  called, it is a 
122d0 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63  no-op..*/.static
122e0 20 76 6f 69 64 20 66 74 73 35 53 65 67 49 74 65   void fts5SegIte
122f0 72 48 61 73 68 49 6e 69 74 28 0a 20 20 46 74 73  rHashInit(.  Fts
12300 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20  5Index *p,      
12310 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
12320 46 54 53 35 20 62 61 63 6b 65 6e 64 20 2a 2f 0a  FTS5 backend */.
12330 20 20 63 6f 6e 73 74 20 75 38 20 2a 70 54 65 72    const u8 *pTer
12340 6d 2c 20 69 6e 74 20 6e 54 65 72 6d 2c 20 20 20  m, int nTerm,   
12350 20 20 2f 2a 20 54 65 72 6d 20 74 6f 20 73 65 65    /* Term to see
12360 6b 20 74 6f 20 2a 2f 0a 20 20 69 6e 74 20 66 6c  k to */.  int fl
12370 61 67 73 2c 20 20 20 20 20 20 20 20 20 20 20 20  ags,            
12380 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73            /* Mas
12390 6b 20 6f 66 20 46 54 53 35 49 4e 44 45 58 5f 58  k of FTS5INDEX_X
123a0 58 58 20 66 6c 61 67 73 20 2a 2f 0a 20 20 46 74  XX flags */.  Ft
123b0 73 35 53 65 67 49 74 65 72 20 2a 70 49 74 65 72  s5SegIter *pIter
123c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
123d0 20 4f 62 6a 65 63 74 20 74 6f 20 70 6f 70 75 6c   Object to popul
123e0 61 74 65 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73  ate */.){.  cons
123f0 74 20 75 38 20 2a 70 4c 69 73 74 20 3d 20 30 3b  t u8 *pList = 0;
12400 0a 20 20 69 6e 74 20 6e 4c 69 73 74 20 3d 20 30  .  int nList = 0
12410 3b 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 7a 20  ;.  const u8 *z 
12420 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 20 3d 20 30  = 0;.  int n = 0
12430 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  ;..  assert( p->
12440 70 48 61 73 68 20 29 3b 0a 20 20 61 73 73 65 72  pHash );.  asser
12450 74 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  t( p->rc==SQLITE
12460 5f 4f 4b 20 29 3b 0a 0a 20 20 69 66 28 20 70 54  _OK );..  if( pT
12470 65 72 6d 3d 3d 30 20 7c 7c 20 28 66 6c 61 67 73  erm==0 || (flags
12480 20 26 20 46 54 53 35 49 4e 44 45 58 5f 51 55 45   & FTS5INDEX_QUE
12490 52 59 5f 53 43 41 4e 29 20 29 7b 0a 20 20 20 20  RY_SCAN) ){.    
124a0 70 2d 3e 72 63 20 3d 20 73 71 6c 69 74 65 33 46  p->rc = sqlite3F
124b0 74 73 35 48 61 73 68 53 63 61 6e 49 6e 69 74 28  ts5HashScanInit(
124c0 70 2d 3e 70 48 61 73 68 2c 20 28 63 6f 6e 73 74  p->pHash, (const
124d0 20 63 68 61 72 2a 29 70 54 65 72 6d 2c 20 6e 54   char*)pTerm, nT
124e0 65 72 6d 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  erm);.    sqlite
124f0 33 46 74 73 35 48 61 73 68 53 63 61 6e 45 6e 74  3Fts5HashScanEnt
12500 72 79 28 70 2d 3e 70 48 61 73 68 2c 20 28 63 6f  ry(p->pHash, (co
12510 6e 73 74 20 63 68 61 72 2a 2a 29 26 7a 2c 20 26  nst char**)&z, &
12520 70 4c 69 73 74 2c 20 26 6e 4c 69 73 74 29 3b 0a  pList, &nList);.
12530 20 20 20 20 6e 20 3d 20 28 7a 20 3f 20 28 69 6e      n = (z ? (in
12540 74 29 73 74 72 6c 65 6e 28 28 63 6f 6e 73 74 20  t)strlen((const 
12550 63 68 61 72 2a 29 7a 29 20 3a 20 30 29 3b 0a 20  char*)z) : 0);. 
12560 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 49 74 65   }else{.    pIte
12570 72 2d 3e 66 6c 61 67 73 20 7c 3d 20 46 54 53 35  r->flags |= FTS5
12580 5f 53 45 47 49 54 45 52 5f 4f 4e 45 54 45 52 4d  _SEGITER_ONETERM
12590 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 46 74 73  ;.    sqlite3Fts
125a0 35 48 61 73 68 51 75 65 72 79 28 70 2d 3e 70 48  5HashQuery(p->pH
125b0 61 73 68 2c 20 28 63 6f 6e 73 74 20 63 68 61 72  ash, (const char
125c0 2a 29 70 54 65 72 6d 2c 20 6e 54 65 72 6d 2c 20  *)pTerm, nTerm, 
125d0 26 70 4c 69 73 74 2c 20 26 6e 4c 69 73 74 29 3b  &pList, &nList);
125e0 0a 20 20 20 20 7a 20 3d 20 70 54 65 72 6d 3b 0a  .    z = pTerm;.
125f0 20 20 20 20 6e 20 3d 20 6e 54 65 72 6d 3b 0a 20      n = nTerm;. 
12600 20 7d 0a 0a 20 20 69 66 28 20 70 4c 69 73 74 20   }..  if( pList 
12610 29 7b 0a 20 20 20 20 46 74 73 35 44 61 74 61 20  ){.    Fts5Data 
12620 2a 70 4c 65 61 66 3b 0a 20 20 20 20 73 71 6c 69  *pLeaf;.    sqli
12630 74 65 33 46 74 73 35 42 75 66 66 65 72 53 65 74  te3Fts5BufferSet
12640 28 26 70 2d 3e 72 63 2c 20 26 70 49 74 65 72 2d  (&p->rc, &pIter-
12650 3e 74 65 72 6d 2c 20 6e 2c 20 7a 29 3b 0a 20 20  >term, n, z);.  
12660 20 20 70 4c 65 61 66 20 3d 20 66 74 73 35 49 64    pLeaf = fts5Id
12670 78 4d 61 6c 6c 6f 63 28 70 2c 20 73 69 7a 65 6f  xMalloc(p, sizeo
12680 66 28 46 74 73 35 44 61 74 61 29 29 3b 0a 20 20  f(Fts5Data));.  
12690 20 20 69 66 28 20 70 4c 65 61 66 3d 3d 30 20 29    if( pLeaf==0 )
126a0 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 70 4c 65   return;.    pLe
126b0 61 66 2d 3e 70 20 3d 20 28 75 38 2a 29 70 4c 69  af->p = (u8*)pLi
126c0 73 74 3b 0a 20 20 20 20 70 4c 65 61 66 2d 3e 6e  st;.    pLeaf->n
126d0 6e 20 3d 20 70 4c 65 61 66 2d 3e 73 7a 4c 65 61  n = pLeaf->szLea
126e0 66 20 3d 20 6e 4c 69 73 74 3b 0a 20 20 20 20 70  f = nList;.    p
126f0 49 74 65 72 2d 3e 70 4c 65 61 66 20 3d 20 70 4c  Iter->pLeaf = pL
12700 65 61 66 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e  eaf;.    pIter->
12710 69 4c 65 61 66 4f 66 66 73 65 74 20 3d 20 66 74  iLeafOffset = ft
12720 73 35 47 65 74 56 61 72 69 6e 74 28 70 4c 65 61  s5GetVarint(pLea
12730 66 2d 3e 70 2c 20 28 75 36 34 2a 29 26 70 49 74  f->p, (u64*)&pIt
12740 65 72 2d 3e 69 52 6f 77 69 64 29 3b 0a 20 20 20  er->iRowid);.   
12750 20 70 49 74 65 72 2d 3e 69 45 6e 64 6f 66 44 6f   pIter->iEndofDo
12760 63 6c 69 73 74 20 3d 20 70 4c 65 61 66 2d 3e 6e  clist = pLeaf->n
12770 6e 3b 0a 0a 20 20 20 20 69 66 28 20 66 6c 61 67  n;..    if( flag
12780 73 20 26 20 46 54 53 35 49 4e 44 45 58 5f 51 55  s & FTS5INDEX_QU
12790 45 52 59 5f 44 45 53 43 20 29 7b 0a 20 20 20 20  ERY_DESC ){.    
127a0 20 20 70 49 74 65 72 2d 3e 66 6c 61 67 73 20 7c    pIter->flags |
127b0 3d 20 46 54 53 35 5f 53 45 47 49 54 45 52 5f 52  = FTS5_SEGITER_R
127c0 45 56 45 52 53 45 3b 0a 20 20 20 20 20 20 66 74  EVERSE;.      ft
127d0 73 35 53 65 67 49 74 65 72 52 65 76 65 72 73 65  s5SegIterReverse
127e0 49 6e 69 74 50 61 67 65 28 70 2c 20 70 49 74 65  InitPage(p, pIte
127f0 72 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  r);.    }else{. 
12800 20 20 20 20 20 66 74 73 35 53 65 67 49 74 65 72       fts5SegIter
12810 4c 6f 61 64 4e 50 6f 73 28 70 2c 20 70 49 74 65  LoadNPos(p, pIte
12820 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  r);.    }.  }.. 
12830 20 66 74 73 35 53 65 67 49 74 65 72 53 65 74 4e   fts5SegIterSetN
12840 65 78 74 28 70 2c 20 70 49 74 65 72 29 3b 0a 7d  ext(p, pIter);.}
12850 0a 0a 2f 2a 0a 2a 2a 20 5a 65 72 6f 20 74 68 65  ../*.** Zero the
12860 20 69 74 65 72 61 74 6f 72 20 70 61 73 73 65 64   iterator passed
12870 20 61 73 20 74 68 65 20 6f 6e 6c 79 20 61 72 67   as the only arg
12880 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  ument..*/.static
12890 20 76 6f 69 64 20 66 74 73 35 53 65 67 49 74 65   void fts5SegIte
128a0 72 43 6c 65 61 72 28 46 74 73 35 53 65 67 49 74  rClear(Fts5SegIt
128b0 65 72 20 2a 70 49 74 65 72 29 7b 0a 20 20 66 74  er *pIter){.  ft
128c0 73 35 42 75 66 66 65 72 46 72 65 65 28 26 70 49  s5BufferFree(&pI
128d0 74 65 72 2d 3e 74 65 72 6d 29 3b 0a 20 20 66 74  ter->term);.  ft
128e0 73 35 44 61 74 61 52 65 6c 65 61 73 65 28 70 49  s5DataRelease(pI
128f0 74 65 72 2d 3e 70 4c 65 61 66 29 3b 0a 20 20 66  ter->pLeaf);.  f
12900 74 73 35 44 61 74 61 52 65 6c 65 61 73 65 28 70  ts5DataRelease(p
12910 49 74 65 72 2d 3e 70 4e 65 78 74 4c 65 61 66 29  Iter->pNextLeaf)
12920 3b 0a 20 20 66 74 73 35 44 6c 69 64 78 49 74 65  ;.  fts5DlidxIte
12930 72 46 72 65 65 28 70 49 74 65 72 2d 3e 70 44 6c  rFree(pIter->pDl
12940 69 64 78 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  idx);.  sqlite3_
12950 66 72 65 65 28 70 49 74 65 72 2d 3e 61 52 6f 77  free(pIter->aRow
12960 69 64 4f 66 66 73 65 74 29 3b 0a 20 20 6d 65 6d  idOffset);.  mem
12970 73 65 74 28 70 49 74 65 72 2c 20 30 2c 20 73 69  set(pIter, 0, si
12980 7a 65 6f 66 28 46 74 73 35 53 65 67 49 74 65 72  zeof(Fts5SegIter
12990 29 29 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51  ));.}..#ifdef SQ
129a0 4c 49 54 45 5f 44 45 42 55 47 0a 0a 2f 2a 0a 2a  LITE_DEBUG../*.*
129b0 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
129c0 69 73 20 75 73 65 64 20 61 73 20 70 61 72 74 20  is used as part 
129d0 6f 66 20 74 68 65 20 62 69 67 20 61 73 73 65 72  of the big asser
129e0 74 28 29 20 70 72 6f 63 65 64 75 72 65 20 69 6d  t() procedure im
129f0 70 6c 65 6d 65 6e 74 65 64 20 62 79 0a 2a 2a 20  plemented by.** 
12a00 66 74 73 35 41 73 73 65 72 74 4d 75 6c 74 69 49  fts5AssertMultiI
12a10 74 65 72 53 65 74 75 70 28 29 2e 20 49 74 20 65  terSetup(). It e
12a20 6e 73 75 72 65 73 20 74 68 61 74 20 74 68 65 20  nsures that the 
12a30 72 65 73 75 6c 74 20 63 75 72 72 65 6e 74 6c 79  result currently
12a40 20 73 74 6f 72 65 64 0a 2a 2a 20 69 6e 20 2a 70   stored.** in *p
12a50 52 65 73 20 69 73 20 74 68 65 20 63 6f 72 72 65  Res is the corre
12a60 63 74 20 72 65 73 75 6c 74 20 6f 66 20 63 6f 6d  ct result of com
12a70 70 61 72 69 6e 67 20 74 68 65 20 63 75 72 72 65  paring the curre
12a80 6e 74 20 70 6f 73 69 74 69 6f 6e 73 20 6f 66 20  nt positions of 
12a90 74 68 65 0a 2a 2a 20 74 77 6f 20 69 74 65 72 61  the.** two itera
12aa0 74 6f 72 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tors..*/.static 
12ab0 76 6f 69 64 20 66 74 73 35 41 73 73 65 72 74 43  void fts5AssertC
12ac0 6f 6d 70 61 72 69 73 6f 6e 52 65 73 75 6c 74 28  omparisonResult(
12ad0 0a 20 20 46 74 73 35 49 74 65 72 20 2a 70 49 74  .  Fts5Iter *pIt
12ae0 65 72 2c 20 0a 20 20 46 74 73 35 53 65 67 49 74  er, .  Fts5SegIt
12af0 65 72 20 2a 70 31 2c 0a 20 20 46 74 73 35 53 65  er *p1,.  Fts5Se
12b00 67 49 74 65 72 20 2a 70 32 2c 0a 20 20 46 74 73  gIter *p2,.  Fts
12b10 35 43 52 65 73 75 6c 74 20 2a 70 52 65 73 0a 29  5CResult *pRes.)
12b20 7b 0a 20 20 69 6e 74 20 69 31 20 3d 20 70 31 20  {.  int i1 = p1 
12b30 2d 20 70 49 74 65 72 2d 3e 61 53 65 67 3b 0a 20  - pIter->aSeg;. 
12b40 20 69 6e 74 20 69 32 20 3d 20 70 32 20 2d 20 70   int i2 = p2 - p
12b50 49 74 65 72 2d 3e 61 53 65 67 3b 0a 0a 20 20 69  Iter->aSeg;..  i
12b60 66 28 20 70 31 2d 3e 70 4c 65 61 66 20 7c 7c 20  f( p1->pLeaf || 
12b70 70 32 2d 3e 70 4c 65 61 66 20 29 7b 0a 20 20 20  p2->pLeaf ){.   
12b80 20 69 66 28 20 70 31 2d 3e 70 4c 65 61 66 3d 3d   if( p1->pLeaf==
12b90 30 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  0 ){.      asser
12ba0 74 28 20 70 52 65 73 2d 3e 69 46 69 72 73 74 3d  t( pRes->iFirst=
12bb0 3d 69 32 20 29 3b 0a 20 20 20 20 7d 65 6c 73 65  =i2 );.    }else
12bc0 20 69 66 28 20 70 32 2d 3e 70 4c 65 61 66 3d 3d   if( p2->pLeaf==
12bd0 30 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  0 ){.      asser
12be0 74 28 20 70 52 65 73 2d 3e 69 46 69 72 73 74 3d  t( pRes->iFirst=
12bf0 3d 69 31 20 29 3b 0a 20 20 20 20 7d 65 6c 73 65  =i1 );.    }else
12c00 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 4d 69 6e  {.      int nMin
12c10 20 3d 20 4d 49 4e 28 70 31 2d 3e 74 65 72 6d 2e   = MIN(p1->term.
12c20 6e 2c 20 70 32 2d 3e 74 65 72 6d 2e 6e 29 3b 0a  n, p2->term.n);.
12c30 20 20 20 20 20 20 69 6e 74 20 72 65 73 20 3d 20        int res = 
12c40 6d 65 6d 63 6d 70 28 70 31 2d 3e 74 65 72 6d 2e  memcmp(p1->term.
12c50 70 2c 20 70 32 2d 3e 74 65 72 6d 2e 70 2c 20 6e  p, p2->term.p, n
12c60 4d 69 6e 29 3b 0a 20 20 20 20 20 20 69 66 28 20  Min);.      if( 
12c70 72 65 73 3d 3d 30 20 29 20 72 65 73 20 3d 20 70  res==0 ) res = p
12c80 31 2d 3e 74 65 72 6d 2e 6e 20 2d 20 70 32 2d 3e  1->term.n - p2->
12c90 74 65 72 6d 2e 6e 3b 0a 0a 20 20 20 20 20 20 69  term.n;..      i
12ca0 66 28 20 72 65 73 3d 3d 30 20 29 7b 0a 20 20 20  f( res==0 ){.   
12cb0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 52 65       assert( pRe
12cc0 73 2d 3e 62 54 65 72 6d 45 71 3d 3d 31 20 29 3b  s->bTermEq==1 );
12cd0 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
12ce0 20 70 31 2d 3e 69 52 6f 77 69 64 21 3d 70 32 2d   p1->iRowid!=p2-
12cf0 3e 69 52 6f 77 69 64 20 29 3b 0a 20 20 20 20 20  >iRowid );.     
12d00 20 20 20 72 65 73 20 3d 20 28 28 70 31 2d 3e 69     res = ((p1->i
12d10 52 6f 77 69 64 20 3e 20 70 32 2d 3e 69 52 6f 77  Rowid > p2->iRow
12d20 69 64 29 3d 3d 70 49 74 65 72 2d 3e 62 52 65 76  id)==pIter->bRev
12d30 29 20 3f 20 2d 31 20 3a 20 31 3b 0a 20 20 20 20  ) ? -1 : 1;.    
12d40 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
12d50 20 61 73 73 65 72 74 28 20 70 52 65 73 2d 3e 62   assert( pRes->b
12d60 54 65 72 6d 45 71 3d 3d 30 20 29 3b 0a 20 20 20  TermEq==0 );.   
12d70 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20     }..      if( 
12d80 72 65 73 3c 30 20 29 7b 0a 20 20 20 20 20 20 20  res<0 ){.       
12d90 20 61 73 73 65 72 74 28 20 70 52 65 73 2d 3e 69   assert( pRes->i
12da0 46 69 72 73 74 3d 3d 69 31 20 29 3b 0a 20 20 20  First==i1 );.   
12db0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
12dc0 20 20 61 73 73 65 72 74 28 20 70 52 65 73 2d 3e    assert( pRes->
12dd0 69 46 69 72 73 74 3d 3d 69 32 20 29 3b 0a 20 20  iFirst==i2 );.  
12de0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
12df0 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
12e00 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f  nction is a no-o
12e10 70 20 75 6e 6c 65 73 73 20 53 51 4c 49 54 45 5f  p unless SQLITE_
12e20 44 45 42 55 47 20 69 73 20 64 65 66 69 6e 65 64  DEBUG is defined
12e30 20 77 68 65 6e 20 74 68 69 73 20 6d 6f 64 75 6c   when this modul
12e40 65 0a 2a 2a 20 69 73 20 63 6f 6d 70 69 6c 65 64  e.** is compiled
12e50 2e 20 49 6e 20 74 68 61 74 20 63 61 73 65 2c 20  . In that case, 
12e60 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
12e70 20 65 73 73 65 6e 74 69 61 6c 6c 79 20 61 6e 20   essentially an 
12e80 61 73 73 65 72 74 28 29 20 0a 2a 2a 20 73 74 61  assert() .** sta
12e90 74 65 6d 65 6e 74 20 75 73 65 64 20 74 6f 20 76  tement used to v
12ea0 65 72 69 66 79 20 74 68 61 74 20 74 68 65 20 63  erify that the c
12eb0 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70  ontents of the p
12ec0 49 74 65 72 2d 3e 61 46 69 72 73 74 5b 5d 20 61  Iter->aFirst[] a
12ed0 72 72 61 79 0a 2a 2a 20 61 72 65 20 63 6f 72 72  rray.** are corr
12ee0 65 63 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ect..*/.static v
12ef0 6f 69 64 20 66 74 73 35 41 73 73 65 72 74 4d 75  oid fts5AssertMu
12f00 6c 74 69 49 74 65 72 53 65 74 75 70 28 46 74 73  ltiIterSetup(Fts
12f10 35 49 6e 64 65 78 20 2a 70 2c 20 46 74 73 35 49  5Index *p, Fts5I
12f20 74 65 72 20 2a 70 49 74 65 72 29 7b 0a 20 20 69  ter *pIter){.  i
12f30 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  f( p->rc==SQLITE
12f40 5f 4f 4b 20 29 7b 0a 20 20 20 20 46 74 73 35 53  _OK ){.    Fts5S
12f50 65 67 49 74 65 72 20 2a 70 46 69 72 73 74 20 3d  egIter *pFirst =
12f60 20 26 70 49 74 65 72 2d 3e 61 53 65 67 5b 20 70   &pIter->aSeg[ p
12f70 49 74 65 72 2d 3e 61 46 69 72 73 74 5b 31 5d 2e  Iter->aFirst[1].
12f80 69 46 69 72 73 74 20 5d 3b 0a 20 20 20 20 69 6e  iFirst ];.    in
12f90 74 20 69 3b 0a 0a 20 20 20 20 61 73 73 65 72 74  t i;..    assert
12fa0 28 20 28 70 46 69 72 73 74 2d 3e 70 4c 65 61 66  ( (pFirst->pLeaf
12fb0 3d 3d 30 29 3d 3d 70 49 74 65 72 2d 3e 62 61 73  ==0)==pIter->bas
12fc0 65 2e 62 45 6f 66 20 29 3b 0a 0a 20 20 20 20 2f  e.bEof );..    /
12fd0 2a 20 43 68 65 63 6b 20 74 68 61 74 20 70 49 74  * Check that pIt
12fe0 65 72 2d 3e 69 53 77 69 74 63 68 52 6f 77 69 64  er->iSwitchRowid
12ff0 20 69 73 20 73 65 74 20 63 6f 72 72 65 63 74 6c   is set correctl
13000 79 2e 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d  y. */.    for(i=
13010 30 3b 20 69 3c 70 49 74 65 72 2d 3e 6e 53 65 67  0; i<pIter->nSeg
13020 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 46 74  ; i++){.      Ft
13030 73 35 53 65 67 49 74 65 72 20 2a 70 31 20 3d 20  s5SegIter *p1 = 
13040 26 70 49 74 65 72 2d 3e 61 53 65 67 5b 69 5d 3b  &pIter->aSeg[i];
13050 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
13060 31 3d 3d 70 46 69 72 73 74 20 0a 20 20 20 20 20  1==pFirst .     
13070 20 20 20 20 20 20 7c 7c 20 70 31 2d 3e 70 4c 65        || p1->pLe
13080 61 66 3d 3d 30 20 0a 20 20 20 20 20 20 20 20 20  af==0 .         
13090 20 20 7c 7c 20 66 74 73 35 42 75 66 66 65 72 43    || fts5BufferC
130a0 6f 6d 70 61 72 65 28 26 70 46 69 72 73 74 2d 3e  ompare(&pFirst->
130b0 74 65 72 6d 2c 20 26 70 31 2d 3e 74 65 72 6d 29  term, &p1->term)
130c0 20 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20   .           || 
130d0 70 31 2d 3e 69 52 6f 77 69 64 3d 3d 70 49 74 65  p1->iRowid==pIte
130e0 72 2d 3e 69 53 77 69 74 63 68 52 6f 77 69 64 0a  r->iSwitchRowid.
130f0 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 28 70             || (p
13100 31 2d 3e 69 52 6f 77 69 64 3c 70 49 74 65 72 2d  1->iRowid<pIter-
13110 3e 69 53 77 69 74 63 68 52 6f 77 69 64 29 3d 3d  >iSwitchRowid)==
13120 70 49 74 65 72 2d 3e 62 52 65 76 0a 20 20 20 20  pIter->bRev.    
13130 20 20 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20    );.    }..    
13140 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49 74 65 72  for(i=0; i<pIter
13150 2d 3e 6e 53 65 67 3b 20 69 2b 3d 32 29 7b 0a 20  ->nSeg; i+=2){. 
13160 20 20 20 20 20 46 74 73 35 53 65 67 49 74 65 72       Fts5SegIter
13170 20 2a 70 31 20 3d 20 26 70 49 74 65 72 2d 3e 61   *p1 = &pIter->a
13180 53 65 67 5b 69 5d 3b 0a 20 20 20 20 20 20 46 74  Seg[i];.      Ft
13190 73 35 53 65 67 49 74 65 72 20 2a 70 32 20 3d 20  s5SegIter *p2 = 
131a0 26 70 49 74 65 72 2d 3e 61 53 65 67 5b 69 2b 31  &pIter->aSeg[i+1
131b0 5d 3b 0a 20 20 20 20 20 20 46 74 73 35 43 52 65  ];.      Fts5CRe
131c0 73 75 6c 74 20 2a 70 52 65 73 20 3d 20 26 70 49  sult *pRes = &pI
131d0 74 65 72 2d 3e 61 46 69 72 73 74 5b 28 70 49 74  ter->aFirst[(pIt
131e0 65 72 2d 3e 6e 53 65 67 20 2b 20 69 29 20 2f 20  er->nSeg + i) / 
131f0 32 5d 3b 0a 20 20 20 20 20 20 66 74 73 35 41 73  2];.      fts5As
13200 73 65 72 74 43 6f 6d 70 61 72 69 73 6f 6e 52 65  sertComparisonRe
13210 73 75 6c 74 28 70 49 74 65 72 2c 20 70 31 2c 20  sult(pIter, p1, 
13220 70 32 2c 20 70 52 65 73 29 3b 0a 20 20 20 20 7d  p2, pRes);.    }
13230 0a 0a 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 69  ..    for(i=1; i
13240 3c 28 70 49 74 65 72 2d 3e 6e 53 65 67 20 2f 20  <(pIter->nSeg / 
13250 32 29 3b 20 69 2b 3d 32 29 7b 0a 20 20 20 20 20  2); i+=2){.     
13260 20 46 74 73 35 53 65 67 49 74 65 72 20 2a 70 31   Fts5SegIter *p1
13270 20 3d 20 26 70 49 74 65 72 2d 3e 61 53 65 67 5b   = &pIter->aSeg[
13280 20 70 49 74 65 72 2d 3e 61 46 69 72 73 74 5b 69   pIter->aFirst[i
13290 2a 32 5d 2e 69 46 69 72 73 74 20 5d 3b 0a 20 20  *2].iFirst ];.  
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 20 70 49 74 65 72 2d 3e 61 46 69 72 73  eg[ pIter->aFirs
132d0 74 5b 69 2a 32 2b 31 5d 2e 69 46 69 72 73 74 20  t[i*2+1].iFirst 
132e0 5d 3b 0a 20 20 20 20 20 20 46 74 73 35 43 52 65  ];.      Fts5CRe
132f0 73 75 6c 74 20 2a 70 52 65 73 20 3d 20 26 70 49  sult *pRes = &pI
13300 74 65 72 2d 3e 61 46 69 72 73 74 5b 69 5d 3b 0a  ter->aFirst[i];.
13310 20 20 20 20 20 20 66 74 73 35 41 73 73 65 72 74        fts5Assert
13320 43 6f 6d 70 61 72 69 73 6f 6e 52 65 73 75 6c 74  ComparisonResult
13330 28 70 49 74 65 72 2c 20 70 31 2c 20 70 32 2c 20  (pIter, p1, p2, 
13340 70 52 65 73 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  pRes);.    }.  }
13350 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e  .}.#else.# defin
13360 65 20 66 74 73 35 41 73 73 65 72 74 4d 75 6c 74  e fts5AssertMult
13370 69 49 74 65 72 53 65 74 75 70 28 78 2c 79 29 0a  iIterSetup(x,y).
13380 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 44 6f  #endif../*.** Do
13390 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20   the comparison 
133a0 6e 65 63 65 73 73 61 72 79 20 74 6f 20 70 6f 70  necessary to pop
133b0 75 6c 61 74 65 20 70 49 74 65 72 2d 3e 61 46 69  ulate pIter->aFi
133c0 72 73 74 5b 69 4f 75 74 5d 2e 0a 2a 2a 0a 2a 2a  rst[iOut]..**.**
133d0 20 49 66 20 74 68 65 20 72 65 74 75 72 6e 65 64   If the returned
133e0 20 76 61 6c 75 65 20 69 73 20 6e 6f 6e 2d 7a 65   value is non-ze
133f0 72 6f 2c 20 74 68 65 6e 20 69 74 20 69 73 20 74  ro, then it is t
13400 68 65 20 69 6e 64 65 78 20 6f 66 20 61 6e 20 65  he index of an e
13410 6e 74 72 79 0a 2a 2a 20 69 6e 20 74 68 65 20 70  ntry.** in the p
13420 49 74 65 72 2d 3e 61 53 65 67 5b 5d 20 61 72 72  Iter->aSeg[] arr
13430 61 79 20 74 68 61 74 20 69 73 20 28 61 29 20 6e  ay that is (a) n
13440 6f 74 20 61 74 20 45 4f 46 2c 20 61 6e 64 20 28  ot at EOF, and (
13450 62 29 20 70 6f 69 6e 74 69 6e 67 0a 2a 2a 20 74  b) pointing.** t
13460 6f 20 61 20 6b 65 79 20 74 68 61 74 20 69 73 20  o a key that is 
13470 61 20 64 75 70 6c 69 63 61 74 65 20 6f 66 20 61  a duplicate of a
13480 6e 6f 74 68 65 72 2c 20 68 69 67 68 65 72 20 70  nother, higher p
13490 72 69 6f 72 69 74 79 2c 20 0a 2a 2a 20 73 65 67  riority, .** seg
134a0 6d 65 6e 74 2d 69 74 65 72 61 74 6f 72 20 69 6e  ment-iterator in
134b0 20 74 68 65 20 70 53 65 67 2d 3e 61 53 65 67 5b   the pSeg->aSeg[
134c0 5d 20 61 72 72 61 79 2e 0a 2a 2f 0a 73 74 61 74  ] array..*/.stat
134d0 69 63 20 69 6e 74 20 66 74 73 35 4d 75 6c 74 69  ic int fts5Multi
134e0 49 74 65 72 44 6f 43 6f 6d 70 61 72 65 28 46 74  IterDoCompare(Ft
134f0 73 35 49 74 65 72 20 2a 70 49 74 65 72 2c 20 69  s5Iter *pIter, i
13500 6e 74 20 69 4f 75 74 29 7b 0a 20 20 69 6e 74 20  nt iOut){.  int 
13510 69 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  i1;             
13520 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
13530 6e 64 65 78 20 6f 66 20 6c 65 66 74 2d 68 61 6e  ndex of left-han
13540 64 20 46 74 73 35 53 65 67 49 74 65 72 20 2a 2f  d Fts5SegIter */
13550 0a 20 20 69 6e 74 20 69 32 3b 20 20 20 20 20 20  .  int i2;      
13560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13570 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 72     /* Index of r
13580 69 67 68 74 2d 68 61 6e 64 20 46 74 73 35 53 65  ight-hand Fts5Se
13590 67 49 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 69  gIter */.  int i
135a0 52 65 73 3b 0a 20 20 46 74 73 35 53 65 67 49 74  Res;.  Fts5SegIt
135b0 65 72 20 2a 70 31 3b 20 20 20 20 20 20 20 20 20  er *p1;         
135c0 20 20 20 20 20 20 20 2f 2a 20 4c 65 66 74 2d 68         /* Left-h
135d0 61 6e 64 20 46 74 73 35 53 65 67 49 74 65 72 20  and Fts5SegIter 
135e0 2a 2f 0a 20 20 46 74 73 35 53 65 67 49 74 65 72  */.  Fts5SegIter
135f0 20 2a 70 32 3b 20 20 20 20 20 20 20 20 20 20 20   *p2;           
13600 20 20 20 20 20 2f 2a 20 52 69 67 68 74 2d 68 61       /* Right-ha
13610 6e 64 20 46 74 73 35 53 65 67 49 74 65 72 20 2a  nd Fts5SegIter *
13620 2f 0a 20 20 46 74 73 35 43 52 65 73 75 6c 74 20  /.  Fts5CResult 
13630 2a 70 52 65 73 20 3d 20 26 70 49 74 65 72 2d 3e  *pRes = &pIter->
13640 61 46 69 72 73 74 5b 69 4f 75 74 5d 3b 0a 0a 20  aFirst[iOut];.. 
13650 20 61 73 73 65 72 74 28 20 69 4f 75 74 3c 70 49   assert( iOut<pI
13660 74 65 72 2d 3e 6e 53 65 67 20 26 26 20 69 4f 75  ter->nSeg && iOu
13670 74 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  t>0 );.  assert(
13680 20 70 49 74 65 72 2d 3e 62 52 65 76 3d 3d 30 20   pIter->bRev==0 
13690 7c 7c 20 70 49 74 65 72 2d 3e 62 52 65 76 3d 3d  || pIter->bRev==
136a0 31 20 29 3b 0a 0a 20 20 69 66 28 20 69 4f 75 74  1 );..  if( iOut
136b0 3e 3d 28 70 49 74 65 72 2d 3e 6e 53 65 67 2f 32  >=(pIter->nSeg/2
136c0 29 20 29 7b 0a 20 20 20 20 69 31 20 3d 20 28 69  ) ){.    i1 = (i
136d0 4f 75 74 20 2d 20 70 49 74 65 72 2d 3e 6e 53 65  Out - pIter->nSe
136e0 67 2f 32 29 20 2a 20 32 3b 0a 20 20 20 20 69 32  g/2) * 2;.    i2
136f0 20 3d 20 69 31 20 2b 20 31 3b 0a 20 20 7d 65 6c   = i1 + 1;.  }el
13700 73 65 7b 0a 20 20 20 20 69 31 20 3d 20 70 49 74  se{.    i1 = pIt
13710 65 72 2d 3e 61 46 69 72 73 74 5b 69 4f 75 74 2a  er->aFirst[iOut*
13720 32 5d 2e 69 46 69 72 73 74 3b 0a 20 20 20 20 69  2].iFirst;.    i
13730 32 20 3d 20 70 49 74 65 72 2d 3e 61 46 69 72 73  2 = pIter->aFirs
13740 74 5b 69 4f 75 74 2a 32 2b 31 5d 2e 69 46 69 72  t[iOut*2+1].iFir
13750 73 74 3b 0a 20 20 7d 0a 20 20 70 31 20 3d 20 26  st;.  }.  p1 = &
13760 70 49 74 65 72 2d 3e 61 53 65 67 5b 69 31 5d 3b  pIter->aSeg[i1];
13770 0a 20 20 70 32 20 3d 20 26 70 49 74 65 72 2d 3e  .  p2 = &pIter->
13780 61 53 65 67 5b 69 32 5d 3b 0a 0a 20 20 70 52 65  aSeg[i2];..  pRe
13790 73 2d 3e 62 54 65 72 6d 45 71 20 3d 20 30 3b 0a  s->bTermEq = 0;.
137a0 20 20 69 66 28 20 70 31 2d 3e 70 4c 65 61 66 3d    if( p1->pLeaf=
137b0 3d 30 20 29 7b 20 20 20 20 20 20 20 20 20 20 20  =0 ){           
137c0 2f 2a 20 49 66 20 70 31 20 69 73 20 61 74 20 45  /* If p1 is at E
137d0 4f 46 20 2a 2f 0a 20 20 20 20 69 52 65 73 20 3d  OF */.    iRes =
137e0 20 69 32 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28   i2;.  }else if(
137f0 20 70 32 2d 3e 70 4c 65 61 66 3d 3d 30 20 29 7b   p2->pLeaf==0 ){
13800 20 20 20 20 20 2f 2a 20 49 66 20 70 32 20 69 73       /* If p2 is
13810 20 61 74 20 45 4f 46 20 2a 2f 0a 20 20 20 20 69   at EOF */.    i
13820 52 65 73 20 3d 20 69 31 3b 0a 20 20 7d 65 6c 73  Res = i1;.  }els
13830 65 7b 0a 20 20 20 20 69 6e 74 20 72 65 73 20 3d  e{.    int res =
13840 20 66 74 73 35 42 75 66 66 65 72 43 6f 6d 70 61   fts5BufferCompa
13850 72 65 28 26 70 31 2d 3e 74 65 72 6d 2c 20 26 70  re(&p1->term, &p
13860 32 2d 3e 74 65 72 6d 29 3b 0a 20 20 20 20 69 66  2->term);.    if
13870 28 20 72 65 73 3d 3d 30 20 29 7b 0a 20 20 20 20  ( res==0 ){.    
13880 20 20 61 73 73 65 72 74 28 20 69 32 3e 69 31 20    assert( i2>i1 
13890 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
138a0 20 69 32 21 3d 30 20 29 3b 0a 20 20 20 20 20 20   i2!=0 );.      
138b0 70 52 65 73 2d 3e 62 54 65 72 6d 45 71 20 3d 20  pRes->bTermEq = 
138c0 31 3b 0a 20 20 20 20 20 20 69 66 28 20 70 31 2d  1;.      if( p1-
138d0 3e 69 52 6f 77 69 64 3d 3d 70 32 2d 3e 69 52 6f  >iRowid==p2->iRo
138e0 77 69 64 20 29 7b 0a 20 20 20 20 20 20 20 20 70  wid ){.        p
138f0 31 2d 3e 62 44 65 6c 20 3d 20 70 32 2d 3e 62 44  1->bDel = p2->bD
13900 65 6c 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  el;.        retu
13910 72 6e 20 69 32 3b 0a 20 20 20 20 20 20 7d 0a 20  rn i2;.      }. 
13920 20 20 20 20 20 72 65 73 20 3d 20 28 28 70 31 2d       res = ((p1-
13930 3e 69 52 6f 77 69 64 20 3e 20 70 32 2d 3e 69 52  >iRowid > p2->iR
13940 6f 77 69 64 29 3d 3d 70 49 74 65 72 2d 3e 62 52  owid)==pIter->bR
13950 65 76 29 20 3f 20 2d 31 20 3a 20 2b 31 3b 0a 20  ev) ? -1 : +1;. 
13960 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28     }.    assert(
13970 20 72 65 73 21 3d 30 20 29 3b 0a 20 20 20 20 69   res!=0 );.    i
13980 66 28 20 72 65 73 3c 30 20 29 7b 0a 20 20 20 20  f( res<0 ){.    
13990 20 20 69 52 65 73 20 3d 20 69 31 3b 0a 20 20 20    iRes = i1;.   
139a0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 52   }else{.      iR
139b0 65 73 20 3d 20 69 32 3b 0a 20 20 20 20 7d 0a 20  es = i2;.    }. 
139c0 20 7d 0a 0a 20 20 70 52 65 73 2d 3e 69 46 69 72   }..  pRes->iFir
139d0 73 74 20 3d 20 28 75 31 36 29 69 52 65 73 3b 0a  st = (u16)iRes;.
139e0 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
139f0 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 73 65  *.** Move the se
13a00 67 2d 69 74 65 72 20 73 6f 20 74 68 61 74 20 69  g-iter so that i
13a10 74 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20  t points to the 
13a20 66 69 72 73 74 20 72 6f 77 69 64 20 6f 6e 20 70  first rowid on p
13a30 61 67 65 20 69 4c 65 61 66 50 67 6e 6f 2e 0a 2a  age iLeafPgno..*
13a40 2a 20 49 74 20 69 73 20 61 6e 20 65 72 72 6f 72  * It is an error
13a50 20 69 66 20 6c 65 61 66 20 69 4c 65 61 66 50 67   if leaf iLeafPg
13a60 6e 6f 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73  no does not exis
13a70 74 20 6f 72 20 63 6f 6e 74 61 69 6e 73 20 6e 6f  t or contains no
13a80 20 72 6f 77 69 64 73 2e 0a 2a 2f 0a 73 74 61 74   rowids..*/.stat
13a90 69 63 20 76 6f 69 64 20 66 74 73 35 53 65 67 49  ic void fts5SegI
13aa0 74 65 72 47 6f 74 6f 50 61 67 65 28 0a 20 20 46  terGotoPage(.  F
13ab0 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20  ts5Index *p,    
13ac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
13ad0 2a 20 46 54 53 35 20 62 61 63 6b 65 6e 64 20 6f  * FTS5 backend o
13ae0 62 6a 65 63 74 20 2a 2f 0a 20 20 46 74 73 35 53  bject */.  Fts5S
13af0 65 67 49 74 65 72 20 2a 70 49 74 65 72 2c 20 20  egIter *pIter,  
13b00 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 74             /* It
13b10 65 72 61 74 6f 72 20 74 6f 20 61 64 76 61 6e 63  erator to advanc
13b20 65 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 65 61 66  e */.  int iLeaf
13b30 50 67 6e 6f 0a 29 7b 0a 20 20 61 73 73 65 72 74  Pgno.){.  assert
13b40 28 20 69 4c 65 61 66 50 67 6e 6f 3e 70 49 74 65  ( iLeafPgno>pIte
13b50 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 20 29 3b 0a  r->iLeafPgno );.
13b60 0a 20 20 69 66 28 20 69 4c 65 61 66 50 67 6e 6f  .  if( iLeafPgno
13b70 3e 70 49 74 65 72 2d 3e 70 53 65 67 2d 3e 70 67  >pIter->pSeg->pg
13b80 6e 6f 4c 61 73 74 20 29 7b 0a 20 20 20 20 70 2d  noLast ){.    p-
13b90 3e 72 63 20 3d 20 46 54 53 35 5f 43 4f 52 52 55  >rc = FTS5_CORRU
13ba0 50 54 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  PT;.  }else{.   
13bb0 20 66 74 73 35 44 61 74 61 52 65 6c 65 61 73 65   fts5DataRelease
13bc0 28 70 49 74 65 72 2d 3e 70 4e 65 78 74 4c 65 61  (pIter->pNextLea
13bd0 66 29 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 70  f);.    pIter->p
13be0 4e 65 78 74 4c 65 61 66 20 3d 20 30 3b 0a 20 20  NextLeaf = 0;.  
13bf0 20 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 50 67    pIter->iLeafPg
13c00 6e 6f 20 3d 20 69 4c 65 61 66 50 67 6e 6f 2d 31  no = iLeafPgno-1
13c10 3b 0a 20 20 20 20 66 74 73 35 53 65 67 49 74 65  ;.    fts5SegIte
13c20 72 4e 65 78 74 50 61 67 65 28 70 2c 20 70 49 74  rNextPage(p, pIt
13c30 65 72 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  er);.    assert(
13c40 20 70 2d 3e 72 63 21 3d 53 51 4c 49 54 45 5f 4f   p->rc!=SQLITE_O
13c50 4b 20 7c 7c 20 70 49 74 65 72 2d 3e 69 4c 65 61  K || pIter->iLea
13c60 66 50 67 6e 6f 3d 3d 69 4c 65 61 66 50 67 6e 6f  fPgno==iLeafPgno
13c70 20 29 3b 0a 0a 20 20 20 20 69 66 28 20 70 2d 3e   );..    if( p->
13c80 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
13c90 0a 20 20 20 20 20 20 69 6e 74 20 69 4f 66 66 3b  .      int iOff;
13ca0 0a 20 20 20 20 20 20 75 38 20 2a 61 20 3d 20 70  .      u8 *a = p
13cb0 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 70 3b 0a  Iter->pLeaf->p;.
13cc0 20 20 20 20 20 20 69 6e 74 20 6e 20 3d 20 70 49        int n = pI
13cd0 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 73 7a 4c 65  ter->pLeaf->szLe
13ce0 61 66 3b 0a 0a 20 20 20 20 20 20 69 4f 66 66 20  af;..      iOff 
13cf0 3d 20 66 74 73 35 4c 65 61 66 46 69 72 73 74 52  = fts5LeafFirstR
13d00 6f 77 69 64 4f 66 66 28 70 49 74 65 72 2d 3e 70  owidOff(pIter->p
13d10 4c 65 61 66 29 3b 0a 20 20 20 20 20 20 69 66 28  Leaf);.      if(
13d20 20 69 4f 66 66 3c 34 20 7c 7c 20 69 4f 66 66 3e   iOff<4 || iOff>
13d30 3d 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d  =n ){.        p-
13d40 3e 72 63 20 3d 20 46 54 53 35 5f 43 4f 52 52 55  >rc = FTS5_CORRU
13d50 50 54 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  PT;.      }else{
13d60 0a 20 20 20 20 20 20 20 20 69 4f 66 66 20 2b 3d  .        iOff +=
13d70 20 66 74 73 35 47 65 74 56 61 72 69 6e 74 28 26   fts5GetVarint(&
13d80 61 5b 69 4f 66 66 5d 2c 20 28 75 36 34 2a 29 26  a[iOff], (u64*)&
13d90 70 49 74 65 72 2d 3e 69 52 6f 77 69 64 29 3b 0a  pIter->iRowid);.
13da0 20 20 20 20 20 20 20 20 70 49 74 65 72 2d 3e 69          pIter->i
13db0 4c 65 61 66 4f 66 66 73 65 74 20 3d 20 69 4f 66  LeafOffset = iOf
13dc0 66 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35 53  f;.        fts5S
13dd0 65 67 49 74 65 72 4c 6f 61 64 4e 50 6f 73 28 70  egIterLoadNPos(p
13de0 2c 20 70 49 74 65 72 29 3b 0a 20 20 20 20 20 20  , pIter);.      
13df0 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  }.    }.  }.}../
13e00 2a 0a 2a 2a 20 41 64 76 61 6e 63 65 20 74 68 65  *.** Advance the
13e10 20 69 74 65 72 61 74 6f 72 20 70 61 73 73 65 64   iterator passed
13e20 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61   as the second a
13e30 72 67 75 6d 65 6e 74 20 75 6e 74 69 6c 20 69 74  rgument until it
13e40 20 69 73 20 61 74 20 6f 72 20 0a 2a 2a 20 70 61   is at or .** pa
13e50 73 74 20 72 6f 77 69 64 20 69 46 72 6f 6d 2e 20  st rowid iFrom. 
13e60 52 65 67 61 72 64 6c 65 73 73 20 6f 66 20 74 68  Regardless of th
13e70 65 20 76 61 6c 75 65 20 6f 66 20 69 46 72 6f 6d  e value of iFrom
13e80 2c 20 74 68 65 20 69 74 65 72 61 74 6f 72 20 69  , the iterator i
13e90 73 0a 2a 2a 20 61 6c 77 61 79 73 20 61 64 76 61  s.** always adva
13ea0 6e 63 65 64 20 61 74 20 6c 65 61 73 74 20 6f 6e  nced at least on
13eb0 63 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ce..*/.static vo
13ec0 69 64 20 66 74 73 35 53 65 67 49 74 65 72 4e 65  id fts5SegIterNe
13ed0 78 74 46 72 6f 6d 28 0a 20 20 46 74 73 35 49 6e  xtFrom(.  Fts5In
13ee0 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20 20  dex *p,         
13ef0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53            /* FTS
13f00 35 20 62 61 63 6b 65 6e 64 20 6f 62 6a 65 63 74  5 backend object
13f10 20 2a 2f 0a 20 20 46 74 73 35 53 65 67 49 74 65   */.  Fts5SegIte
13f20 72 20 2a 70 49 74 65 72 2c 20 20 20 20 20 20 20  r *pIter,       
13f30 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74 6f        /* Iterato
13f40 72 20 74 6f 20 61 64 76 61 6e 63 65 20 2a 2f 0a  r to advance */.
13f50 20 20 69 36 34 20 69 4d 61 74 63 68 20 20 20 20    i64 iMatch    
13f60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13f70 20 20 2f 2a 20 41 64 76 61 6e 63 65 20 69 74 65    /* Advance ite
13f80 72 61 74 6f 72 20 61 74 20 6c 65 61 73 74 20 74  rator at least t
13f90 68 69 73 20 66 61 72 20 2a 2f 0a 29 7b 0a 20 20  his far */.){.  
13fa0 69 6e 74 20 62 52 65 76 20 3d 20 28 70 49 74 65  int bRev = (pIte
13fb0 72 2d 3e 66 6c 61 67 73 20 26 20 46 54 53 35 5f  r->flags & FTS5_
13fc0 53 45 47 49 54 45 52 5f 52 45 56 45 52 53 45 29  SEGITER_REVERSE)
13fd0 3b 0a 20 20 46 74 73 35 44 6c 69 64 78 49 74 65  ;.  Fts5DlidxIte
13fe0 72 20 2a 70 44 6c 69 64 78 20 3d 20 70 49 74 65  r *pDlidx = pIte
13ff0 72 2d 3e 70 44 6c 69 64 78 3b 0a 20 20 69 6e 74  r->pDlidx;.  int
14000 20 69 4c 65 61 66 50 67 6e 6f 20 3d 20 70 49 74   iLeafPgno = pIt
14010 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 3b 0a 20  er->iLeafPgno;. 
14020 20 69 6e 74 20 62 4d 6f 76 65 20 3d 20 31 3b 0a   int bMove = 1;.
14030 0a 20 20 61 73 73 65 72 74 28 20 70 49 74 65 72  .  assert( pIter
14040 2d 3e 66 6c 61 67 73 20 26 20 46 54 53 35 5f 53  ->flags & FTS5_S
14050 45 47 49 54 45 52 5f 4f 4e 45 54 45 52 4d 20 29  EGITER_ONETERM )
14060 3b 0a 20 20 61 73 73 65 72 74 28 20 70 49 74 65  ;.  assert( pIte
14070 72 2d 3e 70 44 6c 69 64 78 20 29 3b 0a 20 20 61  r->pDlidx );.  a
14080 73 73 65 72 74 28 20 70 49 74 65 72 2d 3e 70 4c  ssert( pIter->pL
14090 65 61 66 20 29 3b 0a 0a 20 20 69 66 28 20 62 52  eaf );..  if( bR
140a0 65 76 3d 3d 30 20 29 7b 0a 20 20 20 20 77 68 69  ev==0 ){.    whi
140b0 6c 65 28 20 21 66 74 73 35 44 6c 69 64 78 49 74  le( !fts5DlidxIt
140c0 65 72 45 6f 66 28 70 2c 20 70 44 6c 69 64 78 29  erEof(p, pDlidx)
140d0 20 26 26 20 69 4d 61 74 63 68 3e 66 74 73 35 44   && iMatch>fts5D
140e0 6c 69 64 78 49 74 65 72 52 6f 77 69 64 28 70 44  lidxIterRowid(pD
140f0 6c 69 64 78 29 20 29 7b 0a 20 20 20 20 20 20 69  lidx) ){.      i
14100 4c 65 61 66 50 67 6e 6f 20 3d 20 66 74 73 35 44  LeafPgno = fts5D
14110 6c 69 64 78 49 74 65 72 50 67 6e 6f 28 70 44 6c  lidxIterPgno(pDl
14120 69 64 78 29 3b 0a 20 20 20 20 20 20 66 74 73 35  idx);.      fts5
14130 44 6c 69 64 78 49 74 65 72 4e 65 78 74 28 70 2c  DlidxIterNext(p,
14140 20 70 44 6c 69 64 78 29 3b 0a 20 20 20 20 7d 0a   pDlidx);.    }.
14150 20 20 20 20 61 73 73 65 72 74 5f 6e 63 28 20 69      assert_nc( i
14160 4c 65 61 66 50 67 6e 6f 3e 3d 70 49 74 65 72 2d  LeafPgno>=pIter-
14170 3e 69 4c 65 61 66 50 67 6e 6f 20 7c 7c 20 70 2d  >iLeafPgno || p-
14180 3e 72 63 20 29 3b 0a 20 20 20 20 69 66 28 20 69  >rc );.    if( i
14190 4c 65 61 66 50 67 6e 6f 3e 70 49 74 65 72 2d 3e  LeafPgno>pIter->
141a0 69 4c 65 61 66 50 67 6e 6f 20 29 7b 0a 20 20 20  iLeafPgno ){.   
141b0 20 20 20 66 74 73 35 53 65 67 49 74 65 72 47 6f     fts5SegIterGo
141c0 74 6f 50 61 67 65 28 70 2c 20 70 49 74 65 72 2c  toPage(p, pIter,
141d0 20 69 4c 65 61 66 50 67 6e 6f 29 3b 0a 20 20 20   iLeafPgno);.   
141e0 20 20 20 62 4d 6f 76 65 20 3d 20 30 3b 0a 20 20     bMove = 0;.  
141f0 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20    }.  }else{.   
14200 20 61 73 73 65 72 74 28 20 70 49 74 65 72 2d 3e   assert( pIter->
14210 70 4e 65 78 74 4c 65 61 66 3d 3d 30 20 29 3b 0a  pNextLeaf==0 );.
14220 20 20 20 20 61 73 73 65 72 74 28 20 69 4d 61 74      assert( iMat
14230 63 68 3c 70 49 74 65 72 2d 3e 69 52 6f 77 69 64  ch<pIter->iRowid
14240 20 29 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 21   );.    while( !
14250 66 74 73 35 44 6c 69 64 78 49 74 65 72 45 6f 66  fts5DlidxIterEof
14260 28 70 2c 20 70 44 6c 69 64 78 29 20 26 26 20 69  (p, pDlidx) && i
14270 4d 61 74 63 68 3c 66 74 73 35 44 6c 69 64 78 49  Match<fts5DlidxI
14280 74 65 72 52 6f 77 69 64 28 70 44 6c 69 64 78 29  terRowid(pDlidx)
14290 20 29 7b 0a 20 20 20 20 20 20 66 74 73 35 44 6c   ){.      fts5Dl
142a0 69 64 78 49 74 65 72 50 72 65 76 28 70 2c 20 70  idxIterPrev(p, p
142b0 44 6c 69 64 78 29 3b 0a 20 20 20 20 7d 0a 20 20  Dlidx);.    }.  
142c0 20 20 69 4c 65 61 66 50 67 6e 6f 20 3d 20 66 74    iLeafPgno = ft
142d0 73 35 44 6c 69 64 78 49 74 65 72 50 67 6e 6f 28  s5DlidxIterPgno(
142e0 70 44 6c 69 64 78 29 3b 0a 0a 20 20 20 20 61 73  pDlidx);..    as
142f0 73 65 72 74 28 20 66 74 73 35 44 6c 69 64 78 49  sert( fts5DlidxI
14300 74 65 72 45 6f 66 28 70 2c 20 70 44 6c 69 64 78  terEof(p, pDlidx
14310 29 20 7c 7c 20 69 4c 65 61 66 50 67 6e 6f 3c 3d  ) || iLeafPgno<=
14320 70 49 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f  pIter->iLeafPgno
14330 20 29 3b 0a 0a 20 20 20 20 69 66 28 20 69 4c 65   );..    if( iLe
14340 61 66 50 67 6e 6f 3c 70 49 74 65 72 2d 3e 69 4c  afPgno<pIter->iL
14350 65 61 66 50 67 6e 6f 20 29 7b 0a 20 20 20 20 20  eafPgno ){.     
14360 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e   pIter->iLeafPgn
14370 6f 20 3d 20 69 4c 65 61 66 50 67 6e 6f 2b 31 3b  o = iLeafPgno+1;
14380 0a 20 20 20 20 20 20 66 74 73 35 53 65 67 49 74  .      fts5SegIt
14390 65 72 52 65 76 65 72 73 65 4e 65 77 50 61 67 65  erReverseNewPage
143a0 28 70 2c 20 70 49 74 65 72 29 3b 0a 20 20 20 20  (p, pIter);.    
143b0 20 20 62 4d 6f 76 65 20 3d 20 30 3b 0a 20 20 20    bMove = 0;.   
143c0 20 7d 0a 20 20 7d 0a 0a 20 20 64 6f 7b 0a 20 20   }.  }..  do{.  
143d0 20 20 69 66 28 20 62 4d 6f 76 65 20 26 26 20 70    if( bMove && p
143e0 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
143f0 29 20 70 49 74 65 72 2d 3e 78 4e 65 78 74 28 70  ) pIter->xNext(p
14400 2c 20 70 49 74 65 72 2c 20 30 29 3b 0a 20 20 20  , pIter, 0);.   
14410 20 69 66 28 20 70 49 74 65 72 2d 3e 70 4c 65 61   if( pIter->pLea
14420 66 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20  f==0 ) break;.  
14430 20 20 69 66 28 20 62 52 65 76 3d 3d 30 20 26 26    if( bRev==0 &&
14440 20 70 49 74 65 72 2d 3e 69 52 6f 77 69 64 3e 3d   pIter->iRowid>=
14450 69 4d 61 74 63 68 20 29 20 62 72 65 61 6b 3b 0a  iMatch ) break;.
14460 20 20 20 20 69 66 28 20 62 52 65 76 21 3d 30 20      if( bRev!=0 
14470 26 26 20 70 49 74 65 72 2d 3e 69 52 6f 77 69 64  && pIter->iRowid
14480 3c 3d 69 4d 61 74 63 68 20 29 20 62 72 65 61 6b  <=iMatch ) break
14490 3b 0a 20 20 20 20 62 4d 6f 76 65 20 3d 20 31 3b  ;.    bMove = 1;
144a0 0a 20 20 7d 77 68 69 6c 65 28 20 70 2d 3e 72 63  .  }while( p->rc
144b0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 7d  ==SQLITE_OK );.}
144c0 0a 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 74 68  .../*.** Free th
144d0 65 20 69 74 65 72 61 74 6f 72 20 6f 62 6a 65 63  e iterator objec
144e0 74 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  t passed as the 
144f0 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2e  second argument.
14500 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
14510 66 74 73 35 4d 75 6c 74 69 49 74 65 72 46 72 65  fts5MultiIterFre
14520 65 28 46 74 73 35 49 74 65 72 20 2a 70 49 74 65  e(Fts5Iter *pIte
14530 72 29 7b 0a 20 20 69 66 28 20 70 49 74 65 72 20  r){.  if( pIter 
14540 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  ){.    int i;.  
14550 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49 74    for(i=0; i<pIt
14560 65 72 2d 3e 6e 53 65 67 3b 20 69 2b 2b 29 7b 0a  er->nSeg; i++){.
14570 20 20 20 20 20 20 66 74 73 35 53 65 67 49 74 65        fts5SegIte
14580 72 43 6c 65 61 72 28 26 70 49 74 65 72 2d 3e 61  rClear(&pIter->a
14590 53 65 67 5b 69 5d 29 3b 0a 20 20 20 20 7d 0a 20  Seg[i]);.    }. 
145a0 20 20 20 66 74 73 35 53 74 72 75 63 74 75 72 65     fts5Structure
145b0 52 65 6c 65 61 73 65 28 70 49 74 65 72 2d 3e 70  Release(pIter->p
145c0 53 74 72 75 63 74 29 3b 0a 20 20 20 20 66 74 73  Struct);.    fts
145d0 35 42 75 66 66 65 72 46 72 65 65 28 26 70 49 74  5BufferFree(&pIt
145e0 65 72 2d 3e 70 6f 73 6c 69 73 74 29 3b 0a 20 20  er->poslist);.  
145f0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
14600 49 74 65 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 73 74  Iter);.  }.}..st
14610 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 4d 75  atic void fts5Mu
14620 6c 74 69 49 74 65 72 41 64 76 61 6e 63 65 64 28  ltiIterAdvanced(
14630 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c  .  Fts5Index *p,
14640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14650 20 20 20 2f 2a 20 46 54 53 35 20 62 61 63 6b 65     /* FTS5 backe
14660 6e 64 20 74 6f 20 69 74 65 72 61 74 65 20 77 69  nd to iterate wi
14670 74 68 69 6e 20 2a 2f 0a 20 20 46 74 73 35 49 74  thin */.  Fts5It
14680 65 72 20 2a 70 49 74 65 72 2c 20 20 20 20 20 20  er *pIter,      
14690 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 74 65            /* Ite
146a0 72 61 74 6f 72 20 74 6f 20 75 70 64 61 74 65 20  rator to update 
146b0 61 46 69 72 73 74 5b 5d 20 61 72 72 61 79 20 66  aFirst[] array f
146c0 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 69 43 68 61  or */.  int iCha
146d0 6e 67 65 64 2c 20 20 20 20 20 20 20 20 20 20 20  nged,           
146e0 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
146f0 20 6f 66 20 73 75 62 2d 69 74 65 72 61 74 6f 72   of sub-iterator
14700 20 6a 75 73 74 20 61 64 76 61 6e 63 65 64 20 2a   just advanced *
14710 2f 0a 20 20 69 6e 74 20 69 4d 69 6e 73 65 74 20  /.  int iMinset 
14720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14730 20 20 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 65      /* Minimum e
14740 6e 74 72 79 20 69 6e 20 61 46 69 72 73 74 5b 5d  ntry in aFirst[]
14750 20 74 6f 20 73 65 74 20 2a 2f 0a 29 7b 0a 20 20   to set */.){.  
14760 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 28  int i;.  for(i=(
14770 70 49 74 65 72 2d 3e 6e 53 65 67 2b 69 43 68 61  pIter->nSeg+iCha
14780 6e 67 65 64 29 2f 32 3b 20 69 3e 3d 69 4d 69 6e  nged)/2; i>=iMin
14790 73 65 74 20 26 26 20 70 2d 3e 72 63 3d 3d 53 51  set && p->rc==SQ
147a0 4c 49 54 45 5f 4f 4b 3b 20 69 3d 69 2f 32 29 7b  LITE_OK; i=i/2){
147b0 0a 20 20 20 20 69 6e 74 20 69 45 71 3b 0a 20 20  .    int iEq;.  
147c0 20 20 69 66 28 20 28 69 45 71 20 3d 20 66 74 73    if( (iEq = fts
147d0 35 4d 75 6c 74 69 49 74 65 72 44 6f 43 6f 6d 70  5MultiIterDoComp
147e0 61 72 65 28 70 49 74 65 72 2c 20 69 29 29 20 29  are(pIter, i)) )
147f0 7b 0a 20 20 20 20 20 20 46 74 73 35 53 65 67 49  {.      Fts5SegI
14800 74 65 72 20 2a 70 53 65 67 20 3d 20 26 70 49 74  ter *pSeg = &pIt
14810 65 72 2d 3e 61 53 65 67 5b 69 45 71 5d 3b 0a 20  er->aSeg[iEq];. 
14820 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e       assert( p->
14830 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  rc==SQLITE_OK );
14840 0a 20 20 20 20 20 20 70 53 65 67 2d 3e 78 4e 65  .      pSeg->xNe
14850 78 74 28 70 2c 20 70 53 65 67 2c 20 30 29 3b 0a  xt(p, pSeg, 0);.
14860 20 20 20 20 20 20 69 20 3d 20 70 49 74 65 72 2d        i = pIter-
14870 3e 6e 53 65 67 20 2b 20 69 45 71 3b 0a 20 20 20  >nSeg + iEq;.   
14880 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
14890 53 75 62 2d 69 74 65 72 61 74 6f 72 20 69 43 68  Sub-iterator iCh
148a0 61 6e 67 65 64 20 6f 66 20 69 74 65 72 61 74 6f  anged of iterato
148b0 72 20 70 49 74 65 72 20 68 61 73 20 6a 75 73 74  r pIter has just
148c0 20 62 65 65 6e 20 61 64 76 61 6e 63 65 64 2e 20   been advanced. 
148d0 49 74 20 73 74 69 6c 6c 0a 2a 2a 20 70 6f 69 6e  It still.** poin
148e0 74 73 20 74 6f 20 74 68 65 20 73 61 6d 65 20 74  ts to the same t
148f0 65 72 6d 20 74 68 6f 75 67 68 20 2d 20 6a 75 73  erm though - jus
14900 74 20 61 20 64 69 66 66 65 72 65 6e 74 20 72 6f  t a different ro
14910 77 69 64 2e 20 54 68 69 73 20 66 75 6e 63 74 69  wid. This functi
14920 6f 6e 0a 2a 2a 20 61 74 74 65 6d 70 74 73 20 74  on.** attempts t
14930 6f 20 75 70 64 61 74 65 20 74 68 65 20 63 6f 6e  o update the con
14940 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70 49 74  tents of the pIt
14950 65 72 2d 3e 61 46 69 72 73 74 5b 5d 20 61 63 63  er->aFirst[] acc
14960 6f 72 64 69 6e 67 6c 79 2e 0a 2a 2a 20 49 66 20  ordingly..** If 
14970 69 74 20 64 6f 65 73 20 73 6f 20 73 75 63 63 65  it does so succe
14980 73 73 66 75 6c 6c 79 2c 20 30 20 69 73 20 72 65  ssfully, 0 is re
14990 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73  turned. Otherwis
149a0 65 20 31 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f  e 1..**.** If no
149b0 6e 2d 7a 65 72 6f 20 69 73 20 72 65 74 75 72 6e  n-zero is return
149c0 65 64 2c 20 74 68 65 20 63 61 6c 6c 65 72 20 73  ed, the caller s
149d0 68 6f 75 6c 64 20 63 61 6c 6c 20 66 74 73 35 4d  hould call fts5M
149e0 75 6c 74 69 49 74 65 72 41 64 76 61 6e 63 65 64  ultiIterAdvanced
149f0 28 29 0a 2a 2a 20 6f 6e 20 74 68 65 20 69 74 65  ().** on the ite
14a00 72 61 74 6f 72 20 69 6e 73 74 65 61 64 2e 20 54  rator instead. T
14a10 68 61 74 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65  hat function doe
14a20 73 20 74 68 65 20 73 61 6d 65 20 61 73 20 74 68  s the same as th
14a30 69 73 20 6f 6e 65 2c 20 65 78 63 65 70 74 0a 2a  is one, except.*
14a40 2a 20 74 68 61 74 20 69 74 20 64 65 61 6c 73 20  * that it deals 
14a50 77 69 74 68 20 6d 6f 72 65 20 63 6f 6d 70 6c 69  with more compli
14a60 63 61 74 65 64 20 63 61 73 65 73 20 61 73 20 77  cated cases as w
14a70 65 6c 6c 2e 0a 2a 2f 20 0a 73 74 61 74 69 63 20  ell..*/ .static 
14a80 69 6e 74 20 66 74 73 35 4d 75 6c 74 69 49 74 65  int fts5MultiIte
14a90 72 41 64 76 61 6e 63 65 52 6f 77 69 64 28 0a 20  rAdvanceRowid(. 
14aa0 20 46 74 73 35 49 74 65 72 20 2a 70 49 74 65 72   Fts5Iter *pIter
14ab0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
14ac0 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 74 6f 20   /* Iterator to 
14ad0 75 70 64 61 74 65 20 61 46 69 72 73 74 5b 5d 20  update aFirst[] 
14ae0 61 72 72 61 79 20 66 6f 72 20 2a 2f 0a 20 20 69  array for */.  i
14af0 6e 74 20 69 43 68 61 6e 67 65 64 2c 20 20 20 20  nt iChanged,    
14b00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
14b10 2a 20 49 6e 64 65 78 20 6f 66 20 73 75 62 2d 69  * Index of sub-i
14b20 74 65 72 61 74 6f 72 20 6a 75 73 74 20 61 64 76  terator just adv
14b30 61 6e 63 65 64 20 2a 2f 0a 20 20 46 74 73 35 53  anced */.  Fts5S
14b40 65 67 49 74 65 72 20 2a 2a 70 70 46 69 72 73 74  egIter **ppFirst
14b50 0a 29 7b 0a 20 20 46 74 73 35 53 65 67 49 74 65  .){.  Fts5SegIte
14b60 72 20 2a 70 4e 65 77 20 3d 20 26 70 49 74 65 72  r *pNew = &pIter
14b70 2d 3e 61 53 65 67 5b 69 43 68 61 6e 67 65 64 5d  ->aSeg[iChanged]
14b80 3b 0a 0a 20 20 69 66 28 20 70 4e 65 77 2d 3e 69  ;..  if( pNew->i
14b90 52 6f 77 69 64 3d 3d 70 49 74 65 72 2d 3e 69 53  Rowid==pIter->iS
14ba0 77 69 74 63 68 52 6f 77 69 64 0a 20 20 20 7c 7c  witchRowid.   ||
14bb0 20 28 70 4e 65 77 2d 3e 69 52 6f 77 69 64 3c 70   (pNew->iRowid<p
14bc0 49 74 65 72 2d 3e 69 53 77 69 74 63 68 52 6f 77  Iter->iSwitchRow
14bd0 69 64 29 3d 3d 70 49 74 65 72 2d 3e 62 52 65 76  id)==pIter->bRev
14be0 0a 20 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b  .  ){.    int i;
14bf0 0a 20 20 20 20 46 74 73 35 53 65 67 49 74 65 72  .    Fts5SegIter
14c00 20 2a 70 4f 74 68 65 72 20 3d 20 26 70 49 74 65   *pOther = &pIte
14c10 72 2d 3e 61 53 65 67 5b 69 43 68 61 6e 67 65 64  r->aSeg[iChanged
14c20 20 5e 20 30 78 30 30 30 31 5d 3b 0a 20 20 20 20   ^ 0x0001];.    
14c30 70 49 74 65 72 2d 3e 69 53 77 69 74 63 68 52 6f  pIter->iSwitchRo
14c40 77 69 64 20 3d 20 70 49 74 65 72 2d 3e 62 52 65  wid = pIter->bRe
14c50 76 20 3f 20 53 4d 41 4c 4c 45 53 54 5f 49 4e 54  v ? SMALLEST_INT
14c60 36 34 20 3a 20 4c 41 52 47 45 53 54 5f 49 4e 54  64 : LARGEST_INT
14c70 36 34 3b 0a 20 20 20 20 66 6f 72 28 69 3d 28 70  64;.    for(i=(p
14c80 49 74 65 72 2d 3e 6e 53 65 67 2b 69 43 68 61 6e  Iter->nSeg+iChan
14c90 67 65 64 29 2f 32 3b 20 31 3b 20 69 3d 69 2f 32  ged)/2; 1; i=i/2
14ca0 29 7b 0a 20 20 20 20 20 20 46 74 73 35 43 52 65  ){.      Fts5CRe
14cb0 73 75 6c 74 20 2a 70 52 65 73 20 3d 20 26 70 49  sult *pRes = &pI
14cc0 74 65 72 2d 3e 61 46 69 72 73 74 5b 69 5d 3b 0a  ter->aFirst[i];.
14cd0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
14ce0 4e 65 77 2d 3e 70 4c 65 61 66 20 29 3b 0a 20 20  New->pLeaf );.  
14cf0 20 20 20 20 61 73 73 65 72 74 28 20 70 52 65 73      assert( pRes
14d00 2d 3e 62 54 65 72 6d 45 71 3d 3d 30 20 7c 7c 20  ->bTermEq==0 || 
14d10 70 4f 74 68 65 72 2d 3e 70 4c 65 61 66 20 29 3b  pOther->pLeaf );
14d20 0a 0a 20 20 20 20 20 20 69 66 28 20 70 52 65 73  ..      if( pRes
14d30 2d 3e 62 54 65 72 6d 45 71 20 29 7b 0a 20 20 20  ->bTermEq ){.   
14d40 20 20 20 20 20 69 66 28 20 70 4e 65 77 2d 3e 69       if( pNew->i
14d50 52 6f 77 69 64 3d 3d 70 4f 74 68 65 72 2d 3e 69  Rowid==pOther->i
14d60 52 6f 77 69 64 20 29 7b 0a 20 20 20 20 20 20 20  Rowid ){.       
14d70 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
14d80 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28       }else if( (
14d90 70 4f 74 68 65 72 2d 3e 69 52 6f 77 69 64 3e 70  pOther->iRowid>p
14da0 4e 65 77 2d 3e 69 52 6f 77 69 64 29 3d 3d 70 49  New->iRowid)==pI
14db0 74 65 72 2d 3e 62 52 65 76 20 29 7b 0a 20 20 20  ter->bRev ){.   
14dc0 20 20 20 20 20 20 20 70 49 74 65 72 2d 3e 69 53         pIter->iS
14dd0 77 69 74 63 68 52 6f 77 69 64 20 3d 20 70 4f 74  witchRowid = pOt
14de0 68 65 72 2d 3e 69 52 6f 77 69 64 3b 0a 20 20 20  her->iRowid;.   
14df0 20 20 20 20 20 20 20 70 4e 65 77 20 3d 20 70 4f         pNew = pO
14e00 74 68 65 72 3b 0a 20 20 20 20 20 20 20 20 7d 65  ther;.        }e
14e10 6c 73 65 20 69 66 28 20 28 70 4f 74 68 65 72 2d  lse if( (pOther-
14e20 3e 69 52 6f 77 69 64 3e 70 49 74 65 72 2d 3e 69  >iRowid>pIter->i
14e30 53 77 69 74 63 68 52 6f 77 69 64 29 3d 3d 70 49  SwitchRowid)==pI
14e40 74 65 72 2d 3e 62 52 65 76 20 29 7b 0a 20 20 20  ter->bRev ){.   
14e50 20 20 20 20 20 20 20 70 49 74 65 72 2d 3e 69 53         pIter->iS
14e60 77 69 74 63 68 52 6f 77 69 64 20 3d 20 70 4f 74  witchRowid = pOt
14e70 68 65 72 2d 3e 69 52 6f 77 69 64 3b 0a 20 20 20  her->iRowid;.   
14e80 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
14e90 20 20 20 20 20 70 52 65 73 2d 3e 69 46 69 72 73       pRes->iFirs
14ea0 74 20 3d 20 28 75 31 36 29 28 70 4e 65 77 20 2d  t = (u16)(pNew -
14eb0 20 70 49 74 65 72 2d 3e 61 53 65 67 29 3b 0a 20   pIter->aSeg);. 
14ec0 20 20 20 20 20 69 66 28 20 69 3d 3d 31 20 29 20       if( i==1 ) 
14ed0 62 72 65 61 6b 3b 0a 0a 20 20 20 20 20 20 70 4f  break;..      pO
14ee0 74 68 65 72 20 3d 20 26 70 49 74 65 72 2d 3e 61  ther = &pIter->a
14ef0 53 65 67 5b 20 70 49 74 65 72 2d 3e 61 46 69 72  Seg[ pIter->aFir
14f00 73 74 5b 69 20 5e 20 30 78 30 30 30 31 5d 2e 69  st[i ^ 0x0001].i
14f10 46 69 72 73 74 20 5d 3b 0a 20 20 20 20 7d 0a 20  First ];.    }. 
14f20 20 7d 0a 0a 20 20 2a 70 70 46 69 72 73 74 20 3d   }..  *ppFirst =
14f30 20 70 4e 65 77 3b 0a 20 20 72 65 74 75 72 6e 20   pNew;.  return 
14f40 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20  0;.}../*.** Set 
14f50 74 68 65 20 70 49 74 65 72 2d 3e 62 45 6f 66 20  the pIter->bEof 
14f60 76 61 72 69 61 62 6c 65 20 62 61 73 65 64 20 6f  variable based o
14f70 6e 20 74 68 65 20 73 74 61 74 65 20 6f 66 20 74  n the state of t
14f80 68 65 20 73 75 62 2d 69 74 65 72 61 74 6f 72 73  he sub-iterators
14f90 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
14fa0 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 53 65   fts5MultiIterSe
14fb0 74 45 6f 66 28 46 74 73 35 49 74 65 72 20 2a 70  tEof(Fts5Iter *p
14fc0 49 74 65 72 29 7b 0a 20 20 46 74 73 35 53 65 67  Iter){.  Fts5Seg
14fd0 49 74 65 72 20 2a 70 53 65 67 20 3d 20 26 70 49  Iter *pSeg = &pI
14fe0 74 65 72 2d 3e 61 53 65 67 5b 20 70 49 74 65 72  ter->aSeg[ pIter
14ff0 2d 3e 61 46 69 72 73 74 5b 31 5d 2e 69 46 69 72  ->aFirst[1].iFir
15000 73 74 20 5d 3b 0a 20 20 70 49 74 65 72 2d 3e 62  st ];.  pIter->b
15010 61 73 65 2e 62 45 6f 66 20 3d 20 70 53 65 67 2d  ase.bEof = pSeg-
15020 3e 70 4c 65 61 66 3d 3d 30 3b 0a 20 20 70 49 74  >pLeaf==0;.  pIt
15030 65 72 2d 3e 69 53 77 69 74 63 68 52 6f 77 69 64  er->iSwitchRowid
15040 20 3d 20 70 53 65 67 2d 3e 69 52 6f 77 69 64 3b   = pSeg->iRowid;
15050 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74  .}../*.** Move t
15060 68 65 20 69 74 65 72 61 74 6f 72 20 74 6f 20 74  he iterator to t
15070 68 65 20 6e 65 78 74 20 65 6e 74 72 79 2e 20 0a  he next entry. .
15080 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f  **.** If an erro
15090 72 20 6f 63 63 75 72 73 2c 20 61 6e 20 65 72 72  r occurs, an err
150a0 6f 72 20 63 6f 64 65 20 69 73 20 6c 65 66 74 20  or code is left 
150b0 69 6e 20 46 74 73 35 49 6e 64 65 78 2e 72 63 2e  in Fts5Index.rc.
150c0 20 49 74 20 69 73 20 6e 6f 74 20 0a 2a 2a 20 63   It is not .** c
150d0 6f 6e 73 69 64 65 72 65 64 20 61 6e 20 65 72 72  onsidered an err
150e0 6f 72 20 69 66 20 74 68 65 20 69 74 65 72 61 74  or if the iterat
150f0 6f 72 20 72 65 61 63 68 65 73 20 45 4f 46 2c 20  or reaches EOF, 
15100 6f 72 20 69 66 20 69 74 20 69 73 20 61 6c 72 65  or if it is alre
15110 61 64 79 20 61 74 20 0a 2a 2a 20 45 4f 46 20 77  ady at .** EOF w
15120 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hen this functio
15130 6e 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2f 0a  n is called..*/.
15140 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
15150 4d 75 6c 74 69 49 74 65 72 4e 65 78 74 28 0a 20  MultiIterNext(. 
15160 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 0a   Fts5Index *p, .
15170 20 20 46 74 73 35 49 74 65 72 20 2a 70 49 74 65    Fts5Iter *pIte
15180 72 2c 0a 20 20 69 6e 74 20 62 46 72 6f 6d 2c 20  r,.  int bFrom, 
15190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
151a0 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
151b0 61 72 67 75 6d 65 6e 74 20 69 46 72 6f 6d 20 69  argument iFrom i
151c0 73 20 76 61 6c 69 64 20 2a 2f 0a 20 20 69 36 34  s valid */.  i64
151d0 20 69 46 72 6f 6d 20 20 20 20 20 20 20 20 20 20   iFrom          
151e0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
151f0 41 64 76 61 6e 63 65 20 61 74 20 6c 65 61 73 74  Advance at least
15200 20 61 73 20 66 61 72 20 61 73 20 74 68 69 73 20   as far as this 
15210 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 62 55 73 65  */.){.  int bUse
15220 46 72 6f 6d 20 3d 20 62 46 72 6f 6d 3b 0a 20 20  From = bFrom;.  
15230 77 68 69 6c 65 28 20 70 2d 3e 72 63 3d 3d 53 51  while( p->rc==SQ
15240 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69  LITE_OK ){.    i
15250 6e 74 20 69 46 69 72 73 74 20 3d 20 70 49 74 65  nt iFirst = pIte
15260 72 2d 3e 61 46 69 72 73 74 5b 31 5d 2e 69 46 69  r->aFirst[1].iFi
15270 72 73 74 3b 0a 20 20 20 20 69 6e 74 20 62 4e 65  rst;.    int bNe
15280 77 54 65 72 6d 20 3d 20 30 3b 0a 20 20 20 20 46  wTerm = 0;.    F
15290 74 73 35 53 65 67 49 74 65 72 20 2a 70 53 65 67  ts5SegIter *pSeg
152a0 20 3d 20 26 70 49 74 65 72 2d 3e 61 53 65 67 5b   = &pIter->aSeg[
152b0 69 46 69 72 73 74 5d 3b 0a 20 20 20 20 61 73 73  iFirst];.    ass
152c0 65 72 74 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49  ert( p->rc==SQLI
152d0 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 69 66 28  TE_OK );.    if(
152e0 20 62 55 73 65 46 72 6f 6d 20 26 26 20 70 53 65   bUseFrom && pSe
152f0 67 2d 3e 70 44 6c 69 64 78 20 29 7b 0a 20 20 20  g->pDlidx ){.   
15300 20 20 20 66 74 73 35 53 65 67 49 74 65 72 4e 65     fts5SegIterNe
15310 78 74 46 72 6f 6d 28 70 2c 20 70 53 65 67 2c 20  xtFrom(p, pSeg, 
15320 69 46 72 6f 6d 29 3b 0a 20 20 20 20 7d 65 6c 73  iFrom);.    }els
15330 65 7b 0a 20 20 20 20 20 20 70 53 65 67 2d 3e 78  e{.      pSeg->x
15340 4e 65 78 74 28 70 2c 20 70 53 65 67 2c 20 26 62  Next(p, pSeg, &b
15350 4e 65 77 54 65 72 6d 29 3b 0a 20 20 20 20 7d 0a  NewTerm);.    }.
15360 0a 20 20 20 20 69 66 28 20 70 53 65 67 2d 3e 70  .    if( pSeg->p
15370 4c 65 61 66 3d 3d 30 20 7c 7c 20 62 4e 65 77 54  Leaf==0 || bNewT
15380 65 72 6d 20 0a 20 20 20 20 20 7c 7c 20 66 74 73  erm .     || fts
15390 35 4d 75 6c 74 69 49 74 65 72 41 64 76 61 6e 63  5MultiIterAdvanc
153a0 65 52 6f 77 69 64 28 70 49 74 65 72 2c 20 69 46  eRowid(pIter, iF
153b0 69 72 73 74 2c 20 26 70 53 65 67 29 0a 20 20 20  irst, &pSeg).   
153c0 20 29 7b 0a 20 20 20 20 20 20 66 74 73 35 4d 75   ){.      fts5Mu
153d0 6c 74 69 49 74 65 72 41 64 76 61 6e 63 65 64 28  ltiIterAdvanced(
153e0 70 2c 20 70 49 74 65 72 2c 20 69 46 69 72 73 74  p, pIter, iFirst
153f0 2c 20 31 29 3b 0a 20 20 20 20 20 20 66 74 73 35  , 1);.      fts5
15400 4d 75 6c 74 69 49 74 65 72 53 65 74 45 6f 66 28  MultiIterSetEof(
15410 70 49 74 65 72 29 3b 0a 20 20 20 20 20 20 70 53  pIter);.      pS
15420 65 67 20 3d 20 26 70 49 74 65 72 2d 3e 61 53 65  eg = &pIter->aSe
15430 67 5b 70 49 74 65 72 2d 3e 61 46 69 72 73 74 5b  g[pIter->aFirst[
15440 31 5d 2e 69 46 69 72 73 74 5d 3b 0a 20 20 20 20  1].iFirst];.    
15450 20 20 69 66 28 20 70 53 65 67 2d 3e 70 4c 65 61    if( pSeg->pLea
15460 66 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  f==0 ) return;. 
15470 20 20 20 7d 0a 0a 20 20 20 20 66 74 73 35 41 73     }..    fts5As
15480 73 65 72 74 4d 75 6c 74 69 49 74 65 72 53 65 74  sertMultiIterSet
15490 75 70 28 70 2c 20 70 49 74 65 72 29 3b 0a 20 20  up(p, pIter);.  
154a0 20 20 61 73 73 65 72 74 28 20 70 53 65 67 3d 3d    assert( pSeg==
154b0 26 70 49 74 65 72 2d 3e 61 53 65 67 5b 70 49 74  &pIter->aSeg[pIt
154c0 65 72 2d 3e 61 46 69 72 73 74 5b 31 5d 2e 69 46  er->aFirst[1].iF
154d0 69 72 73 74 5d 20 26 26 20 70 53 65 67 2d 3e 70  irst] && pSeg->p
154e0 4c 65 61 66 20 29 3b 0a 20 20 20 20 69 66 28 20  Leaf );.    if( 
154f0 70 49 74 65 72 2d 3e 62 53 6b 69 70 45 6d 70 74  pIter->bSkipEmpt
15500 79 3d 3d 30 20 7c 7c 20 70 53 65 67 2d 3e 6e 50  y==0 || pSeg->nP
15510 6f 73 20 29 7b 0a 20 20 20 20 20 20 70 49 74 65  os ){.      pIte
15520 72 2d 3e 78 53 65 74 4f 75 74 70 75 74 73 28 70  r->xSetOutputs(p
15530 49 74 65 72 2c 20 70 53 65 67 29 3b 0a 20 20 20  Iter, pSeg);.   
15540 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d     return;.    }
15550 0a 20 20 20 20 62 55 73 65 46 72 6f 6d 20 3d 20  .    bUseFrom = 
15560 30 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63  0;.  }.}..static
15570 20 76 6f 69 64 20 66 74 73 35 4d 75 6c 74 69 49   void fts5MultiI
15580 74 65 72 4e 65 78 74 32 28 0a 20 20 46 74 73 35  terNext2(.  Fts5
15590 49 6e 64 65 78 20 2a 70 2c 20 0a 20 20 46 74 73  Index *p, .  Fts
155a0 35 49 74 65 72 20 2a 70 49 74 65 72 2c 0a 20 20  5Iter *pIter,.  
155b0 69 6e 74 20 2a 70 62 4e 65 77 54 65 72 6d 20 20  int *pbNewTerm  
155c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
155d0 2f 2a 20 4f 55 54 3a 20 54 72 75 65 20 69 66 20  /* OUT: True if 
155e0 2a 6d 69 67 68 74 2a 20 62 65 20 6e 65 77 20 74  *might* be new t
155f0 65 72 6d 20 2a 2f 0a 29 7b 0a 20 20 61 73 73 65  erm */.){.  asse
15600 72 74 28 20 70 49 74 65 72 2d 3e 62 53 6b 69 70  rt( pIter->bSkip
15610 45 6d 70 74 79 20 29 3b 0a 20 20 69 66 28 20 70  Empty );.  if( p
15620 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
15630 29 7b 0a 20 20 20 20 64 6f 20 7b 0a 20 20 20 20  ){.    do {.    
15640 20 20 69 6e 74 20 69 46 69 72 73 74 20 3d 20 70    int iFirst = p
15650 49 74 65 72 2d 3e 61 46 69 72 73 74 5b 31 5d 2e  Iter->aFirst[1].
15660 69 46 69 72 73 74 3b 0a 20 20 20 20 20 20 46 74  iFirst;.      Ft
15670 73 35 53 65 67 49 74 65 72 20 2a 70 53 65 67 20  s5SegIter *pSeg 
15680 3d 20 26 70 49 74 65 72 2d 3e 61 53 65 67 5b 69  = &pIter->aSeg[i
15690 46 69 72 73 74 5d 3b 0a 20 20 20 20 20 20 69 6e  First];.      in
156a0 74 20 62 4e 65 77 54 65 72 6d 20 3d 20 30 3b 0a  t bNewTerm = 0;.
156b0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
156c0 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
156d0 29 3b 0a 20 20 20 20 20 20 70 53 65 67 2d 3e 78  );.      pSeg->x
156e0 4e 65 78 74 28 70 2c 20 70 53 65 67 2c 20 26 62  Next(p, pSeg, &b
156f0 4e 65 77 54 65 72 6d 29 3b 0a 20 20 20 20 20 20  NewTerm);.      
15700 69 66 28 20 70 53 65 67 2d 3e 70 4c 65 61 66 3d  if( pSeg->pLeaf=
15710 3d 30 20 7c 7c 20 62 4e 65 77 54 65 72 6d 20 0a  =0 || bNewTerm .
15720 20 20 20 20 20 20 20 7c 7c 20 66 74 73 35 4d 75         || fts5Mu
15730 6c 74 69 49 74 65 72 41 64 76 61 6e 63 65 52 6f  ltiIterAdvanceRo
15740 77 69 64 28 70 49 74 65 72 2c 20 69 46 69 72 73  wid(pIter, iFirs
15750 74 2c 20 26 70 53 65 67 29 0a 20 20 20 20 20 20  t, &pSeg).      
15760 29 7b 0a 20 20 20 20 20 20 20 20 66 74 73 35 4d  ){.        fts5M
15770 75 6c 74 69 49 74 65 72 41 64 76 61 6e 63 65 64  ultiIterAdvanced
15780 28 70 2c 20 70 49 74 65 72 2c 20 69 46 69 72 73  (p, pIter, iFirs
15790 74 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 66  t, 1);.        f
157a0 74 73 35 4d 75 6c 74 69 49 74 65 72 53 65 74 45  ts5MultiIterSetE
157b0 6f 66 28 70 49 74 65 72 29 3b 0a 20 20 20 20 20  of(pIter);.     
157c0 20 20 20 2a 70 62 4e 65 77 54 65 72 6d 20 3d 20     *pbNewTerm = 
157d0 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  1;.      }else{.
157e0 20 20 20 20 20 20 20 20 2a 70 62 4e 65 77 54 65          *pbNewTe
157f0 72 6d 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a  rm = 0;.      }.
15800 20 20 20 20 20 20 66 74 73 35 41 73 73 65 72 74        fts5Assert
15810 4d 75 6c 74 69 49 74 65 72 53 65 74 75 70 28 70  MultiIterSetup(p
15820 2c 20 70 49 74 65 72 29 3b 0a 0a 20 20 20 20 7d  , pIter);..    }
15830 77 68 69 6c 65 28 20 66 74 73 35 4d 75 6c 74 69  while( fts5Multi
15840 49 74 65 72 49 73 45 6d 70 74 79 28 70 2c 20 70  IterIsEmpty(p, p
15850 49 74 65 72 29 20 29 3b 0a 20 20 7d 0a 7d 0a 0a  Iter) );.  }.}..
15860 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
15870 49 74 65 72 53 65 74 4f 75 74 70 75 74 73 5f 4e  IterSetOutputs_N
15880 6f 6f 70 28 46 74 73 35 49 74 65 72 20 2a 70 55  oop(Fts5Iter *pU
15890 6e 75 73 65 64 31 2c 20 46 74 73 35 53 65 67 49  nused1, Fts5SegI
158a0 74 65 72 20 2a 70 55 6e 75 73 65 64 32 29 7b 0a  ter *pUnused2){.
158b0 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 32 28    UNUSED_PARAM2(
158c0 70 55 6e 75 73 65 64 31 2c 20 70 55 6e 75 73 65  pUnused1, pUnuse
158d0 64 32 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 46  d2);.}..static F
158e0 74 73 35 49 74 65 72 20 2a 66 74 73 35 4d 75 6c  ts5Iter *fts5Mul
158f0 74 69 49 74 65 72 41 6c 6c 6f 63 28 0a 20 20 46  tiIterAlloc(.  F
15900 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20  ts5Index *p,    
15910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
15920 2a 20 46 54 53 35 20 62 61 63 6b 65 6e 64 20 74  * FTS5 backend t
15930 6f 20 69 74 65 72 61 74 65 20 77 69 74 68 69 6e  o iterate within
15940 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 65 67 0a 29   */.  int nSeg.)
15950 7b 0a 20 20 46 74 73 35 49 74 65 72 20 2a 70 4e  {.  Fts5Iter *pN
15960 65 77 3b 0a 20 20 69 6e 74 20 6e 53 6c 6f 74 3b  ew;.  int nSlot;
15970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15980 20 20 20 20 20 20 2f 2a 20 50 6f 77 65 72 20 6f        /* Power o
15990 66 20 74 77 6f 20 3e 3d 20 6e 53 65 67 20 2a 2f  f two >= nSeg */
159a0 0a 0a 20 20 66 6f 72 28 6e 53 6c 6f 74 3d 32 3b  ..  for(nSlot=2;
159b0 20 6e 53 6c 6f 74 3c 6e 53 65 67 3b 20 6e 53 6c   nSlot<nSeg; nSl
159c0 6f 74 3d 6e 53 6c 6f 74 2a 32 29 3b 0a 20 20 70  ot=nSlot*2);.  p
159d0 4e 65 77 20 3d 20 66 74 73 35 49 64 78 4d 61 6c  New = fts5IdxMal
159e0 6c 6f 63 28 70 2c 20 0a 20 20 20 20 20 20 73 69  loc(p, .      si
159f0 7a 65 6f 66 28 46 74 73 35 49 74 65 72 29 20 2b  zeof(Fts5Iter) +
15a00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15a10 20 20 2f 2a 20 70 4e 65 77 20 2a 2f 0a 20 20 20    /* pNew */.   
15a20 20 20 20 73 69 7a 65 6f 66 28 46 74 73 35 53 65     sizeof(Fts5Se
15a30 67 49 74 65 72 29 20 2a 20 28 6e 53 6c 6f 74 2d  gIter) * (nSlot-
15a40 31 29 20 2b 20 20 20 2f 2a 20 70 4e 65 77 2d 3e  1) +   /* pNew->
15a50 61 53 65 67 5b 5d 20 2a 2f 0a 20 20 20 20 20 20  aSeg[] */.      
15a60 73 69 7a 65 6f 66 28 46 74 73 35 43 52 65 73 75  sizeof(Fts5CResu
15a70 6c 74 29 20 2a 20 6e 53 6c 6f 74 20 20 20 20 20  lt) * nSlot     
15a80 20 20 20 20 2f 2a 20 70 4e 65 77 2d 3e 61 46 69      /* pNew->aFi
15a90 72 73 74 5b 5d 20 2a 2f 0a 20 20 29 3b 0a 20 20  rst[] */.  );.  
15aa0 69 66 28 20 70 4e 65 77 20 29 7b 0a 20 20 20 20  if( pNew ){.    
15ab0 70 4e 65 77 2d 3e 6e 53 65 67 20 3d 20 6e 53 6c  pNew->nSeg = nSl
15ac0 6f 74 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 61 46  ot;.    pNew->aF
15ad0 69 72 73 74 20 3d 20 28 46 74 73 35 43 52 65 73  irst = (Fts5CRes
15ae0 75 6c 74 2a 29 26 70 4e 65 77 2d 3e 61 53 65 67  ult*)&pNew->aSeg
15af0 5b 6e 53 6c 6f 74 5d 3b 0a 20 20 20 20 70 4e 65  [nSlot];.    pNe
15b00 77 2d 3e 70 49 6e 64 65 78 20 3d 20 70 3b 0a 20  w->pIndex = p;. 
15b10 20 20 20 70 4e 65 77 2d 3e 78 53 65 74 4f 75 74     pNew->xSetOut
15b20 70 75 74 73 20 3d 20 66 74 73 35 49 74 65 72 53  puts = fts5IterS
15b30 65 74 4f 75 74 70 75 74 73 5f 4e 6f 6f 70 3b 0a  etOutputs_Noop;.
15b40 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 4e 65    }.  return pNe
15b50 77 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69  w;.}..static voi
15b60 64 20 66 74 73 35 50 6f 73 6c 69 73 74 43 61 6c  d fts5PoslistCal
15b70 6c 62 61 63 6b 28 0a 20 20 46 74 73 35 49 6e 64  lback(.  Fts5Ind
15b80 65 78 20 2a 70 55 6e 75 73 65 64 2c 20 0a 20 20  ex *pUnused, .  
15b90 76 6f 69 64 20 2a 70 43 6f 6e 74 65 78 74 2c 20  void *pContext, 
15ba0 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 70 43 68  .  const u8 *pCh
15bb0 75 6e 6b 2c 20 69 6e 74 20 6e 43 68 75 6e 6b 0a  unk, int nChunk.
15bc0 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  ){.  UNUSED_PARA
15bd0 4d 28 70 55 6e 75 73 65 64 29 3b 0a 20 20 61 73  M(pUnused);.  as
15be0 73 65 72 74 5f 6e 63 28 20 6e 43 68 75 6e 6b 3e  sert_nc( nChunk>
15bf0 3d 30 20 29 3b 0a 20 20 69 66 28 20 6e 43 68 75  =0 );.  if( nChu
15c00 6e 6b 3e 30 20 29 7b 0a 20 20 20 20 66 74 73 35  nk>0 ){.    fts5
15c10 42 75 66 66 65 72 53 61 66 65 41 70 70 65 6e 64  BufferSafeAppend
15c20 42 6c 6f 62 28 28 46 74 73 35 42 75 66 66 65 72  Blob((Fts5Buffer
15c30 2a 29 70 43 6f 6e 74 65 78 74 2c 20 70 43 68 75  *)pContext, pChu
15c40 6e 6b 2c 20 6e 43 68 75 6e 6b 29 3b 0a 20 20 7d  nk, nChunk);.  }
15c50 0a 7d 0a 0a 74 79 70 65 64 65 66 20 73 74 72 75  .}..typedef stru
15c60 63 74 20 50 6f 73 6c 69 73 74 43 61 6c 6c 62 61  ct PoslistCallba
15c70 63 6b 43 74 78 20 50 6f 73 6c 69 73 74 43 61 6c  ckCtx PoslistCal
15c80 6c 62 61 63 6b 43 74 78 3b 0a 73 74 72 75 63 74  lbackCtx;.struct
15c90 20 50 6f 73 6c 69 73 74 43 61 6c 6c 62 61 63 6b   PoslistCallback
15ca0 43 74 78 20 7b 0a 20 20 46 74 73 35 42 75 66 66  Ctx {.  Fts5Buff
15cb0 65 72 20 2a 70 42 75 66 3b 20 20 20 20 20 20 20  er *pBuf;       
15cc0 20 20 20 20 20 20 20 20 2f 2a 20 41 70 70 65 6e          /* Appen
15cd0 64 20 74 6f 20 74 68 69 73 20 62 75 66 66 65 72  d to this buffer
15ce0 20 2a 2f 0a 20 20 46 74 73 35 43 6f 6c 73 65 74   */.  Fts5Colset
15cf0 20 2a 70 43 6f 6c 73 65 74 3b 20 20 20 20 20 20   *pColset;      
15d00 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63        /* Restric
15d10 74 20 6d 61 74 63 68 65 73 20 74 6f 20 74 68 69  t matches to thi
15d20 73 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 69 6e  s column */.  in
15d30 74 20 65 53 74 61 74 65 3b 20 20 20 20 20 20 20  t eState;       
15d40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
15d50 20 53 65 65 20 61 62 6f 76 65 20 2a 2f 0a 7d 3b   See above */.};
15d60 0a 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  ..typedef struct
15d70 20 50 6f 73 6c 69 73 74 4f 66 66 73 65 74 73 43   PoslistOffsetsC
15d80 74 78 20 50 6f 73 6c 69 73 74 4f 66 66 73 65 74  tx PoslistOffset
15d90 73 43 74 78 3b 0a 73 74 72 75 63 74 20 50 6f 73  sCtx;.struct Pos
15da0 6c 69 73 74 4f 66 66 73 65 74 73 43 74 78 20 7b  listOffsetsCtx {
15db0 0a 20 20 46 74 73 35 42 75 66 66 65 72 20 2a 70  .  Fts5Buffer *p
15dc0 42 75 66 3b 20 20 20 20 20 20 20 20 20 20 20 20  Buf;            
15dd0 20 20 20 2f 2a 20 41 70 70 65 6e 64 20 74 6f 20     /* Append to 
15de0 74 68 69 73 20 62 75 66 66 65 72 20 2a 2f 0a 20  this buffer */. 
15df0 20 46 74 73 35 43 6f 6c 73 65 74 20 2a 70 43 6f   Fts5Colset *pCo
15e00 6c 73 65 74 3b 20 20 20 20 20 20 20 20 20 20 20  lset;           
15e10 20 2f 2a 20 52 65 73 74 72 69 63 74 20 6d 61 74   /* Restrict mat
15e20 63 68 65 73 20 74 6f 20 74 68 69 73 20 63 6f 6c  ches to this col
15e30 75 6d 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 52 65  umn */.  int iRe
15e40 61 64 3b 0a 20 20 69 6e 74 20 69 57 72 69 74 65  ad;.  int iWrite
15e50 3b 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 4f 44 4f  ;.};../*.** TODO
15e60 3a 20 4d 61 6b 65 20 74 68 69 73 20 6d 6f 72 65  : Make this more
15e70 20 65 66 66 69 63 69 65 6e 74 21 0a 2a 2f 0a 73   efficient!.*/.s
15e80 74 61 74 69 63 20 69 6e 74 20 66 74 73 35 49 6e  tatic int fts5In
15e90 64 65 78 43 6f 6c 73 65 74 54 65 73 74 28 46 74  dexColsetTest(Ft
15ea0 73 35 43 6f 6c 73 65 74 20 2a 70 43 6f 6c 73 65  s5Colset *pColse
15eb0 74 2c 20 69 6e 74 20 69 43 6f 6c 29 7b 0a 20 20  t, int iCol){.  
15ec0 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30  int i;.  for(i=0
15ed0 3b 20 69 3c 70 43 6f 6c 73 65 74 2d 3e 6e 43 6f  ; i<pColset->nCo
15ee0 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  l; i++){.    if(
15ef0 20 70 43 6f 6c 73 65 74 2d 3e 61 69 43 6f 6c 5b   pColset->aiCol[
15f00 69 5d 3d 3d 69 43 6f 6c 20 29 20 72 65 74 75 72  i]==iCol ) retur
15f10 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  n 1;.  }.  retur
15f20 6e 20 30 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76  n 0;.}..static v
15f30 6f 69 64 20 66 74 73 35 50 6f 73 6c 69 73 74 4f  oid fts5PoslistO
15f40 66 66 73 65 74 73 43 61 6c 6c 62 61 63 6b 28 0a  ffsetsCallback(.
15f50 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 55 6e    Fts5Index *pUn
15f60 75 73 65 64 2c 20 0a 20 20 76 6f 69 64 20 2a 70  used, .  void *p
15f70 43 6f 6e 74 65 78 74 2c 20 0a 20 20 63 6f 6e 73  Context, .  cons
15f80 74 20 75 38 20 2a 70 43 68 75 6e 6b 2c 20 69 6e  t u8 *pChunk, in
15f90 74 20 6e 43 68 75 6e 6b 0a 29 7b 0a 20 20 50 6f  t nChunk.){.  Po
15fa0 73 6c 69 73 74 4f 66 66 73 65 74 73 43 74 78 20  slistOffsetsCtx 
15fb0 2a 70 43 74 78 20 3d 20 28 50 6f 73 6c 69 73 74  *pCtx = (Poslist
15fc0 4f 66 66 73 65 74 73 43 74 78 2a 29 70 43 6f 6e  OffsetsCtx*)pCon
15fd0 74 65 78 74 3b 0a 20 20 55 4e 55 53 45 44 5f 50  text;.  UNUSED_P
15fe0 41 52 41 4d 28 70 55 6e 75 73 65 64 29 3b 0a 20  ARAM(pUnused);. 
15ff0 20 61 73 73 65 72 74 5f 6e 63 28 20 6e 43 68 75   assert_nc( nChu
16000 6e 6b 3e 3d 30 20 29 3b 0a 20 20 69 66 28 20 6e  nk>=0 );.  if( n
16010 43 68 75 6e 6b 3e 30 20 29 7b 0a 20 20 20 20 69  Chunk>0 ){.    i
16020 6e 74 20 69 20 3d 20 30 3b 0a 20 20 20 20 77 68  nt i = 0;.    wh
16030 69 6c 65 28 20 69 3c 6e 43 68 75 6e 6b 20 29 7b  ile( i<nChunk ){
16040 0a 20 20 20 20 20 20 69 6e 74 20 69 56 61 6c 3b  .      int iVal;
16050 0a 20 20 20 20 20 20 69 20 2b 3d 20 66 74 73 35  .      i += fts5
16060 47 65 74 56 61 72 69 6e 74 33 32 28 26 70 43 68  GetVarint32(&pCh
16070 75 6e 6b 5b 69 5d 2c 20 69 56 61 6c 29 3b 0a 20  unk[i], iVal);. 
16080 20 20 20 20 20 69 56 61 6c 20 2b 3d 20 70 43 74       iVal += pCt
16090 78 2d 3e 69 52 65 61 64 20 2d 20 32 3b 0a 20 20  x->iRead - 2;.  
160a0 20 20 20 20 70 43 74 78 2d 3e 69 52 65 61 64 20      pCtx->iRead 
160b0 3d 20 69 56 61 6c 3b 0a 20 20 20 20 20 20 69 66  = iVal;.      if
160c0 28 20 66 74 73 35 49 6e 64 65 78 43 6f 6c 73 65  ( fts5IndexColse
160d0 74 54 65 73 74 28 70 43 74 78 2d 3e 70 43 6f 6c  tTest(pCtx->pCol
160e0 73 65 74 2c 20 69 56 61 6c 29 20 29 7b 0a 20 20  set, iVal) ){.  
160f0 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72        fts5Buffer
16100 53 61 66 65 41 70 70 65 6e 64 56 61 72 69 6e 74  SafeAppendVarint
16110 28 70 43 74 78 2d 3e 70 42 75 66 2c 20 69 56 61  (pCtx->pBuf, iVa
16120 6c 20 2b 20 32 20 2d 20 70 43 74 78 2d 3e 69 57  l + 2 - pCtx->iW
16130 72 69 74 65 29 3b 0a 20 20 20 20 20 20 20 20 70  rite);.        p
16140 43 74 78 2d 3e 69 57 72 69 74 65 20 3d 20 69 56  Ctx->iWrite = iV
16150 61 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  al;.      }.    
16160 7d 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63 20  }.  }.}..static 
16170 76 6f 69 64 20 66 74 73 35 50 6f 73 6c 69 73 74  void fts5Poslist
16180 46 69 6c 74 65 72 43 61 6c 6c 62 61 63 6b 28 0a  FilterCallback(.
16190 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 55 6e    Fts5Index *pUn
161a0 75 73 65 64 2c 0a 20 20 76 6f 69 64 20 2a 70 43  used,.  void *pC
161b0 6f 6e 74 65 78 74 2c 20 0a 20 20 63 6f 6e 73 74  ontext, .  const
161c0 20 75 38 20 2a 70 43 68 75 6e 6b 2c 20 69 6e 74   u8 *pChunk, int
161d0 20 6e 43 68 75 6e 6b 0a 29 7b 0a 20 20 50 6f 73   nChunk.){.  Pos
161e0 6c 69 73 74 43 61 6c 6c 62 61 63 6b 43 74 78 20  listCallbackCtx 
161f0 2a 70 43 74 78 20 3d 20 28 50 6f 73 6c 69 73 74  *pCtx = (Poslist
16200 43 61 6c 6c 62 61 63 6b 43 74 78 2a 29 70 43 6f  CallbackCtx*)pCo
16210 6e 74 65 78 74 3b 0a 20 20 55 4e 55 53 45 44 5f  ntext;.  UNUSED_
16220 50 41 52 41 4d 28 70 55 6e 75 73 65 64 29 3b 0a  PARAM(pUnused);.
16230 20 20 61 73 73 65 72 74 5f 6e 63 28 20 6e 43 68    assert_nc( nCh
16240 75 6e 6b 3e 3d 30 20 29 3b 0a 20 20 69 66 28 20  unk>=0 );.  if( 
16250 6e 43 68 75 6e 6b 3e 30 20 29 7b 0a 20 20 20 20  nChunk>0 ){.    
16260 2f 2a 20 53 65 61 72 63 68 20 74 68 72 6f 75 67  /* Search throug
16270 68 20 74 6f 20 66 69 6e 64 20 74 68 65 20 66 69  h to find the fi
16280 72 73 74 20 76 61 72 69 6e 74 20 77 69 74 68 20  rst varint with 
16290 76 61 6c 75 65 20 31 2e 20 54 68 69 73 20 69 73  value 1. This is
162a0 20 74 68 65 0a 20 20 20 20 2a 2a 20 73 74 61 72   the.    ** star
162b0 74 20 6f 66 20 74 68 65 20 6e 65 78 74 20 63 6f  t of the next co
162c0 6c 75 6d 6e 73 20 68 69 74 73 2e 20 2a 2f 0a 20  lumns hits. */. 
162d0 20 20 20 69 6e 74 20 69 20 3d 20 30 3b 0a 20 20     int i = 0;.  
162e0 20 20 69 6e 74 20 69 53 74 61 72 74 20 3d 20 30    int iStart = 0
162f0 3b 0a 0a 20 20 20 20 69 66 28 20 70 43 74 78 2d  ;..    if( pCtx-
16300 3e 65 53 74 61 74 65 3d 3d 32 20 29 7b 0a 20 20  >eState==2 ){.  
16310 20 20 20 20 69 6e 74 20 69 43 6f 6c 3b 0a 20 20      int iCol;.  
16320 20 20 20 20 66 74 73 35 46 61 73 74 47 65 74 56      fts5FastGetV
16330 61 72 69 6e 74 33 32 28 70 43 68 75 6e 6b 2c 20  arint32(pChunk, 
16340 69 2c 20 69 43 6f 6c 29 3b 0a 20 20 20 20 20 20  i, iCol);.      
16350 69 66 28 20 66 74 73 35 49 6e 64 65 78 43 6f 6c  if( fts5IndexCol
16360 73 65 74 54 65 73 74 28 70 43 74 78 2d 3e 70 43  setTest(pCtx->pC
16370 6f 6c 73 65 74 2c 20 69 43 6f 6c 29 20 29 7b 0a  olset, iCol) ){.
16380 20 20 20 20 20 20 20 20 70 43 74 78 2d 3e 65 53          pCtx->eS
16390 74 61 74 65 20 3d 20 31 3b 0a 20 20 20 20 20 20  tate = 1;.      
163a0 20 20 66 74 73 35 42 75 66 66 65 72 53 61 66 65    fts5BufferSafe
163b0 41 70 70 65 6e 64 56 61 72 69 6e 74 28 70 43 74  AppendVarint(pCt
163c0 78 2d 3e 70 42 75 66 2c 20 31 29 3b 0a 20 20 20  x->pBuf, 1);.   
163d0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
163e0 20 20 70 43 74 78 2d 3e 65 53 74 61 74 65 20 3d    pCtx->eState =
163f0 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   0;.      }.    
16400 7d 0a 0a 20 20 20 20 64 6f 20 7b 0a 20 20 20 20  }..    do {.    
16410 20 20 77 68 69 6c 65 28 20 69 3c 6e 43 68 75 6e    while( i<nChun
16420 6b 20 26 26 20 70 43 68 75 6e 6b 5b 69 5d 21 3d  k && pChunk[i]!=
16430 30 78 30 31 20 29 7b 0a 20 20 20 20 20 20 20 20  0x01 ){.        
16440 77 68 69 6c 65 28 20 70 43 68 75 6e 6b 5b 69 5d  while( pChunk[i]
16450 20 26 20 30 78 38 30 20 29 20 69 2b 2b 3b 0a 20   & 0x80 ) i++;. 
16460 20 20 20 20 20 20 20 69 2b 2b 3b 0a 20 20 20 20         i++;.    
16470 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 43    }.      if( pC
16480 74 78 2d 3e 65 53 74 61 74 65 20 29 7b 0a 20 20  tx->eState ){.  
16490 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72        fts5Buffer
164a0 53 61 66 65 41 70 70 65 6e 64 42 6c 6f 62 28 70  SafeAppendBlob(p
164b0 43 74 78 2d 3e 70 42 75 66 2c 20 26 70 43 68 75  Ctx->pBuf, &pChu
164c0 6e 6b 5b 69 53 74 61 72 74 5d 2c 20 69 2d 69 53  nk[iStart], i-iS
164d0 74 61 72 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20  tart);.      }. 
164e0 20 20 20 20 20 69 66 28 20 69 3c 6e 43 68 75 6e       if( i<nChun
164f0 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  k ){.        int
16500 20 69 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20 69   iCol;.        i
16510 53 74 61 72 74 20 3d 20 69 3b 0a 20 20 20 20 20  Start = i;.     
16520 20 20 20 69 2b 2b 3b 0a 20 20 20 20 20 20 20 20     i++;.        
16530 69 66 28 20 69 3e 3d 6e 43 68 75 6e 6b 20 29 7b  if( i>=nChunk ){
16540 0a 20 20 20 20 20 20 20 20 20 20 70 43 74 78 2d  .          pCtx-
16550 3e 65 53 74 61 74 65 20 3d 20 32 3b 0a 20 20 20  >eState = 2;.   
16560 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
16570 20 20 20 20 20 20 66 74 73 35 46 61 73 74 47 65        fts5FastGe
16580 74 56 61 72 69 6e 74 33 32 28 70 43 68 75 6e 6b  tVarint32(pChunk
16590 2c 20 69 2c 20 69 43 6f 6c 29 3b 0a 20 20 20 20  , i, iCol);.    
165a0 20 20 20 20 20 20 70 43 74 78 2d 3e 65 53 74 61        pCtx->eSta
165b0 74 65 20 3d 20 66 74 73 35 49 6e 64 65 78 43 6f  te = fts5IndexCo
165c0 6c 73 65 74 54 65 73 74 28 70 43 74 78 2d 3e 70  lsetTest(pCtx->p
165d0 43 6f 6c 73 65 74 2c 20 69 43 6f 6c 29 3b 0a 20  Colset, iCol);. 
165e0 20 20 20 20 20 20 20 20 20 69 66 28 20 70 43 74           if( pCt
165f0 78 2d 3e 65 53 74 61 74 65 20 29 7b 0a 20 20 20  x->eState ){.   
16600 20 20 20 20 20 20 20 20 20 66 74 73 35 42 75 66           fts5Buf
16610 66 65 72 53 61 66 65 41 70 70 65 6e 64 42 6c 6f  ferSafeAppendBlo
16620 62 28 70 43 74 78 2d 3e 70 42 75 66 2c 20 26 70  b(pCtx->pBuf, &p
16630 43 68 75 6e 6b 5b 69 53 74 61 72 74 5d 2c 20 69  Chunk[iStart], i
16640 2d 69 53 74 61 72 74 29 3b 0a 20 20 20 20 20 20  -iStart);.      
16650 20 20 20 20 20 20 69 53 74 61 72 74 20 3d 20 69        iStart = i
16660 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
16670 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
16680 20 20 20 20 7d 77 68 69 6c 65 28 20 69 3c 6e 43      }while( i<nC
16690 68 75 6e 6b 20 29 3b 0a 20 20 7d 0a 7d 0a 0a 73  hunk );.  }.}..s
166a0 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 43  tatic void fts5C
166b0 68 75 6e 6b 49 74 65 72 61 74 65 28 0a 20 20 46  hunkIterate(.  F
166c0 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20  ts5Index *p,    
166d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
166e0 2a 20 49 6e 64 65 78 20 6f 62 6a 65 63 74 20 2a  * Index object *
166f0 2f 0a 20 20 46 74 73 35 53 65 67 49 74 65 72 20  /.  Fts5SegIter 
16700 2a 70 53 65 67 2c 20 20 20 20 20 20 20 20 20 20  *pSeg,          
16710 20 20 20 20 2f 2a 20 50 6f 73 6c 69 73 74 20 6f      /* Poslist o
16720 66 20 74 68 69 73 20 69 74 65 72 61 74 6f 72 20  f this iterator 
16730 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 43 74 78 2c  */.  void *pCtx,
16740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16750 20 20 20 20 20 2f 2a 20 43 6f 6e 74 65 78 74 20       /* Context 
16760 70 6f 69 6e 74 65 72 20 66 6f 72 20 78 43 68 75  pointer for xChu
16770 6e 6b 20 63 61 6c 6c 62 61 63 6b 20 2a 2f 0a 20  nk callback */. 
16780 20 76 6f 69 64 20 28 2a 78 43 68 75 6e 6b 29 28   void (*xChunk)(
16790 46 74 73 35 49 6e 64 65 78 2a 2c 20 76 6f 69 64  Fts5Index*, void
167a0 2a 2c 20 63 6f 6e 73 74 20 75 38 2a 2c 20 69 6e  *, const u8*, in
167b0 74 29 0a 29 7b 0a 20 20 69 6e 74 20 6e 52 65 6d  t).){.  int nRem
167c0 20 3d 20 70 53 65 67 2d 3e 6e 50 6f 73 3b 20 20   = pSeg->nPos;  
167d0 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
167e0 72 20 6f 66 20 62 79 74 65 73 20 73 74 69 6c 6c  r of bytes still
167f0 20 74 6f 20 63 6f 6d 65 20 2a 2f 0a 20 20 46 74   to come */.  Ft
16800 73 35 44 61 74 61 20 2a 70 44 61 74 61 20 3d 20  s5Data *pData = 
16810 30 3b 0a 20 20 75 38 20 2a 70 43 68 75 6e 6b 20  0;.  u8 *pChunk 
16820 3d 20 26 70 53 65 67 2d 3e 70 4c 65 61 66 2d 3e  = &pSeg->pLeaf->
16830 70 5b 70 53 65 67 2d 3e 69 4c 65 61 66 4f 66 66  p[pSeg->iLeafOff
16840 73 65 74 5d 3b 0a 20 20 69 6e 74 20 6e 43 68 75  set];.  int nChu
16850 6e 6b 20 3d 20 4d 49 4e 28 6e 52 65 6d 2c 20 70  nk = MIN(nRem, p
16860 53 65 67 2d 3e 70 4c 65 61 66 2d 3e 73 7a 4c 65  Seg->pLeaf->szLe
16870 61 66 20 2d 20 70 53 65 67 2d 3e 69 4c 65 61 66  af - pSeg->iLeaf
16880 4f 66 66 73 65 74 29 3b 0a 20 20 69 6e 74 20 70  Offset);.  int p
16890 67 6e 6f 20 3d 20 70 53 65 67 2d 3e 69 4c 65 61  gno = pSeg->iLea
168a0 66 50 67 6e 6f 3b 0a 20 20 69 6e 74 20 70 67 6e  fPgno;.  int pgn
168b0 6f 53 61 76 65 20 3d 20 30 3b 0a 0a 20 20 2f 2a  oSave = 0;..  /*
168c0 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 64   This function d
168d0 6f 65 73 20 6e 6f 74 6d 77 6f 72 6b 20 77 69 74  oes notmwork wit
168e0 68 20 64 65 74 61 69 6c 3d 6e 6f 6e 65 20 64 61  h detail=none da
168f0 74 61 62 61 73 65 73 2e 20 2a 2f 0a 20 20 61 73  tabases. */.  as
16900 73 65 72 74 28 20 70 2d 3e 70 43 6f 6e 66 69 67  sert( p->pConfig
16910 2d 3e 65 44 65 74 61 69 6c 21 3d 46 54 53 35 5f  ->eDetail!=FTS5_
16920 44 45 54 41 49 4c 5f 4e 4f 4e 45 20 29 3b 0a 0a  DETAIL_NONE );..
16930 20 20 69 66 28 20 28 70 53 65 67 2d 3e 66 6c 61    if( (pSeg->fla
16940 67 73 20 26 20 46 54 53 35 5f 53 45 47 49 54 45  gs & FTS5_SEGITE
16950 52 5f 52 45 56 45 52 53 45 29 3d 3d 30 20 29 7b  R_REVERSE)==0 ){
16960 0a 20 20 20 20 70 67 6e 6f 53 61 76 65 20 3d 20  .    pgnoSave = 
16970 70 67 6e 6f 2b 31 3b 0a 20 20 7d 0a 0a 20 20 77  pgno+1;.  }..  w
16980 68 69 6c 65 28 20 31 20 29 7b 0a 20 20 20 20 78  hile( 1 ){.    x
16990 43 68 75 6e 6b 28 70 2c 20 70 43 74 78 2c 20 70  Chunk(p, pCtx, p
169a0 43 68 75 6e 6b 2c 20 6e 43 68 75 6e 6b 29 3b 0a  Chunk, nChunk);.
169b0 20 20 20 20 6e 52 65 6d 20 2d 3d 20 6e 43 68 75      nRem -= nChu
169c0 6e 6b 3b 0a 20 20 20 20 66 74 73 35 44 61 74 61  nk;.    fts5Data
169d0 52 65 6c 65 61 73 65 28 70 44 61 74 61 29 3b 0a  Release(pData);.
169e0 20 20 20 20 69 66 28 20 6e 52 65 6d 3c 3d 30 20      if( nRem<=0 
169f0 29 7b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  ){.      break;.
16a00 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
16a10 20 70 67 6e 6f 2b 2b 3b 0a 20 20 20 20 20 20 70   pgno++;.      p
16a20 44 61 74 61 20 3d 20 66 74 73 35 44 61 74 61 52  Data = fts5DataR
16a30 65 61 64 28 70 2c 20 46 54 53 35 5f 53 45 47 4d  ead(p, FTS5_SEGM
16a40 45 4e 54 5f 52 4f 57 49 44 28 70 53 65 67 2d 3e  ENT_ROWID(pSeg->
16a50 70 53 65 67 2d 3e 69 53 65 67 69 64 2c 20 70 67  pSeg->iSegid, pg
16a60 6e 6f 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20  no));.      if( 
16a70 70 44 61 74 61 3d 3d 30 20 29 20 62 72 65 61 6b  pData==0 ) break
16a80 3b 0a 20 20 20 20 20 20 70 43 68 75 6e 6b 20 3d  ;.      pChunk =
16a90 20 26 70 44 61 74 61 2d 3e 70 5b 34 5d 3b 0a 20   &pData->p[4];. 
16aa0 20 20 20 20 20 6e 43 68 75 6e 6b 20 3d 20 4d 49       nChunk = MI
16ab0 4e 28 6e 52 65 6d 2c 20 70 44 61 74 61 2d 3e 73  N(nRem, pData->s
16ac0 7a 4c 65 61 66 20 2d 20 34 29 3b 0a 20 20 20 20  zLeaf - 4);.    
16ad0 20 20 69 66 28 20 70 67 6e 6f 3d 3d 70 67 6e 6f    if( pgno==pgno
16ae0 53 61 76 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Save ){.        
16af0 61 73 73 65 72 74 28 20 70 53 65 67 2d 3e 70 4e  assert( pSeg->pN
16b00 65 78 74 4c 65 61 66 3d 3d 30 20 29 3b 0a 20 20  extLeaf==0 );.  
16b10 20 20 20 20 20 20 70 53 65 67 2d 3e 70 4e 65 78        pSeg->pNex
16b20 74 4c 65 61 66 20 3d 20 70 44 61 74 61 3b 0a 20  tLeaf = pData;. 
16b30 20 20 20 20 20 20 20 70 44 61 74 61 20 3d 20 30         pData = 0
16b40 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
16b50 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 74 65    }.}../*.** Ite
16b60 72 61 74 6f 72 20 70 49 74 65 72 20 63 75 72 72  rator pIter curr
16b70 65 6e 74 6c 79 20 70 6f 69 6e 74 73 20 74 6f 20  ently points to 
16b80 61 20 76 61 6c 69 64 20 65 6e 74 72 79 20 28 6e  a valid entry (n
16b90 6f 74 20 45 4f 46 29 2e 20 54 68 69 73 0a 2a 2a  ot EOF). This.**
16ba0 20 66 75 6e 63 74 69 6f 6e 20 61 70 70 65 6e 64   function append
16bb0 73 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 20 6c  s the position l
16bc0 69 73 74 20 64 61 74 61 20 66 6f 72 20 74 68 65  ist data for the
16bd0 20 63 75 72 72 65 6e 74 20 65 6e 74 72 79 20 74   current entry t
16be0 6f 0a 2a 2a 20 62 75 66 66 65 72 20 70 42 75 66  o.** buffer pBuf
16bf0 2e 20 49 74 20 64 6f 65 73 20 6e 6f 74 20 6d 61  . It does not ma
16c00 6b 65 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65  ke a copy of the
16c10 20 70 6f 73 69 74 69 6f 6e 2d 6c 69 73 74 20 73   position-list s
16c20 69 7a 65 0a 2a 2a 20 66 69 65 6c 64 2e 0a 2a 2f  ize.** field..*/
16c30 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
16c40 35 53 65 67 69 74 65 72 50 6f 73 6c 69 73 74 28  5SegiterPoslist(
16c50 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c  .  Fts5Index *p,
16c60 0a 20 20 46 74 73 35 53 65 67 49 74 65 72 20 2a  .  Fts5SegIter *
16c70 70 53 65 67 2c 0a 20 20 46 74 73 35 43 6f 6c 73  pSeg,.  Fts5Cols
16c80 65 74 20 2a 70 43 6f 6c 73 65 74 2c 0a 20 20 46  et *pColset,.  F
16c90 74 73 35 42 75 66 66 65 72 20 2a 70 42 75 66 0a  ts5Buffer *pBuf.
16ca0 29 7b 0a 20 20 69 66 28 20 30 3d 3d 66 74 73 35  ){.  if( 0==fts5
16cb0 42 75 66 66 65 72 47 72 6f 77 28 26 70 2d 3e 72  BufferGrow(&p->r
16cc0 63 2c 20 70 42 75 66 2c 20 70 53 65 67 2d 3e 6e  c, pBuf, pSeg->n
16cd0 50 6f 73 29 20 29 7b 0a 20 20 20 20 69 66 28 20  Pos) ){.    if( 
16ce0 70 43 6f 6c 73 65 74 3d 3d 30 20 29 7b 0a 20 20  pColset==0 ){.  
16cf0 20 20 20 20 66 74 73 35 43 68 75 6e 6b 49 74 65      fts5ChunkIte
16d00 72 61 74 65 28 70 2c 20 70 53 65 67 2c 20 28 76  rate(p, pSeg, (v
16d10 6f 69 64 2a 29 70 42 75 66 2c 20 66 74 73 35 50  oid*)pBuf, fts5P
16d20 6f 73 6c 69 73 74 43 61 6c 6c 62 61 63 6b 29 3b  oslistCallback);
16d30 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
16d40 20 20 69 66 28 20 70 2d 3e 70 43 6f 6e 66 69 67    if( p->pConfig
16d50 2d 3e 65 44 65 74 61 69 6c 3d 3d 46 54 53 35 5f  ->eDetail==FTS5_
16d60 44 45 54 41 49 4c 5f 46 55 4c 4c 20 29 7b 0a 20  DETAIL_FULL ){. 
16d70 20 20 20 20 20 20 20 50 6f 73 6c 69 73 74 43 61         PoslistCa
16d80 6c 6c 62 61 63 6b 43 74 78 20 73 43 74 78 3b 0a  llbackCtx sCtx;.
16d90 20 20 20 20 20 20 20 20 73 43 74 78 2e 70 42 75          sCtx.pBu
16da0 66 20 3d 20 70 42 75 66 3b 0a 20 20 20 20 20 20  f = pBuf;.      
16db0 20 20 73 43 74 78 2e 70 43 6f 6c 73 65 74 20 3d    sCtx.pColset =
16dc0 20 70 43 6f 6c 73 65 74 3b 0a 20 20 20 20 20 20   pColset;.      
16dd0 20 20 73 43 74 78 2e 65 53 74 61 74 65 20 3d 20    sCtx.eState = 
16de0 66 74 73 35 49 6e 64 65 78 43 6f 6c 73 65 74 54  fts5IndexColsetT
16df0 65 73 74 28 70 43 6f 6c 73 65 74 2c 20 30 29 3b  est(pColset, 0);
16e00 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
16e10 20 73 43 74 78 2e 65 53 74 61 74 65 3d 3d 30 20   sCtx.eState==0 
16e20 7c 7c 20 73 43 74 78 2e 65 53 74 61 74 65 3d 3d  || sCtx.eState==
16e30 31 20 29 3b 0a 20 20 20 20 20 20 20 20 66 74 73  1 );.        fts
16e40 35 43 68 75 6e 6b 49 74 65 72 61 74 65 28 70 2c  5ChunkIterate(p,
16e50 20 70 53 65 67 2c 20 28 76 6f 69 64 2a 29 26 73   pSeg, (void*)&s
16e60 43 74 78 2c 20 66 74 73 35 50 6f 73 6c 69 73 74  Ctx, fts5Poslist
16e70 46 69 6c 74 65 72 43 61 6c 6c 62 61 63 6b 29 3b  FilterCallback);
16e80 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
16e90 20 20 20 20 20 20 50 6f 73 6c 69 73 74 4f 66 66        PoslistOff
16ea0 73 65 74 73 43 74 78 20 73 43 74 78 3b 0a 20 20  setsCtx sCtx;.  
16eb0 20 20 20 20 20 20 6d 65 6d 73 65 74 28 26 73 43        memset(&sC
16ec0 74 78 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 43  tx, 0, sizeof(sC
16ed0 74 78 29 29 3b 0a 20 20 20 20 20 20 20 20 73 43  tx));.        sC
16ee0 74 78 2e 70 42 75 66 20 3d 20 70 42 75 66 3b 0a  tx.pBuf = pBuf;.
16ef0 20 20 20 20 20 20 20 20 73 43 74 78 2e 70 43 6f          sCtx.pCo
16f00 6c 73 65 74 20 3d 20 70 43 6f 6c 73 65 74 3b 0a  lset = pColset;.
16f10 20 20 20 20 20 20 20 20 66 74 73 35 43 68 75 6e          fts5Chun
16f20 6b 49 74 65 72 61 74 65 28 70 2c 20 70 53 65 67  kIterate(p, pSeg
16f30 2c 20 28 76 6f 69 64 2a 29 26 73 43 74 78 2c 20  , (void*)&sCtx, 
16f40 66 74 73 35 50 6f 73 6c 69 73 74 4f 66 66 73 65  fts5PoslistOffse
16f50 74 73 43 61 6c 6c 62 61 63 6b 29 3b 0a 20 20 20  tsCallback);.   
16f60 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d     }.    }.  }.}
16f70 0a 0a 2f 2a 0a 2a 2a 20 49 4e 2f 4f 55 54 20 70  ../*.** IN/OUT p
16f80 61 72 61 6d 65 74 65 72 20 28 2a 70 61 29 20 70  arameter (*pa) p
16f90 6f 69 6e 74 73 20 74 6f 20 61 20 70 6f 73 69 74  oints to a posit
16fa0 69 6f 6e 20 6c 69 73 74 20 6e 20 62 79 74 65 73  ion list n bytes
16fb0 20 69 6e 20 73 69 7a 65 2e 20 49 66 0a 2a 2a 20   in size. If.** 
16fc0 74 68 65 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73  the position lis
16fd0 74 20 63 6f 6e 74 61 69 6e 73 20 65 6e 74 72 69  t contains entri
16fe0 65 73 20 66 6f 72 20 63 6f 6c 75 6d 6e 20 69 43  es for column iC
16ff0 6f 6c 2c 20 74 68 65 6e 20 28 2a 70 61 29 20 69  ol, then (*pa) i
17000 73 20 73 65 74 0a 2a 2a 20 74 6f 20 70 6f 69 6e  s set.** to poin
17010 74 20 74 6f 20 74 68 65 20 73 75 62 2d 70 6f 73  t to the sub-pos
17020 69 74 69 6f 6e 2d 6c 69 73 74 20 66 6f 72 20 74  ition-list for t
17030 68 61 74 20 63 6f 6c 75 6d 6e 20 61 6e 64 20 74  hat column and t
17040 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20  he number of.** 
17050 62 79 74 65 73 20 69 6e 20 69 74 20 72 65 74 75  bytes in it retu
17060 72 6e 65 64 2e 20 4f 72 2c 20 69 66 20 74 68 65  rned. Or, if the
17070 20 61 72 67 75 6d 65 6e 74 20 70 6f 73 69 74 69   argument positi
17080 6f 6e 20 6c 69 73 74 20 64 6f 65 73 20 6e 6f 74  on list does not
17090 0a 2a 2a 20 63 6f 6e 74 61 69 6e 20 61 6e 79 20  .** contain any 
170a0 65 6e 74 72 69 65 73 20 66 6f 72 20 63 6f 6c 75  entries for colu
170b0 6d 6e 20 69 43 6f 6c 2c 20 72 65 74 75 72 6e 20  mn iCol, return 
170c0 30 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  0..*/.static int
170d0 20 66 74 73 35 49 6e 64 65 78 45 78 74 72 61 63   fts5IndexExtrac
170e0 74 43 6f 6c 28 0a 20 20 63 6f 6e 73 74 20 75 38  tCol(.  const u8
170f0 20 2a 2a 70 61 2c 20 20 20 20 20 20 20 20 20 20   **pa,          
17100 20 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f 55          /* IN/OU
17110 54 3a 20 50 6f 69 6e 74 65 72 20 74 6f 20 70 6f  T: Pointer to po
17120 73 6c 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20 6e  slist */.  int n
17130 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
17140 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 4e             /* IN
17150 3a 20 53 69 7a 65 20 6f 66 20 70 6f 73 6c 69 73  : Size of poslis
17160 74 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20  t in bytes */.  
17170 69 6e 74 20 69 43 6f 6c 20 20 20 20 20 20 20 20  int iCol        
17180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17190 2f 2a 20 43 6f 6c 75 6d 6e 20 74 6f 20 65 78 74  /* Column to ext
171a0 72 61 63 74 20 66 72 6f 6d 20 70 6f 73 6c 69 73  ract from poslis
171b0 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 43  t */.){.  int iC
171c0 75 72 72 65 6e 74 20 3d 20 30 3b 20 20 20 20 20  urrent = 0;     
171d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 79            /* Any
171e0 74 68 69 6e 67 20 62 65 66 6f 72 65 20 74 68 65  thing before the
171f0 20 66 69 72 73 74 20 30 78 30 31 20 69 73 20 63   first 0x01 is c
17200 6f 6c 20 30 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  ol 0 */.  const 
17210 75 38 20 2a 70 20 3d 20 2a 70 61 3b 0a 20 20 63  u8 *p = *pa;.  c
17220 6f 6e 73 74 20 75 38 20 2a 70 45 6e 64 20 3d 20  onst u8 *pEnd = 
17230 26 70 5b 6e 5d 3b 20 20 20 20 20 20 20 20 20 2f  &p[n];         /
17240 2a 20 4f 6e 65 20 62 79 74 65 20 70 61 73 74 20  * One byte past 
17250 65 6e 64 20 6f 66 20 70 6f 73 69 74 69 6f 6e 20  end of position 
17260 6c 69 73 74 20 2a 2f 0a 0a 20 20 77 68 69 6c 65  list */..  while
17270 28 20 69 43 6f 6c 3e 69 43 75 72 72 65 6e 74 20  ( iCol>iCurrent 
17280 29 7b 0a 20 20 20 20 2f 2a 20 41 64 76 61 6e 63  ){.    /* Advanc
17290 65 20 70 6f 69 6e 74 65 72 20 70 20 75 6e 74 69  e pointer p unti
172a0 6c 20 69 74 20 70 6f 69 6e 74 73 20 74 6f 20 70  l it points to p
172b0 45 6e 64 20 6f 72 20 61 6e 20 30 78 30 31 20 62  End or an 0x01 b
172c0 79 74 65 20 74 68 61 74 20 69 73 0a 20 20 20 20  yte that is.    
172d0 2a 2a 20 6e 6f 74 20 70 61 72 74 20 6f 66 20 61  ** not part of a
172e0 20 76 61 72 69 6e 74 2e 20 4e 6f 74 65 20 74 68   varint. Note th
172f0 61 74 20 69 74 20 69 73 20 6e 6f 74 20 70 6f 73  at it is not pos
17300 73 69 62 6c 65 20 66 6f 72 20 61 20 6e 65 67 61  sible for a nega
17310 74 69 76 65 0a 20 20 20 20 2a 2a 20 6f 72 20 65  tive.    ** or e
17320 78 74 72 65 6d 65 6c 79 20 6c 61 72 67 65 20 76  xtremely large v
17330 61 72 69 6e 74 20 74 6f 20 6f 63 63 75 72 20 77  arint to occur w
17340 69 74 68 69 6e 20 61 6e 20 75 6e 63 6f 72 72 75  ithin an uncorru
17350 70 74 65 64 20 70 6f 73 69 74 69 6f 6e 20 0a 20  pted position . 
17360 20 20 20 2a 2a 20 6c 69 73 74 2e 20 53 6f 20 74     ** list. So t
17370 68 65 20 6c 61 73 74 20 62 79 74 65 20 6f 66 20  he last byte of 
17380 65 61 63 68 20 76 61 72 69 6e 74 20 6d 61 79 20  each varint may 
17390 62 65 20 61 73 73 75 6d 65 64 20 74 6f 20 68 61  be assumed to ha
173a0 76 65 20 61 20 63 6c 65 61 72 0a 20 20 20 20 2a  ve a clear.    *
173b0 2a 20 30 78 38 30 20 62 69 74 2e 20 20 2a 2f 0a  * 0x80 bit.  */.
173c0 20 20 20 20 77 68 69 6c 65 28 20 2a 70 21 3d 30      while( *p!=0
173d0 78 30 31 20 29 7b 0a 20 20 20 20 20 20 77 68 69  x01 ){.      whi
173e0 6c 65 28 20 2a 70 2b 2b 20 26 20 30 78 38 30 20  le( *p++ & 0x80 
173f0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 3e 3d  );.      if( p>=
17400 70 45 6e 64 20 29 20 72 65 74 75 72 6e 20 30 3b  pEnd ) return 0;
17410 0a 20 20 20 20 7d 0a 20 20 20 20 2a 70 61 20 3d  .    }.    *pa =
17420 20 70 2b 2b 3b 0a 20 20 20 20 69 43 75 72 72 65   p++;.    iCurre
17430 6e 74 20 3d 20 2a 70 2b 2b 3b 0a 20 20 20 20 69  nt = *p++;.    i
17440 66 28 20 69 43 75 72 72 65 6e 74 20 26 20 30 78  f( iCurrent & 0x
17450 38 30 20 29 7b 0a 20 20 20 20 20 20 70 2d 2d 3b  80 ){.      p--;
17460 0a 20 20 20 20 20 20 70 20 2b 3d 20 66 74 73 35  .      p += fts5
17470 47 65 74 56 61 72 69 6e 74 33 32 28 70 2c 20 69  GetVarint32(p, i
17480 43 75 72 72 65 6e 74 29 3b 0a 20 20 20 20 7d 0a  Current);.    }.
17490 20 20 7d 0a 20 20 69 66 28 20 69 43 6f 6c 21 3d    }.  if( iCol!=
174a0 69 43 75 72 72 65 6e 74 20 29 20 72 65 74 75 72  iCurrent ) retur
174b0 6e 20 30 3b 0a 0a 20 20 2f 2a 20 41 64 76 61 6e  n 0;..  /* Advan
174c0 63 65 20 70 6f 69 6e 74 65 72 20 70 20 75 6e 74  ce pointer p unt
174d0 69 6c 20 69 74 20 70 6f 69 6e 74 73 20 74 6f 20  il it points to 
174e0 70 45 6e 64 20 6f 72 20 61 6e 20 30 78 30 31 20  pEnd or an 0x01 
174f0 62 79 74 65 20 74 68 61 74 20 69 73 0a 20 20 2a  byte that is.  *
17500 2a 20 6e 6f 74 20 70 61 72 74 20 6f 66 20 61 20  * not part of a 
17510 76 61 72 69 6e 74 20 2a 2f 0a 20 20 77 68 69 6c  varint */.  whil
17520 65 28 20 70 3c 70 45 6e 64 20 26 26 20 2a 70 21  e( p<pEnd && *p!
17530 3d 30 78 30 31 20 29 7b 0a 20 20 20 20 77 68 69  =0x01 ){.    whi
17540 6c 65 28 20 2a 70 2b 2b 20 26 20 30 78 38 30 20  le( *p++ & 0x80 
17550 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  );.  }..  return
17560 20 70 20 2d 20 28 2a 70 61 29 3b 0a 7d 0a 0a 73   p - (*pa);.}..s
17570 74 61 74 69 63 20 69 6e 74 20 66 74 73 35 49 6e  tatic int fts5In
17580 64 65 78 45 78 74 72 61 63 74 43 6f 6c 73 65 74  dexExtractColset
17590 20 28 0a 20 20 46 74 73 35 43 6f 6c 73 65 74 20   (.  Fts5Colset 
175a0 2a 70 43 6f 6c 73 65 74 2c 20 20 20 20 20 20 20  *pColset,       
175b0 20 20 20 20 20 2f 2a 20 43 6f 6c 73 65 74 20 74       /* Colset t
175c0 6f 20 66 69 6c 74 65 72 20 6f 6e 20 2a 2f 0a 20  o filter on */. 
175d0 20 63 6f 6e 73 74 20 75 38 20 2a 70 50 6f 73 2c   const u8 *pPos,
175e0 20 69 6e 74 20 6e 50 6f 73 2c 20 20 20 20 20 20   int nPos,      
175f0 20 2f 2a 20 50 6f 73 69 74 69 6f 6e 20 6c 69 73   /* Position lis
17600 74 20 2a 2f 0a 20 20 46 74 73 35 42 75 66 66 65  t */.  Fts5Buffe
17610 72 20 2a 70 42 75 66 20 20 20 20 20 20 20 20 20  r *pBuf         
17620 20 20 20 20 20 20 20 2f 2a 20 4f 75 74 70 75 74         /* Output
17630 20 62 75 66 66 65 72 20 2a 2f 0a 29 7b 0a 20 20   buffer */.){.  
17640 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
17650 4f 4b 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20  OK;.  int i;..  
17660 66 74 73 35 42 75 66 66 65 72 5a 65 72 6f 28 70  fts5BufferZero(p
17670 42 75 66 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  Buf);.  for(i=0;
17680 20 69 3c 70 43 6f 6c 73 65 74 2d 3e 6e 43 6f 6c   i<pColset->nCol
17690 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63 6f 6e 73  ; i++){.    cons
176a0 74 20 75 38 20 2a 70 53 75 62 20 3d 20 70 50 6f  t u8 *pSub = pPo
176b0 73 3b 0a 20 20 20 20 69 6e 74 20 6e 53 75 62 20  s;.    int nSub 
176c0 3d 20 66 74 73 35 49 6e 64 65 78 45 78 74 72 61  = fts5IndexExtra
176d0 63 74 43 6f 6c 28 26 70 53 75 62 2c 20 6e 50 6f  ctCol(&pSub, nPo
176e0 73 2c 20 70 43 6f 6c 73 65 74 2d 3e 61 69 43 6f  s, pColset->aiCo
176f0 6c 5b 69 5d 29 3b 0a 20 20 20 20 69 66 28 20 6e  l[i]);.    if( n
17700 53 75 62 20 29 7b 0a 20 20 20 20 20 20 66 74 73  Sub ){.      fts
17710 35 42 75 66 66 65 72 41 70 70 65 6e 64 42 6c 6f  5BufferAppendBlo
17720 62 28 26 72 63 2c 20 70 42 75 66 2c 20 6e 53 75  b(&rc, pBuf, nSu
17730 62 2c 20 70 53 75 62 29 3b 0a 20 20 20 20 7d 0a  b, pSub);.    }.
17740 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
17750 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 78 53 65 74 4f 75  .}../*.** xSetOu
17760 74 70 75 74 73 20 63 61 6c 6c 62 61 63 6b 20 75  tputs callback u
17770 73 65 64 20 62 79 20 64 65 74 61 69 6c 3d 6e 6f  sed by detail=no
17780 6e 65 20 74 61 62 6c 65 73 2e 0a 2a 2f 0a 73 74  ne tables..*/.st
17790 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 49 74  atic void fts5It
177a0 65 72 53 65 74 4f 75 74 70 75 74 73 5f 4e 6f 6e  erSetOutputs_Non
177b0 65 28 46 74 73 35 49 74 65 72 20 2a 70 49 74 65  e(Fts5Iter *pIte
177c0 72 2c 20 46 74 73 35 53 65 67 49 74 65 72 20 2a  r, Fts5SegIter *
177d0 70 53 65 67 29 7b 0a 20 20 61 73 73 65 72 74 28  pSeg){.  assert(
177e0 20 70 49 74 65 72 2d 3e 70 49 6e 64 65 78 2d 3e   pIter->pIndex->
177f0 70 43 6f 6e 66 69 67 2d 3e 65 44 65 74 61 69 6c  pConfig->eDetail
17800 3d 3d 46 54 53 35 5f 44 45 54 41 49 4c 5f 4e 4f  ==FTS5_DETAIL_NO
17810 4e 45 20 29 3b 0a 20 20 70 49 74 65 72 2d 3e 62  NE );.  pIter->b
17820 61 73 65 2e 69 52 6f 77 69 64 20 3d 20 70 53 65  ase.iRowid = pSe
17830 67 2d 3e 69 52 6f 77 69 64 3b 0a 20 20 70 49 74  g->iRowid;.  pIt
17840 65 72 2d 3e 62 61 73 65 2e 6e 44 61 74 61 20 3d  er->base.nData =
17850 20 70 53 65 67 2d 3e 6e 50 6f 73 3b 0a 7d 0a 0a   pSeg->nPos;.}..
17860 2f 2a 0a 2a 2a 20 78 53 65 74 4f 75 74 70 75 74  /*.** xSetOutput
17870 73 20 63 61 6c 6c 62 61 63 6b 20 75 73 65 64 20  s callback used 
17880 62 79 20 64 65 74 61 69 6c 3d 66 75 6c 6c 20 61  by detail=full a
17890 6e 64 20 64 65 74 61 69 6c 3d 63 6f 6c 20 74 61  nd detail=col ta
178a0 62 6c 65 73 20 77 68 65 6e 20 6e 6f 0a 2a 2a 20  bles when no.** 
178b0 63 6f 6c 75 6d 6e 20 66 69 6c 74 65 72 73 20 61  column filters a
178c0 72 65 20 73 70 65 63 69 66 69 65 64 2e 0a 2a 2f  re specified..*/
178d0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
178e0 35 49 74 65 72 53 65 74 4f 75 74 70 75 74 73 5f  5IterSetOutputs_
178f0 4e 6f 63 6f 6c 73 65 74 28 46 74 73 35 49 74 65  Nocolset(Fts5Ite
17900 72 20 2a 70 49 74 65 72 2c 20 46 74 73 35 53 65  r *pIter, Fts5Se
17910 67 49 74 65 72 20 2a 70 53 65 67 29 7b 0a 20 20  gIter *pSeg){.  
17920 70 49 74 65 72 2d 3e 62 61 73 65 2e 69 52 6f 77  pIter->base.iRow
17930 69 64 20 3d 20 70 53 65 67 2d 3e 69 52 6f 77 69  id = pSeg->iRowi
17940 64 3b 0a 20 20 70 49 74 65 72 2d 3e 62 61 73 65  d;.  pIter->base
17950 2e 6e 44 61 74 61 20 3d 20 70 53 65 67 2d 3e 6e  .nData = pSeg->n
17960 50 6f 73 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  Pos;..  assert( 
17970 70 49 74 65 72 2d 3e 70 49 6e 64 65 78 2d 3e 70  pIter->pIndex->p
17980 43 6f 6e 66 69 67 2d 3e 65 44 65 74 61 69 6c 21  Config->eDetail!
17990 3d 46 54 53 35 5f 44 45 54 41 49 4c 5f 4e 4f 4e  =FTS5_DETAIL_NON
179a0 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  E );.  assert( p
179b0 49 74 65 72 2d 3e 70 43 6f 6c 73 65 74 3d 3d 30  Iter->pColset==0
179c0 20 29 3b 0a 0a 20 20 69 66 28 20 70 53 65 67 2d   );..  if( pSeg-
179d0 3e 69 4c 65 61 66 4f 66 66 73 65 74 2b 70 53 65  >iLeafOffset+pSe
179e0 67 2d 3e 6e 50 6f 73 3c 3d 70 53 65 67 2d 3e 70  g->nPos<=pSeg->p
179f0 4c 65 61 66 2d 3e 73 7a 4c 65 61 66 20 29 7b 0a  Leaf->szLeaf ){.
17a00 20 20 20 20 2f 2a 20 41 6c 6c 20 64 61 74 61 20      /* All data 
17a10 69 73 20 73 74 6f 72 65 64 20 6f 6e 20 74 68 65  is stored on the
17a20 20 63 75 72 72 65 6e 74 20 70 61 67 65 2e 20 50   current page. P
17a30 6f 70 75 6c 61 74 65 20 74 68 65 20 6f 75 74 70  opulate the outp
17a40 75 74 20 0a 20 20 20 20 2a 2a 20 76 61 72 69 61  ut .    ** varia
17a50 62 6c 65 73 20 74 6f 20 70 6f 69 6e 74 20 69 6e  bles to point in
17a60 74 6f 20 74 68 65 20 62 6f 64 79 20 6f 66 20 74  to the body of t
17a70 68 65 20 70 61 67 65 20 6f 62 6a 65 63 74 2e 20  he page object. 
17a80 2a 2f 0a 20 20 20 20 70 49 74 65 72 2d 3e 62 61  */.    pIter->ba
17a90 73 65 2e 70 44 61 74 61 20 3d 20 26 70 53 65 67  se.pData = &pSeg
17aa0 2d 3e 70 4c 65 61 66 2d 3e 70 5b 70 53 65 67 2d  ->pLeaf->p[pSeg-
17ab0 3e 69 4c 65 61 66 4f 66 66 73 65 74 5d 3b 0a 20  >iLeafOffset];. 
17ac0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54   }else{.    /* T
17ad0 68 65 20 64 61 74 61 20 69 73 20 64 69 73 74 72  he data is distr
17ae0 69 62 75 74 65 64 20 6f 76 65 72 20 74 77 6f 20  ibuted over two 
17af0 6f 72 20 6d 6f 72 65 20 70 61 67 65 73 2e 20 43  or more pages. C
17b00 6f 70 79 20 69 74 20 69 6e 74 6f 20 74 68 65 0a  opy it into the.
17b10 20 20 20 20 2a 2a 20 46 74 73 35 49 74 65 72 2e      ** Fts5Iter.
17b20 70 6f 73 6c 69 73 74 20 62 75 66 66 65 72 20 61  poslist buffer a
17b30 6e 64 20 74 68 65 6e 20 73 65 74 20 74 68 65 20  nd then set the 
17b40 6f 75 74 70 75 74 20 70 6f 69 6e 74 65 72 20 74  output pointer t
17b50 6f 20 70 6f 69 6e 74 0a 20 20 20 20 2a 2a 20 74  o point.    ** t
17b60 6f 20 74 68 69 73 20 62 75 66 66 65 72 2e 20 20  o this buffer.  
17b70 2a 2f 0a 20 20 20 20 66 74 73 35 42 75 66 66 65  */.    fts5Buffe
17b80 72 5a 65 72 6f 28 26 70 49 74 65 72 2d 3e 70 6f  rZero(&pIter->po
17b90 73 6c 69 73 74 29 3b 0a 20 20 20 20 66 74 73 35  slist);.    fts5
17ba0 53 65 67 69 74 65 72 50 6f 73 6c 69 73 74 28 70  SegiterPoslist(p
17bb0 49 74 65 72 2d 3e 70 49 6e 64 65 78 2c 20 70 53  Iter->pIndex, pS
17bc0 65 67 2c 20 30 2c 20 26 70 49 74 65 72 2d 3e 70  eg, 0, &pIter->p
17bd0 6f 73 6c 69 73 74 29 3b 0a 20 20 20 20 70 49 74  oslist);.    pIt
17be0 65 72 2d 3e 62 61 73 65 2e 70 44 61 74 61 20 3d  er->base.pData =
17bf0 20 70 49 74 65 72 2d 3e 70 6f 73 6c 69 73 74 2e   pIter->poslist.
17c00 70 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  p;.  }.}../*.** 
17c10 78 53 65 74 4f 75 74 70 75 74 73 20 63 61 6c 6c  xSetOutputs call
17c20 62 61 63 6b 20 75 73 65 64 20 62 79 20 64 65 74  back used by det
17c30 61 69 6c 3d 63 6f 6c 20 77 68 65 6e 20 74 68 65  ail=col when the
17c40 72 65 20 69 73 20 61 20 63 6f 6c 75 6d 6e 20 66  re is a column f
17c50 69 6c 74 65 72 0a 2a 2a 20 61 6e 64 20 74 68 65  ilter.** and the
17c60 72 65 20 61 72 65 20 31 30 30 20 6f 72 20 6d 6f  re are 100 or mo
17c70 72 65 20 63 6f 6c 75 6d 6e 73 2e 20 41 6c 73 6f  re columns. Also
17c80 20 63 61 6c 6c 65 64 20 61 73 20 61 20 66 61 6c   called as a fal
17c90 6c 62 61 63 6b 20 66 72 6f 6d 0a 2a 2a 20 66 74  lback from.** ft
17ca0 73 35 49 74 65 72 53 65 74 4f 75 74 70 75 74 73  s5IterSetOutputs
17cb0 5f 43 6f 6c 31 30 30 20 69 66 20 74 68 65 20 63  _Col100 if the c
17cc0 6f 6c 75 6d 6e 2d 6c 69 73 74 20 73 70 61 6e 73  olumn-list spans
17cd0 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 70   more than one p
17ce0 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  age..*/.static v
17cf0 6f 69 64 20 66 74 73 35 49 74 65 72 53 65 74 4f  oid fts5IterSetO
17d00 75 74 70 75 74 73 5f 43 6f 6c 28 46 74 73 35 49  utputs_Col(Fts5I
17d10 74 65 72 20 2a 70 49 74 65 72 2c 20 46 74 73 35  ter *pIter, Fts5
17d20 53 65 67 49 74 65 72 20 2a 70 53 65 67 29 7b 0a  SegIter *pSeg){.
17d30 20 20 66 74 73 35 42 75 66 66 65 72 5a 65 72 6f    fts5BufferZero
17d40 28 26 70 49 74 65 72 2d 3e 70 6f 73 6c 69 73 74  (&pIter->poslist
17d50 29 3b 0a 20 20 66 74 73 35 53 65 67 69 74 65 72  );.  fts5Segiter
17d60 50 6f 73 6c 69 73 74 28 70 49 74 65 72 2d 3e 70  Poslist(pIter->p
17d70 49 6e 64 65 78 2c 20 70 53 65 67 2c 20 70 49 74  Index, pSeg, pIt
17d80 65 72 2d 3e 70 43 6f 6c 73 65 74 2c 20 26 70 49  er->pColset, &pI
17d90 74 65 72 2d 3e 70 6f 73 6c 69 73 74 29 3b 0a 20  ter->poslist);. 
17da0 20 70 49 74 65 72 2d 3e 62 61 73 65 2e 69 52 6f   pIter->base.iRo
17db0 77 69 64 20 3d 20 70 53 65 67 2d 3e 69 52 6f 77  wid = pSeg->iRow
17dc0 69 64 3b 0a 20 20 70 49 74 65 72 2d 3e 62 61 73  id;.  pIter->bas
17dd0 65 2e 70 44 61 74 61 20 3d 20 70 49 74 65 72 2d  e.pData = pIter-
17de0 3e 70 6f 73 6c 69 73 74 2e 70 3b 0a 20 20 70 49  >poslist.p;.  pI
17df0 74 65 72 2d 3e 62 61 73 65 2e 6e 44 61 74 61 20  ter->base.nData 
17e00 3d 20 70 49 74 65 72 2d 3e 70 6f 73 6c 69 73 74  = pIter->poslist
17e10 2e 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 78 53 65  .n;.}../*.** xSe
17e20 74 4f 75 74 70 75 74 73 20 63 61 6c 6c 62 61 63  tOutputs callbac
17e30 6b 20 75 73 65 64 20 77 68 65 6e 3a 20 0a 2a 2a  k used when: .**
17e40 0a 2a 2a 20 20 20 2a 20 64 65 74 61 69 6c 3d 63  .**   * detail=c
17e50 6f 6c 2c 0a 2a 2a 20 20 20 2a 20 74 68 65 72 65  ol,.**   * there
17e60 20 69 73 20 61 20 63 6f 6c 75 6d 6e 20 66 69 6c   is a column fil
17e70 74 65 72 2c 20 61 6e 64 0a 2a 2a 20 20 20 2a 20  ter, and.**   * 
17e80 74 68 65 20 74 61 62 6c 65 20 63 6f 6e 74 61 69  the table contai
17e90 6e 73 20 31 30 30 20 6f 72 20 66 65 77 65 72 20  ns 100 or fewer 
17ea0 63 6f 6c 75 6d 6e 73 2e 20 0a 2a 2a 0a 2a 2a 20  columns. .**.** 
17eb0 54 68 65 20 6c 61 73 74 20 70 6f 69 6e 74 20 69  The last point i
17ec0 73 20 74 6f 20 65 6e 73 75 72 65 20 61 6c 6c 20  s to ensure all 
17ed0 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 73 20 61  column numbers a
17ee0 72 65 20 73 74 6f 72 65 64 20 61 73 20 0a 2a 2a  re stored as .**
17ef0 20 73 69 6e 67 6c 65 2d 62 79 74 65 20 76 61 72   single-byte var
17f00 69 6e 74 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ints..*/.static 
17f10 76 6f 69 64 20 66 74 73 35 49 74 65 72 53 65 74  void fts5IterSet
17f20 4f 75 74 70 75 74 73 5f 43 6f 6c 31 30 30 28 46  Outputs_Col100(F
17f30 74 73 35 49 74 65 72 20 2a 70 49 74 65 72 2c 20  ts5Iter *pIter, 
17f40 46 74 73 35 53 65 67 49 74 65 72 20 2a 70 53 65  Fts5SegIter *pSe
17f50 67 29 7b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  g){..  assert( p
17f60 49 74 65 72 2d 3e 70 49 6e 64 65 78 2d 3e 70 43  Iter->pIndex->pC
17f70 6f 6e 66 69 67 2d 3e 65 44 65 74 61 69 6c 3d 3d  onfig->eDetail==
17f80 46 54 53 35 5f 44 45 54 41 49 4c 5f 43 4f 4c 55  FTS5_DETAIL_COLU
17f90 4d 4e 53 20 29 3b 0a 20 20 61 73 73 65 72 74 28  MNS );.  assert(
17fa0 20 70 49 74 65 72 2d 3e 70 43 6f 6c 73 65 74 20   pIter->pColset 
17fb0 29 3b 0a 0a 20 20 69 66 28 20 70 53 65 67 2d 3e  );..  if( pSeg->
17fc0 69 4c 65 61 66 4f 66 66 73 65 74 2b 70 53 65 67  iLeafOffset+pSeg
17fd0 2d 3e 6e 50 6f 73 3e 70 53 65 67 2d 3e 70 4c 65  ->nPos>pSeg->pLe
17fe0 61 66 2d 3e 73 7a 4c 65 61 66 20 29 7b 0a 20 20  af->szLeaf ){.  
17ff0 20 20 66 74 73 35 49 74 65 72 53 65 74 4f 75 74    fts5IterSetOut
18000 70 75 74 73 5f 43 6f 6c 28 70 49 74 65 72 2c 20  puts_Col(pIter, 
18010 70 53 65 67 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  pSeg);.  }else{.
18020 20 20 20 20 75 38 20 2a 61 20 3d 20 28 75 38 2a      u8 *a = (u8*
18030 29 26 70 53 65 67 2d 3e 70 4c 65 61 66 2d 3e 70  )&pSeg->pLeaf->p
18040 5b 70 53 65 67 2d 3e 69 4c 65 61 66 4f 66 66 73  [pSeg->iLeafOffs
18050 65 74 5d 3b 0a 20 20 20 20 75 38 20 2a 70 45 6e  et];.    u8 *pEn
18060 64 20 3d 20 28 75 38 2a 29 26 61 5b 70 53 65 67  d = (u8*)&a[pSeg
18070 2d 3e 6e 50 6f 73 5d 3b 20 0a 20 20 20 20 69 6e  ->nPos]; .    in
18080 74 20 69 50 72 65 76 20 3d 20 30 3b 0a 20 20 20  t iPrev = 0;.   
18090 20 69 6e 74 20 2a 61 69 43 6f 6c 20 3d 20 70 49   int *aiCol = pI
180a0 74 65 72 2d 3e 70 43 6f 6c 73 65 74 2d 3e 61 69  ter->pColset->ai
180b0 43 6f 6c 3b 0a 20 20 20 20 69 6e 74 20 2a 61 69  Col;.    int *ai
180c0 43 6f 6c 45 6e 64 20 3d 20 26 61 69 43 6f 6c 5b  ColEnd = &aiCol[
180d0 70 49 74 65 72 2d 3e 70 43 6f 6c 73 65 74 2d 3e  pIter->pColset->
180e0 6e 43 6f 6c 5d 3b 0a 0a 20 20 20 20 75 38 20 2a  nCol];..    u8 *
180f0 61 4f 75 74 20 3d 20 70 49 74 65 72 2d 3e 70 6f  aOut = pIter->po
18100 73 6c 69 73 74 2e 70 3b 0a 20 20 20 20 69 6e 74  slist.p;.    int
18110 20 69 50 72 65 76 4f 75 74 20 3d 20 30 3b 0a 0a   iPrevOut = 0;..
18120 20 20 20 20 70 49 74 65 72 2d 3e 62 61 73 65 2e      pIter->base.
18130 69 52 6f 77 69 64 20 3d 20 70 53 65 67 2d 3e 69  iRowid = pSeg->i
18140 52 6f 77 69 64 3b 0a 0a 20 20 20 20 77 68 69 6c  Rowid;..    whil
18150 65 28 20 61 3c 70 45 6e 64 20 29 7b 0a 20 20 20  e( a<pEnd ){.   
18160 20 20 20 69 50 72 65 76 20 2b 3d 20 28 69 6e 74     iPrev += (int
18170 29 61 2b 2b 5b 30 5d 20 2d 20 32 3b 0a 20 20 20  )a++[0] - 2;.   
18180 20 20 20 77 68 69 6c 65 28 20 2a 61 69 43 6f 6c     while( *aiCol
18190 3c 69 50 72 65 76 20 29 7b 0a 20 20 20 20 20 20  <iPrev ){.      
181a0 20 20 61 69 43 6f 6c 2b 2b 3b 0a 20 20 20 20 20    aiCol++;.     
181b0 20 20 20 69 66 28 20 61 69 43 6f 6c 3d 3d 61 69     if( aiCol==ai
181c0 43 6f 6c 45 6e 64 20 29 20 67 6f 74 6f 20 73 65  ColEnd ) goto se
181d0 74 6f 75 74 70 75 74 73 5f 63 6f 6c 5f 6f 75 74  toutputs_col_out
181e0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
181f0 69 66 28 20 2a 61 69 43 6f 6c 3d 3d 69 50 72 65  if( *aiCol==iPre
18200 76 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 61 4f  v ){.        *aO
18210 75 74 2b 2b 20 3d 20 28 69 50 72 65 76 20 2d 20  ut++ = (iPrev - 
18220 69 50 72 65 76 4f 75 74 29 20 2b 20 32 3b 0a 20  iPrevOut) + 2;. 
18230 20 20 20 20 20 20 20 69 50 72 65 76 4f 75 74 20         iPrevOut 
18240 3d 20 69 50 72 65 76 3b 0a 20 20 20 20 20 20 7d  = iPrev;.      }
18250 0a 20 20 20 20 7d 0a 0a 73 65 74 6f 75 74 70 75  .    }..setoutpu
18260 74 73 5f 63 6f 6c 5f 6f 75 74 3a 0a 20 20 20 20  ts_col_out:.    
18270 70 49 74 65 72 2d 3e 62 61 73 65 2e 70 44 61 74  pIter->base.pDat
18280 61 20 3d 20 70 49 74 65 72 2d 3e 70 6f 73 6c 69  a = pIter->posli
18290 73 74 2e 70 3b 0a 20 20 20 20 70 49 74 65 72 2d  st.p;.    pIter-
182a0 3e 62 61 73 65 2e 6e 44 61 74 61 20 3d 20 61 4f  >base.nData = aO
182b0 75 74 20 2d 20 70 49 74 65 72 2d 3e 70 6f 73 6c  ut - pIter->posl
182c0 69 73 74 2e 70 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  ist.p;.  }.}../*
182d0 0a 2a 2a 20 78 53 65 74 4f 75 74 70 75 74 73 20  .** xSetOutputs 
182e0 63 61 6c 6c 62 61 63 6b 20 75 73 65 64 20 62 79  callback used by
182f0 20 64 65 74 61 69 6c 3d 66 75 6c 6c 20 77 68 65   detail=full whe
18300 6e 20 74 68 65 72 65 20 69 73 20 61 20 63 6f 6c  n there is a col
18310 75 6d 6e 20 66 69 6c 74 65 72 2e 0a 2a 2f 0a 73  umn filter..*/.s
18320 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 49  tatic void fts5I
18330 74 65 72 53 65 74 4f 75 74 70 75 74 73 5f 46 75  terSetOutputs_Fu
18340 6c 6c 28 46 74 73 35 49 74 65 72 20 2a 70 49 74  ll(Fts5Iter *pIt
18350 65 72 2c 20 46 74 73 35 53 65 67 49 74 65 72 20  er, Fts5SegIter 
18360 2a 70 53 65 67 29 7b 0a 20 20 46 74 73 35 43 6f  *pSeg){.  Fts5Co
18370 6c 73 65 74 20 2a 70 43 6f 6c 73 65 74 20 3d 20  lset *pColset = 
18380 70 49 74 65 72 2d 3e 70 43 6f 6c 73 65 74 3b 0a  pIter->pColset;.
18390 20 20 70 49 74 65 72 2d 3e 62 61 73 65 2e 69 52    pIter->base.iR
183a0 6f 77 69 64 20 3d 20 70 53 65 67 2d 3e 69 52 6f  owid = pSeg->iRo
183b0 77 69 64 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  wid;..  assert( 
183c0 70 49 74 65 72 2d 3e 70 49 6e 64 65 78 2d 3e 70  pIter->pIndex->p
183d0 43 6f 6e 66 69 67 2d 3e 65 44 65 74 61 69 6c 3d  Config->eDetail=
183e0 3d 46 54 53 35 5f 44 45 54 41 49 4c 5f 46 55 4c  =FTS5_DETAIL_FUL
183f0 4c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  L );.  assert( p
18400 43 6f 6c 73 65 74 20 29 3b 0a 0a 20 20 69 66 28  Colset );..  if(
18410 20 70 53 65 67 2d 3e 69 4c 65 61 66 4f 66 66 73   pSeg->iLeafOffs
18420 65 74 2b 70 53 65 67 2d 3e 6e 50 6f 73 3c 3d 70  et+pSeg->nPos<=p
18430 53 65 67 2d 3e 70 4c 65 61 66 2d 3e 73 7a 4c 65  Seg->pLeaf->szLe
18440 61 66 20 29 7b 0a 20 20 20 20 2f 2a 20 41 6c 6c  af ){.    /* All
18450 20 64 61 74 61 20 69 73 20 73 74 6f 72 65 64 20   data is stored 
18460 6f 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 70  on the current p
18470 61 67 65 2e 20 50 6f 70 75 6c 61 74 65 20 74 68  age. Populate th
18480 65 20 6f 75 74 70 75 74 20 0a 20 20 20 20 2a 2a  e output .    **
18490 20 76 61 72 69 61 62 6c 65 73 20 74 6f 20 70 6f   variables to po
184a0 69 6e 74 20 69 6e 74 6f 20 74 68 65 20 62 6f 64  int into the bod
184b0 79 20 6f 66 20 74 68 65 20 70 61 67 65 20 6f 62  y of the page ob
184c0 6a 65 63 74 2e 20 2a 2f 0a 20 20 20 20 63 6f 6e  ject. */.    con
184d0 73 74 20 75 38 20 2a 61 20 3d 20 26 70 53 65 67  st u8 *a = &pSeg
184e0 2d 3e 70 4c 65 61 66 2d 3e 70 5b 70 53 65 67 2d  ->pLeaf->p[pSeg-
184f0 3e 69 4c 65 61 66 4f 66 66 73 65 74 5d 3b 0a 20  >iLeafOffset];. 
18500 20 20 20 69 66 28 20 70 43 6f 6c 73 65 74 2d 3e     if( pColset->
18510 6e 43 6f 6c 3d 3d 31 20 29 7b 0a 20 20 20 20 20  nCol==1 ){.     
18520 20 70 49 74 65 72 2d 3e 62 61 73 65 2e 6e 44 61   pIter->base.nDa
18530 74 61 20 3d 20 66 74 73 35 49 6e 64 65 78 45 78  ta = fts5IndexEx
18540 74 72 61 63 74 43 6f 6c 28 26 61 2c 20 70 53 65  tractCol(&a, pSe
18550 67 2d 3e 6e 50 6f 73 2c 70 43 6f 6c 73 65 74 2d  g->nPos,pColset-
18560 3e 61 69 43 6f 6c 5b 30 5d 29 3b 0a 20 20 20 20  >aiCol[0]);.    
18570 20 20 70 49 74 65 72 2d 3e 62 61 73 65 2e 70 44    pIter->base.pD
18580 61 74 61 20 3d 20 61 3b 0a 20 20 20 20 7d 65 6c  ata = a;.    }el
18590 73 65 7b 0a 20 20 20 20 20 20 66 74 73 35 42 75  se{.      fts5Bu
185a0 66 66 65 72 5a 65 72 6f 28 26 70 49 74 65 72 2d  fferZero(&pIter-
185b0 3e 70 6f 73 6c 69 73 74 29 3b 0a 20 20 20 20 20  >poslist);.     
185c0 20 66 74 73 35 49 6e 64 65 78 45 78 74 72 61 63   fts5IndexExtrac
185d0 74 43 6f 6c 73 65 74 28 70 43 6f 6c 73 65 74 2c  tColset(pColset,
185e0 20 61 2c 20 70 53 65 67 2d 3e 6e 50 6f 73 2c 20   a, pSeg->nPos, 
185f0 26 70 49 74 65 72 2d 3e 70 6f 73 6c 69 73 74 29  &pIter->poslist)
18600 3b 0a 20 20 20 20 20 20 70 49 74 65 72 2d 3e 62  ;.      pIter->b
18610 61 73 65 2e 70 44 61 74 61 20 3d 20 70 49 74 65  ase.pData = pIte
18620 72 2d 3e 70 6f 73 6c 69 73 74 2e 70 3b 0a 20 20  r->poslist.p;.  
18630 20 20 20 20 70 49 74 65 72 2d 3e 62 61 73 65 2e      pIter->base.
18640 6e 44 61 74 61 20 3d 20 70 49 74 65 72 2d 3e 70  nData = pIter->p
18650 6f 73 6c 69 73 74 2e 6e 3b 0a 20 20 20 20 7d 0a  oslist.n;.    }.
18660 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
18670 54 68 65 20 64 61 74 61 20 69 73 20 64 69 73 74  The data is dist
18680 72 69 62 75 74 65 64 20 6f 76 65 72 20 74 77 6f  ributed over two
18690 20 6f 72 20 6d 6f 72 65 20 70 61 67 65 73 2e 20   or more pages. 
186a0 43 6f 70 79 20 69 74 20 69 6e 74 6f 20 74 68 65  Copy it into the
186b0 0a 20 20 20 20 2a 2a 20 46 74 73 35 49 74 65 72  .    ** Fts5Iter
186c0 2e 70 6f 73 6c 69 73 74 20 62 75 66 66 65 72 20  .poslist buffer 
186d0 61 6e 64 20 74 68 65 6e 20 73 65 74 20 74 68 65  and then set the
186e0 20 6f 75 74 70 75 74 20 70 6f 69 6e 74 65 72 20   output pointer 
186f0 74 6f 20 70 6f 69 6e 74 0a 20 20 20 20 2a 2a 20  to point.    ** 
18700 74 6f 20 74 68 69 73 20 62 75 66 66 65 72 2e 20  to this buffer. 
18710 20 2a 2f 0a 20 20 20 20 66 74 73 35 42 75 66 66   */.    fts5Buff
18720 65 72 5a 65 72 6f 28 26 70 49 74 65 72 2d 3e 70  erZero(&pIter->p
18730 6f 73 6c 69 73 74 29 3b 0a 20 20 20 20 66 74 73  oslist);.    fts
18740 35 53 65 67 69 74 65 72 50 6f 73 6c 69 73 74 28  5SegiterPoslist(
18750 70 49 74 65 72 2d 3e 70 49 6e 64 65 78 2c 20 70  pIter->pIndex, p
18760 53 65 67 2c 20 70 43 6f 6c 73 65 74 2c 20 26 70  Seg, pColset, &p
18770 49 74 65 72 2d 3e 70 6f 73 6c 69 73 74 29 3b 0a  Iter->poslist);.
18780 20 20 20 20 70 49 74 65 72 2d 3e 62 61 73 65 2e      pIter->base.
18790 70 44 61 74 61 20 3d 20 70 49 74 65 72 2d 3e 70  pData = pIter->p
187a0 6f 73 6c 69 73 74 2e 70 3b 0a 20 20 20 20 70 49  oslist.p;.    pI
187b0 74 65 72 2d 3e 62 61 73 65 2e 6e 44 61 74 61 20  ter->base.nData 
187c0 3d 20 70 49 74 65 72 2d 3e 70 6f 73 6c 69 73 74  = pIter->poslist
187d0 2e 6e 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69  .n;.  }.}..stati
187e0 63 20 76 6f 69 64 20 66 74 73 35 49 74 65 72 53  c void fts5IterS
187f0 65 74 4f 75 74 70 75 74 43 62 28 69 6e 74 20 2a  etOutputCb(int *
18800 70 52 63 2c 20 46 74 73 35 49 74 65 72 20 2a 70  pRc, Fts5Iter *p
18810 49 74 65 72 29 7b 0a 20 20 69 66 28 20 2a 70 52  Iter){.  if( *pR
18820 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
18830 20 20 20 20 46 74 73 35 43 6f 6e 66 69 67 20 2a      Fts5Config *
18840 70 43 6f 6e 66 69 67 20 3d 20 70 49 74 65 72 2d  pConfig = pIter-
18850 3e 70 49 6e 64 65 78 2d 3e 70 43 6f 6e 66 69 67  >pIndex->pConfig
18860 3b 0a 20 20 20 20 69 66 28 20 70 43 6f 6e 66 69  ;.    if( pConfi
18870 67 2d 3e 65 44 65 74 61 69 6c 3d 3d 46 54 53 35  g->eDetail==FTS5
18880 5f 44 45 54 41 49 4c 5f 4e 4f 4e 45 20 29 7b 0a  _DETAIL_NONE ){.
18890 20 20 20 20 20 20 70 49 74 65 72 2d 3e 78 53 65        pIter->xSe
188a0 74 4f 75 74 70 75 74 73 20 3d 20 66 74 73 35 49  tOutputs = fts5I
188b0 74 65 72 53 65 74 4f 75 74 70 75 74 73 5f 4e 6f  terSetOutputs_No
188c0 6e 65 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 65  ne;.    }..    e
188d0 6c 73 65 20 69 66 28 20 70 49 74 65 72 2d 3e 70  lse if( pIter->p
188e0 43 6f 6c 73 65 74 3d 3d 30 20 29 7b 0a 20 20 20  Colset==0 ){.   
188f0 20 20 20 70 49 74 65 72 2d 3e 78 53 65 74 4f 75     pIter->xSetOu
18900 74 70 75 74 73 20 3d 20 66 74 73 35 49 74 65 72  tputs = fts5Iter
18910 53 65 74 4f 75 74 70 75 74 73 5f 4e 6f 63 6f 6c  SetOutputs_Nocol
18920 73 65 74 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  set;.    }..    
18930 65 6c 73 65 20 69 66 28 20 70 43 6f 6e 66 69 67  else if( pConfig
18940 2d 3e 65 44 65 74 61 69 6c 3d 3d 46 54 53 35 5f  ->eDetail==FTS5_
18950 44 45 54 41 49 4c 5f 46 55 4c 4c 20 29 7b 0a 20  DETAIL_FULL ){. 
18960 20 20 20 20 20 70 49 74 65 72 2d 3e 78 53 65 74       pIter->xSet
18970 4f 75 74 70 75 74 73 20 3d 20 66 74 73 35 49 74  Outputs = fts5It
18980 65 72 53 65 74 4f 75 74 70 75 74 73 5f 46 75 6c  erSetOutputs_Ful
18990 6c 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 65 6c  l;.    }..    el
189a0 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  se{.      assert
189b0 28 20 70 43 6f 6e 66 69 67 2d 3e 65 44 65 74 61  ( pConfig->eDeta
189c0 69 6c 3d 3d 46 54 53 35 5f 44 45 54 41 49 4c 5f  il==FTS5_DETAIL_
189d0 43 4f 4c 55 4d 4e 53 20 29 3b 0a 20 20 20 20 20  COLUMNS );.     
189e0 20 69 66 28 20 70 43 6f 6e 66 69 67 2d 3e 6e 43   if( pConfig->nC
189f0 6f 6c 3c 3d 31 30 30 20 29 7b 0a 20 20 20 20 20  ol<=100 ){.     
18a00 20 20 20 70 49 74 65 72 2d 3e 78 53 65 74 4f 75     pIter->xSetOu
18a10 74 70 75 74 73 20 3d 20 66 74 73 35 49 74 65 72  tputs = fts5Iter
18a20 53 65 74 4f 75 74 70 75 74 73 5f 43 6f 6c 31 30  SetOutputs_Col10
18a30 30 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  0;.        sqlit
18a40 65 33 46 74 73 35 42 75 66 66 65 72 53 69 7a 65  e3Fts5BufferSize
18a50 28 70 52 63 2c 20 26 70 49 74 65 72 2d 3e 70 6f  (pRc, &pIter->po
18a60 73 6c 69 73 74 2c 20 70 43 6f 6e 66 69 67 2d 3e  slist, pConfig->
18a70 6e 43 6f 6c 29 3b 0a 20 20 20 20 20 20 7d 65 6c  nCol);.      }el
18a80 73 65 7b 0a 20 20 20 20 20 20 20 20 70 49 74 65  se{.        pIte
18a90 72 2d 3e 78 53 65 74 4f 75 74 70 75 74 73 20 3d  r->xSetOutputs =
18aa0 20 66 74 73 35 49 74 65 72 53 65 74 4f 75 74 70   fts5IterSetOutp
18ab0 75 74 73 5f 43 6f 6c 3b 0a 20 20 20 20 20 20 7d  uts_Col;.      }
18ac0 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 0a 2f  .    }.  }.}.../
18ad0 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20  *.** Allocate a 
18ae0 6e 65 77 20 46 74 73 35 49 74 65 72 20 6f 62 6a  new Fts5Iter obj
18af0 65 63 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e  ect..**.** The n
18b00 65 77 20 6f 62 6a 65 63 74 20 77 69 6c 6c 20 62  ew object will b
18b10 65 20 75 73 65 64 20 74 6f 20 69 74 65 72 61 74  e used to iterat
18b20 65 20 74 68 72 6f 75 67 68 20 64 61 74 61 20 69  e through data i
18b30 6e 20 73 74 72 75 63 74 75 72 65 20 70 53 74 72  n structure pStr
18b40 75 63 74 2e 0a 2a 2a 20 49 66 20 69 4c 65 76 65  uct..** If iLeve
18b50 6c 20 69 73 20 2d 76 65 2c 20 74 68 65 6e 20 61  l is -ve, then a
18b60 6c 6c 20 64 61 74 61 20 69 6e 20 61 6c 6c 20 73  ll data in all s
18b70 65 67 6d 65 6e 74 73 20 69 73 20 6d 65 72 67 65  egments is merge
18b80 64 2e 20 4f 72 2c 20 69 66 20 69 4c 65 76 65 6c  d. Or, if iLevel
18b90 0a 2a 2a 20 69 73 20 7a 65 72 6f 20 6f 72 20 67  .** is zero or g
18ba0 72 65 61 74 65 72 2c 20 64 61 74 61 20 66 72 6f  reater, data fro
18bb0 6d 20 74 68 65 20 66 69 72 73 74 20 6e 53 65 67  m the first nSeg
18bc0 6d 65 6e 74 20 73 65 67 6d 65 6e 74 73 20 6f 6e  ment segments on
18bd0 20 6c 65 76 65 6c 20 69 4c 65 76 65 6c 0a 2a 2a   level iLevel.**
18be0 20 69 73 20 6d 65 72 67 65 64 2e 0a 2a 2a 0a 2a   is merged..**.*
18bf0 2a 20 54 68 65 20 69 74 65 72 61 74 6f 72 20 69  * The iterator i
18c00 6e 69 74 69 61 6c 6c 79 20 70 6f 69 6e 74 73 20  nitially points 
18c10 74 6f 20 74 68 65 20 66 69 72 73 74 20 74 65 72  to the first ter
18c20 6d 2f 72 6f 77 69 64 20 65 6e 74 72 79 20 69 6e  m/rowid entry in
18c30 20 74 68 65 20 0a 2a 2a 20 69 74 65 72 61 74 65   the .** iterate
18c40 64 20 64 61 74 61 2e 0a 2a 2f 0a 73 74 61 74 69  d data..*/.stati
18c50 63 20 76 6f 69 64 20 66 74 73 35 4d 75 6c 74 69  c void fts5Multi
18c60 49 74 65 72 4e 65 77 28 0a 20 20 46 74 73 35 49  IterNew(.  Fts5I
18c70 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20  ndex *p,        
18c80 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54             /* FT
18c90 53 35 20 62 61 63 6b 65 6e 64 20 74 6f 20 69 74  S5 backend to it
18ca0 65 72 61 74 65 20 77 69 74 68 69 6e 20 2a 2f 0a  erate within */.
18cb0 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65 20    Fts5Structure 
18cc0 2a 70 53 74 72 75 63 74 2c 20 20 20 20 20 20 20  *pStruct,       
18cd0 20 20 2f 2a 20 53 74 72 75 63 74 75 72 65 20 6f    /* Structure o
18ce0 66 20 73 70 65 63 69 66 69 63 20 69 6e 64 65 78  f specific index
18cf0 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c   */.  int flags,
18d00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18d10 20 20 20 20 20 20 2f 2a 20 46 54 53 35 49 4e 44        /* FTS5IND
18d20 45 58 5f 51 55 45 52 59 5f 58 58 58 20 66 6c 61  EX_QUERY_XXX fla
18d30 67 73 20 2a 2f 0a 20 20 46 74 73 35 43 6f 6c 73  gs */.  Fts5Cols
18d40 65 74 20 2a 70 43 6f 6c 73 65 74 2c 20 20 20 20  et *pColset,    
18d50 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 73 65          /* Colse
18d60 74 20 74 6f 20 66 69 6c 74 65 72 20 6f 6e 20 28  t to filter on (
18d70 6f 72 20 4e 55 4c 4c 29 20 2a 2f 0a 20 20 63 6f  or NULL) */.  co
18d80 6e 73 74 20 75 38 20 2a 70 54 65 72 6d 2c 20 69  nst u8 *pTerm, i
18d90 6e 74 20 6e 54 65 72 6d 2c 20 20 20 20 20 2f 2a  nt nTerm,     /*
18da0 20 54 65 72 6d 20 74 6f 20 73 65 65 6b 20 74 6f   Term to seek to
18db0 20 28 6f 72 20 4e 55 4c 4c 2f 30 29 20 2a 2f 0a   (or NULL/0) */.
18dc0 20 20 69 6e 74 20 69 4c 65 76 65 6c 2c 20 20 20    int iLevel,   
18dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18de0 20 20 2f 2a 20 4c 65 76 65 6c 20 74 6f 20 69 74    /* Level to it
18df0 65 72 61 74 65 20 28 2d 31 20 66 6f 72 20 61 6c  erate (-1 for al
18e00 6c 29 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 65 67  l) */.  int nSeg
18e10 6d 65 6e 74 2c 20 20 20 20 20 20 20 20 20 20 20  ment,           
18e20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
18e30 72 20 6f 66 20 73 65 67 6d 65 6e 74 73 20 74 6f  r of segments to
18e40 20 6d 65 72 67 65 20 28 69 4c 65 76 65 6c 3e 3d   merge (iLevel>=
18e50 30 29 20 2a 2f 0a 20 20 46 74 73 35 49 74 65 72  0) */.  Fts5Iter
18e60 20 2a 2a 70 70 4f 75 74 20 20 20 20 20 20 20 20   **ppOut        
18e70 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 77 20 6f          /* New o
18e80 62 6a 65 63 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e  bject */.){.  in
18e90 74 20 6e 53 65 67 20 3d 20 30 3b 20 20 20 20 20  t nSeg = 0;     
18ea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
18eb0 20 4e 75 6d 62 65 72 20 6f 66 20 73 65 67 6d 65   Number of segme
18ec0 6e 74 2d 69 74 65 72 73 20 69 6e 20 75 73 65 20  nt-iters in use 
18ed0 2a 2f 0a 20 20 69 6e 74 20 69 49 74 65 72 20 3d  */.  int iIter =
18ee0 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
18ef0 20 20 20 20 20 2f 2a 20 2a 2f 0a 20 20 69 6e 74       /* */.  int
18f00 20 69 53 65 67 3b 20 20 20 20 20 20 20 20 20 20   iSeg;          
18f10 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
18f20 55 73 65 64 20 74 6f 20 69 74 65 72 61 74 65 20  Used to iterate 
18f30 74 68 72 6f 75 67 68 20 73 65 67 6d 65 6e 74 73  through segments
18f40 20 2a 2f 0a 20 20 46 74 73 35 53 74 72 75 63 74   */.  Fts5Struct
18f50 75 72 65 4c 65 76 65 6c 20 2a 70 4c 76 6c 3b 0a  ureLevel *pLvl;.
18f60 20 20 46 74 73 35 49 74 65 72 20 2a 70 4e 65 77    Fts5Iter *pNew
18f70 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 28 70 54  ;..  assert( (pT
18f80 65 72 6d 3d 3d 30 20 26 26 20 6e 54 65 72 6d 3d  erm==0 && nTerm=
18f90 3d 30 29 20 7c 7c 20 69 4c 65 76 65 6c 3c 30 20  =0) || iLevel<0 
18fa0 29 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74  );..  /* Allocat
18fb0 65 20 73 70 61 63 65 20 66 6f 72 20 74 68 65 20  e space for the 
18fc0 6e 65 77 20 6d 75 6c 74 69 2d 73 65 67 2d 69 74  new multi-seg-it
18fd0 65 72 61 74 6f 72 2e 20 2a 2f 0a 20 20 69 66 28  erator. */.  if(
18fe0 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
18ff0 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 69 4c 65  K ){.    if( iLe
19000 76 65 6c 3c 30 20 29 7b 0a 20 20 20 20 20 20 61  vel<0 ){.      a
19010 73 73 65 72 74 28 20 70 53 74 72 75 63 74 2d 3e  ssert( pStruct->
19020 6e 53 65 67 6d 65 6e 74 3d 3d 66 74 73 35 53 74  nSegment==fts5St
19030 72 75 63 74 75 72 65 43 6f 75 6e 74 53 65 67 6d  ructureCountSegm
19040 65 6e 74 73 28 70 53 74 72 75 63 74 29 20 29 3b  ents(pStruct) );
19050 0a 20 20 20 20 20 20 6e 53 65 67 20 3d 20 70 53  .      nSeg = pS
19060 74 72 75 63 74 2d 3e 6e 53 65 67 6d 65 6e 74 3b  truct->nSegment;
19070 0a 20 20 20 20 20 20 6e 53 65 67 20 2b 3d 20 28  .      nSeg += (
19080 70 2d 3e 70 48 61 73 68 20 3f 20 31 20 3a 20 30  p->pHash ? 1 : 0
19090 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
190a0 20 20 20 20 6e 53 65 67 20 3d 20 4d 49 4e 28 70      nSeg = MIN(p
190b0 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69  Struct->aLevel[i
190c0 4c 65 76 65 6c 5d 2e 6e 53 65 67 2c 20 6e 53 65  Level].nSeg, nSe
190d0 67 6d 65 6e 74 29 3b 0a 20 20 20 20 7d 0a 20 20  gment);.    }.  
190e0 7d 0a 20 20 2a 70 70 4f 75 74 20 3d 20 70 4e 65  }.  *ppOut = pNe
190f0 77 20 3d 20 66 74 73 35 4d 75 6c 74 69 49 74 65  w = fts5MultiIte
19100 72 41 6c 6c 6f 63 28 70 2c 20 6e 53 65 67 29 3b  rAlloc(p, nSeg);
19110 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29  .  if( pNew==0 )
19120 20 72 65 74 75 72 6e 3b 0a 20 20 70 4e 65 77 2d   return;.  pNew-
19130 3e 62 52 65 76 20 3d 20 28 30 21 3d 28 66 6c 61  >bRev = (0!=(fla
19140 67 73 20 26 20 46 54 53 35 49 4e 44 45 58 5f 51  gs & FTS5INDEX_Q
19150 55 45 52 59 5f 44 45 53 43 29 29 3b 0a 20 20 70  UERY_DESC));.  p
19160 4e 65 77 2d 3e 62 53 6b 69 70 45 6d 70 74 79 20  New->bSkipEmpty 
19170 3d 20 28 30 21 3d 28 66 6c 61 67 73 20 26 20 46  = (0!=(flags & F
19180 54 53 35 49 4e 44 45 58 5f 51 55 45 52 59 5f 53  TS5INDEX_QUERY_S
19190 4b 49 50 45 4d 50 54 59 29 29 3b 0a 20 20 70 4e  KIPEMPTY));.  pN
191a0 65 77 2d 3e 70 53 74 72 75 63 74 20 3d 20 70 53  ew->pStruct = pS
191b0 74 72 75 63 74 3b 0a 20 20 70 4e 65 77 2d 3e 70  truct;.  pNew->p
191c0 43 6f 6c 73 65 74 20 3d 20 70 43 6f 6c 73 65 74  Colset = pColset
191d0 3b 0a 20 20 66 74 73 35 53 74 72 75 63 74 75 72  ;.  fts5Structur
191e0 65 52 65 66 28 70 53 74 72 75 63 74 29 3b 0a 20  eRef(pStruct);. 
191f0 20 69 66 28 20 28 66 6c 61 67 73 20 26 20 46 54   if( (flags & FT
19200 53 35 49 4e 44 45 58 5f 51 55 45 52 59 5f 4e 4f  S5INDEX_QUERY_NO
19210 4f 55 54 50 55 54 29 3d 3d 30 20 29 7b 0a 20 20  OUTPUT)==0 ){.  
19220 20 20 66 74 73 35 49 74 65 72 53 65 74 4f 75 74    fts5IterSetOut
19230 70 75 74 43 62 28 26 70 2d 3e 72 63 2c 20 70 4e  putCb(&p->rc, pN
19240 65 77 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  ew);.  }..  /* I
19250 6e 69 74 69 61 6c 69 7a 65 20 65 61 63 68 20 6f  nitialize each o
19260 66 20 74 68 65 20 63 6f 6d 70 6f 6e 65 6e 74 20  f the component 
19270 73 65 67 6d 65 6e 74 20 69 74 65 72 61 74 6f 72  segment iterator
19280 73 2e 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 72  s. */.  if( p->r
19290 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
192a0 20 20 20 20 69 66 28 20 69 4c 65 76 65 6c 3c 30      if( iLevel<0
192b0 20 29 7b 0a 20 20 20 20 20 20 46 74 73 35 53 74   ){.      Fts5St
192c0 72 75 63 74 75 72 65 4c 65 76 65 6c 20 2a 70 45  ructureLevel *pE
192d0 6e 64 20 3d 20 26 70 53 74 72 75 63 74 2d 3e 61  nd = &pStruct->a
192e0 4c 65 76 65 6c 5b 70 53 74 72 75 63 74 2d 3e 6e  Level[pStruct->n
192f0 4c 65 76 65 6c 5d 3b 0a 20 20 20 20 20 20 69 66  Level];.      if
19300 28 20 70 2d 3e 70 48 61 73 68 20 29 7b 0a 20 20  ( p->pHash ){.  
19310 20 20 20 20 20 20 2f 2a 20 41 64 64 20 61 20 73        /* Add a s
19320 65 67 6d 65 6e 74 20 69 74 65 72 61 74 6f 72 20  egment iterator 
19330 66 6f 72 20 74 68 65 20 63 75 72 72 65 6e 74 20  for the current 
19340 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
19350 68 61 73 68 20 74 61 62 6c 65 2e 20 2a 2f 0a 20  hash table. */. 
19360 20 20 20 20 20 20 20 46 74 73 35 53 65 67 49 74         Fts5SegIt
19370 65 72 20 2a 70 49 74 65 72 20 3d 20 26 70 4e 65  er *pIter = &pNe
19380 77 2d 3e 61 53 65 67 5b 69 49 74 65 72 2b 2b 5d  w->aSeg[iIter++]
19390 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35 53 65  ;.        fts5Se
193a0 67 49 74 65 72 48 61 73 68 49 6e 69 74 28 70 2c  gIterHashInit(p,
193b0 20 70 54 65 72 6d 2c 20 6e 54 65 72 6d 2c 20 66   pTerm, nTerm, f
193c0 6c 61 67 73 2c 20 70 49 74 65 72 29 3b 0a 20 20  lags, pIter);.  
193d0 20 20 20 20 7d 0a 20 20 20 20 20 20 66 6f 72 28      }.      for(
193e0 70 4c 76 6c 3d 26 70 53 74 72 75 63 74 2d 3e 61  pLvl=&pStruct->a
193f0 4c 65 76 65 6c 5b 30 5d 3b 20 70 4c 76 6c 3c 70  Level[0]; pLvl<p
19400 45 6e 64 3b 20 70 4c 76 6c 2b 2b 29 7b 0a 20 20  End; pLvl++){.  
19410 20 20 20 20 20 20 66 6f 72 28 69 53 65 67 3d 70        for(iSeg=p
19420 4c 76 6c 2d 3e 6e 53 65 67 2d 31 3b 20 69 53 65  Lvl->nSeg-1; iSe
19430 67 3e 3d 30 3b 20 69 53 65 67 2d 2d 29 7b 0a 20  g>=0; iSeg--){. 
19440 20 20 20 20 20 20 20 20 20 46 74 73 35 53 74 72           Fts5Str
19450 75 63 74 75 72 65 53 65 67 6d 65 6e 74 20 2a 70  uctureSegment *p
19460 53 65 67 20 3d 20 26 70 4c 76 6c 2d 3e 61 53 65  Seg = &pLvl->aSe
19470 67 5b 69 53 65 67 5d 3b 0a 20 20 20 20 20 20 20  g[iSeg];.       
19480 20 20 20 46 74 73 35 53 65 67 49 74 65 72 20 2a     Fts5SegIter *
19490 70 49 74 65 72 20 3d 20 26 70 4e 65 77 2d 3e 61  pIter = &pNew->a
194a0 53 65 67 5b 69 49 74 65 72 2b 2b 5d 3b 0a 20 20  Seg[iIter++];.  
194b0 20 20 20 20 20 20 20 20 69 66 28 20 70 54 65 72          if( pTer
194c0 6d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  m==0 ){.        
194d0 20 20 20 20 66 74 73 35 53 65 67 49 74 65 72 49      fts5SegIterI
194e0 6e 69 74 28 70 2c 20 70 53 65 67 2c 20 70 49 74  nit(p, pSeg, pIt
194f0 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  er);.          }
19500 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
19510 20 20 66 74 73 35 53 65 67 49 74 65 72 53 65 65    fts5SegIterSee
19520 6b 49 6e 69 74 28 70 2c 20 70 54 65 72 6d 2c 20  kInit(p, pTerm, 
19530 6e 54 65 72 6d 2c 20 66 6c 61 67 73 2c 20 70 53  nTerm, flags, pS
19540 65 67 2c 20 70 49 74 65 72 29 3b 0a 20 20 20 20  eg, pIter);.    
19550 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
19560 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  }.      }.    }e
19570 6c 73 65 7b 0a 20 20 20 20 20 20 70 4c 76 6c 20  lse{.      pLvl 
19580 3d 20 26 70 53 74 72 75 63 74 2d 3e 61 4c 65 76  = &pStruct->aLev
19590 65 6c 5b 69 4c 65 76 65 6c 5d 3b 0a 20 20 20 20  el[iLevel];.    
195a0 20 20 66 6f 72 28 69 53 65 67 3d 6e 53 65 67 2d    for(iSeg=nSeg-
195b0 31 3b 20 69 53 65 67 3e 3d 30 3b 20 69 53 65 67  1; iSeg>=0; iSeg
195c0 2d 2d 29 7b 0a 20 20 20 20 20 20 20 20 66 74 73  --){.        fts
195d0 35 53 65 67 49 74 65 72 49 6e 69 74 28 70 2c 20  5SegIterInit(p, 
195e0 26 70 4c 76 6c 2d 3e 61 53 65 67 5b 69 53 65 67  &pLvl->aSeg[iSeg
195f0 5d 2c 20 26 70 4e 65 77 2d 3e 61 53 65 67 5b 69  ], &pNew->aSeg[i
19600 49 74 65 72 2b 2b 5d 29 3b 0a 20 20 20 20 20 20  Iter++]);.      
19610 7d 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  }.    }.    asse
19620 72 74 28 20 69 49 74 65 72 3d 3d 6e 53 65 67 20  rt( iIter==nSeg 
19630 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20  );.  }..  /* If 
19640 74 68 65 20 61 62 6f 76 65 20 77 61 73 20 73 75  the above was su
19650 63 63 65 73 73 66 75 6c 2c 20 65 61 63 68 20 63  ccessful, each c
19660 6f 6d 70 6f 6e 65 6e 74 20 69 74 65 72 61 74 6f  omponent iterato
19670 72 73 20 6e 6f 77 20 70 6f 69 6e 74 73 20 0a 20  rs now points . 
19680 20 2a 2a 20 74 6f 20 74 68 65 20 66 69 72 73 74   ** to the first
19690 20 65 6e 74 72 79 20 69 6e 20 69 74 73 20 73 65   entry in its se
196a0 67 6d 65 6e 74 2e 20 49 6e 20 74 68 69 73 20 63  gment. In this c
196b0 61 73 65 20 69 6e 69 74 69 61 6c 69 7a 65 20 74  ase initialize t
196c0 68 65 20 0a 20 20 2a 2a 20 61 46 69 72 73 74 5b  he .  ** aFirst[
196d0 5d 20 61 72 72 61 79 2e 20 4f 72 2c 20 69 66 20  ] array. Or, if 
196e0 61 6e 20 65 72 72 6f 72 20 68 61 73 20 6f 63 63  an error has occ
196f0 75 72 72 65 64 2c 20 66 72 65 65 20 74 68 65 20  urred, free the 
19700 69 74 65 72 61 74 6f 72 0a 20 20 2a 2a 20 6f 62  iterator.  ** ob
19710 6a 65 63 74 20 61 6e 64 20 73 65 74 20 74 68 65  ject and set the
19720 20 6f 75 74 70 75 74 20 76 61 72 69 61 62 6c 65   output variable
19730 20 74 6f 20 4e 55 4c 4c 2e 20 20 2a 2f 0a 20 20   to NULL.  */.  
19740 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  if( p->rc==SQLIT
19750 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 66 6f 72 28  E_OK ){.    for(
19760 69 49 74 65 72 3d 70 4e 65 77 2d 3e 6e 53 65 67  iIter=pNew->nSeg
19770 2d 31 3b 20 69 49 74 65 72 3e 30 3b 20 69 49 74  -1; iIter>0; iIt
19780 65 72 2d 2d 29 7b 0a 20 20 20 20 20 20 69 6e 74  er--){.      int
19790 20 69 45 71 3b 0a 20 20 20 20 20 20 69 66 28 20   iEq;.      if( 
197a0 28 69 45 71 20 3d 20 66 74 73 35 4d 75 6c 74 69  (iEq = fts5Multi
197b0 49 74 65 72 44 6f 43 6f 6d 70 61 72 65 28 70 4e  IterDoCompare(pN
197c0 65 77 2c 20 69 49 74 65 72 29 29 20 29 7b 0a 20  ew, iIter)) ){. 
197d0 20 20 20 20 20 20 20 46 74 73 35 53 65 67 49 74         Fts5SegIt
197e0 65 72 20 2a 70 53 65 67 20 3d 20 26 70 4e 65 77  er *pSeg = &pNew
197f0 2d 3e 61 53 65 67 5b 69 45 71 5d 3b 0a 20 20 20  ->aSeg[iEq];.   
19800 20 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d       if( p->rc==
19810 53 51 4c 49 54 45 5f 4f 4b 20 29 20 70 53 65 67  SQLITE_OK ) pSeg
19820 2d 3e 78 4e 65 78 74 28 70 2c 20 70 53 65 67 2c  ->xNext(p, pSeg,
19830 20 30 29 3b 0a 20 20 20 20 20 20 20 20 66 74 73   0);.        fts
19840 35 4d 75 6c 74 69 49 74 65 72 41 64 76 61 6e 63  5MultiIterAdvanc
19850 65 64 28 70 2c 20 70 4e 65 77 2c 20 69 45 71 2c  ed(p, pNew, iEq,
19860 20 69 49 74 65 72 29 3b 0a 20 20 20 20 20 20 7d   iIter);.      }
19870 0a 20 20 20 20 7d 0a 20 20 20 20 66 74 73 35 4d  .    }.    fts5M
19880 75 6c 74 69 49 74 65 72 53 65 74 45 6f 66 28 70  ultiIterSetEof(p
19890 4e 65 77 29 3b 0a 20 20 20 20 66 74 73 35 41 73  New);.    fts5As
198a0 73 65 72 74 4d 75 6c 74 69 49 74 65 72 53 65 74  sertMultiIterSet
198b0 75 70 28 70 2c 20 70 4e 65 77 29 3b 0a 0a 20 20  up(p, pNew);..  
198c0 20 20 69 66 28 20 70 4e 65 77 2d 3e 62 53 6b 69    if( pNew->bSki
198d0 70 45 6d 70 74 79 20 26 26 20 66 74 73 35 4d 75  pEmpty && fts5Mu
198e0 6c 74 69 49 74 65 72 49 73 45 6d 70 74 79 28 70  ltiIterIsEmpty(p
198f0 2c 20 70 4e 65 77 29 20 29 7b 0a 20 20 20 20 20  , pNew) ){.     
19900 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 4e 65   fts5MultiIterNe
19910 78 74 28 70 2c 20 70 4e 65 77 2c 20 30 2c 20 30  xt(p, pNew, 0, 0
19920 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  );.    }else if(
19930 20 70 4e 65 77 2d 3e 62 61 73 65 2e 62 45 6f 66   pNew->base.bEof
19940 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 46 74 73  ==0 ){.      Fts
19950 35 53 65 67 49 74 65 72 20 2a 70 53 65 67 20 3d  5SegIter *pSeg =
19960 20 26 70 4e 65 77 2d 3e 61 53 65 67 5b 70 4e 65   &pNew->aSeg[pNe
19970 77 2d 3e 61 46 69 72 73 74 5b 31 5d 2e 69 46 69  w->aFirst[1].iFi
19980 72 73 74 5d 3b 0a 20 20 20 20 20 20 70 4e 65 77  rst];.      pNew
19990 2d 3e 78 53 65 74 4f 75 74 70 75 74 73 28 70 4e  ->xSetOutputs(pN
199a0 65 77 2c 20 70 53 65 67 29 3b 0a 20 20 20 20 7d  ew, pSeg);.    }
199b0 0a 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66  ..  }else{.    f
199c0 74 73 35 4d 75 6c 74 69 49 74 65 72 46 72 65 65  ts5MultiIterFree
199d0 28 70 4e 65 77 29 3b 0a 20 20 20 20 2a 70 70 4f  (pNew);.    *ppO
199e0 75 74 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f  ut = 0;.  }.}../
199f0 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 6e 20 46  *.** Create an F
19a00 74 73 35 49 74 65 72 20 74 68 61 74 20 69 74 65  ts5Iter that ite
19a10 72 61 74 65 73 20 74 68 72 6f 75 67 68 20 74 68  rates through th
19a20 65 20 64 6f 63 6c 69 73 74 20 70 72 6f 76 69 64  e doclist provid
19a30 65 64 0a 2a 2a 20 61 73 20 74 68 65 20 73 65 63  ed.** as the sec
19a40 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f  ond argument..*/
19a50 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
19a60 35 4d 75 6c 74 69 49 74 65 72 4e 65 77 32 28 0a  5MultiIterNew2(.
19a70 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20    Fts5Index *p, 
19a80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19a90 20 20 2f 2a 20 46 54 53 35 20 62 61 63 6b 65 6e    /* FTS5 backen
19aa0 64 20 74 6f 20 69 74 65 72 61 74 65 20 77 69 74  d to iterate wit
19ab0 68 69 6e 20 2a 2f 0a 20 20 46 74 73 35 44 61 74  hin */.  Fts5Dat
19ac0 61 20 2a 70 44 61 74 61 2c 20 20 20 20 20 20 20  a *pData,       
19ad0 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 63 6c           /* Docl
19ae0 69 73 74 20 74 6f 20 69 74 65 72 61 74 65 20 74  ist to iterate t
19af0 68 72 6f 75 67 68 20 2a 2f 0a 20 20 69 6e 74 20  hrough */.  int 
19b00 62 44 65 73 63 2c 20 20 20 20 20 20 20 20 20 20  bDesc,          
19b10 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
19b20 72 75 65 20 66 6f 72 20 64 65 73 63 65 6e 64 69  rue for descendi
19b30 6e 67 20 72 6f 77 69 64 20 6f 72 64 65 72 20 2a  ng rowid order *
19b40 2f 0a 20 20 46 74 73 35 49 74 65 72 20 2a 2a 70  /.  Fts5Iter **p
19b50 70 4f 75 74 20 20 20 20 20 20 20 20 20 20 20 20  pOut            
19b60 20 20 20 20 2f 2a 20 4e 65 77 20 6f 62 6a 65 63      /* New objec
19b70 74 20 2a 2f 0a 29 7b 0a 20 20 46 74 73 35 49 74  t */.){.  Fts5It
19b80 65 72 20 2a 70 4e 65 77 3b 0a 20 20 70 4e 65 77  er *pNew;.  pNew
19b90 20 3d 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72   = fts5MultiIter
19ba0 41 6c 6c 6f 63 28 70 2c 20 32 29 3b 0a 20 20 69  Alloc(p, 2);.  i
19bb0 66 28 20 70 4e 65 77 20 29 7b 0a 20 20 20 20 46  f( pNew ){.    F
19bc0 74 73 35 53 65 67 49 74 65 72 20 2a 70 49 74 65  ts5SegIter *pIte
19bd0 72 20 3d 20 26 70 4e 65 77 2d 3e 61 53 65 67 5b  r = &pNew->aSeg[
19be0 31 5d 3b 0a 0a 20 20 20 20 70 49 74 65 72 2d 3e  1];..    pIter->
19bf0 66 6c 61 67 73 20 3d 20 46 54 53 35 5f 53 45 47  flags = FTS5_SEG
19c00 49 54 45 52 5f 4f 4e 45 54 45 52 4d 3b 0a 20 20  ITER_ONETERM;.  
19c10 20 20 69 66 28 20 70 44 61 74 61 2d 3e 73 7a 4c    if( pData->szL
19c20 65 61 66 3e 30 20 29 7b 0a 20 20 20 20 20 20 70  eaf>0 ){.      p
19c30 49 74 65 72 2d 3e 70 4c 65 61 66 20 3d 20 70 44  Iter->pLeaf = pD
19c40 61 74 61 3b 0a 20 20 20 20 20 20 70 49 74 65 72  ata;.      pIter
19c50 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 20 3d 20  ->iLeafOffset = 
19c60 66 74 73 35 47 65 74 56 61 72 69 6e 74 28 70 44  fts5GetVarint(pD
19c70 61 74 61 2d 3e 70 2c 20 28 75 36 34 2a 29 26 70  ata->p, (u64*)&p
19c80 49 74 65 72 2d 3e 69 52 6f 77 69 64 29 3b 0a 20  Iter->iRowid);. 
19c90 20 20 20 20 20 70 49 74 65 72 2d 3e 69 45 6e 64       pIter->iEnd
19ca0 6f 66 44 6f 63 6c 69 73 74 20 3d 20 70 44 61 74  ofDoclist = pDat
19cb0 61 2d 3e 6e 6e 3b 0a 20 20 20 20 20 20 70 4e 65  a->nn;.      pNe
19cc0 77 2d 3e 61 46 69 72 73 74 5b 31 5d 2e 69 46 69  w->aFirst[1].iFi
19cd0 72 73 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 69  rst = 1;.      i
19ce0 66 28 20 62 44 65 73 63 20 29 7b 0a 20 20 20 20  f( bDesc ){.    
19cf0 20 20 20 20 70 4e 65 77 2d 3e 62 52 65 76 20 3d      pNew->bRev =
19d00 20 31 3b 0a 20 20 20 20 20 20 20 20 70 49 74 65   1;.        pIte
19d10 72 2d 3e 66 6c 61 67 73 20 7c 3d 20 46 54 53 35  r->flags |= FTS5
19d20 5f 53 45 47 49 54 45 52 5f 52 45 56 45 52 53 45  _SEGITER_REVERSE
19d30 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35 53 65  ;.        fts5Se
19d40 67 49 74 65 72 52 65 76 65 72 73 65 49 6e 69 74  gIterReverseInit
19d50 50 61 67 65 28 70 2c 20 70 49 74 65 72 29 3b 0a  Page(p, pIter);.
19d60 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
19d70 20 20 20 20 20 66 74 73 35 53 65 67 49 74 65 72       fts5SegIter
19d80 4c 6f 61 64 4e 50 6f 73 28 70 2c 20 70 49 74 65  LoadNPos(p, pIte
19d90 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  r);.      }.    
19da0 20 20 70 44 61 74 61 20 3d 20 30 3b 0a 20 20 20    pData = 0;.   
19db0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 4e   }else{.      pN
19dc0 65 77 2d 3e 62 61 73 65 2e 62 45 6f 66 20 3d 20  ew->base.bEof = 
19dd0 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 74 73  1;.    }.    fts
19de0 35 53 65 67 49 74 65 72 53 65 74 4e 65 78 74 28  5SegIterSetNext(
19df0 70 2c 20 70 49 74 65 72 29 3b 0a 0a 20 20 20 20  p, pIter);..    
19e00 2a 70 70 4f 75 74 20 3d 20 70 4e 65 77 3b 0a 20  *ppOut = pNew;. 
19e10 20 7d 0a 0a 20 20 66 74 73 35 44 61 74 61 52 65   }..  fts5DataRe
19e20 6c 65 61 73 65 28 70 44 61 74 61 29 3b 0a 7d 0a  lease(pData);.}.
19e30 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72  ./*.** Return tr
19e40 75 65 20 69 66 20 74 68 65 20 69 74 65 72 61 74  ue if the iterat
19e50 6f 72 20 69 73 20 61 74 20 45 4f 46 20 6f 72 20  or is at EOF or 
19e60 69 66 20 61 6e 20 65 72 72 6f 72 20 68 61 73 20  if an error has 
19e70 6f 63 63 75 72 72 65 64 2e 20 0a 2a 2a 20 46 61  occurred. .** Fa
19e80 6c 73 65 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a  lse otherwise..*
19e90 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73  /.static int fts
19ea0 35 4d 75 6c 74 69 49 74 65 72 45 6f 66 28 46 74  5MultiIterEof(Ft
19eb0 73 35 49 6e 64 65 78 20 2a 70 2c 20 46 74 73 35  s5Index *p, Fts5
19ec0 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a 20 20  Iter *pIter){.  
19ed0 61 73 73 65 72 74 28 20 70 2d 3e 72 63 20 0a 20  assert( p->rc . 
19ee0 20 20 20 20 20 7c 7c 20 28 70 49 74 65 72 2d 3e       || (pIter->
19ef0 61 53 65 67 5b 20 70 49 74 65 72 2d 3e 61 46 69  aSeg[ pIter->aFi
19f00 72 73 74 5b 31 5d 2e 69 46 69 72 73 74 20 5d 2e  rst[1].iFirst ].
19f10 70 4c 65 61 66 3d 3d 30 29 3d 3d 70 49 74 65 72  pLeaf==0)==pIter
19f20 2d 3e 62 61 73 65 2e 62 45 6f 66 20 0a 20 20 29  ->base.bEof .  )
19f30 3b 0a 20 20 72 65 74 75 72 6e 20 28 70 2d 3e 72  ;.  return (p->r
19f40 63 20 7c 7c 20 70 49 74 65 72 2d 3e 62 61 73 65  c || pIter->base
19f50 2e 62 45 6f 66 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  .bEof);.}../*.**
19f60 20 52 65 74 75 72 6e 20 74 68 65 20 72 6f 77 69   Return the rowi
19f70 64 20 6f 66 20 74 68 65 20 65 6e 74 72 79 20 74  d of the entry t
19f80 68 61 74 20 74 68 65 20 69 74 65 72 61 74 6f 72  hat the iterator
19f90 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74   currently point
19fa0 73 0a 2a 2a 20 74 6f 2e 20 49 66 20 74 68 65 20  s.** to. If the 
19fb0 69 74 65 72 61 74 6f 72 20 70 6f 69 6e 74 73 20  iterator points 
19fc0 74 6f 20 45 4f 46 20 77 68 65 6e 20 74 68 69 73  to EOF when this
19fd0 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
19fe0 6c 65 64 20 74 68 65 0a 2a 2a 20 72 65 73 75 6c  led the.** resul
19ff0 74 73 20 61 72 65 20 75 6e 64 65 66 69 6e 65 64  ts are undefined
1a000 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 36 34 20  ..*/.static i64 
1a010 66 74 73 35 4d 75 6c 74 69 49 74 65 72 52 6f 77  fts5MultiIterRow
1a020 69 64 28 46 74 73 35 49 74 65 72 20 2a 70 49 74  id(Fts5Iter *pIt
1a030 65 72 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70  er){.  assert( p
1a040 49 74 65 72 2d 3e 61 53 65 67 5b 20 70 49 74 65  Iter->aSeg[ pIte
1a050 72 2d 3e 61 46 69 72 73 74 5b 31 5d 2e 69 46 69  r->aFirst[1].iFi
1a060 72 73 74 20 5d 2e 70 4c 65 61 66 20 29 3b 0a 20  rst ].pLeaf );. 
1a070 20 72 65 74 75 72 6e 20 70 49 74 65 72 2d 3e 61   return pIter->a
1a080 53 65 67 5b 20 70 49 74 65 72 2d 3e 61 46 69 72  Seg[ pIter->aFir
1a090 73 74 5b 31 5d 2e 69 46 69 72 73 74 20 5d 2e 69  st[1].iFirst ].i
1a0a0 52 6f 77 69 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Rowid;.}../*.** 
1a0b0 4d 6f 76 65 20 74 68 65 20 69 74 65 72 61 74 6f  Move the iterato
1a0c0 72 20 74 6f 20 74 68 65 20 6e 65 78 74 20 65 6e  r to the next en
1a0d0 74 72 79 20 61 74 20 6f 72 20 66 6f 6c 6c 6f 77  try at or follow
1a0e0 69 6e 67 20 69 4d 61 74 63 68 2e 0a 2a 2f 0a 73  ing iMatch..*/.s
1a0f0 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 4d  tatic void fts5M
1a100 75 6c 74 69 49 74 65 72 4e 65 78 74 46 72 6f 6d  ultiIterNextFrom
1a110 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70  (.  Fts5Index *p
1a120 2c 20 0a 20 20 46 74 73 35 49 74 65 72 20 2a 70  , .  Fts5Iter *p
1a130 49 74 65 72 2c 20 0a 20 20 69 36 34 20 69 4d 61  Iter, .  i64 iMa
1a140 74 63 68 0a 29 7b 0a 20 20 77 68 69 6c 65 28 20  tch.){.  while( 
1a150 31 20 29 7b 0a 20 20 20 20 69 36 34 20 69 52 6f  1 ){.    i64 iRo
1a160 77 69 64 3b 0a 20 20 20 20 66 74 73 35 4d 75 6c  wid;.    fts5Mul
1a170 74 69 49 74 65 72 4e 65 78 74 28 70 2c 20 70 49  tiIterNext(p, pI
1a180 74 65 72 2c 20 31 2c 20 69 4d 61 74 63 68 29 3b  ter, 1, iMatch);
1a190 0a 20 20 20 20 69 66 28 20 66 74 73 35 4d 75 6c  .    if( fts5Mul
1a1a0 74 69 49 74 65 72 45 6f 66 28 70 2c 20 70 49 74  tiIterEof(p, pIt
1a1b0 65 72 29 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  er) ) break;.   
1a1c0 20 69 52 6f 77 69 64 20 3d 20 66 74 73 35 4d 75   iRowid = fts5Mu
1a1d0 6c 74 69 49 74 65 72 52 6f 77 69 64 28 70 49 74  ltiIterRowid(pIt
1a1e0 65 72 29 3b 0a 20 20 20 20 69 66 28 20 70 49 74  er);.    if( pIt
1a1f0 65 72 2d 3e 62 52 65 76 3d 3d 30 20 26 26 20 69  er->bRev==0 && i
1a200 52 6f 77 69 64 3e 3d 69 4d 61 74 63 68 20 29 20  Rowid>=iMatch ) 
1a210 62 72 65 61 6b 3b 0a 20 20 20 20 69 66 28 20 70  break;.    if( p
1a220 49 74 65 72 2d 3e 62 52 65 76 21 3d 30 20 26 26  Iter->bRev!=0 &&
1a230 20 69 52 6f 77 69 64 3c 3d 69 4d 61 74 63 68 20   iRowid<=iMatch 
1a240 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 7d 0a 0a  ) break;.  }.}..
1a250 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70  /*.** Return a p
1a260 6f 69 6e 74 65 72 20 74 6f 20 61 20 62 75 66 66  ointer to a buff
1a270 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  er containing th
1a280 65 20 74 65 72 6d 20 61 73 73 6f 63 69 61 74 65  e term associate
1a290 64 20 77 69 74 68 20 74 68 65 20 0a 2a 2a 20 65  d with the .** e
1a2a0 6e 74 72 79 20 74 68 61 74 20 74 68 65 20 69 74  ntry that the it
1a2b0 65 72 61 74 6f 72 20 63 75 72 72 65 6e 74 6c 79  erator currently
1a2c0 20 70 6f 69 6e 74 73 20 74 6f 2e 0a 2a 2f 0a 73   points to..*/.s
1a2d0 74 61 74 69 63 20 63 6f 6e 73 74 20 75 38 20 2a  tatic const u8 *
1a2e0 66 74 73 35 4d 75 6c 74 69 49 74 65 72 54 65 72  fts5MultiIterTer
1a2f0 6d 28 46 74 73 35 49 74 65 72 20 2a 70 49 74 65  m(Fts5Iter *pIte
1a300 72 2c 20 69 6e 74 20 2a 70 6e 29 7b 0a 20 20 46  r, int *pn){.  F
1a310 74 73 35 53 65 67 49 74 65 72 20 2a 70 20 3d 20  ts5SegIter *p = 
1a320 26 70 49 74 65 72 2d 3e 61 53 65 67 5b 20 70 49  &pIter->aSeg[ pI
1a330 74 65 72 2d 3e 61 46 69 72 73 74 5b 31 5d 2e 69  ter->aFirst[1].i
1a340 46 69 72 73 74 20 5d 3b 0a 20 20 2a 70 6e 20 3d  First ];.  *pn =
1a350 20 70 2d 3e 74 65 72 6d 2e 6e 3b 0a 20 20 72 65   p->term.n;.  re
1a360 74 75 72 6e 20 70 2d 3e 74 65 72 6d 2e 70 3b 0a  turn p->term.p;.
1a370 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74  }../*.** Allocat
1a380 65 20 61 20 6e 65 77 20 73 65 67 6d 65 6e 74 2d  e a new segment-
1a390 69 64 20 66 6f 72 20 74 68 65 20 73 74 72 75 63  id for the struc
1a3a0 74 75 72 65 20 70 53 74 72 75 63 74 2e 20 54 68  ture pStruct. Th
1a3b0 65 20 6e 65 77 20 73 65 67 6d 65 6e 74 0a 2a 2a  e new segment.**
1a3c0 20 69 64 20 6d 75 73 74 20 62 65 20 62 65 74 77   id must be betw
1a3d0 65 65 6e 20 31 20 61 6e 64 20 36 35 33 33 35 20  een 1 and 65335 
1a3e0 69 6e 63 6c 75 73 69 76 65 2c 20 61 6e 64 20 6d  inclusive, and m
1a3f0 75 73 74 20 6e 6f 74 20 62 65 20 75 73 65 64 20  ust not be used 
1a400 62 79 20 0a 2a 2a 20 61 6e 79 20 63 75 72 72 65  by .** any curre
1a410 6e 74 6c 79 20 65 78 69 73 74 69 6e 67 20 73 65  ntly existing se
1a420 67 6d 65 6e 74 2e 20 49 66 20 61 20 66 72 65 65  gment. If a free
1a430 20 73 65 67 6d 65 6e 74 20 69 64 20 63 61 6e 6e   segment id cann
1a440 6f 74 20 62 65 20 66 6f 75 6e 64 2c 0a 2a 2a 20  ot be found,.** 
1a450 53 51 4c 49 54 45 5f 46 55 4c 4c 20 69 73 20 72  SQLITE_FULL is r
1a460 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49  eturned..**.** I
1a470 66 20 61 6e 20 65 72 72 6f 72 20 68 61 73 20 61  f an error has a
1a480 6c 72 65 61 64 79 20 6f 63 63 75 72 72 65 64 2c  lready occurred,
1a490 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
1a4a0 73 20 61 20 6e 6f 2d 6f 70 2e 20 30 20 69 73 20  s a no-op. 0 is 
1a4b0 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 69 6e 20  .** returned in 
1a4c0 74 68 69 73 20 63 61 73 65 2e 0a 2a 2f 0a 73 74  this case..*/.st
1a4d0 61 74 69 63 20 69 6e 74 20 66 74 73 35 41 6c 6c  atic int fts5All
1a4e0 6f 63 61 74 65 53 65 67 69 64 28 46 74 73 35 49  ocateSegid(Fts5I
1a4f0 6e 64 65 78 20 2a 70 2c 20 46 74 73 35 53 74 72  ndex *p, Fts5Str
1a500 75 63 74 75 72 65 20 2a 70 53 74 72 75 63 74 29  ucture *pStruct)
1a510 7b 0a 20 20 69 6e 74 20 69 53 65 67 69 64 20 3d  {.  int iSegid =
1a520 20 30 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 72 63   0;..  if( p->rc
1a530 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
1a540 20 20 20 69 66 28 20 70 53 74 72 75 63 74 2d 3e     if( pStruct->
1a550 6e 53 65 67 6d 65 6e 74 3e 3d 46 54 53 35 5f 4d  nSegment>=FTS5_M
1a560 41 58 5f 53 45 47 4d 45 4e 54 20 29 7b 0a 20 20  AX_SEGMENT ){.  
1a570 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49      p->rc = SQLI
1a580 54 45 5f 46 55 4c 4c 3b 0a 20 20 20 20 7d 65 6c  TE_FULL;.    }el
1a590 73 65 7b 0a 20 20 20 20 20 20 77 68 69 6c 65 28  se{.      while(
1a5a0 20 69 53 65 67 69 64 3d 3d 30 20 29 7b 0a 20 20   iSegid==0 ){.  
1a5b0 20 20 20 20 20 20 69 6e 74 20 69 4c 76 6c 2c 20        int iLvl, 
1a5c0 69 53 65 67 3b 0a 20 20 20 20 20 20 20 20 73 71  iSeg;.        sq
1a5d0 6c 69 74 65 33 5f 72 61 6e 64 6f 6d 6e 65 73 73  lite3_randomness
1a5e0 28 73 69 7a 65 6f 66 28 75 33 32 29 2c 20 28 76  (sizeof(u32), (v
1a5f0 6f 69 64 2a 29 26 69 53 65 67 69 64 29 3b 0a 20  oid*)&iSegid);. 
1a600 20 20 20 20 20 20 20 69 53 65 67 69 64 20 3d 20         iSegid = 
1a610 69 53 65 67 69 64 20 26 20 28 28 31 20 3c 3c 20  iSegid & ((1 << 
1a620 46 54 53 35 5f 44 41 54 41 5f 49 44 5f 42 29 2d  FTS5_DATA_ID_B)-
1a630 31 29 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28  1);.        for(
1a640 69 4c 76 6c 3d 30 3b 20 69 4c 76 6c 3c 70 53 74  iLvl=0; iLvl<pSt
1a650 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 3b 20 69 4c  ruct->nLevel; iL
1a660 76 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20  vl++){.         
1a670 20 66 6f 72 28 69 53 65 67 3d 30 3b 20 69 53 65   for(iSeg=0; iSe
1a680 67 3c 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65  g<pStruct->aLeve
1a690 6c 5b 69 4c 76 6c 5d 2e 6e 53 65 67 3b 20 69 53  l[iLvl].nSeg; iS
1a6a0 65 67 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20  eg++){.         
1a6b0 20 20 20 69 66 28 20 69 53 65 67 69 64 3d 3d 70     if( iSegid==p
1a6c0 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69  Struct->aLevel[i
1a6d0 4c 76 6c 5d 2e 61 53 65 67 5b 69 53 65 67 5d 2e  Lvl].aSeg[iSeg].
1a6e0 69 53 65 67 69 64 20 29 7b 0a 20 20 20 20 20 20  iSegid ){.      
1a6f0 20 20 20 20 20 20 20 20 69 53 65 67 69 64 20 3d          iSegid =
1a700 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   0;.            
1a710 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  }.          }.  
1a720 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
1a730 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74      }.  }..  ret
1a740 75 72 6e 20 69 53 65 67 69 64 3b 0a 7d 0a 0a 2f  urn iSegid;.}../
1a750 2a 0a 2a 2a 20 44 69 73 63 61 72 64 20 61 6c 6c  *.** Discard all
1a760 20 64 61 74 61 20 63 75 72 72 65 6e 74 6c 79 20   data currently 
1a770 63 61 63 68 65 64 20 69 6e 20 74 68 65 20 68 61  cached in the ha
1a780 73 68 2d 74 61 62 6c 65 73 2e 0a 2a 2f 0a 73 74  sh-tables..*/.st
1a790 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 49 6e  atic void fts5In
1a7a0 64 65 78 44 69 73 63 61 72 64 44 61 74 61 28 46  dexDiscardData(F
1a7b0 74 73 35 49 6e 64 65 78 20 2a 70 29 7b 0a 20 20  ts5Index *p){.  
1a7c0 61 73 73 65 72 74 28 20 70 2d 3e 70 48 61 73 68  assert( p->pHash
1a7d0 20 7c 7c 20 70 2d 3e 6e 50 65 6e 64 69 6e 67 44   || p->nPendingD
1a7e0 61 74 61 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20  ata==0 );.  if( 
1a7f0 70 2d 3e 70 48 61 73 68 20 29 7b 0a 20 20 20 20  p->pHash ){.    
1a800 73 71 6c 69 74 65 33 46 74 73 35 48 61 73 68 43  sqlite3Fts5HashC
1a810 6c 65 61 72 28 70 2d 3e 70 48 61 73 68 29 3b 0a  lear(p->pHash);.
1a820 20 20 20 20 70 2d 3e 6e 50 65 6e 64 69 6e 67 44      p->nPendingD
1a830 61 74 61 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a  ata = 0;.  }.}..
1a840 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
1a850 20 73 69 7a 65 20 6f 66 20 74 68 65 20 70 72 65   size of the pre
1a860 66 69 78 2c 20 69 6e 20 62 79 74 65 73 2c 20 74  fix, in bytes, t
1a870 68 61 74 20 62 75 66 66 65 72 20 0a 2a 2a 20 28  hat buffer .** (
1a880 70 4e 65 77 2f 3c 6c 65 6e 67 74 68 2d 75 6e 6b  pNew/<length-unk
1a890 6e 6f 77 6e 3e 29 20 73 68 61 72 65 73 20 77 69  nown>) shares wi
1a8a0 74 68 20 62 75 66 66 65 72 20 28 70 4f 6c 64 2f  th buffer (pOld/
1a8b0 6e 4f 6c 64 29 2e 0a 2a 2a 0a 2a 2a 20 42 75 66  nOld)..**.** Buf
1a8c0 66 65 72 20 28 70 4e 65 77 2f 3c 6c 65 6e 67 74  fer (pNew/<lengt
1a8d0 68 2d 75 6e 6b 6e 6f 77 6e 3e 29 20 69 73 20 67  h-unknown>) is g
1a8e0 75 61 72 61 6e 74 65 65 64 20 74 6f 20 62 65 20  uaranteed to be 
1a8f0 67 72 65 61 74 65 72 20 0a 2a 2a 20 74 68 61 6e  greater .** than
1a900 20 62 75 66 66 65 72 20 28 70 4f 6c 64 2f 6e 4f   buffer (pOld/nO
1a910 6c 64 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ld)..*/.static i
1a920 6e 74 20 66 74 73 35 50 72 65 66 69 78 43 6f 6d  nt fts5PrefixCom
1a930 70 72 65 73 73 28 69 6e 74 20 6e 4f 6c 64 2c 20  press(int nOld, 
1a940 63 6f 6e 73 74 20 75 38 20 2a 70 4f 6c 64 2c 20  const u8 *pOld, 
1a950 63 6f 6e 73 74 20 75 38 20 2a 70 4e 65 77 29 7b  const u8 *pNew){
1a960 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28  .  int i;.  for(
1a970 69 3d 30 3b 20 69 3c 6e 4f 6c 64 3b 20 69 2b 2b  i=0; i<nOld; i++
1a980 29 7b 0a 20 20 20 20 69 66 28 20 70 4f 6c 64 5b  ){.    if( pOld[
1a990 69 5d 21 3d 70 4e 65 77 5b 69 5d 20 29 20 62 72  i]!=pNew[i] ) br
1a9a0 65 61 6b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  eak;.  }.  retur
1a9b0 6e 20 69 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76  n i;.}..static v
1a9c0 6f 69 64 20 66 74 73 35 57 72 69 74 65 44 6c 69  oid fts5WriteDli
1a9d0 64 78 43 6c 65 61 72 28 0a 20 20 46 74 73 35 49  dxClear(.  Fts5I
1a9e0 6e 64 65 78 20 2a 70 2c 20 0a 20 20 46 74 73 35  ndex *p, .  Fts5
1a9f0 53 65 67 57 72 69 74 65 72 20 2a 70 57 72 69 74  SegWriter *pWrit
1aa00 65 72 2c 0a 20 20 69 6e 74 20 62 46 6c 75 73 68  er,.  int bFlush
1aa10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1aa20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 72 75 65        /* If true
1aa30 2c 20 77 72 69 74 65 20 64 6c 69 64 78 20 74 6f  , write dlidx to
1aa40 20 64 69 73 6b 20 2a 2f 0a 29 7b 0a 20 20 69 6e   disk */.){.  in
1aa50 74 20 69 3b 0a 20 20 61 73 73 65 72 74 28 20 62  t i;.  assert( b
1aa60 46 6c 75 73 68 3d 3d 30 20 7c 7c 20 28 70 57 72  Flush==0 || (pWr
1aa70 69 74 65 72 2d 3e 6e 44 6c 69 64 78 3e 30 20 26  iter->nDlidx>0 &
1aa80 26 20 70 57 72 69 74 65 72 2d 3e 61 44 6c 69 64  & pWriter->aDlid
1aa90 78 5b 30 5d 2e 62 75 66 2e 6e 3e 30 29 20 29 3b  x[0].buf.n>0) );
1aaa0 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 57  .  for(i=0; i<pW
1aab0 72 69 74 65 72 2d 3e 6e 44 6c 69 64 78 3b 20 69  riter->nDlidx; i
1aac0 2b 2b 29 7b 0a 20 20 20 20 46 74 73 35 44 6c 69  ++){.    Fts5Dli
1aad0 64 78 57 72 69 74 65 72 20 2a 70 44 6c 69 64 78  dxWriter *pDlidx
1aae0 20 3d 20 26 70 57 72 69 74 65 72 2d 3e 61 44 6c   = &pWriter->aDl
1aaf0 69 64 78 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20  idx[i];.    if( 
1ab00 70 44 6c 69 64 78 2d 3e 62 75 66 2e 6e 3d 3d 30  pDlidx->buf.n==0
1ab10 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 69 66   ) break;.    if
1ab20 28 20 62 46 6c 75 73 68 20 29 7b 0a 20 20 20 20  ( bFlush ){.    
1ab30 20 20 61 73 73 65 72 74 28 20 70 44 6c 69 64 78    assert( pDlidx
1ab40 2d 3e 70 67 6e 6f 21 3d 30 20 29 3b 0a 20 20 20  ->pgno!=0 );.   
1ab50 20 20 20 66 74 73 35 44 61 74 61 57 72 69 74 65     fts5DataWrite
1ab60 28 70 2c 20 0a 20 20 20 20 20 20 20 20 20 20 46  (p, .          F
1ab70 54 53 35 5f 44 4c 49 44 58 5f 52 4f 57 49 44 28  TS5_DLIDX_ROWID(
1ab80 70 57 72 69 74 65 72 2d 3e 69 53 65 67 69 64 2c  pWriter->iSegid,
1ab90 20 69 2c 20 70 44 6c 69 64 78 2d 3e 70 67 6e 6f   i, pDlidx->pgno
1aba0 29 2c 0a 20 20 20 20 20 20 20 20 20 20 70 44 6c  ),.          pDl
1abb0 69 64 78 2d 3e 62 75 66 2e 70 2c 20 70 44 6c 69  idx->buf.p, pDli
1abc0 64 78 2d 3e 62 75 66 2e 6e 0a 20 20 20 20 20 20  dx->buf.n.      
1abd0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
1abe0 69 74 65 33 46 74 73 35 42 75 66 66 65 72 5a 65  ite3Fts5BufferZe
1abf0 72 6f 28 26 70 44 6c 69 64 78 2d 3e 62 75 66 29  ro(&pDlidx->buf)
1ac00 3b 0a 20 20 20 20 70 44 6c 69 64 78 2d 3e 62 50  ;.    pDlidx->bP
1ac10 72 65 76 56 61 6c 69 64 20 3d 20 30 3b 0a 20 20  revValid = 0;.  
1ac20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 72 6f 77 20  }.}../*.** Grow 
1ac30 74 68 65 20 70 57 72 69 74 65 72 2d 3e 61 44 6c  the pWriter->aDl
1ac40 69 64 78 5b 5d 20 61 72 72 61 79 20 74 6f 20 61  idx[] array to a
1ac50 74 20 6c 65 61 73 74 20 6e 4c 76 6c 20 65 6c 65  t least nLvl ele
1ac60 6d 65 6e 74 73 20 69 6e 20 73 69 7a 65 2e 0a 2a  ments in size..*
1ac70 2a 20 41 6e 79 20 6e 65 77 20 61 72 72 61 79 20  * Any new array 
1ac80 65 6c 65 6d 65 6e 74 73 20 61 72 65 20 7a 65 72  elements are zer
1ac90 6f 65 64 20 62 65 66 6f 72 65 20 72 65 74 75 72  oed before retur
1aca0 6e 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ning..*/.static 
1acb0 69 6e 74 20 66 74 73 35 57 72 69 74 65 44 6c 69  int fts5WriteDli
1acc0 64 78 47 72 6f 77 28 0a 20 20 46 74 73 35 49 6e  dxGrow(.  Fts5In
1acd0 64 65 78 20 2a 70 2c 0a 20 20 46 74 73 35 53 65  dex *p,.  Fts5Se
1ace0 67 57 72 69 74 65 72 20 2a 70 57 72 69 74 65 72  gWriter *pWriter
1acf0 2c 0a 20 20 69 6e 74 20 6e 4c 76 6c 0a 29 7b 0a  ,.  int nLvl.){.
1ad00 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c    if( p->rc==SQL
1ad10 49 54 45 5f 4f 4b 20 26 26 20 6e 4c 76 6c 3e 3d  ITE_OK && nLvl>=
1ad20 70 57 72 69 74 65 72 2d 3e 6e 44 6c 69 64 78 20  pWriter->nDlidx 
1ad30 29 7b 0a 20 20 20 20 46 74 73 35 44 6c 69 64 78  ){.    Fts5Dlidx
1ad40 57 72 69 74 65 72 20 2a 61 44 6c 69 64 78 20 3d  Writer *aDlidx =
1ad50 20 28 46 74 73 35 44 6c 69 64 78 57 72 69 74 65   (Fts5DlidxWrite
1ad60 72 2a 29 73 71 6c 69 74 65 33 5f 72 65 61 6c 6c  r*)sqlite3_reall
1ad70 6f 63 28 0a 20 20 20 20 20 20 20 20 70 57 72 69  oc(.        pWri
1ad80 74 65 72 2d 3e 61 44 6c 69 64 78 2c 20 73 69 7a  ter->aDlidx, siz
1ad90 65 6f 66 28 46 74 73 35 44 6c 69 64 78 57 72 69  eof(Fts5DlidxWri
1ada0 74 65 72 29 20 2a 20 6e 4c 76 6c 0a 20 20 20 20  ter) * nLvl.    
1adb0 29 3b 0a 20 20 20 20 69 66 28 20 61 44 6c 69 64  );.    if( aDlid
1adc0 78 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 2d  x==0 ){.      p-
1add0 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d  >rc = SQLITE_NOM
1ade0 45 4d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  EM;.    }else{. 
1adf0 20 20 20 20 20 69 6e 74 20 6e 42 79 74 65 20 3d       int nByte =
1ae00 20 73 69 7a 65 6f 66 28 46 74 73 35 44 6c 69 64   sizeof(Fts5Dlid
1ae10 78 57 72 69 74 65 72 29 20 2a 20 28 6e 4c 76 6c  xWriter) * (nLvl
1ae20 20 2d 20 70 57 72 69 74 65 72 2d 3e 6e 44 6c 69   - pWriter->nDli
1ae30 64 78 29 3b 0a 20 20 20 20 20 20 6d 65 6d 73 65  dx);.      memse
1ae40 74 28 26 61 44 6c 69 64 78 5b 70 57 72 69 74 65  t(&aDlidx[pWrite
1ae50 72 2d 3e 6e 44 6c 69 64 78 5d 2c 20 30 2c 20 6e  r->nDlidx], 0, n
1ae60 42 79 74 65 29 3b 0a 20 20 20 20 20 20 70 57 72  Byte);.      pWr
1ae70 69 74 65 72 2d 3e 61 44 6c 69 64 78 20 3d 20 61  iter->aDlidx = a
1ae80 44 6c 69 64 78 3b 0a 20 20 20 20 20 20 70 57 72  Dlidx;.      pWr
1ae90 69 74 65 72 2d 3e 6e 44 6c 69 64 78 20 3d 20 6e  iter->nDlidx = n
1aea0 4c 76 6c 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  Lvl;.    }.  }. 
1aeb0 20 72 65 74 75 72 6e 20 70 2d 3e 72 63 3b 0a 7d   return p->rc;.}
1aec0 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63  ../*.** If the c
1aed0 75 72 72 65 6e 74 20 64 6f 63 6c 69 73 74 2d 69  urrent doclist-i
1aee0 6e 64 65 78 20 61 63 63 75 6d 75 6c 61 74 69 6e  ndex accumulatin
1aef0 67 20 69 6e 20 70 57 72 69 74 65 72 2d 3e 61 44  g in pWriter->aD
1af00 6c 69 64 78 5b 5d 20 69 73 20 6c 61 72 67 65 0a  lidx[] is large.
1af10 2a 2a 20 65 6e 6f 75 67 68 2c 20 66 6c 75 73 68  ** enough, flush
1af20 20 69 74 20 74 6f 20 64 69 73 6b 20 61 6e 64 20   it to disk and 
1af30 72 65 74 75 72 6e 20 31 2e 20 4f 74 68 65 72 77  return 1. Otherw
1af40 69 73 65 20 64 69 73 63 61 72 64 20 69 74 20 61  ise discard it a
1af50 6e 64 20 72 65 74 75 72 6e 0a 2a 2a 20 7a 65 72  nd return.** zer
1af60 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  o..*/.static int
1af70 20 66 74 73 35 57 72 69 74 65 46 6c 75 73 68 44   fts5WriteFlushD
1af80 6c 69 64 78 28 46 74 73 35 49 6e 64 65 78 20 2a  lidx(Fts5Index *
1af90 70 2c 20 46 74 73 35 53 65 67 57 72 69 74 65 72  p, Fts5SegWriter
1afa0 20 2a 70 57 72 69 74 65 72 29 7b 0a 20 20 69 6e   *pWriter){.  in
1afb0 74 20 62 46 6c 61 67 20 3d 20 30 3b 0a 0a 20 20  t bFlag = 0;..  
1afc0 2f 2a 20 49 66 20 74 68 65 72 65 20 77 65 72 65  /* If there were
1afd0 20 46 54 53 35 5f 4d 49 4e 5f 44 4c 49 44 58 5f   FTS5_MIN_DLIDX_
1afe0 53 49 5a 45 20 6f 72 20 6d 6f 72 65 20 65 6d 70  SIZE or more emp
1aff0 74 79 20 6c 65 61 66 20 70 61 67 65 73 20 77 72  ty leaf pages wr
1b000 69 74 74 65 6e 0a 20 20 2a 2a 20 74 6f 20 74 68  itten.  ** to th
1b010 65 20 64 61 74 61 62 61 73 65 2c 20 61 6c 73 6f  e database, also
1b020 20 77 72 69 74 65 20 74 68 65 20 64 6f 63 6c 69   write the docli
1b030 73 74 2d 69 6e 64 65 78 20 74 6f 20 64 69 73 6b  st-index to disk
1b040 2e 20 20 2a 2f 0a 20 20 69 66 28 20 70 57 72 69  .  */.  if( pWri
1b050 74 65 72 2d 3e 61 44 6c 69 64 78 5b 30 5d 2e 62  ter->aDlidx[0].b
1b060 75 66 2e 6e 3e 30 20 26 26 20 70 57 72 69 74 65  uf.n>0 && pWrite
1b070 72 2d 3e 6e 45 6d 70 74 79 3e 3d 46 54 53 35 5f  r->nEmpty>=FTS5_
1b080 4d 49 4e 5f 44 4c 49 44 58 5f 53 49 5a 45 20 29  MIN_DLIDX_SIZE )
1b090 7b 0a 20 20 20 20 62 46 6c 61 67 20 3d 20 31 3b  {.    bFlag = 1;
1b0a0 0a 20 20 7d 0a 20 20 66 74 73 35 57 72 69 74 65  .  }.  fts5Write
1b0b0 44 6c 69 64 78 43 6c 65 61 72 28 70 2c 20 70 57  DlidxClear(p, pW
1b0c0 72 69 74 65 72 2c 20 62 46 6c 61 67 29 3b 0a 20  riter, bFlag);. 
1b0d0 20 70 57 72 69 74 65 72 2d 3e 6e 45 6d 70 74 79   pWriter->nEmpty
1b0e0 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 62   = 0;.  return b
1b0f0 46 6c 61 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  Flag;.}../*.** T
1b100 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
1b110 63 61 6c 6c 65 64 20 77 68 65 6e 65 76 65 72 20  called whenever 
1b120 70 72 6f 63 65 73 73 69 6e 67 20 6f 66 20 74 68  processing of th
1b130 65 20 64 6f 63 6c 69 73 74 20 66 6f 72 20 74 68  e doclist for th
1b140 65 20 0a 2a 2a 20 6c 61 73 74 20 74 65 72 6d 20  e .** last term 
1b150 6f 6e 20 6c 65 61 66 20 70 61 67 65 20 28 70 57  on leaf page (pW
1b160 72 69 74 65 72 2d 3e 69 42 74 50 61 67 65 29 20  riter->iBtPage) 
1b170 69 73 20 63 6f 6d 70 6c 65 74 65 64 2e 20 0a 2a  is completed. .*
1b180 2a 0a 2a 2a 20 54 68 65 20 64 6f 63 6c 69 73 74  *.** The doclist
1b190 2d 69 6e 64 65 78 20 66 6f 72 20 74 68 61 74 20  -index for that 
1b1a0 74 65 72 6d 20 69 73 20 63 75 72 72 65 6e 74 6c  term is currentl
1b1b0 79 20 73 74 6f 72 65 64 20 69 6e 2d 6d 65 6d 6f  y stored in-memo
1b1c0 72 79 20 77 69 74 68 69 6e 20 74 68 65 0a 2a 2a  ry within the.**
1b1d0 20 46 74 73 35 53 65 67 57 72 69 74 65 72 2e 61   Fts5SegWriter.a
1b1e0 44 6c 69 64 78 5b 5d 20 61 72 72 61 79 2e 20 49  Dlidx[] array. I
1b1f0 66 20 69 74 20 69 73 20 6c 61 72 67 65 20 65 6e  f it is large en
1b200 6f 75 67 68 2c 20 74 68 69 73 20 66 75 6e 63 74  ough, this funct
1b210 69 6f 6e 0a 2a 2a 20 77 72 69 74 65 73 20 69 74  ion.** writes it
1b220 20 6f 75 74 20 74 6f 20 64 69 73 6b 2e 20 4f 72   out to disk. Or
1b230 2c 20 69 66 20 69 74 20 69 73 20 74 6f 6f 20 73  , if it is too s
1b240 6d 61 6c 6c 20 74 6f 20 62 6f 74 68 65 72 20 77  mall to bother w
1b250 69 74 68 2c 20 64 69 73 63 61 72 64 73 0a 2a 2a  ith, discards.**
1b260 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 46 74 73 35 53   it..**.** Fts5S
1b270 65 67 57 72 69 74 65 72 2e 62 74 74 65 72 6d 20  egWriter.btterm 
1b280 63 75 72 72 65 6e 74 6c 79 20 63 6f 6e 74 61 69  currently contai
1b290 6e 73 20 74 68 65 20 66 69 72 73 74 20 74 65 72  ns the first ter
1b2a0 6d 20 6f 6e 20 70 61 67 65 20 69 42 74 50 61 67  m on page iBtPag
1b2b0 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  e..*/.static voi
1b2c0 64 20 66 74 73 35 57 72 69 74 65 46 6c 75 73 68  d fts5WriteFlush
1b2d0 42 74 72 65 65 28 46 74 73 35 49 6e 64 65 78 20  Btree(Fts5Index 
1b2e0 2a 70 2c 20 46 74 73 35 53 65 67 57 72 69 74 65  *p, Fts5SegWrite
1b2f0 72 20 2a 70 57 72 69 74 65 72 29 7b 0a 20 20 69  r *pWriter){.  i
1b300 6e 74 20 62 46 6c 61 67 3b 0a 0a 20 20 61 73 73  nt bFlag;..  ass
1b310 65 72 74 28 20 70 57 72 69 74 65 72 2d 3e 69 42  ert( pWriter->iB
1b320 74 50 61 67 65 20 7c 7c 20 70 57 72 69 74 65 72  tPage || pWriter
1b330 2d 3e 6e 45 6d 70 74 79 3d 3d 30 20 29 3b 0a 20  ->nEmpty==0 );. 
1b340 20 69 66 28 20 70 57 72 69 74 65 72 2d 3e 69 42   if( pWriter->iB
1b350 74 50 61 67 65 3d 3d 30 20 29 20 72 65 74 75 72  tPage==0 ) retur
1b360 6e 3b 0a 20 20 62 46 6c 61 67 20 3d 20 66 74 73  n;.  bFlag = fts
1b370 35 57 72 69 74 65 46 6c 75 73 68 44 6c 69 64 78  5WriteFlushDlidx
1b380 28 70 2c 20 70 57 72 69 74 65 72 29 3b 0a 0a 20  (p, pWriter);.. 
1b390 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49   if( p->rc==SQLI
1b3a0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 63 6f 6e  TE_OK ){.    con
1b3b0 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 28 70 57  st char *z = (pW
1b3c0 72 69 74 65 72 2d 3e 62 74 74 65 72 6d 2e 6e 3e  riter->btterm.n>
1b3d0 30 3f 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 70  0?(const char*)p
1b3e0 57 72 69 74 65 72 2d 3e 62 74 74 65 72 6d 2e 70  Writer->btterm.p
1b3f0 3a 22 22 29 3b 0a 20 20 20 20 2f 2a 20 54 68 65  :"");.    /* The
1b400 20 66 6f 6c 6c 6f 77 69 6e 67 20 77 61 73 20 61   following was a
1b410 6c 72 65 61 64 79 20 64 6f 6e 65 20 69 6e 20 66  lready done in f
1b420 74 73 35 57 72 69 74 65 49 6e 69 74 28 29 3a 20  ts5WriteInit(): 
1b430 2a 2f 0a 20 20 20 20 2f 2a 20 73 71 6c 69 74 65  */.    /* sqlite
1b440 33 5f 62 69 6e 64 5f 69 6e 74 28 70 2d 3e 70 49  3_bind_int(p->pI
1b450 64 78 57 72 69 74 65 72 2c 20 31 2c 20 70 57 72  dxWriter, 1, pWr
1b460 69 74 65 72 2d 3e 69 53 65 67 69 64 29 3b 20 2a  iter->iSegid); *
1b470 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69  /.    sqlite3_bi
1b480 6e 64 5f 62 6c 6f 62 28 70 2d 3e 70 49 64 78 57  nd_blob(p->pIdxW
1b490 72 69 74 65 72 2c 20 32 2c 20 7a 2c 20 70 57 72  riter, 2, z, pWr
1b4a0 69 74 65 72 2d 3e 62 74 74 65 72 6d 2e 6e 2c 20  iter->btterm.n, 
1b4b0 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a  SQLITE_STATIC);.
1b4c0 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64      sqlite3_bind
1b4d0 5f 69 6e 74 36 34 28 70 2d 3e 70 49 64 78 57 72  _int64(p->pIdxWr
1b4e0 69 74 65 72 2c 20 33 2c 20 62 46 6c 61 67 20 2b  iter, 3, bFlag +
1b4f0 20 28 28 69 36 34 29 70 57 72 69 74 65 72 2d 3e   ((i64)pWriter->
1b500 69 42 74 50 61 67 65 3c 3c 31 29 29 3b 0a 20 20  iBtPage<<1));.  
1b510 20 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70    sqlite3_step(p
1b520 2d 3e 70 49 64 78 57 72 69 74 65 72 29 3b 0a 20  ->pIdxWriter);. 
1b530 20 20 20 70 2d 3e 72 63 20 3d 20 73 71 6c 69 74     p->rc = sqlit
1b540 65 33 5f 72 65 73 65 74 28 70 2d 3e 70 49 64 78  e3_reset(p->pIdx
1b550 57 72 69 74 65 72 29 3b 0a 20 20 7d 0a 20 20 70  Writer);.  }.  p
1b560 57 72 69 74 65 72 2d 3e 69 42 74 50 61 67 65 20  Writer->iBtPage 
1b570 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  = 0;.}../*.** Th
1b580 69 73 20 69 73 20 63 61 6c 6c 65 64 20 6f 6e 63  is is called onc
1b590 65 20 66 6f 72 20 65 61 63 68 20 6c 65 61 66 20  e for each leaf 
1b5a0 70 61 67 65 20 65 78 63 65 70 74 20 74 68 65 20  page except the 
1b5b0 66 69 72 73 74 20 74 68 61 74 20 63 6f 6e 74 61  first that conta
1b5c0 69 6e 73 0a 2a 2a 20 61 74 20 6c 65 61 73 74 20  ins.** at least 
1b5d0 6f 6e 65 20 74 65 72 6d 2e 20 41 72 67 75 6d 65  one term. Argume
1b5e0 6e 74 20 28 6e 54 65 72 6d 2f 70 54 65 72 6d 29  nt (nTerm/pTerm)
1b5f0 20 69 73 20 74 68 65 20 73 70 6c 69 74 2d 6b 65   is the split-ke
1b600 79 20 2d 20 61 20 74 65 72 6d 20 74 68 61 74 0a  y - a term that.
1b610 2a 2a 20 69 73 20 6c 61 72 67 65 72 20 74 68 61  ** is larger tha
1b620 6e 20 61 6c 6c 20 74 65 72 6d 73 20 77 72 69 74  n all terms writ
1b630 74 65 6e 20 74 6f 20 65 61 72 6c 69 65 72 20 6c  ten to earlier l
1b640 65 61 76 65 73 2c 20 61 6e 64 20 65 71 75 61 6c  eaves, and equal
1b650 20 74 6f 20 6f 72 0a 2a 2a 20 73 6d 61 6c 6c 65   to or.** smalle
1b660 72 20 74 68 61 6e 20 74 68 65 20 66 69 72 73 74  r than the first
1b670 20 74 65 72 6d 20 6f 6e 20 74 68 65 20 6e 65 77   term on the new
1b680 20 6c 65 61 66 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   leaf..**.** If 
1b690 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  an error occurs,
1b6a0 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69   an error code i
1b6b0 73 20 6c 65 66 74 20 69 6e 20 46 74 73 35 49 6e  s left in Fts5In
1b6c0 64 65 78 2e 72 63 2e 20 49 66 20 61 6e 20 65 72  dex.rc. If an er
1b6d0 72 6f 72 0a 2a 2a 20 68 61 73 20 61 6c 72 65 61  ror.** has alrea
1b6e0 64 79 20 6f 63 63 75 72 72 65 64 20 77 68 65 6e  dy occurred when
1b6f0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
1b700 73 20 63 61 6c 6c 65 64 2c 20 69 74 20 69 73 20  s called, it is 
1b710 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74  a no-op..*/.stat
1b720 69 63 20 76 6f 69 64 20 66 74 73 35 57 72 69 74  ic void fts5Writ
1b730 65 42 74 72 65 65 54 65 72 6d 28 0a 20 20 46 74  eBtreeTerm(.  Ft
1b740 73 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20  s5Index *p,     
1b750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1b760 20 46 54 53 35 20 62 61 63 6b 65 6e 64 20 6f 62   FTS5 backend ob
1b770 6a 65 63 74 20 2a 2f 0a 20 20 46 74 73 35 53 65  ject */.  Fts5Se
1b780 67 57 72 69 74 65 72 20 2a 70 57 72 69 74 65 72  gWriter *pWriter
1b790 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69  ,         /* Wri
1b7a0 74 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  ter object */.  
1b7b0 69 6e 74 20 6e 54 65 72 6d 2c 20 63 6f 6e 73 74  int nTerm, const
1b7c0 20 75 38 20 2a 70 54 65 72 6d 20 20 20 20 20 20   u8 *pTerm      
1b7d0 2f 2a 20 46 69 72 73 74 20 74 65 72 6d 20 6f 6e  /* First term on
1b7e0 20 6e 65 77 20 70 61 67 65 20 2a 2f 0a 29 7b 0a   new page */.){.
1b7f0 20 20 66 74 73 35 57 72 69 74 65 46 6c 75 73 68    fts5WriteFlush
1b800 42 74 72 65 65 28 70 2c 20 70 57 72 69 74 65 72  Btree(p, pWriter
1b810 29 3b 0a 20 20 66 74 73 35 42 75 66 66 65 72 53  );.  fts5BufferS
1b820 65 74 28 26 70 2d 3e 72 63 2c 20 26 70 57 72 69  et(&p->rc, &pWri
1b830 74 65 72 2d 3e 62 74 74 65 72 6d 2c 20 6e 54 65  ter->btterm, nTe
1b840 72 6d 2c 20 70 54 65 72 6d 29 3b 0a 20 20 70 57  rm, pTerm);.  pW
1b850 72 69 74 65 72 2d 3e 69 42 74 50 61 67 65 20 3d  riter->iBtPage =
1b860 20 70 57 72 69 74 65 72 2d 3e 77 72 69 74 65 72   pWriter->writer
1b870 2e 70 67 6e 6f 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  .pgno;.}../*.** 
1b880 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
1b890 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 66 6c 75   called when flu
1b8a0 73 68 69 6e 67 20 61 20 6c 65 61 66 20 70 61 67  shing a leaf pag
1b8b0 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20  e that contains 
1b8c0 6e 6f 0a 2a 2a 20 74 65 72 6d 73 20 61 74 20 61  no.** terms at a
1b8d0 6c 6c 20 74 6f 20 64 69 73 6b 2e 0a 2a 2f 0a 73  ll to disk..*/.s
1b8e0 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 57  tatic void fts5W
1b8f0 72 69 74 65 42 74 72 65 65 4e 6f 54 65 72 6d 28  riteBtreeNoTerm(
1b900 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c  .  Fts5Index *p,
1b910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b920 20 20 20 2f 2a 20 46 54 53 35 20 62 61 63 6b 65     /* FTS5 backe
1b930 6e 64 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 46  nd object */.  F
1b940 74 73 35 53 65 67 57 72 69 74 65 72 20 2a 70 57  ts5SegWriter *pW
1b950 72 69 74 65 72 20 20 20 20 20 20 20 20 20 20 2f  riter          /
1b960 2a 20 57 72 69 74 65 72 20 6f 62 6a 65 63 74 20  * Writer object 
1b970 2a 2f 0a 29 7b 0a 20 20 2f 2a 20 49 66 20 74 68  */.){.  /* If th
1b980 65 72 65 20 77 65 72 65 20 6e 6f 20 72 6f 77 69  ere were no rowi
1b990 64 73 20 6f 6e 20 74 68 65 20 6c 65 61 66 20 70  ds on the leaf p
1b9a0 61 67 65 20 65 69 74 68 65 72 20 61 6e 64 20 74  age either and t
1b9b0 68 65 20 64 6f 63 6c 69 73 74 2d 69 6e 64 65 78  he doclist-index
1b9c0 0a 20 20 2a 2a 20 68 61 73 20 61 6c 72 65 61 64  .  ** has alread
1b9d0 79 20 62 65 65 6e 20 73 74 61 72 74 65 64 2c 20  y been started, 
1b9e0 61 70 70 65 6e 64 20 61 6e 20 30 78 30 30 20 62  append an 0x00 b
1b9f0 79 74 65 20 74 6f 20 69 74 2e 20 20 2a 2f 0a 20  yte to it.  */. 
1ba00 20 69 66 28 20 70 57 72 69 74 65 72 2d 3e 62 46   if( pWriter->bF
1ba10 69 72 73 74 52 6f 77 69 64 49 6e 50 61 67 65 20  irstRowidInPage 
1ba20 26 26 20 70 57 72 69 74 65 72 2d 3e 61 44 6c 69  && pWriter->aDli
1ba30 64 78 5b 30 5d 2e 62 75 66 2e 6e 3e 30 20 29 7b  dx[0].buf.n>0 ){
1ba40 0a 20 20 20 20 46 74 73 35 44 6c 69 64 78 57 72  .    Fts5DlidxWr
1ba50 69 74 65 72 20 2a 70 44 6c 69 64 78 20 3d 20 26  iter *pDlidx = &
1ba60 70 57 72 69 74 65 72 2d 3e 61 44 6c 69 64 78 5b  pWriter->aDlidx[
1ba70 30 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  0];.    assert( 
1ba80 70 44 6c 69 64 78 2d 3e 62 50 72 65 76 56 61 6c  pDlidx->bPrevVal
1ba90 69 64 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  id );.    sqlite
1baa0 33 46 74 73 35 42 75 66 66 65 72 41 70 70 65 6e  3Fts5BufferAppen
1bab0 64 56 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20  dVarint(&p->rc, 
1bac0 26 70 44 6c 69 64 78 2d 3e 62 75 66 2c 20 30 29  &pDlidx->buf, 0)
1bad0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 6e 63 72  ;.  }..  /* Incr
1bae0 65 6d 65 6e 74 20 74 68 65 20 22 6e 75 6d 62 65  ement the "numbe
1baf0 72 20 6f 66 20 73 65 71 75 65 6e 74 69 61 6c 20  r of sequential 
1bb00 6c 65 61 76 65 73 20 77 69 74 68 6f 75 74 20 61  leaves without a
1bb10 20 74 65 72 6d 22 20 63 6f 75 6e 74 65 72 2e 20   term" counter. 
1bb20 2a 2f 0a 20 20 70 57 72 69 74 65 72 2d 3e 6e 45  */.  pWriter->nE
1bb30 6d 70 74 79 2b 2b 3b 0a 7d 0a 0a 73 74 61 74 69  mpty++;.}..stati
1bb40 63 20 69 36 34 20 66 74 73 35 44 6c 69 64 78 45  c i64 fts5DlidxE
1bb50 78 74 72 61 63 74 46 69 72 73 74 52 6f 77 69 64  xtractFirstRowid
1bb60 28 46 74 73 35 42 75 66 66 65 72 20 2a 70 42 75  (Fts5Buffer *pBu
1bb70 66 29 7b 0a 20 20 69 36 34 20 69 52 6f 77 69 64  f){.  i64 iRowid
1bb80 3b 0a 20 20 69 6e 74 20 69 4f 66 66 3b 0a 0a 20  ;.  int iOff;.. 
1bb90 20 69 4f 66 66 20 3d 20 31 20 2b 20 66 74 73 35   iOff = 1 + fts5
1bba0 47 65 74 56 61 72 69 6e 74 28 26 70 42 75 66 2d  GetVarint(&pBuf-
1bbb0 3e 70 5b 31 5d 2c 20 28 75 36 34 2a 29 26 69 52  >p[1], (u64*)&iR
1bbc0 6f 77 69 64 29 3b 0a 20 20 66 74 73 35 47 65 74  owid);.  fts5Get
1bbd0 56 61 72 69 6e 74 28 26 70 42 75 66 2d 3e 70 5b  Varint(&pBuf->p[
1bbe0 69 4f 66 66 5d 2c 20 28 75 36 34 2a 29 26 69 52  iOff], (u64*)&iR
1bbf0 6f 77 69 64 29 3b 0a 20 20 72 65 74 75 72 6e 20  owid);.  return 
1bc00 69 52 6f 77 69 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  iRowid;.}../*.**
1bc10 20 52 6f 77 69 64 20 69 52 6f 77 69 64 20 68 61   Rowid iRowid ha
1bc20 73 20 6a 75 73 74 20 62 65 65 6e 20 61 70 70 65  s just been appe
1bc30 6e 64 65 64 20 74 6f 20 74 68 65 20 63 75 72 72  nded to the curr
1bc40 65 6e 74 20 6c 65 61 66 20 70 61 67 65 2e 20 49  ent leaf page. I
1bc50 74 20 69 73 20 74 68 65 0a 2a 2a 20 66 69 72 73  t is the.** firs
1bc60 74 20 6f 6e 20 74 68 65 20 70 61 67 65 2e 20 54  t on the page. T
1bc70 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 70 70  his function app
1bc80 65 6e 64 73 20 61 6e 20 61 70 70 72 6f 70 72 69  ends an appropri
1bc90 61 74 65 20 65 6e 74 72 79 20 74 6f 20 74 68 65  ate entry to the
1bca0 20 63 75 72 72 65 6e 74 0a 2a 2a 20 64 6f 63 6c   current.** docl
1bcb0 69 73 74 2d 69 6e 64 65 78 2e 0a 2a 2f 0a 73 74  ist-index..*/.st
1bcc0 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 57 72  atic void fts5Wr
1bcd0 69 74 65 44 6c 69 64 78 41 70 70 65 6e 64 28 0a  iteDlidxAppend(.
1bce0 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20    Fts5Index *p, 
1bcf0 0a 20 20 46 74 73 35 53 65 67 57 72 69 74 65 72  .  Fts5SegWriter
1bd00 20 2a 70 57 72 69 74 65 72 2c 20 0a 20 20 69 36   *pWriter, .  i6
1bd10 34 20 69 52 6f 77 69 64 0a 29 7b 0a 20 20 69 6e  4 iRowid.){.  in
1bd20 74 20 69 3b 0a 20 20 69 6e 74 20 62 44 6f 6e 65  t i;.  int bDone
1bd30 20 3d 20 30 3b 0a 0a 20 20 66 6f 72 28 69 3d 30   = 0;..  for(i=0
1bd40 3b 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ; p->rc==SQLITE_
1bd50 4f 4b 20 26 26 20 62 44 6f 6e 65 3d 3d 30 3b 20  OK && bDone==0; 
1bd60 69 2b 2b 29 7b 0a 20 20 20 20 69 36 34 20 69 56  i++){.    i64 iV
1bd70 61 6c 3b 0a 20 20 20 20 46 74 73 35 44 6c 69 64  al;.    Fts5Dlid
1bd80 78 57 72 69 74 65 72 20 2a 70 44 6c 69 64 78 20  xWriter *pDlidx 
1bd90 3d 20 26 70 57 72 69 74 65 72 2d 3e 61 44 6c 69  = &pWriter->aDli
1bda0 64 78 5b 69 5d 3b 0a 0a 20 20 20 20 69 66 28 20  dx[i];..    if( 
1bdb0 70 44 6c 69 64 78 2d 3e 62 75 66 2e 6e 3e 3d 70  pDlidx->buf.n>=p
1bdc0 2d 3e 70 43 6f 6e 66 69 67 2d 3e 70 67 73 7a 20  ->pConfig->pgsz 
1bdd0 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ){.      /* The 
1bde0 63 75 72 72 65 6e 74 20 64 6f 63 6c 69 73 74 2d  current doclist-
1bdf0 69 6e 64 65 78 20 70 61 67 65 20 69 73 20 66 75  index page is fu
1be00 6c 6c 2e 20 57 72 69 74 65 20 69 74 20 74 6f 20  ll. Write it to 
1be10 64 69 73 6b 20 61 6e 64 20 70 75 73 68 0a 20 20  disk and push.  
1be20 20 20 20 20 2a 2a 20 61 20 63 6f 70 79 20 6f 66      ** a copy of
1be30 20 69 52 6f 77 69 64 20 28 77 68 69 63 68 20 77   iRowid (which w
1be40 69 6c 6c 20 62 65 63 6f 6d 65 20 74 68 65 20 66  ill become the f
1be50 69 72 73 74 20 72 6f 77 69 64 20 6f 6e 20 74 68  irst rowid on th
1be60 65 20 6e 65 78 74 0a 20 20 20 20 20 20 2a 2a 20  e next.      ** 
1be70 64 6f 63 6c 69 73 74 2d 69 6e 64 65 78 20 6c 65  doclist-index le
1be80 61 66 20 70 61 67 65 29 20 75 70 20 69 6e 74 6f  af page) up into
1be90 20 74 68 65 20 6e 65 78 74 20 6c 65 76 65 6c 20   the next level 
1bea0 6f 66 20 74 68 65 20 62 2d 74 72 65 65 20 0a 20  of the b-tree . 
1beb0 20 20 20 20 20 2a 2a 20 68 69 65 72 61 72 63 68       ** hierarch
1bec0 79 2e 20 49 66 20 74 68 65 20 6e 6f 64 65 20 62  y. If the node b
1bed0 65 69 6e 67 20 66 6c 75 73 68 65 64 20 69 73 20  eing flushed is 
1bee0 63 75 72 72 65 6e 74 6c 79 20 74 68 65 20 72 6f  currently the ro
1bef0 6f 74 20 6e 6f 64 65 2c 0a 20 20 20 20 20 20 2a  ot node,.      *
1bf00 2a 20 61 6c 73 6f 20 70 75 73 68 20 69 74 73 20  * also push its 
1bf10 66 69 72 73 74 20 72 6f 77 69 64 20 75 70 77 61  first rowid upwa
1bf20 72 64 73 2e 20 2a 2f 0a 20 20 20 20 20 20 70 44  rds. */.      pD
1bf30 6c 69 64 78 2d 3e 62 75 66 2e 70 5b 30 5d 20 3d  lidx->buf.p[0] =
1bf40 20 30 78 30 31 3b 20 20 20 20 2f 2a 20 4e 6f 74   0x01;    /* Not
1bf50 20 74 68 65 20 72 6f 6f 74 20 6e 6f 64 65 20 2a   the root node *
1bf60 2f 0a 20 20 20 20 20 20 66 74 73 35 44 61 74 61  /.      fts5Data
1bf70 57 72 69 74 65 28 70 2c 20 0a 20 20 20 20 20 20  Write(p, .      
1bf80 20 20 20 20 46 54 53 35 5f 44 4c 49 44 58 5f 52      FTS5_DLIDX_R
1bf90 4f 57 49 44 28 70 57 72 69 74 65 72 2d 3e 69 53  OWID(pWriter->iS
1bfa0 65 67 69 64 2c 20 69 2c 20 70 44 6c 69 64 78 2d  egid, i, pDlidx-
1bfb0 3e 70 67 6e 6f 29 2c 0a 20 20 20 20 20 20 20 20  >pgno),.        
1bfc0 20 20 70 44 6c 69 64 78 2d 3e 62 75 66 2e 70 2c    pDlidx->buf.p,
1bfd0 20 70 44 6c 69 64 78 2d 3e 62 75 66 2e 6e 0a 20   pDlidx->buf.n. 
1bfe0 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 66 74       );.      ft
1bff0 73 35 57 72 69 74 65 44 6c 69 64 78 47 72 6f 77  s5WriteDlidxGrow
1c000 28 70 2c 20 70 57 72 69 74 65 72 2c 20 69 2b 32  (p, pWriter, i+2
1c010 29 3b 0a 20 20 20 20 20 20 70 44 6c 69 64 78 20  );.      pDlidx 
1c020 3d 20 26 70 57 72 69 74 65 72 2d 3e 61 44 6c 69  = &pWriter->aDli
1c030 64 78 5b 69 5d 3b 0a 20 20 20 20 20 20 69 66 28  dx[i];.      if(
1c040 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
1c050 4b 20 26 26 20 70 44 6c 69 64 78 5b 31 5d 2e 62  K && pDlidx[1].b
1c060 75 66 2e 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20  uf.n==0 ){.     
1c070 20 20 20 69 36 34 20 69 46 69 72 73 74 20 3d 20     i64 iFirst = 
1c080 66 74 73 35 44 6c 69 64 78 45 78 74 72 61 63 74  fts5DlidxExtract
1c090 46 69 72 73 74 52 6f 77 69 64 28 26 70 44 6c 69  FirstRowid(&pDli
1c0a0 64 78 2d 3e 62 75 66 29 3b 0a 0a 20 20 20 20 20  dx->buf);..     
1c0b0 20 20 20 2f 2a 20 54 68 69 73 20 77 61 73 20 74     /* This was t
1c0c0 68 65 20 72 6f 6f 74 20 6e 6f 64 65 2e 20 50 75  he root node. Pu
1c0d0 73 68 20 69 74 73 20 66 69 72 73 74 20 72 6f 77  sh its first row
1c0e0 69 64 20 75 70 20 74 6f 20 74 68 65 20 6e 65 77  id up to the new
1c0f0 20 72 6f 6f 74 2e 20 2a 2f 0a 20 20 20 20 20 20   root. */.      
1c100 20 20 70 44 6c 69 64 78 5b 31 5d 2e 70 67 6e 6f    pDlidx[1].pgno
1c110 20 3d 20 70 44 6c 69 64 78 2d 3e 70 67 6e 6f 3b   = pDlidx->pgno;
1c120 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
1c130 46 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64  Fts5BufferAppend
1c140 56 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26  Varint(&p->rc, &
1c150 70 44 6c 69 64 78 5b 31 5d 2e 62 75 66 2c 20 30  pDlidx[1].buf, 0
1c160 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
1c170 65 33 46 74 73 35 42 75 66 66 65 72 41 70 70 65  e3Fts5BufferAppe
1c180 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c  ndVarint(&p->rc,
1c190 20 26 70 44 6c 69 64 78 5b 31 5d 2e 62 75 66 2c   &pDlidx[1].buf,
1c1a0 20 70 44 6c 69 64 78 2d 3e 70 67 6e 6f 29 3b 0a   pDlidx->pgno);.
1c1b0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 46          sqlite3F
1c1c0 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 56  ts5BufferAppendV
1c1d0 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26 70  arint(&p->rc, &p
1c1e0 44 6c 69 64 78 5b 31 5d 2e 62 75 66 2c 20 69 46  Dlidx[1].buf, iF
1c1f0 69 72 73 74 29 3b 0a 20 20 20 20 20 20 20 20 70  irst);.        p
1c200 44 6c 69 64 78 5b 31 5d 2e 62 50 72 65 76 56 61  Dlidx[1].bPrevVa
1c210 6c 69 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  lid = 1;.       
1c220 20 70 44 6c 69 64 78 5b 31 5d 2e 69 50 72 65 76   pDlidx[1].iPrev
1c230 20 3d 20 69 46 69 72 73 74 3b 0a 20 20 20 20 20   = iFirst;.     
1c240 20 7d 0a 0a 20 20 20 20 20 20 73 71 6c 69 74 65   }..      sqlite
1c250 33 46 74 73 35 42 75 66 66 65 72 5a 65 72 6f 28  3Fts5BufferZero(
1c260 26 70 44 6c 69 64 78 2d 3e 62 75 66 29 3b 0a 20  &pDlidx->buf);. 
1c270 20 20 20 20 20 70 44 6c 69 64 78 2d 3e 62 50 72       pDlidx->bPr
1c280 65 76 56 61 6c 69 64 20 3d 20 30 3b 0a 20 20 20  evValid = 0;.   
1c290 20 20 20 70 44 6c 69 64 78 2d 3e 70 67 6e 6f 2b     pDlidx->pgno+
1c2a0 2b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  +;.    }else{.  
1c2b0 20 20 20 20 62 44 6f 6e 65 20 3d 20 31 3b 0a 20      bDone = 1;. 
1c2c0 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 70 44     }..    if( pD
1c2d0 6c 69 64 78 2d 3e 62 50 72 65 76 56 61 6c 69 64  lidx->bPrevValid
1c2e0 20 29 7b 0a 20 20 20 20 20 20 69 56 61 6c 20 3d   ){.      iVal =
1c2f0 20 69 52 6f 77 69 64 20 2d 20 70 44 6c 69 64 78   iRowid - pDlidx
1c300 2d 3e 69 50 72 65 76 3b 0a 20 20 20 20 7d 65 6c  ->iPrev;.    }el
1c310 73 65 7b 0a 20 20 20 20 20 20 69 36 34 20 69 50  se{.      i64 iP
1c320 67 6e 6f 20 3d 20 28 69 3d 3d 30 20 3f 20 70 57  gno = (i==0 ? pW
1c330 72 69 74 65 72 2d 3e 77 72 69 74 65 72 2e 70 67  riter->writer.pg
1c340 6e 6f 20 3a 20 70 44 6c 69 64 78 5b 2d 31 5d 2e  no : pDlidx[-1].
1c350 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 61 73 73  pgno);.      ass
1c360 65 72 74 28 20 70 44 6c 69 64 78 2d 3e 62 75 66  ert( pDlidx->buf
1c370 2e 6e 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 73  .n==0 );.      s
1c380 71 6c 69 74 65 33 46 74 73 35 42 75 66 66 65 72  qlite3Fts5Buffer
1c390 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26 70 2d  AppendVarint(&p-
1c3a0 3e 72 63 2c 20 26 70 44 6c 69 64 78 2d 3e 62 75  >rc, &pDlidx->bu
1c3b0 66 2c 20 21 62 44 6f 6e 65 29 3b 0a 20 20 20 20  f, !bDone);.    
1c3c0 20 20 73 71 6c 69 74 65 33 46 74 73 35 42 75 66    sqlite3Fts5Buf
1c3d0 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e 74 28  ferAppendVarint(
1c3e0 26 70 2d 3e 72 63 2c 20 26 70 44 6c 69 64 78 2d  &p->rc, &pDlidx-
1c3f0 3e 62 75 66 2c 20 69 50 67 6e 6f 29 3b 0a 20 20  >buf, iPgno);.  
1c400 20 20 20 20 69 56 61 6c 20 3d 20 69 52 6f 77 69      iVal = iRowi
1c410 64 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 73 71  d;.    }..    sq
1c420 6c 69 74 65 33 46 74 73 35 42 75 66 66 65 72 41  lite3Fts5BufferA
1c430 70 70 65 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e  ppendVarint(&p->
1c440 72 63 2c 20 26 70 44 6c 69 64 78 2d 3e 62 75 66  rc, &pDlidx->buf
1c450 2c 20 69 56 61 6c 29 3b 0a 20 20 20 20 70 44 6c  , iVal);.    pDl
1c460 69 64 78 2d 3e 62 50 72 65 76 56 61 6c 69 64 20  idx->bPrevValid 
1c470 3d 20 31 3b 0a 20 20 20 20 70 44 6c 69 64 78 2d  = 1;.    pDlidx-
1c480 3e 69 50 72 65 76 20 3d 20 69 52 6f 77 69 64 3b  >iPrev = iRowid;
1c490 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 76  .  }.}..static v
1c4a0 6f 69 64 20 66 74 73 35 57 72 69 74 65 46 6c 75  oid fts5WriteFlu
1c4b0 73 68 4c 65 61 66 28 46 74 73 35 49 6e 64 65 78  shLeaf(Fts5Index
1c4c0 20 2a 70 2c 20 46 74 73 35 53 65 67 57 72 69 74   *p, Fts5SegWrit
1c4d0 65 72 20 2a 70 57 72 69 74 65 72 29 7b 0a 20 20  er *pWriter){.  
1c4e0 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 38 20  static const u8 
1c4f0 7a 65 72 6f 5b 5d 20 3d 20 7b 20 30 78 30 30 2c  zero[] = { 0x00,
1c500 20 30 78 30 30 2c 20 30 78 30 30 2c 20 30 78 30   0x00, 0x00, 0x0
1c510 30 20 7d 3b 0a 20 20 46 74 73 35 50 61 67 65 57  0 };.  Fts5PageW
1c520 72 69 74 65 72 20 2a 70 50 61 67 65 20 3d 20 26  riter *pPage = &
1c530 70 57 72 69 74 65 72 2d 3e 77 72 69 74 65 72 3b  pWriter->writer;
1c540 0a 20 20 69 36 34 20 69 52 6f 77 69 64 3b 0a 0a  .  i64 iRowid;..
1c550 20 20 61 73 73 65 72 74 28 20 28 70 50 61 67 65    assert( (pPage
1c560 2d 3e 70 67 69 64 78 2e 6e 3d 3d 30 29 3d 3d 28  ->pgidx.n==0)==(
1c570 70 57 72 69 74 65 72 2d 3e 62 46 69 72 73 74 54  pWriter->bFirstT
1c580 65 72 6d 49 6e 50 61 67 65 29 20 29 3b 0a 0a 20  ermInPage) );.. 
1c590 20 2f 2a 20 53 65 74 20 74 68 65 20 73 7a 4c 65   /* Set the szLe
1c5a0 61 66 20 68 65 61 64 65 72 20 66 69 65 6c 64 2e  af header field.
1c5b0 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 30 3d   */.  assert( 0=
1c5c0 3d 66 74 73 35 47 65 74 55 31 36 28 26 70 50 61  =fts5GetU16(&pPa
1c5d0 67 65 2d 3e 62 75 66 2e 70 5b 32 5d 29 20 29 3b  ge->buf.p[2]) );
1c5e0 0a 20 20 66 74 73 35 50 75 74 55 31 36 28 26 70  .  fts5PutU16(&p
1c5f0 50 61 67 65 2d 3e 62 75 66 2e 70 5b 32 5d 2c 20  Page->buf.p[2], 
1c600 28 75 31 36 29 70 50 61 67 65 2d 3e 62 75 66 2e  (u16)pPage->buf.
1c610 6e 29 3b 0a 0a 20 20 69 66 28 20 70 57 72 69 74  n);..  if( pWrit
1c620 65 72 2d 3e 62 46 69 72 73 74 54 65 72 6d 49 6e  er->bFirstTermIn
1c630 50 61 67 65 20 29 7b 0a 20 20 20 20 2f 2a 20 4e  Page ){.    /* N
1c640 6f 20 74 65 72 6d 20 77 61 73 20 77 72 69 74 74  o term was writt
1c650 65 6e 20 74 6f 20 74 68 69 73 20 70 61 67 65 2e  en to this page.
1c660 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
1c670 70 50 61 67 65 2d 3e 70 67 69 64 78 2e 6e 3d 3d  pPage->pgidx.n==
1c680 30 20 29 3b 0a 20 20 20 20 66 74 73 35 57 72 69  0 );.    fts5Wri
1c690 74 65 42 74 72 65 65 4e 6f 54 65 72 6d 28 70 2c  teBtreeNoTerm(p,
1c6a0 20 70 57 72 69 74 65 72 29 3b 0a 20 20 7d 65 6c   pWriter);.  }el
1c6b0 73 65 7b 0a 20 20 20 20 2f 2a 20 41 70 70 65 6e  se{.    /* Appen
1c6c0 64 20 74 68 65 20 70 67 69 64 78 20 74 6f 20 74  d the pgidx to t
1c6d0 68 65 20 70 61 67 65 20 62 75 66 66 65 72 2e 20  he page buffer. 
1c6e0 53 65 74 20 74 68 65 20 73 7a 4c 65 61 66 20 68  Set the szLeaf h
1c6f0 65 61 64 65 72 20 66 69 65 6c 64 2e 20 2a 2f 0a  eader field. */.
1c700 20 20 20 20 66 74 73 35 42 75 66 66 65 72 41 70      fts5BufferAp
1c710 70 65 6e 64 42 6c 6f 62 28 26 70 2d 3e 72 63 2c  pendBlob(&p->rc,
1c720 20 26 70 50 61 67 65 2d 3e 62 75 66 2c 20 70 50   &pPage->buf, pP
1c730 61 67 65 2d 3e 70 67 69 64 78 2e 6e 2c 20 70 50  age->pgidx.n, pP
1c740 61 67 65 2d 3e 70 67 69 64 78 2e 70 29 3b 0a 20  age->pgidx.p);. 
1c750 20 7d 0a 0a 20 20 2f 2a 20 57 72 69 74 65 20 74   }..  /* Write t
1c760 68 65 20 70 61 67 65 20 6f 75 74 20 74 6f 20 64  he page out to d
1c770 69 73 6b 20 2a 2f 0a 20 20 69 52 6f 77 69 64 20  isk */.  iRowid 
1c780 3d 20 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f 52  = FTS5_SEGMENT_R
1c790 4f 57 49 44 28 70 57 72 69 74 65 72 2d 3e 69 53  OWID(pWriter->iS
1c7a0 65 67 69 64 2c 20 70 50 61 67 65 2d 3e 70 67 6e  egid, pPage->pgn
1c7b0 6f 29 3b 0a 20 20 66 74 73 35 44 61 74 61 57 72  o);.  fts5DataWr
1c7c0 69 74 65 28 70 2c 20 69 52 6f 77 69 64 2c 20 70  ite(p, iRowid, p
1c7d0 50 61 67 65 2d 3e 62 75 66 2e 70 2c 20 70 50 61  Page->buf.p, pPa
1c7e0 67 65 2d 3e 62 75 66 2e 6e 29 3b 0a 0a 20 20 2f  ge->buf.n);..  /
1c7f0 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65  * Initialize the
1c800 20 6e 65 78 74 20 70 61 67 65 2e 20 2a 2f 0a 20   next page. */. 
1c810 20 66 74 73 35 42 75 66 66 65 72 5a 65 72 6f 28   fts5BufferZero(
1c820 26 70 50 61 67 65 2d 3e 62 75 66 29 3b 0a 20 20  &pPage->buf);.  
1c830 66 74 73 35 42 75 66 66 65 72 5a 65 72 6f 28 26  fts5BufferZero(&
1c840 70 50 61 67 65 2d 3e 70 67 69 64 78 29 3b 0a 20  pPage->pgidx);. 
1c850 20 66 74 73 35 42 75 66 66 65 72 41 70 70 65 6e   fts5BufferAppen
1c860 64 42 6c 6f 62 28 26 70 2d 3e 72 63 2c 20 26 70  dBlob(&p->rc, &p
1c870 50 61 67 65 2d 3e 62 75 66 2c 20 34 2c 20 7a 65  Page->buf, 4, ze
1c880 72 6f 29 3b 0a 20 20 70 50 61 67 65 2d 3e 69 50  ro);.  pPage->iP
1c890 72 65 76 50 67 69 64 78 20 3d 20 30 3b 0a 20 20  revPgidx = 0;.  
1c8a0 70 50 61 67 65 2d 3e 70 67 6e 6f 2b 2b 3b 0a 0a  pPage->pgno++;..
1c8b0 20 20 2f 2a 20 49 6e 63 72 65 61 73 65 20 74 68    /* Increase th
1c8c0 65 20 6c 65 61 76 65 73 20 77 72 69 74 74 65 6e  e leaves written
1c8d0 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 70 57   counter */.  pW
1c8e0 72 69 74 65 72 2d 3e 6e 4c 65 61 66 57 72 69 74  riter->nLeafWrit
1c8f0 74 65 6e 2b 2b 3b 0a 0a 20 20 2f 2a 20 54 68 65  ten++;..  /* The
1c900 20 6e 65 77 20 6c 65 61 66 20 68 6f 6c 64 73 20   new leaf holds 
1c910 6e 6f 20 74 65 72 6d 73 20 6f 72 20 72 6f 77 69  no terms or rowi
1c920 64 73 20 2a 2f 0a 20 20 70 57 72 69 74 65 72 2d  ds */.  pWriter-
1c930 3e 62 46 69 72 73 74 54 65 72 6d 49 6e 50 61 67  >bFirstTermInPag
1c940 65 20 3d 20 31 3b 0a 20 20 70 57 72 69 74 65 72  e = 1;.  pWriter
1c950 2d 3e 62 46 69 72 73 74 52 6f 77 69 64 49 6e 50  ->bFirstRowidInP
1c960 61 67 65 20 3d 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a  age = 1;.}../*.*
1c970 2a 20 41 70 70 65 6e 64 20 74 65 72 6d 20 70 54  * Append term pT
1c980 65 72 6d 2f 6e 54 65 72 6d 20 74 6f 20 74 68 65  erm/nTerm to the
1c990 20 73 65 67 6d 65 6e 74 20 62 65 69 6e 67 20 77   segment being w
1c9a0 72 69 74 74 65 6e 20 62 79 20 74 68 65 20 77 72  ritten by the wr
1c9b0 69 74 65 72 20 70 61 73 73 65 64 0a 2a 2a 20 61  iter passed.** a
1c9c0 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67  s the second arg
1c9d0 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ument..**.** If 
1c9e0 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  an error occurs,
1c9f0 20 73 65 74 20 74 68 65 20 46 74 73 35 49 6e 64   set the Fts5Ind
1ca00 65 78 2e 72 63 20 65 72 72 6f 72 20 63 6f 64 65  ex.rc error code
1ca10 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20 68 61  . If an error ha
1ca20 73 20 0a 2a 2a 20 61 6c 72 65 61 64 79 20 6f 63  s .** already oc
1ca30 63 75 72 72 65 64 2c 20 74 68 69 73 20 66 75 6e  curred, this fun
1ca40 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70  ction is a no-op
1ca50 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
1ca60 20 66 74 73 35 57 72 69 74 65 41 70 70 65 6e 64   fts5WriteAppend
1ca70 54 65 72 6d 28 0a 20 20 46 74 73 35 49 6e 64 65  Term(.  Fts5Inde
1ca80 78 20 2a 70 2c 20 0a 20 20 46 74 73 35 53 65 67  x *p, .  Fts5Seg
1ca90 57 72 69 74 65 72 20 2a 70 57 72 69 74 65 72 2c  Writer *pWriter,
1caa0 0a 20 20 69 6e 74 20 6e 54 65 72 6d 2c 20 63 6f  .  int nTerm, co
1cab0 6e 73 74 20 75 38 20 2a 70 54 65 72 6d 20 0a 29  nst u8 *pTerm .)
1cac0 7b 0a 20 20 69 6e 74 20 6e 50 72 65 66 69 78 3b  {.  int nPrefix;
1cad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cae0 20 20 20 20 2f 2a 20 42 79 74 65 73 20 6f 66 20      /* Bytes of 
1caf0 70 72 65 66 69 78 20 63 6f 6d 70 72 65 73 73 69  prefix compressi
1cb00 6f 6e 20 66 6f 72 20 74 65 72 6d 20 2a 2f 0a 20  on for term */. 
1cb10 20 46 74 73 35 50 61 67 65 57 72 69 74 65 72 20   Fts5PageWriter 
1cb20 2a 70 50 61 67 65 20 3d 20 26 70 57 72 69 74 65  *pPage = &pWrite
1cb30 72 2d 3e 77 72 69 74 65 72 3b 0a 20 20 46 74 73  r->writer;.  Fts
1cb40 35 42 75 66 66 65 72 20 2a 70 50 67 69 64 78 20  5Buffer *pPgidx 
1cb50 3d 20 26 70 57 72 69 74 65 72 2d 3e 77 72 69 74  = &pWriter->writ
1cb60 65 72 2e 70 67 69 64 78 3b 0a 0a 20 20 61 73 73  er.pgidx;..  ass
1cb70 65 72 74 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49  ert( p->rc==SQLI
1cb80 54 45 5f 4f 4b 20 29 3b 0a 20 20 61 73 73 65 72  TE_OK );.  asser
1cb90 74 28 20 70 50 61 67 65 2d 3e 62 75 66 2e 6e 3e  t( pPage->buf.n>
1cba0 3d 34 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =4 );.  assert( 
1cbb0 70 50 61 67 65 2d 3e 62 75 66 2e 6e 3e 34 20 7c  pPage->buf.n>4 |
1cbc0 7c 20 70 57 72 69 74 65 72 2d 3e 62 46 69 72 73  | pWriter->bFirs
1cbd0 74 54 65 72 6d 49 6e 50 61 67 65 20 29 3b 0a 0a  tTermInPage );..
1cbe0 20 20 2f 2a 20 49 66 20 74 68 65 20 63 75 72 72    /* If the curr
1cbf0 65 6e 74 20 6c 65 61 66 20 70 61 67 65 20 69 73  ent leaf page is
1cc00 20 66 75 6c 6c 2c 20 66 6c 75 73 68 20 69 74 20   full, flush it 
1cc10 74 6f 20 64 69 73 6b 2e 20 2a 2f 0a 20 20 69 66  to disk. */.  if
1cc20 28 20 28 70 50 61 67 65 2d 3e 62 75 66 2e 6e 20  ( (pPage->buf.n 
1cc30 2b 20 70 50 67 69 64 78 2d 3e 6e 20 2b 20 6e 54  + pPgidx->n + nT
1cc40 65 72 6d 20 2b 20 32 29 3e 3d 70 2d 3e 70 43 6f  erm + 2)>=p->pCo
1cc50 6e 66 69 67 2d 3e 70 67 73 7a 20 29 7b 0a 20 20  nfig->pgsz ){.  
1cc60 20 20 69 66 28 20 70 50 61 67 65 2d 3e 62 75 66    if( pPage->buf
1cc70 2e 6e 3e 34 20 29 7b 0a 20 20 20 20 20 20 66 74  .n>4 ){.      ft
1cc80 73 35 57 72 69 74 65 46 6c 75 73 68 4c 65 61 66  s5WriteFlushLeaf
1cc90 28 70 2c 20 70 57 72 69 74 65 72 29 3b 0a 20 20  (p, pWriter);.  
1cca0 20 20 7d 0a 20 20 20 20 66 74 73 35 42 75 66 66    }.    fts5Buff
1ccb0 65 72 47 72 6f 77 28 26 70 2d 3e 72 63 2c 20 26  erGrow(&p->rc, &
1ccc0 70 50 61 67 65 2d 3e 62 75 66 2c 20 6e 54 65 72  pPage->buf, nTer
1ccd0 6d 2b 46 54 53 35 5f 44 41 54 41 5f 50 41 44 44  m+FTS5_DATA_PADD
1cce0 49 4e 47 29 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f  ING);.  }.  .  /
1ccf0 2a 20 54 4f 44 4f 31 3a 20 55 70 64 61 74 69 6e  * TODO1: Updatin
1cd00 67 20 70 67 69 64 78 20 68 65 72 65 2e 20 2a 2f  g pgidx here. */
1cd10 0a 20 20 70 50 67 69 64 78 2d 3e 6e 20 2b 3d 20  .  pPgidx->n += 
1cd20 73 71 6c 69 74 65 33 46 74 73 35 50 75 74 56 61  sqlite3Fts5PutVa
1cd30 72 69 6e 74 28 0a 20 20 20 20 20 20 26 70 50 67  rint(.      &pPg
1cd40 69 64 78 2d 3e 70 5b 70 50 67 69 64 78 2d 3e 6e  idx->p[pPgidx->n
1cd50 5d 2c 20 70 50 61 67 65 2d 3e 62 75 66 2e 6e 20  ], pPage->buf.n 
1cd60 2d 20 70 50 61 67 65 2d 3e 69 50 72 65 76 50 67  - pPage->iPrevPg
1cd70 69 64 78 0a 20 20 29 3b 0a 20 20 70 50 61 67 65  idx.  );.  pPage
1cd80 2d 3e 69 50 72 65 76 50 67 69 64 78 20 3d 20 70  ->iPrevPgidx = p
1cd90 50 61 67 65 2d 3e 62 75 66 2e 6e 3b 0a 23 69 66  Page->buf.n;.#if
1cda0 20 30 0a 20 20 66 74 73 35 50 75 74 55 31 36 28   0.  fts5PutU16(
1cdb0 26 70 50 67 69 64 78 2d 3e 70 5b 70 50 67 69 64  &pPgidx->p[pPgid
1cdc0 78 2d 3e 6e 5d 2c 20 70 50 61 67 65 2d 3e 62 75  x->n], pPage->bu
1cdd0 66 2e 6e 29 3b 0a 20 20 70 50 67 69 64 78 2d 3e  f.n);.  pPgidx->
1cde0 6e 20 2b 3d 20 32 3b 0a 23 65 6e 64 69 66 0a 0a  n += 2;.#endif..
1cdf0 20 20 69 66 28 20 70 57 72 69 74 65 72 2d 3e 62    if( pWriter->b
1ce00 46 69 72 73 74 54 65 72 6d 49 6e 50 61 67 65 20  FirstTermInPage 
1ce10 29 7b 0a 20 20 20 20 6e 50 72 65 66 69 78 20 3d  ){.    nPrefix =
1ce20 20 30 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67   0;.    if( pPag
1ce30 65 2d 3e 70 67 6e 6f 21 3d 31 20 29 7b 0a 20 20  e->pgno!=1 ){.  
1ce40 20 20 20 20 2f 2a 20 54 68 69 73 20 69 73 20 74      /* This is t
1ce50 68 65 20 66 69 72 73 74 20 74 65 72 6d 20 6f 6e  he first term on
1ce60 20 61 20 6c 65 61 66 20 74 68 61 74 20 69 73 20   a leaf that is 
1ce70 6e 6f 74 20 74 68 65 20 6c 65 66 74 6d 6f 73 74  not the leftmost
1ce80 20 6c 65 61 66 20 69 6e 0a 20 20 20 20 20 20 2a   leaf in.      *
1ce90 2a 20 74 68 65 20 73 65 67 6d 65 6e 74 20 62 2d  * the segment b-
1cea0 74 72 65 65 2e 20 49 6e 20 74 68 69 73 20 63 61  tree. In this ca
1ceb0 73 65 20 69 74 20 69 73 20 6e 65 63 65 73 73 61  se it is necessa
1cec0 72 79 20 74 6f 20 61 64 64 20 61 20 74 65 72 6d  ry to add a term
1ced0 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 74 68 65   to.      ** the
1cee0 20 62 2d 74 72 65 65 20 68 69 65 72 61 72 63 68   b-tree hierarch
1cef0 79 20 74 68 61 74 20 69 73 20 28 61 29 20 6c 61  y that is (a) la
1cf00 72 67 65 72 20 74 68 61 6e 20 74 68 65 20 6c 61  rger than the la
1cf10 72 67 65 73 74 20 74 65 72 6d 20 0a 20 20 20 20  rgest term .    
1cf20 20 20 2a 2a 20 61 6c 72 65 61 64 79 20 77 72 69    ** already wri
1cf30 74 74 65 6e 20 74 6f 20 74 68 65 20 73 65 67 6d  tten to the segm
1cf40 65 6e 74 20 61 6e 64 20 28 62 29 20 73 6d 61 6c  ent and (b) smal
1cf50 6c 65 72 20 74 68 61 6e 20 6f 72 20 65 71 75 61  ler than or equa
1cf60 6c 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 74 68  l to.      ** th
1cf70 69 73 20 74 65 72 6d 2e 20 49 6e 20 6f 74 68 65  is term. In othe
1cf80 72 20 77 6f 72 64 73 2c 20 61 20 70 72 65 66 69  r words, a prefi
1cf90 78 20 6f 66 20 28 70 54 65 72 6d 2f 6e 54 65 72  x of (pTerm/nTer
1cfa0 6d 29 20 74 68 61 74 20 69 73 20 6f 6e 65 0a 20  m) that is one. 
1cfb0 20 20 20 20 20 2a 2a 20 62 79 74 65 20 6c 6f 6e       ** byte lon
1cfc0 67 65 72 20 74 68 61 6e 20 74 68 65 20 6c 6f 6e  ger than the lon
1cfd0 67 65 73 74 20 70 72 65 66 69 78 20 28 70 54 65  gest prefix (pTe
1cfe0 72 6d 2f 6e 54 65 72 6d 29 20 73 68 61 72 65 73  rm/nTerm) shares
1cff0 20 77 69 74 68 20 74 68 65 0a 20 20 20 20 20 20   with the.      
1d000 2a 2a 20 70 72 65 76 69 6f 75 73 20 74 65 72 6d  ** previous term
1d010 2e 20 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  . .      **.    
1d020 20 20 2a 2a 20 55 73 75 61 6c 6c 79 2c 20 74 68    ** Usually, th
1d030 65 20 70 72 65 76 69 6f 75 73 20 74 65 72 6d 20  e previous term 
1d040 69 73 20 61 76 61 69 6c 61 62 6c 65 20 69 6e 20  is available in 
1d050 70 50 61 67 65 2d 3e 74 65 72 6d 2e 20 54 68 65  pPage->term. The
1d060 20 65 78 63 65 70 74 69 6f 6e 0a 20 20 20 20 20   exception.     
1d070 20 2a 2a 20 69 73 20 69 66 20 74 68 69 73 20 69   ** is if this i
1d080 73 20 74 68 65 20 66 69 72 73 74 20 74 65 72 6d  s the first term
1d090 20 77 72 69 74 74 65 6e 20 69 6e 20 61 6e 20 69   written in an i
1d0a0 6e 63 72 65 6d 65 6e 74 61 6c 2d 6d 65 72 67 65  ncremental-merge
1d0b0 20 73 74 65 70 2e 0a 20 20 20 20 20 20 2a 2a 20   step..      ** 
1d0c0 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 65  In this case the
1d0d0 20 70 72 65 76 69 6f 75 73 20 74 65 72 6d 20 69   previous term i
1d0e0 73 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 2c  s not available,
1d0f0 20 73 6f 20 6a 75 73 74 20 77 72 69 74 65 20 61   so just write a
1d100 0a 20 20 20 20 20 20 2a 2a 20 63 6f 70 79 20 6f  .      ** copy o
1d110 66 20 28 70 54 65 72 6d 2f 6e 54 65 72 6d 29 20  f (pTerm/nTerm) 
1d120 69 6e 74 6f 20 74 68 65 20 70 61 72 65 6e 74 20  into the parent 
1d130 6e 6f 64 65 2e 20 54 68 69 73 20 69 73 20 73 6c  node. This is sl
1d140 69 67 68 74 6c 79 0a 20 20 20 20 20 20 2a 2a 20  ightly.      ** 
1d150 69 6e 65 66 66 69 63 69 65 6e 74 2c 20 62 75 74  inefficient, but
1d160 20 73 74 69 6c 6c 20 63 6f 72 72 65 63 74 2e 20   still correct. 
1d170 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e 20   */.      int n 
1d180 3d 20 6e 54 65 72 6d 3b 0a 20 20 20 20 20 20 69  = nTerm;.      i
1d190 66 28 20 70 50 61 67 65 2d 3e 74 65 72 6d 2e 6e  f( pPage->term.n
1d1a0 20 29 7b 0a 20 20 20 20 20 20 20 20 6e 20 3d 20   ){.        n = 
1d1b0 31 20 2b 20 66 74 73 35 50 72 65 66 69 78 43 6f  1 + fts5PrefixCo
1d1c0 6d 70 72 65 73 73 28 70 50 61 67 65 2d 3e 74 65  mpress(pPage->te
1d1d0 72 6d 2e 6e 2c 20 70 50 61 67 65 2d 3e 74 65 72  rm.n, pPage->ter
1d1e0 6d 2e 70 2c 20 70 54 65 72 6d 29 3b 0a 20 20 20  m.p, pTerm);.   
1d1f0 20 20 20 7d 0a 20 20 20 20 20 20 66 74 73 35 57     }.      fts5W
1d200 72 69 74 65 42 74 72 65 65 54 65 72 6d 28 70 2c  riteBtreeTerm(p,
1d210 20 70 57 72 69 74 65 72 2c 20 6e 2c 20 70 54 65   pWriter, n, pTe
1d220 72 6d 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65  rm);.      pPage
1d230 20 3d 20 26 70 57 72 69 74 65 72 2d 3e 77 72 69   = &pWriter->wri
1d240 74 65 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  ter;.    }.  }el
1d250 73 65 7b 0a 20 20 20 20 6e 50 72 65 66 69 78 20  se{.    nPrefix 
1d260 3d 20 66 74 73 35 50 72 65 66 69 78 43 6f 6d 70  = fts5PrefixComp
1d270 72 65 73 73 28 70 50 61 67 65 2d 3e 74 65 72 6d  ress(pPage->term
1d280 2e 6e 2c 20 70 50 61 67 65 2d 3e 74 65 72 6d 2e  .n, pPage->term.
1d290 70 2c 20 70 54 65 72 6d 29 3b 0a 20 20 20 20 66  p, pTerm);.    f
1d2a0 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 56  ts5BufferAppendV
1d2b0 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26 70  arint(&p->rc, &p
1d2c0 50 61 67 65 2d 3e 62 75 66 2c 20 6e 50 72 65 66  Page->buf, nPref
1d2d0 69 78 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41  ix);.  }..  /* A
1d2e0 70 70 65 6e 64 20 74 68 65 20 6e 75 6d 62 65 72  ppend the number
1d2f0 20 6f 66 20 62 79 74 65 73 20 6f 66 20 6e 65 77   of bytes of new
1d300 20 64 61 74 61 2c 20 74 68 65 6e 20 74 68 65 20   data, then the 
1d310 74 65 72 6d 20 64 61 74 61 20 69 74 73 65 6c 66  term data itself
1d320 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20 70 61 67  .  ** to the pag
1d330 65 2e 20 2a 2f 0a 20 20 66 74 73 35 42 75 66 66  e. */.  fts5Buff
1d340 65 72 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26  erAppendVarint(&
1d350 70 2d 3e 72 63 2c 20 26 70 50 61 67 65 2d 3e 62  p->rc, &pPage->b
1d360 75 66 2c 20 6e 54 65 72 6d 20 2d 20 6e 50 72 65  uf, nTerm - nPre
1d370 66 69 78 29 3b 0a 20 20 66 74 73 35 42 75 66 66  fix);.  fts5Buff
1d380 65 72 41 70 70 65 6e 64 42 6c 6f 62 28 26 70 2d  erAppendBlob(&p-
1d390 3e 72 63 2c 20 26 70 50 61 67 65 2d 3e 62 75 66  >rc, &pPage->buf
1d3a0 2c 20 6e 54 65 72 6d 20 2d 20 6e 50 72 65 66 69  , nTerm - nPrefi
1d3b0 78 2c 20 26 70 54 65 72 6d 5b 6e 50 72 65 66 69  x, &pTerm[nPrefi
1d3c0 78 5d 29 3b 0a 0a 20 20 2f 2a 20 55 70 64 61 74  x]);..  /* Updat
1d3d0 65 20 74 68 65 20 46 74 73 35 50 61 67 65 57 72  e the Fts5PageWr
1d3e0 69 74 65 72 2e 74 65 72 6d 20 66 69 65 6c 64 2e  iter.term field.
1d3f0 20 2a 2f 0a 20 20 66 74 73 35 42 75 66 66 65 72   */.  fts5Buffer
1d400 53 65 74 28 26 70 2d 3e 72 63 2c 20 26 70 50 61  Set(&p->rc, &pPa
1d410 67 65 2d 3e 74 65 72 6d 2c 20 6e 54 65 72 6d 2c  ge->term, nTerm,
1d420 20 70 54 65 72 6d 29 3b 0a 20 20 70 57 72 69 74   pTerm);.  pWrit
1d430 65 72 2d 3e 62 46 69 72 73 74 54 65 72 6d 49 6e  er->bFirstTermIn
1d440 50 61 67 65 20 3d 20 30 3b 0a 0a 20 20 70 57 72  Page = 0;..  pWr
1d450 69 74 65 72 2d 3e 62 46 69 72 73 74 52 6f 77 69  iter->bFirstRowi
1d460 64 49 6e 50 61 67 65 20 3d 20 30 3b 0a 20 20 70  dInPage = 0;.  p
1d470 57 72 69 74 65 72 2d 3e 62 46 69 72 73 74 52 6f  Writer->bFirstRo
1d480 77 69 64 49 6e 44 6f 63 6c 69 73 74 20 3d 20 31  widInDoclist = 1
1d490 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  ;..  assert( p->
1d4a0 72 63 20 7c 7c 20 28 70 57 72 69 74 65 72 2d 3e  rc || (pWriter->
1d4b0 6e 44 6c 69 64 78 3e 30 20 26 26 20 70 57 72 69  nDlidx>0 && pWri
1d4c0 74 65 72 2d 3e 61 44 6c 69 64 78 5b 30 5d 2e 62  ter->aDlidx[0].b
1d4d0 75 66 2e 6e 3d 3d 30 29 20 29 3b 0a 20 20 70 57  uf.n==0) );.  pW
1d4e0 72 69 74 65 72 2d 3e 61 44 6c 69 64 78 5b 30 5d  riter->aDlidx[0]
1d4f0 2e 70 67 6e 6f 20 3d 20 70 50 61 67 65 2d 3e 70  .pgno = pPage->p
1d500 67 6e 6f 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 70  gno;.}../*.** Ap
1d510 70 65 6e 64 20 61 20 72 6f 77 69 64 20 61 6e 64  pend a rowid and
1d520 20 70 6f 73 69 74 69 6f 6e 2d 6c 69 73 74 20 73   position-list s
1d530 69 7a 65 20 66 69 65 6c 64 20 74 6f 20 74 68 65  ize field to the
1d540 20 77 72 69 74 65 72 73 20 6f 75 74 70 75 74 2e   writers output.
1d550 20 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64   .*/.static void
1d560 20 66 74 73 35 57 72 69 74 65 41 70 70 65 6e 64   fts5WriteAppend
1d570 52 6f 77 69 64 28 0a 20 20 46 74 73 35 49 6e 64  Rowid(.  Fts5Ind
1d580 65 78 20 2a 70 2c 20 0a 20 20 46 74 73 35 53 65  ex *p, .  Fts5Se
1d590 67 57 72 69 74 65 72 20 2a 70 57 72 69 74 65 72  gWriter *pWriter
1d5a0 2c 0a 20 20 69 36 34 20 69 52 6f 77 69 64 0a 29  ,.  i64 iRowid.)
1d5b0 7b 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53  {.  if( p->rc==S
1d5c0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1d5d0 46 74 73 35 50 61 67 65 57 72 69 74 65 72 20 2a  Fts5PageWriter *
1d5e0 70 50 61 67 65 20 3d 20 26 70 57 72 69 74 65 72  pPage = &pWriter
1d5f0 2d 3e 77 72 69 74 65 72 3b 0a 0a 20 20 20 20 69  ->writer;..    i
1d600 66 28 20 28 70 50 61 67 65 2d 3e 62 75 66 2e 6e  f( (pPage->buf.n
1d610 20 2b 20 70 50 61 67 65 2d 3e 70 67 69 64 78 2e   + pPage->pgidx.
1d620 6e 29 3e 3d 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e  n)>=p->pConfig->
1d630 70 67 73 7a 20 29 7b 0a 20 20 20 20 20 20 66 74  pgsz ){.      ft
1d640 73 35 57 72 69 74 65 46 6c 75 73 68 4c 65 61 66  s5WriteFlushLeaf
1d650 28 70 2c 20 70 57 72 69 74 65 72 29 3b 0a 20 20  (p, pWriter);.  
1d660 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74    }..    /* If t
1d670 68 69 73 20 69 73 20 74 6f 20 62 65 20 74 68 65  his is to be the
1d680 20 66 69 72 73 74 20 72 6f 77 69 64 20 77 72 69   first rowid wri
1d690 74 74 65 6e 20 74 6f 20 74 68 65 20 70 61 67 65  tten to the page
1d6a0 2c 20 73 65 74 20 74 68 65 20 0a 20 20 20 20 2a  , set the .    *
1d6b0 2a 20 72 6f 77 69 64 2d 70 6f 69 6e 74 65 72 20  * rowid-pointer 
1d6c0 69 6e 20 74 68 65 20 70 61 67 65 2d 68 65 61 64  in the page-head
1d6d0 65 72 2e 20 41 6c 73 6f 20 61 70 70 65 6e 64 20  er. Also append 
1d6e0 61 20 76 61 6c 75 65 20 74 6f 20 74 68 65 20 64  a value to the d
1d6f0 6c 69 64 78 0a 20 20 20 20 2a 2a 20 62 75 66 66  lidx.    ** buff
1d700 65 72 2c 20 69 6e 20 63 61 73 65 20 61 20 64 6f  er, in case a do
1d710 63 6c 69 73 74 2d 69 6e 64 65 78 20 69 73 20 72  clist-index is r
1d720 65 71 75 69 72 65 64 2e 20 20 2a 2f 0a 20 20 20  equired.  */.   
1d730 20 69 66 28 20 70 57 72 69 74 65 72 2d 3e 62 46   if( pWriter->bF
1d740 69 72 73 74 52 6f 77 69 64 49 6e 50 61 67 65 20  irstRowidInPage 
1d750 29 7b 0a 20 20 20 20 20 20 66 74 73 35 50 75 74  ){.      fts5Put
1d760 55 31 36 28 70 50 61 67 65 2d 3e 62 75 66 2e 70  U16(pPage->buf.p
1d770 2c 20 28 75 31 36 29 70 50 61 67 65 2d 3e 62 75  , (u16)pPage->bu
1d780 66 2e 6e 29 3b 0a 20 20 20 20 20 20 66 74 73 35  f.n);.      fts5
1d790 57 72 69 74 65 44 6c 69 64 78 41 70 70 65 6e 64  WriteDlidxAppend
1d7a0 28 70 2c 20 70 57 72 69 74 65 72 2c 20 69 52 6f  (p, pWriter, iRo
1d7b0 77 69 64 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  wid);.    }..   
1d7c0 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 72 6f   /* Write the ro
1d7d0 77 69 64 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20  wid. */.    if( 
1d7e0 70 57 72 69 74 65 72 2d 3e 62 46 69 72 73 74 52  pWriter->bFirstR
1d7f0 6f 77 69 64 49 6e 44 6f 63 6c 69 73 74 20 7c 7c  owidInDoclist ||
1d800 20 70 57 72 69 74 65 72 2d 3e 62 46 69 72 73 74   pWriter->bFirst
1d810 52 6f 77 69 64 49 6e 50 61 67 65 20 29 7b 0a 20  RowidInPage ){. 
1d820 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72 41       fts5BufferA
1d830 70 70 65 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e  ppendVarint(&p->
1d840 72 63 2c 20 26 70 50 61 67 65 2d 3e 62 75 66 2c  rc, &pPage->buf,
1d850 20 69 52 6f 77 69 64 29 3b 0a 20 20 20 20 7d 65   iRowid);.    }e
1d860 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72  lse{.      asser
1d870 74 28 20 70 2d 3e 72 63 20 7c 7c 20 69 52 6f 77  t( p->rc || iRow
1d880 69 64 3e 70 57 72 69 74 65 72 2d 3e 69 50 72 65  id>pWriter->iPre
1d890 76 52 6f 77 69 64 20 29 3b 0a 20 20 20 20 20 20  vRowid );.      
1d8a0 66 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64  fts5BufferAppend
1d8b0 56 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26  Varint(&p->rc, &
1d8c0 70 50 61 67 65 2d 3e 62 75 66 2c 20 69 52 6f 77  pPage->buf, iRow
1d8d0 69 64 20 2d 20 70 57 72 69 74 65 72 2d 3e 69 50  id - pWriter->iP
1d8e0 72 65 76 52 6f 77 69 64 29 3b 0a 20 20 20 20 7d  revRowid);.    }
1d8f0 0a 20 20 20 20 70 57 72 69 74 65 72 2d 3e 69 50  .    pWriter->iP
1d900 72 65 76 52 6f 77 69 64 20 3d 20 69 52 6f 77 69  revRowid = iRowi
1d910 64 3b 0a 20 20 20 20 70 57 72 69 74 65 72 2d 3e  d;.    pWriter->
1d920 62 46 69 72 73 74 52 6f 77 69 64 49 6e 44 6f 63  bFirstRowidInDoc
1d930 6c 69 73 74 20 3d 20 30 3b 0a 20 20 20 20 70 57  list = 0;.    pW
1d940 72 69 74 65 72 2d 3e 62 46 69 72 73 74 52 6f 77  riter->bFirstRow
1d950 69 64 49 6e 50 61 67 65 20 3d 20 30 3b 0a 20 20  idInPage = 0;.  
1d960 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64  }.}..static void
1d970 20 66 74 73 35 57 72 69 74 65 41 70 70 65 6e 64   fts5WriteAppend
1d980 50 6f 73 6c 69 73 74 44 61 74 61 28 0a 20 20 46  PoslistData(.  F
1d990 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 0a 20 20  ts5Index *p, .  
1d9a0 46 74 73 35 53 65 67 57 72 69 74 65 72 20 2a 70  Fts5SegWriter *p
1d9b0 57 72 69 74 65 72 2c 20 0a 20 20 63 6f 6e 73 74  Writer, .  const
1d9c0 20 75 38 20 2a 61 44 61 74 61 2c 20 0a 20 20 69   u8 *aData, .  i
1d9d0 6e 74 20 6e 44 61 74 61 0a 29 7b 0a 20 20 46 74  nt nData.){.  Ft
1d9e0 73 35 50 61 67 65 57 72 69 74 65 72 20 2a 70 50  s5PageWriter *pP
1d9f0 61 67 65 20 3d 20 26 70 57 72 69 74 65 72 2d 3e  age = &pWriter->
1da00 77 72 69 74 65 72 3b 0a 20 20 63 6f 6e 73 74 20  writer;.  const 
1da10 75 38 20 2a 61 20 3d 20 61 44 61 74 61 3b 0a 20  u8 *a = aData;. 
1da20 20 69 6e 74 20 6e 20 3d 20 6e 44 61 74 61 3b 0a   int n = nData;.
1da30 20 20 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e    .  assert( p->
1da40 70 43 6f 6e 66 69 67 2d 3e 70 67 73 7a 3e 30 20  pConfig->pgsz>0 
1da50 29 3b 0a 20 20 77 68 69 6c 65 28 20 70 2d 3e 72  );.  while( p->r
1da60 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 0a 20 20  c==SQLITE_OK .  
1da70 20 20 20 26 26 20 28 70 50 61 67 65 2d 3e 62 75     && (pPage->bu
1da80 66 2e 6e 20 2b 20 70 50 61 67 65 2d 3e 70 67 69  f.n + pPage->pgi
1da90 64 78 2e 6e 20 2b 20 6e 29 3e 3d 70 2d 3e 70 43  dx.n + n)>=p->pC
1daa0 6f 6e 66 69 67 2d 3e 70 67 73 7a 20 0a 20 20 29  onfig->pgsz .  )
1dab0 7b 0a 20 20 20 20 69 6e 74 20 6e 52 65 71 20 3d  {.    int nReq =
1dac0 20 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e 70 67 73   p->pConfig->pgs
1dad0 7a 20 2d 20 70 50 61 67 65 2d 3e 62 75 66 2e 6e  z - pPage->buf.n
1dae0 20 2d 20 70 50 61 67 65 2d 3e 70 67 69 64 78 2e   - pPage->pgidx.
1daf0 6e 3b 0a 20 20 20 20 69 6e 74 20 6e 43 6f 70 79  n;.    int nCopy
1db00 20 3d 20 30 3b 0a 20 20 20 20 77 68 69 6c 65 28   = 0;.    while(
1db10 20 6e 43 6f 70 79 3c 6e 52 65 71 20 29 7b 0a 20   nCopy<nReq ){. 
1db20 20 20 20 20 20 69 36 34 20 64 75 6d 6d 79 3b 0a       i64 dummy;.
1db30 20 20 20 20 20 20 6e 43 6f 70 79 20 2b 3d 20 66        nCopy += f
1db40 74 73 35 47 65 74 56 61 72 69 6e 74 28 26 61 5b  ts5GetVarint(&a[
1db50 6e 43 6f 70 79 5d 2c 20 28 75 36 34 2a 29 26 64  nCopy], (u64*)&d
1db60 75 6d 6d 79 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ummy);.    }.   
1db70 20 66 74 73 35 42 75 66 66 65 72 41 70 70 65 6e   fts5BufferAppen
1db80 64 42 6c 6f 62 28 26 70 2d 3e 72 63 2c 20 26 70  dBlob(&p->rc, &p
1db90 50 61 67 65 2d 3e 62 75 66 2c 20 6e 43 6f 70 79  Page->buf, nCopy
1dba0 2c 20 61 29 3b 0a 20 20 20 20 61 20 2b 3d 20 6e  , a);.    a += n
1dbb0 43 6f 70 79 3b 0a 20 20 20 20 6e 20 2d 3d 20 6e  Copy;.    n -= n
1dbc0 43 6f 70 79 3b 0a 20 20 20 20 66 74 73 35 57 72  Copy;.    fts5Wr
1dbd0 69 74 65 46 6c 75 73 68 4c 65 61 66 28 70 2c 20  iteFlushLeaf(p, 
1dbe0 70 57 72 69 74 65 72 29 3b 0a 20 20 7d 0a 20 20  pWriter);.  }.  
1dbf0 69 66 28 20 6e 3e 30 20 29 7b 0a 20 20 20 20 66  if( n>0 ){.    f
1dc00 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 42  ts5BufferAppendB
1dc10 6c 6f 62 28 26 70 2d 3e 72 63 2c 20 26 70 50 61  lob(&p->rc, &pPa
1dc20 67 65 2d 3e 62 75 66 2c 20 6e 2c 20 61 29 3b 0a  ge->buf, n, a);.
1dc30 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 6c 75    }.}../*.** Flu
1dc40 73 68 20 61 6e 79 20 64 61 74 61 20 63 61 63 68  sh any data cach
1dc50 65 64 20 62 79 20 74 68 65 20 77 72 69 74 65 72  ed by the writer
1dc60 20 6f 62 6a 65 63 74 20 74 6f 20 74 68 65 20 64   object to the d
1dc70 61 74 61 62 61 73 65 2e 20 46 72 65 65 20 61 6e  atabase. Free an
1dc80 79 0a 2a 2a 20 61 6c 6c 6f 63 61 74 69 6f 6e 73  y.** allocations
1dc90 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
1dca0 20 74 68 65 20 77 72 69 74 65 72 2e 0a 2a 2f 0a   the writer..*/.
1dcb0 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
1dcc0 57 72 69 74 65 46 69 6e 69 73 68 28 0a 20 20 46  WriteFinish(.  F
1dcd0 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 0a 20 20  ts5Index *p, .  
1dce0 46 74 73 35 53 65 67 57 72 69 74 65 72 20 2a 70  Fts5SegWriter *p
1dcf0 57 72 69 74 65 72 2c 20 20 20 20 20 20 20 20 20  Writer,         
1dd00 2f 2a 20 57 72 69 74 65 72 20 6f 62 6a 65 63 74  /* Writer object
1dd10 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 4c 65 61   */.  int *pnLea
1dd20 66 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  f               
1dd30 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 4e 75        /* OUT: Nu
1dd40 6d 62 65 72 20 6f 66 20 6c 65 61 66 20 70 61 67  mber of leaf pag
1dd50 65 73 20 69 6e 20 62 2d 74 72 65 65 20 2a 2f 0a  es in b-tree */.
1dd60 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 46 74  ){.  int i;.  Ft
1dd70 73 35 50 61 67 65 57 72 69 74 65 72 20 2a 70 4c  s5PageWriter *pL
1dd80 65 61 66 20 3d 20 26 70 57 72 69 74 65 72 2d 3e  eaf = &pWriter->
1dd90 77 72 69 74 65 72 3b 0a 20 20 69 66 28 20 70 2d  writer;.  if( p-
1dda0 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  >rc==SQLITE_OK )
1ddb0 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4c  {.    assert( pL
1ddc0 65 61 66 2d 3e 70 67 6e 6f 3e 3d 31 20 29 3b 0a  eaf->pgno>=1 );.
1ddd0 20 20 20 20 69 66 28 20 70 4c 65 61 66 2d 3e 62      if( pLeaf->b
1dde0 75 66 2e 6e 3e 34 20 29 7b 0a 20 20 20 20 20 20  uf.n>4 ){.      
1ddf0 66 74 73 35 57 72 69 74 65 46 6c 75 73 68 4c 65  fts5WriteFlushLe
1de00 61 66 28 70 2c 20 70 57 72 69 74 65 72 29 3b 0a  af(p, pWriter);.
1de10 20 20 20 20 7d 0a 20 20 20 20 2a 70 6e 4c 65 61      }.    *pnLea
1de20 66 20 3d 20 70 4c 65 61 66 2d 3e 70 67 6e 6f 2d  f = pLeaf->pgno-
1de30 31 3b 0a 20 20 20 20 66 74 73 35 57 72 69 74 65  1;.    fts5Write
1de40 46 6c 75 73 68 42 74 72 65 65 28 70 2c 20 70 57  FlushBtree(p, pW
1de50 72 69 74 65 72 29 3b 0a 20 20 7d 0a 20 20 66 74  riter);.  }.  ft
1de60 73 35 42 75 66 66 65 72 46 72 65 65 28 26 70 4c  s5BufferFree(&pL
1de70 65 61 66 2d 3e 74 65 72 6d 29 3b 0a 20 20 66 74  eaf->term);.  ft
1de80 73 35 42 75 66 66 65 72 46 72 65 65 28 26 70 4c  s5BufferFree(&pL
1de90 65 61 66 2d 3e 62 75 66 29 3b 0a 20 20 66 74 73  eaf->buf);.  fts
1dea0 35 42 75 66 66 65 72 46 72 65 65 28 26 70 4c 65  5BufferFree(&pLe
1deb0 61 66 2d 3e 70 67 69 64 78 29 3b 0a 20 20 66 74  af->pgidx);.  ft
1dec0 73 35 42 75 66 66 65 72 46 72 65 65 28 26 70 57  s5BufferFree(&pW
1ded0 72 69 74 65 72 2d 3e 62 74 74 65 72 6d 29 3b 0a  riter->btterm);.
1dee0 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 57  .  for(i=0; i<pW
1def0 72 69 74 65 72 2d 3e 6e 44 6c 69 64 78 3b 20 69  riter->nDlidx; i
1df00 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ++){.    sqlite3
1df10 46 74 73 35 42 75 66 66 65 72 46 72 65 65 28 26  Fts5BufferFree(&
1df20 70 57 72 69 74 65 72 2d 3e 61 44 6c 69 64 78 5b  pWriter->aDlidx[
1df30 69 5d 2e 62 75 66 29 3b 0a 20 20 7d 0a 20 20 73  i].buf);.  }.  s
1df40 71 6c 69 74 65 33 5f 66 72 65 65 28 70 57 72 69  qlite3_free(pWri
1df50 74 65 72 2d 3e 61 44 6c 69 64 78 29 3b 0a 7d 0a  ter->aDlidx);.}.
1df60 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
1df70 35 57 72 69 74 65 49 6e 69 74 28 0a 20 20 46 74  5WriteInit(.  Ft
1df80 73 35 49 6e 64 65 78 20 2a 70 2c 20 0a 20 20 46  s5Index *p, .  F
1df90 74 73 35 53 65 67 57 72 69 74 65 72 20 2a 70 57  ts5SegWriter *pW
1dfa0 72 69 74 65 72 2c 20 0a 20 20 69 6e 74 20 69 53  riter, .  int iS
1dfb0 65 67 69 64 0a 29 7b 0a 20 20 63 6f 6e 73 74 20  egid.){.  const 
1dfc0 69 6e 74 20 6e 42 75 66 66 65 72 20 3d 20 70 2d  int nBuffer = p-
1dfd0 3e 70 43 6f 6e 66 69 67 2d 3e 70 67 73 7a 20 2b  >pConfig->pgsz +
1dfe0 20 46 54 53 35 5f 44 41 54 41 5f 50 41 44 44 49   FTS5_DATA_PADDI
1dff0 4e 47 3b 0a 0a 20 20 6d 65 6d 73 65 74 28 70 57  NG;..  memset(pW
1e000 72 69 74 65 72 2c 20 30 2c 20 73 69 7a 65 6f 66  riter, 0, sizeof
1e010 28 46 74 73 35 53 65 67 57 72 69 74 65 72 29 29  (Fts5SegWriter))
1e020 3b 0a 20 20 70 57 72 69 74 65 72 2d 3e 69 53 65  ;.  pWriter->iSe
1e030 67 69 64 20 3d 20 69 53 65 67 69 64 3b 0a 0a 20  gid = iSegid;.. 
1e040 20 66 74 73 35 57 72 69 74 65 44 6c 69 64 78 47   fts5WriteDlidxG
1e050 72 6f 77 28 70 2c 20 70 57 72 69 74 65 72 2c 20  row(p, pWriter, 
1e060 31 29 3b 0a 20 20 70 57 72 69 74 65 72 2d 3e 77  1);.  pWriter->w
1e070 72 69 74 65 72 2e 70 67 6e 6f 20 3d 20 31 3b 0a  riter.pgno = 1;.
1e080 20 20 70 57 72 69 74 65 72 2d 3e 62 46 69 72 73    pWriter->bFirs
1e090 74 54 65 72 6d 49 6e 50 61 67 65 20 3d 20 31 3b  tTermInPage = 1;
1e0a0 0a 20 20 70 57 72 69 74 65 72 2d 3e 69 42 74 50  .  pWriter->iBtP
1e0b0 61 67 65 20 3d 20 31 3b 0a 0a 20 20 61 73 73 65  age = 1;..  asse
1e0c0 72 74 28 20 70 57 72 69 74 65 72 2d 3e 77 72 69  rt( pWriter->wri
1e0d0 74 65 72 2e 62 75 66 2e 6e 3d 3d 30 20 29 3b 0a  ter.buf.n==0 );.
1e0e0 20 20 61 73 73 65 72 74 28 20 70 57 72 69 74 65    assert( pWrite
1e0f0 72 2d 3e 77 72 69 74 65 72 2e 70 67 69 64 78 2e  r->writer.pgidx.
1e100 6e 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 47 72  n==0 );..  /* Gr
1e110 6f 77 20 74 68 65 20 74 77 6f 20 62 75 66 66 65  ow the two buffe
1e120 72 73 20 74 6f 20 70 67 73 7a 20 2b 20 70 61 64  rs to pgsz + pad
1e130 64 69 6e 67 20 62 79 74 65 73 20 69 6e 20 73 69  ding bytes in si
1e140 7a 65 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ze. */.  sqlite3
1e150 46 74 73 35 42 75 66 66 65 72 53 69 7a 65 28 26  Fts5BufferSize(&
1e160 70 2d 3e 72 63 2c 20 26 70 57 72 69 74 65 72 2d  p->rc, &pWriter-
1e170 3e 77 72 69 74 65 72 2e 70 67 69 64 78 2c 20 6e  >writer.pgidx, n
1e180 42 75 66 66 65 72 29 3b 0a 20 20 73 71 6c 69 74  Buffer);.  sqlit
1e190 65 33 46 74 73 35 42 75 66 66 65 72 53 69 7a 65  e3Fts5BufferSize
1e1a0 28 26 70 2d 3e 72 63 2c 20 26 70 57 72 69 74 65  (&p->rc, &pWrite
1e1b0 72 2d 3e 77 72 69 74 65 72 2e 62 75 66 2c 20 6e  r->writer.buf, n
1e1c0 42 75 66 66 65 72 29 3b 0a 0a 20 20 69 66 28 20  Buffer);..  if( 
1e1d0 70 2d 3e 70 49 64 78 57 72 69 74 65 72 3d 3d 30  p->pIdxWriter==0
1e1e0 20 29 7b 0a 20 20 20 20 46 74 73 35 43 6f 6e 66   ){.    Fts5Conf
1e1f0 69 67 20 2a 70 43 6f 6e 66 69 67 20 3d 20 70 2d  ig *pConfig = p-
1e200 3e 70 43 6f 6e 66 69 67 3b 0a 20 20 20 20 66 74  >pConfig;.    ft
1e210 73 35 49 6e 64 65 78 50 72 65 70 61 72 65 53 74  s5IndexPrepareSt
1e220 6d 74 28 70 2c 20 26 70 2d 3e 70 49 64 78 57 72  mt(p, &p->pIdxWr
1e230 69 74 65 72 2c 20 73 71 6c 69 74 65 33 5f 6d 70  iter, sqlite3_mp
1e240 72 69 6e 74 66 28 0a 20 20 20 20 20 20 20 20 20  rintf(.         
1e250 20 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 27 25   "INSERT INTO '%
1e260 71 27 2e 27 25 71 5f 69 64 78 27 28 73 65 67 69  q'.'%q_idx'(segi
1e270 64 2c 74 65 72 6d 2c 70 67 6e 6f 29 20 56 41 4c  d,term,pgno) VAL
1e280 55 45 53 28 3f 2c 3f 2c 3f 29 22 2c 20 0a 20 20  UES(?,?,?)", .  
1e290 20 20 20 20 20 20 20 20 70 43 6f 6e 66 69 67 2d          pConfig-
1e2a0 3e 7a 44 62 2c 20 70 43 6f 6e 66 69 67 2d 3e 7a  >zDb, pConfig->z
1e2b0 4e 61 6d 65 0a 20 20 20 20 29 29 3b 0a 20 20 7d  Name.    ));.  }
1e2c0 0a 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53  ..  if( p->rc==S
1e2d0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1e2e0 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68  /* Initialize th
1e2f0 65 20 34 2d 62 79 74 65 20 6c 65 61 66 2d 70 61  e 4-byte leaf-pa
1e300 67 65 20 68 65 61 64 65 72 20 74 6f 20 30 78 30  ge header to 0x0
1e310 30 2e 20 2a 2f 0a 20 20 20 20 6d 65 6d 73 65 74  0. */.    memset
1e320 28 70 57 72 69 74 65 72 2d 3e 77 72 69 74 65 72  (pWriter->writer
1e330 2e 62 75 66 2e 70 2c 20 30 2c 20 34 29 3b 0a 20  .buf.p, 0, 4);. 
1e340 20 20 20 70 57 72 69 74 65 72 2d 3e 77 72 69 74     pWriter->writ
1e350 65 72 2e 62 75 66 2e 6e 20 3d 20 34 3b 0a 0a 20  er.buf.n = 4;.. 
1e360 20 20 20 2f 2a 20 42 69 6e 64 20 74 68 65 20 63     /* Bind the c
1e370 75 72 72 65 6e 74 20 6f 75 74 70 75 74 20 73 65  urrent output se
1e380 67 6d 65 6e 74 20 69 64 20 74 6f 20 74 68 65 20  gment id to the 
1e390 69 6e 64 65 78 2d 77 72 69 74 65 72 2e 20 54 68  index-writer. Th
1e3a0 69 73 20 69 73 20 61 6e 0a 20 20 20 20 2a 2a 20  is is an.    ** 
1e3b0 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 6f 76 65  optimization ove
1e3c0 72 20 62 69 6e 64 69 6e 67 20 74 68 65 20 73 61  r binding the sa
1e3d0 6d 65 20 76 61 6c 75 65 20 6f 76 65 72 20 61 6e  me value over an
1e3e0 64 20 6f 76 65 72 20 61 73 20 72 6f 77 73 20 61  d over as rows a
1e3f0 72 65 0a 20 20 20 20 2a 2a 20 69 6e 73 65 72 74  re.    ** insert
1e400 65 64 20 69 6e 74 6f 20 25 5f 69 64 78 20 62 79  ed into %_idx by
1e410 20 74 68 65 20 63 75 72 72 65 6e 74 20 77 72 69   the current wri
1e420 74 65 72 2e 20 20 2a 2f 0a 20 20 20 20 73 71 6c  ter.  */.    sql
1e430 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 28 70 2d  ite3_bind_int(p-
1e440 3e 70 49 64 78 57 72 69 74 65 72 2c 20 31 2c 20  >pIdxWriter, 1, 
1e450 70 57 72 69 74 65 72 2d 3e 69 53 65 67 69 64 29  pWriter->iSegid)
1e460 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  ;.  }.}../*.** I
1e470 74 65 72 61 74 6f 72 20 70 49 74 65 72 20 77 61  terator pIter wa
1e480 73 20 75 73 65 64 20 74 6f 20 69 74 65 72 61 74  s used to iterat
1e490 65 20 74 68 72 6f 75 67 68 20 74 68 65 20 69 6e  e through the in
1e4a0 70 75 74 20 73 65 67 6d 65 6e 74 73 20 6f 66 20  put segments of 
1e4b0 6f 6e 20 61 6e 0a 2a 2a 20 69 6e 63 72 65 6d 65  on an.** increme
1e4c0 6e 74 61 6c 20 6d 65 72 67 65 20 6f 70 65 72 61  ntal merge opera
1e4d0 74 69 6f 6e 2e 20 54 68 69 73 20 66 75 6e 63 74  tion. This funct
1e4e0 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 69 66  ion is called if
1e4f0 20 74 68 65 20 69 6e 63 72 65 6d 65 6e 74 61 6c   the incremental
1e500 0a 2a 2a 20 6d 65 72 67 65 20 73 74 65 70 20 68  .** merge step h
1e510 61 73 20 66 69 6e 69 73 68 65 64 20 62 75 74 20  as finished but 
1e520 74 68 65 20 69 6e 70 75 74 20 68 61 73 20 6e 6f  the input has no
1e530 74 20 62 65 65 6e 20 63 6f 6d 70 6c 65 74 65 6c  t been completel
1e540 79 20 65 78 68 61 75 73 74 65 64 2e 0a 2a 2f 0a  y exhausted..*/.
1e550 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
1e560 54 72 69 6d 53 65 67 6d 65 6e 74 73 28 46 74 73  TrimSegments(Fts
1e570 35 49 6e 64 65 78 20 2a 70 2c 20 46 74 73 35 49  5Index *p, Fts5I
1e580 74 65 72 20 2a 70 49 74 65 72 29 7b 0a 20 20 69  ter *pIter){.  i
1e590 6e 74 20 69 3b 0a 20 20 46 74 73 35 42 75 66 66  nt i;.  Fts5Buff
1e5a0 65 72 20 62 75 66 3b 0a 20 20 6d 65 6d 73 65 74  er buf;.  memset
1e5b0 28 26 62 75 66 2c 20 30 2c 20 73 69 7a 65 6f 66  (&buf, 0, sizeof
1e5c0 28 46 74 73 35 42 75 66 66 65 72 29 29 3b 0a 20  (Fts5Buffer));. 
1e5d0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49 74 65   for(i=0; i<pIte
1e5e0 72 2d 3e 6e 53 65 67 3b 20 69 2b 2b 29 7b 0a 20  r->nSeg; i++){. 
1e5f0 20 20 20 46 74 73 35 53 65 67 49 74 65 72 20 2a     Fts5SegIter *
1e600 70 53 65 67 20 3d 20 26 70 49 74 65 72 2d 3e 61  pSeg = &pIter->a
1e610 53 65 67 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20  Seg[i];.    if( 
1e620 70 53 65 67 2d 3e 70 53 65 67 3d 3d 30 20 29 7b  pSeg->pSeg==0 ){
1e630 0a 20 20 20 20 20 20 2f 2a 20 6e 6f 2d 6f 70 20  .      /* no-op 
1e640 2a 2f 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  */.    }else if(
1e650 20 70 53 65 67 2d 3e 70 4c 65 61 66 3d 3d 30 20   pSeg->pLeaf==0 
1e660 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41 6c 6c 20  ){.      /* All 
1e670 6b 65 79 73 20 66 72 6f 6d 20 74 68 69 73 20 69  keys from this i
1e680 6e 70 75 74 20 73 65 67 6d 65 6e 74 20 68 61 76  nput segment hav
1e690 65 20 62 65 65 6e 20 74 72 61 6e 73 66 65 72 65  e been transfere
1e6a0 64 20 74 6f 20 74 68 65 20 6f 75 74 70 75 74 2e  d to the output.
1e6b0 0a 20 20 20 20 20 20 2a 2a 20 53 65 74 20 62 6f  .      ** Set bo
1e6c0 74 68 20 74 68 65 20 66 69 72 73 74 20 61 6e 64  th the first and
1e6d0 20 6c 61 73 74 20 70 61 67 65 2d 6e 75 6d 62 65   last page-numbe
1e6e0 72 73 20 74 6f 20 30 20 74 6f 20 69 6e 64 69 63  rs to 0 to indic
1e6f0 61 74 65 20 74 68 61 74 20 74 68 65 0a 20 20 20  ate that the.   
1e700 20 20 20 2a 2a 20 73 65 67 6d 65 6e 74 20 69 73     ** segment is
1e710 20 6e 6f 77 20 65 6d 70 74 79 2e 20 2a 2f 0a 20   now empty. */. 
1e720 20 20 20 20 20 70 53 65 67 2d 3e 70 53 65 67 2d       pSeg->pSeg-
1e730 3e 70 67 6e 6f 4c 61 73 74 20 3d 20 30 3b 0a 20  >pgnoLast = 0;. 
1e740 20 20 20 20 20 70 53 65 67 2d 3e 70 53 65 67 2d       pSeg->pSeg-
1e750 3e 70 67 6e 6f 46 69 72 73 74 20 3d 20 30 3b 0a  >pgnoFirst = 0;.
1e760 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1e770 20 69 6e 74 20 69 4f 66 66 20 3d 20 70 53 65 67   int iOff = pSeg
1e780 2d 3e 69 54 65 72 6d 4c 65 61 66 4f 66 66 73 65  ->iTermLeafOffse
1e790 74 3b 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74  t;     /* Offset
1e7a0 20 6f 6e 20 6e 65 77 20 66 69 72 73 74 20 6c 65   on new first le
1e7b0 61 66 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 20  af page */.     
1e7c0 20 69 36 34 20 69 4c 65 61 66 52 6f 77 69 64 3b   i64 iLeafRowid;
1e7d0 0a 20 20 20 20 20 20 46 74 73 35 44 61 74 61 20  .      Fts5Data 
1e7e0 2a 70 44 61 74 61 3b 0a 20 20 20 20 20 20 69 6e  *pData;.      in
1e7f0 74 20 69 49 64 20 3d 20 70 53 65 67 2d 3e 70 53  t iId = pSeg->pS
1e800 65 67 2d 3e 69 53 65 67 69 64 3b 0a 20 20 20 20  eg->iSegid;.    
1e810 20 20 75 38 20 61 48 64 72 5b 34 5d 20 3d 20 7b    u8 aHdr[4] = {
1e820 30 78 30 30 2c 20 30 78 30 30 2c 20 30 78 30 30  0x00, 0x00, 0x00
1e830 2c 20 30 78 30 30 7d 3b 0a 0a 20 20 20 20 20 20  , 0x00};..      
1e840 69 4c 65 61 66 52 6f 77 69 64 20 3d 20 46 54 53  iLeafRowid = FTS
1e850 35 5f 53 45 47 4d 45 4e 54 5f 52 4f 57 49 44 28  5_SEGMENT_ROWID(
1e860 69 49 64 2c 20 70 53 65 67 2d 3e 69 54 65 72 6d  iId, pSeg->iTerm
1e870 4c 65 61 66 50 67 6e 6f 29 3b 0a 20 20 20 20 20  LeafPgno);.     
1e880 20 70 44 61 74 61 20 3d 20 66 74 73 35 44 61 74   pData = fts5Dat
1e890 61 52 65 61 64 28 70 2c 20 69 4c 65 61 66 52 6f  aRead(p, iLeafRo
1e8a0 77 69 64 29 3b 0a 20 20 20 20 20 20 69 66 28 20  wid);.      if( 
1e8b0 70 44 61 74 61 20 29 7b 0a 20 20 20 20 20 20 20  pData ){.       
1e8c0 20 66 74 73 35 42 75 66 66 65 72 5a 65 72 6f 28   fts5BufferZero(
1e8d0 26 62 75 66 29 3b 0a 20 20 20 20 20 20 20 20 66  &buf);.        f
1e8e0 74 73 35 42 75 66 66 65 72 47 72 6f 77 28 26 70  ts5BufferGrow(&p
1e8f0 2d 3e 72 63 2c 20 26 62 75 66 2c 20 70 44 61 74  ->rc, &buf, pDat
1e900 61 2d 3e 6e 6e 29 3b 0a 20 20 20 20 20 20 20 20  a->nn);.        
1e910 66 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64  fts5BufferAppend
1e920 42 6c 6f 62 28 26 70 2d 3e 72 63 2c 20 26 62 75  Blob(&p->rc, &bu
1e930 66 2c 20 73 69 7a 65 6f 66 28 61 48 64 72 29 2c  f, sizeof(aHdr),
1e940 20 61 48 64 72 29 3b 0a 20 20 20 20 20 20 20 20   aHdr);.        
1e950 66 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64  fts5BufferAppend
1e960 56 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26  Varint(&p->rc, &
1e970 62 75 66 2c 20 70 53 65 67 2d 3e 74 65 72 6d 2e  buf, pSeg->term.
1e980 6e 29 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35  n);.        fts5
1e990 42 75 66 66 65 72 41 70 70 65 6e 64 42 6c 6f 62  BufferAppendBlob
1e9a0 28 26 70 2d 3e 72 63 2c 20 26 62 75 66 2c 20 70  (&p->rc, &buf, p
1e9b0 53 65 67 2d 3e 74 65 72 6d 2e 6e 2c 20 70 53 65  Seg->term.n, pSe
1e9c0 67 2d 3e 74 65 72 6d 2e 70 29 3b 0a 20 20 20 20  g->term.p);.    
1e9d0 20 20 20 20 66 74 73 35 42 75 66 66 65 72 41 70      fts5BufferAp
1e9e0 70 65 6e 64 42 6c 6f 62 28 26 70 2d 3e 72 63 2c  pendBlob(&p->rc,
1e9f0 20 26 62 75 66 2c 20 70 44 61 74 61 2d 3e 73 7a   &buf, pData->sz
1ea00 4c 65 61 66 2d 69 4f 66 66 2c 20 26 70 44 61 74  Leaf-iOff, &pDat
1ea10 61 2d 3e 70 5b 69 4f 66 66 5d 29 3b 0a 20 20 20  a->p[iOff]);.   
1ea20 20 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d       if( p->rc==
1ea30 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1ea40 20 20 20 20 20 20 20 2f 2a 20 53 65 74 20 74 68         /* Set th
1ea50 65 20 73 7a 4c 65 61 66 20 66 69 65 6c 64 20 2a  e szLeaf field *
1ea60 2f 0a 20 20 20 20 20 20 20 20 20 20 66 74 73 35  /.          fts5
1ea70 50 75 74 55 31 36 28 26 62 75 66 2e 70 5b 32 5d  PutU16(&buf.p[2]
1ea80 2c 20 28 75 31 36 29 62 75 66 2e 6e 29 3b 0a 20  , (u16)buf.n);. 
1ea90 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20         }..      
1eaa0 20 20 2f 2a 20 53 65 74 20 75 70 20 74 68 65 20    /* Set up the 
1eab0 6e 65 77 20 70 61 67 65 2d 69 6e 64 65 78 20 61  new page-index a
1eac0 72 72 61 79 20 2a 2f 0a 20 20 20 20 20 20 20 20  rray */.        
1ead0 66 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64  fts5BufferAppend
1eae0 56 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26  Varint(&p->rc, &
1eaf0 62 75 66 2c 20 34 29 3b 0a 20 20 20 20 20 20 20  buf, 4);.       
1eb00 20 69 66 28 20 70 53 65 67 2d 3e 69 4c 65 61 66   if( pSeg->iLeaf
1eb10 50 67 6e 6f 3d 3d 70 53 65 67 2d 3e 69 54 65 72  Pgno==pSeg->iTer
1eb20 6d 4c 65 61 66 50 67 6e 6f 20 0a 20 20 20 20 20  mLeafPgno .     
1eb30 20 20 20 20 26 26 20 70 53 65 67 2d 3e 69 45 6e      && pSeg->iEn
1eb40 64 6f 66 44 6f 63 6c 69 73 74 3c 70 44 61 74 61  dofDoclist<pData
1eb50 2d 3e 73 7a 4c 65 61 66 20 0a 20 20 20 20 20 20  ->szLeaf .      
1eb60 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69    ){.          i
1eb70 6e 74 20 6e 44 69 66 66 20 3d 20 70 44 61 74 61  nt nDiff = pData
1eb80 2d 3e 73 7a 4c 65 61 66 20 2d 20 70 53 65 67 2d  ->szLeaf - pSeg-
1eb90 3e 69 45 6e 64 6f 66 44 6f 63 6c 69 73 74 3b 0a  >iEndofDoclist;.
1eba0 20 20 20 20 20 20 20 20 20 20 66 74 73 35 42 75            fts5Bu
1ebb0 66 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e 74  fferAppendVarint
1ebc0 28 26 70 2d 3e 72 63 2c 20 26 62 75 66 2c 20 62  (&p->rc, &buf, b
1ebd0 75 66 2e 6e 20 2d 20 31 20 2d 20 6e 44 69 66 66  uf.n - 1 - nDiff
1ebe0 20 2d 20 34 29 3b 0a 20 20 20 20 20 20 20 20 20   - 4);.         
1ebf0 20 66 74 73 35 42 75 66 66 65 72 41 70 70 65 6e   fts5BufferAppen
1ec00 64 42 6c 6f 62 28 26 70 2d 3e 72 63 2c 20 26 62  dBlob(&p->rc, &b
1ec10 75 66 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  uf, .           
1ec20 20 20 20 70 44 61 74 61 2d 3e 6e 6e 20 2d 20 70     pData->nn - p
1ec30 53 65 67 2d 3e 69 50 67 69 64 78 4f 66 66 2c 20  Seg->iPgidxOff, 
1ec40 26 70 44 61 74 61 2d 3e 70 5b 70 53 65 67 2d 3e  &pData->p[pSeg->
1ec50 69 50 67 69 64 78 4f 66 66 5d 0a 20 20 20 20 20  iPgidxOff].     
1ec60 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20       );.        
1ec70 7d 0a 0a 20 20 20 20 20 20 20 20 66 74 73 35 44  }..        fts5D
1ec80 61 74 61 52 65 6c 65 61 73 65 28 70 44 61 74 61  ataRelease(pData
1ec90 29 3b 0a 20 20 20 20 20 20 20 20 70 53 65 67 2d  );.        pSeg-
1eca0 3e 70 53 65 67 2d 3e 70 67 6e 6f 46 69 72 73 74  >pSeg->pgnoFirst
1ecb0 20 3d 20 70 53 65 67 2d 3e 69 54 65 72 6d 4c 65   = pSeg->iTermLe
1ecc0 61 66 50 67 6e 6f 3b 0a 20 20 20 20 20 20 20 20  afPgno;.        
1ecd0 66 74 73 35 44 61 74 61 44 65 6c 65 74 65 28 70  fts5DataDelete(p
1ece0 2c 20 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f 52  , FTS5_SEGMENT_R
1ecf0 4f 57 49 44 28 69 49 64 2c 20 31 29 2c 20 69 4c  OWID(iId, 1), iL
1ed00 65 61 66 52 6f 77 69 64 29 3b 0a 20 20 20 20 20  eafRowid);.     
1ed10 20 20 20 66 74 73 35 44 61 74 61 57 72 69 74 65     fts5DataWrite
1ed20 28 70 2c 20 69 4c 65 61 66 52 6f 77 69 64 2c 20  (p, iLeafRowid, 
1ed30 62 75 66 2e 70 2c 20 62 75 66 2e 6e 29 3b 0a 20  buf.p, buf.n);. 
1ed40 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
1ed50 0a 20 20 66 74 73 35 42 75 66 66 65 72 46 72 65  .  fts5BufferFre
1ed60 65 28 26 62 75 66 29 3b 0a 7d 0a 0a 73 74 61 74  e(&buf);.}..stat
1ed70 69 63 20 76 6f 69 64 20 66 74 73 35 4d 65 72 67  ic void fts5Merg
1ed80 65 43 68 75 6e 6b 43 61 6c 6c 62 61 63 6b 28 0a  eChunkCallback(.
1ed90 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20    Fts5Index *p, 
1eda0 0a 20 20 76 6f 69 64 20 2a 70 43 74 78 2c 20 0a  .  void *pCtx, .
1edb0 20 20 63 6f 6e 73 74 20 75 38 20 2a 70 43 68 75    const u8 *pChu
1edc0 6e 6b 2c 20 69 6e 74 20 6e 43 68 75 6e 6b 0a 29  nk, int nChunk.)
1edd0 7b 0a 20 20 46 74 73 35 53 65 67 57 72 69 74 65  {.  Fts5SegWrite
1ede0 72 20 2a 70 57 72 69 74 65 72 20 3d 20 28 46 74  r *pWriter = (Ft
1edf0 73 35 53 65 67 57 72 69 74 65 72 2a 29 70 43 74  s5SegWriter*)pCt
1ee00 78 3b 0a 20 20 66 74 73 35 57 72 69 74 65 41 70  x;.  fts5WriteAp
1ee10 70 65 6e 64 50 6f 73 6c 69 73 74 44 61 74 61 28  pendPoslistData(
1ee20 70 2c 20 70 57 72 69 74 65 72 2c 20 70 43 68 75  p, pWriter, pChu
1ee30 6e 6b 2c 20 6e 43 68 75 6e 6b 29 3b 0a 7d 0a 0a  nk, nChunk);.}..
1ee40 2f 2a 0a 2a 2a 0a 2a 2f 0a 73 74 61 74 69 63 20  /*.**.*/.static 
1ee50 76 6f 69 64 20 66 74 73 35 49 6e 64 65 78 4d 65  void fts5IndexMe
1ee60 72 67 65 4c 65 76 65 6c 28 0a 20 20 46 74 73 35  rgeLevel(.  Fts5
1ee70 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20  Index *p,       
1ee80 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
1ee90 54 53 35 20 62 61 63 6b 65 6e 64 20 6f 62 6a 65  TS5 backend obje
1eea0 63 74 20 2a 2f 0a 20 20 46 74 73 35 53 74 72 75  ct */.  Fts5Stru
1eeb0 63 74 75 72 65 20 2a 2a 70 70 53 74 72 75 63 74  cture **ppStruct
1eec0 2c 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f 55  ,       /* IN/OU
1eed0 54 3a 20 53 74 75 63 74 75 72 65 20 6f 66 20 69  T: Stucture of i
1eee0 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20 69 4c  ndex */.  int iL
1eef0 76 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  vl,             
1ef00 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 76            /* Lev
1ef10 65 6c 20 74 6f 20 72 65 61 64 20 69 6e 70 75 74  el to read input
1ef20 20 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20 2a   from */.  int *
1ef30 70 6e 52 65 6d 20 20 20 20 20 20 20 20 20 20 20  pnRem           
1ef40 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72             /* Wr
1ef50 69 74 65 20 75 70 20 74 6f 20 74 68 69 73 20 6d  ite up to this m
1ef60 61 6e 79 20 6f 75 74 70 75 74 20 6c 65 61 76 65  any output leave
1ef70 73 20 2a 2f 0a 29 7b 0a 20 20 46 74 73 35 53 74  s */.){.  Fts5St
1ef80 72 75 63 74 75 72 65 20 2a 70 53 74 72 75 63 74  ructure *pStruct
1ef90 20 3d 20 2a 70 70 53 74 72 75 63 74 3b 0a 20 20   = *ppStruct;.  
1efa0 46 74 73 35 53 74 72 75 63 74 75 72 65 4c 65 76  Fts5StructureLev
1efb0 65 6c 20 2a 70 4c 76 6c 20 3d 20 26 70 53 74 72  el *pLvl = &pStr
1efc0 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c  uct->aLevel[iLvl
1efd0 5d 3b 0a 20 20 46 74 73 35 53 74 72 75 63 74 75  ];.  Fts5Structu
1efe0 72 65 4c 65 76 65 6c 20 2a 70 4c 76 6c 4f 75 74  reLevel *pLvlOut
1eff0 3b 0a 20 20 46 74 73 35 49 74 65 72 20 2a 70 49  ;.  Fts5Iter *pI
1f000 74 65 72 20 3d 20 30 3b 20 20 20 20 20 20 20 2f  ter = 0;       /
1f010 2a 20 49 74 65 72 61 74 6f 72 20 74 6f 20 72 65  * Iterator to re
1f020 61 64 20 69 6e 70 75 74 20 64 61 74 61 20 2a 2f  ad input data */
1f030 0a 20 20 69 6e 74 20 6e 52 65 6d 20 3d 20 70 6e  .  int nRem = pn
1f040 52 65 6d 20 3f 20 2a 70 6e 52 65 6d 20 3a 20 30  Rem ? *pnRem : 0
1f050 3b 20 20 2f 2a 20 4f 75 74 70 75 74 20 6c 65 61  ;  /* Output lea
1f060 66 20 70 61 67 65 73 20 6c 65 66 74 20 74 6f 20  f pages left to 
1f070 77 72 69 74 65 20 2a 2f 0a 20 20 69 6e 74 20 6e  write */.  int n
1f080 49 6e 70 75 74 3b 20 20 20 20 20 20 20 20 20 20  Input;          
1f090 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
1f0a0 6d 62 65 72 20 6f 66 20 69 6e 70 75 74 20 73 65  mber of input se
1f0b0 67 6d 65 6e 74 73 20 2a 2f 0a 20 20 46 74 73 35  gments */.  Fts5
1f0c0 53 65 67 57 72 69 74 65 72 20 77 72 69 74 65 72  SegWriter writer
1f0d0 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57  ;           /* W
1f0e0 72 69 74 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a  riter object */.
1f0f0 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65 53    Fts5StructureS
1f100 65 67 6d 65 6e 74 20 2a 70 53 65 67 3b 20 20 20  egment *pSeg;   
1f110 20 20 2f 2a 20 4f 75 74 70 75 74 20 73 65 67 6d    /* Output segm
1f120 65 6e 74 20 2a 2f 0a 20 20 46 74 73 35 42 75 66  ent */.  Fts5Buf
1f130 66 65 72 20 74 65 72 6d 3b 0a 20 20 69 6e 74 20  fer term;.  int 
1f140 62 4f 6c 64 65 73 74 3b 20 20 20 20 20 20 20 20  bOldest;        
1f150 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
1f160 72 75 65 20 69 66 20 74 68 65 20 6f 75 74 70 75  rue if the outpu
1f170 74 20 73 65 67 6d 65 6e 74 20 69 73 20 74 68 65  t segment is the
1f180 20 6f 6c 64 65 73 74 20 2a 2f 0a 20 20 69 6e 74   oldest */.  int
1f190 20 65 44 65 74 61 69 6c 20 3d 20 70 2d 3e 70 43   eDetail = p->pC
1f1a0 6f 6e 66 69 67 2d 3e 65 44 65 74 61 69 6c 3b 0a  onfig->eDetail;.
1f1b0 20 20 63 6f 6e 73 74 20 69 6e 74 20 66 6c 61 67    const int flag
1f1c0 73 20 3d 20 46 54 53 35 49 4e 44 45 58 5f 51 55  s = FTS5INDEX_QU
1f1d0 45 52 59 5f 4e 4f 4f 55 54 50 55 54 3b 0a 0a 20  ERY_NOOUTPUT;.. 
1f1e0 20 61 73 73 65 72 74 28 20 69 4c 76 6c 3c 70 53   assert( iLvl<pS
1f1f0 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 20 29 3b  truct->nLevel );
1f200 0a 20 20 61 73 73 65 72 74 28 20 70 4c 76 6c 2d  .  assert( pLvl-
1f210 3e 6e 4d 65 72 67 65 3c 3d 70 4c 76 6c 2d 3e 6e  >nMerge<=pLvl->n
1f220 53 65 67 20 29 3b 0a 0a 20 20 6d 65 6d 73 65 74  Seg );..  memset
1f230 28 26 77 72 69 74 65 72 2c 20 30 2c 20 73 69 7a  (&writer, 0, siz
1f240 65 6f 66 28 46 74 73 35 53 65 67 57 72 69 74 65  eof(Fts5SegWrite
1f250 72 29 29 3b 0a 20 20 6d 65 6d 73 65 74 28 26 74  r));.  memset(&t
1f260 65 72 6d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 46  erm, 0, sizeof(F
1f270 74 73 35 42 75 66 66 65 72 29 29 3b 0a 20 20 69  ts5Buffer));.  i
1f280 66 28 20 70 4c 76 6c 2d 3e 6e 4d 65 72 67 65 20  f( pLvl->nMerge 
1f290 29 7b 0a 20 20 20 20 70 4c 76 6c 4f 75 74 20 3d  ){.    pLvlOut =
1f2a0 20 26 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65   &pStruct->aLeve
1f2b0 6c 5b 69 4c 76 6c 2b 31 5d 3b 0a 20 20 20 20 61  l[iLvl+1];.    a
1f2c0 73 73 65 72 74 28 20 70 4c 76 6c 4f 75 74 2d 3e  ssert( pLvlOut->
1f2d0 6e 53 65 67 3e 30 20 29 3b 0a 20 20 20 20 6e 49  nSeg>0 );.    nI
1f2e0 6e 70 75 74 20 3d 20 70 4c 76 6c 2d 3e 6e 4d 65  nput = pLvl->nMe
1f2f0 72 67 65 3b 0a 20 20 20 20 70 53 65 67 20 3d 20  rge;.    pSeg = 
1f300 26 70 4c 76 6c 4f 75 74 2d 3e 61 53 65 67 5b 70  &pLvlOut->aSeg[p
1f310 4c 76 6c 4f 75 74 2d 3e 6e 53 65 67 2d 31 5d 3b  LvlOut->nSeg-1];
1f320 0a 0a 20 20 20 20 66 74 73 35 57 72 69 74 65 49  ..    fts5WriteI
1f330 6e 69 74 28 70 2c 20 26 77 72 69 74 65 72 2c 20  nit(p, &writer, 
1f340 70 53 65 67 2d 3e 69 53 65 67 69 64 29 3b 0a 20  pSeg->iSegid);. 
1f350 20 20 20 77 72 69 74 65 72 2e 77 72 69 74 65 72     writer.writer
1f360 2e 70 67 6e 6f 20 3d 20 70 53 65 67 2d 3e 70 67  .pgno = pSeg->pg
1f370 6e 6f 4c 61 73 74 2b 31 3b 0a 20 20 20 20 77 72  noLast+1;.    wr
1f380 69 74 65 72 2e 69 42 74 50 61 67 65 20 3d 20 30  iter.iBtPage = 0
1f390 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  ;.  }else{.    i
1f3a0 6e 74 20 69 53 65 67 69 64 20 3d 20 66 74 73 35  nt iSegid = fts5
1f3b0 41 6c 6c 6f 63 61 74 65 53 65 67 69 64 28 70 2c  AllocateSegid(p,
1f3c0 20 70 53 74 72 75 63 74 29 3b 0a 0a 20 20 20 20   pStruct);..    
1f3d0 2f 2a 20 45 78 74 65 6e 64 20 74 68 65 20 46 74  /* Extend the Ft
1f3e0 73 35 53 74 72 75 63 74 75 72 65 20 6f 62 6a 65  s5Structure obje
1f3f0 63 74 20 61 73 20 72 65 71 75 69 72 65 64 20 74  ct as required t
1f400 6f 20 65 6e 73 75 72 65 20 74 68 65 20 6f 75 74  o ensure the out
1f410 70 75 74 0a 20 20 20 20 2a 2a 20 73 65 67 6d 65  put.    ** segme
1f420 6e 74 20 65 78 69 73 74 73 2e 20 2a 2f 0a 20 20  nt exists. */.  
1f430 20 20 69 66 28 20 69 4c 76 6c 3d 3d 70 53 74 72    if( iLvl==pStr
1f440 75 63 74 2d 3e 6e 4c 65 76 65 6c 2d 31 20 29 7b  uct->nLevel-1 ){
1f450 0a 20 20 20 20 20 20 66 74 73 35 53 74 72 75 63  .      fts5Struc
1f460 74 75 72 65 41 64 64 4c 65 76 65 6c 28 26 70 2d  tureAddLevel(&p-
1f470 3e 72 63 2c 20 70 70 53 74 72 75 63 74 29 3b 0a  >rc, ppStruct);.
1f480 20 20 20 20 20 20 70 53 74 72 75 63 74 20 3d 20        pStruct = 
1f490 2a 70 70 53 74 72 75 63 74 3b 0a 20 20 20 20 7d  *ppStruct;.    }
1f4a0 0a 20 20 20 20 66 74 73 35 53 74 72 75 63 74 75  .    fts5Structu
1f4b0 72 65 45 78 74 65 6e 64 4c 65 76 65 6c 28 26 70  reExtendLevel(&p
1f4c0 2d 3e 72 63 2c 20 70 53 74 72 75 63 74 2c 20 69  ->rc, pStruct, i
1f4d0 4c 76 6c 2b 31 2c 20 31 2c 20 30 29 3b 0a 20 20  Lvl+1, 1, 0);.  
1f4e0 20 20 69 66 28 20 70 2d 3e 72 63 20 29 20 72 65    if( p->rc ) re
1f4f0 74 75 72 6e 3b 0a 20 20 20 20 70 4c 76 6c 20 3d  turn;.    pLvl =
1f500 20 26 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65   &pStruct->aLeve
1f510 6c 5b 69 4c 76 6c 5d 3b 0a 20 20 20 20 70 4c 76  l[iLvl];.    pLv
1f520 6c 4f 75 74 20 3d 20 26 70 53 74 72 75 63 74 2d  lOut = &pStruct-
1f530 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c 2b 31 5d 3b  >aLevel[iLvl+1];
1f540 0a 0a 20 20 20 20 66 74 73 35 57 72 69 74 65 49  ..    fts5WriteI
1f550 6e 69 74 28 70 2c 20 26 77 72 69 74 65 72 2c 20  nit(p, &writer, 
1f560 69 53 65 67 69 64 29 3b 0a 0a 20 20 20 20 2f 2a  iSegid);..    /*
1f570 20 41 64 64 20 74 68 65 20 6e 65 77 20 73 65 67   Add the new seg
1f580 6d 65 6e 74 20 74 6f 20 74 68 65 20 6f 75 74 70  ment to the outp
1f590 75 74 20 6c 65 76 65 6c 20 2a 2f 0a 20 20 20 20  ut level */.    
1f5a0 70 53 65 67 20 3d 20 26 70 4c 76 6c 4f 75 74 2d  pSeg = &pLvlOut-
1f5b0 3e 61 53 65 67 5b 70 4c 76 6c 4f 75 74 2d 3e 6e  >aSeg[pLvlOut->n
1f5c0 53 65 67 5d 3b 0a 20 20 20 20 70 4c 76 6c 4f 75  Seg];.    pLvlOu
1f5d0 74 2d 3e 6e 53 65 67 2b 2b 3b 0a 20 20 20 20 70  t->nSeg++;.    p
1f5e0 53 65 67 2d 3e 70 67 6e 6f 46 69 72 73 74 20 3d  Seg->pgnoFirst =
1f5f0 20 31 3b 0a 20 20 20 20 70 53 65 67 2d 3e 69 53   1;.    pSeg->iS
1f600 65 67 69 64 20 3d 20 69 53 65 67 69 64 3b 0a 20  egid = iSegid;. 
1f610 20 20 20 70 53 74 72 75 63 74 2d 3e 6e 53 65 67     pStruct->nSeg
1f620 6d 65 6e 74 2b 2b 3b 0a 0a 20 20 20 20 2f 2a 20  ment++;..    /* 
1f630 52 65 61 64 20 69 6e 70 75 74 20 66 72 6f 6d 20  Read input from 
1f640 61 6c 6c 20 73 65 67 6d 65 6e 74 73 20 69 6e 20  all segments in 
1f650 74 68 65 20 69 6e 70 75 74 20 6c 65 76 65 6c 20  the input level 
1f660 2a 2f 0a 20 20 20 20 6e 49 6e 70 75 74 20 3d 20  */.    nInput = 
1f670 70 4c 76 6c 2d 3e 6e 53 65 67 3b 0a 20 20 7d 0a  pLvl->nSeg;.  }.
1f680 20 20 62 4f 6c 64 65 73 74 20 3d 20 28 70 4c 76    bOldest = (pLv
1f690 6c 4f 75 74 2d 3e 6e 53 65 67 3d 3d 31 20 26 26  lOut->nSeg==1 &&
1f6a0 20 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c   pStruct->nLevel
1f6b0 3d 3d 69 4c 76 6c 2b 32 29 3b 0a 0a 20 20 61 73  ==iLvl+2);..  as
1f6c0 73 65 72 74 28 20 69 4c 76 6c 3e 3d 30 20 29 3b  sert( iLvl>=0 );
1f6d0 0a 20 20 66 6f 72 28 66 74 73 35 4d 75 6c 74 69  .  for(fts5Multi
1f6e0 49 74 65 72 4e 65 77 28 70 2c 20 70 53 74 72 75  IterNew(p, pStru
1f6f0 63 74 2c 20 66 6c 61 67 73 2c 20 30 2c 20 30 2c  ct, flags, 0, 0,
1f700 20 30 2c 20 69 4c 76 6c 2c 20 6e 49 6e 70 75 74   0, iLvl, nInput
1f710 2c 20 26 70 49 74 65 72 29 3b 0a 20 20 20 20 20  , &pIter);.     
1f720 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 45 6f   fts5MultiIterEo
1f730 66 28 70 2c 20 70 49 74 65 72 29 3d 3d 30 3b 0a  f(p, pIter)==0;.
1f740 20 20 20 20 20 20 66 74 73 35 4d 75 6c 74 69 49        fts5MultiI
1f750 74 65 72 4e 65 78 74 28 70 2c 20 70 49 74 65 72  terNext(p, pIter
1f760 2c 20 30 2c 20 30 29 0a 20 20 29 7b 0a 20 20 20  , 0, 0).  ){.   
1f770 20 46 74 73 35 53 65 67 49 74 65 72 20 2a 70 53   Fts5SegIter *pS
1f780 65 67 49 74 65 72 20 3d 20 26 70 49 74 65 72 2d  egIter = &pIter-
1f790 3e 61 53 65 67 5b 20 70 49 74 65 72 2d 3e 61 46  >aSeg[ pIter->aF
1f7a0 69 72 73 74 5b 31 5d 2e 69 46 69 72 73 74 20 5d  irst[1].iFirst ]
1f7b0 3b 0a 20 20 20 20 69 6e 74 20 6e 50 6f 73 3b 20  ;.    int nPos; 
1f7c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f7d0 20 20 20 20 2f 2a 20 70 6f 73 69 74 69 6f 6e 2d      /* position-
1f7e0 6c 69 73 74 20 73 69 7a 65 20 66 69 65 6c 64 20  list size field 
1f7f0 76 61 6c 75 65 20 2a 2f 0a 20 20 20 20 69 6e 74  value */.    int
1f800 20 6e 54 65 72 6d 3b 0a 20 20 20 20 63 6f 6e 73   nTerm;.    cons
1f810 74 20 75 38 20 2a 70 54 65 72 6d 3b 0a 0a 20 20  t u8 *pTerm;..  
1f820 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20 6b    /* Check for k
1f830 65 79 20 61 6e 6e 69 68 69 6c 61 74 69 6f 6e 2e  ey annihilation.
1f840 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 53 65 67   */.    if( pSeg
1f850 49 74 65 72 2d 3e 6e 50 6f 73 3d 3d 30 20 26 26  Iter->nPos==0 &&
1f860 20 28 62 4f 6c 64 65 73 74 20 7c 7c 20 70 53 65   (bOldest || pSe
1f870 67 49 74 65 72 2d 3e 62 44 65 6c 3d 3d 30 29 20  gIter->bDel==0) 
1f880 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 0a 20 20 20  ) continue;..   
1f890 20 70 54 65 72 6d 20 3d 20 66 74 73 35 4d 75 6c   pTerm = fts5Mul
1f8a0 74 69 49 74 65 72 54 65 72 6d 28 70 49 74 65 72  tiIterTerm(pIter
1f8b0 2c 20 26 6e 54 65 72 6d 29 3b 0a 20 20 20 20 69  , &nTerm);.    i
1f8c0 66 28 20 6e 54 65 72 6d 21 3d 74 65 72 6d 2e 6e  f( nTerm!=term.n
1f8d0 20 7c 7c 20 6d 65 6d 63 6d 70 28 70 54 65 72 6d   || memcmp(pTerm
1f8e0 2c 20 74 65 72 6d 2e 70 2c 20 6e 54 65 72 6d 29  , term.p, nTerm)
1f8f0 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 6e   ){.      if( pn
1f900 52 65 6d 20 26 26 20 77 72 69 74 65 72 2e 6e 4c  Rem && writer.nL
1f910 65 61 66 57 72 69 74 74 65 6e 3e 6e 52 65 6d 20  eafWritten>nRem 
1f920 29 7b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  ){.        break
1f930 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
1f940 20 2f 2a 20 54 68 69 73 20 69 73 20 61 20 6e 65   /* This is a ne
1f950 77 20 74 65 72 6d 2e 20 41 70 70 65 6e 64 20 61  w term. Append a
1f960 20 74 65 72 6d 20 74 6f 20 74 68 65 20 6f 75 74   term to the out
1f970 70 75 74 20 73 65 67 6d 65 6e 74 2e 20 2a 2f 0a  put segment. */.
1f980 20 20 20 20 20 20 66 74 73 35 57 72 69 74 65 41        fts5WriteA
1f990 70 70 65 6e 64 54 65 72 6d 28 70 2c 20 26 77 72  ppendTerm(p, &wr
1f9a0 69 74 65 72 2c 20 6e 54 65 72 6d 2c 20 70 54 65  iter, nTerm, pTe
1f9b0 72 6d 29 3b 0a 20 20 20 20 20 20 66 74 73 35 42  rm);.      fts5B
1f9c0 75 66 66 65 72 53 65 74 28 26 70 2d 3e 72 63 2c  ufferSet(&p->rc,
1f9d0 20 26 74 65 72 6d 2c 20 6e 54 65 72 6d 2c 20 70   &term, nTerm, p
1f9e0 54 65 72 6d 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  Term);.    }..  
1f9f0 20 20 2f 2a 20 41 70 70 65 6e 64 20 74 68 65 20    /* Append the 
1fa00 72 6f 77 69 64 20 74 6f 20 74 68 65 20 6f 75 74  rowid to the out
1fa10 70 75 74 20 2a 2f 0a 20 20 20 20 2f 2a 20 57 52  put */.    /* WR
1fa20 49 54 45 50 4f 53 4c 49 53 54 53 49 5a 45 20 2a  ITEPOSLISTSIZE *
1fa30 2f 0a 20 20 20 20 66 74 73 35 57 72 69 74 65 41  /.    fts5WriteA
1fa40 70 70 65 6e 64 52 6f 77 69 64 28 70 2c 20 26 77  ppendRowid(p, &w
1fa50 72 69 74 65 72 2c 20 66 74 73 35 4d 75 6c 74 69  riter, fts5Multi
1fa60 49 74 65 72 52 6f 77 69 64 28 70 49 74 65 72 29  IterRowid(pIter)
1fa70 29 3b 0a 0a 20 20 20 20 69 66 28 20 65 44 65 74  );..    if( eDet
1fa80 61 69 6c 3d 3d 46 54 53 35 5f 44 45 54 41 49 4c  ail==FTS5_DETAIL
1fa90 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 69  _NONE ){.      i
1faa0 66 28 20 70 53 65 67 49 74 65 72 2d 3e 62 44 65  f( pSegIter->bDe
1fab0 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 66 74 73  l ){.        fts
1fac0 35 42 75 66 66 65 72 41 70 70 65 6e 64 56 61 72  5BufferAppendVar
1fad0 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26 77 72 69  int(&p->rc, &wri
1fae0 74 65 72 2e 77 72 69 74 65 72 2e 62 75 66 2c 20  ter.writer.buf, 
1faf0 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  0);.        if( 
1fb00 70 53 65 67 49 74 65 72 2d 3e 6e 50 6f 73 3e 30  pSegIter->nPos>0
1fb10 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 66 74   ){.          ft
1fb20 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 56 61  s5BufferAppendVa
1fb30 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26 77 72  rint(&p->rc, &wr
1fb40 69 74 65 72 2e 77 72 69 74 65 72 2e 62 75 66 2c  iter.writer.buf,
1fb50 20 30 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20   0);.        }. 
1fb60 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
1fb70 7b 0a 20 20 20 20 20 20 2f 2a 20 41 70 70 65 6e  {.      /* Appen
1fb80 64 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 2d 6c  d the position-l
1fb90 69 73 74 20 64 61 74 61 20 74 6f 20 74 68 65 20  ist data to the 
1fba0 6f 75 74 70 75 74 20 2a 2f 0a 20 20 20 20 20 20  output */.      
1fbb0 6e 50 6f 73 20 3d 20 70 53 65 67 49 74 65 72 2d  nPos = pSegIter-
1fbc0 3e 6e 50 6f 73 2a 32 20 2b 20 70 53 65 67 49 74  >nPos*2 + pSegIt
1fbd0 65 72 2d 3e 62 44 65 6c 3b 0a 20 20 20 20 20 20  er->bDel;.      
1fbe0 66 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64  fts5BufferAppend
1fbf0 56 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26  Varint(&p->rc, &
1fc00 77 72 69 74 65 72 2e 77 72 69 74 65 72 2e 62 75  writer.writer.bu
1fc10 66 2c 20 6e 50 6f 73 29 3b 0a 20 20 20 20 20 20  f, nPos);.      
1fc20 66 74 73 35 43 68 75 6e 6b 49 74 65 72 61 74 65  fts5ChunkIterate
1fc30 28 70 2c 20 70 53 65 67 49 74 65 72 2c 20 28 76  (p, pSegIter, (v
1fc40 6f 69 64 2a 29 26 77 72 69 74 65 72 2c 20 66 74  oid*)&writer, ft
1fc50 73 35 4d 65 72 67 65 43 68 75 6e 6b 43 61 6c 6c  s5MergeChunkCall
1fc60 62 61 63 6b 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  back);.    }.  }
1fc70 0a 0a 20 20 2f 2a 20 46 6c 75 73 68 20 74 68 65  ..  /* Flush the
1fc80 20 6c 61 73 74 20 6c 65 61 66 20 70 61 67 65 20   last leaf page 
1fc90 74 6f 20 64 69 73 6b 2e 20 53 65 74 20 74 68 65  to disk. Set the
1fca0 20 6f 75 74 70 75 74 20 73 65 67 6d 65 6e 74 20   output segment 
1fcb0 62 2d 74 72 65 65 20 68 65 69 67 68 74 0a 20 20  b-tree height.  
1fcc0 2a 2a 20 61 6e 64 20 6c 61 73 74 20 6c 65 61 66  ** and last leaf
1fcd0 20 70 61 67 65 20 6e 75 6d 62 65 72 20 61 74 20   page number at 
1fce0 74 68 65 20 73 61 6d 65 20 74 69 6d 65 2e 20 20  the same time.  
1fcf0 2a 2f 0a 20 20 66 74 73 35 57 72 69 74 65 46 69  */.  fts5WriteFi
1fd00 6e 69 73 68 28 70 2c 20 26 77 72 69 74 65 72 2c  nish(p, &writer,
1fd10 20 26 70 53 65 67 2d 3e 70 67 6e 6f 4c 61 73 74   &pSeg->pgnoLast
1fd20 29 3b 0a 0a 20 20 69 66 28 20 66 74 73 35 4d 75  );..  if( fts5Mu
1fd30 6c 74 69 49 74 65 72 45 6f 66 28 70 2c 20 70 49  ltiIterEof(p, pI
1fd40 74 65 72 29 20 29 7b 0a 20 20 20 20 69 6e 74 20  ter) ){.    int 
1fd50 69 3b 0a 0a 20 20 20 20 2f 2a 20 52 65 6d 6f 76  i;..    /* Remov
1fd60 65 20 74 68 65 20 72 65 64 75 6e 64 61 6e 74 20  e the redundant 
1fd70 73 65 67 6d 65 6e 74 73 20 66 72 6f 6d 20 74 68  segments from th
1fd80 65 20 25 5f 64 61 74 61 20 74 61 62 6c 65 20 2a  e %_data table *
1fd90 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  /.    for(i=0; i
1fda0 3c 6e 49 6e 70 75 74 3b 20 69 2b 2b 29 7b 0a 20  <nInput; i++){. 
1fdb0 20 20 20 20 20 66 74 73 35 44 61 74 61 52 65 6d       fts5DataRem
1fdc0 6f 76 65 53 65 67 6d 65 6e 74 28 70 2c 20 70 4c  oveSegment(p, pL
1fdd0 76 6c 2d 3e 61 53 65 67 5b 69 5d 2e 69 53 65 67  vl->aSeg[i].iSeg
1fde0 69 64 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  id);.    }..    
1fdf0 2f 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 72 65  /* Remove the re
1fe00 64 75 6e 64 61 6e 74 20 73 65 67 6d 65 6e 74 73  dundant segments
1fe10 20 66 72 6f 6d 20 74 68 65 20 69 6e 70 75 74 20   from the input 
1fe20 6c 65 76 65 6c 20 2a 2f 0a 20 20 20 20 69 66 28  level */.    if(
1fe30 20 70 4c 76 6c 2d 3e 6e 53 65 67 21 3d 6e 49 6e   pLvl->nSeg!=nIn
1fe40 70 75 74 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  put ){.      int
1fe50 20 6e 4d 6f 76 65 20 3d 20 28 70 4c 76 6c 2d 3e   nMove = (pLvl->
1fe60 6e 53 65 67 20 2d 20 6e 49 6e 70 75 74 29 20 2a  nSeg - nInput) *
1fe70 20 73 69 7a 65 6f 66 28 46 74 73 35 53 74 72 75   sizeof(Fts5Stru
1fe80 63 74 75 72 65 53 65 67 6d 65 6e 74 29 3b 0a 20  ctureSegment);. 
1fe90 20 20 20 20 20 6d 65 6d 6d 6f 76 65 28 70 4c 76       memmove(pLv
1fea0 6c 2d 3e 61 53 65 67 2c 20 26 70 4c 76 6c 2d 3e  l->aSeg, &pLvl->
1feb0 61 53 65 67 5b 6e 49 6e 70 75 74 5d 2c 20 6e 4d  aSeg[nInput], nM
1fec0 6f 76 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ove);.    }.    
1fed0 70 53 74 72 75 63 74 2d 3e 6e 53 65 67 6d 65 6e  pStruct->nSegmen
1fee0 74 20 2d 3d 20 6e 49 6e 70 75 74 3b 0a 20 20 20  t -= nInput;.   
1fef0 20 70 4c 76 6c 2d 3e 6e 53 65 67 20 2d 3d 20 6e   pLvl->nSeg -= n
1ff00 49 6e 70 75 74 3b 0a 20 20 20 20 70 4c 76 6c 2d  Input;.    pLvl-
1ff10 3e 6e 4d 65 72 67 65 20 3d 20 30 3b 0a 20 20 20  >nMerge = 0;.   
1ff20 20 69 66 28 20 70 53 65 67 2d 3e 70 67 6e 6f 4c   if( pSeg->pgnoL
1ff30 61 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ast==0 ){.      
1ff40 70 4c 76 6c 4f 75 74 2d 3e 6e 53 65 67 2d 2d 3b  pLvlOut->nSeg--;
1ff50 0a 20 20 20 20 20 20 70 53 74 72 75 63 74 2d 3e  .      pStruct->
1ff60 6e 53 65 67 6d 65 6e 74 2d 2d 3b 0a 20 20 20 20  nSegment--;.    
1ff70 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61  }.  }else{.    a
1ff80 73 73 65 72 74 28 20 70 53 65 67 2d 3e 70 67 6e  ssert( pSeg->pgn
1ff90 6f 4c 61 73 74 3e 30 20 29 3b 0a 20 20 20 20 66  oLast>0 );.    f
1ffa0 74 73 35 54 72 69 6d 53 65 67 6d 65 6e 74 73 28  ts5TrimSegments(
1ffb0 70 2c 20 70 49 74 65 72 29 3b 0a 20 20 20 20 70  p, pIter);.    p
1ffc0 4c 76 6c 2d 3e 6e 4d 65 72 67 65 20 3d 20 6e 49  Lvl->nMerge = nI
1ffd0 6e 70 75 74 3b 0a 20 20 7d 0a 0a 20 20 66 74 73  nput;.  }..  fts
1ffe0 35 4d 75 6c 74 69 49 74 65 72 46 72 65 65 28 70  5MultiIterFree(p
1fff0 49 74 65 72 29 3b 0a 20 20 66 74 73 35 42 75 66  Iter);.  fts5Buf
20000 66 65 72 46 72 65 65 28 26 74 65 72 6d 29 3b 0a  ferFree(&term);.
20010 20 20 69 66 28 20 70 6e 52 65 6d 20 29 20 2a 70    if( pnRem ) *p
20020 6e 52 65 6d 20 2d 3d 20 77 72 69 74 65 72 2e 6e  nRem -= writer.n
20030 4c 65 61 66 57 72 69 74 74 65 6e 3b 0a 7d 0a 0a  LeafWritten;.}..
20040 2f 2a 0a 2a 2a 20 44 6f 20 75 70 20 74 6f 20 6e  /*.** Do up to n
20050 50 67 20 70 61 67 65 73 20 6f 66 20 61 75 74 6f  Pg pages of auto
20060 6d 65 72 67 65 20 77 6f 72 6b 20 6f 6e 20 74 68  merge work on th
20070 65 20 69 6e 64 65 78 2e 0a 2a 2f 0a 73 74 61 74  e index..*/.stat
20080 69 63 20 76 6f 69 64 20 66 74 73 35 49 6e 64 65  ic void fts5Inde
20090 78 4d 65 72 67 65 28 0a 20 20 46 74 73 35 49 6e  xMerge(.  Fts5In
200a0 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20 20  dex *p,         
200b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53            /* FTS
200c0 35 20 62 61 63 6b 65 6e 64 20 6f 62 6a 65 63 74  5 backend object
200d0 20 2a 2f 0a 20 20 46 74 73 35 53 74 72 75 63 74   */.  Fts5Struct
200e0 75 72 65 20 2a 2a 70 70 53 74 72 75 63 74 2c 20  ure **ppStruct, 
200f0 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a        /* IN/OUT:
20100 20 43 75 72 72 65 6e 74 20 73 74 72 75 63 74 75   Current structu
20110 72 65 20 6f 66 20 69 6e 64 65 78 20 2a 2f 0a 20  re of index */. 
20120 20 69 6e 74 20 6e 50 67 20 20 20 20 20 20 20 20   int nPg        
20130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20140 20 2f 2a 20 50 61 67 65 73 20 6f 66 20 77 6f 72   /* Pages of wor
20150 6b 20 74 6f 20 64 6f 20 2a 2f 0a 29 7b 0a 20 20  k to do */.){.  
20160 69 6e 74 20 6e 52 65 6d 20 3d 20 6e 50 67 3b 0a  int nRem = nPg;.
20170 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65 20    Fts5Structure 
20180 2a 70 53 74 72 75 63 74 20 3d 20 2a 70 70 53 74  *pStruct = *ppSt
20190 72 75 63 74 3b 0a 20 20 77 68 69 6c 65 28 20 6e  ruct;.  while( n
201a0 52 65 6d 3e 30 20 26 26 20 70 2d 3e 72 63 3d 3d  Rem>0 && p->rc==
201b0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
201c0 20 69 6e 74 20 69 4c 76 6c 3b 20 20 20 20 20 20   int iLvl;      
201d0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
201e0 54 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f 75  To iterate throu
201f0 67 68 20 6c 65 76 65 6c 73 20 2a 2f 0a 20 20 20  gh levels */.   
20200 20 69 6e 74 20 69 42 65 73 74 4c 76 6c 20 3d 20   int iBestLvl = 
20210 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  0;           /* 
20220 4c 65 76 65 6c 20 6f 66 66 65 72 69 6e 67 20 74  Level offering t
20230 68 65 20 6d 6f 73 74 20 69 6e 70 75 74 20 73 65  he most input se
20240 67 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20 69 6e  gments */.    in
20250 74 20 6e 42 65 73 74 20 3d 20 30 3b 20 20 20 20  t nBest = 0;    
20260 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
20270 62 65 72 20 6f 66 20 69 6e 70 75 74 20 73 65 67  ber of input seg
20280 6d 65 6e 74 73 20 6f 6e 20 62 65 73 74 20 6c 65  ments on best le
20290 76 65 6c 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 53  vel */..    /* S
202a0 65 74 20 69 42 65 73 74 4c 76 6c 20 74 6f 20 74  et iBestLvl to t
202b0 68 65 20 6c 65 76 65 6c 20 74 6f 20 72 65 61 64  he level to read
202c0 20 69 6e 70 75 74 20 73 65 67 6d 65 6e 74 73 20   input segments 
202d0 66 72 6f 6d 2e 20 2a 2f 0a 20 20 20 20 61 73 73  from. */.    ass
202e0 65 72 74 28 20 70 53 74 72 75 63 74 2d 3e 6e 4c  ert( pStruct->nL
202f0 65 76 65 6c 3e 30 20 29 3b 0a 20 20 20 20 66 6f  evel>0 );.    fo
20300 72 28 69 4c 76 6c 3d 30 3b 20 69 4c 76 6c 3c 70  r(iLvl=0; iLvl<p
20310 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 3b 20  Struct->nLevel; 
20320 69 4c 76 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 46  iLvl++){.      F
20330 74 73 35 53 74 72 75 63 74 75 72 65 4c 65 76 65  ts5StructureLeve
20340 6c 20 2a 70 4c 76 6c 20 3d 20 26 70 53 74 72 75  l *pLvl = &pStru
20350 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d  ct->aLevel[iLvl]
20360 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4c 76 6c  ;.      if( pLvl
20370 2d 3e 6e 4d 65 72 67 65 20 29 7b 0a 20 20 20 20  ->nMerge ){.    
20380 20 20 20 20 69 66 28 20 70 4c 76 6c 2d 3e 6e 4d      if( pLvl->nM
20390 65 72 67 65 3e 6e 42 65 73 74 20 29 7b 0a 20 20  erge>nBest ){.  
203a0 20 20 20 20 20 20 20 20 69 42 65 73 74 4c 76 6c          iBestLvl
203b0 20 3d 20 69 4c 76 6c 3b 0a 20 20 20 20 20 20 20   = iLvl;.       
203c0 20 20 20 6e 42 65 73 74 20 3d 20 70 4c 76 6c 2d     nBest = pLvl-
203d0 3e 6e 4d 65 72 67 65 3b 0a 20 20 20 20 20 20 20  >nMerge;.       
203e0 20 7d 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b   }.        break
203f0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
20400 69 66 28 20 70 4c 76 6c 2d 3e 6e 53 65 67 3e 6e  if( pLvl->nSeg>n
20410 42 65 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20  Best ){.        
20420 6e 42 65 73 74 20 3d 20 70 4c 76 6c 2d 3e 6e 53  nBest = pLvl->nS
20430 65 67 3b 0a 20 20 20 20 20 20 20 20 69 42 65 73  eg;.        iBes
20440 74 4c 76 6c 20 3d 20 69 4c 76 6c 3b 0a 20 20 20  tLvl = iLvl;.   
20450 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
20460 2f 2a 20 49 66 20 6e 42 65 73 74 20 69 73 20 73  /* If nBest is s
20470 74 69 6c 6c 20 30 2c 20 74 68 65 6e 20 74 68 65  till 0, then the
20480 20 69 6e 64 65 78 20 6d 75 73 74 20 62 65 20 65   index must be e
20490 6d 70 74 79 2e 20 2a 2f 0a 23 69 66 64 65 66 20  mpty. */.#ifdef 
204a0 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20  SQLITE_DEBUG.   
204b0 20 66 6f 72 28 69 4c 76 6c 3d 30 3b 20 6e 42 65   for(iLvl=0; nBe
204c0 73 74 3d 3d 30 20 26 26 20 69 4c 76 6c 3c 70 53  st==0 && iLvl<pS
204d0 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 3b 20 69  truct->nLevel; i
204e0 4c 76 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 61 73  Lvl++){.      as
204f0 73 65 72 74 28 20 70 53 74 72 75 63 74 2d 3e 61  sert( pStruct->a
20500 4c 65 76 65 6c 5b 69 4c 76 6c 5d 2e 6e 53 65 67  Level[iLvl].nSeg
20510 3d 3d 30 20 29 3b 0a 20 20 20 20 7d 0a 23 65 6e  ==0 );.    }.#en
20520 64 69 66 0a 0a 20 20 20 20 69 66 28 20 6e 42 65  dif..    if( nBe
20530 73 74 3c 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e 6e  st<p->pConfig->n
20540 41 75 74 6f 6d 65 72 67 65 20 0a 20 20 20 20 20  Automerge .     
20550 20 20 20 26 26 20 70 53 74 72 75 63 74 2d 3e 61     && pStruct->a
20560 4c 65 76 65 6c 5b 69 42 65 73 74 4c 76 6c 5d 2e  Level[iBestLvl].
20570 6e 4d 65 72 67 65 3d 3d 30 20 0a 20 20 20 20 20  nMerge==0 .     
20580 20 29 7b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   ){.      break;
20590 0a 20 20 20 20 7d 0a 20 20 20 20 66 74 73 35 49  .    }.    fts5I
205a0 6e 64 65 78 4d 65 72 67 65 4c 65 76 65 6c 28 70  ndexMergeLevel(p
205b0 2c 20 26 70 53 74 72 75 63 74 2c 20 69 42 65 73  , &pStruct, iBes
205c0 74 4c 76 6c 2c 20 26 6e 52 65 6d 29 3b 0a 20 20  tLvl, &nRem);.  
205d0 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c    if( p->rc==SQL
205e0 49 54 45 5f 4f 4b 20 26 26 20 70 53 74 72 75 63  ITE_OK && pStruc
205f0 74 2d 3e 61 4c 65 76 65 6c 5b 69 42 65 73 74 4c  t->aLevel[iBestL
20600 76 6c 5d 2e 6e 4d 65 72 67 65 3d 3d 30 20 29 7b  vl].nMerge==0 ){
20610 0a 20 20 20 20 20 20 66 74 73 35 53 74 72 75 63  .      fts5Struc
20620 74 75 72 65 50 72 6f 6d 6f 74 65 28 70 2c 20 69  turePromote(p, i
20630 42 65 73 74 4c 76 6c 2b 31 2c 20 70 53 74 72 75  BestLvl+1, pStru
20640 63 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  ct);.    }.  }. 
20650 20 2a 70 70 53 74 72 75 63 74 20 3d 20 70 53 74   *ppStruct = pSt
20660 72 75 63 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  ruct;.}../*.** A
20670 20 74 6f 74 61 6c 20 6f 66 20 6e 4c 65 61 66 20   total of nLeaf 
20680 6c 65 61 66 20 70 61 67 65 73 20 6f 66 20 64 61  leaf pages of da
20690 74 61 20 68 61 73 20 6a 75 73 74 20 62 65 65 6e  ta has just been
206a0 20 66 6c 75 73 68 65 64 20 74 6f 20 61 20 6c 65   flushed to a le
206b0 76 65 6c 2d 30 0a 2a 2a 20 73 65 67 6d 65 6e 74  vel-0.** segment
206c0 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  . This function 
206d0 75 70 64 61 74 65 73 20 74 68 65 20 77 72 69 74  updates the writ
206e0 65 2d 63 6f 75 6e 74 65 72 20 61 63 63 6f 72 64  e-counter accord
206f0 69 6e 67 6c 79 20 61 6e 64 2c 20 69 66 0a 2a 2a  ingly and, if.**
20700 20 6e 65 63 65 73 73 61 72 79 2c 20 70 65 72 66   necessary, perf
20710 6f 72 6d 73 20 69 6e 63 72 65 6d 65 6e 74 61 6c  orms incremental
20720 20 6d 65 72 67 65 20 77 6f 72 6b 2e 0a 2a 2a 0a   merge work..**.
20730 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  ** If an error o
20740 63 63 75 72 73 2c 20 73 65 74 20 74 68 65 20 46  ccurs, set the F
20750 74 73 35 49 6e 64 65 78 2e 72 63 20 65 72 72 6f  ts5Index.rc erro
20760 72 20 63 6f 64 65 2e 20 49 66 20 61 6e 20 65 72  r code. If an er
20770 72 6f 72 20 68 61 73 20 0a 2a 2a 20 61 6c 72 65  ror has .** alre
20780 61 64 79 20 6f 63 63 75 72 72 65 64 2c 20 74 68  ady occurred, th
20790 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61  is function is a
207a0 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69   no-op..*/.stati
207b0 63 20 76 6f 69 64 20 66 74 73 35 49 6e 64 65 78  c void fts5Index
207c0 41 75 74 6f 6d 65 72 67 65 28 0a 20 20 46 74 73  Automerge(.  Fts
207d0 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20  5Index *p,      
207e0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
207f0 46 54 53 35 20 62 61 63 6b 65 6e 64 20 6f 62 6a  FTS5 backend obj
20800 65 63 74 20 2a 2f 0a 20 20 46 74 73 35 53 74 72  ect */.  Fts5Str
20810 75 63 74 75 72 65 20 2a 2a 70 70 53 74 72 75 63  ucture **ppStruc
20820 74 2c 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f  t,       /* IN/O
20830 55 54 3a 20 43 75 72 72 65 6e 74 20 73 74 72 75  UT: Current stru
20840 63 74 75 72 65 20 6f 66 20 69 6e 64 65 78 20 2a  cture of index *
20850 2f 0a 20 20 69 6e 74 20 6e 4c 65 61 66 20 20 20  /.  int nLeaf   
20860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20870 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
20880 20 6f 75 74 70 75 74 20 6c 65 61 76 65 73 20 6a   output leaves j
20890 75 73 74 20 77 72 69 74 74 65 6e 20 2a 2f 0a 29  ust written */.)
208a0 7b 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53  {.  if( p->rc==S
208b0 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 2d 3e 70  QLITE_OK && p->p
208c0 43 6f 6e 66 69 67 2d 3e 6e 41 75 74 6f 6d 65 72  Config->nAutomer
208d0 67 65 3e 30 20 29 7b 0a 20 20 20 20 46 74 73 35  ge>0 ){.    Fts5
208e0 53 74 72 75 63 74 75 72 65 20 2a 70 53 74 72 75  Structure *pStru
208f0 63 74 20 3d 20 2a 70 70 53 74 72 75 63 74 3b 0a  ct = *ppStruct;.
20900 20 20 20 20 75 36 34 20 6e 57 72 69 74 65 3b 20      u64 nWrite; 
20910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20920 20 20 2f 2a 20 49 6e 69 74 69 61 6c 20 76 61 6c    /* Initial val
20930 75 65 20 6f 66 20 77 72 69 74 65 2d 63 6f 75 6e  ue of write-coun
20940 74 65 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e  ter */.    int n
20950 57 6f 72 6b 3b 20 20 20 20 20 20 20 20 20 20 20  Work;           
20960 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
20970 65 72 20 6f 66 20 77 6f 72 6b 2d 71 75 61 6e 74  er of work-quant
20980 61 20 74 6f 20 70 65 72 66 6f 72 6d 20 2a 2f 0a  a to perform */.
20990 20 20 20 20 69 6e 74 20 6e 52 65 6d 3b 20 20 20      int nRem;   
209a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
209b0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6c    /* Number of l
209c0 65 61 66 20 70 61 67 65 73 20 6c 65 66 74 20 74  eaf pages left t
209d0 6f 20 77 72 69 74 65 20 2a 2f 0a 0a 20 20 20 20  o write */..    
209e0 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20 77 72  /* Update the wr
209f0 69 74 65 2d 63 6f 75 6e 74 65 72 2e 20 57 68 69  ite-counter. Whi
20a00 6c 65 20 64 6f 69 6e 67 20 73 6f 2c 20 73 65 74  le doing so, set
20a10 20 6e 57 6f 72 6b 2e 20 2a 2f 0a 20 20 20 20 6e   nWork. */.    n
20a20 57 72 69 74 65 20 3d 20 70 53 74 72 75 63 74 2d  Write = pStruct-
20a30 3e 6e 57 72 69 74 65 43 6f 75 6e 74 65 72 3b 0a  >nWriteCounter;.
20a40 20 20 20 20 6e 57 6f 72 6b 20 3d 20 28 69 6e 74      nWork = (int
20a50 29 28 28 28 6e 57 72 69 74 65 20 2b 20 6e 4c 65  )(((nWrite + nLe
20a60 61 66 29 20 2f 20 70 2d 3e 6e 57 6f 72 6b 55 6e  af) / p->nWorkUn
20a70 69 74 29 20 2d 20 28 6e 57 72 69 74 65 20 2f 20  it) - (nWrite / 
20a80 70 2d 3e 6e 57 6f 72 6b 55 6e 69 74 29 29 3b 0a  p->nWorkUnit));.
20a90 20 20 20 20 70 53 74 72 75 63 74 2d 3e 6e 57 72      pStruct->nWr
20aa0 69 74 65 43 6f 75 6e 74 65 72 20 2b 3d 20 6e 4c  iteCounter += nL
20ab0 65 61 66 3b 0a 20 20 20 20 6e 52 65 6d 20 3d 20  eaf;.    nRem = 
20ac0 28 69 6e 74 29 28 70 2d 3e 6e 57 6f 72 6b 55 6e  (int)(p->nWorkUn
20ad0 69 74 20 2a 20 6e 57 6f 72 6b 20 2a 20 70 53 74  it * nWork * pSt
20ae0 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 29 3b 0a 0a  ruct->nLevel);..
20af0 20 20 20 20 66 74 73 35 49 6e 64 65 78 4d 65 72      fts5IndexMer
20b00 67 65 28 70 2c 20 70 70 53 74 72 75 63 74 2c 20  ge(p, ppStruct, 
20b10 6e 52 65 6d 29 3b 0a 20 20 7d 0a 7d 0a 0a 73 74  nRem);.  }.}..st
20b20 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 49 6e  atic void fts5In
20b30 64 65 78 43 72 69 73 69 73 6d 65 72 67 65 28 0a  dexCrisismerge(.
20b40 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20    Fts5Index *p, 
20b50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20b60 20 20 2f 2a 20 46 54 53 35 20 62 61 63 6b 65 6e    /* FTS5 backen
20b70 64 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 46 74  d object */.  Ft
20b80 73 35 53 74 72 75 63 74 75 72 65 20 2a 2a 70 70  s5Structure **pp
20b90 53 74 72 75 63 74 20 20 20 20 20 20 20 20 2f 2a  Struct        /*
20ba0 20 49 4e 2f 4f 55 54 3a 20 43 75 72 72 65 6e 74   IN/OUT: Current
20bb0 20 73 74 72 75 63 74 75 72 65 20 6f 66 20 69 6e   structure of in
20bc0 64 65 78 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73  dex */.){.  cons
20bd0 74 20 69 6e 74 20 6e 43 72 69 73 69 73 20 3d 20  t int nCrisis = 
20be0 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e 6e 43 72 69  p->pConfig->nCri
20bf0 73 69 73 4d 65 72 67 65 3b 0a 20 20 46 74 73 35  sisMerge;.  Fts5
20c00 53 74 72 75 63 74 75 72 65 20 2a 70 53 74 72 75  Structure *pStru
20c10 63 74 20 3d 20 2a 70 70 53 74 72 75 63 74 3b 0a  ct = *ppStruct;.
20c20 20 20 69 6e 74 20 69 4c 76 6c 20 3d 20 30 3b 0a    int iLvl = 0;.
20c30 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72 63  .  assert( p->rc
20c40 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70  !=SQLITE_OK || p
20c50 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 3e 30  Struct->nLevel>0
20c60 20 29 3b 0a 20 20 77 68 69 6c 65 28 20 70 2d 3e   );.  while( p->
20c70 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
20c80 20 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c   pStruct->aLevel
20c90 5b 69 4c 76 6c 5d 2e 6e 53 65 67 3e 3d 6e 43 72  [iLvl].nSeg>=nCr
20ca0 69 73 69 73 20 29 7b 0a 20 20 20 20 66 74 73 35  isis ){.    fts5
20cb0 49 6e 64 65 78 4d 65 72 67 65 4c 65 76 65 6c 28  IndexMergeLevel(
20cc0 70 2c 20 26 70 53 74 72 75 63 74 2c 20 69 4c 76  p, &pStruct, iLv
20cd0 6c 2c 20 30 29 3b 0a 20 20 20 20 61 73 73 65 72  l, 0);.    asser
20ce0 74 28 20 70 2d 3e 72 63 21 3d 53 51 4c 49 54 45  t( p->rc!=SQLITE
20cf0 5f 4f 4b 20 7c 7c 20 70 53 74 72 75 63 74 2d 3e  _OK || pStruct->
20d00 6e 4c 65 76 65 6c 3e 28 69 4c 76 6c 2b 31 29 20  nLevel>(iLvl+1) 
20d10 29 3b 0a 20 20 20 20 66 74 73 35 53 74 72 75 63  );.    fts5Struc
20d20 74 75 72 65 50 72 6f 6d 6f 74 65 28 70 2c 20 69  turePromote(p, i
20d30 4c 76 6c 2b 31 2c 20 70 53 74 72 75 63 74 29 3b  Lvl+1, pStruct);
20d40 0a 20 20 20 20 69 4c 76 6c 2b 2b 3b 0a 20 20 7d  .    iLvl++;.  }
20d50 0a 20 20 2a 70 70 53 74 72 75 63 74 20 3d 20 70  .  *ppStruct = p
20d60 53 74 72 75 63 74 3b 0a 7d 0a 0a 73 74 61 74 69  Struct;.}..stati
20d70 63 20 69 6e 74 20 66 74 73 35 49 6e 64 65 78 52  c int fts5IndexR
20d80 65 74 75 72 6e 28 46 74 73 35 49 6e 64 65 78 20  eturn(Fts5Index 
20d90 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  *p){.  int rc = 
20da0 70 2d 3e 72 63 3b 0a 20 20 70 2d 3e 72 63 20 3d  p->rc;.  p->rc =
20db0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 72 65   SQLITE_OK;.  re
20dc0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 74 79 70 65  turn rc;.}..type
20dd0 64 65 66 20 73 74 72 75 63 74 20 46 74 73 35 46  def struct Fts5F
20de0 6c 75 73 68 43 74 78 20 46 74 73 35 46 6c 75 73  lushCtx Fts5Flus
20df0 68 43 74 78 3b 0a 73 74 72 75 63 74 20 46 74 73  hCtx;.struct Fts
20e00 35 46 6c 75 73 68 43 74 78 20 7b 0a 20 20 46 74  5FlushCtx {.  Ft
20e10 73 35 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20  s5Index *pIdx;. 
20e20 20 46 74 73 35 53 65 67 57 72 69 74 65 72 20 77   Fts5SegWriter w
20e30 72 69 74 65 72 3b 20 0a 7d 3b 0a 0a 2f 2a 0a 2a  riter; .};../*.*
20e40 2a 20 42 75 66 66 65 72 20 61 42 75 66 5b 5d 20  * Buffer aBuf[] 
20e50 63 6f 6e 74 61 69 6e 73 20 61 20 6c 69 73 74 20  contains a list 
20e60 6f 66 20 76 61 72 69 6e 74 73 2c 20 61 6c 6c 20  of varints, all 
20e70 73 6d 61 6c 6c 20 65 6e 6f 75 67 68 20 74 6f 20  small enough to 
20e80 66 69 74 0a 2a 2a 20 69 6e 20 61 20 33 32 2d 62  fit.** in a 32-b
20e90 69 74 20 69 6e 74 65 67 65 72 2e 20 52 65 74 75  it integer. Retu
20ea0 72 6e 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  rn the size of t
20eb0 68 65 20 6c 61 72 67 65 73 74 20 70 72 65 66 69  he largest prefi
20ec0 78 20 6f 66 20 74 68 69 73 20 0a 2a 2a 20 6c 69  x of this .** li
20ed0 73 74 20 6e 4d 61 78 20 62 79 74 65 73 20 6f 72  st nMax bytes or
20ee0 20 6c 65 73 73 20 69 6e 20 73 69 7a 65 2e 0a 2a   less in size..*
20ef0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73  /.static int fts
20f00 35 50 6f 73 6c 69 73 74 50 72 65 66 69 78 28 63  5PoslistPrefix(c
20f10 6f 6e 73 74 20 75 38 20 2a 61 42 75 66 2c 20 69  onst u8 *aBuf, i
20f20 6e 74 20 6e 4d 61 78 29 7b 0a 20 20 69 6e 74 20  nt nMax){.  int 
20f30 72 65 74 3b 0a 20 20 75 33 32 20 64 75 6d 6d 79  ret;.  u32 dummy
20f40 3b 0a 20 20 72 65 74 20 3d 20 66 74 73 35 47 65  ;.  ret = fts5Ge
20f50 74 56 61 72 69 6e 74 33 32 28 61 42 75 66 2c 20  tVarint32(aBuf, 
20f60 64 75 6d 6d 79 29 3b 0a 20 20 69 66 28 20 72 65  dummy);.  if( re
20f70 74 3c 6e 4d 61 78 20 29 7b 0a 20 20 20 20 77 68  t<nMax ){.    wh
20f80 69 6c 65 28 20 31 20 29 7b 0a 20 20 20 20 20 20  ile( 1 ){.      
20f90 69 6e 74 20 69 20 3d 20 66 74 73 35 47 65 74 56  int i = fts5GetV
20fa0 61 72 69 6e 74 33 32 28 26 61 42 75 66 5b 72 65  arint32(&aBuf[re
20fb0 74 5d 2c 20 64 75 6d 6d 79 29 3b 0a 20 20 20 20  t], dummy);.    
20fc0 20 20 69 66 28 20 28 72 65 74 20 2b 20 69 29 20    if( (ret + i) 
20fd0 3e 20 6e 4d 61 78 20 29 20 62 72 65 61 6b 3b 0a  > nMax ) break;.
20fe0 20 20 20 20 20 20 72 65 74 20 2b 3d 20 69 3b 0a        ret += i;.
20ff0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
21000 72 6e 20 72 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  rn ret;.}../*.**
21010 20 46 6c 75 73 68 20 74 68 65 20 63 6f 6e 74 65   Flush the conte
21020 6e 74 73 20 6f 66 20 69 6e 2d 6d 65 6d 6f 72 79  nts of in-memory
21030 20 68 61 73 68 20 74 61 62 6c 65 20 69 48 61 73   hash table iHas
21040 68 20 74 6f 20 61 20 6e 65 77 20 6c 65 76 65 6c  h to a new level
21050 2d 30 20 0a 2a 2a 20 73 65 67 6d 65 6e 74 20 6f  -0 .** segment o
21060 6e 20 64 69 73 6b 2e 20 41 6c 73 6f 20 75 70 64  n disk. Also upd
21070 61 74 65 20 74 68 65 20 63 6f 72 72 65 73 70 6f  ate the correspo
21080 6e 64 69 6e 67 20 73 74 72 75 63 74 75 72 65 20  nding structure 
21090 72 65 63 6f 72 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  record..**.** If
210a0 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
210b0 2c 20 73 65 74 20 74 68 65 20 46 74 73 35 49 6e  , set the Fts5In
210c0 64 65 78 2e 72 63 20 65 72 72 6f 72 20 63 6f 64  dex.rc error cod
210d0 65 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20 68  e. If an error h
210e0 61 73 20 0a 2a 2a 20 61 6c 72 65 61 64 79 20 6f  as .** already o
210f0 63 63 75 72 72 65 64 2c 20 74 68 69 73 20 66 75  ccurred, this fu
21100 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f  nction is a no-o
21110 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  p..*/.static voi
21120 64 20 66 74 73 35 46 6c 75 73 68 4f 6e 65 48 61  d fts5FlushOneHa
21130 73 68 28 46 74 73 35 49 6e 64 65 78 20 2a 70 29  sh(Fts5Index *p)
21140 7b 0a 20 20 46 74 73 35 48 61 73 68 20 2a 70 48  {.  Fts5Hash *pH
21150 61 73 68 20 3d 20 70 2d 3e 70 48 61 73 68 3b 0a  ash = p->pHash;.
21160 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65 20    Fts5Structure 
21170 2a 70 53 74 72 75 63 74 3b 0a 20 20 69 6e 74 20  *pStruct;.  int 
21180 69 53 65 67 69 64 3b 0a 20 20 69 6e 74 20 70 67  iSegid;.  int pg
21190 6e 6f 4c 61 73 74 20 3d 20 30 3b 20 20 20 20 20  noLast = 0;     
211a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
211b0 61 73 74 20 6c 65 61 66 20 70 61 67 65 20 6e 75  ast leaf page nu
211c0 6d 62 65 72 20 69 6e 20 73 65 67 6d 65 6e 74 20  mber in segment 
211d0 2a 2f 0a 0a 20 20 2f 2a 20 4f 62 74 61 69 6e 20  */..  /* Obtain 
211e0 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74  a reference to t
211f0 68 65 20 69 6e 64 65 78 20 73 74 72 75 63 74 75  he index structu
21200 72 65 20 61 6e 64 20 61 6c 6c 6f 63 61 74 65 20  re and allocate 
21210 61 20 6e 65 77 20 73 65 67 6d 65 6e 74 2d 69 64  a new segment-id
21220 0a 20 20 2a 2a 20 66 6f 72 20 74 68 65 20 6e 65  .  ** for the ne
21230 77 20 6c 65 76 65 6c 2d 30 20 73 65 67 6d 65 6e  w level-0 segmen
21240 74 2e 20 20 2a 2f 0a 20 20 70 53 74 72 75 63 74  t.  */.  pStruct
21250 20 3d 20 66 74 73 35 53 74 72 75 63 74 75 72 65   = fts5Structure
21260 52 65 61 64 28 70 29 3b 0a 20 20 69 53 65 67 69  Read(p);.  iSegi
21270 64 20 3d 20 66 74 73 35 41 6c 6c 6f 63 61 74 65  d = fts5Allocate
21280 53 65 67 69 64 28 70 2c 20 70 53 74 72 75 63 74  Segid(p, pStruct
21290 29 3b 0a 0a 20 20 69 66 28 20 69 53 65 67 69 64  );..  if( iSegid
212a0 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 69 6e   ){.    const in
212b0 74 20 70 67 73 7a 20 3d 20 70 2d 3e 70 43 6f 6e  t pgsz = p->pCon
212c0 66 69 67 2d 3e 70 67 73 7a 3b 0a 20 20 20 20 69  fig->pgsz;.    i
212d0 6e 74 20 65 44 65 74 61 69 6c 20 3d 20 70 2d 3e  nt eDetail = p->
212e0 70 43 6f 6e 66 69 67 2d 3e 65 44 65 74 61 69 6c  pConfig->eDetail
212f0 3b 0a 20 20 20 20 46 74 73 35 53 74 72 75 63 74  ;.    Fts5Struct
21300 75 72 65 53 65 67 6d 65 6e 74 20 2a 70 53 65 67  ureSegment *pSeg
21310 3b 20 20 20 2f 2a 20 4e 65 77 20 73 65 67 6d 65  ;   /* New segme
21320 6e 74 20 77 69 74 68 69 6e 20 70 53 74 72 75 63  nt within pStruc
21330 74 20 2a 2f 0a 20 20 20 20 46 74 73 35 42 75 66  t */.    Fts5Buf
21340 66 65 72 20 2a 70 42 75 66 3b 20 20 20 20 20 20  fer *pBuf;      
21350 20 20 20 20 20 20 20 2f 2a 20 42 75 66 66 65 72         /* Buffer
21360 20 69 6e 20 77 68 69 63 68 20 74 6f 20 61 73 73   in which to ass
21370 65 6d 62 6c 65 20 6c 65 61 66 20 70 61 67 65 20  emble leaf page 
21380 2a 2f 0a 20 20 20 20 46 74 73 35 42 75 66 66 65  */.    Fts5Buffe
21390 72 20 2a 70 50 67 69 64 78 3b 20 20 20 20 20 20  r *pPgidx;      
213a0 20 20 20 20 20 2f 2a 20 42 75 66 66 65 72 20 69       /* Buffer i
213b0 6e 20 77 68 69 63 68 20 74 6f 20 61 73 73 65 6d  n which to assem
213c0 62 6c 65 20 70 67 69 64 78 20 2a 2f 0a 0a 20 20  ble pgidx */..  
213d0 20 20 46 74 73 35 53 65 67 57 72 69 74 65 72 20    Fts5SegWriter 
213e0 77 72 69 74 65 72 3b 0a 20 20 20 20 66 74 73 35  writer;.    fts5
213f0 57 72 69 74 65 49 6e 69 74 28 70 2c 20 26 77 72  WriteInit(p, &wr
21400 69 74 65 72 2c 20 69 53 65 67 69 64 29 3b 0a 0a  iter, iSegid);..
21410 20 20 20 20 70 42 75 66 20 3d 20 26 77 72 69 74      pBuf = &writ
21420 65 72 2e 77 72 69 74 65 72 2e 62 75 66 3b 0a 20  er.writer.buf;. 
21430 20 20 20 70 50 67 69 64 78 20 3d 20 26 77 72 69     pPgidx = &wri
21440 74 65 72 2e 77 72 69 74 65 72 2e 70 67 69 64 78  ter.writer.pgidx
21450 3b 0a 0a 20 20 20 20 2f 2a 20 66 74 73 35 57 72  ;..    /* fts5Wr
21460 69 74 65 49 6e 69 74 28 29 20 73 68 6f 75 6c 64  iteInit() should
21470 20 68 61 76 65 20 69 6e 69 74 69 61 6c 69 7a 65   have initialize
21480 64 20 74 68 65 20 62 75 66 66 65 72 73 20 74 6f  d the buffers to
21490 20 28 6d 6f 73 74 20 6c 69 6b 65 6c 79 29 0a 20   (most likely). 
214a0 20 20 20 2a 2a 20 74 68 65 20 6d 61 78 69 6d 75     ** the maximu
214b0 6d 20 73 70 61 63 65 20 72 65 71 75 69 72 65 64  m space required
214c0 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28  . */.    assert(
214d0 20 70 2d 3e 72 63 20 7c 7c 20 70 42 75 66 2d 3e   p->rc || pBuf->
214e0 6e 53 70 61 63 65 3e 3d 28 70 67 73 7a 20 2b 20  nSpace>=(pgsz + 
214f0 46 54 53 35 5f 44 41 54 41 5f 50 41 44 44 49 4e  FTS5_DATA_PADDIN
21500 47 29 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  G) );.    assert
21510 28 20 70 2d 3e 72 63 20 7c 7c 20 70 50 67 69 64  ( p->rc || pPgid
21520 78 2d 3e 6e 53 70 61 63 65 3e 3d 28 70 67 73 7a  x->nSpace>=(pgsz
21530 20 2b 20 46 54 53 35 5f 44 41 54 41 5f 50 41 44   + FTS5_DATA_PAD
21540 44 49 4e 47 29 20 29 3b 0a 0a 20 20 20 20 2f 2a  DING) );..    /*
21550 20 42 65 67 69 6e 20 73 63 61 6e 6e 69 6e 67 20   Begin scanning 
21560 74 68 72 6f 75 67 68 20 68 61 73 68 20 74 61 62  through hash tab
21570 6c 65 20 65 6e 74 72 69 65 73 2e 20 54 68 69 73  le entries. This
21580 20 6c 6f 6f 70 20 72 75 6e 73 20 6f 6e 63 65 20   loop runs once 
21590 66 6f 72 20 65 61 63 68 0a 20 20 20 20 2a 2a 20  for each.    ** 
215a0 74 65 72 6d 2f 64 6f 63 6c 69 73 74 20 63 75 72  term/doclist cur
215b0 72 65 6e 74 6c 79 20 73 74 6f 72 65 64 20 77 69  rently stored wi
215c0 74 68 69 6e 20 74 68 65 20 68 61 73 68 20 74 61  thin the hash ta
215d0 62 6c 65 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20  ble. */.    if( 
215e0 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
215f0 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 72 63 20   ){.      p->rc 
21600 3d 20 73 71 6c 69 74 65 33 46 74 73 35 48 61 73  = sqlite3Fts5Has
21610 68 53 63 61 6e 49 6e 69 74 28 70 48 61 73 68 2c  hScanInit(pHash,
21620 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20   0, 0);.    }.  
21630 20 20 77 68 69 6c 65 28 20 70 2d 3e 72 63 3d 3d    while( p->rc==
21640 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 30 3d 3d  SQLITE_OK && 0==
21650 73 71 6c 69 74 65 33 46 74 73 35 48 61 73 68 53  sqlite3Fts5HashS
21660 63 61 6e 45 6f 66 28 70 48 61 73 68 29 20 29 7b  canEof(pHash) ){
21670 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61  .      const cha
21680 72 20 2a 7a 54 65 72 6d 3b 20 20 20 20 20 20 20  r *zTerm;       
21690 20 20 20 2f 2a 20 42 75 66 66 65 72 20 63 6f 6e     /* Buffer con
216a0 74 61 69 6e 69 6e 67 20 74 65 72 6d 20 2a 2f 0a  taining term */.
216b0 20 20 20 20 20 20 63 6f 6e 73 74 20 75 38 20 2a        const u8 *
216c0 70 44 6f 63 6c 69 73 74 3b 20 20 20 20 20 20 20  pDoclist;       
216d0 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
216e0 64 6f 63 6c 69 73 74 20 66 6f 72 20 74 68 69 73  doclist for this
216f0 20 74 65 72 6d 20 2a 2f 0a 20 20 20 20 20 20 69   term */.      i
21700 6e 74 20 6e 44 6f 63 6c 69 73 74 3b 20 20 20 20  nt nDoclist;    
21710 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
21720 7a 65 20 6f 66 20 64 6f 63 6c 69 73 74 20 69 6e  ze of doclist in
21730 20 62 79 74 65 73 20 2a 2f 0a 0a 20 20 20 20 20   bytes */..     
21740 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 74 65   /* Write the te
21750 72 6d 20 66 6f 72 20 74 68 69 73 20 65 6e 74 72  rm for this entr
21760 79 20 74 6f 20 64 69 73 6b 2e 20 2a 2f 0a 20 20  y to disk. */.  
21770 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 48      sqlite3Fts5H
21780 61 73 68 53 63 61 6e 45 6e 74 72 79 28 70 48 61  ashScanEntry(pHa
21790 73 68 2c 20 26 7a 54 65 72 6d 2c 20 26 70 44 6f  sh, &zTerm, &pDo
217a0 63 6c 69 73 74 2c 20 26 6e 44 6f 63 6c 69 73 74  clist, &nDoclist
217b0 29 3b 0a 20 20 20 20 20 20 66 74 73 35 57 72 69  );.      fts5Wri
217c0 74 65 41 70 70 65 6e 64 54 65 72 6d 28 70 2c 20  teAppendTerm(p, 
217d0 26 77 72 69 74 65 72 2c 20 28 69 6e 74 29 73 74  &writer, (int)st
217e0 72 6c 65 6e 28 7a 54 65 72 6d 29 2c 20 28 63 6f  rlen(zTerm), (co
217f0 6e 73 74 20 75 38 2a 29 7a 54 65 72 6d 29 3b 0a  nst u8*)zTerm);.
21800 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 77  .      assert( w
21810 72 69 74 65 72 2e 62 46 69 72 73 74 52 6f 77 69  riter.bFirstRowi
21820 64 49 6e 50 61 67 65 3d 3d 30 20 29 3b 0a 20 20  dInPage==0 );.  
21830 20 20 20 20 69 66 28 20 70 67 73 7a 3e 3d 28 70      if( pgsz>=(p
21840 42 75 66 2d 3e 6e 20 2b 20 70 50 67 69 64 78 2d  Buf->n + pPgidx-
21850 3e 6e 20 2b 20 6e 44 6f 63 6c 69 73 74 20 2b 20  >n + nDoclist + 
21860 31 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  1) ){.        /*
21870 20 54 68 65 20 65 6e 74 69 72 65 20 64 6f 63 6c   The entire docl
21880 69 73 74 20 77 69 6c 6c 20 66 69 74 20 6f 6e 20  ist will fit on 
21890 74 68 65 20 63 75 72 72 65 6e 74 20 6c 65 61 66  the current leaf
218a0 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 66 74 73  . */.        fts
218b0 35 42 75 66 66 65 72 53 61 66 65 41 70 70 65 6e  5BufferSafeAppen
218c0 64 42 6c 6f 62 28 70 42 75 66 2c 20 70 44 6f 63  dBlob(pBuf, pDoc
218d0 6c 69 73 74 2c 20 6e 44 6f 63 6c 69 73 74 29 3b  list, nDoclist);
218e0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
218f0 20 20 20 20 20 20 69 36 34 20 69 52 6f 77 69 64        i64 iRowid
21900 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 69 36   = 0;.        i6
21910 34 20 69 44 65 6c 74 61 20 3d 20 30 3b 0a 20 20  4 iDelta = 0;.  
21920 20 20 20 20 20 20 69 6e 74 20 69 4f 66 66 20 3d        int iOff =
21930 20 30 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20   0;..        /* 
21940 54 68 65 20 65 6e 74 69 72 65 20 64 6f 63 6c 69  The entire docli
21950 73 74 20 77 69 6c 6c 20 6e 6f 74 20 66 69 74 20  st will not fit 
21960 6f 6e 20 74 68 69 73 20 6c 65 61 66 2e 20 54 68  on this leaf. Th
21970 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 0a 20 20 20  e following .   
21980 20 20 20 20 20 2a 2a 20 6c 6f 6f 70 20 69 74 65       ** loop ite
21990 72 61 74 65 73 20 74 68 72 6f 75 67 68 20 74 68  rates through th
219a0 65 20 70 6f 73 6c 69 73 74 73 20 74 68 61 74 20  e poslists that 
219b0 6d 61 6b 65 20 75 70 20 74 68 65 20 63 75 72 72  make up the curr
219c0 65 6e 74 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  ent .        ** 
219d0 64 6f 63 6c 69 73 74 2e 20 20 2a 2f 0a 20 20 20  doclist.  */.   
219e0 20 20 20 20 20 77 68 69 6c 65 28 20 70 2d 3e 72       while( p->r
219f0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
21a00 69 4f 66 66 3c 6e 44 6f 63 6c 69 73 74 20 29 7b  iOff<nDoclist ){
21a10 0a 20 20 20 20 20 20 20 20 20 20 69 4f 66 66 20  .          iOff 
21a20 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e 74  += fts5GetVarint
21a30 28 26 70 44 6f 63 6c 69 73 74 5b 69 4f 66 66 5d  (&pDoclist[iOff]
21a40 2c 20 28 75 36 34 2a 29 26 69 44 65 6c 74 61 29  , (u64*)&iDelta)
21a50 3b 0a 20 20 20 20 20 20 20 20 20 20 69 52 6f 77  ;.          iRow
21a60 69 64 20 2b 3d 20 69 44 65 6c 74 61 3b 0a 20 20  id += iDelta;.  
21a70 20 20 20 20 20 20 20 20 0a 20 20 20 20 20 20 20          .       
21a80 20 20 20 69 66 28 20 77 72 69 74 65 72 2e 62 46     if( writer.bF
21a90 69 72 73 74 52 6f 77 69 64 49 6e 50 61 67 65 20  irstRowidInPage 
21aa0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 66  ){.            f
21ab0 74 73 35 50 75 74 55 31 36 28 26 70 42 75 66 2d  ts5PutU16(&pBuf-
21ac0 3e 70 5b 30 5d 2c 20 28 75 31 36 29 70 42 75 66  >p[0], (u16)pBuf
21ad0 2d 3e 6e 29 3b 20 20 20 2f 2a 20 66 69 72 73 74  ->n);   /* first
21ae0 20 72 6f 77 69 64 20 6f 6e 20 70 61 67 65 20 2a   rowid on page *
21af0 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 42  /.            pB
21b00 75 66 2d 3e 6e 20 2b 3d 20 73 71 6c 69 74 65 33  uf->n += sqlite3
21b10 46 74 73 35 50 75 74 56 61 72 69 6e 74 28 26 70  Fts5PutVarint(&p
21b20 42 75 66 2d 3e 70 5b 70 42 75 66 2d 3e 6e 5d 2c  Buf->p[pBuf->n],
21b30 20 69 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20   iRowid);.      
21b40 20 20 20 20 20 20 77 72 69 74 65 72 2e 62 46 69        writer.bFi
21b50 72 73 74 52 6f 77 69 64 49 6e 50 61 67 65 20 3d  rstRowidInPage =
21b60 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   0;.            
21b70 66 74 73 35 57 72 69 74 65 44 6c 69 64 78 41 70  fts5WriteDlidxAp
21b80 70 65 6e 64 28 70 2c 20 26 77 72 69 74 65 72 2c  pend(p, &writer,
21b90 20 69 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20   iRowid);.      
21ba0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
21bb0 20 20 20 20 20 20 20 70 42 75 66 2d 3e 6e 20 2b         pBuf->n +
21bc0 3d 20 73 71 6c 69 74 65 33 46 74 73 35 50 75 74  = sqlite3Fts5Put
21bd0 56 61 72 69 6e 74 28 26 70 42 75 66 2d 3e 70 5b  Varint(&pBuf->p[
21be0 70 42 75 66 2d 3e 6e 5d 2c 20 69 44 65 6c 74 61  pBuf->n], iDelta
21bf0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
21c00 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
21c10 20 70 42 75 66 2d 3e 6e 3c 3d 70 42 75 66 2d 3e   pBuf->n<=pBuf->
21c20 6e 53 70 61 63 65 20 29 3b 0a 0a 20 20 20 20 20  nSpace );..     
21c30 20 20 20 20 20 69 66 28 20 65 44 65 74 61 69 6c       if( eDetail
21c40 3d 3d 46 54 53 35 5f 44 45 54 41 49 4c 5f 4e 4f  ==FTS5_DETAIL_NO
21c50 4e 45 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  NE ){.          
21c60 20 20 69 66 28 20 69 4f 66 66 3c 6e 44 6f 63 6c    if( iOff<nDocl
21c70 69 73 74 20 26 26 20 70 44 6f 63 6c 69 73 74 5b  ist && pDoclist[
21c80 69 4f 66 66 5d 3d 3d 30 20 29 7b 0a 20 20 20 20  iOff]==0 ){.    
21c90 20 20 20 20 20 20 20 20 20 20 70 42 75 66 2d 3e            pBuf->
21ca0 70 5b 70 42 75 66 2d 3e 6e 2b 2b 5d 20 3d 20 30  p[pBuf->n++] = 0
21cb0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
21cc0 69 4f 66 66 2b 2b 3b 0a 20 20 20 20 20 20 20 20  iOff++;.        
21cd0 20 20 20 20 20 20 69 66 28 20 69 4f 66 66 3c 6e        if( iOff<n
21ce0 44 6f 63 6c 69 73 74 20 26 26 20 70 44 6f 63 6c  Doclist && pDocl
21cf0 69 73 74 5b 69 4f 66 66 5d 3d 3d 30 20 29 7b 0a  ist[iOff]==0 ){.
21d00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21d10 70 42 75 66 2d 3e 70 5b 70 42 75 66 2d 3e 6e 2b  pBuf->p[pBuf->n+
21d20 2b 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  +] = 0;.        
21d30 20 20 20 20 20 20 20 20 69 4f 66 66 2b 2b 3b 0a          iOff++;.
21d40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a                }.
21d50 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
21d60 20 20 20 20 20 20 20 20 20 20 69 66 28 20 28 70            if( (p
21d70 42 75 66 2d 3e 6e 20 2b 20 70 50 67 69 64 78 2d  Buf->n + pPgidx-
21d80 3e 6e 29 3e 3d 70 67 73 7a 20 29 7b 0a 20 20 20  >n)>=pgsz ){.   
21d90 20 20 20 20 20 20 20 20 20 20 20 66 74 73 35 57             fts5W
21da0 72 69 74 65 46 6c 75 73 68 4c 65 61 66 28 70 2c  riteFlushLeaf(p,
21db0 20 26 77 72 69 74 65 72 29 3b 0a 20 20 20 20 20   &writer);.     
21dc0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
21dd0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
21de0 20 20 20 20 20 20 69 6e 74 20 62 44 75 6d 6d 79        int bDummy
21df0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 6e  ;.            in
21e00 74 20 6e 50 6f 73 3b 0a 20 20 20 20 20 20 20 20  t nPos;.        
21e10 20 20 20 20 69 6e 74 20 6e 43 6f 70 79 20 3d 20      int nCopy = 
21e20 66 74 73 35 47 65 74 50 6f 73 6c 69 73 74 53 69  fts5GetPoslistSi
21e30 7a 65 28 26 70 44 6f 63 6c 69 73 74 5b 69 4f 66  ze(&pDoclist[iOf
21e40 66 5d 2c 20 26 6e 50 6f 73 2c 20 26 62 44 75 6d  f], &nPos, &bDum
21e50 6d 79 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  my);.           
21e60 20 6e 43 6f 70 79 20 2b 3d 20 6e 50 6f 73 3b 0a   nCopy += nPos;.
21e70 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
21e80 28 70 42 75 66 2d 3e 6e 20 2b 20 70 50 67 69 64  (pBuf->n + pPgid
21e90 78 2d 3e 6e 20 2b 20 6e 43 6f 70 79 29 20 3c 3d  x->n + nCopy) <=
21ea0 20 70 67 73 7a 20 29 7b 0a 20 20 20 20 20 20 20   pgsz ){.       
21eb0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 65 6e         /* The en
21ec0 74 69 72 65 20 70 6f 73 6c 69 73 74 20 77 69 6c  tire poslist wil
21ed0 6c 20 66 69 74 20 6f 6e 20 74 68 65 20 63 75 72  l fit on the cur
21ee0 72 65 6e 74 20 6c 65 61 66 2e 20 53 6f 20 63 6f  rent leaf. So co
21ef0 70 79 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  py.             
21f00 20 2a 2a 20 69 74 20 69 6e 20 6f 6e 65 20 67 6f   ** it in one go
21f10 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20  . */.           
21f20 20 20 20 66 74 73 35 42 75 66 66 65 72 53 61 66     fts5BufferSaf
21f30 65 41 70 70 65 6e 64 42 6c 6f 62 28 70 42 75 66  eAppendBlob(pBuf
21f40 2c 20 26 70 44 6f 63 6c 69 73 74 5b 69 4f 66 66  , &pDoclist[iOff
21f50 5d 2c 20 6e 43 6f 70 79 29 3b 0a 20 20 20 20 20  ], nCopy);.     
21f60 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
21f70 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
21f80 68 65 20 65 6e 74 69 72 65 20 70 6f 73 6c 69 73  he entire poslis
21f90 74 20 77 69 6c 6c 20 6e 6f 74 20 66 69 74 20 6f  t will not fit o
21fa0 6e 20 74 68 69 73 20 6c 65 61 66 2e 20 53 6f 20  n this leaf. So 
21fb0 69 74 20 6e 65 65 64 73 0a 20 20 20 20 20 20 20  it needs.       
21fc0 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 62 65 20         ** to be 
21fd0 62 72 6f 6b 65 6e 20 69 6e 74 6f 20 73 65 63 74  broken into sect
21fe0 69 6f 6e 73 2e 20 54 68 65 20 6f 6e 6c 79 20 71  ions. The only q
21ff0 75 61 6c 69 66 69 63 61 74 69 6f 6e 20 62 65 69  ualification bei
22000 6e 67 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ng.             
22010 20 2a 2a 20 74 68 61 74 20 65 61 63 68 20 76 61   ** that each va
22020 72 69 6e 74 20 6d 75 73 74 20 62 65 20 73 74 6f  rint must be sto
22030 72 65 64 20 63 6f 6e 74 69 67 75 6f 75 73 6c 79  red contiguously
22040 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  .  */.          
22050 20 20 20 20 63 6f 6e 73 74 20 75 38 20 2a 70 50      const u8 *pP
22060 6f 73 6c 69 73 74 20 3d 20 26 70 44 6f 63 6c 69  oslist = &pDocli
22070 73 74 5b 69 4f 66 66 5d 3b 0a 20 20 20 20 20 20  st[iOff];.      
22080 20 20 20 20 20 20 20 20 69 6e 74 20 69 50 6f 73          int iPos
22090 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
220a0 20 20 20 20 77 68 69 6c 65 28 20 70 2d 3e 72 63      while( p->rc
220b0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
220c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
220d0 6e 74 20 6e 53 70 61 63 65 20 3d 20 70 67 73 7a  nt nSpace = pgsz
220e0 20 2d 20 70 42 75 66 2d 3e 6e 20 2d 20 70 50 67   - pBuf->n - pPg
220f0 69 64 78 2d 3e 6e 3b 0a 20 20 20 20 20 20 20 20  idx->n;.        
22100 20 20 20 20 20 20 20 20 69 6e 74 20 6e 20 3d 20          int n = 
22110 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  0;.             
22120 20 20 20 69 66 28 20 28 6e 43 6f 70 79 20 2d 20     if( (nCopy - 
22130 69 50 6f 73 29 3c 3d 6e 53 70 61 63 65 20 29 7b  iPos)<=nSpace ){
22140 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
22150 20 20 20 6e 20 3d 20 6e 43 6f 70 79 20 2d 20 69     n = nCopy - i
22160 50 6f 73 3b 0a 20 20 20 20 20 20 20 20 20 20 20  Pos;.           
22170 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
22180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6e 20                n 
22190 3d 20 66 74 73 35 50 6f 73 6c 69 73 74 50 72 65  = fts5PoslistPre
221a0 66 69 78 28 26 70 50 6f 73 6c 69 73 74 5b 69 50  fix(&pPoslist[iP
221b0 6f 73 5d 2c 20 6e 53 70 61 63 65 29 3b 0a 20 20  os], nSpace);.  
221c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a                }.
221d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
221e0 61 73 73 65 72 74 28 20 6e 3e 30 20 29 3b 0a 20  assert( n>0 );. 
221f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66                 f
22200 74 73 35 42 75 66 66 65 72 53 61 66 65 41 70 70  ts5BufferSafeApp
22210 65 6e 64 42 6c 6f 62 28 70 42 75 66 2c 20 26 70  endBlob(pBuf, &p
22220 50 6f 73 6c 69 73 74 5b 69 50 6f 73 5d 2c 20 6e  Poslist[iPos], n
22230 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
22240 20 20 20 69 50 6f 73 20 2b 3d 20 6e 3b 0a 20 20     iPos += n;.  
22250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
22260 28 20 28 70 42 75 66 2d 3e 6e 20 2b 20 70 50 67  ( (pBuf->n + pPg
22270 69 64 78 2d 3e 6e 29 3e 3d 70 67 73 7a 20 29 7b  idx->n)>=pgsz ){
22280 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
22290 20 20 20 66 74 73 35 57 72 69 74 65 46 6c 75 73     fts5WriteFlus
222a0 68 4c 65 61 66 28 70 2c 20 26 77 72 69 74 65 72  hLeaf(p, &writer
222b0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
222c0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
222d0 20 20 20 20 20 69 66 28 20 69 50 6f 73 3e 3d 6e       if( iPos>=n
222e0 43 6f 70 79 20 29 20 62 72 65 61 6b 3b 0a 20 20  Copy ) break;.  
222f0 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
22300 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
22310 20 20 20 20 20 20 20 20 69 4f 66 66 20 2b 3d 20          iOff += 
22320 6e 43 6f 70 79 3b 0a 20 20 20 20 20 20 20 20 20  nCopy;.         
22330 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
22340 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 54     }..      /* T
22350 4f 44 4f 32 3a 20 44 6f 63 6c 69 73 74 20 74 65  ODO2: Doclist te
22360 72 6d 69 6e 61 74 6f 72 20 77 72 69 74 74 65 6e  rminator written
22370 20 68 65 72 65 2e 20 2a 2f 0a 20 20 20 20 20 20   here. */.      
22380 2f 2a 20 70 42 75 66 2d 3e 70 5b 70 42 75 66 2d  /* pBuf->p[pBuf-
22390 3e 6e 2b 2b 5d 20 3d 20 27 5c 30 27 3b 20 2a 2f  >n++] = '\0'; */
223a0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
223b0 42 75 66 2d 3e 6e 3c 3d 70 42 75 66 2d 3e 6e 53  Buf->n<=pBuf->nS
223c0 70 61 63 65 20 29 3b 0a 20 20 20 20 20 20 73 71  pace );.      sq
223d0 6c 69 74 65 33 46 74 73 35 48 61 73 68 53 63 61  lite3Fts5HashSca
223e0 6e 4e 65 78 74 28 70 48 61 73 68 29 3b 0a 20 20  nNext(pHash);.  
223f0 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 46    }.    sqlite3F
22400 74 73 35 48 61 73 68 43 6c 65 61 72 28 70 48 61  ts5HashClear(pHa
22410 73 68 29 3b 0a 20 20 20 20 66 74 73 35 57 72 69  sh);.    fts5Wri
22420 74 65 46 69 6e 69 73 68 28 70 2c 20 26 77 72 69  teFinish(p, &wri
22430 74 65 72 2c 20 26 70 67 6e 6f 4c 61 73 74 29 3b  ter, &pgnoLast);
22440 0a 0a 20 20 20 20 2f 2a 20 55 70 64 61 74 65 20  ..    /* Update 
22450 74 68 65 20 46 74 73 35 53 74 72 75 63 74 75 72  the Fts5Structur
22460 65 2e 20 49 74 20 69 73 20 77 72 69 74 74 65 6e  e. It is written
22470 20 62 61 63 6b 20 74 6f 20 74 68 65 20 64 61 74   back to the dat
22480 61 62 61 73 65 20 62 79 20 74 68 65 0a 20 20 20  abase by the.   
22490 20 2a 2a 20 66 74 73 35 53 74 72 75 63 74 75 72   ** fts5Structur
224a0 65 52 65 6c 65 61 73 65 28 29 20 63 61 6c 6c 20  eRelease() call 
224b0 62 65 6c 6f 77 2e 20 20 2a 2f 0a 20 20 20 20 69  below.  */.    i
224c0 66 28 20 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76  f( pStruct->nLev
224d0 65 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 66  el==0 ){.      f
224e0 74 73 35 53 74 72 75 63 74 75 72 65 41 64 64 4c  ts5StructureAddL
224f0 65 76 65 6c 28 26 70 2d 3e 72 63 2c 20 26 70 53  evel(&p->rc, &pS
22500 74 72 75 63 74 29 3b 0a 20 20 20 20 7d 0a 20 20  truct);.    }.  
22510 20 20 66 74 73 35 53 74 72 75 63 74 75 72 65 45    fts5StructureE
22520 78 74 65 6e 64 4c 65 76 65 6c 28 26 70 2d 3e 72  xtendLevel(&p->r
22530 63 2c 20 70 53 74 72 75 63 74 2c 20 30 2c 20 31  c, pStruct, 0, 1
22540 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 70 2d  , 0);.    if( p-
22550 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  >rc==SQLITE_OK )
22560 7b 0a 20 20 20 20 20 20 70 53 65 67 20 3d 20 26  {.      pSeg = &
22570 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b  pStruct->aLevel[
22580 30 5d 2e 61 53 65 67 5b 20 70 53 74 72 75 63 74  0].aSeg[ pStruct
22590 2d 3e 61 4c 65 76 65 6c 5b 30 5d 2e 6e 53 65 67  ->aLevel[0].nSeg
225a0 2b 2b 20 5d 3b 0a 20 20 20 20 20 20 70 53 65 67  ++ ];.      pSeg
225b0 2d 3e 69 53 65 67 69 64 20 3d 20 69 53 65 67 69  ->iSegid = iSegi
225c0 64 3b 0a 20 20 20 20 20 20 70 53 65 67 2d 3e 70  d;.      pSeg->p
225d0 67 6e 6f 46 69 72 73 74 20 3d 20 31 3b 0a 20 20  gnoFirst = 1;.  
225e0 20 20 20 20 70 53 65 67 2d 3e 70 67 6e 6f 4c 61      pSeg->pgnoLa
225f0 73 74 20 3d 20 70 67 6e 6f 4c 61 73 74 3b 0a 20  st = pgnoLast;. 
22600 20 20 20 20 20 70 53 74 72 75 63 74 2d 3e 6e 53       pStruct->nS
22610 65 67 6d 65 6e 74 2b 2b 3b 0a 20 20 20 20 7d 0a  egment++;.    }.
22620 20 20 20 20 66 74 73 35 53 74 72 75 63 74 75 72      fts5Structur
22630 65 50 72 6f 6d 6f 74 65 28 70 2c 20 30 2c 20 70  ePromote(p, 0, p
22640 53 74 72 75 63 74 29 3b 0a 20 20 7d 0a 0a 20 20  Struct);.  }..  
22650 66 74 73 35 49 6e 64 65 78 41 75 74 6f 6d 65 72  fts5IndexAutomer
22660 67 65 28 70 2c 20 26 70 53 74 72 75 63 74 2c 20  ge(p, &pStruct, 
22670 70 67 6e 6f 4c 61 73 74 29 3b 0a 20 20 66 74 73  pgnoLast);.  fts
22680 35 49 6e 64 65 78 43 72 69 73 69 73 6d 65 72 67  5IndexCrisismerg
22690 65 28 70 2c 20 26 70 53 74 72 75 63 74 29 3b 0a  e(p, &pStruct);.
226a0 20 20 66 74 73 35 53 74 72 75 63 74 75 72 65 57    fts5StructureW
226b0 72 69 74 65 28 70 2c 20 70 53 74 72 75 63 74 29  rite(p, pStruct)
226c0 3b 0a 20 20 66 74 73 35 53 74 72 75 63 74 75 72  ;.  fts5Structur
226d0 65 52 65 6c 65 61 73 65 28 70 53 74 72 75 63 74  eRelease(pStruct
226e0 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 6c 75 73  );.}../*.** Flus
226f0 68 20 61 6e 79 20 64 61 74 61 20 73 74 6f 72 65  h any data store
22700 64 20 69 6e 20 74 68 65 20 69 6e 2d 6d 65 6d 6f  d in the in-memo
22710 72 79 20 68 61 73 68 20 74 61 62 6c 65 73 20 74  ry hash tables t
22720 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a  o the database..
22730 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
22740 74 73 35 49 6e 64 65 78 46 6c 75 73 68 28 46 74  ts5IndexFlush(Ft
22750 73 35 49 6e 64 65 78 20 2a 70 29 7b 0a 20 20 2f  s5Index *p){.  /
22760 2a 20 55 6e 6c 65 73 73 20 69 74 20 69 73 20 65  * Unless it is e
22770 6d 70 74 79 2c 20 66 6c 75 73 68 20 74 68 65 20  mpty, flush the 
22780 68 61 73 68 20 74 61 62 6c 65 20 74 6f 20 64 69  hash table to di
22790 73 6b 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 6e  sk */.  if( p->n
227a0 50 65 6e 64 69 6e 67 44 61 74 61 20 29 7b 0a 20  PendingData ){. 
227b0 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 48     assert( p->pH
227c0 61 73 68 20 29 3b 0a 20 20 20 20 70 2d 3e 6e 50  ash );.    p->nP
227d0 65 6e 64 69 6e 67 44 61 74 61 20 3d 20 30 3b 0a  endingData = 0;.
227e0 20 20 20 20 66 74 73 35 46 6c 75 73 68 4f 6e 65      fts5FlushOne
227f0 48 61 73 68 28 70 29 3b 0a 20 20 7d 0a 7d 0a 0a  Hash(p);.  }.}..
22800 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35  .int sqlite3Fts5
22810 49 6e 64 65 78 4f 70 74 69 6d 69 7a 65 28 46 74  IndexOptimize(Ft
22820 73 35 49 6e 64 65 78 20 2a 70 29 7b 0a 20 20 46  s5Index *p){.  F
22830 74 73 35 53 74 72 75 63 74 75 72 65 20 2a 70 53  ts5Structure *pS
22840 74 72 75 63 74 3b 0a 20 20 46 74 73 35 53 74 72  truct;.  Fts5Str
22850 75 63 74 75 72 65 20 2a 70 4e 65 77 20 3d 20 30  ucture *pNew = 0
22860 3b 0a 20 20 69 6e 74 20 6e 53 65 67 20 3d 20 30  ;.  int nSeg = 0
22870 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  ;..  assert( p->
22880 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  rc==SQLITE_OK );
22890 0a 20 20 66 74 73 35 49 6e 64 65 78 46 6c 75 73  .  fts5IndexFlus
228a0 68 28 70 29 3b 0a 20 20 70 53 74 72 75 63 74 20  h(p);.  pStruct 
228b0 3d 20 66 74 73 35 53 74 72 75 63 74 75 72 65 52  = fts5StructureR
228c0 65 61 64 28 70 29 3b 0a 0a 20 20 69 66 28 20 70  ead(p);..  if( p
228d0 53 74 72 75 63 74 20 29 7b 0a 20 20 20 20 61 73  Struct ){.    as
228e0 73 65 72 74 28 20 70 53 74 72 75 63 74 2d 3e 6e  sert( pStruct->n
228f0 53 65 67 6d 65 6e 74 3d 3d 66 74 73 35 53 74 72  Segment==fts5Str
22900 75 63 74 75 72 65 43 6f 75 6e 74 53 65 67 6d 65  uctureCountSegme
22910 6e 74 73 28 70 53 74 72 75 63 74 29 20 29 3b 0a  nts(pStruct) );.
22920 20 20 20 20 6e 53 65 67 20 3d 20 70 53 74 72 75      nSeg = pStru
22930 63 74 2d 3e 6e 53 65 67 6d 65 6e 74 3b 0a 20 20  ct->nSegment;.  
22940 20 20 69 66 28 20 6e 53 65 67 3e 31 20 29 7b 0a    if( nSeg>1 ){.
22950 20 20 20 20 20 20 69 6e 74 20 6e 42 79 74 65 20        int nByte 
22960 3d 20 73 69 7a 65 6f 66 28 46 74 73 35 53 74 72  = sizeof(Fts5Str
22970 75 63 74 75 72 65 29 3b 0a 20 20 20 20 20 20 6e  ucture);.      n
22980 42 79 74 65 20 2b 3d 20 28 70 53 74 72 75 63 74  Byte += (pStruct
22990 2d 3e 6e 4c 65 76 65 6c 2b 31 29 20 2a 20 73 69  ->nLevel+1) * si
229a0 7a 65 6f 66 28 46 74 73 35 53 74 72 75 63 74 75  zeof(Fts5Structu
229b0 72 65 4c 65 76 65 6c 29 3b 0a 20 20 20 20 20 20  reLevel);.      
229c0 70 4e 65 77 20 3d 20 28 46 74 73 35 53 74 72 75  pNew = (Fts5Stru
229d0 63 74 75 72 65 2a 29 73 71 6c 69 74 65 33 46 74  cture*)sqlite3Ft
229e0 73 35 4d 61 6c 6c 6f 63 5a 65 72 6f 28 26 70 2d  s5MallocZero(&p-
229f0 3e 72 63 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20  >rc, nByte);.   
22a00 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 4e 65   }.  }.  if( pNe
22a10 77 20 29 7b 0a 20 20 20 20 46 74 73 35 53 74 72  w ){.    Fts5Str
22a20 75 63 74 75 72 65 4c 65 76 65 6c 20 2a 70 4c 76  uctureLevel *pLv
22a30 6c 3b 0a 20 20 20 20 69 6e 74 20 6e 42 79 74 65  l;.    int nByte
22a40 20 3d 20 6e 53 65 67 20 2a 20 73 69 7a 65 6f 66   = nSeg * sizeof
22a50 28 46 74 73 35 53 74 72 75 63 74 75 72 65 53 65  (Fts5StructureSe
22a60 67 6d 65 6e 74 29 3b 0a 20 20 20 20 70 4e 65 77  gment);.    pNew
22a70 2d 3e 6e 4c 65 76 65 6c 20 3d 20 70 53 74 72 75  ->nLevel = pStru
22a80 63 74 2d 3e 6e 4c 65 76 65 6c 2b 31 3b 0a 20 20  ct->nLevel+1;.  
22a90 20 20 70 4e 65 77 2d 3e 6e 52 65 66 20 3d 20 31    pNew->nRef = 1
22aa0 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 57 72 69  ;.    pNew->nWri
22ab0 74 65 43 6f 75 6e 74 65 72 20 3d 20 70 53 74 72  teCounter = pStr
22ac0 75 63 74 2d 3e 6e 57 72 69 74 65 43 6f 75 6e 74  uct->nWriteCount
22ad0 65 72 3b 0a 20 20 20 20 70 4c 76 6c 20 3d 20 26  er;.    pLvl = &
22ae0 70 4e 65 77 2d 3e 61 4c 65 76 65 6c 5b 70 53 74  pNew->aLevel[pSt
22af0 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 5d 3b 0a 20  ruct->nLevel];. 
22b00 20 20 20 70 4c 76 6c 2d 3e 61 53 65 67 20 3d 20     pLvl->aSeg = 
22b10 28 46 74 73 35 53 74 72 75 63 74 75 72 65 53 65  (Fts5StructureSe
22b20 67 6d 65 6e 74 2a 29 73 71 6c 69 74 65 33 46 74  gment*)sqlite3Ft
22b30 73 35 4d 61 6c 6c 6f 63 5a 65 72 6f 28 26 70 2d  s5MallocZero(&p-
22b40 3e 72 63 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20  >rc, nByte);.   
22b50 20 69 66 28 20 70 4c 76 6c 2d 3e 61 53 65 67 20   if( pLvl->aSeg 
22b60 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 4c 76  ){.      int iLv
22b70 6c 2c 20 69 53 65 67 3b 0a 20 20 20 20 20 20 69  l, iSeg;.      i
22b80 6e 74 20 69 53 65 67 4f 75 74 20 3d 20 30 3b 0a  nt iSegOut = 0;.
22b90 20 20 20 20 20 20 66 6f 72 28 69 4c 76 6c 3d 30        for(iLvl=0
22ba0 3b 20 69 4c 76 6c 3c 70 53 74 72 75 63 74 2d 3e  ; iLvl<pStruct->
22bb0 6e 4c 65 76 65 6c 3b 20 69 4c 76 6c 2b 2b 29 7b  nLevel; iLvl++){
22bc0 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 53 65  .        for(iSe
22bd0 67 3d 30 3b 20 69 53 65 67 3c 70 53 74 72 75 63  g=0; iSeg<pStruc
22be0 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d 2e  t->aLevel[iLvl].
22bf0 6e 53 65 67 3b 20 69 53 65 67 2b 2b 29 7b 0a 20  nSeg; iSeg++){. 
22c00 20 20 20 20 20 20 20 20 20 70 4c 76 6c 2d 3e 61           pLvl->a
22c10 53 65 67 5b 69 53 65 67 4f 75 74 5d 20 3d 20 70  Seg[iSegOut] = p
22c20 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69  Struct->aLevel[i
22c30 4c 76 6c 5d 2e 61 53 65 67 5b 69 53 65 67 5d 3b  Lvl].aSeg[iSeg];
22c40 0a 20 20 20 20 20 20 20 20 20 20 69 53 65 67 4f  .          iSegO
22c50 75 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  ut++;.        }.
22c60 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 4e        }.      pN
22c70 65 77 2d 3e 6e 53 65 67 6d 65 6e 74 20 3d 20 70  ew->nSegment = p
22c80 4c 76 6c 2d 3e 6e 53 65 67 20 3d 20 6e 53 65 67  Lvl->nSeg = nSeg
22c90 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
22ca0 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
22cb0 70 4e 65 77 29 3b 0a 20 20 20 20 20 20 70 4e 65  pNew);.      pNe
22cc0 77 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d  w = 0;.    }.  }
22cd0 0a 0a 20 20 69 66 28 20 70 4e 65 77 20 29 7b 0a  ..  if( pNew ){.
22ce0 20 20 20 20 69 6e 74 20 69 4c 76 6c 20 3d 20 70      int iLvl = p
22cf0 4e 65 77 2d 3e 6e 4c 65 76 65 6c 2d 31 3b 0a 20  New->nLevel-1;. 
22d00 20 20 20 77 68 69 6c 65 28 20 70 2d 3e 72 63 3d     while( p->rc=
22d10 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 4e  =SQLITE_OK && pN
22d20 65 77 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d  ew->aLevel[iLvl]
22d30 2e 6e 53 65 67 3e 30 20 29 7b 0a 20 20 20 20 20  .nSeg>0 ){.     
22d40 20 69 6e 74 20 6e 52 65 6d 20 3d 20 46 54 53 35   int nRem = FTS5
22d50 5f 4f 50 54 5f 57 4f 52 4b 5f 55 4e 49 54 3b 0a  _OPT_WORK_UNIT;.
22d60 20 20 20 20 20 20 66 74 73 35 49 6e 64 65 78 4d        fts5IndexM
22d70 65 72 67 65 4c 65 76 65 6c 28 70 2c 20 26 70 4e  ergeLevel(p, &pN
22d80 65 77 2c 20 69 4c 76 6c 2c 20 26 6e 52 65 6d 29  ew, iLvl, &nRem)
22d90 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 66 74 73  ;.    }..    fts
22da0 35 53 74 72 75 63 74 75 72 65 57 72 69 74 65 28  5StructureWrite(
22db0 70 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20 66 74  p, pNew);.    ft
22dc0 73 35 53 74 72 75 63 74 75 72 65 52 65 6c 65 61  s5StructureRelea
22dd0 73 65 28 70 4e 65 77 29 3b 0a 20 20 7d 0a 0a 20  se(pNew);.  }.. 
22de0 20 66 74 73 35 53 74 72 75 63 74 75 72 65 52 65   fts5StructureRe
22df0 6c 65 61 73 65 28 70 53 74 72 75 63 74 29 3b 0a  lease(pStruct);.
22e00 20 20 72 65 74 75 72 6e 20 66 74 73 35 49 6e 64    return fts5Ind
22e10 65 78 52 65 74 75 72 6e 28 70 29 3b 20 0a 7d 0a  exReturn(p); .}.
22e20 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35  .int sqlite3Fts5
22e30 49 6e 64 65 78 4d 65 72 67 65 28 46 74 73 35 49  IndexMerge(Fts5I
22e40 6e 64 65 78 20 2a 70 2c 20 69 6e 74 20 6e 4d 65  ndex *p, int nMe
22e50 72 67 65 29 7b 0a 20 20 46 74 73 35 53 74 72 75  rge){.  Fts5Stru
22e60 63 74 75 72 65 20 2a 70 53 74 72 75 63 74 3b 0a  cture *pStruct;.
22e70 0a 20 20 70 53 74 72 75 63 74 20 3d 20 66 74 73  .  pStruct = fts
22e80 35 53 74 72 75 63 74 75 72 65 52 65 61 64 28 70  5StructureRead(p
22e90 29 3b 0a 20 20 69 66 28 20 70 53 74 72 75 63 74  );.  if( pStruct
22ea0 20 26 26 20 70 53 74 72 75 63 74 2d 3e 6e 4c 65   && pStruct->nLe
22eb0 76 65 6c 20 29 7b 0a 20 20 20 20 66 74 73 35 49  vel ){.    fts5I
22ec0 6e 64 65 78 4d 65 72 67 65 28 70 2c 20 26 70 53  ndexMerge(p, &pS
22ed0 74 72 75 63 74 2c 20 6e 4d 65 72 67 65 29 3b 0a  truct, nMerge);.
22ee0 20 20 20 20 66 74 73 35 53 74 72 75 63 74 75 72      fts5Structur
22ef0 65 57 72 69 74 65 28 70 2c 20 70 53 74 72 75 63  eWrite(p, pStruc
22f00 74 29 3b 0a 20 20 7d 0a 20 20 66 74 73 35 53 74  t);.  }.  fts5St
22f10 72 75 63 74 75 72 65 52 65 6c 65 61 73 65 28 70  ructureRelease(p
22f20 53 74 72 75 63 74 29 3b 0a 0a 20 20 72 65 74 75  Struct);..  retu
22f30 72 6e 20 66 74 73 35 49 6e 64 65 78 52 65 74 75  rn fts5IndexRetu
22f40 72 6e 28 70 29 3b 0a 7d 0a 0a 73 74 61 74 69 63  rn(p);.}..static
22f50 20 76 6f 69 64 20 66 74 73 35 41 70 70 65 6e 64   void fts5Append
22f60 52 6f 77 69 64 28 0a 20 20 46 74 73 35 49 6e 64  Rowid(.  Fts5Ind
22f70 65 78 20 2a 70 2c 0a 20 20 69 36 34 20 69 44 65  ex *p,.  i64 iDe
22f80 6c 74 61 2c 0a 20 20 46 74 73 35 49 74 65 72 20  lta,.  Fts5Iter 
22f90 2a 70 55 6e 75 73 65 64 2c 0a 20 20 46 74 73 35  *pUnused,.  Fts5
22fa0 42 75 66 66 65 72 20 2a 70 42 75 66 0a 29 7b 0a  Buffer *pBuf.){.
22fb0 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 28 70    UNUSED_PARAM(p
22fc0 55 6e 75 73 65 64 29 3b 0a 20 20 66 74 73 35 42  Unused);.  fts5B
22fd0 75 66 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e  ufferAppendVarin
22fe0 74 28 26 70 2d 3e 72 63 2c 20 70 42 75 66 2c 20  t(&p->rc, pBuf, 
22ff0 69 44 65 6c 74 61 29 3b 0a 7d 0a 0a 73 74 61 74  iDelta);.}..stat
23000 69 63 20 76 6f 69 64 20 66 74 73 35 41 70 70 65  ic void fts5Appe
23010 6e 64 50 6f 73 6c 69 73 74 28 0a 20 20 46 74 73  ndPoslist(.  Fts
23020 35 49 6e 64 65 78 20 2a 70 2c 0a 20 20 69 36 34  5Index *p,.  i64
23030 20 69 44 65 6c 74 61 2c 0a 20 20 46 74 73 35 49   iDelta,.  Fts5I
23040 74 65 72 20 2a 70 4d 75 6c 74 69 2c 0a 20 20 46  ter *pMulti,.  F
23050 74 73 35 42 75 66 66 65 72 20 2a 70 42 75 66 0a  ts5Buffer *pBuf.
23060 29 7b 0a 20 20 69 6e 74 20 6e 44 61 74 61 20 3d  ){.  int nData =
23070 20 70 4d 75 6c 74 69 2d 3e 62 61 73 65 2e 6e 44   pMulti->base.nD
23080 61 74 61 3b 0a 20 20 61 73 73 65 72 74 28 20 6e  ata;.  assert( n
23090 44 61 74 61 3e 30 20 29 3b 0a 20 20 69 66 28 20  Data>0 );.  if( 
230a0 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
230b0 20 26 26 20 30 3d 3d 66 74 73 35 42 75 66 66 65   && 0==fts5Buffe
230c0 72 47 72 6f 77 28 26 70 2d 3e 72 63 2c 20 70 42  rGrow(&p->rc, pB
230d0 75 66 2c 20 6e 44 61 74 61 2b 39 2b 39 29 20 29  uf, nData+9+9) )
230e0 7b 0a 20 20 20 20 66 74 73 35 42 75 66 66 65 72  {.    fts5Buffer
230f0 53 61 66 65 41 70 70 65 6e 64 56 61 72 69 6e 74  SafeAppendVarint
23100 28 70 42 75 66 2c 20 69 44 65 6c 74 61 29 3b 0a  (pBuf, iDelta);.
23110 20 20 20 20 66 74 73 35 42 75 66 66 65 72 53 61      fts5BufferSa
23120 66 65 41 70 70 65 6e 64 56 61 72 69 6e 74 28 70  feAppendVarint(p
23130 42 75 66 2c 20 6e 44 61 74 61 2a 32 29 3b 0a 20  Buf, nData*2);. 
23140 20 20 20 66 74 73 35 42 75 66 66 65 72 53 61 66     fts5BufferSaf
23150 65 41 70 70 65 6e 64 42 6c 6f 62 28 70 42 75 66  eAppendBlob(pBuf
23160 2c 20 70 4d 75 6c 74 69 2d 3e 62 61 73 65 2e 70  , pMulti->base.p
23170 44 61 74 61 2c 20 6e 44 61 74 61 29 3b 0a 20 20  Data, nData);.  
23180 7d 0a 7d 0a 0a 0a 73 74 61 74 69 63 20 76 6f 69  }.}...static voi
23190 64 20 66 74 73 35 44 6f 63 6c 69 73 74 49 74 65  d fts5DoclistIte
231a0 72 4e 65 78 74 28 46 74 73 35 44 6f 63 6c 69 73  rNext(Fts5Doclis
231b0 74 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a 20  tIter *pIter){. 
231c0 20 75 38 20 2a 70 20 3d 20 70 49 74 65 72 2d 3e   u8 *p = pIter->
231d0 61 50 6f 73 6c 69 73 74 20 2b 20 70 49 74 65 72  aPoslist + pIter
231e0 2d 3e 6e 53 69 7a 65 20 2b 20 70 49 74 65 72 2d  ->nSize + pIter-
231f0 3e 6e 50 6f 73 6c 69 73 74 3b 0a 0a 20 20 61 73  >nPoslist;..  as
23200 73 65 72 74 28 20 70 49 74 65 72 2d 3e 61 50 6f  sert( pIter->aPo
23210 73 6c 69 73 74 20 29 3b 0a 20 20 69 66 28 20 70  slist );.  if( p
23220 3e 3d 70 49 74 65 72 2d 3e 61 45 6f 66 20 29 7b  >=pIter->aEof ){
23230 0a 20 20 20 20 70 49 74 65 72 2d 3e 61 50 6f 73  .    pIter->aPos
23240 6c 69 73 74 20 3d 20 30 3b 0a 20 20 7d 65 6c 73  list = 0;.  }els
23250 65 7b 0a 20 20 20 20 69 36 34 20 69 44 65 6c 74  e{.    i64 iDelt
23260 61 3b 0a 0a 20 20 20 20 70 20 2b 3d 20 66 74 73  a;..    p += fts
23270 35 47 65 74 56 61 72 69 6e 74 28 70 2c 20 28 75  5GetVarint(p, (u
23280 36 34 2a 29 26 69 44 65 6c 74 61 29 3b 0a 20 20  64*)&iDelta);.  
23290 20 20 70 49 74 65 72 2d 3e 69 52 6f 77 69 64 20    pIter->iRowid 
232a0 2b 3d 20 69 44 65 6c 74 61 3b 0a 0a 20 20 20 20  += iDelta;..    
232b0 2f 2a 20 52 65 61 64 20 70 6f 73 69 74 69 6f 6e  /* Read position
232c0 20 6c 69 73 74 20 73 69 7a 65 20 2a 2f 0a 20 20   list size */.  
232d0 20 20 69 66 28 20 70 5b 30 5d 20 26 20 30 78 38    if( p[0] & 0x8
232e0 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e  0 ){.      int n
232f0 50 6f 73 3b 0a 20 20 20 20 20 20 70 49 74 65 72  Pos;.      pIter
23300 2d 3e 6e 53 69 7a 65 20 3d 20 66 74 73 35 47 65  ->nSize = fts5Ge
23310 74 56 61 72 69 6e 74 33 32 28 70 2c 20 6e 50 6f  tVarint32(p, nPo
23320 73 29 3b 0a 20 20 20 20 20 20 70 49 74 65 72 2d  s);.      pIter-
23330 3e 6e 50 6f 73 6c 69 73 74 20 3d 20 28 6e 50 6f  >nPoslist = (nPo
23340 73 3e 3e 31 29 3b 0a 20 20 20 20 7d 65 6c 73 65  s>>1);.    }else
23350 7b 0a 20 20 20 20 20 20 70 49 74 65 72 2d 3e 6e  {.      pIter->n
23360 50 6f 73 6c 69 73 74 20 3d 20 28 28 69 6e 74 29  Poslist = ((int)
23370 28 70 5b 30 5d 29 29 20 3e 3e 20 31 3b 0a 20 20  (p[0])) >> 1;.  
23380 20 20 20 20 70 49 74 65 72 2d 3e 6e 53 69 7a 65      pIter->nSize
23390 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20   = 1;.    }..   
233a0 20 70 49 74 65 72 2d 3e 61 50 6f 73 6c 69 73 74   pIter->aPoslist
233b0 20 3d 20 70 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61   = p;.  }.}..sta
233c0 74 69 63 20 76 6f 69 64 20 66 74 73 35 44 6f 63  tic void fts5Doc
233d0 6c 69 73 74 49 74 65 72 49 6e 69 74 28 0a 20 20  listIterInit(.  
233e0 46 74 73 35 42 75 66 66 65 72 20 2a 70 42 75 66  Fts5Buffer *pBuf
233f0 2c 20 0a 20 20 46 74 73 35 44 6f 63 6c 69 73 74  , .  Fts5Doclist
23400 49 74 65 72 20 2a 70 49 74 65 72 0a 29 7b 0a 20  Iter *pIter.){. 
23410 20 6d 65 6d 73 65 74 28 70 49 74 65 72 2c 20 30   memset(pIter, 0
23420 2c 20 73 69 7a 65 6f 66 28 2a 70 49 74 65 72 29  , sizeof(*pIter)
23430 29 3b 0a 20 20 70 49 74 65 72 2d 3e 61 50 6f 73  );.  pIter->aPos
23440 6c 69 73 74 20 3d 20 70 42 75 66 2d 3e 70 3b 0a  list = pBuf->p;.
23450 20 20 70 49 74 65 72 2d 3e 61 45 6f 66 20 3d 20    pIter->aEof = 
23460 26 70 42 75 66 2d 3e 70 5b 70 42 75 66 2d 3e 6e  &pBuf->p[pBuf->n
23470 5d 3b 0a 20 20 66 74 73 35 44 6f 63 6c 69 73 74  ];.  fts5Doclist
23480 49 74 65 72 4e 65 78 74 28 70 49 74 65 72 29 3b  IterNext(pIter);
23490 0a 7d 0a 0a 23 69 66 20 30 0a 2f 2a 0a 2a 2a 20  .}..#if 0./*.** 
234a0 41 70 70 65 6e 64 20 61 20 64 6f 63 6c 69 73 74  Append a doclist
234b0 20 74 6f 20 62 75 66 66 65 72 20 70 42 75 66 2e   to buffer pBuf.
234c0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  .**.** This func
234d0 74 69 6f 6e 20 61 73 73 75 6d 65 73 20 74 68 61  tion assumes tha
234e0 74 20 73 70 61 63 65 20 77 69 74 68 69 6e 20 74  t space within t
234f0 68 65 20 62 75 66 66 65 72 20 68 61 73 20 61 6c  he buffer has al
23500 72 65 61 64 79 20 62 65 65 6e 0a 2a 2a 20 61 6c  ready been.** al
23510 6c 6f 63 61 74 65 64 2e 0a 2a 2f 0a 73 74 61 74  located..*/.stat
23520 69 63 20 76 6f 69 64 20 66 74 73 35 4d 65 72 67  ic void fts5Merg
23530 65 41 70 70 65 6e 64 44 6f 63 69 64 28 0a 20 20  eAppendDocid(.  
23540 46 74 73 35 42 75 66 66 65 72 20 2a 70 42 75 66  Fts5Buffer *pBuf
23550 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
23560 2f 2a 20 42 75 66 66 65 72 20 74 6f 20 77 72 69  /* Buffer to wri
23570 74 65 20 74 6f 20 2a 2f 0a 20 20 69 36 34 20 2a  te to */.  i64 *
23580 70 69 4c 61 73 74 52 6f 77 69 64 2c 20 20 20 20  piLastRowid,    
23590 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 4e             /* IN
235a0 2f 4f 55 54 3a 20 50 72 65 76 69 6f 75 73 20 72  /OUT: Previous r
235b0 6f 77 69 64 20 77 72 69 74 74 65 6e 20 28 69 66  owid written (if
235c0 20 61 6e 79 29 20 2a 2f 0a 20 20 69 36 34 20 69   any) */.  i64 i
235d0 52 6f 77 69 64 20 20 20 20 20 20 20 20 20 20 20  Rowid           
235e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f             /* Ro
235f0 77 69 64 20 74 6f 20 61 70 70 65 6e 64 20 2a 2f  wid to append */
23600 0a 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 42  .){.  assert( pB
23610 75 66 2d 3e 6e 21 3d 30 20 7c 7c 20 28 2a 70 69  uf->n!=0 || (*pi
23620 4c 61 73 74 52 6f 77 69 64 29 3d 3d 30 20 29 3b  LastRowid)==0 );
23630 0a 20 20 66 74 73 35 42 75 66 66 65 72 53 61 66  .  fts5BufferSaf
23640 65 41 70 70 65 6e 64 56 61 72 69 6e 74 28 70 42  eAppendVarint(pB
23650 75 66 2c 20 69 52 6f 77 69 64 20 2d 20 2a 70 69  uf, iRowid - *pi
23660 4c 61 73 74 52 6f 77 69 64 29 3b 0a 20 20 2a 70  LastRowid);.  *p
23670 69 4c 61 73 74 52 6f 77 69 64 20 3d 20 69 52 6f  iLastRowid = iRo
23680 77 69 64 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23  wid;.}.#endif..#
23690 64 65 66 69 6e 65 20 66 74 73 35 4d 65 72 67 65  define fts5Merge
236a0 41 70 70 65 6e 64 44 6f 63 69 64 28 70 42 75 66  AppendDocid(pBuf
236b0 2c 20 69 4c 61 73 74 52 6f 77 69 64 2c 20 69 52  , iLastRowid, iR
236c0 6f 77 69 64 29 20 7b 20 20 20 20 20 20 20 5c 0a  owid) {       \.
236d0 20 20 61 73 73 65 72 74 28 20 28 70 42 75 66 29    assert( (pBuf)
236e0 2d 3e 6e 21 3d 30 20 7c 7c 20 28 69 4c 61 73 74  ->n!=0 || (iLast
236f0 52 6f 77 69 64 29 3d 3d 30 20 29 3b 20 20 20 20  Rowid)==0 );    
23700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
23710 0a 20 20 66 74 73 35 42 75 66 66 65 72 53 61 66  .  fts5BufferSaf
23720 65 41 70 70 65 6e 64 56 61 72 69 6e 74 28 28 70  eAppendVarint((p
23730 42 75 66 29 2c 20 28 69 52 6f 77 69 64 29 20 2d  Buf), (iRowid) -
23740 20 28 69 4c 61 73 74 52 6f 77 69 64 29 29 3b 20   (iLastRowid)); 
23750 5c 0a 20 20 28 69 4c 61 73 74 52 6f 77 69 64 29  \.  (iLastRowid)
23760 20 3d 20 28 69 52 6f 77 69 64 29 3b 20 20 20 20   = (iRowid);    
23770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23790 20 5c 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 77 61 70   \.}../*.** Swap
237a0 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
237b0 20 62 75 66 66 65 72 20 2a 70 31 20 77 69 74 68   buffer *p1 with
237c0 20 74 68 61 74 20 6f 66 20 2a 70 32 2e 0a 2a 2f   that of *p2..*/
237d0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
237e0 35 42 75 66 66 65 72 53 77 61 70 28 46 74 73 35  5BufferSwap(Fts5
237f0 42 75 66 66 65 72 20 2a 70 31 2c 20 46 74 73 35  Buffer *p1, Fts5
23800 42 75 66 66 65 72 20 2a 70 32 29 7b 0a 20 20 46  Buffer *p2){.  F
23810 74 73 35 42 75 66 66 65 72 20 74 6d 70 20 3d 20  ts5Buffer tmp = 
23820 2a 70 31 3b 0a 20 20 2a 70 31 20 3d 20 2a 70 32  *p1;.  *p1 = *p2
23830 3b 0a 20 20 2a 70 32 20 3d 20 74 6d 70 3b 0a 7d  ;.  *p2 = tmp;.}
23840 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  ..static void ft
23850 73 35 4e 65 78 74 52 6f 77 69 64 28 46 74 73 35  s5NextRowid(Fts5
23860 42 75 66 66 65 72 20 2a 70 42 75 66 2c 20 69 6e  Buffer *pBuf, in
23870 74 20 2a 70 69 4f 66 66 2c 20 69 36 34 20 2a 70  t *piOff, i64 *p
23880 69 52 6f 77 69 64 29 7b 0a 20 20 69 6e 74 20 69  iRowid){.  int i
23890 20 3d 20 2a 70 69 4f 66 66 3b 0a 20 20 69 66 28   = *piOff;.  if(
238a0 20 69 3e 3d 70 42 75 66 2d 3e 6e 20 29 7b 0a 20   i>=pBuf->n ){. 
238b0 20 20 20 2a 70 69 4f 66 66 20 3d 20 2d 31 3b 0a     *piOff = -1;.
238c0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 75 36 34    }else{.    u64
238d0 20 69 56 61 6c 3b 0a 20 20 20 20 2a 70 69 4f 66   iVal;.    *piOf
238e0 66 20 3d 20 69 20 2b 20 73 71 6c 69 74 65 33 46  f = i + sqlite3F
238f0 74 73 35 47 65 74 56 61 72 69 6e 74 28 26 70 42  ts5GetVarint(&pB
23900 75 66 2d 3e 70 5b 69 5d 2c 20 26 69 56 61 6c 29  uf->p[i], &iVal)
23910 3b 0a 20 20 20 20 2a 70 69 52 6f 77 69 64 20 2b  ;.    *piRowid +
23920 3d 20 69 56 61 6c 3b 0a 20 20 7d 0a 7d 0a 0a 2f  = iVal;.  }.}../
23930 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 74 68 65  *.** This is the
23940 20 65 71 75 69 76 61 6c 65 6e 74 20 6f 66 20 66   equivalent of f
23950 74 73 35 4d 65 72 67 65 50 72 65 66 69 78 4c 69  ts5MergePrefixLi
23960 73 74 73 28 29 20 66 6f 72 20 64 65 74 61 69 6c  sts() for detail
23970 3d 6e 6f 6e 65 20 6d 6f 64 65 2e 0a 2a 2a 20 49  =none mode..** I
23980 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 65 20  n this case the 
23990 62 75 66 66 65 72 73 20 63 6f 6e 73 69 73 74 20  buffers consist 
239a0 6f 66 20 61 20 64 65 6c 74 61 2d 65 6e 63 6f 64  of a delta-encod
239b0 65 64 20 6c 69 73 74 20 6f 66 20 72 6f 77 69 64  ed list of rowid
239c0 73 20 6f 6e 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69  s only..*/.stati
239d0 63 20 76 6f 69 64 20 66 74 73 35 4d 65 72 67 65  c void fts5Merge
239e0 52 6f 77 69 64 4c 69 73 74 73 28 0a 20 20 46 74  RowidLists(.  Ft
239f0 73 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20  s5Index *p,     
23a00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
23a10 20 46 54 53 35 20 62 61 63 6b 65 6e 64 20 6f 62   FTS5 backend ob
23a20 6a 65 63 74 20 2a 2f 0a 20 20 46 74 73 35 42 75  ject */.  Fts5Bu
23a30 66 66 65 72 20 2a 70 31 2c 20 20 20 20 20 20 20  ffer *p1,       
23a40 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72            /* Fir
23a50 73 74 20 6c 69 73 74 20 74 6f 20 6d 65 72 67 65  st list to merge
23a60 20 2a 2f 0a 20 20 46 74 73 35 42 75 66 66 65 72   */.  Fts5Buffer
23a70 20 2a 70 32 20 20 20 20 20 20 20 20 20 20 20 20   *p2            
23a80 20 20 20 20 20 20 2f 2a 20 53 65 63 6f 6e 64 20        /* Second 
23a90 6c 69 73 74 20 74 6f 20 6d 65 72 67 65 20 2a 2f  list to merge */
23aa0 0a 29 7b 0a 20 20 69 6e 74 20 69 31 20 3d 20 30  .){.  int i1 = 0
23ab0 3b 0a 20 20 69 6e 74 20 69 32 20 3d 20 30 3b 0a  ;.  int i2 = 0;.
23ac0 20 20 69 36 34 20 69 52 6f 77 69 64 31 20 3d 20    i64 iRowid1 = 
23ad0 30 3b 0a 20 20 69 36 34 20 69 52 6f 77 69 64 32  0;.  i64 iRowid2
23ae0 20 3d 20 30 3b 0a 20 20 69 36 34 20 69 4f 75 74   = 0;.  i64 iOut
23af0 20 3d 20 30 3b 0a 0a 20 20 46 74 73 35 42 75 66   = 0;..  Fts5Buf
23b00 66 65 72 20 6f 75 74 3b 0a 20 20 6d 65 6d 73 65  fer out;.  memse
23b10 74 28 26 6f 75 74 2c 20 30 2c 20 73 69 7a 65 6f  t(&out, 0, sizeo
23b20 66 28 6f 75 74 29 29 3b 0a 20 20 73 71 6c 69 74  f(out));.  sqlit
23b30 65 33 46 74 73 35 42 75 66 66 65 72 53 69 7a 65  e3Fts5BufferSize
23b40 28 26 70 2d 3e 72 63 2c 20 26 6f 75 74 2c 20 70  (&p->rc, &out, p
23b50 31 2d 3e 6e 20 2b 20 70 32 2d 3e 6e 29 3b 0a 20  1->n + p2->n);. 
23b60 20 69 66 28 20 70 2d 3e 72 63 20 29 20 72 65 74   if( p->rc ) ret
23b70 75 72 6e 3b 0a 0a 20 20 66 74 73 35 4e 65 78 74  urn;..  fts5Next
23b80 52 6f 77 69 64 28 70 31 2c 20 26 69 31 2c 20 26  Rowid(p1, &i1, &
23b90 69 52 6f 77 69 64 31 29 3b 0a 20 20 66 74 73 35  iRowid1);.  fts5
23ba0 4e 65 78 74 52 6f 77 69 64 28 70 32 2c 20 26 69  NextRowid(p2, &i
23bb0 32 2c 20 26 69 52 6f 77 69 64 32 29 3b 0a 20 20  2, &iRowid2);.  
23bc0 77 68 69 6c 65 28 20 69 31 3e 3d 30 20 7c 7c 20  while( i1>=0 || 
23bd0 69 32 3e 3d 30 20 29 7b 0a 20 20 20 20 69 66 28  i2>=0 ){.    if(
23be0 20 69 31 3e 3d 30 20 26 26 20 28 69 32 3c 30 20   i1>=0 && (i2<0 
23bf0 7c 7c 20 69 52 6f 77 69 64 31 3c 69 52 6f 77 69  || iRowid1<iRowi
23c00 64 32 29 20 29 7b 0a 20 20 20 20 20 20 61 73 73  d2) ){.      ass
23c10 65 72 74 28 20 69 4f 75 74 3d 3d 30 20 7c 7c 20  ert( iOut==0 || 
23c20 69 52 6f 77 69 64 31 3e 69 4f 75 74 20 29 3b 0a  iRowid1>iOut );.
23c30 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72        fts5Buffer
23c40 53 61 66 65 41 70 70 65 6e 64 56 61 72 69 6e 74  SafeAppendVarint
23c50 28 26 6f 75 74 2c 20 69 52 6f 77 69 64 31 20 2d  (&out, iRowid1 -
23c60 20 69 4f 75 74 29 3b 0a 20 20 20 20 20 20 69 4f   iOut);.      iO
23c70 75 74 20 3d 20 69 52 6f 77 69 64 31 3b 0a 20 20  ut = iRowid1;.  
23c80 20 20 20 20 66 74 73 35 4e 65 78 74 52 6f 77 69      fts5NextRowi
23c90 64 28 70 31 2c 20 26 69 31 2c 20 26 69 52 6f 77  d(p1, &i1, &iRow
23ca0 69 64 31 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  id1);.    }else{
23cb0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69  .      assert( i
23cc0 4f 75 74 3d 3d 30 20 7c 7c 20 69 52 6f 77 69 64  Out==0 || iRowid
23cd0 32 3e 69 4f 75 74 20 29 3b 0a 20 20 20 20 20 20  2>iOut );.      
23ce0 66 74 73 35 42 75 66 66 65 72 53 61 66 65 41 70  fts5BufferSafeAp
23cf0 70 65 6e 64 56 61 72 69 6e 74 28 26 6f 75 74 2c  pendVarint(&out,
23d00 20 69 52 6f 77 69 64 32 20 2d 20 69 4f 75 74 29   iRowid2 - iOut)
23d10 3b 0a 20 20 20 20 20 20 69 4f 75 74 20 3d 20 69  ;.      iOut = i
23d20 52 6f 77 69 64 32 3b 0a 20 20 20 20 20 20 69 66  Rowid2;.      if
23d30 28 20 69 31 3e 3d 30 20 26 26 20 69 52 6f 77 69  ( i1>=0 && iRowi
23d40 64 31 3d 3d 69 52 6f 77 69 64 32 20 29 7b 0a 20  d1==iRowid2 ){. 
23d50 20 20 20 20 20 20 20 66 74 73 35 4e 65 78 74 52         fts5NextR
23d60 6f 77 69 64 28 70 31 2c 20 26 69 31 2c 20 26 69  owid(p1, &i1, &i
23d70 52 6f 77 69 64 31 29 3b 0a 20 20 20 20 20 20 7d  Rowid1);.      }
23d80 0a 20 20 20 20 20 20 66 74 73 35 4e 65 78 74 52  .      fts5NextR
23d90 6f 77 69 64 28 70 32 2c 20 26 69 32 2c 20 26 69  owid(p2, &i2, &i
23da0 52 6f 77 69 64 32 29 3b 0a 20 20 20 20 7d 0a 20  Rowid2);.    }. 
23db0 20 7d 0a 0a 20 20 66 74 73 35 42 75 66 66 65 72   }..  fts5Buffer
23dc0 53 77 61 70 28 26 6f 75 74 2c 20 70 31 29 3b 0a  Swap(&out, p1);.
23dd0 20 20 66 74 73 35 42 75 66 66 65 72 46 72 65 65    fts5BufferFree
23de0 28 26 6f 75 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  (&out);.}../*.**
23df0 20 42 75 66 66 65 72 73 20 70 31 20 61 6e 64 20   Buffers p1 and 
23e00 70 32 20 63 6f 6e 74 61 69 6e 20 64 6f 63 6c 69  p2 contain docli
23e10 73 74 73 2e 20 54 68 69 73 20 66 75 6e 63 74 69  sts. This functi
23e20 6f 6e 20 6d 65 72 67 65 73 20 74 68 65 20 63 6f  on merges the co
23e30 6e 74 65 6e 74 0a 2a 2a 20 6f 66 20 74 68 65 20  ntent.** of the 
23e40 74 77 6f 20 64 6f 63 6c 69 73 74 73 20 74 6f 67  two doclists tog
23e50 65 74 68 65 72 20 61 6e 64 20 73 65 74 73 20 62  ether and sets b
23e60 75 66 66 65 72 20 70 31 20 74 6f 20 74 68 65 20  uffer p1 to the 
23e70 72 65 73 75 6c 74 20 62 65 66 6f 72 65 0a 2a 2a  result before.**
23e80 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a   returning..**.*
23e90 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  * If an error oc
23ea0 63 75 72 73 2c 20 61 6e 20 65 72 72 6f 72 20 63  curs, an error c
23eb0 6f 64 65 20 69 73 20 6c 65 66 74 20 69 6e 20 70  ode is left in p
23ec0 2d 3e 72 63 2e 20 49 66 20 61 6e 20 65 72 72 6f  ->rc. If an erro
23ed0 72 20 68 61 73 0a 2a 2a 20 61 6c 72 65 61 64 79  r has.** already
23ee0 20 6f 63 63 75 72 72 65 64 2c 20 74 68 69 73 20   occurred, this 
23ef0 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f  function is a no
23f00 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  -op..*/.static v
23f10 6f 69 64 20 66 74 73 35 4d 65 72 67 65 50 72 65  oid fts5MergePre
23f20 66 69 78 4c 69 73 74 73 28 0a 20 20 46 74 73 35  fixLists(.  Fts5
23f30 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20  Index *p,       
23f40 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
23f50 54 53 35 20 62 61 63 6b 65 6e 64 20 6f 62 6a 65  TS5 backend obje
23f60 63 74 20 2a 2f 0a 20 20 46 74 73 35 42 75 66 66  ct */.  Fts5Buff
23f70 65 72 20 2a 70 31 2c 20 20 20 20 20 20 20 20 20  er *p1,         
23f80 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
23f90 20 6c 69 73 74 20 74 6f 20 6d 65 72 67 65 20 2a   list to merge *
23fa0 2f 0a 20 20 46 74 73 35 42 75 66 66 65 72 20 2a  /.  Fts5Buffer *
23fb0 70 32 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p2              
23fc0 20 20 20 20 2f 2a 20 53 65 63 6f 6e 64 20 6c 69      /* Second li
23fd0 73 74 20 74 6f 20 6d 65 72 67 65 20 2a 2f 0a 29  st to merge */.)
23fe0 7b 0a 20 20 69 66 28 20 70 32 2d 3e 6e 20 29 7b  {.  if( p2->n ){
23ff0 0a 20 20 20 20 69 36 34 20 69 4c 61 73 74 52 6f  .    i64 iLastRo
24000 77 69 64 20 3d 20 30 3b 0a 20 20 20 20 46 74 73  wid = 0;.    Fts
24010 35 44 6f 63 6c 69 73 74 49 74 65 72 20 69 31 3b  5DoclistIter i1;
24020 0a 20 20 20 20 46 74 73 35 44 6f 63 6c 69 73 74  .    Fts5Doclist
24030 49 74 65 72 20 69 32 3b 0a 20 20 20 20 46 74 73  Iter i2;.    Fts
24040 35 42 75 66 66 65 72 20 6f 75 74 20 3d 20 7b 30  5Buffer out = {0
24050 2c 20 30 2c 20 30 7d 3b 0a 20 20 20 20 46 74 73  , 0, 0};.    Fts
24060 35 42 75 66 66 65 72 20 74 6d 70 20 3d 20 7b 30  5Buffer tmp = {0
24070 2c 20 30 2c 20 30 7d 3b 0a 0a 20 20 20 20 69 66  , 0, 0};..    if
24080 28 20 73 71 6c 69 74 65 33 46 74 73 35 42 75 66  ( sqlite3Fts5Buf
24090 66 65 72 53 69 7a 65 28 26 70 2d 3e 72 63 2c 20  ferSize(&p->rc, 
240a0 26 6f 75 74 2c 20 70 31 2d 3e 6e 20 2b 20 70 32  &out, p1->n + p2
240b0 2d 3e 6e 29 20 29 20 72 65 74 75 72 6e 3b 0a 20  ->n) ) return;. 
240c0 20 20 20 66 74 73 35 44 6f 63 6c 69 73 74 49 74     fts5DoclistIt
240d0 65 72 49 6e 69 74 28 70 31 2c 20 26 69 31 29 3b  erInit(p1, &i1);
240e0 0a 20 20 20 20 66 74 73 35 44 6f 63 6c 69 73 74  .    fts5Doclist
240f0 49 74 65 72 49 6e 69 74 28 70 32 2c 20 26 69 32  IterInit(p2, &i2
24100 29 3b 0a 0a 20 20 20 20 77 68 69 6c 65 28 20 31  );..    while( 1
24110 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 69 31   ){.      if( i1
24120 2e 69 52 6f 77 69 64 3c 69 32 2e 69 52 6f 77 69  .iRowid<i2.iRowi
24130 64 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  d ){.        /* 
24140 43 6f 70 79 20 65 6e 74 72 79 20 66 72 6f 6d 20  Copy entry from 
24150 69 31 20 2a 2f 0a 20 20 20 20 20 20 20 20 66 74  i1 */.        ft
24160 73 35 4d 65 72 67 65 41 70 70 65 6e 64 44 6f 63  s5MergeAppendDoc
24170 69 64 28 26 6f 75 74 2c 20 69 4c 61 73 74 52 6f  id(&out, iLastRo
24180 77 69 64 2c 20 69 31 2e 69 52 6f 77 69 64 29 3b  wid, i1.iRowid);
24190 0a 20 20 20 20 20 20 20 20 66 74 73 35 42 75 66  .        fts5Buf
241a0 66 65 72 53 61 66 65 41 70 70 65 6e 64 42 6c 6f  ferSafeAppendBlo
241b0 62 28 26 6f 75 74 2c 20 69 31 2e 61 50 6f 73 6c  b(&out, i1.aPosl
241c0 69 73 74 2c 20 69 31 2e 6e 50 6f 73 6c 69 73 74  ist, i1.nPoslist
241d0 2b 69 31 2e 6e 53 69 7a 65 29 3b 0a 20 20 20 20  +i1.nSize);.    
241e0 20 20 20 20 66 74 73 35 44 6f 63 6c 69 73 74 49      fts5DoclistI
241f0 74 65 72 4e 65 78 74 28 26 69 31 29 3b 0a 20 20  terNext(&i1);.  
24200 20 20 20 20 20 20 69 66 28 20 69 31 2e 61 50 6f        if( i1.aPo
24210 73 6c 69 73 74 3d 3d 30 20 29 20 62 72 65 61 6b  slist==0 ) break
24220 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
24230 65 6c 73 65 20 69 66 28 20 69 32 2e 69 52 6f 77  else if( i2.iRow
24240 69 64 21 3d 69 31 2e 69 52 6f 77 69 64 20 29 7b  id!=i1.iRowid ){
24250 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 70 79  .        /* Copy
24260 20 65 6e 74 72 79 20 66 72 6f 6d 20 69 32 20 2a   entry from i2 *
24270 2f 0a 20 20 20 20 20 20 20 20 66 74 73 35 4d 65  /.        fts5Me
24280 72 67 65 41 70 70 65 6e 64 44 6f 63 69 64 28 26  rgeAppendDocid(&
24290 6f 75 74 2c 20 69 4c 61 73 74 52 6f 77 69 64 2c  out, iLastRowid,
242a0 20 69 32 2e 69 52 6f 77 69 64 29 3b 0a 20 20 20   i2.iRowid);.   
242b0 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72 53       fts5BufferS
242c0 61 66 65 41 70 70 65 6e 64 42 6c 6f 62 28 26 6f  afeAppendBlob(&o
242d0 75 74 2c 20 69 32 2e 61 50 6f 73 6c 69 73 74 2c  ut, i2.aPoslist,
242e0 20 69 32 2e 6e 50 6f 73 6c 69 73 74 2b 69 32 2e   i2.nPoslist+i2.
242f0 6e 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 20 20  nSize);.        
24300 66 74 73 35 44 6f 63 6c 69 73 74 49 74 65 72 4e  fts5DoclistIterN
24310 65 78 74 28 26 69 32 29 3b 0a 20 20 20 20 20 20  ext(&i2);.      
24320 20 20 69 66 28 20 69 32 2e 61 50 6f 73 6c 69 73    if( i2.aPoslis
24330 74 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20  t==0 ) break;.  
24340 20 20 20 20 7d 0a 20 20 20 20 20 20 65 6c 73 65      }.      else
24350 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 4d 65 72  {.        /* Mer
24360 67 65 20 74 68 65 20 74 77 6f 20 70 6f 73 69 74  ge the two posit
24370 69 6f 6e 20 6c 69 73 74 73 2e 20 2a 2f 20 0a 20  ion lists. */ . 
24380 20 20 20 20 20 20 20 69 36 34 20 69 50 6f 73 31         i64 iPos1
24390 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 69 36   = 0;.        i6
243a0 34 20 69 50 6f 73 32 20 3d 20 30 3b 0a 20 20 20  4 iPos2 = 0;.   
243b0 20 20 20 20 20 69 6e 74 20 69 4f 66 66 31 20 3d       int iOff1 =
243c0 20 30 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20   0;.        int 
243d0 69 4f 66 66 32 20 3d 20 30 3b 0a 20 20 20 20 20  iOff2 = 0;.     
243e0 20 20 20 75 38 20 2a 61 31 20 3d 20 26 69 31 2e     u8 *a1 = &i1.
243f0 61 50 6f 73 6c 69 73 74 5b 69 31 2e 6e 53 69 7a  aPoslist[i1.nSiz
24400 65 5d 3b 0a 20 20 20 20 20 20 20 20 75 38 20 2a  e];.        u8 *
24410 61 32 20 3d 20 26 69 32 2e 61 50 6f 73 6c 69 73  a2 = &i2.aPoslis
24420 74 5b 69 32 2e 6e 53 69 7a 65 5d 3b 0a 0a 20 20  t[i2.nSize];..  
24430 20 20 20 20 20 20 69 36 34 20 69 50 72 65 76 20        i64 iPrev 
24440 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 46 74 73  = 0;.        Fts
24450 35 50 6f 73 6c 69 73 74 57 72 69 74 65 72 20 77  5PoslistWriter w
24460 72 69 74 65 72 3b 0a 20 20 20 20 20 20 20 20 6d  riter;.        m
24470 65 6d 73 65 74 28 26 77 72 69 74 65 72 2c 20 30  emset(&writer, 0
24480 2c 20 73 69 7a 65 6f 66 28 77 72 69 74 65 72 29  , sizeof(writer)
24490 29 3b 0a 0a 20 20 20 20 20 20 20 20 66 74 73 35  );..        fts5
244a0 4d 65 72 67 65 41 70 70 65 6e 64 44 6f 63 69 64  MergeAppendDocid
244b0 28 26 6f 75 74 2c 20 69 4c 61 73 74 52 6f 77 69  (&out, iLastRowi
244c0 64 2c 20 69 32 2e 69 52 6f 77 69 64 29 3b 0a 20  d, i2.iRowid);. 
244d0 20 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65         fts5Buffe
244e0 72 5a 65 72 6f 28 26 74 6d 70 29 3b 0a 20 20 20  rZero(&tmp);.   
244f0 20 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35       sqlite3Fts5
24500 42 75 66 66 65 72 53 69 7a 65 28 26 70 2d 3e 72  BufferSize(&p->r
24510 63 2c 20 26 74 6d 70 2c 20 69 31 2e 6e 50 6f 73  c, &tmp, i1.nPos
24520 6c 69 73 74 20 2b 20 69 32 2e 6e 50 6f 73 6c 69  list + i2.nPosli
24530 73 74 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  st);.        if(
24540 20 70 2d 3e 72 63 20 29 20 62 72 65 61 6b 3b 0a   p->rc ) break;.
24550 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
24560 46 74 73 35 50 6f 73 6c 69 73 74 4e 65 78 74 36  Fts5PoslistNext6
24570 34 28 61 31 2c 20 69 31 2e 6e 50 6f 73 6c 69 73  4(a1, i1.nPoslis
24580 74 2c 20 26 69 4f 66 66 31 2c 20 26 69 50 6f 73  t, &iOff1, &iPos
24590 31 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  1);.        sqli
245a0 74 65 33 46 74 73 35 50 6f 73 6c 69 73 74 4e 65  te3Fts5PoslistNe
245b0 78 74 36 34 28 61 32 2c 20 69 32 2e 6e 50 6f 73  xt64(a2, i2.nPos
245c0 6c 69 73 74 2c 20 26 69 4f 66 66 32 2c 20 26 69  list, &iOff2, &i
245d0 50 6f 73 32 29 3b 0a 20 20 20 20 20 20 20 20 61  Pos2);.        a
245e0 73 73 65 72 74 28 20 69 50 6f 73 31 3e 3d 30 20  ssert( iPos1>=0 
245f0 26 26 20 69 50 6f 73 32 3e 3d 30 20 29 3b 0a 0a  && iPos2>=0 );..
24600 20 20 20 20 20 20 20 20 69 66 28 20 69 50 6f 73          if( iPos
24610 31 3c 69 50 6f 73 32 20 29 7b 0a 20 20 20 20 20  1<iPos2 ){.     
24620 20 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35       sqlite3Fts5
24630 50 6f 73 6c 69 73 74 53 61 66 65 41 70 70 65 6e  PoslistSafeAppen
24640 64 28 26 74 6d 70 2c 20 26 69 50 72 65 76 2c 20  d(&tmp, &iPrev, 
24650 69 50 6f 73 31 29 3b 0a 20 20 20 20 20 20 20 20  iPos1);.        
24660 20 20 73 71 6c 69 74 65 33 46 74 73 35 50 6f 73    sqlite3Fts5Pos
24670 6c 69 73 74 4e 65 78 74 36 34 28 61 31 2c 20 69  listNext64(a1, i
24680 31 2e 6e 50 6f 73 6c 69 73 74 2c 20 26 69 4f 66  1.nPoslist, &iOf
24690 66 31 2c 20 26 69 50 6f 73 31 29 3b 0a 20 20 20  f1, &iPos1);.   
246a0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
246b0 20 20 20 20 20 20 73 71 6c 69 74 65 33 46 74 73        sqlite3Fts
246c0 35 50 6f 73 6c 69 73 74 53 61 66 65 41 70 70 65  5PoslistSafeAppe
246d0 6e 64 28 26 74 6d 70 2c 20 26 69 50 72 65 76 2c  nd(&tmp, &iPrev,
246e0 20 69 50 6f 73 32 29 3b 0a 20 20 20 20 20 20 20   iPos2);.       
246f0 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 50 6f     sqlite3Fts5Po
24700 73 6c 69 73 74 4e 65 78 74 36 34 28 61 32 2c 20  slistNext64(a2, 
24710 69 32 2e 6e 50 6f 73 6c 69 73 74 2c 20 26 69 4f  i2.nPoslist, &iO
24720 66 66 32 2c 20 26 69 50 6f 73 32 29 3b 0a 20 20  ff2, &iPos2);.  
24730 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20        }..       
24740 20 69 66 28 20 69 50 6f 73 31 3e 3d 30 20 26 26   if( iPos1>=0 &&
24750 20 69 50 6f 73 32 3e 3d 30 20 29 7b 0a 20 20 20   iPos2>=0 ){.   
24760 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 31 20         while( 1 
24770 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ){.            i
24780 66 28 20 69 50 6f 73 31 3c 69 50 6f 73 32 20 29  f( iPos1<iPos2 )
24790 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
247a0 69 66 28 20 69 50 6f 73 31 21 3d 69 50 72 65 76  if( iPos1!=iPrev
247b0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
247c0 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 50      sqlite3Fts5P
247d0 6f 73 6c 69 73 74 53 61 66 65 41 70 70 65 6e 64  oslistSafeAppend
247e0 28 26 74 6d 70 2c 20 26 69 50 72 65 76 2c 20 69  (&tmp, &iPrev, i
247f0 50 6f 73 31 29 3b 0a 20 20 20 20 20 20 20 20 20  Pos1);.         
24800 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
24810 20 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35       sqlite3Fts5
24820 50 6f 73 6c 69 73 74 4e 65 78 74 36 34 28 61 31  PoslistNext64(a1
24830 2c 20 69 31 2e 6e 50 6f 73 6c 69 73 74 2c 20 26  , i1.nPoslist, &
24840 69 4f 66 66 31 2c 20 26 69 50 6f 73 31 29 3b 0a  iOff1, &iPos1);.
24850 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
24860 28 20 69 50 6f 73 31 3c 30 20 29 20 62 72 65 61  ( iPos1<0 ) brea
24870 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  k;.            }
24880 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
24890 20 20 20 20 61 73 73 65 72 74 28 20 69 50 6f 73      assert( iPos
248a0 32 21 3d 69 50 72 65 76 20 29 3b 0a 20 20 20 20  2!=iPrev );.    
248b0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
248c0 33 46 74 73 35 50 6f 73 6c 69 73 74 53 61 66 65  3Fts5PoslistSafe
248d0 41 70 70 65 6e 64 28 26 74 6d 70 2c 20 26 69 50  Append(&tmp, &iP
248e0 72 65 76 2c 20 69 50 6f 73 32 29 3b 0a 20 20 20  rev, iPos2);.   
248f0 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
24900 65 33 46 74 73 35 50 6f 73 6c 69 73 74 4e 65 78  e3Fts5PoslistNex
24910 74 36 34 28 61 32 2c 20 69 32 2e 6e 50 6f 73 6c  t64(a2, i2.nPosl
24920 69 73 74 2c 20 26 69 4f 66 66 32 2c 20 26 69 50  ist, &iOff2, &iP
24930 6f 73 32 29 3b 0a 20 20 20 20 20 20 20 20 20 20  os2);.          
24940 20 20 20 20 69 66 28 20 69 50 6f 73 32 3c 30 20      if( iPos2<0 
24950 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20  ) break;.       
24960 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
24970 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20   }.        }..  
24980 20 20 20 20 20 20 69 66 28 20 69 50 6f 73 31 3e        if( iPos1>
24990 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
249a0 69 66 28 20 69 50 6f 73 31 21 3d 69 50 72 65 76  if( iPos1!=iPrev
249b0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
249c0 73 71 6c 69 74 65 33 46 74 73 35 50 6f 73 6c 69  sqlite3Fts5Posli
249d0 73 74 53 61 66 65 41 70 70 65 6e 64 28 26 74 6d  stSafeAppend(&tm
249e0 70 2c 20 26 69 50 72 65 76 2c 20 69 50 6f 73 31  p, &iPrev, iPos1
249f0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
24a00 20 20 20 20 20 20 20 20 20 66 74 73 35 42 75 66           fts5Buf
24a10 66 65 72 53 61 66 65 41 70 70 65 6e 64 42 6c 6f  ferSafeAppendBlo
24a20 62 28 26 74 6d 70 2c 20 26 61 31 5b 69 4f 66 66  b(&tmp, &a1[iOff
24a30 31 5d 2c 20 69 31 2e 6e 50 6f 73 6c 69 73 74 2d  1], i1.nPoslist-
24a40 69 4f 66 66 31 29 3b 0a 20 20 20 20 20 20 20 20  iOff1);.        
24a50 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
24a60 20 61 73 73 65 72 74 28 20 69 50 6f 73 32 3e 3d   assert( iPos2>=
24a70 30 20 26 26 20 69 50 6f 73 32 21 3d 69 50 72 65  0 && iPos2!=iPre
24a80 76 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73  v );.          s
24a90 71 6c 69 74 65 33 46 74 73 35 50 6f 73 6c 69 73  qlite3Fts5Poslis
24aa0 74 53 61 66 65 41 70 70 65 6e 64 28 26 74 6d 70  tSafeAppend(&tmp
24ab0 2c 20 26 69 50 72 65 76 2c 20 69 50 6f 73 32 29  , &iPrev, iPos2)
24ac0 3b 0a 20 20 20 20 20 20 20 20 20 20 66 74 73 35  ;.          fts5
24ad0 42 75 66 66 65 72 53 61 66 65 41 70 70 65 6e 64  BufferSafeAppend
24ae0 42 6c 6f 62 28 26 74 6d 70 2c 20 26 61 32 5b 69  Blob(&tmp, &a2[i
24af0 4f 66 66 32 5d 2c 20 69 32 2e 6e 50 6f 73 6c 69  Off2], i2.nPosli
24b00 73 74 2d 69 4f 66 66 32 29 3b 0a 20 20 20 20 20  st-iOff2);.     
24b10 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a     }..        /*
24b20 20 57 52 49 54 45 50 4f 53 4c 49 53 54 53 49 5a   WRITEPOSLISTSIZ
24b30 45 20 2a 2f 0a 20 20 20 20 20 20 20 20 66 74 73  E */.        fts
24b40 35 42 75 66 66 65 72 53 61 66 65 41 70 70 65 6e  5BufferSafeAppen
24b50 64 56 61 72 69 6e 74 28 26 6f 75 74 2c 20 74 6d  dVarint(&out, tm
24b60 70 2e 6e 20 2a 20 32 29 3b 0a 20 20 20 20 20 20  p.n * 2);.      
24b70 20 20 66 74 73 35 42 75 66 66 65 72 53 61 66 65    fts5BufferSafe
24b80 41 70 70 65 6e 64 42 6c 6f 62 28 26 6f 75 74 2c  AppendBlob(&out,
24b90 20 74 6d 70 2e 70 2c 20 74 6d 70 2e 6e 29 3b 0a   tmp.p, tmp.n);.
24ba0 20 20 20 20 20 20 20 20 66 74 73 35 44 6f 63 6c          fts5Docl
24bb0 69 73 74 49 74 65 72 4e 65 78 74 28 26 69 31 29  istIterNext(&i1)
24bc0 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35 44 6f  ;.        fts5Do
24bd0 63 6c 69 73 74 49 74 65 72 4e 65 78 74 28 26 69  clistIterNext(&i
24be0 32 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  2);.        if( 
24bf0 69 31 2e 61 50 6f 73 6c 69 73 74 3d 3d 30 20 7c  i1.aPoslist==0 |
24c00 7c 20 69 32 2e 61 50 6f 73 6c 69 73 74 3d 3d 30  | i2.aPoslist==0
24c10 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
24c20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28  }.    }..    if(
24c30 20 69 31 2e 61 50 6f 73 6c 69 73 74 20 29 7b 0a   i1.aPoslist ){.
24c40 20 20 20 20 20 20 66 74 73 35 4d 65 72 67 65 41        fts5MergeA
24c50 70 70 65 6e 64 44 6f 63 69 64 28 26 6f 75 74 2c  ppendDocid(&out,
24c60 20 69 4c 61 73 74 52 6f 77 69 64 2c 20 69 31 2e   iLastRowid, i1.
24c70 69 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 66  iRowid);.      f
24c80 74 73 35 42 75 66 66 65 72 53 61 66 65 41 70 70  ts5BufferSafeApp
24c90 65 6e 64 42 6c 6f 62 28 26 6f 75 74 2c 20 69 31  endBlob(&out, i1
24ca0 2e 61 50 6f 73 6c 69 73 74 2c 20 69 31 2e 61 45  .aPoslist, i1.aE
24cb0 6f 66 20 2d 20 69 31 2e 61 50 6f 73 6c 69 73 74  of - i1.aPoslist
24cc0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 65 6c 73  );.    }.    els
24cd0 65 20 69 66 28 20 69 32 2e 61 50 6f 73 6c 69 73  e if( i2.aPoslis
24ce0 74 20 29 7b 0a 20 20 20 20 20 20 66 74 73 35 4d  t ){.      fts5M
24cf0 65 72 67 65 41 70 70 65 6e 64 44 6f 63 69 64 28  ergeAppendDocid(
24d00 26 6f 75 74 2c 20 69 4c 61 73 74 52 6f 77 69 64  &out, iLastRowid
24d10 2c 20 69 32 2e 69 52 6f 77 69 64 29 3b 0a 20 20  , i2.iRowid);.  
24d20 20 20 20 20 66 74 73 35 42 75 66 66 65 72 53 61      fts5BufferSa
24d30 66 65 41 70 70 65 6e 64 42 6c 6f 62 28 26 6f 75  feAppendBlob(&ou
24d40 74 2c 20 69 32 2e 61 50 6f 73 6c 69 73 74 2c 20  t, i2.aPoslist, 
24d50 69 32 2e 61 45 6f 66 20 2d 20 69 32 2e 61 50 6f  i2.aEof - i2.aPo
24d60 73 6c 69 73 74 29 3b 0a 20 20 20 20 7d 0a 0a 20  slist);.    }.. 
24d70 20 20 20 66 74 73 35 42 75 66 66 65 72 53 65 74     fts5BufferSet
24d80 28 26 70 2d 3e 72 63 2c 20 70 31 2c 20 6f 75 74  (&p->rc, p1, out
24d90 2e 6e 2c 20 6f 75 74 2e 70 29 3b 0a 20 20 20 20  .n, out.p);.    
24da0 66 74 73 35 42 75 66 66 65 72 46 72 65 65 28 26  fts5BufferFree(&
24db0 74 6d 70 29 3b 0a 20 20 20 20 66 74 73 35 42 75  tmp);.    fts5Bu
24dc0 66 66 65 72 46 72 65 65 28 26 6f 75 74 29 3b 0a  fferFree(&out);.
24dd0 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f    }.}..static vo
24de0 69 64 20 66 74 73 35 53 65 74 75 70 50 72 65 66  id fts5SetupPref
24df0 69 78 49 74 65 72 28 0a 20 20 46 74 73 35 49 6e  ixIter(.  Fts5In
24e00 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20 20  dex *p,         
24e10 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
24e20 65 78 20 74 6f 20 72 65 61 64 20 66 72 6f 6d 20  ex to read from 
24e30 2a 2f 0a 20 20 69 6e 74 20 62 44 65 73 63 2c 20  */.  int bDesc, 
24e40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24e50 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72       /* True for
24e60 20 22 4f 52 44 45 52 20 42 59 20 72 6f 77 69 64   "ORDER BY rowid
24e70 20 44 45 53 43 22 20 2a 2f 0a 20 20 63 6f 6e 73   DESC" */.  cons
24e80 74 20 75 38 20 2a 70 54 6f 6b 65 6e 2c 20 20 20  t u8 *pToken,   
24e90 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42              /* B
24ea0 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67  uffer containing
24eb0 20 70 72 65 66 69 78 20 74 6f 20 6d 61 74 63 68   prefix to match
24ec0 20 2a 2f 0a 20 20 69 6e 74 20 6e 54 6f 6b 65 6e   */.  int nToken
24ed0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
24ee0 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
24ef0 20 62 75 66 66 65 72 20 70 54 6f 6b 65 6e 20 69   buffer pToken i
24f00 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 46 74 73  n bytes */.  Fts
24f10 35 43 6f 6c 73 65 74 20 2a 70 43 6f 6c 73 65 74  5Colset *pColset
24f20 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
24f30 52 65 73 74 72 69 63 74 20 6d 61 74 63 68 65 73  Restrict matches
24f40 20 74 6f 20 74 68 65 73 65 20 63 6f 6c 75 6d 6e   to these column
24f50 73 20 2a 2f 0a 20 20 46 74 73 35 49 74 65 72 20  s */.  Fts5Iter 
24f60 2a 2a 70 70 49 74 65 72 20 20 20 20 20 20 20 20  **ppIter        
24f70 20 20 2f 2a 20 4f 55 54 3a 20 4e 65 77 20 69 74    /* OUT: New it
24f80 65 72 61 74 6f 72 20 2a 2f 0a 29 7b 0a 20 20 46  erator */.){.  F
24f90 74 73 35 53 74 72 75 63 74 75 72 65 20 2a 70 53  ts5Structure *pS
24fa0 74 72 75 63 74 3b 0a 20 20 46 74 73 35 42 75 66  truct;.  Fts5Buf
24fb0 66 65 72 20 2a 61 42 75 66 3b 0a 20 20 63 6f 6e  fer *aBuf;.  con
24fc0 73 74 20 69 6e 74 20 6e 42 75 66 20 3d 20 33 32  st int nBuf = 32
24fd0 3b 0a 0a 20 20 76 6f 69 64 20 28 2a 78 4d 65 72  ;..  void (*xMer
24fe0 67 65 29 28 46 74 73 35 49 6e 64 65 78 2a 2c 20  ge)(Fts5Index*, 
24ff0 46 74 73 35 42 75 66 66 65 72 2a 2c 20 46 74 73  Fts5Buffer*, Fts
25000 35 42 75 66 66 65 72 2a 29 3b 0a 20 20 76 6f 69  5Buffer*);.  voi
25010 64 20 28 2a 78 41 70 70 65 6e 64 29 28 46 74 73  d (*xAppend)(Fts
25020 35 49 6e 64 65 78 2a 2c 20 69 36 34 2c 20 46 74  5Index*, i64, Ft
25030 73 35 49 74 65 72 2a 2c 20 46 74 73 35 42 75 66  s5Iter*, Fts5Buf
25040 66 65 72 2a 29 3b 0a 20 20 69 66 28 20 70 2d 3e  fer*);.  if( p->
25050 70 43 6f 6e 66 69 67 2d 3e 65 44 65 74 61 69 6c  pConfig->eDetail
25060 3d 3d 46 54 53 35 5f 44 45 54 41 49 4c 5f 4e 4f  ==FTS5_DETAIL_NO
25070 4e 45 20 29 7b 0a 20 20 20 20 78 4d 65 72 67 65  NE ){.    xMerge
25080 20 3d 20 66 74 73 35 4d 65 72 67 65 52 6f 77 69   = fts5MergeRowi
25090 64 4c 69 73 74 73 3b 0a 20 20 20 20 78 41 70 70  dLists;.    xApp
250a0 65 6e 64 20 3d 20 66 74 73 35 41 70 70 65 6e 64  end = fts5Append
250b0 52 6f 77 69 64 3b 0a 20 20 7d 65 6c 73 65 7b 0a  Rowid;.  }else{.
250c0 20 20 20 20 78 4d 65 72 67 65 20 3d 20 66 74 73      xMerge = fts
250d0 35 4d 65 72 67 65 50 72 65 66 69 78 4c 69 73 74  5MergePrefixList
250e0 73 3b 0a 20 20 20 20 78 41 70 70 65 6e 64 20 3d  s;.    xAppend =
250f0 20 66 74 73 35 41 70 70 65 6e 64 50 6f 73 6c 69   fts5AppendPosli
25100 73 74 3b 0a 20 20 7d 0a 0a 20 20 61 42 75 66 20  st;.  }..  aBuf 
25110 3d 20 28 46 74 73 35 42 75 66 66 65 72 2a 29 66  = (Fts5Buffer*)f
25120 74 73 35 49 64 78 4d 61 6c 6c 6f 63 28 70 2c 20  ts5IdxMalloc(p, 
25130 73 69 7a 65 6f 66 28 46 74 73 35 42 75 66 66 65  sizeof(Fts5Buffe
25140 72 29 2a 6e 42 75 66 29 3b 0a 20 20 70 53 74 72  r)*nBuf);.  pStr
25150 75 63 74 20 3d 20 66 74 73 35 53 74 72 75 63 74  uct = fts5Struct
25160 75 72 65 52 65 61 64 28 70 29 3b 0a 0a 20 20 69  ureRead(p);..  i
25170 66 28 20 61 42 75 66 20 26 26 20 70 53 74 72 75  f( aBuf && pStru
25180 63 74 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20  ct ){.    const 
25190 69 6e 74 20 66 6c 61 67 73 20 3d 20 46 54 53 35  int flags = FTS5
251a0 49 4e 44 45 58 5f 51 55 45 52 59 5f 53 43 41 4e  INDEX_QUERY_SCAN
251b0 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
251c0 20 20 20 20 20 20 7c 20 46 54 53 35 49 4e 44 45        | FTS5INDE
251d0 58 5f 51 55 45 52 59 5f 53 4b 49 50 45 4d 50 54  X_QUERY_SKIPEMPT
251e0 59 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  Y .             
251f0 20 20 20 20 20 20 20 7c 20 46 54 53 35 49 4e 44         | FTS5IND
25200 45 58 5f 51 55 45 52 59 5f 4e 4f 4f 55 54 50 55  EX_QUERY_NOOUTPU
25210 54 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  T;.    int i;.  
25220 20 20 69 36 34 20 69 4c 61 73 74 52 6f 77 69 64    i64 iLastRowid
25230 20 3d 20 30 3b 0a 20 20 20 20 46 74 73 35 49 74   = 0;.    Fts5It
25240 65 72 20 2a 70 31 20 3d 20 30 3b 20 20 20 20 20  er *p1 = 0;     
25250 2f 2a 20 49 74 65 72 61 74 6f 72 20 75 73 65 64  /* Iterator used
25260 20 74 6f 20 67 61 74 68 65 72 20 64 61 74 61 20   to gather data 
25270 66 72 6f 6d 20 69 6e 64 65 78 20 2a 2f 0a 20 20  from index */.  
25280 20 20 46 74 73 35 44 61 74 61 20 2a 70 44 61 74    Fts5Data *pDat
25290 61 3b 0a 20 20 20 20 46 74 73 35 42 75 66 66 65  a;.    Fts5Buffe
252a0 72 20 64 6f 63 6c 69 73 74 3b 0a 20 20 20 20 69  r doclist;.    i
252b0 6e 74 20 62 4e 65 77 54 65 72 6d 20 3d 20 31 3b  nt bNewTerm = 1;
252c0 0a 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 64 6f  ..    memset(&do
252d0 63 6c 69 73 74 2c 20 30 2c 20 73 69 7a 65 6f 66  clist, 0, sizeof
252e0 28 64 6f 63 6c 69 73 74 29 29 3b 0a 20 20 20 20  (doclist));.    
252f0 66 74 73 35 4d 75 6c 74 69 49 74 65 72 4e 65 77  fts5MultiIterNew
25300 28 70 2c 20 70 53 74 72 75 63 74 2c 20 66 6c 61  (p, pStruct, fla
25310 67 73 2c 20 70 43 6f 6c 73 65 74 2c 20 70 54 6f  gs, pColset, pTo
25320 6b 65 6e 2c 20 6e 54 6f 6b 65 6e 2c 20 2d 31 2c  ken, nToken, -1,
25330 20 30 2c 20 26 70 31 29 3b 0a 20 20 20 20 66 74   0, &p1);.    ft
25340 73 35 49 74 65 72 53 65 74 4f 75 74 70 75 74 43  s5IterSetOutputC
25350 62 28 26 70 2d 3e 72 63 2c 20 70 31 29 3b 0a 20  b(&p->rc, p1);. 
25360 20 20 20 66 6f 72 28 20 2f 2a 20 6e 6f 2d 6f 70     for( /* no-op
25370 20 2a 2f 20 3b 0a 20 20 20 20 20 20 20 20 66 74   */ ;.        ft
25380 73 35 4d 75 6c 74 69 49 74 65 72 45 6f 66 28 70  s5MultiIterEof(p
25390 2c 20 70 31 29 3d 3d 30 3b 0a 20 20 20 20 20 20  , p1)==0;.      
253a0 20 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 4e    fts5MultiIterN
253b0 65 78 74 32 28 70 2c 20 70 31 2c 20 26 62 4e 65  ext2(p, p1, &bNe
253c0 77 54 65 72 6d 29 0a 20 20 20 20 29 7b 0a 20 20  wTerm).    ){.  
253d0 20 20 20 20 46 74 73 35 53 65 67 49 74 65 72 20      Fts5SegIter 
253e0 2a 70 53 65 67 20 3d 20 26 70 31 2d 3e 61 53 65  *pSeg = &p1->aSe
253f0 67 5b 20 70 31 2d 3e 61 46 69 72 73 74 5b 31 5d  g[ p1->aFirst[1]
25400 2e 69 46 69 72 73 74 20 5d 3b 0a 20 20 20 20 20  .iFirst ];.     
25410 20 69 6e 74 20 6e 54 65 72 6d 20 3d 20 70 53 65   int nTerm = pSe
25420 67 2d 3e 74 65 72 6d 2e 6e 3b 0a 20 20 20 20 20  g->term.n;.     
25430 20 63 6f 6e 73 74 20 75 38 20 2a 70 54 65 72 6d   const u8 *pTerm
25440 20 3d 20 70 53 65 67 2d 3e 74 65 72 6d 2e 70 3b   = pSeg->term.p;
25450 0a 20 20 20 20 20 20 70 31 2d 3e 78 53 65 74 4f  .      p1->xSetO
25460 75 74 70 75 74 73 28 70 31 2c 20 70 53 65 67 29  utputs(p1, pSeg)
25470 3b 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74 5f  ;..      assert_
25480 6e 63 28 20 6d 65 6d 63 6d 70 28 70 54 6f 6b 65  nc( memcmp(pToke
25490 6e 2c 20 70 54 65 72 6d 2c 20 4d 49 4e 28 6e 54  n, pTerm, MIN(nT
254a0 6f 6b 65 6e 2c 20 6e 54 65 72 6d 29 29 3c 3d 30  oken, nTerm))<=0
254b0 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 62 4e   );.      if( bN
254c0 65 77 54 65 72 6d 20 29 7b 0a 20 20 20 20 20 20  ewTerm ){.      
254d0 20 20 69 66 28 20 6e 54 65 72 6d 3c 6e 54 6f 6b    if( nTerm<nTok
254e0 65 6e 20 7c 7c 20 6d 65 6d 63 6d 70 28 70 54 6f  en || memcmp(pTo
254f0 6b 65 6e 2c 20 70 54 65 72 6d 2c 20 6e 54 6f 6b  ken, pTerm, nTok
25500 65 6e 29 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  en) ) break;.   
25510 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20     }..      if( 
25520 70 31 2d 3e 62 61 73 65 2e 6e 44 61 74 61 3d 3d  p1->base.nData==
25530 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 0a 20  0 ) continue;.. 
25540 20 20 20 20 20 69 66 28 20 70 31 2d 3e 62 61 73       if( p1->bas
25550 65 2e 69 52 6f 77 69 64 3c 3d 69 4c 61 73 74 52  e.iRowid<=iLastR
25560 6f 77 69 64 20 26 26 20 64 6f 63 6c 69 73 74 2e  owid && doclist.
25570 6e 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 66  n>0 ){.        f
25580 6f 72 28 69 3d 30 3b 20 70 2d 3e 72 63 3d 3d 53  or(i=0; p->rc==S
25590 51 4c 49 54 45 5f 4f 4b 20 26 26 20 64 6f 63 6c  QLITE_OK && docl
255a0 69 73 74 2e 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20  ist.n; i++){.   
255b0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69         assert( i
255c0 3c 6e 42 75 66 20 29 3b 0a 20 20 20 20 20 20 20  <nBuf );.       
255d0 20 20 20 69 66 28 20 61 42 75 66 5b 69 5d 2e 6e     if( aBuf[i].n
255e0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
255f0 20 20 20 66 74 73 35 42 75 66 66 65 72 53 77 61     fts5BufferSwa
25600 70 28 26 64 6f 63 6c 69 73 74 2c 20 26 61 42 75  p(&doclist, &aBu
25610 66 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 20  f[i]);.         
25620 20 20 20 66 74 73 35 42 75 66 66 65 72 5a 65 72     fts5BufferZer
25630 6f 28 26 64 6f 63 6c 69 73 74 29 3b 0a 20 20 20  o(&doclist);.   
25640 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
25650 20 20 20 20 20 20 20 20 20 20 78 4d 65 72 67 65            xMerge
25660 28 70 2c 20 26 64 6f 63 6c 69 73 74 2c 20 26 61  (p, &doclist, &a
25670 42 75 66 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20  Buf[i]);.       
25680 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72 5a       fts5BufferZ
25690 65 72 6f 28 26 61 42 75 66 5b 69 5d 29 3b 0a 20  ero(&aBuf[i]);. 
256a0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
256b0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 4c 61     }.        iLa
256c0 73 74 52 6f 77 69 64 20 3d 20 30 3b 0a 20 20 20  stRowid = 0;.   
256d0 20 20 20 7d 0a 0a 20 20 20 20 20 20 78 41 70 70     }..      xApp
256e0 65 6e 64 28 70 2c 20 70 31 2d 3e 62 61 73 65 2e  end(p, p1->base.
256f0 69 52 6f 77 69 64 2d 69 4c 61 73 74 52 6f 77 69  iRowid-iLastRowi
25700 64 2c 20 70 31 2c 20 26 64 6f 63 6c 69 73 74 29  d, p1, &doclist)
25710 3b 0a 20 20 20 20 20 20 69 4c 61 73 74 52 6f 77  ;.      iLastRow
25720 69 64 20 3d 20 70 31 2d 3e 62 61 73 65 2e 69 52  id = p1->base.iR
25730 6f 77 69 64 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  owid;.    }..   
25740 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 42 75 66   for(i=0; i<nBuf
25750 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  ; i++){.      if
25760 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
25770 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 78 4d  OK ){.        xM
25780 65 72 67 65 28 70 2c 20 26 64 6f 63 6c 69 73 74  erge(p, &doclist
25790 2c 20 26 61 42 75 66 5b 69 5d 29 3b 0a 20 20 20  , &aBuf[i]);.   
257a0 20 20 20 7d 0a 20 20 20 20 20 20 66 74 73 35 42     }.      fts5B
257b0 75 66 66 65 72 46 72 65 65 28 26 61 42 75 66 5b  ufferFree(&aBuf[
257c0 69 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66  i]);.    }.    f
257d0 74 73 35 4d 75 6c 74 69 49 74 65 72 46 72 65 65  ts5MultiIterFree
257e0 28 70 31 29 3b 0a 0a 20 20 20 20 70 44 61 74 61  (p1);..    pData
257f0 20 3d 20 66 74 73 35 49 64 78 4d 61 6c 6c 6f 63   = fts5IdxMalloc
25800 28 70 2c 20 73 69 7a 65 6f 66 28 46 74 73 35 44  (p, sizeof(Fts5D
25810 61 74 61 29 20 2b 20 64 6f 63 6c 69 73 74 2e 6e  ata) + doclist.n
25820 29 3b 0a 20 20 20 20 69 66 28 20 70 44 61 74 61  );.    if( pData
25830 20 29 7b 0a 20 20 20 20 20 20 70 44 61 74 61 2d   ){.      pData-
25840 3e 70 20 3d 20 28 75 38 2a 29 26 70 44 61 74 61  >p = (u8*)&pData
25850 5b 31 5d 3b 0a 20 20 20 20 20 20 70 44 61 74 61  [1];.      pData
25860 2d 3e 6e 6e 20 3d 20 70 44 61 74 61 2d 3e 73 7a  ->nn = pData->sz
25870 4c 65 61 66 20 3d 20 64 6f 63 6c 69 73 74 2e 6e  Leaf = doclist.n
25880 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70  ;.      memcpy(p
25890 44 61 74 61 2d 3e 70 2c 20 64 6f 63 6c 69 73 74  Data->p, doclist
258a0 2e 70 2c 20 64 6f 63 6c 69 73 74 2e 6e 29 3b 0a  .p, doclist.n);.
258b0 20 20 20 20 20 20 66 74 73 35 4d 75 6c 74 69 49        fts5MultiI
258c0 74 65 72 4e 65 77 32 28 70 2c 20 70 44 61 74 61  terNew2(p, pData
258d0 2c 20 62 44 65 73 63 2c 20 70 70 49 74 65 72 29  , bDesc, ppIter)
258e0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 74 73 35  ;.    }.    fts5
258f0 42 75 66 66 65 72 46 72 65 65 28 26 64 6f 63 6c  BufferFree(&docl
25900 69 73 74 29 3b 0a 20 20 7d 0a 0a 20 20 66 74 73  ist);.  }..  fts
25910 35 53 74 72 75 63 74 75 72 65 52 65 6c 65 61 73  5StructureReleas
25920 65 28 70 53 74 72 75 63 74 29 3b 0a 20 20 73 71  e(pStruct);.  sq
25930 6c 69 74 65 33 5f 66 72 65 65 28 61 42 75 66 29  lite3_free(aBuf)
25940 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 49 6e 64 69  ;.}.../*.** Indi
25950 63 61 74 65 20 74 68 61 74 20 61 6c 6c 20 73 75  cate that all su
25960 62 73 65 71 75 65 6e 74 20 63 61 6c 6c 73 20 74  bsequent calls t
25970 6f 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64  o sqlite3Fts5Ind
25980 65 78 57 72 69 74 65 28 29 20 70 65 72 74 61 69  exWrite() pertai
25990 6e 0a 2a 2a 20 74 6f 20 74 68 65 20 64 6f 63 75  n.** to the docu
259a0 6d 65 6e 74 20 77 69 74 68 20 72 6f 77 69 64 20  ment with rowid 
259b0 69 52 6f 77 69 64 2e 0a 2a 2f 0a 69 6e 74 20 73  iRowid..*/.int s
259c0 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78 42  qlite3Fts5IndexB
259d0 65 67 69 6e 57 72 69 74 65 28 46 74 73 35 49 6e  eginWrite(Fts5In
259e0 64 65 78 20 2a 70 2c 20 69 6e 74 20 62 44 65 6c  dex *p, int bDel
259f0 65 74 65 2c 20 69 36 34 20 69 52 6f 77 69 64 29  ete, i64 iRowid)
25a00 7b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72  {.  assert( p->r
25a10 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  c==SQLITE_OK );.
25a20 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 74  .  /* Allocate t
25a30 68 65 20 68 61 73 68 20 74 61 62 6c 65 20 69 66  he hash table if
25a40 20 69 74 20 68 61 73 20 6e 6f 74 20 61 6c 72 65   it has not alre
25a50 61 64 79 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74  ady been allocat
25a60 65 64 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70  ed */.  if( p->p
25a70 48 61 73 68 3d 3d 30 20 29 7b 0a 20 20 20 20 70  Hash==0 ){.    p
25a80 2d 3e 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74  ->rc = sqlite3Ft
25a90 73 35 48 61 73 68 4e 65 77 28 70 2d 3e 70 43 6f  s5HashNew(p->pCo
25aa0 6e 66 69 67 2c 20 26 70 2d 3e 70 48 61 73 68 2c  nfig, &p->pHash,
25ab0 20 26 70 2d 3e 6e 50 65 6e 64 69 6e 67 44 61 74   &p->nPendingDat
25ac0 61 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 6c  a);.  }..  /* Fl
25ad0 75 73 68 20 74 68 65 20 68 61 73 68 20 74 61 62  ush the hash tab
25ae0 6c 65 20 74 6f 20 64 69 73 6b 20 69 66 20 72 65  le to disk if re
25af0 71 75 69 72 65 64 20 2a 2f 0a 20 20 69 66 28 20  quired */.  if( 
25b00 69 52 6f 77 69 64 3c 70 2d 3e 69 57 72 69 74 65  iRowid<p->iWrite
25b10 52 6f 77 69 64 20 0a 20 20 20 7c 7c 20 28 69 52  Rowid .   || (iR
25b20 6f 77 69 64 3d 3d 70 2d 3e 69 57 72 69 74 65 52  owid==p->iWriteR
25b30 6f 77 69 64 20 26 26 20 70 2d 3e 62 44 65 6c 65  owid && p->bDele
25b40 74 65 3d 3d 30 29 0a 20 20 20 7c 7c 20 28 70 2d  te==0).   || (p-
25b50 3e 6e 50 65 6e 64 69 6e 67 44 61 74 61 20 3e 20  >nPendingData > 
25b60 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e 6e 48 61 73  p->pConfig->nHas
25b70 68 53 69 7a 65 29 20 0a 20 20 29 7b 0a 20 20 20  hSize) .  ){.   
25b80 20 66 74 73 35 49 6e 64 65 78 46 6c 75 73 68 28   fts5IndexFlush(
25b90 70 29 3b 0a 20 20 7d 0a 0a 20 20 70 2d 3e 69 57  p);.  }..  p->iW
25ba0 72 69 74 65 52 6f 77 69 64 20 3d 20 69 52 6f 77  riteRowid = iRow
25bb0 69 64 3b 0a 20 20 70 2d 3e 62 44 65 6c 65 74 65  id;.  p->bDelete
25bc0 20 3d 20 62 44 65 6c 65 74 65 3b 0a 20 20 72 65   = bDelete;.  re
25bd0 74 75 72 6e 20 66 74 73 35 49 6e 64 65 78 52 65  turn fts5IndexRe
25be0 74 75 72 6e 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn(p);.}../*.*
25bf0 2a 20 43 6f 6d 6d 69 74 20 64 61 74 61 20 74 6f  * Commit data to
25c00 20 64 69 73 6b 2e 0a 2a 2f 0a 69 6e 74 20 73 71   disk..*/.int sq
25c10 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78 53 79  lite3Fts5IndexSy
25c20 6e 63 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c  nc(Fts5Index *p,
25c30 20 69 6e 74 20 62 43 6f 6d 6d 69 74 29 7b 0a 20   int bCommit){. 
25c40 20 61 73 73 65 72 74 28 20 70 2d 3e 72 63 3d 3d   assert( p->rc==
25c50 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 66  SQLITE_OK );.  f
25c60 74 73 35 49 6e 64 65 78 46 6c 75 73 68 28 70 29  ts5IndexFlush(p)
25c70 3b 0a 20 20 69 66 28 20 62 43 6f 6d 6d 69 74 20  ;.  if( bCommit 
25c80 29 20 66 74 73 35 43 6c 6f 73 65 52 65 61 64 65  ) fts5CloseReade
25c90 72 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 66  r(p);.  return f
25ca0 74 73 35 49 6e 64 65 78 52 65 74 75 72 6e 28 70  ts5IndexReturn(p
25cb0 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 69 73 63  );.}../*.** Disc
25cc0 61 72 64 20 61 6e 79 20 64 61 74 61 20 73 74 6f  ard any data sto
25cd0 72 65 64 20 69 6e 20 74 68 65 20 69 6e 2d 6d 65  red in the in-me
25ce0 6d 6f 72 79 20 68 61 73 68 20 74 61 62 6c 65 73  mory hash tables
25cf0 2e 20 44 6f 20 6e 6f 74 20 77 72 69 74 65 20 69  . Do not write i
25d00 74 0a 2a 2a 20 74 6f 20 74 68 65 20 64 61 74 61  t.** to the data
25d10 62 61 73 65 2e 20 41 64 64 69 74 69 6f 6e 61 6c  base. Additional
25d20 6c 79 2c 20 61 73 73 75 6d 65 20 74 68 61 74 20  ly, assume that 
25d30 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
25d40 74 68 65 20 25 5f 64 61 74 61 0a 2a 2a 20 74 61  the %_data.** ta
25d50 62 6c 65 20 6d 61 79 20 68 61 76 65 20 63 68 61  ble may have cha
25d60 6e 67 65 64 20 6f 6e 20 64 69 73 6b 2e 20 53 6f  nged on disk. So
25d70 20 61 6e 79 20 69 6e 2d 6d 65 6d 6f 72 79 20 63   any in-memory c
25d80 61 63 68 65 73 20 6f 66 20 25 5f 64 61 74 61 20  aches of %_data 
25d90 0a 2a 2a 20 72 65 63 6f 72 64 73 20 6d 75 73 74  .** records must
25da0 20 62 65 20 69 6e 76 61 6c 69 64 61 74 65 64 2e   be invalidated.
25db0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46  .*/.int sqlite3F
25dc0 74 73 35 49 6e 64 65 78 52 6f 6c 6c 62 61 63 6b  ts5IndexRollback
25dd0 28 46 74 73 35 49 6e 64 65 78 20 2a 70 29 7b 0a  (Fts5Index *p){.
25de0 20 20 66 74 73 35 43 6c 6f 73 65 52 65 61 64 65    fts5CloseReade
25df0 72 28 70 29 3b 0a 20 20 66 74 73 35 49 6e 64 65  r(p);.  fts5Inde
25e00 78 44 69 73 63 61 72 64 44 61 74 61 28 70 29 3b  xDiscardData(p);
25e10 0a 20 20 2f 2a 20 61 73 73 65 72 74 28 20 70 2d  .  /* assert( p-
25e20 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  >rc==SQLITE_OK )
25e30 3b 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 53 51  ; */.  return SQ
25e40 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
25e50 2a 20 54 68 65 20 25 5f 64 61 74 61 20 74 61 62  * The %_data tab
25e60 6c 65 20 69 73 20 63 6f 6d 70 6c 65 74 65 6c 79  le is completely
25e70 20 65 6d 70 74 79 20 77 68 65 6e 20 74 68 69 73   empty when this
25e80 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
25e90 6c 65 64 2e 20 54 68 69 73 0a 2a 2a 20 66 75 6e  led. This.** fun
25ea0 63 74 69 6f 6e 20 70 6f 70 75 6c 61 74 65 73 20  ction populates 
25eb0 69 74 20 77 69 74 68 20 74 68 65 20 69 6e 69 74  it with the init
25ec0 69 61 6c 20 73 74 72 75 63 74 75 72 65 20 6f 62  ial structure ob
25ed0 6a 65 63 74 73 20 66 6f 72 20 65 61 63 68 20 69  jects for each i
25ee0 6e 64 65 78 2c 0a 2a 2a 20 61 6e 64 20 74 68 65  ndex,.** and the
25ef0 20 69 6e 69 74 69 61 6c 20 76 65 72 73 69 6f 6e   initial version
25f00 20 6f 66 20 74 68 65 20 22 61 76 65 72 61 67 65   of the "average
25f10 73 22 20 72 65 63 6f 72 64 20 28 61 20 7a 65 72  s" record (a zer
25f20 6f 2d 62 79 74 65 20 62 6c 6f 62 29 2e 0a 2a 2f  o-byte blob)..*/
25f30 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35  .int sqlite3Fts5
25f40 49 6e 64 65 78 52 65 69 6e 69 74 28 46 74 73 35  IndexReinit(Fts5
25f50 49 6e 64 65 78 20 2a 70 29 7b 0a 20 20 46 74 73  Index *p){.  Fts
25f60 35 53 74 72 75 63 74 75 72 65 20 73 3b 0a 20 20  5Structure s;.  
25f70 6d 65 6d 73 65 74 28 26 73 2c 20 30 2c 20 73 69  memset(&s, 0, si
25f80 7a 65 6f 66 28 46 74 73 35 53 74 72 75 63 74 75  zeof(Fts5Structu
25f90 72 65 29 29 3b 0a 20 20 66 74 73 35 44 61 74 61  re));.  fts5Data
25fa0 57 72 69 74 65 28 70 2c 20 46 54 53 35 5f 41 56  Write(p, FTS5_AV
25fb0 45 52 41 47 45 53 5f 52 4f 57 49 44 2c 20 28 63  ERAGES_ROWID, (c
25fc0 6f 6e 73 74 20 75 38 2a 29 22 22 2c 20 30 29 3b  onst u8*)"", 0);
25fd0 0a 20 20 66 74 73 35 53 74 72 75 63 74 75 72 65  .  fts5Structure
25fe0 57 72 69 74 65 28 70 2c 20 26 73 29 3b 0a 20 20  Write(p, &s);.  
25ff0 72 65 74 75 72 6e 20 66 74 73 35 49 6e 64 65 78  return fts5Index
26000 52 65 74 75 72 6e 28 70 29 3b 0a 7d 0a 0a 2f 2a  Return(p);.}../*
26010 0a 2a 2a 20 4f 70 65 6e 20 61 20 6e 65 77 20 46  .** Open a new F
26020 74 73 35 49 6e 64 65 78 20 68 61 6e 64 6c 65 2e  ts5Index handle.
26030 20 49 66 20 74 68 65 20 62 43 72 65 61 74 65 20   If the bCreate 
26040 61 72 67 75 6d 65 6e 74 20 69 73 20 74 72 75 65  argument is true
26050 2c 20 63 72 65 61 74 65 0a 2a 2a 20 61 6e 64 20  , create.** and 
26060 69 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 75  initialize the u
26070 6e 64 65 72 6c 79 69 6e 67 20 25 5f 64 61 74 61  nderlying %_data
26080 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66   table..**.** If
26090 20 73 75 63 63 65 73 73 66 75 6c 2c 20 73 65 74   successful, set
260a0 20 2a 70 70 20 74 6f 20 70 6f 69 6e 74 20 74 6f   *pp to point to
260b0 20 74 68 65 20 6e 65 77 20 6f 62 6a 65 63 74 20   the new object 
260c0 61 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54  and return SQLIT
260d0 45 5f 4f 4b 2e 0a 2a 2a 20 4f 74 68 65 72 77 69  E_OK..** Otherwi
260e0 73 65 2c 20 73 65 74 20 2a 70 70 20 74 6f 20 4e  se, set *pp to N
260f0 55 4c 4c 20 61 6e 64 20 72 65 74 75 72 6e 20 61  ULL and return a
26100 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63  n SQLite error c
26110 6f 64 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ode..*/.int sqli
26120 74 65 33 46 74 73 35 49 6e 64 65 78 4f 70 65 6e  te3Fts5IndexOpen
26130 28 0a 20 20 46 74 73 35 43 6f 6e 66 69 67 20 2a  (.  Fts5Config *
26140 70 43 6f 6e 66 69 67 2c 20 0a 20 20 69 6e 74 20  pConfig, .  int 
26150 62 43 72 65 61 74 65 2c 20 0a 20 20 46 74 73 35  bCreate, .  Fts5
26160 49 6e 64 65 78 20 2a 2a 70 70 2c 0a 20 20 63 68  Index **pp,.  ch
26170 61 72 20 2a 2a 70 7a 45 72 72 0a 29 7b 0a 20 20  ar **pzErr.){.  
26180 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
26190 4f 4b 3b 0a 20 20 46 74 73 35 49 6e 64 65 78 20  OK;.  Fts5Index 
261a0 2a 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  *p;             
261b0 20 20 20 20 20 20 2f 2a 20 4e 65 77 20 6f 62 6a        /* New obj
261c0 65 63 74 20 2a 2f 0a 0a 20 20 2a 70 70 20 3d 20  ect */..  *pp = 
261d0 70 20 3d 20 28 46 74 73 35 49 6e 64 65 78 2a 29  p = (Fts5Index*)
261e0 73 71 6c 69 74 65 33 46 74 73 35 4d 61 6c 6c 6f  sqlite3Fts5Mallo
261f0 63 5a 65 72 6f 28 26 72 63 2c 20 73 69 7a 65 6f  cZero(&rc, sizeo
26200 66 28 46 74 73 35 49 6e 64 65 78 29 29 3b 0a 20  f(Fts5Index));. 
26210 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
26220 4f 4b 20 29 7b 0a 20 20 20 20 70 2d 3e 70 43 6f  OK ){.    p->pCo
26230 6e 66 69 67 20 3d 20 70 43 6f 6e 66 69 67 3b 0a  nfig = pConfig;.
26240 20 20 20 20 70 2d 3e 6e 57 6f 72 6b 55 6e 69 74      p->nWorkUnit
26250 20 3d 20 46 54 53 35 5f 57 4f 52 4b 5f 55 4e 49   = FTS5_WORK_UNI
26260 54 3b 0a 20 20 20 20 70 2d 3e 7a 44 61 74 61 54  T;.    p->zDataT
26270 62 6c 20 3d 20 73 71 6c 69 74 65 33 46 74 73 35  bl = sqlite3Fts5
26280 4d 70 72 69 6e 74 66 28 26 72 63 2c 20 22 25 73  Mprintf(&rc, "%s
26290 5f 64 61 74 61 22 2c 20 70 43 6f 6e 66 69 67 2d  _data", pConfig-
262a0 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28  >zName);.    if(
262b0 20 70 2d 3e 7a 44 61 74 61 54 62 6c 20 26 26 20   p->zDataTbl && 
262c0 62 43 72 65 61 74 65 20 29 7b 0a 20 20 20 20 20  bCreate ){.     
262d0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74 73   rc = sqlite3Fts
262e0 35 43 72 65 61 74 65 54 61 62 6c 65 28 0a 20 20  5CreateTable(.  
262f0 20 20 20 20 20 20 20 20 70 43 6f 6e 66 69 67 2c          pConfig,
26300 20 22 64 61 74 61 22 2c 20 22 69 64 20 49 4e 54   "data", "id INT
26310 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59  EGER PRIMARY KEY
26320 2c 20 62 6c 6f 63 6b 20 42 4c 4f 42 22 2c 20 30  , block BLOB", 0
26330 2c 20 70 7a 45 72 72 0a 20 20 20 20 20 20 29 3b  , pzErr.      );
26340 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
26350 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
26360 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
26370 46 74 73 35 43 72 65 61 74 65 54 61 62 6c 65 28  Fts5CreateTable(
26380 70 43 6f 6e 66 69 67 2c 20 22 69 64 78 22 2c 20  pConfig, "idx", 
26390 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 73 65  .            "se
263a0 67 69 64 2c 20 74 65 72 6d 2c 20 70 67 6e 6f 2c  gid, term, pgno,
263b0 20 50 52 49 4d 41 52 59 20 4b 45 59 28 73 65 67   PRIMARY KEY(seg
263c0 69 64 2c 20 74 65 72 6d 29 22 2c 20 0a 20 20 20  id, term)", .   
263d0 20 20 20 20 20 20 20 20 20 31 2c 20 70 7a 45 72           1, pzEr
263e0 72 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20  r.        );.   
263f0 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72     }.      if( r
26400 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
26410 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
26420 69 74 65 33 46 74 73 35 49 6e 64 65 78 52 65 69  ite3Fts5IndexRei
26430 6e 69 74 28 70 29 3b 0a 20 20 20 20 20 20 7d 0a  nit(p);.      }.
26440 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 61 73 73      }.  }..  ass
26450 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f  ert( rc!=SQLITE_
26460 4f 4b 20 7c 7c 20 70 2d 3e 72 63 3d 3d 53 51 4c  OK || p->rc==SQL
26470 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 69 66 28 20  ITE_OK );.  if( 
26480 72 63 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  rc ){.    sqlite
26490 33 46 74 73 35 49 6e 64 65 78 43 6c 6f 73 65 28  3Fts5IndexClose(
264a0 70 29 3b 0a 20 20 20 20 2a 70 70 20 3d 20 30 3b  p);.    *pp = 0;
264b0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
264c0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65  ;.}../*.** Close
264d0 20 61 20 68 61 6e 64 6c 65 20 6f 70 65 6e 65 64   a handle opened
264e0 20 62 79 20 61 6e 20 65 61 72 6c 69 65 72 20 63   by an earlier c
264f0 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 46 74  all to sqlite3Ft
26500 73 35 49 6e 64 65 78 4f 70 65 6e 28 29 2e 0a 2a  s5IndexOpen()..*
26510 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73  /.int sqlite3Fts
26520 35 49 6e 64 65 78 43 6c 6f 73 65 28 46 74 73 35  5IndexClose(Fts5
26530 49 6e 64 65 78 20 2a 70 29 7b 0a 20 20 69 6e 74  Index *p){.  int
26540 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
26550 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20  .  if( p ){.    
26560 61 73 73 65 72 74 28 20 70 2d 3e 70 52 65 61 64  assert( p->pRead
26570 65 72 3d 3d 30 20 29 3b 0a 20 20 20 20 73 71 6c  er==0 );.    sql
26580 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 2d  ite3_finalize(p-
26590 3e 70 57 72 69 74 65 72 29 3b 0a 20 20 20 20 73  >pWriter);.    s
265a0 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28  qlite3_finalize(
265b0 70 2d 3e 70 44 65 6c 65 74 65 72 29 3b 0a 20 20  p->pDeleter);.  
265c0 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69    sqlite3_finali
265d0 7a 65 28 70 2d 3e 70 49 64 78 57 72 69 74 65 72  ze(p->pIdxWriter
265e0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
265f0 69 6e 61 6c 69 7a 65 28 70 2d 3e 70 49 64 78 44  inalize(p->pIdxD
26600 65 6c 65 74 65 72 29 3b 0a 20 20 20 20 73 71 6c  eleter);.    sql
26610 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 2d  ite3_finalize(p-
26620 3e 70 49 64 78 53 65 6c 65 63 74 29 3b 0a 20 20  >pIdxSelect);.  
26630 20 20 73 71 6c 69 74 65 33 46 74 73 35 48 61 73    sqlite3Fts5Has
26640 68 46 72 65 65 28 70 2d 3e 70 48 61 73 68 29 3b  hFree(p->pHash);
26650 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
26660 65 28 70 2d 3e 7a 44 61 74 61 54 62 6c 29 3b 0a  e(p->zDataTbl);.
26670 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
26680 28 70 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  (p);.  }.  retur
26690 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  n rc;.}../*.** A
266a0 72 67 75 6d 65 6e 74 20 70 20 70 6f 69 6e 74 73  rgument p points
266b0 20 74 6f 20 61 20 62 75 66 66 65 72 20 63 6f 6e   to a buffer con
266c0 74 61 69 6e 69 6e 67 20 75 74 66 2d 38 20 74 65  taining utf-8 te
266d0 78 74 20 74 68 61 74 20 69 73 20 6e 20 62 79 74  xt that is n byt
266e0 65 73 20 69 6e 20 0a 2a 2a 20 73 69 7a 65 2e 20  es in .** size. 
266f0 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65  Return the numbe
26700 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20 74 68  r of bytes in th
26710 65 20 6e 43 68 61 72 20 63 68 61 72 61 63 74 65  e nChar characte
26720 72 20 70 72 65 66 69 78 20 6f 66 20 74 68 65 0a  r prefix of the.
26730 2a 2a 20 62 75 66 66 65 72 2c 20 6f 72 20 30 20  ** buffer, or 0 
26740 69 66 20 74 68 65 72 65 20 61 72 65 20 6c 65 73  if there are les
26750 73 20 74 68 61 6e 20 6e 43 68 61 72 20 63 68 61  s than nChar cha
26760 72 61 63 74 65 72 73 20 69 6e 20 74 6f 74 61 6c  racters in total
26770 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
26780 46 74 73 35 49 6e 64 65 78 43 68 61 72 6c 65 6e  Fts5IndexCharlen
26790 54 6f 42 79 74 65 6c 65 6e 28 0a 20 20 63 6f 6e  ToBytelen(.  con
267a0 73 74 20 63 68 61 72 20 2a 70 2c 20 0a 20 20 69  st char *p, .  i
267b0 6e 74 20 6e 42 79 74 65 2c 20 0a 20 20 69 6e 74  nt nByte, .  int
267c0 20 6e 43 68 61 72 0a 29 7b 0a 20 20 69 6e 74 20   nChar.){.  int 
267d0 6e 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 3b 0a  n = 0;.  int i;.
267e0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 68    for(i=0; i<nCh
267f0 61 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66  ar; i++){.    if
26800 28 20 6e 3e 3d 6e 42 79 74 65 20 29 20 72 65 74  ( n>=nByte ) ret
26810 75 72 6e 20 30 3b 20 20 20 20 20 20 2f 2a 20 49  urn 0;      /* I
26820 6e 70 75 74 20 63 6f 6e 74 61 69 6e 73 20 66 65  nput contains fe
26830 77 65 72 20 74 68 61 6e 20 6e 43 68 61 72 20 63  wer than nChar c
26840 68 61 72 73 20 2a 2f 0a 20 20 20 20 69 66 28 20  hars */.    if( 
26850 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 29 70  (unsigned char)p
26860 5b 6e 2b 2b 5d 3e 3d 30 78 63 30 20 29 7b 0a 20  [n++]>=0xc0 ){. 
26870 20 20 20 20 20 77 68 69 6c 65 28 20 28 70 5b 6e       while( (p[n
26880 5d 20 26 20 30 78 63 30 29 3d 3d 30 78 38 30 20  ] & 0xc0)==0x80 
26890 29 20 6e 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d  ) n++;.    }.  }
268a0 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a  .  return n;.}..
268b0 2f 2a 0a 2a 2a 20 70 49 6e 20 69 73 20 61 20 55  /*.** pIn is a U
268c0 54 46 2d 38 20 65 6e 63 6f 64 65 64 20 73 74 72  TF-8 encoded str
268d0 69 6e 67 2c 20 6e 49 6e 20 62 79 74 65 73 20 69  ing, nIn bytes i
268e0 6e 20 73 69 7a 65 2e 20 52 65 74 75 72 6e 20 74  n size. Return t
268f0 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20  he number of.** 
26900 75 6e 69 63 6f 64 65 20 63 68 61 72 61 63 74 65  unicode characte
26910 72 73 20 69 6e 20 74 68 65 20 73 74 72 69 6e 67  rs in the string
26920 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
26930 66 74 73 35 49 6e 64 65 78 43 68 61 72 6c 65 6e  fts5IndexCharlen
26940 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 70 49 6e  (const char *pIn
26950 2c 20 69 6e 74 20 6e 49 6e 29 7b 0a 20 20 69 6e  , int nIn){.  in
26960 74 20 6e 43 68 61 72 20 3d 20 30 3b 20 20 20 20  t nChar = 0;    
26970 20 20 20 20 20 20 20 20 0a 20 20 69 6e 74 20 69          .  int i
26980 20 3d 20 30 3b 0a 20 20 77 68 69 6c 65 28 20 69   = 0;.  while( i
26990 3c 6e 49 6e 20 29 7b 0a 20 20 20 20 69 66 28 20  <nIn ){.    if( 
269a0 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 29 70  (unsigned char)p
269b0 49 6e 5b 69 2b 2b 5d 3e 3d 30 78 63 30 20 29 7b  In[i++]>=0xc0 ){
269c0 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 69 3c  .      while( i<
269d0 6e 49 6e 20 26 26 20 28 70 49 6e 5b 69 5d 20 26  nIn && (pIn[i] &
269e0 20 30 78 63 30 29 3d 3d 30 78 38 30 20 29 20 69   0xc0)==0x80 ) i
269f0 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 43  ++;.    }.    nC
26a00 68 61 72 2b 2b 3b 0a 20 20 7d 0a 20 20 72 65 74  har++;.  }.  ret
26a10 75 72 6e 20 6e 43 68 61 72 3b 0a 7d 0a 0a 2f 2a  urn nChar;.}../*
26a20 0a 2a 2a 20 49 6e 73 65 72 74 20 6f 72 20 72 65  .** Insert or re
26a30 6d 6f 76 65 20 64 61 74 61 20 74 6f 20 6f 72 20  move data to or 
26a40 66 72 6f 6d 20 74 68 65 20 69 6e 64 65 78 2e 20  from the index. 
26a50 45 61 63 68 20 74 69 6d 65 20 61 20 64 6f 63 75  Each time a docu
26a60 6d 65 6e 74 20 69 73 20 0a 2a 2a 20 61 64 64 65  ment is .** adde
26a70 64 20 74 6f 20 6f 72 20 72 65 6d 6f 76 65 64 20  d to or removed 
26a80 66 72 6f 6d 20 74 68 65 20 69 6e 64 65 78 2c 20  from the index, 
26a90 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
26aa0 20 63 61 6c 6c 65 64 20 6f 6e 65 20 6f 72 20 6d   called one or m
26ab0 6f 72 65 0a 2a 2a 20 74 69 6d 65 73 2e 0a 2a 2a  ore.** times..**
26ac0 0a 2a 2a 20 46 6f 72 20 61 6e 20 69 6e 73 65 72  .** For an inser
26ad0 74 2c 20 69 74 20 6d 75 73 74 20 62 65 20 63 61  t, it must be ca
26ae0 6c 6c 65 64 20 6f 6e 63 65 20 66 6f 72 20 65 61  lled once for ea
26af0 63 68 20 74 6f 6b 65 6e 20 69 6e 20 74 68 65 20  ch token in the 
26b00 6e 65 77 20 64 6f 63 75 6d 65 6e 74 2e 0a 2a 2a  new document..**
26b10 20 49 66 20 74 68 65 20 6f 70 65 72 61 74 69 6f   If the operatio
26b20 6e 20 69 73 20 61 20 64 65 6c 65 74 65 2c 20 69  n is a delete, i
26b30 74 20 6d 75 73 74 20 62 65 20 63 61 6c 6c 65 64  t must be called
26b40 20 28 61 74 20 6c 65 61 73 74 29 20 6f 6e 63 65   (at least) once
26b50 20 66 6f 72 20 65 61 63 68 0a 2a 2a 20 75 6e 69   for each.** uni
26b60 71 75 65 20 74 6f 6b 65 6e 20 69 6e 20 74 68 65  que token in the
26b70 20 64 6f 63 75 6d 65 6e 74 20 77 69 74 68 20 61   document with a
26b80 6e 20 69 43 6f 6c 20 76 61 6c 75 65 20 6c 65 73  n iCol value les
26b90 73 20 74 68 61 6e 20 7a 65 72 6f 2e 20 54 68 65  s than zero. The
26ba0 20 69 50 6f 73 0a 2a 2a 20 61 72 67 75 6d 65 6e   iPos.** argumen
26bb0 74 20 69 73 20 69 67 6e 6f 72 65 64 20 66 6f 72  t is ignored for
26bc0 20 61 20 64 65 6c 65 74 65 2e 0a 2a 2f 0a 69 6e   a delete..*/.in
26bd0 74 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64  t sqlite3Fts5Ind
26be0 65 78 57 72 69 74 65 28 0a 20 20 46 74 73 35 49  exWrite(.  Fts5I
26bf0 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20  ndex *p,        
26c00 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
26c10 64 65 78 20 74 6f 20 77 72 69 74 65 20 74 6f 20  dex to write to 
26c20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 2c 20 20  */.  int iCol,  
26c30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26c40 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 74       /* Column t
26c50 6f 6b 65 6e 20 61 70 70 65 61 72 73 20 69 6e 20  oken appears in 
26c60 28 2d 76 65 20 2d 3e 20 64 65 6c 65 74 65 29 20  (-ve -> delete) 
26c70 2a 2f 0a 20 20 69 6e 74 20 69 50 6f 73 2c 20 20  */.  int iPos,  
26c80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26c90 20 20 20 20 20 2f 2a 20 50 6f 73 69 74 69 6f 6e       /* Position
26ca0 20 6f 66 20 74 6f 6b 65 6e 20 77 69 74 68 69 6e   of token within
26cb0 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 63 6f 6e   column */.  con
26cc0 73 74 20 63 68 61 72 20 2a 70 54 6f 6b 65 6e 2c  st char *pToken,
26cd0 20 69 6e 74 20 6e 54 6f 6b 65 6e 20 20 2f 2a 20   int nToken  /* 
26ce0 54 6f 6b 65 6e 20 74 6f 20 61 64 64 20 6f 72 20  Token to add or 
26cf0 72 65 6d 6f 76 65 20 74 6f 20 6f 72 20 66 72 6f  remove to or fro
26d00 6d 20 69 6e 64 65 78 20 2a 2f 0a 29 7b 0a 20 20  m index */.){.  
26d10 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20  int i;          
26d20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26d30 2f 2a 20 55 73 65 64 20 74 6f 20 69 74 65 72 61  /* Used to itera
26d40 74 65 20 74 68 72 6f 75 67 68 20 69 6e 64 65 78  te through index
26d50 65 73 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d  es */.  int rc =
26d60 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20   SQLITE_OK;     
26d70 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
26d80 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 46 74 73 35  n code */.  Fts5
26d90 43 6f 6e 66 69 67 20 2a 70 43 6f 6e 66 69 67 20  Config *pConfig 
26da0 3d 20 70 2d 3e 70 43 6f 6e 66 69 67 3b 0a 0a 20  = p->pConfig;.. 
26db0 20 61 73 73 65 72 74 28 20 70 2d 3e 72 63 3d 3d   assert( p->rc==
26dc0 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 61  SQLITE_OK );.  a
26dd0 73 73 65 72 74 28 20 28 69 43 6f 6c 3c 30 29 3d  ssert( (iCol<0)=
26de0 3d 70 2d 3e 62 44 65 6c 65 74 65 20 29 3b 0a 0a  =p->bDelete );..
26df0 20 20 2f 2a 20 41 64 64 20 74 68 65 20 65 6e 74    /* Add the ent
26e00 72 79 20 74 6f 20 74 68 65 20 6d 61 69 6e 20 74  ry to the main t
26e10 65 72 6d 73 20 69 6e 64 65 78 2e 20 2a 2f 0a 20  erms index. */. 
26e20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74 73   rc = sqlite3Fts
26e30 35 48 61 73 68 57 72 69 74 65 28 0a 20 20 20 20  5HashWrite(.    
26e40 20 20 70 2d 3e 70 48 61 73 68 2c 20 70 2d 3e 69    p->pHash, p->i
26e50 57 72 69 74 65 52 6f 77 69 64 2c 20 69 43 6f 6c  WriteRowid, iCol
26e60 2c 20 69 50 6f 73 2c 20 46 54 53 35 5f 4d 41 49  , iPos, FTS5_MAI
26e70 4e 5f 50 52 45 46 49 58 2c 20 70 54 6f 6b 65 6e  N_PREFIX, pToken
26e80 2c 20 6e 54 6f 6b 65 6e 0a 20 20 29 3b 0a 0a 20  , nToken.  );.. 
26e90 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 43 6f 6e   for(i=0; i<pCon
26ea0 66 69 67 2d 3e 6e 50 72 65 66 69 78 20 26 26 20  fig->nPrefix && 
26eb0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20 69  rc==SQLITE_OK; i
26ec0 2b 2b 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 69  ++){.    const i
26ed0 6e 74 20 6e 43 68 61 72 20 3d 20 70 43 6f 6e 66  nt nChar = pConf
26ee0 69 67 2d 3e 61 50 72 65 66 69 78 5b 69 5d 3b 0a  ig->aPrefix[i];.
26ef0 20 20 20 20 69 6e 74 20 6e 42 79 74 65 20 3d 20      int nByte = 
26f00 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78  sqlite3Fts5Index
26f10 43 68 61 72 6c 65 6e 54 6f 42 79 74 65 6c 65 6e  CharlenToBytelen
26f20 28 70 54 6f 6b 65 6e 2c 20 6e 54 6f 6b 65 6e 2c  (pToken, nToken,
26f30 20 6e 43 68 61 72 29 3b 0a 20 20 20 20 69 66 28   nChar);.    if(
26f40 20 6e 42 79 74 65 20 29 7b 0a 20 20 20 20 20 20   nByte ){.      
26f50 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74 73 35  rc = sqlite3Fts5
26f60 48 61 73 68 57 72 69 74 65 28 70 2d 3e 70 48 61  HashWrite(p->pHa
26f70 73 68 2c 20 0a 20 20 20 20 20 20 20 20 20 20 70  sh, .          p
26f80 2d 3e 69 57 72 69 74 65 52 6f 77 69 64 2c 20 69  ->iWriteRowid, i
26f90 43 6f 6c 2c 20 69 50 6f 73 2c 20 28 63 68 61 72  Col, iPos, (char
26fa0 29 28 46 54 53 35 5f 4d 41 49 4e 5f 50 52 45 46  )(FTS5_MAIN_PREF
26fb0 49 58 2b 69 2b 31 29 2c 20 70 54 6f 6b 65 6e 2c  IX+i+1), pToken,
26fc0 0a 20 20 20 20 20 20 20 20 20 20 6e 42 79 74 65  .          nByte
26fd0 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a  .      );.    }.
26fe0 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63    }..  return rc
26ff0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20  ;.}../*.** Open 
27000 61 20 6e 65 77 20 69 74 65 72 61 74 6f 72 20 74  a new iterator t
27010 6f 20 69 74 65 72 61 74 65 20 74 68 6f 75 67 68  o iterate though
27020 20 61 6c 6c 20 72 6f 77 69 64 20 74 68 61 74 20   all rowid that 
27030 6d 61 74 63 68 20 74 68 65 20 0a 2a 2a 20 73 70  match the .** sp
27040 65 63 69 66 69 65 64 20 74 6f 6b 65 6e 20 6f 72  ecified token or
27050 20 74 6f 6b 65 6e 20 70 72 65 66 69 78 2e 0a 2a   token prefix..*
27060 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73  /.int sqlite3Fts
27070 35 49 6e 64 65 78 51 75 65 72 79 28 0a 20 20 46  5IndexQuery(.  F
27080 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20  ts5Index *p,    
27090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
270a0 2a 20 46 54 53 20 69 6e 64 65 78 20 74 6f 20 71  * FTS index to q
270b0 75 65 72 79 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  uery */.  const 
270c0 63 68 61 72 20 2a 70 54 6f 6b 65 6e 2c 20 69 6e  char *pToken, in
270d0 74 20 6e 54 6f 6b 65 6e 2c 20 2f 2a 20 54 6f 6b  t nToken, /* Tok
270e0 65 6e 20 28 6f 72 20 70 72 65 66 69 78 29 20 74  en (or prefix) t
270f0 6f 20 71 75 65 72 79 20 66 6f 72 20 2a 2f 0a 20  o query for */. 
27100 20 69 6e 74 20 66 6c 61 67 73 2c 20 20 20 20 20   int flags,     
27110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27120 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 46 54 53 35   /* Mask of FTS5
27130 49 4e 44 45 58 5f 51 55 45 52 59 5f 58 20 66 6c  INDEX_QUERY_X fl
27140 61 67 73 20 2a 2f 0a 20 20 46 74 73 35 43 6f 6c  ags */.  Fts5Col
27150 73 65 74 20 2a 70 43 6f 6c 73 65 74 2c 20 20 20  set *pColset,   
27160 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 74 63           /* Matc
27170 68 20 74 68 65 73 65 20 63 6f 6c 75 6d 6e 73 20  h these columns 
27180 6f 6e 6c 79 20 2a 2f 0a 20 20 46 74 73 35 49 6e  only */.  Fts5In
27190 64 65 78 49 74 65 72 20 2a 2a 70 70 49 74 65 72  dexIter **ppIter
271a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54            /* OUT
271b0 3a 20 4e 65 77 20 69 74 65 72 61 74 6f 72 20 6f  : New iterator o
271c0 62 6a 65 63 74 20 2a 2f 0a 29 7b 0a 20 20 46 74  bject */.){.  Ft
271d0 73 35 43 6f 6e 66 69 67 20 2a 70 43 6f 6e 66 69  s5Config *pConfi
271e0 67 20 3d 20 70 2d 3e 70 43 6f 6e 66 69 67 3b 0a  g = p->pConfig;.
271f0 20 20 46 74 73 35 49 74 65 72 20 2a 70 52 65 74    Fts5Iter *pRet
27200 20 3d 20 30 3b 0a 20 20 46 74 73 35 42 75 66 66   = 0;.  Fts5Buff
27210 65 72 20 62 75 66 20 3d 20 7b 30 2c 20 30 2c 20  er buf = {0, 0, 
27220 30 7d 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65  0};..  /* If the
27230 20 51 55 45 52 59 5f 53 43 41 4e 20 66 6c 61 67   QUERY_SCAN flag
27240 20 69 73 20 73 65 74 2c 20 61 6c 6c 20 6f 74 68   is set, all oth
27250 65 72 20 66 6c 61 67 73 20 6d 75 73 74 20 62 65  er flags must be
27260 20 63 6c 65 61 72 2e 20 2a 2f 0a 20 20 61 73 73   clear. */.  ass
27270 65 72 74 28 20 28 66 6c 61 67 73 20 26 20 46 54  ert( (flags & FT
27280 53 35 49 4e 44 45 58 5f 51 55 45 52 59 5f 53 43  S5INDEX_QUERY_SC
27290 41 4e 29 3d 3d 30 20 7c 7c 20 66 6c 61 67 73 3d  AN)==0 || flags=
272a0 3d 46 54 53 35 49 4e 44 45 58 5f 51 55 45 52 59  =FTS5INDEX_QUERY
272b0 5f 53 43 41 4e 20 29 3b 0a 0a 20 20 69 66 28 20  _SCAN );..  if( 
272c0 73 71 6c 69 74 65 33 46 74 73 35 42 75 66 66 65  sqlite3Fts5Buffe
272d0 72 53 69 7a 65 28 26 70 2d 3e 72 63 2c 20 26 62  rSize(&p->rc, &b
272e0 75 66 2c 20 6e 54 6f 6b 65 6e 2b 31 29 3d 3d 30  uf, nToken+1)==0
272f0 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 49 64 78   ){.    int iIdx
27300 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
27310 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 74        /* Index t
27320 6f 20 73 65 61 72 63 68 20 2a 2f 0a 20 20 20 20  o search */.    
27330 6d 65 6d 63 70 79 28 26 62 75 66 2e 70 5b 31 5d  memcpy(&buf.p[1]
27340 2c 20 70 54 6f 6b 65 6e 2c 20 6e 54 6f 6b 65 6e  , pToken, nToken
27350 29 3b 0a 0a 20 20 20 20 2f 2a 20 46 69 67 75 72  );..    /* Figur
27360 65 20 6f 75 74 20 77 68 69 63 68 20 69 6e 64 65  e out which inde
27370 78 20 74 6f 20 73 65 61 72 63 68 20 61 6e 64 20  x to search and 
27380 73 65 74 20 69 49 64 78 20 61 63 63 6f 72 64 69  set iIdx accordi
27390 6e 67 6c 79 2e 20 49 66 20 74 68 69 73 0a 20 20  ngly. If this.  
273a0 20 20 2a 2a 20 69 73 20 61 20 70 72 65 66 69 78    ** is a prefix
273b0 20 71 75 65 72 79 20 66 6f 72 20 77 68 69 63 68   query for which
273c0 20 74 68 65 72 65 20 69 73 20 6e 6f 20 70 72 65   there is no pre
273d0 66 69 78 20 69 6e 64 65 78 2c 20 73 65 74 20 69  fix index, set i
273e0 49 64 78 20 74 6f 0a 20 20 20 20 2a 2a 20 67 72  Idx to.    ** gr
273f0 65 61 74 65 72 20 74 68 61 6e 20 70 43 6f 6e 66  eater than pConf
27400 69 67 2d 3e 6e 50 72 65 66 69 78 20 74 6f 20 69  ig->nPrefix to i
27410 6e 64 69 63 61 74 65 20 74 68 61 74 20 74 68 65  ndicate that the
27420 20 71 75 65 72 79 20 77 69 6c 6c 20 62 65 0a 20   query will be. 
27430 20 20 20 2a 2a 20 73 61 74 69 73 66 69 65 64 20     ** satisfied 
27440 62 79 20 73 63 61 6e 6e 69 6e 67 20 6d 75 6c 74  by scanning mult
27450 69 70 6c 65 20 74 65 72 6d 73 20 69 6e 20 74 68  iple terms in th
27460 65 20 6d 61 69 6e 20 69 6e 64 65 78 2e 0a 20 20  e main index..  
27470 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20 74    **.    ** If t
27480 68 65 20 51 55 45 52 59 5f 54 45 53 54 5f 4e 4f  he QUERY_TEST_NO
27490 49 44 58 20 66 6c 61 67 20 77 61 73 20 73 70 65  IDX flag was spe
274a0 63 69 66 69 65 64 2c 20 74 68 65 6e 20 74 68 69  cified, then thi
274b0 73 20 6d 75 73 74 20 62 65 20 61 0a 20 20 20 20  s must be a.    
274c0 2a 2a 20 70 72 65 66 69 78 2d 71 75 65 72 79 2e  ** prefix-query.
274d0 20 49 6e 73 74 65 61 64 20 6f 66 20 75 73 69 6e   Instead of usin
274e0 67 20 61 20 70 72 65 66 69 78 2d 69 6e 64 65 78  g a prefix-index
274f0 20 28 69 66 20 6f 6e 65 20 65 78 69 73 74 73 29   (if one exists)
27500 2c 20 0a 20 20 20 20 2a 2a 20 65 76 61 6c 75 61  , .    ** evalua
27510 74 65 20 74 68 65 20 70 72 65 66 69 78 20 71 75  te the prefix qu
27520 65 72 79 20 75 73 69 6e 67 20 74 68 65 20 6d 61  ery using the ma
27530 69 6e 20 46 54 53 20 69 6e 64 65 78 2e 20 54 68  in FTS index. Th
27540 69 73 20 69 73 20 75 73 65 64 0a 20 20 20 20 2a  is is used.    *
27550 2a 20 66 6f 72 20 69 6e 74 65 72 6e 61 6c 20 73  * for internal s
27560 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67 20 62  anity checking b
27570 79 20 74 68 65 20 69 6e 74 65 67 72 69 74 79 2d  y the integrity-
27580 63 68 65 63 6b 20 69 6e 20 64 65 62 75 67 20 0a  check in debug .
27590 20 20 20 20 2a 2a 20 6d 6f 64 65 20 6f 6e 6c 79      ** mode only
275a0 2e 20 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  .  */.#ifdef SQL
275b0 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20 69 66  ITE_DEBUG.    if
275c0 28 20 70 43 6f 6e 66 69 67 2d 3e 62 50 72 65 66  ( pConfig->bPref
275d0 69 78 49 6e 64 65 78 3d 3d 30 20 7c 7c 20 28 66  ixIndex==0 || (f
275e0 6c 61 67 73 20 26 20 46 54 53 35 49 4e 44 45 58  lags & FTS5INDEX
275f0 5f 51 55 45 52 59 5f 54 45 53 54 5f 4e 4f 49 44  _QUERY_TEST_NOID
27600 58 29 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  X) ){.      asse
27610 72 74 28 20 66 6c 61 67 73 20 26 20 46 54 53 35  rt( flags & FTS5
27620 49 4e 44 45 58 5f 51 55 45 52 59 5f 50 52 45 46  INDEX_QUERY_PREF
27630 49 58 20 29 3b 0a 20 20 20 20 20 20 69 49 64 78  IX );.      iIdx
27640 20 3d 20 31 2b 70 43 6f 6e 66 69 67 2d 3e 6e 50   = 1+pConfig->nP
27650 72 65 66 69 78 3b 0a 20 20 20 20 7d 65 6c 73 65  refix;.    }else
27660 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28 20  .#endif.    if( 
27670 66 6c 61 67 73 20 26 20 46 54 53 35 49 4e 44 45  flags & FTS5INDE
27680 58 5f 51 55 45 52 59 5f 50 52 45 46 49 58 20 29  X_QUERY_PREFIX )
27690 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 43 68 61  {.      int nCha
276a0 72 20 3d 20 66 74 73 35 49 6e 64 65 78 43 68 61  r = fts5IndexCha
276b0 72 6c 65 6e 28 70 54 6f 6b 65 6e 2c 20 6e 54 6f  rlen(pToken, nTo
276c0 6b 65 6e 29 3b 0a 20 20 20 20 20 20 66 6f 72 28  ken);.      for(
276d0 69 49 64 78 3d 31 3b 20 69 49 64 78 3c 3d 70 43  iIdx=1; iIdx<=pC
276e0 6f 6e 66 69 67 2d 3e 6e 50 72 65 66 69 78 3b 20  onfig->nPrefix; 
276f0 69 49 64 78 2b 2b 29 7b 0a 20 20 20 20 20 20 20  iIdx++){.       
27700 20 69 66 28 20 70 43 6f 6e 66 69 67 2d 3e 61 50   if( pConfig->aP
27710 72 65 66 69 78 5b 69 49 64 78 2d 31 5d 3d 3d 6e  refix[iIdx-1]==n
27720 43 68 61 72 20 29 20 62 72 65 61 6b 3b 0a 20 20  Char ) break;.  
27730 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
27740 20 69 66 28 20 69 49 64 78 3c 3d 70 43 6f 6e 66   if( iIdx<=pConf
27750 69 67 2d 3e 6e 50 72 65 66 69 78 20 29 7b 0a 20  ig->nPrefix ){. 
27760 20 20 20 20 20 2f 2a 20 53 74 72 61 69 67 68 74       /* Straight
27770 20 69 6e 64 65 78 20 6c 6f 6f 6b 75 70 20 2a 2f   index lookup */
27780 0a 20 20 20 20 20 20 46 74 73 35 53 74 72 75 63  .      Fts5Struc
27790 74 75 72 65 20 2a 70 53 74 72 75 63 74 20 3d 20  ture *pStruct = 
277a0 66 74 73 35 53 74 72 75 63 74 75 72 65 52 65 61  fts5StructureRea
277b0 64 28 70 29 3b 0a 20 20 20 20 20 20 62 75 66 2e  d(p);.      buf.
277c0 70 5b 30 5d 20 3d 20 28 75 38 29 28 46 54 53 35  p[0] = (u8)(FTS5
277d0 5f 4d 41 49 4e 5f 50 52 45 46 49 58 20 2b 20 69  _MAIN_PREFIX + i
277e0 49 64 78 29 3b 0a 20 20 20 20 20 20 69 66 28 20  Idx);.      if( 
277f0 70 53 74 72 75 63 74 20 29 7b 0a 20 20 20 20 20  pStruct ){.     
27800 20 20 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72     fts5MultiIter
27810 4e 65 77 28 70 2c 20 70 53 74 72 75 63 74 2c 20  New(p, pStruct, 
27820 66 6c 61 67 73 20 7c 20 46 54 53 35 49 4e 44 45  flags | FTS5INDE
27830 58 5f 51 55 45 52 59 5f 53 4b 49 50 45 4d 50 54  X_QUERY_SKIPEMPT
27840 59 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  Y, .            
27850 70 43 6f 6c 73 65 74 2c 20 62 75 66 2e 70 2c 20  pColset, buf.p, 
27860 6e 54 6f 6b 65 6e 2b 31 2c 20 2d 31 2c 20 30 2c  nToken+1, -1, 0,
27870 20 26 70 52 65 74 0a 20 20 20 20 20 20 20 20 29   &pRet.        )
27880 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35 53 74  ;.        fts5St
27890 72 75 63 74 75 72 65 52 65 6c 65 61 73 65 28 70  ructureRelease(p
278a0 53 74 72 75 63 74 29 3b 0a 20 20 20 20 20 20 7d  Struct);.      }
278b0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
278c0 20 20 2f 2a 20 53 63 61 6e 20 6d 75 6c 74 69 70    /* Scan multip
278d0 6c 65 20 74 65 72 6d 73 20 69 6e 20 74 68 65 20  le terms in the 
278e0 6d 61 69 6e 20 69 6e 64 65 78 20 2a 2f 0a 20 20  main index */.  
278f0 20 20 20 20 69 6e 74 20 62 44 65 73 63 20 3d 20      int bDesc = 
27900 28 66 6c 61 67 73 20 26 20 46 54 53 35 49 4e 44  (flags & FTS5IND
27910 45 58 5f 51 55 45 52 59 5f 44 45 53 43 29 21 3d  EX_QUERY_DESC)!=
27920 30 3b 0a 20 20 20 20 20 20 62 75 66 2e 70 5b 30  0;.      buf.p[0
27930 5d 20 3d 20 46 54 53 35 5f 4d 41 49 4e 5f 50 52  ] = FTS5_MAIN_PR
27940 45 46 49 58 3b 0a 20 20 20 20 20 20 66 74 73 35  EFIX;.      fts5
27950 53 65 74 75 70 50 72 65 66 69 78 49 74 65 72 28  SetupPrefixIter(
27960 70 2c 20 62 44 65 73 63 2c 20 62 75 66 2e 70 2c  p, bDesc, buf.p,
27970 20 6e 54 6f 6b 65 6e 2b 31 2c 20 70 43 6f 6c 73   nToken+1, pCols
27980 65 74 2c 20 26 70 52 65 74 29 3b 0a 20 20 20 20  et, &pRet);.    
27990 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72 63 21    assert( p->rc!
279a0 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 52  =SQLITE_OK || pR
279b0 65 74 2d 3e 70 43 6f 6c 73 65 74 3d 3d 30 20 29  et->pColset==0 )
279c0 3b 0a 20 20 20 20 20 20 66 74 73 35 49 74 65 72  ;.      fts5Iter
279d0 53 65 74 4f 75 74 70 75 74 43 62 28 26 70 2d 3e  SetOutputCb(&p->
279e0 72 63 2c 20 70 52 65 74 29 3b 0a 20 20 20 20 20  rc, pRet);.     
279f0 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49   if( p->rc==SQLI
27a00 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
27a10 20 46 74 73 35 53 65 67 49 74 65 72 20 2a 70 53   Fts5SegIter *pS
27a20 65 67 20 3d 20 26 70 52 65 74 2d 3e 61 53 65 67  eg = &pRet->aSeg
27a30 5b 70 52 65 74 2d 3e 61 46 69 72 73 74 5b 31 5d  [pRet->aFirst[1]
27a40 2e 69 46 69 72 73 74 5d 3b 0a 20 20 20 20 20 20  .iFirst];.      
27a50 20 20 69 66 28 20 70 53 65 67 2d 3e 70 4c 65 61    if( pSeg->pLea
27a60 66 20 29 20 70 52 65 74 2d 3e 78 53 65 74 4f 75  f ) pRet->xSetOu
27a70 74 70 75 74 73 28 70 52 65 74 2c 20 70 53 65 67  tputs(pRet, pSeg
27a80 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
27a90 0a 0a 20 20 20 20 69 66 28 20 70 2d 3e 72 63 20  ..    if( p->rc 
27aa0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
27ab0 46 74 73 35 49 74 65 72 43 6c 6f 73 65 28 26 70  Fts5IterClose(&p
27ac0 52 65 74 2d 3e 62 61 73 65 29 3b 0a 20 20 20 20  Ret->base);.    
27ad0 20 20 70 52 65 74 20 3d 20 30 3b 0a 20 20 20 20    pRet = 0;.    
27ae0 20 20 66 74 73 35 43 6c 6f 73 65 52 65 61 64 65    fts5CloseReade
27af0 72 28 70 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  r(p);.    }..   
27b00 20 2a 70 70 49 74 65 72 20 3d 20 26 70 52 65 74   *ppIter = &pRet
27b10 2d 3e 62 61 73 65 3b 0a 20 20 20 20 73 71 6c 69  ->base;.    sqli
27b20 74 65 33 46 74 73 35 42 75 66 66 65 72 46 72 65  te3Fts5BufferFre
27b30 65 28 26 62 75 66 29 3b 0a 20 20 7d 0a 20 20 72  e(&buf);.  }.  r
27b40 65 74 75 72 6e 20 66 74 73 35 49 6e 64 65 78 52  eturn fts5IndexR
27b50 65 74 75 72 6e 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a  eturn(p);.}../*.
27b60 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69  ** Return true i
27b70 66 20 74 68 65 20 69 74 65 72 61 74 6f 72 20 70  f the iterator p
27b80 61 73 73 65 64 20 61 73 20 74 68 65 20 6f 6e 6c  assed as the onl
27b90 79 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61 74  y argument is at
27ba0 20 45 4f 46 2e 0a 2a 2f 0a 2f 2a 0a 2a 2a 20 4d   EOF..*/./*.** M
27bb0 6f 76 65 20 74 6f 20 74 68 65 20 6e 65 78 74 20  ove to the next 
27bc0 6d 61 74 63 68 69 6e 67 20 72 6f 77 69 64 2e 20  matching rowid. 
27bd0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46  .*/.int sqlite3F
27be0 74 73 35 49 74 65 72 4e 65 78 74 28 46 74 73 35  ts5IterNext(Fts5
27bf0 49 6e 64 65 78 49 74 65 72 20 2a 70 49 6e 64 65  IndexIter *pInde
27c00 78 49 74 65 72 29 7b 0a 20 20 46 74 73 35 49 74  xIter){.  Fts5It
27c10 65 72 20 2a 70 49 74 65 72 20 3d 20 28 46 74 73  er *pIter = (Fts
27c20 35 49 74 65 72 2a 29 70 49 6e 64 65 78 49 74 65  5Iter*)pIndexIte
27c30 72 3b 0a 20 20 61 73 73 65 72 74 28 20 70 49 74  r;.  assert( pIt
27c40 65 72 2d 3e 70 49 6e 64 65 78 2d 3e 72 63 3d 3d  er->pIndex->rc==
27c50 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 66  SQLITE_OK );.  f
27c60 74 73 35 4d 75 6c 74 69 49 74 65 72 4e 65 78 74  ts5MultiIterNext
27c70 28 70 49 74 65 72 2d 3e 70 49 6e 64 65 78 2c 20  (pIter->pIndex, 
27c80 70 49 74 65 72 2c 20 30 2c 20 30 29 3b 0a 20 20  pIter, 0, 0);.  
27c90 72 65 74 75 72 6e 20 66 74 73 35 49 6e 64 65 78  return fts5Index
27ca0 52 65 74 75 72 6e 28 70 49 74 65 72 2d 3e 70 49  Return(pIter->pI
27cb0 6e 64 65 78 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ndex);.}../*.** 
27cc0 4d 6f 76 65 20 74 6f 20 74 68 65 20 6e 65 78 74  Move to the next
27cd0 20 6d 61 74 63 68 69 6e 67 20 74 65 72 6d 2f 72   matching term/r
27ce0 6f 77 69 64 2e 20 55 73 65 64 20 62 79 20 74 68  owid. Used by th
27cf0 65 20 66 74 73 35 76 6f 63 61 62 20 6d 6f 64 75  e fts5vocab modu
27d00 6c 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  le..*/.int sqlit
27d10 65 33 46 74 73 35 49 74 65 72 4e 65 78 74 53 63  e3Fts5IterNextSc
27d20 61 6e 28 46 74 73 35 49 6e 64 65 78 49 74 65 72  an(Fts5IndexIter
27d30 20 2a 70 49 6e 64 65 78 49 74 65 72 29 7b 0a 20   *pIndexIter){. 
27d40 20 46 74 73 35 49 74 65 72 20 2a 70 49 74 65 72   Fts5Iter *pIter
27d50 20 3d 20 28 46 74 73 35 49 74 65 72 2a 29 70 49   = (Fts5Iter*)pI
27d60 6e 64 65 78 49 74 65 72 3b 0a 20 20 46 74 73 35  ndexIter;.  Fts5
27d70 49 6e 64 65 78 20 2a 70 20 3d 20 70 49 74 65 72  Index *p = pIter
27d80 2d 3e 70 49 6e 64 65 78 3b 0a 0a 20 20 61 73 73  ->pIndex;..  ass
27d90 65 72 74 28 20 70 49 74 65 72 2d 3e 70 49 6e 64  ert( pIter->pInd
27da0 65 78 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  ex->rc==SQLITE_O
27db0 4b 20 29 3b 0a 0a 20 20 66 74 73 35 4d 75 6c 74  K );..  fts5Mult
27dc0 69 49 74 65 72 4e 65 78 74 28 70 2c 20 70 49 74  iIterNext(p, pIt
27dd0 65 72 2c 20 30 2c 20 30 29 3b 0a 20 20 69 66 28  er, 0, 0);.  if(
27de0 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
27df0 4b 20 29 7b 0a 20 20 20 20 46 74 73 35 53 65 67  K ){.    Fts5Seg
27e00 49 74 65 72 20 2a 70 53 65 67 20 3d 20 26 70 49  Iter *pSeg = &pI
27e10 74 65 72 2d 3e 61 53 65 67 5b 20 70 49 74 65 72  ter->aSeg[ pIter
27e20 2d 3e 61 46 69 72 73 74 5b 31 5d 2e 69 46 69 72  ->aFirst[1].iFir
27e30 73 74 20 5d 3b 0a 20 20 20 20 69 66 28 20 70 53  st ];.    if( pS
27e40 65 67 2d 3e 70 4c 65 61 66 20 26 26 20 70 53 65  eg->pLeaf && pSe
27e50 67 2d 3e 74 65 72 6d 2e 70 5b 30 5d 21 3d 46 54  g->term.p[0]!=FT
27e60 53 35 5f 4d 41 49 4e 5f 50 52 45 46 49 58 20 29  S5_MAIN_PREFIX )
27e70 7b 0a 20 20 20 20 20 20 66 74 73 35 44 61 74 61  {.      fts5Data
27e80 52 65 6c 65 61 73 65 28 70 53 65 67 2d 3e 70 4c  Release(pSeg->pL
27e90 65 61 66 29 3b 0a 20 20 20 20 20 20 70 53 65 67  eaf);.      pSeg
27ea0 2d 3e 70 4c 65 61 66 20 3d 20 30 3b 0a 20 20 20  ->pLeaf = 0;.   
27eb0 20 20 20 70 49 74 65 72 2d 3e 62 61 73 65 2e 62     pIter->base.b
27ec0 45 6f 66 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20  Eof = 1;.    }. 
27ed0 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 66 74 73   }..  return fts
27ee0 35 49 6e 64 65 78 52 65 74 75 72 6e 28 70 49 74  5IndexReturn(pIt
27ef0 65 72 2d 3e 70 49 6e 64 65 78 29 3b 0a 7d 0a 0a  er->pIndex);.}..
27f00 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 6f 20 74 68  /*.** Move to th
27f10 65 20 6e 65 78 74 20 6d 61 74 63 68 69 6e 67 20  e next matching 
27f20 72 6f 77 69 64 20 74 68 61 74 20 6f 63 63 75 72  rowid that occur
27f30 73 20 61 74 20 6f 72 20 61 66 74 65 72 20 69 4d  s at or after iM
27f40 61 74 63 68 2e 20 54 68 65 0a 2a 2a 20 64 65 66  atch. The.** def
27f50 69 6e 69 74 69 6f 6e 20 6f 66 20 22 61 74 20 6f  inition of "at o
27f60 72 20 61 66 74 65 72 22 20 64 65 70 65 6e 64 73  r after" depends
27f70 20 6f 6e 20 77 68 65 74 68 65 72 20 74 68 69 73   on whether this
27f80 20 69 74 65 72 61 74 6f 72 20 69 74 65 72 61 74   iterator iterat
27f90 65 73 0a 2a 2a 20 69 6e 20 61 73 63 65 6e 64 69  es.** in ascendi
27fa0 6e 67 20 6f 72 20 64 65 73 63 65 6e 64 69 6e 67  ng or descending
27fb0 20 72 6f 77 69 64 20 6f 72 64 65 72 2e 0a 2a 2f   rowid order..*/
27fc0 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35  .int sqlite3Fts5
27fd0 49 74 65 72 4e 65 78 74 46 72 6f 6d 28 46 74 73  IterNextFrom(Fts
27fe0 35 49 6e 64 65 78 49 74 65 72 20 2a 70 49 6e 64  5IndexIter *pInd
27ff0 65 78 49 74 65 72 2c 20 69 36 34 20 69 4d 61 74  exIter, i64 iMat
28000 63 68 29 7b 0a 20 20 46 74 73 35 49 74 65 72 20  ch){.  Fts5Iter 
28010 2a 70 49 74 65 72 20 3d 20 28 46 74 73 35 49 74  *pIter = (Fts5It
28020 65 72 2a 29 70 49 6e 64 65 78 49 74 65 72 3b 0a  er*)pIndexIter;.
28030 20 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 4e    fts5MultiIterN
28040 65 78 74 46 72 6f 6d 28 70 49 74 65 72 2d 3e 70  extFrom(pIter->p
28050 49 6e 64 65 78 2c 20 70 49 74 65 72 2c 20 69 4d  Index, pIter, iM
28060 61 74 63 68 29 3b 0a 20 20 72 65 74 75 72 6e 20  atch);.  return 
28070 66 74 73 35 49 6e 64 65 78 52 65 74 75 72 6e 28  fts5IndexReturn(
28080 70 49 74 65 72 2d 3e 70 49 6e 64 65 78 29 3b 0a  pIter->pIndex);.
28090 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
280a0 74 68 65 20 63 75 72 72 65 6e 74 20 74 65 72 6d  the current term
280b0 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20  ..*/.const char 
280c0 2a 73 71 6c 69 74 65 33 46 74 73 35 49 74 65 72  *sqlite3Fts5Iter
280d0 54 65 72 6d 28 46 74 73 35 49 6e 64 65 78 49 74  Term(Fts5IndexIt
280e0 65 72 20 2a 70 49 6e 64 65 78 49 74 65 72 2c 20  er *pIndexIter, 
280f0 69 6e 74 20 2a 70 6e 29 7b 0a 20 20 69 6e 74 20  int *pn){.  int 
28100 6e 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  n;.  const char 
28110 2a 7a 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72  *z = (const char
28120 2a 29 66 74 73 35 4d 75 6c 74 69 49 74 65 72 54  *)fts5MultiIterT
28130 65 72 6d 28 28 46 74 73 35 49 74 65 72 2a 29 70  erm((Fts5Iter*)p
28140 49 6e 64 65 78 49 74 65 72 2c 20 26 6e 29 3b 0a  IndexIter, &n);.
28150 20 20 2a 70 6e 20 3d 20 6e 2d 31 3b 0a 20 20 72    *pn = n-1;.  r
28160 65 74 75 72 6e 20 26 7a 5b 31 5d 3b 0a 7d 0a 0a  eturn &z[1];.}..
28170 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 6e 20 69  /*.** Close an i
28180 74 65 72 61 74 6f 72 20 6f 70 65 6e 65 64 20 62  terator opened b
28190 79 20 61 6e 20 65 61 72 6c 69 65 72 20 63 61 6c  y an earlier cal
281a0 6c 20 74 6f 20 73 71 6c 69 74 65 33 46 74 73 35  l to sqlite3Fts5
281b0 49 6e 64 65 78 51 75 65 72 79 28 29 2e 0a 2a 2f  IndexQuery()..*/
281c0 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 46 74 73  .void sqlite3Fts
281d0 35 49 74 65 72 43 6c 6f 73 65 28 46 74 73 35 49  5IterClose(Fts5I
281e0 6e 64 65 78 49 74 65 72 20 2a 70 49 6e 64 65 78  ndexIter *pIndex
281f0 49 74 65 72 29 7b 0a 20 20 69 66 28 20 70 49 6e  Iter){.  if( pIn
28200 64 65 78 49 74 65 72 20 29 7b 0a 20 20 20 20 46  dexIter ){.    F
28210 74 73 35 49 74 65 72 20 2a 70 49 74 65 72 20 3d  ts5Iter *pIter =
28220 20 28 46 74 73 35 49 74 65 72 2a 29 70 49 6e 64   (Fts5Iter*)pInd
28230 65 78 49 74 65 72 3b 0a 20 20 20 20 46 74 73 35  exIter;.    Fts5
28240 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 20 3d 20  Index *pIndex = 
28250 70 49 74 65 72 2d 3e 70 49 6e 64 65 78 3b 0a 20  pIter->pIndex;. 
28260 20 20 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72     fts5MultiIter
28270 46 72 65 65 28 70 49 74 65 72 29 3b 0a 20 20 20  Free(pIter);.   
28280 20 66 74 73 35 43 6c 6f 73 65 52 65 61 64 65 72   fts5CloseReader
28290 28 70 49 6e 64 65 78 29 3b 0a 20 20 7d 0a 7d 0a  (pIndex);.  }.}.
282a0 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 61 6e 64 20  ./*.** Read and 
282b0 64 65 63 6f 64 65 20 74 68 65 20 22 61 76 65 72  decode the "aver
282c0 61 67 65 73 22 20 72 65 63 6f 72 64 20 66 72 6f  ages" record fro
282d0 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20  m the database. 
282e0 0a 2a 2a 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72  .**.** Parameter
282f0 20 61 6e 53 69 7a 65 20 6d 75 73 74 20 70 6f 69   anSize must poi
28300 6e 74 20 74 6f 20 61 6e 20 61 72 72 61 79 20 6f  nt to an array o
28310 66 20 73 69 7a 65 20 6e 43 6f 6c 2c 20 77 68 65  f size nCol, whe
28320 72 65 20 6e 43 6f 6c 20 69 73 0a 2a 2a 20 74 68  re nCol is.** th
28330 65 20 6e 75 6d 62 65 72 20 6f 66 20 75 73 65 72  e number of user
28340 20 64 65 66 69 6e 65 64 20 63 6f 6c 75 6d 6e 73   defined columns
28350 20 69 6e 20 74 68 65 20 46 54 53 20 74 61 62 6c   in the FTS tabl
28360 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  e..*/.int sqlite
28370 33 46 74 73 35 49 6e 64 65 78 47 65 74 41 76 65  3Fts5IndexGetAve
28380 72 61 67 65 73 28 46 74 73 35 49 6e 64 65 78 20  rages(Fts5Index 
28390 2a 70 2c 20 69 36 34 20 2a 70 6e 52 6f 77 2c 20  *p, i64 *pnRow, 
283a0 69 36 34 20 2a 61 6e 53 69 7a 65 29 7b 0a 20 20  i64 *anSize){.  
283b0 69 6e 74 20 6e 43 6f 6c 20 3d 20 70 2d 3e 70 43  int nCol = p->pC
283c0 6f 6e 66 69 67 2d 3e 6e 43 6f 6c 3b 0a 20 20 46  onfig->nCol;.  F
283d0 74 73 35 44 61 74 61 20 2a 70 44 61 74 61 3b 0a  ts5Data *pData;.
283e0 0a 20 20 2a 70 6e 52 6f 77 20 3d 20 30 3b 0a 20  .  *pnRow = 0;. 
283f0 20 6d 65 6d 73 65 74 28 61 6e 53 69 7a 65 2c 20   memset(anSize, 
28400 30 2c 20 73 69 7a 65 6f 66 28 69 36 34 29 20 2a  0, sizeof(i64) *
28410 20 6e 43 6f 6c 29 3b 0a 20 20 70 44 61 74 61 20   nCol);.  pData 
28420 3d 20 66 74 73 35 44 61 74 61 52 65 61 64 28 70  = fts5DataRead(p
28430 2c 20 46 54 53 35 5f 41 56 45 52 41 47 45 53 5f  , FTS5_AVERAGES_
28440 52 4f 57 49 44 29 3b 0a 20 20 69 66 28 20 70 2d  ROWID);.  if( p-
28450 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26  >rc==SQLITE_OK &
28460 26 20 70 44 61 74 61 2d 3e 6e 6e 20 29 7b 0a 20  & pData->nn ){. 
28470 20 20 20 69 6e 74 20 69 20 3d 20 30 3b 0a 20 20     int i = 0;.  
28480 20 20 69 6e 74 20 69 43 6f 6c 3b 0a 20 20 20 20    int iCol;.    
28490 69 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69  i += fts5GetVari
284a0 6e 74 28 26 70 44 61 74 61 2d 3e 70 5b 69 5d 2c  nt(&pData->p[i],
284b0 20 28 75 36 34 2a 29 70 6e 52 6f 77 29 3b 0a 20   (u64*)pnRow);. 
284c0 20 20 20 66 6f 72 28 69 43 6f 6c 3d 30 3b 20 69     for(iCol=0; i
284d0 3c 70 44 61 74 61 2d 3e 6e 6e 20 26 26 20 69 43  <pData->nn && iC
284e0 6f 6c 3c 6e 43 6f 6c 3b 20 69 43 6f 6c 2b 2b 29  ol<nCol; iCol++)
284f0 7b 0a 20 20 20 20 20 20 69 20 2b 3d 20 66 74 73  {.      i += fts
28500 35 47 65 74 56 61 72 69 6e 74 28 26 70 44 61 74  5GetVarint(&pDat
28510 61 2d 3e 70 5b 69 5d 2c 20 28 75 36 34 2a 29 26  a->p[i], (u64*)&
28520 61 6e 53 69 7a 65 5b 69 43 6f 6c 5d 29 3b 0a 20  anSize[iCol]);. 
28530 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 66 74 73 35     }.  }..  fts5
28540 44 61 74 61 52 65 6c 65 61 73 65 28 70 44 61 74  DataRelease(pDat
28550 61 29 3b 0a 20 20 72 65 74 75 72 6e 20 66 74 73  a);.  return fts
28560 35 49 6e 64 65 78 52 65 74 75 72 6e 28 70 29 3b  5IndexReturn(p);
28570 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 70 6c 61 63  .}../*.** Replac
28580 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 22 61  e the current "a
28590 76 65 72 61 67 65 73 22 20 72 65 63 6f 72 64 20  verages" record 
285a0 77 69 74 68 20 74 68 65 20 63 6f 6e 74 65 6e 74  with the content
285b0 73 20 6f 66 20 74 68 65 20 62 75 66 66 65 72 20  s of the buffer 
285c0 0a 2a 2a 20 73 75 70 70 6c 69 65 64 20 61 73 20  .** supplied as 
285d0 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  the second argum
285e0 65 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ent..*/.int sqli
285f0 74 65 33 46 74 73 35 49 6e 64 65 78 53 65 74 41  te3Fts5IndexSetA
28600 76 65 72 61 67 65 73 28 46 74 73 35 49 6e 64 65  verages(Fts5Inde
28610 78 20 2a 70 2c 20 63 6f 6e 73 74 20 75 38 20 2a  x *p, const u8 *
28620 70 44 61 74 61 2c 20 69 6e 74 20 6e 44 61 74 61  pData, int nData
28630 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  ){.  assert( p->
28640 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  rc==SQLITE_OK );
28650 0a 20 20 66 74 73 35 44 61 74 61 57 72 69 74 65  .  fts5DataWrite
28660 28 70 2c 20 46 54 53 35 5f 41 56 45 52 41 47 45  (p, FTS5_AVERAGE
28670 53 5f 52 4f 57 49 44 2c 20 70 44 61 74 61 2c 20  S_ROWID, pData, 
28680 6e 44 61 74 61 29 3b 0a 20 20 72 65 74 75 72 6e  nData);.  return
28690 20 66 74 73 35 49 6e 64 65 78 52 65 74 75 72 6e   fts5IndexReturn
286a0 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  (p);.}../*.** Re
286b0 74 75 72 6e 20 74 68 65 20 74 6f 74 61 6c 20 6e  turn the total n
286c0 75 6d 62 65 72 20 6f 66 20 62 6c 6f 63 6b 73 20  umber of blocks 
286d0 74 68 69 73 20 6d 6f 64 75 6c 65 20 68 61 73 20  this module has 
286e0 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 25 5f  read from the %_
286f0 64 61 74 61 0a 2a 2a 20 74 61 62 6c 65 20 73 69  data.** table si
28700 6e 63 65 20 69 74 20 77 61 73 20 63 72 65 61 74  nce it was creat
28710 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ed..*/.int sqlit
28720 65 33 46 74 73 35 49 6e 64 65 78 52 65 61 64 73  e3Fts5IndexReads
28730 28 46 74 73 35 49 6e 64 65 78 20 2a 70 29 7b 0a  (Fts5Index *p){.
28740 20 20 72 65 74 75 72 6e 20 70 2d 3e 6e 52 65 61    return p->nRea
28750 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20  d;.}../*.** Set 
28760 74 68 65 20 33 32 2d 62 69 74 20 63 6f 6f 6b 69  the 32-bit cooki
28770 65 20 76 61 6c 75 65 20 73 74 6f 72 65 64 20 61  e value stored a
28780 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 61  t the start of a
28790 6c 6c 20 73 74 72 75 63 74 75 72 65 20 0a 2a 2a  ll structure .**
287a0 20 72 65 63 6f 72 64 73 20 74 6f 20 74 68 65 20   records to the 
287b0 76 61 6c 75 65 20 70 61 73 73 65 64 20 61 73 20  value passed as 
287c0 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  the second argum
287d0 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  ent..**.** Retur
287e0 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 73  n SQLITE_OK if s
287f0 75 63 63 65 73 73 66 75 6c 2c 20 6f 72 20 61 6e  uccessful, or an
28800 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f   SQLite error co
28810 64 65 20 69 66 20 61 6e 20 65 72 72 6f 72 0a 2a  de if an error.*
28820 2a 20 6f 63 63 75 72 73 2e 0a 2a 2f 0a 69 6e 74  * occurs..*/.int
28830 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65   sqlite3Fts5Inde
28840 78 53 65 74 43 6f 6f 6b 69 65 28 46 74 73 35 49  xSetCookie(Fts5I
28850 6e 64 65 78 20 2a 70 2c 20 69 6e 74 20 69 4e 65  ndex *p, int iNe
28860 77 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20  w){.  int rc;   
28870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28880 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
28890 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 46  turn code */.  F
288a0 74 73 35 43 6f 6e 66 69 67 20 2a 70 43 6f 6e 66  ts5Config *pConf
288b0 69 67 20 3d 20 70 2d 3e 70 43 6f 6e 66 69 67 3b  ig = p->pConfig;
288c0 20 20 20 20 2f 2a 20 43 6f 6e 66 69 67 75 72 61      /* Configura
288d0 74 69 6f 6e 20 6f 62 6a 65 63 74 20 2a 2f 0a 20  tion object */. 
288e0 20 75 38 20 61 43 6f 6f 6b 69 65 5b 34 5d 3b 20   u8 aCookie[4]; 
288f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28900 20 20 20 20 20 20 2f 2a 20 42 69 6e 61 72 79 20        /* Binary 
28910 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f  representation o
28920 66 20 69 4e 65 77 20 2a 2f 0a 20 20 73 71 6c 69  f iNew */.  sqli
28930 74 65 33 5f 62 6c 6f 62 20 2a 70 42 6c 6f 62 20  te3_blob *pBlob 
28940 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  = 0;..  assert( 
28950 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
28960 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 46 74 73   );.  sqlite3Fts
28970 35 50 75 74 33 32 28 61 43 6f 6f 6b 69 65 2c 20  5Put32(aCookie, 
28980 69 4e 65 77 29 3b 0a 0a 20 20 72 63 20 3d 20 73  iNew);..  rc = s
28990 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 6f 70 65 6e  qlite3_blob_open
289a0 28 70 43 6f 6e 66 69 67 2d 3e 64 62 2c 20 70 43  (pConfig->db, pC
289b0 6f 6e 66 69 67 2d 3e 7a 44 62 2c 20 70 2d 3e 7a  onfig->zDb, p->z
289c0 44 61 74 61 54 62 6c 2c 20 0a 20 20 20 20 20 20  DataTbl, .      
289d0 22 62 6c 6f 63 6b 22 2c 20 46 54 53 35 5f 53 54  "block", FTS5_ST
289e0 52 55 43 54 55 52 45 5f 52 4f 57 49 44 2c 20 31  RUCTURE_ROWID, 1
289f0 2c 20 26 70 42 6c 6f 62 0a 20 20 29 3b 0a 20 20  , &pBlob.  );.  
28a00 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
28a10 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  K ){.    sqlite3
28a20 5f 62 6c 6f 62 5f 77 72 69 74 65 28 70 42 6c 6f  _blob_write(pBlo
28a30 62 2c 20 61 43 6f 6f 6b 69 65 2c 20 34 2c 20 30  b, aCookie, 4, 0
28a40 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  );.    rc = sqli
28a50 74 65 33 5f 62 6c 6f 62 5f 63 6c 6f 73 65 28 70  te3_blob_close(p
28a60 42 6c 6f 62 29 3b 0a 20 20 7d 0a 0a 20 20 72 65  Blob);.  }..  re
28a70 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 69 6e 74 20  turn rc;.}..int 
28a80 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78  sqlite3Fts5Index
28a90 4c 6f 61 64 43 6f 6e 66 69 67 28 46 74 73 35 49  LoadConfig(Fts5I
28aa0 6e 64 65 78 20 2a 70 29 7b 0a 20 20 46 74 73 35  ndex *p){.  Fts5
28ab0 53 74 72 75 63 74 75 72 65 20 2a 70 53 74 72 75  Structure *pStru
28ac0 63 74 3b 0a 20 20 70 53 74 72 75 63 74 20 3d 20  ct;.  pStruct = 
28ad0 66 74 73 35 53 74 72 75 63 74 75 72 65 52 65 61  fts5StructureRea
28ae0 64 28 70 29 3b 0a 20 20 66 74 73 35 53 74 72 75  d(p);.  fts5Stru
28af0 63 74 75 72 65 52 65 6c 65 61 73 65 28 70 53 74  ctureRelease(pSt
28b00 72 75 63 74 29 3b 0a 20 20 72 65 74 75 72 6e 20  ruct);.  return 
28b10 66 74 73 35 49 6e 64 65 78 52 65 74 75 72 6e 28  fts5IndexReturn(
28b20 70 29 3b 0a 7d 0a 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a  p);.}.../*******
28b30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
28b40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
28b50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
28b60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
28b70 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  **.*************
28b80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
28b90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
28ba0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
28bb0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a  *************.**
28bc0 20 42 65 6c 6f 77 20 74 68 69 73 20 70 6f 69 6e   Below this poin
28bd0 74 20 69 73 20 74 68 65 20 69 6d 70 6c 65 6d 65  t is the impleme
28be0 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 69  ntation of the i
28bf0 6e 74 65 67 72 69 74 79 2d 63 68 65 63 6b 20 0a  ntegrity-check .
28c00 2a 2a 20 66 75 6e 63 74 69 6f 6e 61 6c 69 74 79  ** functionality
28c10 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  ..*/../*.** Retu
28c20 72 6e 20 61 20 73 69 6d 70 6c 65 20 63 68 65 63  rn a simple chec
28c30 6b 73 75 6d 20 76 61 6c 75 65 20 62 61 73 65 64  ksum value based
28c40 20 6f 6e 20 74 68 65 20 61 72 67 75 6d 65 6e 74   on the argument
28c50 73 2e 0a 2a 2f 0a 75 36 34 20 73 71 6c 69 74 65  s..*/.u64 sqlite
28c60 33 46 74 73 35 49 6e 64 65 78 45 6e 74 72 79 43  3Fts5IndexEntryC
28c70 6b 73 75 6d 28 0a 20 20 69 36 34 20 69 52 6f 77  ksum(.  i64 iRow
28c80 69 64 2c 20 0a 20 20 69 6e 74 20 69 43 6f 6c 2c  id, .  int iCol,
28c90 20 0a 20 20 69 6e 74 20 69 50 6f 73 2c 20 0a 20   .  int iPos, . 
28ca0 20 69 6e 74 20 69 49 64 78 2c 0a 20 20 63 6f 6e   int iIdx,.  con
28cb0 73 74 20 63 68 61 72 20 2a 70 54 65 72 6d 2c 0a  st char *pTerm,.
28cc0 20 20 69 6e 74 20 6e 54 65 72 6d 0a 29 7b 0a 20    int nTerm.){. 
28cd0 20 69 6e 74 20 69 3b 0a 20 20 75 36 34 20 72 65   int i;.  u64 re
28ce0 74 20 3d 20 69 52 6f 77 69 64 3b 0a 20 20 72 65  t = iRowid;.  re
28cf0 74 20 2b 3d 20 28 72 65 74 3c 3c 33 29 20 2b 20  t += (ret<<3) + 
28d00 69 43 6f 6c 3b 0a 20 20 72 65 74 20 2b 3d 20 28  iCol;.  ret += (
28d10 72 65 74 3c 3c 33 29 20 2b 20 69 50 6f 73 3b 0a  ret<<3) + iPos;.
28d20 20 20 69 66 28 20 69 49 64 78 3e 3d 30 20 29 20    if( iIdx>=0 ) 
28d30 72 65 74 20 2b 3d 20 28 72 65 74 3c 3c 33 29 20  ret += (ret<<3) 
28d40 2b 20 28 46 54 53 35 5f 4d 41 49 4e 5f 50 52 45  + (FTS5_MAIN_PRE
28d50 46 49 58 20 2b 20 69 49 64 78 29 3b 0a 20 20 66  FIX + iIdx);.  f
28d60 6f 72 28 69 3d 30 3b 20 69 3c 6e 54 65 72 6d 3b  or(i=0; i<nTerm;
28d70 20 69 2b 2b 29 20 72 65 74 20 2b 3d 20 28 72 65   i++) ret += (re
28d80 74 3c 3c 33 29 20 2b 20 70 54 65 72 6d 5b 69 5d  t<<3) + pTerm[i]
28d90 3b 0a 20 20 72 65 74 75 72 6e 20 72 65 74 3b 0a  ;.  return ret;.
28da0 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  }..#ifdef SQLITE
28db0 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 54 68 69  _DEBUG./*.** Thi
28dc0 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 70 75  s function is pu
28dd0 72 65 6c 79 20 61 6e 20 69 6e 74 65 72 6e 61 6c  rely an internal
28de0 20 74 65 73 74 2e 20 49 74 20 64 6f 65 73 20 6e   test. It does n
28df0 6f 74 20 63 6f 6e 74 72 69 62 75 74 65 20 74 6f  ot contribute to
28e00 20 0a 2a 2a 20 46 54 53 20 66 75 6e 63 74 69 6f   .** FTS functio
28e10 6e 61 6c 69 74 79 2c 20 6f 72 20 65 76 65 6e 20  nality, or even 
28e20 74 68 65 20 69 6e 74 65 67 72 69 74 79 2d 63 68  the integrity-ch
28e30 65 63 6b 2c 20 69 6e 20 61 6e 79 20 77 61 79 2e  eck, in any way.
28e40 0a 2a 2a 0a 2a 2a 20 49 6e 73 74 65 61 64 2c 20  .**.** Instead, 
28e50 69 74 20 74 65 73 74 73 20 74 68 61 74 20 74 68  it tests that th
28e60 65 20 73 61 6d 65 20 73 65 74 20 6f 66 20 70 67  e same set of pg
28e70 6e 6f 2f 72 6f 77 69 64 20 63 6f 6d 62 69 6e 61  no/rowid combina
28e80 74 69 6f 6e 73 20 61 72 65 20 0a 2a 2a 20 76 69  tions are .** vi
28e90 73 69 74 65 64 20 72 65 67 61 72 64 6c 65 73 73  sited regardless
28ea0 20 6f 66 20 77 68 65 74 68 65 72 20 74 68 65 20   of whether the 
28eb0 64 6f 63 6c 69 73 74 2d 69 6e 64 65 78 20 69 64  doclist-index id
28ec0 65 6e 74 69 66 69 65 64 20 62 79 20 70 61 72 61  entified by para
28ed0 6d 65 74 65 72 73 0a 2a 2a 20 69 53 65 67 69 64  meters.** iSegid
28ee0 2f 69 4c 65 61 66 20 69 73 20 69 74 65 72 61 74  /iLeaf is iterat
28ef0 65 64 20 69 6e 20 66 6f 72 77 61 72 64 73 20 6f  ed in forwards o
28f00 72 20 72 65 76 65 72 73 65 20 6f 72 64 65 72 2e  r reverse order.
28f10 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
28f20 66 74 73 35 54 65 73 74 44 6c 69 64 78 52 65 76  fts5TestDlidxRev
28f30 65 72 73 65 28 0a 20 20 46 74 73 35 49 6e 64 65  erse(.  Fts5Inde
28f40 78 20 2a 70 2c 20 0a 20 20 69 6e 74 20 69 53 65  x *p, .  int iSe
28f50 67 69 64 2c 20 20 20 20 20 20 20 20 20 20 20 20  gid,            
28f60 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 67 6d           /* Segm
28f70 65 6e 74 20 69 64 20 74 6f 20 6c 6f 61 64 20 66  ent id to load f
28f80 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 65  rom */.  int iLe
28f90 61 66 20 20 20 20 20 20 20 20 20 20 20 20 20 20  af              
28fa0 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 61 64           /* Load
28fb0 20 64 6f 63 6c 69 73 74 2d 69 6e 64 65 78 20 66   doclist-index f
28fc0 6f 72 20 74 68 69 73 20 6c 65 61 66 20 2a 2f 0a  or this leaf */.
28fd0 29 7b 0a 20 20 46 74 73 35 44 6c 69 64 78 49 74  ){.  Fts5DlidxIt
28fe0 65 72 20 2a 70 44 6c 69 64 78 20 3d 20 30 3b 0a  er *pDlidx = 0;.
28ff0 20 20 75 36 34 20 63 6b 73 75 6d 31 20 3d 20 31    u64 cksum1 = 1
29000 33 3b 0a 20 20 75 36 34 20 63 6b 73 75 6d 32 20  3;.  u64 cksum2 
29010 3d 20 31 33 3b 0a 0a 20 20 66 6f 72 28 70 44 6c  = 13;..  for(pDl
29020 69 64 78 3d 66 74 73 35 44 6c 69 64 78 49 74 65  idx=fts5DlidxIte
29030 72 49 6e 69 74 28 70 2c 20 30 2c 20 69 53 65 67  rInit(p, 0, iSeg
29040 69 64 2c 20 69 4c 65 61 66 29 3b 0a 20 20 20 20  id, iLeaf);.    
29050 20 20 66 74 73 35 44 6c 69 64 78 49 74 65 72 45    fts5DlidxIterE
29060 6f 66 28 70 2c 20 70 44 6c 69 64 78 29 3d 3d 30  of(p, pDlidx)==0
29070 3b 0a 20 20 20 20 20 20 66 74 73 35 44 6c 69 64  ;.      fts5Dlid
29080 78 49 74 65 72 4e 65 78 74 28 70 2c 20 70 44 6c  xIterNext(p, pDl
29090 69 64 78 29 0a 20 20 29 7b 0a 20 20 20 20 69 36  idx).  ){.    i6
290a0 34 20 69 52 6f 77 69 64 20 3d 20 66 74 73 35 44  4 iRowid = fts5D
290b0 6c 69 64 78 49 74 65 72 52 6f 77 69 64 28 70 44  lidxIterRowid(pD
290c0 6c 69 64 78 29 3b 0a 20 20 20 20 69 6e 74 20 70  lidx);.    int p
290d0 67 6e 6f 20 3d 20 66 74 73 35 44 6c 69 64 78 49  gno = fts5DlidxI
290e0 74 65 72 50 67 6e 6f 28 70 44 6c 69 64 78 29 3b  terPgno(pDlidx);
290f0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 67 6e  .    assert( pgn
29100 6f 3e 69 4c 65 61 66 20 29 3b 0a 20 20 20 20 63  o>iLeaf );.    c
29110 6b 73 75 6d 31 20 2b 3d 20 69 52 6f 77 69 64 20  ksum1 += iRowid 
29120 2b 20 28 28 69 36 34 29 70 67 6e 6f 3c 3c 33 32  + ((i64)pgno<<32
29130 29 3b 0a 20 20 7d 0a 20 20 66 74 73 35 44 6c 69  );.  }.  fts5Dli
29140 64 78 49 74 65 72 46 72 65 65 28 70 44 6c 69 64  dxIterFree(pDlid
29150 78 29 3b 0a 20 20 70 44 6c 69 64 78 20 3d 20 30  x);.  pDlidx = 0
29160 3b 0a 0a 20 20 66 6f 72 28 70 44 6c 69 64 78 3d  ;..  for(pDlidx=
29170 66 74 73 35 44 6c 69 64 78 49 74 65 72 49 6e 69  fts5DlidxIterIni
29180 74 28 70 2c 20 31 2c 20 69 53 65 67 69 64 2c 20  t(p, 1, iSegid, 
29190 69 4c 65 61 66 29 3b 0a 20 20 20 20 20 20 66 74  iLeaf);.      ft
291a0 73 35 44 6c 69 64 78 49 74 65 72 45 6f 66 28 70  s5DlidxIterEof(p
291b0 2c 20 70 44 6c 69 64 78 29 3d 3d 30 3b 0a 20 20  , pDlidx)==0;.  
291c0 20 20 20 20 66 74 73 35 44 6c 69 64 78 49 74 65      fts5DlidxIte
291d0 72 50 72 65 76 28 70 2c 20 70 44 6c 69 64 78 29  rPrev(p, pDlidx)
291e0 0a 20 20 29 7b 0a 20 20 20 20 69 36 34 20 69 52  .  ){.    i64 iR
291f0 6f 77 69 64 20 3d 20 66 74 73 35 44 6c 69 64 78  owid = fts5Dlidx
29200 49 74 65 72 52 6f 77 69 64 28 70 44 6c 69 64 78  IterRowid(pDlidx
29210 29 3b 0a 20 20 20 20 69 6e 74 20 70 67 6e 6f 20  );.    int pgno 
29220 3d 20 66 74 73 35 44 6c 69 64 78 49 74 65 72 50  = fts5DlidxIterP
29230 67 6e 6f 28 70 44 6c 69 64 78 29 3b 0a 20 20 20  gno(pDlidx);.   
29240 20 61 73 73 65 72 74 28 20 66 74 73 35 44 6c 69   assert( fts5Dli
29250 64 78 49 74 65 72 50 67 6e 6f 28 70 44 6c 69 64  dxIterPgno(pDlid
29260 78 29 3e 69 4c 65 61 66 20 29 3b 0a 20 20 20 20  x)>iLeaf );.    
29270 63 6b 73 75 6d 32 20 2b 3d 20 69 52 6f 77 69 64  cksum2 += iRowid
29280 20 2b 20 28 28 69 36 34 29 70 67 6e 6f 3c 3c 33   + ((i64)pgno<<3
29290 32 29 3b 0a 20 20 7d 0a 20 20 66 74 73 35 44 6c  2);.  }.  fts5Dl
292a0 69 64 78 49 74 65 72 46 72 65 65 28 70 44 6c 69  idxIterFree(pDli
292b0 64 78 29 3b 0a 20 20 70 44 6c 69 64 78 20 3d 20  dx);.  pDlidx = 
292c0 30 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d  0;..  if( p->rc=
292d0 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 63 6b  =SQLITE_OK && ck
292e0 73 75 6d 31 21 3d 63 6b 73 75 6d 32 20 29 20 70  sum1!=cksum2 ) p
292f0 2d 3e 72 63 20 3d 20 46 54 53 35 5f 43 4f 52 52  ->rc = FTS5_CORR
29300 55 50 54 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69  UPT;.}..static i
29310 6e 74 20 66 74 73 35 51 75 65 72 79 43 6b 73 75  nt fts5QueryCksu
29320 6d 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a  m(.  Fts5Index *
29330 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
29340 20 20 20 20 20 2f 2a 20 46 74 73 35 20 69 6e 64       /* Fts5 ind
29350 65 78 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69  ex object */.  i
29360 6e 74 20 69 49 64 78 2c 0a 20 20 63 6f 6e 73 74  nt iIdx,.  const
29370 20 63 68 61 72 20 2a 7a 2c 20 20 20 20 20 20 20   char *z,       
29380 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
29390 64 65 78 20 6b 65 79 20 74 6f 20 71 75 65 72 79  dex key to query
293a0 20 66 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 6e 2c   for */.  int n,
293b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
293c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
293d0 65 20 6f 66 20 69 6e 64 65 78 20 6b 65 79 20 69  e of index key i
293e0 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 69 6e 74  n bytes */.  int
293f0 20 66 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20   flags,         
29400 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
29410 46 6c 61 67 73 20 66 6f 72 20 46 74 73 35 49 6e  Flags for Fts5In
29420 64 65 78 51 75 65 72 79 20 2a 2f 0a 20 20 75 36  dexQuery */.  u6
29430 34 20 2a 70 43 6b 73 75 6d 20 20 20 20 20 20 20  4 *pCksum       
29440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
29450 20 49 4e 2f 4f 55 54 3a 20 43 68 65 63 6b 73 75   IN/OUT: Checksu
29460 6d 20 76 61 6c 75 65 20 2a 2f 0a 29 7b 0a 20 20  m value */.){.  
29470 69 6e 74 20 65 44 65 74 61 69 6c 20 3d 20 70 2d  int eDetail = p-
29480 3e 70 43 6f 6e 66 69 67 2d 3e 65 44 65 74 61 69  >pConfig->eDetai
29490 6c 3b 0a 20 20 75 36 34 20 63 6b 73 75 6d 20 3d  l;.  u64 cksum =
294a0 20 2a 70 43 6b 73 75 6d 3b 0a 20 20 46 74 73 35   *pCksum;.  Fts5
294b0 49 6e 64 65 78 49 74 65 72 20 2a 70 49 74 65 72  IndexIter *pIter
294c0 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63 20 3d   = 0;.  int rc =
294d0 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65   sqlite3Fts5Inde
294e0 78 51 75 65 72 79 28 70 2c 20 7a 2c 20 6e 2c 20  xQuery(p, z, n, 
294f0 66 6c 61 67 73 2c 20 30 2c 20 26 70 49 74 65 72  flags, 0, &pIter
29500 29 3b 0a 0a 20 20 77 68 69 6c 65 28 20 72 63 3d  );..  while( rc=
29510 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 30 3d  =SQLITE_OK && 0=
29520 3d 73 71 6c 69 74 65 33 46 74 73 35 49 74 65 72  =sqlite3Fts5Iter
29530 45 6f 66 28 70 49 74 65 72 29 20 29 7b 0a 20 20  Eof(pIter) ){.  
29540 20 20 69 36 34 20 72 6f 77 69 64 20 3d 20 70 49    i64 rowid = pI
29550 74 65 72 2d 3e 69 52 6f 77 69 64 3b 0a 0a 20 20  ter->iRowid;..  
29560 20 20 69 66 28 20 65 44 65 74 61 69 6c 3d 3d 46    if( eDetail==F
29570 54 53 35 5f 44 45 54 41 49 4c 5f 4e 4f 4e 45 20  TS5_DETAIL_NONE 
29580 29 7b 0a 20 20 20 20 20 20 63 6b 73 75 6d 20 5e  ){.      cksum ^
29590 3d 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64  = sqlite3Fts5Ind
295a0 65 78 45 6e 74 72 79 43 6b 73 75 6d 28 72 6f 77  exEntryCksum(row
295b0 69 64 2c 20 30 2c 20 30 2c 20 69 49 64 78 2c 20  id, 0, 0, iIdx, 
295c0 7a 2c 20 6e 29 3b 0a 20 20 20 20 7d 65 6c 73 65  z, n);.    }else
295d0 7b 0a 20 20 20 20 20 20 46 74 73 35 50 6f 73 6c  {.      Fts5Posl
295e0 69 73 74 52 65 61 64 65 72 20 73 52 65 61 64 65  istReader sReade
295f0 72 3b 0a 20 20 20 20 20 20 66 6f 72 28 73 71 6c  r;.      for(sql
29600 69 74 65 33 46 74 73 35 50 6f 73 6c 69 73 74 52  ite3Fts5PoslistR
29610 65 61 64 65 72 49 6e 69 74 28 70 49 74 65 72 2d  eaderInit(pIter-
29620 3e 70 44 61 74 61 2c 20 70 49 74 65 72 2d 3e 6e  >pData, pIter->n
29630 44 61 74 61 2c 20 26 73 52 65 61 64 65 72 29 3b  Data, &sReader);
29640 0a 20 20 20 20 20 20 20 20 20 20 73 52 65 61 64  .          sRead
29650 65 72 2e 62 45 6f 66 3d 3d 30 3b 0a 20 20 20 20  er.bEof==0;.    
29660 20 20 20 20 20 20 73 71 6c 69 74 65 33 46 74 73        sqlite3Fts
29670 35 50 6f 73 6c 69 73 74 52 65 61 64 65 72 4e 65  5PoslistReaderNe
29680 78 74 28 26 73 52 65 61 64 65 72 29 0a 20 20 20  xt(&sReader).   
29690 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e     ){.        in
296a0 74 20 69 43 6f 6c 20 3d 20 46 54 53 35 5f 50 4f  t iCol = FTS5_PO
296b0 53 32 43 4f 4c 55 4d 4e 28 73 52 65 61 64 65 72  S2COLUMN(sReader
296c0 2e 69 50 6f 73 29 3b 0a 20 20 20 20 20 20 20 20  .iPos);.        
296d0 69 6e 74 20 69 4f 66 66 20 3d 20 46 54 53 35 5f  int iOff = FTS5_
296e0 50 4f 53 32 4f 46 46 53 45 54 28 73 52 65 61 64  POS2OFFSET(sRead
296f0 65 72 2e 69 50 6f 73 29 3b 0a 20 20 20 20 20 20  er.iPos);.      
29700 20 20 63 6b 73 75 6d 20 5e 3d 20 73 71 6c 69 74    cksum ^= sqlit
29710 65 33 46 74 73 35 49 6e 64 65 78 45 6e 74 72 79  e3Fts5IndexEntry
29720 43 6b 73 75 6d 28 72 6f 77 69 64 2c 20 69 43 6f  Cksum(rowid, iCo
29730 6c 2c 20 69 4f 66 66 2c 20 69 49 64 78 2c 20 7a  l, iOff, iIdx, z
29740 2c 20 6e 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , n);.      }.  
29750 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d    }.    if( rc==
29760 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
29770 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 46     rc = sqlite3F
29780 74 73 35 49 74 65 72 4e 65 78 74 28 70 49 74 65  ts5IterNext(pIte
29790 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  r);.    }.  }.  
297a0 73 71 6c 69 74 65 33 46 74 73 35 49 74 65 72 43  sqlite3Fts5IterC
297b0 6c 6f 73 65 28 70 49 74 65 72 29 3b 0a 0a 20 20  lose(pIter);..  
297c0 2a 70 43 6b 73 75 6d 20 3d 20 63 6b 73 75 6d 3b  *pCksum = cksum;
297d0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
297e0 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
297f0 63 74 69 6f 6e 20 69 73 20 61 6c 73 6f 20 70 75  ction is also pu
29800 72 65 6c 79 20 61 6e 20 69 6e 74 65 72 6e 61 6c  rely an internal
29810 20 74 65 73 74 2e 20 49 74 20 64 6f 65 73 20 6e   test. It does n
29820 6f 74 20 63 6f 6e 74 72 69 62 75 74 65 20 74 6f  ot contribute to
29830 20 0a 2a 2a 20 46 54 53 20 66 75 6e 63 74 69 6f   .** FTS functio
29840 6e 61 6c 69 74 79 2c 20 6f 72 20 65 76 65 6e 20  nality, or even 
29850 74 68 65 20 69 6e 74 65 67 72 69 74 79 2d 63 68  the integrity-ch
29860 65 63 6b 2c 20 69 6e 20 61 6e 79 20 77 61 79 2e  eck, in any way.
29870 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
29880 66 74 73 35 54 65 73 74 54 65 72 6d 28 0a 20 20  fts5TestTerm(.  
29890 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 0a 20  Fts5Index *p, . 
298a0 20 46 74 73 35 42 75 66 66 65 72 20 2a 70 50 72   Fts5Buffer *pPr
298b0 65 76 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ev,             
298c0 20 2f 2a 20 50 72 65 76 69 6f 75 73 20 74 65 72   /* Previous ter
298d0 6d 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  m */.  const cha
298e0 72 20 2a 7a 2c 20 69 6e 74 20 6e 2c 20 20 20 20  r *z, int n,    
298f0 20 20 20 20 20 20 20 2f 2a 20 50 6f 73 73 69 62         /* Possib
29900 6c 79 20 6e 65 77 20 74 65 72 6d 20 74 6f 20 74  ly new term to t
29910 65 73 74 20 2a 2f 0a 20 20 75 36 34 20 65 78 70  est */.  u64 exp
29920 65 63 74 65 64 2c 0a 20 20 75 36 34 20 2a 70 43  ected,.  u64 *pC
29930 6b 73 75 6d 0a 29 7b 0a 20 20 69 6e 74 20 72 63  ksum.){.  int rc
29940 20 3d 20 70 2d 3e 72 63 3b 0a 20 20 69 66 28 20   = p->rc;.  if( 
29950 70 50 72 65 76 2d 3e 6e 3d 3d 30 20 29 7b 0a 20  pPrev->n==0 ){. 
29960 20 20 20 66 74 73 35 42 75 66 66 65 72 53 65 74     fts5BufferSet
29970 28 26 72 63 2c 20 70 50 72 65 76 2c 20 6e 2c 20  (&rc, pPrev, n, 
29980 28 63 6f 6e 73 74 20 75 38 2a 29 7a 29 3b 0a 20  (const u8*)z);. 
29990 20 7d 65 6c 73 65 0a 20 20 69 66 28 20 72 63 3d   }else.  if( rc=
299a0 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 28 70  =SQLITE_OK && (p
299b0 50 72 65 76 2d 3e 6e 21 3d 6e 20 7c 7c 20 6d 65  Prev->n!=n || me
299c0 6d 63 6d 70 28 70 50 72 65 76 2d 3e 70 2c 20 7a  mcmp(pPrev->p, z
299d0 2c 20 6e 29 29 20 29 7b 0a 20 20 20 20 75 36 34  , n)) ){.    u64
299e0 20 63 6b 73 75 6d 33 20 3d 20 2a 70 43 6b 73 75   cksum3 = *pCksu
299f0 6d 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  m;.    const cha
29a00 72 20 2a 7a 54 65 72 6d 20 3d 20 28 63 6f 6e 73  r *zTerm = (cons
29a10 74 20 63 68 61 72 2a 29 26 70 50 72 65 76 2d 3e  t char*)&pPrev->
29a20 70 5b 31 5d 3b 20 20 2f 2a 20 74 65 72 6d 20 73  p[1];  /* term s
29a30 61 6e 73 20 70 72 65 66 69 78 2d 62 79 74 65 20  ans prefix-byte 
29a40 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 54 65 72 6d  */.    int nTerm
29a50 20 3d 20 70 50 72 65 76 2d 3e 6e 2d 31 3b 20 20   = pPrev->n-1;  
29a60 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
29a70 65 20 6f 66 20 7a 54 65 72 6d 20 69 6e 20 62 79  e of zTerm in by
29a80 74 65 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69  tes */.    int i
29a90 49 64 78 20 3d 20 28 70 50 72 65 76 2d 3e 70 5b  Idx = (pPrev->p[
29aa0 30 5d 20 2d 20 46 54 53 35 5f 4d 41 49 4e 5f 50  0] - FTS5_MAIN_P
29ab0 52 45 46 49 58 29 3b 0a 20 20 20 20 69 6e 74 20  REFIX);.    int 
29ac0 66 6c 61 67 73 20 3d 20 28 69 49 64 78 3d 3d 30  flags = (iIdx==0
29ad0 20 3f 20 30 20 3a 20 46 54 53 35 49 4e 44 45 58   ? 0 : FTS5INDEX
29ae0 5f 51 55 45 52 59 5f 50 52 45 46 49 58 29 3b 0a  _QUERY_PREFIX);.
29af0 20 20 20 20 75 36 34 20 63 6b 31 20 3d 20 30 3b      u64 ck1 = 0;
29b00 0a 20 20 20 20 75 36 34 20 63 6b 32 20 3d 20 30  .    u64 ck2 = 0
29b10 3b 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20  ;..    /* Check 
29b20 74 68 61 74 20 74 68 65 20 72 65 73 75 6c 74 73  that the results
29b30 20 72 65 74 75 72 6e 65 64 20 66 6f 72 20 41 53   returned for AS
29b40 43 20 61 6e 64 20 44 45 53 43 20 71 75 65 72 69  C and DESC queri
29b50 65 73 20 61 72 65 0a 20 20 20 20 2a 2a 20 74 68  es are.    ** th
29b60 65 20 73 61 6d 65 2e 20 49 66 20 6e 6f 74 2c 20  e same. If not, 
29b70 63 61 6c 6c 20 74 68 69 73 20 63 6f 72 72 75 70  call this corrup
29b80 74 69 6f 6e 2e 20 20 2a 2f 0a 20 20 20 20 72 63  tion.  */.    rc
29b90 20 3d 20 66 74 73 35 51 75 65 72 79 43 6b 73 75   = fts5QueryCksu
29ba0 6d 28 70 2c 20 69 49 64 78 2c 20 7a 54 65 72 6d  m(p, iIdx, zTerm
29bb0 2c 20 6e 54 65 72 6d 2c 20 66 6c 61 67 73 2c 20  , nTerm, flags, 
29bc0 26 63 6b 31 29 3b 0a 20 20 20 20 69 66 28 20 72  &ck1);.    if( r
29bd0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
29be0 20 20 20 20 20 20 69 6e 74 20 66 20 3d 20 66 6c        int f = fl
29bf0 61 67 73 7c 46 54 53 35 49 4e 44 45 58 5f 51 55  ags|FTS5INDEX_QU
29c00 45 52 59 5f 44 45 53 43 3b 0a 20 20 20 20 20 20  ERY_DESC;.      
29c10 72 63 20 3d 20 66 74 73 35 51 75 65 72 79 43 6b  rc = fts5QueryCk
29c20 73 75 6d 28 70 2c 20 69 49 64 78 2c 20 7a 54 65  sum(p, iIdx, zTe
29c30 72 6d 2c 20 6e 54 65 72 6d 2c 20 66 2c 20 26 63  rm, nTerm, f, &c
29c40 6b 32 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  k2);.    }.    i
29c50 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
29c60 20 26 26 20 63 6b 31 21 3d 63 6b 32 20 29 20 72   && ck1!=ck2 ) r
29c70 63 20 3d 20 46 54 53 35 5f 43 4f 52 52 55 50 54  c = FTS5_CORRUPT
29c80 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69  ;..    /* If thi
29c90 73 20 69 73 20 61 20 70 72 65 66 69 78 20 71 75  s is a prefix qu
29ca0 65 72 79 2c 20 63 68 65 63 6b 20 74 68 61 74 20  ery, check that 
29cb0 74 68 65 20 72 65 73 75 6c 74 73 20 72 65 74 75  the results retu
29cc0 72 6e 65 64 20 69 66 20 74 68 65 0a 20 20 20 20  rned if the.    
29cd0 2a 2a 20 74 68 65 20 69 6e 64 65 78 20 69 73 20  ** the index is 
29ce0 64 69 73 61 62 6c 65 64 20 61 72 65 20 74 68 65  disabled are the
29cf0 20 73 61 6d 65 2e 20 49 6e 20 62 6f 74 68 20 41   same. In both A
29d00 53 43 20 61 6e 64 20 44 45 53 43 20 6f 72 64 65  SC and DESC orde
29d10 72 2e 20 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  r. .    **.    *
29d20 2a 20 54 68 69 73 20 63 68 65 63 6b 20 6d 61 79  * This check may
29d30 20 6f 6e 6c 79 20 62 65 20 70 65 72 66 6f 72 6d   only be perform
29d40 65 64 20 69 66 20 74 68 65 20 68 61 73 68 20 74  ed if the hash t
29d50 61 62 6c 65 20 69 73 20 65 6d 70 74 79 2e 20 54  able is empty. T
29d60 68 69 73 0a 20 20 20 20 2a 2a 20 69 73 20 62 65  his.    ** is be
29d70 63 61 75 73 65 20 74 68 65 20 68 61 73 68 20 74  cause the hash t
29d80 61 62 6c 65 20 6f 6e 6c 79 20 73 75 70 70 6f 72  able only suppor
29d90 74 73 20 61 20 73 69 6e 67 6c 65 20 73 63 61 6e  ts a single scan
29da0 20 71 75 65 72 79 20 61 74 0a 20 20 20 20 2a 2a   query at.    **
29db0 20 61 20 74 69 6d 65 2c 20 61 6e 64 20 74 68 65   a time, and the
29dc0 20 6d 75 6c 74 69 2d 69 74 65 72 20 6c 6f 6f 70   multi-iter loop
29dd0 20 66 72 6f 6d 20 77 68 69 63 68 20 74 68 69 73   from which this
29de0 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
29df0 6c 65 64 0a 20 20 20 20 2a 2a 20 69 73 20 61 6c  led.    ** is al
29e00 72 65 61 64 79 20 70 65 72 66 6f 72 6d 69 6e 67  ready performing
29e10 20 73 75 63 68 20 61 20 73 63 61 6e 2e 20 2a 2f   such a scan. */
29e20 0a 20 20 20 20 69 66 28 20 70 2d 3e 6e 50 65 6e  .    if( p->nPen
29e30 64 69 6e 67 44 61 74 61 3d 3d 30 20 29 7b 0a 20  dingData==0 ){. 
29e40 20 20 20 20 20 69 66 28 20 69 49 64 78 3e 30 20       if( iIdx>0 
29e50 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  && rc==SQLITE_OK
29e60 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20   ){.        int 
29e70 66 20 3d 20 66 6c 61 67 73 7c 46 54 53 35 49 4e  f = flags|FTS5IN
29e80 44 45 58 5f 51 55 45 52 59 5f 54 45 53 54 5f 4e  DEX_QUERY_TEST_N
29e90 4f 49 44 58 3b 0a 20 20 20 20 20 20 20 20 63 6b  OIDX;.        ck
29ea0 32 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 72  2 = 0;.        r
29eb0 63 20 3d 20 66 74 73 35 51 75 65 72 79 43 6b 73  c = fts5QueryCks
29ec0 75 6d 28 70 2c 20 69 49 64 78 2c 20 7a 54 65 72  um(p, iIdx, zTer
29ed0 6d 2c 20 6e 54 65 72 6d 2c 20 66 2c 20 26 63 6b  m, nTerm, f, &ck
29ee0 32 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  2);.        if( 
29ef0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
29f00 20 63 6b 31 21 3d 63 6b 32 20 29 20 72 63 20 3d   ck1!=ck2 ) rc =
29f10 20 46 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20   FTS5_CORRUPT;. 
29f20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
29f30 20 69 49 64 78 3e 30 20 26 26 20 72 63 3d 3d 53   iIdx>0 && rc==S
29f40 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
29f50 20 20 20 20 69 6e 74 20 66 20 3d 20 66 6c 61 67      int f = flag
29f60 73 7c 46 54 53 35 49 4e 44 45 58 5f 51 55 45 52  s|FTS5INDEX_QUER
29f70 59 5f 54 45 53 54 5f 4e 4f 49 44 58 7c 46 54 53  Y_TEST_NOIDX|FTS
29f80 35 49 4e 44 45 58 5f 51 55 45 52 59 5f 44 45 53  5INDEX_QUERY_DES
29f90 43 3b 0a 20 20 20 20 20 20 20 20 63 6b 32 20 3d  C;.        ck2 =
29fa0 20 30 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   0;.        rc =
29fb0 20 66 74 73 35 51 75 65 72 79 43 6b 73 75 6d 28   fts5QueryCksum(
29fc0 70 2c 20 69 49 64 78 2c 20 7a 54 65 72 6d 2c 20  p, iIdx, zTerm, 
29fd0 6e 54 65 72 6d 2c 20 66 2c 20 26 63 6b 32 29 3b  nTerm, f, &ck2);
29fe0 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d  .        if( rc=
29ff0 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 63 6b  =SQLITE_OK && ck
2a000 31 21 3d 63 6b 32 20 29 20 72 63 20 3d 20 46 54  1!=ck2 ) rc = FT
2a010 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20 20  S5_CORRUPT;.    
2a020 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63    }.    }..    c
2a030 6b 73 75 6d 33 20 5e 3d 20 63 6b 31 3b 0a 20 20  ksum3 ^= ck1;.  
2a040 20 20 66 74 73 35 42 75 66 66 65 72 53 65 74 28    fts5BufferSet(
2a050 26 72 63 2c 20 70 50 72 65 76 2c 20 6e 2c 20 28  &rc, pPrev, n, (
2a060 63 6f 6e 73 74 20 75 38 2a 29 7a 29 3b 0a 0a 20  const u8*)z);.. 
2a070 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
2a080 45 5f 4f 4b 20 26 26 20 63 6b 73 75 6d 33 21 3d  E_OK && cksum3!=
2a090 65 78 70 65 63 74 65 64 20 29 7b 0a 20 20 20 20  expected ){.    
2a0a0 20 20 72 63 20 3d 20 46 54 53 35 5f 43 4f 52 52    rc = FTS5_CORR
2a0b0 55 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2a  UPT;.    }.    *
2a0c0 70 43 6b 73 75 6d 20 3d 20 63 6b 73 75 6d 33 3b  pCksum = cksum3;
2a0d0 0a 20 20 7d 0a 20 20 70 2d 3e 72 63 20 3d 20 72  .  }.  p->rc = r
2a0e0 63 3b 0a 7d 0a 20 0a 23 65 6c 73 65 0a 23 20 64  c;.}. .#else.# d
2a0f0 65 66 69 6e 65 20 66 74 73 35 54 65 73 74 44 6c  efine fts5TestDl
2a100 69 64 78 52 65 76 65 72 73 65 28 78 2c 79 2c 7a  idxReverse(x,y,z
2a110 29 0a 23 20 64 65 66 69 6e 65 20 66 74 73 35 54  ).# define fts5T
2a120 65 73 74 54 65 72 6d 28 75 2c 76 2c 77 2c 78 2c  estTerm(u,v,w,x,
2a130 79 2c 7a 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  y,z).#endif../*.
2a140 2a 2a 20 43 68 65 63 6b 20 74 68 61 74 3a 0a 2a  ** Check that:.*
2a150 2a 0a 2a 2a 20 20 20 31 29 20 41 6c 6c 20 6c 65  *.**   1) All le
2a160 61 76 65 73 20 6f 66 20 70 53 65 67 20 62 65 74  aves of pSeg bet
2a170 77 65 65 6e 20 69 46 69 72 73 74 20 61 6e 64 20  ween iFirst and 
2a180 69 4c 61 73 74 20 28 69 6e 63 6c 75 73 69 76 65  iLast (inclusive
2a190 29 20 65 78 69 73 74 20 61 6e 64 0a 2a 2a 20 20  ) exist and.**  
2a1a0 20 20 20 20 63 6f 6e 74 61 69 6e 20 7a 65 72 6f      contain zero
2a1b0 20 74 65 72 6d 73 2e 0a 2a 2a 20 20 20 32 29 20   terms..**   2) 
2a1c0 41 6c 6c 20 6c 65 61 76 65 73 20 6f 66 20 70 53  All leaves of pS
2a1d0 65 67 20 62 65 74 77 65 65 6e 20 69 4e 6f 52 6f  eg between iNoRo
2a1e0 77 69 64 20 61 6e 64 20 69 4c 61 73 74 20 28 69  wid and iLast (i
2a1f0 6e 63 6c 75 73 69 76 65 29 20 65 78 69 73 74 20  nclusive) exist 
2a200 61 6e 64 0a 2a 2a 20 20 20 20 20 20 63 6f 6e 74  and.**      cont
2a210 61 69 6e 20 7a 65 72 6f 20 72 6f 77 69 64 73 2e  ain zero rowids.
2a220 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
2a230 66 74 73 35 49 6e 64 65 78 49 6e 74 65 67 72 69  fts5IndexIntegri
2a240 74 79 43 68 65 63 6b 45 6d 70 74 79 28 0a 20 20  tyCheckEmpty(.  
2a250 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 0a 20 20  Fts5Index *p,.  
2a260 46 74 73 35 53 74 72 75 63 74 75 72 65 53 65 67  Fts5StructureSeg
2a270 6d 65 6e 74 20 2a 70 53 65 67 2c 20 20 20 20 20  ment *pSeg,     
2a280 2f 2a 20 53 65 67 6d 65 6e 74 20 74 6f 20 63 68  /* Segment to ch
2a290 65 63 6b 20 69 6e 74 65 72 6e 61 6c 20 63 6f 6e  eck internal con
2a2a0 73 69 73 74 65 6e 63 79 20 2a 2f 0a 20 20 69 6e  sistency */.  in
2a2b0 74 20 69 46 69 72 73 74 2c 0a 20 20 69 6e 74 20  t iFirst,.  int 
2a2c0 69 4e 6f 52 6f 77 69 64 2c 0a 20 20 69 6e 74 20  iNoRowid,.  int 
2a2d0 69 4c 61 73 74 0a 29 7b 0a 20 20 69 6e 74 20 69  iLast.){.  int i
2a2e0 3b 0a 0a 20 20 2f 2a 20 4e 6f 77 20 63 68 65 63  ;..  /* Now chec
2a2f0 6b 20 74 68 61 74 20 74 68 65 20 69 74 65 72 2e  k that the iter.
2a300 6e 45 6d 70 74 79 20 6c 65 61 76 65 73 20 66 6f  nEmpty leaves fo
2a310 6c 6c 6f 77 69 6e 67 20 74 68 65 20 63 75 72 72  llowing the curr
2a320 65 6e 74 20 6c 65 61 66 0a 20 20 2a 2a 20 28 61  ent leaf.  ** (a
2a330 29 20 65 78 69 73 74 20 61 6e 64 20 28 62 29 20  ) exist and (b) 
2a340 63 6f 6e 74 61 69 6e 20 6e 6f 20 74 65 72 6d 73  contain no terms
2a350 2e 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 69 46 69  . */.  for(i=iFi
2a360 72 73 74 3b 20 70 2d 3e 72 63 3d 3d 53 51 4c 49  rst; p->rc==SQLI
2a370 54 45 5f 4f 4b 20 26 26 20 69 3c 3d 69 4c 61 73  TE_OK && i<=iLas
2a380 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 46 74 73  t; i++){.    Fts
2a390 35 44 61 74 61 20 2a 70 4c 65 61 66 20 3d 20 66  5Data *pLeaf = f
2a3a0 74 73 35 44 61 74 61 52 65 61 64 28 70 2c 20 46  ts5DataRead(p, F
2a3b0 54 53 35 5f 53 45 47 4d 45 4e 54 5f 52 4f 57 49  TS5_SEGMENT_ROWI
2a3c0 44 28 70 53 65 67 2d 3e 69 53 65 67 69 64 2c 20  D(pSeg->iSegid, 
2a3d0 69 29 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 65  i));.    if( pLe
2a3e0 61 66 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  af ){.      if( 
2a3f0 21 66 74 73 35 4c 65 61 66 49 73 54 65 72 6d 6c  !fts5LeafIsTerml
2a400 65 73 73 28 70 4c 65 61 66 29 20 29 20 70 2d 3e  ess(pLeaf) ) p->
2a410 72 63 20 3d 20 46 54 53 35 5f 43 4f 52 52 55 50  rc = FTS5_CORRUP
2a420 54 3b 0a 20 20 20 20 20 20 69 66 28 20 69 3e 3d  T;.      if( i>=
2a430 69 4e 6f 52 6f 77 69 64 20 26 26 20 30 21 3d 66  iNoRowid && 0!=f
2a440 74 73 35 4c 65 61 66 46 69 72 73 74 52 6f 77 69  ts5LeafFirstRowi
2a450 64 4f 66 66 28 70 4c 65 61 66 29 20 29 20 70 2d  dOff(pLeaf) ) p-
2a460 3e 72 63 20 3d 20 46 54 53 35 5f 43 4f 52 52 55  >rc = FTS5_CORRU
2a470 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 74  PT;.    }.    ft
2a480 73 35 44 61 74 61 52 65 6c 65 61 73 65 28 70 4c  s5DataRelease(pL
2a490 65 61 66 29 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61  eaf);.  }.}..sta
2a4a0 74 69 63 20 76 6f 69 64 20 66 74 73 35 49 6e 74  tic void fts5Int
2a4b0 65 67 72 69 74 79 43 68 65 63 6b 50 67 69 64 78  egrityCheckPgidx
2a4c0 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 46  (Fts5Index *p, F
2a4d0 74 73 35 44 61 74 61 20 2a 70 4c 65 61 66 29 7b  ts5Data *pLeaf){
2a4e0 0a 20 20 69 6e 74 20 69 54 65 72 6d 4f 66 66 20  .  int iTermOff 
2a4f0 3d 20 30 3b 0a 20 20 69 6e 74 20 69 69 3b 0a 0a  = 0;.  int ii;..
2a500 20 20 46 74 73 35 42 75 66 66 65 72 20 62 75 66    Fts5Buffer buf
2a510 31 20 3d 20 7b 30 2c 30 2c 30 7d 3b 0a 20 20 46  1 = {0,0,0};.  F
2a520 74 73 35 42 75 66 66 65 72 20 62 75 66 32 20 3d  ts5Buffer buf2 =
2a530 20 7b 30 2c 30 2c 30 7d 3b 0a 0a 20 20 69 69 20   {0,0,0};..  ii 
2a540 3d 20 70 4c 65 61 66 2d 3e 73 7a 4c 65 61 66 3b  = pLeaf->szLeaf;
2a550 0a 20 20 77 68 69 6c 65 28 20 69 69 3c 70 4c 65  .  while( ii<pLe
2a560 61 66 2d 3e 6e 6e 20 26 26 20 70 2d 3e 72 63 3d  af->nn && p->rc=
2a570 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2a580 20 20 69 6e 74 20 72 65 73 3b 0a 20 20 20 20 69    int res;.    i
2a590 6e 74 20 69 4f 66 66 3b 0a 20 20 20 20 69 6e 74  nt iOff;.    int
2a5a0 20 6e 49 6e 63 72 3b 0a 0a 20 20 20 20 69 69 20   nIncr;..    ii 
2a5b0 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e 74  += fts5GetVarint
2a5c0 33 32 28 26 70 4c 65 61 66 2d 3e 70 5b 69 69 5d  32(&pLeaf->p[ii]
2a5d0 2c 20 6e 49 6e 63 72 29 3b 0a 20 20 20 20 69 54  , nIncr);.    iT
2a5e0 65 72 6d 4f 66 66 20 2b 3d 20 6e 49 6e 63 72 3b  ermOff += nIncr;
2a5f0 0a 20 20 20 20 69 4f 66 66 20 3d 20 69 54 65 72  .    iOff = iTer
2a600 6d 4f 66 66 3b 0a 0a 20 20 20 20 69 66 28 20 69  mOff;..    if( i
2a610 4f 66 66 3e 3d 70 4c 65 61 66 2d 3e 73 7a 4c 65  Off>=pLeaf->szLe
2a620 61 66 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 72  af ){.      p->r
2a630 63 20 3d 20 46 54 53 35 5f 43 4f 52 52 55 50 54  c = FTS5_CORRUPT
2a640 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
2a650 69 54 65 72 6d 4f 66 66 3d 3d 6e 49 6e 63 72 20  iTermOff==nIncr 
2a660 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 42 79  ){.      int nBy
2a670 74 65 3b 0a 20 20 20 20 20 20 69 4f 66 66 20 2b  te;.      iOff +
2a680 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e 74 33  = fts5GetVarint3
2a690 32 28 26 70 4c 65 61 66 2d 3e 70 5b 69 4f 66 66  2(&pLeaf->p[iOff
2a6a0 5d 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20 20 20  ], nByte);.     
2a6b0 20 69 66 28 20 28 69 4f 66 66 2b 6e 42 79 74 65   if( (iOff+nByte
2a6c0 29 3e 70 4c 65 61 66 2d 3e 73 7a 4c 65 61 66 20  )>pLeaf->szLeaf 
2a6d0 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 72 63  ){.        p->rc
2a6e0 20 3d 20 46 54 53 35 5f 43 4f 52 52 55 50 54 3b   = FTS5_CORRUPT;
2a6f0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
2a700 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72        fts5Buffer
2a710 53 65 74 28 26 70 2d 3e 72 63 2c 20 26 62 75 66  Set(&p->rc, &buf
2a720 31 2c 20 6e 42 79 74 65 2c 20 26 70 4c 65 61 66  1, nByte, &pLeaf
2a730 2d 3e 70 5b 69 4f 66 66 5d 29 3b 0a 20 20 20 20  ->p[iOff]);.    
2a740 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20    }.    }else{. 
2a750 20 20 20 20 20 69 6e 74 20 6e 4b 65 65 70 2c 20       int nKeep, 
2a760 6e 42 79 74 65 3b 0a 20 20 20 20 20 20 69 4f 66  nByte;.      iOf
2a770 66 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69  f += fts5GetVari
2a780 6e 74 33 32 28 26 70 4c 65 61 66 2d 3e 70 5b 69  nt32(&pLeaf->p[i
2a790 4f 66 66 5d 2c 20 6e 4b 65 65 70 29 3b 0a 20 20  Off], nKeep);.  
2a7a0 20 20 20 20 69 4f 66 66 20 2b 3d 20 66 74 73 35      iOff += fts5
2a7b0 47 65 74 56 61 72 69 6e 74 33 32 28 26 70 4c 65  GetVarint32(&pLe
2a7c0 61 66 2d 3e 70 5b 69 4f 66 66 5d 2c 20 6e 42 79  af->p[iOff], nBy
2a7d0 74 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6e  te);.      if( n
2a7e0 4b 65 65 70 3e 62 75 66 31 2e 6e 20 7c 7c 20 28  Keep>buf1.n || (
2a7f0 69 4f 66 66 2b 6e 42 79 74 65 29 3e 70 4c 65 61  iOff+nByte)>pLea
2a800 66 2d 3e 73 7a 4c 65 61 66 20 29 7b 0a 20 20 20  f->szLeaf ){.   
2a810 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 46 54 53       p->rc = FTS
2a820 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20 20 20  5_CORRUPT;.     
2a830 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
2a840 62 75 66 31 2e 6e 20 3d 20 6e 4b 65 65 70 3b 0a  buf1.n = nKeep;.
2a850 20 20 20 20 20 20 20 20 66 74 73 35 42 75 66 66          fts5Buff
2a860 65 72 41 70 70 65 6e 64 42 6c 6f 62 28 26 70 2d  erAppendBlob(&p-
2a870 3e 72 63 2c 20 26 62 75 66 31 2c 20 6e 42 79 74  >rc, &buf1, nByt
2a880 65 2c 20 26 70 4c 65 61 66 2d 3e 70 5b 69 4f 66  e, &pLeaf->p[iOf
2a890 66 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  f]);.      }..  
2a8a0 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53      if( p->rc==S
2a8b0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2a8c0 20 20 20 20 72 65 73 20 3d 20 66 74 73 35 42 75      res = fts5Bu
2a8d0 66 66 65 72 43 6f 6d 70 61 72 65 28 26 62 75 66  fferCompare(&buf
2a8e0 31 2c 20 26 62 75 66 32 29 3b 0a 20 20 20 20 20  1, &buf2);.     
2a8f0 20 20 20 69 66 28 20 72 65 73 3c 3d 30 20 29 20     if( res<=0 ) 
2a900 70 2d 3e 72 63 20 3d 20 46 54 53 35 5f 43 4f 52  p->rc = FTS5_COR
2a910 52 55 50 54 3b 0a 20 20 20 20 20 20 7d 0a 20 20  RUPT;.      }.  
2a920 20 20 7d 0a 20 20 20 20 66 74 73 35 42 75 66 66    }.    fts5Buff
2a930 65 72 53 65 74 28 26 70 2d 3e 72 63 2c 20 26 62  erSet(&p->rc, &b
2a940 75 66 32 2c 20 62 75 66 31 2e 6e 2c 20 62 75 66  uf2, buf1.n, buf
2a950 31 2e 70 29 3b 0a 20 20 7d 0a 0a 20 20 66 74 73  1.p);.  }..  fts
2a960 35 42 75 66 66 65 72 46 72 65 65 28 26 62 75 66  5BufferFree(&buf
2a970 31 29 3b 0a 20 20 66 74 73 35 42 75 66 66 65 72  1);.  fts5Buffer
2a980 46 72 65 65 28 26 62 75 66 32 29 3b 0a 7d 0a 0a  Free(&buf2);.}..
2a990 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
2a9a0 49 6e 64 65 78 49 6e 74 65 67 72 69 74 79 43 68  IndexIntegrityCh
2a9b0 65 63 6b 53 65 67 6d 65 6e 74 28 0a 20 20 46 74  eckSegment(.  Ft
2a9c0 73 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20  s5Index *p,     
2a9d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2a9e0 20 46 54 53 35 20 62 61 63 6b 65 6e 64 20 6f 62   FTS5 backend ob
2a9f0 6a 65 63 74 20 2a 2f 0a 20 20 46 74 73 35 53 74  ject */.  Fts5St
2aa00 72 75 63 74 75 72 65 53 65 67 6d 65 6e 74 20 2a  ructureSegment *
2aa10 70 53 65 67 20 20 20 20 20 20 2f 2a 20 53 65 67  pSeg      /* Seg
2aa20 6d 65 6e 74 20 74 6f 20 63 68 65 63 6b 20 69 6e  ment to check in
2aa30 74 65 72 6e 61 6c 20 63 6f 6e 73 69 73 74 65 6e  ternal consisten
2aa40 63 79 20 2a 2f 0a 29 7b 0a 20 20 46 74 73 35 43  cy */.){.  Fts5C
2aa50 6f 6e 66 69 67 20 2a 70 43 6f 6e 66 69 67 20 3d  onfig *pConfig =
2aa60 20 70 2d 3e 70 43 6f 6e 66 69 67 3b 0a 20 20 73   p->pConfig;.  s
2aa70 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74  qlite3_stmt *pSt
2aa80 6d 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63  mt = 0;.  int rc
2aa90 32 3b 0a 20 20 69 6e 74 20 69 49 64 78 50 72 65  2;.  int iIdxPre
2aaa0 76 4c 65 61 66 20 3d 20 70 53 65 67 2d 3e 70 67  vLeaf = pSeg->pg
2aab0 6e 6f 46 69 72 73 74 2d 31 3b 0a 20 20 69 6e 74  noFirst-1;.  int
2aac0 20 69 44 6c 69 64 78 50 72 65 76 4c 65 61 66 20   iDlidxPrevLeaf 
2aad0 3d 20 70 53 65 67 2d 3e 70 67 6e 6f 4c 61 73 74  = pSeg->pgnoLast
2aae0 3b 0a 0a 20 20 69 66 28 20 70 53 65 67 2d 3e 70  ;..  if( pSeg->p
2aaf0 67 6e 6f 46 69 72 73 74 3d 3d 30 20 29 20 72 65  gnoFirst==0 ) re
2ab00 74 75 72 6e 3b 0a 0a 20 20 66 74 73 35 49 6e 64  turn;..  fts5Ind
2ab10 65 78 50 72 65 70 61 72 65 53 74 6d 74 28 70 2c  exPrepareStmt(p,
2ab20 20 26 70 53 74 6d 74 2c 20 73 71 6c 69 74 65 33   &pStmt, sqlite3
2ab30 5f 6d 70 72 69 6e 74 66 28 0a 20 20 20 20 20 20  _mprintf(.      
2ab40 22 53 45 4c 45 43 54 20 73 65 67 69 64 2c 20 74  "SELECT segid, t
2ab50 65 72 6d 2c 20 28 70 67 6e 6f 3e 3e 31 29 2c 20  erm, (pgno>>1), 
2ab60 28 70 67 6e 6f 26 31 29 20 46 52 4f 4d 20 25 51  (pgno&1) FROM %Q
2ab70 2e 27 25 71 5f 69 64 78 27 20 57 48 45 52 45 20  .'%q_idx' WHERE 
2ab80 73 65 67 69 64 3d 25 64 22 2c 0a 20 20 20 20 20  segid=%d",.     
2ab90 20 70 43 6f 6e 66 69 67 2d 3e 7a 44 62 2c 20 70   pConfig->zDb, p
2aba0 43 6f 6e 66 69 67 2d 3e 7a 4e 61 6d 65 2c 20 70  Config->zName, p
2abb0 53 65 67 2d 3e 69 53 65 67 69 64 0a 20 20 29 29  Seg->iSegid.  ))
2abc0 3b 0a 0a 20 20 2f 2a 20 49 74 65 72 61 74 65 20  ;..  /* Iterate 
2abd0 74 68 72 6f 75 67 68 20 74 68 65 20 62 2d 74 72  through the b-tr
2abe0 65 65 20 68 69 65 72 61 72 63 68 79 2e 20 20 2a  ee hierarchy.  *
2abf0 2f 0a 20 20 77 68 69 6c 65 28 20 70 2d 3e 72 63  /.  while( p->rc
2ac00 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 53  ==SQLITE_OK && S
2ac10 51 4c 49 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74  QLITE_ROW==sqlit
2ac20 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29 20 29  e3_step(pStmt) )
2ac30 7b 0a 20 20 20 20 69 36 34 20 69 52 6f 77 3b 20  {.    i64 iRow; 
2ac40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ac50 20 20 20 20 2f 2a 20 52 6f 77 69 64 20 66 6f 72      /* Rowid for
2ac60 20 74 68 69 73 20 6c 65 61 66 20 2a 2f 0a 20 20   this leaf */.  
2ac70 20 20 46 74 73 35 44 61 74 61 20 2a 70 4c 65 61    Fts5Data *pLea
2ac80 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  f;              
2ac90 2f 2a 20 44 61 74 61 20 66 6f 72 20 74 68 69 73  /* Data for this
2aca0 20 6c 65 61 66 20 2a 2f 0a 0a 20 20 20 20 69 6e   leaf */..    in
2acb0 74 20 6e 49 64 78 54 65 72 6d 20 3d 20 73 71 6c  t nIdxTerm = sql
2acc0 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 79 74 65  ite3_column_byte
2acd0 73 28 70 53 74 6d 74 2c 20 31 29 3b 0a 20 20 20  s(pStmt, 1);.   
2ace0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49 64   const char *zId
2acf0 78 54 65 72 6d 20 3d 20 28 63 6f 6e 73 74 20 63  xTerm = (const c
2ad00 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c  har*)sqlite3_col
2ad10 75 6d 6e 5f 74 65 78 74 28 70 53 74 6d 74 2c 20  umn_text(pStmt, 
2ad20 31 29 3b 0a 20 20 20 20 69 6e 74 20 69 49 64 78  1);.    int iIdx
2ad30 4c 65 61 66 20 3d 20 73 71 6c 69 74 65 33 5f 63  Leaf = sqlite3_c
2ad40 6f 6c 75 6d 6e 5f 69 6e 74 28 70 53 74 6d 74 2c  olumn_int(pStmt,
2ad50 20 32 29 3b 0a 20 20 20 20 69 6e 74 20 62 49 64   2);.    int bId
2ad60 78 44 6c 69 64 78 20 3d 20 73 71 6c 69 74 65 33  xDlidx = sqlite3
2ad70 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 53 74 6d  _column_int(pStm
2ad80 74 2c 20 33 29 3b 0a 0a 20 20 20 20 2f 2a 20 49  t, 3);..    /* I
2ad90 66 20 74 68 65 20 6c 65 61 66 20 69 6e 20 71 75  f the leaf in qu
2ada0 65 73 74 69 6f 6e 20 68 61 73 20 61 6c 72 65 61  estion has alrea
2adb0 64 79 20 62 65 65 6e 20 74 72 69 6d 6d 65 64 20  dy been trimmed 
2adc0 66 72 6f 6d 20 74 68 65 20 73 65 67 6d 65 6e 74  from the segment
2add0 2c 20 0a 20 20 20 20 2a 2a 20 69 67 6e 6f 72 65  , .    ** ignore
2ade0 20 74 68 69 73 20 62 2d 74 72 65 65 20 65 6e 74   this b-tree ent
2adf0 72 79 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 6c  ry. Otherwise, l
2ae00 6f 61 64 20 69 74 20 69 6e 74 6f 20 6d 65 6d 6f  oad it into memo
2ae10 72 79 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 69  ry. */.    if( i
2ae20 49 64 78 4c 65 61 66 3c 70 53 65 67 2d 3e 70 67  IdxLeaf<pSeg->pg
2ae30 6e 6f 46 69 72 73 74 20 29 20 63 6f 6e 74 69 6e  noFirst ) contin
2ae40 75 65 3b 0a 20 20 20 20 69 52 6f 77 20 3d 20 46  ue;.    iRow = F
2ae50 54 53 35 5f 53 45 47 4d 45 4e 54 5f 52 4f 57 49  TS5_SEGMENT_ROWI
2ae60 44 28 70 53 65 67 2d 3e 69 53 65 67 69 64 2c 20  D(pSeg->iSegid, 
2ae70 69 49 64 78 4c 65 61 66 29 3b 0a 20 20 20 20 70  iIdxLeaf);.    p
2ae80 4c 65 61 66 20 3d 20 66 74 73 35 44 61 74 61 52  Leaf = fts5DataR
2ae90 65 61 64 28 70 2c 20 69 52 6f 77 29 3b 0a 20 20  ead(p, iRow);.  
2aea0 20 20 69 66 28 20 70 4c 65 61 66 3d 3d 30 20 29    if( pLeaf==0 )
2aeb0 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 2f 2a 20   break;..    /* 
2aec0 43 68 65 63 6b 20 74 68 61 74 20 74 68 65 20 6c  Check that the l
2aed0 65 61 66 20 63 6f 6e 74 61 69 6e 73 20 61 74 20  eaf contains at 
2aee0 6c 65 61 73 74 20 6f 6e 65 20 74 65 72 6d 2c 20  least one term, 
2aef0 61 6e 64 20 74 68 61 74 20 69 74 20 69 73 20 65  and that it is e
2af00 71 75 61 6c 0a 20 20 20 20 2a 2a 20 74 6f 20 6f  qual.    ** to o
2af10 72 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68  r larger than th
2af20 65 20 73 70 6c 69 74 2d 6b 65 79 20 69 6e 20 7a  e split-key in z
2af30 49 64 78 54 65 72 6d 2e 20 20 41 6c 73 6f 20 63  IdxTerm.  Also c
2af40 68 65 63 6b 20 74 68 61 74 20 69 66 20 74 68 65  heck that if the
2af50 72 65 0a 20 20 20 20 2a 2a 20 69 73 20 61 6c 73  re.    ** is als
2af60 6f 20 61 20 72 6f 77 69 64 20 70 6f 69 6e 74 65  o a rowid pointe
2af70 72 20 77 69 74 68 69 6e 20 74 68 65 20 6c 65 61  r within the lea
2af80 66 20 70 61 67 65 20 68 65 61 64 65 72 2c 20 69  f page header, i
2af90 74 20 70 6f 69 6e 74 73 20 74 6f 20 61 0a 20 20  t points to a.  
2afa0 20 20 2a 2a 20 6c 6f 63 61 74 69 6f 6e 20 62 65    ** location be
2afb0 66 6f 72 65 20 74 68 65 20 74 65 72 6d 2e 20 20  fore the term.  
2afc0 2a 2f 0a 20 20 20 20 69 66 28 20 70 4c 65 61 66  */.    if( pLeaf
2afd0 2d 3e 6e 6e 3c 3d 70 4c 65 61 66 2d 3e 73 7a 4c  ->nn<=pLeaf->szL
2afe0 65 61 66 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e  eaf ){.      p->
2aff0 72 63 20 3d 20 46 54 53 35 5f 43 4f 52 52 55 50  rc = FTS5_CORRUP
2b000 54 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  T;.    }else{.  
2b010 20 20 20 20 69 6e 74 20 69 4f 66 66 3b 20 20 20      int iOff;   
2b020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b030 2f 2a 20 4f 66 66 73 65 74 20 6f 66 20 66 69 72  /* Offset of fir
2b040 73 74 20 74 65 72 6d 20 6f 6e 20 6c 65 61 66 20  st term on leaf 
2b050 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 69 52 6f  */.      int iRo
2b060 77 69 64 4f 66 66 3b 20 20 20 20 20 20 20 20 20  widOff;         
2b070 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f       /* Offset o
2b080 66 20 66 69 72 73 74 20 72 6f 77 69 64 20 6f 6e  f first rowid on
2b090 20 6c 65 61 66 20 2a 2f 0a 20 20 20 20 20 20 69   leaf */.      i
2b0a0 6e 74 20 6e 54 65 72 6d 3b 20 20 20 20 20 20 20  nt nTerm;       
2b0b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
2b0c0 7a 65 20 6f 66 20 74 65 72 6d 20 6f 6e 20 6c 65  ze of term on le
2b0d0 61 66 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20  af in bytes */. 
2b0e0 20 20 20 20 20 69 6e 74 20 72 65 73 3b 20 20 20       int res;   
2b0f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b100 20 2f 2a 20 43 6f 6d 70 61 72 69 73 6f 6e 20 6f   /* Comparison o
2b110 66 20 74 65 72 6d 20 61 6e 64 20 73 70 6c 69 74  f term and split
2b120 2d 6b 65 79 20 2a 2f 0a 0a 20 20 20 20 20 20 69  -key */..      i
2b130 4f 66 66 20 3d 20 66 74 73 35 4c 65 61 66 46 69  Off = fts5LeafFi
2b140 72 73 74 54 65 72 6d 4f 66 66 28 70 4c 65 61 66  rstTermOff(pLeaf
2b150 29 3b 0a 20 20 20 20 20 20 69 52 6f 77 69 64 4f  );.      iRowidO
2b160 66 66 20 3d 20 66 74 73 35 4c 65 61 66 46 69 72  ff = fts5LeafFir
2b170 73 74 52 6f 77 69 64 4f 66 66 28 70 4c 65 61 66  stRowidOff(pLeaf
2b180 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69 52 6f  );.      if( iRo
2b190 77 69 64 4f 66 66 3e 3d 69 4f 66 66 20 29 7b 0a  widOff>=iOff ){.
2b1a0 20 20 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20          p->rc = 
2b1b0 46 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20  FTS5_CORRUPT;.  
2b1c0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2b1d0 20 20 20 69 4f 66 66 20 2b 3d 20 66 74 73 35 47     iOff += fts5G
2b1e0 65 74 56 61 72 69 6e 74 33 32 28 26 70 4c 65 61  etVarint32(&pLea
2b1f0 66 2d 3e 70 5b 69 4f 66 66 5d 2c 20 6e 54 65 72  f->p[iOff], nTer
2b200 6d 29 3b 0a 20 20 20 20 20 20 20 20 72 65 73 20  m);.        res 
2b210 3d 20 6d 65 6d 63 6d 70 28 26 70 4c 65 61 66 2d  = memcmp(&pLeaf-
2b220 3e 70 5b 69 4f 66 66 5d 2c 20 7a 49 64 78 54 65  >p[iOff], zIdxTe
2b230 72 6d 2c 20 4d 49 4e 28 6e 54 65 72 6d 2c 20 6e  rm, MIN(nTerm, n
2b240 49 64 78 54 65 72 6d 29 29 3b 0a 20 20 20 20 20  IdxTerm));.     
2b250 20 20 20 69 66 28 20 72 65 73 3d 3d 30 20 29 20     if( res==0 ) 
2b260 72 65 73 20 3d 20 6e 54 65 72 6d 20 2d 20 6e 49  res = nTerm - nI
2b270 64 78 54 65 72 6d 3b 0a 20 20 20 20 20 20 20 20  dxTerm;.        
2b280 69 66 28 20 72 65 73 3c 30 20 29 20 70 2d 3e 72  if( res<0 ) p->r
2b290 63 20 3d 20 46 54 53 35 5f 43 4f 52 52 55 50 54  c = FTS5_CORRUPT
2b2a0 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
2b2b0 20 66 74 73 35 49 6e 74 65 67 72 69 74 79 43 68   fts5IntegrityCh
2b2c0 65 63 6b 50 67 69 64 78 28 70 2c 20 70 4c 65 61  eckPgidx(p, pLea
2b2d0 66 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 74  f);.    }.    ft
2b2e0 73 35 44 61 74 61 52 65 6c 65 61 73 65 28 70 4c  s5DataRelease(pL
2b2f0 65 61 66 29 3b 0a 20 20 20 20 69 66 28 20 70 2d  eaf);.    if( p-
2b300 3e 72 63 20 29 20 62 72 65 61 6b 3b 0a 0a 20 20  >rc ) break;..  
2b310 20 20 2f 2a 20 4e 6f 77 20 63 68 65 63 6b 20 74    /* Now check t
2b320 68 61 74 20 74 68 65 20 69 74 65 72 2e 6e 45 6d  hat the iter.nEm
2b330 70 74 79 20 6c 65 61 76 65 73 20 66 6f 6c 6c 6f  pty leaves follo
2b340 77 69 6e 67 20 74 68 65 20 63 75 72 72 65 6e 74  wing the current
2b350 20 6c 65 61 66 0a 20 20 20 20 2a 2a 20 28 61 29   leaf.    ** (a)
2b360 20 65 78 69 73 74 20 61 6e 64 20 28 62 29 20 63   exist and (b) c
2b370 6f 6e 74 61 69 6e 20 6e 6f 20 74 65 72 6d 73 2e  ontain no terms.
2b380 20 2a 2f 0a 20 20 20 20 66 74 73 35 49 6e 64 65   */.    fts5Inde
2b390 78 49 6e 74 65 67 72 69 74 79 43 68 65 63 6b 45  xIntegrityCheckE
2b3a0 6d 70 74 79 28 0a 20 20 20 20 20 20 20 20 70 2c  mpty(.        p,
2b3b0 20 70 53 65 67 2c 20 69 49 64 78 50 72 65 76 4c   pSeg, iIdxPrevL
2b3c0 65 61 66 2b 31 2c 20 69 44 6c 69 64 78 50 72 65  eaf+1, iDlidxPre
2b3d0 76 4c 65 61 66 2b 31 2c 20 69 49 64 78 4c 65 61  vLeaf+1, iIdxLea
2b3e0 66 2d 31 0a 20 20 20 20 29 3b 0a 20 20 20 20 69  f-1.    );.    i
2b3f0 66 28 20 70 2d 3e 72 63 20 29 20 62 72 65 61 6b  f( p->rc ) break
2b400 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  ;..    /* If the
2b410 72 65 20 69 73 20 61 20 64 6f 63 6c 69 73 74 2d  re is a doclist-
2b420 69 6e 64 65 78 2c 20 63 68 65 63 6b 20 74 68 61  index, check tha
2b430 74 20 69 74 20 6c 6f 6f 6b 73 20 72 69 67 68 74  t it looks right
2b440 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 62 49 64  . */.    if( bId
2b450 78 44 6c 69 64 78 20 29 7b 0a 20 20 20 20 20 20  xDlidx ){.      
2b460 46 74 73 35 44 6c 69 64 78 49 74 65 72 20 2a 70  Fts5DlidxIter *p
2b470 44 6c 69 64 78 20 3d 20 30 3b 20 20 2f 2a 20 46  Dlidx = 0;  /* F
2b480 6f 72 20 69 74 65 72 61 74 69 6e 67 20 74 68 72  or iterating thr
2b490 6f 75 67 68 20 64 6f 63 6c 69 73 74 20 69 6e 64  ough doclist ind
2b4a0 65 78 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  ex */.      int 
2b4b0 69 50 72 65 76 4c 65 61 66 20 3d 20 69 49 64 78  iPrevLeaf = iIdx
2b4c0 4c 65 61 66 3b 0a 20 20 20 20 20 20 69 6e 74 20  Leaf;.      int 
2b4d0 69 53 65 67 69 64 20 3d 20 70 53 65 67 2d 3e 69  iSegid = pSeg->i
2b4e0 53 65 67 69 64 3b 0a 20 20 20 20 20 20 69 6e 74  Segid;.      int
2b4f0 20 69 50 67 20 3d 20 30 3b 0a 20 20 20 20 20 20   iPg = 0;.      
2b500 69 36 34 20 69 4b 65 79 3b 0a 0a 20 20 20 20 20  i64 iKey;..     
2b510 20 66 6f 72 28 70 44 6c 69 64 78 3d 66 74 73 35   for(pDlidx=fts5
2b520 44 6c 69 64 78 49 74 65 72 49 6e 69 74 28 70 2c  DlidxIterInit(p,
2b530 20 30 2c 20 69 53 65 67 69 64 2c 20 69 49 64 78   0, iSegid, iIdx
2b540 4c 65 61 66 29 3b 0a 20 20 20 20 20 20 20 20 20  Leaf);.         
2b550 20 66 74 73 35 44 6c 69 64 78 49 74 65 72 45 6f   fts5DlidxIterEo
2b560 66 28 70 2c 20 70 44 6c 69 64 78 29 3d 3d 30 3b  f(p, pDlidx)==0;
2b570 0a 20 20 20 20 20 20 20 20 20 20 66 74 73 35 44  .          fts5D
2b580 6c 69 64 78 49 74 65 72 4e 65 78 74 28 70 2c 20  lidxIterNext(p, 
2b590 70 44 6c 69 64 78 29 0a 20 20 20 20 20 20 29 7b  pDlidx).      ){
2b5a0 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 68 65  ..        /* Che
2b5b0 63 6b 20 61 6e 79 20 72 6f 77 69 64 2d 6c 65 73  ck any rowid-les
2b5c0 73 20 70 61 67 65 73 20 74 68 61 74 20 6f 63 63  s pages that occ
2b5d0 75 72 20 62 65 66 6f 72 65 20 74 68 65 20 63 75  ur before the cu
2b5e0 72 72 65 6e 74 20 6c 65 61 66 2e 20 2a 2f 0a 20  rrent leaf. */. 
2b5f0 20 20 20 20 20 20 20 66 6f 72 28 69 50 67 3d 69         for(iPg=i
2b600 50 72 65 76 4c 65 61 66 2b 31 3b 20 69 50 67 3c  PrevLeaf+1; iPg<
2b610 66 74 73 35 44 6c 69 64 78 49 74 65 72 50 67 6e  fts5DlidxIterPgn
2b620 6f 28 70 44 6c 69 64 78 29 3b 20 69 50 67 2b 2b  o(pDlidx); iPg++
2b630 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 4b 65  ){.          iKe
2b640 79 20 3d 20 46 54 53 35 5f 53 45 47 4d 45 4e 54  y = FTS5_SEGMENT
2b650 5f 52 4f 57 49 44 28 69 53 65 67 69 64 2c 20 69  _ROWID(iSegid, i
2b660 50 67 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70  Pg);.          p
2b670 4c 65 61 66 20 3d 20 66 74 73 35 44 61 74 61 52  Leaf = fts5DataR
2b680 65 61 64 28 70 2c 20 69 4b 65 79 29 3b 0a 20 20  ead(p, iKey);.  
2b690 20 20 20 20 20 20 20 20 69 66 28 20 70 4c 65 61          if( pLea
2b6a0 66 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  f ){.           
2b6b0 20 69 66 28 20 66 74 73 35 4c 65 61 66 46 69 72   if( fts5LeafFir
2b6c0 73 74 52 6f 77 69 64 4f 66 66 28 70 4c 65 61 66  stRowidOff(pLeaf
2b6d0 29 21 3d 30 20 29 20 70 2d 3e 72 63 20 3d 20 46  )!=0 ) p->rc = F
2b6e0 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20  TS5_CORRUPT;.   
2b6f0 20 20 20 20 20 20 20 20 20 66 74 73 35 44 61 74           fts5Dat
2b700 61 52 65 6c 65 61 73 65 28 70 4c 65 61 66 29 3b  aRelease(pLeaf);
2b710 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
2b720 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
2b730 50 72 65 76 4c 65 61 66 20 3d 20 66 74 73 35 44  PrevLeaf = fts5D
2b740 6c 69 64 78 49 74 65 72 50 67 6e 6f 28 70 44 6c  lidxIterPgno(pDl
2b750 69 64 78 29 3b 0a 0a 20 20 20 20 20 20 20 20 2f  idx);..        /
2b760 2a 20 43 68 65 63 6b 20 74 68 61 74 20 74 68 65  * Check that the
2b770 20 6c 65 61 66 20 70 61 67 65 20 69 6e 64 69 63   leaf page indic
2b780 61 74 65 64 20 62 79 20 74 68 65 20 69 74 65 72  ated by the iter
2b790 61 74 6f 72 20 72 65 61 6c 6c 79 20 64 6f 65 73  ator really does
2b7a0 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 6e 74  .        ** cont
2b7b0 61 69 6e 20 74 68 65 20 72 6f 77 69 64 20 73 75  ain the rowid su
2b7c0 67 67 65 73 74 65 64 20 62 79 20 74 68 65 20 73  ggested by the s
2b7d0 61 6d 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  ame. */.        
2b7e0 69 4b 65 79 20 3d 20 46 54 53 35 5f 53 45 47 4d  iKey = FTS5_SEGM
2b7f0 45 4e 54 5f 52 4f 57 49 44 28 69 53 65 67 69 64  ENT_ROWID(iSegid
2b800 2c 20 69 50 72 65 76 4c 65 61 66 29 3b 0a 20 20  , iPrevLeaf);.  
2b810 20 20 20 20 20 20 70 4c 65 61 66 20 3d 20 66 74        pLeaf = ft
2b820 73 35 44 61 74 61 52 65 61 64 28 70 2c 20 69 4b  s5DataRead(p, iK
2b830 65 79 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ey);.        if(
2b840 20 70 4c 65 61 66 20 29 7b 0a 20 20 20 20 20 20   pLeaf ){.      
2b850 20 20 20 20 69 36 34 20 69 52 6f 77 69 64 3b 0a      i64 iRowid;.
2b860 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 69 52            int iR
2b870 6f 77 69 64 4f 66 66 20 3d 20 66 74 73 35 4c 65  owidOff = fts5Le
2b880 61 66 46 69 72 73 74 52 6f 77 69 64 4f 66 66 28  afFirstRowidOff(
2b890 70 4c 65 61 66 29 3b 0a 20 20 20 20 20 20 20 20  pLeaf);.        
2b8a0 20 20 41 53 53 45 52 54 5f 53 5a 4c 45 41 46 5f    ASSERT_SZLEAF_
2b8b0 4f 4b 28 70 4c 65 61 66 29 3b 0a 20 20 20 20 20  OK(pLeaf);.     
2b8c0 20 20 20 20 20 69 66 28 20 69 52 6f 77 69 64 4f       if( iRowidO
2b8d0 66 66 3e 3d 70 4c 65 61 66 2d 3e 73 7a 4c 65 61  ff>=pLeaf->szLea
2b8e0 66 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  f ){.           
2b8f0 20 70 2d 3e 72 63 20 3d 20 46 54 53 35 5f 43 4f   p->rc = FTS5_CO
2b900 52 52 55 50 54 3b 0a 20 20 20 20 20 20 20 20 20  RRUPT;.         
2b910 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
2b920 20 20 20 20 66 74 73 35 47 65 74 56 61 72 69 6e      fts5GetVarin
2b930 74 28 26 70 4c 65 61 66 2d 3e 70 5b 69 52 6f 77  t(&pLeaf->p[iRow
2b940 69 64 4f 66 66 5d 2c 20 28 75 36 34 2a 29 26 69  idOff], (u64*)&i
2b950 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 20 20  Rowid);.        
2b960 20 20 20 20 69 66 28 20 69 52 6f 77 69 64 21 3d      if( iRowid!=
2b970 66 74 73 35 44 6c 69 64 78 49 74 65 72 52 6f 77  fts5DlidxIterRow
2b980 69 64 28 70 44 6c 69 64 78 29 20 29 20 70 2d 3e  id(pDlidx) ) p->
2b990 72 63 20 3d 20 46 54 53 35 5f 43 4f 52 52 55 50  rc = FTS5_CORRUP
2b9a0 54 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  T;.          }. 
2b9b0 20 20 20 20 20 20 20 20 20 66 74 73 35 44 61 74           fts5Dat
2b9c0 61 52 65 6c 65 61 73 65 28 70 4c 65 61 66 29 3b  aRelease(pLeaf);
2b9d0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
2b9e0 20 7d 0a 0a 20 20 20 20 20 20 69 44 6c 69 64 78   }..      iDlidx
2b9f0 50 72 65 76 4c 65 61 66 20 3d 20 69 50 67 3b 0a  PrevLeaf = iPg;.
2ba00 20 20 20 20 20 20 66 74 73 35 44 6c 69 64 78 49        fts5DlidxI
2ba10 74 65 72 46 72 65 65 28 70 44 6c 69 64 78 29 3b  terFree(pDlidx);
2ba20 0a 20 20 20 20 20 20 66 74 73 35 54 65 73 74 44  .      fts5TestD
2ba30 6c 69 64 78 52 65 76 65 72 73 65 28 70 2c 20 69  lidxReverse(p, i
2ba40 53 65 67 69 64 2c 20 69 49 64 78 4c 65 61 66 29  Segid, iIdxLeaf)
2ba50 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
2ba60 20 20 20 69 44 6c 69 64 78 50 72 65 76 4c 65 61     iDlidxPrevLea
2ba70 66 20 3d 20 70 53 65 67 2d 3e 70 67 6e 6f 4c 61  f = pSeg->pgnoLa
2ba80 73 74 3b 0a 20 20 20 20 20 20 2f 2a 20 54 4f 44  st;.      /* TOD
2ba90 4f 3a 20 43 68 65 63 6b 20 74 68 65 72 65 20 69  O: Check there i
2baa0 73 20 6e 6f 20 64 6f 63 6c 69 73 74 20 69 6e 64  s no doclist ind
2bab0 65 78 20 2a 2f 0a 20 20 20 20 7d 0a 0a 20 20 20  ex */.    }..   
2bac0 20 69 49 64 78 50 72 65 76 4c 65 61 66 20 3d 20   iIdxPrevLeaf = 
2bad0 69 49 64 78 4c 65 61 66 3b 0a 20 20 7d 0a 0a 20  iIdxLeaf;.  }.. 
2bae0 20 72 63 32 20 3d 20 73 71 6c 69 74 65 33 5f 66   rc2 = sqlite3_f
2baf0 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a  inalize(pStmt);.
2bb00 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c    if( p->rc==SQL
2bb10 49 54 45 5f 4f 4b 20 29 20 70 2d 3e 72 63 20 3d  ITE_OK ) p->rc =
2bb20 20 72 63 32 3b 0a 0a 20 20 2f 2a 20 50 61 67 65   rc2;..  /* Page
2bb30 20 69 74 65 72 2e 69 4c 65 61 66 20 6d 75 73 74   iter.iLeaf must
2bb40 20 6e 6f 77 20 62 65 20 74 68 65 20 72 69 67 68   now be the righ
2bb50 74 6d 6f 73 74 20 6c 65 61 66 2d 70 61 67 65 20  tmost leaf-page 
2bb60 69 6e 20 74 68 65 20 73 65 67 6d 65 6e 74 20 2a  in the segment *
2bb70 2f 0a 23 69 66 20 30 0a 20 20 69 66 28 20 70 2d  /.#if 0.  if( p-
2bb80 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26  >rc==SQLITE_OK &
2bb90 26 20 69 74 65 72 2e 69 4c 65 61 66 21 3d 70 53  & iter.iLeaf!=pS
2bba0 65 67 2d 3e 70 67 6e 6f 4c 61 73 74 20 29 7b 0a  eg->pgnoLast ){.
2bbb0 20 20 20 20 70 2d 3e 72 63 20 3d 20 46 54 53 35      p->rc = FTS5
2bbc0 5f 43 4f 52 52 55 50 54 3b 0a 20 20 7d 0a 23 65  _CORRUPT;.  }.#e
2bbd0 6e 64 69 66 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52  ndif.}.../*.** R
2bbe0 75 6e 20 69 6e 74 65 72 6e 61 6c 20 63 68 65 63  un internal chec
2bbf0 6b 73 20 74 6f 20 65 6e 73 75 72 65 20 74 68 61  ks to ensure tha
2bc00 74 20 74 68 65 20 46 54 53 20 69 6e 64 65 78 20  t the FTS index 
2bc10 28 61 29 20 69 73 20 69 6e 74 65 72 6e 61 6c 6c  (a) is internall
2bc20 79 20 0a 2a 2a 20 63 6f 6e 73 69 73 74 65 6e 74  y .** consistent
2bc30 20 61 6e 64 20 28 62 29 20 63 6f 6e 74 61 69 6e   and (b) contain
2bc40 73 20 65 6e 74 72 69 65 73 20 66 6f 72 20 77 68  s entries for wh
2bc50 69 63 68 20 74 68 65 20 58 4f 52 20 6f 66 20 74  ich the XOR of t
2bc60 68 65 20 63 68 65 63 6b 73 75 6d 73 0a 2a 2a 20  he checksums.** 
2bc70 61 73 20 63 61 6c 63 75 6c 61 74 65 64 20 62 79  as calculated by
2bc80 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65   sqlite3Fts5Inde
2bc90 78 45 6e 74 72 79 43 6b 73 75 6d 28 29 20 69 73  xEntryCksum() is
2bca0 20 63 6b 73 75 6d 2e 0a 2a 2a 0a 2a 2a 20 52 65   cksum..**.** Re
2bcb0 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
2bcc0 55 50 54 20 69 66 20 61 6e 79 20 6f 66 20 74 68  UPT if any of th
2bcd0 65 20 69 6e 74 65 72 6e 61 6c 20 63 68 65 63 6b  e internal check
2bce0 73 20 66 61 69 6c 2c 20 6f 72 20 69 66 20 74 68  s fail, or if th
2bcf0 65 0a 2a 2a 20 63 68 65 63 6b 73 75 6d 20 64 6f  e.** checksum do
2bd00 65 73 20 6e 6f 74 20 6d 61 74 63 68 2e 20 52 65  es not match. Re
2bd10 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69  turn SQLITE_OK i
2bd20 66 20 61 6c 6c 20 63 68 65 63 6b 73 20 70 61 73  f all checks pas
2bd30 73 20 77 69 74 68 6f 75 74 0a 2a 2a 20 65 72 72  s without.** err
2bd40 6f 72 2c 20 6f 72 20 73 6f 6d 65 20 6f 74 68 65  or, or some othe
2bd50 72 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63  r SQLite error c
2bd60 6f 64 65 20 69 66 20 61 6e 6f 74 68 65 72 20 65  ode if another e
2bd70 72 72 6f 72 20 28 65 2e 67 2e 20 4f 4f 4d 29 0a  rror (e.g. OOM).
2bd80 2a 2a 20 6f 63 63 75 72 73 2e 0a 2a 2f 0a 69 6e  ** occurs..*/.in
2bd90 74 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64  t sqlite3Fts5Ind
2bda0 65 78 49 6e 74 65 67 72 69 74 79 43 68 65 63 6b  exIntegrityCheck
2bdb0 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 75  (Fts5Index *p, u
2bdc0 36 34 20 63 6b 73 75 6d 29 7b 0a 20 20 69 6e 74  64 cksum){.  int
2bdd0 20 65 44 65 74 61 69 6c 20 3d 20 70 2d 3e 70 43   eDetail = p->pC
2bde0 6f 6e 66 69 67 2d 3e 65 44 65 74 61 69 6c 3b 0a  onfig->eDetail;.
2bdf0 20 20 75 36 34 20 63 6b 73 75 6d 32 20 3d 20 30    u64 cksum2 = 0
2be00 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2be10 20 20 2f 2a 20 43 68 65 63 6b 73 75 6d 20 62 61    /* Checksum ba
2be20 73 65 64 20 6f 6e 20 63 6f 6e 74 65 6e 74 73 20  sed on contents 
2be30 6f 66 20 69 6e 64 65 78 65 73 20 2a 2f 0a 20 20  of indexes */.  
2be40 46 74 73 35 42 75 66 66 65 72 20 70 6f 73 6c 69  Fts5Buffer posli
2be50 73 74 20 3d 20 7b 30 2c 30 2c 30 7d 3b 20 20 20  st = {0,0,0};   
2be60 2f 2a 20 42 75 66 66 65 72 20 75 73 65 64 20 74  /* Buffer used t
2be70 6f 20 68 6f 6c 64 20 61 20 70 6f 73 6c 69 73 74  o hold a poslist
2be80 20 2a 2f 0a 20 20 46 74 73 35 49 74 65 72 20 2a   */.  Fts5Iter *
2be90 70 49 74 65 72 3b 20 20 20 20 20 20 20 20 20 20  pIter;          
2bea0 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20 74 6f        /* Used to
2beb0 20 69 74 65 72 61 74 65 20 74 68 72 6f 75 67 68   iterate through
2bec0 20 65 6e 74 69 72 65 20 69 6e 64 65 78 20 2a 2f   entire index */
2bed0 0a 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65  .  Fts5Structure
2bee0 20 2a 70 53 74 72 75 63 74 3b 20 20 20 20 20 20   *pStruct;      
2bef0 20 20 20 2f 2a 20 49 6e 64 65 78 20 73 74 72 75     /* Index stru
2bf00 63 74 75 72 65 20 2a 2f 0a 0a 23 69 66 64 65 66  cture */..#ifdef
2bf10 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
2bf20 2f 2a 20 55 73 65 64 20 62 79 20 65 78 74 72 61  /* Used by extra
2bf30 20 69 6e 74 65 72 6e 61 6c 20 74 65 73 74 73 20   internal tests 
2bf40 6f 6e 6c 79 20 72 75 6e 20 69 66 20 4e 44 45 42  only run if NDEB
2bf50 55 47 20 69 73 20 6e 6f 74 20 64 65 66 69 6e 65  UG is not define
2bf60 64 20 2a 2f 0a 20 20 75 36 34 20 63 6b 73 75 6d  d */.  u64 cksum
2bf70 33 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  3 = 0;          
2bf80 20 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 73         /* Checks
2bf90 75 6d 20 62 61 73 65 64 20 6f 6e 20 63 6f 6e 74  um based on cont
2bfa0 65 6e 74 73 20 6f 66 20 69 6e 64 65 78 65 73 20  ents of indexes 
2bfb0 2a 2f 0a 20 20 46 74 73 35 42 75 66 66 65 72 20  */.  Fts5Buffer 
2bfc0 74 65 72 6d 20 3d 20 7b 30 2c 30 2c 30 7d 3b 20  term = {0,0,0}; 
2bfd0 20 20 20 20 20 2f 2a 20 42 75 66 66 65 72 20 75       /* Buffer u
2bfe0 73 65 64 20 74 6f 20 68 6f 6c 64 20 6d 6f 73 74  sed to hold most
2bff0 20 72 65 63 65 6e 74 20 74 65 72 6d 20 2a 2f 0a   recent term */.
2c000 23 65 6e 64 69 66 0a 20 20 63 6f 6e 73 74 20 69  #endif.  const i
2c010 6e 74 20 66 6c 61 67 73 20 3d 20 46 54 53 35 49  nt flags = FTS5I
2c020 4e 44 45 58 5f 51 55 45 52 59 5f 4e 4f 4f 55 54  NDEX_QUERY_NOOUT
2c030 50 55 54 3b 0a 20 20 0a 20 20 2f 2a 20 4c 6f 61  PUT;.  .  /* Loa
2c040 64 20 74 68 65 20 46 54 53 20 69 6e 64 65 78 20  d the FTS index 
2c050 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 70  structure */.  p
2c060 53 74 72 75 63 74 20 3d 20 66 74 73 35 53 74 72  Struct = fts5Str
2c070 75 63 74 75 72 65 52 65 61 64 28 70 29 3b 0a 0a  uctureRead(p);..
2c080 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20    /* Check that 
2c090 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 6e 6f 64  the internal nod
2c0a0 65 73 20 6f 66 20 65 61 63 68 20 73 65 67 6d 65  es of each segme
2c0b0 6e 74 20 6d 61 74 63 68 20 74 68 65 20 6c 65 61  nt match the lea
2c0c0 76 65 73 20 2a 2f 0a 20 20 69 66 28 20 70 53 74  ves */.  if( pSt
2c0d0 72 75 63 74 20 29 7b 0a 20 20 20 20 69 6e 74 20  ruct ){.    int 
2c0e0 69 4c 76 6c 2c 20 69 53 65 67 3b 0a 20 20 20 20  iLvl, iSeg;.    
2c0f0 66 6f 72 28 69 4c 76 6c 3d 30 3b 20 69 4c 76 6c  for(iLvl=0; iLvl
2c100 3c 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c  <pStruct->nLevel
2c110 3b 20 69 4c 76 6c 2b 2b 29 7b 0a 20 20 20 20 20  ; iLvl++){.     
2c120 20 66 6f 72 28 69 53 65 67 3d 30 3b 20 69 53 65   for(iSeg=0; iSe
2c130 67 3c 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65  g<pStruct->aLeve
2c140 6c 5b 69 4c 76 6c 5d 2e 6e 53 65 67 3b 20 69 53  l[iLvl].nSeg; iS
2c150 65 67 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 46  eg++){.        F
2c160 74 73 35 53 74 72 75 63 74 75 72 65 53 65 67 6d  ts5StructureSegm
2c170 65 6e 74 20 2a 70 53 65 67 20 3d 20 26 70 53 74  ent *pSeg = &pSt
2c180 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76  ruct->aLevel[iLv
2c190 6c 5d 2e 61 53 65 67 5b 69 53 65 67 5d 3b 0a 20  l].aSeg[iSeg];. 
2c1a0 20 20 20 20 20 20 20 66 74 73 35 49 6e 64 65 78         fts5Index
2c1b0 49 6e 74 65 67 72 69 74 79 43 68 65 63 6b 53 65  IntegrityCheckSe
2c1c0 67 6d 65 6e 74 28 70 2c 20 70 53 65 67 29 3b 0a  gment(p, pSeg);.
2c1d0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
2c1e0 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 63 6b 73 75  }..  /* The cksu
2c1f0 6d 20 61 72 67 75 6d 65 6e 74 20 70 61 73 73 65  m argument passe
2c200 64 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69  d to this functi
2c210 6f 6e 20 69 73 20 61 20 63 68 65 63 6b 73 75 6d  on is a checksum
2c220 20 63 61 6c 63 75 6c 61 74 65 64 0a 20 20 2a 2a   calculated.  **
2c230 20 62 61 73 65 64 20 6f 6e 20 61 6c 6c 20 65 78   based on all ex
2c240 70 65 63 74 65 64 20 65 6e 74 72 69 65 73 20 69  pected entries i
2c250 6e 20 74 68 65 20 46 54 53 20 69 6e 64 65 78 20  n the FTS index 
2c260 28 69 6e 63 6c 75 64 69 6e 67 20 70 72 65 66 69  (including prefi
2c270 78 20 69 6e 64 65 78 0a 20 20 2a 2a 20 65 6e 74  x index.  ** ent
2c280 72 69 65 73 29 2e 20 54 68 69 73 20 62 6c 6f 63  ries). This bloc
2c290 6b 20 63 68 65 63 6b 73 20 74 68 61 74 20 61 20  k checks that a 
2c2a0 63 68 65 63 6b 73 75 6d 20 63 61 6c 63 75 6c 61  checksum calcula
2c2b0 74 65 64 20 62 61 73 65 64 20 6f 6e 20 74 68 65  ted based on the
2c2c0 0a 20 20 2a 2a 20 61 63 74 75 61 6c 20 63 6f 6e  .  ** actual con
2c2d0 74 65 6e 74 73 20 6f 66 20 46 54 53 20 69 6e 64  tents of FTS ind
2c2e0 65 78 20 69 73 20 69 64 65 6e 74 69 63 61 6c 2e  ex is identical.
2c2f0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 77 6f 20 76  .  **.  ** Two v
2c300 65 72 73 69 6f 6e 73 20 6f 66 20 74 68 65 20 73  ersions of the s
2c310 61 6d 65 20 63 68 65 63 6b 73 75 6d 20 61 72 65  ame checksum are
2c320 20 63 61 6c 63 75 6c 61 74 65 64 2e 20 54 68 65   calculated. The
2c330 20 66 69 72 73 74 20 28 73 74 61 63 6b 0a 20 20   first (stack.  
2c340 2a 2a 20 76 61 72 69 61 62 6c 65 20 63 6b 73 75  ** variable cksu
2c350 6d 32 29 20 62 61 73 65 64 20 6f 6e 20 65 6e 74  m2) based on ent
2c360 72 69 65 73 20 65 78 74 72 61 63 74 65 64 20 66  ries extracted f
2c370 72 6f 6d 20 74 68 65 20 66 75 6c 6c 2d 74 65 78  rom the full-tex
2c380 74 20 69 6e 64 65 78 0a 20 20 2a 2a 20 77 68 69  t index.  ** whi
2c390 6c 65 20 64 6f 69 6e 67 20 61 20 6c 69 6e 65 61  le doing a linea
2c3a0 72 20 73 63 61 6e 20 6f 66 20 65 61 63 68 20 69  r scan of each i
2c3b0 6e 64 69 76 69 64 75 61 6c 20 69 6e 64 65 78 20  ndividual index 
2c3c0 69 6e 20 74 75 72 6e 2e 20 0a 20 20 2a 2a 0a 20  in turn. .  **. 
2c3d0 20 2a 2a 20 41 73 20 65 61 63 68 20 74 65 72 6d   ** As each term
2c3e0 20 76 69 73 69 74 65 64 20 62 79 20 74 68 65 20   visited by the 
2c3f0 6c 69 6e 65 61 72 20 73 63 61 6e 73 2c 20 61 20  linear scans, a 
2c400 73 65 70 61 72 61 74 65 20 71 75 65 72 79 20 66  separate query f
2c410 6f 72 20 74 68 65 0a 20 20 2a 2a 20 73 61 6d 65  or the.  ** same
2c420 20 74 65 72 6d 20 69 73 20 70 65 72 66 6f 72 6d   term is perform
2c430 65 64 2e 20 63 6b 73 75 6d 33 20 69 73 20 63 61  ed. cksum3 is ca
2c440 6c 63 75 6c 61 74 65 64 20 62 61 73 65 64 20 6f  lculated based o
2c450 6e 20 74 68 65 20 65 6e 74 72 69 65 73 0a 20 20  n the entries.  
2c460 2a 2a 20 65 78 74 72 61 63 74 65 64 20 62 79 20  ** extracted by 
2c470 74 68 65 73 65 20 71 75 65 72 69 65 73 2e 0a 20  these queries.. 
2c480 20 2a 2f 0a 20 20 66 6f 72 28 66 74 73 35 4d 75   */.  for(fts5Mu
2c490 6c 74 69 49 74 65 72 4e 65 77 28 70 2c 20 70 53  ltiIterNew(p, pS
2c4a0 74 72 75 63 74 2c 20 66 6c 61 67 73 2c 20 30 2c  truct, flags, 0,
2c4b0 20 30 2c 20 30 2c 20 2d 31 2c 20 30 2c 20 26 70   0, 0, -1, 0, &p
2c4c0 49 74 65 72 29 3b 0a 20 20 20 20 20 20 66 74 73  Iter);.      fts
2c4d0 35 4d 75 6c 74 69 49 74 65 72 45 6f 66 28 70 2c  5MultiIterEof(p,
2c4e0 20 70 49 74 65 72 29 3d 3d 30 3b 0a 20 20 20 20   pIter)==0;.    
2c4f0 20 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 4e    fts5MultiIterN
2c500 65 78 74 28 70 2c 20 70 49 74 65 72 2c 20 30 2c  ext(p, pIter, 0,
2c510 20 30 29 0a 20 20 29 7b 0a 20 20 20 20 69 6e 74   0).  ){.    int
2c520 20 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   n;             
2c530 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
2c540 20 6f 66 20 74 65 72 6d 20 69 6e 20 62 79 74 65   of term in byte
2c550 73 20 2a 2f 0a 20 20 20 20 69 36 34 20 69 50 6f  s */.    i64 iPo
2c560 73 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  s = 0;          
2c570 20 20 20 20 20 2f 2a 20 50 6f 73 69 74 69 6f 6e       /* Position
2c580 20 72 65 61 64 20 66 72 6f 6d 20 70 6f 73 6c 69   read from posli
2c590 73 74 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 4f  st */.    int iO
2c5a0 66 66 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ff = 0;         
2c5b0 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20        /* Offset 
2c5c0 77 69 74 68 69 6e 20 70 6f 73 6c 69 73 74 20 2a  within poslist *
2c5d0 2f 0a 20 20 20 20 69 36 34 20 69 52 6f 77 69 64  /.    i64 iRowid
2c5e0 20 3d 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72   = fts5MultiIter
2c5f0 52 6f 77 69 64 28 70 49 74 65 72 29 3b 0a 20 20  Rowid(pIter);.  
2c600 20 20 63 68 61 72 20 2a 7a 20 3d 20 28 63 68 61    char *z = (cha
2c610 72 2a 29 66 74 73 35 4d 75 6c 74 69 49 74 65 72  r*)fts5MultiIter
2c620 54 65 72 6d 28 70 49 74 65 72 2c 20 26 6e 29 3b  Term(pIter, &n);
2c630 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73  ..    /* If this
2c640 20 69 73 20 61 20 6e 65 77 20 74 65 72 6d 2c 20   is a new term, 
2c650 71 75 65 72 79 20 66 6f 72 20 69 74 2e 20 55 70  query for it. Up
2c660 64 61 74 65 20 63 6b 73 75 6d 33 20 77 69 74 68  date cksum3 with
2c670 20 74 68 65 20 72 65 73 75 6c 74 73 2e 20 2a 2f   the results. */
2c680 0a 20 20 20 20 66 74 73 35 54 65 73 74 54 65 72  .    fts5TestTer
2c690 6d 28 70 2c 20 26 74 65 72 6d 2c 20 7a 2c 20 6e  m(p, &term, z, n
2c6a0 2c 20 63 6b 73 75 6d 32 2c 20 26 63 6b 73 75 6d  , cksum2, &cksum
2c6b0 33 29 3b 0a 0a 20 20 20 20 69 66 28 20 65 44 65  3);..    if( eDe
2c6c0 74 61 69 6c 3d 3d 46 54 53 35 5f 44 45 54 41 49  tail==FTS5_DETAI
2c6d0 4c 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20  L_NONE ){.      
2c6e0 69 66 28 20 30 3d 3d 66 74 73 35 4d 75 6c 74 69  if( 0==fts5Multi
2c6f0 49 74 65 72 49 73 45 6d 70 74 79 28 70 2c 20 70  IterIsEmpty(p, p
2c700 49 74 65 72 29 20 29 7b 0a 20 20 20 20 20 20 20  Iter) ){.       
2c710 20 63 6b 73 75 6d 32 20 5e 3d 20 73 71 6c 69 74   cksum2 ^= sqlit
2c720 65 33 46 74 73 35 49 6e 64 65 78 45 6e 74 72 79  e3Fts5IndexEntry
2c730 43 6b 73 75 6d 28 69 52 6f 77 69 64 2c 20 30 2c  Cksum(iRowid, 0,
2c740 20 30 2c 20 2d 31 2c 20 7a 2c 20 6e 29 3b 0a 20   0, -1, z, n);. 
2c750 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
2c760 7b 0a 20 20 20 20 20 20 70 6f 73 6c 69 73 74 2e  {.      poslist.
2c770 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 66 74 73  n = 0;.      fts
2c780 35 53 65 67 69 74 65 72 50 6f 73 6c 69 73 74 28  5SegiterPoslist(
2c790 70 2c 20 26 70 49 74 65 72 2d 3e 61 53 65 67 5b  p, &pIter->aSeg[
2c7a0 70 49 74 65 72 2d 3e 61 46 69 72 73 74 5b 31 5d  pIter->aFirst[1]
2c7b0 2e 69 46 69 72 73 74 5d 2c 20 30 2c 20 26 70 6f  .iFirst], 0, &po
2c7c0 73 6c 69 73 74 29 3b 0a 20 20 20 20 20 20 77 68  slist);.      wh
2c7d0 69 6c 65 28 20 30 3d 3d 73 71 6c 69 74 65 33 46  ile( 0==sqlite3F
2c7e0 74 73 35 50 6f 73 6c 69 73 74 4e 65 78 74 36 34  ts5PoslistNext64
2c7f0 28 70 6f 73 6c 69 73 74 2e 70 2c 20 70 6f 73 6c  (poslist.p, posl
2c800 69 73 74 2e 6e 2c 20 26 69 4f 66 66 2c 20 26 69  ist.n, &iOff, &i
2c810 50 6f 73 29 20 29 7b 0a 20 20 20 20 20 20 20 20  Pos) ){.        
2c820 69 6e 74 20 69 43 6f 6c 20 3d 20 46 54 53 35 5f  int iCol = FTS5_
2c830 50 4f 53 32 43 4f 4c 55 4d 4e 28 69 50 6f 73 29  POS2COLUMN(iPos)
2c840 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 54  ;.        int iT
2c850 6f 6b 4f 66 66 20 3d 20 46 54 53 35 5f 50 4f 53  okOff = FTS5_POS
2c860 32 4f 46 46 53 45 54 28 69 50 6f 73 29 3b 0a 20  2OFFSET(iPos);. 
2c870 20 20 20 20 20 20 20 63 6b 73 75 6d 32 20 5e 3d         cksum2 ^=
2c880 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65   sqlite3Fts5Inde
2c890 78 45 6e 74 72 79 43 6b 73 75 6d 28 69 52 6f 77  xEntryCksum(iRow
2c8a0 69 64 2c 20 69 43 6f 6c 2c 20 69 54 6f 6b 4f 66  id, iCol, iTokOf
2c8b0 66 2c 20 2d 31 2c 20 7a 2c 20 6e 29 3b 0a 20 20  f, -1, z, n);.  
2c8c0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
2c8d0 20 20 66 74 73 35 54 65 73 74 54 65 72 6d 28 70    fts5TestTerm(p
2c8e0 2c 20 26 74 65 72 6d 2c 20 30 2c 20 30 2c 20 63  , &term, 0, 0, c
2c8f0 6b 73 75 6d 32 2c 20 26 63 6b 73 75 6d 33 29 3b  ksum2, &cksum3);
2c900 0a 0a 20 20 66 74 73 35 4d 75 6c 74 69 49 74 65  ..  fts5MultiIte
2c910 72 46 72 65 65 28 70 49 74 65 72 29 3b 0a 20 20  rFree(pIter);.  
2c920 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  if( p->rc==SQLIT
2c930 45 5f 4f 4b 20 26 26 20 63 6b 73 75 6d 21 3d 63  E_OK && cksum!=c
2c940 6b 73 75 6d 32 20 29 20 70 2d 3e 72 63 20 3d 20  ksum2 ) p->rc = 
2c950 46 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a 0a 20  FTS5_CORRUPT;.. 
2c960 20 66 74 73 35 53 74 72 75 63 74 75 72 65 52 65   fts5StructureRe
2c970 6c 65 61 73 65 28 70 53 74 72 75 63 74 29 3b 0a  lease(pStruct);.
2c980 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
2c990 42 55 47 0a 20 20 66 74 73 35 42 75 66 66 65 72  BUG.  fts5Buffer
2c9a0 46 72 65 65 28 26 74 65 72 6d 29 3b 0a 23 65 6e  Free(&term);.#en
2c9b0 64 69 66 0a 20 20 66 74 73 35 42 75 66 66 65 72  dif.  fts5Buffer
2c9c0 46 72 65 65 28 26 70 6f 73 6c 69 73 74 29 3b 0a  Free(&poslist);.
2c9d0 20 20 72 65 74 75 72 6e 20 66 74 73 35 49 6e 64    return fts5Ind
2c9e0 65 78 52 65 74 75 72 6e 28 70 29 3b 0a 7d 0a 0a  exReturn(p);.}..
2c9f0 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /***************
2ca00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2ca10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2ca20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2ca30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a  **********.*****
2ca40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2ca50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2ca60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2ca70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2ca80 2a 2a 2a 2a 2a 0a 2a 2a 20 42 65 6c 6f 77 20 74  *****.** Below t
2ca90 68 69 73 20 70 6f 69 6e 74 20 69 73 20 74 68 65  his point is the
2caa0 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
2cab0 6f 66 20 74 68 65 20 66 74 73 35 5f 64 65 63 6f  of the fts5_deco
2cac0 64 65 28 29 20 73 63 61 6c 61 72 0a 2a 2a 20 66  de() scalar.** f
2cad0 75 6e 63 74 69 6f 6e 20 6f 6e 6c 79 2e 0a 2a 2f  unction only..*/
2cae0 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 6f 64 65 20 61  ../*.** Decode a
2caf0 20 73 65 67 6d 65 6e 74 2d 64 61 74 61 20 72 6f   segment-data ro
2cb00 77 69 64 20 66 72 6f 6d 20 74 68 65 20 25 5f 64  wid from the %_d
2cb10 61 74 61 20 74 61 62 6c 65 2e 20 54 68 69 73 20  ata table. This 
2cb20 66 75 6e 63 74 69 6f 6e 20 69 73 0a 2a 2a 20 74  function is.** t
2cb30 68 65 20 6f 70 70 6f 73 69 74 65 20 6f 66 20 6d  he opposite of m
2cb40 61 63 72 6f 20 46 54 53 35 5f 53 45 47 4d 45 4e  acro FTS5_SEGMEN
2cb50 54 5f 52 4f 57 49 44 28 29 2e 0a 2a 2f 0a 73 74  T_ROWID()..*/.st
2cb60 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 44 65  atic void fts5De
2cb70 63 6f 64 65 52 6f 77 69 64 28 0a 20 20 69 36 34  codeRowid(.  i64
2cb80 20 69 52 6f 77 69 64 2c 20 20 20 20 20 20 20 20   iRowid,        
2cb90 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2cba0 52 6f 77 69 64 20 66 72 6f 6d 20 25 5f 64 61 74  Rowid from %_dat
2cbb0 61 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74  a table */.  int
2cbc0 20 2a 70 69 53 65 67 69 64 2c 20 20 20 20 20 20   *piSegid,      
2cbd0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2cbe0 4f 55 54 3a 20 53 65 67 6d 65 6e 74 20 69 64 20  OUT: Segment id 
2cbf0 2a 2f 0a 20 20 69 6e 74 20 2a 70 62 44 6c 69 64  */.  int *pbDlid
2cc00 78 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  x,              
2cc10 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 44 6c 69       /* OUT: Dli
2cc20 64 78 20 66 6c 61 67 20 2a 2f 0a 20 20 69 6e 74  dx flag */.  int
2cc30 20 2a 70 69 48 65 69 67 68 74 2c 20 20 20 20 20   *piHeight,     
2cc40 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2cc50 4f 55 54 3a 20 48 65 69 67 68 74 20 2a 2f 0a 20  OUT: Height */. 
2cc60 20 69 6e 74 20 2a 70 69 50 67 6e 6f 20 20 20 20   int *piPgno    
2cc70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2cc80 20 2f 2a 20 4f 55 54 3a 20 50 61 67 65 20 6e 75   /* OUT: Page nu
2cc90 6d 62 65 72 20 2a 2f 0a 29 7b 0a 20 20 2a 70 69  mber */.){.  *pi
2cca0 50 67 6e 6f 20 3d 20 28 69 6e 74 29 28 69 52 6f  Pgno = (int)(iRo
2ccb0 77 69 64 20 26 20 28 28 28 69 36 34 29 31 20 3c  wid & (((i64)1 <
2ccc0 3c 20 46 54 53 35 5f 44 41 54 41 5f 50 41 47 45  < FTS5_DATA_PAGE
2ccd0 5f 42 29 20 2d 20 31 29 29 3b 0a 20 20 69 52 6f  _B) - 1));.  iRo
2cce0 77 69 64 20 3e 3e 3d 20 46 54 53 35 5f 44 41 54  wid >>= FTS5_DAT
2ccf0 41 5f 50 41 47 45 5f 42 3b 0a 0a 20 20 2a 70 69  A_PAGE_B;..  *pi
2cd00 48 65 69 67 68 74 20 3d 20 28 69 6e 74 29 28 69  Height = (int)(i
2cd10 52 6f 77 69 64 20 26 20 28 28 28 69 36 34 29 31  Rowid & (((i64)1
2cd20 20 3c 3c 20 46 54 53 35 5f 44 41 54 41 5f 48 45   << FTS5_DATA_HE
2cd30 49 47 48 54 5f 42 29 20 2d 20 31 29 29 3b 0a 20  IGHT_B) - 1));. 
2cd40 20 69 52 6f 77 69 64 20 3e 3e 3d 20 46 54 53 35   iRowid >>= FTS5
2cd50 5f 44 41 54 41 5f 48 45 49 47 48 54 5f 42 3b 0a  _DATA_HEIGHT_B;.
2cd60 0a 20 20 2a 70 62 44 6c 69 64 78 20 3d 20 28 69  .  *pbDlidx = (i
2cd70 6e 74 29 28 69 52 6f 77 69 64 20 26 20 30 78 30  nt)(iRowid & 0x0
2cd80 30 30 31 29 3b 0a 20 20 69 52 6f 77 69 64 20 3e  001);.  iRowid >
2cd90 3e 3d 20 46 54 53 35 5f 44 41 54 41 5f 44 4c 49  >= FTS5_DATA_DLI
2cda0 5f 42 3b 0a 0a 20 20 2a 70 69 53 65 67 69 64 20  _B;..  *piSegid 
2cdb0 3d 20 28 69 6e 74 29 28 69 52 6f 77 69 64 20 26  = (int)(iRowid &
2cdc0 20 28 28 28 69 36 34 29 31 20 3c 3c 20 46 54 53   (((i64)1 << FTS
2cdd0 35 5f 44 41 54 41 5f 49 44 5f 42 29 20 2d 20 31  5_DATA_ID_B) - 1
2cde0 29 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f  ));.}..static vo
2cdf0 69 64 20 66 74 73 35 44 65 62 75 67 52 6f 77 69  id fts5DebugRowi
2ce00 64 28 69 6e 74 20 2a 70 52 63 2c 20 46 74 73 35  d(int *pRc, Fts5
2ce10 42 75 66 66 65 72 20 2a 70 42 75 66 2c 20 69 36  Buffer *pBuf, i6
2ce20 34 20 69 4b 65 79 29 7b 0a 20 20 69 6e 74 20 69  4 iKey){.  int i
2ce30 53 65 67 69 64 2c 20 69 48 65 69 67 68 74 2c 20  Segid, iHeight, 
2ce40 69 50 67 6e 6f 2c 20 62 44 6c 69 64 78 3b 20 20  iPgno, bDlidx;  
2ce50 20 20 20 20 20 2f 2a 20 52 6f 77 69 64 20 63 6f       /* Rowid co
2ce60 6d 70 65 6e 65 6e 74 73 20 2a 2f 0a 20 20 66 74  mpenents */.  ft
2ce70 73 35 44 65 63 6f 64 65 52 6f 77 69 64 28 69 4b  s5DecodeRowid(iK
2ce80 65 79 2c 20 26 69 53 65 67 69 64 2c 20 26 62 44  ey, &iSegid, &bD
2ce90 6c 69 64 78 2c 20 26 69 48 65 69 67 68 74 2c 20  lidx, &iHeight, 
2cea0 26 69 50 67 6e 6f 29 3b 0a 0a 20 20 69 66 28 20  &iPgno);..  if( 
2ceb0 69 53 65 67 69 64 3d 3d 30 20 29 7b 0a 20 20 20  iSegid==0 ){.   
2cec0 20 69 66 28 20 69 4b 65 79 3d 3d 46 54 53 35 5f   if( iKey==FTS5_
2ced0 41 56 45 52 41 47 45 53 5f 52 4f 57 49 44 20 29  AVERAGES_ROWID )
2cee0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 46  {.      sqlite3F
2cef0 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 50  ts5BufferAppendP
2cf00 72 69 6e 74 66 28 70 52 63 2c 20 70 42 75 66 2c  rintf(pRc, pBuf,
2cf10 20 22 7b 61 76 65 72 61 67 65 73 7d 20 22 29 3b   "{averages} ");
2cf20 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
2cf30 20 20 73 71 6c 69 74 65 33 46 74 73 35 42 75 66    sqlite3Fts5Buf
2cf40 66 65 72 41 70 70 65 6e 64 50 72 69 6e 74 66 28  ferAppendPrintf(
2cf50 70 52 63 2c 20 70 42 75 66 2c 20 22 7b 73 74 72  pRc, pBuf, "{str
2cf60 75 63 74 75 72 65 7d 22 29 3b 0a 20 20 20 20 7d  ucture}");.    }
2cf70 0a 20 20 7d 0a 20 20 65 6c 73 65 7b 0a 20 20 20  .  }.  else{.   
2cf80 20 73 71 6c 69 74 65 33 46 74 73 35 42 75 66 66   sqlite3Fts5Buff
2cf90 65 72 41 70 70 65 6e 64 50 72 69 6e 74 66 28 70  erAppendPrintf(p
2cfa0 52 63 2c 20 70 42 75 66 2c 20 22 7b 25 73 73 65  Rc, pBuf, "{%sse
2cfb0 67 69 64 3d 25 64 20 68 3d 25 64 20 70 67 6e 6f  gid=%d h=%d pgno
2cfc0 3d 25 64 7d 22 2c 0a 20 20 20 20 20 20 20 20 62  =%d}",.        b
2cfd0 44 6c 69 64 78 20 3f 20 22 64 6c 69 64 78 20 22  Dlidx ? "dlidx "
2cfe0 20 3a 20 22 22 2c 20 69 53 65 67 69 64 2c 20 69   : "", iSegid, i
2cff0 48 65 69 67 68 74 2c 20 69 50 67 6e 6f 0a 20 20  Height, iPgno.  
2d000 20 20 29 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74    );.  }.}..stat
2d010 69 63 20 76 6f 69 64 20 66 74 73 35 44 65 62 75  ic void fts5Debu
2d020 67 53 74 72 75 63 74 75 72 65 28 0a 20 20 69 6e  gStructure(.  in
2d030 74 20 2a 70 52 63 2c 20 20 20 20 20 20 20 20 20  t *pRc,         
2d040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2d050 20 49 4e 2f 4f 55 54 3a 20 65 72 72 6f 72 20 63   IN/OUT: error c
2d060 6f 64 65 20 2a 2f 0a 20 20 46 74 73 35 42 75 66  ode */.  Fts5Buf
2d070 66 65 72 20 2a 70 42 75 66 2c 0a 20 20 46 74 73  fer *pBuf,.  Fts
2d080 35 53 74 72 75 63 74 75 72 65 20 2a 70 0a 29 7b  5Structure *p.){
2d090 0a 20 20 69 6e 74 20 69 4c 76 6c 2c 20 69 53 65  .  int iLvl, iSe
2d0a0 67 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  g;              
2d0b0 20 20 20 2f 2a 20 49 74 65 72 61 74 65 20 74 68     /* Iterate th
2d0c0 72 6f 75 67 68 20 6c 65 76 65 6c 73 2c 20 73 65  rough levels, se
2d0d0 67 6d 65 6e 74 73 20 2a 2f 0a 0a 20 20 66 6f 72  gments */..  for
2d0e0 28 69 4c 76 6c 3d 30 3b 20 69 4c 76 6c 3c 70 2d  (iLvl=0; iLvl<p-
2d0f0 3e 6e 4c 65 76 65 6c 3b 20 69 4c 76 6c 2b 2b 29  >nLevel; iLvl++)
2d100 7b 0a 20 20 20 20 46 74 73 35 53 74 72 75 63 74  {.    Fts5Struct
2d110 75 72 65 4c 65 76 65 6c 20 2a 70 4c 76 6c 20 3d  ureLevel *pLvl =
2d120 20 26 70 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c   &p->aLevel[iLvl
2d130 5d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 46 74  ];.    sqlite3Ft
2d140 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 50 72  s5BufferAppendPr
2d150 69 6e 74 66 28 70 52 63 2c 20 70 42 75 66 2c 20  intf(pRc, pBuf, 
2d160 0a 20 20 20 20 20 20 20 20 22 20 7b 6c 76 6c 3d  .        " {lvl=
2d170 25 64 20 6e 4d 65 72 67 65 3d 25 64 20 6e 53 65  %d nMerge=%d nSe
2d180 67 3d 25 64 22 2c 20 69 4c 76 6c 2c 20 70 4c 76  g=%d", iLvl, pLv
2d190 6c 2d 3e 6e 4d 65 72 67 65 2c 20 70 4c 76 6c 2d  l->nMerge, pLvl-
2d1a0 3e 6e 53 65 67 0a 20 20 20 20 29 3b 0a 20 20 20  >nSeg.    );.   
2d1b0 20 66 6f 72 28 69 53 65 67 3d 30 3b 20 69 53 65   for(iSeg=0; iSe
2d1c0 67 3c 70 4c 76 6c 2d 3e 6e 53 65 67 3b 20 69 53  g<pLvl->nSeg; iS
2d1d0 65 67 2b 2b 29 7b 0a 20 20 20 20 20 20 46 74 73  eg++){.      Fts
2d1e0 35 53 74 72 75 63 74 75 72 65 53 65 67 6d 65 6e  5StructureSegmen
2d1f0 74 20 2a 70 53 65 67 20 3d 20 26 70 4c 76 6c 2d  t *pSeg = &pLvl-
2d200 3e 61 53 65 67 5b 69 53 65 67 5d 3b 0a 20 20 20  >aSeg[iSeg];.   
2d210 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 42 75     sqlite3Fts5Bu
2d220 66 66 65 72 41 70 70 65 6e 64 50 72 69 6e 74 66  fferAppendPrintf
2d230 28 70 52 63 2c 20 70 42 75 66 2c 20 22 20 7b 69  (pRc, pBuf, " {i
2d240 64 3d 25 64 20 6c 65 61 76 65 73 3d 25 64 2e 2e  d=%d leaves=%d..
2d250 25 64 7d 22 2c 20 0a 20 20 20 20 20 20 20 20 20  %d}", .         
2d260 20 70 53 65 67 2d 3e 69 53 65 67 69 64 2c 20 70   pSeg->iSegid, p
2d270 53 65 67 2d 3e 70 67 6e 6f 46 69 72 73 74 2c 20  Seg->pgnoFirst, 
2d280 70 53 65 67 2d 3e 70 67 6e 6f 4c 61 73 74 0a 20  pSeg->pgnoLast. 
2d290 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 20 20       );.    }.  
2d2a0 20 20 73 71 6c 69 74 65 33 46 74 73 35 42 75 66    sqlite3Fts5Buf
2d2b0 66 65 72 41 70 70 65 6e 64 50 72 69 6e 74 66 28  ferAppendPrintf(
2d2c0 70 52 63 2c 20 70 42 75 66 2c 20 22 7d 22 29 3b  pRc, pBuf, "}");
2d2d0 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  .  }.}../*.** Th
2d2e0 69 73 20 69 73 20 70 61 72 74 20 6f 66 20 74 68  is is part of th
2d2f0 65 20 66 74 73 35 5f 64 65 63 6f 64 65 28 29 20  e fts5_decode() 
2d300 64 65 62 75 67 67 69 6e 67 20 61 69 64 2e 0a 2a  debugging aid..*
2d310 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 73 20 70  *.** Arguments p
2d320 42 6c 6f 62 2f 6e 42 6c 6f 62 20 63 6f 6e 74 61  Blob/nBlob conta
2d330 69 6e 20 61 20 73 65 72 69 61 6c 69 7a 65 64 20  in a serialized 
2d340 46 74 73 35 53 74 72 75 63 74 75 72 65 20 6f 62  Fts5Structure ob
2d350 6a 65 63 74 2e 20 54 68 69 73 0a 2a 2a 20 66 75  ject. This.** fu
2d360 6e 63 74 69 6f 6e 20 61 70 70 65 6e 64 73 20 61  nction appends a
2d370 20 68 75 6d 61 6e 2d 72 65 61 64 61 62 6c 65 20   human-readable 
2d380 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f  representation o
2d390 66 20 74 68 65 20 73 61 6d 65 20 6f 62 6a 65 63  f the same objec
2d3a0 74 0a 2a 2a 20 74 6f 20 74 68 65 20 62 75 66 66  t.** to the buff
2d3b0 65 72 20 70 61 73 73 65 64 20 61 73 20 74 68 65  er passed as the
2d3c0 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
2d3d0 2e 20 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  . .*/.static voi
2d3e0 64 20 66 74 73 35 44 65 63 6f 64 65 53 74 72 75  d fts5DecodeStru
2d3f0 63 74 75 72 65 28 0a 20 20 69 6e 74 20 2a 70 52  cture(.  int *pR
2d400 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c,              
2d410 20 20 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f           /* IN/O
2d420 55 54 3a 20 65 72 72 6f 72 20 63 6f 64 65 20 2a  UT: error code *
2d430 2f 0a 20 20 46 74 73 35 42 75 66 66 65 72 20 2a  /.  Fts5Buffer *
2d440 70 42 75 66 2c 0a 20 20 63 6f 6e 73 74 20 75 38  pBuf,.  const u8
2d450 20 2a 70 42 6c 6f 62 2c 20 69 6e 74 20 6e 42 6c   *pBlob, int nBl
2d460 6f 62 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20  ob.){.  int rc; 
2d470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d480 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
2d490 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 46 74 73 35  n code */.  Fts5
2d4a0 53 74 72 75 63 74 75 72 65 20 2a 70 20 3d 20 30  Structure *p = 0
2d4b0 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44  ;           /* D
2d4c0 65 63 6f 64 65 64 20 73 74 72 75 63 74 75 72 65  ecoded structure
2d4d0 20 6f 62 6a 65 63 74 20 2a 2f 0a 0a 20 20 72 63   object */..  rc
2d4e0 20 3d 20 66 74 73 35 53 74 72 75 63 74 75 72 65   = fts5Structure
2d4f0 44 65 63 6f 64 65 28 70 42 6c 6f 62 2c 20 6e 42  Decode(pBlob, nB
2d500 6c 6f 62 2c 20 30 2c 20 26 70 29 3b 0a 20 20 69  lob, 0, &p);.  i
2d510 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
2d520 20 29 7b 0a 20 20 20 20 2a 70 52 63 20 3d 20 72   ){.    *pRc = r
2d530 63 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  c;.    return;. 
2d540 20 7d 0a 0a 20 20 66 74 73 35 44 65 62 75 67 53   }..  fts5DebugS
2d550 74 72 75 63 74 75 72 65 28 70 52 63 2c 20 70 42  tructure(pRc, pB
2d560 75 66 2c 20 70 29 3b 0a 20 20 66 74 73 35 53 74  uf, p);.  fts5St
2d570 72 75 63 74 75 72 65 52 65 6c 65 61 73 65 28 70  ructureRelease(p
2d580 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  );.}../*.** This
2d590 20 69 73 20 70 61 72 74 20 6f 66 20 74 68 65 20   is part of the 
2d5a0 66 74 73 35 5f 64 65 63 6f 64 65 28 29 20 64 65  fts5_decode() de
2d5b0 62 75 67 67 69 6e 67 20 61 69 64 2e 0a 2a 2a 0a  bugging aid..**.
2d5c0 2a 2a 20 41 72 67 75 6d 65 6e 74 73 20 70 42 6c  ** Arguments pBl
2d5d0 6f 62 2f 6e 42 6c 6f 62 20 63 6f 6e 74 61 69 6e  ob/nBlob contain
2d5e0 20 61 6e 20 22 61 76 65 72 61 67 65 73 22 20 72   an "averages" r
2d5f0 65 63 6f 72 64 2e 20 54 68 69 73 20 66 75 6e 63  ecord. This func
2d600 74 69 6f 6e 20 0a 2a 2a 20 61 70 70 65 6e 64 73  tion .** appends
2d610 20 61 20 68 75 6d 61 6e 2d 72 65 61 64 61 62 6c   a human-readabl
2d620 65 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e  e representation
2d630 20 6f 66 20 72 65 63 6f 72 64 20 74 6f 20 74 68   of record to th
2d640 65 20 62 75 66 66 65 72 20 70 61 73 73 65 64 20  e buffer passed 
2d650 0a 2a 2a 20 61 73 20 74 68 65 20 73 65 63 6f 6e  .** as the secon
2d660 64 20 61 72 67 75 6d 65 6e 74 2e 20 0a 2a 2f 0a  d argument. .*/.
2d670 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
2d680 44 65 63 6f 64 65 41 76 65 72 61 67 65 73 28 0a  DecodeAverages(.
2d690 20 20 69 6e 74 20 2a 70 52 63 2c 20 20 20 20 20    int *pRc,     
2d6a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d6b0 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 65 72 72    /* IN/OUT: err
2d6c0 6f 72 20 63 6f 64 65 20 2a 2f 0a 20 20 46 74 73  or code */.  Fts
2d6d0 35 42 75 66 66 65 72 20 2a 70 42 75 66 2c 0a 20  5Buffer *pBuf,. 
2d6e0 20 63 6f 6e 73 74 20 75 38 20 2a 70 42 6c 6f 62   const u8 *pBlob
2d6f0 2c 20 69 6e 74 20 6e 42 6c 6f 62 0a 29 7b 0a 20  , int nBlob.){. 
2d700 20 69 6e 74 20 69 20 3d 20 30 3b 0a 20 20 63 6f   int i = 0;.  co
2d710 6e 73 74 20 63 68 61 72 20 2a 7a 53 70 61 63 65  nst char *zSpace
2d720 20 3d 20 22 22 3b 0a 0a 20 20 77 68 69 6c 65 28   = "";..  while(
2d730 20 69 3c 6e 42 6c 6f 62 20 29 7b 0a 20 20 20 20   i<nBlob ){.    
2d740 75 36 34 20 69 56 61 6c 3b 0a 20 20 20 20 69 20  u64 iVal;.    i 
2d750 2b 3d 20 73 71 6c 69 74 65 33 46 74 73 35 47 65  += sqlite3Fts5Ge
2d760 74 56 61 72 69 6e 74 28 26 70 42 6c 6f 62 5b 69  tVarint(&pBlob[i
2d770 5d 2c 20 26 69 56 61 6c 29 3b 0a 20 20 20 20 73  ], &iVal);.    s
2d780 71 6c 69 74 65 33 46 74 73 35 42 75 66 66 65 72  qlite3Fts5Buffer
2d790 41 70 70 65 6e 64 50 72 69 6e 74 66 28 70 52 63  AppendPrintf(pRc
2d7a0 2c 20 70 42 75 66 2c 20 22 25 73 25 64 22 2c 20  , pBuf, "%s%d", 
2d7b0 7a 53 70 61 63 65 2c 20 28 69 6e 74 29 69 56 61  zSpace, (int)iVa
2d7c0 6c 29 3b 0a 20 20 20 20 7a 53 70 61 63 65 20 3d  l);.    zSpace =
2d7d0 20 22 20 22 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a   " ";.  }.}../*.
2d7e0 2a 2a 20 42 75 66 66 65 72 20 28 61 2f 6e 29 20  ** Buffer (a/n) 
2d7f0 69 73 20 61 73 73 75 6d 65 64 20 74 6f 20 63 6f  is assumed to co
2d800 6e 74 61 69 6e 20 61 20 6c 69 73 74 20 6f 66 20  ntain a list of 
2d810 73 65 72 69 61 6c 69 7a 65 64 20 76 61 72 69 6e  serialized varin
2d820 74 73 2e 20 52 65 61 64 0a 2a 2a 20 65 61 63 68  ts. Read.** each
2d830 20 76 61 72 69 6e 74 20 61 6e 64 20 61 70 70 65   varint and appe
2d840 6e 64 20 69 74 73 20 73 74 72 69 6e 67 20 72 65  nd its string re
2d850 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 74 6f 20  presentation to 
2d860 62 75 66 66 65 72 20 70 42 75 66 2e 20 52 65 74  buffer pBuf. Ret
2d870 75 72 6e 0a 2a 2a 20 61 66 74 65 72 20 65 69 74  urn.** after eit
2d880 68 65 72 20 74 68 65 20 69 6e 70 75 74 20 62 75  her the input bu
2d890 66 66 65 72 20 69 73 20 65 78 68 61 75 73 74 65  ffer is exhauste
2d8a0 64 20 6f 72 20 61 20 30 20 76 61 6c 75 65 20 69  d or a 0 value i
2d8b0 73 20 72 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  s read..**.** Th
2d8c0 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69  e return value i
2d8d0 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
2d8e0 62 79 74 65 73 20 72 65 61 64 20 66 72 6f 6d 20  bytes read from 
2d8f0 74 68 65 20 69 6e 70 75 74 20 62 75 66 66 65 72  the input buffer
2d900 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
2d910 66 74 73 35 44 65 63 6f 64 65 50 6f 73 6c 69 73  fts5DecodePoslis
2d920 74 28 69 6e 74 20 2a 70 52 63 2c 20 46 74 73 35  t(int *pRc, Fts5
2d930 42 75 66 66 65 72 20 2a 70 42 75 66 2c 20 63 6f  Buffer *pBuf, co
2d940 6e 73 74 20 75 38 20 2a 61 2c 20 69 6e 74 20 6e  nst u8 *a, int n
2d950 29 7b 0a 20 20 69 6e 74 20 69 4f 66 66 20 3d 20  ){.  int iOff = 
2d960 30 3b 0a 20 20 77 68 69 6c 65 28 20 69 4f 66 66  0;.  while( iOff
2d970 3c 6e 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 56  <n ){.    int iV
2d980 61 6c 3b 0a 20 20 20 20 69 4f 66 66 20 2b 3d 20  al;.    iOff += 
2d990 66 74 73 35 47 65 74 56 61 72 69 6e 74 33 32 28  fts5GetVarint32(
2d9a0 26 61 5b 69 4f 66 66 5d 2c 20 69 56 61 6c 29 3b  &a[iOff], iVal);
2d9b0 0a 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35  .    sqlite3Fts5
2d9c0 42 75 66 66 65 72 41 70 70 65 6e 64 50 72 69 6e  BufferAppendPrin
2d9d0 74 66 28 70 52 63 2c 20 70 42 75 66 2c 20 22 20  tf(pRc, pBuf, " 
2d9e0 25 64 22 2c 20 69 56 61 6c 29 3b 0a 20 20 7d 0a  %d", iVal);.  }.
2d9f0 20 20 72 65 74 75 72 6e 20 69 4f 66 66 3b 0a 7d    return iOff;.}
2da00 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73 74 61 72  ../*.** The star
2da10 74 20 6f 66 20 62 75 66 66 65 72 20 28 61 2f 6e  t of buffer (a/n
2da20 29 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 73  ) contains the s
2da30 74 61 72 74 20 6f 66 20 61 20 64 6f 63 6c 69 73  tart of a doclis
2da40 74 2e 20 54 68 65 20 64 6f 63 6c 69 73 74 0a 2a  t. The doclist.*
2da50 2a 20 6d 61 79 20 6f 72 20 6d 61 79 20 6e 6f 74  * may or may not
2da60 20 66 69 6e 69 73 68 20 77 69 74 68 69 6e 20 74   finish within t
2da70 68 65 20 62 75 66 66 65 72 2e 20 54 68 69 73 20  he buffer. This 
2da80 66 75 6e 63 74 69 6f 6e 20 61 70 70 65 6e 64 73  function appends
2da90 20 61 20 74 65 78 74 0a 2a 2a 20 72 65 70 72 65   a text.** repre
2daa0 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65  sentation of the
2dab0 20 70 61 72 74 20 6f 66 20 74 68 65 20 64 6f 63   part of the doc
2dac0 6c 69 73 74 20 74 68 61 74 20 69 73 20 70 72 65  list that is pre
2dad0 73 65 6e 74 20 74 6f 20 62 75 66 66 65 72 0a 2a  sent to buffer.*
2dae0 2a 20 70 42 75 66 2e 20 0a 2a 2a 0a 2a 2a 20 54  * pBuf. .**.** T
2daf0 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20  he return value 
2db00 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  is the number of
2db10 20 62 79 74 65 73 20 72 65 61 64 20 66 72 6f 6d   bytes read from
2db20 20 74 68 65 20 69 6e 70 75 74 20 62 75 66 66 65   the input buffe
2db30 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  r..*/.static int
2db40 20 66 74 73 35 44 65 63 6f 64 65 44 6f 63 6c 69   fts5DecodeDocli
2db50 73 74 28 69 6e 74 20 2a 70 52 63 2c 20 46 74 73  st(int *pRc, Fts
2db60 35 42 75 66 66 65 72 20 2a 70 42 75 66 2c 20 63  5Buffer *pBuf, c
2db70 6f 6e 73 74 20 75 38 20 2a 61 2c 20 69 6e 74 20  onst u8 *a, int 
2db80 6e 29 7b 0a 20 20 69 36 34 20 69 44 6f 63 69 64  n){.  i64 iDocid
2db90 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 4f 66 66   = 0;.  int iOff
2dba0 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20 6e 3e 30   = 0;..  if( n>0
2dbb0 20 29 7b 0a 20 20 20 20 69 4f 66 66 20 3d 20 73   ){.    iOff = s
2dbc0 71 6c 69 74 65 33 46 74 73 35 47 65 74 56 61 72  qlite3Fts5GetVar
2dbd0 69 6e 74 28 61 2c 20 28 75 36 34 2a 29 26 69 44  int(a, (u64*)&iD
2dbe0 6f 63 69 64 29 3b 0a 20 20 20 20 73 71 6c 69 74  ocid);.    sqlit
2dbf0 65 33 46 74 73 35 42 75 66 66 65 72 41 70 70 65  e3Fts5BufferAppe
2dc00 6e 64 50 72 69 6e 74 66 28 70 52 63 2c 20 70 42  ndPrintf(pRc, pB
2dc10 75 66 2c 20 22 20 69 64 3d 25 6c 6c 64 22 2c 20  uf, " id=%lld", 
2dc20 69 44 6f 63 69 64 29 3b 0a 20 20 7d 0a 20 20 77  iDocid);.  }.  w
2dc30 68 69 6c 65 28 20 69 4f 66 66 3c 6e 20 29 7b 0a  hile( iOff<n ){.
2dc40 20 20 20 20 69 6e 74 20 6e 50 6f 73 3b 0a 20 20      int nPos;.  
2dc50 20 20 69 6e 74 20 62 44 65 6c 3b 0a 20 20 20 20    int bDel;.    
2dc60 69 4f 66 66 20 2b 3d 20 66 74 73 35 47 65 74 50  iOff += fts5GetP
2dc70 6f 73 6c 69 73 74 53 69 7a 65 28 26 61 5b 69 4f  oslistSize(&a[iO
2dc80 66 66 5d 2c 20 26 6e 50 6f 73 2c 20 26 62 44 65  ff], &nPos, &bDe
2dc90 6c 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 46  l);.    sqlite3F
2dca0 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 50  ts5BufferAppendP
2dcb0 72 69 6e 74 66 28 70 52 63 2c 20 70 42 75 66 2c  rintf(pRc, pBuf,
2dcc0 20 22 20 6e 50 6f 73 3d 25 64 25 73 22 2c 20 6e   " nPos=%d%s", n
2dcd0 50 6f 73 2c 20 62 44 65 6c 3f 22 2a 22 3a 22 22  Pos, bDel?"*":""
2dce0 29 3b 0a 20 20 20 20 69 4f 66 66 20 2b 3d 20 66  );.    iOff += f
2dcf0 74 73 35 44 65 63 6f 64 65 50 6f 73 6c 69 73 74  ts5DecodePoslist
2dd00 28 70 52 63 2c 20 70 42 75 66 2c 20 26 61 5b 69  (pRc, pBuf, &a[i
2dd10 4f 66 66 5d 2c 20 4d 49 4e 28 6e 2d 69 4f 66 66  Off], MIN(n-iOff
2dd20 2c 20 6e 50 6f 73 29 29 3b 0a 20 20 20 20 69 66  , nPos));.    if
2dd30 28 20 69 4f 66 66 3c 6e 20 29 7b 0a 20 20 20 20  ( iOff<n ){.    
2dd40 20 20 69 36 34 20 69 44 65 6c 74 61 3b 0a 20 20    i64 iDelta;.  
2dd50 20 20 20 20 69 4f 66 66 20 2b 3d 20 73 71 6c 69      iOff += sqli
2dd60 74 65 33 46 74 73 35 47 65 74 56 61 72 69 6e 74  te3Fts5GetVarint
2dd70 28 26 61 5b 69 4f 66 66 5d 2c 20 28 75 36 34 2a  (&a[iOff], (u64*
2dd80 29 26 69 44 65 6c 74 61 29 3b 0a 20 20 20 20 20  )&iDelta);.     
2dd90 20 69 44 6f 63 69 64 20 2b 3d 20 69 44 65 6c 74   iDocid += iDelt
2dda0 61 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  a;.      sqlite3
2ddb0 46 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64  Fts5BufferAppend
2ddc0 50 72 69 6e 74 66 28 70 52 63 2c 20 70 42 75 66  Printf(pRc, pBuf
2ddd0 2c 20 22 20 69 64 3d 25 6c 6c 64 22 2c 20 69 44  , " id=%lld", iD
2dde0 6f 63 69 64 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  ocid);.    }.  }
2ddf0 0a 0a 20 20 72 65 74 75 72 6e 20 69 4f 66 66 3b  ..  return iOff;
2de00 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
2de10 75 6e 63 74 69 6f 6e 20 69 73 20 70 61 72 74 20  unction is part 
2de20 6f 66 20 74 68 65 20 66 74 73 35 5f 64 65 63 6f  of the fts5_deco
2de30 64 65 28 29 20 64 65 62 75 67 67 69 6e 67 20 66  de() debugging f
2de40 75 6e 63 74 69 6f 6e 2e 20 49 74 20 69 73 20 0a  unction. It is .
2de50 2a 2a 20 6f 6e 6c 79 20 65 76 65 72 20 75 73 65  ** only ever use
2de60 64 20 77 69 74 68 20 64 65 74 61 69 6c 3d 6e 6f  d with detail=no
2de70 6e 65 20 74 61 62 6c 65 73 2e 0a 2a 2a 0a 2a 2a  ne tables..**.**
2de80 20 42 75 66 66 65 72 20 28 70 44 61 74 61 2f 6e   Buffer (pData/n
2de90 44 61 74 61 29 20 63 6f 6e 74 61 69 6e 73 20 61  Data) contains a
2dea0 20 64 6f 63 6c 69 73 74 20 69 6e 20 74 68 65 20   doclist in the 
2deb0 66 6f 72 6d 61 74 20 75 73 65 64 20 62 79 20 64  format used by d
2dec0 65 74 61 69 6c 3d 6e 6f 6e 65 0a 2a 2a 20 74 61  etail=none.** ta
2ded0 62 6c 65 73 2e 20 54 68 69 73 20 66 75 6e 63 74  bles. This funct
2dee0 69 6f 6e 20 61 70 70 65 6e 64 73 20 61 20 68 75  ion appends a hu
2def0 6d 61 6e 2d 72 65 61 64 61 62 6c 65 20 76 65 72  man-readable ver
2df00 73 69 6f 6e 20 6f 66 20 74 68 61 74 20 6c 69 73  sion of that lis
2df10 74 20 74 6f 0a 2a 2a 20 62 75 66 66 65 72 20 70  t to.** buffer p
2df20 42 75 66 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 2a 70  Buf..**.** If *p
2df30 52 63 20 69 73 20 6f 74 68 65 72 20 74 68 61 6e  Rc is other than
2df40 20 53 51 4c 49 54 45 5f 4f 4b 20 77 68 65 6e 20   SQLITE_OK when 
2df50 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
2df60 20 63 61 6c 6c 65 64 2c 20 69 74 20 69 73 20 61   called, it is a
2df70 0a 2a 2a 20 6e 6f 2d 6f 70 2e 20 49 66 20 61 6e  .** no-op. If an
2df80 20 4f 4f 4d 20 6f 72 20 6f 74 68 65 72 20 65 72   OOM or other er
2df90 72 6f 72 20 6f 63 63 75 72 73 20 77 69 74 68 69  ror occurs withi
2dfa0 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c  n this function,
2dfb0 20 2a 70 52 63 20 69 73 0a 2a 2a 20 73 65 74 20   *pRc is.** set 
2dfc0 74 6f 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72  to an SQLite err
2dfd0 6f 72 20 63 6f 64 65 20 62 65 66 6f 72 65 20 72  or code before r
2dfe0 65 74 75 72 6e 69 6e 67 2e 20 54 68 65 20 66 69  eturning. The fi
2dff0 6e 61 6c 20 73 74 61 74 65 20 6f 66 20 62 75 66  nal state of buf
2e000 66 65 72 0a 2a 2a 20 70 42 75 66 20 69 73 20 75  fer.** pBuf is u
2e010 6e 64 65 66 69 6e 65 64 20 69 6e 20 74 68 69 73  ndefined in this
2e020 20 63 61 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   case..*/.static
2e030 20 76 6f 69 64 20 66 74 73 35 44 65 63 6f 64 65   void fts5Decode
2e040 52 6f 77 69 64 4c 69 73 74 28 0a 20 20 69 6e 74  RowidList(.  int
2e050 20 2a 70 52 63 2c 20 20 20 20 20 20 20 20 20 20   *pRc,          
2e060 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2e070 49 4e 2f 4f 55 54 3a 20 45 72 72 6f 72 20 63 6f  IN/OUT: Error co
2e080 64 65 20 2a 2f 0a 20 20 46 74 73 35 42 75 66 66  de */.  Fts5Buff
2e090 65 72 20 2a 70 42 75 66 2c 20 20 20 20 20 20 20  er *pBuf,       
2e0a0 20 20 20 20 20 20 20 20 2f 2a 20 42 75 66 66 65          /* Buffe
2e0b0 72 20 74 6f 20 61 70 70 65 6e 64 20 74 65 78 74  r to append text
2e0c0 20 74 6f 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 75   to */.  const u
2e0d0 38 20 2a 70 44 61 74 61 2c 20 69 6e 74 20 6e 44  8 *pData, int nD
2e0e0 61 74 61 20 20 20 20 20 20 2f 2a 20 44 61 74 61  ata      /* Data
2e0f0 20 74 6f 20 64 65 63 6f 64 65 20 6c 69 73 74 2d   to decode list-
2e100 6f 66 2d 72 6f 77 69 64 73 20 66 72 6f 6d 20 2a  of-rowids from *
2e110 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 20 3d 20 30  /.){.  int i = 0
2e120 3b 0a 20 20 69 36 34 20 69 52 6f 77 69 64 20 3d  ;.  i64 iRowid =
2e130 20 30 3b 0a 0a 20 20 77 68 69 6c 65 28 20 69 3c   0;..  while( i<
2e140 6e 44 61 74 61 20 29 7b 0a 20 20 20 20 63 6f 6e  nData ){.    con
2e150 73 74 20 63 68 61 72 20 2a 7a 41 70 70 20 3d 20  st char *zApp = 
2e160 22 22 3b 0a 20 20 20 20 75 36 34 20 69 56 61 6c  "";.    u64 iVal
2e170 3b 0a 20 20 20 20 69 20 2b 3d 20 73 71 6c 69 74  ;.    i += sqlit
2e180 65 33 46 74 73 35 47 65 74 56 61 72 69 6e 74 28  e3Fts5GetVarint(
2e190 26 70 44 61 74 61 5b 69 5d 2c 20 26 69 56 61 6c  &pData[i], &iVal
2e1a0 29 3b 0a 20 20 20 20 69 52 6f 77 69 64 20 2b 3d  );.    iRowid +=
2e1b0 20 69 56 61 6c 3b 0a 0a 20 20 20 20 69 66 28 20   iVal;..    if( 
2e1c0 69 3c 6e 44 61 74 61 20 26 26 20 70 44 61 74 61  i<nData && pData
2e1d0 5b 69 5d 3d 3d 30 78 30 30 20 29 7b 0a 20 20 20  [i]==0x00 ){.   
2e1e0 20 20 20 69 2b 2b 3b 0a 20 20 20 20 20 20 69 66     i++;.      if
2e1f0 28 20 69 3c 6e 44 61 74 61 20 26 26 20 70 44 61  ( i<nData && pDa
2e200 74 61 5b 69 5d 3d 3d 30 78 30 30 20 29 7b 0a 20  ta[i]==0x00 ){. 
2e210 20 20 20 20 20 20 20 69 2b 2b 3b 0a 20 20 20 20         i++;.    
2e220 20 20 20 20 7a 41 70 70 20 3d 20 22 2b 22 3b 0a      zApp = "+";.
2e230 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
2e240 20 20 20 20 20 7a 41 70 70 20 3d 20 22 2a 22 3b       zApp = "*";
2e250 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
2e260 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 42      sqlite3Fts5B
2e270 75 66 66 65 72 41 70 70 65 6e 64 50 72 69 6e 74  ufferAppendPrint
2e280 66 28 70 52 63 2c 20 70 42 75 66 2c 20 22 20 25  f(pRc, pBuf, " %
2e290 6c 6c 64 25 73 22 2c 20 69 52 6f 77 69 64 2c 20  lld%s", iRowid, 
2e2a0 7a 41 70 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  zApp);.  }.}../*
2e2b0 0a 2a 2a 20 54 68 65 20 69 6d 70 6c 65 6d 65 6e  .** The implemen
2e2c0 74 61 74 69 6f 6e 20 6f 66 20 75 73 65 72 2d 64  tation of user-d
2e2d0 65 66 69 6e 65 64 20 73 63 61 6c 61 72 20 66 75  efined scalar fu
2e2e0 6e 63 74 69 6f 6e 20 66 74 73 35 5f 64 65 63 6f  nction fts5_deco
2e2f0 64 65 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  de()..*/.static 
2e300 76 6f 69 64 20 66 74 73 35 44 65 63 6f 64 65 46  void fts5DecodeF
2e310 75 6e 63 74 69 6f 6e 28 0a 20 20 73 71 6c 69 74  unction(.  sqlit
2e320 65 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74 78  e3_context *pCtx
2e330 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 75  ,          /* Fu
2e340 6e 63 74 69 6f 6e 20 63 61 6c 6c 20 63 6f 6e 74  nction call cont
2e350 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 41 72  ext */.  int nAr
2e360 67 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  g,              
2e370 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
2e380 65 72 20 6f 66 20 61 72 67 73 20 28 61 6c 77 61  er of args (alwa
2e390 79 73 20 32 29 20 2a 2f 0a 20 20 73 71 6c 69 74  ys 2) */.  sqlit
2e3a0 65 33 5f 76 61 6c 75 65 20 2a 2a 61 70 56 61 6c  e3_value **apVal
2e3b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 75             /* Fu
2e3c0 6e 63 74 69 6f 6e 20 61 72 67 75 6d 65 6e 74 73  nction arguments
2e3d0 20 2a 2f 0a 29 7b 0a 20 20 69 36 34 20 69 52 6f   */.){.  i64 iRo
2e3e0 77 69 64 3b 20 20 20 20 20 20 20 20 20 20 20 20  wid;            
2e3f0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 77 69           /* Rowi
2e400 64 20 66 6f 72 20 72 65 63 6f 72 64 20 62 65 69  d for record bei
2e410 6e 67 20 64 65 63 6f 64 65 64 20 2a 2f 0a 20 20  ng decoded */.  
2e420 69 6e 74 20 69 53 65 67 69 64 2c 69 48 65 69 67  int iSegid,iHeig
2e430 68 74 2c 69 50 67 6e 6f 2c 62 44 6c 69 64 78 3b  ht,iPgno,bDlidx;
2e440 2f 2a 20 52 6f 77 69 64 20 63 6f 6d 70 6f 6e 65  /* Rowid compone
2e450 6e 74 73 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 75  nts */.  const u
2e460 38 20 2a 61 42 6c 6f 62 3b 20 69 6e 74 20 6e 3b  8 *aBlob; int n;
2e470 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 63 6f           /* Reco
2e480 72 64 20 74 6f 20 64 65 63 6f 64 65 20 2a 2f 0a  rd to decode */.
2e490 20 20 75 38 20 2a 61 20 3d 20 30 3b 0a 20 20 46    u8 *a = 0;.  F
2e4a0 74 73 35 42 75 66 66 65 72 20 73 3b 20 20 20 20  ts5Buffer s;    
2e4b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2e4c0 2a 20 42 75 69 6c 64 20 75 70 20 74 65 78 74 20  * Build up text 
2e4d0 74 6f 20 72 65 74 75 72 6e 20 68 65 72 65 20 2a  to return here *
2e4e0 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  /.  int rc = SQL
2e4f0 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20  ITE_OK;         
2e500 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
2e510 64 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 70 61  de */.  int nSpa
2e520 63 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20 65 44  ce = 0;.  int eD
2e530 65 74 61 69 6c 4e 6f 6e 65 20 3d 20 28 73 71 6c  etailNone = (sql
2e540 69 74 65 33 5f 75 73 65 72 5f 64 61 74 61 28 70  ite3_user_data(p
2e550 43 74 78 29 21 3d 30 29 3b 0a 0a 20 20 61 73 73  Ctx)!=0);..  ass
2e560 65 72 74 28 20 6e 41 72 67 3d 3d 32 20 29 3b 0a  ert( nArg==2 );.
2e570 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 28 6e    UNUSED_PARAM(n
2e580 41 72 67 29 3b 0a 20 20 6d 65 6d 73 65 74 28 26  Arg);.  memset(&
2e590 73 2c 20 30 2c 20 73 69 7a 65 6f 66 28 46 74 73  s, 0, sizeof(Fts
2e5a0 35 42 75 66 66 65 72 29 29 3b 0a 20 20 69 52 6f  5Buffer));.  iRo
2e5b0 77 69 64 20 3d 20 73 71 6c 69 74 65 33 5f 76 61  wid = sqlite3_va
2e5c0 6c 75 65 5f 69 6e 74 36 34 28 61 70 56 61 6c 5b  lue_int64(apVal[
2e5d0 30 5d 29 3b 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20  0]);..  /* Make 
2e5e0 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 73 65  a copy of the se
2e5f0 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 28 61  cond argument (a
2e600 20 62 6c 6f 62 29 20 69 6e 20 61 42 6c 6f 62 5b   blob) in aBlob[
2e610 5d 2e 20 54 68 65 20 61 42 6c 6f 62 5b 5d 0a 20  ]. The aBlob[]. 
2e620 20 2a 2a 20 63 6f 70 79 20 69 73 20 66 6f 6c 6c   ** copy is foll
2e630 6f 77 65 64 20 62 79 20 46 54 53 35 5f 44 41 54  owed by FTS5_DAT
2e640 41 5f 5a 45 52 4f 5f 50 41 44 44 49 4e 47 20 30  A_ZERO_PADDING 0
2e650 78 30 30 20 62 79 74 65 73 2c 20 77 68 69 63 68  x00 bytes, which
2e660 20 70 72 65 76 65 6e 74 73 0a 20 20 2a 2a 20 62   prevents.  ** b
2e670 75 66 66 65 72 20 6f 76 65 72 72 65 61 64 73 20  uffer overreads 
2e680 65 76 65 6e 20 69 66 20 74 68 65 20 72 65 63 6f  even if the reco
2e690 72 64 20 69 73 20 63 6f 72 72 75 70 74 2e 20 20  rd is corrupt.  
2e6a0 2a 2f 0a 20 20 6e 20 3d 20 73 71 6c 69 74 65 33  */.  n = sqlite3
2e6b0 5f 76 61 6c 75 65 5f 62 79 74 65 73 28 61 70 56  _value_bytes(apV
2e6c0 61 6c 5b 31 5d 29 3b 0a 20 20 61 42 6c 6f 62 20  al[1]);.  aBlob 
2e6d0 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  = sqlite3_value_
2e6e0 62 6c 6f 62 28 61 70 56 61 6c 5b 31 5d 29 3b 0a  blob(apVal[1]);.
2e6f0 20 20 6e 53 70 61 63 65 20 3d 20 6e 20 2b 20 46    nSpace = n + F
2e700 54 53 35 5f 44 41 54 41 5f 5a 45 52 4f 5f 50 41  TS5_DATA_ZERO_PA
2e710 44 44 49 4e 47 3b 0a 20 20 61 20 3d 20 28 75 38  DDING;.  a = (u8
2e720 2a 29 73 71 6c 69 74 65 33 46 74 73 35 4d 61 6c  *)sqlite3Fts5Mal
2e730 6c 6f 63 5a 65 72 6f 28 26 72 63 2c 20 6e 53 70  locZero(&rc, nSp
2e740 61 63 65 29 3b 0a 20 20 69 66 28 20 61 3d 3d 30  ace);.  if( a==0
2e750 20 29 20 67 6f 74 6f 20 64 65 63 6f 64 65 5f 6f   ) goto decode_o
2e760 75 74 3b 0a 20 20 6d 65 6d 63 70 79 28 61 2c 20  ut;.  memcpy(a, 
2e770 61 42 6c 6f 62 2c 20 6e 29 3b 0a 0a 0a 20 20 66  aBlob, n);...  f
2e780 74 73 35 44 65 63 6f 64 65 52 6f 77 69 64 28 69  ts5DecodeRowid(i
2e790 52 6f 77 69 64 2c 20 26 69 53 65 67 69 64 2c 20  Rowid, &iSegid, 
2e7a0 26 62 44 6c 69 64 78 2c 20 26 69 48 65 69 67 68  &bDlidx, &iHeigh
2e7b0 74 2c 20 26 69 50 67 6e 6f 29 3b 0a 0a 20 20 66  t, &iPgno);..  f
2e7c0 74 73 35 44 65 62 75 67 52 6f 77 69 64 28 26 72  ts5DebugRowid(&r
2e7d0 63 2c 20 26 73 2c 20 69 52 6f 77 69 64 29 3b 0a  c, &s, iRowid);.
2e7e0 20 20 69 66 28 20 62 44 6c 69 64 78 20 29 7b 0a    if( bDlidx ){.
2e7f0 20 20 20 20 46 74 73 35 44 61 74 61 20 64 6c 69      Fts5Data dli
2e800 64 78 3b 0a 20 20 20 20 46 74 73 35 44 6c 69 64  dx;.    Fts5Dlid
2e810 78 4c 76 6c 20 6c 76 6c 3b 0a 0a 20 20 20 20 64  xLvl lvl;..    d
2e820 6c 69 64 78 2e 70 20 3d 20 61 3b 0a 20 20 20 20  lidx.p = a;.    
2e830 64 6c 69 64 78 2e 6e 6e 20 3d 20 6e 3b 0a 0a 20  dlidx.nn = n;.. 
2e840 20 20 20 6d 65 6d 73 65 74 28 26 6c 76 6c 2c 20     memset(&lvl, 
2e850 30 2c 20 73 69 7a 65 6f 66 28 46 74 73 35 44 6c  0, sizeof(Fts5Dl
2e860 69 64 78 4c 76 6c 29 29 3b 0a 20 20 20 20 6c 76  idxLvl));.    lv
2e870 6c 2e 70 44 61 74 61 20 3d 20 26 64 6c 69 64 78  l.pData = &dlidx
2e880 3b 0a 20 20 20 20 6c 76 6c 2e 69 4c 65 61 66 50  ;.    lvl.iLeafP
2e890 67 6e 6f 20 3d 20 69 50 67 6e 6f 3b 0a 0a 20 20  gno = iPgno;..  
2e8a0 20 20 66 6f 72 28 66 74 73 35 44 6c 69 64 78 4c    for(fts5DlidxL
2e8b0 76 6c 4e 65 78 74 28 26 6c 76 6c 29 3b 20 6c 76  vlNext(&lvl); lv
2e8c0 6c 2e 62 45 6f 66 3d 3d 30 3b 20 66 74 73 35 44  l.bEof==0; fts5D
2e8d0 6c 69 64 78 4c 76 6c 4e 65 78 74 28 26 6c 76 6c  lidxLvlNext(&lvl
2e8e0 29 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  )){.      sqlite
2e8f0 33 46 74 73 35 42 75 66 66 65 72 41 70 70 65 6e  3Fts5BufferAppen
2e900 64 50 72 69 6e 74 66 28 26 72 63 2c 20 26 73 2c  dPrintf(&rc, &s,
2e910 20 0a 20 20 20 20 20 20 20 20 20 20 22 20 25 64   .          " %d
2e920 28 25 6c 6c 64 29 22 2c 20 6c 76 6c 2e 69 4c 65  (%lld)", lvl.iLe
2e930 61 66 50 67 6e 6f 2c 20 6c 76 6c 2e 69 52 6f 77  afPgno, lvl.iRow
2e940 69 64 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20  id.      );.    
2e950 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 69 53  }.  }else if( iS
2e960 65 67 69 64 3d 3d 30 20 29 7b 0a 20 20 20 20 69  egid==0 ){.    i
2e970 66 28 20 69 52 6f 77 69 64 3d 3d 46 54 53 35 5f  f( iRowid==FTS5_
2e980 41 56 45 52 41 47 45 53 5f 52 4f 57 49 44 20 29  AVERAGES_ROWID )
2e990 7b 0a 20 20 20 20 20 20 66 74 73 35 44 65 63 6f  {.      fts5Deco
2e9a0 64 65 41 76 65 72 61 67 65 73 28 26 72 63 2c 20  deAverages(&rc, 
2e9b0 26 73 2c 20 61 2c 20 6e 29 3b 0a 20 20 20 20 7d  &s, a, n);.    }
2e9c0 65 6c 73 65 7b 0a 20 20 20 20 20 20 66 74 73 35  else{.      fts5
2e9d0 44 65 63 6f 64 65 53 74 72 75 63 74 75 72 65 28  DecodeStructure(
2e9e0 26 72 63 2c 20 26 73 2c 20 61 2c 20 6e 29 3b 0a  &rc, &s, a, n);.
2e9f0 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66      }.  }else if
2ea00 28 20 65 44 65 74 61 69 6c 4e 6f 6e 65 20 29 7b  ( eDetailNone ){
2ea10 0a 20 20 20 20 46 74 73 35 42 75 66 66 65 72 20  .    Fts5Buffer 
2ea20 74 65 72 6d 3b 20 20 20 20 20 20 20 20 20 20 20  term;           
2ea30 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 74 65     /* Current te
2ea40 72 6d 20 72 65 61 64 20 66 72 6f 6d 20 70 61 67  rm read from pag
2ea50 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 73 7a 4c  e */.    int szL
2ea60 65 61 66 3b 0a 20 20 20 20 69 6e 74 20 69 50 67  eaf;.    int iPg
2ea70 69 64 78 4f 66 66 20 3d 20 73 7a 4c 65 61 66 20  idxOff = szLeaf 
2ea80 3d 20 66 74 73 35 47 65 74 55 31 36 28 26 61 5b  = fts5GetU16(&a[
2ea90 32 5d 29 3b 0a 20 20 20 20 69 6e 74 20 69 54 65  2]);.    int iTe
2eaa0 72 6d 4f 66 66 3b 0a 20 20 20 20 69 6e 74 20 6e  rmOff;.    int n
2eab0 4b 65 65 70 20 3d 20 30 3b 0a 20 20 20 20 69 6e  Keep = 0;.    in
2eac0 74 20 69 4f 66 66 3b 0a 0a 20 20 20 20 6d 65 6d  t iOff;..    mem
2ead0 73 65 74 28 26 74 65 72 6d 2c 20 30 2c 20 73 69  set(&term, 0, si
2eae0 7a 65 6f 66 28 46 74 73 35 42 75 66 66 65 72 29  zeof(Fts5Buffer)
2eaf0 29 3b 0a 0a 20 20 20 20 2f 2a 20 44 65 63 6f 64  );..    /* Decod
2eb00 65 20 61 6e 79 20 65 6e 74 72 69 65 73 20 74 68  e any entries th
2eb10 61 74 20 6f 63 63 75 72 20 62 65 66 6f 72 65 20  at occur before 
2eb20 74 68 65 20 66 69 72 73 74 20 74 65 72 6d 2e 20  the first term. 
2eb30 2a 2f 0a 20 20 20 20 69 66 28 20 73 7a 4c 65 61  */.    if( szLea
2eb40 66 3c 6e 20 29 7b 0a 20 20 20 20 20 20 69 50 67  f<n ){.      iPg
2eb50 69 64 78 4f 66 66 20 2b 3d 20 66 74 73 35 47 65  idxOff += fts5Ge
2eb60 74 56 61 72 69 6e 74 33 32 28 26 61 5b 69 50 67  tVarint32(&a[iPg
2eb70 69 64 78 4f 66 66 5d 2c 20 69 54 65 72 6d 4f 66  idxOff], iTermOf
2eb80 66 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  f);.    }else{. 
2eb90 20 20 20 20 20 69 54 65 72 6d 4f 66 66 20 3d 20       iTermOff = 
2eba0 73 7a 4c 65 61 66 3b 0a 20 20 20 20 7d 0a 20 20  szLeaf;.    }.  
2ebb0 20 20 66 74 73 35 44 65 63 6f 64 65 52 6f 77 69    fts5DecodeRowi
2ebc0 64 4c 69 73 74 28 26 72 63 2c 20 26 73 2c 20 26  dList(&rc, &s, &
2ebd0 61 5b 34 5d 2c 20 69 54 65 72 6d 4f 66 66 2d 34  a[4], iTermOff-4
2ebe0 29 3b 0a 0a 20 20 20 20 69 4f 66 66 20 3d 20 69  );..    iOff = i
2ebf0 54 65 72 6d 4f 66 66 3b 0a 20 20 20 20 77 68 69  TermOff;.    whi
2ec00 6c 65 28 20 69 4f 66 66 3c 73 7a 4c 65 61 66 20  le( iOff<szLeaf 
2ec10 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 41 70  ){.      int nAp
2ec20 70 65 6e 64 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  pend;..      /* 
2ec30 52 65 61 64 20 74 68 65 20 74 65 72 6d 20 64 61  Read the term da
2ec40 74 61 20 66 6f 72 20 74 68 65 20 6e 65 78 74 20  ta for the next 
2ec50 74 65 72 6d 2a 2f 0a 20 20 20 20 20 20 69 4f 66  term*/.      iOf
2ec60 66 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69  f += fts5GetVari
2ec70 6e 74 33 32 28 26 61 5b 69 4f 66 66 5d 2c 20 6e  nt32(&a[iOff], n
2ec80 41 70 70 65 6e 64 29 3b 0a 20 20 20 20 20 20 74  Append);.      t
2ec90 65 72 6d 2e 6e 20 3d 20 6e 4b 65 65 70 3b 0a 20  erm.n = nKeep;. 
2eca0 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72 41       fts5BufferA
2ecb0 70 70 65 6e 64 42 6c 6f 62 28 26 72 63 2c 20 26  ppendBlob(&rc, &
2ecc0 74 65 72 6d 2c 20 6e 41 70 70 65 6e 64 2c 20 26  term, nAppend, &
2ecd0 61 5b 69 4f 66 66 5d 29 3b 0a 20 20 20 20 20 20  a[iOff]);.      
2ece0 73 71 6c 69 74 65 33 46 74 73 35 42 75 66 66 65  sqlite3Fts5Buffe
2ecf0 72 41 70 70 65 6e 64 50 72 69 6e 74 66 28 0a 20  rAppendPrintf(. 
2ed00 20 20 20 20 20 20 20 20 20 26 72 63 2c 20 26 73           &rc, &s
2ed10 2c 20 22 20 74 65 72 6d 3d 25 2e 2a 73 22 2c 20  , " term=%.*s", 
2ed20 74 65 72 6d 2e 6e 2c 20 28 63 6f 6e 73 74 20 63  term.n, (const c
2ed30 68 61 72 2a 29 74 65 72 6d 2e 70 0a 20 20 20 20  har*)term.p.    
2ed40 20 20 29 3b 0a 20 20 20 20 20 20 69 4f 66 66 20    );.      iOff 
2ed50 2b 3d 20 6e 41 70 70 65 6e 64 3b 0a 0a 20 20 20  += nAppend;..   
2ed60 20 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74     /* Figure out
2ed70 20 77 68 65 72 65 20 74 68 65 20 64 6f 63 6c 69   where the docli
2ed80 73 74 20 66 6f 72 20 74 68 69 73 20 74 65 72 6d  st for this term
2ed90 20 65 6e 64 73 20 2a 2f 0a 20 20 20 20 20 20 69   ends */.      i
2eda0 66 28 20 69 50 67 69 64 78 4f 66 66 3c 6e 20 29  f( iPgidxOff<n )
2edb0 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 49  {.        int nI
2edc0 6e 63 72 3b 0a 20 20 20 20 20 20 20 20 69 50 67  ncr;.        iPg
2edd0 69 64 78 4f 66 66 20 2b 3d 20 66 74 73 35 47 65  idxOff += fts5Ge
2ede0 74 56 61 72 69 6e 74 33 32 28 26 61 5b 69 50 67  tVarint32(&a[iPg
2edf0 69 64 78 4f 66 66 5d 2c 20 6e 49 6e 63 72 29 3b  idxOff], nIncr);
2ee00 0a 20 20 20 20 20 20 20 20 69 54 65 72 6d 4f 66  .        iTermOf
2ee10 66 20 2b 3d 20 6e 49 6e 63 72 3b 0a 20 20 20 20  f += nIncr;.    
2ee20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
2ee30 20 69 54 65 72 6d 4f 66 66 20 3d 20 73 7a 4c 65   iTermOff = szLe
2ee40 61 66 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  af;.      }..   
2ee50 20 20 20 66 74 73 35 44 65 63 6f 64 65 52 6f 77     fts5DecodeRow
2ee60 69 64 4c 69 73 74 28 26 72 63 2c 20 26 73 2c 20  idList(&rc, &s, 
2ee70 26 61 5b 69 4f 66 66 5d 2c 20 69 54 65 72 6d 4f  &a[iOff], iTermO
2ee80 66 66 2d 69 4f 66 66 29 3b 0a 20 20 20 20 20 20  ff-iOff);.      
2ee90 69 4f 66 66 20 3d 20 69 54 65 72 6d 4f 66 66 3b  iOff = iTermOff;
2eea0 0a 20 20 20 20 20 20 69 66 28 20 69 4f 66 66 3c  .      if( iOff<
2eeb0 73 7a 4c 65 61 66 20 29 7b 0a 20 20 20 20 20 20  szLeaf ){.      
2eec0 20 20 69 4f 66 66 20 2b 3d 20 66 74 73 35 47 65    iOff += fts5Ge
2eed0 74 56 61 72 69 6e 74 33 32 28 26 61 5b 69 4f 66  tVarint32(&a[iOf
2eee0 66 5d 2c 20 6e 4b 65 65 70 29 3b 0a 20 20 20 20  f], nKeep);.    
2eef0 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 66    }.    }..    f
2ef00 74 73 35 42 75 66 66 65 72 46 72 65 65 28 26 74  ts5BufferFree(&t
2ef10 65 72 6d 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  erm);.  }else{. 
2ef20 20 20 20 46 74 73 35 42 75 66 66 65 72 20 74 65     Fts5Buffer te
2ef30 72 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rm;             
2ef40 20 2f 2a 20 43 75 72 72 65 6e 74 20 74 65 72 6d   /* Current term
2ef50 20 72 65 61 64 20 66 72 6f 6d 20 70 61 67 65 20   read from page 
2ef60 2a 2f 0a 20 20 20 20 69 6e 74 20 73 7a 4c 65 61  */.    int szLea
2ef70 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  f;              
2ef80 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f       /* Offset o
2ef90 66 20 70 67 69 64 78 20 69 6e 20 61 5b 5d 20 2a  f pgidx in a[] *
2efa0 2f 0a 20 20 20 20 69 6e 74 20 69 50 67 69 64 78  /.    int iPgidx
2efb0 4f 66 66 3b 0a 20 20 20 20 69 6e 74 20 69 50 67  Off;.    int iPg
2efc0 69 64 78 50 72 65 76 20 3d 20 30 3b 20 20 20 20  idxPrev = 0;    
2efd0 20 20 20 20 20 20 20 2f 2a 20 50 72 65 76 69 6f         /* Previo
2efe0 75 73 20 76 61 6c 75 65 20 72 65 61 64 20 66 72  us value read fr
2eff0 6f 6d 20 70 67 69 64 78 20 2a 2f 0a 20 20 20 20  om pgidx */.    
2f000 69 6e 74 20 69 54 65 72 6d 4f 66 66 20 3d 20 30  int iTermOff = 0
2f010 3b 0a 20 20 20 20 69 6e 74 20 69 52 6f 77 69 64  ;.    int iRowid
2f020 4f 66 66 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74  Off = 0;.    int
2f030 20 69 4f 66 66 3b 0a 20 20 20 20 69 6e 74 20 6e   iOff;.    int n
2f040 44 6f 63 6c 69 73 74 3b 0a 0a 20 20 20 20 6d 65  Doclist;..    me
2f050 6d 73 65 74 28 26 74 65 72 6d 2c 20 30 2c 20 73  mset(&term, 0, s
2f060 69 7a 65 6f 66 28 46 74 73 35 42 75 66 66 65 72  izeof(Fts5Buffer
2f070 29 29 3b 0a 0a 20 20 20 20 69 66 28 20 6e 3c 34  ));..    if( n<4
2f080 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
2f090 33 46 74 73 35 42 75 66 66 65 72 53 65 74 28 26  3Fts5BufferSet(&
2f0a0 72 63 2c 20 26 73 2c 20 37 2c 20 28 63 6f 6e 73  rc, &s, 7, (cons
2f0b0 74 20 75 38 2a 29 22 63 6f 72 72 75 70 74 22 29  t u8*)"corrupt")
2f0c0 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 64 65 63  ;.      goto dec
2f0d0 6f 64 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 65 6c  ode_out;.    }el
2f0e0 73 65 7b 0a 20 20 20 20 20 20 69 52 6f 77 69 64  se{.      iRowid
2f0f0 4f 66 66 20 3d 20 66 74 73 35 47 65 74 55 31 36  Off = fts5GetU16
2f100 28 26 61 5b 30 5d 29 3b 0a 20 20 20 20 20 20 69  (&a[0]);.      i
2f110 50 67 69 64 78 4f 66 66 20 3d 20 73 7a 4c 65 61  PgidxOff = szLea
2f120 66 20 3d 20 66 74 73 35 47 65 74 55 31 36 28 26  f = fts5GetU16(&
2f130 61 5b 32 5d 29 3b 0a 20 20 20 20 20 20 69 66 28  a[2]);.      if(
2f140 20 69 50 67 69 64 78 4f 66 66 3c 6e 20 29 7b 0a   iPgidxOff<n ){.
2f150 20 20 20 20 20 20 20 20 66 74 73 35 47 65 74 56          fts5GetV
2f160 61 72 69 6e 74 33 32 28 26 61 5b 69 50 67 69 64  arint32(&a[iPgid
2f170 78 4f 66 66 5d 2c 20 69 54 65 72 6d 4f 66 66 29  xOff], iTermOff)
2f180 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
2f190 0a 20 20 20 20 2f 2a 20 44 65 63 6f 64 65 20 74  .    /* Decode t
2f1a0 68 65 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74  he position list
2f1b0 20 74 61 69 6c 20 61 74 20 74 68 65 20 73 74 61   tail at the sta
2f1c0 72 74 20 6f 66 20 74 68 65 20 70 61 67 65 20 2a  rt of the page *
2f1d0 2f 0a 20 20 20 20 69 66 28 20 69 52 6f 77 69 64  /.    if( iRowid
2f1e0 4f 66 66 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  Off!=0 ){.      
2f1f0 69 4f 66 66 20 3d 20 69 52 6f 77 69 64 4f 66 66  iOff = iRowidOff
2f200 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
2f210 69 54 65 72 6d 4f 66 66 21 3d 30 20 29 7b 0a 20  iTermOff!=0 ){. 
2f220 20 20 20 20 20 69 4f 66 66 20 3d 20 69 54 65 72       iOff = iTer
2f230 6d 4f 66 66 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  mOff;.    }else{
2f240 0a 20 20 20 20 20 20 69 4f 66 66 20 3d 20 73 7a  .      iOff = sz
2f250 4c 65 61 66 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Leaf;.    }.    
2f260 66 74 73 35 44 65 63 6f 64 65 50 6f 73 6c 69 73  fts5DecodePoslis
2f270 74 28 26 72 63 2c 20 26 73 2c 20 26 61 5b 34 5d  t(&rc, &s, &a[4]
2f280 2c 20 69 4f 66 66 2d 34 29 3b 0a 0a 20 20 20 20  , iOff-4);..    
2f290 2f 2a 20 44 65 63 6f 64 65 20 61 6e 79 20 6d 6f  /* Decode any mo
2f2a0 72 65 20 64 6f 63 6c 69 73 74 20 64 61 74 61 20  re doclist data 
2f2b0 74 68 61 74 20 61 70 70 65 61 72 73 20 6f 6e 20  that appears on 
2f2c0 74 68 65 20 70 61 67 65 20 62 65 66 6f 72 65 20  the page before 
2f2d0 74 68 65 0a 20 20 20 20 2a 2a 20 66 69 72 73 74  the.    ** first
2f2e0 20 74 65 72 6d 2e 20 2a 2f 0a 20 20 20 20 6e 44   term. */.    nD
2f2f0 6f 63 6c 69 73 74 20 3d 20 28 69 54 65 72 6d 4f  oclist = (iTermO
2f300 66 66 20 3f 20 69 54 65 72 6d 4f 66 66 20 3a 20  ff ? iTermOff : 
2f310 73 7a 4c 65 61 66 29 20 2d 20 69 4f 66 66 3b 0a  szLeaf) - iOff;.
2f320 20 20 20 20 66 74 73 35 44 65 63 6f 64 65 44 6f      fts5DecodeDo
2f330 63 6c 69 73 74 28 26 72 63 2c 20 26 73 2c 20 26  clist(&rc, &s, &
2f340 61 5b 69 4f 66 66 5d 2c 20 6e 44 6f 63 6c 69 73  a[iOff], nDoclis
2f350 74 29 3b 0a 0a 20 20 20 20 77 68 69 6c 65 28 20  t);..    while( 
2f360 69 50 67 69 64 78 4f 66 66 3c 6e 20 29 7b 0a 20  iPgidxOff<n ){. 
2f370 20 20 20 20 20 69 6e 74 20 62 46 69 72 73 74 20       int bFirst 
2f380 3d 20 28 69 50 67 69 64 78 4f 66 66 3d 3d 73 7a  = (iPgidxOff==sz
2f390 4c 65 61 66 29 3b 20 20 20 20 20 2f 2a 20 54 72  Leaf);     /* Tr
2f3a0 75 65 20 66 6f 72 20 66 69 72 73 74 20 74 65 72  ue for first ter
2f3b0 6d 20 6f 6e 20 70 61 67 65 20 2a 2f 0a 20 20 20  m on page */.   
2f3c0 20 20 20 69 6e 74 20 6e 42 79 74 65 3b 20 20 20     int nByte;   
2f3d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f3e0 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65           /* Byte
2f3f0 73 20 6f 66 20 64 61 74 61 20 2a 2f 0a 20 20 20  s of data */.   
2f400 20 20 20 69 6e 74 20 69 45 6e 64 3b 0a 20 20 20     int iEnd;.   
2f410 20 20 20 0a 20 20 20 20 20 20 69 50 67 69 64 78     .      iPgidx
2f420 4f 66 66 20 2b 3d 20 66 74 73 35 47 65 74 56 61  Off += fts5GetVa
2f430 72 69 6e 74 33 32 28 26 61 5b 69 50 67 69 64 78  rint32(&a[iPgidx
2f440 4f 66 66 5d 2c 20 6e 42 79 74 65 29 3b 0a 20 20  Off], nByte);.  
2f450 20 20 20 20 69 50 67 69 64 78 50 72 65 76 20 2b      iPgidxPrev +
2f460 3d 20 6e 42 79 74 65 3b 0a 20 20 20 20 20 20 69  = nByte;.      i
2f470 4f 66 66 20 3d 20 69 50 67 69 64 78 50 72 65 76  Off = iPgidxPrev
2f480 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 69 50 67  ;..      if( iPg
2f490 69 64 78 4f 66 66 3c 6e 20 29 7b 0a 20 20 20 20  idxOff<n ){.    
2f4a0 20 20 20 20 66 74 73 35 47 65 74 56 61 72 69 6e      fts5GetVarin
2f4b0 74 33 32 28 26 61 5b 69 50 67 69 64 78 4f 66 66  t32(&a[iPgidxOff
2f4c0 5d 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20 20 20  ], nByte);.     
2f4d0 20 20 20 69 45 6e 64 20 3d 20 69 50 67 69 64 78     iEnd = iPgidx
2f4e0 50 72 65 76 20 2b 20 6e 42 79 74 65 3b 0a 20 20  Prev + nByte;.  
2f4f0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2f500 20 20 20 69 45 6e 64 20 3d 20 73 7a 4c 65 61 66     iEnd = szLeaf
2f510 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
2f520 20 69 66 28 20 62 46 69 72 73 74 3d 3d 30 20 29   if( bFirst==0 )
2f530 7b 0a 20 20 20 20 20 20 20 20 69 4f 66 66 20 2b  {.        iOff +
2f540 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e 74 33  = fts5GetVarint3
2f550 32 28 26 61 5b 69 4f 66 66 5d 2c 20 6e 42 79 74  2(&a[iOff], nByt
2f560 65 29 3b 0a 20 20 20 20 20 20 20 20 74 65 72 6d  e);.        term
2f570 2e 6e 20 3d 20 6e 42 79 74 65 3b 0a 20 20 20 20  .n = nByte;.    
2f580 20 20 7d 0a 20 20 20 20 20 20 69 4f 66 66 20 2b    }.      iOff +
2f590 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e 74 33  = fts5GetVarint3
2f5a0 32 28 26 61 5b 69 4f 66 66 5d 2c 20 6e 42 79 74  2(&a[iOff], nByt
2f5b0 65 29 3b 0a 20 20 20 20 20 20 66 74 73 35 42 75  e);.      fts5Bu
2f5c0 66 66 65 72 41 70 70 65 6e 64 42 6c 6f 62 28 26  fferAppendBlob(&
2f5d0 72 63 2c 20 26 74 65 72 6d 2c 20 6e 42 79 74 65  rc, &term, nByte
2f5e0 2c 20 26 61 5b 69 4f 66 66 5d 29 3b 0a 20 20 20  , &a[iOff]);.   
2f5f0 20 20 20 69 4f 66 66 20 2b 3d 20 6e 42 79 74 65     iOff += nByte
2f600 3b 0a 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ;..      sqlite3
2f610 46 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64  Fts5BufferAppend
2f620 50 72 69 6e 74 66 28 0a 20 20 20 20 20 20 20 20  Printf(.        
2f630 20 20 26 72 63 2c 20 26 73 2c 20 22 20 74 65 72    &rc, &s, " ter
2f640 6d 3d 25 2e 2a 73 22 2c 20 74 65 72 6d 2e 6e 2c  m=%.*s", term.n,
2f650 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 74 65   (const char*)te
2f660 72 6d 2e 70 0a 20 20 20 20 20 20 29 3b 0a 20 20  rm.p.      );.  
2f670 20 20 20 20 69 4f 66 66 20 2b 3d 20 66 74 73 35      iOff += fts5
2f680 44 65 63 6f 64 65 44 6f 63 6c 69 73 74 28 26 72  DecodeDoclist(&r
2f690 63 2c 20 26 73 2c 20 26 61 5b 69 4f 66 66 5d 2c  c, &s, &a[iOff],
2f6a0 20 69 45 6e 64 2d 69 4f 66 66 29 3b 0a 20 20 20   iEnd-iOff);.   
2f6b0 20 7d 0a 0a 20 20 20 20 66 74 73 35 42 75 66 66   }..    fts5Buff
2f6c0 65 72 46 72 65 65 28 26 74 65 72 6d 29 3b 0a 20  erFree(&term);. 
2f6d0 20 7d 0a 20 20 0a 20 64 65 63 6f 64 65 5f 6f 75   }.  . decode_ou
2f6e0 74 3a 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  t:.  sqlite3_fre
2f6f0 65 28 61 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  e(a);.  if( rc==
2f700 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2f710 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
2f720 74 65 78 74 28 70 43 74 78 2c 20 28 63 6f 6e 73  text(pCtx, (cons
2f730 74 20 63 68 61 72 2a 29 73 2e 70 2c 20 73 2e 6e  t char*)s.p, s.n
2f740 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45  , SQLITE_TRANSIE
2f750 4e 54 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  NT);.  }else{.  
2f760 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
2f770 5f 65 72 72 6f 72 5f 63 6f 64 65 28 70 43 74 78  _error_code(pCtx
2f780 2c 20 72 63 29 3b 0a 20 20 7d 0a 20 20 66 74 73  , rc);.  }.  fts
2f790 35 42 75 66 66 65 72 46 72 65 65 28 26 73 29 3b  5BufferFree(&s);
2f7a0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 69 6d  .}../*.** The im
2f7b0 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20  plementation of 
2f7c0 75 73 65 72 2d 64 65 66 69 6e 65 64 20 73 63 61  user-defined sca
2f7d0 6c 61 72 20 66 75 6e 63 74 69 6f 6e 20 66 74 73  lar function fts
2f7e0 35 5f 72 6f 77 69 64 28 29 2e 0a 2a 2f 0a 73 74  5_rowid()..*/.st
2f7f0 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 52 6f  atic void fts5Ro
2f800 77 69 64 46 75 6e 63 74 69 6f 6e 28 0a 20 20 73  widFunction(.  s
2f810 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a  qlite3_context *
2f820 70 43 74 78 2c 20 20 20 20 20 20 20 20 20 20 2f  pCtx,          /
2f830 2a 20 46 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 20  * Function call 
2f840 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74  context */.  int
2f850 20 6e 41 72 67 2c 20 20 20 20 20 20 20 20 20 20   nArg,          
2f860 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2f870 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 73 20 28  Number of args (
2f880 61 6c 77 61 79 73 20 32 29 20 2a 2f 0a 20 20 73  always 2) */.  s
2f890 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61  qlite3_value **a
2f8a0 70 56 61 6c 20 20 20 20 20 20 20 20 20 20 20 2f  pVal           /
2f8b0 2a 20 46 75 6e 63 74 69 6f 6e 20 61 72 67 75 6d  * Function argum
2f8c0 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e  ents */.){.  con
2f8d0 73 74 20 63 68 61 72 20 2a 7a 41 72 67 3b 0a 20  st char *zArg;. 
2f8e0 20 69 66 28 20 6e 41 72 67 3d 3d 30 20 29 7b 0a   if( nArg==0 ){.
2f8f0 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
2f900 6c 74 5f 65 72 72 6f 72 28 70 43 74 78 2c 20 22  lt_error(pCtx, "
2f910 73 68 6f 75 6c 64 20 62 65 3a 20 66 74 73 35 5f  should be: fts5_
2f920 72 6f 77 69 64 28 73 75 62 6a 65 63 74 2c 20 2e  rowid(subject, .
2f930 2e 2e 2e 29 22 2c 20 2d 31 29 3b 0a 20 20 7d 65  ...)", -1);.  }e
2f940 6c 73 65 7b 0a 20 20 20 20 7a 41 72 67 20 3d 20  lse{.    zArg = 
2f950 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c  (const char*)sql
2f960 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28  ite3_value_text(
2f970 61 70 56 61 6c 5b 30 5d 29 3b 0a 20 20 20 20 69  apVal[0]);.    i
2f980 66 28 20 30 3d 3d 73 71 6c 69 74 65 33 5f 73 74  f( 0==sqlite3_st
2f990 72 69 63 6d 70 28 7a 41 72 67 2c 20 22 73 65 67  ricmp(zArg, "seg
2f9a0 6d 65 6e 74 22 29 20 29 7b 0a 20 20 20 20 20 20  ment") ){.      
2f9b0 69 36 34 20 69 52 6f 77 69 64 3b 0a 20 20 20 20  i64 iRowid;.    
2f9c0 20 20 69 6e 74 20 73 65 67 69 64 2c 20 70 67 6e    int segid, pgn
2f9d0 6f 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 41 72  o;.      if( nAr
2f9e0 67 21 3d 33 20 29 7b 0a 20 20 20 20 20 20 20 20  g!=3 ){.        
2f9f0 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65  sqlite3_result_e
2fa00 72 72 6f 72 28 70 43 74 78 2c 20 0a 20 20 20 20  rror(pCtx, .    
2fa10 20 20 20 20 20 20 20 20 22 73 68 6f 75 6c 64 20          "should 
2fa20 62 65 3a 20 66 74 73 35 5f 72 6f 77 69 64 28 27  be: fts5_rowid('
2fa30 73 65 67 6d 65 6e 74 27 2c 20 73 65 67 69 64 2c  segment', segid,
2fa40 20 70 67 6e 6f 29 29 22 2c 20 2d 31 0a 20 20 20   pgno))", -1.   
2fa50 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 7d 65       );.      }e
2fa60 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 65 67  lse{.        seg
2fa70 69 64 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c  id = sqlite3_val
2fa80 75 65 5f 69 6e 74 28 61 70 56 61 6c 5b 31 5d 29  ue_int(apVal[1])
2fa90 3b 0a 20 20 20 20 20 20 20 20 70 67 6e 6f 20 3d  ;.        pgno =
2faa0 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69   sqlite3_value_i
2fab0 6e 74 28 61 70 56 61 6c 5b 32 5d 29 3b 0a 20 20  nt(apVal[2]);.  
2fac0 20 20 20 20 20 20 69 52 6f 77 69 64 20 3d 20 46        iRowid = F
2fad0 54 53 35 5f 53 45 47 4d 45 4e 54 5f 52 4f 57 49  TS5_SEGMENT_ROWI
2fae0 44 28 73 65 67 69 64 2c 20 70 67 6e 6f 29 3b 0a  D(segid, pgno);.
2faf0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
2fb00 72 65 73 75 6c 74 5f 69 6e 74 36 34 28 70 43 74  result_int64(pCt
2fb10 78 2c 20 69 52 6f 77 69 64 29 3b 0a 20 20 20 20  x, iRowid);.    
2fb20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20    }.    }else{. 
2fb30 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73       sqlite3_res
2fb40 75 6c 74 5f 65 72 72 6f 72 28 70 43 74 78 2c 20  ult_error(pCtx, 
2fb50 0a 20 20 20 20 20 20 20 20 22 66 69 72 73 74 20  .        "first 
2fb60 61 72 67 20 74 6f 20 66 74 73 35 5f 72 6f 77 69  arg to fts5_rowi
2fb70 64 28 29 20 6d 75 73 74 20 62 65 20 27 73 65 67  d() must be 'seg
2fb80 6d 65 6e 74 27 22 20 2c 20 2d 31 0a 20 20 20 20  ment'" , -1.    
2fb90 20 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d    );.    }.  }.}
2fba0 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20  ../*.** This is 
2fbb0 63 61 6c 6c 65 64 20 61 73 20 70 61 72 74 20 6f  called as part o
2fbc0 66 20 72 65 67 69 73 74 65 72 69 6e 67 20 74 68  f registering th
2fbd0 65 20 46 54 53 35 20 6d 6f 64 75 6c 65 20 77 69  e FTS5 module wi
2fbe0 74 68 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 63  th database.** c
2fbf0 6f 6e 6e 65 63 74 69 6f 6e 20 64 62 2e 20 49 74  onnection db. It
2fc00 20 72 65 67 69 73 74 65 72 73 20 73 65 76 65 72   registers sever
2fc10 61 6c 20 75 73 65 72 2d 64 65 66 69 6e 65 64 20  al user-defined 
2fc20 73 63 61 6c 61 72 20 66 75 6e 63 74 69 6f 6e 73  scalar functions
2fc30 20 75 73 65 66 75 6c 0a 2a 2a 20 77 69 74 68 20   useful.** with 
2fc40 46 54 53 35 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73  FTS5..**.** If s
2fc50 75 63 63 65 73 73 66 75 6c 2c 20 53 51 4c 49 54  uccessful, SQLIT
2fc60 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
2fc70 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  . If an error oc
2fc80 63 75 72 73 2c 20 73 6f 6d 65 20 6f 74 68 65 72  curs, some other
2fc90 0a 2a 2a 20 53 51 4c 69 74 65 20 65 72 72 6f 72  .** SQLite error
2fca0 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65   code is returne
2fcb0 64 20 69 6e 73 74 65 61 64 2e 0a 2a 2f 0a 69 6e  d instead..*/.in
2fcc0 74 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64  t sqlite3Fts5Ind
2fcd0 65 78 49 6e 69 74 28 73 71 6c 69 74 65 33 20 2a  exInit(sqlite3 *
2fce0 64 62 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  db){.  int rc = 
2fcf0 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66  sqlite3_create_f
2fd00 75 6e 63 74 69 6f 6e 28 0a 20 20 20 20 20 20 64  unction(.      d
2fd10 62 2c 20 22 66 74 73 35 5f 64 65 63 6f 64 65 22  b, "fts5_decode"
2fd20 2c 20 32 2c 20 53 51 4c 49 54 45 5f 55 54 46 38  , 2, SQLITE_UTF8
2fd30 2c 20 30 2c 20 66 74 73 35 44 65 63 6f 64 65 46  , 0, fts5DecodeF
2fd40 75 6e 63 74 69 6f 6e 2c 20 30 2c 20 30 0a 20 20  unction, 0, 0.  
2fd50 29 3b 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  );..  if( rc==SQ
2fd60 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
2fd70 63 20 3d 20 73 71 6c 69 74 65 33 5f 63 72 65 61  c = sqlite3_crea
2fd80 74 65 5f 66 75 6e 63 74 69 6f 6e 28 0a 20 20 20  te_function(.   
2fd90 20 20 20 20 20 64 62 2c 20 22 66 74 73 35 5f 64       db, "fts5_d
2fda0 65 63 6f 64 65 5f 6e 6f 6e 65 22 2c 20 32 2c 20  ecode_none", 2, 
2fdb0 0a 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f  .        SQLITE_
2fdc0 55 54 46 38 2c 20 28 76 6f 69 64 2a 29 64 62 2c  UTF8, (void*)db,
2fdd0 20 66 74 73 35 44 65 63 6f 64 65 46 75 6e 63 74   fts5DecodeFunct
2fde0 69 6f 6e 2c 20 30 2c 20 30 0a 20 20 20 20 29 3b  ion, 0, 0.    );
2fdf0 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d  .  }..  if( rc==
2fe00 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2fe10 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 63 72   rc = sqlite3_cr
2fe20 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 0a 20  eate_function(. 
2fe30 20 20 20 20 20 20 20 64 62 2c 20 22 66 74 73 35         db, "fts5
2fe40 5f 72 6f 77 69 64 22 2c 20 2d 31 2c 20 53 51 4c  _rowid", -1, SQL
2fe50 49 54 45 5f 55 54 46 38 2c 20 30 2c 20 66 74 73  ITE_UTF8, 0, fts
2fe60 35 52 6f 77 69 64 46 75 6e 63 74 69 6f 6e 2c 20  5RowidFunction, 
2fe70 30 2c 20 30 0a 20 20 20 20 29 3b 0a 20 20 7d 0a  0, 0.    );.  }.
2fe80 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a       return rc;.}.