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

Artifact 213e5aea27100a2ebb7a576d6574bcc28c594520:


0000: 2f 2a 0a 2a 2a 20 32 30 31 34 20 4d 61 79 20 33  /*.** 2014 May 3
0010: 31 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74 68  1.**.** The auth
0020: 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f 70  or disclaims cop
0030: 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20 73  yright to this s
0040: 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e 20  ource code.  In 
0050: 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c 65  place of.** a le
0060: 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72 65  gal notice, here
0070: 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a 0a   is a blessing:.
0080: 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f 75  **.**    May you
0090: 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f 74   do good and not
00a0: 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61 79   evil..**    May
00b0: 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69 76   you find forgiv
00c0: 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73 65  eness for yourse
00d0: 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20 6f  lf and forgive o
00e0: 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61 79  thers..**    May
00f0: 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65 6c   you share freel
0100: 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67 20  y, never taking 
0110: 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67 69  more than you gi
0120: 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ve..**.*********
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 4c 6f 77 20  *****.**.** Low 
0180: 6c 65 76 65 6c 20 61 63 63 65 73 73 20 74 6f 20  level access to 
0190: 74 68 65 20 46 54 53 20 69 6e 64 65 78 20 73 74  the FTS index st
01a0: 6f 72 65 64 20 69 6e 20 74 68 65 20 64 61 74 61  ored in the data
01b0: 62 61 73 65 20 66 69 6c 65 2e 20 54 68 65 20 0a  base file. The .
01c0: 2a 2a 20 72 6f 75 74 69 6e 65 73 20 69 6e 20 74  ** routines in t
01d0: 68 69 73 20 66 69 6c 65 20 66 69 6c 65 20 69 6d  his file file im
01e0: 70 6c 65 6d 65 6e 74 20 61 6c 6c 20 72 65 61 64  plement all read
01f0: 20 61 6e 64 20 77 72 69 74 65 20 61 63 63 65 73   and write acces
0200: 73 20 74 6f 20 74 68 65 0a 2a 2a 20 25 5f 64 61  s to the.** %_da
0210: 74 61 20 74 61 62 6c 65 2e 20 4f 74 68 65 72 20  ta table. Other 
0220: 70 61 72 74 73 20 6f 66 20 74 68 65 20 73 79 73  parts of the sys
0230: 74 65 6d 20 61 63 63 65 73 73 20 74 68 69 73 20  tem access this 
0240: 66 75 6e 63 74 69 6f 6e 61 6c 69 74 79 20 76 69  functionality vi
0250: 61 0a 2a 2a 20 74 68 65 20 69 6e 74 65 72 66 61  a.** the interfa
0260: 63 65 20 64 65 66 69 6e 65 64 20 69 6e 20 66 74  ce defined in ft
0270: 73 35 49 6e 74 2e 68 2e 0a 2a 2f 0a 0a 0a 23 69  s5Int.h..*/...#i
0280: 6e 63 6c 75 64 65 20 22 66 74 73 35 49 6e 74 2e  nclude "fts5Int.
0290: 68 22 0a 0a 2f 2a 0a 2a 2a 20 4f 76 65 72 76 69  h"../*.** Overvi
02a0: 65 77 3a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 25 5f  ew:.**.** The %_
02b0: 64 61 74 61 20 74 61 62 6c 65 20 63 6f 6e 74 61  data table conta
02c0: 69 6e 73 20 61 6c 6c 20 74 68 65 20 46 54 53 20  ins all the FTS 
02d0: 69 6e 64 65 78 65 73 20 66 6f 72 20 61 6e 20 46  indexes for an F
02e0: 54 53 35 20 76 69 72 74 75 61 6c 20 74 61 62 6c  TS5 virtual tabl
02f0: 65 2e 0a 2a 2a 20 41 73 20 77 65 6c 6c 20 61 73  e..** As well as
0300: 20 74 68 65 20 6d 61 69 6e 20 74 65 72 6d 20 69   the main term i
0310: 6e 64 65 78 2c 20 74 68 65 72 65 20 6d 61 79 20  ndex, there may 
0320: 62 65 20 75 70 20 74 6f 20 33 31 20 70 72 65 66  be up to 31 pref
0330: 69 78 20 69 6e 64 65 78 65 73 2e 0a 2a 2a 20 54  ix indexes..** T
0340: 68 65 20 66 6f 72 6d 61 74 20 69 73 20 73 69 6d  he format is sim
0350: 69 6c 61 72 20 74 6f 20 46 54 53 33 2f 34 2c 20  ilar to FTS3/4, 
0360: 65 78 63 65 70 74 20 74 68 61 74 3a 0a 2a 2a 0a  except that:.**.
0370: 2a 2a 20 20 20 2a 20 61 6c 6c 20 73 65 67 6d 65  **   * all segme
0380: 6e 74 20 62 2d 74 72 65 65 20 6c 65 61 66 20 64  nt b-tree leaf d
0390: 61 74 61 20 69 73 20 73 74 6f 72 65 64 20 69 6e  ata is stored in
03a0: 20 66 69 78 65 64 20 73 69 7a 65 20 70 61 67 65   fixed size page
03b0: 20 72 65 63 6f 72 64 73 20 0a 2a 2a 20 20 20 20   records .**    
03c0: 20 28 65 2e 67 2e 20 31 30 30 30 20 62 79 74 65   (e.g. 1000 byte
03d0: 73 29 2e 20 41 20 73 69 6e 67 6c 65 20 64 6f 63  s). A single doc
03e0: 6c 69 73 74 20 6d 61 79 20 73 70 61 6e 20 6d 75  list may span mu
03f0: 6c 74 69 70 6c 65 20 70 61 67 65 73 2e 20 43 61  ltiple pages. Ca
0400: 72 65 20 69 73 20 0a 2a 2a 20 20 20 20 20 74 61  re is .**     ta
0410: 6b 65 6e 20 74 6f 20 65 6e 73 75 72 65 20 69 74  ken to ensure it
0420: 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74 6f 20   is possible to 
0430: 69 74 65 72 61 74 65 20 69 6e 20 65 69 74 68 65  iterate in eithe
0440: 72 20 64 69 72 65 63 74 69 6f 6e 20 74 68 72 6f  r direction thro
0450: 75 67 68 20 0a 2a 2a 20 20 20 20 20 74 68 65 20  ugh .**     the 
0460: 65 6e 74 72 69 65 73 20 69 6e 20 61 20 64 6f 63  entries in a doc
0470: 6c 69 73 74 2c 20 6f 72 20 74 6f 20 73 65 65 6b  list, or to seek
0480: 20 74 6f 20 61 20 73 70 65 63 69 66 69 63 20 65   to a specific e
0490: 6e 74 72 79 20 77 69 74 68 69 6e 20 61 20 0a 2a  ntry within a .*
04a0: 2a 20 20 20 20 20 64 6f 63 6c 69 73 74 2c 20 77  *     doclist, w
04b0: 69 74 68 6f 75 74 20 6c 6f 61 64 69 6e 67 20 69  ithout loading i
04c0: 74 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 2e 0a 2a  t into memory..*
04d0: 2a 0a 2a 2a 20 20 20 2a 20 6c 61 72 67 65 20 64  *.**   * large d
04e0: 6f 63 6c 69 73 74 73 20 74 68 61 74 20 73 70 61  oclists that spa
04f0: 6e 20 6d 61 6e 79 20 70 61 67 65 73 20 68 61 76  n many pages hav
0500: 65 20 61 73 73 6f 63 69 61 74 65 64 20 22 64 6f  e associated "do
0510: 63 6c 69 73 74 20 69 6e 64 65 78 22 0a 2a 2a 20  clist index".** 
0520: 20 20 20 20 72 65 63 6f 72 64 73 20 74 68 61 74      records that
0530: 20 63 6f 6e 74 61 69 6e 20 61 20 63 6f 70 79 20   contain a copy 
0540: 6f 66 20 74 68 65 20 66 69 72 73 74 20 72 6f 77  of the first row
0550: 69 64 20 6f 6e 20 65 61 63 68 20 70 61 67 65 20  id on each page 
0560: 73 70 61 6e 6e 65 64 20 62 79 0a 2a 2a 20 20 20  spanned by.**   
0570: 20 20 74 68 65 20 64 6f 63 6c 69 73 74 2e 20 54    the doclist. T
0580: 68 69 73 20 69 73 20 75 73 65 64 20 74 6f 20 73  his is used to s
0590: 70 65 65 64 20 75 70 20 73 65 65 6b 20 6f 70 65  peed up seek ope
05a0: 72 61 74 69 6f 6e 73 2c 20 61 6e 64 20 6d 65 72  rations, and mer
05b0: 67 65 73 20 6f 66 0a 2a 2a 20 20 20 20 20 6c 61  ges of.**     la
05c0: 72 67 65 20 64 6f 63 6c 69 73 74 73 20 77 69 74  rge doclists wit
05d0: 68 20 76 65 72 79 20 73 6d 61 6c 6c 20 64 6f 63  h very small doc
05e0: 6c 69 73 74 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a  lists..**.**   *
05f0: 20 65 78 74 72 61 20 66 69 65 6c 64 73 20 69 6e   extra fields in
0600: 20 74 68 65 20 22 73 74 72 75 63 74 75 72 65 20   the "structure 
0610: 72 65 63 6f 72 64 22 20 72 65 63 6f 72 64 20 74  record" record t
0620: 68 65 20 73 74 61 74 65 20 6f 66 20 6f 6e 67 6f  he state of ongo
0630: 69 6e 67 0a 2a 2a 20 20 20 20 20 69 6e 63 72 65  ing.**     incre
0640: 6d 65 6e 74 61 6c 20 6d 65 72 67 65 20 6f 70 65  mental merge ope
0650: 72 61 74 69 6f 6e 73 2e 0a 2a 2a 0a 2a 2f 0a 0a  rations..**.*/..
0660: 0a 23 64 65 66 69 6e 65 20 46 54 53 35 5f 4f 50  .#define FTS5_OP
0670: 54 5f 57 4f 52 4b 5f 55 4e 49 54 20 20 31 30 30  T_WORK_UNIT  100
0680: 30 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20  0  /* Number of 
0690: 6c 65 61 66 20 70 61 67 65 73 20 70 65 72 20 6f  leaf pages per o
06a0: 70 74 69 6d 69 7a 65 20 73 74 65 70 20 2a 2f 0a  ptimize step */.
06b0: 23 64 65 66 69 6e 65 20 46 54 53 35 5f 57 4f 52  #define FTS5_WOR
06c0: 4b 5f 55 4e 49 54 20 20 20 20 20 20 36 34 20 20  K_UNIT      64  
06d0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6c    /* Number of l
06e0: 65 61 66 20 70 61 67 65 73 20 69 6e 20 75 6e 69  eaf pages in uni
06f0: 74 20 6f 66 20 77 6f 72 6b 20 2a 2f 0a 0a 23 64  t of work */..#d
0700: 65 66 69 6e 65 20 46 54 53 35 5f 4d 49 4e 5f 44  efine FTS5_MIN_D
0710: 4c 49 44 58 5f 53 49 5a 45 20 34 20 20 20 20 20  LIDX_SIZE 4     
0720: 2f 2a 20 41 64 64 20 64 6c 69 64 78 20 69 66 20  /* Add dlidx if 
0730: 74 68 69 73 20 6d 61 6e 79 20 65 6d 70 74 79 20  this many empty 
0740: 70 61 67 65 73 20 2a 2f 0a 0a 23 64 65 66 69 6e  pages */..#defin
0750: 65 20 46 54 53 35 5f 4d 41 49 4e 5f 50 52 45 46  e FTS5_MAIN_PREF
0760: 49 58 20 27 30 27 0a 0a 23 69 66 20 46 54 53 35  IX '0'..#if FTS5
0770: 5f 4d 41 58 5f 50 52 45 46 49 58 5f 49 4e 44 45  _MAX_PREFIX_INDE
0780: 58 45 53 20 3e 20 33 31 0a 23 20 65 72 72 6f 72  XES > 31.# error
0790: 20 22 46 54 53 35 5f 4d 41 58 5f 50 52 45 46 49   "FTS5_MAX_PREFI
07a0: 58 5f 49 4e 44 45 58 45 53 20 69 73 20 74 6f 6f  X_INDEXES is too
07b0: 20 6c 61 72 67 65 22 0a 23 65 6e 64 69 66 0a 0a   large".#endif..
07c0: 2f 2a 0a 2a 2a 20 44 65 74 61 69 6c 73 3a 0a 2a  /*.** Details:.*
07d0: 2a 0a 2a 2a 20 54 68 65 20 25 5f 64 61 74 61 20  *.** The %_data 
07e0: 74 61 62 6c 65 20 6d 61 6e 61 67 65 64 20 62 79  table managed by
07f0: 20 74 68 69 73 20 6d 6f 64 75 6c 65 2c 0a 2a 2a   this module,.**
0800: 0a 2a 2a 20 20 20 20 20 43 52 45 41 54 45 20 54  .**     CREATE T
0810: 41 42 4c 45 20 25 5f 64 61 74 61 28 69 64 20 49  ABLE %_data(id I
0820: 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b  NTEGER PRIMARY K
0830: 45 59 2c 20 62 6c 6f 63 6b 20 42 4c 4f 42 29 3b  EY, block BLOB);
0840: 0a 2a 2a 0a 2a 2a 20 2c 20 63 6f 6e 74 61 69 6e  .**.** , contain
0850: 73 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  s the following 
0860: 35 20 74 79 70 65 73 20 6f 66 20 72 65 63 6f 72  5 types of recor
0870: 64 73 2e 20 53 65 65 20 74 68 65 20 63 6f 6d 6d  ds. See the comm
0880: 65 6e 74 73 20 73 75 72 72 6f 75 6e 64 69 6e 67  ents surrounding
0890: 0a 2a 2a 20 74 68 65 20 46 54 53 35 5f 2a 5f 52  .** the FTS5_*_R
08a0: 4f 57 49 44 20 6d 61 63 72 6f 73 20 62 65 6c 6f  OWID macros belo
08b0: 77 20 66 6f 72 20 61 20 64 65 73 63 72 69 70 74  w for a descript
08c0: 69 6f 6e 20 6f 66 20 68 6f 77 20 25 5f 64 61 74  ion of how %_dat
08d0: 61 20 72 6f 77 69 64 73 20 61 72 65 20 0a 2a 2a  a rowids are .**
08e0: 20 61 73 73 69 67 6e 65 64 20 74 6f 20 65 61 63   assigned to eac
08f0: 68 20 66 6f 20 74 68 65 6d 2e 0a 2a 2a 0a 2a 2a  h fo them..**.**
0900: 20 31 2e 20 53 74 72 75 63 74 75 72 65 20 52 65   1. Structure Re
0910: 63 6f 72 64 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 54  cords:.**.**   T
0920: 68 65 20 73 65 74 20 6f 66 20 73 65 67 6d 65 6e  he set of segmen
0930: 74 73 20 74 68 61 74 20 6d 61 6b 65 20 75 70 20  ts that make up 
0940: 61 6e 20 69 6e 64 65 78 20 2d 20 74 68 65 20 69  an index - the i
0950: 6e 64 65 78 20 73 74 72 75 63 74 75 72 65 20 2d  ndex structure -
0960: 20 61 72 65 0a 2a 2a 20 20 20 72 65 63 6f 72 64   are.**   record
0970: 65 64 20 69 6e 20 61 20 73 69 6e 67 6c 65 20 72  ed in a single r
0980: 65 63 6f 72 64 20 77 69 74 68 69 6e 20 74 68 65  ecord within the
0990: 20 25 5f 64 61 74 61 20 74 61 62 6c 65 2e 20 54   %_data table. T
09a0: 68 65 20 72 65 63 6f 72 64 20 63 6f 6e 73 69 73  he record consis
09b0: 74 73 0a 2a 2a 20 20 20 6f 66 20 61 20 73 69 6e  ts.**   of a sin
09c0: 67 6c 65 20 33 32 2d 62 69 74 20 63 6f 6e 66 69  gle 32-bit confi
09d0: 67 75 72 61 74 69 6f 6e 20 63 6f 6f 6b 69 65 20  guration cookie 
09e0: 76 61 6c 75 65 20 66 6f 6c 6c 6f 77 65 64 20 62  value followed b
09f0: 79 20 61 20 6c 69 73 74 20 6f 66 20 0a 2a 2a 20  y a list of .** 
0a00: 20 20 53 51 4c 69 74 65 20 76 61 72 69 6e 74 73    SQLite varints
0a10: 2e 20 49 66 20 74 68 65 20 46 54 53 20 74 61 62  . If the FTS tab
0a20: 6c 65 20 66 65 61 74 75 72 65 73 20 6d 6f 72 65  le features more
0a30: 20 74 68 61 6e 20 6f 6e 65 20 69 6e 64 65 78 20   than one index 
0a40: 28 62 65 63 61 75 73 65 0a 2a 2a 20 20 20 74 68  (because.**   th
0a50: 65 72 65 20 61 72 65 20 6f 6e 65 20 6f 72 20 6d  ere are one or m
0a60: 6f 72 65 20 70 72 65 66 69 78 20 69 6e 64 65 78  ore prefix index
0a70: 65 73 29 2c 20 69 74 20 69 73 20 67 75 61 72 61  es), it is guara
0a80: 6e 74 65 65 64 20 74 68 61 74 20 61 6c 6c 20 73  nteed that all s
0a90: 68 61 72 65 0a 2a 2a 20 20 20 74 68 65 20 73 61  hare.**   the sa
0aa0: 6d 65 20 63 6f 6f 6b 69 65 20 76 61 6c 75 65 2e  me cookie value.
0ab0: 0a 2a 2a 0a 2a 2a 20 20 20 49 6d 6d 65 64 69 61  .**.**   Immedia
0ac0: 74 65 6c 79 20 66 6f 6c 6c 6f 77 69 6e 67 20 74  tely following t
0ad0: 68 65 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e  he configuration
0ae0: 20 63 6f 6f 6b 69 65 2c 20 74 68 65 20 72 65 63   cookie, the rec
0af0: 6f 72 64 20 62 65 67 69 6e 73 20 77 69 74 68 0a  ord begins with.
0b00: 2a 2a 20 20 20 74 68 72 65 65 20 76 61 72 69 6e  **   three varin
0b10: 74 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2b 20  ts:.**.**     + 
0b20: 6e 75 6d 62 65 72 20 6f 66 20 6c 65 76 65 6c 73  number of levels
0b30: 2c 0a 2a 2a 20 20 20 20 20 2b 20 74 6f 74 61 6c  ,.**     + total
0b40: 20 6e 75 6d 62 65 72 20 6f 66 20 73 65 67 6d 65   number of segme
0b50: 6e 74 73 20 6f 6e 20 61 6c 6c 20 6c 65 76 65 6c  nts on all level
0b60: 73 2c 0a 2a 2a 20 20 20 20 20 2b 20 76 61 6c 75  s,.**     + valu
0b70: 65 20 6f 66 20 77 72 69 74 65 20 63 6f 75 6e 74  e of write count
0b80: 65 72 2e 0a 2a 2a 0a 2a 2a 20 20 20 54 68 65 6e  er..**.**   Then
0b90: 2c 20 66 6f 72 20 65 61 63 68 20 6c 65 76 65 6c  , for each level
0ba0: 20 66 72 6f 6d 20 30 20 74 6f 20 6e 4d 61 78 3a   from 0 to nMax:
0bb0: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2b 20 6e 75 6d  .**.**     + num
0bc0: 62 65 72 20 6f 66 20 69 6e 70 75 74 20 73 65 67  ber of input seg
0bd0: 6d 65 6e 74 73 20 69 6e 20 6f 6e 67 6f 69 6e 67  ments in ongoing
0be0: 20 6d 65 72 67 65 2e 0a 2a 2a 20 20 20 20 20 2b   merge..**     +
0bf0: 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66   total number of
0c00: 20 73 65 67 6d 65 6e 74 73 20 69 6e 20 6c 65 76   segments in lev
0c10: 65 6c 2e 0a 2a 2a 20 20 20 20 20 2b 20 66 6f 72  el..**     + for
0c20: 20 65 61 63 68 20 73 65 67 6d 65 6e 74 20 66 72   each segment fr
0c30: 6f 6d 20 6f 6c 64 65 73 74 20 74 6f 20 6e 65 77  om oldest to new
0c40: 65 73 74 3a 0a 2a 2a 20 20 20 20 20 20 20 20 20  est:.**         
0c50: 2b 20 73 65 67 6d 65 6e 74 20 69 64 20 28 61 6c  + segment id (al
0c60: 77 61 79 73 20 3e 20 30 29 0a 2a 2a 20 20 20 20  ways > 0).**    
0c70: 20 20 20 20 20 2b 20 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 72 6f 77 69      * First rowi
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: 72 6f 77 69 64 2c 20 0a 2a 2a 20 20 20 20 20 20  rowid, .**      
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 72 6f 77 69 64 20 6f 6e 20 70 61 67 65 20 69   rowid 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 72 6f 77 69 64 20 6f 6e 20 65 61 63 68 20 73   rowid 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: 23 64 65 66 69 6e 65 20 46 54 53 35 5f 44 41 54  #define FTS5_DAT
2910: 41 5f 50 41 44 44 49 4e 47 20 32 30 0a 0a 74 79  A_PADDING 20..ty
2920: 70 65 64 65 66 20 73 74 72 75 63 74 20 46 74 73  pedef struct Fts
2930: 35 44 61 74 61 20 46 74 73 35 44 61 74 61 3b 0a  5Data Fts5Data;.
2940: 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 46  typedef struct F
2950: 74 73 35 44 6c 69 64 78 49 74 65 72 20 46 74 73  ts5DlidxIter Fts
2960: 35 44 6c 69 64 78 49 74 65 72 3b 0a 74 79 70 65  5DlidxIter;.type
2970: 64 65 66 20 73 74 72 75 63 74 20 46 74 73 35 44  def struct Fts5D
2980: 6c 69 64 78 4c 76 6c 20 46 74 73 35 44 6c 69 64  lidxLvl Fts5Dlid
2990: 78 4c 76 6c 3b 0a 74 79 70 65 64 65 66 20 73 74  xLvl;.typedef st
29a0: 72 75 63 74 20 46 74 73 35 44 6c 69 64 78 57 72  ruct Fts5DlidxWr
29b0: 69 74 65 72 20 46 74 73 35 44 6c 69 64 78 57 72  iter Fts5DlidxWr
29c0: 69 74 65 72 3b 0a 74 79 70 65 64 65 66 20 73 74  iter;.typedef st
29d0: 72 75 63 74 20 46 74 73 35 50 61 67 65 57 72 69  ruct Fts5PageWri
29e0: 74 65 72 20 46 74 73 35 50 61 67 65 57 72 69 74  ter Fts5PageWrit
29f0: 65 72 3b 0a 74 79 70 65 64 65 66 20 73 74 72 75  er;.typedef stru
2a00: 63 74 20 46 74 73 35 53 65 67 49 74 65 72 20 46  ct Fts5SegIter F
2a10: 74 73 35 53 65 67 49 74 65 72 3b 0a 74 79 70 65  ts5SegIter;.type
2a20: 64 65 66 20 73 74 72 75 63 74 20 46 74 73 35 44  def struct Fts5D
2a30: 6f 63 6c 69 73 74 49 74 65 72 20 46 74 73 35 44  oclistIter Fts5D
2a40: 6f 63 6c 69 73 74 49 74 65 72 3b 0a 74 79 70 65  oclistIter;.type
2a50: 64 65 66 20 73 74 72 75 63 74 20 46 74 73 35 53  def struct Fts5S
2a60: 65 67 57 72 69 74 65 72 20 46 74 73 35 53 65 67  egWriter Fts5Seg
2a70: 57 72 69 74 65 72 3b 0a 74 79 70 65 64 65 66 20  Writer;.typedef 
2a80: 73 74 72 75 63 74 20 46 74 73 35 53 74 72 75 63  struct Fts5Struc
2a90: 74 75 72 65 20 46 74 73 35 53 74 72 75 63 74 75  ture Fts5Structu
2aa0: 72 65 3b 0a 74 79 70 65 64 65 66 20 73 74 72 75  re;.typedef stru
2ab0: 63 74 20 46 74 73 35 53 74 72 75 63 74 75 72 65  ct Fts5Structure
2ac0: 4c 65 76 65 6c 20 46 74 73 35 53 74 72 75 63 74  Level Fts5Struct
2ad0: 75 72 65 4c 65 76 65 6c 3b 0a 74 79 70 65 64 65  ureLevel;.typede
2ae0: 66 20 73 74 72 75 63 74 20 46 74 73 35 53 74 72  f struct Fts5Str
2af0: 75 63 74 75 72 65 53 65 67 6d 65 6e 74 20 46 74  uctureSegment Ft
2b00: 73 35 53 74 72 75 63 74 75 72 65 53 65 67 6d 65  s5StructureSegme
2b10: 6e 74 3b 0a 0a 73 74 72 75 63 74 20 46 74 73 35  nt;..struct Fts5
2b20: 44 61 74 61 20 7b 0a 20 20 75 38 20 2a 70 3b 20  Data {.  u8 *p; 
2b30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b40: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e           /* Poin
2b50: 74 65 72 20 74 6f 20 62 75 66 66 65 72 20 63 6f  ter to buffer co
2b60: 6e 74 61 69 6e 69 6e 67 20 72 65 63 6f 72 64 20  ntaining record 
2b70: 2a 2f 0a 20 20 69 6e 74 20 6e 6e 3b 20 20 20 20  */.  int nn;    
2b80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b90: 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
2ba0: 72 65 63 6f 72 64 20 69 6e 20 62 79 74 65 73 20  record in bytes 
2bb0: 2a 2f 0a 20 20 69 6e 74 20 73 7a 4c 65 61 66 3b  */.  int szLeaf;
2bc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bd0: 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
2be0: 6c 65 61 66 20 77 69 74 68 6f 75 74 20 70 61 67  leaf without pag
2bf0: 65 2d 69 6e 64 65 78 20 2a 2f 0a 7d 3b 0a 0a 2f  e-index */.};../
2c00: 2a 0a 2a 2a 20 4f 6e 65 20 6f 62 6a 65 63 74 20  *.** One object 
2c10: 70 65 72 20 25 5f 64 61 74 61 20 74 61 62 6c 65  per %_data table
2c20: 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 46 74 73 35  ..*/.struct Fts5
2c30: 49 6e 64 65 78 20 7b 0a 20 20 46 74 73 35 43 6f  Index {.  Fts5Co
2c40: 6e 66 69 67 20 2a 70 43 6f 6e 66 69 67 3b 20 20  nfig *pConfig;  
2c50: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 69 72            /* Vir
2c60: 74 75 61 6c 20 74 61 62 6c 65 20 63 6f 6e 66 69  tual table confi
2c70: 67 75 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 63 68  guration */.  ch
2c80: 61 72 20 2a 7a 44 61 74 61 54 62 6c 3b 20 20 20  ar *zDataTbl;   
2c90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2ca0: 20 4e 61 6d 65 20 6f 66 20 25 5f 64 61 74 61 20   Name of %_data 
2cb0: 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e  table */.  int n
2cc0: 57 6f 72 6b 55 6e 69 74 3b 20 20 20 20 20 20 20  WorkUnit;       
2cd0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65             /* Le
2ce0: 61 66 20 70 61 67 65 73 20 69 6e 20 61 20 22 75  af pages in a "u
2cf0: 6e 69 74 22 20 6f 66 20 77 6f 72 6b 20 2a 2f 0a  nit" of work */.
2d00: 0a 20 20 2f 2a 0a 20 20 2a 2a 20 56 61 72 69 61  .  /*.  ** Varia
2d10: 62 6c 65 73 20 72 65 6c 61 74 65 64 20 74 6f 20  bles related to 
2d20: 74 68 65 20 61 63 63 75 6d 75 6c 61 74 69 6f 6e  the accumulation
2d30: 20 6f 66 20 74 6f 6b 65 6e 73 20 61 6e 64 20 64   of tokens and d
2d40: 6f 63 6c 69 73 74 73 20 77 69 74 68 69 6e 20 74  oclists within t
2d50: 68 65 0a 20 20 2a 2a 20 69 6e 2d 6d 65 6d 6f 72  he.  ** in-memor
2d60: 79 20 68 61 73 68 20 74 61 62 6c 65 73 20 62 65  y hash tables be
2d70: 66 6f 72 65 20 74 68 65 79 20 61 72 65 20 66 6c  fore they are fl
2d80: 75 73 68 65 64 20 74 6f 20 64 69 73 6b 2e 0a 20  ushed to disk.. 
2d90: 20 2a 2f 0a 20 20 46 74 73 35 48 61 73 68 20 2a   */.  Fts5Hash *
2da0: 70 48 61 73 68 3b 20 20 20 20 20 20 20 20 20 20  pHash;          
2db0: 20 20 20 20 20 20 2f 2a 20 48 61 73 68 20 74 61        /* Hash ta
2dc0: 62 6c 65 20 66 6f 72 20 69 6e 2d 6d 65 6d 6f 72  ble for in-memor
2dd0: 79 20 64 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20  y data */.  int 
2de0: 6e 4d 61 78 50 65 6e 64 69 6e 67 44 61 74 61 3b  nMaxPendingData;
2df0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
2e00: 61 78 20 70 65 6e 64 69 6e 67 20 64 61 74 61 20  ax pending data 
2e10: 62 65 66 6f 72 65 20 66 6c 75 73 68 20 74 6f 20  before flush to 
2e20: 64 69 73 6b 20 2a 2f 0a 20 20 69 6e 74 20 6e 50  disk */.  int nP
2e30: 65 6e 64 69 6e 67 44 61 74 61 3b 20 20 20 20 20  endingData;     
2e40: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72            /* Cur
2e50: 72 65 6e 74 20 62 79 74 65 73 20 6f 66 20 70 65  rent bytes of pe
2e60: 6e 64 69 6e 67 20 64 61 74 61 20 2a 2f 0a 20 20  nding data */.  
2e70: 69 36 34 20 69 57 72 69 74 65 52 6f 77 69 64 3b  i64 iWriteRowid;
2e80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e90: 2f 2a 20 52 6f 77 69 64 20 66 6f 72 20 63 75 72  /* Rowid for cur
2ea0: 72 65 6e 74 20 64 6f 63 20 62 65 69 6e 67 20 77  rent doc being w
2eb0: 72 69 74 74 65 6e 20 2a 2f 0a 20 20 46 74 73 35  ritten */.  Fts5
2ec0: 42 75 66 66 65 72 20 73 63 72 61 74 63 68 3b 0a  Buffer scratch;.
2ed0: 0a 20 20 2f 2a 20 45 72 72 6f 72 20 73 74 61 74  .  /* Error stat
2ee0: 65 2e 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20  e. */.  int rc; 
2ef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f00: 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65          /* Curre
2f10: 6e 74 20 65 72 72 6f 72 20 63 6f 64 65 20 2a 2f  nt error code */
2f20: 0a 0a 20 20 2f 2a 20 53 74 61 74 65 20 75 73 65  ..  /* State use
2f30: 64 20 62 79 20 74 68 65 20 66 74 73 35 44 61 74  d by the fts5Dat
2f40: 61 58 58 58 28 29 20 66 75 6e 63 74 69 6f 6e 73  aXXX() functions
2f50: 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 62  . */.  sqlite3_b
2f60: 6c 6f 62 20 2a 70 52 65 61 64 65 72 3b 20 20 20  lob *pReader;   
2f70: 20 20 20 20 20 20 20 2f 2a 20 52 4f 20 69 6e 63         /* RO inc
2f80: 72 2d 62 6c 6f 62 20 6f 70 65 6e 20 6f 6e 20 25  r-blob open on %
2f90: 5f 64 61 74 61 20 74 61 62 6c 65 20 2a 2f 0a 20  _data table */. 
2fa0: 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
2fb0: 57 72 69 74 65 72 3b 20 20 20 20 20 20 20 20 20  Writer;         
2fc0: 20 2f 2a 20 22 49 4e 53 45 52 54 20 2e 2e 2e 20   /* "INSERT ... 
2fd0: 25 5f 64 61 74 61 20 56 41 4c 55 45 53 28 3f 2c  %_data VALUES(?,
2fe0: 3f 29 22 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ?)" */.  sqlite3
2ff0: 5f 73 74 6d 74 20 2a 70 44 65 6c 65 74 65 72 3b  _stmt *pDeleter;
3000: 20 20 20 20 20 20 20 20 20 2f 2a 20 22 44 45 4c           /* "DEL
3010: 45 54 45 20 46 52 4f 4d 20 25 5f 64 61 74 61 20  ETE FROM %_data 
3020: 2e 2e 2e 20 69 64 3e 3d 3f 20 41 4e 44 20 69 64  ... id>=? AND id
3030: 3c 3d 3f 22 20 2a 2f 0a 20 20 73 71 6c 69 74 65  <=?" */.  sqlite
3040: 33 5f 73 74 6d 74 20 2a 70 49 64 78 57 72 69 74  3_stmt *pIdxWrit
3050: 65 72 3b 20 20 20 20 20 20 20 2f 2a 20 22 49 4e  er;       /* "IN
3060: 53 45 52 54 20 2e 2e 2e 20 25 5f 69 64 78 20 56  SERT ... %_idx V
3070: 41 4c 55 45 53 28 3f 2c 3f 2c 3f 2c 3f 29 22 20  ALUES(?,?,?,?)" 
3080: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  */.  sqlite3_stm
3090: 74 20 2a 70 49 64 78 44 65 6c 65 74 65 72 3b 20  t *pIdxDeleter; 
30a0: 20 20 20 20 20 2f 2a 20 22 44 45 4c 45 54 45 20       /* "DELETE 
30b0: 46 52 4f 4d 20 25 5f 69 64 78 20 57 48 45 52 45  FROM %_idx WHERE
30c0: 20 73 65 67 69 64 3d 3f 20 2a 2f 0a 20 20 73 71   segid=? */.  sq
30d0: 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 49 64 78  lite3_stmt *pIdx
30e0: 53 65 6c 65 63 74 3b 0a 20 20 69 6e 74 20 6e 52  Select;.  int nR
30f0: 65 61 64 3b 20 20 20 20 20 20 20 20 20 20 20 20  ead;            
3100: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 74            /* Tot
3110: 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 62 6c 6f  al number of blo
3120: 63 6b 73 20 72 65 61 64 20 2a 2f 0a 7d 3b 0a 0a  cks read */.};..
3130: 73 74 72 75 63 74 20 46 74 73 35 44 6f 63 6c 69  struct Fts5Docli
3140: 73 74 49 74 65 72 20 7b 0a 20 20 75 38 20 2a 61  stIter {.  u8 *a
3150: 3b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 69 6e 74  ;.  int n;.  int
3160: 20 69 3b 0a 0a 20 20 2f 2a 20 4f 75 74 70 75 74   i;..  /* Output
3170: 20 76 61 72 69 61 62 6c 65 73 2e 20 61 50 6f 73   variables. aPos
3180: 6c 69 73 74 3d 3d 30 20 61 74 20 45 4f 46 20 2a  list==0 at EOF *
3190: 2f 0a 20 20 69 36 34 20 69 52 6f 77 69 64 3b 0a  /.  i64 iRowid;.
31a0: 20 20 75 38 20 2a 61 50 6f 73 6c 69 73 74 3b 0a    u8 *aPoslist;.
31b0: 20 20 69 6e 74 20 6e 50 6f 73 6c 69 73 74 3b 0a    int nPoslist;.
31c0: 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 63 6f  };../*.** The co
31d0: 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 22 73  ntents of the "s
31e0: 74 72 75 63 74 75 72 65 22 20 72 65 63 6f 72 64  tructure" record
31f0: 20 66 6f 72 20 65 61 63 68 20 69 6e 64 65 78 20   for each index 
3200: 61 72 65 20 72 65 70 72 65 73 65 6e 74 65 64 0a  are represented.
3210: 2a 2a 20 75 73 69 6e 67 20 61 6e 20 46 74 73 35  ** using an Fts5
3220: 53 74 72 75 63 74 75 72 65 20 72 65 63 6f 72 64  Structure record
3230: 20 69 6e 20 6d 65 6d 6f 72 79 2e 20 57 68 69 63   in memory. Whic
3240: 68 20 75 73 65 73 20 69 6e 73 74 61 6e 63 65 73  h uses instances
3250: 20 6f 66 20 74 68 65 20 0a 2a 2a 20 6f 74 68 65   of the .** othe
3260: 72 20 46 74 73 35 53 74 72 75 63 74 75 72 65 58  r Fts5StructureX
3270: 58 58 20 74 79 70 65 73 20 61 73 20 63 6f 6d 70  XX types as comp
3280: 6f 6e 65 6e 74 73 2e 0a 2a 2f 0a 73 74 72 75 63  onents..*/.struc
3290: 74 20 46 74 73 35 53 74 72 75 63 74 75 72 65 53  t Fts5StructureS
32a0: 65 67 6d 65 6e 74 20 7b 0a 20 20 69 6e 74 20 69  egment {.  int i
32b0: 53 65 67 69 64 3b 20 20 20 20 20 20 20 20 20 20  Segid;          
32c0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65             /* Se
32d0: 67 6d 65 6e 74 20 69 64 20 2a 2f 0a 20 20 69 6e  gment id */.  in
32e0: 74 20 6e 48 65 69 67 68 74 3b 20 20 20 20 20 20  t nHeight;      
32f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
3300: 20 48 65 69 67 68 74 20 6f 66 20 73 65 67 6d 65   Height of segme
3310: 6e 74 20 62 2d 74 72 65 65 20 2a 2f 0a 20 20 69  nt b-tree */.  i
3320: 6e 74 20 70 67 6e 6f 46 69 72 73 74 3b 20 20 20  nt pgnoFirst;   
3330: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
3340: 2a 20 46 69 72 73 74 20 6c 65 61 66 20 70 61 67  * First leaf pag
3350: 65 20 6e 75 6d 62 65 72 20 69 6e 20 73 65 67 6d  e number in segm
3360: 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 70 67 6e  ent */.  int pgn
3370: 6f 4c 61 73 74 3b 20 20 20 20 20 20 20 20 20 20  oLast;          
3380: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 61 73 74           /* Last
3390: 20 6c 65 61 66 20 70 61 67 65 20 6e 75 6d 62 65   leaf page numbe
33a0: 72 20 69 6e 20 73 65 67 6d 65 6e 74 20 2a 2f 0a  r in segment */.
33b0: 7d 3b 0a 73 74 72 75 63 74 20 46 74 73 35 53 74  };.struct Fts5St
33c0: 72 75 63 74 75 72 65 4c 65 76 65 6c 20 7b 0a 20  ructureLevel {. 
33d0: 20 69 6e 74 20 6e 4d 65 72 67 65 3b 20 20 20 20   int nMerge;    
33e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33f0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 73 65   /* Number of se
3400: 67 6d 65 6e 74 73 20 69 6e 20 69 6e 63 72 2d 6d  gments in incr-m
3410: 65 72 67 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 53  erge */.  int nS
3420: 65 67 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  eg;             
3430: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 74            /* Tot
3440: 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 73 65 67  al number of seg
3450: 6d 65 6e 74 73 20 6f 6e 20 6c 65 76 65 6c 20 2a  ments on level *
3460: 2f 0a 20 20 46 74 73 35 53 74 72 75 63 74 75 72  /.  Fts5Structur
3470: 65 53 65 67 6d 65 6e 74 20 2a 61 53 65 67 3b 20  eSegment *aSeg; 
3480: 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20      /* Array of 
3490: 73 65 67 6d 65 6e 74 73 2e 20 61 53 65 67 5b 30  segments. aSeg[0
34a0: 5d 20 69 73 20 6f 6c 64 65 73 74 2e 20 2a 2f 0a  ] is oldest. */.
34b0: 7d 3b 0a 73 74 72 75 63 74 20 46 74 73 35 53 74  };.struct Fts5St
34c0: 72 75 63 74 75 72 65 20 7b 0a 20 20 69 6e 74 20  ructure {.  int 
34d0: 6e 52 65 66 3b 20 20 20 20 20 20 20 20 20 20 20  nRef;           
34e0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
34f0: 62 6a 65 63 74 20 72 65 66 65 72 65 6e 63 65 20  bject reference 
3500: 63 6f 75 6e 74 20 2a 2f 0a 20 20 75 36 34 20 6e  count */.  u64 n
3510: 57 72 69 74 65 43 6f 75 6e 74 65 72 3b 20 20 20  WriteCounter;   
3520: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f             /* To
3530: 74 61 6c 20 6c 65 61 76 65 73 20 77 72 69 74 74  tal leaves writt
3540: 65 6e 20 74 6f 20 6c 65 76 65 6c 20 30 20 2a 2f  en to level 0 */
3550: 0a 20 20 69 6e 74 20 6e 53 65 67 6d 65 6e 74 3b  .  int nSegment;
3560: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3570: 20 20 20 2f 2a 20 54 6f 74 61 6c 20 73 65 67 6d     /* Total segm
3580: 65 6e 74 73 20 69 6e 20 74 68 69 73 20 73 74 72  ents in this str
3590: 75 63 74 75 72 65 20 2a 2f 0a 20 20 69 6e 74 20  ucture */.  int 
35a0: 6e 4c 65 76 65 6c 3b 20 20 20 20 20 20 20 20 20  nLevel;         
35b0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
35c0: 75 6d 62 65 72 20 6f 66 20 6c 65 76 65 6c 73 20  umber of levels 
35d0: 69 6e 20 74 68 69 73 20 69 6e 64 65 78 20 2a 2f  in this index */
35e0: 0a 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65  .  Fts5Structure
35f0: 4c 65 76 65 6c 20 61 4c 65 76 65 6c 5b 31 5d 3b  Level aLevel[1];
3600: 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 6e     /* Array of n
3610: 4c 65 76 65 6c 20 6c 65 76 65 6c 20 6f 62 6a 65  Level level obje
3620: 63 74 73 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  cts */.};../*.**
3630: 20 41 6e 20 6f 62 6a 65 63 74 20 6f 66 20 74 79   An object of ty
3640: 70 65 20 46 74 73 35 53 65 67 57 72 69 74 65 72  pe Fts5SegWriter
3650: 20 69 73 20 75 73 65 64 20 74 6f 20 77 72 69 74   is used to writ
3660: 65 20 74 6f 20 73 65 67 6d 65 6e 74 73 2e 0a 2a  e to segments..*
3670: 2f 0a 73 74 72 75 63 74 20 46 74 73 35 50 61 67  /.struct Fts5Pag
3680: 65 57 72 69 74 65 72 20 7b 0a 20 20 69 6e 74 20  eWriter {.  int 
3690: 70 67 6e 6f 3b 20 20 20 20 20 20 20 20 20 20 20  pgno;           
36a0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
36b0: 61 67 65 20 6e 75 6d 62 65 72 20 66 6f 72 20 74  age number for t
36c0: 68 69 73 20 70 61 67 65 20 2a 2f 0a 20 20 46 74  his page */.  Ft
36d0: 73 35 42 75 66 66 65 72 20 62 75 66 3b 20 20 20  s5Buffer buf;   
36e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
36f0: 20 42 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69   Buffer containi
3700: 6e 67 20 6c 65 61 66 20 64 61 74 61 20 2a 2f 0a  ng leaf data */.
3710: 20 20 46 74 73 35 42 75 66 66 65 72 20 70 67 69    Fts5Buffer pgi
3720: 64 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  dx;             
3730: 20 20 2f 2a 20 42 75 66 66 65 72 20 63 6f 6e 74    /* Buffer cont
3740: 61 69 6e 69 6e 67 20 70 61 67 65 2d 69 6e 64 65  aining page-inde
3750: 78 20 2a 2f 0a 20 20 46 74 73 35 42 75 66 66 65  x */.  Fts5Buffe
3760: 72 20 74 65 72 6d 3b 20 20 20 20 20 20 20 20 20  r term;         
3770: 20 20 20 20 20 20 20 2f 2a 20 42 75 66 66 65 72         /* Buffer
3780: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 70 72 65 76   containing prev
3790: 69 6f 75 73 20 74 65 72 6d 20 6f 6e 20 70 61 67  ious term on pag
37a0: 65 20 2a 2f 0a 7d 3b 0a 73 74 72 75 63 74 20 46  e */.};.struct F
37b0: 74 73 35 44 6c 69 64 78 57 72 69 74 65 72 20 7b  ts5DlidxWriter {
37c0: 0a 20 20 69 6e 74 20 70 67 6e 6f 3b 20 20 20 20  .  int pgno;    
37d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37e0: 20 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65     /* Page numbe
37f0: 72 20 66 6f 72 20 74 68 69 73 20 70 61 67 65 20  r for this page 
3800: 2a 2f 0a 20 20 69 6e 74 20 62 50 72 65 76 56 61  */.  int bPrevVa
3810: 6c 69 64 3b 20 20 20 20 20 20 20 20 20 20 20 20  lid;            
3820: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
3830: 69 50 72 65 76 20 69 73 20 76 61 6c 69 64 20 2a  iPrev is valid *
3840: 2f 0a 20 20 69 36 34 20 69 50 72 65 76 3b 20 20  /.  i64 iPrev;  
3850: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3860: 20 20 20 20 2f 2a 20 50 72 65 76 69 6f 75 73 20      /* Previous 
3870: 72 6f 77 69 64 20 76 61 6c 75 65 20 77 72 69 74  rowid value writ
3880: 74 65 6e 20 74 6f 20 70 61 67 65 20 2a 2f 0a 20  ten to page */. 
3890: 20 46 74 73 35 42 75 66 66 65 72 20 62 75 66 3b   Fts5Buffer buf;
38a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
38b0: 20 2f 2a 20 42 75 66 66 65 72 20 63 6f 6e 74 61   /* Buffer conta
38c0: 69 6e 69 6e 67 20 70 61 67 65 20 64 61 74 61 20  ining page data 
38d0: 2a 2f 0a 7d 3b 0a 73 74 72 75 63 74 20 46 74 73  */.};.struct Fts
38e0: 35 53 65 67 57 72 69 74 65 72 20 7b 0a 20 20 69  5SegWriter {.  i
38f0: 6e 74 20 69 53 65 67 69 64 3b 20 20 20 20 20 20  nt iSegid;      
3900: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
3910: 2a 20 53 65 67 69 64 20 74 6f 20 77 72 69 74 65  * Segid to write
3920: 20 74 6f 20 2a 2f 0a 20 20 46 74 73 35 50 61 67   to */.  Fts5Pag
3930: 65 57 72 69 74 65 72 20 77 72 69 74 65 72 3b 20  eWriter writer; 
3940: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65           /* Page
3950: 57 72 69 74 65 72 20 6f 62 6a 65 63 74 20 2a 2f  Writer object */
3960: 0a 20 20 69 36 34 20 69 50 72 65 76 52 6f 77 69  .  i64 iPrevRowi
3970: 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d;              
3980: 20 20 20 2f 2a 20 50 72 65 76 69 6f 75 73 20 72     /* Previous r
3990: 6f 77 69 64 20 77 72 69 74 74 65 6e 20 74 6f 20  owid written to 
39a0: 63 75 72 72 65 6e 74 20 6c 65 61 66 20 2a 2f 0a  current leaf */.
39b0: 20 20 75 38 20 62 46 69 72 73 74 52 6f 77 69 64    u8 bFirstRowid
39c0: 49 6e 44 6f 63 6c 69 73 74 3b 20 20 20 20 20 20  InDoclist;      
39d0: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 6e 65 78    /* True if nex
39e0: 74 20 72 6f 77 69 64 20 69 73 20 66 69 72 73 74  t rowid is first
39f0: 20 69 6e 20 64 6f 63 6c 69 73 74 20 2a 2f 0a 20   in doclist */. 
3a00: 20 75 38 20 62 46 69 72 73 74 52 6f 77 69 64 49   u8 bFirstRowidI
3a10: 6e 50 61 67 65 3b 20 20 20 20 20 20 20 20 20 20  nPage;          
3a20: 20 2f 2a 20 54 72 75 65 20 69 66 20 6e 65 78 74   /* True if next
3a30: 20 72 6f 77 69 64 20 69 73 20 66 69 72 73 74 20   rowid is first 
3a40: 69 6e 20 70 61 67 65 20 2a 2f 0a 20 20 2f 2a 20  in page */.  /* 
3a50: 54 4f 44 4f 31 3a 20 43 61 6e 20 75 73 65 20 28  TODO1: Can use (
3a60: 77 72 69 74 65 72 2e 70 67 69 64 78 2e 6e 3d 3d  writer.pgidx.n==
3a70: 30 29 20 69 6e 73 74 65 61 64 20 6f 66 20 62 46  0) instead of bF
3a80: 69 72 73 74 54 65 72 6d 49 6e 50 61 67 65 20 2a  irstTermInPage *
3a90: 2f 0a 20 20 75 38 20 62 46 69 72 73 74 54 65 72  /.  u8 bFirstTer
3aa0: 6d 49 6e 50 61 67 65 3b 20 20 20 20 20 20 20 20  mInPage;        
3ab0: 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 6e      /* True if n
3ac0: 65 78 74 20 74 65 72 6d 20 77 69 6c 6c 20 62 65  ext term will be
3ad0: 20 66 69 72 73 74 20 69 6e 20 6c 65 61 66 20 2a   first in leaf *
3ae0: 2f 0a 20 20 69 6e 74 20 6e 4c 65 61 66 57 72 69  /.  int nLeafWri
3af0: 74 74 65 6e 3b 20 20 20 20 20 20 20 20 20 20 20  tten;           
3b00: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
3b10: 20 6c 65 61 66 20 70 61 67 65 73 20 77 72 69 74   leaf pages writ
3b20: 74 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 6d  ten */.  int nEm
3b30: 70 74 79 3b 20 20 20 20 20 20 20 20 20 20 20 20  pty;            
3b40: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
3b50: 65 72 20 6f 66 20 63 6f 6e 74 69 67 75 6f 75 73  er of contiguous
3b60: 20 74 65 72 6d 2d 6c 65 73 73 20 6e 6f 64 65 73   term-less nodes
3b70: 20 2a 2f 0a 0a 20 20 69 6e 74 20 6e 44 6c 69 64   */..  int nDlid
3b80: 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  x;              
3b90: 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c 6f 63 61         /* Alloca
3ba0: 74 65 64 20 73 69 7a 65 20 6f 66 20 61 44 6c 69  ted size of aDli
3bb0: 64 78 5b 5d 20 61 72 72 61 79 20 2a 2f 0a 20 20  dx[] array */.  
3bc0: 46 74 73 35 44 6c 69 64 78 57 72 69 74 65 72 20  Fts5DlidxWriter 
3bd0: 2a 61 44 6c 69 64 78 3b 20 20 20 20 20 20 20 20  *aDlidx;        
3be0: 2f 2a 20 41 72 72 61 79 20 6f 66 20 46 74 73 35  /* Array of Fts5
3bf0: 44 6c 69 64 78 57 72 69 74 65 72 20 6f 62 6a 65  DlidxWriter obje
3c00: 63 74 73 20 2a 2f 0a 0a 20 20 2f 2a 20 56 61 6c  cts */..  /* Val
3c10: 75 65 73 20 74 6f 20 69 6e 73 65 72 74 20 69 6e  ues to insert in
3c20: 74 6f 20 74 68 65 20 25 5f 69 64 78 20 74 61 62  to the %_idx tab
3c30: 6c 65 20 2a 2f 0a 20 20 46 74 73 35 42 75 66 66  le */.  Fts5Buff
3c40: 65 72 20 62 74 74 65 72 6d 3b 20 20 20 20 20 20  er btterm;      
3c50: 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 78 74 20          /* Next 
3c60: 74 65 72 6d 20 74 6f 20 69 6e 73 65 72 74 20 69  term to insert i
3c70: 6e 74 6f 20 25 5f 69 64 78 20 74 61 62 6c 65 20  nto %_idx table 
3c80: 2a 2f 0a 20 20 69 6e 74 20 69 42 74 50 61 67 65  */.  int iBtPage
3c90: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
3ca0: 20 20 20 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d       /* Page num
3cb0: 62 65 72 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  ber correspondin
3cc0: 67 20 74 6f 20 62 74 74 65 72 6d 20 2a 2f 0a 7d  g to btterm */.}
3cd0: 3b 0a 0a 2f 2a 0a 2a 2a 20 4f 62 6a 65 63 74 20  ;../*.** Object 
3ce0: 66 6f 72 20 69 74 65 72 61 74 69 6e 67 20 74 68  for iterating th
3cf0: 72 6f 75 67 68 20 74 68 65 20 6d 65 72 67 65 64  rough the merged
3d00: 20 72 65 73 75 6c 74 73 20 6f 66 20 6f 6e 65 20   results of one 
3d10: 6f 72 20 6d 6f 72 65 20 73 65 67 6d 65 6e 74 73  or more segments
3d20: 2c 0a 2a 2a 20 76 69 73 69 74 69 6e 67 20 65 61  ,.** visiting ea
3d30: 63 68 20 74 65 72 6d 2f 72 6f 77 69 64 20 70 61  ch term/rowid pa
3d40: 69 72 20 69 6e 20 74 68 65 20 6d 65 72 67 65 64  ir in the merged
3d50: 20 64 61 74 61 2e 0a 2a 2a 0a 2a 2a 20 6e 53 65   data..**.** nSe
3d60: 67 20 69 73 20 61 6c 77 61 79 73 20 61 20 70 6f  g is always a po
3d70: 77 65 72 20 6f 66 20 74 77 6f 20 67 72 65 61 74  wer of two great
3d80: 65 72 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c  er than or equal
3d90: 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   to the number o
3da0: 66 0a 2a 2a 20 73 65 67 6d 65 6e 74 73 20 74 68  f.** segments th
3db0: 61 74 20 74 68 69 73 20 6f 62 6a 65 63 74 20 69  at this object i
3dc0: 73 20 6d 65 72 67 69 6e 67 20 64 61 74 61 20 66  s merging data f
3dd0: 72 6f 6d 2e 20 42 6f 74 68 20 74 68 65 20 61 53  rom. Both the aS
3de0: 65 67 5b 5d 20 61 6e 64 0a 2a 2a 20 61 46 69 72  eg[] and.** aFir
3df0: 73 74 5b 5d 20 61 72 72 61 79 73 20 61 72 65 20  st[] arrays are 
3e00: 73 69 7a 65 64 20 61 74 20 6e 53 65 67 20 65 6e  sized at nSeg en
3e10: 74 72 69 65 73 2e 20 54 68 65 20 61 53 65 67 5b  tries. The aSeg[
3e20: 5d 20 61 72 72 61 79 20 69 73 20 70 61 64 64 65  ] array is padde
3e30: 64 0a 2a 2a 20 77 69 74 68 20 7a 65 72 6f 65 64  d.** with zeroed
3e40: 20 6f 62 6a 65 63 74 73 20 2d 20 74 68 65 73 65   objects - these
3e50: 20 61 72 65 20 68 61 6e 64 6c 65 64 20 61 73 20   are handled as 
3e60: 69 66 20 74 68 65 79 20 77 65 72 65 20 69 74 65  if they were ite
3e70: 72 61 74 6f 72 73 20 6f 70 65 6e 65 64 0a 2a 2a  rators opened.**
3e80: 20 6f 6e 20 65 6d 70 74 79 20 73 65 67 6d 65 6e   on empty segmen
3e90: 74 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65  ts..**.** The re
3ea0: 73 75 6c 74 73 20 6f 66 20 63 6f 6d 70 61 72 69  sults of compari
3eb0: 6e 67 20 73 65 67 6d 65 6e 74 73 20 61 53 65 67  ng segments aSeg
3ec0: 5b 4e 5d 20 61 6e 64 20 61 53 65 67 5b 4e 2b 31  [N] and aSeg[N+1
3ed0: 5d 2c 20 77 68 65 72 65 20 4e 20 69 73 20 61 6e  ], where N is an
3ee0: 0a 2a 2a 20 65 76 65 6e 20 6e 75 6d 62 65 72 2c  .** even number,
3ef0: 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 61 46   is stored in aF
3f00: 69 72 73 74 5b 28 6e 53 65 67 2b 4e 29 2f 32 5d  irst[(nSeg+N)/2]
3f10: 2e 20 54 68 65 20 22 72 65 73 75 6c 74 22 20 6f  . The "result" o
3f20: 66 20 74 68 65 20 0a 2a 2a 20 63 6f 6d 70 61 72  f the .** compar
3f30: 69 73 6f 6e 20 69 6e 20 74 68 69 73 20 63 6f 6e  ison in this con
3f40: 74 65 78 74 20 69 73 20 74 68 65 20 69 6e 64 65  text is the inde
3f50: 78 20 6f 66 20 74 68 65 20 69 74 65 72 61 74 6f  x of the iterato
3f60: 72 20 74 68 61 74 20 63 75 72 72 65 6e 74 6c 79  r that currently
3f70: 0a 2a 2a 20 70 6f 69 6e 74 73 20 74 6f 20 74 68  .** points to th
3f80: 65 20 73 6d 61 6c 6c 65 72 20 74 65 72 6d 2f 72  e smaller term/r
3f90: 6f 77 69 64 20 63 6f 6d 62 69 6e 61 74 69 6f 6e  owid combination
3fa0: 2e 20 49 74 65 72 61 74 6f 72 73 20 61 74 20 45  . Iterators at E
3fb0: 4f 46 20 61 72 65 0a 2a 2a 20 63 6f 6e 73 69 64  OF are.** consid
3fc0: 65 72 65 64 20 74 6f 20 62 65 20 67 72 65 61 74  ered to be great
3fd0: 65 72 20 74 68 61 6e 20 61 6c 6c 20 6f 74 68 65  er than all othe
3fe0: 72 20 69 74 65 72 61 74 6f 72 73 2e 0a 2a 2a 0a  r iterators..**.
3ff0: 2a 2a 20 61 46 69 72 73 74 5b 31 5d 20 63 6f 6e  ** aFirst[1] con
4000: 74 61 69 6e 73 20 74 68 65 20 69 6e 64 65 78 20  tains the index 
4010: 69 6e 20 61 53 65 67 5b 5d 20 6f 66 20 74 68 65  in aSeg[] of the
4020: 20 69 74 65 72 61 74 6f 72 20 74 68 61 74 20 70   iterator that p
4030: 6f 69 6e 74 73 20 74 6f 0a 2a 2a 20 74 68 65 20  oints to.** the 
4040: 73 6d 61 6c 6c 65 73 74 20 6b 65 79 20 6f 76 65  smallest key ove
4050: 72 61 6c 6c 2e 20 61 46 69 72 73 74 5b 30 5d 20  rall. aFirst[0] 
4060: 69 73 20 75 6e 75 73 65 64 2e 20 0a 2a 2f 0a 0a  is unused. .*/..
4070: 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 46  typedef struct F
4080: 74 73 35 43 52 65 73 75 6c 74 20 46 74 73 35 43  ts5CResult Fts5C
4090: 52 65 73 75 6c 74 3b 0a 73 74 72 75 63 74 20 46  Result;.struct F
40a0: 74 73 35 43 52 65 73 75 6c 74 20 7b 0a 20 20 75  ts5CResult {.  u
40b0: 31 36 20 69 46 69 72 73 74 3b 20 20 20 20 20 20  16 iFirst;      
40c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
40d0: 2a 20 61 53 65 67 5b 5d 20 69 6e 64 65 78 20 6f  * aSeg[] index o
40e0: 66 20 66 69 72 73 74 65 73 74 20 69 74 65 72 61  f firstest itera
40f0: 74 6f 72 20 2a 2f 0a 20 20 75 38 20 62 54 65 72  tor */.  u8 bTer
4100: 6d 45 71 3b 20 20 20 20 20 20 20 20 20 20 20 20  mEq;            
4110: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
4120: 20 69 66 20 74 68 65 20 74 65 72 6d 73 20 61 72   if the terms ar
4130: 65 20 65 71 75 61 6c 20 2a 2f 0a 7d 3b 0a 0a 2f  e equal */.};../
4140: 2a 0a 2a 2a 20 4f 62 6a 65 63 74 20 66 6f 72 20  *.** Object for 
4150: 69 74 65 72 61 74 69 6e 67 20 74 68 72 6f 75 67  iterating throug
4160: 68 20 61 20 73 69 6e 67 6c 65 20 73 65 67 6d 65  h a single segme
4170: 6e 74 2c 20 76 69 73 69 74 69 6e 67 20 65 61 63  nt, visiting eac
4180: 68 20 74 65 72 6d 2f 72 6f 77 69 64 0a 2a 2a 20  h term/rowid.** 
4190: 70 61 69 72 20 69 6e 20 74 68 65 20 73 65 67 6d  pair in the segm
41a0: 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 70 53 65 67 3a  ent..**.** pSeg:
41b0: 0a 2a 2a 20 20 20 54 68 65 20 73 65 67 6d 65 6e  .**   The segmen
41c0: 74 20 74 6f 20 69 74 65 72 61 74 65 20 74 68 72  t to iterate thr
41d0: 6f 75 67 68 2e 0a 2a 2a 0a 2a 2a 20 69 4c 65 61  ough..**.** iLea
41e0: 66 50 67 6e 6f 3a 0a 2a 2a 20 20 20 43 75 72 72  fPgno:.**   Curr
41f0: 65 6e 74 20 6c 65 61 66 20 70 61 67 65 20 6e 75  ent leaf page nu
4200: 6d 62 65 72 20 77 69 74 68 69 6e 20 73 65 67 6d  mber within segm
4210: 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 69 4c 65 61 66  ent..**.** iLeaf
4220: 4f 66 66 73 65 74 3a 0a 2a 2a 20 20 20 42 79 74  Offset:.**   Byt
4230: 65 20 6f 66 66 73 65 74 20 77 69 74 68 69 6e 20  e offset within 
4240: 74 68 65 20 63 75 72 72 65 6e 74 20 6c 65 61 66  the current leaf
4250: 20 74 68 61 74 20 69 73 20 74 68 65 20 66 69 72   that is the fir
4260: 73 74 20 62 79 74 65 20 6f 66 20 74 68 65 20 0a  st byte of the .
4270: 2a 2a 20 20 20 70 6f 73 69 74 69 6f 6e 20 6c 69  **   position li
4280: 73 74 20 64 61 74 61 20 28 6f 6e 65 20 62 79 74  st data (one byt
4290: 65 20 70 61 73 73 65 64 20 74 68 65 20 70 6f 73  e passed the pos
42a0: 69 74 69 6f 6e 2d 6c 69 73 74 20 73 69 7a 65 20  ition-list size 
42b0: 66 69 65 6c 64 29 2e 0a 2a 2a 20 20 20 72 6f 77  field)..**   row
42c0: 69 64 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20  id field of the 
42d0: 63 75 72 72 65 6e 74 20 65 6e 74 72 79 2e 20 55  current entry. U
42e0: 73 75 61 6c 6c 79 20 74 68 69 73 20 69 73 20 74  sually this is t
42f0: 68 65 20 73 69 7a 65 20 66 69 65 6c 64 20 6f 66  he size field of
4300: 20 74 68 65 0a 2a 2a 20 20 20 70 6f 73 69 74 69   the.**   positi
4310: 6f 6e 20 6c 69 73 74 20 64 61 74 61 2e 20 54 68  on list data. Th
4320: 65 20 65 78 63 65 70 74 69 6f 6e 20 69 73 20 69  e exception is i
4330: 66 20 74 68 65 20 72 6f 77 69 64 20 66 6f 72 20  f the rowid for 
4340: 74 68 65 20 63 75 72 72 65 6e 74 20 65 6e 74 72  the current entr
4350: 79 20 0a 2a 2a 20 20 20 69 73 20 74 68 65 20 6c  y .**   is the l
4360: 61 73 74 20 74 68 69 6e 67 20 6f 6e 20 74 68 65  ast thing on the
4370: 20 6c 65 61 66 20 70 61 67 65 2e 0a 2a 2a 0a 2a   leaf page..**.*
4380: 2a 20 70 4c 65 61 66 3a 0a 2a 2a 20 20 20 42 75  * pLeaf:.**   Bu
4390: 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20  ffer containing 
43a0: 63 75 72 72 65 6e 74 20 6c 65 61 66 20 70 61 67  current leaf pag
43b0: 65 20 64 61 74 61 2e 20 53 65 74 20 74 6f 20 4e  e data. Set to N
43c0: 55 4c 4c 20 61 74 20 45 4f 46 2e 0a 2a 2a 0a 2a  ULL at EOF..**.*
43d0: 2a 20 69 54 65 72 6d 4c 65 61 66 50 67 6e 6f 2c  * iTermLeafPgno,
43e0: 20 69 54 65 72 6d 4c 65 61 66 4f 66 66 73 65 74   iTermLeafOffset
43f0: 3a 0a 2a 2a 20 20 20 4c 65 61 66 20 70 61 67 65  :.**   Leaf page
4400: 20 6e 75 6d 62 65 72 20 63 6f 6e 74 61 69 6e 69   number containi
4410: 6e 67 20 74 68 65 20 6c 61 73 74 20 74 65 72 6d  ng the last term
4420: 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 73   read from the s
4430: 65 67 6d 65 6e 74 2e 20 41 6e 64 0a 2a 2a 20 20  egment. And.**  
4440: 20 74 68 65 20 6f 66 66 73 65 74 20 69 6d 6d 65   the offset imme
4450: 64 69 61 74 65 6c 79 20 66 6f 6c 6c 6f 77 69 6e  diately followin
4460: 67 20 74 68 65 20 74 65 72 6d 20 64 61 74 61 2e  g the term data.
4470: 0a 2a 2a 0a 2a 2a 20 66 6c 61 67 73 3a 0a 2a 2a  .**.** flags:.**
4480: 20 20 20 4d 61 73 6b 20 6f 66 20 46 54 53 35 5f     Mask of FTS5_
4490: 53 45 47 49 54 45 52 5f 58 58 58 20 76 61 6c 75  SEGITER_XXX valu
44a0: 65 73 2e 20 49 6e 74 65 72 70 72 65 74 65 64 20  es. Interpreted 
44b0: 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a  as follows:.**.*
44c0: 2a 20 20 20 46 54 53 35 5f 53 45 47 49 54 45 52  *   FTS5_SEGITER
44d0: 5f 4f 4e 45 54 45 52 4d 3a 0a 2a 2a 20 20 20 20  _ONETERM:.**    
44e0: 20 49 66 20 73 65 74 2c 20 73 65 74 20 74 68 65   If set, set the
44f0: 20 69 74 65 72 61 74 6f 72 20 74 6f 20 70 6f 69   iterator to poi
4500: 6e 74 20 74 6f 20 45 4f 46 20 61 66 74 65 72 20  nt to EOF after 
4510: 74 68 65 20 63 75 72 72 65 6e 74 20 64 6f 63 6c  the current docl
4520: 69 73 74 20 0a 2a 2a 20 20 20 20 20 68 61 73 20  ist .**     has 
4530: 62 65 65 6e 20 65 78 68 61 75 73 74 65 64 2e 20  been exhausted. 
4540: 44 6f 20 6e 6f 74 20 70 72 6f 63 65 65 64 20 74  Do not proceed t
4550: 6f 20 74 68 65 20 6e 65 78 74 20 74 65 72 6d 20  o the next term 
4560: 69 6e 20 74 68 65 20 73 65 67 6d 65 6e 74 2e 0a  in the segment..
4570: 2a 2a 0a 2a 2a 20 20 20 46 54 53 35 5f 53 45 47  **.**   FTS5_SEG
4580: 49 54 45 52 5f 52 45 56 45 52 53 45 3a 0a 2a 2a  ITER_REVERSE:.**
4590: 20 20 20 20 20 54 68 69 73 20 66 6c 61 67 20 69       This flag i
45a0: 73 20 6f 6e 6c 79 20 65 76 65 72 20 73 65 74 20  s only ever set 
45b0: 69 66 20 46 54 53 35 5f 53 45 47 49 54 45 52 5f  if FTS5_SEGITER_
45c0: 4f 4e 45 54 45 52 4d 20 69 73 20 61 6c 73 6f 20  ONETERM is also 
45d0: 73 65 74 2e 20 49 66 0a 2a 2a 20 20 20 20 20 69  set. If.**     i
45e0: 74 20 69 73 20 73 65 74 2c 20 69 74 65 72 61 74  t is set, iterat
45f0: 65 20 74 68 72 6f 75 67 68 20 72 6f 77 69 64 20  e through rowid 
4600: 69 6e 20 64 65 73 63 65 6e 64 69 6e 67 20 6f 72  in descending or
4610: 64 65 72 20 69 6e 73 74 65 61 64 20 6f 66 20 74  der instead of t
4620: 68 65 0a 2a 2a 20 20 20 20 20 64 65 66 61 75 6c  he.**     defaul
4630: 74 20 61 73 63 65 6e 64 69 6e 67 20 6f 72 64 65  t ascending orde
4640: 72 2e 0a 2a 2a 0a 2a 2a 20 69 52 6f 77 69 64 4f  r..**.** iRowidO
4650: 66 66 73 65 74 2f 6e 52 6f 77 69 64 4f 66 66 73  ffset/nRowidOffs
4660: 65 74 2f 61 52 6f 77 69 64 4f 66 66 73 65 74 3a  et/aRowidOffset:
4670: 0a 2a 2a 20 20 20 20 20 54 68 65 73 65 20 61 72  .**     These ar
4680: 65 20 75 73 65 64 20 69 66 20 74 68 65 20 46 54  e used if the FT
4690: 53 35 5f 53 45 47 49 54 45 52 5f 52 45 56 45 52  S5_SEGITER_REVER
46a0: 53 45 20 66 6c 61 67 20 69 73 20 73 65 74 2e 0a  SE flag is set..
46b0: 2a 2a 0a 2a 2a 20 20 20 20 20 46 6f 72 20 65 61  **.**     For ea
46c0: 63 68 20 72 6f 77 69 64 20 6f 6e 20 74 68 65 20  ch rowid on the 
46d0: 70 61 67 65 20 63 6f 72 72 65 73 70 6f 6e 64 69  page correspondi
46e0: 6e 67 20 74 6f 20 74 68 65 20 63 75 72 72 65 6e  ng to the curren
46f0: 74 20 74 65 72 6d 2c 20 74 68 65 0a 2a 2a 20 20  t term, the.**  
4700: 20 20 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67     corresponding
4710: 20 61 52 6f 77 69 64 4f 66 66 73 65 74 5b 5d 20   aRowidOffset[] 
4720: 65 6e 74 72 79 20 69 73 20 73 65 74 20 74 6f 20  entry is set to 
4730: 74 68 65 20 62 79 74 65 20 6f 66 66 73 65 74 20  the byte offset 
4740: 6f 66 20 74 68 65 0a 2a 2a 20 20 20 20 20 73 74  of the.**     st
4750: 61 72 74 20 6f 66 20 74 68 65 20 22 70 6f 73 69  art of the "posi
4760: 74 69 6f 6e 2d 6c 69 73 74 2d 73 69 7a 65 22 20  tion-list-size" 
4770: 66 69 65 6c 64 20 77 69 74 68 69 6e 20 74 68 65  field within the
4780: 20 70 61 67 65 2e 0a 2a 2f 0a 73 74 72 75 63 74   page..*/.struct
4790: 20 46 74 73 35 53 65 67 49 74 65 72 20 7b 0a 20   Fts5SegIter {. 
47a0: 20 46 74 73 35 53 74 72 75 63 74 75 72 65 53 65   Fts5StructureSe
47b0: 67 6d 65 6e 74 20 2a 70 53 65 67 3b 20 20 20 20  gment *pSeg;    
47c0: 20 2f 2a 20 53 65 67 6d 65 6e 74 20 74 6f 20 69   /* Segment to i
47d0: 74 65 72 61 74 65 20 74 68 72 6f 75 67 68 20 2a  terate through *
47e0: 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 3b 20 20  /.  int flags;  
47f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4800: 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 63      /* Mask of c
4810: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 66 6c 61  onfiguration fla
4820: 67 73 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 65 61  gs */.  int iLea
4830: 66 50 67 6e 6f 3b 20 20 20 20 20 20 20 20 20 20  fPgno;          
4840: 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65          /* Curre
4850: 6e 74 20 6c 65 61 66 20 70 61 67 65 20 6e 75 6d  nt leaf page num
4860: 62 65 72 20 2a 2f 0a 20 20 46 74 73 35 44 61 74  ber */.  Fts5Dat
4870: 61 20 2a 70 4c 65 61 66 3b 20 20 20 20 20 20 20  a *pLeaf;       
4880: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72           /* Curr
4890: 65 6e 74 20 6c 65 61 66 20 64 61 74 61 20 2a 2f  ent leaf data */
48a0: 0a 20 20 46 74 73 35 44 61 74 61 20 2a 70 4e 65  .  Fts5Data *pNe
48b0: 78 74 4c 65 61 66 3b 20 20 20 20 20 20 20 20 20  xtLeaf;         
48c0: 20 20 20 2f 2a 20 4c 65 61 66 20 70 61 67 65 20     /* Leaf page 
48d0: 28 69 4c 65 61 66 50 67 6e 6f 2b 31 29 20 2a 2f  (iLeafPgno+1) */
48e0: 0a 20 20 69 6e 74 20 69 4c 65 61 66 4f 66 66 73  .  int iLeafOffs
48f0: 65 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  et;             
4900: 20 20 20 2f 2a 20 42 79 74 65 20 6f 66 66 73 65     /* Byte offse
4910: 74 20 77 69 74 68 69 6e 20 63 75 72 72 65 6e 74  t within current
4920: 20 6c 65 61 66 20 2a 2f 0a 0a 20 20 2f 2a 20 54   leaf */..  /* T
4930: 68 65 20 70 61 67 65 20 61 6e 64 20 6f 66 66 73  he page and offs
4940: 65 74 20 66 72 6f 6d 20 77 68 69 63 68 20 74 68  et from which th
4950: 65 20 63 75 72 72 65 6e 74 20 74 65 72 6d 20 77  e current term w
4960: 61 73 20 72 65 61 64 2e 20 54 68 65 20 6f 66 66  as read. The off
4970: 73 65 74 20 0a 20 20 2a 2a 20 69 73 20 74 68 65  set .  ** is the
4980: 20 6f 66 66 73 65 74 20 6f 66 20 74 68 65 20 66   offset of the f
4990: 69 72 73 74 20 72 6f 77 69 64 20 69 6e 20 74 68  irst rowid in th
49a0: 65 20 63 75 72 72 65 6e 74 20 64 6f 63 6c 69 73  e current doclis
49b0: 74 2e 20 20 2a 2f 0a 20 20 69 6e 74 20 69 54 65  t.  */.  int iTe
49c0: 72 6d 4c 65 61 66 50 67 6e 6f 3b 0a 20 20 69 6e  rmLeafPgno;.  in
49d0: 74 20 69 54 65 72 6d 4c 65 61 66 4f 66 66 73 65  t iTermLeafOffse
49e0: 74 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c  t;..  /* The fol
49f0: 6c 6f 77 69 6e 67 20 61 72 65 20 6f 6e 6c 79 20  lowing are only 
4a00: 75 73 65 64 20 69 66 20 74 68 65 20 46 54 53 35  used if the FTS5
4a10: 5f 53 45 47 49 54 45 52 5f 52 45 56 45 52 53 45  _SEGITER_REVERSE
4a20: 20 66 6c 61 67 20 69 73 20 73 65 74 2e 20 2a 2f   flag is set. */
4a30: 0a 20 20 69 6e 74 20 69 52 6f 77 69 64 4f 66 66  .  int iRowidOff
4a40: 73 65 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  set;            
4a50: 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 65 6e     /* Current en
4a60: 74 72 79 20 69 6e 20 61 52 6f 77 69 64 4f 66 66  try in aRowidOff
4a70: 73 65 74 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 6e  set[] */.  int n
4a80: 52 6f 77 69 64 4f 66 66 73 65 74 3b 20 20 20 20  RowidOffset;    
4a90: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c             /* Al
4aa0: 6c 6f 63 61 74 65 64 20 73 69 7a 65 20 6f 66 20  located size of 
4ab0: 61 52 6f 77 69 64 4f 66 66 73 65 74 5b 5d 20 61  aRowidOffset[] a
4ac0: 72 72 61 79 20 2a 2f 0a 20 20 69 6e 74 20 2a 61  rray */.  int *a
4ad0: 52 6f 77 69 64 4f 66 66 73 65 74 3b 20 20 20 20  RowidOffset;    
4ae0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72 72            /* Arr
4af0: 61 79 20 6f 66 20 6f 66 66 73 65 74 20 74 6f 20  ay of offset to 
4b00: 72 6f 77 69 64 20 66 69 65 6c 64 73 20 2a 2f 0a  rowid fields */.
4b10: 0a 20 20 46 74 73 35 44 6c 69 64 78 49 74 65 72  .  Fts5DlidxIter
4b20: 20 2a 70 44 6c 69 64 78 3b 20 20 20 20 20 20 20   *pDlidx;       
4b30: 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69     /* If there i
4b40: 73 20 61 20 64 6f 63 6c 69 73 74 2d 69 6e 64 65  s a doclist-inde
4b50: 78 20 2a 2f 0a 0a 20 20 2f 2a 20 56 61 72 69 61  x */..  /* Varia
4b60: 62 6c 65 73 20 70 6f 70 75 6c 61 74 65 64 20 62  bles populated b
4b70: 61 73 65 64 20 6f 6e 20 63 75 72 72 65 6e 74 20  ased on current 
4b80: 65 6e 74 72 79 2e 20 2a 2f 0a 20 20 46 74 73 35  entry. */.  Fts5
4b90: 42 75 66 66 65 72 20 74 65 72 6d 3b 20 20 20 20  Buffer term;    
4ba0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
4bb0: 75 72 72 65 6e 74 20 74 65 72 6d 20 2a 2f 0a 20  urrent term */. 
4bc0: 20 69 36 34 20 69 52 6f 77 69 64 3b 20 20 20 20   i64 iRowid;    
4bd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4be0: 20 2f 2a 20 43 75 72 72 65 6e 74 20 72 6f 77 69   /* Current rowi
4bf0: 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 6f 73 3b  d */.  int nPos;
4c00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4c10: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
4c20: 20 6f 66 20 62 79 74 65 73 20 69 6e 20 63 75 72   of bytes in cur
4c30: 72 65 6e 74 20 70 6f 73 69 74 69 6f 6e 20 6c 69  rent position li
4c40: 73 74 20 2a 2f 0a 20 20 69 6e 74 20 62 44 65 6c  st */.  int bDel
4c50: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
4c60: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
4c70: 69 66 20 74 68 65 20 64 65 6c 65 74 65 20 66 6c  if the delete fl
4c80: 61 67 20 69 73 20 73 65 74 20 2a 2f 0a 7d 3b 0a  ag is set */.};.
4c90: 0a 2f 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20  ./*.** Argument 
4ca0: 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  is a pointer to 
4cb0: 61 6e 20 46 74 73 35 44 61 74 61 20 73 74 72 75  an Fts5Data stru
4cc0: 63 74 75 72 65 20 74 68 61 74 20 63 6f 6e 74 61  cture that conta
4cd0: 69 6e 73 20 61 20 0a 2a 2a 20 6c 65 61 66 20 70  ins a .** leaf p
4ce0: 61 67 65 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  age..*/.#define 
4cf0: 41 53 53 45 52 54 5f 53 5a 4c 45 41 46 5f 4f 4b  ASSERT_SZLEAF_OK
4d00: 28 78 29 20 61 73 73 65 72 74 28 20 5c 0a 20 20  (x) assert( \.  
4d10: 20 20 28 78 29 2d 3e 73 7a 4c 65 61 66 3d 3d 66    (x)->szLeaf==f
4d20: 74 73 35 47 65 74 55 31 36 28 26 28 78 29 2d 3e  ts5GetU16(&(x)->
4d30: 70 5b 32 5d 29 20 7c 7c 20 28 78 29 2d 3e 73 7a  p[2]) || (x)->sz
4d40: 4c 65 61 66 3d 3d 28 78 29 2d 3e 6e 6e 20 5c 0a  Leaf==(x)->nn \.
4d50: 29 0a 0a 23 64 65 66 69 6e 65 20 46 54 53 35 5f  )..#define FTS5_
4d60: 53 45 47 49 54 45 52 5f 4f 4e 45 54 45 52 4d 20  SEGITER_ONETERM 
4d70: 30 78 30 31 0a 23 64 65 66 69 6e 65 20 46 54 53  0x01.#define FTS
4d80: 35 5f 53 45 47 49 54 45 52 5f 52 45 56 45 52 53  5_SEGITER_REVERS
4d90: 45 20 30 78 30 32 0a 0a 0a 2f 2a 20 0a 2a 2a 20  E 0x02.../* .** 
4da0: 41 72 67 75 6d 65 6e 74 20 69 73 20 61 20 70 6f  Argument is a po
4db0: 69 6e 74 65 72 20 74 6f 20 61 6e 20 46 74 73 35  inter to an Fts5
4dc0: 44 61 74 61 20 73 74 72 75 63 74 75 72 65 20 74  Data structure t
4dd0: 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 61 20 6c  hat contains a l
4de0: 65 61 66 0a 2a 2a 20 70 61 67 65 2e 20 54 68 69  eaf.** page. Thi
4df0: 73 20 6d 61 63 72 6f 20 65 76 61 6c 75 61 74 65  s macro evaluate
4e00: 73 20 74 6f 20 74 72 75 65 20 69 66 20 74 68 65  s to true if the
4e10: 20 6c 65 61 66 20 63 6f 6e 74 61 69 6e 73 20 6e   leaf contains n
4e20: 6f 20 74 65 72 6d 73 2c 20 6f 72 0a 2a 2a 20 66  o terms, or.** f
4e30: 61 6c 73 65 20 69 66 20 69 74 20 63 6f 6e 74 61  alse if it conta
4e40: 69 6e 73 20 61 74 20 6c 65 61 73 74 20 6f 6e 65  ins at least one
4e50: 20 74 65 72 6d 2e 0a 2a 2f 0a 23 64 65 66 69 6e   term..*/.#defin
4e60: 65 20 66 74 73 35 4c 65 61 66 49 73 54 65 72 6d  e fts5LeafIsTerm
4e70: 6c 65 73 73 28 78 29 20 28 28 78 29 2d 3e 73 7a  less(x) ((x)->sz
4e80: 4c 65 61 66 20 3e 3d 20 28 78 29 2d 3e 6e 6e 29  Leaf >= (x)->nn)
4e90: 0a 0a 23 64 65 66 69 6e 65 20 66 74 73 35 4c 65  ..#define fts5Le
4ea0: 61 66 46 69 72 73 74 54 65 72 6d 4f 66 66 28 78  afFirstTermOff(x
4eb0: 29 20 28 66 74 73 35 47 65 74 55 31 36 28 26 28  ) (fts5GetU16(&(
4ec0: 78 29 2d 3e 70 5b 28 78 29 2d 3e 73 7a 4c 65 61  x)->p[(x)->szLea
4ed0: 66 5d 29 29 0a 23 64 65 66 69 6e 65 20 66 74 73  f])).#define fts
4ee0: 35 4c 65 61 66 46 69 72 73 74 52 6f 77 69 64 4f  5LeafFirstRowidO
4ef0: 66 66 28 78 29 20 28 66 74 73 35 47 65 74 55 31  ff(x) (fts5GetU1
4f00: 36 28 28 78 29 2d 3e 70 29 29 0a 0a 2f 2a 0a 2a  6((x)->p))../*.*
4f10: 2a 20 70 6f 73 6c 69 73 74 3a 0a 2a 2a 20 20 20  * poslist:.**   
4f20: 55 73 65 64 20 62 79 20 73 71 6c 69 74 65 33 46  Used by sqlite3F
4f30: 74 73 35 49 74 65 72 50 6f 73 6c 69 73 74 28 29  ts5IterPoslist()
4f40: 20 77 68 65 6e 20 74 68 65 20 70 6f 73 6c 69 73   when the poslis
4f50: 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20 62 75  t needs to be bu
4f60: 66 66 65 72 65 64 2e 0a 2a 2a 20 20 20 54 68 65  ffered..**   The
4f70: 72 65 20 69 73 20 6e 6f 20 77 61 79 20 74 6f 20  re is no way to 
4f80: 74 65 6c 6c 20 69 66 20 74 68 69 73 20 69 73 20  tell if this is 
4f90: 70 6f 70 75 6c 61 74 65 64 20 6f 72 20 6e 6f 74  populated or not
4fa0: 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 46 74 73 35  ..*/.struct Fts5
4fb0: 49 6e 64 65 78 49 74 65 72 20 7b 0a 20 20 46 74  IndexIter {.  Ft
4fc0: 73 35 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 3b  s5Index *pIndex;
4fd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
4fe0: 20 49 6e 64 65 78 20 74 68 61 74 20 6f 77 6e 73   Index that owns
4ff0: 20 74 68 69 73 20 69 74 65 72 61 74 6f 72 20 2a   this iterator *
5000: 2f 0a 20 20 46 74 73 35 53 74 72 75 63 74 75 72  /.  Fts5Structur
5010: 65 20 2a 70 53 74 72 75 63 74 3b 20 20 20 20 20  e *pStruct;     
5020: 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
5030: 73 74 72 75 63 74 75 72 65 20 66 6f 72 20 74 68  structure for th
5040: 69 73 20 69 74 65 72 61 74 6f 72 20 2a 2f 0a 20  is iterator */. 
5050: 20 46 74 73 35 42 75 66 66 65 72 20 70 6f 73 6c   Fts5Buffer posl
5060: 69 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  ist;            
5070: 20 2f 2a 20 42 75 66 66 65 72 20 63 6f 6e 74 61   /* Buffer conta
5080: 69 6e 69 6e 67 20 63 75 72 72 65 6e 74 20 70 6f  ining current po
5090: 73 6c 69 73 74 20 2a 2f 0a 0a 20 20 69 6e 74 20  slist */..  int 
50a0: 6e 53 65 67 3b 20 20 20 20 20 20 20 20 20 20 20  nSeg;           
50b0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
50c0: 69 7a 65 20 6f 66 20 61 53 65 67 5b 5d 20 61 72  ize of aSeg[] ar
50d0: 72 61 79 20 2a 2f 0a 20 20 69 6e 74 20 62 52 65  ray */.  int bRe
50e0: 76 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  v;              
50f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
5100: 20 74 6f 20 69 74 65 72 61 74 65 20 69 6e 20 72   to iterate in r
5110: 65 76 65 72 73 65 20 6f 72 64 65 72 20 2a 2f 0a  everse order */.
5120: 20 20 69 6e 74 20 62 53 6b 69 70 45 6d 70 74 79    int bSkipEmpty
5130: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
5140: 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 73 6b 69    /* True to ski
5150: 70 20 64 65 6c 65 74 65 64 20 65 6e 74 72 69 65  p deleted entrie
5160: 73 20 2a 2f 0a 20 20 69 6e 74 20 62 45 6f 66 3b  s */.  int bEof;
5170: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5180: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 61         /* True a
5190: 74 20 45 4f 46 20 2a 2f 0a 0a 20 20 69 36 34 20  t EOF */..  i64 
51a0: 69 53 77 69 74 63 68 52 6f 77 69 64 3b 20 20 20  iSwitchRowid;   
51b0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
51c0: 69 72 73 74 65 73 74 20 72 6f 77 69 64 20 6f 66  irstest rowid of
51d0: 20 6f 74 68 65 72 20 74 68 61 6e 20 61 46 69 72   other than aFir
51e0: 73 74 5b 31 5d 20 2a 2f 0a 20 20 46 74 73 35 43  st[1] */.  Fts5C
51f0: 52 65 73 75 6c 74 20 2a 61 46 69 72 73 74 3b 20  Result *aFirst; 
5200: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75             /* Cu
5210: 72 72 65 6e 74 20 6d 65 72 67 65 20 73 74 61 74  rrent merge stat
5220: 65 20 28 73 65 65 20 61 62 6f 76 65 29 20 2a 2f  e (see above) */
5230: 0a 20 20 46 74 73 35 53 65 67 49 74 65 72 20 61  .  Fts5SegIter a
5240: 53 65 67 5b 31 5d 3b 20 20 20 20 20 20 20 20 20  Seg[1];         
5250: 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 73     /* Array of s
5260: 65 67 6d 65 6e 74 20 69 74 65 72 61 74 6f 72 73  egment iterators
5270: 20 2a 2f 0a 7d 3b 0a 0a 0a 2f 2a 0a 2a 2a 20 41   */.};.../*.** A
5280: 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68  n instance of th
5290: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 79 70 65  e following type
52a0: 20 69 73 20 75 73 65 64 20 74 6f 20 69 74 65 72   is used to iter
52b0: 61 74 65 20 74 68 72 6f 75 67 68 20 74 68 65 20  ate through the 
52c0: 63 6f 6e 74 65 6e 74 73 0a 2a 2a 20 6f 66 20 61  contents.** of a
52d0: 20 64 6f 63 6c 69 73 74 2d 69 6e 64 65 78 20 72   doclist-index r
52e0: 65 63 6f 72 64 2e 0a 2a 2a 0a 2a 2a 20 70 44 61  ecord..**.** pDa
52f0: 74 61 3a 0a 2a 2a 20 20 20 52 65 63 6f 72 64 20  ta:.**   Record 
5300: 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 64  containing the d
5310: 6f 63 6c 69 73 74 2d 69 6e 64 65 78 20 64 61 74  oclist-index dat
5320: 61 2e 0a 2a 2a 0a 2a 2a 20 62 45 6f 66 3a 0a 2a  a..**.** bEof:.*
5330: 2a 20 20 20 53 65 74 20 74 6f 20 74 72 75 65 20  *   Set to true 
5340: 6f 6e 63 65 20 69 74 65 72 61 74 6f 72 20 68 61  once iterator ha
5350: 73 20 72 65 61 63 68 65 64 20 45 4f 46 2e 0a 2a  s reached EOF..*
5360: 2a 0a 2a 2a 20 69 4f 66 66 3a 0a 2a 2a 20 20 20  *.** iOff:.**   
5370: 53 65 74 20 74 6f 20 74 68 65 20 63 75 72 72 65  Set to the curre
5380: 6e 74 20 6f 66 66 73 65 74 20 77 69 74 68 69 6e  nt offset within
5390: 20 72 65 63 6f 72 64 20 70 44 61 74 61 2e 0a 2a   record pData..*
53a0: 2f 0a 73 74 72 75 63 74 20 46 74 73 35 44 6c 69  /.struct Fts5Dli
53b0: 64 78 4c 76 6c 20 7b 0a 20 20 46 74 73 35 44 61  dxLvl {.  Fts5Da
53c0: 74 61 20 2a 70 44 61 74 61 3b 20 20 20 20 20 20  ta *pData;      
53d0: 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 20          /* Data 
53e0: 66 6f 72 20 63 75 72 72 65 6e 74 20 70 61 67 65  for current page
53f0: 20 6f 66 20 74 68 69 73 20 6c 65 76 65 6c 20 2a   of this level *
5400: 2f 0a 20 20 69 6e 74 20 69 4f 66 66 3b 20 20 20  /.  int iOff;   
5410: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5420: 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 6f 66 66    /* Current off
5430: 73 65 74 20 69 6e 74 6f 20 70 44 61 74 61 20 2a  set into pData *
5440: 2f 0a 20 20 69 6e 74 20 62 45 6f 66 3b 20 20 20  /.  int bEof;   
5450: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5460: 20 20 2f 2a 20 41 74 20 45 4f 46 20 61 6c 72 65    /* At EOF alre
5470: 61 64 79 20 2a 2f 0a 20 20 69 6e 74 20 69 46 69  ady */.  int iFi
5480: 72 73 74 4f 66 66 3b 20 20 20 20 20 20 20 20 20  rstOff;         
5490: 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20 62         /* Used b
54a0: 79 20 72 65 76 65 72 73 65 20 69 74 65 72 61 74  y reverse iterat
54b0: 6f 72 73 20 2a 2f 0a 0a 20 20 2f 2a 20 4f 75 74  ors */..  /* Out
54c0: 70 75 74 20 76 61 72 69 61 62 6c 65 73 20 2a 2f  put variables */
54d0: 0a 20 20 69 6e 74 20 69 4c 65 61 66 50 67 6e 6f  .  int iLeafPgno
54e0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
54f0: 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20   /* Page number 
5500: 6f 66 20 63 75 72 72 65 6e 74 20 6c 65 61 66 20  of current leaf 
5510: 70 61 67 65 20 2a 2f 0a 20 20 69 36 34 20 69 52  page */.  i64 iR
5520: 6f 77 69 64 3b 20 20 20 20 20 20 20 20 20 20 20  owid;           
5530: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
5540: 20 72 6f 77 69 64 20 6f 6e 20 6c 65 61 66 20 69   rowid on leaf i
5550: 4c 65 61 66 50 67 6e 6f 20 2a 2f 0a 7d 3b 0a 73  LeafPgno */.};.s
5560: 74 72 75 63 74 20 46 74 73 35 44 6c 69 64 78 49  truct Fts5DlidxI
5570: 74 65 72 20 7b 0a 20 20 69 6e 74 20 6e 4c 76 6c  ter {.  int nLvl
5580: 3b 0a 20 20 69 6e 74 20 69 53 65 67 69 64 3b 0a  ;.  int iSegid;.
5590: 20 20 46 74 73 35 44 6c 69 64 78 4c 76 6c 20 61    Fts5DlidxLvl a
55a0: 4c 76 6c 5b 31 5d 3b 0a 7d 3b 0a 0a 73 74 61 74  Lvl[1];.};..stat
55b0: 69 63 20 76 6f 69 64 20 66 74 73 35 50 75 74 55  ic void fts5PutU
55c0: 31 36 28 75 38 20 2a 61 4f 75 74 2c 20 75 31 36  16(u8 *aOut, u16
55d0: 20 69 56 61 6c 29 7b 0a 20 20 61 4f 75 74 5b 30   iVal){.  aOut[0
55e0: 5d 20 3d 20 28 69 56 61 6c 3e 3e 38 29 3b 0a 20  ] = (iVal>>8);. 
55f0: 20 61 4f 75 74 5b 31 5d 20 3d 20 28 69 56 61 6c   aOut[1] = (iVal
5600: 26 30 78 46 46 29 3b 0a 7d 0a 0a 73 74 61 74 69  &0xFF);.}..stati
5610: 63 20 75 31 36 20 66 74 73 35 47 65 74 55 31 36  c u16 fts5GetU16
5620: 28 63 6f 6e 73 74 20 75 38 20 2a 61 49 6e 29 7b  (const u8 *aIn){
5630: 0a 20 20 72 65 74 75 72 6e 20 28 28 75 31 36 29  .  return ((u16)
5640: 61 49 6e 5b 30 5d 20 3c 3c 20 38 29 20 2b 20 61  aIn[0] << 8) + a
5650: 49 6e 5b 31 5d 3b 0a 7d 20 0a 0a 2f 2a 0a 2a 2a  In[1];.} ../*.**
5660: 20 41 6c 6c 6f 63 61 74 65 20 61 6e 64 20 72 65   Allocate and re
5670: 74 75 72 6e 20 61 20 62 75 66 66 65 72 20 61 74  turn a buffer at
5680: 20 6c 65 61 73 74 20 6e 42 79 74 65 20 62 79 74   least nByte byt
5690: 65 73 20 69 6e 20 73 69 7a 65 2e 0a 2a 2a 0a 2a  es in size..**.*
56a0: 2a 20 49 66 20 61 6e 20 4f 4f 4d 20 65 72 72 6f  * If an OOM erro
56b0: 72 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64  r is encountered
56c0: 2c 20 72 65 74 75 72 6e 20 4e 55 4c 4c 20 61 6e  , return NULL an
56d0: 64 20 73 65 74 20 74 68 65 20 65 72 72 6f 72 20  d set the error 
56e0: 63 6f 64 65 20 69 6e 0a 2a 2a 20 74 68 65 20 46  code in.** the F
56f0: 74 73 35 49 6e 64 65 78 20 68 61 6e 64 6c 65 20  ts5Index handle 
5700: 70 61 73 73 65 64 20 61 73 20 74 68 65 20 66 69  passed as the fi
5710: 72 73 74 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f  rst argument..*/
5720: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 2a 66 74  .static void *ft
5730: 73 35 49 64 78 4d 61 6c 6c 6f 63 28 46 74 73 35  s5IdxMalloc(Fts5
5740: 49 6e 64 65 78 20 2a 70 2c 20 69 6e 74 20 6e 42  Index *p, int nB
5750: 79 74 65 29 7b 0a 20 20 72 65 74 75 72 6e 20 73  yte){.  return s
5760: 71 6c 69 74 65 33 46 74 73 35 4d 61 6c 6c 6f 63  qlite3Fts5Malloc
5770: 5a 65 72 6f 28 26 70 2d 3e 72 63 2c 20 6e 42 79  Zero(&p->rc, nBy
5780: 74 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f  te);.}../*.** Co
5790: 6d 70 61 72 65 20 74 68 65 20 63 6f 6e 74 65 6e  mpare the conten
57a0: 74 73 20 6f 66 20 74 68 65 20 70 4c 65 66 74 20  ts of the pLeft 
57b0: 62 75 66 66 65 72 20 77 69 74 68 20 74 68 65 20  buffer with the 
57c0: 70 52 69 67 68 74 2f 6e 52 69 67 68 74 20 62 6c  pRight/nRight bl
57d0: 6f 62 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  ob..**.** Return
57e0: 20 2d 76 65 20 69 66 20 70 4c 65 66 74 20 69 73   -ve if pLeft is
57f0: 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 70 52   smaller than pR
5800: 69 67 68 74 2c 20 30 20 69 66 20 74 68 65 79 20  ight, 0 if they 
5810: 61 72 65 20 65 71 75 61 6c 20 6f 72 0a 2a 2a 20  are equal or.** 
5820: 2b 76 65 20 69 66 20 70 52 69 67 68 74 20 69 73  +ve if pRight is
5830: 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 70 4c   smaller than pL
5840: 65 66 74 2e 20 49 6e 20 6f 74 68 65 72 20 77 6f  eft. In other wo
5850: 72 64 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 72  rds:.**.**     r
5860: 65 73 20 3d 20 2a 70 4c 65 66 74 20 2d 20 2a 70  es = *pLeft - *p
5870: 52 69 67 68 74 0a 2a 2f 0a 23 69 66 64 65 66 20  Right.*/.#ifdef 
5880: 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 73 74 61  SQLITE_DEBUG.sta
5890: 74 69 63 20 69 6e 74 20 66 74 73 35 42 75 66 66  tic int fts5Buff
58a0: 65 72 43 6f 6d 70 61 72 65 42 6c 6f 62 28 0a 20  erCompareBlob(. 
58b0: 20 46 74 73 35 42 75 66 66 65 72 20 2a 70 4c 65   Fts5Buffer *pLe
58c0: 66 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ft,             
58d0: 20 2f 2a 20 4c 65 66 74 20 68 61 6e 64 20 73 69   /* Left hand si
58e0: 64 65 20 6f 66 20 63 6f 6d 70 61 72 69 73 6f 6e  de of comparison
58f0: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a   */.  const u8 *
5900: 70 52 69 67 68 74 2c 20 69 6e 74 20 6e 52 69 67  pRight, int nRig
5910: 68 74 20 20 20 20 2f 2a 20 52 69 67 68 74 20 68  ht    /* Right h
5920: 61 6e 64 20 73 69 64 65 20 6f 66 20 63 6f 6d 70  and side of comp
5930: 61 72 69 73 6f 6e 20 2a 2f 0a 29 7b 0a 20 20 69  arison */.){.  i
5940: 6e 74 20 6e 43 6d 70 20 3d 20 4d 49 4e 28 70 4c  nt nCmp = MIN(pL
5950: 65 66 74 2d 3e 6e 2c 20 6e 52 69 67 68 74 29 3b  eft->n, nRight);
5960: 0a 20 20 69 6e 74 20 72 65 73 20 3d 20 6d 65 6d  .  int res = mem
5970: 63 6d 70 28 70 4c 65 66 74 2d 3e 70 2c 20 70 52  cmp(pLeft->p, pR
5980: 69 67 68 74 2c 20 6e 43 6d 70 29 3b 0a 20 20 72  ight, nCmp);.  r
5990: 65 74 75 72 6e 20 28 72 65 73 3d 3d 30 20 3f 20  eturn (res==0 ? 
59a0: 28 70 4c 65 66 74 2d 3e 6e 20 2d 20 6e 52 69 67  (pLeft->n - nRig
59b0: 68 74 29 20 3a 20 72 65 73 29 3b 0a 7d 0a 23 65  ht) : res);.}.#e
59c0: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70  ndif../*.** Comp
59d0: 61 72 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  are the contents
59e0: 20 6f 66 20 74 68 65 20 74 77 6f 20 62 75 66 66   of the two buff
59f0: 65 72 73 20 75 73 69 6e 67 20 6d 65 6d 63 6d 70  ers using memcmp
5a00: 28 29 2e 20 49 66 20 6f 6e 65 20 62 75 66 66 65  (). If one buffe
5a10: 72 0a 2a 2a 20 69 73 20 61 20 70 72 65 66 69 78  r.** is a prefix
5a20: 20 6f 66 20 74 68 65 20 6f 74 68 65 72 2c 20 69   of the other, i
5a30: 74 20 69 73 20 63 6f 6e 73 69 64 65 72 65 64 20  t is considered 
5a40: 74 68 65 20 6c 65 73 73 65 72 2e 0a 2a 2a 0a 2a  the lesser..**.*
5a50: 2a 20 52 65 74 75 72 6e 20 2d 76 65 20 69 66 20  * Return -ve if 
5a60: 70 4c 65 66 74 20 69 73 20 73 6d 61 6c 6c 65 72  pLeft is smaller
5a70: 20 74 68 61 6e 20 70 52 69 67 68 74 2c 20 30 20   than pRight, 0 
5a80: 69 66 20 74 68 65 79 20 61 72 65 20 65 71 75 61  if they are equa
5a90: 6c 20 6f 72 0a 2a 2a 20 2b 76 65 20 69 66 20 70  l or.** +ve if p
5aa0: 52 69 67 68 74 20 69 73 20 73 6d 61 6c 6c 65 72  Right is smaller
5ab0: 20 74 68 61 6e 20 70 4c 65 66 74 2e 20 49 6e 20   than pLeft. In 
5ac0: 6f 74 68 65 72 20 77 6f 72 64 73 3a 0a 2a 2a 0a  other words:.**.
5ad0: 2a 2a 20 20 20 20 20 72 65 73 20 3d 20 2a 70 4c  **     res = *pL
5ae0: 65 66 74 20 2d 20 2a 70 52 69 67 68 74 0a 2a 2f  eft - *pRight.*/
5af0: 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 35  .static int fts5
5b00: 42 75 66 66 65 72 43 6f 6d 70 61 72 65 28 46 74  BufferCompare(Ft
5b10: 73 35 42 75 66 66 65 72 20 2a 70 4c 65 66 74 2c  s5Buffer *pLeft,
5b20: 20 46 74 73 35 42 75 66 66 65 72 20 2a 70 52 69   Fts5Buffer *pRi
5b30: 67 68 74 29 7b 0a 20 20 69 6e 74 20 6e 43 6d 70  ght){.  int nCmp
5b40: 20 3d 20 4d 49 4e 28 70 4c 65 66 74 2d 3e 6e 2c   = MIN(pLeft->n,
5b50: 20 70 52 69 67 68 74 2d 3e 6e 29 3b 0a 20 20 69   pRight->n);.  i
5b60: 6e 74 20 72 65 73 20 3d 20 6d 65 6d 63 6d 70 28  nt res = memcmp(
5b70: 70 4c 65 66 74 2d 3e 70 2c 20 70 52 69 67 68 74  pLeft->p, pRight
5b80: 2d 3e 70 2c 20 6e 43 6d 70 29 3b 0a 20 20 72 65  ->p, nCmp);.  re
5b90: 74 75 72 6e 20 28 72 65 73 3d 3d 30 20 3f 20 28  turn (res==0 ? (
5ba0: 70 4c 65 66 74 2d 3e 6e 20 2d 20 70 52 69 67 68  pLeft->n - pRigh
5bb0: 74 2d 3e 6e 29 20 3a 20 72 65 73 29 3b 0a 7d 0a  t->n) : res);.}.
5bc0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
5bd0: 45 42 55 47 0a 73 74 61 74 69 63 20 69 6e 74 20  EBUG.static int 
5be0: 66 74 73 35 42 6c 6f 62 43 6f 6d 70 61 72 65 28  fts5BlobCompare(
5bf0: 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 70 4c 65  .  const u8 *pLe
5c00: 66 74 2c 20 69 6e 74 20 6e 4c 65 66 74 2c 20 0a  ft, int nLeft, .
5c10: 20 20 63 6f 6e 73 74 20 75 38 20 2a 70 52 69 67    const u8 *pRig
5c20: 68 74 2c 20 69 6e 74 20 6e 52 69 67 68 74 0a 29  ht, int nRight.)
5c30: 7b 0a 20 20 69 6e 74 20 6e 43 6d 70 20 3d 20 4d  {.  int nCmp = M
5c40: 49 4e 28 6e 4c 65 66 74 2c 20 6e 52 69 67 68 74  IN(nLeft, nRight
5c50: 29 3b 0a 20 20 69 6e 74 20 72 65 73 20 3d 20 6d  );.  int res = m
5c60: 65 6d 63 6d 70 28 70 4c 65 66 74 2c 20 70 52 69  emcmp(pLeft, pRi
5c70: 67 68 74 2c 20 6e 43 6d 70 29 3b 0a 20 20 72 65  ght, nCmp);.  re
5c80: 74 75 72 6e 20 28 72 65 73 3d 3d 30 20 3f 20 28  turn (res==0 ? (
5c90: 6e 4c 65 66 74 20 2d 20 6e 52 69 67 68 74 29 20  nLeft - nRight) 
5ca0: 3a 20 72 65 73 29 3b 0a 7d 0a 23 65 6e 64 69 66  : res);.}.#endif
5cb0: 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 74  .../*.** Close t
5cc0: 68 65 20 72 65 61 64 2d 6f 6e 6c 79 20 62 6c 6f  he read-only blo
5cd0: 62 20 68 61 6e 64 6c 65 2c 20 69 66 20 69 74 20  b handle, if it 
5ce0: 69 73 20 6f 70 65 6e 2e 0a 2a 2f 0a 73 74 61 74  is open..*/.stat
5cf0: 69 63 20 76 6f 69 64 20 66 74 73 35 43 6c 6f 73  ic void fts5Clos
5d00: 65 52 65 61 64 65 72 28 46 74 73 35 49 6e 64 65  eReader(Fts5Inde
5d10: 78 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e  x *p){.  if( p->
5d20: 70 52 65 61 64 65 72 20 29 7b 0a 20 20 20 20 73  pReader ){.    s
5d30: 71 6c 69 74 65 33 5f 62 6c 6f 62 20 2a 70 52 65  qlite3_blob *pRe
5d40: 61 64 65 72 20 3d 20 70 2d 3e 70 52 65 61 64 65  ader = p->pReade
5d50: 72 3b 0a 20 20 20 20 70 2d 3e 70 52 65 61 64 65  r;.    p->pReade
5d60: 72 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74  r = 0;.    sqlit
5d70: 65 33 5f 62 6c 6f 62 5f 63 6c 6f 73 65 28 70 52  e3_blob_close(pR
5d80: 65 61 64 65 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a  eader);.  }.}...
5d90: 2f 2a 0a 2a 2a 20 52 65 74 72 69 65 76 65 20 61  /*.** Retrieve a
5da0: 20 72 65 63 6f 72 64 20 66 72 6f 6d 20 74 68 65   record from the
5db0: 20 25 5f 64 61 74 61 20 74 61 62 6c 65 2e 0a 2a   %_data table..*
5dc0: 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72  *.** If an error
5dd0: 20 6f 63 63 75 72 73 2c 20 4e 55 4c 4c 20 69 73   occurs, NULL is
5de0: 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 61 6e   returned and an
5df0: 20 65 72 72 6f 72 20 6c 65 66 74 20 69 6e 20 74   error left in t
5e00: 68 65 20 0a 2a 2a 20 46 74 73 35 49 6e 64 65 78  he .** Fts5Index
5e10: 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 73 74 61 74   object..*/.stat
5e20: 69 63 20 46 74 73 35 44 61 74 61 20 2a 66 74 73  ic Fts5Data *fts
5e30: 35 44 61 74 61 52 65 61 64 28 46 74 73 35 49 6e  5DataRead(Fts5In
5e40: 64 65 78 20 2a 70 2c 20 69 36 34 20 69 52 6f 77  dex *p, i64 iRow
5e50: 69 64 29 7b 0a 20 20 46 74 73 35 44 61 74 61 20  id){.  Fts5Data 
5e60: 2a 70 52 65 74 20 3d 20 30 3b 0a 20 20 69 66 28  *pRet = 0;.  if(
5e70: 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
5e80: 4b 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 20  K ){.    int rc 
5e90: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20  = SQLITE_OK;..  
5ea0: 20 20 69 66 28 20 70 2d 3e 70 52 65 61 64 65 72    if( p->pReader
5eb0: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 69   ){.      /* Thi
5ec0: 73 20 63 61 6c 6c 20 6d 61 79 20 72 65 74 75 72  s call may retur
5ed0: 6e 20 53 51 4c 49 54 45 5f 41 42 4f 52 54 20 69  n SQLITE_ABORT i
5ee0: 66 20 74 68 65 72 65 20 68 61 73 20 62 65 65 6e  f there has been
5ef0: 20 61 20 73 61 76 65 70 6f 69 6e 74 0a 20 20 20   a savepoint.   
5f00: 20 20 20 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 73     ** rollback s
5f10: 69 6e 63 65 20 69 74 20 77 61 73 20 6c 61 73 74  ince it was last
5f20: 20 75 73 65 64 2e 20 49 6e 20 74 68 69 73 20 63   used. In this c
5f30: 61 73 65 20 61 20 6e 65 77 20 62 6c 6f 62 20 68  ase a new blob h
5f40: 61 6e 64 6c 65 0a 20 20 20 20 20 20 2a 2a 20 69  andle.      ** i
5f50: 73 20 72 65 71 75 69 72 65 64 2e 20 20 2a 2f 0a  s required.  */.
5f60: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62 6c        sqlite3_bl
5f70: 6f 62 20 2a 70 42 6c 6f 62 20 3d 20 70 2d 3e 70  ob *pBlob = p->p
5f80: 52 65 61 64 65 72 3b 0a 20 20 20 20 20 20 70 2d  Reader;.      p-
5f90: 3e 70 52 65 61 64 65 72 20 3d 20 30 3b 0a 20 20  >pReader = 0;.  
5fa0: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
5fb0: 5f 62 6c 6f 62 5f 72 65 6f 70 65 6e 28 70 42 6c  _blob_reopen(pBl
5fc0: 6f 62 2c 20 69 52 6f 77 69 64 29 3b 0a 20 20 20  ob, iRowid);.   
5fd0: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 52     assert( p->pR
5fe0: 65 61 64 65 72 3d 3d 30 20 29 3b 0a 20 20 20 20  eader==0 );.    
5ff0: 20 20 70 2d 3e 70 52 65 61 64 65 72 20 3d 20 70    p->pReader = p
6000: 42 6c 6f 62 3b 0a 20 20 20 20 20 20 69 66 28 20  Blob;.      if( 
6010: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
6020: 0a 20 20 20 20 20 20 20 20 66 74 73 35 43 6c 6f  .        fts5Clo
6030: 73 65 52 65 61 64 65 72 28 70 29 3b 0a 20 20 20  seReader(p);.   
6040: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72     }.      if( r
6050: 63 3d 3d 53 51 4c 49 54 45 5f 41 42 4f 52 54 20  c==SQLITE_ABORT 
6060: 29 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  ) rc = SQLITE_OK
6070: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
6080: 49 66 20 74 68 65 20 62 6c 6f 62 20 68 61 6e 64  If the blob hand
6090: 6c 65 20 69 73 20 6e 6f 74 20 6f 70 65 6e 20 61  le is not open a
60a0: 74 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 6f 70  t this point, op
60b0: 65 6e 20 69 74 20 61 6e 64 20 73 65 65 6b 20 0a  en it and seek .
60c0: 20 20 20 20 2a 2a 20 74 6f 20 74 68 65 20 72 65      ** to the re
60d0: 71 75 65 73 74 65 64 20 65 6e 74 72 79 2e 20 20  quested entry.  
60e0: 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 52  */.    if( p->pR
60f0: 65 61 64 65 72 3d 3d 30 20 26 26 20 72 63 3d 3d  eader==0 && rc==
6100: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
6110: 20 20 20 46 74 73 35 43 6f 6e 66 69 67 20 2a 70     Fts5Config *p
6120: 43 6f 6e 66 69 67 20 3d 20 70 2d 3e 70 43 6f 6e  Config = p->pCon
6130: 66 69 67 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  fig;.      rc = 
6140: 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 6f 70 65  sqlite3_blob_ope
6150: 6e 28 70 43 6f 6e 66 69 67 2d 3e 64 62 2c 20 0a  n(pConfig->db, .
6160: 20 20 20 20 20 20 20 20 20 20 70 43 6f 6e 66 69            pConfi
6170: 67 2d 3e 7a 44 62 2c 20 70 2d 3e 7a 44 61 74 61  g->zDb, p->zData
6180: 54 62 6c 2c 20 22 62 6c 6f 63 6b 22 2c 20 69 52  Tbl, "block", iR
6190: 6f 77 69 64 2c 20 30 2c 20 26 70 2d 3e 70 52 65  owid, 0, &p->pRe
61a0: 61 64 65 72 0a 20 20 20 20 20 20 29 3b 0a 20 20  ader.      );.  
61b0: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 65    }..    /* If e
61c0: 69 74 68 65 72 20 6f 66 20 74 68 65 20 73 71 6c  ither of the sql
61d0: 69 74 65 33 5f 62 6c 6f 62 5f 6f 70 65 6e 28 29  ite3_blob_open()
61e0: 20 6f 72 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62   or sqlite3_blob
61f0: 5f 72 65 6f 70 65 6e 28 29 20 63 61 6c 6c 73 0a  _reopen() calls.
6200: 20 20 20 20 2a 2a 20 61 62 6f 76 65 20 72 65 74      ** above ret
6210: 75 72 6e 65 64 20 53 51 4c 49 54 45 5f 45 52 52  urned SQLITE_ERR
6220: 4f 52 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54  OR, return SQLIT
6230: 45 5f 43 4f 52 52 55 50 54 5f 56 54 41 42 20 69  E_CORRUPT_VTAB i
6240: 6e 73 74 65 61 64 2e 0a 20 20 20 20 2a 2a 20 41  nstead..    ** A
6250: 6c 6c 20 74 68 65 20 72 65 61 73 6f 6e 73 20 74  ll the reasons t
6260: 68 6f 73 65 20 66 75 6e 63 74 69 6f 6e 73 20 6d  hose functions m
6270: 69 67 68 74 20 72 65 74 75 72 6e 20 53 51 4c 49  ight return SQLI
6280: 54 45 5f 45 52 52 4f 52 20 2d 20 6d 69 73 73 69  TE_ERROR - missi
6290: 6e 67 0a 20 20 20 20 2a 2a 20 74 61 62 6c 65 2c  ng.    ** table,
62a0: 20 6d 69 73 73 69 6e 67 20 72 6f 77 2c 20 6e 6f   missing row, no
62b0: 6e 2d 62 6c 6f 62 2f 74 65 78 74 20 69 6e 20 62  n-blob/text in b
62c0: 6c 6f 63 6b 20 63 6f 6c 75 6d 6e 20 2d 20 69 6e  lock column - in
62d0: 64 69 63 61 74 65 20 0a 20 20 20 20 2a 2a 20 62  dicate .    ** b
62e0: 61 63 6b 69 6e 67 20 73 74 6f 72 65 20 63 6f 72  acking store cor
62f0: 72 75 70 74 69 6f 6e 2e 20 20 2a 2f 0a 20 20 20  ruption.  */.   
6300: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
6310: 45 52 52 4f 52 20 29 20 72 63 20 3d 20 46 54 53  ERROR ) rc = FTS
6320: 35 5f 43 4f 52 52 55 50 54 3b 0a 0a 20 20 20 20  5_CORRUPT;..    
6330: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
6340: 4b 20 29 7b 0a 20 20 20 20 20 20 75 38 20 2a 61  K ){.      u8 *a
6350: 4f 75 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20  Out = 0;        
6360: 20 20 20 20 20 20 20 2f 2a 20 52 65 61 64 20 62         /* Read b
6370: 6c 6f 62 20 64 61 74 61 20 69 6e 74 6f 20 74 68  lob data into th
6380: 69 73 20 62 75 66 66 65 72 20 2a 2f 0a 20 20 20  is buffer */.   
6390: 20 20 20 69 6e 74 20 6e 42 79 74 65 20 3d 20 73     int nByte = s
63a0: 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 62 79 74 65  qlite3_blob_byte
63b0: 73 28 70 2d 3e 70 52 65 61 64 65 72 29 3b 0a 20  s(p->pReader);. 
63c0: 20 20 20 20 20 69 6e 74 20 6e 41 6c 6c 6f 63 20       int nAlloc 
63d0: 3d 20 73 69 7a 65 6f 66 28 46 74 73 35 44 61 74  = sizeof(Fts5Dat
63e0: 61 29 20 2b 20 6e 42 79 74 65 20 2b 20 46 54 53  a) + nByte + FTS
63f0: 35 5f 44 41 54 41 5f 50 41 44 44 49 4e 47 3b 0a  5_DATA_PADDING;.
6400: 20 20 20 20 20 20 70 52 65 74 20 3d 20 28 46 74        pRet = (Ft
6410: 73 35 44 61 74 61 2a 29 73 71 6c 69 74 65 33 5f  s5Data*)sqlite3_
6420: 6d 61 6c 6c 6f 63 28 6e 41 6c 6c 6f 63 29 3b 0a  malloc(nAlloc);.
6430: 20 20 20 20 20 20 69 66 28 20 70 52 65 74 20 29        if( pRet )
6440: 7b 0a 20 20 20 20 20 20 20 20 70 52 65 74 2d 3e  {.        pRet->
6450: 6e 6e 20 3d 20 6e 42 79 74 65 3b 0a 20 20 20 20  nn = nByte;.    
6460: 20 20 20 20 61 4f 75 74 20 3d 20 70 52 65 74 2d      aOut = pRet-
6470: 3e 70 20 3d 20 28 75 38 2a 29 26 70 52 65 74 5b  >p = (u8*)&pRet[
6480: 31 5d 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  1];.      }else{
6490: 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51  .        rc = SQ
64a0: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
64b0: 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 72    }..      if( r
64c0: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
64d0: 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
64e0: 69 74 65 33 5f 62 6c 6f 62 5f 72 65 61 64 28 70  ite3_blob_read(p
64f0: 2d 3e 70 52 65 61 64 65 72 2c 20 61 4f 75 74 2c  ->pReader, aOut,
6500: 20 6e 42 79 74 65 2c 20 30 29 3b 0a 20 20 20 20   nByte, 0);.    
6510: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63    }.      if( rc
6520: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
6530: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66         sqlite3_f
6540: 72 65 65 28 70 52 65 74 29 3b 0a 20 20 20 20 20  ree(pRet);.     
6550: 20 20 20 70 52 65 74 20 3d 20 30 3b 0a 20 20 20     pRet = 0;.   
6560: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
6570: 20 20 2f 2a 20 54 4f 44 4f 31 3a 20 46 69 78 20    /* TODO1: Fix 
6580: 74 68 69 73 20 2a 2f 0a 20 20 20 20 20 20 20 20  this */.        
6590: 70 52 65 74 2d 3e 73 7a 4c 65 61 66 20 3d 20 66  pRet->szLeaf = f
65a0: 74 73 35 47 65 74 55 31 36 28 26 70 52 65 74 2d  ts5GetU16(&pRet-
65b0: 3e 70 5b 32 5d 29 3b 0a 20 20 20 20 20 20 7d 0a  >p[2]);.      }.
65c0: 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 72 63 20      }.    p->rc 
65d0: 3d 20 72 63 3b 0a 20 20 20 20 70 2d 3e 6e 52 65  = rc;.    p->nRe
65e0: 61 64 2b 2b 3b 0a 20 20 7d 0a 0a 20 20 61 73 73  ad++;.  }..  ass
65f0: 65 72 74 28 20 28 70 52 65 74 3d 3d 30 29 3d 3d  ert( (pRet==0)==
6600: 28 70 2d 3e 72 63 21 3d 53 51 4c 49 54 45 5f 4f  (p->rc!=SQLITE_O
6610: 4b 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 70  K) );.  return p
6620: 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  Ret;.}../*.** Re
6630: 6c 65 61 73 65 20 61 20 72 65 66 65 72 65 6e 63  lease a referenc
6640: 65 20 74 6f 20 64 61 74 61 20 72 65 63 6f 72 64  e to data record
6650: 20 72 65 74 75 72 6e 65 64 20 62 79 20 61 6e 20   returned by an 
6660: 65 61 72 6c 69 65 72 20 63 61 6c 6c 20 74 6f 0a  earlier call to.
6670: 2a 2a 20 66 74 73 35 44 61 74 61 52 65 61 64 28  ** fts5DataRead(
6680: 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  )..*/.static voi
6690: 64 20 66 74 73 35 44 61 74 61 52 65 6c 65 61 73  d fts5DataReleas
66a0: 65 28 46 74 73 35 44 61 74 61 20 2a 70 44 61 74  e(Fts5Data *pDat
66b0: 61 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72  a){.  sqlite3_fr
66c0: 65 65 28 70 44 61 74 61 29 3b 0a 7d 0a 0a 73 74  ee(pData);.}..st
66d0: 61 74 69 63 20 69 6e 74 20 66 74 73 35 49 6e 64  atic int fts5Ind
66e0: 65 78 50 72 65 70 61 72 65 53 74 6d 74 28 0a 20  exPrepareStmt(. 
66f0: 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 0a 20   Fts5Index *p,. 
6700: 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 2a   sqlite3_stmt **
6710: 70 70 53 74 6d 74 2c 0a 20 20 63 68 61 72 20 2a  ppStmt,.  char *
6720: 7a 53 71 6c 0a 29 7b 0a 20 20 69 66 28 20 70 2d  zSql.){.  if( p-
6730: 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  >rc==SQLITE_OK )
6740: 7b 0a 20 20 20 20 69 66 28 20 7a 53 71 6c 20 29  {.    if( zSql )
6750: 7b 0a 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20  {.      p->rc = 
6760: 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f  sqlite3_prepare_
6770: 76 32 28 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e 64  v2(p->pConfig->d
6780: 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20 70 70 53  b, zSql, -1, ppS
6790: 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c  tmt, 0);.    }el
67a0: 73 65 7b 0a 20 20 20 20 20 20 70 2d 3e 72 63 20  se{.      p->rc 
67b0: 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
67c0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69      }.  }.  sqli
67d0: 74 65 33 5f 66 72 65 65 28 7a 53 71 6c 29 3b 0a  te3_free(zSql);.
67e0: 20 20 72 65 74 75 72 6e 20 70 2d 3e 72 63 3b 0a    return p->rc;.
67f0: 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 49 4e 53 45 52 54  }.../*.** INSERT
6800: 20 4f 52 20 52 45 50 4c 41 43 45 20 61 20 72 65   OR REPLACE a re
6810: 63 6f 72 64 20 69 6e 74 6f 20 74 68 65 20 25 5f  cord into the %_
6820: 64 61 74 61 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73  data table..*/.s
6830: 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 44  tatic void fts5D
6840: 61 74 61 57 72 69 74 65 28 46 74 73 35 49 6e 64  ataWrite(Fts5Ind
6850: 65 78 20 2a 70 2c 20 69 36 34 20 69 52 6f 77 69  ex *p, i64 iRowi
6860: 64 2c 20 63 6f 6e 73 74 20 75 38 20 2a 70 44 61  d, const u8 *pDa
6870: 74 61 2c 20 69 6e 74 20 6e 44 61 74 61 29 7b 0a  ta, int nData){.
6880: 20 20 69 66 28 20 70 2d 3e 72 63 21 3d 53 51 4c    if( p->rc!=SQL
6890: 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 3b  ITE_OK ) return;
68a0: 0a 0a 20 20 69 66 28 20 70 2d 3e 70 57 72 69 74  ..  if( p->pWrit
68b0: 65 72 3d 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74  er==0 ){.    int
68c0: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
68d0: 0a 20 20 20 20 46 74 73 35 43 6f 6e 66 69 67 20  .    Fts5Config 
68e0: 2a 70 43 6f 6e 66 69 67 20 3d 20 70 2d 3e 70 43  *pConfig = p->pC
68f0: 6f 6e 66 69 67 3b 0a 20 20 20 20 66 74 73 35 49  onfig;.    fts5I
6900: 6e 64 65 78 50 72 65 70 61 72 65 53 74 6d 74 28  ndexPrepareStmt(
6910: 70 2c 20 26 70 2d 3e 70 57 72 69 74 65 72 2c 20  p, &p->pWriter, 
6920: 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
6930: 0a 20 20 20 20 20 20 20 20 20 20 22 52 45 50 4c  .          "REPL
6940: 41 43 45 20 49 4e 54 4f 20 27 25 71 27 2e 27 25  ACE INTO '%q'.'%
6950: 71 5f 64 61 74 61 27 28 69 64 2c 20 62 6c 6f 63  q_data'(id, bloc
6960: 6b 29 20 56 41 4c 55 45 53 28 3f 2c 3f 29 22 2c  k) VALUES(?,?)",
6970: 20 0a 20 20 20 20 20 20 20 20 20 20 70 43 6f 6e   .          pCon
6980: 66 69 67 2d 3e 7a 44 62 2c 20 70 43 6f 6e 66 69  fig->zDb, pConfi
6990: 67 2d 3e 7a 4e 61 6d 65 0a 20 20 20 20 29 29 3b  g->zName.    ));
69a0: 0a 20 20 20 20 69 66 28 20 70 2d 3e 72 63 20 29  .    if( p->rc )
69b0: 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20   return;.  }..  
69c0: 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74  sqlite3_bind_int
69d0: 36 34 28 70 2d 3e 70 57 72 69 74 65 72 2c 20 31  64(p->pWriter, 1
69e0: 2c 20 69 52 6f 77 69 64 29 3b 0a 20 20 73 71 6c  , iRowid);.  sql
69f0: 69 74 65 33 5f 62 69 6e 64 5f 62 6c 6f 62 28 70  ite3_bind_blob(p
6a00: 2d 3e 70 57 72 69 74 65 72 2c 20 32 2c 20 70 44  ->pWriter, 2, pD
6a10: 61 74 61 2c 20 6e 44 61 74 61 2c 20 53 51 4c 49  ata, nData, SQLI
6a20: 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 73 71  TE_STATIC);.  sq
6a30: 6c 69 74 65 33 5f 73 74 65 70 28 70 2d 3e 70 57  lite3_step(p->pW
6a40: 72 69 74 65 72 29 3b 0a 20 20 70 2d 3e 72 63 20  riter);.  p->rc 
6a50: 3d 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28  = sqlite3_reset(
6a60: 70 2d 3e 70 57 72 69 74 65 72 29 3b 0a 7d 0a 0a  p->pWriter);.}..
6a70: 2f 2a 0a 2a 2a 20 45 78 65 63 75 74 65 20 74 68  /*.** Execute th
6a80: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 53 51 4c 3a  e following SQL:
6a90: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 44 45 4c 45 54  .**.**     DELET
6aa0: 45 20 46 52 4f 4d 20 25 5f 64 61 74 61 20 57 48  E FROM %_data WH
6ab0: 45 52 45 20 69 64 20 42 45 54 57 45 45 4e 20 24  ERE id BETWEEN $
6ac0: 69 46 69 72 73 74 20 41 4e 44 20 24 69 4c 61 73  iFirst AND $iLas
6ad0: 74 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  t.*/.static void
6ae0: 20 66 74 73 35 44 61 74 61 44 65 6c 65 74 65 28   fts5DataDelete(
6af0: 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 69 36  Fts5Index *p, i6
6b00: 34 20 69 46 69 72 73 74 2c 20 69 36 34 20 69 4c  4 iFirst, i64 iL
6b10: 61 73 74 29 7b 0a 20 20 69 66 28 20 70 2d 3e 72  ast){.  if( p->r
6b20: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
6b30: 65 74 75 72 6e 3b 0a 0a 20 20 69 66 28 20 70 2d  eturn;..  if( p-
6b40: 3e 70 44 65 6c 65 74 65 72 3d 3d 30 20 29 7b 0a  >pDeleter==0 ){.
6b50: 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20      int rc;.    
6b60: 46 74 73 35 43 6f 6e 66 69 67 20 2a 70 43 6f 6e  Fts5Config *pCon
6b70: 66 69 67 20 3d 20 70 2d 3e 70 43 6f 6e 66 69 67  fig = p->pConfig
6b80: 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 53 71 6c  ;.    char *zSql
6b90: 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
6ba0: 74 66 28 0a 20 20 20 20 20 20 20 20 22 44 45 4c  tf(.        "DEL
6bb0: 45 54 45 20 46 52 4f 4d 20 27 25 71 27 2e 27 25  ETE FROM '%q'.'%
6bc0: 71 5f 64 61 74 61 27 20 57 48 45 52 45 20 69 64  q_data' WHERE id
6bd0: 3e 3d 3f 20 41 4e 44 20 69 64 3c 3d 3f 22 2c 20  >=? AND id<=?", 
6be0: 0a 20 20 20 20 20 20 20 20 20 20 70 43 6f 6e 66  .          pConf
6bf0: 69 67 2d 3e 7a 44 62 2c 20 70 43 6f 6e 66 69 67  ig->zDb, pConfig
6c00: 2d 3e 7a 4e 61 6d 65 0a 20 20 20 20 29 3b 0a 20  ->zName.    );. 
6c10: 20 20 20 69 66 28 20 7a 53 71 6c 3d 3d 30 20 29     if( zSql==0 )
6c20: 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
6c30: 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d  ITE_NOMEM;.    }
6c40: 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d  else{.      rc =
6c50: 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65   sqlite3_prepare
6c60: 5f 76 32 28 70 43 6f 6e 66 69 67 2d 3e 64 62 2c  _v2(pConfig->db,
6c70: 20 7a 53 71 6c 2c 20 2d 31 2c 20 26 70 2d 3e 70   zSql, -1, &p->p
6c80: 44 65 6c 65 74 65 72 2c 20 30 29 3b 0a 20 20 20  Deleter, 0);.   
6c90: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
6ca0: 7a 53 71 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20  zSql);.    }.   
6cb0: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
6cc0: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 72  OK ){.      p->r
6cd0: 63 20 3d 20 72 63 3b 0a 20 20 20 20 20 20 72 65  c = rc;.      re
6ce0: 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  turn;.    }.  }.
6cf0: 0a 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f  .  sqlite3_bind_
6d00: 69 6e 74 36 34 28 70 2d 3e 70 44 65 6c 65 74 65  int64(p->pDelete
6d10: 72 2c 20 31 2c 20 69 46 69 72 73 74 29 3b 0a 20  r, 1, iFirst);. 
6d20: 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e   sqlite3_bind_in
6d30: 74 36 34 28 70 2d 3e 70 44 65 6c 65 74 65 72 2c  t64(p->pDeleter,
6d40: 20 32 2c 20 69 4c 61 73 74 29 3b 0a 20 20 73 71   2, iLast);.  sq
6d50: 6c 69 74 65 33 5f 73 74 65 70 28 70 2d 3e 70 44  lite3_step(p->pD
6d60: 65 6c 65 74 65 72 29 3b 0a 20 20 70 2d 3e 72 63  eleter);.  p->rc
6d70: 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74   = sqlite3_reset
6d80: 28 70 2d 3e 70 44 65 6c 65 74 65 72 29 3b 0a 7d  (p->pDeleter);.}
6d90: 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20 61  ../*.** Remove a
6da0: 6c 6c 20 72 65 63 6f 72 64 73 20 61 73 73 6f 63  ll records assoc
6db0: 69 61 74 65 64 20 77 69 74 68 20 73 65 67 6d 65  iated with segme
6dc0: 6e 74 20 69 53 65 67 69 64 2e 0a 2a 2f 0a 73 74  nt iSegid..*/.st
6dd0: 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 44 61  atic void fts5Da
6de0: 74 61 52 65 6d 6f 76 65 53 65 67 6d 65 6e 74 28  taRemoveSegment(
6df0: 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 69 6e  Fts5Index *p, in
6e00: 74 20 69 53 65 67 69 64 29 7b 0a 20 20 69 36 34  t iSegid){.  i64
6e10: 20 69 46 69 72 73 74 20 3d 20 46 54 53 35 5f 53   iFirst = FTS5_S
6e20: 45 47 4d 45 4e 54 5f 52 4f 57 49 44 28 69 53 65  EGMENT_ROWID(iSe
6e30: 67 69 64 2c 20 30 2c 20 30 29 3b 0a 20 20 69 36  gid, 0, 0);.  i6
6e40: 34 20 69 4c 61 73 74 20 3d 20 46 54 53 35 5f 53  4 iLast = FTS5_S
6e50: 45 47 4d 45 4e 54 5f 52 4f 57 49 44 28 69 53 65  EGMENT_ROWID(iSe
6e60: 67 69 64 2b 31 2c 20 30 2c 20 30 29 2d 31 3b 0a  gid+1, 0, 0)-1;.
6e70: 20 20 66 74 73 35 44 61 74 61 44 65 6c 65 74 65    fts5DataDelete
6e80: 28 70 2c 20 69 46 69 72 73 74 2c 20 69 4c 61 73  (p, iFirst, iLas
6e90: 74 29 3b 0a 20 20 69 66 28 20 70 2d 3e 70 49 64  t);.  if( p->pId
6ea0: 78 44 65 6c 65 74 65 72 3d 3d 30 20 29 7b 0a 20  xDeleter==0 ){. 
6eb0: 20 20 20 46 74 73 35 43 6f 6e 66 69 67 20 2a 70     Fts5Config *p
6ec0: 43 6f 6e 66 69 67 20 3d 20 70 2d 3e 70 43 6f 6e  Config = p->pCon
6ed0: 66 69 67 3b 0a 20 20 20 20 66 74 73 35 49 6e 64  fig;.    fts5Ind
6ee0: 65 78 50 72 65 70 61 72 65 53 74 6d 74 28 70 2c  exPrepareStmt(p,
6ef0: 20 26 70 2d 3e 70 49 64 78 44 65 6c 65 74 65 72   &p->pIdxDeleter
6f00: 2c 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  , sqlite3_mprint
6f10: 66 28 0a 20 20 20 20 20 20 20 20 20 20 22 44 45  f(.          "DE
6f20: 4c 45 54 45 20 46 52 4f 4d 20 27 25 71 27 2e 27  LETE FROM '%q'.'
6f30: 25 71 5f 69 64 78 27 20 57 48 45 52 45 20 73 65  %q_idx' WHERE se
6f40: 67 69 64 3d 3f 22 2c 0a 20 20 20 20 20 20 20 20  gid=?",.        
6f50: 20 20 70 43 6f 6e 66 69 67 2d 3e 7a 44 62 2c 20    pConfig->zDb, 
6f60: 70 43 6f 6e 66 69 67 2d 3e 7a 4e 61 6d 65 0a 20  pConfig->zName. 
6f70: 20 20 20 29 29 3b 0a 20 20 7d 0a 20 20 69 66 28     ));.  }.  if(
6f80: 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
6f90: 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  K ){.    sqlite3
6fa0: 5f 62 69 6e 64 5f 69 6e 74 28 70 2d 3e 70 49 64  _bind_int(p->pId
6fb0: 78 44 65 6c 65 74 65 72 2c 20 31 2c 20 69 53 65  xDeleter, 1, iSe
6fc0: 67 69 64 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  gid);.    sqlite
6fd0: 33 5f 73 74 65 70 28 70 2d 3e 70 49 64 78 44 65  3_step(p->pIdxDe
6fe0: 6c 65 74 65 72 29 3b 0a 20 20 20 20 70 2d 3e 72  leter);.    p->r
6ff0: 63 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 73 65  c = sqlite3_rese
7000: 74 28 70 2d 3e 70 49 64 78 44 65 6c 65 74 65 72  t(p->pIdxDeleter
7010: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
7020: 52 65 6c 65 61 73 65 20 61 20 72 65 66 65 72 65  Release a refere
7030: 6e 63 65 20 74 6f 20 61 6e 20 46 74 73 35 53 74  nce to an Fts5St
7040: 72 75 63 74 75 72 65 20 6f 62 6a 65 63 74 20 72  ructure object r
7050: 65 74 75 72 6e 65 64 20 62 79 20 61 6e 20 65 61  eturned by an ea
7060: 72 6c 69 65 72 20 0a 2a 2a 20 63 61 6c 6c 20 74  rlier .** call t
7070: 6f 20 66 74 73 35 53 74 72 75 63 74 75 72 65 52  o fts5StructureR
7080: 65 61 64 28 29 20 6f 72 20 66 74 73 35 53 74 72  ead() or fts5Str
7090: 75 63 74 75 72 65 44 65 63 6f 64 65 28 29 2e 0a  uctureDecode()..
70a0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
70b0: 74 73 35 53 74 72 75 63 74 75 72 65 52 65 6c 65  ts5StructureRele
70c0: 61 73 65 28 46 74 73 35 53 74 72 75 63 74 75 72  ase(Fts5Structur
70d0: 65 20 2a 70 53 74 72 75 63 74 29 7b 0a 20 20 69  e *pStruct){.  i
70e0: 66 28 20 70 53 74 72 75 63 74 20 26 26 20 30 3e  f( pStruct && 0>
70f0: 3d 28 2d 2d 70 53 74 72 75 63 74 2d 3e 6e 52 65  =(--pStruct->nRe
7100: 66 29 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b  f) ){.    int i;
7110: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 53 74  .    assert( pSt
7120: 72 75 63 74 2d 3e 6e 52 65 66 3d 3d 30 20 29 3b  ruct->nRef==0 );
7130: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
7140: 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 3b  pStruct->nLevel;
7150: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c   i++){.      sql
7160: 69 74 65 33 5f 66 72 65 65 28 70 53 74 72 75 63  ite3_free(pStruc
7170: 74 2d 3e 61 4c 65 76 65 6c 5b 69 5d 2e 61 53 65  t->aLevel[i].aSe
7180: 67 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  g);.    }.    sq
7190: 6c 69 74 65 33 5f 66 72 65 65 28 70 53 74 72 75  lite3_free(pStru
71a0: 63 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74  ct);.  }.}..stat
71b0: 69 63 20 76 6f 69 64 20 66 74 73 35 53 74 72 75  ic void fts5Stru
71c0: 63 74 75 72 65 52 65 66 28 46 74 73 35 53 74 72  ctureRef(Fts5Str
71d0: 75 63 74 75 72 65 20 2a 70 53 74 72 75 63 74 29  ucture *pStruct)
71e0: 7b 0a 20 20 70 53 74 72 75 63 74 2d 3e 6e 52 65  {.  pStruct->nRe
71f0: 66 2b 2b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65  f++;.}../*.** De
7200: 73 65 72 69 61 6c 69 7a 65 20 61 6e 64 20 72 65  serialize and re
7210: 74 75 72 6e 20 74 68 65 20 73 74 72 75 63 74 75  turn the structu
7220: 72 65 20 72 65 63 6f 72 64 20 63 75 72 72 65 6e  re record curren
7230: 74 6c 79 20 73 74 6f 72 65 64 20 69 6e 20 73 65  tly stored in se
7240: 72 69 61 6c 69 7a 65 64 0a 2a 2a 20 66 6f 72 6d  rialized.** form
7250: 20 77 69 74 68 69 6e 20 62 75 66 66 65 72 20 70   within buffer p
7260: 44 61 74 61 2f 6e 44 61 74 61 2e 0a 2a 2a 0a 2a  Data/nData..**.*
7270: 2a 20 54 68 65 20 46 74 73 35 53 74 72 75 63 74  * The Fts5Struct
7280: 75 72 65 2e 61 4c 65 76 65 6c 5b 5d 20 61 6e 64  ure.aLevel[] and
7290: 20 65 61 63 68 20 46 74 73 35 53 74 72 75 63 74   each Fts5Struct
72a0: 75 72 65 4c 65 76 65 6c 2e 61 53 65 67 5b 5d 20  ureLevel.aSeg[] 
72b0: 61 72 72 61 79 0a 2a 2a 20 61 72 65 20 6f 76 65  array.** are ove
72c0: 72 2d 61 6c 6c 6f 63 61 74 65 64 20 62 79 20 6f  r-allocated by o
72d0: 6e 65 20 73 6c 6f 74 2e 20 54 68 69 73 20 61 6c  ne slot. This al
72e0: 6c 6f 77 73 20 74 68 65 20 73 74 72 75 63 74 75  lows the structu
72f0: 72 65 20 63 6f 6e 74 65 6e 74 73 0a 2a 2a 20 74  re contents.** t
7300: 6f 20 62 65 20 6d 6f 72 65 20 65 61 73 69 6c 79  o be more easily
7310: 20 65 64 69 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 49   edited..**.** I
7320: 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
7330: 73 2c 20 2a 70 70 4f 75 74 20 69 73 20 73 65 74  s, *ppOut is set
7340: 20 74 6f 20 4e 55 4c 4c 20 61 6e 64 20 61 6e 20   to NULL and an 
7350: 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64  SQLite error cod
7360: 65 0a 2a 2a 20 72 65 74 75 72 6e 65 64 2e 20 4f  e.** returned. O
7370: 74 68 65 72 77 69 73 65 2c 20 2a 70 70 4f 75 74  therwise, *ppOut
7380: 20 69 73 20 73 65 74 20 74 6f 20 70 6f 69 6e 74   is set to point
7390: 20 74 6f 20 74 68 65 20 6e 65 77 20 6f 62 6a 65   to the new obje
73a0: 63 74 20 61 6e 64 0a 2a 2a 20 53 51 4c 49 54 45  ct and.** SQLITE
73b0: 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f  _OK returned..*/
73c0: 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 35  .static int fts5
73d0: 53 74 72 75 63 74 75 72 65 44 65 63 6f 64 65 28  StructureDecode(
73e0: 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 70 44 61  .  const u8 *pDa
73f0: 74 61 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ta,             
7400: 20 20 20 2f 2a 20 42 75 66 66 65 72 20 63 6f 6e     /* Buffer con
7410: 74 61 69 6e 69 6e 67 20 73 65 72 69 61 6c 69 7a  taining serializ
7420: 65 64 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a  ed structure */.
7430: 20 20 69 6e 74 20 6e 44 61 74 61 2c 20 20 20 20    int nData,    
7440: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7450: 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 62 75 66    /* Size of buf
7460: 66 65 72 20 70 44 61 74 61 20 69 6e 20 62 79 74  fer pData in byt
7470: 65 73 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 69 43  es */.  int *piC
7480: 6f 6f 6b 69 65 2c 20 20 20 20 20 20 20 20 20 20  ookie,          
7490: 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 66 69          /* Confi
74a0: 67 75 72 61 74 69 6f 6e 20 63 6f 6f 6b 69 65 20  guration cookie 
74b0: 76 61 6c 75 65 20 2a 2f 0a 20 20 46 74 73 35 53  value */.  Fts5S
74c0: 74 72 75 63 74 75 72 65 20 2a 2a 70 70 4f 75 74  tructure **ppOut
74d0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55             /* OU
74e0: 54 3a 20 44 65 73 65 72 69 61 6c 69 7a 65 64 20  T: Deserialized 
74f0: 6f 62 6a 65 63 74 20 2a 2f 0a 29 7b 0a 20 20 69  object */.){.  i
7500: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
7510: 4b 3b 0a 20 20 69 6e 74 20 69 20 3d 20 30 3b 0a  K;.  int i = 0;.
7520: 20 20 69 6e 74 20 69 4c 76 6c 3b 0a 20 20 69 6e    int iLvl;.  in
7530: 74 20 6e 4c 65 76 65 6c 20 3d 20 30 3b 0a 20 20  t nLevel = 0;.  
7540: 69 6e 74 20 6e 53 65 67 6d 65 6e 74 20 3d 20 30  int nSegment = 0
7550: 3b 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b 20 20  ;.  int nByte;  
7560: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7570: 20 20 20 20 2f 2a 20 42 79 74 65 73 20 6f 66 20      /* Bytes of 
7580: 73 70 61 63 65 20 74 6f 20 61 6c 6c 6f 63 61 74  space to allocat
7590: 65 20 61 74 20 70 52 65 74 20 2a 2f 0a 20 20 46  e at pRet */.  F
75a0: 74 73 35 53 74 72 75 63 74 75 72 65 20 2a 70 52  ts5Structure *pR
75b0: 65 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 2f  et = 0;        /
75c0: 2a 20 53 74 72 75 63 74 75 72 65 20 6f 62 6a 65  * Structure obje
75d0: 63 74 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a  ct to return */.
75e0: 0a 20 20 2f 2a 20 47 72 61 62 20 74 68 65 20 63  .  /* Grab the c
75f0: 6f 6f 6b 69 65 20 76 61 6c 75 65 20 2a 2f 0a 20  ookie value */. 
7600: 20 69 66 28 20 70 69 43 6f 6f 6b 69 65 20 29 20   if( piCookie ) 
7610: 2a 70 69 43 6f 6f 6b 69 65 20 3d 20 73 71 6c 69  *piCookie = sqli
7620: 74 65 33 46 74 73 35 47 65 74 33 32 28 70 44 61  te3Fts5Get32(pDa
7630: 74 61 29 3b 0a 20 20 69 20 3d 20 34 3b 0a 0a 20  ta);.  i = 4;.. 
7640: 20 2f 2a 20 52 65 61 64 20 74 68 65 20 74 6f 74   /* Read the tot
7650: 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 6c 65 76  al number of lev
7660: 65 6c 73 20 61 6e 64 20 73 65 67 6d 65 6e 74 73  els and segments
7670: 20 66 72 6f 6d 20 74 68 65 20 73 74 61 72 74 20   from the start 
7680: 6f 66 20 74 68 65 0a 20 20 2a 2a 20 73 74 72 75  of the.  ** stru
7690: 63 74 75 72 65 20 72 65 63 6f 72 64 2e 20 20 2a  cture record.  *
76a0: 2f 0a 20 20 69 20 2b 3d 20 66 74 73 35 47 65 74  /.  i += fts5Get
76b0: 56 61 72 69 6e 74 33 32 28 26 70 44 61 74 61 5b  Varint32(&pData[
76c0: 69 5d 2c 20 6e 4c 65 76 65 6c 29 3b 0a 20 20 69  i], nLevel);.  i
76d0: 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e   += fts5GetVarin
76e0: 74 33 32 28 26 70 44 61 74 61 5b 69 5d 2c 20 6e  t32(&pData[i], n
76f0: 53 65 67 6d 65 6e 74 29 3b 0a 20 20 6e 42 79 74  Segment);.  nByt
7700: 65 20 3d 20 28 0a 20 20 20 20 20 20 73 69 7a 65  e = (.      size
7710: 6f 66 28 46 74 73 35 53 74 72 75 63 74 75 72 65  of(Fts5Structure
7720: 29 20 2b 20 20 20 20 20 20 20 20 20 20 20 20 20  ) +             
7730: 20 20 20 20 20 20 20 2f 2a 20 4d 61 69 6e 20 73         /* Main s
7740: 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 20 20  tructure */.    
7750: 20 20 73 69 7a 65 6f 66 28 46 74 73 35 53 74 72    sizeof(Fts5Str
7760: 75 63 74 75 72 65 4c 65 76 65 6c 29 20 2a 20 28  uctureLevel) * (
7770: 6e 4c 65 76 65 6c 2d 31 29 20 20 20 20 2f 2a 20  nLevel-1)    /* 
7780: 61 4c 65 76 65 6c 5b 5d 20 61 72 72 61 79 20 2a  aLevel[] array *
7790: 2f 0a 20 20 29 3b 0a 20 20 70 52 65 74 20 3d 20  /.  );.  pRet = 
77a0: 28 46 74 73 35 53 74 72 75 63 74 75 72 65 2a 29  (Fts5Structure*)
77b0: 73 71 6c 69 74 65 33 46 74 73 35 4d 61 6c 6c 6f  sqlite3Fts5Mallo
77c0: 63 5a 65 72 6f 28 26 72 63 2c 20 6e 42 79 74 65  cZero(&rc, nByte
77d0: 29 3b 0a 0a 20 20 69 66 28 20 70 52 65 74 20 29  );..  if( pRet )
77e0: 7b 0a 20 20 20 20 70 52 65 74 2d 3e 6e 52 65 66  {.    pRet->nRef
77f0: 20 3d 20 31 3b 0a 20 20 20 20 70 52 65 74 2d 3e   = 1;.    pRet->
7800: 6e 4c 65 76 65 6c 20 3d 20 6e 4c 65 76 65 6c 3b  nLevel = nLevel;
7810: 0a 20 20 20 20 70 52 65 74 2d 3e 6e 53 65 67 6d  .    pRet->nSegm
7820: 65 6e 74 20 3d 20 6e 53 65 67 6d 65 6e 74 3b 0a  ent = nSegment;.
7830: 20 20 20 20 69 20 2b 3d 20 73 71 6c 69 74 65 33      i += sqlite3
7840: 46 74 73 35 47 65 74 56 61 72 69 6e 74 28 26 70  Fts5GetVarint(&p
7850: 44 61 74 61 5b 69 5d 2c 20 26 70 52 65 74 2d 3e  Data[i], &pRet->
7860: 6e 57 72 69 74 65 43 6f 75 6e 74 65 72 29 3b 0a  nWriteCounter);.
7870: 0a 20 20 20 20 66 6f 72 28 69 4c 76 6c 3d 30 3b  .    for(iLvl=0;
7880: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
7890: 26 20 69 4c 76 6c 3c 6e 4c 65 76 65 6c 3b 20 69  & iLvl<nLevel; i
78a0: 4c 76 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 46 74  Lvl++){.      Ft
78b0: 73 35 53 74 72 75 63 74 75 72 65 4c 65 76 65 6c  s5StructureLevel
78c0: 20 2a 70 4c 76 6c 20 3d 20 26 70 52 65 74 2d 3e   *pLvl = &pRet->
78d0: 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d 3b 0a 20 20  aLevel[iLvl];.  
78e0: 20 20 20 20 69 6e 74 20 6e 54 6f 74 61 6c 3b 0a      int nTotal;.
78f0: 20 20 20 20 20 20 69 6e 74 20 69 53 65 67 3b 0a        int iSeg;.
7900: 0a 20 20 20 20 20 20 69 20 2b 3d 20 66 74 73 35  .      i += fts5
7910: 47 65 74 56 61 72 69 6e 74 33 32 28 26 70 44 61  GetVarint32(&pDa
7920: 74 61 5b 69 5d 2c 20 70 4c 76 6c 2d 3e 6e 4d 65  ta[i], pLvl->nMe
7930: 72 67 65 29 3b 0a 20 20 20 20 20 20 69 20 2b 3d  rge);.      i +=
7940: 20 66 74 73 35 47 65 74 56 61 72 69 6e 74 33 32   fts5GetVarint32
7950: 28 26 70 44 61 74 61 5b 69 5d 2c 20 6e 54 6f 74  (&pData[i], nTot
7960: 61 6c 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  al);.      asser
7970: 74 28 20 6e 54 6f 74 61 6c 3e 3d 70 4c 76 6c 2d  t( nTotal>=pLvl-
7980: 3e 6e 4d 65 72 67 65 20 29 3b 0a 20 20 20 20 20  >nMerge );.     
7990: 20 70 4c 76 6c 2d 3e 61 53 65 67 20 3d 20 28 46   pLvl->aSeg = (F
79a0: 74 73 35 53 74 72 75 63 74 75 72 65 53 65 67 6d  ts5StructureSegm
79b0: 65 6e 74 2a 29 73 71 6c 69 74 65 33 46 74 73 35  ent*)sqlite3Fts5
79c0: 4d 61 6c 6c 6f 63 5a 65 72 6f 28 26 72 63 2c 20  MallocZero(&rc, 
79d0: 0a 20 20 20 20 20 20 20 20 20 20 6e 54 6f 74 61  .          nTota
79e0: 6c 20 2a 20 73 69 7a 65 6f 66 28 46 74 73 35 53  l * sizeof(Fts5S
79f0: 74 72 75 63 74 75 72 65 53 65 67 6d 65 6e 74 29  tructureSegment)
7a00: 0a 20 20 20 20 20 20 29 3b 0a 0a 20 20 20 20 20  .      );..     
7a10: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
7a20: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4c  OK ){.        pL
7a30: 76 6c 2d 3e 6e 53 65 67 20 3d 20 6e 54 6f 74 61  vl->nSeg = nTota
7a40: 6c 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69  l;.        for(i
7a50: 53 65 67 3d 30 3b 20 69 53 65 67 3c 6e 54 6f 74  Seg=0; iSeg<nTot
7a60: 61 6c 3b 20 69 53 65 67 2b 2b 29 7b 0a 20 20 20  al; iSeg++){.   
7a70: 20 20 20 20 20 20 20 69 20 2b 3d 20 66 74 73 35         i += fts5
7a80: 47 65 74 56 61 72 69 6e 74 33 32 28 26 70 44 61  GetVarint32(&pDa
7a90: 74 61 5b 69 5d 2c 20 70 4c 76 6c 2d 3e 61 53 65  ta[i], pLvl->aSe
7aa0: 67 5b 69 53 65 67 5d 2e 69 53 65 67 69 64 29 3b  g[iSeg].iSegid);
7ab0: 0a 20 20 20 20 20 20 20 20 20 20 69 20 2b 3d 20  .          i += 
7ac0: 66 74 73 35 47 65 74 56 61 72 69 6e 74 33 32 28  fts5GetVarint32(
7ad0: 26 70 44 61 74 61 5b 69 5d 2c 20 70 4c 76 6c 2d  &pData[i], pLvl-
7ae0: 3e 61 53 65 67 5b 69 53 65 67 5d 2e 6e 48 65 69  >aSeg[iSeg].nHei
7af0: 67 68 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ght);.          
7b00: 69 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69  i += fts5GetVari
7b10: 6e 74 33 32 28 26 70 44 61 74 61 5b 69 5d 2c 20  nt32(&pData[i], 
7b20: 70 4c 76 6c 2d 3e 61 53 65 67 5b 69 53 65 67 5d  pLvl->aSeg[iSeg]
7b30: 2e 70 67 6e 6f 46 69 72 73 74 29 3b 0a 20 20 20  .pgnoFirst);.   
7b40: 20 20 20 20 20 20 20 69 20 2b 3d 20 66 74 73 35         i += fts5
7b50: 47 65 74 56 61 72 69 6e 74 33 32 28 26 70 44 61  GetVarint32(&pDa
7b60: 74 61 5b 69 5d 2c 20 70 4c 76 6c 2d 3e 61 53 65  ta[i], pLvl->aSe
7b70: 67 5b 69 53 65 67 5d 2e 70 67 6e 6f 4c 61 73 74  g[iSeg].pgnoLast
7b80: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
7b90: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
7ba0: 20 20 66 74 73 35 53 74 72 75 63 74 75 72 65 52    fts5StructureR
7bb0: 65 6c 65 61 73 65 28 70 52 65 74 29 3b 0a 20 20  elease(pRet);.  
7bc0: 20 20 20 20 20 20 70 52 65 74 20 3d 20 30 3b 0a        pRet = 0;.
7bd0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
7be0: 7d 0a 0a 20 20 2a 70 70 4f 75 74 20 3d 20 70 52  }..  *ppOut = pR
7bf0: 65 74 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  et;.  return rc;
7c00: 0a 7d 0a 0a 2f 2a 0a 2a 2a 0a 2a 2f 0a 73 74 61  .}../*.**.*/.sta
7c10: 74 69 63 20 76 6f 69 64 20 66 74 73 35 53 74 72  tic void fts5Str
7c20: 75 63 74 75 72 65 41 64 64 4c 65 76 65 6c 28 69  uctureAddLevel(i
7c30: 6e 74 20 2a 70 52 63 2c 20 46 74 73 35 53 74 72  nt *pRc, Fts5Str
7c40: 75 63 74 75 72 65 20 2a 2a 70 70 53 74 72 75 63  ucture **ppStruc
7c50: 74 29 7b 0a 20 20 69 66 28 20 2a 70 52 63 3d 3d  t){.  if( *pRc==
7c60: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
7c70: 20 46 74 73 35 53 74 72 75 63 74 75 72 65 20 2a   Fts5Structure *
7c80: 70 53 74 72 75 63 74 20 3d 20 2a 70 70 53 74 72  pStruct = *ppStr
7c90: 75 63 74 3b 0a 20 20 20 20 69 6e 74 20 6e 4c 65  uct;.    int nLe
7ca0: 76 65 6c 20 3d 20 70 53 74 72 75 63 74 2d 3e 6e  vel = pStruct->n
7cb0: 4c 65 76 65 6c 3b 0a 20 20 20 20 69 6e 74 20 6e  Level;.    int n
7cc0: 42 79 74 65 20 3d 20 28 0a 20 20 20 20 20 20 20  Byte = (.       
7cd0: 20 73 69 7a 65 6f 66 28 46 74 73 35 53 74 72 75   sizeof(Fts5Stru
7ce0: 63 74 75 72 65 29 20 2b 20 20 20 20 20 20 20 20  cture) +        
7cf0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 69            /* Mai
7d00: 6e 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20  n structure */. 
7d10: 20 20 20 20 20 20 20 73 69 7a 65 6f 66 28 46 74         sizeof(Ft
7d20: 73 35 53 74 72 75 63 74 75 72 65 4c 65 76 65 6c  s5StructureLevel
7d30: 29 20 2a 20 28 6e 4c 65 76 65 6c 2b 31 29 20 20  ) * (nLevel+1)  
7d40: 2f 2a 20 61 4c 65 76 65 6c 5b 5d 20 61 72 72 61  /* aLevel[] arra
7d50: 79 20 2a 2f 0a 20 20 20 20 29 3b 0a 0a 20 20 20  y */.    );..   
7d60: 20 70 53 74 72 75 63 74 20 3d 20 73 71 6c 69 74   pStruct = sqlit
7d70: 65 33 5f 72 65 61 6c 6c 6f 63 28 70 53 74 72 75  e3_realloc(pStru
7d80: 63 74 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20 20  ct, nByte);.    
7d90: 69 66 28 20 70 53 74 72 75 63 74 20 29 7b 0a 20  if( pStruct ){. 
7da0: 20 20 20 20 20 6d 65 6d 73 65 74 28 26 70 53 74       memset(&pSt
7db0: 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 6e 4c 65  ruct->aLevel[nLe
7dc0: 76 65 6c 5d 2c 20 30 2c 20 73 69 7a 65 6f 66 28  vel], 0, sizeof(
7dd0: 46 74 73 35 53 74 72 75 63 74 75 72 65 4c 65 76  Fts5StructureLev
7de0: 65 6c 29 29 3b 0a 20 20 20 20 20 20 70 53 74 72  el));.      pStr
7df0: 75 63 74 2d 3e 6e 4c 65 76 65 6c 2b 2b 3b 0a 20  uct->nLevel++;. 
7e00: 20 20 20 20 20 2a 70 70 53 74 72 75 63 74 20 3d       *ppStruct =
7e10: 20 70 53 74 72 75 63 74 3b 0a 20 20 20 20 7d 65   pStruct;.    }e
7e20: 6c 73 65 7b 0a 20 20 20 20 20 20 2a 70 52 63 20  lse{.      *pRc 
7e30: 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
7e40: 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
7e50: 2a 2a 20 45 78 74 65 6e 64 20 6c 65 76 65 6c 20  ** Extend level 
7e60: 69 4c 76 6c 20 73 6f 20 74 68 61 74 20 74 68 65  iLvl so that the
7e70: 72 65 20 69 73 20 72 6f 6f 6d 20 66 6f 72 20 61  re is room for a
7e80: 74 20 6c 65 61 73 74 20 6e 45 78 74 72 61 20 6d  t least nExtra m
7e90: 6f 72 65 0a 2a 2a 20 73 65 67 6d 65 6e 74 73 2e  ore.** segments.
7ea0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
7eb0: 66 74 73 35 53 74 72 75 63 74 75 72 65 45 78 74  fts5StructureExt
7ec0: 65 6e 64 4c 65 76 65 6c 28 0a 20 20 69 6e 74 20  endLevel(.  int 
7ed0: 2a 70 52 63 2c 20 0a 20 20 46 74 73 35 53 74 72  *pRc, .  Fts5Str
7ee0: 75 63 74 75 72 65 20 2a 70 53 74 72 75 63 74 2c  ucture *pStruct,
7ef0: 20 0a 20 20 69 6e 74 20 69 4c 76 6c 2c 20 0a 20   .  int iLvl, . 
7f00: 20 69 6e 74 20 6e 45 78 74 72 61 2c 20 0a 20 20   int nExtra, .  
7f10: 69 6e 74 20 62 49 6e 73 65 72 74 0a 29 7b 0a 20  int bInsert.){. 
7f20: 20 69 66 28 20 2a 70 52 63 3d 3d 53 51 4c 49 54   if( *pRc==SQLIT
7f30: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 46 74 73 35  E_OK ){.    Fts5
7f40: 53 74 72 75 63 74 75 72 65 4c 65 76 65 6c 20 2a  StructureLevel *
7f50: 70 4c 76 6c 20 3d 20 26 70 53 74 72 75 63 74 2d  pLvl = &pStruct-
7f60: 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d 3b 0a 20  >aLevel[iLvl];. 
7f70: 20 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65     Fts5Structure
7f80: 53 65 67 6d 65 6e 74 20 2a 61 4e 65 77 3b 0a 20  Segment *aNew;. 
7f90: 20 20 20 69 6e 74 20 6e 42 79 74 65 3b 0a 0a 20     int nByte;.. 
7fa0: 20 20 20 6e 42 79 74 65 20 3d 20 28 70 4c 76 6c     nByte = (pLvl
7fb0: 2d 3e 6e 53 65 67 20 2b 20 6e 45 78 74 72 61 29  ->nSeg + nExtra)
7fc0: 20 2a 20 73 69 7a 65 6f 66 28 46 74 73 35 53 74   * sizeof(Fts5St
7fd0: 72 75 63 74 75 72 65 53 65 67 6d 65 6e 74 29 3b  ructureSegment);
7fe0: 0a 20 20 20 20 61 4e 65 77 20 3d 20 73 71 6c 69  .    aNew = sqli
7ff0: 74 65 33 5f 72 65 61 6c 6c 6f 63 28 70 4c 76 6c  te3_realloc(pLvl
8000: 2d 3e 61 53 65 67 2c 20 6e 42 79 74 65 29 3b 0a  ->aSeg, nByte);.
8010: 20 20 20 20 69 66 28 20 61 4e 65 77 20 29 7b 0a      if( aNew ){.
8020: 20 20 20 20 20 20 69 66 28 20 62 49 6e 73 65 72        if( bInser
8030: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  t==0 ){.        
8040: 6d 65 6d 73 65 74 28 26 61 4e 65 77 5b 70 4c 76  memset(&aNew[pLv
8050: 6c 2d 3e 6e 53 65 67 5d 2c 20 30 2c 20 73 69 7a  l->nSeg], 0, siz
8060: 65 6f 66 28 46 74 73 35 53 74 72 75 63 74 75 72  eof(Fts5Structur
8070: 65 53 65 67 6d 65 6e 74 29 20 2a 20 6e 45 78 74  eSegment) * nExt
8080: 72 61 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  ra);.      }else
8090: 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 4d  {.        int nM
80a0: 6f 76 65 20 3d 20 70 4c 76 6c 2d 3e 6e 53 65 67  ove = pLvl->nSeg
80b0: 20 2a 20 73 69 7a 65 6f 66 28 46 74 73 35 53 74   * sizeof(Fts5St
80c0: 72 75 63 74 75 72 65 53 65 67 6d 65 6e 74 29 3b  ructureSegment);
80d0: 0a 20 20 20 20 20 20 20 20 6d 65 6d 6d 6f 76 65  .        memmove
80e0: 28 26 61 4e 65 77 5b 6e 45 78 74 72 61 5d 2c 20  (&aNew[nExtra], 
80f0: 61 4e 65 77 2c 20 6e 4d 6f 76 65 29 3b 0a 20 20  aNew, nMove);.  
8100: 20 20 20 20 20 20 6d 65 6d 73 65 74 28 61 4e 65        memset(aNe
8110: 77 2c 20 30 2c 20 73 69 7a 65 6f 66 28 46 74 73  w, 0, sizeof(Fts
8120: 35 53 74 72 75 63 74 75 72 65 53 65 67 6d 65 6e  5StructureSegmen
8130: 74 29 20 2a 20 6e 45 78 74 72 61 29 3b 0a 20 20  t) * nExtra);.  
8140: 20 20 20 20 7d 0a 20 20 20 20 20 20 70 4c 76 6c      }.      pLvl
8150: 2d 3e 61 53 65 67 20 3d 20 61 4e 65 77 3b 0a 20  ->aSeg = aNew;. 
8160: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
8170: 2a 70 52 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f  *pRc = SQLITE_NO
8180: 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  MEM;.    }.  }.}
8190: 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 2c 20 64 65  ../*.** Read, de
81a0: 73 65 72 69 61 6c 69 7a 65 20 61 6e 64 20 72 65  serialize and re
81b0: 74 75 72 6e 20 74 68 65 20 73 74 72 75 63 74 75  turn the structu
81c0: 72 65 20 72 65 63 6f 72 64 2e 0a 2a 2a 0a 2a 2a  re record..**.**
81d0: 20 54 68 65 20 46 74 73 35 53 74 72 75 63 74 75   The Fts5Structu
81e0: 72 65 2e 61 4c 65 76 65 6c 5b 5d 20 61 6e 64 20  re.aLevel[] and 
81f0: 65 61 63 68 20 46 74 73 35 53 74 72 75 63 74 75  each Fts5Structu
8200: 72 65 4c 65 76 65 6c 2e 61 53 65 67 5b 5d 20 61  reLevel.aSeg[] a
8210: 72 72 61 79 0a 2a 2a 20 61 72 65 20 6f 76 65 72  rray.** are over
8220: 2d 61 6c 6c 6f 63 61 74 65 64 20 61 73 20 64 65  -allocated as de
8230: 73 63 72 69 62 65 64 20 66 6f 72 20 66 75 6e 63  scribed for func
8240: 74 69 6f 6e 20 66 74 73 35 53 74 72 75 63 74 75  tion fts5Structu
8250: 72 65 44 65 63 6f 64 65 28 29 20 0a 2a 2a 20 61  reDecode() .** a
8260: 62 6f 76 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  bove..**.** If a
8270: 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  n error occurs, 
8280: 4e 55 4c 4c 20 69 73 20 72 65 74 75 72 6e 65 64  NULL is returned
8290: 20 61 6e 64 20 61 6e 20 65 72 72 6f 72 20 63 6f   and an error co
82a0: 64 65 20 6c 65 66 74 20 69 6e 20 74 68 65 0a 2a  de left in the.*
82b0: 2a 20 46 74 73 35 49 6e 64 65 78 20 68 61 6e 64  * Fts5Index hand
82c0: 6c 65 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20  le. If an error 
82d0: 68 61 73 20 61 6c 72 65 61 64 79 20 6f 63 63 75  has already occu
82e0: 72 72 65 64 20 77 68 65 6e 20 74 68 69 73 20 66  rred when this f
82f0: 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 63 61  unction.** is ca
8300: 6c 6c 65 64 2c 20 69 74 20 69 73 20 61 20 6e 6f  lled, it is a no
8310: 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 46  -op..*/.static F
8320: 74 73 35 53 74 72 75 63 74 75 72 65 20 2a 66 74  ts5Structure *ft
8330: 73 35 53 74 72 75 63 74 75 72 65 52 65 61 64 28  s5StructureRead(
8340: 46 74 73 35 49 6e 64 65 78 20 2a 70 29 7b 0a 20  Fts5Index *p){. 
8350: 20 46 74 73 35 43 6f 6e 66 69 67 20 2a 70 43 6f   Fts5Config *pCo
8360: 6e 66 69 67 20 3d 20 70 2d 3e 70 43 6f 6e 66 69  nfig = p->pConfi
8370: 67 3b 0a 20 20 46 74 73 35 53 74 72 75 63 74 75  g;.  Fts5Structu
8380: 72 65 20 2a 70 52 65 74 20 3d 20 30 3b 20 20 20  re *pRet = 0;   
8390: 20 20 20 20 20 2f 2a 20 4f 62 6a 65 63 74 20 74       /* Object t
83a0: 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20 69 6e  o return */.  in
83b0: 74 20 69 43 6f 6f 6b 69 65 3b 20 20 20 20 20 20  t iCookie;      
83c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
83d0: 20 43 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 63   Configuration c
83e0: 6f 6f 6b 69 65 20 2a 2f 0a 20 20 46 74 73 35 44  ookie */.  Fts5D
83f0: 61 74 61 20 2a 70 44 61 74 61 3b 0a 20 20 46 74  ata *pData;.  Ft
8400: 73 35 42 75 66 66 65 72 20 62 75 66 20 3d 20 7b  s5Buffer buf = {
8410: 30 2c 20 30 2c 20 30 7d 3b 0a 0a 20 20 70 44 61  0, 0, 0};..  pDa
8420: 74 61 20 3d 20 66 74 73 35 44 61 74 61 52 65 61  ta = fts5DataRea
8430: 64 28 70 2c 20 46 54 53 35 5f 53 54 52 55 43 54  d(p, FTS5_STRUCT
8440: 55 52 45 5f 52 4f 57 49 44 29 3b 0a 20 20 69 66  URE_ROWID);.  if
8450: 28 20 70 2d 3e 72 63 20 29 20 72 65 74 75 72 6e  ( p->rc ) return
8460: 20 30 3b 0a 20 20 2f 2a 20 54 4f 44 4f 3a 20 44   0;.  /* TODO: D
8470: 6f 20 77 65 20 6e 65 65 64 20 74 68 69 73 20 69  o we need this i
8480: 66 20 74 68 65 20 6c 65 61 66 2d 69 6e 64 65 78  f the leaf-index
8490: 20 69 73 20 61 70 70 65 6e 64 65 64 3f 20 50 72   is appended? Pr
84a0: 6f 62 61 62 6c 79 2e 2e 2e 20 2a 2f 0a 20 20 6d  obably... */.  m
84b0: 65 6d 73 65 74 28 26 70 44 61 74 61 2d 3e 70 5b  emset(&pData->p[
84c0: 70 44 61 74 61 2d 3e 6e 6e 5d 2c 20 30 2c 20 46  pData->nn], 0, F
84d0: 54 53 35 5f 44 41 54 41 5f 50 41 44 44 49 4e 47  TS5_DATA_PADDING
84e0: 29 3b 0a 20 20 70 2d 3e 72 63 20 3d 20 66 74 73  );.  p->rc = fts
84f0: 35 53 74 72 75 63 74 75 72 65 44 65 63 6f 64 65  5StructureDecode
8500: 28 70 44 61 74 61 2d 3e 70 2c 20 70 44 61 74 61  (pData->p, pData
8510: 2d 3e 6e 6e 2c 20 26 69 43 6f 6f 6b 69 65 2c 20  ->nn, &iCookie, 
8520: 26 70 52 65 74 29 3b 0a 20 20 69 66 28 20 70 2d  &pRet);.  if( p-
8530: 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26  >rc==SQLITE_OK &
8540: 26 20 70 43 6f 6e 66 69 67 2d 3e 69 43 6f 6f 6b  & pConfig->iCook
8550: 69 65 21 3d 69 43 6f 6f 6b 69 65 20 29 7b 0a 20  ie!=iCookie ){. 
8560: 20 20 20 70 2d 3e 72 63 20 3d 20 73 71 6c 69 74     p->rc = sqlit
8570: 65 33 46 74 73 35 43 6f 6e 66 69 67 4c 6f 61 64  e3Fts5ConfigLoad
8580: 28 70 43 6f 6e 66 69 67 2c 20 69 43 6f 6f 6b 69  (pConfig, iCooki
8590: 65 29 3b 0a 20 20 7d 0a 0a 20 20 66 74 73 35 44  e);.  }..  fts5D
85a0: 61 74 61 52 65 6c 65 61 73 65 28 70 44 61 74 61  ataRelease(pData
85b0: 29 3b 0a 20 20 69 66 28 20 70 2d 3e 72 63 21 3d  );.  if( p->rc!=
85c0: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
85d0: 20 66 74 73 35 53 74 72 75 63 74 75 72 65 52 65   fts5StructureRe
85e0: 6c 65 61 73 65 28 70 52 65 74 29 3b 0a 20 20 20  lease(pRet);.   
85f0: 20 70 52 65 74 20 3d 20 30 3b 0a 20 20 7d 0a 20   pRet = 0;.  }. 
8600: 20 72 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a   return pRet;.}.
8610: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
8620: 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f  e total number o
8630: 66 20 73 65 67 6d 65 6e 74 73 20 69 6e 20 69 6e  f segments in in
8640: 64 65 78 20 73 74 72 75 63 74 75 72 65 20 70 53  dex structure pS
8650: 74 72 75 63 74 2e 20 54 68 69 73 0a 2a 2a 20 66  truct. This.** f
8660: 75 6e 63 74 69 6f 6e 20 69 73 20 6f 6e 6c 79 20  unction is only 
8670: 65 76 65 72 20 75 73 65 64 20 61 73 20 70 61 72  ever used as par
8680: 74 20 6f 66 20 61 73 73 65 72 74 28 29 20 63 6f  t of assert() co
8690: 6e 64 69 74 69 6f 6e 73 2e 0a 2a 2f 0a 23 69 66  nditions..*/.#if
86a0: 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
86b0: 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 35  .static int fts5
86c0: 53 74 72 75 63 74 75 72 65 43 6f 75 6e 74 53 65  StructureCountSe
86d0: 67 6d 65 6e 74 73 28 46 74 73 35 53 74 72 75 63  gments(Fts5Struc
86e0: 74 75 72 65 20 2a 70 53 74 72 75 63 74 29 7b 0a  ture *pStruct){.
86f0: 20 20 69 6e 74 20 6e 53 65 67 6d 65 6e 74 20 3d    int nSegment =
8700: 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
8710: 20 20 2f 2a 20 54 6f 74 61 6c 20 6e 75 6d 62 65    /* Total numbe
8720: 72 20 6f 66 20 73 65 67 6d 65 6e 74 73 20 2a 2f  r of segments */
8730: 0a 20 20 69 66 28 20 70 53 74 72 75 63 74 20 29  .  if( pStruct )
8740: 7b 0a 20 20 20 20 69 6e 74 20 69 4c 76 6c 3b 20  {.    int iLvl; 
8750: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8760: 20 20 20 20 2f 2a 20 55 73 65 64 20 74 6f 20 69      /* Used to i
8770: 74 65 72 61 74 65 20 74 68 72 6f 75 67 68 20 6c  terate through l
8780: 65 76 65 6c 73 20 2a 2f 0a 20 20 20 20 66 6f 72  evels */.    for
8790: 28 69 4c 76 6c 3d 30 3b 20 69 4c 76 6c 3c 70 53  (iLvl=0; iLvl<pS
87a0: 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 3b 20 69  truct->nLevel; i
87b0: 4c 76 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 6e 53  Lvl++){.      nS
87c0: 65 67 6d 65 6e 74 20 2b 3d 20 70 53 74 72 75 63  egment += pStruc
87d0: 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d 2e  t->aLevel[iLvl].
87e0: 6e 53 65 67 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  nSeg;.    }.  }.
87f0: 0a 20 20 72 65 74 75 72 6e 20 6e 53 65 67 6d 65  .  return nSegme
8800: 6e 74 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a  nt;.}.#endif../*
8810: 0a 2a 2a 20 53 65 72 69 61 6c 69 7a 65 20 61 6e  .** Serialize an
8820: 64 20 73 74 6f 72 65 20 74 68 65 20 22 73 74 72  d store the "str
8830: 75 63 74 75 72 65 22 20 72 65 63 6f 72 64 2e 0a  ucture" record..
8840: 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f  **.** If an erro
8850: 72 20 6f 63 63 75 72 73 2c 20 6c 65 61 76 65 20  r occurs, leave 
8860: 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 6e  an error code in
8870: 20 74 68 65 20 46 74 73 35 49 6e 64 65 78 20 6f   the Fts5Index o
8880: 62 6a 65 63 74 2e 20 49 66 20 61 6e 0a 2a 2a 20  bject. If an.** 
8890: 65 72 72 6f 72 20 68 61 73 20 61 6c 72 65 61 64  error has alread
88a0: 79 20 6f 63 63 75 72 72 65 64 2c 20 74 68 69 73  y occurred, this
88b0: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e   function is a n
88c0: 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  o-op..*/.static 
88d0: 76 6f 69 64 20 66 74 73 35 53 74 72 75 63 74 75  void fts5Structu
88e0: 72 65 57 72 69 74 65 28 46 74 73 35 49 6e 64 65  reWrite(Fts5Inde
88f0: 78 20 2a 70 2c 20 46 74 73 35 53 74 72 75 63 74  x *p, Fts5Struct
8900: 75 72 65 20 2a 70 53 74 72 75 63 74 29 7b 0a 20  ure *pStruct){. 
8910: 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49   if( p->rc==SQLI
8920: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 46 74 73  TE_OK ){.    Fts
8930: 35 42 75 66 66 65 72 20 62 75 66 3b 20 20 20 20  5Buffer buf;    
8940: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 75             /* Bu
8950: 66 66 65 72 20 74 6f 20 73 65 72 69 61 6c 69 7a  ffer to serializ
8960: 65 20 72 65 63 6f 72 64 20 69 6e 74 6f 20 2a 2f  e record into */
8970: 0a 20 20 20 20 69 6e 74 20 69 4c 76 6c 3b 20 20  .    int iLvl;  
8980: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8990: 20 20 20 2f 2a 20 55 73 65 64 20 74 6f 20 69 74     /* Used to it
89a0: 65 72 61 74 65 20 74 68 72 6f 75 67 68 20 6c 65  erate through le
89b0: 76 65 6c 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20  vels */.    int 
89c0: 69 43 6f 6f 6b 69 65 3b 20 20 20 20 20 20 20 20  iCookie;        
89d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6f            /* Coo
89e0: 6b 69 65 20 76 61 6c 75 65 20 74 6f 20 73 74 6f  kie value to sto
89f0: 72 65 20 2a 2f 0a 0a 20 20 20 20 61 73 73 65 72  re */..    asser
8a00: 74 28 20 70 53 74 72 75 63 74 2d 3e 6e 53 65 67  t( pStruct->nSeg
8a10: 6d 65 6e 74 3d 3d 66 74 73 35 53 74 72 75 63 74  ment==fts5Struct
8a20: 75 72 65 43 6f 75 6e 74 53 65 67 6d 65 6e 74 73  ureCountSegments
8a30: 28 70 53 74 72 75 63 74 29 20 29 3b 0a 20 20 20  (pStruct) );.   
8a40: 20 6d 65 6d 73 65 74 28 26 62 75 66 2c 20 30 2c   memset(&buf, 0,
8a50: 20 73 69 7a 65 6f 66 28 46 74 73 35 42 75 66 66   sizeof(Fts5Buff
8a60: 65 72 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 41 70  er));..    /* Ap
8a70: 70 65 6e 64 20 74 68 65 20 63 75 72 72 65 6e 74  pend the current
8a80: 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 63   configuration c
8a90: 6f 6f 6b 69 65 20 2a 2f 0a 20 20 20 20 69 43 6f  ookie */.    iCo
8aa0: 6f 6b 69 65 20 3d 20 70 2d 3e 70 43 6f 6e 66 69  okie = p->pConfi
8ab0: 67 2d 3e 69 43 6f 6f 6b 69 65 3b 0a 20 20 20 20  g->iCookie;.    
8ac0: 69 66 28 20 69 43 6f 6f 6b 69 65 3c 30 20 29 20  if( iCookie<0 ) 
8ad0: 69 43 6f 6f 6b 69 65 20 3d 20 30 3b 0a 20 20 20  iCookie = 0;.   
8ae0: 20 66 74 73 35 42 75 66 66 65 72 41 70 70 65 6e   fts5BufferAppen
8af0: 64 33 32 28 26 70 2d 3e 72 63 2c 20 26 62 75 66  d32(&p->rc, &buf
8b00: 2c 20 69 43 6f 6f 6b 69 65 29 3b 0a 0a 20 20 20  , iCookie);..   
8b10: 20 66 74 73 35 42 75 66 66 65 72 41 70 70 65 6e   fts5BufferAppen
8b20: 64 56 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20  dVarint(&p->rc, 
8b30: 26 62 75 66 2c 20 70 53 74 72 75 63 74 2d 3e 6e  &buf, pStruct->n
8b40: 4c 65 76 65 6c 29 3b 0a 20 20 20 20 66 74 73 35  Level);.    fts5
8b50: 42 75 66 66 65 72 41 70 70 65 6e 64 56 61 72 69  BufferAppendVari
8b60: 6e 74 28 26 70 2d 3e 72 63 2c 20 26 62 75 66 2c  nt(&p->rc, &buf,
8b70: 20 70 53 74 72 75 63 74 2d 3e 6e 53 65 67 6d 65   pStruct->nSegme
8b80: 6e 74 29 3b 0a 20 20 20 20 66 74 73 35 42 75 66  nt);.    fts5Buf
8b90: 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e 74 28  ferAppendVarint(
8ba0: 26 70 2d 3e 72 63 2c 20 26 62 75 66 2c 20 28 69  &p->rc, &buf, (i
8bb0: 36 34 29 70 53 74 72 75 63 74 2d 3e 6e 57 72 69  64)pStruct->nWri
8bc0: 74 65 43 6f 75 6e 74 65 72 29 3b 0a 0a 20 20 20  teCounter);..   
8bd0: 20 66 6f 72 28 69 4c 76 6c 3d 30 3b 20 69 4c 76   for(iLvl=0; iLv
8be0: 6c 3c 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65  l<pStruct->nLeve
8bf0: 6c 3b 20 69 4c 76 6c 2b 2b 29 7b 0a 20 20 20 20  l; iLvl++){.    
8c00: 20 20 69 6e 74 20 69 53 65 67 3b 20 20 20 20 20    int iSeg;     
8c10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8c20: 2f 2a 20 55 73 65 64 20 74 6f 20 69 74 65 72 61  /* Used to itera
8c30: 74 65 20 74 68 72 6f 75 67 68 20 73 65 67 6d 65  te through segme
8c40: 6e 74 73 20 2a 2f 0a 20 20 20 20 20 20 46 74 73  nts */.      Fts
8c50: 35 53 74 72 75 63 74 75 72 65 4c 65 76 65 6c 20  5StructureLevel 
8c60: 2a 70 4c 76 6c 20 3d 20 26 70 53 74 72 75 63 74  *pLvl = &pStruct
8c70: 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d 3b 0a  ->aLevel[iLvl];.
8c80: 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72        fts5Buffer
8c90: 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26 70 2d  AppendVarint(&p-
8ca0: 3e 72 63 2c 20 26 62 75 66 2c 20 70 4c 76 6c 2d  >rc, &buf, pLvl-
8cb0: 3e 6e 4d 65 72 67 65 29 3b 0a 20 20 20 20 20 20  >nMerge);.      
8cc0: 66 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64  fts5BufferAppend
8cd0: 56 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26  Varint(&p->rc, &
8ce0: 62 75 66 2c 20 70 4c 76 6c 2d 3e 6e 53 65 67 29  buf, pLvl->nSeg)
8cf0: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
8d00: 70 4c 76 6c 2d 3e 6e 4d 65 72 67 65 3c 3d 70 4c  pLvl->nMerge<=pL
8d10: 76 6c 2d 3e 6e 53 65 67 20 29 3b 0a 0a 20 20 20  vl->nSeg );..   
8d20: 20 20 20 66 6f 72 28 69 53 65 67 3d 30 3b 20 69     for(iSeg=0; i
8d30: 53 65 67 3c 70 4c 76 6c 2d 3e 6e 53 65 67 3b 20  Seg<pLvl->nSeg; 
8d40: 69 53 65 67 2b 2b 29 7b 0a 20 20 20 20 20 20 20  iSeg++){.       
8d50: 20 66 74 73 35 42 75 66 66 65 72 41 70 70 65 6e   fts5BufferAppen
8d60: 64 56 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20  dVarint(&p->rc, 
8d70: 26 62 75 66 2c 20 70 4c 76 6c 2d 3e 61 53 65 67  &buf, pLvl->aSeg
8d80: 5b 69 53 65 67 5d 2e 69 53 65 67 69 64 29 3b 0a  [iSeg].iSegid);.
8d90: 20 20 20 20 20 20 20 20 66 74 73 35 42 75 66 66          fts5Buff
8da0: 65 72 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26  erAppendVarint(&
8db0: 70 2d 3e 72 63 2c 20 26 62 75 66 2c 20 70 4c 76  p->rc, &buf, pLv
8dc0: 6c 2d 3e 61 53 65 67 5b 69 53 65 67 5d 2e 6e 48  l->aSeg[iSeg].nH
8dd0: 65 69 67 68 74 29 3b 0a 20 20 20 20 20 20 20 20  eight);.        
8de0: 66 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64  fts5BufferAppend
8df0: 56 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26  Varint(&p->rc, &
8e00: 62 75 66 2c 20 70 4c 76 6c 2d 3e 61 53 65 67 5b  buf, pLvl->aSeg[
8e10: 69 53 65 67 5d 2e 70 67 6e 6f 46 69 72 73 74 29  iSeg].pgnoFirst)
8e20: 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35 42 75  ;.        fts5Bu
8e30: 66 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e 74  fferAppendVarint
8e40: 28 26 70 2d 3e 72 63 2c 20 26 62 75 66 2c 20 70  (&p->rc, &buf, p
8e50: 4c 76 6c 2d 3e 61 53 65 67 5b 69 53 65 67 5d 2e  Lvl->aSeg[iSeg].
8e60: 70 67 6e 6f 4c 61 73 74 29 3b 0a 20 20 20 20 20  pgnoLast);.     
8e70: 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 66 74   }.    }..    ft
8e80: 73 35 44 61 74 61 57 72 69 74 65 28 70 2c 20 46  s5DataWrite(p, F
8e90: 54 53 35 5f 53 54 52 55 43 54 55 52 45 5f 52 4f  TS5_STRUCTURE_RO
8ea0: 57 49 44 2c 20 62 75 66 2e 70 2c 20 62 75 66 2e  WID, buf.p, buf.
8eb0: 6e 29 3b 0a 20 20 20 20 66 74 73 35 42 75 66 66  n);.    fts5Buff
8ec0: 65 72 46 72 65 65 28 26 62 75 66 29 3b 0a 20 20  erFree(&buf);.  
8ed0: 7d 0a 7d 0a 0a 23 69 66 20 30 0a 73 74 61 74 69  }.}..#if 0.stati
8ee0: 63 20 76 6f 69 64 20 66 74 73 35 44 65 62 75 67  c void fts5Debug
8ef0: 53 74 72 75 63 74 75 72 65 28 69 6e 74 2a 2c 46  Structure(int*,F
8f00: 74 73 35 42 75 66 66 65 72 2a 2c 46 74 73 35 53  ts5Buffer*,Fts5S
8f10: 74 72 75 63 74 75 72 65 2a 29 3b 0a 73 74 61 74  tructure*);.stat
8f20: 69 63 20 76 6f 69 64 20 66 74 73 35 50 72 69 6e  ic void fts5Prin
8f30: 74 53 74 72 75 63 74 75 72 65 28 63 6f 6e 73 74  tStructure(const
8f40: 20 63 68 61 72 20 2a 7a 43 61 70 74 69 6f 6e 2c   char *zCaption,
8f50: 20 46 74 73 35 53 74 72 75 63 74 75 72 65 20 2a   Fts5Structure *
8f60: 70 53 74 72 75 63 74 29 7b 0a 20 20 69 6e 74 20  pStruct){.  int 
8f70: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
8f80: 20 20 46 74 73 35 42 75 66 66 65 72 20 62 75 66    Fts5Buffer buf
8f90: 3b 0a 20 20 6d 65 6d 73 65 74 28 26 62 75 66 2c  ;.  memset(&buf,
8fa0: 20 30 2c 20 73 69 7a 65 6f 66 28 62 75 66 29 29   0, sizeof(buf))
8fb0: 3b 0a 20 20 66 74 73 35 44 65 62 75 67 53 74 72  ;.  fts5DebugStr
8fc0: 75 63 74 75 72 65 28 26 72 63 2c 20 26 62 75 66  ucture(&rc, &buf
8fd0: 2c 20 70 53 74 72 75 63 74 29 3b 0a 20 20 66 70  , pStruct);.  fp
8fe0: 72 69 6e 74 66 28 73 74 64 6f 75 74 2c 20 22 25  rintf(stdout, "%
8ff0: 73 3a 20 25 73 5c 6e 22 2c 20 7a 43 61 70 74 69  s: %s\n", zCapti
9000: 6f 6e 2c 20 62 75 66 2e 70 29 3b 0a 20 20 66 66  on, buf.p);.  ff
9010: 6c 75 73 68 28 73 74 64 6f 75 74 29 3b 0a 20 20  lush(stdout);.  
9020: 66 74 73 35 42 75 66 66 65 72 46 72 65 65 28 26  fts5BufferFree(&
9030: 62 75 66 29 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20  buf);.}.#else.# 
9040: 64 65 66 69 6e 65 20 66 74 73 35 50 72 69 6e 74  define fts5Print
9050: 53 74 72 75 63 74 75 72 65 28 78 2c 79 29 0a 23  Structure(x,y).#
9060: 65 6e 64 69 66 0a 0a 73 74 61 74 69 63 20 69 6e  endif..static in
9070: 74 20 66 74 73 35 53 65 67 6d 65 6e 74 53 69 7a  t fts5SegmentSiz
9080: 65 28 46 74 73 35 53 74 72 75 63 74 75 72 65 53  e(Fts5StructureS
9090: 65 67 6d 65 6e 74 20 2a 70 53 65 67 29 7b 0a 20  egment *pSeg){. 
90a0: 20 72 65 74 75 72 6e 20 31 20 2b 20 70 53 65 67   return 1 + pSeg
90b0: 2d 3e 70 67 6e 6f 4c 61 73 74 20 2d 20 70 53 65  ->pgnoLast - pSe
90c0: 67 2d 3e 70 67 6e 6f 46 69 72 73 74 3b 0a 7d 0a  g->pgnoFirst;.}.
90d0: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20  ./*.** Return a 
90e0: 63 6f 70 79 20 6f 66 20 69 6e 64 65 78 20 73 74  copy of index st
90f0: 72 75 63 74 75 72 65 20 70 53 74 72 75 63 74 2e  ructure pStruct.
9100: 20 45 78 63 65 70 74 2c 20 70 72 6f 6d 6f 74 65   Except, promote
9110: 20 61 73 20 6d 61 6e 79 20 0a 2a 2a 20 73 65 67   as many .** seg
9120: 6d 65 6e 74 73 20 61 73 20 70 6f 73 73 69 62 6c  ments as possibl
9130: 65 20 74 6f 20 6c 65 76 65 6c 20 69 50 72 6f 6d  e to level iProm
9140: 6f 74 65 2e 20 49 66 20 61 6e 20 4f 4f 4d 20 6f  ote. If an OOM o
9150: 63 63 75 72 73 2c 20 4e 55 4c 4c 20 69 73 20 0a  ccurs, NULL is .
9160: 2a 2a 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a  ** returned..*/.
9170: 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
9180: 53 74 72 75 63 74 75 72 65 50 72 6f 6d 6f 74 65  StructurePromote
9190: 54 6f 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20  To(.  Fts5Index 
91a0: 2a 70 2c 0a 20 20 69 6e 74 20 69 50 72 6f 6d 6f  *p,.  int iPromo
91b0: 74 65 2c 0a 20 20 69 6e 74 20 73 7a 50 72 6f 6d  te,.  int szProm
91c0: 6f 74 65 2c 0a 20 20 46 74 73 35 53 74 72 75 63  ote,.  Fts5Struc
91d0: 74 75 72 65 20 2a 70 53 74 72 75 63 74 0a 29 7b  ture *pStruct.){
91e0: 0a 20 20 69 6e 74 20 69 6c 2c 20 69 73 3b 0a 20  .  int il, is;. 
91f0: 20 46 74 73 35 53 74 72 75 63 74 75 72 65 4c 65   Fts5StructureLe
9200: 76 65 6c 20 2a 70 4f 75 74 20 3d 20 26 70 53 74  vel *pOut = &pSt
9210: 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 50 72  ruct->aLevel[iPr
9220: 6f 6d 6f 74 65 5d 3b 0a 0a 20 20 69 66 28 20 70  omote];..  if( p
9230: 4f 75 74 2d 3e 6e 4d 65 72 67 65 3d 3d 30 20 29  Out->nMerge==0 )
9240: 7b 0a 20 20 20 20 66 6f 72 28 69 6c 3d 69 50 72  {.    for(il=iPr
9250: 6f 6d 6f 74 65 2b 31 3b 20 69 6c 3c 70 53 74 72  omote+1; il<pStr
9260: 75 63 74 2d 3e 6e 4c 65 76 65 6c 3b 20 69 6c 2b  uct->nLevel; il+
9270: 2b 29 7b 0a 20 20 20 20 20 20 46 74 73 35 53 74  +){.      Fts5St
9280: 72 75 63 74 75 72 65 4c 65 76 65 6c 20 2a 70 4c  ructureLevel *pL
9290: 76 6c 20 3d 20 26 70 53 74 72 75 63 74 2d 3e 61  vl = &pStruct->a
92a0: 4c 65 76 65 6c 5b 69 6c 5d 3b 0a 20 20 20 20 20  Level[il];.     
92b0: 20 69 66 28 20 70 4c 76 6c 2d 3e 6e 4d 65 72 67   if( pLvl->nMerg
92c0: 65 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20  e ) return;.    
92d0: 20 20 66 6f 72 28 69 73 3d 70 4c 76 6c 2d 3e 6e    for(is=pLvl->n
92e0: 53 65 67 2d 31 3b 20 69 73 3e 3d 30 3b 20 69 73  Seg-1; is>=0; is
92f0: 2d 2d 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  --){.        int
9300: 20 73 7a 20 3d 20 66 74 73 35 53 65 67 6d 65 6e   sz = fts5Segmen
9310: 74 53 69 7a 65 28 26 70 4c 76 6c 2d 3e 61 53 65  tSize(&pLvl->aSe
9320: 67 5b 69 73 5d 29 3b 0a 20 20 20 20 20 20 20 20  g[is]);.        
9330: 69 66 28 20 73 7a 3e 73 7a 50 72 6f 6d 6f 74 65  if( sz>szPromote
9340: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20   ) return;.     
9350: 20 20 20 66 74 73 35 53 74 72 75 63 74 75 72 65     fts5Structure
9360: 45 78 74 65 6e 64 4c 65 76 65 6c 28 26 70 2d 3e  ExtendLevel(&p->
9370: 72 63 2c 20 70 53 74 72 75 63 74 2c 20 69 50 72  rc, pStruct, iPr
9380: 6f 6d 6f 74 65 2c 20 31 2c 20 31 29 3b 0a 20 20  omote, 1, 1);.  
9390: 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72 63 20        if( p->rc 
93a0: 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20  ) return;.      
93b0: 20 20 6d 65 6d 63 70 79 28 70 4f 75 74 2d 3e 61    memcpy(pOut->a
93c0: 53 65 67 2c 20 26 70 4c 76 6c 2d 3e 61 53 65 67  Seg, &pLvl->aSeg
93d0: 5b 69 73 5d 2c 20 73 69 7a 65 6f 66 28 46 74 73  [is], sizeof(Fts
93e0: 35 53 74 72 75 63 74 75 72 65 53 65 67 6d 65 6e  5StructureSegmen
93f0: 74 29 29 3b 0a 20 20 20 20 20 20 20 20 70 4f 75  t));.        pOu
9400: 74 2d 3e 6e 53 65 67 2b 2b 3b 0a 20 20 20 20 20  t->nSeg++;.     
9410: 20 20 20 70 4c 76 6c 2d 3e 6e 53 65 67 2d 2d 3b     pLvl->nSeg--;
9420: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
9430: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 6e 65   }.}../*.** A ne
9440: 77 20 73 65 67 6d 65 6e 74 20 68 61 73 20 6a 75  w segment has ju
9450: 73 74 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20  st been written 
9460: 74 6f 20 6c 65 76 65 6c 20 69 4c 76 6c 20 6f 66  to level iLvl of
9470: 20 69 6e 64 65 78 20 73 74 72 75 63 74 75 72 65   index structure
9480: 0a 2a 2a 20 70 53 74 72 75 63 74 2e 20 54 68 69  .** pStruct. Thi
9490: 73 20 66 75 6e 63 74 69 6f 6e 20 64 65 74 65 72  s function deter
94a0: 6d 69 6e 65 73 20 69 66 20 61 6e 79 20 73 65 67  mines if any seg
94b0: 6d 65 6e 74 73 20 73 68 6f 75 6c 64 20 62 65 20  ments should be 
94c0: 70 72 6f 6d 6f 74 65 64 0a 2a 2a 20 61 73 20 61  promoted.** as a
94d0: 20 72 65 73 75 6c 74 2e 20 53 65 67 6d 65 6e 74   result. Segment
94e0: 73 20 61 72 65 20 70 72 6f 6d 6f 74 65 64 20 69  s are promoted i
94f0: 6e 20 74 77 6f 20 73 63 65 6e 61 72 69 6f 73 3a  n two scenarios:
9500: 0a 2a 2a 0a 2a 2a 20 20 20 61 29 20 49 66 20 74  .**.**   a) If t
9510: 68 65 20 73 65 67 6d 65 6e 74 20 6a 75 73 74 20  he segment just 
9520: 77 72 69 74 74 65 6e 20 69 73 20 73 6d 61 6c 6c  written is small
9530: 65 72 20 74 68 61 6e 20 6f 6e 65 20 6f 72 20 6d  er than one or m
9540: 6f 72 65 20 73 65 67 6d 65 6e 74 73 0a 2a 2a 20  ore segments.** 
9550: 20 20 20 20 20 77 69 74 68 69 6e 20 74 68 65 20       within the 
9560: 70 72 65 76 69 6f 75 73 20 70 6f 70 75 6c 61 74  previous populat
9570: 65 64 20 6c 65 76 65 6c 2c 20 69 74 20 69 73 20  ed level, it is 
9580: 70 72 6f 6d 6f 74 65 64 20 74 6f 20 74 68 65 20  promoted to the 
9590: 70 72 65 76 69 6f 75 73 0a 2a 2a 20 20 20 20 20  previous.**     
95a0: 20 70 6f 70 75 6c 61 74 65 64 20 6c 65 76 65 6c   populated level
95b0: 2e 0a 2a 2a 0a 2a 2a 20 20 20 62 29 20 49 66 20  ..**.**   b) If 
95c0: 74 68 65 20 73 65 67 6d 65 6e 74 20 6a 75 73 74  the segment just
95d0: 20 77 72 69 74 74 65 6e 20 69 73 20 6c 61 72 67   written is larg
95e0: 65 72 20 74 68 61 6e 20 74 68 65 20 6e 65 77 65  er than the newe
95f0: 73 74 20 73 65 67 6d 65 6e 74 20 6f 6e 0a 2a 2a  st segment on.**
9600: 20 20 20 20 20 20 74 68 65 20 6e 65 78 74 20 70        the next p
9610: 6f 70 75 6c 61 74 65 64 20 6c 65 76 65 6c 2c 20  opulated level, 
9620: 74 68 65 6e 20 74 68 61 74 20 73 65 67 6d 65 6e  then that segmen
9630: 74 2c 20 61 6e 64 20 61 6e 79 20 6f 74 68 65 72  t, and any other
9640: 20 61 64 6a 61 63 65 6e 74 0a 2a 2a 20 20 20 20   adjacent.**    
9650: 20 20 73 65 67 6d 65 6e 74 73 20 74 68 61 74 20    segments that 
9660: 61 72 65 20 61 6c 73 6f 20 73 6d 61 6c 6c 65 72  are also smaller
9670: 20 74 68 61 6e 20 74 68 65 20 6f 6e 65 20 6a 75   than the one ju
9680: 73 74 20 77 72 69 74 74 65 6e 2c 20 61 72 65 20  st written, are 
9690: 0a 2a 2a 20 20 20 20 20 20 70 72 6f 6d 6f 74 65  .**      promote
96a0: 64 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 6f 6e 65  d. .**.** If one
96b0: 20 6f 72 20 6d 6f 72 65 20 73 65 67 6d 65 6e 74   or more segment
96c0: 73 20 61 72 65 20 70 72 6f 6d 6f 74 65 64 2c 20  s are promoted, 
96d0: 74 68 65 20 73 74 72 75 63 74 75 72 65 20 6f 62  the structure ob
96e0: 6a 65 63 74 20 69 73 20 75 70 64 61 74 65 64 0a  ject is updated.
96f0: 2a 2a 20 74 6f 20 72 65 66 6c 65 63 74 20 74 68  ** to reflect th
9700: 69 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  is..*/.static vo
9710: 69 64 20 66 74 73 35 53 74 72 75 63 74 75 72 65  id fts5Structure
9720: 50 72 6f 6d 6f 74 65 28 0a 20 20 46 74 73 35 49  Promote(.  Fts5I
9730: 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20  ndex *p,        
9740: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54             /* FT
9750: 53 35 20 62 61 63 6b 65 6e 64 20 6f 62 6a 65 63  S5 backend objec
9760: 74 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 76 6c 2c  t */.  int iLvl,
9770: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9780: 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
9790: 6c 65 76 65 6c 20 6a 75 73 74 20 75 70 64 61 74  level just updat
97a0: 65 64 20 2a 2f 0a 20 20 46 74 73 35 53 74 72 75  ed */.  Fts5Stru
97b0: 63 74 75 72 65 20 2a 70 53 74 72 75 63 74 20 20  cture *pStruct  
97c0: 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
97d0: 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 29 7b   structure */.){
97e0: 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51  .  if( p->rc==SQ
97f0: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69  LITE_OK ){.    i
9800: 6e 74 20 69 54 73 74 3b 0a 20 20 20 20 69 6e 74  nt iTst;.    int
9810: 20 69 50 72 6f 6d 6f 74 65 20 3d 20 2d 31 3b 0a   iPromote = -1;.
9820: 20 20 20 20 69 6e 74 20 73 7a 50 72 6f 6d 6f 74      int szPromot
9830: 65 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  e = 0;          
9840: 20 20 2f 2a 20 50 72 6f 6d 6f 74 65 20 61 6e 79    /* Promote any
9850: 74 68 69 6e 67 20 74 68 69 73 20 73 69 7a 65 20  thing this size 
9860: 6f 72 20 73 6d 61 6c 6c 65 72 20 2a 2f 0a 20 20  or smaller */.  
9870: 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65 53    Fts5StructureS
9880: 65 67 6d 65 6e 74 20 2a 70 53 65 67 3b 20 20 20  egment *pSeg;   
9890: 2f 2a 20 53 65 67 6d 65 6e 74 20 6a 75 73 74 20  /* Segment just 
98a0: 77 72 69 74 74 65 6e 20 2a 2f 0a 20 20 20 20 69  written */.    i
98b0: 6e 74 20 73 7a 53 65 67 3b 20 20 20 20 20 20 20  nt szSeg;       
98c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
98d0: 53 69 7a 65 20 6f 66 20 73 65 67 6d 65 6e 74 20  Size of segment 
98e0: 6a 75 73 74 20 77 72 69 74 74 65 6e 20 2a 2f 0a  just written */.
98f0: 0a 0a 20 20 20 20 70 53 65 67 20 3d 20 26 70 53  ..    pSeg = &pS
9900: 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c  truct->aLevel[iL
9910: 76 6c 5d 2e 61 53 65 67 5b 70 53 74 72 75 63 74  vl].aSeg[pStruct
9920: 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d 2e 6e  ->aLevel[iLvl].n
9930: 53 65 67 2d 31 5d 3b 0a 20 20 20 20 73 7a 53 65  Seg-1];.    szSe
9940: 67 20 3d 20 28 31 20 2b 20 70 53 65 67 2d 3e 70  g = (1 + pSeg->p
9950: 67 6e 6f 4c 61 73 74 20 2d 20 70 53 65 67 2d 3e  gnoLast - pSeg->
9960: 70 67 6e 6f 46 69 72 73 74 29 3b 0a 0a 20 20 20  pgnoFirst);..   
9970: 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20 63 6f   /* Check for co
9980: 6e 64 69 74 69 6f 6e 20 28 61 29 20 2a 2f 0a 20  ndition (a) */. 
9990: 20 20 20 66 6f 72 28 69 54 73 74 3d 69 4c 76 6c     for(iTst=iLvl
99a0: 2d 31 3b 20 69 54 73 74 3e 3d 30 20 26 26 20 70  -1; iTst>=0 && p
99b0: 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69  Struct->aLevel[i
99c0: 54 73 74 5d 2e 6e 53 65 67 3d 3d 30 3b 20 69 54  Tst].nSeg==0; iT
99d0: 73 74 2d 2d 29 3b 0a 20 20 20 20 69 66 28 20 69  st--);.    if( i
99e0: 54 73 74 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20  Tst>=0 ){.      
99f0: 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 69 6e 74  int i;.      int
9a00: 20 73 7a 4d 61 78 20 3d 20 30 3b 0a 20 20 20 20   szMax = 0;.    
9a10: 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65 4c    Fts5StructureL
9a20: 65 76 65 6c 20 2a 70 54 73 74 20 3d 20 26 70 53  evel *pTst = &pS
9a30: 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 54  truct->aLevel[iT
9a40: 73 74 5d 3b 0a 20 20 20 20 20 20 61 73 73 65 72  st];.      asser
9a50: 74 28 20 70 54 73 74 2d 3e 6e 4d 65 72 67 65 3d  t( pTst->nMerge=
9a60: 3d 30 20 29 3b 0a 20 20 20 20 20 20 66 6f 72 28  =0 );.      for(
9a70: 69 3d 30 3b 20 69 3c 70 54 73 74 2d 3e 6e 53 65  i=0; i<pTst->nSe
9a80: 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  g; i++){.       
9a90: 20 69 6e 74 20 73 7a 20 3d 20 70 54 73 74 2d 3e   int sz = pTst->
9aa0: 61 53 65 67 5b 69 5d 2e 70 67 6e 6f 4c 61 73 74  aSeg[i].pgnoLast
9ab0: 20 2d 20 70 54 73 74 2d 3e 61 53 65 67 5b 69 5d   - pTst->aSeg[i]
9ac0: 2e 70 67 6e 6f 46 69 72 73 74 20 2b 20 31 3b 0a  .pgnoFirst + 1;.
9ad0: 20 20 20 20 20 20 20 20 69 66 28 20 73 7a 3e 73          if( sz>s
9ae0: 7a 4d 61 78 20 29 20 73 7a 4d 61 78 20 3d 20 73  zMax ) szMax = s
9af0: 7a 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  z;.      }.     
9b00: 20 69 66 28 20 73 7a 4d 61 78 3e 3d 73 7a 53 65   if( szMax>=szSe
9b10: 67 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  g ){.        /* 
9b20: 43 6f 6e 64 69 74 69 6f 6e 20 28 61 29 20 69 73  Condition (a) is
9b30: 20 74 72 75 65 2e 20 50 72 6f 6d 6f 74 65 20 74   true. Promote t
9b40: 68 65 20 6e 65 77 65 73 74 20 73 65 67 6d 65 6e  he newest segmen
9b50: 74 20 6f 6e 20 6c 65 76 65 6c 20 0a 20 20 20 20  t on level .    
9b60: 20 20 20 20 2a 2a 20 69 4c 76 6c 20 74 6f 20 6c      ** iLvl to l
9b70: 65 76 65 6c 20 69 54 73 74 2e 20 20 2a 2f 0a 20  evel iTst.  */. 
9b80: 20 20 20 20 20 20 20 69 50 72 6f 6d 6f 74 65 20         iPromote 
9b90: 3d 20 69 54 73 74 3b 0a 20 20 20 20 20 20 20 20  = iTst;.        
9ba0: 73 7a 50 72 6f 6d 6f 74 65 20 3d 20 73 7a 4d 61  szPromote = szMa
9bb0: 78 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  x;.      }.    }
9bc0: 0a 0a 20 20 20 20 2f 2a 20 49 66 20 63 6f 6e 64  ..    /* If cond
9bd0: 69 74 69 6f 6e 20 28 61 29 20 69 73 20 6e 6f 74  ition (a) is not
9be0: 20 6d 65 74 2c 20 61 73 73 75 6d 65 20 28 62 29   met, assume (b)
9bf0: 20 69 73 20 74 72 75 65 2e 20 53 74 72 75 63 74   is true. Struct
9c00: 75 72 65 50 72 6f 6d 6f 74 65 54 6f 28 29 0a 20  urePromoteTo(). 
9c10: 20 20 20 2a 2a 20 69 73 20 61 20 6e 6f 2d 6f 70     ** is a no-op
9c20: 20 69 66 20 69 74 20 69 73 20 6e 6f 74 2e 20 20   if it is not.  
9c30: 2a 2f 0a 20 20 20 20 69 66 28 20 69 50 72 6f 6d  */.    if( iProm
9c40: 6f 74 65 3c 30 20 29 7b 0a 20 20 20 20 20 20 69  ote<0 ){.      i
9c50: 50 72 6f 6d 6f 74 65 20 3d 20 69 4c 76 6c 3b 0a  Promote = iLvl;.
9c60: 20 20 20 20 20 20 73 7a 50 72 6f 6d 6f 74 65 20        szPromote 
9c70: 3d 20 73 7a 53 65 67 3b 0a 20 20 20 20 7d 0a 20  = szSeg;.    }. 
9c80: 20 20 20 66 74 73 35 53 74 72 75 63 74 75 72 65     fts5Structure
9c90: 50 72 6f 6d 6f 74 65 54 6f 28 70 2c 20 69 50 72  PromoteTo(p, iPr
9ca0: 6f 6d 6f 74 65 2c 20 73 7a 50 72 6f 6d 6f 74 65  omote, szPromote
9cb0: 2c 20 70 53 74 72 75 63 74 29 3b 0a 20 20 7d 0a  , pStruct);.  }.
9cc0: 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 41 64 76 61 6e 63  }.../*.** Advanc
9cd0: 65 20 74 68 65 20 69 74 65 72 61 74 6f 72 20 70  e the iterator p
9ce0: 61 73 73 65 64 20 61 73 20 74 68 65 20 6f 6e 6c  assed as the onl
9cf0: 79 20 61 72 67 75 6d 65 6e 74 2e 20 49 66 20 74  y argument. If t
9d00: 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 0a 2a  he end of the .*
9d10: 2a 20 64 6f 63 6c 69 73 74 2d 69 6e 64 65 78 20  * doclist-index 
9d20: 70 61 67 65 20 69 73 20 72 65 61 63 68 65 64 2c  page is reached,
9d30: 20 72 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f   return non-zero
9d40: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
9d50: 66 74 73 35 44 6c 69 64 78 4c 76 6c 4e 65 78 74  fts5DlidxLvlNext
9d60: 28 46 74 73 35 44 6c 69 64 78 4c 76 6c 20 2a 70  (Fts5DlidxLvl *p
9d70: 4c 76 6c 29 7b 0a 20 20 46 74 73 35 44 61 74 61  Lvl){.  Fts5Data
9d80: 20 2a 70 44 61 74 61 20 3d 20 70 4c 76 6c 2d 3e   *pData = pLvl->
9d90: 70 44 61 74 61 3b 0a 0a 20 20 69 66 28 20 70 4c  pData;..  if( pL
9da0: 76 6c 2d 3e 69 4f 66 66 3d 3d 30 20 29 7b 0a 20  vl->iOff==0 ){. 
9db0: 20 20 20 61 73 73 65 72 74 28 20 70 4c 76 6c 2d     assert( pLvl-
9dc0: 3e 62 45 6f 66 3d 3d 30 20 29 3b 0a 20 20 20 20  >bEof==0 );.    
9dd0: 70 4c 76 6c 2d 3e 69 4f 66 66 20 3d 20 31 3b 0a  pLvl->iOff = 1;.
9de0: 20 20 20 20 70 4c 76 6c 2d 3e 69 4f 66 66 20 2b      pLvl->iOff +
9df0: 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e 74 33  = fts5GetVarint3
9e00: 32 28 26 70 44 61 74 61 2d 3e 70 5b 31 5d 2c 20  2(&pData->p[1], 
9e10: 70 4c 76 6c 2d 3e 69 4c 65 61 66 50 67 6e 6f 29  pLvl->iLeafPgno)
9e20: 3b 0a 20 20 20 20 70 4c 76 6c 2d 3e 69 4f 66 66  ;.    pLvl->iOff
9e30: 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e   += fts5GetVarin
9e40: 74 28 26 70 44 61 74 61 2d 3e 70 5b 70 4c 76 6c  t(&pData->p[pLvl
9e50: 2d 3e 69 4f 66 66 5d 2c 20 28 75 36 34 2a 29 26  ->iOff], (u64*)&
9e60: 70 4c 76 6c 2d 3e 69 52 6f 77 69 64 29 3b 0a 20  pLvl->iRowid);. 
9e70: 20 20 20 70 4c 76 6c 2d 3e 69 46 69 72 73 74 4f     pLvl->iFirstO
9e80: 66 66 20 3d 20 70 4c 76 6c 2d 3e 69 4f 66 66 3b  ff = pLvl->iOff;
9e90: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e  .  }else{.    in
9ea0: 74 20 69 4f 66 66 3b 0a 20 20 20 20 66 6f 72 28  t iOff;.    for(
9eb0: 69 4f 66 66 3d 70 4c 76 6c 2d 3e 69 4f 66 66 3b  iOff=pLvl->iOff;
9ec0: 20 69 4f 66 66 3c 70 44 61 74 61 2d 3e 6e 6e 3b   iOff<pData->nn;
9ed0: 20 69 4f 66 66 2b 2b 29 7b 0a 20 20 20 20 20 20   iOff++){.      
9ee0: 69 66 28 20 70 44 61 74 61 2d 3e 70 5b 69 4f 66  if( pData->p[iOf
9ef0: 66 5d 20 29 20 62 72 65 61 6b 3b 20 0a 20 20 20  f] ) break; .   
9f00: 20 7d 0a 0a 20 20 20 20 69 66 28 20 69 4f 66 66   }..    if( iOff
9f10: 3c 70 44 61 74 61 2d 3e 6e 6e 20 29 7b 0a 20 20  <pData->nn ){.  
9f20: 20 20 20 20 69 36 34 20 69 56 61 6c 3b 0a 20 20      i64 iVal;.  
9f30: 20 20 20 20 70 4c 76 6c 2d 3e 69 4c 65 61 66 50      pLvl->iLeafP
9f40: 67 6e 6f 20 2b 3d 20 28 69 4f 66 66 20 2d 20 70  gno += (iOff - p
9f50: 4c 76 6c 2d 3e 69 4f 66 66 29 20 2b 20 31 3b 0a  Lvl->iOff) + 1;.
9f60: 20 20 20 20 20 20 69 4f 66 66 20 2b 3d 20 66 74        iOff += ft
9f70: 73 35 47 65 74 56 61 72 69 6e 74 28 26 70 44 61  s5GetVarint(&pDa
9f80: 74 61 2d 3e 70 5b 69 4f 66 66 5d 2c 20 28 75 36  ta->p[iOff], (u6
9f90: 34 2a 29 26 69 56 61 6c 29 3b 0a 20 20 20 20 20  4*)&iVal);.     
9fa0: 20 70 4c 76 6c 2d 3e 69 52 6f 77 69 64 20 2b 3d   pLvl->iRowid +=
9fb0: 20 69 56 61 6c 3b 0a 20 20 20 20 20 20 70 4c 76   iVal;.      pLv
9fc0: 6c 2d 3e 69 4f 66 66 20 3d 20 69 4f 66 66 3b 0a  l->iOff = iOff;.
9fd0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
9fe0: 20 70 4c 76 6c 2d 3e 62 45 6f 66 20 3d 20 31 3b   pLvl->bEof = 1;
9ff0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65  .    }.  }..  re
a000: 74 75 72 6e 20 70 4c 76 6c 2d 3e 62 45 6f 66 3b  turn pLvl->bEof;
a010: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 76 61 6e 63  .}../*.** Advanc
a020: 65 20 74 68 65 20 69 74 65 72 61 74 6f 72 20 70  e the iterator p
a030: 61 73 73 65 64 20 61 73 20 74 68 65 20 6f 6e 6c  assed as the onl
a040: 79 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73  y argument..*/.s
a050: 74 61 74 69 63 20 69 6e 74 20 66 74 73 35 44 6c  tatic int fts5Dl
a060: 69 64 78 49 74 65 72 4e 65 78 74 52 28 46 74 73  idxIterNextR(Fts
a070: 35 49 6e 64 65 78 20 2a 70 2c 20 46 74 73 35 44  5Index *p, Fts5D
a080: 6c 69 64 78 49 74 65 72 20 2a 70 49 74 65 72 2c  lidxIter *pIter,
a090: 20 69 6e 74 20 69 4c 76 6c 29 7b 0a 20 20 46 74   int iLvl){.  Ft
a0a0: 73 35 44 6c 69 64 78 4c 76 6c 20 2a 70 4c 76 6c  s5DlidxLvl *pLvl
a0b0: 20 3d 20 26 70 49 74 65 72 2d 3e 61 4c 76 6c 5b   = &pIter->aLvl[
a0c0: 69 4c 76 6c 5d 3b 0a 0a 20 20 61 73 73 65 72 74  iLvl];..  assert
a0d0: 28 20 69 4c 76 6c 3c 70 49 74 65 72 2d 3e 6e 4c  ( iLvl<pIter->nL
a0e0: 76 6c 20 29 3b 0a 20 20 69 66 28 20 66 74 73 35  vl );.  if( fts5
a0f0: 44 6c 69 64 78 4c 76 6c 4e 65 78 74 28 70 4c 76  DlidxLvlNext(pLv
a100: 6c 29 20 29 7b 0a 20 20 20 20 69 66 28 20 28 69  l) ){.    if( (i
a110: 4c 76 6c 2b 31 29 20 3c 20 70 49 74 65 72 2d 3e  Lvl+1) < pIter->
a120: 6e 4c 76 6c 20 29 7b 0a 20 20 20 20 20 20 66 74  nLvl ){.      ft
a130: 73 35 44 6c 69 64 78 49 74 65 72 4e 65 78 74 52  s5DlidxIterNextR
a140: 28 70 2c 20 70 49 74 65 72 2c 20 69 4c 76 6c 2b  (p, pIter, iLvl+
a150: 31 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4c  1);.      if( pL
a160: 76 6c 5b 31 5d 2e 62 45 6f 66 3d 3d 30 20 29 7b  vl[1].bEof==0 ){
a170: 0a 20 20 20 20 20 20 20 20 66 74 73 35 44 61 74  .        fts5Dat
a180: 61 52 65 6c 65 61 73 65 28 70 4c 76 6c 2d 3e 70  aRelease(pLvl->p
a190: 44 61 74 61 29 3b 0a 20 20 20 20 20 20 20 20 6d  Data);.        m
a1a0: 65 6d 73 65 74 28 70 4c 76 6c 2c 20 30 2c 20 73  emset(pLvl, 0, s
a1b0: 69 7a 65 6f 66 28 46 74 73 35 44 6c 69 64 78 4c  izeof(Fts5DlidxL
a1c0: 76 6c 29 29 3b 0a 20 20 20 20 20 20 20 20 70 4c  vl));.        pL
a1d0: 76 6c 2d 3e 70 44 61 74 61 20 3d 20 66 74 73 35  vl->pData = fts5
a1e0: 44 61 74 61 52 65 61 64 28 70 2c 20 0a 20 20 20  DataRead(p, .   
a1f0: 20 20 20 20 20 20 20 20 20 46 54 53 35 5f 44 4c           FTS5_DL
a200: 49 44 58 5f 52 4f 57 49 44 28 70 49 74 65 72 2d  IDX_ROWID(pIter-
a210: 3e 69 53 65 67 69 64 2c 20 69 4c 76 6c 2c 20 70  >iSegid, iLvl, p
a220: 4c 76 6c 5b 31 5d 2e 69 4c 65 61 66 50 67 6e 6f  Lvl[1].iLeafPgno
a230: 29 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20  ).        );.   
a240: 20 20 20 20 20 69 66 28 20 70 4c 76 6c 2d 3e 70       if( pLvl->p
a250: 44 61 74 61 20 29 20 66 74 73 35 44 6c 69 64 78  Data ) fts5Dlidx
a260: 4c 76 6c 4e 65 78 74 28 70 4c 76 6c 29 3b 0a 20  LvlNext(pLvl);. 
a270: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
a280: 0a 0a 20 20 72 65 74 75 72 6e 20 70 49 74 65 72  ..  return pIter
a290: 2d 3e 61 4c 76 6c 5b 30 5d 2e 62 45 6f 66 3b 0a  ->aLvl[0].bEof;.
a2a0: 7d 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73  }.static int fts
a2b0: 35 44 6c 69 64 78 49 74 65 72 4e 65 78 74 28 46  5DlidxIterNext(F
a2c0: 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 46 74 73  ts5Index *p, Fts
a2d0: 35 44 6c 69 64 78 49 74 65 72 20 2a 70 49 74 65  5DlidxIter *pIte
a2e0: 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 66 74 73  r){.  return fts
a2f0: 35 44 6c 69 64 78 49 74 65 72 4e 65 78 74 52 28  5DlidxIterNextR(
a300: 70 2c 20 70 49 74 65 72 2c 20 30 29 3b 0a 7d 0a  p, pIter, 0);.}.
a310: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 69 74 65 72 61  ./*.** The itera
a320: 74 6f 72 20 70 61 73 73 65 64 20 61 73 20 74 68  tor passed as th
a330: 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74  e first argument
a340: 20 68 61 73 20 74 68 65 20 66 6f 6c 6c 6f 77 69   has the followi
a350: 6e 67 20 66 69 65 6c 64 73 20 73 65 74 0a 2a 2a  ng fields set.**
a360: 20 61 73 20 66 6f 6c 6c 6f 77 73 2e 20 54 68 69   as follows. Thi
a370: 73 20 66 75 6e 63 74 69 6f 6e 20 73 65 74 73 20  s function sets 
a380: 75 70 20 74 68 65 20 72 65 73 74 20 6f 66 20 74  up the rest of t
a390: 68 65 20 69 74 65 72 61 74 6f 72 20 73 6f 20 74  he iterator so t
a3a0: 68 61 74 20 69 74 0a 2a 2a 20 70 6f 69 6e 74 73  hat it.** points
a3b0: 20 74 6f 20 74 68 65 20 66 69 72 73 74 20 72 6f   to the first ro
a3c0: 77 69 64 20 69 6e 20 74 68 65 20 64 6f 63 6c 69  wid in the docli
a3d0: 73 74 2d 69 6e 64 65 78 2e 0a 2a 2a 0a 2a 2a 20  st-index..**.** 
a3e0: 20 20 70 44 61 74 61 3a 0a 2a 2a 20 20 20 20 20    pData:.**     
a3f0: 70 6f 69 6e 74 65 72 20 74 6f 20 64 6f 63 6c 69  pointer to docli
a400: 73 74 2d 69 6e 64 65 78 20 72 65 63 6f 72 64 2c  st-index record,
a410: 20 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69   .**.** When thi
a420: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
a430: 6c 6c 65 64 20 70 49 74 65 72 2d 3e 69 4c 65 61  lled pIter->iLea
a440: 66 50 67 6e 6f 20 69 73 20 74 68 65 20 70 61 67  fPgno is the pag
a450: 65 20 6e 75 6d 62 65 72 20 74 68 65 0a 2a 2a 20  e number the.** 
a460: 64 6f 63 6c 69 73 74 20 69 73 20 61 73 73 6f 63  doclist is assoc
a470: 69 61 74 65 64 20 77 69 74 68 20 28 74 68 65 20  iated with (the 
a480: 6f 6e 65 20 66 65 61 74 75 72 69 6e 67 20 74 68  one featuring th
a490: 65 20 74 65 72 6d 29 2e 0a 2a 2f 0a 73 74 61 74  e term)..*/.stat
a4a0: 69 63 20 69 6e 74 20 66 74 73 35 44 6c 69 64 78  ic int fts5Dlidx
a4b0: 49 74 65 72 46 69 72 73 74 28 46 74 73 35 44 6c  IterFirst(Fts5Dl
a4c0: 69 64 78 49 74 65 72 20 2a 70 49 74 65 72 29 7b  idxIter *pIter){
a4d0: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28  .  int i;.  for(
a4e0: 69 3d 30 3b 20 69 3c 70 49 74 65 72 2d 3e 6e 4c  i=0; i<pIter->nL
a4f0: 76 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 66 74  vl; i++){.    ft
a500: 73 35 44 6c 69 64 78 4c 76 6c 4e 65 78 74 28 26  s5DlidxLvlNext(&
a510: 70 49 74 65 72 2d 3e 61 4c 76 6c 5b 69 5d 29 3b  pIter->aLvl[i]);
a520: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 49  .  }.  return pI
a530: 74 65 72 2d 3e 61 4c 76 6c 5b 30 5d 2e 62 45 6f  ter->aLvl[0].bEo
a540: 66 3b 0a 7d 0a 0a 0a 73 74 61 74 69 63 20 69 6e  f;.}...static in
a550: 74 20 66 74 73 35 44 6c 69 64 78 49 74 65 72 45  t fts5DlidxIterE
a560: 6f 66 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c  of(Fts5Index *p,
a570: 20 46 74 73 35 44 6c 69 64 78 49 74 65 72 20 2a   Fts5DlidxIter *
a580: 70 49 74 65 72 29 7b 0a 20 20 72 65 74 75 72 6e  pIter){.  return
a590: 20 70 2d 3e 72 63 21 3d 53 51 4c 49 54 45 5f 4f   p->rc!=SQLITE_O
a5a0: 4b 20 7c 7c 20 70 49 74 65 72 2d 3e 61 4c 76 6c  K || pIter->aLvl
a5b0: 5b 30 5d 2e 62 45 6f 66 3b 0a 7d 0a 0a 73 74 61  [0].bEof;.}..sta
a5c0: 74 69 63 20 76 6f 69 64 20 66 74 73 35 44 6c 69  tic void fts5Dli
a5d0: 64 78 49 74 65 72 4c 61 73 74 28 46 74 73 35 49  dxIterLast(Fts5I
a5e0: 6e 64 65 78 20 2a 70 2c 20 46 74 73 35 44 6c 69  ndex *p, Fts5Dli
a5f0: 64 78 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a  dxIter *pIter){.
a600: 20 20 69 6e 74 20 69 3b 0a 0a 20 20 2f 2a 20 41    int i;..  /* A
a610: 64 76 61 6e 63 65 20 65 61 63 68 20 6c 65 76 65  dvance each leve
a620: 6c 20 74 6f 20 74 68 65 20 6c 61 73 74 20 65 6e  l to the last en
a630: 74 72 79 20 6f 6e 20 74 68 65 20 6c 61 73 74 20  try on the last 
a640: 70 61 67 65 20 2a 2f 0a 20 20 66 6f 72 28 69 3d  page */.  for(i=
a650: 70 49 74 65 72 2d 3e 6e 4c 76 6c 2d 31 3b 20 70  pIter->nLvl-1; p
a660: 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
a670: 26 26 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20  && i>=0; i--){. 
a680: 20 20 20 46 74 73 35 44 6c 69 64 78 4c 76 6c 20     Fts5DlidxLvl 
a690: 2a 70 4c 76 6c 20 3d 20 26 70 49 74 65 72 2d 3e  *pLvl = &pIter->
a6a0: 61 4c 76 6c 5b 69 5d 3b 0a 20 20 20 20 77 68 69  aLvl[i];.    whi
a6b0: 6c 65 28 20 66 74 73 35 44 6c 69 64 78 4c 76 6c  le( fts5DlidxLvl
a6c0: 4e 65 78 74 28 70 4c 76 6c 29 3d 3d 30 20 29 3b  Next(pLvl)==0 );
a6d0: 0a 20 20 20 20 70 4c 76 6c 2d 3e 62 45 6f 66 20  .    pLvl->bEof 
a6e0: 3d 20 30 3b 0a 0a 20 20 20 20 69 66 28 20 69 3e  = 0;..    if( i>
a6f0: 30 20 29 7b 0a 20 20 20 20 20 20 46 74 73 35 44  0 ){.      Fts5D
a700: 6c 69 64 78 4c 76 6c 20 2a 70 43 68 69 6c 64 20  lidxLvl *pChild 
a710: 3d 20 26 70 4c 76 6c 5b 2d 31 5d 3b 0a 20 20 20  = &pLvl[-1];.   
a720: 20 20 20 66 74 73 35 44 61 74 61 52 65 6c 65 61     fts5DataRelea
a730: 73 65 28 70 43 68 69 6c 64 2d 3e 70 44 61 74 61  se(pChild->pData
a740: 29 3b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28  );.      memset(
a750: 70 43 68 69 6c 64 2c 20 30 2c 20 73 69 7a 65 6f  pChild, 0, sizeo
a760: 66 28 46 74 73 35 44 6c 69 64 78 4c 76 6c 29 29  f(Fts5DlidxLvl))
a770: 3b 0a 20 20 20 20 20 20 70 43 68 69 6c 64 2d 3e  ;.      pChild->
a780: 70 44 61 74 61 20 3d 20 66 74 73 35 44 61 74 61  pData = fts5Data
a790: 52 65 61 64 28 70 2c 20 0a 20 20 20 20 20 20 20  Read(p, .       
a7a0: 20 20 20 46 54 53 35 5f 44 4c 49 44 58 5f 52 4f     FTS5_DLIDX_RO
a7b0: 57 49 44 28 70 49 74 65 72 2d 3e 69 53 65 67 69  WID(pIter->iSegi
a7c0: 64 2c 20 69 2d 31 2c 20 70 4c 76 6c 2d 3e 69 4c  d, i-1, pLvl->iL
a7d0: 65 61 66 50 67 6e 6f 29 0a 20 20 20 20 20 20 29  eafPgno).      )
a7e0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  ;.    }.  }.}../
a7f0: 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 69 74  *.** Move the it
a800: 65 72 61 74 6f 72 20 70 61 73 73 65 64 20 61 73  erator passed as
a810: 20 74 68 65 20 6f 6e 6c 79 20 61 72 67 75 6d 65   the only argume
a820: 6e 74 20 74 6f 20 74 68 65 20 70 72 65 76 69 6f  nt to the previo
a830: 75 73 20 65 6e 74 72 79 2e 0a 2a 2f 0a 73 74 61  us entry..*/.sta
a840: 74 69 63 20 69 6e 74 20 66 74 73 35 44 6c 69 64  tic int fts5Dlid
a850: 78 4c 76 6c 50 72 65 76 28 46 74 73 35 44 6c 69  xLvlPrev(Fts5Dli
a860: 64 78 4c 76 6c 20 2a 70 4c 76 6c 29 7b 0a 20 20  dxLvl *pLvl){.  
a870: 69 6e 74 20 69 4f 66 66 20 3d 20 70 4c 76 6c 2d  int iOff = pLvl-
a880: 3e 69 4f 66 66 3b 0a 0a 20 20 61 73 73 65 72 74  >iOff;..  assert
a890: 28 20 70 4c 76 6c 2d 3e 62 45 6f 66 3d 3d 30 20  ( pLvl->bEof==0 
a8a0: 29 3b 0a 20 20 69 66 28 20 69 4f 66 66 3c 3d 70  );.  if( iOff<=p
a8b0: 4c 76 6c 2d 3e 69 46 69 72 73 74 4f 66 66 20 29  Lvl->iFirstOff )
a8c0: 7b 0a 20 20 20 20 70 4c 76 6c 2d 3e 62 45 6f 66  {.    pLvl->bEof
a8d0: 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   = 1;.  }else{. 
a8e0: 20 20 20 75 38 20 2a 61 20 3d 20 70 4c 76 6c 2d     u8 *a = pLvl-
a8f0: 3e 70 44 61 74 61 2d 3e 70 3b 0a 20 20 20 20 69  >pData->p;.    i
a900: 36 34 20 69 56 61 6c 3b 0a 20 20 20 20 69 6e 74  64 iVal;.    int
a910: 20 69 4c 69 6d 69 74 3b 0a 20 20 20 20 69 6e 74   iLimit;.    int
a920: 20 69 69 3b 0a 20 20 20 20 69 6e 74 20 6e 5a 65   ii;.    int nZe
a930: 72 6f 20 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a 20  ro = 0;..    /* 
a940: 43 75 72 72 65 6e 74 6c 79 20 69 4f 66 66 20 70  Currently iOff p
a950: 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 66 69 72  oints to the fir
a960: 73 74 20 62 79 74 65 20 6f 66 20 61 20 76 61 72  st byte of a var
a970: 69 6e 74 2e 20 54 68 69 73 20 62 6c 6f 63 6b 20  int. This block 
a980: 0a 20 20 20 20 2a 2a 20 64 65 63 72 65 6d 65 6e  .    ** decremen
a990: 74 73 20 69 4f 66 66 20 75 6e 74 69 6c 20 69 74  ts iOff until it
a9a0: 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 66   points to the f
a9b0: 69 72 73 74 20 62 79 74 65 20 6f 66 20 74 68 65  irst byte of the
a9c0: 20 70 72 65 76 69 6f 75 73 20 0a 20 20 20 20 2a   previous .    *
a9d0: 2a 20 76 61 72 69 6e 74 2e 20 54 61 6b 69 6e 67  * varint. Taking
a9e0: 20 63 61 72 65 20 6e 6f 74 20 74 6f 20 72 65 61   care not to rea
a9f0: 64 20 61 6e 79 20 6d 65 6d 6f 72 79 20 6c 6f 63  d any memory loc
aa00: 61 74 69 6f 6e 73 20 74 68 61 74 20 6f 63 63 75  ations that occu
aa10: 72 0a 20 20 20 20 2a 2a 20 62 65 66 6f 72 65 20  r.    ** before 
aa20: 74 68 65 20 62 75 66 66 65 72 20 69 6e 20 6d 65  the buffer in me
aa30: 6d 6f 72 79 2e 20 20 2a 2f 0a 20 20 20 20 69 4c  mory.  */.    iL
aa40: 69 6d 69 74 20 3d 20 28 69 4f 66 66 3e 39 20 3f  imit = (iOff>9 ?
aa50: 20 69 4f 66 66 2d 39 20 3a 20 30 29 3b 0a 20 20   iOff-9 : 0);.  
aa60: 20 20 66 6f 72 28 69 4f 66 66 2d 2d 3b 20 69 4f    for(iOff--; iO
aa70: 66 66 3e 69 4c 69 6d 69 74 3b 20 69 4f 66 66 2d  ff>iLimit; iOff-
aa80: 2d 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28 61  -){.      if( (a
aa90: 5b 69 4f 66 66 2d 31 5d 20 26 20 30 78 38 30 29  [iOff-1] & 0x80)
aaa0: 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ==0 ) break;.   
aab0: 20 7d 0a 0a 20 20 20 20 66 74 73 35 47 65 74 56   }..    fts5GetV
aac0: 61 72 69 6e 74 28 26 61 5b 69 4f 66 66 5d 2c 20  arint(&a[iOff], 
aad0: 28 75 36 34 2a 29 26 69 56 61 6c 29 3b 0a 20 20  (u64*)&iVal);.  
aae0: 20 20 70 4c 76 6c 2d 3e 69 52 6f 77 69 64 20 2d    pLvl->iRowid -
aaf0: 3d 20 69 56 61 6c 3b 0a 20 20 20 20 70 4c 76 6c  = iVal;.    pLvl
ab00: 2d 3e 69 4c 65 61 66 50 67 6e 6f 2d 2d 3b 0a 0a  ->iLeafPgno--;..
ab10: 20 20 20 20 2f 2a 20 53 6b 69 70 20 62 61 63 6b      /* Skip back
ab20: 77 61 72 64 73 20 70 61 73 74 20 61 6e 79 20 30  wards past any 0
ab30: 78 30 30 20 76 61 72 69 6e 74 73 2e 20 2a 2f 0a  x00 varints. */.
ab40: 20 20 20 20 66 6f 72 28 69 69 3d 69 4f 66 66 2d      for(ii=iOff-
ab50: 31 3b 20 69 69 3e 3d 70 4c 76 6c 2d 3e 69 46 69  1; ii>=pLvl->iFi
ab60: 72 73 74 4f 66 66 20 26 26 20 61 5b 69 69 5d 3d  rstOff && a[ii]=
ab70: 3d 30 78 30 30 3b 20 69 69 2d 2d 29 7b 0a 20 20  =0x00; ii--){.  
ab80: 20 20 20 20 6e 5a 65 72 6f 2b 2b 3b 0a 20 20 20      nZero++;.   
ab90: 20 7d 0a 20 20 20 20 69 66 28 20 69 69 3e 3d 70   }.    if( ii>=p
aba0: 4c 76 6c 2d 3e 69 46 69 72 73 74 4f 66 66 20 26  Lvl->iFirstOff &
abb0: 26 20 28 61 5b 69 69 5d 20 26 20 30 78 38 30 29  & (a[ii] & 0x80)
abc0: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65   ){.      /* The
abd0: 20 62 79 74 65 20 69 6d 6d 65 64 69 61 74 65 6c   byte immediatel
abe0: 79 20 62 65 66 6f 72 65 20 74 68 65 20 6c 61 73  y before the las
abf0: 74 20 30 78 30 30 20 62 79 74 65 20 68 61 73 20  t 0x00 byte has 
ac00: 74 68 65 20 30 78 38 30 20 62 69 74 0a 20 20 20  the 0x80 bit.   
ac10: 20 20 20 2a 2a 20 73 65 74 2e 20 53 6f 20 74 68     ** set. So th
ac20: 65 20 6c 61 73 74 20 30 78 30 30 20 69 73 20 6f  e last 0x00 is o
ac30: 6e 6c 79 20 61 20 76 61 72 69 6e 74 20 30 20 69  nly a varint 0 i
ac40: 66 20 74 68 65 72 65 20 61 72 65 20 38 20 6d 6f  f there are 8 mo
ac50: 72 65 20 30 78 38 30 0a 20 20 20 20 20 20 2a 2a  re 0x80.      **
ac60: 20 62 79 74 65 73 20 62 65 66 6f 72 65 20 61 5b   bytes before a[
ac70: 69 69 5d 2e 20 2a 2f 0a 20 20 20 20 20 20 69 6e  ii]. */.      in
ac80: 74 20 62 5a 65 72 6f 20 3d 20 30 3b 20 20 20 20  t bZero = 0;    
ac90: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
aca0: 65 20 69 66 20 6c 61 73 74 20 30 78 30 30 20 63  e if last 0x00 c
acb0: 6f 75 6e 74 73 20 2a 2f 0a 20 20 20 20 20 20 69  ounts */.      i
acc0: 66 28 20 28 69 69 2d 38 29 3e 3d 70 4c 76 6c 2d  f( (ii-8)>=pLvl-
acd0: 3e 69 46 69 72 73 74 4f 66 66 20 29 7b 0a 20 20  >iFirstOff ){.  
ace0: 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20        int j;.   
acf0: 20 20 20 20 20 66 6f 72 28 6a 3d 31 3b 20 6a 3c       for(j=1; j<
ad00: 3d 38 20 26 26 20 28 61 5b 69 69 2d 6a 5d 20 26  =8 && (a[ii-j] &
ad10: 20 30 78 38 30 29 3b 20 6a 2b 2b 29 3b 0a 20 20   0x80); j++);.  
ad20: 20 20 20 20 20 20 62 5a 65 72 6f 20 3d 20 28 6a        bZero = (j
ad30: 3e 38 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  >8);.      }.   
ad40: 20 20 20 69 66 28 20 62 5a 65 72 6f 3d 3d 30 20     if( bZero==0 
ad50: 29 20 6e 5a 65 72 6f 2d 2d 3b 0a 20 20 20 20 7d  ) nZero--;.    }
ad60: 0a 20 20 20 20 70 4c 76 6c 2d 3e 69 4c 65 61 66  .    pLvl->iLeaf
ad70: 50 67 6e 6f 20 2d 3d 20 6e 5a 65 72 6f 3b 0a 20  Pgno -= nZero;. 
ad80: 20 20 20 70 4c 76 6c 2d 3e 69 4f 66 66 20 3d 20     pLvl->iOff = 
ad90: 69 4f 66 66 20 2d 20 6e 5a 65 72 6f 3b 0a 20 20  iOff - nZero;.  
ada0: 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70 4c 76 6c  }..  return pLvl
adb0: 2d 3e 62 45 6f 66 3b 0a 7d 0a 0a 73 74 61 74 69  ->bEof;.}..stati
adc0: 63 20 69 6e 74 20 66 74 73 35 44 6c 69 64 78 49  c int fts5DlidxI
add0: 74 65 72 50 72 65 76 52 28 46 74 73 35 49 6e 64  terPrevR(Fts5Ind
ade0: 65 78 20 2a 70 2c 20 46 74 73 35 44 6c 69 64 78  ex *p, Fts5Dlidx
adf0: 49 74 65 72 20 2a 70 49 74 65 72 2c 20 69 6e 74  Iter *pIter, int
ae00: 20 69 4c 76 6c 29 7b 0a 20 20 46 74 73 35 44 6c   iLvl){.  Fts5Dl
ae10: 69 64 78 4c 76 6c 20 2a 70 4c 76 6c 20 3d 20 26  idxLvl *pLvl = &
ae20: 70 49 74 65 72 2d 3e 61 4c 76 6c 5b 69 4c 76 6c  pIter->aLvl[iLvl
ae30: 5d 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 69 4c  ];..  assert( iL
ae40: 76 6c 3c 70 49 74 65 72 2d 3e 6e 4c 76 6c 20 29  vl<pIter->nLvl )
ae50: 3b 0a 20 20 69 66 28 20 66 74 73 35 44 6c 69 64  ;.  if( fts5Dlid
ae60: 78 4c 76 6c 50 72 65 76 28 70 4c 76 6c 29 20 29  xLvlPrev(pLvl) )
ae70: 7b 0a 20 20 20 20 69 66 28 20 28 69 4c 76 6c 2b  {.    if( (iLvl+
ae80: 31 29 20 3c 20 70 49 74 65 72 2d 3e 6e 4c 76 6c  1) < pIter->nLvl
ae90: 20 29 7b 0a 20 20 20 20 20 20 66 74 73 35 44 6c   ){.      fts5Dl
aea0: 69 64 78 49 74 65 72 50 72 65 76 52 28 70 2c 20  idxIterPrevR(p, 
aeb0: 70 49 74 65 72 2c 20 69 4c 76 6c 2b 31 29 3b 0a  pIter, iLvl+1);.
aec0: 20 20 20 20 20 20 69 66 28 20 70 4c 76 6c 5b 31        if( pLvl[1
aed0: 5d 2e 62 45 6f 66 3d 3d 30 20 29 7b 0a 20 20 20  ].bEof==0 ){.   
aee0: 20 20 20 20 20 66 74 73 35 44 61 74 61 52 65 6c       fts5DataRel
aef0: 65 61 73 65 28 70 4c 76 6c 2d 3e 70 44 61 74 61  ease(pLvl->pData
af00: 29 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 73 65  );.        memse
af10: 74 28 70 4c 76 6c 2c 20 30 2c 20 73 69 7a 65 6f  t(pLvl, 0, sizeo
af20: 66 28 46 74 73 35 44 6c 69 64 78 4c 76 6c 29 29  f(Fts5DlidxLvl))
af30: 3b 0a 20 20 20 20 20 20 20 20 70 4c 76 6c 2d 3e  ;.        pLvl->
af40: 70 44 61 74 61 20 3d 20 66 74 73 35 44 61 74 61  pData = fts5Data
af50: 52 65 61 64 28 70 2c 20 0a 20 20 20 20 20 20 20  Read(p, .       
af60: 20 20 20 20 20 46 54 53 35 5f 44 4c 49 44 58 5f       FTS5_DLIDX_
af70: 52 4f 57 49 44 28 70 49 74 65 72 2d 3e 69 53 65  ROWID(pIter->iSe
af80: 67 69 64 2c 20 69 4c 76 6c 2c 20 70 4c 76 6c 5b  gid, iLvl, pLvl[
af90: 31 5d 2e 69 4c 65 61 66 50 67 6e 6f 29 0a 20 20  1].iLeafPgno).  
afa0: 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20        );.       
afb0: 20 69 66 28 20 70 4c 76 6c 2d 3e 70 44 61 74 61   if( pLvl->pData
afc0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 77 68   ){.          wh
afd0: 69 6c 65 28 20 66 74 73 35 44 6c 69 64 78 4c 76  ile( fts5DlidxLv
afe0: 6c 4e 65 78 74 28 70 4c 76 6c 29 3d 3d 30 20 29  lNext(pLvl)==0 )
aff0: 3b 0a 20 20 20 20 20 20 20 20 20 20 70 4c 76 6c  ;.          pLvl
b000: 2d 3e 62 45 6f 66 20 3d 20 30 3b 0a 20 20 20 20  ->bEof = 0;.    
b010: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
b020: 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72    }.  }..  retur
b030: 6e 20 70 49 74 65 72 2d 3e 61 4c 76 6c 5b 30 5d  n pIter->aLvl[0]
b040: 2e 62 45 6f 66 3b 0a 7d 0a 73 74 61 74 69 63 20  .bEof;.}.static 
b050: 69 6e 74 20 66 74 73 35 44 6c 69 64 78 49 74 65  int fts5DlidxIte
b060: 72 50 72 65 76 28 46 74 73 35 49 6e 64 65 78 20  rPrev(Fts5Index 
b070: 2a 70 2c 20 46 74 73 35 44 6c 69 64 78 49 74 65  *p, Fts5DlidxIte
b080: 72 20 2a 70 49 74 65 72 29 7b 0a 20 20 72 65 74  r *pIter){.  ret
b090: 75 72 6e 20 66 74 73 35 44 6c 69 64 78 49 74 65  urn fts5DlidxIte
b0a0: 72 50 72 65 76 52 28 70 2c 20 70 49 74 65 72 2c  rPrevR(p, pIter,
b0b0: 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72   0);.}../*.** Fr
b0c0: 65 65 20 61 20 64 6f 63 6c 69 73 74 2d 69 6e 64  ee a doclist-ind
b0d0: 65 78 20 69 74 65 72 61 74 6f 72 20 6f 62 6a 65  ex iterator obje
b0e0: 63 74 20 61 6c 6c 6f 63 61 74 65 64 20 62 79 20  ct allocated by 
b0f0: 66 74 73 35 44 6c 69 64 78 49 74 65 72 49 6e 69  fts5DlidxIterIni
b100: 74 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  t()..*/.static v
b110: 6f 69 64 20 66 74 73 35 44 6c 69 64 78 49 74 65  oid fts5DlidxIte
b120: 72 46 72 65 65 28 46 74 73 35 44 6c 69 64 78 49  rFree(Fts5DlidxI
b130: 74 65 72 20 2a 70 49 74 65 72 29 7b 0a 20 20 69  ter *pIter){.  i
b140: 66 28 20 70 49 74 65 72 20 29 7b 0a 20 20 20 20  f( pIter ){.    
b150: 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69  int i;.    for(i
b160: 3d 30 3b 20 69 3c 70 49 74 65 72 2d 3e 6e 4c 76  =0; i<pIter->nLv
b170: 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 66  l; i++){.      f
b180: 74 73 35 44 61 74 61 52 65 6c 65 61 73 65 28 70  ts5DataRelease(p
b190: 49 74 65 72 2d 3e 61 4c 76 6c 5b 69 5d 2e 70 44  Iter->aLvl[i].pD
b1a0: 61 74 61 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ata);.    }.    
b1b0: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 49 74  sqlite3_free(pIt
b1c0: 65 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74  er);.  }.}..stat
b1d0: 69 63 20 46 74 73 35 44 6c 69 64 78 49 74 65 72  ic Fts5DlidxIter
b1e0: 20 2a 66 74 73 35 44 6c 69 64 78 49 74 65 72 49   *fts5DlidxIterI
b1f0: 6e 69 74 28 0a 20 20 46 74 73 35 49 6e 64 65 78  nit(.  Fts5Index
b200: 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
b210: 20 20 20 20 20 20 20 2f 2a 20 46 74 73 35 20 42         /* Fts5 B
b220: 61 63 6b 65 6e 64 20 74 6f 20 69 74 65 72 61 74  ackend to iterat
b230: 65 20 77 69 74 68 69 6e 20 2a 2f 0a 20 20 69 6e  e within */.  in
b240: 74 20 62 52 65 76 2c 20 20 20 20 20 20 20 20 20  t bRev,         
b250: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
b260: 20 54 72 75 65 20 66 6f 72 20 4f 52 44 45 52 20   True for ORDER 
b270: 42 59 20 41 53 43 20 2a 2f 0a 20 20 69 6e 74 20  BY ASC */.  int 
b280: 69 53 65 67 69 64 2c 20 20 20 20 20 20 20 20 20  iSegid,         
b290: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
b2a0: 65 67 6d 65 6e 74 20 69 64 20 2a 2f 0a 20 20 69  egment id */.  i
b2b0: 6e 74 20 69 4c 65 61 66 50 67 20 20 20 20 20 20  nt iLeafPg      
b2c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
b2d0: 2a 20 4c 65 61 66 20 70 61 67 65 20 6e 75 6d 62  * Leaf page numb
b2e0: 65 72 20 74 6f 20 6c 6f 61 64 20 64 6c 69 64 78  er to load dlidx
b2f0: 20 66 6f 72 20 2a 2f 0a 29 7b 0a 20 20 46 74 73   for */.){.  Fts
b300: 35 44 6c 69 64 78 49 74 65 72 20 2a 70 49 74 65  5DlidxIter *pIte
b310: 72 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 3b 0a  r = 0;.  int i;.
b320: 20 20 69 6e 74 20 62 44 6f 6e 65 20 3d 20 30 3b    int bDone = 0;
b330: 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20 70 2d 3e  ..  for(i=0; p->
b340: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
b350: 20 62 44 6f 6e 65 3d 3d 30 3b 20 69 2b 2b 29 7b   bDone==0; i++){
b360: 0a 20 20 20 20 69 6e 74 20 6e 42 79 74 65 20 3d  .    int nByte =
b370: 20 73 69 7a 65 6f 66 28 46 74 73 35 44 6c 69 64   sizeof(Fts5Dlid
b380: 78 49 74 65 72 29 20 2b 20 69 20 2a 20 73 69 7a  xIter) + i * siz
b390: 65 6f 66 28 46 74 73 35 44 6c 69 64 78 4c 76 6c  eof(Fts5DlidxLvl
b3a0: 29 3b 0a 20 20 20 20 46 74 73 35 44 6c 69 64 78  );.    Fts5Dlidx
b3b0: 49 74 65 72 20 2a 70 4e 65 77 3b 0a 0a 20 20 20  Iter *pNew;..   
b3c0: 20 70 4e 65 77 20 3d 20 28 46 74 73 35 44 6c 69   pNew = (Fts5Dli
b3d0: 64 78 49 74 65 72 2a 29 73 71 6c 69 74 65 33 5f  dxIter*)sqlite3_
b3e0: 72 65 61 6c 6c 6f 63 28 70 49 74 65 72 2c 20 6e  realloc(pIter, n
b3f0: 42 79 74 65 29 3b 0a 20 20 20 20 69 66 28 20 70  Byte);.    if( p
b400: 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  New==0 ){.      
b410: 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e  p->rc = SQLITE_N
b420: 4f 4d 45 4d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  OMEM;.    }else{
b430: 0a 20 20 20 20 20 20 69 36 34 20 69 52 6f 77 69  .      i64 iRowi
b440: 64 20 3d 20 46 54 53 35 5f 44 4c 49 44 58 5f 52  d = FTS5_DLIDX_R
b450: 4f 57 49 44 28 69 53 65 67 69 64 2c 20 69 2c 20  OWID(iSegid, i, 
b460: 69 4c 65 61 66 50 67 29 3b 0a 20 20 20 20 20 20  iLeafPg);.      
b470: 46 74 73 35 44 6c 69 64 78 4c 76 6c 20 2a 70 4c  Fts5DlidxLvl *pL
b480: 76 6c 20 3d 20 26 70 4e 65 77 2d 3e 61 4c 76 6c  vl = &pNew->aLvl
b490: 5b 69 5d 3b 0a 20 20 20 20 20 20 70 49 74 65 72  [i];.      pIter
b4a0: 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 20 20 6d   = pNew;.      m
b4b0: 65 6d 73 65 74 28 70 4c 76 6c 2c 20 30 2c 20 73  emset(pLvl, 0, s
b4c0: 69 7a 65 6f 66 28 46 74 73 35 44 6c 69 64 78 4c  izeof(Fts5DlidxL
b4d0: 76 6c 29 29 3b 0a 20 20 20 20 20 20 70 4c 76 6c  vl));.      pLvl
b4e0: 2d 3e 70 44 61 74 61 20 3d 20 66 74 73 35 44 61  ->pData = fts5Da
b4f0: 74 61 52 65 61 64 28 70 2c 20 69 52 6f 77 69 64  taRead(p, iRowid
b500: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4c 76  );.      if( pLv
b510: 6c 2d 3e 70 44 61 74 61 20 26 26 20 28 70 4c 76  l->pData && (pLv
b520: 6c 2d 3e 70 44 61 74 61 2d 3e 70 5b 30 5d 20 26  l->pData->p[0] &
b530: 20 30 78 30 30 30 31 29 3d 3d 30 20 29 7b 0a 20   0x0001)==0 ){. 
b540: 20 20 20 20 20 20 20 62 44 6f 6e 65 20 3d 20 31         bDone = 1
b550: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
b560: 70 49 74 65 72 2d 3e 6e 4c 76 6c 20 3d 20 69 2b  pIter->nLvl = i+
b570: 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  1;.    }.  }..  
b580: 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  if( p->rc==SQLIT
b590: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 49 74 65  E_OK ){.    pIte
b5a0: 72 2d 3e 69 53 65 67 69 64 20 3d 20 69 53 65 67  r->iSegid = iSeg
b5b0: 69 64 3b 0a 20 20 20 20 69 66 28 20 62 52 65 76  id;.    if( bRev
b5c0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 66 74 73  ==0 ){.      fts
b5d0: 35 44 6c 69 64 78 49 74 65 72 46 69 72 73 74 28  5DlidxIterFirst(
b5e0: 70 49 74 65 72 29 3b 0a 20 20 20 20 7d 65 6c 73  pIter);.    }els
b5f0: 65 7b 0a 20 20 20 20 20 20 66 74 73 35 44 6c 69  e{.      fts5Dli
b600: 64 78 49 74 65 72 4c 61 73 74 28 70 2c 20 70 49  dxIterLast(p, pI
b610: 74 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ter);.    }.  }.
b620: 0a 20 20 69 66 28 20 70 2d 3e 72 63 21 3d 53 51  .  if( p->rc!=SQ
b630: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 66  LITE_OK ){.    f
b640: 74 73 35 44 6c 69 64 78 49 74 65 72 46 72 65 65  ts5DlidxIterFree
b650: 28 70 49 74 65 72 29 3b 0a 20 20 20 20 70 49 74  (pIter);.    pIt
b660: 65 72 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 72  er = 0;.  }..  r
b670: 65 74 75 72 6e 20 70 49 74 65 72 3b 0a 7d 0a 0a  eturn pIter;.}..
b680: 73 74 61 74 69 63 20 69 36 34 20 66 74 73 35 44  static i64 fts5D
b690: 6c 69 64 78 49 74 65 72 52 6f 77 69 64 28 46 74  lidxIterRowid(Ft
b6a0: 73 35 44 6c 69 64 78 49 74 65 72 20 2a 70 49 74  s5DlidxIter *pIt
b6b0: 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 49  er){.  return pI
b6c0: 74 65 72 2d 3e 61 4c 76 6c 5b 30 5d 2e 69 52 6f  ter->aLvl[0].iRo
b6d0: 77 69 64 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e  wid;.}.static in
b6e0: 74 20 66 74 73 35 44 6c 69 64 78 49 74 65 72 50  t fts5DlidxIterP
b6f0: 67 6e 6f 28 46 74 73 35 44 6c 69 64 78 49 74 65  gno(Fts5DlidxIte
b700: 72 20 2a 70 49 74 65 72 29 7b 0a 20 20 72 65 74  r *pIter){.  ret
b710: 75 72 6e 20 70 49 74 65 72 2d 3e 61 4c 76 6c 5b  urn pIter->aLvl[
b720: 30 5d 2e 69 4c 65 61 66 50 67 6e 6f 3b 0a 7d 0a  0].iLeafPgno;.}.
b730: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
b740: 35 4c 65 61 66 48 65 61 64 65 72 28 46 74 73 35  5LeafHeader(Fts5
b750: 44 61 74 61 20 2a 70 4c 65 61 66 2c 20 69 6e 74  Data *pLeaf, int
b760: 20 2a 70 69 52 6f 77 69 64 2c 20 69 6e 74 20 2a   *piRowid, int *
b770: 70 69 54 65 72 6d 29 7b 0a 20 20 2a 70 69 52 6f  piTerm){.  *piRo
b780: 77 69 64 20 3d 20 28 69 6e 74 29 66 74 73 35 47  wid = (int)fts5G
b790: 65 74 55 31 36 28 26 70 4c 65 61 66 2d 3e 70 5b  etU16(&pLeaf->p[
b7a0: 30 5d 29 3b 0a 20 20 2a 70 69 54 65 72 6d 20 3d  0]);.  *piTerm =
b7b0: 20 28 69 6e 74 29 66 74 73 35 47 65 74 55 31 36   (int)fts5GetU16
b7c0: 28 26 70 4c 65 61 66 2d 3e 70 5b 32 5d 29 3b 0a  (&pLeaf->p[2]);.
b7d0: 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 61 64 20 74 68  }../*.** Load th
b7e0: 65 20 6e 65 78 74 20 6c 65 61 66 20 70 61 67 65  e next leaf page
b7f0: 20 69 6e 74 6f 20 74 68 65 20 73 65 67 6d 65 6e   into the segmen
b800: 74 20 69 74 65 72 61 74 6f 72 2e 0a 2a 2f 0a 73  t iterator..*/.s
b810: 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 53  tatic void fts5S
b820: 65 67 49 74 65 72 4e 65 78 74 50 61 67 65 28 0a  egIterNextPage(.
b830: 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20    Fts5Index *p, 
b840: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b850: 20 20 2f 2a 20 46 54 53 35 20 62 61 63 6b 65 6e    /* FTS5 backen
b860: 64 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 46 74  d object */.  Ft
b870: 73 35 53 65 67 49 74 65 72 20 2a 70 49 74 65 72  s5SegIter *pIter
b880: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
b890: 20 49 74 65 72 61 74 6f 72 20 74 6f 20 61 64 76   Iterator to adv
b8a0: 61 6e 63 65 20 74 6f 20 6e 65 78 74 20 70 61 67  ance to next pag
b8b0: 65 20 2a 2f 0a 29 7b 0a 20 20 46 74 73 35 53 74  e */.){.  Fts5St
b8c0: 72 75 63 74 75 72 65 53 65 67 6d 65 6e 74 20 2a  ructureSegment *
b8d0: 70 53 65 67 20 3d 20 70 49 74 65 72 2d 3e 70 53  pSeg = pIter->pS
b8e0: 65 67 3b 0a 20 20 66 74 73 35 44 61 74 61 52 65  eg;.  fts5DataRe
b8f0: 6c 65 61 73 65 28 70 49 74 65 72 2d 3e 70 4c 65  lease(pIter->pLe
b900: 61 66 29 3b 0a 20 20 70 49 74 65 72 2d 3e 69 4c  af);.  pIter->iL
b910: 65 61 66 50 67 6e 6f 2b 2b 3b 0a 20 20 69 66 28  eafPgno++;.  if(
b920: 20 70 49 74 65 72 2d 3e 70 4e 65 78 74 4c 65 61   pIter->pNextLea
b930: 66 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  f ){.    assert(
b940: 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e   pIter->iLeafPgn
b950: 6f 3c 3d 70 53 65 67 2d 3e 70 67 6e 6f 4c 61 73  o<=pSeg->pgnoLas
b960: 74 20 29 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e  t );.    pIter->
b970: 70 4c 65 61 66 20 3d 20 70 49 74 65 72 2d 3e 70  pLeaf = pIter->p
b980: 4e 65 78 74 4c 65 61 66 3b 0a 20 20 20 20 70 49  NextLeaf;.    pI
b990: 74 65 72 2d 3e 70 4e 65 78 74 4c 65 61 66 20 3d  ter->pNextLeaf =
b9a0: 20 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20   0;.  }else if( 
b9b0: 70 49 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f  pIter->iLeafPgno
b9c0: 3c 3d 70 53 65 67 2d 3e 70 67 6e 6f 4c 61 73 74  <=pSeg->pgnoLast
b9d0: 20 29 7b 0a 20 20 20 20 70 49 74 65 72 2d 3e 70   ){.    pIter->p
b9e0: 4c 65 61 66 20 3d 20 66 74 73 35 44 61 74 61 52  Leaf = fts5DataR
b9f0: 65 61 64 28 70 2c 20 0a 20 20 20 20 20 20 20 20  ead(p, .        
ba00: 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f 52 4f 57  FTS5_SEGMENT_ROW
ba10: 49 44 28 70 53 65 67 2d 3e 69 53 65 67 69 64 2c  ID(pSeg->iSegid,
ba20: 20 30 2c 20 70 49 74 65 72 2d 3e 69 4c 65 61 66   0, pIter->iLeaf
ba30: 50 67 6e 6f 29 0a 20 20 20 20 29 3b 0a 20 20 7d  Pgno).    );.  }
ba40: 65 6c 73 65 7b 0a 20 20 20 20 70 49 74 65 72 2d  else{.    pIter-
ba50: 3e 70 4c 65 61 66 20 3d 20 30 3b 0a 20 20 7d 0a  >pLeaf = 0;.  }.
ba60: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e  }../*.** Argumen
ba70: 74 20 70 20 70 6f 69 6e 74 73 20 74 6f 20 61 20  t p points to a 
ba80: 62 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e  buffer containin
ba90: 67 20 61 20 76 61 72 69 6e 74 20 74 6f 20 62 65  g a varint to be
baa0: 20 69 6e 74 65 72 70 72 65 74 65 64 20 61 73 20   interpreted as 
bab0: 61 0a 2a 2a 20 70 6f 73 69 74 69 6f 6e 20 6c 69  a.** position li
bac0: 73 74 20 73 69 7a 65 20 66 69 65 6c 64 2e 20 52  st size field. R
bad0: 65 61 64 20 74 68 65 20 76 61 72 69 6e 74 20 61  ead the varint a
bae0: 6e 64 20 72 65 74 75 72 6e 20 74 68 65 20 6e 75  nd return the nu
baf0: 6d 62 65 72 20 6f 66 20 62 79 74 65 73 0a 2a 2a  mber of bytes.**
bb00: 20 72 65 61 64 2e 20 42 65 66 6f 72 65 20 72 65   read. Before re
bb10: 74 75 72 6e 69 6e 67 2c 20 73 65 74 20 2a 70 6e  turning, set *pn
bb20: 53 7a 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72  Sz to the number
bb30: 20 6f 66 20 62 79 74 65 73 20 69 6e 20 74 68 65   of bytes in the
bb40: 20 70 6f 73 69 74 69 6f 6e 0a 2a 2a 20 6c 69 73   position.** lis
bb50: 74 2c 20 61 6e 64 20 2a 70 62 44 65 6c 20 74 6f  t, and *pbDel to
bb60: 20 74 72 75 65 20 69 66 20 74 68 65 20 64 65 6c   true if the del
bb70: 65 74 65 20 66 6c 61 67 20 69 73 20 73 65 74 2c  ete flag is set,
bb80: 20 6f 72 20 66 61 6c 73 65 20 6f 74 68 65 72 77   or false otherw
bb90: 69 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ise..*/.static i
bba0: 6e 74 20 66 74 73 35 47 65 74 50 6f 73 6c 69 73  nt fts5GetPoslis
bbb0: 74 53 69 7a 65 28 63 6f 6e 73 74 20 75 38 20 2a  tSize(const u8 *
bbc0: 70 2c 20 69 6e 74 20 2a 70 6e 53 7a 2c 20 69 6e  p, int *pnSz, in
bbd0: 74 20 2a 70 62 44 65 6c 29 7b 0a 20 20 69 6e 74  t *pbDel){.  int
bbe0: 20 6e 53 7a 3b 0a 20 20 69 6e 74 20 6e 20 3d 20   nSz;.  int n = 
bbf0: 66 74 73 35 47 65 74 56 61 72 69 6e 74 33 32 28  fts5GetVarint32(
bc00: 70 2c 20 6e 53 7a 29 3b 0a 20 20 61 73 73 65 72  p, nSz);.  asser
bc10: 74 5f 6e 63 28 20 6e 53 7a 3e 3d 30 20 29 3b 0a  t_nc( nSz>=0 );.
bc20: 20 20 2a 70 6e 53 7a 20 3d 20 6e 53 7a 2f 32 3b    *pnSz = nSz/2;
bc30: 0a 20 20 2a 70 62 44 65 6c 20 3d 20 6e 53 7a 20  .  *pbDel = nSz 
bc40: 26 20 30 78 30 30 30 31 3b 0a 20 20 72 65 74 75  & 0x0001;.  retu
bc50: 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46  rn n;.}../*.** F
bc60: 74 73 35 53 65 67 49 74 65 72 2e 69 4c 65 61 66  ts5SegIter.iLeaf
bc70: 4f 66 66 73 65 74 20 63 75 72 72 65 6e 74 6c 79  Offset currently
bc80: 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 66   points to the f
bc90: 69 72 73 74 20 62 79 74 65 20 6f 66 20 61 0a 2a  irst byte of a.*
bca0: 2a 20 70 6f 73 69 74 69 6f 6e 2d 6c 69 73 74 20  * position-list 
bcb0: 73 69 7a 65 20 66 69 65 6c 64 2e 20 52 65 61 64  size field. Read
bcc0: 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68   the value of th
bcd0: 65 20 66 69 65 6c 64 20 61 6e 64 20 73 74 6f 72  e field and stor
bce0: 65 20 69 74 0a 2a 2a 20 69 6e 20 74 68 65 20 66  e it.** in the f
bcf0: 6f 6c 6c 6f 77 69 6e 67 20 76 61 72 69 61 62 6c  ollowing variabl
bd00: 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 46 74 73 35  es:.**.**   Fts5
bd10: 53 65 67 49 74 65 72 2e 6e 50 6f 73 0a 2a 2a 20  SegIter.nPos.** 
bd20: 20 20 46 74 73 35 53 65 67 49 74 65 72 2e 62 44    Fts5SegIter.bD
bd30: 65 6c 0a 2a 2a 0a 2a 2a 20 4c 65 61 76 65 20 46  el.**.** Leave F
bd40: 74 73 35 53 65 67 49 74 65 72 2e 69 4c 65 61 66  ts5SegIter.iLeaf
bd50: 4f 66 66 73 65 74 20 70 6f 69 6e 74 69 6e 67 20  Offset pointing 
bd60: 74 6f 20 74 68 65 20 66 69 72 73 74 20 62 79 74  to the first byt
bd70: 65 20 6f 66 20 74 68 65 20 0a 2a 2a 20 70 6f 73  e of the .** pos
bd80: 69 74 69 6f 6e 20 6c 69 73 74 20 63 6f 6e 74 65  ition list conte
bd90: 6e 74 20 28 69 66 20 61 6e 79 29 2e 0a 2a 2f 0a  nt (if any)..*/.
bda0: 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
bdb0: 53 65 67 49 74 65 72 4c 6f 61 64 4e 50 6f 73 28  SegIterLoadNPos(
bdc0: 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 46 74  Fts5Index *p, Ft
bdd0: 73 35 53 65 67 49 74 65 72 20 2a 70 49 74 65 72  s5SegIter *pIter
bde0: 29 7b 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d  ){.  if( p->rc==
bdf0: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
be00: 20 69 6e 74 20 69 4f 66 66 20 3d 20 70 49 74 65   int iOff = pIte
be10: 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 3b 20  r->iLeafOffset; 
be20: 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 72 65   /* Offset to re
be30: 61 64 20 61 74 20 2a 2f 0a 20 20 20 20 41 53 53  ad at */.    ASS
be40: 45 52 54 5f 53 5a 4c 45 41 46 5f 4f 4b 28 70 49  ERT_SZLEAF_OK(pI
be50: 74 65 72 2d 3e 70 4c 65 61 66 29 3b 0a 20 20 20  ter->pLeaf);.   
be60: 20 69 66 28 20 69 4f 66 66 3e 3d 70 49 74 65 72   if( iOff>=pIter
be70: 2d 3e 70 4c 65 61 66 2d 3e 73 7a 4c 65 61 66 20  ->pLeaf->szLeaf 
be80: 29 7b 0a 20 20 20 20 20 20 70 2d 3e 72 63 20 3d  ){.      p->rc =
be90: 20 46 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20   FTS5_CORRUPT;. 
bea0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
beb0: 63 6f 6e 73 74 20 75 38 20 2a 61 20 3d 20 26 70  const u8 *a = &p
bec0: 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 70 5b 69  Iter->pLeaf->p[i
bed0: 4f 66 66 5d 3b 0a 20 20 20 20 20 20 70 49 74 65  Off];.      pIte
bee0: 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 20 2b  r->iLeafOffset +
bef0: 3d 20 66 74 73 35 47 65 74 50 6f 73 6c 69 73 74  = fts5GetPoslist
bf00: 53 69 7a 65 28 61 2c 20 26 70 49 74 65 72 2d 3e  Size(a, &pIter->
bf10: 6e 50 6f 73 2c 20 26 70 49 74 65 72 2d 3e 62 44  nPos, &pIter->bD
bf20: 65 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  el);.    }.  }.}
bf30: 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  ..static void ft
bf40: 73 35 53 65 67 49 74 65 72 4c 6f 61 64 52 6f 77  s5SegIterLoadRow
bf50: 69 64 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c  id(Fts5Index *p,
bf60: 20 46 74 73 35 53 65 67 49 74 65 72 20 2a 70 49   Fts5SegIter *pI
bf70: 74 65 72 29 7b 0a 20 20 75 38 20 2a 61 20 3d 20  ter){.  u8 *a = 
bf80: 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 70 3b  pIter->pLeaf->p;
bf90: 20 20 20 20 20 20 20 20 2f 2a 20 42 75 66 66 65          /* Buffe
bfa0: 72 20 74 6f 20 72 65 61 64 20 64 61 74 61 20 66  r to read data f
bfb0: 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20 69 4f 66  rom */.  int iOf
bfc0: 66 20 3d 20 70 49 74 65 72 2d 3e 69 4c 65 61 66  f = pIter->iLeaf
bfd0: 4f 66 66 73 65 74 3b 0a 0a 20 20 41 53 53 45 52  Offset;..  ASSER
bfe0: 54 5f 53 5a 4c 45 41 46 5f 4f 4b 28 70 49 74 65  T_SZLEAF_OK(pIte
bff0: 72 2d 3e 70 4c 65 61 66 29 3b 0a 20 20 69 66 28  r->pLeaf);.  if(
c000: 20 69 4f 66 66 3e 3d 70 49 74 65 72 2d 3e 70 4c   iOff>=pIter->pL
c010: 65 61 66 2d 3e 73 7a 4c 65 61 66 20 29 7b 0a 20  eaf->szLeaf ){. 
c020: 20 20 20 66 74 73 35 53 65 67 49 74 65 72 4e 65     fts5SegIterNe
c030: 78 74 50 61 67 65 28 70 2c 20 70 49 74 65 72 29  xtPage(p, pIter)
c040: 3b 0a 20 20 20 20 69 66 28 20 70 49 74 65 72 2d  ;.    if( pIter-
c050: 3e 70 4c 65 61 66 3d 3d 30 20 29 7b 0a 20 20 20  >pLeaf==0 ){.   
c060: 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51     if( p->rc==SQ
c070: 4c 49 54 45 5f 4f 4b 20 29 20 70 2d 3e 72 63 20  LITE_OK ) p->rc 
c080: 3d 20 46 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a  = FTS5_CORRUPT;.
c090: 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20        return;.  
c0a0: 20 20 7d 0a 20 20 20 20 69 4f 66 66 20 3d 20 34    }.    iOff = 4
c0b0: 3b 0a 20 20 20 20 61 20 3d 20 70 49 74 65 72 2d  ;.    a = pIter-
c0c0: 3e 70 4c 65 61 66 2d 3e 70 3b 0a 20 20 7d 0a 20  >pLeaf->p;.  }. 
c0d0: 20 69 4f 66 66 20 2b 3d 20 73 71 6c 69 74 65 33   iOff += sqlite3
c0e0: 46 74 73 35 47 65 74 56 61 72 69 6e 74 28 26 61  Fts5GetVarint(&a
c0f0: 5b 69 4f 66 66 5d 2c 20 28 75 36 34 2a 29 26 70  [iOff], (u64*)&p
c100: 49 74 65 72 2d 3e 69 52 6f 77 69 64 29 3b 0a 20  Iter->iRowid);. 
c110: 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66   pIter->iLeafOff
c120: 73 65 74 20 3d 20 69 4f 66 66 3b 0a 7d 0a 0a 2f  set = iOff;.}../
c130: 2a 0a 2a 2a 20 46 74 73 35 53 65 67 49 74 65 72  *.** Fts5SegIter
c140: 2e 69 4c 65 61 66 4f 66 66 73 65 74 20 63 75 72  .iLeafOffset cur
c150: 72 65 6e 74 6c 79 20 70 6f 69 6e 74 73 20 74 6f  rently points to
c160: 20 74 68 65 20 66 69 72 73 74 20 62 79 74 65 20   the first byte 
c170: 6f 66 20 74 68 65 20 0a 2a 2a 20 22 6e 53 75 66  of the .** "nSuf
c180: 66 69 78 22 20 66 69 65 6c 64 20 6f 66 20 61 20  fix" field of a 
c190: 74 65 72 6d 2e 20 46 75 6e 63 74 69 6f 6e 20 70  term. Function p
c1a0: 61 72 61 6d 65 74 65 72 20 6e 4b 65 65 70 20 63  arameter nKeep c
c1b0: 6f 6e 74 61 69 6e 73 20 74 68 65 20 76 61 6c 75  ontains the valu
c1c0: 65 0a 2a 2a 20 6f 66 20 74 68 65 20 22 6e 50 72  e.** of the "nPr
c1d0: 65 66 69 78 22 20 66 69 65 6c 64 20 28 69 66 20  efix" field (if 
c1e0: 74 68 65 72 65 20 77 61 73 20 6f 6e 65 20 2d 20  there was one - 
c1f0: 69 74 20 69 73 20 70 61 73 73 65 64 20 30 20 69  it is passed 0 i
c200: 66 20 74 68 69 73 20 69 73 0a 2a 2a 20 74 68 65  f this is.** the
c210: 20 66 69 72 73 74 20 74 65 72 6d 20 69 6e 20 74   first term in t
c220: 68 65 20 73 65 67 6d 65 6e 74 29 2e 0a 2a 2a 0a  he segment)..**.
c230: 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
c240: 20 70 6f 70 75 6c 61 74 65 73 3a 0a 2a 2a 0a 2a   populates:.**.*
c250: 2a 20 20 20 46 74 73 35 53 65 67 49 74 65 72 2e  *   Fts5SegIter.
c260: 74 65 72 6d 0a 2a 2a 20 20 20 46 74 73 35 53 65  term.**   Fts5Se
c270: 67 49 74 65 72 2e 72 6f 77 69 64 0a 2a 2a 0a 2a  gIter.rowid.**.*
c280: 2a 20 61 63 63 6f 72 64 69 6e 67 6c 79 20 61 6e  * accordingly an
c290: 64 20 6c 65 61 76 65 73 20 28 46 74 73 35 53 65  d leaves (Fts5Se
c2a0: 67 49 74 65 72 2e 69 4c 65 61 66 4f 66 66 73 65  gIter.iLeafOffse
c2b0: 74 29 20 73 65 74 20 74 6f 20 74 68 65 20 63 6f  t) set to the co
c2c0: 6e 74 65 6e 74 20 6f 66 0a 2a 2a 20 74 68 65 20  ntent of.** the 
c2d0: 66 69 72 73 74 20 70 6f 73 69 74 69 6f 6e 20 6c  first position l
c2e0: 69 73 74 2e 20 54 68 65 20 70 6f 73 69 74 69 6f  ist. The positio
c2f0: 6e 20 6c 69 73 74 20 62 65 6c 6f 6e 67 69 6e 67  n list belonging
c300: 20 74 6f 20 64 6f 63 75 6d 65 6e 74 20 0a 2a 2a   to document .**
c310: 20 28 46 74 73 35 53 65 67 49 74 65 72 2e 69 52   (Fts5SegIter.iR
c320: 6f 77 69 64 29 2e 0a 2a 2f 0a 73 74 61 74 69 63  owid)..*/.static
c330: 20 76 6f 69 64 20 66 74 73 35 53 65 67 49 74 65   void fts5SegIte
c340: 72 4c 6f 61 64 54 65 72 6d 28 46 74 73 35 49 6e  rLoadTerm(Fts5In
c350: 64 65 78 20 2a 70 2c 20 46 74 73 35 53 65 67 49  dex *p, Fts5SegI
c360: 74 65 72 20 2a 70 49 74 65 72 2c 20 69 6e 74 20  ter *pIter, int 
c370: 6e 4b 65 65 70 29 7b 0a 20 20 75 38 20 2a 61 20  nKeep){.  u8 *a 
c380: 3d 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e  = pIter->pLeaf->
c390: 70 3b 20 20 20 20 20 20 20 20 2f 2a 20 42 75 66  p;        /* Buf
c3a0: 66 65 72 20 74 6f 20 72 65 61 64 20 64 61 74 61  fer to read data
c3b0: 20 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20 69   from */.  int i
c3c0: 4f 66 66 20 3d 20 70 49 74 65 72 2d 3e 69 4c 65  Off = pIter->iLe
c3d0: 61 66 4f 66 66 73 65 74 3b 20 20 2f 2a 20 4f 66  afOffset;  /* Of
c3e0: 66 73 65 74 20 74 6f 20 72 65 61 64 20 61 74 20  fset to read at 
c3f0: 2a 2f 0a 20 20 69 6e 74 20 6e 4e 65 77 3b 20 20  */.  int nNew;  
c400: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c410: 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20 6f 66       /* Bytes of
c420: 20 6e 65 77 20 64 61 74 61 20 2a 2f 0a 0a 20 20   new data */..  
c430: 69 4f 66 66 20 2b 3d 20 66 74 73 35 47 65 74 56  iOff += fts5GetV
c440: 61 72 69 6e 74 33 32 28 26 61 5b 69 4f 66 66 5d  arint32(&a[iOff]
c450: 2c 20 6e 4e 65 77 29 3b 0a 20 20 70 49 74 65 72  , nNew);.  pIter
c460: 2d 3e 74 65 72 6d 2e 6e 20 3d 20 6e 4b 65 65 70  ->term.n = nKeep
c470: 3b 0a 20 20 66 74 73 35 42 75 66 66 65 72 41 70  ;.  fts5BufferAp
c480: 70 65 6e 64 42 6c 6f 62 28 26 70 2d 3e 72 63 2c  pendBlob(&p->rc,
c490: 20 26 70 49 74 65 72 2d 3e 74 65 72 6d 2c 20 6e   &pIter->term, n
c4a0: 4e 65 77 2c 20 26 61 5b 69 4f 66 66 5d 29 3b 0a  New, &a[iOff]);.
c4b0: 20 20 69 4f 66 66 20 2b 3d 20 6e 4e 65 77 3b 0a    iOff += nNew;.
c4c0: 20 20 70 49 74 65 72 2d 3e 69 54 65 72 6d 4c 65    pIter->iTermLe
c4d0: 61 66 4f 66 66 73 65 74 20 3d 20 69 4f 66 66 3b  afOffset = iOff;
c4e0: 0a 20 20 70 49 74 65 72 2d 3e 69 54 65 72 6d 4c  .  pIter->iTermL
c4f0: 65 61 66 50 67 6e 6f 20 3d 20 70 49 74 65 72 2d  eafPgno = pIter-
c500: 3e 69 4c 65 61 66 50 67 6e 6f 3b 0a 20 20 70 49  >iLeafPgno;.  pI
c510: 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74  ter->iLeafOffset
c520: 20 3d 20 69 4f 66 66 3b 0a 0a 20 20 66 74 73 35   = iOff;..  fts5
c530: 53 65 67 49 74 65 72 4c 6f 61 64 52 6f 77 69 64  SegIterLoadRowid
c540: 28 70 2c 20 70 49 74 65 72 29 3b 0a 7d 0a 0a 2f  (p, pIter);.}../
c550: 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20  *.** Initialize 
c560: 74 68 65 20 69 74 65 72 61 74 6f 72 20 6f 62 6a  the iterator obj
c570: 65 63 74 20 70 49 74 65 72 20 74 6f 20 69 74 65  ect pIter to ite
c580: 72 61 74 65 20 74 68 72 6f 75 67 68 20 74 68 65  rate through the
c590: 20 65 6e 74 72 69 65 73 20 69 6e 0a 2a 2a 20 73   entries in.** s
c5a0: 65 67 6d 65 6e 74 20 70 53 65 67 2e 20 54 68 65  egment pSeg. The
c5b0: 20 69 74 65 72 61 74 6f 72 20 69 73 20 6c 65 66   iterator is lef
c5c0: 74 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68  t pointing to th
c5d0: 65 20 66 69 72 73 74 20 65 6e 74 72 79 20 77 68  e first entry wh
c5e0: 65 6e 20 0a 2a 2a 20 74 68 69 73 20 66 75 6e 63  en .** this func
c5f0: 74 69 6f 6e 20 72 65 74 75 72 6e 73 2e 0a 2a 2a  tion returns..**
c600: 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20  .** If an error 
c610: 6f 63 63 75 72 73 2c 20 46 74 73 35 49 6e 64 65  occurs, Fts5Inde
c620: 78 2e 72 63 20 69 73 20 73 65 74 20 74 6f 20 61  x.rc is set to a
c630: 6e 20 61 70 70 72 6f 70 72 69 61 74 65 20 65 72  n appropriate er
c640: 72 6f 72 20 63 6f 64 65 2e 20 49 66 20 0a 2a 2a  ror code. If .**
c650: 20 61 6e 20 65 72 72 6f 72 20 68 61 73 20 61 6c   an error has al
c660: 72 65 61 64 79 20 6f 63 63 75 72 72 65 64 20 77  ready occurred w
c670: 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hen this functio
c680: 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20 69 74 20  n is called, it 
c690: 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73  is a no-op..*/.s
c6a0: 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 53  tatic void fts5S
c6b0: 65 67 49 74 65 72 49 6e 69 74 28 0a 20 20 46 74  egIterInit(.  Ft
c6c0: 73 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20  s5Index *p,     
c6d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
c6e0: 20 46 54 53 20 69 6e 64 65 78 20 6f 62 6a 65 63   FTS index objec
c6f0: 74 20 2a 2f 0a 20 20 46 74 73 35 53 74 72 75 63  t */.  Fts5Struc
c700: 74 75 72 65 53 65 67 6d 65 6e 74 20 2a 70 53 65  tureSegment *pSe
c710: 67 2c 20 20 20 20 20 2f 2a 20 44 65 73 63 72 69  g,     /* Descri
c720: 70 74 69 6f 6e 20 6f 66 20 73 65 67 6d 65 6e 74  ption of segment
c730: 20 2a 2f 0a 20 20 46 74 73 35 53 65 67 49 74 65   */.  Fts5SegIte
c740: 72 20 2a 70 49 74 65 72 20 20 20 20 20 20 20 20  r *pIter        
c750: 20 20 20 20 20 20 2f 2a 20 4f 62 6a 65 63 74 20        /* Object 
c760: 74 6f 20 70 6f 70 75 6c 61 74 65 20 2a 2f 0a 29  to populate */.)
c770: 7b 0a 20 20 69 66 28 20 70 53 65 67 2d 3e 70 67  {.  if( pSeg->pg
c780: 6e 6f 46 69 72 73 74 3d 3d 30 20 29 7b 0a 20 20  noFirst==0 ){.  
c790: 20 20 2f 2a 20 54 68 69 73 20 68 61 70 70 65 6e    /* This happen
c7a0: 73 20 69 66 20 74 68 65 20 73 65 67 6d 65 6e 74  s if the segment
c7b0: 20 69 73 20 62 65 69 6e 67 20 75 73 65 64 20 61   is being used a
c7c0: 73 20 61 6e 20 69 6e 70 75 74 20 74 6f 20 61 6e  s an input to an
c7d0: 20 69 6e 63 72 65 6d 65 6e 74 61 6c 0a 20 20 20   incremental.   
c7e0: 20 2a 2a 20 6d 65 72 67 65 20 61 6e 64 20 61 6c   ** merge and al
c7f0: 6c 20 64 61 74 61 20 68 61 73 20 61 6c 72 65 61  l data has alrea
c800: 64 79 20 62 65 65 6e 20 22 74 72 69 6d 6d 65 64  dy been "trimmed
c810: 22 2e 20 53 65 65 20 66 75 6e 63 74 69 6f 6e 0a  ". See function.
c820: 20 20 20 20 2a 2a 20 66 74 73 35 54 72 69 6d 53      ** fts5TrimS
c830: 65 67 6d 65 6e 74 73 28 29 20 66 6f 72 20 64 65  egments() for de
c840: 74 61 69 6c 73 2e 20 49 6e 20 74 68 69 73 20 63  tails. In this c
c850: 61 73 65 20 6c 65 61 76 65 20 74 68 65 20 69 74  ase leave the it
c860: 65 72 61 74 6f 72 20 65 6d 70 74 79 2e 0a 20 20  erator empty..  
c870: 20 20 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72 20    ** The caller 
c880: 77 69 6c 6c 20 73 65 65 20 74 68 65 20 28 70 49  will see the (pI
c890: 74 65 72 2d 3e 70 4c 65 61 66 3d 3d 30 29 20 61  ter->pLeaf==0) a
c8a0: 6e 64 20 61 73 73 75 6d 65 20 74 68 65 20 69 74  nd assume the it
c8b0: 65 72 61 74 6f 72 20 69 73 0a 20 20 20 20 2a 2a  erator is.    **
c8c0: 20 61 74 20 45 4f 46 20 61 6c 72 65 61 64 79 2e   at EOF already.
c8d0: 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
c8e0: 70 49 74 65 72 2d 3e 70 4c 65 61 66 3d 3d 30 20  pIter->pLeaf==0 
c8f0: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  );.    return;. 
c900: 20 7d 0a 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d   }..  if( p->rc=
c910: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
c920: 20 20 6d 65 6d 73 65 74 28 70 49 74 65 72 2c 20    memset(pIter, 
c930: 30 2c 20 73 69 7a 65 6f 66 28 2a 70 49 74 65 72  0, sizeof(*pIter
c940: 29 29 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 70  ));.    pIter->p
c950: 53 65 67 20 3d 20 70 53 65 67 3b 0a 20 20 20 20  Seg = pSeg;.    
c960: 70 49 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f  pIter->iLeafPgno
c970: 20 3d 20 70 53 65 67 2d 3e 70 67 6e 6f 46 69 72   = pSeg->pgnoFir
c980: 73 74 2d 31 3b 0a 20 20 20 20 66 74 73 35 53 65  st-1;.    fts5Se
c990: 67 49 74 65 72 4e 65 78 74 50 61 67 65 28 70 2c  gIterNextPage(p,
c9a0: 20 70 49 74 65 72 29 3b 0a 20 20 7d 0a 0a 20 20   pIter);.  }..  
c9b0: 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  if( p->rc==SQLIT
c9c0: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 75 38 20 2a  E_OK ){.    u8 *
c9d0: 61 20 3d 20 70 49 74 65 72 2d 3e 70 4c 65 61 66  a = pIter->pLeaf
c9e0: 2d 3e 70 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e  ->p;.    pIter->
c9f0: 69 4c 65 61 66 4f 66 66 73 65 74 20 3d 20 34 3b  iLeafOffset = 4;
ca00: 0a 20 20 20 20 61 73 73 65 72 74 28 20 66 74 73  .    assert( fts
ca10: 35 4c 65 61 66 46 69 72 73 74 54 65 72 6d 4f 66  5LeafFirstTermOf
ca20: 66 28 70 49 74 65 72 2d 3e 70 4c 65 61 66 29 3d  f(pIter->pLeaf)=
ca30: 3d 34 20 29 3b 0a 20 20 20 20 66 74 73 35 53 65  =4 );.    fts5Se
ca40: 67 49 74 65 72 4c 6f 61 64 54 65 72 6d 28 70 2c  gIterLoadTerm(p,
ca50: 20 70 49 74 65 72 2c 20 30 29 3b 0a 20 20 20 20   pIter, 0);.    
ca60: 66 74 73 35 53 65 67 49 74 65 72 4c 6f 61 64 4e  fts5SegIterLoadN
ca70: 50 6f 73 28 70 2c 20 70 49 74 65 72 29 3b 0a 20  Pos(p, pIter);. 
ca80: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73   }.}../*.** This
ca90: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 6f 6e 6c   function is onl
caa0: 79 20 65 76 65 72 20 63 61 6c 6c 65 64 20 6f 6e  y ever called on
cab0: 20 69 74 65 72 61 74 6f 72 73 20 63 72 65 61 74   iterators creat
cac0: 65 64 20 62 79 20 63 61 6c 6c 73 20 74 6f 0a 2a  ed by calls to.*
cad0: 2a 20 46 74 73 35 49 6e 64 65 78 51 75 65 72 79  * Fts5IndexQuery
cae0: 28 29 20 77 69 74 68 20 74 68 65 20 46 54 53 35  () with the FTS5
caf0: 49 4e 44 45 58 5f 51 55 45 52 59 5f 44 45 53 43  INDEX_QUERY_DESC
cb00: 20 66 6c 61 67 20 73 65 74 2e 0a 2a 2a 0a 2a 2a   flag set..**.**
cb10: 20 54 68 65 20 69 74 65 72 61 74 6f 72 20 69 73   The iterator is
cb20: 20 69 6e 20 61 6e 20 75 6e 75 73 75 61 6c 20 73   in an unusual s
cb30: 74 61 74 65 20 77 68 65 6e 20 74 68 69 73 20 66  tate when this f
cb40: 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
cb50: 64 3a 20 74 68 65 0a 2a 2a 20 46 74 73 35 53 65  d: the.** Fts5Se
cb60: 67 49 74 65 72 2e 69 4c 65 61 66 4f 66 66 73 65  gIter.iLeafOffse
cb70: 74 20 76 61 72 69 61 62 6c 65 20 69 73 20 73 65  t variable is se
cb80: 74 20 74 6f 20 74 68 65 20 6f 66 66 73 65 74 20  t to the offset 
cb90: 6f 66 20 74 68 65 20 73 74 61 72 74 20 6f 66 0a  of the start of.
cba0: 2a 2a 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 2d  ** the position-
cbb0: 6c 69 73 74 20 73 69 7a 65 20 66 69 65 6c 64 20  list size field 
cbc0: 66 6f 72 20 74 68 65 20 66 69 72 73 74 20 72 65  for the first re
cbd0: 6c 65 76 61 6e 74 20 72 6f 77 69 64 20 6f 6e 20  levant rowid on 
cbe0: 74 68 65 20 70 61 67 65 2e 0a 2a 2a 20 46 74 73  the page..** Fts
cbf0: 35 53 65 67 49 74 65 72 2e 72 6f 77 69 64 20 69  5SegIter.rowid i
cc00: 73 20 73 65 74 2c 20 62 75 74 20 6e 50 6f 73 20  s set, but nPos 
cc10: 61 6e 64 20 62 44 65 6c 20 61 72 65 20 6e 6f 74  and bDel are not
cc20: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ..**.** This fun
cc30: 63 74 69 6f 6e 20 61 64 76 61 6e 63 65 73 20 74  ction advances t
cc40: 68 65 20 69 74 65 72 61 74 6f 72 20 73 6f 20 74  he iterator so t
cc50: 68 61 74 20 69 74 20 70 6f 69 6e 74 73 20 74 6f  hat it points to
cc60: 20 74 68 65 20 6c 61 73 74 20 0a 2a 2a 20 72 65   the last .** re
cc70: 6c 65 76 61 6e 74 20 72 6f 77 69 64 20 6f 6e 20  levant rowid on 
cc80: 74 68 65 20 70 61 67 65 20 61 6e 64 2c 20 69 66  the page and, if
cc90: 20 6e 65 63 65 73 73 61 72 79 2c 20 69 6e 69 74   necessary, init
cca0: 69 61 6c 69 7a 65 73 20 74 68 65 20 0a 2a 2a 20  ializes the .** 
ccb0: 61 52 6f 77 69 64 4f 66 66 73 65 74 5b 5d 20 61  aRowidOffset[] a
ccc0: 6e 64 20 69 52 6f 77 69 64 4f 66 66 73 65 74 20  nd iRowidOffset 
ccd0: 76 61 72 69 61 62 6c 65 73 2e 20 41 74 20 74 68  variables. At th
cce0: 69 73 20 70 6f 69 6e 74 20 74 68 65 20 69 74 65  is point the ite
ccf0: 72 61 74 6f 72 0a 2a 2a 20 69 73 20 69 6e 20 69  rator.** is in i
cd00: 74 73 20 72 65 67 75 6c 61 72 20 73 74 61 74 65  ts regular state
cd10: 20 2d 20 46 74 73 35 53 65 67 49 74 65 72 2e 69   - Fts5SegIter.i
cd20: 4c 65 61 66 4f 66 66 73 65 74 20 70 6f 69 6e 74  LeafOffset point
cd30: 73 20 74 6f 20 74 68 65 20 66 69 72 73 74 0a 2a  s to the first.*
cd40: 2a 20 62 79 74 65 20 6f 66 20 74 68 65 20 70 6f  * byte of the po
cd50: 73 69 74 69 6f 6e 20 6c 69 73 74 20 63 6f 6e 74  sition list cont
cd60: 65 6e 74 20 61 73 73 6f 63 69 61 74 65 64 20 77  ent associated w
cd70: 69 74 68 20 73 61 69 64 20 72 6f 77 69 64 2e 0a  ith said rowid..
cd80: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
cd90: 74 73 35 53 65 67 49 74 65 72 52 65 76 65 72 73  ts5SegIterRevers
cda0: 65 49 6e 69 74 50 61 67 65 28 46 74 73 35 49 6e  eInitPage(Fts5In
cdb0: 64 65 78 20 2a 70 2c 20 46 74 73 35 53 65 67 49  dex *p, Fts5SegI
cdc0: 74 65 72 20 2a 70 49 74 65 72 29 7b 0a 20 20 69  ter *pIter){.  i
cdd0: 6e 74 20 6e 20 3d 20 70 49 74 65 72 2d 3e 70 4c  nt n = pIter->pL
cde0: 65 61 66 2d 3e 73 7a 4c 65 61 66 3b 0a 20 20 69  eaf->szLeaf;.  i
cdf0: 6e 74 20 69 20 3d 20 70 49 74 65 72 2d 3e 69 4c  nt i = pIter->iL
ce00: 65 61 66 4f 66 66 73 65 74 3b 0a 20 20 75 38 20  eafOffset;.  u8 
ce10: 2a 61 20 3d 20 70 49 74 65 72 2d 3e 70 4c 65 61  *a = pIter->pLea
ce20: 66 2d 3e 70 3b 0a 20 20 69 6e 74 20 69 52 6f 77  f->p;.  int iRow
ce30: 69 64 4f 66 66 73 65 74 20 3d 20 30 3b 0a 0a 20  idOffset = 0;.. 
ce40: 20 41 53 53 45 52 54 5f 53 5a 4c 45 41 46 5f 4f   ASSERT_SZLEAF_O
ce50: 4b 28 70 49 74 65 72 2d 3e 70 4c 65 61 66 29 3b  K(pIter->pLeaf);
ce60: 0a 20 20 77 68 69 6c 65 28 20 31 20 29 7b 0a 20  .  while( 1 ){. 
ce70: 20 20 20 69 36 34 20 69 44 65 6c 74 61 20 3d 20     i64 iDelta = 
ce80: 30 3b 0a 20 20 20 20 69 6e 74 20 6e 50 6f 73 3b  0;.    int nPos;
ce90: 0a 20 20 20 20 69 6e 74 20 62 44 75 6d 6d 79 3b  .    int bDummy;
cea0: 0a 0a 20 20 20 20 69 20 2b 3d 20 66 74 73 35 47  ..    i += fts5G
ceb0: 65 74 50 6f 73 6c 69 73 74 53 69 7a 65 28 26 61  etPoslistSize(&a
cec0: 5b 69 5d 2c 20 26 6e 50 6f 73 2c 20 26 62 44 75  [i], &nPos, &bDu
ced0: 6d 6d 79 29 3b 0a 20 20 20 20 69 20 2b 3d 20 6e  mmy);.    i += n
cee0: 50 6f 73 3b 0a 20 20 20 20 69 66 28 20 69 3e 3d  Pos;.    if( i>=
cef0: 6e 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 69  n ) break;.    i
cf00: 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e   += fts5GetVarin
cf10: 74 28 26 61 5b 69 5d 2c 20 28 75 36 34 2a 29 26  t(&a[i], (u64*)&
cf20: 69 44 65 6c 74 61 29 3b 0a 20 20 20 20 69 66 28  iDelta);.    if(
cf30: 20 69 44 65 6c 74 61 3d 3d 30 20 29 20 62 72 65   iDelta==0 ) bre
cf40: 61 6b 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 69  ak;.    pIter->i
cf50: 52 6f 77 69 64 20 2b 3d 20 69 44 65 6c 74 61 3b  Rowid += iDelta;
cf60: 0a 0a 20 20 20 20 69 66 28 20 69 52 6f 77 69 64  ..    if( iRowid
cf70: 4f 66 66 73 65 74 3e 3d 70 49 74 65 72 2d 3e 6e  Offset>=pIter->n
cf80: 52 6f 77 69 64 4f 66 66 73 65 74 20 29 7b 0a 20  RowidOffset ){. 
cf90: 20 20 20 20 20 69 6e 74 20 6e 4e 65 77 20 3d 20       int nNew = 
cfa0: 70 49 74 65 72 2d 3e 6e 52 6f 77 69 64 4f 66 66  pIter->nRowidOff
cfb0: 73 65 74 20 2b 20 38 3b 0a 20 20 20 20 20 20 69  set + 8;.      i
cfc0: 6e 74 20 2a 61 4e 65 77 20 3d 20 28 69 6e 74 2a  nt *aNew = (int*
cfd0: 29 73 71 6c 69 74 65 33 5f 72 65 61 6c 6c 6f 63  )sqlite3_realloc
cfe0: 28 70 49 74 65 72 2d 3e 61 52 6f 77 69 64 4f 66  (pIter->aRowidOf
cff0: 66 73 65 74 2c 20 6e 4e 65 77 2a 73 69 7a 65 6f  fset, nNew*sizeo
d000: 66 28 69 6e 74 29 29 3b 0a 20 20 20 20 20 20 69  f(int));.      i
d010: 66 28 20 61 4e 65 77 3d 3d 30 20 29 7b 0a 20 20  f( aNew==0 ){.  
d020: 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51        p->rc = SQ
d030: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
d040: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
d050: 20 7d 0a 20 20 20 20 20 20 70 49 74 65 72 2d 3e   }.      pIter->
d060: 61 52 6f 77 69 64 4f 66 66 73 65 74 20 3d 20 61  aRowidOffset = a
d070: 4e 65 77 3b 0a 20 20 20 20 20 20 70 49 74 65 72  New;.      pIter
d080: 2d 3e 6e 52 6f 77 69 64 4f 66 66 73 65 74 20 3d  ->nRowidOffset =
d090: 20 6e 4e 65 77 3b 0a 20 20 20 20 7d 0a 0a 20 20   nNew;.    }..  
d0a0: 20 20 70 49 74 65 72 2d 3e 61 52 6f 77 69 64 4f    pIter->aRowidO
d0b0: 66 66 73 65 74 5b 69 52 6f 77 69 64 4f 66 66 73  ffset[iRowidOffs
d0c0: 65 74 2b 2b 5d 20 3d 20 70 49 74 65 72 2d 3e 69  et++] = pIter->i
d0d0: 4c 65 61 66 4f 66 66 73 65 74 3b 0a 20 20 20 20  LeafOffset;.    
d0e0: 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73  pIter->iLeafOffs
d0f0: 65 74 20 3d 20 69 3b 0a 20 20 7d 0a 20 20 70 49  et = i;.  }.  pI
d100: 74 65 72 2d 3e 69 52 6f 77 69 64 4f 66 66 73 65  ter->iRowidOffse
d110: 74 20 3d 20 69 52 6f 77 69 64 4f 66 66 73 65 74  t = iRowidOffset
d120: 3b 0a 20 20 66 74 73 35 53 65 67 49 74 65 72 4c  ;.  fts5SegIterL
d130: 6f 61 64 4e 50 6f 73 28 70 2c 20 70 49 74 65 72  oadNPos(p, pIter
d140: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 0a 2a 2f 0a 73  );.}../*.**.*/.s
d150: 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 53  tatic void fts5S
d160: 65 67 49 74 65 72 52 65 76 65 72 73 65 4e 65 77  egIterReverseNew
d170: 50 61 67 65 28 46 74 73 35 49 6e 64 65 78 20 2a  Page(Fts5Index *
d180: 70 2c 20 46 74 73 35 53 65 67 49 74 65 72 20 2a  p, Fts5SegIter *
d190: 70 49 74 65 72 29 7b 0a 20 20 61 73 73 65 72 74  pIter){.  assert
d1a0: 28 20 70 49 74 65 72 2d 3e 66 6c 61 67 73 20 26  ( pIter->flags &
d1b0: 20 46 54 53 35 5f 53 45 47 49 54 45 52 5f 52 45   FTS5_SEGITER_RE
d1c0: 56 45 52 53 45 20 29 3b 0a 20 20 61 73 73 65 72  VERSE );.  asser
d1d0: 74 28 20 70 49 74 65 72 2d 3e 66 6c 61 67 73 20  t( pIter->flags 
d1e0: 26 20 46 54 53 35 5f 53 45 47 49 54 45 52 5f 4f  & FTS5_SEGITER_O
d1f0: 4e 45 54 45 52 4d 20 29 3b 0a 0a 20 20 66 74 73  NETERM );..  fts
d200: 35 44 61 74 61 52 65 6c 65 61 73 65 28 70 49 74  5DataRelease(pIt
d210: 65 72 2d 3e 70 4c 65 61 66 29 3b 0a 20 20 70 49  er->pLeaf);.  pI
d220: 74 65 72 2d 3e 70 4c 65 61 66 20 3d 20 30 3b 0a  ter->pLeaf = 0;.
d230: 20 20 77 68 69 6c 65 28 20 70 2d 3e 72 63 3d 3d    while( p->rc==
d240: 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 49 74  SQLITE_OK && pIt
d250: 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 3e 70 49  er->iLeafPgno>pI
d260: 74 65 72 2d 3e 69 54 65 72 6d 4c 65 61 66 50 67  ter->iTermLeafPg
d270: 6e 6f 20 29 7b 0a 20 20 20 20 46 74 73 35 44 61  no ){.    Fts5Da
d280: 74 61 20 2a 70 4e 65 77 3b 0a 20 20 20 20 70 49  ta *pNew;.    pI
d290: 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 2d 2d  ter->iLeafPgno--
d2a0: 3b 0a 20 20 20 20 70 4e 65 77 20 3d 20 66 74 73  ;.    pNew = fts
d2b0: 35 44 61 74 61 52 65 61 64 28 70 2c 20 46 54 53  5DataRead(p, FTS
d2c0: 35 5f 53 45 47 4d 45 4e 54 5f 52 4f 57 49 44 28  5_SEGMENT_ROWID(
d2d0: 0a 20 20 20 20 20 20 20 20 20 20 70 49 74 65 72  .          pIter
d2e0: 2d 3e 70 53 65 67 2d 3e 69 53 65 67 69 64 2c 20  ->pSeg->iSegid, 
d2f0: 30 2c 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 50  0, pIter->iLeafP
d300: 67 6e 6f 0a 20 20 20 20 29 29 3b 0a 20 20 20 20  gno.    ));.    
d310: 69 66 28 20 70 4e 65 77 20 29 7b 0a 20 20 20 20  if( pNew ){.    
d320: 20 20 69 66 28 20 70 49 74 65 72 2d 3e 69 4c 65    if( pIter->iLe
d330: 61 66 50 67 6e 6f 3d 3d 70 49 74 65 72 2d 3e 69  afPgno==pIter->i
d340: 54 65 72 6d 4c 65 61 66 50 67 6e 6f 20 29 7b 0a  TermLeafPgno ){.
d350: 20 20 20 20 20 20 20 20 69 66 28 20 70 49 74 65          if( pIte
d360: 72 2d 3e 69 54 65 72 6d 4c 65 61 66 4f 66 66 73  r->iTermLeafOffs
d370: 65 74 3c 70 4e 65 77 2d 3e 73 7a 4c 65 61 66 20  et<pNew->szLeaf 
d380: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 49 74  ){.          pIt
d390: 65 72 2d 3e 70 4c 65 61 66 20 3d 20 70 4e 65 77  er->pLeaf = pNew
d3a0: 3b 0a 20 20 20 20 20 20 20 20 20 20 70 49 74 65  ;.          pIte
d3b0: 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 20 3d  r->iLeafOffset =
d3c0: 20 70 49 74 65 72 2d 3e 69 54 65 72 6d 4c 65 61   pIter->iTermLea
d3d0: 66 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20 20  fOffset;.       
d3e0: 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a   }.      }else{.
d3f0: 20 20 20 20 20 20 20 20 69 6e 74 20 69 52 6f 77          int iRow
d400: 69 64 4f 66 66 2c 20 64 75 6d 6d 79 3b 0a 20 20  idOff, dummy;.  
d410: 20 20 20 20 20 20 66 74 73 35 4c 65 61 66 48 65        fts5LeafHe
d420: 61 64 65 72 28 70 4e 65 77 2c 20 26 69 52 6f 77  ader(pNew, &iRow
d430: 69 64 4f 66 66 2c 20 26 64 75 6d 6d 79 29 3b 0a  idOff, &dummy);.
d440: 20 20 20 20 20 20 20 20 69 66 28 20 69 52 6f 77          if( iRow
d450: 69 64 4f 66 66 20 29 7b 0a 20 20 20 20 20 20 20  idOff ){.       
d460: 20 20 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 20     pIter->pLeaf 
d470: 3d 20 70 4e 65 77 3b 0a 20 20 20 20 20 20 20 20  = pNew;.        
d480: 20 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66    pIter->iLeafOf
d490: 66 73 65 74 20 3d 20 69 52 6f 77 69 64 4f 66 66  fset = iRowidOff
d4a0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
d4b0: 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 70    }..      if( p
d4c0: 49 74 65 72 2d 3e 70 4c 65 61 66 20 29 7b 0a 20  Iter->pLeaf ){. 
d4d0: 20 20 20 20 20 20 20 75 38 20 2a 61 20 3d 20 26         u8 *a = &
d4e0: 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 70 5b  pIter->pLeaf->p[
d4f0: 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73  pIter->iLeafOffs
d500: 65 74 5d 3b 0a 20 20 20 20 20 20 20 20 70 49 74  et];.        pIt
d510: 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 20  er->iLeafOffset 
d520: 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e 74  += fts5GetVarint
d530: 28 61 2c 20 28 75 36 34 2a 29 26 70 49 74 65 72  (a, (u64*)&pIter
d540: 2d 3e 69 52 6f 77 69 64 29 3b 0a 20 20 20 20 20  ->iRowid);.     
d550: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
d560: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 66  }else{.        f
d570: 74 73 35 44 61 74 61 52 65 6c 65 61 73 65 28 70  ts5DataRelease(p
d580: 4e 65 77 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  New);.      }.  
d590: 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70    }.  }..  if( p
d5a0: 49 74 65 72 2d 3e 70 4c 65 61 66 20 29 7b 0a 20  Iter->pLeaf ){. 
d5b0: 20 20 20 66 74 73 35 53 65 67 49 74 65 72 52 65     fts5SegIterRe
d5c0: 76 65 72 73 65 49 6e 69 74 50 61 67 65 28 70 2c  verseInitPage(p,
d5d0: 20 70 49 74 65 72 29 3b 0a 20 20 7d 0a 7d 0a 0a   pIter);.  }.}..
d5e0: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75  /*.** Return tru
d5f0: 65 20 69 66 20 74 68 65 20 69 74 65 72 61 74 6f  e if the iterato
d600: 72 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  r passed as the 
d610: 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20  second argument 
d620: 63 75 72 72 65 6e 74 6c 79 0a 2a 2a 20 70 6f 69  currently.** poi
d630: 6e 74 73 20 74 6f 20 61 20 64 65 6c 65 74 65 20  nts to a delete 
d640: 6d 61 72 6b 65 72 2e 20 41 20 64 65 6c 65 74 65  marker. A delete
d650: 20 6d 61 72 6b 65 72 20 69 73 20 61 6e 20 65 6e   marker is an en
d660: 74 72 79 20 77 69 74 68 20 61 20 30 20 62 79 74  try with a 0 byt
d670: 65 0a 2a 2a 20 70 6f 73 69 74 69 6f 6e 2d 6c 69  e.** position-li
d680: 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  st..*/.static in
d690: 74 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 49  t fts5MultiIterI
d6a0: 73 45 6d 70 74 79 28 46 74 73 35 49 6e 64 65 78  sEmpty(Fts5Index
d6b0: 20 2a 70 2c 20 46 74 73 35 49 6e 64 65 78 49 74   *p, Fts5IndexIt
d6c0: 65 72 20 2a 70 49 74 65 72 29 7b 0a 20 20 46 74  er *pIter){.  Ft
d6d0: 73 35 53 65 67 49 74 65 72 20 2a 70 53 65 67 20  s5SegIter *pSeg 
d6e0: 3d 20 26 70 49 74 65 72 2d 3e 61 53 65 67 5b 70  = &pIter->aSeg[p
d6f0: 49 74 65 72 2d 3e 61 46 69 72 73 74 5b 31 5d 2e  Iter->aFirst[1].
d700: 69 46 69 72 73 74 5d 3b 0a 20 20 72 65 74 75 72  iFirst];.  retur
d710: 6e 20 28 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  n (p->rc==SQLITE
d720: 5f 4f 4b 20 26 26 20 70 53 65 67 2d 3e 70 4c 65  _OK && pSeg->pLe
d730: 61 66 20 26 26 20 70 53 65 67 2d 3e 6e 50 6f 73  af && pSeg->nPos
d740: 3d 3d 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  ==0);.}../*.** A
d750: 64 76 61 6e 63 65 20 69 74 65 72 61 74 6f 72 20  dvance iterator 
d760: 70 49 74 65 72 20 74 6f 20 74 68 65 20 6e 65 78  pIter to the nex
d770: 74 20 65 6e 74 72 79 2e 20 0a 2a 2a 0a 2a 2a 20  t entry. .**.** 
d780: 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
d790: 72 73 2c 20 46 74 73 35 49 6e 64 65 78 2e 72 63  rs, Fts5Index.rc
d7a0: 20 69 73 20 73 65 74 20 74 6f 20 61 6e 20 61 70   is set to an ap
d7b0: 70 72 6f 70 72 69 61 74 65 20 65 72 72 6f 72 20  propriate error 
d7c0: 63 6f 64 65 2e 20 49 74 20 0a 2a 2a 20 69 73 20  code. It .** is 
d7d0: 6e 6f 74 20 63 6f 6e 73 69 64 65 72 65 64 20 61  not considered a
d7e0: 6e 20 65 72 72 6f 72 20 69 66 20 74 68 65 20 69  n error if the i
d7f0: 74 65 72 61 74 6f 72 20 72 65 61 63 68 65 73 20  terator reaches 
d800: 45 4f 46 2e 20 49 66 20 61 6e 20 65 72 72 6f 72  EOF. If an error
d810: 20 68 61 73 20 0a 2a 2a 20 61 6c 72 65 61 64 79   has .** already
d820: 20 6f 63 63 75 72 72 65 64 20 77 68 65 6e 20 74   occurred when t
d830: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
d840: 63 61 6c 6c 65 64 2c 20 69 74 20 69 73 20 61 20  called, it is a 
d850: 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63  no-op..*/.static
d860: 20 76 6f 69 64 20 66 74 73 35 53 65 67 49 74 65   void fts5SegIte
d870: 72 4e 65 78 74 28 0a 20 20 46 74 73 35 49 6e 64  rNext(.  Fts5Ind
d880: 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  ex *p,          
d890: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53 35           /* FTS5
d8a0: 20 62 61 63 6b 65 6e 64 20 6f 62 6a 65 63 74 20   backend object 
d8b0: 2a 2f 0a 20 20 46 74 73 35 53 65 67 49 74 65 72  */.  Fts5SegIter
d8c0: 20 2a 70 49 74 65 72 2c 20 20 20 20 20 20 20 20   *pIter,        
d8d0: 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72       /* Iterator
d8e0: 20 74 6f 20 61 64 76 61 6e 63 65 20 2a 2f 0a 20   to advance */. 
d8f0: 20 69 6e 74 20 2a 70 62 4e 65 77 54 65 72 6d 20   int *pbNewTerm 
d900: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d910: 20 2f 2a 20 4f 55 54 3a 20 53 65 74 20 66 6f 72   /* OUT: Set for
d920: 20 6e 65 77 20 74 65 72 6d 20 2a 2f 0a 29 7b 0a   new term */.){.
d930: 20 20 61 73 73 65 72 74 28 20 70 62 4e 65 77 54    assert( pbNewT
d940: 65 72 6d 3d 3d 30 20 7c 7c 20 2a 70 62 4e 65 77  erm==0 || *pbNew
d950: 54 65 72 6d 3d 3d 30 20 29 3b 0a 20 20 69 66 28  Term==0 );.  if(
d960: 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
d970: 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 70 49 74  K ){.    if( pIt
d980: 65 72 2d 3e 66 6c 61 67 73 20 26 20 46 54 53 35  er->flags & FTS5
d990: 5f 53 45 47 49 54 45 52 5f 52 45 56 45 52 53 45  _SEGITER_REVERSE
d9a0: 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
d9b0: 28 20 70 49 74 65 72 2d 3e 70 4e 65 78 74 4c 65  ( pIter->pNextLe
d9c0: 61 66 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 69  af==0 );.      i
d9d0: 66 28 20 70 49 74 65 72 2d 3e 69 52 6f 77 69 64  f( pIter->iRowid
d9e0: 4f 66 66 73 65 74 3e 30 20 29 7b 0a 20 20 20 20  Offset>0 ){.    
d9f0: 20 20 20 20 75 38 20 2a 61 20 3d 20 70 49 74 65      u8 *a = pIte
da00: 72 2d 3e 70 4c 65 61 66 2d 3e 70 3b 0a 20 20 20  r->pLeaf->p;.   
da10: 20 20 20 20 20 69 6e 74 20 69 4f 66 66 3b 0a 20       int iOff;. 
da20: 20 20 20 20 20 20 20 69 6e 74 20 6e 50 6f 73 3b         int nPos;
da30: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 62 44 75  .        int bDu
da40: 6d 6d 79 3b 0a 20 20 20 20 20 20 20 20 69 36 34  mmy;.        i64
da50: 20 69 44 65 6c 74 61 3b 0a 0a 20 20 20 20 20 20   iDelta;..      
da60: 20 20 70 49 74 65 72 2d 3e 69 52 6f 77 69 64 4f    pIter->iRowidO
da70: 66 66 73 65 74 2d 2d 3b 0a 20 20 20 20 20 20 20  ffset--;.       
da80: 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66   pIter->iLeafOff
da90: 73 65 74 20 3d 20 69 4f 66 66 20 3d 20 70 49 74  set = iOff = pIt
daa0: 65 72 2d 3e 61 52 6f 77 69 64 4f 66 66 73 65 74  er->aRowidOffset
dab0: 5b 70 49 74 65 72 2d 3e 69 52 6f 77 69 64 4f 66  [pIter->iRowidOf
dac0: 66 73 65 74 5d 3b 0a 20 20 20 20 20 20 20 20 69  fset];.        i
dad0: 4f 66 66 20 2b 3d 20 66 74 73 35 47 65 74 50 6f  Off += fts5GetPo
dae0: 73 6c 69 73 74 53 69 7a 65 28 26 61 5b 69 4f 66  slistSize(&a[iOf
daf0: 66 5d 2c 20 26 6e 50 6f 73 2c 20 26 62 44 75 6d  f], &nPos, &bDum
db00: 6d 79 29 3b 0a 20 20 20 20 20 20 20 20 69 4f 66  my);.        iOf
db10: 66 20 2b 3d 20 6e 50 6f 73 3b 0a 20 20 20 20 20  f += nPos;.     
db20: 20 20 20 66 74 73 35 47 65 74 56 61 72 69 6e 74     fts5GetVarint
db30: 28 26 61 5b 69 4f 66 66 5d 2c 20 28 75 36 34 2a  (&a[iOff], (u64*
db40: 29 26 69 44 65 6c 74 61 29 3b 0a 20 20 20 20 20  )&iDelta);.     
db50: 20 20 20 70 49 74 65 72 2d 3e 69 52 6f 77 69 64     pIter->iRowid
db60: 20 2d 3d 20 69 44 65 6c 74 61 3b 0a 20 20 20 20   -= iDelta;.    
db70: 20 20 20 20 66 74 73 35 53 65 67 49 74 65 72 4c      fts5SegIterL
db80: 6f 61 64 4e 50 6f 73 28 70 2c 20 70 49 74 65 72  oadNPos(p, pIter
db90: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
dba0: 20 20 20 20 20 20 20 20 66 74 73 35 53 65 67 49          fts5SegI
dbb0: 74 65 72 52 65 76 65 72 73 65 4e 65 77 50 61 67  terReverseNewPag
dbc0: 65 28 70 2c 20 70 49 74 65 72 29 3b 0a 20 20 20  e(p, pIter);.   
dbd0: 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a     }.    }else{.
dbe0: 20 20 20 20 20 20 46 74 73 35 44 61 74 61 20 2a        Fts5Data *
dbf0: 70 4c 65 61 66 20 3d 20 70 49 74 65 72 2d 3e 70  pLeaf = pIter->p
dc00: 4c 65 61 66 3b 0a 20 20 20 20 20 20 69 6e 74 20  Leaf;.      int 
dc10: 69 4f 66 66 3b 0a 20 20 20 20 20 20 69 6e 74 20  iOff;.      int 
dc20: 62 4e 65 77 54 65 72 6d 20 3d 20 30 3b 0a 20 20  bNewTerm = 0;.  
dc30: 20 20 20 20 69 6e 74 20 6e 4b 65 65 70 20 3d 20      int nKeep = 
dc40: 30 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 53 65 61  0;..      /* Sea
dc50: 72 63 68 20 66 6f 72 20 74 68 65 20 65 6e 64 20  rch for the end 
dc60: 6f 66 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 20  of the position 
dc70: 6c 69 73 74 20 77 69 74 68 69 6e 20 74 68 65 20  list within the 
dc80: 63 75 72 72 65 6e 74 20 70 61 67 65 2e 20 2a 2f  current page. */
dc90: 0a 20 20 20 20 20 20 75 38 20 2a 61 20 3d 20 70  .      u8 *a = p
dca0: 4c 65 61 66 2d 3e 70 3b 0a 20 20 20 20 20 20 69  Leaf->p;.      i
dcb0: 6e 74 20 6e 20 3d 20 70 4c 65 61 66 2d 3e 73 7a  nt n = pLeaf->sz
dcc0: 4c 65 61 66 3b 0a 0a 20 20 20 20 20 20 41 53 53  Leaf;..      ASS
dcd0: 45 52 54 5f 53 5a 4c 45 41 46 5f 4f 4b 28 70 4c  ERT_SZLEAF_OK(pL
dce0: 65 61 66 29 3b 0a 20 20 20 20 20 20 69 4f 66 66  eaf);.      iOff
dcf0: 20 3d 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f   = pIter->iLeafO
dd00: 66 66 73 65 74 20 2b 20 70 49 74 65 72 2d 3e 6e  ffset + pIter->n
dd10: 50 6f 73 3b 0a 0a 20 20 20 20 20 20 69 66 28 20  Pos;..      if( 
dd20: 69 4f 66 66 3c 6e 20 29 7b 0a 20 20 20 20 20 20  iOff<n ){.      
dd30: 20 20 2f 2a 20 54 68 65 20 6e 65 78 74 20 65 6e    /* The next en
dd40: 74 72 79 20 69 73 20 6f 6e 20 74 68 65 20 63 75  try is on the cu
dd50: 72 72 65 6e 74 20 70 61 67 65 20 2a 2f 0a 20 20  rrent page */.  
dd60: 20 20 20 20 20 20 75 36 34 20 69 44 65 6c 74 61        u64 iDelta
dd70: 3b 0a 20 20 20 20 20 20 20 20 69 4f 66 66 20 2b  ;.        iOff +
dd80: 3d 20 73 71 6c 69 74 65 33 46 74 73 35 47 65 74  = sqlite3Fts5Get
dd90: 56 61 72 69 6e 74 28 26 61 5b 69 4f 66 66 5d 2c  Varint(&a[iOff],
dda0: 20 26 69 44 65 6c 74 61 29 3b 0a 20 20 20 20 20   &iDelta);.     
ddb0: 20 20 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f     pIter->iLeafO
ddc0: 66 66 73 65 74 20 3d 20 69 4f 66 66 3b 0a 20 20  ffset = iOff;.  
ddd0: 20 20 20 20 20 20 69 66 28 20 69 44 65 6c 74 61        if( iDelta
dde0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
ddf0: 20 62 4e 65 77 54 65 72 6d 20 3d 20 31 3b 0a 20   bNewTerm = 1;. 
de00: 20 20 20 20 20 20 20 20 20 69 66 28 20 69 4f 66           if( iOf
de10: 66 3e 3d 6e 20 29 7b 0a 20 20 20 20 20 20 20 20  f>=n ){.        
de20: 20 20 20 20 66 74 73 35 53 65 67 49 74 65 72 4e      fts5SegIterN
de30: 65 78 74 50 61 67 65 28 70 2c 20 70 49 74 65 72  extPage(p, pIter
de40: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  );.            p
de50: 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65  Iter->iLeafOffse
de60: 74 20 3d 20 34 3b 0a 20 20 20 20 20 20 20 20 20  t = 4;.         
de70: 20 7d 65 6c 73 65 20 69 66 28 20 69 4f 66 66 21   }else if( iOff!
de80: 3d 66 74 73 35 4c 65 61 66 46 69 72 73 74 54 65  =fts5LeafFirstTe
de90: 72 6d 4f 66 66 28 70 4c 65 61 66 29 20 29 7b 0a  rmOff(pLeaf) ){.
dea0: 20 20 20 20 20 20 20 20 20 20 20 20 70 49 74 65              pIte
deb0: 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 20 2b  r->iLeafOffset +
dec0: 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e 74 33  = fts5GetVarint3
ded0: 32 28 26 61 5b 69 4f 66 66 5d 2c 20 6e 4b 65 65  2(&a[iOff], nKee
dee0: 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  p);.          }.
def0: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
df00: 20 20 20 20 20 20 20 20 20 70 49 74 65 72 2d 3e           pIter->
df10: 69 52 6f 77 69 64 20 2b 3d 20 69 44 65 6c 74 61  iRowid += iDelta
df20: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
df30: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 49 74 65    }else if( pIte
df40: 72 2d 3e 70 53 65 67 3d 3d 30 20 29 7b 0a 20 20  r->pSeg==0 ){.  
df50: 20 20 20 20 20 20 63 6f 6e 73 74 20 75 38 20 2a        const u8 *
df60: 70 4c 69 73 74 20 3d 20 30 3b 0a 20 20 20 20 20  pList = 0;.     
df70: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
df80: 54 65 72 6d 20 3d 20 30 3b 0a 20 20 20 20 20 20  Term = 0;.      
df90: 20 20 69 6e 74 20 6e 4c 69 73 74 20 3d 20 30 3b    int nList = 0;
dfa0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 30 3d 3d  .        if( 0==
dfb0: 28 70 49 74 65 72 2d 3e 66 6c 61 67 73 20 26 20  (pIter->flags & 
dfc0: 46 54 53 35 5f 53 45 47 49 54 45 52 5f 4f 4e 45  FTS5_SEGITER_ONE
dfd0: 54 45 52 4d 29 20 29 7b 0a 20 20 20 20 20 20 20  TERM) ){.       
dfe0: 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 48 61     sqlite3Fts5Ha
dff0: 73 68 53 63 61 6e 4e 65 78 74 28 70 2d 3e 70 48  shScanNext(p->pH
e000: 61 73 68 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ash);.          
e010: 73 71 6c 69 74 65 33 46 74 73 35 48 61 73 68 53  sqlite3Fts5HashS
e020: 63 61 6e 45 6e 74 72 79 28 70 2d 3e 70 48 61 73  canEntry(p->pHas
e030: 68 2c 20 26 7a 54 65 72 6d 2c 20 26 70 4c 69 73  h, &zTerm, &pLis
e040: 74 2c 20 26 6e 4c 69 73 74 29 3b 0a 20 20 20 20  t, &nList);.    
e050: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
e060: 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20  ( pList==0 ){.  
e070: 20 20 20 20 20 20 20 20 66 74 73 35 44 61 74 61          fts5Data
e080: 52 65 6c 65 61 73 65 28 70 49 74 65 72 2d 3e 70  Release(pIter->p
e090: 4c 65 61 66 29 3b 0a 20 20 20 20 20 20 20 20 20  Leaf);.         
e0a0: 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 20 3d 20   pIter->pLeaf = 
e0b0: 30 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  0;.        }else
e0c0: 7b 0a 20 20 20 20 20 20 20 20 20 20 70 49 74 65  {.          pIte
e0d0: 72 2d 3e 70 4c 65 61 66 2d 3e 70 20 3d 20 28 75  r->pLeaf->p = (u
e0e0: 38 2a 29 70 4c 69 73 74 3b 0a 20 20 20 20 20 20  8*)pList;.      
e0f0: 20 20 20 20 70 49 74 65 72 2d 3e 70 4c 65 61 66      pIter->pLeaf
e100: 2d 3e 6e 6e 20 3d 20 6e 4c 69 73 74 3b 0a 20 20  ->nn = nList;.  
e110: 20 20 20 20 20 20 20 20 70 49 74 65 72 2d 3e 70          pIter->p
e120: 4c 65 61 66 2d 3e 73 7a 4c 65 61 66 20 3d 20 6e  Leaf->szLeaf = n
e130: 4c 69 73 74 3b 0a 20 20 20 20 20 20 20 20 20 20  List;.          
e140: 73 71 6c 69 74 65 33 46 74 73 35 42 75 66 66 65  sqlite3Fts5Buffe
e150: 72 53 65 74 28 26 70 2d 3e 72 63 2c 20 26 70 49  rSet(&p->rc, &pI
e160: 74 65 72 2d 3e 74 65 72 6d 2c 20 73 74 72 6c 65  ter->term, strle
e170: 6e 28 7a 54 65 72 6d 29 2c 20 28 75 38 2a 29 7a  n(zTerm), (u8*)z
e180: 54 65 72 6d 29 3b 0a 20 20 20 20 20 20 20 20 20  Term);.         
e190: 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66   pIter->iLeafOff
e1a0: 73 65 74 20 3d 20 66 74 73 35 47 65 74 56 61 72  set = fts5GetVar
e1b0: 69 6e 74 28 70 4c 69 73 74 2c 20 28 75 36 34 2a  int(pList, (u64*
e1c0: 29 26 70 49 74 65 72 2d 3e 69 52 6f 77 69 64 29  )&pIter->iRowid)
e1d0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
e1e0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
e1f0: 20 69 4f 66 66 20 3d 20 30 3b 0a 20 20 20 20 20   iOff = 0;.     
e200: 20 20 20 2f 2a 20 4e 65 78 74 20 65 6e 74 72 79     /* Next entry
e210: 20 69 73 20 6e 6f 74 20 6f 6e 20 74 68 65 20 63   is not on the c
e220: 75 72 72 65 6e 74 20 70 61 67 65 20 2a 2f 0a 20  urrent page */. 
e230: 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 69 4f         while( iO
e240: 66 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ff==0 ){.       
e250: 20 20 20 66 74 73 35 53 65 67 49 74 65 72 4e 65     fts5SegIterNe
e260: 78 74 50 61 67 65 28 70 2c 20 70 49 74 65 72 29  xtPage(p, pIter)
e270: 3b 0a 20 20 20 20 20 20 20 20 20 20 70 4c 65 61  ;.          pLea
e280: 66 20 3d 20 70 49 74 65 72 2d 3e 70 4c 65 61 66  f = pIter->pLeaf
e290: 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
e2a0: 70 4c 65 61 66 3d 3d 30 20 29 20 62 72 65 61 6b  pLeaf==0 ) break
e2b0: 3b 0a 20 20 20 20 20 20 20 20 20 20 41 53 53 45  ;.          ASSE
e2c0: 52 54 5f 53 5a 4c 45 41 46 5f 4f 4b 28 70 4c 65  RT_SZLEAF_OK(pLe
e2d0: 61 66 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  af);.          i
e2e0: 66 28 20 28 69 4f 66 66 20 3d 20 66 74 73 35 4c  f( (iOff = fts5L
e2f0: 65 61 66 46 69 72 73 74 52 6f 77 69 64 4f 66 66  eafFirstRowidOff
e300: 28 70 4c 65 61 66 29 29 20 26 26 20 69 4f 66 66  (pLeaf)) && iOff
e310: 3c 70 4c 65 61 66 2d 3e 73 7a 4c 65 61 66 20 29  <pLeaf->szLeaf )
e320: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 4f  {.            iO
e330: 66 66 20 2b 3d 20 73 71 6c 69 74 65 33 46 74 73  ff += sqlite3Fts
e340: 35 47 65 74 56 61 72 69 6e 74 28 26 70 4c 65 61  5GetVarint(&pLea
e350: 66 2d 3e 70 5b 69 4f 66 66 5d 2c 20 28 75 36 34  f->p[iOff], (u64
e360: 2a 29 26 70 49 74 65 72 2d 3e 69 52 6f 77 69 64  *)&pIter->iRowid
e370: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  );.            p
e380: 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65  Iter->iLeafOffse
e390: 74 20 3d 20 69 4f 66 66 3b 0a 20 20 20 20 20 20  t = iOff;.      
e3a0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
e3b0: 65 6c 73 65 20 69 66 28 20 70 4c 65 61 66 2d 3e  else if( pLeaf->
e3c0: 6e 6e 3e 70 4c 65 61 66 2d 3e 73 7a 4c 65 61 66  nn>pLeaf->szLeaf
e3d0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
e3e0: 69 4f 66 66 20 3d 20 66 74 73 35 4c 65 61 66 46  iOff = fts5LeafF
e3f0: 69 72 73 74 54 65 72 6d 4f 66 66 28 70 4c 65 61  irstTermOff(pLea
e400: 66 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  f);.            
e410: 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73  pIter->iLeafOffs
e420: 65 74 20 3d 20 69 4f 66 66 3b 0a 20 20 20 20 20  et = iOff;.     
e430: 20 20 20 20 20 20 20 62 4e 65 77 54 65 72 6d 20         bNewTerm 
e440: 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  = 1;.          }
e450: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69  .          if( i
e460: 4f 66 66 3e 3d 70 4c 65 61 66 2d 3e 73 7a 4c 65  Off>=pLeaf->szLe
e470: 61 66 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  af ){.          
e480: 20 20 70 2d 3e 72 63 20 3d 20 46 54 53 35 5f 43    p->rc = FTS5_C
e490: 4f 52 52 55 50 54 3b 0a 20 20 20 20 20 20 20 20  ORRUPT;.        
e4a0: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20      return;.    
e4b0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
e4c0: 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  }.      }..     
e4d0: 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 74 68 65   /* Check if the
e4e0: 20 69 74 65 72 61 74 6f 72 20 69 73 20 6e 6f 77   iterator is now
e4f0: 20 61 74 20 45 4f 46 2e 20 49 66 20 73 6f 2c 20   at EOF. If so, 
e500: 72 65 74 75 72 6e 20 65 61 72 6c 79 2e 20 2a 2f  return early. */
e510: 0a 20 20 20 20 20 20 69 66 28 20 70 49 74 65 72  .      if( pIter
e520: 2d 3e 70 4c 65 61 66 20 29 7b 0a 20 20 20 20 20  ->pLeaf ){.     
e530: 20 20 20 69 66 28 20 62 4e 65 77 54 65 72 6d 20     if( bNewTerm 
e540: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
e550: 20 70 49 74 65 72 2d 3e 66 6c 61 67 73 20 26 20   pIter->flags & 
e560: 46 54 53 35 5f 53 45 47 49 54 45 52 5f 4f 4e 45  FTS5_SEGITER_ONE
e570: 54 45 52 4d 20 29 7b 0a 20 20 20 20 20 20 20 20  TERM ){.        
e580: 20 20 20 20 66 74 73 35 44 61 74 61 52 65 6c 65      fts5DataRele
e590: 61 73 65 28 70 49 74 65 72 2d 3e 70 4c 65 61 66  ase(pIter->pLeaf
e5a0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  );.            p
e5b0: 49 74 65 72 2d 3e 70 4c 65 61 66 20 3d 20 30 3b  Iter->pLeaf = 0;
e5c0: 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65  .          }else
e5d0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 74  {.            ft
e5e0: 73 35 53 65 67 49 74 65 72 4c 6f 61 64 54 65 72  s5SegIterLoadTer
e5f0: 6d 28 70 2c 20 70 49 74 65 72 2c 20 6e 4b 65 65  m(p, pIter, nKee
e600: 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  p);.            
e610: 66 74 73 35 53 65 67 49 74 65 72 4c 6f 61 64 4e  fts5SegIterLoadN
e620: 50 6f 73 28 70 2c 20 70 49 74 65 72 29 3b 0a 20  Pos(p, pIter);. 
e630: 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70             if( p
e640: 62 4e 65 77 54 65 72 6d 20 29 20 2a 70 62 4e 65  bNewTerm ) *pbNe
e650: 77 54 65 72 6d 20 3d 20 31 3b 0a 20 20 20 20 20  wTerm = 1;.     
e660: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
e670: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
e680: 66 74 73 35 53 65 67 49 74 65 72 4c 6f 61 64 4e  fts5SegIterLoadN
e690: 50 6f 73 28 70 2c 20 70 49 74 65 72 29 3b 0a 20  Pos(p, pIter);. 
e6a0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
e6b0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 23 64  .    }.  }.}..#d
e6c0: 65 66 69 6e 65 20 53 57 41 50 56 41 4c 28 54 2c  efine SWAPVAL(T,
e6d0: 20 61 2c 20 62 29 20 7b 20 54 20 74 6d 70 3b 20   a, b) { T tmp; 
e6e0: 74 6d 70 3d 61 3b 20 61 3d 62 3b 20 62 3d 74 6d  tmp=a; a=b; b=tm
e6f0: 70 3b 20 7d 0a 0a 2f 2a 0a 2a 2a 20 49 74 65 72  p; }../*.** Iter
e700: 61 74 6f 72 20 70 49 74 65 72 20 63 75 72 72 65  ator pIter curre
e710: 6e 74 6c 79 20 70 6f 69 6e 74 73 20 74 6f 20 74  ntly points to t
e720: 68 65 20 66 69 72 73 74 20 72 6f 77 69 64 20 69  he first rowid i
e730: 6e 20 61 20 64 6f 63 6c 69 73 74 2e 20 54 68 69  n a doclist. Thi
e740: 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 73 65  s.** function se
e750: 74 73 20 74 68 65 20 69 74 65 72 61 74 6f 72 20  ts the iterator 
e760: 75 70 20 73 6f 20 74 68 61 74 20 69 74 65 72 61  up so that itera
e770: 74 65 73 20 69 6e 20 72 65 76 65 72 73 65 20 6f  tes in reverse o
e780: 72 64 65 72 20 74 68 72 6f 75 67 68 0a 2a 2a 20  rder through.** 
e790: 74 68 65 20 64 6f 63 6c 69 73 74 2e 0a 2a 2f 0a  the doclist..*/.
e7a0: 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
e7b0: 53 65 67 49 74 65 72 52 65 76 65 72 73 65 28 46  SegIterReverse(F
e7c0: 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 46 74 73  ts5Index *p, Fts
e7d0: 35 53 65 67 49 74 65 72 20 2a 70 49 74 65 72 29  5SegIter *pIter)
e7e0: 7b 0a 20 20 46 74 73 35 44 6c 69 64 78 49 74 65  {.  Fts5DlidxIte
e7f0: 72 20 2a 70 44 6c 69 64 78 20 3d 20 70 49 74 65  r *pDlidx = pIte
e800: 72 2d 3e 70 44 6c 69 64 78 3b 0a 20 20 46 74 73  r->pDlidx;.  Fts
e810: 35 44 61 74 61 20 2a 70 4c 61 73 74 20 3d 20 30  5Data *pLast = 0
e820: 3b 0a 20 20 69 6e 74 20 70 67 6e 6f 4c 61 73 74  ;.  int pgnoLast
e830: 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20 70 44 6c   = 0;..  if( pDl
e840: 69 64 78 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  idx ){.    int i
e850: 53 65 67 69 64 20 3d 20 70 49 74 65 72 2d 3e 70  Segid = pIter->p
e860: 53 65 67 2d 3e 69 53 65 67 69 64 3b 0a 20 20 20  Seg->iSegid;.   
e870: 20 70 67 6e 6f 4c 61 73 74 20 3d 20 66 74 73 35   pgnoLast = fts5
e880: 44 6c 69 64 78 49 74 65 72 50 67 6e 6f 28 70 44  DlidxIterPgno(pD
e890: 6c 69 64 78 29 3b 0a 20 20 20 20 70 4c 61 73 74  lidx);.    pLast
e8a0: 20 3d 20 66 74 73 35 44 61 74 61 52 65 61 64 28   = fts5DataRead(
e8b0: 70 2c 20 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f  p, FTS5_SEGMENT_
e8c0: 52 4f 57 49 44 28 69 53 65 67 69 64 2c 20 30 2c  ROWID(iSegid, 0,
e8d0: 20 70 67 6e 6f 4c 61 73 74 29 29 3b 0a 20 20 7d   pgnoLast));.  }
e8e0: 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 69 4f  else{.    int iO
e8f0: 66 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ff;             
e900: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e910: 20 20 2f 2a 20 42 79 74 65 20 6f 66 66 73 65 74    /* Byte offset
e920: 20 77 69 74 68 69 6e 20 70 4c 65 61 66 20 2a 2f   within pLeaf */
e930: 0a 20 20 20 20 46 74 73 35 44 61 74 61 20 2a 70  .    Fts5Data *p
e940: 4c 65 61 66 20 3d 20 70 49 74 65 72 2d 3e 70 4c  Leaf = pIter->pL
e950: 65 61 66 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  eaf;         /* 
e960: 43 75 72 72 65 6e 74 20 6c 65 61 66 20 64 61 74  Current leaf dat
e970: 61 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 43 75 72  a */..    /* Cur
e980: 72 65 6e 74 6c 79 2c 20 46 74 73 35 53 65 67 49  rently, Fts5SegI
e990: 74 65 72 2e 69 4c 65 61 66 4f 66 66 73 65 74 20  ter.iLeafOffset 
e9a0: 28 61 6e 64 20 69 4f 66 66 29 20 70 6f 69 6e 74  (and iOff) point
e9b0: 73 20 74 6f 20 74 68 65 20 66 69 72 73 74 20 0a  s to the first .
e9c0: 20 20 20 20 2a 2a 20 62 79 74 65 20 6f 66 20 70      ** byte of p
e9d0: 6f 73 69 74 69 6f 6e 2d 6c 69 73 74 20 63 6f 6e  osition-list con
e9e0: 74 65 6e 74 20 66 6f 72 20 74 68 65 20 63 75 72  tent for the cur
e9f0: 72 65 6e 74 20 72 6f 77 69 64 2e 20 42 61 63 6b  rent rowid. Back
ea00: 20 69 74 20 75 70 0a 20 20 20 20 2a 2a 20 73 6f   it up.    ** so
ea10: 20 74 68 61 74 20 69 74 20 70 6f 69 6e 74 73 20   that it points 
ea20: 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  to the start of 
ea30: 74 68 65 20 70 6f 73 69 74 69 6f 6e 2d 6c 69 73  the position-lis
ea40: 74 20 73 69 7a 65 20 66 69 65 6c 64 2e 20 2a 2f  t size field. */
ea50: 0a 20 20 20 20 70 49 74 65 72 2d 3e 69 4c 65 61  .    pIter->iLea
ea60: 66 4f 66 66 73 65 74 20 2d 3d 20 73 71 6c 69 74  fOffset -= sqlit
ea70: 65 33 46 74 73 35 47 65 74 56 61 72 69 6e 74 4c  e3Fts5GetVarintL
ea80: 65 6e 28 70 49 74 65 72 2d 3e 6e 50 6f 73 2a 32  en(pIter->nPos*2
ea90: 2b 70 49 74 65 72 2d 3e 62 44 65 6c 29 3b 0a 20  +pIter->bDel);. 
eaa0: 20 20 20 69 4f 66 66 20 3d 20 70 49 74 65 72 2d     iOff = pIter-
eab0: 3e 69 4c 65 61 66 4f 66 66 73 65 74 3b 0a 20 20  >iLeafOffset;.  
eac0: 20 20 61 73 73 65 72 74 28 20 69 4f 66 66 3e 3d    assert( iOff>=
ead0: 34 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 53 65 61  4 );..    /* Sea
eae0: 72 63 68 20 66 6f 72 20 61 20 6e 65 77 20 74 65  rch for a new te
eaf0: 72 6d 20 77 69 74 68 69 6e 20 74 68 65 20 63 75  rm within the cu
eb00: 72 72 65 6e 74 20 6c 65 61 66 2e 20 49 66 20 6f  rrent leaf. If o
eb10: 6e 65 20 63 61 6e 20 62 65 20 66 6f 75 6e 64 2c  ne can be found,
eb20: 0a 20 20 20 20 2a 2a 20 74 68 65 6e 20 74 68 69  .    ** then thi
eb30: 73 20 70 61 67 65 20 63 6f 6e 74 61 69 6e 73 20  s page contains 
eb40: 74 68 65 20 6c 61 72 67 65 73 74 20 72 6f 77 69  the largest rowi
eb50: 64 20 66 6f 72 20 74 68 65 20 63 75 72 72 65 6e  d for the curren
eb60: 74 20 74 65 72 6d 2e 20 2a 2f 0a 20 20 20 20 77  t term. */.    w
eb70: 68 69 6c 65 28 20 69 4f 66 66 3c 70 4c 65 61 66  hile( iOff<pLeaf
eb80: 2d 3e 73 7a 4c 65 61 66 20 29 7b 0a 20 20 20 20  ->szLeaf ){.    
eb90: 20 20 69 6e 74 20 6e 50 6f 73 3b 0a 20 20 20 20    int nPos;.    
eba0: 20 20 69 36 34 20 69 44 65 6c 74 61 3b 0a 20 20    i64 iDelta;.  
ebb0: 20 20 20 20 69 6e 74 20 62 44 75 6d 6d 79 3b 0a      int bDummy;.
ebc0: 0a 20 20 20 20 20 20 2f 2a 20 52 65 61 64 20 74  .      /* Read t
ebd0: 68 65 20 70 6f 73 69 74 69 6f 6e 2d 6c 69 73 74  he position-list
ebe0: 20 73 69 7a 65 20 66 69 65 6c 64 20 2a 2f 0a 20   size field */. 
ebf0: 20 20 20 20 20 69 4f 66 66 20 2b 3d 20 66 74 73       iOff += fts
ec00: 35 47 65 74 50 6f 73 6c 69 73 74 53 69 7a 65 28  5GetPoslistSize(
ec10: 26 70 4c 65 61 66 2d 3e 70 5b 69 4f 66 66 5d 2c  &pLeaf->p[iOff],
ec20: 20 26 6e 50 6f 73 2c 20 26 62 44 75 6d 6d 79 29   &nPos, &bDummy)
ec30: 3b 0a 20 20 20 20 20 20 69 4f 66 66 20 2b 3d 20  ;.      iOff += 
ec40: 6e 50 6f 73 3b 0a 20 20 20 20 20 20 69 66 28 20  nPos;.      if( 
ec50: 69 4f 66 66 3e 3d 70 4c 65 61 66 2d 3e 73 7a 4c  iOff>=pLeaf->szL
ec60: 65 61 66 20 29 20 62 72 65 61 6b 3b 0a 0a 20 20  eaf ) break;..  
ec70: 20 20 20 20 2f 2a 20 52 6f 77 69 64 20 64 65 6c      /* Rowid del
ec80: 74 61 2e 20 4f 72 2c 20 69 66 20 30 78 30 30 2c  ta. Or, if 0x00,
ec90: 20 74 68 65 20 65 6e 64 20 6f 66 20 64 6f 63 6c   the end of docl
eca0: 69 73 74 20 6d 61 72 6b 65 72 2e 20 2a 2f 0a 20  ist marker. */. 
ecb0: 20 20 20 20 20 6e 50 6f 73 20 3d 20 66 74 73 35       nPos = fts5
ecc0: 47 65 74 56 61 72 69 6e 74 28 26 70 4c 65 61 66  GetVarint(&pLeaf
ecd0: 2d 3e 70 5b 69 4f 66 66 5d 2c 20 28 75 36 34 2a  ->p[iOff], (u64*
ece0: 29 26 69 44 65 6c 74 61 29 3b 0a 20 20 20 20 20  )&iDelta);.     
ecf0: 20 69 66 28 20 69 44 65 6c 74 61 3d 3d 30 20 29   if( iDelta==0 )
ed00: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 69 4f   break;.      iO
ed10: 66 66 20 2b 3d 20 6e 50 6f 73 3b 0a 20 20 20 20  ff += nPos;.    
ed20: 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69  }..    /* If thi
ed30: 73 20 63 6f 6e 64 69 74 69 6f 6e 20 69 73 20 74  s condition is t
ed40: 72 75 65 20 74 68 65 6e 20 74 68 65 20 6c 61 72  rue then the lar
ed50: 67 65 73 74 20 72 6f 77 69 64 20 66 6f 72 20 74  gest rowid for t
ed60: 68 65 20 63 75 72 72 65 6e 74 0a 20 20 20 20 2a  he current.    *
ed70: 2a 20 74 65 72 6d 20 6d 61 79 20 6e 6f 74 20 62  * term may not b
ed80: 65 20 73 74 6f 72 65 64 20 6f 6e 20 74 68 65 20  e stored on the 
ed90: 63 75 72 72 65 6e 74 20 70 61 67 65 2e 20 53 6f  current page. So
eda0: 20 73 65 61 72 63 68 20 66 6f 72 77 61 72 64 20   search forward 
edb0: 74 6f 0a 20 20 20 20 2a 2a 20 73 65 65 20 77 68  to.    ** see wh
edc0: 65 72 65 20 73 61 69 64 20 72 6f 77 69 64 20 72  ere said rowid r
edd0: 65 61 6c 6c 79 20 69 73 2e 20 20 2a 2f 0a 20 20  eally is.  */.  
ede0: 20 20 69 66 28 20 69 4f 66 66 3e 3d 70 4c 65 61    if( iOff>=pLea
edf0: 66 2d 3e 73 7a 4c 65 61 66 20 29 7b 0a 20 20 20  f->szLeaf ){.   
ee00: 20 20 20 69 6e 74 20 70 67 6e 6f 3b 0a 20 20 20     int pgno;.   
ee10: 20 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65     Fts5Structure
ee20: 53 65 67 6d 65 6e 74 20 2a 70 53 65 67 20 3d 20  Segment *pSeg = 
ee30: 70 49 74 65 72 2d 3e 70 53 65 67 3b 0a 0a 20 20  pIter->pSeg;..  
ee40: 20 20 20 20 2f 2a 20 54 68 65 20 6c 61 73 74 20      /* The last 
ee50: 72 6f 77 69 64 20 69 6e 20 74 68 65 20 64 6f 63  rowid in the doc
ee60: 6c 69 73 74 20 6d 61 79 20 6e 6f 74 20 62 65 20  list may not be 
ee70: 6f 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 70  on the current p
ee80: 61 67 65 2e 20 53 65 61 72 63 68 0a 20 20 20 20  age. Search.    
ee90: 20 20 2a 2a 20 66 6f 72 77 61 72 64 20 74 6f 20    ** forward to 
eea0: 66 69 6e 64 20 74 68 65 20 70 61 67 65 20 63 6f  find the page co
eeb0: 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 6c 61 73  ntaining the las
eec0: 74 20 72 6f 77 69 64 2e 20 20 2a 2f 0a 20 20 20  t rowid.  */.   
eed0: 20 20 20 66 6f 72 28 70 67 6e 6f 3d 70 49 74 65     for(pgno=pIte
eee0: 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 2b 31 3b 20  r->iLeafPgno+1; 
eef0: 21 70 2d 3e 72 63 20 26 26 20 70 67 6e 6f 3c 3d  !p->rc && pgno<=
ef00: 70 53 65 67 2d 3e 70 67 6e 6f 4c 61 73 74 3b 20  pSeg->pgnoLast; 
ef10: 70 67 6e 6f 2b 2b 29 7b 0a 20 20 20 20 20 20 20  pgno++){.       
ef20: 20 69 36 34 20 69 41 62 73 20 3d 20 46 54 53 35   i64 iAbs = FTS5
ef30: 5f 53 45 47 4d 45 4e 54 5f 52 4f 57 49 44 28 70  _SEGMENT_ROWID(p
ef40: 53 65 67 2d 3e 69 53 65 67 69 64 2c 20 30 2c 20  Seg->iSegid, 0, 
ef50: 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 46  pgno);.        F
ef60: 74 73 35 44 61 74 61 20 2a 70 4e 65 77 20 3d 20  ts5Data *pNew = 
ef70: 66 74 73 35 44 61 74 61 52 65 61 64 28 70 2c 20  fts5DataRead(p, 
ef80: 69 41 62 73 29 3b 0a 20 20 20 20 20 20 20 20 69  iAbs);.        i
ef90: 66 28 20 70 4e 65 77 20 29 7b 0a 20 20 20 20 20  f( pNew ){.     
efa0: 20 20 20 20 20 69 6e 74 20 69 52 6f 77 69 64 2c       int iRowid,
efb0: 20 62 54 65 72 6d 6c 65 73 73 3b 0a 20 20 20 20   bTermless;.    
efc0: 20 20 20 20 20 20 69 52 6f 77 69 64 20 3d 20 66        iRowid = f
efd0: 74 73 35 4c 65 61 66 46 69 72 73 74 52 6f 77 69  ts5LeafFirstRowi
efe0: 64 4f 66 66 28 70 4e 65 77 29 3b 0a 20 20 20 20  dOff(pNew);.    
eff0: 20 20 20 20 20 20 62 54 65 72 6d 6c 65 73 73 20        bTermless 
f000: 3d 20 66 74 73 35 4c 65 61 66 49 73 54 65 72 6d  = fts5LeafIsTerm
f010: 6c 65 73 73 28 70 4e 65 77 29 3b 0a 20 20 20 20  less(pNew);.    
f020: 20 20 20 20 20 20 69 66 28 20 69 52 6f 77 69 64        if( iRowid
f030: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
f040: 53 57 41 50 56 41 4c 28 46 74 73 35 44 61 74 61  SWAPVAL(Fts5Data
f050: 2a 2c 20 70 4e 65 77 2c 20 70 4c 61 73 74 29 3b  *, pNew, pLast);
f060: 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 67 6e  .            pgn
f070: 6f 4c 61 73 74 20 3d 20 70 67 6e 6f 3b 0a 20 20  oLast = pgno;.  
f080: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
f090: 20 20 20 20 66 74 73 35 44 61 74 61 52 65 6c 65      fts5DataRele
f0a0: 61 73 65 28 70 4e 65 77 29 3b 0a 20 20 20 20 20  ase(pNew);.     
f0b0: 20 20 20 20 20 69 66 28 20 62 54 65 72 6d 6c 65       if( bTermle
f0c0: 73 73 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20  ss==0 ) break;. 
f0d0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
f0e0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
f0f0: 20 49 66 20 70 4c 61 73 74 20 69 73 20 4e 55 4c   If pLast is NUL
f100: 4c 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74 2c  L at this point,
f110: 20 74 68 65 6e 20 74 68 65 20 6c 61 73 74 20 72   then the last r
f120: 6f 77 69 64 20 66 6f 72 20 74 68 69 73 20 64 6f  owid for this do
f130: 63 6c 69 73 74 0a 20 20 2a 2a 20 6c 69 65 73 20  clist.  ** lies 
f140: 6f 6e 20 74 68 65 20 70 61 67 65 20 63 75 72 72  on the page curr
f150: 65 6e 74 6c 79 20 69 6e 64 69 63 61 74 65 64 20  ently indicated 
f160: 62 79 20 74 68 65 20 69 74 65 72 61 74 6f 72 2e  by the iterator.
f170: 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 0a 20   In this case . 
f180: 20 2a 2a 20 70 49 74 65 72 2d 3e 69 4c 65 61 66   ** pIter->iLeaf
f190: 4f 66 66 73 65 74 20 69 73 20 61 6c 72 65 61 64  Offset is alread
f1a0: 79 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74  y set to point t
f1b0: 6f 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 2d 6c  o the position-l
f1c0: 69 73 74 20 73 69 7a 65 0a 20 20 2a 2a 20 66 69  ist size.  ** fi
f1d0: 65 6c 64 20 61 73 73 6f 63 69 61 74 65 64 20 77  eld associated w
f1e0: 69 74 68 20 74 68 65 20 66 69 72 73 74 20 72 65  ith the first re
f1f0: 6c 65 76 61 6e 74 20 72 6f 77 69 64 20 6f 6e 20  levant rowid on 
f200: 74 68 65 20 70 61 67 65 2e 0a 20 20 2a 2a 0a 20  the page..  **. 
f210: 20 2a 2a 20 4f 72 2c 20 69 66 20 70 4c 61 73 74   ** Or, if pLast
f220: 20 69 73 20 6e 6f 6e 2d 4e 55 4c 4c 2c 20 74 68   is non-NULL, th
f230: 65 6e 20 69 74 20 69 73 20 74 68 65 20 70 61 67  en it is the pag
f240: 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20  e that contains 
f250: 74 68 65 20 6c 61 73 74 0a 20 20 2a 2a 20 72 6f  the last.  ** ro
f260: 77 69 64 2e 20 49 6e 20 74 68 69 73 20 63 61 73  wid. In this cas
f270: 65 20 63 6f 6e 66 69 67 75 72 65 20 74 68 65 20  e configure the 
f280: 69 74 65 72 61 74 6f 72 20 73 6f 20 74 68 61 74  iterator so that
f290: 20 69 74 20 70 6f 69 6e 74 73 20 74 6f 20 74 68   it points to th
f2a0: 65 0a 20 20 2a 2a 20 66 69 72 73 74 20 72 6f 77  e.  ** first row
f2b0: 69 64 20 6f 6e 20 74 68 69 73 20 70 61 67 65 2e  id on this page.
f2c0: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 4c 61 73  .  */.  if( pLas
f2d0: 74 20 29 7b 0a 20 20 20 20 69 6e 74 20 64 75 6d  t ){.    int dum
f2e0: 6d 79 3b 0a 20 20 20 20 69 6e 74 20 69 4f 66 66  my;.    int iOff
f2f0: 3b 0a 20 20 20 20 66 74 73 35 44 61 74 61 52 65  ;.    fts5DataRe
f300: 6c 65 61 73 65 28 70 49 74 65 72 2d 3e 70 4c 65  lease(pIter->pLe
f310: 61 66 29 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e  af);.    pIter->
f320: 70 4c 65 61 66 20 3d 20 70 4c 61 73 74 3b 0a 20  pLeaf = pLast;. 
f330: 20 20 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 50     pIter->iLeafP
f340: 67 6e 6f 20 3d 20 70 67 6e 6f 4c 61 73 74 3b 0a  gno = pgnoLast;.
f350: 20 20 20 20 66 74 73 35 4c 65 61 66 48 65 61 64      fts5LeafHead
f360: 65 72 28 70 4c 61 73 74 2c 20 26 69 4f 66 66 2c  er(pLast, &iOff,
f370: 20 26 64 75 6d 6d 79 29 3b 0a 20 20 20 20 69 4f   &dummy);.    iO
f380: 66 66 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72  ff += fts5GetVar
f390: 69 6e 74 28 26 70 4c 61 73 74 2d 3e 70 5b 69 4f  int(&pLast->p[iO
f3a0: 66 66 5d 2c 20 28 75 36 34 2a 29 26 70 49 74 65  ff], (u64*)&pIte
f3b0: 72 2d 3e 69 52 6f 77 69 64 29 3b 0a 20 20 20 20  r->iRowid);.    
f3c0: 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73  pIter->iLeafOffs
f3d0: 65 74 20 3d 20 69 4f 66 66 3b 0a 20 20 7d 0a 0a  et = iOff;.  }..
f3e0: 20 20 66 74 73 35 53 65 67 49 74 65 72 52 65 76    fts5SegIterRev
f3f0: 65 72 73 65 49 6e 69 74 50 61 67 65 28 70 2c 20  erseInitPage(p, 
f400: 70 49 74 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  pIter);.}../*.**
f410: 20 49 74 65 72 61 74 6f 72 20 70 49 74 65 72 20   Iterator pIter 
f420: 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 73  currently points
f430: 20 74 6f 20 74 68 65 20 66 69 72 73 74 20 72 6f   to the first ro
f440: 77 69 64 20 6f 66 20 61 20 64 6f 63 6c 69 73 74  wid of a doclist
f450: 2e 0a 2a 2a 20 54 68 65 72 65 20 69 73 20 61 20  ..** There is a 
f460: 64 6f 63 6c 69 73 74 2d 69 6e 64 65 78 20 61 73  doclist-index as
f470: 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68  sociated with th
f480: 65 20 66 69 6e 61 6c 20 74 65 72 6d 20 6f 6e 20  e final term on 
f490: 74 68 65 20 63 75 72 72 65 6e 74 20 0a 2a 2a 20  the current .** 
f4a0: 70 61 67 65 2e 20 49 66 20 74 68 65 20 63 75 72  page. If the cur
f4b0: 72 65 6e 74 20 74 65 72 6d 20 69 73 20 74 68 65  rent term is the
f4c0: 20 6c 61 73 74 20 74 65 72 6d 20 6f 6e 20 74 68   last term on th
f4d0: 65 20 70 61 67 65 2c 20 6c 6f 61 64 20 74 68 65  e page, load the
f4e0: 20 0a 2a 2a 20 64 6f 63 6c 69 73 74 2d 69 6e 64   .** doclist-ind
f4f0: 65 78 20 66 72 6f 6d 20 64 69 73 6b 20 61 6e 64  ex from disk and
f500: 20 69 6e 69 74 69 61 6c 69 7a 65 20 61 6e 20 69   initialize an i
f510: 74 65 72 61 74 6f 72 20 61 74 20 28 70 49 74 65  terator at (pIte
f520: 72 2d 3e 70 44 6c 69 64 78 29 2e 0a 2a 2f 0a 73  r->pDlidx)..*/.s
f530: 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 53  tatic void fts5S
f540: 65 67 49 74 65 72 4c 6f 61 64 44 6c 69 64 78 28  egIterLoadDlidx(
f550: 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 46 74  Fts5Index *p, Ft
f560: 73 35 53 65 67 49 74 65 72 20 2a 70 49 74 65 72  s5SegIter *pIter
f570: 29 7b 0a 20 20 69 6e 74 20 69 53 65 67 20 3d 20  ){.  int iSeg = 
f580: 70 49 74 65 72 2d 3e 70 53 65 67 2d 3e 69 53 65  pIter->pSeg->iSe
f590: 67 69 64 3b 0a 20 20 69 6e 74 20 62 52 65 76 20  gid;.  int bRev 
f5a0: 3d 20 28 70 49 74 65 72 2d 3e 66 6c 61 67 73 20  = (pIter->flags 
f5b0: 26 20 46 54 53 35 5f 53 45 47 49 54 45 52 5f 52  & FTS5_SEGITER_R
f5c0: 45 56 45 52 53 45 29 3b 0a 20 20 46 74 73 35 44  EVERSE);.  Fts5D
f5d0: 61 74 61 20 2a 70 4c 65 61 66 20 3d 20 70 49 74  ata *pLeaf = pIt
f5e0: 65 72 2d 3e 70 4c 65 61 66 3b 20 2f 2a 20 43 75  er->pLeaf; /* Cu
f5f0: 72 72 65 6e 74 20 6c 65 61 66 20 64 61 74 61 20  rrent leaf data 
f600: 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 49  */..  assert( pI
f610: 74 65 72 2d 3e 66 6c 61 67 73 20 26 20 46 54 53  ter->flags & FTS
f620: 35 5f 53 45 47 49 54 45 52 5f 4f 4e 45 54 45 52  5_SEGITER_ONETER
f630: 4d 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  M );.  assert( p
f640: 49 74 65 72 2d 3e 70 44 6c 69 64 78 3d 3d 30 20  Iter->pDlidx==0 
f650: 29 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69  );..  /* Check i
f660: 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 64 6f  f the current do
f670: 63 6c 69 73 74 20 65 6e 64 73 20 6f 6e 20 74 68  clist ends on th
f680: 69 73 20 70 61 67 65 2e 20 49 66 20 69 74 20 64  is page. If it d
f690: 6f 65 73 2c 20 72 65 74 75 72 6e 0a 20 20 2a 2a  oes, return.  **
f6a0: 20 65 61 72 6c 79 20 77 69 74 68 6f 75 74 20 6c   early without l
f6b0: 6f 61 64 69 6e 67 20 74 68 65 20 64 6f 63 6c 69  oading the docli
f6c0: 73 74 2d 69 6e 64 65 78 20 28 61 73 20 69 74 20  st-index (as it 
f6d0: 62 65 6c 6f 6e 67 73 20 74 6f 20 61 20 64 69 66  belongs to a dif
f6e0: 66 65 72 65 6e 74 0a 20 20 2a 2a 20 74 65 72 6d  ferent.  ** term
f6f0: 2e 20 2a 2f 0a 20 20 69 66 28 20 70 49 74 65 72  . */.  if( pIter
f700: 2d 3e 69 54 65 72 6d 4c 65 61 66 50 67 6e 6f 3d  ->iTermLeafPgno=
f710: 3d 70 49 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e  =pIter->iLeafPgn
f720: 6f 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 4f 66  o ){.    int iOf
f730: 66 20 3d 20 70 49 74 65 72 2d 3e 69 4c 65 61 66  f = pIter->iLeaf
f740: 4f 66 66 73 65 74 20 2b 20 70 49 74 65 72 2d 3e  Offset + pIter->
f750: 6e 50 6f 73 3b 0a 20 20 20 20 77 68 69 6c 65 28  nPos;.    while(
f760: 20 69 4f 66 66 3c 70 4c 65 61 66 2d 3e 73 7a 4c   iOff<pLeaf->szL
f770: 65 61 66 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  eaf ){.      int
f780: 20 62 44 75 6d 6d 79 3b 0a 20 20 20 20 20 20 69   bDummy;.      i
f790: 6e 74 20 6e 50 6f 73 3b 0a 20 20 20 20 20 20 69  nt nPos;.      i
f7a0: 36 34 20 69 44 65 6c 74 61 3b 0a 0a 20 20 20 20  64 iDelta;..    
f7b0: 20 20 2f 2a 20 69 4f 66 66 20 69 73 20 63 75 72    /* iOff is cur
f7c0: 72 65 6e 74 6c 79 20 74 68 65 20 6f 66 66 73 65  rently the offse
f7d0: 74 20 6f 66 20 74 68 65 20 73 74 61 72 74 20 6f  t of the start o
f7e0: 66 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74 20  f position list 
f7f0: 64 61 74 61 20 2a 2f 0a 20 20 20 20 20 20 69 4f  data */.      iO
f800: 66 66 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72  ff += fts5GetVar
f810: 69 6e 74 28 26 70 4c 65 61 66 2d 3e 70 5b 69 4f  int(&pLeaf->p[iO
f820: 66 66 5d 2c 20 28 75 36 34 2a 29 26 69 44 65 6c  ff], (u64*)&iDel
f830: 74 61 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69  ta);.      if( i
f840: 44 65 6c 74 61 3d 3d 30 20 29 20 72 65 74 75 72  Delta==0 ) retur
f850: 6e 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 5f  n;.      assert_
f860: 6e 63 28 20 69 4f 66 66 3c 70 4c 65 61 66 2d 3e  nc( iOff<pLeaf->
f870: 73 7a 4c 65 61 66 20 29 3b 0a 20 20 20 20 20 20  szLeaf );.      
f880: 69 4f 66 66 20 2b 3d 20 66 74 73 35 47 65 74 50  iOff += fts5GetP
f890: 6f 73 6c 69 73 74 53 69 7a 65 28 26 70 4c 65 61  oslistSize(&pLea
f8a0: 66 2d 3e 70 5b 69 4f 66 66 5d 2c 20 26 6e 50 6f  f->p[iOff], &nPo
f8b0: 73 2c 20 26 62 44 75 6d 6d 79 29 3b 0a 20 20 20  s, &bDummy);.   
f8c0: 20 20 20 69 4f 66 66 20 2b 3d 20 6e 50 6f 73 3b     iOff += nPos;
f8d0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 49  .    }.  }..  pI
f8e0: 74 65 72 2d 3e 70 44 6c 69 64 78 20 3d 20 66 74  ter->pDlidx = ft
f8f0: 73 35 44 6c 69 64 78 49 74 65 72 49 6e 69 74 28  s5DlidxIterInit(
f900: 70 2c 20 62 52 65 76 2c 20 69 53 65 67 2c 20 70  p, bRev, iSeg, p
f910: 49 74 65 72 2d 3e 69 54 65 72 6d 4c 65 61 66 50  Iter->iTermLeafP
f920: 67 6e 6f 29 3b 0a 7d 0a 0a 23 64 65 66 69 6e 65  gno);.}..#define
f930: 20 66 74 73 35 49 6e 64 65 78 47 65 74 56 61 72   fts5IndexGetVar
f940: 69 6e 74 33 32 28 61 2c 20 69 4f 66 66 2c 20 6e  int32(a, iOff, n
f950: 56 61 6c 29 20 7b 20 20 20 20 20 5c 0a 20 20 6e  Val) {     \.  n
f960: 56 61 6c 20 3d 20 61 5b 69 4f 66 66 2b 2b 5d 3b  Val = a[iOff++];
f970: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f980: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
f990: 0a 20 20 69 66 28 20 6e 56 61 6c 20 26 20 30 78  .  if( nVal & 0x
f9a0: 38 30 20 29 7b 20 20 20 20 20 20 20 20 20 20 20  80 ){           
f9b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f9c0: 20 20 20 5c 0a 20 20 20 20 69 4f 66 66 2d 2d 3b     \.    iOff--;
f9d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f9e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f9f0: 20 20 20 20 20 20 20 5c 0a 20 20 20 20 69 4f 66         \.    iOf
fa00: 66 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69  f += fts5GetVari
fa10: 6e 74 33 32 28 26 61 5b 69 4f 66 66 5d 2c 20 6e  nt32(&a[iOff], n
fa20: 56 61 6c 29 3b 20 20 20 20 20 20 5c 0a 20 20 7d  Val);      \.  }
fa30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fa40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fa50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
fa60: 0a 7d 0a 0a 23 64 65 66 69 6e 65 20 66 74 73 35  .}..#define fts5
fa70: 49 6e 64 65 78 53 6b 69 70 56 61 72 69 6e 74 28  IndexSkipVarint(
fa80: 61 2c 20 69 4f 66 66 29 20 7b 20 20 20 20 20 20  a, iOff) {      
fa90: 20 20 20 20 20 20 5c 0a 20 20 69 6e 74 20 69 45        \.  int iE
faa0: 6e 64 20 3d 20 69 4f 66 66 2b 39 3b 20 20 20 20  nd = iOff+9;    
fab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fac0: 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 77 68            \.  wh
fad0: 69 6c 65 28 20 28 61 5b 69 4f 66 66 2b 2b 5d 20  ile( (a[iOff++] 
fae0: 26 20 30 78 38 30 29 20 26 26 20 69 4f 66 66 3c  & 0x80) && iOff<
faf0: 69 45 6e 64 20 29 3b 20 20 20 20 20 20 20 5c 0a  iEnd );       \.
fb00: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 69 74 65  }../*.** The ite
fb10: 72 61 74 6f 72 20 6f 62 6a 65 63 74 20 70 61 73  rator object pas
fb20: 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e  sed as the secon
fb30: 64 20 61 72 67 75 6d 65 6e 74 20 63 75 72 72 65  d argument curre
fb40: 6e 74 6c 79 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a  ntly contains.**
fb50: 20 6e 6f 20 76 61 6c 69 64 20 76 61 6c 75 65 73   no valid values
fb60: 20 65 78 63 65 70 74 20 66 6f 72 20 74 68 65 20   except for the 
fb70: 46 74 73 35 53 65 67 49 74 65 72 2e 70 4c 65 61  Fts5SegIter.pLea
fb80: 66 20 6d 65 6d 62 65 72 20 76 61 72 69 61 62 6c  f member variabl
fb90: 65 2e 20 54 68 69 73 0a 2a 2a 20 66 75 6e 63 74  e. This.** funct
fba0: 69 6f 6e 20 73 65 61 72 63 68 65 73 20 74 68 65  ion searches the
fbb0: 20 6c 65 61 66 20 70 61 67 65 20 66 6f 72 20 61   leaf page for a
fbc0: 20 74 65 72 6d 20 6d 61 74 63 68 69 6e 67 20 28   term matching (
fbd0: 70 54 65 72 6d 2f 6e 54 65 72 6d 29 2e 0a 2a 2a  pTerm/nTerm)..**
fbe0: 0a 2a 2a 20 49 66 20 74 68 65 20 73 70 65 63 69  .** If the speci
fbf0: 66 69 65 64 20 74 65 72 6d 20 69 73 20 66 6f 75  fied term is fou
fc00: 6e 64 20 6f 6e 20 74 68 65 20 70 61 67 65 2c 20  nd on the page, 
fc10: 74 68 65 6e 20 74 68 65 20 69 74 65 72 61 74 6f  then the iterato
fc20: 72 20 69 73 20 6c 65 66 74 0a 2a 2a 20 70 6f 69  r is left.** poi
fc30: 6e 74 69 6e 67 20 74 6f 20 69 74 2e 20 49 66 20  nting to it. If 
fc40: 61 72 67 75 6d 65 6e 74 20 62 47 65 20 69 73 20  argument bGe is 
fc50: 7a 65 72 6f 20 61 6e 64 20 74 68 65 20 74 65 72  zero and the ter
fc60: 6d 20 69 73 20 6e 6f 74 20 66 6f 75 6e 64 2c 0a  m is not found,.
fc70: 2a 2a 20 74 68 65 20 69 74 65 72 61 74 6f 72 20  ** the iterator 
fc80: 69 73 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67  is left pointing
fc90: 20 61 74 20 45 4f 46 2e 0a 2a 2a 0a 2a 2a 20 49   at EOF..**.** I
fca0: 66 20 62 47 65 20 69 73 20 6e 6f 6e 2d 7a 65 72  f bGe is non-zer
fcb0: 6f 20 61 6e 64 20 74 68 65 20 73 70 65 63 69 66  o and the specif
fcc0: 69 65 64 20 74 65 72 6d 20 69 73 20 6e 6f 74 20  ied term is not 
fcd0: 66 6f 75 6e 64 2c 20 74 68 65 6e 20 74 68 65 0a  found, then the.
fce0: 2a 2a 20 69 74 65 72 61 74 6f 72 20 69 73 20 6c  ** iterator is l
fcf0: 65 66 74 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20  eft pointing to 
fd00: 74 68 65 20 73 6d 61 6c 6c 65 73 74 20 74 65 72  the smallest ter
fd10: 6d 20 69 6e 20 74 68 65 20 73 65 67 6d 65 6e 74  m in the segment
fd20: 20 74 68 61 74 0a 2a 2a 20 69 73 20 6c 61 72 67   that.** is larg
fd30: 65 72 20 74 68 61 6e 20 74 68 65 20 73 70 65 63  er than the spec
fd40: 69 66 69 65 64 20 74 65 72 6d 2c 20 65 76 65 6e  ified term, even
fd50: 20 69 66 20 74 68 69 73 20 74 65 72 6d 20 69 73   if this term is
fd60: 20 6e 6f 74 20 6f 6e 20 74 68 65 0a 2a 2a 20 63   not on the.** c
fd70: 75 72 72 65 6e 74 20 70 61 67 65 2e 0a 2a 2f 0a  urrent page..*/.
fd80: 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
fd90: 4c 65 61 66 53 65 65 6b 28 0a 20 20 46 74 73 35  LeafSeek(.  Fts5
fda0: 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20  Index *p,       
fdb0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
fdc0: 65 61 76 65 20 61 6e 79 20 65 72 72 6f 72 20 63  eave any error c
fdd0: 6f 64 65 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e  ode here */.  in
fde0: 74 20 62 47 65 2c 20 20 20 20 20 20 20 20 20 20  t bGe,          
fdf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
fe00: 20 54 72 75 65 20 66 6f 72 20 61 20 3e 3d 20 73   True for a >= s
fe10: 65 61 72 63 68 20 2a 2f 0a 20 20 46 74 73 35 53  earch */.  Fts5S
fe20: 65 67 49 74 65 72 20 2a 70 49 74 65 72 2c 20 20  egIter *pIter,  
fe30: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 74             /* It
fe40: 65 72 61 74 6f 72 20 74 6f 20 73 65 65 6b 20 2a  erator to seek *
fe50: 2f 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 70 54  /.  const u8 *pT
fe60: 65 72 6d 2c 20 69 6e 74 20 6e 54 65 72 6d 20 20  erm, int nTerm  
fe70: 20 20 20 20 2f 2a 20 54 65 72 6d 20 74 6f 20 73      /* Term to s
fe80: 65 61 72 63 68 20 66 6f 72 20 2a 2f 0a 29 7b 0a  earch for */.){.
fe90: 20 20 69 6e 74 20 69 4f 66 66 3b 0a 20 20 63 6f    int iOff;.  co
fea0: 6e 73 74 20 75 38 20 2a 61 20 3d 20 70 49 74 65  nst u8 *a = pIte
feb0: 72 2d 3e 70 4c 65 61 66 2d 3e 70 3b 0a 20 20 69  r->pLeaf->p;.  i
fec0: 6e 74 20 6e 20 3d 20 70 49 74 65 72 2d 3e 70 4c  nt n = pIter->pL
fed0: 65 61 66 2d 3e 73 7a 4c 65 61 66 3b 0a 0a 20 20  eaf->szLeaf;..  
fee0: 69 6e 74 20 6e 4d 61 74 63 68 20 3d 20 30 3b 0a  int nMatch = 0;.
fef0: 20 20 69 6e 74 20 6e 4b 65 65 70 20 3d 20 30 3b    int nKeep = 0;
ff00: 0a 20 20 69 6e 74 20 6e 4e 65 77 20 3d 20 30 3b  .  int nNew = 0;
ff10: 0a 20 20 69 6e 74 20 69 54 65 72 6d 20 3d 20 30  .  int iTerm = 0
ff20: 3b 0a 20 20 69 6e 74 20 6e 50 67 54 65 72 6d 20  ;.  int nPgTerm 
ff30: 3d 20 28 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d  = (pIter->pLeaf-
ff40: 3e 6e 6e 20 2d 20 70 49 74 65 72 2d 3e 70 4c 65  >nn - pIter->pLe
ff50: 61 66 2d 3e 73 7a 4c 65 61 66 29 20 3e 3e 20 31  af->szLeaf) >> 1
ff60: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  ;..  assert( p->
ff70: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  rc==SQLITE_OK );
ff80: 0a 20 20 61 73 73 65 72 74 28 20 70 49 74 65 72  .  assert( pIter
ff90: 2d 3e 70 4c 65 61 66 20 29 3b 0a 0a 20 20 69 4f  ->pLeaf );..  iO
ffa0: 66 66 20 3d 20 66 74 73 35 4c 65 61 66 46 69 72  ff = fts5LeafFir
ffb0: 73 74 54 65 72 6d 4f 66 66 28 70 49 74 65 72 2d  stTermOff(pIter-
ffc0: 3e 70 4c 65 61 66 29 3b 0a 20 20 69 66 28 20 69  >pLeaf);.  if( i
ffd0: 4f 66 66 3c 34 20 7c 7c 20 69 4f 66 66 3e 3d 6e  Off<4 || iOff>=n
ffe0: 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20   ){.    p->rc = 
fff0: 46 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20  FTS5_CORRUPT;.  
10000 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20    return;.  }.. 
10010 20 77 68 69 6c 65 28 20 31 20 29 7b 0a 20 20 20   while( 1 ){.   
10020 20 69 6e 74 20 69 3b 0a 20 20 20 20 69 6e 74 20   int i;.    int 
10030 6e 43 6d 70 3b 0a 0a 20 20 20 20 2f 2a 20 46 69  nCmp;..    /* Fi
10040 67 75 72 65 20 6f 75 74 20 68 6f 77 20 6d 61 6e  gure out how man
10050 79 20 6e 65 77 20 62 79 74 65 73 20 61 72 65 20  y new bytes are 
10060 69 6e 20 74 68 69 73 20 74 65 72 6d 20 2a 2f 0a  in this term */.
10070 20 20 20 20 66 74 73 35 49 6e 64 65 78 47 65 74      fts5IndexGet
10080 56 61 72 69 6e 74 33 32 28 61 2c 20 69 4f 66 66  Varint32(a, iOff
10090 2c 20 6e 4e 65 77 29 3b 0a 0a 20 20 20 20 69 66  , nNew);..    if
100a0 28 20 6e 4b 65 65 70 3c 6e 4d 61 74 63 68 20 29  ( nKeep<nMatch )
100b0 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 65 61  {.      goto sea
100c0 72 63 68 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20  rch_failed;.    
100d0 7d 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e  }..    assert( n
100e0 4b 65 65 70 3e 3d 6e 4d 61 74 63 68 20 29 3b 0a  Keep>=nMatch );.
100f0 20 20 20 20 69 66 28 20 6e 4b 65 65 70 3d 3d 6e      if( nKeep==n
10100 4d 61 74 63 68 20 29 7b 0a 20 20 20 20 20 20 6e  Match ){.      n
10110 43 6d 70 20 3d 20 4d 49 4e 28 6e 4e 65 77 2c 20  Cmp = MIN(nNew, 
10120 6e 54 65 72 6d 2d 6e 4d 61 74 63 68 29 3b 0a 20  nTerm-nMatch);. 
10130 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
10140 6e 43 6d 70 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nCmp; i++){.    
10150 20 20 20 20 69 66 28 20 61 5b 69 4f 66 66 2b 69      if( a[iOff+i
10160 5d 21 3d 70 54 65 72 6d 5b 6e 4d 61 74 63 68 2b  ]!=pTerm[nMatch+
10170 69 5d 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  i] ) break;.    
10180 20 20 7d 0a 20 20 20 20 20 20 6e 4d 61 74 63 68    }.      nMatch
10190 20 2b 3d 20 69 3b 0a 0a 20 20 20 20 20 20 69 66   += i;..      if
101a0 28 20 6e 54 65 72 6d 3d 3d 6e 4d 61 74 63 68 20  ( nTerm==nMatch 
101b0 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69  ){.        if( i
101c0 3d 3d 6e 4e 65 77 20 29 7b 0a 20 20 20 20 20 20  ==nNew ){.      
101d0 20 20 20 20 67 6f 74 6f 20 73 65 61 72 63 68 5f      goto search_
101e0 73 75 63 63 65 73 73 3b 0a 20 20 20 20 20 20 20  success;.       
101f0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
10200 20 20 67 6f 74 6f 20 73 65 61 72 63 68 5f 66 61    goto search_fa
10210 69 6c 65 64 3b 0a 20 20 20 20 20 20 20 20 7d 0a  iled;.        }.
10220 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
10230 69 3c 6e 4e 65 77 20 26 26 20 61 5b 69 4f 66 66  i<nNew && a[iOff
10240 2b 69 5d 3e 70 54 65 72 6d 5b 6e 4d 61 74 63 68  +i]>pTerm[nMatch
10250 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74  ] ){.        got
10260 6f 20 73 65 61 72 63 68 5f 66 61 69 6c 65 64 3b  o search_failed;
10270 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
10280 20 20 20 69 4f 66 66 20 2b 3d 20 6e 4e 65 77 3b     iOff += nNew;
10290 0a 0a 23 69 66 20 30 0a 20 20 20 20 2f 2a 20 53  ..#if 0.    /* S
102a0 6b 69 70 20 70 61 73 74 20 74 68 65 20 64 6f 63  kip past the doc
102b0 6c 69 73 74 2e 20 49 66 20 74 68 65 20 65 6e 64  list. If the end
102c0 20 6f 66 20 74 68 65 20 70 61 67 65 20 69 73 20   of the page is 
102d0 72 65 61 63 68 65 64 2c 20 62 61 69 6c 20 6f 75  reached, bail ou
102e0 74 2e 20 2a 2f 0a 20 20 20 20 77 68 69 6c 65 28  t. */.    while(
102f0 20 31 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20   1 ){.      int 
10300 6e 50 6f 73 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  nPos;..      /* 
10310 53 6b 69 70 20 70 61 73 74 20 72 6f 77 69 64 20  Skip past rowid 
10320 64 65 6c 74 61 20 2a 2f 0a 20 20 20 20 20 20 66  delta */.      f
10330 74 73 35 49 6e 64 65 78 53 6b 69 70 56 61 72 69  ts5IndexSkipVari
10340 6e 74 28 61 2c 20 69 4f 66 66 29 3b 0a 0a 20 20  nt(a, iOff);..  
10350 20 20 20 20 2f 2a 20 53 6b 69 70 20 70 61 73 74      /* Skip past
10360 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74 20 2a   position list *
10370 2f 0a 20 20 20 20 20 20 66 74 73 35 49 6e 64 65  /.      fts5Inde
10380 78 47 65 74 56 61 72 69 6e 74 33 32 28 61 2c 20  xGetVarint32(a, 
10390 69 4f 66 66 2c 20 6e 50 6f 73 29 3b 0a 20 20 20  iOff, nPos);.   
103a0 20 20 20 69 4f 66 66 20 2b 3d 20 28 6e 50 6f 73     iOff += (nPos
103b0 20 3e 3e 20 31 29 3b 0a 20 20 20 20 20 20 69 66   >> 1);.      if
103c0 28 20 69 4f 66 66 3e 3d 28 6e 2d 31 29 20 29 7b  ( iOff>=(n-1) ){
103d0 0a 20 20 20 20 20 20 20 20 69 4f 66 66 20 3d 20  .        iOff = 
103e0 6e 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  n;.        goto 
103f0 73 65 61 72 63 68 5f 66 61 69 6c 65 64 3b 0a 20  search_failed;. 
10400 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a       }..      /*
10410 20 49 66 20 74 68 69 73 20 69 73 20 74 68 65 20   If this is the 
10420 65 6e 64 20 6f 66 20 74 68 65 20 64 6f 63 6c 69  end of the docli
10430 73 74 2c 20 62 72 65 61 6b 20 6f 75 74 20 6f 66  st, break out of
10440 20 74 68 65 20 6c 6f 6f 70 20 2a 2f 0a 20 20 20   the loop */.   
10450 20 20 20 69 66 28 20 61 5b 69 4f 66 66 5d 3d 3d     if( a[iOff]==
10460 30 78 30 30 20 29 7b 0a 20 20 20 20 20 20 20 20  0x00 ){.        
10470 69 4f 66 66 2b 2b 3b 0a 20 20 20 20 20 20 20 20  iOff++;.        
10480 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
10490 20 20 20 7d 3b 0a 0a 20 20 20 20 69 54 65 72 6d     };..    iTerm
104a0 2b 2b 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ++;.    assert( 
104b0 69 54 65 72 6d 3c 6e 50 67 54 65 72 6d 20 29 3b  iTerm<nPgTerm );
104c0 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 4f 66  .    assert( iOf
104d0 66 3d 3d 66 74 73 35 47 65 74 55 31 36 28 26 61  f==fts5GetU16(&a
104e0 5b 6e 20 2b 20 69 54 65 72 6d 2a 32 5d 29 20 29  [n + iTerm*2]) )
104f0 3b 0a 0a 23 65 6c 73 65 0a 20 20 20 20 69 54 65  ;..#else.    iTe
10500 72 6d 2b 2b 3b 0a 20 20 20 20 69 66 28 20 69 54  rm++;.    if( iT
10510 65 72 6d 3e 3d 6e 50 67 54 65 72 6d 20 29 7b 0a  erm>=nPgTerm ){.
10520 20 20 20 20 20 20 69 4f 66 66 20 3d 20 6e 3b 0a        iOff = n;.
10530 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
10540 20 7d 0a 20 20 20 20 69 4f 66 66 20 3d 20 66 74   }.    iOff = ft
10550 73 35 47 65 74 55 31 36 28 26 61 5b 6e 20 2b 20  s5GetU16(&a[n + 
10560 69 54 65 72 6d 2a 32 5d 29 3b 0a 23 65 6e 64 69  iTerm*2]);.#endi
10570 66 0a 0a 20 20 20 20 2f 2a 20 52 65 61 64 20 74  f..    /* Read t
10580 68 65 20 6e 4b 65 65 70 20 66 69 65 6c 64 20 6f  he nKeep field o
10590 66 20 74 68 65 20 6e 65 78 74 20 74 65 72 6d 2e  f the next term.
105a0 20 2a 2f 0a 20 20 20 20 66 74 73 35 49 6e 64 65   */.    fts5Inde
105b0 78 47 65 74 56 61 72 69 6e 74 33 32 28 61 2c 20  xGetVarint32(a, 
105c0 69 4f 66 66 2c 20 6e 4b 65 65 70 29 3b 0a 20 20  iOff, nKeep);.  
105d0 7d 0a 0a 20 73 65 61 72 63 68 5f 66 61 69 6c 65  }.. search_faile
105e0 64 3a 0a 20 20 69 66 28 20 62 47 65 3d 3d 30 20  d:.  if( bGe==0 
105f0 29 7b 0a 20 20 20 20 66 74 73 35 44 61 74 61 52  ){.    fts5DataR
10600 65 6c 65 61 73 65 28 70 49 74 65 72 2d 3e 70 4c  elease(pIter->pL
10610 65 61 66 29 3b 0a 20 20 20 20 70 49 74 65 72 2d  eaf);.    pIter-
10620 3e 70 4c 65 61 66 20 3d 20 30 3b 0a 20 20 20 20  >pLeaf = 0;.    
10630 72 65 74 75 72 6e 3b 0a 20 20 7d 65 6c 73 65 20  return;.  }else 
10640 69 66 28 20 69 4f 66 66 3e 3d 6e 20 29 7b 0a 20  if( iOff>=n ){. 
10650 20 20 20 64 6f 20 7b 0a 20 20 20 20 20 20 66 74     do {.      ft
10660 73 35 53 65 67 49 74 65 72 4e 65 78 74 50 61 67  s5SegIterNextPag
10670 65 28 70 2c 20 70 49 74 65 72 29 3b 0a 20 20 20  e(p, pIter);.   
10680 20 20 20 69 66 28 20 70 49 74 65 72 2d 3e 70 4c     if( pIter->pL
10690 65 61 66 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  eaf==0 ) return;
106a0 0a 20 20 20 20 20 20 61 20 3d 20 70 49 74 65 72  .      a = pIter
106b0 2d 3e 70 4c 65 61 66 2d 3e 70 3b 0a 20 20 20 20  ->pLeaf->p;.    
106c0 20 20 69 66 28 20 66 74 73 35 4c 65 61 66 49 73    if( fts5LeafIs
106d0 54 65 72 6d 6c 65 73 73 28 70 49 74 65 72 2d 3e  Termless(pIter->
106e0 70 4c 65 61 66 29 3d 3d 30 20 29 7b 0a 20 20 20  pLeaf)==0 ){.   
106f0 20 20 20 20 20 69 4f 66 66 20 3d 20 66 74 73 35       iOff = fts5
10700 4c 65 61 66 46 69 72 73 74 54 65 72 6d 4f 66 66  LeafFirstTermOff
10710 28 70 49 74 65 72 2d 3e 70 4c 65 61 66 29 3b 0a  (pIter->pLeaf);.
10720 20 20 20 20 20 20 20 20 69 66 28 20 69 4f 66 66          if( iOff
10730 3c 34 20 7c 7c 20 69 4f 66 66 3e 3d 70 49 74 65  <4 || iOff>=pIte
10740 72 2d 3e 70 4c 65 61 66 2d 3e 73 7a 4c 65 61 66  r->pLeaf->szLeaf
10750 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 2d   ){.          p-
10760 3e 72 63 20 3d 20 46 54 53 35 5f 43 4f 52 52 55  >rc = FTS5_CORRU
10770 50 54 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  PT;.        }els
10780 65 7b 0a 20 20 20 20 20 20 20 20 20 20 6e 4b 65  e{.          nKe
10790 65 70 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ep = 0;.        
107a0 20 20 69 4f 66 66 20 2b 3d 20 66 74 73 35 47 65    iOff += fts5Ge
107b0 74 56 61 72 69 6e 74 33 32 28 26 61 5b 69 4f 66  tVarint32(&a[iOf
107c0 66 5d 2c 20 6e 4e 65 77 29 3b 0a 20 20 20 20 20  f], nNew);.     
107d0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
107e0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
107f0 20 20 7d 77 68 69 6c 65 28 20 31 20 29 3b 0a 20    }while( 1 );. 
10800 20 7d 0a 0a 20 73 65 61 72 63 68 5f 73 75 63 63   }.. search_succ
10810 65 73 73 3a 0a 20 20 70 49 74 65 72 2d 3e 69 4c  ess:.  pIter->iL
10820 65 61 66 4f 66 66 73 65 74 20 3d 20 69 4f 66 66  eafOffset = iOff
10830 20 2b 20 6e 4e 65 77 3b 0a 20 20 70 49 74 65 72   + nNew;.  pIter
10840 2d 3e 69 54 65 72 6d 4c 65 61 66 4f 66 66 73 65  ->iTermLeafOffse
10850 74 20 3d 20 70 49 74 65 72 2d 3e 69 4c 65 61 66  t = pIter->iLeaf
10860 4f 66 66 73 65 74 3b 0a 20 20 70 49 74 65 72 2d  Offset;.  pIter-
10870 3e 69 54 65 72 6d 4c 65 61 66 50 67 6e 6f 20 3d  >iTermLeafPgno =
10880 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e   pIter->iLeafPgn
10890 6f 3b 0a 0a 20 20 66 74 73 35 42 75 66 66 65 72  o;..  fts5Buffer
108a0 53 65 74 28 26 70 2d 3e 72 63 2c 20 26 70 49 74  Set(&p->rc, &pIt
108b0 65 72 2d 3e 74 65 72 6d 2c 20 6e 4b 65 65 70 2c  er->term, nKeep,
108c0 20 70 54 65 72 6d 29 3b 0a 20 20 66 74 73 35 42   pTerm);.  fts5B
108d0 75 66 66 65 72 41 70 70 65 6e 64 42 6c 6f 62 28  ufferAppendBlob(
108e0 26 70 2d 3e 72 63 2c 20 26 70 49 74 65 72 2d 3e  &p->rc, &pIter->
108f0 74 65 72 6d 2c 20 6e 4e 65 77 2c 20 26 61 5b 69  term, nNew, &a[i
10900 4f 66 66 5d 29 3b 0a 0a 20 20 66 74 73 35 53 65  Off]);..  fts5Se
10910 67 49 74 65 72 4c 6f 61 64 52 6f 77 69 64 28 70  gIterLoadRowid(p
10920 2c 20 70 49 74 65 72 29 3b 0a 20 20 66 74 73 35  , pIter);.  fts5
10930 53 65 67 49 74 65 72 4c 6f 61 64 4e 50 6f 73 28  SegIterLoadNPos(
10940 70 2c 20 70 49 74 65 72 29 3b 0a 7d 0a 0a 2f 2a  p, pIter);.}../*
10950 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74  .** Initialize t
10960 68 65 20 6f 62 6a 65 63 74 20 70 49 74 65 72 20  he object pIter 
10970 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 65 72 6d  to point to term
10980 20 70 54 65 72 6d 2f 6e 54 65 72 6d 20 77 69 74   pTerm/nTerm wit
10990 68 69 6e 20 73 65 67 6d 65 6e 74 0a 2a 2a 20 70  hin segment.** p
109a0 53 65 67 2e 20 49 66 20 74 68 65 72 65 20 69 73  Seg. If there is
109b0 20 6e 6f 20 73 75 63 68 20 74 65 72 6d 20 69 6e   no such term in
109c0 20 74 68 65 20 69 6e 64 65 78 2c 20 74 68 65 20   the index, the 
109d0 69 74 65 72 61 74 6f 72 20 69 73 20 73 65 74 20  iterator is set 
109e0 74 6f 20 45 4f 46 2e 0a 2a 2a 0a 2a 2a 20 49 66  to EOF..**.** If
109f0 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
10a00 2c 20 46 74 73 35 49 6e 64 65 78 2e 72 63 20 69  , Fts5Index.rc i
10a10 73 20 73 65 74 20 74 6f 20 61 6e 20 61 70 70 72  s set to an appr
10a20 6f 70 72 69 61 74 65 20 65 72 72 6f 72 20 63 6f  opriate error co
10a30 64 65 2e 20 49 66 20 0a 2a 2a 20 61 6e 20 65 72  de. If .** an er
10a40 72 6f 72 20 68 61 73 20 61 6c 72 65 61 64 79 20  ror has already 
10a50 6f 63 63 75 72 72 65 64 20 77 68 65 6e 20 74 68  occurred when th
10a60 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
10a70 61 6c 6c 65 64 2c 20 69 74 20 69 73 20 61 20 6e  alled, it is a n
10a80 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  o-op..*/.static 
10a90 76 6f 69 64 20 66 74 73 35 53 65 67 49 74 65 72  void fts5SegIter
10aa0 53 65 65 6b 49 6e 69 74 28 0a 20 20 46 74 73 35  SeekInit(.  Fts5
10ab0 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20  Index *p,       
10ac0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
10ad0 54 53 35 20 62 61 63 6b 65 6e 64 20 2a 2f 0a 20  TS5 backend */. 
10ae0 20 46 74 73 35 42 75 66 66 65 72 20 2a 70 42 75   Fts5Buffer *pBu
10af0 66 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  f,              
10b00 20 2f 2a 20 42 75 66 66 65 72 20 74 6f 20 75 73   /* Buffer to us
10b10 65 20 66 6f 72 20 6c 6f 61 64 69 6e 67 20 70 61  e for loading pa
10b20 67 65 73 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 75  ges */.  const u
10b30 38 20 2a 70 54 65 72 6d 2c 20 69 6e 74 20 6e 54  8 *pTerm, int nT
10b40 65 72 6d 2c 20 20 20 20 20 2f 2a 20 54 65 72 6d  erm,     /* Term
10b50 20 74 6f 20 73 65 65 6b 20 74 6f 20 2a 2f 0a 20   to seek to */. 
10b60 20 69 6e 74 20 66 6c 61 67 73 2c 20 20 20 20 20   int flags,     
10b70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10b80 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 46 54 53 35   /* Mask of FTS5
10b90 49 4e 44 45 58 5f 58 58 58 20 66 6c 61 67 73 20  INDEX_XXX flags 
10ba0 2a 2f 0a 20 20 46 74 73 35 53 74 72 75 63 74 75  */.  Fts5Structu
10bb0 72 65 53 65 67 6d 65 6e 74 20 2a 70 53 65 67 2c  reSegment *pSeg,
10bc0 20 20 20 20 20 2f 2a 20 44 65 73 63 72 69 70 74       /* Descript
10bd0 69 6f 6e 20 6f 66 20 73 65 67 6d 65 6e 74 20 2a  ion of segment *
10be0 2f 0a 20 20 46 74 73 35 53 65 67 49 74 65 72 20  /.  Fts5SegIter 
10bf0 2a 70 49 74 65 72 20 20 20 20 20 20 20 20 20 20  *pIter          
10c00 20 20 20 20 2f 2a 20 4f 62 6a 65 63 74 20 74 6f      /* Object to
10c10 20 70 6f 70 75 6c 61 74 65 20 2a 2f 0a 29 7b 0a   populate */.){.
10c20 20 20 69 6e 74 20 69 50 67 20 3d 20 31 3b 0a 20    int iPg = 1;. 
10c30 20 69 6e 74 20 62 47 65 20 3d 20 28 66 6c 61 67   int bGe = (flag
10c40 73 20 26 20 46 54 53 35 49 4e 44 45 58 5f 51 55  s & FTS5INDEX_QU
10c50 45 52 59 5f 53 43 41 4e 29 3b 0a 20 20 69 6e 74  ERY_SCAN);.  int
10c60 20 62 44 6c 69 64 78 20 3d 20 30 3b 20 20 20 20   bDlidx = 0;    
10c70 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
10c80 54 72 75 65 20 69 66 20 74 68 65 72 65 20 69 73  True if there is
10c90 20 61 20 64 6f 63 6c 69 73 74 2d 69 6e 64 65 78   a doclist-index
10ca0 20 2a 2f 0a 0a 20 20 73 74 61 74 69 63 20 69 6e   */..  static in
10cb0 74 20 6e 43 61 6c 6c 20 3d 20 30 3b 0a 20 20 6e  t nCall = 0;.  n
10cc0 43 61 6c 6c 2b 2b 3b 0a 0a 20 20 61 73 73 65 72  Call++;..  asser
10cd0 74 28 20 62 47 65 3d 3d 30 20 7c 7c 20 28 66 6c  t( bGe==0 || (fl
10ce0 61 67 73 20 26 20 46 54 53 35 49 4e 44 45 58 5f  ags & FTS5INDEX_
10cf0 51 55 45 52 59 5f 44 45 53 43 29 3d 3d 30 20 29  QUERY_DESC)==0 )
10d00 3b 0a 20 20 61 73 73 65 72 74 28 20 70 54 65 72  ;.  assert( pTer
10d10 6d 20 26 26 20 6e 54 65 72 6d 20 29 3b 0a 20 20  m && nTerm );.  
10d20 6d 65 6d 73 65 74 28 70 49 74 65 72 2c 20 30 2c  memset(pIter, 0,
10d30 20 73 69 7a 65 6f 66 28 2a 70 49 74 65 72 29 29   sizeof(*pIter))
10d40 3b 0a 20 20 70 49 74 65 72 2d 3e 70 53 65 67 20  ;.  pIter->pSeg 
10d50 3d 20 70 53 65 67 3b 0a 0a 20 20 2f 2a 20 54 68  = pSeg;..  /* Th
10d60 69 73 20 62 6c 6f 63 6b 20 73 65 74 73 20 73 74  is block sets st
10d70 61 63 6b 20 76 61 72 69 61 62 6c 65 20 69 50 67  ack variable iPg
10d80 20 74 6f 20 74 68 65 20 6c 65 61 66 20 70 61 67   to the leaf pag
10d90 65 20 6e 75 6d 62 65 72 20 74 68 61 74 20 6d 61  e number that ma
10da0 79 0a 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 20 74  y.  ** contain t
10db0 65 72 6d 20 28 70 54 65 72 6d 2f 6e 54 65 72 6d  erm (pTerm/nTerm
10dc0 29 2c 20 69 66 20 69 74 20 69 73 20 70 72 65 73  ), if it is pres
10dd0 65 6e 74 20 69 6e 20 74 68 65 20 73 65 67 6d 65  ent in the segme
10de0 6e 74 2e 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e  nt. */.  if( p->
10df0 70 49 64 78 53 65 6c 65 63 74 3d 3d 30 20 29 7b  pIdxSelect==0 ){
10e00 0a 20 20 20 20 46 74 73 35 43 6f 6e 66 69 67 20  .    Fts5Config 
10e10 2a 70 43 6f 6e 66 69 67 20 3d 20 70 2d 3e 70 43  *pConfig = p->pC
10e20 6f 6e 66 69 67 3b 0a 20 20 20 20 66 74 73 35 49  onfig;.    fts5I
10e30 6e 64 65 78 50 72 65 70 61 72 65 53 74 6d 74 28  ndexPrepareStmt(
10e40 70 2c 20 26 70 2d 3e 70 49 64 78 53 65 6c 65 63  p, &p->pIdxSelec
10e50 74 2c 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e  t, sqlite3_mprin
10e60 74 66 28 0a 20 20 20 20 20 20 20 20 20 20 22 53  tf(.          "S
10e70 45 4c 45 43 54 20 70 67 6e 6f 20 46 52 4f 4d 20  ELECT pgno FROM 
10e80 27 25 71 27 2e 27 25 71 5f 69 64 78 27 20 57 48  '%q'.'%q_idx' WH
10e90 45 52 45 20 22 0a 20 20 20 20 20 20 20 20 20 20  ERE ".          
10ea0 22 73 65 67 69 64 3d 3f 20 41 4e 44 20 74 65 72  "segid=? AND ter
10eb0 6d 3c 3d 3f 20 4f 52 44 45 52 20 42 59 20 74 65  m<=? ORDER BY te
10ec0 72 6d 20 44 45 53 43 20 4c 49 4d 49 54 20 31 22  rm DESC LIMIT 1"
10ed0 2c 0a 20 20 20 20 20 20 20 20 20 20 70 43 6f 6e  ,.          pCon
10ee0 66 69 67 2d 3e 7a 44 62 2c 20 70 43 6f 6e 66 69  fig->zDb, pConfi
10ef0 67 2d 3e 7a 4e 61 6d 65 0a 20 20 20 20 29 29 3b  g->zName.    ));
10f00 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 72 63  .  }.  if( p->rc
10f10 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 73 71 6c   ) return;.  sql
10f20 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 28 70 2d  ite3_bind_int(p-
10f30 3e 70 49 64 78 53 65 6c 65 63 74 2c 20 31 2c 20  >pIdxSelect, 1, 
10f40 70 53 65 67 2d 3e 69 53 65 67 69 64 29 3b 0a 20  pSeg->iSegid);. 
10f50 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 62 6c   sqlite3_bind_bl
10f60 6f 62 28 70 2d 3e 70 49 64 78 53 65 6c 65 63 74  ob(p->pIdxSelect
10f70 2c 20 32 2c 20 70 54 65 72 6d 2c 20 6e 54 65 72  , 2, pTerm, nTer
10f80 6d 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43  m, SQLITE_STATIC
10f90 29 3b 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f  );.  if( SQLITE_
10fa0 52 4f 57 3d 3d 73 71 6c 69 74 65 33 5f 73 74 65  ROW==sqlite3_ste
10fb0 70 28 70 2d 3e 70 49 64 78 53 65 6c 65 63 74 29  p(p->pIdxSelect)
10fc0 20 29 7b 0a 20 20 20 20 69 36 34 20 76 61 6c 20   ){.    i64 val 
10fd0 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  = sqlite3_column
10fe0 5f 69 6e 74 28 70 2d 3e 70 49 64 78 53 65 6c 65  _int(p->pIdxSele
10ff0 63 74 2c 20 30 29 3b 0a 20 20 20 20 69 50 67 20  ct, 0);.    iPg 
11000 3d 20 28 69 6e 74 29 28 76 61 6c 3e 3e 31 29 3b  = (int)(val>>1);
11010 0a 20 20 20 20 62 44 6c 69 64 78 20 3d 20 28 76  .    bDlidx = (v
11020 61 6c 20 26 20 30 78 30 30 30 31 29 3b 0a 20 20  al & 0x0001);.  
11030 7d 0a 20 20 70 2d 3e 72 63 20 3d 20 73 71 6c 69  }.  p->rc = sqli
11040 74 65 33 5f 72 65 73 65 74 28 70 2d 3e 70 49 64  te3_reset(p->pId
11050 78 53 65 6c 65 63 74 29 3b 0a 0a 20 20 69 66 28  xSelect);..  if(
11060 20 69 50 67 3c 70 53 65 67 2d 3e 70 67 6e 6f 46   iPg<pSeg->pgnoF
11070 69 72 73 74 20 29 7b 0a 20 20 20 20 69 50 67 20  irst ){.    iPg 
11080 3d 20 70 53 65 67 2d 3e 70 67 6e 6f 46 69 72 73  = pSeg->pgnoFirs
11090 74 3b 0a 20 20 20 20 62 44 6c 69 64 78 20 3d 20  t;.    bDlidx = 
110a0 30 3b 0a 20 20 7d 0a 0a 20 20 70 49 74 65 72 2d  0;.  }..  pIter-
110b0 3e 69 4c 65 61 66 50 67 6e 6f 20 3d 20 69 50 67  >iLeafPgno = iPg
110c0 20 2d 20 31 3b 0a 20 20 66 74 73 35 53 65 67 49   - 1;.  fts5SegI
110d0 74 65 72 4e 65 78 74 50 61 67 65 28 70 2c 20 70  terNextPage(p, p
110e0 49 74 65 72 29 3b 0a 0a 20 20 69 66 28 20 70 49  Iter);..  if( pI
110f0 74 65 72 2d 3e 70 4c 65 61 66 20 29 7b 0a 20 20  ter->pLeaf ){.  
11100 20 20 66 74 73 35 4c 65 61 66 53 65 65 6b 28 70    fts5LeafSeek(p
11110 2c 20 62 47 65 2c 20 70 49 74 65 72 2c 20 70 54  , bGe, pIter, pT
11120 65 72 6d 2c 20 6e 54 65 72 6d 29 3b 0a 20 20 7d  erm, nTerm);.  }
11130 0a 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53  ..  if( p->rc==S
11140 51 4c 49 54 45 5f 4f 4b 20 26 26 20 62 47 65 3d  QLITE_OK && bGe=
11150 3d 30 20 29 7b 0a 20 20 20 20 70 49 74 65 72 2d  =0 ){.    pIter-
11160 3e 66 6c 61 67 73 20 7c 3d 20 46 54 53 35 5f 53  >flags |= FTS5_S
11170 45 47 49 54 45 52 5f 4f 4e 45 54 45 52 4d 3b 0a  EGITER_ONETERM;.
11180 20 20 20 20 69 66 28 20 70 49 74 65 72 2d 3e 70      if( pIter->p
11190 4c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 69 66  Leaf ){.      if
111a0 28 20 66 6c 61 67 73 20 26 20 46 54 53 35 49 4e  ( flags & FTS5IN
111b0 44 45 58 5f 51 55 45 52 59 5f 44 45 53 43 20 29  DEX_QUERY_DESC )
111c0 7b 0a 20 20 20 20 20 20 20 20 70 49 74 65 72 2d  {.        pIter-
111d0 3e 66 6c 61 67 73 20 7c 3d 20 46 54 53 35 5f 53  >flags |= FTS5_S
111e0 45 47 49 54 45 52 5f 52 45 56 45 52 53 45 3b 0a  EGITER_REVERSE;.
111f0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
11200 28 20 62 44 6c 69 64 78 20 29 7b 0a 20 20 20 20  ( bDlidx ){.    
11210 20 20 20 20 66 74 73 35 53 65 67 49 74 65 72 4c      fts5SegIterL
11220 6f 61 64 44 6c 69 64 78 28 70 2c 20 70 49 74 65  oadDlidx(p, pIte
11230 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  r);.      }.    
11240 20 20 69 66 28 20 66 6c 61 67 73 20 26 20 46 54    if( flags & FT
11250 53 35 49 4e 44 45 58 5f 51 55 45 52 59 5f 44 45  S5INDEX_QUERY_DE
11260 53 43 20 29 7b 0a 20 20 20 20 20 20 20 20 66 74  SC ){.        ft
11270 73 35 53 65 67 49 74 65 72 52 65 76 65 72 73 65  s5SegIterReverse
11280 28 70 2c 20 70 49 74 65 72 29 3b 0a 20 20 20 20  (p, pIter);.    
11290 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
112a0 20 2f 2a 20 45 69 74 68 65 72 3a 0a 20 20 2a 2a   /* Either:.  **
112b0 0a 20 20 2a 2a 20 20 20 31 29 20 61 6e 20 65 72  .  **   1) an er
112c0 72 6f 72 20 68 61 73 20 6f 63 63 75 72 72 65 64  ror has occurred
112d0 2c 20 6f 72 0a 20 20 2a 2a 20 20 20 32 29 20 74  , or.  **   2) t
112e0 68 65 20 69 74 65 72 61 74 6f 72 20 70 6f 69 6e  he iterator poin
112f0 74 73 20 74 6f 20 45 4f 46 2c 20 6f 72 0a 20 20  ts to EOF, or.  
11300 2a 2a 20 20 20 33 29 20 74 68 65 20 69 74 65 72  **   3) the iter
11310 61 74 6f 72 20 70 6f 69 6e 74 73 20 74 6f 20 61  ator points to a
11320 6e 20 65 6e 74 72 79 20 77 69 74 68 20 74 65 72  n entry with ter
11330 6d 20 28 70 54 65 72 6d 2f 6e 54 65 72 6d 29 2c  m (pTerm/nTerm),
11340 20 6f 72 0a 20 20 2a 2a 20 20 20 34 29 20 74 68   or.  **   4) th
11350 65 20 46 54 53 35 49 4e 44 45 58 5f 51 55 45 52  e FTS5INDEX_QUER
11360 59 5f 53 43 41 4e 20 66 6c 61 67 20 77 61 73 20  Y_SCAN flag was 
11370 73 65 74 20 61 6e 64 20 74 68 65 20 69 74 65 72  set and the iter
11380 61 74 6f 72 20 70 6f 69 6e 74 73 0a 20 20 2a 2a  ator points.  **
11390 20 20 20 20 20 20 74 6f 20 61 6e 20 65 6e 74 72        to an entr
113a0 79 20 77 69 74 68 20 61 20 74 65 72 6d 20 67 72  y with a term gr
113b0 65 61 74 65 72 20 74 68 61 6e 20 6f 72 20 65 71  eater than or eq
113c0 75 61 6c 20 74 6f 20 28 70 54 65 72 6d 2f 6e 54  ual to (pTerm/nT
113d0 65 72 6d 29 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  erm)..  */.  ass
113e0 65 72 74 28 20 70 2d 3e 72 63 21 3d 53 51 4c 49  ert( p->rc!=SQLI
113f0 54 45 5f 4f 4b 20 20 20 20 20 20 20 20 20 20 20  TE_OK           
11400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
11420 2a 20 31 20 2a 2f 0a 20 20 20 7c 7c 20 70 49 74  * 1 */.   || pIt
11430 65 72 2d 3e 70 4c 65 61 66 3d 3d 30 20 20 20 20  er->pLeaf==0    
11440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11460 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 32 20             /* 2 
11470 2a 2f 0a 20 20 20 7c 7c 20 66 74 73 35 42 75 66  */.   || fts5Buf
11480 66 65 72 43 6f 6d 70 61 72 65 42 6c 6f 62 28 26  ferCompareBlob(&
11490 70 49 74 65 72 2d 3e 74 65 72 6d 2c 20 70 54 65  pIter->term, pTe
114a0 72 6d 2c 20 6e 54 65 72 6d 29 3d 3d 30 20 20 20  rm, nTerm)==0   
114b0 20 20 20 20 20 20 20 2f 2a 20 33 20 2a 2f 0a 20         /* 3 */. 
114c0 20 20 7c 7c 20 28 62 47 65 20 26 26 20 66 74 73    || (bGe && fts
114d0 35 42 75 66 66 65 72 43 6f 6d 70 61 72 65 42 6c  5BufferCompareBl
114e0 6f 62 28 26 70 49 74 65 72 2d 3e 74 65 72 6d 2c  ob(&pIter->term,
114f0 20 70 54 65 72 6d 2c 20 6e 54 65 72 6d 29 3e 30   pTerm, nTerm)>0
11500 29 20 20 2f 2a 20 34 20 2a 2f 0a 20 20 29 3b 0a  )  /* 4 */.  );.
11510 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c  }../*.** Initial
11520 69 7a 65 20 74 68 65 20 6f 62 6a 65 63 74 20 70  ize the object p
11530 49 74 65 72 20 74 6f 20 70 6f 69 6e 74 20 74 6f  Iter to point to
11540 20 74 65 72 6d 20 70 54 65 72 6d 2f 6e 54 65 72   term pTerm/nTer
11550 6d 20 77 69 74 68 69 6e 20 74 68 65 0a 2a 2a 20  m within the.** 
11560 69 6e 2d 6d 65 6d 6f 72 79 20 68 61 73 68 20 74  in-memory hash t
11570 61 62 6c 65 2e 20 49 66 20 74 68 65 72 65 20 69  able. If there i
11580 73 20 6e 6f 20 73 75 63 68 20 74 65 72 6d 20 69  s no such term i
11590 6e 20 74 68 65 20 68 61 73 68 2d 74 61 62 6c 65  n the hash-table
115a0 2c 20 74 68 65 20 0a 2a 2a 20 69 74 65 72 61 74  , the .** iterat
115b0 6f 72 20 69 73 20 73 65 74 20 74 6f 20 45 4f 46  or is set to EOF
115c0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72  ..**.** If an er
115d0 72 6f 72 20 6f 63 63 75 72 73 2c 20 46 74 73 35  ror occurs, Fts5
115e0 49 6e 64 65 78 2e 72 63 20 69 73 20 73 65 74 20  Index.rc is set 
115f0 74 6f 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74  to an appropriat
11600 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 49 66  e error code. If
11610 20 0a 2a 2a 20 61 6e 20 65 72 72 6f 72 20 68 61   .** an error ha
11620 73 20 61 6c 72 65 61 64 79 20 6f 63 63 75 72 72  s already occurr
11630 65 64 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e  ed when this fun
11640 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c  ction is called,
11650 20 69 74 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a   it is a no-op..
11660 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
11670 74 73 35 53 65 67 49 74 65 72 48 61 73 68 49 6e  ts5SegIterHashIn
11680 69 74 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20  it(.  Fts5Index 
11690 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  *p,             
116a0 20 20 20 20 20 20 2f 2a 20 46 54 53 35 20 62 61        /* FTS5 ba
116b0 63 6b 65 6e 64 20 2a 2f 0a 20 20 63 6f 6e 73 74  ckend */.  const
116c0 20 75 38 20 2a 70 54 65 72 6d 2c 20 69 6e 74 20   u8 *pTerm, int 
116d0 6e 54 65 72 6d 2c 20 20 20 20 20 2f 2a 20 54 65  nTerm,     /* Te
116e0 72 6d 20 74 6f 20 73 65 65 6b 20 74 6f 20 2a 2f  rm to seek to */
116f0 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c 20 20 20  .  int flags,   
11700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11710 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 46 54     /* Mask of FT
11720 53 35 49 4e 44 45 58 5f 58 58 58 20 66 6c 61 67  S5INDEX_XXX flag
11730 73 20 2a 2f 0a 20 20 46 74 73 35 53 65 67 49 74  s */.  Fts5SegIt
11740 65 72 20 2a 70 49 74 65 72 20 20 20 20 20 20 20  er *pIter       
11750 20 20 20 20 20 20 20 2f 2a 20 4f 62 6a 65 63 74         /* Object
11760 20 74 6f 20 70 6f 70 75 6c 61 74 65 20 2a 2f 0a   to populate */.
11770 29 7b 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 70  ){.  const u8 *p
11780 4c 69 73 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20  List = 0;.  int 
11790 6e 4c 69 73 74 20 3d 20 30 3b 0a 20 20 63 6f 6e  nList = 0;.  con
117a0 73 74 20 75 38 20 2a 7a 20 3d 20 30 3b 0a 20 20  st u8 *z = 0;.  
117b0 69 6e 74 20 6e 20 3d 20 30 3b 0a 0a 20 20 61 73  int n = 0;..  as
117c0 73 65 72 74 28 20 70 2d 3e 70 48 61 73 68 20 29  sert( p->pHash )
117d0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72  ;.  assert( p->r
117e0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  c==SQLITE_OK );.
117f0 0a 20 20 69 66 28 20 70 54 65 72 6d 3d 3d 30 20  .  if( pTerm==0 
11800 7c 7c 20 28 66 6c 61 67 73 20 26 20 46 54 53 35  || (flags & FTS5
11810 49 4e 44 45 58 5f 51 55 45 52 59 5f 53 43 41 4e  INDEX_QUERY_SCAN
11820 29 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d  ) ){.    p->rc =
11830 20 73 71 6c 69 74 65 33 46 74 73 35 48 61 73 68   sqlite3Fts5Hash
11840 53 63 61 6e 49 6e 69 74 28 70 2d 3e 70 48 61 73  ScanInit(p->pHas
11850 68 2c 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29  h, (const char*)
11860 70 54 65 72 6d 2c 20 6e 54 65 72 6d 29 3b 0a 20  pTerm, nTerm);. 
11870 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 48 61     sqlite3Fts5Ha
11880 73 68 53 63 61 6e 45 6e 74 72 79 28 70 2d 3e 70  shScanEntry(p->p
11890 48 61 73 68 2c 20 28 63 6f 6e 73 74 20 63 68 61  Hash, (const cha
118a0 72 2a 2a 29 26 7a 2c 20 26 70 4c 69 73 74 2c 20  r**)&z, &pList, 
118b0 26 6e 4c 69 73 74 29 3b 0a 20 20 20 20 6e 20 3d  &nList);.    n =
118c0 20 28 7a 20 3f 20 73 74 72 6c 65 6e 28 28 63 6f   (z ? strlen((co
118d0 6e 73 74 20 63 68 61 72 2a 29 7a 29 20 3a 20 30  nst char*)z) : 0
118e0 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
118f0 70 49 74 65 72 2d 3e 66 6c 61 67 73 20 7c 3d 20  pIter->flags |= 
11900 46 54 53 35 5f 53 45 47 49 54 45 52 5f 4f 4e 45  FTS5_SEGITER_ONE
11910 54 45 52 4d 3b 0a 20 20 20 20 73 71 6c 69 74 65  TERM;.    sqlite
11920 33 46 74 73 35 48 61 73 68 51 75 65 72 79 28 70  3Fts5HashQuery(p
11930 2d 3e 70 48 61 73 68 2c 20 28 63 6f 6e 73 74 20  ->pHash, (const 
11940 63 68 61 72 2a 29 70 54 65 72 6d 2c 20 6e 54 65  char*)pTerm, nTe
11950 72 6d 2c 20 26 70 4c 69 73 74 2c 20 26 6e 4c 69  rm, &pList, &nLi
11960 73 74 29 3b 0a 20 20 20 20 7a 20 3d 20 70 54 65  st);.    z = pTe
11970 72 6d 3b 0a 20 20 20 20 6e 20 3d 20 6e 54 65 72  rm;.    n = nTer
11980 6d 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 4c  m;.  }..  if( pL
11990 69 73 74 20 29 7b 0a 20 20 20 20 46 74 73 35 44  ist ){.    Fts5D
119a0 61 74 61 20 2a 70 4c 65 61 66 3b 0a 20 20 20 20  ata *pLeaf;.    
119b0 73 71 6c 69 74 65 33 46 74 73 35 42 75 66 66 65  sqlite3Fts5Buffe
119c0 72 53 65 74 28 26 70 2d 3e 72 63 2c 20 26 70 49  rSet(&p->rc, &pI
119d0 74 65 72 2d 3e 74 65 72 6d 2c 20 6e 2c 20 7a 29  ter->term, n, z)
119e0 3b 0a 20 20 20 20 70 4c 65 61 66 20 3d 20 66 74  ;.    pLeaf = ft
119f0 73 35 49 64 78 4d 61 6c 6c 6f 63 28 70 2c 20 73  s5IdxMalloc(p, s
11a00 69 7a 65 6f 66 28 46 74 73 35 44 61 74 61 29 29  izeof(Fts5Data))
11a10 3b 0a 20 20 20 20 69 66 28 20 70 4c 65 61 66 3d  ;.    if( pLeaf=
11a20 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20  =0 ) return;.   
11a30 20 70 4c 65 61 66 2d 3e 70 20 3d 20 28 75 38 2a   pLeaf->p = (u8*
11a40 29 70 4c 69 73 74 3b 0a 20 20 20 20 70 4c 65 61  )pList;.    pLea
11a50 66 2d 3e 6e 6e 20 3d 20 70 4c 65 61 66 2d 3e 73  f->nn = pLeaf->s
11a60 7a 4c 65 61 66 20 3d 20 6e 4c 69 73 74 3b 0a 20  zLeaf = nList;. 
11a70 20 20 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 20     pIter->pLeaf 
11a80 3d 20 70 4c 65 61 66 3b 0a 20 20 20 20 70 49 74  = pLeaf;.    pIt
11a90 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 20  er->iLeafOffset 
11aa0 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e 74 28  = fts5GetVarint(
11ab0 70 4c 65 61 66 2d 3e 70 2c 20 28 75 36 34 2a 29  pLeaf->p, (u64*)
11ac0 26 70 49 74 65 72 2d 3e 69 52 6f 77 69 64 29 3b  &pIter->iRowid);
11ad0 0a 0a 20 20 20 20 69 66 28 20 66 6c 61 67 73 20  ..    if( flags 
11ae0 26 20 46 54 53 35 49 4e 44 45 58 5f 51 55 45 52  & FTS5INDEX_QUER
11af0 59 5f 44 45 53 43 20 29 7b 0a 20 20 20 20 20 20  Y_DESC ){.      
11b00 70 49 74 65 72 2d 3e 66 6c 61 67 73 20 7c 3d 20  pIter->flags |= 
11b10 46 54 53 35 5f 53 45 47 49 54 45 52 5f 52 45 56  FTS5_SEGITER_REV
11b20 45 52 53 45 3b 0a 20 20 20 20 20 20 66 74 73 35  ERSE;.      fts5
11b30 53 65 67 49 74 65 72 52 65 76 65 72 73 65 49 6e  SegIterReverseIn
11b40 69 74 50 61 67 65 28 70 2c 20 70 49 74 65 72 29  itPage(p, pIter)
11b50 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
11b60 20 20 20 66 74 73 35 53 65 67 49 74 65 72 4c 6f     fts5SegIterLo
11b70 61 64 4e 50 6f 73 28 70 2c 20 70 49 74 65 72 29  adNPos(p, pIter)
11b80 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  ;.    }.  }.}../
11b90 2a 0a 2a 2a 20 5a 65 72 6f 20 74 68 65 20 69 74  *.** Zero the it
11ba0 65 72 61 74 6f 72 20 70 61 73 73 65 64 20 61 73  erator passed as
11bb0 20 74 68 65 20 6f 6e 6c 79 20 61 72 67 75 6d 65   the only argume
11bc0 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  nt..*/.static vo
11bd0 69 64 20 66 74 73 35 53 65 67 49 74 65 72 43 6c  id fts5SegIterCl
11be0 65 61 72 28 46 74 73 35 53 65 67 49 74 65 72 20  ear(Fts5SegIter 
11bf0 2a 70 49 74 65 72 29 7b 0a 20 20 66 74 73 35 42  *pIter){.  fts5B
11c00 75 66 66 65 72 46 72 65 65 28 26 70 49 74 65 72  ufferFree(&pIter
11c10 2d 3e 74 65 72 6d 29 3b 0a 20 20 66 74 73 35 44  ->term);.  fts5D
11c20 61 74 61 52 65 6c 65 61 73 65 28 70 49 74 65 72  ataRelease(pIter
11c30 2d 3e 70 4c 65 61 66 29 3b 0a 20 20 66 74 73 35  ->pLeaf);.  fts5
11c40 44 61 74 61 52 65 6c 65 61 73 65 28 70 49 74 65  DataRelease(pIte
11c50 72 2d 3e 70 4e 65 78 74 4c 65 61 66 29 3b 0a 20  r->pNextLeaf);. 
11c60 20 66 74 73 35 44 6c 69 64 78 49 74 65 72 46 72   fts5DlidxIterFr
11c70 65 65 28 70 49 74 65 72 2d 3e 70 44 6c 69 64 78  ee(pIter->pDlidx
11c80 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  );.  sqlite3_fre
11c90 65 28 70 49 74 65 72 2d 3e 61 52 6f 77 69 64 4f  e(pIter->aRowidO
11ca0 66 66 73 65 74 29 3b 0a 20 20 6d 65 6d 73 65 74  ffset);.  memset
11cb0 28 70 49 74 65 72 2c 20 30 2c 20 73 69 7a 65 6f  (pIter, 0, sizeo
11cc0 66 28 46 74 73 35 53 65 67 49 74 65 72 29 29 3b  f(Fts5SegIter));
11cd0 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .}..#ifdef SQLIT
11ce0 45 5f 44 45 42 55 47 0a 0a 2f 2a 0a 2a 2a 20 54  E_DEBUG../*.** T
11cf0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
11d00 75 73 65 64 20 61 73 20 70 61 72 74 20 6f 66 20  used as part of 
11d10 74 68 65 20 62 69 67 20 61 73 73 65 72 74 28 29  the big assert()
11d20 20 70 72 6f 63 65 64 75 72 65 20 69 6d 70 6c 65   procedure imple
11d30 6d 65 6e 74 65 64 20 62 79 0a 2a 2a 20 66 74 73  mented by.** fts
11d40 35 41 73 73 65 72 74 4d 75 6c 74 69 49 74 65 72  5AssertMultiIter
11d50 53 65 74 75 70 28 29 2e 20 49 74 20 65 6e 73 75  Setup(). It ensu
11d60 72 65 73 20 74 68 61 74 20 74 68 65 20 72 65 73  res that the res
11d70 75 6c 74 20 63 75 72 72 65 6e 74 6c 79 20 73 74  ult currently st
11d80 6f 72 65 64 0a 2a 2a 20 69 6e 20 2a 70 52 65 73  ored.** in *pRes
11d90 20 69 73 20 74 68 65 20 63 6f 72 72 65 63 74 20   is the correct 
11da0 72 65 73 75 6c 74 20 6f 66 20 63 6f 6d 70 61 72  result of compar
11db0 69 6e 67 20 74 68 65 20 63 75 72 72 65 6e 74 20  ing the current 
11dc0 70 6f 73 69 74 69 6f 6e 73 20 6f 66 20 74 68 65  positions of the
11dd0 0a 2a 2a 20 74 77 6f 20 69 74 65 72 61 74 6f 72  .** two iterator
11de0 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  s..*/.static voi
11df0 64 20 66 74 73 35 41 73 73 65 72 74 43 6f 6d 70  d fts5AssertComp
11e00 61 72 69 73 6f 6e 52 65 73 75 6c 74 28 0a 20 20  arisonResult(.  
11e10 46 74 73 35 49 6e 64 65 78 49 74 65 72 20 2a 70  Fts5IndexIter *p
11e20 49 74 65 72 2c 20 0a 20 20 46 74 73 35 53 65 67  Iter, .  Fts5Seg
11e30 49 74 65 72 20 2a 70 31 2c 0a 20 20 46 74 73 35  Iter *p1,.  Fts5
11e40 53 65 67 49 74 65 72 20 2a 70 32 2c 0a 20 20 46  SegIter *p2,.  F
11e50 74 73 35 43 52 65 73 75 6c 74 20 2a 70 52 65 73  ts5CResult *pRes
11e60 0a 29 7b 0a 20 20 69 6e 74 20 69 31 20 3d 20 70  .){.  int i1 = p
11e70 31 20 2d 20 70 49 74 65 72 2d 3e 61 53 65 67 3b  1 - pIter->aSeg;
11e80 0a 20 20 69 6e 74 20 69 32 20 3d 20 70 32 20 2d  .  int i2 = p2 -
11e90 20 70 49 74 65 72 2d 3e 61 53 65 67 3b 0a 0a 20   pIter->aSeg;.. 
11ea0 20 69 66 28 20 70 31 2d 3e 70 4c 65 61 66 20 7c   if( p1->pLeaf |
11eb0 7c 20 70 32 2d 3e 70 4c 65 61 66 20 29 7b 0a 20  | p2->pLeaf ){. 
11ec0 20 20 20 69 66 28 20 70 31 2d 3e 70 4c 65 61 66     if( p1->pLeaf
11ed0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 61 73 73  ==0 ){.      ass
11ee0 65 72 74 28 20 70 52 65 73 2d 3e 69 46 69 72 73  ert( pRes->iFirs
11ef0 74 3d 3d 69 32 20 29 3b 0a 20 20 20 20 7d 65 6c  t==i2 );.    }el
11f00 73 65 20 69 66 28 20 70 32 2d 3e 70 4c 65 61 66  se if( p2->pLeaf
11f10 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 61 73 73  ==0 ){.      ass
11f20 65 72 74 28 20 70 52 65 73 2d 3e 69 46 69 72 73  ert( pRes->iFirs
11f30 74 3d 3d 69 31 20 29 3b 0a 20 20 20 20 7d 65 6c  t==i1 );.    }el
11f40 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 4d  se{.      int nM
11f50 69 6e 20 3d 20 4d 49 4e 28 70 31 2d 3e 74 65 72  in = MIN(p1->ter
11f60 6d 2e 6e 2c 20 70 32 2d 3e 74 65 72 6d 2e 6e 29  m.n, p2->term.n)
11f70 3b 0a 20 20 20 20 20 20 69 6e 74 20 72 65 73 20  ;.      int res 
11f80 3d 20 6d 65 6d 63 6d 70 28 70 31 2d 3e 74 65 72  = memcmp(p1->ter
11f90 6d 2e 70 2c 20 70 32 2d 3e 74 65 72 6d 2e 70 2c  m.p, p2->term.p,
11fa0 20 6e 4d 69 6e 29 3b 0a 20 20 20 20 20 20 69 66   nMin);.      if
11fb0 28 20 72 65 73 3d 3d 30 20 29 20 72 65 73 20 3d  ( res==0 ) res =
11fc0 20 70 31 2d 3e 74 65 72 6d 2e 6e 20 2d 20 70 32   p1->term.n - p2
11fd0 2d 3e 74 65 72 6d 2e 6e 3b 0a 0a 20 20 20 20 20  ->term.n;..     
11fe0 20 69 66 28 20 72 65 73 3d 3d 30 20 29 7b 0a 20   if( res==0 ){. 
11ff0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
12000 52 65 73 2d 3e 62 54 65 72 6d 45 71 3d 3d 31 20  Res->bTermEq==1 
12010 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
12020 74 28 20 70 31 2d 3e 69 52 6f 77 69 64 21 3d 70  t( p1->iRowid!=p
12030 32 2d 3e 69 52 6f 77 69 64 20 29 3b 0a 20 20 20  2->iRowid );.   
12040 20 20 20 20 20 72 65 73 20 3d 20 28 28 70 31 2d       res = ((p1-
12050 3e 69 52 6f 77 69 64 20 3e 20 70 32 2d 3e 69 52  >iRowid > p2->iR
12060 6f 77 69 64 29 3d 3d 70 49 74 65 72 2d 3e 62 52  owid)==pIter->bR
12070 65 76 29 20 3f 20 2d 31 20 3a 20 31 3b 0a 20 20  ev) ? -1 : 1;.  
12080 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
12090 20 20 20 61 73 73 65 72 74 28 20 70 52 65 73 2d     assert( pRes-
120a0 3e 62 54 65 72 6d 45 71 3d 3d 30 20 29 3b 0a 20  >bTermEq==0 );. 
120b0 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66       }..      if
120c0 28 20 72 65 73 3c 30 20 29 7b 0a 20 20 20 20 20  ( res<0 ){.     
120d0 20 20 20 61 73 73 65 72 74 28 20 70 52 65 73 2d     assert( pRes-
120e0 3e 69 46 69 72 73 74 3d 3d 69 31 20 29 3b 0a 20  >iFirst==i1 );. 
120f0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
12100 20 20 20 20 61 73 73 65 72 74 28 20 70 52 65 73      assert( pRes
12110 2d 3e 69 46 69 72 73 74 3d 3d 69 32 20 29 3b 0a  ->iFirst==i2 );.
12120 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
12130 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  }.}../*.** This 
12140 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f  function is a no
12150 2d 6f 70 20 75 6e 6c 65 73 73 20 53 51 4c 49 54  -op unless SQLIT
12160 45 5f 44 45 42 55 47 20 69 73 20 64 65 66 69 6e  E_DEBUG is defin
12170 65 64 20 77 68 65 6e 20 74 68 69 73 20 6d 6f 64  ed when this mod
12180 75 6c 65 0a 2a 2a 20 69 73 20 63 6f 6d 70 69 6c  ule.** is compil
12190 65 64 2e 20 49 6e 20 74 68 61 74 20 63 61 73 65  ed. In that case
121a0 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  , this function 
121b0 69 73 20 65 73 73 65 6e 74 69 61 6c 6c 79 20 61  is essentially a
121c0 6e 20 61 73 73 65 72 74 28 29 20 0a 2a 2a 20 73  n assert() .** s
121d0 74 61 74 65 6d 65 6e 74 20 75 73 65 64 20 74 6f  tatement used to
121e0 20 76 65 72 69 66 79 20 74 68 61 74 20 74 68 65   verify that the
121f0 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
12200 20 70 49 74 65 72 2d 3e 61 46 69 72 73 74 5b 5d   pIter->aFirst[]
12210 20 61 72 72 61 79 0a 2a 2a 20 61 72 65 20 63 6f   array.** are co
12220 72 72 65 63 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  rrect..*/.static
12230 20 76 6f 69 64 20 66 74 73 35 41 73 73 65 72 74   void fts5Assert
12240 4d 75 6c 74 69 49 74 65 72 53 65 74 75 70 28 46  MultiIterSetup(F
12250 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 46 74 73  ts5Index *p, Fts
12260 35 49 6e 64 65 78 49 74 65 72 20 2a 70 49 74 65  5IndexIter *pIte
12270 72 29 7b 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d  r){.  if( p->rc=
12280 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
12290 20 20 46 74 73 35 53 65 67 49 74 65 72 20 2a 70    Fts5SegIter *p
122a0 46 69 72 73 74 20 3d 20 26 70 49 74 65 72 2d 3e  First = &pIter->
122b0 61 53 65 67 5b 20 70 49 74 65 72 2d 3e 61 46 69  aSeg[ pIter->aFi
122c0 72 73 74 5b 31 5d 2e 69 46 69 72 73 74 20 5d 3b  rst[1].iFirst ];
122d0 0a 20 20 20 20 69 6e 74 20 69 3b 0a 0a 20 20 20  .    int i;..   
122e0 20 61 73 73 65 72 74 28 20 28 70 46 69 72 73 74   assert( (pFirst
122f0 2d 3e 70 4c 65 61 66 3d 3d 30 29 3d 3d 70 49 74  ->pLeaf==0)==pIt
12300 65 72 2d 3e 62 45 6f 66 20 29 3b 0a 0a 20 20 20  er->bEof );..   
12310 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20 70   /* Check that p
12320 49 74 65 72 2d 3e 69 53 77 69 74 63 68 52 6f 77  Iter->iSwitchRow
12330 69 64 20 69 73 20 73 65 74 20 63 6f 72 72 65 63  id is set correc
12340 74 6c 79 2e 20 2a 2f 0a 20 20 20 20 66 6f 72 28  tly. */.    for(
12350 69 3d 30 3b 20 69 3c 70 49 74 65 72 2d 3e 6e 53  i=0; i<pIter->nS
12360 65 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  eg; i++){.      
12370 46 74 73 35 53 65 67 49 74 65 72 20 2a 70 31 20  Fts5SegIter *p1 
12380 3d 20 26 70 49 74 65 72 2d 3e 61 53 65 67 5b 69  = &pIter->aSeg[i
12390 5d 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ];.      assert(
123a0 20 70 31 3d 3d 70 46 69 72 73 74 20 0a 20 20 20   p1==pFirst .   
123b0 20 20 20 20 20 20 20 20 7c 7c 20 70 31 2d 3e 70          || p1->p
123c0 4c 65 61 66 3d 3d 30 20 0a 20 20 20 20 20 20 20  Leaf==0 .       
123d0 20 20 20 20 7c 7c 20 66 74 73 35 42 75 66 66 65      || fts5Buffe
123e0 72 43 6f 6d 70 61 72 65 28 26 70 46 69 72 73 74  rCompare(&pFirst
123f0 2d 3e 74 65 72 6d 2c 20 26 70 31 2d 3e 74 65 72  ->term, &p1->ter
12400 6d 29 20 0a 20 20 20 20 20 20 20 20 20 20 20 7c  m) .           |
12410 7c 20 70 31 2d 3e 69 52 6f 77 69 64 3d 3d 70 49  | p1->iRowid==pI
12420 74 65 72 2d 3e 69 53 77 69 74 63 68 52 6f 77 69  ter->iSwitchRowi
12430 64 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20  d.           || 
12440 28 70 31 2d 3e 69 52 6f 77 69 64 3c 70 49 74 65  (p1->iRowid<pIte
12450 72 2d 3e 69 53 77 69 74 63 68 52 6f 77 69 64 29  r->iSwitchRowid)
12460 3d 3d 70 49 74 65 72 2d 3e 62 52 65 76 0a 20 20  ==pIter->bRev.  
12470 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 0a 20 20      );.    }..  
12480 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49 74    for(i=0; i<pIt
12490 65 72 2d 3e 6e 53 65 67 3b 20 69 2b 3d 32 29 7b  er->nSeg; i+=2){
124a0 0a 20 20 20 20 20 20 46 74 73 35 53 65 67 49 74  .      Fts5SegIt
124b0 65 72 20 2a 70 31 20 3d 20 26 70 49 74 65 72 2d  er *p1 = &pIter-
124c0 3e 61 53 65 67 5b 69 5d 3b 0a 20 20 20 20 20 20  >aSeg[i];.      
124d0 46 74 73 35 53 65 67 49 74 65 72 20 2a 70 32 20  Fts5SegIter *p2 
124e0 3d 20 26 70 49 74 65 72 2d 3e 61 53 65 67 5b 69  = &pIter->aSeg[i
124f0 2b 31 5d 3b 0a 20 20 20 20 20 20 46 74 73 35 43  +1];.      Fts5C
12500 52 65 73 75 6c 74 20 2a 70 52 65 73 20 3d 20 26  Result *pRes = &
12510 70 49 74 65 72 2d 3e 61 46 69 72 73 74 5b 28 70  pIter->aFirst[(p
12520 49 74 65 72 2d 3e 6e 53 65 67 20 2b 20 69 29 20  Iter->nSeg + i) 
12530 2f 20 32 5d 3b 0a 20 20 20 20 20 20 66 74 73 35  / 2];.      fts5
12540 41 73 73 65 72 74 43 6f 6d 70 61 72 69 73 6f 6e  AssertComparison
12550 52 65 73 75 6c 74 28 70 49 74 65 72 2c 20 70 31  Result(pIter, p1
12560 2c 20 70 32 2c 20 70 52 65 73 29 3b 0a 20 20 20  , p2, pRes);.   
12570 20 7d 0a 0a 20 20 20 20 66 6f 72 28 69 3d 31 3b   }..    for(i=1;
12580 20 69 3c 28 70 49 74 65 72 2d 3e 6e 53 65 67 20   i<(pIter->nSeg 
12590 2f 20 32 29 3b 20 69 2b 3d 32 29 7b 0a 20 20 20  / 2); i+=2){.   
125a0 20 20 20 46 74 73 35 53 65 67 49 74 65 72 20 2a     Fts5SegIter *
125b0 70 31 20 3d 20 26 70 49 74 65 72 2d 3e 61 53 65  p1 = &pIter->aSe
125c0 67 5b 20 70 49 74 65 72 2d 3e 61 46 69 72 73 74  g[ pIter->aFirst
125d0 5b 69 2a 32 5d 2e 69 46 69 72 73 74 20 5d 3b 0a  [i*2].iFirst ];.
125e0 20 20 20 20 20 20 46 74 73 35 53 65 67 49 74 65        Fts5SegIte
125f0 72 20 2a 70 32 20 3d 20 26 70 49 74 65 72 2d 3e  r *p2 = &pIter->
12600 61 53 65 67 5b 20 70 49 74 65 72 2d 3e 61 46 69  aSeg[ pIter->aFi
12610 72 73 74 5b 69 2a 32 2b 31 5d 2e 69 46 69 72 73  rst[i*2+1].iFirs
12620 74 20 5d 3b 0a 20 20 20 20 20 20 46 74 73 35 43  t ];.      Fts5C
12630 52 65 73 75 6c 74 20 2a 70 52 65 73 20 3d 20 26  Result *pRes = &
12640 70 49 74 65 72 2d 3e 61 46 69 72 73 74 5b 69 5d  pIter->aFirst[i]
12650 3b 0a 20 20 20 20 20 20 66 74 73 35 41 73 73 65  ;.      fts5Asse
12660 72 74 43 6f 6d 70 61 72 69 73 6f 6e 52 65 73 75  rtComparisonResu
12670 6c 74 28 70 49 74 65 72 2c 20 70 31 2c 20 70 32  lt(pIter, p1, p2
12680 2c 20 70 52 65 73 29 3b 0a 20 20 20 20 7d 0a 20  , pRes);.    }. 
12690 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66   }.}.#else.# def
126a0 69 6e 65 20 66 74 73 35 41 73 73 65 72 74 4d 75  ine fts5AssertMu
126b0 6c 74 69 49 74 65 72 53 65 74 75 70 28 78 2c 79  ltiIterSetup(x,y
126c0 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  ).#endif../*.** 
126d0 44 6f 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f  Do the compariso
126e0 6e 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20 70  n necessary to p
126f0 6f 70 75 6c 61 74 65 20 70 49 74 65 72 2d 3e 61  opulate pIter->a
12700 46 69 72 73 74 5b 69 4f 75 74 5d 2e 0a 2a 2a 0a  First[iOut]..**.
12710 2a 2a 20 49 66 20 74 68 65 20 72 65 74 75 72 6e  ** If the return
12720 65 64 20 76 61 6c 75 65 20 69 73 20 6e 6f 6e 2d  ed value is non-
12730 7a 65 72 6f 2c 20 74 68 65 6e 20 69 74 20 69 73  zero, then it is
12740 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 61 6e   the index of an
12750 20 65 6e 74 72 79 0a 2a 2a 20 69 6e 20 74 68 65   entry.** in the
12760 20 70 49 74 65 72 2d 3e 61 53 65 67 5b 5d 20 61   pIter->aSeg[] a
12770 72 72 61 79 20 74 68 61 74 20 69 73 20 28 61 29  rray that is (a)
12780 20 6e 6f 74 20 61 74 20 45 4f 46 2c 20 61 6e 64   not at EOF, and
12790 20 28 62 29 20 70 6f 69 6e 74 69 6e 67 0a 2a 2a   (b) pointing.**
127a0 20 74 6f 20 61 20 6b 65 79 20 74 68 61 74 20 69   to a key that i
127b0 73 20 61 20 64 75 70 6c 69 63 61 74 65 20 6f 66  s a duplicate of
127c0 20 61 6e 6f 74 68 65 72 2c 20 68 69 67 68 65 72   another, higher
127d0 20 70 72 69 6f 72 69 74 79 2c 20 0a 2a 2a 20 73   priority, .** s
127e0 65 67 6d 65 6e 74 2d 69 74 65 72 61 74 6f 72 20  egment-iterator 
127f0 69 6e 20 74 68 65 20 70 53 65 67 2d 3e 61 53 65  in the pSeg->aSe
12800 67 5b 5d 20 61 72 72 61 79 2e 0a 2a 2f 0a 73 74  g[] array..*/.st
12810 61 74 69 63 20 69 6e 74 20 66 74 73 35 4d 75 6c  atic int fts5Mul
12820 74 69 49 74 65 72 44 6f 43 6f 6d 70 61 72 65 28  tiIterDoCompare(
12830 46 74 73 35 49 6e 64 65 78 49 74 65 72 20 2a 70  Fts5IndexIter *p
12840 49 74 65 72 2c 20 69 6e 74 20 69 4f 75 74 29 7b  Iter, int iOut){
12850 0a 20 20 69 6e 74 20 69 31 3b 20 20 20 20 20 20  .  int i1;      
12860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12870 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 6c     /* Index of l
12880 65 66 74 2d 68 61 6e 64 20 46 74 73 35 53 65 67  eft-hand Fts5Seg
12890 49 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 69 32  Iter */.  int i2
128a0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
128b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
128c0 65 78 20 6f 66 20 72 69 67 68 74 2d 68 61 6e 64  ex of right-hand
128d0 20 46 74 73 35 53 65 67 49 74 65 72 20 2a 2f 0a   Fts5SegIter */.
128e0 20 20 69 6e 74 20 69 52 65 73 3b 0a 20 20 46 74    int iRes;.  Ft
128f0 73 35 53 65 67 49 74 65 72 20 2a 70 31 3b 20 20  s5SegIter *p1;  
12900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
12910 20 4c 65 66 74 2d 68 61 6e 64 20 46 74 73 35 53   Left-hand Fts5S
12920 65 67 49 74 65 72 20 2a 2f 0a 20 20 46 74 73 35  egIter */.  Fts5
12930 53 65 67 49 74 65 72 20 2a 70 32 3b 20 20 20 20  SegIter *p2;    
12940 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
12950 69 67 68 74 2d 68 61 6e 64 20 46 74 73 35 53 65  ight-hand Fts5Se
12960 67 49 74 65 72 20 2a 2f 0a 20 20 46 74 73 35 43  gIter */.  Fts5C
12970 52 65 73 75 6c 74 20 2a 70 52 65 73 20 3d 20 26  Result *pRes = &
12980 70 49 74 65 72 2d 3e 61 46 69 72 73 74 5b 69 4f  pIter->aFirst[iO
12990 75 74 5d 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  ut];..  assert( 
129a0 69 4f 75 74 3c 70 49 74 65 72 2d 3e 6e 53 65 67  iOut<pIter->nSeg
129b0 20 26 26 20 69 4f 75 74 3e 30 20 29 3b 0a 20 20   && iOut>0 );.  
129c0 61 73 73 65 72 74 28 20 70 49 74 65 72 2d 3e 62  assert( pIter->b
129d0 52 65 76 3d 3d 30 20 7c 7c 20 70 49 74 65 72 2d  Rev==0 || pIter-
129e0 3e 62 52 65 76 3d 3d 31 20 29 3b 0a 0a 20 20 69  >bRev==1 );..  i
129f0 66 28 20 69 4f 75 74 3e 3d 28 70 49 74 65 72 2d  f( iOut>=(pIter-
12a00 3e 6e 53 65 67 2f 32 29 20 29 7b 0a 20 20 20 20  >nSeg/2) ){.    
12a10 69 31 20 3d 20 28 69 4f 75 74 20 2d 20 70 49 74  i1 = (iOut - pIt
12a20 65 72 2d 3e 6e 53 65 67 2f 32 29 20 2a 20 32 3b  er->nSeg/2) * 2;
12a30 0a 20 20 20 20 69 32 20 3d 20 69 31 20 2b 20 31  .    i2 = i1 + 1
12a40 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  ;.  }else{.    i
12a50 31 20 3d 20 70 49 74 65 72 2d 3e 61 46 69 72 73  1 = pIter->aFirs
12a60 74 5b 69 4f 75 74 2a 32 5d 2e 69 46 69 72 73 74  t[iOut*2].iFirst
12a70 3b 0a 20 20 20 20 69 32 20 3d 20 70 49 74 65 72  ;.    i2 = pIter
12a80 2d 3e 61 46 69 72 73 74 5b 69 4f 75 74 2a 32 2b  ->aFirst[iOut*2+
12a90 31 5d 2e 69 46 69 72 73 74 3b 0a 20 20 7d 0a 20  1].iFirst;.  }. 
12aa0 20 70 31 20 3d 20 26 70 49 74 65 72 2d 3e 61 53   p1 = &pIter->aS
12ab0 65 67 5b 69 31 5d 3b 0a 20 20 70 32 20 3d 20 26  eg[i1];.  p2 = &
12ac0 70 49 74 65 72 2d 3e 61 53 65 67 5b 69 32 5d 3b  pIter->aSeg[i2];
12ad0 0a 0a 20 20 70 52 65 73 2d 3e 62 54 65 72 6d 45  ..  pRes->bTermE
12ae0 71 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 31 2d  q = 0;.  if( p1-
12af0 3e 70 4c 65 61 66 3d 3d 30 20 29 7b 20 20 20 20  >pLeaf==0 ){    
12b00 20 20 20 20 20 20 20 2f 2a 20 49 66 20 70 31 20         /* If p1 
12b10 69 73 20 61 74 20 45 4f 46 20 2a 2f 0a 20 20 20  is at EOF */.   
12b20 20 69 52 65 73 20 3d 20 69 32 3b 0a 20 20 7d 65   iRes = i2;.  }e
12b30 6c 73 65 20 69 66 28 20 70 32 2d 3e 70 4c 65 61  lse if( p2->pLea
12b40 66 3d 3d 30 20 29 7b 20 20 20 20 20 2f 2a 20 49  f==0 ){     /* I
12b50 66 20 70 32 20 69 73 20 61 74 20 45 4f 46 20 2a  f p2 is at EOF *
12b60 2f 0a 20 20 20 20 69 52 65 73 20 3d 20 69 31 3b  /.    iRes = i1;
12b70 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e  .  }else{.    in
12b80 74 20 72 65 73 20 3d 20 66 74 73 35 42 75 66 66  t res = fts5Buff
12b90 65 72 43 6f 6d 70 61 72 65 28 26 70 31 2d 3e 74  erCompare(&p1->t
12ba0 65 72 6d 2c 20 26 70 32 2d 3e 74 65 72 6d 29 3b  erm, &p2->term);
12bb0 0a 20 20 20 20 69 66 28 20 72 65 73 3d 3d 30 20  .    if( res==0 
12bc0 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
12bd0 20 69 32 3e 69 31 20 29 3b 0a 20 20 20 20 20 20   i2>i1 );.      
12be0 61 73 73 65 72 74 28 20 69 32 21 3d 30 20 29 3b  assert( i2!=0 );
12bf0 0a 20 20 20 20 20 20 70 52 65 73 2d 3e 62 54 65  .      pRes->bTe
12c00 72 6d 45 71 20 3d 20 31 3b 0a 20 20 20 20 20 20  rmEq = 1;.      
12c10 69 66 28 20 70 31 2d 3e 69 52 6f 77 69 64 3d 3d  if( p1->iRowid==
12c20 70 32 2d 3e 69 52 6f 77 69 64 20 29 7b 0a 20 20  p2->iRowid ){.  
12c30 20 20 20 20 20 20 70 31 2d 3e 62 44 65 6c 20 3d        p1->bDel =
12c40 20 70 32 2d 3e 62 44 65 6c 3b 0a 20 20 20 20 20   p2->bDel;.     
12c50 20 20 20 72 65 74 75 72 6e 20 69 32 3b 0a 20 20     return i2;.  
12c60 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 73 20      }.      res 
12c70 3d 20 28 28 70 31 2d 3e 69 52 6f 77 69 64 20 3e  = ((p1->iRowid >
12c80 20 70 32 2d 3e 69 52 6f 77 69 64 29 3d 3d 70 49   p2->iRowid)==pI
12c90 74 65 72 2d 3e 62 52 65 76 29 20 3f 20 2d 31 20  ter->bRev) ? -1 
12ca0 3a 20 2b 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20  : +1;.    }.    
12cb0 61 73 73 65 72 74 28 20 72 65 73 21 3d 30 20 29  assert( res!=0 )
12cc0 3b 0a 20 20 20 20 69 66 28 20 72 65 73 3c 30 20  ;.    if( res<0 
12cd0 29 7b 0a 20 20 20 20 20 20 69 52 65 73 20 3d 20  ){.      iRes = 
12ce0 69 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  i1;.    }else{. 
12cf0 20 20 20 20 20 69 52 65 73 20 3d 20 69 32 3b 0a       iRes = i2;.
12d00 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 52 65      }.  }..  pRe
12d10 73 2d 3e 69 46 69 72 73 74 20 3d 20 69 52 65 73  s->iFirst = iRes
12d20 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  ;.  return 0;.}.
12d30 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20  ./*.** Move the 
12d40 73 65 67 2d 69 74 65 72 20 73 6f 20 74 68 61 74  seg-iter so that
12d50 20 69 74 20 70 6f 69 6e 74 73 20 74 6f 20 74 68   it points to th
12d60 65 20 66 69 72 73 74 20 72 6f 77 69 64 20 6f 6e  e first rowid on
12d70 20 70 61 67 65 20 69 4c 65 61 66 50 67 6e 6f 2e   page iLeafPgno.
12d80 0a 2a 2a 20 49 74 20 69 73 20 61 6e 20 65 72 72  .** It is an err
12d90 6f 72 20 69 66 20 6c 65 61 66 20 69 4c 65 61 66  or if leaf iLeaf
12da0 50 67 6e 6f 20 64 6f 65 73 20 6e 6f 74 20 65 78  Pgno does not ex
12db0 69 73 74 20 6f 72 20 63 6f 6e 74 61 69 6e 73 20  ist or contains 
12dc0 6e 6f 20 72 6f 77 69 64 73 2e 0a 2a 2f 0a 73 74  no rowids..*/.st
12dd0 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 53 65  atic void fts5Se
12de0 67 49 74 65 72 47 6f 74 6f 50 61 67 65 28 0a 20  gIterGotoPage(. 
12df0 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 20   Fts5Index *p,  
12e00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12e10 20 2f 2a 20 46 54 53 35 20 62 61 63 6b 65 6e 64   /* FTS5 backend
12e20 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 46 74 73   object */.  Fts
12e30 35 53 65 67 49 74 65 72 20 2a 70 49 74 65 72 2c  5SegIter *pIter,
12e40 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
12e50 49 74 65 72 61 74 6f 72 20 74 6f 20 61 64 76 61  Iterator to adva
12e60 6e 63 65 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 65  nce */.  int iLe
12e70 61 66 50 67 6e 6f 0a 29 7b 0a 20 20 61 73 73 65  afPgno.){.  asse
12e80 72 74 28 20 69 4c 65 61 66 50 67 6e 6f 3e 70 49  rt( iLeafPgno>pI
12e90 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 20 29  ter->iLeafPgno )
12ea0 3b 0a 0a 20 20 69 66 28 20 69 4c 65 61 66 50 67  ;..  if( iLeafPg
12eb0 6e 6f 3e 70 49 74 65 72 2d 3e 70 53 65 67 2d 3e  no>pIter->pSeg->
12ec0 70 67 6e 6f 4c 61 73 74 20 29 7b 0a 20 20 20 20  pgnoLast ){.    
12ed0 70 2d 3e 72 63 20 3d 20 46 54 53 35 5f 43 4f 52  p->rc = FTS5_COR
12ee0 52 55 50 54 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  RUPT;.  }else{. 
12ef0 20 20 20 66 74 73 35 44 61 74 61 52 65 6c 65 61     fts5DataRelea
12f00 73 65 28 70 49 74 65 72 2d 3e 70 4e 65 78 74 4c  se(pIter->pNextL
12f10 65 61 66 29 3b 0a 20 20 20 20 70 49 74 65 72 2d  eaf);.    pIter-
12f20 3e 70 4e 65 78 74 4c 65 61 66 20 3d 20 30 3b 0a  >pNextLeaf = 0;.
12f30 20 20 20 20 70 49 74 65 72 2d 3e 69 4c 65 61 66      pIter->iLeaf
12f40 50 67 6e 6f 20 3d 20 69 4c 65 61 66 50 67 6e 6f  Pgno = iLeafPgno
12f50 2d 31 3b 0a 20 20 20 20 66 74 73 35 53 65 67 49  -1;.    fts5SegI
12f60 74 65 72 4e 65 78 74 50 61 67 65 28 70 2c 20 70  terNextPage(p, p
12f70 49 74 65 72 29 3b 0a 20 20 20 20 61 73 73 65 72  Iter);.    asser
12f80 74 28 20 70 2d 3e 72 63 21 3d 53 51 4c 49 54 45  t( p->rc!=SQLITE
12f90 5f 4f 4b 20 7c 7c 20 70 49 74 65 72 2d 3e 69 4c  _OK || pIter->iL
12fa0 65 61 66 50 67 6e 6f 3d 3d 69 4c 65 61 66 50 67  eafPgno==iLeafPg
12fb0 6e 6f 20 29 3b 0a 0a 20 20 20 20 69 66 28 20 70  no );..    if( p
12fc0 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
12fd0 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 4f 66  ){.      int iOf
12fe0 66 3b 0a 20 20 20 20 20 20 75 38 20 2a 61 20 3d  f;.      u8 *a =
12ff0 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 70   pIter->pLeaf->p
13000 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 20 3d 20  ;.      int n = 
13010 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 73 7a  pIter->pLeaf->sz
13020 4c 65 61 66 3b 0a 0a 20 20 20 20 20 20 69 4f 66  Leaf;..      iOf
13030 66 20 3d 20 66 74 73 35 4c 65 61 66 46 69 72 73  f = fts5LeafFirs
13040 74 52 6f 77 69 64 4f 66 66 28 70 49 74 65 72 2d  tRowidOff(pIter-
13050 3e 70 4c 65 61 66 29 3b 0a 20 20 20 20 20 20 69  >pLeaf);.      i
13060 66 28 20 69 4f 66 66 3c 34 20 7c 7c 20 69 4f 66  f( iOff<4 || iOf
13070 66 3e 3d 6e 20 29 7b 0a 20 20 20 20 20 20 20 20  f>=n ){.        
13080 70 2d 3e 72 63 20 3d 20 46 54 53 35 5f 43 4f 52  p->rc = FTS5_COR
13090 52 55 50 54 3b 0a 20 20 20 20 20 20 7d 65 6c 73  RUPT;.      }els
130a0 65 7b 0a 20 20 20 20 20 20 20 20 69 4f 66 66 20  e{.        iOff 
130b0 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e 74  += fts5GetVarint
130c0 28 26 61 5b 69 4f 66 66 5d 2c 20 28 75 36 34 2a  (&a[iOff], (u64*
130d0 29 26 70 49 74 65 72 2d 3e 69 52 6f 77 69 64 29  )&pIter->iRowid)
130e0 3b 0a 20 20 20 20 20 20 20 20 70 49 74 65 72 2d  ;.        pIter-
130f0 3e 69 4c 65 61 66 4f 66 66 73 65 74 20 3d 20 69  >iLeafOffset = i
13100 4f 66 66 3b 0a 20 20 20 20 20 20 20 20 66 74 73  Off;.        fts
13110 35 53 65 67 49 74 65 72 4c 6f 61 64 4e 50 6f 73  5SegIterLoadNPos
13120 28 70 2c 20 70 49 74 65 72 29 3b 0a 20 20 20 20  (p, pIter);.    
13130 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a    }.    }.  }.}.
13140 0a 2f 2a 0a 2a 2a 20 41 64 76 61 6e 63 65 20 74  ./*.** Advance t
13150 68 65 20 69 74 65 72 61 74 6f 72 20 70 61 73 73  he iterator pass
13160 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64  ed as the second
13170 20 61 72 67 75 6d 65 6e 74 20 75 6e 74 69 6c 20   argument until 
13180 69 74 20 69 73 20 61 74 20 6f 72 20 0a 2a 2a 20  it is at or .** 
13190 70 61 73 74 20 72 6f 77 69 64 20 69 46 72 6f 6d  past rowid iFrom
131a0 2e 20 52 65 67 61 72 64 6c 65 73 73 20 6f 66 20  . Regardless of 
131b0 74 68 65 20 76 61 6c 75 65 20 6f 66 20 69 46 72  the value of iFr
131c0 6f 6d 2c 20 74 68 65 20 69 74 65 72 61 74 6f 72  om, the iterator
131d0 20 69 73 0a 2a 2a 20 61 6c 77 61 79 73 20 61 64   is.** always ad
131e0 76 61 6e 63 65 64 20 61 74 20 6c 65 61 73 74 20  vanced at least 
131f0 6f 6e 63 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  once..*/.static 
13200 76 6f 69 64 20 66 74 73 35 53 65 67 49 74 65 72  void fts5SegIter
13210 4e 65 78 74 46 72 6f 6d 28 0a 20 20 46 74 73 35  NextFrom(.  Fts5
13220 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20  Index *p,       
13230 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
13240 54 53 35 20 62 61 63 6b 65 6e 64 20 6f 62 6a 65  TS5 backend obje
13250 63 74 20 2a 2f 0a 20 20 46 74 73 35 53 65 67 49  ct */.  Fts5SegI
13260 74 65 72 20 2a 70 49 74 65 72 2c 20 20 20 20 20  ter *pIter,     
13270 20 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61          /* Itera
13280 74 6f 72 20 74 6f 20 61 64 76 61 6e 63 65 20 2a  tor to advance *
13290 2f 0a 20 20 69 36 34 20 69 4d 61 74 63 68 20 20  /.  i64 iMatch  
132a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
132b0 20 20 20 20 2f 2a 20 41 64 76 61 6e 63 65 20 69      /* Advance i
132c0 74 65 72 61 74 6f 72 20 61 74 20 6c 65 61 73 74  terator at least
132d0 20 74 68 69 73 20 66 61 72 20 2a 2f 0a 29 7b 0a   this far */.){.
132e0 20 20 69 6e 74 20 62 52 65 76 20 3d 20 28 70 49    int bRev = (pI
132f0 74 65 72 2d 3e 66 6c 61 67 73 20 26 20 46 54 53  ter->flags & FTS
13300 35 5f 53 45 47 49 54 45 52 5f 52 45 56 45 52 53  5_SEGITER_REVERS
13310 45 29 3b 0a 20 20 46 74 73 35 44 6c 69 64 78 49  E);.  Fts5DlidxI
13320 74 65 72 20 2a 70 44 6c 69 64 78 20 3d 20 70 49  ter *pDlidx = pI
13330 74 65 72 2d 3e 70 44 6c 69 64 78 3b 0a 20 20 69  ter->pDlidx;.  i
13340 6e 74 20 69 4c 65 61 66 50 67 6e 6f 20 3d 20 70  nt iLeafPgno = p
13350 49 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 3b  Iter->iLeafPgno;
13360 0a 20 20 69 6e 74 20 62 4d 6f 76 65 20 3d 20 31  .  int bMove = 1
13370 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 49 74  ;..  assert( pIt
13380 65 72 2d 3e 66 6c 61 67 73 20 26 20 46 54 53 35  er->flags & FTS5
13390 5f 53 45 47 49 54 45 52 5f 4f 4e 45 54 45 52 4d  _SEGITER_ONETERM
133a0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 49   );.  assert( pI
133b0 74 65 72 2d 3e 70 44 6c 69 64 78 20 29 3b 0a 20  ter->pDlidx );. 
133c0 20 61 73 73 65 72 74 28 20 70 49 74 65 72 2d 3e   assert( pIter->
133d0 70 4c 65 61 66 20 29 3b 0a 0a 20 20 69 66 28 20  pLeaf );..  if( 
133e0 62 52 65 76 3d 3d 30 20 29 7b 0a 20 20 20 20 77  bRev==0 ){.    w
133f0 68 69 6c 65 28 20 21 66 74 73 35 44 6c 69 64 78  hile( !fts5Dlidx
13400 49 74 65 72 45 6f 66 28 70 2c 20 70 44 6c 69 64  IterEof(p, pDlid
13410 78 29 20 26 26 20 69 4d 61 74 63 68 3e 66 74 73  x) && iMatch>fts
13420 35 44 6c 69 64 78 49 74 65 72 52 6f 77 69 64 28  5DlidxIterRowid(
13430 70 44 6c 69 64 78 29 20 29 7b 0a 20 20 20 20 20  pDlidx) ){.     
13440 20 69 4c 65 61 66 50 67 6e 6f 20 3d 20 66 74 73   iLeafPgno = fts
13450 35 44 6c 69 64 78 49 74 65 72 50 67 6e 6f 28 70  5DlidxIterPgno(p
13460 44 6c 69 64 78 29 3b 0a 20 20 20 20 20 20 66 74  Dlidx);.      ft
13470 73 35 44 6c 69 64 78 49 74 65 72 4e 65 78 74 28  s5DlidxIterNext(
13480 70 2c 20 70 44 6c 69 64 78 29 3b 0a 20 20 20 20  p, pDlidx);.    
13490 7d 0a 20 20 20 20 61 73 73 65 72 74 5f 6e 63 28  }.    assert_nc(
134a0 20 69 4c 65 61 66 50 67 6e 6f 3e 3d 70 49 74 65   iLeafPgno>=pIte
134b0 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 20 7c 7c 20  r->iLeafPgno || 
134c0 70 2d 3e 72 63 20 29 3b 0a 20 20 20 20 69 66 28  p->rc );.    if(
134d0 20 69 4c 65 61 66 50 67 6e 6f 3e 70 49 74 65 72   iLeafPgno>pIter
134e0 2d 3e 69 4c 65 61 66 50 67 6e 6f 20 29 7b 0a 20  ->iLeafPgno ){. 
134f0 20 20 20 20 20 66 74 73 35 53 65 67 49 74 65 72       fts5SegIter
13500 47 6f 74 6f 50 61 67 65 28 70 2c 20 70 49 74 65  GotoPage(p, pIte
13510 72 2c 20 69 4c 65 61 66 50 67 6e 6f 29 3b 0a 20  r, iLeafPgno);. 
13520 20 20 20 20 20 62 4d 6f 76 65 20 3d 20 30 3b 0a       bMove = 0;.
13530 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
13540 20 20 20 61 73 73 65 72 74 28 20 70 49 74 65 72     assert( pIter
13550 2d 3e 70 4e 65 78 74 4c 65 61 66 3d 3d 30 20 29  ->pNextLeaf==0 )
13560 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 4d  ;.    assert( iM
13570 61 74 63 68 3c 70 49 74 65 72 2d 3e 69 52 6f 77  atch<pIter->iRow
13580 69 64 20 29 3b 0a 20 20 20 20 77 68 69 6c 65 28  id );.    while(
13590 20 21 66 74 73 35 44 6c 69 64 78 49 74 65 72 45   !fts5DlidxIterE
135a0 6f 66 28 70 2c 20 70 44 6c 69 64 78 29 20 26 26  of(p, pDlidx) &&
135b0 20 69 4d 61 74 63 68 3c 66 74 73 35 44 6c 69 64   iMatch<fts5Dlid
135c0 78 49 74 65 72 52 6f 77 69 64 28 70 44 6c 69 64  xIterRowid(pDlid
135d0 78 29 20 29 7b 0a 20 20 20 20 20 20 66 74 73 35  x) ){.      fts5
135e0 44 6c 69 64 78 49 74 65 72 50 72 65 76 28 70 2c  DlidxIterPrev(p,
135f0 20 70 44 6c 69 64 78 29 3b 0a 20 20 20 20 7d 0a   pDlidx);.    }.
13600 20 20 20 20 69 4c 65 61 66 50 67 6e 6f 20 3d 20      iLeafPgno = 
13610 66 74 73 35 44 6c 69 64 78 49 74 65 72 50 67 6e  fts5DlidxIterPgn
13620 6f 28 70 44 6c 69 64 78 29 3b 0a 0a 20 20 20 20  o(pDlidx);..    
13630 61 73 73 65 72 74 28 20 66 74 73 35 44 6c 69 64  assert( fts5Dlid
13640 78 49 74 65 72 45 6f 66 28 70 2c 20 70 44 6c 69  xIterEof(p, pDli
13650 64 78 29 20 7c 7c 20 69 4c 65 61 66 50 67 6e 6f  dx) || iLeafPgno
13660 3c 3d 70 49 74 65 72 2d 3e 69 4c 65 61 66 50 67  <=pIter->iLeafPg
13670 6e 6f 20 29 3b 0a 0a 20 20 20 20 69 66 28 20 69  no );..    if( i
13680 4c 65 61 66 50 67 6e 6f 3c 70 49 74 65 72 2d 3e  LeafPgno<pIter->
13690 69 4c 65 61 66 50 67 6e 6f 20 29 7b 0a 20 20 20  iLeafPgno ){.   
136a0 20 20 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 50     pIter->iLeafP
136b0 67 6e 6f 20 3d 20 69 4c 65 61 66 50 67 6e 6f 2b  gno = iLeafPgno+
136c0 31 3b 0a 20 20 20 20 20 20 66 74 73 35 53 65 67  1;.      fts5Seg
136d0 49 74 65 72 52 65 76 65 72 73 65 4e 65 77 50 61  IterReverseNewPa
136e0 67 65 28 70 2c 20 70 49 74 65 72 29 3b 0a 20 20  ge(p, pIter);.  
136f0 20 20 20 20 62 4d 6f 76 65 20 3d 20 30 3b 0a 20      bMove = 0;. 
13700 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 64 6f 7b 0a     }.  }..  do{.
13710 20 20 20 20 69 66 28 20 62 4d 6f 76 65 20 29 20      if( bMove ) 
13720 66 74 73 35 53 65 67 49 74 65 72 4e 65 78 74 28  fts5SegIterNext(
13730 70 2c 20 70 49 74 65 72 2c 20 30 29 3b 0a 20 20  p, pIter, 0);.  
13740 20 20 69 66 28 20 70 49 74 65 72 2d 3e 70 4c 65    if( pIter->pLe
13750 61 66 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20  af==0 ) break;. 
13760 20 20 20 69 66 28 20 62 52 65 76 3d 3d 30 20 26     if( bRev==0 &
13770 26 20 70 49 74 65 72 2d 3e 69 52 6f 77 69 64 3e  & pIter->iRowid>
13780 3d 69 4d 61 74 63 68 20 29 20 62 72 65 61 6b 3b  =iMatch ) break;
13790 0a 20 20 20 20 69 66 28 20 62 52 65 76 21 3d 30  .    if( bRev!=0
137a0 20 26 26 20 70 49 74 65 72 2d 3e 69 52 6f 77 69   && pIter->iRowi
137b0 64 3c 3d 69 4d 61 74 63 68 20 29 20 62 72 65 61  d<=iMatch ) brea
137c0 6b 3b 0a 20 20 20 20 62 4d 6f 76 65 20 3d 20 31  k;.    bMove = 1
137d0 3b 0a 20 20 7d 77 68 69 6c 65 28 20 70 2d 3e 72  ;.  }while( p->r
137e0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  c==SQLITE_OK );.
137f0 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 74  }.../*.** Free t
13800 68 65 20 69 74 65 72 61 74 6f 72 20 6f 62 6a 65  he iterator obje
13810 63 74 20 70 61 73 73 65 64 20 61 73 20 74 68 65  ct passed as the
13820 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
13830 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
13840 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 46 72   fts5MultiIterFr
13850 65 65 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c  ee(Fts5Index *p,
13860 20 46 74 73 35 49 6e 64 65 78 49 74 65 72 20 2a   Fts5IndexIter *
13870 70 49 74 65 72 29 7b 0a 20 20 69 66 28 20 70 49  pIter){.  if( pI
13880 74 65 72 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  ter ){.    int i
13890 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
138a0 3c 70 49 74 65 72 2d 3e 6e 53 65 67 3b 20 69 2b  <pIter->nSeg; i+
138b0 2b 29 7b 0a 20 20 20 20 20 20 66 74 73 35 53 65  +){.      fts5Se
138c0 67 49 74 65 72 43 6c 65 61 72 28 26 70 49 74 65  gIterClear(&pIte
138d0 72 2d 3e 61 53 65 67 5b 69 5d 29 3b 0a 20 20 20  r->aSeg[i]);.   
138e0 20 7d 0a 20 20 20 20 66 74 73 35 53 74 72 75 63   }.    fts5Struc
138f0 74 75 72 65 52 65 6c 65 61 73 65 28 70 49 74 65  tureRelease(pIte
13900 72 2d 3e 70 53 74 72 75 63 74 29 3b 0a 20 20 20  r->pStruct);.   
13910 20 66 74 73 35 42 75 66 66 65 72 46 72 65 65 28   fts5BufferFree(
13920 26 70 49 74 65 72 2d 3e 70 6f 73 6c 69 73 74 29  &pIter->poslist)
13930 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ;.    sqlite3_fr
13940 65 65 28 70 49 74 65 72 29 3b 0a 20 20 7d 0a 7d  ee(pIter);.  }.}
13950 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  ..static void ft
13960 73 35 4d 75 6c 74 69 49 74 65 72 41 64 76 61 6e  s5MultiIterAdvan
13970 63 65 64 28 0a 20 20 46 74 73 35 49 6e 64 65 78  ced(.  Fts5Index
13980 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
13990 20 20 20 20 20 20 20 2f 2a 20 46 54 53 35 20 62         /* FTS5 b
139a0 61 63 6b 65 6e 64 20 74 6f 20 69 74 65 72 61 74  ackend to iterat
139b0 65 20 77 69 74 68 69 6e 20 2a 2f 0a 20 20 46 74  e within */.  Ft
139c0 73 35 49 6e 64 65 78 49 74 65 72 20 2a 70 49 74  s5IndexIter *pIt
139d0 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  er,           /*
139e0 20 49 74 65 72 61 74 6f 72 20 74 6f 20 75 70 64   Iterator to upd
139f0 61 74 65 20 61 46 69 72 73 74 5b 5d 20 61 72 72  ate aFirst[] arr
13a00 61 79 20 66 6f 72 20 2a 2f 0a 20 20 69 6e 74 20  ay for */.  int 
13a10 69 43 68 61 6e 67 65 64 2c 20 20 20 20 20 20 20  iChanged,       
13a20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
13a30 6e 64 65 78 20 6f 66 20 73 75 62 2d 69 74 65 72  ndex of sub-iter
13a40 61 74 6f 72 20 6a 75 73 74 20 61 64 76 61 6e 63  ator just advanc
13a50 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69 4d 69 6e  ed */.  int iMin
13a60 73 65 74 20 20 20 20 20 20 20 20 20 20 20 20 20  set             
13a70 20 20 20 20 20 20 20 20 2f 2a 20 4d 69 6e 69 6d          /* Minim
13a80 75 6d 20 65 6e 74 72 79 20 69 6e 20 61 46 69 72  um entry in aFir
13a90 73 74 5b 5d 20 74 6f 20 73 65 74 20 2a 2f 0a 29  st[] to set */.)
13aa0 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72  {.  int i;.  for
13ab0 28 69 3d 28 70 49 74 65 72 2d 3e 6e 53 65 67 2b  (i=(pIter->nSeg+
13ac0 69 43 68 61 6e 67 65 64 29 2f 32 3b 20 69 3e 3d  iChanged)/2; i>=
13ad0 69 4d 69 6e 73 65 74 20 26 26 20 70 2d 3e 72 63  iMinset && p->rc
13ae0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20 69 3d 69  ==SQLITE_OK; i=i
13af0 2f 32 29 7b 0a 20 20 20 20 69 6e 74 20 69 45 71  /2){.    int iEq
13b00 3b 0a 20 20 20 20 69 66 28 20 28 69 45 71 20 3d  ;.    if( (iEq =
13b10 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 44 6f   fts5MultiIterDo
13b20 43 6f 6d 70 61 72 65 28 70 49 74 65 72 2c 20 69  Compare(pIter, i
13b30 29 29 20 29 7b 0a 20 20 20 20 20 20 66 74 73 35  )) ){.      fts5
13b40 53 65 67 49 74 65 72 4e 65 78 74 28 70 2c 20 26  SegIterNext(p, &
13b50 70 49 74 65 72 2d 3e 61 53 65 67 5b 69 45 71 5d  pIter->aSeg[iEq]
13b60 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 20 3d 20  , 0);.      i = 
13b70 70 49 74 65 72 2d 3e 6e 53 65 67 20 2b 20 69 45  pIter->nSeg + iE
13b80 71 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  q;.    }.  }.}..
13b90 2f 2a 0a 2a 2a 20 53 75 62 2d 69 74 65 72 61 74  /*.** Sub-iterat
13ba0 6f 72 20 69 43 68 61 6e 67 65 64 20 6f 66 20 69  or iChanged of i
13bb0 74 65 72 61 74 6f 72 20 70 49 74 65 72 20 68 61  terator pIter ha
13bc0 73 20 6a 75 73 74 20 62 65 65 6e 20 61 64 76 61  s just been adva
13bd0 6e 63 65 64 2e 20 49 74 20 73 74 69 6c 6c 0a 2a  nced. It still.*
13be0 2a 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20  * points to the 
13bf0 73 61 6d 65 20 74 65 72 6d 20 74 68 6f 75 67 68  same term though
13c00 20 2d 20 6a 75 73 74 20 61 20 64 69 66 66 65 72   - just a differ
13c10 65 6e 74 20 72 6f 77 69 64 2e 20 54 68 69 73 20  ent rowid. This 
13c20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 61 74 74 65  function.** atte
13c30 6d 70 74 73 20 74 6f 20 75 70 64 61 74 65 20 74  mpts to update t
13c40 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  he contents of t
13c50 68 65 20 70 49 74 65 72 2d 3e 61 46 69 72 73 74  he pIter->aFirst
13c60 5b 5d 20 61 63 63 6f 72 64 69 6e 67 6c 79 2e 0a  [] accordingly..
13c70 2a 2a 20 49 66 20 69 74 20 64 6f 65 73 20 73 6f  ** If it does so
13c80 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2c 20 30   successfully, 0
13c90 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74   is returned. Ot
13ca0 68 65 72 77 69 73 65 20 31 2e 0a 2a 2a 0a 2a 2a  herwise 1..**.**
13cb0 20 49 66 20 6e 6f 6e 2d 7a 65 72 6f 20 69 73 20   If non-zero is 
13cc0 72 65 74 75 72 6e 65 64 2c 20 74 68 65 20 63 61  returned, the ca
13cd0 6c 6c 65 72 20 73 68 6f 75 6c 64 20 63 61 6c 6c  ller should call
13ce0 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 41 64   fts5MultiIterAd
13cf0 76 61 6e 63 65 64 28 29 0a 2a 2a 20 6f 6e 20 74  vanced().** on t
13d00 68 65 20 69 74 65 72 61 74 6f 72 20 69 6e 73 74  he iterator inst
13d10 65 61 64 2e 20 54 68 61 74 20 66 75 6e 63 74 69  ead. That functi
13d20 6f 6e 20 64 6f 65 73 20 74 68 65 20 73 61 6d 65  on does the same
13d30 20 61 73 20 74 68 69 73 20 6f 6e 65 2c 20 65 78   as this one, ex
13d40 63 65 70 74 0a 2a 2a 20 74 68 61 74 20 69 74 20  cept.** that it 
13d50 64 65 61 6c 73 20 77 69 74 68 20 6d 6f 72 65 20  deals with more 
13d60 63 6f 6d 70 6c 69 63 61 74 65 64 20 63 61 73 65  complicated case
13d70 73 20 61 73 20 77 65 6c 6c 2e 0a 2a 2f 20 0a 73  s as well..*/ .s
13d80 74 61 74 69 63 20 69 6e 74 20 66 74 73 35 4d 75  tatic int fts5Mu
13d90 6c 74 69 49 74 65 72 41 64 76 61 6e 63 65 52 6f  ltiIterAdvanceRo
13da0 77 69 64 28 0a 20 20 46 74 73 35 49 6e 64 65 78  wid(.  Fts5Index
13db0 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
13dc0 20 20 20 20 20 20 20 2f 2a 20 46 54 53 35 20 62         /* FTS5 b
13dd0 61 63 6b 65 6e 64 20 74 6f 20 69 74 65 72 61 74  ackend to iterat
13de0 65 20 77 69 74 68 69 6e 20 2a 2f 0a 20 20 46 74  e within */.  Ft
13df0 73 35 49 6e 64 65 78 49 74 65 72 20 2a 70 49 74  s5IndexIter *pIt
13e00 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  er,           /*
13e10 20 49 74 65 72 61 74 6f 72 20 74 6f 20 75 70 64   Iterator to upd
13e20 61 74 65 20 61 46 69 72 73 74 5b 5d 20 61 72 72  ate aFirst[] arr
13e30 61 79 20 66 6f 72 20 2a 2f 0a 20 20 69 6e 74 20  ay for */.  int 
13e40 69 43 68 61 6e 67 65 64 20 20 20 20 20 20 20 20  iChanged        
13e50 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
13e60 6e 64 65 78 20 6f 66 20 73 75 62 2d 69 74 65 72  ndex of sub-iter
13e70 61 74 6f 72 20 6a 75 73 74 20 61 64 76 61 6e 63  ator just advanc
13e80 65 64 20 2a 2f 0a 29 7b 0a 20 20 46 74 73 35 53  ed */.){.  Fts5S
13e90 65 67 49 74 65 72 20 2a 70 4e 65 77 20 3d 20 26  egIter *pNew = &
13ea0 70 49 74 65 72 2d 3e 61 53 65 67 5b 69 43 68 61  pIter->aSeg[iCha
13eb0 6e 67 65 64 5d 3b 0a 0a 20 20 69 66 28 20 70 4e  nged];..  if( pN
13ec0 65 77 2d 3e 69 52 6f 77 69 64 3d 3d 70 49 74 65  ew->iRowid==pIte
13ed0 72 2d 3e 69 53 77 69 74 63 68 52 6f 77 69 64 0a  r->iSwitchRowid.
13ee0 20 20 20 7c 7c 20 28 70 4e 65 77 2d 3e 69 52 6f     || (pNew->iRo
13ef0 77 69 64 3c 70 49 74 65 72 2d 3e 69 53 77 69 74  wid<pIter->iSwit
13f00 63 68 52 6f 77 69 64 29 3d 3d 70 49 74 65 72 2d  chRowid)==pIter-
13f10 3e 62 52 65 76 0a 20 20 29 7b 0a 20 20 20 20 69  >bRev.  ){.    i
13f20 6e 74 20 69 3b 0a 20 20 20 20 46 74 73 35 53 65  nt i;.    Fts5Se
13f30 67 49 74 65 72 20 2a 70 4f 74 68 65 72 20 3d 20  gIter *pOther = 
13f40 26 70 49 74 65 72 2d 3e 61 53 65 67 5b 69 43 68  &pIter->aSeg[iCh
13f50 61 6e 67 65 64 20 5e 20 30 78 30 30 30 31 5d 3b  anged ^ 0x0001];
13f60 0a 20 20 20 20 70 49 74 65 72 2d 3e 69 53 77 69  .    pIter->iSwi
13f70 74 63 68 52 6f 77 69 64 20 3d 20 70 49 74 65 72  tchRowid = pIter
13f80 2d 3e 62 52 65 76 20 3f 20 53 4d 41 4c 4c 45 53  ->bRev ? SMALLES
13f90 54 5f 49 4e 54 36 34 20 3a 20 4c 41 52 47 45 53  T_INT64 : LARGES
13fa0 54 5f 49 4e 54 36 34 3b 0a 20 20 20 20 66 6f 72  T_INT64;.    for
13fb0 28 69 3d 28 70 49 74 65 72 2d 3e 6e 53 65 67 2b  (i=(pIter->nSeg+
13fc0 69 43 68 61 6e 67 65 64 29 2f 32 3b 20 31 3b 20  iChanged)/2; 1; 
13fd0 69 3d 69 2f 32 29 7b 0a 20 20 20 20 20 20 46 74  i=i/2){.      Ft
13fe0 73 35 43 52 65 73 75 6c 74 20 2a 70 52 65 73 20  s5CResult *pRes 
13ff0 3d 20 26 70 49 74 65 72 2d 3e 61 46 69 72 73 74  = &pIter->aFirst
14000 5b 69 5d 3b 0a 0a 20 20 20 20 20 20 61 73 73 65  [i];..      asse
14010 72 74 28 20 70 4e 65 77 2d 3e 70 4c 65 61 66 20  rt( pNew->pLeaf 
14020 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
14030 20 70 52 65 73 2d 3e 62 54 65 72 6d 45 71 3d 3d   pRes->bTermEq==
14040 30 20 7c 7c 20 70 4f 74 68 65 72 2d 3e 70 4c 65  0 || pOther->pLe
14050 61 66 20 29 3b 0a 0a 20 20 20 20 20 20 69 66 28  af );..      if(
14060 20 70 52 65 73 2d 3e 62 54 65 72 6d 45 71 20 29   pRes->bTermEq )
14070 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4e  {.        if( pN
14080 65 77 2d 3e 69 52 6f 77 69 64 3d 3d 70 4f 74 68  ew->iRowid==pOth
14090 65 72 2d 3e 69 52 6f 77 69 64 20 29 7b 0a 20 20  er->iRowid ){.  
140a0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 31          return 1
140b0 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20  ;.        }else 
140c0 69 66 28 20 28 70 4f 74 68 65 72 2d 3e 69 52 6f  if( (pOther->iRo
140d0 77 69 64 3e 70 4e 65 77 2d 3e 69 52 6f 77 69 64  wid>pNew->iRowid
140e0 29 3d 3d 70 49 74 65 72 2d 3e 62 52 65 76 20 29  )==pIter->bRev )
140f0 7b 0a 20 20 20 20 20 20 20 20 20 20 70 49 74 65  {.          pIte
14100 72 2d 3e 69 53 77 69 74 63 68 52 6f 77 69 64 20  r->iSwitchRowid 
14110 3d 20 70 4f 74 68 65 72 2d 3e 69 52 6f 77 69 64  = pOther->iRowid
14120 3b 0a 20 20 20 20 20 20 20 20 20 20 70 4e 65 77  ;.          pNew
14130 20 3d 20 70 4f 74 68 65 72 3b 0a 20 20 20 20 20   = pOther;.     
14140 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28 70 4f     }else if( (pO
14150 74 68 65 72 2d 3e 69 52 6f 77 69 64 3e 70 49 74  ther->iRowid>pIt
14160 65 72 2d 3e 69 53 77 69 74 63 68 52 6f 77 69 64  er->iSwitchRowid
14170 29 3d 3d 70 49 74 65 72 2d 3e 62 52 65 76 20 29  )==pIter->bRev )
14180 7b 0a 20 20 20 20 20 20 20 20 20 20 70 49 74 65  {.          pIte
14190 72 2d 3e 69 53 77 69 74 63 68 52 6f 77 69 64 20  r->iSwitchRowid 
141a0 3d 20 70 4f 74 68 65 72 2d 3e 69 52 6f 77 69 64  = pOther->iRowid
141b0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
141c0 20 20 7d 0a 20 20 20 20 20 20 70 52 65 73 2d 3e    }.      pRes->
141d0 69 46 69 72 73 74 20 3d 20 28 70 4e 65 77 20 2d  iFirst = (pNew -
141e0 20 70 49 74 65 72 2d 3e 61 53 65 67 29 3b 0a 20   pIter->aSeg);. 
141f0 20 20 20 20 20 69 66 28 20 69 3d 3d 31 20 29 20       if( i==1 ) 
14200 62 72 65 61 6b 3b 0a 0a 20 20 20 20 20 20 70 4f  break;..      pO
14210 74 68 65 72 20 3d 20 26 70 49 74 65 72 2d 3e 61  ther = &pIter->a
14220 53 65 67 5b 20 70 49 74 65 72 2d 3e 61 46 69 72  Seg[ pIter->aFir
14230 73 74 5b 69 20 5e 20 30 78 30 30 30 31 5d 2e 69  st[i ^ 0x0001].i
14240 46 69 72 73 74 20 5d 3b 0a 20 20 20 20 7d 0a 20  First ];.    }. 
14250 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a   }..  return 0;.
14260 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65  }../*.** Set the
14270 20 70 49 74 65 72 2d 3e 62 45 6f 66 20 76 61 72   pIter->bEof var
14280 69 61 62 6c 65 20 62 61 73 65 64 20 6f 6e 20 74  iable based on t
14290 68 65 20 73 74 61 74 65 20 6f 66 20 74 68 65 20  he state of the 
142a0 73 75 62 2d 69 74 65 72 61 74 6f 72 73 2e 0a 2a  sub-iterators..*
142b0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  /.static void ft
142c0 73 35 4d 75 6c 74 69 49 74 65 72 53 65 74 45 6f  s5MultiIterSetEo
142d0 66 28 46 74 73 35 49 6e 64 65 78 49 74 65 72 20  f(Fts5IndexIter 
142e0 2a 70 49 74 65 72 29 7b 0a 20 20 46 74 73 35 53  *pIter){.  Fts5S
142f0 65 67 49 74 65 72 20 2a 70 53 65 67 20 3d 20 26  egIter *pSeg = &
14300 70 49 74 65 72 2d 3e 61 53 65 67 5b 20 70 49 74  pIter->aSeg[ pIt
14310 65 72 2d 3e 61 46 69 72 73 74 5b 31 5d 2e 69 46  er->aFirst[1].iF
14320 69 72 73 74 20 5d 3b 0a 20 20 70 49 74 65 72 2d  irst ];.  pIter-
14330 3e 62 45 6f 66 20 3d 20 70 53 65 67 2d 3e 70 4c  >bEof = pSeg->pL
14340 65 61 66 3d 3d 30 3b 0a 20 20 70 49 74 65 72 2d  eaf==0;.  pIter-
14350 3e 69 53 77 69 74 63 68 52 6f 77 69 64 20 3d 20  >iSwitchRowid = 
14360 70 53 65 67 2d 3e 69 52 6f 77 69 64 3b 0a 7d 0a  pSeg->iRowid;.}.
14370 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20  ./*.** Move the 
14380 69 74 65 72 61 74 6f 72 20 74 6f 20 74 68 65 20  iterator to the 
14390 6e 65 78 74 20 65 6e 74 72 79 2e 20 0a 2a 2a 0a  next entry. .**.
143a0 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  ** If an error o
143b0 63 63 75 72 73 2c 20 61 6e 20 65 72 72 6f 72 20  ccurs, an error 
143c0 63 6f 64 65 20 69 73 20 6c 65 66 74 20 69 6e 20  code is left in 
143d0 46 74 73 35 49 6e 64 65 78 2e 72 63 2e 20 49 74  Fts5Index.rc. It
143e0 20 69 73 20 6e 6f 74 20 0a 2a 2a 20 63 6f 6e 73   is not .** cons
143f0 69 64 65 72 65 64 20 61 6e 20 65 72 72 6f 72 20  idered an error 
14400 69 66 20 74 68 65 20 69 74 65 72 61 74 6f 72 20  if the iterator 
14410 72 65 61 63 68 65 73 20 45 4f 46 2c 20 6f 72 20  reaches EOF, or 
14420 69 66 20 69 74 20 69 73 20 61 6c 72 65 61 64 79  if it is already
14430 20 61 74 20 0a 2a 2a 20 45 4f 46 20 77 68 65 6e   at .** EOF when
14440 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
14450 73 20 63 61 6c 6c 65 64 2e 0a 2a 2f 0a 73 74 61  s called..*/.sta
14460 74 69 63 20 76 6f 69 64 20 66 74 73 35 4d 75 6c  tic void fts5Mul
14470 74 69 49 74 65 72 4e 65 78 74 28 0a 20 20 46 74  tiIterNext(.  Ft
14480 73 35 49 6e 64 65 78 20 2a 70 2c 20 0a 20 20 46  s5Index *p, .  F
14490 74 73 35 49 6e 64 65 78 49 74 65 72 20 2a 70 49  ts5IndexIter *pI
144a0 74 65 72 2c 0a 20 20 69 6e 74 20 62 46 72 6f 6d  ter,.  int bFrom
144b0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
144c0 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
144d0 66 20 61 72 67 75 6d 65 6e 74 20 69 46 72 6f 6d  f argument iFrom
144e0 20 69 73 20 76 61 6c 69 64 20 2a 2f 0a 20 20 69   is valid */.  i
144f0 36 34 20 69 46 72 6f 6d 20 20 20 20 20 20 20 20  64 iFrom        
14500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
14510 2a 20 41 64 76 61 6e 63 65 20 61 74 20 6c 65 61  * Advance at lea
14520 73 74 20 61 73 20 66 61 72 20 61 73 20 74 68 69  st as far as thi
14530 73 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 70 2d  s */.){.  if( p-
14540 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  >rc==SQLITE_OK )
14550 7b 0a 20 20 20 20 69 6e 74 20 62 55 73 65 46 72  {.    int bUseFr
14560 6f 6d 20 3d 20 62 46 72 6f 6d 3b 0a 20 20 20 20  om = bFrom;.    
14570 64 6f 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  do {.      int i
14580 46 69 72 73 74 20 3d 20 70 49 74 65 72 2d 3e 61  First = pIter->a
14590 46 69 72 73 74 5b 31 5d 2e 69 46 69 72 73 74 3b  First[1].iFirst;
145a0 0a 20 20 20 20 20 20 69 6e 74 20 62 4e 65 77 54  .      int bNewT
145b0 65 72 6d 20 3d 20 30 3b 0a 20 20 20 20 20 20 46  erm = 0;.      F
145c0 74 73 35 53 65 67 49 74 65 72 20 2a 70 53 65 67  ts5SegIter *pSeg
145d0 20 3d 20 26 70 49 74 65 72 2d 3e 61 53 65 67 5b   = &pIter->aSeg[
145e0 69 46 69 72 73 74 5d 3b 0a 20 20 20 20 20 20 61  iFirst];.      a
145f0 73 73 65 72 74 28 20 70 2d 3e 72 63 3d 3d 53 51  ssert( p->rc==SQ
14600 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20  LITE_OK );.     
14610 20 69 66 28 20 62 55 73 65 46 72 6f 6d 20 26 26   if( bUseFrom &&
14620 20 70 53 65 67 2d 3e 70 44 6c 69 64 78 20 29 7b   pSeg->pDlidx ){
14630 0a 20 20 20 20 20 20 20 20 66 74 73 35 53 65 67  .        fts5Seg
14640 49 74 65 72 4e 65 78 74 46 72 6f 6d 28 70 2c 20  IterNextFrom(p, 
14650 70 53 65 67 2c 20 69 46 72 6f 6d 29 3b 0a 20 20  pSeg, iFrom);.  
14660 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
14670 20 20 20 66 74 73 35 53 65 67 49 74 65 72 4e 65     fts5SegIterNe
14680 78 74 28 70 2c 20 70 53 65 67 2c 20 26 62 4e 65  xt(p, pSeg, &bNe
14690 77 54 65 72 6d 29 3b 0a 20 20 20 20 20 20 7d 0a  wTerm);.      }.
146a0 0a 20 20 20 20 20 20 69 66 28 20 70 53 65 67 2d  .      if( pSeg-
146b0 3e 70 4c 65 61 66 3d 3d 30 20 7c 7c 20 62 4e 65  >pLeaf==0 || bNe
146c0 77 54 65 72 6d 20 0a 20 20 20 20 20 20 20 7c 7c  wTerm .       ||
146d0 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 41 64   fts5MultiIterAd
146e0 76 61 6e 63 65 52 6f 77 69 64 28 70 2c 20 70 49  vanceRowid(p, pI
146f0 74 65 72 2c 20 69 46 69 72 73 74 29 0a 20 20 20  ter, iFirst).   
14700 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 66 74     ){.        ft
14710 73 35 4d 75 6c 74 69 49 74 65 72 41 64 76 61 6e  s5MultiIterAdvan
14720 63 65 64 28 70 2c 20 70 49 74 65 72 2c 20 69 46  ced(p, pIter, iF
14730 69 72 73 74 2c 20 31 29 3b 0a 20 20 20 20 20 20  irst, 1);.      
14740 20 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 53    fts5MultiIterS
14750 65 74 45 6f 66 28 70 49 74 65 72 29 3b 0a 20 20  etEof(pIter);.  
14760 20 20 20 20 7d 0a 20 20 20 20 20 20 66 74 73 35      }.      fts5
14770 41 73 73 65 72 74 4d 75 6c 74 69 49 74 65 72 53  AssertMultiIterS
14780 65 74 75 70 28 70 2c 20 70 49 74 65 72 29 3b 0a  etup(p, pIter);.
14790 0a 20 20 20 20 20 20 62 55 73 65 46 72 6f 6d 20  .      bUseFrom 
147a0 3d 20 30 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28  = 0;.    }while(
147b0 20 70 49 74 65 72 2d 3e 62 53 6b 69 70 45 6d 70   pIter->bSkipEmp
147c0 74 79 20 26 26 20 66 74 73 35 4d 75 6c 74 69 49  ty && fts5MultiI
147d0 74 65 72 49 73 45 6d 70 74 79 28 70 2c 20 70 49  terIsEmpty(p, pI
147e0 74 65 72 29 20 29 3b 0a 20 20 7d 0a 7d 0a 0a 73  ter) );.  }.}..s
147f0 74 61 74 69 63 20 46 74 73 35 49 6e 64 65 78 49  tatic Fts5IndexI
14800 74 65 72 20 2a 66 74 73 35 4d 75 6c 74 69 49 74  ter *fts5MultiIt
14810 65 72 41 6c 6c 6f 63 28 0a 20 20 46 74 73 35 49  erAlloc(.  Fts5I
14820 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20  ndex *p,        
14830 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54             /* FT
14840 53 35 20 62 61 63 6b 65 6e 64 20 74 6f 20 69 74  S5 backend to it
14850 65 72 61 74 65 20 77 69 74 68 69 6e 20 2a 2f 0a  erate within */.
14860 20 20 69 6e 74 20 6e 53 65 67 0a 29 7b 0a 20 20    int nSeg.){.  
14870 46 74 73 35 49 6e 64 65 78 49 74 65 72 20 2a 70  Fts5IndexIter *p
14880 4e 65 77 3b 0a 20 20 69 6e 74 20 6e 53 6c 6f 74  New;.  int nSlot
14890 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
148a0 20 20 20 20 20 20 20 2f 2a 20 50 6f 77 65 72 20         /* Power 
148b0 6f 66 20 74 77 6f 20 3e 3d 20 6e 53 65 67 20 2a  of two >= nSeg *
148c0 2f 0a 0a 20 20 66 6f 72 28 6e 53 6c 6f 74 3d 32  /..  for(nSlot=2
148d0 3b 20 6e 53 6c 6f 74 3c 6e 53 65 67 3b 20 6e 53  ; nSlot<nSeg; nS
148e0 6c 6f 74 3d 6e 53 6c 6f 74 2a 32 29 3b 0a 20 20  lot=nSlot*2);.  
148f0 70 4e 65 77 20 3d 20 66 74 73 35 49 64 78 4d 61  pNew = fts5IdxMa
14900 6c 6c 6f 63 28 70 2c 20 0a 20 20 20 20 20 20 73  lloc(p, .      s
14910 69 7a 65 6f 66 28 46 74 73 35 49 6e 64 65 78 49  izeof(Fts5IndexI
14920 74 65 72 29 20 2b 20 20 20 20 20 20 20 20 20 20  ter) +          
14930 20 20 20 2f 2a 20 70 4e 65 77 20 2a 2f 0a 20 20     /* pNew */.  
14940 20 20 20 20 73 69 7a 65 6f 66 28 46 74 73 35 53      sizeof(Fts5S
14950 65 67 49 74 65 72 29 20 2a 20 28 6e 53 6c 6f 74  egIter) * (nSlot
14960 2d 31 29 20 2b 20 20 20 2f 2a 20 70 4e 65 77 2d  -1) +   /* pNew-
14970 3e 61 53 65 67 5b 5d 20 2a 2f 0a 20 20 20 20 20  >aSeg[] */.     
14980 20 73 69 7a 65 6f 66 28 46 74 73 35 43 52 65 73   sizeof(Fts5CRes
14990 75 6c 74 29 20 2a 20 6e 53 6c 6f 74 20 20 20 20  ult) * nSlot    
149a0 20 20 20 20 20 2f 2a 20 70 4e 65 77 2d 3e 61 46       /* pNew->aF
149b0 69 72 73 74 5b 5d 20 2a 2f 0a 20 20 29 3b 0a 20  irst[] */.  );. 
149c0 20 69 66 28 20 70 4e 65 77 20 29 7b 0a 20 20 20   if( pNew ){.   
149d0 20 70 4e 65 77 2d 3e 6e 53 65 67 20 3d 20 6e 53   pNew->nSeg = nS
149e0 6c 6f 74 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 61  lot;.    pNew->a
149f0 46 69 72 73 74 20 3d 20 28 46 74 73 35 43 52 65  First = (Fts5CRe
14a00 73 75 6c 74 2a 29 26 70 4e 65 77 2d 3e 61 53 65  sult*)&pNew->aSe
14a10 67 5b 6e 53 6c 6f 74 5d 3b 0a 20 20 20 20 70 4e  g[nSlot];.    pN
14a20 65 77 2d 3e 70 49 6e 64 65 78 20 3d 20 70 3b 0a  ew->pIndex = p;.
14a30 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 4e 65    }.  return pNe
14a40 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f  w;.}../*.** Allo
14a50 63 61 74 65 20 61 20 6e 65 77 20 46 74 73 35 49  cate a new Fts5I
14a60 6e 64 65 78 49 74 65 72 20 6f 62 6a 65 63 74 2e  ndexIter object.
14a70 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 65 77 20 6f  .**.** The new o
14a80 62 6a 65 63 74 20 77 69 6c 6c 20 62 65 20 75 73  bject will be us
14a90 65 64 20 74 6f 20 69 74 65 72 61 74 65 20 74 68  ed to iterate th
14aa0 72 6f 75 67 68 20 64 61 74 61 20 69 6e 20 73 74  rough data in st
14ab0 72 75 63 74 75 72 65 20 70 53 74 72 75 63 74 2e  ructure pStruct.
14ac0 0a 2a 2a 20 49 66 20 69 4c 65 76 65 6c 20 69 73  .** If iLevel is
14ad0 20 2d 76 65 2c 20 74 68 65 6e 20 61 6c 6c 20 64   -ve, then all d
14ae0 61 74 61 20 69 6e 20 61 6c 6c 20 73 65 67 6d 65  ata in all segme
14af0 6e 74 73 20 69 73 20 6d 65 72 67 65 64 2e 20 4f  nts is merged. O
14b00 72 2c 20 69 66 20 69 4c 65 76 65 6c 0a 2a 2a 20  r, if iLevel.** 
14b10 69 73 20 7a 65 72 6f 20 6f 72 20 67 72 65 61 74  is zero or great
14b20 65 72 2c 20 64 61 74 61 20 66 72 6f 6d 20 74 68  er, data from th
14b30 65 20 66 69 72 73 74 20 6e 53 65 67 6d 65 6e 74  e first nSegment
14b40 20 73 65 67 6d 65 6e 74 73 20 6f 6e 20 6c 65 76   segments on lev
14b50 65 6c 20 69 4c 65 76 65 6c 0a 2a 2a 20 69 73 20  el iLevel.** is 
14b60 6d 65 72 67 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  merged..**.** Th
14b70 65 20 69 74 65 72 61 74 6f 72 20 69 6e 69 74 69  e iterator initi
14b80 61 6c 6c 79 20 70 6f 69 6e 74 73 20 74 6f 20 74  ally points to t
14b90 68 65 20 66 69 72 73 74 20 74 65 72 6d 2f 72 6f  he first term/ro
14ba0 77 69 64 20 65 6e 74 72 79 20 69 6e 20 74 68 65  wid entry in the
14bb0 20 0a 2a 2a 20 69 74 65 72 61 74 65 64 20 64 61   .** iterated da
14bc0 74 61 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ta..*/.static vo
14bd0 69 64 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72  id fts5MultiIter
14be0 4e 65 77 28 0a 20 20 46 74 73 35 49 6e 64 65 78  New(.  Fts5Index
14bf0 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
14c00 20 20 20 20 20 20 20 2f 2a 20 46 54 53 35 20 62         /* FTS5 b
14c10 61 63 6b 65 6e 64 20 74 6f 20 69 74 65 72 61 74  ackend to iterat
14c20 65 20 77 69 74 68 69 6e 20 2a 2f 0a 20 20 46 74  e within */.  Ft
14c30 73 35 53 74 72 75 63 74 75 72 65 20 2a 70 53 74  s5Structure *pSt
14c40 72 75 63 74 2c 20 20 20 20 20 20 20 20 20 2f 2a  ruct,         /*
14c50 20 53 74 72 75 63 74 75 72 65 20 6f 66 20 73 70   Structure of sp
14c60 65 63 69 66 69 63 20 69 6e 64 65 78 20 2a 2f 0a  ecific index */.
14c70 20 20 69 6e 74 20 62 53 6b 69 70 45 6d 70 74 79    int bSkipEmpty
14c80 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
14c90 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 69 67 6e    /* True to ign
14ca0 6f 72 65 20 64 65 6c 65 74 65 2d 6b 65 79 73 20  ore delete-keys 
14cb0 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c 20  */.  int flags, 
14cc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14cd0 20 20 20 20 20 2f 2a 20 46 54 53 35 49 4e 44 45       /* FTS5INDE
14ce0 58 5f 51 55 45 52 59 5f 58 58 58 20 66 6c 61 67  X_QUERY_XXX flag
14cf0 73 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 75 38 20  s */.  const u8 
14d00 2a 70 54 65 72 6d 2c 20 69 6e 74 20 6e 54 65 72  *pTerm, int nTer
14d10 6d 2c 20 20 20 20 20 2f 2a 20 54 65 72 6d 20 74  m,     /* Term t
14d20 6f 20 73 65 65 6b 20 74 6f 20 28 6f 72 20 4e 55  o seek to (or NU
14d30 4c 4c 2f 30 29 20 2a 2f 0a 20 20 69 6e 74 20 69  LL/0) */.  int i
14d40 4c 65 76 65 6c 2c 20 20 20 20 20 20 20 20 20 20  Level,          
14d50 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65             /* Le
14d60 76 65 6c 20 74 6f 20 69 74 65 72 61 74 65 20 28  vel to iterate (
14d70 2d 31 20 66 6f 72 20 61 6c 6c 29 20 2a 2f 0a 20  -1 for all) */. 
14d80 20 69 6e 74 20 6e 53 65 67 6d 65 6e 74 2c 20 20   int nSegment,  
14d90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14da0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 73 65   /* Number of se
14db0 67 6d 65 6e 74 73 20 74 6f 20 6d 65 72 67 65 20  gments to merge 
14dc0 28 69 4c 65 76 65 6c 3e 3d 30 29 20 2a 2f 0a 20  (iLevel>=0) */. 
14dd0 20 46 74 73 35 49 6e 64 65 78 49 74 65 72 20 2a   Fts5IndexIter *
14de0 2a 70 70 4f 75 74 20 20 20 20 20 20 20 20 20 20  *ppOut          
14df0 20 2f 2a 20 4e 65 77 20 6f 62 6a 65 63 74 20 2a   /* New object *
14e00 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 53 65 67 20  /.){.  int nSeg 
14e10 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
14e20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
14e30 20 6f 66 20 73 65 67 6d 65 6e 74 2d 69 74 65 72   of segment-iter
14e40 73 20 69 6e 20 75 73 65 20 2a 2f 0a 20 20 69 6e  s in use */.  in
14e50 74 20 69 49 74 65 72 20 3d 20 30 3b 20 20 20 20  t iIter = 0;    
14e60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
14e70 20 2a 2f 0a 20 20 69 6e 74 20 69 53 65 67 3b 20   */.  int iSeg; 
14e80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14e90 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20 74 6f        /* Used to
14ea0 20 69 74 65 72 61 74 65 20 74 68 72 6f 75 67 68   iterate through
14eb0 20 73 65 67 6d 65 6e 74 73 20 2a 2f 0a 20 20 46   segments */.  F
14ec0 74 73 35 42 75 66 66 65 72 20 62 75 66 20 3d 20  ts5Buffer buf = 
14ed0 7b 30 2c 30 2c 30 7d 3b 20 20 20 20 20 20 20 2f  {0,0,0};       /
14ee0 2a 20 42 75 66 66 65 72 20 75 73 65 64 20 62 79  * Buffer used by
14ef0 20 66 74 73 35 53 65 67 49 74 65 72 53 65 65 6b   fts5SegIterSeek
14f00 49 6e 69 74 28 29 20 2a 2f 0a 20 20 46 74 73 35  Init() */.  Fts5
14f10 53 74 72 75 63 74 75 72 65 4c 65 76 65 6c 20 2a  StructureLevel *
14f20 70 4c 76 6c 3b 0a 20 20 46 74 73 35 49 6e 64 65  pLvl;.  Fts5Inde
14f30 78 49 74 65 72 20 2a 70 4e 65 77 3b 0a 0a 20 20  xIter *pNew;..  
14f40 61 73 73 65 72 74 28 20 28 70 54 65 72 6d 3d 3d  assert( (pTerm==
14f50 30 20 26 26 20 6e 54 65 72 6d 3d 3d 30 29 20 7c  0 && nTerm==0) |
14f60 7c 20 69 4c 65 76 65 6c 3c 30 20 29 3b 0a 0a 20  | iLevel<0 );.. 
14f70 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 73 70 61   /* Allocate spa
14f80 63 65 20 66 6f 72 20 74 68 65 20 6e 65 77 20 6d  ce for the new m
14f90 75 6c 74 69 2d 73 65 67 2d 69 74 65 72 61 74 6f  ulti-seg-iterato
14fa0 72 2e 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 72  r. */.  if( p->r
14fb0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
14fc0 20 20 20 20 69 66 28 20 69 4c 65 76 65 6c 3c 30      if( iLevel<0
14fd0 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
14fe0 28 20 70 53 74 72 75 63 74 2d 3e 6e 53 65 67 6d  ( pStruct->nSegm
14ff0 65 6e 74 3d 3d 66 74 73 35 53 74 72 75 63 74 75  ent==fts5Structu
15000 72 65 43 6f 75 6e 74 53 65 67 6d 65 6e 74 73 28  reCountSegments(
15010 70 53 74 72 75 63 74 29 20 29 3b 0a 20 20 20 20  pStruct) );.    
15020 20 20 6e 53 65 67 20 3d 20 70 53 74 72 75 63 74    nSeg = pStruct
15030 2d 3e 6e 53 65 67 6d 65 6e 74 3b 0a 20 20 20 20  ->nSegment;.    
15040 20 20 6e 53 65 67 20 2b 3d 20 28 70 2d 3e 70 48    nSeg += (p->pH
15050 61 73 68 20 3f 20 31 20 3a 20 30 29 3b 0a 20 20  ash ? 1 : 0);.  
15060 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e    }else{.      n
15070 53 65 67 20 3d 20 4d 49 4e 28 70 53 74 72 75 63  Seg = MIN(pStruc
15080 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c 65 76 65 6c  t->aLevel[iLevel
15090 5d 2e 6e 53 65 67 2c 20 6e 53 65 67 6d 65 6e 74  ].nSeg, nSegment
150a0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2a  );.    }.  }.  *
150b0 70 70 4f 75 74 20 3d 20 70 4e 65 77 20 3d 20 66  ppOut = pNew = f
150c0 74 73 35 4d 75 6c 74 69 49 74 65 72 41 6c 6c 6f  ts5MultiIterAllo
150d0 63 28 70 2c 20 6e 53 65 67 29 3b 0a 20 20 69 66  c(p, nSeg);.  if
150e0 28 20 70 4e 65 77 3d 3d 30 20 29 20 72 65 74 75  ( pNew==0 ) retu
150f0 72 6e 3b 0a 20 20 70 4e 65 77 2d 3e 62 52 65 76  rn;.  pNew->bRev
15100 20 3d 20 28 30 21 3d 28 66 6c 61 67 73 20 26 20   = (0!=(flags & 
15110 46 54 53 35 49 4e 44 45 58 5f 51 55 45 52 59 5f  FTS5INDEX_QUERY_
15120 44 45 53 43 29 29 3b 0a 20 20 70 4e 65 77 2d 3e  DESC));.  pNew->
15130 62 53 6b 69 70 45 6d 70 74 79 20 3d 20 62 53 6b  bSkipEmpty = bSk
15140 69 70 45 6d 70 74 79 3b 0a 20 20 70 4e 65 77 2d  ipEmpty;.  pNew-
15150 3e 70 53 74 72 75 63 74 20 3d 20 70 53 74 72 75  >pStruct = pStru
15160 63 74 3b 0a 20 20 66 74 73 35 53 74 72 75 63 74  ct;.  fts5Struct
15170 75 72 65 52 65 66 28 70 53 74 72 75 63 74 29 3b  ureRef(pStruct);
15180 0a 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a  ..  /* Initializ
15190 65 20 65 61 63 68 20 6f 66 20 74 68 65 20 63 6f  e each of the co
151a0 6d 70 6f 6e 65 6e 74 20 73 65 67 6d 65 6e 74 20  mponent segment 
151b0 69 74 65 72 61 74 6f 72 73 2e 20 2a 2f 0a 20 20  iterators. */.  
151c0 69 66 28 20 69 4c 65 76 65 6c 3c 30 20 29 7b 0a  if( iLevel<0 ){.
151d0 20 20 20 20 46 74 73 35 53 74 72 75 63 74 75 72      Fts5Structur
151e0 65 4c 65 76 65 6c 20 2a 70 45 6e 64 20 3d 20 26  eLevel *pEnd = &
151f0 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b  pStruct->aLevel[
15200 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 5d  pStruct->nLevel]
15210 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 48 61  ;.    if( p->pHa
15220 73 68 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41  sh ){.      /* A
15230 64 64 20 61 20 73 65 67 6d 65 6e 74 20 69 74 65  dd a segment ite
15240 72 61 74 6f 72 20 66 6f 72 20 74 68 65 20 63 75  rator for the cu
15250 72 72 65 6e 74 20 63 6f 6e 74 65 6e 74 73 20 6f  rrent contents o
15260 66 20 74 68 65 20 68 61 73 68 20 74 61 62 6c 65  f the hash table
15270 2e 20 2a 2f 0a 20 20 20 20 20 20 46 74 73 35 53  . */.      Fts5S
15280 65 67 49 74 65 72 20 2a 70 49 74 65 72 20 3d 20  egIter *pIter = 
15290 26 70 4e 65 77 2d 3e 61 53 65 67 5b 69 49 74 65  &pNew->aSeg[iIte
152a0 72 2b 2b 5d 3b 0a 20 20 20 20 20 20 66 74 73 35  r++];.      fts5
152b0 53 65 67 49 74 65 72 48 61 73 68 49 6e 69 74 28  SegIterHashInit(
152c0 70 2c 20 70 54 65 72 6d 2c 20 6e 54 65 72 6d 2c  p, pTerm, nTerm,
152d0 20 66 6c 61 67 73 2c 20 70 49 74 65 72 29 3b 0a   flags, pIter);.
152e0 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 70 4c      }.    for(pL
152f0 76 6c 3d 26 70 53 74 72 75 63 74 2d 3e 61 4c 65  vl=&pStruct->aLe
15300 76 65 6c 5b 30 5d 3b 20 70 4c 76 6c 3c 70 45 6e  vel[0]; pLvl<pEn
15310 64 3b 20 70 4c 76 6c 2b 2b 29 7b 0a 20 20 20 20  d; pLvl++){.    
15320 20 20 66 6f 72 28 69 53 65 67 3d 70 4c 76 6c 2d    for(iSeg=pLvl-
15330 3e 6e 53 65 67 2d 31 3b 20 69 53 65 67 3e 3d 30  >nSeg-1; iSeg>=0
15340 3b 20 69 53 65 67 2d 2d 29 7b 0a 20 20 20 20 20  ; iSeg--){.     
15350 20 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65     Fts5Structure
15360 53 65 67 6d 65 6e 74 20 2a 70 53 65 67 20 3d 20  Segment *pSeg = 
15370 26 70 4c 76 6c 2d 3e 61 53 65 67 5b 69 53 65 67  &pLvl->aSeg[iSeg
15380 5d 3b 0a 20 20 20 20 20 20 20 20 46 74 73 35 53  ];.        Fts5S
15390 65 67 49 74 65 72 20 2a 70 49 74 65 72 20 3d 20  egIter *pIter = 
153a0 26 70 4e 65 77 2d 3e 61 53 65 67 5b 69 49 74 65  &pNew->aSeg[iIte
153b0 72 2b 2b 5d 3b 0a 20 20 20 20 20 20 20 20 69 66  r++];.        if
153c0 28 20 70 54 65 72 6d 3d 3d 30 20 29 7b 0a 20 20  ( pTerm==0 ){.  
153d0 20 20 20 20 20 20 20 20 66 74 73 35 53 65 67 49          fts5SegI
153e0 74 65 72 49 6e 69 74 28 70 2c 20 70 53 65 67 2c  terInit(p, pSeg,
153f0 20 70 49 74 65 72 29 3b 0a 20 20 20 20 20 20 20   pIter);.       
15400 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
15410 20 20 66 74 73 35 53 65 67 49 74 65 72 53 65 65    fts5SegIterSee
15420 6b 49 6e 69 74 28 70 2c 20 26 62 75 66 2c 20 70  kInit(p, &buf, p
15430 54 65 72 6d 2c 20 6e 54 65 72 6d 2c 20 66 6c 61  Term, nTerm, fla
15440 67 73 2c 20 70 53 65 67 2c 20 70 49 74 65 72 29  gs, pSeg, pIter)
15450 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
15460 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73    }.    }.  }els
15470 65 7b 0a 20 20 20 20 70 4c 76 6c 20 3d 20 26 70  e{.    pLvl = &p
15480 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69  Struct->aLevel[i
15490 4c 65 76 65 6c 5d 3b 0a 20 20 20 20 66 6f 72 28  Level];.    for(
154a0 69 53 65 67 3d 6e 53 65 67 2d 31 3b 20 69 53 65  iSeg=nSeg-1; iSe
154b0 67 3e 3d 30 3b 20 69 53 65 67 2d 2d 29 7b 0a 20  g>=0; iSeg--){. 
154c0 20 20 20 20 20 66 74 73 35 53 65 67 49 74 65 72       fts5SegIter
154d0 49 6e 69 74 28 70 2c 20 26 70 4c 76 6c 2d 3e 61  Init(p, &pLvl->a
154e0 53 65 67 5b 69 53 65 67 5d 2c 20 26 70 4e 65 77  Seg[iSeg], &pNew
154f0 2d 3e 61 53 65 67 5b 69 49 74 65 72 2b 2b 5d 29  ->aSeg[iIter++])
15500 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73  ;.    }.  }.  as
15510 73 65 72 74 28 20 69 49 74 65 72 3d 3d 6e 53 65  sert( iIter==nSe
15520 67 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  g );..  /* If th
15530 65 20 61 62 6f 76 65 20 77 61 73 20 73 75 63 63  e above was succ
15540 65 73 73 66 75 6c 2c 20 65 61 63 68 20 63 6f 6d  essful, each com
15550 70 6f 6e 65 6e 74 20 69 74 65 72 61 74 6f 72 73  ponent iterators
15560 20 6e 6f 77 20 70 6f 69 6e 74 73 20 0a 20 20 2a   now points .  *
15570 2a 20 74 6f 20 74 68 65 20 66 69 72 73 74 20 65  * to the first e
15580 6e 74 72 79 20 69 6e 20 69 74 73 20 73 65 67 6d  ntry in its segm
15590 65 6e 74 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ent. In this cas
155a0 65 20 69 6e 69 74 69 61 6c 69 7a 65 20 74 68 65  e initialize the
155b0 20 0a 20 20 2a 2a 20 61 46 69 72 73 74 5b 5d 20   .  ** aFirst[] 
155c0 61 72 72 61 79 2e 20 4f 72 2c 20 69 66 20 61 6e  array. Or, if an
155d0 20 65 72 72 6f 72 20 68 61 73 20 6f 63 63 75 72   error has occur
155e0 72 65 64 2c 20 66 72 65 65 20 74 68 65 20 69 74  red, free the it
155f0 65 72 61 74 6f 72 0a 20 20 2a 2a 20 6f 62 6a 65  erator.  ** obje
15600 63 74 20 61 6e 64 20 73 65 74 20 74 68 65 20 6f  ct and set the o
15610 75 74 70 75 74 20 76 61 72 69 61 62 6c 65 20 74  utput variable t
15620 6f 20 4e 55 4c 4c 2e 20 20 2a 2f 0a 20 20 69 66  o NULL.  */.  if
15630 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
15640 4f 4b 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 49  OK ){.    for(iI
15650 74 65 72 3d 70 4e 65 77 2d 3e 6e 53 65 67 2d 31  ter=pNew->nSeg-1
15660 3b 20 69 49 74 65 72 3e 30 3b 20 69 49 74 65 72  ; iIter>0; iIter
15670 2d 2d 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  --){.      int i
15680 45 71 3b 0a 20 20 20 20 20 20 69 66 28 20 28 69  Eq;.      if( (i
15690 45 71 20 3d 20 66 74 73 35 4d 75 6c 74 69 49 74  Eq = fts5MultiIt
156a0 65 72 44 6f 43 6f 6d 70 61 72 65 28 70 4e 65 77  erDoCompare(pNew
156b0 2c 20 69 49 74 65 72 29 29 20 29 7b 0a 20 20 20  , iIter)) ){.   
156c0 20 20 20 20 20 66 74 73 35 53 65 67 49 74 65 72       fts5SegIter
156d0 4e 65 78 74 28 70 2c 20 26 70 4e 65 77 2d 3e 61  Next(p, &pNew->a
156e0 53 65 67 5b 69 45 71 5d 2c 20 30 29 3b 0a 20 20  Seg[iEq], 0);.  
156f0 20 20 20 20 20 20 66 74 73 35 4d 75 6c 74 69 49        fts5MultiI
15700 74 65 72 41 64 76 61 6e 63 65 64 28 70 2c 20 70  terAdvanced(p, p
15710 4e 65 77 2c 20 69 45 71 2c 20 69 49 74 65 72 29  New, iEq, iIter)
15720 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
15730 20 20 20 20 66 74 73 35 4d 75 6c 74 69 49 74 65      fts5MultiIte
15740 72 53 65 74 45 6f 66 28 70 4e 65 77 29 3b 0a 20  rSetEof(pNew);. 
15750 20 20 20 66 74 73 35 41 73 73 65 72 74 4d 75 6c     fts5AssertMul
15760 74 69 49 74 65 72 53 65 74 75 70 28 70 2c 20 70  tiIterSetup(p, p
15770 4e 65 77 29 3b 0a 0a 20 20 20 20 69 66 28 20 70  New);..    if( p
15780 4e 65 77 2d 3e 62 53 6b 69 70 45 6d 70 74 79 20  New->bSkipEmpty 
15790 26 26 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72  && fts5MultiIter
157a0 49 73 45 6d 70 74 79 28 70 2c 20 70 4e 65 77 29  IsEmpty(p, pNew)
157b0 20 29 7b 0a 20 20 20 20 20 20 66 74 73 35 4d 75   ){.      fts5Mu
157c0 6c 74 69 49 74 65 72 4e 65 78 74 28 70 2c 20 70  ltiIterNext(p, p
157d0 4e 65 77 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  New, 0, 0);.    
157e0 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66  }.  }else{.    f
157f0 74 73 35 4d 75 6c 74 69 49 74 65 72 46 72 65 65  ts5MultiIterFree
15800 28 70 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20 2a  (p, pNew);.    *
15810 70 70 4f 75 74 20 3d 20 30 3b 0a 20 20 7d 0a 20  ppOut = 0;.  }. 
15820 20 66 74 73 35 42 75 66 66 65 72 46 72 65 65 28   fts5BufferFree(
15830 26 62 75 66 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  &buf);.}../*.** 
15840 43 72 65 61 74 65 20 61 6e 20 46 74 73 35 49 6e  Create an Fts5In
15850 64 65 78 49 74 65 72 20 74 68 61 74 20 69 74 65  dexIter that ite
15860 72 61 74 65 73 20 74 68 72 6f 75 67 68 20 74 68  rates through th
15870 65 20 64 6f 63 6c 69 73 74 20 70 72 6f 76 69 64  e doclist provid
15880 65 64 0a 2a 2a 20 61 73 20 74 68 65 20 73 65 63  ed.** as the sec
15890 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f  ond argument..*/
158a0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
158b0 35 4d 75 6c 74 69 49 74 65 72 4e 65 77 32 28 0a  5MultiIterNew2(.
158c0 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20    Fts5Index *p, 
158d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
158e0 20 20 2f 2a 20 46 54 53 35 20 62 61 63 6b 65 6e    /* FTS5 backen
158f0 64 20 74 6f 20 69 74 65 72 61 74 65 20 77 69 74  d to iterate wit
15900 68 69 6e 20 2a 2f 0a 20 20 46 74 73 35 44 61 74  hin */.  Fts5Dat
15910 61 20 2a 70 44 61 74 61 2c 20 20 20 20 20 20 20  a *pData,       
15920 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 63 6c           /* Docl
15930 69 73 74 20 74 6f 20 69 74 65 72 61 74 65 20 74  ist to iterate t
15940 68 72 6f 75 67 68 20 2a 2f 0a 20 20 69 6e 74 20  hrough */.  int 
15950 62 44 65 73 63 2c 20 20 20 20 20 20 20 20 20 20  bDesc,          
15960 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
15970 72 75 65 20 66 6f 72 20 64 65 73 63 65 6e 64 69  rue for descendi
15980 6e 67 20 72 6f 77 69 64 20 6f 72 64 65 72 20 2a  ng rowid order *
15990 2f 0a 20 20 46 74 73 35 49 6e 64 65 78 49 74 65  /.  Fts5IndexIte
159a0 72 20 2a 2a 70 70 4f 75 74 20 20 20 20 20 20 20  r **ppOut       
159b0 20 20 20 20 2f 2a 20 4e 65 77 20 6f 62 6a 65 63      /* New objec
159c0 74 20 2a 2f 0a 29 7b 0a 20 20 46 74 73 35 49 6e  t */.){.  Fts5In
159d0 64 65 78 49 74 65 72 20 2a 70 4e 65 77 3b 0a 20  dexIter *pNew;. 
159e0 20 70 4e 65 77 20 3d 20 66 74 73 35 4d 75 6c 74   pNew = fts5Mult
159f0 69 49 74 65 72 41 6c 6c 6f 63 28 70 2c 20 32 29  iIterAlloc(p, 2)
15a00 3b 0a 20 20 69 66 28 20 70 4e 65 77 20 29 7b 0a  ;.  if( pNew ){.
15a10 20 20 20 20 46 74 73 35 53 65 67 49 74 65 72 20      Fts5SegIter 
15a20 2a 70 49 74 65 72 20 3d 20 26 70 4e 65 77 2d 3e  *pIter = &pNew->
15a30 61 53 65 67 5b 31 5d 3b 0a 0a 20 20 20 20 70 49  aSeg[1];..    pI
15a40 74 65 72 2d 3e 66 6c 61 67 73 20 3d 20 46 54 53  ter->flags = FTS
15a50 35 5f 53 45 47 49 54 45 52 5f 4f 4e 45 54 45 52  5_SEGITER_ONETER
15a60 4d 3b 0a 20 20 20 20 69 66 28 20 70 44 61 74 61  M;.    if( pData
15a70 2d 3e 73 7a 4c 65 61 66 3e 30 20 29 7b 0a 20 20  ->szLeaf>0 ){.  
15a80 20 20 20 20 70 49 74 65 72 2d 3e 70 4c 65 61 66      pIter->pLeaf
15a90 20 3d 20 70 44 61 74 61 3b 0a 20 20 20 20 20 20   = pData;.      
15aa0 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73  pIter->iLeafOffs
15ab0 65 74 20 3d 20 66 74 73 35 47 65 74 56 61 72 69  et = fts5GetVari
15ac0 6e 74 28 70 44 61 74 61 2d 3e 70 2c 20 28 75 36  nt(pData->p, (u6
15ad0 34 2a 29 26 70 49 74 65 72 2d 3e 69 52 6f 77 69  4*)&pIter->iRowi
15ae0 64 29 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e  d);.      pNew->
15af0 61 46 69 72 73 74 5b 31 5d 2e 69 46 69 72 73 74  aFirst[1].iFirst
15b00 20 3d 20 31 3b 0a 20 20 20 20 20 20 69 66 28 20   = 1;.      if( 
15b10 62 44 65 73 63 20 29 7b 0a 20 20 20 20 20 20 20  bDesc ){.       
15b20 20 70 4e 65 77 2d 3e 62 52 65 76 20 3d 20 31 3b   pNew->bRev = 1;
15b30 0a 20 20 20 20 20 20 20 20 70 49 74 65 72 2d 3e  .        pIter->
15b40 66 6c 61 67 73 20 7c 3d 20 46 54 53 35 5f 53 45  flags |= FTS5_SE
15b50 47 49 54 45 52 5f 52 45 56 45 52 53 45 3b 0a 20  GITER_REVERSE;. 
15b60 20 20 20 20 20 20 20 66 74 73 35 53 65 67 49 74         fts5SegIt
15b70 65 72 52 65 76 65 72 73 65 49 6e 69 74 50 61 67  erReverseInitPag
15b80 65 28 70 2c 20 70 49 74 65 72 29 3b 0a 20 20 20  e(p, pIter);.   
15b90 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
15ba0 20 20 66 74 73 35 53 65 67 49 74 65 72 4c 6f 61    fts5SegIterLoa
15bb0 64 4e 50 6f 73 28 70 2c 20 70 49 74 65 72 29 3b  dNPos(p, pIter);
15bc0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
15bd0 44 61 74 61 20 3d 20 30 3b 0a 20 20 20 20 7d 65  Data = 0;.    }e
15be0 6c 73 65 7b 0a 20 20 20 20 20 20 70 4e 65 77 2d  lse{.      pNew-
15bf0 3e 62 45 6f 66 20 3d 20 31 3b 0a 20 20 20 20 7d  >bEof = 1;.    }
15c00 0a 0a 20 20 20 20 2a 70 70 4f 75 74 20 3d 20 70  ..    *ppOut = p
15c10 4e 65 77 3b 0a 20 20 7d 0a 0a 20 20 66 74 73 35  New;.  }..  fts5
15c20 44 61 74 61 52 65 6c 65 61 73 65 28 70 44 61 74  DataRelease(pDat
15c30 61 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  a);.}../*.** Ret
15c40 75 72 6e 20 74 72 75 65 20 69 66 20 74 68 65 20  urn true if the 
15c50 69 74 65 72 61 74 6f 72 20 69 73 20 61 74 20 45  iterator is at E
15c60 4f 46 20 6f 72 20 69 66 20 61 6e 20 65 72 72 6f  OF or if an erro
15c70 72 20 68 61 73 20 6f 63 63 75 72 72 65 64 2e 20  r has occurred. 
15c80 0a 2a 2a 20 46 61 6c 73 65 20 6f 74 68 65 72 77  .** False otherw
15c90 69 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ise..*/.static i
15ca0 6e 74 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72  nt fts5MultiIter
15cb0 45 6f 66 28 46 74 73 35 49 6e 64 65 78 20 2a 70  Eof(Fts5Index *p
15cc0 2c 20 46 74 73 35 49 6e 64 65 78 49 74 65 72 20  , Fts5IndexIter 
15cd0 2a 70 49 74 65 72 29 7b 0a 20 20 61 73 73 65 72  *pIter){.  asser
15ce0 74 28 20 70 2d 3e 72 63 20 0a 20 20 20 20 20 20  t( p->rc .      
15cf0 7c 7c 20 28 70 49 74 65 72 2d 3e 61 53 65 67 5b  || (pIter->aSeg[
15d00 20 70 49 74 65 72 2d 3e 61 46 69 72 73 74 5b 31   pIter->aFirst[1
15d10 5d 2e 69 46 69 72 73 74 20 5d 2e 70 4c 65 61 66  ].iFirst ].pLeaf
15d20 3d 3d 30 29 3d 3d 70 49 74 65 72 2d 3e 62 45 6f  ==0)==pIter->bEo
15d30 66 20 0a 20 20 29 3b 0a 20 20 72 65 74 75 72 6e  f .  );.  return
15d40 20 28 70 2d 3e 72 63 20 7c 7c 20 70 49 74 65 72   (p->rc || pIter
15d50 2d 3e 62 45 6f 66 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  ->bEof);.}../*.*
15d60 2a 20 52 65 74 75 72 6e 20 74 68 65 20 72 6f 77  * Return the row
15d70 69 64 20 6f 66 20 74 68 65 20 65 6e 74 72 79 20  id of the entry 
15d80 74 68 61 74 20 74 68 65 20 69 74 65 72 61 74 6f  that the iterato
15d90 72 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e  r currently poin
15da0 74 73 0a 2a 2a 20 74 6f 2e 20 49 66 20 74 68 65  ts.** to. If the
15db0 20 69 74 65 72 61 74 6f 72 20 70 6f 69 6e 74 73   iterator points
15dc0 20 74 6f 20 45 4f 46 20 77 68 65 6e 20 74 68 69   to EOF when thi
15dd0 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
15de0 6c 6c 65 64 20 74 68 65 0a 2a 2a 20 72 65 73 75  lled the.** resu
15df0 6c 74 73 20 61 72 65 20 75 6e 64 65 66 69 6e 65  lts are undefine
15e00 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 36 34  d..*/.static i64
15e10 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 52 6f   fts5MultiIterRo
15e20 77 69 64 28 46 74 73 35 49 6e 64 65 78 49 74 65  wid(Fts5IndexIte
15e30 72 20 2a 70 49 74 65 72 29 7b 0a 20 20 61 73 73  r *pIter){.  ass
15e40 65 72 74 28 20 70 49 74 65 72 2d 3e 61 53 65 67  ert( pIter->aSeg
15e50 5b 20 70 49 74 65 72 2d 3e 61 46 69 72 73 74 5b  [ pIter->aFirst[
15e60 31 5d 2e 69 46 69 72 73 74 20 5d 2e 70 4c 65 61  1].iFirst ].pLea
15e70 66 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 49  f );.  return pI
15e80 74 65 72 2d 3e 61 53 65 67 5b 20 70 49 74 65 72  ter->aSeg[ pIter
15e90 2d 3e 61 46 69 72 73 74 5b 31 5d 2e 69 46 69 72  ->aFirst[1].iFir
15ea0 73 74 20 5d 2e 69 52 6f 77 69 64 3b 0a 7d 0a 0a  st ].iRowid;.}..
15eb0 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 69  /*.** Move the i
15ec0 74 65 72 61 74 6f 72 20 74 6f 20 74 68 65 20 6e  terator to the n
15ed0 65 78 74 20 65 6e 74 72 79 20 61 74 20 6f 72 20  ext entry at or 
15ee0 66 6f 6c 6c 6f 77 69 6e 67 20 69 4d 61 74 63 68  following iMatch
15ef0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
15f00 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 4e 65   fts5MultiIterNe
15f10 78 74 46 72 6f 6d 28 0a 20 20 46 74 73 35 49 6e  xtFrom(.  Fts5In
15f20 64 65 78 20 2a 70 2c 20 0a 20 20 46 74 73 35 49  dex *p, .  Fts5I
15f30 6e 64 65 78 49 74 65 72 20 2a 70 49 74 65 72 2c  ndexIter *pIter,
15f40 20 0a 20 20 69 36 34 20 69 4d 61 74 63 68 0a 29   .  i64 iMatch.)
15f50 7b 0a 20 20 77 68 69 6c 65 28 20 31 20 29 7b 0a  {.  while( 1 ){.
15f60 20 20 20 20 69 36 34 20 69 52 6f 77 69 64 3b 0a      i64 iRowid;.
15f70 20 20 20 20 66 74 73 35 4d 75 6c 74 69 49 74 65      fts5MultiIte
15f80 72 4e 65 78 74 28 70 2c 20 70 49 74 65 72 2c 20  rNext(p, pIter, 
15f90 31 2c 20 69 4d 61 74 63 68 29 3b 0a 20 20 20 20  1, iMatch);.    
15fa0 69 66 28 20 66 74 73 35 4d 75 6c 74 69 49 74 65  if( fts5MultiIte
15fb0 72 45 6f 66 28 70 2c 20 70 49 74 65 72 29 20 29  rEof(p, pIter) )
15fc0 20 62 72 65 61 6b 3b 0a 20 20 20 20 69 52 6f 77   break;.    iRow
15fd0 69 64 20 3d 20 66 74 73 35 4d 75 6c 74 69 49 74  id = fts5MultiIt
15fe0 65 72 52 6f 77 69 64 28 70 49 74 65 72 29 3b 0a  erRowid(pIter);.
15ff0 20 20 20 20 69 66 28 20 70 49 74 65 72 2d 3e 62      if( pIter->b
16000 52 65 76 3d 3d 30 20 26 26 20 69 52 6f 77 69 64  Rev==0 && iRowid
16010 3e 3d 69 4d 61 74 63 68 20 29 20 62 72 65 61 6b  >=iMatch ) break
16020 3b 0a 20 20 20 20 69 66 28 20 70 49 74 65 72 2d  ;.    if( pIter-
16030 3e 62 52 65 76 21 3d 30 20 26 26 20 69 52 6f 77  >bRev!=0 && iRow
16040 69 64 3c 3d 69 4d 61 74 63 68 20 29 20 62 72 65  id<=iMatch ) bre
16050 61 6b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  ak;.  }.}../*.**
16060 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   Return a pointe
16070 72 20 74 6f 20 61 20 62 75 66 66 65 72 20 63 6f  r to a buffer co
16080 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 74 65 72  ntaining the ter
16090 6d 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  m associated wit
160a0 68 20 74 68 65 20 0a 2a 2a 20 65 6e 74 72 79 20  h the .** entry 
160b0 74 68 61 74 20 74 68 65 20 69 74 65 72 61 74 6f  that the iterato
160c0 72 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e  r currently poin
160d0 74 73 20 74 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63  ts to..*/.static
160e0 20 63 6f 6e 73 74 20 75 38 20 2a 66 74 73 35 4d   const u8 *fts5M
160f0 75 6c 74 69 49 74 65 72 54 65 72 6d 28 46 74 73  ultiIterTerm(Fts
16100 35 49 6e 64 65 78 49 74 65 72 20 2a 70 49 74 65  5IndexIter *pIte
16110 72 2c 20 69 6e 74 20 2a 70 6e 29 7b 0a 20 20 46  r, int *pn){.  F
16120 74 73 35 53 65 67 49 74 65 72 20 2a 70 20 3d 20  ts5SegIter *p = 
16130 26 70 49 74 65 72 2d 3e 61 53 65 67 5b 20 70 49  &pIter->aSeg[ pI
16140 74 65 72 2d 3e 61 46 69 72 73 74 5b 31 5d 2e 69  ter->aFirst[1].i
16150 46 69 72 73 74 20 5d 3b 0a 20 20 2a 70 6e 20 3d  First ];.  *pn =
16160 20 70 2d 3e 74 65 72 6d 2e 6e 3b 0a 20 20 72 65   p->term.n;.  re
16170 74 75 72 6e 20 70 2d 3e 74 65 72 6d 2e 70 3b 0a  turn p->term.p;.
16180 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  }..static void f
16190 74 73 35 43 68 75 6e 6b 49 74 65 72 61 74 65 28  ts5ChunkIterate(
161a0 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c  .  Fts5Index *p,
161b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
161c0 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 62 6a 65     /* Index obje
161d0 63 74 20 2a 2f 0a 20 20 46 74 73 35 53 65 67 49  ct */.  Fts5SegI
161e0 74 65 72 20 2a 70 53 65 67 2c 20 20 20 20 20 20  ter *pSeg,      
161f0 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 73 6c 69          /* Posli
16200 73 74 20 6f 66 20 74 68 69 73 20 69 74 65 72 61  st of this itera
16210 74 6f 72 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70  tor */.  void *p
16220 43 74 78 2c 20 20 20 20 20 20 20 20 20 20 20 20  Ctx,            
16230 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 74           /* Cont
16240 65 78 74 20 70 6f 69 6e 74 65 72 20 66 6f 72 20  ext pointer for 
16250 78 43 68 75 6e 6b 20 63 61 6c 6c 62 61 63 6b 20  xChunk callback 
16260 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 78 43 68 75  */.  void (*xChu
16270 6e 6b 29 28 46 74 73 35 49 6e 64 65 78 2a 2c 20  nk)(Fts5Index*, 
16280 76 6f 69 64 2a 2c 20 63 6f 6e 73 74 20 75 38 2a  void*, const u8*
16290 2c 20 69 6e 74 29 0a 29 7b 0a 20 20 69 6e 74 20  , int).){.  int 
162a0 6e 52 65 6d 20 3d 20 70 53 65 67 2d 3e 6e 50 6f  nRem = pSeg->nPo
162b0 73 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  s;          /* N
162c0 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 73  umber of bytes s
162d0 74 69 6c 6c 20 74 6f 20 63 6f 6d 65 20 2a 2f 0a  till to come */.
162e0 20 20 46 74 73 35 44 61 74 61 20 2a 70 44 61 74    Fts5Data *pDat
162f0 61 20 3d 20 30 3b 0a 20 20 75 38 20 2a 70 43 68  a = 0;.  u8 *pCh
16300 75 6e 6b 20 3d 20 26 70 53 65 67 2d 3e 70 4c 65  unk = &pSeg->pLe
16310 61 66 2d 3e 70 5b 70 53 65 67 2d 3e 69 4c 65 61  af->p[pSeg->iLea
16320 66 4f 66 66 73 65 74 5d 3b 0a 20 20 69 6e 74 20  fOffset];.  int 
16330 6e 43 68 75 6e 6b 20 3d 20 4d 49 4e 28 6e 52 65  nChunk = MIN(nRe
16340 6d 2c 20 70 53 65 67 2d 3e 70 4c 65 61 66 2d 3e  m, pSeg->pLeaf->
16350 73 7a 4c 65 61 66 20 2d 20 70 53 65 67 2d 3e 69  szLeaf - pSeg->i
16360 4c 65 61 66 4f 66 66 73 65 74 29 3b 0a 20 20 69  LeafOffset);.  i
16370 6e 74 20 70 67 6e 6f 20 3d 20 70 53 65 67 2d 3e  nt pgno = pSeg->
16380 69 4c 65 61 66 50 67 6e 6f 3b 0a 20 20 69 6e 74  iLeafPgno;.  int
16390 20 70 67 6e 6f 53 61 76 65 20 3d 20 30 3b 0a 0a   pgnoSave = 0;..
163a0 20 20 69 66 28 20 28 70 53 65 67 2d 3e 66 6c 61    if( (pSeg->fla
163b0 67 73 20 26 20 46 54 53 35 5f 53 45 47 49 54 45  gs & FTS5_SEGITE
163c0 52 5f 52 45 56 45 52 53 45 29 3d 3d 30 20 29 7b  R_REVERSE)==0 ){
163d0 0a 20 20 20 20 70 67 6e 6f 53 61 76 65 20 3d 20  .    pgnoSave = 
163e0 70 67 6e 6f 2b 31 3b 0a 20 20 7d 0a 0a 20 20 77  pgno+1;.  }..  w
163f0 68 69 6c 65 28 20 31 20 29 7b 0a 20 20 20 20 78  hile( 1 ){.    x
16400 43 68 75 6e 6b 28 70 2c 20 70 43 74 78 2c 20 70  Chunk(p, pCtx, p
16410 43 68 75 6e 6b 2c 20 6e 43 68 75 6e 6b 29 3b 0a  Chunk, nChunk);.
16420 20 20 20 20 6e 52 65 6d 20 2d 3d 20 6e 43 68 75      nRem -= nChu
16430 6e 6b 3b 0a 20 20 20 20 66 74 73 35 44 61 74 61  nk;.    fts5Data
16440 52 65 6c 65 61 73 65 28 70 44 61 74 61 29 3b 0a  Release(pData);.
16450 20 20 20 20 69 66 28 20 6e 52 65 6d 3c 3d 30 20      if( nRem<=0 
16460 29 7b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  ){.      break;.
16470 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
16480 20 70 67 6e 6f 2b 2b 3b 0a 20 20 20 20 20 20 70   pgno++;.      p
16490 44 61 74 61 20 3d 20 66 74 73 35 44 61 74 61 52  Data = fts5DataR
164a0 65 61 64 28 70 2c 20 46 54 53 35 5f 53 45 47 4d  ead(p, FTS5_SEGM
164b0 45 4e 54 5f 52 4f 57 49 44 28 70 53 65 67 2d 3e  ENT_ROWID(pSeg->
164c0 70 53 65 67 2d 3e 69 53 65 67 69 64 2c 20 30 2c  pSeg->iSegid, 0,
164d0 20 70 67 6e 6f 29 29 3b 0a 20 20 20 20 20 20 69   pgno));.      i
164e0 66 28 20 70 44 61 74 61 3d 3d 30 20 29 20 62 72  f( pData==0 ) br
164f0 65 61 6b 3b 0a 20 20 20 20 20 20 70 43 68 75 6e  eak;.      pChun
16500 6b 20 3d 20 26 70 44 61 74 61 2d 3e 70 5b 34 5d  k = &pData->p[4]
16510 3b 0a 20 20 20 20 20 20 6e 43 68 75 6e 6b 20 3d  ;.      nChunk =
16520 20 4d 49 4e 28 6e 52 65 6d 2c 20 70 44 61 74 61   MIN(nRem, pData
16530 2d 3e 73 7a 4c 65 61 66 20 2d 20 34 29 3b 0a 20  ->szLeaf - 4);. 
16540 20 20 20 20 20 69 66 28 20 70 67 6e 6f 3d 3d 70       if( pgno==p
16550 67 6e 6f 53 61 76 65 20 29 7b 0a 20 20 20 20 20  gnoSave ){.     
16560 20 20 20 61 73 73 65 72 74 28 20 70 53 65 67 2d     assert( pSeg-
16570 3e 70 4e 65 78 74 4c 65 61 66 3d 3d 30 20 29 3b  >pNextLeaf==0 );
16580 0a 20 20 20 20 20 20 20 20 70 53 65 67 2d 3e 70  .        pSeg->p
16590 4e 65 78 74 4c 65 61 66 20 3d 20 70 44 61 74 61  NextLeaf = pData
165a0 3b 0a 20 20 20 20 20 20 20 20 70 44 61 74 61 20  ;.        pData 
165b0 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 0;.      }.   
165c0 20 7d 0a 20 20 7d 0a 7d 0a 0a 0a 0a 2f 2a 0a 2a   }.  }.}..../*.*
165d0 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77  * Allocate a new
165e0 20 73 65 67 6d 65 6e 74 2d 69 64 20 66 6f 72 20   segment-id for 
165f0 74 68 65 20 73 74 72 75 63 74 75 72 65 20 70 53  the structure pS
16600 74 72 75 63 74 2e 20 54 68 65 20 6e 65 77 20 73  truct. The new s
16610 65 67 6d 65 6e 74 0a 2a 2a 20 69 64 20 6d 75 73  egment.** id mus
16620 74 20 62 65 20 62 65 74 77 65 65 6e 20 31 20 61  t be between 1 a
16630 6e 64 20 36 35 33 33 35 20 69 6e 63 6c 75 73 69  nd 65335 inclusi
16640 76 65 2c 20 61 6e 64 20 6d 75 73 74 20 6e 6f 74  ve, and must not
16650 20 62 65 20 75 73 65 64 20 62 79 20 0a 2a 2a 20   be used by .** 
16660 61 6e 79 20 63 75 72 72 65 6e 74 6c 79 20 65 78  any currently ex
16670 69 73 74 69 6e 67 20 73 65 67 6d 65 6e 74 2e 20  isting segment. 
16680 49 66 20 61 20 66 72 65 65 20 73 65 67 6d 65 6e  If a free segmen
16690 74 20 69 64 20 63 61 6e 6e 6f 74 20 62 65 20 66  t id cannot be f
166a0 6f 75 6e 64 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f  ound,.** SQLITE_
166b0 46 55 4c 4c 20 69 73 20 72 65 74 75 72 6e 65 64  FULL is returned
166c0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72  ..**.** If an er
166d0 72 6f 72 20 68 61 73 20 61 6c 72 65 61 64 79 20  ror has already 
166e0 6f 63 63 75 72 72 65 64 2c 20 74 68 69 73 20 66  occurred, this f
166f0 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d  unction is a no-
16700 6f 70 2e 20 30 20 69 73 20 0a 2a 2a 20 72 65 74  op. 0 is .** ret
16710 75 72 6e 65 64 20 69 6e 20 74 68 69 73 20 63 61  urned in this ca
16720 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  se..*/.static in
16730 74 20 66 74 73 35 41 6c 6c 6f 63 61 74 65 53 65  t fts5AllocateSe
16740 67 69 64 28 46 74 73 35 49 6e 64 65 78 20 2a 70  gid(Fts5Index *p
16750 2c 20 46 74 73 35 53 74 72 75 63 74 75 72 65 20  , Fts5Structure 
16760 2a 70 53 74 72 75 63 74 29 7b 0a 20 20 69 6e 74  *pStruct){.  int
16770 20 69 53 65 67 69 64 20 3d 20 30 3b 0a 0a 20 20   iSegid = 0;..  
16780 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  if( p->rc==SQLIT
16790 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20  E_OK ){.    if( 
167a0 70 53 74 72 75 63 74 2d 3e 6e 53 65 67 6d 65 6e  pStruct->nSegmen
167b0 74 3e 3d 46 54 53 35 5f 4d 41 58 5f 53 45 47 4d  t>=FTS5_MAX_SEGM
167c0 45 4e 54 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e  ENT ){.      p->
167d0 72 63 20 3d 20 53 51 4c 49 54 45 5f 46 55 4c 4c  rc = SQLITE_FULL
167e0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
167f0 20 20 20 77 68 69 6c 65 28 20 69 53 65 67 69 64     while( iSegid
16800 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69  ==0 ){.        i
16810 6e 74 20 69 4c 76 6c 2c 20 69 53 65 67 3b 0a 20  nt iLvl, iSeg;. 
16820 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72         sqlite3_r
16830 61 6e 64 6f 6d 6e 65 73 73 28 73 69 7a 65 6f 66  andomness(sizeof
16840 28 75 33 32 29 2c 20 28 76 6f 69 64 2a 29 26 69  (u32), (void*)&i
16850 53 65 67 69 64 29 3b 0a 20 20 20 20 20 20 20 20  Segid);.        
16860 69 53 65 67 69 64 20 3d 20 69 53 65 67 69 64 20  iSegid = iSegid 
16870 26 20 28 28 31 20 3c 3c 20 46 54 53 35 5f 44 41  & ((1 << FTS5_DA
16880 54 41 5f 49 44 5f 42 29 2d 31 29 3b 0a 20 20 20  TA_ID_B)-1);.   
16890 20 20 20 20 20 66 6f 72 28 69 4c 76 6c 3d 30 3b       for(iLvl=0;
168a0 20 69 4c 76 6c 3c 70 53 74 72 75 63 74 2d 3e 6e   iLvl<pStruct->n
168b0 4c 65 76 65 6c 3b 20 69 4c 76 6c 2b 2b 29 7b 0a  Level; iLvl++){.
168c0 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 69 53            for(iS
168d0 65 67 3d 30 3b 20 69 53 65 67 3c 70 53 74 72 75  eg=0; iSeg<pStru
168e0 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d  ct->aLevel[iLvl]
168f0 2e 6e 53 65 67 3b 20 69 53 65 67 2b 2b 29 7b 0a  .nSeg; iSeg++){.
16900 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
16910 69 53 65 67 69 64 3d 3d 70 53 74 72 75 63 74 2d  iSegid==pStruct-
16920 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d 2e 61 53  >aLevel[iLvl].aS
16930 65 67 5b 69 53 65 67 5d 2e 69 53 65 67 69 64 20  eg[iSeg].iSegid 
16940 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
16950 20 69 53 65 67 69 64 20 3d 20 30 3b 0a 20 20 20   iSegid = 0;.   
16960 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
16970 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
16980 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
16990 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 69 53 65   }..  return iSe
169a0 67 69 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 69  gid;.}../*.** Di
169b0 73 63 61 72 64 20 61 6c 6c 20 64 61 74 61 20 63  scard all data c
169c0 75 72 72 65 6e 74 6c 79 20 63 61 63 68 65 64 20  urrently cached 
169d0 69 6e 20 74 68 65 20 68 61 73 68 2d 74 61 62 6c  in the hash-tabl
169e0 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  es..*/.static vo
169f0 69 64 20 66 74 73 35 49 6e 64 65 78 44 69 73 63  id fts5IndexDisc
16a00 61 72 64 44 61 74 61 28 46 74 73 35 49 6e 64 65  ardData(Fts5Inde
16a10 78 20 2a 70 29 7b 0a 20 20 61 73 73 65 72 74 28  x *p){.  assert(
16a20 20 70 2d 3e 70 48 61 73 68 20 7c 7c 20 70 2d 3e   p->pHash || p->
16a30 6e 50 65 6e 64 69 6e 67 44 61 74 61 3d 3d 30 20  nPendingData==0 
16a40 29 3b 0a 20 20 69 66 28 20 70 2d 3e 70 48 61 73  );.  if( p->pHas
16a50 68 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  h ){.    sqlite3
16a60 46 74 73 35 48 61 73 68 43 6c 65 61 72 28 70 2d  Fts5HashClear(p-
16a70 3e 70 48 61 73 68 29 3b 0a 20 20 20 20 70 2d 3e  >pHash);.    p->
16a80 6e 50 65 6e 64 69 6e 67 44 61 74 61 20 3d 20 30  nPendingData = 0
16a90 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  ;.  }.}../*.** R
16aa0 65 74 75 72 6e 20 74 68 65 20 73 69 7a 65 20 6f  eturn the size o
16ab0 66 20 74 68 65 20 70 72 65 66 69 78 2c 20 69 6e  f the prefix, in
16ac0 20 62 79 74 65 73 2c 20 74 68 61 74 20 62 75 66   bytes, that buf
16ad0 66 65 72 20 28 6e 4e 65 77 2f 70 4e 65 77 29 20  fer (nNew/pNew) 
16ae0 73 68 61 72 65 73 0a 2a 2a 20 77 69 74 68 20 62  shares.** with b
16af0 75 66 66 65 72 20 28 6e 4f 6c 64 2f 70 4f 6c 64  uffer (nOld/pOld
16b00 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  )..*/.static int
16b10 20 66 74 73 35 50 72 65 66 69 78 43 6f 6d 70 72   fts5PrefixCompr
16b20 65 73 73 28 0a 20 20 69 6e 74 20 6e 4f 6c 64 2c  ess(.  int nOld,
16b30 20 63 6f 6e 73 74 20 75 38 20 2a 70 4f 6c 64 2c   const u8 *pOld,
16b40 0a 20 20 69 6e 74 20 6e 4e 65 77 2c 20 63 6f 6e  .  int nNew, con
16b50 73 74 20 75 38 20 2a 70 4e 65 77 0a 29 7b 0a 20  st u8 *pNew.){. 
16b60 20 69 6e 74 20 69 3b 0a 20 20 61 73 73 65 72 74   int i;.  assert
16b70 28 20 66 74 73 35 42 6c 6f 62 43 6f 6d 70 61 72  ( fts5BlobCompar
16b80 65 28 70 4f 6c 64 2c 20 6e 4f 6c 64 2c 20 70 4e  e(pOld, nOld, pN
16b90 65 77 2c 20 6e 4e 65 77 29 3c 30 20 29 3b 0a 20  ew, nNew)<0 );. 
16ba0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f 6c 64   for(i=0; i<nOld
16bb0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  ; i++){.    if( 
16bc0 70 4f 6c 64 5b 69 5d 21 3d 70 4e 65 77 5b 69 5d  pOld[i]!=pNew[i]
16bd0 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20   ) break;.  }.  
16be0 72 65 74 75 72 6e 20 69 3b 0a 7d 0a 0a 73 74 61  return i;.}..sta
16bf0 74 69 63 20 76 6f 69 64 20 66 74 73 35 57 72 69  tic void fts5Wri
16c00 74 65 44 6c 69 64 78 43 6c 65 61 72 28 0a 20 20  teDlidxClear(.  
16c10 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 0a 20  Fts5Index *p, . 
16c20 20 46 74 73 35 53 65 67 57 72 69 74 65 72 20 2a   Fts5SegWriter *
16c30 70 57 72 69 74 65 72 2c 0a 20 20 69 6e 74 20 62  pWriter,.  int b
16c40 46 6c 75 73 68 20 20 20 20 20 20 20 20 20 20 20  Flush           
16c50 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66             /* If
16c60 20 74 72 75 65 2c 20 77 72 69 74 65 20 64 6c 69   true, write dli
16c70 64 78 20 74 6f 20 64 69 73 6b 20 2a 2f 0a 29 7b  dx to disk */.){
16c80 0a 20 20 69 6e 74 20 69 3b 0a 20 20 61 73 73 65  .  int i;.  asse
16c90 72 74 28 20 62 46 6c 75 73 68 3d 3d 30 20 7c 7c  rt( bFlush==0 ||
16ca0 20 28 70 57 72 69 74 65 72 2d 3e 6e 44 6c 69 64   (pWriter->nDlid
16cb0 78 3e 30 20 26 26 20 70 57 72 69 74 65 72 2d 3e  x>0 && pWriter->
16cc0 61 44 6c 69 64 78 5b 30 5d 2e 62 75 66 2e 6e 3e  aDlidx[0].buf.n>
16cd0 30 29 20 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  0) );.  for(i=0;
16ce0 20 69 3c 70 57 72 69 74 65 72 2d 3e 6e 44 6c 69   i<pWriter->nDli
16cf0 64 78 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 46 74  dx; i++){.    Ft
16d00 73 35 44 6c 69 64 78 57 72 69 74 65 72 20 2a 70  s5DlidxWriter *p
16d10 44 6c 69 64 78 20 3d 20 26 70 57 72 69 74 65 72  Dlidx = &pWriter
16d20 2d 3e 61 44 6c 69 64 78 5b 69 5d 3b 0a 20 20 20  ->aDlidx[i];.   
16d30 20 69 66 28 20 70 44 6c 69 64 78 2d 3e 62 75 66   if( pDlidx->buf
16d40 2e 6e 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20  .n==0 ) break;. 
16d50 20 20 20 69 66 28 20 62 46 6c 75 73 68 20 29 7b     if( bFlush ){
16d60 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
16d70 44 6c 69 64 78 2d 3e 70 67 6e 6f 21 3d 30 20 29  Dlidx->pgno!=0 )
16d80 3b 0a 20 20 20 20 20 20 66 74 73 35 44 61 74 61  ;.      fts5Data
16d90 57 72 69 74 65 28 70 2c 20 0a 20 20 20 20 20 20  Write(p, .      
16da0 20 20 20 20 46 54 53 35 5f 44 4c 49 44 58 5f 52      FTS5_DLIDX_R
16db0 4f 57 49 44 28 70 57 72 69 74 65 72 2d 3e 69 53  OWID(pWriter->iS
16dc0 65 67 69 64 2c 20 69 2c 20 70 44 6c 69 64 78 2d  egid, i, pDlidx-
16dd0 3e 70 67 6e 6f 29 2c 0a 20 20 20 20 20 20 20 20  >pgno),.        
16de0 20 20 70 44 6c 69 64 78 2d 3e 62 75 66 2e 70 2c    pDlidx->buf.p,
16df0 20 70 44 6c 69 64 78 2d 3e 62 75 66 2e 6e 0a 20   pDlidx->buf.n. 
16e00 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 20 20       );.    }.  
16e10 20 20 73 71 6c 69 74 65 33 46 74 73 35 42 75 66    sqlite3Fts5Buf
16e20 66 65 72 5a 65 72 6f 28 26 70 44 6c 69 64 78 2d  ferZero(&pDlidx-
16e30 3e 62 75 66 29 3b 0a 20 20 20 20 70 44 6c 69 64  >buf);.    pDlid
16e40 78 2d 3e 62 50 72 65 76 56 61 6c 69 64 20 3d 20  x->bPrevValid = 
16e50 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  0;.  }.}../*.** 
16e60 47 72 6f 77 20 74 68 65 20 70 57 72 69 74 65 72  Grow the pWriter
16e70 2d 3e 61 44 6c 69 64 78 5b 5d 20 61 72 72 61 79  ->aDlidx[] array
16e80 20 74 6f 20 61 74 20 6c 65 61 73 74 20 6e 4c 76   to at least nLv
16e90 6c 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20 73 69  l elements in si
16ea0 7a 65 2e 0a 2a 2a 20 41 6e 79 20 6e 65 77 20 61  ze..** Any new a
16eb0 72 72 61 79 20 65 6c 65 6d 65 6e 74 73 20 61 72  rray elements ar
16ec0 65 20 7a 65 72 6f 65 64 20 62 65 66 6f 72 65 20  e zeroed before 
16ed0 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 73 74  returning..*/.st
16ee0 61 74 69 63 20 69 6e 74 20 66 74 73 35 57 72 69  atic int fts5Wri
16ef0 74 65 44 6c 69 64 78 47 72 6f 77 28 0a 20 20 46  teDlidxGrow(.  F
16f00 74 73 35 49 6e 64 65 78 20 2a 70 2c 0a 20 20 46  ts5Index *p,.  F
16f10 74 73 35 53 65 67 57 72 69 74 65 72 20 2a 70 57  ts5SegWriter *pW
16f20 72 69 74 65 72 2c 0a 20 20 69 6e 74 20 6e 4c 76  riter,.  int nLv
16f30 6c 0a 29 7b 0a 20 20 69 66 28 20 70 2d 3e 72 63  l.){.  if( p->rc
16f40 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 6e  ==SQLITE_OK && n
16f50 4c 76 6c 3e 3d 70 57 72 69 74 65 72 2d 3e 6e 44  Lvl>=pWriter->nD
16f60 6c 69 64 78 20 29 7b 0a 20 20 20 20 46 74 73 35  lidx ){.    Fts5
16f70 44 6c 69 64 78 57 72 69 74 65 72 20 2a 61 44 6c  DlidxWriter *aDl
16f80 69 64 78 20 3d 20 28 46 74 73 35 44 6c 69 64 78  idx = (Fts5Dlidx
16f90 57 72 69 74 65 72 2a 29 73 71 6c 69 74 65 33 5f  Writer*)sqlite3_
16fa0 72 65 61 6c 6c 6f 63 28 0a 20 20 20 20 20 20 20  realloc(.       
16fb0 20 70 57 72 69 74 65 72 2d 3e 61 44 6c 69 64 78   pWriter->aDlidx
16fc0 2c 20 73 69 7a 65 6f 66 28 46 74 73 35 44 6c 69  , sizeof(Fts5Dli
16fd0 64 78 57 72 69 74 65 72 29 20 2a 20 6e 4c 76 6c  dxWriter) * nLvl
16fe0 0a 20 20 20 20 29 3b 0a 20 20 20 20 69 66 28 20  .    );.    if( 
16ff0 61 44 6c 69 64 78 3d 3d 30 20 29 7b 0a 20 20 20  aDlidx==0 ){.   
17000 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54     p->rc = SQLIT
17010 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 65 6c  E_NOMEM;.    }el
17020 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 42  se{.      int nB
17030 79 74 65 20 3d 20 73 69 7a 65 6f 66 28 46 74 73  yte = sizeof(Fts
17040 35 44 6c 69 64 78 57 72 69 74 65 72 29 20 2a 20  5DlidxWriter) * 
17050 28 6e 4c 76 6c 20 2d 20 70 57 72 69 74 65 72 2d  (nLvl - pWriter-
17060 3e 6e 44 6c 69 64 78 29 3b 0a 20 20 20 20 20 20  >nDlidx);.      
17070 6d 65 6d 73 65 74 28 26 61 44 6c 69 64 78 5b 70  memset(&aDlidx[p
17080 57 72 69 74 65 72 2d 3e 6e 44 6c 69 64 78 5d 2c  Writer->nDlidx],
17090 20 30 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20 20   0, nByte);.    
170a0 20 20 70 57 72 69 74 65 72 2d 3e 61 44 6c 69 64    pWriter->aDlid
170b0 78 20 3d 20 61 44 6c 69 64 78 3b 0a 20 20 20 20  x = aDlidx;.    
170c0 20 20 70 57 72 69 74 65 72 2d 3e 6e 44 6c 69 64    pWriter->nDlid
170d0 78 20 3d 20 6e 4c 76 6c 3b 0a 20 20 20 20 7d 0a  x = nLvl;.    }.
170e0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e    }.  return p->
170f0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20  rc;.}../*.** If 
17100 74 68 65 20 63 75 72 72 65 6e 74 20 64 6f 63 6c  the current docl
17110 69 73 74 2d 69 6e 64 65 78 20 61 63 63 75 6d 75  ist-index accumu
17120 6c 61 74 69 6e 67 20 69 6e 20 70 57 72 69 74 65  lating in pWrite
17130 72 2d 3e 61 44 6c 69 64 78 5b 5d 20 69 73 20 6c  r->aDlidx[] is l
17140 61 72 67 65 0a 2a 2a 20 65 6e 6f 75 67 68 2c 20  arge.** enough, 
17150 66 6c 75 73 68 20 69 74 20 74 6f 20 64 69 73 6b  flush it to disk
17160 20 61 6e 64 20 72 65 74 75 72 6e 20 31 2e 20 4f   and return 1. O
17170 74 68 65 72 77 69 73 65 20 64 69 73 63 61 72 64  therwise discard
17180 20 69 74 20 61 6e 64 20 72 65 74 75 72 6e 0a 2a   it and return.*
17190 2a 20 7a 65 72 6f 2e 0a 2a 2f 0a 73 74 61 74 69  * zero..*/.stati
171a0 63 20 69 6e 74 20 66 74 73 35 57 72 69 74 65 46  c int fts5WriteF
171b0 6c 75 73 68 44 6c 69 64 78 28 46 74 73 35 49 6e  lushDlidx(Fts5In
171c0 64 65 78 20 2a 70 2c 20 46 74 73 35 53 65 67 57  dex *p, Fts5SegW
171d0 72 69 74 65 72 20 2a 70 57 72 69 74 65 72 29 7b  riter *pWriter){
171e0 0a 20 20 69 6e 74 20 62 46 6c 61 67 20 3d 20 30  .  int bFlag = 0
171f0 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65  ;..  /* If there
17200 20 77 65 72 65 20 46 54 53 35 5f 4d 49 4e 5f 44   were FTS5_MIN_D
17210 4c 49 44 58 5f 53 49 5a 45 20 6f 72 20 6d 6f 72  LIDX_SIZE or mor
17220 65 20 65 6d 70 74 79 20 6c 65 61 66 20 70 61 67  e empty leaf pag
17230 65 73 20 77 72 69 74 74 65 6e 0a 20 20 2a 2a 20  es written.  ** 
17240 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 2c  to the database,
17250 20 61 6c 73 6f 20 77 72 69 74 65 20 74 68 65 20   also write the 
17260 64 6f 63 6c 69 73 74 2d 69 6e 64 65 78 20 74 6f  doclist-index to
17270 20 64 69 73 6b 2e 20 20 2a 2f 0a 20 20 69 66 28   disk.  */.  if(
17280 20 70 57 72 69 74 65 72 2d 3e 61 44 6c 69 64 78   pWriter->aDlidx
17290 5b 30 5d 2e 62 75 66 2e 6e 3e 30 20 26 26 20 70  [0].buf.n>0 && p
172a0 57 72 69 74 65 72 2d 3e 6e 45 6d 70 74 79 3e 3d  Writer->nEmpty>=
172b0 46 54 53 35 5f 4d 49 4e 5f 44 4c 49 44 58 5f 53  FTS5_MIN_DLIDX_S
172c0 49 5a 45 20 29 7b 0a 20 20 20 20 62 46 6c 61 67  IZE ){.    bFlag
172d0 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 66 74 73 35   = 1;.  }.  fts5
172e0 57 72 69 74 65 44 6c 69 64 78 43 6c 65 61 72 28  WriteDlidxClear(
172f0 70 2c 20 70 57 72 69 74 65 72 2c 20 62 46 6c 61  p, pWriter, bFla
17300 67 29 3b 0a 20 20 70 57 72 69 74 65 72 2d 3e 6e  g);.  pWriter->n
17310 45 6d 70 74 79 20 3d 20 30 3b 0a 20 20 72 65 74  Empty = 0;.  ret
17320 75 72 6e 20 62 46 6c 61 67 3b 0a 7d 0a 0a 2f 2a  urn bFlag;.}../*
17330 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
17340 6e 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e  n is called when
17350 65 76 65 72 20 70 72 6f 63 65 73 73 69 6e 67 20  ever processing 
17360 6f 66 20 74 68 65 20 64 6f 63 6c 69 73 74 20 66  of the doclist f
17370 6f 72 20 74 68 65 20 0a 2a 2a 20 6c 61 73 74 20  or the .** last 
17380 74 65 72 6d 20 6f 6e 20 6c 65 61 66 20 70 61 67  term on leaf pag
17390 65 20 28 70 57 72 69 74 65 72 2d 3e 69 42 74 50  e (pWriter->iBtP
173a0 61 67 65 29 20 69 73 20 63 6f 6d 70 6c 65 74 65  age) is complete
173b0 64 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 6f  d. .**.** The do
173c0 63 6c 69 73 74 2d 69 6e 64 65 78 20 66 6f 72 20  clist-index for 
173d0 74 68 61 74 20 74 65 72 6d 20 69 73 20 63 75 72  that term is cur
173e0 72 65 6e 74 6c 79 20 73 74 6f 72 65 64 20 69 6e  rently stored in
173f0 2d 6d 65 6d 6f 72 79 20 77 69 74 68 69 6e 20 74  -memory within t
17400 68 65 0a 2a 2a 20 46 74 73 35 53 65 67 57 72 69  he.** Fts5SegWri
17410 74 65 72 2e 61 44 6c 69 64 78 5b 5d 20 61 72 72  ter.aDlidx[] arr
17420 61 79 2e 20 49 66 20 69 74 20 69 73 20 6c 61 72  ay. If it is lar
17430 67 65 20 65 6e 6f 75 67 68 2c 20 74 68 69 73 20  ge enough, this 
17440 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 77 72 69 74  function.** writ
17450 65 73 20 69 74 20 6f 75 74 20 74 6f 20 64 69 73  es it out to dis
17460 6b 2e 20 4f 72 2c 20 69 66 20 69 74 20 69 73 20  k. Or, if it is 
17470 74 6f 6f 20 73 6d 61 6c 6c 20 74 6f 20 62 6f 74  too small to bot
17480 68 65 72 20 77 69 74 68 2c 20 64 69 73 63 61 72  her with, discar
17490 64 73 0a 2a 2a 20 69 74 2e 0a 2a 2a 0a 2a 2a 20  ds.** it..**.** 
174a0 46 74 73 35 53 65 67 57 72 69 74 65 72 2e 62 74  Fts5SegWriter.bt
174b0 74 65 72 6d 20 63 75 72 72 65 6e 74 6c 79 20 63  term currently c
174c0 6f 6e 74 61 69 6e 73 20 74 68 65 20 66 69 72 73  ontains the firs
174d0 74 20 74 65 72 6d 20 6f 6e 20 70 61 67 65 20 69  t term on page i
174e0 42 74 50 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69  BtPage..*/.stati
174f0 63 20 76 6f 69 64 20 66 74 73 35 57 72 69 74 65  c void fts5Write
17500 46 6c 75 73 68 42 74 72 65 65 28 46 74 73 35 49  FlushBtree(Fts5I
17510 6e 64 65 78 20 2a 70 2c 20 46 74 73 35 53 65 67  ndex *p, Fts5Seg
17520 57 72 69 74 65 72 20 2a 70 57 72 69 74 65 72 29  Writer *pWriter)
17530 7b 0a 20 20 69 6e 74 20 62 46 6c 61 67 3b 0a 0a  {.  int bFlag;..
17540 20 20 61 73 73 65 72 74 28 20 70 57 72 69 74 65    assert( pWrite
17550 72 2d 3e 69 42 74 50 61 67 65 20 7c 7c 20 70 57  r->iBtPage || pW
17560 72 69 74 65 72 2d 3e 6e 45 6d 70 74 79 3d 3d 30  riter->nEmpty==0
17570 20 29 3b 0a 20 20 69 66 28 20 70 57 72 69 74 65   );.  if( pWrite
17580 72 2d 3e 69 42 74 50 61 67 65 3d 3d 30 20 29 20  r->iBtPage==0 ) 
17590 72 65 74 75 72 6e 3b 0a 20 20 62 46 6c 61 67 20  return;.  bFlag 
175a0 3d 20 66 74 73 35 57 72 69 74 65 46 6c 75 73 68  = fts5WriteFlush
175b0 44 6c 69 64 78 28 70 2c 20 70 57 72 69 74 65 72  Dlidx(p, pWriter
175c0 29 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d  );..  if( p->rc=
175d0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
175e0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20    const char *z 
175f0 3d 20 28 70 57 72 69 74 65 72 2d 3e 62 74 74 65  = (pWriter->btte
17600 72 6d 2e 6e 3e 30 3f 28 63 6f 6e 73 74 20 63 68  rm.n>0?(const ch
17610 61 72 2a 29 70 57 72 69 74 65 72 2d 3e 62 74 74  ar*)pWriter->btt
17620 65 72 6d 2e 70 3a 22 22 29 3b 0a 20 20 20 20 2f  erm.p:"");.    /
17630 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
17640 77 61 73 20 61 6c 72 65 61 64 79 20 64 6f 6e 65  was already done
17650 20 69 6e 20 66 74 73 35 57 72 69 74 65 49 6e 69   in fts5WriteIni
17660 74 28 29 3a 20 2a 2f 0a 20 20 20 20 2f 2a 20 73  t(): */.    /* s
17670 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 28  qlite3_bind_int(
17680 70 2d 3e 70 49 64 78 57 72 69 74 65 72 2c 20 31  p->pIdxWriter, 1
17690 2c 20 70 57 72 69 74 65 72 2d 3e 69 53 65 67 69  , pWriter->iSegi
176a0 64 29 3b 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74  d); */.    sqlit
176b0 65 33 5f 62 69 6e 64 5f 62 6c 6f 62 28 70 2d 3e  e3_bind_blob(p->
176c0 70 49 64 78 57 72 69 74 65 72 2c 20 32 2c 20 7a  pIdxWriter, 2, z
176d0 2c 20 70 57 72 69 74 65 72 2d 3e 62 74 74 65 72  , pWriter->btter
176e0 6d 2e 6e 2c 20 53 51 4c 49 54 45 5f 53 54 41 54  m.n, SQLITE_STAT
176f0 49 43 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  IC);.    sqlite3
17700 5f 62 69 6e 64 5f 69 6e 74 36 34 28 70 2d 3e 70  _bind_int64(p->p
17710 49 64 78 57 72 69 74 65 72 2c 20 33 2c 20 62 46  IdxWriter, 3, bF
17720 6c 61 67 20 2b 20 28 28 69 36 34 29 70 57 72 69  lag + ((i64)pWri
17730 74 65 72 2d 3e 69 42 74 50 61 67 65 3c 3c 31 29  ter->iBtPage<<1)
17740 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73  );.    sqlite3_s
17750 74 65 70 28 70 2d 3e 70 49 64 78 57 72 69 74 65  tep(p->pIdxWrite
17760 72 29 3b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20  r);.    p->rc = 
17770 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28 70 2d  sqlite3_reset(p-
17780 3e 70 49 64 78 57 72 69 74 65 72 29 3b 0a 20 20  >pIdxWriter);.  
17790 7d 0a 20 20 70 57 72 69 74 65 72 2d 3e 69 42 74  }.  pWriter->iBt
177a0 50 61 67 65 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a  Page = 0;.}../*.
177b0 2a 2a 20 54 68 69 73 20 69 73 20 63 61 6c 6c 65  ** This is calle
177c0 64 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20  d once for each 
177d0 6c 65 61 66 20 70 61 67 65 20 65 78 63 65 70 74  leaf page except
177e0 20 74 68 65 20 66 69 72 73 74 20 74 68 61 74 20   the first that 
177f0 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20 61 74 20 6c  contains.** at l
17800 65 61 73 74 20 6f 6e 65 20 74 65 72 6d 2e 20 41  east one term. A
17810 72 67 75 6d 65 6e 74 20 28 6e 54 65 72 6d 2f 70  rgument (nTerm/p
17820 54 65 72 6d 29 20 69 73 20 74 68 65 20 73 70 6c  Term) is the spl
17830 69 74 2d 6b 65 79 20 2d 20 61 20 74 65 72 6d 20  it-key - a term 
17840 74 68 61 74 0a 2a 2a 20 69 73 20 6c 61 72 67 65  that.** is large
17850 72 20 74 68 61 6e 20 61 6c 6c 20 74 65 72 6d 73  r than all terms
17860 20 77 72 69 74 74 65 6e 20 74 6f 20 65 61 72 6c   written to earl
17870 69 65 72 20 6c 65 61 76 65 73 2c 20 61 6e 64 20  ier leaves, and 
17880 65 71 75 61 6c 20 74 6f 20 6f 72 0a 2a 2a 20 73  equal to or.** s
17890 6d 61 6c 6c 65 72 20 74 68 61 6e 20 74 68 65 20  maller than the 
178a0 66 69 72 73 74 20 74 65 72 6d 20 6f 6e 20 74 68  first term on th
178b0 65 20 6e 65 77 20 6c 65 61 66 2e 0a 2a 2a 0a 2a  e new leaf..**.*
178c0 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  * If an error oc
178d0 63 75 72 73 2c 20 61 6e 20 65 72 72 6f 72 20 63  curs, an error c
178e0 6f 64 65 20 69 73 20 6c 65 66 74 20 69 6e 20 46  ode is left in F
178f0 74 73 35 49 6e 64 65 78 2e 72 63 2e 20 49 66 20  ts5Index.rc. If 
17900 61 6e 20 65 72 72 6f 72 0a 2a 2a 20 68 61 73 20  an error.** has 
17910 61 6c 72 65 61 64 79 20 6f 63 63 75 72 72 65 64  already occurred
17920 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74   when this funct
17930 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20 69  ion is called, i
17940 74 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f  t is a no-op..*/
17950 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
17960 35 57 72 69 74 65 42 74 72 65 65 54 65 72 6d 28  5WriteBtreeTerm(
17970 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c  .  Fts5Index *p,
17980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17990 20 20 20 2f 2a 20 46 54 53 35 20 62 61 63 6b 65     /* FTS5 backe
179a0 6e 64 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 46  nd object */.  F
179b0 74 73 35 53 65 67 57 72 69 74 65 72 20 2a 70 57  ts5SegWriter *pW
179c0 72 69 74 65 72 2c 20 20 20 20 20 20 20 20 20 2f  riter,         /
179d0 2a 20 57 72 69 74 65 72 20 6f 62 6a 65 63 74 20  * Writer object 
179e0 2a 2f 0a 20 20 69 6e 74 20 6e 54 65 72 6d 2c 20  */.  int nTerm, 
179f0 63 6f 6e 73 74 20 75 38 20 2a 70 54 65 72 6d 20  const u8 *pTerm 
17a00 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 74 65       /* First te
17a10 72 6d 20 6f 6e 20 6e 65 77 20 70 61 67 65 20 2a  rm on new page *
17a20 2f 0a 29 7b 0a 20 20 66 74 73 35 57 72 69 74 65  /.){.  fts5Write
17a30 46 6c 75 73 68 42 74 72 65 65 28 70 2c 20 70 57  FlushBtree(p, pW
17a40 72 69 74 65 72 29 3b 0a 20 20 66 74 73 35 42 75  riter);.  fts5Bu
17a50 66 66 65 72 53 65 74 28 26 70 2d 3e 72 63 2c 20  fferSet(&p->rc, 
17a60 26 70 57 72 69 74 65 72 2d 3e 62 74 74 65 72 6d  &pWriter->btterm
17a70 2c 20 6e 54 65 72 6d 2c 20 70 54 65 72 6d 29 3b  , nTerm, pTerm);
17a80 0a 20 20 70 57 72 69 74 65 72 2d 3e 69 42 74 50  .  pWriter->iBtP
17a90 61 67 65 20 3d 20 70 57 72 69 74 65 72 2d 3e 77  age = pWriter->w
17aa0 72 69 74 65 72 2e 70 67 6e 6f 3b 0a 7d 0a 0a 2f  riter.pgno;.}../
17ab0 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
17ac0 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65  on is called whe
17ad0 6e 20 66 6c 75 73 68 69 6e 67 20 61 20 6c 65 61  n flushing a lea
17ae0 66 20 70 61 67 65 20 74 68 61 74 20 63 6f 6e 74  f page that cont
17af0 61 69 6e 73 20 6e 6f 0a 2a 2a 20 74 65 72 6d 73  ains no.** terms
17b00 20 61 74 20 61 6c 6c 20 74 6f 20 64 69 73 6b 2e   at all to disk.
17b10 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
17b20 66 74 73 35 57 72 69 74 65 42 74 72 65 65 4e 6f  fts5WriteBtreeNo
17b30 54 65 72 6d 28 0a 20 20 46 74 73 35 49 6e 64 65  Term(.  Fts5Inde
17b40 78 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  x *p,           
17b50 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53 35 20          /* FTS5 
17b60 62 61 63 6b 65 6e 64 20 6f 62 6a 65 63 74 20 2a  backend object *
17b70 2f 0a 20 20 46 74 73 35 53 65 67 57 72 69 74 65  /.  Fts5SegWrite
17b80 72 20 2a 70 57 72 69 74 65 72 20 20 20 20 20 20  r *pWriter      
17b90 20 20 20 20 2f 2a 20 57 72 69 74 65 72 20 6f 62      /* Writer ob
17ba0 6a 65 63 74 20 2a 2f 0a 29 7b 0a 20 20 2f 2a 20  ject */.){.  /* 
17bb0 49 66 20 74 68 65 72 65 20 77 65 72 65 20 6e 6f  If there were no
17bc0 20 72 6f 77 69 64 73 20 6f 6e 20 74 68 65 20 6c   rowids on the l
17bd0 65 61 66 20 70 61 67 65 20 65 69 74 68 65 72 20  eaf page either 
17be0 61 6e 64 20 74 68 65 20 64 6f 63 6c 69 73 74 2d  and the doclist-
17bf0 69 6e 64 65 78 0a 20 20 2a 2a 20 68 61 73 20 61  index.  ** has a
17c00 6c 72 65 61 64 79 20 62 65 65 6e 20 73 74 61 72  lready been star
17c10 74 65 64 2c 20 61 70 70 65 6e 64 20 61 6e 20 30  ted, append an 0
17c20 78 30 30 20 62 79 74 65 20 74 6f 20 69 74 2e 20  x00 byte to it. 
17c30 20 2a 2f 0a 20 20 69 66 28 20 70 57 72 69 74 65   */.  if( pWrite
17c40 72 2d 3e 62 46 69 72 73 74 52 6f 77 69 64 49 6e  r->bFirstRowidIn
17c50 50 61 67 65 20 26 26 20 70 57 72 69 74 65 72 2d  Page && pWriter-
17c60 3e 61 44 6c 69 64 78 5b 30 5d 2e 62 75 66 2e 6e  >aDlidx[0].buf.n
17c70 3e 30 20 29 7b 0a 20 20 20 20 46 74 73 35 44 6c  >0 ){.    Fts5Dl
17c80 69 64 78 57 72 69 74 65 72 20 2a 70 44 6c 69 64  idxWriter *pDlid
17c90 78 20 3d 20 26 70 57 72 69 74 65 72 2d 3e 61 44  x = &pWriter->aD
17ca0 6c 69 64 78 5b 30 5d 3b 0a 20 20 20 20 61 73 73  lidx[0];.    ass
17cb0 65 72 74 28 20 70 44 6c 69 64 78 2d 3e 62 50 72  ert( pDlidx->bPr
17cc0 65 76 56 61 6c 69 64 20 29 3b 0a 20 20 20 20 73  evValid );.    s
17cd0 71 6c 69 74 65 33 46 74 73 35 42 75 66 66 65 72  qlite3Fts5Buffer
17ce0 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26 70 2d  AppendVarint(&p-
17cf0 3e 72 63 2c 20 26 70 44 6c 69 64 78 2d 3e 62 75  >rc, &pDlidx->bu
17d00 66 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  f, 0);.  }..  /*
17d10 20 49 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 22   Increment the "
17d20 6e 75 6d 62 65 72 20 6f 66 20 73 65 71 75 65 6e  number of sequen
17d30 74 69 61 6c 20 6c 65 61 76 65 73 20 77 69 74 68  tial leaves with
17d40 6f 75 74 20 61 20 74 65 72 6d 22 20 63 6f 75 6e  out a term" coun
17d50 74 65 72 2e 20 2a 2f 0a 20 20 70 57 72 69 74 65  ter. */.  pWrite
17d60 72 2d 3e 6e 45 6d 70 74 79 2b 2b 3b 0a 7d 0a 0a  r->nEmpty++;.}..
17d70 73 74 61 74 69 63 20 69 36 34 20 66 74 73 35 44  static i64 fts5D
17d80 6c 69 64 78 45 78 74 72 61 63 74 46 69 72 73 74  lidxExtractFirst
17d90 52 6f 77 69 64 28 46 74 73 35 42 75 66 66 65 72  Rowid(Fts5Buffer
17da0 20 2a 70 42 75 66 29 7b 0a 20 20 69 36 34 20 69   *pBuf){.  i64 i
17db0 52 6f 77 69 64 3b 0a 20 20 69 6e 74 20 69 4f 66  Rowid;.  int iOf
17dc0 66 3b 0a 0a 20 20 69 4f 66 66 20 3d 20 31 20 2b  f;..  iOff = 1 +
17dd0 20 66 74 73 35 47 65 74 56 61 72 69 6e 74 28 26   fts5GetVarint(&
17de0 70 42 75 66 2d 3e 70 5b 31 5d 2c 20 28 75 36 34  pBuf->p[1], (u64
17df0 2a 29 26 69 52 6f 77 69 64 29 3b 0a 20 20 66 74  *)&iRowid);.  ft
17e00 73 35 47 65 74 56 61 72 69 6e 74 28 26 70 42 75  s5GetVarint(&pBu
17e10 66 2d 3e 70 5b 69 4f 66 66 5d 2c 20 28 75 36 34  f->p[iOff], (u64
17e20 2a 29 26 69 52 6f 77 69 64 29 3b 0a 20 20 72 65  *)&iRowid);.  re
17e30 74 75 72 6e 20 69 52 6f 77 69 64 3b 0a 7d 0a 0a  turn iRowid;.}..
17e40 2f 2a 0a 2a 2a 20 52 6f 77 69 64 20 69 52 6f 77  /*.** Rowid iRow
17e50 69 64 20 68 61 73 20 6a 75 73 74 20 62 65 65 6e  id has just been
17e60 20 61 70 70 65 6e 64 65 64 20 74 6f 20 74 68 65   appended to the
17e70 20 63 75 72 72 65 6e 74 20 6c 65 61 66 20 70 61   current leaf pa
17e80 67 65 2e 20 49 74 20 69 73 20 74 68 65 0a 2a 2a  ge. It is the.**
17e90 20 66 69 72 73 74 20 6f 6e 20 74 68 65 20 70 61   first on the pa
17ea0 67 65 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f  ge. This functio
17eb0 6e 20 61 70 70 65 6e 64 73 20 61 6e 20 61 70 70  n appends an app
17ec0 72 6f 70 72 69 61 74 65 20 65 6e 74 72 79 20 74  ropriate entry t
17ed0 6f 20 74 68 65 20 63 75 72 72 65 6e 74 0a 2a 2a  o the current.**
17ee0 20 64 6f 63 6c 69 73 74 2d 69 6e 64 65 78 2e 0a   doclist-index..
17ef0 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
17f00 74 73 35 57 72 69 74 65 44 6c 69 64 78 41 70 70  ts5WriteDlidxApp
17f10 65 6e 64 28 0a 20 20 46 74 73 35 49 6e 64 65 78  end(.  Fts5Index
17f20 20 2a 70 2c 20 0a 20 20 46 74 73 35 53 65 67 57   *p, .  Fts5SegW
17f30 72 69 74 65 72 20 2a 70 57 72 69 74 65 72 2c 20  riter *pWriter, 
17f40 0a 20 20 69 36 34 20 69 52 6f 77 69 64 0a 29 7b  .  i64 iRowid.){
17f50 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20  .  int i;.  int 
17f60 62 44 6f 6e 65 20 3d 20 30 3b 0a 0a 20 20 66 6f  bDone = 0;..  fo
17f70 72 28 69 3d 30 3b 20 70 2d 3e 72 63 3d 3d 53 51  r(i=0; p->rc==SQ
17f80 4c 49 54 45 5f 4f 4b 20 26 26 20 62 44 6f 6e 65  LITE_OK && bDone
17f90 3d 3d 30 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  ==0; i++){.    i
17fa0 36 34 20 69 56 61 6c 3b 0a 20 20 20 20 46 74 73  64 iVal;.    Fts
17fb0 35 44 6c 69 64 78 57 72 69 74 65 72 20 2a 70 44  5DlidxWriter *pD
17fc0 6c 69 64 78 20 3d 20 26 70 57 72 69 74 65 72 2d  lidx = &pWriter-
17fd0 3e 61 44 6c 69 64 78 5b 69 5d 3b 0a 0a 20 20 20  >aDlidx[i];..   
17fe0 20 69 66 28 20 70 44 6c 69 64 78 2d 3e 62 75 66   if( pDlidx->buf
17ff0 2e 6e 3e 3d 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e  .n>=p->pConfig->
18000 70 67 73 7a 20 29 7b 0a 20 20 20 20 20 20 2f 2a  pgsz ){.      /*
18010 20 54 68 65 20 63 75 72 72 65 6e 74 20 64 6f 63   The current doc
18020 6c 69 73 74 2d 69 6e 64 65 78 20 70 61 67 65 20  list-index page 
18030 69 73 20 66 75 6c 6c 2e 20 57 72 69 74 65 20 69  is full. Write i
18040 74 20 74 6f 20 64 69 73 6b 20 61 6e 64 20 70 75  t to disk and pu
18050 73 68 0a 20 20 20 20 20 20 2a 2a 20 61 20 63 6f  sh.      ** a co
18060 70 79 20 6f 66 20 69 52 6f 77 69 64 20 28 77 68  py of iRowid (wh
18070 69 63 68 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20  ich will become 
18080 74 68 65 20 66 69 72 73 74 20 72 6f 77 69 64 20  the first rowid 
18090 6f 6e 20 74 68 65 20 6e 65 78 74 0a 20 20 20 20  on the next.    
180a0 20 20 2a 2a 20 64 6f 63 6c 69 73 74 2d 69 6e 64    ** doclist-ind
180b0 65 78 20 6c 65 61 66 20 70 61 67 65 29 20 75 70  ex leaf page) up
180c0 20 69 6e 74 6f 20 74 68 65 20 6e 65 78 74 20 6c   into the next l
180d0 65 76 65 6c 20 6f 66 20 74 68 65 20 62 2d 74 72  evel of the b-tr
180e0 65 65 20 0a 20 20 20 20 20 20 2a 2a 20 68 69 65  ee .      ** hie
180f0 72 61 72 63 68 79 2e 20 49 66 20 74 68 65 20 6e  rarchy. If the n
18100 6f 64 65 20 62 65 69 6e 67 20 66 6c 75 73 68 65  ode being flushe
18110 64 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 74  d is currently t
18120 68 65 20 72 6f 6f 74 20 6e 6f 64 65 2c 0a 20 20  he root node,.  
18130 20 20 20 20 2a 2a 20 61 6c 73 6f 20 70 75 73 68      ** also push
18140 20 69 74 73 20 66 69 72 73 74 20 72 6f 77 69 64   its first rowid
18150 20 75 70 77 61 72 64 73 2e 20 2a 2f 0a 20 20 20   upwards. */.   
18160 20 20 20 70 44 6c 69 64 78 2d 3e 62 75 66 2e 70     pDlidx->buf.p
18170 5b 30 5d 20 3d 20 30 78 30 31 3b 20 20 20 20 2f  [0] = 0x01;    /
18180 2a 20 4e 6f 74 20 74 68 65 20 72 6f 6f 74 20 6e  * Not the root n
18190 6f 64 65 20 2a 2f 0a 20 20 20 20 20 20 66 74 73  ode */.      fts
181a0 35 44 61 74 61 57 72 69 74 65 28 70 2c 20 0a 20  5DataWrite(p, . 
181b0 20 20 20 20 20 20 20 20 20 46 54 53 35 5f 44 4c           FTS5_DL
181c0 49 44 58 5f 52 4f 57 49 44 28 70 57 72 69 74 65  IDX_ROWID(pWrite
181d0 72 2d 3e 69 53 65 67 69 64 2c 20 69 2c 20 70 44  r->iSegid, i, pD
181e0 6c 69 64 78 2d 3e 70 67 6e 6f 29 2c 0a 20 20 20  lidx->pgno),.   
181f0 20 20 20 20 20 20 20 70 44 6c 69 64 78 2d 3e 62         pDlidx->b
18200 75 66 2e 70 2c 20 70 44 6c 69 64 78 2d 3e 62 75  uf.p, pDlidx->bu
18210 66 2e 6e 0a 20 20 20 20 20 20 29 3b 0a 20 20 20  f.n.      );.   
18220 20 20 20 66 74 73 35 57 72 69 74 65 44 6c 69 64     fts5WriteDlid
18230 78 47 72 6f 77 28 70 2c 20 70 57 72 69 74 65 72  xGrow(p, pWriter
18240 2c 20 69 2b 32 29 3b 0a 20 20 20 20 20 20 70 44  , i+2);.      pD
18250 6c 69 64 78 20 3d 20 26 70 57 72 69 74 65 72 2d  lidx = &pWriter-
18260 3e 61 44 6c 69 64 78 5b 69 5d 3b 0a 20 20 20 20  >aDlidx[i];.    
18270 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c    if( p->rc==SQL
18280 49 54 45 5f 4f 4b 20 26 26 20 70 44 6c 69 64 78  ITE_OK && pDlidx
18290 5b 31 5d 2e 62 75 66 2e 6e 3d 3d 30 20 29 7b 0a  [1].buf.n==0 ){.
182a0 20 20 20 20 20 20 20 20 69 36 34 20 69 46 69 72          i64 iFir
182b0 73 74 20 3d 20 66 74 73 35 44 6c 69 64 78 45 78  st = fts5DlidxEx
182c0 74 72 61 63 74 46 69 72 73 74 52 6f 77 69 64 28  tractFirstRowid(
182d0 26 70 44 6c 69 64 78 2d 3e 62 75 66 29 3b 0a 0a  &pDlidx->buf);..
182e0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20          /* This 
182f0 77 61 73 20 74 68 65 20 72 6f 6f 74 20 6e 6f 64  was the root nod
18300 65 2e 20 50 75 73 68 20 69 74 73 20 66 69 72 73  e. Push its firs
18310 74 20 72 6f 77 69 64 20 75 70 20 74 6f 20 74 68  t rowid up to th
18320 65 20 6e 65 77 20 72 6f 6f 74 2e 20 2a 2f 0a 20  e new root. */. 
18330 20 20 20 20 20 20 20 70 44 6c 69 64 78 5b 31 5d         pDlidx[1]
18340 2e 70 67 6e 6f 20 3d 20 70 44 6c 69 64 78 2d 3e  .pgno = pDlidx->
18350 70 67 6e 6f 3b 0a 20 20 20 20 20 20 20 20 73 71  pgno;.        sq
18360 6c 69 74 65 33 46 74 73 35 42 75 66 66 65 72 41  lite3Fts5BufferA
18370 70 70 65 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e  ppendVarint(&p->
18380 72 63 2c 20 26 70 44 6c 69 64 78 5b 31 5d 2e 62  rc, &pDlidx[1].b
18390 75 66 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  uf, 0);.        
183a0 73 71 6c 69 74 65 33 46 74 73 35 42 75 66 66 65  sqlite3Fts5Buffe
183b0 72 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26 70  rAppendVarint(&p
183c0 2d 3e 72 63 2c 20 26 70 44 6c 69 64 78 5b 31 5d  ->rc, &pDlidx[1]
183d0 2e 62 75 66 2c 20 70 44 6c 69 64 78 2d 3e 70 67  .buf, pDlidx->pg
183e0 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  no);.        sql
183f0 69 74 65 33 46 74 73 35 42 75 66 66 65 72 41 70  ite3Fts5BufferAp
18400 70 65 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e 72  pendVarint(&p->r
18410 63 2c 20 26 70 44 6c 69 64 78 5b 31 5d 2e 62 75  c, &pDlidx[1].bu
18420 66 2c 20 69 46 69 72 73 74 29 3b 0a 20 20 20 20  f, iFirst);.    
18430 20 20 20 20 70 44 6c 69 64 78 5b 31 5d 2e 62 50      pDlidx[1].bP
18440 72 65 76 56 61 6c 69 64 20 3d 20 31 3b 0a 20 20  revValid = 1;.  
18450 20 20 20 20 20 20 70 44 6c 69 64 78 5b 31 5d 2e        pDlidx[1].
18460 69 50 72 65 76 20 3d 20 69 46 69 72 73 74 3b 0a  iPrev = iFirst;.
18470 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 73        }..      s
18480 71 6c 69 74 65 33 46 74 73 35 42 75 66 66 65 72  qlite3Fts5Buffer
18490 5a 65 72 6f 28 26 70 44 6c 69 64 78 2d 3e 62 75  Zero(&pDlidx->bu
184a0 66 29 3b 0a 20 20 20 20 20 20 70 44 6c 69 64 78  f);.      pDlidx
184b0 2d 3e 62 50 72 65 76 56 61 6c 69 64 20 3d 20 30  ->bPrevValid = 0
184c0 3b 0a 20 20 20 20 20 20 70 44 6c 69 64 78 2d 3e  ;.      pDlidx->
184d0 70 67 6e 6f 2b 2b 3b 0a 20 20 20 20 7d 65 6c 73  pgno++;.    }els
184e0 65 7b 0a 20 20 20 20 20 20 62 44 6f 6e 65 20 3d  e{.      bDone =
184f0 20 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69   1;.    }..    i
18500 66 28 20 70 44 6c 69 64 78 2d 3e 62 50 72 65 76  f( pDlidx->bPrev
18510 56 61 6c 69 64 20 29 7b 0a 20 20 20 20 20 20 69  Valid ){.      i
18520 56 61 6c 20 3d 20 69 52 6f 77 69 64 20 2d 20 70  Val = iRowid - p
18530 44 6c 69 64 78 2d 3e 69 50 72 65 76 3b 0a 20 20  Dlidx->iPrev;.  
18540 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69    }else{.      i
18550 36 34 20 69 50 67 6e 6f 20 3d 20 28 69 3d 3d 30  64 iPgno = (i==0
18560 20 3f 20 70 57 72 69 74 65 72 2d 3e 77 72 69 74   ? pWriter->writ
18570 65 72 2e 70 67 6e 6f 20 3a 20 70 44 6c 69 64 78  er.pgno : pDlidx
18580 5b 2d 31 5d 2e 70 67 6e 6f 29 3b 0a 20 20 20 20  [-1].pgno);.    
18590 20 20 61 73 73 65 72 74 28 20 70 44 6c 69 64 78    assert( pDlidx
185a0 2d 3e 62 75 66 2e 6e 3d 3d 30 20 29 3b 0a 20 20  ->buf.n==0 );.  
185b0 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 42      sqlite3Fts5B
185c0 75 66 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e  ufferAppendVarin
185d0 74 28 26 70 2d 3e 72 63 2c 20 26 70 44 6c 69 64  t(&p->rc, &pDlid
185e0 78 2d 3e 62 75 66 2c 20 21 62 44 6f 6e 65 29 3b  x->buf, !bDone);
185f0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 46 74  .      sqlite3Ft
18600 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 56 61  s5BufferAppendVa
18610 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26 70 44  rint(&p->rc, &pD
18620 6c 69 64 78 2d 3e 62 75 66 2c 20 69 50 67 6e 6f  lidx->buf, iPgno
18630 29 3b 0a 20 20 20 20 20 20 69 56 61 6c 20 3d 20  );.      iVal = 
18640 69 52 6f 77 69 64 3b 0a 20 20 20 20 7d 0a 0a 20  iRowid;.    }.. 
18650 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 42 75     sqlite3Fts5Bu
18660 66 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e 74  fferAppendVarint
18670 28 26 70 2d 3e 72 63 2c 20 26 70 44 6c 69 64 78  (&p->rc, &pDlidx
18680 2d 3e 62 75 66 2c 20 69 56 61 6c 29 3b 0a 20 20  ->buf, iVal);.  
18690 20 20 70 44 6c 69 64 78 2d 3e 62 50 72 65 76 56    pDlidx->bPrevV
186a0 61 6c 69 64 20 3d 20 31 3b 0a 20 20 20 20 70 44  alid = 1;.    pD
186b0 6c 69 64 78 2d 3e 69 50 72 65 76 20 3d 20 69 52  lidx->iPrev = iR
186c0 6f 77 69 64 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61  owid;.  }.}..sta
186d0 74 69 63 20 76 6f 69 64 20 66 74 73 35 57 72 69  tic void fts5Wri
186e0 74 65 46 6c 75 73 68 4c 65 61 66 28 46 74 73 35  teFlushLeaf(Fts5
186f0 49 6e 64 65 78 20 2a 70 2c 20 46 74 73 35 53 65  Index *p, Fts5Se
18700 67 57 72 69 74 65 72 20 2a 70 57 72 69 74 65 72  gWriter *pWriter
18710 29 7b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73  ){.  static cons
18720 74 20 75 38 20 7a 65 72 6f 5b 5d 20 3d 20 7b 20  t u8 zero[] = { 
18730 30 78 30 30 2c 20 30 78 30 30 2c 20 30 78 30 30  0x00, 0x00, 0x00
18740 2c 20 30 78 30 30 20 7d 3b 0a 20 20 46 74 73 35  , 0x00 };.  Fts5
18750 50 61 67 65 57 72 69 74 65 72 20 2a 70 50 61 67  PageWriter *pPag
18760 65 20 3d 20 26 70 57 72 69 74 65 72 2d 3e 77 72  e = &pWriter->wr
18770 69 74 65 72 3b 0a 20 20 69 36 34 20 69 52 6f 77  iter;.  i64 iRow
18780 69 64 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 28  id;..  assert( (
18790 70 50 61 67 65 2d 3e 70 67 69 64 78 2e 6e 3d 3d  pPage->pgidx.n==
187a0 30 29 3d 3d 28 70 57 72 69 74 65 72 2d 3e 62 46  0)==(pWriter->bF
187b0 69 72 73 74 54 65 72 6d 49 6e 50 61 67 65 29 20  irstTermInPage) 
187c0 29 3b 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65  );..  /* Set the
187d0 20 73 7a 4c 65 61 66 20 68 65 61 64 65 72 20 66   szLeaf header f
187e0 69 65 6c 64 2e 20 2a 2f 0a 20 20 61 73 73 65 72  ield. */.  asser
187f0 74 28 20 30 3d 3d 66 74 73 35 47 65 74 55 31 36  t( 0==fts5GetU16
18800 28 26 70 50 61 67 65 2d 3e 62 75 66 2e 70 5b 32  (&pPage->buf.p[2
18810 5d 29 20 29 3b 0a 20 20 66 74 73 35 50 75 74 55  ]) );.  fts5PutU
18820 31 36 28 26 70 50 61 67 65 2d 3e 62 75 66 2e 70  16(&pPage->buf.p
18830 5b 32 5d 2c 20 70 50 61 67 65 2d 3e 62 75 66 2e  [2], pPage->buf.
18840 6e 29 3b 0a 0a 20 20 69 66 28 20 70 57 72 69 74  n);..  if( pWrit
18850 65 72 2d 3e 62 46 69 72 73 74 54 65 72 6d 49 6e  er->bFirstTermIn
18860 50 61 67 65 20 29 7b 0a 20 20 20 20 2f 2a 20 4e  Page ){.    /* N
18870 6f 20 74 65 72 6d 20 77 61 73 20 77 72 69 74 74  o term was writt
18880 65 6e 20 74 6f 20 74 68 69 73 20 70 61 67 65 2e  en to this page.
18890 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
188a0 70 50 61 67 65 2d 3e 70 67 69 64 78 2e 6e 3d 3d  pPage->pgidx.n==
188b0 30 20 29 3b 0a 20 20 20 20 66 74 73 35 57 72 69  0 );.    fts5Wri
188c0 74 65 42 74 72 65 65 4e 6f 54 65 72 6d 28 70 2c  teBtreeNoTerm(p,
188d0 20 70 57 72 69 74 65 72 29 3b 0a 20 20 7d 65 6c   pWriter);.  }el
188e0 73 65 7b 0a 20 20 20 20 2f 2a 20 41 70 70 65 6e  se{.    /* Appen
188f0 64 20 74 68 65 20 70 67 69 64 78 20 74 6f 20 74  d the pgidx to t
18900 68 65 20 70 61 67 65 20 62 75 66 66 65 72 2e 20  he page buffer. 
18910 53 65 74 20 74 68 65 20 73 7a 4c 65 61 66 20 68  Set the szLeaf h
18920 65 61 64 65 72 20 66 69 65 6c 64 2e 20 2a 2f 0a  eader field. */.
18930 20 20 20 20 66 74 73 35 42 75 66 66 65 72 41 70      fts5BufferAp
18940 70 65 6e 64 42 6c 6f 62 28 26 70 2d 3e 72 63 2c  pendBlob(&p->rc,
18950 20 26 70 50 61 67 65 2d 3e 62 75 66 2c 20 70 50   &pPage->buf, pP
18960 61 67 65 2d 3e 70 67 69 64 78 2e 6e 2c 20 70 50  age->pgidx.n, pP
18970 61 67 65 2d 3e 70 67 69 64 78 2e 70 29 3b 0a 20  age->pgidx.p);. 
18980 20 7d 0a 0a 20 20 2f 2a 20 57 72 69 74 65 20 74   }..  /* Write t
18990 68 65 20 70 61 67 65 20 6f 75 74 20 74 6f 20 64  he page out to d
189a0 69 73 6b 20 2a 2f 0a 20 20 69 52 6f 77 69 64 20  isk */.  iRowid 
189b0 3d 20 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f 52  = FTS5_SEGMENT_R
189c0 4f 57 49 44 28 70 57 72 69 74 65 72 2d 3e 69 53  OWID(pWriter->iS
189d0 65 67 69 64 2c 20 30 2c 20 70 50 61 67 65 2d 3e  egid, 0, pPage->
189e0 70 67 6e 6f 29 3b 0a 20 20 66 74 73 35 44 61 74  pgno);.  fts5Dat
189f0 61 57 72 69 74 65 28 70 2c 20 69 52 6f 77 69 64  aWrite(p, iRowid
18a00 2c 20 70 50 61 67 65 2d 3e 62 75 66 2e 70 2c 20  , pPage->buf.p, 
18a10 70 50 61 67 65 2d 3e 62 75 66 2e 6e 29 3b 0a 0a  pPage->buf.n);..
18a20 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20    /* Initialize 
18a30 74 68 65 20 6e 65 78 74 20 70 61 67 65 2e 20 2a  the next page. *
18a40 2f 0a 20 20 66 74 73 35 42 75 66 66 65 72 5a 65  /.  fts5BufferZe
18a50 72 6f 28 26 70 50 61 67 65 2d 3e 62 75 66 29 3b  ro(&pPage->buf);
18a60 0a 20 20 66 74 73 35 42 75 66 66 65 72 5a 65 72  .  fts5BufferZer
18a70 6f 28 26 70 50 61 67 65 2d 3e 70 67 69 64 78 29  o(&pPage->pgidx)
18a80 3b 0a 20 20 66 74 73 35 42 75 66 66 65 72 41 70  ;.  fts5BufferAp
18a90 70 65 6e 64 42 6c 6f 62 28 26 70 2d 3e 72 63 2c  pendBlob(&p->rc,
18aa0 20 26 70 50 61 67 65 2d 3e 62 75 66 2c 20 34 2c   &pPage->buf, 4,
18ab0 20 7a 65 72 6f 29 3b 0a 20 20 70 50 61 67 65 2d   zero);.  pPage-
18ac0 3e 70 67 6e 6f 2b 2b 3b 0a 0a 20 20 2f 2a 20 49  >pgno++;..  /* I
18ad0 6e 63 72 65 61 73 65 20 74 68 65 20 6c 65 61 76  ncrease the leav
18ae0 65 73 20 77 72 69 74 74 65 6e 20 63 6f 75 6e 74  es written count
18af0 65 72 20 2a 2f 0a 20 20 70 57 72 69 74 65 72 2d  er */.  pWriter-
18b00 3e 6e 4c 65 61 66 57 72 69 74 74 65 6e 2b 2b 3b  >nLeafWritten++;
18b10 0a 0a 20 20 2f 2a 20 54 68 65 20 6e 65 77 20 6c  ..  /* The new l
18b20 65 61 66 20 68 6f 6c 64 73 20 6e 6f 20 74 65 72  eaf holds no ter
18b30 6d 73 20 6f 72 20 72 6f 77 69 64 73 20 2a 2f 0a  ms or rowids */.
18b40 20 20 70 57 72 69 74 65 72 2d 3e 62 46 69 72 73    pWriter->bFirs
18b50 74 54 65 72 6d 49 6e 50 61 67 65 20 3d 20 31 3b  tTermInPage = 1;
18b60 0a 20 20 70 57 72 69 74 65 72 2d 3e 62 46 69 72  .  pWriter->bFir
18b70 73 74 52 6f 77 69 64 49 6e 50 61 67 65 20 3d 20  stRowidInPage = 
18b80 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 65  1;.}../*.** Appe
18b90 6e 64 20 74 65 72 6d 20 70 54 65 72 6d 2f 6e 54  nd term pTerm/nT
18ba0 65 72 6d 20 74 6f 20 74 68 65 20 73 65 67 6d 65  erm to the segme
18bb0 6e 74 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e  nt being written
18bc0 20 62 79 20 74 68 65 20 77 72 69 74 65 72 20 70   by the writer p
18bd0 61 73 73 65 64 0a 2a 2a 20 61 73 20 74 68 65 20  assed.** as the 
18be0 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2e  second argument.
18bf0 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72  .**.** If an err
18c00 6f 72 20 6f 63 63 75 72 73 2c 20 73 65 74 20 74  or occurs, set t
18c10 68 65 20 46 74 73 35 49 6e 64 65 78 2e 72 63 20  he Fts5Index.rc 
18c20 65 72 72 6f 72 20 63 6f 64 65 2e 20 49 66 20 61  error code. If a
18c30 6e 20 65 72 72 6f 72 20 68 61 73 20 0a 2a 2a 20  n error has .** 
18c40 61 6c 72 65 61 64 79 20 6f 63 63 75 72 72 65 64  already occurred
18c50 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  , this function 
18c60 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73  is a no-op..*/.s
18c70 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 57  tatic void fts5W
18c80 72 69 74 65 41 70 70 65 6e 64 54 65 72 6d 28 0a  riteAppendTerm(.
18c90 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20    Fts5Index *p, 
18ca0 0a 20 20 46 74 73 35 53 65 67 57 72 69 74 65 72  .  Fts5SegWriter
18cb0 20 2a 70 57 72 69 74 65 72 2c 0a 20 20 69 6e 74   *pWriter,.  int
18cc0 20 6e 54 65 72 6d 2c 20 63 6f 6e 73 74 20 75 38   nTerm, const u8
18cd0 20 2a 70 54 65 72 6d 20 0a 29 7b 0a 20 20 69 6e   *pTerm .){.  in
18ce0 74 20 6e 50 72 65 66 69 78 3b 20 20 20 20 20 20  t nPrefix;      
18cf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
18d00 20 42 79 74 65 73 20 6f 66 20 70 72 65 66 69 78   Bytes of prefix
18d10 20 63 6f 6d 70 72 65 73 73 69 6f 6e 20 66 6f 72   compression for
18d20 20 74 65 72 6d 20 2a 2f 0a 20 20 46 74 73 35 50   term */.  Fts5P
18d30 61 67 65 57 72 69 74 65 72 20 2a 70 50 61 67 65  ageWriter *pPage
18d40 20 3d 20 26 70 57 72 69 74 65 72 2d 3e 77 72 69   = &pWriter->wri
18d50 74 65 72 3b 0a 20 20 46 74 73 35 42 75 66 66 65  ter;.  Fts5Buffe
18d60 72 20 2a 70 50 67 69 64 78 20 3d 20 26 70 57 72  r *pPgidx = &pWr
18d70 69 74 65 72 2d 3e 77 72 69 74 65 72 2e 70 67 69  iter->writer.pgi
18d80 64 78 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  dx;..  assert( p
18d90 50 61 67 65 2d 3e 62 75 66 2e 6e 3d 3d 30 20 7c  Page->buf.n==0 |
18da0 7c 20 70 50 61 67 65 2d 3e 62 75 66 2e 6e 3e 34  | pPage->buf.n>4
18db0 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d   );.  if( pPage-
18dc0 3e 62 75 66 2e 6e 3d 3d 30 20 29 7b 0a 20 20 20  >buf.n==0 ){.   
18dd0 20 2f 2a 20 5a 65 72 6f 20 74 68 65 20 66 69 72   /* Zero the fir
18de0 73 74 20 74 65 72 6d 20 61 6e 64 20 66 69 72 73  st term and firs
18df0 74 20 72 6f 77 69 64 20 66 69 65 6c 64 73 20 2a  t rowid fields *
18e00 2f 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e  /.    static con
18e10 73 74 20 75 38 20 7a 65 72 6f 5b 5d 20 3d 20 7b  st u8 zero[] = {
18e20 20 30 78 30 30 2c 20 30 78 30 30 2c 20 30 78 30   0x00, 0x00, 0x0
18e30 30 2c 20 30 78 30 30 20 7d 3b 0a 20 20 20 20 66  0, 0x00 };.    f
18e40 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 42  ts5BufferAppendB
18e50 6c 6f 62 28 26 70 2d 3e 72 63 2c 20 26 70 50 61  lob(&p->rc, &pPa
18e60 67 65 2d 3e 62 75 66 2c 20 34 2c 20 7a 65 72 6f  ge->buf, 4, zero
18e70 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
18e80 57 72 69 74 65 72 2d 3e 62 46 69 72 73 74 54 65  Writer->bFirstTe
18e90 72 6d 49 6e 50 61 67 65 20 29 3b 0a 20 20 7d 0a  rmInPage );.  }.
18ea0 20 20 69 66 28 20 70 2d 3e 72 63 20 29 20 72 65    if( p->rc ) re
18eb0 74 75 72 6e 3b 0a 20 20 0a 20 20 2f 2a 20 54 4f  turn;.  .  /* TO
18ec0 44 4f 31 3a 20 43 61 6e 20 74 68 69 73 20 62 65  DO1: Can this be
18ed0 20 63 6f 6e 73 6f 6c 69 64 61 74 65 64 20 77 69   consolidated wi
18ee0 74 68 20 46 6c 75 73 68 4f 6e 65 48 61 73 68 20  th FlushOneHash 
18ef0 76 65 72 73 69 6f 6e 3f 20 2a 2f 0a 20 20 66 74  version? */.  ft
18f00 73 35 50 75 74 55 31 36 28 26 70 50 67 69 64 78  s5PutU16(&pPgidx
18f10 2d 3e 70 5b 70 50 67 69 64 78 2d 3e 6e 5d 2c 20  ->p[pPgidx->n], 
18f20 70 50 61 67 65 2d 3e 62 75 66 2e 6e 29 3b 0a 20  pPage->buf.n);. 
18f30 20 70 50 67 69 64 78 2d 3e 6e 20 2b 3d 20 32 3b   pPgidx->n += 2;
18f40 0a 0a 20 20 69 66 28 20 70 57 72 69 74 65 72 2d  ..  if( pWriter-
18f50 3e 62 46 69 72 73 74 54 65 72 6d 49 6e 50 61 67  >bFirstTermInPag
18f60 65 20 29 7b 0a 20 20 20 20 2f 2a 20 55 70 64 61  e ){.    /* Upda
18f70 74 65 20 74 68 65 20 22 66 69 72 73 74 20 74 65  te the "first te
18f80 72 6d 22 20 66 69 65 6c 64 20 6f 66 20 74 68 65  rm" field of the
18f90 20 70 61 67 65 20 68 65 61 64 65 72 2e 20 2a 2f   page header. */
18fa0 0a 23 69 66 20 30 0a 20 20 20 20 61 73 73 65 72  .#if 0.    asser
18fb0 74 28 20 70 50 61 67 65 2d 3e 62 75 66 2e 70 5b  t( pPage->buf.p[
18fc0 32 5d 3d 3d 30 20 26 26 20 70 50 61 67 65 2d 3e  2]==0 && pPage->
18fd0 62 75 66 2e 70 5b 33 5d 3d 3d 30 20 29 3b 0a 20  buf.p[3]==0 );. 
18fe0 20 20 20 66 74 73 35 50 75 74 55 31 36 28 26 70     fts5PutU16(&p
18ff0 50 61 67 65 2d 3e 62 75 66 2e 70 5b 32 5d 2c 20  Page->buf.p[2], 
19000 70 50 61 67 65 2d 3e 62 75 66 2e 6e 29 3b 0a 23  pPage->buf.n);.#
19010 65 6e 64 69 66 0a 20 20 20 20 6e 50 72 65 66 69  endif.    nPrefi
19020 78 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 70  x = 0;.    if( p
19030 50 61 67 65 2d 3e 70 67 6e 6f 21 3d 31 20 29 7b  Page->pgno!=1 ){
19040 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 69  .      /* This i
19050 73 20 74 68 65 20 66 69 72 73 74 20 74 65 72 6d  s the first term
19060 20 6f 6e 20 61 20 6c 65 61 66 20 74 68 61 74 20   on a leaf that 
19070 69 73 20 6e 6f 74 20 74 68 65 20 6c 65 66 74 6d  is not the leftm
19080 6f 73 74 20 6c 65 61 66 20 69 6e 0a 20 20 20 20  ost leaf in.    
19090 20 20 2a 2a 20 74 68 65 20 73 65 67 6d 65 6e 74    ** the segment
190a0 20 62 2d 74 72 65 65 2e 20 49 6e 20 74 68 69 73   b-tree. In this
190b0 20 63 61 73 65 20 69 74 20 69 73 20 6e 65 63 65   case it is nece
190c0 73 73 61 72 79 20 74 6f 20 61 64 64 20 61 20 74  ssary to add a t
190d0 65 72 6d 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20  erm to.      ** 
190e0 74 68 65 20 62 2d 74 72 65 65 20 68 69 65 72 61  the b-tree hiera
190f0 72 63 68 79 20 74 68 61 74 20 69 73 20 28 61 29  rchy that is (a)
19100 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68 65   larger than the
19110 20 6c 61 72 67 65 73 74 20 74 65 72 6d 20 0a 20   largest term . 
19120 20 20 20 20 20 2a 2a 20 61 6c 72 65 61 64 79 20       ** already 
19130 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 73  written to the s
19140 65 67 6d 65 6e 74 20 61 6e 64 20 28 62 29 20 73  egment and (b) s
19150 6d 61 6c 6c 65 72 20 74 68 61 6e 20 6f 72 20 65  maller than or e
19160 71 75 61 6c 20 74 6f 0a 20 20 20 20 20 20 2a 2a  qual to.      **
19170 20 74 68 69 73 20 74 65 72 6d 2e 20 49 6e 20 6f   this term. In o
19180 74 68 65 72 20 77 6f 72 64 73 2c 20 61 20 70 72  ther words, a pr
19190 65 66 69 78 20 6f 66 20 28 70 54 65 72 6d 2f 6e  efix of (pTerm/n
191a0 54 65 72 6d 29 20 74 68 61 74 20 69 73 20 6f 6e  Term) that is on
191b0 65 0a 20 20 20 20 20 20 2a 2a 20 62 79 74 65 20  e.      ** byte 
191c0 6c 6f 6e 67 65 72 20 74 68 61 6e 20 74 68 65 20  longer than the 
191d0 6c 6f 6e 67 65 73 74 20 70 72 65 66 69 78 20 28  longest prefix (
191e0 70 54 65 72 6d 2f 6e 54 65 72 6d 29 20 73 68 61  pTerm/nTerm) sha
191f0 72 65 73 20 77 69 74 68 20 74 68 65 0a 20 20 20  res with the.   
19200 20 20 20 2a 2a 20 70 72 65 76 69 6f 75 73 20 74     ** previous t
19210 65 72 6d 2e 20 0a 20 20 20 20 20 20 2a 2a 0a 20  erm. .      **. 
19220 20 20 20 20 20 2a 2a 20 55 73 75 61 6c 6c 79 2c       ** Usually,
19230 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 74 65   the previous te
19240 72 6d 20 69 73 20 61 76 61 69 6c 61 62 6c 65 20  rm is available 
19250 69 6e 20 70 50 61 67 65 2d 3e 74 65 72 6d 2e 20  in pPage->term. 
19260 54 68 65 20 65 78 63 65 70 74 69 6f 6e 0a 20 20  The exception.  
19270 20 20 20 20 2a 2a 20 69 73 20 69 66 20 74 68 69      ** is if thi
19280 73 20 69 73 20 74 68 65 20 66 69 72 73 74 20 74  s is the first t
19290 65 72 6d 20 77 72 69 74 74 65 6e 20 69 6e 20 61  erm written in a
192a0 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c 2d 6d 65  n incremental-me
192b0 72 67 65 20 73 74 65 70 2e 0a 20 20 20 20 20 20  rge step..      
192c0 2a 2a 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  ** In this case 
192d0 74 68 65 20 70 72 65 76 69 6f 75 73 20 74 65 72  the previous ter
192e0 6d 20 69 73 20 6e 6f 74 20 61 76 61 69 6c 61 62  m is not availab
192f0 6c 65 2c 20 73 6f 20 6a 75 73 74 20 77 72 69 74  le, so just writ
19300 65 20 61 0a 20 20 20 20 20 20 2a 2a 20 63 6f 70  e a.      ** cop
19310 79 20 6f 66 20 28 70 54 65 72 6d 2f 6e 54 65 72  y of (pTerm/nTer
19320 6d 29 20 69 6e 74 6f 20 74 68 65 20 70 61 72 65  m) into the pare
19330 6e 74 20 6e 6f 64 65 2e 20 54 68 69 73 20 69 73  nt node. This is
19340 20 73 6c 69 67 68 74 6c 79 0a 20 20 20 20 20 20   slightly.      
19350 2a 2a 20 69 6e 65 66 66 69 63 69 65 6e 74 2c 20  ** inefficient, 
19360 62 75 74 20 73 74 69 6c 6c 20 63 6f 72 72 65 63  but still correc
19370 74 2e 20 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  t.  */.      int
19380 20 6e 20 3d 20 6e 54 65 72 6d 3b 0a 20 20 20 20   n = nTerm;.    
19390 20 20 69 66 28 20 70 50 61 67 65 2d 3e 74 65 72    if( pPage->ter
193a0 6d 2e 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 6e  m.n ){.        n
193b0 20 3d 20 31 20 2b 20 66 74 73 35 50 72 65 66 69   = 1 + fts5Prefi
193c0 78 43 6f 6d 70 72 65 73 73 28 70 50 61 67 65 2d  xCompress(pPage-
193d0 3e 74 65 72 6d 2e 6e 2c 20 70 50 61 67 65 2d 3e  >term.n, pPage->
193e0 74 65 72 6d 2e 70 2c 20 6e 54 65 72 6d 2c 20 70  term.p, nTerm, p
193f0 54 65 72 6d 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Term);.      }. 
19400 20 20 20 20 20 66 74 73 35 57 72 69 74 65 42 74       fts5WriteBt
19410 72 65 65 54 65 72 6d 28 70 2c 20 70 57 72 69 74  reeTerm(p, pWrit
19420 65 72 2c 20 6e 2c 20 70 54 65 72 6d 29 3b 0a 20  er, n, pTerm);. 
19430 20 20 20 20 20 70 50 61 67 65 20 3d 20 26 70 57       pPage = &pW
19440 72 69 74 65 72 2d 3e 77 72 69 74 65 72 3b 0a 20  riter->writer;. 
19450 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20     }.  }else{.  
19460 20 20 6e 50 72 65 66 69 78 20 3d 20 66 74 73 35    nPrefix = fts5
19470 50 72 65 66 69 78 43 6f 6d 70 72 65 73 73 28 70  PrefixCompress(p
19480 50 61 67 65 2d 3e 74 65 72 6d 2e 6e 2c 20 70 50  Page->term.n, pP
19490 61 67 65 2d 3e 74 65 72 6d 2e 70 2c 20 6e 54 65  age->term.p, nTe
194a0 72 6d 2c 20 70 54 65 72 6d 29 3b 0a 20 20 20 20  rm, pTerm);.    
194b0 66 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64  fts5BufferAppend
194c0 56 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26  Varint(&p->rc, &
194d0 70 50 61 67 65 2d 3e 62 75 66 2c 20 6e 50 72 65  pPage->buf, nPre
194e0 66 69 78 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  fix);.  }..  /* 
194f0 41 70 70 65 6e 64 20 74 68 65 20 6e 75 6d 62 65  Append the numbe
19500 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20 6e 65  r of bytes of ne
19510 77 20 64 61 74 61 2c 20 74 68 65 6e 20 74 68 65  w data, then the
19520 20 74 65 72 6d 20 64 61 74 61 20 69 74 73 65 6c   term data itsel
19530 66 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20 70 61  f.  ** to the pa
19540 67 65 2e 20 2a 2f 0a 20 20 66 74 73 35 42 75 66  ge. */.  fts5Buf
19550 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e 74 28  ferAppendVarint(
19560 26 70 2d 3e 72 63 2c 20 26 70 50 61 67 65 2d 3e  &p->rc, &pPage->
19570 62 75 66 2c 20 6e 54 65 72 6d 20 2d 20 6e 50 72  buf, nTerm - nPr
19580 65 66 69 78 29 3b 0a 20 20 66 74 73 35 42 75 66  efix);.  fts5Buf
19590 66 65 72 41 70 70 65 6e 64 42 6c 6f 62 28 26 70  ferAppendBlob(&p
195a0 2d 3e 72 63 2c 20 26 70 50 61 67 65 2d 3e 62 75  ->rc, &pPage->bu
195b0 66 2c 20 6e 54 65 72 6d 20 2d 20 6e 50 72 65 66  f, nTerm - nPref
195c0 69 78 2c 20 26 70 54 65 72 6d 5b 6e 50 72 65 66  ix, &pTerm[nPref
195d0 69 78 5d 29 3b 0a 0a 20 20 2f 2a 20 55 70 64 61  ix]);..  /* Upda
195e0 74 65 20 74 68 65 20 46 74 73 35 50 61 67 65 57  te the Fts5PageW
195f0 72 69 74 65 72 2e 74 65 72 6d 20 66 69 65 6c 64  riter.term field
19600 2e 20 2a 2f 0a 20 20 66 74 73 35 42 75 66 66 65  . */.  fts5Buffe
19610 72 53 65 74 28 26 70 2d 3e 72 63 2c 20 26 70 50  rSet(&p->rc, &pP
19620 61 67 65 2d 3e 74 65 72 6d 2c 20 6e 54 65 72 6d  age->term, nTerm
19630 2c 20 70 54 65 72 6d 29 3b 0a 20 20 70 57 72 69  , pTerm);.  pWri
19640 74 65 72 2d 3e 62 46 69 72 73 74 54 65 72 6d 49  ter->bFirstTermI
19650 6e 50 61 67 65 20 3d 20 30 3b 0a 0a 20 20 70 57  nPage = 0;..  pW
19660 72 69 74 65 72 2d 3e 62 46 69 72 73 74 52 6f 77  riter->bFirstRow
19670 69 64 49 6e 50 61 67 65 20 3d 20 30 3b 0a 20 20  idInPage = 0;.  
19680 70 57 72 69 74 65 72 2d 3e 62 46 69 72 73 74 52  pWriter->bFirstR
19690 6f 77 69 64 49 6e 44 6f 63 6c 69 73 74 20 3d 20  owidInDoclist = 
196a0 31 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 2d  1;..  assert( p-
196b0 3e 72 63 20 7c 7c 20 28 70 57 72 69 74 65 72 2d  >rc || (pWriter-
196c0 3e 6e 44 6c 69 64 78 3e 30 20 26 26 20 70 57 72  >nDlidx>0 && pWr
196d0 69 74 65 72 2d 3e 61 44 6c 69 64 78 5b 30 5d 2e  iter->aDlidx[0].
196e0 62 75 66 2e 6e 3d 3d 30 29 20 29 3b 0a 20 20 70  buf.n==0) );.  p
196f0 57 72 69 74 65 72 2d 3e 61 44 6c 69 64 78 5b 30  Writer->aDlidx[0
19700 5d 2e 70 67 6e 6f 20 3d 20 70 50 61 67 65 2d 3e  ].pgno = pPage->
19710 70 67 6e 6f 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  pgno;..  /* If t
19720 68 65 20 63 75 72 72 65 6e 74 20 6c 65 61 66 20  he current leaf 
19730 70 61 67 65 20 69 73 20 66 75 6c 6c 2c 20 66 6c  page is full, fl
19740 75 73 68 20 69 74 20 74 6f 20 64 69 73 6b 2e 20  ush it to disk. 
19750 2a 2f 0a 20 20 69 66 28 20 28 70 50 61 67 65 2d  */.  if( (pPage-
19760 3e 62 75 66 2e 6e 20 2b 20 70 50 61 67 65 2d 3e  >buf.n + pPage->
19770 70 67 69 64 78 2e 6e 29 3e 3d 70 2d 3e 70 43 6f  pgidx.n)>=p->pCo
19780 6e 66 69 67 2d 3e 70 67 73 7a 20 29 7b 0a 20 20  nfig->pgsz ){.  
19790 20 20 66 74 73 35 57 72 69 74 65 46 6c 75 73 68    fts5WriteFlush
197a0 4c 65 61 66 28 70 2c 20 70 57 72 69 74 65 72 29  Leaf(p, pWriter)
197b0 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  ;.  }.}../*.** A
197c0 70 70 65 6e 64 20 61 20 72 6f 77 69 64 20 61 6e  ppend a rowid an
197d0 64 20 70 6f 73 69 74 69 6f 6e 2d 6c 69 73 74 20  d position-list 
197e0 73 69 7a 65 20 66 69 65 6c 64 20 74 6f 20 74 68  size field to th
197f0 65 20 77 72 69 74 65 72 73 20 6f 75 74 70 75 74  e writers output
19800 2e 20 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  . .*/.static voi
19810 64 20 66 74 73 35 57 72 69 74 65 41 70 70 65 6e  d fts5WriteAppen
19820 64 52 6f 77 69 64 28 0a 20 20 46 74 73 35 49 6e  dRowid(.  Fts5In
19830 64 65 78 20 2a 70 2c 20 0a 20 20 46 74 73 35 53  dex *p, .  Fts5S
19840 65 67 57 72 69 74 65 72 20 2a 70 57 72 69 74 65  egWriter *pWrite
19850 72 2c 0a 20 20 69 36 34 20 69 52 6f 77 69 64 2c  r,.  i64 iRowid,
19860 0a 20 20 69 6e 74 20 6e 50 6f 73 0a 29 7b 0a 20  .  int nPos.){. 
19870 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49   if( p->rc==SQLI
19880 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 46 74 73  TE_OK ){.    Fts
19890 35 50 61 67 65 57 72 69 74 65 72 20 2a 70 50 61  5PageWriter *pPa
198a0 67 65 20 3d 20 26 70 57 72 69 74 65 72 2d 3e 77  ge = &pWriter->w
198b0 72 69 74 65 72 3b 0a 0a 20 20 20 20 2f 2a 20 49  riter;..    /* I
198c0 66 20 74 68 69 73 20 69 73 20 74 6f 20 62 65 20  f this is to be 
198d0 74 68 65 20 66 69 72 73 74 20 72 6f 77 69 64 20  the first rowid 
198e0 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 70  written to the p
198f0 61 67 65 2c 20 73 65 74 20 74 68 65 20 0a 20 20  age, set the .  
19900 20 20 2a 2a 20 72 6f 77 69 64 2d 70 6f 69 6e 74    ** rowid-point
19910 65 72 20 69 6e 20 74 68 65 20 70 61 67 65 2d 68  er in the page-h
19920 65 61 64 65 72 2e 20 41 6c 73 6f 20 61 70 70 65  eader. Also appe
19930 6e 64 20 61 20 76 61 6c 75 65 20 74 6f 20 74 68  nd a value to th
19940 65 20 64 6c 69 64 78 0a 20 20 20 20 2a 2a 20 62  e dlidx.    ** b
19950 75 66 66 65 72 2c 20 69 6e 20 63 61 73 65 20 61  uffer, in case a
19960 20 64 6f 63 6c 69 73 74 2d 69 6e 64 65 78 20 69   doclist-index i
19970 73 20 72 65 71 75 69 72 65 64 2e 20 20 2a 2f 0a  s required.  */.
19980 20 20 20 20 69 66 28 20 70 57 72 69 74 65 72 2d      if( pWriter-
19990 3e 62 46 69 72 73 74 52 6f 77 69 64 49 6e 50 61  >bFirstRowidInPa
199a0 67 65 20 29 7b 0a 20 20 20 20 20 20 66 74 73 35  ge ){.      fts5
199b0 50 75 74 55 31 36 28 70 50 61 67 65 2d 3e 62 75  PutU16(pPage->bu
199c0 66 2e 70 2c 20 70 50 61 67 65 2d 3e 62 75 66 2e  f.p, pPage->buf.
199d0 6e 29 3b 0a 20 20 20 20 20 20 66 74 73 35 57 72  n);.      fts5Wr
199e0 69 74 65 44 6c 69 64 78 41 70 70 65 6e 64 28 70  iteDlidxAppend(p
199f0 2c 20 70 57 72 69 74 65 72 2c 20 69 52 6f 77 69  , pWriter, iRowi
19a00 64 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  d);.    }..    /
19a10 2a 20 57 72 69 74 65 20 74 68 65 20 72 6f 77 69  * Write the rowi
19a20 64 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 57  d. */.    if( pW
19a30 72 69 74 65 72 2d 3e 62 46 69 72 73 74 52 6f 77  riter->bFirstRow
19a40 69 64 49 6e 44 6f 63 6c 69 73 74 20 7c 7c 20 70  idInDoclist || p
19a50 57 72 69 74 65 72 2d 3e 62 46 69 72 73 74 52 6f  Writer->bFirstRo
19a60 77 69 64 49 6e 50 61 67 65 20 29 7b 0a 20 20 20  widInPage ){.   
19a70 20 20 20 66 74 73 35 42 75 66 66 65 72 41 70 70     fts5BufferApp
19a80 65 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e 72 63  endVarint(&p->rc
19a90 2c 20 26 70 50 61 67 65 2d 3e 62 75 66 2c 20 69  , &pPage->buf, i
19aa0 52 6f 77 69 64 29 3b 0a 20 20 20 20 7d 65 6c 73  Rowid);.    }els
19ab0 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  e{.      assert(
19ac0 20 70 2d 3e 72 63 20 7c 7c 20 69 52 6f 77 69 64   p->rc || iRowid
19ad0 3e 70 57 72 69 74 65 72 2d 3e 69 50 72 65 76 52  >pWriter->iPrevR
19ae0 6f 77 69 64 20 29 3b 0a 20 20 20 20 20 20 66 74  owid );.      ft
19af0 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 56 61  s5BufferAppendVa
19b00 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26 70 50  rint(&p->rc, &pP
19b10 61 67 65 2d 3e 62 75 66 2c 20 69 52 6f 77 69 64  age->buf, iRowid
19b20 20 2d 20 70 57 72 69 74 65 72 2d 3e 69 50 72 65   - pWriter->iPre
19b30 76 52 6f 77 69 64 29 3b 0a 20 20 20 20 7d 0a 20  vRowid);.    }. 
19b40 20 20 20 70 57 72 69 74 65 72 2d 3e 69 50 72 65     pWriter->iPre
19b50 76 52 6f 77 69 64 20 3d 20 69 52 6f 77 69 64 3b  vRowid = iRowid;
19b60 0a 20 20 20 20 70 57 72 69 74 65 72 2d 3e 62 46  .    pWriter->bF
19b70 69 72 73 74 52 6f 77 69 64 49 6e 44 6f 63 6c 69  irstRowidInDocli
19b80 73 74 20 3d 20 30 3b 0a 20 20 20 20 70 57 72 69  st = 0;.    pWri
19b90 74 65 72 2d 3e 62 46 69 72 73 74 52 6f 77 69 64  ter->bFirstRowid
19ba0 49 6e 50 61 67 65 20 3d 20 30 3b 0a 0a 20 20 20  InPage = 0;..   
19bb0 20 66 74 73 35 42 75 66 66 65 72 41 70 70 65 6e   fts5BufferAppen
19bc0 64 56 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20  dVarint(&p->rc, 
19bd0 26 70 50 61 67 65 2d 3e 62 75 66 2c 20 6e 50 6f  &pPage->buf, nPo
19be0 73 29 3b 0a 0a 20 20 20 20 69 66 28 20 28 70 50  s);..    if( (pP
19bf0 61 67 65 2d 3e 62 75 66 2e 6e 20 2b 20 70 50 61  age->buf.n + pPa
19c00 67 65 2d 3e 70 67 69 64 78 2e 6e 29 3e 3d 70 2d  ge->pgidx.n)>=p-
19c10 3e 70 43 6f 6e 66 69 67 2d 3e 70 67 73 7a 20 29  >pConfig->pgsz )
19c20 7b 0a 20 20 20 20 20 20 66 74 73 35 57 72 69 74  {.      fts5Writ
19c30 65 46 6c 75 73 68 4c 65 61 66 28 70 2c 20 70 57  eFlushLeaf(p, pW
19c40 72 69 74 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20  riter);.    }.  
19c50 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64  }.}..static void
19c60 20 66 74 73 35 57 72 69 74 65 41 70 70 65 6e 64   fts5WriteAppend
19c70 50 6f 73 6c 69 73 74 44 61 74 61 28 0a 20 20 46  PoslistData(.  F
19c80 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 0a 20 20  ts5Index *p, .  
19c90 46 74 73 35 53 65 67 57 72 69 74 65 72 20 2a 70  Fts5SegWriter *p
19ca0 57 72 69 74 65 72 2c 20 0a 20 20 63 6f 6e 73 74  Writer, .  const
19cb0 20 75 38 20 2a 61 44 61 74 61 2c 20 0a 20 20 69   u8 *aData, .  i
19cc0 6e 74 20 6e 44 61 74 61 0a 29 7b 0a 20 20 46 74  nt nData.){.  Ft
19cd0 73 35 50 61 67 65 57 72 69 74 65 72 20 2a 70 50  s5PageWriter *pP
19ce0 61 67 65 20 3d 20 26 70 57 72 69 74 65 72 2d 3e  age = &pWriter->
19cf0 77 72 69 74 65 72 3b 0a 20 20 63 6f 6e 73 74 20  writer;.  const 
19d00 75 38 20 2a 61 20 3d 20 61 44 61 74 61 3b 0a 20  u8 *a = aData;. 
19d10 20 69 6e 74 20 6e 20 3d 20 6e 44 61 74 61 3b 0a   int n = nData;.
19d20 20 20 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e    .  assert( p->
19d30 70 43 6f 6e 66 69 67 2d 3e 70 67 73 7a 3e 30 20  pConfig->pgsz>0 
19d40 29 3b 0a 20 20 77 68 69 6c 65 28 20 70 2d 3e 72  );.  while( p->r
19d50 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 0a 20 20  c==SQLITE_OK .  
19d60 20 20 20 26 26 20 28 70 50 61 67 65 2d 3e 62 75     && (pPage->bu
19d70 66 2e 6e 20 2b 20 70 50 61 67 65 2d 3e 70 67 69  f.n + pPage->pgi
19d80 64 78 2e 6e 20 2b 20 6e 29 3e 3d 70 2d 3e 70 43  dx.n + n)>=p->pC
19d90 6f 6e 66 69 67 2d 3e 70 67 73 7a 20 0a 20 20 29  onfig->pgsz .  )
19da0 7b 0a 20 20 20 20 69 6e 74 20 6e 52 65 71 20 3d  {.    int nReq =
19db0 20 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e 70 67 73   p->pConfig->pgs
19dc0 7a 20 2d 20 70 50 61 67 65 2d 3e 62 75 66 2e 6e  z - pPage->buf.n
19dd0 20 2d 20 70 50 61 67 65 2d 3e 70 67 69 64 78 2e   - pPage->pgidx.
19de0 6e 3b 0a 20 20 20 20 69 6e 74 20 6e 43 6f 70 79  n;.    int nCopy
19df0 20 3d 20 30 3b 0a 20 20 20 20 77 68 69 6c 65 28   = 0;.    while(
19e00 20 6e 43 6f 70 79 3c 6e 52 65 71 20 29 7b 0a 20   nCopy<nReq ){. 
19e10 20 20 20 20 20 69 36 34 20 64 75 6d 6d 79 3b 0a       i64 dummy;.
19e20 20 20 20 20 20 20 6e 43 6f 70 79 20 2b 3d 20 66        nCopy += f
19e30 74 73 35 47 65 74 56 61 72 69 6e 74 28 26 61 5b  ts5GetVarint(&a[
19e40 6e 43 6f 70 79 5d 2c 20 28 75 36 34 2a 29 26 64  nCopy], (u64*)&d
19e50 75 6d 6d 79 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ummy);.    }.   
19e60 20 66 74 73 35 42 75 66 66 65 72 41 70 70 65 6e   fts5BufferAppen
19e70 64 42 6c 6f 62 28 26 70 2d 3e 72 63 2c 20 26 70  dBlob(&p->rc, &p
19e80 50 61 67 65 2d 3e 62 75 66 2c 20 6e 43 6f 70 79  Page->buf, nCopy
19e90 2c 20 61 29 3b 0a 20 20 20 20 61 20 2b 3d 20 6e  , a);.    a += n
19ea0 43 6f 70 79 3b 0a 20 20 20 20 6e 20 2d 3d 20 6e  Copy;.    n -= n
19eb0 43 6f 70 79 3b 0a 20 20 20 20 66 74 73 35 57 72  Copy;.    fts5Wr
19ec0 69 74 65 46 6c 75 73 68 4c 65 61 66 28 70 2c 20  iteFlushLeaf(p, 
19ed0 70 57 72 69 74 65 72 29 3b 0a 20 20 7d 0a 20 20  pWriter);.  }.  
19ee0 69 66 28 20 6e 3e 30 20 29 7b 0a 20 20 20 20 66  if( n>0 ){.    f
19ef0 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 42  ts5BufferAppendB
19f00 6c 6f 62 28 26 70 2d 3e 72 63 2c 20 26 70 50 61  lob(&p->rc, &pPa
19f10 67 65 2d 3e 62 75 66 2c 20 6e 2c 20 61 29 3b 0a  ge->buf, n, a);.
19f20 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f    }.}..static vo
19f30 69 64 20 66 74 73 35 57 72 69 74 65 41 70 70 65  id fts5WriteAppe
19f40 6e 64 5a 65 72 6f 62 79 74 65 28 46 74 73 35 49  ndZerobyte(Fts5I
19f50 6e 64 65 78 20 2a 70 2c 20 46 74 73 35 53 65 67  ndex *p, Fts5Seg
19f60 57 72 69 74 65 72 20 2a 70 57 72 69 74 65 72 29  Writer *pWriter)
19f70 7b 0a 20 20 66 74 73 35 42 75 66 66 65 72 41 70  {.  fts5BufferAp
19f80 70 65 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e 72  pendVarint(&p->r
19f90 63 2c 20 26 70 57 72 69 74 65 72 2d 3e 77 72 69  c, &pWriter->wri
19fa0 74 65 72 2e 62 75 66 2c 20 30 29 3b 0a 7d 0a 0a  ter.buf, 0);.}..
19fb0 2f 2a 0a 2a 2a 20 46 6c 75 73 68 20 61 6e 79 20  /*.** Flush any 
19fc0 64 61 74 61 20 63 61 63 68 65 64 20 62 79 20 74  data cached by t
19fd0 68 65 20 77 72 69 74 65 72 20 6f 62 6a 65 63 74  he writer object
19fe0 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
19ff0 2e 20 46 72 65 65 20 61 6e 79 0a 2a 2a 20 61 6c  . Free any.** al
1a000 6c 6f 63 61 74 69 6f 6e 73 20 61 73 73 6f 63 69  locations associ
1a010 61 74 65 64 20 77 69 74 68 20 74 68 65 20 77 72  ated with the wr
1a020 69 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  iter..*/.static 
1a030 76 6f 69 64 20 66 74 73 35 57 72 69 74 65 46 69  void fts5WriteFi
1a040 6e 69 73 68 28 0a 20 20 46 74 73 35 49 6e 64 65  nish(.  Fts5Inde
1a050 78 20 2a 70 2c 20 0a 20 20 46 74 73 35 53 65 67  x *p, .  Fts5Seg
1a060 57 72 69 74 65 72 20 2a 70 57 72 69 74 65 72 2c  Writer *pWriter,
1a070 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74           /* Writ
1a080 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69  er object */.  i
1a090 6e 74 20 2a 70 6e 48 65 69 67 68 74 2c 20 20 20  nt *pnHeight,   
1a0a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1a0b0 2a 20 4f 55 54 3a 20 48 65 69 67 68 74 20 6f 66  * OUT: Height of
1a0c0 20 74 68 65 20 62 2d 74 72 65 65 20 2a 2f 0a 20   the b-tree */. 
1a0d0 20 69 6e 74 20 2a 70 6e 4c 65 61 66 20 20 20 20   int *pnLeaf    
1a0e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a0f0 20 2f 2a 20 4f 55 54 3a 20 4e 75 6d 62 65 72 20   /* OUT: Number 
1a100 6f 66 20 6c 65 61 66 20 70 61 67 65 73 20 69 6e  of leaf pages in
1a110 20 62 2d 74 72 65 65 20 2a 2f 0a 29 7b 0a 20 20   b-tree */.){.  
1a120 69 6e 74 20 69 3b 0a 20 20 46 74 73 35 50 61 67  int i;.  Fts5Pag
1a130 65 57 72 69 74 65 72 20 2a 70 4c 65 61 66 20 3d  eWriter *pLeaf =
1a140 20 26 70 57 72 69 74 65 72 2d 3e 77 72 69 74 65   &pWriter->write
1a150 72 3b 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d  r;.  if( p->rc==
1a160 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1a170 20 69 66 28 20 70 4c 65 61 66 2d 3e 70 67 6e 6f   if( pLeaf->pgno
1a180 3d 3d 31 20 26 26 20 70 4c 65 61 66 2d 3e 62 75  ==1 && pLeaf->bu
1a190 66 2e 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  f.n==0 ){.      
1a1a0 2a 70 6e 4c 65 61 66 20 3d 20 30 3b 0a 20 20 20  *pnLeaf = 0;.   
1a1b0 20 20 20 2a 70 6e 48 65 69 67 68 74 20 3d 20 30     *pnHeight = 0
1a1c0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
1a1d0 20 20 20 69 66 28 20 70 4c 65 61 66 2d 3e 62 75     if( pLeaf->bu
1a1e0 66 2e 6e 3e 34 20 29 7b 0a 20 20 20 20 20 20 20  f.n>4 ){.       
1a1f0 20 66 74 73 35 57 72 69 74 65 46 6c 75 73 68 4c   fts5WriteFlushL
1a200 65 61 66 28 70 2c 20 70 57 72 69 74 65 72 29 3b  eaf(p, pWriter);
1a210 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2a  .      }.      *
1a220 70 6e 4c 65 61 66 20 3d 20 70 4c 65 61 66 2d 3e  pnLeaf = pLeaf->
1a230 70 67 6e 6f 2d 31 3b 0a 0a 20 20 20 20 20 20 66  pgno-1;..      f
1a240 74 73 35 57 72 69 74 65 46 6c 75 73 68 42 74 72  ts5WriteFlushBtr
1a250 65 65 28 70 2c 20 70 57 72 69 74 65 72 29 3b 0a  ee(p, pWriter);.
1a260 20 20 20 20 20 20 2a 70 6e 48 65 69 67 68 74 20        *pnHeight 
1a270 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  = 0;.    }.  }. 
1a280 20 66 74 73 35 42 75 66 66 65 72 46 72 65 65 28   fts5BufferFree(
1a290 26 70 4c 65 61 66 2d 3e 74 65 72 6d 29 3b 0a 20  &pLeaf->term);. 
1a2a0 20 66 74 73 35 42 75 66 66 65 72 46 72 65 65 28   fts5BufferFree(
1a2b0 26 70 4c 65 61 66 2d 3e 62 75 66 29 3b 0a 20 20  &pLeaf->buf);.  
1a2c0 66 74 73 35 42 75 66 66 65 72 46 72 65 65 28 26  fts5BufferFree(&
1a2d0 70 4c 65 61 66 2d 3e 70 67 69 64 78 29 3b 0a 20  pLeaf->pgidx);. 
1a2e0 20 66 74 73 35 42 75 66 66 65 72 46 72 65 65 28   fts5BufferFree(
1a2f0 26 70 57 72 69 74 65 72 2d 3e 62 74 74 65 72 6d  &pWriter->btterm
1a300 29 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  );..  for(i=0; i
1a310 3c 70 57 72 69 74 65 72 2d 3e 6e 44 6c 69 64 78  <pWriter->nDlidx
1a320 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69  ; i++){.    sqli
1a330 74 65 33 46 74 73 35 42 75 66 66 65 72 46 72 65  te3Fts5BufferFre
1a340 65 28 26 70 57 72 69 74 65 72 2d 3e 61 44 6c 69  e(&pWriter->aDli
1a350 64 78 5b 69 5d 2e 62 75 66 29 3b 0a 20 20 7d 0a  dx[i].buf);.  }.
1a360 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
1a370 57 72 69 74 65 72 2d 3e 61 44 6c 69 64 78 29 3b  Writer->aDlidx);
1a380 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .}..static void 
1a390 66 74 73 35 57 72 69 74 65 49 6e 69 74 28 0a 20  fts5WriteInit(. 
1a3a0 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 0a   Fts5Index *p, .
1a3b0 20 20 46 74 73 35 53 65 67 57 72 69 74 65 72 20    Fts5SegWriter 
1a3c0 2a 70 57 72 69 74 65 72 2c 20 0a 20 20 69 6e 74  *pWriter, .  int
1a3d0 20 69 53 65 67 69 64 0a 29 7b 0a 20 20 6d 65 6d   iSegid.){.  mem
1a3e0 73 65 74 28 70 57 72 69 74 65 72 2c 20 30 2c 20  set(pWriter, 0, 
1a3f0 73 69 7a 65 6f 66 28 46 74 73 35 53 65 67 57 72  sizeof(Fts5SegWr
1a400 69 74 65 72 29 29 3b 0a 20 20 70 57 72 69 74 65  iter));.  pWrite
1a410 72 2d 3e 69 53 65 67 69 64 20 3d 20 69 53 65 67  r->iSegid = iSeg
1a420 69 64 3b 0a 0a 20 20 66 74 73 35 57 72 69 74 65  id;..  fts5Write
1a430 44 6c 69 64 78 47 72 6f 77 28 70 2c 20 70 57 72  DlidxGrow(p, pWr
1a440 69 74 65 72 2c 20 31 29 3b 0a 20 20 70 57 72 69  iter, 1);.  pWri
1a450 74 65 72 2d 3e 77 72 69 74 65 72 2e 70 67 6e 6f  ter->writer.pgno
1a460 20 3d 20 31 3b 0a 20 20 70 57 72 69 74 65 72 2d   = 1;.  pWriter-
1a470 3e 62 46 69 72 73 74 54 65 72 6d 49 6e 50 61 67  >bFirstTermInPag
1a480 65 20 3d 20 31 3b 0a 20 20 70 57 72 69 74 65 72  e = 1;.  pWriter
1a490 2d 3e 69 42 74 50 61 67 65 20 3d 20 31 3b 0a 0a  ->iBtPage = 1;..
1a4a0 20 20 66 74 73 35 42 75 66 66 65 72 47 72 6f 77    fts5BufferGrow
1a4b0 28 26 70 2d 3e 72 63 2c 20 26 70 57 72 69 74 65  (&p->rc, &pWrite
1a4c0 72 2d 3e 77 72 69 74 65 72 2e 70 67 69 64 78 2c  r->writer.pgidx,
1a4d0 20 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e 70 67 73   p->pConfig->pgs
1a4e0 7a 20 2b 20 32 30 29 3b 0a 20 20 69 66 28 20 70  z + 20);.  if( p
1a4f0 2d 3e 70 49 64 78 57 72 69 74 65 72 3d 3d 30 20  ->pIdxWriter==0 
1a500 29 7b 0a 20 20 20 20 46 74 73 35 43 6f 6e 66 69  ){.    Fts5Confi
1a510 67 20 2a 70 43 6f 6e 66 69 67 20 3d 20 70 2d 3e  g *pConfig = p->
1a520 70 43 6f 6e 66 69 67 3b 0a 20 20 20 20 66 74 73  pConfig;.    fts
1a530 35 49 6e 64 65 78 50 72 65 70 61 72 65 53 74 6d  5IndexPrepareStm
1a540 74 28 70 2c 20 26 70 2d 3e 70 49 64 78 57 72 69  t(p, &p->pIdxWri
1a550 74 65 72 2c 20 73 71 6c 69 74 65 33 5f 6d 70 72  ter, sqlite3_mpr
1a560 69 6e 74 66 28 0a 20 20 20 20 20 20 20 20 20 20  intf(.          
1a570 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 27 25 71  "INSERT INTO '%q
1a580 27 2e 27 25 71 5f 69 64 78 27 28 73 65 67 69 64  '.'%q_idx'(segid
1a590 2c 74 65 72 6d 2c 70 67 6e 6f 29 20 56 41 4c 55  ,term,pgno) VALU
1a5a0 45 53 28 3f 2c 3f 2c 3f 29 22 2c 20 0a 20 20 20  ES(?,?,?)", .   
1a5b0 20 20 20 20 20 20 20 70 43 6f 6e 66 69 67 2d 3e         pConfig->
1a5c0 7a 44 62 2c 20 70 43 6f 6e 66 69 67 2d 3e 7a 4e  zDb, pConfig->zN
1a5d0 61 6d 65 0a 20 20 20 20 29 29 3b 0a 20 20 7d 0a  ame.    ));.  }.
1a5e0 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51  .  if( p->rc==SQ
1a5f0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73  LITE_OK ){.    s
1a600 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 28  qlite3_bind_int(
1a610 70 2d 3e 70 49 64 78 57 72 69 74 65 72 2c 20 31  p->pIdxWriter, 1
1a620 2c 20 70 57 72 69 74 65 72 2d 3e 69 53 65 67 69  , pWriter->iSegi
1a630 64 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  d);.  }.}../*.**
1a640 20 54 68 65 20 62 75 66 66 65 72 20 70 61 73 73   The buffer pass
1a650 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64  ed as the second
1a660 20 61 72 67 75 6d 65 6e 74 20 63 6f 6e 74 61 69   argument contai
1a670 6e 73 20 61 20 6c 65 61 66 20 70 61 67 65 20 74  ns a leaf page t
1a680 68 61 74 20 69 73 0a 2a 2a 20 6d 69 73 73 69 6e  hat is.** missin
1a690 67 20 69 74 73 20 70 61 67 65 2d 69 64 78 20 61  g its page-idx a
1a6a0 72 72 61 79 2e 20 54 68 65 20 66 69 72 73 74 20  rray. The first 
1a6b0 74 65 72 6d 20 69 73 20 67 75 61 72 61 6e 74 65  term is guarante
1a6c0 65 64 20 74 6f 20 73 74 61 72 74 20 61 74 0a 2a  ed to start at.*
1a6d0 2a 20 62 79 74 65 20 6f 66 66 73 65 74 20 34 20  * byte offset 4 
1a6e0 6f 66 20 74 68 65 20 62 75 66 66 65 72 2e 20 54  of the buffer. T
1a6f0 68 65 20 73 7a 4c 65 61 66 20 66 69 65 6c 64 20  he szLeaf field 
1a700 6f 66 20 74 68 65 20 6c 65 61 66 20 70 61 67 65  of the leaf page
1a710 20 68 65 61 64 65 72 0a 2a 2a 20 69 73 20 61 6c   header.** is al
1a720 72 65 61 64 79 20 70 6f 70 75 6c 61 74 65 64 2e  ready populated.
1a730 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  .**.** This func
1a740 74 69 6f 6e 20 61 70 70 65 6e 64 73 20 61 20 70  tion appends a p
1a750 61 67 65 2d 69 6e 64 65 78 20 74 6f 20 74 68 65  age-index to the
1a760 20 62 75 66 66 65 72 2e 20 54 68 65 20 62 75 66   buffer. The buf
1a770 66 65 72 20 69 73 20 0a 2a 2a 20 67 75 61 72 61  fer is .** guara
1a780 6e 74 65 65 64 20 74 6f 20 62 65 20 6c 61 72 67  nteed to be larg
1a790 65 20 65 6e 6f 75 67 68 20 74 6f 20 66 69 74 20  e enough to fit 
1a7a0 74 68 65 20 70 61 67 65 2d 69 6e 64 65 78 2e 0a  the page-index..
1a7b0 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
1a7c0 74 73 35 4d 61 6b 65 50 61 67 65 69 64 78 28 46  ts5MakePageidx(F
1a7d0 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 46 74 73  ts5Index *p, Fts
1a7e0 35 42 75 66 66 65 72 20 2a 70 42 75 66 29 7b 0a  5Buffer *pBuf){.
1a7f0 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c    if( p->rc==SQL
1a800 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 75 38  ITE_OK ){.    u8
1a810 20 2a 61 20 3d 20 70 42 75 66 2d 3e 70 3b 0a 20   *a = pBuf->p;. 
1a820 20 20 20 69 6e 74 20 73 7a 4c 65 61 66 20 3d 20     int szLeaf = 
1a830 70 42 75 66 2d 3e 6e 3b 0a 20 20 20 20 69 6e 74  pBuf->n;.    int
1a840 20 69 4f 66 66 20 3d 20 34 3b 0a 20 20 20 20 69   iOff = 4;.    i
1a850 6e 74 20 6e 54 65 72 6d 3b 0a 0a 20 20 20 20 66  nt nTerm;..    f
1a860 74 73 35 50 75 74 55 31 36 28 26 70 42 75 66 2d  ts5PutU16(&pBuf-
1a870 3e 70 5b 70 42 75 66 2d 3e 6e 5d 2c 20 69 4f 66  >p[pBuf->n], iOf
1a880 66 29 3b 0a 20 20 20 20 70 42 75 66 2d 3e 6e 20  f);.    pBuf->n 
1a890 2b 3d 20 32 3b 0a 20 20 20 20 66 74 73 35 49 6e  += 2;.    fts5In
1a8a0 64 65 78 47 65 74 56 61 72 69 6e 74 33 32 28 61  dexGetVarint32(a
1a8b0 2c 20 69 4f 66 66 2c 20 6e 54 65 72 6d 29 3b 0a  , iOff, nTerm);.
1a8c0 20 20 20 20 69 4f 66 66 20 2b 3d 20 6e 54 65 72      iOff += nTer
1a8d0 6d 3b 0a 0a 20 20 20 20 77 68 69 6c 65 28 20 69  m;..    while( i
1a8e0 4f 66 66 3c 73 7a 4c 65 61 66 20 29 7b 0a 20 20  Off<szLeaf ){.  
1a8f0 20 20 20 20 2f 2a 20 53 6b 69 70 20 74 68 65 20      /* Skip the 
1a900 72 6f 77 69 64 20 64 65 6c 74 61 20 72 6f 77 69  rowid delta rowi
1a910 64 20 64 65 6c 74 61 2e 20 2a 2f 0a 20 20 20 20  d delta. */.    
1a920 20 20 66 74 73 35 49 6e 64 65 78 53 6b 69 70 56    fts5IndexSkipV
1a930 61 72 69 6e 74 28 61 2c 20 69 4f 66 66 29 3b 0a  arint(a, iOff);.
1a940 20 20 20 20 20 20 69 66 28 20 69 4f 66 66 3e 3d        if( iOff>=
1a950 73 7a 4c 65 61 66 20 29 20 62 72 65 61 6b 3b 0a  szLeaf ) break;.
1a960 0a 20 20 20 20 20 20 2f 2a 20 53 6b 69 70 20 70  .      /* Skip p
1a970 61 73 74 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73  ast position lis
1a980 74 20 2a 2f 0a 20 20 20 20 20 20 66 74 73 35 49  t */.      fts5I
1a990 6e 64 65 78 47 65 74 56 61 72 69 6e 74 33 32 28  ndexGetVarint32(
1a9a0 61 2c 20 69 4f 66 66 2c 20 6e 54 65 72 6d 29 3b  a, iOff, nTerm);
1a9b0 0a 20 20 20 20 20 20 69 4f 66 66 20 2b 3d 20 28  .      iOff += (
1a9c0 6e 54 65 72 6d 20 3e 3e 20 31 29 3b 0a 0a 20 20  nTerm >> 1);..  
1a9d0 20 20 20 20 69 66 28 20 69 4f 66 66 3e 3d 28 73      if( iOff>=(s
1a9e0 7a 4c 65 61 66 2d 32 29 20 29 20 62 72 65 61 6b  zLeaf-2) ) break
1a9f0 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74  ;..      /* If t
1aa00 68 69 73 20 69 73 20 74 68 65 20 65 6e 64 20 6f  his is the end o
1aa10 66 20 74 68 65 20 64 6f 63 6c 69 73 74 2c 20 62  f the doclist, b
1aa20 72 65 61 6b 20 6f 75 74 20 6f 66 20 74 68 65 20  reak out of the 
1aa30 6c 6f 6f 70 20 2a 2f 0a 20 20 20 20 20 20 69 66  loop */.      if
1aa40 28 20 61 5b 69 4f 66 66 5d 3d 3d 30 78 30 30 20  ( a[iOff]==0x00 
1aa50 29 7b 0a 20 20 20 20 20 20 20 20 69 4f 66 66 2b  ){.        iOff+
1aa60 2b 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35 50  +;.        fts5P
1aa70 75 74 55 31 36 28 26 70 42 75 66 2d 3e 70 5b 70  utU16(&pBuf->p[p
1aa80 42 75 66 2d 3e 6e 5d 2c 20 69 4f 66 66 29 3b 0a  Buf->n], iOff);.
1aa90 20 20 20 20 20 20 20 20 70 42 75 66 2d 3e 6e 20          pBuf->n 
1aaa0 2b 3d 20 32 3b 0a 20 20 20 20 20 20 20 20 66 74  += 2;.        ft
1aab0 73 35 49 6e 64 65 78 47 65 74 56 61 72 69 6e 74  s5IndexGetVarint
1aac0 33 32 28 61 2c 20 69 4f 66 66 2c 20 6e 54 65 72  32(a, iOff, nTer
1aad0 6d 29 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35  m);.        fts5
1aae0 49 6e 64 65 78 47 65 74 56 61 72 69 6e 74 33 32  IndexGetVarint32
1aaf0 28 61 2c 20 69 4f 66 66 2c 20 6e 54 65 72 6d 29  (a, iOff, nTerm)
1ab00 3b 0a 20 20 20 20 20 20 20 20 69 4f 66 66 20 2b  ;.        iOff +
1ab10 3d 20 6e 54 65 72 6d 3b 0a 20 20 20 20 20 20 7d  = nTerm;.      }
1ab20 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a  .    }.  }.}../*
1ab30 0a 2a 2a 20 49 74 65 72 61 74 6f 72 20 70 49 74  .** Iterator pIt
1ab40 65 72 20 77 61 73 20 75 73 65 64 20 74 6f 20 69  er was used to i
1ab50 74 65 72 61 74 65 20 74 68 72 6f 75 67 68 20 74  terate through t
1ab60 68 65 20 69 6e 70 75 74 20 73 65 67 6d 65 6e 74  he input segment
1ab70 73 20 6f 66 20 6f 6e 20 61 6e 0a 2a 2a 20 69 6e  s of on an.** in
1ab80 63 72 65 6d 65 6e 74 61 6c 20 6d 65 72 67 65 20  cremental merge 
1ab90 6f 70 65 72 61 74 69 6f 6e 2e 20 54 68 69 73 20  operation. This 
1aba0 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
1abb0 65 64 20 69 66 20 74 68 65 20 69 6e 63 72 65 6d  ed if the increm
1abc0 65 6e 74 61 6c 0a 2a 2a 20 6d 65 72 67 65 20 73  ental.** merge s
1abd0 74 65 70 20 68 61 73 20 66 69 6e 69 73 68 65 64  tep has finished
1abe0 20 62 75 74 20 74 68 65 20 69 6e 70 75 74 20 68   but the input h
1abf0 61 73 20 6e 6f 74 20 62 65 65 6e 20 63 6f 6d 70  as not been comp
1ac00 6c 65 74 65 6c 79 20 65 78 68 61 75 73 74 65 64  letely exhausted
1ac10 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
1ac20 20 66 74 73 35 54 72 69 6d 53 65 67 6d 65 6e 74   fts5TrimSegment
1ac30 73 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20  s(Fts5Index *p, 
1ac40 46 74 73 35 49 6e 64 65 78 49 74 65 72 20 2a 70  Fts5IndexIter *p
1ac50 49 74 65 72 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  Iter){.  int i;.
1ac60 20 20 46 74 73 35 42 75 66 66 65 72 20 62 75 66    Fts5Buffer buf
1ac70 3b 0a 20 20 6d 65 6d 73 65 74 28 26 62 75 66 2c  ;.  memset(&buf,
1ac80 20 30 2c 20 73 69 7a 65 6f 66 28 46 74 73 35 42   0, sizeof(Fts5B
1ac90 75 66 66 65 72 29 29 3b 0a 20 20 66 6f 72 28 69  uffer));.  for(i
1aca0 3d 30 3b 20 69 3c 70 49 74 65 72 2d 3e 6e 53 65  =0; i<pIter->nSe
1acb0 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 46 74 73  g; i++){.    Fts
1acc0 35 53 65 67 49 74 65 72 20 2a 70 53 65 67 20 3d  5SegIter *pSeg =
1acd0 20 26 70 49 74 65 72 2d 3e 61 53 65 67 5b 69 5d   &pIter->aSeg[i]
1ace0 3b 0a 20 20 20 20 69 66 28 20 70 53 65 67 2d 3e  ;.    if( pSeg->
1acf0 70 53 65 67 3d 3d 30 20 29 7b 0a 20 20 20 20 20  pSeg==0 ){.     
1ad00 20 2f 2a 20 6e 6f 2d 6f 70 20 2a 2f 0a 20 20 20   /* no-op */.   
1ad10 20 7d 65 6c 73 65 20 69 66 28 20 70 53 65 67 2d   }else if( pSeg-
1ad20 3e 70 4c 65 61 66 3d 3d 30 20 29 7b 0a 20 20 20  >pLeaf==0 ){.   
1ad30 20 20 20 2f 2a 20 41 6c 6c 20 6b 65 79 73 20 66     /* All keys f
1ad40 72 6f 6d 20 74 68 69 73 20 69 6e 70 75 74 20 73  rom this input s
1ad50 65 67 6d 65 6e 74 20 68 61 76 65 20 62 65 65 6e  egment have been
1ad60 20 74 72 61 6e 73 66 65 72 65 64 20 74 6f 20 74   transfered to t
1ad70 68 65 20 6f 75 74 70 75 74 2e 0a 20 20 20 20 20  he output..     
1ad80 20 2a 2a 20 53 65 74 20 62 6f 74 68 20 74 68 65   ** Set both the
1ad90 20 66 69 72 73 74 20 61 6e 64 20 6c 61 73 74 20   first and last 
1ada0 70 61 67 65 2d 6e 75 6d 62 65 72 73 20 74 6f 20  page-numbers to 
1adb0 30 20 74 6f 20 69 6e 64 69 63 61 74 65 20 74 68  0 to indicate th
1adc0 61 74 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20  at the.      ** 
1add0 73 65 67 6d 65 6e 74 20 69 73 20 6e 6f 77 20 65  segment is now e
1ade0 6d 70 74 79 2e 20 2a 2f 0a 20 20 20 20 20 20 70  mpty. */.      p
1adf0 53 65 67 2d 3e 70 53 65 67 2d 3e 70 67 6e 6f 4c  Seg->pSeg->pgnoL
1ae00 61 73 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  ast = 0;.      p
1ae10 53 65 67 2d 3e 70 53 65 67 2d 3e 70 67 6e 6f 46  Seg->pSeg->pgnoF
1ae20 69 72 73 74 20 3d 20 30 3b 0a 20 20 20 20 7d 65  irst = 0;.    }e
1ae30 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  lse{.      int i
1ae40 4f 66 66 20 3d 20 70 53 65 67 2d 3e 69 54 65 72  Off = pSeg->iTer
1ae50 6d 4c 65 61 66 4f 66 66 73 65 74 3b 20 20 20 20  mLeafOffset;    
1ae60 20 2f 2a 20 4f 66 66 73 65 74 20 6f 6e 20 6e 65   /* Offset on ne
1ae70 77 20 66 69 72 73 74 20 6c 65 61 66 20 70 61 67  w first leaf pag
1ae80 65 20 2a 2f 0a 20 20 20 20 20 20 69 36 34 20 69  e */.      i64 i
1ae90 4c 65 61 66 52 6f 77 69 64 3b 0a 20 20 20 20 20  LeafRowid;.     
1aea0 20 46 74 73 35 44 61 74 61 20 2a 70 44 61 74 61   Fts5Data *pData
1aeb0 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 49 64 20  ;.      int iId 
1aec0 3d 20 70 53 65 67 2d 3e 70 53 65 67 2d 3e 69 53  = pSeg->pSeg->iS
1aed0 65 67 69 64 3b 0a 20 20 20 20 20 20 75 38 20 61  egid;.      u8 a
1aee0 48 64 72 5b 34 5d 20 3d 20 7b 30 78 30 30 2c 20  Hdr[4] = {0x00, 
1aef0 30 78 30 30 2c 20 30 78 30 30 2c 20 30 78 30 30  0x00, 0x00, 0x00
1af00 7d 3b 0a 0a 20 20 20 20 20 20 69 4c 65 61 66 52  };..      iLeafR
1af10 6f 77 69 64 20 3d 20 46 54 53 35 5f 53 45 47 4d  owid = FTS5_SEGM
1af20 45 4e 54 5f 52 4f 57 49 44 28 69 49 64 2c 20 30  ENT_ROWID(iId, 0
1af30 2c 20 70 53 65 67 2d 3e 69 54 65 72 6d 4c 65 61  , pSeg->iTermLea
1af40 66 50 67 6e 6f 29 3b 0a 20 20 20 20 20 20 70 44  fPgno);.      pD
1af50 61 74 61 20 3d 20 66 74 73 35 44 61 74 61 52 65  ata = fts5DataRe
1af60 61 64 28 70 2c 20 69 4c 65 61 66 52 6f 77 69 64  ad(p, iLeafRowid
1af70 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 44 61  );.      if( pDa
1af80 74 61 20 29 7b 0a 20 20 20 20 20 20 20 20 66 74  ta ){.        ft
1af90 73 35 42 75 66 66 65 72 5a 65 72 6f 28 26 62 75  s5BufferZero(&bu
1afa0 66 29 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35  f);.        fts5
1afb0 42 75 66 66 65 72 47 72 6f 77 28 26 70 2d 3e 72  BufferGrow(&p->r
1afc0 63 2c 20 26 62 75 66 2c 20 70 44 61 74 61 2d 3e  c, &buf, pData->
1afd0 6e 6e 29 3b 0a 20 20 20 20 20 20 20 20 66 74 73  nn);.        fts
1afe0 35 42 75 66 66 65 72 41 70 70 65 6e 64 42 6c 6f  5BufferAppendBlo
1aff0 62 28 26 70 2d 3e 72 63 2c 20 26 62 75 66 2c 20  b(&p->rc, &buf, 
1b000 73 69 7a 65 6f 66 28 61 48 64 72 29 2c 20 61 48  sizeof(aHdr), aH
1b010 64 72 29 3b 0a 20 20 20 20 20 20 20 20 66 74 73  dr);.        fts
1b020 35 42 75 66 66 65 72 41 70 70 65 6e 64 56 61 72  5BufferAppendVar
1b030 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26 62 75 66  int(&p->rc, &buf
1b040 2c 20 70 53 65 67 2d 3e 74 65 72 6d 2e 6e 29 3b  , pSeg->term.n);
1b050 0a 20 20 20 20 20 20 20 20 66 74 73 35 42 75 66  .        fts5Buf
1b060 66 65 72 41 70 70 65 6e 64 42 6c 6f 62 28 26 70  ferAppendBlob(&p
1b070 2d 3e 72 63 2c 20 26 62 75 66 2c 20 70 53 65 67  ->rc, &buf, pSeg
1b080 2d 3e 74 65 72 6d 2e 6e 2c 20 70 53 65 67 2d 3e  ->term.n, pSeg->
1b090 74 65 72 6d 2e 70 29 3b 0a 20 20 20 20 20 20 20  term.p);.       
1b0a0 20 66 74 73 35 42 75 66 66 65 72 41 70 70 65 6e   fts5BufferAppen
1b0b0 64 42 6c 6f 62 28 26 70 2d 3e 72 63 2c 20 26 62  dBlob(&p->rc, &b
1b0c0 75 66 2c 20 70 44 61 74 61 2d 3e 73 7a 4c 65 61  uf, pData->szLea
1b0d0 66 2d 69 4f 66 66 2c 20 26 70 44 61 74 61 2d 3e  f-iOff, &pData->
1b0e0 70 5b 69 4f 66 66 5d 29 3b 0a 20 20 20 20 20 20  p[iOff]);.      
1b0f0 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c    if( p->rc==SQL
1b100 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1b110 20 20 20 20 2f 2a 20 53 65 74 20 74 68 65 20 73      /* Set the s
1b120 7a 4c 65 61 66 20 66 69 65 6c 64 20 2a 2f 0a 20  zLeaf field */. 
1b130 20 20 20 20 20 20 20 20 20 66 74 73 35 50 75 74           fts5Put
1b140 55 31 36 28 26 62 75 66 2e 70 5b 32 5d 2c 20 62  U16(&buf.p[2], b
1b150 75 66 2e 6e 29 3b 0a 20 20 20 20 20 20 20 20 7d  uf.n);.        }
1b160 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 53 65 74  ..        /* Set
1b170 20 75 70 20 74 68 65 20 6e 65 77 20 70 61 67 65   up the new page
1b180 2d 69 6e 64 65 78 20 61 72 72 61 79 20 2a 2f 0a  -index array */.
1b190 20 20 20 20 20 20 20 20 66 74 73 35 4d 61 6b 65          fts5Make
1b1a0 50 61 67 65 69 64 78 28 70 2c 20 26 62 75 66 29  Pageidx(p, &buf)
1b1b0 3b 0a 0a 20 20 20 20 20 20 20 20 66 74 73 35 44  ;..        fts5D
1b1c0 61 74 61 52 65 6c 65 61 73 65 28 70 44 61 74 61  ataRelease(pData
1b1d0 29 3b 0a 20 20 20 20 20 20 20 20 70 53 65 67 2d  );.        pSeg-
1b1e0 3e 70 53 65 67 2d 3e 70 67 6e 6f 46 69 72 73 74  >pSeg->pgnoFirst
1b1f0 20 3d 20 70 53 65 67 2d 3e 69 54 65 72 6d 4c 65   = pSeg->iTermLe
1b200 61 66 50 67 6e 6f 3b 0a 20 20 20 20 20 20 20 20  afPgno;.        
1b210 66 74 73 35 44 61 74 61 44 65 6c 65 74 65 28 70  fts5DataDelete(p
1b220 2c 20 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f 52  , FTS5_SEGMENT_R
1b230 4f 57 49 44 28 69 49 64 2c 20 30 2c 20 31 29 2c  OWID(iId, 0, 1),
1b240 20 69 4c 65 61 66 52 6f 77 69 64 29 3b 0a 20 20   iLeafRowid);.  
1b250 20 20 20 20 20 20 66 74 73 35 44 61 74 61 57 72        fts5DataWr
1b260 69 74 65 28 70 2c 20 69 4c 65 61 66 52 6f 77 69  ite(p, iLeafRowi
1b270 64 2c 20 62 75 66 2e 70 2c 20 62 75 66 2e 6e 29  d, buf.p, buf.n)
1b280 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
1b290 20 20 7d 0a 20 20 66 74 73 35 42 75 66 66 65 72    }.  fts5Buffer
1b2a0 46 72 65 65 28 26 62 75 66 29 3b 0a 7d 0a 0a 73  Free(&buf);.}..s
1b2b0 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 4d  tatic void fts5M
1b2c0 65 72 67 65 43 68 75 6e 6b 43 61 6c 6c 62 61 63  ergeChunkCallbac
1b2d0 6b 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a  k(.  Fts5Index *
1b2e0 70 2c 20 0a 20 20 76 6f 69 64 20 2a 70 43 74 78  p, .  void *pCtx
1b2f0 2c 20 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 70  , .  const u8 *p
1b300 43 68 75 6e 6b 2c 20 69 6e 74 20 6e 43 68 75 6e  Chunk, int nChun
1b310 6b 0a 29 7b 0a 20 20 46 74 73 35 53 65 67 57 72  k.){.  Fts5SegWr
1b320 69 74 65 72 20 2a 70 57 72 69 74 65 72 20 3d 20  iter *pWriter = 
1b330 28 46 74 73 35 53 65 67 57 72 69 74 65 72 2a 29  (Fts5SegWriter*)
1b340 70 43 74 78 3b 0a 20 20 66 74 73 35 57 72 69 74  pCtx;.  fts5Writ
1b350 65 41 70 70 65 6e 64 50 6f 73 6c 69 73 74 44 61  eAppendPoslistDa
1b360 74 61 28 70 2c 20 70 57 72 69 74 65 72 2c 20 70  ta(p, pWriter, p
1b370 43 68 75 6e 6b 2c 20 6e 43 68 75 6e 6b 29 3b 0a  Chunk, nChunk);.
1b380 7d 0a 0a 2f 2a 0a 2a 2a 0a 2a 2f 0a 73 74 61 74  }../*.**.*/.stat
1b390 69 63 20 76 6f 69 64 20 66 74 73 35 49 6e 64 65  ic void fts5Inde
1b3a0 78 4d 65 72 67 65 4c 65 76 65 6c 28 0a 20 20 46  xMergeLevel(.  F
1b3b0 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20  ts5Index *p,    
1b3c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1b3d0 2a 20 46 54 53 35 20 62 61 63 6b 65 6e 64 20 6f  * FTS5 backend o
1b3e0 62 6a 65 63 74 20 2a 2f 0a 20 20 46 74 73 35 53  bject */.  Fts5S
1b3f0 74 72 75 63 74 75 72 65 20 2a 2a 70 70 53 74 72  tructure **ppStr
1b400 75 63 74 2c 20 20 20 20 20 20 20 2f 2a 20 49 4e  uct,       /* IN
1b410 2f 4f 55 54 3a 20 53 74 75 63 74 75 72 65 20 6f  /OUT: Stucture o
1b420 66 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74  f index */.  int
1b430 20 69 4c 76 6c 2c 20 20 20 20 20 20 20 20 20 20   iLvl,          
1b440 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1b450 4c 65 76 65 6c 20 74 6f 20 72 65 61 64 20 69 6e  Level to read in
1b460 70 75 74 20 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e  put from */.  in
1b470 74 20 2a 70 6e 52 65 6d 20 20 20 20 20 20 20 20  t *pnRem        
1b480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1b490 20 57 72 69 74 65 20 75 70 20 74 6f 20 74 68 69   Write up to thi
1b4a0 73 20 6d 61 6e 79 20 6f 75 74 70 75 74 20 6c 65  s many output le
1b4b0 61 76 65 73 20 2a 2f 0a 29 7b 0a 20 20 46 74 73  aves */.){.  Fts
1b4c0 35 53 74 72 75 63 74 75 72 65 20 2a 70 53 74 72  5Structure *pStr
1b4d0 75 63 74 20 3d 20 2a 70 70 53 74 72 75 63 74 3b  uct = *ppStruct;
1b4e0 0a 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65  .  Fts5Structure
1b4f0 4c 65 76 65 6c 20 2a 70 4c 76 6c 20 3d 20 26 70  Level *pLvl = &p
1b500 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69  Struct->aLevel[i
1b510 4c 76 6c 5d 3b 0a 20 20 46 74 73 35 53 74 72 75  Lvl];.  Fts5Stru
1b520 63 74 75 72 65 4c 65 76 65 6c 20 2a 70 4c 76 6c  ctureLevel *pLvl
1b530 4f 75 74 3b 0a 20 20 46 74 73 35 49 6e 64 65 78  Out;.  Fts5Index
1b540 49 74 65 72 20 2a 70 49 74 65 72 20 3d 20 30 3b  Iter *pIter = 0;
1b550 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74         /* Iterat
1b560 6f 72 20 74 6f 20 72 65 61 64 20 69 6e 70 75 74  or to read input
1b570 20 64 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20 6e   data */.  int n
1b580 52 65 6d 20 3d 20 70 6e 52 65 6d 20 3f 20 2a 70  Rem = pnRem ? *p
1b590 6e 52 65 6d 20 3a 20 30 3b 20 20 2f 2a 20 4f 75  nRem : 0;  /* Ou
1b5a0 74 70 75 74 20 6c 65 61 66 20 70 61 67 65 73 20  tput leaf pages 
1b5b0 6c 65 66 74 20 74 6f 20 77 72 69 74 65 20 2a 2f  left to write */
1b5c0 0a 20 20 69 6e 74 20 6e 49 6e 70 75 74 3b 20 20  .  int nInput;  
1b5d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b5e0 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
1b5f0 69 6e 70 75 74 20 73 65 67 6d 65 6e 74 73 20 2a  input segments *
1b600 2f 0a 20 20 46 74 73 35 53 65 67 57 72 69 74 65  /.  Fts5SegWrite
1b610 72 20 77 72 69 74 65 72 3b 20 20 20 20 20 20 20  r writer;       
1b620 20 20 20 20 2f 2a 20 57 72 69 74 65 72 20 6f 62      /* Writer ob
1b630 6a 65 63 74 20 2a 2f 0a 20 20 46 74 73 35 53 74  ject */.  Fts5St
1b640 72 75 63 74 75 72 65 53 65 67 6d 65 6e 74 20 2a  ructureSegment *
1b650 70 53 65 67 3b 20 20 20 20 20 2f 2a 20 4f 75 74  pSeg;     /* Out
1b660 70 75 74 20 73 65 67 6d 65 6e 74 20 2a 2f 0a 20  put segment */. 
1b670 20 46 74 73 35 42 75 66 66 65 72 20 74 65 72 6d   Fts5Buffer term
1b680 3b 0a 20 20 69 6e 74 20 62 52 65 71 75 69 72 65  ;.  int bRequire
1b690 44 6f 63 6c 69 73 74 54 65 72 6d 20 3d 20 30 3b  DoclistTerm = 0;
1b6a0 20 20 20 20 2f 2a 20 44 6f 63 6c 69 73 74 20 74      /* Doclist t
1b6b0 65 72 6d 69 6e 61 74 6f 72 20 28 30 78 30 30 29  erminator (0x00)
1b6c0 20 72 65 71 75 69 72 65 64 20 2a 2f 0a 20 20 69   required */.  i
1b6d0 6e 74 20 62 4f 6c 64 65 73 74 3b 20 20 20 20 20  nt bOldest;     
1b6e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1b6f0 2a 20 54 72 75 65 20 69 66 20 74 68 65 20 6f 75  * True if the ou
1b700 74 70 75 74 20 73 65 67 6d 65 6e 74 20 69 73 20  tput segment is 
1b710 74 68 65 20 6f 6c 64 65 73 74 20 2a 2f 0a 0a 20  the oldest */.. 
1b720 20 61 73 73 65 72 74 28 20 69 4c 76 6c 3c 70 53   assert( iLvl<pS
1b730 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 20 29 3b  truct->nLevel );
1b740 0a 20 20 61 73 73 65 72 74 28 20 70 4c 76 6c 2d  .  assert( pLvl-
1b750 3e 6e 4d 65 72 67 65 3c 3d 70 4c 76 6c 2d 3e 6e  >nMerge<=pLvl->n
1b760 53 65 67 20 29 3b 0a 0a 20 20 6d 65 6d 73 65 74  Seg );..  memset
1b770 28 26 77 72 69 74 65 72 2c 20 30 2c 20 73 69 7a  (&writer, 0, siz
1b780 65 6f 66 28 46 74 73 35 53 65 67 57 72 69 74 65  eof(Fts5SegWrite
1b790 72 29 29 3b 0a 20 20 6d 65 6d 73 65 74 28 26 74  r));.  memset(&t
1b7a0 65 72 6d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 46  erm, 0, sizeof(F
1b7b0 74 73 35 42 75 66 66 65 72 29 29 3b 0a 20 20 69  ts5Buffer));.  i
1b7c0 66 28 20 70 4c 76 6c 2d 3e 6e 4d 65 72 67 65 20  f( pLvl->nMerge 
1b7d0 29 7b 0a 20 20 20 20 70 4c 76 6c 4f 75 74 20 3d  ){.    pLvlOut =
1b7e0 20 26 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65   &pStruct->aLeve
1b7f0 6c 5b 69 4c 76 6c 2b 31 5d 3b 0a 20 20 20 20 61  l[iLvl+1];.    a
1b800 73 73 65 72 74 28 20 70 4c 76 6c 4f 75 74 2d 3e  ssert( pLvlOut->
1b810 6e 53 65 67 3e 30 20 29 3b 0a 20 20 20 20 6e 49  nSeg>0 );.    nI
1b820 6e 70 75 74 20 3d 20 70 4c 76 6c 2d 3e 6e 4d 65  nput = pLvl->nMe
1b830 72 67 65 3b 0a 20 20 20 20 70 53 65 67 20 3d 20  rge;.    pSeg = 
1b840 26 70 4c 76 6c 4f 75 74 2d 3e 61 53 65 67 5b 70  &pLvlOut->aSeg[p
1b850 4c 76 6c 4f 75 74 2d 3e 6e 53 65 67 2d 31 5d 3b  LvlOut->nSeg-1];
1b860 0a 0a 20 20 20 20 66 74 73 35 57 72 69 74 65 49  ..    fts5WriteI
1b870 6e 69 74 28 70 2c 20 26 77 72 69 74 65 72 2c 20  nit(p, &writer, 
1b880 70 53 65 67 2d 3e 69 53 65 67 69 64 29 3b 0a 20  pSeg->iSegid);. 
1b890 20 20 20 77 72 69 74 65 72 2e 77 72 69 74 65 72     writer.writer
1b8a0 2e 70 67 6e 6f 20 3d 20 70 53 65 67 2d 3e 70 67  .pgno = pSeg->pg
1b8b0 6e 6f 4c 61 73 74 2b 31 3b 0a 20 20 20 20 77 72  noLast+1;.    wr
1b8c0 69 74 65 72 2e 69 42 74 50 61 67 65 20 3d 20 30  iter.iBtPage = 0
1b8d0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  ;.  }else{.    i
1b8e0 6e 74 20 69 53 65 67 69 64 20 3d 20 66 74 73 35  nt iSegid = fts5
1b8f0 41 6c 6c 6f 63 61 74 65 53 65 67 69 64 28 70 2c  AllocateSegid(p,
1b900 20 70 53 74 72 75 63 74 29 3b 0a 0a 20 20 20 20   pStruct);..    
1b910 2f 2a 20 45 78 74 65 6e 64 20 74 68 65 20 46 74  /* Extend the Ft
1b920 73 35 53 74 72 75 63 74 75 72 65 20 6f 62 6a 65  s5Structure obje
1b930 63 74 20 61 73 20 72 65 71 75 69 72 65 64 20 74  ct as required t
1b940 6f 20 65 6e 73 75 72 65 20 74 68 65 20 6f 75 74  o ensure the out
1b950 70 75 74 0a 20 20 20 20 2a 2a 20 73 65 67 6d 65  put.    ** segme
1b960 6e 74 20 65 78 69 73 74 73 2e 20 2a 2f 0a 20 20  nt exists. */.  
1b970 20 20 69 66 28 20 69 4c 76 6c 3d 3d 70 53 74 72    if( iLvl==pStr
1b980 75 63 74 2d 3e 6e 4c 65 76 65 6c 2d 31 20 29 7b  uct->nLevel-1 ){
1b990 0a 20 20 20 20 20 20 66 74 73 35 53 74 72 75 63  .      fts5Struc
1b9a0 74 75 72 65 41 64 64 4c 65 76 65 6c 28 26 70 2d  tureAddLevel(&p-
1b9b0 3e 72 63 2c 20 70 70 53 74 72 75 63 74 29 3b 0a  >rc, ppStruct);.
1b9c0 20 20 20 20 20 20 70 53 74 72 75 63 74 20 3d 20        pStruct = 
1b9d0 2a 70 70 53 74 72 75 63 74 3b 0a 20 20 20 20 7d  *ppStruct;.    }
1b9e0 0a 20 20 20 20 66 74 73 35 53 74 72 75 63 74 75  .    fts5Structu
1b9f0 72 65 45 78 74 65 6e 64 4c 65 76 65 6c 28 26 70  reExtendLevel(&p
1ba00 2d 3e 72 63 2c 20 70 53 74 72 75 63 74 2c 20 69  ->rc, pStruct, i
1ba10 4c 76 6c 2b 31 2c 20 31 2c 20 30 29 3b 0a 20 20  Lvl+1, 1, 0);.  
1ba20 20 20 69 66 28 20 70 2d 3e 72 63 20 29 20 72 65    if( p->rc ) re
1ba30 74 75 72 6e 3b 0a 20 20 20 20 70 4c 76 6c 20 3d  turn;.    pLvl =
1ba40 20 26 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65   &pStruct->aLeve
1ba50 6c 5b 69 4c 76 6c 5d 3b 0a 20 20 20 20 70 4c 76  l[iLvl];.    pLv
1ba60 6c 4f 75 74 20 3d 20 26 70 53 74 72 75 63 74 2d  lOut = &pStruct-
1ba70 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c 2b 31 5d 3b  >aLevel[iLvl+1];
1ba80 0a 0a 20 20 20 20 66 74 73 35 57 72 69 74 65 49  ..    fts5WriteI
1ba90 6e 69 74 28 70 2c 20 26 77 72 69 74 65 72 2c 20  nit(p, &writer, 
1baa0 69 53 65 67 69 64 29 3b 0a 0a 20 20 20 20 2f 2a  iSegid);..    /*
1bab0 20 41 64 64 20 74 68 65 20 6e 65 77 20 73 65 67   Add the new seg
1bac0 6d 65 6e 74 20 74 6f 20 74 68 65 20 6f 75 74 70  ment to the outp
1bad0 75 74 20 6c 65 76 65 6c 20 2a 2f 0a 20 20 20 20  ut level */.    
1bae0 70 53 65 67 20 3d 20 26 70 4c 76 6c 4f 75 74 2d  pSeg = &pLvlOut-
1baf0 3e 61 53 65 67 5b 70 4c 76 6c 4f 75 74 2d 3e 6e  >aSeg[pLvlOut->n
1bb00 53 65 67 5d 3b 0a 20 20 20 20 70 4c 76 6c 4f 75  Seg];.    pLvlOu
1bb10 74 2d 3e 6e 53 65 67 2b 2b 3b 0a 20 20 20 20 70  t->nSeg++;.    p
1bb20 53 65 67 2d 3e 70 67 6e 6f 46 69 72 73 74 20 3d  Seg->pgnoFirst =
1bb30 20 31 3b 0a 20 20 20 20 70 53 65 67 2d 3e 69 53   1;.    pSeg->iS
1bb40 65 67 69 64 20 3d 20 69 53 65 67 69 64 3b 0a 20  egid = iSegid;. 
1bb50 20 20 20 70 53 74 72 75 63 74 2d 3e 6e 53 65 67     pStruct->nSeg
1bb60 6d 65 6e 74 2b 2b 3b 0a 0a 20 20 20 20 2f 2a 20  ment++;..    /* 
1bb70 52 65 61 64 20 69 6e 70 75 74 20 66 72 6f 6d 20  Read input from 
1bb80 61 6c 6c 20 73 65 67 6d 65 6e 74 73 20 69 6e 20  all segments in 
1bb90 74 68 65 20 69 6e 70 75 74 20 6c 65 76 65 6c 20  the input level 
1bba0 2a 2f 0a 20 20 20 20 6e 49 6e 70 75 74 20 3d 20  */.    nInput = 
1bbb0 70 4c 76 6c 2d 3e 6e 53 65 67 3b 0a 20 20 7d 0a  pLvl->nSeg;.  }.
1bbc0 20 20 62 4f 6c 64 65 73 74 20 3d 20 28 70 4c 76    bOldest = (pLv
1bbd0 6c 4f 75 74 2d 3e 6e 53 65 67 3d 3d 31 20 26 26  lOut->nSeg==1 &&
1bbe0 20 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c   pStruct->nLevel
1bbf0 3d 3d 69 4c 76 6c 2b 32 29 3b 0a 0a 20 20 61 73  ==iLvl+2);..  as
1bc00 73 65 72 74 28 20 69 4c 76 6c 3e 3d 30 20 29 3b  sert( iLvl>=0 );
1bc10 0a 20 20 66 6f 72 28 66 74 73 35 4d 75 6c 74 69  .  for(fts5Multi
1bc20 49 74 65 72 4e 65 77 28 70 2c 20 70 53 74 72 75  IterNew(p, pStru
1bc30 63 74 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20  ct, 0, 0, 0, 0, 
1bc40 69 4c 76 6c 2c 20 6e 49 6e 70 75 74 2c 20 26 70  iLvl, nInput, &p
1bc50 49 74 65 72 29 3b 0a 20 20 20 20 20 20 66 74 73  Iter);.      fts
1bc60 35 4d 75 6c 74 69 49 74 65 72 45 6f 66 28 70 2c  5MultiIterEof(p,
1bc70 20 70 49 74 65 72 29 3d 3d 30 3b 0a 20 20 20 20   pIter)==0;.    
1bc80 20 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 4e    fts5MultiIterN
1bc90 65 78 74 28 70 2c 20 70 49 74 65 72 2c 20 30 2c  ext(p, pIter, 0,
1bca0 20 30 29 0a 20 20 29 7b 0a 20 20 20 20 46 74 73   0).  ){.    Fts
1bcb0 35 53 65 67 49 74 65 72 20 2a 70 53 65 67 49 74  5SegIter *pSegIt
1bcc0 65 72 20 3d 20 26 70 49 74 65 72 2d 3e 61 53 65  er = &pIter->aSe
1bcd0 67 5b 20 70 49 74 65 72 2d 3e 61 46 69 72 73 74  g[ pIter->aFirst
1bce0 5b 31 5d 2e 69 46 69 72 73 74 20 5d 3b 0a 20 20  [1].iFirst ];.  
1bcf0 20 20 69 6e 74 20 6e 50 6f 73 3b 20 20 20 20 20    int nPos;     
1bd00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bd10 2f 2a 20 70 6f 73 69 74 69 6f 6e 2d 6c 69 73 74  /* position-list
1bd20 20 73 69 7a 65 20 66 69 65 6c 64 20 76 61 6c 75   size field valu
1bd30 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 54 65  e */.    int nTe
1bd40 72 6d 3b 0a 20 20 20 20 63 6f 6e 73 74 20 75 38  rm;.    const u8
1bd50 20 2a 70 54 65 72 6d 3b 0a 0a 20 20 20 20 2f 2a   *pTerm;..    /*
1bd60 20 43 68 65 63 6b 20 66 6f 72 20 6b 65 79 20 61   Check for key a
1bd70 6e 6e 69 68 69 6c 61 74 69 6f 6e 2e 20 2a 2f 0a  nnihilation. */.
1bd80 20 20 20 20 69 66 28 20 70 53 65 67 49 74 65 72      if( pSegIter
1bd90 2d 3e 6e 50 6f 73 3d 3d 30 20 26 26 20 28 62 4f  ->nPos==0 && (bO
1bda0 6c 64 65 73 74 20 7c 7c 20 70 53 65 67 49 74 65  ldest || pSegIte
1bdb0 72 2d 3e 62 44 65 6c 3d 3d 30 29 20 29 20 63 6f  r->bDel==0) ) co
1bdc0 6e 74 69 6e 75 65 3b 0a 0a 20 20 20 20 70 54 65  ntinue;..    pTe
1bdd0 72 6d 20 3d 20 66 74 73 35 4d 75 6c 74 69 49 74  rm = fts5MultiIt
1bde0 65 72 54 65 72 6d 28 70 49 74 65 72 2c 20 26 6e  erTerm(pIter, &n
1bdf0 54 65 72 6d 29 3b 0a 20 20 20 20 69 66 28 20 6e  Term);.    if( n
1be00 54 65 72 6d 21 3d 74 65 72 6d 2e 6e 20 7c 7c 20  Term!=term.n || 
1be10 6d 65 6d 63 6d 70 28 70 54 65 72 6d 2c 20 74 65  memcmp(pTerm, te
1be20 72 6d 2e 70 2c 20 6e 54 65 72 6d 29 20 29 7b 0a  rm.p, nTerm) ){.
1be30 20 20 20 20 20 20 69 66 28 20 70 6e 52 65 6d 20        if( pnRem 
1be40 26 26 20 77 72 69 74 65 72 2e 6e 4c 65 61 66 57  && writer.nLeafW
1be50 72 69 74 74 65 6e 3e 6e 52 65 6d 20 29 7b 0a 20  ritten>nRem ){. 
1be60 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
1be70 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20      }..      /* 
1be80 54 68 69 73 20 69 73 20 61 20 6e 65 77 20 74 65  This is a new te
1be90 72 6d 2e 20 41 70 70 65 6e 64 20 61 20 74 65 72  rm. Append a ter
1bea0 6d 20 74 6f 20 74 68 65 20 6f 75 74 70 75 74 20  m to the output 
1beb0 73 65 67 6d 65 6e 74 2e 20 2a 2f 0a 20 20 20 20  segment. */.    
1bec0 20 20 69 66 28 20 62 52 65 71 75 69 72 65 44 6f    if( bRequireDo
1bed0 63 6c 69 73 74 54 65 72 6d 20 29 7b 0a 20 20 20  clistTerm ){.   
1bee0 20 20 20 20 20 66 74 73 35 57 72 69 74 65 41 70       fts5WriteAp
1bef0 70 65 6e 64 5a 65 72 6f 62 79 74 65 28 70 2c 20  pendZerobyte(p, 
1bf00 26 77 72 69 74 65 72 29 3b 0a 20 20 20 20 20 20  &writer);.      
1bf10 7d 0a 20 20 20 20 20 20 66 74 73 35 57 72 69 74  }.      fts5Writ
1bf20 65 41 70 70 65 6e 64 54 65 72 6d 28 70 2c 20 26  eAppendTerm(p, &
1bf30 77 72 69 74 65 72 2c 20 6e 54 65 72 6d 2c 20 70  writer, nTerm, p
1bf40 54 65 72 6d 29 3b 0a 20 20 20 20 20 20 66 74 73  Term);.      fts
1bf50 35 42 75 66 66 65 72 53 65 74 28 26 70 2d 3e 72  5BufferSet(&p->r
1bf60 63 2c 20 26 74 65 72 6d 2c 20 6e 54 65 72 6d 2c  c, &term, nTerm,
1bf70 20 70 54 65 72 6d 29 3b 0a 20 20 20 20 20 20 62   pTerm);.      b
1bf80 52 65 71 75 69 72 65 44 6f 63 6c 69 73 74 54 65  RequireDoclistTe
1bf90 72 6d 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 0a 20  rm = 1;.    }.. 
1bfa0 20 20 20 2f 2a 20 41 70 70 65 6e 64 20 74 68 65     /* Append the
1bfb0 20 72 6f 77 69 64 20 74 6f 20 74 68 65 20 6f 75   rowid to the ou
1bfc0 74 70 75 74 20 2a 2f 0a 20 20 20 20 2f 2a 20 57  tput */.    /* W
1bfd0 52 49 54 45 50 4f 53 4c 49 53 54 53 49 5a 45 20  RITEPOSLISTSIZE 
1bfe0 2a 2f 0a 20 20 20 20 6e 50 6f 73 20 3d 20 70 53  */.    nPos = pS
1bff0 65 67 49 74 65 72 2d 3e 6e 50 6f 73 2a 32 20 2b  egIter->nPos*2 +
1c000 20 70 53 65 67 49 74 65 72 2d 3e 62 44 65 6c 3b   pSegIter->bDel;
1c010 0a 20 20 20 20 66 74 73 35 57 72 69 74 65 41 70  .    fts5WriteAp
1c020 70 65 6e 64 52 6f 77 69 64 28 70 2c 20 26 77 72  pendRowid(p, &wr
1c030 69 74 65 72 2c 20 66 74 73 35 4d 75 6c 74 69 49  iter, fts5MultiI
1c040 74 65 72 52 6f 77 69 64 28 70 49 74 65 72 29 2c  terRowid(pIter),
1c050 20 6e 50 6f 73 29 3b 0a 0a 20 20 20 20 2f 2a 20   nPos);..    /* 
1c060 41 70 70 65 6e 64 20 74 68 65 20 70 6f 73 69 74  Append the posit
1c070 69 6f 6e 2d 6c 69 73 74 20 64 61 74 61 20 74 6f  ion-list data to
1c080 20 74 68 65 20 6f 75 74 70 75 74 20 2a 2f 0a 20   the output */. 
1c090 20 20 20 66 74 73 35 43 68 75 6e 6b 49 74 65 72     fts5ChunkIter
1c0a0 61 74 65 28 70 2c 20 70 53 65 67 49 74 65 72 2c  ate(p, pSegIter,
1c0b0 20 28 76 6f 69 64 2a 29 26 77 72 69 74 65 72 2c   (void*)&writer,
1c0c0 20 66 74 73 35 4d 65 72 67 65 43 68 75 6e 6b 43   fts5MergeChunkC
1c0d0 61 6c 6c 62 61 63 6b 29 3b 0a 20 20 7d 0a 0a 20  allback);.  }.. 
1c0e0 20 2f 2a 20 46 6c 75 73 68 20 74 68 65 20 6c 61   /* Flush the la
1c0f0 73 74 20 6c 65 61 66 20 70 61 67 65 20 74 6f 20  st leaf page to 
1c100 64 69 73 6b 2e 20 53 65 74 20 74 68 65 20 6f 75  disk. Set the ou
1c110 74 70 75 74 20 73 65 67 6d 65 6e 74 20 62 2d 74  tput segment b-t
1c120 72 65 65 20 68 65 69 67 68 74 0a 20 20 2a 2a 20  ree height.  ** 
1c130 61 6e 64 20 6c 61 73 74 20 6c 65 61 66 20 70 61  and last leaf pa
1c140 67 65 20 6e 75 6d 62 65 72 20 61 74 20 74 68 65  ge number at the
1c150 20 73 61 6d 65 20 74 69 6d 65 2e 20 20 2a 2f 0a   same time.  */.
1c160 20 20 66 74 73 35 57 72 69 74 65 46 69 6e 69 73    fts5WriteFinis
1c170 68 28 70 2c 20 26 77 72 69 74 65 72 2c 20 26 70  h(p, &writer, &p
1c180 53 65 67 2d 3e 6e 48 65 69 67 68 74 2c 20 26 70  Seg->nHeight, &p
1c190 53 65 67 2d 3e 70 67 6e 6f 4c 61 73 74 29 3b 0a  Seg->pgnoLast);.
1c1a0 0a 20 20 69 66 28 20 66 74 73 35 4d 75 6c 74 69  .  if( fts5Multi
1c1b0 49 74 65 72 45 6f 66 28 70 2c 20 70 49 74 65 72  IterEof(p, pIter
1c1c0 29 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  ) ){.    int i;.
1c1d0 0a 20 20 20 20 2f 2a 20 52 65 6d 6f 76 65 20 74  .    /* Remove t
1c1e0 68 65 20 72 65 64 75 6e 64 61 6e 74 20 73 65 67  he redundant seg
1c1f0 6d 65 6e 74 73 20 66 72 6f 6d 20 74 68 65 20 25  ments from the %
1c200 5f 64 61 74 61 20 74 61 62 6c 65 20 2a 2f 0a 20  _data table */. 
1c210 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 49     for(i=0; i<nI
1c220 6e 70 75 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nput; i++){.    
1c230 20 20 66 74 73 35 44 61 74 61 52 65 6d 6f 76 65    fts5DataRemove
1c240 53 65 67 6d 65 6e 74 28 70 2c 20 70 4c 76 6c 2d  Segment(p, pLvl-
1c250 3e 61 53 65 67 5b 69 5d 2e 69 53 65 67 69 64 29  >aSeg[i].iSegid)
1c260 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
1c270 52 65 6d 6f 76 65 20 74 68 65 20 72 65 64 75 6e  Remove the redun
1c280 64 61 6e 74 20 73 65 67 6d 65 6e 74 73 20 66 72  dant segments fr
1c290 6f 6d 20 74 68 65 20 69 6e 70 75 74 20 6c 65 76  om the input lev
1c2a0 65 6c 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 4c  el */.    if( pL
1c2b0 76 6c 2d 3e 6e 53 65 67 21 3d 6e 49 6e 70 75 74  vl->nSeg!=nInput
1c2c0 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 4d   ){.      int nM
1c2d0 6f 76 65 20 3d 20 28 70 4c 76 6c 2d 3e 6e 53 65  ove = (pLvl->nSe
1c2e0 67 20 2d 20 6e 49 6e 70 75 74 29 20 2a 20 73 69  g - nInput) * si
1c2f0 7a 65 6f 66 28 46 74 73 35 53 74 72 75 63 74 75  zeof(Fts5Structu
1c300 72 65 53 65 67 6d 65 6e 74 29 3b 0a 20 20 20 20  reSegment);.    
1c310 20 20 6d 65 6d 6d 6f 76 65 28 70 4c 76 6c 2d 3e    memmove(pLvl->
1c320 61 53 65 67 2c 20 26 70 4c 76 6c 2d 3e 61 53 65  aSeg, &pLvl->aSe
1c330 67 5b 6e 49 6e 70 75 74 5d 2c 20 6e 4d 6f 76 65  g[nInput], nMove
1c340 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 53 74  );.    }.    pSt
1c350 72 75 63 74 2d 3e 6e 53 65 67 6d 65 6e 74 20 2d  ruct->nSegment -
1c360 3d 20 6e 49 6e 70 75 74 3b 0a 20 20 20 20 70 4c  = nInput;.    pL
1c370 76 6c 2d 3e 6e 53 65 67 20 2d 3d 20 6e 49 6e 70  vl->nSeg -= nInp
1c380 75 74 3b 0a 20 20 20 20 70 4c 76 6c 2d 3e 6e 4d  ut;.    pLvl->nM
1c390 65 72 67 65 20 3d 20 30 3b 0a 20 20 20 20 69 66  erge = 0;.    if
1c3a0 28 20 70 53 65 67 2d 3e 70 67 6e 6f 4c 61 73 74  ( pSeg->pgnoLast
1c3b0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 4c 76  ==0 ){.      pLv
1c3c0 6c 4f 75 74 2d 3e 6e 53 65 67 2d 2d 3b 0a 20 20  lOut->nSeg--;.  
1c3d0 20 20 20 20 70 53 74 72 75 63 74 2d 3e 6e 53 65      pStruct->nSe
1c3e0 67 6d 65 6e 74 2d 2d 3b 0a 20 20 20 20 7d 0a 20  gment--;.    }. 
1c3f0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65   }else{.    asse
1c400 72 74 28 20 70 53 65 67 2d 3e 70 67 6e 6f 4c 61  rt( pSeg->pgnoLa
1c410 73 74 3e 30 20 29 3b 0a 20 20 20 20 66 74 73 35  st>0 );.    fts5
1c420 54 72 69 6d 53 65 67 6d 65 6e 74 73 28 70 2c 20  TrimSegments(p, 
1c430 70 49 74 65 72 29 3b 0a 20 20 20 20 70 4c 76 6c  pIter);.    pLvl
1c440 2d 3e 6e 4d 65 72 67 65 20 3d 20 6e 49 6e 70 75  ->nMerge = nInpu
1c450 74 3b 0a 20 20 7d 0a 0a 20 20 66 74 73 35 4d 75  t;.  }..  fts5Mu
1c460 6c 74 69 49 74 65 72 46 72 65 65 28 70 2c 20 70  ltiIterFree(p, p
1c470 49 74 65 72 29 3b 0a 20 20 66 74 73 35 42 75 66  Iter);.  fts5Buf
1c480 66 65 72 46 72 65 65 28 26 74 65 72 6d 29 3b 0a  ferFree(&term);.
1c490 20 20 69 66 28 20 70 6e 52 65 6d 20 29 20 2a 70    if( pnRem ) *p
1c4a0 6e 52 65 6d 20 2d 3d 20 77 72 69 74 65 72 2e 6e  nRem -= writer.n
1c4b0 4c 65 61 66 57 72 69 74 74 65 6e 3b 0a 7d 0a 0a  LeafWritten;.}..
1c4c0 2f 2a 0a 2a 2a 20 44 6f 20 75 70 20 74 6f 20 6e  /*.** Do up to n
1c4d0 50 67 20 70 61 67 65 73 20 6f 66 20 61 75 74 6f  Pg pages of auto
1c4e0 6d 65 72 67 65 20 77 6f 72 6b 20 6f 6e 20 74 68  merge work on th
1c4f0 65 20 69 6e 64 65 78 2e 0a 2a 2f 0a 73 74 61 74  e index..*/.stat
1c500 69 63 20 76 6f 69 64 20 66 74 73 35 49 6e 64 65  ic void fts5Inde
1c510 78 4d 65 72 67 65 28 0a 20 20 46 74 73 35 49 6e  xMerge(.  Fts5In
1c520 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20 20  dex *p,         
1c530 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53            /* FTS
1c540 35 20 62 61 63 6b 65 6e 64 20 6f 62 6a 65 63 74  5 backend object
1c550 20 2a 2f 0a 20 20 46 74 73 35 53 74 72 75 63 74   */.  Fts5Struct
1c560 75 72 65 20 2a 2a 70 70 53 74 72 75 63 74 2c 20  ure **ppStruct, 
1c570 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a        /* IN/OUT:
1c580 20 43 75 72 72 65 6e 74 20 73 74 72 75 63 74 75   Current structu
1c590 72 65 20 6f 66 20 69 6e 64 65 78 20 2a 2f 0a 20  re of index */. 
1c5a0 20 69 6e 74 20 6e 50 67 20 20 20 20 20 20 20 20   int nPg        
1c5b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c5c0 20 2f 2a 20 50 61 67 65 73 20 6f 66 20 77 6f 72   /* Pages of wor
1c5d0 6b 20 74 6f 20 64 6f 20 2a 2f 0a 29 7b 0a 20 20  k to do */.){.  
1c5e0 69 6e 74 20 6e 52 65 6d 20 3d 20 6e 50 67 3b 0a  int nRem = nPg;.
1c5f0 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65 20    Fts5Structure 
1c600 2a 70 53 74 72 75 63 74 20 3d 20 2a 70 70 53 74  *pStruct = *ppSt
1c610 72 75 63 74 3b 0a 20 20 77 68 69 6c 65 28 20 6e  ruct;.  while( n
1c620 52 65 6d 3e 30 20 26 26 20 70 2d 3e 72 63 3d 3d  Rem>0 && p->rc==
1c630 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1c640 20 69 6e 74 20 69 4c 76 6c 3b 20 20 20 20 20 20   int iLvl;      
1c650 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1c660 54 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f 75  To iterate throu
1c670 67 68 20 6c 65 76 65 6c 73 20 2a 2f 0a 20 20 20  gh levels */.   
1c680 20 69 6e 74 20 69 42 65 73 74 4c 76 6c 20 3d 20   int iBestLvl = 
1c690 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  0;           /* 
1c6a0 4c 65 76 65 6c 20 6f 66 66 65 72 69 6e 67 20 74  Level offering t
1c6b0 68 65 20 6d 6f 73 74 20 69 6e 70 75 74 20 73 65  he most input se
1c6c0 67 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20 69 6e  gments */.    in
1c6d0 74 20 6e 42 65 73 74 20 3d 20 30 3b 20 20 20 20  t nBest = 0;    
1c6e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
1c6f0 62 65 72 20 6f 66 20 69 6e 70 75 74 20 73 65 67  ber of input seg
1c700 6d 65 6e 74 73 20 6f 6e 20 62 65 73 74 20 6c 65  ments on best le
1c710 76 65 6c 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 53  vel */..    /* S
1c720 65 74 20 69 42 65 73 74 4c 76 6c 20 74 6f 20 74  et iBestLvl to t
1c730 68 65 20 6c 65 76 65 6c 20 74 6f 20 72 65 61 64  he level to read
1c740 20 69 6e 70 75 74 20 73 65 67 6d 65 6e 74 73 20   input segments 
1c750 66 72 6f 6d 2e 20 2a 2f 0a 20 20 20 20 61 73 73  from. */.    ass
1c760 65 72 74 28 20 70 53 74 72 75 63 74 2d 3e 6e 4c  ert( pStruct->nL
1c770 65 76 65 6c 3e 30 20 29 3b 0a 20 20 20 20 66 6f  evel>0 );.    fo
1c780 72 28 69 4c 76 6c 3d 30 3b 20 69 4c 76 6c 3c 70  r(iLvl=0; iLvl<p
1c790 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 3b 20  Struct->nLevel; 
1c7a0 69 4c 76 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 46  iLvl++){.      F
1c7b0 74 73 35 53 74 72 75 63 74 75 72 65 4c 65 76 65  ts5StructureLeve
1c7c0 6c 20 2a 70 4c 76 6c 20 3d 20 26 70 53 74 72 75  l *pLvl = &pStru
1c7d0 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d  ct->aLevel[iLvl]
1c7e0 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4c 76 6c  ;.      if( pLvl
1c7f0 2d 3e 6e 4d 65 72 67 65 20 29 7b 0a 20 20 20 20  ->nMerge ){.    
1c800 20 20 20 20 69 66 28 20 70 4c 76 6c 2d 3e 6e 4d      if( pLvl->nM
1c810 65 72 67 65 3e 6e 42 65 73 74 20 29 7b 0a 20 20  erge>nBest ){.  
1c820 20 20 20 20 20 20 20 20 69 42 65 73 74 4c 76 6c          iBestLvl
1c830 20 3d 20 69 4c 76 6c 3b 0a 20 20 20 20 20 20 20   = iLvl;.       
1c840 20 20 20 6e 42 65 73 74 20 3d 20 70 4c 76 6c 2d     nBest = pLvl-
1c850 3e 6e 4d 65 72 67 65 3b 0a 20 20 20 20 20 20 20  >nMerge;.       
1c860 20 7d 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b   }.        break
1c870 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1c880 69 66 28 20 70 4c 76 6c 2d 3e 6e 53 65 67 3e 6e  if( pLvl->nSeg>n
1c890 42 65 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20  Best ){.        
1c8a0 6e 42 65 73 74 20 3d 20 70 4c 76 6c 2d 3e 6e 53  nBest = pLvl->nS
1c8b0 65 67 3b 0a 20 20 20 20 20 20 20 20 69 42 65 73  eg;.        iBes
1c8c0 74 4c 76 6c 20 3d 20 69 4c 76 6c 3b 0a 20 20 20  tLvl = iLvl;.   
1c8d0 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
1c8e0 2f 2a 20 49 66 20 6e 42 65 73 74 20 69 73 20 73  /* If nBest is s
1c8f0 74 69 6c 6c 20 30 2c 20 74 68 65 6e 20 74 68 65  till 0, then the
1c900 20 69 6e 64 65 78 20 6d 75 73 74 20 62 65 20 65   index must be e
1c910 6d 70 74 79 2e 20 2a 2f 0a 23 69 66 64 65 66 20  mpty. */.#ifdef 
1c920 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20  SQLITE_DEBUG.   
1c930 20 66 6f 72 28 69 4c 76 6c 3d 30 3b 20 6e 42 65   for(iLvl=0; nBe
1c940 73 74 3d 3d 30 20 26 26 20 69 4c 76 6c 3c 70 53  st==0 && iLvl<pS
1c950 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 3b 20 69  truct->nLevel; i
1c960 4c 76 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 61 73  Lvl++){.      as
1c970 73 65 72 74 28 20 70 53 74 72 75 63 74 2d 3e 61  sert( pStruct->a
1c980 4c 65 76 65 6c 5b 69 4c 76 6c 5d 2e 6e 53 65 67  Level[iLvl].nSeg
1c990 3d 3d 30 20 29 3b 0a 20 20 20 20 7d 0a 23 65 6e  ==0 );.    }.#en
1c9a0 64 69 66 0a 0a 20 20 20 20 69 66 28 20 6e 42 65  dif..    if( nBe
1c9b0 73 74 3c 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e 6e  st<p->pConfig->n
1c9c0 41 75 74 6f 6d 65 72 67 65 20 0a 20 20 20 20 20  Automerge .     
1c9d0 20 20 20 26 26 20 70 53 74 72 75 63 74 2d 3e 61     && pStruct->a
1c9e0 4c 65 76 65 6c 5b 69 42 65 73 74 4c 76 6c 5d 2e  Level[iBestLvl].
1c9f0 6e 4d 65 72 67 65 3d 3d 30 20 0a 20 20 20 20 20  nMerge==0 .     
1ca00 20 29 7b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   ){.      break;
1ca10 0a 20 20 20 20 7d 0a 20 20 20 20 66 74 73 35 49  .    }.    fts5I
1ca20 6e 64 65 78 4d 65 72 67 65 4c 65 76 65 6c 28 70  ndexMergeLevel(p
1ca30 2c 20 26 70 53 74 72 75 63 74 2c 20 69 42 65 73  , &pStruct, iBes
1ca40 74 4c 76 6c 2c 20 26 6e 52 65 6d 29 3b 0a 20 20  tLvl, &nRem);.  
1ca50 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c    if( p->rc==SQL
1ca60 49 54 45 5f 4f 4b 20 26 26 20 70 53 74 72 75 63  ITE_OK && pStruc
1ca70 74 2d 3e 61 4c 65 76 65 6c 5b 69 42 65 73 74 4c  t->aLevel[iBestL
1ca80 76 6c 5d 2e 6e 4d 65 72 67 65 3d 3d 30 20 29 7b  vl].nMerge==0 ){
1ca90 0a 20 20 20 20 20 20 66 74 73 35 53 74 72 75 63  .      fts5Struc
1caa0 74 75 72 65 50 72 6f 6d 6f 74 65 28 70 2c 20 69  turePromote(p, i
1cab0 42 65 73 74 4c 76 6c 2b 31 2c 20 70 53 74 72 75  BestLvl+1, pStru
1cac0 63 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  ct);.    }.  }. 
1cad0 20 2a 70 70 53 74 72 75 63 74 20 3d 20 70 53 74   *ppStruct = pSt
1cae0 72 75 63 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  ruct;.}../*.** A
1caf0 20 74 6f 74 61 6c 20 6f 66 20 6e 4c 65 61 66 20   total of nLeaf 
1cb00 6c 65 61 66 20 70 61 67 65 73 20 6f 66 20 64 61  leaf pages of da
1cb10 74 61 20 68 61 73 20 6a 75 73 74 20 62 65 65 6e  ta has just been
1cb20 20 66 6c 75 73 68 65 64 20 74 6f 20 61 20 6c 65   flushed to a le
1cb30 76 65 6c 2d 30 0a 2a 2a 20 73 65 67 6d 65 6e 74  vel-0.** segment
1cb40 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  . This function 
1cb50 75 70 64 61 74 65 73 20 74 68 65 20 77 72 69 74  updates the writ
1cb60 65 2d 63 6f 75 6e 74 65 72 20 61 63 63 6f 72 64  e-counter accord
1cb70 69 6e 67 6c 79 20 61 6e 64 2c 20 69 66 0a 2a 2a  ingly and, if.**
1cb80 20 6e 65 63 65 73 73 61 72 79 2c 20 70 65 72 66   necessary, perf
1cb90 6f 72 6d 73 20 69 6e 63 72 65 6d 65 6e 74 61 6c  orms incremental
1cba0 20 6d 65 72 67 65 20 77 6f 72 6b 2e 0a 2a 2a 0a   merge work..**.
1cbb0 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  ** If an error o
1cbc0 63 63 75 72 73 2c 20 73 65 74 20 74 68 65 20 46  ccurs, set the F
1cbd0 74 73 35 49 6e 64 65 78 2e 72 63 20 65 72 72 6f  ts5Index.rc erro
1cbe0 72 20 63 6f 64 65 2e 20 49 66 20 61 6e 20 65 72  r code. If an er
1cbf0 72 6f 72 20 68 61 73 20 0a 2a 2a 20 61 6c 72 65  ror has .** alre
1cc00 61 64 79 20 6f 63 63 75 72 72 65 64 2c 20 74 68  ady occurred, th
1cc10 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61  is function is a
1cc20 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69   no-op..*/.stati
1cc30 63 20 76 6f 69 64 20 66 74 73 35 49 6e 64 65 78  c void fts5Index
1cc40 41 75 74 6f 6d 65 72 67 65 28 0a 20 20 46 74 73  Automerge(.  Fts
1cc50 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20  5Index *p,      
1cc60 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1cc70 46 54 53 35 20 62 61 63 6b 65 6e 64 20 6f 62 6a  FTS5 backend obj
1cc80 65 63 74 20 2a 2f 0a 20 20 46 74 73 35 53 74 72  ect */.  Fts5Str
1cc90 75 63 74 75 72 65 20 2a 2a 70 70 53 74 72 75 63  ucture **ppStruc
1cca0 74 2c 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f  t,       /* IN/O
1ccb0 55 54 3a 20 43 75 72 72 65 6e 74 20 73 74 72 75  UT: Current stru
1ccc0 63 74 75 72 65 20 6f 66 20 69 6e 64 65 78 20 2a  cture of index *
1ccd0 2f 0a 20 20 69 6e 74 20 6e 4c 65 61 66 20 20 20  /.  int nLeaf   
1cce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ccf0 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
1cd00 20 6f 75 74 70 75 74 20 6c 65 61 76 65 73 20 6a   output leaves j
1cd10 75 73 74 20 77 72 69 74 74 65 6e 20 2a 2f 0a 29  ust written */.)
1cd20 7b 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53  {.  if( p->rc==S
1cd30 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 2d 3e 70  QLITE_OK && p->p
1cd40 43 6f 6e 66 69 67 2d 3e 6e 41 75 74 6f 6d 65 72  Config->nAutomer
1cd50 67 65 3e 30 20 29 7b 0a 20 20 20 20 46 74 73 35  ge>0 ){.    Fts5
1cd60 53 74 72 75 63 74 75 72 65 20 2a 70 53 74 72 75  Structure *pStru
1cd70 63 74 20 3d 20 2a 70 70 53 74 72 75 63 74 3b 0a  ct = *ppStruct;.
1cd80 20 20 20 20 75 36 34 20 6e 57 72 69 74 65 3b 20      u64 nWrite; 
1cd90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cda0 20 20 2f 2a 20 49 6e 69 74 69 61 6c 20 76 61 6c    /* Initial val
1cdb0 75 65 20 6f 66 20 77 72 69 74 65 2d 63 6f 75 6e  ue of write-coun
1cdc0 74 65 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e  ter */.    int n
1cdd0 57 6f 72 6b 3b 20 20 20 20 20 20 20 20 20 20 20  Work;           
1cde0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
1cdf0 65 72 20 6f 66 20 77 6f 72 6b 2d 71 75 61 6e 74  er of work-quant
1ce00 61 20 74 6f 20 70 65 72 66 6f 72 6d 20 2a 2f 0a  a to perform */.
1ce10 20 20 20 20 69 6e 74 20 6e 52 65 6d 3b 20 20 20      int nRem;   
1ce20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ce30 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6c    /* Number of l
1ce40 65 61 66 20 70 61 67 65 73 20 6c 65 66 74 20 74  eaf pages left t
1ce50 6f 20 77 72 69 74 65 20 2a 2f 0a 0a 20 20 20 20  o write */..    
1ce60 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20 77 72  /* Update the wr
1ce70 69 74 65 2d 63 6f 75 6e 74 65 72 2e 20 57 68 69  ite-counter. Whi
1ce80 6c 65 20 64 6f 69 6e 67 20 73 6f 2c 20 73 65 74  le doing so, set
1ce90 20 6e 57 6f 72 6b 2e 20 2a 2f 0a 20 20 20 20 6e   nWork. */.    n
1cea0 57 72 69 74 65 20 3d 20 70 53 74 72 75 63 74 2d  Write = pStruct-
1ceb0 3e 6e 57 72 69 74 65 43 6f 75 6e 74 65 72 3b 0a  >nWriteCounter;.
1cec0 20 20 20 20 6e 57 6f 72 6b 20 3d 20 28 69 6e 74      nWork = (int
1ced0 29 28 28 28 6e 57 72 69 74 65 20 2b 20 6e 4c 65  )(((nWrite + nLe
1cee0 61 66 29 20 2f 20 70 2d 3e 6e 57 6f 72 6b 55 6e  af) / p->nWorkUn
1cef0 69 74 29 20 2d 20 28 6e 57 72 69 74 65 20 2f 20  it) - (nWrite / 
1cf00 70 2d 3e 6e 57 6f 72 6b 55 6e 69 74 29 29 3b 0a  p->nWorkUnit));.
1cf10 20 20 20 20 70 53 74 72 75 63 74 2d 3e 6e 57 72      pStruct->nWr
1cf20 69 74 65 43 6f 75 6e 74 65 72 20 2b 3d 20 6e 4c  iteCounter += nL
1cf30 65 61 66 3b 0a 20 20 20 20 6e 52 65 6d 20 3d 20  eaf;.    nRem = 
1cf40 28 69 6e 74 29 28 70 2d 3e 6e 57 6f 72 6b 55 6e  (int)(p->nWorkUn
1cf50 69 74 20 2a 20 6e 57 6f 72 6b 20 2a 20 70 53 74  it * nWork * pSt
1cf60 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 29 3b 0a 0a  ruct->nLevel);..
1cf70 20 20 20 20 66 74 73 35 49 6e 64 65 78 4d 65 72      fts5IndexMer
1cf80 67 65 28 70 2c 20 70 70 53 74 72 75 63 74 2c 20  ge(p, ppStruct, 
1cf90 6e 52 65 6d 29 3b 0a 20 20 7d 0a 7d 0a 0a 73 74  nRem);.  }.}..st
1cfa0 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 49 6e  atic void fts5In
1cfb0 64 65 78 43 72 69 73 69 73 6d 65 72 67 65 28 0a  dexCrisismerge(.
1cfc0 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20    Fts5Index *p, 
1cfd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cfe0 20 20 2f 2a 20 46 54 53 35 20 62 61 63 6b 65 6e    /* FTS5 backen
1cff0 64 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 46 74  d object */.  Ft
1d000 73 35 53 74 72 75 63 74 75 72 65 20 2a 2a 70 70  s5Structure **pp
1d010 53 74 72 75 63 74 20 20 20 20 20 20 20 20 2f 2a  Struct        /*
1d020 20 49 4e 2f 4f 55 54 3a 20 43 75 72 72 65 6e 74   IN/OUT: Current
1d030 20 73 74 72 75 63 74 75 72 65 20 6f 66 20 69 6e   structure of in
1d040 64 65 78 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73  dex */.){.  cons
1d050 74 20 69 6e 74 20 6e 43 72 69 73 69 73 20 3d 20  t int nCrisis = 
1d060 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e 6e 43 72 69  p->pConfig->nCri
1d070 73 69 73 4d 65 72 67 65 3b 0a 20 20 46 74 73 35  sisMerge;.  Fts5
1d080 53 74 72 75 63 74 75 72 65 20 2a 70 53 74 72 75  Structure *pStru
1d090 63 74 20 3d 20 2a 70 70 53 74 72 75 63 74 3b 0a  ct = *ppStruct;.
1d0a0 20 20 69 6e 74 20 69 4c 76 6c 20 3d 20 30 3b 0a    int iLvl = 0;.
1d0b0 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72 63  .  assert( p->rc
1d0c0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70  !=SQLITE_OK || p
1d0d0 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 3e 30  Struct->nLevel>0
1d0e0 20 29 3b 0a 20 20 77 68 69 6c 65 28 20 70 2d 3e   );.  while( p->
1d0f0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
1d100 20 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c   pStruct->aLevel
1d110 5b 69 4c 76 6c 5d 2e 6e 53 65 67 3e 3d 6e 43 72  [iLvl].nSeg>=nCr
1d120 69 73 69 73 20 29 7b 0a 20 20 20 20 66 74 73 35  isis ){.    fts5
1d130 49 6e 64 65 78 4d 65 72 67 65 4c 65 76 65 6c 28  IndexMergeLevel(
1d140 70 2c 20 26 70 53 74 72 75 63 74 2c 20 69 4c 76  p, &pStruct, iLv
1d150 6c 2c 20 30 29 3b 0a 20 20 20 20 66 74 73 35 53  l, 0);.    fts5S
1d160 74 72 75 63 74 75 72 65 50 72 6f 6d 6f 74 65 28  tructurePromote(
1d170 70 2c 20 69 4c 76 6c 2b 31 2c 20 70 53 74 72 75  p, iLvl+1, pStru
1d180 63 74 29 3b 0a 20 20 20 20 69 4c 76 6c 2b 2b 3b  ct);.    iLvl++;
1d190 0a 20 20 7d 0a 20 20 2a 70 70 53 74 72 75 63 74  .  }.  *ppStruct
1d1a0 20 3d 20 70 53 74 72 75 63 74 3b 0a 7d 0a 0a 73   = pStruct;.}..s
1d1b0 74 61 74 69 63 20 69 6e 74 20 66 74 73 35 49 6e  tatic int fts5In
1d1c0 64 65 78 52 65 74 75 72 6e 28 46 74 73 35 49 6e  dexReturn(Fts5In
1d1d0 64 65 78 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72  dex *p){.  int r
1d1e0 63 20 3d 20 70 2d 3e 72 63 3b 0a 20 20 70 2d 3e  c = p->rc;.  p->
1d1f0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
1d200 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
1d210 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 46  typedef struct F
1d220 74 73 35 46 6c 75 73 68 43 74 78 20 46 74 73 35  ts5FlushCtx Fts5
1d230 46 6c 75 73 68 43 74 78 3b 0a 73 74 72 75 63 74  FlushCtx;.struct
1d240 20 46 74 73 35 46 6c 75 73 68 43 74 78 20 7b 0a   Fts5FlushCtx {.
1d250 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 49 64    Fts5Index *pId
1d260 78 3b 0a 20 20 46 74 73 35 53 65 67 57 72 69 74  x;.  Fts5SegWrit
1d270 65 72 20 77 72 69 74 65 72 3b 20 0a 7d 3b 0a 0a  er writer; .};..
1d280 2f 2a 0a 2a 2a 20 42 75 66 66 65 72 20 61 42 75  /*.** Buffer aBu
1d290 66 5b 5d 20 63 6f 6e 74 61 69 6e 73 20 61 20 6c  f[] contains a l
1d2a0 69 73 74 20 6f 66 20 76 61 72 69 6e 74 73 2c 20  ist of varints, 
1d2b0 61 6c 6c 20 73 6d 61 6c 6c 20 65 6e 6f 75 67 68  all small enough
1d2c0 20 74 6f 20 66 69 74 0a 2a 2a 20 69 6e 20 61 20   to fit.** in a 
1d2d0 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72 2e 20  32-bit integer. 
1d2e0 52 65 74 75 72 6e 20 74 68 65 20 73 69 7a 65 20  Return the size 
1d2f0 6f 66 20 74 68 65 20 6c 61 72 67 65 73 74 20 70  of the largest p
1d300 72 65 66 69 78 20 6f 66 20 74 68 69 73 20 0a 2a  refix of this .*
1d310 2a 20 6c 69 73 74 20 6e 4d 61 78 20 62 79 74 65  * list nMax byte
1d320 73 20 6f 72 20 6c 65 73 73 20 69 6e 20 73 69 7a  s or less in siz
1d330 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
1d340 20 66 74 73 35 50 6f 73 6c 69 73 74 50 72 65 66   fts5PoslistPref
1d350 69 78 28 63 6f 6e 73 74 20 75 38 20 2a 61 42 75  ix(const u8 *aBu
1d360 66 2c 20 69 6e 74 20 6e 4d 61 78 29 7b 0a 20 20  f, int nMax){.  
1d370 69 6e 74 20 72 65 74 3b 0a 20 20 75 33 32 20 64  int ret;.  u32 d
1d380 75 6d 6d 79 3b 0a 20 20 72 65 74 20 3d 20 66 74  ummy;.  ret = ft
1d390 73 35 47 65 74 56 61 72 69 6e 74 33 32 28 61 42  s5GetVarint32(aB
1d3a0 75 66 2c 20 64 75 6d 6d 79 29 3b 0a 20 20 77 68  uf, dummy);.  wh
1d3b0 69 6c 65 28 20 31 20 29 7b 0a 20 20 20 20 69 6e  ile( 1 ){.    in
1d3c0 74 20 69 20 3d 20 66 74 73 35 47 65 74 56 61 72  t i = fts5GetVar
1d3d0 69 6e 74 33 32 28 26 61 42 75 66 5b 72 65 74 5d  int32(&aBuf[ret]
1d3e0 2c 20 64 75 6d 6d 79 29 3b 0a 20 20 20 20 69 66  , dummy);.    if
1d3f0 28 20 28 72 65 74 20 2b 20 69 29 20 3e 20 6e 4d  ( (ret + i) > nM
1d400 61 78 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  ax ) break;.    
1d410 72 65 74 20 2b 3d 20 69 3b 0a 20 20 7d 0a 20 20  ret += i;.  }.  
1d420 72 65 74 75 72 6e 20 72 65 74 3b 0a 7d 0a 0a 23  return ret;.}..#
1d430 64 65 66 69 6e 65 20 66 74 73 35 42 75 66 66 65  define fts5Buffe
1d440 72 53 61 66 65 41 70 70 65 6e 64 42 6c 6f 62 28  rSafeAppendBlob(
1d450 70 42 75 66 2c 20 70 42 6c 6f 62 2c 20 6e 42 6c  pBuf, pBlob, nBl
1d460 6f 62 29 20 7b 20 5c 0a 20 20 61 73 73 65 72 74  ob) { \.  assert
1d470 28 20 70 42 75 66 2d 3e 6e 53 70 61 63 65 3e 3d  ( pBuf->nSpace>=
1d480 28 70 42 75 66 2d 3e 6e 2b 6e 42 6c 6f 62 29 20  (pBuf->n+nBlob) 
1d490 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 5c  );             \
1d4a0 0a 20 20 6d 65 6d 63 70 79 28 26 70 42 75 66 2d  .  memcpy(&pBuf-
1d4b0 3e 70 5b 70 42 75 66 2d 3e 6e 5d 2c 20 70 42 6c  >p[pBuf->n], pBl
1d4c0 6f 62 2c 20 6e 42 6c 6f 62 29 3b 20 20 20 20 20  ob, nBlob);     
1d4d0 20 20 20 20 20 20 20 20 5c 0a 20 20 70 42 75 66          \.  pBuf
1d4e0 2d 3e 6e 20 2b 3d 20 6e 42 6c 6f 62 3b 20 20 20  ->n += nBlob;   
1d4f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d510 20 5c 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 6c 75 73   \.}../*.** Flus
1d520 68 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  h the contents o
1d530 66 20 69 6e 2d 6d 65 6d 6f 72 79 20 68 61 73 68  f in-memory hash
1d540 20 74 61 62 6c 65 20 69 48 61 73 68 20 74 6f 20   table iHash to 
1d550 61 20 6e 65 77 20 6c 65 76 65 6c 2d 30 20 0a 2a  a new level-0 .*
1d560 2a 20 73 65 67 6d 65 6e 74 20 6f 6e 20 64 69 73  * segment on dis
1d570 6b 2e 20 41 6c 73 6f 20 75 70 64 61 74 65 20 74  k. Also update t
1d580 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  he corresponding
1d590 20 73 74 72 75 63 74 75 72 65 20 72 65 63 6f 72   structure recor
1d5a0 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65  d..**.** If an e
1d5b0 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 73 65 74  rror occurs, set
1d5c0 20 74 68 65 20 46 74 73 35 49 6e 64 65 78 2e 72   the Fts5Index.r
1d5d0 63 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 49 66  c error code. If
1d5e0 20 61 6e 20 65 72 72 6f 72 20 68 61 73 20 0a 2a   an error has .*
1d5f0 2a 20 61 6c 72 65 61 64 79 20 6f 63 63 75 72 72  * already occurr
1d600 65 64 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ed, this functio
1d610 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f  n is a no-op..*/
1d620 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
1d630 35 46 6c 75 73 68 4f 6e 65 48 61 73 68 28 46 74  5FlushOneHash(Ft
1d640 73 35 49 6e 64 65 78 20 2a 70 29 7b 0a 20 20 46  s5Index *p){.  F
1d650 74 73 35 48 61 73 68 20 2a 70 48 61 73 68 20 3d  ts5Hash *pHash =
1d660 20 70 2d 3e 70 48 61 73 68 3b 0a 20 20 46 74 73   p->pHash;.  Fts
1d670 35 53 74 72 75 63 74 75 72 65 20 2a 70 53 74 72  5Structure *pStr
1d680 75 63 74 3b 0a 20 20 69 6e 74 20 69 53 65 67 69  uct;.  int iSegi
1d690 64 3b 0a 20 20 69 6e 74 20 70 67 6e 6f 4c 61 73  d;.  int pgnoLas
1d6a0 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  t = 0;          
1d6b0 20 20 20 20 20 20 20 2f 2a 20 4c 61 73 74 20 6c         /* Last l
1d6c0 65 61 66 20 70 61 67 65 20 6e 75 6d 62 65 72 20  eaf page number 
1d6d0 69 6e 20 73 65 67 6d 65 6e 74 20 2a 2f 0a 0a 20  in segment */.. 
1d6e0 20 2f 2a 20 4f 62 74 61 69 6e 20 61 20 72 65 66   /* Obtain a ref
1d6f0 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20 69 6e  erence to the in
1d700 64 65 78 20 73 74 72 75 63 74 75 72 65 20 61 6e  dex structure an
1d710 64 20 61 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77  d allocate a new
1d720 20 73 65 67 6d 65 6e 74 2d 69 64 0a 20 20 2a 2a   segment-id.  **
1d730 20 66 6f 72 20 74 68 65 20 6e 65 77 20 6c 65 76   for the new lev
1d740 65 6c 2d 30 20 73 65 67 6d 65 6e 74 2e 20 20 2a  el-0 segment.  *
1d750 2f 0a 20 20 70 53 74 72 75 63 74 20 3d 20 66 74  /.  pStruct = ft
1d760 73 35 53 74 72 75 63 74 75 72 65 52 65 61 64 28  s5StructureRead(
1d770 70 29 3b 0a 20 20 69 53 65 67 69 64 20 3d 20 66  p);.  iSegid = f
1d780 74 73 35 41 6c 6c 6f 63 61 74 65 53 65 67 69 64  ts5AllocateSegid
1d790 28 70 2c 20 70 53 74 72 75 63 74 29 3b 0a 0a 20  (p, pStruct);.. 
1d7a0 20 69 66 28 20 69 53 65 67 69 64 20 29 7b 0a 20   if( iSegid ){. 
1d7b0 20 20 20 63 6f 6e 73 74 20 69 6e 74 20 70 67 73     const int pgs
1d7c0 7a 20 3d 20 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e  z = p->pConfig->
1d7d0 70 67 73 7a 3b 0a 0a 20 20 20 20 46 74 73 35 53  pgsz;..    Fts5S
1d7e0 74 72 75 63 74 75 72 65 53 65 67 6d 65 6e 74 20  tructureSegment 
1d7f0 2a 70 53 65 67 3b 20 20 20 2f 2a 20 4e 65 77 20  *pSeg;   /* New 
1d800 73 65 67 6d 65 6e 74 20 77 69 74 68 69 6e 20 70  segment within p
1d810 53 74 72 75 63 74 20 2a 2f 0a 20 20 20 20 69 6e  Struct */.    in
1d820 74 20 6e 48 65 69 67 68 74 3b 20 20 20 20 20 20  t nHeight;      
1d830 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48              /* H
1d840 65 69 67 68 74 20 6f 66 20 6e 65 77 20 73 65 67  eight of new seg
1d850 6d 65 6e 74 20 62 2d 74 72 65 65 20 2a 2f 0a 20  ment b-tree */. 
1d860 20 20 20 46 74 73 35 42 75 66 66 65 72 20 2a 70     Fts5Buffer *p
1d870 42 75 66 3b 20 20 20 20 20 20 20 20 20 20 20 20  Buf;            
1d880 20 2f 2a 20 42 75 66 66 65 72 20 69 6e 20 77 68   /* Buffer in wh
1d890 69 63 68 20 74 6f 20 61 73 73 65 6d 62 6c 65 20  ich to assemble 
1d8a0 6c 65 61 66 20 70 61 67 65 20 2a 2f 0a 20 20 20  leaf page */.   
1d8b0 20 46 74 73 35 42 75 66 66 65 72 20 2a 70 50 67   Fts5Buffer *pPg
1d8c0 69 64 78 3b 20 20 20 20 20 20 20 20 20 20 20 2f  idx;           /
1d8d0 2a 20 42 75 66 66 65 72 20 69 6e 20 77 68 69 63  * Buffer in whic
1d8e0 68 20 74 6f 20 61 73 73 65 6d 62 6c 65 20 70 67  h to assemble pg
1d8f0 69 64 78 20 2a 2f 0a 20 20 20 20 63 6f 6e 73 74  idx */.    const
1d900 20 75 38 20 2a 7a 50 72 65 76 20 3d 20 30 3b 0a   u8 *zPrev = 0;.
1d910 0a 20 20 20 20 46 74 73 35 53 65 67 57 72 69 74  .    Fts5SegWrit
1d920 65 72 20 77 72 69 74 65 72 3b 0a 20 20 20 20 66  er writer;.    f
1d930 74 73 35 57 72 69 74 65 49 6e 69 74 28 70 2c 20  ts5WriteInit(p, 
1d940 26 77 72 69 74 65 72 2c 20 69 53 65 67 69 64 29  &writer, iSegid)
1d950 3b 0a 0a 20 20 20 20 2f 2a 20 50 72 65 2d 61 6c  ;..    /* Pre-al
1d960 6c 6f 63 61 74 65 20 74 68 65 20 62 75 66 66 65  locate the buffe
1d970 72 20 75 73 65 64 20 74 6f 20 61 73 73 65 6d 62  r used to assemb
1d980 6c 65 20 6c 65 61 66 20 70 61 67 65 73 20 74 6f  le leaf pages to
1d990 20 74 68 65 20 74 61 72 67 65 74 0a 20 20 20 20   the target.    
1d9a0 2a 2a 20 70 61 67 65 20 73 69 7a 65 2e 20 20 2a  ** page size.  *
1d9b0 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 67  /.    assert( pg
1d9c0 73 7a 3e 30 20 29 3b 0a 20 20 20 20 70 42 75 66  sz>0 );.    pBuf
1d9d0 20 3d 20 26 77 72 69 74 65 72 2e 77 72 69 74 65   = &writer.write
1d9e0 72 2e 62 75 66 3b 0a 20 20 20 20 70 50 67 69 64  r.buf;.    pPgid
1d9f0 78 20 3d 20 26 77 72 69 74 65 72 2e 77 72 69 74  x = &writer.writ
1da00 65 72 2e 70 67 69 64 78 3b 0a 20 20 20 20 66 74  er.pgidx;.    ft
1da10 73 35 42 75 66 66 65 72 47 72 6f 77 28 26 70 2d  s5BufferGrow(&p-
1da20 3e 72 63 2c 20 70 42 75 66 2c 20 70 67 73 7a 20  >rc, pBuf, pgsz 
1da30 2b 20 32 30 29 3b 0a 0a 20 20 20 20 2f 2a 20 42  + 20);..    /* B
1da40 65 67 69 6e 20 73 63 61 6e 6e 69 6e 67 20 74 68  egin scanning th
1da50 72 6f 75 67 68 20 68 61 73 68 20 74 61 62 6c 65  rough hash table
1da60 20 65 6e 74 72 69 65 73 2e 20 54 68 69 73 20 6c   entries. This l
1da70 6f 6f 70 20 72 75 6e 73 20 6f 6e 63 65 20 66 6f  oop runs once fo
1da80 72 20 65 61 63 68 0a 20 20 20 20 2a 2a 20 74 65  r each.    ** te
1da90 72 6d 2f 64 6f 63 6c 69 73 74 20 63 75 72 72 65  rm/doclist curre
1daa0 6e 74 6c 79 20 73 74 6f 72 65 64 20 77 69 74 68  ntly stored with
1dab0 69 6e 20 74 68 65 20 68 61 73 68 20 74 61 62 6c  in the hash tabl
1dac0 65 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d  e. */.    if( p-
1dad0 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  >rc==SQLITE_OK )
1dae0 7b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70  {.      memset(p
1daf0 42 75 66 2d 3e 70 2c 20 30 2c 20 34 29 3b 0a 20  Buf->p, 0, 4);. 
1db00 20 20 20 20 20 70 42 75 66 2d 3e 6e 20 3d 20 34       pBuf->n = 4
1db10 3b 0a 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20  ;.      p->rc = 
1db20 73 71 6c 69 74 65 33 46 74 73 35 48 61 73 68 53  sqlite3Fts5HashS
1db30 63 61 6e 49 6e 69 74 28 70 48 61 73 68 2c 20 30  canInit(pHash, 0
1db40 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  , 0);.    }.    
1db50 77 68 69 6c 65 28 20 70 2d 3e 72 63 3d 3d 53 51  while( p->rc==SQ
1db60 4c 49 54 45 5f 4f 4b 20 26 26 20 30 3d 3d 73 71  LITE_OK && 0==sq
1db70 6c 69 74 65 33 46 74 73 35 48 61 73 68 53 63 61  lite3Fts5HashSca
1db80 6e 45 6f 66 28 70 48 61 73 68 29 20 29 7b 0a 20  nEof(pHash) ){. 
1db90 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
1dba0 2a 7a 54 65 72 6d 3b 20 20 20 20 20 20 20 20 20  *zTerm;         
1dbb0 20 2f 2a 20 42 75 66 66 65 72 20 63 6f 6e 74 61   /* Buffer conta
1dbc0 69 6e 69 6e 67 20 74 65 72 6d 20 2a 2f 0a 20 20  ining term */.  
1dbd0 20 20 20 20 69 6e 74 20 6e 54 65 72 6d 3b 20 20      int nTerm;  
1dbe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dbf0 2f 2a 20 53 69 7a 65 20 6f 66 20 7a 54 65 72 6d  /* Size of zTerm
1dc00 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 20   in bytes */.   
1dc10 20 20 20 63 6f 6e 73 74 20 75 38 20 2a 70 44 6f     const u8 *pDo
1dc20 63 6c 69 73 74 3b 20 20 20 20 20 20 20 20 20 2f  clist;         /
1dc30 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 64 6f 63  * Pointer to doc
1dc40 6c 69 73 74 20 66 6f 72 20 74 68 69 73 20 74 65  list for this te
1dc50 72 6d 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  rm */.      int 
1dc60 6e 44 6f 63 6c 69 73 74 3b 20 20 20 20 20 20 20  nDoclist;       
1dc70 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
1dc80 6f 66 20 64 6f 63 6c 69 73 74 20 69 6e 20 62 79  of doclist in by
1dc90 74 65 73 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  tes */.      int
1dca0 20 6e 53 75 66 66 69 78 3b 20 20 20 20 20 20 20   nSuffix;       
1dcb0 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
1dcc0 20 6f 66 20 74 65 72 6d 20 73 75 66 66 69 78 20   of term suffix 
1dcd0 2a 2f 0a 0a 20 20 20 20 20 20 73 71 6c 69 74 65  */..      sqlite
1dce0 33 46 74 73 35 48 61 73 68 53 63 61 6e 45 6e 74  3Fts5HashScanEnt
1dcf0 72 79 28 70 48 61 73 68 2c 20 26 7a 54 65 72 6d  ry(pHash, &zTerm
1dd00 2c 20 26 70 44 6f 63 6c 69 73 74 2c 20 26 6e 44  , &pDoclist, &nD
1dd10 6f 63 6c 69 73 74 29 3b 0a 20 20 20 20 20 20 6e  oclist);.      n
1dd20 54 65 72 6d 20 3d 20 73 74 72 6c 65 6e 28 7a 54  Term = strlen(zT
1dd30 65 72 6d 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  erm);..      /* 
1dd40 44 65 63 69 64 65 20 69 66 20 74 68 65 20 74 65  Decide if the te
1dd50 72 6d 20 77 69 6c 6c 20 66 69 74 20 6f 6e 20 74  rm will fit on t
1dd60 68 65 20 63 75 72 72 65 6e 74 20 6c 65 61 66 2e  he current leaf.
1dd70 20 49 66 20 69 74 20 77 69 6c 6c 20 6e 6f 74 2c   If it will not,
1dd80 0a 20 20 20 20 20 20 2a 2a 20 66 6c 75 73 68 20  .      ** flush 
1dd90 74 68 65 20 6c 65 61 66 20 74 6f 20 64 69 73 6b  the leaf to disk
1dda0 20 68 65 72 65 2e 20 20 0a 20 20 20 20 20 20 2a   here.  .      *
1ddb0 2a 20 54 4f 44 4f 31 3a 20 49 73 20 74 68 69 73  * TODO1: Is this
1ddc0 20 63 61 6c 63 75 6c 61 74 69 6f 6e 20 73 74 69   calculation sti
1ddd0 6c 6c 20 63 6f 72 72 65 63 74 3f 20 20 2a 2f 0a  ll correct?  */.
1dde0 20 20 20 20 20 20 69 66 28 20 70 42 75 66 2d 3e        if( pBuf->
1ddf0 6e 3e 34 20 26 26 20 28 70 42 75 66 2d 3e 6e 20  n>4 && (pBuf->n 
1de00 2b 20 6e 54 65 72 6d 20 2b 20 32 20 2b 20 70 50  + nTerm + 2 + pP
1de10 67 69 64 78 2d 3e 6e 20 2b 20 32 29 20 3e 20 70  gidx->n + 2) > p
1de20 67 73 7a 20 29 7b 0a 20 20 20 20 20 20 20 20 66  gsz ){.        f
1de30 74 73 35 57 72 69 74 65 46 6c 75 73 68 4c 65 61  ts5WriteFlushLea
1de40 66 28 70 2c 20 26 77 72 69 74 65 72 29 3b 0a 20  f(p, &writer);. 
1de50 20 20 20 20 20 20 20 69 66 28 20 28 6e 54 65 72         if( (nTer
1de60 6d 20 2b 20 33 32 29 20 3e 20 70 42 75 66 2d 3e  m + 32) > pBuf->
1de70 6e 53 70 61 63 65 20 29 7b 0a 20 20 20 20 20 20  nSpace ){.      
1de80 20 20 20 20 66 74 73 35 42 75 66 66 65 72 47 72      fts5BufferGr
1de90 6f 77 28 26 70 2d 3e 72 63 2c 20 70 42 75 66 2c  ow(&p->rc, pBuf,
1dea0 20 6e 54 65 72 6d 20 2b 20 33 32 20 2d 20 70 42   nTerm + 32 - pB
1deb0 75 66 2d 3e 6e 29 3b 0a 20 20 20 20 20 20 20 20  uf->n);.        
1dec0 20 20 69 66 28 20 70 2d 3e 72 63 20 29 20 62 72    if( p->rc ) br
1ded0 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  eak;.        }. 
1dee0 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a       }..      /*
1def0 20 57 72 69 74 65 20 74 68 65 20 74 65 72 6d 20   Write the term 
1df00 74 6f 20 74 68 65 20 6c 65 61 66 2e 20 41 6e 64  to the leaf. And
1df10 20 69 66 20 69 74 20 69 73 20 74 68 65 20 66 69   if it is the fi
1df20 72 73 74 20 6f 6e 20 74 68 65 20 6c 65 61 66 2c  rst on the leaf,
1df30 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20 74 68   and.      ** th
1df40 65 20 6c 65 61 66 20 69 73 20 6e 6f 74 20 70 61  e leaf is not pa
1df50 67 65 20 6e 75 6d 62 65 72 20 31 2c 20 70 75 73  ge number 1, pus
1df60 68 20 69 74 20 75 70 20 69 6e 74 6f 20 74 68 65  h it up into the
1df70 20 62 2d 74 72 65 65 20 68 69 65 72 61 72 63 68   b-tree hierarch
1df80 79 20 0a 20 20 20 20 20 20 2a 2a 20 61 73 20 77  y .      ** as w
1df90 65 6c 6c 2e 20 20 2a 2f 0a 0a 20 20 20 20 20 20  ell.  */..      
1dfa0 2f 2a 20 54 4f 44 4f 31 3a 20 57 72 69 74 69 6e  /* TODO1: Writin
1dfb0 67 20 70 67 69 64 78 20 68 65 72 65 21 20 2a 2f  g pgidx here! */
1dfc0 0a 20 20 20 20 20 20 66 74 73 35 50 75 74 55 31  .      fts5PutU1
1dfd0 36 28 26 70 50 67 69 64 78 2d 3e 70 5b 70 50 67  6(&pPgidx->p[pPg
1dfe0 69 64 78 2d 3e 6e 5d 2c 20 70 42 75 66 2d 3e 6e  idx->n], pBuf->n
1dff0 29 3b 0a 20 20 20 20 20 20 70 50 67 69 64 78 2d  );.      pPgidx-
1e000 3e 6e 20 2b 3d 20 32 3b 0a 20 20 20 20 20 20 69  >n += 2;.      i
1e010 66 28 20 77 72 69 74 65 72 2e 62 46 69 72 73 74  f( writer.bFirst
1e020 54 65 72 6d 49 6e 50 61 67 65 3d 3d 30 20 29 7b  TermInPage==0 ){
1e030 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 50 72  .        int nPr
1e040 65 20 3d 20 66 74 73 35 50 72 65 66 69 78 43 6f  e = fts5PrefixCo
1e050 6d 70 72 65 73 73 28 6e 54 65 72 6d 2c 20 7a 50  mpress(nTerm, zP
1e060 72 65 76 2c 20 6e 54 65 72 6d 2c 20 28 63 6f 6e  rev, nTerm, (con
1e070 73 74 20 75 38 2a 29 7a 54 65 72 6d 29 3b 0a 20  st u8*)zTerm);. 
1e080 20 20 20 20 20 20 20 70 42 75 66 2d 3e 6e 20 2b         pBuf->n +
1e090 3d 20 73 71 6c 69 74 65 33 46 74 73 35 50 75 74  = sqlite3Fts5Put
1e0a0 56 61 72 69 6e 74 28 26 70 42 75 66 2d 3e 70 5b  Varint(&pBuf->p[
1e0b0 70 42 75 66 2d 3e 6e 5d 2c 20 6e 50 72 65 29 3b  pBuf->n], nPre);
1e0c0 0a 20 20 20 20 20 20 20 20 6e 53 75 66 66 69 78  .        nSuffix
1e0d0 20 3d 20 6e 54 65 72 6d 20 2d 20 6e 50 72 65 3b   = nTerm - nPre;
1e0e0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
1e0f0 20 20 20 20 20 20 77 72 69 74 65 72 2e 62 46 69        writer.bFi
1e100 72 73 74 54 65 72 6d 49 6e 50 61 67 65 20 3d 20  rstTermInPage = 
1e110 30 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 77  0;.        if( w
1e120 72 69 74 65 72 2e 77 72 69 74 65 72 2e 70 67 6e  riter.writer.pgn
1e130 6f 21 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20  o!=1 ){.        
1e140 20 20 69 6e 74 20 6e 50 72 65 20 3d 20 66 74 73    int nPre = fts
1e150 35 50 72 65 66 69 78 43 6f 6d 70 72 65 73 73 28  5PrefixCompress(
1e160 6e 54 65 72 6d 2c 20 7a 50 72 65 76 2c 20 6e 54  nTerm, zPrev, nT
1e170 65 72 6d 2c 20 28 63 6f 6e 73 74 20 75 38 2a 29  erm, (const u8*)
1e180 7a 54 65 72 6d 29 3b 0a 20 20 20 20 20 20 20 20  zTerm);.        
1e190 20 20 66 74 73 35 57 72 69 74 65 42 74 72 65 65    fts5WriteBtree
1e1a0 54 65 72 6d 28 70 2c 20 26 77 72 69 74 65 72 2c  Term(p, &writer,
1e1b0 20 6e 50 72 65 2b 31 2c 20 28 63 6f 6e 73 74 20   nPre+1, (const 
1e1c0 75 38 2a 29 7a 54 65 72 6d 29 3b 0a 20 20 20 20  u8*)zTerm);.    
1e1d0 20 20 20 20 20 20 70 42 75 66 20 3d 20 26 77 72        pBuf = &wr
1e1e0 69 74 65 72 2e 77 72 69 74 65 72 2e 62 75 66 3b  iter.writer.buf;
1e1f0 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
1e200 74 28 20 6e 50 72 65 3c 6e 54 65 72 6d 20 29 3b  t( nPre<nTerm );
1e210 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1e220 20 20 20 6e 53 75 66 66 69 78 20 3d 20 6e 54 65     nSuffix = nTe
1e230 72 6d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rm;.      }.    
1e240 20 20 70 42 75 66 2d 3e 6e 20 2b 3d 20 73 71 6c    pBuf->n += sql
1e250 69 74 65 33 46 74 73 35 50 75 74 56 61 72 69 6e  ite3Fts5PutVarin
1e260 74 28 26 70 42 75 66 2d 3e 70 5b 70 42 75 66 2d  t(&pBuf->p[pBuf-
1e270 3e 6e 5d 2c 20 6e 53 75 66 66 69 78 29 3b 0a 20  >n], nSuffix);. 
1e280 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72 53       fts5BufferS
1e290 61 66 65 41 70 70 65 6e 64 42 6c 6f 62 28 70 42  afeAppendBlob(pB
1e2a0 75 66 2c 20 28 63 6f 6e 73 74 20 75 38 2a 29 26  uf, (const u8*)&
1e2b0 7a 54 65 72 6d 5b 6e 54 65 72 6d 2d 6e 53 75 66  zTerm[nTerm-nSuf
1e2c0 66 69 78 5d 2c 20 6e 53 75 66 66 69 78 29 3b 0a  fix], nSuffix);.
1e2d0 0a 20 20 20 20 20 20 2f 2a 20 57 65 20 6a 75 73  .      /* We jus
1e2e0 74 20 77 72 6f 74 65 20 61 20 74 65 72 6d 20 69  t wrote a term i
1e2f0 6e 74 6f 20 70 61 67 65 20 77 72 69 74 65 72 2e  nto page writer.
1e300 61 57 72 69 74 65 72 5b 30 5d 2e 70 67 6e 6f 2e  aWriter[0].pgno.
1e310 20 49 66 20 61 20 0a 20 20 20 20 20 20 2a 2a 20   If a .      ** 
1e320 64 6f 63 6c 69 73 74 2d 69 6e 64 65 78 20 69 73  doclist-index is
1e330 20 74 6f 20 62 65 20 67 65 6e 65 72 61 74 65 64   to be generated
1e340 20 66 6f 72 20 74 68 69 73 20 64 6f 63 6c 69 73   for this doclis
1e350 74 2c 20 69 74 20 77 69 6c 6c 20 62 65 0a 20 20  t, it will be.  
1e360 20 20 20 20 2a 2a 20 61 73 73 6f 63 69 61 74 65      ** associate
1e370 64 20 77 69 74 68 20 74 68 69 73 20 70 61 67 65  d with this page
1e380 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72  . */.      asser
1e390 74 28 20 77 72 69 74 65 72 2e 6e 44 6c 69 64 78  t( writer.nDlidx
1e3a0 3e 30 20 26 26 20 77 72 69 74 65 72 2e 61 44 6c  >0 && writer.aDl
1e3b0 69 64 78 5b 30 5d 2e 62 75 66 2e 6e 3d 3d 30 20  idx[0].buf.n==0 
1e3c0 29 3b 0a 20 20 20 20 20 20 77 72 69 74 65 72 2e  );.      writer.
1e3d0 61 44 6c 69 64 78 5b 30 5d 2e 70 67 6e 6f 20 3d  aDlidx[0].pgno =
1e3e0 20 77 72 69 74 65 72 2e 77 72 69 74 65 72 2e 70   writer.writer.p
1e3f0 67 6e 6f 3b 0a 0a 20 20 20 20 20 20 69 66 28 20  gno;..      if( 
1e400 70 67 73 7a 3e 3d 28 70 42 75 66 2d 3e 6e 20 2b  pgsz>=(pBuf->n +
1e410 20 70 50 67 69 64 78 2d 3e 6e 20 2b 20 6e 44 6f   pPgidx->n + nDo
1e420 63 6c 69 73 74 20 2b 20 31 29 20 29 7b 0a 20 20  clist + 1) ){.  
1e430 20 20 20 20 20 20 2f 2a 20 54 68 65 20 65 6e 74        /* The ent
1e440 69 72 65 20 64 6f 63 6c 69 73 74 20 77 69 6c 6c  ire doclist will
1e450 20 66 69 74 20 6f 6e 20 74 68 65 20 63 75 72 72   fit on the curr
1e460 65 6e 74 20 6c 65 61 66 2e 20 2a 2f 0a 20 20 20  ent leaf. */.   
1e470 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72 53       fts5BufferS
1e480 61 66 65 41 70 70 65 6e 64 42 6c 6f 62 28 70 42  afeAppendBlob(pB
1e490 75 66 2c 20 70 44 6f 63 6c 69 73 74 2c 20 6e 44  uf, pDoclist, nD
1e4a0 6f 63 6c 69 73 74 29 3b 0a 20 20 20 20 20 20 7d  oclist);.      }
1e4b0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 36  else{.        i6
1e4c0 34 20 69 52 6f 77 69 64 20 3d 20 30 3b 0a 20 20  4 iRowid = 0;.  
1e4d0 20 20 20 20 20 20 69 36 34 20 69 44 65 6c 74 61        i64 iDelta
1e4e0 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 69 6e   = 0;.        in
1e4f0 74 20 69 4f 66 66 20 3d 20 30 3b 0a 0a 20 20 20  t iOff = 0;..   
1e500 20 20 20 20 20 77 72 69 74 65 72 2e 62 46 69 72       writer.bFir
1e510 73 74 52 6f 77 69 64 49 6e 50 61 67 65 20 3d 20  stRowidInPage = 
1e520 30 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 54  0;..        /* T
1e530 68 65 20 65 6e 74 69 72 65 20 64 6f 63 6c 69 73  he entire doclis
1e540 74 20 77 69 6c 6c 20 6e 6f 74 20 66 69 74 20 6f  t will not fit o
1e550 6e 20 74 68 69 73 20 6c 65 61 66 2e 20 54 68 65  n this leaf. The
1e560 20 66 6f 6c 6c 6f 77 69 6e 67 20 0a 20 20 20 20   following .    
1e570 20 20 20 20 2a 2a 20 6c 6f 6f 70 20 69 74 65 72      ** loop iter
1e580 61 74 65 73 20 74 68 72 6f 75 67 68 20 74 68 65  ates through the
1e590 20 70 6f 73 6c 69 73 74 73 20 74 68 61 74 20 6d   poslists that m
1e5a0 61 6b 65 20 75 70 20 74 68 65 20 63 75 72 72 65  ake up the curre
1e5b0 6e 74 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 64  nt .        ** d
1e5c0 6f 63 6c 69 73 74 2e 20 20 2a 2f 0a 20 20 20 20  oclist.  */.    
1e5d0 20 20 20 20 77 68 69 6c 65 28 20 70 2d 3e 72 63      while( p->rc
1e5e0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69  ==SQLITE_OK && i
1e5f0 4f 66 66 3c 6e 44 6f 63 6c 69 73 74 20 29 7b 0a  Off<nDoclist ){.
1e600 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 6e 50            int nP
1e610 6f 73 3b 0a 20 20 20 20 20 20 20 20 20 20 69 6e  os;.          in
1e620 74 20 6e 43 6f 70 79 3b 0a 20 20 20 20 20 20 20  t nCopy;.       
1e630 20 20 20 69 6e 74 20 62 44 75 6d 6d 79 3b 0a 20     int bDummy;. 
1e640 20 20 20 20 20 20 20 20 20 69 4f 66 66 20 2b 3d           iOff +=
1e650 20 66 74 73 35 47 65 74 56 61 72 69 6e 74 28 26   fts5GetVarint(&
1e660 70 44 6f 63 6c 69 73 74 5b 69 4f 66 66 5d 2c 20  pDoclist[iOff], 
1e670 28 75 36 34 2a 29 26 69 44 65 6c 74 61 29 3b 0a  (u64*)&iDelta);.
1e680 20 20 20 20 20 20 20 20 20 20 6e 43 6f 70 79 20            nCopy 
1e690 3d 20 66 74 73 35 47 65 74 50 6f 73 6c 69 73 74  = fts5GetPoslist
1e6a0 53 69 7a 65 28 26 70 44 6f 63 6c 69 73 74 5b 69  Size(&pDoclist[i
1e6b0 4f 66 66 5d 2c 20 26 6e 50 6f 73 2c 20 26 62 44  Off], &nPos, &bD
1e6c0 75 6d 6d 79 29 3b 0a 20 20 20 20 20 20 20 20 20  ummy);.         
1e6d0 20 6e 43 6f 70 79 20 2b 3d 20 6e 50 6f 73 3b 0a   nCopy += nPos;.
1e6e0 20 20 20 20 20 20 20 20 20 20 69 52 6f 77 69 64            iRowid
1e6f0 20 2b 3d 20 69 44 65 6c 74 61 3b 0a 20 20 20 20   += iDelta;.    
1e700 20 20 20 20 20 20 0a 20 20 20 20 20 20 20 20 20        .         
1e710 20 69 66 28 20 77 72 69 74 65 72 2e 62 46 69 72   if( writer.bFir
1e720 73 74 52 6f 77 69 64 49 6e 50 61 67 65 20 29 7b  stRowidInPage ){
1e730 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 74 73  .            fts
1e740 35 50 75 74 55 31 36 28 26 70 42 75 66 2d 3e 70  5PutU16(&pBuf->p
1e750 5b 30 5d 2c 20 70 42 75 66 2d 3e 6e 29 3b 20 20  [0], pBuf->n);  
1e760 20 2f 2a 20 66 69 72 73 74 20 72 6f 77 69 64 20   /* first rowid 
1e770 6f 6e 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 20  on page */.     
1e780 20 20 20 20 20 20 20 70 42 75 66 2d 3e 6e 20 2b         pBuf->n +
1e790 3d 20 73 71 6c 69 74 65 33 46 74 73 35 50 75 74  = sqlite3Fts5Put
1e7a0 56 61 72 69 6e 74 28 26 70 42 75 66 2d 3e 70 5b  Varint(&pBuf->p[
1e7b0 70 42 75 66 2d 3e 6e 5d 2c 20 69 52 6f 77 69 64  pBuf->n], iRowid
1e7c0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 77  );.            w
1e7d0 72 69 74 65 72 2e 62 46 69 72 73 74 52 6f 77 69  riter.bFirstRowi
1e7e0 64 49 6e 50 61 67 65 20 3d 20 30 3b 0a 20 20 20  dInPage = 0;.   
1e7f0 20 20 20 20 20 20 20 20 20 66 74 73 35 57 72 69           fts5Wri
1e800 74 65 44 6c 69 64 78 41 70 70 65 6e 64 28 70 2c  teDlidxAppend(p,
1e810 20 26 77 72 69 74 65 72 2c 20 69 52 6f 77 69 64   &writer, iRowid
1e820 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c  );.          }el
1e830 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
1e840 70 42 75 66 2d 3e 6e 20 2b 3d 20 73 71 6c 69 74  pBuf->n += sqlit
1e850 65 33 46 74 73 35 50 75 74 56 61 72 69 6e 74 28  e3Fts5PutVarint(
1e860 26 70 42 75 66 2d 3e 70 5b 70 42 75 66 2d 3e 6e  &pBuf->p[pBuf->n
1e870 5d 2c 20 69 44 65 6c 74 61 29 3b 0a 20 20 20 20  ], iDelta);.    
1e880 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1e890 20 20 61 73 73 65 72 74 28 20 70 42 75 66 2d 3e    assert( pBuf->
1e8a0 6e 3c 3d 70 42 75 66 2d 3e 6e 53 70 61 63 65 20  n<=pBuf->nSpace 
1e8b0 29 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 69 66  );..          if
1e8c0 28 20 28 70 42 75 66 2d 3e 6e 20 2b 20 70 50 67  ( (pBuf->n + pPg
1e8d0 69 64 78 2d 3e 6e 20 2b 20 6e 43 6f 70 79 29 20  idx->n + nCopy) 
1e8e0 3c 3d 20 70 67 73 7a 20 29 7b 0a 20 20 20 20 20  <= pgsz ){.     
1e8f0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 65 6e         /* The en
1e900 74 69 72 65 20 70 6f 73 6c 69 73 74 20 77 69 6c  tire poslist wil
1e910 6c 20 66 69 74 20 6f 6e 20 74 68 65 20 63 75 72  l fit on the cur
1e920 72 65 6e 74 20 6c 65 61 66 2e 20 53 6f 20 63 6f  rent leaf. So co
1e930 70 79 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  py.            *
1e940 2a 20 69 74 20 69 6e 20 6f 6e 65 20 67 6f 2e 20  * it in one go. 
1e950 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 66  */.            f
1e960 74 73 35 42 75 66 66 65 72 53 61 66 65 41 70 70  ts5BufferSafeApp
1e970 65 6e 64 42 6c 6f 62 28 70 42 75 66 2c 20 26 70  endBlob(pBuf, &p
1e980 44 6f 63 6c 69 73 74 5b 69 4f 66 66 5d 2c 20 6e  Doclist[iOff], n
1e990 43 6f 70 79 29 3b 0a 20 20 20 20 20 20 20 20 20  Copy);.         
1e9a0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1e9b0 20 20 20 20 2f 2a 20 54 68 65 20 65 6e 74 69 72      /* The entir
1e9c0 65 20 70 6f 73 6c 69 73 74 20 77 69 6c 6c 20 6e  e poslist will n
1e9d0 6f 74 20 66 69 74 20 6f 6e 20 74 68 69 73 20 6c  ot fit on this l
1e9e0 65 61 66 2e 20 53 6f 20 69 74 20 6e 65 65 64 73  eaf. So it needs
1e9f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20  .            ** 
1ea00 74 6f 20 62 65 20 62 72 6f 6b 65 6e 20 69 6e 74  to be broken int
1ea10 6f 20 73 65 63 74 69 6f 6e 73 2e 20 54 68 65 20  o sections. The 
1ea20 6f 6e 6c 79 20 71 75 61 6c 69 66 69 63 61 74 69  only qualificati
1ea30 6f 6e 20 62 65 69 6e 67 0a 20 20 20 20 20 20 20  on being.       
1ea40 20 20 20 20 20 2a 2a 20 74 68 61 74 20 65 61 63       ** that eac
1ea50 68 20 76 61 72 69 6e 74 20 6d 75 73 74 20 62 65  h varint must be
1ea60 20 73 74 6f 72 65 64 20 63 6f 6e 74 69 67 75 6f   stored contiguo
1ea70 75 73 6c 79 2e 20 20 2a 2f 0a 20 20 20 20 20 20  usly.  */.      
1ea80 20 20 20 20 20 20 63 6f 6e 73 74 20 75 38 20 2a        const u8 *
1ea90 70 50 6f 73 6c 69 73 74 20 3d 20 26 70 44 6f 63  pPoslist = &pDoc
1eaa0 6c 69 73 74 5b 69 4f 66 66 5d 3b 0a 20 20 20 20  list[iOff];.    
1eab0 20 20 20 20 20 20 20 20 69 6e 74 20 69 50 6f 73          int iPos
1eac0 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
1ead0 20 20 77 68 69 6c 65 28 20 70 2d 3e 72 63 3d 3d    while( p->rc==
1eae0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1eaf0 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 6e             int n
1eb00 53 70 61 63 65 20 3d 20 70 67 73 7a 20 2d 20 70  Space = pgsz - p
1eb10 42 75 66 2d 3e 6e 20 2d 20 70 50 67 69 64 78 2d  Buf->n - pPgidx-
1eb20 3e 6e 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  >n;.            
1eb30 20 20 69 6e 74 20 6e 20 3d 20 30 3b 0a 20 20 20    int n = 0;.   
1eb40 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 28             if( (
1eb50 6e 43 6f 70 79 20 2d 20 69 50 6f 73 29 3c 3d 6e  nCopy - iPos)<=n
1eb60 53 70 61 63 65 20 29 7b 0a 20 20 20 20 20 20 20  Space ){.       
1eb70 20 20 20 20 20 20 20 20 20 6e 20 3d 20 6e 43 6f           n = nCo
1eb80 70 79 20 2d 20 69 50 6f 73 3b 0a 20 20 20 20 20  py - iPos;.     
1eb90 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
1eba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ebb0 6e 20 3d 20 66 74 73 35 50 6f 73 6c 69 73 74 50  n = fts5PoslistP
1ebc0 72 65 66 69 78 28 26 70 50 6f 73 6c 69 73 74 5b  refix(&pPoslist[
1ebd0 69 50 6f 73 5d 2c 20 6e 53 70 61 63 65 29 3b 0a  iPos], nSpace);.
1ebe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a                }.
1ebf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61 73                as
1ec00 73 65 72 74 28 20 6e 3e 30 20 29 3b 0a 20 20 20  sert( n>0 );.   
1ec10 20 20 20 20 20 20 20 20 20 20 20 66 74 73 35 42             fts5B
1ec20 75 66 66 65 72 53 61 66 65 41 70 70 65 6e 64 42  ufferSafeAppendB
1ec30 6c 6f 62 28 70 42 75 66 2c 20 26 70 50 6f 73 6c  lob(pBuf, &pPosl
1ec40 69 73 74 5b 69 50 6f 73 5d 2c 20 6e 29 3b 0a 20  ist[iPos], n);. 
1ec50 20 20 20 20 20 20 20 20 20 20 20 20 20 69 50 6f               iPo
1ec60 73 20 2b 3d 20 6e 3b 0a 20 20 20 20 20 20 20 20  s += n;.        
1ec70 20 20 20 20 20 20 69 66 28 20 28 70 42 75 66 2d        if( (pBuf-
1ec80 3e 6e 20 2b 20 70 50 67 69 64 78 2d 3e 6e 29 3e  >n + pPgidx->n)>
1ec90 3d 70 67 73 7a 20 29 7b 0a 20 20 20 20 20 20 20  =pgsz ){.       
1eca0 20 20 20 20 20 20 20 20 20 66 74 73 35 57 72 69           fts5Wri
1ecb0 74 65 46 6c 75 73 68 4c 65 61 66 28 70 2c 20 26  teFlushLeaf(p, &
1ecc0 77 72 69 74 65 72 29 3b 0a 20 20 20 20 20 20 20  writer);.       
1ecd0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1ece0 20 20 20 20 20 20 20 69 66 28 20 69 50 6f 73 3e         if( iPos>
1ecf0 3d 6e 43 6f 70 79 20 29 20 62 72 65 61 6b 3b 0a  =nCopy ) break;.
1ed00 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
1ed10 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1ed20 20 20 20 20 69 4f 66 66 20 2b 3d 20 6e 43 6f 70      iOff += nCop
1ed30 79 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  y;.        }.   
1ed40 20 20 20 7d 0a 0a 20 20 20 20 20 20 70 42 75 66     }..      pBuf
1ed50 2d 3e 70 5b 70 42 75 66 2d 3e 6e 2b 2b 5d 20 3d  ->p[pBuf->n++] =
1ed60 20 27 5c 30 27 3b 0a 20 20 20 20 20 20 61 73 73   '\0';.      ass
1ed70 65 72 74 28 20 70 42 75 66 2d 3e 6e 3c 3d 70 42  ert( pBuf->n<=pB
1ed80 75 66 2d 3e 6e 53 70 61 63 65 20 29 3b 0a 20 20  uf->nSpace );.  
1ed90 20 20 20 20 7a 50 72 65 76 20 3d 20 28 63 6f 6e      zPrev = (con
1eda0 73 74 20 75 38 2a 29 7a 54 65 72 6d 3b 0a 20 20  st u8*)zTerm;.  
1edb0 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 48      sqlite3Fts5H
1edc0 61 73 68 53 63 61 6e 4e 65 78 74 28 70 48 61 73  ashScanNext(pHas
1edd0 68 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  h);.    }.    sq
1ede0 6c 69 74 65 33 46 74 73 35 48 61 73 68 43 6c 65  lite3Fts5HashCle
1edf0 61 72 28 70 48 61 73 68 29 3b 0a 20 20 20 20 66  ar(pHash);.    f
1ee00 74 73 35 57 72 69 74 65 46 69 6e 69 73 68 28 70  ts5WriteFinish(p
1ee10 2c 20 26 77 72 69 74 65 72 2c 20 26 6e 48 65 69  , &writer, &nHei
1ee20 67 68 74 2c 20 26 70 67 6e 6f 4c 61 73 74 29 3b  ght, &pgnoLast);
1ee30 0a 0a 20 20 20 20 2f 2a 20 55 70 64 61 74 65 20  ..    /* Update 
1ee40 74 68 65 20 46 74 73 35 53 74 72 75 63 74 75 72  the Fts5Structur
1ee50 65 2e 20 49 74 20 69 73 20 77 72 69 74 74 65 6e  e. It is written
1ee60 20 62 61 63 6b 20 74 6f 20 74 68 65 20 64 61 74   back to the dat
1ee70 61 62 61 73 65 20 62 79 20 74 68 65 0a 20 20 20  abase by the.   
1ee80 20 2a 2a 20 66 74 73 35 53 74 72 75 63 74 75 72   ** fts5Structur
1ee90 65 52 65 6c 65 61 73 65 28 29 20 63 61 6c 6c 20  eRelease() call 
1eea0 62 65 6c 6f 77 2e 20 20 2a 2f 0a 20 20 20 20 69  below.  */.    i
1eeb0 66 28 20 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76  f( pStruct->nLev
1eec0 65 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 66  el==0 ){.      f
1eed0 74 73 35 53 74 72 75 63 74 75 72 65 41 64 64 4c  ts5StructureAddL
1eee0 65 76 65 6c 28 26 70 2d 3e 72 63 2c 20 26 70 53  evel(&p->rc, &pS
1eef0 74 72 75 63 74 29 3b 0a 20 20 20 20 7d 0a 20 20  truct);.    }.  
1ef00 20 20 66 74 73 35 53 74 72 75 63 74 75 72 65 45    fts5StructureE
1ef10 78 74 65 6e 64 4c 65 76 65 6c 28 26 70 2d 3e 72  xtendLevel(&p->r
1ef20 63 2c 20 70 53 74 72 75 63 74 2c 20 30 2c 20 31  c, pStruct, 0, 1
1ef30 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 70 2d  , 0);.    if( p-
1ef40 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  >rc==SQLITE_OK )
1ef50 7b 0a 20 20 20 20 20 20 70 53 65 67 20 3d 20 26  {.      pSeg = &
1ef60 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b  pStruct->aLevel[
1ef70 30 5d 2e 61 53 65 67 5b 20 70 53 74 72 75 63 74  0].aSeg[ pStruct
1ef80 2d 3e 61 4c 65 76 65 6c 5b 30 5d 2e 6e 53 65 67  ->aLevel[0].nSeg
1ef90 2b 2b 20 5d 3b 0a 20 20 20 20 20 20 70 53 65 67  ++ ];.      pSeg
1efa0 2d 3e 69 53 65 67 69 64 20 3d 20 69 53 65 67 69  ->iSegid = iSegi
1efb0 64 3b 0a 20 20 20 20 20 20 70 53 65 67 2d 3e 6e  d;.      pSeg->n
1efc0 48 65 69 67 68 74 20 3d 20 6e 48 65 69 67 68 74  Height = nHeight
1efd0 3b 0a 20 20 20 20 20 20 70 53 65 67 2d 3e 70 67  ;.      pSeg->pg
1efe0 6e 6f 46 69 72 73 74 20 3d 20 31 3b 0a 20 20 20  noFirst = 1;.   
1eff0 20 20 20 70 53 65 67 2d 3e 70 67 6e 6f 4c 61 73     pSeg->pgnoLas
1f000 74 20 3d 20 70 67 6e 6f 4c 61 73 74 3b 0a 20 20  t = pgnoLast;.  
1f010 20 20 20 20 70 53 74 72 75 63 74 2d 3e 6e 53 65      pStruct->nSe
1f020 67 6d 65 6e 74 2b 2b 3b 0a 20 20 20 20 7d 0a 20  gment++;.    }. 
1f030 20 20 20 66 74 73 35 53 74 72 75 63 74 75 72 65     fts5Structure
1f040 50 72 6f 6d 6f 74 65 28 70 2c 20 30 2c 20 70 53  Promote(p, 0, pS
1f050 74 72 75 63 74 29 3b 0a 20 20 7d 0a 0a 20 20 66  truct);.  }..  f
1f060 74 73 35 49 6e 64 65 78 41 75 74 6f 6d 65 72 67  ts5IndexAutomerg
1f070 65 28 70 2c 20 26 70 53 74 72 75 63 74 2c 20 70  e(p, &pStruct, p
1f080 67 6e 6f 4c 61 73 74 29 3b 0a 20 20 66 74 73 35  gnoLast);.  fts5
1f090 49 6e 64 65 78 43 72 69 73 69 73 6d 65 72 67 65  IndexCrisismerge
1f0a0 28 70 2c 20 26 70 53 74 72 75 63 74 29 3b 0a 20  (p, &pStruct);. 
1f0b0 20 66 74 73 35 53 74 72 75 63 74 75 72 65 57 72   fts5StructureWr
1f0c0 69 74 65 28 70 2c 20 70 53 74 72 75 63 74 29 3b  ite(p, pStruct);
1f0d0 0a 20 20 66 74 73 35 53 74 72 75 63 74 75 72 65  .  fts5Structure
1f0e0 52 65 6c 65 61 73 65 28 70 53 74 72 75 63 74 29  Release(pStruct)
1f0f0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 6c 75 73 68  ;.}../*.** Flush
1f100 20 61 6e 79 20 64 61 74 61 20 73 74 6f 72 65 64   any data stored
1f110 20 69 6e 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72   in the in-memor
1f120 79 20 68 61 73 68 20 74 61 62 6c 65 73 20 74 6f  y hash tables to
1f130 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a   the database..*
1f140 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  /.static void ft
1f150 73 35 49 6e 64 65 78 46 6c 75 73 68 28 46 74 73  s5IndexFlush(Fts
1f160 35 49 6e 64 65 78 20 2a 70 29 7b 0a 20 20 2f 2a  5Index *p){.  /*
1f170 20 55 6e 6c 65 73 73 20 69 74 20 69 73 20 65 6d   Unless it is em
1f180 70 74 79 2c 20 66 6c 75 73 68 20 74 68 65 20 68  pty, flush the h
1f190 61 73 68 20 74 61 62 6c 65 20 74 6f 20 64 69 73  ash table to dis
1f1a0 6b 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 6e 50  k */.  if( p->nP
1f1b0 65 6e 64 69 6e 67 44 61 74 61 20 29 7b 0a 20 20  endingData ){.  
1f1c0 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 48 61    assert( p->pHa
1f1d0 73 68 20 29 3b 0a 20 20 20 20 70 2d 3e 6e 50 65  sh );.    p->nPe
1f1e0 6e 64 69 6e 67 44 61 74 61 20 3d 20 30 3b 0a 20  ndingData = 0;. 
1f1f0 20 20 20 66 74 73 35 46 6c 75 73 68 4f 6e 65 48     fts5FlushOneH
1f200 61 73 68 28 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a  ash(p);.  }.}...
1f210 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 49  int sqlite3Fts5I
1f220 6e 64 65 78 4f 70 74 69 6d 69 7a 65 28 46 74 73  ndexOptimize(Fts
1f230 35 49 6e 64 65 78 20 2a 70 29 7b 0a 20 20 46 74  5Index *p){.  Ft
1f240 73 35 53 74 72 75 63 74 75 72 65 20 2a 70 53 74  s5Structure *pSt
1f250 72 75 63 74 3b 0a 20 20 46 74 73 35 53 74 72 75  ruct;.  Fts5Stru
1f260 63 74 75 72 65 20 2a 70 4e 65 77 20 3d 20 30 3b  cture *pNew = 0;
1f270 0a 20 20 69 6e 74 20 6e 53 65 67 20 3d 20 30 3b  .  int nSeg = 0;
1f280 0a 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72  ..  assert( p->r
1f290 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  c==SQLITE_OK );.
1f2a0 20 20 66 74 73 35 49 6e 64 65 78 46 6c 75 73 68    fts5IndexFlush
1f2b0 28 70 29 3b 0a 20 20 70 53 74 72 75 63 74 20 3d  (p);.  pStruct =
1f2c0 20 66 74 73 35 53 74 72 75 63 74 75 72 65 52 65   fts5StructureRe
1f2d0 61 64 28 70 29 3b 0a 0a 20 20 69 66 28 20 70 53  ad(p);..  if( pS
1f2e0 74 72 75 63 74 20 29 7b 0a 20 20 20 20 61 73 73  truct ){.    ass
1f2f0 65 72 74 28 20 70 53 74 72 75 63 74 2d 3e 6e 53  ert( pStruct->nS
1f300 65 67 6d 65 6e 74 3d 3d 66 74 73 35 53 74 72 75  egment==fts5Stru
1f310 63 74 75 72 65 43 6f 75 6e 74 53 65 67 6d 65 6e  ctureCountSegmen
1f320 74 73 28 70 53 74 72 75 63 74 29 20 29 3b 0a 20  ts(pStruct) );. 
1f330 20 20 20 6e 53 65 67 20 3d 20 70 53 74 72 75 63     nSeg = pStruc
1f340 74 2d 3e 6e 53 65 67 6d 65 6e 74 3b 0a 20 20 20  t->nSegment;.   
1f350 20 69 66 28 20 6e 53 65 67 3e 31 20 29 7b 0a 20   if( nSeg>1 ){. 
1f360 20 20 20 20 20 69 6e 74 20 6e 42 79 74 65 20 3d       int nByte =
1f370 20 73 69 7a 65 6f 66 28 46 74 73 35 53 74 72 75   sizeof(Fts5Stru
1f380 63 74 75 72 65 29 3b 0a 20 20 20 20 20 20 6e 42  cture);.      nB
1f390 79 74 65 20 2b 3d 20 28 70 53 74 72 75 63 74 2d  yte += (pStruct-
1f3a0 3e 6e 4c 65 76 65 6c 2b 31 29 20 2a 20 73 69 7a  >nLevel+1) * siz
1f3b0 65 6f 66 28 46 74 73 35 53 74 72 75 63 74 75 72  eof(Fts5Structur
1f3c0 65 4c 65 76 65 6c 29 3b 0a 20 20 20 20 20 20 70  eLevel);.      p
1f3d0 4e 65 77 20 3d 20 28 46 74 73 35 53 74 72 75 63  New = (Fts5Struc
1f3e0 74 75 72 65 2a 29 73 71 6c 69 74 65 33 46 74 73  ture*)sqlite3Fts
1f3f0 35 4d 61 6c 6c 6f 63 5a 65 72 6f 28 26 70 2d 3e  5MallocZero(&p->
1f400 72 63 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20 20  rc, nByte);.    
1f410 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 4e 65 77  }.  }.  if( pNew
1f420 20 29 7b 0a 20 20 20 20 46 74 73 35 53 74 72 75   ){.    Fts5Stru
1f430 63 74 75 72 65 4c 65 76 65 6c 20 2a 70 4c 76 6c  ctureLevel *pLvl
1f440 3b 0a 20 20 20 20 69 6e 74 20 6e 42 79 74 65 20  ;.    int nByte 
1f450 3d 20 6e 53 65 67 20 2a 20 73 69 7a 65 6f 66 28  = nSeg * sizeof(
1f460 46 74 73 35 53 74 72 75 63 74 75 72 65 53 65 67  Fts5StructureSeg
1f470 6d 65 6e 74 29 3b 0a 20 20 20 20 70 4e 65 77 2d  ment);.    pNew-
1f480 3e 6e 4c 65 76 65 6c 20 3d 20 70 53 74 72 75 63  >nLevel = pStruc
1f490 74 2d 3e 6e 4c 65 76 65 6c 2b 31 3b 0a 20 20 20  t->nLevel+1;.   
1f4a0 20 70 4e 65 77 2d 3e 6e 52 65 66 20 3d 20 31 3b   pNew->nRef = 1;
1f4b0 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 57 72 69 74  .    pNew->nWrit
1f4c0 65 43 6f 75 6e 74 65 72 20 3d 20 70 53 74 72 75  eCounter = pStru
1f4d0 63 74 2d 3e 6e 57 72 69 74 65 43 6f 75 6e 74 65  ct->nWriteCounte
1f4e0 72 3b 0a 20 20 20 20 70 4c 76 6c 20 3d 20 26 70  r;.    pLvl = &p
1f4f0 4e 65 77 2d 3e 61 4c 65 76 65 6c 5b 70 53 74 72  New->aLevel[pStr
1f500 75 63 74 2d 3e 6e 4c 65 76 65 6c 5d 3b 0a 20 20  uct->nLevel];.  
1f510 20 20 70 4c 76 6c 2d 3e 61 53 65 67 20 3d 20 28    pLvl->aSeg = (
1f520 46 74 73 35 53 74 72 75 63 74 75 72 65 53 65 67  Fts5StructureSeg
1f530 6d 65 6e 74 2a 29 73 71 6c 69 74 65 33 46 74 73  ment*)sqlite3Fts
1f540 35 4d 61 6c 6c 6f 63 5a 65 72 6f 28 26 70 2d 3e  5MallocZero(&p->
1f550 72 63 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20 20  rc, nByte);.    
1f560 69 66 28 20 70 4c 76 6c 2d 3e 61 53 65 67 20 29  if( pLvl->aSeg )
1f570 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 4c 76 6c  {.      int iLvl
1f580 2c 20 69 53 65 67 3b 0a 20 20 20 20 20 20 69 6e  , iSeg;.      in
1f590 74 20 69 53 65 67 4f 75 74 20 3d 20 30 3b 0a 20  t iSegOut = 0;. 
1f5a0 20 20 20 20 20 66 6f 72 28 69 4c 76 6c 3d 30 3b       for(iLvl=0;
1f5b0 20 69 4c 76 6c 3c 70 53 74 72 75 63 74 2d 3e 6e   iLvl<pStruct->n
1f5c0 4c 65 76 65 6c 3b 20 69 4c 76 6c 2b 2b 29 7b 0a  Level; iLvl++){.
1f5d0 20 20 20 20 20 20 20 20 66 6f 72 28 69 53 65 67          for(iSeg
1f5e0 3d 30 3b 20 69 53 65 67 3c 70 53 74 72 75 63 74  =0; iSeg<pStruct
1f5f0 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d 2e 6e  ->aLevel[iLvl].n
1f600 53 65 67 3b 20 69 53 65 67 2b 2b 29 7b 0a 20 20  Seg; iSeg++){.  
1f610 20 20 20 20 20 20 20 20 70 4c 76 6c 2d 3e 61 53          pLvl->aS
1f620 65 67 5b 69 53 65 67 4f 75 74 5d 20 3d 20 70 53  eg[iSegOut] = pS
1f630 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c  truct->aLevel[iL
1f640 76 6c 5d 2e 61 53 65 67 5b 69 53 65 67 5d 3b 0a  vl].aSeg[iSeg];.
1f650 20 20 20 20 20 20 20 20 20 20 69 53 65 67 4f 75            iSegOu
1f660 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  t++;.        }. 
1f670 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 4e 65       }.      pNe
1f680 77 2d 3e 6e 53 65 67 6d 65 6e 74 20 3d 20 70 4c  w->nSegment = pL
1f690 76 6c 2d 3e 6e 53 65 67 20 3d 20 6e 53 65 67 3b  vl->nSeg = nSeg;
1f6a0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1f6b0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
1f6c0 4e 65 77 29 3b 0a 20 20 20 20 20 20 70 4e 65 77  New);.      pNew
1f6d0 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   = 0;.    }.  }.
1f6e0 0a 20 20 69 66 28 20 70 4e 65 77 20 29 7b 0a 20  .  if( pNew ){. 
1f6f0 20 20 20 69 6e 74 20 69 4c 76 6c 20 3d 20 70 4e     int iLvl = pN
1f700 65 77 2d 3e 6e 4c 65 76 65 6c 2d 31 3b 0a 20 20  ew->nLevel-1;.  
1f710 20 20 77 68 69 6c 65 28 20 70 2d 3e 72 63 3d 3d    while( p->rc==
1f720 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 4e 65  SQLITE_OK && pNe
1f730 77 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d 2e  w->aLevel[iLvl].
1f740 6e 53 65 67 3e 30 20 29 7b 0a 20 20 20 20 20 20  nSeg>0 ){.      
1f750 69 6e 74 20 6e 52 65 6d 20 3d 20 46 54 53 35 5f  int nRem = FTS5_
1f760 4f 50 54 5f 57 4f 52 4b 5f 55 4e 49 54 3b 0a 20  OPT_WORK_UNIT;. 
1f770 20 20 20 20 20 66 74 73 35 49 6e 64 65 78 4d 65       fts5IndexMe
1f780 72 67 65 4c 65 76 65 6c 28 70 2c 20 26 70 4e 65  rgeLevel(p, &pNe
1f790 77 2c 20 69 4c 76 6c 2c 20 26 6e 52 65 6d 29 3b  w, iLvl, &nRem);
1f7a0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 66 74 73 35  .    }..    fts5
1f7b0 53 74 72 75 63 74 75 72 65 57 72 69 74 65 28 70  StructureWrite(p
1f7c0 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20 66 74 73  , pNew);.    fts
1f7d0 35 53 74 72 75 63 74 75 72 65 52 65 6c 65 61 73  5StructureReleas
1f7e0 65 28 70 4e 65 77 29 3b 0a 20 20 7d 0a 0a 20 20  e(pNew);.  }..  
1f7f0 66 74 73 35 53 74 72 75 63 74 75 72 65 52 65 6c  fts5StructureRel
1f800 65 61 73 65 28 70 53 74 72 75 63 74 29 3b 0a 20  ease(pStruct);. 
1f810 20 72 65 74 75 72 6e 20 66 74 73 35 49 6e 64 65   return fts5Inde
1f820 78 52 65 74 75 72 6e 28 70 29 3b 20 0a 7d 0a 0a  xReturn(p); .}..
1f830 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 49  int sqlite3Fts5I
1f840 6e 64 65 78 4d 65 72 67 65 28 46 74 73 35 49 6e  ndexMerge(Fts5In
1f850 64 65 78 20 2a 70 2c 20 69 6e 74 20 6e 4d 65 72  dex *p, int nMer
1f860 67 65 29 7b 0a 20 20 46 74 73 35 53 74 72 75 63  ge){.  Fts5Struc
1f870 74 75 72 65 20 2a 70 53 74 72 75 63 74 3b 0a 0a  ture *pStruct;..
1f880 20 20 70 53 74 72 75 63 74 20 3d 20 66 74 73 35    pStruct = fts5
1f890 53 74 72 75 63 74 75 72 65 52 65 61 64 28 70 29  StructureRead(p)
1f8a0 3b 0a 20 20 69 66 28 20 70 53 74 72 75 63 74 20  ;.  if( pStruct 
1f8b0 26 26 20 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76  && pStruct->nLev
1f8c0 65 6c 20 29 7b 0a 20 20 20 20 66 74 73 35 49 6e  el ){.    fts5In
1f8d0 64 65 78 4d 65 72 67 65 28 70 2c 20 26 70 53 74  dexMerge(p, &pSt
1f8e0 72 75 63 74 2c 20 6e 4d 65 72 67 65 29 3b 0a 20  ruct, nMerge);. 
1f8f0 20 20 20 66 74 73 35 53 74 72 75 63 74 75 72 65     fts5Structure
1f900 57 72 69 74 65 28 70 2c 20 70 53 74 72 75 63 74  Write(p, pStruct
1f910 29 3b 0a 20 20 7d 0a 20 20 66 74 73 35 53 74 72  );.  }.  fts5Str
1f920 75 63 74 75 72 65 52 65 6c 65 61 73 65 28 70 53  uctureRelease(pS
1f930 74 72 75 63 74 29 3b 0a 0a 20 20 72 65 74 75 72  truct);..  retur
1f940 6e 20 66 74 73 35 49 6e 64 65 78 52 65 74 75 72  n fts5IndexRetur
1f950 6e 28 70 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20  n(p);.}..static 
1f960 76 6f 69 64 20 66 74 73 35 50 6f 73 6c 69 73 74  void fts5Poslist
1f970 43 61 6c 6c 62 61 63 6b 28 0a 20 20 46 74 73 35  Callback(.  Fts5
1f980 49 6e 64 65 78 20 2a 70 2c 20 0a 20 20 76 6f 69  Index *p, .  voi
1f990 64 20 2a 70 43 74 78 2c 20 0a 20 20 63 6f 6e 73  d *pCtx, .  cons
1f9a0 74 20 75 38 20 2a 70 43 68 75 6e 6b 2c 20 69 6e  t u8 *pChunk, in
1f9b0 74 20 6e 43 68 75 6e 6b 0a 29 7b 0a 20 20 66 74  t nChunk.){.  ft
1f9c0 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 42 6c  s5BufferAppendBl
1f9d0 6f 62 28 26 70 2d 3e 72 63 2c 20 28 46 74 73 35  ob(&p->rc, (Fts5
1f9e0 42 75 66 66 65 72 2a 29 70 43 74 78 2c 20 6e 43  Buffer*)pCtx, nC
1f9f0 68 75 6e 6b 2c 20 70 43 68 75 6e 6b 29 3b 0a 7d  hunk, pChunk);.}
1fa00 0a 0a 2f 2a 0a 2a 2a 20 49 74 65 72 61 74 6f 72  ../*.** Iterator
1fa10 20 70 49 74 65 72 20 63 75 72 72 65 6e 74 6c 79   pIter currently
1fa20 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 76 61 6c   points to a val
1fa30 69 64 20 65 6e 74 72 79 20 28 6e 6f 74 20 45 4f  id entry (not EO
1fa40 46 29 2e 20 54 68 69 73 0a 2a 2a 20 66 75 6e 63  F). This.** func
1fa50 74 69 6f 6e 20 61 70 70 65 6e 64 73 20 74 68 65  tion appends the
1fa60 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74 20 64   position list d
1fa70 61 74 61 20 66 6f 72 20 74 68 65 20 63 75 72 72  ata for the curr
1fa80 65 6e 74 20 65 6e 74 72 79 20 74 6f 0a 2a 2a 20  ent entry to.** 
1fa90 62 75 66 66 65 72 20 70 42 75 66 2e 20 49 74 20  buffer pBuf. It 
1faa0 64 6f 65 73 20 6e 6f 74 20 6d 61 6b 65 20 61 20  does not make a 
1fab0 63 6f 70 79 20 6f 66 20 74 68 65 20 70 6f 73 69  copy of the posi
1fac0 74 69 6f 6e 2d 6c 69 73 74 20 73 69 7a 65 0a 2a  tion-list size.*
1fad0 2a 20 66 69 65 6c 64 2e 0a 2a 2f 0a 73 74 61 74  * field..*/.stat
1fae0 69 63 20 76 6f 69 64 20 66 74 73 35 53 65 67 69  ic void fts5Segi
1faf0 74 65 72 50 6f 73 6c 69 73 74 28 0a 20 20 46 74  terPoslist(.  Ft
1fb00 73 35 49 6e 64 65 78 20 2a 70 2c 0a 20 20 46 74  s5Index *p,.  Ft
1fb10 73 35 53 65 67 49 74 65 72 20 2a 70 53 65 67 2c  s5SegIter *pSeg,
1fb20 0a 20 20 46 74 73 35 42 75 66 66 65 72 20 2a 70  .  Fts5Buffer *p
1fb30 42 75 66 0a 29 7b 0a 20 20 66 74 73 35 43 68 75  Buf.){.  fts5Chu
1fb40 6e 6b 49 74 65 72 61 74 65 28 70 2c 20 70 53 65  nkIterate(p, pSe
1fb50 67 2c 20 28 76 6f 69 64 2a 29 70 42 75 66 2c 20  g, (void*)pBuf, 
1fb60 66 74 73 35 50 6f 73 6c 69 73 74 43 61 6c 6c 62  fts5PoslistCallb
1fb70 61 63 6b 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  ack);.}../*.** I
1fb80 74 65 72 61 74 6f 72 20 70 4d 75 6c 74 69 20 63  terator pMulti c
1fb90 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 73 20  urrently points 
1fba0 74 6f 20 61 20 76 61 6c 69 64 20 65 6e 74 72 79  to a valid entry
1fbb0 20 28 6e 6f 74 20 45 4f 46 29 2e 20 54 68 69 73   (not EOF). This
1fbc0 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 61 70 70  .** function app
1fbd0 65 6e 64 73 20 61 20 63 6f 70 79 20 6f 66 20 74  ends a copy of t
1fbe0 68 65 20 70 6f 73 69 74 69 6f 6e 2d 6c 69 73 74  he position-list
1fbf0 20 6f 66 20 74 68 65 20 65 6e 74 72 79 20 70 4d   of the entry pM
1fc00 75 6c 74 69 20 0a 2a 2a 20 63 75 72 72 65 6e 74  ulti .** current
1fc10 6c 79 20 70 6f 69 6e 74 73 20 74 6f 20 74 6f 20  ly points to to 
1fc20 62 75 66 66 65 72 20 70 42 75 66 2e 0a 2a 2a 0a  buffer pBuf..**.
1fc30 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  ** If an error o
1fc40 63 63 75 72 73 2c 20 61 6e 20 65 72 72 6f 72 20  ccurs, an error 
1fc50 63 6f 64 65 20 69 73 20 6c 65 66 74 20 69 6e 20  code is left in 
1fc60 70 2d 3e 72 63 2e 20 49 74 20 69 73 20 61 73 73  p->rc. It is ass
1fc70 75 6d 65 64 0a 2a 2a 20 6e 6f 20 65 72 72 6f 72  umed.** no error
1fc80 20 68 61 73 20 61 6c 72 65 61 64 79 20 6f 63 63   has already occ
1fc90 75 72 72 65 64 20 77 68 65 6e 20 74 68 69 73 20  urred when this 
1fca0 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
1fcb0 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ed..*/.static vo
1fcc0 69 64 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72  id fts5MultiIter
1fcd0 50 6f 73 6c 69 73 74 28 0a 20 20 46 74 73 35 49  Poslist(.  Fts5I
1fce0 6e 64 65 78 20 2a 70 2c 0a 20 20 46 74 73 35 49  ndex *p,.  Fts5I
1fcf0 6e 64 65 78 49 74 65 72 20 2a 70 4d 75 6c 74 69  ndexIter *pMulti
1fd00 2c 0a 20 20 69 6e 74 20 62 53 7a 2c 20 20 20 20  ,.  int bSz,    
1fd10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fd20 20 20 20 20 2f 2a 20 41 70 70 65 6e 64 20 61 20      /* Append a 
1fd30 73 69 7a 65 20 66 69 65 6c 64 20 62 65 66 6f 72  size field befor
1fd40 65 20 74 68 65 20 64 61 74 61 20 2a 2f 0a 20 20  e the data */.  
1fd50 46 74 73 35 42 75 66 66 65 72 20 2a 70 42 75 66  Fts5Buffer *pBuf
1fd60 0a 29 7b 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d  .){.  if( p->rc=
1fd70 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1fd80 20 20 46 74 73 35 53 65 67 49 74 65 72 20 2a 70    Fts5SegIter *p
1fd90 53 65 67 20 3d 20 26 70 4d 75 6c 74 69 2d 3e 61  Seg = &pMulti->a
1fda0 53 65 67 5b 20 70 4d 75 6c 74 69 2d 3e 61 46 69  Seg[ pMulti->aFi
1fdb0 72 73 74 5b 31 5d 2e 69 46 69 72 73 74 20 5d 3b  rst[1].iFirst ];
1fdc0 0a 20 20 20 20 61 73 73 65 72 74 28 20 66 74 73  .    assert( fts
1fdd0 35 4d 75 6c 74 69 49 74 65 72 45 6f 66 28 70 2c  5MultiIterEof(p,
1fde0 20 70 4d 75 6c 74 69 29 3d 3d 30 20 29 3b 0a 0a   pMulti)==0 );..
1fdf0 20 20 20 20 69 66 28 20 62 53 7a 20 29 7b 0a 20      if( bSz ){. 
1fe00 20 20 20 20 20 2f 2a 20 57 52 49 54 45 50 4f 53       /* WRITEPOS
1fe10 4c 49 53 54 53 49 5a 45 20 2a 2f 0a 20 20 20 20  LISTSIZE */.    
1fe20 20 20 66 74 73 35 42 75 66 66 65 72 41 70 70 65    fts5BufferAppe
1fe30 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c  ndVarint(&p->rc,
1fe40 20 70 42 75 66 2c 20 70 53 65 67 2d 3e 6e 50 6f   pBuf, pSeg->nPo
1fe50 73 2a 32 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  s*2);.    }.    
1fe60 66 74 73 35 53 65 67 69 74 65 72 50 6f 73 6c 69  fts5SegiterPosli
1fe70 73 74 28 70 2c 20 70 53 65 67 2c 20 70 42 75 66  st(p, pSeg, pBuf
1fe80 29 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63  );.  }.}..static
1fe90 20 76 6f 69 64 20 66 74 73 35 44 6f 63 6c 69 73   void fts5Doclis
1fea0 74 49 74 65 72 4e 65 78 74 28 46 74 73 35 44 6f  tIterNext(Fts5Do
1feb0 63 6c 69 73 74 49 74 65 72 20 2a 70 49 74 65 72  clistIter *pIter
1fec0 29 7b 0a 20 20 69 66 28 20 70 49 74 65 72 2d 3e  ){.  if( pIter->
1fed0 69 3c 70 49 74 65 72 2d 3e 6e 20 29 7b 0a 20 20  i<pIter->n ){.  
1fee0 20 20 69 6e 74 20 62 44 75 6d 6d 79 3b 0a 20 20    int bDummy;.  
1fef0 20 20 69 66 28 20 70 49 74 65 72 2d 3e 69 20 29    if( pIter->i )
1ff00 7b 0a 20 20 20 20 20 20 69 36 34 20 69 44 65 6c  {.      i64 iDel
1ff10 74 61 3b 0a 20 20 20 20 20 20 70 49 74 65 72 2d  ta;.      pIter-
1ff20 3e 69 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72  >i += fts5GetVar
1ff30 69 6e 74 28 26 70 49 74 65 72 2d 3e 61 5b 70 49  int(&pIter->a[pI
1ff40 74 65 72 2d 3e 69 5d 2c 20 28 75 36 34 2a 29 26  ter->i], (u64*)&
1ff50 69 44 65 6c 74 61 29 3b 0a 20 20 20 20 20 20 70  iDelta);.      p
1ff60 49 74 65 72 2d 3e 69 52 6f 77 69 64 20 2b 3d 20  Iter->iRowid += 
1ff70 69 44 65 6c 74 61 3b 0a 20 20 20 20 7d 65 6c 73  iDelta;.    }els
1ff80 65 7b 0a 20 20 20 20 20 20 70 49 74 65 72 2d 3e  e{.      pIter->
1ff90 69 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69  i += fts5GetVari
1ffa0 6e 74 28 26 70 49 74 65 72 2d 3e 61 5b 70 49 74  nt(&pIter->a[pIt
1ffb0 65 72 2d 3e 69 5d 2c 20 28 75 36 34 2a 29 26 70  er->i], (u64*)&p
1ffc0 49 74 65 72 2d 3e 69 52 6f 77 69 64 29 3b 0a 20  Iter->iRowid);. 
1ffd0 20 20 20 7d 0a 20 20 20 20 70 49 74 65 72 2d 3e     }.    pIter->
1ffe0 69 20 2b 3d 20 66 74 73 35 47 65 74 50 6f 73 6c  i += fts5GetPosl
1fff0 69 73 74 53 69 7a 65 28 0a 20 20 20 20 20 20 20  istSize(.       
20000 20 26 70 49 74 65 72 2d 3e 61 5b 70 49 74 65 72   &pIter->a[pIter
20010 2d 3e 69 5d 2c 20 26 70 49 74 65 72 2d 3e 6e 50  ->i], &pIter->nP
20020 6f 73 6c 69 73 74 2c 20 26 62 44 75 6d 6d 79 0a  oslist, &bDummy.
20030 20 20 20 20 29 3b 0a 20 20 20 20 70 49 74 65 72      );.    pIter
20040 2d 3e 61 50 6f 73 6c 69 73 74 20 3d 20 26 70 49  ->aPoslist = &pI
20050 74 65 72 2d 3e 61 5b 70 49 74 65 72 2d 3e 69 5d  ter->a[pIter->i]
20060 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 69 20 2b  ;.    pIter->i +
20070 3d 20 70 49 74 65 72 2d 3e 6e 50 6f 73 6c 69 73  = pIter->nPoslis
20080 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  t;.  }else{.    
20090 70 49 74 65 72 2d 3e 61 50 6f 73 6c 69 73 74 20  pIter->aPoslist 
200a0 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74  = 0;.  }.}..stat
200b0 69 63 20 76 6f 69 64 20 66 74 73 35 44 6f 63 6c  ic void fts5Docl
200c0 69 73 74 49 74 65 72 49 6e 69 74 28 0a 20 20 46  istIterInit(.  F
200d0 74 73 35 42 75 66 66 65 72 20 2a 70 42 75 66 2c  ts5Buffer *pBuf,
200e0 20 0a 20 20 46 74 73 35 44 6f 63 6c 69 73 74 49   .  Fts5DoclistI
200f0 74 65 72 20 2a 70 49 74 65 72 0a 29 7b 0a 20 20  ter *pIter.){.  
20100 6d 65 6d 73 65 74 28 70 49 74 65 72 2c 20 30 2c  memset(pIter, 0,
20110 20 73 69 7a 65 6f 66 28 2a 70 49 74 65 72 29 29   sizeof(*pIter))
20120 3b 0a 20 20 70 49 74 65 72 2d 3e 61 20 3d 20 70  ;.  pIter->a = p
20130 42 75 66 2d 3e 70 3b 0a 20 20 70 49 74 65 72 2d  Buf->p;.  pIter-
20140 3e 6e 20 3d 20 70 42 75 66 2d 3e 6e 3b 0a 20 20  >n = pBuf->n;.  
20150 66 74 73 35 44 6f 63 6c 69 73 74 49 74 65 72 4e  fts5DoclistIterN
20160 65 78 74 28 70 49 74 65 72 29 3b 0a 7d 0a 0a 2f  ext(pIter);.}../
20170 2a 0a 2a 2a 20 41 70 70 65 6e 64 20 61 20 64 6f  *.** Append a do
20180 63 6c 69 73 74 20 74 6f 20 62 75 66 66 65 72 20  clist to buffer 
20190 70 42 75 66 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  pBuf..*/.static 
201a0 76 6f 69 64 20 66 74 73 35 4d 65 72 67 65 41 70  void fts5MergeAp
201b0 70 65 6e 64 44 6f 63 69 64 28 0a 20 20 69 6e 74  pendDocid(.  int
201c0 20 2a 70 52 63 2c 20 20 20 20 20 20 20 20 20 20   *pRc,          
201d0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
201e0 49 4e 2f 4f 55 54 3a 20 45 72 72 6f 72 20 63 6f  IN/OUT: Error co
201f0 64 65 20 2a 2f 0a 20 20 46 74 73 35 42 75 66 66  de */.  Fts5Buff
20200 65 72 20 2a 70 42 75 66 2c 20 20 20 20 20 20 20  er *pBuf,       
20210 20 20 20 20 20 20 20 20 2f 2a 20 42 75 66 66 65          /* Buffe
20220 72 20 74 6f 20 77 72 69 74 65 20 74 6f 20 2a 2f  r to write to */
20230 0a 20 20 69 36 34 20 2a 70 69 4c 61 73 74 52 6f  .  i64 *piLastRo
20240 77 69 64 2c 20 20 20 20 20 20 20 20 20 20 20 20  wid,            
20250 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 50 72     /* IN/OUT: Pr
20260 65 76 69 6f 75 73 20 72 6f 77 69 64 20 77 72 69  evious rowid wri
20270 74 74 65 6e 20 28 69 66 20 61 6e 79 29 20 2a 2f  tten (if any) */
20280 0a 20 20 69 36 34 20 69 52 6f 77 69 64 20 20 20  .  i64 iRowid   
20290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
202a0 20 20 20 2f 2a 20 52 6f 77 69 64 20 74 6f 20 61     /* Rowid to a
202b0 70 70 65 6e 64 20 2a 2f 0a 29 7b 0a 20 20 69 66  ppend */.){.  if
202c0 28 20 70 42 75 66 2d 3e 6e 3d 3d 30 20 29 7b 0a  ( pBuf->n==0 ){.
202d0 20 20 20 20 66 74 73 35 42 75 66 66 65 72 41 70      fts5BufferAp
202e0 70 65 6e 64 56 61 72 69 6e 74 28 70 52 63 2c 20  pendVarint(pRc, 
202f0 70 42 75 66 2c 20 69 52 6f 77 69 64 29 3b 0a 20  pBuf, iRowid);. 
20300 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66 74 73 35   }else{.    fts5
20310 42 75 66 66 65 72 41 70 70 65 6e 64 56 61 72 69  BufferAppendVari
20320 6e 74 28 70 52 63 2c 20 70 42 75 66 2c 20 69 52  nt(pRc, pBuf, iR
20330 6f 77 69 64 20 2d 20 2a 70 69 4c 61 73 74 52 6f  owid - *piLastRo
20340 77 69 64 29 3b 0a 20 20 7d 0a 20 20 2a 70 69 4c  wid);.  }.  *piL
20350 61 73 74 52 6f 77 69 64 20 3d 20 69 52 6f 77 69  astRowid = iRowi
20360 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42 75 66 66  d;.}../*.** Buff
20370 65 72 73 20 70 31 20 61 6e 64 20 70 32 20 63 6f  ers p1 and p2 co
20380 6e 74 61 69 6e 20 64 6f 63 6c 69 73 74 73 2e 20  ntain doclists. 
20390 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 65  This function me
203a0 72 67 65 73 20 74 68 65 20 63 6f 6e 74 65 6e 74  rges the content
203b0 0a 2a 2a 20 6f 66 20 74 68 65 20 74 77 6f 20 64  .** of the two d
203c0 6f 63 6c 69 73 74 73 20 74 6f 67 65 74 68 65 72  oclists together
203d0 20 61 6e 64 20 73 65 74 73 20 62 75 66 66 65 72   and sets buffer
203e0 20 70 31 20 74 6f 20 74 68 65 20 72 65 73 75 6c   p1 to the resul
203f0 74 20 62 65 66 6f 72 65 0a 2a 2a 20 72 65 74 75  t before.** retu
20400 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  rning..**.** If 
20410 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  an error occurs,
20420 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69   an error code i
20430 73 20 6c 65 66 74 20 69 6e 20 70 2d 3e 72 63 2e  s left in p->rc.
20440 20 49 66 20 61 6e 20 65 72 72 6f 72 20 68 61 73   If an error has
20450 0a 2a 2a 20 61 6c 72 65 61 64 79 20 6f 63 63 75  .** already occu
20460 72 72 65 64 2c 20 74 68 69 73 20 66 75 6e 63 74  rred, this funct
20470 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a  ion is a no-op..
20480 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
20490 74 73 35 4d 65 72 67 65 50 72 65 66 69 78 4c 69  ts5MergePrefixLi
204a0 73 74 73 28 0a 20 20 46 74 73 35 49 6e 64 65 78  sts(.  Fts5Index
204b0 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
204c0 20 20 20 20 20 20 20 2f 2a 20 46 54 53 35 20 62         /* FTS5 b
204d0 61 63 6b 65 6e 64 20 6f 62 6a 65 63 74 20 2a 2f  ackend object */
204e0 0a 20 20 46 74 73 35 42 75 66 66 65 72 20 2a 70  .  Fts5Buffer *p
204f0 31 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  1,              
20500 20 20 20 2f 2a 20 46 69 72 73 74 20 6c 69 73 74     /* First list
20510 20 74 6f 20 6d 65 72 67 65 20 2a 2f 0a 20 20 46   to merge */.  F
20520 74 73 35 42 75 66 66 65 72 20 2a 70 32 20 20 20  ts5Buffer *p2   
20530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
20540 2a 20 53 65 63 6f 6e 64 20 6c 69 73 74 20 74 6f  * Second list to
20550 20 6d 65 72 67 65 20 2a 2f 0a 29 7b 0a 20 20 69   merge */.){.  i
20560 66 28 20 70 32 2d 3e 6e 20 29 7b 0a 20 20 20 20  f( p2->n ){.    
20570 69 36 34 20 69 4c 61 73 74 52 6f 77 69 64 20 3d  i64 iLastRowid =
20580 20 30 3b 0a 20 20 20 20 46 74 73 35 44 6f 63 6c   0;.    Fts5Docl
20590 69 73 74 49 74 65 72 20 69 31 3b 0a 20 20 20 20  istIter i1;.    
205a0 46 74 73 35 44 6f 63 6c 69 73 74 49 74 65 72 20  Fts5DoclistIter 
205b0 69 32 3b 0a 20 20 20 20 46 74 73 35 42 75 66 66  i2;.    Fts5Buff
205c0 65 72 20 6f 75 74 3b 0a 20 20 20 20 46 74 73 35  er out;.    Fts5
205d0 42 75 66 66 65 72 20 74 6d 70 3b 0a 20 20 20 20  Buffer tmp;.    
205e0 6d 65 6d 73 65 74 28 26 6f 75 74 2c 20 30 2c 20  memset(&out, 0, 
205f0 73 69 7a 65 6f 66 28 6f 75 74 29 29 3b 0a 20 20  sizeof(out));.  
20600 20 20 6d 65 6d 73 65 74 28 26 74 6d 70 2c 20 30    memset(&tmp, 0
20610 2c 20 73 69 7a 65 6f 66 28 74 6d 70 29 29 3b 0a  , sizeof(tmp));.
20620 0a 20 20 20 20 66 74 73 35 44 6f 63 6c 69 73 74  .    fts5Doclist
20630 49 74 65 72 49 6e 69 74 28 70 31 2c 20 26 69 31  IterInit(p1, &i1
20640 29 3b 0a 20 20 20 20 66 74 73 35 44 6f 63 6c 69  );.    fts5Docli
20650 73 74 49 74 65 72 49 6e 69 74 28 70 32 2c 20 26  stIterInit(p2, &
20660 69 32 29 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  i2);.    while( 
20670 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
20680 20 26 26 20 28 69 31 2e 61 50 6f 73 6c 69 73 74   && (i1.aPoslist
20690 21 3d 30 20 7c 7c 20 69 32 2e 61 50 6f 73 6c 69  !=0 || i2.aPosli
206a0 73 74 21 3d 30 29 20 29 7b 0a 20 20 20 20 20 20  st!=0) ){.      
206b0 69 66 28 20 69 32 2e 61 50 6f 73 6c 69 73 74 3d  if( i2.aPoslist=
206c0 3d 30 20 7c 7c 20 28 69 31 2e 61 50 6f 73 6c 69  =0 || (i1.aPosli
206d0 73 74 20 26 26 20 69 31 2e 69 52 6f 77 69 64 3c  st && i1.iRowid<
206e0 69 32 2e 69 52 6f 77 69 64 29 20 29 7b 0a 20 20  i2.iRowid) ){.  
206f0 20 20 20 20 20 20 2f 2a 20 43 6f 70 79 20 65 6e        /* Copy en
20700 74 72 79 20 66 72 6f 6d 20 69 31 20 2a 2f 0a 20  try from i1 */. 
20710 20 20 20 20 20 20 20 66 74 73 35 4d 65 72 67 65         fts5Merge
20720 41 70 70 65 6e 64 44 6f 63 69 64 28 26 70 2d 3e  AppendDocid(&p->
20730 72 63 2c 20 26 6f 75 74 2c 20 26 69 4c 61 73 74  rc, &out, &iLast
20740 52 6f 77 69 64 2c 20 69 31 2e 69 52 6f 77 69 64  Rowid, i1.iRowid
20750 29 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 57 52  );.        /* WR
20760 49 54 45 50 4f 53 4c 49 53 54 53 49 5a 45 20 2a  ITEPOSLISTSIZE *
20770 2f 0a 20 20 20 20 20 20 20 20 66 74 73 35 42 75  /.        fts5Bu
20780 66 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e 74  fferAppendVarint
20790 28 26 70 2d 3e 72 63 2c 20 26 6f 75 74 2c 20 69  (&p->rc, &out, i
207a0 31 2e 6e 50 6f 73 6c 69 73 74 20 2a 20 32 29 3b  1.nPoslist * 2);
207b0 0a 20 20 20 20 20 20 20 20 66 74 73 35 42 75 66  .        fts5Buf
207c0 66 65 72 41 70 70 65 6e 64 42 6c 6f 62 28 26 70  ferAppendBlob(&p
207d0 2d 3e 72 63 2c 20 26 6f 75 74 2c 20 69 31 2e 6e  ->rc, &out, i1.n
207e0 50 6f 73 6c 69 73 74 2c 20 69 31 2e 61 50 6f 73  Poslist, i1.aPos
207f0 6c 69 73 74 29 3b 0a 20 20 20 20 20 20 20 20 66  list);.        f
20800 74 73 35 44 6f 63 6c 69 73 74 49 74 65 72 4e 65  ts5DoclistIterNe
20810 78 74 28 26 69 31 29 3b 0a 20 20 20 20 20 20 7d  xt(&i1);.      }
20820 0a 20 20 20 20 20 20 65 6c 73 65 20 69 66 28 20  .      else if( 
20830 69 31 2e 61 50 6f 73 6c 69 73 74 3d 3d 30 20 7c  i1.aPoslist==0 |
20840 7c 20 69 32 2e 69 52 6f 77 69 64 21 3d 69 31 2e  | i2.iRowid!=i1.
20850 69 52 6f 77 69 64 20 29 7b 0a 20 20 20 20 20 20  iRowid ){.      
20860 20 20 2f 2a 20 43 6f 70 79 20 65 6e 74 72 79 20    /* Copy entry 
20870 66 72 6f 6d 20 69 32 20 2a 2f 0a 20 20 20 20 20  from i2 */.     
20880 20 20 20 66 74 73 35 4d 65 72 67 65 41 70 70 65     fts5MergeAppe
20890 6e 64 44 6f 63 69 64 28 26 70 2d 3e 72 63 2c 20  ndDocid(&p->rc, 
208a0 26 6f 75 74 2c 20 26 69 4c 61 73 74 52 6f 77 69  &out, &iLastRowi
208b0 64 2c 20 69 32 2e 69 52 6f 77 69 64 29 3b 0a 20  d, i2.iRowid);. 
208c0 20 20 20 20 20 20 20 2f 2a 20 57 52 49 54 45 50         /* WRITEP
208d0 4f 53 4c 49 53 54 53 49 5a 45 20 2a 2f 0a 20 20  OSLISTSIZE */.  
208e0 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72        fts5Buffer
208f0 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26 70 2d  AppendVarint(&p-
20900 3e 72 63 2c 20 26 6f 75 74 2c 20 69 32 2e 6e 50  >rc, &out, i2.nP
20910 6f 73 6c 69 73 74 20 2a 20 32 29 3b 0a 20 20 20  oslist * 2);.   
20920 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72 41       fts5BufferA
20930 70 70 65 6e 64 42 6c 6f 62 28 26 70 2d 3e 72 63  ppendBlob(&p->rc
20940 2c 20 26 6f 75 74 2c 20 69 32 2e 6e 50 6f 73 6c  , &out, i2.nPosl
20950 69 73 74 2c 20 69 32 2e 61 50 6f 73 6c 69 73 74  ist, i2.aPoslist
20960 29 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35 44  );.        fts5D
20970 6f 63 6c 69 73 74 49 74 65 72 4e 65 78 74 28 26  oclistIterNext(&
20980 69 32 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  i2);.      }.   
20990 20 20 20 65 6c 73 65 7b 0a 20 20 20 20 20 20 20     else{.       
209a0 20 46 74 73 35 50 6f 73 6c 69 73 74 52 65 61 64   Fts5PoslistRead
209b0 65 72 20 72 31 3b 0a 20 20 20 20 20 20 20 20 46  er r1;.        F
209c0 74 73 35 50 6f 73 6c 69 73 74 52 65 61 64 65 72  ts5PoslistReader
209d0 20 72 32 3b 0a 20 20 20 20 20 20 20 20 46 74 73   r2;.        Fts
209e0 35 50 6f 73 6c 69 73 74 57 72 69 74 65 72 20 77  5PoslistWriter w
209f0 72 69 74 65 72 3b 0a 0a 20 20 20 20 20 20 20 20  riter;..        
20a00 6d 65 6d 73 65 74 28 26 77 72 69 74 65 72 2c 20  memset(&writer, 
20a10 30 2c 20 73 69 7a 65 6f 66 28 77 72 69 74 65 72  0, sizeof(writer
20a20 29 29 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20  ));..        /* 
20a30 4d 65 72 67 65 20 74 68 65 20 74 77 6f 20 70 6f  Merge the two po
20a40 73 69 74 69 6f 6e 20 6c 69 73 74 73 2e 20 2a 2f  sition lists. */
20a50 20 0a 20 20 20 20 20 20 20 20 66 74 73 35 4d 65   .        fts5Me
20a60 72 67 65 41 70 70 65 6e 64 44 6f 63 69 64 28 26  rgeAppendDocid(&
20a70 70 2d 3e 72 63 2c 20 26 6f 75 74 2c 20 26 69 4c  p->rc, &out, &iL
20a80 61 73 74 52 6f 77 69 64 2c 20 69 32 2e 69 52 6f  astRowid, i2.iRo
20a90 77 69 64 29 3b 0a 20 20 20 20 20 20 20 20 66 74  wid);.        ft
20aa0 73 35 42 75 66 66 65 72 5a 65 72 6f 28 26 74 6d  s5BufferZero(&tm
20ab0 70 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  p);.        sqli
20ac0 74 65 33 46 74 73 35 50 6f 73 6c 69 73 74 52 65  te3Fts5PoslistRe
20ad0 61 64 65 72 49 6e 69 74 28 2d 31 2c 20 69 31 2e  aderInit(-1, i1.
20ae0 61 50 6f 73 6c 69 73 74 2c 20 69 31 2e 6e 50 6f  aPoslist, i1.nPo
20af0 73 6c 69 73 74 2c 20 26 72 31 29 3b 0a 20 20 20  slist, &r1);.   
20b00 20 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35       sqlite3Fts5
20b10 50 6f 73 6c 69 73 74 52 65 61 64 65 72 49 6e 69  PoslistReaderIni
20b20 74 28 2d 31 2c 20 69 32 2e 61 50 6f 73 6c 69 73  t(-1, i2.aPoslis
20b30 74 2c 20 69 32 2e 6e 50 6f 73 6c 69 73 74 2c 20  t, i2.nPoslist, 
20b40 26 72 32 29 3b 0a 20 20 20 20 20 20 20 20 77 68  &r2);.        wh
20b50 69 6c 65 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49  ile( p->rc==SQLI
20b60 54 45 5f 4f 4b 20 26 26 20 28 72 31 2e 62 45 6f  TE_OK && (r1.bEo
20b70 66 3d 3d 30 20 7c 7c 20 72 32 2e 62 45 6f 66 3d  f==0 || r2.bEof=
20b80 3d 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  =0) ){.         
20b90 20 69 36 34 20 69 4e 65 77 3b 0a 20 20 20 20 20   i64 iNew;.     
20ba0 20 20 20 20 20 69 66 28 20 72 32 2e 62 45 6f 66       if( r2.bEof
20bb0 20 7c 7c 20 28 72 31 2e 62 45 6f 66 3d 3d 30 20   || (r1.bEof==0 
20bc0 26 26 20 72 31 2e 69 50 6f 73 3c 72 32 2e 69 50  && r1.iPos<r2.iP
20bd0 6f 73 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  os) ){.         
20be0 20 20 20 69 4e 65 77 20 3d 20 72 31 2e 69 50 6f     iNew = r1.iPo
20bf0 73 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  s;.            s
20c00 71 6c 69 74 65 33 46 74 73 35 50 6f 73 6c 69 73  qlite3Fts5Poslis
20c10 74 52 65 61 64 65 72 4e 65 78 74 28 26 72 31 29  tReaderNext(&r1)
20c20 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73  ;.          }els
20c30 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  e{.            i
20c40 4e 65 77 20 3d 20 72 32 2e 69 50 6f 73 3b 0a 20  New = r2.iPos;. 
20c50 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
20c60 65 33 46 74 73 35 50 6f 73 6c 69 73 74 52 65 61  e3Fts5PoslistRea
20c70 64 65 72 4e 65 78 74 28 26 72 32 29 3b 0a 20 20  derNext(&r2);.  
20c80 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 31            if( r1
20c90 2e 69 50 6f 73 3d 3d 72 32 2e 69 50 6f 73 20 29  .iPos==r2.iPos )
20ca0 20 73 71 6c 69 74 65 33 46 74 73 35 50 6f 73 6c   sqlite3Fts5Posl
20cb0 69 73 74 52 65 61 64 65 72 4e 65 78 74 28 26 72  istReaderNext(&r
20cc0 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  1);.          }.
20cd0 20 20 20 20 20 20 20 20 20 20 70 2d 3e 72 63 20            p->rc 
20ce0 3d 20 73 71 6c 69 74 65 33 46 74 73 35 50 6f 73  = sqlite3Fts5Pos
20cf0 6c 69 73 74 57 72 69 74 65 72 41 70 70 65 6e 64  listWriterAppend
20d00 28 26 74 6d 70 2c 20 26 77 72 69 74 65 72 2c 20  (&tmp, &writer, 
20d10 69 4e 65 77 29 3b 0a 20 20 20 20 20 20 20 20 7d  iNew);.        }
20d20 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 57 52 49  ..        /* WRI
20d30 54 45 50 4f 53 4c 49 53 54 53 49 5a 45 20 2a 2f  TEPOSLISTSIZE */
20d40 0a 20 20 20 20 20 20 20 20 66 74 73 35 42 75 66  .        fts5Buf
20d50 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e 74 28  ferAppendVarint(
20d60 26 70 2d 3e 72 63 2c 20 26 6f 75 74 2c 20 74 6d  &p->rc, &out, tm
20d70 70 2e 6e 20 2a 20 32 29 3b 0a 20 20 20 20 20 20  p.n * 2);.      
20d80 20 20 66 74 73 35 42 75 66 66 65 72 41 70 70 65    fts5BufferAppe
20d90 6e 64 42 6c 6f 62 28 26 70 2d 3e 72 63 2c 20 26  ndBlob(&p->rc, &
20da0 6f 75 74 2c 20 74 6d 70 2e 6e 2c 20 74 6d 70 2e  out, tmp.n, tmp.
20db0 70 29 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35  p);.        fts5
20dc0 44 6f 63 6c 69 73 74 49 74 65 72 4e 65 78 74 28  DoclistIterNext(
20dd0 26 69 31 29 3b 0a 20 20 20 20 20 20 20 20 66 74  &i1);.        ft
20de0 73 35 44 6f 63 6c 69 73 74 49 74 65 72 4e 65 78  s5DoclistIterNex
20df0 74 28 26 69 32 29 3b 0a 20 20 20 20 20 20 7d 0a  t(&i2);.      }.
20e00 20 20 20 20 7d 0a 0a 20 20 20 20 66 74 73 35 42      }..    fts5B
20e10 75 66 66 65 72 53 65 74 28 26 70 2d 3e 72 63 2c  ufferSet(&p->rc,
20e20 20 70 31 2c 20 6f 75 74 2e 6e 2c 20 6f 75 74 2e   p1, out.n, out.
20e30 70 29 3b 0a 20 20 20 20 66 74 73 35 42 75 66 66  p);.    fts5Buff
20e40 65 72 46 72 65 65 28 26 74 6d 70 29 3b 0a 20 20  erFree(&tmp);.  
20e50 20 20 66 74 73 35 42 75 66 66 65 72 46 72 65 65    fts5BufferFree
20e60 28 26 6f 75 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 73  (&out);.  }.}..s
20e70 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 42  tatic void fts5B
20e80 75 66 66 65 72 53 77 61 70 28 46 74 73 35 42 75  ufferSwap(Fts5Bu
20e90 66 66 65 72 20 2a 70 31 2c 20 46 74 73 35 42 75  ffer *p1, Fts5Bu
20ea0 66 66 65 72 20 2a 70 32 29 7b 0a 20 20 46 74 73  ffer *p2){.  Fts
20eb0 35 42 75 66 66 65 72 20 74 6d 70 20 3d 20 2a 70  5Buffer tmp = *p
20ec0 31 3b 0a 20 20 2a 70 31 20 3d 20 2a 70 32 3b 0a  1;.  *p1 = *p2;.
20ed0 20 20 2a 70 32 20 3d 20 74 6d 70 3b 0a 7d 0a 0a    *p2 = tmp;.}..
20ee0 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
20ef0 53 65 74 75 70 50 72 65 66 69 78 49 74 65 72 28  SetupPrefixIter(
20f00 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c  .  Fts5Index *p,
20f10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20f20 20 20 20 2f 2a 20 49 6e 64 65 78 20 74 6f 20 72     /* Index to r
20f30 65 61 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e  ead from */.  in
20f40 74 20 62 44 65 73 63 2c 20 20 20 20 20 20 20 20  t bDesc,        
20f50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
20f60 20 54 72 75 65 20 66 6f 72 20 22 4f 52 44 45 52   True for "ORDER
20f70 20 42 59 20 72 6f 77 69 64 20 44 45 53 43 22 20   BY rowid DESC" 
20f80 2a 2f 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 70  */.  const u8 *p
20f90 54 6f 6b 65 6e 2c 20 20 20 20 20 20 20 20 20 20  Token,          
20fa0 20 20 20 20 20 2f 2a 20 42 75 66 66 65 72 20 63       /* Buffer c
20fb0 6f 6e 74 61 69 6e 69 6e 67 20 70 72 65 66 69 78  ontaining prefix
20fc0 20 74 6f 20 6d 61 74 63 68 20 2a 2f 0a 20 20 69   to match */.  i
20fd0 6e 74 20 6e 54 6f 6b 65 6e 2c 20 20 20 20 20 20  nt nToken,      
20fe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
20ff0 2a 20 53 69 7a 65 20 6f 66 20 62 75 66 66 65 72  * Size of buffer
21000 20 70 54 6f 6b 65 6e 20 69 6e 20 62 79 74 65 73   pToken in bytes
21010 20 2a 2f 0a 20 20 46 74 73 35 49 6e 64 65 78 49   */.  Fts5IndexI
21020 74 65 72 20 2a 2a 70 70 49 74 65 72 20 20 20 20  ter **ppIter    
21030 20 20 20 2f 2a 20 4f 55 54 3a 20 4e 65 77 20 69     /* OUT: New i
21040 74 65 72 61 74 6f 72 20 2a 2f 0a 29 7b 0a 20 20  terator */.){.  
21050 46 74 73 35 53 74 72 75 63 74 75 72 65 20 2a 70  Fts5Structure *p
21060 53 74 72 75 63 74 3b 0a 20 20 46 74 73 35 42 75  Struct;.  Fts5Bu
21070 66 66 65 72 20 2a 61 42 75 66 3b 0a 20 20 63 6f  ffer *aBuf;.  co
21080 6e 73 74 20 69 6e 74 20 6e 42 75 66 20 3d 20 33  nst int nBuf = 3
21090 32 3b 0a 0a 20 20 61 42 75 66 20 3d 20 28 46 74  2;..  aBuf = (Ft
210a0 73 35 42 75 66 66 65 72 2a 29 66 74 73 35 49 64  s5Buffer*)fts5Id
210b0 78 4d 61 6c 6c 6f 63 28 70 2c 20 73 69 7a 65 6f  xMalloc(p, sizeo
210c0 66 28 46 74 73 35 42 75 66 66 65 72 29 2a 6e 42  f(Fts5Buffer)*nB
210d0 75 66 29 3b 0a 20 20 70 53 74 72 75 63 74 20 3d  uf);.  pStruct =
210e0 20 66 74 73 35 53 74 72 75 63 74 75 72 65 52 65   fts5StructureRe
210f0 61 64 28 70 29 3b 0a 0a 20 20 69 66 28 20 61 42  ad(p);..  if( aB
21100 75 66 20 26 26 20 70 53 74 72 75 63 74 20 29 7b  uf && pStruct ){
21110 0a 20 20 20 20 63 6f 6e 73 74 20 69 6e 74 20 66  .    const int f
21120 6c 61 67 73 20 3d 20 46 54 53 35 49 4e 44 45 58  lags = FTS5INDEX
21130 5f 51 55 45 52 59 5f 53 43 41 4e 3b 0a 20 20 20  _QUERY_SCAN;.   
21140 20 69 6e 74 20 69 3b 0a 20 20 20 20 69 36 34 20   int i;.    i64 
21150 69 4c 61 73 74 52 6f 77 69 64 20 3d 20 30 3b 0a  iLastRowid = 0;.
21160 20 20 20 20 46 74 73 35 49 6e 64 65 78 49 74 65      Fts5IndexIte
21170 72 20 2a 70 31 20 3d 20 30 3b 20 20 20 20 20 2f  r *p1 = 0;     /
21180 2a 20 49 74 65 72 61 74 6f 72 20 75 73 65 64 20  * Iterator used 
21190 74 6f 20 67 61 74 68 65 72 20 64 61 74 61 20 66  to gather data f
211a0 72 6f 6d 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20  rom index */.   
211b0 20 46 74 73 35 44 61 74 61 20 2a 70 44 61 74 61   Fts5Data *pData
211c0 3b 0a 20 20 20 20 46 74 73 35 42 75 66 66 65 72  ;.    Fts5Buffer
211d0 20 64 6f 63 6c 69 73 74 3b 0a 0a 20 20 20 20 6d   doclist;..    m
211e0 65 6d 73 65 74 28 26 64 6f 63 6c 69 73 74 2c 20  emset(&doclist, 
211f0 30 2c 20 73 69 7a 65 6f 66 28 64 6f 63 6c 69 73  0, sizeof(doclis
21200 74 29 29 3b 0a 20 20 20 20 66 6f 72 28 66 74 73  t));.    for(fts
21210 35 4d 75 6c 74 69 49 74 65 72 4e 65 77 28 70 2c  5MultiIterNew(p,
21220 20 70 53 74 72 75 63 74 2c 20 31 2c 20 66 6c 61   pStruct, 1, fla
21230 67 73 2c 20 70 54 6f 6b 65 6e 2c 20 6e 54 6f 6b  gs, pToken, nTok
21240 65 6e 2c 20 2d 31 2c 20 30 2c 20 26 70 31 29 3b  en, -1, 0, &p1);
21250 0a 20 20 20 20 20 20 20 20 66 74 73 35 4d 75 6c  .        fts5Mul
21260 74 69 49 74 65 72 45 6f 66 28 70 2c 20 70 31 29  tiIterEof(p, p1)
21270 3d 3d 30 3b 0a 20 20 20 20 20 20 20 20 66 74 73  ==0;.        fts
21280 35 4d 75 6c 74 69 49 74 65 72 4e 65 78 74 28 70  5MultiIterNext(p
21290 2c 20 70 31 2c 20 30 2c 20 30 29 0a 20 20 20 20  , p1, 0, 0).    
212a0 29 7b 0a 20 20 20 20 20 20 69 36 34 20 69 52 6f  ){.      i64 iRo
212b0 77 69 64 20 3d 20 66 74 73 35 4d 75 6c 74 69 49  wid = fts5MultiI
212c0 74 65 72 52 6f 77 69 64 28 70 31 29 3b 0a 20 20  terRowid(p1);.  
212d0 20 20 20 20 69 6e 74 20 6e 54 65 72 6d 3b 0a 20      int nTerm;. 
212e0 20 20 20 20 20 63 6f 6e 73 74 20 75 38 20 2a 70       const u8 *p
212f0 54 65 72 6d 20 3d 20 66 74 73 35 4d 75 6c 74 69  Term = fts5Multi
21300 49 74 65 72 54 65 72 6d 28 70 31 2c 20 26 6e 54  IterTerm(p1, &nT
21310 65 72 6d 29 3b 0a 20 20 20 20 20 20 61 73 73 65  erm);.      asse
21320 72 74 28 20 6d 65 6d 63 6d 70 28 70 54 6f 6b 65  rt( memcmp(pToke
21330 6e 2c 20 70 54 65 72 6d 2c 20 4d 49 4e 28 6e 54  n, pTerm, MIN(nT
21340 6f 6b 65 6e 2c 20 6e 54 65 72 6d 29 29 3c 3d 30  oken, nTerm))<=0
21350 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 54   );.      if( nT
21360 65 72 6d 3c 6e 54 6f 6b 65 6e 20 7c 7c 20 6d 65  erm<nToken || me
21370 6d 63 6d 70 28 70 54 6f 6b 65 6e 2c 20 70 54 65  mcmp(pToken, pTe
21380 72 6d 2c 20 6e 54 6f 6b 65 6e 29 20 29 20 62 72  rm, nToken) ) br
21390 65 61 6b 3b 0a 0a 20 20 20 20 20 20 69 66 28 20  eak;..      if( 
213a0 64 6f 63 6c 69 73 74 2e 6e 3e 30 20 26 26 20 69  doclist.n>0 && i
213b0 52 6f 77 69 64 3c 3d 69 4c 61 73 74 52 6f 77 69  Rowid<=iLastRowi
213c0 64 20 29 7b 0a 20 20 20 20 20 20 20 20 66 6f 72  d ){.        for
213d0 28 69 3d 30 3b 20 70 2d 3e 72 63 3d 3d 53 51 4c  (i=0; p->rc==SQL
213e0 49 54 45 5f 4f 4b 20 26 26 20 64 6f 63 6c 69 73  ITE_OK && doclis
213f0 74 2e 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  t.n; i++){.     
21400 20 20 20 20 20 61 73 73 65 72 74 28 20 69 3c 6e       assert( i<n
21410 42 75 66 20 29 3b 0a 20 20 20 20 20 20 20 20 20  Buf );.         
21420 20 69 66 28 20 61 42 75 66 5b 69 5d 2e 6e 3d 3d   if( aBuf[i].n==
21430 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
21440 20 66 74 73 35 42 75 66 66 65 72 53 77 61 70 28   fts5BufferSwap(
21450 26 64 6f 63 6c 69 73 74 2c 20 26 61 42 75 66 5b  &doclist, &aBuf[
21460 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  i]);.           
21470 20 66 74 73 35 42 75 66 66 65 72 5a 65 72 6f 28   fts5BufferZero(
21480 26 64 6f 63 6c 69 73 74 29 3b 0a 20 20 20 20 20  &doclist);.     
21490 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
214a0 20 20 20 20 20 20 20 20 66 74 73 35 4d 65 72 67          fts5Merg
214b0 65 50 72 65 66 69 78 4c 69 73 74 73 28 70 2c 20  ePrefixLists(p, 
214c0 26 64 6f 63 6c 69 73 74 2c 20 26 61 42 75 66 5b  &doclist, &aBuf[
214d0 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  i]);.           
214e0 20 66 74 73 35 42 75 66 66 65 72 5a 65 72 6f 28   fts5BufferZero(
214f0 26 61 42 75 66 5b 69 5d 29 3b 0a 20 20 20 20 20  &aBuf[i]);.     
21500 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
21510 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
21520 66 74 73 35 4d 65 72 67 65 41 70 70 65 6e 64 44  fts5MergeAppendD
21530 6f 63 69 64 28 26 70 2d 3e 72 63 2c 20 26 64 6f  ocid(&p->rc, &do
21540 63 6c 69 73 74 2c 20 26 69 4c 61 73 74 52 6f 77  clist, &iLastRow
21550 69 64 2c 20 69 52 6f 77 69 64 29 3b 0a 20 20 20  id, iRowid);.   
21560 20 20 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72     fts5MultiIter
21570 50 6f 73 6c 69 73 74 28 70 2c 20 70 31 2c 20 31  Poslist(p, p1, 1
21580 2c 20 26 64 6f 63 6c 69 73 74 29 3b 0a 20 20 20  , &doclist);.   
21590 20 7d 0a 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   }..    for(i=0;
215a0 20 69 3c 6e 42 75 66 3b 20 69 2b 2b 29 7b 0a 20   i<nBuf; i++){. 
215b0 20 20 20 20 20 66 74 73 35 4d 65 72 67 65 50 72       fts5MergePr
215c0 65 66 69 78 4c 69 73 74 73 28 70 2c 20 26 64 6f  efixLists(p, &do
215d0 63 6c 69 73 74 2c 20 26 61 42 75 66 5b 69 5d 29  clist, &aBuf[i])
215e0 3b 0a 20 20 20 20 20 20 66 74 73 35 42 75 66 66  ;.      fts5Buff
215f0 65 72 46 72 65 65 28 26 61 42 75 66 5b 69 5d 29  erFree(&aBuf[i])
21600 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 74 73 35  ;.    }.    fts5
21610 4d 75 6c 74 69 49 74 65 72 46 72 65 65 28 70 2c  MultiIterFree(p,
21620 20 70 31 29 3b 0a 0a 20 20 20 20 70 44 61 74 61   p1);..    pData
21630 20 3d 20 66 74 73 35 49 64 78 4d 61 6c 6c 6f 63   = fts5IdxMalloc
21640 28 70 2c 20 73 69 7a 65 6f 66 28 46 74 73 35 44  (p, sizeof(Fts5D
21650 61 74 61 29 20 2b 20 64 6f 63 6c 69 73 74 2e 6e  ata) + doclist.n
21660 29 3b 0a 20 20 20 20 69 66 28 20 70 44 61 74 61  );.    if( pData
21670 20 29 7b 0a 20 20 20 20 20 20 70 44 61 74 61 2d   ){.      pData-
21680 3e 70 20 3d 20 28 75 38 2a 29 26 70 44 61 74 61  >p = (u8*)&pData
21690 5b 31 5d 3b 0a 20 20 20 20 20 20 70 44 61 74 61  [1];.      pData
216a0 2d 3e 6e 6e 20 3d 20 70 44 61 74 61 2d 3e 73 7a  ->nn = pData->sz
216b0 4c 65 61 66 20 3d 20 64 6f 63 6c 69 73 74 2e 6e  Leaf = doclist.n
216c0 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70  ;.      memcpy(p
216d0 44 61 74 61 2d 3e 70 2c 20 64 6f 63 6c 69 73 74  Data->p, doclist
216e0 2e 70 2c 20 64 6f 63 6c 69 73 74 2e 6e 29 3b 0a  .p, doclist.n);.
216f0 20 20 20 20 20 20 66 74 73 35 4d 75 6c 74 69 49        fts5MultiI
21700 74 65 72 4e 65 77 32 28 70 2c 20 70 44 61 74 61  terNew2(p, pData
21710 2c 20 62 44 65 73 63 2c 20 70 70 49 74 65 72 29  , bDesc, ppIter)
21720 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 74 73 35  ;.    }.    fts5
21730 42 75 66 66 65 72 46 72 65 65 28 26 64 6f 63 6c  BufferFree(&docl
21740 69 73 74 29 3b 0a 20 20 7d 0a 0a 20 20 66 74 73  ist);.  }..  fts
21750 35 53 74 72 75 63 74 75 72 65 52 65 6c 65 61 73  5StructureReleas
21760 65 28 70 53 74 72 75 63 74 29 3b 0a 20 20 73 71  e(pStruct);.  sq
21770 6c 69 74 65 33 5f 66 72 65 65 28 61 42 75 66 29  lite3_free(aBuf)
21780 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 49 6e 64 69  ;.}.../*.** Indi
21790 63 61 74 65 20 74 68 61 74 20 61 6c 6c 20 73 75  cate that all su
217a0 62 73 65 71 75 65 6e 74 20 63 61 6c 6c 73 20 74  bsequent calls t
217b0 6f 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64  o sqlite3Fts5Ind
217c0 65 78 57 72 69 74 65 28 29 20 70 65 72 74 61 69  exWrite() pertai
217d0 6e 0a 2a 2a 20 74 6f 20 74 68 65 20 64 6f 63 75  n.** to the docu
217e0 6d 65 6e 74 20 77 69 74 68 20 72 6f 77 69 64 20  ment with rowid 
217f0 69 52 6f 77 69 64 2e 0a 2a 2f 0a 69 6e 74 20 73  iRowid..*/.int s
21800 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78 42  qlite3Fts5IndexB
21810 65 67 69 6e 57 72 69 74 65 28 46 74 73 35 49 6e  eginWrite(Fts5In
21820 64 65 78 20 2a 70 2c 20 69 36 34 20 69 52 6f 77  dex *p, i64 iRow
21830 69 64 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70  id){.  assert( p
21840 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
21850 29 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74  );..  /* Allocat
21860 65 20 74 68 65 20 68 61 73 68 20 74 61 62 6c 65  e the hash table
21870 20 69 66 20 69 74 20 68 61 73 20 6e 6f 74 20 61   if it has not a
21880 6c 72 65 61 64 79 20 62 65 65 6e 20 61 6c 6c 6f  lready been allo
21890 63 61 74 65 64 20 2a 2f 0a 20 20 69 66 28 20 70  cated */.  if( p
218a0 2d 3e 70 48 61 73 68 3d 3d 30 20 29 7b 0a 20 20  ->pHash==0 ){.  
218b0 20 20 70 2d 3e 72 63 20 3d 20 73 71 6c 69 74 65    p->rc = sqlite
218c0 33 46 74 73 35 48 61 73 68 4e 65 77 28 26 70 2d  3Fts5HashNew(&p-
218d0 3e 70 48 61 73 68 2c 20 26 70 2d 3e 6e 50 65 6e  >pHash, &p->nPen
218e0 64 69 6e 67 44 61 74 61 29 3b 0a 20 20 7d 0a 0a  dingData);.  }..
218f0 20 20 2f 2a 20 46 6c 75 73 68 20 74 68 65 20 68    /* Flush the h
21900 61 73 68 20 74 61 62 6c 65 20 74 6f 20 64 69 73  ash table to dis
21910 6b 20 69 66 20 72 65 71 75 69 72 65 64 20 2a 2f  k if required */
21920 0a 20 20 69 66 28 20 69 52 6f 77 69 64 3c 3d 70  .  if( iRowid<=p
21930 2d 3e 69 57 72 69 74 65 52 6f 77 69 64 20 7c 7c  ->iWriteRowid ||
21940 20 28 70 2d 3e 6e 50 65 6e 64 69 6e 67 44 61 74   (p->nPendingDat
21950 61 20 3e 20 70 2d 3e 6e 4d 61 78 50 65 6e 64 69  a > p->nMaxPendi
21960 6e 67 44 61 74 61 29 20 29 7b 0a 20 20 20 20 66  ngData) ){.    f
21970 74 73 35 49 6e 64 65 78 46 6c 75 73 68 28 70 29  ts5IndexFlush(p)
21980 3b 0a 20 20 7d 0a 20 20 70 2d 3e 69 57 72 69 74  ;.  }.  p->iWrit
21990 65 52 6f 77 69 64 20 3d 20 69 52 6f 77 69 64 3b  eRowid = iRowid;
219a0 0a 20 20 72 65 74 75 72 6e 20 66 74 73 35 49 6e  .  return fts5In
219b0 64 65 78 52 65 74 75 72 6e 28 70 29 3b 0a 7d 0a  dexReturn(p);.}.
219c0 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69 74 20 64 61  ./*.** Commit da
219d0 74 61 20 74 6f 20 64 69 73 6b 2e 0a 2a 2f 0a 69  ta to disk..*/.i
219e0 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e  nt sqlite3Fts5In
219f0 64 65 78 53 79 6e 63 28 46 74 73 35 49 6e 64 65  dexSync(Fts5Inde
21a00 78 20 2a 70 2c 20 69 6e 74 20 62 43 6f 6d 6d 69  x *p, int bCommi
21a10 74 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 2d  t){.  assert( p-
21a20 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  >rc==SQLITE_OK )
21a30 3b 0a 20 20 66 74 73 35 49 6e 64 65 78 46 6c 75  ;.  fts5IndexFlu
21a40 73 68 28 70 29 3b 0a 20 20 69 66 28 20 62 43 6f  sh(p);.  if( bCo
21a50 6d 6d 69 74 20 29 20 66 74 73 35 43 6c 6f 73 65  mmit ) fts5Close
21a60 52 65 61 64 65 72 28 70 29 3b 0a 20 20 72 65 74  Reader(p);.  ret
21a70 75 72 6e 20 66 74 73 35 49 6e 64 65 78 52 65 74  urn fts5IndexRet
21a80 75 72 6e 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn(p);.}../*.**
21a90 20 44 69 73 63 61 72 64 20 61 6e 79 20 64 61 74   Discard any dat
21aa0 61 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20  a stored in the 
21ab0 69 6e 2d 6d 65 6d 6f 72 79 20 68 61 73 68 20 74  in-memory hash t
21ac0 61 62 6c 65 73 2e 20 44 6f 20 6e 6f 74 20 77 72  ables. Do not wr
21ad0 69 74 65 20 69 74 0a 2a 2a 20 74 6f 20 74 68 65  ite it.** to the
21ae0 20 64 61 74 61 62 61 73 65 2e 20 41 64 64 69 74   database. Addit
21af0 69 6f 6e 61 6c 6c 79 2c 20 61 73 73 75 6d 65 20  ionally, assume 
21b00 74 68 61 74 20 74 68 65 20 63 6f 6e 74 65 6e 74  that the content
21b10 73 20 6f 66 20 74 68 65 20 25 5f 64 61 74 61 0a  s of the %_data.
21b20 2a 2a 20 74 61 62 6c 65 20 6d 61 79 20 68 61 76  ** table may hav
21b30 65 20 63 68 61 6e 67 65 64 20 6f 6e 20 64 69 73  e changed on dis
21b40 6b 2e 20 53 6f 20 61 6e 79 20 69 6e 2d 6d 65 6d  k. So any in-mem
21b50 6f 72 79 20 63 61 63 68 65 73 20 6f 66 20 25 5f  ory caches of %_
21b60 64 61 74 61 20 0a 2a 2a 20 72 65 63 6f 72 64 73  data .** records
21b70 20 6d 75 73 74 20 62 65 20 69 6e 76 61 6c 69 64   must be invalid
21b80 61 74 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ated..*/.int sql
21b90 69 74 65 33 46 74 73 35 49 6e 64 65 78 52 6f 6c  ite3Fts5IndexRol
21ba0 6c 62 61 63 6b 28 46 74 73 35 49 6e 64 65 78 20  lback(Fts5Index 
21bb0 2a 70 29 7b 0a 20 20 66 74 73 35 43 6c 6f 73 65  *p){.  fts5Close
21bc0 52 65 61 64 65 72 28 70 29 3b 0a 20 20 66 74 73  Reader(p);.  fts
21bd0 35 49 6e 64 65 78 44 69 73 63 61 72 64 44 61 74  5IndexDiscardDat
21be0 61 28 70 29 3b 0a 20 20 61 73 73 65 72 74 28 20  a(p);.  assert( 
21bf0 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
21c00 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c   );.  return SQL
21c10 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
21c20 20 54 68 65 20 25 5f 64 61 74 61 20 74 61 62 6c   The %_data tabl
21c30 65 20 69 73 20 63 6f 6d 70 6c 65 74 65 6c 79 20  e is completely 
21c40 65 6d 70 74 79 20 77 68 65 6e 20 74 68 69 73 20  empty when this 
21c50 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
21c60 65 64 2e 20 54 68 69 73 0a 2a 2a 20 66 75 6e 63  ed. This.** func
21c70 74 69 6f 6e 20 70 6f 70 75 6c 61 74 65 73 20 69  tion populates i
21c80 74 20 77 69 74 68 20 74 68 65 20 69 6e 69 74 69  t with the initi
21c90 61 6c 20 73 74 72 75 63 74 75 72 65 20 6f 62 6a  al structure obj
21ca0 65 63 74 73 20 66 6f 72 20 65 61 63 68 20 69 6e  ects for each in
21cb0 64 65 78 2c 0a 2a 2a 20 61 6e 64 20 74 68 65 20  dex,.** and the 
21cc0 69 6e 69 74 69 61 6c 20 76 65 72 73 69 6f 6e 20  initial version 
21cd0 6f 66 20 74 68 65 20 22 61 76 65 72 61 67 65 73  of the "averages
21ce0 22 20 72 65 63 6f 72 64 20 28 61 20 7a 65 72 6f  " record (a zero
21cf0 2d 62 79 74 65 20 62 6c 6f 62 29 2e 0a 2a 2f 0a  -byte blob)..*/.
21d00 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 49  int sqlite3Fts5I
21d10 6e 64 65 78 52 65 69 6e 69 74 28 46 74 73 35 49  ndexReinit(Fts5I
21d20 6e 64 65 78 20 2a 70 29 7b 0a 20 20 46 74 73 35  ndex *p){.  Fts5
21d30 53 74 72 75 63 74 75 72 65 20 73 3b 0a 20 20 6d  Structure s;.  m
21d40 65 6d 73 65 74 28 26 73 2c 20 30 2c 20 73 69 7a  emset(&s, 0, siz
21d50 65 6f 66 28 46 74 73 35 53 74 72 75 63 74 75 72  eof(Fts5Structur
21d60 65 29 29 3b 0a 20 20 66 74 73 35 44 61 74 61 57  e));.  fts5DataW
21d70 72 69 74 65 28 70 2c 20 46 54 53 35 5f 41 56 45  rite(p, FTS5_AVE
21d80 52 41 47 45 53 5f 52 4f 57 49 44 2c 20 28 63 6f  RAGES_ROWID, (co
21d90 6e 73 74 20 75 38 2a 29 22 22 2c 20 30 29 3b 0a  nst u8*)"", 0);.
21da0 20 20 66 74 73 35 53 74 72 75 63 74 75 72 65 57    fts5StructureW
21db0 72 69 74 65 28 70 2c 20 26 73 29 3b 0a 20 20 72  rite(p, &s);.  r
21dc0 65 74 75 72 6e 20 66 74 73 35 49 6e 64 65 78 52  eturn fts5IndexR
21dd0 65 74 75 72 6e 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a  eturn(p);.}../*.
21de0 2a 2a 20 4f 70 65 6e 20 61 20 6e 65 77 20 46 74  ** Open a new Ft
21df0 73 35 49 6e 64 65 78 20 68 61 6e 64 6c 65 2e 20  s5Index handle. 
21e00 49 66 20 74 68 65 20 62 43 72 65 61 74 65 20 61  If the bCreate a
21e10 72 67 75 6d 65 6e 74 20 69 73 20 74 72 75 65 2c  rgument is true,
21e20 20 63 72 65 61 74 65 0a 2a 2a 20 61 6e 64 20 69   create.** and i
21e30 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 75 6e  nitialize the un
21e40 64 65 72 6c 79 69 6e 67 20 25 5f 64 61 74 61 20  derlying %_data 
21e50 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  table..**.** If 
21e60 73 75 63 63 65 73 73 66 75 6c 2c 20 73 65 74 20  successful, set 
21e70 2a 70 70 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20  *pp to point to 
21e80 74 68 65 20 6e 65 77 20 6f 62 6a 65 63 74 20 61  the new object a
21e90 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  nd return SQLITE
21ea0 5f 4f 4b 2e 0a 2a 2a 20 4f 74 68 65 72 77 69 73  _OK..** Otherwis
21eb0 65 2c 20 73 65 74 20 2a 70 70 20 74 6f 20 4e 55  e, set *pp to NU
21ec0 4c 4c 20 61 6e 64 20 72 65 74 75 72 6e 20 61 6e  LL and return an
21ed0 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f   SQLite error co
21ee0 64 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  de..*/.int sqlit
21ef0 65 33 46 74 73 35 49 6e 64 65 78 4f 70 65 6e 28  e3Fts5IndexOpen(
21f00 0a 20 20 46 74 73 35 43 6f 6e 66 69 67 20 2a 70  .  Fts5Config *p
21f10 43 6f 6e 66 69 67 2c 20 0a 20 20 69 6e 74 20 62  Config, .  int b
21f20 43 72 65 61 74 65 2c 20 0a 20 20 46 74 73 35 49  Create, .  Fts5I
21f30 6e 64 65 78 20 2a 2a 70 70 2c 0a 20 20 63 68 61  ndex **pp,.  cha
21f40 72 20 2a 2a 70 7a 45 72 72 0a 29 7b 0a 20 20 69  r **pzErr.){.  i
21f50 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
21f60 4b 3b 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a  K;.  Fts5Index *
21f70 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p;              
21f80 20 20 20 20 20 2f 2a 20 4e 65 77 20 6f 62 6a 65       /* New obje
21f90 63 74 20 2a 2f 0a 0a 20 20 2a 70 70 20 3d 20 70  ct */..  *pp = p
21fa0 20 3d 20 28 46 74 73 35 49 6e 64 65 78 2a 29 73   = (Fts5Index*)s
21fb0 71 6c 69 74 65 33 46 74 73 35 4d 61 6c 6c 6f 63  qlite3Fts5Malloc
21fc0 5a 65 72 6f 28 26 72 63 2c 20 73 69 7a 65 6f 66  Zero(&rc, sizeof
21fd0 28 46 74 73 35 49 6e 64 65 78 29 29 3b 0a 20 20  (Fts5Index));.  
21fe0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
21ff0 4b 20 29 7b 0a 20 20 20 20 70 2d 3e 70 43 6f 6e  K ){.    p->pCon
22000 66 69 67 20 3d 20 70 43 6f 6e 66 69 67 3b 0a 20  fig = pConfig;. 
22010 20 20 20 70 2d 3e 6e 57 6f 72 6b 55 6e 69 74 20     p->nWorkUnit 
22020 3d 20 46 54 53 35 5f 57 4f 52 4b 5f 55 4e 49 54  = FTS5_WORK_UNIT
22030 3b 0a 20 20 20 20 70 2d 3e 6e 4d 61 78 50 65 6e  ;.    p->nMaxPen
22040 64 69 6e 67 44 61 74 61 20 3d 20 31 30 32 34 2a  dingData = 1024*
22050 31 30 32 34 3b 0a 20 20 20 20 70 2d 3e 7a 44 61  1024;.    p->zDa
22060 74 61 54 62 6c 20 3d 20 73 71 6c 69 74 65 33 46  taTbl = sqlite3F
22070 74 73 35 4d 70 72 69 6e 74 66 28 26 72 63 2c 20  ts5Mprintf(&rc, 
22080 22 25 73 5f 64 61 74 61 22 2c 20 70 43 6f 6e 66  "%s_data", pConf
22090 69 67 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  ig->zName);.    
220a0 69 66 28 20 70 2d 3e 7a 44 61 74 61 54 62 6c 20  if( p->zDataTbl 
220b0 26 26 20 62 43 72 65 61 74 65 20 29 7b 0a 20 20  && bCreate ){.  
220c0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
220d0 46 74 73 35 43 72 65 61 74 65 54 61 62 6c 65 28  Fts5CreateTable(
220e0 0a 20 20 20 20 20 20 20 20 20 20 70 43 6f 6e 66  .          pConf
220f0 69 67 2c 20 22 64 61 74 61 22 2c 20 22 69 64 20  ig, "data", "id 
22100 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20  INTEGER PRIMARY 
22110 4b 45 59 2c 20 62 6c 6f 63 6b 20 42 4c 4f 42 22  KEY, block BLOB"
22120 2c 20 30 2c 20 70 7a 45 72 72 0a 20 20 20 20 20  , 0, pzErr.     
22130 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63   );.      if( rc
22140 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
22150 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
22160 74 65 33 46 74 73 35 43 72 65 61 74 65 54 61 62  te3Fts5CreateTab
22170 6c 65 28 70 43 6f 6e 66 69 67 2c 20 22 69 64 78  le(pConfig, "idx
22180 22 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  ", .            
22190 22 73 65 67 69 64 2c 20 74 65 72 6d 2c 20 70 67  "segid, term, pg
221a0 6e 6f 2c 20 50 52 49 4d 41 52 59 20 4b 45 59 28  no, PRIMARY KEY(
221b0 73 65 67 69 64 2c 20 74 65 72 6d 29 22 2c 20 0a  segid, term)", .
221c0 20 20 20 20 20 20 20 20 20 20 20 20 31 2c 20 70              1, p
221d0 7a 45 72 72 0a 20 20 20 20 20 20 20 20 29 3b 0a  zErr.        );.
221e0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
221f0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
22200 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
22210 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78  sqlite3Fts5Index
22220 52 65 69 6e 69 74 28 70 29 3b 0a 20 20 20 20 20  Reinit(p);.     
22230 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20   }.    }.  }..  
22240 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49  assert( rc!=SQLI
22250 54 45 5f 4f 4b 20 7c 7c 20 70 2d 3e 72 63 3d 3d  TE_OK || p->rc==
22260 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 69  SQLITE_OK );.  i
22270 66 28 20 72 63 20 29 7b 0a 20 20 20 20 73 71 6c  f( rc ){.    sql
22280 69 74 65 33 46 74 73 35 49 6e 64 65 78 43 6c 6f  ite3Fts5IndexClo
22290 73 65 28 70 29 3b 0a 20 20 20 20 2a 70 70 20 3d  se(p);.    *pp =
222a0 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   0;.  }.  return
222b0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c   rc;.}../*.** Cl
222c0 6f 73 65 20 61 20 68 61 6e 64 6c 65 20 6f 70 65  ose a handle ope
222d0 6e 65 64 20 62 79 20 61 6e 20 65 61 72 6c 69 65  ned by an earlie
222e0 72 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65  r call to sqlite
222f0 33 46 74 73 35 49 6e 64 65 78 4f 70 65 6e 28 29  3Fts5IndexOpen()
22300 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
22310 46 74 73 35 49 6e 64 65 78 43 6c 6f 73 65 28 46  Fts5IndexClose(F
22320 74 73 35 49 6e 64 65 78 20 2a 70 29 7b 0a 20 20  ts5Index *p){.  
22330 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
22340 4f 4b 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20  OK;.  if( p ){. 
22350 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 52     assert( p->pR
22360 65 61 64 65 72 3d 3d 30 20 29 3b 0a 20 20 20 20  eader==0 );.    
22370 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65  sqlite3_finalize
22380 28 70 2d 3e 70 57 72 69 74 65 72 29 3b 0a 20 20  (p->pWriter);.  
22390 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69    sqlite3_finali
223a0 7a 65 28 70 2d 3e 70 44 65 6c 65 74 65 72 29 3b  ze(p->pDeleter);
223b0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e  .    sqlite3_fin
223c0 61 6c 69 7a 65 28 70 2d 3e 70 49 64 78 57 72 69  alize(p->pIdxWri
223d0 74 65 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ter);.    sqlite
223e0 33 5f 66 69 6e 61 6c 69 7a 65 28 70 2d 3e 70 49  3_finalize(p->pI
223f0 64 78 44 65 6c 65 74 65 72 29 3b 0a 20 20 20 20  dxDeleter);.    
22400 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65  sqlite3_finalize
22410 28 70 2d 3e 70 49 64 78 53 65 6c 65 63 74 29 3b  (p->pIdxSelect);
22420 0a 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35  .    sqlite3Fts5
22430 48 61 73 68 46 72 65 65 28 70 2d 3e 70 48 61 73  HashFree(p->pHas
22440 68 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 46  h);.    sqlite3F
22450 74 73 35 42 75 66 66 65 72 46 72 65 65 28 26 70  ts5BufferFree(&p
22460 2d 3e 73 63 72 61 74 63 68 29 3b 0a 20 20 20 20  ->scratch);.    
22470 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 2d 3e  sqlite3_free(p->
22480 7a 44 61 74 61 54 62 6c 29 3b 0a 20 20 20 20 73  zDataTbl);.    s
22490 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a  qlite3_free(p);.
224a0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
224b0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 72 67 75 6d 65  .}../*.** Argume
224c0 6e 74 20 70 20 70 6f 69 6e 74 73 20 74 6f 20 61  nt p points to a
224d0 20 62 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69   buffer containi
224e0 6e 67 20 75 74 66 2d 38 20 74 65 78 74 20 74 68  ng utf-8 text th
224f0 61 74 20 69 73 20 6e 20 62 79 74 65 73 20 69 6e  at is n bytes in
22500 20 0a 2a 2a 20 73 69 7a 65 2e 20 52 65 74 75 72   .** size. Retur
22510 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
22520 62 79 74 65 73 20 69 6e 20 74 68 65 20 6e 43 68  bytes in the nCh
22530 61 72 20 63 68 61 72 61 63 74 65 72 20 70 72 65  ar character pre
22540 66 69 78 20 6f 66 20 74 68 65 0a 2a 2a 20 62 75  fix of the.** bu
22550 66 66 65 72 2c 20 6f 72 20 30 20 69 66 20 74 68  ffer, or 0 if th
22560 65 72 65 20 61 72 65 20 6c 65 73 73 20 74 68 61  ere are less tha
22570 6e 20 6e 43 68 61 72 20 63 68 61 72 61 63 74 65  n nChar characte
22580 72 73 20 69 6e 20 74 6f 74 61 6c 2e 0a 2a 2f 0a  rs in total..*/.
22590 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 35 49  static int fts5I
225a0 6e 64 65 78 43 68 61 72 6c 65 6e 54 6f 42 79 74  ndexCharlenToByt
225b0 65 6c 65 6e 28 63 6f 6e 73 74 20 63 68 61 72 20  elen(const char 
225c0 2a 70 2c 20 69 6e 74 20 6e 42 79 74 65 2c 20 69  *p, int nByte, i
225d0 6e 74 20 6e 43 68 61 72 29 7b 0a 20 20 69 6e 74  nt nChar){.  int
225e0 20 6e 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 3b   n = 0;.  int i;
225f0 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43  .  for(i=0; i<nC
22600 68 61 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  har; i++){.    i
22610 66 28 20 6e 3e 3d 6e 42 79 74 65 20 29 20 72 65  f( n>=nByte ) re
22620 74 75 72 6e 20 30 3b 20 20 20 20 20 20 2f 2a 20  turn 0;      /* 
22630 49 6e 70 75 74 20 63 6f 6e 74 61 69 6e 73 20 66  Input contains f
22640 65 77 65 72 20 74 68 61 6e 20 6e 43 68 61 72 20  ewer than nChar 
22650 63 68 61 72 73 20 2a 2f 0a 20 20 20 20 69 66 28  chars */.    if(
22660 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 29   (unsigned char)
22670 70 5b 6e 2b 2b 5d 3e 3d 30 78 63 30 20 29 7b 0a  p[n++]>=0xc0 ){.
22680 20 20 20 20 20 20 77 68 69 6c 65 28 20 28 70 5b        while( (p[
22690 6e 5d 20 26 20 30 78 63 30 29 3d 3d 30 78 38 30  n] & 0xc0)==0x80
226a0 20 29 20 6e 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20   ) n++;.    }.  
226b0 7d 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a  }.  return n;.}.
226c0 0a 2f 2a 0a 2a 2a 20 70 49 6e 20 69 73 20 61 20  ./*.** pIn is a 
226d0 55 54 46 2d 38 20 65 6e 63 6f 64 65 64 20 73 74  UTF-8 encoded st
226e0 72 69 6e 67 2c 20 6e 49 6e 20 62 79 74 65 73 20  ring, nIn bytes 
226f0 69 6e 20 73 69 7a 65 2e 20 52 65 74 75 72 6e 20  in size. Return 
22700 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a  the number of.**
22710 20 75 6e 69 63 6f 64 65 20 63 68 61 72 61 63 74   unicode charact
22720 65 72 73 20 69 6e 20 74 68 65 20 73 74 72 69 6e  ers in the strin
22730 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  g..*/.static int
22740 20 66 74 73 35 49 6e 64 65 78 43 68 61 72 6c 65   fts5IndexCharle
22750 6e 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 70 49  n(const char *pI
22760 6e 2c 20 69 6e 74 20 6e 49 6e 29 7b 0a 20 20 69  n, int nIn){.  i
22770 6e 74 20 6e 43 68 61 72 20 3d 20 30 3b 20 20 20  nt nChar = 0;   
22780 20 20 20 20 20 20 20 20 20 0a 20 20 69 6e 74 20           .  int 
22790 69 20 3d 20 30 3b 0a 20 20 77 68 69 6c 65 28 20  i = 0;.  while( 
227a0 69 3c 6e 49 6e 20 29 7b 0a 20 20 20 20 69 66 28  i<nIn ){.    if(
227b0 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 29   (unsigned char)
227c0 70 49 6e 5b 69 2b 2b 5d 3e 3d 30 78 63 30 20 29  pIn[i++]>=0xc0 )
227d0 7b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 69  {.      while( i
227e0 3c 6e 49 6e 20 26 26 20 28 70 49 6e 5b 69 5d 20  <nIn && (pIn[i] 
227f0 26 20 30 78 63 30 29 3d 3d 30 78 38 30 20 29 20  & 0xc0)==0x80 ) 
22800 69 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e  i++;.    }.    n
22810 43 68 61 72 2b 2b 3b 0a 20 20 7d 0a 20 20 72 65  Char++;.  }.  re
22820 74 75 72 6e 20 6e 43 68 61 72 3b 0a 7d 0a 0a 2f  turn nChar;.}../
22830 2a 0a 2a 2a 20 49 6e 73 65 72 74 20 6f 72 20 72  *.** Insert or r
22840 65 6d 6f 76 65 20 64 61 74 61 20 74 6f 20 6f 72  emove data to or
22850 20 66 72 6f 6d 20 74 68 65 20 69 6e 64 65 78 2e   from the index.
22860 20 45 61 63 68 20 74 69 6d 65 20 61 20 64 6f 63   Each time a doc
22870 75 6d 65 6e 74 20 69 73 20 0a 2a 2a 20 61 64 64  ument is .** add
22880 65 64 20 74 6f 20 6f 72 20 72 65 6d 6f 76 65 64  ed to or removed
22890 20 66 72 6f 6d 20 74 68 65 20 69 6e 64 65 78 2c   from the index,
228a0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
228b0 73 20 63 61 6c 6c 65 64 20 6f 6e 65 20 6f 72 20  s called one or 
228c0 6d 6f 72 65 0a 2a 2a 20 74 69 6d 65 73 2e 0a 2a  more.** times..*
228d0 2a 0a 2a 2a 20 46 6f 72 20 61 6e 20 69 6e 73 65  *.** For an inse
228e0 72 74 2c 20 69 74 20 6d 75 73 74 20 62 65 20 63  rt, it must be c
228f0 61 6c 6c 65 64 20 6f 6e 63 65 20 66 6f 72 20 65  alled once for e
22900 61 63 68 20 74 6f 6b 65 6e 20 69 6e 20 74 68 65  ach token in the
22910 20 6e 65 77 20 64 6f 63 75 6d 65 6e 74 2e 0a 2a   new document..*
22920 2a 20 49 66 20 74 68 65 20 6f 70 65 72 61 74 69  * If the operati
22930 6f 6e 20 69 73 20 61 20 64 65 6c 65 74 65 2c 20  on is a delete, 
22940 69 74 20 6d 75 73 74 20 62 65 20 63 61 6c 6c 65  it must be calle
22950 64 20 28 61 74 20 6c 65 61 73 74 29 20 6f 6e 63  d (at least) onc
22960 65 20 66 6f 72 20 65 61 63 68 0a 2a 2a 20 75 6e  e for each.** un
22970 69 71 75 65 20 74 6f 6b 65 6e 20 69 6e 20 74 68  ique token in th
22980 65 20 64 6f 63 75 6d 65 6e 74 20 77 69 74 68 20  e document with 
22990 61 6e 20 69 43 6f 6c 20 76 61 6c 75 65 20 6c 65  an iCol value le
229a0 73 73 20 74 68 61 6e 20 7a 65 72 6f 2e 20 54 68  ss than zero. Th
229b0 65 20 69 50 6f 73 0a 2a 2a 20 61 72 67 75 6d 65  e iPos.** argume
229c0 6e 74 20 69 73 20 69 67 6e 6f 72 65 64 20 66 6f  nt is ignored fo
229d0 72 20 61 20 64 65 6c 65 74 65 2e 0a 2a 2f 0a 69  r a delete..*/.i
229e0 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e  nt sqlite3Fts5In
229f0 64 65 78 57 72 69 74 65 28 0a 20 20 46 74 73 35  dexWrite(.  Fts5
22a00 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20  Index *p,       
22a10 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
22a20 6e 64 65 78 20 74 6f 20 77 72 69 74 65 20 74 6f  ndex to write to
22a30 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 2c 20   */.  int iCol, 
22a40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22a50 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20        /* Column 
22a60 74 6f 6b 65 6e 20 61 70 70 65 61 72 73 20 69 6e  token appears in
22a70 20 28 2d 76 65 20 2d 3e 20 64 65 6c 65 74 65 29   (-ve -> delete)
22a80 20 2a 2f 0a 20 20 69 6e 74 20 69 50 6f 73 2c 20   */.  int iPos, 
22a90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22aa0 20 20 20 20 20 20 2f 2a 20 50 6f 73 69 74 69 6f        /* Positio
22ab0 6e 20 6f 66 20 74 6f 6b 65 6e 20 77 69 74 68 69  n of token withi
22ac0 6e 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 63 6f  n column */.  co
22ad0 6e 73 74 20 63 68 61 72 20 2a 70 54 6f 6b 65 6e  nst char *pToken
22ae0 2c 20 69 6e 74 20 6e 54 6f 6b 65 6e 20 20 2f 2a  , int nToken  /*
22af0 20 54 6f 6b 65 6e 20 74 6f 20 61 64 64 20 6f 72   Token to add or
22b00 20 72 65 6d 6f 76 65 20 74 6f 20 6f 72 20 66 72   remove to or fr
22b10 6f 6d 20 69 6e 64 65 78 20 2a 2f 0a 29 7b 0a 20  om index */.){. 
22b20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20   int i;         
22b30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22b40 20 2f 2a 20 55 73 65 64 20 74 6f 20 69 74 65 72   /* Used to iter
22b50 61 74 65 20 74 68 72 6f 75 67 68 20 69 6e 64 65  ate through inde
22b60 78 65 73 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20  xes */.  int rc 
22b70 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20  = SQLITE_OK;    
22b80 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
22b90 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 46 74 73  rn code */.  Fts
22ba0 35 43 6f 6e 66 69 67 20 2a 70 43 6f 6e 66 69 67  5Config *pConfig
22bb0 20 3d 20 70 2d 3e 70 43 6f 6e 66 69 67 3b 0a 0a   = p->pConfig;..
22bc0 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72 63 3d    assert( p->rc=
22bd0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 0a 20  =SQLITE_OK );.. 
22be0 20 2f 2a 20 41 64 64 20 74 68 65 20 65 6e 74 72   /* Add the entr
22bf0 79 20 74 6f 20 74 68 65 20 6d 61 69 6e 20 74 65  y to the main te
22c00 72 6d 73 20 69 6e 64 65 78 2e 20 2a 2f 0a 20 20  rms index. */.  
22c10 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74 73 35  rc = sqlite3Fts5
22c20 48 61 73 68 57 72 69 74 65 28 0a 20 20 20 20 20  HashWrite(.     
22c30 20 70 2d 3e 70 48 61 73 68 2c 20 70 2d 3e 69 57   p->pHash, p->iW
22c40 72 69 74 65 52 6f 77 69 64 2c 20 69 43 6f 6c 2c  riteRowid, iCol,
22c50 20 69 50 6f 73 2c 20 46 54 53 35 5f 4d 41 49 4e   iPos, FTS5_MAIN
22c60 5f 50 52 45 46 49 58 2c 20 70 54 6f 6b 65 6e 2c  _PREFIX, pToken,
22c70 20 6e 54 6f 6b 65 6e 0a 20 20 29 3b 0a 0a 20 20   nToken.  );..  
22c80 66 6f 72 28 69 3d 30 3b 20 69 3c 70 43 6f 6e 66  for(i=0; i<pConf
22c90 69 67 2d 3e 6e 50 72 65 66 69 78 20 26 26 20 72  ig->nPrefix && r
22ca0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20 69 2b  c==SQLITE_OK; i+
22cb0 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6e 42 79 74  +){.    int nByt
22cc0 65 20 3d 20 66 74 73 35 49 6e 64 65 78 43 68 61  e = fts5IndexCha
22cd0 72 6c 65 6e 54 6f 42 79 74 65 6c 65 6e 28 70 54  rlenToBytelen(pT
22ce0 6f 6b 65 6e 2c 20 6e 54 6f 6b 65 6e 2c 20 70 43  oken, nToken, pC
22cf0 6f 6e 66 69 67 2d 3e 61 50 72 65 66 69 78 5b 69  onfig->aPrefix[i
22d00 5d 29 3b 0a 20 20 20 20 69 66 28 20 6e 42 79 74  ]);.    if( nByt
22d10 65 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  e ){.      rc = 
22d20 73 71 6c 69 74 65 33 46 74 73 35 48 61 73 68 57  sqlite3Fts5HashW
22d30 72 69 74 65 28 70 2d 3e 70 48 61 73 68 2c 20 0a  rite(p->pHash, .
22d40 20 20 20 20 20 20 20 20 20 20 70 2d 3e 69 57 72            p->iWr
22d50 69 74 65 52 6f 77 69 64 2c 20 69 43 6f 6c 2c 20  iteRowid, iCol, 
22d60 69 50 6f 73 2c 20 46 54 53 35 5f 4d 41 49 4e 5f  iPos, FTS5_MAIN_
22d70 50 52 45 46 49 58 2b 69 2b 31 2c 20 70 54 6f 6b  PREFIX+i+1, pTok
22d80 65 6e 2c 20 6e 42 79 74 65 0a 20 20 20 20 20 20  en, nByte.      
22d90 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
22da0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
22db0 0a 2a 2a 20 4f 70 65 6e 20 61 20 6e 65 77 20 69  .** Open a new i
22dc0 74 65 72 61 74 6f 72 20 74 6f 20 69 74 65 72 61  terator to itera
22dd0 74 65 20 74 68 6f 75 67 68 20 61 6c 6c 20 72 6f  te though all ro
22de0 77 69 64 20 74 68 61 74 20 6d 61 74 63 68 20 74  wid that match t
22df0 68 65 20 0a 2a 2a 20 73 70 65 63 69 66 69 65 64  he .** specified
22e00 20 74 6f 6b 65 6e 20 6f 72 20 74 6f 6b 65 6e 20   token or token 
22e10 70 72 65 66 69 78 2e 0a 2a 2f 0a 69 6e 74 20 73  prefix..*/.int s
22e20 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78 51  qlite3Fts5IndexQ
22e30 75 65 72 79 28 0a 20 20 46 74 73 35 49 6e 64 65  uery(.  Fts5Inde
22e40 78 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  x *p,           
22e50 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53 20 69          /* FTS i
22e60 6e 64 65 78 20 74 6f 20 71 75 65 72 79 20 2a 2f  ndex to query */
22e70 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 70  .  const char *p
22e80 54 6f 6b 65 6e 2c 20 69 6e 74 20 6e 54 6f 6b 65  Token, int nToke
22e90 6e 2c 20 2f 2a 20 54 6f 6b 65 6e 20 28 6f 72 20  n, /* Token (or 
22ea0 70 72 65 66 69 78 29 20 74 6f 20 71 75 65 72 79  prefix) to query
22eb0 20 66 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 66 6c   for */.  int fl
22ec0 61 67 73 2c 20 20 20 20 20 20 20 20 20 20 20 20  ags,            
22ed0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73            /* Mas
22ee0 6b 20 6f 66 20 46 54 53 35 49 4e 44 45 58 5f 51  k of FTS5INDEX_Q
22ef0 55 45 52 59 5f 58 20 66 6c 61 67 73 20 2a 2f 0a  UERY_X flags */.
22f00 20 20 46 74 73 35 49 6e 64 65 78 49 74 65 72 20    Fts5IndexIter 
22f10 2a 2a 70 70 49 74 65 72 20 20 20 20 20 20 20 20  **ppIter        
22f20 20 20 2f 2a 20 4f 55 54 3a 20 4e 65 77 20 69 74    /* OUT: New it
22f30 65 72 61 74 6f 72 20 6f 62 6a 65 63 74 20 2a 2f  erator object */
22f40 0a 29 7b 0a 20 20 46 74 73 35 43 6f 6e 66 69 67  .){.  Fts5Config
22f50 20 2a 70 43 6f 6e 66 69 67 20 3d 20 70 2d 3e 70   *pConfig = p->p
22f60 43 6f 6e 66 69 67 3b 0a 20 20 46 74 73 35 49 6e  Config;.  Fts5In
22f70 64 65 78 49 74 65 72 20 2a 70 52 65 74 20 3d 20  dexIter *pRet = 
22f80 30 3b 0a 20 20 69 6e 74 20 69 49 64 78 20 3d 20  0;.  int iIdx = 
22f90 30 3b 0a 20 20 46 74 73 35 42 75 66 66 65 72 20  0;.  Fts5Buffer 
22fa0 62 75 66 20 3d 20 7b 30 2c 20 30 2c 20 30 7d 3b  buf = {0, 0, 0};
22fb0 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 51 55  ..  /* If the QU
22fc0 45 52 59 5f 53 43 41 4e 20 66 6c 61 67 20 69 73  ERY_SCAN flag is
22fd0 20 73 65 74 2c 20 61 6c 6c 20 6f 74 68 65 72 20   set, all other 
22fe0 66 6c 61 67 73 20 6d 75 73 74 20 62 65 20 63 6c  flags must be cl
22ff0 65 61 72 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74  ear. */.  assert
23000 28 20 28 66 6c 61 67 73 20 26 20 46 54 53 35 49  ( (flags & FTS5I
23010 4e 44 45 58 5f 51 55 45 52 59 5f 53 43 41 4e 29  NDEX_QUERY_SCAN)
23020 3d 3d 30 0a 20 20 20 20 20 20 20 7c 7c 20 28 66  ==0.       || (f
23030 6c 61 67 73 20 26 20 46 54 53 35 49 4e 44 45 58  lags & FTS5INDEX
23040 5f 51 55 45 52 59 5f 53 43 41 4e 29 3d 3d 46 54  _QUERY_SCAN)==FT
23050 53 35 49 4e 44 45 58 5f 51 55 45 52 59 5f 53 43  S5INDEX_QUERY_SC
23060 41 4e 0a 20 20 29 3b 0a 0a 20 20 69 66 28 20 73  AN.  );..  if( s
23070 71 6c 69 74 65 33 46 74 73 35 42 75 66 66 65 72  qlite3Fts5Buffer
23080 47 72 6f 77 28 26 70 2d 3e 72 63 2c 20 26 62 75  Grow(&p->rc, &bu
23090 66 2c 20 6e 54 6f 6b 65 6e 2b 31 29 3d 3d 30 20  f, nToken+1)==0 
230a0 29 7b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 62  ){.    memcpy(&b
230b0 75 66 2e 70 5b 31 5d 2c 20 70 54 6f 6b 65 6e 2c  uf.p[1], pToken,
230c0 20 6e 54 6f 6b 65 6e 29 3b 0a 0a 23 69 66 64 65   nToken);..#ifde
230d0 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
230e0 20 20 20 2f 2a 20 49 66 20 74 68 65 20 51 55 45     /* If the QUE
230f0 52 59 5f 54 45 53 54 5f 4e 4f 49 44 58 20 66 6c  RY_TEST_NOIDX fl
23100 61 67 20 77 61 73 20 73 70 65 63 69 66 69 65 64  ag was specified
23110 2c 20 74 68 65 6e 20 74 68 69 73 20 6d 75 73 74  , then this must
23120 20 62 65 20 61 0a 20 20 20 20 2a 2a 20 70 72 65   be a.    ** pre
23130 66 69 78 2d 71 75 65 72 79 2e 20 49 6e 73 74 65  fix-query. Inste
23140 61 64 20 6f 66 20 75 73 69 6e 67 20 61 20 70 72  ad of using a pr
23150 65 66 69 78 2d 69 6e 64 65 78 20 28 69 66 20 6f  efix-index (if o
23160 6e 65 20 65 78 69 73 74 73 29 2c 20 0a 20 20 20  ne exists), .   
23170 20 2a 2a 20 65 76 61 6c 75 61 74 65 20 74 68 65   ** evaluate the
23180 20 70 72 65 66 69 78 20 71 75 65 72 79 20 75 73   prefix query us
23190 69 6e 67 20 74 68 65 20 6d 61 69 6e 20 46 54 53  ing the main FTS
231a0 20 69 6e 64 65 78 2e 20 54 68 69 73 20 69 73 20   index. This is 
231b0 75 73 65 64 0a 20 20 20 20 2a 2a 20 66 6f 72 20  used.    ** for 
231c0 69 6e 74 65 72 6e 61 6c 20 73 61 6e 69 74 79 20  internal sanity 
231d0 63 68 65 63 6b 69 6e 67 20 62 79 20 74 68 65 20  checking by the 
231e0 69 6e 74 65 67 72 69 74 79 2d 63 68 65 63 6b 20  integrity-check 
231f0 69 6e 20 64 65 62 75 67 20 0a 20 20 20 20 2a 2a  in debug .    **
23200 20 6d 6f 64 65 20 6f 6e 6c 79 2e 20 20 2a 2f 0a   mode only.  */.
23210 20 20 20 20 69 66 28 20 66 6c 61 67 73 20 26 20      if( flags & 
23220 46 54 53 35 49 4e 44 45 58 5f 51 55 45 52 59 5f  FTS5INDEX_QUERY_
23230 54 45 53 54 5f 4e 4f 49 44 58 20 29 7b 0a 20 20  TEST_NOIDX ){.  
23240 20 20 20 20 61 73 73 65 72 74 28 20 66 6c 61 67      assert( flag
23250 73 20 26 20 46 54 53 35 49 4e 44 45 58 5f 51 55  s & FTS5INDEX_QU
23260 45 52 59 5f 50 52 45 46 49 58 20 29 3b 0a 20 20  ERY_PREFIX );.  
23270 20 20 20 20 69 49 64 78 20 3d 20 31 2b 70 43 6f      iIdx = 1+pCo
23280 6e 66 69 67 2d 3e 6e 50 72 65 66 69 78 3b 0a 20  nfig->nPrefix;. 
23290 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a     }else.#endif.
232a0 20 20 20 20 69 66 28 20 66 6c 61 67 73 20 26 20      if( flags & 
232b0 46 54 53 35 49 4e 44 45 58 5f 51 55 45 52 59 5f  FTS5INDEX_QUERY_
232c0 50 52 45 46 49 58 20 29 7b 0a 20 20 20 20 20 20  PREFIX ){.      
232d0 69 6e 74 20 6e 43 68 61 72 20 3d 20 66 74 73 35  int nChar = fts5
232e0 49 6e 64 65 78 43 68 61 72 6c 65 6e 28 70 54 6f  IndexCharlen(pTo
232f0 6b 65 6e 2c 20 6e 54 6f 6b 65 6e 29 3b 0a 20 20  ken, nToken);.  
23300 20 20 20 20 66 6f 72 28 69 49 64 78 3d 31 3b 20      for(iIdx=1; 
23310 69 49 64 78 3c 3d 70 43 6f 6e 66 69 67 2d 3e 6e  iIdx<=pConfig->n
23320 50 72 65 66 69 78 3b 20 69 49 64 78 2b 2b 29 7b  Prefix; iIdx++){
23330 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 43 6f  .        if( pCo
23340 6e 66 69 67 2d 3e 61 50 72 65 66 69 78 5b 69 49  nfig->aPrefix[iI
23350 64 78 2d 31 5d 3d 3d 6e 43 68 61 72 20 29 20 62  dx-1]==nChar ) b
23360 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
23370 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 69 49 64    }..    if( iId
23380 78 3c 3d 70 43 6f 6e 66 69 67 2d 3e 6e 50 72 65  x<=pConfig->nPre
23390 66 69 78 20 29 7b 0a 20 20 20 20 20 20 46 74 73  fix ){.      Fts
233a0 35 53 74 72 75 63 74 75 72 65 20 2a 70 53 74 72  5Structure *pStr
233b0 75 63 74 20 3d 20 66 74 73 35 53 74 72 75 63 74  uct = fts5Struct
233c0 75 72 65 52 65 61 64 28 70 29 3b 0a 20 20 20 20  ureRead(p);.    
233d0 20 20 62 75 66 2e 70 5b 30 5d 20 3d 20 46 54 53    buf.p[0] = FTS
233e0 35 5f 4d 41 49 4e 5f 50 52 45 46 49 58 20 2b 20  5_MAIN_PREFIX + 
233f0 69 49 64 78 3b 0a 20 20 20 20 20 20 69 66 28 20  iIdx;.      if( 
23400 70 53 74 72 75 63 74 20 29 7b 0a 20 20 20 20 20  pStruct ){.     
23410 20 20 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72     fts5MultiIter
23420 4e 65 77 28 70 2c 20 70 53 74 72 75 63 74 2c 20  New(p, pStruct, 
23430 31 2c 20 66 6c 61 67 73 2c 20 62 75 66 2e 70 2c  1, flags, buf.p,
23440 20 6e 54 6f 6b 65 6e 2b 31 2c 20 2d 31 2c 20 30   nToken+1, -1, 0
23450 2c 20 26 70 52 65 74 29 3b 0a 20 20 20 20 20 20  , &pRet);.      
23460 20 20 66 74 73 35 53 74 72 75 63 74 75 72 65 52    fts5StructureR
23470 65 6c 65 61 73 65 28 70 53 74 72 75 63 74 29 3b  elease(pStruct);
23480 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
23490 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 62 44  se{.      int bD
234a0 65 73 63 20 3d 20 28 66 6c 61 67 73 20 26 20 46  esc = (flags & F
234b0 54 53 35 49 4e 44 45 58 5f 51 55 45 52 59 5f 44  TS5INDEX_QUERY_D
234c0 45 53 43 29 21 3d 30 3b 0a 20 20 20 20 20 20 62  ESC)!=0;.      b
234d0 75 66 2e 70 5b 30 5d 20 3d 20 46 54 53 35 5f 4d  uf.p[0] = FTS5_M
234e0 41 49 4e 5f 50 52 45 46 49 58 3b 0a 20 20 20 20  AIN_PREFIX;.    
234f0 20 20 66 74 73 35 53 65 74 75 70 50 72 65 66 69    fts5SetupPrefi
23500 78 49 74 65 72 28 70 2c 20 62 44 65 73 63 2c 20  xIter(p, bDesc, 
23510 62 75 66 2e 70 2c 20 6e 54 6f 6b 65 6e 2b 31 2c  buf.p, nToken+1,
23520 20 26 70 52 65 74 29 3b 0a 20 20 20 20 7d 0a 0a   &pRet);.    }..
23530 20 20 20 20 69 66 28 20 70 2d 3e 72 63 20 29 7b      if( p->rc ){
23540 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 46 74  .      sqlite3Ft
23550 73 35 49 74 65 72 43 6c 6f 73 65 28 70 52 65 74  s5IterClose(pRet
23560 29 3b 0a 20 20 20 20 20 20 70 52 65 74 20 3d 20  );.      pRet = 
23570 30 3b 0a 20 20 20 20 20 20 66 74 73 35 43 6c 6f  0;.      fts5Clo
23580 73 65 52 65 61 64 65 72 28 70 29 3b 0a 20 20 20  seReader(p);.   
23590 20 7d 0a 20 20 20 20 2a 70 70 49 74 65 72 20 3d   }.    *ppIter =
235a0 20 70 52 65 74 3b 0a 20 20 20 20 73 71 6c 69 74   pRet;.    sqlit
235b0 65 33 46 74 73 35 42 75 66 66 65 72 46 72 65 65  e3Fts5BufferFree
235c0 28 26 62 75 66 29 3b 0a 20 20 7d 0a 20 20 72 65  (&buf);.  }.  re
235d0 74 75 72 6e 20 66 74 73 35 49 6e 64 65 78 52 65  turn fts5IndexRe
235e0 74 75 72 6e 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn(p);.}../*.*
235f0 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66  * Return true if
23600 20 74 68 65 20 69 74 65 72 61 74 6f 72 20 70 61   the iterator pa
23610 73 73 65 64 20 61 73 20 74 68 65 20 6f 6e 6c 79  ssed as the only
23620 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61 74 20   argument is at 
23630 45 4f 46 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  EOF..*/.int sqli
23640 74 65 33 46 74 73 35 49 74 65 72 45 6f 66 28 46  te3Fts5IterEof(F
23650 74 73 35 49 6e 64 65 78 49 74 65 72 20 2a 70 49  ts5IndexIter *pI
23660 74 65 72 29 7b 0a 20 20 61 73 73 65 72 74 28 20  ter){.  assert( 
23670 70 49 74 65 72 2d 3e 70 49 6e 64 65 78 2d 3e 72  pIter->pIndex->r
23680 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  c==SQLITE_OK );.
23690 20 20 72 65 74 75 72 6e 20 70 49 74 65 72 2d 3e    return pIter->
236a0 62 45 6f 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d  bEof;.}../*.** M
236b0 6f 76 65 20 74 6f 20 74 68 65 20 6e 65 78 74 20  ove to the next 
236c0 6d 61 74 63 68 69 6e 67 20 72 6f 77 69 64 2e 20  matching rowid. 
236d0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46  .*/.int sqlite3F
236e0 74 73 35 49 74 65 72 4e 65 78 74 28 46 74 73 35  ts5IterNext(Fts5
236f0 49 6e 64 65 78 49 74 65 72 20 2a 70 49 74 65 72  IndexIter *pIter
23700 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 49 74  ){.  assert( pIt
23710 65 72 2d 3e 70 49 6e 64 65 78 2d 3e 72 63 3d 3d  er->pIndex->rc==
23720 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 66  SQLITE_OK );.  f
23730 74 73 35 4d 75 6c 74 69 49 74 65 72 4e 65 78 74  ts5MultiIterNext
23740 28 70 49 74 65 72 2d 3e 70 49 6e 64 65 78 2c 20  (pIter->pIndex, 
23750 70 49 74 65 72 2c 20 30 2c 20 30 29 3b 0a 20 20  pIter, 0, 0);.  
23760 72 65 74 75 72 6e 20 66 74 73 35 49 6e 64 65 78  return fts5Index
23770 52 65 74 75 72 6e 28 70 49 74 65 72 2d 3e 70 49  Return(pIter->pI
23780 6e 64 65 78 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ndex);.}../*.** 
23790 4d 6f 76 65 20 74 6f 20 74 68 65 20 6e 65 78 74  Move to the next
237a0 20 6d 61 74 63 68 69 6e 67 20 74 65 72 6d 2f 72   matching term/r
237b0 6f 77 69 64 2e 20 55 73 65 64 20 62 79 20 74 68  owid. Used by th
237c0 65 20 66 74 73 35 76 6f 63 61 62 20 6d 6f 64 75  e fts5vocab modu
237d0 6c 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  le..*/.int sqlit
237e0 65 33 46 74 73 35 49 74 65 72 4e 65 78 74 53 63  e3Fts5IterNextSc
237f0 61 6e 28 46 74 73 35 49 6e 64 65 78 49 74 65 72  an(Fts5IndexIter
23800 20 2a 70 49 74 65 72 29 7b 0a 20 20 46 74 73 35   *pIter){.  Fts5
23810 49 6e 64 65 78 20 2a 70 20 3d 20 70 49 74 65 72  Index *p = pIter
23820 2d 3e 70 49 6e 64 65 78 3b 0a 0a 20 20 61 73 73  ->pIndex;..  ass
23830 65 72 74 28 20 70 49 74 65 72 2d 3e 70 49 6e 64  ert( pIter->pInd
23840 65 78 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  ex->rc==SQLITE_O
23850 4b 20 29 3b 0a 0a 20 20 66 74 73 35 4d 75 6c 74  K );..  fts5Mult
23860 69 49 74 65 72 4e 65 78 74 28 70 2c 20 70 49 74  iIterNext(p, pIt
23870 65 72 2c 20 30 2c 20 30 29 3b 0a 20 20 69 66 28  er, 0, 0);.  if(
23880 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
23890 4b 20 29 7b 0a 20 20 20 20 46 74 73 35 53 65 67  K ){.    Fts5Seg
238a0 49 74 65 72 20 2a 70 53 65 67 20 3d 20 26 70 49  Iter *pSeg = &pI
238b0 74 65 72 2d 3e 61 53 65 67 5b 20 70 49 74 65 72  ter->aSeg[ pIter
238c0 2d 3e 61 46 69 72 73 74 5b 31 5d 2e 69 46 69 72  ->aFirst[1].iFir
238d0 73 74 20 5d 3b 0a 20 20 20 20 69 66 28 20 70 53  st ];.    if( pS
238e0 65 67 2d 3e 70 4c 65 61 66 20 26 26 20 70 53 65  eg->pLeaf && pSe
238f0 67 2d 3e 74 65 72 6d 2e 70 5b 30 5d 21 3d 46 54  g->term.p[0]!=FT
23900 53 35 5f 4d 41 49 4e 5f 50 52 45 46 49 58 20 29  S5_MAIN_PREFIX )
23910 7b 0a 20 20 20 20 20 20 66 74 73 35 44 61 74 61  {.      fts5Data
23920 52 65 6c 65 61 73 65 28 70 53 65 67 2d 3e 70 4c  Release(pSeg->pL
23930 65 61 66 29 3b 0a 20 20 20 20 20 20 70 53 65 67  eaf);.      pSeg
23940 2d 3e 70 4c 65 61 66 20 3d 20 30 3b 0a 20 20 20  ->pLeaf = 0;.   
23950 20 20 20 70 49 74 65 72 2d 3e 62 45 6f 66 20 3d     pIter->bEof =
23960 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20   1;.    }.  }.. 
23970 20 72 65 74 75 72 6e 20 66 74 73 35 49 6e 64 65   return fts5Inde
23980 78 52 65 74 75 72 6e 28 70 49 74 65 72 2d 3e 70  xReturn(pIter->p
23990 49 6e 64 65 78 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  Index);.}../*.**
239a0 20 4d 6f 76 65 20 74 6f 20 74 68 65 20 6e 65 78   Move to the nex
239b0 74 20 6d 61 74 63 68 69 6e 67 20 72 6f 77 69 64  t matching rowid
239c0 20 74 68 61 74 20 6f 63 63 75 72 73 20 61 74 20   that occurs at 
239d0 6f 72 20 61 66 74 65 72 20 69 4d 61 74 63 68 2e  or after iMatch.
239e0 20 54 68 65 0a 2a 2a 20 64 65 66 69 6e 69 74 69   The.** definiti
239f0 6f 6e 20 6f 66 20 22 61 74 20 6f 72 20 61 66 74  on of "at or aft
23a00 65 72 22 20 64 65 70 65 6e 64 73 20 6f 6e 20 77  er" depends on w
23a10 68 65 74 68 65 72 20 74 68 69 73 20 69 74 65 72  hether this iter
23a20 61 74 6f 72 20 69 74 65 72 61 74 65 73 0a 2a 2a  ator iterates.**
23a30 20 69 6e 20 61 73 63 65 6e 64 69 6e 67 20 6f 72   in ascending or
23a40 20 64 65 73 63 65 6e 64 69 6e 67 20 72 6f 77 69   descending rowi
23a50 64 20 6f 72 64 65 72 2e 0a 2a 2f 0a 69 6e 74 20  d order..*/.int 
23a60 73 71 6c 69 74 65 33 46 74 73 35 49 74 65 72 4e  sqlite3Fts5IterN
23a70 65 78 74 46 72 6f 6d 28 46 74 73 35 49 6e 64 65  extFrom(Fts5Inde
23a80 78 49 74 65 72 20 2a 70 49 74 65 72 2c 20 69 36  xIter *pIter, i6
23a90 34 20 69 4d 61 74 63 68 29 7b 0a 20 20 66 74 73  4 iMatch){.  fts
23aa0 35 4d 75 6c 74 69 49 74 65 72 4e 65 78 74 46 72  5MultiIterNextFr
23ab0 6f 6d 28 70 49 74 65 72 2d 3e 70 49 6e 64 65 78  om(pIter->pIndex
23ac0 2c 20 70 49 74 65 72 2c 20 69 4d 61 74 63 68 29  , pIter, iMatch)
23ad0 3b 0a 20 20 72 65 74 75 72 6e 20 66 74 73 35 49  ;.  return fts5I
23ae0 6e 64 65 78 52 65 74 75 72 6e 28 70 49 74 65 72  ndexReturn(pIter
23af0 2d 3e 70 49 6e 64 65 78 29 3b 0a 7d 0a 0a 2f 2a  ->pIndex);.}../*
23b00 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 63  .** Return the c
23b10 75 72 72 65 6e 74 20 72 6f 77 69 64 2e 0a 2a 2f  urrent rowid..*/
23b20 0a 69 36 34 20 73 71 6c 69 74 65 33 46 74 73 35  .i64 sqlite3Fts5
23b30 49 74 65 72 52 6f 77 69 64 28 46 74 73 35 49 6e  IterRowid(Fts5In
23b40 64 65 78 49 74 65 72 20 2a 70 49 74 65 72 29 7b  dexIter *pIter){
23b50 0a 20 20 72 65 74 75 72 6e 20 66 74 73 35 4d 75  .  return fts5Mu
23b60 6c 74 69 49 74 65 72 52 6f 77 69 64 28 70 49 74  ltiIterRowid(pIt
23b70 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  er);.}../*.** Re
23b80 74 75 72 6e 20 74 68 65 20 63 75 72 72 65 6e 74  turn the current
23b90 20 74 65 72 6d 2e 0a 2a 2f 0a 63 6f 6e 73 74 20   term..*/.const 
23ba0 63 68 61 72 20 2a 73 71 6c 69 74 65 33 46 74 73  char *sqlite3Fts
23bb0 35 49 74 65 72 54 65 72 6d 28 46 74 73 35 49 6e  5IterTerm(Fts5In
23bc0 64 65 78 49 74 65 72 20 2a 70 49 74 65 72 2c 20  dexIter *pIter, 
23bd0 69 6e 74 20 2a 70 6e 29 7b 0a 20 20 69 6e 74 20  int *pn){.  int 
23be0 6e 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  n;.  const char 
23bf0 2a 7a 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72  *z = (const char
23c00 2a 29 66 74 73 35 4d 75 6c 74 69 49 74 65 72 54  *)fts5MultiIterT
23c10 65 72 6d 28 70 49 74 65 72 2c 20 26 6e 29 3b 0a  erm(pIter, &n);.
23c20 20 20 2a 70 6e 20 3d 20 6e 2d 31 3b 0a 20 20 72    *pn = n-1;.  r
23c30 65 74 75 72 6e 20 26 7a 5b 31 5d 3b 0a 7d 0a 0a  eturn &z[1];.}..
23c40 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20  ./*.** Return a 
23c50 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 62 75 66  pointer to a buf
23c60 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 61  fer containing a
23c70 20 63 6f 70 79 20 6f 66 20 74 68 65 20 70 6f 73   copy of the pos
23c80 69 74 69 6f 6e 20 6c 69 73 74 20 66 6f 72 0a 2a  ition list for.*
23c90 2a 20 74 68 65 20 63 75 72 72 65 6e 74 20 65 6e  * the current en
23ca0 74 72 79 2e 20 4f 75 74 70 75 74 20 76 61 72 69  try. Output vari
23cb0 61 62 6c 65 20 2a 70 6e 20 69 73 20 73 65 74 20  able *pn is set 
23cc0 74 6f 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  to the size of t
23cd0 68 65 20 62 75 66 66 65 72 20 0a 2a 2a 20 69 6e  he buffer .** in
23ce0 20 62 79 74 65 73 20 62 65 66 6f 72 65 20 72 65   bytes before re
23cf0 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54  turning..**.** T
23d00 68 65 20 72 65 74 75 72 6e 65 64 20 70 6f 73 69  he returned posi
23d10 74 69 6f 6e 20 6c 69 73 74 20 64 6f 65 73 20 6e  tion list does n
23d20 6f 74 20 69 6e 63 6c 75 64 65 20 74 68 65 20 22  ot include the "
23d30 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 22  number of bytes"
23d40 20 76 61 72 69 6e 74 0a 2a 2a 20 66 69 65 6c 64   varint.** field
23d50 20 74 68 61 74 20 73 74 61 72 74 73 20 74 68 65   that starts the
23d60 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74 20 6f   position list o
23d70 6e 20 64 69 73 6b 2e 0a 2a 2f 0a 69 6e 74 20 73  n disk..*/.int s
23d80 71 6c 69 74 65 33 46 74 73 35 49 74 65 72 50 6f  qlite3Fts5IterPo
23d90 73 6c 69 73 74 28 0a 20 20 46 74 73 35 49 6e 64  slist(.  Fts5Ind
23da0 65 78 49 74 65 72 20 2a 70 49 74 65 72 2c 20 0a  exIter *pIter, .
23db0 20 20 63 6f 6e 73 74 20 75 38 20 2a 2a 70 70 2c    const u8 **pp,
23dc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23dd0 20 20 2f 2a 20 4f 55 54 3a 20 50 6f 69 6e 74 65    /* OUT: Pointe
23de0 72 20 74 6f 20 70 6f 73 69 74 69 6f 6e 2d 6c 69  r to position-li
23df0 73 74 20 64 61 74 61 20 2a 2f 0a 20 20 69 6e 74  st data */.  int
23e00 20 2a 70 6e 2c 20 20 20 20 20 20 20 20 20 20 20   *pn,           
23e10 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
23e20 4f 55 54 3a 20 53 69 7a 65 20 6f 66 20 70 6f 73  OUT: Size of pos
23e30 69 74 69 6f 6e 2d 6c 69 73 74 20 69 6e 20 62 79  ition-list in by
23e40 74 65 73 20 2a 2f 0a 20 20 69 36 34 20 2a 70 69  tes */.  i64 *pi
23e50 52 6f 77 69 64 20 20 20 20 20 20 20 20 20 20 20  Rowid           
23e60 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a           /* OUT:
23e70 20 43 75 72 72 65 6e 74 20 72 6f 77 69 64 20 2a   Current rowid *
23e80 2f 0a 29 7b 0a 20 20 46 74 73 35 53 65 67 49 74  /.){.  Fts5SegIt
23e90 65 72 20 2a 70 53 65 67 20 3d 20 26 70 49 74 65  er *pSeg = &pIte
23ea0 72 2d 3e 61 53 65 67 5b 20 70 49 74 65 72 2d 3e  r->aSeg[ pIter->
23eb0 61 46 69 72 73 74 5b 31 5d 2e 69 46 69 72 73 74  aFirst[1].iFirst
23ec0 20 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70 49   ];.  assert( pI
23ed0 74 65 72 2d 3e 70 49 6e 64 65 78 2d 3e 72 63 3d  ter->pIndex->rc=
23ee0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20  =SQLITE_OK );.  
23ef0 2a 70 69 52 6f 77 69 64 20 3d 20 70 53 65 67 2d  *piRowid = pSeg-
23f00 3e 69 52 6f 77 69 64 3b 0a 20 20 2a 70 6e 20 3d  >iRowid;.  *pn =
23f10 20 70 53 65 67 2d 3e 6e 50 6f 73 3b 0a 20 20 69   pSeg->nPos;.  i
23f20 66 28 20 70 53 65 67 2d 3e 69 4c 65 61 66 4f 66  f( pSeg->iLeafOf
23f30 66 73 65 74 2b 70 53 65 67 2d 3e 6e 50 6f 73 20  fset+pSeg->nPos 
23f40 3c 3d 20 70 53 65 67 2d 3e 70 4c 65 61 66 2d 3e  <= pSeg->pLeaf->
23f50 73 7a 4c 65 61 66 20 29 7b 0a 20 20 20 20 2a 70  szLeaf ){.    *p
23f60 70 20 3d 20 26 70 53 65 67 2d 3e 70 4c 65 61 66  p = &pSeg->pLeaf
23f70 2d 3e 70 5b 70 53 65 67 2d 3e 69 4c 65 61 66 4f  ->p[pSeg->iLeafO
23f80 66 66 73 65 74 5d 3b 0a 20 20 7d 65 6c 73 65 7b  ffset];.  }else{
23f90 0a 20 20 20 20 66 74 73 35 42 75 66 66 65 72 5a  .    fts5BufferZ
23fa0 65 72 6f 28 26 70 49 74 65 72 2d 3e 70 6f 73 6c  ero(&pIter->posl
23fb0 69 73 74 29 3b 0a 20 20 20 20 66 74 73 35 53 65  ist);.    fts5Se
23fc0 67 69 74 65 72 50 6f 73 6c 69 73 74 28 70 49 74  giterPoslist(pIt
23fd0 65 72 2d 3e 70 49 6e 64 65 78 2c 20 70 53 65 67  er->pIndex, pSeg
23fe0 2c 20 26 70 49 74 65 72 2d 3e 70 6f 73 6c 69 73  , &pIter->poslis
23ff0 74 29 3b 0a 20 20 20 20 2a 70 70 20 3d 20 70 49  t);.    *pp = pI
24000 74 65 72 2d 3e 70 6f 73 6c 69 73 74 2e 70 3b 0a  ter->poslist.p;.
24010 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 66 74 73    }.  return fts
24020 35 49 6e 64 65 78 52 65 74 75 72 6e 28 70 49 74  5IndexReturn(pIt
24030 65 72 2d 3e 70 49 6e 64 65 78 29 3b 0a 7d 0a 0a  er->pIndex);.}..
24040 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
24050 69 6f 6e 20 69 73 20 73 69 6d 69 6c 61 72 20 74  ion is similar t
24060 6f 20 73 71 6c 69 74 65 33 46 74 73 35 49 74 65  o sqlite3Fts5Ite
24070 72 50 6f 73 6c 69 73 74 28 29 2c 20 65 78 63 65  rPoslist(), exce
24080 70 74 20 74 68 61 74 20 69 74 0a 2a 2a 20 63 6f  pt that it.** co
24090 70 69 65 73 20 74 68 65 20 70 6f 73 69 74 69 6f  pies the positio
240a0 6e 20 6c 69 73 74 20 69 6e 74 6f 20 74 68 65 20  n list into the 
240b0 62 75 66 66 65 72 20 73 75 70 70 6c 69 65 64 20  buffer supplied 
240c0 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 0a 2a  as the second .*
240d0 2a 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 69  * argument..*/.i
240e0 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 49 74  nt sqlite3Fts5It
240f0 65 72 50 6f 73 6c 69 73 74 42 75 66 66 65 72 28  erPoslistBuffer(
24100 46 74 73 35 49 6e 64 65 78 49 74 65 72 20 2a 70  Fts5IndexIter *p
24110 49 74 65 72 2c 20 46 74 73 35 42 75 66 66 65 72  Iter, Fts5Buffer
24120 20 2a 70 42 75 66 29 7b 0a 20 20 46 74 73 35 49   *pBuf){.  Fts5I
24130 6e 64 65 78 20 2a 70 20 3d 20 70 49 74 65 72 2d  ndex *p = pIter-
24140 3e 70 49 6e 64 65 78 3b 0a 0a 20 20 61 73 73 65  >pIndex;..  asse
24150 72 74 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  rt( p->rc==SQLIT
24160 45 5f 4f 4b 20 29 3b 0a 20 20 66 74 73 35 42 75  E_OK );.  fts5Bu
24170 66 66 65 72 5a 65 72 6f 28 70 42 75 66 29 3b 0a  fferZero(pBuf);.
24180 20 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 50    fts5MultiIterP
24190 6f 73 6c 69 73 74 28 70 2c 20 70 49 74 65 72 2c  oslist(p, pIter,
241a0 20 30 2c 20 70 42 75 66 29 3b 0a 20 20 72 65 74   0, pBuf);.  ret
241b0 75 72 6e 20 66 74 73 35 49 6e 64 65 78 52 65 74  urn fts5IndexRet
241c0 75 72 6e 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn(p);.}../*.**
241d0 20 43 6c 6f 73 65 20 61 6e 20 69 74 65 72 61 74   Close an iterat
241e0 6f 72 20 6f 70 65 6e 65 64 20 62 79 20 61 6e 20  or opened by an 
241f0 65 61 72 6c 69 65 72 20 63 61 6c 6c 20 74 6f 20  earlier call to 
24200 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78  sqlite3Fts5Index
24210 51 75 65 72 79 28 29 2e 0a 2a 2f 0a 76 6f 69 64  Query()..*/.void
24220 20 73 71 6c 69 74 65 33 46 74 73 35 49 74 65 72   sqlite3Fts5Iter
24230 43 6c 6f 73 65 28 46 74 73 35 49 6e 64 65 78 49  Close(Fts5IndexI
24240 74 65 72 20 2a 70 49 74 65 72 29 7b 0a 20 20 69  ter *pIter){.  i
24250 66 28 20 70 49 74 65 72 20 29 7b 0a 20 20 20 20  f( pIter ){.    
24260 46 74 73 35 49 6e 64 65 78 20 2a 70 49 6e 64 65  Fts5Index *pInde
24270 78 20 3d 20 70 49 74 65 72 2d 3e 70 49 6e 64 65  x = pIter->pInde
24280 78 3b 0a 20 20 20 20 66 74 73 35 4d 75 6c 74 69  x;.    fts5Multi
24290 49 74 65 72 46 72 65 65 28 70 49 74 65 72 2d 3e  IterFree(pIter->
242a0 70 49 6e 64 65 78 2c 20 70 49 74 65 72 29 3b 0a  pIndex, pIter);.
242b0 20 20 20 20 66 74 73 35 43 6c 6f 73 65 52 65 61      fts5CloseRea
242c0 64 65 72 28 70 49 6e 64 65 78 29 3b 0a 20 20 7d  der(pIndex);.  }
242d0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 61  .}../*.** Read a
242e0 6e 64 20 64 65 63 6f 64 65 20 74 68 65 20 22 61  nd decode the "a
242f0 76 65 72 61 67 65 73 22 20 72 65 63 6f 72 64 20  verages" record 
24300 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73  from the databas
24310 65 2e 20 0a 2a 2a 0a 2a 2a 20 50 61 72 61 6d 65  e. .**.** Parame
24320 74 65 72 20 61 6e 53 69 7a 65 20 6d 75 73 74 20  ter anSize must 
24330 70 6f 69 6e 74 20 74 6f 20 61 6e 20 61 72 72 61  point to an arra
24340 79 20 6f 66 20 73 69 7a 65 20 6e 43 6f 6c 2c 20  y of size nCol, 
24350 77 68 65 72 65 20 6e 43 6f 6c 20 69 73 0a 2a 2a  where nCol is.**
24360 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 75   the number of u
24370 73 65 72 20 64 65 66 69 6e 65 64 20 63 6f 6c 75  ser defined colu
24380 6d 6e 73 20 69 6e 20 74 68 65 20 46 54 53 20 74  mns in the FTS t
24390 61 62 6c 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  able..*/.int sql
243a0 69 74 65 33 46 74 73 35 49 6e 64 65 78 47 65 74  ite3Fts5IndexGet
243b0 41 76 65 72 61 67 65 73 28 46 74 73 35 49 6e 64  Averages(Fts5Ind
243c0 65 78 20 2a 70 2c 20 69 36 34 20 2a 70 6e 52 6f  ex *p, i64 *pnRo
243d0 77 2c 20 69 36 34 20 2a 61 6e 53 69 7a 65 29 7b  w, i64 *anSize){
243e0 0a 20 20 69 6e 74 20 6e 43 6f 6c 20 3d 20 70 2d  .  int nCol = p-
243f0 3e 70 43 6f 6e 66 69 67 2d 3e 6e 43 6f 6c 3b 0a  >pConfig->nCol;.
24400 20 20 46 74 73 35 44 61 74 61 20 2a 70 44 61 74    Fts5Data *pDat
24410 61 3b 0a 0a 20 20 2a 70 6e 52 6f 77 20 3d 20 30  a;..  *pnRow = 0
24420 3b 0a 20 20 6d 65 6d 73 65 74 28 61 6e 53 69 7a  ;.  memset(anSiz
24430 65 2c 20 30 2c 20 73 69 7a 65 6f 66 28 69 36 34  e, 0, sizeof(i64
24440 29 20 2a 20 6e 43 6f 6c 29 3b 0a 20 20 70 44 61  ) * nCol);.  pDa
24450 74 61 20 3d 20 66 74 73 35 44 61 74 61 52 65 61  ta = fts5DataRea
24460 64 28 70 2c 20 46 54 53 35 5f 41 56 45 52 41 47  d(p, FTS5_AVERAG
24470 45 53 5f 52 4f 57 49 44 29 3b 0a 20 20 69 66 28  ES_ROWID);.  if(
24480 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
24490 4b 20 26 26 20 70 44 61 74 61 2d 3e 6e 6e 20 29  K && pData->nn )
244a0 7b 0a 20 20 20 20 69 6e 74 20 69 20 3d 20 30 3b  {.    int i = 0;
244b0 0a 20 20 20 20 69 6e 74 20 69 43 6f 6c 3b 0a 20  .    int iCol;. 
244c0 20 20 20 69 20 2b 3d 20 66 74 73 35 47 65 74 56     i += fts5GetV
244d0 61 72 69 6e 74 28 26 70 44 61 74 61 2d 3e 70 5b  arint(&pData->p[
244e0 69 5d 2c 20 28 75 36 34 2a 29 70 6e 52 6f 77 29  i], (u64*)pnRow)
244f0 3b 0a 20 20 20 20 66 6f 72 28 69 43 6f 6c 3d 30  ;.    for(iCol=0
24500 3b 20 69 3c 70 44 61 74 61 2d 3e 6e 6e 20 26 26  ; i<pData->nn &&
24510 20 69 43 6f 6c 3c 6e 43 6f 6c 3b 20 69 43 6f 6c   iCol<nCol; iCol
24520 2b 2b 29 7b 0a 20 20 20 20 20 20 69 20 2b 3d 20  ++){.      i += 
24530 66 74 73 35 47 65 74 56 61 72 69 6e 74 28 26 70  fts5GetVarint(&p
24540 44 61 74 61 2d 3e 70 5b 69 5d 2c 20 28 75 36 34  Data->p[i], (u64
24550 2a 29 26 61 6e 53 69 7a 65 5b 69 43 6f 6c 5d 29  *)&anSize[iCol])
24560 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 66  ;.    }.  }..  f
24570 74 73 35 44 61 74 61 52 65 6c 65 61 73 65 28 70  ts5DataRelease(p
24580 44 61 74 61 29 3b 0a 20 20 72 65 74 75 72 6e 20  Data);.  return 
24590 66 74 73 35 49 6e 64 65 78 52 65 74 75 72 6e 28  fts5IndexReturn(
245a0 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 70  p);.}../*.** Rep
245b0 6c 61 63 65 20 74 68 65 20 63 75 72 72 65 6e 74  lace the current
245c0 20 22 61 76 65 72 61 67 65 73 22 20 72 65 63 6f   "averages" reco
245d0 72 64 20 77 69 74 68 20 74 68 65 20 63 6f 6e 74  rd with the cont
245e0 65 6e 74 73 20 6f 66 20 74 68 65 20 62 75 66 66  ents of the buff
245f0 65 72 20 0a 2a 2a 20 73 75 70 70 6c 69 65 64 20  er .** supplied 
24600 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72  as the second ar
24610 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73  gument..*/.int s
24620 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78 53  qlite3Fts5IndexS
24630 65 74 41 76 65 72 61 67 65 73 28 46 74 73 35 49  etAverages(Fts5I
24640 6e 64 65 78 20 2a 70 2c 20 63 6f 6e 73 74 20 75  ndex *p, const u
24650 38 20 2a 70 44 61 74 61 2c 20 69 6e 74 20 6e 44  8 *pData, int nD
24660 61 74 61 29 7b 0a 20 20 61 73 73 65 72 74 28 20  ata){.  assert( 
24670 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
24680 20 29 3b 0a 20 20 66 74 73 35 44 61 74 61 57 72   );.  fts5DataWr
24690 69 74 65 28 70 2c 20 46 54 53 35 5f 41 56 45 52  ite(p, FTS5_AVER
246a0 41 47 45 53 5f 52 4f 57 49 44 2c 20 70 44 61 74  AGES_ROWID, pDat
246b0 61 2c 20 6e 44 61 74 61 29 3b 0a 20 20 72 65 74  a, nData);.  ret
246c0 75 72 6e 20 66 74 73 35 49 6e 64 65 78 52 65 74  urn fts5IndexRet
246d0 75 72 6e 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn(p);.}../*.**
246e0 20 52 65 74 75 72 6e 20 74 68 65 20 74 6f 74 61   Return the tota
246f0 6c 20 6e 75 6d 62 65 72 20 6f 66 20 62 6c 6f 63  l number of bloc
24700 6b 73 20 74 68 69 73 20 6d 6f 64 75 6c 65 20 68  ks this module h
24710 61 73 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65  as read from the
24720 20 25 5f 64 61 74 61 0a 2a 2a 20 74 61 62 6c 65   %_data.** table
24730 20 73 69 6e 63 65 20 69 74 20 77 61 73 20 63 72   since it was cr
24740 65 61 74 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  eated..*/.int sq
24750 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78 52 65  lite3Fts5IndexRe
24760 61 64 73 28 46 74 73 35 49 6e 64 65 78 20 2a 70  ads(Fts5Index *p
24770 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e 6e  ){.  return p->n
24780 52 65 61 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  Read;.}../*.** S
24790 65 74 20 74 68 65 20 33 32 2d 62 69 74 20 63 6f  et the 32-bit co
247a0 6f 6b 69 65 20 76 61 6c 75 65 20 73 74 6f 72 65  okie value store
247b0 64 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f  d at the start o
247c0 66 20 61 6c 6c 20 73 74 72 75 63 74 75 72 65 20  f all structure 
247d0 0a 2a 2a 20 72 65 63 6f 72 64 73 20 74 6f 20 74  .** records to t
247e0 68 65 20 76 61 6c 75 65 20 70 61 73 73 65 64 20  he value passed 
247f0 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72  as the second ar
24800 67 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 52 65  gument..**.** Re
24810 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69  turn SQLITE_OK i
24820 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 6f 72  f successful, or
24830 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72   an SQLite error
24840 20 63 6f 64 65 20 69 66 20 61 6e 20 65 72 72 6f   code if an erro
24850 72 0a 2a 2a 20 6f 63 63 75 72 73 2e 0a 2a 2f 0a  r.** occurs..*/.
24860 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 49  int sqlite3Fts5I
24870 6e 64 65 78 53 65 74 43 6f 6f 6b 69 65 28 46 74  ndexSetCookie(Ft
24880 73 35 49 6e 64 65 78 20 2a 70 2c 20 69 6e 74 20  s5Index *p, int 
24890 69 4e 65 77 29 7b 0a 20 20 69 6e 74 20 72 63 3b  iNew){.  int rc;
248a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
248b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
248c0 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
248d0 20 20 46 74 73 35 43 6f 6e 66 69 67 20 2a 70 43    Fts5Config *pC
248e0 6f 6e 66 69 67 20 3d 20 70 2d 3e 70 43 6f 6e 66  onfig = p->pConf
248f0 69 67 3b 20 20 20 20 2f 2a 20 43 6f 6e 66 69 67  ig;    /* Config
24900 75 72 61 74 69 6f 6e 20 6f 62 6a 65 63 74 20 2a  uration object *
24910 2f 0a 20 20 75 38 20 61 43 6f 6f 6b 69 65 5b 34  /.  u8 aCookie[4
24920 5d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ];              
24930 20 20 20 20 20 20 20 20 20 2f 2a 20 42 69 6e 61           /* Bina
24940 72 79 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f  ry representatio
24950 6e 20 6f 66 20 69 4e 65 77 20 2a 2f 0a 20 20 73  n of iNew */.  s
24960 71 6c 69 74 65 33 5f 62 6c 6f 62 20 2a 70 42 6c  qlite3_blob *pBl
24970 6f 62 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72  ob = 0;..  asser
24980 74 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  t( p->rc==SQLITE
24990 5f 4f 4b 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  _OK );.  sqlite3
249a0 46 74 73 35 50 75 74 33 32 28 61 43 6f 6f 6b 69  Fts5Put32(aCooki
249b0 65 2c 20 69 4e 65 77 29 3b 0a 0a 20 20 72 63 20  e, iNew);..  rc 
249c0 3d 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 6f  = sqlite3_blob_o
249d0 70 65 6e 28 70 43 6f 6e 66 69 67 2d 3e 64 62 2c  pen(pConfig->db,
249e0 20 70 43 6f 6e 66 69 67 2d 3e 7a 44 62 2c 20 70   pConfig->zDb, p
249f0 2d 3e 7a 44 61 74 61 54 62 6c 2c 20 0a 20 20 20  ->zDataTbl, .   
24a00 20 20 20 22 62 6c 6f 63 6b 22 2c 20 46 54 53 35     "block", FTS5
24a10 5f 53 54 52 55 43 54 55 52 45 5f 52 4f 57 49 44  _STRUCTURE_ROWID
24a20 2c 20 31 2c 20 26 70 42 6c 6f 62 0a 20 20 29 3b  , 1, &pBlob.  );
24a30 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
24a40 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69  E_OK ){.    sqli
24a50 74 65 33 5f 62 6c 6f 62 5f 77 72 69 74 65 28 70  te3_blob_write(p
24a60 42 6c 6f 62 2c 20 61 43 6f 6f 6b 69 65 2c 20 34  Blob, aCookie, 4
24a70 2c 20 30 29 3b 0a 20 20 20 20 72 63 20 3d 20 73  , 0);.    rc = s
24a80 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 63 6c 6f 73  qlite3_blob_clos
24a90 65 28 70 42 6c 6f 62 29 3b 0a 20 20 7d 0a 0a 20  e(pBlob);.  }.. 
24aa0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 69   return rc;.}..i
24ab0 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e  nt sqlite3Fts5In
24ac0 64 65 78 4c 6f 61 64 43 6f 6e 66 69 67 28 46 74  dexLoadConfig(Ft
24ad0 73 35 49 6e 64 65 78 20 2a 70 29 7b 0a 20 20 46  s5Index *p){.  F
24ae0 74 73 35 53 74 72 75 63 74 75 72 65 20 2a 70 53  ts5Structure *pS
24af0 74 72 75 63 74 3b 0a 20 20 70 53 74 72 75 63 74  truct;.  pStruct
24b00 20 3d 20 66 74 73 35 53 74 72 75 63 74 75 72 65   = fts5Structure
24b10 52 65 61 64 28 70 29 3b 0a 20 20 66 74 73 35 53  Read(p);.  fts5S
24b20 74 72 75 63 74 75 72 65 52 65 6c 65 61 73 65 28  tructureRelease(
24b30 70 53 74 72 75 63 74 29 3b 0a 20 20 72 65 74 75  pStruct);.  retu
24b40 72 6e 20 66 74 73 35 49 6e 64 65 78 52 65 74 75  rn fts5IndexRetu
24b50 72 6e 28 70 29 3b 0a 7d 0a 0a 0a 2f 2a 2a 2a 2a  rn(p);.}.../****
24b60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
24b70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
24b80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
24b90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
24ba0 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *****.**********
24bb0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
24bc0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
24bd0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
24be0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
24bf0 0a 2a 2a 20 42 65 6c 6f 77 20 74 68 69 73 20 70  .** Below this p
24c00 6f 69 6e 74 20 69 73 20 74 68 65 20 69 6d 70 6c  oint is the impl
24c10 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68  ementation of th
24c20 65 20 69 6e 74 65 67 72 69 74 79 2d 63 68 65 63  e integrity-chec
24c30 6b 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 61 6c  k .** functional
24c40 69 74 79 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52  ity..*/../*.** R
24c50 65 74 75 72 6e 20 61 20 73 69 6d 70 6c 65 20 63  eturn a simple c
24c60 68 65 63 6b 73 75 6d 20 76 61 6c 75 65 20 62 61  hecksum value ba
24c70 73 65 64 20 6f 6e 20 74 68 65 20 61 72 67 75 6d  sed on the argum
24c80 65 6e 74 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ents..*/.static 
24c90 75 36 34 20 66 74 73 35 49 6e 64 65 78 45 6e 74  u64 fts5IndexEnt
24ca0 72 79 43 6b 73 75 6d 28 0a 20 20 69 36 34 20 69  ryCksum(.  i64 i
24cb0 52 6f 77 69 64 2c 20 0a 20 20 69 6e 74 20 69 43  Rowid, .  int iC
24cc0 6f 6c 2c 20 0a 20 20 69 6e 74 20 69 50 6f 73 2c  ol, .  int iPos,
24cd0 20 0a 20 20 69 6e 74 20 69 49 64 78 2c 0a 20 20   .  int iIdx,.  
24ce0 63 6f 6e 73 74 20 63 68 61 72 20 2a 70 54 65 72  const char *pTer
24cf0 6d 2c 0a 20 20 69 6e 74 20 6e 54 65 72 6d 0a 29  m,.  int nTerm.)
24d00 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 75 36 34  {.  int i;.  u64
24d10 20 72 65 74 20 3d 20 69 52 6f 77 69 64 3b 0a 20   ret = iRowid;. 
24d20 20 72 65 74 20 2b 3d 20 28 72 65 74 3c 3c 33 29   ret += (ret<<3)
24d30 20 2b 20 69 43 6f 6c 3b 0a 20 20 72 65 74 20 2b   + iCol;.  ret +
24d40 3d 20 28 72 65 74 3c 3c 33 29 20 2b 20 69 50 6f  = (ret<<3) + iPo
24d50 73 3b 0a 20 20 69 66 28 20 69 49 64 78 3e 3d 30  s;.  if( iIdx>=0
24d60 20 29 20 72 65 74 20 2b 3d 20 28 72 65 74 3c 3c   ) ret += (ret<<
24d70 33 29 20 2b 20 28 46 54 53 35 5f 4d 41 49 4e 5f  3) + (FTS5_MAIN_
24d80 50 52 45 46 49 58 20 2b 20 69 49 64 78 29 3b 0a  PREFIX + iIdx);.
24d90 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 54 65    for(i=0; i<nTe
24da0 72 6d 3b 20 69 2b 2b 29 20 72 65 74 20 2b 3d 20  rm; i++) ret += 
24db0 28 72 65 74 3c 3c 33 29 20 2b 20 70 54 65 72 6d  (ret<<3) + pTerm
24dc0 5b 69 5d 3b 0a 20 20 72 65 74 75 72 6e 20 72 65  [i];.  return re
24dd0 74 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c  t;.}..#ifdef SQL
24de0 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20  ITE_DEBUG./*.** 
24df0 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
24e00 20 70 75 72 65 6c 79 20 61 6e 20 69 6e 74 65 72   purely an inter
24e10 6e 61 6c 20 74 65 73 74 2e 20 49 74 20 64 6f 65  nal test. It doe
24e20 73 20 6e 6f 74 20 63 6f 6e 74 72 69 62 75 74 65  s not contribute
24e30 20 74 6f 20 0a 2a 2a 20 46 54 53 20 66 75 6e 63   to .** FTS func
24e40 74 69 6f 6e 61 6c 69 74 79 2c 20 6f 72 20 65 76  tionality, or ev
24e50 65 6e 20 74 68 65 20 69 6e 74 65 67 72 69 74 79  en the integrity
24e60 2d 63 68 65 63 6b 2c 20 69 6e 20 61 6e 79 20 77  -check, in any w
24e70 61 79 2e 0a 2a 2a 0a 2a 2a 20 49 6e 73 74 65 61  ay..**.** Instea
24e80 64 2c 20 69 74 20 74 65 73 74 73 20 74 68 61 74  d, it tests that
24e90 20 74 68 65 20 73 61 6d 65 20 73 65 74 20 6f 66   the same set of
24ea0 20 70 67 6e 6f 2f 72 6f 77 69 64 20 63 6f 6d 62   pgno/rowid comb
24eb0 69 6e 61 74 69 6f 6e 73 20 61 72 65 20 0a 2a 2a  inations are .**
24ec0 20 76 69 73 69 74 65 64 20 72 65 67 61 72 64 6c   visited regardl
24ed0 65 73 73 20 6f 66 20 77 68 65 74 68 65 72 20 74  ess of whether t
24ee0 68 65 20 64 6f 63 6c 69 73 74 2d 69 6e 64 65 78  he doclist-index
24ef0 20 69 64 65 6e 74 69 66 69 65 64 20 62 79 20 70   identified by p
24f00 61 72 61 6d 65 74 65 72 73 0a 2a 2a 20 69 53 65  arameters.** iSe
24f10 67 69 64 2f 69 4c 65 61 66 20 69 73 20 69 74 65  gid/iLeaf is ite
24f20 72 61 74 65 64 20 69 6e 20 66 6f 72 77 61 72 64  rated in forward
24f30 73 20 6f 72 20 72 65 76 65 72 73 65 20 6f 72 64  s or reverse ord
24f40 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  er..*/.static vo
24f50 69 64 20 66 74 73 35 54 65 73 74 44 6c 69 64 78  id fts5TestDlidx
24f60 52 65 76 65 72 73 65 28 0a 20 20 46 74 73 35 49  Reverse(.  Fts5I
24f70 6e 64 65 78 20 2a 70 2c 20 0a 20 20 69 6e 74 20  ndex *p, .  int 
24f80 69 53 65 67 69 64 2c 20 20 20 20 20 20 20 20 20  iSegid,         
24f90 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
24fa0 65 67 6d 65 6e 74 20 69 64 20 74 6f 20 6c 6f 61  egment id to loa
24fb0 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20  d from */.  int 
24fc0 69 4c 65 61 66 20 20 20 20 20 20 20 20 20 20 20  iLeaf           
24fd0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
24fe0 6f 61 64 20 64 6f 63 6c 69 73 74 2d 69 6e 64 65  oad doclist-inde
24ff0 78 20 66 6f 72 20 74 68 69 73 20 6c 65 61 66 20  x for this leaf 
25000 2a 2f 0a 29 7b 0a 20 20 46 74 73 35 44 6c 69 64  */.){.  Fts5Dlid
25010 78 49 74 65 72 20 2a 70 44 6c 69 64 78 20 3d 20  xIter *pDlidx = 
25020 30 3b 0a 20 20 75 36 34 20 63 6b 73 75 6d 31 20  0;.  u64 cksum1 
25030 3d 20 31 33 3b 0a 20 20 75 36 34 20 63 6b 73 75  = 13;.  u64 cksu
25040 6d 32 20 3d 20 31 33 3b 0a 0a 20 20 66 6f 72 28  m2 = 13;..  for(
25050 70 44 6c 69 64 78 3d 66 74 73 35 44 6c 69 64 78  pDlidx=fts5Dlidx
25060 49 74 65 72 49 6e 69 74 28 70 2c 20 30 2c 20 69  IterInit(p, 0, i
25070 53 65 67 69 64 2c 20 69 4c 65 61 66 29 3b 0a 20  Segid, iLeaf);. 
25080 20 20 20 20 20 66 74 73 35 44 6c 69 64 78 49 74       fts5DlidxIt
25090 65 72 45 6f 66 28 70 2c 20 70 44 6c 69 64 78 29  erEof(p, pDlidx)
250a0 3d 3d 30 3b 0a 20 20 20 20 20 20 66 74 73 35 44  ==0;.      fts5D
250b0 6c 69 64 78 49 74 65 72 4e 65 78 74 28 70 2c 20  lidxIterNext(p, 
250c0 70 44 6c 69 64 78 29 0a 20 20 29 7b 0a 20 20 20  pDlidx).  ){.   
250d0 20 69 36 34 20 69 52 6f 77 69 64 20 3d 20 66 74   i64 iRowid = ft
250e0 73 35 44 6c 69 64 78 49 74 65 72 52 6f 77 69 64  s5DlidxIterRowid
250f0 28 70 44 6c 69 64 78 29 3b 0a 20 20 20 20 69 6e  (pDlidx);.    in
25100 74 20 70 67 6e 6f 20 3d 20 66 74 73 35 44 6c 69  t pgno = fts5Dli
25110 64 78 49 74 65 72 50 67 6e 6f 28 70 44 6c 69 64  dxIterPgno(pDlid
25120 78 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  x);.    assert( 
25130 70 67 6e 6f 3e 69 4c 65 61 66 20 29 3b 0a 20 20  pgno>iLeaf );.  
25140 20 20 63 6b 73 75 6d 31 20 2b 3d 20 69 52 6f 77    cksum1 += iRow
25150 69 64 20 2b 20 28 28 69 36 34 29 70 67 6e 6f 3c  id + ((i64)pgno<
25160 3c 33 32 29 3b 0a 20 20 7d 0a 20 20 66 74 73 35  <32);.  }.  fts5
25170 44 6c 69 64 78 49 74 65 72 46 72 65 65 28 70 44  DlidxIterFree(pD
25180 6c 69 64 78 29 3b 0a 20 20 70 44 6c 69 64 78 20  lidx);.  pDlidx 
25190 3d 20 30 3b 0a 0a 20 20 66 6f 72 28 70 44 6c 69  = 0;..  for(pDli
251a0 64 78 3d 66 74 73 35 44 6c 69 64 78 49 74 65 72  dx=fts5DlidxIter
251b0 49 6e 69 74 28 70 2c 20 31 2c 20 69 53 65 67 69  Init(p, 1, iSegi
251c0 64 2c 20 69 4c 65 61 66 29 3b 0a 20 20 20 20 20  d, iLeaf);.     
251d0 20 66 74 73 35 44 6c 69 64 78 49 74 65 72 45 6f   fts5DlidxIterEo
251e0 66 28 70 2c 20 70 44 6c 69 64 78 29 3d 3d 30 3b  f(p, pDlidx)==0;
251f0 0a 20 20 20 20 20 20 66 74 73 35 44 6c 69 64 78  .      fts5Dlidx
25200 49 74 65 72 50 72 65 76 28 70 2c 20 70 44 6c 69  IterPrev(p, pDli
25210 64 78 29 0a 20 20 29 7b 0a 20 20 20 20 69 36 34  dx).  ){.    i64
25220 20 69 52 6f 77 69 64 20 3d 20 66 74 73 35 44 6c   iRowid = fts5Dl
25230 69 64 78 49 74 65 72 52 6f 77 69 64 28 70 44 6c  idxIterRowid(pDl
25240 69 64 78 29 3b 0a 20 20 20 20 69 6e 74 20 70 67  idx);.    int pg
25250 6e 6f 20 3d 20 66 74 73 35 44 6c 69 64 78 49 74  no = fts5DlidxIt
25260 65 72 50 67 6e 6f 28 70 44 6c 69 64 78 29 3b 0a  erPgno(pDlidx);.
25270 20 20 20 20 61 73 73 65 72 74 28 20 66 74 73 35      assert( fts5
25280 44 6c 69 64 78 49 74 65 72 50 67 6e 6f 28 70 44  DlidxIterPgno(pD
25290 6c 69 64 78 29 3e 69 4c 65 61 66 20 29 3b 0a 20  lidx)>iLeaf );. 
252a0 20 20 20 63 6b 73 75 6d 32 20 2b 3d 20 69 52 6f     cksum2 += iRo
252b0 77 69 64 20 2b 20 28 28 69 36 34 29 70 67 6e 6f  wid + ((i64)pgno
252c0 3c 3c 33 32 29 3b 0a 20 20 7d 0a 20 20 66 74 73  <<32);.  }.  fts
252d0 35 44 6c 69 64 78 49 74 65 72 46 72 65 65 28 70  5DlidxIterFree(p
252e0 44 6c 69 64 78 29 3b 0a 20 20 70 44 6c 69 64 78  Dlidx);.  pDlidx
252f0 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20 70 2d 3e   = 0;..  if( p->
25300 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
25310 20 63 6b 73 75 6d 31 21 3d 63 6b 73 75 6d 32 20   cksum1!=cksum2 
25320 29 20 70 2d 3e 72 63 20 3d 20 46 54 53 35 5f 43  ) p->rc = FTS5_C
25330 4f 52 52 55 50 54 3b 0a 7d 0a 0a 73 74 61 74 69  ORRUPT;.}..stati
25340 63 20 69 6e 74 20 66 74 73 35 51 75 65 72 79 43  c int fts5QueryC
25350 6b 73 75 6d 28 0a 20 20 46 74 73 35 49 6e 64 65  ksum(.  Fts5Inde
25360 78 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  x *p,           
25370 20 20 20 20 20 20 20 20 2f 2a 20 46 74 73 35 20          /* Fts5 
25380 69 6e 64 65 78 20 6f 62 6a 65 63 74 20 2a 2f 0a  index object */.
25390 20 20 69 6e 74 20 69 49 64 78 2c 0a 20 20 63 6f    int iIdx,.  co
253a0 6e 73 74 20 63 68 61 72 20 2a 7a 2c 20 20 20 20  nst char *z,    
253b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
253c0 20 49 6e 64 65 78 20 6b 65 79 20 74 6f 20 71 75   Index key to qu
253d0 65 72 79 20 66 6f 72 20 2a 2f 0a 20 20 69 6e 74  ery for */.  int
253e0 20 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   n,             
253f0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
25400 53 69 7a 65 20 6f 66 20 69 6e 64 65 78 20 6b 65  Size of index ke
25410 79 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20  y in bytes */.  
25420 69 6e 74 20 66 6c 61 67 73 2c 20 20 20 20 20 20  int flags,      
25430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25440 2f 2a 20 46 6c 61 67 73 20 66 6f 72 20 46 74 73  /* Flags for Fts
25450 35 49 6e 64 65 78 51 75 65 72 79 20 2a 2f 0a 20  5IndexQuery */. 
25460 20 75 36 34 20 2a 70 43 6b 73 75 6d 20 20 20 20   u64 *pCksum    
25470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25480 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 43 68 65 63   /* IN/OUT: Chec
25490 6b 73 75 6d 20 76 61 6c 75 65 20 2a 2f 0a 29 7b  ksum value */.){
254a0 0a 20 20 75 36 34 20 63 6b 73 75 6d 20 3d 20 2a  .  u64 cksum = *
254b0 70 43 6b 73 75 6d 3b 0a 20 20 46 74 73 35 49 6e  pCksum;.  Fts5In
254c0 64 65 78 49 74 65 72 20 2a 70 49 64 78 49 74 65  dexIter *pIdxIte
254d0 72 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63 20  r = 0;.  int rc 
254e0 3d 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64  = sqlite3Fts5Ind
254f0 65 78 51 75 65 72 79 28 70 2c 20 7a 2c 20 6e 2c  exQuery(p, z, n,
25500 20 66 6c 61 67 73 2c 20 26 70 49 64 78 49 74 65   flags, &pIdxIte
25510 72 29 3b 0a 0a 20 20 77 68 69 6c 65 28 20 72 63  r);..  while( rc
25520 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 30  ==SQLITE_OK && 0
25530 3d 3d 73 71 6c 69 74 65 33 46 74 73 35 49 74 65  ==sqlite3Fts5Ite
25540 72 45 6f 66 28 70 49 64 78 49 74 65 72 29 20 29  rEof(pIdxIter) )
25550 7b 0a 20 20 20 20 69 36 34 20 64 75 6d 6d 79 3b  {.    i64 dummy;
25560 0a 20 20 20 20 63 6f 6e 73 74 20 75 38 20 2a 70  .    const u8 *p
25570 50 6f 73 3b 0a 20 20 20 20 69 6e 74 20 6e 50 6f  Pos;.    int nPo
25580 73 3b 0a 20 20 20 20 69 36 34 20 72 6f 77 69 64  s;.    i64 rowid
25590 20 3d 20 73 71 6c 69 74 65 33 46 74 73 35 49 74   = sqlite3Fts5It
255a0 65 72 52 6f 77 69 64 28 70 49 64 78 49 74 65 72  erRowid(pIdxIter
255b0 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  );.    rc = sqli
255c0 74 65 33 46 74 73 35 49 74 65 72 50 6f 73 6c 69  te3Fts5IterPosli
255d0 73 74 28 70 49 64 78 49 74 65 72 2c 20 26 70 50  st(pIdxIter, &pP
255e0 6f 73 2c 20 26 6e 50 6f 73 2c 20 26 64 75 6d 6d  os, &nPos, &dumm
255f0 79 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  y);.    if( rc==
25600 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
25610 20 20 20 46 74 73 35 50 6f 73 6c 69 73 74 52 65     Fts5PoslistRe
25620 61 64 65 72 20 73 52 65 61 64 65 72 3b 0a 20 20  ader sReader;.  
25630 20 20 20 20 66 6f 72 28 73 71 6c 69 74 65 33 46      for(sqlite3F
25640 74 73 35 50 6f 73 6c 69 73 74 52 65 61 64 65 72  ts5PoslistReader
25650 49 6e 69 74 28 2d 31 2c 20 70 50 6f 73 2c 20 6e  Init(-1, pPos, n
25660 50 6f 73 2c 20 26 73 52 65 61 64 65 72 29 3b 0a  Pos, &sReader);.
25670 20 20 20 20 20 20 20 20 20 20 73 52 65 61 64 65            sReade
25680 72 2e 62 45 6f 66 3d 3d 30 3b 0a 20 20 20 20 20  r.bEof==0;.     
25690 20 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35       sqlite3Fts5
256a0 50 6f 73 6c 69 73 74 52 65 61 64 65 72 4e 65 78  PoslistReaderNex
256b0 74 28 26 73 52 65 61 64 65 72 29 0a 20 20 20 20  t(&sReader).    
256c0 20 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74    ){.        int
256d0 20 69 43 6f 6c 20 3d 20 46 54 53 35 5f 50 4f 53   iCol = FTS5_POS
256e0 32 43 4f 4c 55 4d 4e 28 73 52 65 61 64 65 72 2e  2COLUMN(sReader.
256f0 69 50 6f 73 29 3b 0a 20 20 20 20 20 20 20 20 69  iPos);.        i
25700 6e 74 20 69 4f 66 66 20 3d 20 46 54 53 35 5f 50  nt iOff = FTS5_P
25710 4f 53 32 4f 46 46 53 45 54 28 73 52 65 61 64 65  OS2OFFSET(sReade
25720 72 2e 69 50 6f 73 29 3b 0a 20 20 20 20 20 20 20  r.iPos);.       
25730 20 63 6b 73 75 6d 20 5e 3d 20 66 74 73 35 49 6e   cksum ^= fts5In
25740 64 65 78 45 6e 74 72 79 43 6b 73 75 6d 28 72 6f  dexEntryCksum(ro
25750 77 69 64 2c 20 69 43 6f 6c 2c 20 69 4f 66 66 2c  wid, iCol, iOff,
25760 20 69 49 64 78 2c 20 7a 2c 20 6e 29 3b 0a 20 20   iIdx, z, n);.  
25770 20 20 20 20 7d 0a 20 20 20 20 20 20 72 63 20 3d      }.      rc =
25780 20 73 71 6c 69 74 65 33 46 74 73 35 49 74 65 72   sqlite3Fts5Iter
25790 4e 65 78 74 28 70 49 64 78 49 74 65 72 29 3b 0a  Next(pIdxIter);.
257a0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69      }.  }.  sqli
257b0 74 65 33 46 74 73 35 49 74 65 72 43 6c 6f 73 65  te3Fts5IterClose
257c0 28 70 49 64 78 49 74 65 72 29 3b 0a 0a 20 20 2a  (pIdxIter);..  *
257d0 70 43 6b 73 75 6d 20 3d 20 63 6b 73 75 6d 3b 0a  pCksum = cksum;.
257e0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
257f0 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
25800 74 69 6f 6e 20 69 73 20 61 6c 73 6f 20 70 75 72  tion is also pur
25810 65 6c 79 20 61 6e 20 69 6e 74 65 72 6e 61 6c 20  ely an internal 
25820 74 65 73 74 2e 20 49 74 20 64 6f 65 73 20 6e 6f  test. It does no
25830 74 20 63 6f 6e 74 72 69 62 75 74 65 20 74 6f 20  t contribute to 
25840 0a 2a 2a 20 46 54 53 20 66 75 6e 63 74 69 6f 6e  .** FTS function
25850 61 6c 69 74 79 2c 20 6f 72 20 65 76 65 6e 20 74  ality, or even t
25860 68 65 20 69 6e 74 65 67 72 69 74 79 2d 63 68 65  he integrity-che
25870 63 6b 2c 20 69 6e 20 61 6e 79 20 77 61 79 2e 0a  ck, in any way..
25880 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
25890 74 73 35 54 65 73 74 54 65 72 6d 28 0a 20 20 46  ts5TestTerm(.  F
258a0 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 0a 20 20  ts5Index *p, .  
258b0 46 74 73 35 42 75 66 66 65 72 20 2a 70 50 72 65  Fts5Buffer *pPre
258c0 76 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  v,              
258d0 2f 2a 20 50 72 65 76 69 6f 75 73 20 74 65 72 6d  /* Previous term
258e0 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
258f0 20 2a 7a 2c 20 69 6e 74 20 6e 2c 20 20 20 20 20   *z, int n,     
25900 20 20 20 20 20 20 2f 2a 20 50 6f 73 73 69 62 6c        /* Possibl
25910 79 20 6e 65 77 20 74 65 72 6d 20 74 6f 20 74 65  y new term to te
25920 73 74 20 2a 2f 0a 20 20 75 36 34 20 65 78 70 65  st */.  u64 expe
25930 63 74 65 64 2c 0a 20 20 75 36 34 20 2a 70 43 6b  cted,.  u64 *pCk
25940 73 75 6d 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20  sum.){.  int rc 
25950 3d 20 70 2d 3e 72 63 3b 0a 20 20 69 66 28 20 70  = p->rc;.  if( p
25960 50 72 65 76 2d 3e 6e 3d 3d 30 20 29 7b 0a 20 20  Prev->n==0 ){.  
25970 20 20 66 74 73 35 42 75 66 66 65 72 53 65 74 28    fts5BufferSet(
25980 26 72 63 2c 20 70 50 72 65 76 2c 20 6e 2c 20 28  &rc, pPrev, n, (
25990 63 6f 6e 73 74 20 75 38 2a 29 7a 29 3b 0a 20 20  const u8*)z);.  
259a0 7d 65 6c 73 65 0a 20 20 69 66 28 20 72 63 3d 3d  }else.  if( rc==
259b0 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 28 70 50  SQLITE_OK && (pP
259c0 72 65 76 2d 3e 6e 21 3d 6e 20 7c 7c 20 6d 65 6d  rev->n!=n || mem
259d0 63 6d 70 28 70 50 72 65 76 2d 3e 70 2c 20 7a 2c  cmp(pPrev->p, z,
259e0 20 6e 29 29 20 29 7b 0a 20 20 20 20 75 36 34 20   n)) ){.    u64 
259f0 63 6b 73 75 6d 33 20 3d 20 2a 70 43 6b 73 75 6d  cksum3 = *pCksum
25a00 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  ;.    const char
25a10 20 2a 7a 54 65 72 6d 20 3d 20 28 63 6f 6e 73 74   *zTerm = (const
25a20 20 63 68 61 72 2a 29 26 70 50 72 65 76 2d 3e 70   char*)&pPrev->p
25a30 5b 31 5d 3b 20 20 2f 2a 20 74 65 72 6d 20 73 61  [1];  /* term sa
25a40 6e 73 20 70 72 65 66 69 78 2d 62 79 74 65 20 2a  ns prefix-byte *
25a50 2f 0a 20 20 20 20 69 6e 74 20 6e 54 65 72 6d 20  /.    int nTerm 
25a60 3d 20 70 50 72 65 76 2d 3e 6e 2d 31 3b 20 20 20  = pPrev->n-1;   
25a70 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
25a80 20 6f 66 20 7a 54 65 72 6d 20 69 6e 20 62 79 74   of zTerm in byt
25a90 65 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 49  es */.    int iI
25aa0 64 78 20 3d 20 28 70 50 72 65 76 2d 3e 70 5b 30  dx = (pPrev->p[0
25ab0 5d 20 2d 20 46 54 53 35 5f 4d 41 49 4e 5f 50 52  ] - FTS5_MAIN_PR
25ac0 45 46 49 58 29 3b 0a 20 20 20 20 69 6e 74 20 66  EFIX);.    int f
25ad0 6c 61 67 73 20 3d 20 28 69 49 64 78 3d 3d 30 20  lags = (iIdx==0 
25ae0 3f 20 30 20 3a 20 46 54 53 35 49 4e 44 45 58 5f  ? 0 : FTS5INDEX_
25af0 51 55 45 52 59 5f 50 52 45 46 49 58 29 3b 0a 20  QUERY_PREFIX);. 
25b00 20 20 20 75 36 34 20 63 6b 31 20 3d 20 30 3b 0a     u64 ck1 = 0;.
25b10 20 20 20 20 75 36 34 20 63 6b 32 20 3d 20 30 3b      u64 ck2 = 0;
25b20 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74  ..    /* Check t
25b30 68 61 74 20 74 68 65 20 72 65 73 75 6c 74 73 20  hat the results 
25b40 72 65 74 75 72 6e 65 64 20 66 6f 72 20 41 53 43  returned for ASC
25b50 20 61 6e 64 20 44 45 53 43 20 71 75 65 72 69 65   and DESC querie
25b60 73 20 61 72 65 0a 20 20 20 20 2a 2a 20 74 68 65  s are.    ** the
25b70 20 73 61 6d 65 2e 20 49 66 20 6e 6f 74 2c 20 63   same. If not, c
25b80 61 6c 6c 20 74 68 69 73 20 63 6f 72 72 75 70 74  all this corrupt
25b90 69 6f 6e 2e 20 20 2a 2f 0a 20 20 20 20 72 63 20  ion.  */.    rc 
25ba0 3d 20 66 74 73 35 51 75 65 72 79 43 6b 73 75 6d  = fts5QueryCksum
25bb0 28 70 2c 20 69 49 64 78 2c 20 7a 54 65 72 6d 2c  (p, iIdx, zTerm,
25bc0 20 6e 54 65 72 6d 2c 20 66 6c 61 67 73 2c 20 26   nTerm, flags, &
25bd0 63 6b 31 29 3b 0a 20 20 20 20 69 66 28 20 72 63  ck1);.    if( rc
25be0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
25bf0 20 20 20 20 20 69 6e 74 20 66 20 3d 20 66 6c 61       int f = fla
25c00 67 73 7c 46 54 53 35 49 4e 44 45 58 5f 51 55 45  gs|FTS5INDEX_QUE
25c10 52 59 5f 44 45 53 43 3b 0a 20 20 20 20 20 20 72  RY_DESC;.      r
25c20 63 20 3d 20 66 74 73 35 51 75 65 72 79 43 6b 73  c = fts5QueryCks
25c30 75 6d 28 70 2c 20 69 49 64 78 2c 20 7a 54 65 72  um(p, iIdx, zTer
25c40 6d 2c 20 6e 54 65 72 6d 2c 20 66 2c 20 26 63 6b  m, nTerm, f, &ck
25c50 32 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  2);.    }.    if
25c60 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
25c70 26 26 20 63 6b 31 21 3d 63 6b 32 20 29 20 72 63  && ck1!=ck2 ) rc
25c80 20 3d 20 46 54 53 35 5f 43 4f 52 52 55 50 54 3b   = FTS5_CORRUPT;
25c90 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73  ..    /* If this
25ca0 20 69 73 20 61 20 70 72 65 66 69 78 20 71 75 65   is a prefix que
25cb0 72 79 2c 20 63 68 65 63 6b 20 74 68 61 74 20 74  ry, check that t
25cc0 68 65 20 72 65 73 75 6c 74 73 20 72 65 74 75 72  he results retur
25cd0 6e 65 64 20 69 66 20 74 68 65 0a 20 20 20 20 2a  ned if the.    *
25ce0 2a 20 74 68 65 20 69 6e 64 65 78 20 69 73 20 64  * the index is d
25cf0 69 73 61 62 6c 65 64 20 61 72 65 20 74 68 65 20  isabled are the 
25d00 73 61 6d 65 2e 20 49 6e 20 62 6f 74 68 20 41 53  same. In both AS
25d10 43 20 61 6e 64 20 44 45 53 43 20 6f 72 64 65 72  C and DESC order
25d20 2e 20 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  . .    **.    **
25d30 20 54 68 69 73 20 63 68 65 63 6b 20 6d 61 79 20   This check may 
25d40 6f 6e 6c 79 20 62 65 20 70 65 72 66 6f 72 6d 65  only be performe
25d50 64 20 69 66 20 74 68 65 20 68 61 73 68 20 74 61  d if the hash ta
25d60 62 6c 65 20 69 73 20 65 6d 70 74 79 2e 20 54 68  ble is empty. Th
25d70 69 73 0a 20 20 20 20 2a 2a 20 69 73 20 62 65 63  is.    ** is bec
25d80 61 75 73 65 20 74 68 65 20 68 61 73 68 20 74 61  ause the hash ta
25d90 62 6c 65 20 6f 6e 6c 79 20 73 75 70 70 6f 72 74  ble only support
25da0 73 20 61 20 73 69 6e 67 6c 65 20 73 63 61 6e 20  s a single scan 
25db0 71 75 65 72 79 20 61 74 0a 20 20 20 20 2a 2a 20  query at.    ** 
25dc0 61 20 74 69 6d 65 2c 20 61 6e 64 20 74 68 65 20  a time, and the 
25dd0 6d 75 6c 74 69 2d 69 74 65 72 20 6c 6f 6f 70 20  multi-iter loop 
25de0 66 72 6f 6d 20 77 68 69 63 68 20 74 68 69 73 20  from which this 
25df0 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
25e00 65 64 0a 20 20 20 20 2a 2a 20 69 73 20 61 6c 72  ed.    ** is alr
25e10 65 61 64 79 20 70 65 72 66 6f 72 6d 69 6e 67 20  eady performing 
25e20 73 75 63 68 20 61 20 73 63 61 6e 2e 20 2a 2f 0a  such a scan. */.
25e30 20 20 20 20 69 66 28 20 70 2d 3e 6e 50 65 6e 64      if( p->nPend
25e40 69 6e 67 44 61 74 61 3d 3d 30 20 29 7b 0a 20 20  ingData==0 ){.  
25e50 20 20 20 20 69 66 28 20 69 49 64 78 3e 30 20 26      if( iIdx>0 &
25e60 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  & rc==SQLITE_OK 
25e70 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 66  ){.        int f
25e80 20 3d 20 66 6c 61 67 73 7c 46 54 53 35 49 4e 44   = flags|FTS5IND
25e90 45 58 5f 51 55 45 52 59 5f 54 45 53 54 5f 4e 4f  EX_QUERY_TEST_NO
25ea0 49 44 58 3b 0a 20 20 20 20 20 20 20 20 63 6b 32  IDX;.        ck2
25eb0 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 72 63   = 0;.        rc
25ec0 20 3d 20 66 74 73 35 51 75 65 72 79 43 6b 73 75   = fts5QueryCksu
25ed0 6d 28 70 2c 20 69 49 64 78 2c 20 7a 54 65 72 6d  m(p, iIdx, zTerm
25ee0 2c 20 6e 54 65 72 6d 2c 20 66 2c 20 26 63 6b 32  , nTerm, f, &ck2
25ef0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
25f00 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
25f10 63 6b 31 21 3d 63 6b 32 20 29 20 72 63 20 3d 20  ck1!=ck2 ) rc = 
25f20 46 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20  FTS5_CORRUPT;.  
25f30 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
25f40 69 49 64 78 3e 30 20 26 26 20 72 63 3d 3d 53 51  iIdx>0 && rc==SQ
25f50 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
25f60 20 20 20 69 6e 74 20 66 20 3d 20 66 6c 61 67 73     int f = flags
25f70 7c 46 54 53 35 49 4e 44 45 58 5f 51 55 45 52 59  |FTS5INDEX_QUERY
25f80 5f 54 45 53 54 5f 4e 4f 49 44 58 7c 46 54 53 35  _TEST_NOIDX|FTS5
25f90 49 4e 44 45 58 5f 51 55 45 52 59 5f 44 45 53 43  INDEX_QUERY_DESC
25fa0 3b 0a 20 20 20 20 20 20 20 20 63 6b 32 20 3d 20  ;.        ck2 = 
25fb0 30 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  0;.        rc = 
25fc0 66 74 73 35 51 75 65 72 79 43 6b 73 75 6d 28 70  fts5QueryCksum(p
25fd0 2c 20 69 49 64 78 2c 20 7a 54 65 72 6d 2c 20 6e  , iIdx, zTerm, n
25fe0 54 65 72 6d 2c 20 66 2c 20 26 63 6b 32 29 3b 0a  Term, f, &ck2);.
25ff0 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d          if( rc==
26000 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 63 6b 31  SQLITE_OK && ck1
26010 21 3d 63 6b 32 20 29 20 72 63 20 3d 20 46 54 53  !=ck2 ) rc = FTS
26020 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20 20 20  5_CORRUPT;.     
26030 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63 6b   }.    }..    ck
26040 73 75 6d 33 20 5e 3d 20 63 6b 31 3b 0a 20 20 20  sum3 ^= ck1;.   
26050 20 66 74 73 35 42 75 66 66 65 72 53 65 74 28 26   fts5BufferSet(&
26060 72 63 2c 20 70 50 72 65 76 2c 20 6e 2c 20 28 63  rc, pPrev, n, (c
26070 6f 6e 73 74 20 75 38 2a 29 7a 29 3b 0a 0a 20 20  onst u8*)z);..  
26080 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
26090 5f 4f 4b 20 26 26 20 63 6b 73 75 6d 33 21 3d 65  _OK && cksum3!=e
260a0 78 70 65 63 74 65 64 20 29 7b 0a 20 20 20 20 20  xpected ){.     
260b0 20 72 63 20 3d 20 46 54 53 35 5f 43 4f 52 52 55   rc = FTS5_CORRU
260c0 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2a 70  PT;.    }.    *p
260d0 43 6b 73 75 6d 20 3d 20 63 6b 73 75 6d 33 3b 0a  Cksum = cksum3;.
260e0 20 20 7d 0a 20 20 70 2d 3e 72 63 20 3d 20 72 63    }.  p->rc = rc
260f0 3b 0a 7d 0a 20 0a 23 65 6c 73 65 0a 23 20 64 65  ;.}. .#else.# de
26100 66 69 6e 65 20 66 74 73 35 54 65 73 74 44 6c 69  fine fts5TestDli
26110 64 78 52 65 76 65 72 73 65 28 78 2c 79 2c 7a 29  dxReverse(x,y,z)
26120 0a 23 20 64 65 66 69 6e 65 20 66 74 73 35 54 65  .# define fts5Te
26130 73 74 54 65 72 6d 28 75 2c 76 2c 77 2c 78 2c 79  stTerm(u,v,w,x,y
26140 2c 7a 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ,z).#endif../*.*
26150 2a 20 43 68 65 63 6b 20 74 68 61 74 3a 0a 2a 2a  * Check that:.**
26160 0a 2a 2a 20 20 20 31 29 20 41 6c 6c 20 6c 65 61  .**   1) All lea
26170 76 65 73 20 6f 66 20 70 53 65 67 20 62 65 74 77  ves of pSeg betw
26180 65 65 6e 20 69 46 69 72 73 74 20 61 6e 64 20 69  een iFirst and i
26190 4c 61 73 74 20 28 69 6e 63 6c 75 73 69 76 65 29  Last (inclusive)
261a0 20 65 78 69 73 74 20 61 6e 64 0a 2a 2a 20 20 20   exist and.**   
261b0 20 20 20 63 6f 6e 74 61 69 6e 20 7a 65 72 6f 20     contain zero 
261c0 74 65 72 6d 73 2e 0a 2a 2a 20 20 20 32 29 20 41  terms..**   2) A
261d0 6c 6c 20 6c 65 61 76 65 73 20 6f 66 20 70 53 65  ll leaves of pSe
261e0 67 20 62 65 74 77 65 65 6e 20 69 4e 6f 52 6f 77  g between iNoRow
261f0 69 64 20 61 6e 64 20 69 4c 61 73 74 20 28 69 6e  id and iLast (in
26200 63 6c 75 73 69 76 65 29 20 65 78 69 73 74 20 61  clusive) exist a
26210 6e 64 0a 2a 2a 20 20 20 20 20 20 63 6f 6e 74 61  nd.**      conta
26220 69 6e 20 7a 65 72 6f 20 72 6f 77 69 64 73 2e 0a  in zero rowids..
26230 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
26240 74 73 35 49 6e 64 65 78 49 6e 74 65 67 72 69 74  ts5IndexIntegrit
26250 79 43 68 65 63 6b 45 6d 70 74 79 28 0a 20 20 46  yCheckEmpty(.  F
26260 74 73 35 49 6e 64 65 78 20 2a 70 2c 0a 20 20 46  ts5Index *p,.  F
26270 74 73 35 53 74 72 75 63 74 75 72 65 53 65 67 6d  ts5StructureSegm
26280 65 6e 74 20 2a 70 53 65 67 2c 20 20 20 20 20 2f  ent *pSeg,     /
26290 2a 20 53 65 67 6d 65 6e 74 20 74 6f 20 63 68 65  * Segment to che
262a0 63 6b 20 69 6e 74 65 72 6e 61 6c 20 63 6f 6e 73  ck internal cons
262b0 69 73 74 65 6e 63 79 20 2a 2f 0a 20 20 69 6e 74  istency */.  int
262c0 20 69 46 69 72 73 74 2c 0a 20 20 69 6e 74 20 69   iFirst,.  int i
262d0 4e 6f 52 6f 77 69 64 2c 0a 20 20 69 6e 74 20 69  NoRowid,.  int i
262e0 4c 61 73 74 0a 29 7b 0a 20 20 69 6e 74 20 69 3b  Last.){.  int i;
262f0 0a 0a 20 20 2f 2a 20 4e 6f 77 20 63 68 65 63 6b  ..  /* Now check
26300 20 74 68 61 74 20 74 68 65 20 69 74 65 72 2e 6e   that the iter.n
26310 45 6d 70 74 79 20 6c 65 61 76 65 73 20 66 6f 6c  Empty leaves fol
26320 6c 6f 77 69 6e 67 20 74 68 65 20 63 75 72 72 65  lowing the curre
26330 6e 74 20 6c 65 61 66 0a 20 20 2a 2a 20 28 61 29  nt leaf.  ** (a)
26340 20 65 78 69 73 74 20 61 6e 64 20 28 62 29 20 63   exist and (b) c
26350 6f 6e 74 61 69 6e 20 6e 6f 20 74 65 72 6d 73 2e  ontain no terms.
26360 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 69 46 69 72   */.  for(i=iFir
26370 73 74 3b 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  st; p->rc==SQLIT
26380 45 5f 4f 4b 20 26 26 20 69 3c 3d 69 4c 61 73 74  E_OK && i<=iLast
26390 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 46 74 73 35  ; i++){.    Fts5
263a0 44 61 74 61 20 2a 70 4c 65 61 66 20 3d 20 66 74  Data *pLeaf = ft
263b0 73 35 44 61 74 61 52 65 61 64 28 70 2c 20 46 54  s5DataRead(p, FT
263c0 53 35 5f 53 45 47 4d 45 4e 54 5f 52 4f 57 49 44  S5_SEGMENT_ROWID
263d0 28 70 53 65 67 2d 3e 69 53 65 67 69 64 2c 20 30  (pSeg->iSegid, 0
263e0 2c 20 69 29 29 3b 0a 20 20 20 20 69 66 28 20 70  , i));.    if( p
263f0 4c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 69 66  Leaf ){.      if
26400 28 20 21 66 74 73 35 4c 65 61 66 49 73 54 65 72  ( !fts5LeafIsTer
26410 6d 6c 65 73 73 28 70 4c 65 61 66 29 20 29 20 70  mless(pLeaf) ) p
26420 2d 3e 72 63 20 3d 20 46 54 53 35 5f 43 4f 52 52  ->rc = FTS5_CORR
26430 55 50 54 3b 0a 20 20 20 20 20 20 69 66 28 20 69  UPT;.      if( i
26440 3e 3d 69 4e 6f 52 6f 77 69 64 20 26 26 20 30 21  >=iNoRowid && 0!
26450 3d 66 74 73 35 4c 65 61 66 46 69 72 73 74 52 6f  =fts5LeafFirstRo
26460 77 69 64 4f 66 66 28 70 4c 65 61 66 29 20 29 20  widOff(pLeaf) ) 
26470 70 2d 3e 72 63 20 3d 20 46 54 53 35 5f 43 4f 52  p->rc = FTS5_COR
26480 52 55 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20  RUPT;.    }.    
26490 66 74 73 35 44 61 74 61 52 65 6c 65 61 73 65 28  fts5DataRelease(
264a0 70 4c 65 61 66 29 3b 0a 20 20 20 20 69 66 28 20  pLeaf);.    if( 
264b0 70 2d 3e 72 63 20 29 20 62 72 65 61 6b 3b 0a 20  p->rc ) break;. 
264c0 20 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69   }.}..static voi
264d0 64 20 66 74 73 35 49 6e 64 65 78 49 6e 74 65 67  d fts5IndexInteg
264e0 72 69 74 79 43 68 65 63 6b 53 65 67 6d 65 6e 74  rityCheckSegment
264f0 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70  (.  Fts5Index *p
26500 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
26510 20 20 20 20 2f 2a 20 46 54 53 35 20 62 61 63 6b      /* FTS5 back
26520 65 6e 64 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  end object */.  
26530 46 74 73 35 53 74 72 75 63 74 75 72 65 53 65 67  Fts5StructureSeg
26540 6d 65 6e 74 20 2a 70 53 65 67 20 20 20 20 20 20  ment *pSeg      
26550 2f 2a 20 53 65 67 6d 65 6e 74 20 74 6f 20 63 68  /* Segment to ch
26560 65 63 6b 20 69 6e 74 65 72 6e 61 6c 20 63 6f 6e  eck internal con
26570 73 69 73 74 65 6e 63 79 20 2a 2f 0a 29 7b 0a 20  sistency */.){. 
26580 20 46 74 73 35 43 6f 6e 66 69 67 20 2a 70 43 6f   Fts5Config *pCo
26590 6e 66 69 67 20 3d 20 70 2d 3e 70 43 6f 6e 66 69  nfig = p->pConfi
265a0 67 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  g;.  sqlite3_stm
265b0 74 20 2a 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20  t *pStmt = 0;.  
265c0 69 6e 74 20 72 63 32 3b 0a 20 20 69 6e 74 20 69  int rc2;.  int i
265d0 49 64 78 50 72 65 76 4c 65 61 66 20 3d 20 70 53  IdxPrevLeaf = pS
265e0 65 67 2d 3e 70 67 6e 6f 46 69 72 73 74 2d 31 3b  eg->pgnoFirst-1;
265f0 0a 20 20 69 6e 74 20 69 44 6c 69 64 78 50 72 65  .  int iDlidxPre
26600 76 4c 65 61 66 20 3d 20 70 53 65 67 2d 3e 70 67  vLeaf = pSeg->pg
26610 6e 6f 4c 61 73 74 3b 0a 0a 20 20 69 66 28 20 70  noLast;..  if( p
26620 53 65 67 2d 3e 70 67 6e 6f 46 69 72 73 74 3d 3d  Seg->pgnoFirst==
26630 30 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 66  0 ) return;..  f
26640 74 73 35 49 6e 64 65 78 50 72 65 70 61 72 65 53  ts5IndexPrepareS
26650 74 6d 74 28 70 2c 20 26 70 53 74 6d 74 2c 20 73  tmt(p, &pStmt, s
26660 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 0a  qlite3_mprintf(.
26670 20 20 20 20 20 20 22 53 45 4c 45 43 54 20 73 65        "SELECT se
26680 67 69 64 2c 20 74 65 72 6d 2c 20 28 70 67 6e 6f  gid, term, (pgno
26690 3e 3e 31 29 2c 20 28 70 67 6e 6f 20 26 20 31 29  >>1), (pgno & 1)
266a0 20 46 52 4f 4d 20 27 25 71 27 2e 27 25 71 5f 69   FROM '%q'.'%q_i
266b0 64 78 27 20 57 48 45 52 45 20 73 65 67 69 64 3d  dx' WHERE segid=
266c0 25 64 22 2c 0a 20 20 20 20 20 20 70 43 6f 6e 66  %d",.      pConf
266d0 69 67 2d 3e 7a 44 62 2c 20 70 43 6f 6e 66 69 67  ig->zDb, pConfig
266e0 2d 3e 7a 4e 61 6d 65 2c 20 70 53 65 67 2d 3e 69  ->zName, pSeg->i
266f0 53 65 67 69 64 0a 20 20 29 29 3b 0a 0a 20 20 2f  Segid.  ));..  /
26700 2a 20 49 74 65 72 61 74 65 20 74 68 72 6f 75 67  * Iterate throug
26710 68 20 74 68 65 20 62 2d 74 72 65 65 20 68 69 65  h the b-tree hie
26720 72 61 72 63 68 79 2e 20 20 2a 2f 0a 20 20 77 68  rarchy.  */.  wh
26730 69 6c 65 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49  ile( p->rc==SQLI
26740 54 45 5f 4f 4b 20 26 26 20 53 51 4c 49 54 45 5f  TE_OK && SQLITE_
26750 52 4f 57 3d 3d 73 71 6c 69 74 65 33 5f 73 74 65  ROW==sqlite3_ste
26760 70 28 70 53 74 6d 74 29 20 29 7b 0a 20 20 20 20  p(pStmt) ){.    
26770 69 36 34 20 69 52 6f 77 3b 20 20 20 20 20 20 20  i64 iRow;       
26780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
26790 20 52 6f 77 69 64 20 66 6f 72 20 74 68 69 73 20   Rowid for this 
267a0 6c 65 61 66 20 2a 2f 0a 20 20 20 20 46 74 73 35  leaf */.    Fts5
267b0 44 61 74 61 20 2a 70 4c 65 61 66 3b 20 20 20 20  Data *pLeaf;    
267c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74            /* Dat
267d0 61 20 66 6f 72 20 74 68 69 73 20 6c 65 61 66 20  a for this leaf 
267e0 2a 2f 0a 0a 20 20 20 20 69 6e 74 20 6e 49 64 78  */..    int nIdx
267f0 54 65 72 6d 20 3d 20 73 71 6c 69 74 65 33 5f 63  Term = sqlite3_c
26800 6f 6c 75 6d 6e 5f 62 79 74 65 73 28 70 53 74 6d  olumn_bytes(pStm
26810 74 2c 20 31 29 3b 0a 20 20 20 20 63 6f 6e 73 74  t, 1);.    const
26820 20 63 68 61 72 20 2a 7a 49 64 78 54 65 72 6d 20   char *zIdxTerm 
26830 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73  = (const char*)s
26840 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65  qlite3_column_te
26850 78 74 28 70 53 74 6d 74 2c 20 31 29 3b 0a 20 20  xt(pStmt, 1);.  
26860 20 20 69 6e 74 20 69 49 64 78 4c 65 61 66 20 3d    int iIdxLeaf =
26870 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
26880 69 6e 74 28 70 53 74 6d 74 2c 20 32 29 3b 0a 20  int(pStmt, 2);. 
26890 20 20 20 69 6e 74 20 62 49 64 78 44 6c 69 64 78     int bIdxDlidx
268a0 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d   = sqlite3_colum
268b0 6e 5f 69 6e 74 28 70 53 74 6d 74 2c 20 33 29 3b  n_int(pStmt, 3);
268c0 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20  ..    /* If the 
268d0 6c 65 61 66 20 69 6e 20 71 75 65 73 74 69 6f 6e  leaf in question
268e0 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65   has already bee
268f0 6e 20 74 72 69 6d 6d 65 64 20 66 72 6f 6d 20 74  n trimmed from t
26900 68 65 20 73 65 67 6d 65 6e 74 2c 20 0a 20 20 20  he segment, .   
26910 20 2a 2a 20 69 67 6e 6f 72 65 20 74 68 69 73 20   ** ignore this 
26920 62 2d 74 72 65 65 20 65 6e 74 72 79 2e 20 4f 74  b-tree entry. Ot
26930 68 65 72 77 69 73 65 2c 20 6c 6f 61 64 20 69 74  herwise, load it
26940 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 2e 20 2a 2f   into memory. */
26950 0a 20 20 20 20 69 66 28 20 69 49 64 78 4c 65 61  .    if( iIdxLea
26960 66 3c 70 53 65 67 2d 3e 70 67 6e 6f 46 69 72 73  f<pSeg->pgnoFirs
26970 74 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  t ) continue;.  
26980 20 20 69 52 6f 77 20 3d 20 46 54 53 35 5f 53 45    iRow = FTS5_SE
26990 47 4d 45 4e 54 5f 52 4f 57 49 44 28 70 53 65 67  GMENT_ROWID(pSeg
269a0 2d 3e 69 53 65 67 69 64 2c 20 30 2c 20 69 49 64  ->iSegid, 0, iId
269b0 78 4c 65 61 66 29 3b 0a 20 20 20 20 70 4c 65 61  xLeaf);.    pLea
269c0 66 20 3d 20 66 74 73 35 44 61 74 61 52 65 61 64  f = fts5DataRead
269d0 28 70 2c 20 69 52 6f 77 29 3b 0a 20 20 20 20 69  (p, iRow);.    i
269e0 66 28 20 70 4c 65 61 66 3d 3d 30 20 29 20 62 72  f( pLeaf==0 ) br
269f0 65 61 6b 3b 0a 0a 20 20 20 20 2f 2a 20 43 68 65  eak;..    /* Che
26a00 63 6b 20 74 68 61 74 20 74 68 65 20 6c 65 61 66  ck that the leaf
26a10 20 63 6f 6e 74 61 69 6e 73 20 61 74 20 6c 65 61   contains at lea
26a20 73 74 20 6f 6e 65 20 74 65 72 6d 2c 20 61 6e 64  st one term, and
26a30 20 74 68 61 74 20 69 74 20 69 73 20 65 71 75 61   that it is equa
26a40 6c 0a 20 20 20 20 2a 2a 20 74 6f 20 6f 72 20 6c  l.    ** to or l
26a50 61 72 67 65 72 20 74 68 61 6e 20 74 68 65 20 73  arger than the s
26a60 70 6c 69 74 2d 6b 65 79 20 69 6e 20 7a 49 64 78  plit-key in zIdx
26a70 54 65 72 6d 2e 20 20 41 6c 73 6f 20 63 68 65 63  Term.  Also chec
26a80 6b 20 74 68 61 74 20 69 66 20 74 68 65 72 65 0a  k that if there.
26a90 20 20 20 20 2a 2a 20 69 73 20 61 6c 73 6f 20 61      ** is also a
26aa0 20 72 6f 77 69 64 20 70 6f 69 6e 74 65 72 20 77   rowid pointer w
26ab0 69 74 68 69 6e 20 74 68 65 20 6c 65 61 66 20 70  ithin the leaf p
26ac0 61 67 65 20 68 65 61 64 65 72 2c 20 69 74 20 70  age header, it p
26ad0 6f 69 6e 74 73 20 74 6f 20 61 0a 20 20 20 20 2a  oints to a.    *
26ae0 2a 20 6c 6f 63 61 74 69 6f 6e 20 62 65 66 6f 72  * location befor
26af0 65 20 74 68 65 20 74 65 72 6d 2e 20 20 2a 2f 0a  e the term.  */.
26b00 20 20 20 20 69 66 28 20 70 4c 65 61 66 2d 3e 6e      if( pLeaf->n
26b10 6e 3c 3d 70 4c 65 61 66 2d 3e 73 7a 4c 65 61 66  n<=pLeaf->szLeaf
26b20 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 72 63 20   ){.      p->rc 
26b30 3d 20 46 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a  = FTS5_CORRUPT;.
26b40 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
26b50 20 69 6e 74 20 69 4f 66 66 3b 20 20 20 20 20 20   int iOff;      
26b60 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
26b70 4f 66 66 73 65 74 20 6f 66 20 66 69 72 73 74 20  Offset of first 
26b80 74 65 72 6d 20 6f 6e 20 6c 65 61 66 20 2a 2f 0a  term on leaf */.
26b90 20 20 20 20 20 20 69 6e 74 20 69 52 6f 77 69 64        int iRowid
26ba0 4f 66 66 3b 20 20 20 20 20 20 20 20 20 20 20 20  Off;            
26bb0 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66 20 66    /* Offset of f
26bc0 69 72 73 74 20 72 6f 77 69 64 20 6f 6e 20 6c 65  irst rowid on le
26bd0 61 66 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  af */.      int 
26be0 6e 54 65 72 6d 3b 20 20 20 20 20 20 20 20 20 20  nTerm;          
26bf0 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
26c00 6f 66 20 74 65 72 6d 20 6f 6e 20 6c 65 61 66 20  of term on leaf 
26c10 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 20 20  in bytes */.    
26c20 20 20 69 6e 74 20 72 65 73 3b 20 20 20 20 20 20    int res;      
26c30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
26c40 20 43 6f 6d 70 61 72 69 73 6f 6e 20 6f 66 20 74   Comparison of t
26c50 65 72 6d 20 61 6e 64 20 73 70 6c 69 74 2d 6b 65  erm and split-ke
26c60 79 20 2a 2f 0a 0a 20 20 20 20 20 20 69 4f 66 66  y */..      iOff
26c70 20 3d 20 66 74 73 35 4c 65 61 66 46 69 72 73 74   = fts5LeafFirst
26c80 54 65 72 6d 4f 66 66 28 70 4c 65 61 66 29 3b 0a  TermOff(pLeaf);.
26c90 20 20 20 20 20 20 69 52 6f 77 69 64 4f 66 66 20        iRowidOff 
26ca0 3d 20 66 74 73 35 4c 65 61 66 46 69 72 73 74 52  = fts5LeafFirstR
26cb0 6f 77 69 64 4f 66 66 28 70 4c 65 61 66 29 3b 0a  owidOff(pLeaf);.
26cc0 20 20 20 20 20 20 69 66 28 20 69 52 6f 77 69 64        if( iRowid
26cd0 4f 66 66 3e 3d 69 4f 66 66 20 29 7b 0a 20 20 20  Off>=iOff ){.   
26ce0 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 46 54 53       p->rc = FTS
26cf0 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20 20 20  5_CORRUPT;.     
26d00 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
26d10 69 4f 66 66 20 2b 3d 20 66 74 73 35 47 65 74 56  iOff += fts5GetV
26d20 61 72 69 6e 74 33 32 28 26 70 4c 65 61 66 2d 3e  arint32(&pLeaf->
26d30 70 5b 69 4f 66 66 5d 2c 20 6e 54 65 72 6d 29 3b  p[iOff], nTerm);
26d40 0a 20 20 20 20 20 20 20 20 72 65 73 20 3d 20 6d  .        res = m
26d50 65 6d 63 6d 70 28 26 70 4c 65 61 66 2d 3e 70 5b  emcmp(&pLeaf->p[
26d60 69 4f 66 66 5d 2c 20 7a 49 64 78 54 65 72 6d 2c  iOff], zIdxTerm,
26d70 20 4d 49 4e 28 6e 54 65 72 6d 2c 20 6e 49 64 78   MIN(nTerm, nIdx
26d80 54 65 72 6d 29 29 3b 0a 20 20 20 20 20 20 20 20  Term));.        
26d90 69 66 28 20 72 65 73 3d 3d 30 20 29 20 72 65 73  if( res==0 ) res
26da0 20 3d 20 6e 54 65 72 6d 20 2d 20 6e 49 64 78 54   = nTerm - nIdxT
26db0 65 72 6d 3b 0a 20 20 20 20 20 20 20 20 69 66 28  erm;.        if(
26dc0 20 72 65 73 3c 30 20 29 20 70 2d 3e 72 63 20 3d   res<0 ) p->rc =
26dd0 20 46 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20   FTS5_CORRUPT;. 
26de0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
26df0 20 66 74 73 35 44 61 74 61 52 65 6c 65 61 73 65   fts5DataRelease
26e00 28 70 4c 65 61 66 29 3b 0a 20 20 20 20 69 66 28  (pLeaf);.    if(
26e10 20 70 2d 3e 72 63 20 29 20 62 72 65 61 6b 3b 0a   p->rc ) break;.
26e20 0a 0a 20 20 20 20 2f 2a 20 4e 6f 77 20 63 68 65  ..    /* Now che
26e30 63 6b 20 74 68 61 74 20 74 68 65 20 69 74 65 72  ck that the iter
26e40 2e 6e 45 6d 70 74 79 20 6c 65 61 76 65 73 20 66  .nEmpty leaves f
26e50 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 63 75 72  ollowing the cur
26e60 72 65 6e 74 20 6c 65 61 66 0a 20 20 20 20 2a 2a  rent leaf.    **
26e70 20 28 61 29 20 65 78 69 73 74 20 61 6e 64 20 28   (a) exist and (
26e80 62 29 20 63 6f 6e 74 61 69 6e 20 6e 6f 20 74 65  b) contain no te
26e90 72 6d 73 2e 20 2a 2f 0a 20 20 20 20 66 74 73 35  rms. */.    fts5
26ea0 49 6e 64 65 78 49 6e 74 65 67 72 69 74 79 43 68  IndexIntegrityCh
26eb0 65 63 6b 45 6d 70 74 79 28 0a 20 20 20 20 20 20  eckEmpty(.      
26ec0 20 20 70 2c 20 70 53 65 67 2c 20 69 49 64 78 50    p, pSeg, iIdxP
26ed0 72 65 76 4c 65 61 66 2b 31 2c 20 69 44 6c 69 64  revLeaf+1, iDlid
26ee0 78 50 72 65 76 4c 65 61 66 2b 31 2c 20 69 49 64  xPrevLeaf+1, iId
26ef0 78 4c 65 61 66 2d 31 0a 20 20 20 20 29 3b 0a 20  xLeaf-1.    );. 
26f00 20 20 20 69 66 28 20 70 2d 3e 72 63 20 29 20 62     if( p->rc ) b
26f10 72 65 61 6b 3b 0a 0a 20 20 20 20 2f 2a 20 49 66  reak;..    /* If
26f20 20 74 68 65 72 65 20 69 73 20 61 20 64 6f 63 6c   there is a docl
26f30 69 73 74 2d 69 6e 64 65 78 2c 20 63 68 65 63 6b  ist-index, check
26f40 20 74 68 61 74 20 69 74 20 6c 6f 6f 6b 73 20 72   that it looks r
26f50 69 67 68 74 2e 20 2a 2f 0a 20 20 20 20 69 66 28  ight. */.    if(
26f60 20 62 49 64 78 44 6c 69 64 78 20 29 7b 0a 20 20   bIdxDlidx ){.  
26f70 20 20 20 20 46 74 73 35 44 6c 69 64 78 49 74 65      Fts5DlidxIte
26f80 72 20 2a 70 44 6c 69 64 78 20 3d 20 30 3b 20 20  r *pDlidx = 0;  
26f90 2f 2a 20 46 6f 72 20 69 74 65 72 61 74 69 6e 67  /* For iterating
26fa0 20 74 68 72 6f 75 67 68 20 64 6f 63 6c 69 73 74   through doclist
26fb0 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 20 20   index */.      
26fc0 69 6e 74 20 69 50 72 65 76 4c 65 61 66 20 3d 20  int iPrevLeaf = 
26fd0 69 49 64 78 4c 65 61 66 3b 0a 20 20 20 20 20 20  iIdxLeaf;.      
26fe0 69 6e 74 20 69 53 65 67 69 64 20 3d 20 70 53 65  int iSegid = pSe
26ff0 67 2d 3e 69 53 65 67 69 64 3b 0a 20 20 20 20 20  g->iSegid;.     
27000 20 69 6e 74 20 69 50 67 20 3d 20 30 3b 0a 20 20   int iPg = 0;.  
27010 20 20 20 20 69 36 34 20 69 4b 65 79 3b 0a 0a 20      i64 iKey;.. 
27020 20 20 20 20 20 66 6f 72 28 70 44 6c 69 64 78 3d       for(pDlidx=
27030 66 74 73 35 44 6c 69 64 78 49 74 65 72 49 6e 69  fts5DlidxIterIni
27040 74 28 70 2c 20 30 2c 20 69 53 65 67 69 64 2c 20  t(p, 0, iSegid, 
27050 69 49 64 78 4c 65 61 66 29 3b 0a 20 20 20 20 20  iIdxLeaf);.     
27060 20 20 20 20 20 66 74 73 35 44 6c 69 64 78 49 74       fts5DlidxIt
27070 65 72 45 6f 66 28 70 2c 20 70 44 6c 69 64 78 29  erEof(p, pDlidx)
27080 3d 3d 30 3b 0a 20 20 20 20 20 20 20 20 20 20 66  ==0;.          f
27090 74 73 35 44 6c 69 64 78 49 74 65 72 4e 65 78 74  ts5DlidxIterNext
270a0 28 70 2c 20 70 44 6c 69 64 78 29 0a 20 20 20 20  (p, pDlidx).    
270b0 20 20 29 7b 0a 0a 20 20 20 20 20 20 20 20 2f 2a    ){..        /*
270c0 20 43 68 65 63 6b 20 61 6e 79 20 72 6f 77 69 64   Check any rowid
270d0 2d 6c 65 73 73 20 70 61 67 65 73 20 74 68 61 74  -less pages that
270e0 20 6f 63 63 75 72 20 62 65 66 6f 72 65 20 74 68   occur before th
270f0 65 20 63 75 72 72 65 6e 74 20 6c 65 61 66 2e 20  e current leaf. 
27100 2a 2f 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69  */.        for(i
27110 50 67 3d 69 50 72 65 76 4c 65 61 66 2b 31 3b 20  Pg=iPrevLeaf+1; 
27120 69 50 67 3c 66 74 73 35 44 6c 69 64 78 49 74 65  iPg<fts5DlidxIte
27130 72 50 67 6e 6f 28 70 44 6c 69 64 78 29 3b 20 69  rPgno(pDlidx); i
27140 50 67 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20  Pg++){.         
27150 20 69 4b 65 79 20 3d 20 46 54 53 35 5f 53 45 47   iKey = FTS5_SEG
27160 4d 45 4e 54 5f 52 4f 57 49 44 28 69 53 65 67 69  MENT_ROWID(iSegi
27170 64 2c 20 30 2c 20 69 50 67 29 3b 0a 20 20 20 20  d, 0, iPg);.    
27180 20 20 20 20 20 20 70 4c 65 61 66 20 3d 20 66 74        pLeaf = ft
27190 73 35 44 61 74 61 52 65 61 64 28 70 2c 20 69 4b  s5DataRead(p, iK
271a0 65 79 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  ey);.          i
271b0 66 28 20 70 4c 65 61 66 20 29 7b 0a 20 20 20 20  f( pLeaf ){.    
271c0 20 20 20 20 20 20 20 20 69 66 28 20 66 74 73 35          if( fts5
271d0 4c 65 61 66 46 69 72 73 74 52 6f 77 69 64 4f 66  LeafFirstRowidOf
271e0 66 28 70 4c 65 61 66 29 21 3d 30 20 29 20 70 2d  f(pLeaf)!=0 ) p-
271f0 3e 72 63 20 3d 20 46 54 53 35 5f 43 4f 52 52 55  >rc = FTS5_CORRU
27200 50 54 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  PT;.            
27210 66 74 73 35 44 61 74 61 52 65 6c 65 61 73 65 28  fts5DataRelease(
27220 70 4c 65 61 66 29 3b 0a 20 20 20 20 20 20 20 20  pLeaf);.        
27230 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
27240 20 20 20 20 20 20 69 50 72 65 76 4c 65 61 66 20        iPrevLeaf 
27250 3d 20 66 74 73 35 44 6c 69 64 78 49 74 65 72 50  = fts5DlidxIterP
27260 67 6e 6f 28 70 44 6c 69 64 78 29 3b 0a 0a 20 20  gno(pDlidx);..  
27270 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74        /* Check t
27280 68 61 74 20 74 68 65 20 6c 65 61 66 20 70 61 67  hat the leaf pag
27290 65 20 69 6e 64 69 63 61 74 65 64 20 62 79 20 74  e indicated by t
272a0 68 65 20 69 74 65 72 61 74 6f 72 20 72 65 61 6c  he iterator real
272b0 6c 79 20 64 6f 65 73 0a 20 20 20 20 20 20 20 20  ly does.        
272c0 2a 2a 20 63 6f 6e 74 61 69 6e 20 74 68 65 20 72  ** contain the r
272d0 6f 77 69 64 20 73 75 67 67 65 73 74 65 64 20 62  owid suggested b
272e0 79 20 74 68 65 20 73 61 6d 65 2e 20 2a 2f 0a 20  y the same. */. 
272f0 20 20 20 20 20 20 20 69 4b 65 79 20 3d 20 46 54         iKey = FT
27300 53 35 5f 53 45 47 4d 45 4e 54 5f 52 4f 57 49 44  S5_SEGMENT_ROWID
27310 28 69 53 65 67 69 64 2c 20 30 2c 20 69 50 72 65  (iSegid, 0, iPre
27320 76 4c 65 61 66 29 3b 0a 20 20 20 20 20 20 20 20  vLeaf);.        
27330 70 4c 65 61 66 20 3d 20 66 74 73 35 44 61 74 61  pLeaf = fts5Data
27340 52 65 61 64 28 70 2c 20 69 4b 65 79 29 3b 0a 20  Read(p, iKey);. 
27350 20 20 20 20 20 20 20 69 66 28 20 70 4c 65 61 66         if( pLeaf
27360 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 36   ){.          i6
27370 34 20 69 52 6f 77 69 64 3b 0a 20 20 20 20 20 20  4 iRowid;.      
27380 20 20 20 20 69 6e 74 20 69 52 6f 77 69 64 4f 66      int iRowidOf
27390 66 20 3d 20 66 74 73 35 4c 65 61 66 46 69 72 73  f = fts5LeafFirs
273a0 74 52 6f 77 69 64 4f 66 66 28 70 4c 65 61 66 29  tRowidOff(pLeaf)
273b0 3b 0a 20 20 20 20 20 20 20 20 20 20 41 53 53 45  ;.          ASSE
273c0 52 54 5f 53 5a 4c 45 41 46 5f 4f 4b 28 70 4c 65  RT_SZLEAF_OK(pLe
273d0 61 66 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  af);.          i
273e0 66 28 20 69 52 6f 77 69 64 4f 66 66 3e 3d 70 4c  f( iRowidOff>=pL
273f0 65 61 66 2d 3e 73 7a 4c 65 61 66 20 29 7b 0a 20  eaf->szLeaf ){. 
27400 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 72 63             p->rc
27410 20 3d 20 46 54 53 35 5f 43 4f 52 52 55 50 54 3b   = FTS5_CORRUPT;
27420 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65  .          }else
27430 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 74  {.            ft
27440 73 35 47 65 74 56 61 72 69 6e 74 28 26 70 4c 65  s5GetVarint(&pLe
27450 61 66 2d 3e 70 5b 69 52 6f 77 69 64 4f 66 66 5d  af->p[iRowidOff]
27460 2c 20 28 75 36 34 2a 29 26 69 52 6f 77 69 64 29  , (u64*)&iRowid)
27470 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
27480 28 20 69 52 6f 77 69 64 21 3d 66 74 73 35 44 6c  ( iRowid!=fts5Dl
27490 69 64 78 49 74 65 72 52 6f 77 69 64 28 70 44 6c  idxIterRowid(pDl
274a0 69 64 78 29 20 29 20 70 2d 3e 72 63 20 3d 20 46  idx) ) p->rc = F
274b0 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20  TS5_CORRUPT;.   
274c0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
274d0 20 20 20 66 74 73 35 44 61 74 61 52 65 6c 65 61     fts5DataRelea
274e0 73 65 28 70 4c 65 61 66 29 3b 0a 20 20 20 20 20  se(pLeaf);.     
274f0 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20     }.      }..  
27500 20 20 20 20 69 44 6c 69 64 78 50 72 65 76 4c 65      iDlidxPrevLe
27510 61 66 20 3d 20 69 50 67 3b 0a 20 20 20 20 20 20  af = iPg;.      
27520 66 74 73 35 44 6c 69 64 78 49 74 65 72 46 72 65  fts5DlidxIterFre
27530 65 28 70 44 6c 69 64 78 29 3b 0a 20 20 20 20 20  e(pDlidx);.     
27540 20 66 74 73 35 54 65 73 74 44 6c 69 64 78 52 65   fts5TestDlidxRe
27550 76 65 72 73 65 28 70 2c 20 69 53 65 67 69 64 2c  verse(p, iSegid,
27560 20 69 49 64 78 4c 65 61 66 29 3b 0a 20 20 20 20   iIdxLeaf);.    
27570 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 44 6c  }else{.      iDl
27580 69 64 78 50 72 65 76 4c 65 61 66 20 3d 20 70 53  idxPrevLeaf = pS
27590 65 67 2d 3e 70 67 6e 6f 4c 61 73 74 3b 0a 20 20  eg->pgnoLast;.  
275a0 20 20 20 20 2f 2a 20 54 4f 44 4f 3a 20 43 68 65      /* TODO: Che
275b0 63 6b 20 74 68 65 72 65 20 69 73 20 6e 6f 20 64  ck there is no d
275c0 6f 63 6c 69 73 74 20 69 6e 64 65 78 20 2a 2f 0a  oclist index */.
275d0 20 20 20 20 7d 0a 0a 20 20 20 20 69 49 64 78 50      }..    iIdxP
275e0 72 65 76 4c 65 61 66 20 3d 20 69 49 64 78 4c 65  revLeaf = iIdxLe
275f0 61 66 3b 0a 20 20 7d 0a 0a 20 20 72 63 32 20 3d  af;.  }..  rc2 =
27600 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a   sqlite3_finaliz
27610 65 28 70 53 74 6d 74 29 3b 0a 20 20 69 66 28 20  e(pStmt);.  if( 
27620 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
27630 20 29 20 70 2d 3e 72 63 20 3d 20 72 63 32 3b 0a   ) p->rc = rc2;.
27640 0a 20 20 2f 2a 20 50 61 67 65 20 69 74 65 72 2e  .  /* Page iter.
27650 69 4c 65 61 66 20 6d 75 73 74 20 6e 6f 77 20 62  iLeaf must now b
27660 65 20 74 68 65 20 72 69 67 68 74 6d 6f 73 74 20  e the rightmost 
27670 6c 65 61 66 2d 70 61 67 65 20 69 6e 20 74 68 65  leaf-page in the
27680 20 73 65 67 6d 65 6e 74 20 2a 2f 0a 23 69 66 20   segment */.#if 
27690 30 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53  0.  if( p->rc==S
276a0 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 74 65 72  QLITE_OK && iter
276b0 2e 69 4c 65 61 66 21 3d 70 53 65 67 2d 3e 70 67  .iLeaf!=pSeg->pg
276c0 6e 6f 4c 61 73 74 20 29 7b 0a 20 20 20 20 70 2d  noLast ){.    p-
276d0 3e 72 63 20 3d 20 46 54 53 35 5f 43 4f 52 52 55  >rc = FTS5_CORRU
276e0 50 54 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d  PT;.  }.#endif.}
276f0 0a 0a 0a 2f 2a 0a 2a 2a 20 52 75 6e 20 69 6e 74  .../*.** Run int
27700 65 72 6e 61 6c 20 63 68 65 63 6b 73 20 74 6f 20  ernal checks to 
27710 65 6e 73 75 72 65 20 74 68 61 74 20 74 68 65 20  ensure that the 
27720 46 54 53 20 69 6e 64 65 78 20 28 61 29 20 69 73  FTS index (a) is
27730 20 69 6e 74 65 72 6e 61 6c 6c 79 20 0a 2a 2a 20   internally .** 
27740 63 6f 6e 73 69 73 74 65 6e 74 20 61 6e 64 20 28  consistent and (
27750 62 29 20 63 6f 6e 74 61 69 6e 73 20 65 6e 74 72  b) contains entr
27760 69 65 73 20 66 6f 72 20 77 68 69 63 68 20 74 68  ies for which th
27770 65 20 58 4f 52 20 6f 66 20 74 68 65 20 63 68 65  e XOR of the che
27780 63 6b 73 75 6d 73 0a 2a 2a 20 61 73 20 63 61 6c  cksums.** as cal
27790 63 75 6c 61 74 65 64 20 62 79 20 66 74 73 35 49  culated by fts5I
277a0 6e 64 65 78 45 6e 74 72 79 43 6b 73 75 6d 28 29  ndexEntryCksum()
277b0 20 69 73 20 63 6b 73 75 6d 2e 0a 2a 2a 0a 2a 2a   is cksum..**.**
277c0 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   Return SQLITE_C
277d0 4f 52 52 55 50 54 20 69 66 20 61 6e 79 20 6f 66  ORRUPT if any of
277e0 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 63 68   the internal ch
277f0 65 63 6b 73 20 66 61 69 6c 2c 20 6f 72 20 69 66  ecks fail, or if
27800 20 74 68 65 0a 2a 2a 20 63 68 65 63 6b 73 75 6d   the.** checksum
27810 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68 2e   does not match.
27820 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
27830 4b 20 69 66 20 61 6c 6c 20 63 68 65 63 6b 73 20  K if all checks 
27840 70 61 73 73 20 77 69 74 68 6f 75 74 0a 2a 2a 20  pass without.** 
27850 65 72 72 6f 72 2c 20 6f 72 20 73 6f 6d 65 20 6f  error, or some o
27860 74 68 65 72 20 53 51 4c 69 74 65 20 65 72 72 6f  ther SQLite erro
27870 72 20 63 6f 64 65 20 69 66 20 61 6e 6f 74 68 65  r code if anothe
27880 72 20 65 72 72 6f 72 20 28 65 2e 67 2e 20 4f 4f  r error (e.g. OO
27890 4d 29 0a 2a 2a 20 6f 63 63 75 72 73 2e 0a 2a 2f  M).** occurs..*/
278a0 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35  .int sqlite3Fts5
278b0 49 6e 64 65 78 49 6e 74 65 67 72 69 74 79 43 68  IndexIntegrityCh
278c0 65 63 6b 28 46 74 73 35 49 6e 64 65 78 20 2a 70  eck(Fts5Index *p
278d0 2c 20 75 36 34 20 63 6b 73 75 6d 29 7b 0a 20 20  , u64 cksum){.  
278e0 75 36 34 20 63 6b 73 75 6d 32 20 3d 20 30 3b 20  u64 cksum2 = 0; 
278f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27900 2f 2a 20 43 68 65 63 6b 73 75 6d 20 62 61 73 65  /* Checksum base
27910 64 20 6f 6e 20 63 6f 6e 74 65 6e 74 73 20 6f 66  d on contents of
27920 20 69 6e 64 65 78 65 73 20 2a 2f 0a 20 20 46 74   indexes */.  Ft
27930 73 35 42 75 66 66 65 72 20 70 6f 73 6c 69 73 74  s5Buffer poslist
27940 20 3d 20 7b 30 2c 30 2c 30 7d 3b 20 20 20 2f 2a   = {0,0,0};   /*
27950 20 42 75 66 66 65 72 20 75 73 65 64 20 74 6f 20   Buffer used to 
27960 68 6f 6c 64 20 61 20 70 6f 73 6c 69 73 74 20 2a  hold a poslist *
27970 2f 0a 20 20 46 74 73 35 49 6e 64 65 78 49 74 65  /.  Fts5IndexIte
27980 72 20 2a 70 49 74 65 72 3b 20 20 20 20 20 20 20  r *pIter;       
27990 20 20 20 20 2f 2a 20 55 73 65 64 20 74 6f 20 69      /* Used to i
279a0 74 65 72 61 74 65 20 74 68 72 6f 75 67 68 20 65  terate through e
279b0 6e 74 69 72 65 20 69 6e 64 65 78 20 2a 2f 0a 20  ntire index */. 
279c0 20 46 74 73 35 53 74 72 75 63 74 75 72 65 20 2a   Fts5Structure *
279d0 70 53 74 72 75 63 74 3b 20 20 20 20 20 20 20 20  pStruct;        
279e0 20 2f 2a 20 49 6e 64 65 78 20 73 74 72 75 63 74   /* Index struct
279f0 75 72 65 20 2a 2f 0a 0a 20 20 2f 2a 20 55 73 65  ure */..  /* Use
27a00 64 20 62 79 20 65 78 74 72 61 20 69 6e 74 65 72  d by extra inter
27a10 6e 61 6c 20 74 65 73 74 73 20 6f 6e 6c 79 20 72  nal tests only r
27a20 75 6e 20 69 66 20 4e 44 45 42 55 47 20 69 73 20  un if NDEBUG is 
27a30 6e 6f 74 20 64 65 66 69 6e 65 64 20 2a 2f 0a 20  not defined */. 
27a40 20 75 36 34 20 63 6b 73 75 6d 33 20 3d 20 30 3b   u64 cksum3 = 0;
27a50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27a60 20 2f 2a 20 43 68 65 63 6b 73 75 6d 20 62 61 73   /* Checksum bas
27a70 65 64 20 6f 6e 20 63 6f 6e 74 65 6e 74 73 20 6f  ed on contents o
27a80 66 20 69 6e 64 65 78 65 73 20 2a 2f 0a 20 20 46  f indexes */.  F
27a90 74 73 35 42 75 66 66 65 72 20 74 65 72 6d 20 3d  ts5Buffer term =
27aa0 20 7b 30 2c 30 2c 30 7d 3b 20 20 20 20 20 20 2f   {0,0,0};      /
27ab0 2a 20 42 75 66 66 65 72 20 75 73 65 64 20 74 6f  * Buffer used to
27ac0 20 68 6f 6c 64 20 6d 6f 73 74 20 72 65 63 65 6e   hold most recen
27ad0 74 20 74 65 72 6d 20 2a 2f 0a 20 20 0a 20 20 2f  t term */.  .  /
27ae0 2a 20 4c 6f 61 64 20 74 68 65 20 46 54 53 20 69  * Load the FTS i
27af0 6e 64 65 78 20 73 74 72 75 63 74 75 72 65 20 2a  ndex structure *
27b00 2f 0a 20 20 70 53 74 72 75 63 74 20 3d 20 66 74  /.  pStruct = ft
27b10 73 35 53 74 72 75 63 74 75 72 65 52 65 61 64 28  s5StructureRead(
27b20 70 29 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20  p);..  /* Check 
27b30 74 68 61 74 20 74 68 65 20 69 6e 74 65 72 6e 61  that the interna
27b40 6c 20 6e 6f 64 65 73 20 6f 66 20 65 61 63 68 20  l nodes of each 
27b50 73 65 67 6d 65 6e 74 20 6d 61 74 63 68 20 74 68  segment match th
27b60 65 20 6c 65 61 76 65 73 20 2a 2f 0a 20 20 69 66  e leaves */.  if
27b70 28 20 70 53 74 72 75 63 74 20 29 7b 0a 20 20 20  ( pStruct ){.   
27b80 20 69 6e 74 20 69 4c 76 6c 2c 20 69 53 65 67 3b   int iLvl, iSeg;
27b90 0a 20 20 20 20 66 6f 72 28 69 4c 76 6c 3d 30 3b  .    for(iLvl=0;
27ba0 20 69 4c 76 6c 3c 70 53 74 72 75 63 74 2d 3e 6e   iLvl<pStruct->n
27bb0 4c 65 76 65 6c 3b 20 69 4c 76 6c 2b 2b 29 7b 0a  Level; iLvl++){.
27bc0 20 20 20 20 20 20 66 6f 72 28 69 53 65 67 3d 30        for(iSeg=0
27bd0 3b 20 69 53 65 67 3c 70 53 74 72 75 63 74 2d 3e  ; iSeg<pStruct->
27be0 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d 2e 6e 53 65  aLevel[iLvl].nSe
27bf0 67 3b 20 69 53 65 67 2b 2b 29 7b 0a 20 20 20 20  g; iSeg++){.    
27c00 20 20 20 20 46 74 73 35 53 74 72 75 63 74 75 72      Fts5Structur
27c10 65 53 65 67 6d 65 6e 74 20 2a 70 53 65 67 20 3d  eSegment *pSeg =
27c20 20 26 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65   &pStruct->aLeve
27c30 6c 5b 69 4c 76 6c 5d 2e 61 53 65 67 5b 69 53 65  l[iLvl].aSeg[iSe
27c40 67 5d 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35  g];.        fts5
27c50 49 6e 64 65 78 49 6e 74 65 67 72 69 74 79 43 68  IndexIntegrityCh
27c60 65 63 6b 53 65 67 6d 65 6e 74 28 70 2c 20 70 53  eckSegment(p, pS
27c70 65 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eg);.      }.   
27c80 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65   }.  }..  /* The
27c90 20 63 6b 73 75 6d 20 61 72 67 75 6d 65 6e 74 20   cksum argument 
27ca0 70 61 73 73 65 64 20 74 6f 20 74 68 69 73 20 66  passed to this f
27cb0 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 63 68 65  unction is a che
27cc0 63 6b 73 75 6d 20 63 61 6c 63 75 6c 61 74 65 64  cksum calculated
27cd0 0a 20 20 2a 2a 20 62 61 73 65 64 20 6f 6e 20 61  .  ** based on a
27ce0 6c 6c 20 65 78 70 65 63 74 65 64 20 65 6e 74 72  ll expected entr
27cf0 69 65 73 20 69 6e 20 74 68 65 20 46 54 53 20 69  ies in the FTS i
27d00 6e 64 65 78 20 28 69 6e 63 6c 75 64 69 6e 67 20  ndex (including 
27d10 70 72 65 66 69 78 20 69 6e 64 65 78 0a 20 20 2a  prefix index.  *
27d20 2a 20 65 6e 74 72 69 65 73 29 2e 20 54 68 69 73  * entries). This
27d30 20 62 6c 6f 63 6b 20 63 68 65 63 6b 73 20 74 68   block checks th
27d40 61 74 20 61 20 63 68 65 63 6b 73 75 6d 20 63 61  at a checksum ca
27d50 6c 63 75 6c 61 74 65 64 20 62 61 73 65 64 20 6f  lculated based o
27d60 6e 20 74 68 65 0a 20 20 2a 2a 20 61 63 74 75 61  n the.  ** actua
27d70 6c 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 46 54  l contents of FT
27d80 53 20 69 6e 64 65 78 20 69 73 20 69 64 65 6e 74  S index is ident
27d90 69 63 61 6c 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ical..  **.  ** 
27da0 54 77 6f 20 76 65 72 73 69 6f 6e 73 20 6f 66 20  Two versions of 
27db0 74 68 65 20 73 61 6d 65 20 63 68 65 63 6b 73 75  the same checksu
27dc0 6d 20 61 72 65 20 63 61 6c 63 75 6c 61 74 65 64  m are calculated
27dd0 2e 20 54 68 65 20 66 69 72 73 74 20 28 73 74 61  . The first (sta
27de0 63 6b 0a 20 20 2a 2a 20 76 61 72 69 61 62 6c 65  ck.  ** variable
27df0 20 63 6b 73 75 6d 32 29 20 62 61 73 65 64 20 6f   cksum2) based o
27e00 6e 20 65 6e 74 72 69 65 73 20 65 78 74 72 61 63  n entries extrac
27e10 74 65 64 20 66 72 6f 6d 20 74 68 65 20 66 75 6c  ted from the ful
27e20 6c 2d 74 65 78 74 20 69 6e 64 65 78 0a 20 20 2a  l-text index.  *
27e30 2a 20 77 68 69 6c 65 20 64 6f 69 6e 67 20 61 20  * while doing a 
27e40 6c 69 6e 65 61 72 20 73 63 61 6e 20 6f 66 20 65  linear scan of e
27e50 61 63 68 20 69 6e 64 69 76 69 64 75 61 6c 20 69  ach individual i
27e60 6e 64 65 78 20 69 6e 20 74 75 72 6e 2e 20 0a 20  ndex in turn. . 
27e70 20 2a 2a 0a 20 20 2a 2a 20 41 73 20 65 61 63 68   **.  ** As each
27e80 20 74 65 72 6d 20 76 69 73 69 74 65 64 20 62 79   term visited by
27e90 20 74 68 65 20 6c 69 6e 65 61 72 20 73 63 61 6e   the linear scan
27ea0 73 2c 20 61 20 73 65 70 61 72 61 74 65 20 71 75  s, a separate qu
27eb0 65 72 79 20 66 6f 72 20 74 68 65 0a 20 20 2a 2a  ery for the.  **
27ec0 20 73 61 6d 65 20 74 65 72 6d 20 69 73 20 70 65   same term is pe
27ed0 72 66 6f 72 6d 65 64 2e 20 63 6b 73 75 6d 33 20  rformed. cksum3 
27ee0 69 73 20 63 61 6c 63 75 6c 61 74 65 64 20 62 61  is calculated ba
27ef0 73 65 64 20 6f 6e 20 74 68 65 20 65 6e 74 72 69  sed on the entri
27f00 65 73 0a 20 20 2a 2a 20 65 78 74 72 61 63 74 65  es.  ** extracte
27f10 64 20 62 79 20 74 68 65 73 65 20 71 75 65 72 69  d by these queri
27f20 65 73 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 66  es..  */.  for(f
27f30 74 73 35 4d 75 6c 74 69 49 74 65 72 4e 65 77 28  ts5MultiIterNew(
27f40 70 2c 20 70 53 74 72 75 63 74 2c 20 30 2c 20 30  p, pStruct, 0, 0
27f50 2c 20 30 2c 20 30 2c 20 2d 31 2c 20 30 2c 20 26  , 0, 0, -1, 0, &
27f60 70 49 74 65 72 29 3b 0a 20 20 20 20 20 20 66 74  pIter);.      ft
27f70 73 35 4d 75 6c 74 69 49 74 65 72 45 6f 66 28 70  s5MultiIterEof(p
27f80 2c 20 70 49 74 65 72 29 3d 3d 30 3b 0a 20 20 20  , pIter)==0;.   
27f90 20 20 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72     fts5MultiIter
27fa0 4e 65 78 74 28 70 2c 20 70 49 74 65 72 2c 20 30  Next(p, pIter, 0
27fb0 2c 20 30 29 0a 20 20 29 7b 0a 20 20 20 20 69 6e  , 0).  ){.    in
27fc0 74 20 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20  t n;            
27fd0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
27fe0 65 20 6f 66 20 74 65 72 6d 20 69 6e 20 62 79 74  e of term in byt
27ff0 65 73 20 2a 2f 0a 20 20 20 20 69 36 34 20 69 50  es */.    i64 iP
28000 6f 73 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  os = 0;         
28010 20 20 20 20 20 20 2f 2a 20 50 6f 73 69 74 69 6f        /* Positio
28020 6e 20 72 65 61 64 20 66 72 6f 6d 20 70 6f 73 6c  n read from posl
28030 69 73 74 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69  ist */.    int i
28040 4f 66 66 20 3d 20 30 3b 20 20 20 20 20 20 20 20  Off = 0;        
28050 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74         /* Offset
28060 20 77 69 74 68 69 6e 20 70 6f 73 6c 69 73 74 20   within poslist 
28070 2a 2f 0a 20 20 20 20 69 36 34 20 69 52 6f 77 69  */.    i64 iRowi
28080 64 20 3d 20 66 74 73 35 4d 75 6c 74 69 49 74 65  d = fts5MultiIte
28090 72 52 6f 77 69 64 28 70 49 74 65 72 29 3b 0a 20  rRowid(pIter);. 
280a0 20 20 20 63 68 61 72 20 2a 7a 20 3d 20 28 63 68     char *z = (ch
280b0 61 72 2a 29 66 74 73 35 4d 75 6c 74 69 49 74 65  ar*)fts5MultiIte
280c0 72 54 65 72 6d 28 70 49 74 65 72 2c 20 26 6e 29  rTerm(pIter, &n)
280d0 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69  ;..    /* If thi
280e0 73 20 69 73 20 61 20 6e 65 77 20 74 65 72 6d 2c  s is a new term,
280f0 20 71 75 65 72 79 20 66 6f 72 20 69 74 2e 20 55   query for it. U
28100 70 64 61 74 65 20 63 6b 73 75 6d 33 20 77 69 74  pdate cksum3 wit
28110 68 20 74 68 65 20 72 65 73 75 6c 74 73 2e 20 2a  h the results. *
28120 2f 0a 20 20 20 20 66 74 73 35 54 65 73 74 54 65  /.    fts5TestTe
28130 72 6d 28 70 2c 20 26 74 65 72 6d 2c 20 7a 2c 20  rm(p, &term, z, 
28140 6e 2c 20 63 6b 73 75 6d 32 2c 20 26 63 6b 73 75  n, cksum2, &cksu
28150 6d 33 29 3b 0a 0a 20 20 20 20 70 6f 73 6c 69 73  m3);..    poslis
28160 74 2e 6e 20 3d 20 30 3b 0a 20 20 20 20 66 74 73  t.n = 0;.    fts
28170 35 4d 75 6c 74 69 49 74 65 72 50 6f 73 6c 69 73  5MultiIterPoslis
28180 74 28 70 2c 20 70 49 74 65 72 2c 20 30 2c 20 26  t(p, pIter, 0, &
28190 70 6f 73 6c 69 73 74 29 3b 0a 20 20 20 20 77 68  poslist);.    wh
281a0 69 6c 65 28 20 30 3d 3d 73 71 6c 69 74 65 33 46  ile( 0==sqlite3F
281b0 74 73 35 50 6f 73 6c 69 73 74 4e 65 78 74 36 34  ts5PoslistNext64
281c0 28 70 6f 73 6c 69 73 74 2e 70 2c 20 70 6f 73 6c  (poslist.p, posl
281d0 69 73 74 2e 6e 2c 20 26 69 4f 66 66 2c 20 26 69  ist.n, &iOff, &i
281e0 50 6f 73 29 20 29 7b 0a 20 20 20 20 20 20 69 6e  Pos) ){.      in
281f0 74 20 69 43 6f 6c 20 3d 20 46 54 53 35 5f 50 4f  t iCol = FTS5_PO
28200 53 32 43 4f 4c 55 4d 4e 28 69 50 6f 73 29 3b 0a  S2COLUMN(iPos);.
28210 20 20 20 20 20 20 69 6e 74 20 69 54 6f 6b 4f 66        int iTokOf
28220 66 20 3d 20 46 54 53 35 5f 50 4f 53 32 4f 46 46  f = FTS5_POS2OFF
28230 53 45 54 28 69 50 6f 73 29 3b 0a 20 20 20 20 20  SET(iPos);.     
28240 20 63 6b 73 75 6d 32 20 5e 3d 20 66 74 73 35 49   cksum2 ^= fts5I
28250 6e 64 65 78 45 6e 74 72 79 43 6b 73 75 6d 28 69  ndexEntryCksum(i
28260 52 6f 77 69 64 2c 20 69 43 6f 6c 2c 20 69 54 6f  Rowid, iCol, iTo
28270 6b 4f 66 66 2c 20 2d 31 2c 20 7a 2c 20 6e 29 3b  kOff, -1, z, n);
28280 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66 74 73  .    }.  }.  fts
28290 35 54 65 73 74 54 65 72 6d 28 70 2c 20 26 74 65  5TestTerm(p, &te
282a0 72 6d 2c 20 30 2c 20 30 2c 20 63 6b 73 75 6d 32  rm, 0, 0, cksum2
282b0 2c 20 26 63 6b 73 75 6d 33 29 3b 0a 0a 20 20 66  , &cksum3);..  f
282c0 74 73 35 4d 75 6c 74 69 49 74 65 72 46 72 65 65  ts5MultiIterFree
282d0 28 70 2c 20 70 49 74 65 72 29 3b 0a 20 20 69 66  (p, pIter);.  if
282e0 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
282f0 4f 4b 20 26 26 20 63 6b 73 75 6d 21 3d 63 6b 73  OK && cksum!=cks
28300 75 6d 32 20 29 20 70 2d 3e 72 63 20 3d 20 46 54  um2 ) p->rc = FT
28310 53 35 5f 43 4f 52 52 55 50 54 3b 0a 0a 20 20 66  S5_CORRUPT;..  f
28320 74 73 35 53 74 72 75 63 74 75 72 65 52 65 6c 65  ts5StructureRele
28330 61 73 65 28 70 53 74 72 75 63 74 29 3b 0a 20 20  ase(pStruct);.  
28340 66 74 73 35 42 75 66 66 65 72 46 72 65 65 28 26  fts5BufferFree(&
28350 74 65 72 6d 29 3b 0a 20 20 66 74 73 35 42 75 66  term);.  fts5Buf
28360 66 65 72 46 72 65 65 28 26 70 6f 73 6c 69 73 74  ferFree(&poslist
28370 29 3b 0a 20 20 72 65 74 75 72 6e 20 66 74 73 35  );.  return fts5
28380 49 6e 64 65 78 52 65 74 75 72 6e 28 70 29 3b 0a  IndexReturn(p);.
28390 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 61 6c 63 75 6c  }.../*.** Calcul
283a0 61 74 65 20 61 6e 64 20 72 65 74 75 72 6e 20 61  ate and return a
283b0 20 63 68 65 63 6b 73 75 6d 20 74 68 61 74 20 69   checksum that i
283c0 73 20 74 68 65 20 58 4f 52 20 6f 66 20 74 68 65  s the XOR of the
283d0 20 69 6e 64 65 78 20 65 6e 74 72 79 0a 2a 2a 20   index entry.** 
283e0 63 68 65 63 6b 73 75 6d 20 6f 66 20 61 6c 6c 20  checksum of all 
283f0 65 6e 74 72 69 65 73 20 74 68 61 74 20 77 6f 75  entries that wou
28400 6c 64 20 62 65 20 67 65 6e 65 72 61 74 65 64 20  ld be generated 
28410 62 79 20 74 68 65 20 74 6f 6b 65 6e 20 73 70 65  by the token spe
28420 63 69 66 69 65 64 0a 2a 2a 20 62 79 20 74 68 65  cified.** by the
28430 20 66 69 6e 61 6c 20 35 20 61 72 67 75 6d 65 6e   final 5 argumen
28440 74 73 2e 0a 2a 2f 0a 75 36 34 20 73 71 6c 69 74  ts..*/.u64 sqlit
28450 65 33 46 74 73 35 49 6e 64 65 78 43 6b 73 75 6d  e3Fts5IndexCksum
28460 28 0a 20 20 46 74 73 35 43 6f 6e 66 69 67 20 2a  (.  Fts5Config *
28470 70 43 6f 6e 66 69 67 2c 20 20 20 20 20 20 20 20  pConfig,        
28480 20 20 20 20 2f 2a 20 43 6f 6e 66 69 67 75 72 61      /* Configura
28490 74 69 6f 6e 20 6f 62 6a 65 63 74 20 2a 2f 0a 20  tion object */. 
284a0 20 69 36 34 20 69 52 6f 77 69 64 2c 20 20 20 20   i64 iRowid,    
284b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
284c0 20 2f 2a 20 44 6f 63 75 6d 65 6e 74 20 74 65 72   /* Document ter
284d0 6d 20 61 70 70 65 61 72 73 20 69 6e 20 2a 2f 0a  m appears in */.
284e0 20 20 69 6e 74 20 69 43 6f 6c 2c 20 20 20 20 20    int iCol,     
284f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28500 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 74 65 72 6d    /* Column term
28510 20 61 70 70 65 61 72 73 20 69 6e 20 2a 2f 0a 20   appears in */. 
28520 20 69 6e 74 20 69 50 6f 73 2c 20 20 20 20 20 20   int iPos,      
28530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28540 20 2f 2a 20 50 6f 73 69 74 69 6f 6e 20 74 65 72   /* Position ter
28550 6d 20 61 70 70 65 61 72 73 20 69 6e 20 2a 2f 0a  m appears in */.
28560 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 70 54    const char *pT
28570 65 72 6d 2c 20 69 6e 74 20 6e 54 65 72 6d 20 20  erm, int nTerm  
28580 20 20 2f 2a 20 54 65 72 6d 20 61 74 20 69 50 6f    /* Term at iPo
28590 73 20 2a 2f 0a 29 7b 0a 20 20 75 36 34 20 72 65  s */.){.  u64 re
285a0 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  t = 0;          
285b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
285c0 75 72 6e 20 76 61 6c 75 65 20 2a 2f 0a 20 20 69  urn value */.  i
285d0 6e 74 20 69 49 64 78 3b 20 20 20 20 20 20 20 20  nt iIdx;        
285e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
285f0 2a 20 46 6f 72 20 69 74 65 72 61 74 69 6e 67 20  * For iterating 
28600 74 68 72 6f 75 67 68 20 69 6e 64 65 78 65 73 20  through indexes 
28610 2a 2f 0a 0a 20 20 72 65 74 20 3d 20 66 74 73 35  */..  ret = fts5
28620 49 6e 64 65 78 45 6e 74 72 79 43 6b 73 75 6d 28  IndexEntryCksum(
28630 69 52 6f 77 69 64 2c 20 69 43 6f 6c 2c 20 69 50  iRowid, iCol, iP
28640 6f 73 2c 20 30 2c 20 70 54 65 72 6d 2c 20 6e 54  os, 0, pTerm, nT
28650 65 72 6d 29 3b 0a 0a 20 20 66 6f 72 28 69 49 64  erm);..  for(iId
28660 78 3d 30 3b 20 69 49 64 78 3c 70 43 6f 6e 66 69  x=0; iIdx<pConfi
28670 67 2d 3e 6e 50 72 65 66 69 78 3b 20 69 49 64 78  g->nPrefix; iIdx
28680 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6e 42 79  ++){.    int nBy
28690 74 65 20 3d 20 66 74 73 35 49 6e 64 65 78 43 68  te = fts5IndexCh
286a0 61 72 6c 65 6e 54 6f 42 79 74 65 6c 65 6e 28 70  arlenToBytelen(p
286b0 54 65 72 6d 2c 20 6e 54 65 72 6d 2c 20 70 43 6f  Term, nTerm, pCo
286c0 6e 66 69 67 2d 3e 61 50 72 65 66 69 78 5b 69 49  nfig->aPrefix[iI
286d0 64 78 5d 29 3b 0a 20 20 20 20 69 66 28 20 6e 42  dx]);.    if( nB
286e0 79 74 65 20 29 7b 0a 20 20 20 20 20 20 72 65 74  yte ){.      ret
286f0 20 5e 3d 20 66 74 73 35 49 6e 64 65 78 45 6e 74   ^= fts5IndexEnt
28700 72 79 43 6b 73 75 6d 28 69 52 6f 77 69 64 2c 20  ryCksum(iRowid, 
28710 69 43 6f 6c 2c 20 69 50 6f 73 2c 20 69 49 64 78  iCol, iPos, iIdx
28720 2b 31 2c 20 70 54 65 72 6d 2c 20 6e 42 79 74 65  +1, pTerm, nByte
28730 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
28740 72 65 74 75 72 6e 20 72 65 74 3b 0a 7d 0a 0a 2f  return ret;.}../
28750 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
28760 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
28770 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
28780 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
28790 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a  *********.******
287a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
287b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
287c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
287d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
287e0 2a 2a 2a 2a 0a 2a 2a 20 42 65 6c 6f 77 20 74 68  ****.** Below th
287f0 69 73 20 70 6f 69 6e 74 20 69 73 20 74 68 65 20  is point is the 
28800 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f  implementation o
28810 66 20 74 68 65 20 66 74 73 35 5f 64 65 63 6f 64  f the fts5_decod
28820 65 28 29 20 73 63 61 6c 61 72 0a 2a 2a 20 66 75  e() scalar.** fu
28830 6e 63 74 69 6f 6e 20 6f 6e 6c 79 2e 0a 2a 2f 0a  nction only..*/.
28840 0a 2f 2a 0a 2a 2a 20 44 65 63 6f 64 65 20 61 20  ./*.** Decode a 
28850 73 65 67 6d 65 6e 74 2d 64 61 74 61 20 72 6f 77  segment-data row
28860 69 64 20 66 72 6f 6d 20 74 68 65 20 25 5f 64 61  id from the %_da
28870 74 61 20 74 61 62 6c 65 2e 20 54 68 69 73 20 66  ta table. This f
28880 75 6e 63 74 69 6f 6e 20 69 73 0a 2a 2a 20 74 68  unction is.** th
28890 65 20 6f 70 70 6f 73 69 74 65 20 6f 66 20 6d 61  e opposite of ma
288a0 63 72 6f 20 46 54 53 35 5f 53 45 47 4d 45 4e 54  cro FTS5_SEGMENT
288b0 5f 52 4f 57 49 44 28 29 2e 0a 2a 2f 0a 73 74 61  _ROWID()..*/.sta
288c0 74 69 63 20 76 6f 69 64 20 66 74 73 35 44 65 63  tic void fts5Dec
288d0 6f 64 65 52 6f 77 69 64 28 0a 20 20 69 36 34 20  odeRowid(.  i64 
288e0 69 52 6f 77 69 64 2c 20 20 20 20 20 20 20 20 20  iRowid,         
288f0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
28900 6f 77 69 64 20 66 72 6f 6d 20 25 5f 64 61 74 61  owid from %_data
28910 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20   table */.  int 
28920 2a 70 69 53 65 67 69 64 2c 20 20 20 20 20 20 20  *piSegid,       
28930 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
28940 55 54 3a 20 53 65 67 6d 65 6e 74 20 69 64 20 2a  UT: Segment id *
28950 2f 0a 20 20 69 6e 74 20 2a 70 62 44 6c 69 64 78  /.  int *pbDlidx
28960 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
28970 20 20 20 20 2f 2a 20 4f 55 54 3a 20 44 6c 69 64      /* OUT: Dlid
28980 78 20 66 6c 61 67 20 2a 2f 0a 20 20 69 6e 74 20  x flag */.  int 
28990 2a 70 69 48 65 69 67 68 74 2c 20 20 20 20 20 20  *piHeight,      
289a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
289b0 55 54 3a 20 48 65 69 67 68 74 20 2a 2f 0a 20 20  UT: Height */.  
289c0 69 6e 74 20 2a 70 69 50 67 6e 6f 20 20 20 20 20  int *piPgno     
289d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
289e0 2f 2a 20 4f 55 54 3a 20 50 61 67 65 20 6e 75 6d  /* OUT: Page num
289f0 62 65 72 20 2a 2f 0a 29 7b 0a 20 20 2a 70 69 50  ber */.){.  *piP
28a00 67 6e 6f 20 3d 20 28 69 6e 74 29 28 69 52 6f 77  gno = (int)(iRow
28a10 69 64 20 26 20 28 28 28 69 36 34 29 31 20 3c 3c  id & (((i64)1 <<
28a20 20 46 54 53 35 5f 44 41 54 41 5f 50 41 47 45 5f   FTS5_DATA_PAGE_
28a30 42 29 20 2d 20 31 29 29 3b 0a 20 20 69 52 6f 77  B) - 1));.  iRow
28a40 69 64 20 3e 3e 3d 20 46 54 53 35 5f 44 41 54 41  id >>= FTS5_DATA
28a50 5f 50 41 47 45 5f 42 3b 0a 0a 20 20 2a 70 69 48  _PAGE_B;..  *piH
28a60 65 69 67 68 74 20 3d 20 28 69 6e 74 29 28 69 52  eight = (int)(iR
28a70 6f 77 69 64 20 26 20 28 28 28 69 36 34 29 31 20  owid & (((i64)1 
28a80 3c 3c 20 46 54 53 35 5f 44 41 54 41 5f 48 45 49  << FTS5_DATA_HEI
28a90 47 48 54 5f 42 29 20 2d 20 31 29 29 3b 0a 20 20  GHT_B) - 1));.  
28aa0 69 52 6f 77 69 64 20 3e 3e 3d 20 46 54 53 35 5f  iRowid >>= FTS5_
28ab0 44 41 54 41 5f 48 45 49 47 48 54 5f 42 3b 0a 0a  DATA_HEIGHT_B;..
28ac0 20 20 2a 70 62 44 6c 69 64 78 20 3d 20 28 69 6e    *pbDlidx = (in
28ad0 74 29 28 69 52 6f 77 69 64 20 26 20 30 78 30 30  t)(iRowid & 0x00
28ae0 30 31 29 3b 0a 20 20 69 52 6f 77 69 64 20 3e 3e  01);.  iRowid >>
28af0 3d 20 46 54 53 35 5f 44 41 54 41 5f 44 4c 49 5f  = FTS5_DATA_DLI_
28b00 42 3b 0a 0a 20 20 2a 70 69 53 65 67 69 64 20 3d  B;..  *piSegid =
28b10 20 28 69 6e 74 29 28 69 52 6f 77 69 64 20 26 20   (int)(iRowid & 
28b20 28 28 28 69 36 34 29 31 20 3c 3c 20 46 54 53 35  (((i64)1 << FTS5
28b30 5f 44 41 54 41 5f 49 44 5f 42 29 20 2d 20 31 29  _DATA_ID_B) - 1)
28b40 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69  );.}..static voi
28b50 64 20 66 74 73 35 44 65 62 75 67 52 6f 77 69 64  d fts5DebugRowid
28b60 28 69 6e 74 20 2a 70 52 63 2c 20 46 74 73 35 42  (int *pRc, Fts5B
28b70 75 66 66 65 72 20 2a 70 42 75 66 2c 20 69 36 34  uffer *pBuf, i64
28b80 20 69 4b 65 79 29 7b 0a 20 20 69 6e 74 20 69 53   iKey){.  int iS
28b90 65 67 69 64 2c 20 69 48 65 69 67 68 74 2c 20 69  egid, iHeight, i
28ba0 50 67 6e 6f 2c 20 62 44 6c 69 64 78 3b 20 20 20  Pgno, bDlidx;   
28bb0 20 20 20 20 2f 2a 20 52 6f 77 69 64 20 63 6f 6d      /* Rowid com
28bc0 70 65 6e 65 6e 74 73 20 2a 2f 0a 20 20 66 74 73  penents */.  fts
28bd0 35 44 65 63 6f 64 65 52 6f 77 69 64 28 69 4b 65  5DecodeRowid(iKe
28be0 79 2c 20 26 69 53 65 67 69 64 2c 20 26 62 44 6c  y, &iSegid, &bDl
28bf0 69 64 78 2c 20 26 69 48 65 69 67 68 74 2c 20 26  idx, &iHeight, &
28c00 69 50 67 6e 6f 29 3b 0a 0a 20 20 69 66 28 20 69  iPgno);..  if( i
28c10 53 65 67 69 64 3d 3d 30 20 29 7b 0a 20 20 20 20  Segid==0 ){.    
28c20 69 66 28 20 69 4b 65 79 3d 3d 46 54 53 35 5f 41  if( iKey==FTS5_A
28c30 56 45 52 41 47 45 53 5f 52 4f 57 49 44 20 29 7b  VERAGES_ROWID ){
28c40 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 46 74  .      sqlite3Ft
28c50 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 50 72  s5BufferAppendPr
28c60 69 6e 74 66 28 70 52 63 2c 20 70 42 75 66 2c 20  intf(pRc, pBuf, 
28c70 22 7b 61 76 65 72 61 67 65 73 7d 20 22 29 3b 0a  "{averages} ");.
28c80 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
28c90 20 73 71 6c 69 74 65 33 46 74 73 35 42 75 66 66   sqlite3Fts5Buff
28ca0 65 72 41 70 70 65 6e 64 50 72 69 6e 74 66 28 70  erAppendPrintf(p
28cb0 52 63 2c 20 70 42 75 66 2c 20 22 7b 73 74 72 75  Rc, pBuf, "{stru
28cc0 63 74 75 72 65 7d 22 29 3b 0a 20 20 20 20 7d 0a  cture}");.    }.
28cd0 20 20 7d 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20    }.  else{.    
28ce0 73 71 6c 69 74 65 33 46 74 73 35 42 75 66 66 65  sqlite3Fts5Buffe
28cf0 72 41 70 70 65 6e 64 50 72 69 6e 74 66 28 70 52  rAppendPrintf(pR
28d00 63 2c 20 70 42 75 66 2c 20 22 7b 25 73 73 65 67  c, pBuf, "{%sseg
28d10 69 64 3d 25 64 20 68 3d 25 64 20 70 67 6e 6f 3d  id=%d h=%d pgno=
28d20 25 64 7d 22 2c 0a 20 20 20 20 20 20 20 20 62 44  %d}",.        bD
28d30 6c 69 64 78 20 3f 20 22 64 6c 69 64 78 20 22 20  lidx ? "dlidx " 
28d40 3a 20 22 22 2c 20 69 53 65 67 69 64 2c 20 69 48  : "", iSegid, iH
28d50 65 69 67 68 74 2c 20 69 50 67 6e 6f 0a 20 20 20  eight, iPgno.   
28d60 20 29 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69   );.  }.}..stati
28d70 63 20 76 6f 69 64 20 66 74 73 35 44 65 62 75 67  c void fts5Debug
28d80 53 74 72 75 63 74 75 72 65 28 0a 20 20 69 6e 74  Structure(.  int
28d90 20 2a 70 52 63 2c 20 20 20 20 20 20 20 20 20 20   *pRc,          
28da0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
28db0 49 4e 2f 4f 55 54 3a 20 65 72 72 6f 72 20 63 6f  IN/OUT: error co
28dc0 64 65 20 2a 2f 0a 20 20 46 74 73 35 42 75 66 66  de */.  Fts5Buff
28dd0 65 72 20 2a 70 42 75 66 2c 0a 20 20 46 74 73 35  er *pBuf,.  Fts5
28de0 53 74 72 75 63 74 75 72 65 20 2a 70 0a 29 7b 0a  Structure *p.){.
28df0 20 20 69 6e 74 20 69 4c 76 6c 2c 20 69 53 65 67    int iLvl, iSeg
28e00 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
28e10 20 20 2f 2a 20 49 74 65 72 61 74 65 20 74 68 72    /* Iterate thr
28e20 6f 75 67 68 20 6c 65 76 65 6c 73 2c 20 73 65 67  ough levels, seg
28e30 6d 65 6e 74 73 20 2a 2f 0a 0a 20 20 66 6f 72 28  ments */..  for(
28e40 69 4c 76 6c 3d 30 3b 20 69 4c 76 6c 3c 70 2d 3e  iLvl=0; iLvl<p->
28e50 6e 4c 65 76 65 6c 3b 20 69 4c 76 6c 2b 2b 29 7b  nLevel; iLvl++){
28e60 0a 20 20 20 20 46 74 73 35 53 74 72 75 63 74 75  .    Fts5Structu
28e70 72 65 4c 65 76 65 6c 20 2a 70 4c 76 6c 20 3d 20  reLevel *pLvl = 
28e80 26 70 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d  &p->aLevel[iLvl]
28e90 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 46 74 73  ;.    sqlite3Fts
28ea0 35 42 75 66 66 65 72 41 70 70 65 6e 64 50 72 69  5BufferAppendPri
28eb0 6e 74 66 28 70 52 63 2c 20 70 42 75 66 2c 20 0a  ntf(pRc, pBuf, .
28ec0 20 20 20 20 20 20 20 20 22 20 7b 6c 76 6c 3d 25          " {lvl=%
28ed0 64 20 6e 4d 65 72 67 65 3d 25 64 20 6e 53 65 67  d nMerge=%d nSeg
28ee0 3d 25 64 22 2c 20 69 4c 76 6c 2c 20 70 4c 76 6c  =%d", iLvl, pLvl
28ef0 2d 3e 6e 4d 65 72 67 65 2c 20 70 4c 76 6c 2d 3e  ->nMerge, pLvl->
28f00 6e 53 65 67 0a 20 20 20 20 29 3b 0a 20 20 20 20  nSeg.    );.    
28f10 66 6f 72 28 69 53 65 67 3d 30 3b 20 69 53 65 67  for(iSeg=0; iSeg
28f20 3c 70 4c 76 6c 2d 3e 6e 53 65 67 3b 20 69 53 65  <pLvl->nSeg; iSe
28f30 67 2b 2b 29 7b 0a 20 20 20 20 20 20 46 74 73 35  g++){.      Fts5
28f40 53 74 72 75 63 74 75 72 65 53 65 67 6d 65 6e 74  StructureSegment
28f50 20 2a 70 53 65 67 20 3d 20 26 70 4c 76 6c 2d 3e   *pSeg = &pLvl->
28f60 61 53 65 67 5b 69 53 65 67 5d 3b 0a 20 20 20 20  aSeg[iSeg];.    
28f70 20 20 73 71 6c 69 74 65 33 46 74 73 35 42 75 66    sqlite3Fts5Buf
28f80 66 65 72 41 70 70 65 6e 64 50 72 69 6e 74 66 28  ferAppendPrintf(
28f90 70 52 63 2c 20 70 42 75 66 2c 20 0a 20 20 20 20  pRc, pBuf, .    
28fa0 20 20 20 20 20 20 22 20 7b 69 64 3d 25 64 20 68        " {id=%d h
28fb0 3d 25 64 20 6c 65 61 76 65 73 3d 25 64 2e 2e 25  =%d leaves=%d..%
28fc0 64 7d 22 2c 20 70 53 65 67 2d 3e 69 53 65 67 69  d}", pSeg->iSegi
28fd0 64 2c 20 70 53 65 67 2d 3e 6e 48 65 69 67 68 74  d, pSeg->nHeight
28fe0 2c 20 0a 20 20 20 20 20 20 20 20 20 20 70 53 65  , .          pSe
28ff0 67 2d 3e 70 67 6e 6f 46 69 72 73 74 2c 20 70 53  g->pgnoFirst, pS
29000 65 67 2d 3e 70 67 6e 6f 4c 61 73 74 0a 20 20 20  eg->pgnoLast.   
29010 20 20 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20     );.    }.    
29020 73 71 6c 69 74 65 33 46 74 73 35 42 75 66 66 65  sqlite3Fts5Buffe
29030 72 41 70 70 65 6e 64 50 72 69 6e 74 66 28 70 52  rAppendPrintf(pR
29040 63 2c 20 70 42 75 66 2c 20 22 7d 22 29 3b 0a 20  c, pBuf, "}");. 
29050 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73   }.}../*.** This
29060 20 69 73 20 70 61 72 74 20 6f 66 20 74 68 65 20   is part of the 
29070 66 74 73 35 5f 64 65 63 6f 64 65 28 29 20 64 65  fts5_decode() de
29080 62 75 67 67 69 6e 67 20 61 69 64 2e 0a 2a 2a 0a  bugging aid..**.
29090 2a 2a 20 41 72 67 75 6d 65 6e 74 73 20 70 42 6c  ** Arguments pBl
290a0 6f 62 2f 6e 42 6c 6f 62 20 63 6f 6e 74 61 69 6e  ob/nBlob contain
290b0 20 61 20 73 65 72 69 61 6c 69 7a 65 64 20 46 74   a serialized Ft
290c0 73 35 53 74 72 75 63 74 75 72 65 20 6f 62 6a 65  s5Structure obje
290d0 63 74 2e 20 54 68 69 73 0a 2a 2a 20 66 75 6e 63  ct. This.** func
290e0 74 69 6f 6e 20 61 70 70 65 6e 64 73 20 61 20 68  tion appends a h
290f0 75 6d 61 6e 2d 72 65 61 64 61 62 6c 65 20 72 65  uman-readable re
29100 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20  presentation of 
29110 74 68 65 20 73 61 6d 65 20 6f 62 6a 65 63 74 0a  the same object.
29120 2a 2a 20 74 6f 20 74 68 65 20 62 75 66 66 65 72  ** to the buffer
29130 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73   passed as the s
29140 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2e 20  econd argument. 
29150 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
29160 66 74 73 35 44 65 63 6f 64 65 53 74 72 75 63 74  fts5DecodeStruct
29170 75 72 65 28 0a 20 20 69 6e 74 20 2a 70 52 63 2c  ure(.  int *pRc,
29180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29190 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54         /* IN/OUT
291a0 3a 20 65 72 72 6f 72 20 63 6f 64 65 20 2a 2f 0a  : error code */.
291b0 20 20 46 74 73 35 42 75 66 66 65 72 20 2a 70 42    Fts5Buffer *pB
291c0 75 66 2c 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a  uf,.  const u8 *
291d0 70 42 6c 6f 62 2c 20 69 6e 74 20 6e 42 6c 6f 62  pBlob, int nBlob
291e0 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20  .){.  int rc;   
291f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29200 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
29210 63 6f 64 65 20 2a 2f 0a 20 20 46 74 73 35 53 74  code */.  Fts5St
29220 72 75 63 74 75 72 65 20 2a 70 20 3d 20 30 3b 20  ructure *p = 0; 
29230 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 65 63            /* Dec
29240 6f 64 65 64 20 73 74 72 75 63 74 75 72 65 20 6f  oded structure o
29250 62 6a 65 63 74 20 2a 2f 0a 0a 20 20 72 63 20 3d  bject */..  rc =
29260 20 66 74 73 35 53 74 72 75 63 74 75 72 65 44 65   fts5StructureDe
29270 63 6f 64 65 28 70 42 6c 6f 62 2c 20 6e 42 6c 6f  code(pBlob, nBlo
29280 62 2c 20 30 2c 20 26 70 29 3b 0a 20 20 69 66 28  b, 0, &p);.  if(
29290 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
292a0 7b 0a 20 20 20 20 2a 70 52 63 20 3d 20 72 63 3b  {.    *pRc = rc;
292b0 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
292c0 0a 0a 20 20 66 74 73 35 44 65 62 75 67 53 74 72  ..  fts5DebugStr
292d0 75 63 74 75 72 65 28 70 52 63 2c 20 70 42 75 66  ucture(pRc, pBuf
292e0 2c 20 70 29 3b 0a 20 20 66 74 73 35 53 74 72 75  , p);.  fts5Stru
292f0 63 74 75 72 65 52 65 6c 65 61 73 65 28 70 29 3b  ctureRelease(p);
29300 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42 75 66 66 65 72  .}../*.** Buffer
29310 20 28 61 2f 6e 29 20 69 73 20 61 73 73 75 6d 65   (a/n) is assume
29320 64 20 74 6f 20 63 6f 6e 74 61 69 6e 20 61 20 6c  d to contain a l
29330 69 73 74 20 6f 66 20 73 65 72 69 61 6c 69 7a 65  ist of serialize
29340 64 20 76 61 72 69 6e 74 73 2e 20 52 65 61 64 0a  d varints. Read.
29350 2a 2a 20 65 61 63 68 20 76 61 72 69 6e 74 20 61  ** each varint a
29360 6e 64 20 61 70 70 65 6e 64 20 69 74 73 20 73 74  nd append its st
29370 72 69 6e 67 20 72 65 70 72 65 73 65 6e 74 61 74  ring representat
29380 69 6f 6e 20 74 6f 20 62 75 66 66 65 72 20 70 42  ion to buffer pB
29390 75 66 2e 20 52 65 74 75 72 6e 0a 2a 2a 20 61 66  uf. Return.** af
293a0 74 65 72 20 65 69 74 68 65 72 20 74 68 65 20 69  ter either the i
293b0 6e 70 75 74 20 62 75 66 66 65 72 20 69 73 20 65  nput buffer is e
293c0 78 68 61 75 73 74 65 64 20 6f 72 20 61 20 30 20  xhausted or a 0 
293d0 76 61 6c 75 65 20 69 73 20 72 65 61 64 2e 0a 2a  value is read..*
293e0 2a 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 20  *.** The return 
293f0 76 61 6c 75 65 20 69 73 20 74 68 65 20 6e 75 6d  value is the num
29400 62 65 72 20 6f 66 20 62 79 74 65 73 20 72 65 61  ber of bytes rea
29410 64 20 66 72 6f 6d 20 74 68 65 20 69 6e 70 75 74  d from the input
29420 20 62 75 66 66 65 72 2e 0a 2a 2f 0a 73 74 61 74   buffer..*/.stat
29430 69 63 20 69 6e 74 20 66 74 73 35 44 65 63 6f 64  ic int fts5Decod
29440 65 50 6f 73 6c 69 73 74 28 69 6e 74 20 2a 70 52  ePoslist(int *pR
29450 63 2c 20 46 74 73 35 42 75 66 66 65 72 20 2a 70  c, Fts5Buffer *p
29460 42 75 66 2c 20 63 6f 6e 73 74 20 75 38 20 2a 61  Buf, const u8 *a
29470 2c 20 69 6e 74 20 6e 29 7b 0a 20 20 69 6e 74 20  , int n){.  int 
29480 69 4f 66 66 20 3d 20 30 3b 0a 20 20 77 68 69 6c  iOff = 0;.  whil
29490 65 28 20 69 4f 66 66 3c 6e 20 29 7b 0a 20 20 20  e( iOff<n ){.   
294a0 20 69 6e 74 20 69 56 61 6c 3b 0a 20 20 20 20 69   int iVal;.    i
294b0 4f 66 66 20 2b 3d 20 66 74 73 35 47 65 74 56 61  Off += fts5GetVa
294c0 72 69 6e 74 33 32 28 26 61 5b 69 4f 66 66 5d 2c  rint32(&a[iOff],
294d0 20 69 56 61 6c 29 3b 0a 20 20 20 20 73 71 6c 69   iVal);.    sqli
294e0 74 65 33 46 74 73 35 42 75 66 66 65 72 41 70 70  te3Fts5BufferApp
294f0 65 6e 64 50 72 69 6e 74 66 28 70 52 63 2c 20 70  endPrintf(pRc, p
29500 42 75 66 2c 20 22 20 25 64 22 2c 20 69 56 61 6c  Buf, " %d", iVal
29510 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
29520 69 4f 66 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  iOff;.}../*.** T
29530 68 65 20 73 74 61 72 74 20 6f 66 20 62 75 66 66  he start of buff
29540 65 72 20 28 61 2f 6e 29 20 63 6f 6e 74 61 69 6e  er (a/n) contain
29550 73 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 61  s the start of a
29560 20 64 6f 63 6c 69 73 74 2e 20 54 68 65 20 64 6f   doclist. The do
29570 63 6c 69 73 74 0a 2a 2a 20 6d 61 79 20 6f 72 20  clist.** may or 
29580 6d 61 79 20 6e 6f 74 20 66 69 6e 69 73 68 20 77  may not finish w
29590 69 74 68 69 6e 20 74 68 65 20 62 75 66 66 65 72  ithin the buffer
295a0 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  . This function 
295b0 61 70 70 65 6e 64 73 20 61 20 74 65 78 74 0a 2a  appends a text.*
295c0 2a 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e  * representation
295d0 20 6f 66 20 74 68 65 20 70 61 72 74 20 6f 66 20   of the part of 
295e0 74 68 65 20 64 6f 63 6c 69 73 74 20 74 68 61 74  the doclist that
295f0 20 69 73 20 70 72 65 73 65 6e 74 20 74 6f 20 62   is present to b
29600 75 66 66 65 72 0a 2a 2a 20 70 42 75 66 2e 20 0a  uffer.** pBuf. .
29610 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e  **.** The return
29620 20 76 61 6c 75 65 20 69 73 20 74 68 65 20 6e 75   value is the nu
29630 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 72 65  mber of bytes re
29640 61 64 20 66 72 6f 6d 20 74 68 65 20 69 6e 70 75  ad from the inpu
29650 74 20 62 75 66 66 65 72 2e 0a 2a 2f 0a 73 74 61  t buffer..*/.sta
29660 74 69 63 20 69 6e 74 20 66 74 73 35 44 65 63 6f  tic int fts5Deco
29670 64 65 44 6f 63 6c 69 73 74 28 69 6e 74 20 2a 70  deDoclist(int *p
29680 52 63 2c 20 46 74 73 35 42 75 66 66 65 72 20 2a  Rc, Fts5Buffer *
29690 70 42 75 66 2c 20 63 6f 6e 73 74 20 75 38 20 2a  pBuf, const u8 *
296a0 61 2c 20 69 6e 74 20 6e 29 7b 0a 20 20 69 36 34  a, int n){.  i64
296b0 20 69 44 6f 63 69 64 3b 0a 20 20 69 6e 74 20 69   iDocid;.  int i
296c0 4f 66 66 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20  Off = 0;..  if( 
296d0 6e 3e 30 20 29 7b 0a 20 20 20 20 69 4f 66 66 20  n>0 ){.    iOff 
296e0 3d 20 73 71 6c 69 74 65 33 46 74 73 35 47 65 74  = sqlite3Fts5Get
296f0 56 61 72 69 6e 74 28 61 2c 20 28 75 36 34 2a 29  Varint(a, (u64*)
29700 26 69 44 6f 63 69 64 29 3b 0a 20 20 20 20 73 71  &iDocid);.    sq
29710 6c 69 74 65 33 46 74 73 35 42 75 66 66 65 72 41  lite3Fts5BufferA
29720 70 70 65 6e 64 50 72 69 6e 74 66 28 70 52 63 2c  ppendPrintf(pRc,
29730 20 70 42 75 66 2c 20 22 20 69 64 3d 25 6c 6c 64   pBuf, " id=%lld
29740 22 2c 20 69 44 6f 63 69 64 29 3b 0a 20 20 7d 0a  ", iDocid);.  }.
29750 20 20 77 68 69 6c 65 28 20 69 4f 66 66 3c 6e 20    while( iOff<n 
29760 29 7b 0a 20 20 20 20 69 6e 74 20 6e 50 6f 73 3b  ){.    int nPos;
29770 0a 20 20 20 20 69 6e 74 20 62 44 75 6d 6d 79 3b  .    int bDummy;
29780 0a 20 20 20 20 69 4f 66 66 20 2b 3d 20 66 74 73  .    iOff += fts
29790 35 47 65 74 50 6f 73 6c 69 73 74 53 69 7a 65 28  5GetPoslistSize(
297a0 26 61 5b 69 4f 66 66 5d 2c 20 26 6e 50 6f 73 2c  &a[iOff], &nPos,
297b0 20 26 62 44 75 6d 6d 79 29 3b 0a 20 20 20 20 69   &bDummy);.    i
297c0 4f 66 66 20 2b 3d 20 66 74 73 35 44 65 63 6f 64  Off += fts5Decod
297d0 65 50 6f 73 6c 69 73 74 28 70 52 63 2c 20 70 42  ePoslist(pRc, pB
297e0 75 66 2c 20 26 61 5b 69 4f 66 66 5d 2c 20 4d 49  uf, &a[iOff], MI
297f0 4e 28 6e 2d 69 4f 66 66 2c 20 6e 50 6f 73 29 29  N(n-iOff, nPos))
29800 3b 0a 20 20 20 20 69 66 28 20 69 4f 66 66 3c 6e  ;.    if( iOff<n
29810 20 29 7b 0a 20 20 20 20 20 20 69 36 34 20 69 44   ){.      i64 iD
29820 65 6c 74 61 3b 0a 20 20 20 20 20 20 69 4f 66 66  elta;.      iOff
29830 20 2b 3d 20 73 71 6c 69 74 65 33 46 74 73 35 47   += sqlite3Fts5G
29840 65 74 56 61 72 69 6e 74 28 26 61 5b 69 4f 66 66  etVarint(&a[iOff
29850 5d 2c 20 28 75 36 34 2a 29 26 69 44 65 6c 74 61  ], (u64*)&iDelta
29860 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69 44 65  );.      if( iDe
29870 6c 74 61 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  lta==0 ) return 
29880 69 4f 66 66 3b 0a 20 20 20 20 20 20 69 44 6f 63  iOff;.      iDoc
29890 69 64 20 2b 3d 20 69 44 65 6c 74 61 3b 0a 20 20  id += iDelta;.  
298a0 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 42      sqlite3Fts5B
298b0 75 66 66 65 72 41 70 70 65 6e 64 50 72 69 6e 74  ufferAppendPrint
298c0 66 28 70 52 63 2c 20 70 42 75 66 2c 20 22 20 69  f(pRc, pBuf, " i
298d0 64 3d 25 6c 6c 64 22 2c 20 69 44 6f 63 69 64 29  d=%lld", iDocid)
298e0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72  ;.    }.  }..  r
298f0 65 74 75 72 6e 20 69 4f 66 66 3b 0a 7d 0a 0a 2f  eturn iOff;.}../
29900 2a 0a 2a 2a 20 54 68 65 20 69 6d 70 6c 65 6d 65  *.** The impleme
29910 6e 74 61 74 69 6f 6e 20 6f 66 20 75 73 65 72 2d  ntation of user-
29920 64 65 66 69 6e 65 64 20 73 63 61 6c 61 72 20 66  defined scalar f
29930 75 6e 63 74 69 6f 6e 20 66 74 73 35 5f 64 65 63  unction fts5_dec
29940 6f 64 65 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63  ode()..*/.static
29950 20 76 6f 69 64 20 66 74 73 35 44 65 63 6f 64 65   void fts5Decode
29960 46 75 6e 63 74 69 6f 6e 28 0a 20 20 73 71 6c 69  Function(.  sqli
29970 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74  te3_context *pCt
29980 78 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46  x,          /* F
29990 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 20 63 6f 6e  unction call con
299a0 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 41  text */.  int nA
299b0 72 67 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  rg,             
299c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
299d0 62 65 72 20 6f 66 20 61 72 67 73 20 28 61 6c 77  ber of args (alw
299e0 61 79 73 20 32 29 20 2a 2f 0a 20 20 73 71 6c 69  ays 2) */.  sqli
299f0 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 70 56 61  te3_value **apVa
29a00 6c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46  l           /* F
29a10 75 6e 63 74 69 6f 6e 20 61 72 67 75 6d 65 6e 74  unction argument
29a20 73 20 2a 2f 0a 29 7b 0a 20 20 69 36 34 20 69 52  s */.){.  i64 iR
29a30 6f 77 69 64 3b 20 20 20 20 20 20 20 20 20 20 20  owid;           
29a40 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 77            /* Row
29a50 69 64 20 66 6f 72 20 72 65 63 6f 72 64 20 62 65  id for record be
29a60 69 6e 67 20 64 65 63 6f 64 65 64 20 2a 2f 0a 20  ing decoded */. 
29a70 20 69 6e 74 20 69 53 65 67 69 64 2c 69 48 65 69   int iSegid,iHei
29a80 67 68 74 2c 69 50 67 6e 6f 2c 62 44 6c 69 64 78  ght,iPgno,bDlidx
29a90 3b 2f 2a 20 52 6f 77 69 64 20 63 6f 6d 70 6f 6e  ;/* Rowid compon
29aa0 65 6e 74 73 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  ents */.  const 
29ab0 75 38 20 2a 61 42 6c 6f 62 3b 20 69 6e 74 20 6e  u8 *aBlob; int n
29ac0 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 63  ;         /* Rec
29ad0 6f 72 64 20 74 6f 20 64 65 63 6f 64 65 20 2a 2f  ord to decode */
29ae0 0a 20 20 75 38 20 2a 61 20 3d 20 30 3b 0a 20 20  .  u8 *a = 0;.  
29af0 46 74 73 35 42 75 66 66 65 72 20 73 3b 20 20 20  Fts5Buffer s;   
29b00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29b10 2f 2a 20 42 75 69 6c 64 20 75 70 20 74 65 78 74  /* Build up text
29b20 20 74 6f 20 72 65 74 75 72 6e 20 68 65 72 65 20   to return here 
29b30 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  */.  int rc = SQ
29b40 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20  LITE_OK;        
29b50 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
29b60 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 70  ode */.  int nSp
29b70 61 63 65 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65  ace = 0;..  asse
29b80 72 74 28 20 6e 41 72 67 3d 3d 32 20 29 3b 0a 20  rt( nArg==2 );. 
29b90 20 6d 65 6d 73 65 74 28 26 73 2c 20 30 2c 20 73   memset(&s, 0, s
29ba0 69 7a 65 6f 66 28 46 74 73 35 42 75 66 66 65 72  izeof(Fts5Buffer
29bb0 29 29 3b 0a 20 20 69 52 6f 77 69 64 20 3d 20 73  ));.  iRowid = s
29bc0 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74  qlite3_value_int
29bd0 36 34 28 61 70 56 61 6c 5b 30 5d 29 3b 0a 0a 20  64(apVal[0]);.. 
29be0 20 2f 2a 20 4d 61 6b 65 20 61 20 63 6f 70 79 20   /* Make a copy 
29bf0 6f 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72  of the second ar
29c00 67 75 6d 65 6e 74 20 28 61 20 62 6c 6f 62 29 20  gument (a blob) 
29c10 69 6e 20 61 42 6c 6f 62 5b 5d 2e 20 54 68 65 20  in aBlob[]. The 
29c20 61 42 6c 6f 62 5b 5d 0a 20 20 2a 2a 20 63 6f 70  aBlob[].  ** cop
29c30 79 20 69 73 20 66 6f 6c 6c 6f 77 65 64 20 62 79  y is followed by
29c40 20 46 54 53 35 5f 44 41 54 41 5f 5a 45 52 4f 5f   FTS5_DATA_ZERO_
29c50 50 41 44 44 49 4e 47 20 30 78 30 30 20 62 79 74  PADDING 0x00 byt
29c60 65 73 2c 20 77 68 69 63 68 20 70 72 65 76 65 6e  es, which preven
29c70 74 73 0a 20 20 2a 2a 20 62 75 66 66 65 72 20 6f  ts.  ** buffer o
29c80 76 65 72 72 65 61 64 73 20 65 76 65 6e 20 69 66  verreads even if
29c90 20 74 68 65 20 72 65 63 6f 72 64 20 69 73 20 63   the record is c
29ca0 6f 72 72 75 70 74 2e 20 20 2a 2f 0a 20 20 6e 20  orrupt.  */.  n 
29cb0 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  = sqlite3_value_
29cc0 62 79 74 65 73 28 61 70 56 61 6c 5b 31 5d 29 3b  bytes(apVal[1]);
29cd0 0a 20 20 61 42 6c 6f 62 20 3d 20 73 71 6c 69 74  .  aBlob = sqlit
29ce0 65 33 5f 76 61 6c 75 65 5f 62 6c 6f 62 28 61 70  e3_value_blob(ap
29cf0 56 61 6c 5b 31 5d 29 3b 0a 20 20 6e 53 70 61 63  Val[1]);.  nSpac
29d00 65 20 3d 20 6e 20 2b 20 46 54 53 35 5f 44 41 54  e = n + FTS5_DAT
29d10 41 5f 5a 45 52 4f 5f 50 41 44 44 49 4e 47 3b 0a  A_ZERO_PADDING;.
29d20 20 20 61 20 3d 20 28 75 38 2a 29 73 71 6c 69 74    a = (u8*)sqlit
29d30 65 33 46 74 73 35 4d 61 6c 6c 6f 63 5a 65 72 6f  e3Fts5MallocZero
29d40 28 26 72 63 2c 20 6e 53 70 61 63 65 29 3b 0a 20  (&rc, nSpace);. 
29d50 20 69 66 28 20 61 3d 3d 30 20 29 20 67 6f 74 6f   if( a==0 ) goto
29d60 20 64 65 63 6f 64 65 5f 6f 75 74 3b 0a 20 20 6d   decode_out;.  m
29d70 65 6d 63 70 79 28 61 2c 20 61 42 6c 6f 62 2c 20  emcpy(a, aBlob, 
29d80 6e 29 3b 0a 0a 0a 20 20 66 74 73 35 44 65 63 6f  n);...  fts5Deco
29d90 64 65 52 6f 77 69 64 28 69 52 6f 77 69 64 2c 20  deRowid(iRowid, 
29da0 26 69 53 65 67 69 64 2c 20 26 62 44 6c 69 64 78  &iSegid, &bDlidx
29db0 2c 20 26 69 48 65 69 67 68 74 2c 20 26 69 50 67  , &iHeight, &iPg
29dc0 6e 6f 29 3b 0a 0a 20 20 66 74 73 35 44 65 62 75  no);..  fts5Debu
29dd0 67 52 6f 77 69 64 28 26 72 63 2c 20 26 73 2c 20  gRowid(&rc, &s, 
29de0 69 52 6f 77 69 64 29 3b 0a 20 20 69 66 28 20 62  iRowid);.  if( b
29df0 44 6c 69 64 78 20 29 7b 0a 20 20 20 20 46 74 73  Dlidx ){.    Fts
29e00 35 44 61 74 61 20 64 6c 69 64 78 3b 0a 20 20 20  5Data dlidx;.   
29e10 20 46 74 73 35 44 6c 69 64 78 4c 76 6c 20 6c 76   Fts5DlidxLvl lv
29e20 6c 3b 0a 0a 20 20 20 20 64 6c 69 64 78 2e 70 20  l;..    dlidx.p 
29e30 3d 20 61 3b 0a 20 20 20 20 64 6c 69 64 78 2e 6e  = a;.    dlidx.n
29e40 6e 20 3d 20 6e 3b 0a 0a 20 20 20 20 6d 65 6d 73  n = n;..    mems
29e50 65 74 28 26 6c 76 6c 2c 20 30 2c 20 73 69 7a 65  et(&lvl, 0, size
29e60 6f 66 28 46 74 73 35 44 6c 69 64 78 4c 76 6c 29  of(Fts5DlidxLvl)
29e70 29 3b 0a 20 20 20 20 6c 76 6c 2e 70 44 61 74 61  );.    lvl.pData
29e80 20 3d 20 26 64 6c 69 64 78 3b 0a 20 20 20 20 6c   = &dlidx;.    l
29e90 76 6c 2e 69 4c 65 61 66 50 67 6e 6f 20 3d 20 69  vl.iLeafPgno = i
29ea0 50 67 6e 6f 3b 0a 0a 20 20 20 20 66 6f 72 28 66  Pgno;..    for(f
29eb0 74 73 35 44 6c 69 64 78 4c 76 6c 4e 65 78 74 28  ts5DlidxLvlNext(
29ec0 26 6c 76 6c 29 3b 20 6c 76 6c 2e 62 45 6f 66 3d  &lvl); lvl.bEof=
29ed0 3d 30 3b 20 66 74 73 35 44 6c 69 64 78 4c 76 6c  =0; fts5DlidxLvl
29ee0 4e 65 78 74 28 26 6c 76 6c 29 29 7b 0a 20 20 20  Next(&lvl)){.   
29ef0 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 42 75     sqlite3Fts5Bu
29f00 66 66 65 72 41 70 70 65 6e 64 50 72 69 6e 74 66  fferAppendPrintf
29f10 28 26 72 63 2c 20 26 73 2c 20 0a 20 20 20 20 20  (&rc, &s, .     
29f20 20 20 20 20 20 22 20 25 64 28 25 6c 6c 64 29 22       " %d(%lld)"
29f30 2c 20 6c 76 6c 2e 69 4c 65 61 66 50 67 6e 6f 2c  , lvl.iLeafPgno,
29f40 20 6c 76 6c 2e 69 52 6f 77 69 64 0a 20 20 20 20   lvl.iRowid.    
29f50 20 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c    );.    }.  }el
29f60 73 65 20 69 66 28 20 69 53 65 67 69 64 3d 3d 30  se if( iSegid==0
29f70 20 29 7b 0a 20 20 20 20 69 66 28 20 69 52 6f 77   ){.    if( iRow
29f80 69 64 3d 3d 46 54 53 35 5f 41 56 45 52 41 47 45  id==FTS5_AVERAGE
29f90 53 5f 52 4f 57 49 44 20 29 7b 0a 20 20 20 20 20  S_ROWID ){.     
29fa0 20 2f 2a 20 74 6f 64 6f 20 2a 2f 0a 20 20 20 20   /* todo */.    
29fb0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 66 74 73  }else{.      fts
29fc0 35 44 65 63 6f 64 65 53 74 72 75 63 74 75 72 65  5DecodeStructure
29fd0 28 26 72 63 2c 20 26 73 2c 20 61 2c 20 6e 29 3b  (&rc, &s, a, n);
29fe0 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a  .    }.  }else{.
29ff0 20 20 20 20 46 74 73 35 42 75 66 66 65 72 20 74      Fts5Buffer t
2a000 65 72 6d 3b 0a 20 20 20 20 69 6e 74 20 69 54 65  erm;.    int iTe
2a010 72 6d 4f 66 66 20 3d 20 30 3b 0a 20 20 20 20 69  rmOff = 0;.    i
2a020 6e 74 20 73 7a 4c 65 61 66 20 3d 20 30 3b 0a 20  nt szLeaf = 0;. 
2a030 20 20 20 69 6e 74 20 69 52 6f 77 69 64 4f 66 66     int iRowidOff
2a040 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 69 4f   = 0;.    int iO
2a050 66 66 3b 0a 20 20 20 20 69 6e 74 20 6e 4b 65 65  ff;.    int nKee
2a060 70 20 3d 20 30 3b 0a 0a 20 20 20 20 6d 65 6d 73  p = 0;..    mems
2a070 65 74 28 26 74 65 72 6d 2c 20 30 2c 20 73 69 7a  et(&term, 0, siz
2a080 65 6f 66 28 46 74 73 35 42 75 66 66 65 72 29 29  eof(Fts5Buffer))
2a090 3b 0a 0a 20 20 20 20 69 66 28 20 6e 3e 3d 34 20  ;..    if( n>=4 
2a0a0 29 7b 0a 20 20 20 20 20 20 69 52 6f 77 69 64 4f  ){.      iRowidO
2a0b0 66 66 20 3d 20 66 74 73 35 47 65 74 55 31 36 28  ff = fts5GetU16(
2a0c0 26 61 5b 30 5d 29 3b 0a 20 20 20 20 20 20 73 7a  &a[0]);.      sz
2a0d0 4c 65 61 66 20 3d 20 66 74 73 35 47 65 74 55 31  Leaf = fts5GetU1
2a0e0 36 28 26 61 5b 32 5d 29 3b 0a 20 20 20 20 20 20  6(&a[2]);.      
2a0f0 69 66 28 20 73 7a 4c 65 61 66 3c 6e 20 29 7b 0a  if( szLeaf<n ){.
2a100 20 20 20 20 20 20 20 20 69 54 65 72 6d 4f 66 66          iTermOff
2a110 20 3d 20 66 74 73 35 47 65 74 55 31 36 28 26 61   = fts5GetU16(&a
2a120 5b 73 7a 4c 65 61 66 5d 29 3b 0a 20 20 20 20 20  [szLeaf]);.     
2a130 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
2a140 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 42      sqlite3Fts5B
2a150 75 66 66 65 72 53 65 74 28 26 72 63 2c 20 26 73  ufferSet(&rc, &s
2a160 2c 20 38 2c 20 28 63 6f 6e 73 74 20 75 38 2a 29  , 8, (const u8*)
2a170 22 63 6f 72 72 75 70 74 22 29 3b 0a 20 20 20 20  "corrupt");.    
2a180 20 20 67 6f 74 6f 20 64 65 63 6f 64 65 5f 6f 75    goto decode_ou
2a190 74 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66  t;.    }..    if
2a1a0 28 20 69 52 6f 77 69 64 4f 66 66 20 29 7b 0a 20  ( iRowidOff ){. 
2a1b0 20 20 20 20 20 69 4f 66 66 20 3d 20 69 52 6f 77       iOff = iRow
2a1c0 69 64 4f 66 66 3b 0a 20 20 20 20 7d 65 6c 73 65  idOff;.    }else
2a1d0 20 69 66 28 20 69 54 65 72 6d 4f 66 66 20 29 7b   if( iTermOff ){
2a1e0 0a 20 20 20 20 20 20 69 4f 66 66 20 3d 20 69 54  .      iOff = iT
2a1f0 65 72 6d 4f 66 66 3b 0a 20 20 20 20 7d 65 6c 73  ermOff;.    }els
2a200 65 7b 0a 20 20 20 20 20 20 69 4f 66 66 20 3d 20  e{.      iOff = 
2a210 73 7a 4c 65 61 66 3b 0a 20 20 20 20 7d 0a 20 20  szLeaf;.    }.  
2a220 20 20 66 74 73 35 44 65 63 6f 64 65 50 6f 73 6c    fts5DecodePosl
2a230 69 73 74 28 26 72 63 2c 20 26 73 2c 20 26 61 5b  ist(&rc, &s, &a[
2a240 34 5d 2c 20 69 4f 66 66 2d 34 29 3b 0a 0a 20 20  4], iOff-4);..  
2a250 20 20 61 73 73 65 72 74 28 20 69 52 6f 77 69 64    assert( iRowid
2a260 4f 66 66 3d 3d 30 20 7c 7c 20 69 4f 66 66 3d 3d  Off==0 || iOff==
2a270 69 52 6f 77 69 64 4f 66 66 20 29 3b 0a 20 20 20  iRowidOff );.   
2a280 20 69 66 28 20 69 52 6f 77 69 64 4f 66 66 20 29   if( iRowidOff )
2a290 7b 0a 20 20 20 20 20 20 69 4f 66 66 20 2b 3d 20  {.      iOff += 
2a2a0 66 74 73 35 44 65 63 6f 64 65 44 6f 63 6c 69 73  fts5DecodeDoclis
2a2b0 74 28 26 72 63 2c 20 26 73 2c 20 26 61 5b 69 4f  t(&rc, &s, &a[iO
2a2c0 66 66 5d 2c 20 73 7a 4c 65 61 66 2d 69 4f 66 66  ff], szLeaf-iOff
2a2d0 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 61 73  );.    }..    as
2a2e0 73 65 72 74 28 20 69 54 65 72 6d 4f 66 66 3d 3d  sert( iTermOff==
2a2f0 30 20 7c 7c 20 69 4f 66 66 3d 3d 69 54 65 72 6d  0 || iOff==iTerm
2a300 4f 66 66 20 29 3b 0a 20 20 20 20 77 68 69 6c 65  Off );.    while
2a310 28 20 69 4f 66 66 3c 73 7a 4c 65 61 66 20 29 7b  ( iOff<szLeaf ){
2a320 0a 20 20 20 20 20 20 69 6e 74 20 6e 42 79 74 65  .      int nByte
2a330 3b 0a 20 20 20 20 20 20 69 4f 66 66 20 2b 3d 20  ;.      iOff += 
2a340 66 74 73 35 47 65 74 56 61 72 69 6e 74 33 32 28  fts5GetVarint32(
2a350 26 61 5b 69 4f 66 66 5d 2c 20 6e 42 79 74 65 29  &a[iOff], nByte)
2a360 3b 0a 20 20 20 20 20 20 74 65 72 6d 2e 6e 3d 20  ;.      term.n= 
2a370 6e 4b 65 65 70 3b 0a 20 20 20 20 20 20 66 74 73  nKeep;.      fts
2a380 35 42 75 66 66 65 72 41 70 70 65 6e 64 42 6c 6f  5BufferAppendBlo
2a390 62 28 26 72 63 2c 20 26 74 65 72 6d 2c 20 6e 42  b(&rc, &term, nB
2a3a0 79 74 65 2c 20 26 61 5b 69 4f 66 66 5d 29 3b 0a  yte, &a[iOff]);.
2a3b0 20 20 20 20 20 20 69 4f 66 66 20 2b 3d 20 6e 42        iOff += nB
2a3c0 79 74 65 3b 0a 0a 20 20 20 20 20 20 73 71 6c 69  yte;..      sqli
2a3d0 74 65 33 46 74 73 35 42 75 66 66 65 72 41 70 70  te3Fts5BufferApp
2a3e0 65 6e 64 50 72 69 6e 74 66 28 0a 20 20 20 20 20  endPrintf(.     
2a3f0 20 20 20 20 20 26 72 63 2c 20 26 73 2c 20 22 20       &rc, &s, " 
2a400 74 65 72 6d 3d 25 2e 2a 73 22 2c 20 74 65 72 6d  term=%.*s", term
2a410 2e 6e 2c 20 28 63 6f 6e 73 74 20 63 68 61 72 2a  .n, (const char*
2a420 29 74 65 72 6d 2e 70 0a 20 20 20 20 20 20 29 3b  )term.p.      );
2a430 0a 20 20 20 20 20 20 69 4f 66 66 20 2b 3d 20 66  .      iOff += f
2a440 74 73 35 44 65 63 6f 64 65 44 6f 63 6c 69 73 74  ts5DecodeDoclist
2a450 28 26 72 63 2c 20 26 73 2c 20 26 61 5b 69 4f 66  (&rc, &s, &a[iOf
2a460 66 5d 2c 20 73 7a 4c 65 61 66 2d 69 4f 66 66 29  f], szLeaf-iOff)
2a470 3b 0a 20 20 20 20 20 20 69 66 28 20 69 4f 66 66  ;.      if( iOff
2a480 3c 73 7a 4c 65 61 66 20 29 7b 0a 20 20 20 20 20  <szLeaf ){.     
2a490 20 20 20 69 4f 66 66 20 2b 3d 20 66 74 73 35 47     iOff += fts5G
2a4a0 65 74 56 61 72 69 6e 74 33 32 28 26 61 5b 69 4f  etVarint32(&a[iO
2a4b0 66 66 5d 2c 20 6e 4b 65 65 70 29 3b 0a 20 20 20  ff], nKeep);.   
2a4c0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 66     }.    }.    f
2a4d0 74 73 35 42 75 66 66 65 72 46 72 65 65 28 26 74  ts5BufferFree(&t
2a4e0 65 72 6d 29 3b 0a 20 20 7d 0a 20 20 0a 20 64 65  erm);.  }.  . de
2a4f0 63 6f 64 65 5f 6f 75 74 3a 0a 20 20 73 71 6c 69  code_out:.  sqli
2a500 74 65 33 5f 66 72 65 65 28 61 29 3b 0a 20 20 69  te3_free(a);.  i
2a510 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
2a520 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
2a530 72 65 73 75 6c 74 5f 74 65 78 74 28 70 43 74 78  result_text(pCtx
2a540 2c 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73  , (const char*)s
2a550 2e 70 2c 20 73 2e 6e 2c 20 53 51 4c 49 54 45 5f  .p, s.n, SQLITE_
2a560 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 7d 65  TRANSIENT);.  }e
2a570 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  lse{.    sqlite3
2a580 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 5f 63 6f  _result_error_co
2a590 64 65 28 70 43 74 78 2c 20 72 63 29 3b 0a 20 20  de(pCtx, rc);.  
2a5a0 7d 0a 20 20 66 74 73 35 42 75 66 66 65 72 46 72  }.  fts5BufferFr
2a5b0 65 65 28 26 73 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ee(&s);.}../*.**
2a5c0 20 54 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74   The implementat
2a5d0 69 6f 6e 20 6f 66 20 75 73 65 72 2d 64 65 66 69  ion of user-defi
2a5e0 6e 65 64 20 73 63 61 6c 61 72 20 66 75 6e 63 74  ned scalar funct
2a5f0 69 6f 6e 20 66 74 73 35 5f 72 6f 77 69 64 28 29  ion fts5_rowid()
2a600 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
2a610 20 66 74 73 35 52 6f 77 69 64 46 75 6e 63 74 69   fts5RowidFuncti
2a620 6f 6e 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f  on(.  sqlite3_co
2a630 6e 74 65 78 74 20 2a 70 43 74 78 2c 20 20 20 20  ntext *pCtx,    
2a640 20 20 20 20 20 20 2f 2a 20 46 75 6e 63 74 69 6f        /* Functio
2a650 6e 20 63 61 6c 6c 20 63 6f 6e 74 65 78 74 20 2a  n call context *
2a660 2f 0a 20 20 69 6e 74 20 6e 41 72 67 2c 20 20 20  /.  int nArg,   
2a670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a680 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
2a690 20 61 72 67 73 20 28 61 6c 77 61 79 73 20 32 29   args (always 2)
2a6a0 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76 61   */.  sqlite3_va
2a6b0 6c 75 65 20 2a 2a 61 70 56 61 6c 20 20 20 20 20  lue **apVal     
2a6c0 20 20 20 20 20 20 2f 2a 20 46 75 6e 63 74 69 6f        /* Functio
2a6d0 6e 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29  n arguments */.)
2a6e0 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  {.  const char *
2a6f0 7a 41 72 67 3b 0a 20 20 69 66 28 20 6e 41 72 67  zArg;.  if( nArg
2a700 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ==0 ){.    sqlit
2a710 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 28  e3_result_error(
2a720 70 43 74 78 2c 20 22 73 68 6f 75 6c 64 20 62 65  pCtx, "should be
2a730 3a 20 66 74 73 35 5f 72 6f 77 69 64 28 73 75 62  : fts5_rowid(sub
2a740 6a 65 63 74 2c 20 2e 2e 2e 2e 29 22 2c 20 2d 31  ject, ....)", -1
2a750 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
2a760 7a 41 72 67 20 3d 20 28 63 6f 6e 73 74 20 63 68  zArg = (const ch
2a770 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75  ar*)sqlite3_valu
2a780 65 5f 74 65 78 74 28 61 70 56 61 6c 5b 30 5d 29  e_text(apVal[0])
2a790 3b 0a 20 20 20 20 69 66 28 20 30 3d 3d 73 71 6c  ;.    if( 0==sql
2a7a0 69 74 65 33 5f 73 74 72 69 63 6d 70 28 7a 41 72  ite3_stricmp(zAr
2a7b0 67 2c 20 22 73 65 67 6d 65 6e 74 22 29 20 29 7b  g, "segment") ){
2a7c0 0a 20 20 20 20 20 20 69 36 34 20 69 52 6f 77 69  .      i64 iRowi
2a7d0 64 3b 0a 20 20 20 20 20 20 69 6e 74 20 73 65 67  d;.      int seg
2a7e0 69 64 2c 20 68 65 69 67 68 74 2c 20 70 67 6e 6f  id, height, pgno
2a7f0 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 41 72 67  ;.      if( nArg
2a800 21 3d 34 20 29 7b 0a 20 20 20 20 20 20 20 20 73  !=4 ){.        s
2a810 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72  qlite3_result_er
2a820 72 6f 72 28 70 43 74 78 2c 20 0a 20 20 20 20 20  ror(pCtx, .     
2a830 20 20 20 20 20 20 20 22 73 68 6f 75 6c 64 20 62         "should b
2a840 65 3a 20 66 74 73 35 5f 72 6f 77 69 64 28 27 73  e: fts5_rowid('s
2a850 65 67 6d 65 6e 74 27 2c 20 73 65 67 69 64 2c 20  egment', segid, 
2a860 68 65 69 67 68 74 2c 20 70 67 6e 6f 29 29 22 2c  height, pgno))",
2a870 20 2d 31 0a 20 20 20 20 20 20 20 20 29 3b 0a 20   -1.        );. 
2a880 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
2a890 20 20 20 20 73 65 67 69 64 20 3d 20 73 71 6c 69      segid = sqli
2a8a0 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 28 61 70  te3_value_int(ap
2a8b0 56 61 6c 5b 31 5d 29 3b 0a 20 20 20 20 20 20 20  Val[1]);.       
2a8c0 20 68 65 69 67 68 74 20 3d 20 73 71 6c 69 74 65   height = sqlite
2a8d0 33 5f 76 61 6c 75 65 5f 69 6e 74 28 61 70 56 61  3_value_int(apVa
2a8e0 6c 5b 32 5d 29 3b 0a 20 20 20 20 20 20 20 20 70  l[2]);.        p
2a8f0 67 6e 6f 20 3d 20 73 71 6c 69 74 65 33 5f 76 61  gno = sqlite3_va
2a900 6c 75 65 5f 69 6e 74 28 61 70 56 61 6c 5b 33 5d  lue_int(apVal[3]
2a910 29 3b 0a 20 20 20 20 20 20 20 20 69 52 6f 77 69  );.        iRowi
2a920 64 20 3d 20 46 54 53 35 5f 53 45 47 4d 45 4e 54  d = FTS5_SEGMENT
2a930 5f 52 4f 57 49 44 28 73 65 67 69 64 2c 20 68 65  _ROWID(segid, he
2a940 69 67 68 74 2c 20 70 67 6e 6f 29 3b 0a 20 20 20  ight, pgno);.   
2a950 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73       sqlite3_res
2a960 75 6c 74 5f 69 6e 74 36 34 28 70 43 74 78 2c 20  ult_int64(pCtx, 
2a970 69 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 7d  iRowid);.      }
2a980 0a 20 20 20 20 7d 65 6c 73 65 20 7b 0a 20 20 20  .    }else {.   
2a990 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
2a9a0 74 5f 65 72 72 6f 72 28 70 43 74 78 2c 20 0a 20  t_error(pCtx, . 
2a9b0 20 20 20 20 20 20 20 22 66 69 72 73 74 20 61 72         "first ar
2a9c0 67 20 74 6f 20 66 74 73 35 5f 72 6f 77 69 64 28  g to fts5_rowid(
2a9d0 29 20 6d 75 73 74 20 62 65 20 27 73 65 67 6d 65  ) must be 'segme
2a9e0 6e 74 27 20 22 0a 20 20 20 20 20 20 20 20 22 6f  nt' ".        "o
2a9f0 72 20 27 73 74 61 72 74 2d 6f 66 2d 69 6e 64 65  r 'start-of-inde
2aa00 78 27 22 0a 20 20 20 20 20 20 20 20 2c 20 2d 31  x'".        , -1
2aa10 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a  .      );.    }.
2aa20 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69    }.}../*.** Thi
2aa30 73 20 69 73 20 63 61 6c 6c 65 64 20 61 73 20 70  s is called as p
2aa40 61 72 74 20 6f 66 20 72 65 67 69 73 74 65 72 69  art of registeri
2aa50 6e 67 20 74 68 65 20 46 54 53 35 20 6d 6f 64 75  ng the FTS5 modu
2aa60 6c 65 20 77 69 74 68 20 64 61 74 61 62 61 73 65  le with database
2aa70 0a 2a 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 64  .** connection d
2aa80 62 2e 20 49 74 20 72 65 67 69 73 74 65 72 73 20  b. It registers 
2aa90 73 65 76 65 72 61 6c 20 75 73 65 72 2d 64 65 66  several user-def
2aaa0 69 6e 65 64 20 73 63 61 6c 61 72 20 66 75 6e 63  ined scalar func
2aab0 74 69 6f 6e 73 20 75 73 65 66 75 6c 0a 2a 2a 20  tions useful.** 
2aac0 77 69 74 68 20 46 54 53 35 2e 0a 2a 2a 0a 2a 2a  with FTS5..**.**
2aad0 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20   If successful, 
2aae0 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
2aaf0 75 72 6e 65 64 2e 20 49 66 20 61 6e 20 65 72 72  urned. If an err
2ab00 6f 72 20 6f 63 63 75 72 73 2c 20 73 6f 6d 65 20  or occurs, some 
2ab10 6f 74 68 65 72 0a 2a 2a 20 53 51 4c 69 74 65 20  other.** SQLite 
2ab20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65  error code is re
2ab30 74 75 72 6e 65 64 20 69 6e 73 74 65 61 64 2e 0a  turned instead..
2ab40 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74  */.int sqlite3Ft
2ab50 73 35 49 6e 64 65 78 49 6e 69 74 28 73 71 6c 69  s5IndexInit(sqli
2ab60 74 65 33 20 2a 64 62 29 7b 0a 20 20 69 6e 74 20  te3 *db){.  int 
2ab70 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 63 72 65  rc = sqlite3_cre
2ab80 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 0a 20 20  ate_function(.  
2ab90 20 20 20 20 64 62 2c 20 22 66 74 73 35 5f 64 65      db, "fts5_de
2aba0 63 6f 64 65 22 2c 20 32 2c 20 53 51 4c 49 54 45  code", 2, SQLITE
2abb0 5f 55 54 46 38 2c 20 30 2c 20 66 74 73 35 44 65  _UTF8, 0, fts5De
2abc0 63 6f 64 65 46 75 6e 63 74 69 6f 6e 2c 20 30 2c  codeFunction, 0,
2abd0 20 30 0a 20 20 29 3b 0a 20 20 69 66 28 20 72 63   0.  );.  if( rc
2abe0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
2abf0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f     rc = sqlite3_
2ac00 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28  create_function(
2ac10 0a 20 20 20 20 20 20 20 20 64 62 2c 20 22 66 74  .        db, "ft
2ac20 73 35 5f 72 6f 77 69 64 22 2c 20 2d 31 2c 20 53  s5_rowid", -1, S
2ac30 51 4c 49 54 45 5f 55 54 46 38 2c 20 30 2c 20 66  QLITE_UTF8, 0, f
2ac40 74 73 35 52 6f 77 69 64 46 75 6e 63 74 69 6f 6e  ts5RowidFunction
2ac50 2c 20 30 2c 20 30 0a 20 20 20 20 29 3b 0a 20 20  , 0, 0.    );.  
2ac60 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
2ac70 0a 0a                                            ..