/ Hex Artifact Content
Login

Artifact 84c8aa1c226898b781f2cbe90040a57ddc4a4259:


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 64 6f 63  of the first doc
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 62 2d 74 72 65 65 20 68 65       + b-tree he
0c80: 69 67 68 74 20 28 31 20 2d 3e 20 72 6f 6f 74 20  ight (1 -> root 
0c90: 69 73 20 6c 65 61 66 2c 20 32 20 2d 3e 20 72 6f  is leaf, 2 -> ro
0ca0: 6f 74 20 69 73 20 70 61 72 65 6e 74 20 6f 66 20  ot is parent of 
0cb0: 6c 65 61 66 20 65 74 63 2e 29 0a 2a 2a 20 20 20  leaf etc.).**   
0cc0: 20 20 20 20 20 20 2b 20 66 69 72 73 74 20 6c 65        + first le
0cd0: 61 66 20 70 61 67 65 20 6e 75 6d 62 65 72 20 28  af page number (
0ce0: 6f 66 74 65 6e 20 31 2c 20 61 6c 77 61 79 73 20  often 1, always 
0cf0: 67 72 65 61 74 65 72 20 74 68 61 6e 20 30 29 0a  greater than 0).
0d00: 2a 2a 20 20 20 20 20 20 20 20 20 2b 20 66 69 6e  **         + fin
0d10: 61 6c 20 6c 65 61 66 20 70 61 67 65 20 6e 75 6d  al leaf page num
0d20: 62 65 72 0a 2a 2a 0a 2a 2a 20 32 2e 20 54 68 65  ber.**.** 2. The
0d30: 20 41 76 65 72 61 67 65 73 20 52 65 63 6f 72 64   Averages Record
0d40: 3a 0a 2a 2a 0a 2a 2a 20 20 20 41 20 73 69 6e 67  :.**.**   A sing
0d50: 6c 65 20 72 65 63 6f 72 64 20 77 69 74 68 69 6e  le record within
0d60: 20 74 68 65 20 25 5f 64 61 74 61 20 74 61 62 6c   the %_data tabl
0d70: 65 2e 20 54 68 65 20 64 61 74 61 20 69 73 20 61  e. The data is a
0d80: 20 6c 69 73 74 20 6f 66 20 76 61 72 69 6e 74 73   list of varints
0d90: 2e 0a 2a 2a 20 20 20 54 68 65 20 66 69 72 73 74  ..**   The first
0da0: 20 76 61 6c 75 65 20 69 73 20 74 68 65 20 6e 75   value is the nu
0db0: 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e 20  mber of rows in 
0dc0: 74 68 65 20 69 6e 64 65 78 2e 20 54 68 65 6e 2c  the index. Then,
0dd0: 20 66 6f 72 20 65 61 63 68 20 63 6f 6c 75 6d 6e   for each column
0de0: 0a 2a 2a 20 20 20 66 72 6f 6d 20 6c 65 66 74 20  .**   from left 
0df0: 74 6f 20 72 69 67 68 74 2c 20 74 68 65 20 74 6f  to right, the to
0e00: 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 74 6f  tal number of to
0e10: 6b 65 6e 73 20 69 6e 20 74 68 65 20 63 6f 6c 75  kens in the colu
0e20: 6d 6e 20 66 6f 72 20 61 6c 6c 20 0a 2a 2a 20 20  mn for all .**  
0e30: 20 72 6f 77 73 20 6f 66 20 74 68 65 20 74 61 62   rows of the tab
0e40: 6c 65 2e 0a 2a 2a 0a 2a 2a 20 33 2e 20 53 65 67  le..**.** 3. Seg
0e50: 6d 65 6e 74 20 6c 65 61 76 65 73 3a 0a 2a 2a 0a  ment leaves:.**.
0e60: 2a 2a 20 20 20 54 45 52 4d 20 44 4f 43 4c 49 53  **   TERM DOCLIS
0e70: 54 20 46 4f 52 4d 41 54 3a 0a 2a 2a 0a 2a 2a 20  T FORMAT:.**.** 
0e80: 20 20 20 20 4d 6f 73 74 20 6f 66 20 65 61 63 68      Most of each
0e90: 20 73 65 67 6d 65 6e 74 20 6c 65 61 66 20 69 73   segment leaf is
0ea0: 20 74 61 6b 65 6e 20 75 70 20 62 79 20 74 65 72   taken up by ter
0eb0: 6d 2f 64 6f 63 6c 69 73 74 20 64 61 74 61 2e 20  m/doclist data. 
0ec0: 54 68 65 20 0a 2a 2a 20 20 20 20 20 67 65 6e 65  The .**     gene
0ed0: 72 61 6c 20 66 6f 72 6d 61 74 20 6f 66 20 74 68  ral format of th
0ee0: 65 20 74 65 72 6d 2f 64 6f 63 6c 69 73 74 20 64  e term/doclist d
0ef0: 61 74 61 20 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  ata is:.**.**   
0f00: 20 20 20 20 20 20 76 61 72 69 6e 74 20 3a 20 73        varint : s
0f10: 69 7a 65 20 6f 66 20 66 69 72 73 74 20 74 65 72  ize of first ter
0f20: 6d 0a 2a 2a 20 20 20 20 20 20 20 20 20 62 6c 6f  m.**         blo
0f30: 62 3a 20 20 20 20 66 69 72 73 74 20 74 65 72 6d  b:    first term
0f40: 20 64 61 74 61 0a 2a 2a 20 20 20 20 20 20 20 20   data.**        
0f50: 20 64 6f 63 6c 69 73 74 3a 20 66 69 72 73 74 20   doclist: first 
0f60: 64 6f 63 6c 69 73 74 0a 2a 2a 20 20 20 20 20 20  doclist.**      
0f70: 20 20 20 7a 65 72 6f 2d 6f 72 2d 6d 6f 72 65 20     zero-or-more 
0f80: 7b 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 76  {.**           v
0f90: 61 72 69 6e 74 3a 20 20 6e 75 6d 62 65 72 20 6f  arint:  number o
0fa0: 66 20 62 79 74 65 73 20 69 6e 20 63 6f 6d 6d 6f  f bytes in commo
0fb0: 6e 20 77 69 74 68 20 70 72 65 76 69 6f 75 73 20  n with previous 
0fc0: 74 65 72 6d 0a 2a 2a 20 20 20 20 20 20 20 20 20  term.**         
0fd0: 20 20 76 61 72 69 6e 74 3a 20 20 6e 75 6d 62 65    varint:  numbe
0fe0: 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20 6e 65  r of bytes of ne
0ff0: 77 20 74 65 72 6d 20 64 61 74 61 20 28 6e 4e 65  w term data (nNe
1000: 77 29 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  w).**           
1010: 62 6c 6f 62 3a 20 20 20 20 6e 4e 65 77 20 62 79  blob:    nNew by
1020: 74 65 73 20 6f 66 20 6e 65 77 20 74 65 72 6d 20  tes of new term 
1030: 64 61 74 61 0a 2a 2a 20 20 20 20 20 20 20 20 20  data.**         
1040: 20 20 64 6f 63 6c 69 73 74 3a 20 6e 65 78 74 20    doclist: next 
1050: 64 6f 63 6c 69 73 74 0a 2a 2a 20 20 20 20 20 20  doclist.**      
1060: 20 20 20 7d 0a 2a 2a 0a 2a 2a 20 20 20 20 20 64     }.**.**     d
1070: 6f 63 6c 69 73 74 20 66 6f 72 6d 61 74 3a 0a 2a  oclist format:.*
1080: 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 76 61 72  *.**         var
1090: 69 6e 74 3a 20 20 66 69 72 73 74 20 72 6f 77 69  int:  first rowi
10a0: 64 0a 2a 2a 20 20 20 20 20 20 20 20 20 70 6f 73  d.**         pos
10b0: 6c 69 73 74 3a 20 66 69 72 73 74 20 70 6f 73 6c  list: first posl
10c0: 69 73 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 7a  ist.**         z
10d0: 65 72 6f 2d 6f 72 2d 6d 6f 72 65 20 7b 0a 2a 2a  ero-or-more {.**
10e0: 20 20 20 20 20 20 20 20 20 20 20 76 61 72 69 6e             varin
10f0: 74 3a 20 20 72 6f 77 69 64 20 64 65 6c 74 61 20  t:  rowid delta 
1100: 28 61 6c 77 61 79 73 20 3e 20 30 29 0a 2a 2a 20  (always > 0).** 
1110: 20 20 20 20 20 20 20 20 20 20 70 6f 73 6c 69 73            poslis
1120: 74 3a 20 6e 65 78 74 20 70 6f 73 6c 69 73 74 0a  t: next poslist.
1130: 2a 2a 20 20 20 20 20 20 20 20 20 7d 0a 2a 2a 20  **         }.** 
1140: 20 20 20 20 20 20 20 20 30 78 30 30 20 62 79 74          0x00 byt
1150: 65 0a 2a 2a 0a 2a 2a 20 20 20 20 20 70 6f 73 6c  e.**.**     posl
1160: 69 73 74 20 66 6f 72 6d 61 74 3a 0a 2a 2a 0a 2a  ist format:.**.*
1170: 2a 20 20 20 20 20 20 20 20 20 76 61 72 69 6e 74  *         varint
1180: 3a 20 73 69 7a 65 20 6f 66 20 70 6f 73 6c 69 73  : size of poslis
1190: 74 20 69 6e 20 62 79 74 65 73 20 6d 75 6c 74 69  t in bytes multi
11a0: 70 6c 69 65 64 20 62 79 20 32 2c 20 6e 6f 74 20  plied by 2, not 
11b0: 69 6e 63 6c 75 64 69 6e 67 0a 2a 2a 20 20 20 20  including.**    
11c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 74 68 69               thi
11d0: 73 20 66 69 65 6c 64 2e 20 50 6c 75 73 20 31 20  s field. Plus 1 
11e0: 69 66 20 74 68 69 73 20 65 6e 74 72 79 20 63 61  if this entry ca
11f0: 72 72 69 65 73 20 74 68 65 20 22 64 65 6c 65 74  rries the "delet
1200: 65 22 20 66 6c 61 67 2e 0a 2a 2a 20 20 20 20 20  e" flag..**     
1210: 20 20 20 20 63 6f 6c 6c 69 73 74 3a 20 63 6f 6c      collist: col
1220: 6c 69 73 74 20 66 6f 72 20 63 6f 6c 75 6d 6e 20  list for column 
1230: 30 0a 2a 2a 20 20 20 20 20 20 20 20 20 7a 65 72  0.**         zer
1240: 6f 2d 6f 72 2d 6d 6f 72 65 20 7b 0a 2a 2a 20 20  o-or-more {.**  
1250: 20 20 20 20 20 20 20 20 20 30 78 30 31 20 62 79           0x01 by
1260: 74 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  te.**           
1270: 76 61 72 69 6e 74 3a 20 63 6f 6c 75 6d 6e 20 6e  varint: column n
1280: 75 6d 62 65 72 20 28 49 29 0a 2a 2a 20 20 20 20  umber (I).**    
1290: 20 20 20 20 20 20 20 63 6f 6c 6c 69 73 74 3a 20         collist: 
12a0: 63 6f 6c 6c 69 73 74 20 66 6f 72 20 63 6f 6c 75  collist for colu
12b0: 6d 6e 20 49 0a 2a 2a 20 20 20 20 20 20 20 20 20  mn I.**         
12c0: 7d 0a 2a 2a 0a 2a 2a 20 20 20 20 20 63 6f 6c 6c  }.**.**     coll
12d0: 69 73 74 20 66 6f 72 6d 61 74 3a 0a 2a 2a 0a 2a  ist format:.**.*
12e0: 2a 20 20 20 20 20 20 20 20 20 76 61 72 69 6e 74  *         varint
12f0: 3a 20 66 69 72 73 74 20 6f 66 66 73 65 74 20 2b  : first offset +
1300: 20 32 0a 2a 2a 20 20 20 20 20 20 20 20 20 7a 65   2.**         ze
1310: 72 6f 2d 6f 72 2d 6d 6f 72 65 20 7b 0a 2a 2a 20  ro-or-more {.** 
1320: 20 20 20 20 20 20 20 20 20 20 76 61 72 69 6e 74            varint
1330: 3a 20 6f 66 66 73 65 74 20 64 65 6c 74 61 20 2b  : offset delta +
1340: 20 32 0a 2a 2a 20 20 20 20 20 20 20 20 20 7d 0a   2.**         }.
1350: 2a 2a 0a 2a 2a 20 20 20 50 41 47 49 4e 41 54 49  **.**   PAGINATI
1360: 4f 4e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 54 68 65  ON.**.**     The
1370: 20 66 6f 72 6d 61 74 20 64 65 73 63 72 69 62 65   format describe
1380: 64 20 61 62 6f 76 65 20 69 73 20 6f 6e 6c 79 20  d above is only 
1390: 61 63 63 75 72 61 74 65 20 69 66 20 74 68 65 20  accurate if the 
13a0: 65 6e 74 69 72 65 20 74 65 72 6d 2f 64 6f 63 6c  entire term/docl
13b0: 69 73 74 0a 2a 2a 20 20 20 20 20 64 61 74 61 20  ist.**     data 
13c0: 66 69 74 73 20 6f 6e 20 61 20 73 69 6e 67 6c 65  fits on a single
13d0: 20 6c 65 61 66 20 70 61 67 65 2e 20 49 66 20 74   leaf page. If t
13e0: 68 69 73 20 69 73 20 6e 6f 74 20 74 68 65 20 63  his is not the c
13f0: 61 73 65 2c 20 74 68 65 20 66 6f 72 6d 61 74 0a  ase, the format.
1400: 2a 2a 20 20 20 20 20 69 73 20 63 68 61 6e 67 65  **     is change
1410: 64 20 69 6e 20 74 77 6f 20 77 61 79 73 3a 0a 2a  d in two ways:.*
1420: 2a 0a 2a 2a 20 20 20 20 20 20 20 2b 20 69 66 20  *.**       + if 
1430: 74 68 65 20 66 69 72 73 74 20 72 6f 77 69 64 20  the first rowid 
1440: 6f 6e 20 61 20 70 61 67 65 20 6f 63 63 75 72 73  on a page occurs
1450: 20 62 65 66 6f 72 65 20 74 68 65 20 66 69 72 73   before the firs
1460: 74 20 74 65 72 6d 2c 20 69 74 0a 2a 2a 20 20 20  t term, it.**   
1470: 20 20 20 20 20 20 69 73 20 73 74 6f 72 65 64 20        is stored 
1480: 61 73 20 61 20 6c 69 74 65 72 61 6c 20 76 61 6c  as a literal val
1490: 75 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20  ue:.**.**       
14a0: 20 20 20 20 20 20 76 61 72 69 6e 74 3a 20 20 66        varint:  f
14b0: 69 72 73 74 20 72 6f 77 69 64 0a 2a 2a 0a 2a 2a  irst rowid.**.**
14c0: 20 20 20 20 20 20 20 2b 20 74 68 65 20 66 69 72         + the fir
14d0: 73 74 20 74 65 72 6d 20 6f 6e 20 65 61 63 68 20  st term on each 
14e0: 70 61 67 65 20 69 73 20 73 74 6f 72 65 64 20 69  page is stored i
14f0: 6e 20 74 68 65 20 73 61 6d 65 20 77 61 79 20 61  n the same way a
1500: 73 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20  s the.**        
1510: 20 76 65 72 79 20 66 69 72 73 74 20 74 65 72 6d   very first term
1520: 20 6f 66 20 74 68 65 20 73 65 67 6d 65 6e 74 3a   of the segment:
1530: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  .**.**          
1540: 20 20 20 76 61 72 69 6e 74 20 3a 20 73 69 7a 65     varint : size
1550: 20 6f 66 20 66 69 72 73 74 20 74 65 72 6d 0a 2a   of first term.*
1560: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 62 6c  *             bl
1570: 6f 62 3a 20 20 20 20 66 69 72 73 74 20 74 65 72  ob:    first ter
1580: 6d 20 64 61 74 61 0a 2a 2a 0a 2a 2a 20 20 20 20  m data.**.**    
1590: 20 45 61 63 68 20 6c 65 61 66 20 70 61 67 65 20   Each leaf page 
15a0: 62 65 67 69 6e 73 20 77 69 74 68 3a 0a 2a 2a 0a  begins with:.**.
15b0: 2a 2a 20 20 20 20 20 20 20 2b 20 32 2d 62 79 74  **       + 2-byt
15c0: 65 20 75 6e 73 69 67 6e 65 64 20 63 6f 6e 74 61  e unsigned conta
15d0: 69 6e 69 6e 67 20 6f 66 66 73 65 74 20 74 6f 20  ining offset to 
15e0: 66 69 72 73 74 20 72 6f 77 69 64 20 28 6f 72 20  first rowid (or 
15f0: 30 29 2e 0a 2a 2a 20 20 20 20 20 20 20 2b 20 32  0)..**       + 2
1600: 2d 62 79 74 65 20 75 6e 73 69 67 6e 65 64 20 63  -byte unsigned c
1610: 6f 6e 74 61 69 6e 69 6e 67 20 6f 66 66 73 65 74  ontaining offset
1620: 20 74 6f 20 66 69 72 73 74 20 74 65 72 6d 20 28   to first term (
1630: 6f 72 20 30 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 46  or 0)..**.**   F
1640: 6f 6c 6c 6f 77 65 64 20 62 79 20 74 65 72 6d 2f  ollowed by term/
1650: 64 6f 63 6c 69 73 74 20 64 61 74 61 2e 0a 2a 2a  doclist data..**
1660: 0a 2a 2a 20 34 2e 20 53 65 67 6d 65 6e 74 20 69  .** 4. Segment i
1670: 6e 74 65 72 69 6f 72 20 6e 6f 64 65 73 3a 0a 2a  nterior nodes:.*
1680: 2a 0a 2a 2a 20 20 20 54 68 65 20 69 6e 74 65 72  *.**   The inter
1690: 69 6f 72 20 6e 6f 64 65 73 20 74 75 72 6e 20 74  ior nodes turn t
16a0: 68 65 20 6c 69 73 74 20 6f 66 20 6c 65 61 76 65  he list of leave
16b0: 73 20 69 6e 74 6f 20 61 20 62 2b 74 72 65 65 2e  s into a b+tree.
16c0: 20 0a 2a 2a 0a 2a 2a 20 20 20 45 61 63 68 20 69   .**.**   Each i
16d0: 6e 74 65 72 69 6f 72 20 6e 6f 64 65 20 62 65 67  nterior node beg
16e0: 69 6e 73 20 77 69 74 68 20 61 20 76 61 72 69 6e  ins with a varin
16f0: 74 20 2d 20 74 68 65 20 70 61 67 65 20 6e 75 6d  t - the page num
1700: 62 65 72 20 6f 66 20 74 68 65 20 6c 65 66 74 0a  ber of the left.
1710: 2a 2a 20 20 20 6d 6f 73 74 20 63 68 69 6c 64 20  **   most child 
1720: 6e 6f 64 65 2e 20 46 6f 6c 6c 6f 77 69 6e 67 20  node. Following 
1730: 74 68 69 73 2c 20 66 6f 72 20 65 61 63 68 20 6c  this, for each l
1740: 65 61 66 20 70 61 67 65 20 65 78 63 65 70 74 20  eaf page except 
1750: 74 68 65 20 66 69 72 73 74 2c 0a 2a 2a 20 20 20  the first,.**   
1760: 74 68 65 20 69 6e 74 65 72 69 6f 72 20 6e 6f 64  the interior nod
1770: 65 73 20 63 6f 6e 74 61 69 6e 3a 0a 2a 2a 0a 2a  es contain:.**.*
1780: 2a 20 20 20 20 20 61 29 20 49 66 20 74 68 65 20  *     a) If the 
1790: 6c 65 61 66 20 70 61 67 65 20 63 6f 6e 74 61 69  leaf page contai
17a0: 6e 73 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20  ns at least one 
17b0: 74 65 72 6d 2c 20 74 68 65 6e 20 61 20 74 65 72  term, then a ter
17c0: 6d 2d 70 72 65 66 69 78 20 74 68 61 74 0a 2a 2a  m-prefix that.**
17d0: 20 20 20 20 20 20 20 20 69 73 20 67 72 65 61 74          is great
17e0: 65 72 20 74 68 61 6e 20 61 6c 6c 20 70 72 65 76  er than all prev
17f0: 69 6f 75 73 20 74 65 72 6d 73 2c 20 61 6e 64 20  ious terms, and 
1800: 6c 65 73 73 20 74 68 61 6e 20 6f 72 20 65 71 75  less than or equ
1810: 61 6c 20 74 6f 20 74 68 65 0a 2a 2a 20 20 20 20  al to the.**    
1820: 20 20 20 20 66 69 72 73 74 20 74 65 72 6d 20 6f      first term o
1830: 6e 20 74 68 65 20 6c 65 61 66 20 70 61 67 65 2e  n the leaf page.
1840: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 62 29 20 49 66  .**.**     b) If
1850: 20 74 68 65 20 6c 65 61 66 20 70 61 67 65 20 6e   the leaf page n
1860: 6f 20 74 65 72 6d 73 2c 20 61 20 72 65 63 6f 72  o terms, a recor
1870: 64 20 69 6e 64 69 63 61 74 69 6e 67 20 68 6f 77  d indicating how
1880: 20 6d 61 6e 79 20 63 6f 6e 73 65 63 75 74 69 76   many consecutiv
1890: 65 0a 2a 2a 20 20 20 20 20 20 20 20 6c 65 61 76  e.**        leav
18a0: 65 73 20 63 6f 6e 74 61 69 6e 20 6e 6f 20 74 65  es contain no te
18b0: 72 6d 73 2c 20 61 6e 64 20 77 68 65 74 68 65 72  rms, and whether
18c0: 20 6f 72 20 6e 6f 74 20 74 68 65 72 65 20 69 73   or not there is
18d0: 20 61 6e 20 61 73 73 6f 63 69 61 74 65 64 0a 2a   an associated.*
18e0: 2a 20 20 20 20 20 20 20 20 62 79 2d 72 6f 77 69  *        by-rowi
18f0: 64 20 69 6e 64 65 78 20 72 65 63 6f 72 64 2e 0a  d index record..
1900: 2a 2a 0a 2a 2a 20 20 20 42 79 20 64 65 66 69 6e  **.**   By defin
1910: 69 74 69 6f 6e 2c 20 74 68 65 72 65 20 69 73 20  ition, there is 
1920: 6e 65 76 65 72 20 6d 6f 72 65 20 74 68 61 6e 20  never more than 
1930: 6f 6e 65 20 74 79 70 65 20 28 62 29 20 72 65 63  one type (b) rec
1940: 6f 72 64 20 69 6e 20 61 20 72 6f 77 2e 0a 2a 2a  ord in a row..**
1950: 20 20 20 54 79 70 65 20 28 62 29 20 72 65 63 6f     Type (b) reco
1960: 72 64 73 20 6f 6e 6c 79 20 65 76 65 72 20 61 70  rds only ever ap
1970: 70 65 61 72 20 6f 6e 20 68 65 69 67 68 74 3d 31  pear on height=1
1980: 20 70 61 67 65 73 20 2d 20 69 6d 6d 65 64 69 61   pages - immedia
1990: 74 65 20 70 61 72 65 6e 74 73 0a 2a 2a 20 20 20  te parents.**   
19a0: 6f 66 20 6c 65 61 76 65 73 2e 20 4f 6e 6c 79 20  of leaves. Only 
19b0: 74 79 70 65 20 28 61 29 20 72 65 63 6f 72 64 73  type (a) records
19c0: 20 61 72 65 20 70 75 73 68 65 64 20 74 6f 20 68   are pushed to h
19d0: 69 67 68 65 72 20 6c 65 76 65 6c 73 2e 0a 2a 2a  igher levels..**
19e0: 0a 2a 2a 20 20 20 54 65 72 6d 20 66 6f 72 6d 61  .**   Term forma
19f0: 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 20 4e  t:.**.**     * N
1a00: 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 69  umber of bytes i
1a10: 6e 20 63 6f 6d 6d 6f 6e 20 77 69 74 68 20 70 72  n common with pr
1a20: 65 76 69 6f 75 73 20 74 65 72 6d 20 70 6c 75 73  evious term plus
1a30: 20 32 2c 20 61 73 20 61 20 76 61 72 69 6e 74 2e   2, as a varint.
1a40: 0a 2a 2a 20 20 20 20 20 2a 20 4e 75 6d 62 65 72  .**     * Number
1a50: 20 6f 66 20 62 79 74 65 73 20 6f 66 20 6e 65 77   of bytes of new
1a60: 20 74 65 72 6d 20 64 61 74 61 2c 20 61 73 20 61   term data, as a
1a70: 20 76 61 72 69 6e 74 2e 0a 2a 2a 20 20 20 20 20   varint..**     
1a80: 2a 20 6e 65 77 20 74 65 72 6d 20 64 61 74 61 2e  * new term data.
1a90: 0a 2a 2a 0a 2a 2a 20 20 20 4e 6f 2d 74 65 72 6d  .**.**   No-term
1aa0: 20 66 6f 72 6d 61 74 3a 0a 2a 2a 0a 2a 2a 20 20   format:.**.**  
1ab0: 20 20 20 2a 20 65 69 74 68 65 72 20 61 6e 20 30     * either an 0
1ac0: 78 30 30 20 6f 72 20 30 78 30 31 20 62 79 74 65  x00 or 0x01 byte
1ad0: 2e 20 49 66 20 74 68 65 20 76 61 6c 75 65 20 30  . If the value 0
1ae0: 78 30 31 20 69 73 20 75 73 65 64 2c 20 74 68 65  x01 is used, the
1af0: 6e 20 74 68 65 72 65 20 0a 2a 2a 20 20 20 20 20  n there .**     
1b00: 20 20 69 73 20 61 6e 20 61 73 73 6f 63 69 61 74    is an associat
1b10: 65 64 20 69 6e 64 65 78 2d 62 79 2d 72 6f 77 69  ed index-by-rowi
1b20: 64 20 72 65 63 6f 72 64 2e 0a 2a 2a 20 20 20 20  d record..**    
1b30: 20 2a 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66   * the number of
1b40: 20 7a 65 72 6f 2d 74 65 72 6d 20 6c 65 61 76 65   zero-term leave
1b50: 73 20 61 73 20 61 20 76 61 72 69 6e 74 2e 0a 2a  s as a varint..*
1b60: 2a 0a 2a 2a 20 35 2e 20 53 65 67 6d 65 6e 74 20  *.** 5. Segment 
1b70: 64 6f 63 6c 69 73 74 20 69 6e 64 65 78 65 73 3a  doclist indexes:
1b80: 0a 2a 2a 0a 2a 2a 20 20 20 44 6f 63 6c 69 73 74  .**.**   Doclist
1b90: 20 69 6e 64 65 78 65 73 20 61 72 65 20 74 68 65   indexes are the
1ba0: 6d 73 65 6c 76 65 73 20 62 2d 74 72 65 65 73 2c  mselves b-trees,
1bb0: 20 68 6f 77 65 76 65 72 20 74 68 65 79 20 75 73   however they us
1bc0: 75 61 6c 6c 79 20 63 6f 6e 73 69 73 74 20 6f 66  ually consist of
1bd0: 0a 2a 2a 20 20 20 61 20 73 69 6e 67 6c 65 20 6c  .**   a single l
1be0: 65 61 66 20 72 65 63 6f 72 64 20 6f 6e 6c 79 2e  eaf record only.
1bf0: 20 54 68 65 20 66 6f 72 6d 61 74 20 6f 66 20 65   The format of e
1c00: 61 63 68 20 64 6f 63 6c 69 73 74 20 69 6e 64 65  ach doclist inde
1c10: 78 20 6c 65 61 66 20 70 61 67 65 20 0a 2a 2a 20  x leaf page .** 
1c20: 20 20 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20    is:.**.**     
1c30: 2a 20 46 6c 61 67 73 20 62 79 74 65 2e 20 42 69  * Flags byte. Bi
1c40: 74 73 20 61 72 65 3a 0a 2a 2a 20 20 20 20 20 20  ts are:.**      
1c50: 20 20 20 30 78 30 31 3a 20 43 6c 65 61 72 20 69     0x01: Clear i
1c60: 66 20 6c 65 61 66 20 69 73 20 61 6c 73 6f 20 74  f leaf is also t
1c70: 68 65 20 72 6f 6f 74 20 70 61 67 65 2c 20 6f 74  he root page, ot
1c80: 68 65 72 77 69 73 65 20 73 65 74 2e 0a 2a 2a 0a  herwise set..**.
1c90: 2a 2a 20 20 20 20 20 2a 20 50 61 67 65 20 6e 75  **     * Page nu
1ca0: 6d 62 65 72 20 6f 66 20 66 74 73 20 69 6e 64 65  mber of fts inde
1cb0: 78 20 6c 65 61 66 20 70 61 67 65 2e 20 41 73 20  x leaf page. As 
1cc0: 61 20 76 61 72 69 6e 74 2e 0a 2a 2a 0a 2a 2a 20  a varint..**.** 
1cd0: 20 20 20 20 2a 20 46 69 72 73 74 20 64 6f 63 69      * First doci
1ce0: 64 20 6f 6e 20 70 61 67 65 20 69 6e 64 69 63 61  d on page indica
1cf0: 74 65 64 20 62 79 20 70 72 65 76 69 6f 75 73 20  ted by previous 
1d00: 66 69 65 6c 64 2e 20 41 73 20 61 20 76 61 72 69  field. As a vari
1d10: 6e 74 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 20  nt..**.**     * 
1d20: 41 20 6c 69 73 74 20 6f 66 20 76 61 72 69 6e 74  A list of varint
1d30: 73 2c 20 6f 6e 65 20 66 6f 72 20 65 61 63 68 20  s, one for each 
1d40: 73 75 62 73 65 71 75 65 6e 74 20 74 65 72 6d 6c  subsequent terml
1d50: 65 73 73 20 70 61 67 65 2e 20 41 20 0a 2a 2a 20  ess page. A .** 
1d60: 20 20 20 20 20 20 70 6f 73 69 74 69 76 65 20 64        positive d
1d70: 65 6c 74 61 20 69 66 20 74 68 65 20 74 65 72 6d  elta if the term
1d80: 6c 65 73 73 20 70 61 67 65 20 63 6f 6e 74 61 69  less page contai
1d90: 6e 73 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20  ns at least one 
1da0: 64 6f 63 69 64 2c 20 0a 2a 2a 20 20 20 20 20 20  docid, .**      
1db0: 20 6f 72 20 61 6e 20 30 78 30 30 20 62 79 74 65   or an 0x00 byte
1dc0: 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2a 0a 2a   otherwise..**.*
1dd0: 2a 20 20 20 49 6e 74 65 72 6e 61 6c 20 64 6f 63  *   Internal doc
1de0: 6c 69 73 74 20 69 6e 64 65 78 20 6e 6f 64 65 73  list index nodes
1df0: 20 61 72 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20   are:.**.**     
1e00: 2a 20 46 6c 61 67 73 20 62 79 74 65 2e 20 42 69  * Flags byte. Bi
1e10: 74 73 20 61 72 65 3a 0a 2a 2a 20 20 20 20 20 20  ts are:.**      
1e20: 20 20 20 30 78 30 31 3a 20 43 6c 65 61 72 20 66     0x01: Clear f
1e30: 6f 72 20 72 6f 6f 74 20 70 61 67 65 2c 20 6f 74  or root page, ot
1e40: 68 65 72 77 69 73 65 20 73 65 74 2e 0a 2a 2a 0a  herwise set..**.
1e50: 2a 2a 20 20 20 20 20 2a 20 50 61 67 65 20 6e 75  **     * Page nu
1e60: 6d 62 65 72 20 6f 66 20 66 69 72 73 74 20 63 68  mber of first ch
1e70: 69 6c 64 20 70 61 67 65 2e 20 41 73 20 61 20 76  ild page. As a v
1e80: 61 72 69 6e 74 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  arint..**.**    
1e90: 20 2a 20 43 6f 70 79 20 6f 66 20 66 69 72 73 74   * Copy of first
1ea0: 20 64 6f 63 69 64 20 6f 6e 20 70 61 67 65 20 69   docid on page i
1eb0: 6e 64 69 63 61 74 65 64 20 62 79 20 70 72 65 76  ndicated by prev
1ec0: 69 6f 75 73 20 66 69 65 6c 64 2e 20 41 73 20 61  ious field. As a
1ed0: 20 76 61 72 69 6e 74 2e 0a 2a 2a 0a 2a 2a 20 20   varint..**.**  
1ee0: 20 20 20 2a 20 41 20 6c 69 73 74 20 6f 66 20 64     * A list of d
1ef0: 65 6c 74 61 2d 65 6e 63 6f 64 65 64 20 76 61 72  elta-encoded var
1f00: 69 6e 74 73 20 2d 20 74 68 65 20 66 69 72 73 74  ints - the first
1f10: 20 64 6f 63 69 64 20 6f 6e 20 65 61 63 68 20 73   docid on each s
1f20: 75 62 73 65 71 75 65 6e 74 0a 2a 2a 20 20 20 20  ubsequent.**    
1f30: 20 20 20 63 68 69 6c 64 20 70 61 67 65 2e 20 0a     child page. .
1f40: 2a 2a 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 6f 77  **.*/../*.** Row
1f50: 69 64 73 20 66 6f 72 20 74 68 65 20 61 76 65 72  ids for the aver
1f60: 61 67 65 73 20 61 6e 64 20 73 74 72 75 63 74 75  ages and structu
1f70: 72 65 20 72 65 63 6f 72 64 73 20 69 6e 20 74 68  re records in th
1f80: 65 20 25 5f 64 61 74 61 20 74 61 62 6c 65 2e 0a  e %_data table..
1f90: 2a 2f 0a 23 64 65 66 69 6e 65 20 46 54 53 35 5f  */.#define FTS5_
1fa0: 41 56 45 52 41 47 45 53 5f 52 4f 57 49 44 20 20  AVERAGES_ROWID  
1fb0: 20 20 20 31 20 20 20 20 2f 2a 20 52 6f 77 69 64     1    /* Rowid
1fc0: 20 75 73 65 64 20 66 6f 72 20 74 68 65 20 61 76   used for the av
1fd0: 65 72 61 67 65 73 20 72 65 63 6f 72 64 20 2a 2f  erages record */
1fe0: 0a 23 64 65 66 69 6e 65 20 46 54 53 35 5f 53 54  .#define FTS5_ST
1ff0: 52 55 43 54 55 52 45 5f 52 4f 57 49 44 20 20 20  RUCTURE_ROWID   
2000: 31 30 20 20 20 20 2f 2a 20 54 68 65 20 73 74 72  10    /* The str
2010: 75 63 74 75 72 65 20 72 65 63 6f 72 64 20 2a 2f  ucture record */
2020: 0a 0a 2f 2a 0a 2a 2a 20 4d 61 63 72 6f 73 20 64  ../*.** Macros d
2030: 65 74 65 72 6d 69 6e 69 6e 67 20 74 68 65 20 72  etermining the r
2040: 6f 77 69 64 73 20 75 73 65 64 20 62 79 20 73 65  owids used by se
2050: 67 6d 65 6e 74 20 6e 6f 64 65 73 2e 20 41 6c 6c  gment nodes. All
2060: 20 6e 6f 64 65 73 20 69 6e 20 61 6c 6c 0a 2a 2a   nodes in all.**
2070: 20 73 65 67 6d 65 6e 74 73 20 66 6f 72 20 61 6c   segments for al
2080: 6c 20 69 6e 64 65 78 65 73 20 28 74 68 65 20 72  l indexes (the r
2090: 65 67 75 6c 61 72 20 46 54 53 20 69 6e 64 65 78  egular FTS index
20a0: 20 61 6e 64 20 61 6e 79 20 70 72 65 66 69 78 20   and any prefix 
20b0: 69 6e 64 65 78 65 73 29 0a 2a 2a 20 61 72 65 20  indexes).** are 
20c0: 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 25 5f  stored in the %_
20d0: 64 61 74 61 20 74 61 62 6c 65 20 77 69 74 68 20  data table with 
20e0: 6c 61 72 67 65 20 70 6f 73 69 74 69 76 65 20 72  large positive r
20f0: 6f 77 69 64 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  owids..**.** The
2100: 20 25 5f 64 61 74 61 20 74 61 62 6c 65 20 6d 61   %_data table ma
2110: 79 20 63 6f 6e 74 61 69 6e 20 75 70 20 74 6f 20  y contain up to 
2120: 28 31 3c 3c 46 54 53 35 5f 53 45 47 4d 45 4e 54  (1<<FTS5_SEGMENT
2130: 5f 49 4e 44 45 58 5f 42 49 54 53 29 20 0a 2a 2a  _INDEX_BITS) .**
2140: 20 69 6e 64 65 78 65 73 20 2d 20 6f 6e 65 20 72   indexes - one r
2150: 65 67 75 6c 61 72 20 74 65 72 6d 20 69 6e 64 65  egular term inde
2160: 78 20 61 6e 64 20 7a 65 72 6f 20 6f 72 20 6d 6f  x and zero or mo
2170: 72 65 20 70 72 65 66 69 78 20 69 6e 64 65 78 65  re prefix indexe
2180: 73 2e 0a 2a 2a 0a 2a 2a 20 45 61 63 68 20 73 65  s..**.** Each se
2190: 67 6d 65 6e 74 20 69 6e 20 61 6e 20 69 6e 64 65  gment in an inde
21a0: 78 20 68 61 73 20 61 20 75 6e 69 71 75 65 20 69  x has a unique i
21b0: 64 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 7a  d greater than z
21c0: 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20 45 61 63 68 20  ero..**.** Each 
21d0: 6e 6f 64 65 20 69 6e 20 61 20 73 65 67 6d 65 6e  node in a segmen
21e0: 74 20 62 2d 74 72 65 65 20 69 73 20 61 73 73 69  t b-tree is assi
21f0: 67 6e 65 64 20 61 20 22 70 61 67 65 20 6e 75 6d  gned a "page num
2200: 62 65 72 22 20 74 68 61 74 20 69 73 20 75 6e 69  ber" that is uni
2210: 71 75 65 0a 2a 2a 20 77 69 74 68 69 6e 20 6e 6f  que.** within no
2220: 64 65 73 20 6f 66 20 69 74 73 20 68 65 69 67 68  des of its heigh
2230: 74 20 77 69 74 68 69 6e 20 74 68 65 20 73 65 67  t within the seg
2240: 6d 65 6e 74 20 28 6c 65 61 66 20 6e 6f 64 65 73  ment (leaf nodes
2250: 20 68 61 76 65 20 61 20 68 65 69 67 68 74 20 0a   have a height .
2260: 2a 2a 20 6f 66 20 30 2c 20 70 61 72 65 6e 74 73  ** of 0, parents
2270: 20 31 2c 20 65 74 63 2e 29 2e 20 50 61 67 65 20   1, etc.). Page 
2280: 6e 75 6d 62 65 72 73 20 61 72 65 20 61 6c 6c 6f  numbers are allo
2290: 63 61 74 65 64 20 73 65 71 75 65 6e 74 69 61 6c  cated sequential
22a0: 6c 79 20 73 6f 20 74 68 61 74 0a 2a 2a 20 61 20  ly so that.** a 
22b0: 6e 6f 64 65 73 20 70 61 67 65 20 6e 75 6d 62 65  nodes page numbe
22c0: 72 20 69 73 20 61 6c 77 61 79 73 20 6f 6e 65 20  r is always one 
22d0: 6d 6f 72 65 20 74 68 61 6e 20 69 74 73 20 6c 65  more than its le
22e0: 66 74 20 73 69 62 6c 69 6e 67 2e 0a 2a 2a 0a 2a  ft sibling..**.*
22f0: 2a 20 54 68 65 20 72 6f 77 69 64 20 66 6f 72 20  * The rowid for 
2300: 61 20 6e 6f 64 65 20 69 73 20 74 68 65 6e 20 66  a node is then f
2310: 6f 75 6e 64 20 75 73 69 6e 67 20 74 68 65 20 46  ound using the F
2320: 54 53 35 5f 53 45 47 4d 45 4e 54 5f 52 4f 57 49  TS5_SEGMENT_ROWI
2330: 44 28 29 20 6d 61 63 72 6f 0a 2a 2a 20 62 65 6c  D() macro.** bel
2340: 6f 77 2e 20 54 68 65 20 46 54 53 35 5f 53 45 47  ow. The FTS5_SEG
2350: 4d 45 4e 54 5f 2a 5f 42 49 54 53 20 6d 61 63 72  MENT_*_BITS macr
2360: 6f 73 20 64 65 66 69 6e 65 20 74 68 65 20 6e 75  os define the nu
2370: 6d 62 65 72 20 6f 66 20 62 69 74 73 20 75 73 65  mber of bits use
2380: 64 0a 2a 2a 20 74 6f 20 65 6e 63 6f 64 65 20 74  d.** to encode t
2390: 68 65 20 74 68 72 65 65 20 46 54 53 35 5f 53 45  he three FTS5_SE
23a0: 47 4d 45 4e 54 5f 52 4f 57 49 44 28 29 20 61 72  GMENT_ROWID() ar
23b0: 67 75 6d 65 6e 74 73 2e 20 54 68 69 73 20 6d 6f  guments. This mo
23c0: 64 75 6c 65 20 72 65 74 75 72 6e 73 0a 2a 2a 20  dule returns.** 
23d0: 53 51 4c 49 54 45 5f 46 55 4c 4c 20 61 6e 64 20  SQLITE_FULL and 
23e0: 66 61 69 6c 73 20 74 68 65 20 63 75 72 72 65 6e  fails the curren
23f0: 74 20 6f 70 65 72 61 74 69 6f 6e 20 69 66 20 74  t operation if t
2400: 68 65 79 20 65 76 65 72 20 70 72 6f 76 65 20 74  hey ever prove t
2410: 6f 6f 20 73 6d 61 6c 6c 2e 0a 2a 2f 0a 23 64 65  oo small..*/.#de
2420: 66 69 6e 65 20 46 54 53 35 5f 44 41 54 41 5f 49  fine FTS5_DATA_I
2430: 44 5f 42 20 20 20 20 20 31 36 20 20 20 20 20 2f  D_B     16     /
2440: 2a 20 4d 61 78 20 73 65 67 20 69 64 20 6e 75 6d  * Max seg id num
2450: 62 65 72 20 36 35 35 33 35 20 2a 2f 0a 23 64 65  ber 65535 */.#de
2460: 66 69 6e 65 20 46 54 53 35 5f 44 41 54 41 5f 44  fine FTS5_DATA_D
2470: 4c 49 5f 42 20 20 20 20 20 31 20 20 20 20 20 2f  LI_B     1     /
2480: 2a 20 44 6f 63 6c 69 73 74 2d 69 6e 64 65 78 20  * Doclist-index 
2490: 66 6c 61 67 20 28 31 20 62 69 74 29 20 2a 2f 0a  flag (1 bit) */.
24a0: 23 64 65 66 69 6e 65 20 46 54 53 35 5f 44 41 54  #define FTS5_DAT
24b0: 41 5f 48 45 49 47 48 54 5f 42 20 20 35 20 20 20  A_HEIGHT_B  5   
24c0: 20 20 2f 2a 20 4d 61 78 20 62 2d 74 72 65 65 20    /* Max b-tree 
24d0: 68 65 69 67 68 74 20 6f 66 20 33 32 20 2a 2f 0a  height of 32 */.
24e0: 23 64 65 66 69 6e 65 20 46 54 53 35 5f 44 41 54  #define FTS5_DAT
24f0: 41 5f 50 41 47 45 5f 42 20 20 20 33 31 20 20 20  A_PAGE_B   31   
2500: 20 20 2f 2a 20 4d 61 78 20 70 61 67 65 20 6e 75    /* Max page nu
2510: 6d 62 65 72 20 6f 66 20 32 31 34 37 34 38 33 36  mber of 21474836
2520: 34 38 20 2a 2f 0a 0a 23 64 65 66 69 6e 65 20 66  48 */..#define f
2530: 74 73 35 5f 64 72 69 28 73 65 67 69 64 2c 20 64  ts5_dri(segid, d
2540: 6c 69 64 78 2c 20 68 65 69 67 68 74 2c 20 70 67  lidx, height, pg
2550: 6e 6f 29 20 28 20 20 20 20 20 20 20 20 20 20 20  no) (           
2560: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2570: 20 20 20 20 20 20 5c 0a 20 28 28 69 36 34 29 28        \. ((i64)(
2580: 73 65 67 69 64 29 20 20 3c 3c 20 28 46 54 53 35  segid)  << (FTS5
2590: 5f 44 41 54 41 5f 50 41 47 45 5f 42 2b 46 54 53  _DATA_PAGE_B+FTS
25a0: 35 5f 44 41 54 41 5f 48 45 49 47 48 54 5f 42 2b  5_DATA_HEIGHT_B+
25b0: 46 54 53 35 5f 44 41 54 41 5f 44 4c 49 5f 42 29  FTS5_DATA_DLI_B)
25c0: 29 20 2b 20 20 20 20 5c 0a 20 28 28 69 36 34 29  ) +    \. ((i64)
25d0: 28 64 6c 69 64 78 29 20 20 3c 3c 20 28 46 54 53  (dlidx)  << (FTS
25e0: 35 5f 44 41 54 41 5f 50 41 47 45 5f 42 20 2b 20  5_DATA_PAGE_B + 
25f0: 46 54 53 35 5f 44 41 54 41 5f 48 45 49 47 48 54  FTS5_DATA_HEIGHT
2600: 5f 42 29 29 20 2b 20 20 20 20 20 20 20 20 20 20  _B)) +          
2610: 20 20 20 20 20 20 20 20 5c 0a 20 28 28 69 36 34          \. ((i64
2620: 29 28 68 65 69 67 68 74 29 20 3c 3c 20 28 46 54  )(height) << (FT
2630: 53 35 5f 44 41 54 41 5f 50 41 47 45 5f 42 29 29  S5_DATA_PAGE_B))
2640: 20 2b 20 20 20 20 20 20 20 20 20 20 20 20 20 20   +              
2650: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2660: 20 20 20 20 20 20 20 20 20 5c 0a 20 28 28 69 36           \. ((i6
2670: 34 29 28 70 67 6e 6f 29 29 20 20 20 20 20 20 20  4)(pgno))       
2680: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2690: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26b0: 20 20 20 20 20 20 20 20 20 20 5c 0a 29 0a 0a 23            \.)..#
26c0: 64 65 66 69 6e 65 20 46 54 53 35 5f 53 45 47 4d  define FTS5_SEGM
26d0: 45 4e 54 5f 52 4f 57 49 44 28 73 65 67 69 64 2c  ENT_ROWID(segid,
26e0: 20 68 65 69 67 68 74 2c 20 70 67 6e 6f 29 20 66   height, pgno) f
26f0: 74 73 35 5f 64 72 69 28 73 65 67 69 64 2c 20 30  ts5_dri(segid, 0
2700: 2c 20 68 65 69 67 68 74 2c 20 70 67 6e 6f 29 0a  , height, pgno).
2710: 23 64 65 66 69 6e 65 20 46 54 53 35 5f 44 4c 49  #define FTS5_DLI
2720: 44 58 5f 52 4f 57 49 44 28 73 65 67 69 64 2c 20  DX_ROWID(segid, 
2730: 68 65 69 67 68 74 2c 20 70 67 6e 6f 29 20 20 20  height, pgno)   
2740: 66 74 73 35 5f 64 72 69 28 73 65 67 69 64 2c 20  fts5_dri(segid, 
2750: 31 2c 20 68 65 69 67 68 74 2c 20 70 67 6e 6f 29  1, height, pgno)
2760: 0a 0a 2f 2a 0a 2a 2a 20 4d 61 78 69 6d 75 6d 20  ../*.** Maximum 
2770: 73 65 67 6d 65 6e 74 73 20 70 65 72 6d 69 74 74  segments permitt
2780: 65 64 20 69 6e 20 61 20 73 69 6e 67 6c 65 20 69  ed in a single i
2790: 6e 64 65 78 20 0a 2a 2f 0a 23 64 65 66 69 6e 65  ndex .*/.#define
27a0: 20 46 54 53 35 5f 4d 41 58 5f 53 45 47 4d 45 4e   FTS5_MAX_SEGMEN
27b0: 54 20 32 30 30 30 0a 0a 23 69 66 64 65 66 20 53  T 2000..#ifdef S
27c0: 51 4c 49 54 45 5f 44 45 42 55 47 0a 69 6e 74 20  QLITE_DEBUG.int 
27d0: 73 71 6c 69 74 65 33 46 74 73 35 43 6f 72 72 75  sqlite3Fts5Corru
27e0: 70 74 28 29 20 7b 20 72 65 74 75 72 6e 20 53 51  pt() { return SQ
27f0: 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 56 54 41  LITE_CORRUPT_VTA
2800: 42 3b 20 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a  B; }.#endif.../*
2810: 0a 2a 2a 20 45 61 63 68 20 74 69 6d 65 20 61 20  .** Each time a 
2820: 62 6c 6f 62 20 69 73 20 72 65 61 64 20 66 72 6f  blob is read fro
2830: 6d 20 74 68 65 20 25 5f 64 61 74 61 20 74 61 62  m the %_data tab
2840: 6c 65 2c 20 69 74 20 69 73 20 70 61 64 64 65 64  le, it is padded
2850: 20 77 69 74 68 20 74 68 69 73 0a 2a 2a 20 6d 61   with this.** ma
2860: 6e 79 20 7a 65 72 6f 20 62 79 74 65 73 2e 20 54  ny zero bytes. T
2870: 68 69 73 20 6d 61 6b 65 73 20 69 74 20 65 61 73  his makes it eas
2880: 69 65 72 20 74 6f 20 64 65 63 6f 64 65 20 74 68  ier to decode th
2890: 65 20 76 61 72 69 6f 75 73 20 72 65 63 6f 72 64  e various record
28a0: 20 66 6f 72 6d 61 74 73 0a 2a 2a 20 77 69 74 68   formats.** with
28b0: 6f 75 74 20 6f 76 65 72 72 65 61 64 69 6e 67 20  out overreading 
28c0: 69 66 20 74 68 65 20 72 65 63 6f 72 64 73 20 61  if the records a
28d0: 72 65 20 63 6f 72 72 75 70 74 2e 0a 2a 2f 0a 23  re corrupt..*/.#
28e0: 64 65 66 69 6e 65 20 46 54 53 35 5f 44 41 54 41  define FTS5_DATA
28f0: 5f 5a 45 52 4f 5f 50 41 44 44 49 4e 47 20 38 0a  _ZERO_PADDING 8.
2900: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
2910: 46 74 73 35 42 74 72 65 65 49 74 65 72 20 46 74  Fts5BtreeIter Ft
2920: 73 35 42 74 72 65 65 49 74 65 72 3b 0a 74 79 70  s5BtreeIter;.typ
2930: 65 64 65 66 20 73 74 72 75 63 74 20 46 74 73 35  edef struct Fts5
2940: 42 74 72 65 65 49 74 65 72 4c 65 76 65 6c 20 46  BtreeIterLevel F
2950: 74 73 35 42 74 72 65 65 49 74 65 72 4c 65 76 65  ts5BtreeIterLeve
2960: 6c 3b 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  l;.typedef struc
2970: 74 20 46 74 73 35 44 61 74 61 20 46 74 73 35 44  t Fts5Data Fts5D
2980: 61 74 61 3b 0a 74 79 70 65 64 65 66 20 73 74 72  ata;.typedef str
2990: 75 63 74 20 46 74 73 35 44 6c 69 64 78 49 74 65  uct Fts5DlidxIte
29a0: 72 20 46 74 73 35 44 6c 69 64 78 49 74 65 72 3b  r Fts5DlidxIter;
29b0: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
29c0: 46 74 73 35 44 6c 69 64 78 4c 76 6c 20 46 74 73  Fts5DlidxLvl Fts
29d0: 35 44 6c 69 64 78 4c 76 6c 3b 0a 74 79 70 65 64  5DlidxLvl;.typed
29e0: 65 66 20 73 74 72 75 63 74 20 46 74 73 35 44 6c  ef struct Fts5Dl
29f0: 69 64 78 57 72 69 74 65 72 20 46 74 73 35 44 6c  idxWriter Fts5Dl
2a00: 69 64 78 57 72 69 74 65 72 3b 0a 74 79 70 65 64  idxWriter;.typed
2a10: 65 66 20 73 74 72 75 63 74 20 46 74 73 35 4d 75  ef struct Fts5Mu
2a20: 6c 74 69 53 65 67 49 74 65 72 20 46 74 73 35 4d  ltiSegIter Fts5M
2a30: 75 6c 74 69 53 65 67 49 74 65 72 3b 0a 74 79 70  ultiSegIter;.typ
2a40: 65 64 65 66 20 73 74 72 75 63 74 20 46 74 73 35  edef struct Fts5
2a50: 4e 6f 64 65 49 74 65 72 20 46 74 73 35 4e 6f 64  NodeIter Fts5Nod
2a60: 65 49 74 65 72 3b 0a 74 79 70 65 64 65 66 20 73  eIter;.typedef s
2a70: 74 72 75 63 74 20 46 74 73 35 50 61 67 65 57 72  truct Fts5PageWr
2a80: 69 74 65 72 20 46 74 73 35 50 61 67 65 57 72 69  iter Fts5PageWri
2a90: 74 65 72 3b 0a 74 79 70 65 64 65 66 20 73 74 72  ter;.typedef str
2aa0: 75 63 74 20 46 74 73 35 53 65 67 49 74 65 72 20  uct Fts5SegIter 
2ab0: 46 74 73 35 53 65 67 49 74 65 72 3b 0a 74 79 70  Fts5SegIter;.typ
2ac0: 65 64 65 66 20 73 74 72 75 63 74 20 46 74 73 35  edef struct Fts5
2ad0: 44 6f 63 6c 69 73 74 49 74 65 72 20 46 74 73 35  DoclistIter Fts5
2ae0: 44 6f 63 6c 69 73 74 49 74 65 72 3b 0a 74 79 70  DoclistIter;.typ
2af0: 65 64 65 66 20 73 74 72 75 63 74 20 46 74 73 35  edef struct Fts5
2b00: 53 65 67 57 72 69 74 65 72 20 46 74 73 35 53 65  SegWriter Fts5Se
2b10: 67 57 72 69 74 65 72 3b 0a 74 79 70 65 64 65 66  gWriter;.typedef
2b20: 20 73 74 72 75 63 74 20 46 74 73 35 53 74 72 75   struct Fts5Stru
2b30: 63 74 75 72 65 20 46 74 73 35 53 74 72 75 63 74  cture Fts5Struct
2b40: 75 72 65 3b 0a 74 79 70 65 64 65 66 20 73 74 72  ure;.typedef str
2b50: 75 63 74 20 46 74 73 35 53 74 72 75 63 74 75 72  uct Fts5Structur
2b60: 65 4c 65 76 65 6c 20 46 74 73 35 53 74 72 75 63  eLevel Fts5Struc
2b70: 74 75 72 65 4c 65 76 65 6c 3b 0a 74 79 70 65 64  tureLevel;.typed
2b80: 65 66 20 73 74 72 75 63 74 20 46 74 73 35 53 74  ef struct Fts5St
2b90: 72 75 63 74 75 72 65 53 65 67 6d 65 6e 74 20 46  ructureSegment F
2ba0: 74 73 35 53 74 72 75 63 74 75 72 65 53 65 67 6d  ts5StructureSegm
2bb0: 65 6e 74 3b 0a 0a 73 74 72 75 63 74 20 46 74 73  ent;..struct Fts
2bc0: 35 44 61 74 61 20 7b 0a 20 20 75 38 20 2a 70 3b  5Data {.  u8 *p;
2bd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2be0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69            /* Poi
2bf0: 6e 74 65 72 20 74 6f 20 62 75 66 66 65 72 20 63  nter to buffer c
2c00: 6f 6e 74 61 69 6e 69 6e 67 20 72 65 63 6f 72 64  ontaining record
2c10: 20 2a 2f 0a 20 20 69 6e 74 20 6e 3b 20 20 20 20   */.  int n;    
2c20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c30: 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
2c40: 20 72 65 63 6f 72 64 20 69 6e 20 62 79 74 65 73   record in bytes
2c50: 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 4f 6e   */.};../*.** On
2c60: 65 20 6f 62 6a 65 63 74 20 70 65 72 20 25 5f 64  e object per %_d
2c70: 61 74 61 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74  ata table..*/.st
2c80: 72 75 63 74 20 46 74 73 35 49 6e 64 65 78 20 7b  ruct Fts5Index {
2c90: 0a 20 20 46 74 73 35 43 6f 6e 66 69 67 20 2a 70  .  Fts5Config *p
2ca0: 43 6f 6e 66 69 67 3b 20 20 20 20 20 20 20 20 20  Config;         
2cb0: 20 20 20 2f 2a 20 56 69 72 74 75 61 6c 20 74 61     /* Virtual ta
2cc0: 62 6c 65 20 63 6f 6e 66 69 67 75 72 61 74 69 6f  ble configuratio
2cd0: 6e 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 44 61  n */.  char *zDa
2ce0: 74 61 54 62 6c 3b 20 20 20 20 20 20 20 20 20 20  taTbl;          
2cf0: 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
2d00: 66 20 25 5f 64 61 74 61 20 74 61 62 6c 65 20 2a  f %_data table *
2d10: 2f 0a 20 20 69 6e 74 20 6e 57 6f 72 6b 55 6e 69  /.  int nWorkUni
2d20: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
2d30: 20 20 20 20 2f 2a 20 4c 65 61 66 20 70 61 67 65      /* Leaf page
2d40: 73 20 69 6e 20 61 20 22 75 6e 69 74 22 20 6f 66  s in a "unit" of
2d50: 20 77 6f 72 6b 20 2a 2f 0a 0a 20 20 2f 2a 0a 20   work */..  /*. 
2d60: 20 2a 2a 20 56 61 72 69 61 62 6c 65 73 20 72 65   ** Variables re
2d70: 6c 61 74 65 64 20 74 6f 20 74 68 65 20 61 63 63  lated to the acc
2d80: 75 6d 75 6c 61 74 69 6f 6e 20 6f 66 20 74 6f 6b  umulation of tok
2d90: 65 6e 73 20 61 6e 64 20 64 6f 63 6c 69 73 74 73  ens and doclists
2da0: 20 77 69 74 68 69 6e 20 74 68 65 0a 20 20 2a 2a   within the.  **
2db0: 20 69 6e 2d 6d 65 6d 6f 72 79 20 68 61 73 68 20   in-memory hash 
2dc0: 74 61 62 6c 65 73 20 62 65 66 6f 72 65 20 74 68  tables before th
2dd0: 65 79 20 61 72 65 20 66 6c 75 73 68 65 64 20 74  ey are flushed t
2de0: 6f 20 64 69 73 6b 2e 0a 20 20 2a 2f 0a 20 20 46  o disk..  */.  F
2df0: 74 73 35 48 61 73 68 20 2a 70 48 61 73 68 3b 20  ts5Hash *pHash; 
2e00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2e10: 2a 20 48 61 73 68 20 74 61 62 6c 65 20 66 6f 72  * Hash table for
2e20: 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 20   in-memory data 
2e30: 2a 2f 0a 20 20 69 6e 74 20 6e 4d 61 78 50 65 6e  */.  int nMaxPen
2e40: 64 69 6e 67 44 61 74 61 3b 20 20 20 20 20 20 20  dingData;       
2e50: 20 20 20 20 20 2f 2a 20 4d 61 78 20 70 65 6e 64       /* Max pend
2e60: 69 6e 67 20 64 61 74 61 20 62 65 66 6f 72 65 20  ing data before 
2e70: 66 6c 75 73 68 20 74 6f 20 64 69 73 6b 20 2a 2f  flush to disk */
2e80: 0a 20 20 69 6e 74 20 6e 50 65 6e 64 69 6e 67 44  .  int nPendingD
2e90: 61 74 61 3b 20 20 20 20 20 20 20 20 20 20 20 20  ata;            
2ea0: 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 62 79     /* Current by
2eb0: 74 65 73 20 6f 66 20 70 65 6e 64 69 6e 67 20 64  tes of pending d
2ec0: 61 74 61 20 2a 2f 0a 20 20 69 36 34 20 69 57 72  ata */.  i64 iWr
2ed0: 69 74 65 52 6f 77 69 64 3b 20 20 20 20 20 20 20  iteRowid;       
2ee0: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 77 69           /* Rowi
2ef0: 64 20 66 6f 72 20 63 75 72 72 65 6e 74 20 64 6f  d for current do
2f00: 63 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e 20  c being written 
2f10: 2a 2f 0a 20 20 46 74 73 35 42 75 66 66 65 72 20  */.  Fts5Buffer 
2f20: 73 63 72 61 74 63 68 3b 0a 0a 20 20 2f 2a 20 45  scratch;..  /* E
2f30: 72 72 6f 72 20 73 74 61 74 65 2e 20 2a 2f 0a 20  rror state. */. 
2f40: 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
2f50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f60: 20 2f 2a 20 43 75 72 72 65 6e 74 20 65 72 72 6f   /* Current erro
2f70: 72 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 2f 2a 20  r code */..  /* 
2f80: 53 74 61 74 65 20 75 73 65 64 20 62 79 20 74 68  State used by th
2f90: 65 20 66 74 73 35 44 61 74 61 58 58 58 28 29 20  e fts5DataXXX() 
2fa0: 66 75 6e 63 74 69 6f 6e 73 2e 20 2a 2f 0a 20 20  functions. */.  
2fb0: 73 71 6c 69 74 65 33 5f 62 6c 6f 62 20 2a 70 52  sqlite3_blob *pR
2fc0: 65 61 64 65 72 3b 20 20 20 20 20 20 20 20 20 20  eader;          
2fd0: 2f 2a 20 52 4f 20 69 6e 63 72 2d 62 6c 6f 62 20  /* RO incr-blob 
2fe0: 6f 70 65 6e 20 6f 6e 20 25 5f 64 61 74 61 20 74  open on %_data t
2ff0: 61 62 6c 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65  able */.  sqlite
3000: 33 5f 73 74 6d 74 20 2a 70 57 72 69 74 65 72 3b  3_stmt *pWriter;
3010: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 22 49 4e            /* "IN
3020: 53 45 52 54 20 2e 2e 2e 20 25 5f 64 61 74 61 20  SERT ... %_data 
3030: 56 41 4c 55 45 53 28 3f 2c 3f 29 22 20 2a 2f 0a  VALUES(?,?)" */.
3040: 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
3050: 70 44 65 6c 65 74 65 72 3b 20 20 20 20 20 20 20  pDeleter;       
3060: 20 20 2f 2a 20 22 44 45 4c 45 54 45 20 46 52 4f    /* "DELETE FRO
3070: 4d 20 25 5f 64 61 74 61 20 2e 2e 2e 20 69 64 3e  M %_data ... id>
3080: 3d 3f 20 41 4e 44 20 69 64 3c 3d 3f 22 20 2a 2f  =? AND id<=?" */
3090: 0a 20 20 69 6e 74 20 6e 52 65 61 64 3b 20 20 20  .  int nRead;   
30a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30b0: 20 20 20 2f 2a 20 54 6f 74 61 6c 20 6e 75 6d 62     /* Total numb
30c0: 65 72 20 6f 66 20 62 6c 6f 63 6b 73 20 72 65 61  er of blocks rea
30d0: 64 20 2a 2f 0a 7d 3b 0a 0a 73 74 72 75 63 74 20  d */.};..struct 
30e0: 46 74 73 35 44 6f 63 6c 69 73 74 49 74 65 72 20  Fts5DoclistIter 
30f0: 7b 0a 20 20 75 38 20 2a 61 3b 0a 20 20 69 6e 74  {.  u8 *a;.  int
3100: 20 6e 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20   n;.  int i;..  
3110: 2f 2a 20 4f 75 74 70 75 74 20 76 61 72 69 61 62  /* Output variab
3120: 6c 65 73 2e 20 61 50 6f 73 6c 69 73 74 3d 3d 30  les. aPoslist==0
3130: 20 61 74 20 45 4f 46 20 2a 2f 0a 20 20 69 36 34   at EOF */.  i64
3140: 20 69 52 6f 77 69 64 3b 0a 20 20 75 38 20 2a 61   iRowid;.  u8 *a
3150: 50 6f 73 6c 69 73 74 3b 0a 20 20 69 6e 74 20 6e  Poslist;.  int n
3160: 50 6f 73 6c 69 73 74 3b 0a 7d 3b 0a 0a 2f 2a 0a  Poslist;.};../*.
3170: 2a 2a 20 45 61 63 68 20 69 74 65 72 61 74 6f 72  ** Each iterator
3180: 20 75 73 65 64 20 62 79 20 65 78 74 65 72 6e 61   used by externa
3190: 6c 20 6d 6f 64 75 6c 65 73 20 69 73 20 61 6e 20  l modules is an 
31a0: 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 69 73  instance of this
31b0: 20 74 79 70 65 2e 0a 2a 2f 0a 73 74 72 75 63 74   type..*/.struct
31c0: 20 46 74 73 35 49 6e 64 65 78 49 74 65 72 20 7b   Fts5IndexIter {
31d0: 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 49  .  Fts5Index *pI
31e0: 6e 64 65 78 3b 0a 20 20 46 74 73 35 53 74 72 75  ndex;.  Fts5Stru
31f0: 63 74 75 72 65 20 2a 70 53 74 72 75 63 74 3b 0a  cture *pStruct;.
3200: 20 20 46 74 73 35 4d 75 6c 74 69 53 65 67 49 74    Fts5MultiSegIt
3210: 65 72 20 2a 70 4d 75 6c 74 69 3b 0a 20 20 46 74  er *pMulti;.  Ft
3220: 73 35 42 75 66 66 65 72 20 70 6f 73 6c 69 73 74  s5Buffer poslist
3230: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
3240: 20 42 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69   Buffer containi
3250: 6e 67 20 63 75 72 72 65 6e 74 20 70 6f 73 6c 69  ng current posli
3260: 73 74 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  st */.};../*.** 
3270: 54 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  The contents of 
3280: 74 68 65 20 22 73 74 72 75 63 74 75 72 65 22 20  the "structure" 
3290: 72 65 63 6f 72 64 20 66 6f 72 20 65 61 63 68 20  record for each 
32a0: 69 6e 64 65 78 20 61 72 65 20 72 65 70 72 65 73  index are repres
32b0: 65 6e 74 65 64 0a 2a 2a 20 75 73 69 6e 67 20 61  ented.** using a
32c0: 6e 20 46 74 73 35 53 74 72 75 63 74 75 72 65 20  n Fts5Structure 
32d0: 72 65 63 6f 72 64 20 69 6e 20 6d 65 6d 6f 72 79  record in memory
32e0: 2e 20 57 68 69 63 68 20 75 73 65 73 20 69 6e 73  . Which uses ins
32f0: 74 61 6e 63 65 73 20 6f 66 20 74 68 65 20 0a 2a  tances of the .*
3300: 2a 20 6f 74 68 65 72 20 46 74 73 35 53 74 72 75  * other Fts5Stru
3310: 63 74 75 72 65 58 58 58 20 74 79 70 65 73 20 61  ctureXXX types a
3320: 73 20 63 6f 6d 70 6f 6e 65 6e 74 73 2e 0a 2a 2f  s components..*/
3330: 0a 73 74 72 75 63 74 20 46 74 73 35 53 74 72 75  .struct Fts5Stru
3340: 63 74 75 72 65 53 65 67 6d 65 6e 74 20 7b 0a 20  ctureSegment {. 
3350: 20 69 6e 74 20 69 53 65 67 69 64 3b 20 20 20 20   int iSegid;    
3360: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3370: 20 2f 2a 20 53 65 67 6d 65 6e 74 20 69 64 20 2a   /* Segment id *
3380: 2f 0a 20 20 69 6e 74 20 6e 48 65 69 67 68 74 3b  /.  int nHeight;
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 48 65 69 67 68 74 20 6f 66      /* Height of
33b0: 20 73 65 67 6d 65 6e 74 20 62 2d 74 72 65 65 20   segment b-tree 
33c0: 2a 2f 0a 20 20 69 6e 74 20 70 67 6e 6f 46 69 72  */.  int pgnoFir
33d0: 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  st;             
33e0: 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 6c 65       /* First le
33f0: 61 66 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69  af page number i
3400: 6e 20 73 65 67 6d 65 6e 74 20 2a 2f 0a 20 20 69  n segment */.  i
3410: 6e 74 20 70 67 6e 6f 4c 61 73 74 3b 20 20 20 20  nt pgnoLast;    
3420: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
3430: 2a 20 4c 61 73 74 20 6c 65 61 66 20 70 61 67 65  * Last leaf page
3440: 20 6e 75 6d 62 65 72 20 69 6e 20 73 65 67 6d 65   number in segme
3450: 6e 74 20 2a 2f 0a 7d 3b 0a 73 74 72 75 63 74 20  nt */.};.struct 
3460: 46 74 73 35 53 74 72 75 63 74 75 72 65 4c 65 76  Fts5StructureLev
3470: 65 6c 20 7b 0a 20 20 69 6e 74 20 6e 4d 65 72 67  el {.  int nMerg
3480: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
3490: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
34a0: 20 6f 66 20 73 65 67 6d 65 6e 74 73 20 69 6e 20   of segments in 
34b0: 69 6e 63 72 2d 6d 65 72 67 65 20 2a 2f 0a 20 20  incr-merge */.  
34c0: 69 6e 74 20 6e 53 65 67 3b 20 20 20 20 20 20 20  int nSeg;       
34d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34e0: 2f 2a 20 54 6f 74 61 6c 20 6e 75 6d 62 65 72 20  /* Total number 
34f0: 6f 66 20 73 65 67 6d 65 6e 74 73 20 6f 6e 20 6c  of segments on l
3500: 65 76 65 6c 20 2a 2f 0a 20 20 46 74 73 35 53 74  evel */.  Fts5St
3510: 72 75 63 74 75 72 65 53 65 67 6d 65 6e 74 20 2a  ructureSegment *
3520: 61 53 65 67 3b 20 20 20 20 20 2f 2a 20 41 72 72  aSeg;     /* Arr
3530: 61 79 20 6f 66 20 73 65 67 6d 65 6e 74 73 2e 20  ay of segments. 
3540: 61 53 65 67 5b 30 5d 20 69 73 20 6f 6c 64 65 73  aSeg[0] is oldes
3550: 74 2e 20 2a 2f 0a 7d 3b 0a 73 74 72 75 63 74 20  t. */.};.struct 
3560: 46 74 73 35 53 74 72 75 63 74 75 72 65 20 7b 0a  Fts5Structure {.
3570: 20 20 75 36 34 20 6e 57 72 69 74 65 43 6f 75 6e    u64 nWriteCoun
3580: 74 65 72 3b 20 20 20 20 20 20 20 20 20 20 20 20  ter;            
3590: 20 20 2f 2a 20 54 6f 74 61 6c 20 6c 65 61 76 65    /* Total leave
35a0: 73 20 77 72 69 74 74 65 6e 20 74 6f 20 6c 65 76  s written to lev
35b0: 65 6c 20 30 20 2a 2f 0a 20 20 69 6e 74 20 6e 53  el 0 */.  int nS
35c0: 65 67 6d 65 6e 74 3b 20 20 20 20 20 20 20 20 20  egment;         
35d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 74            /* Tot
35e0: 61 6c 20 73 65 67 6d 65 6e 74 73 20 69 6e 20 74  al segments in t
35f0: 68 69 73 20 73 74 72 75 63 74 75 72 65 20 2a 2f  his structure */
3600: 0a 20 20 69 6e 74 20 6e 4c 65 76 65 6c 3b 20 20  .  int nLevel;  
3610: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3620: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
3630: 6c 65 76 65 6c 73 20 69 6e 20 74 68 69 73 20 69  levels in this i
3640: 6e 64 65 78 20 2a 2f 0a 20 20 46 74 73 35 53 74  ndex */.  Fts5St
3650: 72 75 63 74 75 72 65 4c 65 76 65 6c 20 61 4c 65  ructureLevel aLe
3660: 76 65 6c 5b 30 5d 3b 20 20 20 2f 2a 20 41 72 72  vel[0];   /* Arr
3670: 61 79 20 6f 66 20 6e 4c 65 76 65 6c 20 6c 65 76  ay of nLevel lev
3680: 65 6c 20 6f 62 6a 65 63 74 73 20 2a 2f 0a 7d 3b  el objects */.};
3690: 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 6f 62 6a 65 63  ../*.** An objec
36a0: 74 20 6f 66 20 74 79 70 65 20 46 74 73 35 53 65  t of type Fts5Se
36b0: 67 57 72 69 74 65 72 20 69 73 20 75 73 65 64 20  gWriter is used 
36c0: 74 6f 20 77 72 69 74 65 20 74 6f 20 73 65 67 6d  to write to segm
36d0: 65 6e 74 73 2e 0a 2a 2f 0a 73 74 72 75 63 74 20  ents..*/.struct 
36e0: 46 74 73 35 50 61 67 65 57 72 69 74 65 72 20 7b  Fts5PageWriter {
36f0: 0a 20 20 69 6e 74 20 70 67 6e 6f 3b 20 20 20 20  .  int pgno;    
3700: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3710: 20 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65     /* Page numbe
3720: 72 20 66 6f 72 20 74 68 69 73 20 70 61 67 65 20  r for this page 
3730: 2a 2f 0a 20 20 46 74 73 35 42 75 66 66 65 72 20  */.  Fts5Buffer 
3740: 62 75 66 3b 20 20 20 20 20 20 20 20 20 20 20 20  buf;            
3750: 20 20 20 20 20 2f 2a 20 42 75 66 66 65 72 20 63       /* Buffer c
3760: 6f 6e 74 61 69 6e 69 6e 67 20 70 61 67 65 20 64  ontaining page d
3770: 61 74 61 20 2a 2f 0a 20 20 46 74 73 35 42 75 66  ata */.  Fts5Buf
3780: 66 65 72 20 74 65 72 6d 3b 20 20 20 20 20 20 20  fer term;       
3790: 20 20 20 20 20 20 20 20 20 2f 2a 20 42 75 66 66           /* Buff
37a0: 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 70 72  er containing pr
37b0: 65 76 69 6f 75 73 20 74 65 72 6d 20 6f 6e 20 70  evious term on p
37c0: 61 67 65 20 2a 2f 0a 7d 3b 0a 73 74 72 75 63 74  age */.};.struct
37d0: 20 46 74 73 35 44 6c 69 64 78 57 72 69 74 65 72   Fts5DlidxWriter
37e0: 20 7b 0a 20 20 69 6e 74 20 70 67 6e 6f 3b 20 20   {.  int pgno;  
37f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3800: 20 20 20 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d       /* Page num
3810: 62 65 72 20 66 6f 72 20 74 68 69 73 20 70 61 67  ber for this pag
3820: 65 20 2a 2f 0a 20 20 69 6e 74 20 62 50 72 65 76  e */.  int bPrev
3830: 56 61 6c 69 64 3b 20 20 20 20 20 20 20 20 20 20  Valid;          
3840: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
3850: 66 20 69 50 72 65 76 20 69 73 20 76 61 6c 69 64  f iPrev is valid
3860: 20 2a 2f 0a 20 20 69 36 34 20 69 50 72 65 76 3b   */.  i64 iPrev;
3870: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3880: 20 20 20 20 20 20 2f 2a 20 50 72 65 76 69 6f 75        /* Previou
3890: 73 20 64 6f 63 69 64 20 76 61 6c 75 65 20 77 72  s docid value wr
38a0: 69 74 74 65 6e 20 74 6f 20 70 61 67 65 20 2a 2f  itten to page */
38b0: 0a 20 20 46 74 73 35 42 75 66 66 65 72 20 62 75  .  Fts5Buffer bu
38c0: 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  f;              
38d0: 20 20 20 2f 2a 20 42 75 66 66 65 72 20 63 6f 6e     /* Buffer con
38e0: 74 61 69 6e 69 6e 67 20 70 61 67 65 20 64 61 74  taining page dat
38f0: 61 20 2a 2f 0a 7d 3b 0a 73 74 72 75 63 74 20 46  a */.};.struct F
3900: 74 73 35 53 65 67 57 72 69 74 65 72 20 7b 0a 20  ts5SegWriter {. 
3910: 20 69 6e 74 20 69 53 65 67 69 64 3b 20 20 20 20   int iSegid;    
3920: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3930: 20 2f 2a 20 53 65 67 69 64 20 74 6f 20 77 72 69   /* Segid to wri
3940: 74 65 20 74 6f 20 2a 2f 0a 20 20 69 6e 74 20 6e  te to */.  int n
3950: 57 72 69 74 65 72 3b 20 20 20 20 20 20 20 20 20  Writer;         
3960: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
3970: 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20  mber of entries 
3980: 69 6e 20 61 57 72 69 74 65 72 20 2a 2f 0a 20 20  in aWriter */.  
3990: 46 74 73 35 50 61 67 65 57 72 69 74 65 72 20 2a  Fts5PageWriter *
39a0: 61 57 72 69 74 65 72 3b 20 20 20 20 20 20 20 20  aWriter;        
39b0: 2f 2a 20 41 72 72 61 79 20 6f 66 20 50 61 67 65  /* Array of Page
39c0: 57 72 69 74 65 72 20 6f 62 6a 65 63 74 73 20 2a  Writer objects *
39d0: 2f 0a 20 20 69 36 34 20 69 50 72 65 76 52 6f 77  /.  i64 iPrevRow
39e0: 69 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  id;             
39f0: 20 20 20 20 2f 2a 20 50 72 65 76 69 6f 75 73 20      /* Previous 
3a00: 64 6f 63 69 64 20 77 72 69 74 74 65 6e 20 74 6f  docid written to
3a10: 20 63 75 72 72 65 6e 74 20 6c 65 61 66 20 2a 2f   current leaf */
3a20: 0a 20 20 75 38 20 62 46 69 72 73 74 52 6f 77 69  .  u8 bFirstRowi
3a30: 64 49 6e 44 6f 63 6c 69 73 74 3b 20 20 20 20 20  dInDoclist;     
3a40: 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 6e 65     /* True if ne
3a50: 78 74 20 72 6f 77 69 64 20 69 73 20 66 69 72 73  xt rowid is firs
3a60: 74 20 69 6e 20 64 6f 63 6c 69 73 74 20 2a 2f 0a  t in doclist */.
3a70: 20 20 75 38 20 62 46 69 72 73 74 52 6f 77 69 64    u8 bFirstRowid
3a80: 49 6e 50 61 67 65 3b 20 20 20 20 20 20 20 20 20  InPage;         
3a90: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 6e 65 78    /* True if nex
3aa0: 74 20 72 6f 77 69 64 20 69 73 20 66 69 72 73 74  t rowid is first
3ab0: 20 69 6e 20 70 61 67 65 20 2a 2f 0a 20 20 75 38   in page */.  u8
3ac0: 20 62 46 69 72 73 74 54 65 72 6d 49 6e 50 61 67   bFirstTermInPag
3ad0: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  e;            /*
3ae0: 20 54 72 75 65 20 69 66 20 6e 65 78 74 20 74 65   True if next te
3af0: 72 6d 20 77 69 6c 6c 20 62 65 20 66 69 72 73 74  rm will be first
3b00: 20 69 6e 20 6c 65 61 66 20 2a 2f 0a 20 20 69 6e   in leaf */.  in
3b10: 74 20 6e 4c 65 61 66 57 72 69 74 74 65 6e 3b 20  t nLeafWritten; 
3b20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
3b30: 20 4e 75 6d 62 65 72 20 6f 66 20 6c 65 61 66 20   Number of leaf 
3b40: 70 61 67 65 73 20 77 72 69 74 74 65 6e 20 2a 2f  pages written */
3b50: 0a 20 20 69 6e 74 20 6e 45 6d 70 74 79 3b 20 20  .  int nEmpty;  
3b60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3b70: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
3b80: 63 6f 6e 74 69 67 75 6f 75 73 20 74 65 72 6d 2d  contiguous term-
3b90: 6c 65 73 73 20 6e 6f 64 65 73 20 2a 2f 0a 0a 20  less nodes */.. 
3ba0: 20 69 6e 74 20 6e 44 6c 69 64 78 3b 20 20 20 20   int nDlidx;    
3bb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3bc0: 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 64 20 73 69   /* Allocated si
3bd0: 7a 65 20 6f 66 20 61 44 6c 69 64 78 5b 5d 20 61  ze of aDlidx[] a
3be0: 72 72 61 79 20 2a 2f 0a 20 20 46 74 73 35 44 6c  rray */.  Fts5Dl
3bf0: 69 64 78 57 72 69 74 65 72 20 2a 61 44 6c 69 64  idxWriter *aDlid
3c00: 78 3b 20 20 20 20 20 20 20 20 2f 2a 20 41 72 72  x;        /* Arr
3c10: 61 79 20 6f 66 20 46 74 73 35 44 6c 69 64 78 57  ay of Fts5DlidxW
3c20: 72 69 74 65 72 20 6f 62 6a 65 63 74 73 20 2a 2f  riter objects */
3c30: 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 4f 62 6a 65 63  .};../*.** Objec
3c40: 74 20 66 6f 72 20 69 74 65 72 61 74 69 6e 67 20  t for iterating 
3c50: 74 68 72 6f 75 67 68 20 74 68 65 20 6d 65 72 67  through the merg
3c60: 65 64 20 72 65 73 75 6c 74 73 20 6f 66 20 6f 6e  ed results of on
3c70: 65 20 6f 72 20 6d 6f 72 65 20 73 65 67 6d 65 6e  e or more segmen
3c80: 74 73 2c 0a 2a 2a 20 76 69 73 69 74 69 6e 67 20  ts,.** visiting 
3c90: 65 61 63 68 20 74 65 72 6d 2f 64 6f 63 69 64 20  each term/docid 
3ca0: 70 61 69 72 20 69 6e 20 74 68 65 20 6d 65 72 67  pair in the merg
3cb0: 65 64 20 64 61 74 61 2e 0a 2a 2a 0a 2a 2a 20 6e  ed data..**.** n
3cc0: 53 65 67 20 69 73 20 61 6c 77 61 79 73 20 61 20  Seg is always a 
3cd0: 70 6f 77 65 72 20 6f 66 20 74 77 6f 20 67 72 65  power of two gre
3ce0: 61 74 65 72 20 74 68 61 6e 20 6f 72 20 65 71 75  ater than or equ
3cf0: 61 6c 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72  al to the number
3d00: 20 6f 66 0a 2a 2a 20 73 65 67 6d 65 6e 74 73 20   of.** segments 
3d10: 74 68 61 74 20 74 68 69 73 20 6f 62 6a 65 63 74  that this object
3d20: 20 69 73 20 6d 65 72 67 69 6e 67 20 64 61 74 61   is merging data
3d30: 20 66 72 6f 6d 2e 20 42 6f 74 68 20 74 68 65 20   from. Both the 
3d40: 61 53 65 67 5b 5d 20 61 6e 64 0a 2a 2a 20 61 46  aSeg[] and.** aF
3d50: 69 72 73 74 5b 5d 20 61 72 72 61 79 73 20 61 72  irst[] arrays ar
3d60: 65 20 73 69 7a 65 64 20 61 74 20 6e 53 65 67 20  e sized at nSeg 
3d70: 65 6e 74 72 69 65 73 2e 20 54 68 65 20 61 53 65  entries. The aSe
3d80: 67 5b 5d 20 61 72 72 61 79 20 69 73 20 70 61 64  g[] array is pad
3d90: 64 65 64 0a 2a 2a 20 77 69 74 68 20 7a 65 72 6f  ded.** with zero
3da0: 65 64 20 6f 62 6a 65 63 74 73 20 2d 20 74 68 65  ed objects - the
3db0: 73 65 20 61 72 65 20 68 61 6e 64 6c 65 64 20 61  se are handled a
3dc0: 73 20 69 66 20 74 68 65 79 20 77 65 72 65 20 69  s if they were i
3dd0: 74 65 72 61 74 6f 72 73 20 6f 70 65 6e 65 64 0a  terators opened.
3de0: 2a 2a 20 6f 6e 20 65 6d 70 74 79 20 73 65 67 6d  ** on empty segm
3df0: 65 6e 74 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ents..**.** The 
3e00: 72 65 73 75 6c 74 73 20 6f 66 20 63 6f 6d 70 61  results of compa
3e10: 72 69 6e 67 20 73 65 67 6d 65 6e 74 73 20 61 53  ring segments aS
3e20: 65 67 5b 4e 5d 20 61 6e 64 20 61 53 65 67 5b 4e  eg[N] and aSeg[N
3e30: 2b 31 5d 2c 20 77 68 65 72 65 20 4e 20 69 73 20  +1], where N is 
3e40: 61 6e 0a 2a 2a 20 65 76 65 6e 20 6e 75 6d 62 65  an.** even numbe
3e50: 72 2c 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20  r, is stored in 
3e60: 61 46 69 72 73 74 5b 28 6e 53 65 67 2b 4e 29 2f  aFirst[(nSeg+N)/
3e70: 32 5d 2e 20 54 68 65 20 22 72 65 73 75 6c 74 22  2]. The "result"
3e80: 20 6f 66 20 74 68 65 20 0a 2a 2a 20 63 6f 6d 70   of the .** comp
3e90: 61 72 69 73 6f 6e 20 69 6e 20 74 68 69 73 20 63  arison in this c
3ea0: 6f 6e 74 65 78 74 20 69 73 20 74 68 65 20 69 6e  ontext is the in
3eb0: 64 65 78 20 6f 66 20 74 68 65 20 69 74 65 72 61  dex of the itera
3ec0: 74 6f 72 20 74 68 61 74 20 63 75 72 72 65 6e 74  tor that current
3ed0: 6c 79 0a 2a 2a 20 70 6f 69 6e 74 73 20 74 6f 20  ly.** points to 
3ee0: 74 68 65 20 73 6d 61 6c 6c 65 72 20 74 65 72 6d  the smaller term
3ef0: 2f 72 6f 77 69 64 20 63 6f 6d 62 69 6e 61 74 69  /rowid combinati
3f00: 6f 6e 2e 20 49 74 65 72 61 74 6f 72 73 20 61 74  on. Iterators at
3f10: 20 45 4f 46 20 61 72 65 0a 2a 2a 20 63 6f 6e 73   EOF are.** cons
3f20: 69 64 65 72 65 64 20 74 6f 20 62 65 20 67 72 65  idered to be gre
3f30: 61 74 65 72 20 74 68 61 6e 20 61 6c 6c 20 6f 74  ater than all ot
3f40: 68 65 72 20 69 74 65 72 61 74 6f 72 73 2e 0a 2a  her iterators..*
3f50: 2a 0a 2a 2a 20 61 46 69 72 73 74 5b 31 5d 20 63  *.** aFirst[1] c
3f60: 6f 6e 74 61 69 6e 73 20 74 68 65 20 69 6e 64 65  ontains the inde
3f70: 78 20 69 6e 20 61 53 65 67 5b 5d 20 6f 66 20 74  x in aSeg[] of t
3f80: 68 65 20 69 74 65 72 61 74 6f 72 20 74 68 61 74  he iterator that
3f90: 20 70 6f 69 6e 74 73 20 74 6f 0a 2a 2a 20 74 68   points to.** th
3fa0: 65 20 73 6d 61 6c 6c 65 73 74 20 6b 65 79 20 6f  e smallest key o
3fb0: 76 65 72 61 6c 6c 2e 20 61 46 69 72 73 74 5b 30  verall. aFirst[0
3fc0: 5d 20 69 73 20 75 6e 75 73 65 64 2e 20 0a 2a 2f  ] is unused. .*/
3fd0: 0a 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  ..typedef struct
3fe0: 20 46 74 73 35 43 52 65 73 75 6c 74 20 46 74 73   Fts5CResult Fts
3ff0: 35 43 52 65 73 75 6c 74 3b 0a 73 74 72 75 63 74  5CResult;.struct
4000: 20 46 74 73 35 43 52 65 73 75 6c 74 20 7b 0a 20   Fts5CResult {. 
4010: 20 75 31 36 20 69 46 69 72 73 74 3b 20 20 20 20   u16 iFirst;    
4020: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4030: 20 2f 2a 20 61 53 65 67 5b 5d 20 69 6e 64 65 78   /* aSeg[] index
4040: 20 6f 66 20 66 69 72 73 74 65 73 74 20 69 74 65   of firstest ite
4050: 72 61 74 6f 72 20 2a 2f 0a 20 20 75 38 20 62 54  rator */.  u8 bT
4060: 65 72 6d 45 71 3b 20 20 20 20 20 20 20 20 20 20  ermEq;          
4070: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
4080: 75 65 20 69 66 20 74 68 65 20 74 65 72 6d 73 20  ue if the terms 
4090: 61 72 65 20 65 71 75 61 6c 20 2a 2f 0a 7d 3b 0a  are equal */.};.
40a0: 0a 73 74 72 75 63 74 20 46 74 73 35 4d 75 6c 74  .struct Fts5Mult
40b0: 69 53 65 67 49 74 65 72 20 7b 0a 20 20 69 6e 74  iSegIter {.  int
40c0: 20 6e 53 65 67 3b 20 20 20 20 20 20 20 20 20 20   nSeg;          
40d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
40e0: 53 69 7a 65 20 6f 66 20 61 53 65 67 5b 5d 20 61  Size of aSeg[] a
40f0: 72 72 61 79 20 2a 2f 0a 20 20 69 6e 74 20 62 52  rray */.  int bR
4100: 65 76 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ev;             
4110: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
4120: 65 20 74 6f 20 69 74 65 72 61 74 65 20 69 6e 20  e to iterate in 
4130: 72 65 76 65 72 73 65 20 6f 72 64 65 72 20 2a 2f  reverse order */
4140: 0a 20 20 69 6e 74 20 62 53 6b 69 70 45 6d 70 74  .  int bSkipEmpt
4150: 79 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  y;              
4160: 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 73 6b     /* True to sk
4170: 69 70 20 64 65 6c 65 74 65 64 20 65 6e 74 72 69  ip deleted entri
4180: 65 73 20 2a 2f 0a 20 20 69 6e 74 20 62 45 6f 66  es */.  int bEof
4190: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
41a0: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
41b0: 61 74 20 45 4f 46 20 2a 2f 0a 20 20 46 74 73 35  at EOF */.  Fts5
41c0: 53 65 67 49 74 65 72 20 2a 61 53 65 67 3b 20 20  SegIter *aSeg;  
41d0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
41e0: 72 72 61 79 20 6f 66 20 73 65 67 6d 65 6e 74 20  rray of segment 
41f0: 69 74 65 72 61 74 6f 72 73 20 2a 2f 0a 20 20 46  iterators */.  F
4200: 74 73 35 43 52 65 73 75 6c 74 20 2a 61 46 69 72  ts5CResult *aFir
4210: 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  st;            /
4220: 2a 20 43 75 72 72 65 6e 74 20 6d 65 72 67 65 20  * Current merge 
4230: 73 74 61 74 65 20 28 73 65 65 20 61 62 6f 76 65  state (see above
4240: 29 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 4f  ) */.};../*.** O
4250: 62 6a 65 63 74 20 66 6f 72 20 69 74 65 72 61 74  bject for iterat
4260: 69 6e 67 20 74 68 72 6f 75 67 68 20 61 20 73 69  ing through a si
4270: 6e 67 6c 65 20 73 65 67 6d 65 6e 74 2c 20 76 69  ngle segment, vi
4280: 73 69 74 69 6e 67 20 65 61 63 68 20 74 65 72 6d  siting each term
4290: 2f 64 6f 63 69 64 0a 2a 2a 20 70 61 69 72 20 69  /docid.** pair i
42a0: 6e 20 74 68 65 20 73 65 67 6d 65 6e 74 2e 0a 2a  n the segment..*
42b0: 2a 0a 2a 2a 20 70 53 65 67 3a 0a 2a 2a 20 20 20  *.** pSeg:.**   
42c0: 54 68 65 20 73 65 67 6d 65 6e 74 20 74 6f 20 69  The segment to i
42d0: 74 65 72 61 74 65 20 74 68 72 6f 75 67 68 2e 0a  terate through..
42e0: 2a 2a 0a 2a 2a 20 69 4c 65 61 66 50 67 6e 6f 3a  **.** iLeafPgno:
42f0: 0a 2a 2a 20 20 20 43 75 72 72 65 6e 74 20 6c 65  .**   Current le
4300: 61 66 20 70 61 67 65 20 6e 75 6d 62 65 72 20 77  af page number w
4310: 69 74 68 69 6e 20 73 65 67 6d 65 6e 74 2e 0a 2a  ithin segment..*
4320: 2a 0a 2a 2a 20 69 4c 65 61 66 4f 66 66 73 65 74  *.** iLeafOffset
4330: 3a 0a 2a 2a 20 20 20 42 79 74 65 20 6f 66 66 73  :.**   Byte offs
4340: 65 74 20 77 69 74 68 69 6e 20 74 68 65 20 63 75  et within the cu
4350: 72 72 65 6e 74 20 6c 65 61 66 20 74 68 61 74 20  rrent leaf that 
4360: 69 73 20 74 68 65 20 66 69 72 73 74 20 62 79 74  is the first byt
4370: 65 20 6f 66 20 74 68 65 20 0a 2a 2a 20 20 20 70  e of the .**   p
4380: 6f 73 69 74 69 6f 6e 20 6c 69 73 74 20 64 61 74  osition list dat
4390: 61 20 28 6f 6e 65 20 62 79 74 65 20 70 61 73 73  a (one byte pass
43a0: 65 64 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 2d  ed the position-
43b0: 6c 69 73 74 20 73 69 7a 65 20 66 69 65 6c 64 29  list size field)
43c0: 2e 0a 2a 2a 20 20 20 72 6f 77 69 64 20 66 69 65  ..**   rowid fie
43d0: 6c 64 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e  ld of the curren
43e0: 74 20 65 6e 74 72 79 2e 20 55 73 75 61 6c 6c 79  t entry. Usually
43f0: 20 74 68 69 73 20 69 73 20 74 68 65 20 73 69 7a   this is the siz
4400: 65 20 66 69 65 6c 64 20 6f 66 20 74 68 65 0a 2a  e field of the.*
4410: 2a 20 20 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73  *   position lis
4420: 74 20 64 61 74 61 2e 20 54 68 65 20 65 78 63 65  t data. The exce
4430: 70 74 69 6f 6e 20 69 73 20 69 66 20 74 68 65 20  ption is if the 
4440: 72 6f 77 69 64 20 66 6f 72 20 74 68 65 20 63 75  rowid for the cu
4450: 72 72 65 6e 74 20 65 6e 74 72 79 20 0a 2a 2a 20  rrent entry .** 
4460: 20 20 69 73 20 74 68 65 20 6c 61 73 74 20 74 68    is the last th
4470: 69 6e 67 20 6f 6e 20 74 68 65 20 6c 65 61 66 20  ing on the leaf 
4480: 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 70 4c 65 61  page..**.** pLea
4490: 66 3a 0a 2a 2a 20 20 20 42 75 66 66 65 72 20 63  f:.**   Buffer c
44a0: 6f 6e 74 61 69 6e 69 6e 67 20 63 75 72 72 65 6e  ontaining curren
44b0: 74 20 6c 65 61 66 20 70 61 67 65 20 64 61 74 61  t leaf page data
44c0: 2e 20 53 65 74 20 74 6f 20 4e 55 4c 4c 20 61 74  . Set to NULL at
44d0: 20 45 4f 46 2e 0a 2a 2a 0a 2a 2a 20 69 54 65 72   EOF..**.** iTer
44e0: 6d 4c 65 61 66 50 67 6e 6f 2c 20 69 54 65 72 6d  mLeafPgno, iTerm
44f0: 4c 65 61 66 4f 66 66 73 65 74 3a 0a 2a 2a 20 20  LeafOffset:.**  
4500: 20 4c 65 61 66 20 70 61 67 65 20 6e 75 6d 62 65   Leaf page numbe
4510: 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65  r containing the
4520: 20 6c 61 73 74 20 74 65 72 6d 20 72 65 61 64 20   last term read 
4530: 66 72 6f 6d 20 74 68 65 20 73 65 67 6d 65 6e 74  from the segment
4540: 2e 20 41 6e 64 0a 2a 2a 20 20 20 74 68 65 20 6f  . And.**   the o
4550: 66 66 73 65 74 20 69 6d 6d 65 64 69 61 74 65 6c  ffset immediatel
4560: 79 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20  y following the 
4570: 74 65 72 6d 20 64 61 74 61 2e 0a 2a 2a 0a 2a 2a  term data..**.**
4580: 20 66 6c 61 67 73 3a 0a 2a 2a 20 20 20 4d 61 73   flags:.**   Mas
4590: 6b 20 6f 66 20 46 54 53 35 5f 53 45 47 49 54 45  k of FTS5_SEGITE
45a0: 52 5f 58 58 58 20 76 61 6c 75 65 73 2e 20 49 6e  R_XXX values. In
45b0: 74 65 72 70 72 65 74 65 64 20 61 73 20 66 6f 6c  terpreted as fol
45c0: 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 46 54  lows:.**.**   FT
45d0: 53 35 5f 53 45 47 49 54 45 52 5f 4f 4e 45 54 45  S5_SEGITER_ONETE
45e0: 52 4d 3a 0a 2a 2a 20 20 20 20 20 49 66 20 73 65  RM:.**     If se
45f0: 74 2c 20 73 65 74 20 74 68 65 20 69 74 65 72 61  t, set the itera
4600: 74 6f 72 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20  tor to point to 
4610: 45 4f 46 20 61 66 74 65 72 20 74 68 65 20 63 75  EOF after the cu
4620: 72 72 65 6e 74 20 64 6f 63 6c 69 73 74 20 0a 2a  rrent doclist .*
4630: 2a 20 20 20 20 20 68 61 73 20 62 65 65 6e 20 65  *     has been e
4640: 78 68 61 75 73 74 65 64 2e 20 44 6f 20 6e 6f 74  xhausted. Do not
4650: 20 70 72 6f 63 65 65 64 20 74 6f 20 74 68 65 20   proceed to the 
4660: 6e 65 78 74 20 74 65 72 6d 20 69 6e 20 74 68 65  next term in the
4670: 20 73 65 67 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20   segment..**.** 
4680: 20 20 46 54 53 35 5f 53 45 47 49 54 45 52 5f 52    FTS5_SEGITER_R
4690: 45 56 45 52 53 45 3a 0a 2a 2a 20 20 20 20 20 54  EVERSE:.**     T
46a0: 68 69 73 20 66 6c 61 67 20 69 73 20 6f 6e 6c 79  his flag is only
46b0: 20 65 76 65 72 20 73 65 74 20 69 66 20 46 54 53   ever set if FTS
46c0: 35 5f 53 45 47 49 54 45 52 5f 4f 4e 45 54 45 52  5_SEGITER_ONETER
46d0: 4d 20 69 73 20 61 6c 73 6f 20 73 65 74 2e 20 49  M is also set. I
46e0: 66 0a 2a 2a 20 20 20 20 20 69 74 20 69 73 20 73  f.**     it is s
46f0: 65 74 2c 20 69 74 65 72 61 74 65 20 74 68 72 6f  et, iterate thro
4700: 75 67 68 20 64 6f 63 69 64 73 20 69 6e 20 64 65  ugh docids in de
4710: 73 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 20 69  scending order i
4720: 6e 73 74 65 61 64 20 6f 66 20 74 68 65 0a 2a 2a  nstead of the.**
4730: 20 20 20 20 20 64 65 66 61 75 6c 74 20 61 73 63       default asc
4740: 65 6e 64 69 6e 67 20 6f 72 64 65 72 2e 0a 2a 2a  ending order..**
4750: 0a 2a 2a 20 69 52 6f 77 69 64 4f 66 66 73 65 74  .** iRowidOffset
4760: 2f 6e 52 6f 77 69 64 4f 66 66 73 65 74 2f 61 52  /nRowidOffset/aR
4770: 6f 77 69 64 4f 66 66 73 65 74 3a 0a 2a 2a 20 20  owidOffset:.**  
4780: 20 20 20 54 68 65 73 65 20 61 72 65 20 75 73 65     These are use
4790: 64 20 69 66 20 74 68 65 20 46 54 53 35 5f 53 45  d if the FTS5_SE
47a0: 47 49 54 45 52 5f 52 45 56 45 52 53 45 20 66 6c  GITER_REVERSE fl
47b0: 61 67 20 69 73 20 73 65 74 2e 0a 2a 2a 0a 2a 2a  ag is set..**.**
47c0: 20 20 20 20 20 46 6f 72 20 65 61 63 68 20 72 6f       For each ro
47d0: 77 69 64 20 6f 6e 20 74 68 65 20 70 61 67 65 20  wid on the page 
47e0: 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f  corresponding to
47f0: 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 65 72   the current ter
4800: 6d 2c 20 74 68 65 0a 2a 2a 20 20 20 20 20 63 6f  m, the.**     co
4810: 72 72 65 73 70 6f 6e 64 69 6e 67 20 61 52 6f 77  rresponding aRow
4820: 69 64 4f 66 66 73 65 74 5b 5d 20 65 6e 74 72 79  idOffset[] entry
4830: 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 62   is set to the b
4840: 79 74 65 20 6f 66 66 73 65 74 20 6f 66 20 74 68  yte offset of th
4850: 65 0a 2a 2a 20 20 20 20 20 73 74 61 72 74 20 6f  e.**     start o
4860: 66 20 74 68 65 20 22 70 6f 73 69 74 69 6f 6e 2d  f the "position-
4870: 6c 69 73 74 2d 73 69 7a 65 22 20 66 69 65 6c 64  list-size" field
4880: 20 77 69 74 68 69 6e 20 74 68 65 20 70 61 67 65   within the page
4890: 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 46 74 73 35  ..*/.struct Fts5
48a0: 53 65 67 49 74 65 72 20 7b 0a 20 20 46 74 73 35  SegIter {.  Fts5
48b0: 53 74 72 75 63 74 75 72 65 53 65 67 6d 65 6e 74  StructureSegment
48c0: 20 2a 70 53 65 67 3b 20 20 20 20 20 2f 2a 20 53   *pSeg;     /* S
48d0: 65 67 6d 65 6e 74 20 74 6f 20 69 74 65 72 61 74  egment to iterat
48e0: 65 20 74 68 72 6f 75 67 68 20 2a 2f 0a 20 20 69  e through */.  i
48f0: 6e 74 20 66 6c 61 67 73 3b 20 20 20 20 20 20 20  nt flags;       
4900: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
4910: 2a 20 4d 61 73 6b 20 6f 66 20 63 6f 6e 66 69 67  * Mask of config
4920: 75 72 61 74 69 6f 6e 20 66 6c 61 67 73 20 2a 2f  uration flags */
4930: 0a 20 20 69 6e 74 20 69 4c 65 61 66 50 67 6e 6f  .  int iLeafPgno
4940: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
4950: 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 6c 65     /* Current le
4960: 61 66 20 70 61 67 65 20 6e 75 6d 62 65 72 20 2a  af page number *
4970: 2f 0a 20 20 46 74 73 35 44 61 74 61 20 2a 70 4c  /.  Fts5Data *pL
4980: 65 61 66 3b 20 20 20 20 20 20 20 20 20 20 20 20  eaf;            
4990: 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 6c      /* Current l
49a0: 65 61 66 20 64 61 74 61 20 2a 2f 0a 20 20 46 74  eaf data */.  Ft
49b0: 73 35 44 61 74 61 20 2a 70 4e 65 78 74 4c 65 61  s5Data *pNextLea
49c0: 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  f;            /*
49d0: 20 4c 65 61 66 20 70 61 67 65 20 28 69 4c 65 61   Leaf page (iLea
49e0: 66 50 67 6e 6f 2b 31 29 20 2a 2f 0a 20 20 69 6e  fPgno+1) */.  in
49f0: 74 20 69 4c 65 61 66 4f 66 66 73 65 74 3b 20 20  t iLeafOffset;  
4a00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
4a10: 20 42 79 74 65 20 6f 66 66 73 65 74 20 77 69 74   Byte offset wit
4a20: 68 69 6e 20 63 75 72 72 65 6e 74 20 6c 65 61 66  hin current leaf
4a30: 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68 65 20 70 61   */..  /* The pa
4a40: 67 65 20 61 6e 64 20 6f 66 66 73 65 74 20 66 72  ge and offset fr
4a50: 6f 6d 20 77 68 69 63 68 20 74 68 65 20 63 75 72  om which the cur
4a60: 72 65 6e 74 20 74 65 72 6d 20 77 61 73 20 72 65  rent term was re
4a70: 61 64 2e 20 54 68 65 20 6f 66 66 73 65 74 20 0a  ad. The offset .
4a80: 20 20 2a 2a 20 69 73 20 74 68 65 20 6f 66 66 73    ** is the offs
4a90: 65 74 20 6f 66 20 74 68 65 20 66 69 72 73 74 20  et of the first 
4aa0: 72 6f 77 69 64 20 69 6e 20 74 68 65 20 63 75 72  rowid in the cur
4ab0: 72 65 6e 74 20 64 6f 63 6c 69 73 74 2e 20 20 2a  rent doclist.  *
4ac0: 2f 0a 20 20 69 6e 74 20 69 54 65 72 6d 4c 65 61  /.  int iTermLea
4ad0: 66 50 67 6e 6f 3b 0a 20 20 69 6e 74 20 69 54 65  fPgno;.  int iTe
4ae0: 72 6d 4c 65 61 66 4f 66 66 73 65 74 3b 0a 0a 20  rmLeafOffset;.. 
4af0: 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e   /* The followin
4b00: 67 20 61 72 65 20 6f 6e 6c 79 20 75 73 65 64 20  g are only used 
4b10: 69 66 20 74 68 65 20 46 54 53 35 5f 53 45 47 49  if the FTS5_SEGI
4b20: 54 45 52 5f 52 45 56 45 52 53 45 20 66 6c 61 67  TER_REVERSE flag
4b30: 20 69 73 20 73 65 74 2e 20 2a 2f 0a 20 20 69 6e   is set. */.  in
4b40: 74 20 69 52 6f 77 69 64 4f 66 66 73 65 74 3b 20  t iRowidOffset; 
4b50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
4b60: 20 43 75 72 72 65 6e 74 20 65 6e 74 72 79 20 69   Current entry i
4b70: 6e 20 61 52 6f 77 69 64 4f 66 66 73 65 74 5b 5d  n aRowidOffset[]
4b80: 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 6f 77 69 64   */.  int nRowid
4b90: 4f 66 66 73 65 74 3b 20 20 20 20 20 20 20 20 20  Offset;         
4ba0: 20 20 20 20 20 20 2f 2a 20 41 6c 6c 6f 63 61 74        /* Allocat
4bb0: 65 64 20 73 69 7a 65 20 6f 66 20 61 52 6f 77 69  ed size of aRowi
4bc0: 64 4f 66 66 73 65 74 5b 5d 20 61 72 72 61 79 20  dOffset[] array 
4bd0: 2a 2f 0a 20 20 69 6e 74 20 2a 61 52 6f 77 69 64  */.  int *aRowid
4be0: 4f 66 66 73 65 74 3b 20 20 20 20 20 20 20 20 20  Offset;         
4bf0: 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66       /* Array of
4c00: 20 6f 66 66 73 65 74 20 74 6f 20 72 6f 77 69 64   offset to rowid
4c10: 20 66 69 65 6c 64 73 20 2a 2f 0a 0a 20 20 46 74   fields */..  Ft
4c20: 73 35 44 6c 69 64 78 49 74 65 72 20 2a 70 44 6c  s5DlidxIter *pDl
4c30: 69 64 78 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  idx;          /*
4c40: 20 49 66 20 74 68 65 72 65 20 69 73 20 61 20 64   If there is a d
4c50: 6f 63 6c 69 73 74 2d 69 6e 64 65 78 20 2a 2f 0a  oclist-index */.
4c60: 0a 20 20 2f 2a 20 56 61 72 69 61 62 6c 65 73 20  .  /* Variables 
4c70: 70 6f 70 75 6c 61 74 65 64 20 62 61 73 65 64 20  populated based 
4c80: 6f 6e 20 63 75 72 72 65 6e 74 20 65 6e 74 72 79  on current entry
4c90: 2e 20 2a 2f 0a 20 20 46 74 73 35 42 75 66 66 65  . */.  Fts5Buffe
4ca0: 72 20 74 65 72 6d 3b 20 20 20 20 20 20 20 20 20  r term;         
4cb0: 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e         /* Curren
4cc0: 74 20 74 65 72 6d 20 2a 2f 0a 20 20 69 36 34 20  t term */.  i64 
4cd0: 69 52 6f 77 69 64 3b 20 20 20 20 20 20 20 20 20  iRowid;         
4ce0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
4cf0: 75 72 72 65 6e 74 20 72 6f 77 69 64 20 2a 2f 0a  urrent rowid */.
4d00: 20 20 69 6e 74 20 6e 50 6f 73 3b 20 20 20 20 20    int nPos;     
4d10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4d20: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62    /* Number of b
4d30: 79 74 65 73 20 69 6e 20 63 75 72 72 65 6e 74 20  ytes in current 
4d40: 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74 20 2a 2f  position list */
4d50: 0a 20 20 69 6e 74 20 62 44 65 6c 3b 20 20 20 20  .  int bDel;    
4d60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4d70: 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68     /* True if th
4d80: 65 20 64 65 6c 65 74 65 20 66 6c 61 67 20 69 73  e delete flag is
4d90: 20 73 65 74 20 2a 2f 0a 7d 3b 0a 0a 23 64 65 66   set */.};..#def
4da0: 69 6e 65 20 46 54 53 35 5f 53 45 47 49 54 45 52  ine FTS5_SEGITER
4db0: 5f 4f 4e 45 54 45 52 4d 20 30 78 30 31 0a 23 64  _ONETERM 0x01.#d
4dc0: 65 66 69 6e 65 20 46 54 53 35 5f 53 45 47 49 54  efine FTS5_SEGIT
4dd0: 45 52 5f 52 45 56 45 52 53 45 20 30 78 30 32 0a  ER_REVERSE 0x02.
4de0: 0a 0a 2f 2a 0a 2a 2a 20 4f 62 6a 65 63 74 20 66  ../*.** Object f
4df0: 6f 72 20 69 74 65 72 61 74 69 6e 67 20 74 68 72  or iterating thr
4e00: 6f 75 67 68 20 74 68 65 20 63 6f 6e 65 6e 74 73  ough the conents
4e10: 20 6f 66 20 61 20 73 69 6e 67 6c 65 20 69 6e 74   of a single int
4e20: 65 72 6e 61 6c 20 6e 6f 64 65 20 69 6e 20 0a 2a  ernal node in .*
4e30: 2a 20 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a 73 74 72  * memory..*/.str
4e40: 75 63 74 20 46 74 73 35 4e 6f 64 65 49 74 65 72  uct Fts5NodeIter
4e50: 20 7b 0a 20 20 2f 2a 20 49 6e 74 65 72 6e 61 6c   {.  /* Internal
4e60: 2e 20 53 65 74 20 61 6e 64 20 6d 61 6e 61 67 65  . Set and manage
4e70: 64 20 62 79 20 66 74 73 35 4e 6f 64 65 49 74 65  d by fts5NodeIte
4e80: 72 58 58 58 28 29 20 66 75 6e 63 74 69 6f 6e 73  rXXX() functions
4e90: 2e 20 45 78 63 65 70 74 2c 20 0a 20 20 2a 2a 20  . Except, .  ** 
4ea0: 74 68 65 20 45 4f 46 20 74 65 73 74 20 66 6f 72  the EOF test for
4eb0: 20 74 68 65 20 69 74 65 72 61 74 6f 72 20 69 73   the iterator is
4ec0: 20 28 46 74 73 35 4e 6f 64 65 49 74 65 72 2e 61   (Fts5NodeIter.a
4ed0: 44 61 74 61 3d 3d 30 29 2e 20 20 2a 2f 0a 20 20  Data==0).  */.  
4ee0: 63 6f 6e 73 74 20 75 38 20 2a 61 44 61 74 61 3b  const u8 *aData;
4ef0: 0a 20 20 69 6e 74 20 6e 44 61 74 61 3b 0a 20 20  .  int nData;.  
4f00: 69 6e 74 20 69 4f 66 66 3b 0a 0a 20 20 2f 2a 20  int iOff;..  /* 
4f10: 4f 75 74 70 75 74 20 76 61 72 69 61 62 6c 65 73  Output variables
4f20: 20 2a 2f 0a 20 20 46 74 73 35 42 75 66 66 65 72   */.  Fts5Buffer
4f30: 20 74 65 72 6d 3b 0a 20 20 69 6e 74 20 6e 45 6d   term;.  int nEm
4f40: 70 74 79 3b 0a 20 20 69 6e 74 20 69 43 68 69 6c  pty;.  int iChil
4f50: 64 3b 0a 20 20 69 6e 74 20 62 44 6c 69 64 78 3b  d;.  int bDlidx;
4f60: 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e  .};../*.** An in
4f70: 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f  stance of the fo
4f80: 6c 6c 6f 77 69 6e 67 20 74 79 70 65 20 69 73 20  llowing type is 
4f90: 75 73 65 64 20 74 6f 20 69 74 65 72 61 74 65 20  used to iterate 
4fa0: 74 68 72 6f 75 67 68 20 74 68 65 20 63 6f 6e 74  through the cont
4fb0: 65 6e 74 73 0a 2a 2a 20 6f 66 20 61 20 64 6f 63  ents.** of a doc
4fc0: 6c 69 73 74 2d 69 6e 64 65 78 20 72 65 63 6f 72  list-index recor
4fd0: 64 2e 0a 2a 2a 0a 2a 2a 20 70 44 61 74 61 3a 0a  d..**.** pData:.
4fe0: 2a 2a 20 20 20 52 65 63 6f 72 64 20 63 6f 6e 74  **   Record cont
4ff0: 61 69 6e 69 6e 67 20 74 68 65 20 64 6f 63 6c 69  aining the docli
5000: 73 74 2d 69 6e 64 65 78 20 64 61 74 61 2e 0a 2a  st-index data..*
5010: 2a 0a 2a 2a 20 62 45 6f 66 3a 0a 2a 2a 20 20 20  *.** bEof:.**   
5020: 53 65 74 20 74 6f 20 74 72 75 65 20 6f 6e 63 65  Set to true once
5030: 20 69 74 65 72 61 74 6f 72 20 68 61 73 20 72 65   iterator has re
5040: 61 63 68 65 64 20 45 4f 46 2e 0a 2a 2a 0a 2a 2a  ached EOF..**.**
5050: 20 69 4f 66 66 3a 0a 2a 2a 20 20 20 53 65 74 20   iOff:.**   Set 
5060: 74 6f 20 74 68 65 20 63 75 72 72 65 6e 74 20 6f  to the current o
5070: 66 66 73 65 74 20 77 69 74 68 69 6e 20 72 65 63  ffset within rec
5080: 6f 72 64 20 70 44 61 74 61 2e 0a 2a 2f 0a 73 74  ord pData..*/.st
5090: 72 75 63 74 20 46 74 73 35 44 6c 69 64 78 4c 76  ruct Fts5DlidxLv
50a0: 6c 20 7b 0a 20 20 46 74 73 35 44 61 74 61 20 2a  l {.  Fts5Data *
50b0: 70 44 61 74 61 3b 20 20 20 20 20 20 20 20 20 20  pData;          
50c0: 20 20 20 20 2f 2a 20 44 61 74 61 20 66 6f 72 20      /* Data for 
50d0: 63 75 72 72 65 6e 74 20 70 61 67 65 20 6f 66 20  current page of 
50e0: 74 68 69 73 20 6c 65 76 65 6c 20 2a 2f 0a 20 20  this level */.  
50f0: 69 6e 74 20 69 4f 66 66 3b 20 20 20 20 20 20 20  int iOff;       
5100: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
5110: 20 43 75 72 72 65 6e 74 20 6f 66 66 73 65 74 20   Current offset 
5120: 69 6e 74 6f 20 70 44 61 74 61 20 2a 2f 0a 20 20  into pData */.  
5130: 69 6e 74 20 62 45 6f 66 3b 20 20 20 20 20 20 20  int bEof;       
5140: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
5150: 20 41 74 20 45 4f 46 20 61 6c 72 65 61 64 79 20   At EOF already 
5160: 2a 2f 0a 20 20 69 6e 74 20 69 46 69 72 73 74 4f  */.  int iFirstO
5170: 66 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ff;             
5180: 20 20 20 2f 2a 20 55 73 65 64 20 62 79 20 72 65     /* Used by re
5190: 76 65 72 73 65 20 69 74 65 72 61 74 6f 72 73 20  verse iterators 
51a0: 2a 2f 0a 0a 20 20 2f 2a 20 4f 75 74 70 75 74 20  */..  /* Output 
51b0: 76 61 72 69 61 62 6c 65 73 20 2a 2f 0a 20 20 69  variables */.  i
51c0: 6e 74 20 69 4c 65 61 66 50 67 6e 6f 3b 20 20 20  nt iLeafPgno;   
51d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
51e0: 50 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 63  Page number of c
51f0: 75 72 72 65 6e 74 20 6c 65 61 66 20 70 61 67 65  urrent leaf page
5200: 20 2a 2f 0a 20 20 69 36 34 20 69 52 6f 77 69 64   */.  i64 iRowid
5210: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
5220: 20 20 20 20 2f 2a 20 46 69 72 73 74 20 72 6f 77      /* First row
5230: 69 64 20 6f 6e 20 6c 65 61 66 20 69 4c 65 61 66  id on leaf iLeaf
5240: 50 67 6e 6f 20 2a 2f 0a 7d 3b 0a 73 74 72 75 63  Pgno */.};.struc
5250: 74 20 46 74 73 35 44 6c 69 64 78 49 74 65 72 20  t Fts5DlidxIter 
5260: 7b 0a 20 20 69 6e 74 20 6e 4c 76 6c 3b 0a 20 20  {.  int nLvl;.  
5270: 69 6e 74 20 69 53 65 67 69 64 3b 0a 20 20 46 74  int iSegid;.  Ft
5280: 73 35 44 6c 69 64 78 4c 76 6c 20 61 4c 76 6c 5b  s5DlidxLvl aLvl[
5290: 31 5d 3b 0a 7d 3b 0a 0a 0a 0a 2f 2a 0a 2a 2a 20  1];.};..../*.** 
52a0: 41 6e 20 46 74 73 35 42 74 72 65 65 49 74 65 72  An Fts5BtreeIter
52b0: 20 6f 62 6a 65 63 74 20 69 73 20 75 73 65 64 20   object is used 
52c0: 74 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f 75  to iterate throu
52d0: 67 68 20 61 6c 6c 20 65 6e 74 72 69 65 73 20 69  gh all entries i
52e0: 6e 20 74 68 65 0a 2a 2a 20 62 2d 74 72 65 65 20  n the.** b-tree 
52f0: 68 69 65 72 61 72 63 68 79 20 62 65 6c 6f 6e 67  hierarchy belong
5300: 69 6e 67 20 74 6f 20 61 20 73 69 6e 67 6c 65 20  ing to a single 
5310: 66 74 73 35 20 73 65 67 6d 65 6e 74 2e 20 49 6e  fts5 segment. In
5320: 20 74 68 69 73 20 63 61 73 65 20 74 68 65 0a 2a   this case the.*
5330: 2a 20 22 62 2d 74 72 65 65 20 68 69 65 72 61 72  * "b-tree hierar
5340: 63 68 79 22 20 69 73 20 61 6c 6c 20 62 2d 74 72  chy" is all b-tr
5350: 65 65 20 6e 6f 64 65 73 20 65 78 63 65 70 74 20  ee nodes except 
5360: 6c 65 61 76 65 73 2e 20 45 61 63 68 20 65 6e 74  leaves. Each ent
5370: 72 79 20 69 6e 20 74 68 65 0a 2a 2a 20 62 2d 74  ry in the.** b-t
5380: 72 65 65 20 68 69 65 72 61 72 63 68 79 20 63 6f  ree hierarchy co
5390: 6e 73 69 73 74 73 20 6f 66 20 74 68 65 20 66 6f  nsists of the fo
53a0: 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20  llowing:.**.**  
53b0: 20 69 4c 65 61 66 3a 20 20 54 68 65 20 70 61 67   iLeaf:  The pag
53c0: 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20  e number of the 
53d0: 6c 65 61 66 20 70 61 67 65 20 74 68 65 20 65 6e  leaf page the en
53e0: 74 72 79 20 70 6f 69 6e 74 73 20 74 6f 2e 0a 2a  try points to..*
53f0: 2a 0a 2a 2a 20 20 20 74 65 72 6d 3a 20 20 20 41  *.**   term:   A
5400: 20 73 70 6c 69 74 2d 6b 65 79 20 74 68 61 74 20   split-key that 
5410: 61 6c 6c 20 74 65 72 6d 73 20 6f 6e 20 6c 65 61  all terms on lea
5420: 66 20 70 61 67 65 20 24 69 4c 65 61 66 20 6d 75  f page $iLeaf mu
5430: 73 74 20 62 65 20 67 72 65 61 74 65 72 0a 2a 2a  st be greater.**
5440: 20 20 20 20 20 20 20 20 20 20 20 74 68 61 6e 20             than 
5450: 6f 72 20 65 71 75 61 6c 20 74 6f 2e 20 54 68 65  or equal to. The
5460: 20 22 74 65 72 6d 22 20 61 73 73 6f 63 69 61 74   "term" associat
5470: 65 64 20 77 69 74 68 20 74 68 65 20 66 69 72 73  ed with the firs
5480: 74 20 62 2d 74 72 65 65 0a 2a 2a 20 20 20 20 20  t b-tree.**     
5490: 20 20 20 20 20 20 68 69 65 72 61 72 63 68 79 20        hierarchy 
54a0: 65 6e 74 72 79 20 28 74 68 65 20 6f 6e 65 20 74  entry (the one t
54b0: 68 61 74 20 70 6f 69 6e 74 73 20 74 6f 20 6c 65  hat points to le
54c0: 61 66 20 70 61 67 65 20 31 29 20 69 73 20 61 6c  af page 1) is al
54d0: 77 61 79 73 20 0a 2a 2a 20 20 20 20 20 20 20 20  ways .**        
54e0: 20 20 20 61 6e 20 65 6d 70 74 79 20 73 74 72 69     an empty stri
54f0: 6e 67 2e 0a 2a 2a 0a 2a 2a 20 20 20 6e 45 6d 70  ng..**.**   nEmp
5500: 74 79 3a 20 54 68 65 20 6e 75 6d 62 65 72 20 6f  ty: The number o
5510: 66 20 65 6d 70 74 79 20 28 74 65 72 6d 6c 65 73  f empty (termles
5520: 73 29 20 6c 65 61 66 20 70 61 67 65 73 20 74 68  s) leaf pages th
5530: 61 74 20 69 6d 6d 65 64 69 61 74 65 6c 79 0a 2a  at immediately.*
5540: 2a 20 20 20 20 20 20 20 20 20 20 20 66 6f 6c 6c  *           foll
5550: 6f 77 69 6e 67 20 69 4c 65 61 66 2e 0a 2a 2a 0a  owing iLeaf..**.
5560: 2a 2a 20 54 68 65 20 46 74 73 35 42 74 72 65 65  ** The Fts5Btree
5570: 49 74 65 72 20 6f 62 6a 65 63 74 20 69 73 20 6f  Iter object is o
5580: 6e 6c 79 20 75 73 65 64 20 61 73 20 70 61 72 74  nly used as part
5590: 20 6f 66 20 74 68 65 20 69 6e 74 65 67 72 69 74   of the integrit
55a0: 79 2d 63 68 65 63 6b 20 63 6f 64 65 2e 0a 2a 2f  y-check code..*/
55b0: 0a 73 74 72 75 63 74 20 46 74 73 35 42 74 72 65  .struct Fts5Btre
55c0: 65 49 74 65 72 4c 65 76 65 6c 20 7b 0a 20 20 46  eIterLevel {.  F
55d0: 74 73 35 4e 6f 64 65 49 74 65 72 20 73 3b 20 20  ts5NodeIter s;  
55e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
55f0: 2a 20 49 74 65 72 61 74 6f 72 20 66 6f 72 20 74  * Iterator for t
5600: 68 65 20 63 75 72 72 65 6e 74 20 6e 6f 64 65 20  he current node 
5610: 2a 2f 0a 20 20 46 74 73 35 44 61 74 61 20 2a 70  */.  Fts5Data *p
5620: 44 61 74 61 3b 20 20 20 20 20 20 20 20 20 20 20  Data;           
5630: 20 20 20 20 20 2f 2a 20 44 61 74 61 20 66 6f 72       /* Data for
5640: 20 74 68 65 20 63 75 72 72 65 6e 74 20 6e 6f 64   the current nod
5650: 65 20 2a 2f 0a 7d 3b 0a 73 74 72 75 63 74 20 46  e */.};.struct F
5660: 74 73 35 42 74 72 65 65 49 74 65 72 20 7b 0a 20  ts5BtreeIter {. 
5670: 20 46 74 73 35 49 6e 64 65 78 20 2a 70 3b 20 20   Fts5Index *p;  
5680: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5690: 20 2f 2a 20 46 54 53 35 20 62 61 63 6b 65 6e 64   /* FTS5 backend
56a0: 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 46 74 73   object */.  Fts
56b0: 35 53 74 72 75 63 74 75 72 65 53 65 67 6d 65 6e  5StructureSegmen
56c0: 74 20 2a 70 53 65 67 3b 20 20 20 20 20 2f 2a 20  t *pSeg;     /* 
56d0: 49 74 65 72 61 74 65 20 74 68 72 6f 75 67 68 20  Iterate through 
56e0: 74 68 69 73 20 73 65 67 6d 65 6e 74 27 73 20 62  this segment's b
56f0: 2d 74 72 65 65 20 2a 2f 0a 20 20 69 6e 74 20 6e  -tree */.  int n
5700: 4c 76 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  Lvl;            
5710: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
5720: 7a 65 20 6f 66 20 61 4c 76 6c 5b 5d 20 61 72 72  ze of aLvl[] arr
5730: 61 79 20 2a 2f 0a 20 20 46 74 73 35 42 74 72 65  ay */.  Fts5Btre
5740: 65 49 74 65 72 4c 65 76 65 6c 20 2a 61 4c 76 6c  eIterLevel *aLvl
5750: 3b 20 20 20 20 20 20 20 2f 2a 20 4c 65 76 65 6c  ;       /* Level
5760: 20 66 6f 72 20 65 61 63 68 20 74 69 65 72 20 6f   for each tier o
5770: 66 20 62 2d 74 72 65 65 20 2a 2f 0a 0a 20 20 2f  f b-tree */..  /
5780: 2a 20 4f 75 74 70 75 74 20 76 61 72 69 61 62 6c  * Output variabl
5790: 65 73 20 2a 2f 0a 20 20 46 74 73 35 42 75 66 66  es */.  Fts5Buff
57a0: 65 72 20 74 65 72 6d 3b 20 20 20 20 20 20 20 20  er term;        
57b0: 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65          /* Curre
57c0: 6e 74 20 74 65 72 6d 20 2a 2f 0a 20 20 69 6e 74  nt term */.  int
57d0: 20 69 4c 65 61 66 3b 20 20 20 20 20 20 20 20 20   iLeaf;         
57e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
57f0: 4c 65 61 66 20 63 6f 6e 74 61 69 6e 69 6e 67 20  Leaf containing 
5800: 74 65 72 6d 73 20 3e 3d 20 63 75 72 72 65 6e 74  terms >= current
5810: 20 74 65 72 6d 20 2a 2f 0a 20 20 69 6e 74 20 6e   term */.  int n
5820: 45 6d 70 74 79 3b 20 20 20 20 20 20 20 20 20 20  Empty;          
5830: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
5840: 6d 62 65 72 20 6f 66 20 22 65 6d 70 74 79 22 20  mber of "empty" 
5850: 6c 65 61 76 65 73 20 66 6f 6c 6c 6f 77 69 6e 67  leaves following
5860: 20 69 4c 65 61 66 20 2a 2f 0a 20 20 69 6e 74 20   iLeaf */.  int 
5870: 62 45 6f 66 3b 20 20 20 20 20 20 20 20 20 20 20  bEof;           
5880: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
5890: 65 74 20 74 6f 20 74 72 75 65 20 61 74 20 45 4f  et to true at EO
58a0: 46 20 2a 2f 0a 20 20 69 6e 74 20 62 44 6c 69 64  F */.  int bDlid
58b0: 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  x;              
58c0: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
58d0: 66 20 74 68 65 72 65 20 65 78 69 73 74 73 20 61  f there exists a
58e0: 20 64 6c 69 64 78 20 2a 2f 0a 7d 3b 0a 0a 0a 73   dlidx */.};...s
58f0: 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 50  tatic void fts5P
5900: 75 74 55 31 36 28 75 38 20 2a 61 4f 75 74 2c 20  utU16(u8 *aOut, 
5910: 75 31 36 20 69 56 61 6c 29 7b 0a 20 20 61 4f 75  u16 iVal){.  aOu
5920: 74 5b 30 5d 20 3d 20 28 69 56 61 6c 3e 3e 38 29  t[0] = (iVal>>8)
5930: 3b 0a 20 20 61 4f 75 74 5b 31 5d 20 3d 20 28 69  ;.  aOut[1] = (i
5940: 56 61 6c 26 30 78 46 46 29 3b 0a 7d 0a 0a 73 74  Val&0xFF);.}..st
5950: 61 74 69 63 20 75 31 36 20 66 74 73 35 47 65 74  atic u16 fts5Get
5960: 55 31 36 28 63 6f 6e 73 74 20 75 38 20 2a 61 49  U16(const u8 *aI
5970: 6e 29 7b 0a 20 20 72 65 74 75 72 6e 20 28 28 75  n){.  return ((u
5980: 31 36 29 61 49 6e 5b 30 5d 20 3c 3c 20 38 29 20  16)aIn[0] << 8) 
5990: 2b 20 61 49 6e 5b 31 5d 3b 0a 7d 20 0a 0a 2f 2a  + aIn[1];.} ../*
59a0: 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 64  .** Allocate and
59b0: 20 72 65 74 75 72 6e 20 61 20 62 75 66 66 65 72   return a buffer
59c0: 20 61 74 20 6c 65 61 73 74 20 6e 42 79 74 65 20   at least nByte 
59d0: 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2e 0a 2a  bytes in size..*
59e0: 2a 0a 2a 2a 20 49 66 20 61 6e 20 4f 4f 4d 20 65  *.** If an OOM e
59f0: 72 72 6f 72 20 69 73 20 65 6e 63 6f 75 6e 74 65  rror is encounte
5a00: 72 65 64 2c 20 72 65 74 75 72 6e 20 4e 55 4c 4c  red, return NULL
5a10: 20 61 6e 64 20 73 65 74 20 74 68 65 20 65 72 72   and set the err
5a20: 6f 72 20 63 6f 64 65 20 69 6e 0a 2a 2a 20 74 68  or code in.** th
5a30: 65 20 46 74 73 35 49 6e 64 65 78 20 68 61 6e 64  e Fts5Index hand
5a40: 6c 65 20 70 61 73 73 65 64 20 61 73 20 74 68 65  le passed as the
5a50: 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 2e   first argument.
5a60: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
5a70: 2a 66 74 73 35 49 64 78 4d 61 6c 6c 6f 63 28 46  *fts5IdxMalloc(F
5a80: 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 69 6e 74  ts5Index *p, int
5a90: 20 6e 42 79 74 65 29 7b 0a 20 20 72 65 74 75 72   nByte){.  retur
5aa0: 6e 20 73 71 6c 69 74 65 33 46 74 73 35 4d 61 6c  n sqlite3Fts5Mal
5ab0: 6c 6f 63 5a 65 72 6f 28 26 70 2d 3e 72 63 2c 20  locZero(&p->rc, 
5ac0: 6e 42 79 74 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  nByte);.}../*.**
5ad0: 20 43 6f 6d 70 61 72 65 20 74 68 65 20 63 6f 6e   Compare the con
5ae0: 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70 4c 65  tents of the pLe
5af0: 66 74 20 62 75 66 66 65 72 20 77 69 74 68 20 74  ft buffer with t
5b00: 68 65 20 70 52 69 67 68 74 2f 6e 52 69 67 68 74  he pRight/nRight
5b10: 20 62 6c 6f 62 2e 0a 2a 2a 0a 2a 2a 20 52 65 74   blob..**.** Ret
5b20: 75 72 6e 20 2d 76 65 20 69 66 20 70 4c 65 66 74  urn -ve if pLeft
5b30: 20 69 73 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e   is smaller than
5b40: 20 70 52 69 67 68 74 2c 20 30 20 69 66 20 74 68   pRight, 0 if th
5b50: 65 79 20 61 72 65 20 65 71 75 61 6c 20 6f 72 0a  ey are equal or.
5b60: 2a 2a 20 2b 76 65 20 69 66 20 70 52 69 67 68 74  ** +ve if pRight
5b70: 20 69 73 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e   is smaller than
5b80: 20 70 4c 65 66 74 2e 20 49 6e 20 6f 74 68 65 72   pLeft. In other
5b90: 20 77 6f 72 64 73 3a 0a 2a 2a 0a 2a 2a 20 20 20   words:.**.**   
5ba0: 20 20 72 65 73 20 3d 20 2a 70 4c 65 66 74 20 2d    res = *pLeft -
5bb0: 20 2a 70 52 69 67 68 74 0a 2a 2f 0a 73 74 61 74   *pRight.*/.stat
5bc0: 69 63 20 69 6e 74 20 66 74 73 35 42 75 66 66 65  ic int fts5Buffe
5bd0: 72 43 6f 6d 70 61 72 65 42 6c 6f 62 28 0a 20 20  rCompareBlob(.  
5be0: 46 74 73 35 42 75 66 66 65 72 20 2a 70 4c 65 66  Fts5Buffer *pLef
5bf0: 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t,              
5c00: 2f 2a 20 4c 65 66 74 20 68 61 6e 64 20 73 69 64  /* Left hand sid
5c10: 65 20 6f 66 20 63 6f 6d 70 61 72 69 73 6f 6e 20  e of comparison 
5c20: 2a 2f 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 70  */.  const u8 *p
5c30: 52 69 67 68 74 2c 20 69 6e 74 20 6e 52 69 67 68  Right, int nRigh
5c40: 74 20 20 20 20 2f 2a 20 52 69 67 68 74 20 68 61  t    /* Right ha
5c50: 6e 64 20 73 69 64 65 20 6f 66 20 63 6f 6d 70 61  nd side of compa
5c60: 72 69 73 6f 6e 20 2a 2f 0a 29 7b 0a 20 20 69 6e  rison */.){.  in
5c70: 74 20 6e 43 6d 70 20 3d 20 4d 49 4e 28 70 4c 65  t nCmp = MIN(pLe
5c80: 66 74 2d 3e 6e 2c 20 6e 52 69 67 68 74 29 3b 0a  ft->n, nRight);.
5c90: 20 20 69 6e 74 20 72 65 73 20 3d 20 6d 65 6d 63    int res = memc
5ca0: 6d 70 28 70 4c 65 66 74 2d 3e 70 2c 20 70 52 69  mp(pLeft->p, pRi
5cb0: 67 68 74 2c 20 6e 43 6d 70 29 3b 0a 20 20 72 65  ght, nCmp);.  re
5cc0: 74 75 72 6e 20 28 72 65 73 3d 3d 30 20 3f 20 28  turn (res==0 ? (
5cd0: 70 4c 65 66 74 2d 3e 6e 20 2d 20 6e 52 69 67 68  pLeft->n - nRigh
5ce0: 74 29 20 3a 20 72 65 73 29 3b 0a 7d 0a 0a 0a 2f  t) : res);.}.../
5cf0: 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65 20 74 68 65  *.** Compare the
5d00: 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
5d10: 20 74 77 6f 20 62 75 66 66 65 72 73 20 75 73 69   two buffers usi
5d20: 6e 67 20 6d 65 6d 63 6d 70 28 29 2e 20 49 66 20  ng memcmp(). If 
5d30: 6f 6e 65 20 62 75 66 66 65 72 0a 2a 2a 20 69 73  one buffer.** is
5d40: 20 61 20 70 72 65 66 69 78 20 6f 66 20 74 68 65   a prefix of the
5d50: 20 6f 74 68 65 72 2c 20 69 74 20 69 73 20 63 6f   other, it is co
5d60: 6e 73 69 64 65 72 65 64 20 74 68 65 20 6c 65 73  nsidered the les
5d70: 73 65 72 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  ser..**.** Retur
5d80: 6e 20 2d 76 65 20 69 66 20 70 4c 65 66 74 20 69  n -ve if pLeft i
5d90: 73 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 70  s smaller than p
5da0: 52 69 67 68 74 2c 20 30 20 69 66 20 74 68 65 79  Right, 0 if they
5db0: 20 61 72 65 20 65 71 75 61 6c 20 6f 72 0a 2a 2a   are equal or.**
5dc0: 20 2b 76 65 20 69 66 20 70 52 69 67 68 74 20 69   +ve if pRight i
5dd0: 73 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 70  s smaller than p
5de0: 4c 65 66 74 2e 20 49 6e 20 6f 74 68 65 72 20 77  Left. In other w
5df0: 6f 72 64 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  ords:.**.**     
5e00: 72 65 73 20 3d 20 2a 70 4c 65 66 74 20 2d 20 2a  res = *pLeft - *
5e10: 70 52 69 67 68 74 0a 2a 2f 0a 73 74 61 74 69 63  pRight.*/.static
5e20: 20 69 6e 74 20 66 74 73 35 42 75 66 66 65 72 43   int fts5BufferC
5e30: 6f 6d 70 61 72 65 28 46 74 73 35 42 75 66 66 65  ompare(Fts5Buffe
5e40: 72 20 2a 70 4c 65 66 74 2c 20 46 74 73 35 42 75  r *pLeft, Fts5Bu
5e50: 66 66 65 72 20 2a 70 52 69 67 68 74 29 7b 0a 20  ffer *pRight){. 
5e60: 20 69 6e 74 20 6e 43 6d 70 20 3d 20 4d 49 4e 28   int nCmp = MIN(
5e70: 70 4c 65 66 74 2d 3e 6e 2c 20 70 52 69 67 68 74  pLeft->n, pRight
5e80: 2d 3e 6e 29 3b 0a 20 20 69 6e 74 20 72 65 73 20  ->n);.  int res 
5e90: 3d 20 6d 65 6d 63 6d 70 28 70 4c 65 66 74 2d 3e  = memcmp(pLeft->
5ea0: 70 2c 20 70 52 69 67 68 74 2d 3e 70 2c 20 6e 43  p, pRight->p, nC
5eb0: 6d 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 72  mp);.  return (r
5ec0: 65 73 3d 3d 30 20 3f 20 28 70 4c 65 66 74 2d 3e  es==0 ? (pLeft->
5ed0: 6e 20 2d 20 70 52 69 67 68 74 2d 3e 6e 29 20 3a  n - pRight->n) :
5ee0: 20 72 65 73 29 3b 0a 7d 0a 0a 23 69 66 64 65 66   res);.}..#ifdef
5ef0: 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 73 74   SQLITE_DEBUG.st
5f00: 61 74 69 63 20 69 6e 74 20 66 74 73 35 42 6c 6f  atic int fts5Blo
5f10: 62 43 6f 6d 70 61 72 65 28 0a 20 20 63 6f 6e 73  bCompare(.  cons
5f20: 74 20 75 38 20 2a 70 4c 65 66 74 2c 20 69 6e 74  t u8 *pLeft, int
5f30: 20 6e 4c 65 66 74 2c 20 0a 20 20 63 6f 6e 73 74   nLeft, .  const
5f40: 20 75 38 20 2a 70 52 69 67 68 74 2c 20 69 6e 74   u8 *pRight, int
5f50: 20 6e 52 69 67 68 74 0a 29 7b 0a 20 20 69 6e 74   nRight.){.  int
5f60: 20 6e 43 6d 70 20 3d 20 4d 49 4e 28 6e 4c 65 66   nCmp = MIN(nLef
5f70: 74 2c 20 6e 52 69 67 68 74 29 3b 0a 20 20 69 6e  t, nRight);.  in
5f80: 74 20 72 65 73 20 3d 20 6d 65 6d 63 6d 70 28 70  t res = memcmp(p
5f90: 4c 65 66 74 2c 20 70 52 69 67 68 74 2c 20 6e 43  Left, pRight, nC
5fa0: 6d 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 72  mp);.  return (r
5fb0: 65 73 3d 3d 30 20 3f 20 28 6e 4c 65 66 74 20 2d  es==0 ? (nLeft -
5fc0: 20 6e 52 69 67 68 74 29 20 3a 20 72 65 73 29 3b   nRight) : res);
5fd0: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a  .}.#endif.../*.*
5fe0: 2a 20 43 6c 6f 73 65 20 74 68 65 20 72 65 61 64  * Close the read
5ff0: 2d 6f 6e 6c 79 20 62 6c 6f 62 20 68 61 6e 64 6c  -only blob handl
6000: 65 2c 20 69 66 20 69 74 20 69 73 20 6f 70 65 6e  e, if it is open
6010: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
6020: 20 66 74 73 35 43 6c 6f 73 65 52 65 61 64 65 72   fts5CloseReader
6030: 28 46 74 73 35 49 6e 64 65 78 20 2a 70 29 7b 0a  (Fts5Index *p){.
6040: 20 20 69 66 28 20 70 2d 3e 70 52 65 61 64 65 72    if( p->pReader
6050: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
6060: 62 6c 6f 62 20 2a 70 52 65 61 64 65 72 20 3d 20  blob *pReader = 
6070: 70 2d 3e 70 52 65 61 64 65 72 3b 0a 20 20 20 20  p->pReader;.    
6080: 70 2d 3e 70 52 65 61 64 65 72 20 3d 20 30 3b 0a  p->pReader = 0;.
6090: 20 20 20 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62      sqlite3_blob
60a0: 5f 63 6c 6f 73 65 28 70 52 65 61 64 65 72 29 3b  _close(pReader);
60b0: 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 46  .  }.}..static F
60c0: 74 73 35 44 61 74 61 20 2a 66 74 73 35 44 61 74  ts5Data *fts5Dat
60d0: 61 52 65 61 64 4f 72 42 75 66 66 65 72 28 0a 20  aReadOrBuffer(. 
60e0: 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 0a   Fts5Index *p, .
60f0: 20 20 46 74 73 35 42 75 66 66 65 72 20 2a 70 42    Fts5Buffer *pB
6100: 75 66 2c 20 0a 20 20 69 36 34 20 69 52 6f 77 69  uf, .  i64 iRowi
6110: 64 0a 29 7b 0a 20 20 46 74 73 35 44 61 74 61 20  d.){.  Fts5Data 
6120: 2a 70 52 65 74 20 3d 20 30 3b 0a 20 20 69 66 28  *pRet = 0;.  if(
6130: 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
6140: 4b 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 20  K ){.    int rc 
6150: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20  = SQLITE_OK;..  
6160: 20 20 69 66 28 20 70 2d 3e 70 52 65 61 64 65 72    if( p->pReader
6170: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 69   ){.      /* Thi
6180: 73 20 63 61 6c 6c 20 6d 61 79 20 72 65 74 75 72  s call may retur
6190: 6e 20 53 51 4c 49 54 45 5f 41 42 4f 52 54 20 69  n SQLITE_ABORT i
61a0: 66 20 74 68 65 72 65 20 68 61 73 20 62 65 65 6e  f there has been
61b0: 20 61 20 73 61 76 65 70 6f 69 6e 74 0a 20 20 20   a savepoint.   
61c0: 20 20 20 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 73     ** rollback s
61d0: 69 6e 63 65 20 69 74 20 77 61 73 20 6c 61 73 74  ince it was last
61e0: 20 75 73 65 64 2e 20 49 6e 20 74 68 69 73 20 63   used. In this c
61f0: 61 73 65 20 61 20 6e 65 77 20 62 6c 6f 62 20 68  ase a new blob h
6200: 61 6e 64 6c 65 0a 20 20 20 20 20 20 2a 2a 20 69  andle.      ** i
6210: 73 20 72 65 71 75 69 72 65 64 2e 20 20 2a 2f 0a  s required.  */.
6220: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62 6c        sqlite3_bl
6230: 6f 62 20 2a 70 42 6c 6f 62 20 3d 20 70 2d 3e 70  ob *pBlob = p->p
6240: 52 65 61 64 65 72 3b 0a 20 20 20 20 20 20 70 2d  Reader;.      p-
6250: 3e 70 52 65 61 64 65 72 20 3d 20 30 3b 0a 20 20  >pReader = 0;.  
6260: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
6270: 5f 62 6c 6f 62 5f 72 65 6f 70 65 6e 28 70 42 6c  _blob_reopen(pBl
6280: 6f 62 2c 20 69 52 6f 77 69 64 29 3b 0a 20 20 20  ob, iRowid);.   
6290: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 52     assert( p->pR
62a0: 65 61 64 65 72 3d 3d 30 20 29 3b 0a 20 20 20 20  eader==0 );.    
62b0: 20 20 70 2d 3e 70 52 65 61 64 65 72 20 3d 20 70    p->pReader = p
62c0: 42 6c 6f 62 3b 0a 20 20 20 20 20 20 69 66 28 20  Blob;.      if( 
62d0: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
62e0: 0a 20 20 20 20 20 20 20 20 66 74 73 35 43 6c 6f  .        fts5Clo
62f0: 73 65 52 65 61 64 65 72 28 70 29 3b 0a 20 20 20  seReader(p);.   
6300: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72     }.      if( r
6310: 63 3d 3d 53 51 4c 49 54 45 5f 41 42 4f 52 54 20  c==SQLITE_ABORT 
6320: 29 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  ) rc = SQLITE_OK
6330: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
6340: 49 66 20 74 68 65 20 62 6c 6f 62 20 68 61 6e 64  If the blob hand
6350: 6c 65 20 69 73 20 6e 6f 74 20 79 65 74 20 6f 70  le is not yet op
6360: 65 6e 2c 20 6f 70 65 6e 20 61 6e 64 20 73 65 65  en, open and see
6370: 6b 20 69 74 2e 20 4f 74 68 65 72 77 69 73 65 2c  k it. Otherwise,
6380: 20 75 73 65 0a 20 20 20 20 2a 2a 20 74 68 65 20   use.    ** the 
6390: 62 6c 6f 62 5f 72 65 6f 70 65 6e 28 29 20 41 50  blob_reopen() AP
63a0: 49 20 74 6f 20 72 65 73 65 65 6b 20 74 68 65 20  I to reseek the 
63b0: 65 78 69 73 74 69 6e 67 20 62 6c 6f 62 20 68 61  existing blob ha
63c0: 6e 64 6c 65 2e 20 20 2a 2f 0a 20 20 20 20 69 66  ndle.  */.    if
63d0: 28 20 70 2d 3e 70 52 65 61 64 65 72 3d 3d 30 20  ( p->pReader==0 
63e0: 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  && rc==SQLITE_OK
63f0: 20 29 7b 0a 20 20 20 20 20 20 46 74 73 35 43 6f   ){.      Fts5Co
6400: 6e 66 69 67 20 2a 70 43 6f 6e 66 69 67 20 3d 20  nfig *pConfig = 
6410: 70 2d 3e 70 43 6f 6e 66 69 67 3b 0a 20 20 20 20  p->pConfig;.    
6420: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 62    rc = sqlite3_b
6430: 6c 6f 62 5f 6f 70 65 6e 28 70 43 6f 6e 66 69 67  lob_open(pConfig
6440: 2d 3e 64 62 2c 20 0a 20 20 20 20 20 20 20 20 20  ->db, .         
6450: 20 70 43 6f 6e 66 69 67 2d 3e 7a 44 62 2c 20 70   pConfig->zDb, p
6460: 2d 3e 7a 44 61 74 61 54 62 6c 2c 20 22 62 6c 6f  ->zDataTbl, "blo
6470: 63 6b 22 2c 20 69 52 6f 77 69 64 2c 20 30 2c 20  ck", iRowid, 0, 
6480: 26 70 2d 3e 70 52 65 61 64 65 72 0a 20 20 20 20  &p->pReader.    
6490: 20 20 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20    );.    }..    
64a0: 2f 2a 20 49 66 20 65 69 74 68 65 72 20 6f 66 20  /* If either of 
64b0: 74 68 65 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62  the sqlite3_blob
64c0: 5f 6f 70 65 6e 28 29 20 6f 72 20 73 71 6c 69 74  _open() or sqlit
64d0: 65 33 5f 62 6c 6f 62 5f 72 65 6f 70 65 6e 28 29  e3_blob_reopen()
64e0: 20 63 61 6c 6c 73 0a 20 20 20 20 2a 2a 20 61 62   calls.    ** ab
64f0: 6f 76 65 20 72 65 74 75 72 6e 65 64 20 53 51 4c  ove returned SQL
6500: 49 54 45 5f 45 52 52 4f 52 2c 20 72 65 74 75 72  ITE_ERROR, retur
6510: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
6520: 5f 56 54 41 42 20 69 6e 73 74 65 61 64 2e 0a 20  _VTAB instead.. 
6530: 20 20 20 2a 2a 20 41 6c 6c 20 74 68 65 20 72 65     ** All the re
6540: 61 73 6f 6e 73 20 74 68 6f 73 65 20 66 75 6e 63  asons those func
6550: 74 69 6f 6e 73 20 6d 69 67 68 74 20 72 65 74 75  tions might retu
6560: 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 20  rn SQLITE_ERROR 
6570: 2d 20 6d 69 73 73 69 6e 67 0a 20 20 20 20 2a 2a  - missing.    **
6580: 20 74 61 62 6c 65 2c 20 6d 69 73 73 69 6e 67 20   table, missing 
6590: 72 6f 77 2c 20 6e 6f 6e 2d 62 6c 6f 62 2f 74 65  row, non-blob/te
65a0: 78 74 20 69 6e 20 62 6c 6f 63 6b 20 63 6f 6c 75  xt in block colu
65b0: 6d 6e 20 2d 20 69 6e 64 69 63 61 74 65 20 0a 20  mn - indicate . 
65c0: 20 20 20 2a 2a 20 62 61 63 6b 69 6e 67 20 73 74     ** backing st
65d0: 6f 72 65 20 63 6f 72 72 75 70 74 69 6f 6e 2e 20  ore corruption. 
65e0: 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d   */.    if( rc==
65f0: 53 51 4c 49 54 45 5f 45 52 52 4f 52 20 29 20 72  SQLITE_ERROR ) r
6600: 63 20 3d 20 46 54 53 35 5f 43 4f 52 52 55 50 54  c = FTS5_CORRUPT
6610: 3b 0a 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  ;..    if( rc==S
6620: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
6630: 20 20 75 38 20 2a 61 4f 75 74 3b 20 20 20 20 20    u8 *aOut;     
6640: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
6650: 20 52 65 61 64 20 62 6c 6f 62 20 64 61 74 61 20   Read blob data 
6660: 69 6e 74 6f 20 74 68 69 73 20 62 75 66 66 65 72  into this buffer
6670: 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e 42   */.      int nB
6680: 79 74 65 20 3d 20 73 71 6c 69 74 65 33 5f 62 6c  yte = sqlite3_bl
6690: 6f 62 5f 62 79 74 65 73 28 70 2d 3e 70 52 65 61  ob_bytes(p->pRea
66a0: 64 65 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20  der);.      if( 
66b0: 70 42 75 66 20 29 7b 0a 20 20 20 20 20 20 20 20  pBuf ){.        
66c0: 66 74 73 35 42 75 66 66 65 72 5a 65 72 6f 28 70  fts5BufferZero(p
66d0: 42 75 66 29 3b 0a 20 20 20 20 20 20 20 20 66 74  Buf);.        ft
66e0: 73 35 42 75 66 66 65 72 47 72 6f 77 28 26 72 63  s5BufferGrow(&rc
66f0: 2c 20 70 42 75 66 2c 20 6e 42 79 74 65 29 3b 0a  , pBuf, nByte);.
6700: 20 20 20 20 20 20 20 20 61 4f 75 74 20 3d 20 70          aOut = p
6710: 42 75 66 2d 3e 70 3b 0a 20 20 20 20 20 20 20 20  Buf->p;.        
6720: 70 42 75 66 2d 3e 6e 20 3d 20 6e 42 79 74 65 3b  pBuf->n = nByte;
6730: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
6740: 20 20 20 20 20 20 69 6e 74 20 6e 53 70 61 63 65        int nSpace
6750: 20 3d 20 6e 42 79 74 65 20 2b 20 46 54 53 35 5f   = nByte + FTS5_
6760: 44 41 54 41 5f 5a 45 52 4f 5f 50 41 44 44 49 4e  DATA_ZERO_PADDIN
6770: 47 3b 0a 20 20 20 20 20 20 20 20 70 52 65 74 20  G;.        pRet 
6780: 3d 20 28 46 74 73 35 44 61 74 61 2a 29 73 71 6c  = (Fts5Data*)sql
6790: 69 74 65 33 46 74 73 35 4d 61 6c 6c 6f 63 5a 65  ite3Fts5MallocZe
67a0: 72 6f 28 26 72 63 2c 20 6e 53 70 61 63 65 2b 73  ro(&rc, nSpace+s
67b0: 69 7a 65 6f 66 28 46 74 73 35 44 61 74 61 29 29  izeof(Fts5Data))
67c0: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 52  ;.        if( pR
67d0: 65 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  et ){.          
67e0: 70 52 65 74 2d 3e 6e 20 3d 20 6e 42 79 74 65 3b  pRet->n = nByte;
67f0: 0a 20 20 20 20 20 20 20 20 20 20 61 4f 75 74 20  .          aOut 
6800: 3d 20 70 52 65 74 2d 3e 70 20 3d 20 28 75 38 2a  = pRet->p = (u8*
6810: 29 26 70 52 65 74 5b 31 5d 3b 0a 20 20 20 20 20  )&pRet[1];.     
6820: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20     }.      }..  
6830: 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
6840: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
6850: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 62 6c   rc = sqlite3_bl
6860: 6f 62 5f 72 65 61 64 28 70 2d 3e 70 52 65 61 64  ob_read(p->pRead
6870: 65 72 2c 20 61 4f 75 74 2c 20 6e 42 79 74 65 2c  er, aOut, nByte,
6880: 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   0);.      }.   
6890: 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
68a0: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
68b0: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 52 65  sqlite3_free(pRe
68c0: 74 29 3b 0a 20 20 20 20 20 20 20 20 70 52 65 74  t);.        pRet
68d0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 0;.      }.  
68e0: 20 20 7d 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20    }.    p->rc = 
68f0: 72 63 3b 0a 20 20 20 20 70 2d 3e 6e 52 65 61 64  rc;.    p->nRead
6900: 2b 2b 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72  ++;.  }..  retur
6910: 6e 20 70 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n pRet;.}../*.**
6920: 20 52 65 74 72 69 65 76 65 20 61 20 72 65 63 6f   Retrieve a reco
6930: 72 64 20 66 72 6f 6d 20 74 68 65 20 25 5f 64 61  rd from the %_da
6940: 74 61 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20  ta table..**.** 
6950: 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
6960: 72 73 2c 20 4e 55 4c 4c 20 69 73 20 72 65 74 75  rs, NULL is retu
6970: 72 6e 65 64 20 61 6e 64 20 61 6e 20 65 72 72 6f  rned and an erro
6980: 72 20 6c 65 66 74 20 69 6e 20 74 68 65 20 0a 2a  r left in the .*
6990: 2a 20 46 74 73 35 49 6e 64 65 78 20 6f 62 6a 65  * Fts5Index obje
69a0: 63 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 46 74  ct..*/.static Ft
69b0: 73 35 44 61 74 61 20 2a 66 74 73 35 44 61 74 61  s5Data *fts5Data
69c0: 52 65 61 64 28 46 74 73 35 49 6e 64 65 78 20 2a  Read(Fts5Index *
69d0: 70 2c 20 69 36 34 20 69 52 6f 77 69 64 29 7b 0a  p, i64 iRowid){.
69e0: 20 20 46 74 73 35 44 61 74 61 20 2a 70 52 65 74    Fts5Data *pRet
69f0: 20 3d 20 66 74 73 35 44 61 74 61 52 65 61 64 4f   = fts5DataReadO
6a00: 72 42 75 66 66 65 72 28 70 2c 20 30 2c 20 69 52  rBuffer(p, 0, iR
6a10: 6f 77 69 64 29 3b 0a 20 20 61 73 73 65 72 74 28  owid);.  assert(
6a20: 20 28 70 52 65 74 3d 3d 30 29 3d 3d 28 70 2d 3e   (pRet==0)==(p->
6a30: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 29 20 29  rc!=SQLITE_OK) )
6a40: 3b 0a 20 20 72 65 74 75 72 6e 20 70 52 65 74 3b  ;.  return pRet;
6a50: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 61  .}../*.** Read a
6a60: 20 72 65 63 6f 72 64 20 66 72 6f 6d 20 74 68 65   record from the
6a70: 20 25 5f 64 61 74 61 20 74 61 62 6c 65 20 69 6e   %_data table in
6a80: 74 6f 20 74 68 65 20 62 75 66 66 65 72 20 73 75  to the buffer su
6a90: 70 70 6c 69 65 64 20 61 73 20 74 68 65 0a 2a 2a  pplied as the.**
6aa0: 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
6ab0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72  ..**.** If an er
6ac0: 72 6f 72 20 6f 63 63 75 72 73 2c 20 61 6e 20 65  ror occurs, an e
6ad0: 72 72 6f 72 20 69 73 20 6c 65 66 74 20 69 6e 20  rror is left in 
6ae0: 74 68 65 20 46 74 73 35 49 6e 64 65 78 20 6f 62  the Fts5Index ob
6af0: 6a 65 63 74 2e 20 49 66 20 61 6e 0a 2a 2a 20 65  ject. If an.** e
6b00: 72 72 6f 72 20 68 61 73 20 61 6c 72 65 61 64 79  rror has already
6b10: 20 6f 63 63 75 72 72 65 64 20 77 68 65 6e 20 74   occurred when t
6b20: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
6b30: 63 61 6c 6c 65 64 2c 20 69 74 20 69 73 20 61 20  called, it is a 
6b40: 0a 2a 2a 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74  .** no-op..*/.st
6b50: 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 44 61  atic void fts5Da
6b60: 74 61 42 75 66 66 65 72 28 46 74 73 35 49 6e 64  taBuffer(Fts5Ind
6b70: 65 78 20 2a 70 2c 20 46 74 73 35 42 75 66 66 65  ex *p, Fts5Buffe
6b80: 72 20 2a 70 42 75 66 2c 20 69 36 34 20 69 52 6f  r *pBuf, i64 iRo
6b90: 77 69 64 29 7b 0a 20 20 28 76 6f 69 64 29 66 74  wid){.  (void)ft
6ba0: 73 35 44 61 74 61 52 65 61 64 4f 72 42 75 66 66  s5DataReadOrBuff
6bb0: 65 72 28 70 2c 20 70 42 75 66 2c 20 69 52 6f 77  er(p, pBuf, iRow
6bc0: 69 64 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  id);.}../*.** Re
6bd0: 6c 65 61 73 65 20 61 20 72 65 66 65 72 65 6e 63  lease a referenc
6be0: 65 20 74 6f 20 64 61 74 61 20 72 65 63 6f 72 64  e to data record
6bf0: 20 72 65 74 75 72 6e 65 64 20 62 79 20 61 6e 20   returned by an 
6c00: 65 61 72 6c 69 65 72 20 63 61 6c 6c 20 74 6f 0a  earlier call to.
6c10: 2a 2a 20 66 74 73 35 44 61 74 61 52 65 61 64 28  ** fts5DataRead(
6c20: 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  )..*/.static voi
6c30: 64 20 66 74 73 35 44 61 74 61 52 65 6c 65 61 73  d fts5DataReleas
6c40: 65 28 46 74 73 35 44 61 74 61 20 2a 70 44 61 74  e(Fts5Data *pDat
6c50: 61 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72  a){.  sqlite3_fr
6c60: 65 65 28 70 44 61 74 61 29 3b 0a 7d 0a 0a 2f 2a  ee(pData);.}../*
6c70: 0a 2a 2a 20 49 4e 53 45 52 54 20 4f 52 20 52 45  .** INSERT OR RE
6c80: 50 4c 41 43 45 20 61 20 72 65 63 6f 72 64 20 69  PLACE a record i
6c90: 6e 74 6f 20 74 68 65 20 25 5f 64 61 74 61 20 74  nto the %_data t
6ca0: 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  able..*/.static 
6cb0: 76 6f 69 64 20 66 74 73 35 44 61 74 61 57 72 69  void fts5DataWri
6cc0: 74 65 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c  te(Fts5Index *p,
6cd0: 20 69 36 34 20 69 52 6f 77 69 64 2c 20 63 6f 6e   i64 iRowid, con
6ce0: 73 74 20 75 38 20 2a 70 44 61 74 61 2c 20 69 6e  st u8 *pData, in
6cf0: 74 20 6e 44 61 74 61 29 7b 0a 20 20 69 66 28 20  t nData){.  if( 
6d00: 70 2d 3e 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc!=SQLITE_OK
6d10: 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 69 66   ) return;..  if
6d20: 28 20 70 2d 3e 70 57 72 69 74 65 72 3d 3d 30 20  ( p->pWriter==0 
6d30: 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 20 3d 20  ){.    int rc = 
6d40: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 46  SQLITE_OK;.    F
6d50: 74 73 35 43 6f 6e 66 69 67 20 2a 70 43 6f 6e 66  ts5Config *pConf
6d60: 69 67 20 3d 20 70 2d 3e 70 43 6f 6e 66 69 67 3b  ig = p->pConfig;
6d70: 0a 20 20 20 20 63 68 61 72 20 2a 7a 53 71 6c 20  .    char *zSql 
6d80: 3d 20 73 71 6c 69 74 65 33 46 74 73 35 4d 70 72  = sqlite3Fts5Mpr
6d90: 69 6e 74 66 28 26 72 63 2c 0a 20 20 20 20 20 20  intf(&rc,.      
6da0: 20 20 22 52 45 50 4c 41 43 45 20 49 4e 54 4f 20    "REPLACE INTO 
6db0: 27 25 71 27 2e 25 51 28 69 64 2c 20 62 6c 6f 63  '%q'.%Q(id, bloc
6dc0: 6b 29 20 56 41 4c 55 45 53 28 3f 2c 3f 29 22 2c  k) VALUES(?,?)",
6dd0: 20 70 43 6f 6e 66 69 67 2d 3e 7a 44 62 2c 20 70   pConfig->zDb, p
6de0: 2d 3e 7a 44 61 74 61 54 62 6c 0a 20 20 20 20 29  ->zDataTbl.    )
6df0: 3b 0a 20 20 20 20 69 66 28 20 7a 53 71 6c 20 29  ;.    if( zSql )
6e00: 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
6e10: 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28  ite3_prepare_v2(
6e20: 70 43 6f 6e 66 69 67 2d 3e 64 62 2c 20 7a 53 71  pConfig->db, zSq
6e30: 6c 2c 20 2d 31 2c 20 26 70 2d 3e 70 57 72 69 74  l, -1, &p->pWrit
6e40: 65 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71  er, 0);.      sq
6e50: 6c 69 74 65 33 5f 66 72 65 65 28 7a 53 71 6c 29  lite3_free(zSql)
6e60: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
6e70: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
6e80: 0a 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 72  .      p->rc = r
6e90: 63 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b  c;.      return;
6ea0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 73 71  .    }.  }..  sq
6eb0: 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 36 34  lite3_bind_int64
6ec0: 28 70 2d 3e 70 57 72 69 74 65 72 2c 20 31 2c 20  (p->pWriter, 1, 
6ed0: 69 52 6f 77 69 64 29 3b 0a 20 20 73 71 6c 69 74  iRowid);.  sqlit
6ee0: 65 33 5f 62 69 6e 64 5f 62 6c 6f 62 28 70 2d 3e  e3_bind_blob(p->
6ef0: 70 57 72 69 74 65 72 2c 20 32 2c 20 70 44 61 74  pWriter, 2, pDat
6f00: 61 2c 20 6e 44 61 74 61 2c 20 53 51 4c 49 54 45  a, nData, SQLITE
6f10: 5f 53 54 41 54 49 43 29 3b 0a 20 20 73 71 6c 69  _STATIC);.  sqli
6f20: 74 65 33 5f 73 74 65 70 28 70 2d 3e 70 57 72 69  te3_step(p->pWri
6f30: 74 65 72 29 3b 0a 20 20 70 2d 3e 72 63 20 3d 20  ter);.  p->rc = 
6f40: 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28 70 2d  sqlite3_reset(p-
6f50: 3e 70 57 72 69 74 65 72 29 3b 0a 7d 0a 0a 2f 2a  >pWriter);.}../*
6f60: 0a 2a 2a 20 45 78 65 63 75 74 65 20 74 68 65 20  .** Execute the 
6f70: 66 6f 6c 6c 6f 77 69 6e 67 20 53 51 4c 3a 0a 2a  following SQL:.*
6f80: 2a 0a 2a 2a 20 20 20 20 20 44 45 4c 45 54 45 20  *.**     DELETE 
6f90: 46 52 4f 4d 20 25 5f 64 61 74 61 20 57 48 45 52  FROM %_data WHER
6fa0: 45 20 69 64 20 42 45 54 57 45 45 4e 20 24 69 46  E id BETWEEN $iF
6fb0: 69 72 73 74 20 41 4e 44 20 24 69 4c 61 73 74 0a  irst AND $iLast.
6fc0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
6fd0: 74 73 35 44 61 74 61 44 65 6c 65 74 65 28 46 74  ts5DataDelete(Ft
6fe0: 73 35 49 6e 64 65 78 20 2a 70 2c 20 69 36 34 20  s5Index *p, i64 
6ff0: 69 46 69 72 73 74 2c 20 69 36 34 20 69 4c 61 73  iFirst, i64 iLas
7000: 74 29 7b 0a 20 20 69 66 28 20 70 2d 3e 72 63 21  t){.  if( p->rc!
7010: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
7020: 75 72 6e 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 70  urn;..  if( p->p
7030: 44 65 6c 65 74 65 72 3d 3d 30 20 29 7b 0a 20 20  Deleter==0 ){.  
7040: 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 46 74    int rc;.    Ft
7050: 73 35 43 6f 6e 66 69 67 20 2a 70 43 6f 6e 66 69  s5Config *pConfi
7060: 67 20 3d 20 70 2d 3e 70 43 6f 6e 66 69 67 3b 0a  g = p->pConfig;.
7070: 20 20 20 20 63 68 61 72 20 2a 7a 53 71 6c 20 3d      char *zSql =
7080: 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
7090: 28 0a 20 20 20 20 20 20 20 20 22 44 45 4c 45 54  (.        "DELET
70a0: 45 20 46 52 4f 4d 20 27 25 71 27 2e 25 51 20 57  E FROM '%q'.%Q W
70b0: 48 45 52 45 20 69 64 3e 3d 3f 20 41 4e 44 20 69  HERE id>=? AND i
70c0: 64 3c 3d 3f 22 2c 20 70 43 6f 6e 66 69 67 2d 3e  d<=?", pConfig->
70d0: 7a 44 62 2c 20 70 2d 3e 7a 44 61 74 61 54 62 6c  zDb, p->zDataTbl
70e0: 0a 20 20 20 20 29 3b 0a 20 20 20 20 69 66 28 20  .    );.    if( 
70f0: 7a 53 71 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20  zSql==0 ){.     
7100: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
7110: 45 4d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  EM;.    }else{. 
7120: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
7130: 33 5f 70 72 65 70 61 72 65 5f 76 32 28 70 43 6f  3_prepare_v2(pCo
7140: 6e 66 69 67 2d 3e 64 62 2c 20 7a 53 71 6c 2c 20  nfig->db, zSql, 
7150: 2d 31 2c 20 26 70 2d 3e 70 44 65 6c 65 74 65 72  -1, &p->pDeleter
7160: 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 0);.      sqli
7170: 74 65 33 5f 66 72 65 65 28 7a 53 71 6c 29 3b 0a  te3_free(zSql);.
7180: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63      }.    if( rc
7190: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
71a0: 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 72 63 3b       p->rc = rc;
71b0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  .      return;. 
71c0: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 73 71 6c 69     }.  }..  sqli
71d0: 74 65 33 5f 62 69 6e 64 5f 69 6e 74 36 34 28 70  te3_bind_int64(p
71e0: 2d 3e 70 44 65 6c 65 74 65 72 2c 20 31 2c 20 69  ->pDeleter, 1, i
71f0: 46 69 72 73 74 29 3b 0a 20 20 73 71 6c 69 74 65  First);.  sqlite
7200: 33 5f 62 69 6e 64 5f 69 6e 74 36 34 28 70 2d 3e  3_bind_int64(p->
7210: 70 44 65 6c 65 74 65 72 2c 20 32 2c 20 69 4c 61  pDeleter, 2, iLa
7220: 73 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73  st);.  sqlite3_s
7230: 74 65 70 28 70 2d 3e 70 44 65 6c 65 74 65 72 29  tep(p->pDeleter)
7240: 3b 0a 20 20 70 2d 3e 72 63 20 3d 20 73 71 6c 69  ;.  p->rc = sqli
7250: 74 65 33 5f 72 65 73 65 74 28 70 2d 3e 70 44 65  te3_reset(p->pDe
7260: 6c 65 74 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  leter);.}../*.**
7270: 20 52 65 6d 6f 76 65 20 61 6c 6c 20 72 65 63 6f   Remove all reco
7280: 72 64 73 20 61 73 73 6f 63 69 61 74 65 64 20 77  rds associated w
7290: 69 74 68 20 73 65 67 6d 65 6e 74 20 69 53 65 67  ith segment iSeg
72a0: 69 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  id..*/.static vo
72b0: 69 64 20 66 74 73 35 44 61 74 61 52 65 6d 6f 76  id fts5DataRemov
72c0: 65 53 65 67 6d 65 6e 74 28 46 74 73 35 49 6e 64  eSegment(Fts5Ind
72d0: 65 78 20 2a 70 2c 20 69 6e 74 20 69 53 65 67 69  ex *p, int iSegi
72e0: 64 29 7b 0a 20 20 69 36 34 20 69 46 69 72 73 74  d){.  i64 iFirst
72f0: 20 3d 20 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f   = FTS5_SEGMENT_
7300: 52 4f 57 49 44 28 69 53 65 67 69 64 2c 20 30 2c  ROWID(iSegid, 0,
7310: 20 30 29 3b 0a 20 20 69 36 34 20 69 4c 61 73 74   0);.  i64 iLast
7320: 20 3d 20 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f   = FTS5_SEGMENT_
7330: 52 4f 57 49 44 28 69 53 65 67 69 64 2b 31 2c 20  ROWID(iSegid+1, 
7340: 30 2c 20 30 29 2d 31 3b 0a 20 20 66 74 73 35 44  0, 0)-1;.  fts5D
7350: 61 74 61 44 65 6c 65 74 65 28 70 2c 20 69 46 69  ataDelete(p, iFi
7360: 72 73 74 2c 20 69 4c 61 73 74 29 3b 0a 7d 0a 0a  rst, iLast);.}..
7370: 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 20  /*.** Release a 
7380: 72 65 66 65 72 65 6e 63 65 20 74 6f 20 61 6e 20  reference to an 
7390: 46 74 73 35 53 74 72 75 63 74 75 72 65 20 6f 62  Fts5Structure ob
73a0: 6a 65 63 74 20 72 65 74 75 72 6e 65 64 20 62 79  ject returned by
73b0: 20 61 6e 20 65 61 72 6c 69 65 72 20 0a 2a 2a 20   an earlier .** 
73c0: 63 61 6c 6c 20 74 6f 20 66 74 73 35 53 74 72 75  call to fts5Stru
73d0: 63 74 75 72 65 52 65 61 64 28 29 20 6f 72 20 66  ctureRead() or f
73e0: 74 73 35 53 74 72 75 63 74 75 72 65 44 65 63 6f  ts5StructureDeco
73f0: 64 65 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  de()..*/.static 
7400: 76 6f 69 64 20 66 74 73 35 53 74 72 75 63 74 75  void fts5Structu
7410: 72 65 52 65 6c 65 61 73 65 28 46 74 73 35 53 74  reRelease(Fts5St
7420: 72 75 63 74 75 72 65 20 2a 70 53 74 72 75 63 74  ructure *pStruct
7430: 29 7b 0a 20 20 69 66 28 20 70 53 74 72 75 63 74  ){.  if( pStruct
7440: 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20   ){.    int i;. 
7450: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 53     for(i=0; i<pS
7460: 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 3b 20 69  truct->nLevel; i
7470: 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  ++){.      sqlit
7480: 65 33 5f 66 72 65 65 28 70 53 74 72 75 63 74 2d  e3_free(pStruct-
7490: 3e 61 4c 65 76 65 6c 5b 69 5d 2e 61 53 65 67 29  >aLevel[i].aSeg)
74a0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
74b0: 74 65 33 5f 66 72 65 65 28 70 53 74 72 75 63 74  te3_free(pStruct
74c0: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
74d0: 44 65 73 65 72 69 61 6c 69 7a 65 20 61 6e 64 20  Deserialize and 
74e0: 72 65 74 75 72 6e 20 74 68 65 20 73 74 72 75 63  return the struc
74f0: 74 75 72 65 20 72 65 63 6f 72 64 20 63 75 72 72  ture record curr
7500: 65 6e 74 6c 79 20 73 74 6f 72 65 64 20 69 6e 20  ently stored in 
7510: 73 65 72 69 61 6c 69 7a 65 64 0a 2a 2a 20 66 6f  serialized.** fo
7520: 72 6d 20 77 69 74 68 69 6e 20 62 75 66 66 65 72  rm within buffer
7530: 20 70 44 61 74 61 2f 6e 44 61 74 61 2e 0a 2a 2a   pData/nData..**
7540: 0a 2a 2a 20 54 68 65 20 46 74 73 35 53 74 72 75  .** The Fts5Stru
7550: 63 74 75 72 65 2e 61 4c 65 76 65 6c 5b 5d 20 61  cture.aLevel[] a
7560: 6e 64 20 65 61 63 68 20 46 74 73 35 53 74 72 75  nd each Fts5Stru
7570: 63 74 75 72 65 4c 65 76 65 6c 2e 61 53 65 67 5b  ctureLevel.aSeg[
7580: 5d 20 61 72 72 61 79 0a 2a 2a 20 61 72 65 20 6f  ] array.** are o
7590: 76 65 72 2d 61 6c 6c 6f 63 61 74 65 64 20 62 79  ver-allocated by
75a0: 20 6f 6e 65 20 73 6c 6f 74 2e 20 54 68 69 73 20   one slot. This 
75b0: 61 6c 6c 6f 77 73 20 74 68 65 20 73 74 72 75 63  allows the struc
75c0: 74 75 72 65 20 63 6f 6e 74 65 6e 74 73 0a 2a 2a  ture contents.**
75d0: 20 74 6f 20 62 65 20 6d 6f 72 65 20 65 61 73 69   to be more easi
75e0: 6c 79 20 65 64 69 74 65 64 2e 0a 2a 2a 0a 2a 2a  ly edited..**.**
75f0: 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
7600: 75 72 73 2c 20 2a 70 70 4f 75 74 20 69 73 20 73  urs, *ppOut is s
7610: 65 74 20 74 6f 20 4e 55 4c 4c 20 61 6e 64 20 61  et to NULL and a
7620: 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63  n SQLite error c
7630: 6f 64 65 0a 2a 2a 20 72 65 74 75 72 6e 65 64 2e  ode.** returned.
7640: 20 4f 74 68 65 72 77 69 73 65 2c 20 2a 70 70 4f   Otherwise, *ppO
7650: 75 74 20 69 73 20 73 65 74 20 74 6f 20 70 6f 69  ut is set to poi
7660: 6e 74 20 74 6f 20 74 68 65 20 6e 65 77 20 6f 62  nt to the new ob
7670: 6a 65 63 74 20 61 6e 64 0a 2a 2a 20 53 51 4c 49  ject and.** SQLI
7680: 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 0a  TE_OK returned..
7690: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74  */.static int ft
76a0: 73 35 53 74 72 75 63 74 75 72 65 44 65 63 6f 64  s5StructureDecod
76b0: 65 28 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 70  e(.  const u8 *p
76c0: 44 61 74 61 2c 20 20 20 20 20 20 20 20 20 20 20  Data,           
76d0: 20 20 20 20 20 2f 2a 20 42 75 66 66 65 72 20 63       /* Buffer c
76e0: 6f 6e 74 61 69 6e 69 6e 67 20 73 65 72 69 61 6c  ontaining serial
76f0: 69 7a 65 64 20 73 74 72 75 63 74 75 72 65 20 2a  ized structure *
7700: 2f 0a 20 20 69 6e 74 20 6e 44 61 74 61 2c 20 20  /.  int nData,  
7710: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7720: 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 62      /* Size of b
7730: 75 66 66 65 72 20 70 44 61 74 61 20 69 6e 20 62  uffer pData in b
7740: 79 74 65 73 20 2a 2f 0a 20 20 69 6e 74 20 2a 70  ytes */.  int *p
7750: 69 43 6f 6f 6b 69 65 2c 20 20 20 20 20 20 20 20  iCookie,        
7760: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e            /* Con
7770: 66 69 67 75 72 61 74 69 6f 6e 20 63 6f 6f 6b 69  figuration cooki
7780: 65 20 76 61 6c 75 65 20 2a 2f 0a 20 20 46 74 73  e value */.  Fts
7790: 35 53 74 72 75 63 74 75 72 65 20 2a 2a 70 70 4f  5Structure **ppO
77a0: 75 74 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ut           /* 
77b0: 4f 55 54 3a 20 44 65 73 65 72 69 61 6c 69 7a 65  OUT: Deserialize
77c0: 64 20 6f 62 6a 65 63 74 20 2a 2f 0a 29 7b 0a 20  d object */.){. 
77d0: 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
77e0: 5f 4f 4b 3b 0a 20 20 69 6e 74 20 69 20 3d 20 30  _OK;.  int i = 0
77f0: 3b 0a 20 20 69 6e 74 20 69 4c 76 6c 3b 0a 20 20  ;.  int iLvl;.  
7800: 69 6e 74 20 6e 4c 65 76 65 6c 20 3d 20 30 3b 0a  int nLevel = 0;.
7810: 20 20 69 6e 74 20 6e 53 65 67 6d 65 6e 74 20 3d    int nSegment =
7820: 20 30 3b 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b   0;.  int nByte;
7830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7840: 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20 6f        /* Bytes o
7850: 66 20 73 70 61 63 65 20 74 6f 20 61 6c 6c 6f 63  f space to alloc
7860: 61 74 65 20 61 74 20 70 52 65 74 20 2a 2f 0a 20  ate at pRet */. 
7870: 20 46 74 73 35 53 74 72 75 63 74 75 72 65 20 2a   Fts5Structure *
7880: 70 52 65 74 20 3d 20 30 3b 20 20 20 20 20 20 20  pRet = 0;       
7890: 20 2f 2a 20 53 74 72 75 63 74 75 72 65 20 6f 62   /* Structure ob
78a0: 6a 65 63 74 20 74 6f 20 72 65 74 75 72 6e 20 2a  ject to return *
78b0: 2f 0a 0a 20 20 2f 2a 20 47 72 61 62 20 74 68 65  /..  /* Grab the
78c0: 20 63 6f 6f 6b 69 65 20 76 61 6c 75 65 20 2a 2f   cookie value */
78d0: 0a 20 20 69 66 28 20 70 69 43 6f 6f 6b 69 65 20  .  if( piCookie 
78e0: 29 20 2a 70 69 43 6f 6f 6b 69 65 20 3d 20 73 71  ) *piCookie = sq
78f0: 6c 69 74 65 33 46 74 73 35 47 65 74 33 32 28 70  lite3Fts5Get32(p
7900: 44 61 74 61 29 3b 0a 20 20 69 20 3d 20 34 3b 0a  Data);.  i = 4;.
7910: 0a 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20 74  .  /* Read the t
7920: 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 6c  otal number of l
7930: 65 76 65 6c 73 20 61 6e 64 20 73 65 67 6d 65 6e  evels and segmen
7940: 74 73 20 66 72 6f 6d 20 74 68 65 20 73 74 61 72  ts from the star
7950: 74 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 73 74  t of the.  ** st
7960: 72 75 63 74 75 72 65 20 72 65 63 6f 72 64 2e 20  ructure record. 
7970: 20 2a 2f 0a 20 20 69 20 2b 3d 20 66 74 73 35 47   */.  i += fts5G
7980: 65 74 56 61 72 69 6e 74 33 32 28 26 70 44 61 74  etVarint32(&pDat
7990: 61 5b 69 5d 2c 20 6e 4c 65 76 65 6c 29 3b 0a 20  a[i], nLevel);. 
79a0: 20 69 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72   i += fts5GetVar
79b0: 69 6e 74 33 32 28 26 70 44 61 74 61 5b 69 5d 2c  int32(&pData[i],
79c0: 20 6e 53 65 67 6d 65 6e 74 29 3b 0a 20 20 6e 42   nSegment);.  nB
79d0: 79 74 65 20 3d 20 28 0a 20 20 20 20 20 20 73 69  yte = (.      si
79e0: 7a 65 6f 66 28 46 74 73 35 53 74 72 75 63 74 75  zeof(Fts5Structu
79f0: 72 65 29 20 2b 20 20 20 20 20 20 20 20 20 20 20  re) +           
7a00: 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 69 6e           /* Main
7a10: 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20   structure */.  
7a20: 20 20 20 20 73 69 7a 65 6f 66 28 46 74 73 35 53      sizeof(Fts5S
7a30: 74 72 75 63 74 75 72 65 4c 65 76 65 6c 29 20 2a  tructureLevel) *
7a40: 20 28 6e 4c 65 76 65 6c 29 20 20 20 20 20 20 2f   (nLevel)      /
7a50: 2a 20 61 4c 65 76 65 6c 5b 5d 20 61 72 72 61 79  * aLevel[] array
7a60: 20 2a 2f 0a 20 20 29 3b 0a 20 20 70 52 65 74 20   */.  );.  pRet 
7a70: 3d 20 28 46 74 73 35 53 74 72 75 63 74 75 72 65  = (Fts5Structure
7a80: 2a 29 73 71 6c 69 74 65 33 46 74 73 35 4d 61 6c  *)sqlite3Fts5Mal
7a90: 6c 6f 63 5a 65 72 6f 28 26 72 63 2c 20 6e 42 79  locZero(&rc, nBy
7aa0: 74 65 29 3b 0a 0a 20 20 69 66 28 20 70 52 65 74  te);..  if( pRet
7ab0: 20 29 7b 0a 20 20 20 20 70 52 65 74 2d 3e 6e 4c   ){.    pRet->nL
7ac0: 65 76 65 6c 20 3d 20 6e 4c 65 76 65 6c 3b 0a 20  evel = nLevel;. 
7ad0: 20 20 20 70 52 65 74 2d 3e 6e 53 65 67 6d 65 6e     pRet->nSegmen
7ae0: 74 20 3d 20 6e 53 65 67 6d 65 6e 74 3b 0a 20 20  t = nSegment;.  
7af0: 20 20 69 20 2b 3d 20 73 71 6c 69 74 65 33 46 74    i += sqlite3Ft
7b00: 73 35 47 65 74 56 61 72 69 6e 74 28 26 70 44 61  s5GetVarint(&pDa
7b10: 74 61 5b 69 5d 2c 20 26 70 52 65 74 2d 3e 6e 57  ta[i], &pRet->nW
7b20: 72 69 74 65 43 6f 75 6e 74 65 72 29 3b 0a 0a 20  riteCounter);.. 
7b30: 20 20 20 66 6f 72 28 69 4c 76 6c 3d 30 3b 20 72     for(iLvl=0; r
7b40: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
7b50: 69 4c 76 6c 3c 6e 4c 65 76 65 6c 3b 20 69 4c 76  iLvl<nLevel; iLv
7b60: 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 46 74 73 35  l++){.      Fts5
7b70: 53 74 72 75 63 74 75 72 65 4c 65 76 65 6c 20 2a  StructureLevel *
7b80: 70 4c 76 6c 20 3d 20 26 70 52 65 74 2d 3e 61 4c  pLvl = &pRet->aL
7b90: 65 76 65 6c 5b 69 4c 76 6c 5d 3b 0a 20 20 20 20  evel[iLvl];.    
7ba0: 20 20 69 6e 74 20 6e 54 6f 74 61 6c 3b 0a 20 20    int nTotal;.  
7bb0: 20 20 20 20 69 6e 74 20 69 53 65 67 3b 0a 0a 20      int iSeg;.. 
7bc0: 20 20 20 20 20 69 20 2b 3d 20 66 74 73 35 47 65       i += fts5Ge
7bd0: 74 56 61 72 69 6e 74 33 32 28 26 70 44 61 74 61  tVarint32(&pData
7be0: 5b 69 5d 2c 20 70 4c 76 6c 2d 3e 6e 4d 65 72 67  [i], pLvl->nMerg
7bf0: 65 29 3b 0a 20 20 20 20 20 20 69 20 2b 3d 20 66  e);.      i += f
7c00: 74 73 35 47 65 74 56 61 72 69 6e 74 33 32 28 26  ts5GetVarint32(&
7c10: 70 44 61 74 61 5b 69 5d 2c 20 6e 54 6f 74 61 6c  pData[i], nTotal
7c20: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
7c30: 20 6e 54 6f 74 61 6c 3e 3d 70 4c 76 6c 2d 3e 6e   nTotal>=pLvl->n
7c40: 4d 65 72 67 65 20 29 3b 0a 20 20 20 20 20 20 70  Merge );.      p
7c50: 4c 76 6c 2d 3e 61 53 65 67 20 3d 20 28 46 74 73  Lvl->aSeg = (Fts
7c60: 35 53 74 72 75 63 74 75 72 65 53 65 67 6d 65 6e  5StructureSegmen
7c70: 74 2a 29 73 71 6c 69 74 65 33 46 74 73 35 4d 61  t*)sqlite3Fts5Ma
7c80: 6c 6c 6f 63 5a 65 72 6f 28 26 72 63 2c 20 0a 20  llocZero(&rc, . 
7c90: 20 20 20 20 20 20 20 20 20 6e 54 6f 74 61 6c 20           nTotal 
7ca0: 2a 20 73 69 7a 65 6f 66 28 46 74 73 35 53 74 72  * sizeof(Fts5Str
7cb0: 75 63 74 75 72 65 53 65 67 6d 65 6e 74 29 0a 20  uctureSegment). 
7cc0: 20 20 20 20 20 29 3b 0a 0a 20 20 20 20 20 20 69       );..      i
7cd0: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
7ce0: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4c 76 6c   ){.        pLvl
7cf0: 2d 3e 6e 53 65 67 20 3d 20 6e 54 6f 74 61 6c 3b  ->nSeg = nTotal;
7d00: 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 53 65  .        for(iSe
7d10: 67 3d 30 3b 20 69 53 65 67 3c 6e 54 6f 74 61 6c  g=0; iSeg<nTotal
7d20: 3b 20 69 53 65 67 2b 2b 29 7b 0a 20 20 20 20 20  ; iSeg++){.     
7d30: 20 20 20 20 20 69 20 2b 3d 20 66 74 73 35 47 65       i += fts5Ge
7d40: 74 56 61 72 69 6e 74 33 32 28 26 70 44 61 74 61  tVarint32(&pData
7d50: 5b 69 5d 2c 20 70 4c 76 6c 2d 3e 61 53 65 67 5b  [i], pLvl->aSeg[
7d60: 69 53 65 67 5d 2e 69 53 65 67 69 64 29 3b 0a 20  iSeg].iSegid);. 
7d70: 20 20 20 20 20 20 20 20 20 69 20 2b 3d 20 66 74           i += ft
7d80: 73 35 47 65 74 56 61 72 69 6e 74 33 32 28 26 70  s5GetVarint32(&p
7d90: 44 61 74 61 5b 69 5d 2c 20 70 4c 76 6c 2d 3e 61  Data[i], pLvl->a
7da0: 53 65 67 5b 69 53 65 67 5d 2e 6e 48 65 69 67 68  Seg[iSeg].nHeigh
7db0: 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 20  t);.          i 
7dc0: 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e 74  += fts5GetVarint
7dd0: 33 32 28 26 70 44 61 74 61 5b 69 5d 2c 20 70 4c  32(&pData[i], pL
7de0: 76 6c 2d 3e 61 53 65 67 5b 69 53 65 67 5d 2e 70  vl->aSeg[iSeg].p
7df0: 67 6e 6f 46 69 72 73 74 29 3b 0a 20 20 20 20 20  gnoFirst);.     
7e00: 20 20 20 20 20 69 20 2b 3d 20 66 74 73 35 47 65       i += fts5Ge
7e10: 74 56 61 72 69 6e 74 33 32 28 26 70 44 61 74 61  tVarint32(&pData
7e20: 5b 69 5d 2c 20 70 4c 76 6c 2d 3e 61 53 65 67 5b  [i], pLvl->aSeg[
7e30: 69 53 65 67 5d 2e 70 67 6e 6f 4c 61 73 74 29 3b  iSeg].pgnoLast);
7e40: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
7e50: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
7e60: 66 74 73 35 53 74 72 75 63 74 75 72 65 52 65 6c  fts5StructureRel
7e70: 65 61 73 65 28 70 52 65 74 29 3b 0a 20 20 20 20  ease(pRet);.    
7e80: 20 20 20 20 70 52 65 74 20 3d 20 30 3b 0a 20 20      pRet = 0;.  
7e90: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
7ea0: 0a 20 20 2a 70 70 4f 75 74 20 3d 20 70 52 65 74  .  *ppOut = pRet
7eb0: 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
7ec0: 0a 0a 2f 2a 0a 2a 2a 0a 2a 2f 0a 73 74 61 74 69  ../*.**.*/.stati
7ed0: 63 20 76 6f 69 64 20 66 74 73 35 53 74 72 75 63  c void fts5Struc
7ee0: 74 75 72 65 41 64 64 4c 65 76 65 6c 28 69 6e 74  tureAddLevel(int
7ef0: 20 2a 70 52 63 2c 20 46 74 73 35 53 74 72 75 63   *pRc, Fts5Struc
7f00: 74 75 72 65 20 2a 2a 70 70 53 74 72 75 63 74 29  ture **ppStruct)
7f10: 7b 0a 20 20 69 66 28 20 2a 70 52 63 3d 3d 53 51  {.  if( *pRc==SQ
7f20: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 46  LITE_OK ){.    F
7f30: 74 73 35 53 74 72 75 63 74 75 72 65 20 2a 70 53  ts5Structure *pS
7f40: 74 72 75 63 74 20 3d 20 2a 70 70 53 74 72 75 63  truct = *ppStruc
7f50: 74 3b 0a 20 20 20 20 69 6e 74 20 6e 4c 65 76 65  t;.    int nLeve
7f60: 6c 20 3d 20 70 53 74 72 75 63 74 2d 3e 6e 4c 65  l = pStruct->nLe
7f70: 76 65 6c 3b 0a 20 20 20 20 69 6e 74 20 6e 42 79  vel;.    int nBy
7f80: 74 65 20 3d 20 28 0a 20 20 20 20 20 20 20 20 73  te = (.        s
7f90: 69 7a 65 6f 66 28 46 74 73 35 53 74 72 75 63 74  izeof(Fts5Struct
7fa0: 75 72 65 29 20 2b 20 20 20 20 20 20 20 20 20 20  ure) +          
7fb0: 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 69 6e 20          /* Main 
7fc0: 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 20  structure */.   
7fd0: 20 20 20 20 20 73 69 7a 65 6f 66 28 46 74 73 35       sizeof(Fts5
7fe0: 53 74 72 75 63 74 75 72 65 4c 65 76 65 6c 29 20  StructureLevel) 
7ff0: 2a 20 28 6e 4c 65 76 65 6c 2b 31 29 20 20 2f 2a  * (nLevel+1)  /*
8000: 20 61 4c 65 76 65 6c 5b 5d 20 61 72 72 61 79 20   aLevel[] array 
8010: 2a 2f 0a 20 20 20 20 29 3b 0a 0a 20 20 20 20 70  */.    );..    p
8020: 53 74 72 75 63 74 20 3d 20 73 71 6c 69 74 65 33  Struct = sqlite3
8030: 5f 72 65 61 6c 6c 6f 63 28 70 53 74 72 75 63 74  _realloc(pStruct
8040: 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20 20 69 66  , nByte);.    if
8050: 28 20 70 53 74 72 75 63 74 20 29 7b 0a 20 20 20  ( pStruct ){.   
8060: 20 20 20 6d 65 6d 73 65 74 28 26 70 53 74 72 75     memset(&pStru
8070: 63 74 2d 3e 61 4c 65 76 65 6c 5b 6e 4c 65 76 65  ct->aLevel[nLeve
8080: 6c 5d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 46 74  l], 0, sizeof(Ft
8090: 73 35 53 74 72 75 63 74 75 72 65 4c 65 76 65 6c  s5StructureLevel
80a0: 29 29 3b 0a 20 20 20 20 20 20 70 53 74 72 75 63  ));.      pStruc
80b0: 74 2d 3e 6e 4c 65 76 65 6c 2b 2b 3b 0a 20 20 20  t->nLevel++;.   
80c0: 20 20 20 2a 70 70 53 74 72 75 63 74 20 3d 20 70     *ppStruct = p
80d0: 53 74 72 75 63 74 3b 0a 20 20 20 20 7d 65 6c 73  Struct;.    }els
80e0: 65 7b 0a 20 20 20 20 20 20 2a 70 52 63 20 3d 20  e{.      *pRc = 
80f0: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
8100: 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
8110: 20 45 78 74 65 6e 64 20 6c 65 76 65 6c 20 69 4c   Extend level iL
8120: 76 6c 20 73 6f 20 74 68 61 74 20 74 68 65 72 65  vl so that there
8130: 20 69 73 20 72 6f 6f 6d 20 66 6f 72 20 61 74 20   is room for at 
8140: 6c 65 61 73 74 20 6e 45 78 74 72 61 20 6d 6f 72  least nExtra mor
8150: 65 0a 2a 2a 20 73 65 67 6d 65 6e 74 73 2e 0a 2a  e.** segments..*
8160: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  /.static void ft
8170: 73 35 53 74 72 75 63 74 75 72 65 45 78 74 65 6e  s5StructureExten
8180: 64 4c 65 76 65 6c 28 0a 20 20 69 6e 74 20 2a 70  dLevel(.  int *p
8190: 52 63 2c 20 0a 20 20 46 74 73 35 53 74 72 75 63  Rc, .  Fts5Struc
81a0: 74 75 72 65 20 2a 70 53 74 72 75 63 74 2c 20 0a  ture *pStruct, .
81b0: 20 20 69 6e 74 20 69 4c 76 6c 2c 20 0a 20 20 69    int iLvl, .  i
81c0: 6e 74 20 6e 45 78 74 72 61 2c 20 0a 20 20 69 6e  nt nExtra, .  in
81d0: 74 20 62 49 6e 73 65 72 74 0a 29 7b 0a 20 20 69  t bInsert.){.  i
81e0: 66 28 20 2a 70 52 63 3d 3d 53 51 4c 49 54 45 5f  f( *pRc==SQLITE_
81f0: 4f 4b 20 29 7b 0a 20 20 20 20 46 74 73 35 53 74  OK ){.    Fts5St
8200: 72 75 63 74 75 72 65 4c 65 76 65 6c 20 2a 70 4c  ructureLevel *pL
8210: 76 6c 20 3d 20 26 70 53 74 72 75 63 74 2d 3e 61  vl = &pStruct->a
8220: 4c 65 76 65 6c 5b 69 4c 76 6c 5d 3b 0a 20 20 20  Level[iLvl];.   
8230: 20 46 74 73 35 53 74 72 75 63 74 75 72 65 53 65   Fts5StructureSe
8240: 67 6d 65 6e 74 20 2a 61 4e 65 77 3b 0a 20 20 20  gment *aNew;.   
8250: 20 69 6e 74 20 6e 42 79 74 65 3b 0a 0a 20 20 20   int nByte;..   
8260: 20 6e 42 79 74 65 20 3d 20 28 70 4c 76 6c 2d 3e   nByte = (pLvl->
8270: 6e 53 65 67 20 2b 20 6e 45 78 74 72 61 29 20 2a  nSeg + nExtra) *
8280: 20 73 69 7a 65 6f 66 28 46 74 73 35 53 74 72 75   sizeof(Fts5Stru
8290: 63 74 75 72 65 53 65 67 6d 65 6e 74 29 3b 0a 20  ctureSegment);. 
82a0: 20 20 20 61 4e 65 77 20 3d 20 73 71 6c 69 74 65     aNew = sqlite
82b0: 33 5f 72 65 61 6c 6c 6f 63 28 70 4c 76 6c 2d 3e  3_realloc(pLvl->
82c0: 61 53 65 67 2c 20 6e 42 79 74 65 29 3b 0a 20 20  aSeg, nByte);.  
82d0: 20 20 69 66 28 20 61 4e 65 77 20 29 7b 0a 20 20    if( aNew ){.  
82e0: 20 20 20 20 69 66 28 20 62 49 6e 73 65 72 74 3d      if( bInsert=
82f0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 65  =0 ){.        me
8300: 6d 73 65 74 28 26 61 4e 65 77 5b 70 4c 76 6c 2d  mset(&aNew[pLvl-
8310: 3e 6e 53 65 67 5d 2c 20 30 2c 20 73 69 7a 65 6f  >nSeg], 0, sizeo
8320: 66 28 46 74 73 35 53 74 72 75 63 74 75 72 65 53  f(Fts5StructureS
8330: 65 67 6d 65 6e 74 29 20 2a 20 6e 45 78 74 72 61  egment) * nExtra
8340: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
8350: 20 20 20 20 20 20 20 20 69 6e 74 20 6e 4d 6f 76          int nMov
8360: 65 20 3d 20 70 4c 76 6c 2d 3e 6e 53 65 67 20 2a  e = pLvl->nSeg *
8370: 20 73 69 7a 65 6f 66 28 46 74 73 35 53 74 72 75   sizeof(Fts5Stru
8380: 63 74 75 72 65 53 65 67 6d 65 6e 74 29 3b 0a 20  ctureSegment);. 
8390: 20 20 20 20 20 20 20 6d 65 6d 6d 6f 76 65 28 26         memmove(&
83a0: 61 4e 65 77 5b 6e 45 78 74 72 61 5d 2c 20 61 4e  aNew[nExtra], aN
83b0: 65 77 2c 20 6e 4d 6f 76 65 29 3b 0a 20 20 20 20  ew, nMove);.    
83c0: 20 20 20 20 6d 65 6d 73 65 74 28 61 4e 65 77 2c      memset(aNew,
83d0: 20 30 2c 20 73 69 7a 65 6f 66 28 46 74 73 35 53   0, sizeof(Fts5S
83e0: 74 72 75 63 74 75 72 65 53 65 67 6d 65 6e 74 29  tructureSegment)
83f0: 20 2a 20 6e 45 78 74 72 61 29 3b 0a 20 20 20 20   * nExtra);.    
8400: 20 20 7d 0a 20 20 20 20 20 20 70 4c 76 6c 2d 3e    }.      pLvl->
8410: 61 53 65 67 20 3d 20 61 4e 65 77 3b 0a 20 20 20  aSeg = aNew;.   
8420: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2a 70   }else{.      *p
8430: 52 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  Rc = SQLITE_NOME
8440: 4d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  M;.    }.  }.}..
8450: 2f 2a 0a 2a 2a 20 52 65 61 64 2c 20 64 65 73 65  /*.** Read, dese
8460: 72 69 61 6c 69 7a 65 20 61 6e 64 20 72 65 74 75  rialize and retu
8470: 72 6e 20 74 68 65 20 73 74 72 75 63 74 75 72 65  rn the structure
8480: 20 72 65 63 6f 72 64 2e 0a 2a 2a 0a 2a 2a 20 54   record..**.** T
8490: 68 65 20 46 74 73 35 53 74 72 75 63 74 75 72 65  he Fts5Structure
84a0: 2e 61 4c 65 76 65 6c 5b 5d 20 61 6e 64 20 65 61  .aLevel[] and ea
84b0: 63 68 20 46 74 73 35 53 74 72 75 63 74 75 72 65  ch Fts5Structure
84c0: 4c 65 76 65 6c 2e 61 53 65 67 5b 5d 20 61 72 72  Level.aSeg[] arr
84d0: 61 79 0a 2a 2a 20 61 72 65 20 6f 76 65 72 2d 61  ay.** are over-a
84e0: 6c 6c 6f 63 61 74 65 64 20 61 73 20 64 65 73 63  llocated as desc
84f0: 72 69 62 65 64 20 66 6f 72 20 66 75 6e 63 74 69  ribed for functi
8500: 6f 6e 20 66 74 73 35 53 74 72 75 63 74 75 72 65  on fts5Structure
8510: 44 65 63 6f 64 65 28 29 20 0a 2a 2a 20 61 62 6f  Decode() .** abo
8520: 76 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  ve..**.** If an 
8530: 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 4e 55  error occurs, NU
8540: 4c 4c 20 69 73 20 72 65 74 75 72 6e 65 64 20 61  LL is returned a
8550: 6e 64 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  nd an error code
8560: 20 6c 65 66 74 20 69 6e 20 74 68 65 0a 2a 2a 20   left in the.** 
8570: 46 74 73 35 49 6e 64 65 78 20 68 61 6e 64 6c 65  Fts5Index handle
8580: 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20 68 61  . If an error ha
8590: 73 20 61 6c 72 65 61 64 79 20 6f 63 63 75 72 72  s already occurr
85a0: 65 64 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e  ed when this fun
85b0: 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 63 61 6c 6c  ction.** is call
85c0: 65 64 2c 20 69 74 20 69 73 20 61 20 6e 6f 2d 6f  ed, it is a no-o
85d0: 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 46 74 73  p..*/.static Fts
85e0: 35 53 74 72 75 63 74 75 72 65 20 2a 66 74 73 35  5Structure *fts5
85f0: 53 74 72 75 63 74 75 72 65 52 65 61 64 28 46 74  StructureRead(Ft
8600: 73 35 49 6e 64 65 78 20 2a 70 29 7b 0a 20 20 46  s5Index *p){.  F
8610: 74 73 35 43 6f 6e 66 69 67 20 2a 70 43 6f 6e 66  ts5Config *pConf
8620: 69 67 20 3d 20 70 2d 3e 70 43 6f 6e 66 69 67 3b  ig = p->pConfig;
8630: 0a 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65  .  Fts5Structure
8640: 20 2a 70 52 65 74 20 3d 20 30 3b 20 20 20 20 20   *pRet = 0;     
8650: 20 20 20 2f 2a 20 4f 62 6a 65 63 74 20 74 6f 20     /* Object to 
8660: 72 65 74 75 72 6e 20 2a 2f 0a 20 20 46 74 73 35  return */.  Fts5
8670: 44 61 74 61 20 2a 70 44 61 74 61 3b 20 20 20 20  Data *pData;    
8680: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 25              /* %
8690: 5f 64 61 74 61 20 65 6e 74 72 79 20 63 6f 6e 74  _data entry cont
86a0: 61 69 6e 69 6e 67 20 73 74 72 75 63 74 75 72 65  aining structure
86b0: 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 69 6e 74   record */.  int
86c0: 20 69 43 6f 6f 6b 69 65 3b 20 20 20 20 20 20 20   iCookie;       
86d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
86e0: 43 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 63 6f  Configuration co
86f0: 6f 6b 69 65 20 2a 2f 0a 0a 20 20 70 44 61 74 61  okie */..  pData
8700: 20 3d 20 66 74 73 35 44 61 74 61 52 65 61 64 28   = fts5DataRead(
8710: 70 2c 20 46 54 53 35 5f 53 54 52 55 43 54 55 52  p, FTS5_STRUCTUR
8720: 45 5f 52 4f 57 49 44 29 3b 0a 20 20 69 66 28 20  E_ROWID);.  if( 
8730: 21 70 44 61 74 61 20 29 20 72 65 74 75 72 6e 20  !pData ) return 
8740: 30 3b 0a 20 20 70 2d 3e 72 63 20 3d 20 66 74 73  0;.  p->rc = fts
8750: 35 53 74 72 75 63 74 75 72 65 44 65 63 6f 64 65  5StructureDecode
8760: 28 70 44 61 74 61 2d 3e 70 2c 20 70 44 61 74 61  (pData->p, pData
8770: 2d 3e 6e 2c 20 26 69 43 6f 6f 6b 69 65 2c 20 26  ->n, &iCookie, &
8780: 70 52 65 74 29 3b 0a 0a 20 20 69 66 28 20 70 2d  pRet);..  if( p-
8790: 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26  >rc==SQLITE_OK &
87a0: 26 20 70 43 6f 6e 66 69 67 2d 3e 69 43 6f 6f 6b  & pConfig->iCook
87b0: 69 65 21 3d 69 43 6f 6f 6b 69 65 20 29 7b 0a 20  ie!=iCookie ){. 
87c0: 20 20 20 70 2d 3e 72 63 20 3d 20 73 71 6c 69 74     p->rc = sqlit
87d0: 65 33 46 74 73 35 43 6f 6e 66 69 67 4c 6f 61 64  e3Fts5ConfigLoad
87e0: 28 70 43 6f 6e 66 69 67 2c 20 69 43 6f 6f 6b 69  (pConfig, iCooki
87f0: 65 29 3b 0a 20 20 7d 0a 0a 20 20 66 74 73 35 44  e);.  }..  fts5D
8800: 61 74 61 52 65 6c 65 61 73 65 28 70 44 61 74 61  ataRelease(pData
8810: 29 3b 0a 20 20 69 66 28 20 70 2d 3e 72 63 21 3d  );.  if( p->rc!=
8820: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
8830: 20 66 74 73 35 53 74 72 75 63 74 75 72 65 52 65   fts5StructureRe
8840: 6c 65 61 73 65 28 70 52 65 74 29 3b 0a 20 20 20  lease(pRet);.   
8850: 20 70 52 65 74 20 3d 20 30 3b 0a 20 20 7d 0a 20   pRet = 0;.  }. 
8860: 20 72 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a   return pRet;.}.
8870: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
8880: 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f  e total number o
8890: 66 20 73 65 67 6d 65 6e 74 73 20 69 6e 20 69 6e  f segments in in
88a0: 64 65 78 20 73 74 72 75 63 74 75 72 65 20 70 53  dex structure pS
88b0: 74 72 75 63 74 2e 20 54 68 69 73 0a 2a 2a 20 66  truct. This.** f
88c0: 75 6e 63 74 69 6f 6e 20 69 73 20 6f 6e 6c 79 20  unction is only 
88d0: 65 76 65 72 20 75 73 65 64 20 61 73 20 70 61 72  ever used as par
88e0: 74 20 6f 66 20 61 73 73 65 72 74 28 29 20 63 6f  t of assert() co
88f0: 6e 64 69 74 69 6f 6e 73 2e 0a 2a 2f 0a 23 69 66  nditions..*/.#if
8900: 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
8910: 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 35  .static int fts5
8920: 53 74 72 75 63 74 75 72 65 43 6f 75 6e 74 53 65  StructureCountSe
8930: 67 6d 65 6e 74 73 28 46 74 73 35 53 74 72 75 63  gments(Fts5Struc
8940: 74 75 72 65 20 2a 70 53 74 72 75 63 74 29 7b 0a  ture *pStruct){.
8950: 20 20 69 6e 74 20 6e 53 65 67 6d 65 6e 74 20 3d    int nSegment =
8960: 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
8970: 20 20 2f 2a 20 54 6f 74 61 6c 20 6e 75 6d 62 65    /* Total numbe
8980: 72 20 6f 66 20 73 65 67 6d 65 6e 74 73 20 2a 2f  r of segments */
8990: 0a 20 20 69 66 28 20 70 53 74 72 75 63 74 20 29  .  if( pStruct )
89a0: 7b 0a 20 20 20 20 69 6e 74 20 69 4c 76 6c 3b 20  {.    int iLvl; 
89b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
89c0: 20 20 20 20 2f 2a 20 55 73 65 64 20 74 6f 20 69      /* Used to i
89d0: 74 65 72 61 74 65 20 74 68 72 6f 75 67 68 20 6c  terate through l
89e0: 65 76 65 6c 73 20 2a 2f 0a 20 20 20 20 66 6f 72  evels */.    for
89f0: 28 69 4c 76 6c 3d 30 3b 20 69 4c 76 6c 3c 70 53  (iLvl=0; iLvl<pS
8a00: 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 3b 20 69  truct->nLevel; i
8a10: 4c 76 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 6e 53  Lvl++){.      nS
8a20: 65 67 6d 65 6e 74 20 2b 3d 20 70 53 74 72 75 63  egment += pStruc
8a30: 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d 2e  t->aLevel[iLvl].
8a40: 6e 53 65 67 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  nSeg;.    }.  }.
8a50: 0a 20 20 72 65 74 75 72 6e 20 6e 53 65 67 6d 65  .  return nSegme
8a60: 6e 74 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a  nt;.}.#endif../*
8a70: 0a 2a 2a 20 53 65 72 69 61 6c 69 7a 65 20 61 6e  .** Serialize an
8a80: 64 20 73 74 6f 72 65 20 74 68 65 20 22 73 74 72  d store the "str
8a90: 75 63 74 75 72 65 22 20 72 65 63 6f 72 64 2e 0a  ucture" record..
8aa0: 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f  **.** If an erro
8ab0: 72 20 6f 63 63 75 72 73 2c 20 6c 65 61 76 65 20  r occurs, leave 
8ac0: 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 6e  an error code in
8ad0: 20 74 68 65 20 46 74 73 35 49 6e 64 65 78 20 6f   the Fts5Index o
8ae0: 62 6a 65 63 74 2e 20 49 66 20 61 6e 0a 2a 2a 20  bject. If an.** 
8af0: 65 72 72 6f 72 20 68 61 73 20 61 6c 72 65 61 64  error has alread
8b00: 79 20 6f 63 63 75 72 72 65 64 2c 20 74 68 69 73  y occurred, this
8b10: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e   function is a n
8b20: 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  o-op..*/.static 
8b30: 76 6f 69 64 20 66 74 73 35 53 74 72 75 63 74 75  void fts5Structu
8b40: 72 65 57 72 69 74 65 28 46 74 73 35 49 6e 64 65  reWrite(Fts5Inde
8b50: 78 20 2a 70 2c 20 46 74 73 35 53 74 72 75 63 74  x *p, Fts5Struct
8b60: 75 72 65 20 2a 70 53 74 72 75 63 74 29 7b 0a 20  ure *pStruct){. 
8b70: 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49   if( p->rc==SQLI
8b80: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 46 74 73  TE_OK ){.    Fts
8b90: 35 42 75 66 66 65 72 20 62 75 66 3b 20 20 20 20  5Buffer buf;    
8ba0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 75             /* Bu
8bb0: 66 66 65 72 20 74 6f 20 73 65 72 69 61 6c 69 7a  ffer to serializ
8bc0: 65 20 72 65 63 6f 72 64 20 69 6e 74 6f 20 2a 2f  e record into */
8bd0: 0a 20 20 20 20 69 6e 74 20 69 4c 76 6c 3b 20 20  .    int iLvl;  
8be0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8bf0: 20 20 20 2f 2a 20 55 73 65 64 20 74 6f 20 69 74     /* Used to it
8c00: 65 72 61 74 65 20 74 68 72 6f 75 67 68 20 6c 65  erate through le
8c10: 76 65 6c 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20  vels */.    int 
8c20: 69 43 6f 6f 6b 69 65 3b 20 20 20 20 20 20 20 20  iCookie;        
8c30: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6f            /* Coo
8c40: 6b 69 65 20 76 61 6c 75 65 20 74 6f 20 73 74 6f  kie value to sto
8c50: 72 65 20 2a 2f 0a 0a 20 20 20 20 61 73 73 65 72  re */..    asser
8c60: 74 28 20 70 53 74 72 75 63 74 2d 3e 6e 53 65 67  t( pStruct->nSeg
8c70: 6d 65 6e 74 3d 3d 66 74 73 35 53 74 72 75 63 74  ment==fts5Struct
8c80: 75 72 65 43 6f 75 6e 74 53 65 67 6d 65 6e 74 73  ureCountSegments
8c90: 28 70 53 74 72 75 63 74 29 20 29 3b 0a 20 20 20  (pStruct) );.   
8ca0: 20 6d 65 6d 73 65 74 28 26 62 75 66 2c 20 30 2c   memset(&buf, 0,
8cb0: 20 73 69 7a 65 6f 66 28 46 74 73 35 42 75 66 66   sizeof(Fts5Buff
8cc0: 65 72 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 41 70  er));..    /* Ap
8cd0: 70 65 6e 64 20 74 68 65 20 63 75 72 72 65 6e 74  pend the current
8ce0: 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 63   configuration c
8cf0: 6f 6f 6b 69 65 20 2a 2f 0a 20 20 20 20 69 43 6f  ookie */.    iCo
8d00: 6f 6b 69 65 20 3d 20 70 2d 3e 70 43 6f 6e 66 69  okie = p->pConfi
8d10: 67 2d 3e 69 43 6f 6f 6b 69 65 3b 0a 20 20 20 20  g->iCookie;.    
8d20: 69 66 28 20 69 43 6f 6f 6b 69 65 3c 30 20 29 20  if( iCookie<0 ) 
8d30: 69 43 6f 6f 6b 69 65 20 3d 20 30 3b 0a 20 20 20  iCookie = 0;.   
8d40: 20 66 74 73 35 42 75 66 66 65 72 41 70 70 65 6e   fts5BufferAppen
8d50: 64 33 32 28 26 70 2d 3e 72 63 2c 20 26 62 75 66  d32(&p->rc, &buf
8d60: 2c 20 69 43 6f 6f 6b 69 65 29 3b 0a 0a 20 20 20  , iCookie);..   
8d70: 20 66 74 73 35 42 75 66 66 65 72 41 70 70 65 6e   fts5BufferAppen
8d80: 64 56 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20  dVarint(&p->rc, 
8d90: 26 62 75 66 2c 20 70 53 74 72 75 63 74 2d 3e 6e  &buf, pStruct->n
8da0: 4c 65 76 65 6c 29 3b 0a 20 20 20 20 66 74 73 35  Level);.    fts5
8db0: 42 75 66 66 65 72 41 70 70 65 6e 64 56 61 72 69  BufferAppendVari
8dc0: 6e 74 28 26 70 2d 3e 72 63 2c 20 26 62 75 66 2c  nt(&p->rc, &buf,
8dd0: 20 70 53 74 72 75 63 74 2d 3e 6e 53 65 67 6d 65   pStruct->nSegme
8de0: 6e 74 29 3b 0a 20 20 20 20 66 74 73 35 42 75 66  nt);.    fts5Buf
8df0: 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e 74 28  ferAppendVarint(
8e00: 26 70 2d 3e 72 63 2c 20 26 62 75 66 2c 20 28 69  &p->rc, &buf, (i
8e10: 36 34 29 70 53 74 72 75 63 74 2d 3e 6e 57 72 69  64)pStruct->nWri
8e20: 74 65 43 6f 75 6e 74 65 72 29 3b 0a 0a 20 20 20  teCounter);..   
8e30: 20 66 6f 72 28 69 4c 76 6c 3d 30 3b 20 69 4c 76   for(iLvl=0; iLv
8e40: 6c 3c 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65  l<pStruct->nLeve
8e50: 6c 3b 20 69 4c 76 6c 2b 2b 29 7b 0a 20 20 20 20  l; iLvl++){.    
8e60: 20 20 69 6e 74 20 69 53 65 67 3b 20 20 20 20 20    int iSeg;     
8e70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8e80: 2f 2a 20 55 73 65 64 20 74 6f 20 69 74 65 72 61  /* Used to itera
8e90: 74 65 20 74 68 72 6f 75 67 68 20 73 65 67 6d 65  te through segme
8ea0: 6e 74 73 20 2a 2f 0a 20 20 20 20 20 20 46 74 73  nts */.      Fts
8eb0: 35 53 74 72 75 63 74 75 72 65 4c 65 76 65 6c 20  5StructureLevel 
8ec0: 2a 70 4c 76 6c 20 3d 20 26 70 53 74 72 75 63 74  *pLvl = &pStruct
8ed0: 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d 3b 0a  ->aLevel[iLvl];.
8ee0: 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72        fts5Buffer
8ef0: 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26 70 2d  AppendVarint(&p-
8f00: 3e 72 63 2c 20 26 62 75 66 2c 20 70 4c 76 6c 2d  >rc, &buf, pLvl-
8f10: 3e 6e 4d 65 72 67 65 29 3b 0a 20 20 20 20 20 20  >nMerge);.      
8f20: 66 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64  fts5BufferAppend
8f30: 56 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26  Varint(&p->rc, &
8f40: 62 75 66 2c 20 70 4c 76 6c 2d 3e 6e 53 65 67 29  buf, pLvl->nSeg)
8f50: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
8f60: 70 4c 76 6c 2d 3e 6e 4d 65 72 67 65 3c 3d 70 4c  pLvl->nMerge<=pL
8f70: 76 6c 2d 3e 6e 53 65 67 20 29 3b 0a 0a 20 20 20  vl->nSeg );..   
8f80: 20 20 20 66 6f 72 28 69 53 65 67 3d 30 3b 20 69     for(iSeg=0; i
8f90: 53 65 67 3c 70 4c 76 6c 2d 3e 6e 53 65 67 3b 20  Seg<pLvl->nSeg; 
8fa0: 69 53 65 67 2b 2b 29 7b 0a 20 20 20 20 20 20 20  iSeg++){.       
8fb0: 20 66 74 73 35 42 75 66 66 65 72 41 70 70 65 6e   fts5BufferAppen
8fc0: 64 56 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20  dVarint(&p->rc, 
8fd0: 26 62 75 66 2c 20 70 4c 76 6c 2d 3e 61 53 65 67  &buf, pLvl->aSeg
8fe0: 5b 69 53 65 67 5d 2e 69 53 65 67 69 64 29 3b 0a  [iSeg].iSegid);.
8ff0: 20 20 20 20 20 20 20 20 66 74 73 35 42 75 66 66          fts5Buff
9000: 65 72 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26  erAppendVarint(&
9010: 70 2d 3e 72 63 2c 20 26 62 75 66 2c 20 70 4c 76  p->rc, &buf, pLv
9020: 6c 2d 3e 61 53 65 67 5b 69 53 65 67 5d 2e 6e 48  l->aSeg[iSeg].nH
9030: 65 69 67 68 74 29 3b 0a 20 20 20 20 20 20 20 20  eight);.        
9040: 66 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64  fts5BufferAppend
9050: 56 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26  Varint(&p->rc, &
9060: 62 75 66 2c 20 70 4c 76 6c 2d 3e 61 53 65 67 5b  buf, pLvl->aSeg[
9070: 69 53 65 67 5d 2e 70 67 6e 6f 46 69 72 73 74 29  iSeg].pgnoFirst)
9080: 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35 42 75  ;.        fts5Bu
9090: 66 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e 74  fferAppendVarint
90a0: 28 26 70 2d 3e 72 63 2c 20 26 62 75 66 2c 20 70  (&p->rc, &buf, p
90b0: 4c 76 6c 2d 3e 61 53 65 67 5b 69 53 65 67 5d 2e  Lvl->aSeg[iSeg].
90c0: 70 67 6e 6f 4c 61 73 74 29 3b 0a 20 20 20 20 20  pgnoLast);.     
90d0: 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 66 74   }.    }..    ft
90e0: 73 35 44 61 74 61 57 72 69 74 65 28 70 2c 20 46  s5DataWrite(p, F
90f0: 54 53 35 5f 53 54 52 55 43 54 55 52 45 5f 52 4f  TS5_STRUCTURE_RO
9100: 57 49 44 2c 20 62 75 66 2e 70 2c 20 62 75 66 2e  WID, buf.p, buf.
9110: 6e 29 3b 0a 20 20 20 20 66 74 73 35 42 75 66 66  n);.    fts5Buff
9120: 65 72 46 72 65 65 28 26 62 75 66 29 3b 0a 20 20  erFree(&buf);.  
9130: 7d 0a 7d 0a 0a 23 69 66 20 30 0a 73 74 61 74 69  }.}..#if 0.stati
9140: 63 20 76 6f 69 64 20 66 74 73 35 44 65 62 75 67  c void fts5Debug
9150: 53 74 72 75 63 74 75 72 65 28 69 6e 74 2a 2c 46  Structure(int*,F
9160: 74 73 35 42 75 66 66 65 72 2a 2c 46 74 73 35 53  ts5Buffer*,Fts5S
9170: 74 72 75 63 74 75 72 65 2a 29 3b 0a 73 74 61 74  tructure*);.stat
9180: 69 63 20 76 6f 69 64 20 66 74 73 35 50 72 69 6e  ic void fts5Prin
9190: 74 53 74 72 75 63 74 75 72 65 28 63 6f 6e 73 74  tStructure(const
91a0: 20 63 68 61 72 20 2a 7a 43 61 70 74 69 6f 6e 2c   char *zCaption,
91b0: 20 46 74 73 35 53 74 72 75 63 74 75 72 65 20 2a   Fts5Structure *
91c0: 70 53 74 72 75 63 74 29 7b 0a 20 20 69 6e 74 20  pStruct){.  int 
91d0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
91e0: 20 20 46 74 73 35 42 75 66 66 65 72 20 62 75 66    Fts5Buffer buf
91f0: 3b 0a 20 20 6d 65 6d 73 65 74 28 26 62 75 66 2c  ;.  memset(&buf,
9200: 20 30 2c 20 73 69 7a 65 6f 66 28 62 75 66 29 29   0, sizeof(buf))
9210: 3b 0a 20 20 66 74 73 35 44 65 62 75 67 53 74 72  ;.  fts5DebugStr
9220: 75 63 74 75 72 65 28 26 72 63 2c 20 26 62 75 66  ucture(&rc, &buf
9230: 2c 20 70 53 74 72 75 63 74 29 3b 0a 20 20 66 70  , pStruct);.  fp
9240: 72 69 6e 74 66 28 73 74 64 6f 75 74 2c 20 22 25  rintf(stdout, "%
9250: 73 3a 20 25 73 5c 6e 22 2c 20 7a 43 61 70 74 69  s: %s\n", zCapti
9260: 6f 6e 2c 20 62 75 66 2e 70 29 3b 0a 20 20 66 66  on, buf.p);.  ff
9270: 6c 75 73 68 28 73 74 64 6f 75 74 29 3b 0a 20 20  lush(stdout);.  
9280: 66 74 73 35 42 75 66 66 65 72 46 72 65 65 28 26  fts5BufferFree(&
9290: 62 75 66 29 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20  buf);.}.#else.# 
92a0: 64 65 66 69 6e 65 20 66 74 73 35 50 72 69 6e 74  define fts5Print
92b0: 53 74 72 75 63 74 75 72 65 28 78 2c 79 29 0a 23  Structure(x,y).#
92c0: 65 6e 64 69 66 0a 0a 73 74 61 74 69 63 20 69 6e  endif..static in
92d0: 74 20 66 74 73 35 53 65 67 6d 65 6e 74 53 69 7a  t fts5SegmentSiz
92e0: 65 28 46 74 73 35 53 74 72 75 63 74 75 72 65 53  e(Fts5StructureS
92f0: 65 67 6d 65 6e 74 20 2a 70 53 65 67 29 7b 0a 20  egment *pSeg){. 
9300: 20 72 65 74 75 72 6e 20 31 20 2b 20 70 53 65 67   return 1 + pSeg
9310: 2d 3e 70 67 6e 6f 4c 61 73 74 20 2d 20 70 53 65  ->pgnoLast - pSe
9320: 67 2d 3e 70 67 6e 6f 46 69 72 73 74 3b 0a 7d 0a  g->pgnoFirst;.}.
9330: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20  ./*.** Return a 
9340: 63 6f 70 79 20 6f 66 20 69 6e 64 65 78 20 73 74  copy of index st
9350: 72 75 63 74 75 72 65 20 70 53 74 72 75 63 74 2e  ructure pStruct.
9360: 20 45 78 63 65 70 74 2c 20 70 72 6f 6d 6f 74 65   Except, promote
9370: 20 61 73 20 6d 61 6e 79 20 0a 2a 2a 20 73 65 67   as many .** seg
9380: 6d 65 6e 74 73 20 61 73 20 70 6f 73 73 69 62 6c  ments as possibl
9390: 65 20 74 6f 20 6c 65 76 65 6c 20 69 50 72 6f 6d  e to level iProm
93a0: 6f 74 65 2e 20 49 66 20 61 6e 20 4f 4f 4d 20 6f  ote. If an OOM o
93b0: 63 63 75 72 73 2c 20 4e 55 4c 4c 20 69 73 20 0a  ccurs, NULL is .
93c0: 2a 2a 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a  ** returned..*/.
93d0: 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
93e0: 53 74 72 75 63 74 75 72 65 50 72 6f 6d 6f 74 65  StructurePromote
93f0: 54 6f 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20  To(.  Fts5Index 
9400: 2a 70 2c 0a 20 20 69 6e 74 20 69 50 72 6f 6d 6f  *p,.  int iPromo
9410: 74 65 2c 0a 20 20 69 6e 74 20 73 7a 50 72 6f 6d  te,.  int szProm
9420: 6f 74 65 2c 0a 20 20 46 74 73 35 53 74 72 75 63  ote,.  Fts5Struc
9430: 74 75 72 65 20 2a 70 53 74 72 75 63 74 0a 29 7b  ture *pStruct.){
9440: 0a 20 20 69 6e 74 20 69 6c 2c 20 69 73 3b 0a 20  .  int il, is;. 
9450: 20 46 74 73 35 53 74 72 75 63 74 75 72 65 4c 65   Fts5StructureLe
9460: 76 65 6c 20 2a 70 4f 75 74 20 3d 20 26 70 53 74  vel *pOut = &pSt
9470: 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 50 72  ruct->aLevel[iPr
9480: 6f 6d 6f 74 65 5d 3b 0a 0a 20 20 69 66 28 20 70  omote];..  if( p
9490: 4f 75 74 2d 3e 6e 4d 65 72 67 65 3d 3d 30 20 29  Out->nMerge==0 )
94a0: 7b 0a 20 20 20 20 66 6f 72 28 69 6c 3d 69 50 72  {.    for(il=iPr
94b0: 6f 6d 6f 74 65 2b 31 3b 20 69 6c 3c 70 53 74 72  omote+1; il<pStr
94c0: 75 63 74 2d 3e 6e 4c 65 76 65 6c 3b 20 69 6c 2b  uct->nLevel; il+
94d0: 2b 29 7b 0a 20 20 20 20 20 20 46 74 73 35 53 74  +){.      Fts5St
94e0: 72 75 63 74 75 72 65 4c 65 76 65 6c 20 2a 70 4c  ructureLevel *pL
94f0: 76 6c 20 3d 20 26 70 53 74 72 75 63 74 2d 3e 61  vl = &pStruct->a
9500: 4c 65 76 65 6c 5b 69 6c 5d 3b 0a 20 20 20 20 20  Level[il];.     
9510: 20 69 66 28 20 70 4c 76 6c 2d 3e 6e 4d 65 72 67   if( pLvl->nMerg
9520: 65 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20  e ) return;.    
9530: 20 20 66 6f 72 28 69 73 3d 70 4c 76 6c 2d 3e 6e    for(is=pLvl->n
9540: 53 65 67 2d 31 3b 20 69 73 3e 3d 30 3b 20 69 73  Seg-1; is>=0; is
9550: 2d 2d 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  --){.        int
9560: 20 73 7a 20 3d 20 66 74 73 35 53 65 67 6d 65 6e   sz = fts5Segmen
9570: 74 53 69 7a 65 28 26 70 4c 76 6c 2d 3e 61 53 65  tSize(&pLvl->aSe
9580: 67 5b 69 73 5d 29 3b 0a 20 20 20 20 20 20 20 20  g[is]);.        
9590: 69 66 28 20 73 7a 3e 73 7a 50 72 6f 6d 6f 74 65  if( sz>szPromote
95a0: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20   ) return;.     
95b0: 20 20 20 66 74 73 35 53 74 72 75 63 74 75 72 65     fts5Structure
95c0: 45 78 74 65 6e 64 4c 65 76 65 6c 28 26 70 2d 3e  ExtendLevel(&p->
95d0: 72 63 2c 20 70 53 74 72 75 63 74 2c 20 69 50 72  rc, pStruct, iPr
95e0: 6f 6d 6f 74 65 2c 20 31 2c 20 31 29 3b 0a 20 20  omote, 1, 1);.  
95f0: 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72 63 20        if( p->rc 
9600: 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20  ) return;.      
9610: 20 20 6d 65 6d 63 70 79 28 70 4f 75 74 2d 3e 61    memcpy(pOut->a
9620: 53 65 67 2c 20 26 70 4c 76 6c 2d 3e 61 53 65 67  Seg, &pLvl->aSeg
9630: 5b 69 73 5d 2c 20 73 69 7a 65 6f 66 28 46 74 73  [is], sizeof(Fts
9640: 35 53 74 72 75 63 74 75 72 65 53 65 67 6d 65 6e  5StructureSegmen
9650: 74 29 29 3b 0a 20 20 20 20 20 20 20 20 70 4f 75  t));.        pOu
9660: 74 2d 3e 6e 53 65 67 2b 2b 3b 0a 20 20 20 20 20  t->nSeg++;.     
9670: 20 20 20 70 4c 76 6c 2d 3e 6e 53 65 67 2d 2d 3b     pLvl->nSeg--;
9680: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
9690: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 6e 65   }.}../*.** A ne
96a0: 77 20 73 65 67 6d 65 6e 74 20 68 61 73 20 6a 75  w segment has ju
96b0: 73 74 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20  st been written 
96c0: 74 6f 20 6c 65 76 65 6c 20 69 4c 76 6c 20 6f 66  to level iLvl of
96d0: 20 69 6e 64 65 78 20 73 74 72 75 63 74 75 72 65   index structure
96e0: 0a 2a 2a 20 70 53 74 72 75 63 74 2e 20 54 68 69  .** pStruct. Thi
96f0: 73 20 66 75 6e 63 74 69 6f 6e 20 64 65 74 65 72  s function deter
9700: 6d 69 6e 65 73 20 69 66 20 61 6e 79 20 73 65 67  mines if any seg
9710: 6d 65 6e 74 73 20 73 68 6f 75 6c 64 20 62 65 20  ments should be 
9720: 70 72 6f 6d 6f 74 65 64 0a 2a 2a 20 61 73 20 61  promoted.** as a
9730: 20 72 65 73 75 6c 74 2e 20 53 65 67 6d 65 6e 74   result. Segment
9740: 73 20 61 72 65 20 70 72 6f 6d 6f 74 65 64 20 69  s are promoted i
9750: 6e 20 74 77 6f 20 73 63 65 6e 61 72 69 6f 73 3a  n two scenarios:
9760: 0a 2a 2a 0a 2a 2a 20 20 20 61 29 20 49 66 20 74  .**.**   a) If t
9770: 68 65 20 73 65 67 6d 65 6e 74 20 6a 75 73 74 20  he segment just 
9780: 77 72 69 74 74 65 6e 20 69 73 20 73 6d 61 6c 6c  written is small
9790: 65 72 20 74 68 61 6e 20 6f 6e 65 20 6f 72 20 6d  er than one or m
97a0: 6f 72 65 20 73 65 67 6d 65 6e 74 73 0a 2a 2a 20  ore segments.** 
97b0: 20 20 20 20 20 77 69 74 68 69 6e 20 74 68 65 20       within the 
97c0: 70 72 65 76 69 6f 75 73 20 70 6f 70 75 6c 61 74  previous populat
97d0: 65 64 20 6c 65 76 65 6c 2c 20 69 74 20 69 73 20  ed level, it is 
97e0: 70 72 6f 6d 6f 74 65 64 20 74 6f 20 74 68 65 20  promoted to the 
97f0: 70 72 65 76 69 6f 75 73 0a 2a 2a 20 20 20 20 20  previous.**     
9800: 20 70 6f 70 75 6c 61 74 65 64 20 6c 65 76 65 6c   populated level
9810: 2e 0a 2a 2a 0a 2a 2a 20 20 20 62 29 20 49 66 20  ..**.**   b) If 
9820: 74 68 65 20 73 65 67 6d 65 6e 74 20 6a 75 73 74  the segment just
9830: 20 77 72 69 74 74 65 6e 20 69 73 20 6c 61 72 67   written is larg
9840: 65 72 20 74 68 61 6e 20 74 68 65 20 6e 65 77 65  er than the newe
9850: 73 74 20 73 65 67 6d 65 6e 74 20 6f 6e 0a 2a 2a  st segment on.**
9860: 20 20 20 20 20 20 74 68 65 20 6e 65 78 74 20 70        the next p
9870: 6f 70 75 6c 61 74 65 64 20 6c 65 76 65 6c 2c 20  opulated level, 
9880: 74 68 65 6e 20 74 68 61 74 20 73 65 67 6d 65 6e  then that segmen
9890: 74 2c 20 61 6e 64 20 61 6e 79 20 6f 74 68 65 72  t, and any other
98a0: 20 61 64 6a 61 63 65 6e 74 0a 2a 2a 20 20 20 20   adjacent.**    
98b0: 20 20 73 65 67 6d 65 6e 74 73 20 74 68 61 74 20    segments that 
98c0: 61 72 65 20 61 6c 73 6f 20 73 6d 61 6c 6c 65 72  are also smaller
98d0: 20 74 68 61 6e 20 74 68 65 20 6f 6e 65 20 6a 75   than the one ju
98e0: 73 74 20 77 72 69 74 74 65 6e 2c 20 61 72 65 20  st written, are 
98f0: 0a 2a 2a 20 20 20 20 20 20 70 72 6f 6d 6f 74 65  .**      promote
9900: 64 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 6f 6e 65  d. .**.** If one
9910: 20 6f 72 20 6d 6f 72 65 20 73 65 67 6d 65 6e 74   or more segment
9920: 73 20 61 72 65 20 70 72 6f 6d 6f 74 65 64 2c 20  s are promoted, 
9930: 74 68 65 20 73 74 72 75 63 74 75 72 65 20 6f 62  the structure ob
9940: 6a 65 63 74 20 69 73 20 75 70 64 61 74 65 64 0a  ject is updated.
9950: 2a 2a 20 74 6f 20 72 65 66 6c 65 63 74 20 74 68  ** to reflect th
9960: 69 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  is..*/.static vo
9970: 69 64 20 66 74 73 35 53 74 72 75 63 74 75 72 65  id fts5Structure
9980: 50 72 6f 6d 6f 74 65 28 0a 20 20 46 74 73 35 49  Promote(.  Fts5I
9990: 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20  ndex *p,        
99a0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54             /* FT
99b0: 53 35 20 62 61 63 6b 65 6e 64 20 6f 62 6a 65 63  S5 backend objec
99c0: 74 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 76 6c 2c  t */.  int iLvl,
99d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
99e0: 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
99f0: 6c 65 76 65 6c 20 6a 75 73 74 20 75 70 64 61 74  level just updat
9a00: 65 64 20 2a 2f 0a 20 20 46 74 73 35 53 74 72 75  ed */.  Fts5Stru
9a10: 63 74 75 72 65 20 2a 70 53 74 72 75 63 74 20 20  cture *pStruct  
9a20: 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
9a30: 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 29 7b   structure */.){
9a40: 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51  .  if( p->rc==SQ
9a50: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69  LITE_OK ){.    i
9a60: 6e 74 20 69 54 73 74 3b 0a 20 20 20 20 69 6e 74  nt iTst;.    int
9a70: 20 69 50 72 6f 6d 6f 74 65 20 3d 20 2d 31 3b 0a   iPromote = -1;.
9a80: 20 20 20 20 69 6e 74 20 73 7a 50 72 6f 6d 6f 74      int szPromot
9a90: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
9aa0: 20 20 2f 2a 20 50 72 6f 6d 6f 74 65 20 61 6e 79    /* Promote any
9ab0: 74 68 69 6e 67 20 74 68 69 73 20 73 69 7a 65 20  thing this size 
9ac0: 6f 72 20 73 6d 61 6c 6c 65 72 20 2a 2f 0a 20 20  or smaller */.  
9ad0: 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65 53    Fts5StructureS
9ae0: 65 67 6d 65 6e 74 20 2a 70 53 65 67 3b 20 20 20  egment *pSeg;   
9af0: 2f 2a 20 53 65 67 6d 65 6e 74 20 6a 75 73 74 20  /* Segment just 
9b00: 77 72 69 74 74 65 6e 20 2a 2f 0a 20 20 20 20 69  written */.    i
9b10: 6e 74 20 73 7a 53 65 67 3b 20 20 20 20 20 20 20  nt szSeg;       
9b20: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
9b30: 53 69 7a 65 20 6f 66 20 73 65 67 6d 65 6e 74 20  Size of segment 
9b40: 6a 75 73 74 20 77 72 69 74 74 65 6e 20 2a 2f 0a  just written */.
9b50: 0a 0a 20 20 20 20 70 53 65 67 20 3d 20 26 70 53  ..    pSeg = &pS
9b60: 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c  truct->aLevel[iL
9b70: 76 6c 5d 2e 61 53 65 67 5b 70 53 74 72 75 63 74  vl].aSeg[pStruct
9b80: 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d 2e 6e  ->aLevel[iLvl].n
9b90: 53 65 67 2d 31 5d 3b 0a 20 20 20 20 73 7a 53 65  Seg-1];.    szSe
9ba0: 67 20 3d 20 28 31 20 2b 20 70 53 65 67 2d 3e 70  g = (1 + pSeg->p
9bb0: 67 6e 6f 4c 61 73 74 20 2d 20 70 53 65 67 2d 3e  gnoLast - pSeg->
9bc0: 70 67 6e 6f 46 69 72 73 74 29 3b 0a 0a 20 20 20  pgnoFirst);..   
9bd0: 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20 63 6f   /* Check for co
9be0: 6e 64 69 74 69 6f 6e 20 28 61 29 20 2a 2f 0a 20  ndition (a) */. 
9bf0: 20 20 20 66 6f 72 28 69 54 73 74 3d 69 4c 76 6c     for(iTst=iLvl
9c00: 2d 31 3b 20 69 54 73 74 3e 3d 30 20 26 26 20 70  -1; iTst>=0 && p
9c10: 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69  Struct->aLevel[i
9c20: 54 73 74 5d 2e 6e 53 65 67 3d 3d 30 3b 20 69 54  Tst].nSeg==0; iT
9c30: 73 74 2d 2d 29 3b 0a 20 20 20 20 69 66 28 20 69  st--);.    if( i
9c40: 54 73 74 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20  Tst>=0 ){.      
9c50: 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 69 6e 74  int i;.      int
9c60: 20 73 7a 4d 61 78 20 3d 20 30 3b 0a 20 20 20 20   szMax = 0;.    
9c70: 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65 4c    Fts5StructureL
9c80: 65 76 65 6c 20 2a 70 54 73 74 20 3d 20 26 70 53  evel *pTst = &pS
9c90: 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 54  truct->aLevel[iT
9ca0: 73 74 5d 3b 0a 20 20 20 20 20 20 61 73 73 65 72  st];.      asser
9cb0: 74 28 20 70 54 73 74 2d 3e 6e 4d 65 72 67 65 3d  t( pTst->nMerge=
9cc0: 3d 30 20 29 3b 0a 20 20 20 20 20 20 66 6f 72 28  =0 );.      for(
9cd0: 69 3d 30 3b 20 69 3c 70 54 73 74 2d 3e 6e 53 65  i=0; i<pTst->nSe
9ce0: 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  g; i++){.       
9cf0: 20 69 6e 74 20 73 7a 20 3d 20 70 54 73 74 2d 3e   int sz = pTst->
9d00: 61 53 65 67 5b 69 5d 2e 70 67 6e 6f 4c 61 73 74  aSeg[i].pgnoLast
9d10: 20 2d 20 70 54 73 74 2d 3e 61 53 65 67 5b 69 5d   - pTst->aSeg[i]
9d20: 2e 70 67 6e 6f 46 69 72 73 74 20 2b 20 31 3b 0a  .pgnoFirst + 1;.
9d30: 20 20 20 20 20 20 20 20 69 66 28 20 73 7a 3e 73          if( sz>s
9d40: 7a 4d 61 78 20 29 20 73 7a 4d 61 78 20 3d 20 73  zMax ) szMax = s
9d50: 7a 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  z;.      }.     
9d60: 20 69 66 28 20 73 7a 4d 61 78 3e 3d 73 7a 53 65   if( szMax>=szSe
9d70: 67 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  g ){.        /* 
9d80: 43 6f 6e 64 69 74 69 6f 6e 20 28 61 29 20 69 73  Condition (a) is
9d90: 20 74 72 75 65 2e 20 50 72 6f 6d 6f 74 65 20 74   true. Promote t
9da0: 68 65 20 6e 65 77 65 73 74 20 73 65 67 6d 65 6e  he newest segmen
9db0: 74 20 6f 6e 20 6c 65 76 65 6c 20 0a 20 20 20 20  t on level .    
9dc0: 20 20 20 20 2a 2a 20 69 4c 76 6c 20 74 6f 20 6c      ** iLvl to l
9dd0: 65 76 65 6c 20 69 54 73 74 2e 20 20 2a 2f 0a 20  evel iTst.  */. 
9de0: 20 20 20 20 20 20 20 69 50 72 6f 6d 6f 74 65 20         iPromote 
9df0: 3d 20 69 54 73 74 3b 0a 20 20 20 20 20 20 20 20  = iTst;.        
9e00: 73 7a 50 72 6f 6d 6f 74 65 20 3d 20 73 7a 4d 61  szPromote = szMa
9e10: 78 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  x;.      }.    }
9e20: 0a 0a 20 20 20 20 2f 2a 20 49 66 20 63 6f 6e 64  ..    /* If cond
9e30: 69 74 69 6f 6e 20 28 61 29 20 69 73 20 6e 6f 74  ition (a) is not
9e40: 20 6d 65 74 2c 20 61 73 73 75 6d 65 20 28 62 29   met, assume (b)
9e50: 20 69 73 20 74 72 75 65 2e 20 53 74 72 75 63 74   is true. Struct
9e60: 75 72 65 50 72 6f 6d 6f 74 65 54 6f 28 29 0a 20  urePromoteTo(). 
9e70: 20 20 20 2a 2a 20 69 73 20 61 20 6e 6f 2d 6f 70     ** is a no-op
9e80: 20 69 66 20 69 74 20 69 73 20 6e 6f 74 2e 20 20   if it is not.  
9e90: 2a 2f 0a 20 20 20 20 69 66 28 20 69 50 72 6f 6d  */.    if( iProm
9ea0: 6f 74 65 3c 30 20 29 7b 0a 20 20 20 20 20 20 69  ote<0 ){.      i
9eb0: 50 72 6f 6d 6f 74 65 20 3d 20 69 4c 76 6c 3b 0a  Promote = iLvl;.
9ec0: 20 20 20 20 20 20 73 7a 50 72 6f 6d 6f 74 65 20        szPromote 
9ed0: 3d 20 73 7a 53 65 67 3b 0a 20 20 20 20 7d 0a 20  = szSeg;.    }. 
9ee0: 20 20 20 66 74 73 35 53 74 72 75 63 74 75 72 65     fts5Structure
9ef0: 50 72 6f 6d 6f 74 65 54 6f 28 70 2c 20 69 50 72  PromoteTo(p, iPr
9f00: 6f 6d 6f 74 65 2c 20 73 7a 50 72 6f 6d 6f 74 65  omote, szPromote
9f10: 2c 20 70 53 74 72 75 63 74 29 3b 0a 20 20 7d 0a  , pStruct);.  }.
9f20: 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65  }.../*.** If the
9f30: 20 70 49 74 65 72 2d 3e 69 4f 66 66 20 6f 66 66   pIter->iOff off
9f40: 73 65 74 20 63 75 72 72 65 6e 74 6c 79 20 70 6f  set currently po
9f50: 69 6e 74 73 20 74 6f 20 61 6e 20 65 6e 74 72 79  ints to an entry
9f60: 20 69 6e 64 69 63 61 74 69 6e 67 20 6f 6e 65 0a   indicating one.
9f70: 2a 2a 20 6f 72 20 6d 6f 72 65 20 74 65 72 6d 2d  ** or more term-
9f80: 6c 65 73 73 20 6e 6f 64 65 73 2c 20 61 64 76 61  less nodes, adva
9f90: 6e 63 65 20 70 61 73 74 20 69 74 20 61 6e 64 20  nce past it and 
9fa0: 73 65 74 20 70 49 74 65 72 2d 3e 6e 45 6d 70 74  set pIter->nEmpt
9fb0: 79 20 74 6f 0a 2a 2a 20 74 68 65 20 6e 75 6d 62  y to.** the numb
9fc0: 65 72 20 6f 66 20 65 6d 70 74 79 20 63 68 69 6c  er of empty chil
9fd0: 64 20 6e 6f 64 65 73 2e 0a 2a 2f 0a 73 74 61 74  d nodes..*/.stat
9fe0: 69 63 20 76 6f 69 64 20 66 74 73 35 4e 6f 64 65  ic void fts5Node
9ff0: 49 74 65 72 47 6f 62 62 6c 65 4e 45 6d 70 74 79  IterGobbleNEmpty
a000: 28 46 74 73 35 4e 6f 64 65 49 74 65 72 20 2a 70  (Fts5NodeIter *p
a010: 49 74 65 72 29 7b 0a 20 20 69 66 28 20 70 49 74  Iter){.  if( pIt
a020: 65 72 2d 3e 69 4f 66 66 3c 70 49 74 65 72 2d 3e  er->iOff<pIter->
a030: 6e 44 61 74 61 20 26 26 20 30 3d 3d 28 70 49 74  nData && 0==(pIt
a040: 65 72 2d 3e 61 44 61 74 61 5b 70 49 74 65 72 2d  er->aData[pIter-
a050: 3e 69 4f 66 66 5d 20 26 20 30 78 66 65 29 20 29  >iOff] & 0xfe) )
a060: 7b 0a 20 20 20 20 70 49 74 65 72 2d 3e 62 44 6c  {.    pIter->bDl
a070: 69 64 78 20 3d 20 70 49 74 65 72 2d 3e 61 44 61  idx = pIter->aDa
a080: 74 61 5b 70 49 74 65 72 2d 3e 69 4f 66 66 5d 20  ta[pIter->iOff] 
a090: 26 20 30 78 30 31 3b 0a 20 20 20 20 70 49 74 65  & 0x01;.    pIte
a0a0: 72 2d 3e 69 4f 66 66 2b 2b 3b 0a 20 20 20 20 70  r->iOff++;.    p
a0b0: 49 74 65 72 2d 3e 69 4f 66 66 20 2b 3d 20 66 74  Iter->iOff += ft
a0c0: 73 35 47 65 74 56 61 72 69 6e 74 33 32 28 26 70  s5GetVarint32(&p
a0d0: 49 74 65 72 2d 3e 61 44 61 74 61 5b 70 49 74 65  Iter->aData[pIte
a0e0: 72 2d 3e 69 4f 66 66 5d 2c 20 70 49 74 65 72 2d  r->iOff], pIter-
a0f0: 3e 6e 45 6d 70 74 79 29 3b 0a 20 20 7d 65 6c 73  >nEmpty);.  }els
a100: 65 7b 0a 20 20 20 20 70 49 74 65 72 2d 3e 6e 45  e{.    pIter->nE
a110: 6d 70 74 79 20 3d 20 30 3b 0a 20 20 20 20 70 49  mpty = 0;.    pI
a120: 74 65 72 2d 3e 62 44 6c 69 64 78 20 3d 20 30 3b  ter->bDlidx = 0;
a130: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64  .  }.}../*.** Ad
a140: 76 61 6e 63 65 20 74 6f 20 74 68 65 20 6e 65 78  vance to the nex
a150: 74 20 65 6e 74 72 79 20 77 69 74 68 69 6e 20 74  t entry within t
a160: 68 65 20 6e 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74  he node..*/.stat
a170: 69 63 20 76 6f 69 64 20 66 74 73 35 4e 6f 64 65  ic void fts5Node
a180: 49 74 65 72 4e 65 78 74 28 69 6e 74 20 2a 70 52  IterNext(int *pR
a190: 63 2c 20 46 74 73 35 4e 6f 64 65 49 74 65 72 20  c, Fts5NodeIter 
a1a0: 2a 70 49 74 65 72 29 7b 0a 20 20 69 66 28 20 70  *pIter){.  if( p
a1b0: 49 74 65 72 2d 3e 69 4f 66 66 3e 3d 70 49 74 65  Iter->iOff>=pIte
a1c0: 72 2d 3e 6e 44 61 74 61 20 29 7b 0a 20 20 20 20  r->nData ){.    
a1d0: 70 49 74 65 72 2d 3e 61 44 61 74 61 20 3d 20 30  pIter->aData = 0
a1e0: 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 69 43 68  ;.    pIter->iCh
a1f0: 69 6c 64 20 2b 3d 20 70 49 74 65 72 2d 3e 6e 45  ild += pIter->nE
a200: 6d 70 74 79 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  mpty;.  }else{. 
a210: 20 20 20 69 6e 74 20 6e 50 72 65 2c 20 6e 4e 65     int nPre, nNe
a220: 77 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 69 4f  w;.    pIter->iO
a230: 66 66 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72  ff += fts5GetVar
a240: 69 6e 74 33 32 28 26 70 49 74 65 72 2d 3e 61 44  int32(&pIter->aD
a250: 61 74 61 5b 70 49 74 65 72 2d 3e 69 4f 66 66 5d  ata[pIter->iOff]
a260: 2c 20 6e 50 72 65 29 3b 0a 20 20 20 20 70 49 74  , nPre);.    pIt
a270: 65 72 2d 3e 69 4f 66 66 20 2b 3d 20 66 74 73 35  er->iOff += fts5
a280: 47 65 74 56 61 72 69 6e 74 33 32 28 26 70 49 74  GetVarint32(&pIt
a290: 65 72 2d 3e 61 44 61 74 61 5b 70 49 74 65 72 2d  er->aData[pIter-
a2a0: 3e 69 4f 66 66 5d 2c 20 6e 4e 65 77 29 3b 0a 20  >iOff], nNew);. 
a2b0: 20 20 20 70 49 74 65 72 2d 3e 74 65 72 6d 2e 6e     pIter->term.n
a2c0: 20 3d 20 6e 50 72 65 2d 32 3b 0a 20 20 20 20 66   = nPre-2;.    f
a2d0: 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 42  ts5BufferAppendB
a2e0: 6c 6f 62 28 70 52 63 2c 20 26 70 49 74 65 72 2d  lob(pRc, &pIter-
a2f0: 3e 74 65 72 6d 2c 20 6e 4e 65 77 2c 20 70 49 74  >term, nNew, pIt
a300: 65 72 2d 3e 61 44 61 74 61 2b 70 49 74 65 72 2d  er->aData+pIter-
a310: 3e 69 4f 66 66 29 3b 0a 20 20 20 20 70 49 74 65  >iOff);.    pIte
a320: 72 2d 3e 69 4f 66 66 20 2b 3d 20 6e 4e 65 77 3b  r->iOff += nNew;
a330: 0a 20 20 20 20 70 49 74 65 72 2d 3e 69 43 68 69  .    pIter->iChi
a340: 6c 64 20 2b 3d 20 28 31 20 2b 20 70 49 74 65 72  ld += (1 + pIter
a350: 2d 3e 6e 45 6d 70 74 79 29 3b 0a 20 20 20 20 66  ->nEmpty);.    f
a360: 74 73 35 4e 6f 64 65 49 74 65 72 47 6f 62 62 6c  ts5NodeIterGobbl
a370: 65 4e 45 6d 70 74 79 28 70 49 74 65 72 29 3b 0a  eNEmpty(pIter);.
a380: 20 20 20 20 69 66 28 20 2a 70 52 63 20 29 20 70      if( *pRc ) p
a390: 49 74 65 72 2d 3e 61 44 61 74 61 20 3d 20 30 3b  Iter->aData = 0;
a3a0: 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 49  .  }.}.../*.** I
a3b0: 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 69 74  nitialize the it
a3c0: 65 72 61 74 6f 72 20 6f 62 6a 65 63 74 20 70 49  erator object pI
a3d0: 74 65 72 20 74 6f 20 69 74 65 72 61 74 65 20 74  ter to iterate t
a3e0: 68 72 6f 75 67 68 20 74 68 65 20 69 6e 74 65 72  hrough the inter
a3f0: 6e 61 6c 0a 2a 2a 20 73 65 67 6d 65 6e 74 20 6e  nal.** segment n
a400: 6f 64 65 20 69 6e 20 70 44 61 74 61 2e 0a 2a 2f  ode in pData..*/
a410: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
a420: 35 4e 6f 64 65 49 74 65 72 49 6e 69 74 28 63 6f  5NodeIterInit(co
a430: 6e 73 74 20 75 38 20 2a 61 44 61 74 61 2c 20 69  nst u8 *aData, i
a440: 6e 74 20 6e 44 61 74 61 2c 20 46 74 73 35 4e 6f  nt nData, Fts5No
a450: 64 65 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a  deIter *pIter){.
a460: 20 20 6d 65 6d 73 65 74 28 70 49 74 65 72 2c 20    memset(pIter, 
a470: 30 2c 20 73 69 7a 65 6f 66 28 2a 70 49 74 65 72  0, sizeof(*pIter
a480: 29 29 3b 0a 20 20 70 49 74 65 72 2d 3e 61 44 61  ));.  pIter->aDa
a490: 74 61 20 3d 20 61 44 61 74 61 3b 0a 20 20 70 49  ta = aData;.  pI
a4a0: 74 65 72 2d 3e 6e 44 61 74 61 20 3d 20 6e 44 61  ter->nData = nDa
a4b0: 74 61 3b 0a 20 20 70 49 74 65 72 2d 3e 69 4f 66  ta;.  pIter->iOf
a4c0: 66 20 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e  f = fts5GetVarin
a4d0: 74 33 32 28 61 44 61 74 61 2c 20 70 49 74 65 72  t32(aData, pIter
a4e0: 2d 3e 69 43 68 69 6c 64 29 3b 0a 20 20 66 74 73  ->iChild);.  fts
a4f0: 35 4e 6f 64 65 49 74 65 72 47 6f 62 62 6c 65 4e  5NodeIterGobbleN
a500: 45 6d 70 74 79 28 70 49 74 65 72 29 3b 0a 7d 0a  Empty(pIter);.}.
a510: 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 6e 79 20  ./*.** Free any 
a520: 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 65 64  memory allocated
a530: 20 62 79 20 74 68 65 20 69 74 65 72 61 74 6f 72   by the iterator
a540: 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 73 74 61 74   object..*/.stat
a550: 69 63 20 76 6f 69 64 20 66 74 73 35 4e 6f 64 65  ic void fts5Node
a560: 49 74 65 72 46 72 65 65 28 46 74 73 35 4e 6f 64  IterFree(Fts5Nod
a570: 65 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a 20  eIter *pIter){. 
a580: 20 66 74 73 35 42 75 66 66 65 72 46 72 65 65 28   fts5BufferFree(
a590: 26 70 49 74 65 72 2d 3e 74 65 72 6d 29 3b 0a 7d  &pIter->term);.}
a5a0: 0a 0a 2f 2a 0a 2a 2a 20 41 64 76 61 6e 63 65 20  ../*.** Advance 
a5b0: 74 68 65 20 69 74 65 72 61 74 6f 72 20 70 61 73  the iterator pas
a5c0: 73 65 64 20 61 73 20 74 68 65 20 6f 6e 6c 79 20  sed as the only 
a5d0: 61 72 67 75 6d 65 6e 74 2e 20 49 66 20 74 68 65  argument. If the
a5e0: 20 65 6e 64 20 6f 66 20 74 68 65 20 0a 2a 2a 20   end of the .** 
a5f0: 64 6f 63 6c 69 73 74 2d 69 6e 64 65 78 20 70 61  doclist-index pa
a600: 67 65 20 69 73 20 72 65 61 63 68 65 64 2c 20 72  ge is reached, r
a610: 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 2e 0a  eturn non-zero..
a620: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74  */.static int ft
a630: 73 35 44 6c 69 64 78 4c 76 6c 4e 65 78 74 28 46  s5DlidxLvlNext(F
a640: 74 73 35 44 6c 69 64 78 4c 76 6c 20 2a 70 4c 76  ts5DlidxLvl *pLv
a650: 6c 29 7b 0a 20 20 46 74 73 35 44 61 74 61 20 2a  l){.  Fts5Data *
a660: 70 44 61 74 61 20 3d 20 70 4c 76 6c 2d 3e 70 44  pData = pLvl->pD
a670: 61 74 61 3b 0a 0a 20 20 69 66 28 20 70 4c 76 6c  ata;..  if( pLvl
a680: 2d 3e 69 4f 66 66 3d 3d 30 20 29 7b 0a 20 20 20  ->iOff==0 ){.   
a690: 20 61 73 73 65 72 74 28 20 70 4c 76 6c 2d 3e 62   assert( pLvl->b
a6a0: 45 6f 66 3d 3d 30 20 29 3b 0a 20 20 20 20 70 4c  Eof==0 );.    pL
a6b0: 76 6c 2d 3e 69 4f 66 66 20 3d 20 31 3b 0a 20 20  vl->iOff = 1;.  
a6c0: 20 20 70 4c 76 6c 2d 3e 69 4f 66 66 20 2b 3d 20    pLvl->iOff += 
a6d0: 66 74 73 35 47 65 74 56 61 72 69 6e 74 33 32 28  fts5GetVarint32(
a6e0: 26 70 44 61 74 61 2d 3e 70 5b 31 5d 2c 20 70 4c  &pData->p[1], pL
a6f0: 76 6c 2d 3e 69 4c 65 61 66 50 67 6e 6f 29 3b 0a  vl->iLeafPgno);.
a700: 20 20 20 20 70 4c 76 6c 2d 3e 69 4f 66 66 20 2b      pLvl->iOff +
a710: 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e 74 28  = fts5GetVarint(
a720: 26 70 44 61 74 61 2d 3e 70 5b 70 4c 76 6c 2d 3e  &pData->p[pLvl->
a730: 69 4f 66 66 5d 2c 20 28 75 36 34 2a 29 26 70 4c  iOff], (u64*)&pL
a740: 76 6c 2d 3e 69 52 6f 77 69 64 29 3b 0a 20 20 20  vl->iRowid);.   
a750: 20 70 4c 76 6c 2d 3e 69 46 69 72 73 74 4f 66 66   pLvl->iFirstOff
a760: 20 3d 20 70 4c 76 6c 2d 3e 69 4f 66 66 3b 0a 20   = pLvl->iOff;. 
a770: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20   }else{.    int 
a780: 69 4f 66 66 3b 0a 20 20 20 20 66 6f 72 28 69 4f  iOff;.    for(iO
a790: 66 66 3d 70 4c 76 6c 2d 3e 69 4f 66 66 3b 20 69  ff=pLvl->iOff; i
a7a0: 4f 66 66 3c 70 44 61 74 61 2d 3e 6e 3b 20 69 4f  Off<pData->n; iO
a7b0: 66 66 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28  ff++){.      if(
a7c0: 20 70 44 61 74 61 2d 3e 70 5b 69 4f 66 66 5d 20   pData->p[iOff] 
a7d0: 29 20 62 72 65 61 6b 3b 20 0a 20 20 20 20 7d 0a  ) break; .    }.
a7e0: 0a 20 20 20 20 69 66 28 20 69 4f 66 66 3c 70 44  .    if( iOff<pD
a7f0: 61 74 61 2d 3e 6e 20 29 7b 0a 20 20 20 20 20 20  ata->n ){.      
a800: 69 36 34 20 69 56 61 6c 3b 0a 20 20 20 20 20 20  i64 iVal;.      
a810: 70 4c 76 6c 2d 3e 69 4c 65 61 66 50 67 6e 6f 20  pLvl->iLeafPgno 
a820: 2b 3d 20 28 69 4f 66 66 20 2d 20 70 4c 76 6c 2d  += (iOff - pLvl-
a830: 3e 69 4f 66 66 29 20 2b 20 31 3b 0a 20 20 20 20  >iOff) + 1;.    
a840: 20 20 69 4f 66 66 20 2b 3d 20 66 74 73 35 47 65    iOff += fts5Ge
a850: 74 56 61 72 69 6e 74 28 26 70 44 61 74 61 2d 3e  tVarint(&pData->
a860: 70 5b 69 4f 66 66 5d 2c 20 28 75 36 34 2a 29 26  p[iOff], (u64*)&
a870: 69 56 61 6c 29 3b 0a 20 20 20 20 20 20 70 4c 76  iVal);.      pLv
a880: 6c 2d 3e 69 52 6f 77 69 64 20 2b 3d 20 69 56 61  l->iRowid += iVa
a890: 6c 3b 0a 20 20 20 20 20 20 70 4c 76 6c 2d 3e 69  l;.      pLvl->i
a8a0: 4f 66 66 20 3d 20 69 4f 66 66 3b 0a 20 20 20 20  Off = iOff;.    
a8b0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 4c 76  }else{.      pLv
a8c0: 6c 2d 3e 62 45 6f 66 20 3d 20 31 3b 0a 20 20 20  l->bEof = 1;.   
a8d0: 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e   }.  }..  return
a8e0: 20 70 4c 76 6c 2d 3e 62 45 6f 66 3b 0a 7d 0a 0a   pLvl->bEof;.}..
a8f0: 2f 2a 0a 2a 2a 20 41 64 76 61 6e 63 65 20 74 68  /*.** Advance th
a900: 65 20 69 74 65 72 61 74 6f 72 20 70 61 73 73 65  e iterator passe
a910: 64 20 61 73 20 74 68 65 20 6f 6e 6c 79 20 61 72  d as the only ar
a920: 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69  gument..*/.stati
a930: 63 20 69 6e 74 20 66 74 73 35 44 6c 69 64 78 49  c int fts5DlidxI
a940: 74 65 72 4e 65 78 74 52 28 46 74 73 35 49 6e 64  terNextR(Fts5Ind
a950: 65 78 20 2a 70 2c 20 46 74 73 35 44 6c 69 64 78  ex *p, Fts5Dlidx
a960: 49 74 65 72 20 2a 70 49 74 65 72 2c 20 69 6e 74  Iter *pIter, int
a970: 20 69 4c 76 6c 29 7b 0a 20 20 46 74 73 35 44 6c   iLvl){.  Fts5Dl
a980: 69 64 78 4c 76 6c 20 2a 70 4c 76 6c 20 3d 20 26  idxLvl *pLvl = &
a990: 70 49 74 65 72 2d 3e 61 4c 76 6c 5b 69 4c 76 6c  pIter->aLvl[iLvl
a9a0: 5d 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 69 4c  ];..  assert( iL
a9b0: 76 6c 3c 70 49 74 65 72 2d 3e 6e 4c 76 6c 20 29  vl<pIter->nLvl )
a9c0: 3b 0a 20 20 69 66 28 20 66 74 73 35 44 6c 69 64  ;.  if( fts5Dlid
a9d0: 78 4c 76 6c 4e 65 78 74 28 70 4c 76 6c 29 20 29  xLvlNext(pLvl) )
a9e0: 7b 0a 20 20 20 20 69 66 28 20 28 69 4c 76 6c 2b  {.    if( (iLvl+
a9f0: 31 29 20 3c 20 70 49 74 65 72 2d 3e 6e 4c 76 6c  1) < pIter->nLvl
aa00: 20 29 7b 0a 20 20 20 20 20 20 66 74 73 35 44 6c   ){.      fts5Dl
aa10: 69 64 78 49 74 65 72 4e 65 78 74 52 28 70 2c 20  idxIterNextR(p, 
aa20: 70 49 74 65 72 2c 20 69 4c 76 6c 2b 31 29 3b 0a  pIter, iLvl+1);.
aa30: 20 20 20 20 20 20 69 66 28 20 70 4c 76 6c 5b 31        if( pLvl[1
aa40: 5d 2e 62 45 6f 66 3d 3d 30 20 29 7b 0a 20 20 20  ].bEof==0 ){.   
aa50: 20 20 20 20 20 66 74 73 35 44 61 74 61 52 65 6c       fts5DataRel
aa60: 65 61 73 65 28 70 4c 76 6c 2d 3e 70 44 61 74 61  ease(pLvl->pData
aa70: 29 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 73 65  );.        memse
aa80: 74 28 70 4c 76 6c 2c 20 30 2c 20 73 69 7a 65 6f  t(pLvl, 0, sizeo
aa90: 66 28 46 74 73 35 44 6c 69 64 78 4c 76 6c 29 29  f(Fts5DlidxLvl))
aaa0: 3b 0a 20 20 20 20 20 20 20 20 70 4c 76 6c 2d 3e  ;.        pLvl->
aab0: 70 44 61 74 61 20 3d 20 66 74 73 35 44 61 74 61  pData = fts5Data
aac0: 52 65 61 64 28 70 2c 20 0a 20 20 20 20 20 20 20  Read(p, .       
aad0: 20 20 20 20 20 46 54 53 35 5f 44 4c 49 44 58 5f       FTS5_DLIDX_
aae0: 52 4f 57 49 44 28 70 49 74 65 72 2d 3e 69 53 65  ROWID(pIter->iSe
aaf0: 67 69 64 2c 20 69 4c 76 6c 2c 20 70 4c 76 6c 5b  gid, iLvl, pLvl[
ab00: 31 5d 2e 69 4c 65 61 66 50 67 6e 6f 29 0a 20 20  1].iLeafPgno).  
ab10: 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20        );.       
ab20: 20 69 66 28 20 70 4c 76 6c 2d 3e 70 44 61 74 61   if( pLvl->pData
ab30: 20 29 20 66 74 73 35 44 6c 69 64 78 4c 76 6c 4e   ) fts5DlidxLvlN
ab40: 65 78 74 28 70 4c 76 6c 29 3b 0a 20 20 20 20 20  ext(pLvl);.     
ab50: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20   }.    }.  }..  
ab60: 72 65 74 75 72 6e 20 70 49 74 65 72 2d 3e 61 4c  return pIter->aL
ab70: 76 6c 5b 30 5d 2e 62 45 6f 66 3b 0a 7d 0a 73 74  vl[0].bEof;.}.st
ab80: 61 74 69 63 20 69 6e 74 20 66 74 73 35 44 6c 69  atic int fts5Dli
ab90: 64 78 49 74 65 72 4e 65 78 74 28 46 74 73 35 49  dxIterNext(Fts5I
aba0: 6e 64 65 78 20 2a 70 2c 20 46 74 73 35 44 6c 69  ndex *p, Fts5Dli
abb0: 64 78 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a  dxIter *pIter){.
abc0: 20 20 72 65 74 75 72 6e 20 66 74 73 35 44 6c 69    return fts5Dli
abd0: 64 78 49 74 65 72 4e 65 78 74 52 28 70 2c 20 70  dxIterNextR(p, p
abe0: 49 74 65 72 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a  Iter, 0);.}../*.
abf0: 2a 2a 20 54 68 65 20 69 74 65 72 61 74 6f 72 20  ** The iterator 
ac00: 70 61 73 73 65 64 20 61 73 20 74 68 65 20 66 69  passed as the fi
ac10: 72 73 74 20 61 72 67 75 6d 65 6e 74 20 68 61 73  rst argument has
ac20: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66   the following f
ac30: 69 65 6c 64 73 20 73 65 74 0a 2a 2a 20 61 73 20  ields set.** as 
ac40: 66 6f 6c 6c 6f 77 73 2e 20 54 68 69 73 20 66 75  follows. This fu
ac50: 6e 63 74 69 6f 6e 20 73 65 74 73 20 75 70 20 74  nction sets up t
ac60: 68 65 20 72 65 73 74 20 6f 66 20 74 68 65 20 69  he rest of the i
ac70: 74 65 72 61 74 6f 72 20 73 6f 20 74 68 61 74 20  terator so that 
ac80: 69 74 0a 2a 2a 20 70 6f 69 6e 74 73 20 74 6f 20  it.** points to 
ac90: 74 68 65 20 66 69 72 73 74 20 72 6f 77 69 64 20  the first rowid 
aca0: 69 6e 20 74 68 65 20 64 6f 63 6c 69 73 74 2d 69  in the doclist-i
acb0: 6e 64 65 78 2e 0a 2a 2a 0a 2a 2a 20 20 20 70 44  ndex..**.**   pD
acc0: 61 74 61 3a 0a 2a 2a 20 20 20 20 20 70 6f 69 6e  ata:.**     poin
acd0: 74 65 72 20 74 6f 20 64 6f 63 6c 69 73 74 2d 69  ter to doclist-i
ace0: 6e 64 65 78 20 72 65 63 6f 72 64 2c 20 0a 2a 2a  ndex record, .**
acf0: 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73 20 66 75  .** When this fu
ad00: 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
ad10: 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e   pIter->iLeafPgn
ad20: 6f 20 69 73 20 74 68 65 20 70 61 67 65 20 6e 75  o is the page nu
ad30: 6d 62 65 72 20 74 68 65 0a 2a 2a 20 64 6f 63 6c  mber the.** docl
ad40: 69 73 74 20 69 73 20 61 73 73 6f 63 69 61 74 65  ist is associate
ad50: 64 20 77 69 74 68 20 28 74 68 65 20 6f 6e 65 20  d with (the one 
ad60: 66 65 61 74 75 72 69 6e 67 20 74 68 65 20 74 65  featuring the te
ad70: 72 6d 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  rm)..*/.static i
ad80: 6e 74 20 66 74 73 35 44 6c 69 64 78 49 74 65 72  nt fts5DlidxIter
ad90: 46 69 72 73 74 28 46 74 73 35 44 6c 69 64 78 49  First(Fts5DlidxI
ada0: 74 65 72 20 2a 70 49 74 65 72 29 7b 0a 20 20 69  ter *pIter){.  i
adb0: 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  nt i;.  for(i=0;
adc0: 20 69 3c 70 49 74 65 72 2d 3e 6e 4c 76 6c 3b 20   i<pIter->nLvl; 
add0: 69 2b 2b 29 7b 0a 20 20 20 20 66 74 73 35 44 6c  i++){.    fts5Dl
ade0: 69 64 78 4c 76 6c 4e 65 78 74 28 26 70 49 74 65  idxLvlNext(&pIte
adf0: 72 2d 3e 61 4c 76 6c 5b 69 5d 29 3b 0a 20 20 7d  r->aLvl[i]);.  }
ae00: 0a 20 20 72 65 74 75 72 6e 20 70 49 74 65 72 2d  .  return pIter-
ae10: 3e 61 4c 76 6c 5b 30 5d 2e 62 45 6f 66 3b 0a 7d  >aLvl[0].bEof;.}
ae20: 0a 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74  ...static int ft
ae30: 73 35 44 6c 69 64 78 49 74 65 72 45 6f 66 28 46  s5DlidxIterEof(F
ae40: 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 46 74 73  ts5Index *p, Fts
ae50: 35 44 6c 69 64 78 49 74 65 72 20 2a 70 49 74 65  5DlidxIter *pIte
ae60: 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e  r){.  return p->
ae70: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc!=SQLITE_OK ||
ae80: 20 70 49 74 65 72 2d 3e 61 4c 76 6c 5b 30 5d 2e   pIter->aLvl[0].
ae90: 62 45 6f 66 3b 0a 7d 0a 0a 73 74 61 74 69 63 20  bEof;.}..static 
aea0: 76 6f 69 64 20 66 74 73 35 44 6c 69 64 78 49 74  void fts5DlidxIt
aeb0: 65 72 4c 61 73 74 28 46 74 73 35 49 6e 64 65 78  erLast(Fts5Index
aec0: 20 2a 70 2c 20 46 74 73 35 44 6c 69 64 78 49 74   *p, Fts5DlidxIt
aed0: 65 72 20 2a 70 49 74 65 72 29 7b 0a 20 20 69 6e  er *pIter){.  in
aee0: 74 20 69 3b 0a 0a 20 20 2f 2a 20 41 64 76 61 6e  t i;..  /* Advan
aef0: 63 65 20 65 61 63 68 20 6c 65 76 65 6c 20 74 6f  ce each level to
af00: 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72 79 20   the last entry 
af10: 6f 6e 20 74 68 65 20 6c 61 73 74 20 70 61 67 65  on the last page
af20: 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 70 49 74 65   */.  for(i=pIte
af30: 72 2d 3e 6e 4c 76 6c 2d 31 3b 20 70 2d 3e 72 63  r->nLvl-1; p->rc
af40: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69  ==SQLITE_OK && i
af50: 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 46  >=0; i--){.    F
af60: 74 73 35 44 6c 69 64 78 4c 76 6c 20 2a 70 4c 76  ts5DlidxLvl *pLv
af70: 6c 20 3d 20 26 70 49 74 65 72 2d 3e 61 4c 76 6c  l = &pIter->aLvl
af80: 5b 69 5d 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  [i];.    while( 
af90: 66 74 73 35 44 6c 69 64 78 4c 76 6c 4e 65 78 74  fts5DlidxLvlNext
afa0: 28 70 4c 76 6c 29 3d 3d 30 20 29 3b 0a 20 20 20  (pLvl)==0 );.   
afb0: 20 70 4c 76 6c 2d 3e 62 45 6f 66 20 3d 20 30 3b   pLvl->bEof = 0;
afc0: 0a 0a 20 20 20 20 69 66 28 20 69 3e 30 20 29 7b  ..    if( i>0 ){
afd0: 0a 20 20 20 20 20 20 46 74 73 35 44 6c 69 64 78  .      Fts5Dlidx
afe0: 4c 76 6c 20 2a 70 43 68 69 6c 64 20 3d 20 26 70  Lvl *pChild = &p
aff0: 4c 76 6c 5b 2d 31 5d 3b 0a 20 20 20 20 20 20 66  Lvl[-1];.      f
b000: 74 73 35 44 61 74 61 52 65 6c 65 61 73 65 28 70  ts5DataRelease(p
b010: 43 68 69 6c 64 2d 3e 70 44 61 74 61 29 3b 0a 20  Child->pData);. 
b020: 20 20 20 20 20 6d 65 6d 73 65 74 28 70 43 68 69       memset(pChi
b030: 6c 64 2c 20 30 2c 20 73 69 7a 65 6f 66 28 46 74  ld, 0, sizeof(Ft
b040: 73 35 44 6c 69 64 78 4c 76 6c 29 29 3b 0a 20 20  s5DlidxLvl));.  
b050: 20 20 20 20 70 43 68 69 6c 64 2d 3e 70 44 61 74      pChild->pDat
b060: 61 20 3d 20 66 74 73 35 44 61 74 61 52 65 61 64  a = fts5DataRead
b070: 28 70 2c 20 0a 20 20 20 20 20 20 20 20 20 20 46  (p, .          F
b080: 54 53 35 5f 44 4c 49 44 58 5f 52 4f 57 49 44 28  TS5_DLIDX_ROWID(
b090: 70 49 74 65 72 2d 3e 69 53 65 67 69 64 2c 20 69  pIter->iSegid, i
b0a0: 2d 31 2c 20 70 4c 76 6c 2d 3e 69 4c 65 61 66 50  -1, pLvl->iLeafP
b0b0: 67 6e 6f 29 0a 20 20 20 20 20 20 29 3b 0a 20 20  gno).      );.  
b0c0: 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
b0d0: 20 4d 6f 76 65 20 74 68 65 20 69 74 65 72 61 74   Move the iterat
b0e0: 6f 72 20 70 61 73 73 65 64 20 61 73 20 74 68 65  or passed as the
b0f0: 20 6f 6e 6c 79 20 61 72 67 75 6d 65 6e 74 20 74   only argument t
b100: 6f 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 65  o the previous e
b110: 6e 74 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ntry..*/.static 
b120: 69 6e 74 20 66 74 73 35 44 6c 69 64 78 4c 76 6c  int fts5DlidxLvl
b130: 50 72 65 76 28 46 74 73 35 44 6c 69 64 78 4c 76  Prev(Fts5DlidxLv
b140: 6c 20 2a 70 4c 76 6c 29 7b 0a 20 20 69 6e 74 20  l *pLvl){.  int 
b150: 69 4f 66 66 20 3d 20 70 4c 76 6c 2d 3e 69 4f 66  iOff = pLvl->iOf
b160: 66 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 4c  f;..  assert( pL
b170: 76 6c 2d 3e 62 45 6f 66 3d 3d 30 20 29 3b 0a 20  vl->bEof==0 );. 
b180: 20 69 66 28 20 69 4f 66 66 3c 3d 70 4c 76 6c 2d   if( iOff<=pLvl-
b190: 3e 69 46 69 72 73 74 4f 66 66 20 29 7b 0a 20 20  >iFirstOff ){.  
b1a0: 20 20 70 4c 76 6c 2d 3e 62 45 6f 66 20 3d 20 31    pLvl->bEof = 1
b1b0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 75  ;.  }else{.    u
b1c0: 38 20 2a 61 20 3d 20 70 4c 76 6c 2d 3e 70 44 61  8 *a = pLvl->pDa
b1d0: 74 61 2d 3e 70 3b 0a 20 20 20 20 69 36 34 20 69  ta->p;.    i64 i
b1e0: 56 61 6c 3b 0a 20 20 20 20 69 6e 74 20 69 4c 69  Val;.    int iLi
b1f0: 6d 69 74 3b 0a 20 20 20 20 69 6e 74 20 69 69 3b  mit;.    int ii;
b200: 0a 20 20 20 20 69 6e 74 20 6e 5a 65 72 6f 20 3d  .    int nZero =
b210: 20 30 3b 0a 0a 20 20 20 20 2f 2a 20 43 75 72 72   0;..    /* Curr
b220: 65 6e 74 6c 79 20 69 4f 66 66 20 70 6f 69 6e 74  ently iOff point
b230: 73 20 74 6f 20 74 68 65 20 66 69 72 73 74 20 62  s to the first b
b240: 79 74 65 20 6f 66 20 61 20 76 61 72 69 6e 74 2e  yte of a varint.
b250: 20 54 68 69 73 20 62 6c 6f 63 6b 20 0a 20 20 20   This block .   
b260: 20 2a 2a 20 64 65 63 72 65 6d 65 6e 74 73 20 69   ** decrements i
b270: 4f 66 66 20 75 6e 74 69 6c 20 69 74 20 70 6f 69  Off until it poi
b280: 6e 74 73 20 74 6f 20 74 68 65 20 66 69 72 73 74  nts to the first
b290: 20 62 79 74 65 20 6f 66 20 74 68 65 20 70 72 65   byte of the pre
b2a0: 76 69 6f 75 73 20 0a 20 20 20 20 2a 2a 20 76 61  vious .    ** va
b2b0: 72 69 6e 74 2e 20 54 61 6b 69 6e 67 20 63 61 72  rint. Taking car
b2c0: 65 20 6e 6f 74 20 74 6f 20 72 65 61 64 20 61 6e  e not to read an
b2d0: 79 20 6d 65 6d 6f 72 79 20 6c 6f 63 61 74 69 6f  y memory locatio
b2e0: 6e 73 20 74 68 61 74 20 6f 63 63 75 72 0a 20 20  ns that occur.  
b2f0: 20 20 2a 2a 20 62 65 66 6f 72 65 20 74 68 65 20    ** before the 
b300: 62 75 66 66 65 72 20 69 6e 20 6d 65 6d 6f 72 79  buffer in memory
b310: 2e 20 20 2a 2f 0a 20 20 20 20 69 4c 69 6d 69 74  .  */.    iLimit
b320: 20 3d 20 28 69 4f 66 66 3e 39 20 3f 20 69 4f 66   = (iOff>9 ? iOf
b330: 66 2d 39 20 3a 20 30 29 3b 0a 20 20 20 20 66 6f  f-9 : 0);.    fo
b340: 72 28 69 4f 66 66 2d 2d 3b 20 69 4f 66 66 3e 69  r(iOff--; iOff>i
b350: 4c 69 6d 69 74 3b 20 69 4f 66 66 2d 2d 29 7b 0a  Limit; iOff--){.
b360: 20 20 20 20 20 20 69 66 28 20 28 61 5b 69 4f 66        if( (a[iOf
b370: 66 2d 31 5d 20 26 20 30 78 38 30 29 3d 3d 30 20  f-1] & 0x80)==0 
b380: 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a  ) break;.    }..
b390: 20 20 20 20 66 74 73 35 47 65 74 56 61 72 69 6e      fts5GetVarin
b3a0: 74 28 26 61 5b 69 4f 66 66 5d 2c 20 28 75 36 34  t(&a[iOff], (u64
b3b0: 2a 29 26 69 56 61 6c 29 3b 0a 20 20 20 20 70 4c  *)&iVal);.    pL
b3c0: 76 6c 2d 3e 69 52 6f 77 69 64 20 2d 3d 20 69 56  vl->iRowid -= iV
b3d0: 61 6c 3b 0a 20 20 20 20 70 4c 76 6c 2d 3e 69 4c  al;.    pLvl->iL
b3e0: 65 61 66 50 67 6e 6f 2d 2d 3b 0a 0a 20 20 20 20  eafPgno--;..    
b3f0: 2f 2a 20 53 6b 69 70 20 62 61 63 6b 77 61 72 64  /* Skip backward
b400: 73 20 70 61 73 74 20 61 6e 79 20 30 78 30 30 20  s past any 0x00 
b410: 76 61 72 69 6e 74 73 2e 20 2a 2f 0a 20 20 20 20  varints. */.    
b420: 66 6f 72 28 69 69 3d 69 4f 66 66 2d 31 3b 20 69  for(ii=iOff-1; i
b430: 69 3e 3d 70 4c 76 6c 2d 3e 69 46 69 72 73 74 4f  i>=pLvl->iFirstO
b440: 66 66 20 26 26 20 61 5b 69 69 5d 3d 3d 30 78 30  ff && a[ii]==0x0
b450: 30 3b 20 69 69 2d 2d 29 7b 0a 20 20 20 20 20 20  0; ii--){.      
b460: 6e 5a 65 72 6f 2b 2b 3b 0a 20 20 20 20 7d 0a 20  nZero++;.    }. 
b470: 20 20 20 69 66 28 20 69 69 3e 3d 70 4c 76 6c 2d     if( ii>=pLvl-
b480: 3e 69 46 69 72 73 74 4f 66 66 20 26 26 20 28 61  >iFirstOff && (a
b490: 5b 69 69 5d 20 26 20 30 78 38 30 29 20 29 7b 0a  [ii] & 0x80) ){.
b4a0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 62 79 74        /* The byt
b4b0: 65 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 62 65  e immediately be
b4c0: 66 6f 72 65 20 74 68 65 20 6c 61 73 74 20 30 78  fore the last 0x
b4d0: 30 30 20 62 79 74 65 20 68 61 73 20 74 68 65 20  00 byte has the 
b4e0: 30 78 38 30 20 62 69 74 0a 20 20 20 20 20 20 2a  0x80 bit.      *
b4f0: 2a 20 73 65 74 2e 20 53 6f 20 74 68 65 20 6c 61  * set. So the la
b500: 73 74 20 30 78 30 30 20 69 73 20 6f 6e 6c 79 20  st 0x00 is only 
b510: 61 20 76 61 72 69 6e 74 20 30 20 69 66 20 74 68  a varint 0 if th
b520: 65 72 65 20 61 72 65 20 38 20 6d 6f 72 65 20 30  ere are 8 more 0
b530: 78 38 30 0a 20 20 20 20 20 20 2a 2a 20 62 79 74  x80.      ** byt
b540: 65 73 20 62 65 66 6f 72 65 20 61 5b 69 69 5d 2e  es before a[ii].
b550: 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 62 5a   */.      int bZ
b560: 65 72 6f 20 3d 20 30 3b 20 20 20 20 20 20 20 20  ero = 0;        
b570: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
b580: 20 6c 61 73 74 20 30 78 30 30 20 63 6f 75 6e 74   last 0x00 count
b590: 73 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 28  s */.      if( (
b5a0: 69 69 2d 38 29 3e 3d 70 4c 76 6c 2d 3e 69 46 69  ii-8)>=pLvl->iFi
b5b0: 72 73 74 4f 66 66 20 29 7b 0a 20 20 20 20 20 20  rstOff ){.      
b5c0: 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 20    int j;.       
b5d0: 20 66 6f 72 28 6a 3d 31 3b 20 6a 3c 3d 38 20 26   for(j=1; j<=8 &
b5e0: 26 20 28 61 5b 69 69 2d 6a 5d 20 26 20 30 78 38  & (a[ii-j] & 0x8
b5f0: 30 29 3b 20 6a 2b 2b 29 3b 0a 20 20 20 20 20 20  0); j++);.      
b600: 20 20 62 5a 65 72 6f 20 3d 20 28 6a 3e 38 29 3b    bZero = (j>8);
b610: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
b620: 66 28 20 62 5a 65 72 6f 3d 3d 30 20 29 20 6e 5a  f( bZero==0 ) nZ
b630: 65 72 6f 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 20  ero--;.    }.   
b640: 20 70 4c 76 6c 2d 3e 69 4c 65 61 66 50 67 6e 6f   pLvl->iLeafPgno
b650: 20 2d 3d 20 6e 5a 65 72 6f 3b 0a 20 20 20 20 70   -= nZero;.    p
b660: 4c 76 6c 2d 3e 69 4f 66 66 20 3d 20 69 4f 66 66  Lvl->iOff = iOff
b670: 20 2d 20 6e 5a 65 72 6f 3b 0a 20 20 7d 0a 0a 20   - nZero;.  }.. 
b680: 20 72 65 74 75 72 6e 20 70 4c 76 6c 2d 3e 62 45   return pLvl->bE
b690: 6f 66 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e  of;.}..static in
b6a0: 74 20 66 74 73 35 44 6c 69 64 78 49 74 65 72 50  t fts5DlidxIterP
b6b0: 72 65 76 52 28 46 74 73 35 49 6e 64 65 78 20 2a  revR(Fts5Index *
b6c0: 70 2c 20 46 74 73 35 44 6c 69 64 78 49 74 65 72  p, Fts5DlidxIter
b6d0: 20 2a 70 49 74 65 72 2c 20 69 6e 74 20 69 4c 76   *pIter, int iLv
b6e0: 6c 29 7b 0a 20 20 46 74 73 35 44 6c 69 64 78 4c  l){.  Fts5DlidxL
b6f0: 76 6c 20 2a 70 4c 76 6c 20 3d 20 26 70 49 74 65  vl *pLvl = &pIte
b700: 72 2d 3e 61 4c 76 6c 5b 69 4c 76 6c 5d 3b 0a 0a  r->aLvl[iLvl];..
b710: 20 20 61 73 73 65 72 74 28 20 69 4c 76 6c 3c 70    assert( iLvl<p
b720: 49 74 65 72 2d 3e 6e 4c 76 6c 20 29 3b 0a 20 20  Iter->nLvl );.  
b730: 69 66 28 20 66 74 73 35 44 6c 69 64 78 4c 76 6c  if( fts5DlidxLvl
b740: 50 72 65 76 28 70 4c 76 6c 29 20 29 7b 0a 20 20  Prev(pLvl) ){.  
b750: 20 20 69 66 28 20 28 69 4c 76 6c 2b 31 29 20 3c    if( (iLvl+1) <
b760: 20 70 49 74 65 72 2d 3e 6e 4c 76 6c 20 29 7b 0a   pIter->nLvl ){.
b770: 20 20 20 20 20 20 66 74 73 35 44 6c 69 64 78 49        fts5DlidxI
b780: 74 65 72 50 72 65 76 52 28 70 2c 20 70 49 74 65  terPrevR(p, pIte
b790: 72 2c 20 69 4c 76 6c 2b 31 29 3b 0a 20 20 20 20  r, iLvl+1);.    
b7a0: 20 20 69 66 28 20 70 4c 76 6c 5b 31 5d 2e 62 45    if( pLvl[1].bE
b7b0: 6f 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  of==0 ){.       
b7c0: 20 66 74 73 35 44 61 74 61 52 65 6c 65 61 73 65   fts5DataRelease
b7d0: 28 70 4c 76 6c 2d 3e 70 44 61 74 61 29 3b 0a 20  (pLvl->pData);. 
b7e0: 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70 4c         memset(pL
b7f0: 76 6c 2c 20 30 2c 20 73 69 7a 65 6f 66 28 46 74  vl, 0, sizeof(Ft
b800: 73 35 44 6c 69 64 78 4c 76 6c 29 29 3b 0a 20 20  s5DlidxLvl));.  
b810: 20 20 20 20 20 20 70 4c 76 6c 2d 3e 70 44 61 74        pLvl->pDat
b820: 61 20 3d 20 66 74 73 35 44 61 74 61 52 65 61 64  a = fts5DataRead
b830: 28 70 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  (p, .           
b840: 20 46 54 53 35 5f 44 4c 49 44 58 5f 52 4f 57 49   FTS5_DLIDX_ROWI
b850: 44 28 70 49 74 65 72 2d 3e 69 53 65 67 69 64 2c  D(pIter->iSegid,
b860: 20 69 4c 76 6c 2c 20 70 4c 76 6c 5b 31 5d 2e 69   iLvl, pLvl[1].i
b870: 4c 65 61 66 50 67 6e 6f 29 0a 20 20 20 20 20 20  LeafPgno).      
b880: 20 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28    );.        if(
b890: 20 70 4c 76 6c 2d 3e 70 44 61 74 61 20 29 7b 0a   pLvl->pData ){.
b8a0: 20 20 20 20 20 20 20 20 20 20 77 68 69 6c 65 28            while(
b8b0: 20 66 74 73 35 44 6c 69 64 78 4c 76 6c 4e 65 78   fts5DlidxLvlNex
b8c0: 74 28 70 4c 76 6c 29 3d 3d 30 20 29 3b 0a 20 20  t(pLvl)==0 );.  
b8d0: 20 20 20 20 20 20 20 20 70 4c 76 6c 2d 3e 62 45          pLvl->bE
b8e0: 6f 66 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  of = 0;.        
b8f0: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
b900: 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70 49    }..  return pI
b910: 74 65 72 2d 3e 61 4c 76 6c 5b 30 5d 2e 62 45 6f  ter->aLvl[0].bEo
b920: 66 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74 20  f;.}.static int 
b930: 66 74 73 35 44 6c 69 64 78 49 74 65 72 50 72 65  fts5DlidxIterPre
b940: 76 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20  v(Fts5Index *p, 
b950: 46 74 73 35 44 6c 69 64 78 49 74 65 72 20 2a 70  Fts5DlidxIter *p
b960: 49 74 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20  Iter){.  return 
b970: 66 74 73 35 44 6c 69 64 78 49 74 65 72 50 72 65  fts5DlidxIterPre
b980: 76 52 28 70 2c 20 70 49 74 65 72 2c 20 30 29 3b  vR(p, pIter, 0);
b990: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61  .}../*.** Free a
b9a0: 20 64 6f 63 6c 69 73 74 2d 69 6e 64 65 78 20 69   doclist-index i
b9b0: 74 65 72 61 74 6f 72 20 6f 62 6a 65 63 74 20 61  terator object a
b9c0: 6c 6c 6f 63 61 74 65 64 20 62 79 20 66 74 73 35  llocated by fts5
b9d0: 44 6c 69 64 78 49 74 65 72 49 6e 69 74 28 29 2e  DlidxIterInit().
b9e0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
b9f0: 66 74 73 35 44 6c 69 64 78 49 74 65 72 46 72 65  fts5DlidxIterFre
ba00: 65 28 46 74 73 35 44 6c 69 64 78 49 74 65 72 20  e(Fts5DlidxIter 
ba10: 2a 70 49 74 65 72 29 7b 0a 20 20 69 66 28 20 70  *pIter){.  if( p
ba20: 49 74 65 72 20 29 7b 0a 20 20 20 20 69 6e 74 20  Iter ){.    int 
ba30: 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  i;.    for(i=0; 
ba40: 69 3c 70 49 74 65 72 2d 3e 6e 4c 76 6c 3b 20 69  i<pIter->nLvl; i
ba50: 2b 2b 29 7b 0a 20 20 20 20 20 20 66 74 73 35 44  ++){.      fts5D
ba60: 61 74 61 52 65 6c 65 61 73 65 28 70 49 74 65 72  ataRelease(pIter
ba70: 2d 3e 61 4c 76 6c 5b 69 5d 2e 70 44 61 74 61 29  ->aLvl[i].pData)
ba80: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
ba90: 74 65 33 5f 66 72 65 65 28 70 49 74 65 72 29 3b  te3_free(pIter);
baa0: 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 46  .  }.}..static F
bab0: 74 73 35 44 6c 69 64 78 49 74 65 72 20 2a 66 74  ts5DlidxIter *ft
bac0: 73 35 44 6c 69 64 78 49 74 65 72 49 6e 69 74 28  s5DlidxIterInit(
bad0: 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c  .  Fts5Index *p,
bae0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
baf0: 20 20 20 2f 2a 20 46 74 73 35 20 42 61 63 6b 65     /* Fts5 Backe
bb00: 6e 64 20 74 6f 20 69 74 65 72 61 74 65 20 77 69  nd to iterate wi
bb10: 74 68 69 6e 20 2a 2f 0a 20 20 69 6e 74 20 62 52  thin */.  int bR
bb20: 65 76 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ev,             
bb30: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
bb40: 65 20 66 6f 72 20 4f 52 44 45 52 20 42 59 20 41  e for ORDER BY A
bb50: 53 43 20 2a 2f 0a 20 20 69 6e 74 20 69 53 65 67  SC */.  int iSeg
bb60: 69 64 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  id,             
bb70: 20 20 20 20 20 20 20 20 2f 2a 20 53 65 67 6d 65          /* Segme
bb80: 6e 74 20 69 64 20 2a 2f 0a 20 20 69 6e 74 20 69  nt id */.  int i
bb90: 4c 65 61 66 50 67 20 20 20 20 20 20 20 20 20 20  LeafPg          
bba0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65             /* Le
bbb0: 61 66 20 70 61 67 65 20 6e 75 6d 62 65 72 20 74  af page number t
bbc0: 6f 20 6c 6f 61 64 20 64 6c 69 64 78 20 66 6f 72  o load dlidx for
bbd0: 20 2a 2f 0a 29 7b 0a 20 20 46 74 73 35 44 6c 69   */.){.  Fts5Dli
bbe0: 64 78 49 74 65 72 20 2a 70 49 74 65 72 20 3d 20  dxIter *pIter = 
bbf0: 30 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e  0;.  int i;.  in
bc00: 74 20 62 44 6f 6e 65 20 3d 20 30 3b 0a 0a 20 20  t bDone = 0;..  
bc10: 66 6f 72 28 69 3d 30 3b 20 70 2d 3e 72 63 3d 3d  for(i=0; p->rc==
bc20: 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 62 44 6f  SQLITE_OK && bDo
bc30: 6e 65 3d 3d 30 3b 20 69 2b 2b 29 7b 0a 20 20 20  ne==0; i++){.   
bc40: 20 69 6e 74 20 6e 42 79 74 65 20 3d 20 73 69 7a   int nByte = siz
bc50: 65 6f 66 28 46 74 73 35 44 6c 69 64 78 49 74 65  eof(Fts5DlidxIte
bc60: 72 29 20 2b 20 69 20 2a 20 73 69 7a 65 6f 66 28  r) + i * sizeof(
bc70: 46 74 73 35 44 6c 69 64 78 4c 76 6c 29 3b 0a 20  Fts5DlidxLvl);. 
bc80: 20 20 20 46 74 73 35 44 6c 69 64 78 49 74 65 72     Fts5DlidxIter
bc90: 20 2a 70 4e 65 77 3b 0a 0a 20 20 20 20 70 4e 65   *pNew;..    pNe
bca0: 77 20 3d 20 28 46 74 73 35 44 6c 69 64 78 49 74  w = (Fts5DlidxIt
bcb0: 65 72 2a 29 73 71 6c 69 74 65 33 5f 72 65 61 6c  er*)sqlite3_real
bcc0: 6c 6f 63 28 70 49 74 65 72 2c 20 6e 42 79 74 65  loc(pIter, nByte
bcd0: 29 3b 0a 20 20 20 20 69 66 28 20 70 4e 65 77 3d  );.    if( pNew=
bce0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 72  =0 ){.      p->r
bcf0: 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
bd00: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
bd10: 20 20 20 69 36 34 20 69 52 6f 77 69 64 20 3d 20     i64 iRowid = 
bd20: 46 54 53 35 5f 44 4c 49 44 58 5f 52 4f 57 49 44  FTS5_DLIDX_ROWID
bd30: 28 69 53 65 67 69 64 2c 20 69 2c 20 69 4c 65 61  (iSegid, i, iLea
bd40: 66 50 67 29 3b 0a 20 20 20 20 20 20 46 74 73 35  fPg);.      Fts5
bd50: 44 6c 69 64 78 4c 76 6c 20 2a 70 4c 76 6c 20 3d  DlidxLvl *pLvl =
bd60: 20 26 70 4e 65 77 2d 3e 61 4c 76 6c 5b 69 5d 3b   &pNew->aLvl[i];
bd70: 0a 20 20 20 20 20 20 70 49 74 65 72 20 3d 20 70  .      pIter = p
bd80: 4e 65 77 3b 0a 20 20 20 20 20 20 6d 65 6d 73 65  New;.      memse
bd90: 74 28 70 4c 76 6c 2c 20 30 2c 20 73 69 7a 65 6f  t(pLvl, 0, sizeo
bda0: 66 28 46 74 73 35 44 6c 69 64 78 4c 76 6c 29 29  f(Fts5DlidxLvl))
bdb0: 3b 0a 20 20 20 20 20 20 70 4c 76 6c 2d 3e 70 44  ;.      pLvl->pD
bdc0: 61 74 61 20 3d 20 66 74 73 35 44 61 74 61 52 65  ata = fts5DataRe
bdd0: 61 64 28 70 2c 20 69 52 6f 77 69 64 29 3b 0a 20  ad(p, iRowid);. 
bde0: 20 20 20 20 20 69 66 28 20 70 4c 76 6c 2d 3e 70       if( pLvl->p
bdf0: 44 61 74 61 20 26 26 20 28 70 4c 76 6c 2d 3e 70  Data && (pLvl->p
be00: 44 61 74 61 2d 3e 70 5b 30 5d 20 26 20 30 78 30  Data->p[0] & 0x0
be10: 30 30 31 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  001)==0 ){.     
be20: 20 20 20 62 44 6f 6e 65 20 3d 20 31 3b 0a 20 20     bDone = 1;.  
be30: 20 20 20 20 7d 0a 20 20 20 20 20 20 70 49 74 65      }.      pIte
be40: 72 2d 3e 6e 4c 76 6c 20 3d 20 69 2b 31 3b 0a 20  r->nLvl = i+1;. 
be50: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20     }.  }..  if( 
be60: 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
be70: 20 29 7b 0a 20 20 20 20 70 49 74 65 72 2d 3e 69   ){.    pIter->i
be80: 53 65 67 69 64 20 3d 20 69 53 65 67 69 64 3b 0a  Segid = iSegid;.
be90: 20 20 20 20 69 66 28 20 62 52 65 76 3d 3d 30 20      if( bRev==0 
bea0: 29 7b 0a 20 20 20 20 20 20 66 74 73 35 44 6c 69  ){.      fts5Dli
beb0: 64 78 49 74 65 72 46 69 72 73 74 28 70 49 74 65  dxIterFirst(pIte
bec0: 72 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  r);.    }else{. 
bed0: 20 20 20 20 20 66 74 73 35 44 6c 69 64 78 49 74       fts5DlidxIt
bee0: 65 72 4c 61 73 74 28 70 2c 20 70 49 74 65 72 29  erLast(p, pIter)
bef0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69  ;.    }.  }..  i
bf00: 66 28 20 70 2d 3e 72 63 21 3d 53 51 4c 49 54 45  f( p->rc!=SQLITE
bf10: 5f 4f 4b 20 29 7b 0a 20 20 20 20 66 74 73 35 44  _OK ){.    fts5D
bf20: 6c 69 64 78 49 74 65 72 46 72 65 65 28 70 49 74  lidxIterFree(pIt
bf30: 65 72 29 3b 0a 20 20 20 20 70 49 74 65 72 20 3d  er);.    pIter =
bf40: 20 30 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72   0;.  }..  retur
bf50: 6e 20 70 49 74 65 72 3b 0a 7d 0a 0a 73 74 61 74  n pIter;.}..stat
bf60: 69 63 20 69 36 34 20 66 74 73 35 44 6c 69 64 78  ic i64 fts5Dlidx
bf70: 49 74 65 72 52 6f 77 69 64 28 46 74 73 35 44 6c  IterRowid(Fts5Dl
bf80: 69 64 78 49 74 65 72 20 2a 70 49 74 65 72 29 7b  idxIter *pIter){
bf90: 0a 20 20 72 65 74 75 72 6e 20 70 49 74 65 72 2d  .  return pIter-
bfa0: 3e 61 4c 76 6c 5b 30 5d 2e 69 52 6f 77 69 64 3b  >aLvl[0].iRowid;
bfb0: 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74  .}.static int ft
bfc0: 73 35 44 6c 69 64 78 49 74 65 72 50 67 6e 6f 28  s5DlidxIterPgno(
bfd0: 46 74 73 35 44 6c 69 64 78 49 74 65 72 20 2a 70  Fts5DlidxIter *p
bfe0: 49 74 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20  Iter){.  return 
bff0: 70 49 74 65 72 2d 3e 61 4c 76 6c 5b 30 5d 2e 69  pIter->aLvl[0].i
c000: 4c 65 61 66 50 67 6e 6f 3b 0a 7d 0a 0a 73 74 61  LeafPgno;.}..sta
c010: 74 69 63 20 76 6f 69 64 20 66 74 73 35 4c 65 61  tic void fts5Lea
c020: 66 48 65 61 64 65 72 28 46 74 73 35 44 61 74 61  fHeader(Fts5Data
c030: 20 2a 70 4c 65 61 66 2c 20 69 6e 74 20 2a 70 69   *pLeaf, int *pi
c040: 52 6f 77 69 64 2c 20 69 6e 74 20 2a 70 69 54 65  Rowid, int *piTe
c050: 72 6d 29 7b 0a 20 20 2a 70 69 52 6f 77 69 64 20  rm){.  *piRowid 
c060: 3d 20 28 69 6e 74 29 66 74 73 35 47 65 74 55 31  = (int)fts5GetU1
c070: 36 28 26 70 4c 65 61 66 2d 3e 70 5b 30 5d 29 3b  6(&pLeaf->p[0]);
c080: 0a 20 20 2a 70 69 54 65 72 6d 20 3d 20 28 69 6e  .  *piTerm = (in
c090: 74 29 66 74 73 35 47 65 74 55 31 36 28 26 70 4c  t)fts5GetU16(&pL
c0a0: 65 61 66 2d 3e 70 5b 32 5d 29 3b 0a 7d 0a 0a 2f  eaf->p[2]);.}../
c0b0: 2a 0a 2a 2a 20 4c 6f 61 64 20 74 68 65 20 6e 65  *.** Load the ne
c0c0: 78 74 20 6c 65 61 66 20 70 61 67 65 20 69 6e 74  xt leaf page int
c0d0: 6f 20 74 68 65 20 73 65 67 6d 65 6e 74 20 69 74  o the segment it
c0e0: 65 72 61 74 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69  erator..*/.stati
c0f0: 63 20 76 6f 69 64 20 66 74 73 35 53 65 67 49 74  c void fts5SegIt
c100: 65 72 4e 65 78 74 50 61 67 65 28 0a 20 20 46 74  erNextPage(.  Ft
c110: 73 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20  s5Index *p,     
c120: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
c130: 20 46 54 53 35 20 62 61 63 6b 65 6e 64 20 6f 62   FTS5 backend ob
c140: 6a 65 63 74 20 2a 2f 0a 20 20 46 74 73 35 53 65  ject */.  Fts5Se
c150: 67 49 74 65 72 20 2a 70 49 74 65 72 20 20 20 20  gIter *pIter    
c160: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 74 65            /* Ite
c170: 72 61 74 6f 72 20 74 6f 20 61 64 76 61 6e 63 65  rator to advance
c180: 20 74 6f 20 6e 65 78 74 20 70 61 67 65 20 2a 2f   to next page */
c190: 0a 29 7b 0a 20 20 46 74 73 35 53 74 72 75 63 74  .){.  Fts5Struct
c1a0: 75 72 65 53 65 67 6d 65 6e 74 20 2a 70 53 65 67  ureSegment *pSeg
c1b0: 20 3d 20 70 49 74 65 72 2d 3e 70 53 65 67 3b 0a   = pIter->pSeg;.
c1c0: 20 20 66 74 73 35 44 61 74 61 52 65 6c 65 61 73    fts5DataReleas
c1d0: 65 28 70 49 74 65 72 2d 3e 70 4c 65 61 66 29 3b  e(pIter->pLeaf);
c1e0: 0a 20 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 50  .  pIter->iLeafP
c1f0: 67 6e 6f 2b 2b 3b 0a 20 20 69 66 28 20 70 49 74  gno++;.  if( pIt
c200: 65 72 2d 3e 70 4e 65 78 74 4c 65 61 66 20 29 7b  er->pNextLeaf ){
c210: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49 74  .    assert( pIt
c220: 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 3c 3d 70  er->iLeafPgno<=p
c230: 53 65 67 2d 3e 70 67 6e 6f 4c 61 73 74 20 29 3b  Seg->pgnoLast );
c240: 0a 20 20 20 20 70 49 74 65 72 2d 3e 70 4c 65 61  .    pIter->pLea
c250: 66 20 3d 20 70 49 74 65 72 2d 3e 70 4e 65 78 74  f = pIter->pNext
c260: 4c 65 61 66 3b 0a 20 20 20 20 70 49 74 65 72 2d  Leaf;.    pIter-
c270: 3e 70 4e 65 78 74 4c 65 61 66 20 3d 20 30 3b 0a  >pNextLeaf = 0;.
c280: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 49 74 65    }else if( pIte
c290: 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 3c 3d 70 53  r->iLeafPgno<=pS
c2a0: 65 67 2d 3e 70 67 6e 6f 4c 61 73 74 20 29 7b 0a  eg->pgnoLast ){.
c2b0: 20 20 20 20 70 49 74 65 72 2d 3e 70 4c 65 61 66      pIter->pLeaf
c2c0: 20 3d 20 66 74 73 35 44 61 74 61 52 65 61 64 28   = fts5DataRead(
c2d0: 70 2c 20 0a 20 20 20 20 20 20 20 20 46 54 53 35  p, .        FTS5
c2e0: 5f 53 45 47 4d 45 4e 54 5f 52 4f 57 49 44 28 70  _SEGMENT_ROWID(p
c2f0: 53 65 67 2d 3e 69 53 65 67 69 64 2c 20 30 2c 20  Seg->iSegid, 0, 
c300: 70 49 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f  pIter->iLeafPgno
c310: 29 0a 20 20 20 20 29 3b 0a 20 20 7d 65 6c 73 65  ).    );.  }else
c320: 7b 0a 20 20 20 20 70 49 74 65 72 2d 3e 70 4c 65  {.    pIter->pLe
c330: 61 66 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f  af = 0;.  }.}../
c340: 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20 70 20  *.** Argument p 
c350: 70 6f 69 6e 74 73 20 74 6f 20 61 20 62 75 66 66  points to a buff
c360: 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 61 20  er containing a 
c370: 76 61 72 69 6e 74 20 74 6f 20 62 65 20 69 6e 74  varint to be int
c380: 65 72 70 72 65 74 65 64 20 61 73 20 61 0a 2a 2a  erpreted as a.**
c390: 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74 20 73   position list s
c3a0: 69 7a 65 20 66 69 65 6c 64 2e 20 52 65 61 64 20  ize field. Read 
c3b0: 74 68 65 20 76 61 72 69 6e 74 20 61 6e 64 20 72  the varint and r
c3c0: 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72  eturn the number
c3d0: 20 6f 66 20 62 79 74 65 73 0a 2a 2a 20 72 65 61   of bytes.** rea
c3e0: 64 2e 20 42 65 66 6f 72 65 20 72 65 74 75 72 6e  d. Before return
c3f0: 69 6e 67 2c 20 73 65 74 20 2a 70 6e 53 7a 20 74  ing, set *pnSz t
c400: 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  o the number of 
c410: 62 79 74 65 73 20 69 6e 20 74 68 65 20 70 6f 73  bytes in the pos
c420: 69 74 69 6f 6e 0a 2a 2a 20 6c 69 73 74 2c 20 61  ition.** list, a
c430: 6e 64 20 2a 70 62 44 65 6c 20 74 6f 20 74 72 75  nd *pbDel to tru
c440: 65 20 69 66 20 74 68 65 20 64 65 6c 65 74 65 20  e if the delete 
c450: 66 6c 61 67 20 69 73 20 73 65 74 2c 20 6f 72 20  flag is set, or 
c460: 66 61 6c 73 65 20 6f 74 68 65 72 77 69 73 65 2e  false otherwise.
c470: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .*/.static int f
c480: 74 73 35 47 65 74 50 6f 73 6c 69 73 74 53 69 7a  ts5GetPoslistSiz
c490: 65 28 63 6f 6e 73 74 20 75 38 20 2a 70 2c 20 69  e(const u8 *p, i
c4a0: 6e 74 20 2a 70 6e 53 7a 2c 20 69 6e 74 20 2a 70  nt *pnSz, int *p
c4b0: 62 44 65 6c 29 7b 0a 20 20 69 6e 74 20 6e 53 7a  bDel){.  int nSz
c4c0: 3b 0a 20 20 69 6e 74 20 6e 20 3d 20 66 74 73 35  ;.  int n = fts5
c4d0: 47 65 74 56 61 72 69 6e 74 33 32 28 70 2c 20 6e  GetVarint32(p, n
c4e0: 53 7a 29 3b 0a 20 20 61 73 73 65 72 74 5f 6e 63  Sz);.  assert_nc
c4f0: 28 20 6e 53 7a 3e 3d 30 20 29 3b 0a 20 20 2a 70  ( nSz>=0 );.  *p
c500: 6e 53 7a 20 3d 20 6e 53 7a 2f 32 3b 0a 20 20 2a  nSz = nSz/2;.  *
c510: 70 62 44 65 6c 20 3d 20 6e 53 7a 20 26 20 30 78  pbDel = nSz & 0x
c520: 30 30 30 31 3b 0a 20 20 72 65 74 75 72 6e 20 6e  0001;.  return n
c530: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 74 73 35 53  ;.}../*.** Fts5S
c540: 65 67 49 74 65 72 2e 69 4c 65 61 66 4f 66 66 73  egIter.iLeafOffs
c550: 65 74 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69  et currently poi
c560: 6e 74 73 20 74 6f 20 74 68 65 20 66 69 72 73 74  nts to the first
c570: 20 62 79 74 65 20 6f 66 20 61 0a 2a 2a 20 70 6f   byte of a.** po
c580: 73 69 74 69 6f 6e 2d 6c 69 73 74 20 73 69 7a 65  sition-list size
c590: 20 66 69 65 6c 64 2e 20 52 65 61 64 20 74 68 65   field. Read the
c5a0: 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 66 69   value of the fi
c5b0: 65 6c 64 20 61 6e 64 20 73 74 6f 72 65 20 69 74  eld and store it
c5c0: 0a 2a 2a 20 69 6e 20 74 68 65 20 66 6f 6c 6c 6f  .** in the follo
c5d0: 77 69 6e 67 20 76 61 72 69 61 62 6c 65 73 3a 0a  wing variables:.
c5e0: 2a 2a 0a 2a 2a 20 20 20 46 74 73 35 53 65 67 49  **.**   Fts5SegI
c5f0: 74 65 72 2e 6e 50 6f 73 0a 2a 2a 20 20 20 46 74  ter.nPos.**   Ft
c600: 73 35 53 65 67 49 74 65 72 2e 62 44 65 6c 0a 2a  s5SegIter.bDel.*
c610: 2a 0a 2a 2a 20 4c 65 61 76 65 20 46 74 73 35 53  *.** Leave Fts5S
c620: 65 67 49 74 65 72 2e 69 4c 65 61 66 4f 66 66 73  egIter.iLeafOffs
c630: 65 74 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74  et pointing to t
c640: 68 65 20 66 69 72 73 74 20 62 79 74 65 20 6f 66  he first byte of
c650: 20 74 68 65 20 0a 2a 2a 20 70 6f 73 69 74 69 6f   the .** positio
c660: 6e 20 6c 69 73 74 20 63 6f 6e 74 65 6e 74 20 28  n list content (
c670: 69 66 20 61 6e 79 29 2e 0a 2a 2f 0a 73 74 61 74  if any)..*/.stat
c680: 69 63 20 76 6f 69 64 20 66 74 73 35 53 65 67 49  ic void fts5SegI
c690: 74 65 72 4c 6f 61 64 4e 50 6f 73 28 46 74 73 35  terLoadNPos(Fts5
c6a0: 49 6e 64 65 78 20 2a 70 2c 20 46 74 73 35 53 65  Index *p, Fts5Se
c6b0: 67 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a 20  gIter *pIter){. 
c6c0: 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49   if( p->rc==SQLI
c6d0: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 6e 74  TE_OK ){.    int
c6e0: 20 69 4f 66 66 20 3d 20 70 49 74 65 72 2d 3e 69   iOff = pIter->i
c6f0: 4c 65 61 66 4f 66 66 73 65 74 3b 20 20 2f 2a 20  LeafOffset;  /* 
c700: 4f 66 66 73 65 74 20 74 6f 20 72 65 61 64 20 61  Offset to read a
c710: 74 20 2a 2f 0a 20 20 20 20 69 66 28 20 69 4f 66  t */.    if( iOf
c720: 66 3e 3d 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d  f>=pIter->pLeaf-
c730: 3e 6e 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 72  >n ){.      p->r
c740: 63 20 3d 20 46 54 53 35 5f 43 4f 52 52 55 50 54  c = FTS5_CORRUPT
c750: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
c760: 20 20 20 63 6f 6e 73 74 20 75 38 20 2a 61 20 3d     const u8 *a =
c770: 20 26 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e   &pIter->pLeaf->
c780: 70 5b 69 4f 66 66 5d 3b 0a 20 20 20 20 20 20 70  p[iOff];.      p
c790: 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65  Iter->iLeafOffse
c7a0: 74 20 2b 3d 20 66 74 73 35 47 65 74 50 6f 73 6c  t += fts5GetPosl
c7b0: 69 73 74 53 69 7a 65 28 61 2c 20 26 70 49 74 65  istSize(a, &pIte
c7c0: 72 2d 3e 6e 50 6f 73 2c 20 26 70 49 74 65 72 2d  r->nPos, &pIter-
c7d0: 3e 62 44 65 6c 29 3b 0a 20 20 20 20 7d 0a 20 20  >bDel);.    }.  
c7e0: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 74 73 35 53  }.}../*.** Fts5S
c7f0: 65 67 49 74 65 72 2e 69 4c 65 61 66 4f 66 66 73  egIter.iLeafOffs
c800: 65 74 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69  et currently poi
c810: 6e 74 73 20 74 6f 20 74 68 65 20 66 69 72 73 74  nts to the first
c820: 20 62 79 74 65 20 6f 66 20 74 68 65 20 0a 2a 2a   byte of the .**
c830: 20 22 6e 53 75 66 66 69 78 22 20 66 69 65 6c 64   "nSuffix" field
c840: 20 6f 66 20 61 20 74 65 72 6d 2e 20 46 75 6e 63   of a term. Func
c850: 74 69 6f 6e 20 70 61 72 61 6d 65 74 65 72 20 6e  tion parameter n
c860: 4b 65 65 70 20 63 6f 6e 74 61 69 6e 73 20 74 68  Keep contains th
c870: 65 20 76 61 6c 75 65 0a 2a 2a 20 6f 66 20 74 68  e value.** of th
c880: 65 20 22 6e 50 72 65 66 69 78 22 20 66 69 65 6c  e "nPrefix" fiel
c890: 64 20 28 69 66 20 74 68 65 72 65 20 77 61 73 20  d (if there was 
c8a0: 6f 6e 65 20 2d 20 69 74 20 69 73 20 70 61 73 73  one - it is pass
c8b0: 65 64 20 30 20 69 66 20 74 68 69 73 20 69 73 0a  ed 0 if this is.
c8c0: 2a 2a 20 74 68 65 20 66 69 72 73 74 20 74 65 72  ** the first ter
c8d0: 6d 20 69 6e 20 74 68 65 20 73 65 67 6d 65 6e 74  m in the segment
c8e0: 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75  )..**.** This fu
c8f0: 6e 63 74 69 6f 6e 20 70 6f 70 75 6c 61 74 65 73  nction populates
c900: 3a 0a 2a 2a 0a 2a 2a 20 20 20 46 74 73 35 53 65  :.**.**   Fts5Se
c910: 67 49 74 65 72 2e 74 65 72 6d 0a 2a 2a 20 20 20  gIter.term.**   
c920: 46 74 73 35 53 65 67 49 74 65 72 2e 72 6f 77 69  Fts5SegIter.rowi
c930: 64 0a 2a 2a 0a 2a 2a 20 61 63 63 6f 72 64 69 6e  d.**.** accordin
c940: 67 6c 79 20 61 6e 64 20 6c 65 61 76 65 73 20 28  gly and leaves (
c950: 46 74 73 35 53 65 67 49 74 65 72 2e 69 4c 65 61  Fts5SegIter.iLea
c960: 66 4f 66 66 73 65 74 29 20 73 65 74 20 74 6f 20  fOffset) set to 
c970: 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 0a 2a  the content of.*
c980: 2a 20 74 68 65 20 66 69 72 73 74 20 70 6f 73 69  * the first posi
c990: 74 69 6f 6e 20 6c 69 73 74 2e 20 54 68 65 20 70  tion list. The p
c9a0: 6f 73 69 74 69 6f 6e 20 6c 69 73 74 20 62 65 6c  osition list bel
c9b0: 6f 6e 67 69 6e 67 20 74 6f 20 64 6f 63 75 6d 65  onging to docume
c9c0: 6e 74 20 0a 2a 2a 20 28 46 74 73 35 53 65 67 49  nt .** (Fts5SegI
c9d0: 74 65 72 2e 69 52 6f 77 69 64 29 2e 0a 2a 2f 0a  ter.iRowid)..*/.
c9e0: 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
c9f0: 53 65 67 49 74 65 72 4c 6f 61 64 54 65 72 6d 28  SegIterLoadTerm(
ca00: 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 46 74  Fts5Index *p, Ft
ca10: 73 35 53 65 67 49 74 65 72 20 2a 70 49 74 65 72  s5SegIter *pIter
ca20: 2c 20 69 6e 74 20 6e 4b 65 65 70 29 7b 0a 20 20  , int nKeep){.  
ca30: 75 38 20 2a 61 20 3d 20 70 49 74 65 72 2d 3e 70  u8 *a = pIter->p
ca40: 4c 65 61 66 2d 3e 70 3b 20 20 20 20 20 20 20 20  Leaf->p;        
ca50: 2f 2a 20 42 75 66 66 65 72 20 74 6f 20 72 65 61  /* Buffer to rea
ca60: 64 20 64 61 74 61 20 66 72 6f 6d 20 2a 2f 0a 20  d data from */. 
ca70: 20 69 6e 74 20 69 4f 66 66 20 3d 20 70 49 74 65   int iOff = pIte
ca80: 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 3b 20  r->iLeafOffset; 
ca90: 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 72 65   /* Offset to re
caa0: 61 64 20 61 74 20 2a 2f 0a 20 20 69 6e 74 20 6e  ad at */.  int n
cab0: 4e 65 77 3b 20 20 20 20 20 20 20 20 20 20 20 20  New;            
cac0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79             /* By
cad0: 74 65 73 20 6f 66 20 6e 65 77 20 64 61 74 61 20  tes of new data 
cae0: 2a 2f 0a 0a 20 20 69 4f 66 66 20 2b 3d 20 66 74  */..  iOff += ft
caf0: 73 35 47 65 74 56 61 72 69 6e 74 33 32 28 26 61  s5GetVarint32(&a
cb00: 5b 69 4f 66 66 5d 2c 20 6e 4e 65 77 29 3b 0a 20  [iOff], nNew);. 
cb10: 20 70 49 74 65 72 2d 3e 74 65 72 6d 2e 6e 20 3d   pIter->term.n =
cb20: 20 6e 4b 65 65 70 3b 0a 20 20 66 74 73 35 42 75   nKeep;.  fts5Bu
cb30: 66 66 65 72 41 70 70 65 6e 64 42 6c 6f 62 28 26  fferAppendBlob(&
cb40: 70 2d 3e 72 63 2c 20 26 70 49 74 65 72 2d 3e 74  p->rc, &pIter->t
cb50: 65 72 6d 2c 20 6e 4e 65 77 2c 20 26 61 5b 69 4f  erm, nNew, &a[iO
cb60: 66 66 5d 29 3b 0a 20 20 69 4f 66 66 20 2b 3d 20  ff]);.  iOff += 
cb70: 6e 4e 65 77 3b 0a 20 20 70 49 74 65 72 2d 3e 69  nNew;.  pIter->i
cb80: 54 65 72 6d 4c 65 61 66 4f 66 66 73 65 74 20 3d  TermLeafOffset =
cb90: 20 69 4f 66 66 3b 0a 20 20 70 49 74 65 72 2d 3e   iOff;.  pIter->
cba0: 69 54 65 72 6d 4c 65 61 66 50 67 6e 6f 20 3d 20  iTermLeafPgno = 
cbb0: 70 49 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f  pIter->iLeafPgno
cbc0: 3b 0a 20 20 69 66 28 20 69 4f 66 66 3e 3d 70 49  ;.  if( iOff>=pI
cbd0: 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 6e 20 29 7b  ter->pLeaf->n ){
cbe0: 0a 20 20 20 20 66 74 73 35 53 65 67 49 74 65 72  .    fts5SegIter
cbf0: 4e 65 78 74 50 61 67 65 28 70 2c 20 70 49 74 65  NextPage(p, pIte
cc00: 72 29 3b 0a 20 20 20 20 69 66 28 20 70 49 74 65  r);.    if( pIte
cc10: 72 2d 3e 70 4c 65 61 66 3d 3d 30 20 29 7b 0a 20  r->pLeaf==0 ){. 
cc20: 20 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d       if( p->rc==
cc30: 53 51 4c 49 54 45 5f 4f 4b 20 29 20 70 2d 3e 72  SQLITE_OK ) p->r
cc40: 63 20 3d 20 46 54 53 35 5f 43 4f 52 52 55 50 54  c = FTS5_CORRUPT
cc50: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a  ;.      return;.
cc60: 20 20 20 20 7d 0a 20 20 20 20 69 4f 66 66 20 3d      }.    iOff =
cc70: 20 34 3b 0a 20 20 20 20 61 20 3d 20 70 49 74 65   4;.    a = pIte
cc80: 72 2d 3e 70 4c 65 61 66 2d 3e 70 3b 0a 20 20 7d  r->pLeaf->p;.  }
cc90: 0a 20 20 69 4f 66 66 20 2b 3d 20 73 71 6c 69 74  .  iOff += sqlit
cca0: 65 33 46 74 73 35 47 65 74 56 61 72 69 6e 74 28  e3Fts5GetVarint(
ccb0: 26 61 5b 69 4f 66 66 5d 2c 20 28 75 36 34 2a 29  &a[iOff], (u64*)
ccc0: 26 70 49 74 65 72 2d 3e 69 52 6f 77 69 64 29 3b  &pIter->iRowid);
ccd0: 0a 20 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f  .  pIter->iLeafO
cce0: 66 66 73 65 74 20 3d 20 69 4f 66 66 3b 0a 7d 0a  ffset = iOff;.}.
ccf0: 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a  ./*.** Initializ
cd00: 65 20 74 68 65 20 69 74 65 72 61 74 6f 72 20 6f  e the iterator o
cd10: 62 6a 65 63 74 20 70 49 74 65 72 20 74 6f 20 69  bject pIter to i
cd20: 74 65 72 61 74 65 20 74 68 72 6f 75 67 68 20 74  terate through t
cd30: 68 65 20 65 6e 74 72 69 65 73 20 69 6e 0a 2a 2a  he entries in.**
cd40: 20 73 65 67 6d 65 6e 74 20 70 53 65 67 2e 20 54   segment pSeg. T
cd50: 68 65 20 69 74 65 72 61 74 6f 72 20 69 73 20 6c  he iterator is l
cd60: 65 66 74 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20  eft pointing to 
cd70: 74 68 65 20 66 69 72 73 74 20 65 6e 74 72 79 20  the first entry 
cd80: 77 68 65 6e 20 0a 2a 2a 20 74 68 69 73 20 66 75  when .** this fu
cd90: 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 2e 0a  nction returns..
cda0: 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f  **.** If an erro
cdb0: 72 20 6f 63 63 75 72 73 2c 20 46 74 73 35 49 6e  r occurs, Fts5In
cdc0: 64 65 78 2e 72 63 20 69 73 20 73 65 74 20 74 6f  dex.rc is set to
cdd0: 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65 20   an appropriate 
cde0: 65 72 72 6f 72 20 63 6f 64 65 2e 20 49 66 20 0a  error code. If .
cdf0: 2a 2a 20 61 6e 20 65 72 72 6f 72 20 68 61 73 20  ** an error has 
ce00: 61 6c 72 65 61 64 79 20 6f 63 63 75 72 72 65 64  already occurred
ce10: 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74   when this funct
ce20: 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20 69  ion is called, i
ce30: 74 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f  t is a no-op..*/
ce40: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
ce50: 35 53 65 67 49 74 65 72 49 6e 69 74 28 0a 20 20  5SegIterInit(.  
ce60: 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 20 20  Fts5Index *p,   
ce70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ce80: 2f 2a 20 46 54 53 20 69 6e 64 65 78 20 6f 62 6a  /* FTS index obj
ce90: 65 63 74 20 2a 2f 0a 20 20 46 74 73 35 53 74 72  ect */.  Fts5Str
cea0: 75 63 74 75 72 65 53 65 67 6d 65 6e 74 20 2a 70  uctureSegment *p
ceb0: 53 65 67 2c 20 20 20 20 20 2f 2a 20 44 65 73 63  Seg,     /* Desc
cec0: 72 69 70 74 69 6f 6e 20 6f 66 20 73 65 67 6d 65  ription of segme
ced0: 6e 74 20 2a 2f 0a 20 20 46 74 73 35 53 65 67 49  nt */.  Fts5SegI
cee0: 74 65 72 20 2a 70 49 74 65 72 20 20 20 20 20 20  ter *pIter      
cef0: 20 20 20 20 20 20 20 20 2f 2a 20 4f 62 6a 65 63          /* Objec
cf00: 74 20 74 6f 20 70 6f 70 75 6c 61 74 65 20 2a 2f  t to populate */
cf10: 0a 29 7b 0a 20 20 69 66 28 20 70 53 65 67 2d 3e  .){.  if( pSeg->
cf20: 70 67 6e 6f 46 69 72 73 74 3d 3d 30 20 29 7b 0a  pgnoFirst==0 ){.
cf30: 20 20 20 20 2f 2a 20 54 68 69 73 20 68 61 70 70      /* This happ
cf40: 65 6e 73 20 69 66 20 74 68 65 20 73 65 67 6d 65  ens if the segme
cf50: 6e 74 20 69 73 20 62 65 69 6e 67 20 75 73 65 64  nt is being used
cf60: 20 61 73 20 61 6e 20 69 6e 70 75 74 20 74 6f 20   as an input to 
cf70: 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c 0a 20  an incremental. 
cf80: 20 20 20 2a 2a 20 6d 65 72 67 65 20 61 6e 64 20     ** merge and 
cf90: 61 6c 6c 20 64 61 74 61 20 68 61 73 20 61 6c 72  all data has alr
cfa0: 65 61 64 79 20 62 65 65 6e 20 22 74 72 69 6d 6d  eady been "trimm
cfb0: 65 64 22 2e 20 53 65 65 20 66 75 6e 63 74 69 6f  ed". See functio
cfc0: 6e 0a 20 20 20 20 2a 2a 20 66 74 73 35 54 72 69  n.    ** fts5Tri
cfd0: 6d 53 65 67 6d 65 6e 74 73 28 29 20 66 6f 72 20  mSegments() for 
cfe0: 64 65 74 61 69 6c 73 2e 20 49 6e 20 74 68 69 73  details. In this
cff0: 20 63 61 73 65 20 6c 65 61 76 65 20 74 68 65 20   case leave the 
d000: 69 74 65 72 61 74 6f 72 20 65 6d 70 74 79 2e 0a  iterator empty..
d010: 20 20 20 20 2a 2a 20 54 68 65 20 63 61 6c 6c 65      ** The calle
d020: 72 20 77 69 6c 6c 20 73 65 65 20 74 68 65 20 28  r will see the (
d030: 70 49 74 65 72 2d 3e 70 4c 65 61 66 3d 3d 30 29  pIter->pLeaf==0)
d040: 20 61 6e 64 20 61 73 73 75 6d 65 20 74 68 65 20   and assume the 
d050: 69 74 65 72 61 74 6f 72 20 69 73 0a 20 20 20 20  iterator is.    
d060: 2a 2a 20 61 74 20 45 4f 46 20 61 6c 72 65 61 64  ** at EOF alread
d070: 79 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74  y. */.    assert
d080: 28 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 3d 3d  ( pIter->pLeaf==
d090: 30 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b  0 );.    return;
d0a0: 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 2d 3e 72  .  }..  if( p->r
d0b0: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
d0c0: 20 20 20 20 6d 65 6d 73 65 74 28 70 49 74 65 72      memset(pIter
d0d0: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70 49 74  , 0, sizeof(*pIt
d0e0: 65 72 29 29 3b 0a 20 20 20 20 70 49 74 65 72 2d  er));.    pIter-
d0f0: 3e 70 53 65 67 20 3d 20 70 53 65 67 3b 0a 20 20  >pSeg = pSeg;.  
d100: 20 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 50 67    pIter->iLeafPg
d110: 6e 6f 20 3d 20 70 53 65 67 2d 3e 70 67 6e 6f 46  no = pSeg->pgnoF
d120: 69 72 73 74 2d 31 3b 0a 20 20 20 20 66 74 73 35  irst-1;.    fts5
d130: 53 65 67 49 74 65 72 4e 65 78 74 50 61 67 65 28  SegIterNextPage(
d140: 70 2c 20 70 49 74 65 72 29 3b 0a 20 20 7d 0a 0a  p, pIter);.  }..
d150: 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c    if( p->rc==SQL
d160: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 75 38  ITE_OK ){.    u8
d170: 20 2a 61 20 3d 20 70 49 74 65 72 2d 3e 70 4c 65   *a = pIter->pLe
d180: 61 66 2d 3e 70 3b 0a 20 20 20 20 70 49 74 65 72  af->p;.    pIter
d190: 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 20 3d 20  ->iLeafOffset = 
d1a0: 66 74 73 35 47 65 74 55 31 36 28 26 61 5b 32 5d  fts5GetU16(&a[2]
d1b0: 29 3b 0a 20 20 20 20 66 74 73 35 53 65 67 49 74  );.    fts5SegIt
d1c0: 65 72 4c 6f 61 64 54 65 72 6d 28 70 2c 20 70 49  erLoadTerm(p, pI
d1d0: 74 65 72 2c 20 30 29 3b 0a 20 20 20 20 66 74 73  ter, 0);.    fts
d1e0: 35 53 65 67 49 74 65 72 4c 6f 61 64 4e 50 6f 73  5SegIterLoadNPos
d1f0: 28 70 2c 20 70 49 74 65 72 29 3b 0a 20 20 7d 0a  (p, pIter);.  }.
d200: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
d210: 6e 63 74 69 6f 6e 20 69 73 20 6f 6e 6c 79 20 65  nction is only e
d220: 76 65 72 20 63 61 6c 6c 65 64 20 6f 6e 20 69 74  ver called on it
d230: 65 72 61 74 6f 72 73 20 63 72 65 61 74 65 64 20  erators created 
d240: 62 79 20 63 61 6c 6c 73 20 74 6f 0a 2a 2a 20 46  by calls to.** F
d250: 74 73 35 49 6e 64 65 78 51 75 65 72 79 28 29 20  ts5IndexQuery() 
d260: 77 69 74 68 20 74 68 65 20 46 54 53 35 49 4e 44  with the FTS5IND
d270: 45 58 5f 51 55 45 52 59 5f 44 45 53 43 20 66 6c  EX_QUERY_DESC fl
d280: 61 67 20 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 54 68  ag set..**.** Th
d290: 65 20 69 74 65 72 61 74 6f 72 20 69 73 20 69 6e  e iterator is in
d2a0: 20 61 6e 20 75 6e 75 73 75 61 6c 20 73 74 61 74   an unusual stat
d2b0: 65 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63  e when this func
d2c0: 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 3a 20  tion is called: 
d2d0: 74 68 65 0a 2a 2a 20 46 74 73 35 53 65 67 49 74  the.** Fts5SegIt
d2e0: 65 72 2e 69 4c 65 61 66 4f 66 66 73 65 74 20 76  er.iLeafOffset v
d2f0: 61 72 69 61 62 6c 65 20 69 73 20 73 65 74 20 74  ariable is set t
d300: 6f 20 74 68 65 20 6f 66 66 73 65 74 20 6f 66 20  o the offset of 
d310: 74 68 65 20 73 74 61 72 74 20 6f 66 0a 2a 2a 20  the start of.** 
d320: 74 68 65 20 70 6f 73 69 74 69 6f 6e 2d 6c 69 73  the position-lis
d330: 74 20 73 69 7a 65 20 66 69 65 6c 64 20 66 6f 72  t size field for
d340: 20 74 68 65 20 66 69 72 73 74 20 72 65 6c 65 76   the first relev
d350: 61 6e 74 20 72 6f 77 69 64 20 6f 6e 20 74 68 65  ant rowid on the
d360: 20 70 61 67 65 2e 0a 2a 2a 20 46 74 73 35 53 65   page..** Fts5Se
d370: 67 49 74 65 72 2e 72 6f 77 69 64 20 69 73 20 73  gIter.rowid is s
d380: 65 74 2c 20 62 75 74 20 6e 50 6f 73 20 61 6e 64  et, but nPos and
d390: 20 62 44 65 6c 20 61 72 65 20 6e 6f 74 2e 0a 2a   bDel are not..*
d3a0: 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
d3b0: 6f 6e 20 61 64 76 61 6e 63 65 73 20 74 68 65 20  on advances the 
d3c0: 69 74 65 72 61 74 6f 72 20 73 6f 20 74 68 61 74  iterator so that
d3d0: 20 69 74 20 70 6f 69 6e 74 73 20 74 6f 20 74 68   it points to th
d3e0: 65 20 6c 61 73 74 20 0a 2a 2a 20 72 65 6c 65 76  e last .** relev
d3f0: 61 6e 74 20 72 6f 77 69 64 20 6f 6e 20 74 68 65  ant rowid on the
d400: 20 70 61 67 65 20 61 6e 64 2c 20 69 66 20 6e 65   page and, if ne
d410: 63 65 73 73 61 72 79 2c 20 69 6e 69 74 69 61 6c  cessary, initial
d420: 69 7a 65 73 20 74 68 65 20 0a 2a 2a 20 61 52 6f  izes the .** aRo
d430: 77 69 64 4f 66 66 73 65 74 5b 5d 20 61 6e 64 20  widOffset[] and 
d440: 69 52 6f 77 69 64 4f 66 66 73 65 74 20 76 61 72  iRowidOffset var
d450: 69 61 62 6c 65 73 2e 20 41 74 20 74 68 69 73 20  iables. At this 
d460: 70 6f 69 6e 74 20 74 68 65 20 69 74 65 72 61 74  point the iterat
d470: 6f 72 0a 2a 2a 20 69 73 20 69 6e 20 69 74 73 20  or.** is in its 
d480: 72 65 67 75 6c 61 72 20 73 74 61 74 65 20 2d 20  regular state - 
d490: 46 74 73 35 53 65 67 49 74 65 72 2e 69 4c 65 61  Fts5SegIter.iLea
d4a0: 66 4f 66 66 73 65 74 20 70 6f 69 6e 74 73 20 74  fOffset points t
d4b0: 6f 20 74 68 65 20 66 69 72 73 74 0a 2a 2a 20 62  o the first.** b
d4c0: 79 74 65 20 6f 66 20 74 68 65 20 70 6f 73 69 74  yte of the posit
d4d0: 69 6f 6e 20 6c 69 73 74 20 63 6f 6e 74 65 6e 74  ion list content
d4e0: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
d4f0: 20 73 61 69 64 20 72 6f 77 69 64 2e 0a 2a 2f 0a   said rowid..*/.
d500: 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
d510: 53 65 67 49 74 65 72 52 65 76 65 72 73 65 49 6e  SegIterReverseIn
d520: 69 74 50 61 67 65 28 46 74 73 35 49 6e 64 65 78  itPage(Fts5Index
d530: 20 2a 70 2c 20 46 74 73 35 53 65 67 49 74 65 72   *p, Fts5SegIter
d540: 20 2a 70 49 74 65 72 29 7b 0a 20 20 69 6e 74 20   *pIter){.  int 
d550: 6e 20 3d 20 70 49 74 65 72 2d 3e 70 4c 65 61 66  n = pIter->pLeaf
d560: 2d 3e 6e 3b 0a 20 20 69 6e 74 20 69 20 3d 20 70  ->n;.  int i = p
d570: 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65  Iter->iLeafOffse
d580: 74 3b 0a 20 20 75 38 20 2a 61 20 3d 20 70 49 74  t;.  u8 *a = pIt
d590: 65 72 2d 3e 70 4c 65 61 66 2d 3e 70 3b 0a 20 20  er->pLeaf->p;.  
d5a0: 69 6e 74 20 69 52 6f 77 69 64 4f 66 66 73 65 74  int iRowidOffset
d5b0: 20 3d 20 30 3b 0a 0a 20 20 77 68 69 6c 65 28 20   = 0;..  while( 
d5c0: 31 20 29 7b 0a 20 20 20 20 69 36 34 20 69 44 65  1 ){.    i64 iDe
d5d0: 6c 74 61 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74  lta = 0;.    int
d5e0: 20 6e 50 6f 73 3b 0a 20 20 20 20 69 6e 74 20 62   nPos;.    int b
d5f0: 44 75 6d 6d 79 3b 0a 0a 20 20 20 20 69 20 2b 3d  Dummy;..    i +=
d600: 20 66 74 73 35 47 65 74 50 6f 73 6c 69 73 74 53   fts5GetPoslistS
d610: 69 7a 65 28 26 61 5b 69 5d 2c 20 26 6e 50 6f 73  ize(&a[i], &nPos
d620: 2c 20 26 62 44 75 6d 6d 79 29 3b 0a 20 20 20 20  , &bDummy);.    
d630: 69 20 2b 3d 20 6e 50 6f 73 3b 0a 20 20 20 20 69  i += nPos;.    i
d640: 66 28 20 69 3e 3d 6e 20 29 20 62 72 65 61 6b 3b  f( i>=n ) break;
d650: 0a 20 20 20 20 69 20 2b 3d 20 66 74 73 35 47 65  .    i += fts5Ge
d660: 74 56 61 72 69 6e 74 28 26 61 5b 69 5d 2c 20 28  tVarint(&a[i], (
d670: 75 36 34 2a 29 26 69 44 65 6c 74 61 29 3b 0a 20  u64*)&iDelta);. 
d680: 20 20 20 69 66 28 20 69 44 65 6c 74 61 3d 3d 30     if( iDelta==0
d690: 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 70 49   ) break;.    pI
d6a0: 74 65 72 2d 3e 69 52 6f 77 69 64 20 2b 3d 20 69  ter->iRowid += i
d6b0: 44 65 6c 74 61 3b 0a 0a 20 20 20 20 69 66 28 20  Delta;..    if( 
d6c0: 69 52 6f 77 69 64 4f 66 66 73 65 74 3e 3d 70 49  iRowidOffset>=pI
d6d0: 74 65 72 2d 3e 6e 52 6f 77 69 64 4f 66 66 73 65  ter->nRowidOffse
d6e0: 74 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e  t ){.      int n
d6f0: 4e 65 77 20 3d 20 70 49 74 65 72 2d 3e 6e 52 6f  New = pIter->nRo
d700: 77 69 64 4f 66 66 73 65 74 20 2b 20 38 3b 0a 20  widOffset + 8;. 
d710: 20 20 20 20 20 69 6e 74 20 2a 61 4e 65 77 20 3d       int *aNew =
d720: 20 28 69 6e 74 2a 29 73 71 6c 69 74 65 33 5f 72   (int*)sqlite3_r
d730: 65 61 6c 6c 6f 63 28 70 49 74 65 72 2d 3e 61 52  ealloc(pIter->aR
d740: 6f 77 69 64 4f 66 66 73 65 74 2c 20 6e 4e 65 77  owidOffset, nNew
d750: 2a 73 69 7a 65 6f 66 28 69 6e 74 29 29 3b 0a 20  *sizeof(int));. 
d760: 20 20 20 20 20 69 66 28 20 61 4e 65 77 3d 3d 30       if( aNew==0
d770: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 72   ){.        p->r
d780: 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
d790: 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
d7a0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
d7b0: 49 74 65 72 2d 3e 61 52 6f 77 69 64 4f 66 66 73  Iter->aRowidOffs
d7c0: 65 74 20 3d 20 61 4e 65 77 3b 0a 20 20 20 20 20  et = aNew;.     
d7d0: 20 70 49 74 65 72 2d 3e 6e 52 6f 77 69 64 4f 66   pIter->nRowidOf
d7e0: 66 73 65 74 20 3d 20 6e 4e 65 77 3b 0a 20 20 20  fset = nNew;.   
d7f0: 20 7d 0a 0a 20 20 20 20 70 49 74 65 72 2d 3e 61   }..    pIter->a
d800: 52 6f 77 69 64 4f 66 66 73 65 74 5b 69 52 6f 77  RowidOffset[iRow
d810: 69 64 4f 66 66 73 65 74 2b 2b 5d 20 3d 20 70 49  idOffset++] = pI
d820: 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74  ter->iLeafOffset
d830: 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 69 4c 65  ;.    pIter->iLe
d840: 61 66 4f 66 66 73 65 74 20 3d 20 69 3b 0a 20 20  afOffset = i;.  
d850: 7d 0a 20 20 70 49 74 65 72 2d 3e 69 52 6f 77 69  }.  pIter->iRowi
d860: 64 4f 66 66 73 65 74 20 3d 20 69 52 6f 77 69 64  dOffset = iRowid
d870: 4f 66 66 73 65 74 3b 0a 20 20 66 74 73 35 53 65  Offset;.  fts5Se
d880: 67 49 74 65 72 4c 6f 61 64 4e 50 6f 73 28 70 2c  gIterLoadNPos(p,
d890: 20 70 49 74 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a   pIter);.}../*.*
d8a0: 2a 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  *.*/.static void
d8b0: 20 66 74 73 35 53 65 67 49 74 65 72 52 65 76 65   fts5SegIterReve
d8c0: 72 73 65 4e 65 77 50 61 67 65 28 46 74 73 35 49  rseNewPage(Fts5I
d8d0: 6e 64 65 78 20 2a 70 2c 20 46 74 73 35 53 65 67  ndex *p, Fts5Seg
d8e0: 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a 20 20  Iter *pIter){.  
d8f0: 61 73 73 65 72 74 28 20 70 49 74 65 72 2d 3e 66  assert( pIter->f
d900: 6c 61 67 73 20 26 20 46 54 53 35 5f 53 45 47 49  lags & FTS5_SEGI
d910: 54 45 52 5f 52 45 56 45 52 53 45 20 29 3b 0a 20  TER_REVERSE );. 
d920: 20 61 73 73 65 72 74 28 20 70 49 74 65 72 2d 3e   assert( pIter->
d930: 66 6c 61 67 73 20 26 20 46 54 53 35 5f 53 45 47  flags & FTS5_SEG
d940: 49 54 45 52 5f 4f 4e 45 54 45 52 4d 20 29 3b 0a  ITER_ONETERM );.
d950: 0a 20 20 66 74 73 35 44 61 74 61 52 65 6c 65 61  .  fts5DataRelea
d960: 73 65 28 70 49 74 65 72 2d 3e 70 4c 65 61 66 29  se(pIter->pLeaf)
d970: 3b 0a 20 20 70 49 74 65 72 2d 3e 70 4c 65 61 66  ;.  pIter->pLeaf
d980: 20 3d 20 30 3b 0a 20 20 77 68 69 6c 65 28 20 70   = 0;.  while( p
d990: 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
d9a0: 26 26 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 50  && pIter->iLeafP
d9b0: 67 6e 6f 3e 70 49 74 65 72 2d 3e 69 54 65 72 6d  gno>pIter->iTerm
d9c0: 4c 65 61 66 50 67 6e 6f 20 29 7b 0a 20 20 20 20  LeafPgno ){.    
d9d0: 46 74 73 35 44 61 74 61 20 2a 70 4e 65 77 3b 0a  Fts5Data *pNew;.
d9e0: 20 20 20 20 70 49 74 65 72 2d 3e 69 4c 65 61 66      pIter->iLeaf
d9f0: 50 67 6e 6f 2d 2d 3b 0a 20 20 20 20 70 4e 65 77  Pgno--;.    pNew
da00: 20 3d 20 66 74 73 35 44 61 74 61 52 65 61 64 28   = fts5DataRead(
da10: 70 2c 20 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f  p, FTS5_SEGMENT_
da20: 52 4f 57 49 44 28 0a 20 20 20 20 20 20 20 20 20  ROWID(.         
da30: 20 70 49 74 65 72 2d 3e 70 53 65 67 2d 3e 69 53   pIter->pSeg->iS
da40: 65 67 69 64 2c 20 30 2c 20 70 49 74 65 72 2d 3e  egid, 0, pIter->
da50: 69 4c 65 61 66 50 67 6e 6f 0a 20 20 20 20 29 29  iLeafPgno.    ))
da60: 3b 0a 20 20 20 20 69 66 28 20 70 4e 65 77 20 29  ;.    if( pNew )
da70: 7b 0a 20 20 20 20 20 20 69 66 28 20 70 49 74 65  {.      if( pIte
da80: 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 3d 3d 70 49  r->iLeafPgno==pI
da90: 74 65 72 2d 3e 69 54 65 72 6d 4c 65 61 66 50 67  ter->iTermLeafPg
daa0: 6e 6f 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  no ){.        if
dab0: 28 20 70 49 74 65 72 2d 3e 69 54 65 72 6d 4c 65  ( pIter->iTermLe
dac0: 61 66 4f 66 66 73 65 74 3c 70 4e 65 77 2d 3e 6e  afOffset<pNew->n
dad0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 49   ){.          pI
dae0: 74 65 72 2d 3e 70 4c 65 61 66 20 3d 20 70 4e 65  ter->pLeaf = pNe
daf0: 77 3b 0a 20 20 20 20 20 20 20 20 20 20 70 49 74  w;.          pIt
db00: 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 20  er->iLeafOffset 
db10: 3d 20 70 49 74 65 72 2d 3e 69 54 65 72 6d 4c 65  = pIter->iTermLe
db20: 61 66 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20  afOffset;.      
db30: 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b    }.      }else{
db40: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 52 6f  .        int iRo
db50: 77 69 64 4f 66 66 2c 20 64 75 6d 6d 79 3b 0a 20  widOff, dummy;. 
db60: 20 20 20 20 20 20 20 66 74 73 35 4c 65 61 66 48         fts5LeafH
db70: 65 61 64 65 72 28 70 4e 65 77 2c 20 26 69 52 6f  eader(pNew, &iRo
db80: 77 69 64 4f 66 66 2c 20 26 64 75 6d 6d 79 29 3b  widOff, &dummy);
db90: 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 52 6f  .        if( iRo
dba0: 77 69 64 4f 66 66 20 29 7b 0a 20 20 20 20 20 20  widOff ){.      
dbb0: 20 20 20 20 70 49 74 65 72 2d 3e 70 4c 65 61 66      pIter->pLeaf
dbc0: 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 20 20 20   = pNew;.       
dbd0: 20 20 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f     pIter->iLeafO
dbe0: 66 66 73 65 74 20 3d 20 69 52 6f 77 69 64 4f 66  ffset = iRowidOf
dbf0: 66 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  f;.        }.   
dc00: 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20     }..      if( 
dc10: 70 49 74 65 72 2d 3e 70 4c 65 61 66 20 29 7b 0a  pIter->pLeaf ){.
dc20: 20 20 20 20 20 20 20 20 75 38 20 2a 61 20 3d 20          u8 *a = 
dc30: 26 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 70  &pIter->pLeaf->p
dc40: 5b 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66  [pIter->iLeafOff
dc50: 73 65 74 5d 3b 0a 20 20 20 20 20 20 20 20 70 49  set];.        pI
dc60: 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74  ter->iLeafOffset
dc70: 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e   += fts5GetVarin
dc80: 74 28 61 2c 20 28 75 36 34 2a 29 26 70 49 74 65  t(a, (u64*)&pIte
dc90: 72 2d 3e 69 52 6f 77 69 64 29 3b 0a 20 20 20 20  r->iRowid);.    
dca0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
dcb0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
dcc0: 66 74 73 35 44 61 74 61 52 65 6c 65 61 73 65 28  fts5DataRelease(
dcd0: 70 4e 65 77 29 3b 0a 20 20 20 20 20 20 7d 0a 20  pNew);.      }. 
dce0: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20     }.  }..  if( 
dcf0: 70 49 74 65 72 2d 3e 70 4c 65 61 66 20 29 7b 0a  pIter->pLeaf ){.
dd00: 20 20 20 20 66 74 73 35 53 65 67 49 74 65 72 52      fts5SegIterR
dd10: 65 76 65 72 73 65 49 6e 69 74 50 61 67 65 28 70  everseInitPage(p
dd20: 2c 20 70 49 74 65 72 29 3b 0a 20 20 7d 0a 7d 0a  , pIter);.  }.}.
dd30: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72  ./*.** Return tr
dd40: 75 65 20 69 66 20 74 68 65 20 69 74 65 72 61 74  ue if the iterat
dd50: 6f 72 20 70 61 73 73 65 64 20 61 73 20 74 68 65  or passed as the
dd60: 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
dd70: 20 63 75 72 72 65 6e 74 6c 79 0a 2a 2a 20 70 6f   currently.** po
dd80: 69 6e 74 73 20 74 6f 20 61 20 64 65 6c 65 74 65  ints to a delete
dd90: 20 6d 61 72 6b 65 72 2e 20 41 20 64 65 6c 65 74   marker. A delet
dda0: 65 20 6d 61 72 6b 65 72 20 69 73 20 61 6e 20 65  e marker is an e
ddb0: 6e 74 72 79 20 77 69 74 68 20 61 20 30 20 62 79  ntry with a 0 by
ddc0: 74 65 0a 2a 2a 20 70 6f 73 69 74 69 6f 6e 2d 6c  te.** position-l
ddd0: 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ist..*/.static i
dde0: 6e 74 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72  nt fts5MultiIter
ddf0: 49 73 45 6d 70 74 79 28 46 74 73 35 49 6e 64 65  IsEmpty(Fts5Inde
de00: 78 20 2a 70 2c 20 46 74 73 35 4d 75 6c 74 69 53  x *p, Fts5MultiS
de10: 65 67 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a  egIter *pIter){.
de20: 20 20 46 74 73 35 53 65 67 49 74 65 72 20 2a 70    Fts5SegIter *p
de30: 53 65 67 20 3d 20 26 70 49 74 65 72 2d 3e 61 53  Seg = &pIter->aS
de40: 65 67 5b 70 49 74 65 72 2d 3e 61 46 69 72 73 74  eg[pIter->aFirst
de50: 5b 31 5d 2e 69 46 69 72 73 74 5d 3b 0a 20 20 72  [1].iFirst];.  r
de60: 65 74 75 72 6e 20 28 70 2d 3e 72 63 3d 3d 53 51  eturn (p->rc==SQ
de70: 4c 49 54 45 5f 4f 4b 20 26 26 20 70 53 65 67 2d  LITE_OK && pSeg-
de80: 3e 70 4c 65 61 66 20 26 26 20 70 53 65 67 2d 3e  >pLeaf && pSeg->
de90: 6e 50 6f 73 3d 3d 30 29 3b 0a 7d 0a 0a 2f 2a 0a  nPos==0);.}../*.
dea0: 2a 2a 20 41 64 76 61 6e 63 65 20 69 74 65 72 61  ** Advance itera
deb0: 74 6f 72 20 70 49 74 65 72 20 74 6f 20 74 68 65  tor pIter to the
dec0: 20 6e 65 78 74 20 65 6e 74 72 79 2e 20 0a 2a 2a   next entry. .**
ded0: 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20  .** If an error 
dee0: 6f 63 63 75 72 73 2c 20 46 74 73 35 49 6e 64 65  occurs, Fts5Inde
def0: 78 2e 72 63 20 69 73 20 73 65 74 20 74 6f 20 61  x.rc is set to a
df00: 6e 20 61 70 70 72 6f 70 72 69 61 74 65 20 65 72  n appropriate er
df10: 72 6f 72 20 63 6f 64 65 2e 20 49 74 20 0a 2a 2a  ror code. It .**
df20: 20 69 73 20 6e 6f 74 20 63 6f 6e 73 69 64 65 72   is not consider
df30: 65 64 20 61 6e 20 65 72 72 6f 72 20 69 66 20 74  ed an error if t
df40: 68 65 20 69 74 65 72 61 74 6f 72 20 72 65 61 63  he iterator reac
df50: 68 65 73 20 45 4f 46 2e 20 49 66 20 61 6e 20 65  hes EOF. If an e
df60: 72 72 6f 72 20 68 61 73 20 0a 2a 2a 20 61 6c 72  rror has .** alr
df70: 65 61 64 79 20 6f 63 63 75 72 72 65 64 20 77 68  eady occurred wh
df80: 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
df90: 20 69 73 20 63 61 6c 6c 65 64 2c 20 69 74 20 69   is called, it i
dfa0: 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74  s a no-op..*/.st
dfb0: 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 53 65  atic void fts5Se
dfc0: 67 49 74 65 72 4e 65 78 74 28 0a 20 20 46 74 73  gIterNext(.  Fts
dfd0: 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20  5Index *p,      
dfe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
dff0: 46 54 53 35 20 62 61 63 6b 65 6e 64 20 6f 62 6a  FTS5 backend obj
e000: 65 63 74 20 2a 2f 0a 20 20 46 74 73 35 53 65 67  ect */.  Fts5Seg
e010: 49 74 65 72 20 2a 70 49 74 65 72 2c 20 20 20 20  Iter *pIter,    
e020: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72           /* Iter
e030: 61 74 6f 72 20 74 6f 20 61 64 76 61 6e 63 65 20  ator to advance 
e040: 2a 2f 0a 20 20 69 6e 74 20 2a 70 62 4e 65 77 54  */.  int *pbNewT
e050: 65 72 6d 20 20 20 20 20 20 20 20 20 20 20 20 20  erm             
e060: 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 53 65 74       /* OUT: Set
e070: 20 66 6f 72 20 6e 65 77 20 74 65 72 6d 20 2a 2f   for new term */
e080: 0a 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 62  .){.  assert( pb
e090: 4e 65 77 54 65 72 6d 3d 3d 30 20 7c 7c 20 2a 70  NewTerm==0 || *p
e0a0: 62 4e 65 77 54 65 72 6d 3d 3d 30 20 29 3b 0a 20  bNewTerm==0 );. 
e0b0: 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49   if( p->rc==SQLI
e0c0: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28  TE_OK ){.    if(
e0d0: 20 70 49 74 65 72 2d 3e 66 6c 61 67 73 20 26 20   pIter->flags & 
e0e0: 46 54 53 35 5f 53 45 47 49 54 45 52 5f 52 45 56  FTS5_SEGITER_REV
e0f0: 45 52 53 45 20 29 7b 0a 20 20 20 20 20 20 61 73  ERSE ){.      as
e100: 73 65 72 74 28 20 70 49 74 65 72 2d 3e 70 4e 65  sert( pIter->pNe
e110: 78 74 4c 65 61 66 3d 3d 30 20 29 3b 0a 20 20 20  xtLeaf==0 );.   
e120: 20 20 20 69 66 28 20 70 49 74 65 72 2d 3e 69 52     if( pIter->iR
e130: 6f 77 69 64 4f 66 66 73 65 74 3e 30 20 29 7b 0a  owidOffset>0 ){.
e140: 20 20 20 20 20 20 20 20 75 38 20 2a 61 20 3d 20          u8 *a = 
e150: 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 70 3b  pIter->pLeaf->p;
e160: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 4f 66  .        int iOf
e170: 66 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e  f;.        int n
e180: 50 6f 73 3b 0a 20 20 20 20 20 20 20 20 69 6e 74  Pos;.        int
e190: 20 62 44 75 6d 6d 79 3b 0a 20 20 20 20 20 20 20   bDummy;.       
e1a0: 20 69 36 34 20 69 44 65 6c 74 61 3b 0a 0a 20 20   i64 iDelta;..  
e1b0: 20 20 20 20 20 20 70 49 74 65 72 2d 3e 69 52 6f        pIter->iRo
e1c0: 77 69 64 4f 66 66 73 65 74 2d 2d 3b 0a 20 20 20  widOffset--;.   
e1d0: 20 20 20 20 20 70 49 74 65 72 2d 3e 69 4c 65 61       pIter->iLea
e1e0: 66 4f 66 66 73 65 74 20 3d 20 69 4f 66 66 20 3d  fOffset = iOff =
e1f0: 20 70 49 74 65 72 2d 3e 61 52 6f 77 69 64 4f 66   pIter->aRowidOf
e200: 66 73 65 74 5b 70 49 74 65 72 2d 3e 69 52 6f 77  fset[pIter->iRow
e210: 69 64 4f 66 66 73 65 74 5d 3b 0a 20 20 20 20 20  idOffset];.     
e220: 20 20 20 69 4f 66 66 20 2b 3d 20 66 74 73 35 47     iOff += fts5G
e230: 65 74 50 6f 73 6c 69 73 74 53 69 7a 65 28 26 61  etPoslistSize(&a
e240: 5b 69 4f 66 66 5d 2c 20 26 6e 50 6f 73 2c 20 26  [iOff], &nPos, &
e250: 62 44 75 6d 6d 79 29 3b 0a 20 20 20 20 20 20 20  bDummy);.       
e260: 20 69 4f 66 66 20 2b 3d 20 6e 50 6f 73 3b 0a 20   iOff += nPos;. 
e270: 20 20 20 20 20 20 20 66 74 73 35 47 65 74 56 61         fts5GetVa
e280: 72 69 6e 74 28 26 61 5b 69 4f 66 66 5d 2c 20 28  rint(&a[iOff], (
e290: 75 36 34 2a 29 26 69 44 65 6c 74 61 29 3b 0a 20  u64*)&iDelta);. 
e2a0: 20 20 20 20 20 20 20 70 49 74 65 72 2d 3e 69 52         pIter->iR
e2b0: 6f 77 69 64 20 2d 3d 20 69 44 65 6c 74 61 3b 0a  owid -= iDelta;.
e2c0: 20 20 20 20 20 20 20 20 66 74 73 35 53 65 67 49          fts5SegI
e2d0: 74 65 72 4c 6f 61 64 4e 50 6f 73 28 70 2c 20 70  terLoadNPos(p, p
e2e0: 49 74 65 72 29 3b 0a 20 20 20 20 20 20 7d 65 6c  Iter);.      }el
e2f0: 73 65 7b 0a 20 20 20 20 20 20 20 20 66 74 73 35  se{.        fts5
e300: 53 65 67 49 74 65 72 52 65 76 65 72 73 65 4e 65  SegIterReverseNe
e310: 77 50 61 67 65 28 70 2c 20 70 49 74 65 72 29 3b  wPage(p, pIter);
e320: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
e330: 73 65 7b 0a 20 20 20 20 20 20 46 74 73 35 44 61  se{.      Fts5Da
e340: 74 61 20 2a 70 4c 65 61 66 20 3d 20 70 49 74 65  ta *pLeaf = pIte
e350: 72 2d 3e 70 4c 65 61 66 3b 0a 20 20 20 20 20 20  r->pLeaf;.      
e360: 69 6e 74 20 69 4f 66 66 3b 0a 20 20 20 20 20 20  int iOff;.      
e370: 69 6e 74 20 62 4e 65 77 54 65 72 6d 20 3d 20 30  int bNewTerm = 0
e380: 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 4b 65 65  ;.      int nKee
e390: 70 20 3d 20 30 3b 0a 0a 20 20 20 20 20 20 2f 2a  p = 0;..      /*
e3a0: 20 53 65 61 72 63 68 20 66 6f 72 20 74 68 65 20   Search for the 
e3b0: 65 6e 64 20 6f 66 20 74 68 65 20 70 6f 73 69 74  end of the posit
e3c0: 69 6f 6e 20 6c 69 73 74 20 77 69 74 68 69 6e 20  ion list within 
e3d0: 74 68 65 20 63 75 72 72 65 6e 74 20 70 61 67 65  the current page
e3e0: 2e 20 2a 2f 0a 20 20 20 20 20 20 75 38 20 2a 61  . */.      u8 *a
e3f0: 20 3d 20 70 4c 65 61 66 2d 3e 70 3b 0a 20 20 20   = pLeaf->p;.   
e400: 20 20 20 69 6e 74 20 6e 20 3d 20 70 4c 65 61 66     int n = pLeaf
e410: 2d 3e 6e 3b 0a 0a 20 20 20 20 20 20 69 4f 66 66  ->n;..      iOff
e420: 20 3d 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f   = pIter->iLeafO
e430: 66 66 73 65 74 20 2b 20 70 49 74 65 72 2d 3e 6e  ffset + pIter->n
e440: 50 6f 73 3b 0a 0a 20 20 20 20 20 20 69 66 28 20  Pos;..      if( 
e450: 69 4f 66 66 3c 6e 20 29 7b 0a 20 20 20 20 20 20  iOff<n ){.      
e460: 20 20 2f 2a 20 54 68 65 20 6e 65 78 74 20 65 6e    /* The next en
e470: 74 72 79 20 69 73 20 6f 6e 20 74 68 65 20 63 75  try is on the cu
e480: 72 72 65 6e 74 20 70 61 67 65 20 2a 2f 0a 20 20  rrent page */.  
e490: 20 20 20 20 20 20 75 36 34 20 69 44 65 6c 74 61        u64 iDelta
e4a0: 3b 0a 20 20 20 20 20 20 20 20 69 4f 66 66 20 2b  ;.        iOff +
e4b0: 3d 20 73 71 6c 69 74 65 33 46 74 73 35 47 65 74  = sqlite3Fts5Get
e4c0: 56 61 72 69 6e 74 28 26 61 5b 69 4f 66 66 5d 2c  Varint(&a[iOff],
e4d0: 20 26 69 44 65 6c 74 61 29 3b 0a 20 20 20 20 20   &iDelta);.     
e4e0: 20 20 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f     pIter->iLeafO
e4f0: 66 66 73 65 74 20 3d 20 69 4f 66 66 3b 0a 20 20  ffset = iOff;.  
e500: 20 20 20 20 20 20 69 66 28 20 69 44 65 6c 74 61        if( iDelta
e510: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
e520: 20 62 4e 65 77 54 65 72 6d 20 3d 20 31 3b 0a 20   bNewTerm = 1;. 
e530: 20 20 20 20 20 20 20 20 20 69 66 28 20 69 4f 66           if( iOf
e540: 66 3e 3d 6e 20 29 7b 0a 20 20 20 20 20 20 20 20  f>=n ){.        
e550: 20 20 20 20 66 74 73 35 53 65 67 49 74 65 72 4e      fts5SegIterN
e560: 65 78 74 50 61 67 65 28 70 2c 20 70 49 74 65 72  extPage(p, pIter
e570: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  );.            p
e580: 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65  Iter->iLeafOffse
e590: 74 20 3d 20 34 3b 0a 20 20 20 20 20 20 20 20 20  t = 4;.         
e5a0: 20 7d 65 6c 73 65 20 69 66 28 20 69 4f 66 66 21   }else if( iOff!
e5b0: 3d 66 74 73 35 47 65 74 55 31 36 28 26 61 5b 32  =fts5GetU16(&a[2
e5c0: 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ]) ){.          
e5d0: 20 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66    pIter->iLeafOf
e5e0: 66 73 65 74 20 2b 3d 20 66 74 73 35 47 65 74 56  fset += fts5GetV
e5f0: 61 72 69 6e 74 33 32 28 26 61 5b 69 4f 66 66 5d  arint32(&a[iOff]
e600: 2c 20 6e 4b 65 65 70 29 3b 0a 20 20 20 20 20 20  , nKeep);.      
e610: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65      }.        }e
e620: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 70  lse{.          p
e630: 49 74 65 72 2d 3e 69 52 6f 77 69 64 20 2b 3d 20  Iter->iRowid += 
e640: 69 44 65 6c 74 61 3b 0a 20 20 20 20 20 20 20 20  iDelta;.        
e650: 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  }.      }else if
e660: 28 20 70 49 74 65 72 2d 3e 70 53 65 67 3d 3d 30  ( pIter->pSeg==0
e670: 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73   ){.        cons
e680: 74 20 75 38 20 2a 70 4c 69 73 74 20 3d 20 30 3b  t u8 *pList = 0;
e690: 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63  .        const c
e6a0: 68 61 72 20 2a 7a 54 65 72 6d 3b 0a 20 20 20 20  har *zTerm;.    
e6b0: 20 20 20 20 69 6e 74 20 6e 4c 69 73 74 3b 0a 20      int nList;. 
e6c0: 20 20 20 20 20 20 20 69 66 28 20 30 3d 3d 28 70         if( 0==(p
e6d0: 49 74 65 72 2d 3e 66 6c 61 67 73 20 26 20 46 54  Iter->flags & FT
e6e0: 53 35 5f 53 45 47 49 54 45 52 5f 4f 4e 45 54 45  S5_SEGITER_ONETE
e6f0: 52 4d 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  RM) ){.         
e700: 20 73 71 6c 69 74 65 33 46 74 73 35 48 61 73 68   sqlite3Fts5Hash
e710: 53 63 61 6e 4e 65 78 74 28 70 2d 3e 70 48 61 73  ScanNext(p->pHas
e720: 68 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  h);.          sq
e730: 6c 69 74 65 33 46 74 73 35 48 61 73 68 53 63 61  lite3Fts5HashSca
e740: 6e 45 6e 74 72 79 28 70 2d 3e 70 48 61 73 68 2c  nEntry(p->pHash,
e750: 20 26 7a 54 65 72 6d 2c 20 26 70 4c 69 73 74 2c   &zTerm, &pList,
e760: 20 26 6e 4c 69 73 74 29 3b 0a 20 20 20 20 20 20   &nList);.      
e770: 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
e780: 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20  pList==0 ){.    
e790: 20 20 20 20 20 20 66 74 73 35 44 61 74 61 52 65        fts5DataRe
e7a0: 6c 65 61 73 65 28 70 49 74 65 72 2d 3e 70 4c 65  lease(pIter->pLe
e7b0: 61 66 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70  af);.          p
e7c0: 49 74 65 72 2d 3e 70 4c 65 61 66 20 3d 20 30 3b  Iter->pLeaf = 0;
e7d0: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
e7e0: 20 20 20 20 20 20 20 20 20 20 70 49 74 65 72 2d            pIter-
e7f0: 3e 70 4c 65 61 66 2d 3e 70 20 3d 20 28 75 38 2a  >pLeaf->p = (u8*
e800: 29 70 4c 69 73 74 3b 0a 20 20 20 20 20 20 20 20  )pList;.        
e810: 20 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e    pIter->pLeaf->
e820: 6e 20 3d 20 6e 4c 69 73 74 3b 0a 20 20 20 20 20  n = nList;.     
e830: 20 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35       sqlite3Fts5
e840: 42 75 66 66 65 72 53 65 74 28 26 70 2d 3e 72 63  BufferSet(&p->rc
e850: 2c 20 26 70 49 74 65 72 2d 3e 74 65 72 6d 2c 20  , &pIter->term, 
e860: 73 74 72 6c 65 6e 28 7a 54 65 72 6d 29 2c 20 28  strlen(zTerm), (
e870: 75 38 2a 29 7a 54 65 72 6d 29 3b 0a 20 20 20 20  u8*)zTerm);.    
e880: 20 20 20 20 20 20 70 49 74 65 72 2d 3e 69 4c 65        pIter->iLe
e890: 61 66 4f 66 66 73 65 74 20 3d 20 66 74 73 35 47  afOffset = fts5G
e8a0: 65 74 56 61 72 69 6e 74 28 70 4c 69 73 74 2c 20  etVarint(pList, 
e8b0: 28 75 36 34 2a 29 26 70 49 74 65 72 2d 3e 69 52  (u64*)&pIter->iR
e8c0: 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 20 20 7d  owid);.        }
e8d0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
e8e0: 20 20 20 20 20 20 69 4f 66 66 20 3d 20 30 3b 0a        iOff = 0;.
e8f0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 78 74 20          /* Next 
e900: 65 6e 74 72 79 20 69 73 20 6e 6f 74 20 6f 6e 20  entry is not on 
e910: 74 68 65 20 63 75 72 72 65 6e 74 20 70 61 67 65  the current page
e920: 20 2a 2f 0a 20 20 20 20 20 20 20 20 77 68 69 6c   */.        whil
e930: 65 28 20 69 4f 66 66 3d 3d 30 20 29 7b 0a 20 20  e( iOff==0 ){.  
e940: 20 20 20 20 20 20 20 20 66 74 73 35 53 65 67 49          fts5SegI
e950: 74 65 72 4e 65 78 74 50 61 67 65 28 70 2c 20 70  terNextPage(p, p
e960: 49 74 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20  Iter);.         
e970: 20 70 4c 65 61 66 20 3d 20 70 49 74 65 72 2d 3e   pLeaf = pIter->
e980: 70 4c 65 61 66 3b 0a 20 20 20 20 20 20 20 20 20  pLeaf;.         
e990: 20 69 66 28 20 70 4c 65 61 66 3d 3d 30 20 29 20   if( pLeaf==0 ) 
e9a0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20  break;.         
e9b0: 20 69 66 28 20 28 69 4f 66 66 20 3d 20 66 74 73   if( (iOff = fts
e9c0: 35 47 65 74 55 31 36 28 26 70 4c 65 61 66 2d 3e  5GetU16(&pLeaf->
e9d0: 70 5b 30 5d 29 29 20 26 26 20 69 4f 66 66 3c 70  p[0])) && iOff<p
e9e0: 4c 65 61 66 2d 3e 6e 20 29 7b 0a 20 20 20 20 20  Leaf->n ){.     
e9f0: 20 20 20 20 20 20 20 69 4f 66 66 20 2b 3d 20 73         iOff += s
ea00: 71 6c 69 74 65 33 46 74 73 35 47 65 74 56 61 72  qlite3Fts5GetVar
ea10: 69 6e 74 28 26 70 4c 65 61 66 2d 3e 70 5b 69 4f  int(&pLeaf->p[iO
ea20: 66 66 5d 2c 20 28 75 36 34 2a 29 26 70 49 74 65  ff], (u64*)&pIte
ea30: 72 2d 3e 69 52 6f 77 69 64 29 3b 0a 20 20 20 20  r->iRowid);.    
ea40: 20 20 20 20 20 20 20 20 70 49 74 65 72 2d 3e 69          pIter->i
ea50: 4c 65 61 66 4f 66 66 73 65 74 20 3d 20 69 4f 66  LeafOffset = iOf
ea60: 66 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  f;.          }. 
ea70: 20 20 20 20 20 20 20 20 20 65 6c 73 65 20 69 66           else if
ea80: 28 20 28 69 4f 66 66 20 3d 20 66 74 73 35 47 65  ( (iOff = fts5Ge
ea90: 74 55 31 36 28 26 70 4c 65 61 66 2d 3e 70 5b 32  tU16(&pLeaf->p[2
eaa0: 5d 29 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ])) ){.         
eab0: 20 20 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f     pIter->iLeafO
eac0: 66 66 73 65 74 20 3d 20 69 4f 66 66 3b 0a 20 20  ffset = iOff;.  
ead0: 20 20 20 20 20 20 20 20 20 20 62 4e 65 77 54 65            bNewTe
eae0: 72 6d 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  rm = 1;.        
eaf0: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66    }.          if
eb00: 28 20 69 4f 66 66 3e 3d 70 4c 65 61 66 2d 3e 6e  ( iOff>=pLeaf->n
eb10: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
eb20: 70 2d 3e 72 63 20 3d 20 46 54 53 35 5f 43 4f 52  p->rc = FTS5_COR
eb30: 52 55 50 54 3b 0a 20 20 20 20 20 20 20 20 20 20  RUPT;.          
eb40: 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20    return;.      
eb50: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
eb60: 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f        }..      /
eb70: 2a 20 43 68 65 63 6b 20 69 66 20 74 68 65 20 69  * Check if the i
eb80: 74 65 72 61 74 6f 72 20 69 73 20 6e 6f 77 20 61  terator is now a
eb90: 74 20 45 4f 46 2e 20 49 66 20 73 6f 2c 20 72 65  t EOF. If so, re
eba0: 74 75 72 6e 20 65 61 72 6c 79 2e 20 2a 2f 0a 20  turn early. */. 
ebb0: 20 20 20 20 20 69 66 28 20 70 49 74 65 72 2d 3e       if( pIter->
ebc0: 70 4c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 20  pLeaf ){.       
ebd0: 20 69 66 28 20 62 4e 65 77 54 65 72 6d 20 29 7b   if( bNewTerm ){
ebe0: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
ebf0: 49 74 65 72 2d 3e 66 6c 61 67 73 20 26 20 46 54  Iter->flags & FT
ec00: 53 35 5f 53 45 47 49 54 45 52 5f 4f 4e 45 54 45  S5_SEGITER_ONETE
ec10: 52 4d 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  RM ){.          
ec20: 20 20 66 74 73 35 44 61 74 61 52 65 6c 65 61 73    fts5DataReleas
ec30: 65 28 70 49 74 65 72 2d 3e 70 4c 65 61 66 29 3b  e(pIter->pLeaf);
ec40: 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 49 74  .            pIt
ec50: 65 72 2d 3e 70 4c 65 61 66 20 3d 20 30 3b 0a 20  er->pLeaf = 0;. 
ec60: 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
ec70: 20 20 20 20 20 20 20 20 20 20 20 20 66 74 73 35              fts5
ec80: 53 65 67 49 74 65 72 4c 6f 61 64 54 65 72 6d 28  SegIterLoadTerm(
ec90: 70 2c 20 70 49 74 65 72 2c 20 6e 4b 65 65 70 29  p, pIter, nKeep)
eca0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 74  ;.            ft
ecb0: 73 35 53 65 67 49 74 65 72 4c 6f 61 64 4e 50 6f  s5SegIterLoadNPo
ecc0: 73 28 70 2c 20 70 49 74 65 72 29 3b 0a 20 20 20  s(p, pIter);.   
ecd0: 20 20 20 20 20 20 20 20 20 69 66 28 20 70 62 4e           if( pbN
ece0: 65 77 54 65 72 6d 20 29 20 2a 70 62 4e 65 77 54  ewTerm ) *pbNewT
ecf0: 65 72 6d 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  erm = 1;.       
ed00: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c     }.        }el
ed10: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 66 74  se{.          ft
ed20: 73 35 53 65 67 49 74 65 72 4c 6f 61 64 4e 50 6f  s5SegIterLoadNPo
ed30: 73 28 70 2c 20 70 49 74 65 72 29 3b 0a 20 20 20  s(p, pIter);.   
ed40: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
ed50: 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 23 64 65 66     }.  }.}..#def
ed60: 69 6e 65 20 53 57 41 50 56 41 4c 28 54 2c 20 61  ine SWAPVAL(T, a
ed70: 2c 20 62 29 20 7b 20 54 20 74 6d 70 3b 20 74 6d  , b) { T tmp; tm
ed80: 70 3d 61 3b 20 61 3d 62 3b 20 62 3d 74 6d 70 3b  p=a; a=b; b=tmp;
ed90: 20 7d 0a 0a 2f 2a 0a 2a 2a 20 49 74 65 72 61 74   }../*.** Iterat
eda0: 6f 72 20 70 49 74 65 72 20 63 75 72 72 65 6e 74  or pIter current
edb0: 6c 79 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65  ly points to the
edc0: 20 66 69 72 73 74 20 72 6f 77 69 64 20 69 6e 20   first rowid in 
edd0: 61 20 64 6f 63 6c 69 73 74 2e 20 54 68 69 73 0a  a doclist. This.
ede0: 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 73 65 74 73  ** function sets
edf0: 20 74 68 65 20 69 74 65 72 61 74 6f 72 20 75 70   the iterator up
ee00: 20 73 6f 20 74 68 61 74 20 69 74 65 72 61 74 65   so that iterate
ee10: 73 20 69 6e 20 72 65 76 65 72 73 65 20 6f 72 64  s in reverse ord
ee20: 65 72 20 74 68 72 6f 75 67 68 0a 2a 2a 20 74 68  er through.** th
ee30: 65 20 64 6f 63 6c 69 73 74 2e 0a 2a 2f 0a 73 74  e doclist..*/.st
ee40: 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 53 65  atic void fts5Se
ee50: 67 49 74 65 72 52 65 76 65 72 73 65 28 46 74 73  gIterReverse(Fts
ee60: 35 49 6e 64 65 78 20 2a 70 2c 20 46 74 73 35 53  5Index *p, Fts5S
ee70: 65 67 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a  egIter *pIter){.
ee80: 20 20 46 74 73 35 44 6c 69 64 78 49 74 65 72 20    Fts5DlidxIter 
ee90: 2a 70 44 6c 69 64 78 20 3d 20 70 49 74 65 72 2d  *pDlidx = pIter-
eea0: 3e 70 44 6c 69 64 78 3b 0a 20 20 46 74 73 35 44  >pDlidx;.  Fts5D
eeb0: 61 74 61 20 2a 70 4c 61 73 74 20 3d 20 30 3b 0a  ata *pLast = 0;.
eec0: 20 20 69 6e 74 20 70 67 6e 6f 4c 61 73 74 20 3d    int pgnoLast =
eed0: 20 30 3b 0a 0a 20 20 69 66 28 20 70 44 6c 69 64   0;..  if( pDlid
eee0: 78 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 53 65  x ){.    int iSe
eef0: 67 69 64 20 3d 20 70 49 74 65 72 2d 3e 70 53 65  gid = pIter->pSe
ef00: 67 2d 3e 69 53 65 67 69 64 3b 0a 20 20 20 20 70  g->iSegid;.    p
ef10: 67 6e 6f 4c 61 73 74 20 3d 20 66 74 73 35 44 6c  gnoLast = fts5Dl
ef20: 69 64 78 49 74 65 72 50 67 6e 6f 28 70 44 6c 69  idxIterPgno(pDli
ef30: 64 78 29 3b 0a 20 20 20 20 70 4c 61 73 74 20 3d  dx);.    pLast =
ef40: 20 66 74 73 35 44 61 74 61 52 65 61 64 28 70 2c   fts5DataRead(p,
ef50: 20 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f 52 4f   FTS5_SEGMENT_RO
ef60: 57 49 44 28 69 53 65 67 69 64 2c 20 30 2c 20 70  WID(iSegid, 0, p
ef70: 67 6e 6f 4c 61 73 74 29 29 3b 0a 20 20 7d 65 6c  gnoLast));.  }el
ef80: 73 65 7b 0a 20 20 20 20 69 6e 74 20 69 4f 66 66  se{.    int iOff
ef90: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
efa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
efb0: 2f 2a 20 42 79 74 65 20 6f 66 66 73 65 74 20 77  /* Byte offset w
efc0: 69 74 68 69 6e 20 70 4c 65 61 66 20 2a 2f 0a 20  ithin pLeaf */. 
efd0: 20 20 20 46 74 73 35 44 61 74 61 20 2a 70 4c 65     Fts5Data *pLe
efe0: 61 66 20 3d 20 70 49 74 65 72 2d 3e 70 4c 65 61  af = pIter->pLea
eff0: 66 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75  f;         /* Cu
f000: 72 72 65 6e 74 20 6c 65 61 66 20 64 61 74 61 20  rrent leaf data 
f010: 2a 2f 0a 0a 20 20 20 20 2f 2a 20 43 75 72 72 65  */..    /* Curre
f020: 6e 74 6c 79 2c 20 46 74 73 35 53 65 67 49 74 65  ntly, Fts5SegIte
f030: 72 2e 69 4c 65 61 66 4f 66 66 73 65 74 20 28 61  r.iLeafOffset (a
f040: 6e 64 20 69 4f 66 66 29 20 70 6f 69 6e 74 73 20  nd iOff) points 
f050: 74 6f 20 74 68 65 20 66 69 72 73 74 20 0a 20 20  to the first .  
f060: 20 20 2a 2a 20 62 79 74 65 20 6f 66 20 70 6f 73    ** byte of pos
f070: 69 74 69 6f 6e 2d 6c 69 73 74 20 63 6f 6e 74 65  ition-list conte
f080: 6e 74 20 66 6f 72 20 74 68 65 20 63 75 72 72 65  nt for the curre
f090: 6e 74 20 72 6f 77 69 64 2e 20 42 61 63 6b 20 69  nt rowid. Back i
f0a0: 74 20 75 70 0a 20 20 20 20 2a 2a 20 73 6f 20 74  t up.    ** so t
f0b0: 68 61 74 20 69 74 20 70 6f 69 6e 74 73 20 74 6f  hat it points to
f0c0: 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68   the start of th
f0d0: 65 20 70 6f 73 69 74 69 6f 6e 2d 6c 69 73 74 20  e position-list 
f0e0: 73 69 7a 65 20 66 69 65 6c 64 2e 20 2a 2f 0a 20  size field. */. 
f0f0: 20 20 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f     pIter->iLeafO
f100: 66 66 73 65 74 20 2d 3d 20 73 71 6c 69 74 65 33  ffset -= sqlite3
f110: 46 74 73 35 47 65 74 56 61 72 69 6e 74 4c 65 6e  Fts5GetVarintLen
f120: 28 70 49 74 65 72 2d 3e 6e 50 6f 73 2a 32 2b 70  (pIter->nPos*2+p
f130: 49 74 65 72 2d 3e 62 44 65 6c 29 3b 0a 20 20 20  Iter->bDel);.   
f140: 20 69 4f 66 66 20 3d 20 70 49 74 65 72 2d 3e 69   iOff = pIter->i
f150: 4c 65 61 66 4f 66 66 73 65 74 3b 0a 20 20 20 20  LeafOffset;.    
f160: 61 73 73 65 72 74 28 20 69 4f 66 66 3e 3d 34 20  assert( iOff>=4 
f170: 29 3b 0a 0a 20 20 20 20 2f 2a 20 53 65 61 72 63  );..    /* Searc
f180: 68 20 66 6f 72 20 61 20 6e 65 77 20 74 65 72 6d  h for a new term
f190: 20 77 69 74 68 69 6e 20 74 68 65 20 63 75 72 72   within the curr
f1a0: 65 6e 74 20 6c 65 61 66 2e 20 49 66 20 6f 6e 65  ent leaf. If one
f1b0: 20 63 61 6e 20 62 65 20 66 6f 75 6e 64 2c 0a 20   can be found,. 
f1c0: 20 20 20 2a 2a 20 74 68 65 6e 20 74 68 69 73 20     ** then this 
f1d0: 70 61 67 65 20 63 6f 6e 74 61 69 6e 73 20 74 68  page contains th
f1e0: 65 20 6c 61 72 67 65 73 74 20 72 6f 77 69 64 20  e largest rowid 
f1f0: 66 6f 72 20 74 68 65 20 63 75 72 72 65 6e 74 20  for the current 
f200: 74 65 72 6d 2e 20 2a 2f 0a 20 20 20 20 77 68 69  term. */.    whi
f210: 6c 65 28 20 69 4f 66 66 3c 70 4c 65 61 66 2d 3e  le( iOff<pLeaf->
f220: 6e 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e  n ){.      int n
f230: 50 6f 73 3b 0a 20 20 20 20 20 20 69 36 34 20 69  Pos;.      i64 i
f240: 44 65 6c 74 61 3b 0a 20 20 20 20 20 20 69 6e 74  Delta;.      int
f250: 20 62 44 75 6d 6d 79 3b 0a 0a 20 20 20 20 20 20   bDummy;..      
f260: 2f 2a 20 52 65 61 64 20 74 68 65 20 70 6f 73 69  /* Read the posi
f270: 74 69 6f 6e 2d 6c 69 73 74 20 73 69 7a 65 20 66  tion-list size f
f280: 69 65 6c 64 20 2a 2f 0a 20 20 20 20 20 20 69 4f  ield */.      iO
f290: 66 66 20 2b 3d 20 66 74 73 35 47 65 74 50 6f 73  ff += fts5GetPos
f2a0: 6c 69 73 74 53 69 7a 65 28 26 70 4c 65 61 66 2d  listSize(&pLeaf-
f2b0: 3e 70 5b 69 4f 66 66 5d 2c 20 26 6e 50 6f 73 2c  >p[iOff], &nPos,
f2c0: 20 26 62 44 75 6d 6d 79 29 3b 0a 20 20 20 20 20   &bDummy);.     
f2d0: 20 69 4f 66 66 20 2b 3d 20 6e 50 6f 73 3b 0a 20   iOff += nPos;. 
f2e0: 20 20 20 20 20 69 66 28 20 69 4f 66 66 3e 3d 70       if( iOff>=p
f2f0: 4c 65 61 66 2d 3e 6e 20 29 20 62 72 65 61 6b 3b  Leaf->n ) break;
f300: 0a 0a 20 20 20 20 20 20 2f 2a 20 52 6f 77 69 64  ..      /* Rowid
f310: 20 64 65 6c 74 61 2e 20 4f 72 2c 20 69 66 20 30   delta. Or, if 0
f320: 78 30 30 2c 20 74 68 65 20 65 6e 64 20 6f 66 20  x00, the end of 
f330: 64 6f 63 6c 69 73 74 20 6d 61 72 6b 65 72 2e 20  doclist marker. 
f340: 2a 2f 0a 20 20 20 20 20 20 6e 50 6f 73 20 3d 20  */.      nPos = 
f350: 66 74 73 35 47 65 74 56 61 72 69 6e 74 28 26 70  fts5GetVarint(&p
f360: 4c 65 61 66 2d 3e 70 5b 69 4f 66 66 5d 2c 20 28  Leaf->p[iOff], (
f370: 75 36 34 2a 29 26 69 44 65 6c 74 61 29 3b 0a 20  u64*)&iDelta);. 
f380: 20 20 20 20 20 69 66 28 20 69 44 65 6c 74 61 3d       if( iDelta=
f390: 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  =0 ) break;.    
f3a0: 20 20 69 4f 66 66 20 2b 3d 20 6e 50 6f 73 3b 0a    iOff += nPos;.
f3b0: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66      }..    /* If
f3c0: 20 74 68 69 73 20 63 6f 6e 64 69 74 69 6f 6e 20   this condition 
f3d0: 69 73 20 74 72 75 65 20 74 68 65 6e 20 74 68 65  is true then the
f3e0: 20 6c 61 72 67 65 73 74 20 72 6f 77 69 64 20 66   largest rowid f
f3f0: 6f 72 20 74 68 65 20 63 75 72 72 65 6e 74 0a 20  or the current. 
f400: 20 20 20 2a 2a 20 74 65 72 6d 20 6d 61 79 20 6e     ** term may n
f410: 6f 74 20 62 65 20 73 74 6f 72 65 64 20 6f 6e 20  ot be stored on 
f420: 74 68 65 20 63 75 72 72 65 6e 74 20 70 61 67 65  the current page
f430: 2e 20 53 6f 20 73 65 61 72 63 68 20 66 6f 72 77  . So search forw
f440: 61 72 64 20 74 6f 0a 20 20 20 20 2a 2a 20 73 65  ard to.    ** se
f450: 65 20 77 68 65 72 65 20 73 61 69 64 20 72 6f 77  e where said row
f460: 69 64 20 72 65 61 6c 6c 79 20 69 73 2e 20 20 2a  id really is.  *
f470: 2f 0a 20 20 20 20 69 66 28 20 69 4f 66 66 3e 3d  /.    if( iOff>=
f480: 70 4c 65 61 66 2d 3e 6e 20 29 7b 0a 20 20 20 20  pLeaf->n ){.    
f490: 20 20 69 6e 74 20 70 67 6e 6f 3b 0a 20 20 20 20    int pgno;.    
f4a0: 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65 53    Fts5StructureS
f4b0: 65 67 6d 65 6e 74 20 2a 70 53 65 67 20 3d 20 70  egment *pSeg = p
f4c0: 49 74 65 72 2d 3e 70 53 65 67 3b 0a 0a 20 20 20  Iter->pSeg;..   
f4d0: 20 20 20 2f 2a 20 54 68 65 20 6c 61 73 74 20 72     /* The last r
f4e0: 6f 77 69 64 20 69 6e 20 74 68 65 20 64 6f 63 6c  owid in the docl
f4f0: 69 73 74 20 6d 61 79 20 6e 6f 74 20 62 65 20 6f  ist may not be o
f500: 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 61  n the current pa
f510: 67 65 2e 20 53 65 61 72 63 68 0a 20 20 20 20 20  ge. Search.     
f520: 20 2a 2a 20 66 6f 72 77 61 72 64 20 74 6f 20 66   ** forward to f
f530: 69 6e 64 20 74 68 65 20 70 61 67 65 20 63 6f 6e  ind the page con
f540: 74 61 69 6e 69 6e 67 20 74 68 65 20 6c 61 73 74  taining the last
f550: 20 72 6f 77 69 64 2e 20 20 2a 2f 0a 20 20 20 20   rowid.  */.    
f560: 20 20 66 6f 72 28 70 67 6e 6f 3d 70 49 74 65 72    for(pgno=pIter
f570: 2d 3e 69 4c 65 61 66 50 67 6e 6f 2b 31 3b 20 21  ->iLeafPgno+1; !
f580: 70 2d 3e 72 63 20 26 26 20 70 67 6e 6f 3c 3d 70  p->rc && pgno<=p
f590: 53 65 67 2d 3e 70 67 6e 6f 4c 61 73 74 3b 20 70  Seg->pgnoLast; p
f5a0: 67 6e 6f 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  gno++){.        
f5b0: 69 36 34 20 69 41 62 73 20 3d 20 46 54 53 35 5f  i64 iAbs = FTS5_
f5c0: 53 45 47 4d 45 4e 54 5f 52 4f 57 49 44 28 70 53  SEGMENT_ROWID(pS
f5d0: 65 67 2d 3e 69 53 65 67 69 64 2c 20 30 2c 20 70  eg->iSegid, 0, p
f5e0: 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 46 74  gno);.        Ft
f5f0: 73 35 44 61 74 61 20 2a 70 4e 65 77 20 3d 20 66  s5Data *pNew = f
f600: 74 73 35 44 61 74 61 52 65 61 64 28 70 2c 20 69  ts5DataRead(p, i
f610: 41 62 73 29 3b 0a 20 20 20 20 20 20 20 20 69 66  Abs);.        if
f620: 28 20 70 4e 65 77 20 29 7b 0a 20 20 20 20 20 20  ( pNew ){.      
f630: 20 20 20 20 69 6e 74 20 69 52 6f 77 69 64 2c 20      int iRowid, 
f640: 69 54 65 72 6d 3b 0a 20 20 20 20 20 20 20 20 20  iTerm;.         
f650: 20 66 74 73 35 4c 65 61 66 48 65 61 64 65 72 28   fts5LeafHeader(
f660: 70 4e 65 77 2c 20 26 69 52 6f 77 69 64 2c 20 26  pNew, &iRowid, &
f670: 69 54 65 72 6d 29 3b 0a 20 20 20 20 20 20 20 20  iTerm);.        
f680: 20 20 69 66 28 20 69 52 6f 77 69 64 20 29 7b 0a    if( iRowid ){.
f690: 20 20 20 20 20 20 20 20 20 20 20 20 53 57 41 50              SWAP
f6a0: 56 41 4c 28 46 74 73 35 44 61 74 61 2a 2c 20 70  VAL(Fts5Data*, p
f6b0: 4e 65 77 2c 20 70 4c 61 73 74 29 3b 0a 20 20 20  New, pLast);.   
f6c0: 20 20 20 20 20 20 20 20 20 70 67 6e 6f 4c 61 73           pgnoLas
f6d0: 74 20 3d 20 70 67 6e 6f 3b 0a 20 20 20 20 20 20  t = pgno;.      
f6e0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
f6f0: 66 74 73 35 44 61 74 61 52 65 6c 65 61 73 65 28  fts5DataRelease(
f700: 70 4e 65 77 29 3b 0a 20 20 20 20 20 20 20 20 20  pNew);.         
f710: 20 69 66 28 20 69 54 65 72 6d 20 29 20 62 72 65   if( iTerm ) bre
f720: 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ak;.        }.  
f730: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
f740: 0a 20 20 2f 2a 20 49 66 20 70 4c 61 73 74 20 69  .  /* If pLast i
f750: 73 20 4e 55 4c 4c 20 61 74 20 74 68 69 73 20 70  s NULL at this p
f760: 6f 69 6e 74 2c 20 74 68 65 6e 20 74 68 65 20 6c  oint, then the l
f770: 61 73 74 20 72 6f 77 69 64 20 66 6f 72 20 74 68  ast rowid for th
f780: 69 73 20 64 6f 63 6c 69 73 74 0a 20 20 2a 2a 20  is doclist.  ** 
f790: 6c 69 65 73 20 6f 6e 20 74 68 65 20 70 61 67 65  lies on the page
f7a0: 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 64 69 63   currently indic
f7b0: 61 74 65 64 20 62 79 20 74 68 65 20 69 74 65 72  ated by the iter
f7c0: 61 74 6f 72 2e 20 49 6e 20 74 68 69 73 20 63 61  ator. In this ca
f7d0: 73 65 20 0a 20 20 2a 2a 20 70 49 74 65 72 2d 3e  se .  ** pIter->
f7e0: 69 4c 65 61 66 4f 66 66 73 65 74 20 69 73 20 61  iLeafOffset is a
f7f0: 6c 72 65 61 64 79 20 73 65 74 20 74 6f 20 70 6f  lready set to po
f800: 69 6e 74 20 74 6f 20 74 68 65 20 70 6f 73 69 74  int to the posit
f810: 69 6f 6e 2d 6c 69 73 74 20 73 69 7a 65 0a 20 20  ion-list size.  
f820: 2a 2a 20 66 69 65 6c 64 20 61 73 73 6f 63 69 61  ** field associa
f830: 74 65 64 20 77 69 74 68 20 74 68 65 20 66 69 72  ted with the fir
f840: 73 74 20 72 65 6c 65 76 61 6e 74 20 72 6f 77 69  st relevant rowi
f850: 64 20 6f 6e 20 74 68 65 20 70 61 67 65 2e 0a 20  d on the page.. 
f860: 20 2a 2a 0a 20 20 2a 2a 20 4f 72 2c 20 69 66 20   **.  ** Or, if 
f870: 70 4c 61 73 74 20 69 73 20 6e 6f 6e 2d 4e 55 4c  pLast is non-NUL
f880: 4c 2c 20 74 68 65 6e 20 69 74 20 69 73 20 74 68  L, then it is th
f890: 65 20 70 61 67 65 20 74 68 61 74 20 63 6f 6e 74  e page that cont
f8a0: 61 69 6e 73 20 74 68 65 20 6c 61 73 74 0a 20 20  ains the last.  
f8b0: 2a 2a 20 72 6f 77 69 64 2e 20 49 6e 20 74 68 69  ** rowid. In thi
f8c0: 73 20 63 61 73 65 20 63 6f 6e 66 69 67 75 72 65  s case configure
f8d0: 20 74 68 65 20 69 74 65 72 61 74 6f 72 20 73 6f   the iterator so
f8e0: 20 74 68 61 74 20 69 74 20 70 6f 69 6e 74 73 20   that it points 
f8f0: 74 6f 20 74 68 65 0a 20 20 2a 2a 20 66 69 72 73  to the.  ** firs
f900: 74 20 72 6f 77 69 64 20 6f 6e 20 74 68 69 73 20  t rowid on this 
f910: 70 61 67 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  page..  */.  if(
f920: 20 70 4c 61 73 74 20 29 7b 0a 20 20 20 20 69 6e   pLast ){.    in
f930: 74 20 64 75 6d 6d 79 3b 0a 20 20 20 20 69 6e 74  t dummy;.    int
f940: 20 69 4f 66 66 3b 0a 20 20 20 20 66 74 73 35 44   iOff;.    fts5D
f950: 61 74 61 52 65 6c 65 61 73 65 28 70 49 74 65 72  ataRelease(pIter
f960: 2d 3e 70 4c 65 61 66 29 3b 0a 20 20 20 20 70 49  ->pLeaf);.    pI
f970: 74 65 72 2d 3e 70 4c 65 61 66 20 3d 20 70 4c 61  ter->pLeaf = pLa
f980: 73 74 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 69  st;.    pIter->i
f990: 4c 65 61 66 50 67 6e 6f 20 3d 20 70 67 6e 6f 4c  LeafPgno = pgnoL
f9a0: 61 73 74 3b 0a 20 20 20 20 66 74 73 35 4c 65 61  ast;.    fts5Lea
f9b0: 66 48 65 61 64 65 72 28 70 4c 61 73 74 2c 20 26  fHeader(pLast, &
f9c0: 69 4f 66 66 2c 20 26 64 75 6d 6d 79 29 3b 0a 20  iOff, &dummy);. 
f9d0: 20 20 20 69 4f 66 66 20 2b 3d 20 66 74 73 35 47     iOff += fts5G
f9e0: 65 74 56 61 72 69 6e 74 28 26 70 4c 61 73 74 2d  etVarint(&pLast-
f9f0: 3e 70 5b 69 4f 66 66 5d 2c 20 28 75 36 34 2a 29  >p[iOff], (u64*)
fa00: 26 70 49 74 65 72 2d 3e 69 52 6f 77 69 64 29 3b  &pIter->iRowid);
fa10: 0a 20 20 20 20 70 49 74 65 72 2d 3e 69 4c 65 61  .    pIter->iLea
fa20: 66 4f 66 66 73 65 74 20 3d 20 69 4f 66 66 3b 0a  fOffset = iOff;.
fa30: 20 20 7d 0a 0a 20 20 66 74 73 35 53 65 67 49 74    }..  fts5SegIt
fa40: 65 72 52 65 76 65 72 73 65 49 6e 69 74 50 61 67  erReverseInitPag
fa50: 65 28 70 2c 20 70 49 74 65 72 29 3b 0a 7d 0a 0a  e(p, pIter);.}..
fa60: 2f 2a 0a 2a 2a 20 49 74 65 72 61 74 6f 72 20 70  /*.** Iterator p
fa70: 49 74 65 72 20 63 75 72 72 65 6e 74 6c 79 20 70  Iter currently p
fa80: 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 66 69 72  oints to the fir
fa90: 73 74 20 72 6f 77 69 64 20 6f 66 20 61 20 64 6f  st rowid of a do
faa0: 63 6c 69 73 74 2e 0a 2a 2a 20 54 68 65 72 65 20  clist..** There 
fab0: 69 73 20 61 20 64 6f 63 6c 69 73 74 2d 69 6e 64  is a doclist-ind
fac0: 65 78 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  ex associated wi
fad0: 74 68 20 74 68 65 20 66 69 6e 61 6c 20 74 65 72  th the final ter
fae0: 6d 20 6f 6e 20 74 68 65 20 63 75 72 72 65 6e 74  m on the current
faf0: 20 0a 2a 2a 20 70 61 67 65 2e 20 49 66 20 74 68   .** page. If th
fb00: 65 20 63 75 72 72 65 6e 74 20 74 65 72 6d 20 69  e current term i
fb10: 73 20 74 68 65 20 6c 61 73 74 20 74 65 72 6d 20  s the last term 
fb20: 6f 6e 20 74 68 65 20 70 61 67 65 2c 20 6c 6f 61  on the page, loa
fb30: 64 20 74 68 65 20 0a 2a 2a 20 64 6f 63 6c 69 73  d the .** doclis
fb40: 74 2d 69 6e 64 65 78 20 66 72 6f 6d 20 64 69 73  t-index from dis
fb50: 6b 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65  k and initialize
fb60: 20 61 6e 20 69 74 65 72 61 74 6f 72 20 61 74 20   an iterator at 
fb70: 28 70 49 74 65 72 2d 3e 70 44 6c 69 64 78 29 2e  (pIter->pDlidx).
fb80: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
fb90: 66 74 73 35 53 65 67 49 74 65 72 4c 6f 61 64 44  fts5SegIterLoadD
fba0: 6c 69 64 78 28 46 74 73 35 49 6e 64 65 78 20 2a  lidx(Fts5Index *
fbb0: 70 2c 20 46 74 73 35 53 65 67 49 74 65 72 20 2a  p, Fts5SegIter *
fbc0: 70 49 74 65 72 29 7b 0a 20 20 69 6e 74 20 69 53  pIter){.  int iS
fbd0: 65 67 20 3d 20 70 49 74 65 72 2d 3e 70 53 65 67  eg = pIter->pSeg
fbe0: 2d 3e 69 53 65 67 69 64 3b 0a 20 20 69 6e 74 20  ->iSegid;.  int 
fbf0: 62 52 65 76 20 3d 20 28 70 49 74 65 72 2d 3e 66  bRev = (pIter->f
fc00: 6c 61 67 73 20 26 20 46 54 53 35 5f 53 45 47 49  lags & FTS5_SEGI
fc10: 54 45 52 5f 52 45 56 45 52 53 45 29 3b 0a 20 20  TER_REVERSE);.  
fc20: 46 74 73 35 44 61 74 61 20 2a 70 4c 65 61 66 20  Fts5Data *pLeaf 
fc30: 3d 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 3b 20  = pIter->pLeaf; 
fc40: 2f 2a 20 43 75 72 72 65 6e 74 20 6c 65 61 66 20  /* Current leaf 
fc50: 64 61 74 61 20 2a 2f 0a 0a 20 20 61 73 73 65 72  data */..  asser
fc60: 74 28 20 70 49 74 65 72 2d 3e 66 6c 61 67 73 20  t( pIter->flags 
fc70: 26 20 46 54 53 35 5f 53 45 47 49 54 45 52 5f 4f  & FTS5_SEGITER_O
fc80: 4e 45 54 45 52 4d 20 29 3b 0a 20 20 61 73 73 65  NETERM );.  asse
fc90: 72 74 28 20 70 49 74 65 72 2d 3e 70 44 6c 69 64  rt( pIter->pDlid
fca0: 78 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 43 68  x==0 );..  /* Ch
fcb0: 65 63 6b 20 69 66 20 74 68 65 20 63 75 72 72 65  eck if the curre
fcc0: 6e 74 20 64 6f 63 6c 69 73 74 20 65 6e 64 73 20  nt doclist ends 
fcd0: 6f 6e 20 74 68 69 73 20 70 61 67 65 2e 20 49 66  on this page. If
fce0: 20 69 74 20 64 6f 65 73 2c 20 72 65 74 75 72 6e   it does, return
fcf0: 0a 20 20 2a 2a 20 65 61 72 6c 79 20 77 69 74 68  .  ** early with
fd00: 6f 75 74 20 6c 6f 61 64 69 6e 67 20 74 68 65 20  out loading the 
fd10: 64 6f 63 6c 69 73 74 2d 69 6e 64 65 78 20 28 61  doclist-index (a
fd20: 73 20 69 74 20 62 65 6c 6f 6e 67 73 20 74 6f 20  s it belongs to 
fd30: 61 20 64 69 66 66 65 72 65 6e 74 0a 20 20 2a 2a  a different.  **
fd40: 20 74 65 72 6d 2e 20 2a 2f 0a 20 20 69 66 28 20   term. */.  if( 
fd50: 70 49 74 65 72 2d 3e 69 54 65 72 6d 4c 65 61 66  pIter->iTermLeaf
fd60: 50 67 6e 6f 3d 3d 70 49 74 65 72 2d 3e 69 4c 65  Pgno==pIter->iLe
fd70: 61 66 50 67 6e 6f 20 29 7b 0a 20 20 20 20 69 6e  afPgno ){.    in
fd80: 74 20 69 4f 66 66 20 3d 20 70 49 74 65 72 2d 3e  t iOff = pIter->
fd90: 69 4c 65 61 66 4f 66 66 73 65 74 20 2b 20 70 49  iLeafOffset + pI
fda0: 74 65 72 2d 3e 6e 50 6f 73 3b 0a 20 20 20 20 77  ter->nPos;.    w
fdb0: 68 69 6c 65 28 20 69 4f 66 66 3c 70 4c 65 61 66  hile( iOff<pLeaf
fdc0: 2d 3e 6e 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  ->n ){.      int
fdd0: 20 62 44 75 6d 6d 79 3b 0a 20 20 20 20 20 20 69   bDummy;.      i
fde0: 6e 74 20 6e 50 6f 73 3b 0a 20 20 20 20 20 20 69  nt nPos;.      i
fdf0: 36 34 20 69 44 65 6c 74 61 3b 0a 0a 20 20 20 20  64 iDelta;..    
fe00: 20 20 2f 2a 20 69 4f 66 66 20 69 73 20 63 75 72    /* iOff is cur
fe10: 72 65 6e 74 6c 79 20 74 68 65 20 6f 66 66 73 65  rently the offse
fe20: 74 20 6f 66 20 74 68 65 20 73 74 61 72 74 20 6f  t of the start o
fe30: 66 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74 20  f position list 
fe40: 64 61 74 61 20 2a 2f 0a 20 20 20 20 20 20 69 4f  data */.      iO
fe50: 66 66 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72  ff += fts5GetVar
fe60: 69 6e 74 28 26 70 4c 65 61 66 2d 3e 70 5b 69 4f  int(&pLeaf->p[iO
fe70: 66 66 5d 2c 20 28 75 36 34 2a 29 26 69 44 65 6c  ff], (u64*)&iDel
fe80: 74 61 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69  ta);.      if( i
fe90: 44 65 6c 74 61 3d 3d 30 20 29 20 72 65 74 75 72  Delta==0 ) retur
fea0: 6e 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 5f  n;.      assert_
feb0: 6e 63 28 20 69 4f 66 66 3c 70 4c 65 61 66 2d 3e  nc( iOff<pLeaf->
fec0: 6e 20 29 3b 0a 20 20 20 20 20 20 69 4f 66 66 20  n );.      iOff 
fed0: 2b 3d 20 66 74 73 35 47 65 74 50 6f 73 6c 69 73  += fts5GetPoslis
fee0: 74 53 69 7a 65 28 26 70 4c 65 61 66 2d 3e 70 5b  tSize(&pLeaf->p[
fef0: 69 4f 66 66 5d 2c 20 26 6e 50 6f 73 2c 20 26 62  iOff], &nPos, &b
ff00: 44 75 6d 6d 79 29 3b 0a 20 20 20 20 20 20 69 4f  Dummy);.      iO
ff10: 66 66 20 2b 3d 20 6e 50 6f 73 3b 0a 20 20 20 20  ff += nPos;.    
ff20: 7d 0a 20 20 7d 0a 0a 20 20 70 49 74 65 72 2d 3e  }.  }..  pIter->
ff30: 70 44 6c 69 64 78 20 3d 20 66 74 73 35 44 6c 69  pDlidx = fts5Dli
ff40: 64 78 49 74 65 72 49 6e 69 74 28 70 2c 20 62 52  dxIterInit(p, bR
ff50: 65 76 2c 20 69 53 65 67 2c 20 70 49 74 65 72 2d  ev, iSeg, pIter-
ff60: 3e 69 54 65 72 6d 4c 65 61 66 50 67 6e 6f 29 3b  >iTermLeafPgno);
ff70: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61  .}../*.** Initia
ff80: 6c 69 7a 65 20 74 68 65 20 6f 62 6a 65 63 74 20  lize the object 
ff90: 70 49 74 65 72 20 74 6f 20 70 6f 69 6e 74 20 74  pIter to point t
ffa0: 6f 20 74 65 72 6d 20 70 54 65 72 6d 2f 6e 54 65  o term pTerm/nTe
ffb0: 72 6d 20 77 69 74 68 69 6e 20 73 65 67 6d 65 6e  rm within segmen
ffc0: 74 0a 2a 2a 20 70 53 65 67 2e 20 49 66 20 74 68  t.** pSeg. If th
ffd0: 65 72 65 20 69 73 20 6e 6f 20 73 75 63 68 20 74  ere is no such t
ffe0: 65 72 6d 20 69 6e 20 74 68 65 20 69 6e 64 65 78  erm in the index
fff0: 2c 20 74 68 65 20 69 74 65 72 61 74 6f 72 20 69  , the iterator i
10000 73 20 73 65 74 20 74 6f 20 45 4f 46 2e 0a 2a 2a  s set to EOF..**
10010 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20  .** If an error 
10020 6f 63 63 75 72 73 2c 20 46 74 73 35 49 6e 64 65  occurs, Fts5Inde
10030 78 2e 72 63 20 69 73 20 73 65 74 20 74 6f 20 61  x.rc is set to a
10040 6e 20 61 70 70 72 6f 70 72 69 61 74 65 20 65 72  n appropriate er
10050 72 6f 72 20 63 6f 64 65 2e 20 49 66 20 0a 2a 2a  ror code. If .**
10060 20 61 6e 20 65 72 72 6f 72 20 68 61 73 20 61 6c   an error has al
10070 72 65 61 64 79 20 6f 63 63 75 72 72 65 64 20 77  ready occurred w
10080 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hen this functio
10090 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20 69 74 20  n is called, it 
100a0 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73  is a no-op..*/.s
100b0 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 53  tatic void fts5S
100c0 65 67 49 74 65 72 53 65 65 6b 49 6e 69 74 28 0a  egIterSeekInit(.
100d0 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20    Fts5Index *p, 
100e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
100f0 20 20 2f 2a 20 46 54 53 35 20 62 61 63 6b 65 6e    /* FTS5 backen
10100 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 75 38 20  d */.  const u8 
10110 2a 70 54 65 72 6d 2c 20 69 6e 74 20 6e 54 65 72  *pTerm, int nTer
10120 6d 2c 20 20 20 20 20 2f 2a 20 54 65 72 6d 20 74  m,     /* Term t
10130 6f 20 73 65 65 6b 20 74 6f 20 2a 2f 0a 20 20 69  o seek to */.  i
10140 6e 74 20 66 6c 61 67 73 2c 20 20 20 20 20 20 20  nt flags,       
10150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
10160 2a 20 4d 61 73 6b 20 6f 66 20 46 54 53 35 49 4e  * Mask of FTS5IN
10170 44 45 58 5f 58 58 58 20 66 6c 61 67 73 20 2a 2f  DEX_XXX flags */
10180 0a 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65  .  Fts5Structure
10190 53 65 67 6d 65 6e 74 20 2a 70 53 65 67 2c 20 20  Segment *pSeg,  
101a0 20 20 20 2f 2a 20 44 65 73 63 72 69 70 74 69 6f     /* Descriptio
101b0 6e 20 6f 66 20 73 65 67 6d 65 6e 74 20 2a 2f 0a  n of segment */.
101c0 20 20 46 74 73 35 53 65 67 49 74 65 72 20 2a 70    Fts5SegIter *p
101d0 49 74 65 72 20 20 20 20 20 20 20 20 20 20 20 20  Iter            
101e0 20 20 2f 2a 20 4f 62 6a 65 63 74 20 74 6f 20 70    /* Object to p
101f0 6f 70 75 6c 61 74 65 20 2a 2f 0a 29 7b 0a 20 20  opulate */.){.  
10200 69 6e 74 20 69 50 67 20 3d 20 31 3b 0a 20 20 69  int iPg = 1;.  i
10210 6e 74 20 68 3b 0a 20 20 69 6e 74 20 62 47 65 20  nt h;.  int bGe 
10220 3d 20 28 66 6c 61 67 73 20 26 20 46 54 53 35 49  = (flags & FTS5I
10230 4e 44 45 58 5f 51 55 45 52 59 5f 53 43 41 4e 29  NDEX_QUERY_SCAN)
10240 3b 0a 20 20 69 6e 74 20 62 44 6c 69 64 78 20 3d  ;.  int bDlidx =
10250 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
10260 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74      /* True if t
10270 68 65 72 65 20 69 73 20 61 20 64 6f 63 6c 69 73  here is a doclis
10280 74 2d 69 6e 64 65 78 20 2a 2f 0a 20 20 46 74 73  t-index */.  Fts
10290 35 44 61 74 61 20 2a 70 4c 65 61 66 3b 0a 0a 20  5Data *pLeaf;.. 
102a0 20 61 73 73 65 72 74 28 20 62 47 65 3d 3d 30 20   assert( bGe==0 
102b0 7c 7c 20 28 66 6c 61 67 73 20 26 20 46 54 53 35  || (flags & FTS5
102c0 49 4e 44 45 58 5f 51 55 45 52 59 5f 44 45 53 43  INDEX_QUERY_DESC
102d0 29 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  )==0 );.  assert
102e0 28 20 70 54 65 72 6d 20 26 26 20 6e 54 65 72 6d  ( pTerm && nTerm
102f0 20 29 3b 0a 20 20 6d 65 6d 73 65 74 28 70 49 74   );.  memset(pIt
10300 65 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70  er, 0, sizeof(*p
10310 49 74 65 72 29 29 3b 0a 20 20 70 49 74 65 72 2d  Iter));.  pIter-
10320 3e 70 53 65 67 20 3d 20 70 53 65 67 3b 0a 0a 20  >pSeg = pSeg;.. 
10330 20 2f 2a 20 54 68 69 73 20 62 6c 6f 63 6b 20 73   /* This block s
10340 65 74 73 20 73 74 61 63 6b 20 76 61 72 69 61 62  ets stack variab
10350 6c 65 20 69 50 67 20 74 6f 20 74 68 65 20 6c 65  le iPg to the le
10360 61 66 20 70 61 67 65 20 6e 75 6d 62 65 72 20 74  af page number t
10370 68 61 74 20 6d 61 79 0a 20 20 2a 2a 20 63 6f 6e  hat may.  ** con
10380 74 61 69 6e 20 74 65 72 6d 20 28 70 54 65 72 6d  tain term (pTerm
10390 2f 6e 54 65 72 6d 29 2c 20 69 66 20 69 74 20 69  /nTerm), if it i
103a0 73 20 70 72 65 73 65 6e 74 20 69 6e 20 74 68 65  s present in the
103b0 20 73 65 67 6d 65 6e 74 2e 20 2a 2f 0a 20 20 66   segment. */.  f
103c0 6f 72 28 68 3d 70 53 65 67 2d 3e 6e 48 65 69 67  or(h=pSeg->nHeig
103d0 68 74 2d 31 3b 20 68 3e 30 3b 20 68 2d 2d 29 7b  ht-1; h>0; h--){
103e0 0a 20 20 20 20 46 74 73 35 4e 6f 64 65 49 74 65  .    Fts5NodeIte
103f0 72 20 6e 6f 64 65 3b 20 20 20 20 20 20 20 20 20  r node;         
10400 20 20 20 20 20 2f 2a 20 46 6f 72 20 69 74 65 72       /* For iter
10410 61 74 69 6e 67 20 74 68 72 6f 75 67 68 20 69 6e  ating through in
10420 74 65 72 6e 61 6c 20 6e 6f 64 65 73 20 2a 2f 0a  ternal nodes */.
10430 20 20 20 20 69 36 34 20 69 52 6f 77 69 64 20 3d      i64 iRowid =
10440 20 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f 52 4f   FTS5_SEGMENT_RO
10450 57 49 44 28 70 53 65 67 2d 3e 69 53 65 67 69 64  WID(pSeg->iSegid
10460 2c 20 68 2c 20 69 50 67 29 3b 0a 20 20 20 20 46  , h, iPg);.    F
10470 74 73 35 44 61 74 61 20 2a 70 4e 6f 64 65 20 3d  ts5Data *pNode =
10480 20 66 74 73 35 44 61 74 61 52 65 61 64 28 70 2c   fts5DataRead(p,
10490 20 69 52 6f 77 69 64 29 3b 0a 20 20 20 20 69 66   iRowid);.    if
104a0 28 20 70 4e 6f 64 65 3d 3d 30 20 29 20 62 72 65  ( pNode==0 ) bre
104b0 61 6b 3b 0a 0a 20 20 20 20 66 74 73 35 4e 6f 64  ak;..    fts5Nod
104c0 65 49 74 65 72 49 6e 69 74 28 70 4e 6f 64 65 2d  eIterInit(pNode-
104d0 3e 70 2c 20 70 4e 6f 64 65 2d 3e 6e 2c 20 26 6e  >p, pNode->n, &n
104e0 6f 64 65 29 3b 0a 20 20 20 20 61 73 73 65 72 74  ode);.    assert
104f0 28 20 6e 6f 64 65 2e 74 65 72 6d 2e 6e 3d 3d 30  ( node.term.n==0
10500 20 29 3b 0a 0a 20 20 20 20 69 50 67 20 3d 20 6e   );..    iPg = n
10510 6f 64 65 2e 69 43 68 69 6c 64 3b 0a 20 20 20 20  ode.iChild;.    
10520 62 44 6c 69 64 78 20 3d 20 6e 6f 64 65 2e 62 44  bDlidx = node.bD
10530 6c 69 64 78 3b 0a 20 20 20 20 66 6f 72 28 66 74  lidx;.    for(ft
10540 73 35 4e 6f 64 65 49 74 65 72 4e 65 78 74 28 26  s5NodeIterNext(&
10550 70 2d 3e 72 63 2c 20 26 6e 6f 64 65 29 3b 0a 20  p->rc, &node);. 
10560 20 20 20 20 20 20 20 6e 6f 64 65 2e 61 44 61 74         node.aDat
10570 61 20 26 26 20 66 74 73 35 42 75 66 66 65 72 43  a && fts5BufferC
10580 6f 6d 70 61 72 65 42 6c 6f 62 28 26 6e 6f 64 65  ompareBlob(&node
10590 2e 74 65 72 6d 2c 20 70 54 65 72 6d 2c 20 6e 54  .term, pTerm, nT
105a0 65 72 6d 29 3c 3d 30 3b 0a 20 20 20 20 20 20 20  erm)<=0;.       
105b0 20 66 74 73 35 4e 6f 64 65 49 74 65 72 4e 65 78   fts5NodeIterNex
105c0 74 28 26 70 2d 3e 72 63 2c 20 26 6e 6f 64 65 29  t(&p->rc, &node)
105d0 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 69 50  .    ){.      iP
105e0 67 20 3d 20 6e 6f 64 65 2e 69 43 68 69 6c 64 3b  g = node.iChild;
105f0 0a 20 20 20 20 20 20 62 44 6c 69 64 78 20 3d 20  .      bDlidx = 
10600 6e 6f 64 65 2e 62 44 6c 69 64 78 3b 0a 20 20 20  node.bDlidx;.   
10610 20 7d 0a 20 20 20 20 66 74 73 35 4e 6f 64 65 49   }.    fts5NodeI
10620 74 65 72 46 72 65 65 28 26 6e 6f 64 65 29 3b 0a  terFree(&node);.
10630 20 20 20 20 66 74 73 35 44 61 74 61 52 65 6c 65      fts5DataRele
10640 61 73 65 28 70 4e 6f 64 65 29 3b 0a 20 20 7d 0a  ase(pNode);.  }.
10650 0a 20 20 69 66 28 20 69 50 67 3c 70 53 65 67 2d  .  if( iPg<pSeg-
10660 3e 70 67 6e 6f 46 69 72 73 74 20 29 7b 0a 20 20  >pgnoFirst ){.  
10670 20 20 69 50 67 20 3d 20 70 53 65 67 2d 3e 70 67    iPg = pSeg->pg
10680 6e 6f 46 69 72 73 74 3b 0a 20 20 20 20 62 44 6c  noFirst;.    bDl
10690 69 64 78 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20  idx = 0;.  }..  
106a0 70 49 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f  pIter->iLeafPgno
106b0 20 3d 20 69 50 67 20 2d 20 31 3b 0a 20 20 66 74   = iPg - 1;.  ft
106c0 73 35 53 65 67 49 74 65 72 4e 65 78 74 50 61 67  s5SegIterNextPag
106d0 65 28 70 2c 20 70 49 74 65 72 29 3b 0a 0a 20 20  e(p, pIter);..  
106e0 69 66 28 20 28 70 4c 65 61 66 20 3d 20 70 49 74  if( (pLeaf = pIt
106f0 65 72 2d 3e 70 4c 65 61 66 29 20 29 7b 0a 20 20  er->pLeaf) ){.  
10700 20 20 69 6e 74 20 72 65 73 3b 0a 20 20 20 20 70    int res;.    p
10710 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65  Iter->iLeafOffse
10720 74 20 3d 20 66 74 73 35 47 65 74 55 31 36 28 26  t = fts5GetU16(&
10730 70 4c 65 61 66 2d 3e 70 5b 32 5d 29 3b 0a 20 20  pLeaf->p[2]);.  
10740 20 20 69 66 28 20 70 49 74 65 72 2d 3e 69 4c 65    if( pIter->iLe
10750 61 66 4f 66 66 73 65 74 3c 34 20 7c 7c 20 70 49  afOffset<4 || pI
10760 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74  ter->iLeafOffset
10770 3e 3d 70 4c 65 61 66 2d 3e 6e 20 29 7b 0a 20 20  >=pLeaf->n ){.  
10780 20 20 20 20 70 2d 3e 72 63 20 3d 20 46 54 53 35      p->rc = FTS5
10790 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20 20 7d 65  _CORRUPT;.    }e
107a0 6c 73 65 7b 0a 20 20 20 20 20 20 66 74 73 35 53  lse{.      fts5S
107b0 65 67 49 74 65 72 4c 6f 61 64 54 65 72 6d 28 70  egIterLoadTerm(p
107c0 2c 20 70 49 74 65 72 2c 20 30 29 3b 0a 20 20 20  , pIter, 0);.   
107d0 20 20 20 66 74 73 35 53 65 67 49 74 65 72 4c 6f     fts5SegIterLo
107e0 61 64 4e 50 6f 73 28 70 2c 20 70 49 74 65 72 29  adNPos(p, pIter)
107f0 3b 0a 20 20 20 20 20 20 64 6f 20 7b 0a 20 20 20  ;.      do {.   
10800 20 20 20 20 20 72 65 73 20 3d 20 66 74 73 35 42       res = fts5B
10810 75 66 66 65 72 43 6f 6d 70 61 72 65 42 6c 6f 62  ufferCompareBlob
10820 28 26 70 49 74 65 72 2d 3e 74 65 72 6d 2c 20 70  (&pIter->term, p
10830 54 65 72 6d 2c 20 6e 54 65 72 6d 29 3b 0a 20 20  Term, nTerm);.  
10840 20 20 20 20 20 20 69 66 28 20 72 65 73 3e 3d 30        if( res>=0
10850 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
10860 20 20 66 74 73 35 53 65 67 49 74 65 72 4e 65 78    fts5SegIterNex
10870 74 28 70 2c 20 70 49 74 65 72 2c 20 30 29 3b 0a  t(p, pIter, 0);.
10880 20 20 20 20 20 20 7d 77 68 69 6c 65 28 20 70 49        }while( pI
10890 74 65 72 2d 3e 70 4c 65 61 66 20 26 26 20 70 2d  ter->pLeaf && p-
108a0 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  >rc==SQLITE_OK )
108b0 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 62 47 65  ;..      if( bGe
108c0 3d 3d 30 20 26 26 20 72 65 73 20 29 7b 0a 20 20  ==0 && res ){.  
108d0 20 20 20 20 20 20 2f 2a 20 53 65 74 20 69 74 65        /* Set ite
108e0 72 61 74 6f 72 20 74 6f 20 70 6f 69 6e 74 20 74  rator to point t
108f0 6f 20 45 4f 46 20 2a 2f 0a 20 20 20 20 20 20 20  o EOF */.       
10900 20 66 74 73 35 44 61 74 61 52 65 6c 65 61 73 65   fts5DataRelease
10910 28 70 49 74 65 72 2d 3e 70 4c 65 61 66 29 3b 0a  (pIter->pLeaf);.
10920 20 20 20 20 20 20 20 20 70 49 74 65 72 2d 3e 70          pIter->p
10930 4c 65 61 66 20 3d 20 30 3b 0a 20 20 20 20 20 20  Leaf = 0;.      
10940 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69  }.    }.  }..  i
10950 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  f( p->rc==SQLITE
10960 5f 4f 4b 20 26 26 20 62 47 65 3d 3d 30 20 29 7b  _OK && bGe==0 ){
10970 0a 20 20 20 20 70 49 74 65 72 2d 3e 66 6c 61 67  .    pIter->flag
10980 73 20 7c 3d 20 46 54 53 35 5f 53 45 47 49 54 45  s |= FTS5_SEGITE
10990 52 5f 4f 4e 45 54 45 52 4d 3b 0a 20 20 20 20 69  R_ONETERM;.    i
109a0 66 28 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 20  f( pIter->pLeaf 
109b0 29 7b 0a 20 20 20 20 20 20 69 66 28 20 66 6c 61  ){.      if( fla
109c0 67 73 20 26 20 46 54 53 35 49 4e 44 45 58 5f 51  gs & FTS5INDEX_Q
109d0 55 45 52 59 5f 44 45 53 43 20 29 7b 0a 20 20 20  UERY_DESC ){.   
109e0 20 20 20 20 20 70 49 74 65 72 2d 3e 66 6c 61 67       pIter->flag
109f0 73 20 7c 3d 20 46 54 53 35 5f 53 45 47 49 54 45  s |= FTS5_SEGITE
10a00 52 5f 52 45 56 45 52 53 45 3b 0a 20 20 20 20 20  R_REVERSE;.     
10a10 20 7d 0a 20 20 20 20 20 20 69 66 28 20 62 44 6c   }.      if( bDl
10a20 69 64 78 20 29 7b 0a 20 20 20 20 20 20 20 20 66  idx ){.        f
10a30 74 73 35 53 65 67 49 74 65 72 4c 6f 61 64 44 6c  ts5SegIterLoadDl
10a40 69 64 78 28 70 2c 20 70 49 74 65 72 29 3b 0a 20  idx(p, pIter);. 
10a50 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
10a60 20 66 6c 61 67 73 20 26 20 46 54 53 35 49 4e 44   flags & FTS5IND
10a70 45 58 5f 51 55 45 52 59 5f 44 45 53 43 20 29 7b  EX_QUERY_DESC ){
10a80 0a 20 20 20 20 20 20 20 20 66 74 73 35 53 65 67  .        fts5Seg
10a90 49 74 65 72 52 65 76 65 72 73 65 28 70 2c 20 70  IterReverse(p, p
10aa0 49 74 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Iter);.      }. 
10ab0 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
10ac0 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65  * Initialize the
10ad0 20 6f 62 6a 65 63 74 20 70 49 74 65 72 20 74 6f   object pIter to
10ae0 20 70 6f 69 6e 74 20 74 6f 20 74 65 72 6d 20 70   point to term p
10af0 54 65 72 6d 2f 6e 54 65 72 6d 20 77 69 74 68 69  Term/nTerm withi
10b00 6e 20 74 68 65 0a 2a 2a 20 69 6e 2d 6d 65 6d 6f  n the.** in-memo
10b10 72 79 20 68 61 73 68 20 74 61 62 6c 65 2e 20 49  ry hash table. I
10b20 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 73 75  f there is no su
10b30 63 68 20 74 65 72 6d 20 69 6e 20 74 68 65 20 68  ch term in the h
10b40 61 73 68 2d 74 61 62 6c 65 2c 20 74 68 65 20 0a  ash-table, the .
10b50 2a 2a 20 69 74 65 72 61 74 6f 72 20 69 73 20 73  ** iterator is s
10b60 65 74 20 74 6f 20 45 4f 46 2e 0a 2a 2a 0a 2a 2a  et to EOF..**.**
10b70 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
10b80 75 72 73 2c 20 46 74 73 35 49 6e 64 65 78 2e 72  urs, Fts5Index.r
10b90 63 20 69 73 20 73 65 74 20 74 6f 20 61 6e 20 61  c is set to an a
10ba0 70 70 72 6f 70 72 69 61 74 65 20 65 72 72 6f 72  ppropriate error
10bb0 20 63 6f 64 65 2e 20 49 66 20 0a 2a 2a 20 61 6e   code. If .** an
10bc0 20 65 72 72 6f 72 20 68 61 73 20 61 6c 72 65 61   error has alrea
10bd0 64 79 20 6f 63 63 75 72 72 65 64 20 77 68 65 6e  dy occurred when
10be0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
10bf0 73 20 63 61 6c 6c 65 64 2c 20 69 74 20 69 73 20  s called, it is 
10c00 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74  a no-op..*/.stat
10c10 69 63 20 76 6f 69 64 20 66 74 73 35 53 65 67 49  ic void fts5SegI
10c20 74 65 72 48 61 73 68 49 6e 69 74 28 0a 20 20 46  terHashInit(.  F
10c30 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20  ts5Index *p,    
10c40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
10c50 2a 20 46 54 53 35 20 62 61 63 6b 65 6e 64 20 2a  * FTS5 backend *
10c60 2f 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 70 54  /.  const u8 *pT
10c70 65 72 6d 2c 20 69 6e 74 20 6e 54 65 72 6d 2c 20  erm, int nTerm, 
10c80 20 20 20 20 2f 2a 20 54 65 72 6d 20 74 6f 20 73      /* Term to s
10c90 65 65 6b 20 74 6f 20 2a 2f 0a 20 20 69 6e 74 20  eek to */.  int 
10ca0 66 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20 20  flags,          
10cb0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
10cc0 61 73 6b 20 6f 66 20 46 54 53 35 49 4e 44 45 58  ask of FTS5INDEX
10cd0 5f 58 58 58 20 66 6c 61 67 73 20 2a 2f 0a 20 20  _XXX flags */.  
10ce0 46 74 73 35 53 65 67 49 74 65 72 20 2a 70 49 74  Fts5SegIter *pIt
10cf0 65 72 20 20 20 20 20 20 20 20 20 20 20 20 20 20  er              
10d00 2f 2a 20 4f 62 6a 65 63 74 20 74 6f 20 70 6f 70  /* Object to pop
10d10 75 6c 61 74 65 20 2a 2f 0a 29 7b 0a 20 20 63 6f  ulate */.){.  co
10d20 6e 73 74 20 75 38 20 2a 70 4c 69 73 74 20 3d 20  nst u8 *pList = 
10d30 30 3b 0a 20 20 69 6e 74 20 6e 4c 69 73 74 20 3d  0;.  int nList =
10d40 20 30 3b 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a   0;.  const u8 *
10d50 7a 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 20 3d  z = 0;.  int n =
10d60 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70   0;..  assert( p
10d70 2d 3e 70 48 61 73 68 20 29 3b 0a 20 20 61 73 73  ->pHash );.  ass
10d80 65 72 74 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49  ert( p->rc==SQLI
10d90 54 45 5f 4f 4b 20 29 3b 0a 0a 20 20 69 66 28 20  TE_OK );..  if( 
10da0 70 54 65 72 6d 3d 3d 30 20 7c 7c 20 28 66 6c 61  pTerm==0 || (fla
10db0 67 73 20 26 20 46 54 53 35 49 4e 44 45 58 5f 51  gs & FTS5INDEX_Q
10dc0 55 45 52 59 5f 53 43 41 4e 29 20 29 7b 0a 20 20  UERY_SCAN) ){.  
10dd0 20 20 70 2d 3e 72 63 20 3d 20 73 71 6c 69 74 65    p->rc = sqlite
10de0 33 46 74 73 35 48 61 73 68 53 63 61 6e 49 6e 69  3Fts5HashScanIni
10df0 74 28 70 2d 3e 70 48 61 73 68 2c 20 28 63 6f 6e  t(p->pHash, (con
10e00 73 74 20 63 68 61 72 2a 29 70 54 65 72 6d 2c 20  st char*)pTerm, 
10e10 6e 54 65 72 6d 29 3b 0a 20 20 20 20 73 71 6c 69  nTerm);.    sqli
10e20 74 65 33 46 74 73 35 48 61 73 68 53 63 61 6e 45  te3Fts5HashScanE
10e30 6e 74 72 79 28 70 2d 3e 70 48 61 73 68 2c 20 28  ntry(p->pHash, (
10e40 63 6f 6e 73 74 20 63 68 61 72 2a 2a 29 26 7a 2c  const char**)&z,
10e50 20 26 70 4c 69 73 74 2c 20 26 6e 4c 69 73 74 29   &pList, &nList)
10e60 3b 0a 20 20 20 20 6e 20 3d 20 28 7a 20 3f 20 73  ;.    n = (z ? s
10e70 74 72 6c 65 6e 28 28 63 6f 6e 73 74 20 63 68 61  trlen((const cha
10e80 72 2a 29 7a 29 20 3a 20 30 29 3b 0a 20 20 7d 65  r*)z) : 0);.  }e
10e90 6c 73 65 7b 0a 20 20 20 20 70 49 74 65 72 2d 3e  lse{.    pIter->
10ea0 66 6c 61 67 73 20 7c 3d 20 46 54 53 35 5f 53 45  flags |= FTS5_SE
10eb0 47 49 54 45 52 5f 4f 4e 45 54 45 52 4d 3b 0a 20  GITER_ONETERM;. 
10ec0 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 48 61     sqlite3Fts5Ha
10ed0 73 68 51 75 65 72 79 28 70 2d 3e 70 48 61 73 68  shQuery(p->pHash
10ee0 2c 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 70  , (const char*)p
10ef0 54 65 72 6d 2c 20 6e 54 65 72 6d 2c 20 26 70 4c  Term, nTerm, &pL
10f00 69 73 74 2c 20 26 6e 4c 69 73 74 29 3b 0a 20 20  ist, &nList);.  
10f10 20 20 7a 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20    z = pTerm;.   
10f20 20 6e 20 3d 20 6e 54 65 72 6d 3b 0a 20 20 7d 0a   n = nTerm;.  }.
10f30 0a 20 20 69 66 28 20 70 4c 69 73 74 20 29 7b 0a  .  if( pList ){.
10f40 20 20 20 20 46 74 73 35 44 61 74 61 20 2a 70 4c      Fts5Data *pL
10f50 65 61 66 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  eaf;.    sqlite3
10f60 46 74 73 35 42 75 66 66 65 72 53 65 74 28 26 70  Fts5BufferSet(&p
10f70 2d 3e 72 63 2c 20 26 70 49 74 65 72 2d 3e 74 65  ->rc, &pIter->te
10f80 72 6d 2c 20 6e 2c 20 7a 29 3b 0a 20 20 20 20 70  rm, n, z);.    p
10f90 4c 65 61 66 20 3d 20 66 74 73 35 49 64 78 4d 61  Leaf = fts5IdxMa
10fa0 6c 6c 6f 63 28 70 2c 20 73 69 7a 65 6f 66 28 46  lloc(p, sizeof(F
10fb0 74 73 35 44 61 74 61 29 29 3b 0a 20 20 20 20 69  ts5Data));.    i
10fc0 66 28 20 70 4c 65 61 66 3d 3d 30 20 29 20 72 65  f( pLeaf==0 ) re
10fd0 74 75 72 6e 3b 0a 20 20 20 20 70 4c 65 61 66 2d  turn;.    pLeaf-
10fe0 3e 70 20 3d 20 28 75 38 2a 29 70 4c 69 73 74 3b  >p = (u8*)pList;
10ff0 0a 20 20 20 20 70 4c 65 61 66 2d 3e 6e 20 3d 20  .    pLeaf->n = 
11000 6e 4c 69 73 74 3b 0a 20 20 20 20 70 49 74 65 72  nList;.    pIter
11010 2d 3e 70 4c 65 61 66 20 3d 20 70 4c 65 61 66 3b  ->pLeaf = pLeaf;
11020 0a 20 20 20 20 70 49 74 65 72 2d 3e 69 4c 65 61  .    pIter->iLea
11030 66 4f 66 66 73 65 74 20 3d 20 66 74 73 35 47 65  fOffset = fts5Ge
11040 74 56 61 72 69 6e 74 28 70 4c 65 61 66 2d 3e 70  tVarint(pLeaf->p
11050 2c 20 28 75 36 34 2a 29 26 70 49 74 65 72 2d 3e  , (u64*)&pIter->
11060 69 52 6f 77 69 64 29 3b 0a 0a 20 20 20 20 69 66  iRowid);..    if
11070 28 20 66 6c 61 67 73 20 26 20 46 54 53 35 49 4e  ( flags & FTS5IN
11080 44 45 58 5f 51 55 45 52 59 5f 44 45 53 43 20 29  DEX_QUERY_DESC )
11090 7b 0a 20 20 20 20 20 20 70 49 74 65 72 2d 3e 66  {.      pIter->f
110a0 6c 61 67 73 20 7c 3d 20 46 54 53 35 5f 53 45 47  lags |= FTS5_SEG
110b0 49 54 45 52 5f 52 45 56 45 52 53 45 3b 0a 20 20  ITER_REVERSE;.  
110c0 20 20 20 20 66 74 73 35 53 65 67 49 74 65 72 52      fts5SegIterR
110d0 65 76 65 72 73 65 49 6e 69 74 50 61 67 65 28 70  everseInitPage(p
110e0 2c 20 70 49 74 65 72 29 3b 0a 20 20 20 20 7d 65  , pIter);.    }e
110f0 6c 73 65 7b 0a 20 20 20 20 20 20 66 74 73 35 53  lse{.      fts5S
11100 65 67 49 74 65 72 4c 6f 61 64 4e 50 6f 73 28 70  egIterLoadNPos(p
11110 2c 20 70 49 74 65 72 29 3b 0a 20 20 20 20 7d 0a  , pIter);.    }.
11120 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 5a 65 72    }.}../*.** Zer
11130 6f 20 74 68 65 20 69 74 65 72 61 74 6f 72 20 70  o the iterator p
11140 61 73 73 65 64 20 61 73 20 74 68 65 20 6f 6e 6c  assed as the onl
11150 79 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73  y argument..*/.s
11160 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 53  tatic void fts5S
11170 65 67 49 74 65 72 43 6c 65 61 72 28 46 74 73 35  egIterClear(Fts5
11180 53 65 67 49 74 65 72 20 2a 70 49 74 65 72 29 7b  SegIter *pIter){
11190 0a 20 20 66 74 73 35 42 75 66 66 65 72 46 72 65  .  fts5BufferFre
111a0 65 28 26 70 49 74 65 72 2d 3e 74 65 72 6d 29 3b  e(&pIter->term);
111b0 0a 20 20 66 74 73 35 44 61 74 61 52 65 6c 65 61  .  fts5DataRelea
111c0 73 65 28 70 49 74 65 72 2d 3e 70 4c 65 61 66 29  se(pIter->pLeaf)
111d0 3b 0a 20 20 66 74 73 35 44 61 74 61 52 65 6c 65  ;.  fts5DataRele
111e0 61 73 65 28 70 49 74 65 72 2d 3e 70 4e 65 78 74  ase(pIter->pNext
111f0 4c 65 61 66 29 3b 0a 20 20 66 74 73 35 44 6c 69  Leaf);.  fts5Dli
11200 64 78 49 74 65 72 46 72 65 65 28 70 49 74 65 72  dxIterFree(pIter
11210 2d 3e 70 44 6c 69 64 78 29 3b 0a 20 20 73 71 6c  ->pDlidx);.  sql
11220 69 74 65 33 5f 66 72 65 65 28 70 49 74 65 72 2d  ite3_free(pIter-
11230 3e 61 52 6f 77 69 64 4f 66 66 73 65 74 29 3b 0a  >aRowidOffset);.
11240 20 20 6d 65 6d 73 65 74 28 70 49 74 65 72 2c 20    memset(pIter, 
11250 30 2c 20 73 69 7a 65 6f 66 28 46 74 73 35 53 65  0, sizeof(Fts5Se
11260 67 49 74 65 72 29 29 3b 0a 7d 0a 0a 23 69 66 64  gIter));.}..#ifd
11270 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
11280 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
11290 74 69 6f 6e 20 69 73 20 75 73 65 64 20 61 73 20  tion is used as 
112a0 70 61 72 74 20 6f 66 20 74 68 65 20 62 69 67 20  part of the big 
112b0 61 73 73 65 72 74 28 29 20 70 72 6f 63 65 64 75  assert() procedu
112c0 72 65 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 62  re implemented b
112d0 79 0a 2a 2a 20 66 74 73 35 41 73 73 65 72 74 4d  y.** fts5AssertM
112e0 75 6c 74 69 49 74 65 72 53 65 74 75 70 28 29 2e  ultiIterSetup().
112f0 20 49 74 20 65 6e 73 75 72 65 73 20 74 68 61 74   It ensures that
11300 20 74 68 65 20 72 65 73 75 6c 74 20 63 75 72 72   the result curr
11310 65 6e 74 6c 79 20 73 74 6f 72 65 64 0a 2a 2a 20  ently stored.** 
11320 69 6e 20 2a 70 52 65 73 20 69 73 20 74 68 65 20  in *pRes is the 
11330 63 6f 72 72 65 63 74 20 72 65 73 75 6c 74 20 6f  correct result o
11340 66 20 63 6f 6d 70 61 72 69 6e 67 20 74 68 65 20  f comparing the 
11350 63 75 72 72 65 6e 74 20 70 6f 73 69 74 69 6f 6e  current position
11360 73 20 6f 66 20 74 68 65 0a 2a 2a 20 74 77 6f 20  s of the.** two 
11370 69 74 65 72 61 74 6f 72 73 2e 0a 2a 2f 0a 73 74  iterators..*/.st
11380 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 41 73  atic void fts5As
11390 73 65 72 74 43 6f 6d 70 61 72 69 73 6f 6e 52 65  sertComparisonRe
113a0 73 75 6c 74 28 0a 20 20 46 74 73 35 4d 75 6c 74  sult(.  Fts5Mult
113b0 69 53 65 67 49 74 65 72 20 2a 70 49 74 65 72 2c  iSegIter *pIter,
113c0 20 0a 20 20 46 74 73 35 53 65 67 49 74 65 72 20   .  Fts5SegIter 
113d0 2a 70 31 2c 0a 20 20 46 74 73 35 53 65 67 49 74  *p1,.  Fts5SegIt
113e0 65 72 20 2a 70 32 2c 0a 20 20 46 74 73 35 43 52  er *p2,.  Fts5CR
113f0 65 73 75 6c 74 20 2a 70 52 65 73 0a 29 7b 0a 20  esult *pRes.){. 
11400 20 69 6e 74 20 69 31 20 3d 20 70 31 20 2d 20 70   int i1 = p1 - p
11410 49 74 65 72 2d 3e 61 53 65 67 3b 0a 20 20 69 6e  Iter->aSeg;.  in
11420 74 20 69 32 20 3d 20 70 32 20 2d 20 70 49 74 65  t i2 = p2 - pIte
11430 72 2d 3e 61 53 65 67 3b 0a 0a 20 20 69 66 28 20  r->aSeg;..  if( 
11440 70 31 2d 3e 70 4c 65 61 66 20 7c 7c 20 70 32 2d  p1->pLeaf || p2-
11450 3e 70 4c 65 61 66 20 29 7b 0a 20 20 20 20 69 66  >pLeaf ){.    if
11460 28 20 70 31 2d 3e 70 4c 65 61 66 3d 3d 30 20 29  ( p1->pLeaf==0 )
11470 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
11480 70 52 65 73 2d 3e 69 46 69 72 73 74 3d 3d 69 32  pRes->iFirst==i2
11490 20 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66   );.    }else if
114a0 28 20 70 32 2d 3e 70 4c 65 61 66 3d 3d 30 20 29  ( p2->pLeaf==0 )
114b0 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
114c0 70 52 65 73 2d 3e 69 46 69 72 73 74 3d 3d 69 31  pRes->iFirst==i1
114d0 20 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   );.    }else{. 
114e0 20 20 20 20 20 69 6e 74 20 6e 4d 69 6e 20 3d 20       int nMin = 
114f0 4d 49 4e 28 70 31 2d 3e 74 65 72 6d 2e 6e 2c 20  MIN(p1->term.n, 
11500 70 32 2d 3e 74 65 72 6d 2e 6e 29 3b 0a 20 20 20  p2->term.n);.   
11510 20 20 20 69 6e 74 20 72 65 73 20 3d 20 6d 65 6d     int res = mem
11520 63 6d 70 28 70 31 2d 3e 74 65 72 6d 2e 70 2c 20  cmp(p1->term.p, 
11530 70 32 2d 3e 74 65 72 6d 2e 70 2c 20 6e 4d 69 6e  p2->term.p, nMin
11540 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 65 73  );.      if( res
11550 3d 3d 30 20 29 20 72 65 73 20 3d 20 70 31 2d 3e  ==0 ) res = p1->
11560 74 65 72 6d 2e 6e 20 2d 20 70 32 2d 3e 74 65 72  term.n - p2->ter
11570 6d 2e 6e 3b 0a 0a 20 20 20 20 20 20 69 66 28 20  m.n;..      if( 
11580 72 65 73 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  res==0 ){.      
11590 20 20 61 73 73 65 72 74 28 20 70 52 65 73 2d 3e    assert( pRes->
115a0 62 54 65 72 6d 45 71 3d 3d 31 20 29 3b 0a 20 20  bTermEq==1 );.  
115b0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 31        assert( p1
115c0 2d 3e 69 52 6f 77 69 64 21 3d 70 32 2d 3e 69 52  ->iRowid!=p2->iR
115d0 6f 77 69 64 20 29 3b 0a 20 20 20 20 20 20 20 20  owid );.        
115e0 72 65 73 20 3d 20 28 28 70 31 2d 3e 69 52 6f 77  res = ((p1->iRow
115f0 69 64 20 3e 20 70 32 2d 3e 69 52 6f 77 69 64 29  id > p2->iRowid)
11600 3d 3d 70 49 74 65 72 2d 3e 62 52 65 76 29 20 3f  ==pIter->bRev) ?
11610 20 2d 31 20 3a 20 31 3b 0a 20 20 20 20 20 20 7d   -1 : 1;.      }
11620 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61 73  else{.        as
11630 73 65 72 74 28 20 70 52 65 73 2d 3e 62 54 65 72  sert( pRes->bTer
11640 6d 45 71 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  mEq==0 );.      
11650 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 72 65 73  }..      if( res
11660 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73  <0 ){.        as
11670 73 65 72 74 28 20 70 52 65 73 2d 3e 69 46 69 72  sert( pRes->iFir
11680 73 74 3d 3d 69 31 20 29 3b 0a 20 20 20 20 20 20  st==i1 );.      
11690 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61  }else{.        a
116a0 73 73 65 72 74 28 20 70 52 65 73 2d 3e 69 46 69  ssert( pRes->iFi
116b0 72 73 74 3d 3d 69 32 20 29 3b 0a 20 20 20 20 20  rst==i2 );.     
116c0 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a   }.    }.  }.}..
116d0 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
116e0 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 20 75  ion is a no-op u
116f0 6e 6c 65 73 73 20 53 51 4c 49 54 45 5f 44 45 42  nless SQLITE_DEB
11700 55 47 20 69 73 20 64 65 66 69 6e 65 64 20 77 68  UG is defined wh
11710 65 6e 20 74 68 69 73 20 6d 6f 64 75 6c 65 0a 2a  en this module.*
11720 2a 20 69 73 20 63 6f 6d 70 69 6c 65 64 2e 20 49  * is compiled. I
11730 6e 20 74 68 61 74 20 63 61 73 65 2c 20 74 68 69  n that case, thi
11740 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 65 73  s function is es
11750 73 65 6e 74 69 61 6c 6c 79 20 61 6e 20 61 73 73  sentially an ass
11760 65 72 74 28 29 20 0a 2a 2a 20 73 74 61 74 65 6d  ert() .** statem
11770 65 6e 74 20 75 73 65 64 20 74 6f 20 76 65 72 69  ent used to veri
11780 66 79 20 74 68 61 74 20 74 68 65 20 63 6f 6e 74  fy that the cont
11790 65 6e 74 73 20 6f 66 20 74 68 65 20 70 49 74 65  ents of the pIte
117a0 72 2d 3e 61 46 69 72 73 74 5b 5d 20 61 72 72 61  r->aFirst[] arra
117b0 79 0a 2a 2a 20 61 72 65 20 63 6f 72 72 65 63 74  y.** are correct
117c0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
117d0 20 66 74 73 35 41 73 73 65 72 74 4d 75 6c 74 69   fts5AssertMulti
117e0 49 74 65 72 53 65 74 75 70 28 46 74 73 35 49 6e  IterSetup(Fts5In
117f0 64 65 78 20 2a 70 2c 20 46 74 73 35 4d 75 6c 74  dex *p, Fts5Mult
11800 69 53 65 67 49 74 65 72 20 2a 70 49 74 65 72 29  iSegIter *pIter)
11810 7b 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53  {.  if( p->rc==S
11820 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
11830 69 6e 74 20 69 3b 0a 0a 20 20 20 20 61 73 73 65  int i;..    asse
11840 72 74 28 20 28 70 49 74 65 72 2d 3e 61 53 65 67  rt( (pIter->aSeg
11850 5b 20 70 49 74 65 72 2d 3e 61 46 69 72 73 74 5b  [ pIter->aFirst[
11860 31 5d 2e 69 46 69 72 73 74 20 5d 2e 70 4c 65 61  1].iFirst ].pLea
11870 66 3d 3d 30 29 3d 3d 70 49 74 65 72 2d 3e 62 45  f==0)==pIter->bE
11880 6f 66 20 29 3b 0a 0a 20 20 20 20 66 6f 72 28 69  of );..    for(i
11890 3d 30 3b 20 69 3c 70 49 74 65 72 2d 3e 6e 53 65  =0; i<pIter->nSe
118a0 67 3b 20 69 2b 3d 32 29 7b 0a 20 20 20 20 20 20  g; i+=2){.      
118b0 46 74 73 35 53 65 67 49 74 65 72 20 2a 70 31 20  Fts5SegIter *p1 
118c0 3d 20 26 70 49 74 65 72 2d 3e 61 53 65 67 5b 69  = &pIter->aSeg[i
118d0 5d 3b 0a 20 20 20 20 20 20 46 74 73 35 53 65 67  ];.      Fts5Seg
118e0 49 74 65 72 20 2a 70 32 20 3d 20 26 70 49 74 65  Iter *p2 = &pIte
118f0 72 2d 3e 61 53 65 67 5b 69 2b 31 5d 3b 0a 20 20  r->aSeg[i+1];.  
11900 20 20 20 20 46 74 73 35 43 52 65 73 75 6c 74 20      Fts5CResult 
11910 2a 70 52 65 73 20 3d 20 26 70 49 74 65 72 2d 3e  *pRes = &pIter->
11920 61 46 69 72 73 74 5b 28 70 49 74 65 72 2d 3e 6e  aFirst[(pIter->n
11930 53 65 67 20 2b 20 69 29 20 2f 20 32 5d 3b 0a 20  Seg + i) / 2];. 
11940 20 20 20 20 20 66 74 73 35 41 73 73 65 72 74 43       fts5AssertC
11950 6f 6d 70 61 72 69 73 6f 6e 52 65 73 75 6c 74 28  omparisonResult(
11960 70 49 74 65 72 2c 20 70 31 2c 20 70 32 2c 20 70  pIter, p1, p2, p
11970 52 65 73 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  Res);.    }..   
11980 20 66 6f 72 28 69 3d 31 3b 20 69 3c 28 70 49 74   for(i=1; i<(pIt
11990 65 72 2d 3e 6e 53 65 67 20 2f 20 32 29 3b 20 69  er->nSeg / 2); i
119a0 2b 3d 32 29 7b 0a 20 20 20 20 20 20 46 74 73 35  +=2){.      Fts5
119b0 53 65 67 49 74 65 72 20 2a 70 31 20 3d 20 26 70  SegIter *p1 = &p
119c0 49 74 65 72 2d 3e 61 53 65 67 5b 20 70 49 74 65  Iter->aSeg[ pIte
119d0 72 2d 3e 61 46 69 72 73 74 5b 69 2a 32 5d 2e 69  r->aFirst[i*2].i
119e0 46 69 72 73 74 20 5d 3b 0a 20 20 20 20 20 20 46  First ];.      F
119f0 74 73 35 53 65 67 49 74 65 72 20 2a 70 32 20 3d  ts5SegIter *p2 =
11a00 20 26 70 49 74 65 72 2d 3e 61 53 65 67 5b 20 70   &pIter->aSeg[ p
11a10 49 74 65 72 2d 3e 61 46 69 72 73 74 5b 69 2a 32  Iter->aFirst[i*2
11a20 2b 31 5d 2e 69 46 69 72 73 74 20 5d 3b 0a 20 20  +1].iFirst ];.  
11a30 20 20 20 20 46 74 73 35 43 52 65 73 75 6c 74 20      Fts5CResult 
11a40 2a 70 52 65 73 20 3d 20 26 70 49 74 65 72 2d 3e  *pRes = &pIter->
11a50 61 46 69 72 73 74 5b 69 5d 3b 0a 20 20 20 20 20  aFirst[i];.     
11a60 20 66 74 73 35 41 73 73 65 72 74 43 6f 6d 70 61   fts5AssertCompa
11a70 72 69 73 6f 6e 52 65 73 75 6c 74 28 70 49 74 65  risonResult(pIte
11a80 72 2c 20 70 31 2c 20 70 32 2c 20 70 52 65 73 29  r, p1, p2, pRes)
11a90 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65  ;.    }.  }.}.#e
11aa0 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 66 74 73  lse.# define fts
11ab0 35 41 73 73 65 72 74 4d 75 6c 74 69 49 74 65 72  5AssertMultiIter
11ac0 53 65 74 75 70 28 78 2c 79 29 0a 23 65 6e 64 69  Setup(x,y).#endi
11ad0 66 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20 74 68 65 20  f../*.** Do the 
11ae0 63 6f 6d 70 61 72 69 73 6f 6e 20 6e 65 63 65 73  comparison neces
11af0 73 61 72 79 20 74 6f 20 70 6f 70 75 6c 61 74 65  sary to populate
11b00 20 70 49 74 65 72 2d 3e 61 46 69 72 73 74 5b 69   pIter->aFirst[i
11b10 4f 75 74 5d 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  Out]..**.** If t
11b20 68 65 20 72 65 74 75 72 6e 65 64 20 76 61 6c 75  he returned valu
11b30 65 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74  e is non-zero, t
11b40 68 65 6e 20 69 74 20 69 73 20 74 68 65 20 69 6e  hen it is the in
11b50 64 65 78 20 6f 66 20 61 6e 20 65 6e 74 72 79 0a  dex of an entry.
11b60 2a 2a 20 69 6e 20 74 68 65 20 70 49 74 65 72 2d  ** in the pIter-
11b70 3e 61 53 65 67 5b 5d 20 61 72 72 61 79 20 74 68  >aSeg[] array th
11b80 61 74 20 69 73 20 28 61 29 20 6e 6f 74 20 61 74  at is (a) not at
11b90 20 45 4f 46 2c 20 61 6e 64 20 28 62 29 20 70 6f   EOF, and (b) po
11ba0 69 6e 74 69 6e 67 0a 2a 2a 20 74 6f 20 61 20 6b  inting.** to a k
11bb0 65 79 20 74 68 61 74 20 69 73 20 61 20 64 75 70  ey that is a dup
11bc0 6c 69 63 61 74 65 20 6f 66 20 61 6e 6f 74 68 65  licate of anothe
11bd0 72 2c 20 68 69 67 68 65 72 20 70 72 69 6f 72 69  r, higher priori
11be0 74 79 2c 20 0a 2a 2a 20 73 65 67 6d 65 6e 74 2d  ty, .** segment-
11bf0 69 74 65 72 61 74 6f 72 20 69 6e 20 74 68 65 20  iterator in the 
11c00 70 53 65 67 2d 3e 61 53 65 67 5b 5d 20 61 72 72  pSeg->aSeg[] arr
11c10 61 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ay..*/.static in
11c20 74 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 44  t fts5MultiIterD
11c30 6f 43 6f 6d 70 61 72 65 28 46 74 73 35 4d 75 6c  oCompare(Fts5Mul
11c40 74 69 53 65 67 49 74 65 72 20 2a 70 49 74 65 72  tiSegIter *pIter
11c50 2c 20 69 6e 74 20 69 4f 75 74 29 7b 0a 20 20 69  , int iOut){.  i
11c60 6e 74 20 69 31 3b 20 20 20 20 20 20 20 20 20 20  nt i1;          
11c70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
11c80 2a 20 49 6e 64 65 78 20 6f 66 20 6c 65 66 74 2d  * Index of left-
11c90 68 61 6e 64 20 46 74 73 35 53 65 67 49 74 65 72  hand Fts5SegIter
11ca0 20 2a 2f 0a 20 20 69 6e 74 20 69 32 3b 20 20 20   */.  int i2;   
11cb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11cc0 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f        /* Index o
11cd0 66 20 72 69 67 68 74 2d 68 61 6e 64 20 46 74 73  f right-hand Fts
11ce0 35 53 65 67 49 74 65 72 20 2a 2f 0a 20 20 69 6e  5SegIter */.  in
11cf0 74 20 69 52 65 73 3b 0a 20 20 46 74 73 35 53 65  t iRes;.  Fts5Se
11d00 67 49 74 65 72 20 2a 70 31 3b 20 20 20 20 20 20  gIter *p1;      
11d10 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 66            /* Lef
11d20 74 2d 68 61 6e 64 20 46 74 73 35 53 65 67 49 74  t-hand Fts5SegIt
11d30 65 72 20 2a 2f 0a 20 20 46 74 73 35 53 65 67 49  er */.  Fts5SegI
11d40 74 65 72 20 2a 70 32 3b 20 20 20 20 20 20 20 20  ter *p2;        
11d50 20 20 20 20 20 20 20 20 2f 2a 20 52 69 67 68 74          /* Right
11d60 2d 68 61 6e 64 20 46 74 73 35 53 65 67 49 74 65  -hand Fts5SegIte
11d70 72 20 2a 2f 0a 20 20 46 74 73 35 43 52 65 73 75  r */.  Fts5CResu
11d80 6c 74 20 2a 70 52 65 73 20 3d 20 26 70 49 74 65  lt *pRes = &pIte
11d90 72 2d 3e 61 46 69 72 73 74 5b 69 4f 75 74 5d 3b  r->aFirst[iOut];
11da0 0a 0a 20 20 61 73 73 65 72 74 28 20 69 4f 75 74  ..  assert( iOut
11db0 3c 70 49 74 65 72 2d 3e 6e 53 65 67 20 26 26 20  <pIter->nSeg && 
11dc0 69 4f 75 74 3e 30 20 29 3b 0a 20 20 61 73 73 65  iOut>0 );.  asse
11dd0 72 74 28 20 70 49 74 65 72 2d 3e 62 52 65 76 3d  rt( pIter->bRev=
11de0 3d 30 20 7c 7c 20 70 49 74 65 72 2d 3e 62 52 65  =0 || pIter->bRe
11df0 76 3d 3d 31 20 29 3b 0a 0a 20 20 69 66 28 20 69  v==1 );..  if( i
11e00 4f 75 74 3e 3d 28 70 49 74 65 72 2d 3e 6e 53 65  Out>=(pIter->nSe
11e10 67 2f 32 29 20 29 7b 0a 20 20 20 20 69 31 20 3d  g/2) ){.    i1 =
11e20 20 28 69 4f 75 74 20 2d 20 70 49 74 65 72 2d 3e   (iOut - pIter->
11e30 6e 53 65 67 2f 32 29 20 2a 20 32 3b 0a 20 20 20  nSeg/2) * 2;.   
11e40 20 69 32 20 3d 20 69 31 20 2b 20 31 3b 0a 20 20   i2 = i1 + 1;.  
11e50 7d 65 6c 73 65 7b 0a 20 20 20 20 69 31 20 3d 20  }else{.    i1 = 
11e60 70 49 74 65 72 2d 3e 61 46 69 72 73 74 5b 69 4f  pIter->aFirst[iO
11e70 75 74 2a 32 5d 2e 69 46 69 72 73 74 3b 0a 20 20  ut*2].iFirst;.  
11e80 20 20 69 32 20 3d 20 70 49 74 65 72 2d 3e 61 46    i2 = pIter->aF
11e90 69 72 73 74 5b 69 4f 75 74 2a 32 2b 31 5d 2e 69  irst[iOut*2+1].i
11ea0 46 69 72 73 74 3b 0a 20 20 7d 0a 20 20 70 31 20  First;.  }.  p1 
11eb0 3d 20 26 70 49 74 65 72 2d 3e 61 53 65 67 5b 69  = &pIter->aSeg[i
11ec0 31 5d 3b 0a 20 20 70 32 20 3d 20 26 70 49 74 65  1];.  p2 = &pIte
11ed0 72 2d 3e 61 53 65 67 5b 69 32 5d 3b 0a 0a 20 20  r->aSeg[i2];..  
11ee0 70 52 65 73 2d 3e 62 54 65 72 6d 45 71 20 3d 20  pRes->bTermEq = 
11ef0 30 3b 0a 20 20 69 66 28 20 70 31 2d 3e 70 4c 65  0;.  if( p1->pLe
11f00 61 66 3d 3d 30 20 29 7b 20 20 20 20 20 20 20 20  af==0 ){        
11f10 20 20 20 2f 2a 20 49 66 20 70 31 20 69 73 20 61     /* If p1 is a
11f20 74 20 45 4f 46 20 2a 2f 0a 20 20 20 20 69 52 65  t EOF */.    iRe
11f30 73 20 3d 20 69 32 3b 0a 20 20 7d 65 6c 73 65 20  s = i2;.  }else 
11f40 69 66 28 20 70 32 2d 3e 70 4c 65 61 66 3d 3d 30  if( p2->pLeaf==0
11f50 20 29 7b 20 20 20 20 20 2f 2a 20 49 66 20 70 32   ){     /* If p2
11f60 20 69 73 20 61 74 20 45 4f 46 20 2a 2f 0a 20 20   is at EOF */.  
11f70 20 20 69 52 65 73 20 3d 20 69 31 3b 0a 20 20 7d    iRes = i1;.  }
11f80 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 72 65  else{.    int re
11f90 73 20 3d 20 66 74 73 35 42 75 66 66 65 72 43 6f  s = fts5BufferCo
11fa0 6d 70 61 72 65 28 26 70 31 2d 3e 74 65 72 6d 2c  mpare(&p1->term,
11fb0 20 26 70 32 2d 3e 74 65 72 6d 29 3b 0a 20 20 20   &p2->term);.   
11fc0 20 69 66 28 20 72 65 73 3d 3d 30 20 29 7b 0a 20   if( res==0 ){. 
11fd0 20 20 20 20 20 61 73 73 65 72 74 28 20 69 32 3e       assert( i2>
11fe0 69 31 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  i1 );.      asse
11ff0 72 74 28 20 69 32 21 3d 30 20 29 3b 0a 20 20 20  rt( i2!=0 );.   
12000 20 20 20 70 52 65 73 2d 3e 62 54 65 72 6d 45 71     pRes->bTermEq
12010 20 3d 20 31 3b 0a 20 20 20 20 20 20 69 66 28 20   = 1;.      if( 
12020 70 31 2d 3e 69 52 6f 77 69 64 3d 3d 70 32 2d 3e  p1->iRowid==p2->
12030 69 52 6f 77 69 64 20 29 7b 0a 20 20 20 20 20 20  iRowid ){.      
12040 20 20 70 31 2d 3e 62 44 65 6c 20 3d 20 70 32 2d    p1->bDel = p2-
12050 3e 62 44 65 6c 3b 0a 20 20 20 20 20 20 20 20 72  >bDel;.        r
12060 65 74 75 72 6e 20 69 32 3b 0a 20 20 20 20 20 20  eturn i2;.      
12070 7d 0a 20 20 20 20 20 20 72 65 73 20 3d 20 28 28  }.      res = ((
12080 70 31 2d 3e 69 52 6f 77 69 64 20 3e 20 70 32 2d  p1->iRowid > p2-
12090 3e 69 52 6f 77 69 64 29 3d 3d 70 49 74 65 72 2d  >iRowid)==pIter-
120a0 3e 62 52 65 76 29 20 3f 20 2d 31 20 3a 20 2b 31  >bRev) ? -1 : +1
120b0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  ;.    }.    asse
120c0 72 74 28 20 72 65 73 21 3d 30 20 29 3b 0a 20 20  rt( res!=0 );.  
120d0 20 20 69 66 28 20 72 65 73 3c 30 20 29 7b 0a 20    if( res<0 ){. 
120e0 20 20 20 20 20 69 52 65 73 20 3d 20 69 31 3b 0a       iRes = i1;.
120f0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
12100 20 69 52 65 73 20 3d 20 69 32 3b 0a 20 20 20 20   iRes = i2;.    
12110 7d 0a 20 20 7d 0a 0a 20 20 70 52 65 73 2d 3e 69  }.  }..  pRes->i
12120 46 69 72 73 74 20 3d 20 69 52 65 73 3b 0a 20 20  First = iRes;.  
12130 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
12140 2a 2a 20 4d 6f 76 65 20 74 68 65 20 73 65 67 2d  ** Move the seg-
12150 69 74 65 72 20 73 6f 20 74 68 61 74 20 69 74 20  iter so that it 
12160 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 66 69  points to the fi
12170 72 73 74 20 72 6f 77 69 64 20 6f 6e 20 70 61 67  rst rowid on pag
12180 65 20 69 4c 65 61 66 50 67 6e 6f 2e 0a 2a 2a 20  e iLeafPgno..** 
12190 49 74 20 69 73 20 61 6e 20 65 72 72 6f 72 20 69  It is an error i
121a0 66 20 6c 65 61 66 20 69 4c 65 61 66 50 67 6e 6f  f leaf iLeafPgno
121b0 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 20   does not exist 
121c0 6f 72 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 72  or contains no r
121d0 6f 77 69 64 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  owids..*/.static
121e0 20 76 6f 69 64 20 66 74 73 35 53 65 67 49 74 65   void fts5SegIte
121f0 72 47 6f 74 6f 50 61 67 65 28 0a 20 20 46 74 73  rGotoPage(.  Fts
12200 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20  5Index *p,      
12210 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
12220 46 54 53 35 20 62 61 63 6b 65 6e 64 20 6f 62 6a  FTS5 backend obj
12230 65 63 74 20 2a 2f 0a 20 20 46 74 73 35 53 65 67  ect */.  Fts5Seg
12240 49 74 65 72 20 2a 70 49 74 65 72 2c 20 20 20 20  Iter *pIter,    
12250 20 20 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72           /* Iter
12260 61 74 6f 72 20 74 6f 20 61 64 76 61 6e 63 65 20  ator to advance 
12270 2a 2f 0a 20 20 69 6e 74 20 69 4c 65 61 66 50 67  */.  int iLeafPg
12280 6e 6f 0a 29 7b 0a 20 20 61 73 73 65 72 74 28 20  no.){.  assert( 
12290 69 4c 65 61 66 50 67 6e 6f 3e 70 49 74 65 72 2d  iLeafPgno>pIter-
122a0 3e 69 4c 65 61 66 50 67 6e 6f 20 29 3b 0a 0a 20  >iLeafPgno );.. 
122b0 20 69 66 28 20 69 4c 65 61 66 50 67 6e 6f 3e 70   if( iLeafPgno>p
122c0 49 74 65 72 2d 3e 70 53 65 67 2d 3e 70 67 6e 6f  Iter->pSeg->pgno
122d0 4c 61 73 74 20 29 7b 0a 20 20 20 20 70 2d 3e 72  Last ){.    p->r
122e0 63 20 3d 20 46 54 53 35 5f 43 4f 52 52 55 50 54  c = FTS5_CORRUPT
122f0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66  ;.  }else{.    f
12300 74 73 35 44 61 74 61 52 65 6c 65 61 73 65 28 70  ts5DataRelease(p
12310 49 74 65 72 2d 3e 70 4e 65 78 74 4c 65 61 66 29  Iter->pNextLeaf)
12320 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 70 4e 65  ;.    pIter->pNe
12330 78 74 4c 65 61 66 20 3d 20 30 3b 0a 20 20 20 20  xtLeaf = 0;.    
12340 70 49 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f  pIter->iLeafPgno
12350 20 3d 20 69 4c 65 61 66 50 67 6e 6f 2d 31 3b 0a   = iLeafPgno-1;.
12360 20 20 20 20 66 74 73 35 53 65 67 49 74 65 72 4e      fts5SegIterN
12370 65 78 74 50 61 67 65 28 70 2c 20 70 49 74 65 72  extPage(p, pIter
12380 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
12390 2d 3e 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc!=SQLITE_OK 
123a0 7c 7c 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 50  || pIter->iLeafP
123b0 67 6e 6f 3d 3d 69 4c 65 61 66 50 67 6e 6f 20 29  gno==iLeafPgno )
123c0 3b 0a 0a 20 20 20 20 69 66 28 20 70 2d 3e 72 63  ;..    if( p->rc
123d0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
123e0 20 20 20 20 20 69 6e 74 20 69 4f 66 66 3b 0a 20       int iOff;. 
123f0 20 20 20 20 20 75 38 20 2a 61 20 3d 20 70 49 74       u8 *a = pIt
12400 65 72 2d 3e 70 4c 65 61 66 2d 3e 70 3b 0a 20 20  er->pLeaf->p;.  
12410 20 20 20 20 69 6e 74 20 6e 20 3d 20 70 49 74 65      int n = pIte
12420 72 2d 3e 70 4c 65 61 66 2d 3e 6e 3b 0a 0a 20 20  r->pLeaf->n;..  
12430 20 20 20 20 69 4f 66 66 20 3d 20 66 74 73 35 47      iOff = fts5G
12440 65 74 55 31 36 28 26 61 5b 30 5d 29 3b 0a 20 20  etU16(&a[0]);.  
12450 20 20 20 20 69 66 28 20 69 4f 66 66 3c 34 20 7c      if( iOff<4 |
12460 7c 20 69 4f 66 66 3e 3d 6e 20 29 7b 0a 20 20 20  | iOff>=n ){.   
12470 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 46 54 53       p->rc = FTS
12480 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20 20 20  5_CORRUPT;.     
12490 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
124a0 69 4f 66 66 20 2b 3d 20 66 74 73 35 47 65 74 56  iOff += fts5GetV
124b0 61 72 69 6e 74 28 26 61 5b 69 4f 66 66 5d 2c 20  arint(&a[iOff], 
124c0 28 75 36 34 2a 29 26 70 49 74 65 72 2d 3e 69 52  (u64*)&pIter->iR
124d0 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 20 20 70  owid);.        p
124e0 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65  Iter->iLeafOffse
124f0 74 20 3d 20 69 4f 66 66 3b 0a 20 20 20 20 20 20  t = iOff;.      
12500 20 20 66 74 73 35 53 65 67 49 74 65 72 4c 6f 61    fts5SegIterLoa
12510 64 4e 50 6f 73 28 70 2c 20 70 49 74 65 72 29 3b  dNPos(p, pIter);
12520 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
12530 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 76 61   }.}../*.** Adva
12540 6e 63 65 20 74 68 65 20 69 74 65 72 61 74 6f 72  nce the iterator
12550 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73   passed as the s
12560 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 75  econd argument u
12570 6e 74 69 6c 20 69 74 20 69 73 20 61 74 20 6f 72  ntil it is at or
12580 20 0a 2a 2a 20 70 61 73 74 20 72 6f 77 69 64 20   .** past rowid 
12590 69 46 72 6f 6d 2e 20 52 65 67 61 72 64 6c 65 73  iFrom. Regardles
125a0 73 20 6f 66 20 74 68 65 20 76 61 6c 75 65 20 6f  s of the value o
125b0 66 20 69 46 72 6f 6d 2c 20 74 68 65 20 69 74 65  f iFrom, the ite
125c0 72 61 74 6f 72 20 69 73 0a 2a 2a 20 61 6c 77 61  rator is.** alwa
125d0 79 73 20 61 64 76 61 6e 63 65 64 20 61 74 20 6c  ys advanced at l
125e0 65 61 73 74 20 6f 6e 63 65 2e 0a 2a 2f 0a 73 74  east once..*/.st
125f0 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 53 65  atic void fts5Se
12600 67 49 74 65 72 4e 65 78 74 46 72 6f 6d 28 0a 20  gIterNextFrom(. 
12610 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 20   Fts5Index *p,  
12620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12630 20 2f 2a 20 46 54 53 35 20 62 61 63 6b 65 6e 64   /* FTS5 backend
12640 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 46 74 73   object */.  Fts
12650 35 53 65 67 49 74 65 72 20 2a 70 49 74 65 72 2c  5SegIter *pIter,
12660 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
12670 49 74 65 72 61 74 6f 72 20 74 6f 20 61 64 76 61  Iterator to adva
12680 6e 63 65 20 2a 2f 0a 20 20 69 36 34 20 69 4d 61  nce */.  i64 iMa
12690 74 63 68 20 20 20 20 20 20 20 20 20 20 20 20 20  tch             
126a0 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 76 61           /* Adva
126b0 6e 63 65 20 69 74 65 72 61 74 6f 72 20 61 74 20  nce iterator at 
126c0 6c 65 61 73 74 20 74 68 69 73 20 66 61 72 20 2a  least this far *
126d0 2f 0a 29 7b 0a 20 20 69 6e 74 20 62 52 65 76 20  /.){.  int bRev 
126e0 3d 20 28 70 49 74 65 72 2d 3e 66 6c 61 67 73 20  = (pIter->flags 
126f0 26 20 46 54 53 35 5f 53 45 47 49 54 45 52 5f 52  & FTS5_SEGITER_R
12700 45 56 45 52 53 45 29 3b 0a 20 20 46 74 73 35 44  EVERSE);.  Fts5D
12710 6c 69 64 78 49 74 65 72 20 2a 70 44 6c 69 64 78  lidxIter *pDlidx
12720 20 3d 20 70 49 74 65 72 2d 3e 70 44 6c 69 64 78   = pIter->pDlidx
12730 3b 0a 20 20 69 6e 74 20 69 4c 65 61 66 50 67 6e  ;.  int iLeafPgn
12740 6f 20 3d 20 70 49 74 65 72 2d 3e 69 4c 65 61 66  o = pIter->iLeaf
12750 50 67 6e 6f 3b 0a 20 20 69 6e 74 20 62 4d 6f 76  Pgno;.  int bMov
12760 65 20 3d 20 31 3b 0a 0a 20 20 61 73 73 65 72 74  e = 1;..  assert
12770 28 20 70 49 74 65 72 2d 3e 66 6c 61 67 73 20 26  ( pIter->flags &
12780 20 46 54 53 35 5f 53 45 47 49 54 45 52 5f 4f 4e   FTS5_SEGITER_ON
12790 45 54 45 52 4d 20 29 3b 0a 20 20 61 73 73 65 72  ETERM );.  asser
127a0 74 28 20 70 49 74 65 72 2d 3e 70 44 6c 69 64 78  t( pIter->pDlidx
127b0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 49   );.  assert( pI
127c0 74 65 72 2d 3e 70 4c 65 61 66 20 29 3b 0a 0a 20  ter->pLeaf );.. 
127d0 20 69 66 28 20 62 52 65 76 3d 3d 30 20 29 7b 0a   if( bRev==0 ){.
127e0 20 20 20 20 77 68 69 6c 65 28 20 21 66 74 73 35      while( !fts5
127f0 44 6c 69 64 78 49 74 65 72 45 6f 66 28 70 2c 20  DlidxIterEof(p, 
12800 70 44 6c 69 64 78 29 20 26 26 20 69 4d 61 74 63  pDlidx) && iMatc
12810 68 3e 66 74 73 35 44 6c 69 64 78 49 74 65 72 52  h>fts5DlidxIterR
12820 6f 77 69 64 28 70 44 6c 69 64 78 29 20 29 7b 0a  owid(pDlidx) ){.
12830 20 20 20 20 20 20 69 4c 65 61 66 50 67 6e 6f 20        iLeafPgno 
12840 3d 20 66 74 73 35 44 6c 69 64 78 49 74 65 72 50  = fts5DlidxIterP
12850 67 6e 6f 28 70 44 6c 69 64 78 29 3b 0a 20 20 20  gno(pDlidx);.   
12860 20 20 20 66 74 73 35 44 6c 69 64 78 49 74 65 72     fts5DlidxIter
12870 4e 65 78 74 28 70 2c 20 70 44 6c 69 64 78 29 3b  Next(p, pDlidx);
12880 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72  .    }.    asser
12890 74 5f 6e 63 28 20 69 4c 65 61 66 50 67 6e 6f 3e  t_nc( iLeafPgno>
128a0 3d 70 49 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e  =pIter->iLeafPgn
128b0 6f 20 7c 7c 20 70 2d 3e 72 63 20 29 3b 0a 20 20  o || p->rc );.  
128c0 20 20 69 66 28 20 69 4c 65 61 66 50 67 6e 6f 3e    if( iLeafPgno>
128d0 70 49 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f  pIter->iLeafPgno
128e0 20 29 7b 0a 20 20 20 20 20 20 66 74 73 35 53 65   ){.      fts5Se
128f0 67 49 74 65 72 47 6f 74 6f 50 61 67 65 28 70 2c  gIterGotoPage(p,
12900 20 70 49 74 65 72 2c 20 69 4c 65 61 66 50 67 6e   pIter, iLeafPgn
12910 6f 29 3b 0a 20 20 20 20 20 20 62 4d 6f 76 65 20  o);.      bMove 
12920 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  = 0;.    }.  }el
12930 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20  se{.    assert( 
12940 70 49 74 65 72 2d 3e 70 4e 65 78 74 4c 65 61 66  pIter->pNextLeaf
12950 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ==0 );.    asser
12960 74 28 20 69 4d 61 74 63 68 3c 70 49 74 65 72 2d  t( iMatch<pIter-
12970 3e 69 52 6f 77 69 64 20 29 3b 0a 20 20 20 20 77  >iRowid );.    w
12980 68 69 6c 65 28 20 21 66 74 73 35 44 6c 69 64 78  hile( !fts5Dlidx
12990 49 74 65 72 45 6f 66 28 70 2c 20 70 44 6c 69 64  IterEof(p, pDlid
129a0 78 29 20 26 26 20 69 4d 61 74 63 68 3c 66 74 73  x) && iMatch<fts
129b0 35 44 6c 69 64 78 49 74 65 72 52 6f 77 69 64 28  5DlidxIterRowid(
129c0 70 44 6c 69 64 78 29 20 29 7b 0a 20 20 20 20 20  pDlidx) ){.     
129d0 20 66 74 73 35 44 6c 69 64 78 49 74 65 72 50 72   fts5DlidxIterPr
129e0 65 76 28 70 2c 20 70 44 6c 69 64 78 29 3b 0a 20  ev(p, pDlidx);. 
129f0 20 20 20 7d 0a 20 20 20 20 69 4c 65 61 66 50 67     }.    iLeafPg
12a00 6e 6f 20 3d 20 66 74 73 35 44 6c 69 64 78 49 74  no = fts5DlidxIt
12a10 65 72 50 67 6e 6f 28 70 44 6c 69 64 78 29 3b 0a  erPgno(pDlidx);.
12a20 0a 20 20 20 20 61 73 73 65 72 74 28 20 66 74 73  .    assert( fts
12a30 35 44 6c 69 64 78 49 74 65 72 45 6f 66 28 70 2c  5DlidxIterEof(p,
12a40 20 70 44 6c 69 64 78 29 20 7c 7c 20 69 4c 65 61   pDlidx) || iLea
12a50 66 50 67 6e 6f 3c 3d 70 49 74 65 72 2d 3e 69 4c  fPgno<=pIter->iL
12a60 65 61 66 50 67 6e 6f 20 29 3b 0a 0a 20 20 20 20  eafPgno );..    
12a70 69 66 28 20 69 4c 65 61 66 50 67 6e 6f 3c 70 49  if( iLeafPgno<pI
12a80 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 20 29  ter->iLeafPgno )
12a90 7b 0a 20 20 20 20 20 20 70 49 74 65 72 2d 3e 69  {.      pIter->i
12aa0 4c 65 61 66 50 67 6e 6f 20 3d 20 69 4c 65 61 66  LeafPgno = iLeaf
12ab0 50 67 6e 6f 2b 31 3b 0a 20 20 20 20 20 20 66 74  Pgno+1;.      ft
12ac0 73 35 53 65 67 49 74 65 72 52 65 76 65 72 73 65  s5SegIterReverse
12ad0 4e 65 77 50 61 67 65 28 70 2c 20 70 49 74 65 72  NewPage(p, pIter
12ae0 29 3b 0a 20 20 20 20 20 20 62 4d 6f 76 65 20 3d  );.      bMove =
12af0 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20   0;.    }.  }.. 
12b00 20 77 68 69 6c 65 28 20 70 2d 3e 72 63 3d 3d 53   while( p->rc==S
12b10 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
12b20 69 66 28 20 62 4d 6f 76 65 20 29 20 66 74 73 35  if( bMove ) fts5
12b30 53 65 67 49 74 65 72 4e 65 78 74 28 70 2c 20 70  SegIterNext(p, p
12b40 49 74 65 72 2c 20 30 29 3b 0a 20 20 20 20 69 66  Iter, 0);.    if
12b50 28 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 3d 3d  ( pIter->pLeaf==
12b60 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 69  0 ) break;.    i
12b70 66 28 20 62 52 65 76 3d 3d 30 20 26 26 20 70 49  f( bRev==0 && pI
12b80 74 65 72 2d 3e 69 52 6f 77 69 64 3e 3d 69 4d 61  ter->iRowid>=iMa
12b90 74 63 68 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  tch ) break;.   
12ba0 20 69 66 28 20 62 52 65 76 21 3d 30 20 26 26 20   if( bRev!=0 && 
12bb0 70 49 74 65 72 2d 3e 69 52 6f 77 69 64 3c 3d 69  pIter->iRowid<=i
12bc0 4d 61 74 63 68 20 29 20 62 72 65 61 6b 3b 0a 20  Match ) break;. 
12bd0 20 20 20 62 4d 6f 76 65 20 3d 20 31 3b 0a 20 20     bMove = 1;.  
12be0 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65  }.}.../*.** Free
12bf0 20 74 68 65 20 69 74 65 72 61 74 6f 72 20 6f 62   the iterator ob
12c00 6a 65 63 74 20 70 61 73 73 65 64 20 61 73 20 74  ject passed as t
12c10 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
12c20 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  nt..*/.static vo
12c30 69 64 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72  id fts5MultiIter
12c40 46 72 65 65 28 46 74 73 35 49 6e 64 65 78 20 2a  Free(Fts5Index *
12c50 70 2c 20 46 74 73 35 4d 75 6c 74 69 53 65 67 49  p, Fts5MultiSegI
12c60 74 65 72 20 2a 70 49 74 65 72 29 7b 0a 20 20 69  ter *pIter){.  i
12c70 66 28 20 70 49 74 65 72 20 29 7b 0a 20 20 20 20  f( pIter ){.    
12c80 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69  int i;.    for(i
12c90 3d 30 3b 20 69 3c 70 49 74 65 72 2d 3e 6e 53 65  =0; i<pIter->nSe
12ca0 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 66  g; i++){.      f
12cb0 74 73 35 53 65 67 49 74 65 72 43 6c 65 61 72 28  ts5SegIterClear(
12cc0 26 70 49 74 65 72 2d 3e 61 53 65 67 5b 69 5d 29  &pIter->aSeg[i])
12cd0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
12ce0 74 65 33 5f 66 72 65 65 28 70 49 74 65 72 29 3b  te3_free(pIter);
12cf0 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 76  .  }.}..static v
12d00 6f 69 64 20 66 74 73 35 4d 75 6c 74 69 49 74 65  oid fts5MultiIte
12d10 72 41 64 76 61 6e 63 65 64 28 0a 20 20 46 74 73  rAdvanced(.  Fts
12d20 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20  5Index *p,      
12d30 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
12d40 46 54 53 35 20 62 61 63 6b 65 6e 64 20 74 6f 20  FTS5 backend to 
12d50 69 74 65 72 61 74 65 20 77 69 74 68 69 6e 20 2a  iterate within *
12d60 2f 0a 20 20 46 74 73 35 4d 75 6c 74 69 53 65 67  /.  Fts5MultiSeg
12d70 49 74 65 72 20 2a 70 49 74 65 72 2c 20 20 20 20  Iter *pIter,    
12d80 20 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20      /* Iterator 
12d90 74 6f 20 75 70 64 61 74 65 20 61 46 69 72 73 74  to update aFirst
12da0 5b 5d 20 61 72 72 61 79 20 66 6f 72 20 2a 2f 0a  [] array for */.
12db0 20 20 69 6e 74 20 69 43 68 61 6e 67 65 64 2c 20    int iChanged, 
12dc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12dd0 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 73 75    /* Index of su
12de0 62 2d 69 74 65 72 61 74 6f 72 20 6a 75 73 74 20  b-iterator just 
12df0 61 64 76 61 6e 63 65 64 20 2a 2f 0a 20 20 69 6e  advanced */.  in
12e00 74 20 69 4d 69 6e 73 65 74 20 20 20 20 20 20 20  t iMinset       
12e10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
12e20 20 4d 69 6e 69 6d 75 6d 20 65 6e 74 72 79 20 69   Minimum entry i
12e30 6e 20 61 46 69 72 73 74 5b 5d 20 74 6f 20 73 65  n aFirst[] to se
12e40 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b  t */.){.  int i;
12e50 0a 20 20 66 6f 72 28 69 3d 28 70 49 74 65 72 2d  .  for(i=(pIter-
12e60 3e 6e 53 65 67 2b 69 43 68 61 6e 67 65 64 29 2f  >nSeg+iChanged)/
12e70 32 3b 20 69 3e 3d 69 4d 69 6e 73 65 74 20 26 26  2; i>=iMinset &&
12e80 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
12e90 4b 3b 20 69 3d 69 2f 32 29 7b 0a 20 20 20 20 69  K; i=i/2){.    i
12ea0 6e 74 20 69 45 71 3b 0a 20 20 20 20 69 66 28 20  nt iEq;.    if( 
12eb0 28 69 45 71 20 3d 20 66 74 73 35 4d 75 6c 74 69  (iEq = fts5Multi
12ec0 49 74 65 72 44 6f 43 6f 6d 70 61 72 65 28 70 49  IterDoCompare(pI
12ed0 74 65 72 2c 20 69 29 29 20 29 7b 0a 20 20 20 20  ter, i)) ){.    
12ee0 20 20 66 74 73 35 53 65 67 49 74 65 72 4e 65 78    fts5SegIterNex
12ef0 74 28 70 2c 20 26 70 49 74 65 72 2d 3e 61 53 65  t(p, &pIter->aSe
12f00 67 5b 69 45 71 5d 2c 20 30 29 3b 0a 20 20 20 20  g[iEq], 0);.    
12f10 20 20 69 20 3d 20 70 49 74 65 72 2d 3e 6e 53 65    i = pIter->nSe
12f20 67 20 2b 20 69 45 71 3b 0a 20 20 20 20 7d 0a 20  g + iEq;.    }. 
12f30 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 75 62 2d   }.}../*.** Sub-
12f40 69 74 65 72 61 74 6f 72 20 69 43 68 61 6e 67 65  iterator iChange
12f50 64 20 6f 66 20 69 74 65 72 61 74 6f 72 20 70 49  d of iterator pI
12f60 74 65 72 20 68 61 73 20 6a 75 73 74 20 62 65 65  ter has just bee
12f70 6e 20 61 64 76 61 6e 63 65 64 2e 20 49 74 20 73  n advanced. It s
12f80 74 69 6c 6c 0a 2a 2a 20 70 6f 69 6e 74 73 20 74  till.** points t
12f90 6f 20 74 68 65 20 73 61 6d 65 20 74 65 72 6d 20  o the same term 
12fa0 74 68 6f 75 67 68 20 2d 20 6a 75 73 74 20 61 20  though - just a 
12fb0 64 69 66 66 65 72 65 6e 74 20 72 6f 77 69 64 2e  different rowid.
12fc0 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a   This function.*
12fd0 2a 20 61 74 74 65 6d 70 74 73 20 74 6f 20 75 70  * attempts to up
12fe0 64 61 74 65 20 74 68 65 20 63 6f 6e 74 65 6e 74  date the content
12ff0 73 20 6f 66 20 74 68 65 20 70 49 74 65 72 2d 3e  s of the pIter->
13000 61 46 69 72 73 74 5b 5d 20 61 63 63 6f 72 64 69  aFirst[] accordi
13010 6e 67 6c 79 2e 0a 2a 2a 20 49 66 20 69 74 20 64  ngly..** If it d
13020 6f 65 73 20 73 6f 20 73 75 63 63 65 73 73 66 75  oes so successfu
13030 6c 6c 79 2c 20 30 20 69 73 20 72 65 74 75 72 6e  lly, 0 is return
13040 65 64 2e 20 4f 74 68 65 72 77 69 73 65 20 31 2e  ed. Otherwise 1.
13050 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 6e 2d 7a 65  .**.** If non-ze
13060 72 6f 20 69 73 20 72 65 74 75 72 6e 65 64 2c 20  ro is returned, 
13070 74 68 65 20 63 61 6c 6c 65 72 20 73 68 6f 75 6c  the caller shoul
13080 64 20 63 61 6c 6c 20 66 74 73 35 4d 75 6c 74 69  d call fts5Multi
13090 49 74 65 72 41 64 76 61 6e 63 65 64 28 29 0a 2a  IterAdvanced().*
130a0 2a 20 6f 6e 20 74 68 65 20 69 74 65 72 61 74 6f  * on the iterato
130b0 72 20 69 6e 73 74 65 61 64 2e 20 54 68 61 74 20  r instead. That 
130c0 66 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20 74 68  function does th
130d0 65 20 73 61 6d 65 20 61 73 20 74 68 69 73 20 6f  e same as this o
130e0 6e 65 2c 20 65 78 63 65 70 74 0a 2a 2a 20 74 68  ne, except.** th
130f0 61 74 20 69 74 20 64 65 61 6c 73 20 77 69 74 68  at it deals with
13100 20 6d 6f 72 65 20 63 6f 6d 70 6c 69 63 61 74 65   more complicate
13110 64 20 63 61 73 65 73 20 61 73 20 77 65 6c 6c 2e  d cases as well.
13120 0a 2a 2f 20 0a 73 74 61 74 69 63 20 69 6e 74 20  .*/ .static int 
13130 66 74 73 35 4d 75 6c 74 69 49 74 65 72 41 64 76  fts5MultiIterAdv
13140 61 6e 63 65 52 6f 77 69 64 28 0a 20 20 46 74 73  anceRowid(.  Fts
13150 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20  5Index *p,      
13160 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
13170 46 54 53 35 20 62 61 63 6b 65 6e 64 20 74 6f 20  FTS5 backend to 
13180 69 74 65 72 61 74 65 20 77 69 74 68 69 6e 20 2a  iterate within *
13190 2f 0a 20 20 46 74 73 35 4d 75 6c 74 69 53 65 67  /.  Fts5MultiSeg
131a0 49 74 65 72 20 2a 70 49 74 65 72 2c 20 20 20 20  Iter *pIter,    
131b0 20 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20      /* Iterator 
131c0 74 6f 20 75 70 64 61 74 65 20 61 46 69 72 73 74  to update aFirst
131d0 5b 5d 20 61 72 72 61 79 20 66 6f 72 20 2a 2f 0a  [] array for */.
131e0 20 20 69 6e 74 20 69 43 68 61 6e 67 65 64 20 20    int iChanged  
131f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13200 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 73 75    /* Index of su
13210 62 2d 69 74 65 72 61 74 6f 72 20 6a 75 73 74 20  b-iterator just 
13220 61 64 76 61 6e 63 65 64 20 2a 2f 0a 29 7b 0a 20  advanced */.){. 
13230 20 69 6e 74 20 69 3b 0a 20 20 46 74 73 35 53 65   int i;.  Fts5Se
13240 67 49 74 65 72 20 2a 70 4e 65 77 20 3d 20 26 70  gIter *pNew = &p
13250 49 74 65 72 2d 3e 61 53 65 67 5b 69 43 68 61 6e  Iter->aSeg[iChan
13260 67 65 64 5d 3b 0a 20 20 46 74 73 35 53 65 67 49  ged];.  Fts5SegI
13270 74 65 72 20 2a 70 4f 74 68 65 72 20 3d 20 26 70  ter *pOther = &p
13280 49 74 65 72 2d 3e 61 53 65 67 5b 69 43 68 61 6e  Iter->aSeg[iChan
13290 67 65 64 20 5e 20 30 78 30 30 30 31 5d 3b 0a 0a  ged ^ 0x0001];..
132a0 20 20 66 6f 72 28 69 3d 28 70 49 74 65 72 2d 3e    for(i=(pIter->
132b0 6e 53 65 67 2b 69 43 68 61 6e 67 65 64 29 2f 32  nSeg+iChanged)/2
132c0 3b 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ; p->rc==SQLITE_
132d0 4f 4b 3b 20 69 3d 69 2f 32 29 7b 0a 20 20 20 20  OK; i=i/2){.    
132e0 46 74 73 35 43 52 65 73 75 6c 74 20 2a 70 52 65  Fts5CResult *pRe
132f0 73 20 3d 20 26 70 49 74 65 72 2d 3e 61 46 69 72  s = &pIter->aFir
13300 73 74 5b 69 5d 3b 0a 0a 20 20 20 20 61 73 73 65  st[i];..    asse
13310 72 74 28 20 70 4e 65 77 2d 3e 70 4c 65 61 66 20  rt( pNew->pLeaf 
13320 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
13330 52 65 73 2d 3e 62 54 65 72 6d 45 71 3d 3d 30 20  Res->bTermEq==0 
13340 7c 7c 20 70 4f 74 68 65 72 2d 3e 70 4c 65 61 66  || pOther->pLeaf
13350 20 29 3b 0a 20 20 20 20 0a 20 20 20 20 69 66 28   );.    .    if(
13360 20 70 52 65 73 2d 3e 62 54 65 72 6d 45 71 20 29   pRes->bTermEq )
13370 7b 0a 20 20 20 20 20 20 69 66 28 20 70 4e 65 77  {.      if( pNew
13380 2d 3e 69 52 6f 77 69 64 3d 3d 70 4f 74 68 65 72  ->iRowid==pOther
13390 2d 3e 69 52 6f 77 69 64 20 29 7b 0a 20 20 20 20  ->iRowid ){.    
133a0 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
133b0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28 70      }else if( (p
133c0 4f 74 68 65 72 2d 3e 69 52 6f 77 69 64 3e 70 4e  Other->iRowid>pN
133d0 65 77 2d 3e 69 52 6f 77 69 64 29 3d 3d 70 49 74  ew->iRowid)==pIt
133e0 65 72 2d 3e 62 52 65 76 20 29 7b 0a 20 20 20 20  er->bRev ){.    
133f0 20 20 20 20 70 4e 65 77 20 3d 20 70 4f 74 68 65      pNew = pOthe
13400 72 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  r;.      }.    }
13410 0a 20 20 20 20 70 52 65 73 2d 3e 69 46 69 72 73  .    pRes->iFirs
13420 74 20 3d 20 28 70 4e 65 77 20 2d 20 70 49 74 65  t = (pNew - pIte
13430 72 2d 3e 61 53 65 67 29 3b 0a 20 20 20 20 69 66  r->aSeg);.    if
13440 28 20 69 3d 3d 31 20 29 20 62 72 65 61 6b 3b 0a  ( i==1 ) break;.
13450 0a 20 20 20 20 70 4f 74 68 65 72 20 3d 20 26 70  .    pOther = &p
13460 49 74 65 72 2d 3e 61 53 65 67 5b 20 70 49 74 65  Iter->aSeg[ pIte
13470 72 2d 3e 61 46 69 72 73 74 5b 69 20 5e 20 30 78  r->aFirst[i ^ 0x
13480 30 30 30 31 5d 2e 69 46 69 72 73 74 20 5d 3b 0a  0001].iFirst ];.
13490 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 30 3b    }..  return 0;
134a0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68  .}../*.** Set th
134b0 65 20 70 49 74 65 72 2d 3e 62 45 6f 66 20 76 61  e pIter->bEof va
134c0 72 69 61 62 6c 65 20 62 61 73 65 64 20 6f 6e 20  riable based on 
134d0 74 68 65 20 73 74 61 74 65 20 6f 66 20 74 68 65  the state of the
134e0 20 73 75 62 2d 69 74 65 72 61 74 6f 72 73 2e 0a   sub-iterators..
134f0 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
13500 74 73 35 4d 75 6c 74 69 49 74 65 72 53 65 74 45  ts5MultiIterSetE
13510 6f 66 28 46 74 73 35 4d 75 6c 74 69 53 65 67 49  of(Fts5MultiSegI
13520 74 65 72 20 2a 70 49 74 65 72 29 7b 0a 20 20 70  ter *pIter){.  p
13530 49 74 65 72 2d 3e 62 45 6f 66 20 3d 20 70 49 74  Iter->bEof = pIt
13540 65 72 2d 3e 61 53 65 67 5b 20 70 49 74 65 72 2d  er->aSeg[ pIter-
13550 3e 61 46 69 72 73 74 5b 31 5d 2e 69 46 69 72 73  >aFirst[1].iFirs
13560 74 20 5d 2e 70 4c 65 61 66 3d 3d 30 3b 0a 7d 0a  t ].pLeaf==0;.}.
13570 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20  ./*.** Move the 
13580 69 74 65 72 61 74 6f 72 20 74 6f 20 74 68 65 20  iterator to the 
13590 6e 65 78 74 20 65 6e 74 72 79 2e 20 0a 2a 2a 0a  next entry. .**.
135a0 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  ** If an error o
135b0 63 63 75 72 73 2c 20 61 6e 20 65 72 72 6f 72 20  ccurs, an error 
135c0 63 6f 64 65 20 69 73 20 6c 65 66 74 20 69 6e 20  code is left in 
135d0 46 74 73 35 49 6e 64 65 78 2e 72 63 2e 20 49 74  Fts5Index.rc. It
135e0 20 69 73 20 6e 6f 74 20 0a 2a 2a 20 63 6f 6e 73   is not .** cons
135f0 69 64 65 72 65 64 20 61 6e 20 65 72 72 6f 72 20  idered an error 
13600 69 66 20 74 68 65 20 69 74 65 72 61 74 6f 72 20  if the iterator 
13610 72 65 61 63 68 65 73 20 45 4f 46 2c 20 6f 72 20  reaches EOF, or 
13620 69 66 20 69 74 20 69 73 20 61 6c 72 65 61 64 79  if it is already
13630 20 61 74 20 0a 2a 2a 20 45 4f 46 20 77 68 65 6e   at .** EOF when
13640 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
13650 73 20 63 61 6c 6c 65 64 2e 0a 2a 2f 0a 73 74 61  s called..*/.sta
13660 74 69 63 20 76 6f 69 64 20 66 74 73 35 4d 75 6c  tic void fts5Mul
13670 74 69 49 74 65 72 4e 65 78 74 28 0a 20 20 46 74  tiIterNext(.  Ft
13680 73 35 49 6e 64 65 78 20 2a 70 2c 20 0a 20 20 46  s5Index *p, .  F
13690 74 73 35 4d 75 6c 74 69 53 65 67 49 74 65 72 20  ts5MultiSegIter 
136a0 2a 70 49 74 65 72 2c 0a 20 20 69 6e 74 20 62 46  *pIter,.  int bF
136b0 72 6f 6d 2c 20 20 20 20 20 20 20 20 20 20 20 20  rom,            
136c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
136d0 65 20 69 66 20 61 72 67 75 6d 65 6e 74 20 69 46  e if argument iF
136e0 72 6f 6d 20 69 73 20 76 61 6c 69 64 20 2a 2f 0a  rom is valid */.
136f0 20 20 69 36 34 20 69 46 72 6f 6d 20 20 20 20 20    i64 iFrom     
13700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13710 20 20 2f 2a 20 41 64 76 61 6e 63 65 20 61 74 20    /* Advance at 
13720 6c 65 61 73 74 20 61 73 20 66 61 72 20 61 73 20  least as far as 
13730 74 68 69 73 20 2a 2f 0a 29 7b 0a 20 20 69 66 28  this */.){.  if(
13740 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
13750 4b 20 29 7b 0a 20 20 20 20 69 6e 74 20 62 55 73  K ){.    int bUs
13760 65 46 72 6f 6d 20 3d 20 62 46 72 6f 6d 3b 0a 20  eFrom = bFrom;. 
13770 20 20 20 64 6f 20 7b 0a 20 20 20 20 20 20 69 6e     do {.      in
13780 74 20 69 46 69 72 73 74 20 3d 20 70 49 74 65 72  t iFirst = pIter
13790 2d 3e 61 46 69 72 73 74 5b 31 5d 2e 69 46 69 72  ->aFirst[1].iFir
137a0 73 74 3b 0a 20 20 20 20 20 20 69 6e 74 20 62 4e  st;.      int bN
137b0 65 77 54 65 72 6d 20 3d 20 30 3b 0a 20 20 20 20  ewTerm = 0;.    
137c0 20 20 46 74 73 35 53 65 67 49 74 65 72 20 2a 70    Fts5SegIter *p
137d0 53 65 67 20 3d 20 26 70 49 74 65 72 2d 3e 61 53  Seg = &pIter->aS
137e0 65 67 5b 69 46 69 72 73 74 5d 3b 0a 20 20 20 20  eg[iFirst];.    
137f0 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72 63 3d    assert( p->rc=
13800 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20  =SQLITE_OK );.  
13810 20 20 20 20 69 66 28 20 62 55 73 65 46 72 6f 6d      if( bUseFrom
13820 20 26 26 20 70 53 65 67 2d 3e 70 44 6c 69 64 78   && pSeg->pDlidx
13830 20 29 7b 0a 20 20 20 20 20 20 20 20 66 74 73 35   ){.        fts5
13840 53 65 67 49 74 65 72 4e 65 78 74 46 72 6f 6d 28  SegIterNextFrom(
13850 70 2c 20 70 53 65 67 2c 20 69 46 72 6f 6d 29 3b  p, pSeg, iFrom);
13860 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
13870 20 20 20 20 20 20 66 74 73 35 53 65 67 49 74 65        fts5SegIte
13880 72 4e 65 78 74 28 70 2c 20 70 53 65 67 2c 20 26  rNext(p, pSeg, &
13890 62 4e 65 77 54 65 72 6d 29 3b 0a 20 20 20 20 20  bNewTerm);.     
138a0 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 70 53   }..      if( pS
138b0 65 67 2d 3e 70 4c 65 61 66 3d 3d 30 20 7c 7c 20  eg->pLeaf==0 || 
138c0 62 4e 65 77 54 65 72 6d 20 0a 20 20 20 20 20 20  bNewTerm .      
138d0 20 7c 7c 20 66 74 73 35 4d 75 6c 74 69 49 74 65   || fts5MultiIte
138e0 72 41 64 76 61 6e 63 65 52 6f 77 69 64 28 70 2c  rAdvanceRowid(p,
138f0 20 70 49 74 65 72 2c 20 69 46 69 72 73 74 29 0a   pIter, iFirst).
13900 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
13910 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 41 64   fts5MultiIterAd
13920 76 61 6e 63 65 64 28 70 2c 20 70 49 74 65 72 2c  vanced(p, pIter,
13930 20 69 46 69 72 73 74 2c 20 31 29 3b 0a 20 20 20   iFirst, 1);.   
13940 20 20 20 20 20 66 74 73 35 4d 75 6c 74 69 49 74       fts5MultiIt
13950 65 72 53 65 74 45 6f 66 28 70 49 74 65 72 29 3b  erSetEof(pIter);
13960 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66  .      }.      f
13970 74 73 35 41 73 73 65 72 74 4d 75 6c 74 69 49 74  ts5AssertMultiIt
13980 65 72 53 65 74 75 70 28 70 2c 20 70 49 74 65 72  erSetup(p, pIter
13990 29 3b 0a 0a 20 20 20 20 20 20 62 55 73 65 46 72  );..      bUseFr
139a0 6f 6d 20 3d 20 30 3b 0a 20 20 20 20 7d 77 68 69  om = 0;.    }whi
139b0 6c 65 28 20 70 49 74 65 72 2d 3e 62 53 6b 69 70  le( pIter->bSkip
139c0 45 6d 70 74 79 20 26 26 20 66 74 73 35 4d 75 6c  Empty && fts5Mul
139d0 74 69 49 74 65 72 49 73 45 6d 70 74 79 28 70 2c  tiIterIsEmpty(p,
139e0 20 70 49 74 65 72 29 20 29 3b 0a 20 20 7d 0a 7d   pIter) );.  }.}
139f0 0a 0a 73 74 61 74 69 63 20 46 74 73 35 4d 75 6c  ..static Fts5Mul
13a00 74 69 53 65 67 49 74 65 72 20 2a 66 74 73 35 4d  tiSegIter *fts5M
13a10 75 6c 74 69 49 74 65 72 41 6c 6c 6f 63 28 0a 20  ultiIterAlloc(. 
13a20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 20   Fts5Index *p,  
13a30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13a40 20 2f 2a 20 46 54 53 35 20 62 61 63 6b 65 6e 64   /* FTS5 backend
13a50 20 74 6f 20 69 74 65 72 61 74 65 20 77 69 74 68   to iterate with
13a60 69 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 65 67  in */.  int nSeg
13a70 0a 29 7b 0a 20 20 46 74 73 35 4d 75 6c 74 69 53  .){.  Fts5MultiS
13a80 65 67 49 74 65 72 20 2a 70 4e 65 77 3b 0a 20 20  egIter *pNew;.  
13a90 69 6e 74 20 6e 53 6c 6f 74 3b 20 20 20 20 20 20  int nSlot;      
13aa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13ab0 2f 2a 20 50 6f 77 65 72 20 6f 66 20 74 77 6f 20  /* Power of two 
13ac0 3e 3d 20 6e 53 65 67 20 2a 2f 0a 0a 20 20 66 6f  >= nSeg */..  fo
13ad0 72 28 6e 53 6c 6f 74 3d 32 3b 20 6e 53 6c 6f 74  r(nSlot=2; nSlot
13ae0 3c 6e 53 65 67 3b 20 6e 53 6c 6f 74 3d 6e 53 6c  <nSeg; nSlot=nSl
13af0 6f 74 2a 32 29 3b 0a 20 20 70 4e 65 77 20 3d 20  ot*2);.  pNew = 
13b00 66 74 73 35 49 64 78 4d 61 6c 6c 6f 63 28 70 2c  fts5IdxMalloc(p,
13b10 20 0a 20 20 20 20 20 20 73 69 7a 65 6f 66 28 46   .      sizeof(F
13b20 74 73 35 4d 75 6c 74 69 53 65 67 49 74 65 72 29  ts5MultiSegIter)
13b30 20 2b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 70   +          /* p
13b40 4e 65 77 20 2a 2f 0a 20 20 20 20 20 20 73 69 7a  New */.      siz
13b50 65 6f 66 28 46 74 73 35 53 65 67 49 74 65 72 29  eof(Fts5SegIter)
13b60 20 2a 20 6e 53 6c 6f 74 20 2b 20 20 20 20 20 20   * nSlot +      
13b70 20 2f 2a 20 70 4e 65 77 2d 3e 61 53 65 67 5b 5d   /* pNew->aSeg[]
13b80 20 2a 2f 0a 20 20 20 20 20 20 73 69 7a 65 6f 66   */.      sizeof
13b90 28 46 74 73 35 43 52 65 73 75 6c 74 29 20 2a 20  (Fts5CResult) * 
13ba0 6e 53 6c 6f 74 20 20 20 20 20 20 20 20 20 2f 2a  nSlot         /*
13bb0 20 70 4e 65 77 2d 3e 61 46 69 72 73 74 5b 5d 20   pNew->aFirst[] 
13bc0 2a 2f 0a 20 20 29 3b 0a 20 20 69 66 28 20 70 4e  */.  );.  if( pN
13bd0 65 77 20 29 7b 0a 20 20 20 20 70 4e 65 77 2d 3e  ew ){.    pNew->
13be0 6e 53 65 67 20 3d 20 6e 53 6c 6f 74 3b 0a 20 20  nSeg = nSlot;.  
13bf0 20 20 70 4e 65 77 2d 3e 61 53 65 67 20 3d 20 28    pNew->aSeg = (
13c00 46 74 73 35 53 65 67 49 74 65 72 2a 29 26 70 4e  Fts5SegIter*)&pN
13c10 65 77 5b 31 5d 3b 0a 20 20 20 20 70 4e 65 77 2d  ew[1];.    pNew-
13c20 3e 61 46 69 72 73 74 20 3d 20 28 46 74 73 35 43  >aFirst = (Fts5C
13c30 52 65 73 75 6c 74 2a 29 26 70 4e 65 77 2d 3e 61  Result*)&pNew->a
13c40 53 65 67 5b 6e 53 6c 6f 74 5d 3b 0a 20 20 7d 0a  Seg[nSlot];.  }.
13c50 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d    return pNew;.}
13c60 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65  ../*.** Allocate
13c70 20 61 20 6e 65 77 20 46 74 73 35 4d 75 6c 74 69   a new Fts5Multi
13c80 53 65 67 49 74 65 72 20 6f 62 6a 65 63 74 2e 0a  SegIter object..
13c90 2a 2a 0a 2a 2a 20 54 68 65 20 6e 65 77 20 6f 62  **.** The new ob
13ca0 6a 65 63 74 20 77 69 6c 6c 20 62 65 20 75 73 65  ject will be use
13cb0 64 20 74 6f 20 69 74 65 72 61 74 65 20 74 68 72  d to iterate thr
13cc0 6f 75 67 68 20 64 61 74 61 20 69 6e 20 73 74 72  ough data in str
13cd0 75 63 74 75 72 65 20 70 53 74 72 75 63 74 2e 0a  ucture pStruct..
13ce0 2a 2a 20 49 66 20 69 4c 65 76 65 6c 20 69 73 20  ** If iLevel is 
13cf0 2d 76 65 2c 20 74 68 65 6e 20 61 6c 6c 20 64 61  -ve, then all da
13d00 74 61 20 69 6e 20 61 6c 6c 20 73 65 67 6d 65 6e  ta in all segmen
13d10 74 73 20 69 73 20 6d 65 72 67 65 64 2e 20 4f 72  ts is merged. Or
13d20 2c 20 69 66 20 69 4c 65 76 65 6c 0a 2a 2a 20 69  , if iLevel.** i
13d30 73 20 7a 65 72 6f 20 6f 72 20 67 72 65 61 74 65  s zero or greate
13d40 72 2c 20 64 61 74 61 20 66 72 6f 6d 20 74 68 65  r, data from the
13d50 20 66 69 72 73 74 20 6e 53 65 67 6d 65 6e 74 20   first nSegment 
13d60 73 65 67 6d 65 6e 74 73 20 6f 6e 20 6c 65 76 65  segments on leve
13d70 6c 20 69 4c 65 76 65 6c 0a 2a 2a 20 69 73 20 6d  l iLevel.** is m
13d80 65 72 67 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  erged..**.** The
13d90 20 69 74 65 72 61 74 6f 72 20 69 6e 69 74 69 61   iterator initia
13da0 6c 6c 79 20 70 6f 69 6e 74 73 20 74 6f 20 74 68  lly points to th
13db0 65 20 66 69 72 73 74 20 74 65 72 6d 2f 72 6f 77  e first term/row
13dc0 69 64 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20  id entry in the 
13dd0 0a 2a 2a 20 69 74 65 72 61 74 65 64 20 64 61 74  .** iterated dat
13de0 61 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  a..*/.static voi
13df0 64 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 4e  d fts5MultiIterN
13e00 65 77 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20  ew(.  Fts5Index 
13e10 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  *p,             
13e20 20 20 20 20 20 20 2f 2a 20 46 54 53 35 20 62 61        /* FTS5 ba
13e30 63 6b 65 6e 64 20 74 6f 20 69 74 65 72 61 74 65  ckend to iterate
13e40 20 77 69 74 68 69 6e 20 2a 2f 0a 20 20 46 74 73   within */.  Fts
13e50 35 53 74 72 75 63 74 75 72 65 20 2a 70 53 74 72  5Structure *pStr
13e60 75 63 74 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  uct,         /* 
13e70 53 74 72 75 63 74 75 72 65 20 6f 66 20 73 70 65  Structure of spe
13e80 63 69 66 69 63 20 69 6e 64 65 78 20 2a 2f 0a 20  cific index */. 
13e90 20 69 6e 74 20 62 53 6b 69 70 45 6d 70 74 79 2c   int bSkipEmpty,
13ea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13eb0 20 2f 2a 20 54 72 75 65 20 74 6f 20 69 67 6e 6f   /* True to igno
13ec0 72 65 20 64 65 6c 65 74 65 2d 6b 65 79 73 20 2a  re delete-keys *
13ed0 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c 20 20  /.  int flags,  
13ee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13ef0 20 20 20 20 2f 2a 20 46 54 53 35 49 4e 44 45 58      /* FTS5INDEX
13f00 5f 51 55 45 52 59 5f 58 58 58 20 66 6c 61 67 73  _QUERY_XXX flags
13f10 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a   */.  const u8 *
13f20 70 54 65 72 6d 2c 20 69 6e 74 20 6e 54 65 72 6d  pTerm, int nTerm
13f30 2c 20 20 20 20 20 2f 2a 20 54 65 72 6d 20 74 6f  ,     /* Term to
13f40 20 73 65 65 6b 20 74 6f 20 28 6f 72 20 4e 55 4c   seek to (or NUL
13f50 4c 2f 30 29 20 2a 2f 0a 20 20 69 6e 74 20 69 4c  L/0) */.  int iL
13f60 65 76 65 6c 2c 20 20 20 20 20 20 20 20 20 20 20  evel,           
13f70 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 76            /* Lev
13f80 65 6c 20 74 6f 20 69 74 65 72 61 74 65 20 28 2d  el to iterate (-
13f90 31 20 66 6f 72 20 61 6c 6c 29 20 2a 2f 0a 20 20  1 for all) */.  
13fa0 69 6e 74 20 6e 53 65 67 6d 65 6e 74 2c 20 20 20  int nSegment,   
13fb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13fc0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 73 65 67  /* Number of seg
13fd0 6d 65 6e 74 73 20 74 6f 20 6d 65 72 67 65 20 28  ments to merge (
13fe0 69 4c 65 76 65 6c 3e 3d 30 29 20 2a 2f 0a 20 20  iLevel>=0) */.  
13ff0 46 74 73 35 4d 75 6c 74 69 53 65 67 49 74 65 72  Fts5MultiSegIter
14000 20 2a 2a 70 70 4f 75 74 20 20 20 20 20 20 20 20   **ppOut        
14010 2f 2a 20 4e 65 77 20 6f 62 6a 65 63 74 20 2a 2f  /* New object */
14020 0a 29 7b 0a 20 20 69 6e 74 20 6e 53 65 67 20 3d  .){.  int nSeg =
14030 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
14040 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
14050 6f 66 20 73 65 67 6d 65 6e 74 2d 69 74 65 72 73  of segment-iters
14060 20 69 6e 20 75 73 65 20 2a 2f 0a 20 20 69 6e 74   in use */.  int
14070 20 69 49 74 65 72 20 3d 20 30 3b 20 20 20 20 20   iIter = 0;     
14080 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
14090 2a 2f 0a 20 20 69 6e 74 20 69 53 65 67 3b 20 20  */.  int iSeg;  
140a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
140b0 20 20 20 20 20 2f 2a 20 55 73 65 64 20 74 6f 20       /* Used to 
140c0 69 74 65 72 61 74 65 20 74 68 72 6f 75 67 68 20  iterate through 
140d0 73 65 67 6d 65 6e 74 73 20 2a 2f 0a 20 20 46 74  segments */.  Ft
140e0 73 35 53 74 72 75 63 74 75 72 65 4c 65 76 65 6c  s5StructureLevel
140f0 20 2a 70 4c 76 6c 3b 0a 20 20 46 74 73 35 4d 75   *pLvl;.  Fts5Mu
14100 6c 74 69 53 65 67 49 74 65 72 20 2a 70 4e 65 77  ltiSegIter *pNew
14110 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 28 70 54  ;..  assert( (pT
14120 65 72 6d 3d 3d 30 20 26 26 20 6e 54 65 72 6d 3d  erm==0 && nTerm=
14130 3d 30 29 20 7c 7c 20 69 4c 65 76 65 6c 3c 30 20  =0) || iLevel<0 
14140 29 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74  );..  /* Allocat
14150 65 20 73 70 61 63 65 20 66 6f 72 20 74 68 65 20  e space for the 
14160 6e 65 77 20 6d 75 6c 74 69 2d 73 65 67 2d 69 74  new multi-seg-it
14170 65 72 61 74 6f 72 2e 20 2a 2f 0a 20 20 69 66 28  erator. */.  if(
14180 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
14190 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 69 4c 65  K ){.    if( iLe
141a0 76 65 6c 3c 30 20 29 7b 0a 20 20 20 20 20 20 61  vel<0 ){.      a
141b0 73 73 65 72 74 28 20 70 53 74 72 75 63 74 2d 3e  ssert( pStruct->
141c0 6e 53 65 67 6d 65 6e 74 3d 3d 66 74 73 35 53 74  nSegment==fts5St
141d0 72 75 63 74 75 72 65 43 6f 75 6e 74 53 65 67 6d  ructureCountSegm
141e0 65 6e 74 73 28 70 53 74 72 75 63 74 29 20 29 3b  ents(pStruct) );
141f0 0a 20 20 20 20 20 20 6e 53 65 67 20 3d 20 70 53  .      nSeg = pS
14200 74 72 75 63 74 2d 3e 6e 53 65 67 6d 65 6e 74 3b  truct->nSegment;
14210 0a 20 20 20 20 20 20 6e 53 65 67 20 2b 3d 20 28  .      nSeg += (
14220 70 2d 3e 70 48 61 73 68 20 3f 20 31 20 3a 20 30  p->pHash ? 1 : 0
14230 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
14240 20 20 20 20 6e 53 65 67 20 3d 20 4d 49 4e 28 70      nSeg = MIN(p
14250 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69  Struct->aLevel[i
14260 4c 65 76 65 6c 5d 2e 6e 53 65 67 2c 20 6e 53 65  Level].nSeg, nSe
14270 67 6d 65 6e 74 29 3b 0a 20 20 20 20 7d 0a 20 20  gment);.    }.  
14280 7d 0a 20 20 2a 70 70 4f 75 74 20 3d 20 70 4e 65  }.  *ppOut = pNe
14290 77 20 3d 20 66 74 73 35 4d 75 6c 74 69 49 74 65  w = fts5MultiIte
142a0 72 41 6c 6c 6f 63 28 70 2c 20 6e 53 65 67 29 3b  rAlloc(p, nSeg);
142b0 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29  .  if( pNew==0 )
142c0 20 72 65 74 75 72 6e 3b 0a 20 20 70 4e 65 77 2d   return;.  pNew-
142d0 3e 62 52 65 76 20 3d 20 28 30 21 3d 28 66 6c 61  >bRev = (0!=(fla
142e0 67 73 20 26 20 46 54 53 35 49 4e 44 45 58 5f 51  gs & FTS5INDEX_Q
142f0 55 45 52 59 5f 44 45 53 43 29 29 3b 0a 20 20 70  UERY_DESC));.  p
14300 4e 65 77 2d 3e 62 53 6b 69 70 45 6d 70 74 79 20  New->bSkipEmpty 
14310 3d 20 62 53 6b 69 70 45 6d 70 74 79 3b 0a 0a 20  = bSkipEmpty;.. 
14320 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 65   /* Initialize e
14330 61 63 68 20 6f 66 20 74 68 65 20 63 6f 6d 70 6f  ach of the compo
14340 6e 65 6e 74 20 73 65 67 6d 65 6e 74 20 69 74 65  nent segment ite
14350 72 61 74 6f 72 73 2e 20 2a 2f 0a 20 20 69 66 28  rators. */.  if(
14360 20 69 4c 65 76 65 6c 3c 30 20 29 7b 0a 20 20 20   iLevel<0 ){.   
14370 20 46 74 73 35 53 74 72 75 63 74 75 72 65 4c 65   Fts5StructureLe
14380 76 65 6c 20 2a 70 45 6e 64 20 3d 20 26 70 53 74  vel *pEnd = &pSt
14390 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 70 53 74  ruct->aLevel[pSt
143a0 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 5d 3b 0a 20  ruct->nLevel];. 
143b0 20 20 20 69 66 28 20 70 2d 3e 70 48 61 73 68 20     if( p->pHash 
143c0 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41 64 64 20  ){.      /* Add 
143d0 61 20 73 65 67 6d 65 6e 74 20 69 74 65 72 61 74  a segment iterat
143e0 6f 72 20 66 6f 72 20 74 68 65 20 63 75 72 72 65  or for the curre
143f0 6e 74 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  nt contents of t
14400 68 65 20 68 61 73 68 20 74 61 62 6c 65 2e 20 2a  he hash table. *
14410 2f 0a 20 20 20 20 20 20 46 74 73 35 53 65 67 49  /.      Fts5SegI
14420 74 65 72 20 2a 70 49 74 65 72 20 3d 20 26 70 4e  ter *pIter = &pN
14430 65 77 2d 3e 61 53 65 67 5b 69 49 74 65 72 2b 2b  ew->aSeg[iIter++
14440 5d 3b 0a 20 20 20 20 20 20 66 74 73 35 53 65 67  ];.      fts5Seg
14450 49 74 65 72 48 61 73 68 49 6e 69 74 28 70 2c 20  IterHashInit(p, 
14460 70 54 65 72 6d 2c 20 6e 54 65 72 6d 2c 20 66 6c  pTerm, nTerm, fl
14470 61 67 73 2c 20 70 49 74 65 72 29 3b 0a 20 20 20  ags, pIter);.   
14480 20 7d 0a 20 20 20 20 66 6f 72 28 70 4c 76 6c 3d   }.    for(pLvl=
14490 26 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c  &pStruct->aLevel
144a0 5b 30 5d 3b 20 70 4c 76 6c 3c 70 45 6e 64 3b 20  [0]; pLvl<pEnd; 
144b0 70 4c 76 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 66  pLvl++){.      f
144c0 6f 72 28 69 53 65 67 3d 70 4c 76 6c 2d 3e 6e 53  or(iSeg=pLvl->nS
144d0 65 67 2d 31 3b 20 69 53 65 67 3e 3d 30 3b 20 69  eg-1; iSeg>=0; i
144e0 53 65 67 2d 2d 29 7b 0a 20 20 20 20 20 20 20 20  Seg--){.        
144f0 46 74 73 35 53 74 72 75 63 74 75 72 65 53 65 67  Fts5StructureSeg
14500 6d 65 6e 74 20 2a 70 53 65 67 20 3d 20 26 70 4c  ment *pSeg = &pL
14510 76 6c 2d 3e 61 53 65 67 5b 69 53 65 67 5d 3b 0a  vl->aSeg[iSeg];.
14520 20 20 20 20 20 20 20 20 46 74 73 35 53 65 67 49          Fts5SegI
14530 74 65 72 20 2a 70 49 74 65 72 20 3d 20 26 70 4e  ter *pIter = &pN
14540 65 77 2d 3e 61 53 65 67 5b 69 49 74 65 72 2b 2b  ew->aSeg[iIter++
14550 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  ];.        if( p
14560 54 65 72 6d 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Term==0 ){.     
14570 20 20 20 20 20 66 74 73 35 53 65 67 49 74 65 72       fts5SegIter
14580 49 6e 69 74 28 70 2c 20 70 53 65 67 2c 20 70 49  Init(p, pSeg, pI
14590 74 65 72 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  ter);.        }e
145a0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 66  lse{.          f
145b0 74 73 35 53 65 67 49 74 65 72 53 65 65 6b 49 6e  ts5SegIterSeekIn
145c0 69 74 28 70 2c 20 70 54 65 72 6d 2c 20 6e 54 65  it(p, pTerm, nTe
145d0 72 6d 2c 20 66 6c 61 67 73 2c 20 70 53 65 67 2c  rm, flags, pSeg,
145e0 20 70 49 74 65 72 29 3b 0a 20 20 20 20 20 20 20   pIter);.       
145f0 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
14600 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 4c  .  }else{.    pL
14610 76 6c 20 3d 20 26 70 53 74 72 75 63 74 2d 3e 61  vl = &pStruct->a
14620 4c 65 76 65 6c 5b 69 4c 65 76 65 6c 5d 3b 0a 20  Level[iLevel];. 
14630 20 20 20 66 6f 72 28 69 53 65 67 3d 6e 53 65 67     for(iSeg=nSeg
14640 2d 31 3b 20 69 53 65 67 3e 3d 30 3b 20 69 53 65  -1; iSeg>=0; iSe
14650 67 2d 2d 29 7b 0a 20 20 20 20 20 20 66 74 73 35  g--){.      fts5
14660 53 65 67 49 74 65 72 49 6e 69 74 28 70 2c 20 26  SegIterInit(p, &
14670 70 4c 76 6c 2d 3e 61 53 65 67 5b 69 53 65 67 5d  pLvl->aSeg[iSeg]
14680 2c 20 26 70 4e 65 77 2d 3e 61 53 65 67 5b 69 49  , &pNew->aSeg[iI
14690 74 65 72 2b 2b 5d 29 3b 0a 20 20 20 20 7d 0a 20  ter++]);.    }. 
146a0 20 7d 0a 20 20 61 73 73 65 72 74 28 20 69 49 74   }.  assert( iIt
146b0 65 72 3d 3d 6e 53 65 67 20 29 3b 0a 0a 20 20 2f  er==nSeg );..  /
146c0 2a 20 49 66 20 74 68 65 20 61 62 6f 76 65 20 77  * If the above w
146d0 61 73 20 73 75 63 63 65 73 73 66 75 6c 2c 20 65  as successful, e
146e0 61 63 68 20 63 6f 6d 70 6f 6e 65 6e 74 20 69 74  ach component it
146f0 65 72 61 74 6f 72 73 20 6e 6f 77 20 70 6f 69 6e  erators now poin
14700 74 73 20 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20  ts .  ** to the 
14710 66 69 72 73 74 20 65 6e 74 72 79 20 69 6e 20 69  first entry in i
14720 74 73 20 73 65 67 6d 65 6e 74 2e 20 49 6e 20 74  ts segment. In t
14730 68 69 73 20 63 61 73 65 20 69 6e 69 74 69 61 6c  his case initial
14740 69 7a 65 20 74 68 65 20 0a 20 20 2a 2a 20 61 46  ize the .  ** aF
14750 69 72 73 74 5b 5d 20 61 72 72 61 79 2e 20 4f 72  irst[] array. Or
14760 2c 20 69 66 20 61 6e 20 65 72 72 6f 72 20 68 61  , if an error ha
14770 73 20 6f 63 63 75 72 72 65 64 2c 20 66 72 65 65  s occurred, free
14780 20 74 68 65 20 69 74 65 72 61 74 6f 72 0a 20 20   the iterator.  
14790 2a 2a 20 6f 62 6a 65 63 74 20 61 6e 64 20 73 65  ** object and se
147a0 74 20 74 68 65 20 6f 75 74 70 75 74 20 76 61 72  t the output var
147b0 69 61 62 6c 65 20 74 6f 20 4e 55 4c 4c 2e 20 20  iable to NULL.  
147c0 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d  */.  if( p->rc==
147d0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
147e0 20 66 6f 72 28 69 49 74 65 72 3d 70 4e 65 77 2d   for(iIter=pNew-
147f0 3e 6e 53 65 67 2d 31 3b 20 69 49 74 65 72 3e 30  >nSeg-1; iIter>0
14800 3b 20 69 49 74 65 72 2d 2d 29 7b 0a 20 20 20 20  ; iIter--){.    
14810 20 20 69 6e 74 20 69 45 71 3b 0a 20 20 20 20 20    int iEq;.     
14820 20 69 66 28 20 28 69 45 71 20 3d 20 66 74 73 35   if( (iEq = fts5
14830 4d 75 6c 74 69 49 74 65 72 44 6f 43 6f 6d 70 61  MultiIterDoCompa
14840 72 65 28 70 4e 65 77 2c 20 69 49 74 65 72 29 29  re(pNew, iIter))
14850 20 29 7b 0a 20 20 20 20 20 20 20 20 66 74 73 35   ){.        fts5
14860 53 65 67 49 74 65 72 4e 65 78 74 28 70 2c 20 26  SegIterNext(p, &
14870 70 4e 65 77 2d 3e 61 53 65 67 5b 69 45 71 5d 2c  pNew->aSeg[iEq],
14880 20 30 29 3b 0a 20 20 20 20 20 20 20 20 66 74 73   0);.        fts
14890 35 4d 75 6c 74 69 49 74 65 72 41 64 76 61 6e 63  5MultiIterAdvanc
148a0 65 64 28 70 2c 20 70 4e 65 77 2c 20 69 45 71 2c  ed(p, pNew, iEq,
148b0 20 69 49 74 65 72 29 3b 0a 20 20 20 20 20 20 7d   iIter);.      }
148c0 0a 20 20 20 20 7d 0a 20 20 20 20 66 74 73 35 4d  .    }.    fts5M
148d0 75 6c 74 69 49 74 65 72 53 65 74 45 6f 66 28 70  ultiIterSetEof(p
148e0 4e 65 77 29 3b 0a 20 20 20 20 66 74 73 35 41 73  New);.    fts5As
148f0 73 65 72 74 4d 75 6c 74 69 49 74 65 72 53 65 74  sertMultiIterSet
14900 75 70 28 70 2c 20 70 4e 65 77 29 3b 0a 0a 20 20  up(p, pNew);..  
14910 20 20 69 66 28 20 70 4e 65 77 2d 3e 62 53 6b 69    if( pNew->bSki
14920 70 45 6d 70 74 79 20 26 26 20 66 74 73 35 4d 75  pEmpty && fts5Mu
14930 6c 74 69 49 74 65 72 49 73 45 6d 70 74 79 28 70  ltiIterIsEmpty(p
14940 2c 20 70 4e 65 77 29 20 29 7b 0a 20 20 20 20 20  , pNew) ){.     
14950 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 4e 65   fts5MultiIterNe
14960 78 74 28 70 2c 20 70 4e 65 77 2c 20 30 2c 20 30  xt(p, pNew, 0, 0
14970 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  );.    }.  }else
14980 7b 0a 20 20 20 20 66 74 73 35 4d 75 6c 74 69 49  {.    fts5MultiI
14990 74 65 72 46 72 65 65 28 70 2c 20 70 4e 65 77 29  terFree(p, pNew)
149a0 3b 0a 20 20 20 20 2a 70 70 4f 75 74 20 3d 20 30  ;.    *ppOut = 0
149b0 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  ;.  }.}../*.** C
149c0 72 65 61 74 65 20 61 6e 20 46 74 73 35 4d 75 6c  reate an Fts5Mul
149d0 74 69 53 65 67 49 74 65 72 20 74 68 61 74 20 69  tiSegIter that i
149e0 74 65 72 61 74 65 73 20 74 68 72 6f 75 67 68 20  terates through 
149f0 74 68 65 20 64 6f 63 6c 69 73 74 20 70 72 6f 76  the doclist prov
14a00 69 64 65 64 0a 2a 2a 20 61 73 20 74 68 65 20 73  ided.** as the s
14a10 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2e 0a  econd argument..
14a20 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
14a30 74 73 35 4d 75 6c 74 69 49 74 65 72 4e 65 77 32  ts5MultiIterNew2
14a40 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70  (.  Fts5Index *p
14a50 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
14a60 20 20 20 20 2f 2a 20 46 54 53 35 20 62 61 63 6b      /* FTS5 back
14a70 65 6e 64 20 74 6f 20 69 74 65 72 61 74 65 20 77  end to iterate w
14a80 69 74 68 69 6e 20 2a 2f 0a 20 20 46 74 73 35 44  ithin */.  Fts5D
14a90 61 74 61 20 2a 70 44 61 74 61 2c 20 20 20 20 20  ata *pData,     
14aa0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f             /* Do
14ab0 63 6c 69 73 74 20 74 6f 20 69 74 65 72 61 74 65  clist to iterate
14ac0 20 74 68 72 6f 75 67 68 20 2a 2f 0a 20 20 69 6e   through */.  in
14ad0 74 20 62 44 65 73 63 2c 20 20 20 20 20 20 20 20  t bDesc,        
14ae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
14af0 20 54 72 75 65 20 66 6f 72 20 64 65 73 63 65 6e   True for descen
14b00 64 69 6e 67 20 72 6f 77 69 64 20 6f 72 64 65 72  ding rowid order
14b10 20 2a 2f 0a 20 20 46 74 73 35 4d 75 6c 74 69 53   */.  Fts5MultiS
14b20 65 67 49 74 65 72 20 2a 2a 70 70 4f 75 74 20 20  egIter **ppOut  
14b30 20 20 20 20 20 20 2f 2a 20 4e 65 77 20 6f 62 6a        /* New obj
14b40 65 63 74 20 2a 2f 0a 29 7b 0a 20 20 46 74 73 35  ect */.){.  Fts5
14b50 4d 75 6c 74 69 53 65 67 49 74 65 72 20 2a 70 4e  MultiSegIter *pN
14b60 65 77 3b 0a 20 20 70 4e 65 77 20 3d 20 66 74 73  ew;.  pNew = fts
14b70 35 4d 75 6c 74 69 49 74 65 72 41 6c 6c 6f 63 28  5MultiIterAlloc(
14b80 70 2c 20 32 29 3b 0a 20 20 69 66 28 20 70 4e 65  p, 2);.  if( pNe
14b90 77 20 29 7b 0a 20 20 20 20 46 74 73 35 53 65 67  w ){.    Fts5Seg
14ba0 49 74 65 72 20 2a 70 49 74 65 72 20 3d 20 26 70  Iter *pIter = &p
14bb0 4e 65 77 2d 3e 61 53 65 67 5b 31 5d 3b 0a 0a 20  New->aSeg[1];.. 
14bc0 20 20 20 70 49 74 65 72 2d 3e 66 6c 61 67 73 20     pIter->flags 
14bd0 3d 20 46 54 53 35 5f 53 45 47 49 54 45 52 5f 4f  = FTS5_SEGITER_O
14be0 4e 45 54 45 52 4d 3b 0a 20 20 20 20 69 66 28 20  NETERM;.    if( 
14bf0 70 44 61 74 61 2d 3e 6e 3e 30 20 29 7b 0a 20 20  pData->n>0 ){.  
14c00 20 20 20 20 70 49 74 65 72 2d 3e 70 4c 65 61 66      pIter->pLeaf
14c10 20 3d 20 70 44 61 74 61 3b 0a 20 20 20 20 20 20   = pData;.      
14c20 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73  pIter->iLeafOffs
14c30 65 74 20 3d 20 66 74 73 35 47 65 74 56 61 72 69  et = fts5GetVari
14c40 6e 74 28 70 44 61 74 61 2d 3e 70 2c 20 28 75 36  nt(pData->p, (u6
14c50 34 2a 29 26 70 49 74 65 72 2d 3e 69 52 6f 77 69  4*)&pIter->iRowi
14c60 64 29 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e  d);.      pNew->
14c70 61 46 69 72 73 74 5b 31 5d 2e 69 46 69 72 73 74  aFirst[1].iFirst
14c80 20 3d 20 31 3b 0a 20 20 20 20 20 20 69 66 28 20   = 1;.      if( 
14c90 62 44 65 73 63 20 29 7b 0a 20 20 20 20 20 20 20  bDesc ){.       
14ca0 20 70 4e 65 77 2d 3e 62 52 65 76 20 3d 20 31 3b   pNew->bRev = 1;
14cb0 0a 20 20 20 20 20 20 20 20 70 49 74 65 72 2d 3e  .        pIter->
14cc0 66 6c 61 67 73 20 7c 3d 20 46 54 53 35 5f 53 45  flags |= FTS5_SE
14cd0 47 49 54 45 52 5f 52 45 56 45 52 53 45 3b 0a 20  GITER_REVERSE;. 
14ce0 20 20 20 20 20 20 20 66 74 73 35 53 65 67 49 74         fts5SegIt
14cf0 65 72 52 65 76 65 72 73 65 49 6e 69 74 50 61 67  erReverseInitPag
14d00 65 28 70 2c 20 70 49 74 65 72 29 3b 0a 20 20 20  e(p, pIter);.   
14d10 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
14d20 20 20 66 74 73 35 53 65 67 49 74 65 72 4c 6f 61    fts5SegIterLoa
14d30 64 4e 50 6f 73 28 70 2c 20 70 49 74 65 72 29 3b  dNPos(p, pIter);
14d40 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
14d50 44 61 74 61 20 3d 20 30 3b 0a 20 20 20 20 7d 65  Data = 0;.    }e
14d60 6c 73 65 7b 0a 20 20 20 20 20 20 70 4e 65 77 2d  lse{.      pNew-
14d70 3e 62 45 6f 66 20 3d 20 31 3b 0a 20 20 20 20 7d  >bEof = 1;.    }
14d80 0a 0a 20 20 20 20 2a 70 70 4f 75 74 20 3d 20 70  ..    *ppOut = p
14d90 4e 65 77 3b 0a 20 20 7d 0a 0a 20 20 66 74 73 35  New;.  }..  fts5
14da0 44 61 74 61 52 65 6c 65 61 73 65 28 70 44 61 74  DataRelease(pDat
14db0 61 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  a);.}../*.** Ret
14dc0 75 72 6e 20 74 72 75 65 20 69 66 20 74 68 65 20  urn true if the 
14dd0 69 74 65 72 61 74 6f 72 20 69 73 20 61 74 20 45  iterator is at E
14de0 4f 46 20 6f 72 20 69 66 20 61 6e 20 65 72 72 6f  OF or if an erro
14df0 72 20 68 61 73 20 6f 63 63 75 72 72 65 64 2e 20  r has occurred. 
14e00 0a 2a 2a 20 46 61 6c 73 65 20 6f 74 68 65 72 77  .** False otherw
14e10 69 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ise..*/.static i
14e20 6e 74 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72  nt fts5MultiIter
14e30 45 6f 66 28 46 74 73 35 49 6e 64 65 78 20 2a 70  Eof(Fts5Index *p
14e40 2c 20 46 74 73 35 4d 75 6c 74 69 53 65 67 49 74  , Fts5MultiSegIt
14e50 65 72 20 2a 70 49 74 65 72 29 7b 0a 20 20 61 73  er *pIter){.  as
14e60 73 65 72 74 28 20 70 2d 3e 72 63 20 0a 20 20 20  sert( p->rc .   
14e70 20 20 20 7c 7c 20 28 70 49 74 65 72 2d 3e 61 53     || (pIter->aS
14e80 65 67 5b 20 70 49 74 65 72 2d 3e 61 46 69 72 73  eg[ pIter->aFirs
14e90 74 5b 31 5d 2e 69 46 69 72 73 74 20 5d 2e 70 4c  t[1].iFirst ].pL
14ea0 65 61 66 3d 3d 30 29 3d 3d 70 49 74 65 72 2d 3e  eaf==0)==pIter->
14eb0 62 45 6f 66 20 0a 20 20 29 3b 0a 20 20 72 65 74  bEof .  );.  ret
14ec0 75 72 6e 20 28 70 2d 3e 72 63 20 7c 7c 20 70 49  urn (p->rc || pI
14ed0 74 65 72 2d 3e 62 45 6f 66 29 3b 0a 7d 0a 0a 2f  ter->bEof);.}../
14ee0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
14ef0 72 6f 77 69 64 20 6f 66 20 74 68 65 20 65 6e 74  rowid of the ent
14f00 72 79 20 74 68 61 74 20 74 68 65 20 69 74 65 72  ry that the iter
14f10 61 74 6f 72 20 63 75 72 72 65 6e 74 6c 79 20 70  ator currently p
14f20 6f 69 6e 74 73 0a 2a 2a 20 74 6f 2e 20 49 66 20  oints.** to. If 
14f30 74 68 65 20 69 74 65 72 61 74 6f 72 20 70 6f 69  the iterator poi
14f40 6e 74 73 20 74 6f 20 45 4f 46 20 77 68 65 6e 20  nts to EOF when 
14f50 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
14f60 20 63 61 6c 6c 65 64 20 74 68 65 0a 2a 2a 20 72   called the.** r
14f70 65 73 75 6c 74 73 20 61 72 65 20 75 6e 64 65 66  esults are undef
14f80 69 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ined..*/.static 
14f90 69 36 34 20 66 74 73 35 4d 75 6c 74 69 49 74 65  i64 fts5MultiIte
14fa0 72 52 6f 77 69 64 28 46 74 73 35 4d 75 6c 74 69  rRowid(Fts5Multi
14fb0 53 65 67 49 74 65 72 20 2a 70 49 74 65 72 29 7b  SegIter *pIter){
14fc0 0a 20 20 61 73 73 65 72 74 28 20 70 49 74 65 72  .  assert( pIter
14fd0 2d 3e 61 53 65 67 5b 20 70 49 74 65 72 2d 3e 61  ->aSeg[ pIter->a
14fe0 46 69 72 73 74 5b 31 5d 2e 69 46 69 72 73 74 20  First[1].iFirst 
14ff0 5d 2e 70 4c 65 61 66 20 29 3b 0a 20 20 72 65 74  ].pLeaf );.  ret
15000 75 72 6e 20 70 49 74 65 72 2d 3e 61 53 65 67 5b  urn pIter->aSeg[
15010 20 70 49 74 65 72 2d 3e 61 46 69 72 73 74 5b 31   pIter->aFirst[1
15020 5d 2e 69 46 69 72 73 74 20 5d 2e 69 52 6f 77 69  ].iFirst ].iRowi
15030 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65  d;.}../*.** Move
15040 20 74 68 65 20 69 74 65 72 61 74 6f 72 20 74 6f   the iterator to
15050 20 74 68 65 20 6e 65 78 74 20 65 6e 74 72 79 20   the next entry 
15060 61 74 20 6f 72 20 66 6f 6c 6c 6f 77 69 6e 67 20  at or following 
15070 69 4d 61 74 63 68 2e 0a 2a 2f 0a 73 74 61 74 69  iMatch..*/.stati
15080 63 20 76 6f 69 64 20 66 74 73 35 4d 75 6c 74 69  c void fts5Multi
15090 49 74 65 72 4e 65 78 74 46 72 6f 6d 28 0a 20 20  IterNextFrom(.  
150a0 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 0a 20  Fts5Index *p, . 
150b0 20 46 74 73 35 4d 75 6c 74 69 53 65 67 49 74 65   Fts5MultiSegIte
150c0 72 20 2a 70 49 74 65 72 2c 20 0a 20 20 69 36 34  r *pIter, .  i64
150d0 20 69 4d 61 74 63 68 0a 29 7b 0a 20 20 77 68 69   iMatch.){.  whi
150e0 6c 65 28 20 31 20 29 7b 0a 20 20 20 20 69 36 34  le( 1 ){.    i64
150f0 20 69 52 6f 77 69 64 3b 0a 20 20 20 20 66 74 73   iRowid;.    fts
15100 35 4d 75 6c 74 69 49 74 65 72 4e 65 78 74 28 70  5MultiIterNext(p
15110 2c 20 70 49 74 65 72 2c 20 31 2c 20 69 4d 61 74  , pIter, 1, iMat
15120 63 68 29 3b 0a 20 20 20 20 69 66 28 20 66 74 73  ch);.    if( fts
15130 35 4d 75 6c 74 69 49 74 65 72 45 6f 66 28 70 2c  5MultiIterEof(p,
15140 20 70 49 74 65 72 29 20 29 20 62 72 65 61 6b 3b   pIter) ) break;
15150 0a 20 20 20 20 69 52 6f 77 69 64 20 3d 20 66 74  .    iRowid = ft
15160 73 35 4d 75 6c 74 69 49 74 65 72 52 6f 77 69 64  s5MultiIterRowid
15170 28 70 49 74 65 72 29 3b 0a 20 20 20 20 69 66 28  (pIter);.    if(
15180 20 70 49 74 65 72 2d 3e 62 52 65 76 3d 3d 30 20   pIter->bRev==0 
15190 26 26 20 69 52 6f 77 69 64 3e 3d 69 4d 61 74 63  && iRowid>=iMatc
151a0 68 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 69  h ) break;.    i
151b0 66 28 20 70 49 74 65 72 2d 3e 62 52 65 76 21 3d  f( pIter->bRev!=
151c0 30 20 26 26 20 69 52 6f 77 69 64 3c 3d 69 4d 61  0 && iRowid<=iMa
151d0 74 63 68 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d  tch ) break;.  }
151e0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
151f0 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20   a pointer to a 
15200 62 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e  buffer containin
15210 67 20 74 68 65 20 74 65 72 6d 20 61 73 73 6f 63  g the term assoc
15220 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20 0a  iated with the .
15230 2a 2a 20 65 6e 74 72 79 20 74 68 61 74 20 74 68  ** entry that th
15240 65 20 69 74 65 72 61 74 6f 72 20 63 75 72 72 65  e iterator curre
15250 6e 74 6c 79 20 70 6f 69 6e 74 73 20 74 6f 2e 0a  ntly points to..
15260 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20  */.static const 
15270 75 38 20 2a 66 74 73 35 4d 75 6c 74 69 49 74 65  u8 *fts5MultiIte
15280 72 54 65 72 6d 28 46 74 73 35 4d 75 6c 74 69 53  rTerm(Fts5MultiS
15290 65 67 49 74 65 72 20 2a 70 49 74 65 72 2c 20 69  egIter *pIter, i
152a0 6e 74 20 2a 70 6e 29 7b 0a 20 20 46 74 73 35 53  nt *pn){.  Fts5S
152b0 65 67 49 74 65 72 20 2a 70 20 3d 20 26 70 49 74  egIter *p = &pIt
152c0 65 72 2d 3e 61 53 65 67 5b 20 70 49 74 65 72 2d  er->aSeg[ pIter-
152d0 3e 61 46 69 72 73 74 5b 31 5d 2e 69 46 69 72 73  >aFirst[1].iFirs
152e0 74 20 5d 3b 0a 20 20 2a 70 6e 20 3d 20 70 2d 3e  t ];.  *pn = p->
152f0 74 65 72 6d 2e 6e 3b 0a 20 20 72 65 74 75 72 6e  term.n;.  return
15300 20 70 2d 3e 74 65 72 6d 2e 70 3b 0a 7d 0a 0a 73   p->term.p;.}..s
15310 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 43  tatic void fts5C
15320 68 75 6e 6b 49 74 65 72 61 74 65 28 0a 20 20 46  hunkIterate(.  F
15330 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20  ts5Index *p,    
15340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
15350 2a 20 49 6e 64 65 78 20 6f 62 6a 65 63 74 20 2a  * Index object *
15360 2f 0a 20 20 46 74 73 35 53 65 67 49 74 65 72 20  /.  Fts5SegIter 
15370 2a 70 53 65 67 2c 20 20 20 20 20 20 20 20 20 20  *pSeg,          
15380 20 20 20 20 2f 2a 20 50 6f 73 6c 69 73 74 20 6f      /* Poslist o
15390 66 20 74 68 69 73 20 69 74 65 72 61 74 6f 72 20  f this iterator 
153a0 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 43 74 78 2c  */.  void *pCtx,
153b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
153c0 20 20 20 20 20 2f 2a 20 43 6f 6e 74 65 78 74 20       /* Context 
153d0 70 6f 69 6e 74 65 72 20 66 6f 72 20 78 43 68 75  pointer for xChu
153e0 6e 6b 20 63 61 6c 6c 62 61 63 6b 20 2a 2f 0a 20  nk callback */. 
153f0 20 76 6f 69 64 20 28 2a 78 43 68 75 6e 6b 29 28   void (*xChunk)(
15400 46 74 73 35 49 6e 64 65 78 2a 2c 20 76 6f 69 64  Fts5Index*, void
15410 2a 2c 20 63 6f 6e 73 74 20 75 38 2a 2c 20 69 6e  *, const u8*, in
15420 74 29 0a 29 7b 0a 20 20 69 6e 74 20 6e 52 65 6d  t).){.  int nRem
15430 20 3d 20 70 53 65 67 2d 3e 6e 50 6f 73 3b 20 20   = pSeg->nPos;  
15440 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
15450 72 20 6f 66 20 62 79 74 65 73 20 73 74 69 6c 6c  r of bytes still
15460 20 74 6f 20 63 6f 6d 65 20 2a 2f 0a 20 20 46 74   to come */.  Ft
15470 73 35 44 61 74 61 20 2a 70 44 61 74 61 20 3d 20  s5Data *pData = 
15480 30 3b 0a 20 20 75 38 20 2a 70 43 68 75 6e 6b 20  0;.  u8 *pChunk 
15490 3d 20 26 70 53 65 67 2d 3e 70 4c 65 61 66 2d 3e  = &pSeg->pLeaf->
154a0 70 5b 70 53 65 67 2d 3e 69 4c 65 61 66 4f 66 66  p[pSeg->iLeafOff
154b0 73 65 74 5d 3b 0a 20 20 69 6e 74 20 6e 43 68 75  set];.  int nChu
154c0 6e 6b 20 3d 20 4d 49 4e 28 6e 52 65 6d 2c 20 70  nk = MIN(nRem, p
154d0 53 65 67 2d 3e 70 4c 65 61 66 2d 3e 6e 20 2d 20  Seg->pLeaf->n - 
154e0 70 53 65 67 2d 3e 69 4c 65 61 66 4f 66 66 73 65  pSeg->iLeafOffse
154f0 74 29 3b 0a 20 20 69 6e 74 20 70 67 6e 6f 20 3d  t);.  int pgno =
15500 20 70 53 65 67 2d 3e 69 4c 65 61 66 50 67 6e 6f   pSeg->iLeafPgno
15510 3b 0a 20 20 69 6e 74 20 70 67 6e 6f 53 61 76 65  ;.  int pgnoSave
15520 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20 28 70 53   = 0;..  if( (pS
15530 65 67 2d 3e 66 6c 61 67 73 20 26 20 46 54 53 35  eg->flags & FTS5
15540 5f 53 45 47 49 54 45 52 5f 52 45 56 45 52 53 45  _SEGITER_REVERSE
15550 29 3d 3d 30 20 29 7b 0a 20 20 20 20 70 67 6e 6f  )==0 ){.    pgno
15560 53 61 76 65 20 3d 20 70 67 6e 6f 2b 31 3b 0a 20  Save = pgno+1;. 
15570 20 7d 0a 0a 20 20 77 68 69 6c 65 28 20 31 20 29   }..  while( 1 )
15580 7b 0a 20 20 20 20 78 43 68 75 6e 6b 28 70 2c 20  {.    xChunk(p, 
15590 70 43 74 78 2c 20 70 43 68 75 6e 6b 2c 20 6e 43  pCtx, pChunk, nC
155a0 68 75 6e 6b 29 3b 0a 20 20 20 20 6e 52 65 6d 20  hunk);.    nRem 
155b0 2d 3d 20 6e 43 68 75 6e 6b 3b 0a 20 20 20 20 66  -= nChunk;.    f
155c0 74 73 35 44 61 74 61 52 65 6c 65 61 73 65 28 70  ts5DataRelease(p
155d0 44 61 74 61 29 3b 0a 20 20 20 20 69 66 28 20 6e  Data);.    if( n
155e0 52 65 6d 3c 3d 30 20 29 7b 0a 20 20 20 20 20 20  Rem<=0 ){.      
155f0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 65 6c 73 65  break;.    }else
15600 7b 0a 20 20 20 20 20 20 70 67 6e 6f 2b 2b 3b 0a  {.      pgno++;.
15610 20 20 20 20 20 20 70 44 61 74 61 20 3d 20 66 74        pData = ft
15620 73 35 44 61 74 61 52 65 61 64 28 70 2c 20 46 54  s5DataRead(p, FT
15630 53 35 5f 53 45 47 4d 45 4e 54 5f 52 4f 57 49 44  S5_SEGMENT_ROWID
15640 28 70 53 65 67 2d 3e 70 53 65 67 2d 3e 69 53 65  (pSeg->pSeg->iSe
15650 67 69 64 2c 20 30 2c 20 70 67 6e 6f 29 29 3b 0a  gid, 0, pgno));.
15660 20 20 20 20 20 20 69 66 28 20 70 44 61 74 61 3d        if( pData=
15670 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  =0 ) break;.    
15680 20 20 70 43 68 75 6e 6b 20 3d 20 26 70 44 61 74    pChunk = &pDat
15690 61 2d 3e 70 5b 34 5d 3b 0a 20 20 20 20 20 20 6e  a->p[4];.      n
156a0 43 68 75 6e 6b 20 3d 20 4d 49 4e 28 6e 52 65 6d  Chunk = MIN(nRem
156b0 2c 20 70 44 61 74 61 2d 3e 6e 20 2d 20 34 29 3b  , pData->n - 4);
156c0 0a 20 20 20 20 20 20 69 66 28 20 70 67 6e 6f 3d  .      if( pgno=
156d0 3d 70 67 6e 6f 53 61 76 65 20 29 7b 0a 20 20 20  =pgnoSave ){.   
156e0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 53 65       assert( pSe
156f0 67 2d 3e 70 4e 65 78 74 4c 65 61 66 3d 3d 30 20  g->pNextLeaf==0 
15700 29 3b 0a 20 20 20 20 20 20 20 20 70 53 65 67 2d  );.        pSeg-
15710 3e 70 4e 65 78 74 4c 65 61 66 20 3d 20 70 44 61  >pNextLeaf = pDa
15720 74 61 3b 0a 20 20 20 20 20 20 20 20 70 44 61 74  ta;.        pDat
15730 61 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20  a = 0;.      }. 
15740 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 0a 0a 2f 2a     }.  }.}..../*
15750 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e  .** Allocate a n
15760 65 77 20 73 65 67 6d 65 6e 74 2d 69 64 20 66 6f  ew segment-id fo
15770 72 20 74 68 65 20 73 74 72 75 63 74 75 72 65 20  r the structure 
15780 70 53 74 72 75 63 74 2e 20 54 68 65 20 6e 65 77  pStruct. The new
15790 20 73 65 67 6d 65 6e 74 0a 2a 2a 20 69 64 20 6d   segment.** id m
157a0 75 73 74 20 62 65 20 62 65 74 77 65 65 6e 20 31  ust be between 1
157b0 20 61 6e 64 20 36 35 33 33 35 20 69 6e 63 6c 75   and 65335 inclu
157c0 73 69 76 65 2c 20 61 6e 64 20 6d 75 73 74 20 6e  sive, and must n
157d0 6f 74 20 62 65 20 75 73 65 64 20 62 79 20 0a 2a  ot be used by .*
157e0 2a 20 61 6e 79 20 63 75 72 72 65 6e 74 6c 79 20  * any currently 
157f0 65 78 69 73 74 69 6e 67 20 73 65 67 6d 65 6e 74  existing segment
15800 2e 20 49 66 20 61 20 66 72 65 65 20 73 65 67 6d  . If a free segm
15810 65 6e 74 20 69 64 20 63 61 6e 6e 6f 74 20 62 65  ent id cannot be
15820 20 66 6f 75 6e 64 2c 0a 2a 2a 20 53 51 4c 49 54   found,.** SQLIT
15830 45 5f 46 55 4c 4c 20 69 73 20 72 65 74 75 72 6e  E_FULL is return
15840 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  ed..**.** If an 
15850 65 72 72 6f 72 20 68 61 73 20 61 6c 72 65 61 64  error has alread
15860 79 20 6f 63 63 75 72 72 65 64 2c 20 74 68 69 73  y occurred, this
15870 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e   function is a n
15880 6f 2d 6f 70 2e 20 30 20 69 73 20 0a 2a 2a 20 72  o-op. 0 is .** r
15890 65 74 75 72 6e 65 64 20 69 6e 20 74 68 69 73 20  eturned in this 
158a0 63 61 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  case..*/.static 
158b0 69 6e 74 20 66 74 73 35 41 6c 6c 6f 63 61 74 65  int fts5Allocate
158c0 53 65 67 69 64 28 46 74 73 35 49 6e 64 65 78 20  Segid(Fts5Index 
158d0 2a 70 2c 20 46 74 73 35 53 74 72 75 63 74 75 72  *p, Fts5Structur
158e0 65 20 2a 70 53 74 72 75 63 74 29 7b 0a 20 20 75  e *pStruct){.  u
158f0 33 32 20 69 53 65 67 69 64 20 3d 20 30 3b 0a 0a  32 iSegid = 0;..
15900 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c    if( p->rc==SQL
15910 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66  ITE_OK ){.    if
15920 28 20 70 53 74 72 75 63 74 2d 3e 6e 53 65 67 6d  ( pStruct->nSegm
15930 65 6e 74 3e 3d 46 54 53 35 5f 4d 41 58 5f 53 45  ent>=FTS5_MAX_SE
15940 47 4d 45 4e 54 20 29 7b 0a 20 20 20 20 20 20 70  GMENT ){.      p
15950 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 46 55  ->rc = SQLITE_FU
15960 4c 4c 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  LL;.    }else{. 
15970 20 20 20 20 20 77 68 69 6c 65 28 20 69 53 65 67       while( iSeg
15980 69 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  id==0 ){.       
15990 20 69 6e 74 20 69 4c 76 6c 2c 20 69 53 65 67 3b   int iLvl, iSeg;
159a0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
159b0 5f 72 61 6e 64 6f 6d 6e 65 73 73 28 73 69 7a 65  _randomness(size
159c0 6f 66 28 75 33 32 29 2c 20 28 76 6f 69 64 2a 29  of(u32), (void*)
159d0 26 69 53 65 67 69 64 29 3b 0a 20 20 20 20 20 20  &iSegid);.      
159e0 20 20 69 53 65 67 69 64 20 3d 20 28 69 53 65 67    iSegid = (iSeg
159f0 69 64 20 25 20 28 28 31 20 3c 3c 20 46 54 53 35  id % ((1 << FTS5
15a00 5f 44 41 54 41 5f 49 44 5f 42 29 20 2d 20 32 29  _DATA_ID_B) - 2)
15a10 29 20 2b 20 31 3b 0a 20 20 20 20 20 20 20 20 61  ) + 1;.        a
15a20 73 73 65 72 74 28 20 69 53 65 67 69 64 3e 30 20  ssert( iSegid>0 
15a30 26 26 20 69 53 65 67 69 64 3c 3d 36 35 35 33 35  && iSegid<=65535
15a40 20 29 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28   );.        for(
15a50 69 4c 76 6c 3d 30 3b 20 69 4c 76 6c 3c 70 53 74  iLvl=0; iLvl<pSt
15a60 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 3b 20 69 4c  ruct->nLevel; iL
15a70 76 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20  vl++){.         
15a80 20 66 6f 72 28 69 53 65 67 3d 30 3b 20 69 53 65   for(iSeg=0; iSe
15a90 67 3c 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65  g<pStruct->aLeve
15aa0 6c 5b 69 4c 76 6c 5d 2e 6e 53 65 67 3b 20 69 53  l[iLvl].nSeg; iS
15ab0 65 67 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20  eg++){.         
15ac0 20 20 20 69 66 28 20 69 53 65 67 69 64 3d 3d 70     if( iSegid==p
15ad0 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69  Struct->aLevel[i
15ae0 4c 76 6c 5d 2e 61 53 65 67 5b 69 53 65 67 5d 2e  Lvl].aSeg[iSeg].
15af0 69 53 65 67 69 64 20 29 7b 0a 20 20 20 20 20 20  iSegid ){.      
15b00 20 20 20 20 20 20 20 20 69 53 65 67 69 64 20 3d          iSegid =
15b10 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   0;.            
15b20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  }.          }.  
15b30 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
15b40 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74      }.  }..  ret
15b50 75 72 6e 20 28 69 6e 74 29 69 53 65 67 69 64 3b  urn (int)iSegid;
15b60 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 69 73 63 61 72  .}../*.** Discar
15b70 64 20 61 6c 6c 20 64 61 74 61 20 63 75 72 72 65  d all data curre
15b80 6e 74 6c 79 20 63 61 63 68 65 64 20 69 6e 20 74  ntly cached in t
15b90 68 65 20 68 61 73 68 2d 74 61 62 6c 65 73 2e 0a  he hash-tables..
15ba0 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
15bb0 74 73 35 49 6e 64 65 78 44 69 73 63 61 72 64 44  ts5IndexDiscardD
15bc0 61 74 61 28 46 74 73 35 49 6e 64 65 78 20 2a 70  ata(Fts5Index *p
15bd0 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  ){.  assert( p->
15be0 70 48 61 73 68 20 7c 7c 20 70 2d 3e 6e 50 65 6e  pHash || p->nPen
15bf0 64 69 6e 67 44 61 74 61 3d 3d 30 20 29 3b 0a 20  dingData==0 );. 
15c00 20 69 66 28 20 70 2d 3e 70 48 61 73 68 20 29 7b   if( p->pHash ){
15c10 0a 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35  .    sqlite3Fts5
15c20 48 61 73 68 43 6c 65 61 72 28 70 2d 3e 70 48 61  HashClear(p->pHa
15c30 73 68 29 3b 0a 20 20 20 20 70 2d 3e 6e 50 65 6e  sh);.    p->nPen
15c40 64 69 6e 67 44 61 74 61 20 3d 20 30 3b 0a 20 20  dingData = 0;.  
15c50 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  }.}../*.** Retur
15c60 6e 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  n the size of th
15c70 65 20 70 72 65 66 69 78 2c 20 69 6e 20 62 79 74  e prefix, in byt
15c80 65 73 2c 20 74 68 61 74 20 62 75 66 66 65 72 20  es, that buffer 
15c90 28 6e 4e 65 77 2f 70 4e 65 77 29 20 73 68 61 72  (nNew/pNew) shar
15ca0 65 73 0a 2a 2a 20 77 69 74 68 20 62 75 66 66 65  es.** with buffe
15cb0 72 20 28 6e 4f 6c 64 2f 70 4f 6c 64 29 2e 0a 2a  r (nOld/pOld)..*
15cc0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73  /.static int fts
15cd0 35 50 72 65 66 69 78 43 6f 6d 70 72 65 73 73 28  5PrefixCompress(
15ce0 0a 20 20 69 6e 74 20 6e 4f 6c 64 2c 20 63 6f 6e  .  int nOld, con
15cf0 73 74 20 75 38 20 2a 70 4f 6c 64 2c 0a 20 20 69  st u8 *pOld,.  i
15d00 6e 74 20 6e 4e 65 77 2c 20 63 6f 6e 73 74 20 75  nt nNew, const u
15d10 38 20 2a 70 4e 65 77 0a 29 7b 0a 20 20 69 6e 74  8 *pNew.){.  int
15d20 20 69 3b 0a 20 20 61 73 73 65 72 74 28 20 66 74   i;.  assert( ft
15d30 73 35 42 6c 6f 62 43 6f 6d 70 61 72 65 28 70 4f  s5BlobCompare(pO
15d40 6c 64 2c 20 6e 4f 6c 64 2c 20 70 4e 65 77 2c 20  ld, nOld, pNew, 
15d50 6e 4e 65 77 29 3c 30 20 29 3b 0a 20 20 66 6f 72  nNew)<0 );.  for
15d60 28 69 3d 30 3b 20 69 3c 6e 4f 6c 64 3b 20 69 2b  (i=0; i<nOld; i+
15d70 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 4f 6c 64  +){.    if( pOld
15d80 5b 69 5d 21 3d 70 4e 65 77 5b 69 5d 20 29 20 62  [i]!=pNew[i] ) b
15d90 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72 65 74 75  reak;.  }.  retu
15da0 72 6e 20 69 3b 0a 7d 0a 0a 73 74 61 74 69 63 20  rn i;.}..static 
15db0 76 6f 69 64 20 66 74 73 35 57 72 69 74 65 44 6c  void fts5WriteDl
15dc0 69 64 78 43 6c 65 61 72 28 0a 20 20 46 74 73 35  idxClear(.  Fts5
15dd0 49 6e 64 65 78 20 2a 70 2c 20 0a 20 20 46 74 73  Index *p, .  Fts
15de0 35 53 65 67 57 72 69 74 65 72 20 2a 70 57 72 69  5SegWriter *pWri
15df0 74 65 72 2c 0a 20 20 69 6e 74 20 62 46 6c 75 73  ter,.  int bFlus
15e00 68 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  h               
15e10 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 72 75         /* If tru
15e20 65 2c 20 77 72 69 74 65 20 64 6c 69 64 78 20 74  e, write dlidx t
15e30 6f 20 64 69 73 6b 20 2a 2f 0a 29 7b 0a 20 20 69  o disk */.){.  i
15e40 6e 74 20 69 3b 0a 20 20 61 73 73 65 72 74 28 20  nt i;.  assert( 
15e50 62 46 6c 75 73 68 3d 3d 30 20 7c 7c 20 28 70 57  bFlush==0 || (pW
15e60 72 69 74 65 72 2d 3e 6e 44 6c 69 64 78 3e 30 20  riter->nDlidx>0 
15e70 26 26 20 70 57 72 69 74 65 72 2d 3e 61 44 6c 69  && pWriter->aDli
15e80 64 78 5b 30 5d 2e 62 75 66 2e 6e 3e 30 29 20 29  dx[0].buf.n>0) )
15e90 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
15ea0 57 72 69 74 65 72 2d 3e 6e 44 6c 69 64 78 3b 20  Writer->nDlidx; 
15eb0 69 2b 2b 29 7b 0a 20 20 20 20 46 74 73 35 44 6c  i++){.    Fts5Dl
15ec0 69 64 78 57 72 69 74 65 72 20 2a 70 44 6c 69 64  idxWriter *pDlid
15ed0 78 20 3d 20 26 70 57 72 69 74 65 72 2d 3e 61 44  x = &pWriter->aD
15ee0 6c 69 64 78 5b 69 5d 3b 0a 20 20 20 20 69 66 28  lidx[i];.    if(
15ef0 20 70 44 6c 69 64 78 2d 3e 62 75 66 2e 6e 3d 3d   pDlidx->buf.n==
15f00 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 69  0 ) break;.    i
15f10 66 28 20 62 46 6c 75 73 68 20 29 7b 0a 20 20 20  f( bFlush ){.   
15f20 20 20 20 61 73 73 65 72 74 28 20 70 44 6c 69 64     assert( pDlid
15f30 78 2d 3e 70 67 6e 6f 21 3d 30 20 29 3b 0a 20 20  x->pgno!=0 );.  
15f40 20 20 20 20 66 74 73 35 44 61 74 61 57 72 69 74      fts5DataWrit
15f50 65 28 70 2c 20 0a 20 20 20 20 20 20 20 20 20 20  e(p, .          
15f60 46 54 53 35 5f 44 4c 49 44 58 5f 52 4f 57 49 44  FTS5_DLIDX_ROWID
15f70 28 70 57 72 69 74 65 72 2d 3e 69 53 65 67 69 64  (pWriter->iSegid
15f80 2c 20 69 2c 20 70 44 6c 69 64 78 2d 3e 70 67 6e  , i, pDlidx->pgn
15f90 6f 29 2c 0a 20 20 20 20 20 20 20 20 20 20 70 44  o),.          pD
15fa0 6c 69 64 78 2d 3e 62 75 66 2e 70 2c 20 70 44 6c  lidx->buf.p, pDl
15fb0 69 64 78 2d 3e 62 75 66 2e 6e 0a 20 20 20 20 20  idx->buf.n.     
15fc0 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71   );.    }.    sq
15fd0 6c 69 74 65 33 46 74 73 35 42 75 66 66 65 72 5a  lite3Fts5BufferZ
15fe0 65 72 6f 28 26 70 44 6c 69 64 78 2d 3e 62 75 66  ero(&pDlidx->buf
15ff0 29 3b 0a 20 20 20 20 70 44 6c 69 64 78 2d 3e 62  );.    pDlidx->b
16000 50 72 65 76 56 61 6c 69 64 20 3d 20 30 3b 0a 20  PrevValid = 0;. 
16010 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 72 6f 77   }.}../*.** Grow
16020 20 74 68 65 20 70 57 72 69 74 65 72 2d 3e 61 44   the pWriter->aD
16030 6c 69 64 78 5b 5d 20 61 72 72 61 79 20 74 6f 20  lidx[] array to 
16040 61 74 20 6c 65 61 73 74 20 6e 4c 76 6c 20 65 6c  at least nLvl el
16050 65 6d 65 6e 74 73 20 69 6e 20 73 69 7a 65 2e 0a  ements in size..
16060 2a 2a 20 41 6e 79 20 6e 65 77 20 61 72 72 61 79  ** Any new array
16070 20 65 6c 65 6d 65 6e 74 73 20 61 72 65 20 7a 65   elements are ze
16080 72 6f 65 64 20 62 65 66 6f 72 65 20 72 65 74 75  roed before retu
16090 72 6e 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63  rning..*/.static
160a0 20 69 6e 74 20 66 74 73 35 57 72 69 74 65 44 6c   int fts5WriteDl
160b0 69 64 78 47 72 6f 77 28 0a 20 20 46 74 73 35 49  idxGrow(.  Fts5I
160c0 6e 64 65 78 20 2a 70 2c 0a 20 20 46 74 73 35 53  ndex *p,.  Fts5S
160d0 65 67 57 72 69 74 65 72 20 2a 70 57 72 69 74 65  egWriter *pWrite
160e0 72 2c 0a 20 20 69 6e 74 20 6e 4c 76 6c 0a 29 7b  r,.  int nLvl.){
160f0 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51  .  if( p->rc==SQ
16100 4c 49 54 45 5f 4f 4b 20 26 26 20 6e 4c 76 6c 3e  LITE_OK && nLvl>
16110 3d 70 57 72 69 74 65 72 2d 3e 6e 44 6c 69 64 78  =pWriter->nDlidx
16120 20 29 7b 0a 20 20 20 20 46 74 73 35 44 6c 69 64   ){.    Fts5Dlid
16130 78 57 72 69 74 65 72 20 2a 61 44 6c 69 64 78 20  xWriter *aDlidx 
16140 3d 20 28 46 74 73 35 44 6c 69 64 78 57 72 69 74  = (Fts5DlidxWrit
16150 65 72 2a 29 73 71 6c 69 74 65 33 5f 72 65 61 6c  er*)sqlite3_real
16160 6c 6f 63 28 0a 20 20 20 20 20 20 20 20 70 57 72  loc(.        pWr
16170 69 74 65 72 2d 3e 61 44 6c 69 64 78 2c 20 73 69  iter->aDlidx, si
16180 7a 65 6f 66 28 46 74 73 35 44 6c 69 64 78 57 72  zeof(Fts5DlidxWr
16190 69 74 65 72 29 20 2a 20 6e 4c 76 6c 0a 20 20 20  iter) * nLvl.   
161a0 20 29 3b 0a 20 20 20 20 69 66 28 20 61 44 6c 69   );.    if( aDli
161b0 64 78 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70  dx==0 ){.      p
161c0 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f  ->rc = SQLITE_NO
161d0 4d 45 4d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  MEM;.    }else{.
161e0 20 20 20 20 20 20 69 6e 74 20 6e 42 79 74 65 20        int nByte 
161f0 3d 20 73 69 7a 65 6f 66 28 46 74 73 35 44 6c 69  = sizeof(Fts5Dli
16200 64 78 57 72 69 74 65 72 29 20 2a 20 28 6e 4c 76  dxWriter) * (nLv
16210 6c 20 2d 20 70 57 72 69 74 65 72 2d 3e 6e 44 6c  l - pWriter->nDl
16220 69 64 78 29 3b 0a 20 20 20 20 20 20 6d 65 6d 73  idx);.      mems
16230 65 74 28 26 61 44 6c 69 64 78 5b 70 57 72 69 74  et(&aDlidx[pWrit
16240 65 72 2d 3e 6e 44 6c 69 64 78 5d 2c 20 30 2c 20  er->nDlidx], 0, 
16250 6e 42 79 74 65 29 3b 0a 20 20 20 20 20 20 70 57  nByte);.      pW
16260 72 69 74 65 72 2d 3e 61 44 6c 69 64 78 20 3d 20  riter->aDlidx = 
16270 61 44 6c 69 64 78 3b 0a 20 20 20 20 20 20 70 57  aDlidx;.      pW
16280 72 69 74 65 72 2d 3e 6e 44 6c 69 64 78 20 3d 20  riter->nDlidx = 
16290 6e 4c 76 6c 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  nLvl;.    }.  }.
162a0 20 20 72 65 74 75 72 6e 20 70 2d 3e 72 63 3b 0a    return p->rc;.
162b0 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 61 6e 20 22  }../*.** If an "
162c0 6e 45 6d 70 74 79 22 20 72 65 63 6f 72 64 20 6d  nEmpty" record m
162d0 75 73 74 20 62 65 20 77 72 69 74 74 65 6e 20 74  ust be written t
162e0 6f 20 74 68 65 20 62 2d 74 72 65 65 20 62 65 66  o the b-tree bef
162f0 6f 72 65 20 74 68 65 20 6e 65 78 74 0a 2a 2a 20  ore the next.** 
16300 74 65 72 6d 2c 20 77 72 69 74 65 20 69 74 20 6e  term, write it n
16310 6f 77 2e 20 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ow. .*/.static v
16320 6f 69 64 20 66 74 73 35 57 72 69 74 65 42 74 72  oid fts5WriteBtr
16330 65 65 4e 45 6d 70 74 79 28 46 74 73 35 49 6e 64  eeNEmpty(Fts5Ind
16340 65 78 20 2a 70 2c 20 46 74 73 35 53 65 67 57 72  ex *p, Fts5SegWr
16350 69 74 65 72 20 2a 70 57 72 69 74 65 72 29 7b 0a  iter *pWriter){.
16360 20 20 69 66 28 20 70 57 72 69 74 65 72 2d 3e 6e    if( pWriter->n
16370 45 6d 70 74 79 20 29 7b 0a 20 20 20 20 69 6e 74  Empty ){.    int
16380 20 62 46 6c 61 67 20 3d 20 30 3b 0a 20 20 20 20   bFlag = 0;.    
16390 46 74 73 35 50 61 67 65 57 72 69 74 65 72 20 2a  Fts5PageWriter *
163a0 70 50 67 3b 0a 20 20 20 20 70 50 67 20 3d 20 26  pPg;.    pPg = &
163b0 70 57 72 69 74 65 72 2d 3e 61 57 72 69 74 65 72  pWriter->aWriter
163c0 5b 31 5d 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20  [1];..    /* If 
163d0 74 68 65 72 65 20 77 65 72 65 20 46 54 53 35 5f  there were FTS5_
163e0 4d 49 4e 5f 44 4c 49 44 58 5f 53 49 5a 45 20 6f  MIN_DLIDX_SIZE o
163f0 72 20 6d 6f 72 65 20 65 6d 70 74 79 20 6c 65 61  r more empty lea
16400 66 20 70 61 67 65 73 20 77 72 69 74 74 65 6e 0a  f pages written.
16410 20 20 20 20 2a 2a 20 74 6f 20 74 68 65 20 64 61      ** to the da
16420 74 61 62 61 73 65 2c 20 61 6c 73 6f 20 77 72 69  tabase, also wri
16430 74 65 20 74 68 65 20 64 6f 63 6c 69 73 74 2d 69  te the doclist-i
16440 6e 64 65 78 20 74 6f 20 64 69 73 6b 2e 20 20 2a  ndex to disk.  *
16450 2f 0a 20 20 20 20 69 66 28 20 70 57 72 69 74 65  /.    if( pWrite
16460 72 2d 3e 61 44 6c 69 64 78 5b 30 5d 2e 62 75 66  r->aDlidx[0].buf
16470 2e 6e 3e 30 20 26 26 20 70 57 72 69 74 65 72 2d  .n>0 && pWriter-
16480 3e 6e 45 6d 70 74 79 3e 3d 46 54 53 35 5f 4d 49  >nEmpty>=FTS5_MI
16490 4e 5f 44 4c 49 44 58 5f 53 49 5a 45 20 29 7b 0a  N_DLIDX_SIZE ){.
164a0 20 20 20 20 20 20 62 46 6c 61 67 20 3d 20 31 3b        bFlag = 1;
164b0 0a 20 20 20 20 7d 0a 20 20 20 20 66 74 73 35 57  .    }.    fts5W
164c0 72 69 74 65 44 6c 69 64 78 43 6c 65 61 72 28 70  riteDlidxClear(p
164d0 2c 20 70 57 72 69 74 65 72 2c 20 62 46 6c 61 67  , pWriter, bFlag
164e0 29 3b 0a 20 20 20 20 66 74 73 35 42 75 66 66 65  );.    fts5Buffe
164f0 72 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26 70  rAppendVarint(&p
16500 2d 3e 72 63 2c 20 26 70 50 67 2d 3e 62 75 66 2c  ->rc, &pPg->buf,
16510 20 62 46 6c 61 67 29 3b 0a 20 20 20 20 66 74 73   bFlag);.    fts
16520 35 42 75 66 66 65 72 41 70 70 65 6e 64 56 61 72  5BufferAppendVar
16530 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26 70 50 67  int(&p->rc, &pPg
16540 2d 3e 62 75 66 2c 20 70 57 72 69 74 65 72 2d 3e  ->buf, pWriter->
16550 6e 45 6d 70 74 79 29 3b 0a 20 20 20 20 70 57 72  nEmpty);.    pWr
16560 69 74 65 72 2d 3e 6e 45 6d 70 74 79 20 3d 20 30  iter->nEmpty = 0
16570 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66  ;.  }else{.    f
16580 74 73 35 57 72 69 74 65 44 6c 69 64 78 43 6c 65  ts5WriteDlidxCle
16590 61 72 28 70 2c 20 70 57 72 69 74 65 72 2c 20 30  ar(p, pWriter, 0
165a0 29 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74  );.  }..  assert
165b0 28 20 70 57 72 69 74 65 72 2d 3e 6e 44 6c 69 64  ( pWriter->nDlid
165c0 78 3d 3d 30 20 7c 7c 20 70 57 72 69 74 65 72 2d  x==0 || pWriter-
165d0 3e 61 44 6c 69 64 78 5b 30 5d 2e 62 75 66 2e 6e  >aDlidx[0].buf.n
165e0 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
165f0 20 70 57 72 69 74 65 72 2d 3e 6e 44 6c 69 64 78   pWriter->nDlidx
16600 3d 3d 30 20 7c 7c 20 70 57 72 69 74 65 72 2d 3e  ==0 || pWriter->
16610 61 44 6c 69 64 78 5b 30 5d 2e 62 50 72 65 76 56  aDlidx[0].bPrevV
16620 61 6c 69 64 3d 3d 30 20 29 3b 0a 7d 0a 0a 73 74  alid==0 );.}..st
16630 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 57 72  atic void fts5Wr
16640 69 74 65 42 74 72 65 65 47 72 6f 77 28 46 74 73  iteBtreeGrow(Fts
16650 35 49 6e 64 65 78 20 2a 70 2c 20 46 74 73 35 53  5Index *p, Fts5S
16660 65 67 57 72 69 74 65 72 20 2a 70 57 72 69 74 65  egWriter *pWrite
16670 72 29 7b 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d  r){.  if( p->rc=
16680 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
16690 20 20 46 74 73 35 50 61 67 65 57 72 69 74 65 72    Fts5PageWriter
166a0 20 2a 61 4e 65 77 3b 0a 20 20 20 20 46 74 73 35   *aNew;.    Fts5
166b0 50 61 67 65 57 72 69 74 65 72 20 2a 70 4e 65 77  PageWriter *pNew
166c0 3b 0a 20 20 20 20 69 6e 74 20 6e 4e 65 77 20 3d  ;.    int nNew =
166d0 20 73 69 7a 65 6f 66 28 46 74 73 35 50 61 67 65   sizeof(Fts5Page
166e0 57 72 69 74 65 72 29 20 2a 20 28 70 57 72 69 74  Writer) * (pWrit
166f0 65 72 2d 3e 6e 57 72 69 74 65 72 2b 31 29 3b 0a  er->nWriter+1);.
16700 0a 20 20 20 20 61 4e 65 77 20 3d 20 28 46 74 73  .    aNew = (Fts
16710 35 50 61 67 65 57 72 69 74 65 72 2a 29 73 71 6c  5PageWriter*)sql
16720 69 74 65 33 5f 72 65 61 6c 6c 6f 63 28 70 57 72  ite3_realloc(pWr
16730 69 74 65 72 2d 3e 61 57 72 69 74 65 72 2c 20 6e  iter->aWriter, n
16740 4e 65 77 29 3b 0a 20 20 20 20 69 66 28 20 61 4e  New);.    if( aN
16750 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70  ew==0 ){.      p
16760 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f  ->rc = SQLITE_NO
16770 4d 45 4d 3b 0a 20 20 20 20 20 20 72 65 74 75 72  MEM;.      retur
16780 6e 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 4e  n;.    }..    pN
16790 65 77 20 3d 20 26 61 4e 65 77 5b 70 57 72 69 74  ew = &aNew[pWrit
167a0 65 72 2d 3e 6e 57 72 69 74 65 72 5d 3b 0a 20 20  er->nWriter];.  
167b0 20 20 6d 65 6d 73 65 74 28 70 4e 65 77 2c 20 30    memset(pNew, 0
167c0 2c 20 73 69 7a 65 6f 66 28 46 74 73 35 50 61 67  , sizeof(Fts5Pag
167d0 65 57 72 69 74 65 72 29 29 3b 0a 20 20 20 20 70  eWriter));.    p
167e0 4e 65 77 2d 3e 70 67 6e 6f 20 3d 20 31 3b 0a 20  New->pgno = 1;. 
167f0 20 20 20 66 74 73 35 42 75 66 66 65 72 41 70 70     fts5BufferApp
16800 65 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e 72 63  endVarint(&p->rc
16810 2c 20 26 70 4e 65 77 2d 3e 62 75 66 2c 20 31 29  , &pNew->buf, 1)
16820 3b 0a 0a 20 20 20 20 70 57 72 69 74 65 72 2d 3e  ;..    pWriter->
16830 6e 57 72 69 74 65 72 2b 2b 3b 0a 20 20 20 20 70  nWriter++;.    p
16840 57 72 69 74 65 72 2d 3e 61 57 72 69 74 65 72 20  Writer->aWriter 
16850 3d 20 61 4e 65 77 3b 0a 20 20 7d 0a 7d 0a 0a 2f  = aNew;.  }.}../
16860 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 63 61 6c  *.** This is cal
16870 6c 65 64 20 6f 6e 63 65 20 66 6f 72 20 65 61 63  led once for eac
16880 68 20 6c 65 61 66 20 70 61 67 65 20 65 78 63 65  h leaf page exce
16890 70 74 20 74 68 65 20 66 69 72 73 74 20 74 68 61  pt the first tha
168a0 74 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20 61 74  t contains.** at
168b0 20 6c 65 61 73 74 20 6f 6e 65 20 74 65 72 6d 2e   least one term.
168c0 20 41 72 67 75 6d 65 6e 74 20 28 6e 54 65 72 6d   Argument (nTerm
168d0 2f 70 54 65 72 6d 29 20 69 73 20 74 68 65 20 73  /pTerm) is the s
168e0 70 6c 69 74 2d 6b 65 79 20 2d 20 61 20 74 65 72  plit-key - a ter
168f0 6d 20 74 68 61 74 0a 2a 2a 20 69 73 20 6c 61 72  m that.** is lar
16900 67 65 72 20 74 68 61 6e 20 61 6c 6c 20 74 65 72  ger than all ter
16910 6d 73 20 77 72 69 74 74 65 6e 20 74 6f 20 65 61  ms written to ea
16920 72 6c 69 65 72 20 6c 65 61 76 65 73 2c 20 61 6e  rlier leaves, an
16930 64 20 65 71 75 61 6c 20 74 6f 20 6f 72 0a 2a 2a  d equal to or.**
16940 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 74 68   smaller than th
16950 65 20 66 69 72 73 74 20 74 65 72 6d 20 6f 6e 20  e first term on 
16960 74 68 65 20 6e 65 77 20 6c 65 61 66 2e 0a 2a 2a  the new leaf..**
16970 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20  .** If an error 
16980 6f 63 63 75 72 73 2c 20 61 6e 20 65 72 72 6f 72  occurs, an error
16990 20 63 6f 64 65 20 69 73 20 6c 65 66 74 20 69 6e   code is left in
169a0 20 46 74 73 35 49 6e 64 65 78 2e 72 63 2e 20 49   Fts5Index.rc. I
169b0 66 20 61 6e 20 65 72 72 6f 72 0a 2a 2a 20 68 61  f an error.** ha
169c0 73 20 61 6c 72 65 61 64 79 20 6f 63 63 75 72 72  s already occurr
169d0 65 64 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e  ed when this fun
169e0 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c  ction is called,
169f0 20 69 74 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a   it is a no-op..
16a00 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
16a10 74 73 35 57 72 69 74 65 42 74 72 65 65 54 65 72  ts5WriteBtreeTer
16a20 6d 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a  m(.  Fts5Index *
16a30 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
16a40 20 20 20 20 20 2f 2a 20 46 54 53 35 20 62 61 63       /* FTS5 bac
16a50 6b 65 6e 64 20 6f 62 6a 65 63 74 20 2a 2f 0a 20  kend object */. 
16a60 20 46 74 73 35 53 65 67 57 72 69 74 65 72 20 2a   Fts5SegWriter *
16a70 70 57 72 69 74 65 72 2c 20 20 20 20 20 20 20 20  pWriter,        
16a80 20 2f 2a 20 57 72 69 74 65 72 20 6f 62 6a 65 63   /* Writer objec
16a90 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 54 65 72 6d  t */.  int nTerm
16aa0 2c 20 63 6f 6e 73 74 20 75 38 20 2a 70 54 65 72  , const u8 *pTer
16ab0 6d 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20  m      /* First 
16ac0 74 65 72 6d 20 6f 6e 20 6e 65 77 20 70 61 67 65  term on new page
16ad0 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 48 65   */.){.  int iHe
16ae0 69 67 68 74 3b 0a 20 20 66 6f 72 28 69 48 65 69  ight;.  for(iHei
16af0 67 68 74 3d 31 3b 20 31 3b 20 69 48 65 69 67 68  ght=1; 1; iHeigh
16b00 74 2b 2b 29 7b 0a 20 20 20 20 46 74 73 35 50 61  t++){.    Fts5Pa
16b10 67 65 57 72 69 74 65 72 20 2a 70 50 61 67 65 3b  geWriter *pPage;
16b20 0a 0a 20 20 20 20 69 66 28 20 69 48 65 69 67 68  ..    if( iHeigh
16b30 74 3e 3d 70 57 72 69 74 65 72 2d 3e 6e 57 72 69  t>=pWriter->nWri
16b40 74 65 72 20 29 7b 0a 20 20 20 20 20 20 66 74 73  ter ){.      fts
16b50 35 57 72 69 74 65 42 74 72 65 65 47 72 6f 77 28  5WriteBtreeGrow(
16b60 70 2c 20 70 57 72 69 74 65 72 29 3b 0a 20 20 20  p, pWriter);.   
16b70 20 20 20 69 66 28 20 70 2d 3e 72 63 20 29 20 72     if( p->rc ) r
16b80 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20  eturn;.    }.   
16b90 20 70 50 61 67 65 20 3d 20 26 70 57 72 69 74 65   pPage = &pWrite
16ba0 72 2d 3e 61 57 72 69 74 65 72 5b 69 48 65 69 67  r->aWriter[iHeig
16bb0 68 74 5d 3b 0a 0a 20 20 20 20 66 74 73 35 57 72  ht];..    fts5Wr
16bc0 69 74 65 42 74 72 65 65 4e 45 6d 70 74 79 28 70  iteBtreeNEmpty(p
16bd0 2c 20 70 57 72 69 74 65 72 29 3b 0a 0a 20 20 20  , pWriter);..   
16be0 20 69 66 28 20 70 50 61 67 65 2d 3e 62 75 66 2e   if( pPage->buf.
16bf0 6e 3e 3d 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e 70  n>=p->pConfig->p
16c00 67 73 7a 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  gsz ){.      /* 
16c10 70 50 61 67 65 20 77 69 6c 6c 20 62 65 20 77 72  pPage will be wr
16c20 69 74 74 65 6e 20 74 6f 20 64 69 73 6b 2e 20 54  itten to disk. T
16c30 68 65 20 74 65 72 6d 20 77 69 6c 6c 20 62 65 20  he term will be 
16c40 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65  written into the
16c50 0a 20 20 20 20 20 20 2a 2a 20 70 61 72 65 6e 74  .      ** parent
16c60 20 6f 66 20 70 50 61 67 65 2e 20 20 2a 2f 0a 20   of pPage.  */. 
16c70 20 20 20 20 20 69 36 34 20 69 52 6f 77 69 64 20       i64 iRowid 
16c80 3d 20 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f 52  = FTS5_SEGMENT_R
16c90 4f 57 49 44 28 70 57 72 69 74 65 72 2d 3e 69 53  OWID(pWriter->iS
16ca0 65 67 69 64 2c 20 69 48 65 69 67 68 74 2c 20 70  egid, iHeight, p
16cb0 50 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20  Page->pgno);.   
16cc0 20 20 20 66 74 73 35 44 61 74 61 57 72 69 74 65     fts5DataWrite
16cd0 28 70 2c 20 69 52 6f 77 69 64 2c 20 70 50 61 67  (p, iRowid, pPag
16ce0 65 2d 3e 62 75 66 2e 70 2c 20 70 50 61 67 65 2d  e->buf.p, pPage-
16cf0 3e 62 75 66 2e 6e 29 3b 0a 20 20 20 20 20 20 66  >buf.n);.      f
16d00 74 73 35 42 75 66 66 65 72 5a 65 72 6f 28 26 70  ts5BufferZero(&p
16d10 50 61 67 65 2d 3e 62 75 66 29 3b 0a 20 20 20 20  Page->buf);.    
16d20 20 20 66 74 73 35 42 75 66 66 65 72 5a 65 72 6f    fts5BufferZero
16d30 28 26 70 50 61 67 65 2d 3e 74 65 72 6d 29 3b 0a  (&pPage->term);.
16d40 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72        fts5Buffer
16d50 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26 70 2d  AppendVarint(&p-
16d60 3e 72 63 2c 20 26 70 50 61 67 65 2d 3e 62 75 66  >rc, &pPage->buf
16d70 2c 20 70 50 61 67 65 5b 2d 31 5d 2e 70 67 6e 6f  , pPage[-1].pgno
16d80 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65 2d 3e  );.      pPage->
16d90 70 67 6e 6f 2b 2b 3b 0a 20 20 20 20 7d 65 6c 73  pgno++;.    }els
16da0 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 50 72  e{.      int nPr
16db0 65 20 3d 20 66 74 73 35 50 72 65 66 69 78 43 6f  e = fts5PrefixCo
16dc0 6d 70 72 65 73 73 28 70 50 61 67 65 2d 3e 74 65  mpress(pPage->te
16dd0 72 6d 2e 6e 2c 20 70 50 61 67 65 2d 3e 74 65 72  rm.n, pPage->ter
16de0 6d 2e 70 2c 20 6e 54 65 72 6d 2c 20 70 54 65 72  m.p, nTerm, pTer
16df0 6d 29 3b 0a 20 20 20 20 20 20 66 74 73 35 42 75  m);.      fts5Bu
16e00 66 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e 74  fferAppendVarint
16e10 28 26 70 2d 3e 72 63 2c 20 26 70 50 61 67 65 2d  (&p->rc, &pPage-
16e20 3e 62 75 66 2c 20 6e 50 72 65 2b 32 29 3b 0a 20  >buf, nPre+2);. 
16e30 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72 41       fts5BufferA
16e40 70 70 65 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e  ppendVarint(&p->
16e50 72 63 2c 20 26 70 50 61 67 65 2d 3e 62 75 66 2c  rc, &pPage->buf,
16e60 20 6e 54 65 72 6d 2d 6e 50 72 65 29 3b 0a 20 20   nTerm-nPre);.  
16e70 20 20 20 20 66 74 73 35 42 75 66 66 65 72 41 70      fts5BufferAp
16e80 70 65 6e 64 42 6c 6f 62 28 26 70 2d 3e 72 63 2c  pendBlob(&p->rc,
16e90 20 26 70 50 61 67 65 2d 3e 62 75 66 2c 20 6e 54   &pPage->buf, nT
16ea0 65 72 6d 2d 6e 50 72 65 2c 20 70 54 65 72 6d 2b  erm-nPre, pTerm+
16eb0 6e 50 72 65 29 3b 0a 20 20 20 20 20 20 66 74 73  nPre);.      fts
16ec0 35 42 75 66 66 65 72 53 65 74 28 26 70 2d 3e 72  5BufferSet(&p->r
16ed0 63 2c 20 26 70 50 61 67 65 2d 3e 74 65 72 6d 2c  c, &pPage->term,
16ee0 20 6e 54 65 72 6d 2c 20 70 54 65 72 6d 29 3b 0a   nTerm, pTerm);.
16ef0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
16f00 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
16f10 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
16f20 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 66 6c 75   called when flu
16f30 73 68 69 6e 67 20 61 20 6c 65 61 66 20 70 61 67  shing a leaf pag
16f40 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20  e that contains 
16f50 6e 6f 0a 2a 2a 20 74 65 72 6d 73 20 61 74 20 61  no.** terms at a
16f60 6c 6c 20 74 6f 20 64 69 73 6b 2e 0a 2a 2f 0a 73  ll to disk..*/.s
16f70 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 57  tatic void fts5W
16f80 72 69 74 65 42 74 72 65 65 4e 6f 54 65 72 6d 28  riteBtreeNoTerm(
16f90 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c  .  Fts5Index *p,
16fa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16fb0 20 20 20 2f 2a 20 46 54 53 35 20 62 61 63 6b 65     /* FTS5 backe
16fc0 6e 64 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 46  nd object */.  F
16fd0 74 73 35 53 65 67 57 72 69 74 65 72 20 2a 70 57  ts5SegWriter *pW
16fe0 72 69 74 65 72 20 20 20 20 20 20 20 20 20 20 2f  riter          /
16ff0 2a 20 57 72 69 74 65 72 20 6f 62 6a 65 63 74 20  * Writer object 
17000 2a 2f 0a 29 7b 0a 20 20 2f 2a 20 49 66 20 74 68  */.){.  /* If th
17010 65 72 65 20 77 65 72 65 20 6e 6f 20 72 6f 77 69  ere were no rowi
17020 64 73 20 6f 6e 20 74 68 65 20 6c 65 61 66 20 70  ds on the leaf p
17030 61 67 65 20 65 69 74 68 65 72 20 61 6e 64 20 74  age either and t
17040 68 65 20 64 6f 63 6c 69 73 74 2d 69 6e 64 65 78  he doclist-index
17050 0a 20 20 2a 2a 20 68 61 73 20 61 6c 72 65 61 64  .  ** has alread
17060 79 20 62 65 65 6e 20 73 74 61 72 74 65 64 2c 20  y been started, 
17070 61 70 70 65 6e 64 20 61 6e 20 30 78 30 30 20 62  append an 0x00 b
17080 79 74 65 20 74 6f 20 69 74 2e 20 20 2a 2f 0a 20  yte to it.  */. 
17090 20 69 66 28 20 70 57 72 69 74 65 72 2d 3e 62 46   if( pWriter->bF
170a0 69 72 73 74 52 6f 77 69 64 49 6e 50 61 67 65 20  irstRowidInPage 
170b0 26 26 20 70 57 72 69 74 65 72 2d 3e 61 44 6c 69  && pWriter->aDli
170c0 64 78 5b 30 5d 2e 62 75 66 2e 6e 3e 30 20 29 7b  dx[0].buf.n>0 ){
170d0 0a 20 20 20 20 46 74 73 35 44 6c 69 64 78 57 72  .    Fts5DlidxWr
170e0 69 74 65 72 20 2a 70 44 6c 69 64 78 20 3d 20 26  iter *pDlidx = &
170f0 70 57 72 69 74 65 72 2d 3e 61 44 6c 69 64 78 5b  pWriter->aDlidx[
17100 30 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  0];.    assert( 
17110 70 44 6c 69 64 78 2d 3e 62 50 72 65 76 56 61 6c  pDlidx->bPrevVal
17120 69 64 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  id );.    sqlite
17130 33 46 74 73 35 42 75 66 66 65 72 41 70 70 65 6e  3Fts5BufferAppen
17140 64 56 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20  dVarint(&p->rc, 
17150 26 70 44 6c 69 64 78 2d 3e 62 75 66 2c 20 30 29  &pDlidx->buf, 0)
17160 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 6e 63 72  ;.  }..  /* Incr
17170 65 6d 65 6e 74 20 74 68 65 20 22 6e 75 6d 62 65  ement the "numbe
17180 72 20 6f 66 20 73 65 71 75 65 6e 74 69 61 6c 20  r of sequential 
17190 6c 65 61 76 65 73 20 77 69 74 68 6f 75 74 20 61  leaves without a
171a0 20 74 65 72 6d 22 20 63 6f 75 6e 74 65 72 2e 20   term" counter. 
171b0 2a 2f 0a 20 20 70 57 72 69 74 65 72 2d 3e 6e 45  */.  pWriter->nE
171c0 6d 70 74 79 2b 2b 3b 0a 7d 0a 0a 73 74 61 74 69  mpty++;.}..stati
171d0 63 20 69 36 34 20 66 74 73 35 44 6c 69 64 78 45  c i64 fts5DlidxE
171e0 78 74 72 61 63 74 46 69 72 73 74 52 6f 77 69 64  xtractFirstRowid
171f0 28 46 74 73 35 42 75 66 66 65 72 20 2a 70 42 75  (Fts5Buffer *pBu
17200 66 29 7b 0a 20 20 69 36 34 20 69 52 6f 77 69 64  f){.  i64 iRowid
17210 3b 0a 20 20 69 6e 74 20 69 4f 66 66 3b 0a 0a 20  ;.  int iOff;.. 
17220 20 69 4f 66 66 20 3d 20 31 20 2b 20 66 74 73 35   iOff = 1 + fts5
17230 47 65 74 56 61 72 69 6e 74 28 26 70 42 75 66 2d  GetVarint(&pBuf-
17240 3e 70 5b 31 5d 2c 20 28 75 36 34 2a 29 26 69 52  >p[1], (u64*)&iR
17250 6f 77 69 64 29 3b 0a 20 20 66 74 73 35 47 65 74  owid);.  fts5Get
17260 56 61 72 69 6e 74 28 26 70 42 75 66 2d 3e 70 5b  Varint(&pBuf->p[
17270 69 4f 66 66 5d 2c 20 28 75 36 34 2a 29 26 69 52  iOff], (u64*)&iR
17280 6f 77 69 64 29 3b 0a 20 20 72 65 74 75 72 6e 20  owid);.  return 
17290 69 52 6f 77 69 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  iRowid;.}../*.**
172a0 20 52 6f 77 69 64 20 69 52 6f 77 69 64 20 68 61   Rowid iRowid ha
172b0 73 20 6a 75 73 74 20 62 65 65 6e 20 61 70 70 65  s just been appe
172c0 6e 64 65 64 20 74 6f 20 74 68 65 20 63 75 72 72  nded to the curr
172d0 65 6e 74 20 6c 65 61 66 20 70 61 67 65 2e 20 49  ent leaf page. I
172e0 74 20 69 73 20 74 68 65 0a 2a 2a 20 66 69 72 73  t is the.** firs
172f0 74 20 6f 6e 20 74 68 65 20 70 61 67 65 2e 20 54  t on the page. T
17300 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 70 70  his function app
17310 65 6e 64 73 20 61 6e 20 61 70 70 72 6f 70 72 69  ends an appropri
17320 61 74 65 20 65 6e 74 72 79 20 74 6f 20 74 68 65  ate entry to the
17330 20 63 75 72 72 65 6e 74 0a 2a 2a 20 64 6f 63 6c   current.** docl
17340 69 73 74 2d 69 6e 64 65 78 2e 0a 2a 2f 0a 73 74  ist-index..*/.st
17350 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 57 72  atic void fts5Wr
17360 69 74 65 44 6c 69 64 78 41 70 70 65 6e 64 28 0a  iteDlidxAppend(.
17370 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20    Fts5Index *p, 
17380 0a 20 20 46 74 73 35 53 65 67 57 72 69 74 65 72  .  Fts5SegWriter
17390 20 2a 70 57 72 69 74 65 72 2c 20 0a 20 20 69 36   *pWriter, .  i6
173a0 34 20 69 52 6f 77 69 64 0a 29 7b 0a 20 20 69 6e  4 iRowid.){.  in
173b0 74 20 69 3b 0a 20 20 69 6e 74 20 62 44 6f 6e 65  t i;.  int bDone
173c0 20 3d 20 30 3b 0a 0a 20 20 66 6f 72 28 69 3d 30   = 0;..  for(i=0
173d0 3b 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ; p->rc==SQLITE_
173e0 4f 4b 20 26 26 20 62 44 6f 6e 65 3d 3d 30 3b 20  OK && bDone==0; 
173f0 69 2b 2b 29 7b 0a 20 20 20 20 69 36 34 20 69 56  i++){.    i64 iV
17400 61 6c 3b 0a 20 20 20 20 46 74 73 35 44 6c 69 64  al;.    Fts5Dlid
17410 78 57 72 69 74 65 72 20 2a 70 44 6c 69 64 78 20  xWriter *pDlidx 
17420 3d 20 26 70 57 72 69 74 65 72 2d 3e 61 44 6c 69  = &pWriter->aDli
17430 64 78 5b 69 5d 3b 0a 0a 20 20 20 20 69 66 28 20  dx[i];..    if( 
17440 70 44 6c 69 64 78 2d 3e 62 75 66 2e 6e 3e 3d 70  pDlidx->buf.n>=p
17450 2d 3e 70 43 6f 6e 66 69 67 2d 3e 70 67 73 7a 20  ->pConfig->pgsz 
17460 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ){.      /* The 
17470 63 75 72 72 65 6e 74 20 64 6f 63 6c 69 73 74 2d  current doclist-
17480 69 6e 64 65 78 20 70 61 67 65 20 69 73 20 66 75  index page is fu
17490 6c 6c 2e 20 57 72 69 74 65 20 69 74 20 74 6f 20  ll. Write it to 
174a0 64 69 73 6b 20 61 6e 64 20 70 75 73 68 0a 20 20  disk and push.  
174b0 20 20 20 20 2a 2a 20 61 20 63 6f 70 79 20 6f 66      ** a copy of
174c0 20 69 52 6f 77 69 64 20 28 77 68 69 63 68 20 77   iRowid (which w
174d0 69 6c 6c 20 62 65 63 6f 6d 65 20 74 68 65 20 66  ill become the f
174e0 69 72 73 74 20 72 6f 77 69 64 20 6f 6e 20 74 68  irst rowid on th
174f0 65 20 6e 65 78 74 0a 20 20 20 20 20 20 2a 2a 20  e next.      ** 
17500 64 6f 63 6c 69 73 74 2d 69 6e 64 65 78 20 6c 65  doclist-index le
17510 61 66 20 70 61 67 65 29 20 75 70 20 69 6e 74 6f  af page) up into
17520 20 74 68 65 20 6e 65 78 74 20 6c 65 76 65 6c 20   the next level 
17530 6f 66 20 74 68 65 20 62 2d 74 72 65 65 20 0a 20  of the b-tree . 
17540 20 20 20 20 20 2a 2a 20 68 69 65 72 61 72 63 68       ** hierarch
17550 79 2e 20 49 66 20 74 68 65 20 6e 6f 64 65 20 62  y. If the node b
17560 65 69 6e 67 20 66 6c 75 73 68 65 64 20 69 73 20  eing flushed is 
17570 63 75 72 72 65 6e 74 6c 79 20 74 68 65 20 72 6f  currently the ro
17580 6f 74 20 6e 6f 64 65 2c 0a 20 20 20 20 20 20 2a  ot node,.      *
17590 2a 20 61 6c 73 6f 20 70 75 73 68 20 69 74 73 20  * also push its 
175a0 66 69 72 73 74 20 72 6f 77 69 64 20 75 70 77 61  first rowid upwa
175b0 72 64 73 2e 20 2a 2f 0a 20 20 20 20 20 20 70 44  rds. */.      pD
175c0 6c 69 64 78 2d 3e 62 75 66 2e 70 5b 30 5d 20 3d  lidx->buf.p[0] =
175d0 20 30 78 30 31 3b 20 20 20 20 2f 2a 20 4e 6f 74   0x01;    /* Not
175e0 20 74 68 65 20 72 6f 6f 74 20 6e 6f 64 65 20 2a   the root node *
175f0 2f 0a 20 20 20 20 20 20 66 74 73 35 44 61 74 61  /.      fts5Data
17600 57 72 69 74 65 28 70 2c 20 0a 20 20 20 20 20 20  Write(p, .      
17610 20 20 20 20 46 54 53 35 5f 44 4c 49 44 58 5f 52      FTS5_DLIDX_R
17620 4f 57 49 44 28 70 57 72 69 74 65 72 2d 3e 69 53  OWID(pWriter->iS
17630 65 67 69 64 2c 20 69 2c 20 70 44 6c 69 64 78 2d  egid, i, pDlidx-
17640 3e 70 67 6e 6f 29 2c 0a 20 20 20 20 20 20 20 20  >pgno),.        
17650 20 20 70 44 6c 69 64 78 2d 3e 62 75 66 2e 70 2c    pDlidx->buf.p,
17660 20 70 44 6c 69 64 78 2d 3e 62 75 66 2e 6e 0a 20   pDlidx->buf.n. 
17670 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 66 74       );.      ft
17680 73 35 57 72 69 74 65 44 6c 69 64 78 47 72 6f 77  s5WriteDlidxGrow
17690 28 70 2c 20 70 57 72 69 74 65 72 2c 20 69 2b 32  (p, pWriter, i+2
176a0 29 3b 0a 20 20 20 20 20 20 70 44 6c 69 64 78 20  );.      pDlidx 
176b0 3d 20 26 70 57 72 69 74 65 72 2d 3e 61 44 6c 69  = &pWriter->aDli
176c0 64 78 5b 69 5d 3b 0a 20 20 20 20 20 20 69 66 28  dx[i];.      if(
176d0 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
176e0 4b 20 26 26 20 70 44 6c 69 64 78 5b 31 5d 2e 62  K && pDlidx[1].b
176f0 75 66 2e 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20  uf.n==0 ){.     
17700 20 20 20 69 36 34 20 69 46 69 72 73 74 20 3d 20     i64 iFirst = 
17710 66 74 73 35 44 6c 69 64 78 45 78 74 72 61 63 74  fts5DlidxExtract
17720 46 69 72 73 74 52 6f 77 69 64 28 26 70 44 6c 69  FirstRowid(&pDli
17730 64 78 2d 3e 62 75 66 29 3b 0a 0a 20 20 20 20 20  dx->buf);..     
17740 20 20 20 2f 2a 20 54 68 69 73 20 77 61 73 20 74     /* This was t
17750 68 65 20 72 6f 6f 74 20 6e 6f 64 65 2e 20 50 75  he root node. Pu
17760 73 68 20 69 74 73 20 66 69 72 73 74 20 72 6f 77  sh its first row
17770 69 64 20 75 70 20 74 6f 20 74 68 65 20 6e 65 77  id up to the new
17780 20 72 6f 6f 74 2e 20 2a 2f 0a 20 20 20 20 20 20   root. */.      
17790 20 20 70 44 6c 69 64 78 5b 31 5d 2e 70 67 6e 6f    pDlidx[1].pgno
177a0 20 3d 20 70 44 6c 69 64 78 2d 3e 70 67 6e 6f 3b   = pDlidx->pgno;
177b0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
177c0 46 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64  Fts5BufferAppend
177d0 56 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26  Varint(&p->rc, &
177e0 70 44 6c 69 64 78 5b 31 5d 2e 62 75 66 2c 20 30  pDlidx[1].buf, 0
177f0 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
17800 65 33 46 74 73 35 42 75 66 66 65 72 41 70 70 65  e3Fts5BufferAppe
17810 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c  ndVarint(&p->rc,
17820 20 26 70 44 6c 69 64 78 5b 31 5d 2e 62 75 66 2c   &pDlidx[1].buf,
17830 20 70 44 6c 69 64 78 2d 3e 70 67 6e 6f 29 3b 0a   pDlidx->pgno);.
17840 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 46          sqlite3F
17850 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 56  ts5BufferAppendV
17860 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26 70  arint(&p->rc, &p
17870 44 6c 69 64 78 5b 31 5d 2e 62 75 66 2c 20 69 46  Dlidx[1].buf, iF
17880 69 72 73 74 29 3b 0a 20 20 20 20 20 20 20 20 70  irst);.        p
17890 44 6c 69 64 78 5b 31 5d 2e 62 50 72 65 76 56 61  Dlidx[1].bPrevVa
178a0 6c 69 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  lid = 1;.       
178b0 20 70 44 6c 69 64 78 5b 31 5d 2e 69 50 72 65 76   pDlidx[1].iPrev
178c0 20 3d 20 69 46 69 72 73 74 3b 0a 20 20 20 20 20   = iFirst;.     
178d0 20 7d 0a 0a 20 20 20 20 20 20 73 71 6c 69 74 65   }..      sqlite
178e0 33 46 74 73 35 42 75 66 66 65 72 5a 65 72 6f 28  3Fts5BufferZero(
178f0 26 70 44 6c 69 64 78 2d 3e 62 75 66 29 3b 0a 20  &pDlidx->buf);. 
17900 20 20 20 20 20 70 44 6c 69 64 78 2d 3e 62 50 72       pDlidx->bPr
17910 65 76 56 61 6c 69 64 20 3d 20 30 3b 0a 20 20 20  evValid = 0;.   
17920 20 20 20 70 44 6c 69 64 78 2d 3e 70 67 6e 6f 2b     pDlidx->pgno+
17930 2b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  +;.    }else{.  
17940 20 20 20 20 62 44 6f 6e 65 20 3d 20 31 3b 0a 20      bDone = 1;. 
17950 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 70 44     }..    if( pD
17960 6c 69 64 78 2d 3e 62 50 72 65 76 56 61 6c 69 64  lidx->bPrevValid
17970 20 29 7b 0a 20 20 20 20 20 20 69 56 61 6c 20 3d   ){.      iVal =
17980 20 69 52 6f 77 69 64 20 2d 20 70 44 6c 69 64 78   iRowid - pDlidx
17990 2d 3e 69 50 72 65 76 3b 0a 20 20 20 20 7d 65 6c  ->iPrev;.    }el
179a0 73 65 7b 0a 20 20 20 20 20 20 69 36 34 20 69 50  se{.      i64 iP
179b0 67 6e 6f 20 3d 20 28 69 3d 3d 30 20 3f 20 70 57  gno = (i==0 ? pW
179c0 72 69 74 65 72 2d 3e 61 57 72 69 74 65 72 5b 30  riter->aWriter[0
179d0 5d 2e 70 67 6e 6f 20 3a 20 70 44 6c 69 64 78 5b  ].pgno : pDlidx[
179e0 2d 31 5d 2e 70 67 6e 6f 29 3b 0a 20 20 20 20 20  -1].pgno);.     
179f0 20 61 73 73 65 72 74 28 20 70 44 6c 69 64 78 2d   assert( pDlidx-
17a00 3e 62 75 66 2e 6e 3d 3d 30 20 29 3b 0a 20 20 20  >buf.n==0 );.   
17a10 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 42 75     sqlite3Fts5Bu
17a20 66 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e 74  fferAppendVarint
17a30 28 26 70 2d 3e 72 63 2c 20 26 70 44 6c 69 64 78  (&p->rc, &pDlidx
17a40 2d 3e 62 75 66 2c 20 21 62 44 6f 6e 65 29 3b 0a  ->buf, !bDone);.
17a50 20 20 20 20 20 20 73 71 6c 69 74 65 33 46 74 73        sqlite3Fts
17a60 35 42 75 66 66 65 72 41 70 70 65 6e 64 56 61 72  5BufferAppendVar
17a70 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26 70 44 6c  int(&p->rc, &pDl
17a80 69 64 78 2d 3e 62 75 66 2c 20 69 50 67 6e 6f 29  idx->buf, iPgno)
17a90 3b 0a 20 20 20 20 20 20 69 56 61 6c 20 3d 20 69  ;.      iVal = i
17aa0 52 6f 77 69 64 3b 0a 20 20 20 20 7d 0a 0a 20 20  Rowid;.    }..  
17ab0 20 20 73 71 6c 69 74 65 33 46 74 73 35 42 75 66    sqlite3Fts5Buf
17ac0 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e 74 28  ferAppendVarint(
17ad0 26 70 2d 3e 72 63 2c 20 26 70 44 6c 69 64 78 2d  &p->rc, &pDlidx-
17ae0 3e 62 75 66 2c 20 69 56 61 6c 29 3b 0a 20 20 20  >buf, iVal);.   
17af0 20 70 44 6c 69 64 78 2d 3e 62 50 72 65 76 56 61   pDlidx->bPrevVa
17b00 6c 69 64 20 3d 20 31 3b 0a 20 20 20 20 70 44 6c  lid = 1;.    pDl
17b10 69 64 78 2d 3e 69 50 72 65 76 20 3d 20 69 52 6f  idx->iPrev = iRo
17b20 77 69 64 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74  wid;.  }.}..stat
17b30 69 63 20 76 6f 69 64 20 66 74 73 35 57 72 69 74  ic void fts5Writ
17b40 65 46 6c 75 73 68 4c 65 61 66 28 46 74 73 35 49  eFlushLeaf(Fts5I
17b50 6e 64 65 78 20 2a 70 2c 20 46 74 73 35 53 65 67  ndex *p, Fts5Seg
17b60 57 72 69 74 65 72 20 2a 70 57 72 69 74 65 72 29  Writer *pWriter)
17b70 7b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74  {.  static const
17b80 20 75 38 20 7a 65 72 6f 5b 5d 20 3d 20 7b 20 30   u8 zero[] = { 0
17b90 78 30 30 2c 20 30 78 30 30 2c 20 30 78 30 30 2c  x00, 0x00, 0x00,
17ba0 20 30 78 30 30 20 7d 3b 0a 20 20 46 74 73 35 50   0x00 };.  Fts5P
17bb0 61 67 65 57 72 69 74 65 72 20 2a 70 50 61 67 65  ageWriter *pPage
17bc0 20 3d 20 26 70 57 72 69 74 65 72 2d 3e 61 57 72   = &pWriter->aWr
17bd0 69 74 65 72 5b 30 5d 3b 0a 20 20 69 36 34 20 69  iter[0];.  i64 i
17be0 52 6f 77 69 64 3b 0a 0a 20 20 69 66 28 20 70 57  Rowid;..  if( pW
17bf0 72 69 74 65 72 2d 3e 62 46 69 72 73 74 54 65 72  riter->bFirstTer
17c00 6d 49 6e 50 61 67 65 20 29 7b 0a 20 20 20 20 2f  mInPage ){.    /
17c10 2a 20 4e 6f 20 74 65 72 6d 20 77 61 73 20 77 72  * No term was wr
17c20 69 74 74 65 6e 20 74 6f 20 74 68 69 73 20 70 61  itten to this pa
17c30 67 65 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72  ge. */.    asser
17c40 74 28 20 30 3d 3d 66 74 73 35 47 65 74 55 31 36  t( 0==fts5GetU16
17c50 28 26 70 50 61 67 65 2d 3e 62 75 66 2e 70 5b 32  (&pPage->buf.p[2
17c60 5d 29 20 29 3b 0a 20 20 20 20 66 74 73 35 57 72  ]) );.    fts5Wr
17c70 69 74 65 42 74 72 65 65 4e 6f 54 65 72 6d 28 70  iteBtreeNoTerm(p
17c80 2c 20 70 57 72 69 74 65 72 29 3b 0a 20 20 7d 0a  , pWriter);.  }.
17c90 0a 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20  .  /* Write the 
17ca0 63 75 72 72 65 6e 74 20 70 61 67 65 20 74 6f 20  current page to 
17cb0 74 68 65 20 64 62 2e 20 2a 2f 0a 20 20 69 52 6f  the db. */.  iRo
17cc0 77 69 64 20 3d 20 46 54 53 35 5f 53 45 47 4d 45  wid = FTS5_SEGME
17cd0 4e 54 5f 52 4f 57 49 44 28 70 57 72 69 74 65 72  NT_ROWID(pWriter
17ce0 2d 3e 69 53 65 67 69 64 2c 20 30 2c 20 70 50 61  ->iSegid, 0, pPa
17cf0 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20 20 66 74 73  ge->pgno);.  fts
17d00 35 44 61 74 61 57 72 69 74 65 28 70 2c 20 69 52  5DataWrite(p, iR
17d10 6f 77 69 64 2c 20 70 50 61 67 65 2d 3e 62 75 66  owid, pPage->buf
17d20 2e 70 2c 20 70 50 61 67 65 2d 3e 62 75 66 2e 6e  .p, pPage->buf.n
17d30 29 3b 0a 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c  );..  /* Initial
17d40 69 7a 65 20 74 68 65 20 6e 65 78 74 20 70 61 67  ize the next pag
17d50 65 2e 20 2a 2f 0a 20 20 66 74 73 35 42 75 66 66  e. */.  fts5Buff
17d60 65 72 5a 65 72 6f 28 26 70 50 61 67 65 2d 3e 62  erZero(&pPage->b
17d70 75 66 29 3b 0a 20 20 66 74 73 35 42 75 66 66 65  uf);.  fts5Buffe
17d80 72 41 70 70 65 6e 64 42 6c 6f 62 28 26 70 2d 3e  rAppendBlob(&p->
17d90 72 63 2c 20 26 70 50 61 67 65 2d 3e 62 75 66 2c  rc, &pPage->buf,
17da0 20 34 2c 20 7a 65 72 6f 29 3b 0a 20 20 70 50 61   4, zero);.  pPa
17db0 67 65 2d 3e 70 67 6e 6f 2b 2b 3b 0a 0a 20 20 2f  ge->pgno++;..  /
17dc0 2a 20 49 6e 63 72 65 61 73 65 20 74 68 65 20 6c  * Increase the l
17dd0 65 61 76 65 73 20 77 72 69 74 74 65 6e 20 63 6f  eaves written co
17de0 75 6e 74 65 72 20 2a 2f 0a 20 20 70 57 72 69 74  unter */.  pWrit
17df0 65 72 2d 3e 6e 4c 65 61 66 57 72 69 74 74 65 6e  er->nLeafWritten
17e00 2b 2b 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 6e 65  ++;..  /* The ne
17e10 77 20 6c 65 61 66 20 68 6f 6c 64 73 20 6e 6f 20  w leaf holds no 
17e20 74 65 72 6d 73 20 6f 72 20 72 6f 77 69 64 73 20  terms or rowids 
17e30 2a 2f 0a 20 20 70 57 72 69 74 65 72 2d 3e 62 46  */.  pWriter->bF
17e40 69 72 73 74 54 65 72 6d 49 6e 50 61 67 65 20 3d  irstTermInPage =
17e50 20 31 3b 0a 20 20 70 57 72 69 74 65 72 2d 3e 62   1;.  pWriter->b
17e60 46 69 72 73 74 52 6f 77 69 64 49 6e 50 61 67 65  FirstRowidInPage
17e70 20 3d 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41   = 1;.}../*.** A
17e80 70 70 65 6e 64 20 74 65 72 6d 20 70 54 65 72 6d  ppend term pTerm
17e90 2f 6e 54 65 72 6d 20 74 6f 20 74 68 65 20 73 65  /nTerm to the se
17ea0 67 6d 65 6e 74 20 62 65 69 6e 67 20 77 72 69 74  gment being writ
17eb0 74 65 6e 20 62 79 20 74 68 65 20 77 72 69 74 65  ten by the write
17ec0 72 20 70 61 73 73 65 64 0a 2a 2a 20 61 73 20 74  r passed.** as t
17ed0 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
17ee0 6e 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  nt..**.** If an 
17ef0 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 73 65  error occurs, se
17f00 74 20 74 68 65 20 46 74 73 35 49 6e 64 65 78 2e  t the Fts5Index.
17f10 72 63 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 49  rc error code. I
17f20 66 20 61 6e 20 65 72 72 6f 72 20 68 61 73 20 0a  f an error has .
17f30 2a 2a 20 61 6c 72 65 61 64 79 20 6f 63 63 75 72  ** already occur
17f40 72 65 64 2c 20 74 68 69 73 20 66 75 6e 63 74 69  red, this functi
17f50 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a  on is a no-op..*
17f60 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  /.static void ft
17f70 73 35 57 72 69 74 65 41 70 70 65 6e 64 54 65 72  s5WriteAppendTer
17f80 6d 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a  m(.  Fts5Index *
17f90 70 2c 20 0a 20 20 46 74 73 35 53 65 67 57 72 69  p, .  Fts5SegWri
17fa0 74 65 72 20 2a 70 57 72 69 74 65 72 2c 0a 20 20  ter *pWriter,.  
17fb0 69 6e 74 20 6e 54 65 72 6d 2c 20 63 6f 6e 73 74  int nTerm, const
17fc0 20 75 38 20 2a 70 54 65 72 6d 20 0a 29 7b 0a 20   u8 *pTerm .){. 
17fd0 20 69 6e 74 20 6e 50 72 65 66 69 78 3b 20 20 20   int nPrefix;   
17fe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17ff0 20 2f 2a 20 42 79 74 65 73 20 6f 66 20 70 72 65   /* Bytes of pre
18000 66 69 78 20 63 6f 6d 70 72 65 73 73 69 6f 6e 20  fix compression 
18010 66 6f 72 20 74 65 72 6d 20 2a 2f 0a 20 20 46 74  for term */.  Ft
18020 73 35 50 61 67 65 57 72 69 74 65 72 20 2a 70 50  s5PageWriter *pP
18030 61 67 65 20 3d 20 26 70 57 72 69 74 65 72 2d 3e  age = &pWriter->
18040 61 57 72 69 74 65 72 5b 30 5d 3b 0a 0a 20 20 61  aWriter[0];..  a
18050 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 62 75  ssert( pPage->bu
18060 66 2e 6e 3d 3d 30 20 7c 7c 20 70 50 61 67 65 2d  f.n==0 || pPage-
18070 3e 62 75 66 2e 6e 3e 34 20 29 3b 0a 20 20 69 66  >buf.n>4 );.  if
18080 28 20 70 50 61 67 65 2d 3e 62 75 66 2e 6e 3d 3d  ( pPage->buf.n==
18090 30 20 29 7b 0a 20 20 20 20 2f 2a 20 5a 65 72 6f  0 ){.    /* Zero
180a0 20 74 68 65 20 66 69 72 73 74 20 74 65 72 6d 20   the first term 
180b0 61 6e 64 20 66 69 72 73 74 20 64 6f 63 69 64 20  and first docid 
180c0 66 69 65 6c 64 73 20 2a 2f 0a 20 20 20 20 73 74  fields */.    st
180d0 61 74 69 63 20 63 6f 6e 73 74 20 75 38 20 7a 65  atic const u8 ze
180e0 72 6f 5b 5d 20 3d 20 7b 20 30 78 30 30 2c 20 30  ro[] = { 0x00, 0
180f0 78 30 30 2c 20 30 78 30 30 2c 20 30 78 30 30 20  x00, 0x00, 0x00 
18100 7d 3b 0a 20 20 20 20 66 74 73 35 42 75 66 66 65  };.    fts5Buffe
18110 72 41 70 70 65 6e 64 42 6c 6f 62 28 26 70 2d 3e  rAppendBlob(&p->
18120 72 63 2c 20 26 70 50 61 67 65 2d 3e 62 75 66 2c  rc, &pPage->buf,
18130 20 34 2c 20 7a 65 72 6f 29 3b 0a 20 20 20 20 61   4, zero);.    a
18140 73 73 65 72 74 28 20 70 57 72 69 74 65 72 2d 3e  ssert( pWriter->
18150 62 46 69 72 73 74 54 65 72 6d 49 6e 50 61 67 65  bFirstTermInPage
18160 20 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d   );.  }.  if( p-
18170 3e 72 63 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  >rc ) return;.  
18180 0a 20 20 69 66 28 20 70 57 72 69 74 65 72 2d 3e  .  if( pWriter->
18190 62 46 69 72 73 74 54 65 72 6d 49 6e 50 61 67 65  bFirstTermInPage
181a0 20 29 7b 0a 20 20 20 20 2f 2a 20 55 70 64 61 74   ){.    /* Updat
181b0 65 20 74 68 65 20 22 66 69 72 73 74 20 74 65 72  e the "first ter
181c0 6d 22 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20  m" field of the 
181d0 70 61 67 65 20 68 65 61 64 65 72 2e 20 2a 2f 0a  page header. */.
181e0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
181f0 65 2d 3e 62 75 66 2e 70 5b 32 5d 3d 3d 30 20 26  e->buf.p[2]==0 &
18200 26 20 70 50 61 67 65 2d 3e 62 75 66 2e 70 5b 33  & pPage->buf.p[3
18210 5d 3d 3d 30 20 29 3b 0a 20 20 20 20 66 74 73 35  ]==0 );.    fts5
18220 50 75 74 55 31 36 28 26 70 50 61 67 65 2d 3e 62  PutU16(&pPage->b
18230 75 66 2e 70 5b 32 5d 2c 20 70 50 61 67 65 2d 3e  uf.p[2], pPage->
18240 62 75 66 2e 6e 29 3b 0a 20 20 20 20 6e 50 72 65  buf.n);.    nPre
18250 66 69 78 20 3d 20 30 3b 0a 20 20 20 20 69 66 28  fix = 0;.    if(
18260 20 70 50 61 67 65 2d 3e 70 67 6e 6f 21 3d 31 20   pPage->pgno!=1 
18270 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73  ){.      /* This
18280 20 69 73 20 74 68 65 20 66 69 72 73 74 20 74 65   is the first te
18290 72 6d 20 6f 6e 20 61 20 6c 65 61 66 20 74 68 61  rm on a leaf tha
182a0 74 20 69 73 20 6e 6f 74 20 74 68 65 20 6c 65 66  t is not the lef
182b0 74 6d 6f 73 74 20 6c 65 61 66 20 69 6e 0a 20 20  tmost leaf in.  
182c0 20 20 20 20 2a 2a 20 74 68 65 20 73 65 67 6d 65      ** the segme
182d0 6e 74 20 62 2d 74 72 65 65 2e 20 49 6e 20 74 68  nt b-tree. In th
182e0 69 73 20 63 61 73 65 20 69 74 20 69 73 20 6e 65  is case it is ne
182f0 63 65 73 73 61 72 79 20 74 6f 20 61 64 64 20 61  cessary to add a
18300 20 74 65 72 6d 20 74 6f 0a 20 20 20 20 20 20 2a   term to.      *
18310 2a 20 74 68 65 20 62 2d 74 72 65 65 20 68 69 65  * the b-tree hie
18320 72 61 72 63 68 79 20 74 68 61 74 20 69 73 20 28  rarchy that is (
18330 61 29 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74  a) larger than t
18340 68 65 20 6c 61 72 67 65 73 74 20 74 65 72 6d 20  he largest term 
18350 0a 20 20 20 20 20 20 2a 2a 20 61 6c 72 65 61 64  .      ** alread
18360 79 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65  y written to the
18370 20 73 65 67 6d 65 6e 74 20 61 6e 64 20 28 62 29   segment and (b)
18380 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 6f 72   smaller than or
18390 20 65 71 75 61 6c 20 74 6f 0a 20 20 20 20 20 20   equal to.      
183a0 2a 2a 20 74 68 69 73 20 74 65 72 6d 2e 20 49 6e  ** this term. In
183b0 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 61 20   other words, a 
183c0 70 72 65 66 69 78 20 6f 66 20 28 70 54 65 72 6d  prefix of (pTerm
183d0 2f 6e 54 65 72 6d 29 20 74 68 61 74 20 69 73 20  /nTerm) that is 
183e0 6f 6e 65 0a 20 20 20 20 20 20 2a 2a 20 62 79 74  one.      ** byt
183f0 65 20 6c 6f 6e 67 65 72 20 74 68 61 6e 20 74 68  e longer than th
18400 65 20 6c 6f 6e 67 65 73 74 20 70 72 65 66 69 78  e longest prefix
18410 20 28 70 54 65 72 6d 2f 6e 54 65 72 6d 29 20 73   (pTerm/nTerm) s
18420 68 61 72 65 73 20 77 69 74 68 20 74 68 65 0a 20  hares with the. 
18430 20 20 20 20 20 2a 2a 20 70 72 65 76 69 6f 75 73       ** previous
18440 20 74 65 72 6d 2e 20 0a 20 20 20 20 20 20 2a 2a   term. .      **
18450 0a 20 20 20 20 20 20 2a 2a 20 55 73 75 61 6c 6c  .      ** Usuall
18460 79 2c 20 74 68 65 20 70 72 65 76 69 6f 75 73 20  y, the previous 
18470 74 65 72 6d 20 69 73 20 61 76 61 69 6c 61 62 6c  term is availabl
18480 65 20 69 6e 20 70 50 61 67 65 2d 3e 74 65 72 6d  e in pPage->term
18490 2e 20 54 68 65 20 65 78 63 65 70 74 69 6f 6e 0a  . The exception.
184a0 20 20 20 20 20 20 2a 2a 20 69 73 20 69 66 20 74        ** is if t
184b0 68 69 73 20 69 73 20 74 68 65 20 66 69 72 73 74  his is the first
184c0 20 74 65 72 6d 20 77 72 69 74 74 65 6e 20 69 6e   term written in
184d0 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c 2d   an incremental-
184e0 6d 65 72 67 65 20 73 74 65 70 2e 0a 20 20 20 20  merge step..    
184f0 20 20 2a 2a 20 49 6e 20 74 68 69 73 20 63 61 73    ** In this cas
18500 65 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 74  e the previous t
18510 65 72 6d 20 69 73 20 6e 6f 74 20 61 76 61 69 6c  erm is not avail
18520 61 62 6c 65 2c 20 73 6f 20 6a 75 73 74 20 77 72  able, so just wr
18530 69 74 65 20 61 0a 20 20 20 20 20 20 2a 2a 20 63  ite a.      ** c
18540 6f 70 79 20 6f 66 20 28 70 54 65 72 6d 2f 6e 54  opy of (pTerm/nT
18550 65 72 6d 29 20 69 6e 74 6f 20 74 68 65 20 70 61  erm) into the pa
18560 72 65 6e 74 20 6e 6f 64 65 2e 20 54 68 69 73 20  rent node. This 
18570 69 73 20 73 6c 69 67 68 74 6c 79 0a 20 20 20 20  is slightly.    
18580 20 20 2a 2a 20 69 6e 65 66 66 69 63 69 65 6e 74    ** inefficient
18590 2c 20 62 75 74 20 73 74 69 6c 6c 20 63 6f 72 72  , but still corr
185a0 65 63 74 2e 20 20 2a 2f 0a 20 20 20 20 20 20 69  ect.  */.      i
185b0 6e 74 20 6e 20 3d 20 6e 54 65 72 6d 3b 0a 20 20  nt n = nTerm;.  
185c0 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 74      if( pPage->t
185d0 65 72 6d 2e 6e 20 29 7b 0a 20 20 20 20 20 20 20  erm.n ){.       
185e0 20 6e 20 3d 20 31 20 2b 20 66 74 73 35 50 72 65   n = 1 + fts5Pre
185f0 66 69 78 43 6f 6d 70 72 65 73 73 28 70 50 61 67  fixCompress(pPag
18600 65 2d 3e 74 65 72 6d 2e 6e 2c 20 70 50 61 67 65  e->term.n, pPage
18610 2d 3e 74 65 72 6d 2e 70 2c 20 6e 54 65 72 6d 2c  ->term.p, nTerm,
18620 20 70 54 65 72 6d 29 3b 0a 20 20 20 20 20 20 7d   pTerm);.      }
18630 0a 20 20 20 20 20 20 66 74 73 35 57 72 69 74 65  .      fts5Write
18640 42 74 72 65 65 54 65 72 6d 28 70 2c 20 70 57 72  BtreeTerm(p, pWr
18650 69 74 65 72 2c 20 6e 2c 20 70 54 65 72 6d 29 3b  iter, n, pTerm);
18660 0a 20 20 20 20 20 20 70 50 61 67 65 20 3d 20 26  .      pPage = &
18670 70 57 72 69 74 65 72 2d 3e 61 57 72 69 74 65 72  pWriter->aWriter
18680 5b 30 5d 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  [0];.    }.  }el
18690 73 65 7b 0a 20 20 20 20 6e 50 72 65 66 69 78 20  se{.    nPrefix 
186a0 3d 20 66 74 73 35 50 72 65 66 69 78 43 6f 6d 70  = fts5PrefixComp
186b0 72 65 73 73 28 70 50 61 67 65 2d 3e 74 65 72 6d  ress(pPage->term
186c0 2e 6e 2c 20 70 50 61 67 65 2d 3e 74 65 72 6d 2e  .n, pPage->term.
186d0 70 2c 20 6e 54 65 72 6d 2c 20 70 54 65 72 6d 29  p, nTerm, pTerm)
186e0 3b 0a 20 20 20 20 66 74 73 35 42 75 66 66 65 72  ;.    fts5Buffer
186f0 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26 70 2d  AppendVarint(&p-
18700 3e 72 63 2c 20 26 70 50 61 67 65 2d 3e 62 75 66  >rc, &pPage->buf
18710 2c 20 6e 50 72 65 66 69 78 29 3b 0a 20 20 7d 0a  , nPrefix);.  }.
18720 0a 20 20 2f 2a 20 41 70 70 65 6e 64 20 74 68 65  .  /* Append the
18730 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   number of bytes
18740 20 6f 66 20 6e 65 77 20 64 61 74 61 2c 20 74 68   of new data, th
18750 65 6e 20 74 68 65 20 74 65 72 6d 20 64 61 74 61  en the term data
18760 20 69 74 73 65 6c 66 0a 20 20 2a 2a 20 74 6f 20   itself.  ** to 
18770 74 68 65 20 70 61 67 65 2e 20 2a 2f 0a 20 20 66  the page. */.  f
18780 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 56  ts5BufferAppendV
18790 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26 70  arint(&p->rc, &p
187a0 50 61 67 65 2d 3e 62 75 66 2c 20 6e 54 65 72 6d  Page->buf, nTerm
187b0 20 2d 20 6e 50 72 65 66 69 78 29 3b 0a 20 20 66   - nPrefix);.  f
187c0 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 42  ts5BufferAppendB
187d0 6c 6f 62 28 26 70 2d 3e 72 63 2c 20 26 70 50 61  lob(&p->rc, &pPa
187e0 67 65 2d 3e 62 75 66 2c 20 6e 54 65 72 6d 20 2d  ge->buf, nTerm -
187f0 20 6e 50 72 65 66 69 78 2c 20 26 70 54 65 72 6d   nPrefix, &pTerm
18800 5b 6e 50 72 65 66 69 78 5d 29 3b 0a 0a 20 20 2f  [nPrefix]);..  /
18810 2a 20 55 70 64 61 74 65 20 74 68 65 20 46 74 73  * Update the Fts
18820 35 50 61 67 65 57 72 69 74 65 72 2e 74 65 72 6d  5PageWriter.term
18830 20 66 69 65 6c 64 2e 20 2a 2f 0a 20 20 66 74 73   field. */.  fts
18840 35 42 75 66 66 65 72 53 65 74 28 26 70 2d 3e 72  5BufferSet(&p->r
18850 63 2c 20 26 70 50 61 67 65 2d 3e 74 65 72 6d 2c  c, &pPage->term,
18860 20 6e 54 65 72 6d 2c 20 70 54 65 72 6d 29 3b 0a   nTerm, pTerm);.
18870 20 20 70 57 72 69 74 65 72 2d 3e 62 46 69 72 73    pWriter->bFirs
18880 74 54 65 72 6d 49 6e 50 61 67 65 20 3d 20 30 3b  tTermInPage = 0;
18890 0a 0a 20 20 70 57 72 69 74 65 72 2d 3e 62 46 69  ..  pWriter->bFi
188a0 72 73 74 52 6f 77 69 64 49 6e 50 61 67 65 20 3d  rstRowidInPage =
188b0 20 30 3b 0a 20 20 70 57 72 69 74 65 72 2d 3e 62   0;.  pWriter->b
188c0 46 69 72 73 74 52 6f 77 69 64 49 6e 44 6f 63 6c  FirstRowidInDocl
188d0 69 73 74 20 3d 20 31 3b 0a 0a 20 20 61 73 73 65  ist = 1;..  asse
188e0 72 74 28 20 70 2d 3e 72 63 20 7c 7c 20 28 70 57  rt( p->rc || (pW
188f0 72 69 74 65 72 2d 3e 6e 44 6c 69 64 78 3e 30 20  riter->nDlidx>0 
18900 26 26 20 70 57 72 69 74 65 72 2d 3e 61 44 6c 69  && pWriter->aDli
18910 64 78 5b 30 5d 2e 62 75 66 2e 6e 3d 3d 30 29 20  dx[0].buf.n==0) 
18920 29 3b 0a 20 20 70 57 72 69 74 65 72 2d 3e 61 44  );.  pWriter->aD
18930 6c 69 64 78 5b 30 5d 2e 70 67 6e 6f 20 3d 20 70  lidx[0].pgno = p
18940 50 61 67 65 2d 3e 70 67 6e 6f 3b 0a 0a 20 20 2f  Page->pgno;..  /
18950 2a 20 49 66 20 74 68 65 20 63 75 72 72 65 6e 74  * If the current
18960 20 6c 65 61 66 20 70 61 67 65 20 69 73 20 66 75   leaf page is fu
18970 6c 6c 2c 20 66 6c 75 73 68 20 69 74 20 74 6f 20  ll, flush it to 
18980 64 69 73 6b 2e 20 2a 2f 0a 20 20 69 66 28 20 70  disk. */.  if( p
18990 50 61 67 65 2d 3e 62 75 66 2e 6e 3e 3d 70 2d 3e  Page->buf.n>=p->
189a0 70 43 6f 6e 66 69 67 2d 3e 70 67 73 7a 20 29 7b  pConfig->pgsz ){
189b0 0a 20 20 20 20 66 74 73 35 57 72 69 74 65 46 6c  .    fts5WriteFl
189c0 75 73 68 4c 65 61 66 28 70 2c 20 70 57 72 69 74  ushLeaf(p, pWrit
189d0 65 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  er);.  }.}../*.*
189e0 2a 20 41 70 70 65 6e 64 20 61 20 64 6f 63 69 64  * Append a docid
189f0 20 61 6e 64 20 70 6f 73 69 74 69 6f 6e 2d 6c 69   and position-li
18a00 73 74 20 73 69 7a 65 20 66 69 65 6c 64 20 74 6f  st size field to
18a10 20 74 68 65 20 77 72 69 74 65 72 73 20 6f 75 74   the writers out
18a20 70 75 74 2e 20 0a 2a 2f 0a 73 74 61 74 69 63 20  put. .*/.static 
18a30 76 6f 69 64 20 66 74 73 35 57 72 69 74 65 41 70  void fts5WriteAp
18a40 70 65 6e 64 52 6f 77 69 64 28 0a 20 20 46 74 73  pendRowid(.  Fts
18a50 35 49 6e 64 65 78 20 2a 70 2c 20 0a 20 20 46 74  5Index *p, .  Ft
18a60 73 35 53 65 67 57 72 69 74 65 72 20 2a 70 57 72  s5SegWriter *pWr
18a70 69 74 65 72 2c 0a 20 20 69 36 34 20 69 52 6f 77  iter,.  i64 iRow
18a80 69 64 2c 0a 20 20 69 6e 74 20 6e 50 6f 73 0a 29  id,.  int nPos.)
18a90 7b 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53  {.  if( p->rc==S
18aa0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
18ab0 46 74 73 35 50 61 67 65 57 72 69 74 65 72 20 2a  Fts5PageWriter *
18ac0 70 50 61 67 65 20 3d 20 26 70 57 72 69 74 65 72  pPage = &pWriter
18ad0 2d 3e 61 57 72 69 74 65 72 5b 30 5d 3b 0a 0a 20  ->aWriter[0];.. 
18ae0 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73     /* If this is
18af0 20 74 6f 20 62 65 20 74 68 65 20 66 69 72 73 74   to be the first
18b00 20 64 6f 63 69 64 20 77 72 69 74 74 65 6e 20 74   docid written t
18b10 6f 20 74 68 65 20 70 61 67 65 2c 20 73 65 74 20  o the page, set 
18b20 74 68 65 20 0a 20 20 20 20 2a 2a 20 64 6f 63 69  the .    ** doci
18b30 64 2d 70 6f 69 6e 74 65 72 20 69 6e 20 74 68 65  d-pointer in the
18b40 20 70 61 67 65 2d 68 65 61 64 65 72 2e 20 41 6c   page-header. Al
18b50 73 6f 20 61 70 70 65 6e 64 20 61 20 76 61 6c 75  so append a valu
18b60 65 20 74 6f 20 74 68 65 20 64 6c 69 64 78 0a 20  e to the dlidx. 
18b70 20 20 20 2a 2a 20 62 75 66 66 65 72 2c 20 69 6e     ** buffer, in
18b80 20 63 61 73 65 20 61 20 64 6f 63 6c 69 73 74 2d   case a doclist-
18b90 69 6e 64 65 78 20 69 73 20 72 65 71 75 69 72 65  index is require
18ba0 64 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70  d.  */.    if( p
18bb0 57 72 69 74 65 72 2d 3e 62 46 69 72 73 74 52 6f  Writer->bFirstRo
18bc0 77 69 64 49 6e 50 61 67 65 20 29 7b 0a 20 20 20  widInPage ){.   
18bd0 20 20 20 66 74 73 35 50 75 74 55 31 36 28 70 50     fts5PutU16(pP
18be0 61 67 65 2d 3e 62 75 66 2e 70 2c 20 70 50 61 67  age->buf.p, pPag
18bf0 65 2d 3e 62 75 66 2e 6e 29 3b 0a 20 20 20 20 20  e->buf.n);.     
18c00 20 66 74 73 35 57 72 69 74 65 44 6c 69 64 78 41   fts5WriteDlidxA
18c10 70 70 65 6e 64 28 70 2c 20 70 57 72 69 74 65 72  ppend(p, pWriter
18c20 2c 20 69 52 6f 77 69 64 29 3b 0a 20 20 20 20 7d  , iRowid);.    }
18c30 0a 0a 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74  ..    /* Write t
18c40 68 65 20 64 6f 63 69 64 2e 20 2a 2f 0a 20 20 20  he docid. */.   
18c50 20 69 66 28 20 70 57 72 69 74 65 72 2d 3e 62 46   if( pWriter->bF
18c60 69 72 73 74 52 6f 77 69 64 49 6e 44 6f 63 6c 69  irstRowidInDocli
18c70 73 74 20 7c 7c 20 70 57 72 69 74 65 72 2d 3e 62  st || pWriter->b
18c80 46 69 72 73 74 52 6f 77 69 64 49 6e 50 61 67 65  FirstRowidInPage
18c90 20 29 7b 0a 20 20 20 20 20 20 66 74 73 35 42 75   ){.      fts5Bu
18ca0 66 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e 74  fferAppendVarint
18cb0 28 26 70 2d 3e 72 63 2c 20 26 70 50 61 67 65 2d  (&p->rc, &pPage-
18cc0 3e 62 75 66 2c 20 69 52 6f 77 69 64 29 3b 0a 20  >buf, iRowid);. 
18cd0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
18ce0 61 73 73 65 72 74 28 20 70 2d 3e 72 63 20 7c 7c  assert( p->rc ||
18cf0 20 69 52 6f 77 69 64 3e 70 57 72 69 74 65 72 2d   iRowid>pWriter-
18d00 3e 69 50 72 65 76 52 6f 77 69 64 20 29 3b 0a 20  >iPrevRowid );. 
18d10 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72 41       fts5BufferA
18d20 70 70 65 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e  ppendVarint(&p->
18d30 72 63 2c 20 26 70 50 61 67 65 2d 3e 62 75 66 2c  rc, &pPage->buf,
18d40 20 69 52 6f 77 69 64 20 2d 20 70 57 72 69 74 65   iRowid - pWrite
18d50 72 2d 3e 69 50 72 65 76 52 6f 77 69 64 29 3b 0a  r->iPrevRowid);.
18d60 20 20 20 20 7d 0a 20 20 20 20 70 57 72 69 74 65      }.    pWrite
18d70 72 2d 3e 69 50 72 65 76 52 6f 77 69 64 20 3d 20  r->iPrevRowid = 
18d80 69 52 6f 77 69 64 3b 0a 20 20 20 20 70 57 72 69  iRowid;.    pWri
18d90 74 65 72 2d 3e 62 46 69 72 73 74 52 6f 77 69 64  ter->bFirstRowid
18da0 49 6e 44 6f 63 6c 69 73 74 20 3d 20 30 3b 0a 20  InDoclist = 0;. 
18db0 20 20 20 70 57 72 69 74 65 72 2d 3e 62 46 69 72     pWriter->bFir
18dc0 73 74 52 6f 77 69 64 49 6e 50 61 67 65 20 3d 20  stRowidInPage = 
18dd0 30 3b 0a 0a 20 20 20 20 66 74 73 35 42 75 66 66  0;..    fts5Buff
18de0 65 72 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26  erAppendVarint(&
18df0 70 2d 3e 72 63 2c 20 26 70 50 61 67 65 2d 3e 62  p->rc, &pPage->b
18e00 75 66 2c 20 6e 50 6f 73 29 3b 0a 0a 20 20 20 20  uf, nPos);..    
18e10 69 66 28 20 70 50 61 67 65 2d 3e 62 75 66 2e 6e  if( pPage->buf.n
18e20 3e 3d 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e 70 67  >=p->pConfig->pg
18e30 73 7a 20 29 7b 0a 20 20 20 20 20 20 66 74 73 35  sz ){.      fts5
18e40 57 72 69 74 65 46 6c 75 73 68 4c 65 61 66 28 70  WriteFlushLeaf(p
18e50 2c 20 70 57 72 69 74 65 72 29 3b 0a 20 20 20 20  , pWriter);.    
18e60 7d 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63 20  }.  }.}..static 
18e70 76 6f 69 64 20 66 74 73 35 57 72 69 74 65 41 70  void fts5WriteAp
18e80 70 65 6e 64 50 6f 73 6c 69 73 74 44 61 74 61 28  pendPoslistData(
18e90 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c  .  Fts5Index *p,
18ea0 20 0a 20 20 46 74 73 35 53 65 67 57 72 69 74 65   .  Fts5SegWrite
18eb0 72 20 2a 70 57 72 69 74 65 72 2c 20 0a 20 20 63  r *pWriter, .  c
18ec0 6f 6e 73 74 20 75 38 20 2a 61 44 61 74 61 2c 20  onst u8 *aData, 
18ed0 0a 20 20 69 6e 74 20 6e 44 61 74 61 0a 29 7b 0a  .  int nData.){.
18ee0 20 20 46 74 73 35 50 61 67 65 57 72 69 74 65 72    Fts5PageWriter
18ef0 20 2a 70 50 61 67 65 20 3d 20 26 70 57 72 69 74   *pPage = &pWrit
18f00 65 72 2d 3e 61 57 72 69 74 65 72 5b 30 5d 3b 0a  er->aWriter[0];.
18f10 20 20 63 6f 6e 73 74 20 75 38 20 2a 61 20 3d 20    const u8 *a = 
18f20 61 44 61 74 61 3b 0a 20 20 69 6e 74 20 6e 20 3d  aData;.  int n =
18f30 20 6e 44 61 74 61 3b 0a 20 20 0a 20 20 61 73 73   nData;.  .  ass
18f40 65 72 74 28 20 70 2d 3e 70 43 6f 6e 66 69 67 2d  ert( p->pConfig-
18f50 3e 70 67 73 7a 3e 30 20 29 3b 0a 20 20 77 68 69  >pgsz>0 );.  whi
18f60 6c 65 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  le( p->rc==SQLIT
18f70 45 5f 4f 4b 20 26 26 20 28 70 50 61 67 65 2d 3e  E_OK && (pPage->
18f80 62 75 66 2e 6e 20 2b 20 6e 29 3e 3d 70 2d 3e 70  buf.n + n)>=p->p
18f90 43 6f 6e 66 69 67 2d 3e 70 67 73 7a 20 29 7b 0a  Config->pgsz ){.
18fa0 20 20 20 20 69 6e 74 20 6e 52 65 71 20 3d 20 70      int nReq = p
18fb0 2d 3e 70 43 6f 6e 66 69 67 2d 3e 70 67 73 7a 20  ->pConfig->pgsz 
18fc0 2d 20 70 50 61 67 65 2d 3e 62 75 66 2e 6e 3b 0a  - pPage->buf.n;.
18fd0 20 20 20 20 69 6e 74 20 6e 43 6f 70 79 20 3d 20      int nCopy = 
18fe0 30 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 6e 43  0;.    while( nC
18ff0 6f 70 79 3c 6e 52 65 71 20 29 7b 0a 20 20 20 20  opy<nReq ){.    
19000 20 20 69 36 34 20 64 75 6d 6d 79 3b 0a 20 20 20    i64 dummy;.   
19010 20 20 20 6e 43 6f 70 79 20 2b 3d 20 66 74 73 35     nCopy += fts5
19020 47 65 74 56 61 72 69 6e 74 28 26 61 5b 6e 43 6f  GetVarint(&a[nCo
19030 70 79 5d 2c 20 28 75 36 34 2a 29 26 64 75 6d 6d  py], (u64*)&dumm
19040 79 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 74  y);.    }.    ft
19050 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 42 6c  s5BufferAppendBl
19060 6f 62 28 26 70 2d 3e 72 63 2c 20 26 70 50 61 67  ob(&p->rc, &pPag
19070 65 2d 3e 62 75 66 2c 20 6e 43 6f 70 79 2c 20 61  e->buf, nCopy, a
19080 29 3b 0a 20 20 20 20 61 20 2b 3d 20 6e 43 6f 70  );.    a += nCop
19090 79 3b 0a 20 20 20 20 6e 20 2d 3d 20 6e 43 6f 70  y;.    n -= nCop
190a0 79 3b 0a 20 20 20 20 66 74 73 35 57 72 69 74 65  y;.    fts5Write
190b0 46 6c 75 73 68 4c 65 61 66 28 70 2c 20 70 57 72  FlushLeaf(p, pWr
190c0 69 74 65 72 29 3b 0a 20 20 7d 0a 20 20 69 66 28  iter);.  }.  if(
190d0 20 6e 3e 30 20 29 7b 0a 20 20 20 20 66 74 73 35   n>0 ){.    fts5
190e0 42 75 66 66 65 72 41 70 70 65 6e 64 42 6c 6f 62  BufferAppendBlob
190f0 28 26 70 2d 3e 72 63 2c 20 26 70 50 61 67 65 2d  (&p->rc, &pPage-
19100 3e 62 75 66 2c 20 6e 2c 20 61 29 3b 0a 20 20 7d  >buf, n, a);.  }
19110 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .}..static void 
19120 66 74 73 35 57 72 69 74 65 41 70 70 65 6e 64 5a  fts5WriteAppendZ
19130 65 72 6f 62 79 74 65 28 46 74 73 35 49 6e 64 65  erobyte(Fts5Inde
19140 78 20 2a 70 2c 20 46 74 73 35 53 65 67 57 72 69  x *p, Fts5SegWri
19150 74 65 72 20 2a 70 57 72 69 74 65 72 29 7b 0a 20  ter *pWriter){. 
19160 20 66 74 73 35 42 75 66 66 65 72 41 70 70 65 6e   fts5BufferAppen
19170 64 56 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20  dVarint(&p->rc, 
19180 26 70 57 72 69 74 65 72 2d 3e 61 57 72 69 74 65  &pWriter->aWrite
19190 72 5b 30 5d 2e 62 75 66 2c 20 30 29 3b 0a 7d 0a  r[0].buf, 0);.}.
191a0 0a 2f 2a 0a 2a 2a 20 46 6c 75 73 68 20 61 6e 79  ./*.** Flush any
191b0 20 64 61 74 61 20 63 61 63 68 65 64 20 62 79 20   data cached by 
191c0 74 68 65 20 77 72 69 74 65 72 20 6f 62 6a 65 63  the writer objec
191d0 74 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  t to the databas
191e0 65 2e 20 46 72 65 65 20 61 6e 79 0a 2a 2a 20 61  e. Free any.** a
191f0 6c 6c 6f 63 61 74 69 6f 6e 73 20 61 73 73 6f 63  llocations assoc
19200 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20 77  iated with the w
19210 72 69 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  riter..*/.static
19220 20 76 6f 69 64 20 66 74 73 35 57 72 69 74 65 46   void fts5WriteF
19230 69 6e 69 73 68 28 0a 20 20 46 74 73 35 49 6e 64  inish(.  Fts5Ind
19240 65 78 20 2a 70 2c 20 0a 20 20 46 74 73 35 53 65  ex *p, .  Fts5Se
19250 67 57 72 69 74 65 72 20 2a 70 57 72 69 74 65 72  gWriter *pWriter
19260 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69  ,         /* Wri
19270 74 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  ter object */.  
19280 69 6e 74 20 2a 70 6e 48 65 69 67 68 74 2c 20 20  int *pnHeight,  
19290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
192a0 2f 2a 20 4f 55 54 3a 20 48 65 69 67 68 74 20 6f  /* OUT: Height o
192b0 66 20 74 68 65 20 62 2d 74 72 65 65 20 2a 2f 0a  f the b-tree */.
192c0 20 20 69 6e 74 20 2a 70 6e 4c 65 61 66 20 20 20    int *pnLeaf   
192d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
192e0 20 20 2f 2a 20 4f 55 54 3a 20 4e 75 6d 62 65 72    /* OUT: Number
192f0 20 6f 66 20 6c 65 61 66 20 70 61 67 65 73 20 69   of leaf pages i
19300 6e 20 62 2d 74 72 65 65 20 2a 2f 0a 29 7b 0a 20  n b-tree */.){. 
19310 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 2d   int i;.  if( p-
19320 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  >rc==SQLITE_OK )
19330 7b 0a 20 20 20 20 46 74 73 35 50 61 67 65 57 72  {.    Fts5PageWr
19340 69 74 65 72 20 2a 70 4c 65 61 66 20 3d 20 26 70  iter *pLeaf = &p
19350 57 72 69 74 65 72 2d 3e 61 57 72 69 74 65 72 5b  Writer->aWriter[
19360 30 5d 3b 0a 20 20 20 20 69 66 28 20 70 4c 65 61  0];.    if( pLea
19370 66 2d 3e 70 67 6e 6f 3d 3d 31 20 26 26 20 70 4c  f->pgno==1 && pL
19380 65 61 66 2d 3e 62 75 66 2e 6e 3d 3d 30 20 29 7b  eaf->buf.n==0 ){
19390 0a 20 20 20 20 20 20 2a 70 6e 4c 65 61 66 20 3d  .      *pnLeaf =
193a0 20 30 3b 0a 20 20 20 20 20 20 2a 70 6e 48 65 69   0;.      *pnHei
193b0 67 68 74 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c  ght = 0;.    }el
193c0 73 65 7b 0a 20 20 20 20 20 20 69 66 28 20 70 4c  se{.      if( pL
193d0 65 61 66 2d 3e 62 75 66 2e 6e 3e 34 20 29 7b 0a  eaf->buf.n>4 ){.
193e0 20 20 20 20 20 20 20 20 66 74 73 35 57 72 69 74          fts5Writ
193f0 65 46 6c 75 73 68 4c 65 61 66 28 70 2c 20 70 57  eFlushLeaf(p, pW
19400 72 69 74 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a  riter);.      }.
19410 20 20 20 20 20 20 2a 70 6e 4c 65 61 66 20 3d 20        *pnLeaf = 
19420 70 4c 65 61 66 2d 3e 70 67 6e 6f 2d 31 3b 0a 20  pLeaf->pgno-1;. 
19430 20 20 20 20 20 69 66 28 20 70 57 72 69 74 65 72       if( pWriter
19440 2d 3e 6e 57 72 69 74 65 72 3d 3d 31 20 26 26 20  ->nWriter==1 && 
19450 70 57 72 69 74 65 72 2d 3e 6e 45 6d 70 74 79 3e  pWriter->nEmpty>
19460 3d 46 54 53 35 5f 4d 49 4e 5f 44 4c 49 44 58 5f  =FTS5_MIN_DLIDX_
19470 53 49 5a 45 20 29 7b 0a 20 20 20 20 20 20 20 20  SIZE ){.        
19480 66 74 73 35 57 72 69 74 65 42 74 72 65 65 47 72  fts5WriteBtreeGr
19490 6f 77 28 70 2c 20 70 57 72 69 74 65 72 29 3b 0a  ow(p, pWriter);.
194a0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
194b0 28 20 70 57 72 69 74 65 72 2d 3e 6e 57 72 69 74  ( pWriter->nWrit
194c0 65 72 3e 31 20 29 7b 0a 20 20 20 20 20 20 20 20  er>1 ){.        
194d0 66 74 73 35 57 72 69 74 65 42 74 72 65 65 4e 45  fts5WriteBtreeNE
194e0 6d 70 74 79 28 70 2c 20 70 57 72 69 74 65 72 29  mpty(p, pWriter)
194f0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
19500 2a 70 6e 48 65 69 67 68 74 20 3d 20 70 57 72 69  *pnHeight = pWri
19510 74 65 72 2d 3e 6e 57 72 69 74 65 72 3b 0a 0a 20  ter->nWriter;.. 
19520 20 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c       for(i=1; i<
19530 70 57 72 69 74 65 72 2d 3e 6e 57 72 69 74 65 72  pWriter->nWriter
19540 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
19550 46 74 73 35 50 61 67 65 57 72 69 74 65 72 20 2a  Fts5PageWriter *
19560 70 50 67 20 3d 20 26 70 57 72 69 74 65 72 2d 3e  pPg = &pWriter->
19570 61 57 72 69 74 65 72 5b 69 5d 3b 0a 20 20 20 20  aWriter[i];.    
19580 20 20 20 20 66 74 73 35 44 61 74 61 57 72 69 74      fts5DataWrit
19590 65 28 70 2c 20 0a 20 20 20 20 20 20 20 20 20 20  e(p, .          
195a0 20 20 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f 52    FTS5_SEGMENT_R
195b0 4f 57 49 44 28 70 57 72 69 74 65 72 2d 3e 69 53  OWID(pWriter->iS
195c0 65 67 69 64 2c 20 69 2c 20 70 50 67 2d 3e 70 67  egid, i, pPg->pg
195d0 6e 6f 29 2c 20 0a 20 20 20 20 20 20 20 20 20 20  no), .          
195e0 20 20 70 50 67 2d 3e 62 75 66 2e 70 2c 20 70 50    pPg->buf.p, pP
195f0 67 2d 3e 62 75 66 2e 6e 0a 20 20 20 20 20 20 20  g->buf.n.       
19600 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   );.      }.    
19610 7d 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b  }.  }.  for(i=0;
19620 20 69 3c 70 57 72 69 74 65 72 2d 3e 6e 57 72 69   i<pWriter->nWri
19630 74 65 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 46  ter; i++){.    F
19640 74 73 35 50 61 67 65 57 72 69 74 65 72 20 2a 70  ts5PageWriter *p
19650 50 67 20 3d 20 26 70 57 72 69 74 65 72 2d 3e 61  Pg = &pWriter->a
19660 57 72 69 74 65 72 5b 69 5d 3b 0a 20 20 20 20 66  Writer[i];.    f
19670 74 73 35 42 75 66 66 65 72 46 72 65 65 28 26 70  ts5BufferFree(&p
19680 50 67 2d 3e 74 65 72 6d 29 3b 0a 20 20 20 20 66  Pg->term);.    f
19690 74 73 35 42 75 66 66 65 72 46 72 65 65 28 26 70  ts5BufferFree(&p
196a0 50 67 2d 3e 62 75 66 29 3b 0a 20 20 7d 0a 20 20  Pg->buf);.  }.  
196b0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 57 72  sqlite3_free(pWr
196c0 69 74 65 72 2d 3e 61 57 72 69 74 65 72 29 3b 0a  iter->aWriter);.
196d0 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 57  .  for(i=0; i<pW
196e0 72 69 74 65 72 2d 3e 6e 44 6c 69 64 78 3b 20 69  riter->nDlidx; i
196f0 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ++){.    sqlite3
19700 46 74 73 35 42 75 66 66 65 72 46 72 65 65 28 26  Fts5BufferFree(&
19710 70 57 72 69 74 65 72 2d 3e 61 44 6c 69 64 78 5b  pWriter->aDlidx[
19720 69 5d 2e 62 75 66 29 3b 0a 20 20 7d 0a 20 20 73  i].buf);.  }.  s
19730 71 6c 69 74 65 33 5f 66 72 65 65 28 70 57 72 69  qlite3_free(pWri
19740 74 65 72 2d 3e 61 44 6c 69 64 78 29 3b 0a 7d 0a  ter->aDlidx);.}.
19750 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
19760 35 57 72 69 74 65 49 6e 69 74 28 0a 20 20 46 74  5WriteInit(.  Ft
19770 73 35 49 6e 64 65 78 20 2a 70 2c 20 0a 20 20 46  s5Index *p, .  F
19780 74 73 35 53 65 67 57 72 69 74 65 72 20 2a 70 57  ts5SegWriter *pW
19790 72 69 74 65 72 2c 20 0a 20 20 69 6e 74 20 69 53  riter, .  int iS
197a0 65 67 69 64 0a 29 7b 0a 20 20 6d 65 6d 73 65 74  egid.){.  memset
197b0 28 70 57 72 69 74 65 72 2c 20 30 2c 20 73 69 7a  (pWriter, 0, siz
197c0 65 6f 66 28 46 74 73 35 53 65 67 57 72 69 74 65  eof(Fts5SegWrite
197d0 72 29 29 3b 0a 20 20 70 57 72 69 74 65 72 2d 3e  r));.  pWriter->
197e0 69 53 65 67 69 64 20 3d 20 69 53 65 67 69 64 3b  iSegid = iSegid;
197f0 0a 0a 20 20 70 57 72 69 74 65 72 2d 3e 61 57 72  ..  pWriter->aWr
19800 69 74 65 72 20 3d 20 28 46 74 73 35 50 61 67 65  iter = (Fts5Page
19810 57 72 69 74 65 72 2a 29 66 74 73 35 49 64 78 4d  Writer*)fts5IdxM
19820 61 6c 6c 6f 63 28 70 2c 20 73 69 7a 65 6f 66 28  alloc(p, sizeof(
19830 46 74 73 35 50 61 67 65 57 72 69 74 65 72 29 29  Fts5PageWriter))
19840 3b 0a 20 20 69 66 28 20 66 74 73 35 57 72 69 74  ;.  if( fts5Writ
19850 65 44 6c 69 64 78 47 72 6f 77 28 70 2c 20 70 57  eDlidxGrow(p, pW
19860 72 69 74 65 72 2c 20 31 29 20 29 20 72 65 74 75  riter, 1) ) retu
19870 72 6e 3b 0a 20 20 70 57 72 69 74 65 72 2d 3e 6e  rn;.  pWriter->n
19880 57 72 69 74 65 72 20 3d 20 31 3b 0a 20 20 70 57  Writer = 1;.  pW
19890 72 69 74 65 72 2d 3e 6e 44 6c 69 64 78 20 3d 20  riter->nDlidx = 
198a0 31 3b 0a 20 20 70 57 72 69 74 65 72 2d 3e 61 57  1;.  pWriter->aW
198b0 72 69 74 65 72 5b 30 5d 2e 70 67 6e 6f 20 3d 20  riter[0].pgno = 
198c0 31 3b 0a 20 20 70 57 72 69 74 65 72 2d 3e 62 46  1;.  pWriter->bF
198d0 69 72 73 74 54 65 72 6d 49 6e 50 61 67 65 20 3d  irstTermInPage =
198e0 20 31 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f   1;.}..static vo
198f0 69 64 20 66 74 73 35 57 72 69 74 65 49 6e 69 74  id fts5WriteInit
19900 46 6f 72 41 70 70 65 6e 64 28 0a 20 20 46 74 73  ForAppend(.  Fts
19910 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20  5Index *p,      
19920 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
19930 46 54 53 35 20 62 61 63 6b 65 6e 64 20 6f 62 6a  FTS5 backend obj
19940 65 63 74 20 2a 2f 0a 20 20 46 74 73 35 53 65 67  ect */.  Fts5Seg
19950 57 72 69 74 65 72 20 2a 70 57 72 69 74 65 72 2c  Writer *pWriter,
19960 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74           /* Writ
19970 65 72 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65  er to initialize
19980 20 2a 2f 0a 20 20 46 74 73 35 53 74 72 75 63 74   */.  Fts5Struct
19990 75 72 65 53 65 67 6d 65 6e 74 20 2a 70 53 65 67  ureSegment *pSeg
199a0 20 20 20 20 20 20 2f 2a 20 53 65 67 6d 65 6e 74        /* Segment
199b0 20 6f 62 6a 65 63 74 20 74 6f 20 61 70 70 65 6e   object to appen
199c0 64 20 74 6f 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  d to */.){.  int
199d0 20 6e 42 79 74 65 20 3d 20 70 53 65 67 2d 3e 6e   nByte = pSeg->n
199e0 48 65 69 67 68 74 20 2a 20 73 69 7a 65 6f 66 28  Height * sizeof(
199f0 46 74 73 35 50 61 67 65 57 72 69 74 65 72 29 3b  Fts5PageWriter);
19a00 0a 20 20 6d 65 6d 73 65 74 28 70 57 72 69 74 65  .  memset(pWrite
19a10 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 46 74 73  r, 0, sizeof(Fts
19a20 35 53 65 67 57 72 69 74 65 72 29 29 3b 0a 20 20  5SegWriter));.  
19a30 70 57 72 69 74 65 72 2d 3e 69 53 65 67 69 64 20  pWriter->iSegid 
19a40 3d 20 70 53 65 67 2d 3e 69 53 65 67 69 64 3b 0a  = pSeg->iSegid;.
19a50 20 20 70 57 72 69 74 65 72 2d 3e 61 57 72 69 74    pWriter->aWrit
19a60 65 72 20 3d 20 28 46 74 73 35 50 61 67 65 57 72  er = (Fts5PageWr
19a70 69 74 65 72 2a 29 66 74 73 35 49 64 78 4d 61 6c  iter*)fts5IdxMal
19a80 6c 6f 63 28 70 2c 20 6e 42 79 74 65 29 3b 0a 20  loc(p, nByte);. 
19a90 20 70 57 72 69 74 65 72 2d 3e 61 44 6c 69 64 78   pWriter->aDlidx
19aa0 20 3d 20 28 46 74 73 35 44 6c 69 64 78 57 72 69   = (Fts5DlidxWri
19ab0 74 65 72 2a 29 66 74 73 35 49 64 78 4d 61 6c 6c  ter*)fts5IdxMall
19ac0 6f 63 28 70 2c 20 73 69 7a 65 6f 66 28 46 74 73  oc(p, sizeof(Fts
19ad0 35 44 6c 69 64 78 57 72 69 74 65 72 29 29 3b 0a  5DlidxWriter));.
19ae0 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51  .  if( p->rc==SQ
19af0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69  LITE_OK ){.    i
19b00 6e 74 20 70 67 6e 6f 20 3d 20 31 3b 0a 20 20 20  nt pgno = 1;.   
19b10 20 69 6e 74 20 69 3b 0a 20 20 20 20 70 57 72 69   int i;.    pWri
19b20 74 65 72 2d 3e 6e 44 6c 69 64 78 20 3d 20 31 3b  ter->nDlidx = 1;
19b30 0a 20 20 20 20 70 57 72 69 74 65 72 2d 3e 6e 57  .    pWriter->nW
19b40 72 69 74 65 72 20 3d 20 70 53 65 67 2d 3e 6e 48  riter = pSeg->nH
19b50 65 69 67 68 74 3b 0a 20 20 20 20 70 57 72 69 74  eight;.    pWrit
19b60 65 72 2d 3e 61 57 72 69 74 65 72 5b 30 5d 2e 70  er->aWriter[0].p
19b70 67 6e 6f 20 3d 20 70 53 65 67 2d 3e 70 67 6e 6f  gno = pSeg->pgno
19b80 4c 61 73 74 2b 31 3b 0a 20 20 20 20 66 6f 72 28  Last+1;.    for(
19b90 69 3d 70 53 65 67 2d 3e 6e 48 65 69 67 68 74 2d  i=pSeg->nHeight-
19ba0 31 3b 20 69 3e 30 3b 20 69 2d 2d 29 7b 0a 20 20  1; i>0; i--){.  
19bb0 20 20 20 20 69 36 34 20 69 52 6f 77 69 64 20 3d      i64 iRowid =
19bc0 20 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f 52 4f   FTS5_SEGMENT_RO
19bd0 57 49 44 28 70 57 72 69 74 65 72 2d 3e 69 53 65  WID(pWriter->iSe
19be0 67 69 64 2c 20 69 2c 20 70 67 6e 6f 29 3b 0a 20  gid, i, pgno);. 
19bf0 20 20 20 20 20 46 74 73 35 50 61 67 65 57 72 69       Fts5PageWri
19c00 74 65 72 20 2a 70 50 67 20 3d 20 26 70 57 72 69  ter *pPg = &pWri
19c10 74 65 72 2d 3e 61 57 72 69 74 65 72 5b 69 5d 3b  ter->aWriter[i];
19c20 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 67 6e 6f  .      pPg->pgno
19c30 20 3d 20 70 67 6e 6f 3b 0a 20 20 20 20 20 20 66   = pgno;.      f
19c40 74 73 35 44 61 74 61 42 75 66 66 65 72 28 70 2c  ts5DataBuffer(p,
19c50 20 26 70 50 67 2d 3e 62 75 66 2c 20 69 52 6f 77   &pPg->buf, iRow
19c60 69 64 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  id);.      if( p
19c70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
19c80 29 7b 0a 20 20 20 20 20 20 20 20 46 74 73 35 4e  ){.        Fts5N
19c90 6f 64 65 49 74 65 72 20 73 73 3b 0a 20 20 20 20  odeIter ss;.    
19ca0 20 20 20 20 66 74 73 35 4e 6f 64 65 49 74 65 72      fts5NodeIter
19cb0 49 6e 69 74 28 70 50 67 2d 3e 62 75 66 2e 70 2c  Init(pPg->buf.p,
19cc0 20 70 50 67 2d 3e 62 75 66 2e 6e 2c 20 26 73 73   pPg->buf.n, &ss
19cd0 29 3b 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65  );.        while
19ce0 28 20 73 73 2e 61 44 61 74 61 20 29 20 66 74 73  ( ss.aData ) fts
19cf0 35 4e 6f 64 65 49 74 65 72 4e 65 78 74 28 26 70  5NodeIterNext(&p
19d00 2d 3e 72 63 2c 20 26 73 73 29 3b 0a 20 20 20 20  ->rc, &ss);.    
19d10 20 20 20 20 66 74 73 35 42 75 66 66 65 72 53 65      fts5BufferSe
19d20 74 28 26 70 2d 3e 72 63 2c 20 26 70 50 67 2d 3e  t(&p->rc, &pPg->
19d30 74 65 72 6d 2c 20 73 73 2e 74 65 72 6d 2e 6e 2c  term, ss.term.n,
19d40 20 73 73 2e 74 65 72 6d 2e 70 29 3b 0a 20 20 20   ss.term.p);.   
19d50 20 20 20 20 20 70 67 6e 6f 20 3d 20 73 73 2e 69       pgno = ss.i
19d60 43 68 69 6c 64 3b 0a 20 20 20 20 20 20 20 20 66  Child;.        f
19d70 74 73 35 4e 6f 64 65 49 74 65 72 46 72 65 65 28  ts5NodeIterFree(
19d80 26 73 73 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  &ss);.      }.  
19d90 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20    }.    assert( 
19da0 70 2d 3e 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc!=SQLITE_OK
19db0 20 7c 7c 20 28 70 67 6e 6f 2b 70 57 72 69 74 65   || (pgno+pWrite
19dc0 72 2d 3e 6e 45 6d 70 74 79 29 3d 3d 70 53 65 67  r->nEmpty)==pSeg
19dd0 2d 3e 70 67 6e 6f 4c 61 73 74 20 29 3b 0a 20 20  ->pgnoLast );.  
19de0 20 20 70 57 72 69 74 65 72 2d 3e 62 46 69 72 73    pWriter->bFirs
19df0 74 54 65 72 6d 49 6e 50 61 67 65 20 3d 20 31 3b  tTermInPage = 1;
19e00 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 57 72  .    assert( pWr
19e10 69 74 65 72 2d 3e 61 57 72 69 74 65 72 5b 30 5d  iter->aWriter[0]
19e20 2e 74 65 72 6d 2e 6e 3d 3d 30 20 29 3b 0a 20 20  .term.n==0 );.  
19e30 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 74 65 72 61  }.}../*.** Itera
19e40 74 6f 72 20 70 49 74 65 72 20 77 61 73 20 75 73  tor pIter was us
19e50 65 64 20 74 6f 20 69 74 65 72 61 74 65 20 74 68  ed to iterate th
19e60 72 6f 75 67 68 20 74 68 65 20 69 6e 70 75 74 20  rough the input 
19e70 73 65 67 6d 65 6e 74 73 20 6f 66 20 6f 6e 20 61  segments of on a
19e80 6e 0a 2a 2a 20 69 6e 63 72 65 6d 65 6e 74 61 6c  n.** incremental
19e90 20 6d 65 72 67 65 20 6f 70 65 72 61 74 69 6f 6e   merge operation
19ea0 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  . This function 
19eb0 69 73 20 63 61 6c 6c 65 64 20 69 66 20 74 68 65  is called if the
19ec0 20 69 6e 63 72 65 6d 65 6e 74 61 6c 0a 2a 2a 20   incremental.** 
19ed0 6d 65 72 67 65 20 73 74 65 70 20 68 61 73 20 66  merge step has f
19ee0 69 6e 69 73 68 65 64 20 62 75 74 20 74 68 65 20  inished but the 
19ef0 69 6e 70 75 74 20 68 61 73 20 6e 6f 74 20 62 65  input has not be
19f00 65 6e 20 63 6f 6d 70 6c 65 74 65 6c 79 20 65 78  en completely ex
19f10 68 61 75 73 74 65 64 2e 0a 2a 2f 0a 73 74 61 74  hausted..*/.stat
19f20 69 63 20 76 6f 69 64 20 66 74 73 35 54 72 69 6d  ic void fts5Trim
19f30 53 65 67 6d 65 6e 74 73 28 46 74 73 35 49 6e 64  Segments(Fts5Ind
19f40 65 78 20 2a 70 2c 20 46 74 73 35 4d 75 6c 74 69  ex *p, Fts5Multi
19f50 53 65 67 49 74 65 72 20 2a 70 49 74 65 72 29 7b  SegIter *pIter){
19f60 0a 20 20 69 6e 74 20 69 3b 0a 20 20 46 74 73 35  .  int i;.  Fts5
19f70 42 75 66 66 65 72 20 62 75 66 3b 0a 20 20 6d 65  Buffer buf;.  me
19f80 6d 73 65 74 28 26 62 75 66 2c 20 30 2c 20 73 69  mset(&buf, 0, si
19f90 7a 65 6f 66 28 46 74 73 35 42 75 66 66 65 72 29  zeof(Fts5Buffer)
19fa0 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  );.  for(i=0; i<
19fb0 70 49 74 65 72 2d 3e 6e 53 65 67 3b 20 69 2b 2b  pIter->nSeg; i++
19fc0 29 7b 0a 20 20 20 20 46 74 73 35 53 65 67 49 74  ){.    Fts5SegIt
19fd0 65 72 20 2a 70 53 65 67 20 3d 20 26 70 49 74 65  er *pSeg = &pIte
19fe0 72 2d 3e 61 53 65 67 5b 69 5d 3b 0a 20 20 20 20  r->aSeg[i];.    
19ff0 69 66 28 20 70 53 65 67 2d 3e 70 53 65 67 3d 3d  if( pSeg->pSeg==
1a000 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 6e 6f  0 ){.      /* no
1a010 2d 6f 70 20 2a 2f 0a 20 20 20 20 7d 65 6c 73 65  -op */.    }else
1a020 20 69 66 28 20 70 53 65 67 2d 3e 70 4c 65 61 66   if( pSeg->pLeaf
1a030 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  ==0 ){.      /* 
1a040 41 6c 6c 20 6b 65 79 73 20 66 72 6f 6d 20 74 68  All keys from th
1a050 69 73 20 69 6e 70 75 74 20 73 65 67 6d 65 6e 74  is input segment
1a060 20 68 61 76 65 20 62 65 65 6e 20 74 72 61 6e 73   have been trans
1a070 66 65 72 65 64 20 74 6f 20 74 68 65 20 6f 75 74  fered to the out
1a080 70 75 74 2e 0a 20 20 20 20 20 20 2a 2a 20 53 65  put..      ** Se
1a090 74 20 62 6f 74 68 20 74 68 65 20 66 69 72 73 74  t both the first
1a0a0 20 61 6e 64 20 6c 61 73 74 20 70 61 67 65 2d 6e   and last page-n
1a0b0 75 6d 62 65 72 73 20 74 6f 20 30 20 74 6f 20 69  umbers to 0 to i
1a0c0 6e 64 69 63 61 74 65 20 74 68 61 74 20 74 68 65  ndicate that the
1a0d0 0a 20 20 20 20 20 20 2a 2a 20 73 65 67 6d 65 6e  .      ** segmen
1a0e0 74 20 69 73 20 6e 6f 77 20 65 6d 70 74 79 2e 20  t is now empty. 
1a0f0 2a 2f 0a 20 20 20 20 20 20 70 53 65 67 2d 3e 70  */.      pSeg->p
1a100 53 65 67 2d 3e 70 67 6e 6f 4c 61 73 74 20 3d 20  Seg->pgnoLast = 
1a110 30 3b 0a 20 20 20 20 20 20 70 53 65 67 2d 3e 70  0;.      pSeg->p
1a120 53 65 67 2d 3e 70 67 6e 6f 46 69 72 73 74 20 3d  Seg->pgnoFirst =
1a130 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   0;.    }else{. 
1a140 20 20 20 20 20 69 6e 74 20 69 4f 66 66 20 3d 20       int iOff = 
1a150 70 53 65 67 2d 3e 69 54 65 72 6d 4c 65 61 66 4f  pSeg->iTermLeafO
1a160 66 66 73 65 74 3b 20 20 20 20 20 2f 2a 20 4f 66  ffset;     /* Of
1a170 66 73 65 74 20 6f 6e 20 6e 65 77 20 66 69 72 73  fset on new firs
1a180 74 20 6c 65 61 66 20 70 61 67 65 20 2a 2f 0a 20  t leaf page */. 
1a190 20 20 20 20 20 69 36 34 20 69 4c 65 61 66 52 6f       i64 iLeafRo
1a1a0 77 69 64 3b 0a 20 20 20 20 20 20 46 74 73 35 44  wid;.      Fts5D
1a1b0 61 74 61 20 2a 70 44 61 74 61 3b 0a 20 20 20 20  ata *pData;.    
1a1c0 20 20 69 6e 74 20 69 49 64 20 3d 20 70 53 65 67    int iId = pSeg
1a1d0 2d 3e 70 53 65 67 2d 3e 69 53 65 67 69 64 3b 0a  ->pSeg->iSegid;.
1a1e0 20 20 20 20 20 20 75 38 20 61 48 64 72 5b 34 5d        u8 aHdr[4]
1a1f0 20 3d 20 7b 30 78 30 30 2c 20 30 78 30 30 2c 20   = {0x00, 0x00, 
1a200 30 78 30 30 2c 20 30 78 30 34 7d 3b 0a 0a 20 20  0x00, 0x04};..  
1a210 20 20 20 20 69 4c 65 61 66 52 6f 77 69 64 20 3d      iLeafRowid =
1a220 20 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f 52 4f   FTS5_SEGMENT_RO
1a230 57 49 44 28 69 49 64 2c 20 30 2c 20 70 53 65 67  WID(iId, 0, pSeg
1a240 2d 3e 69 54 65 72 6d 4c 65 61 66 50 67 6e 6f 29  ->iTermLeafPgno)
1a250 3b 0a 20 20 20 20 20 20 70 44 61 74 61 20 3d 20  ;.      pData = 
1a260 66 74 73 35 44 61 74 61 52 65 61 64 28 70 2c 20  fts5DataRead(p, 
1a270 69 4c 65 61 66 52 6f 77 69 64 29 3b 0a 20 20 20  iLeafRowid);.   
1a280 20 20 20 69 66 28 20 70 44 61 74 61 20 29 7b 0a     if( pData ){.
1a290 20 20 20 20 20 20 20 20 66 74 73 35 42 75 66 66          fts5Buff
1a2a0 65 72 5a 65 72 6f 28 26 62 75 66 29 3b 0a 20 20  erZero(&buf);.  
1a2b0 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72        fts5Buffer
1a2c0 41 70 70 65 6e 64 42 6c 6f 62 28 26 70 2d 3e 72  AppendBlob(&p->r
1a2d0 63 2c 20 26 62 75 66 2c 20 73 69 7a 65 6f 66 28  c, &buf, sizeof(
1a2e0 61 48 64 72 29 2c 20 61 48 64 72 29 3b 0a 20 20  aHdr), aHdr);.  
1a2f0 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72        fts5Buffer
1a300 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26 70 2d  AppendVarint(&p-
1a310 3e 72 63 2c 20 26 62 75 66 2c 20 70 53 65 67 2d  >rc, &buf, pSeg-
1a320 3e 74 65 72 6d 2e 6e 29 3b 0a 20 20 20 20 20 20  >term.n);.      
1a330 20 20 66 74 73 35 42 75 66 66 65 72 41 70 70 65    fts5BufferAppe
1a340 6e 64 42 6c 6f 62 28 26 70 2d 3e 72 63 2c 20 26  ndBlob(&p->rc, &
1a350 62 75 66 2c 20 70 53 65 67 2d 3e 74 65 72 6d 2e  buf, pSeg->term.
1a360 6e 2c 20 70 53 65 67 2d 3e 74 65 72 6d 2e 70 29  n, pSeg->term.p)
1a370 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35 42 75  ;.        fts5Bu
1a380 66 66 65 72 41 70 70 65 6e 64 42 6c 6f 62 28 26  fferAppendBlob(&
1a390 70 2d 3e 72 63 2c 20 26 62 75 66 2c 20 70 44 61  p->rc, &buf, pDa
1a3a0 74 61 2d 3e 6e 20 2d 20 69 4f 66 66 2c 20 26 70  ta->n - iOff, &p
1a3b0 44 61 74 61 2d 3e 70 5b 69 4f 66 66 5d 29 3b 0a  Data->p[iOff]);.
1a3c0 20 20 20 20 20 20 20 20 66 74 73 35 44 61 74 61          fts5Data
1a3d0 52 65 6c 65 61 73 65 28 70 44 61 74 61 29 3b 0a  Release(pData);.
1a3e0 20 20 20 20 20 20 20 20 70 53 65 67 2d 3e 70 53          pSeg->pS
1a3f0 65 67 2d 3e 70 67 6e 6f 46 69 72 73 74 20 3d 20  eg->pgnoFirst = 
1a400 70 53 65 67 2d 3e 69 54 65 72 6d 4c 65 61 66 50  pSeg->iTermLeafP
1a410 67 6e 6f 3b 0a 20 20 20 20 20 20 20 20 66 74 73  gno;.        fts
1a420 35 44 61 74 61 44 65 6c 65 74 65 28 70 2c 20 46  5DataDelete(p, F
1a430 54 53 35 5f 53 45 47 4d 45 4e 54 5f 52 4f 57 49  TS5_SEGMENT_ROWI
1a440 44 28 69 49 64 2c 20 30 2c 20 31 29 2c 69 4c 65  D(iId, 0, 1),iLe
1a450 61 66 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20  afRowid);.      
1a460 20 20 66 74 73 35 44 61 74 61 57 72 69 74 65 28    fts5DataWrite(
1a470 70 2c 20 69 4c 65 61 66 52 6f 77 69 64 2c 20 62  p, iLeafRowid, b
1a480 75 66 2e 70 2c 20 62 75 66 2e 6e 29 3b 0a 20 20  uf.p, buf.n);.  
1a490 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
1a4a0 20 20 66 74 73 35 42 75 66 66 65 72 46 72 65 65    fts5BufferFree
1a4b0 28 26 62 75 66 29 3b 0a 7d 0a 0a 73 74 61 74 69  (&buf);.}..stati
1a4c0 63 20 76 6f 69 64 20 66 74 73 35 4d 65 72 67 65  c void fts5Merge
1a4d0 43 68 75 6e 6b 43 61 6c 6c 62 61 63 6b 28 0a 20  ChunkCallback(. 
1a4e0 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 0a   Fts5Index *p, .
1a4f0 20 20 76 6f 69 64 20 2a 70 43 74 78 2c 20 0a 20    void *pCtx, . 
1a500 20 63 6f 6e 73 74 20 75 38 20 2a 70 43 68 75 6e   const u8 *pChun
1a510 6b 2c 20 69 6e 74 20 6e 43 68 75 6e 6b 0a 29 7b  k, int nChunk.){
1a520 0a 20 20 46 74 73 35 53 65 67 57 72 69 74 65 72  .  Fts5SegWriter
1a530 20 2a 70 57 72 69 74 65 72 20 3d 20 28 46 74 73   *pWriter = (Fts
1a540 35 53 65 67 57 72 69 74 65 72 2a 29 70 43 74 78  5SegWriter*)pCtx
1a550 3b 0a 20 20 66 74 73 35 57 72 69 74 65 41 70 70  ;.  fts5WriteApp
1a560 65 6e 64 50 6f 73 6c 69 73 74 44 61 74 61 28 70  endPoslistData(p
1a570 2c 20 70 57 72 69 74 65 72 2c 20 70 43 68 75 6e  , pWriter, pChun
1a580 6b 2c 20 6e 43 68 75 6e 6b 29 3b 0a 7d 0a 0a 2f  k, nChunk);.}../
1a590 2a 0a 2a 2a 0a 2a 2f 0a 73 74 61 74 69 63 20 76  *.**.*/.static v
1a5a0 6f 69 64 20 66 74 73 35 49 6e 64 65 78 4d 65 72  oid fts5IndexMer
1a5b0 67 65 4c 65 76 65 6c 28 0a 20 20 46 74 73 35 49  geLevel(.  Fts5I
1a5c0 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20  ndex *p,        
1a5d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54             /* FT
1a5e0 53 35 20 62 61 63 6b 65 6e 64 20 6f 62 6a 65 63  S5 backend objec
1a5f0 74 20 2a 2f 0a 20 20 46 74 73 35 53 74 72 75 63  t */.  Fts5Struc
1a600 74 75 72 65 20 2a 2a 70 70 53 74 72 75 63 74 2c  ture **ppStruct,
1a610 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54         /* IN/OUT
1a620 3a 20 53 74 75 63 74 75 72 65 20 6f 66 20 69 6e  : Stucture of in
1a630 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 76  dex */.  int iLv
1a640 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l,              
1a650 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 76 65           /* Leve
1a660 6c 20 74 6f 20 72 65 61 64 20 69 6e 70 75 74 20  l to read input 
1a670 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20 2a 70  from */.  int *p
1a680 6e 52 65 6d 20 20 20 20 20 20 20 20 20 20 20 20  nRem            
1a690 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69            /* Wri
1a6a0 74 65 20 75 70 20 74 6f 20 74 68 69 73 20 6d 61  te up to this ma
1a6b0 6e 79 20 6f 75 74 70 75 74 20 6c 65 61 76 65 73  ny output leaves
1a6c0 20 2a 2f 0a 29 7b 0a 20 20 46 74 73 35 53 74 72   */.){.  Fts5Str
1a6d0 75 63 74 75 72 65 20 2a 70 53 74 72 75 63 74 20  ucture *pStruct 
1a6e0 3d 20 2a 70 70 53 74 72 75 63 74 3b 0a 20 20 46  = *ppStruct;.  F
1a6f0 74 73 35 53 74 72 75 63 74 75 72 65 4c 65 76 65  ts5StructureLeve
1a700 6c 20 2a 70 4c 76 6c 20 3d 20 26 70 53 74 72 75  l *pLvl = &pStru
1a710 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d  ct->aLevel[iLvl]
1a720 3b 0a 20 20 46 74 73 35 53 74 72 75 63 74 75 72  ;.  Fts5Structur
1a730 65 4c 65 76 65 6c 20 2a 70 4c 76 6c 4f 75 74 3b  eLevel *pLvlOut;
1a740 0a 20 20 46 74 73 35 4d 75 6c 74 69 53 65 67 49  .  Fts5MultiSegI
1a750 74 65 72 20 2a 70 49 74 65 72 20 3d 20 30 3b 20  ter *pIter = 0; 
1a760 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 74     /* Iterator t
1a770 6f 20 72 65 61 64 20 69 6e 70 75 74 20 64 61 74  o read input dat
1a780 61 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 6d 20  a */.  int nRem 
1a790 3d 20 70 6e 52 65 6d 20 3f 20 2a 70 6e 52 65 6d  = pnRem ? *pnRem
1a7a0 20 3a 20 30 3b 20 20 2f 2a 20 4f 75 74 70 75 74   : 0;  /* Output
1a7b0 20 6c 65 61 66 20 70 61 67 65 73 20 6c 65 66 74   leaf pages left
1a7c0 20 74 6f 20 77 72 69 74 65 20 2a 2f 0a 20 20 69   to write */.  i
1a7d0 6e 74 20 6e 49 6e 70 75 74 3b 20 20 20 20 20 20  nt nInput;      
1a7e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1a7f0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 69 6e 70 75  * Number of inpu
1a800 74 20 73 65 67 6d 65 6e 74 73 20 2a 2f 0a 20 20  t segments */.  
1a810 46 74 73 35 53 65 67 57 72 69 74 65 72 20 77 72  Fts5SegWriter wr
1a820 69 74 65 72 3b 20 20 20 20 20 20 20 20 20 20 20  iter;           
1a830 2f 2a 20 57 72 69 74 65 72 20 6f 62 6a 65 63 74  /* Writer object
1a840 20 2a 2f 0a 20 20 46 74 73 35 53 74 72 75 63 74   */.  Fts5Struct
1a850 75 72 65 53 65 67 6d 65 6e 74 20 2a 70 53 65 67  ureSegment *pSeg
1a860 3b 20 20 20 20 20 2f 2a 20 4f 75 74 70 75 74 20  ;     /* Output 
1a870 73 65 67 6d 65 6e 74 20 2a 2f 0a 20 20 46 74 73  segment */.  Fts
1a880 35 42 75 66 66 65 72 20 74 65 72 6d 3b 0a 20 20  5Buffer term;.  
1a890 69 6e 74 20 62 52 65 71 75 69 72 65 44 6f 63 6c  int bRequireDocl
1a8a0 69 73 74 54 65 72 6d 20 3d 20 30 3b 20 20 20 20  istTerm = 0;    
1a8b0 2f 2a 20 44 6f 63 6c 69 73 74 20 74 65 72 6d 69  /* Doclist termi
1a8c0 6e 61 74 6f 72 20 28 30 78 30 30 29 20 72 65 71  nator (0x00) req
1a8d0 75 69 72 65 64 20 2a 2f 0a 20 20 69 6e 74 20 62  uired */.  int b
1a8e0 4f 6c 64 65 73 74 3b 20 20 20 20 20 20 20 20 20  Oldest;         
1a8f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
1a900 75 65 20 69 66 20 74 68 65 20 6f 75 74 70 75 74  ue if the output
1a910 20 73 65 67 6d 65 6e 74 20 69 73 20 74 68 65 20   segment is the 
1a920 6f 6c 64 65 73 74 20 2a 2f 0a 0a 20 20 61 73 73  oldest */..  ass
1a930 65 72 74 28 20 69 4c 76 6c 3c 70 53 74 72 75 63  ert( iLvl<pStruc
1a940 74 2d 3e 6e 4c 65 76 65 6c 20 29 3b 0a 20 20 61  t->nLevel );.  a
1a950 73 73 65 72 74 28 20 70 4c 76 6c 2d 3e 6e 4d 65  ssert( pLvl->nMe
1a960 72 67 65 3c 3d 70 4c 76 6c 2d 3e 6e 53 65 67 20  rge<=pLvl->nSeg 
1a970 29 3b 0a 0a 20 20 6d 65 6d 73 65 74 28 26 77 72  );..  memset(&wr
1a980 69 74 65 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28  iter, 0, sizeof(
1a990 46 74 73 35 53 65 67 57 72 69 74 65 72 29 29 3b  Fts5SegWriter));
1a9a0 0a 20 20 6d 65 6d 73 65 74 28 26 74 65 72 6d 2c  .  memset(&term,
1a9b0 20 30 2c 20 73 69 7a 65 6f 66 28 46 74 73 35 42   0, sizeof(Fts5B
1a9c0 75 66 66 65 72 29 29 3b 0a 20 20 69 66 28 20 70  uffer));.  if( p
1a9d0 4c 76 6c 2d 3e 6e 4d 65 72 67 65 20 29 7b 0a 20  Lvl->nMerge ){. 
1a9e0 20 20 20 70 4c 76 6c 4f 75 74 20 3d 20 26 70 53     pLvlOut = &pS
1a9f0 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c  truct->aLevel[iL
1aa00 76 6c 2b 31 5d 3b 0a 20 20 20 20 61 73 73 65 72  vl+1];.    asser
1aa10 74 28 20 70 4c 76 6c 4f 75 74 2d 3e 6e 53 65 67  t( pLvlOut->nSeg
1aa20 3e 30 20 29 3b 0a 20 20 20 20 6e 49 6e 70 75 74  >0 );.    nInput
1aa30 20 3d 20 70 4c 76 6c 2d 3e 6e 4d 65 72 67 65 3b   = pLvl->nMerge;
1aa40 0a 20 20 20 20 66 74 73 35 57 72 69 74 65 49 6e  .    fts5WriteIn
1aa50 69 74 46 6f 72 41 70 70 65 6e 64 28 70 2c 20 26  itForAppend(p, &
1aa60 77 72 69 74 65 72 2c 20 26 70 4c 76 6c 4f 75 74  writer, &pLvlOut
1aa70 2d 3e 61 53 65 67 5b 70 4c 76 6c 4f 75 74 2d 3e  ->aSeg[pLvlOut->
1aa80 6e 53 65 67 2d 31 5d 29 3b 0a 20 20 20 20 70 53  nSeg-1]);.    pS
1aa90 65 67 20 3d 20 26 70 4c 76 6c 4f 75 74 2d 3e 61  eg = &pLvlOut->a
1aaa0 53 65 67 5b 70 4c 76 6c 4f 75 74 2d 3e 6e 53 65  Seg[pLvlOut->nSe
1aab0 67 2d 31 5d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  g-1];.  }else{. 
1aac0 20 20 20 69 6e 74 20 69 53 65 67 69 64 20 3d 20     int iSegid = 
1aad0 66 74 73 35 41 6c 6c 6f 63 61 74 65 53 65 67 69  fts5AllocateSegi
1aae0 64 28 70 2c 20 70 53 74 72 75 63 74 29 3b 0a 0a  d(p, pStruct);..
1aaf0 20 20 20 20 2f 2a 20 45 78 74 65 6e 64 20 74 68      /* Extend th
1ab00 65 20 46 74 73 35 53 74 72 75 63 74 75 72 65 20  e Fts5Structure 
1ab10 6f 62 6a 65 63 74 20 61 73 20 72 65 71 75 69 72  object as requir
1ab20 65 64 20 74 6f 20 65 6e 73 75 72 65 20 74 68 65  ed to ensure the
1ab30 20 6f 75 74 70 75 74 0a 20 20 20 20 2a 2a 20 73   output.    ** s
1ab40 65 67 6d 65 6e 74 20 65 78 69 73 74 73 2e 20 2a  egment exists. *
1ab50 2f 0a 20 20 20 20 69 66 28 20 69 4c 76 6c 3d 3d  /.    if( iLvl==
1ab60 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 2d  pStruct->nLevel-
1ab70 31 20 29 7b 0a 20 20 20 20 20 20 66 74 73 35 53  1 ){.      fts5S
1ab80 74 72 75 63 74 75 72 65 41 64 64 4c 65 76 65 6c  tructureAddLevel
1ab90 28 26 70 2d 3e 72 63 2c 20 70 70 53 74 72 75 63  (&p->rc, ppStruc
1aba0 74 29 3b 0a 20 20 20 20 20 20 70 53 74 72 75 63  t);.      pStruc
1abb0 74 20 3d 20 2a 70 70 53 74 72 75 63 74 3b 0a 20  t = *ppStruct;. 
1abc0 20 20 20 7d 0a 20 20 20 20 66 74 73 35 53 74 72     }.    fts5Str
1abd0 75 63 74 75 72 65 45 78 74 65 6e 64 4c 65 76 65  uctureExtendLeve
1abe0 6c 28 26 70 2d 3e 72 63 2c 20 70 53 74 72 75 63  l(&p->rc, pStruc
1abf0 74 2c 20 69 4c 76 6c 2b 31 2c 20 31 2c 20 30 29  t, iLvl+1, 1, 0)
1ac00 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 72 63 20  ;.    if( p->rc 
1ac10 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 70 4c  ) return;.    pL
1ac20 76 6c 20 3d 20 26 70 53 74 72 75 63 74 2d 3e 61  vl = &pStruct->a
1ac30 4c 65 76 65 6c 5b 69 4c 76 6c 5d 3b 0a 20 20 20  Level[iLvl];.   
1ac40 20 70 4c 76 6c 4f 75 74 20 3d 20 26 70 53 74 72   pLvlOut = &pStr
1ac50 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c  uct->aLevel[iLvl
1ac60 2b 31 5d 3b 0a 0a 20 20 20 20 66 74 73 35 57 72  +1];..    fts5Wr
1ac70 69 74 65 49 6e 69 74 28 70 2c 20 26 77 72 69 74  iteInit(p, &writ
1ac80 65 72 2c 20 69 53 65 67 69 64 29 3b 0a 0a 20 20  er, iSegid);..  
1ac90 20 20 2f 2a 20 41 64 64 20 74 68 65 20 6e 65 77    /* Add the new
1aca0 20 73 65 67 6d 65 6e 74 20 74 6f 20 74 68 65 20   segment to the 
1acb0 6f 75 74 70 75 74 20 6c 65 76 65 6c 20 2a 2f 0a  output level */.
1acc0 20 20 20 20 70 53 65 67 20 3d 20 26 70 4c 76 6c      pSeg = &pLvl
1acd0 4f 75 74 2d 3e 61 53 65 67 5b 70 4c 76 6c 4f 75  Out->aSeg[pLvlOu
1ace0 74 2d 3e 6e 53 65 67 5d 3b 0a 20 20 20 20 70 4c  t->nSeg];.    pL
1acf0 76 6c 4f 75 74 2d 3e 6e 53 65 67 2b 2b 3b 0a 20  vlOut->nSeg++;. 
1ad00 20 20 20 70 53 65 67 2d 3e 70 67 6e 6f 46 69 72     pSeg->pgnoFir
1ad10 73 74 20 3d 20 31 3b 0a 20 20 20 20 70 53 65 67  st = 1;.    pSeg
1ad20 2d 3e 69 53 65 67 69 64 20 3d 20 69 53 65 67 69  ->iSegid = iSegi
1ad30 64 3b 0a 20 20 20 20 70 53 74 72 75 63 74 2d 3e  d;.    pStruct->
1ad40 6e 53 65 67 6d 65 6e 74 2b 2b 3b 0a 0a 20 20 20  nSegment++;..   
1ad50 20 2f 2a 20 52 65 61 64 20 69 6e 70 75 74 20 66   /* Read input f
1ad60 72 6f 6d 20 61 6c 6c 20 73 65 67 6d 65 6e 74 73  rom all segments
1ad70 20 69 6e 20 74 68 65 20 69 6e 70 75 74 20 6c 65   in the input le
1ad80 76 65 6c 20 2a 2f 0a 20 20 20 20 6e 49 6e 70 75  vel */.    nInpu
1ad90 74 20 3d 20 70 4c 76 6c 2d 3e 6e 53 65 67 3b 0a  t = pLvl->nSeg;.
1ada0 20 20 7d 0a 20 20 62 4f 6c 64 65 73 74 20 3d 20    }.  bOldest = 
1adb0 28 70 4c 76 6c 4f 75 74 2d 3e 6e 53 65 67 3d 3d  (pLvlOut->nSeg==
1adc0 31 20 26 26 20 70 53 74 72 75 63 74 2d 3e 6e 4c  1 && pStruct->nL
1add0 65 76 65 6c 3d 3d 69 4c 76 6c 2b 32 29 3b 0a 0a  evel==iLvl+2);..
1ade0 20 20 61 73 73 65 72 74 28 20 69 4c 76 6c 3e 3d    assert( iLvl>=
1adf0 30 20 29 3b 0a 20 20 66 6f 72 28 66 74 73 35 4d  0 );.  for(fts5M
1ae00 75 6c 74 69 49 74 65 72 4e 65 77 28 70 2c 20 70  ultiIterNew(p, p
1ae10 53 74 72 75 63 74 2c 20 30 2c 20 30 2c 20 30 2c  Struct, 0, 0, 0,
1ae20 20 30 2c 20 69 4c 76 6c 2c 20 6e 49 6e 70 75 74   0, iLvl, nInput
1ae30 2c 20 26 70 49 74 65 72 29 3b 0a 20 20 20 20 20  , &pIter);.     
1ae40 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 45 6f   fts5MultiIterEo
1ae50 66 28 70 2c 20 70 49 74 65 72 29 3d 3d 30 3b 0a  f(p, pIter)==0;.
1ae60 20 20 20 20 20 20 66 74 73 35 4d 75 6c 74 69 49        fts5MultiI
1ae70 74 65 72 4e 65 78 74 28 70 2c 20 70 49 74 65 72  terNext(p, pIter
1ae80 2c 20 30 2c 20 30 29 0a 20 20 29 7b 0a 20 20 20  , 0, 0).  ){.   
1ae90 20 46 74 73 35 53 65 67 49 74 65 72 20 2a 70 53   Fts5SegIter *pS
1aea0 65 67 20 3d 20 26 70 49 74 65 72 2d 3e 61 53 65  eg = &pIter->aSe
1aeb0 67 5b 20 70 49 74 65 72 2d 3e 61 46 69 72 73 74  g[ pIter->aFirst
1aec0 5b 31 5d 2e 69 46 69 72 73 74 20 5d 3b 0a 20 20  [1].iFirst ];.  
1aed0 20 20 69 6e 74 20 6e 50 6f 73 3b 20 20 20 20 20    int nPos;     
1aee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1aef0 2f 2a 20 70 6f 73 69 74 69 6f 6e 2d 6c 69 73 74  /* position-list
1af00 20 73 69 7a 65 20 66 69 65 6c 64 20 76 61 6c 75   size field valu
1af10 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 54 65  e */.    int nTe
1af20 72 6d 3b 0a 20 20 20 20 63 6f 6e 73 74 20 75 38  rm;.    const u8
1af30 20 2a 70 54 65 72 6d 3b 0a 0a 20 20 20 20 2f 2a   *pTerm;..    /*
1af40 20 43 68 65 63 6b 20 66 6f 72 20 6b 65 79 20 61   Check for key a
1af50 6e 6e 69 68 69 6c 61 74 69 6f 6e 2e 20 2a 2f 0a  nnihilation. */.
1af60 20 20 20 20 69 66 28 20 70 53 65 67 2d 3e 6e 50      if( pSeg->nP
1af70 6f 73 3d 3d 30 20 26 26 20 28 62 4f 6c 64 65 73  os==0 && (bOldes
1af80 74 20 7c 7c 20 70 53 65 67 2d 3e 62 44 65 6c 3d  t || pSeg->bDel=
1af90 3d 30 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  =0) ) continue;.
1afa0 0a 20 20 20 20 70 54 65 72 6d 20 3d 20 66 74 73  .    pTerm = fts
1afb0 35 4d 75 6c 74 69 49 74 65 72 54 65 72 6d 28 70  5MultiIterTerm(p
1afc0 49 74 65 72 2c 20 26 6e 54 65 72 6d 29 3b 0a 20  Iter, &nTerm);. 
1afd0 20 20 20 69 66 28 20 6e 54 65 72 6d 21 3d 74 65     if( nTerm!=te
1afe0 72 6d 2e 6e 20 7c 7c 20 6d 65 6d 63 6d 70 28 70  rm.n || memcmp(p
1aff0 54 65 72 6d 2c 20 74 65 72 6d 2e 70 2c 20 6e 54  Term, term.p, nT
1b000 65 72 6d 29 20 29 7b 0a 20 20 20 20 20 20 69 66  erm) ){.      if
1b010 28 20 70 6e 52 65 6d 20 26 26 20 77 72 69 74 65  ( pnRem && write
1b020 72 2e 6e 4c 65 61 66 57 72 69 74 74 65 6e 3e 6e  r.nLeafWritten>n
1b030 52 65 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 62  Rem ){.        b
1b040 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  reak;.      }.. 
1b050 20 20 20 20 20 2f 2a 20 54 68 69 73 20 69 73 20       /* This is 
1b060 61 20 6e 65 77 20 74 65 72 6d 2e 20 41 70 70 65  a new term. Appe
1b070 6e 64 20 61 20 74 65 72 6d 20 74 6f 20 74 68 65  nd a term to the
1b080 20 6f 75 74 70 75 74 20 73 65 67 6d 65 6e 74 2e   output segment.
1b090 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 62 52   */.      if( bR
1b0a0 65 71 75 69 72 65 44 6f 63 6c 69 73 74 54 65 72  equireDoclistTer
1b0b0 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 66 74 73  m ){.        fts
1b0c0 35 57 72 69 74 65 41 70 70 65 6e 64 5a 65 72 6f  5WriteAppendZero
1b0d0 62 79 74 65 28 70 2c 20 26 77 72 69 74 65 72 29  byte(p, &writer)
1b0e0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1b0f0 66 74 73 35 57 72 69 74 65 41 70 70 65 6e 64 54  fts5WriteAppendT
1b100 65 72 6d 28 70 2c 20 26 77 72 69 74 65 72 2c 20  erm(p, &writer, 
1b110 6e 54 65 72 6d 2c 20 70 54 65 72 6d 29 3b 0a 20  nTerm, pTerm);. 
1b120 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72 53       fts5BufferS
1b130 65 74 28 26 70 2d 3e 72 63 2c 20 26 74 65 72 6d  et(&p->rc, &term
1b140 2c 20 6e 54 65 72 6d 2c 20 70 54 65 72 6d 29 3b  , nTerm, pTerm);
1b150 0a 20 20 20 20 20 20 62 52 65 71 75 69 72 65 44  .      bRequireD
1b160 6f 63 6c 69 73 74 54 65 72 6d 20 3d 20 31 3b 0a  oclistTerm = 1;.
1b170 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 70      }..    /* Ap
1b180 70 65 6e 64 20 74 68 65 20 72 6f 77 69 64 20 74  pend the rowid t
1b190 6f 20 74 68 65 20 6f 75 74 70 75 74 20 2a 2f 0a  o the output */.
1b1a0 20 20 20 20 2f 2a 20 57 52 49 54 45 50 4f 53 4c      /* WRITEPOSL
1b1b0 49 53 54 53 49 5a 45 20 2a 2f 0a 20 20 20 20 6e  ISTSIZE */.    n
1b1c0 50 6f 73 20 3d 20 70 53 65 67 2d 3e 6e 50 6f 73  Pos = pSeg->nPos
1b1d0 2a 32 20 2b 20 70 53 65 67 2d 3e 62 44 65 6c 3b  *2 + pSeg->bDel;
1b1e0 0a 20 20 20 20 66 74 73 35 57 72 69 74 65 41 70  .    fts5WriteAp
1b1f0 70 65 6e 64 52 6f 77 69 64 28 70 2c 20 26 77 72  pendRowid(p, &wr
1b200 69 74 65 72 2c 20 66 74 73 35 4d 75 6c 74 69 49  iter, fts5MultiI
1b210 74 65 72 52 6f 77 69 64 28 70 49 74 65 72 29 2c  terRowid(pIter),
1b220 20 6e 50 6f 73 29 3b 0a 0a 20 20 20 20 2f 2a 20   nPos);..    /* 
1b230 41 70 70 65 6e 64 20 74 68 65 20 70 6f 73 69 74  Append the posit
1b240 69 6f 6e 2d 6c 69 73 74 20 64 61 74 61 20 74 6f  ion-list data to
1b250 20 74 68 65 20 6f 75 74 70 75 74 20 2a 2f 0a 20   the output */. 
1b260 20 20 20 66 74 73 35 43 68 75 6e 6b 49 74 65 72     fts5ChunkIter
1b270 61 74 65 28 70 2c 20 70 53 65 67 2c 20 28 76 6f  ate(p, pSeg, (vo
1b280 69 64 2a 29 26 77 72 69 74 65 72 2c 20 66 74 73  id*)&writer, fts
1b290 35 4d 65 72 67 65 43 68 75 6e 6b 43 61 6c 6c 62  5MergeChunkCallb
1b2a0 61 63 6b 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  ack);.  }..  /* 
1b2b0 46 6c 75 73 68 20 74 68 65 20 6c 61 73 74 20 6c  Flush the last l
1b2c0 65 61 66 20 70 61 67 65 20 74 6f 20 64 69 73 6b  eaf page to disk
1b2d0 2e 20 53 65 74 20 74 68 65 20 6f 75 74 70 75 74  . Set the output
1b2e0 20 73 65 67 6d 65 6e 74 20 62 2d 74 72 65 65 20   segment b-tree 
1b2f0 68 65 69 67 68 74 0a 20 20 2a 2a 20 61 6e 64 20  height.  ** and 
1b300 6c 61 73 74 20 6c 65 61 66 20 70 61 67 65 20 6e  last leaf page n
1b310 75 6d 62 65 72 20 61 74 20 74 68 65 20 73 61 6d  umber at the sam
1b320 65 20 74 69 6d 65 2e 20 20 2a 2f 0a 20 20 66 74  e time.  */.  ft
1b330 73 35 57 72 69 74 65 46 69 6e 69 73 68 28 70 2c  s5WriteFinish(p,
1b340 20 26 77 72 69 74 65 72 2c 20 26 70 53 65 67 2d   &writer, &pSeg-
1b350 3e 6e 48 65 69 67 68 74 2c 20 26 70 53 65 67 2d  >nHeight, &pSeg-
1b360 3e 70 67 6e 6f 4c 61 73 74 29 3b 0a 0a 20 20 69  >pgnoLast);..  i
1b370 66 28 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72  f( fts5MultiIter
1b380 45 6f 66 28 70 2c 20 70 49 74 65 72 29 20 29 7b  Eof(p, pIter) ){
1b390 0a 20 20 20 20 69 6e 74 20 69 3b 0a 0a 20 20 20  .    int i;..   
1b3a0 20 2f 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 72   /* Remove the r
1b3b0 65 64 75 6e 64 61 6e 74 20 73 65 67 6d 65 6e 74  edundant segment
1b3c0 73 20 66 72 6f 6d 20 74 68 65 20 25 5f 64 61 74  s from the %_dat
1b3d0 61 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 66  a table */.    f
1b3e0 6f 72 28 69 3d 30 3b 20 69 3c 6e 49 6e 70 75 74  or(i=0; i<nInput
1b3f0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 66 74  ; i++){.      ft
1b400 73 35 44 61 74 61 52 65 6d 6f 76 65 53 65 67 6d  s5DataRemoveSegm
1b410 65 6e 74 28 70 2c 20 70 4c 76 6c 2d 3e 61 53 65  ent(p, pLvl->aSe
1b420 67 5b 69 5d 2e 69 53 65 67 69 64 29 3b 0a 20 20  g[i].iSegid);.  
1b430 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 65 6d 6f    }..    /* Remo
1b440 76 65 20 74 68 65 20 72 65 64 75 6e 64 61 6e 74  ve the redundant
1b450 20 73 65 67 6d 65 6e 74 73 20 66 72 6f 6d 20 74   segments from t
1b460 68 65 20 69 6e 70 75 74 20 6c 65 76 65 6c 20 2a  he input level *
1b470 2f 0a 20 20 20 20 69 66 28 20 70 4c 76 6c 2d 3e  /.    if( pLvl->
1b480 6e 53 65 67 21 3d 6e 49 6e 70 75 74 20 29 7b 0a  nSeg!=nInput ){.
1b490 20 20 20 20 20 20 69 6e 74 20 6e 4d 6f 76 65 20        int nMove 
1b4a0 3d 20 28 70 4c 76 6c 2d 3e 6e 53 65 67 20 2d 20  = (pLvl->nSeg - 
1b4b0 6e 49 6e 70 75 74 29 20 2a 20 73 69 7a 65 6f 66  nInput) * sizeof
1b4c0 28 46 74 73 35 53 74 72 75 63 74 75 72 65 53 65  (Fts5StructureSe
1b4d0 67 6d 65 6e 74 29 3b 0a 20 20 20 20 20 20 6d 65  gment);.      me
1b4e0 6d 6d 6f 76 65 28 70 4c 76 6c 2d 3e 61 53 65 67  mmove(pLvl->aSeg
1b4f0 2c 20 26 70 4c 76 6c 2d 3e 61 53 65 67 5b 6e 49  , &pLvl->aSeg[nI
1b500 6e 70 75 74 5d 2c 20 6e 4d 6f 76 65 29 3b 0a 20  nput], nMove);. 
1b510 20 20 20 7d 0a 20 20 20 20 70 53 74 72 75 63 74     }.    pStruct
1b520 2d 3e 6e 53 65 67 6d 65 6e 74 20 2d 3d 20 6e 49  ->nSegment -= nI
1b530 6e 70 75 74 3b 0a 20 20 20 20 70 4c 76 6c 2d 3e  nput;.    pLvl->
1b540 6e 53 65 67 20 2d 3d 20 6e 49 6e 70 75 74 3b 0a  nSeg -= nInput;.
1b550 20 20 20 20 70 4c 76 6c 2d 3e 6e 4d 65 72 67 65      pLvl->nMerge
1b560 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 70 53   = 0;.    if( pS
1b570 65 67 2d 3e 70 67 6e 6f 4c 61 73 74 3d 3d 30 20  eg->pgnoLast==0 
1b580 29 7b 0a 20 20 20 20 20 20 70 4c 76 6c 4f 75 74  ){.      pLvlOut
1b590 2d 3e 6e 53 65 67 2d 2d 3b 0a 20 20 20 20 20 20  ->nSeg--;.      
1b5a0 70 53 74 72 75 63 74 2d 3e 6e 53 65 67 6d 65 6e  pStruct->nSegmen
1b5b0 74 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  t--;.    }.  }el
1b5c0 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20  se{.    assert( 
1b5d0 70 53 65 67 2d 3e 6e 48 65 69 67 68 74 3e 30 20  pSeg->nHeight>0 
1b5e0 26 26 20 70 53 65 67 2d 3e 70 67 6e 6f 4c 61 73  && pSeg->pgnoLas
1b5f0 74 3e 30 20 29 3b 0a 20 20 20 20 66 74 73 35 54  t>0 );.    fts5T
1b600 72 69 6d 53 65 67 6d 65 6e 74 73 28 70 2c 20 70  rimSegments(p, p
1b610 49 74 65 72 29 3b 0a 20 20 20 20 70 4c 76 6c 2d  Iter);.    pLvl-
1b620 3e 6e 4d 65 72 67 65 20 3d 20 6e 49 6e 70 75 74  >nMerge = nInput
1b630 3b 0a 20 20 7d 0a 0a 20 20 66 74 73 35 4d 75 6c  ;.  }..  fts5Mul
1b640 74 69 49 74 65 72 46 72 65 65 28 70 2c 20 70 49  tiIterFree(p, pI
1b650 74 65 72 29 3b 0a 20 20 66 74 73 35 42 75 66 66  ter);.  fts5Buff
1b660 65 72 46 72 65 65 28 26 74 65 72 6d 29 3b 0a 20  erFree(&term);. 
1b670 20 69 66 28 20 70 6e 52 65 6d 20 29 20 2a 70 6e   if( pnRem ) *pn
1b680 52 65 6d 20 2d 3d 20 77 72 69 74 65 72 2e 6e 4c  Rem -= writer.nL
1b690 65 61 66 57 72 69 74 74 65 6e 3b 0a 7d 0a 0a 2f  eafWritten;.}../
1b6a0 2a 0a 2a 2a 20 44 6f 20 75 70 20 74 6f 20 6e 50  *.** Do up to nP
1b6b0 67 20 70 61 67 65 73 20 6f 66 20 61 75 74 6f 6d  g pages of autom
1b6c0 65 72 67 65 20 77 6f 72 6b 20 6f 6e 20 74 68 65  erge work on the
1b6d0 20 69 6e 64 65 78 2e 0a 2a 2f 0a 73 74 61 74 69   index..*/.stati
1b6e0 63 20 76 6f 69 64 20 66 74 73 35 49 6e 64 65 78  c void fts5Index
1b6f0 4d 65 72 67 65 28 0a 20 20 46 74 73 35 49 6e 64  Merge(.  Fts5Ind
1b700 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  ex *p,          
1b710 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53 35           /* FTS5
1b720 20 62 61 63 6b 65 6e 64 20 6f 62 6a 65 63 74 20   backend object 
1b730 2a 2f 0a 20 20 46 74 73 35 53 74 72 75 63 74 75  */.  Fts5Structu
1b740 72 65 20 2a 2a 70 70 53 74 72 75 63 74 2c 20 20  re **ppStruct,  
1b750 20 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20       /* IN/OUT: 
1b760 43 75 72 72 65 6e 74 20 73 74 72 75 63 74 75 72  Current structur
1b770 65 20 6f 66 20 69 6e 64 65 78 20 2a 2f 0a 20 20  e of index */.  
1b780 69 6e 74 20 6e 50 67 20 20 20 20 20 20 20 20 20  int nPg         
1b790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b7a0 2f 2a 20 50 61 67 65 73 20 6f 66 20 77 6f 72 6b  /* Pages of work
1b7b0 20 74 6f 20 64 6f 20 2a 2f 0a 29 7b 0a 20 20 69   to do */.){.  i
1b7c0 6e 74 20 6e 52 65 6d 20 3d 20 6e 50 67 3b 0a 20  nt nRem = nPg;. 
1b7d0 20 46 74 73 35 53 74 72 75 63 74 75 72 65 20 2a   Fts5Structure *
1b7e0 70 53 74 72 75 63 74 20 3d 20 2a 70 70 53 74 72  pStruct = *ppStr
1b7f0 75 63 74 3b 0a 20 20 77 68 69 6c 65 28 20 6e 52  uct;.  while( nR
1b800 65 6d 3e 30 20 26 26 20 70 2d 3e 72 63 3d 3d 53  em>0 && p->rc==S
1b810 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1b820 69 6e 74 20 69 4c 76 6c 3b 20 20 20 20 20 20 20  int iLvl;       
1b830 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
1b840 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f 75 67  o iterate throug
1b850 68 20 6c 65 76 65 6c 73 20 2a 2f 0a 20 20 20 20  h levels */.    
1b860 69 6e 74 20 69 42 65 73 74 4c 76 6c 20 3d 20 30  int iBestLvl = 0
1b870 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c  ;           /* L
1b880 65 76 65 6c 20 6f 66 66 65 72 69 6e 67 20 74 68  evel offering th
1b890 65 20 6d 6f 73 74 20 69 6e 70 75 74 20 73 65 67  e most input seg
1b8a0 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20 69 6e 74  ments */.    int
1b8b0 20 6e 42 65 73 74 20 3d 20 30 3b 20 20 20 20 20   nBest = 0;     
1b8c0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
1b8d0 65 72 20 6f 66 20 69 6e 70 75 74 20 73 65 67 6d  er of input segm
1b8e0 65 6e 74 73 20 6f 6e 20 62 65 73 74 20 6c 65 76  ents on best lev
1b8f0 65 6c 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 53 65  el */..    /* Se
1b900 74 20 69 42 65 73 74 4c 76 6c 20 74 6f 20 74 68  t iBestLvl to th
1b910 65 20 6c 65 76 65 6c 20 74 6f 20 72 65 61 64 20  e level to read 
1b920 69 6e 70 75 74 20 73 65 67 6d 65 6e 74 73 20 66  input segments f
1b930 72 6f 6d 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65  rom. */.    asse
1b940 72 74 28 20 70 53 74 72 75 63 74 2d 3e 6e 4c 65  rt( pStruct->nLe
1b950 76 65 6c 3e 30 20 29 3b 0a 20 20 20 20 66 6f 72  vel>0 );.    for
1b960 28 69 4c 76 6c 3d 30 3b 20 69 4c 76 6c 3c 70 53  (iLvl=0; iLvl<pS
1b970 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 3b 20 69  truct->nLevel; i
1b980 4c 76 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 46 74  Lvl++){.      Ft
1b990 73 35 53 74 72 75 63 74 75 72 65 4c 65 76 65 6c  s5StructureLevel
1b9a0 20 2a 70 4c 76 6c 20 3d 20 26 70 53 74 72 75 63   *pLvl = &pStruc
1b9b0 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d 3b  t->aLevel[iLvl];
1b9c0 0a 20 20 20 20 20 20 69 66 28 20 70 4c 76 6c 2d  .      if( pLvl-
1b9d0 3e 6e 4d 65 72 67 65 20 29 7b 0a 20 20 20 20 20  >nMerge ){.     
1b9e0 20 20 20 69 66 28 20 70 4c 76 6c 2d 3e 6e 4d 65     if( pLvl->nMe
1b9f0 72 67 65 3e 6e 42 65 73 74 20 29 7b 0a 20 20 20  rge>nBest ){.   
1ba00 20 20 20 20 20 20 20 69 42 65 73 74 4c 76 6c 20         iBestLvl 
1ba10 3d 20 69 4c 76 6c 3b 0a 20 20 20 20 20 20 20 20  = iLvl;.        
1ba20 20 20 6e 42 65 73 74 20 3d 20 70 4c 76 6c 2d 3e    nBest = pLvl->
1ba30 6e 4d 65 72 67 65 3b 0a 20 20 20 20 20 20 20 20  nMerge;.        
1ba40 7d 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  }.        break;
1ba50 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
1ba60 66 28 20 70 4c 76 6c 2d 3e 6e 53 65 67 3e 6e 42  f( pLvl->nSeg>nB
1ba70 65 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20 6e  est ){.        n
1ba80 42 65 73 74 20 3d 20 70 4c 76 6c 2d 3e 6e 53 65  Best = pLvl->nSe
1ba90 67 3b 0a 20 20 20 20 20 20 20 20 69 42 65 73 74  g;.        iBest
1baa0 4c 76 6c 20 3d 20 69 4c 76 6c 3b 0a 20 20 20 20  Lvl = iLvl;.    
1bab0 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f    }.    }..    /
1bac0 2a 20 49 66 20 6e 42 65 73 74 20 69 73 20 73 74  * If nBest is st
1bad0 69 6c 6c 20 30 2c 20 74 68 65 6e 20 74 68 65 20  ill 0, then the 
1bae0 69 6e 64 65 78 20 6d 75 73 74 20 62 65 20 65 6d  index must be em
1baf0 70 74 79 2e 20 2a 2f 0a 23 69 66 64 65 66 20 53  pty. */.#ifdef S
1bb00 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20  QLITE_DEBUG.    
1bb10 66 6f 72 28 69 4c 76 6c 3d 30 3b 20 6e 42 65 73  for(iLvl=0; nBes
1bb20 74 3d 3d 30 20 26 26 20 69 4c 76 6c 3c 70 53 74  t==0 && iLvl<pSt
1bb30 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 3b 20 69 4c  ruct->nLevel; iL
1bb40 76 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 61 73 73  vl++){.      ass
1bb50 65 72 74 28 20 70 53 74 72 75 63 74 2d 3e 61 4c  ert( pStruct->aL
1bb60 65 76 65 6c 5b 69 4c 76 6c 5d 2e 6e 53 65 67 3d  evel[iLvl].nSeg=
1bb70 3d 30 20 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  =0 );.    }.#end
1bb80 69 66 0a 0a 20 20 20 20 69 66 28 20 6e 42 65 73  if..    if( nBes
1bb90 74 3c 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e 6e 41  t<p->pConfig->nA
1bba0 75 74 6f 6d 65 72 67 65 20 0a 20 20 20 20 20 20  utomerge .      
1bbb0 20 20 26 26 20 70 53 74 72 75 63 74 2d 3e 61 4c    && pStruct->aL
1bbc0 65 76 65 6c 5b 69 42 65 73 74 4c 76 6c 5d 2e 6e  evel[iBestLvl].n
1bbd0 4d 65 72 67 65 3d 3d 30 20 0a 20 20 20 20 20 20  Merge==0 .      
1bbe0 29 7b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  ){.      break;.
1bbf0 20 20 20 20 7d 0a 20 20 20 20 66 74 73 35 49 6e      }.    fts5In
1bc00 64 65 78 4d 65 72 67 65 4c 65 76 65 6c 28 70 2c  dexMergeLevel(p,
1bc10 20 26 70 53 74 72 75 63 74 2c 20 69 42 65 73 74   &pStruct, iBest
1bc20 4c 76 6c 2c 20 26 6e 52 65 6d 29 3b 0a 20 20 20  Lvl, &nRem);.   
1bc30 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49   if( p->rc==SQLI
1bc40 54 45 5f 4f 4b 20 26 26 20 70 53 74 72 75 63 74  TE_OK && pStruct
1bc50 2d 3e 61 4c 65 76 65 6c 5b 69 42 65 73 74 4c 76  ->aLevel[iBestLv
1bc60 6c 5d 2e 6e 4d 65 72 67 65 3d 3d 30 20 29 7b 0a  l].nMerge==0 ){.
1bc70 20 20 20 20 20 20 66 74 73 35 53 74 72 75 63 74        fts5Struct
1bc80 75 72 65 50 72 6f 6d 6f 74 65 28 70 2c 20 69 42  urePromote(p, iB
1bc90 65 73 74 4c 76 6c 2b 31 2c 20 70 53 74 72 75 63  estLvl+1, pStruc
1bca0 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  t);.    }.  }.  
1bcb0 2a 70 70 53 74 72 75 63 74 20 3d 20 70 53 74 72  *ppStruct = pStr
1bcc0 75 63 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20  uct;.}../*.** A 
1bcd0 74 6f 74 61 6c 20 6f 66 20 6e 4c 65 61 66 20 6c  total of nLeaf l
1bce0 65 61 66 20 70 61 67 65 73 20 6f 66 20 64 61 74  eaf pages of dat
1bcf0 61 20 68 61 73 20 6a 75 73 74 20 62 65 65 6e 20  a has just been 
1bd00 66 6c 75 73 68 65 64 20 74 6f 20 61 20 6c 65 76  flushed to a lev
1bd10 65 6c 2d 30 0a 2a 2a 20 73 65 67 6d 65 6e 74 2e  el-0.** segment.
1bd20 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 75   This function u
1bd30 70 64 61 74 65 73 20 74 68 65 20 77 72 69 74 65  pdates the write
1bd40 2d 63 6f 75 6e 74 65 72 20 61 63 63 6f 72 64 69  -counter accordi
1bd50 6e 67 6c 79 20 61 6e 64 2c 20 69 66 0a 2a 2a 20  ngly and, if.** 
1bd60 6e 65 63 65 73 73 61 72 79 2c 20 70 65 72 66 6f  necessary, perfo
1bd70 72 6d 73 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20  rms incremental 
1bd80 6d 65 72 67 65 20 77 6f 72 6b 2e 0a 2a 2a 0a 2a  merge work..**.*
1bd90 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  * If an error oc
1bda0 63 75 72 73 2c 20 73 65 74 20 74 68 65 20 46 74  curs, set the Ft
1bdb0 73 35 49 6e 64 65 78 2e 72 63 20 65 72 72 6f 72  s5Index.rc error
1bdc0 20 63 6f 64 65 2e 20 49 66 20 61 6e 20 65 72 72   code. If an err
1bdd0 6f 72 20 68 61 73 20 0a 2a 2a 20 61 6c 72 65 61  or has .** alrea
1bde0 64 79 20 6f 63 63 75 72 72 65 64 2c 20 74 68 69  dy occurred, thi
1bdf0 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20  s function is a 
1be00 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63  no-op..*/.static
1be10 20 76 6f 69 64 20 66 74 73 35 49 6e 64 65 78 41   void fts5IndexA
1be20 75 74 6f 6d 65 72 67 65 28 0a 20 20 46 74 73 35  utomerge(.  Fts5
1be30 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20  Index *p,       
1be40 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
1be50 54 53 35 20 62 61 63 6b 65 6e 64 20 6f 62 6a 65  TS5 backend obje
1be60 63 74 20 2a 2f 0a 20 20 46 74 73 35 53 74 72 75  ct */.  Fts5Stru
1be70 63 74 75 72 65 20 2a 2a 70 70 53 74 72 75 63 74  cture **ppStruct
1be80 2c 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f 55  ,       /* IN/OU
1be90 54 3a 20 43 75 72 72 65 6e 74 20 73 74 72 75 63  T: Current struc
1bea0 74 75 72 65 20 6f 66 20 69 6e 64 65 78 20 2a 2f  ture of index */
1beb0 0a 20 20 69 6e 74 20 6e 4c 65 61 66 20 20 20 20  .  int nLeaf    
1bec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bed0 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
1bee0 6f 75 74 70 75 74 20 6c 65 61 76 65 73 20 6a 75  output leaves ju
1bef0 73 74 20 77 72 69 74 74 65 6e 20 2a 2f 0a 29 7b  st written */.){
1bf00 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51  .  if( p->rc==SQ
1bf10 4c 49 54 45 5f 4f 4b 20 26 26 20 70 2d 3e 70 43  LITE_OK && p->pC
1bf20 6f 6e 66 69 67 2d 3e 6e 41 75 74 6f 6d 65 72 67  onfig->nAutomerg
1bf30 65 3e 30 20 29 7b 0a 20 20 20 20 46 74 73 35 53  e>0 ){.    Fts5S
1bf40 74 72 75 63 74 75 72 65 20 2a 70 53 74 72 75 63  tructure *pStruc
1bf50 74 20 3d 20 2a 70 70 53 74 72 75 63 74 3b 0a 20  t = *ppStruct;. 
1bf60 20 20 20 75 36 34 20 6e 57 72 69 74 65 3b 20 20     u64 nWrite;  
1bf70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bf80 20 2f 2a 20 49 6e 69 74 69 61 6c 20 76 61 6c 75   /* Initial valu
1bf90 65 20 6f 66 20 77 72 69 74 65 2d 63 6f 75 6e 74  e of write-count
1bfa0 65 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 57  er */.    int nW
1bfb0 6f 72 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20  ork;            
1bfc0 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
1bfd0 72 20 6f 66 20 77 6f 72 6b 2d 71 75 61 6e 74 61  r of work-quanta
1bfe0 20 74 6f 20 70 65 72 66 6f 72 6d 20 2a 2f 0a 20   to perform */. 
1bff0 20 20 20 69 6e 74 20 6e 52 65 6d 3b 20 20 20 20     int nRem;    
1c000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c010 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6c 65   /* Number of le
1c020 61 66 20 70 61 67 65 73 20 6c 65 66 74 20 74 6f  af pages left to
1c030 20 77 72 69 74 65 20 2a 2f 0a 0a 20 20 20 20 2f   write */..    /
1c040 2a 20 55 70 64 61 74 65 20 74 68 65 20 77 72 69  * Update the wri
1c050 74 65 2d 63 6f 75 6e 74 65 72 2e 20 57 68 69 6c  te-counter. Whil
1c060 65 20 64 6f 69 6e 67 20 73 6f 2c 20 73 65 74 20  e doing so, set 
1c070 6e 57 6f 72 6b 2e 20 2a 2f 0a 20 20 20 20 6e 57  nWork. */.    nW
1c080 72 69 74 65 20 3d 20 70 53 74 72 75 63 74 2d 3e  rite = pStruct->
1c090 6e 57 72 69 74 65 43 6f 75 6e 74 65 72 3b 0a 20  nWriteCounter;. 
1c0a0 20 20 20 6e 57 6f 72 6b 20 3d 20 28 69 6e 74 29     nWork = (int)
1c0b0 28 28 28 6e 57 72 69 74 65 20 2b 20 6e 4c 65 61  (((nWrite + nLea
1c0c0 66 29 20 2f 20 70 2d 3e 6e 57 6f 72 6b 55 6e 69  f) / p->nWorkUni
1c0d0 74 29 20 2d 20 28 6e 57 72 69 74 65 20 2f 20 70  t) - (nWrite / p
1c0e0 2d 3e 6e 57 6f 72 6b 55 6e 69 74 29 29 3b 0a 20  ->nWorkUnit));. 
1c0f0 20 20 20 70 53 74 72 75 63 74 2d 3e 6e 57 72 69     pStruct->nWri
1c100 74 65 43 6f 75 6e 74 65 72 20 2b 3d 20 6e 4c 65  teCounter += nLe
1c110 61 66 3b 0a 20 20 20 20 6e 52 65 6d 20 3d 20 28  af;.    nRem = (
1c120 69 6e 74 29 28 70 2d 3e 6e 57 6f 72 6b 55 6e 69  int)(p->nWorkUni
1c130 74 20 2a 20 6e 57 6f 72 6b 20 2a 20 70 53 74 72  t * nWork * pStr
1c140 75 63 74 2d 3e 6e 4c 65 76 65 6c 29 3b 0a 0a 20  uct->nLevel);.. 
1c150 20 20 20 66 74 73 35 49 6e 64 65 78 4d 65 72 67     fts5IndexMerg
1c160 65 28 70 2c 20 70 70 53 74 72 75 63 74 2c 20 6e  e(p, ppStruct, n
1c170 52 65 6d 29 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61  Rem);.  }.}..sta
1c180 74 69 63 20 76 6f 69 64 20 66 74 73 35 49 6e 64  tic void fts5Ind
1c190 65 78 43 72 69 73 69 73 6d 65 72 67 65 28 0a 20  exCrisismerge(. 
1c1a0 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 20   Fts5Index *p,  
1c1b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c1c0 20 2f 2a 20 46 54 53 35 20 62 61 63 6b 65 6e 64   /* FTS5 backend
1c1d0 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 46 74 73   object */.  Fts
1c1e0 35 53 74 72 75 63 74 75 72 65 20 2a 2a 70 70 53  5Structure **ppS
1c1f0 74 72 75 63 74 20 20 20 20 20 20 20 20 2f 2a 20  truct        /* 
1c200 49 4e 2f 4f 55 54 3a 20 43 75 72 72 65 6e 74 20  IN/OUT: Current 
1c210 73 74 72 75 63 74 75 72 65 20 6f 66 20 69 6e 64  structure of ind
1c220 65 78 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74  ex */.){.  const
1c230 20 69 6e 74 20 6e 43 72 69 73 69 73 20 3d 20 70   int nCrisis = p
1c240 2d 3e 70 43 6f 6e 66 69 67 2d 3e 6e 43 72 69 73  ->pConfig->nCris
1c250 69 73 4d 65 72 67 65 3b 0a 20 20 46 74 73 35 53  isMerge;.  Fts5S
1c260 74 72 75 63 74 75 72 65 20 2a 70 53 74 72 75 63  tructure *pStruc
1c270 74 20 3d 20 2a 70 70 53 74 72 75 63 74 3b 0a 20  t = *ppStruct;. 
1c280 20 69 6e 74 20 69 4c 76 6c 20 3d 20 30 3b 0a 0a   int iLvl = 0;..
1c290 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72 63 21    assert( p->rc!
1c2a0 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 53  =SQLITE_OK || pS
1c2b0 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 3e 30 20  truct->nLevel>0 
1c2c0 29 3b 0a 20 20 77 68 69 6c 65 28 20 70 2d 3e 72  );.  while( p->r
1c2d0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
1c2e0 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b  pStruct->aLevel[
1c2f0 69 4c 76 6c 5d 2e 6e 53 65 67 3e 3d 6e 43 72 69  iLvl].nSeg>=nCri
1c300 73 69 73 20 29 7b 0a 20 20 20 20 66 74 73 35 49  sis ){.    fts5I
1c310 6e 64 65 78 4d 65 72 67 65 4c 65 76 65 6c 28 70  ndexMergeLevel(p
1c320 2c 20 26 70 53 74 72 75 63 74 2c 20 69 4c 76 6c  , &pStruct, iLvl
1c330 2c 20 30 29 3b 0a 20 20 20 20 66 74 73 35 53 74  , 0);.    fts5St
1c340 72 75 63 74 75 72 65 50 72 6f 6d 6f 74 65 28 70  ructurePromote(p
1c350 2c 20 69 4c 76 6c 2b 31 2c 20 70 53 74 72 75 63  , iLvl+1, pStruc
1c360 74 29 3b 0a 20 20 20 20 69 4c 76 6c 2b 2b 3b 0a  t);.    iLvl++;.
1c370 20 20 7d 0a 20 20 2a 70 70 53 74 72 75 63 74 20    }.  *ppStruct 
1c380 3d 20 70 53 74 72 75 63 74 3b 0a 7d 0a 0a 73 74  = pStruct;.}..st
1c390 61 74 69 63 20 69 6e 74 20 66 74 73 35 49 6e 64  atic int fts5Ind
1c3a0 65 78 52 65 74 75 72 6e 28 46 74 73 35 49 6e 64  exReturn(Fts5Ind
1c3b0 65 78 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63  ex *p){.  int rc
1c3c0 20 3d 20 70 2d 3e 72 63 3b 0a 20 20 70 2d 3e 72   = p->rc;.  p->r
1c3d0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
1c3e0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 74   return rc;.}..t
1c3f0 79 70 65 64 65 66 20 73 74 72 75 63 74 20 46 74  ypedef struct Ft
1c400 73 35 46 6c 75 73 68 43 74 78 20 46 74 73 35 46  s5FlushCtx Fts5F
1c410 6c 75 73 68 43 74 78 3b 0a 73 74 72 75 63 74 20  lushCtx;.struct 
1c420 46 74 73 35 46 6c 75 73 68 43 74 78 20 7b 0a 20  Fts5FlushCtx {. 
1c430 20 46 74 73 35 49 6e 64 65 78 20 2a 70 49 64 78   Fts5Index *pIdx
1c440 3b 0a 20 20 46 74 73 35 53 65 67 57 72 69 74 65  ;.  Fts5SegWrite
1c450 72 20 77 72 69 74 65 72 3b 20 0a 7d 3b 0a 0a 2f  r writer; .};../
1c460 2a 0a 2a 2a 20 42 75 66 66 65 72 20 61 42 75 66  *.** Buffer aBuf
1c470 5b 5d 20 63 6f 6e 74 61 69 6e 73 20 61 20 6c 69  [] contains a li
1c480 73 74 20 6f 66 20 76 61 72 69 6e 74 73 2c 20 61  st of varints, a
1c490 6c 6c 20 73 6d 61 6c 6c 20 65 6e 6f 75 67 68 20  ll small enough 
1c4a0 74 6f 20 66 69 74 0a 2a 2a 20 69 6e 20 61 20 33  to fit.** in a 3
1c4b0 32 2d 62 69 74 20 69 6e 74 65 67 65 72 2e 20 52  2-bit integer. R
1c4c0 65 74 75 72 6e 20 74 68 65 20 73 69 7a 65 20 6f  eturn the size o
1c4d0 66 20 74 68 65 20 6c 61 72 67 65 73 74 20 70 72  f the largest pr
1c4e0 65 66 69 78 20 6f 66 20 74 68 69 73 20 0a 2a 2a  efix of this .**
1c4f0 20 6c 69 73 74 20 6e 4d 61 78 20 62 79 74 65 73   list nMax bytes
1c500 20 6f 72 20 6c 65 73 73 20 69 6e 20 73 69 7a 65   or less in size
1c510 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1c520 66 74 73 35 50 6f 73 6c 69 73 74 50 72 65 66 69  fts5PoslistPrefi
1c530 78 28 63 6f 6e 73 74 20 75 38 20 2a 61 42 75 66  x(const u8 *aBuf
1c540 2c 20 69 6e 74 20 6e 4d 61 78 29 7b 0a 20 20 69  , int nMax){.  i
1c550 6e 74 20 72 65 74 3b 0a 20 20 75 33 32 20 64 75  nt ret;.  u32 du
1c560 6d 6d 79 3b 0a 20 20 72 65 74 20 3d 20 66 74 73  mmy;.  ret = fts
1c570 35 47 65 74 56 61 72 69 6e 74 33 32 28 61 42 75  5GetVarint32(aBu
1c580 66 2c 20 64 75 6d 6d 79 29 3b 0a 20 20 77 68 69  f, dummy);.  whi
1c590 6c 65 28 20 31 20 29 7b 0a 20 20 20 20 69 6e 74  le( 1 ){.    int
1c5a0 20 69 20 3d 20 66 74 73 35 47 65 74 56 61 72 69   i = fts5GetVari
1c5b0 6e 74 33 32 28 26 61 42 75 66 5b 72 65 74 5d 2c  nt32(&aBuf[ret],
1c5c0 20 64 75 6d 6d 79 29 3b 0a 20 20 20 20 69 66 28   dummy);.    if(
1c5d0 20 28 72 65 74 20 2b 20 69 29 20 3e 20 6e 4d 61   (ret + i) > nMa
1c5e0 78 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 72  x ) break;.    r
1c5f0 65 74 20 2b 3d 20 69 3b 0a 20 20 7d 0a 20 20 72  et += i;.  }.  r
1c600 65 74 75 72 6e 20 72 65 74 3b 0a 7d 0a 0a 23 64  eturn ret;.}..#d
1c610 65 66 69 6e 65 20 66 74 73 35 42 75 66 66 65 72  efine fts5Buffer
1c620 53 61 66 65 41 70 70 65 6e 64 42 6c 6f 62 28 70  SafeAppendBlob(p
1c630 42 75 66 2c 20 70 42 6c 6f 62 2c 20 6e 42 6c 6f  Buf, pBlob, nBlo
1c640 62 29 20 7b 20 5c 0a 20 20 61 73 73 65 72 74 28  b) { \.  assert(
1c650 20 70 42 75 66 2d 3e 6e 53 70 61 63 65 3e 3d 28   pBuf->nSpace>=(
1c660 70 42 75 66 2d 3e 6e 2b 6e 42 6c 6f 62 29 20 29  pBuf->n+nBlob) )
1c670 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a  ;             \.
1c680 20 20 6d 65 6d 63 70 79 28 26 70 42 75 66 2d 3e    memcpy(&pBuf->
1c690 70 5b 70 42 75 66 2d 3e 6e 5d 2c 20 70 42 6c 6f  p[pBuf->n], pBlo
1c6a0 62 2c 20 6e 42 6c 6f 62 29 3b 20 20 20 20 20 20  b, nBlob);      
1c6b0 20 20 20 20 20 20 20 5c 0a 20 20 70 42 75 66 2d         \.  pBuf-
1c6c0 3e 6e 20 2b 3d 20 6e 42 6c 6f 62 3b 20 20 20 20  >n += nBlob;    
1c6d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c6e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c6f0 5c 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 6c 75 73 68  \.}../*.** Flush
1c700 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
1c710 20 69 6e 2d 6d 65 6d 6f 72 79 20 68 61 73 68 20   in-memory hash 
1c720 74 61 62 6c 65 20 69 48 61 73 68 20 74 6f 20 61  table iHash to a
1c730 20 6e 65 77 20 6c 65 76 65 6c 2d 30 20 0a 2a 2a   new level-0 .**
1c740 20 73 65 67 6d 65 6e 74 20 6f 6e 20 64 69 73 6b   segment on disk
1c750 2e 20 41 6c 73 6f 20 75 70 64 61 74 65 20 74 68  . Also update th
1c760 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  e corresponding 
1c770 73 74 72 75 63 74 75 72 65 20 72 65 63 6f 72 64  structure record
1c780 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72  ..**.** If an er
1c790 72 6f 72 20 6f 63 63 75 72 73 2c 20 73 65 74 20  ror occurs, set 
1c7a0 74 68 65 20 46 74 73 35 49 6e 64 65 78 2e 72 63  the Fts5Index.rc
1c7b0 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 49 66 20   error code. If 
1c7c0 61 6e 20 65 72 72 6f 72 20 68 61 73 20 0a 2a 2a  an error has .**
1c7d0 20 61 6c 72 65 61 64 79 20 6f 63 63 75 72 72 65   already occurre
1c7e0 64 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  d, this function
1c7f0 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a   is a no-op..*/.
1c800 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
1c810 46 6c 75 73 68 4f 6e 65 48 61 73 68 28 46 74 73  FlushOneHash(Fts
1c820 35 49 6e 64 65 78 20 2a 70 29 7b 0a 20 20 46 74  5Index *p){.  Ft
1c830 73 35 48 61 73 68 20 2a 70 48 61 73 68 20 3d 20  s5Hash *pHash = 
1c840 70 2d 3e 70 48 61 73 68 3b 0a 20 20 46 74 73 35  p->pHash;.  Fts5
1c850 53 74 72 75 63 74 75 72 65 20 2a 70 53 74 72 75  Structure *pStru
1c860 63 74 3b 0a 20 20 69 6e 74 20 69 53 65 67 69 64  ct;.  int iSegid
1c870 3b 0a 20 20 69 6e 74 20 70 67 6e 6f 4c 61 73 74  ;.  int pgnoLast
1c880 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
1c890 20 20 20 20 20 20 2f 2a 20 4c 61 73 74 20 6c 65        /* Last le
1c8a0 61 66 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69  af page number i
1c8b0 6e 20 73 65 67 6d 65 6e 74 20 2a 2f 0a 0a 20 20  n segment */..  
1c8c0 2f 2a 20 4f 62 74 61 69 6e 20 61 20 72 65 66 65  /* Obtain a refe
1c8d0 72 65 6e 63 65 20 74 6f 20 74 68 65 20 69 6e 64  rence to the ind
1c8e0 65 78 20 73 74 72 75 63 74 75 72 65 20 61 6e 64  ex structure and
1c8f0 20 61 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20   allocate a new 
1c900 73 65 67 6d 65 6e 74 2d 69 64 0a 20 20 2a 2a 20  segment-id.  ** 
1c910 66 6f 72 20 74 68 65 20 6e 65 77 20 6c 65 76 65  for the new leve
1c920 6c 2d 30 20 73 65 67 6d 65 6e 74 2e 20 20 2a 2f  l-0 segment.  */
1c930 0a 20 20 70 53 74 72 75 63 74 20 3d 20 66 74 73  .  pStruct = fts
1c940 35 53 74 72 75 63 74 75 72 65 52 65 61 64 28 70  5StructureRead(p
1c950 29 3b 0a 20 20 69 53 65 67 69 64 20 3d 20 66 74  );.  iSegid = ft
1c960 73 35 41 6c 6c 6f 63 61 74 65 53 65 67 69 64 28  s5AllocateSegid(
1c970 70 2c 20 70 53 74 72 75 63 74 29 3b 0a 0a 20 20  p, pStruct);..  
1c980 69 66 28 20 69 53 65 67 69 64 20 29 7b 0a 20 20  if( iSegid ){.  
1c990 20 20 63 6f 6e 73 74 20 69 6e 74 20 70 67 73 7a    const int pgsz
1c9a0 20 3d 20 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e 70   = p->pConfig->p
1c9b0 67 73 7a 3b 0a 0a 20 20 20 20 46 74 73 35 53 74  gsz;..    Fts5St
1c9c0 72 75 63 74 75 72 65 53 65 67 6d 65 6e 74 20 2a  ructureSegment *
1c9d0 70 53 65 67 3b 20 20 20 2f 2a 20 4e 65 77 20 73  pSeg;   /* New s
1c9e0 65 67 6d 65 6e 74 20 77 69 74 68 69 6e 20 70 53  egment within pS
1c9f0 74 72 75 63 74 20 2a 2f 0a 20 20 20 20 69 6e 74  truct */.    int
1ca00 20 6e 48 65 69 67 68 74 3b 20 20 20 20 20 20 20   nHeight;       
1ca10 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 65             /* He
1ca20 69 67 68 74 20 6f 66 20 6e 65 77 20 73 65 67 6d  ight of new segm
1ca30 65 6e 74 20 62 2d 74 72 65 65 20 2a 2f 0a 20 20  ent b-tree */.  
1ca40 20 20 46 74 73 35 42 75 66 66 65 72 20 2a 70 42    Fts5Buffer *pB
1ca50 75 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  uf;             
1ca60 2f 2a 20 42 75 66 66 65 72 20 69 6e 20 77 68 69  /* Buffer in whi
1ca70 63 68 20 74 6f 20 61 73 73 65 6d 62 6c 65 20 6c  ch to assemble l
1ca80 65 61 66 20 70 61 67 65 20 2a 2f 0a 20 20 20 20  eaf page */.    
1ca90 63 6f 6e 73 74 20 75 38 20 2a 7a 50 72 65 76 20  const u8 *zPrev 
1caa0 3d 20 30 3b 0a 0a 20 20 20 20 46 74 73 35 53 65  = 0;..    Fts5Se
1cab0 67 57 72 69 74 65 72 20 77 72 69 74 65 72 3b 0a  gWriter writer;.
1cac0 20 20 20 20 66 74 73 35 57 72 69 74 65 49 6e 69      fts5WriteIni
1cad0 74 28 70 2c 20 26 77 72 69 74 65 72 2c 20 69 53  t(p, &writer, iS
1cae0 65 67 69 64 29 3b 0a 0a 20 20 20 20 2f 2a 20 50  egid);..    /* P
1caf0 72 65 2d 61 6c 6c 6f 63 61 74 65 20 74 68 65 20  re-allocate the 
1cb00 62 75 66 66 65 72 20 75 73 65 64 20 74 6f 20 61  buffer used to a
1cb10 73 73 65 6d 62 6c 65 20 6c 65 61 66 20 70 61 67  ssemble leaf pag
1cb20 65 73 20 74 6f 20 74 68 65 20 74 61 72 67 65 74  es to the target
1cb30 0a 20 20 20 20 2a 2a 20 70 61 67 65 20 73 69 7a  .    ** page siz
1cb40 65 2e 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72  e.  */.    asser
1cb50 74 28 20 70 67 73 7a 3e 30 20 29 3b 0a 20 20 20  t( pgsz>0 );.   
1cb60 20 70 42 75 66 20 3d 20 26 77 72 69 74 65 72 2e   pBuf = &writer.
1cb70 61 57 72 69 74 65 72 5b 30 5d 2e 62 75 66 3b 0a  aWriter[0].buf;.
1cb80 20 20 20 20 66 74 73 35 42 75 66 66 65 72 47 72      fts5BufferGr
1cb90 6f 77 28 26 70 2d 3e 72 63 2c 20 70 42 75 66 2c  ow(&p->rc, pBuf,
1cba0 20 70 67 73 7a 20 2b 20 32 30 29 3b 0a 0a 20 20   pgsz + 20);..  
1cbb0 20 20 2f 2a 20 42 65 67 69 6e 20 73 63 61 6e 6e    /* Begin scann
1cbc0 69 6e 67 20 74 68 72 6f 75 67 68 20 68 61 73 68  ing through hash
1cbd0 20 74 61 62 6c 65 20 65 6e 74 72 69 65 73 2e 20   table entries. 
1cbe0 54 68 69 73 20 6c 6f 6f 70 20 72 75 6e 73 20 6f  This loop runs o
1cbf0 6e 63 65 20 66 6f 72 20 65 61 63 68 0a 20 20 20  nce for each.   
1cc00 20 2a 2a 20 74 65 72 6d 2f 64 6f 63 6c 69 73 74   ** term/doclist
1cc10 20 63 75 72 72 65 6e 74 6c 79 20 73 74 6f 72 65   currently store
1cc20 64 20 77 69 74 68 69 6e 20 74 68 65 20 68 61 73  d within the has
1cc30 68 20 74 61 62 6c 65 2e 20 2a 2f 0a 20 20 20 20  h table. */.    
1cc40 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  if( p->rc==SQLIT
1cc50 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 6d 65  E_OK ){.      me
1cc60 6d 73 65 74 28 70 42 75 66 2d 3e 70 2c 20 30 2c  mset(pBuf->p, 0,
1cc70 20 34 29 3b 0a 20 20 20 20 20 20 70 42 75 66 2d   4);.      pBuf-
1cc80 3e 6e 20 3d 20 34 3b 0a 20 20 20 20 20 20 70 2d  >n = 4;.      p-
1cc90 3e 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74 73  >rc = sqlite3Fts
1cca0 35 48 61 73 68 53 63 61 6e 49 6e 69 74 28 70 48  5HashScanInit(pH
1ccb0 61 73 68 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  ash, 0, 0);.    
1ccc0 7d 0a 20 20 20 20 77 68 69 6c 65 28 20 70 2d 3e  }.    while( p->
1ccd0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
1cce0 20 30 3d 3d 73 71 6c 69 74 65 33 46 74 73 35 48   0==sqlite3Fts5H
1ccf0 61 73 68 53 63 61 6e 45 6f 66 28 70 48 61 73 68  ashScanEof(pHash
1cd00 29 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74  ) ){.      const
1cd10 20 63 68 61 72 20 2a 7a 54 65 72 6d 3b 20 20 20   char *zTerm;   
1cd20 20 20 20 20 20 20 20 2f 2a 20 42 75 66 66 65 72         /* Buffer
1cd30 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 65 72 6d   containing term
1cd40 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e 54   */.      int nT
1cd50 65 72 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20  erm;            
1cd60 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
1cd70 20 7a 54 65 72 6d 20 69 6e 20 62 79 74 65 73 20   zTerm in bytes 
1cd80 2a 2f 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 75  */.      const u
1cd90 38 20 2a 70 44 6f 63 6c 69 73 74 3b 20 20 20 20  8 *pDoclist;    
1cda0 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
1cdb0 74 6f 20 64 6f 63 6c 69 73 74 20 66 6f 72 20 74  to doclist for t
1cdc0 68 69 73 20 74 65 72 6d 20 2a 2f 0a 20 20 20 20  his term */.    
1cdd0 20 20 69 6e 74 20 6e 44 6f 63 6c 69 73 74 3b 20    int nDoclist; 
1cde0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1cdf0 20 53 69 7a 65 20 6f 66 20 64 6f 63 6c 69 73 74   Size of doclist
1ce00 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 20   in bytes */.   
1ce10 20 20 20 69 6e 74 20 6e 53 75 66 66 69 78 3b 20     int nSuffix; 
1ce20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1ce30 2a 20 53 69 7a 65 20 6f 66 20 74 65 72 6d 20 73  * Size of term s
1ce40 75 66 66 69 78 20 2a 2f 0a 0a 20 20 20 20 20 20  uffix */..      
1ce50 73 71 6c 69 74 65 33 46 74 73 35 48 61 73 68 53  sqlite3Fts5HashS
1ce60 63 61 6e 45 6e 74 72 79 28 70 48 61 73 68 2c 20  canEntry(pHash, 
1ce70 26 7a 54 65 72 6d 2c 20 26 70 44 6f 63 6c 69 73  &zTerm, &pDoclis
1ce80 74 2c 20 26 6e 44 6f 63 6c 69 73 74 29 3b 0a 20  t, &nDoclist);. 
1ce90 20 20 20 20 20 6e 54 65 72 6d 20 3d 20 73 74 72       nTerm = str
1cea0 6c 65 6e 28 7a 54 65 72 6d 29 3b 0a 0a 20 20 20  len(zTerm);..   
1ceb0 20 20 20 2f 2a 20 44 65 63 69 64 65 20 69 66 20     /* Decide if 
1cec0 74 68 65 20 74 65 72 6d 20 77 69 6c 6c 20 66 69  the term will fi
1ced0 74 20 6f 6e 20 74 68 65 20 63 75 72 72 65 6e 74  t on the current
1cee0 20 6c 65 61 66 2e 20 49 66 20 69 74 20 77 69 6c   leaf. If it wil
1cef0 6c 20 6e 6f 74 2c 20 0a 20 20 20 20 20 20 2a 2a  l not, .      **
1cf00 20 66 6c 75 73 68 20 74 68 65 20 6c 65 61 66 20   flush the leaf 
1cf10 74 6f 20 64 69 73 6b 20 68 65 72 65 2e 20 20 2a  to disk here.  *
1cf20 2f 0a 20 20 20 20 20 20 69 66 28 20 28 70 42 75  /.      if( (pBu
1cf30 66 2d 3e 6e 20 2b 20 6e 54 65 72 6d 20 2b 20 32  f->n + nTerm + 2
1cf40 29 20 3e 20 70 67 73 7a 20 29 7b 0a 20 20 20 20  ) > pgsz ){.    
1cf50 20 20 20 20 66 74 73 35 57 72 69 74 65 46 6c 75      fts5WriteFlu
1cf60 73 68 4c 65 61 66 28 70 2c 20 26 77 72 69 74 65  shLeaf(p, &write
1cf70 72 29 3b 0a 20 20 20 20 20 20 20 20 70 42 75 66  r);.        pBuf
1cf80 20 3d 20 26 77 72 69 74 65 72 2e 61 57 72 69 74   = &writer.aWrit
1cf90 65 72 5b 30 5d 2e 62 75 66 3b 0a 20 20 20 20 20  er[0].buf;.     
1cfa0 20 20 20 69 66 28 20 28 6e 54 65 72 6d 20 2b 20     if( (nTerm + 
1cfb0 33 32 29 20 3e 20 70 42 75 66 2d 3e 6e 53 70 61  32) > pBuf->nSpa
1cfc0 63 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ce ){.          
1cfd0 66 74 73 35 42 75 66 66 65 72 47 72 6f 77 28 26  fts5BufferGrow(&
1cfe0 70 2d 3e 72 63 2c 20 70 42 75 66 2c 20 6e 54 65  p->rc, pBuf, nTe
1cff0 72 6d 20 2b 20 33 32 20 2d 20 70 42 75 66 2d 3e  rm + 32 - pBuf->
1d000 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  n);.          if
1d010 28 20 70 2d 3e 72 63 20 29 20 62 72 65 61 6b 3b  ( p->rc ) break;
1d020 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1d030 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 57 72 69   }..      /* Wri
1d040 74 65 20 74 68 65 20 74 65 72 6d 20 74 6f 20 74  te the term to t
1d050 68 65 20 6c 65 61 66 2e 20 41 6e 64 20 69 66 20  he leaf. And if 
1d060 69 74 20 69 73 20 74 68 65 20 66 69 72 73 74 20  it is the first 
1d070 6f 6e 20 74 68 65 20 6c 65 61 66 2c 20 61 6e 64  on the leaf, and
1d080 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 6c 65  .      ** the le
1d090 61 66 20 69 73 20 6e 6f 74 20 70 61 67 65 20 6e  af is not page n
1d0a0 75 6d 62 65 72 20 31 2c 20 70 75 73 68 20 69 74  umber 1, push it
1d0b0 20 75 70 20 69 6e 74 6f 20 74 68 65 20 62 2d 74   up into the b-t
1d0c0 72 65 65 20 68 69 65 72 61 72 63 68 79 20 0a 20  ree hierarchy . 
1d0d0 20 20 20 20 20 2a 2a 20 61 73 20 77 65 6c 6c 2e       ** as well.
1d0e0 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 77    */.      if( w
1d0f0 72 69 74 65 72 2e 62 46 69 72 73 74 54 65 72 6d  riter.bFirstTerm
1d100 49 6e 50 61 67 65 3d 3d 30 20 29 7b 0a 20 20 20  InPage==0 ){.   
1d110 20 20 20 20 20 69 6e 74 20 6e 50 72 65 20 3d 20       int nPre = 
1d120 66 74 73 35 50 72 65 66 69 78 43 6f 6d 70 72 65  fts5PrefixCompre
1d130 73 73 28 6e 54 65 72 6d 2c 20 7a 50 72 65 76 2c  ss(nTerm, zPrev,
1d140 20 6e 54 65 72 6d 2c 20 28 63 6f 6e 73 74 20 75   nTerm, (const u
1d150 38 2a 29 7a 54 65 72 6d 29 3b 0a 20 20 20 20 20  8*)zTerm);.     
1d160 20 20 20 70 42 75 66 2d 3e 6e 20 2b 3d 20 73 71     pBuf->n += sq
1d170 6c 69 74 65 33 46 74 73 35 50 75 74 56 61 72 69  lite3Fts5PutVari
1d180 6e 74 28 26 70 42 75 66 2d 3e 70 5b 70 42 75 66  nt(&pBuf->p[pBuf
1d190 2d 3e 6e 5d 2c 20 6e 50 72 65 29 3b 0a 20 20 20  ->n], nPre);.   
1d1a0 20 20 20 20 20 6e 53 75 66 66 69 78 20 3d 20 6e       nSuffix = n
1d1b0 54 65 72 6d 20 2d 20 6e 50 72 65 3b 0a 20 20 20  Term - nPre;.   
1d1c0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1d1d0 20 20 66 74 73 35 50 75 74 55 31 36 28 26 70 42    fts5PutU16(&pB
1d1e0 75 66 2d 3e 70 5b 32 5d 2c 20 70 42 75 66 2d 3e  uf->p[2], pBuf->
1d1f0 6e 29 3b 0a 20 20 20 20 20 20 20 20 77 72 69 74  n);.        writ
1d200 65 72 2e 62 46 69 72 73 74 54 65 72 6d 49 6e 50  er.bFirstTermInP
1d210 61 67 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  age = 0;.       
1d220 20 69 66 28 20 77 72 69 74 65 72 2e 61 57 72 69   if( writer.aWri
1d230 74 65 72 5b 30 5d 2e 70 67 6e 6f 21 3d 31 20 29  ter[0].pgno!=1 )
1d240 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20  {.          int 
1d250 6e 50 72 65 20 3d 20 66 74 73 35 50 72 65 66 69  nPre = fts5Prefi
1d260 78 43 6f 6d 70 72 65 73 73 28 6e 54 65 72 6d 2c  xCompress(nTerm,
1d270 20 7a 50 72 65 76 2c 20 6e 54 65 72 6d 2c 20 28   zPrev, nTerm, (
1d280 63 6f 6e 73 74 20 75 38 2a 29 7a 54 65 72 6d 29  const u8*)zTerm)
1d290 3b 0a 20 20 20 20 20 20 20 20 20 20 66 74 73 35  ;.          fts5
1d2a0 57 72 69 74 65 42 74 72 65 65 54 65 72 6d 28 70  WriteBtreeTerm(p
1d2b0 2c 20 26 77 72 69 74 65 72 2c 20 6e 50 72 65 2b  , &writer, nPre+
1d2c0 31 2c 20 28 63 6f 6e 73 74 20 75 38 2a 29 7a 54  1, (const u8*)zT
1d2d0 65 72 6d 29 3b 0a 20 20 20 20 20 20 20 20 20 20  erm);.          
1d2e0 70 42 75 66 20 3d 20 26 77 72 69 74 65 72 2e 61  pBuf = &writer.a
1d2f0 57 72 69 74 65 72 5b 30 5d 2e 62 75 66 3b 0a 20  Writer[0].buf;. 
1d300 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
1d310 20 6e 50 72 65 3c 6e 54 65 72 6d 20 29 3b 0a 20   nPre<nTerm );. 
1d320 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1d330 20 6e 53 75 66 66 69 78 20 3d 20 6e 54 65 72 6d   nSuffix = nTerm
1d340 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1d350 70 42 75 66 2d 3e 6e 20 2b 3d 20 73 71 6c 69 74  pBuf->n += sqlit
1d360 65 33 46 74 73 35 50 75 74 56 61 72 69 6e 74 28  e3Fts5PutVarint(
1d370 26 70 42 75 66 2d 3e 70 5b 70 42 75 66 2d 3e 6e  &pBuf->p[pBuf->n
1d380 5d 2c 20 6e 53 75 66 66 69 78 29 3b 0a 20 20 20  ], nSuffix);.   
1d390 20 20 20 66 74 73 35 42 75 66 66 65 72 53 61 66     fts5BufferSaf
1d3a0 65 41 70 70 65 6e 64 42 6c 6f 62 28 70 42 75 66  eAppendBlob(pBuf
1d3b0 2c 20 28 63 6f 6e 73 74 20 75 38 2a 29 26 7a 54  , (const u8*)&zT
1d3c0 65 72 6d 5b 6e 54 65 72 6d 2d 6e 53 75 66 66 69  erm[nTerm-nSuffi
1d3d0 78 5d 2c 20 6e 53 75 66 66 69 78 29 3b 0a 0a 20  x], nSuffix);.. 
1d3e0 20 20 20 20 20 2f 2a 20 57 65 20 6a 75 73 74 20       /* We just 
1d3f0 77 72 6f 74 65 20 61 20 74 65 72 6d 20 69 6e 74  wrote a term int
1d400 6f 20 70 61 67 65 20 77 72 69 74 65 72 2e 61 57  o page writer.aW
1d410 72 69 74 65 72 5b 30 5d 2e 70 67 6e 6f 2e 20 49  riter[0].pgno. I
1d420 66 20 61 20 0a 20 20 20 20 20 20 2a 2a 20 64 6f  f a .      ** do
1d430 63 6c 69 73 74 2d 69 6e 64 65 78 20 69 73 20 74  clist-index is t
1d440 6f 20 62 65 20 67 65 6e 65 72 61 74 65 64 20 66  o be generated f
1d450 6f 72 20 74 68 69 73 20 64 6f 63 6c 69 73 74 2c  or this doclist,
1d460 20 69 74 20 77 69 6c 6c 20 62 65 0a 20 20 20 20   it will be.    
1d470 20 20 2a 2a 20 61 73 73 6f 63 69 61 74 65 64 20    ** associated 
1d480 77 69 74 68 20 74 68 69 73 20 70 61 67 65 2e 20  with this page. 
1d490 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  */.      assert(
1d4a0 20 77 72 69 74 65 72 2e 6e 44 6c 69 64 78 3e 30   writer.nDlidx>0
1d4b0 20 26 26 20 77 72 69 74 65 72 2e 61 44 6c 69 64   && writer.aDlid
1d4c0 78 5b 30 5d 2e 62 75 66 2e 6e 3d 3d 30 20 29 3b  x[0].buf.n==0 );
1d4d0 0a 20 20 20 20 20 20 77 72 69 74 65 72 2e 61 44  .      writer.aD
1d4e0 6c 69 64 78 5b 30 5d 2e 70 67 6e 6f 20 3d 20 77  lidx[0].pgno = w
1d4f0 72 69 74 65 72 2e 61 57 72 69 74 65 72 5b 30 5d  riter.aWriter[0]
1d500 2e 70 67 6e 6f 3b 0a 0a 20 20 20 20 20 20 69 66  .pgno;..      if
1d510 28 20 70 67 73 7a 3e 3d 28 70 42 75 66 2d 3e 6e  ( pgsz>=(pBuf->n
1d520 20 2b 20 6e 44 6f 63 6c 69 73 74 20 2b 20 31 29   + nDoclist + 1)
1d530 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54   ){.        /* T
1d540 68 65 20 65 6e 74 69 72 65 20 64 6f 63 6c 69 73  he entire doclis
1d550 74 20 77 69 6c 6c 20 66 69 74 20 6f 6e 20 74 68  t will fit on th
1d560 65 20 63 75 72 72 65 6e 74 20 6c 65 61 66 2e 20  e current leaf. 
1d570 2a 2f 0a 20 20 20 20 20 20 20 20 66 74 73 35 42  */.        fts5B
1d580 75 66 66 65 72 53 61 66 65 41 70 70 65 6e 64 42  ufferSafeAppendB
1d590 6c 6f 62 28 70 42 75 66 2c 20 70 44 6f 63 6c 69  lob(pBuf, pDocli
1d5a0 73 74 2c 20 6e 44 6f 63 6c 69 73 74 29 3b 0a 20  st, nDoclist);. 
1d5b0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
1d5c0 20 20 20 20 69 36 34 20 69 52 6f 77 69 64 20 3d      i64 iRowid =
1d5d0 20 30 3b 0a 20 20 20 20 20 20 20 20 69 36 34 20   0;.        i64 
1d5e0 69 44 65 6c 74 61 20 3d 20 30 3b 0a 20 20 20 20  iDelta = 0;.    
1d5f0 20 20 20 20 69 6e 74 20 69 4f 66 66 20 3d 20 30      int iOff = 0
1d600 3b 0a 0a 20 20 20 20 20 20 20 20 77 72 69 74 65  ;..        write
1d610 72 2e 62 46 69 72 73 74 52 6f 77 69 64 49 6e 50  r.bFirstRowidInP
1d620 61 67 65 20 3d 20 30 3b 0a 0a 20 20 20 20 20 20  age = 0;..      
1d630 20 20 2f 2a 20 54 68 65 20 65 6e 74 69 72 65 20    /* The entire 
1d640 64 6f 63 6c 69 73 74 20 77 69 6c 6c 20 6e 6f 74  doclist will not
1d650 20 66 69 74 20 6f 6e 20 74 68 69 73 20 6c 65 61   fit on this lea
1d660 66 2e 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  f. The following
1d670 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 6c 6f 6f   .        ** loo
1d680 70 20 69 74 65 72 61 74 65 73 20 74 68 72 6f 75  p iterates throu
1d690 67 68 20 74 68 65 20 70 6f 73 6c 69 73 74 73 20  gh the poslists 
1d6a0 74 68 61 74 20 6d 61 6b 65 20 75 70 20 74 68 65  that make up the
1d6b0 20 63 75 72 72 65 6e 74 20 0a 20 20 20 20 20 20   current .      
1d6c0 20 20 2a 2a 20 64 6f 63 6c 69 73 74 2e 20 20 2a    ** doclist.  *
1d6d0 2f 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65 28  /.        while(
1d6e0 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
1d6f0 4b 20 26 26 20 69 4f 66 66 3c 6e 44 6f 63 6c 69  K && iOff<nDocli
1d700 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  st ){.          
1d710 69 6e 74 20 6e 50 6f 73 3b 0a 20 20 20 20 20 20  int nPos;.      
1d720 20 20 20 20 69 6e 74 20 6e 43 6f 70 79 3b 0a 20      int nCopy;. 
1d730 20 20 20 20 20 20 20 20 20 69 6e 74 20 62 44 75           int bDu
1d740 6d 6d 79 3b 0a 20 20 20 20 20 20 20 20 20 20 69  mmy;.          i
1d750 4f 66 66 20 2b 3d 20 66 74 73 35 47 65 74 56 61  Off += fts5GetVa
1d760 72 69 6e 74 28 26 70 44 6f 63 6c 69 73 74 5b 69  rint(&pDoclist[i
1d770 4f 66 66 5d 2c 20 28 75 36 34 2a 29 26 69 44 65  Off], (u64*)&iDe
1d780 6c 74 61 29 3b 0a 20 20 20 20 20 20 20 20 20 20  lta);.          
1d790 6e 43 6f 70 79 20 3d 20 66 74 73 35 47 65 74 50  nCopy = fts5GetP
1d7a0 6f 73 6c 69 73 74 53 69 7a 65 28 26 70 44 6f 63  oslistSize(&pDoc
1d7b0 6c 69 73 74 5b 69 4f 66 66 5d 2c 20 26 6e 50 6f  list[iOff], &nPo
1d7c0 73 2c 20 26 62 44 75 6d 6d 79 29 3b 0a 20 20 20  s, &bDummy);.   
1d7d0 20 20 20 20 20 20 20 6e 43 6f 70 79 20 2b 3d 20         nCopy += 
1d7e0 6e 50 6f 73 3b 0a 20 20 20 20 20 20 20 20 20 20  nPos;.          
1d7f0 69 52 6f 77 69 64 20 2b 3d 20 69 44 65 6c 74 61  iRowid += iDelta
1d800 3b 0a 20 20 20 20 20 20 20 20 20 20 0a 20 20 20  ;.          .   
1d810 20 20 20 20 20 20 20 69 66 28 20 77 72 69 74 65         if( write
1d820 72 2e 62 46 69 72 73 74 52 6f 77 69 64 49 6e 50  r.bFirstRowidInP
1d830 61 67 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20  age ){.         
1d840 20 20 20 66 74 73 35 50 75 74 55 31 36 28 26 70     fts5PutU16(&p
1d850 42 75 66 2d 3e 70 5b 30 5d 2c 20 70 42 75 66 2d  Buf->p[0], pBuf-
1d860 3e 6e 29 3b 20 20 20 2f 2a 20 66 69 72 73 74 20  >n);   /* first 
1d870 64 6f 63 69 64 20 6f 6e 20 70 61 67 65 20 2a 2f  docid on page */
1d880 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 42 75  .            pBu
1d890 66 2d 3e 6e 20 2b 3d 20 73 71 6c 69 74 65 33 46  f->n += sqlite3F
1d8a0 74 73 35 50 75 74 56 61 72 69 6e 74 28 26 70 42  ts5PutVarint(&pB
1d8b0 75 66 2d 3e 70 5b 70 42 75 66 2d 3e 6e 5d 2c 20  uf->p[pBuf->n], 
1d8c0 69 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 20  iRowid);.       
1d8d0 20 20 20 20 20 77 72 69 74 65 72 2e 62 46 69 72       writer.bFir
1d8e0 73 74 52 6f 77 69 64 49 6e 50 61 67 65 20 3d 20  stRowidInPage = 
1d8f0 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 66  0;.            f
1d900 74 73 35 57 72 69 74 65 44 6c 69 64 78 41 70 70  ts5WriteDlidxApp
1d910 65 6e 64 28 70 2c 20 26 77 72 69 74 65 72 2c 20  end(p, &writer, 
1d920 69 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 20  iRowid);.       
1d930 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1d940 20 20 20 20 20 20 70 42 75 66 2d 3e 6e 20 2b 3d        pBuf->n +=
1d950 20 73 71 6c 69 74 65 33 46 74 73 35 50 75 74 56   sqlite3Fts5PutV
1d960 61 72 69 6e 74 28 26 70 42 75 66 2d 3e 70 5b 70  arint(&pBuf->p[p
1d970 42 75 66 2d 3e 6e 5d 2c 20 69 44 65 6c 74 61 29  Buf->n], iDelta)
1d980 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
1d990 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
1d9a0 70 42 75 66 2d 3e 6e 3c 3d 70 42 75 66 2d 3e 6e  pBuf->n<=pBuf->n
1d9b0 53 70 61 63 65 20 29 3b 0a 0a 20 20 20 20 20 20  Space );..      
1d9c0 20 20 20 20 69 66 28 20 28 70 42 75 66 2d 3e 6e      if( (pBuf->n
1d9d0 20 2b 20 6e 43 6f 70 79 29 20 3c 3d 20 70 67 73   + nCopy) <= pgs
1d9e0 7a 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  z ){.           
1d9f0 20 2f 2a 20 54 68 65 20 65 6e 74 69 72 65 20 70   /* The entire p
1da00 6f 73 6c 69 73 74 20 77 69 6c 6c 20 66 69 74 20  oslist will fit 
1da10 6f 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c  on the current l
1da20 65 61 66 2e 20 53 6f 20 63 6f 70 79 0a 20 20 20  eaf. So copy.   
1da30 20 20 20 20 20 20 20 20 20 2a 2a 20 69 74 20 69           ** it i
1da40 6e 20 6f 6e 65 20 67 6f 2e 20 2a 2f 0a 20 20 20  n one go. */.   
1da50 20 20 20 20 20 20 20 20 20 66 74 73 35 42 75 66           fts5Buf
1da60 66 65 72 53 61 66 65 41 70 70 65 6e 64 42 6c 6f  ferSafeAppendBlo
1da70 62 28 70 42 75 66 2c 20 26 70 44 6f 63 6c 69 73  b(pBuf, &pDoclis
1da80 74 5b 69 4f 66 66 5d 2c 20 6e 43 6f 70 79 29 3b  t[iOff], nCopy);
1da90 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65  .          }else
1daa0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  {.            /*
1dab0 20 54 68 65 20 65 6e 74 69 72 65 20 70 6f 73 6c   The entire posl
1dac0 69 73 74 20 77 69 6c 6c 20 6e 6f 74 20 66 69 74  ist will not fit
1dad0 20 6f 6e 20 74 68 69 73 20 6c 65 61 66 2e 20 53   on this leaf. S
1dae0 6f 20 69 74 20 6e 65 65 64 73 0a 20 20 20 20 20  o it needs.     
1daf0 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 62 65 20         ** to be 
1db00 62 72 6f 6b 65 6e 20 69 6e 74 6f 20 73 65 63 74  broken into sect
1db10 69 6f 6e 73 2e 20 54 68 65 20 6f 6e 6c 79 20 71  ions. The only q
1db20 75 61 6c 69 66 69 63 61 74 69 6f 6e 20 62 65 69  ualification bei
1db30 6e 67 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  ng.            *
1db40 2a 20 74 68 61 74 20 65 61 63 68 20 76 61 72 69  * that each vari
1db50 6e 74 20 6d 75 73 74 20 62 65 20 73 74 6f 72 65  nt must be store
1db60 64 20 63 6f 6e 74 69 67 75 6f 75 73 6c 79 2e 20  d contiguously. 
1db70 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
1db80 63 6f 6e 73 74 20 75 38 20 2a 70 50 6f 73 6c 69  const u8 *pPosli
1db90 73 74 20 3d 20 26 70 44 6f 63 6c 69 73 74 5b 69  st = &pDoclist[i
1dba0 4f 66 66 5d 3b 0a 20 20 20 20 20 20 20 20 20 20  Off];.          
1dbb0 20 20 69 6e 74 20 69 50 6f 73 20 3d 20 30 3b 0a    int iPos = 0;.
1dbc0 20 20 20 20 20 20 20 20 20 20 20 20 77 68 69 6c              whil
1dbd0 65 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  e( p->rc==SQLITE
1dbe0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
1dbf0 20 20 20 20 20 69 6e 74 20 6e 53 70 61 63 65 20       int nSpace 
1dc00 3d 20 70 67 73 7a 20 2d 20 70 42 75 66 2d 3e 6e  = pgsz - pBuf->n
1dc10 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
1dc20 69 6e 74 20 6e 20 3d 20 30 3b 0a 20 20 20 20 20  int n = 0;.     
1dc30 20 20 20 20 20 20 20 20 20 69 66 28 20 28 6e 43           if( (nC
1dc40 6f 70 79 20 2d 20 69 50 6f 73 29 3c 3d 6e 53 70  opy - iPos)<=nSp
1dc50 61 63 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ace ){.         
1dc60 20 20 20 20 20 20 20 6e 20 3d 20 6e 43 6f 70 79         n = nCopy
1dc70 20 2d 20 69 50 6f 73 3b 0a 20 20 20 20 20 20 20   - iPos;.       
1dc80 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
1dc90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6e 20                n 
1dca0 3d 20 66 74 73 35 50 6f 73 6c 69 73 74 50 72 65  = fts5PoslistPre
1dcb0 66 69 78 28 26 70 50 6f 73 6c 69 73 74 5b 69 50  fix(&pPoslist[iP
1dcc0 6f 73 5d 2c 20 6e 53 70 61 63 65 29 3b 0a 20 20  os], nSpace);.  
1dcd0 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
1dce0 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73 65              asse
1dcf0 72 74 28 20 6e 3e 30 20 29 3b 0a 20 20 20 20 20  rt( n>0 );.     
1dd00 20 20 20 20 20 20 20 20 20 66 74 73 35 42 75 66           fts5Buf
1dd10 66 65 72 53 61 66 65 41 70 70 65 6e 64 42 6c 6f  ferSafeAppendBlo
1dd20 62 28 70 42 75 66 2c 20 26 70 50 6f 73 6c 69 73  b(pBuf, &pPoslis
1dd30 74 5b 69 50 6f 73 5d 2c 20 6e 29 3b 0a 20 20 20  t[iPos], n);.   
1dd40 20 20 20 20 20 20 20 20 20 20 20 69 50 6f 73 20             iPos 
1dd50 2b 3d 20 6e 3b 0a 20 20 20 20 20 20 20 20 20 20  += n;.          
1dd60 20 20 20 20 69 66 28 20 70 42 75 66 2d 3e 6e 3e      if( pBuf->n>
1dd70 3d 70 67 73 7a 20 29 7b 0a 20 20 20 20 20 20 20  =pgsz ){.       
1dd80 20 20 20 20 20 20 20 20 20 66 74 73 35 57 72 69           fts5Wri
1dd90 74 65 46 6c 75 73 68 4c 65 61 66 28 70 2c 20 26  teFlushLeaf(p, &
1dda0 77 72 69 74 65 72 29 3b 0a 20 20 20 20 20 20 20  writer);.       
1ddb0 20 20 20 20 20 20 20 20 20 70 42 75 66 20 3d 20           pBuf = 
1ddc0 26 77 72 69 74 65 72 2e 61 57 72 69 74 65 72 5b  &writer.aWriter[
1ddd0 30 5d 2e 62 75 66 3b 0a 20 20 20 20 20 20 20 20  0].buf;.        
1dde0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1ddf0 20 20 20 20 20 20 69 66 28 20 69 50 6f 73 3e 3d        if( iPos>=
1de00 6e 43 6f 70 79 20 29 20 62 72 65 61 6b 3b 0a 20  nCopy ) break;. 
1de10 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
1de20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1de30 20 20 20 69 4f 66 66 20 2b 3d 20 6e 43 6f 70 79     iOff += nCopy
1de40 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
1de50 20 20 7d 0a 0a 20 20 20 20 20 20 70 42 75 66 2d    }..      pBuf-
1de60 3e 70 5b 70 42 75 66 2d 3e 6e 2b 2b 5d 20 3d 20  >p[pBuf->n++] = 
1de70 27 5c 30 27 3b 0a 20 20 20 20 20 20 61 73 73 65  '\0';.      asse
1de80 72 74 28 20 70 42 75 66 2d 3e 6e 3c 3d 70 42 75  rt( pBuf->n<=pBu
1de90 66 2d 3e 6e 53 70 61 63 65 20 29 3b 0a 20 20 20  f->nSpace );.   
1dea0 20 20 20 7a 50 72 65 76 20 3d 20 28 63 6f 6e 73     zPrev = (cons
1deb0 74 20 75 38 2a 29 7a 54 65 72 6d 3b 0a 20 20 20  t u8*)zTerm;.   
1dec0 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 48 61     sqlite3Fts5Ha
1ded0 73 68 53 63 61 6e 4e 65 78 74 28 70 48 61 73 68  shScanNext(pHash
1dee0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
1def0 69 74 65 33 46 74 73 35 48 61 73 68 43 6c 65 61  ite3Fts5HashClea
1df00 72 28 70 48 61 73 68 29 3b 0a 20 20 20 20 66 74  r(pHash);.    ft
1df10 73 35 57 72 69 74 65 46 69 6e 69 73 68 28 70 2c  s5WriteFinish(p,
1df20 20 26 77 72 69 74 65 72 2c 20 26 6e 48 65 69 67   &writer, &nHeig
1df30 68 74 2c 20 26 70 67 6e 6f 4c 61 73 74 29 3b 0a  ht, &pgnoLast);.
1df40 0a 20 20 20 20 2f 2a 20 55 70 64 61 74 65 20 74  .    /* Update t
1df50 68 65 20 46 74 73 35 53 74 72 75 63 74 75 72 65  he Fts5Structure
1df60 2e 20 49 74 20 69 73 20 77 72 69 74 74 65 6e 20  . It is written 
1df70 62 61 63 6b 20 74 6f 20 74 68 65 20 64 61 74 61  back to the data
1df80 62 61 73 65 20 62 79 20 74 68 65 0a 20 20 20 20  base by the.    
1df90 2a 2a 20 66 74 73 35 53 74 72 75 63 74 75 72 65  ** fts5Structure
1dfa0 52 65 6c 65 61 73 65 28 29 20 63 61 6c 6c 20 62  Release() call b
1dfb0 65 6c 6f 77 2e 20 20 2a 2f 0a 20 20 20 20 69 66  elow.  */.    if
1dfc0 28 20 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65  ( pStruct->nLeve
1dfd0 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 66 74  l==0 ){.      ft
1dfe0 73 35 53 74 72 75 63 74 75 72 65 41 64 64 4c 65  s5StructureAddLe
1dff0 76 65 6c 28 26 70 2d 3e 72 63 2c 20 26 70 53 74  vel(&p->rc, &pSt
1e000 72 75 63 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ruct);.    }.   
1e010 20 66 74 73 35 53 74 72 75 63 74 75 72 65 45 78   fts5StructureEx
1e020 74 65 6e 64 4c 65 76 65 6c 28 26 70 2d 3e 72 63  tendLevel(&p->rc
1e030 2c 20 70 53 74 72 75 63 74 2c 20 30 2c 20 31 2c  , pStruct, 0, 1,
1e040 20 30 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e   0);.    if( p->
1e050 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
1e060 0a 20 20 20 20 20 20 70 53 65 67 20 3d 20 26 70  .      pSeg = &p
1e070 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 30  Struct->aLevel[0
1e080 5d 2e 61 53 65 67 5b 20 70 53 74 72 75 63 74 2d  ].aSeg[ pStruct-
1e090 3e 61 4c 65 76 65 6c 5b 30 5d 2e 6e 53 65 67 2b  >aLevel[0].nSeg+
1e0a0 2b 20 5d 3b 0a 20 20 20 20 20 20 70 53 65 67 2d  + ];.      pSeg-
1e0b0 3e 69 53 65 67 69 64 20 3d 20 69 53 65 67 69 64  >iSegid = iSegid
1e0c0 3b 0a 20 20 20 20 20 20 70 53 65 67 2d 3e 6e 48  ;.      pSeg->nH
1e0d0 65 69 67 68 74 20 3d 20 6e 48 65 69 67 68 74 3b  eight = nHeight;
1e0e0 0a 20 20 20 20 20 20 70 53 65 67 2d 3e 70 67 6e  .      pSeg->pgn
1e0f0 6f 46 69 72 73 74 20 3d 20 31 3b 0a 20 20 20 20  oFirst = 1;.    
1e100 20 20 70 53 65 67 2d 3e 70 67 6e 6f 4c 61 73 74    pSeg->pgnoLast
1e110 20 3d 20 70 67 6e 6f 4c 61 73 74 3b 0a 20 20 20   = pgnoLast;.   
1e120 20 20 20 70 53 74 72 75 63 74 2d 3e 6e 53 65 67     pStruct->nSeg
1e130 6d 65 6e 74 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20  ment++;.    }.  
1e140 20 20 66 74 73 35 53 74 72 75 63 74 75 72 65 50    fts5StructureP
1e150 72 6f 6d 6f 74 65 28 70 2c 20 30 2c 20 70 53 74  romote(p, 0, pSt
1e160 72 75 63 74 29 3b 0a 20 20 7d 0a 0a 0a 20 20 66  ruct);.  }...  f
1e170 74 73 35 49 6e 64 65 78 41 75 74 6f 6d 65 72 67  ts5IndexAutomerg
1e180 65 28 70 2c 20 26 70 53 74 72 75 63 74 2c 20 70  e(p, &pStruct, p
1e190 67 6e 6f 4c 61 73 74 29 3b 0a 20 20 66 74 73 35  gnoLast);.  fts5
1e1a0 49 6e 64 65 78 43 72 69 73 69 73 6d 65 72 67 65  IndexCrisismerge
1e1b0 28 70 2c 20 26 70 53 74 72 75 63 74 29 3b 0a 20  (p, &pStruct);. 
1e1c0 20 66 74 73 35 53 74 72 75 63 74 75 72 65 57 72   fts5StructureWr
1e1d0 69 74 65 28 70 2c 20 70 53 74 72 75 63 74 29 3b  ite(p, pStruct);
1e1e0 0a 20 20 66 74 73 35 53 74 72 75 63 74 75 72 65  .  fts5Structure
1e1f0 52 65 6c 65 61 73 65 28 70 53 74 72 75 63 74 29  Release(pStruct)
1e200 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 6c 75 73 68  ;.}../*.** Flush
1e210 20 61 6e 79 20 64 61 74 61 20 73 74 6f 72 65 64   any data stored
1e220 20 69 6e 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72   in the in-memor
1e230 79 20 68 61 73 68 20 74 61 62 6c 65 73 20 74 6f  y hash tables to
1e240 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a   the database..*
1e250 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  /.static void ft
1e260 73 35 49 6e 64 65 78 46 6c 75 73 68 28 46 74 73  s5IndexFlush(Fts
1e270 35 49 6e 64 65 78 20 2a 70 29 7b 0a 20 20 2f 2a  5Index *p){.  /*
1e280 20 55 6e 6c 65 73 73 20 69 74 20 69 73 20 65 6d   Unless it is em
1e290 70 74 79 2c 20 66 6c 75 73 68 20 74 68 65 20 68  pty, flush the h
1e2a0 61 73 68 20 74 61 62 6c 65 20 74 6f 20 64 69 73  ash table to dis
1e2b0 6b 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 6e 50  k */.  if( p->nP
1e2c0 65 6e 64 69 6e 67 44 61 74 61 20 29 7b 0a 20 20  endingData ){.  
1e2d0 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 48 61    assert( p->pHa
1e2e0 73 68 20 29 3b 0a 20 20 20 20 70 2d 3e 6e 50 65  sh );.    p->nPe
1e2f0 6e 64 69 6e 67 44 61 74 61 20 3d 20 30 3b 0a 20  ndingData = 0;. 
1e300 20 20 20 66 74 73 35 46 6c 75 73 68 4f 6e 65 48     fts5FlushOneH
1e310 61 73 68 28 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a  ash(p);.  }.}...
1e320 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 49  int sqlite3Fts5I
1e330 6e 64 65 78 4f 70 74 69 6d 69 7a 65 28 46 74 73  ndexOptimize(Fts
1e340 35 49 6e 64 65 78 20 2a 70 29 7b 0a 20 20 46 74  5Index *p){.  Ft
1e350 73 35 53 74 72 75 63 74 75 72 65 20 2a 70 53 74  s5Structure *pSt
1e360 72 75 63 74 3b 0a 20 20 46 74 73 35 53 74 72 75  ruct;.  Fts5Stru
1e370 63 74 75 72 65 20 2a 70 4e 65 77 20 3d 20 30 3b  cture *pNew = 0;
1e380 0a 20 20 69 6e 74 20 6e 53 65 67 20 3d 20 30 3b  .  int nSeg = 0;
1e390 0a 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72  ..  assert( p->r
1e3a0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  c==SQLITE_OK );.
1e3b0 20 20 66 74 73 35 49 6e 64 65 78 46 6c 75 73 68    fts5IndexFlush
1e3c0 28 70 29 3b 0a 20 20 70 53 74 72 75 63 74 20 3d  (p);.  pStruct =
1e3d0 20 66 74 73 35 53 74 72 75 63 74 75 72 65 52 65   fts5StructureRe
1e3e0 61 64 28 70 29 3b 0a 0a 20 20 69 66 28 20 70 53  ad(p);..  if( pS
1e3f0 74 72 75 63 74 20 29 7b 0a 20 20 20 20 61 73 73  truct ){.    ass
1e400 65 72 74 28 20 70 53 74 72 75 63 74 2d 3e 6e 53  ert( pStruct->nS
1e410 65 67 6d 65 6e 74 3d 3d 66 74 73 35 53 74 72 75  egment==fts5Stru
1e420 63 74 75 72 65 43 6f 75 6e 74 53 65 67 6d 65 6e  ctureCountSegmen
1e430 74 73 28 70 53 74 72 75 63 74 29 20 29 3b 0a 20  ts(pStruct) );. 
1e440 20 20 20 6e 53 65 67 20 3d 20 70 53 74 72 75 63     nSeg = pStruc
1e450 74 2d 3e 6e 53 65 67 6d 65 6e 74 3b 0a 20 20 20  t->nSegment;.   
1e460 20 69 66 28 20 6e 53 65 67 3e 31 20 29 7b 0a 20   if( nSeg>1 ){. 
1e470 20 20 20 20 20 69 6e 74 20 6e 42 79 74 65 20 3d       int nByte =
1e480 20 73 69 7a 65 6f 66 28 46 74 73 35 53 74 72 75   sizeof(Fts5Stru
1e490 63 74 75 72 65 29 3b 0a 20 20 20 20 20 20 6e 42  cture);.      nB
1e4a0 79 74 65 20 2b 3d 20 28 70 53 74 72 75 63 74 2d  yte += (pStruct-
1e4b0 3e 6e 4c 65 76 65 6c 2b 31 29 20 2a 20 73 69 7a  >nLevel+1) * siz
1e4c0 65 6f 66 28 46 74 73 35 53 74 72 75 63 74 75 72  eof(Fts5Structur
1e4d0 65 4c 65 76 65 6c 29 3b 0a 20 20 20 20 20 20 70  eLevel);.      p
1e4e0 4e 65 77 20 3d 20 28 46 74 73 35 53 74 72 75 63  New = (Fts5Struc
1e4f0 74 75 72 65 2a 29 73 71 6c 69 74 65 33 46 74 73  ture*)sqlite3Fts
1e500 35 4d 61 6c 6c 6f 63 5a 65 72 6f 28 26 70 2d 3e  5MallocZero(&p->
1e510 72 63 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20 20  rc, nByte);.    
1e520 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 4e 65 77  }.  }.  if( pNew
1e530 20 29 7b 0a 20 20 20 20 46 74 73 35 53 74 72 75   ){.    Fts5Stru
1e540 63 74 75 72 65 4c 65 76 65 6c 20 2a 70 4c 76 6c  ctureLevel *pLvl
1e550 3b 0a 20 20 20 20 69 6e 74 20 6e 42 79 74 65 20  ;.    int nByte 
1e560 3d 20 6e 53 65 67 20 2a 20 73 69 7a 65 6f 66 28  = nSeg * sizeof(
1e570 46 74 73 35 53 74 72 75 63 74 75 72 65 53 65 67  Fts5StructureSeg
1e580 6d 65 6e 74 29 3b 0a 20 20 20 20 70 4e 65 77 2d  ment);.    pNew-
1e590 3e 6e 4c 65 76 65 6c 20 3d 20 70 53 74 72 75 63  >nLevel = pStruc
1e5a0 74 2d 3e 6e 4c 65 76 65 6c 2b 31 3b 0a 20 20 20  t->nLevel+1;.   
1e5b0 20 70 4e 65 77 2d 3e 6e 57 72 69 74 65 43 6f 75   pNew->nWriteCou
1e5c0 6e 74 65 72 20 3d 20 70 53 74 72 75 63 74 2d 3e  nter = pStruct->
1e5d0 6e 57 72 69 74 65 43 6f 75 6e 74 65 72 3b 0a 20  nWriteCounter;. 
1e5e0 20 20 20 70 4c 76 6c 20 3d 20 26 70 4e 65 77 2d     pLvl = &pNew-
1e5f0 3e 61 4c 65 76 65 6c 5b 70 53 74 72 75 63 74 2d  >aLevel[pStruct-
1e600 3e 6e 4c 65 76 65 6c 5d 3b 0a 20 20 20 20 70 4c  >nLevel];.    pL
1e610 76 6c 2d 3e 61 53 65 67 20 3d 20 28 46 74 73 35  vl->aSeg = (Fts5
1e620 53 74 72 75 63 74 75 72 65 53 65 67 6d 65 6e 74  StructureSegment
1e630 2a 29 73 71 6c 69 74 65 33 46 74 73 35 4d 61 6c  *)sqlite3Fts5Mal
1e640 6c 6f 63 5a 65 72 6f 28 26 70 2d 3e 72 63 2c 20  locZero(&p->rc, 
1e650 6e 42 79 74 65 29 3b 0a 20 20 20 20 69 66 28 20  nByte);.    if( 
1e660 70 4c 76 6c 2d 3e 61 53 65 67 20 29 7b 0a 20 20  pLvl->aSeg ){.  
1e670 20 20 20 20 69 6e 74 20 69 4c 76 6c 2c 20 69 53      int iLvl, iS
1e680 65 67 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 53  eg;.      int iS
1e690 65 67 4f 75 74 20 3d 20 30 3b 0a 20 20 20 20 20  egOut = 0;.     
1e6a0 20 66 6f 72 28 69 4c 76 6c 3d 30 3b 20 69 4c 76   for(iLvl=0; iLv
1e6b0 6c 3c 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65  l<pStruct->nLeve
1e6c0 6c 3b 20 69 4c 76 6c 2b 2b 29 7b 0a 20 20 20 20  l; iLvl++){.    
1e6d0 20 20 20 20 66 6f 72 28 69 53 65 67 3d 30 3b 20      for(iSeg=0; 
1e6e0 69 53 65 67 3c 70 53 74 72 75 63 74 2d 3e 61 4c  iSeg<pStruct->aL
1e6f0 65 76 65 6c 5b 69 4c 76 6c 5d 2e 6e 53 65 67 3b  evel[iLvl].nSeg;
1e700 20 69 53 65 67 2b 2b 29 7b 0a 20 20 20 20 20 20   iSeg++){.      
1e710 20 20 20 20 70 4c 76 6c 2d 3e 61 53 65 67 5b 69      pLvl->aSeg[i
1e720 53 65 67 4f 75 74 5d 20 3d 20 70 53 74 72 75 63  SegOut] = pStruc
1e730 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d 2e  t->aLevel[iLvl].
1e740 61 53 65 67 5b 69 53 65 67 5d 3b 0a 20 20 20 20  aSeg[iSeg];.    
1e750 20 20 20 20 20 20 69 53 65 67 4f 75 74 2b 2b 3b        iSegOut++;
1e760 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1e770 20 7d 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e   }.      pNew->n
1e780 53 65 67 6d 65 6e 74 20 3d 20 70 4c 76 6c 2d 3e  Segment = pLvl->
1e790 6e 53 65 67 20 3d 20 6e 53 65 67 3b 0a 20 20 20  nSeg = nSeg;.   
1e7a0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71   }else{.      sq
1e7b0 6c 69 74 65 33 5f 66 72 65 65 28 70 4e 65 77 29  lite3_free(pNew)
1e7c0 3b 0a 20 20 20 20 20 20 70 4e 65 77 20 3d 20 30  ;.      pNew = 0
1e7d0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69  ;.    }.  }..  i
1e7e0 66 28 20 70 4e 65 77 20 29 7b 0a 20 20 20 20 69  f( pNew ){.    i
1e7f0 6e 74 20 69 4c 76 6c 20 3d 20 70 4e 65 77 2d 3e  nt iLvl = pNew->
1e800 6e 4c 65 76 65 6c 2d 31 3b 0a 20 20 20 20 77 68  nLevel-1;.    wh
1e810 69 6c 65 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49  ile( p->rc==SQLI
1e820 54 45 5f 4f 4b 20 26 26 20 70 4e 65 77 2d 3e 61  TE_OK && pNew->a
1e830 4c 65 76 65 6c 5b 69 4c 76 6c 5d 2e 6e 53 65 67  Level[iLvl].nSeg
1e840 3e 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  >0 ){.      int 
1e850 6e 52 65 6d 20 3d 20 46 54 53 35 5f 4f 50 54 5f  nRem = FTS5_OPT_
1e860 57 4f 52 4b 5f 55 4e 49 54 3b 0a 20 20 20 20 20  WORK_UNIT;.     
1e870 20 66 74 73 35 49 6e 64 65 78 4d 65 72 67 65 4c   fts5IndexMergeL
1e880 65 76 65 6c 28 70 2c 20 26 70 4e 65 77 2c 20 69  evel(p, &pNew, i
1e890 4c 76 6c 2c 20 26 6e 52 65 6d 29 3b 0a 20 20 20  Lvl, &nRem);.   
1e8a0 20 7d 0a 0a 20 20 20 20 66 74 73 35 53 74 72 75   }..    fts5Stru
1e8b0 63 74 75 72 65 57 72 69 74 65 28 70 2c 20 70 4e  ctureWrite(p, pN
1e8c0 65 77 29 3b 0a 20 20 20 20 66 74 73 35 53 74 72  ew);.    fts5Str
1e8d0 75 63 74 75 72 65 52 65 6c 65 61 73 65 28 70 4e  uctureRelease(pN
1e8e0 65 77 29 3b 0a 20 20 7d 0a 0a 20 20 66 74 73 35  ew);.  }..  fts5
1e8f0 53 74 72 75 63 74 75 72 65 52 65 6c 65 61 73 65  StructureRelease
1e900 28 70 53 74 72 75 63 74 29 3b 0a 20 20 72 65 74  (pStruct);.  ret
1e910 75 72 6e 20 66 74 73 35 49 6e 64 65 78 52 65 74  urn fts5IndexRet
1e920 75 72 6e 28 70 29 3b 20 0a 7d 0a 0a 69 6e 74 20  urn(p); .}..int 
1e930 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78  sqlite3Fts5Index
1e940 4d 65 72 67 65 28 46 74 73 35 49 6e 64 65 78 20  Merge(Fts5Index 
1e950 2a 70 2c 20 69 6e 74 20 6e 4d 65 72 67 65 29 7b  *p, int nMerge){
1e960 0a 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65  .  Fts5Structure
1e970 20 2a 70 53 74 72 75 63 74 3b 0a 0a 20 20 70 53   *pStruct;..  pS
1e980 74 72 75 63 74 20 3d 20 66 74 73 35 53 74 72 75  truct = fts5Stru
1e990 63 74 75 72 65 52 65 61 64 28 70 29 3b 0a 20 20  ctureRead(p);.  
1e9a0 69 66 28 20 70 53 74 72 75 63 74 20 26 26 20 70  if( pStruct && p
1e9b0 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 20 29  Struct->nLevel )
1e9c0 7b 0a 20 20 20 20 66 74 73 35 49 6e 64 65 78 4d  {.    fts5IndexM
1e9d0 65 72 67 65 28 70 2c 20 26 70 53 74 72 75 63 74  erge(p, &pStruct
1e9e0 2c 20 6e 4d 65 72 67 65 29 3b 0a 20 20 20 20 66  , nMerge);.    f
1e9f0 74 73 35 53 74 72 75 63 74 75 72 65 57 72 69 74  ts5StructureWrit
1ea00 65 28 70 2c 20 70 53 74 72 75 63 74 29 3b 0a 20  e(p, pStruct);. 
1ea10 20 7d 0a 20 20 66 74 73 35 53 74 72 75 63 74 75   }.  fts5Structu
1ea20 72 65 52 65 6c 65 61 73 65 28 70 53 74 72 75 63  reRelease(pStruc
1ea30 74 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 66 74  t);..  return ft
1ea40 73 35 49 6e 64 65 78 52 65 74 75 72 6e 28 70 29  s5IndexReturn(p)
1ea50 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64  ;.}..static void
1ea60 20 66 74 73 35 50 6f 73 6c 69 73 74 43 61 6c 6c   fts5PoslistCall
1ea70 62 61 63 6b 28 0a 20 20 46 74 73 35 49 6e 64 65  back(.  Fts5Inde
1ea80 78 20 2a 70 2c 20 0a 20 20 76 6f 69 64 20 2a 70  x *p, .  void *p
1ea90 43 74 78 2c 20 0a 20 20 63 6f 6e 73 74 20 75 38  Ctx, .  const u8
1eaa0 20 2a 70 43 68 75 6e 6b 2c 20 69 6e 74 20 6e 43   *pChunk, int nC
1eab0 68 75 6e 6b 0a 29 7b 0a 20 20 66 74 73 35 42 75  hunk.){.  fts5Bu
1eac0 66 66 65 72 41 70 70 65 6e 64 42 6c 6f 62 28 26  fferAppendBlob(&
1ead0 70 2d 3e 72 63 2c 20 28 46 74 73 35 42 75 66 66  p->rc, (Fts5Buff
1eae0 65 72 2a 29 70 43 74 78 2c 20 6e 43 68 75 6e 6b  er*)pCtx, nChunk
1eaf0 2c 20 70 43 68 75 6e 6b 29 3b 0a 7d 0a 0a 2f 2a  , pChunk);.}../*
1eb00 0a 2a 2a 20 49 74 65 72 61 74 6f 72 20 70 49 74  .** Iterator pIt
1eb10 65 72 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69  er currently poi
1eb20 6e 74 73 20 74 6f 20 61 20 76 61 6c 69 64 20 65  nts to a valid e
1eb30 6e 74 72 79 20 28 6e 6f 74 20 45 4f 46 29 2e 20  ntry (not EOF). 
1eb40 54 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e  This.** function
1eb50 20 61 70 70 65 6e 64 73 20 74 68 65 20 70 6f 73   appends the pos
1eb60 69 74 69 6f 6e 20 6c 69 73 74 20 64 61 74 61 20  ition list data 
1eb70 66 6f 72 20 74 68 65 20 63 75 72 72 65 6e 74 20  for the current 
1eb80 65 6e 74 72 79 20 74 6f 0a 2a 2a 20 62 75 66 66  entry to.** buff
1eb90 65 72 20 70 42 75 66 2e 20 49 74 20 64 6f 65 73  er pBuf. It does
1eba0 20 6e 6f 74 20 6d 61 6b 65 20 61 20 63 6f 70 79   not make a copy
1ebb0 20 6f 66 20 74 68 65 20 70 6f 73 69 74 69 6f 6e   of the position
1ebc0 2d 6c 69 73 74 20 73 69 7a 65 0a 2a 2a 20 66 69  -list size.** fi
1ebd0 65 6c 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  eld..*/.static v
1ebe0 6f 69 64 20 66 74 73 35 53 65 67 69 74 65 72 50  oid fts5SegiterP
1ebf0 6f 73 6c 69 73 74 28 0a 20 20 46 74 73 35 49 6e  oslist(.  Fts5In
1ec00 64 65 78 20 2a 70 2c 0a 20 20 46 74 73 35 53 65  dex *p,.  Fts5Se
1ec10 67 49 74 65 72 20 2a 70 53 65 67 2c 0a 20 20 46  gIter *pSeg,.  F
1ec20 74 73 35 42 75 66 66 65 72 20 2a 70 42 75 66 0a  ts5Buffer *pBuf.
1ec30 29 7b 0a 20 20 66 74 73 35 43 68 75 6e 6b 49 74  ){.  fts5ChunkIt
1ec40 65 72 61 74 65 28 70 2c 20 70 53 65 67 2c 20 28  erate(p, pSeg, (
1ec50 76 6f 69 64 2a 29 70 42 75 66 2c 20 66 74 73 35  void*)pBuf, fts5
1ec60 50 6f 73 6c 69 73 74 43 61 6c 6c 62 61 63 6b 29  PoslistCallback)
1ec70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 74 65 72 61  ;.}../*.** Itera
1ec80 74 6f 72 20 70 4d 75 6c 74 69 20 63 75 72 72 65  tor pMulti curre
1ec90 6e 74 6c 79 20 70 6f 69 6e 74 73 20 74 6f 20 61  ntly points to a
1eca0 20 76 61 6c 69 64 20 65 6e 74 72 79 20 28 6e 6f   valid entry (no
1ecb0 74 20 45 4f 46 29 2e 20 54 68 69 73 0a 2a 2a 20  t EOF). This.** 
1ecc0 66 75 6e 63 74 69 6f 6e 20 61 70 70 65 6e 64 73  function appends
1ecd0 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 70   a copy of the p
1ece0 6f 73 69 74 69 6f 6e 2d 6c 69 73 74 20 6f 66 20  osition-list of 
1ecf0 74 68 65 20 65 6e 74 72 79 20 70 4d 75 6c 74 69  the entry pMulti
1ed00 20 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20 70   .** currently p
1ed10 6f 69 6e 74 73 20 74 6f 20 74 6f 20 62 75 66 66  oints to to buff
1ed20 65 72 20 70 42 75 66 2e 0a 2a 2a 0a 2a 2a 20 49  er pBuf..**.** I
1ed30 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
1ed40 73 2c 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  s, an error code
1ed50 20 69 73 20 6c 65 66 74 20 69 6e 20 70 2d 3e 72   is left in p->r
1ed60 63 2e 20 49 74 20 69 73 20 61 73 73 75 6d 65 64  c. It is assumed
1ed70 0a 2a 2a 20 6e 6f 20 65 72 72 6f 72 20 68 61 73  .** no error has
1ed80 20 61 6c 72 65 61 64 79 20 6f 63 63 75 72 72 65   already occurre
1ed90 64 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63  d when this func
1eda0 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2e 0a  tion is called..
1edb0 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
1edc0 74 73 35 4d 75 6c 74 69 49 74 65 72 50 6f 73 6c  ts5MultiIterPosl
1edd0 69 73 74 28 0a 20 20 46 74 73 35 49 6e 64 65 78  ist(.  Fts5Index
1ede0 20 2a 70 2c 0a 20 20 46 74 73 35 4d 75 6c 74 69   *p,.  Fts5Multi
1edf0 53 65 67 49 74 65 72 20 2a 70 4d 75 6c 74 69 2c  SegIter *pMulti,
1ee00 0a 20 20 69 6e 74 20 62 53 7a 2c 20 20 20 20 20  .  int bSz,     
1ee10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ee20 20 20 20 2f 2a 20 41 70 70 65 6e 64 20 61 20 73     /* Append a s
1ee30 69 7a 65 20 66 69 65 6c 64 20 62 65 66 6f 72 65  ize field before
1ee40 20 74 68 65 20 64 61 74 61 20 2a 2f 0a 20 20 46   the data */.  F
1ee50 74 73 35 42 75 66 66 65 72 20 2a 70 42 75 66 0a  ts5Buffer *pBuf.
1ee60 29 7b 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d  ){.  if( p->rc==
1ee70 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1ee80 20 46 74 73 35 53 65 67 49 74 65 72 20 2a 70 53   Fts5SegIter *pS
1ee90 65 67 20 3d 20 26 70 4d 75 6c 74 69 2d 3e 61 53  eg = &pMulti->aS
1eea0 65 67 5b 20 70 4d 75 6c 74 69 2d 3e 61 46 69 72  eg[ pMulti->aFir
1eeb0 73 74 5b 31 5d 2e 69 46 69 72 73 74 20 5d 3b 0a  st[1].iFirst ];.
1eec0 20 20 20 20 61 73 73 65 72 74 28 20 66 74 73 35      assert( fts5
1eed0 4d 75 6c 74 69 49 74 65 72 45 6f 66 28 70 2c 20  MultiIterEof(p, 
1eee0 70 4d 75 6c 74 69 29 3d 3d 30 20 29 3b 0a 0a 20  pMulti)==0 );.. 
1eef0 20 20 20 69 66 28 20 62 53 7a 20 29 7b 0a 20 20     if( bSz ){.  
1ef00 20 20 20 20 2f 2a 20 57 52 49 54 45 50 4f 53 4c      /* WRITEPOSL
1ef10 49 53 54 53 49 5a 45 20 2a 2f 0a 20 20 20 20 20  ISTSIZE */.     
1ef20 20 66 74 73 35 42 75 66 66 65 72 41 70 70 65 6e   fts5BufferAppen
1ef30 64 56 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20  dVarint(&p->rc, 
1ef40 70 42 75 66 2c 20 70 53 65 67 2d 3e 6e 50 6f 73  pBuf, pSeg->nPos
1ef50 2a 32 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66  *2);.    }.    f
1ef60 74 73 35 53 65 67 69 74 65 72 50 6f 73 6c 69 73  ts5SegiterPoslis
1ef70 74 28 70 2c 20 70 53 65 67 2c 20 70 42 75 66 29  t(p, pSeg, pBuf)
1ef80 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63 20  ;.  }.}..static 
1ef90 76 6f 69 64 20 66 74 73 35 44 6f 63 6c 69 73 74  void fts5Doclist
1efa0 49 74 65 72 4e 65 78 74 28 46 74 73 35 44 6f 63  IterNext(Fts5Doc
1efb0 6c 69 73 74 49 74 65 72 20 2a 70 49 74 65 72 29  listIter *pIter)
1efc0 7b 0a 20 20 69 66 28 20 70 49 74 65 72 2d 3e 69  {.  if( pIter->i
1efd0 3c 70 49 74 65 72 2d 3e 6e 20 29 7b 0a 20 20 20  <pIter->n ){.   
1efe0 20 69 6e 74 20 62 44 75 6d 6d 79 3b 0a 20 20 20   int bDummy;.   
1eff0 20 69 66 28 20 70 49 74 65 72 2d 3e 69 20 29 7b   if( pIter->i ){
1f000 0a 20 20 20 20 20 20 69 36 34 20 69 44 65 6c 74  .      i64 iDelt
1f010 61 3b 0a 20 20 20 20 20 20 70 49 74 65 72 2d 3e  a;.      pIter->
1f020 69 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69  i += fts5GetVari
1f030 6e 74 28 26 70 49 74 65 72 2d 3e 61 5b 70 49 74  nt(&pIter->a[pIt
1f040 65 72 2d 3e 69 5d 2c 20 28 75 36 34 2a 29 26 69  er->i], (u64*)&i
1f050 44 65 6c 74 61 29 3b 0a 20 20 20 20 20 20 70 49  Delta);.      pI
1f060 74 65 72 2d 3e 69 52 6f 77 69 64 20 2b 3d 20 69  ter->iRowid += i
1f070 44 65 6c 74 61 3b 0a 20 20 20 20 7d 65 6c 73 65  Delta;.    }else
1f080 7b 0a 20 20 20 20 20 20 70 49 74 65 72 2d 3e 69  {.      pIter->i
1f090 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e   += fts5GetVarin
1f0a0 74 28 26 70 49 74 65 72 2d 3e 61 5b 70 49 74 65  t(&pIter->a[pIte
1f0b0 72 2d 3e 69 5d 2c 20 28 75 36 34 2a 29 26 70 49  r->i], (u64*)&pI
1f0c0 74 65 72 2d 3e 69 52 6f 77 69 64 29 3b 0a 20 20  ter->iRowid);.  
1f0d0 20 20 7d 0a 20 20 20 20 70 49 74 65 72 2d 3e 69    }.    pIter->i
1f0e0 20 2b 3d 20 66 74 73 35 47 65 74 50 6f 73 6c 69   += fts5GetPosli
1f0f0 73 74 53 69 7a 65 28 0a 20 20 20 20 20 20 20 20  stSize(.        
1f100 26 70 49 74 65 72 2d 3e 61 5b 70 49 74 65 72 2d  &pIter->a[pIter-
1f110 3e 69 5d 2c 20 26 70 49 74 65 72 2d 3e 6e 50 6f  >i], &pIter->nPo
1f120 73 6c 69 73 74 2c 20 26 62 44 75 6d 6d 79 0a 20  slist, &bDummy. 
1f130 20 20 20 29 3b 0a 20 20 20 20 70 49 74 65 72 2d     );.    pIter-
1f140 3e 61 50 6f 73 6c 69 73 74 20 3d 20 26 70 49 74  >aPoslist = &pIt
1f150 65 72 2d 3e 61 5b 70 49 74 65 72 2d 3e 69 5d 3b  er->a[pIter->i];
1f160 0a 20 20 20 20 70 49 74 65 72 2d 3e 69 20 2b 3d  .    pIter->i +=
1f170 20 70 49 74 65 72 2d 3e 6e 50 6f 73 6c 69 73 74   pIter->nPoslist
1f180 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
1f190 49 74 65 72 2d 3e 61 50 6f 73 6c 69 73 74 20 3d  Iter->aPoslist =
1f1a0 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69   0;.  }.}..stati
1f1b0 63 20 76 6f 69 64 20 66 74 73 35 44 6f 63 6c 69  c void fts5Docli
1f1c0 73 74 49 74 65 72 49 6e 69 74 28 0a 20 20 46 74  stIterInit(.  Ft
1f1d0 73 35 42 75 66 66 65 72 20 2a 70 42 75 66 2c 20  s5Buffer *pBuf, 
1f1e0 0a 20 20 46 74 73 35 44 6f 63 6c 69 73 74 49 74  .  Fts5DoclistIt
1f1f0 65 72 20 2a 70 49 74 65 72 0a 29 7b 0a 20 20 6d  er *pIter.){.  m
1f200 65 6d 73 65 74 28 70 49 74 65 72 2c 20 30 2c 20  emset(pIter, 0, 
1f210 73 69 7a 65 6f 66 28 2a 70 49 74 65 72 29 29 3b  sizeof(*pIter));
1f220 0a 20 20 70 49 74 65 72 2d 3e 61 20 3d 20 70 42  .  pIter->a = pB
1f230 75 66 2d 3e 70 3b 0a 20 20 70 49 74 65 72 2d 3e  uf->p;.  pIter->
1f240 6e 20 3d 20 70 42 75 66 2d 3e 6e 3b 0a 20 20 66  n = pBuf->n;.  f
1f250 74 73 35 44 6f 63 6c 69 73 74 49 74 65 72 4e 65  ts5DoclistIterNe
1f260 78 74 28 70 49 74 65 72 29 3b 0a 7d 0a 0a 2f 2a  xt(pIter);.}../*
1f270 0a 2a 2a 20 41 70 70 65 6e 64 20 61 20 64 6f 63  .** Append a doc
1f280 6c 69 73 74 20 74 6f 20 62 75 66 66 65 72 20 70  list to buffer p
1f290 42 75 66 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  Buf..*/.static v
1f2a0 6f 69 64 20 66 74 73 35 4d 65 72 67 65 41 70 70  oid fts5MergeApp
1f2b0 65 6e 64 44 6f 63 69 64 28 0a 20 20 69 6e 74 20  endDocid(.  int 
1f2c0 2a 70 52 63 2c 20 20 20 20 20 20 20 20 20 20 20  *pRc,           
1f2d0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
1f2e0 4e 2f 4f 55 54 3a 20 45 72 72 6f 72 20 63 6f 64  N/OUT: Error cod
1f2f0 65 20 2a 2f 0a 20 20 46 74 73 35 42 75 66 66 65  e */.  Fts5Buffe
1f300 72 20 2a 70 42 75 66 2c 20 20 20 20 20 20 20 20  r *pBuf,        
1f310 20 20 20 20 20 20 20 2f 2a 20 42 75 66 66 65 72         /* Buffer
1f320 20 74 6f 20 77 72 69 74 65 20 74 6f 20 2a 2f 0a   to write to */.
1f330 20 20 69 36 34 20 2a 70 69 4c 61 73 74 52 6f 77    i64 *piLastRow
1f340 69 64 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  id,             
1f350 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 50 72 65    /* IN/OUT: Pre
1f360 76 69 6f 75 73 20 72 6f 77 69 64 20 77 72 69 74  vious rowid writ
1f370 74 65 6e 20 28 69 66 20 61 6e 79 29 20 2a 2f 0a  ten (if any) */.
1f380 20 20 69 36 34 20 69 52 6f 77 69 64 20 20 20 20    i64 iRowid    
1f390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f3a0 20 20 2f 2a 20 52 6f 77 69 64 20 74 6f 20 61 70    /* Rowid to ap
1f3b0 70 65 6e 64 20 2a 2f 0a 29 7b 0a 20 20 69 66 28  pend */.){.  if(
1f3c0 20 70 42 75 66 2d 3e 6e 3d 3d 30 20 29 7b 0a 20   pBuf->n==0 ){. 
1f3d0 20 20 20 66 74 73 35 42 75 66 66 65 72 41 70 70     fts5BufferApp
1f3e0 65 6e 64 56 61 72 69 6e 74 28 70 52 63 2c 20 70  endVarint(pRc, p
1f3f0 42 75 66 2c 20 69 52 6f 77 69 64 29 3b 0a 20 20  Buf, iRowid);.  
1f400 7d 65 6c 73 65 7b 0a 20 20 20 20 66 74 73 35 42  }else{.    fts5B
1f410 75 66 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e  ufferAppendVarin
1f420 74 28 70 52 63 2c 20 70 42 75 66 2c 20 69 52 6f  t(pRc, pBuf, iRo
1f430 77 69 64 20 2d 20 2a 70 69 4c 61 73 74 52 6f 77  wid - *piLastRow
1f440 69 64 29 3b 0a 20 20 7d 0a 20 20 2a 70 69 4c 61  id);.  }.  *piLa
1f450 73 74 52 6f 77 69 64 20 3d 20 69 52 6f 77 69 64  stRowid = iRowid
1f460 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42 75 66 66 65  ;.}../*.** Buffe
1f470 72 73 20 70 31 20 61 6e 64 20 70 32 20 63 6f 6e  rs p1 and p2 con
1f480 74 61 69 6e 20 64 6f 63 6c 69 73 74 73 2e 20 54  tain doclists. T
1f490 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 65 72  his function mer
1f4a0 67 65 73 20 74 68 65 20 63 6f 6e 74 65 6e 74 0a  ges the content.
1f4b0 2a 2a 20 6f 66 20 74 68 65 20 74 77 6f 20 64 6f  ** of the two do
1f4c0 63 6c 69 73 74 73 20 74 6f 67 65 74 68 65 72 20  clists together 
1f4d0 61 6e 64 20 73 65 74 73 20 62 75 66 66 65 72 20  and sets buffer 
1f4e0 70 31 20 74 6f 20 74 68 65 20 72 65 73 75 6c 74  p1 to the result
1f4f0 20 62 65 66 6f 72 65 0a 2a 2a 20 72 65 74 75 72   before.** retur
1f500 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  ning..**.** If a
1f510 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  n error occurs, 
1f520 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  an error code is
1f530 20 6c 65 66 74 20 69 6e 20 70 2d 3e 72 63 2e 20   left in p->rc. 
1f540 49 66 20 61 6e 20 65 72 72 6f 72 20 68 61 73 0a  If an error has.
1f550 2a 2a 20 61 6c 72 65 61 64 79 20 6f 63 63 75 72  ** already occur
1f560 72 65 64 2c 20 74 68 69 73 20 66 75 6e 63 74 69  red, this functi
1f570 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a  on is a no-op..*
1f580 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  /.static void ft
1f590 73 35 4d 65 72 67 65 50 72 65 66 69 78 4c 69 73  s5MergePrefixLis
1f5a0 74 73 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20  ts(.  Fts5Index 
1f5b0 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  *p,             
1f5c0 20 20 20 20 20 20 2f 2a 20 46 54 53 35 20 62 61        /* FTS5 ba
1f5d0 63 6b 65 6e 64 20 6f 62 6a 65 63 74 20 2a 2f 0a  ckend object */.
1f5e0 20 20 46 74 73 35 42 75 66 66 65 72 20 2a 70 31    Fts5Buffer *p1
1f5f0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1f600 20 20 2f 2a 20 46 69 72 73 74 20 6c 69 73 74 20    /* First list 
1f610 74 6f 20 6d 65 72 67 65 20 2a 2f 0a 20 20 46 74  to merge */.  Ft
1f620 73 35 42 75 66 66 65 72 20 2a 70 32 20 20 20 20  s5Buffer *p2    
1f630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1f640 20 53 65 63 6f 6e 64 20 6c 69 73 74 20 74 6f 20   Second list to 
1f650 6d 65 72 67 65 20 2a 2f 0a 29 7b 0a 20 20 69 66  merge */.){.  if
1f660 28 20 70 32 2d 3e 6e 20 29 7b 0a 20 20 20 20 69  ( p2->n ){.    i
1f670 36 34 20 69 4c 61 73 74 52 6f 77 69 64 20 3d 20  64 iLastRowid = 
1f680 30 3b 0a 20 20 20 20 46 74 73 35 44 6f 63 6c 69  0;.    Fts5Docli
1f690 73 74 49 74 65 72 20 69 31 3b 0a 20 20 20 20 46  stIter i1;.    F
1f6a0 74 73 35 44 6f 63 6c 69 73 74 49 74 65 72 20 69  ts5DoclistIter i
1f6b0 32 3b 0a 20 20 20 20 46 74 73 35 42 75 66 66 65  2;.    Fts5Buffe
1f6c0 72 20 6f 75 74 3b 0a 20 20 20 20 46 74 73 35 42  r out;.    Fts5B
1f6d0 75 66 66 65 72 20 74 6d 70 3b 0a 20 20 20 20 6d  uffer tmp;.    m
1f6e0 65 6d 73 65 74 28 26 6f 75 74 2c 20 30 2c 20 73  emset(&out, 0, s
1f6f0 69 7a 65 6f 66 28 6f 75 74 29 29 3b 0a 20 20 20  izeof(out));.   
1f700 20 6d 65 6d 73 65 74 28 26 74 6d 70 2c 20 30 2c   memset(&tmp, 0,
1f710 20 73 69 7a 65 6f 66 28 74 6d 70 29 29 3b 0a 0a   sizeof(tmp));..
1f720 20 20 20 20 66 74 73 35 44 6f 63 6c 69 73 74 49      fts5DoclistI
1f730 74 65 72 49 6e 69 74 28 70 31 2c 20 26 69 31 29  terInit(p1, &i1)
1f740 3b 0a 20 20 20 20 66 74 73 35 44 6f 63 6c 69 73  ;.    fts5Doclis
1f750 74 49 74 65 72 49 6e 69 74 28 70 32 2c 20 26 69  tIterInit(p2, &i
1f760 32 29 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 70  2);.    while( p
1f770 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
1f780 26 26 20 28 69 31 2e 61 50 6f 73 6c 69 73 74 21  && (i1.aPoslist!
1f790 3d 30 20 7c 7c 20 69 32 2e 61 50 6f 73 6c 69 73  =0 || i2.aPoslis
1f7a0 74 21 3d 30 29 20 29 7b 0a 20 20 20 20 20 20 69  t!=0) ){.      i
1f7b0 66 28 20 69 32 2e 61 50 6f 73 6c 69 73 74 3d 3d  f( i2.aPoslist==
1f7c0 30 20 7c 7c 20 28 69 31 2e 61 50 6f 73 6c 69 73  0 || (i1.aPoslis
1f7d0 74 20 26 26 20 69 31 2e 69 52 6f 77 69 64 3c 69  t && i1.iRowid<i
1f7e0 32 2e 69 52 6f 77 69 64 29 20 29 7b 0a 20 20 20  2.iRowid) ){.   
1f7f0 20 20 20 20 20 2f 2a 20 43 6f 70 79 20 65 6e 74       /* Copy ent
1f800 72 79 20 66 72 6f 6d 20 69 31 20 2a 2f 0a 20 20  ry from i1 */.  
1f810 20 20 20 20 20 20 66 74 73 35 4d 65 72 67 65 41        fts5MergeA
1f820 70 70 65 6e 64 44 6f 63 69 64 28 26 70 2d 3e 72  ppendDocid(&p->r
1f830 63 2c 20 26 6f 75 74 2c 20 26 69 4c 61 73 74 52  c, &out, &iLastR
1f840 6f 77 69 64 2c 20 69 31 2e 69 52 6f 77 69 64 29  owid, i1.iRowid)
1f850 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 57 52 49  ;.        /* WRI
1f860 54 45 50 4f 53 4c 49 53 54 53 49 5a 45 20 2a 2f  TEPOSLISTSIZE */
1f870 0a 20 20 20 20 20 20 20 20 66 74 73 35 42 75 66  .        fts5Buf
1f880 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e 74 28  ferAppendVarint(
1f890 26 70 2d 3e 72 63 2c 20 26 6f 75 74 2c 20 69 31  &p->rc, &out, i1
1f8a0 2e 6e 50 6f 73 6c 69 73 74 20 2a 20 32 29 3b 0a  .nPoslist * 2);.
1f8b0 20 20 20 20 20 20 20 20 66 74 73 35 42 75 66 66          fts5Buff
1f8c0 65 72 41 70 70 65 6e 64 42 6c 6f 62 28 26 70 2d  erAppendBlob(&p-
1f8d0 3e 72 63 2c 20 26 6f 75 74 2c 20 69 31 2e 6e 50  >rc, &out, i1.nP
1f8e0 6f 73 6c 69 73 74 2c 20 69 31 2e 61 50 6f 73 6c  oslist, i1.aPosl
1f8f0 69 73 74 29 3b 0a 20 20 20 20 20 20 20 20 66 74  ist);.        ft
1f900 73 35 44 6f 63 6c 69 73 74 49 74 65 72 4e 65 78  s5DoclistIterNex
1f910 74 28 26 69 31 29 3b 0a 20 20 20 20 20 20 7d 0a  t(&i1);.      }.
1f920 20 20 20 20 20 20 65 6c 73 65 20 69 66 28 20 69        else if( i
1f930 31 2e 61 50 6f 73 6c 69 73 74 3d 3d 30 20 7c 7c  1.aPoslist==0 ||
1f940 20 69 32 2e 69 52 6f 77 69 64 21 3d 69 31 2e 69   i2.iRowid!=i1.i
1f950 52 6f 77 69 64 20 29 7b 0a 20 20 20 20 20 20 20  Rowid ){.       
1f960 20 2f 2a 20 43 6f 70 79 20 65 6e 74 72 79 20 66   /* Copy entry f
1f970 72 6f 6d 20 69 32 20 2a 2f 0a 20 20 20 20 20 20  rom i2 */.      
1f980 20 20 66 74 73 35 4d 65 72 67 65 41 70 70 65 6e    fts5MergeAppen
1f990 64 44 6f 63 69 64 28 26 70 2d 3e 72 63 2c 20 26  dDocid(&p->rc, &
1f9a0 6f 75 74 2c 20 26 69 4c 61 73 74 52 6f 77 69 64  out, &iLastRowid
1f9b0 2c 20 69 32 2e 69 52 6f 77 69 64 29 3b 0a 20 20  , i2.iRowid);.  
1f9c0 20 20 20 20 20 20 2f 2a 20 57 52 49 54 45 50 4f        /* WRITEPO
1f9d0 53 4c 49 53 54 53 49 5a 45 20 2a 2f 0a 20 20 20  SLISTSIZE */.   
1f9e0 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72 41       fts5BufferA
1f9f0 70 70 65 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e  ppendVarint(&p->
1fa00 72 63 2c 20 26 6f 75 74 2c 20 69 32 2e 6e 50 6f  rc, &out, i2.nPo
1fa10 73 6c 69 73 74 20 2a 20 32 29 3b 0a 20 20 20 20  slist * 2);.    
1fa20 20 20 20 20 66 74 73 35 42 75 66 66 65 72 41 70      fts5BufferAp
1fa30 70 65 6e 64 42 6c 6f 62 28 26 70 2d 3e 72 63 2c  pendBlob(&p->rc,
1fa40 20 26 6f 75 74 2c 20 69 32 2e 6e 50 6f 73 6c 69   &out, i2.nPosli
1fa50 73 74 2c 20 69 32 2e 61 50 6f 73 6c 69 73 74 29  st, i2.aPoslist)
1fa60 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35 44 6f  ;.        fts5Do
1fa70 63 6c 69 73 74 49 74 65 72 4e 65 78 74 28 26 69  clistIterNext(&i
1fa80 32 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  2);.      }.    
1fa90 20 20 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20    else{.        
1faa0 46 74 73 35 50 6f 73 6c 69 73 74 52 65 61 64 65  Fts5PoslistReade
1fab0 72 20 72 31 3b 0a 20 20 20 20 20 20 20 20 46 74  r r1;.        Ft
1fac0 73 35 50 6f 73 6c 69 73 74 52 65 61 64 65 72 20  s5PoslistReader 
1fad0 72 32 3b 0a 20 20 20 20 20 20 20 20 46 74 73 35  r2;.        Fts5
1fae0 50 6f 73 6c 69 73 74 57 72 69 74 65 72 20 77 72  PoslistWriter wr
1faf0 69 74 65 72 3b 0a 0a 20 20 20 20 20 20 20 20 6d  iter;..        m
1fb00 65 6d 73 65 74 28 26 77 72 69 74 65 72 2c 20 30  emset(&writer, 0
1fb10 2c 20 73 69 7a 65 6f 66 28 77 72 69 74 65 72 29  , sizeof(writer)
1fb20 29 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 4d  );..        /* M
1fb30 65 72 67 65 20 74 68 65 20 74 77 6f 20 70 6f 73  erge the two pos
1fb40 69 74 69 6f 6e 20 6c 69 73 74 73 2e 20 2a 2f 20  ition lists. */ 
1fb50 0a 20 20 20 20 20 20 20 20 66 74 73 35 4d 65 72  .        fts5Mer
1fb60 67 65 41 70 70 65 6e 64 44 6f 63 69 64 28 26 70  geAppendDocid(&p
1fb70 2d 3e 72 63 2c 20 26 6f 75 74 2c 20 26 69 4c 61  ->rc, &out, &iLa
1fb80 73 74 52 6f 77 69 64 2c 20 69 32 2e 69 52 6f 77  stRowid, i2.iRow
1fb90 69 64 29 3b 0a 20 20 20 20 20 20 20 20 66 74 73  id);.        fts
1fba0 35 42 75 66 66 65 72 5a 65 72 6f 28 26 74 6d 70  5BufferZero(&tmp
1fbb0 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
1fbc0 65 33 46 74 73 35 50 6f 73 6c 69 73 74 52 65 61  e3Fts5PoslistRea
1fbd0 64 65 72 49 6e 69 74 28 2d 31 2c 20 69 31 2e 61  derInit(-1, i1.a
1fbe0 50 6f 73 6c 69 73 74 2c 20 69 31 2e 6e 50 6f 73  Poslist, i1.nPos
1fbf0 6c 69 73 74 2c 20 26 72 31 29 3b 0a 20 20 20 20  list, &r1);.    
1fc00 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 50      sqlite3Fts5P
1fc10 6f 73 6c 69 73 74 52 65 61 64 65 72 49 6e 69 74  oslistReaderInit
1fc20 28 2d 31 2c 20 69 32 2e 61 50 6f 73 6c 69 73 74  (-1, i2.aPoslist
1fc30 2c 20 69 32 2e 6e 50 6f 73 6c 69 73 74 2c 20 26  , i2.nPoslist, &
1fc40 72 32 29 3b 0a 20 20 20 20 20 20 20 20 77 68 69  r2);.        whi
1fc50 6c 65 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  le( p->rc==SQLIT
1fc60 45 5f 4f 4b 20 26 26 20 28 72 31 2e 62 45 6f 66  E_OK && (r1.bEof
1fc70 3d 3d 30 20 7c 7c 20 72 32 2e 62 45 6f 66 3d 3d  ==0 || r2.bEof==
1fc80 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  0) ){.          
1fc90 69 36 34 20 69 4e 65 77 3b 0a 20 20 20 20 20 20  i64 iNew;.      
1fca0 20 20 20 20 69 66 28 20 72 32 2e 62 45 6f 66 20      if( r2.bEof 
1fcb0 7c 7c 20 28 72 31 2e 62 45 6f 66 3d 3d 30 20 26  || (r1.bEof==0 &
1fcc0 26 20 72 31 2e 69 50 6f 73 3c 72 32 2e 69 50 6f  & r1.iPos<r2.iPo
1fcd0 73 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  s) ){.          
1fce0 20 20 69 4e 65 77 20 3d 20 72 31 2e 69 50 6f 73    iNew = r1.iPos
1fcf0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  ;.            sq
1fd00 6c 69 74 65 33 46 74 73 35 50 6f 73 6c 69 73 74  lite3Fts5Poslist
1fd10 52 65 61 64 65 72 4e 65 78 74 28 26 72 31 29 3b  ReaderNext(&r1);
1fd20 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65  .          }else
1fd30 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 4e  {.            iN
1fd40 65 77 20 3d 20 72 32 2e 69 50 6f 73 3b 0a 20 20  ew = r2.iPos;.  
1fd50 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
1fd60 33 46 74 73 35 50 6f 73 6c 69 73 74 52 65 61 64  3Fts5PoslistRead
1fd70 65 72 4e 65 78 74 28 26 72 32 29 3b 0a 20 20 20  erNext(&r2);.   
1fd80 20 20 20 20 20 20 20 20 20 69 66 28 20 72 31 2e           if( r1.
1fd90 69 50 6f 73 3d 3d 72 32 2e 69 50 6f 73 20 29 20  iPos==r2.iPos ) 
1fda0 73 71 6c 69 74 65 33 46 74 73 35 50 6f 73 6c 69  sqlite3Fts5Posli
1fdb0 73 74 52 65 61 64 65 72 4e 65 78 74 28 26 72 31  stReaderNext(&r1
1fdc0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
1fdd0 20 20 20 20 20 20 20 20 20 70 2d 3e 72 63 20 3d           p->rc =
1fde0 20 73 71 6c 69 74 65 33 46 74 73 35 50 6f 73 6c   sqlite3Fts5Posl
1fdf0 69 73 74 57 72 69 74 65 72 41 70 70 65 6e 64 28  istWriterAppend(
1fe00 26 74 6d 70 2c 20 26 77 72 69 74 65 72 2c 20 69  &tmp, &writer, i
1fe10 4e 65 77 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  New);.        }.
1fe20 0a 20 20 20 20 20 20 20 20 2f 2a 20 57 52 49 54  .        /* WRIT
1fe30 45 50 4f 53 4c 49 53 54 53 49 5a 45 20 2a 2f 0a  EPOSLISTSIZE */.
1fe40 20 20 20 20 20 20 20 20 66 74 73 35 42 75 66 66          fts5Buff
1fe50 65 72 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26  erAppendVarint(&
1fe60 70 2d 3e 72 63 2c 20 26 6f 75 74 2c 20 74 6d 70  p->rc, &out, tmp
1fe70 2e 6e 20 2a 20 32 29 3b 0a 20 20 20 20 20 20 20  .n * 2);.       
1fe80 20 66 74 73 35 42 75 66 66 65 72 41 70 70 65 6e   fts5BufferAppen
1fe90 64 42 6c 6f 62 28 26 70 2d 3e 72 63 2c 20 26 6f  dBlob(&p->rc, &o
1fea0 75 74 2c 20 74 6d 70 2e 6e 2c 20 74 6d 70 2e 70  ut, tmp.n, tmp.p
1feb0 29 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35 44  );.        fts5D
1fec0 6f 63 6c 69 73 74 49 74 65 72 4e 65 78 74 28 26  oclistIterNext(&
1fed0 69 31 29 3b 0a 20 20 20 20 20 20 20 20 66 74 73  i1);.        fts
1fee0 35 44 6f 63 6c 69 73 74 49 74 65 72 4e 65 78 74  5DoclistIterNext
1fef0 28 26 69 32 29 3b 0a 20 20 20 20 20 20 7d 0a 20  (&i2);.      }. 
1ff00 20 20 20 7d 0a 0a 20 20 20 20 66 74 73 35 42 75     }..    fts5Bu
1ff10 66 66 65 72 53 65 74 28 26 70 2d 3e 72 63 2c 20  fferSet(&p->rc, 
1ff20 70 31 2c 20 6f 75 74 2e 6e 2c 20 6f 75 74 2e 70  p1, out.n, out.p
1ff30 29 3b 0a 20 20 20 20 66 74 73 35 42 75 66 66 65  );.    fts5Buffe
1ff40 72 46 72 65 65 28 26 74 6d 70 29 3b 0a 20 20 20  rFree(&tmp);.   
1ff50 20 66 74 73 35 42 75 66 66 65 72 46 72 65 65 28   fts5BufferFree(
1ff60 26 6f 75 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 73 74  &out);.  }.}..st
1ff70 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 42 75  atic void fts5Bu
1ff80 66 66 65 72 53 77 61 70 28 46 74 73 35 42 75 66  fferSwap(Fts5Buf
1ff90 66 65 72 20 2a 70 31 2c 20 46 74 73 35 42 75 66  fer *p1, Fts5Buf
1ffa0 66 65 72 20 2a 70 32 29 7b 0a 20 20 46 74 73 35  fer *p2){.  Fts5
1ffb0 42 75 66 66 65 72 20 74 6d 70 20 3d 20 2a 70 31  Buffer tmp = *p1
1ffc0 3b 0a 20 20 2a 70 31 20 3d 20 2a 70 32 3b 0a 20  ;.  *p1 = *p2;. 
1ffd0 20 2a 70 32 20 3d 20 74 6d 70 3b 0a 7d 0a 0a 73   *p2 = tmp;.}..s
1ffe0 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 53  tatic void fts5S
1fff0 65 74 75 70 50 72 65 66 69 78 49 74 65 72 28 0a  etupPrefixIter(.
20000 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20    Fts5Index *p, 
20010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20020 20 20 2f 2a 20 49 6e 64 65 78 20 74 6f 20 72 65    /* Index to re
20030 61 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74  ad from */.  int
20040 20 62 44 65 73 63 2c 20 20 20 20 20 20 20 20 20   bDesc,         
20050 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
20060 54 72 75 65 20 66 6f 72 20 22 4f 52 44 45 52 20  True for "ORDER 
20070 42 59 20 72 6f 77 69 64 20 44 45 53 43 22 20 2a  BY rowid DESC" *
20080 2f 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 70 54  /.  const u8 *pT
20090 6f 6b 65 6e 2c 20 20 20 20 20 20 20 20 20 20 20  oken,           
200a0 20 20 20 20 2f 2a 20 42 75 66 66 65 72 20 63 6f      /* Buffer co
200b0 6e 74 61 69 6e 69 6e 67 20 70 72 65 66 69 78 20  ntaining prefix 
200c0 74 6f 20 6d 61 74 63 68 20 2a 2f 0a 20 20 69 6e  to match */.  in
200d0 74 20 6e 54 6f 6b 65 6e 2c 20 20 20 20 20 20 20  t nToken,       
200e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
200f0 20 53 69 7a 65 20 6f 66 20 62 75 66 66 65 72 20   Size of buffer 
20100 70 54 6f 6b 65 6e 20 69 6e 20 62 79 74 65 73 20  pToken in bytes 
20110 2a 2f 0a 20 20 46 74 73 35 49 6e 64 65 78 49 74  */.  Fts5IndexIt
20120 65 72 20 2a 70 49 74 65 72 20 20 20 20 20 20 20  er *pIter       
20130 20 20 20 20 20 2f 2a 20 50 6f 70 75 6c 61 74 65       /* Populate
20140 20 74 68 69 73 20 6f 62 6a 65 63 74 20 2a 2f 0a   this object */.
20150 29 7b 0a 20 20 46 74 73 35 53 74 72 75 63 74 75  ){.  Fts5Structu
20160 72 65 20 2a 70 53 74 72 75 63 74 3b 0a 20 20 46  re *pStruct;.  F
20170 74 73 35 42 75 66 66 65 72 20 2a 61 42 75 66 3b  ts5Buffer *aBuf;
20180 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 6e 42 75  .  const int nBu
20190 66 20 3d 20 33 32 3b 0a 0a 20 20 61 42 75 66 20  f = 32;..  aBuf 
201a0 3d 20 28 46 74 73 35 42 75 66 66 65 72 2a 29 66  = (Fts5Buffer*)f
201b0 74 73 35 49 64 78 4d 61 6c 6c 6f 63 28 70 2c 20  ts5IdxMalloc(p, 
201c0 73 69 7a 65 6f 66 28 46 74 73 35 42 75 66 66 65  sizeof(Fts5Buffe
201d0 72 29 2a 6e 42 75 66 29 3b 0a 20 20 70 53 74 72  r)*nBuf);.  pStr
201e0 75 63 74 20 3d 20 66 74 73 35 53 74 72 75 63 74  uct = fts5Struct
201f0 75 72 65 52 65 61 64 28 70 29 3b 0a 0a 20 20 69  ureRead(p);..  i
20200 66 28 20 61 42 75 66 20 26 26 20 70 53 74 72 75  f( aBuf && pStru
20210 63 74 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20  ct ){.    const 
20220 69 6e 74 20 66 6c 61 67 73 20 3d 20 46 54 53 35  int flags = FTS5
20230 49 4e 44 45 58 5f 51 55 45 52 59 5f 53 43 41 4e  INDEX_QUERY_SCAN
20240 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  ;.    int i;.   
20250 20 69 36 34 20 69 4c 61 73 74 52 6f 77 69 64 20   i64 iLastRowid 
20260 3d 20 30 3b 0a 20 20 20 20 46 74 73 35 4d 75 6c  = 0;.    Fts5Mul
20270 74 69 53 65 67 49 74 65 72 20 2a 70 31 20 3d 20  tiSegIter *p1 = 
20280 30 3b 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74  0;     /* Iterat
20290 6f 72 20 75 73 65 64 20 74 6f 20 67 61 74 68 65  or used to gathe
202a0 72 20 64 61 74 61 20 66 72 6f 6d 20 69 6e 64 65  r data from inde
202b0 78 20 2a 2f 0a 20 20 20 20 46 74 73 35 44 61 74  x */.    Fts5Dat
202c0 61 20 2a 70 44 61 74 61 3b 0a 20 20 20 20 46 74  a *pData;.    Ft
202d0 73 35 42 75 66 66 65 72 20 64 6f 63 6c 69 73 74  s5Buffer doclist
202e0 3b 0a 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 64  ;..    memset(&d
202f0 6f 63 6c 69 73 74 2c 20 30 2c 20 73 69 7a 65 6f  oclist, 0, sizeo
20300 66 28 64 6f 63 6c 69 73 74 29 29 3b 0a 20 20 20  f(doclist));.   
20310 20 66 6f 72 28 66 74 73 35 4d 75 6c 74 69 49 74   for(fts5MultiIt
20320 65 72 4e 65 77 28 70 2c 20 70 53 74 72 75 63 74  erNew(p, pStruct
20330 2c 20 31 2c 20 66 6c 61 67 73 2c 20 70 54 6f 6b  , 1, flags, pTok
20340 65 6e 2c 20 6e 54 6f 6b 65 6e 2c 20 2d 31 2c 20  en, nToken, -1, 
20350 30 2c 20 26 70 31 29 3b 0a 20 20 20 20 20 20 20  0, &p1);.       
20360 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 45 6f   fts5MultiIterEo
20370 66 28 70 2c 20 70 31 29 3d 3d 30 3b 0a 20 20 20  f(p, p1)==0;.   
20380 20 20 20 20 20 66 74 73 35 4d 75 6c 74 69 49 74       fts5MultiIt
20390 65 72 4e 65 78 74 28 70 2c 20 70 31 2c 20 30 2c  erNext(p, p1, 0,
203a0 20 30 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20   0).    ){.     
203b0 20 69 36 34 20 69 52 6f 77 69 64 20 3d 20 66 74   i64 iRowid = ft
203c0 73 35 4d 75 6c 74 69 49 74 65 72 52 6f 77 69 64  s5MultiIterRowid
203d0 28 70 31 29 3b 0a 20 20 20 20 20 20 69 6e 74 20  (p1);.      int 
203e0 6e 54 65 72 6d 3b 0a 20 20 20 20 20 20 63 6f 6e  nTerm;.      con
203f0 73 74 20 75 38 20 2a 70 54 65 72 6d 20 3d 20 66  st u8 *pTerm = f
20400 74 73 35 4d 75 6c 74 69 49 74 65 72 54 65 72 6d  ts5MultiIterTerm
20410 28 70 31 2c 20 26 6e 54 65 72 6d 29 3b 0a 20 20  (p1, &nTerm);.  
20420 20 20 20 20 61 73 73 65 72 74 28 20 6d 65 6d 63      assert( memc
20430 6d 70 28 70 54 6f 6b 65 6e 2c 20 70 54 65 72 6d  mp(pToken, pTerm
20440 2c 20 4d 49 4e 28 6e 54 6f 6b 65 6e 2c 20 6e 54  , MIN(nToken, nT
20450 65 72 6d 29 29 3c 3d 30 20 29 3b 0a 20 20 20 20  erm))<=0 );.    
20460 20 20 69 66 28 20 6e 54 65 72 6d 3c 6e 54 6f 6b    if( nTerm<nTok
20470 65 6e 20 7c 7c 20 6d 65 6d 63 6d 70 28 70 54 6f  en || memcmp(pTo
20480 6b 65 6e 2c 20 70 54 65 72 6d 2c 20 6e 54 6f 6b  ken, pTerm, nTok
20490 65 6e 29 20 29 20 62 72 65 61 6b 3b 0a 0a 20 20  en) ) break;..  
204a0 20 20 20 20 69 66 28 20 64 6f 63 6c 69 73 74 2e      if( doclist.
204b0 6e 3e 30 20 26 26 20 69 52 6f 77 69 64 3c 3d 69  n>0 && iRowid<=i
204c0 4c 61 73 74 52 6f 77 69 64 20 29 7b 0a 20 20 20  LastRowid ){.   
204d0 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 70 2d       for(i=0; p-
204e0 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26  >rc==SQLITE_OK &
204f0 26 20 64 6f 63 6c 69 73 74 2e 6e 3b 20 69 2b 2b  & doclist.n; i++
20500 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  ){.          ass
20510 65 72 74 28 20 69 3c 6e 42 75 66 20 29 3b 0a 20  ert( i<nBuf );. 
20520 20 20 20 20 20 20 20 20 20 69 66 28 20 61 42 75           if( aBu
20530 66 5b 69 5d 2e 6e 3d 3d 30 20 29 7b 0a 20 20 20  f[i].n==0 ){.   
20540 20 20 20 20 20 20 20 20 20 66 74 73 35 42 75 66           fts5Buf
20550 66 65 72 53 77 61 70 28 26 64 6f 63 6c 69 73 74  ferSwap(&doclist
20560 2c 20 26 61 42 75 66 5b 69 5d 29 3b 0a 20 20 20  , &aBuf[i]);.   
20570 20 20 20 20 20 20 20 20 20 66 74 73 35 42 75 66           fts5Buf
20580 66 65 72 5a 65 72 6f 28 26 64 6f 63 6c 69 73 74  ferZero(&doclist
20590 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c  );.          }el
205a0 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
205b0 66 74 73 35 4d 65 72 67 65 50 72 65 66 69 78 4c  fts5MergePrefixL
205c0 69 73 74 73 28 70 2c 20 26 64 6f 63 6c 69 73 74  ists(p, &doclist
205d0 2c 20 26 61 42 75 66 5b 69 5d 29 3b 0a 20 20 20  , &aBuf[i]);.   
205e0 20 20 20 20 20 20 20 20 20 66 74 73 35 42 75 66           fts5Buf
205f0 66 65 72 5a 65 72 6f 28 26 61 42 75 66 5b 69 5d  ferZero(&aBuf[i]
20600 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
20610 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
20620 0a 0a 20 20 20 20 20 20 66 74 73 35 4d 65 72 67  ..      fts5Merg
20630 65 41 70 70 65 6e 64 44 6f 63 69 64 28 26 70 2d  eAppendDocid(&p-
20640 3e 72 63 2c 20 26 64 6f 63 6c 69 73 74 2c 20 26  >rc, &doclist, &
20650 69 4c 61 73 74 52 6f 77 69 64 2c 20 69 52 6f 77  iLastRowid, iRow
20660 69 64 29 3b 0a 20 20 20 20 20 20 66 74 73 35 4d  id);.      fts5M
20670 75 6c 74 69 49 74 65 72 50 6f 73 6c 69 73 74 28  ultiIterPoslist(
20680 70 2c 20 70 31 2c 20 31 2c 20 26 64 6f 63 6c 69  p, p1, 1, &docli
20690 73 74 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  st);.    }..    
206a0 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 42 75 66 3b  for(i=0; i<nBuf;
206b0 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 66 74 73   i++){.      fts
206c0 35 4d 65 72 67 65 50 72 65 66 69 78 4c 69 73 74  5MergePrefixList
206d0 73 28 70 2c 20 26 64 6f 63 6c 69 73 74 2c 20 26  s(p, &doclist, &
206e0 61 42 75 66 5b 69 5d 29 3b 0a 20 20 20 20 20 20  aBuf[i]);.      
206f0 66 74 73 35 42 75 66 66 65 72 46 72 65 65 28 26  fts5BufferFree(&
20700 61 42 75 66 5b 69 5d 29 3b 0a 20 20 20 20 7d 0a  aBuf[i]);.    }.
20710 20 20 20 20 66 74 73 35 4d 75 6c 74 69 49 74 65      fts5MultiIte
20720 72 46 72 65 65 28 70 2c 20 70 31 29 3b 0a 0a 20  rFree(p, p1);.. 
20730 20 20 20 70 44 61 74 61 20 3d 20 66 74 73 35 49     pData = fts5I
20740 64 78 4d 61 6c 6c 6f 63 28 70 2c 20 73 69 7a 65  dxMalloc(p, size
20750 6f 66 28 46 74 73 35 44 61 74 61 29 20 2b 20 64  of(Fts5Data) + d
20760 6f 63 6c 69 73 74 2e 6e 29 3b 0a 20 20 20 20 69  oclist.n);.    i
20770 66 28 20 70 44 61 74 61 20 29 7b 0a 20 20 20 20  f( pData ){.    
20780 20 20 70 44 61 74 61 2d 3e 70 20 3d 20 28 75 38    pData->p = (u8
20790 2a 29 26 70 44 61 74 61 5b 31 5d 3b 0a 20 20 20  *)&pData[1];.   
207a0 20 20 20 70 44 61 74 61 2d 3e 6e 20 3d 20 64 6f     pData->n = do
207b0 63 6c 69 73 74 2e 6e 3b 0a 20 20 20 20 20 20 6d  clist.n;.      m
207c0 65 6d 63 70 79 28 70 44 61 74 61 2d 3e 70 2c 20  emcpy(pData->p, 
207d0 64 6f 63 6c 69 73 74 2e 70 2c 20 64 6f 63 6c 69  doclist.p, docli
207e0 73 74 2e 6e 29 3b 0a 20 20 20 20 20 20 66 74 73  st.n);.      fts
207f0 35 4d 75 6c 74 69 49 74 65 72 4e 65 77 32 28 70  5MultiIterNew2(p
20800 2c 20 70 44 61 74 61 2c 20 62 44 65 73 63 2c 20  , pData, bDesc, 
20810 26 70 49 74 65 72 2d 3e 70 4d 75 6c 74 69 29 3b  &pIter->pMulti);
20820 0a 20 20 20 20 7d 0a 20 20 20 20 66 74 73 35 42  .    }.    fts5B
20830 75 66 66 65 72 46 72 65 65 28 26 64 6f 63 6c 69  ufferFree(&docli
20840 73 74 29 3b 0a 20 20 7d 0a 0a 20 20 66 74 73 35  st);.  }..  fts5
20850 53 74 72 75 63 74 75 72 65 52 65 6c 65 61 73 65  StructureRelease
20860 28 70 53 74 72 75 63 74 29 3b 0a 20 20 73 71 6c  (pStruct);.  sql
20870 69 74 65 33 5f 66 72 65 65 28 61 42 75 66 29 3b  ite3_free(aBuf);
20880 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 49 6e 64 69 63  .}.../*.** Indic
20890 61 74 65 20 74 68 61 74 20 61 6c 6c 20 73 75 62  ate that all sub
208a0 73 65 71 75 65 6e 74 20 63 61 6c 6c 73 20 74 6f  sequent calls to
208b0 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65   sqlite3Fts5Inde
208c0 78 57 72 69 74 65 28 29 20 70 65 72 74 61 69 6e  xWrite() pertain
208d0 0a 2a 2a 20 74 6f 20 74 68 65 20 64 6f 63 75 6d  .** to the docum
208e0 65 6e 74 20 77 69 74 68 20 72 6f 77 69 64 20 69  ent with rowid i
208f0 52 6f 77 69 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  Rowid..*/.int sq
20900 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78 42 65  lite3Fts5IndexBe
20910 67 69 6e 57 72 69 74 65 28 46 74 73 35 49 6e 64  ginWrite(Fts5Ind
20920 65 78 20 2a 70 2c 20 69 36 34 20 69 52 6f 77 69  ex *p, i64 iRowi
20930 64 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 2d  d){.  assert( p-
20940 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  >rc==SQLITE_OK )
20950 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65  ;..  /* Allocate
20960 20 74 68 65 20 68 61 73 68 20 74 61 62 6c 65 20   the hash table 
20970 69 66 20 69 74 20 68 61 73 20 6e 6f 74 20 61 6c  if it has not al
20980 72 65 61 64 79 20 62 65 65 6e 20 61 6c 6c 6f 63  ready been alloc
20990 61 74 65 64 20 2a 2f 0a 20 20 69 66 28 20 70 2d  ated */.  if( p-
209a0 3e 70 48 61 73 68 3d 3d 30 20 29 7b 0a 20 20 20  >pHash==0 ){.   
209b0 20 70 2d 3e 72 63 20 3d 20 73 71 6c 69 74 65 33   p->rc = sqlite3
209c0 46 74 73 35 48 61 73 68 4e 65 77 28 26 70 2d 3e  Fts5HashNew(&p->
209d0 70 48 61 73 68 2c 20 26 70 2d 3e 6e 50 65 6e 64  pHash, &p->nPend
209e0 69 6e 67 44 61 74 61 29 3b 0a 20 20 7d 0a 0a 20  ingData);.  }.. 
209f0 20 2f 2a 20 46 6c 75 73 68 20 74 68 65 20 68 61   /* Flush the ha
20a00 73 68 20 74 61 62 6c 65 20 74 6f 20 64 69 73 6b  sh table to disk
20a10 20 69 66 20 72 65 71 75 69 72 65 64 20 2a 2f 0a   if required */.
20a20 20 20 69 66 28 20 69 52 6f 77 69 64 3c 3d 70 2d    if( iRowid<=p-
20a30 3e 69 57 72 69 74 65 52 6f 77 69 64 20 7c 7c 20  >iWriteRowid || 
20a40 28 70 2d 3e 6e 50 65 6e 64 69 6e 67 44 61 74 61  (p->nPendingData
20a50 20 3e 20 70 2d 3e 6e 4d 61 78 50 65 6e 64 69 6e   > p->nMaxPendin
20a60 67 44 61 74 61 29 20 29 7b 0a 20 20 20 20 66 74  gData) ){.    ft
20a70 73 35 49 6e 64 65 78 46 6c 75 73 68 28 70 29 3b  s5IndexFlush(p);
20a80 0a 20 20 7d 0a 20 20 70 2d 3e 69 57 72 69 74 65  .  }.  p->iWrite
20a90 52 6f 77 69 64 20 3d 20 69 52 6f 77 69 64 3b 0a  Rowid = iRowid;.
20aa0 20 20 72 65 74 75 72 6e 20 66 74 73 35 49 6e 64    return fts5Ind
20ab0 65 78 52 65 74 75 72 6e 28 70 29 3b 0a 7d 0a 0a  exReturn(p);.}..
20ac0 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69 74 20 64 61 74  /*.** Commit dat
20ad0 61 20 74 6f 20 64 69 73 6b 2e 0a 2a 2f 0a 69 6e  a to disk..*/.in
20ae0 74 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64  t sqlite3Fts5Ind
20af0 65 78 53 79 6e 63 28 46 74 73 35 49 6e 64 65 78  exSync(Fts5Index
20b00 20 2a 70 2c 20 69 6e 74 20 62 43 6f 6d 6d 69 74   *p, int bCommit
20b10 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  ){.  assert( p->
20b20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  rc==SQLITE_OK );
20b30 0a 20 20 66 74 73 35 49 6e 64 65 78 46 6c 75 73  .  fts5IndexFlus
20b40 68 28 70 29 3b 0a 20 20 69 66 28 20 62 43 6f 6d  h(p);.  if( bCom
20b50 6d 69 74 20 29 20 66 74 73 35 43 6c 6f 73 65 52  mit ) fts5CloseR
20b60 65 61 64 65 72 28 70 29 3b 0a 20 20 72 65 74 75  eader(p);.  retu
20b70 72 6e 20 66 74 73 35 49 6e 64 65 78 52 65 74 75  rn fts5IndexRetu
20b80 72 6e 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn(p);.}../*.** 
20b90 44 69 73 63 61 72 64 20 61 6e 79 20 64 61 74 61  Discard any data
20ba0 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 69   stored in the i
20bb0 6e 2d 6d 65 6d 6f 72 79 20 68 61 73 68 20 74 61  n-memory hash ta
20bc0 62 6c 65 73 2e 20 44 6f 20 6e 6f 74 20 77 72 69  bles. Do not wri
20bd0 74 65 20 69 74 0a 2a 2a 20 74 6f 20 74 68 65 20  te it.** to the 
20be0 64 61 74 61 62 61 73 65 2e 20 41 64 64 69 74 69  database. Additi
20bf0 6f 6e 61 6c 6c 79 2c 20 61 73 73 75 6d 65 20 74  onally, assume t
20c00 68 61 74 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  hat the contents
20c10 20 6f 66 20 74 68 65 20 25 5f 64 61 74 61 0a 2a   of the %_data.*
20c20 2a 20 74 61 62 6c 65 20 6d 61 79 20 68 61 76 65  * table may have
20c30 20 63 68 61 6e 67 65 64 20 6f 6e 20 64 69 73 6b   changed on disk
20c40 2e 20 53 6f 20 61 6e 79 20 69 6e 2d 6d 65 6d 6f  . So any in-memo
20c50 72 79 20 63 61 63 68 65 73 20 6f 66 20 25 5f 64  ry caches of %_d
20c60 61 74 61 20 0a 2a 2a 20 72 65 63 6f 72 64 73 20  ata .** records 
20c70 6d 75 73 74 20 62 65 20 69 6e 76 61 6c 69 64 61  must be invalida
20c80 74 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ted..*/.int sqli
20c90 74 65 33 46 74 73 35 49 6e 64 65 78 52 6f 6c 6c  te3Fts5IndexRoll
20ca0 62 61 63 6b 28 46 74 73 35 49 6e 64 65 78 20 2a  back(Fts5Index *
20cb0 70 29 7b 0a 20 20 66 74 73 35 43 6c 6f 73 65 52  p){.  fts5CloseR
20cc0 65 61 64 65 72 28 70 29 3b 0a 20 20 66 74 73 35  eader(p);.  fts5
20cd0 49 6e 64 65 78 44 69 73 63 61 72 64 44 61 74 61  IndexDiscardData
20ce0 28 70 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  (p);.  assert( p
20cf0 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
20d00 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
20d10 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
20d20 54 68 65 20 25 5f 64 61 74 61 20 74 61 62 6c 65  The %_data table
20d30 20 69 73 20 63 6f 6d 70 6c 65 74 65 6c 79 20 65   is completely e
20d40 6d 70 74 79 20 77 68 65 6e 20 74 68 69 73 20 66  mpty when this f
20d50 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
20d60 64 2e 20 54 68 69 73 0a 2a 2a 20 66 75 6e 63 74  d. This.** funct
20d70 69 6f 6e 20 70 6f 70 75 6c 61 74 65 73 20 69 74  ion populates it
20d80 20 77 69 74 68 20 74 68 65 20 69 6e 69 74 69 61   with the initia
20d90 6c 20 73 74 72 75 63 74 75 72 65 20 6f 62 6a 65  l structure obje
20da0 63 74 73 20 66 6f 72 20 65 61 63 68 20 69 6e 64  cts for each ind
20db0 65 78 2c 0a 2a 2a 20 61 6e 64 20 74 68 65 20 69  ex,.** and the i
20dc0 6e 69 74 69 61 6c 20 76 65 72 73 69 6f 6e 20 6f  nitial version o
20dd0 66 20 74 68 65 20 22 61 76 65 72 61 67 65 73 22  f the "averages"
20de0 20 72 65 63 6f 72 64 20 28 61 20 7a 65 72 6f 2d   record (a zero-
20df0 62 79 74 65 20 62 6c 6f 62 29 2e 0a 2a 2f 0a 69  byte blob)..*/.i
20e00 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e  nt sqlite3Fts5In
20e10 64 65 78 52 65 69 6e 69 74 28 46 74 73 35 49 6e  dexReinit(Fts5In
20e20 64 65 78 20 2a 70 29 7b 0a 20 20 46 74 73 35 53  dex *p){.  Fts5S
20e30 74 72 75 63 74 75 72 65 20 73 3b 0a 0a 20 20 61  tructure s;..  a
20e40 73 73 65 72 74 28 20 70 2d 3e 72 63 3d 3d 53 51  ssert( p->rc==SQ
20e50 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 70 2d 3e  LITE_OK );.  p->
20e60 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74 73 35  rc = sqlite3Fts5
20e70 49 6e 64 65 78 53 65 74 41 76 65 72 61 67 65 73  IndexSetAverages
20e80 28 70 2c 20 28 63 6f 6e 73 74 20 75 38 2a 29 22  (p, (const u8*)"
20e90 22 2c 20 30 29 3b 0a 0a 20 20 6d 65 6d 73 65 74  ", 0);..  memset
20ea0 28 26 73 2c 20 30 2c 20 73 69 7a 65 6f 66 28 46  (&s, 0, sizeof(F
20eb0 74 73 35 53 74 72 75 63 74 75 72 65 29 29 3b 0a  ts5Structure));.
20ec0 20 20 66 74 73 35 53 74 72 75 63 74 75 72 65 57    fts5StructureW
20ed0 72 69 74 65 28 70 2c 20 26 73 29 3b 0a 0a 20 20  rite(p, &s);..  
20ee0 72 65 74 75 72 6e 20 66 74 73 35 49 6e 64 65 78  return fts5Index
20ef0 52 65 74 75 72 6e 28 70 29 3b 0a 7d 0a 0a 2f 2a  Return(p);.}../*
20f00 0a 2a 2a 20 4f 70 65 6e 20 61 20 6e 65 77 20 46  .** Open a new F
20f10 74 73 35 49 6e 64 65 78 20 68 61 6e 64 6c 65 2e  ts5Index handle.
20f20 20 49 66 20 74 68 65 20 62 43 72 65 61 74 65 20   If the bCreate 
20f30 61 72 67 75 6d 65 6e 74 20 69 73 20 74 72 75 65  argument is true
20f40 2c 20 63 72 65 61 74 65 0a 2a 2a 20 61 6e 64 20  , create.** and 
20f50 69 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 75  initialize the u
20f60 6e 64 65 72 6c 79 69 6e 67 20 25 5f 64 61 74 61  nderlying %_data
20f70 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66   table..**.** If
20f80 20 73 75 63 63 65 73 73 66 75 6c 2c 20 73 65 74   successful, set
20f90 20 2a 70 70 20 74 6f 20 70 6f 69 6e 74 20 74 6f   *pp to point to
20fa0 20 74 68 65 20 6e 65 77 20 6f 62 6a 65 63 74 20   the new object 
20fb0 61 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54  and return SQLIT
20fc0 45 5f 4f 4b 2e 0a 2a 2a 20 4f 74 68 65 72 77 69  E_OK..** Otherwi
20fd0 73 65 2c 20 73 65 74 20 2a 70 70 20 74 6f 20 4e  se, set *pp to N
20fe0 55 4c 4c 20 61 6e 64 20 72 65 74 75 72 6e 20 61  ULL and return a
20ff0 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63  n SQLite error c
21000 6f 64 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ode..*/.int sqli
21010 74 65 33 46 74 73 35 49 6e 64 65 78 4f 70 65 6e  te3Fts5IndexOpen
21020 28 0a 20 20 46 74 73 35 43 6f 6e 66 69 67 20 2a  (.  Fts5Config *
21030 70 43 6f 6e 66 69 67 2c 20 0a 20 20 69 6e 74 20  pConfig, .  int 
21040 62 43 72 65 61 74 65 2c 20 0a 20 20 46 74 73 35  bCreate, .  Fts5
21050 49 6e 64 65 78 20 2a 2a 70 70 2c 0a 20 20 63 68  Index **pp,.  ch
21060 61 72 20 2a 2a 70 7a 45 72 72 0a 29 7b 0a 20 20  ar **pzErr.){.  
21070 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
21080 4f 4b 3b 0a 20 20 46 74 73 35 49 6e 64 65 78 20  OK;.  Fts5Index 
21090 2a 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  *p;             
210a0 20 20 20 20 20 20 2f 2a 20 4e 65 77 20 6f 62 6a        /* New obj
210b0 65 63 74 20 2a 2f 0a 0a 20 20 2a 70 70 20 3d 20  ect */..  *pp = 
210c0 70 20 3d 20 28 46 74 73 35 49 6e 64 65 78 2a 29  p = (Fts5Index*)
210d0 73 71 6c 69 74 65 33 46 74 73 35 4d 61 6c 6c 6f  sqlite3Fts5Mallo
210e0 63 5a 65 72 6f 28 26 72 63 2c 20 73 69 7a 65 6f  cZero(&rc, sizeo
210f0 66 28 46 74 73 35 49 6e 64 65 78 29 29 3b 0a 20  f(Fts5Index));. 
21100 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
21110 4f 4b 20 29 7b 0a 20 20 20 20 70 2d 3e 70 43 6f  OK ){.    p->pCo
21120 6e 66 69 67 20 3d 20 70 43 6f 6e 66 69 67 3b 0a  nfig = pConfig;.
21130 20 20 20 20 70 2d 3e 6e 57 6f 72 6b 55 6e 69 74      p->nWorkUnit
21140 20 3d 20 46 54 53 35 5f 57 4f 52 4b 5f 55 4e 49   = FTS5_WORK_UNI
21150 54 3b 0a 20 20 20 20 70 2d 3e 6e 4d 61 78 50 65  T;.    p->nMaxPe
21160 6e 64 69 6e 67 44 61 74 61 20 3d 20 31 30 32 34  ndingData = 1024
21170 2a 31 30 32 34 3b 0a 20 20 20 20 70 2d 3e 7a 44  *1024;.    p->zD
21180 61 74 61 54 62 6c 20 3d 20 73 71 6c 69 74 65 33  ataTbl = sqlite3
21190 46 74 73 35 4d 70 72 69 6e 74 66 28 26 72 63 2c  Fts5Mprintf(&rc,
211a0 20 22 25 73 5f 64 61 74 61 22 2c 20 70 43 6f 6e   "%s_data", pCon
211b0 66 69 67 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  fig->zName);.   
211c0 20 69 66 28 20 70 2d 3e 7a 44 61 74 61 54 62 6c   if( p->zDataTbl
211d0 20 26 26 20 62 43 72 65 61 74 65 20 29 7b 0a 20   && bCreate ){. 
211e0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
211f0 33 46 74 73 35 43 72 65 61 74 65 54 61 62 6c 65  3Fts5CreateTable
21200 28 0a 20 20 20 20 20 20 20 20 20 20 70 43 6f 6e  (.          pCon
21210 66 69 67 2c 20 22 64 61 74 61 22 2c 20 22 69 64  fig, "data", "id
21220 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59   INTEGER PRIMARY
21230 20 4b 45 59 2c 20 62 6c 6f 63 6b 20 42 4c 4f 42   KEY, block BLOB
21240 22 2c 20 30 2c 20 70 7a 45 72 72 0a 20 20 20 20  ", 0, pzErr.    
21250 20 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72    );.      if( r
21260 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
21270 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
21280 69 74 65 33 46 74 73 35 49 6e 64 65 78 52 65 69  ite3Fts5IndexRei
21290 6e 69 74 28 70 29 3b 0a 20 20 20 20 20 20 7d 0a  nit(p);.      }.
212a0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 61 73 73      }.  }..  ass
212b0 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f  ert( rc!=SQLITE_
212c0 4f 4b 20 7c 7c 20 70 2d 3e 72 63 3d 3d 53 51 4c  OK || p->rc==SQL
212d0 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 69 66 28 20  ITE_OK );.  if( 
212e0 72 63 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  rc ){.    sqlite
212f0 33 46 74 73 35 49 6e 64 65 78 43 6c 6f 73 65 28  3Fts5IndexClose(
21300 70 29 3b 0a 20 20 20 20 2a 70 70 20 3d 20 30 3b  p);.    *pp = 0;
21310 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
21320 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65  ;.}../*.** Close
21330 20 61 20 68 61 6e 64 6c 65 20 6f 70 65 6e 65 64   a handle opened
21340 20 62 79 20 61 6e 20 65 61 72 6c 69 65 72 20 63   by an earlier c
21350 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 46 74  all to sqlite3Ft
21360 73 35 49 6e 64 65 78 4f 70 65 6e 28 29 2e 0a 2a  s5IndexOpen()..*
21370 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73  /.int sqlite3Fts
21380 35 49 6e 64 65 78 43 6c 6f 73 65 28 46 74 73 35  5IndexClose(Fts5
21390 49 6e 64 65 78 20 2a 70 29 7b 0a 20 20 69 6e 74  Index *p){.  int
213a0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
213b0 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20  .  if( p ){.    
213c0 61 73 73 65 72 74 28 20 70 2d 3e 70 52 65 61 64  assert( p->pRead
213d0 65 72 3d 3d 30 20 29 3b 0a 20 20 20 20 73 71 6c  er==0 );.    sql
213e0 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 2d  ite3_finalize(p-
213f0 3e 70 57 72 69 74 65 72 29 3b 0a 20 20 20 20 73  >pWriter);.    s
21400 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28  qlite3_finalize(
21410 70 2d 3e 70 44 65 6c 65 74 65 72 29 3b 0a 20 20  p->pDeleter);.  
21420 20 20 73 71 6c 69 74 65 33 46 74 73 35 48 61 73    sqlite3Fts5Has
21430 68 46 72 65 65 28 70 2d 3e 70 48 61 73 68 29 3b  hFree(p->pHash);
21440 0a 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35  .    sqlite3Fts5
21450 42 75 66 66 65 72 46 72 65 65 28 26 70 2d 3e 73  BufferFree(&p->s
21460 63 72 61 74 63 68 29 3b 0a 20 20 20 20 73 71 6c  cratch);.    sql
21470 69 74 65 33 5f 66 72 65 65 28 70 2d 3e 7a 44 61  ite3_free(p->zDa
21480 74 61 54 62 6c 29 3b 0a 20 20 20 20 73 71 6c 69  taTbl);.    sqli
21490 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 7d  te3_free(p);.  }
214a0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
214b0 0a 2f 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20  ./*.** Argument 
214c0 70 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 62 75  p points to a bu
214d0 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20  ffer containing 
214e0 75 74 66 2d 38 20 74 65 78 74 20 74 68 61 74 20  utf-8 text that 
214f0 69 73 20 6e 20 62 79 74 65 73 20 69 6e 20 0a 2a  is n bytes in .*
21500 2a 20 73 69 7a 65 2e 20 52 65 74 75 72 6e 20 74  * size. Return t
21510 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74  he number of byt
21520 65 73 20 69 6e 20 74 68 65 20 6e 43 68 61 72 20  es in the nChar 
21530 63 68 61 72 61 63 74 65 72 20 70 72 65 66 69 78  character prefix
21540 20 6f 66 20 74 68 65 0a 2a 2a 20 62 75 66 66 65   of the.** buffe
21550 72 2c 20 6f 72 20 30 20 69 66 20 74 68 65 72 65  r, or 0 if there
21560 20 61 72 65 20 6c 65 73 73 20 74 68 61 6e 20 6e   are less than n
21570 43 68 61 72 20 63 68 61 72 61 63 74 65 72 73 20  Char characters 
21580 69 6e 20 74 6f 74 61 6c 2e 0a 2a 2f 0a 73 74 61  in total..*/.sta
21590 74 69 63 20 69 6e 74 20 66 74 73 35 49 6e 64 65  tic int fts5Inde
215a0 78 43 68 61 72 6c 65 6e 54 6f 42 79 74 65 6c 65  xCharlenToBytele
215b0 6e 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 70 2c  n(const char *p,
215c0 20 69 6e 74 20 6e 42 79 74 65 2c 20 69 6e 74 20   int nByte, int 
215d0 6e 43 68 61 72 29 7b 0a 20 20 69 6e 74 20 6e 20  nChar){.  int n 
215e0 3d 20 30 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  = 0;.  int i;.  
215f0 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 68 61 72  for(i=0; i<nChar
21600 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  ; i++){.    if( 
21610 6e 3e 3d 6e 42 79 74 65 20 29 20 72 65 74 75 72  n>=nByte ) retur
21620 6e 20 30 3b 20 20 20 20 20 20 2f 2a 20 49 6e 70  n 0;      /* Inp
21630 75 74 20 63 6f 6e 74 61 69 6e 73 20 66 65 77 65  ut contains fewe
21640 72 20 74 68 61 6e 20 6e 43 68 61 72 20 63 68 61  r than nChar cha
21650 72 73 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 75  rs */.    if( (u
21660 6e 73 69 67 6e 65 64 20 63 68 61 72 29 70 5b 6e  nsigned char)p[n
21670 2b 2b 5d 3e 3d 30 78 63 30 20 29 7b 0a 20 20 20  ++]>=0xc0 ){.   
21680 20 20 20 77 68 69 6c 65 28 20 28 70 5b 6e 5d 20     while( (p[n] 
21690 26 20 30 78 63 30 29 3d 3d 30 78 38 30 20 29 20  & 0xc0)==0x80 ) 
216a0 6e 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  n++;.    }.  }. 
216b0 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a   return n;.}../*
216c0 0a 2a 2a 20 70 49 6e 20 69 73 20 61 20 55 54 46  .** pIn is a UTF
216d0 2d 38 20 65 6e 63 6f 64 65 64 20 73 74 72 69 6e  -8 encoded strin
216e0 67 2c 20 6e 49 6e 20 62 79 74 65 73 20 69 6e 20  g, nIn bytes in 
216f0 73 69 7a 65 2e 20 52 65 74 75 72 6e 20 74 68 65  size. Return the
21700 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 75 6e   number of.** un
21710 69 63 6f 64 65 20 63 68 61 72 61 63 74 65 72 73  icode characters
21720 20 69 6e 20 74 68 65 20 73 74 72 69 6e 67 2e 0a   in the string..
21730 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74  */.static int ft
21740 73 35 49 6e 64 65 78 43 68 61 72 6c 65 6e 28 63  s5IndexCharlen(c
21750 6f 6e 73 74 20 63 68 61 72 20 2a 70 49 6e 2c 20  onst char *pIn, 
21760 69 6e 74 20 6e 49 6e 29 7b 0a 20 20 69 6e 74 20  int nIn){.  int 
21770 6e 43 68 61 72 20 3d 20 30 3b 20 20 20 20 20 20  nChar = 0;      
21780 20 20 20 20 20 20 0a 20 20 69 6e 74 20 69 20 3d        .  int i =
21790 20 30 3b 0a 20 20 77 68 69 6c 65 28 20 69 3c 6e   0;.  while( i<n
217a0 49 6e 20 29 7b 0a 20 20 20 20 69 66 28 20 28 75  In ){.    if( (u
217b0 6e 73 69 67 6e 65 64 20 63 68 61 72 29 70 49 6e  nsigned char)pIn
217c0 5b 69 2b 2b 5d 3e 3d 30 78 63 30 20 29 7b 0a 20  [i++]>=0xc0 ){. 
217d0 20 20 20 20 20 77 68 69 6c 65 28 20 69 3c 6e 49       while( i<nI
217e0 6e 20 26 26 20 28 70 49 6e 5b 69 5d 20 26 20 30  n && (pIn[i] & 0
217f0 78 63 30 29 3d 3d 30 78 38 30 20 29 20 69 2b 2b  xc0)==0x80 ) i++
21800 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 43 68 61  ;.    }.    nCha
21810 72 2b 2b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  r++;.  }.  retur
21820 6e 20 6e 43 68 61 72 3b 0a 7d 0a 0a 2f 2a 0a 2a  n nChar;.}../*.*
21830 2a 20 49 6e 73 65 72 74 20 6f 72 20 72 65 6d 6f  * Insert or remo
21840 76 65 20 64 61 74 61 20 74 6f 20 6f 72 20 66 72  ve data to or fr
21850 6f 6d 20 74 68 65 20 69 6e 64 65 78 2e 20 45 61  om the index. Ea
21860 63 68 20 74 69 6d 65 20 61 20 64 6f 63 75 6d 65  ch time a docume
21870 6e 74 20 69 73 20 0a 2a 2a 20 61 64 64 65 64 20  nt is .** added 
21880 74 6f 20 6f 72 20 72 65 6d 6f 76 65 64 20 66 72  to or removed fr
21890 6f 6d 20 74 68 65 20 69 6e 64 65 78 2c 20 74 68  om the index, th
218a0 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
218b0 61 6c 6c 65 64 20 6f 6e 65 20 6f 72 20 6d 6f 72  alled one or mor
218c0 65 0a 2a 2a 20 74 69 6d 65 73 2e 0a 2a 2a 0a 2a  e.** times..**.*
218d0 2a 20 46 6f 72 20 61 6e 20 69 6e 73 65 72 74 2c  * For an insert,
218e0 20 69 74 20 6d 75 73 74 20 62 65 20 63 61 6c 6c   it must be call
218f0 65 64 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68  ed once for each
21900 20 74 6f 6b 65 6e 20 69 6e 20 74 68 65 20 6e 65   token in the ne
21910 77 20 64 6f 63 75 6d 65 6e 74 2e 0a 2a 2a 20 49  w document..** I
21920 66 20 74 68 65 20 6f 70 65 72 61 74 69 6f 6e 20  f the operation 
21930 69 73 20 61 20 64 65 6c 65 74 65 2c 20 69 74 20  is a delete, it 
21940 6d 75 73 74 20 62 65 20 63 61 6c 6c 65 64 20 28  must be called (
21950 61 74 20 6c 65 61 73 74 29 20 6f 6e 63 65 20 66  at least) once f
21960 6f 72 20 65 61 63 68 0a 2a 2a 20 75 6e 69 71 75  or each.** uniqu
21970 65 20 74 6f 6b 65 6e 20 69 6e 20 74 68 65 20 64  e token in the d
21980 6f 63 75 6d 65 6e 74 20 77 69 74 68 20 61 6e 20  ocument with an 
21990 69 43 6f 6c 20 76 61 6c 75 65 20 6c 65 73 73 20  iCol value less 
219a0 74 68 61 6e 20 7a 65 72 6f 2e 20 54 68 65 20 69  than zero. The i
219b0 50 6f 73 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 20  Pos.** argument 
219c0 69 73 20 69 67 6e 6f 72 65 64 20 66 6f 72 20 61  is ignored for a
219d0 20 64 65 6c 65 74 65 2e 0a 2a 2f 0a 69 6e 74 20   delete..*/.int 
219e0 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78  sqlite3Fts5Index
219f0 57 72 69 74 65 28 0a 20 20 46 74 73 35 49 6e 64  Write(.  Fts5Ind
21a00 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  ex *p,          
21a10 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
21a20 78 20 74 6f 20 77 72 69 74 65 20 74 6f 20 2a 2f  x to write to */
21a30 0a 20 20 69 6e 74 20 69 43 6f 6c 2c 20 20 20 20  .  int iCol,    
21a40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21a50 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 74 6f 6b     /* Column tok
21a60 65 6e 20 61 70 70 65 61 72 73 20 69 6e 20 28 2d  en appears in (-
21a70 76 65 20 2d 3e 20 64 65 6c 65 74 65 29 20 2a 2f  ve -> delete) */
21a80 0a 20 20 69 6e 74 20 69 50 6f 73 2c 20 20 20 20  .  int iPos,    
21a90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21aa0 20 20 20 2f 2a 20 50 6f 73 69 74 69 6f 6e 20 6f     /* Position o
21ab0 66 20 74 6f 6b 65 6e 20 77 69 74 68 69 6e 20 63  f token within c
21ac0 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 63 6f 6e 73 74  olumn */.  const
21ad0 20 63 68 61 72 20 2a 70 54 6f 6b 65 6e 2c 20 69   char *pToken, i
21ae0 6e 74 20 6e 54 6f 6b 65 6e 20 20 2f 2a 20 54 6f  nt nToken  /* To
21af0 6b 65 6e 20 74 6f 20 61 64 64 20 6f 72 20 72 65  ken to add or re
21b00 6d 6f 76 65 20 74 6f 20 6f 72 20 66 72 6f 6d 20  move to or from 
21b10 69 6e 64 65 78 20 2a 2f 0a 29 7b 0a 20 20 69 6e  index */.){.  in
21b20 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20  t i;            
21b30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
21b40 20 55 73 65 64 20 74 6f 20 69 74 65 72 61 74 65   Used to iterate
21b50 20 74 68 72 6f 75 67 68 20 69 6e 64 65 78 65 73   through indexes
21b60 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53   */.  int rc = S
21b70 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20  QLITE_OK;       
21b80 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
21b90 63 6f 64 65 20 2a 2f 0a 20 20 46 74 73 35 43 6f  code */.  Fts5Co
21ba0 6e 66 69 67 20 2a 70 43 6f 6e 66 69 67 20 3d 20  nfig *pConfig = 
21bb0 70 2d 3e 70 43 6f 6e 66 69 67 3b 0a 0a 20 20 61  p->pConfig;..  a
21bc0 73 73 65 72 74 28 20 70 2d 3e 72 63 3d 3d 53 51  ssert( p->rc==SQ
21bd0 4c 49 54 45 5f 4f 4b 20 29 3b 0a 0a 20 20 2f 2a  LITE_OK );..  /*
21be0 20 41 64 64 20 74 68 65 20 65 6e 74 72 79 20 74   Add the entry t
21bf0 6f 20 74 68 65 20 6d 61 69 6e 20 74 65 72 6d 73  o the main terms
21c00 20 69 6e 64 65 78 2e 20 2a 2f 0a 20 20 72 63 20   index. */.  rc 
21c10 3d 20 73 71 6c 69 74 65 33 46 74 73 35 48 61 73  = sqlite3Fts5Has
21c20 68 57 72 69 74 65 28 0a 20 20 20 20 20 20 70 2d  hWrite(.      p-
21c30 3e 70 48 61 73 68 2c 20 70 2d 3e 69 57 72 69 74  >pHash, p->iWrit
21c40 65 52 6f 77 69 64 2c 20 69 43 6f 6c 2c 20 69 50  eRowid, iCol, iP
21c50 6f 73 2c 20 46 54 53 35 5f 4d 41 49 4e 5f 50 52  os, FTS5_MAIN_PR
21c60 45 46 49 58 2c 20 70 54 6f 6b 65 6e 2c 20 6e 54  EFIX, pToken, nT
21c70 6f 6b 65 6e 0a 20 20 29 3b 0a 0a 20 20 66 6f 72  oken.  );..  for
21c80 28 69 3d 30 3b 20 69 3c 70 43 6f 6e 66 69 67 2d  (i=0; i<pConfig-
21c90 3e 6e 50 72 65 66 69 78 20 26 26 20 72 63 3d 3d  >nPrefix && rc==
21ca0 53 51 4c 49 54 45 5f 4f 4b 3b 20 69 2b 2b 29 7b  SQLITE_OK; i++){
21cb0 0a 20 20 20 20 69 6e 74 20 6e 42 79 74 65 20 3d  .    int nByte =
21cc0 20 66 74 73 35 49 6e 64 65 78 43 68 61 72 6c 65   fts5IndexCharle
21cd0 6e 54 6f 42 79 74 65 6c 65 6e 28 70 54 6f 6b 65  nToBytelen(pToke
21ce0 6e 2c 20 6e 54 6f 6b 65 6e 2c 20 70 43 6f 6e 66  n, nToken, pConf
21cf0 69 67 2d 3e 61 50 72 65 66 69 78 5b 69 5d 29 3b  ig->aPrefix[i]);
21d00 0a 20 20 20 20 69 66 28 20 6e 42 79 74 65 20 29  .    if( nByte )
21d10 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
21d20 69 74 65 33 46 74 73 35 48 61 73 68 57 72 69 74  ite3Fts5HashWrit
21d30 65 28 70 2d 3e 70 48 61 73 68 2c 20 0a 20 20 20  e(p->pHash, .   
21d40 20 20 20 20 20 20 20 70 2d 3e 69 57 72 69 74 65         p->iWrite
21d50 52 6f 77 69 64 2c 20 69 43 6f 6c 2c 20 69 50 6f  Rowid, iCol, iPo
21d60 73 2c 20 46 54 53 35 5f 4d 41 49 4e 5f 50 52 45  s, FTS5_MAIN_PRE
21d70 46 49 58 2b 69 2b 31 2c 20 70 54 6f 6b 65 6e 2c  FIX+i+1, pToken,
21d80 20 6e 42 79 74 65 0a 20 20 20 20 20 20 29 3b 0a   nByte.      );.
21d90 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74      }.  }..  ret
21da0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
21db0 20 4f 70 65 6e 20 61 20 6e 65 77 20 69 74 65 72   Open a new iter
21dc0 61 74 6f 72 20 74 6f 20 69 74 65 72 61 74 65 20  ator to iterate 
21dd0 74 68 6f 75 67 68 20 61 6c 6c 20 64 6f 63 69 64  though all docid
21de0 73 20 74 68 61 74 20 6d 61 74 63 68 20 74 68 65  s that match the
21df0 20 0a 2a 2a 20 73 70 65 63 69 66 69 65 64 20 74   .** specified t
21e00 6f 6b 65 6e 20 6f 72 20 74 6f 6b 65 6e 20 70 72  oken or token pr
21e10 65 66 69 78 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  efix..*/.int sql
21e20 69 74 65 33 46 74 73 35 49 6e 64 65 78 51 75 65  ite3Fts5IndexQue
21e30 72 79 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20  ry(.  Fts5Index 
21e40 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  *p,             
21e50 20 20 20 20 20 20 2f 2a 20 46 54 53 20 69 6e 64        /* FTS ind
21e60 65 78 20 74 6f 20 71 75 65 72 79 20 2a 2f 0a 20  ex to query */. 
21e70 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 70 54 6f   const char *pTo
21e80 6b 65 6e 2c 20 69 6e 74 20 6e 54 6f 6b 65 6e 2c  ken, int nToken,
21e90 20 2f 2a 20 54 6f 6b 65 6e 20 28 6f 72 20 70 72   /* Token (or pr
21ea0 65 66 69 78 29 20 74 6f 20 71 75 65 72 79 20 66  efix) to query f
21eb0 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67  or */.  int flag
21ec0 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s,              
21ed0 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20          /* Mask 
21ee0 6f 66 20 46 54 53 35 49 4e 44 45 58 5f 51 55 45  of FTS5INDEX_QUE
21ef0 52 59 5f 58 20 66 6c 61 67 73 20 2a 2f 0a 20 20  RY_X flags */.  
21f00 46 74 73 35 49 6e 64 65 78 49 74 65 72 20 2a 2a  Fts5IndexIter **
21f10 70 70 49 74 65 72 20 20 20 20 20 20 20 20 20 20  ppIter          
21f20 2f 2a 20 4f 55 54 3a 20 4e 65 77 20 69 74 65 72  /* OUT: New iter
21f30 61 74 6f 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 29  ator object */.)
21f40 7b 0a 20 20 46 74 73 35 43 6f 6e 66 69 67 20 2a  {.  Fts5Config *
21f50 70 43 6f 6e 66 69 67 20 3d 20 70 2d 3e 70 43 6f  pConfig = p->pCo
21f60 6e 66 69 67 3b 0a 20 20 46 74 73 35 49 6e 64 65  nfig;.  Fts5Inde
21f70 78 49 74 65 72 20 2a 70 52 65 74 3b 0a 20 20 69  xIter *pRet;.  i
21f80 6e 74 20 69 49 64 78 20 3d 20 30 3b 0a 20 20 46  nt iIdx = 0;.  F
21f90 74 73 35 42 75 66 66 65 72 20 62 75 66 20 3d 20  ts5Buffer buf = 
21fa0 7b 30 2c 20 30 2c 20 30 7d 3b 0a 0a 20 20 2f 2a  {0, 0, 0};..  /*
21fb0 20 49 66 20 74 68 65 20 51 55 45 52 59 5f 53 43   If the QUERY_SC
21fc0 41 4e 20 66 6c 61 67 20 69 73 20 73 65 74 2c 20  AN flag is set, 
21fd0 61 6c 6c 20 6f 74 68 65 72 20 66 6c 61 67 73 20  all other flags 
21fe0 6d 75 73 74 20 62 65 20 63 6c 65 61 72 2e 20 2a  must be clear. *
21ff0 2f 0a 20 20 61 73 73 65 72 74 28 20 28 66 6c 61  /.  assert( (fla
22000 67 73 20 26 20 46 54 53 35 49 4e 44 45 58 5f 51  gs & FTS5INDEX_Q
22010 55 45 52 59 5f 53 43 41 4e 29 3d 3d 30 0a 20 20  UERY_SCAN)==0.  
22020 20 20 20 20 20 7c 7c 20 28 66 6c 61 67 73 20 26       || (flags &
22030 20 46 54 53 35 49 4e 44 45 58 5f 51 55 45 52 59   FTS5INDEX_QUERY
22040 5f 53 43 41 4e 29 3d 3d 46 54 53 35 49 4e 44 45  _SCAN)==FTS5INDE
22050 58 5f 51 55 45 52 59 5f 53 43 41 4e 0a 20 20 29  X_QUERY_SCAN.  )
22060 3b 0a 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  ;..  if( sqlite3
22070 46 74 73 35 42 75 66 66 65 72 47 72 6f 77 28 26  Fts5BufferGrow(&
22080 70 2d 3e 72 63 2c 20 26 62 75 66 2c 20 6e 54 6f  p->rc, &buf, nTo
22090 6b 65 6e 2b 31 29 3d 3d 30 20 29 7b 0a 20 20 20  ken+1)==0 ){.   
220a0 20 6d 65 6d 63 70 79 28 26 62 75 66 2e 70 5b 31   memcpy(&buf.p[1
220b0 5d 2c 20 70 54 6f 6b 65 6e 2c 20 6e 54 6f 6b 65  ], pToken, nToke
220c0 6e 29 3b 0a 20 20 7d 0a 0a 23 69 66 64 65 66 20  n);.  }..#ifdef 
220d0 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 69  SQLITE_DEBUG.  i
220e0 66 28 20 66 6c 61 67 73 20 26 20 46 54 53 35 49  f( flags & FTS5I
220f0 4e 44 45 58 5f 51 55 45 52 59 5f 54 45 53 54 5f  NDEX_QUERY_TEST_
22100 4e 4f 49 44 58 20 29 7b 0a 20 20 20 20 61 73 73  NOIDX ){.    ass
22110 65 72 74 28 20 66 6c 61 67 73 20 26 20 46 54 53  ert( flags & FTS
22120 35 49 4e 44 45 58 5f 51 55 45 52 59 5f 50 52 45  5INDEX_QUERY_PRE
22130 46 49 58 20 29 3b 0a 20 20 20 20 69 49 64 78 20  FIX );.    iIdx 
22140 3d 20 31 2b 70 43 6f 6e 66 69 67 2d 3e 6e 50 72  = 1+pConfig->nPr
22150 65 66 69 78 3b 0a 20 20 7d 65 6c 73 65 0a 23 65  efix;.  }else.#e
22160 6e 64 69 66 0a 20 20 69 66 28 20 66 6c 61 67 73  ndif.  if( flags
22170 20 26 20 46 54 53 35 49 4e 44 45 58 5f 51 55 45   & FTS5INDEX_QUE
22180 52 59 5f 50 52 45 46 49 58 20 29 7b 0a 20 20 20  RY_PREFIX ){.   
22190 20 69 6e 74 20 6e 43 68 61 72 20 3d 20 66 74 73   int nChar = fts
221a0 35 49 6e 64 65 78 43 68 61 72 6c 65 6e 28 70 54  5IndexCharlen(pT
221b0 6f 6b 65 6e 2c 20 6e 54 6f 6b 65 6e 29 3b 0a 20  oken, nToken);. 
221c0 20 20 20 66 6f 72 28 69 49 64 78 3d 31 3b 20 69     for(iIdx=1; i
221d0 49 64 78 3c 3d 70 43 6f 6e 66 69 67 2d 3e 6e 50  Idx<=pConfig->nP
221e0 72 65 66 69 78 3b 20 69 49 64 78 2b 2b 29 7b 0a  refix; iIdx++){.
221f0 20 20 20 20 20 20 69 66 28 20 70 43 6f 6e 66 69        if( pConfi
22200 67 2d 3e 61 50 72 65 66 69 78 5b 69 49 64 78 2d  g->aPrefix[iIdx-
22210 31 5d 3d 3d 6e 43 68 61 72 20 29 20 62 72 65 61  1]==nChar ) brea
22220 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  k;.    }.  }..  
22230 70 52 65 74 20 3d 20 28 46 74 73 35 49 6e 64 65  pRet = (Fts5Inde
22240 78 49 74 65 72 2a 29 73 71 6c 69 74 65 33 46 74  xIter*)sqlite3Ft
22250 73 35 4d 61 6c 6c 6f 63 5a 65 72 6f 28 26 70 2d  s5MallocZero(&p-
22260 3e 72 63 2c 20 73 69 7a 65 6f 66 28 46 74 73 35  >rc, sizeof(Fts5
22270 49 6e 64 65 78 49 74 65 72 29 29 3b 0a 20 20 69  IndexIter));.  i
22280 66 28 20 70 52 65 74 20 29 7b 0a 20 20 20 20 70  f( pRet ){.    p
22290 52 65 74 2d 3e 70 49 6e 64 65 78 20 3d 20 70 3b  Ret->pIndex = p;
222a0 0a 20 20 20 20 69 66 28 20 69 49 64 78 3c 3d 70  .    if( iIdx<=p
222b0 43 6f 6e 66 69 67 2d 3e 6e 50 72 65 66 69 78 20  Config->nPrefix 
222c0 29 7b 0a 20 20 20 20 20 20 62 75 66 2e 70 5b 30  ){.      buf.p[0
222d0 5d 20 3d 20 46 54 53 35 5f 4d 41 49 4e 5f 50 52  ] = FTS5_MAIN_PR
222e0 45 46 49 58 20 2b 20 69 49 64 78 3b 0a 20 20 20  EFIX + iIdx;.   
222f0 20 20 20 70 52 65 74 2d 3e 70 53 74 72 75 63 74     pRet->pStruct
22300 20 3d 20 66 74 73 35 53 74 72 75 63 74 75 72 65   = fts5Structure
22310 52 65 61 64 28 70 29 3b 0a 20 20 20 20 20 20 69  Read(p);.      i
22320 66 28 20 70 52 65 74 2d 3e 70 53 74 72 75 63 74  f( pRet->pStruct
22330 20 29 7b 0a 20 20 20 20 20 20 20 20 66 74 73 35   ){.        fts5
22340 4d 75 6c 74 69 49 74 65 72 4e 65 77 28 0a 20 20  MultiIterNew(.  
22350 20 20 20 20 20 20 20 20 20 20 70 2c 20 70 52 65            p, pRe
22360 74 2d 3e 70 53 74 72 75 63 74 2c 20 31 2c 20 66  t->pStruct, 1, f
22370 6c 61 67 73 2c 20 62 75 66 2e 70 2c 20 6e 54 6f  lags, buf.p, nTo
22380 6b 65 6e 2b 31 2c 20 2d 31 2c 20 30 2c 20 26 70  ken+1, -1, 0, &p
22390 52 65 74 2d 3e 70 4d 75 6c 74 69 0a 20 20 20 20  Ret->pMulti.    
223a0 20 20 20 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20      );.      }. 
223b0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
223c0 69 6e 74 20 62 44 65 73 63 20 3d 20 28 66 6c 61  int bDesc = (fla
223d0 67 73 20 26 20 46 54 53 35 49 4e 44 45 58 5f 51  gs & FTS5INDEX_Q
223e0 55 45 52 59 5f 44 45 53 43 29 21 3d 30 3b 0a 20  UERY_DESC)!=0;. 
223f0 20 20 20 20 20 62 75 66 2e 70 5b 30 5d 20 3d 20       buf.p[0] = 
22400 46 54 53 35 5f 4d 41 49 4e 5f 50 52 45 46 49 58  FTS5_MAIN_PREFIX
22410 3b 0a 20 20 20 20 20 20 66 74 73 35 53 65 74 75  ;.      fts5Setu
22420 70 50 72 65 66 69 78 49 74 65 72 28 70 2c 20 62  pPrefixIter(p, b
22430 44 65 73 63 2c 20 62 75 66 2e 70 2c 20 6e 54 6f  Desc, buf.p, nTo
22440 6b 65 6e 2b 31 2c 20 70 52 65 74 29 3b 0a 20 20  ken+1, pRet);.  
22450 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70    }.  }..  if( p
22460 2d 3e 72 63 20 29 7b 0a 20 20 20 20 73 71 6c 69  ->rc ){.    sqli
22470 74 65 33 46 74 73 35 49 74 65 72 43 6c 6f 73 65  te3Fts5IterClose
22480 28 70 52 65 74 29 3b 0a 20 20 20 20 70 52 65 74  (pRet);.    pRet
22490 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 2a 70 70 49   = 0;.  }.  *ppI
224a0 74 65 72 20 3d 20 70 52 65 74 3b 0a 20 20 73 71  ter = pRet;.  sq
224b0 6c 69 74 65 33 46 74 73 35 42 75 66 66 65 72 46  lite3Fts5BufferF
224c0 72 65 65 28 26 62 75 66 29 3b 0a 20 20 72 65 74  ree(&buf);.  ret
224d0 75 72 6e 20 66 74 73 35 49 6e 64 65 78 52 65 74  urn fts5IndexRet
224e0 75 72 6e 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn(p);.}../*.**
224f0 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20   Return true if 
22500 74 68 65 20 69 74 65 72 61 74 6f 72 20 70 61 73  the iterator pas
22510 73 65 64 20 61 73 20 74 68 65 20 6f 6e 6c 79 20  sed as the only 
22520 61 72 67 75 6d 65 6e 74 20 69 73 20 61 74 20 45  argument is at E
22530 4f 46 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  OF..*/.int sqlit
22540 65 33 46 74 73 35 49 74 65 72 45 6f 66 28 46 74  e3Fts5IterEof(Ft
22550 73 35 49 6e 64 65 78 49 74 65 72 20 2a 70 49 74  s5IndexIter *pIt
22560 65 72 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70  er){.  assert( p
22570 49 74 65 72 2d 3e 70 49 6e 64 65 78 2d 3e 72 63  Iter->pIndex->rc
22580 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20  ==SQLITE_OK );. 
22590 20 72 65 74 75 72 6e 20 70 49 74 65 72 2d 3e 70   return pIter->p
225a0 4d 75 6c 74 69 2d 3e 62 45 6f 66 3b 0a 7d 0a 0a  Multi->bEof;.}..
225b0 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 6f 20 74 68  /*.** Move to th
225c0 65 20 6e 65 78 74 20 6d 61 74 63 68 69 6e 67 20  e next matching 
225d0 72 6f 77 69 64 2e 20 0a 2a 2f 0a 69 6e 74 20 73  rowid. .*/.int s
225e0 71 6c 69 74 65 33 46 74 73 35 49 74 65 72 4e 65  qlite3Fts5IterNe
225f0 78 74 28 46 74 73 35 49 6e 64 65 78 49 74 65 72  xt(Fts5IndexIter
22600 20 2a 70 49 74 65 72 29 7b 0a 20 20 61 73 73 65   *pIter){.  asse
22610 72 74 28 20 70 49 74 65 72 2d 3e 70 49 6e 64 65  rt( pIter->pInde
22620 78 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  x->rc==SQLITE_OK
22630 20 29 3b 0a 20 20 66 74 73 35 4d 75 6c 74 69 49   );.  fts5MultiI
22640 74 65 72 4e 65 78 74 28 70 49 74 65 72 2d 3e 70  terNext(pIter->p
22650 49 6e 64 65 78 2c 20 70 49 74 65 72 2d 3e 70 4d  Index, pIter->pM
22660 75 6c 74 69 2c 20 30 2c 20 30 29 3b 0a 20 20 72  ulti, 0, 0);.  r
22670 65 74 75 72 6e 20 66 74 73 35 49 6e 64 65 78 52  eturn fts5IndexR
22680 65 74 75 72 6e 28 70 49 74 65 72 2d 3e 70 49 6e  eturn(pIter->pIn
22690 64 65 78 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d  dex);.}../*.** M
226a0 6f 76 65 20 74 6f 20 74 68 65 20 6e 65 78 74 20  ove to the next 
226b0 6d 61 74 63 68 69 6e 67 20 74 65 72 6d 2f 72 6f  matching term/ro
226c0 77 69 64 2e 20 55 73 65 64 20 62 79 20 74 68 65  wid. Used by the
226d0 20 66 74 73 35 76 6f 63 61 62 20 6d 6f 64 75 6c   fts5vocab modul
226e0 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  e..*/.int sqlite
226f0 33 46 74 73 35 49 74 65 72 4e 65 78 74 53 63 61  3Fts5IterNextSca
22700 6e 28 46 74 73 35 49 6e 64 65 78 49 74 65 72 20  n(Fts5IndexIter 
22710 2a 70 49 74 65 72 29 7b 0a 20 20 46 74 73 35 49  *pIter){.  Fts5I
22720 6e 64 65 78 20 2a 70 20 3d 20 70 49 74 65 72 2d  ndex *p = pIter-
22730 3e 70 49 6e 64 65 78 3b 0a 20 20 46 74 73 35 4d  >pIndex;.  Fts5M
22740 75 6c 74 69 53 65 67 49 74 65 72 20 2a 70 4d 75  ultiSegIter *pMu
22750 6c 74 69 20 3d 20 70 49 74 65 72 2d 3e 70 4d 75  lti = pIter->pMu
22760 6c 74 69 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  lti;..  assert( 
22770 70 49 74 65 72 2d 3e 70 49 6e 64 65 78 2d 3e 72  pIter->pIndex->r
22780 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  c==SQLITE_OK );.
22790 20 20 61 73 73 65 72 74 28 20 70 4d 75 6c 74 69    assert( pMulti
227a0 20 29 3b 0a 0a 20 20 66 74 73 35 4d 75 6c 74 69   );..  fts5Multi
227b0 49 74 65 72 4e 65 78 74 28 70 2c 20 70 4d 75 6c  IterNext(p, pMul
227c0 74 69 2c 20 30 2c 20 30 29 3b 0a 20 20 69 66 28  ti, 0, 0);.  if(
227d0 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
227e0 4b 20 29 7b 0a 20 20 20 20 46 74 73 35 53 65 67  K ){.    Fts5Seg
227f0 49 74 65 72 20 2a 70 53 65 67 20 3d 20 26 70 4d  Iter *pSeg = &pM
22800 75 6c 74 69 2d 3e 61 53 65 67 5b 20 70 4d 75 6c  ulti->aSeg[ pMul
22810 74 69 2d 3e 61 46 69 72 73 74 5b 31 5d 2e 69 46  ti->aFirst[1].iF
22820 69 72 73 74 20 5d 3b 0a 20 20 20 20 69 66 28 20  irst ];.    if( 
22830 70 53 65 67 2d 3e 70 4c 65 61 66 20 26 26 20 70  pSeg->pLeaf && p
22840 53 65 67 2d 3e 74 65 72 6d 2e 70 5b 30 5d 21 3d  Seg->term.p[0]!=
22850 46 54 53 35 5f 4d 41 49 4e 5f 50 52 45 46 49 58  FTS5_MAIN_PREFIX
22860 20 29 7b 0a 20 20 20 20 20 20 66 74 73 35 44 61   ){.      fts5Da
22870 74 61 52 65 6c 65 61 73 65 28 70 53 65 67 2d 3e  taRelease(pSeg->
22880 70 4c 65 61 66 29 3b 0a 20 20 20 20 20 20 70 53  pLeaf);.      pS
22890 65 67 2d 3e 70 4c 65 61 66 20 3d 20 30 3b 0a 20  eg->pLeaf = 0;. 
228a0 20 20 20 20 20 70 4d 75 6c 74 69 2d 3e 62 45 6f       pMulti->bEo
228b0 66 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d  f = 1;.    }.  }
228c0 0a 0a 20 20 72 65 74 75 72 6e 20 66 74 73 35 49  ..  return fts5I
228d0 6e 64 65 78 52 65 74 75 72 6e 28 70 49 74 65 72  ndexReturn(pIter
228e0 2d 3e 70 49 6e 64 65 78 29 3b 0a 7d 0a 0a 2f 2a  ->pIndex);.}../*
228f0 0a 2a 2a 20 4d 6f 76 65 20 74 6f 20 74 68 65 20  .** Move to the 
22900 6e 65 78 74 20 6d 61 74 63 68 69 6e 67 20 72 6f  next matching ro
22910 77 69 64 20 74 68 61 74 20 6f 63 63 75 72 73 20  wid that occurs 
22920 61 74 20 6f 72 20 61 66 74 65 72 20 69 4d 61 74  at or after iMat
22930 63 68 2e 20 54 68 65 0a 2a 2a 20 64 65 66 69 6e  ch. The.** defin
22940 69 74 69 6f 6e 20 6f 66 20 22 61 74 20 6f 72 20  ition of "at or 
22950 61 66 74 65 72 22 20 64 65 70 65 6e 64 73 20 6f  after" depends o
22960 6e 20 77 68 65 74 68 65 72 20 74 68 69 73 20 69  n whether this i
22970 74 65 72 61 74 6f 72 20 69 74 65 72 61 74 65 73  terator iterates
22980 0a 2a 2a 20 69 6e 20 61 73 63 65 6e 64 69 6e 67  .** in ascending
22990 20 6f 72 20 64 65 73 63 65 6e 64 69 6e 67 20 72   or descending r
229a0 6f 77 69 64 20 6f 72 64 65 72 2e 0a 2a 2f 0a 69  owid order..*/.i
229b0 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 49 74  nt sqlite3Fts5It
229c0 65 72 4e 65 78 74 46 72 6f 6d 28 46 74 73 35 49  erNextFrom(Fts5I
229d0 6e 64 65 78 49 74 65 72 20 2a 70 49 74 65 72 2c  ndexIter *pIter,
229e0 20 69 36 34 20 69 4d 61 74 63 68 29 7b 0a 20 20   i64 iMatch){.  
229f0 66 74 73 35 4d 75 6c 74 69 49 74 65 72 4e 65 78  fts5MultiIterNex
22a00 74 46 72 6f 6d 28 70 49 74 65 72 2d 3e 70 49 6e  tFrom(pIter->pIn
22a10 64 65 78 2c 20 70 49 74 65 72 2d 3e 70 4d 75 6c  dex, pIter->pMul
22a20 74 69 2c 20 69 4d 61 74 63 68 29 3b 0a 20 20 72  ti, iMatch);.  r
22a30 65 74 75 72 6e 20 66 74 73 35 49 6e 64 65 78 52  eturn fts5IndexR
22a40 65 74 75 72 6e 28 70 49 74 65 72 2d 3e 70 49 6e  eturn(pIter->pIn
22a50 64 65 78 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  dex);.}../*.** R
22a60 65 74 75 72 6e 20 74 68 65 20 63 75 72 72 65 6e  eturn the curren
22a70 74 20 72 6f 77 69 64 2e 0a 2a 2f 0a 69 36 34 20  t rowid..*/.i64 
22a80 73 71 6c 69 74 65 33 46 74 73 35 49 74 65 72 52  sqlite3Fts5IterR
22a90 6f 77 69 64 28 46 74 73 35 49 6e 64 65 78 49 74  owid(Fts5IndexIt
22aa0 65 72 20 2a 70 49 74 65 72 29 7b 0a 20 20 72 65  er *pIter){.  re
22ab0 74 75 72 6e 20 66 74 73 35 4d 75 6c 74 69 49 74  turn fts5MultiIt
22ac0 65 72 52 6f 77 69 64 28 70 49 74 65 72 2d 3e 70  erRowid(pIter->p
22ad0 4d 75 6c 74 69 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  Multi);.}../*.**
22ae0 20 52 65 74 75 72 6e 20 74 68 65 20 63 75 72 72   Return the curr
22af0 65 6e 74 20 74 65 72 6d 2e 0a 2a 2f 0a 63 6f 6e  ent term..*/.con
22b00 73 74 20 63 68 61 72 20 2a 73 71 6c 69 74 65 33  st char *sqlite3
22b10 46 74 73 35 49 74 65 72 54 65 72 6d 28 46 74 73  Fts5IterTerm(Fts
22b20 35 49 6e 64 65 78 49 74 65 72 20 2a 70 49 74 65  5IndexIter *pIte
22b30 72 2c 20 69 6e 74 20 2a 70 6e 29 7b 0a 20 20 69  r, int *pn){.  i
22b40 6e 74 20 6e 3b 0a 20 20 63 6f 6e 73 74 20 63 68  nt n;.  const ch
22b50 61 72 20 2a 7a 20 3d 20 28 63 6f 6e 73 74 20 63  ar *z = (const c
22b60 68 61 72 2a 29 66 74 73 35 4d 75 6c 74 69 49 74  har*)fts5MultiIt
22b70 65 72 54 65 72 6d 28 70 49 74 65 72 2d 3e 70 4d  erTerm(pIter->pM
22b80 75 6c 74 69 2c 20 26 6e 29 3b 0a 20 20 2a 70 6e  ulti, &n);.  *pn
22b90 20 3d 20 6e 2d 31 3b 0a 20 20 72 65 74 75 72 6e   = n-1;.  return
22ba0 20 26 7a 5b 31 5d 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a   &z[1];.}.../*.*
22bb0 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74  * Return a point
22bc0 65 72 20 74 6f 20 61 20 62 75 66 66 65 72 20 63  er to a buffer c
22bd0 6f 6e 74 61 69 6e 69 6e 67 20 61 20 63 6f 70 79  ontaining a copy
22be0 20 6f 66 20 74 68 65 20 70 6f 73 69 74 69 6f 6e   of the position
22bf0 20 6c 69 73 74 20 66 6f 72 0a 2a 2a 20 74 68 65   list for.** the
22c00 20 63 75 72 72 65 6e 74 20 65 6e 74 72 79 2e 20   current entry. 
22c10 4f 75 74 70 75 74 20 76 61 72 69 61 62 6c 65 20  Output variable 
22c20 2a 70 6e 20 69 73 20 73 65 74 20 74 6f 20 74 68  *pn is set to th
22c30 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 62 75  e size of the bu
22c40 66 66 65 72 20 0a 2a 2a 20 69 6e 20 62 79 74 65  ffer .** in byte
22c50 73 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69  s before returni
22c60 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65  ng..**.** The re
22c70 74 75 72 6e 65 64 20 70 6f 73 69 74 69 6f 6e 20  turned position 
22c80 6c 69 73 74 20 64 6f 65 73 20 6e 6f 74 20 69 6e  list does not in
22c90 63 6c 75 64 65 20 74 68 65 20 22 6e 75 6d 62 65  clude the "numbe
22ca0 72 20 6f 66 20 62 79 74 65 73 22 20 76 61 72 69  r of bytes" vari
22cb0 6e 74 0a 2a 2a 20 66 69 65 6c 64 20 74 68 61 74  nt.** field that
22cc0 20 73 74 61 72 74 73 20 74 68 65 20 70 6f 73 69   starts the posi
22cd0 74 69 6f 6e 20 6c 69 73 74 20 6f 6e 20 64 69 73  tion list on dis
22ce0 6b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  k..*/.int sqlite
22cf0 33 46 74 73 35 49 74 65 72 50 6f 73 6c 69 73 74  3Fts5IterPoslist
22d00 28 0a 20 20 46 74 73 35 49 6e 64 65 78 49 74 65  (.  Fts5IndexIte
22d10 72 20 2a 70 49 74 65 72 2c 20 0a 20 20 63 6f 6e  r *pIter, .  con
22d20 73 74 20 75 38 20 2a 2a 70 70 2c 20 20 20 20 20  st u8 **pp,     
22d30 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
22d40 4f 55 54 3a 20 50 6f 69 6e 74 65 72 20 74 6f 20  OUT: Pointer to 
22d50 70 6f 73 69 74 69 6f 6e 2d 6c 69 73 74 20 64 61  position-list da
22d60 74 61 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 2c  ta */.  int *pn,
22d70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22d80 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20          /* OUT: 
22d90 53 69 7a 65 20 6f 66 20 70 6f 73 69 74 69 6f 6e  Size of position
22da0 2d 6c 69 73 74 20 69 6e 20 62 79 74 65 73 20 2a  -list in bytes *
22db0 2f 0a 20 20 69 36 34 20 2a 70 69 52 6f 77 69 64  /.  i64 *piRowid
22dc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22dd0 20 20 20 20 2f 2a 20 4f 55 54 3a 20 43 75 72 72      /* OUT: Curr
22de0 65 6e 74 20 72 6f 77 69 64 20 2a 2f 0a 29 7b 0a  ent rowid */.){.
22df0 20 20 46 74 73 35 4d 75 6c 74 69 53 65 67 49 74    Fts5MultiSegIt
22e00 65 72 20 2a 70 4d 75 6c 74 69 20 3d 20 70 49 74  er *pMulti = pIt
22e10 65 72 2d 3e 70 4d 75 6c 74 69 3b 0a 20 20 46 74  er->pMulti;.  Ft
22e20 73 35 53 65 67 49 74 65 72 20 2a 70 53 65 67 20  s5SegIter *pSeg 
22e30 3d 20 26 70 4d 75 6c 74 69 2d 3e 61 53 65 67 5b  = &pMulti->aSeg[
22e40 20 70 4d 75 6c 74 69 2d 3e 61 46 69 72 73 74 5b   pMulti->aFirst[
22e50 31 5d 2e 69 46 69 72 73 74 20 5d 3b 0a 20 20 61  1].iFirst ];.  a
22e60 73 73 65 72 74 28 20 70 49 74 65 72 2d 3e 70 49  ssert( pIter->pI
22e70 6e 64 65 78 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  ndex->rc==SQLITE
22e80 5f 4f 4b 20 29 3b 0a 20 20 2a 70 69 52 6f 77 69  _OK );.  *piRowi
22e90 64 20 3d 20 70 53 65 67 2d 3e 69 52 6f 77 69 64  d = pSeg->iRowid
22ea0 3b 0a 20 20 2a 70 6e 20 3d 20 70 53 65 67 2d 3e  ;.  *pn = pSeg->
22eb0 6e 50 6f 73 3b 0a 20 20 69 66 28 20 70 53 65 67  nPos;.  if( pSeg
22ec0 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 2b 70 53  ->iLeafOffset+pS
22ed0 65 67 2d 3e 6e 50 6f 73 20 3c 3d 20 70 53 65 67  eg->nPos <= pSeg
22ee0 2d 3e 70 4c 65 61 66 2d 3e 6e 20 29 7b 0a 20 20  ->pLeaf->n ){.  
22ef0 20 20 2a 70 70 20 3d 20 26 70 53 65 67 2d 3e 70    *pp = &pSeg->p
22f00 4c 65 61 66 2d 3e 70 5b 70 53 65 67 2d 3e 69 4c  Leaf->p[pSeg->iL
22f10 65 61 66 4f 66 66 73 65 74 5d 3b 0a 20 20 7d 65  eafOffset];.  }e
22f20 6c 73 65 7b 0a 20 20 20 20 66 74 73 35 42 75 66  lse{.    fts5Buf
22f30 66 65 72 5a 65 72 6f 28 26 70 49 74 65 72 2d 3e  ferZero(&pIter->
22f40 70 6f 73 6c 69 73 74 29 3b 0a 20 20 20 20 66 74  poslist);.    ft
22f50 73 35 53 65 67 69 74 65 72 50 6f 73 6c 69 73 74  s5SegiterPoslist
22f60 28 70 49 74 65 72 2d 3e 70 49 6e 64 65 78 2c 20  (pIter->pIndex, 
22f70 70 53 65 67 2c 20 26 70 49 74 65 72 2d 3e 70 6f  pSeg, &pIter->po
22f80 73 6c 69 73 74 29 3b 0a 20 20 20 20 2a 70 70 20  slist);.    *pp 
22f90 3d 20 70 49 74 65 72 2d 3e 70 6f 73 6c 69 73 74  = pIter->poslist
22fa0 2e 70 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  .p;.  }.  return
22fb0 20 66 74 73 35 49 6e 64 65 78 52 65 74 75 72 6e   fts5IndexReturn
22fc0 28 70 49 74 65 72 2d 3e 70 49 6e 64 65 78 29 3b  (pIter->pIndex);
22fd0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
22fe0 75 6e 63 74 69 6f 6e 20 69 73 20 73 69 6d 69 6c  unction is simil
22ff0 61 72 20 74 6f 20 73 71 6c 69 74 65 33 46 74 73  ar to sqlite3Fts
23000 35 49 74 65 72 50 6f 73 6c 69 73 74 28 29 2c 20  5IterPoslist(), 
23010 65 78 63 65 70 74 20 74 68 61 74 20 69 74 0a 2a  except that it.*
23020 2a 20 63 6f 70 69 65 73 20 74 68 65 20 70 6f 73  * copies the pos
23030 69 74 69 6f 6e 20 6c 69 73 74 20 69 6e 74 6f 20  ition list into 
23040 74 68 65 20 62 75 66 66 65 72 20 73 75 70 70 6c  the buffer suppl
23050 69 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e  ied as the secon
23060 64 20 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 2e 0a  d .** argument..
23070 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74  */.int sqlite3Ft
23080 73 35 49 74 65 72 50 6f 73 6c 69 73 74 42 75 66  s5IterPoslistBuf
23090 66 65 72 28 46 74 73 35 49 6e 64 65 78 49 74 65  fer(Fts5IndexIte
230a0 72 20 2a 70 49 74 65 72 2c 20 46 74 73 35 42 75  r *pIter, Fts5Bu
230b0 66 66 65 72 20 2a 70 42 75 66 29 7b 0a 20 20 46  ffer *pBuf){.  F
230c0 74 73 35 49 6e 64 65 78 20 2a 70 20 3d 20 70 49  ts5Index *p = pI
230d0 74 65 72 2d 3e 70 49 6e 64 65 78 3b 0a 20 20 46  ter->pIndex;.  F
230e0 74 73 35 4d 75 6c 74 69 53 65 67 49 74 65 72 20  ts5MultiSegIter 
230f0 2a 70 4d 75 6c 74 69 20 3d 20 70 49 74 65 72 2d  *pMulti = pIter-
23100 3e 70 4d 75 6c 74 69 3b 0a 0a 20 20 61 73 73 65  >pMulti;..  asse
23110 72 74 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  rt( p->rc==SQLIT
23120 45 5f 4f 4b 20 29 3b 0a 20 20 66 74 73 35 42 75  E_OK );.  fts5Bu
23130 66 66 65 72 5a 65 72 6f 28 70 42 75 66 29 3b 0a  fferZero(pBuf);.
23140 20 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 50    fts5MultiIterP
23150 6f 73 6c 69 73 74 28 70 2c 20 70 4d 75 6c 74 69  oslist(p, pMulti
23160 2c 20 30 2c 20 70 42 75 66 29 3b 0a 20 20 72 65  , 0, pBuf);.  re
23170 74 75 72 6e 20 66 74 73 35 49 6e 64 65 78 52 65  turn fts5IndexRe
23180 74 75 72 6e 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn(p);.}../*.*
23190 2a 20 43 6c 6f 73 65 20 61 6e 20 69 74 65 72 61  * Close an itera
231a0 74 6f 72 20 6f 70 65 6e 65 64 20 62 79 20 61 6e  tor opened by an
231b0 20 65 61 72 6c 69 65 72 20 63 61 6c 6c 20 74 6f   earlier call to
231c0 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65   sqlite3Fts5Inde
231d0 78 51 75 65 72 79 28 29 2e 0a 2a 2f 0a 76 6f 69  xQuery()..*/.voi
231e0 64 20 73 71 6c 69 74 65 33 46 74 73 35 49 74 65  d sqlite3Fts5Ite
231f0 72 43 6c 6f 73 65 28 46 74 73 35 49 6e 64 65 78  rClose(Fts5Index
23200 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a 20 20  Iter *pIter){.  
23210 69 66 28 20 70 49 74 65 72 20 29 7b 0a 20 20 20  if( pIter ){.   
23220 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 46 72   fts5MultiIterFr
23230 65 65 28 70 49 74 65 72 2d 3e 70 49 6e 64 65 78  ee(pIter->pIndex
23240 2c 20 70 49 74 65 72 2d 3e 70 4d 75 6c 74 69 29  , pIter->pMulti)
23250 3b 0a 20 20 20 20 66 74 73 35 53 74 72 75 63 74  ;.    fts5Struct
23260 75 72 65 52 65 6c 65 61 73 65 28 70 49 74 65 72  ureRelease(pIter
23270 2d 3e 70 53 74 72 75 63 74 29 3b 0a 20 20 20 20  ->pStruct);.    
23280 66 74 73 35 42 75 66 66 65 72 46 72 65 65 28 26  fts5BufferFree(&
23290 70 49 74 65 72 2d 3e 70 6f 73 6c 69 73 74 29 3b  pIter->poslist);
232a0 0a 20 20 20 20 66 74 73 35 43 6c 6f 73 65 52 65  .    fts5CloseRe
232b0 61 64 65 72 28 70 49 74 65 72 2d 3e 70 49 6e 64  ader(pIter->pInd
232c0 65 78 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ex);.    sqlite3
232d0 5f 66 72 65 65 28 70 49 74 65 72 29 3b 0a 20 20  _free(pIter);.  
232e0 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20  }.}../*.** Read 
232f0 74 68 65 20 22 61 76 65 72 61 67 65 73 22 20 72  the "averages" r
23300 65 63 6f 72 64 20 69 6e 74 6f 20 74 68 65 20 62  ecord into the b
23310 75 66 66 65 72 20 73 75 70 70 6c 69 65 64 20 61  uffer supplied a
23320 73 20 74 68 65 20 73 65 63 6f 6e 64 20 0a 2a 2a  s the second .**
23330 20 61 72 67 75 6d 65 6e 74 2e 20 52 65 74 75 72   argument. Retur
23340 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 73  n SQLITE_OK if s
23350 75 63 63 65 73 73 66 75 6c 2c 20 6f 72 20 61 6e  uccessful, or an
23360 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f   SQLite error co
23370 64 65 0a 2a 2a 20 69 66 20 61 6e 20 65 72 72 6f  de.** if an erro
23380 72 20 6f 63 63 75 72 73 2e 0a 2a 2f 0a 69 6e 74  r occurs..*/.int
23390 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65   sqlite3Fts5Inde
233a0 78 47 65 74 41 76 65 72 61 67 65 73 28 46 74 73  xGetAverages(Fts
233b0 35 49 6e 64 65 78 20 2a 70 2c 20 46 74 73 35 42  5Index *p, Fts5B
233c0 75 66 66 65 72 20 2a 70 42 75 66 29 7b 0a 20 20  uffer *pBuf){.  
233d0 61 73 73 65 72 74 28 20 70 2d 3e 72 63 3d 3d 53  assert( p->rc==S
233e0 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 66 74  QLITE_OK );.  ft
233f0 73 35 44 61 74 61 52 65 61 64 4f 72 42 75 66 66  s5DataReadOrBuff
23400 65 72 28 70 2c 20 70 42 75 66 2c 20 46 54 53 35  er(p, pBuf, FTS5
23410 5f 41 56 45 52 41 47 45 53 5f 52 4f 57 49 44 29  _AVERAGES_ROWID)
23420 3b 0a 20 20 72 65 74 75 72 6e 20 66 74 73 35 49  ;.  return fts5I
23430 6e 64 65 78 52 65 74 75 72 6e 28 70 29 3b 0a 7d  ndexReturn(p);.}
23440 0a 0a 2f 2a 0a 2a 2a 20 52 65 70 6c 61 63 65 20  ../*.** Replace 
23450 74 68 65 20 63 75 72 72 65 6e 74 20 22 61 76 65  the current "ave
23460 72 61 67 65 73 22 20 72 65 63 6f 72 64 20 77 69  rages" record wi
23470 74 68 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  th the contents 
23480 6f 66 20 74 68 65 20 62 75 66 66 65 72 20 0a 2a  of the buffer .*
23490 2a 20 73 75 70 70 6c 69 65 64 20 61 73 20 74 68  * supplied as th
234a0 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
234b0 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  t..*/.int sqlite
234c0 33 46 74 73 35 49 6e 64 65 78 53 65 74 41 76 65  3Fts5IndexSetAve
234d0 72 61 67 65 73 28 46 74 73 35 49 6e 64 65 78 20  rages(Fts5Index 
234e0 2a 70 2c 20 63 6f 6e 73 74 20 75 38 20 2a 70 44  *p, const u8 *pD
234f0 61 74 61 2c 20 69 6e 74 20 6e 44 61 74 61 29 7b  ata, int nData){
23500 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72 63  .  assert( p->rc
23510 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20  ==SQLITE_OK );. 
23520 20 66 74 73 35 44 61 74 61 57 72 69 74 65 28 70   fts5DataWrite(p
23530 2c 20 46 54 53 35 5f 41 56 45 52 41 47 45 53 5f  , FTS5_AVERAGES_
23540 52 4f 57 49 44 2c 20 70 44 61 74 61 2c 20 6e 44  ROWID, pData, nD
23550 61 74 61 29 3b 0a 20 20 72 65 74 75 72 6e 20 66  ata);.  return f
23560 74 73 35 49 6e 64 65 78 52 65 74 75 72 6e 28 70  ts5IndexReturn(p
23570 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  );.}../*.** Retu
23580 72 6e 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d  rn the total num
23590 62 65 72 20 6f 66 20 62 6c 6f 63 6b 73 20 74 68  ber of blocks th
235a0 69 73 20 6d 6f 64 75 6c 65 20 68 61 73 20 72 65  is module has re
235b0 61 64 20 66 72 6f 6d 20 74 68 65 20 25 5f 64 61  ad from the %_da
235c0 74 61 0a 2a 2a 20 74 61 62 6c 65 20 73 69 6e 63  ta.** table sinc
235d0 65 20 69 74 20 77 61 73 20 63 72 65 61 74 65 64  e it was created
235e0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
235f0 46 74 73 35 49 6e 64 65 78 52 65 61 64 73 28 46  Fts5IndexReads(F
23600 74 73 35 49 6e 64 65 78 20 2a 70 29 7b 0a 20 20  ts5Index *p){.  
23610 72 65 74 75 72 6e 20 70 2d 3e 6e 52 65 61 64 3b  return p->nRead;
23620 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68  .}../*.** Set th
23630 65 20 33 32 2d 62 69 74 20 63 6f 6f 6b 69 65 20  e 32-bit cookie 
23640 76 61 6c 75 65 20 73 74 6f 72 65 64 20 61 74 20  value stored at 
23650 74 68 65 20 73 74 61 72 74 20 6f 66 20 61 6c 6c  the start of all
23660 20 73 74 72 75 63 74 75 72 65 20 0a 2a 2a 20 72   structure .** r
23670 65 63 6f 72 64 73 20 74 6f 20 74 68 65 20 76 61  ecords to the va
23680 6c 75 65 20 70 61 73 73 65 64 20 61 73 20 74 68  lue passed as th
23690 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
236a0 74 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  t..**.** Return 
236b0 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 73 75 63  SQLITE_OK if suc
236c0 63 65 73 73 66 75 6c 2c 20 6f 72 20 61 6e 20 53  cessful, or an S
236d0 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65  QLite error code
236e0 20 69 66 20 61 6e 20 65 72 72 6f 72 0a 2a 2a 20   if an error.** 
236f0 6f 63 63 75 72 73 2e 0a 2a 2f 0a 69 6e 74 20 73  occurs..*/.int s
23700 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78 53  qlite3Fts5IndexS
23710 65 74 43 6f 6f 6b 69 65 28 46 74 73 35 49 6e 64  etCookie(Fts5Ind
23720 65 78 20 2a 70 2c 20 69 6e 74 20 69 4e 65 77 29  ex *p, int iNew)
23730 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  {.  int rc;     
23740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23750 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
23760 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 46 74 73  rn code */.  Fts
23770 35 43 6f 6e 66 69 67 20 2a 70 43 6f 6e 66 69 67  5Config *pConfig
23780 20 3d 20 70 2d 3e 70 43 6f 6e 66 69 67 3b 20 20   = p->pConfig;  
23790 20 20 2f 2a 20 43 6f 6e 66 69 67 75 72 61 74 69    /* Configurati
237a0 6f 6e 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 75  on object */.  u
237b0 38 20 61 43 6f 6f 6b 69 65 5b 34 5d 3b 20 20 20  8 aCookie[4];   
237c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
237d0 20 20 20 20 2f 2a 20 42 69 6e 61 72 79 20 72 65      /* Binary re
237e0 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20  presentation of 
237f0 69 4e 65 77 20 2a 2f 0a 20 20 73 71 6c 69 74 65  iNew */.  sqlite
23800 33 5f 62 6c 6f 62 20 2a 70 42 6c 6f 62 20 3d 20  3_blob *pBlob = 
23810 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 2d  0;..  assert( p-
23820 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  >rc==SQLITE_OK )
23830 3b 0a 20 20 73 71 6c 69 74 65 33 46 74 73 35 50  ;.  sqlite3Fts5P
23840 75 74 33 32 28 61 43 6f 6f 6b 69 65 2c 20 69 4e  ut32(aCookie, iN
23850 65 77 29 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c  ew);..  rc = sql
23860 69 74 65 33 5f 62 6c 6f 62 5f 6f 70 65 6e 28 70  ite3_blob_open(p
23870 43 6f 6e 66 69 67 2d 3e 64 62 2c 20 70 43 6f 6e  Config->db, pCon
23880 66 69 67 2d 3e 7a 44 62 2c 20 70 2d 3e 7a 44 61  fig->zDb, p->zDa
23890 74 61 54 62 6c 2c 20 0a 20 20 20 20 20 20 22 62  taTbl, .      "b
238a0 6c 6f 63 6b 22 2c 20 46 54 53 35 5f 53 54 52 55  lock", FTS5_STRU
238b0 43 54 55 52 45 5f 52 4f 57 49 44 2c 20 31 2c 20  CTURE_ROWID, 1, 
238c0 26 70 42 6c 6f 62 0a 20 20 29 3b 0a 20 20 69 66  &pBlob.  );.  if
238d0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
238e0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62  ){.    sqlite3_b
238f0 6c 6f 62 5f 77 72 69 74 65 28 70 42 6c 6f 62 2c  lob_write(pBlob,
23900 20 61 43 6f 6f 6b 69 65 2c 20 34 2c 20 30 29 3b   aCookie, 4, 0);
23910 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
23920 33 5f 62 6c 6f 62 5f 63 6c 6f 73 65 28 70 42 6c  3_blob_close(pBl
23930 6f 62 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75  ob);.  }..  retu
23940 72 6e 20 72 63 3b 0a 7d 0a 0a 69 6e 74 20 73 71  rn rc;.}..int sq
23950 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78 4c 6f  lite3Fts5IndexLo
23960 61 64 43 6f 6e 66 69 67 28 46 74 73 35 49 6e 64  adConfig(Fts5Ind
23970 65 78 20 2a 70 29 7b 0a 20 20 46 74 73 35 53 74  ex *p){.  Fts5St
23980 72 75 63 74 75 72 65 20 2a 70 53 74 72 75 63 74  ructure *pStruct
23990 3b 0a 20 20 70 53 74 72 75 63 74 20 3d 20 66 74  ;.  pStruct = ft
239a0 73 35 53 74 72 75 63 74 75 72 65 52 65 61 64 28  s5StructureRead(
239b0 70 29 3b 0a 20 20 66 74 73 35 53 74 72 75 63 74  p);.  fts5Struct
239c0 75 72 65 52 65 6c 65 61 73 65 28 70 53 74 72 75  ureRelease(pStru
239d0 63 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 66 74  ct);.  return ft
239e0 73 35 49 6e 64 65 78 52 65 74 75 72 6e 28 70 29  s5IndexReturn(p)
239f0 3b 0a 7d 0a 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a  ;.}.../*********
23a00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
23a10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
23a20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
23a30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
23a40 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .***************
23a50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
23a60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
23a70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
23a80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 42  ***********.** B
23a90 65 6c 6f 77 20 74 68 69 73 20 70 6f 69 6e 74 20  elow this point 
23aa0 69 73 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74  is the implement
23ab0 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 69 6e 74  ation of the int
23ac0 65 67 72 69 74 79 2d 63 68 65 63 6b 20 0a 2a 2a  egrity-check .**
23ad0 20 66 75 6e 63 74 69 6f 6e 61 6c 69 74 79 2e 0a   functionality..
23ae0 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  */../*.** Return
23af0 20 61 20 73 69 6d 70 6c 65 20 63 68 65 63 6b 73   a simple checks
23b00 75 6d 20 76 61 6c 75 65 20 62 61 73 65 64 20 6f  um value based o
23b10 6e 20 74 68 65 20 61 72 67 75 6d 65 6e 74 73 2e  n the arguments.
23b20 0a 2a 2f 0a 73 74 61 74 69 63 20 75 36 34 20 66  .*/.static u64 f
23b30 74 73 35 49 6e 64 65 78 45 6e 74 72 79 43 6b 73  ts5IndexEntryCks
23b40 75 6d 28 0a 20 20 69 36 34 20 69 52 6f 77 69 64  um(.  i64 iRowid
23b50 2c 20 0a 20 20 69 6e 74 20 69 43 6f 6c 2c 20 0a  , .  int iCol, .
23b60 20 20 69 6e 74 20 69 50 6f 73 2c 20 0a 20 20 69    int iPos, .  i
23b70 6e 74 20 69 49 64 78 2c 0a 20 20 63 6f 6e 73 74  nt iIdx,.  const
23b80 20 63 68 61 72 20 2a 70 54 65 72 6d 2c 0a 20 20   char *pTerm,.  
23b90 69 6e 74 20 6e 54 65 72 6d 0a 29 7b 0a 20 20 69  int nTerm.){.  i
23ba0 6e 74 20 69 3b 0a 20 20 75 36 34 20 72 65 74 20  nt i;.  u64 ret 
23bb0 3d 20 69 52 6f 77 69 64 3b 0a 20 20 72 65 74 20  = iRowid;.  ret 
23bc0 2b 3d 20 28 72 65 74 3c 3c 33 29 20 2b 20 69 43  += (ret<<3) + iC
23bd0 6f 6c 3b 0a 20 20 72 65 74 20 2b 3d 20 28 72 65  ol;.  ret += (re
23be0 74 3c 3c 33 29 20 2b 20 69 50 6f 73 3b 0a 20 20  t<<3) + iPos;.  
23bf0 69 66 28 20 69 49 64 78 3e 3d 30 20 29 20 72 65  if( iIdx>=0 ) re
23c00 74 20 2b 3d 20 28 72 65 74 3c 3c 33 29 20 2b 20  t += (ret<<3) + 
23c10 28 46 54 53 35 5f 4d 41 49 4e 5f 50 52 45 46 49  (FTS5_MAIN_PREFI
23c20 58 20 2b 20 69 49 64 78 29 3b 0a 20 20 66 6f 72  X + iIdx);.  for
23c30 28 69 3d 30 3b 20 69 3c 6e 54 65 72 6d 3b 20 69  (i=0; i<nTerm; i
23c40 2b 2b 29 20 72 65 74 20 2b 3d 20 28 72 65 74 3c  ++) ret += (ret<
23c50 3c 33 29 20 2b 20 70 54 65 72 6d 5b 69 5d 3b 0a  <3) + pTerm[i];.
23c60 20 20 72 65 74 75 72 6e 20 72 65 74 3b 0a 7d 0a    return ret;.}.
23c70 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
23c80 35 42 74 72 65 65 49 74 65 72 49 6e 69 74 28 0a  5BtreeIterInit(.
23c90 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20    Fts5Index *p, 
23ca0 0a 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65  .  Fts5Structure
23cb0 53 65 67 6d 65 6e 74 20 2a 70 53 65 67 2c 20 0a  Segment *pSeg, .
23cc0 20 20 46 74 73 35 42 74 72 65 65 49 74 65 72 20    Fts5BtreeIter 
23cd0 2a 70 49 74 65 72 0a 29 7b 0a 20 20 69 6e 74 20  *pIter.){.  int 
23ce0 6e 42 79 74 65 3b 0a 20 20 69 6e 74 20 69 3b 0a  nByte;.  int i;.
23cf0 20 20 6e 42 79 74 65 20 3d 20 73 69 7a 65 6f 66    nByte = sizeof
23d00 28 70 49 74 65 72 2d 3e 61 4c 76 6c 5b 30 5d 29  (pIter->aLvl[0])
23d10 20 2a 20 28 70 53 65 67 2d 3e 6e 48 65 69 67 68   * (pSeg->nHeigh
23d20 74 2d 31 29 3b 0a 20 20 6d 65 6d 73 65 74 28 70  t-1);.  memset(p
23d30 49 74 65 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28  Iter, 0, sizeof(
23d40 2a 70 49 74 65 72 29 29 3b 0a 20 20 69 66 28 20  *pIter));.  if( 
23d50 6e 42 79 74 65 20 29 7b 0a 20 20 20 20 70 49 74  nByte ){.    pIt
23d60 65 72 2d 3e 61 4c 76 6c 20 3d 20 28 46 74 73 35  er->aLvl = (Fts5
23d70 42 74 72 65 65 49 74 65 72 4c 65 76 65 6c 2a 29  BtreeIterLevel*)
23d80 66 74 73 35 49 64 78 4d 61 6c 6c 6f 63 28 70 2c  fts5IdxMalloc(p,
23d90 20 6e 42 79 74 65 29 3b 0a 20 20 7d 0a 20 20 69   nByte);.  }.  i
23da0 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  f( p->rc==SQLITE
23db0 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 49 74 65 72  _OK ){.    pIter
23dc0 2d 3e 6e 4c 76 6c 20 3d 20 70 53 65 67 2d 3e 6e  ->nLvl = pSeg->n
23dd0 48 65 69 67 68 74 2d 31 3b 0a 20 20 20 20 70 49  Height-1;.    pI
23de0 74 65 72 2d 3e 70 20 3d 20 70 3b 0a 20 20 20 20  ter->p = p;.    
23df0 70 49 74 65 72 2d 3e 70 53 65 67 20 3d 20 70 53  pIter->pSeg = pS
23e00 65 67 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d  eg;.  }.  for(i=
23e10 30 3b 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  0; p->rc==SQLITE
23e20 5f 4f 4b 20 26 26 20 69 3c 70 49 74 65 72 2d 3e  _OK && i<pIter->
23e30 6e 4c 76 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nLvl; i++){.    
23e40 69 36 34 20 69 52 6f 77 69 64 20 3d 20 46 54 53  i64 iRowid = FTS
23e50 35 5f 53 45 47 4d 45 4e 54 5f 52 4f 57 49 44 28  5_SEGMENT_ROWID(
23e60 70 53 65 67 2d 3e 69 53 65 67 69 64 2c 20 69 2b  pSeg->iSegid, i+
23e70 31 2c 20 31 29 3b 0a 20 20 20 20 46 74 73 35 44  1, 1);.    Fts5D
23e80 61 74 61 20 2a 70 44 61 74 61 3b 0a 20 20 20 20  ata *pData;.    
23e90 70 49 74 65 72 2d 3e 61 4c 76 6c 5b 69 5d 2e 70  pIter->aLvl[i].p
23ea0 44 61 74 61 20 3d 20 70 44 61 74 61 20 3d 20 66  Data = pData = f
23eb0 74 73 35 44 61 74 61 52 65 61 64 28 70 2c 20 69  ts5DataRead(p, i
23ec0 52 6f 77 69 64 29 3b 0a 20 20 20 20 69 66 28 20  Rowid);.    if( 
23ed0 70 44 61 74 61 20 29 7b 0a 20 20 20 20 20 20 66  pData ){.      f
23ee0 74 73 35 4e 6f 64 65 49 74 65 72 49 6e 69 74 28  ts5NodeIterInit(
23ef0 70 44 61 74 61 2d 3e 70 2c 20 70 44 61 74 61 2d  pData->p, pData-
23f00 3e 6e 2c 20 26 70 49 74 65 72 2d 3e 61 4c 76 6c  >n, &pIter->aLvl
23f10 5b 69 5d 2e 73 29 3b 0a 20 20 20 20 7d 0a 20 20  [i].s);.    }.  
23f20 7d 0a 0a 20 20 69 66 28 20 70 49 74 65 72 2d 3e  }..  if( pIter->
23f30 6e 4c 76 6c 3d 3d 30 20 7c 7c 20 70 2d 3e 72 63  nLvl==0 || p->rc
23f40 20 29 7b 0a 20 20 20 20 70 49 74 65 72 2d 3e 62   ){.    pIter->b
23f50 45 6f 66 20 3d 20 31 3b 0a 20 20 20 20 70 49 74  Eof = 1;.    pIt
23f60 65 72 2d 3e 69 4c 65 61 66 20 3d 20 70 53 65 67  er->iLeaf = pSeg
23f70 2d 3e 70 67 6e 6f 4c 61 73 74 3b 0a 20 20 7d 65  ->pgnoLast;.  }e
23f80 6c 73 65 7b 0a 20 20 20 20 70 49 74 65 72 2d 3e  lse{.    pIter->
23f90 6e 45 6d 70 74 79 20 3d 20 70 49 74 65 72 2d 3e  nEmpty = pIter->
23fa0 61 4c 76 6c 5b 30 5d 2e 73 2e 6e 45 6d 70 74 79  aLvl[0].s.nEmpty
23fb0 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 69 4c 65  ;.    pIter->iLe
23fc0 61 66 20 3d 20 70 49 74 65 72 2d 3e 61 4c 76 6c  af = pIter->aLvl
23fd0 5b 30 5d 2e 73 2e 69 43 68 69 6c 64 3b 0a 20 20  [0].s.iChild;.  
23fe0 20 20 70 49 74 65 72 2d 3e 62 44 6c 69 64 78 20    pIter->bDlidx 
23ff0 3d 20 70 49 74 65 72 2d 3e 61 4c 76 6c 5b 30 5d  = pIter->aLvl[0]
24000 2e 73 2e 62 44 6c 69 64 78 3b 0a 20 20 7d 0a 7d  .s.bDlidx;.  }.}
24010 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  ..static void ft
24020 73 35 42 74 72 65 65 49 74 65 72 4e 65 78 74 28  s5BtreeIterNext(
24030 46 74 73 35 42 74 72 65 65 49 74 65 72 20 2a 70  Fts5BtreeIter *p
24040 49 74 65 72 29 7b 0a 20 20 46 74 73 35 49 6e 64  Iter){.  Fts5Ind
24050 65 78 20 2a 70 20 3d 20 70 49 74 65 72 2d 3e 70  ex *p = pIter->p
24060 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20 61 73  ;.  int i;..  as
24070 73 65 72 74 28 20 70 49 74 65 72 2d 3e 62 45 6f  sert( pIter->bEo
24080 66 3d 3d 30 20 26 26 20 70 49 74 65 72 2d 3e 61  f==0 && pIter->a
24090 4c 76 6c 5b 30 5d 2e 73 2e 61 44 61 74 61 20 29  Lvl[0].s.aData )
240a0 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
240b0 49 74 65 72 2d 3e 6e 4c 76 6c 20 26 26 20 70 2d  Iter->nLvl && p-
240c0 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20  >rc==SQLITE_OK; 
240d0 69 2b 2b 29 7b 0a 20 20 20 20 46 74 73 35 42 74  i++){.    Fts5Bt
240e0 72 65 65 49 74 65 72 4c 65 76 65 6c 20 2a 70 4c  reeIterLevel *pL
240f0 76 6c 20 3d 20 26 70 49 74 65 72 2d 3e 61 4c 76  vl = &pIter->aLv
24100 6c 5b 69 5d 3b 0a 20 20 20 20 66 74 73 35 4e 6f  l[i];.    fts5No
24110 64 65 49 74 65 72 4e 65 78 74 28 26 70 2d 3e 72  deIterNext(&p->r
24120 63 2c 20 26 70 4c 76 6c 2d 3e 73 29 3b 0a 20 20  c, &pLvl->s);.  
24130 20 20 69 66 28 20 70 4c 76 6c 2d 3e 73 2e 61 44    if( pLvl->s.aD
24140 61 74 61 20 29 7b 0a 20 20 20 20 20 20 66 74 73  ata ){.      fts
24150 35 42 75 66 66 65 72 53 65 74 28 26 70 2d 3e 72  5BufferSet(&p->r
24160 63 2c 20 26 70 49 74 65 72 2d 3e 74 65 72 6d 2c  c, &pIter->term,
24170 20 70 4c 76 6c 2d 3e 73 2e 74 65 72 6d 2e 6e 2c   pLvl->s.term.n,
24180 20 70 4c 76 6c 2d 3e 73 2e 74 65 72 6d 2e 70 29   pLvl->s.term.p)
24190 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
241a0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
241b0 66 74 73 35 4e 6f 64 65 49 74 65 72 46 72 65 65  fts5NodeIterFree
241c0 28 26 70 4c 76 6c 2d 3e 73 29 3b 0a 20 20 20 20  (&pLvl->s);.    
241d0 20 20 66 74 73 35 44 61 74 61 52 65 6c 65 61 73    fts5DataReleas
241e0 65 28 70 4c 76 6c 2d 3e 70 44 61 74 61 29 3b 0a  e(pLvl->pData);.
241f0 20 20 20 20 20 20 70 4c 76 6c 2d 3e 70 44 61 74        pLvl->pDat
24200 61 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d  a = 0;.    }.  }
24210 0a 20 20 69 66 28 20 69 3d 3d 70 49 74 65 72 2d  .  if( i==pIter-
24220 3e 6e 4c 76 6c 20 7c 7c 20 70 2d 3e 72 63 20 29  >nLvl || p->rc )
24230 7b 0a 20 20 20 20 70 49 74 65 72 2d 3e 62 45 6f  {.    pIter->bEo
24240 66 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a  f = 1;.  }else{.
24250 20 20 20 20 69 6e 74 20 69 53 65 67 69 64 20 3d      int iSegid =
24260 20 70 49 74 65 72 2d 3e 70 53 65 67 2d 3e 69 53   pIter->pSeg->iS
24270 65 67 69 64 3b 0a 20 20 20 20 66 6f 72 28 69 2d  egid;.    for(i-
24280 2d 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20  -; i>=0; i--){. 
24290 20 20 20 20 20 46 74 73 35 42 74 72 65 65 49 74       Fts5BtreeIt
242a0 65 72 4c 65 76 65 6c 20 2a 70 4c 76 6c 20 3d 20  erLevel *pLvl = 
242b0 26 70 49 74 65 72 2d 3e 61 4c 76 6c 5b 69 5d 3b  &pIter->aLvl[i];
242c0 0a 20 20 20 20 20 20 69 36 34 20 69 52 6f 77 69  .      i64 iRowi
242d0 64 20 3d 20 46 54 53 35 5f 53 45 47 4d 45 4e 54  d = FTS5_SEGMENT
242e0 5f 52 4f 57 49 44 28 69 53 65 67 69 64 2c 20 69  _ROWID(iSegid, i
242f0 2b 31 2c 20 70 4c 76 6c 5b 31 5d 2e 73 2e 69 43  +1, pLvl[1].s.iC
24300 68 69 6c 64 29 3b 0a 20 20 20 20 20 20 70 4c 76  hild);.      pLv
24310 6c 2d 3e 70 44 61 74 61 20 3d 20 66 74 73 35 44  l->pData = fts5D
24320 61 74 61 52 65 61 64 28 70 2c 20 69 52 6f 77 69  ataRead(p, iRowi
24330 64 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4c  d);.      if( pL
24340 76 6c 2d 3e 70 44 61 74 61 20 29 7b 0a 20 20 20  vl->pData ){.   
24350 20 20 20 20 20 66 74 73 35 4e 6f 64 65 49 74 65       fts5NodeIte
24360 72 49 6e 69 74 28 70 4c 76 6c 2d 3e 70 44 61 74  rInit(pLvl->pDat
24370 61 2d 3e 70 2c 20 70 4c 76 6c 2d 3e 70 44 61 74  a->p, pLvl->pDat
24380 61 2d 3e 6e 2c 20 26 70 4c 76 6c 2d 3e 73 29 3b  a->n, &pLvl->s);
24390 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
243a0 20 7d 0a 0a 20 20 70 49 74 65 72 2d 3e 6e 45 6d   }..  pIter->nEm
243b0 70 74 79 20 3d 20 70 49 74 65 72 2d 3e 61 4c 76  pty = pIter->aLv
243c0 6c 5b 30 5d 2e 73 2e 6e 45 6d 70 74 79 3b 0a 20  l[0].s.nEmpty;. 
243d0 20 70 49 74 65 72 2d 3e 62 44 6c 69 64 78 20 3d   pIter->bDlidx =
243e0 20 70 49 74 65 72 2d 3e 61 4c 76 6c 5b 30 5d 2e   pIter->aLvl[0].
243f0 73 2e 62 44 6c 69 64 78 3b 0a 20 20 70 49 74 65  s.bDlidx;.  pIte
24400 72 2d 3e 69 4c 65 61 66 20 3d 20 70 49 74 65 72  r->iLeaf = pIter
24410 2d 3e 61 4c 76 6c 5b 30 5d 2e 73 2e 69 43 68 69  ->aLvl[0].s.iChi
24420 6c 64 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f  ld;.}..static vo
24430 69 64 20 66 74 73 35 42 74 72 65 65 49 74 65 72  id fts5BtreeIter
24440 46 72 65 65 28 46 74 73 35 42 74 72 65 65 49 74  Free(Fts5BtreeIt
24450 65 72 20 2a 70 49 74 65 72 29 7b 0a 20 20 69 6e  er *pIter){.  in
24460 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  t i;.  for(i=0; 
24470 69 3c 70 49 74 65 72 2d 3e 6e 4c 76 6c 3b 20 69  i<pIter->nLvl; i
24480 2b 2b 29 7b 0a 20 20 20 20 46 74 73 35 42 74 72  ++){.    Fts5Btr
24490 65 65 49 74 65 72 4c 65 76 65 6c 20 2a 70 4c 76  eeIterLevel *pLv
244a0 6c 20 3d 20 26 70 49 74 65 72 2d 3e 61 4c 76 6c  l = &pIter->aLvl
244b0 5b 69 5d 3b 0a 20 20 20 20 66 74 73 35 4e 6f 64  [i];.    fts5Nod
244c0 65 49 74 65 72 46 72 65 65 28 26 70 4c 76 6c 2d  eIterFree(&pLvl-
244d0 3e 73 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 76  >s);.    if( pLv
244e0 6c 2d 3e 70 44 61 74 61 20 29 7b 0a 20 20 20 20  l->pData ){.    
244f0 20 20 66 74 73 35 44 61 74 61 52 65 6c 65 61 73    fts5DataReleas
24500 65 28 70 4c 76 6c 2d 3e 70 44 61 74 61 29 3b 0a  e(pLvl->pData);.
24510 20 20 20 20 20 20 70 4c 76 6c 2d 3e 70 44 61 74        pLvl->pDat
24520 61 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d  a = 0;.    }.  }
24530 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
24540 70 49 74 65 72 2d 3e 61 4c 76 6c 29 3b 0a 20 20  pIter->aLvl);.  
24550 66 74 73 35 42 75 66 66 65 72 46 72 65 65 28 26  fts5BufferFree(&
24560 70 49 74 65 72 2d 3e 74 65 72 6d 29 3b 0a 7d 0a  pIter->term);.}.
24570 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
24580 45 42 55 47 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  EBUG./*.** This 
24590 66 75 6e 63 74 69 6f 6e 20 69 73 20 70 75 72 65  function is pure
245a0 6c 79 20 61 6e 20 69 6e 74 65 72 6e 61 6c 20 74  ly an internal t
245b0 65 73 74 2e 20 49 74 20 64 6f 65 73 20 6e 6f 74  est. It does not
245c0 20 63 6f 6e 74 72 69 62 75 74 65 20 74 6f 20 0a   contribute to .
245d0 2a 2a 20 46 54 53 20 66 75 6e 63 74 69 6f 6e 61  ** FTS functiona
245e0 6c 69 74 79 2c 20 6f 72 20 65 76 65 6e 20 74 68  lity, or even th
245f0 65 20 69 6e 74 65 67 72 69 74 79 2d 63 68 65 63  e integrity-chec
24600 6b 2c 20 69 6e 20 61 6e 79 20 77 61 79 2e 0a 2a  k, in any way..*
24610 2a 0a 2a 2a 20 49 6e 73 74 65 61 64 2c 20 69 74  *.** Instead, it
24620 20 74 65 73 74 73 20 74 68 61 74 20 74 68 65 20   tests that the 
24630 73 61 6d 65 20 73 65 74 20 6f 66 20 70 67 6e 6f  same set of pgno
24640 2f 72 6f 77 69 64 20 63 6f 6d 62 69 6e 61 74 69  /rowid combinati
24650 6f 6e 73 20 61 72 65 20 0a 2a 2a 20 76 69 73 69  ons are .** visi
24660 74 65 64 20 72 65 67 61 72 64 6c 65 73 73 20 6f  ted regardless o
24670 66 20 77 68 65 74 68 65 72 20 74 68 65 20 64 6f  f whether the do
24680 63 6c 69 73 74 2d 69 6e 64 65 78 20 69 64 65 6e  clist-index iden
24690 74 69 66 69 65 64 20 62 79 20 70 61 72 61 6d 65  tified by parame
246a0 74 65 72 73 0a 2a 2a 20 69 53 65 67 69 64 2f 69  ters.** iSegid/i
246b0 4c 65 61 66 20 69 73 20 69 74 65 72 61 74 65 64  Leaf is iterated
246c0 20 69 6e 20 66 6f 72 77 61 72 64 73 20 6f 72 20   in forwards or 
246d0 72 65 76 65 72 73 65 20 6f 72 64 65 72 2e 0a 2a  reverse order..*
246e0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  /.static void ft
246f0 73 35 54 65 73 74 44 6c 69 64 78 52 65 76 65 72  s5TestDlidxRever
24700 73 65 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20  se(.  Fts5Index 
24710 2a 70 2c 20 0a 20 20 69 6e 74 20 69 53 65 67 69  *p, .  int iSegi
24720 64 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d,              
24730 20 20 20 20 20 20 20 2f 2a 20 53 65 67 6d 65 6e         /* Segmen
24740 74 20 69 64 20 74 6f 20 6c 6f 61 64 20 66 72 6f  t id to load fro
24750 6d 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 65 61 66  m */.  int iLeaf
24760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24770 20 20 20 20 20 20 20 2f 2a 20 4c 6f 61 64 20 64         /* Load d
24780 6f 63 6c 69 73 74 2d 69 6e 64 65 78 20 66 6f 72  oclist-index for
24790 20 74 68 69 73 20 6c 65 61 66 20 2a 2f 0a 29 7b   this leaf */.){
247a0 0a 20 20 46 74 73 35 44 6c 69 64 78 49 74 65 72  .  Fts5DlidxIter
247b0 20 2a 70 44 6c 69 64 78 20 3d 20 30 3b 0a 20 20   *pDlidx = 0;.  
247c0 75 36 34 20 63 6b 73 75 6d 31 20 3d 20 31 33 3b  u64 cksum1 = 13;
247d0 0a 20 20 75 36 34 20 63 6b 73 75 6d 32 20 3d 20  .  u64 cksum2 = 
247e0 31 33 3b 0a 0a 20 20 66 6f 72 28 70 44 6c 69 64  13;..  for(pDlid
247f0 78 3d 66 74 73 35 44 6c 69 64 78 49 74 65 72 49  x=fts5DlidxIterI
24800 6e 69 74 28 70 2c 20 30 2c 20 69 53 65 67 69 64  nit(p, 0, iSegid
24810 2c 20 69 4c 65 61 66 29 3b 0a 20 20 20 20 20 20  , iLeaf);.      
24820 66 74 73 35 44 6c 69 64 78 49 74 65 72 45 6f 66  fts5DlidxIterEof
24830 28 70 2c 20 70 44 6c 69 64 78 29 3d 3d 30 3b 0a  (p, pDlidx)==0;.
24840 20 20 20 20 20 20 66 74 73 35 44 6c 69 64 78 49        fts5DlidxI
24850 74 65 72 4e 65 78 74 28 70 2c 20 70 44 6c 69 64  terNext(p, pDlid
24860 78 29 0a 20 20 29 7b 0a 20 20 20 20 69 36 34 20  x).  ){.    i64 
24870 69 52 6f 77 69 64 20 3d 20 66 74 73 35 44 6c 69  iRowid = fts5Dli
24880 64 78 49 74 65 72 52 6f 77 69 64 28 70 44 6c 69  dxIterRowid(pDli
24890 64 78 29 3b 0a 20 20 20 20 69 6e 74 20 70 67 6e  dx);.    int pgn
248a0 6f 20 3d 20 66 74 73 35 44 6c 69 64 78 49 74 65  o = fts5DlidxIte
248b0 72 50 67 6e 6f 28 70 44 6c 69 64 78 29 3b 0a 20  rPgno(pDlidx);. 
248c0 20 20 20 61 73 73 65 72 74 28 20 70 67 6e 6f 3e     assert( pgno>
248d0 69 4c 65 61 66 20 29 3b 0a 20 20 20 20 63 6b 73  iLeaf );.    cks
248e0 75 6d 31 20 2b 3d 20 69 52 6f 77 69 64 20 2b 20  um1 += iRowid + 
248f0 28 28 69 36 34 29 70 67 6e 6f 3c 3c 33 32 29 3b  ((i64)pgno<<32);
24900 0a 20 20 7d 0a 20 20 66 74 73 35 44 6c 69 64 78  .  }.  fts5Dlidx
24910 49 74 65 72 46 72 65 65 28 70 44 6c 69 64 78 29  IterFree(pDlidx)
24920 3b 0a 20 20 70 44 6c 69 64 78 20 3d 20 30 3b 0a  ;.  pDlidx = 0;.
24930 0a 20 20 66 6f 72 28 70 44 6c 69 64 78 3d 66 74  .  for(pDlidx=ft
24940 73 35 44 6c 69 64 78 49 74 65 72 49 6e 69 74 28  s5DlidxIterInit(
24950 70 2c 20 31 2c 20 69 53 65 67 69 64 2c 20 69 4c  p, 1, iSegid, iL
24960 65 61 66 29 3b 0a 20 20 20 20 20 20 66 74 73 35  eaf);.      fts5
24970 44 6c 69 64 78 49 74 65 72 45 6f 66 28 70 2c 20  DlidxIterEof(p, 
24980 70 44 6c 69 64 78 29 3d 3d 30 3b 0a 20 20 20 20  pDlidx)==0;.    
24990 20 20 66 74 73 35 44 6c 69 64 78 49 74 65 72 50    fts5DlidxIterP
249a0 72 65 76 28 70 2c 20 70 44 6c 69 64 78 29 0a 20  rev(p, pDlidx). 
249b0 20 29 7b 0a 20 20 20 20 69 36 34 20 69 52 6f 77   ){.    i64 iRow
249c0 69 64 20 3d 20 66 74 73 35 44 6c 69 64 78 49 74  id = fts5DlidxIt
249d0 65 72 52 6f 77 69 64 28 70 44 6c 69 64 78 29 3b  erRowid(pDlidx);
249e0 0a 20 20 20 20 69 6e 74 20 70 67 6e 6f 20 3d 20  .    int pgno = 
249f0 66 74 73 35 44 6c 69 64 78 49 74 65 72 50 67 6e  fts5DlidxIterPgn
24a00 6f 28 70 44 6c 69 64 78 29 3b 0a 20 20 20 20 61  o(pDlidx);.    a
24a10 73 73 65 72 74 28 20 66 74 73 35 44 6c 69 64 78  ssert( fts5Dlidx
24a20 49 74 65 72 50 67 6e 6f 28 70 44 6c 69 64 78 29  IterPgno(pDlidx)
24a30 3e 69 4c 65 61 66 20 29 3b 0a 20 20 20 20 63 6b  >iLeaf );.    ck
24a40 73 75 6d 32 20 2b 3d 20 69 52 6f 77 69 64 20 2b  sum2 += iRowid +
24a50 20 28 28 69 36 34 29 70 67 6e 6f 3c 3c 33 32 29   ((i64)pgno<<32)
24a60 3b 0a 20 20 7d 0a 20 20 66 74 73 35 44 6c 69 64  ;.  }.  fts5Dlid
24a70 78 49 74 65 72 46 72 65 65 28 70 44 6c 69 64 78  xIterFree(pDlidx
24a80 29 3b 0a 20 20 70 44 6c 69 64 78 20 3d 20 30 3b  );.  pDlidx = 0;
24a90 0a 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53  ..  if( p->rc==S
24aa0 51 4c 49 54 45 5f 4f 4b 20 26 26 20 63 6b 73 75  QLITE_OK && cksu
24ab0 6d 31 21 3d 63 6b 73 75 6d 32 20 29 20 70 2d 3e  m1!=cksum2 ) p->
24ac0 72 63 20 3d 20 46 54 53 35 5f 43 4f 52 52 55 50  rc = FTS5_CORRUP
24ad0 54 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74  T;.}..static int
24ae0 20 66 74 73 35 51 75 65 72 79 43 6b 73 75 6d 28   fts5QueryCksum(
24af0 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c  .  Fts5Index *p,
24b00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24b10 20 20 20 2f 2a 20 46 74 73 35 20 69 6e 64 65 78     /* Fts5 index
24b20 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74   object */.  int
24b30 20 69 49 64 78 2c 0a 20 20 63 6f 6e 73 74 20 63   iIdx,.  const c
24b40 68 61 72 20 2a 7a 2c 20 20 20 20 20 20 20 20 20  har *z,         
24b50 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
24b60 78 20 6b 65 79 20 74 6f 20 71 75 65 72 79 20 66  x key to query f
24b70 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 6e 2c 20 20  or */.  int n,  
24b80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24b90 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
24ba0 6f 66 20 69 6e 64 65 78 20 6b 65 79 20 69 6e 20  of index key in 
24bb0 62 79 74 65 73 20 2a 2f 0a 20 20 69 6e 74 20 66  bytes */.  int f
24bc0 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20 20 20  lags,           
24bd0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c             /* Fl
24be0 61 67 73 20 66 6f 72 20 46 74 73 35 49 6e 64 65  ags for Fts5Inde
24bf0 78 51 75 65 72 79 20 2a 2f 0a 20 20 75 36 34 20  xQuery */.  u64 
24c00 2a 70 43 6b 73 75 6d 20 20 20 20 20 20 20 20 20  *pCksum         
24c10 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
24c20 4e 2f 4f 55 54 3a 20 43 68 65 63 6b 73 75 6d 20  N/OUT: Checksum 
24c30 76 61 6c 75 65 20 2a 2f 0a 29 7b 0a 20 20 75 36  value */.){.  u6
24c40 34 20 63 6b 73 75 6d 20 3d 20 2a 70 43 6b 73 75  4 cksum = *pCksu
24c50 6d 3b 0a 20 20 46 74 73 35 49 6e 64 65 78 49 74  m;.  Fts5IndexIt
24c60 65 72 20 2a 70 49 64 78 49 74 65 72 20 3d 20 30  er *pIdxIter = 0
24c70 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c  ;.  int rc = sql
24c80 69 74 65 33 46 74 73 35 49 6e 64 65 78 51 75 65  ite3Fts5IndexQue
24c90 72 79 28 70 2c 20 7a 2c 20 6e 2c 20 66 6c 61 67  ry(p, z, n, flag
24ca0 73 2c 20 26 70 49 64 78 49 74 65 72 29 3b 0a 0a  s, &pIdxIter);..
24cb0 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c    while( rc==SQL
24cc0 49 54 45 5f 4f 4b 20 26 26 20 30 3d 3d 73 71 6c  ITE_OK && 0==sql
24cd0 69 74 65 33 46 74 73 35 49 74 65 72 45 6f 66 28  ite3Fts5IterEof(
24ce0 70 49 64 78 49 74 65 72 29 20 29 7b 0a 20 20 20  pIdxIter) ){.   
24cf0 20 69 36 34 20 64 75 6d 6d 79 3b 0a 20 20 20 20   i64 dummy;.    
24d00 63 6f 6e 73 74 20 75 38 20 2a 70 50 6f 73 3b 0a  const u8 *pPos;.
24d10 20 20 20 20 69 6e 74 20 6e 50 6f 73 3b 0a 20 20      int nPos;.  
24d20 20 20 69 36 34 20 72 6f 77 69 64 20 3d 20 73 71    i64 rowid = sq
24d30 6c 69 74 65 33 46 74 73 35 49 74 65 72 52 6f 77  lite3Fts5IterRow
24d40 69 64 28 70 49 64 78 49 74 65 72 29 3b 0a 20 20  id(pIdxIter);.  
24d50 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74    rc = sqlite3Ft
24d60 73 35 49 74 65 72 50 6f 73 6c 69 73 74 28 70 49  s5IterPoslist(pI
24d70 64 78 49 74 65 72 2c 20 26 70 50 6f 73 2c 20 26  dxIter, &pPos, &
24d80 6e 50 6f 73 2c 20 26 64 75 6d 6d 79 29 3b 0a 20  nPos, &dummy);. 
24d90 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
24da0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 46 74  E_OK ){.      Ft
24db0 73 35 50 6f 73 6c 69 73 74 52 65 61 64 65 72 20  s5PoslistReader 
24dc0 73 52 65 61 64 65 72 3b 0a 20 20 20 20 20 20 66  sReader;.      f
24dd0 6f 72 28 73 71 6c 69 74 65 33 46 74 73 35 50 6f  or(sqlite3Fts5Po
24de0 73 6c 69 73 74 52 65 61 64 65 72 49 6e 69 74 28  slistReaderInit(
24df0 2d 31 2c 20 70 50 6f 73 2c 20 6e 50 6f 73 2c 20  -1, pPos, nPos, 
24e00 26 73 52 65 61 64 65 72 29 3b 0a 20 20 20 20 20  &sReader);.     
24e10 20 20 20 20 20 73 52 65 61 64 65 72 2e 62 45 6f       sReader.bEo
24e20 66 3d 3d 30 3b 0a 20 20 20 20 20 20 20 20 20 20  f==0;.          
24e30 73 71 6c 69 74 65 33 46 74 73 35 50 6f 73 6c 69  sqlite3Fts5Posli
24e40 73 74 52 65 61 64 65 72 4e 65 78 74 28 26 73 52  stReaderNext(&sR
24e50 65 61 64 65 72 29 0a 20 20 20 20 20 20 29 7b 0a  eader).      ){.
24e60 20 20 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6c          int iCol
24e70 20 3d 20 46 54 53 35 5f 50 4f 53 32 43 4f 4c 55   = FTS5_POS2COLU
24e80 4d 4e 28 73 52 65 61 64 65 72 2e 69 50 6f 73 29  MN(sReader.iPos)
24e90 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 4f  ;.        int iO
24ea0 66 66 20 3d 20 46 54 53 35 5f 50 4f 53 32 4f 46  ff = FTS5_POS2OF
24eb0 46 53 45 54 28 73 52 65 61 64 65 72 2e 69 50 6f  FSET(sReader.iPo
24ec0 73 29 3b 0a 20 20 20 20 20 20 20 20 63 6b 73 75  s);.        cksu
24ed0 6d 20 5e 3d 20 66 74 73 35 49 6e 64 65 78 45 6e  m ^= fts5IndexEn
24ee0 74 72 79 43 6b 73 75 6d 28 72 6f 77 69 64 2c 20  tryCksum(rowid, 
24ef0 69 43 6f 6c 2c 20 69 4f 66 66 2c 20 69 49 64 78  iCol, iOff, iIdx
24f00 2c 20 7a 2c 20 6e 29 3b 0a 20 20 20 20 20 20 7d  , z, n);.      }
24f10 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
24f20 74 65 33 46 74 73 35 49 74 65 72 4e 65 78 74 28  te3Fts5IterNext(
24f30 70 49 64 78 49 74 65 72 29 3b 0a 20 20 20 20 7d  pIdxIter);.    }
24f40 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 46 74  .  }.  sqlite3Ft
24f50 73 35 49 74 65 72 43 6c 6f 73 65 28 70 49 64 78  s5IterClose(pIdx
24f60 49 74 65 72 29 3b 0a 0a 20 20 2a 70 43 6b 73 75  Iter);..  *pCksu
24f70 6d 20 3d 20 63 6b 73 75 6d 3b 0a 20 20 72 65 74  m = cksum;.  ret
24f80 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  urn rc;.}.../*.*
24f90 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
24fa0 69 73 20 61 6c 73 6f 20 70 75 72 65 6c 79 20 61  is also purely a
24fb0 6e 20 69 6e 74 65 72 6e 61 6c 20 74 65 73 74 2e  n internal test.
24fc0 20 49 74 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6e   It does not con
24fd0 74 72 69 62 75 74 65 20 74 6f 20 0a 2a 2a 20 46  tribute to .** F
24fe0 54 53 20 66 75 6e 63 74 69 6f 6e 61 6c 69 74 79  TS functionality
24ff0 2c 20 6f 72 20 65 76 65 6e 20 74 68 65 20 69 6e  , or even the in
25000 74 65 67 72 69 74 79 2d 63 68 65 63 6b 2c 20 69  tegrity-check, i
25010 6e 20 61 6e 79 20 77 61 79 2e 0a 2a 2f 0a 73 74  n any way..*/.st
25020 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 54 65  atic void fts5Te
25030 73 74 54 65 72 6d 28 0a 20 20 46 74 73 35 49 6e  stTerm(.  Fts5In
25040 64 65 78 20 2a 70 2c 20 0a 20 20 46 74 73 35 42  dex *p, .  Fts5B
25050 75 66 66 65 72 20 2a 70 50 72 65 76 2c 20 20 20  uffer *pPrev,   
25060 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 72             /* Pr
25070 65 76 69 6f 75 73 20 74 65 72 6d 20 2a 2f 0a 20  evious term */. 
25080 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 2c 20   const char *z, 
25090 69 6e 74 20 6e 2c 20 20 20 20 20 20 20 20 20 20  int n,          
250a0 20 2f 2a 20 50 6f 73 73 69 62 6c 79 20 6e 65 77   /* Possibly new
250b0 20 74 65 72 6d 20 74 6f 20 74 65 73 74 20 2a 2f   term to test */
250c0 0a 20 20 75 36 34 20 65 78 70 65 63 74 65 64 2c  .  u64 expected,
250d0 0a 20 20 75 36 34 20 2a 70 43 6b 73 75 6d 0a 29  .  u64 *pCksum.)
250e0 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 70 2d 3e  {.  int rc = p->
250f0 72 63 3b 0a 20 20 69 66 28 20 70 50 72 65 76 2d  rc;.  if( pPrev-
25100 3e 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 66 74 73  >n==0 ){.    fts
25110 35 42 75 66 66 65 72 53 65 74 28 26 72 63 2c 20  5BufferSet(&rc, 
25120 70 50 72 65 76 2c 20 6e 2c 20 28 63 6f 6e 73 74  pPrev, n, (const
25130 20 75 38 2a 29 7a 29 3b 0a 20 20 7d 65 6c 73 65   u8*)z);.  }else
25140 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
25150 45 5f 4f 4b 20 26 26 20 28 70 50 72 65 76 2d 3e  E_OK && (pPrev->
25160 6e 21 3d 6e 20 7c 7c 20 6d 65 6d 63 6d 70 28 70  n!=n || memcmp(p
25170 50 72 65 76 2d 3e 70 2c 20 7a 2c 20 6e 29 29 20  Prev->p, z, n)) 
25180 29 7b 0a 20 20 20 20 75 36 34 20 63 6b 73 75 6d  ){.    u64 cksum
25190 33 20 3d 20 2a 70 43 6b 73 75 6d 3b 0a 20 20 20  3 = *pCksum;.   
251a0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 65   const char *zTe
251b0 72 6d 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72  rm = (const char
251c0 2a 29 26 70 50 72 65 76 2d 3e 70 5b 31 5d 3b 20  *)&pPrev->p[1]; 
251d0 20 2f 2a 20 74 65 72 6d 20 73 61 6e 73 20 70 72   /* term sans pr
251e0 65 66 69 78 2d 62 79 74 65 20 2a 2f 0a 20 20 20  efix-byte */.   
251f0 20 69 6e 74 20 6e 54 65 72 6d 20 3d 20 70 50 72   int nTerm = pPr
25200 65 76 2d 3e 6e 2d 31 3b 20 20 20 20 20 20 20 20  ev->n-1;        
25210 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 7a      /* Size of z
25220 54 65 72 6d 20 69 6e 20 62 79 74 65 73 20 2a 2f  Term in bytes */
25230 0a 20 20 20 20 69 6e 74 20 69 49 64 78 20 3d 20  .    int iIdx = 
25240 28 70 50 72 65 76 2d 3e 70 5b 30 5d 20 2d 20 46  (pPrev->p[0] - F
25250 54 53 35 5f 4d 41 49 4e 5f 50 52 45 46 49 58 29  TS5_MAIN_PREFIX)
25260 3b 0a 20 20 20 20 69 6e 74 20 66 6c 61 67 73 20  ;.    int flags 
25270 3d 20 28 69 49 64 78 3d 3d 30 20 3f 20 30 20 3a  = (iIdx==0 ? 0 :
25280 20 46 54 53 35 49 4e 44 45 58 5f 51 55 45 52 59   FTS5INDEX_QUERY
25290 5f 50 52 45 46 49 58 29 3b 0a 20 20 20 20 69 6e  _PREFIX);.    in
252a0 74 20 72 63 3b 0a 20 20 20 20 75 36 34 20 63 6b  t rc;.    u64 ck
252b0 31 20 3d 20 30 3b 0a 20 20 20 20 75 36 34 20 63  1 = 0;.    u64 c
252c0 6b 32 20 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a 20  k2 = 0;..    /* 
252d0 43 68 65 63 6b 20 74 68 61 74 20 74 68 65 20 72  Check that the r
252e0 65 73 75 6c 74 73 20 72 65 74 75 72 6e 65 64 20  esults returned 
252f0 66 6f 72 20 41 53 43 20 61 6e 64 20 44 45 53 43  for ASC and DESC
25300 20 71 75 65 72 69 65 73 20 61 72 65 0a 20 20 20   queries are.   
25310 20 2a 2a 20 74 68 65 20 73 61 6d 65 2e 20 49 66   ** the same. If
25320 20 6e 6f 74 2c 20 63 61 6c 6c 20 74 68 69 73 20   not, call this 
25330 63 6f 72 72 75 70 74 69 6f 6e 2e 20 20 2a 2f 0a  corruption.  */.
25340 20 20 20 20 72 63 20 3d 20 66 74 73 35 51 75 65      rc = fts5Que
25350 72 79 43 6b 73 75 6d 28 70 2c 20 69 49 64 78 2c  ryCksum(p, iIdx,
25360 20 7a 54 65 72 6d 2c 20 6e 54 65 72 6d 2c 20 66   zTerm, nTerm, f
25370 6c 61 67 73 2c 20 26 63 6b 31 29 3b 0a 20 20 20  lags, &ck1);.   
25380 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
25390 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  OK ){.      int 
253a0 66 20 3d 20 66 6c 61 67 73 7c 46 54 53 35 49 4e  f = flags|FTS5IN
253b0 44 45 58 5f 51 55 45 52 59 5f 44 45 53 43 3b 0a  DEX_QUERY_DESC;.
253c0 20 20 20 20 20 20 72 63 20 3d 20 66 74 73 35 51        rc = fts5Q
253d0 75 65 72 79 43 6b 73 75 6d 28 70 2c 20 69 49 64  ueryCksum(p, iId
253e0 78 2c 20 7a 54 65 72 6d 2c 20 6e 54 65 72 6d 2c  x, zTerm, nTerm,
253f0 20 66 2c 20 26 63 6b 32 29 3b 0a 20 20 20 20 7d   f, &ck2);.    }
25400 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
25410 49 54 45 5f 4f 4b 20 26 26 20 63 6b 31 21 3d 63  ITE_OK && ck1!=c
25420 6b 32 20 29 20 72 63 20 3d 20 46 54 53 35 5f 43  k2 ) rc = FTS5_C
25430 4f 52 52 55 50 54 3b 0a 0a 20 20 20 20 2f 2a 20  ORRUPT;..    /* 
25440 49 66 20 74 68 69 73 20 69 73 20 61 20 70 72 65  If this is a pre
25450 66 69 78 20 71 75 65 72 79 2c 20 63 68 65 63 6b  fix query, check
25460 20 74 68 61 74 20 74 68 65 20 72 65 73 75 6c 74   that the result
25470 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 74 68  s returned if th
25480 65 0a 20 20 20 20 2a 2a 20 74 68 65 20 69 6e 64  e.    ** the ind
25490 65 78 20 69 73 20 64 69 73 61 62 6c 65 64 20 61  ex is disabled a
254a0 72 65 20 74 68 65 20 73 61 6d 65 2e 20 49 6e 20  re the same. In 
254b0 62 6f 74 68 20 41 53 43 20 61 6e 64 20 44 45 53  both ASC and DES
254c0 43 20 6f 72 64 65 72 2e 20 2a 2f 0a 20 20 20 20  C order. */.    
254d0 69 66 28 20 69 49 64 78 3e 30 20 26 26 20 72 63  if( iIdx>0 && rc
254e0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
254f0 20 20 20 20 20 69 6e 74 20 66 20 3d 20 66 6c 61       int f = fla
25500 67 73 7c 46 54 53 35 49 4e 44 45 58 5f 51 55 45  gs|FTS5INDEX_QUE
25510 52 59 5f 54 45 53 54 5f 4e 4f 49 44 58 3b 0a 20  RY_TEST_NOIDX;. 
25520 20 20 20 20 20 63 6b 32 20 3d 20 30 3b 0a 20 20       ck2 = 0;.  
25530 20 20 20 20 72 63 20 3d 20 66 74 73 35 51 75 65      rc = fts5Que
25540 72 79 43 6b 73 75 6d 28 70 2c 20 69 49 64 78 2c  ryCksum(p, iIdx,
25550 20 7a 54 65 72 6d 2c 20 6e 54 65 72 6d 2c 20 66   zTerm, nTerm, f
25560 2c 20 26 63 6b 32 29 3b 0a 20 20 20 20 20 20 69  , &ck2);.      i
25570 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
25580 20 26 26 20 63 6b 31 21 3d 63 6b 32 20 29 20 72   && ck1!=ck2 ) r
25590 63 20 3d 20 46 54 53 35 5f 43 4f 52 52 55 50 54  c = FTS5_CORRUPT
255a0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
255b0 69 49 64 78 3e 30 20 26 26 20 72 63 3d 3d 53 51  iIdx>0 && rc==SQ
255c0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
255d0 20 69 6e 74 20 66 20 3d 20 66 6c 61 67 73 7c 46   int f = flags|F
255e0 54 53 35 49 4e 44 45 58 5f 51 55 45 52 59 5f 54  TS5INDEX_QUERY_T
255f0 45 53 54 5f 4e 4f 49 44 58 7c 46 54 53 35 49 4e  EST_NOIDX|FTS5IN
25600 44 45 58 5f 51 55 45 52 59 5f 44 45 53 43 3b 0a  DEX_QUERY_DESC;.
25610 20 20 20 20 20 20 63 6b 32 20 3d 20 30 3b 0a 20        ck2 = 0;. 
25620 20 20 20 20 20 72 63 20 3d 20 66 74 73 35 51 75       rc = fts5Qu
25630 65 72 79 43 6b 73 75 6d 28 70 2c 20 69 49 64 78  eryCksum(p, iIdx
25640 2c 20 7a 54 65 72 6d 2c 20 6e 54 65 72 6d 2c 20  , zTerm, nTerm, 
25650 66 2c 20 26 63 6b 32 29 3b 0a 20 20 20 20 20 20  f, &ck2);.      
25660 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
25670 4b 20 26 26 20 63 6b 31 21 3d 63 6b 32 20 29 20  K && ck1!=ck2 ) 
25680 72 63 20 3d 20 46 54 53 35 5f 43 4f 52 52 55 50  rc = FTS5_CORRUP
25690 54 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63 6b  T;.    }..    ck
256a0 73 75 6d 33 20 5e 3d 20 63 6b 31 3b 0a 20 20 20  sum3 ^= ck1;.   
256b0 20 66 74 73 35 42 75 66 66 65 72 53 65 74 28 26   fts5BufferSet(&
256c0 72 63 2c 20 70 50 72 65 76 2c 20 6e 2c 20 28 63  rc, pPrev, n, (c
256d0 6f 6e 73 74 20 75 38 2a 29 7a 29 3b 0a 0a 20 20  onst u8*)z);..  
256e0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
256f0 5f 4f 4b 20 26 26 20 63 6b 73 75 6d 33 21 3d 65  _OK && cksum3!=e
25700 78 70 65 63 74 65 64 20 29 7b 0a 20 20 20 20 20  xpected ){.     
25710 20 72 63 20 3d 20 46 54 53 35 5f 43 4f 52 52 55   rc = FTS5_CORRU
25720 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2a 70  PT;.    }.    *p
25730 43 6b 73 75 6d 20 3d 20 63 6b 73 75 6d 33 3b 0a  Cksum = cksum3;.
25740 20 20 7d 0a 20 20 70 2d 3e 72 63 20 3d 20 72 63    }.  p->rc = rc
25750 3b 0a 7d 0a 20 0a 23 65 6c 73 65 0a 23 20 64 65  ;.}. .#else.# de
25760 66 69 6e 65 20 66 74 73 35 54 65 73 74 44 6c 69  fine fts5TestDli
25770 64 78 52 65 76 65 72 73 65 28 78 2c 79 2c 7a 29  dxReverse(x,y,z)
25780 0a 23 20 64 65 66 69 6e 65 20 66 74 73 35 54 65  .# define fts5Te
25790 73 74 54 65 72 6d 28 75 2c 76 2c 77 2c 78 2c 79  stTerm(u,v,w,x,y
257a0 2c 7a 29 0a 23 65 6e 64 69 66 0a 0a 73 74 61 74  ,z).#endif..stat
257b0 69 63 20 76 6f 69 64 20 66 74 73 35 49 6e 64 65  ic void fts5Inde
257c0 78 49 6e 74 65 67 72 69 74 79 43 68 65 63 6b 53  xIntegrityCheckS
257d0 65 67 6d 65 6e 74 28 0a 20 20 46 74 73 35 49 6e  egment(.  Fts5In
257e0 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20 20  dex *p,         
257f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53            /* FTS
25800 35 20 62 61 63 6b 65 6e 64 20 6f 62 6a 65 63 74  5 backend object
25810 20 2a 2f 0a 20 20 46 74 73 35 53 74 72 75 63 74   */.  Fts5Struct
25820 75 72 65 53 65 67 6d 65 6e 74 20 2a 70 53 65 67  ureSegment *pSeg
25830 20 20 20 20 20 20 2f 2a 20 53 65 67 6d 65 6e 74        /* Segment
25840 20 74 6f 20 63 68 65 63 6b 20 69 6e 74 65 72 6e   to check intern
25850 61 6c 20 63 6f 6e 73 69 73 74 65 6e 63 79 20 2a  al consistency *
25860 2f 0a 29 7b 0a 20 20 46 74 73 35 42 74 72 65 65  /.){.  Fts5Btree
25870 49 74 65 72 20 69 74 65 72 3b 20 20 20 20 20 20  Iter iter;      
25880 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20 74         /* Used t
25890 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f 75 67  o iterate throug
258a0 68 20 62 2d 74 72 65 65 20 68 69 65 72 61 72 63  h b-tree hierarc
258b0 68 79 20 2a 2f 0a 0a 20 20 69 66 28 20 70 53 65  hy */..  if( pSe
258c0 67 2d 3e 70 67 6e 6f 46 69 72 73 74 3d 3d 30 20  g->pgnoFirst==0 
258d0 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20  ) return;..  /* 
258e0 49 74 65 72 61 74 65 20 74 68 72 6f 75 67 68 20  Iterate through 
258f0 74 68 65 20 62 2d 74 72 65 65 20 68 69 65 72 61  the b-tree hiera
25900 72 63 68 79 2e 20 20 2a 2f 0a 20 20 66 6f 72 28  rchy.  */.  for(
25910 66 74 73 35 42 74 72 65 65 49 74 65 72 49 6e 69  fts5BtreeIterIni
25920 74 28 70 2c 20 70 53 65 67 2c 20 26 69 74 65 72  t(p, pSeg, &iter
25930 29 3b 0a 20 20 20 20 20 20 70 2d 3e 72 63 3d 3d  );.      p->rc==
25940 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 74 65  SQLITE_OK && ite
25950 72 2e 62 45 6f 66 3d 3d 30 3b 0a 20 20 20 20 20  r.bEof==0;.     
25960 20 66 74 73 35 42 74 72 65 65 49 74 65 72 4e 65   fts5BtreeIterNe
25970 78 74 28 26 69 74 65 72 29 0a 20 20 29 7b 0a 20  xt(&iter).  ){. 
25980 20 20 20 69 36 34 20 69 52 6f 77 3b 20 20 20 20     i64 iRow;    
25990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
259a0 20 2f 2a 20 52 6f 77 69 64 20 66 6f 72 20 74 68   /* Rowid for th
259b0 69 73 20 6c 65 61 66 20 2a 2f 0a 20 20 20 20 46  is leaf */.    F
259c0 74 73 35 44 61 74 61 20 2a 70 4c 65 61 66 3b 20  ts5Data *pLeaf; 
259d0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
259e0 44 61 74 61 20 66 6f 72 20 74 68 69 73 20 6c 65  Data for this le
259f0 61 66 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 4f  af */.    int iO
25a00 66 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ff;             
25a10 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65          /* Offse
25a20 74 20 6f 66 20 66 69 72 73 74 20 74 65 72 6d 20  t of first term 
25a30 6f 6e 20 6c 65 61 66 20 2a 2f 0a 20 20 20 20 69  on leaf */.    i
25a40 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20  nt i;           
25a50 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
25a60 55 73 65 64 20 74 6f 20 69 74 65 72 61 74 65 20  Used to iterate 
25a70 74 68 72 6f 75 67 68 20 65 6d 70 74 79 20 6c 65  through empty le
25a80 61 76 65 73 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20  aves */..    /* 
25a90 49 66 20 74 68 65 20 6c 65 61 66 20 69 6e 20 71  If the leaf in q
25aa0 75 65 73 74 69 6f 6e 20 68 61 73 20 61 6c 72 65  uestion has alre
25ab0 61 64 79 20 62 65 65 6e 20 74 72 69 6d 6d 65 64  ady been trimmed
25ac0 20 66 72 6f 6d 20 74 68 65 20 73 65 67 6d 65 6e   from the segmen
25ad0 74 2c 20 0a 20 20 20 20 2a 2a 20 69 67 6e 6f 72  t, .    ** ignor
25ae0 65 20 74 68 69 73 20 62 2d 74 72 65 65 20 65 6e  e this b-tree en
25af0 74 72 79 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  try. Otherwise, 
25b00 6c 6f 61 64 20 69 74 20 69 6e 74 6f 20 6d 65 6d  load it into mem
25b10 6f 72 79 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20  ory. */.    if( 
25b20 69 74 65 72 2e 69 4c 65 61 66 3c 70 53 65 67 2d  iter.iLeaf<pSeg-
25b30 3e 70 67 6e 6f 46 69 72 73 74 20 29 20 63 6f 6e  >pgnoFirst ) con
25b40 74 69 6e 75 65 3b 0a 20 20 20 20 69 52 6f 77 20  tinue;.    iRow 
25b50 3d 20 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f 52  = FTS5_SEGMENT_R
25b60 4f 57 49 44 28 70 53 65 67 2d 3e 69 53 65 67 69  OWID(pSeg->iSegi
25b70 64 2c 20 30 2c 20 69 74 65 72 2e 69 4c 65 61 66  d, 0, iter.iLeaf
25b80 29 3b 0a 20 20 20 20 70 4c 65 61 66 20 3d 20 66  );.    pLeaf = f
25b90 74 73 35 44 61 74 61 52 65 61 64 28 70 2c 20 69  ts5DataRead(p, i
25ba0 52 6f 77 29 3b 0a 20 20 20 20 69 66 28 20 70 4c  Row);.    if( pL
25bb0 65 61 66 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a  eaf==0 ) break;.
25bc0 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 68  .    /* Check th
25bd0 61 74 20 74 68 65 20 6c 65 61 66 20 63 6f 6e 74  at the leaf cont
25be0 61 69 6e 73 20 61 74 20 6c 65 61 73 74 20 6f 6e  ains at least on
25bf0 65 20 74 65 72 6d 2c 20 61 6e 64 20 74 68 61 74  e term, and that
25c00 20 69 74 20 69 73 20 65 71 75 61 6c 0a 20 20 20   it is equal.   
25c10 20 2a 2a 20 74 6f 20 6f 72 20 6c 61 72 67 65 72   ** to or larger
25c20 20 74 68 61 6e 20 74 68 65 20 73 70 6c 69 74 2d   than the split-
25c30 6b 65 79 20 69 6e 20 69 74 65 72 2e 74 65 72 6d  key in iter.term
25c40 2e 20 20 41 6c 73 6f 20 63 68 65 63 6b 20 74 68  .  Also check th
25c50 61 74 20 69 66 20 74 68 65 72 65 0a 20 20 20 20  at if there.    
25c60 2a 2a 20 69 73 20 61 6c 73 6f 20 61 20 72 6f 77  ** is also a row
25c70 69 64 20 70 6f 69 6e 74 65 72 20 77 69 74 68 69  id pointer withi
25c80 6e 20 74 68 65 20 6c 65 61 66 20 70 61 67 65 20  n the leaf page 
25c90 68 65 61 64 65 72 2c 20 69 74 20 70 6f 69 6e 74  header, it point
25ca0 73 20 74 6f 20 61 0a 20 20 20 20 2a 2a 20 6c 6f  s to a.    ** lo
25cb0 63 61 74 69 6f 6e 20 62 65 66 6f 72 65 20 74 68  cation before th
25cc0 65 20 74 65 72 6d 2e 20 20 2a 2f 0a 20 20 20 20  e term.  */.    
25cd0 69 4f 66 66 20 3d 20 66 74 73 35 47 65 74 55 31  iOff = fts5GetU1
25ce0 36 28 26 70 4c 65 61 66 2d 3e 70 5b 32 5d 29 3b  6(&pLeaf->p[2]);
25cf0 0a 20 20 20 20 69 66 28 20 69 4f 66 66 3d 3d 30  .    if( iOff==0
25d00 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 72 63 20   ){.      p->rc 
25d10 3d 20 46 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a  = FTS5_CORRUPT;.
25d20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
25d30 20 69 6e 74 20 69 52 6f 77 69 64 4f 66 66 3b 0a   int iRowidOff;.
25d40 20 20 20 20 20 20 69 6e 74 20 6e 54 65 72 6d 3b        int nTerm;
25d50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25d60 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 65 72    /* Size of ter
25d70 6d 20 6f 6e 20 6c 65 61 66 20 69 6e 20 62 79 74  m on leaf in byt
25d80 65 73 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  es */.      int 
25d90 72 65 73 3b 20 20 20 20 20 20 20 20 20 20 20 20  res;            
25da0 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d 70 61          /* Compa
25db0 72 69 73 6f 6e 20 6f 66 20 74 65 72 6d 20 61 6e  rison of term an
25dc0 64 20 73 70 6c 69 74 2d 6b 65 79 20 2a 2f 0a 0a  d split-key */..
25dd0 20 20 20 20 20 20 69 52 6f 77 69 64 4f 66 66 20        iRowidOff 
25de0 3d 20 66 74 73 35 47 65 74 55 31 36 28 26 70 4c  = fts5GetU16(&pL
25df0 65 61 66 2d 3e 70 5b 30 5d 29 3b 0a 20 20 20 20  eaf->p[0]);.    
25e00 20 20 69 66 28 20 69 52 6f 77 69 64 4f 66 66 3e    if( iRowidOff>
25e10 3d 69 4f 66 66 20 29 7b 0a 20 20 20 20 20 20 20  =iOff ){.       
25e20 20 70 2d 3e 72 63 20 3d 20 46 54 53 35 5f 43 4f   p->rc = FTS5_CO
25e30 52 52 55 50 54 3b 0a 20 20 20 20 20 20 7d 65 6c  RRUPT;.      }el
25e40 73 65 7b 0a 20 20 20 20 20 20 20 20 69 4f 66 66  se{.        iOff
25e50 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e   += fts5GetVarin
25e60 74 33 32 28 26 70 4c 65 61 66 2d 3e 70 5b 69 4f  t32(&pLeaf->p[iO
25e70 66 66 5d 2c 20 6e 54 65 72 6d 29 3b 0a 20 20 20  ff], nTerm);.   
25e80 20 20 20 20 20 72 65 73 20 3d 20 6d 65 6d 63 6d       res = memcm
25e90 70 28 26 70 4c 65 61 66 2d 3e 70 5b 69 4f 66 66  p(&pLeaf->p[iOff
25ea0 5d 2c 20 69 74 65 72 2e 74 65 72 6d 2e 70 2c 20  ], iter.term.p, 
25eb0 4d 49 4e 28 6e 54 65 72 6d 2c 20 69 74 65 72 2e  MIN(nTerm, iter.
25ec0 74 65 72 6d 2e 6e 29 29 3b 0a 20 20 20 20 20 20  term.n));.      
25ed0 20 20 69 66 28 20 72 65 73 3d 3d 30 20 29 20 72    if( res==0 ) r
25ee0 65 73 20 3d 20 6e 54 65 72 6d 20 2d 20 69 74 65  es = nTerm - ite
25ef0 72 2e 74 65 72 6d 2e 6e 3b 0a 20 20 20 20 20 20  r.term.n;.      
25f00 20 20 69 66 28 20 72 65 73 3c 30 20 29 20 70 2d    if( res<0 ) p-
25f10 3e 72 63 20 3d 20 46 54 53 35 5f 43 4f 52 52 55  >rc = FTS5_CORRU
25f20 50 54 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  PT;.      }.    
25f30 7d 0a 20 20 20 20 66 74 73 35 44 61 74 61 52 65  }.    fts5DataRe
25f40 6c 65 61 73 65 28 70 4c 65 61 66 29 3b 0a 20 20  lease(pLeaf);.  
25f50 20 20 69 66 28 20 70 2d 3e 72 63 20 29 20 62 72    if( p->rc ) br
25f60 65 61 6b 3b 0a 0a 0a 20 20 20 20 2f 2a 20 4e 6f  eak;...    /* No
25f70 77 20 63 68 65 63 6b 20 74 68 61 74 20 74 68 65  w check that the
25f80 20 69 74 65 72 2e 6e 45 6d 70 74 79 20 6c 65 61   iter.nEmpty lea
25f90 76 65 73 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68  ves following th
25fa0 65 20 63 75 72 72 65 6e 74 20 6c 65 61 66 0a 20  e current leaf. 
25fb0 20 20 20 2a 2a 20 28 61 29 20 65 78 69 73 74 20     ** (a) exist 
25fc0 61 6e 64 20 28 62 29 20 63 6f 6e 74 61 69 6e 20  and (b) contain 
25fd0 6e 6f 20 74 65 72 6d 73 2e 20 2a 2f 0a 20 20 20  no terms. */.   
25fe0 20 66 6f 72 28 69 3d 31 3b 20 70 2d 3e 72 63 3d   for(i=1; p->rc=
25ff0 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c  =SQLITE_OK && i<
26000 3d 69 74 65 72 2e 6e 45 6d 70 74 79 3b 20 69 2b  =iter.nEmpty; i+
26010 2b 29 7b 0a 20 20 20 20 20 20 70 4c 65 61 66 20  +){.      pLeaf 
26020 3d 20 66 74 73 35 44 61 74 61 52 65 61 64 28 70  = fts5DataRead(p
26030 2c 20 69 52 6f 77 2b 69 29 3b 0a 20 20 20 20 20  , iRow+i);.     
26040 20 69 66 28 20 70 4c 65 61 66 20 26 26 20 30 21   if( pLeaf && 0!
26050 3d 66 74 73 35 47 65 74 55 31 36 28 26 70 4c 65  =fts5GetU16(&pLe
26060 61 66 2d 3e 70 5b 32 5d 29 20 29 7b 0a 20 20 20  af->p[2]) ){.   
26070 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 46 54 53       p->rc = FTS
26080 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20 20 20  5_CORRUPT;.     
26090 20 7d 0a 20 20 20 20 20 20 66 74 73 35 44 61 74   }.      fts5Dat
260a0 61 52 65 6c 65 61 73 65 28 70 4c 65 61 66 29 3b  aRelease(pLeaf);
260b0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49  .    }..    /* I
260c0 66 20 74 68 65 72 65 20 69 73 20 61 20 64 6f 63  f there is a doc
260d0 6c 69 73 74 2d 69 6e 64 65 78 2c 20 63 68 65 63  list-index, chec
260e0 6b 20 74 68 61 74 20 69 74 20 6c 6f 6f 6b 73 20  k that it looks 
260f0 72 69 67 68 74 2e 20 2a 2f 0a 20 20 20 20 69 66  right. */.    if
26100 28 20 69 74 65 72 2e 62 44 6c 69 64 78 20 29 7b  ( iter.bDlidx ){
26110 0a 20 20 20 20 20 20 46 74 73 35 44 6c 69 64 78  .      Fts5Dlidx
26120 49 74 65 72 20 2a 70 44 6c 69 64 78 20 3d 20 30  Iter *pDlidx = 0
26130 3b 20 20 2f 2a 20 46 6f 72 20 69 74 65 72 61 74  ;  /* For iterat
26140 69 6e 67 20 74 68 72 6f 75 67 68 20 64 6f 63 6c  ing through docl
26150 69 73 74 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20  ist index */.   
26160 20 20 20 69 6e 74 20 69 50 72 65 76 4c 65 61 66     int iPrevLeaf
26170 20 3d 20 69 74 65 72 2e 69 4c 65 61 66 3b 0a 20   = iter.iLeaf;. 
26180 20 20 20 20 20 69 6e 74 20 69 53 65 67 69 64 20       int iSegid 
26190 3d 20 70 53 65 67 2d 3e 69 53 65 67 69 64 3b 0a  = pSeg->iSegid;.
261a0 20 20 20 20 20 20 69 6e 74 20 69 50 67 3b 0a 20        int iPg;. 
261b0 20 20 20 20 20 69 36 34 20 69 4b 65 79 3b 0a 0a       i64 iKey;..
261c0 20 20 20 20 20 20 66 6f 72 28 70 44 6c 69 64 78        for(pDlidx
261d0 3d 66 74 73 35 44 6c 69 64 78 49 74 65 72 49 6e  =fts5DlidxIterIn
261e0 69 74 28 70 2c 20 30 2c 20 69 53 65 67 69 64 2c  it(p, 0, iSegid,
261f0 20 69 74 65 72 2e 69 4c 65 61 66 29 3b 0a 20 20   iter.iLeaf);.  
26200 20 20 20 20 20 20 20 20 66 74 73 35 44 6c 69 64          fts5Dlid
26210 78 49 74 65 72 45 6f 66 28 70 2c 20 70 44 6c 69  xIterEof(p, pDli
26220 64 78 29 3d 3d 30 3b 0a 20 20 20 20 20 20 20 20  dx)==0;.        
26230 20 20 66 74 73 35 44 6c 69 64 78 49 74 65 72 4e    fts5DlidxIterN
26240 65 78 74 28 70 2c 20 70 44 6c 69 64 78 29 0a 20  ext(p, pDlidx). 
26250 20 20 20 20 20 29 7b 0a 0a 20 20 20 20 20 20 20       ){..       
26260 20 2f 2a 20 43 68 65 63 6b 20 61 6e 79 20 72 6f   /* Check any ro
26270 77 69 64 2d 6c 65 73 73 20 70 61 67 65 73 20 74  wid-less pages t
26280 68 61 74 20 6f 63 63 75 72 20 62 65 66 6f 72 65  hat occur before
26290 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c 65 61   the current lea
262a0 66 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 66 6f  f. */.        fo
262b0 72 28 69 50 67 3d 69 50 72 65 76 4c 65 61 66 2b  r(iPg=iPrevLeaf+
262c0 31 3b 20 69 50 67 3c 66 74 73 35 44 6c 69 64 78  1; iPg<fts5Dlidx
262d0 49 74 65 72 50 67 6e 6f 28 70 44 6c 69 64 78 29  IterPgno(pDlidx)
262e0 3b 20 69 50 67 2b 2b 29 7b 0a 20 20 20 20 20 20  ; iPg++){.      
262f0 20 20 20 20 69 4b 65 79 20 3d 20 46 54 53 35 5f      iKey = FTS5_
26300 53 45 47 4d 45 4e 54 5f 52 4f 57 49 44 28 69 53  SEGMENT_ROWID(iS
26310 65 67 69 64 2c 20 30 2c 20 69 50 67 29 3b 0a 20  egid, 0, iPg);. 
26320 20 20 20 20 20 20 20 20 20 70 4c 65 61 66 20 3d           pLeaf =
26330 20 66 74 73 35 44 61 74 61 52 65 61 64 28 70 2c   fts5DataRead(p,
26340 20 69 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20   iKey);.        
26350 20 20 69 66 28 20 70 4c 65 61 66 20 29 7b 0a 20    if( pLeaf ){. 
26360 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 66             if( f
26370 74 73 35 47 65 74 55 31 36 28 26 70 4c 65 61 66  ts5GetU16(&pLeaf
26380 2d 3e 70 5b 30 5d 29 21 3d 30 20 29 20 70 2d 3e  ->p[0])!=0 ) p->
26390 72 63 20 3d 20 46 54 53 35 5f 43 4f 52 52 55 50  rc = FTS5_CORRUP
263a0 54 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 66  T;.            f
263b0 74 73 35 44 61 74 61 52 65 6c 65 61 73 65 28 70  ts5DataRelease(p
263c0 4c 65 61 66 29 3b 0a 20 20 20 20 20 20 20 20 20  Leaf);.         
263d0 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
263e0 20 20 20 20 20 69 50 72 65 76 4c 65 61 66 20 3d       iPrevLeaf =
263f0 20 66 74 73 35 44 6c 69 64 78 49 74 65 72 50 67   fts5DlidxIterPg
26400 6e 6f 28 70 44 6c 69 64 78 29 3b 0a 0a 20 20 20  no(pDlidx);..   
26410 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 68       /* Check th
26420 61 74 20 74 68 65 20 6c 65 61 66 20 70 61 67 65  at the leaf page
26430 20 69 6e 64 69 63 61 74 65 64 20 62 79 20 74 68   indicated by th
26440 65 20 69 74 65 72 61 74 6f 72 20 72 65 61 6c 6c  e iterator reall
26450 79 20 64 6f 65 73 0a 20 20 20 20 20 20 20 20 2a  y does.        *
26460 2a 20 63 6f 6e 74 61 69 6e 20 74 68 65 20 72 6f  * contain the ro
26470 77 69 64 20 73 75 67 67 65 73 74 65 64 20 62 79  wid suggested by
26480 20 74 68 65 20 73 61 6d 65 2e 20 2a 2f 0a 20 20   the same. */.  
26490 20 20 20 20 20 20 69 4b 65 79 20 3d 20 46 54 53        iKey = FTS
264a0 35 5f 53 45 47 4d 45 4e 54 5f 52 4f 57 49 44 28  5_SEGMENT_ROWID(
264b0 69 53 65 67 69 64 2c 20 30 2c 20 69 50 72 65 76  iSegid, 0, iPrev
264c0 4c 65 61 66 29 3b 0a 20 20 20 20 20 20 20 20 70  Leaf);.        p
264d0 4c 65 61 66 20 3d 20 66 74 73 35 44 61 74 61 52  Leaf = fts5DataR
264e0 65 61 64 28 70 2c 20 69 4b 65 79 29 3b 0a 20 20  ead(p, iKey);.  
264f0 20 20 20 20 20 20 69 66 28 20 70 4c 65 61 66 20        if( pLeaf 
26500 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 36 34  ){.          i64
26510 20 69 52 6f 77 69 64 3b 0a 20 20 20 20 20 20 20   iRowid;.       
26520 20 20 20 69 6e 74 20 69 52 6f 77 69 64 4f 66 66     int iRowidOff
26530 20 3d 20 66 74 73 35 47 65 74 55 31 36 28 26 70   = fts5GetU16(&p
26540 4c 65 61 66 2d 3e 70 5b 30 5d 29 3b 0a 20 20 20  Leaf->p[0]);.   
26550 20 20 20 20 20 20 20 69 66 28 20 69 52 6f 77 69         if( iRowi
26560 64 4f 66 66 3e 3d 70 4c 65 61 66 2d 3e 6e 20 29  dOff>=pLeaf->n )
26570 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 2d  {.            p-
26580 3e 72 63 20 3d 20 46 54 53 35 5f 43 4f 52 52 55  >rc = FTS5_CORRU
26590 50 54 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65  PT;.          }e
265a0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
265b0 20 66 74 73 35 47 65 74 56 61 72 69 6e 74 28 26   fts5GetVarint(&
265c0 70 4c 65 61 66 2d 3e 70 5b 69 52 6f 77 69 64 4f  pLeaf->p[iRowidO
265d0 66 66 5d 2c 20 28 75 36 34 2a 29 26 69 52 6f 77  ff], (u64*)&iRow
265e0 69 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  id);.           
265f0 20 69 66 28 20 69 52 6f 77 69 64 21 3d 66 74 73   if( iRowid!=fts
26600 35 44 6c 69 64 78 49 74 65 72 52 6f 77 69 64 28  5DlidxIterRowid(
26610 70 44 6c 69 64 78 29 20 29 20 70 2d 3e 72 63 20  pDlidx) ) p->rc 
26620 3d 20 46 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a  = FTS5_CORRUPT;.
26630 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
26640 20 20 20 20 20 20 66 74 73 35 44 61 74 61 52 65        fts5DataRe
26650 6c 65 61 73 65 28 70 4c 65 61 66 29 3b 0a 20 20  lease(pLeaf);.  
26660 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
26670 0a 20 20 20 20 20 20 66 6f 72 28 69 50 67 3d 69  .      for(iPg=i
26680 50 72 65 76 4c 65 61 66 2b 31 3b 20 69 50 67 3c  PrevLeaf+1; iPg<
26690 3d 28 69 74 65 72 2e 69 4c 65 61 66 20 2b 20 69  =(iter.iLeaf + i
266a0 74 65 72 2e 6e 45 6d 70 74 79 29 3b 20 69 50 67  ter.nEmpty); iPg
266b0 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 4b 65  ++){.        iKe
266c0 79 20 3d 20 46 54 53 35 5f 53 45 47 4d 45 4e 54  y = FTS5_SEGMENT
266d0 5f 52 4f 57 49 44 28 69 53 65 67 69 64 2c 20 30  _ROWID(iSegid, 0
266e0 2c 20 69 50 67 29 3b 0a 20 20 20 20 20 20 20 20  , iPg);.        
266f0 70 4c 65 61 66 20 3d 20 66 74 73 35 44 61 74 61  pLeaf = fts5Data
26700 52 65 61 64 28 70 2c 20 69 4b 65 79 29 3b 0a 20  Read(p, iKey);. 
26710 20 20 20 20 20 20 20 69 66 28 20 70 4c 65 61 66         if( pLeaf
26720 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66   ){.          if
26730 28 20 66 74 73 35 47 65 74 55 31 36 28 26 70 4c  ( fts5GetU16(&pL
26740 65 61 66 2d 3e 70 5b 30 5d 29 21 3d 30 20 29 20  eaf->p[0])!=0 ) 
26750 70 2d 3e 72 63 20 3d 20 46 54 53 35 5f 43 4f 52  p->rc = FTS5_COR
26760 52 55 50 54 3b 0a 20 20 20 20 20 20 20 20 20 20  RUPT;.          
26770 66 74 73 35 44 61 74 61 52 65 6c 65 61 73 65 28  fts5DataRelease(
26780 70 4c 65 61 66 29 3b 0a 20 20 20 20 20 20 20 20  pLeaf);.        
26790 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  }.      }..     
267a0 20 66 74 73 35 44 6c 69 64 78 49 74 65 72 46 72   fts5DlidxIterFr
267b0 65 65 28 70 44 6c 69 64 78 29 3b 0a 20 20 20 20  ee(pDlidx);.    
267c0 20 20 66 74 73 35 54 65 73 74 44 6c 69 64 78 52    fts5TestDlidxR
267d0 65 76 65 72 73 65 28 70 2c 20 69 53 65 67 69 64  everse(p, iSegid
267e0 2c 20 69 74 65 72 2e 69 4c 65 61 66 29 3b 0a 20  , iter.iLeaf);. 
267f0 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 50     }.  }..  /* P
26800 61 67 65 20 69 74 65 72 2e 69 4c 65 61 66 20 6d  age iter.iLeaf m
26810 75 73 74 20 6e 6f 77 20 62 65 20 74 68 65 20 72  ust now be the r
26820 69 67 68 74 6d 6f 73 74 20 6c 65 61 66 2d 70 61  ightmost leaf-pa
26830 67 65 20 69 6e 20 74 68 65 20 73 65 67 6d 65 6e  ge in the segmen
26840 74 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 72 63  t */.  if( p->rc
26850 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69  ==SQLITE_OK && i
26860 74 65 72 2e 69 4c 65 61 66 21 3d 70 53 65 67 2d  ter.iLeaf!=pSeg-
26870 3e 70 67 6e 6f 4c 61 73 74 20 29 7b 0a 20 20 20  >pgnoLast ){.   
26880 20 70 2d 3e 72 63 20 3d 20 46 54 53 35 5f 43 4f   p->rc = FTS5_CO
26890 52 52 55 50 54 3b 0a 20 20 7d 0a 0a 20 20 66 74  RRUPT;.  }..  ft
268a0 73 35 42 74 72 65 65 49 74 65 72 46 72 65 65 28  s5BtreeIterFree(
268b0 26 69 74 65 72 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  &iter);.}.../*.*
268c0 2a 20 52 75 6e 20 69 6e 74 65 72 6e 61 6c 20 63  * Run internal c
268d0 68 65 63 6b 73 20 74 6f 20 65 6e 73 75 72 65 20  hecks to ensure 
268e0 74 68 61 74 20 74 68 65 20 46 54 53 20 69 6e 64  that the FTS ind
268f0 65 78 20 28 61 29 20 69 73 20 69 6e 74 65 72 6e  ex (a) is intern
26900 61 6c 6c 79 20 0a 2a 2a 20 63 6f 6e 73 69 73 74  ally .** consist
26910 65 6e 74 20 61 6e 64 20 28 62 29 20 63 6f 6e 74  ent and (b) cont
26920 61 69 6e 73 20 65 6e 74 72 69 65 73 20 66 6f 72  ains entries for
26930 20 77 68 69 63 68 20 74 68 65 20 58 4f 52 20 6f   which the XOR o
26940 66 20 74 68 65 20 63 68 65 63 6b 73 75 6d 73 0a  f the checksums.
26950 2a 2a 20 61 73 20 63 61 6c 63 75 6c 61 74 65 64  ** as calculated
26960 20 62 79 20 66 74 73 35 49 6e 64 65 78 45 6e 74   by fts5IndexEnt
26970 72 79 43 6b 73 75 6d 28 29 20 69 73 20 63 6b 73  ryCksum() is cks
26980 75 6d 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  um..**.** Return
26990 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20   SQLITE_CORRUPT 
269a0 69 66 20 61 6e 79 20 6f 66 20 74 68 65 20 69 6e  if any of the in
269b0 74 65 72 6e 61 6c 20 63 68 65 63 6b 73 20 66 61  ternal checks fa
269c0 69 6c 2c 20 6f 72 20 69 66 20 74 68 65 0a 2a 2a  il, or if the.**
269d0 20 63 68 65 63 6b 73 75 6d 20 64 6f 65 73 20 6e   checksum does n
269e0 6f 74 20 6d 61 74 63 68 2e 20 52 65 74 75 72 6e  ot match. Return
269f0 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 61 6c   SQLITE_OK if al
26a00 6c 20 63 68 65 63 6b 73 20 70 61 73 73 20 77 69  l checks pass wi
26a10 74 68 6f 75 74 0a 2a 2a 20 65 72 72 6f 72 2c 20  thout.** error, 
26a20 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72 20 53 51  or some other SQ
26a30 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20  Lite error code 
26a40 69 66 20 61 6e 6f 74 68 65 72 20 65 72 72 6f 72  if another error
26a50 20 28 65 2e 67 2e 20 4f 4f 4d 29 0a 2a 2a 20 6f   (e.g. OOM).** o
26a60 63 63 75 72 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ccurs..*/.int sq
26a70 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78 49 6e  lite3Fts5IndexIn
26a80 74 65 67 72 69 74 79 43 68 65 63 6b 28 46 74 73  tegrityCheck(Fts
26a90 35 49 6e 64 65 78 20 2a 70 2c 20 75 36 34 20 63  5Index *p, u64 c
26aa0 6b 73 75 6d 29 7b 0a 20 20 75 36 34 20 63 6b 73  ksum){.  u64 cks
26ab0 75 6d 32 20 3d 20 30 3b 20 20 20 20 20 20 20 20  um2 = 0;        
26ac0 20 20 20 20 20 20 20 20 20 2f 2a 20 43 68 65 63           /* Chec
26ad0 6b 73 75 6d 20 62 61 73 65 64 20 6f 6e 20 63 6f  ksum based on co
26ae0 6e 74 65 6e 74 73 20 6f 66 20 69 6e 64 65 78 65  ntents of indexe
26af0 73 20 2a 2f 0a 20 20 46 74 73 35 42 75 66 66 65  s */.  Fts5Buffe
26b00 72 20 70 6f 73 6c 69 73 74 20 3d 20 7b 30 2c 30  r poslist = {0,0
26b10 2c 30 7d 3b 20 20 20 2f 2a 20 42 75 66 66 65 72  ,0};   /* Buffer
26b20 20 75 73 65 64 20 74 6f 20 68 6f 6c 64 20 61 20   used to hold a 
26b30 70 6f 73 6c 69 73 74 20 2a 2f 0a 20 20 46 74 73  poslist */.  Fts
26b40 35 4d 75 6c 74 69 53 65 67 49 74 65 72 20 2a 70  5MultiSegIter *p
26b50 49 74 65 72 3b 20 20 20 20 20 20 20 20 2f 2a 20  Iter;        /* 
26b60 55 73 65 64 20 74 6f 20 69 74 65 72 61 74 65 20  Used to iterate 
26b70 74 68 72 6f 75 67 68 20 65 6e 74 69 72 65 20 69  through entire i
26b80 6e 64 65 78 20 2a 2f 0a 20 20 46 74 73 35 53 74  ndex */.  Fts5St
26b90 72 75 63 74 75 72 65 20 2a 70 53 74 72 75 63 74  ructure *pStruct
26ba0 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64  ;         /* Ind
26bb0 65 78 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a  ex structure */.
26bc0 0a 20 20 2f 2a 20 55 73 65 64 20 62 79 20 65 78  .  /* Used by ex
26bd0 74 72 61 20 69 6e 74 65 72 6e 61 6c 20 74 65 73  tra internal tes
26be0 74 73 20 6f 6e 6c 79 20 72 75 6e 20 69 66 20 4e  ts only run if N
26bf0 44 45 42 55 47 20 69 73 20 6e 6f 74 20 64 65 66  DEBUG is not def
26c00 69 6e 65 64 20 2a 2f 0a 20 20 75 36 34 20 63 6b  ined */.  u64 ck
26c10 73 75 6d 33 20 3d 20 30 3b 20 20 20 20 20 20 20  sum3 = 0;       
26c20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 68 65            /* Che
26c30 63 6b 73 75 6d 20 62 61 73 65 64 20 6f 6e 20 63  cksum based on c
26c40 6f 6e 74 65 6e 74 73 20 6f 66 20 69 6e 64 65 78  ontents of index
26c50 65 73 20 2a 2f 0a 20 20 46 74 73 35 42 75 66 66  es */.  Fts5Buff
26c60 65 72 20 74 65 72 6d 20 3d 20 7b 30 2c 30 2c 30  er term = {0,0,0
26c70 7d 3b 20 20 20 20 20 20 2f 2a 20 42 75 66 66 65  };      /* Buffe
26c80 72 20 75 73 65 64 20 74 6f 20 68 6f 6c 64 20 6d  r used to hold m
26c90 6f 73 74 20 72 65 63 65 6e 74 20 74 65 72 6d 20  ost recent term 
26ca0 2a 2f 0a 20 20 0a 20 20 2f 2a 20 4c 6f 61 64 20  */.  .  /* Load 
26cb0 74 68 65 20 46 54 53 20 69 6e 64 65 78 20 73 74  the FTS index st
26cc0 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 70 53 74  ructure */.  pSt
26cd0 72 75 63 74 20 3d 20 66 74 73 35 53 74 72 75 63  ruct = fts5Struc
26ce0 74 75 72 65 52 65 61 64 28 70 29 3b 0a 0a 20 20  tureRead(p);..  
26cf0 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20 74 68  /* Check that th
26d00 65 20 69 6e 74 65 72 6e 61 6c 20 6e 6f 64 65 73  e internal nodes
26d10 20 6f 66 20 65 61 63 68 20 73 65 67 6d 65 6e 74   of each segment
26d20 20 6d 61 74 63 68 20 74 68 65 20 6c 65 61 76 65   match the leave
26d30 73 20 2a 2f 0a 20 20 69 66 28 20 70 53 74 72 75  s */.  if( pStru
26d40 63 74 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 4c  ct ){.    int iL
26d50 76 6c 2c 20 69 53 65 67 3b 0a 20 20 20 20 66 6f  vl, iSeg;.    fo
26d60 72 28 69 4c 76 6c 3d 30 3b 20 69 4c 76 6c 3c 70  r(iLvl=0; iLvl<p
26d70 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 3b 20  Struct->nLevel; 
26d80 69 4c 76 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 66  iLvl++){.      f
26d90 6f 72 28 69 53 65 67 3d 30 3b 20 69 53 65 67 3c  or(iSeg=0; iSeg<
26da0 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b  pStruct->aLevel[
26db0 69 4c 76 6c 5d 2e 6e 53 65 67 3b 20 69 53 65 67  iLvl].nSeg; iSeg
26dc0 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 46 74 73  ++){.        Fts
26dd0 35 53 74 72 75 63 74 75 72 65 53 65 67 6d 65 6e  5StructureSegmen
26de0 74 20 2a 70 53 65 67 20 3d 20 26 70 53 74 72 75  t *pSeg = &pStru
26df0 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d  ct->aLevel[iLvl]
26e00 2e 61 53 65 67 5b 69 53 65 67 5d 3b 0a 20 20 20  .aSeg[iSeg];.   
26e10 20 20 20 20 20 66 74 73 35 49 6e 64 65 78 49 6e       fts5IndexIn
26e20 74 65 67 72 69 74 79 43 68 65 63 6b 53 65 67 6d  tegrityCheckSegm
26e30 65 6e 74 28 70 2c 20 70 53 65 67 29 3b 0a 20 20  ent(p, pSeg);.  
26e40 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
26e50 0a 20 20 2f 2a 20 54 68 65 20 63 6b 73 75 6d 20  .  /* The cksum 
26e60 61 72 67 75 6d 65 6e 74 20 70 61 73 73 65 64 20  argument passed 
26e70 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  to this function
26e80 20 69 73 20 61 20 63 68 65 63 6b 73 75 6d 20 63   is a checksum c
26e90 61 6c 63 75 6c 61 74 65 64 0a 20 20 2a 2a 20 62  alculated.  ** b
26ea0 61 73 65 64 20 6f 6e 20 61 6c 6c 20 65 78 70 65  ased on all expe
26eb0 63 74 65 64 20 65 6e 74 72 69 65 73 20 69 6e 20  cted entries in 
26ec0 74 68 65 20 46 54 53 20 69 6e 64 65 78 20 28 69  the FTS index (i
26ed0 6e 63 6c 75 64 69 6e 67 20 70 72 65 66 69 78 20  ncluding prefix 
26ee0 69 6e 64 65 78 0a 20 20 2a 2a 20 65 6e 74 72 69  index.  ** entri
26ef0 65 73 29 2e 20 54 68 69 73 20 62 6c 6f 63 6b 20  es). This block 
26f00 63 68 65 63 6b 73 20 74 68 61 74 20 61 20 63 68  checks that a ch
26f10 65 63 6b 73 75 6d 20 63 61 6c 63 75 6c 61 74 65  ecksum calculate
26f20 64 20 62 61 73 65 64 20 6f 6e 20 74 68 65 0a 20  d based on the. 
26f30 20 2a 2a 20 61 63 74 75 61 6c 20 63 6f 6e 74 65   ** actual conte
26f40 6e 74 73 20 6f 66 20 46 54 53 20 69 6e 64 65 78  nts of FTS index
26f50 20 69 73 20 69 64 65 6e 74 69 63 61 6c 2e 0a 20   is identical.. 
26f60 20 2a 2a 0a 20 20 2a 2a 20 54 77 6f 20 76 65 72   **.  ** Two ver
26f70 73 69 6f 6e 73 20 6f 66 20 74 68 65 20 73 61 6d  sions of the sam
26f80 65 20 63 68 65 63 6b 73 75 6d 20 61 72 65 20 63  e checksum are c
26f90 61 6c 63 75 6c 61 74 65 64 2e 20 54 68 65 20 66  alculated. The f
26fa0 69 72 73 74 20 28 73 74 61 63 6b 0a 20 20 2a 2a  irst (stack.  **
26fb0 20 76 61 72 69 61 62 6c 65 20 63 6b 73 75 6d 32   variable cksum2
26fc0 29 20 62 61 73 65 64 20 6f 6e 20 65 6e 74 72 69  ) based on entri
26fd0 65 73 20 65 78 74 72 61 63 74 65 64 20 66 72 6f  es extracted fro
26fe0 6d 20 74 68 65 20 66 75 6c 6c 2d 74 65 78 74 20  m the full-text 
26ff0 69 6e 64 65 78 0a 20 20 2a 2a 20 77 68 69 6c 65  index.  ** while
27000 20 64 6f 69 6e 67 20 61 20 6c 69 6e 65 61 72 20   doing a linear 
27010 73 63 61 6e 20 6f 66 20 65 61 63 68 20 69 6e 64  scan of each ind
27020 69 76 69 64 75 61 6c 20 69 6e 64 65 78 20 69 6e  ividual index in
27030 20 74 75 72 6e 2e 20 0a 20 20 2a 2a 0a 20 20 2a   turn. .  **.  *
27040 2a 20 41 73 20 65 61 63 68 20 74 65 72 6d 20 76  * As each term v
27050 69 73 69 74 65 64 20 62 79 20 74 68 65 20 6c 69  isited by the li
27060 6e 65 61 72 20 73 63 61 6e 73 2c 20 61 20 73 65  near scans, a se
27070 70 61 72 61 74 65 20 71 75 65 72 79 20 66 6f 72  parate query for
27080 20 74 68 65 0a 20 20 2a 2a 20 73 61 6d 65 20 74   the.  ** same t
27090 65 72 6d 20 69 73 20 70 65 72 66 6f 72 6d 65 64  erm is performed
270a0 2e 20 63 6b 73 75 6d 33 20 69 73 20 63 61 6c 63  . cksum3 is calc
270b0 75 6c 61 74 65 64 20 62 61 73 65 64 20 6f 6e 20  ulated based on 
270c0 74 68 65 20 65 6e 74 72 69 65 73 0a 20 20 2a 2a  the entries.  **
270d0 20 65 78 74 72 61 63 74 65 64 20 62 79 20 74 68   extracted by th
270e0 65 73 65 20 71 75 65 72 69 65 73 2e 0a 20 20 2a  ese queries..  *
270f0 2f 0a 20 20 66 6f 72 28 66 74 73 35 4d 75 6c 74  /.  for(fts5Mult
27100 69 49 74 65 72 4e 65 77 28 70 2c 20 70 53 74 72  iIterNew(p, pStr
27110 75 63 74 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  uct, 0, 0, 0, 0,
27120 20 2d 31 2c 20 30 2c 20 26 70 49 74 65 72 29 3b   -1, 0, &pIter);
27130 0a 20 20 20 20 20 20 66 74 73 35 4d 75 6c 74 69  .      fts5Multi
27140 49 74 65 72 45 6f 66 28 70 2c 20 70 49 74 65 72  IterEof(p, pIter
27150 29 3d 3d 30 3b 0a 20 20 20 20 20 20 66 74 73 35  )==0;.      fts5
27160 4d 75 6c 74 69 49 74 65 72 4e 65 78 74 28 70 2c  MultiIterNext(p,
27170 20 70 49 74 65 72 2c 20 30 2c 20 30 29 0a 20 20   pIter, 0, 0).  
27180 29 7b 0a 20 20 20 20 69 6e 74 20 6e 3b 20 20 20  ){.    int n;   
27190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
271a0 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 65     /* Size of te
271b0 72 6d 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20  rm in bytes */. 
271c0 20 20 20 69 36 34 20 69 50 6f 73 20 3d 20 30 3b     i64 iPos = 0;
271d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
271e0 2a 20 50 6f 73 69 74 69 6f 6e 20 72 65 61 64 20  * Position read 
271f0 66 72 6f 6d 20 70 6f 73 6c 69 73 74 20 2a 2f 0a  from poslist */.
27200 20 20 20 20 69 6e 74 20 69 4f 66 66 20 3d 20 30      int iOff = 0
27210 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
27220 2f 2a 20 4f 66 66 73 65 74 20 77 69 74 68 69 6e  /* Offset within
27230 20 70 6f 73 6c 69 73 74 20 2a 2f 0a 20 20 20 20   poslist */.    
27240 69 36 34 20 69 52 6f 77 69 64 20 3d 20 66 74 73  i64 iRowid = fts
27250 35 4d 75 6c 74 69 49 74 65 72 52 6f 77 69 64 28  5MultiIterRowid(
27260 70 49 74 65 72 29 3b 0a 20 20 20 20 63 68 61 72  pIter);.    char
27270 20 2a 7a 20 3d 20 28 63 68 61 72 2a 29 66 74 73   *z = (char*)fts
27280 35 4d 75 6c 74 69 49 74 65 72 54 65 72 6d 28 70  5MultiIterTerm(p
27290 49 74 65 72 2c 20 26 6e 29 3b 0a 0a 20 20 20 20  Iter, &n);..    
272a0 70 6f 73 6c 69 73 74 2e 6e 20 3d 20 30 3b 0a 20  poslist.n = 0;. 
272b0 20 20 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72     fts5MultiIter
272c0 50 6f 73 6c 69 73 74 28 70 2c 20 70 49 74 65 72  Poslist(p, pIter
272d0 2c 20 30 2c 20 26 70 6f 73 6c 69 73 74 29 3b 0a  , 0, &poslist);.
272e0 20 20 20 20 77 68 69 6c 65 28 20 30 3d 3d 73 71      while( 0==sq
272f0 6c 69 74 65 33 46 74 73 35 50 6f 73 6c 69 73 74  lite3Fts5Poslist
27300 4e 65 78 74 36 34 28 70 6f 73 6c 69 73 74 2e 70  Next64(poslist.p
27310 2c 20 70 6f 73 6c 69 73 74 2e 6e 2c 20 26 69 4f  , poslist.n, &iO
27320 66 66 2c 20 26 69 50 6f 73 29 20 29 7b 0a 20 20  ff, &iPos) ){.  
27330 20 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 46      int iCol = F
27340 54 53 35 5f 50 4f 53 32 43 4f 4c 55 4d 4e 28 69  TS5_POS2COLUMN(i
27350 50 6f 73 29 3b 0a 20 20 20 20 20 20 69 6e 74 20  Pos);.      int 
27360 69 54 6f 6b 4f 66 66 20 3d 20 46 54 53 35 5f 50  iTokOff = FTS5_P
27370 4f 53 32 4f 46 46 53 45 54 28 69 50 6f 73 29 3b  OS2OFFSET(iPos);
27380 0a 20 20 20 20 20 20 63 6b 73 75 6d 32 20 5e 3d  .      cksum2 ^=
27390 20 66 74 73 35 49 6e 64 65 78 45 6e 74 72 79 43   fts5IndexEntryC
273a0 6b 73 75 6d 28 69 52 6f 77 69 64 2c 20 69 43 6f  ksum(iRowid, iCo
273b0 6c 2c 20 69 54 6f 6b 4f 66 66 2c 20 2d 31 2c 20  l, iTokOff, -1, 
273c0 7a 2c 20 6e 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  z, n);.    }..  
273d0 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20    /* If this is 
273e0 61 20 6e 65 77 20 74 65 72 6d 2c 20 71 75 65 72  a new term, quer
273f0 79 20 66 6f 72 20 69 74 2e 20 55 70 64 61 74 65  y for it. Update
27400 20 63 6b 73 75 6d 33 20 77 69 74 68 20 74 68 65   cksum3 with the
27410 20 72 65 73 75 6c 74 73 2e 20 2a 2f 0a 20 20 20   results. */.   
27420 20 66 74 73 35 54 65 73 74 54 65 72 6d 28 70 2c   fts5TestTerm(p,
27430 20 26 74 65 72 6d 2c 20 7a 2c 20 6e 2c 20 63 6b   &term, z, n, ck
27440 73 75 6d 32 2c 20 26 63 6b 73 75 6d 33 29 3b 0a  sum2, &cksum3);.
27450 20 20 7d 0a 20 20 66 74 73 35 54 65 73 74 54 65    }.  fts5TestTe
27460 72 6d 28 70 2c 20 26 74 65 72 6d 2c 20 30 2c 20  rm(p, &term, 0, 
27470 30 2c 20 63 6b 73 75 6d 32 2c 20 26 63 6b 73 75  0, cksum2, &cksu
27480 6d 33 29 3b 0a 0a 20 20 66 74 73 35 4d 75 6c 74  m3);..  fts5Mult
27490 69 49 74 65 72 46 72 65 65 28 70 2c 20 70 49 74  iIterFree(p, pIt
274a0 65 72 29 3b 0a 20 20 69 66 28 20 70 2d 3e 72 63  er);.  if( p->rc
274b0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 63  ==SQLITE_OK && c
274c0 6b 73 75 6d 21 3d 63 6b 73 75 6d 32 20 29 20 70  ksum!=cksum2 ) p
274d0 2d 3e 72 63 20 3d 20 46 54 53 35 5f 43 4f 52 52  ->rc = FTS5_CORR
274e0 55 50 54 3b 0a 0a 20 20 66 74 73 35 53 74 72 75  UPT;..  fts5Stru
274f0 63 74 75 72 65 52 65 6c 65 61 73 65 28 70 53 74  ctureRelease(pSt
27500 72 75 63 74 29 3b 0a 20 20 66 74 73 35 42 75 66  ruct);.  fts5Buf
27510 66 65 72 46 72 65 65 28 26 74 65 72 6d 29 3b 0a  ferFree(&term);.
27520 20 20 66 74 73 35 42 75 66 66 65 72 46 72 65 65    fts5BufferFree
27530 28 26 70 6f 73 6c 69 73 74 29 3b 0a 20 20 72 65  (&poslist);.  re
27540 74 75 72 6e 20 66 74 73 35 49 6e 64 65 78 52 65  turn fts5IndexRe
27550 74 75 72 6e 28 70 29 3b 0a 7d 0a 0a 0a 2f 2a 0a  turn(p);.}.../*.
27560 2a 2a 20 43 61 6c 63 75 6c 61 74 65 20 61 6e 64  ** Calculate and
27570 20 72 65 74 75 72 6e 20 61 20 63 68 65 63 6b 73   return a checks
27580 75 6d 20 74 68 61 74 20 69 73 20 74 68 65 20 58  um that is the X
27590 4f 52 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20  OR of the index 
275a0 65 6e 74 72 79 0a 2a 2a 20 63 68 65 63 6b 73 75  entry.** checksu
275b0 6d 20 6f 66 20 61 6c 6c 20 65 6e 74 72 69 65 73  m of all entries
275c0 20 74 68 61 74 20 77 6f 75 6c 64 20 62 65 20 67   that would be g
275d0 65 6e 65 72 61 74 65 64 20 62 79 20 74 68 65 20  enerated by the 
275e0 74 6f 6b 65 6e 20 73 70 65 63 69 66 69 65 64 0a  token specified.
275f0 2a 2a 20 62 79 20 74 68 65 20 66 69 6e 61 6c 20  ** by the final 
27600 35 20 61 72 67 75 6d 65 6e 74 73 2e 0a 2a 2f 0a  5 arguments..*/.
27610 75 36 34 20 73 71 6c 69 74 65 33 46 74 73 35 49  u64 sqlite3Fts5I
27620 6e 64 65 78 43 6b 73 75 6d 28 0a 20 20 46 74 73  ndexCksum(.  Fts
27630 35 43 6f 6e 66 69 67 20 2a 70 43 6f 6e 66 69 67  5Config *pConfig
27640 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
27650 43 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 6f 62  Configuration ob
27660 6a 65 63 74 20 2a 2f 0a 20 20 69 36 34 20 69 52  ject */.  i64 iR
27670 6f 77 69 64 2c 20 20 20 20 20 20 20 20 20 20 20  owid,           
27680 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 63            /* Doc
27690 75 6d 65 6e 74 20 74 65 72 6d 20 61 70 70 65 61  ument term appea
276a0 72 73 20 69 6e 20 2a 2f 0a 20 20 69 6e 74 20 69  rs in */.  int i
276b0 43 6f 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20  Col,            
276c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f             /* Co
276d0 6c 75 6d 6e 20 74 65 72 6d 20 61 70 70 65 61 72  lumn term appear
276e0 73 20 69 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 50  s in */.  int iP
276f0 6f 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  os,             
27700 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 73            /* Pos
27710 69 74 69 6f 6e 20 74 65 72 6d 20 61 70 70 65 61  ition term appea
27720 72 73 20 69 6e 20 2a 2f 0a 20 20 63 6f 6e 73 74  rs in */.  const
27730 20 63 68 61 72 20 2a 70 54 65 72 6d 2c 20 69 6e   char *pTerm, in
27740 74 20 6e 54 65 72 6d 20 20 20 20 2f 2a 20 54 65  t nTerm    /* Te
27750 72 6d 20 61 74 20 69 50 6f 73 20 2a 2f 0a 29 7b  rm at iPos */.){
27760 0a 20 20 75 36 34 20 72 65 74 20 3d 20 30 3b 20  .  u64 ret = 0; 
27770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27780 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 76 61 6c     /* Return val
27790 75 65 20 2a 2f 0a 20 20 69 6e 74 20 69 49 64 78  ue */.  int iIdx
277a0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
277b0 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 69          /* For i
277c0 74 65 72 61 74 69 6e 67 20 74 68 72 6f 75 67 68  terating through
277d0 20 69 6e 64 65 78 65 73 20 2a 2f 0a 0a 20 20 72   indexes */..  r
277e0 65 74 20 3d 20 66 74 73 35 49 6e 64 65 78 45 6e  et = fts5IndexEn
277f0 74 72 79 43 6b 73 75 6d 28 69 52 6f 77 69 64 2c  tryCksum(iRowid,
27800 20 69 43 6f 6c 2c 20 69 50 6f 73 2c 20 30 2c 20   iCol, iPos, 0, 
27810 70 54 65 72 6d 2c 20 6e 54 65 72 6d 29 3b 0a 0a  pTerm, nTerm);..
27820 20 20 66 6f 72 28 69 49 64 78 3d 30 3b 20 69 49    for(iIdx=0; iI
27830 64 78 3c 70 43 6f 6e 66 69 67 2d 3e 6e 50 72 65  dx<pConfig->nPre
27840 66 69 78 3b 20 69 49 64 78 2b 2b 29 7b 0a 20 20  fix; iIdx++){.  
27850 20 20 69 6e 74 20 6e 42 79 74 65 20 3d 20 66 74    int nByte = ft
27860 73 35 49 6e 64 65 78 43 68 61 72 6c 65 6e 54 6f  s5IndexCharlenTo
27870 42 79 74 65 6c 65 6e 28 70 54 65 72 6d 2c 20 6e  Bytelen(pTerm, n
27880 54 65 72 6d 2c 20 70 43 6f 6e 66 69 67 2d 3e 61  Term, pConfig->a
27890 50 72 65 66 69 78 5b 69 49 64 78 5d 29 3b 0a 20  Prefix[iIdx]);. 
278a0 20 20 20 69 66 28 20 6e 42 79 74 65 20 29 7b 0a     if( nByte ){.
278b0 20 20 20 20 20 20 72 65 74 20 5e 3d 20 66 74 73        ret ^= fts
278c0 35 49 6e 64 65 78 45 6e 74 72 79 43 6b 73 75 6d  5IndexEntryCksum
278d0 28 69 52 6f 77 69 64 2c 20 69 43 6f 6c 2c 20 69  (iRowid, iCol, i
278e0 50 6f 73 2c 20 69 49 64 78 2b 31 2c 20 70 54 65  Pos, iIdx+1, pTe
278f0 72 6d 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20 20  rm, nByte);.    
27900 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  }.  }..  return 
27910 72 65 74 3b 0a 7d 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a  ret;.}../*******
27920 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
27930 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
27940 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
27950 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
27960 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  **.*************
27970 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
27980 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
27990 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
279a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a  *************.**
279b0 20 42 65 6c 6f 77 20 74 68 69 73 20 70 6f 69 6e   Below this poin
279c0 74 20 69 73 20 74 68 65 20 69 6d 70 6c 65 6d 65  t is the impleme
279d0 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 66  ntation of the f
279e0 74 73 35 5f 64 65 63 6f 64 65 28 29 20 73 63 61  ts5_decode() sca
279f0 6c 61 72 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20  lar.** function 
27a00 6f 6e 6c 79 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  only..*/../*.** 
27a10 44 65 63 6f 64 65 20 61 20 73 65 67 6d 65 6e 74  Decode a segment
27a20 2d 64 61 74 61 20 72 6f 77 69 64 20 66 72 6f 6d  -data rowid from
27a30 20 74 68 65 20 25 5f 64 61 74 61 20 74 61 62 6c   the %_data tabl
27a40 65 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  e. This function
27a50 20 69 73 0a 2a 2a 20 74 68 65 20 6f 70 70 6f 73   is.** the oppos
27a60 69 74 65 20 6f 66 20 6d 61 63 72 6f 20 46 54 53  ite of macro FTS
27a70 35 5f 53 45 47 4d 45 4e 54 5f 52 4f 57 49 44 28  5_SEGMENT_ROWID(
27a80 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  )..*/.static voi
27a90 64 20 66 74 73 35 44 65 63 6f 64 65 52 6f 77 69  d fts5DecodeRowi
27aa0 64 28 0a 20 20 69 36 34 20 69 52 6f 77 69 64 2c  d(.  i64 iRowid,
27ab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27ac0 20 20 20 20 20 2f 2a 20 52 6f 77 69 64 20 66 72       /* Rowid fr
27ad0 6f 6d 20 25 5f 64 61 74 61 20 74 61 62 6c 65 20  om %_data table 
27ae0 2a 2f 0a 20 20 69 6e 74 20 2a 70 69 53 65 67 69  */.  int *piSegi
27af0 64 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d,              
27b00 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 53 65 67       /* OUT: Seg
27b10 6d 65 6e 74 20 69 64 20 2a 2f 0a 20 20 69 6e 74  ment id */.  int
27b20 20 2a 70 62 44 6c 69 64 78 2c 20 20 20 20 20 20   *pbDlidx,      
27b30 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
27b40 4f 55 54 3a 20 44 6c 69 64 78 20 66 6c 61 67 20  OUT: Dlidx flag 
27b50 2a 2f 0a 20 20 69 6e 74 20 2a 70 69 48 65 69 67  */.  int *piHeig
27b60 68 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ht,             
27b70 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 48 65 69       /* OUT: Hei
27b80 67 68 74 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 69  ght */.  int *pi
27b90 50 67 6e 6f 20 20 20 20 20 20 20 20 20 20 20 20  Pgno            
27ba0 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a           /* OUT:
27bb0 20 50 61 67 65 20 6e 75 6d 62 65 72 20 2a 2f 0a   Page number */.
27bc0 29 7b 0a 20 20 2a 70 69 50 67 6e 6f 20 3d 20 28  ){.  *piPgno = (
27bd0 69 6e 74 29 28 69 52 6f 77 69 64 20 26 20 28 28  int)(iRowid & ((
27be0 28 69 36 34 29 31 20 3c 3c 20 46 54 53 35 5f 44  (i64)1 << FTS5_D
27bf0 41 54 41 5f 50 41 47 45 5f 42 29 20 2d 20 31 29  ATA_PAGE_B) - 1)
27c00 29 3b 0a 20 20 69 52 6f 77 69 64 20 3e 3e 3d 20  );.  iRowid >>= 
27c10 46 54 53 35 5f 44 41 54 41 5f 50 41 47 45 5f 42  FTS5_DATA_PAGE_B
27c20 3b 0a 0a 20 20 2a 70 69 48 65 69 67 68 74 20 3d  ;..  *piHeight =
27c30 20 28 69 6e 74 29 28 69 52 6f 77 69 64 20 26 20   (int)(iRowid & 
27c40 28 28 28 69 36 34 29 31 20 3c 3c 20 46 54 53 35  (((i64)1 << FTS5
27c50 5f 44 41 54 41 5f 48 45 49 47 48 54 5f 42 29 20  _DATA_HEIGHT_B) 
27c60 2d 20 31 29 29 3b 0a 20 20 69 52 6f 77 69 64 20  - 1));.  iRowid 
27c70 3e 3e 3d 20 46 54 53 35 5f 44 41 54 41 5f 48 45  >>= FTS5_DATA_HE
27c80 49 47 48 54 5f 42 3b 0a 0a 20 20 2a 70 62 44 6c  IGHT_B;..  *pbDl
27c90 69 64 78 20 3d 20 28 69 6e 74 29 28 69 52 6f 77  idx = (int)(iRow
27ca0 69 64 20 26 20 30 78 30 30 30 31 29 3b 0a 20 20  id & 0x0001);.  
27cb0 69 52 6f 77 69 64 20 3e 3e 3d 20 46 54 53 35 5f  iRowid >>= FTS5_
27cc0 44 41 54 41 5f 44 4c 49 5f 42 3b 0a 0a 20 20 2a  DATA_DLI_B;..  *
27cd0 70 69 53 65 67 69 64 20 3d 20 28 69 6e 74 29 28  piSegid = (int)(
27ce0 69 52 6f 77 69 64 20 26 20 28 28 28 69 36 34 29  iRowid & (((i64)
27cf0 31 20 3c 3c 20 46 54 53 35 5f 44 41 54 41 5f 49  1 << FTS5_DATA_I
27d00 44 5f 42 29 20 2d 20 31 29 29 3b 0a 7d 0a 0a 73  D_B) - 1));.}..s
27d10 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 44  tatic void fts5D
27d20 65 62 75 67 52 6f 77 69 64 28 69 6e 74 20 2a 70  ebugRowid(int *p
27d30 52 63 2c 20 46 74 73 35 42 75 66 66 65 72 20 2a  Rc, Fts5Buffer *
27d40 70 42 75 66 2c 20 69 36 34 20 69 4b 65 79 29 7b  pBuf, i64 iKey){
27d50 0a 20 20 69 6e 74 20 69 53 65 67 69 64 2c 20 69  .  int iSegid, i
27d60 48 65 69 67 68 74 2c 20 69 50 67 6e 6f 2c 20 62  Height, iPgno, b
27d70 44 6c 69 64 78 3b 20 20 20 20 20 20 20 2f 2a 20  Dlidx;       /* 
27d80 52 6f 77 69 64 20 63 6f 6d 70 65 6e 65 6e 74 73  Rowid compenents
27d90 20 2a 2f 0a 20 20 66 74 73 35 44 65 63 6f 64 65   */.  fts5Decode
27da0 52 6f 77 69 64 28 69 4b 65 79 2c 20 26 69 53 65  Rowid(iKey, &iSe
27db0 67 69 64 2c 20 26 62 44 6c 69 64 78 2c 20 26 69  gid, &bDlidx, &i
27dc0 48 65 69 67 68 74 2c 20 26 69 50 67 6e 6f 29 3b  Height, &iPgno);
27dd0 0a 0a 20 20 69 66 28 20 69 53 65 67 69 64 3d 3d  ..  if( iSegid==
27de0 30 20 29 7b 0a 20 20 20 20 69 66 28 20 69 4b 65  0 ){.    if( iKe
27df0 79 3d 3d 46 54 53 35 5f 41 56 45 52 41 47 45 53  y==FTS5_AVERAGES
27e00 5f 52 4f 57 49 44 20 29 7b 0a 20 20 20 20 20 20  _ROWID ){.      
27e10 73 71 6c 69 74 65 33 46 74 73 35 42 75 66 66 65  sqlite3Fts5Buffe
27e20 72 41 70 70 65 6e 64 50 72 69 6e 74 66 28 70 52  rAppendPrintf(pR
27e30 63 2c 20 70 42 75 66 2c 20 22 28 61 76 65 72 61  c, pBuf, "(avera
27e40 67 65 73 29 20 22 29 3b 0a 20 20 20 20 7d 65 6c  ges) ");.    }el
27e50 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  se{.      sqlite
27e60 33 46 74 73 35 42 75 66 66 65 72 41 70 70 65 6e  3Fts5BufferAppen
27e70 64 50 72 69 6e 74 66 28 70 52 63 2c 20 70 42 75  dPrintf(pRc, pBu
27e80 66 2c 20 22 28 73 74 72 75 63 74 75 72 65 29 22  f, "(structure)"
27e90 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 65  );.    }.  }.  e
27ea0 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  lse{.    sqlite3
27eb0 46 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64  Fts5BufferAppend
27ec0 50 72 69 6e 74 66 28 70 52 63 2c 20 70 42 75 66  Printf(pRc, pBuf
27ed0 2c 20 22 28 25 73 73 65 67 69 64 3d 25 64 20 68  , "(%ssegid=%d h
27ee0 3d 25 64 20 70 67 6e 6f 3d 25 64 29 22 2c 0a 20  =%d pgno=%d)",. 
27ef0 20 20 20 20 20 20 20 62 44 6c 69 64 78 20 3f 20         bDlidx ? 
27f00 22 64 6c 69 64 78 20 22 20 3a 20 22 22 2c 20 69  "dlidx " : "", i
27f10 53 65 67 69 64 2c 20 69 48 65 69 67 68 74 2c 20  Segid, iHeight, 
27f20 69 50 67 6e 6f 0a 20 20 20 20 29 3b 0a 20 20 7d  iPgno.    );.  }
27f30 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .}..static void 
27f40 66 74 73 35 44 65 62 75 67 53 74 72 75 63 74 75  fts5DebugStructu
27f50 72 65 28 0a 20 20 69 6e 74 20 2a 70 52 63 2c 20  re(.  int *pRc, 
27f60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27f70 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a        /* IN/OUT:
27f80 20 65 72 72 6f 72 20 63 6f 64 65 20 2a 2f 0a 20   error code */. 
27f90 20 46 74 73 35 42 75 66 66 65 72 20 2a 70 42 75   Fts5Buffer *pBu
27fa0 66 2c 0a 20 20 46 74 73 35 53 74 72 75 63 74 75  f,.  Fts5Structu
27fb0 72 65 20 2a 70 0a 29 7b 0a 20 20 69 6e 74 20 69  re *p.){.  int i
27fc0 4c 76 6c 2c 20 69 53 65 67 3b 20 20 20 20 20 20  Lvl, iSeg;      
27fd0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 74             /* It
27fe0 65 72 61 74 65 20 74 68 72 6f 75 67 68 20 6c 65  erate through le
27ff0 76 65 6c 73 2c 20 73 65 67 6d 65 6e 74 73 20 2a  vels, segments *
28000 2f 0a 0a 20 20 66 6f 72 28 69 4c 76 6c 3d 30 3b  /..  for(iLvl=0;
28010 20 69 4c 76 6c 3c 70 2d 3e 6e 4c 65 76 65 6c 3b   iLvl<p->nLevel;
28020 20 69 4c 76 6c 2b 2b 29 7b 0a 20 20 20 20 46 74   iLvl++){.    Ft
28030 73 35 53 74 72 75 63 74 75 72 65 4c 65 76 65 6c  s5StructureLevel
28040 20 2a 70 4c 76 6c 20 3d 20 26 70 2d 3e 61 4c 65   *pLvl = &p->aLe
28050 76 65 6c 5b 69 4c 76 6c 5d 3b 0a 20 20 20 20 73  vel[iLvl];.    s
28060 71 6c 69 74 65 33 46 74 73 35 42 75 66 66 65 72  qlite3Fts5Buffer
28070 41 70 70 65 6e 64 50 72 69 6e 74 66 28 70 52 63  AppendPrintf(pRc
28080 2c 20 70 42 75 66 2c 20 0a 20 20 20 20 20 20 20  , pBuf, .       
28090 20 22 20 7b 6c 76 6c 3d 25 64 20 6e 4d 65 72 67   " {lvl=%d nMerg
280a0 65 3d 25 64 22 2c 20 69 4c 76 6c 2c 20 70 4c 76  e=%d", iLvl, pLv
280b0 6c 2d 3e 6e 4d 65 72 67 65 0a 20 20 20 20 29 3b  l->nMerge.    );
280c0 0a 20 20 20 20 66 6f 72 28 69 53 65 67 3d 30 3b  .    for(iSeg=0;
280d0 20 69 53 65 67 3c 70 4c 76 6c 2d 3e 6e 53 65 67   iSeg<pLvl->nSeg
280e0 3b 20 69 53 65 67 2b 2b 29 7b 0a 20 20 20 20 20  ; iSeg++){.     
280f0 20 46 74 73 35 53 74 72 75 63 74 75 72 65 53 65   Fts5StructureSe
28100 67 6d 65 6e 74 20 2a 70 53 65 67 20 3d 20 26 70  gment *pSeg = &p
28110 4c 76 6c 2d 3e 61 53 65 67 5b 69 53 65 67 5d 3b  Lvl->aSeg[iSeg];
28120 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 46 74  .      sqlite3Ft
28130 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 50 72  s5BufferAppendPr
28140 69 6e 74 66 28 70 52 63 2c 20 70 42 75 66 2c 20  intf(pRc, pBuf, 
28150 0a 20 20 20 20 20 20 20 20 20 20 22 20 7b 69 64  .          " {id
28160 3d 25 64 20 68 3d 25 64 20 6c 65 61 76 65 73 3d  =%d h=%d leaves=
28170 25 64 2e 2e 25 64 7d 22 2c 20 70 53 65 67 2d 3e  %d..%d}", pSeg->
28180 69 53 65 67 69 64 2c 20 70 53 65 67 2d 3e 6e 48  iSegid, pSeg->nH
28190 65 69 67 68 74 2c 20 0a 20 20 20 20 20 20 20 20  eight, .        
281a0 20 20 70 53 65 67 2d 3e 70 67 6e 6f 46 69 72 73    pSeg->pgnoFirs
281b0 74 2c 20 70 53 65 67 2d 3e 70 67 6e 6f 4c 61 73  t, pSeg->pgnoLas
281c0 74 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d  t.      );.    }
281d0 0a 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35  .    sqlite3Fts5
281e0 42 75 66 66 65 72 41 70 70 65 6e 64 50 72 69 6e  BufferAppendPrin
281f0 74 66 28 70 52 63 2c 20 70 42 75 66 2c 20 22 7d  tf(pRc, pBuf, "}
28200 22 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  ");.  }.}../*.**
28210 20 54 68 69 73 20 69 73 20 70 61 72 74 20 6f 66   This is part of
28220 20 74 68 65 20 66 74 73 35 5f 64 65 63 6f 64 65   the fts5_decode
28230 28 29 20 64 65 62 75 67 67 69 6e 67 20 61 69 64  () debugging aid
28240 2e 0a 2a 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74  ..**.** Argument
28250 73 20 70 42 6c 6f 62 2f 6e 42 6c 6f 62 20 63 6f  s pBlob/nBlob co
28260 6e 74 61 69 6e 20 61 20 73 65 72 69 61 6c 69 7a  ntain a serializ
28270 65 64 20 46 74 73 35 53 74 72 75 63 74 75 72 65  ed Fts5Structure
28280 20 6f 62 6a 65 63 74 2e 20 54 68 69 73 0a 2a 2a   object. This.**
28290 20 66 75 6e 63 74 69 6f 6e 20 61 70 70 65 6e 64   function append
282a0 73 20 61 20 68 75 6d 61 6e 2d 72 65 61 64 61 62  s a human-readab
282b0 6c 65 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f  le representatio
282c0 6e 20 6f 66 20 74 68 65 20 73 61 6d 65 20 6f 62  n of the same ob
282d0 6a 65 63 74 0a 2a 2a 20 74 6f 20 74 68 65 20 62  ject.** to the b
282e0 75 66 66 65 72 20 70 61 73 73 65 64 20 61 73 20  uffer passed as 
282f0 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  the second argum
28300 65 6e 74 2e 20 0a 2a 2f 0a 73 74 61 74 69 63 20  ent. .*/.static 
28310 76 6f 69 64 20 66 74 73 35 44 65 63 6f 64 65 53  void fts5DecodeS
28320 74 72 75 63 74 75 72 65 28 0a 20 20 69 6e 74 20  tructure(.  int 
28330 2a 70 52 63 2c 20 20 20 20 20 20 20 20 20 20 20  *pRc,           
28340 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
28350 4e 2f 4f 55 54 3a 20 65 72 72 6f 72 20 63 6f 64  N/OUT: error cod
28360 65 20 2a 2f 0a 20 20 46 74 73 35 42 75 66 66 65  e */.  Fts5Buffe
28370 72 20 2a 70 42 75 66 2c 0a 20 20 63 6f 6e 73 74  r *pBuf,.  const
28380 20 75 38 20 2a 70 42 6c 6f 62 2c 20 69 6e 74 20   u8 *pBlob, int 
28390 6e 42 6c 6f 62 0a 29 7b 0a 20 20 69 6e 74 20 72  nBlob.){.  int r
283a0 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
283b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
283c0 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 46  turn code */.  F
283d0 74 73 35 53 74 72 75 63 74 75 72 65 20 2a 70 20  ts5Structure *p 
283e0 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f  = 0;           /
283f0 2a 20 44 65 63 6f 64 65 64 20 73 74 72 75 63 74  * Decoded struct
28400 75 72 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 0a 20  ure object */.. 
28410 20 72 63 20 3d 20 66 74 73 35 53 74 72 75 63 74   rc = fts5Struct
28420 75 72 65 44 65 63 6f 64 65 28 70 42 6c 6f 62 2c  ureDecode(pBlob,
28430 20 6e 42 6c 6f 62 2c 20 30 2c 20 26 70 29 3b 0a   nBlob, 0, &p);.
28440 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
28450 5f 4f 4b 20 29 7b 0a 20 20 20 20 2a 70 52 63 20  _OK ){.    *pRc 
28460 3d 20 72 63 3b 0a 20 20 20 20 72 65 74 75 72 6e  = rc;.    return
28470 3b 0a 20 20 7d 0a 0a 20 20 66 74 73 35 44 65 62  ;.  }..  fts5Deb
28480 75 67 53 74 72 75 63 74 75 72 65 28 70 52 63 2c  ugStructure(pRc,
28490 20 70 42 75 66 2c 20 70 29 3b 0a 20 20 66 74 73   pBuf, p);.  fts
284a0 35 53 74 72 75 63 74 75 72 65 52 65 6c 65 61 73  5StructureReleas
284b0 65 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42  e(p);.}../*.** B
284c0 75 66 66 65 72 20 28 61 2f 6e 29 20 69 73 20 61  uffer (a/n) is a
284d0 73 73 75 6d 65 64 20 74 6f 20 63 6f 6e 74 61 69  ssumed to contai
284e0 6e 20 61 20 6c 69 73 74 20 6f 66 20 73 65 72 69  n a list of seri
284f0 61 6c 69 7a 65 64 20 76 61 72 69 6e 74 73 2e 20  alized varints. 
28500 52 65 61 64 0a 2a 2a 20 65 61 63 68 20 76 61 72  Read.** each var
28510 69 6e 74 20 61 6e 64 20 61 70 70 65 6e 64 20 69  int and append i
28520 74 73 20 73 74 72 69 6e 67 20 72 65 70 72 65 73  ts string repres
28530 65 6e 74 61 74 69 6f 6e 20 74 6f 20 62 75 66 66  entation to buff
28540 65 72 20 70 42 75 66 2e 20 52 65 74 75 72 6e 0a  er pBuf. Return.
28550 2a 2a 20 61 66 74 65 72 20 65 69 74 68 65 72 20  ** after either 
28560 74 68 65 20 69 6e 70 75 74 20 62 75 66 66 65 72  the input buffer
28570 20 69 73 20 65 78 68 61 75 73 74 65 64 20 6f 72   is exhausted or
28580 20 61 20 30 20 76 61 6c 75 65 20 69 73 20 72 65   a 0 value is re
28590 61 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65  ad..**.** The re
285a0 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20 74 68  turn value is th
285b0 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  e number of byte
285c0 73 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20  s read from the 
285d0 69 6e 70 75 74 20 62 75 66 66 65 72 2e 0a 2a 2f  input buffer..*/
285e0 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 35  .static int fts5
285f0 44 65 63 6f 64 65 50 6f 73 6c 69 73 74 28 69 6e  DecodePoslist(in
28600 74 20 2a 70 52 63 2c 20 46 74 73 35 42 75 66 66  t *pRc, Fts5Buff
28610 65 72 20 2a 70 42 75 66 2c 20 63 6f 6e 73 74 20  er *pBuf, const 
28620 75 38 20 2a 61 2c 20 69 6e 74 20 6e 29 7b 0a 20  u8 *a, int n){. 
28630 20 69 6e 74 20 69 4f 66 66 20 3d 20 30 3b 0a 20   int iOff = 0;. 
28640 20 77 68 69 6c 65 28 20 69 4f 66 66 3c 6e 20 29   while( iOff<n )
28650 7b 0a 20 20 20 20 69 6e 74 20 69 56 61 6c 3b 0a  {.    int iVal;.
28660 20 20 20 20 69 4f 66 66 20 2b 3d 20 66 74 73 35      iOff += fts5
28670 47 65 74 56 61 72 69 6e 74 33 32 28 26 61 5b 69  GetVarint32(&a[i
28680 4f 66 66 5d 2c 20 69 56 61 6c 29 3b 0a 20 20 20  Off], iVal);.   
28690 20 73 71 6c 69 74 65 33 46 74 73 35 42 75 66 66   sqlite3Fts5Buff
286a0 65 72 41 70 70 65 6e 64 50 72 69 6e 74 66 28 70  erAppendPrintf(p
286b0 52 63 2c 20 70 42 75 66 2c 20 22 20 25 64 22 2c  Rc, pBuf, " %d",
286c0 20 69 56 61 6c 29 3b 0a 20 20 7d 0a 20 20 72 65   iVal);.  }.  re
286d0 74 75 72 6e 20 69 4f 66 66 3b 0a 7d 0a 0a 2f 2a  turn iOff;.}../*
286e0 0a 2a 2a 20 54 68 65 20 73 74 61 72 74 20 6f 66  .** The start of
286f0 20 62 75 66 66 65 72 20 28 61 2f 6e 29 20 63 6f   buffer (a/n) co
28700 6e 74 61 69 6e 73 20 74 68 65 20 73 74 61 72 74  ntains the start
28710 20 6f 66 20 61 20 64 6f 63 6c 69 73 74 2e 20 54   of a doclist. T
28720 68 65 20 64 6f 63 6c 69 73 74 0a 2a 2a 20 6d 61  he doclist.** ma
28730 79 20 6f 72 20 6d 61 79 20 6e 6f 74 20 66 69 6e  y or may not fin
28740 69 73 68 20 77 69 74 68 69 6e 20 74 68 65 20 62  ish within the b
28750 75 66 66 65 72 2e 20 54 68 69 73 20 66 75 6e 63  uffer. This func
28760 74 69 6f 6e 20 61 70 70 65 6e 64 73 20 61 20 74  tion appends a t
28770 65 78 74 0a 2a 2a 20 72 65 70 72 65 73 65 6e 74  ext.** represent
28780 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 70 61 72  ation of the par
28790 74 20 6f 66 20 74 68 65 20 64 6f 63 6c 69 73 74  t of the doclist
287a0 20 74 68 61 74 20 69 73 20 70 72 65 73 65 6e 74   that is present
287b0 20 74 6f 20 62 75 66 66 65 72 0a 2a 2a 20 70 42   to buffer.** pB
287c0 75 66 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72  uf. .**.** The r
287d0 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20 74  eturn value is t
287e0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74  he number of byt
287f0 65 73 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65  es read from the
28800 20 69 6e 70 75 74 20 62 75 66 66 65 72 2e 0a 2a   input buffer..*
28810 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73  /.static int fts
28820 35 44 65 63 6f 64 65 44 6f 63 6c 69 73 74 28 69  5DecodeDoclist(i
28830 6e 74 20 2a 70 52 63 2c 20 46 74 73 35 42 75 66  nt *pRc, Fts5Buf
28840 66 65 72 20 2a 70 42 75 66 2c 20 63 6f 6e 73 74  fer *pBuf, const
28850 20 75 38 20 2a 61 2c 20 69 6e 74 20 6e 29 7b 0a   u8 *a, int n){.
28860 20 20 69 36 34 20 69 44 6f 63 69 64 3b 0a 20 20    i64 iDocid;.  
28870 69 6e 74 20 69 4f 66 66 20 3d 20 30 3b 0a 0a 20  int iOff = 0;.. 
28880 20 69 4f 66 66 20 3d 20 73 71 6c 69 74 65 33 46   iOff = sqlite3F
28890 74 73 35 47 65 74 56 61 72 69 6e 74 28 26 61 5b  ts5GetVarint(&a[
288a0 69 4f 66 66 5d 2c 20 28 75 36 34 2a 29 26 69 44  iOff], (u64*)&iD
288b0 6f 63 69 64 29 3b 0a 20 20 73 71 6c 69 74 65 33  ocid);.  sqlite3
288c0 46 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64  Fts5BufferAppend
288d0 50 72 69 6e 74 66 28 70 52 63 2c 20 70 42 75 66  Printf(pRc, pBuf
288e0 2c 20 22 20 72 6f 77 69 64 3d 25 6c 6c 64 22 2c  , " rowid=%lld",
288f0 20 69 44 6f 63 69 64 29 3b 0a 20 20 77 68 69 6c   iDocid);.  whil
28900 65 28 20 69 4f 66 66 3c 6e 20 29 7b 0a 20 20 20  e( iOff<n ){.   
28910 20 69 6e 74 20 6e 50 6f 73 3b 0a 20 20 20 20 69   int nPos;.    i
28920 6e 74 20 62 44 75 6d 6d 79 3b 0a 20 20 20 20 69  nt bDummy;.    i
28930 4f 66 66 20 2b 3d 20 66 74 73 35 47 65 74 50 6f  Off += fts5GetPo
28940 73 6c 69 73 74 53 69 7a 65 28 26 61 5b 69 4f 66  slistSize(&a[iOf
28950 66 5d 2c 20 26 6e 50 6f 73 2c 20 26 62 44 75 6d  f], &nPos, &bDum
28960 6d 79 29 3b 0a 20 20 20 20 69 4f 66 66 20 2b 3d  my);.    iOff +=
28970 20 66 74 73 35 44 65 63 6f 64 65 50 6f 73 6c 69   fts5DecodePosli
28980 73 74 28 70 52 63 2c 20 70 42 75 66 2c 20 26 61  st(pRc, pBuf, &a
28990 5b 69 4f 66 66 5d 2c 20 4d 49 4e 28 6e 2d 69 4f  [iOff], MIN(n-iO
289a0 66 66 2c 20 6e 50 6f 73 29 29 3b 0a 20 20 20 20  ff, nPos));.    
289b0 69 66 28 20 69 4f 66 66 3c 6e 20 29 7b 0a 20 20  if( iOff<n ){.  
289c0 20 20 20 20 69 36 34 20 69 44 65 6c 74 61 3b 0a      i64 iDelta;.
289d0 20 20 20 20 20 20 69 4f 66 66 20 2b 3d 20 73 71        iOff += sq
289e0 6c 69 74 65 33 46 74 73 35 47 65 74 56 61 72 69  lite3Fts5GetVari
289f0 6e 74 28 26 61 5b 69 4f 66 66 5d 2c 20 28 75 36  nt(&a[iOff], (u6
28a00 34 2a 29 26 69 44 65 6c 74 61 29 3b 0a 20 20 20  4*)&iDelta);.   
28a10 20 20 20 69 66 28 20 69 44 65 6c 74 61 3d 3d 30     if( iDelta==0
28a20 20 29 20 72 65 74 75 72 6e 20 69 4f 66 66 3b 0a   ) return iOff;.
28a30 20 20 20 20 20 20 69 44 6f 63 69 64 20 2b 3d 20        iDocid += 
28a40 69 44 65 6c 74 61 3b 0a 20 20 20 20 20 20 73 71  iDelta;.      sq
28a50 6c 69 74 65 33 46 74 73 35 42 75 66 66 65 72 41  lite3Fts5BufferA
28a60 70 70 65 6e 64 50 72 69 6e 74 66 28 70 52 63 2c  ppendPrintf(pRc,
28a70 20 70 42 75 66 2c 20 22 20 72 6f 77 69 64 3d 25   pBuf, " rowid=%
28a80 6c 6c 64 22 2c 20 69 44 6f 63 69 64 29 3b 0a 20  lld", iDocid);. 
28a90 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75     }.  }..  retu
28aa0 72 6e 20 69 4f 66 66 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn iOff;.}../*.*
28ab0 2a 20 54 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61  * The implementa
28ac0 74 69 6f 6e 20 6f 66 20 75 73 65 72 2d 64 65 66  tion of user-def
28ad0 69 6e 65 64 20 73 63 61 6c 61 72 20 66 75 6e 63  ined scalar func
28ae0 74 69 6f 6e 20 66 74 73 35 5f 64 65 63 6f 64 65  tion fts5_decode
28af0 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ()..*/.static vo
28b00 69 64 20 66 74 73 35 44 65 63 6f 64 65 46 75 6e  id fts5DecodeFun
28b10 63 74 69 6f 6e 28 0a 20 20 73 71 6c 69 74 65 33  ction(.  sqlite3
28b20 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74 78 2c 20  _context *pCtx, 
28b30 20 20 20 20 20 20 20 20 20 2f 2a 20 46 75 6e 63           /* Func
28b40 74 69 6f 6e 20 63 61 6c 6c 20 63 6f 6e 74 65 78  tion call contex
28b50 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 41 72 67 2c  t */.  int nArg,
28b60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28b70 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
28b80 20 6f 66 20 61 72 67 73 20 28 61 6c 77 61 79 73   of args (always
28b90 20 32 29 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33   2) */.  sqlite3
28ba0 5f 76 61 6c 75 65 20 2a 2a 61 70 56 61 6c 20 20  _value **apVal  
28bb0 20 20 20 20 20 20 20 20 20 2f 2a 20 46 75 6e 63           /* Func
28bc0 74 69 6f 6e 20 61 72 67 75 6d 65 6e 74 73 20 2a  tion arguments *
28bd0 2f 0a 29 7b 0a 20 20 69 36 34 20 69 52 6f 77 69  /.){.  i64 iRowi
28be0 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d;              
28bf0 20 20 20 20 20 20 20 2f 2a 20 52 6f 77 69 64 20         /* Rowid 
28c00 66 6f 72 20 72 65 63 6f 72 64 20 62 65 69 6e 67  for record being
28c10 20 64 65 63 6f 64 65 64 20 2a 2f 0a 20 20 69 6e   decoded */.  in
28c20 74 20 69 53 65 67 69 64 2c 69 48 65 69 67 68 74  t iSegid,iHeight
28c30 2c 69 50 67 6e 6f 2c 62 44 6c 69 64 78 3b 2f 2a  ,iPgno,bDlidx;/*
28c40 20 52 6f 77 69 64 20 63 6f 6d 70 6f 6e 65 6e 74   Rowid component
28c50 73 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 75 38 20  s */.  const u8 
28c60 2a 61 42 6c 6f 62 3b 20 69 6e 74 20 6e 3b 20 20  *aBlob; int n;  
28c70 20 20 20 20 20 20 20 2f 2a 20 52 65 63 6f 72 64         /* Record
28c80 20 74 6f 20 64 65 63 6f 64 65 20 2a 2f 0a 20 20   to decode */.  
28c90 75 38 20 2a 61 20 3d 20 30 3b 0a 20 20 46 74 73  u8 *a = 0;.  Fts
28ca0 35 42 75 66 66 65 72 20 73 3b 20 20 20 20 20 20  5Buffer s;      
28cb0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
28cc0 42 75 69 6c 64 20 75 70 20 74 65 78 74 20 74 6f  Build up text to
28cd0 20 72 65 74 75 72 6e 20 68 65 72 65 20 2a 2f 0a   return here */.
28ce0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
28cf0 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20  E_OK;           
28d00 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
28d10 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 70 61 63 65   */.  int nSpace
28d20 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28   = 0;..  assert(
28d30 20 6e 41 72 67 3d 3d 32 20 29 3b 0a 20 20 6d 65   nArg==2 );.  me
28d40 6d 73 65 74 28 26 73 2c 20 30 2c 20 73 69 7a 65  mset(&s, 0, size
28d50 6f 66 28 46 74 73 35 42 75 66 66 65 72 29 29 3b  of(Fts5Buffer));
28d60 0a 20 20 69 52 6f 77 69 64 20 3d 20 73 71 6c 69  .  iRowid = sqli
28d70 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 36 34 28  te3_value_int64(
28d80 61 70 56 61 6c 5b 30 5d 29 3b 0a 20 20 6e 20 3d  apVal[0]);.  n =
28d90 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62   sqlite3_value_b
28da0 79 74 65 73 28 61 70 56 61 6c 5b 31 5d 29 3b 0a  ytes(apVal[1]);.
28db0 20 20 61 42 6c 6f 62 20 3d 20 73 71 6c 69 74 65    aBlob = sqlite
28dc0 33 5f 76 61 6c 75 65 5f 62 6c 6f 62 28 61 70 56  3_value_blob(apV
28dd0 61 6c 5b 31 5d 29 3b 0a 0a 20 20 6e 53 70 61 63  al[1]);..  nSpac
28de0 65 20 3d 20 6e 20 2b 20 46 54 53 35 5f 44 41 54  e = n + FTS5_DAT
28df0 41 5f 5a 45 52 4f 5f 50 41 44 44 49 4e 47 3b 0a  A_ZERO_PADDING;.
28e00 20 20 61 20 3d 20 28 75 38 2a 29 73 71 6c 69 74    a = (u8*)sqlit
28e10 65 33 46 74 73 35 4d 61 6c 6c 6f 63 5a 65 72 6f  e3Fts5MallocZero
28e20 28 26 72 63 2c 20 6e 53 70 61 63 65 29 3b 0a 20  (&rc, nSpace);. 
28e30 20 69 66 28 20 61 3d 3d 30 20 29 20 67 6f 74 6f   if( a==0 ) goto
28e40 20 64 65 63 6f 64 65 5f 6f 75 74 3b 0a 20 20 6d   decode_out;.  m
28e50 65 6d 63 70 79 28 61 2c 20 61 42 6c 6f 62 2c 20  emcpy(a, aBlob, 
28e60 6e 29 3b 0a 20 20 66 74 73 35 44 65 63 6f 64 65  n);.  fts5Decode
28e70 52 6f 77 69 64 28 69 52 6f 77 69 64 2c 20 26 69  Rowid(iRowid, &i
28e80 53 65 67 69 64 2c 20 26 62 44 6c 69 64 78 2c 20  Segid, &bDlidx, 
28e90 26 69 48 65 69 67 68 74 2c 20 26 69 50 67 6e 6f  &iHeight, &iPgno
28ea0 29 3b 0a 0a 20 20 66 74 73 35 44 65 62 75 67 52  );..  fts5DebugR
28eb0 6f 77 69 64 28 26 72 63 2c 20 26 73 2c 20 69 52  owid(&rc, &s, iR
28ec0 6f 77 69 64 29 3b 0a 20 20 69 66 28 20 62 44 6c  owid);.  if( bDl
28ed0 69 64 78 20 29 7b 0a 20 20 20 20 46 74 73 35 44  idx ){.    Fts5D
28ee0 61 74 61 20 64 6c 69 64 78 3b 0a 20 20 20 20 46  ata dlidx;.    F
28ef0 74 73 35 44 6c 69 64 78 4c 76 6c 20 6c 76 6c 3b  ts5DlidxLvl lvl;
28f00 0a 0a 20 20 20 20 64 6c 69 64 78 2e 70 20 3d 20  ..    dlidx.p = 
28f10 61 3b 0a 20 20 20 20 64 6c 69 64 78 2e 6e 20 3d  a;.    dlidx.n =
28f20 20 6e 3b 0a 0a 20 20 20 20 6d 65 6d 73 65 74 28   n;..    memset(
28f30 26 6c 76 6c 2c 20 30 2c 20 73 69 7a 65 6f 66 28  &lvl, 0, sizeof(
28f40 46 74 73 35 44 6c 69 64 78 4c 76 6c 29 29 3b 0a  Fts5DlidxLvl));.
28f50 20 20 20 20 6c 76 6c 2e 70 44 61 74 61 20 3d 20      lvl.pData = 
28f60 26 64 6c 69 64 78 3b 0a 20 20 20 20 6c 76 6c 2e  &dlidx;.    lvl.
28f70 69 4c 65 61 66 50 67 6e 6f 20 3d 20 69 50 67 6e  iLeafPgno = iPgn
28f80 6f 3b 0a 0a 20 20 20 20 66 6f 72 28 66 74 73 35  o;..    for(fts5
28f90 44 6c 69 64 78 4c 76 6c 4e 65 78 74 28 26 6c 76  DlidxLvlNext(&lv
28fa0 6c 29 3b 20 6c 76 6c 2e 62 45 6f 66 3d 3d 30 3b  l); lvl.bEof==0;
28fb0 20 66 74 73 35 44 6c 69 64 78 4c 76 6c 4e 65 78   fts5DlidxLvlNex
28fc0 74 28 26 6c 76 6c 29 29 7b 0a 20 20 20 20 20 20  t(&lvl)){.      
28fd0 73 71 6c 69 74 65 33 46 74 73 35 42 75 66 66 65  sqlite3Fts5Buffe
28fe0 72 41 70 70 65 6e 64 50 72 69 6e 74 66 28 26 72  rAppendPrintf(&r
28ff0 63 2c 20 26 73 2c 20 0a 20 20 20 20 20 20 20 20  c, &s, .        
29000 20 20 22 20 25 64 28 25 6c 6c 64 29 22 2c 20 6c    " %d(%lld)", l
29010 76 6c 2e 69 4c 65 61 66 50 67 6e 6f 2c 20 6c 76  vl.iLeafPgno, lv
29020 6c 2e 69 52 6f 77 69 64 0a 20 20 20 20 20 20 29  l.iRowid.      )
29030 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20  ;.    }.  }else 
29040 69 66 28 20 69 53 65 67 69 64 3d 3d 30 20 29 7b  if( iSegid==0 ){
29050 0a 20 20 20 20 69 66 28 20 69 52 6f 77 69 64 3d  .    if( iRowid=
29060 3d 46 54 53 35 5f 41 56 45 52 41 47 45 53 5f 52  =FTS5_AVERAGES_R
29070 4f 57 49 44 20 29 7b 0a 20 20 20 20 20 20 2f 2a  OWID ){.      /*
29080 20 74 6f 64 6f 20 2a 2f 0a 20 20 20 20 7d 65 6c   todo */.    }el
29090 73 65 7b 0a 20 20 20 20 20 20 66 74 73 35 44 65  se{.      fts5De
290a0 63 6f 64 65 53 74 72 75 63 74 75 72 65 28 26 72  codeStructure(&r
290b0 63 2c 20 26 73 2c 20 61 2c 20 6e 29 3b 0a 20 20  c, &s, a, n);.  
290c0 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 0a 20 20    }.  }else{..  
290d0 20 20 46 74 73 35 42 75 66 66 65 72 20 74 65 72    Fts5Buffer ter
290e0 6d 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 74  m;.    memset(&t
290f0 65 72 6d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 46  erm, 0, sizeof(F
29100 74 73 35 42 75 66 66 65 72 29 29 3b 0a 0a 20 20  ts5Buffer));..  
29110 20 20 69 66 28 20 69 48 65 69 67 68 74 3d 3d 30    if( iHeight==0
29120 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 54   ){.      int iT
29130 65 72 6d 4f 66 66 20 3d 20 30 3b 0a 20 20 20 20  ermOff = 0;.    
29140 20 20 69 6e 74 20 69 52 6f 77 69 64 4f 66 66 20    int iRowidOff 
29150 3d 20 30 3b 0a 20 20 20 20 20 20 69 6e 74 20 69  = 0;.      int i
29160 4f 66 66 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e  Off;.      int n
29170 4b 65 65 70 20 3d 20 30 3b 0a 0a 20 20 20 20 20  Keep = 0;..     
29180 20 69 66 28 20 6e 3e 3d 34 20 29 7b 0a 20 20 20   if( n>=4 ){.   
29190 20 20 20 20 20 69 52 6f 77 69 64 4f 66 66 20 3d       iRowidOff =
291a0 20 66 74 73 35 47 65 74 55 31 36 28 26 61 5b 30   fts5GetU16(&a[0
291b0 5d 29 3b 0a 20 20 20 20 20 20 20 20 69 54 65 72  ]);.        iTer
291c0 6d 4f 66 66 20 3d 20 66 74 73 35 47 65 74 55 31  mOff = fts5GetU1
291d0 36 28 26 61 5b 32 5d 29 3b 0a 20 20 20 20 20 20  6(&a[2]);.      
291e0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
291f0 71 6c 69 74 65 33 46 74 73 35 42 75 66 66 65 72  qlite3Fts5Buffer
29200 53 65 74 28 26 72 63 2c 20 26 73 2c 20 38 2c 20  Set(&rc, &s, 8, 
29210 28 63 6f 6e 73 74 20 75 38 2a 29 22 63 6f 72 72  (const u8*)"corr
29220 75 70 74 22 29 3b 0a 20 20 20 20 20 20 20 20 67  upt");.        g
29230 6f 74 6f 20 64 65 63 6f 64 65 5f 6f 75 74 3b 0a  oto decode_out;.
29240 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69        }..      i
29250 66 28 20 69 52 6f 77 69 64 4f 66 66 20 29 7b 0a  f( iRowidOff ){.
29260 20 20 20 20 20 20 20 20 69 4f 66 66 20 3d 20 69          iOff = i
29270 52 6f 77 69 64 4f 66 66 3b 0a 20 20 20 20 20 20  RowidOff;.      
29280 7d 65 6c 73 65 20 69 66 28 20 69 54 65 72 6d 4f  }else if( iTermO
29290 66 66 20 29 7b 0a 20 20 20 20 20 20 20 20 69 4f  ff ){.        iO
292a0 66 66 20 3d 20 69 54 65 72 6d 4f 66 66 3b 0a 20  ff = iTermOff;. 
292b0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
292c0 20 20 20 20 69 4f 66 66 20 3d 20 6e 3b 0a 20 20      iOff = n;.  
292d0 20 20 20 20 7d 0a 20 20 20 20 20 20 66 74 73 35      }.      fts5
292e0 44 65 63 6f 64 65 50 6f 73 6c 69 73 74 28 26 72  DecodePoslist(&r
292f0 63 2c 20 26 73 2c 20 26 61 5b 34 5d 2c 20 69 4f  c, &s, &a[4], iO
29300 66 66 2d 34 29 3b 0a 0a 20 20 20 20 20 20 61 73  ff-4);..      as
29310 73 65 72 74 28 20 69 52 6f 77 69 64 4f 66 66 3d  sert( iRowidOff=
29320 3d 30 20 7c 7c 20 69 4f 66 66 3d 3d 69 52 6f 77  =0 || iOff==iRow
29330 69 64 4f 66 66 20 29 3b 0a 20 20 20 20 20 20 69  idOff );.      i
29340 66 28 20 69 52 6f 77 69 64 4f 66 66 20 29 7b 0a  f( iRowidOff ){.
29350 20 20 20 20 20 20 20 20 69 4f 66 66 20 2b 3d 20          iOff += 
29360 66 74 73 35 44 65 63 6f 64 65 44 6f 63 6c 69 73  fts5DecodeDoclis
29370 74 28 26 72 63 2c 20 26 73 2c 20 26 61 5b 69 4f  t(&rc, &s, &a[iO
29380 66 66 5d 2c 20 6e 2d 69 4f 66 66 29 3b 0a 20 20  ff], n-iOff);.  
29390 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 61 73 73      }..      ass
293a0 65 72 74 28 20 69 54 65 72 6d 4f 66 66 3d 3d 30  ert( iTermOff==0
293b0 20 7c 7c 20 69 4f 66 66 3d 3d 69 54 65 72 6d 4f   || iOff==iTermO
293c0 66 66 20 29 3b 0a 20 20 20 20 20 20 77 68 69 6c  ff );.      whil
293d0 65 28 20 69 4f 66 66 3c 6e 20 29 7b 0a 20 20 20  e( iOff<n ){.   
293e0 20 20 20 20 20 69 6e 74 20 6e 42 79 74 65 3b 0a       int nByte;.
293f0 20 20 20 20 20 20 20 20 69 4f 66 66 20 2b 3d 20          iOff += 
29400 66 74 73 35 47 65 74 56 61 72 69 6e 74 33 32 28  fts5GetVarint32(
29410 26 61 5b 69 4f 66 66 5d 2c 20 6e 42 79 74 65 29  &a[iOff], nByte)
29420 3b 0a 20 20 20 20 20 20 20 20 74 65 72 6d 2e 6e  ;.        term.n
29430 3d 20 6e 4b 65 65 70 3b 0a 20 20 20 20 20 20 20  = nKeep;.       
29440 20 66 74 73 35 42 75 66 66 65 72 41 70 70 65 6e   fts5BufferAppen
29450 64 42 6c 6f 62 28 26 72 63 2c 20 26 74 65 72 6d  dBlob(&rc, &term
29460 2c 20 6e 42 79 74 65 2c 20 26 61 5b 69 4f 66 66  , nByte, &a[iOff
29470 5d 29 3b 0a 20 20 20 20 20 20 20 20 69 4f 66 66  ]);.        iOff
29480 20 2b 3d 20 6e 42 79 74 65 3b 0a 0a 20 20 20 20   += nByte;..    
29490 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 42      sqlite3Fts5B
294a0 75 66 66 65 72 41 70 70 65 6e 64 50 72 69 6e 74  ufferAppendPrint
294b0 66 28 0a 20 20 20 20 20 20 20 20 20 20 20 20 26  f(.            &
294c0 72 63 2c 20 26 73 2c 20 22 20 74 65 72 6d 3d 25  rc, &s, " term=%
294d0 2e 2a 73 22 2c 20 74 65 72 6d 2e 6e 2c 20 28 63  .*s", term.n, (c
294e0 6f 6e 73 74 20 63 68 61 72 2a 29 74 65 72 6d 2e  onst char*)term.
294f0 70 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20  p.        );.   
29500 20 20 20 20 20 69 4f 66 66 20 2b 3d 20 66 74 73       iOff += fts
29510 35 44 65 63 6f 64 65 44 6f 63 6c 69 73 74 28 26  5DecodeDoclist(&
29520 72 63 2c 20 26 73 2c 20 26 61 5b 69 4f 66 66 5d  rc, &s, &a[iOff]
29530 2c 20 6e 2d 69 4f 66 66 29 3b 0a 20 20 20 20 20  , n-iOff);.     
29540 20 20 20 69 66 28 20 69 4f 66 66 3c 6e 20 29 7b     if( iOff<n ){
29550 0a 20 20 20 20 20 20 20 20 20 20 69 4f 66 66 20  .          iOff 
29560 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e 74  += fts5GetVarint
29570 33 32 28 26 61 5b 69 4f 66 66 5d 2c 20 6e 4b 65  32(&a[iOff], nKe
29580 65 70 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ep);.        }. 
29590 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 74 73       }.      fts
295a0 35 42 75 66 66 65 72 46 72 65 65 28 26 74 65 72  5BufferFree(&ter
295b0 6d 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  m);.    }else{. 
295c0 20 20 20 20 20 46 74 73 35 4e 6f 64 65 49 74 65       Fts5NodeIte
295d0 72 20 73 73 3b 0a 20 20 20 20 20 20 66 6f 72 28  r ss;.      for(
295e0 66 74 73 35 4e 6f 64 65 49 74 65 72 49 6e 69 74  fts5NodeIterInit
295f0 28 61 2c 20 6e 2c 20 26 73 73 29 3b 20 73 73 2e  (a, n, &ss); ss.
29600 61 44 61 74 61 3b 20 66 74 73 35 4e 6f 64 65 49  aData; fts5NodeI
29610 74 65 72 4e 65 78 74 28 26 72 63 2c 20 26 73 73  terNext(&rc, &ss
29620 29 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  )){.        if( 
29630 73 73 2e 74 65 72 6d 2e 6e 3d 3d 30 20 29 7b 0a  ss.term.n==0 ){.
29640 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
29650 33 46 74 73 35 42 75 66 66 65 72 41 70 70 65 6e  3Fts5BufferAppen
29660 64 50 72 69 6e 74 66 28 26 72 63 2c 20 26 73 2c  dPrintf(&rc, &s,
29670 20 22 20 6c 65 66 74 3d 25 64 22 2c 20 73 73 2e   " left=%d", ss.
29680 69 43 68 69 6c 64 29 3b 0a 20 20 20 20 20 20 20  iChild);.       
29690 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
296a0 20 20 73 71 6c 69 74 65 33 46 74 73 35 42 75 66    sqlite3Fts5Buf
296b0 66 65 72 41 70 70 65 6e 64 50 72 69 6e 74 66 28  ferAppendPrintf(
296c0 26 72 63 2c 26 73 2c 20 22 20 5c 22 25 2e 2a 73  &rc,&s, " \"%.*s
296d0 5c 22 22 2c 20 0a 20 20 20 20 20 20 20 20 20 20  \"", .          
296e0 20 20 20 20 73 73 2e 74 65 72 6d 2e 6e 2c 20 73      ss.term.n, s
296f0 73 2e 74 65 72 6d 2e 70 0a 20 20 20 20 20 20 20  s.term.p.       
29700 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a     );.        }.
29710 20 20 20 20 20 20 20 20 69 66 28 20 73 73 2e 6e          if( ss.n
29720 45 6d 70 74 79 20 29 7b 0a 20 20 20 20 20 20 20  Empty ){.       
29730 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 42 75     sqlite3Fts5Bu
29740 66 66 65 72 41 70 70 65 6e 64 50 72 69 6e 74 66  fferAppendPrintf
29750 28 26 72 63 2c 20 26 73 2c 20 22 20 65 6d 70 74  (&rc, &s, " empt
29760 79 3d 25 64 25 73 22 2c 20 73 73 2e 6e 45 6d 70  y=%d%s", ss.nEmp
29770 74 79 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ty,.            
29780 20 20 73 73 2e 62 44 6c 69 64 78 20 3f 20 22 2a    ss.bDlidx ? "*
29790 22 20 3a 20 22 22 0a 20 20 20 20 20 20 20 20 20  " : "".         
297a0 20 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   );.        }.  
297b0 20 20 20 20 7d 0a 20 20 20 20 20 20 66 74 73 35      }.      fts5
297c0 4e 6f 64 65 49 74 65 72 46 72 65 65 28 26 73 73  NodeIterFree(&ss
297d0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 0a  );.    }.  }.  .
297e0 20 64 65 63 6f 64 65 5f 6f 75 74 3a 0a 20 20 73   decode_out:.  s
297f0 71 6c 69 74 65 33 5f 66 72 65 65 28 61 29 3b 0a  qlite3_free(a);.
29800 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
29810 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  _OK ){.    sqlit
29820 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 28 70  e3_result_text(p
29830 43 74 78 2c 20 28 63 6f 6e 73 74 20 63 68 61 72  Ctx, (const char
29840 2a 29 73 2e 70 2c 20 73 2e 6e 2c 20 53 51 4c 49  *)s.p, s.n, SQLI
29850 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20  TE_TRANSIENT);. 
29860 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69   }else{.    sqli
29870 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72  te3_result_error
29880 5f 63 6f 64 65 28 70 43 74 78 2c 20 72 63 29 3b  _code(pCtx, rc);
29890 0a 20 20 7d 0a 20 20 66 74 73 35 42 75 66 66 65  .  }.  fts5Buffe
298a0 72 46 72 65 65 28 26 73 29 3b 0a 7d 0a 0a 2f 2a  rFree(&s);.}../*
298b0 0a 2a 2a 20 54 68 65 20 69 6d 70 6c 65 6d 65 6e  .** The implemen
298c0 74 61 74 69 6f 6e 20 6f 66 20 75 73 65 72 2d 64  tation of user-d
298d0 65 66 69 6e 65 64 20 73 63 61 6c 61 72 20 66 75  efined scalar fu
298e0 6e 63 74 69 6f 6e 20 66 74 73 35 5f 72 6f 77 69  nction fts5_rowi
298f0 64 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  d()..*/.static v
29900 6f 69 64 20 66 74 73 35 52 6f 77 69 64 46 75 6e  oid fts5RowidFun
29910 63 74 69 6f 6e 28 0a 20 20 73 71 6c 69 74 65 33  ction(.  sqlite3
29920 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74 78 2c 20  _context *pCtx, 
29930 20 20 20 20 20 20 20 20 20 2f 2a 20 46 75 6e 63           /* Func
29940 74 69 6f 6e 20 63 61 6c 6c 20 63 6f 6e 74 65 78  tion call contex
29950 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 41 72 67 2c  t */.  int nArg,
29960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29970 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
29980 20 6f 66 20 61 72 67 73 20 28 61 6c 77 61 79 73   of args (always
29990 20 32 29 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33   2) */.  sqlite3
299a0 5f 76 61 6c 75 65 20 2a 2a 61 70 56 61 6c 20 20  _value **apVal  
299b0 20 20 20 20 20 20 20 20 20 2f 2a 20 46 75 6e 63           /* Func
299c0 74 69 6f 6e 20 61 72 67 75 6d 65 6e 74 73 20 2a  tion arguments *
299d0 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61  /.){.  const cha
299e0 72 20 2a 7a 41 72 67 3b 0a 20 20 69 66 28 20 6e  r *zArg;.  if( n
299f0 41 72 67 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71  Arg==0 ){.    sq
29a00 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72  lite3_result_err
29a10 6f 72 28 70 43 74 78 2c 20 22 73 68 6f 75 6c 64  or(pCtx, "should
29a20 20 62 65 3a 20 66 74 73 35 5f 72 6f 77 69 64 28   be: fts5_rowid(
29a30 73 75 62 6a 65 63 74 2c 20 2e 2e 2e 2e 29 22 2c  subject, ....)",
29a40 20 2d 31 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   -1);.  }else{. 
29a50 20 20 20 7a 41 72 67 20 3d 20 28 63 6f 6e 73 74     zArg = (const
29a60 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76   char*)sqlite3_v
29a70 61 6c 75 65 5f 74 65 78 74 28 61 70 56 61 6c 5b  alue_text(apVal[
29a80 30 5d 29 3b 0a 20 20 20 20 69 66 28 20 30 3d 3d  0]);.    if( 0==
29a90 73 71 6c 69 74 65 33 5f 73 74 72 69 63 6d 70 28  sqlite3_stricmp(
29aa0 7a 41 72 67 2c 20 22 73 65 67 6d 65 6e 74 22 29  zArg, "segment")
29ab0 20 29 7b 0a 20 20 20 20 20 20 69 36 34 20 69 52   ){.      i64 iR
29ac0 6f 77 69 64 3b 0a 20 20 20 20 20 20 69 6e 74 20  owid;.      int 
29ad0 73 65 67 69 64 2c 20 68 65 69 67 68 74 2c 20 70  segid, height, p
29ae0 67 6e 6f 3b 0a 20 20 20 20 20 20 69 66 28 20 6e  gno;.      if( n
29af0 41 72 67 21 3d 34 20 29 7b 0a 20 20 20 20 20 20  Arg!=4 ){.      
29b00 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
29b10 5f 65 72 72 6f 72 28 70 43 74 78 2c 20 0a 20 20  _error(pCtx, .  
29b20 20 20 20 20 20 20 20 20 20 20 22 73 68 6f 75 6c            "shoul
29b30 64 20 62 65 3a 20 66 74 73 35 5f 72 6f 77 69 64  d be: fts5_rowid
29b40 28 27 73 65 67 6d 65 6e 74 27 2c 20 73 65 67 69  ('segment', segi
29b50 64 2c 20 68 65 69 67 68 74 2c 20 70 67 6e 6f 29  d, height, pgno)
29b60 29 22 2c 20 2d 31 0a 20 20 20 20 20 20 20 20 29  )", -1.        )
29b70 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
29b80 20 20 20 20 20 20 20 73 65 67 69 64 20 3d 20 73         segid = s
29b90 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74  qlite3_value_int
29ba0 28 61 70 56 61 6c 5b 31 5d 29 3b 0a 20 20 20 20  (apVal[1]);.    
29bb0 20 20 20 20 68 65 69 67 68 74 20 3d 20 73 71 6c      height = sql
29bc0 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 28 61  ite3_value_int(a
29bd0 70 56 61 6c 5b 32 5d 29 3b 0a 20 20 20 20 20 20  pVal[2]);.      
29be0 20 20 70 67 6e 6f 20 3d 20 73 71 6c 69 74 65 33    pgno = sqlite3
29bf0 5f 76 61 6c 75 65 5f 69 6e 74 28 61 70 56 61 6c  _value_int(apVal
29c00 5b 33 5d 29 3b 0a 20 20 20 20 20 20 20 20 69 52  [3]);.        iR
29c10 6f 77 69 64 20 3d 20 46 54 53 35 5f 53 45 47 4d  owid = FTS5_SEGM
29c20 45 4e 54 5f 52 4f 57 49 44 28 73 65 67 69 64 2c  ENT_ROWID(segid,
29c30 20 68 65 69 67 68 74 2c 20 70 67 6e 6f 29 3b 0a   height, pgno);.
29c40 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
29c50 72 65 73 75 6c 74 5f 69 6e 74 36 34 28 70 43 74  result_int64(pCt
29c60 78 2c 20 69 52 6f 77 69 64 29 3b 0a 20 20 20 20  x, iRowid);.    
29c70 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 7b 0a    }.    }else {.
29c80 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65        sqlite3_re
29c90 73 75 6c 74 5f 65 72 72 6f 72 28 70 43 74 78 2c  sult_error(pCtx,
29ca0 20 0a 20 20 20 20 20 20 20 20 22 66 69 72 73 74   .        "first
29cb0 20 61 72 67 20 74 6f 20 66 74 73 35 5f 72 6f 77   arg to fts5_row
29cc0 69 64 28 29 20 6d 75 73 74 20 62 65 20 27 73 65  id() must be 'se
29cd0 67 6d 65 6e 74 27 20 22 0a 20 20 20 20 20 20 20  gment' ".       
29ce0 20 22 6f 72 20 27 73 74 61 72 74 2d 6f 66 2d 69   "or 'start-of-i
29cf0 6e 64 65 78 27 22 0a 20 20 20 20 20 20 20 20 2c  ndex'".        ,
29d00 20 2d 31 0a 20 20 20 20 20 20 29 3b 0a 20 20 20   -1.      );.   
29d10 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
29d20 54 68 69 73 20 69 73 20 63 61 6c 6c 65 64 20 61  This is called a
29d30 73 20 70 61 72 74 20 6f 66 20 72 65 67 69 73 74  s part of regist
29d40 65 72 69 6e 67 20 74 68 65 20 46 54 53 35 20 6d  ering the FTS5 m
29d50 6f 64 75 6c 65 20 77 69 74 68 20 64 61 74 61 62  odule with datab
29d60 61 73 65 0a 2a 2a 20 63 6f 6e 6e 65 63 74 69 6f  ase.** connectio
29d70 6e 20 64 62 2e 20 49 74 20 72 65 67 69 73 74 65  n db. It registe
29d80 72 73 20 73 65 76 65 72 61 6c 20 75 73 65 72 2d  rs several user-
29d90 64 65 66 69 6e 65 64 20 73 63 61 6c 61 72 20 66  defined scalar f
29da0 75 6e 63 74 69 6f 6e 73 20 75 73 65 66 75 6c 0a  unctions useful.
29db0 2a 2a 20 77 69 74 68 20 46 54 53 35 2e 0a 2a 2a  ** with FTS5..**
29dc0 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66 75  .** If successfu
29dd0 6c 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  l, SQLITE_OK is 
29de0 72 65 74 75 72 6e 65 64 2e 20 49 66 20 61 6e 20  returned. If an 
29df0 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 73 6f  error occurs, so
29e00 6d 65 20 6f 74 68 65 72 0a 2a 2a 20 53 51 4c 69  me other.** SQLi
29e10 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  te error code is
29e20 20 72 65 74 75 72 6e 65 64 20 69 6e 73 74 65 61   returned instea
29e30 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
29e40 33 46 74 73 35 49 6e 64 65 78 49 6e 69 74 28 73  3Fts5IndexInit(s
29e50 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 69  qlite3 *db){.  i
29e60 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  nt rc = sqlite3_
29e70 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28  create_function(
29e80 0a 20 20 20 20 20 20 64 62 2c 20 22 66 74 73 35  .      db, "fts5
29e90 5f 64 65 63 6f 64 65 22 2c 20 32 2c 20 53 51 4c  _decode", 2, SQL
29ea0 49 54 45 5f 55 54 46 38 2c 20 30 2c 20 66 74 73  ITE_UTF8, 0, fts
29eb0 35 44 65 63 6f 64 65 46 75 6e 63 74 69 6f 6e 2c  5DecodeFunction,
29ec0 20 30 2c 20 30 0a 20 20 29 3b 0a 20 20 69 66 28   0, 0.  );.  if(
29ed0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
29ee0 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
29ef0 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69  e3_create_functi
29f00 6f 6e 28 0a 20 20 20 20 20 20 20 20 64 62 2c 20  on(.        db, 
29f10 22 66 74 73 35 5f 72 6f 77 69 64 22 2c 20 2d 31  "fts5_rowid", -1
29f20 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 30  , SQLITE_UTF8, 0
29f30 2c 20 66 74 73 35 52 6f 77 69 64 46 75 6e 63 74  , fts5RowidFunct
29f40 69 6f 6e 2c 20 30 2c 20 30 0a 20 20 20 20 29 3b  ion, 0, 0.    );
29f50 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
29f60 3b 0a 7d 0a 0a                                   ;.}..