/ Hex Artifact Content
Login

Artifact 38d7ddd4d5650007ee83000f0f96967ff83c710c:


0000: 2f 2a 0a 2a 2a 20 32 30 31 34 20 4d 61 79 20 33  /*.** 2014 May 3
0010: 31 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74 68  1.**.** The auth
0020: 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f 70  or disclaims cop
0030: 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20 73  yright to this s
0040: 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e 20  ource code.  In 
0050: 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c 65  place of.** a le
0060: 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72 65  gal notice, here
0070: 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a 0a   is a blessing:.
0080: 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f 75  **.**    May you
0090: 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f 74   do good and not
00a0: 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61 79   evil..**    May
00b0: 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69 76   you find forgiv
00c0: 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73 65  eness for yourse
00d0: 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20 6f  lf and forgive o
00e0: 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61 79  thers..**    May
00f0: 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65 6c   you share freel
0100: 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67 20  y, never taking 
0110: 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67 69  more than you gi
0120: 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ve..**.*********
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 4c 6f 77 20  *****.**.** Low 
0180: 6c 65 76 65 6c 20 61 63 63 65 73 73 20 74 6f 20  level access to 
0190: 74 68 65 20 46 54 53 20 69 6e 64 65 78 20 73 74  the FTS index st
01a0: 6f 72 65 64 20 69 6e 20 74 68 65 20 64 61 74 61  ored in the data
01b0: 62 61 73 65 20 66 69 6c 65 2e 20 54 68 65 20 0a  base file. The .
01c0: 2a 2a 20 72 6f 75 74 69 6e 65 73 20 69 6e 20 74  ** routines in t
01d0: 68 69 73 20 66 69 6c 65 20 66 69 6c 65 20 69 6d  his file file im
01e0: 70 6c 65 6d 65 6e 74 20 61 6c 6c 20 72 65 61 64  plement all read
01f0: 20 61 6e 64 20 77 72 69 74 65 20 61 63 63 65 73   and write acces
0200: 73 20 74 6f 20 74 68 65 0a 2a 2a 20 25 5f 64 61  s to the.** %_da
0210: 74 61 20 74 61 62 6c 65 2e 20 4f 74 68 65 72 20  ta table. Other 
0220: 70 61 72 74 73 20 6f 66 20 74 68 65 20 73 79 73  parts of the sys
0230: 74 65 6d 20 61 63 63 65 73 73 20 74 68 69 73 20  tem access this 
0240: 66 75 6e 63 74 69 6f 6e 61 6c 69 74 79 20 76 69  functionality vi
0250: 61 0a 2a 2a 20 74 68 65 20 69 6e 74 65 72 66 61  a.** the interfa
0260: 63 65 20 64 65 66 69 6e 65 64 20 69 6e 20 66 74  ce defined in ft
0270: 73 35 49 6e 74 2e 68 2e 0a 2a 2f 0a 0a 0a 23 69  s5Int.h..*/...#i
0280: 6e 63 6c 75 64 65 20 22 66 74 73 35 49 6e 74 2e  nclude "fts5Int.
0290: 68 22 0a 0a 2f 2a 0a 2a 2a 20 4f 76 65 72 76 69  h"../*.** Overvi
02a0: 65 77 3a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 25 5f  ew:.**.** The %_
02b0: 64 61 74 61 20 74 61 62 6c 65 20 63 6f 6e 74 61  data table conta
02c0: 69 6e 73 20 61 6c 6c 20 74 68 65 20 46 54 53 20  ins all the FTS 
02d0: 69 6e 64 65 78 65 73 20 66 6f 72 20 61 6e 20 46  indexes for an F
02e0: 54 53 35 20 76 69 72 74 75 61 6c 20 74 61 62 6c  TS5 virtual tabl
02f0: 65 2e 0a 2a 2a 20 41 73 20 77 65 6c 6c 20 61 73  e..** As well as
0300: 20 74 68 65 20 6d 61 69 6e 20 74 65 72 6d 20 69   the main term i
0310: 6e 64 65 78 2c 20 74 68 65 72 65 20 6d 61 79 20  ndex, there may 
0320: 62 65 20 75 70 20 74 6f 20 33 31 20 70 72 65 66  be up to 31 pref
0330: 69 78 20 69 6e 64 65 78 65 73 2e 0a 2a 2a 20 54  ix indexes..** T
0340: 68 65 20 66 6f 72 6d 61 74 20 69 73 20 73 69 6d  he format is sim
0350: 69 6c 61 72 20 74 6f 20 46 54 53 33 2f 34 2c 20  ilar to FTS3/4, 
0360: 65 78 63 65 70 74 20 74 68 61 74 3a 0a 2a 2a 0a  except that:.**.
0370: 2a 2a 20 20 20 2a 20 61 6c 6c 20 73 65 67 6d 65  **   * all segme
0380: 6e 74 20 62 2d 74 72 65 65 20 6c 65 61 66 20 64  nt b-tree leaf d
0390: 61 74 61 20 69 73 20 73 74 6f 72 65 64 20 69 6e  ata is stored in
03a0: 20 66 69 78 65 64 20 73 69 7a 65 20 70 61 67 65   fixed size page
03b0: 20 72 65 63 6f 72 64 73 20 0a 2a 2a 20 20 20 20   records .**    
03c0: 20 28 65 2e 67 2e 20 31 30 30 30 20 62 79 74 65   (e.g. 1000 byte
03d0: 73 29 2e 20 41 20 73 69 6e 67 6c 65 20 64 6f 63  s). A single doc
03e0: 6c 69 73 74 20 6d 61 79 20 73 70 61 6e 20 6d 75  list may span mu
03f0: 6c 74 69 70 6c 65 20 70 61 67 65 73 2e 20 43 61  ltiple pages. Ca
0400: 72 65 20 69 73 20 0a 2a 2a 20 20 20 20 20 74 61  re is .**     ta
0410: 6b 65 6e 20 74 6f 20 65 6e 73 75 72 65 20 69 74  ken to ensure it
0420: 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74 6f 20   is possible to 
0430: 69 74 65 72 61 74 65 20 69 6e 20 65 69 74 68 65  iterate in eithe
0440: 72 20 64 69 72 65 63 74 69 6f 6e 20 74 68 72 6f  r direction thro
0450: 75 67 68 20 0a 2a 2a 20 20 20 20 20 74 68 65 20  ugh .**     the 
0460: 65 6e 74 72 69 65 73 20 69 6e 20 61 20 64 6f 63  entries in a doc
0470: 6c 69 73 74 2c 20 6f 72 20 74 6f 20 73 65 65 6b  list, or to seek
0480: 20 74 6f 20 61 20 73 70 65 63 69 66 69 63 20 65   to a specific e
0490: 6e 74 72 79 20 77 69 74 68 69 6e 20 61 20 0a 2a  ntry within a .*
04a0: 2a 20 20 20 20 20 64 6f 63 6c 69 73 74 2c 20 77  *     doclist, w
04b0: 69 74 68 6f 75 74 20 6c 6f 61 64 69 6e 67 20 69  ithout loading i
04c0: 74 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 2e 0a 2a  t into memory..*
04d0: 2a 0a 2a 2a 20 20 20 2a 20 6c 61 72 67 65 20 64  *.**   * large d
04e0: 6f 63 6c 69 73 74 73 20 74 68 61 74 20 73 70 61  oclists that spa
04f0: 6e 20 6d 61 6e 79 20 70 61 67 65 73 20 68 61 76  n many pages hav
0500: 65 20 61 73 73 6f 63 69 61 74 65 64 20 22 64 6f  e associated "do
0510: 63 6c 69 73 74 20 69 6e 64 65 78 22 0a 2a 2a 20  clist index".** 
0520: 20 20 20 20 72 65 63 6f 72 64 73 20 74 68 61 74      records that
0530: 20 63 6f 6e 74 61 69 6e 20 61 20 63 6f 70 79 20   contain a copy 
0540: 6f 66 20 74 68 65 20 66 69 72 73 74 20 72 6f 77  of the first row
0550: 69 64 20 6f 6e 20 65 61 63 68 20 70 61 67 65 20  id on each page 
0560: 73 70 61 6e 6e 65 64 20 62 79 0a 2a 2a 20 20 20  spanned by.**   
0570: 20 20 74 68 65 20 64 6f 63 6c 69 73 74 2e 20 54    the doclist. T
0580: 68 69 73 20 69 73 20 75 73 65 64 20 74 6f 20 73  his is used to s
0590: 70 65 65 64 20 75 70 20 73 65 65 6b 20 6f 70 65  peed up seek ope
05a0: 72 61 74 69 6f 6e 73 2c 20 61 6e 64 20 6d 65 72  rations, and mer
05b0: 67 65 73 20 6f 66 0a 2a 2a 20 20 20 20 20 6c 61  ges of.**     la
05c0: 72 67 65 20 64 6f 63 6c 69 73 74 73 20 77 69 74  rge doclists wit
05d0: 68 20 76 65 72 79 20 73 6d 61 6c 6c 20 64 6f 63  h very small doc
05e0: 6c 69 73 74 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a  lists..**.**   *
05f0: 20 65 78 74 72 61 20 66 69 65 6c 64 73 20 69 6e   extra fields in
0600: 20 74 68 65 20 22 73 74 72 75 63 74 75 72 65 20   the "structure 
0610: 72 65 63 6f 72 64 22 20 72 65 63 6f 72 64 20 74  record" record t
0620: 68 65 20 73 74 61 74 65 20 6f 66 20 6f 6e 67 6f  he state of ongo
0630: 69 6e 67 0a 2a 2a 20 20 20 20 20 69 6e 63 72 65  ing.**     incre
0640: 6d 65 6e 74 61 6c 20 6d 65 72 67 65 20 6f 70 65  mental merge ope
0650: 72 61 74 69 6f 6e 73 2e 0a 2a 2a 0a 2a 2f 0a 0a  rations..**.*/..
0660: 0a 23 64 65 66 69 6e 65 20 46 54 53 35 5f 4f 50  .#define FTS5_OP
0670: 54 5f 57 4f 52 4b 5f 55 4e 49 54 20 20 31 30 30  T_WORK_UNIT  100
0680: 30 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20  0  /* Number of 
0690: 6c 65 61 66 20 70 61 67 65 73 20 70 65 72 20 6f  leaf pages per o
06a0: 70 74 69 6d 69 7a 65 20 73 74 65 70 20 2a 2f 0a  ptimize step */.
06b0: 23 64 65 66 69 6e 65 20 46 54 53 35 5f 57 4f 52  #define FTS5_WOR
06c0: 4b 5f 55 4e 49 54 20 20 20 20 20 20 36 34 20 20  K_UNIT      64  
06d0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6c    /* Number of l
06e0: 65 61 66 20 70 61 67 65 73 20 69 6e 20 75 6e 69  eaf pages in uni
06f0: 74 20 6f 66 20 77 6f 72 6b 20 2a 2f 0a 0a 23 64  t of work */..#d
0700: 65 66 69 6e 65 20 46 54 53 35 5f 4d 49 4e 5f 44  efine FTS5_MIN_D
0710: 4c 49 44 58 5f 53 49 5a 45 20 34 20 20 20 20 20  LIDX_SIZE 4     
0720: 2f 2a 20 41 64 64 20 64 6c 69 64 78 20 69 66 20  /* Add dlidx if 
0730: 74 68 69 73 20 6d 61 6e 79 20 65 6d 70 74 79 20  this many empty 
0740: 70 61 67 65 73 20 2a 2f 0a 0a 23 64 65 66 69 6e  pages */..#defin
0750: 65 20 46 54 53 35 5f 4d 41 49 4e 5f 50 52 45 46  e FTS5_MAIN_PREF
0760: 49 58 20 27 30 27 0a 0a 23 69 66 20 46 54 53 35  IX '0'..#if FTS5
0770: 5f 4d 41 58 5f 50 52 45 46 49 58 5f 49 4e 44 45  _MAX_PREFIX_INDE
0780: 58 45 53 20 3e 20 33 31 0a 23 20 65 72 72 6f 72  XES > 31.# error
0790: 20 22 46 54 53 35 5f 4d 41 58 5f 50 52 45 46 49   "FTS5_MAX_PREFI
07a0: 58 5f 49 4e 44 45 58 45 53 20 69 73 20 74 6f 6f  X_INDEXES is too
07b0: 20 6c 61 72 67 65 22 0a 23 65 6e 64 69 66 0a 0a   large".#endif..
07c0: 2f 2a 0a 2a 2a 20 44 65 74 61 69 6c 73 3a 0a 2a  /*.** Details:.*
07d0: 2a 0a 2a 2a 20 54 68 65 20 25 5f 64 61 74 61 20  *.** The %_data 
07e0: 74 61 62 6c 65 20 6d 61 6e 61 67 65 64 20 62 79  table managed by
07f0: 20 74 68 69 73 20 6d 6f 64 75 6c 65 2c 0a 2a 2a   this module,.**
0800: 0a 2a 2a 20 20 20 20 20 43 52 45 41 54 45 20 54  .**     CREATE T
0810: 41 42 4c 45 20 25 5f 64 61 74 61 28 69 64 20 49  ABLE %_data(id I
0820: 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b  NTEGER PRIMARY K
0830: 45 59 2c 20 62 6c 6f 63 6b 20 42 4c 4f 42 29 3b  EY, block BLOB);
0840: 0a 2a 2a 0a 2a 2a 20 2c 20 63 6f 6e 74 61 69 6e  .**.** , contain
0850: 73 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  s the following 
0860: 35 20 74 79 70 65 73 20 6f 66 20 72 65 63 6f 72  5 types of recor
0870: 64 73 2e 20 53 65 65 20 74 68 65 20 63 6f 6d 6d  ds. See the comm
0880: 65 6e 74 73 20 73 75 72 72 6f 75 6e 64 69 6e 67  ents surrounding
0890: 0a 2a 2a 20 74 68 65 20 46 54 53 35 5f 2a 5f 52  .** the FTS5_*_R
08a0: 4f 57 49 44 20 6d 61 63 72 6f 73 20 62 65 6c 6f  OWID macros belo
08b0: 77 20 66 6f 72 20 61 20 64 65 73 63 72 69 70 74  w for a descript
08c0: 69 6f 6e 20 6f 66 20 68 6f 77 20 25 5f 64 61 74  ion of how %_dat
08d0: 61 20 72 6f 77 69 64 73 20 61 72 65 20 0a 2a 2a  a rowids are .**
08e0: 20 61 73 73 69 67 6e 65 64 20 74 6f 20 65 61 63   assigned to eac
08f0: 68 20 66 6f 20 74 68 65 6d 2e 0a 2a 2a 0a 2a 2a  h fo them..**.**
0900: 20 31 2e 20 53 74 72 75 63 74 75 72 65 20 52 65   1. Structure Re
0910: 63 6f 72 64 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 54  cords:.**.**   T
0920: 68 65 20 73 65 74 20 6f 66 20 73 65 67 6d 65 6e  he set of segmen
0930: 74 73 20 74 68 61 74 20 6d 61 6b 65 20 75 70 20  ts that make up 
0940: 61 6e 20 69 6e 64 65 78 20 2d 20 74 68 65 20 69  an index - the i
0950: 6e 64 65 78 20 73 74 72 75 63 74 75 72 65 20 2d  ndex structure -
0960: 20 61 72 65 0a 2a 2a 20 20 20 72 65 63 6f 72 64   are.**   record
0970: 65 64 20 69 6e 20 61 20 73 69 6e 67 6c 65 20 72  ed in a single r
0980: 65 63 6f 72 64 20 77 69 74 68 69 6e 20 74 68 65  ecord within the
0990: 20 25 5f 64 61 74 61 20 74 61 62 6c 65 2e 20 54   %_data table. T
09a0: 68 65 20 72 65 63 6f 72 64 20 63 6f 6e 73 69 73  he record consis
09b0: 74 73 0a 2a 2a 20 20 20 6f 66 20 61 20 73 69 6e  ts.**   of a sin
09c0: 67 6c 65 20 33 32 2d 62 69 74 20 63 6f 6e 66 69  gle 32-bit confi
09d0: 67 75 72 61 74 69 6f 6e 20 63 6f 6f 6b 69 65 20  guration cookie 
09e0: 76 61 6c 75 65 20 66 6f 6c 6c 6f 77 65 64 20 62  value followed b
09f0: 79 20 61 20 6c 69 73 74 20 6f 66 20 0a 2a 2a 20  y a list of .** 
0a00: 20 20 53 51 4c 69 74 65 20 76 61 72 69 6e 74 73    SQLite varints
0a10: 2e 20 49 66 20 74 68 65 20 46 54 53 20 74 61 62  . If the FTS tab
0a20: 6c 65 20 66 65 61 74 75 72 65 73 20 6d 6f 72 65  le features more
0a30: 20 74 68 61 6e 20 6f 6e 65 20 69 6e 64 65 78 20   than one index 
0a40: 28 62 65 63 61 75 73 65 0a 2a 2a 20 20 20 74 68  (because.**   th
0a50: 65 72 65 20 61 72 65 20 6f 6e 65 20 6f 72 20 6d  ere are one or m
0a60: 6f 72 65 20 70 72 65 66 69 78 20 69 6e 64 65 78  ore prefix index
0a70: 65 73 29 2c 20 69 74 20 69 73 20 67 75 61 72 61  es), it is guara
0a80: 6e 74 65 65 64 20 74 68 61 74 20 61 6c 6c 20 73  nteed that all s
0a90: 68 61 72 65 0a 2a 2a 20 20 20 74 68 65 20 73 61  hare.**   the sa
0aa0: 6d 65 20 63 6f 6f 6b 69 65 20 76 61 6c 75 65 2e  me cookie value.
0ab0: 0a 2a 2a 0a 2a 2a 20 20 20 49 6d 6d 65 64 69 61  .**.**   Immedia
0ac0: 74 65 6c 79 20 66 6f 6c 6c 6f 77 69 6e 67 20 74  tely following t
0ad0: 68 65 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e  he configuration
0ae0: 20 63 6f 6f 6b 69 65 2c 20 74 68 65 20 72 65 63   cookie, the rec
0af0: 6f 72 64 20 62 65 67 69 6e 73 20 77 69 74 68 0a  ord begins with.
0b00: 2a 2a 20 20 20 74 68 72 65 65 20 76 61 72 69 6e  **   three varin
0b10: 74 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2b 20  ts:.**.**     + 
0b20: 6e 75 6d 62 65 72 20 6f 66 20 6c 65 76 65 6c 73  number of levels
0b30: 2c 0a 2a 2a 20 20 20 20 20 2b 20 74 6f 74 61 6c  ,.**     + total
0b40: 20 6e 75 6d 62 65 72 20 6f 66 20 73 65 67 6d 65   number of segme
0b50: 6e 74 73 20 6f 6e 20 61 6c 6c 20 6c 65 76 65 6c  nts on all level
0b60: 73 2c 0a 2a 2a 20 20 20 20 20 2b 20 76 61 6c 75  s,.**     + valu
0b70: 65 20 6f 66 20 77 72 69 74 65 20 63 6f 75 6e 74  e of write count
0b80: 65 72 2e 0a 2a 2a 0a 2a 2a 20 20 20 54 68 65 6e  er..**.**   Then
0b90: 2c 20 66 6f 72 20 65 61 63 68 20 6c 65 76 65 6c  , for each level
0ba0: 20 66 72 6f 6d 20 30 20 74 6f 20 6e 4d 61 78 3a   from 0 to nMax:
0bb0: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2b 20 6e 75 6d  .**.**     + num
0bc0: 62 65 72 20 6f 66 20 69 6e 70 75 74 20 73 65 67  ber of input seg
0bd0: 6d 65 6e 74 73 20 69 6e 20 6f 6e 67 6f 69 6e 67  ments in ongoing
0be0: 20 6d 65 72 67 65 2e 0a 2a 2a 20 20 20 20 20 2b   merge..**     +
0bf0: 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66   total number of
0c00: 20 73 65 67 6d 65 6e 74 73 20 69 6e 20 6c 65 76   segments in lev
0c10: 65 6c 2e 0a 2a 2a 20 20 20 20 20 2b 20 66 6f 72  el..**     + for
0c20: 20 65 61 63 68 20 73 65 67 6d 65 6e 74 20 66 72   each segment fr
0c30: 6f 6d 20 6f 6c 64 65 73 74 20 74 6f 20 6e 65 77  om oldest to new
0c40: 65 73 74 3a 0a 2a 2a 20 20 20 20 20 20 20 20 20  est:.**         
0c50: 2b 20 73 65 67 6d 65 6e 74 20 69 64 20 28 61 6c  + segment id (al
0c60: 77 61 79 73 20 3e 20 30 29 0a 2a 2a 20 20 20 20  ways > 0).**    
0c70: 20 20 20 20 20 2b 20 66 69 72 73 74 20 6c 65 61       + first lea
0c80: 66 20 70 61 67 65 20 6e 75 6d 62 65 72 20 28 6f  f page number (o
0c90: 66 74 65 6e 20 31 2c 20 61 6c 77 61 79 73 20 67  ften 1, always g
0ca0: 72 65 61 74 65 72 20 74 68 61 6e 20 30 29 0a 2a  reater than 0).*
0cb0: 2a 20 20 20 20 20 20 20 20 20 2b 20 66 69 6e 61  *         + fina
0cc0: 6c 20 6c 65 61 66 20 70 61 67 65 20 6e 75 6d 62  l leaf page numb
0cd0: 65 72 0a 2a 2a 0a 2a 2a 20 32 2e 20 54 68 65 20  er.**.** 2. The 
0ce0: 41 76 65 72 61 67 65 73 20 52 65 63 6f 72 64 3a  Averages Record:
0cf0: 0a 2a 2a 0a 2a 2a 20 20 20 41 20 73 69 6e 67 6c  .**.**   A singl
0d00: 65 20 72 65 63 6f 72 64 20 77 69 74 68 69 6e 20  e record within 
0d10: 74 68 65 20 25 5f 64 61 74 61 20 74 61 62 6c 65  the %_data table
0d20: 2e 20 54 68 65 20 64 61 74 61 20 69 73 20 61 20  . The data is a 
0d30: 6c 69 73 74 20 6f 66 20 76 61 72 69 6e 74 73 2e  list of varints.
0d40: 0a 2a 2a 20 20 20 54 68 65 20 66 69 72 73 74 20  .**   The first 
0d50: 76 61 6c 75 65 20 69 73 20 74 68 65 20 6e 75 6d  value is the num
0d60: 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e 20 74  ber of rows in t
0d70: 68 65 20 69 6e 64 65 78 2e 20 54 68 65 6e 2c 20  he index. Then, 
0d80: 66 6f 72 20 65 61 63 68 20 63 6f 6c 75 6d 6e 0a  for each column.
0d90: 2a 2a 20 20 20 66 72 6f 6d 20 6c 65 66 74 20 74  **   from left t
0da0: 6f 20 72 69 67 68 74 2c 20 74 68 65 20 74 6f 74  o right, the tot
0db0: 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 74 6f 6b  al number of tok
0dc0: 65 6e 73 20 69 6e 20 74 68 65 20 63 6f 6c 75 6d  ens in the colum
0dd0: 6e 20 66 6f 72 20 61 6c 6c 0a 2a 2a 20 20 20 72  n for all.**   r
0de0: 6f 77 73 20 6f 66 20 74 68 65 20 74 61 62 6c 65  ows of the table
0df0: 2e 0a 2a 2a 0a 2a 2a 20 33 2e 20 53 65 67 6d 65  ..**.** 3. Segme
0e00: 6e 74 20 6c 65 61 76 65 73 3a 0a 2a 2a 0a 2a 2a  nt leaves:.**.**
0e10: 20 20 20 54 45 52 4d 2f 44 4f 43 4c 49 53 54 20     TERM/DOCLIST 
0e20: 46 4f 52 4d 41 54 3a 0a 2a 2a 0a 2a 2a 20 20 20  FORMAT:.**.**   
0e30: 20 20 4d 6f 73 74 20 6f 66 20 65 61 63 68 20 73    Most of each s
0e40: 65 67 6d 65 6e 74 20 6c 65 61 66 20 69 73 20 74  egment leaf is t
0e50: 61 6b 65 6e 20 75 70 20 62 79 20 74 65 72 6d 2f  aken up by term/
0e60: 64 6f 63 6c 69 73 74 20 64 61 74 61 2e 20 54 68  doclist data. Th
0e70: 65 20 0a 2a 2a 20 20 20 20 20 67 65 6e 65 72 61  e .**     genera
0e80: 6c 20 66 6f 72 6d 61 74 20 6f 66 20 74 65 72 6d  l format of term
0e90: 2f 64 6f 63 6c 69 73 74 2c 20 73 74 61 72 74 69  /doclist, starti
0ea0: 6e 67 20 77 69 74 68 20 74 68 65 20 66 69 72 73  ng with the firs
0eb0: 74 20 74 65 72 6d 0a 2a 2a 20 20 20 20 20 6f 6e  t term.**     on
0ec0: 20 74 68 65 20 6c 65 61 66 20 70 61 67 65 2c 20   the leaf page, 
0ed0: 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20  is:.**.**       
0ee0: 20 20 76 61 72 69 6e 74 20 3a 20 73 69 7a 65 20    varint : size 
0ef0: 6f 66 20 66 69 72 73 74 20 74 65 72 6d 0a 2a 2a  of first term.**
0f00: 20 20 20 20 20 20 20 20 20 62 6c 6f 62 3a 20 20           blob:  
0f10: 20 20 66 69 72 73 74 20 74 65 72 6d 20 64 61 74    first term dat
0f20: 61 0a 2a 2a 20 20 20 20 20 20 20 20 20 64 6f 63  a.**         doc
0f30: 6c 69 73 74 3a 20 66 69 72 73 74 20 64 6f 63 6c  list: first docl
0f40: 69 73 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 7a  ist.**         z
0f50: 65 72 6f 2d 6f 72 2d 6d 6f 72 65 20 7b 0a 2a 2a  ero-or-more {.**
0f60: 20 20 20 20 20 20 20 20 20 20 20 76 61 72 69 6e             varin
0f70: 74 3a 20 20 6e 75 6d 62 65 72 20 6f 66 20 62 79  t:  number of by
0f80: 74 65 73 20 69 6e 20 63 6f 6d 6d 6f 6e 20 77 69  tes in common wi
0f90: 74 68 20 70 72 65 76 69 6f 75 73 20 74 65 72 6d  th previous term
0fa0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 76 61  .**           va
0fb0: 72 69 6e 74 3a 20 20 6e 75 6d 62 65 72 20 6f 66  rint:  number of
0fc0: 20 62 79 74 65 73 20 6f 66 20 6e 65 77 20 74 65   bytes of new te
0fd0: 72 6d 20 64 61 74 61 20 28 6e 4e 65 77 29 0a 2a  rm data (nNew).*
0fe0: 2a 20 20 20 20 20 20 20 20 20 20 20 62 6c 6f 62  *           blob
0ff0: 3a 20 20 20 20 6e 4e 65 77 20 62 79 74 65 73 20  :    nNew bytes 
1000: 6f 66 20 6e 65 77 20 74 65 72 6d 20 64 61 74 61  of new term data
1010: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 64 6f  .**           do
1020: 63 6c 69 73 74 3a 20 6e 65 78 74 20 64 6f 63 6c  clist: next docl
1030: 69 73 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 7d  ist.**         }
1040: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 64 6f 63 6c 69  .**.**     docli
1050: 73 74 20 66 6f 72 6d 61 74 3a 0a 2a 2a 0a 2a 2a  st format:.**.**
1060: 20 20 20 20 20 20 20 20 20 76 61 72 69 6e 74 3a           varint:
1070: 20 20 66 69 72 73 74 20 72 6f 77 69 64 0a 2a 2a    first rowid.**
1080: 20 20 20 20 20 20 20 20 20 70 6f 73 6c 69 73 74           poslist
1090: 3a 20 66 69 72 73 74 20 70 6f 73 6c 69 73 74 0a  : first poslist.
10a0: 2a 2a 20 20 20 20 20 20 20 20 20 7a 65 72 6f 2d  **         zero-
10b0: 6f 72 2d 6d 6f 72 65 20 7b 0a 2a 2a 20 20 20 20  or-more {.**    
10c0: 20 20 20 20 20 20 20 76 61 72 69 6e 74 3a 20 20         varint:  
10d0: 72 6f 77 69 64 20 64 65 6c 74 61 20 28 61 6c 77  rowid delta (alw
10e0: 61 79 73 20 3e 20 30 29 0a 2a 2a 20 20 20 20 20  ays > 0).**     
10f0: 20 20 20 20 20 20 70 6f 73 6c 69 73 74 3a 20 6e        poslist: n
1100: 65 78 74 20 70 6f 73 6c 69 73 74 0a 2a 2a 20 20  ext poslist.**  
1110: 20 20 20 20 20 20 20 7d 0a 2a 2a 0a 2a 2a 20 20         }.**.**  
1120: 20 20 20 70 6f 73 6c 69 73 74 20 66 6f 72 6d 61     poslist forma
1130: 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20  t:.**.**        
1140: 20 76 61 72 69 6e 74 3a 20 73 69 7a 65 20 6f 66   varint: size of
1150: 20 70 6f 73 6c 69 73 74 20 69 6e 20 62 79 74 65   poslist in byte
1160: 73 20 6d 75 6c 74 69 70 6c 69 65 64 20 62 79 20  s multiplied by 
1170: 32 2c 20 6e 6f 74 20 69 6e 63 6c 75 64 69 6e 67  2, not including
1180: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
1190: 20 20 20 20 74 68 69 73 20 66 69 65 6c 64 2e 20      this field. 
11a0: 50 6c 75 73 20 31 20 69 66 20 74 68 69 73 20 65  Plus 1 if this e
11b0: 6e 74 72 79 20 63 61 72 72 69 65 73 20 74 68 65  ntry carries the
11c0: 20 22 64 65 6c 65 74 65 22 20 66 6c 61 67 2e 0a   "delete" flag..
11d0: 2a 2a 20 20 20 20 20 20 20 20 20 63 6f 6c 6c 69  **         colli
11e0: 73 74 3a 20 63 6f 6c 6c 69 73 74 20 66 6f 72 20  st: collist for 
11f0: 63 6f 6c 75 6d 6e 20 30 0a 2a 2a 20 20 20 20 20  column 0.**     
1200: 20 20 20 20 7a 65 72 6f 2d 6f 72 2d 6d 6f 72 65      zero-or-more
1210: 20 7b 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20   {.**           
1220: 30 78 30 31 20 62 79 74 65 0a 2a 2a 20 20 20 20  0x01 byte.**    
1230: 20 20 20 20 20 20 20 76 61 72 69 6e 74 3a 20 63         varint: c
1240: 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20 28 49 29  olumn number (I)
1250: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 63 6f  .**           co
1260: 6c 6c 69 73 74 3a 20 63 6f 6c 6c 69 73 74 20 66  llist: collist f
1270: 6f 72 20 63 6f 6c 75 6d 6e 20 49 0a 2a 2a 20 20  or column I.**  
1280: 20 20 20 20 20 20 20 7d 0a 2a 2a 0a 2a 2a 20 20         }.**.**  
1290: 20 20 20 63 6f 6c 6c 69 73 74 20 66 6f 72 6d 61     collist forma
12a0: 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20  t:.**.**        
12b0: 20 76 61 72 69 6e 74 3a 20 66 69 72 73 74 20 6f   varint: first o
12c0: 66 66 73 65 74 20 2b 20 32 0a 2a 2a 20 20 20 20  ffset + 2.**    
12d0: 20 20 20 20 20 7a 65 72 6f 2d 6f 72 2d 6d 6f 72       zero-or-mor
12e0: 65 20 7b 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  e {.**          
12f0: 20 76 61 72 69 6e 74 3a 20 6f 66 66 73 65 74 20   varint: offset 
1300: 64 65 6c 74 61 20 2b 20 32 0a 2a 2a 20 20 20 20  delta + 2.**    
1310: 20 20 20 20 20 7d 0a 2a 2a 0a 2a 2a 20 20 20 50       }.**.**   P
1320: 41 47 45 20 46 4f 52 4d 41 54 0a 2a 2a 0a 2a 2a  AGE FORMAT.**.**
1330: 20 20 20 20 20 45 61 63 68 20 6c 65 61 66 20 70       Each leaf p
1340: 61 67 65 20 62 65 67 69 6e 73 20 77 69 74 68 20  age begins with 
1350: 61 20 34 2d 62 79 74 65 20 68 65 61 64 65 72 20  a 4-byte header 
1360: 63 6f 6e 74 61 69 6e 69 6e 67 20 32 20 31 36 2d  containing 2 16-
1370: 62 69 74 20 0a 2a 2a 20 20 20 20 20 75 6e 73 69  bit .**     unsi
1380: 67 6e 65 64 20 69 6e 74 65 67 65 72 20 66 69 65  gned integer fie
1390: 6c 64 73 20 69 6e 20 62 69 67 2d 65 6e 64 69 61  lds in big-endia
13a0: 6e 20 66 6f 72 6d 61 74 2e 20 54 68 65 79 20 61  n format. They a
13b0: 72 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20  re:.**.**       
13c0: 2a 20 54 68 65 20 62 79 74 65 20 6f 66 66 73 65  * The byte offse
13d0: 74 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 72  t of the first r
13e0: 6f 77 69 64 20 6f 6e 20 74 68 65 20 70 61 67 65  owid on the page
13f0: 2c 20 69 66 20 69 74 20 65 78 69 73 74 73 0a 2a  , if it exists.*
1400: 2a 20 20 20 20 20 20 20 20 20 61 6e 64 20 6f 63  *         and oc
1410: 63 75 72 73 20 62 65 66 6f 72 65 20 74 68 65 20  curs before the 
1420: 66 69 72 73 74 20 74 65 72 6d 20 28 6f 74 68 65  first term (othe
1430: 72 77 69 73 65 20 30 29 2e 0a 2a 2a 0a 2a 2a 20  rwise 0)..**.** 
1440: 20 20 20 20 20 20 2a 20 54 68 65 20 62 79 74 65        * The byte
1450: 20 6f 66 66 73 65 74 20 6f 66 20 74 68 65 20 73   offset of the s
1460: 74 61 72 74 20 6f 66 20 74 68 65 20 70 61 67 65  tart of the page
1470: 20 66 6f 6f 74 65 72 2e 20 49 66 20 74 68 65 20   footer. If the 
1480: 70 61 67 65 0a 2a 2a 20 20 20 20 20 20 20 20 20  page.**         
1490: 66 6f 6f 74 65 72 20 69 73 20 30 20 62 79 74 65  footer is 0 byte
14a0: 73 20 69 6e 20 73 69 7a 65 2c 20 74 68 65 6e 20  s in size, then 
14b0: 74 68 69 73 20 66 69 65 6c 64 20 69 73 20 74 68  this field is th
14c0: 65 20 73 61 6d 65 20 61 73 20 74 68 65 0a 2a 2a  e same as the.**
14d0: 20 20 20 20 20 20 20 20 20 73 69 7a 65 20 6f 66           size of
14e0: 20 74 68 65 20 6c 65 61 66 20 70 61 67 65 20 69   the leaf page i
14f0: 6e 20 62 79 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 20  n bytes..**.**  
1500: 20 20 20 54 68 65 20 70 61 67 65 20 66 6f 6f 74     The page foot
1510: 65 72 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 61  er consists of a
1520: 20 73 69 6e 67 6c 65 20 76 61 72 69 6e 74 20 66   single varint f
1530: 6f 72 20 65 61 63 68 20 74 65 72 6d 20 6c 6f 63  or each term loc
1540: 61 74 65 64 0a 2a 2a 20 20 20 20 20 6f 6e 20 74  ated.**     on t
1550: 68 65 20 70 61 67 65 2e 20 45 61 63 68 20 76 61  he page. Each va
1560: 72 69 6e 74 20 69 73 20 74 68 65 20 62 79 74 65  rint is the byte
1570: 20 6f 66 66 73 65 74 20 6f 66 20 74 68 65 20 63   offset of the c
1580: 75 72 72 65 6e 74 20 74 65 72 6d 0a 2a 2a 20 20  urrent term.**  
1590: 20 20 20 77 69 74 68 69 6e 20 74 68 65 20 70 61     within the pa
15a0: 67 65 2c 20 64 65 6c 74 61 2d 63 6f 6d 70 72 65  ge, delta-compre
15b0: 73 73 65 64 20 61 67 61 69 6e 73 74 20 74 68 65  ssed against the
15c0: 20 70 72 65 76 69 6f 75 73 20 76 61 6c 75 65 2e   previous value.
15d0: 20 49 6e 0a 2a 2a 20 20 20 20 20 6f 74 68 65 72   In.**     other
15e0: 20 77 6f 72 64 73 2c 20 74 68 65 20 66 69 72 73   words, the firs
15f0: 74 20 76 61 72 69 6e 74 20 69 6e 20 74 68 65 20  t varint in the 
1600: 66 6f 6f 74 65 72 20 69 73 20 74 68 65 20 62 79  footer is the by
1610: 74 65 20 6f 66 66 73 65 74 20 6f 66 0a 2a 2a 20  te offset of.** 
1620: 20 20 20 20 74 68 65 20 66 69 72 73 74 20 74 65      the first te
1630: 72 6d 2c 20 74 68 65 20 73 65 63 6f 6e 64 20 69  rm, the second i
1640: 73 20 74 68 65 20 62 79 74 65 20 6f 66 66 73 65  s the byte offse
1650: 74 20 6f 66 20 74 68 65 20 73 65 63 6f 6e 64 20  t of the second 
1660: 6c 65 73 73 20 74 68 61 74 0a 2a 2a 20 20 20 20  less that.**    
1670: 20 6f 66 20 74 68 65 20 66 69 72 73 74 2c 20 61   of the first, a
1680: 6e 64 20 73 6f 20 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  nd so on..**.** 
1690: 20 20 20 20 54 68 65 20 74 65 72 6d 2f 64 6f 63      The term/doc
16a0: 6c 69 73 74 20 66 6f 72 6d 61 74 20 64 65 73 63  list format desc
16b0: 72 69 62 65 64 20 61 62 6f 76 65 20 69 73 20 61  ribed above is a
16c0: 63 63 75 72 61 74 65 20 69 66 20 74 68 65 20 65  ccurate if the e
16d0: 6e 74 69 72 65 0a 2a 2a 20 20 20 20 20 74 65 72  ntire.**     ter
16e0: 6d 2f 64 6f 63 6c 69 73 74 20 64 61 74 61 20 66  m/doclist data f
16f0: 69 74 73 20 6f 6e 20 61 20 73 69 6e 67 6c 65 20  its on a single 
1700: 6c 65 61 66 20 70 61 67 65 2e 20 49 66 20 74 68  leaf page. If th
1710: 69 73 20 69 73 20 6e 6f 74 20 74 68 65 20 63 61  is is not the ca
1720: 73 65 2c 0a 2a 2a 20 20 20 20 20 74 68 65 20 66  se,.**     the f
1730: 6f 72 6d 61 74 20 69 73 20 63 68 61 6e 67 65 64  ormat is changed
1740: 20 69 6e 20 74 77 6f 20 77 61 79 73 3a 0a 2a 2a   in two ways:.**
1750: 0a 2a 2a 20 20 20 20 20 20 20 2b 20 69 66 20 74  .**       + if t
1760: 68 65 20 66 69 72 73 74 20 72 6f 77 69 64 20 6f  he first rowid o
1770: 6e 20 61 20 70 61 67 65 20 6f 63 63 75 72 73 20  n a page occurs 
1780: 62 65 66 6f 72 65 20 74 68 65 20 66 69 72 73 74  before the first
1790: 20 74 65 72 6d 2c 20 69 74 0a 2a 2a 20 20 20 20   term, it.**    
17a0: 20 20 20 20 20 69 73 20 73 74 6f 72 65 64 20 61       is stored a
17b0: 73 20 61 20 6c 69 74 65 72 61 6c 20 76 61 6c 75  s a literal valu
17c0: 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20  e:.**.**        
17d0: 20 20 20 20 20 76 61 72 69 6e 74 3a 20 20 66 69       varint:  fi
17e0: 72 73 74 20 72 6f 77 69 64 0a 2a 2a 0a 2a 2a 20  rst rowid.**.** 
17f0: 20 20 20 20 20 20 2b 20 74 68 65 20 66 69 72 73        + the firs
1800: 74 20 74 65 72 6d 20 6f 6e 20 65 61 63 68 20 70  t term on each p
1810: 61 67 65 20 69 73 20 73 74 6f 72 65 64 20 69 6e  age is stored in
1820: 20 74 68 65 20 73 61 6d 65 20 77 61 79 20 61 73   the same way as
1830: 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 20   the.**         
1840: 76 65 72 79 20 66 69 72 73 74 20 74 65 72 6d 20  very first term 
1850: 6f 66 20 74 68 65 20 73 65 67 6d 65 6e 74 3a 0a  of the segment:.
1860: 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  **.**           
1870: 20 20 76 61 72 69 6e 74 20 3a 20 73 69 7a 65 20    varint : size 
1880: 6f 66 20 66 69 72 73 74 20 74 65 72 6d 0a 2a 2a  of first term.**
1890: 20 20 20 20 20 20 20 20 20 20 20 20 20 62 6c 6f               blo
18a0: 62 3a 20 20 20 20 66 69 72 73 74 20 74 65 72 6d  b:    first term
18b0: 20 64 61 74 61 0a 2a 2a 0a 2a 2a 20 35 2e 20 53   data.**.** 5. S
18c0: 65 67 6d 65 6e 74 20 64 6f 63 6c 69 73 74 20 69  egment doclist i
18d0: 6e 64 65 78 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  ndexes:.**.**   
18e0: 44 6f 63 6c 69 73 74 20 69 6e 64 65 78 65 73 20  Doclist indexes 
18f0: 61 72 65 20 74 68 65 6d 73 65 6c 76 65 73 20 62  are themselves b
1900: 2d 74 72 65 65 73 2c 20 68 6f 77 65 76 65 72 20  -trees, however 
1910: 74 68 65 79 20 75 73 75 61 6c 6c 79 20 63 6f 6e  they usually con
1920: 73 69 73 74 20 6f 66 0a 2a 2a 20 20 20 61 20 73  sist of.**   a s
1930: 69 6e 67 6c 65 20 6c 65 61 66 20 72 65 63 6f 72  ingle leaf recor
1940: 64 20 6f 6e 6c 79 2e 20 54 68 65 20 66 6f 72 6d  d only. The form
1950: 61 74 20 6f 66 20 65 61 63 68 20 64 6f 63 6c 69  at of each docli
1960: 73 74 20 69 6e 64 65 78 20 6c 65 61 66 20 70 61  st index leaf pa
1970: 67 65 20 0a 2a 2a 20 20 20 69 73 3a 0a 2a 2a 0a  ge .**   is:.**.
1980: 2a 2a 20 20 20 20 20 2a 20 46 6c 61 67 73 20 62  **     * Flags b
1990: 79 74 65 2e 20 42 69 74 73 20 61 72 65 3a 0a 2a  yte. Bits are:.*
19a0: 2a 20 20 20 20 20 20 20 20 20 30 78 30 31 3a 20  *         0x01: 
19b0: 43 6c 65 61 72 20 69 66 20 6c 65 61 66 20 69 73  Clear if leaf is
19c0: 20 61 6c 73 6f 20 74 68 65 20 72 6f 6f 74 20 70   also the root p
19d0: 61 67 65 2c 20 6f 74 68 65 72 77 69 73 65 20 73  age, otherwise s
19e0: 65 74 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 20  et..**.**     * 
19f0: 50 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 66  Page number of f
1a00: 74 73 20 69 6e 64 65 78 20 6c 65 61 66 20 70 61  ts index leaf pa
1a10: 67 65 2e 20 41 73 20 61 20 76 61 72 69 6e 74 2e  ge. As a varint.
1a20: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 20 46 69 72  .**.**     * Fir
1a30: 73 74 20 72 6f 77 69 64 20 6f 6e 20 70 61 67 65  st rowid on page
1a40: 20 69 6e 64 69 63 61 74 65 64 20 62 79 20 70 72   indicated by pr
1a50: 65 76 69 6f 75 73 20 66 69 65 6c 64 2e 20 41 73  evious field. As
1a60: 20 61 20 76 61 72 69 6e 74 2e 0a 2a 2a 0a 2a 2a   a varint..**.**
1a70: 20 20 20 20 20 2a 20 41 20 6c 69 73 74 20 6f 66       * A list of
1a80: 20 76 61 72 69 6e 74 73 2c 20 6f 6e 65 20 66 6f   varints, one fo
1a90: 72 20 65 61 63 68 20 73 75 62 73 65 71 75 65 6e  r each subsequen
1aa0: 74 20 74 65 72 6d 6c 65 73 73 20 70 61 67 65 2e  t termless page.
1ab0: 20 41 20 0a 2a 2a 20 20 20 20 20 20 20 70 6f 73   A .**       pos
1ac0: 69 74 69 76 65 20 64 65 6c 74 61 20 69 66 20 74  itive delta if t
1ad0: 68 65 20 74 65 72 6d 6c 65 73 73 20 70 61 67 65  he termless page
1ae0: 20 63 6f 6e 74 61 69 6e 73 20 61 74 20 6c 65 61   contains at lea
1af0: 73 74 20 6f 6e 65 20 72 6f 77 69 64 2c 20 0a 2a  st one rowid, .*
1b00: 2a 20 20 20 20 20 20 20 6f 72 20 61 6e 20 30 78  *       or an 0x
1b10: 30 30 20 62 79 74 65 20 6f 74 68 65 72 77 69 73  00 byte otherwis
1b20: 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 49 6e 74 65 72  e..**.**   Inter
1b30: 6e 61 6c 20 64 6f 63 6c 69 73 74 20 69 6e 64 65  nal doclist inde
1b40: 78 20 6e 6f 64 65 73 20 61 72 65 3a 0a 2a 2a 0a  x nodes are:.**.
1b50: 2a 2a 20 20 20 20 20 2a 20 46 6c 61 67 73 20 62  **     * Flags b
1b60: 79 74 65 2e 20 42 69 74 73 20 61 72 65 3a 0a 2a  yte. Bits are:.*
1b70: 2a 20 20 20 20 20 20 20 20 20 30 78 30 31 3a 20  *         0x01: 
1b80: 43 6c 65 61 72 20 66 6f 72 20 72 6f 6f 74 20 70  Clear for root p
1b90: 61 67 65 2c 20 6f 74 68 65 72 77 69 73 65 20 73  age, otherwise s
1ba0: 65 74 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 20  et..**.**     * 
1bb0: 50 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 66  Page number of f
1bc0: 69 72 73 74 20 63 68 69 6c 64 20 70 61 67 65 2e  irst child page.
1bd0: 20 41 73 20 61 20 76 61 72 69 6e 74 2e 0a 2a 2a   As a varint..**
1be0: 0a 2a 2a 20 20 20 20 20 2a 20 43 6f 70 79 20 6f  .**     * Copy o
1bf0: 66 20 66 69 72 73 74 20 72 6f 77 69 64 20 6f 6e  f first rowid on
1c00: 20 70 61 67 65 20 69 6e 64 69 63 61 74 65 64 20   page indicated 
1c10: 62 79 20 70 72 65 76 69 6f 75 73 20 66 69 65 6c  by previous fiel
1c20: 64 2e 20 41 73 20 61 20 76 61 72 69 6e 74 2e 0a  d. As a varint..
1c30: 2a 2a 0a 2a 2a 20 20 20 20 20 2a 20 41 20 6c 69  **.**     * A li
1c40: 73 74 20 6f 66 20 64 65 6c 74 61 2d 65 6e 63 6f  st of delta-enco
1c50: 64 65 64 20 76 61 72 69 6e 74 73 20 2d 20 74 68  ded varints - th
1c60: 65 20 66 69 72 73 74 20 72 6f 77 69 64 20 6f 6e  e first rowid on
1c70: 20 65 61 63 68 20 73 75 62 73 65 71 75 65 6e 74   each subsequent
1c80: 0a 2a 2a 20 20 20 20 20 20 20 63 68 69 6c 64 20  .**       child 
1c90: 70 61 67 65 2e 20 0a 2a 2a 0a 2a 2f 0a 0a 2f 2a  page. .**.*/../*
1ca0: 0a 2a 2a 20 52 6f 77 69 64 73 20 66 6f 72 20 74  .** Rowids for t
1cb0: 68 65 20 61 76 65 72 61 67 65 73 20 61 6e 64 20  he averages and 
1cc0: 73 74 72 75 63 74 75 72 65 20 72 65 63 6f 72 64  structure record
1cd0: 73 20 69 6e 20 74 68 65 20 25 5f 64 61 74 61 20  s in the %_data 
1ce0: 74 61 62 6c 65 2e 0a 2a 2f 0a 23 64 65 66 69 6e  table..*/.#defin
1cf0: 65 20 46 54 53 35 5f 41 56 45 52 41 47 45 53 5f  e FTS5_AVERAGES_
1d00: 52 4f 57 49 44 20 20 20 20 20 31 20 20 20 20 2f  ROWID     1    /
1d10: 2a 20 52 6f 77 69 64 20 75 73 65 64 20 66 6f 72  * Rowid used for
1d20: 20 74 68 65 20 61 76 65 72 61 67 65 73 20 72 65   the averages re
1d30: 63 6f 72 64 20 2a 2f 0a 23 64 65 66 69 6e 65 20  cord */.#define 
1d40: 46 54 53 35 5f 53 54 52 55 43 54 55 52 45 5f 52  FTS5_STRUCTURE_R
1d50: 4f 57 49 44 20 20 20 31 30 20 20 20 20 2f 2a 20  OWID   10    /* 
1d60: 54 68 65 20 73 74 72 75 63 74 75 72 65 20 72 65  The structure re
1d70: 63 6f 72 64 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 4d  cord */../*.** M
1d80: 61 63 72 6f 73 20 64 65 74 65 72 6d 69 6e 69 6e  acros determinin
1d90: 67 20 74 68 65 20 72 6f 77 69 64 73 20 75 73 65  g the rowids use
1da0: 64 20 62 79 20 73 65 67 6d 65 6e 74 20 6c 65 61  d by segment lea
1db0: 76 65 73 20 61 6e 64 20 64 6c 69 64 78 20 6c 65  ves and dlidx le
1dc0: 61 76 65 73 0a 2a 2a 20 61 6e 64 20 6e 6f 64 65  aves.** and node
1dd0: 73 2e 20 41 6c 6c 20 6e 6f 64 65 73 20 61 6e 64  s. All nodes and
1de0: 20 6c 65 61 76 65 73 20 61 72 65 20 73 74 6f 72   leaves are stor
1df0: 65 64 20 69 6e 20 74 68 65 20 25 5f 64 61 74 61  ed in the %_data
1e00: 20 74 61 62 6c 65 20 77 69 74 68 20 6c 61 72 67   table with larg
1e10: 65 0a 2a 2a 20 70 6f 73 69 74 69 76 65 20 72 6f  e.** positive ro
1e20: 77 69 64 73 2e 0a 2a 2a 0a 2a 2a 20 45 61 63 68  wids..**.** Each
1e30: 20 73 65 67 6d 65 6e 74 20 68 61 73 20 61 20 75   segment has a u
1e40: 6e 69 71 75 65 20 6e 6f 6e 2d 7a 65 72 6f 20 31  nique non-zero 1
1e50: 36 2d 62 69 74 20 69 64 2e 0a 2a 2a 0a 2a 2a 20  6-bit id..**.** 
1e60: 54 68 65 20 72 6f 77 69 64 20 66 6f 72 20 65 61  The rowid for ea
1e70: 63 68 20 73 65 67 6d 65 6e 74 20 6c 65 61 66 20  ch segment leaf 
1e80: 69 73 20 66 6f 75 6e 64 20 62 79 20 70 61 73 73  is found by pass
1e90: 69 6e 67 20 74 68 65 20 73 65 67 6d 65 6e 74 20  ing the segment 
1ea0: 69 64 20 61 6e 64 20 0a 2a 2a 20 74 68 65 20 6c  id and .** the l
1eb0: 65 61 66 20 70 61 67 65 20 6e 75 6d 62 65 72 20  eaf page number 
1ec0: 74 6f 20 74 68 65 20 46 54 53 35 5f 53 45 47 4d  to the FTS5_SEGM
1ed0: 45 4e 54 5f 52 4f 57 49 44 20 6d 61 63 72 6f 2e  ENT_ROWID macro.
1ee0: 20 4c 65 61 76 65 73 20 61 72 65 20 6e 75 6d 62   Leaves are numb
1ef0: 65 72 65 64 0a 2a 2a 20 73 65 71 75 65 6e 74 69  ered.** sequenti
1f00: 61 6c 6c 79 20 73 74 61 72 74 69 6e 67 20 66 72  ally starting fr
1f10: 6f 6d 20 31 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  om 1..*/.#define
1f20: 20 46 54 53 35 5f 44 41 54 41 5f 49 44 5f 42 20   FTS5_DATA_ID_B 
1f30: 20 20 20 20 31 36 20 20 20 20 20 2f 2a 20 4d 61      16     /* Ma
1f40: 78 20 73 65 67 20 69 64 20 6e 75 6d 62 65 72 20  x seg id number 
1f50: 36 35 35 33 35 20 2a 2f 0a 23 64 65 66 69 6e 65  65535 */.#define
1f60: 20 46 54 53 35 5f 44 41 54 41 5f 44 4c 49 5f 42   FTS5_DATA_DLI_B
1f70: 20 20 20 20 20 31 20 20 20 20 20 2f 2a 20 44 6f       1     /* Do
1f80: 63 6c 69 73 74 2d 69 6e 64 65 78 20 66 6c 61 67  clist-index flag
1f90: 20 28 31 20 62 69 74 29 20 2a 2f 0a 23 64 65 66   (1 bit) */.#def
1fa0: 69 6e 65 20 46 54 53 35 5f 44 41 54 41 5f 48 45  ine FTS5_DATA_HE
1fb0: 49 47 48 54 5f 42 20 20 35 20 20 20 20 20 2f 2a  IGHT_B  5     /*
1fc0: 20 4d 61 78 20 64 6c 69 64 78 20 74 72 65 65 20   Max dlidx tree 
1fd0: 68 65 69 67 68 74 20 6f 66 20 33 32 20 2a 2f 0a  height of 32 */.
1fe0: 23 64 65 66 69 6e 65 20 46 54 53 35 5f 44 41 54  #define FTS5_DAT
1ff0: 41 5f 50 41 47 45 5f 42 20 20 20 33 31 20 20 20  A_PAGE_B   31   
2000: 20 20 2f 2a 20 4d 61 78 20 70 61 67 65 20 6e 75    /* Max page nu
2010: 6d 62 65 72 20 6f 66 20 32 31 34 37 34 38 33 36  mber of 21474836
2020: 34 38 20 2a 2f 0a 0a 23 64 65 66 69 6e 65 20 66  48 */..#define f
2030: 74 73 35 5f 64 72 69 28 73 65 67 69 64 2c 20 64  ts5_dri(segid, d
2040: 6c 69 64 78 2c 20 68 65 69 67 68 74 2c 20 70 67  lidx, height, pg
2050: 6e 6f 29 20 28 20 20 20 20 20 20 20 20 20 20 20  no) (           
2060: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2070: 20 20 20 20 20 20 5c 0a 20 28 28 69 36 34 29 28        \. ((i64)(
2080: 73 65 67 69 64 29 20 20 3c 3c 20 28 46 54 53 35  segid)  << (FTS5
2090: 5f 44 41 54 41 5f 50 41 47 45 5f 42 2b 46 54 53  _DATA_PAGE_B+FTS
20a0: 35 5f 44 41 54 41 5f 48 45 49 47 48 54 5f 42 2b  5_DATA_HEIGHT_B+
20b0: 46 54 53 35 5f 44 41 54 41 5f 44 4c 49 5f 42 29  FTS5_DATA_DLI_B)
20c0: 29 20 2b 20 20 20 20 5c 0a 20 28 28 69 36 34 29  ) +    \. ((i64)
20d0: 28 64 6c 69 64 78 29 20 20 3c 3c 20 28 46 54 53  (dlidx)  << (FTS
20e0: 35 5f 44 41 54 41 5f 50 41 47 45 5f 42 20 2b 20  5_DATA_PAGE_B + 
20f0: 46 54 53 35 5f 44 41 54 41 5f 48 45 49 47 48 54  FTS5_DATA_HEIGHT
2100: 5f 42 29 29 20 2b 20 20 20 20 20 20 20 20 20 20  _B)) +          
2110: 20 20 20 20 20 20 20 20 5c 0a 20 28 28 69 36 34          \. ((i64
2120: 29 28 68 65 69 67 68 74 29 20 3c 3c 20 28 46 54  )(height) << (FT
2130: 53 35 5f 44 41 54 41 5f 50 41 47 45 5f 42 29 29  S5_DATA_PAGE_B))
2140: 20 2b 20 20 20 20 20 20 20 20 20 20 20 20 20 20   +              
2150: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2160: 20 20 20 20 20 20 20 20 20 5c 0a 20 28 28 69 36           \. ((i6
2170: 34 29 28 70 67 6e 6f 29 29 20 20 20 20 20 20 20  4)(pgno))       
2180: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21b0: 20 20 20 20 20 20 20 20 20 20 5c 0a 29 0a 0a 23            \.)..#
21c0: 64 65 66 69 6e 65 20 46 54 53 35 5f 53 45 47 4d  define FTS5_SEGM
21d0: 45 4e 54 5f 52 4f 57 49 44 28 73 65 67 69 64 2c  ENT_ROWID(segid,
21e0: 20 70 67 6e 6f 29 20 20 20 20 20 20 20 66 74 73   pgno)       fts
21f0: 35 5f 64 72 69 28 73 65 67 69 64 2c 20 30 2c 20  5_dri(segid, 0, 
2200: 30 2c 20 70 67 6e 6f 29 0a 23 64 65 66 69 6e 65  0, pgno).#define
2210: 20 46 54 53 35 5f 44 4c 49 44 58 5f 52 4f 57 49   FTS5_DLIDX_ROWI
2220: 44 28 73 65 67 69 64 2c 20 68 65 69 67 68 74 2c  D(segid, height,
2230: 20 70 67 6e 6f 29 20 66 74 73 35 5f 64 72 69 28   pgno) fts5_dri(
2240: 73 65 67 69 64 2c 20 31 2c 20 68 65 69 67 68 74  segid, 1, height
2250: 2c 20 70 67 6e 6f 29 0a 0a 2f 2a 0a 2a 2a 20 4d  , pgno)../*.** M
2260: 61 78 69 6d 75 6d 20 73 65 67 6d 65 6e 74 73 20  aximum segments 
2270: 70 65 72 6d 69 74 74 65 64 20 69 6e 20 61 20 73  permitted in a s
2280: 69 6e 67 6c 65 20 69 6e 64 65 78 20 0a 2a 2f 0a  ingle index .*/.
2290: 23 64 65 66 69 6e 65 20 46 54 53 35 5f 4d 41 58  #define FTS5_MAX
22a0: 5f 53 45 47 4d 45 4e 54 20 32 30 30 30 0a 0a 23  _SEGMENT 2000..#
22b0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
22c0: 55 47 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74  UG.int sqlite3Ft
22d0: 73 35 43 6f 72 72 75 70 74 28 29 20 7b 20 72 65  s5Corrupt() { re
22e0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
22f0: 55 50 54 5f 56 54 41 42 3b 20 7d 0a 23 65 6e 64  UPT_VTAB; }.#end
2300: 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 45 61 63 68 20  if.../*.** Each 
2310: 74 69 6d 65 20 61 20 62 6c 6f 62 20 69 73 20 72  time a blob is r
2320: 65 61 64 20 66 72 6f 6d 20 74 68 65 20 25 5f 64  ead from the %_d
2330: 61 74 61 20 74 61 62 6c 65 2c 20 69 74 20 69 73  ata table, it is
2340: 20 70 61 64 64 65 64 20 77 69 74 68 20 74 68 69   padded with thi
2350: 73 0a 2a 2a 20 6d 61 6e 79 20 7a 65 72 6f 20 62  s.** many zero b
2360: 79 74 65 73 2e 20 54 68 69 73 20 6d 61 6b 65 73  ytes. This makes
2370: 20 69 74 20 65 61 73 69 65 72 20 74 6f 20 64 65   it easier to de
2380: 63 6f 64 65 20 74 68 65 20 76 61 72 69 6f 75 73  code the various
2390: 20 72 65 63 6f 72 64 20 66 6f 72 6d 61 74 73 0a   record formats.
23a0: 2a 2a 20 77 69 74 68 6f 75 74 20 6f 76 65 72 72  ** without overr
23b0: 65 61 64 69 6e 67 20 69 66 20 74 68 65 20 72 65  eading if the re
23c0: 63 6f 72 64 73 20 61 72 65 20 63 6f 72 72 75 70  cords are corrup
23d0: 74 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 46 54  t..*/.#define FT
23e0: 53 35 5f 44 41 54 41 5f 5a 45 52 4f 5f 50 41 44  S5_DATA_ZERO_PAD
23f0: 44 49 4e 47 20 38 0a 23 64 65 66 69 6e 65 20 46  DING 8.#define F
2400: 54 53 35 5f 44 41 54 41 5f 50 41 44 44 49 4e 47  TS5_DATA_PADDING
2410: 20 32 30 0a 0a 74 79 70 65 64 65 66 20 73 74 72   20..typedef str
2420: 75 63 74 20 46 74 73 35 44 61 74 61 20 46 74 73  uct Fts5Data Fts
2430: 35 44 61 74 61 3b 0a 74 79 70 65 64 65 66 20 73  5Data;.typedef s
2440: 74 72 75 63 74 20 46 74 73 35 44 6c 69 64 78 49  truct Fts5DlidxI
2450: 74 65 72 20 46 74 73 35 44 6c 69 64 78 49 74 65  ter Fts5DlidxIte
2460: 72 3b 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  r;.typedef struc
2470: 74 20 46 74 73 35 44 6c 69 64 78 4c 76 6c 20 46  t Fts5DlidxLvl F
2480: 74 73 35 44 6c 69 64 78 4c 76 6c 3b 0a 74 79 70  ts5DlidxLvl;.typ
2490: 65 64 65 66 20 73 74 72 75 63 74 20 46 74 73 35  edef struct Fts5
24a0: 44 6c 69 64 78 57 72 69 74 65 72 20 46 74 73 35  DlidxWriter Fts5
24b0: 44 6c 69 64 78 57 72 69 74 65 72 3b 0a 74 79 70  DlidxWriter;.typ
24c0: 65 64 65 66 20 73 74 72 75 63 74 20 46 74 73 35  edef struct Fts5
24d0: 50 61 67 65 57 72 69 74 65 72 20 46 74 73 35 50  PageWriter Fts5P
24e0: 61 67 65 57 72 69 74 65 72 3b 0a 74 79 70 65 64  ageWriter;.typed
24f0: 65 66 20 73 74 72 75 63 74 20 46 74 73 35 53 65  ef struct Fts5Se
2500: 67 49 74 65 72 20 46 74 73 35 53 65 67 49 74 65  gIter Fts5SegIte
2510: 72 3b 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  r;.typedef struc
2520: 74 20 46 74 73 35 44 6f 63 6c 69 73 74 49 74 65  t Fts5DoclistIte
2530: 72 20 46 74 73 35 44 6f 63 6c 69 73 74 49 74 65  r Fts5DoclistIte
2540: 72 3b 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  r;.typedef struc
2550: 74 20 46 74 73 35 53 65 67 57 72 69 74 65 72 20  t Fts5SegWriter 
2560: 46 74 73 35 53 65 67 57 72 69 74 65 72 3b 0a 74  Fts5SegWriter;.t
2570: 79 70 65 64 65 66 20 73 74 72 75 63 74 20 46 74  ypedef struct Ft
2580: 73 35 53 74 72 75 63 74 75 72 65 20 46 74 73 35  s5Structure Fts5
2590: 53 74 72 75 63 74 75 72 65 3b 0a 74 79 70 65 64  Structure;.typed
25a0: 65 66 20 73 74 72 75 63 74 20 46 74 73 35 53 74  ef struct Fts5St
25b0: 72 75 63 74 75 72 65 4c 65 76 65 6c 20 46 74 73  ructureLevel Fts
25c0: 35 53 74 72 75 63 74 75 72 65 4c 65 76 65 6c 3b  5StructureLevel;
25d0: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
25e0: 46 74 73 35 53 74 72 75 63 74 75 72 65 53 65 67  Fts5StructureSeg
25f0: 6d 65 6e 74 20 46 74 73 35 53 74 72 75 63 74 75  ment Fts5Structu
2600: 72 65 53 65 67 6d 65 6e 74 3b 0a 0a 73 74 72 75  reSegment;..stru
2610: 63 74 20 46 74 73 35 44 61 74 61 20 7b 0a 20 20  ct Fts5Data {.  
2620: 75 38 20 2a 70 3b 20 20 20 20 20 20 20 20 20 20  u8 *p;          
2630: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2640: 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 62 75  /* Pointer to bu
2650: 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20  ffer containing 
2660: 72 65 63 6f 72 64 20 2a 2f 0a 20 20 69 6e 74 20  record */.  int 
2670: 6e 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  nn;             
2680: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
2690: 69 7a 65 20 6f 66 20 72 65 63 6f 72 64 20 69 6e  ize of record in
26a0: 20 62 79 74 65 73 20 2a 2f 0a 20 20 69 6e 74 20   bytes */.  int 
26b0: 73 7a 4c 65 61 66 3b 20 20 20 20 20 20 20 20 20  szLeaf;         
26c0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
26d0: 69 7a 65 20 6f 66 20 6c 65 61 66 20 77 69 74 68  ize of leaf with
26e0: 6f 75 74 20 70 61 67 65 2d 69 6e 64 65 78 20 2a  out page-index *
26f0: 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 4f 6e 65 20  /.};../*.** One 
2700: 6f 62 6a 65 63 74 20 70 65 72 20 25 5f 64 61 74  object per %_dat
2710: 61 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 72 75  a table..*/.stru
2720: 63 74 20 46 74 73 35 49 6e 64 65 78 20 7b 0a 20  ct Fts5Index {. 
2730: 20 46 74 73 35 43 6f 6e 66 69 67 20 2a 70 43 6f   Fts5Config *pCo
2740: 6e 66 69 67 3b 20 20 20 20 20 20 20 20 20 20 20  nfig;           
2750: 20 2f 2a 20 56 69 72 74 75 61 6c 20 74 61 62 6c   /* Virtual tabl
2760: 65 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20  e configuration 
2770: 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 44 61 74 61  */.  char *zData
2780: 54 62 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  Tbl;            
2790: 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
27a0: 25 5f 64 61 74 61 20 74 61 62 6c 65 20 2a 2f 0a  %_data table */.
27b0: 20 20 69 6e 74 20 6e 57 6f 72 6b 55 6e 69 74 3b    int nWorkUnit;
27c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27d0: 20 20 2f 2a 20 4c 65 61 66 20 70 61 67 65 73 20    /* Leaf pages 
27e0: 69 6e 20 61 20 22 75 6e 69 74 22 20 6f 66 20 77  in a "unit" of w
27f0: 6f 72 6b 20 2a 2f 0a 0a 20 20 2f 2a 0a 20 20 2a  ork */..  /*.  *
2800: 2a 20 56 61 72 69 61 62 6c 65 73 20 72 65 6c 61  * Variables rela
2810: 74 65 64 20 74 6f 20 74 68 65 20 61 63 63 75 6d  ted to the accum
2820: 75 6c 61 74 69 6f 6e 20 6f 66 20 74 6f 6b 65 6e  ulation of token
2830: 73 20 61 6e 64 20 64 6f 63 6c 69 73 74 73 20 77  s and doclists w
2840: 69 74 68 69 6e 20 74 68 65 0a 20 20 2a 2a 20 69  ithin the.  ** i
2850: 6e 2d 6d 65 6d 6f 72 79 20 68 61 73 68 20 74 61  n-memory hash ta
2860: 62 6c 65 73 20 62 65 66 6f 72 65 20 74 68 65 79  bles before they
2870: 20 61 72 65 20 66 6c 75 73 68 65 64 20 74 6f 20   are flushed to 
2880: 64 69 73 6b 2e 0a 20 20 2a 2f 0a 20 20 46 74 73  disk..  */.  Fts
2890: 35 48 61 73 68 20 2a 70 48 61 73 68 3b 20 20 20  5Hash *pHash;   
28a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
28b0: 48 61 73 68 20 74 61 62 6c 65 20 66 6f 72 20 69  Hash table for i
28c0: 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 20 2a 2f  n-memory data */
28d0: 0a 20 20 69 6e 74 20 6e 4d 61 78 50 65 6e 64 69  .  int nMaxPendi
28e0: 6e 67 44 61 74 61 3b 20 20 20 20 20 20 20 20 20  ngData;         
28f0: 20 20 20 2f 2a 20 4d 61 78 20 70 65 6e 64 69 6e     /* Max pendin
2900: 67 20 64 61 74 61 20 62 65 66 6f 72 65 20 66 6c  g data before fl
2910: 75 73 68 20 74 6f 20 64 69 73 6b 20 2a 2f 0a 20  ush to disk */. 
2920: 20 69 6e 74 20 6e 50 65 6e 64 69 6e 67 44 61 74   int nPendingDat
2930: 61 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  a;              
2940: 20 2f 2a 20 43 75 72 72 65 6e 74 20 62 79 74 65   /* Current byte
2950: 73 20 6f 66 20 70 65 6e 64 69 6e 67 20 64 61 74  s of pending dat
2960: 61 20 2a 2f 0a 20 20 69 36 34 20 69 57 72 69 74  a */.  i64 iWrit
2970: 65 52 6f 77 69 64 3b 20 20 20 20 20 20 20 20 20  eRowid;         
2980: 20 20 20 20 20 20 20 2f 2a 20 52 6f 77 69 64 20         /* Rowid 
2990: 66 6f 72 20 63 75 72 72 65 6e 74 20 64 6f 63 20  for current doc 
29a0: 62 65 69 6e 67 20 77 72 69 74 74 65 6e 20 2a 2f  being written */
29b0: 0a 20 20 69 6e 74 20 62 44 65 6c 65 74 65 3b 20  .  int bDelete; 
29c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29d0: 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 77 72     /* Current wr
29e0: 69 74 65 20 69 73 20 61 20 64 65 6c 65 74 65 20  ite is a delete 
29f0: 2a 2f 0a 0a 20 20 2f 2a 20 45 72 72 6f 72 20 73  */..  /* Error s
2a00: 74 61 74 65 2e 20 2a 2f 0a 20 20 69 6e 74 20 72  tate. */.  int r
2a10: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
2a20: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75             /* Cu
2a30: 72 72 65 6e 74 20 65 72 72 6f 72 20 63 6f 64 65  rrent error code
2a40: 20 2a 2f 0a 0a 20 20 2f 2a 20 53 74 61 74 65 20   */..  /* State 
2a50: 75 73 65 64 20 62 79 20 74 68 65 20 66 74 73 35  used by the fts5
2a60: 44 61 74 61 58 58 58 28 29 20 66 75 6e 63 74 69  DataXXX() functi
2a70: 6f 6e 73 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65  ons. */.  sqlite
2a80: 33 5f 62 6c 6f 62 20 2a 70 52 65 61 64 65 72 3b  3_blob *pReader;
2a90: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 4f 20            /* RO 
2aa0: 69 6e 63 72 2d 62 6c 6f 62 20 6f 70 65 6e 20 6f  incr-blob open o
2ab0: 6e 20 25 5f 64 61 74 61 20 74 61 62 6c 65 20 2a  n %_data table *
2ac0: 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  /.  sqlite3_stmt
2ad0: 20 2a 70 57 72 69 74 65 72 3b 20 20 20 20 20 20   *pWriter;      
2ae0: 20 20 20 20 2f 2a 20 22 49 4e 53 45 52 54 20 2e      /* "INSERT .
2af0: 2e 2e 20 25 5f 64 61 74 61 20 56 41 4c 55 45 53  .. %_data VALUES
2b00: 28 3f 2c 3f 29 22 20 2a 2f 0a 20 20 73 71 6c 69  (?,?)" */.  sqli
2b10: 74 65 33 5f 73 74 6d 74 20 2a 70 44 65 6c 65 74  te3_stmt *pDelet
2b20: 65 72 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 22  er;         /* "
2b30: 44 45 4c 45 54 45 20 46 52 4f 4d 20 25 5f 64 61  DELETE FROM %_da
2b40: 74 61 20 2e 2e 2e 20 69 64 3e 3d 3f 20 41 4e 44  ta ... id>=? AND
2b50: 20 69 64 3c 3d 3f 22 20 2a 2f 0a 20 20 73 71 6c   id<=?" */.  sql
2b60: 69 74 65 33 5f 73 74 6d 74 20 2a 70 49 64 78 57  ite3_stmt *pIdxW
2b70: 72 69 74 65 72 3b 20 20 20 20 20 20 20 2f 2a 20  riter;       /* 
2b80: 22 49 4e 53 45 52 54 20 2e 2e 2e 20 25 5f 69 64  "INSERT ... %_id
2b90: 78 20 56 41 4c 55 45 53 28 3f 2c 3f 2c 3f 2c 3f  x VALUES(?,?,?,?
2ba0: 29 22 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  )" */.  sqlite3_
2bb0: 73 74 6d 74 20 2a 70 49 64 78 44 65 6c 65 74 65  stmt *pIdxDelete
2bc0: 72 3b 20 20 20 20 20 20 2f 2a 20 22 44 45 4c 45  r;      /* "DELE
2bd0: 54 45 20 46 52 4f 4d 20 25 5f 69 64 78 20 57 48  TE FROM %_idx WH
2be0: 45 52 45 20 73 65 67 69 64 3d 3f 20 2a 2f 0a 20  ERE segid=? */. 
2bf0: 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
2c00: 49 64 78 53 65 6c 65 63 74 3b 0a 20 20 69 6e 74  IdxSelect;.  int
2c10: 20 6e 52 65 61 64 3b 20 20 20 20 20 20 20 20 20   nRead;         
2c20: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2c30: 54 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20  Total number of 
2c40: 62 6c 6f 63 6b 73 20 72 65 61 64 20 2a 2f 0a 7d  blocks read */.}
2c50: 3b 0a 0a 73 74 72 75 63 74 20 46 74 73 35 44 6f  ;..struct Fts5Do
2c60: 63 6c 69 73 74 49 74 65 72 20 7b 0a 20 20 75 38  clistIter {.  u8
2c70: 20 2a 61 45 6f 66 3b 20 20 20 20 20 20 20 20 20   *aEof;         
2c80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2c90: 20 50 6f 69 6e 74 65 72 20 74 6f 20 31 20 62 79   Pointer to 1 by
2ca0: 74 65 20 70 61 73 74 20 65 6e 64 20 6f 66 20 64  te past end of d
2cb0: 6f 63 6c 69 73 74 20 2a 2f 0a 0a 20 20 2f 2a 20  oclist */..  /* 
2cc0: 4f 75 74 70 75 74 20 76 61 72 69 61 62 6c 65 73  Output variables
2cd0: 2e 20 61 50 6f 73 6c 69 73 74 3d 3d 30 20 61 74  . aPoslist==0 at
2ce0: 20 45 4f 46 20 2a 2f 0a 20 20 69 36 34 20 69 52   EOF */.  i64 iR
2cf0: 6f 77 69 64 3b 0a 20 20 75 38 20 2a 61 50 6f 73  owid;.  u8 *aPos
2d00: 6c 69 73 74 3b 0a 20 20 69 6e 74 20 6e 50 6f 73  list;.  int nPos
2d10: 6c 69 73 74 3b 0a 20 20 69 6e 74 20 6e 53 69 7a  list;.  int nSiz
2d20: 65 3b 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  e;.};../*.** The
2d30: 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
2d40: 20 22 73 74 72 75 63 74 75 72 65 22 20 72 65 63   "structure" rec
2d50: 6f 72 64 20 66 6f 72 20 65 61 63 68 20 69 6e 64  ord for each ind
2d60: 65 78 20 61 72 65 20 72 65 70 72 65 73 65 6e 74  ex are represent
2d70: 65 64 0a 2a 2a 20 75 73 69 6e 67 20 61 6e 20 46  ed.** using an F
2d80: 74 73 35 53 74 72 75 63 74 75 72 65 20 72 65 63  ts5Structure rec
2d90: 6f 72 64 20 69 6e 20 6d 65 6d 6f 72 79 2e 20 57  ord in memory. W
2da0: 68 69 63 68 20 75 73 65 73 20 69 6e 73 74 61 6e  hich uses instan
2db0: 63 65 73 20 6f 66 20 74 68 65 20 0a 2a 2a 20 6f  ces of the .** o
2dc0: 74 68 65 72 20 46 74 73 35 53 74 72 75 63 74 75  ther Fts5Structu
2dd0: 72 65 58 58 58 20 74 79 70 65 73 20 61 73 20 63  reXXX types as c
2de0: 6f 6d 70 6f 6e 65 6e 74 73 2e 0a 2a 2f 0a 73 74  omponents..*/.st
2df0: 72 75 63 74 20 46 74 73 35 53 74 72 75 63 74 75  ruct Fts5Structu
2e00: 72 65 53 65 67 6d 65 6e 74 20 7b 0a 20 20 69 6e  reSegment {.  in
2e10: 74 20 69 53 65 67 69 64 3b 20 20 20 20 20 20 20  t iSegid;       
2e20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2e30: 20 53 65 67 6d 65 6e 74 20 69 64 20 2a 2f 0a 20   Segment id */. 
2e40: 20 69 6e 74 20 70 67 6e 6f 46 69 72 73 74 3b 20   int pgnoFirst; 
2e50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e60: 20 2f 2a 20 46 69 72 73 74 20 6c 65 61 66 20 70   /* First leaf p
2e70: 61 67 65 20 6e 75 6d 62 65 72 20 69 6e 20 73 65  age number in se
2e80: 67 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 70  gment */.  int p
2e90: 67 6e 6f 4c 61 73 74 3b 20 20 20 20 20 20 20 20  gnoLast;        
2ea0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 61             /* La
2eb0: 73 74 20 6c 65 61 66 20 70 61 67 65 20 6e 75 6d  st leaf page num
2ec0: 62 65 72 20 69 6e 20 73 65 67 6d 65 6e 74 20 2a  ber in segment *
2ed0: 2f 0a 7d 3b 0a 73 74 72 75 63 74 20 46 74 73 35  /.};.struct Fts5
2ee0: 53 74 72 75 63 74 75 72 65 4c 65 76 65 6c 20 7b  StructureLevel {
2ef0: 0a 20 20 69 6e 74 20 6e 4d 65 72 67 65 3b 20 20  .  int nMerge;  
2f00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f10: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
2f20: 73 65 67 6d 65 6e 74 73 20 69 6e 20 69 6e 63 72  segments in incr
2f30: 2d 6d 65 72 67 65 20 2a 2f 0a 20 20 69 6e 74 20  -merge */.  int 
2f40: 6e 53 65 67 3b 20 20 20 20 20 20 20 20 20 20 20  nSeg;           
2f50: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
2f60: 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 73  otal number of s
2f70: 65 67 6d 65 6e 74 73 20 6f 6e 20 6c 65 76 65 6c  egments on level
2f80: 20 2a 2f 0a 20 20 46 74 73 35 53 74 72 75 63 74   */.  Fts5Struct
2f90: 75 72 65 53 65 67 6d 65 6e 74 20 2a 61 53 65 67  ureSegment *aSeg
2fa0: 3b 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f  ;     /* Array o
2fb0: 66 20 73 65 67 6d 65 6e 74 73 2e 20 61 53 65 67  f segments. aSeg
2fc0: 5b 30 5d 20 69 73 20 6f 6c 64 65 73 74 2e 20 2a  [0] is oldest. *
2fd0: 2f 0a 7d 3b 0a 73 74 72 75 63 74 20 46 74 73 35  /.};.struct Fts5
2fe0: 53 74 72 75 63 74 75 72 65 20 7b 0a 20 20 69 6e  Structure {.  in
2ff0: 74 20 6e 52 65 66 3b 20 20 20 20 20 20 20 20 20  t nRef;         
3000: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
3010: 20 4f 62 6a 65 63 74 20 72 65 66 65 72 65 6e 63   Object referenc
3020: 65 20 63 6f 75 6e 74 20 2a 2f 0a 20 20 75 36 34  e count */.  u64
3030: 20 6e 57 72 69 74 65 43 6f 75 6e 74 65 72 3b 20   nWriteCounter; 
3040: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3050: 54 6f 74 61 6c 20 6c 65 61 76 65 73 20 77 72 69  Total leaves wri
3060: 74 74 65 6e 20 74 6f 20 6c 65 76 65 6c 20 30 20  tten to level 0 
3070: 2a 2f 0a 20 20 69 6e 74 20 6e 53 65 67 6d 65 6e  */.  int nSegmen
3080: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
3090: 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 73 65       /* Total se
30a0: 67 6d 65 6e 74 73 20 69 6e 20 74 68 69 73 20 73  gments in this s
30b0: 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 69 6e  tructure */.  in
30c0: 74 20 6e 4c 65 76 65 6c 3b 20 20 20 20 20 20 20  t nLevel;       
30d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
30e0: 20 4e 75 6d 62 65 72 20 6f 66 20 6c 65 76 65 6c   Number of level
30f0: 73 20 69 6e 20 74 68 69 73 20 69 6e 64 65 78 20  s in this index 
3100: 2a 2f 0a 20 20 46 74 73 35 53 74 72 75 63 74 75  */.  Fts5Structu
3110: 72 65 4c 65 76 65 6c 20 61 4c 65 76 65 6c 5b 31  reLevel aLevel[1
3120: 5d 3b 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66  ];   /* Array of
3130: 20 6e 4c 65 76 65 6c 20 6c 65 76 65 6c 20 6f 62   nLevel level ob
3140: 6a 65 63 74 73 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a  jects */.};../*.
3150: 2a 2a 20 41 6e 20 6f 62 6a 65 63 74 20 6f 66 20  ** An object of 
3160: 74 79 70 65 20 46 74 73 35 53 65 67 57 72 69 74  type Fts5SegWrit
3170: 65 72 20 69 73 20 75 73 65 64 20 74 6f 20 77 72  er is used to wr
3180: 69 74 65 20 74 6f 20 73 65 67 6d 65 6e 74 73 2e  ite to segments.
3190: 0a 2a 2f 0a 73 74 72 75 63 74 20 46 74 73 35 50  .*/.struct Fts5P
31a0: 61 67 65 57 72 69 74 65 72 20 7b 0a 20 20 69 6e  ageWriter {.  in
31b0: 74 20 70 67 6e 6f 3b 20 20 20 20 20 20 20 20 20  t pgno;         
31c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
31d0: 20 50 61 67 65 20 6e 75 6d 62 65 72 20 66 6f 72   Page number for
31e0: 20 74 68 69 73 20 70 61 67 65 20 2a 2f 0a 20 20   this page */.  
31f0: 69 6e 74 20 69 50 72 65 76 50 67 69 64 78 3b 20  int iPrevPgidx; 
3200: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3210: 2f 2a 20 50 72 65 76 69 6f 75 73 20 76 61 6c 75  /* Previous valu
3220: 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 70  e written into p
3230: 67 69 64 78 20 2a 2f 0a 20 20 46 74 73 35 42 75  gidx */.  Fts5Bu
3240: 66 66 65 72 20 62 75 66 3b 20 20 20 20 20 20 20  ffer buf;       
3250: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 75 66            /* Buf
3260: 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 6c  fer containing l
3270: 65 61 66 20 64 61 74 61 20 2a 2f 0a 20 20 46 74  eaf data */.  Ft
3280: 73 35 42 75 66 66 65 72 20 70 67 69 64 78 3b 20  s5Buffer pgidx; 
3290: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
32a0: 20 42 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69   Buffer containi
32b0: 6e 67 20 70 61 67 65 2d 69 6e 64 65 78 20 2a 2f  ng page-index */
32c0: 0a 20 20 46 74 73 35 42 75 66 66 65 72 20 74 65  .  Fts5Buffer te
32d0: 72 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rm;             
32e0: 20 20 20 2f 2a 20 42 75 66 66 65 72 20 63 6f 6e     /* Buffer con
32f0: 74 61 69 6e 69 6e 67 20 70 72 65 76 69 6f 75 73  taining previous
3300: 20 74 65 72 6d 20 6f 6e 20 70 61 67 65 20 2a 2f   term on page */
3310: 0a 7d 3b 0a 73 74 72 75 63 74 20 46 74 73 35 44  .};.struct Fts5D
3320: 6c 69 64 78 57 72 69 74 65 72 20 7b 0a 20 20 69  lidxWriter {.  i
3330: 6e 74 20 70 67 6e 6f 3b 20 20 20 20 20 20 20 20  nt pgno;        
3340: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
3350: 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20 66 6f  * Page number fo
3360: 72 20 74 68 69 73 20 70 61 67 65 20 2a 2f 0a 20  r this page */. 
3370: 20 69 6e 74 20 62 50 72 65 76 56 61 6c 69 64 3b   int bPrevValid;
3380: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3390: 20 2f 2a 20 54 72 75 65 20 69 66 20 69 50 72 65   /* True if iPre
33a0: 76 20 69 73 20 76 61 6c 69 64 20 2a 2f 0a 20 20  v is valid */.  
33b0: 69 36 34 20 69 50 72 65 76 3b 20 20 20 20 20 20  i64 iPrev;      
33c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33d0: 2f 2a 20 50 72 65 76 69 6f 75 73 20 72 6f 77 69  /* Previous rowi
33e0: 64 20 76 61 6c 75 65 20 77 72 69 74 74 65 6e 20  d value written 
33f0: 74 6f 20 70 61 67 65 20 2a 2f 0a 20 20 46 74 73  to page */.  Fts
3400: 35 42 75 66 66 65 72 20 62 75 66 3b 20 20 20 20  5Buffer buf;    
3410: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3420: 42 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e  Buffer containin
3430: 67 20 70 61 67 65 20 64 61 74 61 20 2a 2f 0a 7d  g page data */.}
3440: 3b 0a 73 74 72 75 63 74 20 46 74 73 35 53 65 67  ;.struct Fts5Seg
3450: 57 72 69 74 65 72 20 7b 0a 20 20 69 6e 74 20 69  Writer {.  int i
3460: 53 65 67 69 64 3b 20 20 20 20 20 20 20 20 20 20  Segid;          
3470: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65             /* Se
3480: 67 69 64 20 74 6f 20 77 72 69 74 65 20 74 6f 20  gid to write to 
3490: 2a 2f 0a 20 20 46 74 73 35 50 61 67 65 57 72 69  */.  Fts5PageWri
34a0: 74 65 72 20 77 72 69 74 65 72 3b 20 20 20 20 20  ter writer;     
34b0: 20 20 20 20 20 2f 2a 20 50 61 67 65 57 72 69 74       /* PageWrit
34c0: 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69  er object */.  i
34d0: 36 34 20 69 50 72 65 76 52 6f 77 69 64 3b 20 20  64 iPrevRowid;  
34e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
34f0: 2a 20 50 72 65 76 69 6f 75 73 20 72 6f 77 69 64  * Previous rowid
3500: 20 77 72 69 74 74 65 6e 20 74 6f 20 63 75 72 72   written to curr
3510: 65 6e 74 20 6c 65 61 66 20 2a 2f 0a 20 20 75 38  ent leaf */.  u8
3520: 20 62 46 69 72 73 74 52 6f 77 69 64 49 6e 44 6f   bFirstRowidInDo
3530: 63 6c 69 73 74 3b 20 20 20 20 20 20 20 20 2f 2a  clist;        /*
3540: 20 54 72 75 65 20 69 66 20 6e 65 78 74 20 72 6f   True if next ro
3550: 77 69 64 20 69 73 20 66 69 72 73 74 20 69 6e 20  wid is first in 
3560: 64 6f 63 6c 69 73 74 20 2a 2f 0a 20 20 75 38 20  doclist */.  u8 
3570: 62 46 69 72 73 74 52 6f 77 69 64 49 6e 50 61 67  bFirstRowidInPag
3580: 65 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  e;           /* 
3590: 54 72 75 65 20 69 66 20 6e 65 78 74 20 72 6f 77  True if next row
35a0: 69 64 20 69 73 20 66 69 72 73 74 20 69 6e 20 70  id is first in p
35b0: 61 67 65 20 2a 2f 0a 20 20 2f 2a 20 54 4f 44 4f  age */.  /* TODO
35c0: 31 3a 20 43 61 6e 20 75 73 65 20 28 77 72 69 74  1: Can use (writ
35d0: 65 72 2e 70 67 69 64 78 2e 6e 3d 3d 30 29 20 69  er.pgidx.n==0) i
35e0: 6e 73 74 65 61 64 20 6f 66 20 62 46 69 72 73 74  nstead of bFirst
35f0: 54 65 72 6d 49 6e 50 61 67 65 20 2a 2f 0a 20 20  TermInPage */.  
3600: 75 38 20 62 46 69 72 73 74 54 65 72 6d 49 6e 50  u8 bFirstTermInP
3610: 61 67 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  age;            
3620: 2f 2a 20 54 72 75 65 20 69 66 20 6e 65 78 74 20  /* True if next 
3630: 74 65 72 6d 20 77 69 6c 6c 20 62 65 20 66 69 72  term will be fir
3640: 73 74 20 69 6e 20 6c 65 61 66 20 2a 2f 0a 20 20  st in leaf */.  
3650: 69 6e 74 20 6e 4c 65 61 66 57 72 69 74 74 65 6e  int nLeafWritten
3660: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
3670: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6c 65 61  /* Number of lea
3680: 66 20 70 61 67 65 73 20 77 72 69 74 74 65 6e 20  f pages written 
3690: 2a 2f 0a 20 20 69 6e 74 20 6e 45 6d 70 74 79 3b  */.  int nEmpty;
36a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36b0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
36c0: 66 20 63 6f 6e 74 69 67 75 6f 75 73 20 74 65 72  f contiguous ter
36d0: 6d 2d 6c 65 73 73 20 6e 6f 64 65 73 20 2a 2f 0a  m-less nodes */.
36e0: 0a 20 20 69 6e 74 20 6e 44 6c 69 64 78 3b 20 20  .  int nDlidx;  
36f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3700: 20 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 64 20     /* Allocated 
3710: 73 69 7a 65 20 6f 66 20 61 44 6c 69 64 78 5b 5d  size of aDlidx[]
3720: 20 61 72 72 61 79 20 2a 2f 0a 20 20 46 74 73 35   array */.  Fts5
3730: 44 6c 69 64 78 57 72 69 74 65 72 20 2a 61 44 6c  DlidxWriter *aDl
3740: 69 64 78 3b 20 20 20 20 20 20 20 20 2f 2a 20 41  idx;        /* A
3750: 72 72 61 79 20 6f 66 20 46 74 73 35 44 6c 69 64  rray of Fts5Dlid
3760: 78 57 72 69 74 65 72 20 6f 62 6a 65 63 74 73 20  xWriter objects 
3770: 2a 2f 0a 0a 20 20 2f 2a 20 56 61 6c 75 65 73 20  */..  /* Values 
3780: 74 6f 20 69 6e 73 65 72 74 20 69 6e 74 6f 20 74  to insert into t
3790: 68 65 20 25 5f 69 64 78 20 74 61 62 6c 65 20 2a  he %_idx table *
37a0: 2f 0a 20 20 46 74 73 35 42 75 66 66 65 72 20 62  /.  Fts5Buffer b
37b0: 74 74 65 72 6d 3b 20 20 20 20 20 20 20 20 20 20  tterm;          
37c0: 20 20 20 20 2f 2a 20 4e 65 78 74 20 74 65 72 6d      /* Next term
37d0: 20 74 6f 20 69 6e 73 65 72 74 20 69 6e 74 6f 20   to insert into 
37e0: 25 5f 69 64 78 20 74 61 62 6c 65 20 2a 2f 0a 20  %_idx table */. 
37f0: 20 69 6e 74 20 69 42 74 50 61 67 65 3b 20 20 20   int iBtPage;   
3800: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3810: 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20   /* Page number 
3820: 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f  corresponding to
3830: 20 62 74 74 65 72 6d 20 2a 2f 0a 7d 3b 0a 0a 2f   btterm */.};../
3840: 2a 0a 2a 2a 20 4f 62 6a 65 63 74 20 66 6f 72 20  *.** Object for 
3850: 69 74 65 72 61 74 69 6e 67 20 74 68 72 6f 75 67  iterating throug
3860: 68 20 74 68 65 20 6d 65 72 67 65 64 20 72 65 73  h the merged res
3870: 75 6c 74 73 20 6f 66 20 6f 6e 65 20 6f 72 20 6d  ults of one or m
3880: 6f 72 65 20 73 65 67 6d 65 6e 74 73 2c 0a 2a 2a  ore segments,.**
3890: 20 76 69 73 69 74 69 6e 67 20 65 61 63 68 20 74   visiting each t
38a0: 65 72 6d 2f 72 6f 77 69 64 20 70 61 69 72 20 69  erm/rowid pair i
38b0: 6e 20 74 68 65 20 6d 65 72 67 65 64 20 64 61 74  n the merged dat
38c0: 61 2e 0a 2a 2a 0a 2a 2a 20 6e 53 65 67 20 69 73  a..**.** nSeg is
38d0: 20 61 6c 77 61 79 73 20 61 20 70 6f 77 65 72 20   always a power 
38e0: 6f 66 20 74 77 6f 20 67 72 65 61 74 65 72 20 74  of two greater t
38f0: 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20  han or equal to 
3900: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a  the number of.**
3910: 20 73 65 67 6d 65 6e 74 73 20 74 68 61 74 20 74   segments that t
3920: 68 69 73 20 6f 62 6a 65 63 74 20 69 73 20 6d 65  his object is me
3930: 72 67 69 6e 67 20 64 61 74 61 20 66 72 6f 6d 2e  rging data from.
3940: 20 42 6f 74 68 20 74 68 65 20 61 53 65 67 5b 5d   Both the aSeg[]
3950: 20 61 6e 64 0a 2a 2a 20 61 46 69 72 73 74 5b 5d   and.** aFirst[]
3960: 20 61 72 72 61 79 73 20 61 72 65 20 73 69 7a 65   arrays are size
3970: 64 20 61 74 20 6e 53 65 67 20 65 6e 74 72 69 65  d at nSeg entrie
3980: 73 2e 20 54 68 65 20 61 53 65 67 5b 5d 20 61 72  s. The aSeg[] ar
3990: 72 61 79 20 69 73 20 70 61 64 64 65 64 0a 2a 2a  ray is padded.**
39a0: 20 77 69 74 68 20 7a 65 72 6f 65 64 20 6f 62 6a   with zeroed obj
39b0: 65 63 74 73 20 2d 20 74 68 65 73 65 20 61 72 65  ects - these are
39c0: 20 68 61 6e 64 6c 65 64 20 61 73 20 69 66 20 74   handled as if t
39d0: 68 65 79 20 77 65 72 65 20 69 74 65 72 61 74 6f  hey were iterato
39e0: 72 73 20 6f 70 65 6e 65 64 0a 2a 2a 20 6f 6e 20  rs opened.** on 
39f0: 65 6d 70 74 79 20 73 65 67 6d 65 6e 74 73 2e 0a  empty segments..
3a00: 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 73 75 6c 74  **.** The result
3a10: 73 20 6f 66 20 63 6f 6d 70 61 72 69 6e 67 20 73  s of comparing s
3a20: 65 67 6d 65 6e 74 73 20 61 53 65 67 5b 4e 5d 20  egments aSeg[N] 
3a30: 61 6e 64 20 61 53 65 67 5b 4e 2b 31 5d 2c 20 77  and aSeg[N+1], w
3a40: 68 65 72 65 20 4e 20 69 73 20 61 6e 0a 2a 2a 20  here N is an.** 
3a50: 65 76 65 6e 20 6e 75 6d 62 65 72 2c 20 69 73 20  even number, is 
3a60: 73 74 6f 72 65 64 20 69 6e 20 61 46 69 72 73 74  stored in aFirst
3a70: 5b 28 6e 53 65 67 2b 4e 29 2f 32 5d 2e 20 54 68  [(nSeg+N)/2]. Th
3a80: 65 20 22 72 65 73 75 6c 74 22 20 6f 66 20 74 68  e "result" of th
3a90: 65 20 0a 2a 2a 20 63 6f 6d 70 61 72 69 73 6f 6e  e .** comparison
3aa0: 20 69 6e 20 74 68 69 73 20 63 6f 6e 74 65 78 74   in this context
3ab0: 20 69 73 20 74 68 65 20 69 6e 64 65 78 20 6f 66   is the index of
3ac0: 20 74 68 65 20 69 74 65 72 61 74 6f 72 20 74 68   the iterator th
3ad0: 61 74 20 63 75 72 72 65 6e 74 6c 79 0a 2a 2a 20  at currently.** 
3ae0: 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 73 6d  points to the sm
3af0: 61 6c 6c 65 72 20 74 65 72 6d 2f 72 6f 77 69 64  aller term/rowid
3b00: 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 2e 20 49 74   combination. It
3b10: 65 72 61 74 6f 72 73 20 61 74 20 45 4f 46 20 61  erators at EOF a
3b20: 72 65 0a 2a 2a 20 63 6f 6e 73 69 64 65 72 65 64  re.** considered
3b30: 20 74 6f 20 62 65 20 67 72 65 61 74 65 72 20 74   to be greater t
3b40: 68 61 6e 20 61 6c 6c 20 6f 74 68 65 72 20 69 74  han all other it
3b50: 65 72 61 74 6f 72 73 2e 0a 2a 2a 0a 2a 2a 20 61  erators..**.** a
3b60: 46 69 72 73 74 5b 31 5d 20 63 6f 6e 74 61 69 6e  First[1] contain
3b70: 73 20 74 68 65 20 69 6e 64 65 78 20 69 6e 20 61  s the index in a
3b80: 53 65 67 5b 5d 20 6f 66 20 74 68 65 20 69 74 65  Seg[] of the ite
3b90: 72 61 74 6f 72 20 74 68 61 74 20 70 6f 69 6e 74  rator that point
3ba0: 73 20 74 6f 0a 2a 2a 20 74 68 65 20 73 6d 61 6c  s to.** the smal
3bb0: 6c 65 73 74 20 6b 65 79 20 6f 76 65 72 61 6c 6c  lest key overall
3bc0: 2e 20 61 46 69 72 73 74 5b 30 5d 20 69 73 20 75  . aFirst[0] is u
3bd0: 6e 75 73 65 64 2e 20 0a 2a 2f 0a 0a 74 79 70 65  nused. .*/..type
3be0: 64 65 66 20 73 74 72 75 63 74 20 46 74 73 35 43  def struct Fts5C
3bf0: 52 65 73 75 6c 74 20 46 74 73 35 43 52 65 73 75  Result Fts5CResu
3c00: 6c 74 3b 0a 73 74 72 75 63 74 20 46 74 73 35 43  lt;.struct Fts5C
3c10: 52 65 73 75 6c 74 20 7b 0a 20 20 75 31 36 20 69  Result {.  u16 i
3c20: 46 69 72 73 74 3b 20 20 20 20 20 20 20 20 20 20  First;          
3c30: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 61 53             /* aS
3c40: 65 67 5b 5d 20 69 6e 64 65 78 20 6f 66 20 66 69  eg[] index of fi
3c50: 72 73 74 65 73 74 20 69 74 65 72 61 74 6f 72 20  rstest iterator 
3c60: 2a 2f 0a 20 20 75 38 20 62 54 65 72 6d 45 71 3b  */.  u8 bTermEq;
3c70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3c80: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
3c90: 74 68 65 20 74 65 72 6d 73 20 61 72 65 20 65 71  the terms are eq
3ca0: 75 61 6c 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  ual */.};../*.**
3cb0: 20 4f 62 6a 65 63 74 20 66 6f 72 20 69 74 65 72   Object for iter
3cc0: 61 74 69 6e 67 20 74 68 72 6f 75 67 68 20 61 20  ating through a 
3cd0: 73 69 6e 67 6c 65 20 73 65 67 6d 65 6e 74 2c 20  single segment, 
3ce0: 76 69 73 69 74 69 6e 67 20 65 61 63 68 20 74 65  visiting each te
3cf0: 72 6d 2f 72 6f 77 69 64 0a 2a 2a 20 70 61 69 72  rm/rowid.** pair
3d00: 20 69 6e 20 74 68 65 20 73 65 67 6d 65 6e 74 2e   in the segment.
3d10: 0a 2a 2a 0a 2a 2a 20 70 53 65 67 3a 0a 2a 2a 20  .**.** pSeg:.** 
3d20: 20 20 54 68 65 20 73 65 67 6d 65 6e 74 20 74 6f    The segment to
3d30: 20 69 74 65 72 61 74 65 20 74 68 72 6f 75 67 68   iterate through
3d40: 2e 0a 2a 2a 0a 2a 2a 20 69 4c 65 61 66 50 67 6e  ..**.** iLeafPgn
3d50: 6f 3a 0a 2a 2a 20 20 20 43 75 72 72 65 6e 74 20  o:.**   Current 
3d60: 6c 65 61 66 20 70 61 67 65 20 6e 75 6d 62 65 72  leaf page number
3d70: 20 77 69 74 68 69 6e 20 73 65 67 6d 65 6e 74 2e   within segment.
3d80: 0a 2a 2a 0a 2a 2a 20 69 4c 65 61 66 4f 66 66 73  .**.** iLeafOffs
3d90: 65 74 3a 0a 2a 2a 20 20 20 42 79 74 65 20 6f 66  et:.**   Byte of
3da0: 66 73 65 74 20 77 69 74 68 69 6e 20 74 68 65 20  fset within the 
3db0: 63 75 72 72 65 6e 74 20 6c 65 61 66 20 74 68 61  current leaf tha
3dc0: 74 20 69 73 20 74 68 65 20 66 69 72 73 74 20 62  t is the first b
3dd0: 79 74 65 20 6f 66 20 74 68 65 20 0a 2a 2a 20 20  yte of the .**  
3de0: 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74 20 64   position list d
3df0: 61 74 61 20 28 6f 6e 65 20 62 79 74 65 20 70 61  ata (one byte pa
3e00: 73 73 65 64 20 74 68 65 20 70 6f 73 69 74 69 6f  ssed the positio
3e10: 6e 2d 6c 69 73 74 20 73 69 7a 65 20 66 69 65 6c  n-list size fiel
3e20: 64 29 2e 0a 2a 2a 20 20 20 72 6f 77 69 64 20 66  d)..**   rowid f
3e30: 69 65 6c 64 20 6f 66 20 74 68 65 20 63 75 72 72  ield of the curr
3e40: 65 6e 74 20 65 6e 74 72 79 2e 20 55 73 75 61 6c  ent entry. Usual
3e50: 6c 79 20 74 68 69 73 20 69 73 20 74 68 65 20 73  ly this is the s
3e60: 69 7a 65 20 66 69 65 6c 64 20 6f 66 20 74 68 65  ize field of the
3e70: 0a 2a 2a 20 20 20 70 6f 73 69 74 69 6f 6e 20 6c  .**   position l
3e80: 69 73 74 20 64 61 74 61 2e 20 54 68 65 20 65 78  ist data. The ex
3e90: 63 65 70 74 69 6f 6e 20 69 73 20 69 66 20 74 68  ception is if th
3ea0: 65 20 72 6f 77 69 64 20 66 6f 72 20 74 68 65 20  e rowid for the 
3eb0: 63 75 72 72 65 6e 74 20 65 6e 74 72 79 20 0a 2a  current entry .*
3ec0: 2a 20 20 20 69 73 20 74 68 65 20 6c 61 73 74 20  *   is the last 
3ed0: 74 68 69 6e 67 20 6f 6e 20 74 68 65 20 6c 65 61  thing on the lea
3ee0: 66 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 70 4c  f page..**.** pL
3ef0: 65 61 66 3a 0a 2a 2a 20 20 20 42 75 66 66 65 72  eaf:.**   Buffer
3f00: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 63 75 72 72   containing curr
3f10: 65 6e 74 20 6c 65 61 66 20 70 61 67 65 20 64 61  ent leaf page da
3f20: 74 61 2e 20 53 65 74 20 74 6f 20 4e 55 4c 4c 20  ta. Set to NULL 
3f30: 61 74 20 45 4f 46 2e 0a 2a 2a 0a 2a 2a 20 69 54  at EOF..**.** iT
3f40: 65 72 6d 4c 65 61 66 50 67 6e 6f 2c 20 69 54 65  ermLeafPgno, iTe
3f50: 72 6d 4c 65 61 66 4f 66 66 73 65 74 3a 0a 2a 2a  rmLeafOffset:.**
3f60: 20 20 20 4c 65 61 66 20 70 61 67 65 20 6e 75 6d     Leaf page num
3f70: 62 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  ber containing t
3f80: 68 65 20 6c 61 73 74 20 74 65 72 6d 20 72 65 61  he last term rea
3f90: 64 20 66 72 6f 6d 20 74 68 65 20 73 65 67 6d 65  d from the segme
3fa0: 6e 74 2e 20 41 6e 64 0a 2a 2a 20 20 20 74 68 65  nt. And.**   the
3fb0: 20 6f 66 66 73 65 74 20 69 6d 6d 65 64 69 61 74   offset immediat
3fc0: 65 6c 79 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68  ely following th
3fd0: 65 20 74 65 72 6d 20 64 61 74 61 2e 0a 2a 2a 0a  e term data..**.
3fe0: 2a 2a 20 66 6c 61 67 73 3a 0a 2a 2a 20 20 20 4d  ** flags:.**   M
3ff0: 61 73 6b 20 6f 66 20 46 54 53 35 5f 53 45 47 49  ask of FTS5_SEGI
4000: 54 45 52 5f 58 58 58 20 76 61 6c 75 65 73 2e 20  TER_XXX values. 
4010: 49 6e 74 65 72 70 72 65 74 65 64 20 61 73 20 66  Interpreted as f
4020: 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  ollows:.**.**   
4030: 46 54 53 35 5f 53 45 47 49 54 45 52 5f 4f 4e 45  FTS5_SEGITER_ONE
4040: 54 45 52 4d 3a 0a 2a 2a 20 20 20 20 20 49 66 20  TERM:.**     If 
4050: 73 65 74 2c 20 73 65 74 20 74 68 65 20 69 74 65  set, set the ite
4060: 72 61 74 6f 72 20 74 6f 20 70 6f 69 6e 74 20 74  rator to point t
4070: 6f 20 45 4f 46 20 61 66 74 65 72 20 74 68 65 20  o EOF after the 
4080: 63 75 72 72 65 6e 74 20 64 6f 63 6c 69 73 74 20  current doclist 
4090: 0a 2a 2a 20 20 20 20 20 68 61 73 20 62 65 65 6e  .**     has been
40a0: 20 65 78 68 61 75 73 74 65 64 2e 20 44 6f 20 6e   exhausted. Do n
40b0: 6f 74 20 70 72 6f 63 65 65 64 20 74 6f 20 74 68  ot proceed to th
40c0: 65 20 6e 65 78 74 20 74 65 72 6d 20 69 6e 20 74  e next term in t
40d0: 68 65 20 73 65 67 6d 65 6e 74 2e 0a 2a 2a 0a 2a  he segment..**.*
40e0: 2a 20 20 20 46 54 53 35 5f 53 45 47 49 54 45 52  *   FTS5_SEGITER
40f0: 5f 52 45 56 45 52 53 45 3a 0a 2a 2a 20 20 20 20  _REVERSE:.**    
4100: 20 54 68 69 73 20 66 6c 61 67 20 69 73 20 6f 6e   This flag is on
4110: 6c 79 20 65 76 65 72 20 73 65 74 20 69 66 20 46  ly ever set if F
4120: 54 53 35 5f 53 45 47 49 54 45 52 5f 4f 4e 45 54  TS5_SEGITER_ONET
4130: 45 52 4d 20 69 73 20 61 6c 73 6f 20 73 65 74 2e  ERM is also set.
4140: 20 49 66 0a 2a 2a 20 20 20 20 20 69 74 20 69 73   If.**     it is
4150: 20 73 65 74 2c 20 69 74 65 72 61 74 65 20 74 68   set, iterate th
4160: 72 6f 75 67 68 20 72 6f 77 69 64 20 69 6e 20 64  rough rowid in d
4170: 65 73 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 20  escending order 
4180: 69 6e 73 74 65 61 64 20 6f 66 20 74 68 65 0a 2a  instead of the.*
4190: 2a 20 20 20 20 20 64 65 66 61 75 6c 74 20 61 73  *     default as
41a0: 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 2e 0a 2a  cending order..*
41b0: 2a 0a 2a 2a 20 69 52 6f 77 69 64 4f 66 66 73 65  *.** iRowidOffse
41c0: 74 2f 6e 52 6f 77 69 64 4f 66 66 73 65 74 2f 61  t/nRowidOffset/a
41d0: 52 6f 77 69 64 4f 66 66 73 65 74 3a 0a 2a 2a 20  RowidOffset:.** 
41e0: 20 20 20 20 54 68 65 73 65 20 61 72 65 20 75 73      These are us
41f0: 65 64 20 69 66 20 74 68 65 20 46 54 53 35 5f 53  ed if the FTS5_S
4200: 45 47 49 54 45 52 5f 52 45 56 45 52 53 45 20 66  EGITER_REVERSE f
4210: 6c 61 67 20 69 73 20 73 65 74 2e 0a 2a 2a 0a 2a  lag is set..**.*
4220: 2a 20 20 20 20 20 46 6f 72 20 65 61 63 68 20 72  *     For each r
4230: 6f 77 69 64 20 6f 6e 20 74 68 65 20 70 61 67 65  owid on the page
4240: 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74   corresponding t
4250: 6f 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 65  o the current te
4260: 72 6d 2c 20 74 68 65 0a 2a 2a 20 20 20 20 20 63  rm, the.**     c
4270: 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 61 52 6f  orresponding aRo
4280: 77 69 64 4f 66 66 73 65 74 5b 5d 20 65 6e 74 72  widOffset[] entr
4290: 79 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20  y is set to the 
42a0: 62 79 74 65 20 6f 66 66 73 65 74 20 6f 66 20 74  byte offset of t
42b0: 68 65 0a 2a 2a 20 20 20 20 20 73 74 61 72 74 20  he.**     start 
42c0: 6f 66 20 74 68 65 20 22 70 6f 73 69 74 69 6f 6e  of the "position
42d0: 2d 6c 69 73 74 2d 73 69 7a 65 22 20 66 69 65 6c  -list-size" fiel
42e0: 64 20 77 69 74 68 69 6e 20 74 68 65 20 70 61 67  d within the pag
42f0: 65 2e 0a 2a 2a 0a 2a 2a 20 69 54 65 72 6d 49 64  e..**.** iTermId
4300: 78 3a 0a 2a 2a 20 20 20 20 20 49 6e 64 65 78 20  x:.**     Index 
4310: 6f 66 20 63 75 72 72 65 6e 74 20 74 65 72 6d 20  of current term 
4320: 6f 6e 20 69 54 65 72 6d 4c 65 61 66 50 67 6e 6f  on iTermLeafPgno
4330: 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 46 74 73 35  ..*/.struct Fts5
4340: 53 65 67 49 74 65 72 20 7b 0a 20 20 46 74 73 35  SegIter {.  Fts5
4350: 53 74 72 75 63 74 75 72 65 53 65 67 6d 65 6e 74  StructureSegment
4360: 20 2a 70 53 65 67 3b 20 20 20 20 20 2f 2a 20 53   *pSeg;     /* S
4370: 65 67 6d 65 6e 74 20 74 6f 20 69 74 65 72 61 74  egment to iterat
4380: 65 20 74 68 72 6f 75 67 68 20 2a 2f 0a 20 20 69  e through */.  i
4390: 6e 74 20 66 6c 61 67 73 3b 20 20 20 20 20 20 20  nt flags;       
43a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
43b0: 2a 20 4d 61 73 6b 20 6f 66 20 63 6f 6e 66 69 67  * Mask of config
43c0: 75 72 61 74 69 6f 6e 20 66 6c 61 67 73 20 2a 2f  uration flags */
43d0: 0a 20 20 69 6e 74 20 69 4c 65 61 66 50 67 6e 6f  .  int iLeafPgno
43e0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
43f0: 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 6c 65     /* Current le
4400: 61 66 20 70 61 67 65 20 6e 75 6d 62 65 72 20 2a  af page number *
4410: 2f 0a 20 20 46 74 73 35 44 61 74 61 20 2a 70 4c  /.  Fts5Data *pL
4420: 65 61 66 3b 20 20 20 20 20 20 20 20 20 20 20 20  eaf;            
4430: 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 6c      /* Current l
4440: 65 61 66 20 64 61 74 61 20 2a 2f 0a 20 20 46 74  eaf data */.  Ft
4450: 73 35 44 61 74 61 20 2a 70 4e 65 78 74 4c 65 61  s5Data *pNextLea
4460: 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  f;            /*
4470: 20 4c 65 61 66 20 70 61 67 65 20 28 69 4c 65 61   Leaf page (iLea
4480: 66 50 67 6e 6f 2b 31 29 20 2a 2f 0a 20 20 69 6e  fPgno+1) */.  in
4490: 74 20 69 4c 65 61 66 4f 66 66 73 65 74 3b 20 20  t iLeafOffset;  
44a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
44b0: 20 42 79 74 65 20 6f 66 66 73 65 74 20 77 69 74   Byte offset wit
44c0: 68 69 6e 20 63 75 72 72 65 6e 74 20 6c 65 61 66  hin current leaf
44d0: 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68 65 20 70 61   */..  /* The pa
44e0: 67 65 20 61 6e 64 20 6f 66 66 73 65 74 20 66 72  ge and offset fr
44f0: 6f 6d 20 77 68 69 63 68 20 74 68 65 20 63 75 72  om which the cur
4500: 72 65 6e 74 20 74 65 72 6d 20 77 61 73 20 72 65  rent term was re
4510: 61 64 2e 20 54 68 65 20 6f 66 66 73 65 74 20 0a  ad. The offset .
4520: 20 20 2a 2a 20 69 73 20 74 68 65 20 6f 66 66 73    ** is the offs
4530: 65 74 20 6f 66 20 74 68 65 20 66 69 72 73 74 20  et of the first 
4540: 72 6f 77 69 64 20 69 6e 20 74 68 65 20 63 75 72  rowid in the cur
4550: 72 65 6e 74 20 64 6f 63 6c 69 73 74 2e 20 20 2a  rent doclist.  *
4560: 2f 0a 20 20 69 6e 74 20 69 54 65 72 6d 4c 65 61  /.  int iTermLea
4570: 66 50 67 6e 6f 3b 0a 20 20 69 6e 74 20 69 54 65  fPgno;.  int iTe
4580: 72 6d 4c 65 61 66 4f 66 66 73 65 74 3b 0a 0a 20  rmLeafOffset;.. 
4590: 20 69 6e 74 20 69 50 67 69 64 78 4f 66 66 3b 20   int iPgidxOff; 
45a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
45b0: 20 2f 2a 20 4e 65 78 74 20 6f 66 66 73 65 74 20   /* Next offset 
45c0: 69 6e 20 70 67 69 64 78 20 2a 2f 0a 20 20 69 6e  in pgidx */.  in
45d0: 74 20 69 45 6e 64 6f 66 44 6f 63 6c 69 73 74 3b  t iEndofDoclist;
45e0: 0a 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f  ..  /* The follo
45f0: 77 69 6e 67 20 61 72 65 20 6f 6e 6c 79 20 75 73  wing are only us
4600: 65 64 20 69 66 20 74 68 65 20 46 54 53 35 5f 53  ed if the FTS5_S
4610: 45 47 49 54 45 52 5f 52 45 56 45 52 53 45 20 66  EGITER_REVERSE f
4620: 6c 61 67 20 69 73 20 73 65 74 2e 20 2a 2f 0a 20  lag is set. */. 
4630: 20 69 6e 74 20 69 52 6f 77 69 64 4f 66 66 73 65   int iRowidOffse
4640: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
4650: 20 2f 2a 20 43 75 72 72 65 6e 74 20 65 6e 74 72   /* Current entr
4660: 79 20 69 6e 20 61 52 6f 77 69 64 4f 66 66 73 65  y in aRowidOffse
4670: 74 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 6f  t[] */.  int nRo
4680: 77 69 64 4f 66 66 73 65 74 3b 20 20 20 20 20 20  widOffset;      
4690: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c 6f           /* Allo
46a0: 63 61 74 65 64 20 73 69 7a 65 20 6f 66 20 61 52  cated size of aR
46b0: 6f 77 69 64 4f 66 66 73 65 74 5b 5d 20 61 72 72  owidOffset[] arr
46c0: 61 79 20 2a 2f 0a 20 20 69 6e 74 20 2a 61 52 6f  ay */.  int *aRo
46d0: 77 69 64 4f 66 66 73 65 74 3b 20 20 20 20 20 20  widOffset;      
46e0: 20 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79          /* Array
46f0: 20 6f 66 20 6f 66 66 73 65 74 20 74 6f 20 72 6f   of offset to ro
4700: 77 69 64 20 66 69 65 6c 64 73 20 2a 2f 0a 0a 20  wid fields */.. 
4710: 20 46 74 73 35 44 6c 69 64 78 49 74 65 72 20 2a   Fts5DlidxIter *
4720: 70 44 6c 69 64 78 3b 20 20 20 20 20 20 20 20 20  pDlidx;         
4730: 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73 20   /* If there is 
4740: 61 20 64 6f 63 6c 69 73 74 2d 69 6e 64 65 78 20  a doclist-index 
4750: 2a 2f 0a 0a 20 20 2f 2a 20 56 61 72 69 61 62 6c  */..  /* Variabl
4760: 65 73 20 70 6f 70 75 6c 61 74 65 64 20 62 61 73  es populated bas
4770: 65 64 20 6f 6e 20 63 75 72 72 65 6e 74 20 65 6e  ed on current en
4780: 74 72 79 2e 20 2a 2f 0a 20 20 46 74 73 35 42 75  try. */.  Fts5Bu
4790: 66 66 65 72 20 74 65 72 6d 3b 20 20 20 20 20 20  ffer term;      
47a0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72            /* Cur
47b0: 72 65 6e 74 20 74 65 72 6d 20 2a 2f 0a 20 20 69  rent term */.  i
47c0: 36 34 20 69 52 6f 77 69 64 3b 20 20 20 20 20 20  64 iRowid;      
47d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
47e0: 2a 20 43 75 72 72 65 6e 74 20 72 6f 77 69 64 20  * Current rowid 
47f0: 2a 2f 0a 20 20 69 6e 74 20 6e 50 6f 73 3b 20 20  */.  int nPos;  
4800: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4810: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
4820: 66 20 62 79 74 65 73 20 69 6e 20 63 75 72 72 65  f bytes in curre
4830: 6e 74 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74  nt position list
4840: 20 2a 2f 0a 20 20 69 6e 74 20 62 44 65 6c 3b 20   */.  int bDel; 
4850: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4860: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
4870: 20 74 68 65 20 64 65 6c 65 74 65 20 66 6c 61 67   the delete flag
4880: 20 69 73 20 73 65 74 20 2a 2f 0a 7d 3b 0a 0a 2f   is set */.};../
4890: 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20 69 73  *.** Argument is
48a0: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e   a pointer to an
48b0: 20 46 74 73 35 44 61 74 61 20 73 74 72 75 63 74   Fts5Data struct
48c0: 75 72 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e  ure that contain
48d0: 73 20 61 20 0a 2a 2a 20 6c 65 61 66 20 70 61 67  s a .** leaf pag
48e0: 65 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 41 53  e..*/.#define AS
48f0: 53 45 52 54 5f 53 5a 4c 45 41 46 5f 4f 4b 28 78  SERT_SZLEAF_OK(x
4900: 29 20 61 73 73 65 72 74 28 20 5c 0a 20 20 20 20  ) assert( \.    
4910: 28 78 29 2d 3e 73 7a 4c 65 61 66 3d 3d 28 78 29  (x)->szLeaf==(x)
4920: 2d 3e 6e 6e 20 7c 7c 20 28 78 29 2d 3e 73 7a 4c  ->nn || (x)->szL
4930: 65 61 66 3d 3d 66 74 73 35 47 65 74 55 31 36 28  eaf==fts5GetU16(
4940: 26 28 78 29 2d 3e 70 5b 32 5d 29 20 5c 0a 29 0a  &(x)->p[2]) \.).
4950: 0a 23 64 65 66 69 6e 65 20 46 54 53 35 5f 53 45  .#define FTS5_SE
4960: 47 49 54 45 52 5f 4f 4e 45 54 45 52 4d 20 30 78  GITER_ONETERM 0x
4970: 30 31 0a 23 64 65 66 69 6e 65 20 46 54 53 35 5f  01.#define FTS5_
4980: 53 45 47 49 54 45 52 5f 52 45 56 45 52 53 45 20  SEGITER_REVERSE 
4990: 30 78 30 32 0a 0a 0a 2f 2a 20 0a 2a 2a 20 41 72  0x02.../* .** Ar
49a0: 67 75 6d 65 6e 74 20 69 73 20 61 20 70 6f 69 6e  gument is a poin
49b0: 74 65 72 20 74 6f 20 61 6e 20 46 74 73 35 44 61  ter to an Fts5Da
49c0: 74 61 20 73 74 72 75 63 74 75 72 65 20 74 68 61  ta structure tha
49d0: 74 20 63 6f 6e 74 61 69 6e 73 20 61 20 6c 65 61  t contains a lea
49e0: 66 0a 2a 2a 20 70 61 67 65 2e 20 54 68 69 73 20  f.** page. This 
49f0: 6d 61 63 72 6f 20 65 76 61 6c 75 61 74 65 73 20  macro evaluates 
4a00: 74 6f 20 74 72 75 65 20 69 66 20 74 68 65 20 6c  to true if the l
4a10: 65 61 66 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20  eaf contains no 
4a20: 74 65 72 6d 73 2c 20 6f 72 0a 2a 2a 20 66 61 6c  terms, or.** fal
4a30: 73 65 20 69 66 20 69 74 20 63 6f 6e 74 61 69 6e  se if it contain
4a40: 73 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 74  s at least one t
4a50: 65 72 6d 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  erm..*/.#define 
4a60: 66 74 73 35 4c 65 61 66 49 73 54 65 72 6d 6c 65  fts5LeafIsTermle
4a70: 73 73 28 78 29 20 28 28 78 29 2d 3e 73 7a 4c 65  ss(x) ((x)->szLe
4a80: 61 66 20 3e 3d 20 28 78 29 2d 3e 6e 6e 29 0a 0a  af >= (x)->nn)..
4a90: 23 64 65 66 69 6e 65 20 66 74 73 35 4c 65 61 66  #define fts5Leaf
4aa0: 54 65 72 6d 4f 66 66 28 78 2c 20 69 29 20 28 66  TermOff(x, i) (f
4ab0: 74 73 35 47 65 74 55 31 36 28 26 28 78 29 2d 3e  ts5GetU16(&(x)->
4ac0: 70 5b 28 78 29 2d 3e 73 7a 4c 65 61 66 20 2b 20  p[(x)->szLeaf + 
4ad0: 28 69 29 2a 32 5d 29 29 0a 0a 23 64 65 66 69 6e  (i)*2]))..#defin
4ae0: 65 20 66 74 73 35 4c 65 61 66 46 69 72 73 74 52  e fts5LeafFirstR
4af0: 6f 77 69 64 4f 66 66 28 78 29 20 28 66 74 73 35  owidOff(x) (fts5
4b00: 47 65 74 55 31 36 28 28 78 29 2d 3e 70 29 29 0a  GetU16((x)->p)).
4b10: 0a 2f 2a 0a 2a 2a 20 70 6f 73 6c 69 73 74 3a 0a  ./*.** poslist:.
4b20: 2a 2a 20 20 20 55 73 65 64 20 62 79 20 73 71 6c  **   Used by sql
4b30: 69 74 65 33 46 74 73 35 49 74 65 72 50 6f 73 6c  ite3Fts5IterPosl
4b40: 69 73 74 28 29 20 77 68 65 6e 20 74 68 65 20 70  ist() when the p
4b50: 6f 73 6c 69 73 74 20 6e 65 65 64 73 20 74 6f 20  oslist needs to 
4b60: 62 65 20 62 75 66 66 65 72 65 64 2e 0a 2a 2a 20  be buffered..** 
4b70: 20 20 54 68 65 72 65 20 69 73 20 6e 6f 20 77 61    There is no wa
4b80: 79 20 74 6f 20 74 65 6c 6c 20 69 66 20 74 68 69  y to tell if thi
4b90: 73 20 69 73 20 70 6f 70 75 6c 61 74 65 64 20 6f  s is populated o
4ba0: 72 20 6e 6f 74 2e 0a 2a 2f 0a 73 74 72 75 63 74  r not..*/.struct
4bb0: 20 46 74 73 35 49 6e 64 65 78 49 74 65 72 20 7b   Fts5IndexIter {
4bc0: 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 49  .  Fts5Index *pI
4bd0: 6e 64 65 78 3b 20 20 20 20 20 20 20 20 20 20 20  ndex;           
4be0: 20 20 20 2f 2a 20 49 6e 64 65 78 20 74 68 61 74     /* Index that
4bf0: 20 6f 77 6e 73 20 74 68 69 73 20 69 74 65 72 61   owns this itera
4c00: 74 6f 72 20 2a 2f 0a 20 20 46 74 73 35 53 74 72  tor */.  Fts5Str
4c10: 75 63 74 75 72 65 20 2a 70 53 74 72 75 63 74 3b  ucture *pStruct;
4c20: 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61           /* Data
4c30: 62 61 73 65 20 73 74 72 75 63 74 75 72 65 20 66  base structure f
4c40: 6f 72 20 74 68 69 73 20 69 74 65 72 61 74 6f 72  or this iterator
4c50: 20 2a 2f 0a 20 20 46 74 73 35 42 75 66 66 65 72   */.  Fts5Buffer
4c60: 20 70 6f 73 6c 69 73 74 3b 20 20 20 20 20 20 20   poslist;       
4c70: 20 20 20 20 20 20 2f 2a 20 42 75 66 66 65 72 20        /* Buffer 
4c80: 63 6f 6e 74 61 69 6e 69 6e 67 20 63 75 72 72 65  containing curre
4c90: 6e 74 20 70 6f 73 6c 69 73 74 20 2a 2f 0a 0a 20  nt poslist */.. 
4ca0: 20 69 6e 74 20 6e 53 65 67 3b 20 20 20 20 20 20   int nSeg;      
4cb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4cc0: 20 2f 2a 20 53 69 7a 65 20 6f 66 20 61 53 65 67   /* Size of aSeg
4cd0: 5b 5d 20 61 72 72 61 79 20 2a 2f 0a 20 20 69 6e  [] array */.  in
4ce0: 74 20 62 52 65 76 3b 20 20 20 20 20 20 20 20 20  t bRev;         
4cf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
4d00: 20 54 72 75 65 20 74 6f 20 69 74 65 72 61 74 65   True to iterate
4d10: 20 69 6e 20 72 65 76 65 72 73 65 20 6f 72 64 65   in reverse orde
4d20: 72 20 2a 2f 0a 20 20 75 38 20 62 53 6b 69 70 45  r */.  u8 bSkipE
4d30: 6d 70 74 79 3b 20 20 20 20 20 20 20 20 20 20 20  mpty;           
4d40: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74         /* True t
4d50: 6f 20 73 6b 69 70 20 64 65 6c 65 74 65 64 20 65  o skip deleted e
4d60: 6e 74 72 69 65 73 20 2a 2f 0a 20 20 75 38 20 62  ntries */.  u8 b
4d70: 45 6f 66 3b 20 20 20 20 20 20 20 20 20 20 20 20  Eof;            
4d80: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
4d90: 72 75 65 20 61 74 20 45 4f 46 20 2a 2f 0a 20 20  rue at EOF */.  
4da0: 75 38 20 62 46 69 6c 74 65 72 65 64 3b 20 20 20  u8 bFiltered;   
4db0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4dc0: 2f 2a 20 54 72 75 65 20 69 66 20 63 6f 6c 75 6d  /* True if colum
4dd0: 6e 2d 66 69 6c 74 65 72 20 61 6c 72 65 61 64 79  n-filter already
4de0: 20 61 70 70 6c 69 65 64 20 2a 2f 0a 0a 20 20 69   applied */..  i
4df0: 36 34 20 69 53 77 69 74 63 68 52 6f 77 69 64 3b  64 iSwitchRowid;
4e00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
4e10: 2a 20 46 69 72 73 74 65 73 74 20 72 6f 77 69 64  * Firstest rowid
4e20: 20 6f 66 20 6f 74 68 65 72 20 74 68 61 6e 20 61   of other than a
4e30: 46 69 72 73 74 5b 31 5d 20 2a 2f 0a 20 20 46 74  First[1] */.  Ft
4e40: 73 35 43 52 65 73 75 6c 74 20 2a 61 46 69 72 73  s5CResult *aFirs
4e50: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  t;            /*
4e60: 20 43 75 72 72 65 6e 74 20 6d 65 72 67 65 20 73   Current merge s
4e70: 74 61 74 65 20 28 73 65 65 20 61 62 6f 76 65 29  tate (see above)
4e80: 20 2a 2f 0a 20 20 46 74 73 35 53 65 67 49 74 65   */.  Fts5SegIte
4e90: 72 20 61 53 65 67 5b 31 5d 3b 20 20 20 20 20 20  r aSeg[1];      
4ea0: 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f        /* Array o
4eb0: 66 20 73 65 67 6d 65 6e 74 20 69 74 65 72 61 74  f segment iterat
4ec0: 6f 72 73 20 2a 2f 0a 7d 3b 0a 0a 0a 2f 2a 0a 2a  ors */.};.../*.*
4ed0: 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66  * An instance of
4ee0: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74   the following t
4ef0: 79 70 65 20 69 73 20 75 73 65 64 20 74 6f 20 69  ype is used to i
4f00: 74 65 72 61 74 65 20 74 68 72 6f 75 67 68 20 74  terate through t
4f10: 68 65 20 63 6f 6e 74 65 6e 74 73 0a 2a 2a 20 6f  he contents.** o
4f20: 66 20 61 20 64 6f 63 6c 69 73 74 2d 69 6e 64 65  f a doclist-inde
4f30: 78 20 72 65 63 6f 72 64 2e 0a 2a 2a 0a 2a 2a 20  x record..**.** 
4f40: 70 44 61 74 61 3a 0a 2a 2a 20 20 20 52 65 63 6f  pData:.**   Reco
4f50: 72 64 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  rd containing th
4f60: 65 20 64 6f 63 6c 69 73 74 2d 69 6e 64 65 78 20  e doclist-index 
4f70: 64 61 74 61 2e 0a 2a 2a 0a 2a 2a 20 62 45 6f 66  data..**.** bEof
4f80: 3a 0a 2a 2a 20 20 20 53 65 74 20 74 6f 20 74 72  :.**   Set to tr
4f90: 75 65 20 6f 6e 63 65 20 69 74 65 72 61 74 6f 72  ue once iterator
4fa0: 20 68 61 73 20 72 65 61 63 68 65 64 20 45 4f 46   has reached EOF
4fb0: 2e 0a 2a 2a 0a 2a 2a 20 69 4f 66 66 3a 0a 2a 2a  ..**.** iOff:.**
4fc0: 20 20 20 53 65 74 20 74 6f 20 74 68 65 20 63 75     Set to the cu
4fd0: 72 72 65 6e 74 20 6f 66 66 73 65 74 20 77 69 74  rrent offset wit
4fe0: 68 69 6e 20 72 65 63 6f 72 64 20 70 44 61 74 61  hin record pData
4ff0: 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 46 74 73 35  ..*/.struct Fts5
5000: 44 6c 69 64 78 4c 76 6c 20 7b 0a 20 20 46 74 73  DlidxLvl {.  Fts
5010: 35 44 61 74 61 20 2a 70 44 61 74 61 3b 20 20 20  5Data *pData;   
5020: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61             /* Da
5030: 74 61 20 66 6f 72 20 63 75 72 72 65 6e 74 20 70  ta for current p
5040: 61 67 65 20 6f 66 20 74 68 69 73 20 6c 65 76 65  age of this leve
5050: 6c 20 2a 2f 0a 20 20 69 6e 74 20 69 4f 66 66 3b  l */.  int iOff;
5060: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5070: 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20       /* Current 
5080: 6f 66 66 73 65 74 20 69 6e 74 6f 20 70 44 61 74  offset into pDat
5090: 61 20 2a 2f 0a 20 20 69 6e 74 20 62 45 6f 66 3b  a */.  int bEof;
50a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
50b0: 20 20 20 20 20 2f 2a 20 41 74 20 45 4f 46 20 61       /* At EOF a
50c0: 6c 72 65 61 64 79 20 2a 2f 0a 20 20 69 6e 74 20  lready */.  int 
50d0: 69 46 69 72 73 74 4f 66 66 3b 20 20 20 20 20 20  iFirstOff;      
50e0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65            /* Use
50f0: 64 20 62 79 20 72 65 76 65 72 73 65 20 69 74 65  d by reverse ite
5100: 72 61 74 6f 72 73 20 2a 2f 0a 0a 20 20 2f 2a 20  rators */..  /* 
5110: 4f 75 74 70 75 74 20 76 61 72 69 61 62 6c 65 73  Output variables
5120: 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 65 61 66 50   */.  int iLeafP
5130: 67 6e 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20  gno;            
5140: 20 20 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62      /* Page numb
5150: 65 72 20 6f 66 20 63 75 72 72 65 6e 74 20 6c 65  er of current le
5160: 61 66 20 70 61 67 65 20 2a 2f 0a 20 20 69 36 34  af page */.  i64
5170: 20 69 52 6f 77 69 64 3b 20 20 20 20 20 20 20 20   iRowid;        
5180: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
5190: 72 73 74 20 72 6f 77 69 64 20 6f 6e 20 6c 65 61  rst rowid on lea
51a0: 66 20 69 4c 65 61 66 50 67 6e 6f 20 2a 2f 0a 7d  f iLeafPgno */.}
51b0: 3b 0a 73 74 72 75 63 74 20 46 74 73 35 44 6c 69  ;.struct Fts5Dli
51c0: 64 78 49 74 65 72 20 7b 0a 20 20 69 6e 74 20 6e  dxIter {.  int n
51d0: 4c 76 6c 3b 0a 20 20 69 6e 74 20 69 53 65 67 69  Lvl;.  int iSegi
51e0: 64 3b 0a 20 20 46 74 73 35 44 6c 69 64 78 4c 76  d;.  Fts5DlidxLv
51f0: 6c 20 61 4c 76 6c 5b 31 5d 3b 0a 7d 3b 0a 0a 73  l aLvl[1];.};..s
5200: 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 50  tatic void fts5P
5210: 75 74 55 31 36 28 75 38 20 2a 61 4f 75 74 2c 20  utU16(u8 *aOut, 
5220: 75 31 36 20 69 56 61 6c 29 7b 0a 20 20 61 4f 75  u16 iVal){.  aOu
5230: 74 5b 30 5d 20 3d 20 28 69 56 61 6c 3e 3e 38 29  t[0] = (iVal>>8)
5240: 3b 0a 20 20 61 4f 75 74 5b 31 5d 20 3d 20 28 69  ;.  aOut[1] = (i
5250: 56 61 6c 26 30 78 46 46 29 3b 0a 7d 0a 0a 73 74  Val&0xFF);.}..st
5260: 61 74 69 63 20 75 31 36 20 66 74 73 35 47 65 74  atic u16 fts5Get
5270: 55 31 36 28 63 6f 6e 73 74 20 75 38 20 2a 61 49  U16(const u8 *aI
5280: 6e 29 7b 0a 20 20 72 65 74 75 72 6e 20 28 28 75  n){.  return ((u
5290: 31 36 29 61 49 6e 5b 30 5d 20 3c 3c 20 38 29 20  16)aIn[0] << 8) 
52a0: 2b 20 61 49 6e 5b 31 5d 3b 0a 7d 20 0a 0a 2f 2a  + aIn[1];.} ../*
52b0: 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 64  .** Allocate and
52c0: 20 72 65 74 75 72 6e 20 61 20 62 75 66 66 65 72   return a buffer
52d0: 20 61 74 20 6c 65 61 73 74 20 6e 42 79 74 65 20   at least nByte 
52e0: 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2e 0a 2a  bytes in size..*
52f0: 2a 0a 2a 2a 20 49 66 20 61 6e 20 4f 4f 4d 20 65  *.** If an OOM e
5300: 72 72 6f 72 20 69 73 20 65 6e 63 6f 75 6e 74 65  rror is encounte
5310: 72 65 64 2c 20 72 65 74 75 72 6e 20 4e 55 4c 4c  red, return NULL
5320: 20 61 6e 64 20 73 65 74 20 74 68 65 20 65 72 72   and set the err
5330: 6f 72 20 63 6f 64 65 20 69 6e 0a 2a 2a 20 74 68  or code in.** th
5340: 65 20 46 74 73 35 49 6e 64 65 78 20 68 61 6e 64  e Fts5Index hand
5350: 6c 65 20 70 61 73 73 65 64 20 61 73 20 74 68 65  le passed as the
5360: 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 2e   first argument.
5370: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
5380: 2a 66 74 73 35 49 64 78 4d 61 6c 6c 6f 63 28 46  *fts5IdxMalloc(F
5390: 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 69 6e 74  ts5Index *p, int
53a0: 20 6e 42 79 74 65 29 7b 0a 20 20 72 65 74 75 72   nByte){.  retur
53b0: 6e 20 73 71 6c 69 74 65 33 46 74 73 35 4d 61 6c  n sqlite3Fts5Mal
53c0: 6c 6f 63 5a 65 72 6f 28 26 70 2d 3e 72 63 2c 20  locZero(&p->rc, 
53d0: 6e 42 79 74 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  nByte);.}../*.**
53e0: 20 43 6f 6d 70 61 72 65 20 74 68 65 20 63 6f 6e   Compare the con
53f0: 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70 4c 65  tents of the pLe
5400: 66 74 20 62 75 66 66 65 72 20 77 69 74 68 20 74  ft buffer with t
5410: 68 65 20 70 52 69 67 68 74 2f 6e 52 69 67 68 74  he pRight/nRight
5420: 20 62 6c 6f 62 2e 0a 2a 2a 0a 2a 2a 20 52 65 74   blob..**.** Ret
5430: 75 72 6e 20 2d 76 65 20 69 66 20 70 4c 65 66 74  urn -ve if pLeft
5440: 20 69 73 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e   is smaller than
5450: 20 70 52 69 67 68 74 2c 20 30 20 69 66 20 74 68   pRight, 0 if th
5460: 65 79 20 61 72 65 20 65 71 75 61 6c 20 6f 72 0a  ey are equal or.
5470: 2a 2a 20 2b 76 65 20 69 66 20 70 52 69 67 68 74  ** +ve if pRight
5480: 20 69 73 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e   is smaller than
5490: 20 70 4c 65 66 74 2e 20 49 6e 20 6f 74 68 65 72   pLeft. In other
54a0: 20 77 6f 72 64 73 3a 0a 2a 2a 0a 2a 2a 20 20 20   words:.**.**   
54b0: 20 20 72 65 73 20 3d 20 2a 70 4c 65 66 74 20 2d    res = *pLeft -
54c0: 20 2a 70 52 69 67 68 74 0a 2a 2f 0a 23 69 66 64   *pRight.*/.#ifd
54d0: 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
54e0: 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 35 42  static int fts5B
54f0: 75 66 66 65 72 43 6f 6d 70 61 72 65 42 6c 6f 62  ufferCompareBlob
5500: 28 0a 20 20 46 74 73 35 42 75 66 66 65 72 20 2a  (.  Fts5Buffer *
5510: 70 4c 65 66 74 2c 20 20 20 20 20 20 20 20 20 20  pLeft,          
5520: 20 20 20 20 2f 2a 20 4c 65 66 74 20 68 61 6e 64      /* Left hand
5530: 20 73 69 64 65 20 6f 66 20 63 6f 6d 70 61 72 69   side of compari
5540: 73 6f 6e 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 75  son */.  const u
5550: 38 20 2a 70 52 69 67 68 74 2c 20 69 6e 74 20 6e  8 *pRight, int n
5560: 52 69 67 68 74 20 20 20 20 2f 2a 20 52 69 67 68  Right    /* Righ
5570: 74 20 68 61 6e 64 20 73 69 64 65 20 6f 66 20 63  t hand side of c
5580: 6f 6d 70 61 72 69 73 6f 6e 20 2a 2f 0a 29 7b 0a  omparison */.){.
5590: 20 20 69 6e 74 20 6e 43 6d 70 20 3d 20 4d 49 4e    int nCmp = MIN
55a0: 28 70 4c 65 66 74 2d 3e 6e 2c 20 6e 52 69 67 68  (pLeft->n, nRigh
55b0: 74 29 3b 0a 20 20 69 6e 74 20 72 65 73 20 3d 20  t);.  int res = 
55c0: 6d 65 6d 63 6d 70 28 70 4c 65 66 74 2d 3e 70 2c  memcmp(pLeft->p,
55d0: 20 70 52 69 67 68 74 2c 20 6e 43 6d 70 29 3b 0a   pRight, nCmp);.
55e0: 20 20 72 65 74 75 72 6e 20 28 72 65 73 3d 3d 30    return (res==0
55f0: 20 3f 20 28 70 4c 65 66 74 2d 3e 6e 20 2d 20 6e   ? (pLeft->n - n
5600: 52 69 67 68 74 29 20 3a 20 72 65 73 29 3b 0a 7d  Right) : res);.}
5610: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 43  .#endif../*.** C
5620: 6f 6d 70 61 72 65 20 74 68 65 20 63 6f 6e 74 65  ompare the conte
5630: 6e 74 73 20 6f 66 20 74 68 65 20 74 77 6f 20 62  nts of the two b
5640: 75 66 66 65 72 73 20 75 73 69 6e 67 20 6d 65 6d  uffers using mem
5650: 63 6d 70 28 29 2e 20 49 66 20 6f 6e 65 20 62 75  cmp(). If one bu
5660: 66 66 65 72 0a 2a 2a 20 69 73 20 61 20 70 72 65  ffer.** is a pre
5670: 66 69 78 20 6f 66 20 74 68 65 20 6f 74 68 65 72  fix of the other
5680: 2c 20 69 74 20 69 73 20 63 6f 6e 73 69 64 65 72  , it is consider
5690: 65 64 20 74 68 65 20 6c 65 73 73 65 72 2e 0a 2a  ed the lesser..*
56a0: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 2d 76 65 20  *.** Return -ve 
56b0: 69 66 20 70 4c 65 66 74 20 69 73 20 73 6d 61 6c  if pLeft is smal
56c0: 6c 65 72 20 74 68 61 6e 20 70 52 69 67 68 74 2c  ler than pRight,
56d0: 20 30 20 69 66 20 74 68 65 79 20 61 72 65 20 65   0 if they are e
56e0: 71 75 61 6c 20 6f 72 0a 2a 2a 20 2b 76 65 20 69  qual or.** +ve i
56f0: 66 20 70 52 69 67 68 74 20 69 73 20 73 6d 61 6c  f pRight is smal
5700: 6c 65 72 20 74 68 61 6e 20 70 4c 65 66 74 2e 20  ler than pLeft. 
5710: 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 3a 0a  In other words:.
5720: 2a 2a 0a 2a 2a 20 20 20 20 20 72 65 73 20 3d 20  **.**     res = 
5730: 2a 70 4c 65 66 74 20 2d 20 2a 70 52 69 67 68 74  *pLeft - *pRight
5740: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .*/.static int f
5750: 74 73 35 42 75 66 66 65 72 43 6f 6d 70 61 72 65  ts5BufferCompare
5760: 28 46 74 73 35 42 75 66 66 65 72 20 2a 70 4c 65  (Fts5Buffer *pLe
5770: 66 74 2c 20 46 74 73 35 42 75 66 66 65 72 20 2a  ft, Fts5Buffer *
5780: 70 52 69 67 68 74 29 7b 0a 20 20 69 6e 74 20 6e  pRight){.  int n
5790: 43 6d 70 20 3d 20 4d 49 4e 28 70 4c 65 66 74 2d  Cmp = MIN(pLeft-
57a0: 3e 6e 2c 20 70 52 69 67 68 74 2d 3e 6e 29 3b 0a  >n, pRight->n);.
57b0: 20 20 69 6e 74 20 72 65 73 20 3d 20 6d 65 6d 63    int res = memc
57c0: 6d 70 28 70 4c 65 66 74 2d 3e 70 2c 20 70 52 69  mp(pLeft->p, pRi
57d0: 67 68 74 2d 3e 70 2c 20 6e 43 6d 70 29 3b 0a 20  ght->p, nCmp);. 
57e0: 20 72 65 74 75 72 6e 20 28 72 65 73 3d 3d 30 20   return (res==0 
57f0: 3f 20 28 70 4c 65 66 74 2d 3e 6e 20 2d 20 70 52  ? (pLeft->n - pR
5800: 69 67 68 74 2d 3e 6e 29 20 3a 20 72 65 73 29 3b  ight->n) : res);
5810: 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .}..#ifdef SQLIT
5820: 45 5f 44 45 42 55 47 0a 73 74 61 74 69 63 20 69  E_DEBUG.static i
5830: 6e 74 20 66 74 73 35 42 6c 6f 62 43 6f 6d 70 61  nt fts5BlobCompa
5840: 72 65 28 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a  re(.  const u8 *
5850: 70 4c 65 66 74 2c 20 69 6e 74 20 6e 4c 65 66 74  pLeft, int nLeft
5860: 2c 20 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 70  , .  const u8 *p
5870: 52 69 67 68 74 2c 20 69 6e 74 20 6e 52 69 67 68  Right, int nRigh
5880: 74 0a 29 7b 0a 20 20 69 6e 74 20 6e 43 6d 70 20  t.){.  int nCmp 
5890: 3d 20 4d 49 4e 28 6e 4c 65 66 74 2c 20 6e 52 69  = MIN(nLeft, nRi
58a0: 67 68 74 29 3b 0a 20 20 69 6e 74 20 72 65 73 20  ght);.  int res 
58b0: 3d 20 6d 65 6d 63 6d 70 28 70 4c 65 66 74 2c 20  = memcmp(pLeft, 
58c0: 70 52 69 67 68 74 2c 20 6e 43 6d 70 29 3b 0a 20  pRight, nCmp);. 
58d0: 20 72 65 74 75 72 6e 20 28 72 65 73 3d 3d 30 20   return (res==0 
58e0: 3f 20 28 6e 4c 65 66 74 20 2d 20 6e 52 69 67 68  ? (nLeft - nRigh
58f0: 74 29 20 3a 20 72 65 73 29 3b 0a 7d 0a 23 65 6e  t) : res);.}.#en
5900: 64 69 66 0a 0a 73 74 61 74 69 63 20 69 6e 74 20  dif..static int 
5910: 66 74 73 35 4c 65 61 66 46 69 72 73 74 54 65 72  fts5LeafFirstTer
5920: 6d 4f 66 66 28 46 74 73 35 44 61 74 61 20 2a 70  mOff(Fts5Data *p
5930: 4c 65 61 66 29 7b 0a 20 20 69 6e 74 20 72 65 74  Leaf){.  int ret
5940: 3b 0a 20 20 66 74 73 35 47 65 74 56 61 72 69 6e  ;.  fts5GetVarin
5950: 74 33 32 28 26 70 4c 65 61 66 2d 3e 70 5b 70 4c  t32(&pLeaf->p[pL
5960: 65 61 66 2d 3e 73 7a 4c 65 61 66 5d 2c 20 72 65  eaf->szLeaf], re
5970: 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 65 74  t);.  return ret
5980: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65  ;.}../*.** Close
5990: 20 74 68 65 20 72 65 61 64 2d 6f 6e 6c 79 20 62   the read-only b
59a0: 6c 6f 62 20 68 61 6e 64 6c 65 2c 20 69 66 20 69  lob handle, if i
59b0: 74 20 69 73 20 6f 70 65 6e 2e 0a 2a 2f 0a 73 74  t is open..*/.st
59c0: 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 43 6c  atic void fts5Cl
59d0: 6f 73 65 52 65 61 64 65 72 28 46 74 73 35 49 6e  oseReader(Fts5In
59e0: 64 65 78 20 2a 70 29 7b 0a 20 20 69 66 28 20 70  dex *p){.  if( p
59f0: 2d 3e 70 52 65 61 64 65 72 20 29 7b 0a 20 20 20  ->pReader ){.   
5a00: 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62 20 2a 70   sqlite3_blob *p
5a10: 52 65 61 64 65 72 20 3d 20 70 2d 3e 70 52 65 61  Reader = p->pRea
5a20: 64 65 72 3b 0a 20 20 20 20 70 2d 3e 70 52 65 61  der;.    p->pRea
5a30: 64 65 72 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c  der = 0;.    sql
5a40: 69 74 65 33 5f 62 6c 6f 62 5f 63 6c 6f 73 65 28  ite3_blob_close(
5a50: 70 52 65 61 64 65 72 29 3b 0a 20 20 7d 0a 7d 0a  pReader);.  }.}.
5a60: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 72 69 65 76 65  ../*.** Retrieve
5a70: 20 61 20 72 65 63 6f 72 64 20 66 72 6f 6d 20 74   a record from t
5a80: 68 65 20 25 5f 64 61 74 61 20 74 61 62 6c 65 2e  he %_data table.
5a90: 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72  .**.** If an err
5aa0: 6f 72 20 6f 63 63 75 72 73 2c 20 4e 55 4c 4c 20  or occurs, NULL 
5ab0: 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20  is returned and 
5ac0: 61 6e 20 65 72 72 6f 72 20 6c 65 66 74 20 69 6e  an error left in
5ad0: 20 74 68 65 20 0a 2a 2a 20 46 74 73 35 49 6e 64   the .** Fts5Ind
5ae0: 65 78 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 73 74  ex object..*/.st
5af0: 61 74 69 63 20 46 74 73 35 44 61 74 61 20 2a 66  atic Fts5Data *f
5b00: 74 73 35 44 61 74 61 52 65 61 64 28 46 74 73 35  ts5DataRead(Fts5
5b10: 49 6e 64 65 78 20 2a 70 2c 20 69 36 34 20 69 52  Index *p, i64 iR
5b20: 6f 77 69 64 29 7b 0a 20 20 46 74 73 35 44 61 74  owid){.  Fts5Dat
5b30: 61 20 2a 70 52 65 74 20 3d 20 30 3b 0a 20 20 69  a *pRet = 0;.  i
5b40: 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  f( p->rc==SQLITE
5b50: 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 6e 74 20 72  _OK ){.    int r
5b60: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  c = SQLITE_OK;..
5b70: 20 20 20 20 69 66 28 20 70 2d 3e 70 52 65 61 64      if( p->pRead
5b80: 65 72 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54  er ){.      /* T
5b90: 68 69 73 20 63 61 6c 6c 20 6d 61 79 20 72 65 74  his call may ret
5ba0: 75 72 6e 20 53 51 4c 49 54 45 5f 41 42 4f 52 54  urn SQLITE_ABORT
5bb0: 20 69 66 20 74 68 65 72 65 20 68 61 73 20 62 65   if there has be
5bc0: 65 6e 20 61 20 73 61 76 65 70 6f 69 6e 74 0a 20  en a savepoint. 
5bd0: 20 20 20 20 20 2a 2a 20 72 6f 6c 6c 62 61 63 6b       ** rollback
5be0: 20 73 69 6e 63 65 20 69 74 20 77 61 73 20 6c 61   since it was la
5bf0: 73 74 20 75 73 65 64 2e 20 49 6e 20 74 68 69 73  st used. In this
5c00: 20 63 61 73 65 20 61 20 6e 65 77 20 62 6c 6f 62   case a new blob
5c10: 20 68 61 6e 64 6c 65 0a 20 20 20 20 20 20 2a 2a   handle.      **
5c20: 20 69 73 20 72 65 71 75 69 72 65 64 2e 20 20 2a   is required.  *
5c30: 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  /.      sqlite3_
5c40: 62 6c 6f 62 20 2a 70 42 6c 6f 62 20 3d 20 70 2d  blob *pBlob = p-
5c50: 3e 70 52 65 61 64 65 72 3b 0a 20 20 20 20 20 20  >pReader;.      
5c60: 70 2d 3e 70 52 65 61 64 65 72 20 3d 20 30 3b 0a  p->pReader = 0;.
5c70: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
5c80: 65 33 5f 62 6c 6f 62 5f 72 65 6f 70 65 6e 28 70  e3_blob_reopen(p
5c90: 42 6c 6f 62 2c 20 69 52 6f 77 69 64 29 3b 0a 20  Blob, iRowid);. 
5ca0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e       assert( p->
5cb0: 70 52 65 61 64 65 72 3d 3d 30 20 29 3b 0a 20 20  pReader==0 );.  
5cc0: 20 20 20 20 70 2d 3e 70 52 65 61 64 65 72 20 3d      p->pReader =
5cd0: 20 70 42 6c 6f 62 3b 0a 20 20 20 20 20 20 69 66   pBlob;.      if
5ce0: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
5cf0: 29 7b 0a 20 20 20 20 20 20 20 20 66 74 73 35 43  ){.        fts5C
5d00: 6c 6f 73 65 52 65 61 64 65 72 28 70 29 3b 0a 20  loseReader(p);. 
5d10: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
5d20: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 41 42 4f 52   rc==SQLITE_ABOR
5d30: 54 20 29 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  T ) rc = SQLITE_
5d40: 4f 4b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  OK;.    }..    /
5d50: 2a 20 49 66 20 74 68 65 20 62 6c 6f 62 20 68 61  * If the blob ha
5d60: 6e 64 6c 65 20 69 73 20 6e 6f 74 20 6f 70 65 6e  ndle is not open
5d70: 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74 2c 20   at this point, 
5d80: 6f 70 65 6e 20 69 74 20 61 6e 64 20 73 65 65 6b  open it and seek
5d90: 20 0a 20 20 20 20 2a 2a 20 74 6f 20 74 68 65 20   .    ** to the 
5da0: 72 65 71 75 65 73 74 65 64 20 65 6e 74 72 79 2e  requested entry.
5db0: 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e    */.    if( p->
5dc0: 70 52 65 61 64 65 72 3d 3d 30 20 26 26 20 72 63  pReader==0 && rc
5dd0: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
5de0: 20 20 20 20 20 46 74 73 35 43 6f 6e 66 69 67 20       Fts5Config 
5df0: 2a 70 43 6f 6e 66 69 67 20 3d 20 70 2d 3e 70 43  *pConfig = p->pC
5e00: 6f 6e 66 69 67 3b 0a 20 20 20 20 20 20 72 63 20  onfig;.      rc 
5e10: 3d 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 6f  = sqlite3_blob_o
5e20: 70 65 6e 28 70 43 6f 6e 66 69 67 2d 3e 64 62 2c  pen(pConfig->db,
5e30: 20 0a 20 20 20 20 20 20 20 20 20 20 70 43 6f 6e   .          pCon
5e40: 66 69 67 2d 3e 7a 44 62 2c 20 70 2d 3e 7a 44 61  fig->zDb, p->zDa
5e50: 74 61 54 62 6c 2c 20 22 62 6c 6f 63 6b 22 2c 20  taTbl, "block", 
5e60: 69 52 6f 77 69 64 2c 20 30 2c 20 26 70 2d 3e 70  iRowid, 0, &p->p
5e70: 52 65 61 64 65 72 0a 20 20 20 20 20 20 29 3b 0a  Reader.      );.
5e80: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66      }..    /* If
5e90: 20 65 69 74 68 65 72 20 6f 66 20 74 68 65 20 73   either of the s
5ea0: 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 6f 70 65 6e  qlite3_blob_open
5eb0: 28 29 20 6f 72 20 73 71 6c 69 74 65 33 5f 62 6c  () or sqlite3_bl
5ec0: 6f 62 5f 72 65 6f 70 65 6e 28 29 20 63 61 6c 6c  ob_reopen() call
5ed0: 73 0a 20 20 20 20 2a 2a 20 61 62 6f 76 65 20 72  s.    ** above r
5ee0: 65 74 75 72 6e 65 64 20 53 51 4c 49 54 45 5f 45  eturned SQLITE_E
5ef0: 52 52 4f 52 2c 20 72 65 74 75 72 6e 20 53 51 4c  RROR, return SQL
5f00: 49 54 45 5f 43 4f 52 52 55 50 54 5f 56 54 41 42  ITE_CORRUPT_VTAB
5f10: 20 69 6e 73 74 65 61 64 2e 0a 20 20 20 20 2a 2a   instead..    **
5f20: 20 41 6c 6c 20 74 68 65 20 72 65 61 73 6f 6e 73   All the reasons
5f30: 20 74 68 6f 73 65 20 66 75 6e 63 74 69 6f 6e 73   those functions
5f40: 20 6d 69 67 68 74 20 72 65 74 75 72 6e 20 53 51   might return SQ
5f50: 4c 49 54 45 5f 45 52 52 4f 52 20 2d 20 6d 69 73  LITE_ERROR - mis
5f60: 73 69 6e 67 0a 20 20 20 20 2a 2a 20 74 61 62 6c  sing.    ** tabl
5f70: 65 2c 20 6d 69 73 73 69 6e 67 20 72 6f 77 2c 20  e, missing row, 
5f80: 6e 6f 6e 2d 62 6c 6f 62 2f 74 65 78 74 20 69 6e  non-blob/text in
5f90: 20 62 6c 6f 63 6b 20 63 6f 6c 75 6d 6e 20 2d 20   block column - 
5fa0: 69 6e 64 69 63 61 74 65 20 0a 20 20 20 20 2a 2a  indicate .    **
5fb0: 20 62 61 63 6b 69 6e 67 20 73 74 6f 72 65 20 63   backing store c
5fc0: 6f 72 72 75 70 74 69 6f 6e 2e 20 20 2a 2f 0a 20  orruption.  */. 
5fd0: 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
5fe0: 45 5f 45 52 52 4f 52 20 29 20 72 63 20 3d 20 46  E_ERROR ) rc = F
5ff0: 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a 0a 20 20  TS5_CORRUPT;..  
6000: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
6010: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 75 38 20  _OK ){.      u8 
6020: 2a 61 4f 75 74 20 3d 20 30 3b 20 20 20 20 20 20  *aOut = 0;      
6030: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 61 64           /* Read
6040: 20 62 6c 6f 62 20 64 61 74 61 20 69 6e 74 6f 20   blob data into 
6050: 74 68 69 73 20 62 75 66 66 65 72 20 2a 2f 0a 20  this buffer */. 
6060: 20 20 20 20 20 69 6e 74 20 6e 42 79 74 65 20 3d       int nByte =
6070: 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 62 79   sqlite3_blob_by
6080: 74 65 73 28 70 2d 3e 70 52 65 61 64 65 72 29 3b  tes(p->pReader);
6090: 0a 20 20 20 20 20 20 69 6e 74 20 6e 41 6c 6c 6f  .      int nAllo
60a0: 63 20 3d 20 73 69 7a 65 6f 66 28 46 74 73 35 44  c = sizeof(Fts5D
60b0: 61 74 61 29 20 2b 20 6e 42 79 74 65 20 2b 20 46  ata) + nByte + F
60c0: 54 53 35 5f 44 41 54 41 5f 50 41 44 44 49 4e 47  TS5_DATA_PADDING
60d0: 3b 0a 20 20 20 20 20 20 70 52 65 74 20 3d 20 28  ;.      pRet = (
60e0: 46 74 73 35 44 61 74 61 2a 29 73 71 6c 69 74 65  Fts5Data*)sqlite
60f0: 33 5f 6d 61 6c 6c 6f 63 28 6e 41 6c 6c 6f 63 29  3_malloc(nAlloc)
6100: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 52 65 74  ;.      if( pRet
6110: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 52 65 74   ){.        pRet
6120: 2d 3e 6e 6e 20 3d 20 6e 42 79 74 65 3b 0a 20 20  ->nn = nByte;.  
6130: 20 20 20 20 20 20 61 4f 75 74 20 3d 20 70 52 65        aOut = pRe
6140: 74 2d 3e 70 20 3d 20 28 75 38 2a 29 26 70 52 65  t->p = (u8*)&pRe
6150: 74 5b 31 5d 3b 0a 20 20 20 20 20 20 7d 65 6c 73  t[1];.      }els
6160: 65 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  e{.        rc = 
6170: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
6180: 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28      }..      if(
6190: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
61a0: 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  {.        rc = s
61b0: 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 72 65 61 64  qlite3_blob_read
61c0: 28 70 2d 3e 70 52 65 61 64 65 72 2c 20 61 4f 75  (p->pReader, aOu
61d0: 74 2c 20 6e 42 79 74 65 2c 20 30 29 3b 0a 20 20  t, nByte, 0);.  
61e0: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
61f0: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
6200: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
6210: 5f 66 72 65 65 28 70 52 65 74 29 3b 0a 20 20 20  _free(pRet);.   
6220: 20 20 20 20 20 70 52 65 74 20 3d 20 30 3b 0a 20       pRet = 0;. 
6230: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
6240: 20 20 20 20 2f 2a 20 54 4f 44 4f 31 3a 20 46 69      /* TODO1: Fi
6250: 78 20 74 68 69 73 20 2a 2f 0a 20 20 20 20 20 20  x this */.      
6260: 20 20 70 52 65 74 2d 3e 73 7a 4c 65 61 66 20 3d    pRet->szLeaf =
6270: 20 66 74 73 35 47 65 74 55 31 36 28 26 70 52 65   fts5GetU16(&pRe
6280: 74 2d 3e 70 5b 32 5d 29 3b 0a 20 20 20 20 20 20  t->p[2]);.      
6290: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 72  }.    }.    p->r
62a0: 63 20 3d 20 72 63 3b 0a 20 20 20 20 70 2d 3e 6e  c = rc;.    p->n
62b0: 52 65 61 64 2b 2b 3b 0a 20 20 7d 0a 0a 20 20 61  Read++;.  }..  a
62c0: 73 73 65 72 74 28 20 28 70 52 65 74 3d 3d 30 29  ssert( (pRet==0)
62d0: 3d 3d 28 70 2d 3e 72 63 21 3d 53 51 4c 49 54 45  ==(p->rc!=SQLITE
62e0: 5f 4f 4b 29 20 29 3b 0a 20 20 72 65 74 75 72 6e  _OK) );.  return
62f0: 20 70 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   pRet;.}../*.** 
6300: 52 65 6c 65 61 73 65 20 61 20 72 65 66 65 72 65  Release a refere
6310: 6e 63 65 20 74 6f 20 64 61 74 61 20 72 65 63 6f  nce to data reco
6320: 72 64 20 72 65 74 75 72 6e 65 64 20 62 79 20 61  rd returned by a
6330: 6e 20 65 61 72 6c 69 65 72 20 63 61 6c 6c 20 74  n earlier call t
6340: 6f 0a 2a 2a 20 66 74 73 35 44 61 74 61 52 65 61  o.** fts5DataRea
6350: 64 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  d()..*/.static v
6360: 6f 69 64 20 66 74 73 35 44 61 74 61 52 65 6c 65  oid fts5DataRele
6370: 61 73 65 28 46 74 73 35 44 61 74 61 20 2a 70 44  ase(Fts5Data *pD
6380: 61 74 61 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  ata){.  sqlite3_
6390: 66 72 65 65 28 70 44 61 74 61 29 3b 0a 7d 0a 0a  free(pData);.}..
63a0: 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 35 49  static int fts5I
63b0: 6e 64 65 78 50 72 65 70 61 72 65 53 74 6d 74 28  ndexPrepareStmt(
63c0: 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c  .  Fts5Index *p,
63d0: 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20  .  sqlite3_stmt 
63e0: 2a 2a 70 70 53 74 6d 74 2c 0a 20 20 63 68 61 72  **ppStmt,.  char
63f0: 20 2a 7a 53 71 6c 0a 29 7b 0a 20 20 69 66 28 20   *zSql.){.  if( 
6400: 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
6410: 20 29 7b 0a 20 20 20 20 69 66 28 20 7a 53 71 6c   ){.    if( zSql
6420: 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 72 63 20   ){.      p->rc 
6430: 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72  = sqlite3_prepar
6440: 65 5f 76 32 28 70 2d 3e 70 43 6f 6e 66 69 67 2d  e_v2(p->pConfig-
6450: 3e 64 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20 70  >db, zSql, -1, p
6460: 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20 7d  pStmt, 0);.    }
6470: 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 2d 3e 72  else{.      p->r
6480: 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
6490: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71  ;.    }.  }.  sq
64a0: 6c 69 74 65 33 5f 66 72 65 65 28 7a 53 71 6c 29  lite3_free(zSql)
64b0: 3b 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e 72 63  ;.  return p->rc
64c0: 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 49 4e 53 45  ;.}.../*.** INSE
64d0: 52 54 20 4f 52 20 52 45 50 4c 41 43 45 20 61 20  RT OR REPLACE a 
64e0: 72 65 63 6f 72 64 20 69 6e 74 6f 20 74 68 65 20  record into the 
64f0: 25 5f 64 61 74 61 20 74 61 62 6c 65 2e 0a 2a 2f  %_data table..*/
6500: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
6510: 35 44 61 74 61 57 72 69 74 65 28 46 74 73 35 49  5DataWrite(Fts5I
6520: 6e 64 65 78 20 2a 70 2c 20 69 36 34 20 69 52 6f  ndex *p, i64 iRo
6530: 77 69 64 2c 20 63 6f 6e 73 74 20 75 38 20 2a 70  wid, const u8 *p
6540: 44 61 74 61 2c 20 69 6e 74 20 6e 44 61 74 61 29  Data, int nData)
6550: 7b 0a 20 20 69 66 28 20 70 2d 3e 72 63 21 3d 53  {.  if( p->rc!=S
6560: 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72  QLITE_OK ) retur
6570: 6e 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 70 57 72  n;..  if( p->pWr
6580: 69 74 65 72 3d 3d 30 20 29 7b 0a 20 20 20 20 46  iter==0 ){.    F
6590: 74 73 35 43 6f 6e 66 69 67 20 2a 70 43 6f 6e 66  ts5Config *pConf
65a0: 69 67 20 3d 20 70 2d 3e 70 43 6f 6e 66 69 67 3b  ig = p->pConfig;
65b0: 0a 20 20 20 20 66 74 73 35 49 6e 64 65 78 50 72  .    fts5IndexPr
65c0: 65 70 61 72 65 53 74 6d 74 28 70 2c 20 26 70 2d  epareStmt(p, &p-
65d0: 3e 70 57 72 69 74 65 72 2c 20 73 71 6c 69 74 65  >pWriter, sqlite
65e0: 33 5f 6d 70 72 69 6e 74 66 28 0a 20 20 20 20 20  3_mprintf(.     
65f0: 20 20 20 20 20 22 52 45 50 4c 41 43 45 20 49 4e       "REPLACE IN
6600: 54 4f 20 27 25 71 27 2e 27 25 71 5f 64 61 74 61  TO '%q'.'%q_data
6610: 27 28 69 64 2c 20 62 6c 6f 63 6b 29 20 56 41 4c  '(id, block) VAL
6620: 55 45 53 28 3f 2c 3f 29 22 2c 20 0a 20 20 20 20  UES(?,?)", .    
6630: 20 20 20 20 20 20 70 43 6f 6e 66 69 67 2d 3e 7a        pConfig->z
6640: 44 62 2c 20 70 43 6f 6e 66 69 67 2d 3e 7a 4e 61  Db, pConfig->zNa
6650: 6d 65 0a 20 20 20 20 29 29 3b 0a 20 20 20 20 69  me.    ));.    i
6660: 66 28 20 70 2d 3e 72 63 20 29 20 72 65 74 75 72  f( p->rc ) retur
6670: 6e 3b 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65  n;.  }..  sqlite
6680: 33 5f 62 69 6e 64 5f 69 6e 74 36 34 28 70 2d 3e  3_bind_int64(p->
6690: 70 57 72 69 74 65 72 2c 20 31 2c 20 69 52 6f 77  pWriter, 1, iRow
66a0: 69 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 62  id);.  sqlite3_b
66b0: 69 6e 64 5f 62 6c 6f 62 28 70 2d 3e 70 57 72 69  ind_blob(p->pWri
66c0: 74 65 72 2c 20 32 2c 20 70 44 61 74 61 2c 20 6e  ter, 2, pData, n
66d0: 44 61 74 61 2c 20 53 51 4c 49 54 45 5f 53 54 41  Data, SQLITE_STA
66e0: 54 49 43 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  TIC);.  sqlite3_
66f0: 73 74 65 70 28 70 2d 3e 70 57 72 69 74 65 72 29  step(p->pWriter)
6700: 3b 0a 20 20 70 2d 3e 72 63 20 3d 20 73 71 6c 69  ;.  p->rc = sqli
6710: 74 65 33 5f 72 65 73 65 74 28 70 2d 3e 70 57 72  te3_reset(p->pWr
6720: 69 74 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  iter);.}../*.** 
6730: 45 78 65 63 75 74 65 20 74 68 65 20 66 6f 6c 6c  Execute the foll
6740: 6f 77 69 6e 67 20 53 51 4c 3a 0a 2a 2a 0a 2a 2a  owing SQL:.**.**
6750: 20 20 20 20 20 44 45 4c 45 54 45 20 46 52 4f 4d       DELETE FROM
6760: 20 25 5f 64 61 74 61 20 57 48 45 52 45 20 69 64   %_data WHERE id
6770: 20 42 45 54 57 45 45 4e 20 24 69 46 69 72 73 74   BETWEEN $iFirst
6780: 20 41 4e 44 20 24 69 4c 61 73 74 0a 2a 2f 0a 73   AND $iLast.*/.s
6790: 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 44  tatic void fts5D
67a0: 61 74 61 44 65 6c 65 74 65 28 46 74 73 35 49 6e  ataDelete(Fts5In
67b0: 64 65 78 20 2a 70 2c 20 69 36 34 20 69 46 69 72  dex *p, i64 iFir
67c0: 73 74 2c 20 69 36 34 20 69 4c 61 73 74 29 7b 0a  st, i64 iLast){.
67d0: 20 20 69 66 28 20 70 2d 3e 72 63 21 3d 53 51 4c    if( p->rc!=SQL
67e0: 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 3b  ITE_OK ) return;
67f0: 0a 0a 20 20 69 66 28 20 70 2d 3e 70 44 65 6c 65  ..  if( p->pDele
6800: 74 65 72 3d 3d 30 20 29 7b 0a 20 20 20 20 69 6e  ter==0 ){.    in
6810: 74 20 72 63 3b 0a 20 20 20 20 46 74 73 35 43 6f  t rc;.    Fts5Co
6820: 6e 66 69 67 20 2a 70 43 6f 6e 66 69 67 20 3d 20  nfig *pConfig = 
6830: 70 2d 3e 70 43 6f 6e 66 69 67 3b 0a 20 20 20 20  p->pConfig;.    
6840: 63 68 61 72 20 2a 7a 53 71 6c 20 3d 20 73 71 6c  char *zSql = sql
6850: 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 0a 20 20  ite3_mprintf(.  
6860: 20 20 20 20 20 20 22 44 45 4c 45 54 45 20 46 52        "DELETE FR
6870: 4f 4d 20 27 25 71 27 2e 27 25 71 5f 64 61 74 61  OM '%q'.'%q_data
6880: 27 20 57 48 45 52 45 20 69 64 3e 3d 3f 20 41 4e  ' WHERE id>=? AN
6890: 44 20 69 64 3c 3d 3f 22 2c 20 0a 20 20 20 20 20  D id<=?", .     
68a0: 20 20 20 20 20 70 43 6f 6e 66 69 67 2d 3e 7a 44       pConfig->zD
68b0: 62 2c 20 70 43 6f 6e 66 69 67 2d 3e 7a 4e 61 6d  b, pConfig->zNam
68c0: 65 0a 20 20 20 20 29 3b 0a 20 20 20 20 69 66 28  e.    );.    if(
68d0: 20 7a 53 71 6c 3d 3d 30 20 29 7b 0a 20 20 20 20   zSql==0 ){.    
68e0: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
68f0: 4d 45 4d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  MEM;.    }else{.
6900: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
6910: 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28 70 43  e3_prepare_v2(pC
6920: 6f 6e 66 69 67 2d 3e 64 62 2c 20 7a 53 71 6c 2c  onfig->db, zSql,
6930: 20 2d 31 2c 20 26 70 2d 3e 70 44 65 6c 65 74 65   -1, &p->pDelete
6940: 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c  r, 0);.      sql
6950: 69 74 65 33 5f 66 72 65 65 28 7a 53 71 6c 29 3b  ite3_free(zSql);
6960: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72  .    }.    if( r
6970: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
6980: 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 72 63        p->rc = rc
6990: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a  ;.      return;.
69a0: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 73 71 6c      }.  }..  sql
69b0: 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 36 34 28  ite3_bind_int64(
69c0: 70 2d 3e 70 44 65 6c 65 74 65 72 2c 20 31 2c 20  p->pDeleter, 1, 
69d0: 69 46 69 72 73 74 29 3b 0a 20 20 73 71 6c 69 74  iFirst);.  sqlit
69e0: 65 33 5f 62 69 6e 64 5f 69 6e 74 36 34 28 70 2d  e3_bind_int64(p-
69f0: 3e 70 44 65 6c 65 74 65 72 2c 20 32 2c 20 69 4c  >pDeleter, 2, iL
6a00: 61 73 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  ast);.  sqlite3_
6a10: 73 74 65 70 28 70 2d 3e 70 44 65 6c 65 74 65 72  step(p->pDeleter
6a20: 29 3b 0a 20 20 70 2d 3e 72 63 20 3d 20 73 71 6c  );.  p->rc = sql
6a30: 69 74 65 33 5f 72 65 73 65 74 28 70 2d 3e 70 44  ite3_reset(p->pD
6a40: 65 6c 65 74 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  eleter);.}../*.*
6a50: 2a 20 52 65 6d 6f 76 65 20 61 6c 6c 20 72 65 63  * Remove all rec
6a60: 6f 72 64 73 20 61 73 73 6f 63 69 61 74 65 64 20  ords associated 
6a70: 77 69 74 68 20 73 65 67 6d 65 6e 74 20 69 53 65  with segment iSe
6a80: 67 69 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  gid..*/.static v
6a90: 6f 69 64 20 66 74 73 35 44 61 74 61 52 65 6d 6f  oid fts5DataRemo
6aa0: 76 65 53 65 67 6d 65 6e 74 28 46 74 73 35 49 6e  veSegment(Fts5In
6ab0: 64 65 78 20 2a 70 2c 20 69 6e 74 20 69 53 65 67  dex *p, int iSeg
6ac0: 69 64 29 7b 0a 20 20 69 36 34 20 69 46 69 72 73  id){.  i64 iFirs
6ad0: 74 20 3d 20 46 54 53 35 5f 53 45 47 4d 45 4e 54  t = FTS5_SEGMENT
6ae0: 5f 52 4f 57 49 44 28 69 53 65 67 69 64 2c 20 30  _ROWID(iSegid, 0
6af0: 29 3b 0a 20 20 69 36 34 20 69 4c 61 73 74 20 3d  );.  i64 iLast =
6b00: 20 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f 52 4f   FTS5_SEGMENT_RO
6b10: 57 49 44 28 69 53 65 67 69 64 2b 31 2c 20 30 29  WID(iSegid+1, 0)
6b20: 2d 31 3b 0a 20 20 66 74 73 35 44 61 74 61 44 65  -1;.  fts5DataDe
6b30: 6c 65 74 65 28 70 2c 20 69 46 69 72 73 74 2c 20  lete(p, iFirst, 
6b40: 69 4c 61 73 74 29 3b 0a 20 20 69 66 28 20 70 2d  iLast);.  if( p-
6b50: 3e 70 49 64 78 44 65 6c 65 74 65 72 3d 3d 30 20  >pIdxDeleter==0 
6b60: 29 7b 0a 20 20 20 20 46 74 73 35 43 6f 6e 66 69  ){.    Fts5Confi
6b70: 67 20 2a 70 43 6f 6e 66 69 67 20 3d 20 70 2d 3e  g *pConfig = p->
6b80: 70 43 6f 6e 66 69 67 3b 0a 20 20 20 20 66 74 73  pConfig;.    fts
6b90: 35 49 6e 64 65 78 50 72 65 70 61 72 65 53 74 6d  5IndexPrepareStm
6ba0: 74 28 70 2c 20 26 70 2d 3e 70 49 64 78 44 65 6c  t(p, &p->pIdxDel
6bb0: 65 74 65 72 2c 20 73 71 6c 69 74 65 33 5f 6d 70  eter, sqlite3_mp
6bc0: 72 69 6e 74 66 28 0a 20 20 20 20 20 20 20 20 20  rintf(.         
6bd0: 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 27 25   "DELETE FROM '%
6be0: 71 27 2e 27 25 71 5f 69 64 78 27 20 57 48 45 52  q'.'%q_idx' WHER
6bf0: 45 20 73 65 67 69 64 3d 3f 22 2c 0a 20 20 20 20  E segid=?",.    
6c00: 20 20 20 20 20 20 70 43 6f 6e 66 69 67 2d 3e 7a        pConfig->z
6c10: 44 62 2c 20 70 43 6f 6e 66 69 67 2d 3e 7a 4e 61  Db, pConfig->zNa
6c20: 6d 65 0a 20 20 20 20 29 29 3b 0a 20 20 7d 0a 20  me.    ));.  }. 
6c30: 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49   if( p->rc==SQLI
6c40: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c  TE_OK ){.    sql
6c50: 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 28 70 2d  ite3_bind_int(p-
6c60: 3e 70 49 64 78 44 65 6c 65 74 65 72 2c 20 31 2c  >pIdxDeleter, 1,
6c70: 20 69 53 65 67 69 64 29 3b 0a 20 20 20 20 73 71   iSegid);.    sq
6c80: 6c 69 74 65 33 5f 73 74 65 70 28 70 2d 3e 70 49  lite3_step(p->pI
6c90: 64 78 44 65 6c 65 74 65 72 29 3b 0a 20 20 20 20  dxDeleter);.    
6ca0: 70 2d 3e 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  p->rc = sqlite3_
6cb0: 72 65 73 65 74 28 70 2d 3e 70 49 64 78 44 65 6c  reset(p->pIdxDel
6cc0: 65 74 65 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  eter);.  }.}../*
6cd0: 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 20 72 65  .** Release a re
6ce0: 66 65 72 65 6e 63 65 20 74 6f 20 61 6e 20 46 74  ference to an Ft
6cf0: 73 35 53 74 72 75 63 74 75 72 65 20 6f 62 6a 65  s5Structure obje
6d00: 63 74 20 72 65 74 75 72 6e 65 64 20 62 79 20 61  ct returned by a
6d10: 6e 20 65 61 72 6c 69 65 72 20 0a 2a 2a 20 63 61  n earlier .** ca
6d20: 6c 6c 20 74 6f 20 66 74 73 35 53 74 72 75 63 74  ll to fts5Struct
6d30: 75 72 65 52 65 61 64 28 29 20 6f 72 20 66 74 73  ureRead() or fts
6d40: 35 53 74 72 75 63 74 75 72 65 44 65 63 6f 64 65  5StructureDecode
6d50: 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ()..*/.static vo
6d60: 69 64 20 66 74 73 35 53 74 72 75 63 74 75 72 65  id fts5Structure
6d70: 52 65 6c 65 61 73 65 28 46 74 73 35 53 74 72 75  Release(Fts5Stru
6d80: 63 74 75 72 65 20 2a 70 53 74 72 75 63 74 29 7b  cture *pStruct){
6d90: 0a 20 20 69 66 28 20 70 53 74 72 75 63 74 20 26  .  if( pStruct &
6da0: 26 20 30 3e 3d 28 2d 2d 70 53 74 72 75 63 74 2d  & 0>=(--pStruct-
6db0: 3e 6e 52 65 66 29 20 29 7b 0a 20 20 20 20 69 6e  >nRef) ){.    in
6dc0: 74 20 69 3b 0a 20 20 20 20 61 73 73 65 72 74 28  t i;.    assert(
6dd0: 20 70 53 74 72 75 63 74 2d 3e 6e 52 65 66 3d 3d   pStruct->nRef==
6de0: 30 20 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  0 );.    for(i=0
6df0: 3b 20 69 3c 70 53 74 72 75 63 74 2d 3e 6e 4c 65  ; i<pStruct->nLe
6e00: 76 65 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  vel; i++){.     
6e10: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 53   sqlite3_free(pS
6e20: 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 5d  truct->aLevel[i]
6e30: 2e 61 53 65 67 29 3b 0a 20 20 20 20 7d 0a 20 20  .aSeg);.    }.  
6e40: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
6e50: 53 74 72 75 63 74 29 3b 0a 20 20 7d 0a 7d 0a 0a  Struct);.  }.}..
6e60: 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
6e70: 53 74 72 75 63 74 75 72 65 52 65 66 28 46 74 73  StructureRef(Fts
6e80: 35 53 74 72 75 63 74 75 72 65 20 2a 70 53 74 72  5Structure *pStr
6e90: 75 63 74 29 7b 0a 20 20 70 53 74 72 75 63 74 2d  uct){.  pStruct-
6ea0: 3e 6e 52 65 66 2b 2b 3b 0a 7d 0a 0a 2f 2a 0a 2a  >nRef++;.}../*.*
6eb0: 2a 20 44 65 73 65 72 69 61 6c 69 7a 65 20 61 6e  * Deserialize an
6ec0: 64 20 72 65 74 75 72 6e 20 74 68 65 20 73 74 72  d return the str
6ed0: 75 63 74 75 72 65 20 72 65 63 6f 72 64 20 63 75  ucture record cu
6ee0: 72 72 65 6e 74 6c 79 20 73 74 6f 72 65 64 20 69  rrently stored i
6ef0: 6e 20 73 65 72 69 61 6c 69 7a 65 64 0a 2a 2a 20  n serialized.** 
6f00: 66 6f 72 6d 20 77 69 74 68 69 6e 20 62 75 66 66  form within buff
6f10: 65 72 20 70 44 61 74 61 2f 6e 44 61 74 61 2e 0a  er pData/nData..
6f20: 2a 2a 0a 2a 2a 20 54 68 65 20 46 74 73 35 53 74  **.** The Fts5St
6f30: 72 75 63 74 75 72 65 2e 61 4c 65 76 65 6c 5b 5d  ructure.aLevel[]
6f40: 20 61 6e 64 20 65 61 63 68 20 46 74 73 35 53 74   and each Fts5St
6f50: 72 75 63 74 75 72 65 4c 65 76 65 6c 2e 61 53 65  ructureLevel.aSe
6f60: 67 5b 5d 20 61 72 72 61 79 0a 2a 2a 20 61 72 65  g[] array.** are
6f70: 20 6f 76 65 72 2d 61 6c 6c 6f 63 61 74 65 64 20   over-allocated 
6f80: 62 79 20 6f 6e 65 20 73 6c 6f 74 2e 20 54 68 69  by one slot. Thi
6f90: 73 20 61 6c 6c 6f 77 73 20 74 68 65 20 73 74 72  s allows the str
6fa0: 75 63 74 75 72 65 20 63 6f 6e 74 65 6e 74 73 0a  ucture contents.
6fb0: 2a 2a 20 74 6f 20 62 65 20 6d 6f 72 65 20 65 61  ** to be more ea
6fc0: 73 69 6c 79 20 65 64 69 74 65 64 2e 0a 2a 2a 0a  sily edited..**.
6fd0: 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  ** If an error o
6fe0: 63 63 75 72 73 2c 20 2a 70 70 4f 75 74 20 69 73  ccurs, *ppOut is
6ff0: 20 73 65 74 20 74 6f 20 4e 55 4c 4c 20 61 6e 64   set to NULL and
7000: 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72   an SQLite error
7010: 20 63 6f 64 65 0a 2a 2a 20 72 65 74 75 72 6e 65   code.** returne
7020: 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 2a 70  d. Otherwise, *p
7030: 70 4f 75 74 20 69 73 20 73 65 74 20 74 6f 20 70  pOut is set to p
7040: 6f 69 6e 74 20 74 6f 20 74 68 65 20 6e 65 77 20  oint to the new 
7050: 6f 62 6a 65 63 74 20 61 6e 64 0a 2a 2a 20 53 51  object and.** SQ
7060: 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64  LITE_OK returned
7070: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
7080: 66 74 73 35 53 74 72 75 63 74 75 72 65 44 65 63  fts5StructureDec
7090: 6f 64 65 28 0a 20 20 63 6f 6e 73 74 20 75 38 20  ode(.  const u8 
70a0: 2a 70 44 61 74 61 2c 20 20 20 20 20 20 20 20 20  *pData,         
70b0: 20 20 20 20 20 20 20 2f 2a 20 42 75 66 66 65 72         /* Buffer
70c0: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 73 65 72 69   containing seri
70d0: 61 6c 69 7a 65 64 20 73 74 72 75 63 74 75 72 65  alized structure
70e0: 20 2a 2f 0a 20 20 69 6e 74 20 6e 44 61 74 61 2c   */.  int nData,
70f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7100: 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
7110: 20 62 75 66 66 65 72 20 70 44 61 74 61 20 69 6e   buffer pData in
7120: 20 62 79 74 65 73 20 2a 2f 0a 20 20 69 6e 74 20   bytes */.  int 
7130: 2a 70 69 43 6f 6f 6b 69 65 2c 20 20 20 20 20 20  *piCookie,      
7140: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
7150: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 63 6f 6f  onfiguration coo
7160: 6b 69 65 20 76 61 6c 75 65 20 2a 2f 0a 20 20 46  kie value */.  F
7170: 74 73 35 53 74 72 75 63 74 75 72 65 20 2a 2a 70  ts5Structure **p
7180: 70 4f 75 74 20 20 20 20 20 20 20 20 20 20 20 2f  pOut           /
7190: 2a 20 4f 55 54 3a 20 44 65 73 65 72 69 61 6c 69  * OUT: Deseriali
71a0: 7a 65 64 20 6f 62 6a 65 63 74 20 2a 2f 0a 29 7b  zed object */.){
71b0: 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
71c0: 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 69 20 3d  TE_OK;.  int i =
71d0: 20 30 3b 0a 20 20 69 6e 74 20 69 4c 76 6c 3b 0a   0;.  int iLvl;.
71e0: 20 20 69 6e 74 20 6e 4c 65 76 65 6c 20 3d 20 30    int nLevel = 0
71f0: 3b 0a 20 20 69 6e 74 20 6e 53 65 67 6d 65 6e 74  ;.  int nSegment
7200: 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 42 79 74   = 0;.  int nByt
7210: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
7220: 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73          /* Bytes
7230: 20 6f 66 20 73 70 61 63 65 20 74 6f 20 61 6c 6c   of space to all
7240: 6f 63 61 74 65 20 61 74 20 70 52 65 74 20 2a 2f  ocate at pRet */
7250: 0a 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65  .  Fts5Structure
7260: 20 2a 70 52 65 74 20 3d 20 30 3b 20 20 20 20 20   *pRet = 0;     
7270: 20 20 20 2f 2a 20 53 74 72 75 63 74 75 72 65 20     /* Structure 
7280: 6f 62 6a 65 63 74 20 74 6f 20 72 65 74 75 72 6e  object to return
7290: 20 2a 2f 0a 0a 20 20 2f 2a 20 47 72 61 62 20 74   */..  /* Grab t
72a0: 68 65 20 63 6f 6f 6b 69 65 20 76 61 6c 75 65 20  he cookie value 
72b0: 2a 2f 0a 20 20 69 66 28 20 70 69 43 6f 6f 6b 69  */.  if( piCooki
72c0: 65 20 29 20 2a 70 69 43 6f 6f 6b 69 65 20 3d 20  e ) *piCookie = 
72d0: 73 71 6c 69 74 65 33 46 74 73 35 47 65 74 33 32  sqlite3Fts5Get32
72e0: 28 70 44 61 74 61 29 3b 0a 20 20 69 20 3d 20 34  (pData);.  i = 4
72f0: 3b 0a 0a 20 20 2f 2a 20 52 65 61 64 20 74 68 65  ;..  /* Read the
7300: 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66   total number of
7310: 20 6c 65 76 65 6c 73 20 61 6e 64 20 73 65 67 6d   levels and segm
7320: 65 6e 74 73 20 66 72 6f 6d 20 74 68 65 20 73 74  ents from the st
7330: 61 72 74 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20  art of the.  ** 
7340: 73 74 72 75 63 74 75 72 65 20 72 65 63 6f 72 64  structure record
7350: 2e 20 20 2a 2f 0a 20 20 69 20 2b 3d 20 66 74 73  .  */.  i += fts
7360: 35 47 65 74 56 61 72 69 6e 74 33 32 28 26 70 44  5GetVarint32(&pD
7370: 61 74 61 5b 69 5d 2c 20 6e 4c 65 76 65 6c 29 3b  ata[i], nLevel);
7380: 0a 20 20 69 20 2b 3d 20 66 74 73 35 47 65 74 56  .  i += fts5GetV
7390: 61 72 69 6e 74 33 32 28 26 70 44 61 74 61 5b 69  arint32(&pData[i
73a0: 5d 2c 20 6e 53 65 67 6d 65 6e 74 29 3b 0a 20 20  ], nSegment);.  
73b0: 6e 42 79 74 65 20 3d 20 28 0a 20 20 20 20 20 20  nByte = (.      
73c0: 73 69 7a 65 6f 66 28 46 74 73 35 53 74 72 75 63  sizeof(Fts5Struc
73d0: 74 75 72 65 29 20 2b 20 20 20 20 20 20 20 20 20  ture) +         
73e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61             /* Ma
73f0: 69 6e 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a  in structure */.
7400: 20 20 20 20 20 20 73 69 7a 65 6f 66 28 46 74 73        sizeof(Fts
7410: 35 53 74 72 75 63 74 75 72 65 4c 65 76 65 6c 29  5StructureLevel)
7420: 20 2a 20 28 6e 4c 65 76 65 6c 2d 31 29 20 20 20   * (nLevel-1)   
7430: 20 2f 2a 20 61 4c 65 76 65 6c 5b 5d 20 61 72 72   /* aLevel[] arr
7440: 61 79 20 2a 2f 0a 20 20 29 3b 0a 20 20 70 52 65  ay */.  );.  pRe
7450: 74 20 3d 20 28 46 74 73 35 53 74 72 75 63 74 75  t = (Fts5Structu
7460: 72 65 2a 29 73 71 6c 69 74 65 33 46 74 73 35 4d  re*)sqlite3Fts5M
7470: 61 6c 6c 6f 63 5a 65 72 6f 28 26 72 63 2c 20 6e  allocZero(&rc, n
7480: 42 79 74 65 29 3b 0a 0a 20 20 69 66 28 20 70 52  Byte);..  if( pR
7490: 65 74 20 29 7b 0a 20 20 20 20 70 52 65 74 2d 3e  et ){.    pRet->
74a0: 6e 52 65 66 20 3d 20 31 3b 0a 20 20 20 20 70 52  nRef = 1;.    pR
74b0: 65 74 2d 3e 6e 4c 65 76 65 6c 20 3d 20 6e 4c 65  et->nLevel = nLe
74c0: 76 65 6c 3b 0a 20 20 20 20 70 52 65 74 2d 3e 6e  vel;.    pRet->n
74d0: 53 65 67 6d 65 6e 74 20 3d 20 6e 53 65 67 6d 65  Segment = nSegme
74e0: 6e 74 3b 0a 20 20 20 20 69 20 2b 3d 20 73 71 6c  nt;.    i += sql
74f0: 69 74 65 33 46 74 73 35 47 65 74 56 61 72 69 6e  ite3Fts5GetVarin
7500: 74 28 26 70 44 61 74 61 5b 69 5d 2c 20 26 70 52  t(&pData[i], &pR
7510: 65 74 2d 3e 6e 57 72 69 74 65 43 6f 75 6e 74 65  et->nWriteCounte
7520: 72 29 3b 0a 0a 20 20 20 20 66 6f 72 28 69 4c 76  r);..    for(iLv
7530: 6c 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f  l=0; rc==SQLITE_
7540: 4f 4b 20 26 26 20 69 4c 76 6c 3c 6e 4c 65 76 65  OK && iLvl<nLeve
7550: 6c 3b 20 69 4c 76 6c 2b 2b 29 7b 0a 20 20 20 20  l; iLvl++){.    
7560: 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65 4c    Fts5StructureL
7570: 65 76 65 6c 20 2a 70 4c 76 6c 20 3d 20 26 70 52  evel *pLvl = &pR
7580: 65 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d  et->aLevel[iLvl]
7590: 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 54 6f 74  ;.      int nTot
75a0: 61 6c 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 53  al;.      int iS
75b0: 65 67 3b 0a 0a 20 20 20 20 20 20 69 20 2b 3d 20  eg;..      i += 
75c0: 66 74 73 35 47 65 74 56 61 72 69 6e 74 33 32 28  fts5GetVarint32(
75d0: 26 70 44 61 74 61 5b 69 5d 2c 20 70 4c 76 6c 2d  &pData[i], pLvl-
75e0: 3e 6e 4d 65 72 67 65 29 3b 0a 20 20 20 20 20 20  >nMerge);.      
75f0: 69 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69  i += fts5GetVari
7600: 6e 74 33 32 28 26 70 44 61 74 61 5b 69 5d 2c 20  nt32(&pData[i], 
7610: 6e 54 6f 74 61 6c 29 3b 0a 20 20 20 20 20 20 61  nTotal);.      a
7620: 73 73 65 72 74 28 20 6e 54 6f 74 61 6c 3e 3d 70  ssert( nTotal>=p
7630: 4c 76 6c 2d 3e 6e 4d 65 72 67 65 20 29 3b 0a 20  Lvl->nMerge );. 
7640: 20 20 20 20 20 70 4c 76 6c 2d 3e 61 53 65 67 20       pLvl->aSeg 
7650: 3d 20 28 46 74 73 35 53 74 72 75 63 74 75 72 65  = (Fts5Structure
7660: 53 65 67 6d 65 6e 74 2a 29 73 71 6c 69 74 65 33  Segment*)sqlite3
7670: 46 74 73 35 4d 61 6c 6c 6f 63 5a 65 72 6f 28 26  Fts5MallocZero(&
7680: 72 63 2c 20 0a 20 20 20 20 20 20 20 20 20 20 6e  rc, .          n
7690: 54 6f 74 61 6c 20 2a 20 73 69 7a 65 6f 66 28 46  Total * sizeof(F
76a0: 74 73 35 53 74 72 75 63 74 75 72 65 53 65 67 6d  ts5StructureSegm
76b0: 65 6e 74 29 0a 20 20 20 20 20 20 29 3b 0a 0a 20  ent).      );.. 
76c0: 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
76d0: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
76e0: 20 20 70 4c 76 6c 2d 3e 6e 53 65 67 20 3d 20 6e    pLvl->nSeg = n
76f0: 54 6f 74 61 6c 3b 0a 20 20 20 20 20 20 20 20 66  Total;.        f
7700: 6f 72 28 69 53 65 67 3d 30 3b 20 69 53 65 67 3c  or(iSeg=0; iSeg<
7710: 6e 54 6f 74 61 6c 3b 20 69 53 65 67 2b 2b 29 7b  nTotal; iSeg++){
7720: 0a 20 20 20 20 20 20 20 20 20 20 69 20 2b 3d 20  .          i += 
7730: 66 74 73 35 47 65 74 56 61 72 69 6e 74 33 32 28  fts5GetVarint32(
7740: 26 70 44 61 74 61 5b 69 5d 2c 20 70 4c 76 6c 2d  &pData[i], pLvl-
7750: 3e 61 53 65 67 5b 69 53 65 67 5d 2e 69 53 65 67  >aSeg[iSeg].iSeg
7760: 69 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  id);.          i
7770: 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e   += fts5GetVarin
7780: 74 33 32 28 26 70 44 61 74 61 5b 69 5d 2c 20 70  t32(&pData[i], p
7790: 4c 76 6c 2d 3e 61 53 65 67 5b 69 53 65 67 5d 2e  Lvl->aSeg[iSeg].
77a0: 70 67 6e 6f 46 69 72 73 74 29 3b 0a 20 20 20 20  pgnoFirst);.    
77b0: 20 20 20 20 20 20 69 20 2b 3d 20 66 74 73 35 47        i += fts5G
77c0: 65 74 56 61 72 69 6e 74 33 32 28 26 70 44 61 74  etVarint32(&pDat
77d0: 61 5b 69 5d 2c 20 70 4c 76 6c 2d 3e 61 53 65 67  a[i], pLvl->aSeg
77e0: 5b 69 53 65 67 5d 2e 70 67 6e 6f 4c 61 73 74 29  [iSeg].pgnoLast)
77f0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
7800: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
7810: 20 66 74 73 35 53 74 72 75 63 74 75 72 65 52 65   fts5StructureRe
7820: 6c 65 61 73 65 28 70 52 65 74 29 3b 0a 20 20 20  lease(pRet);.   
7830: 20 20 20 20 20 70 52 65 74 20 3d 20 30 3b 0a 20       pRet = 0;. 
7840: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
7850: 0a 0a 20 20 2a 70 70 4f 75 74 20 3d 20 70 52 65  ..  *ppOut = pRe
7860: 74 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  t;.  return rc;.
7870: 7d 0a 0a 2f 2a 0a 2a 2a 0a 2a 2f 0a 73 74 61 74  }../*.**.*/.stat
7880: 69 63 20 76 6f 69 64 20 66 74 73 35 53 74 72 75  ic void fts5Stru
7890: 63 74 75 72 65 41 64 64 4c 65 76 65 6c 28 69 6e  ctureAddLevel(in
78a0: 74 20 2a 70 52 63 2c 20 46 74 73 35 53 74 72 75  t *pRc, Fts5Stru
78b0: 63 74 75 72 65 20 2a 2a 70 70 53 74 72 75 63 74  cture **ppStruct
78c0: 29 7b 0a 20 20 69 66 28 20 2a 70 52 63 3d 3d 53  ){.  if( *pRc==S
78d0: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
78e0: 46 74 73 35 53 74 72 75 63 74 75 72 65 20 2a 70  Fts5Structure *p
78f0: 53 74 72 75 63 74 20 3d 20 2a 70 70 53 74 72 75  Struct = *ppStru
7900: 63 74 3b 0a 20 20 20 20 69 6e 74 20 6e 4c 65 76  ct;.    int nLev
7910: 65 6c 20 3d 20 70 53 74 72 75 63 74 2d 3e 6e 4c  el = pStruct->nL
7920: 65 76 65 6c 3b 0a 20 20 20 20 69 6e 74 20 6e 42  evel;.    int nB
7930: 79 74 65 20 3d 20 28 0a 20 20 20 20 20 20 20 20  yte = (.        
7940: 73 69 7a 65 6f 66 28 46 74 73 35 53 74 72 75 63  sizeof(Fts5Struc
7950: 74 75 72 65 29 20 2b 20 20 20 20 20 20 20 20 20  ture) +         
7960: 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 69 6e           /* Main
7970: 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20   structure */.  
7980: 20 20 20 20 20 20 73 69 7a 65 6f 66 28 46 74 73        sizeof(Fts
7990: 35 53 74 72 75 63 74 75 72 65 4c 65 76 65 6c 29  5StructureLevel)
79a0: 20 2a 20 28 6e 4c 65 76 65 6c 2b 31 29 20 20 2f   * (nLevel+1)  /
79b0: 2a 20 61 4c 65 76 65 6c 5b 5d 20 61 72 72 61 79  * aLevel[] array
79c0: 20 2a 2f 0a 20 20 20 20 29 3b 0a 0a 20 20 20 20   */.    );..    
79d0: 70 53 74 72 75 63 74 20 3d 20 73 71 6c 69 74 65  pStruct = sqlite
79e0: 33 5f 72 65 61 6c 6c 6f 63 28 70 53 74 72 75 63  3_realloc(pStruc
79f0: 74 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20 20 69  t, nByte);.    i
7a00: 66 28 20 70 53 74 72 75 63 74 20 29 7b 0a 20 20  f( pStruct ){.  
7a10: 20 20 20 20 6d 65 6d 73 65 74 28 26 70 53 74 72      memset(&pStr
7a20: 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 6e 4c 65 76  uct->aLevel[nLev
7a30: 65 6c 5d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 46  el], 0, sizeof(F
7a40: 74 73 35 53 74 72 75 63 74 75 72 65 4c 65 76 65  ts5StructureLeve
7a50: 6c 29 29 3b 0a 20 20 20 20 20 20 70 53 74 72 75  l));.      pStru
7a60: 63 74 2d 3e 6e 4c 65 76 65 6c 2b 2b 3b 0a 20 20  ct->nLevel++;.  
7a70: 20 20 20 20 2a 70 70 53 74 72 75 63 74 20 3d 20      *ppStruct = 
7a80: 70 53 74 72 75 63 74 3b 0a 20 20 20 20 7d 65 6c  pStruct;.    }el
7a90: 73 65 7b 0a 20 20 20 20 20 20 2a 70 52 63 20 3d  se{.      *pRc =
7aa0: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
7ab0: 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
7ac0: 2a 20 45 78 74 65 6e 64 20 6c 65 76 65 6c 20 69  * Extend level i
7ad0: 4c 76 6c 20 73 6f 20 74 68 61 74 20 74 68 65 72  Lvl so that ther
7ae0: 65 20 69 73 20 72 6f 6f 6d 20 66 6f 72 20 61 74  e is room for at
7af0: 20 6c 65 61 73 74 20 6e 45 78 74 72 61 20 6d 6f   least nExtra mo
7b00: 72 65 0a 2a 2a 20 73 65 67 6d 65 6e 74 73 2e 0a  re.** segments..
7b10: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
7b20: 74 73 35 53 74 72 75 63 74 75 72 65 45 78 74 65  ts5StructureExte
7b30: 6e 64 4c 65 76 65 6c 28 0a 20 20 69 6e 74 20 2a  ndLevel(.  int *
7b40: 70 52 63 2c 20 0a 20 20 46 74 73 35 53 74 72 75  pRc, .  Fts5Stru
7b50: 63 74 75 72 65 20 2a 70 53 74 72 75 63 74 2c 20  cture *pStruct, 
7b60: 0a 20 20 69 6e 74 20 69 4c 76 6c 2c 20 0a 20 20  .  int iLvl, .  
7b70: 69 6e 74 20 6e 45 78 74 72 61 2c 20 0a 20 20 69  int nExtra, .  i
7b80: 6e 74 20 62 49 6e 73 65 72 74 0a 29 7b 0a 20 20  nt bInsert.){.  
7b90: 69 66 28 20 2a 70 52 63 3d 3d 53 51 4c 49 54 45  if( *pRc==SQLITE
7ba0: 5f 4f 4b 20 29 7b 0a 20 20 20 20 46 74 73 35 53  _OK ){.    Fts5S
7bb0: 74 72 75 63 74 75 72 65 4c 65 76 65 6c 20 2a 70  tructureLevel *p
7bc0: 4c 76 6c 20 3d 20 26 70 53 74 72 75 63 74 2d 3e  Lvl = &pStruct->
7bd0: 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d 3b 0a 20 20  aLevel[iLvl];.  
7be0: 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65 53    Fts5StructureS
7bf0: 65 67 6d 65 6e 74 20 2a 61 4e 65 77 3b 0a 20 20  egment *aNew;.  
7c00: 20 20 69 6e 74 20 6e 42 79 74 65 3b 0a 0a 20 20    int nByte;..  
7c10: 20 20 6e 42 79 74 65 20 3d 20 28 70 4c 76 6c 2d    nByte = (pLvl-
7c20: 3e 6e 53 65 67 20 2b 20 6e 45 78 74 72 61 29 20  >nSeg + nExtra) 
7c30: 2a 20 73 69 7a 65 6f 66 28 46 74 73 35 53 74 72  * sizeof(Fts5Str
7c40: 75 63 74 75 72 65 53 65 67 6d 65 6e 74 29 3b 0a  uctureSegment);.
7c50: 20 20 20 20 61 4e 65 77 20 3d 20 73 71 6c 69 74      aNew = sqlit
7c60: 65 33 5f 72 65 61 6c 6c 6f 63 28 70 4c 76 6c 2d  e3_realloc(pLvl-
7c70: 3e 61 53 65 67 2c 20 6e 42 79 74 65 29 3b 0a 20  >aSeg, nByte);. 
7c80: 20 20 20 69 66 28 20 61 4e 65 77 20 29 7b 0a 20     if( aNew ){. 
7c90: 20 20 20 20 20 69 66 28 20 62 49 6e 73 65 72 74       if( bInsert
7ca0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 6d  ==0 ){.        m
7cb0: 65 6d 73 65 74 28 26 61 4e 65 77 5b 70 4c 76 6c  emset(&aNew[pLvl
7cc0: 2d 3e 6e 53 65 67 5d 2c 20 30 2c 20 73 69 7a 65  ->nSeg], 0, size
7cd0: 6f 66 28 46 74 73 35 53 74 72 75 63 74 75 72 65  of(Fts5Structure
7ce0: 53 65 67 6d 65 6e 74 29 20 2a 20 6e 45 78 74 72  Segment) * nExtr
7cf0: 61 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  a);.      }else{
7d00: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 4d 6f  .        int nMo
7d10: 76 65 20 3d 20 70 4c 76 6c 2d 3e 6e 53 65 67 20  ve = pLvl->nSeg 
7d20: 2a 20 73 69 7a 65 6f 66 28 46 74 73 35 53 74 72  * sizeof(Fts5Str
7d30: 75 63 74 75 72 65 53 65 67 6d 65 6e 74 29 3b 0a  uctureSegment);.
7d40: 20 20 20 20 20 20 20 20 6d 65 6d 6d 6f 76 65 28          memmove(
7d50: 26 61 4e 65 77 5b 6e 45 78 74 72 61 5d 2c 20 61  &aNew[nExtra], a
7d60: 4e 65 77 2c 20 6e 4d 6f 76 65 29 3b 0a 20 20 20  New, nMove);.   
7d70: 20 20 20 20 20 6d 65 6d 73 65 74 28 61 4e 65 77       memset(aNew
7d80: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 46 74 73 35  , 0, sizeof(Fts5
7d90: 53 74 72 75 63 74 75 72 65 53 65 67 6d 65 6e 74  StructureSegment
7da0: 29 20 2a 20 6e 45 78 74 72 61 29 3b 0a 20 20 20  ) * nExtra);.   
7db0: 20 20 20 7d 0a 20 20 20 20 20 20 70 4c 76 6c 2d     }.      pLvl-
7dc0: 3e 61 53 65 67 20 3d 20 61 4e 65 77 3b 0a 20 20  >aSeg = aNew;.  
7dd0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2a    }else{.      *
7de0: 70 52 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d  pRc = SQLITE_NOM
7df0: 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  EM;.    }.  }.}.
7e00: 0a 2f 2a 0a 2a 2a 20 52 65 61 64 2c 20 64 65 73  ./*.** Read, des
7e10: 65 72 69 61 6c 69 7a 65 20 61 6e 64 20 72 65 74  erialize and ret
7e20: 75 72 6e 20 74 68 65 20 73 74 72 75 63 74 75 72  urn the structur
7e30: 65 20 72 65 63 6f 72 64 2e 0a 2a 2a 0a 2a 2a 20  e record..**.** 
7e40: 54 68 65 20 46 74 73 35 53 74 72 75 63 74 75 72  The Fts5Structur
7e50: 65 2e 61 4c 65 76 65 6c 5b 5d 20 61 6e 64 20 65  e.aLevel[] and e
7e60: 61 63 68 20 46 74 73 35 53 74 72 75 63 74 75 72  ach Fts5Structur
7e70: 65 4c 65 76 65 6c 2e 61 53 65 67 5b 5d 20 61 72  eLevel.aSeg[] ar
7e80: 72 61 79 0a 2a 2a 20 61 72 65 20 6f 76 65 72 2d  ray.** are over-
7e90: 61 6c 6c 6f 63 61 74 65 64 20 61 73 20 64 65 73  allocated as des
7ea0: 63 72 69 62 65 64 20 66 6f 72 20 66 75 6e 63 74  cribed for funct
7eb0: 69 6f 6e 20 66 74 73 35 53 74 72 75 63 74 75 72  ion fts5Structur
7ec0: 65 44 65 63 6f 64 65 28 29 20 0a 2a 2a 20 61 62  eDecode() .** ab
7ed0: 6f 76 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  ove..**.** If an
7ee0: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 4e   error occurs, N
7ef0: 55 4c 4c 20 69 73 20 72 65 74 75 72 6e 65 64 20  ULL is returned 
7f00: 61 6e 64 20 61 6e 20 65 72 72 6f 72 20 63 6f 64  and an error cod
7f10: 65 20 6c 65 66 74 20 69 6e 20 74 68 65 0a 2a 2a  e left in the.**
7f20: 20 46 74 73 35 49 6e 64 65 78 20 68 61 6e 64 6c   Fts5Index handl
7f30: 65 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20 68  e. If an error h
7f40: 61 73 20 61 6c 72 65 61 64 79 20 6f 63 63 75 72  as already occur
7f50: 72 65 64 20 77 68 65 6e 20 74 68 69 73 20 66 75  red when this fu
7f60: 6e 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 63 61 6c  nction.** is cal
7f70: 6c 65 64 2c 20 69 74 20 69 73 20 61 20 6e 6f 2d  led, it is a no-
7f80: 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 46 74  op..*/.static Ft
7f90: 73 35 53 74 72 75 63 74 75 72 65 20 2a 66 74 73  s5Structure *fts
7fa0: 35 53 74 72 75 63 74 75 72 65 52 65 61 64 28 46  5StructureRead(F
7fb0: 74 73 35 49 6e 64 65 78 20 2a 70 29 7b 0a 20 20  ts5Index *p){.  
7fc0: 46 74 73 35 43 6f 6e 66 69 67 20 2a 70 43 6f 6e  Fts5Config *pCon
7fd0: 66 69 67 20 3d 20 70 2d 3e 70 43 6f 6e 66 69 67  fig = p->pConfig
7fe0: 3b 0a 20 20 46 74 73 35 53 74 72 75 63 74 75 72  ;.  Fts5Structur
7ff0: 65 20 2a 70 52 65 74 20 3d 20 30 3b 20 20 20 20  e *pRet = 0;    
8000: 20 20 20 20 2f 2a 20 4f 62 6a 65 63 74 20 74 6f      /* Object to
8010: 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20 69 6e 74   return */.  int
8020: 20 69 43 6f 6f 6b 69 65 3b 20 20 20 20 20 20 20   iCookie;       
8030: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
8040: 43 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 63 6f  Configuration co
8050: 6f 6b 69 65 20 2a 2f 0a 20 20 46 74 73 35 44 61  okie */.  Fts5Da
8060: 74 61 20 2a 70 44 61 74 61 3b 0a 0a 20 20 70 44  ta *pData;..  pD
8070: 61 74 61 20 3d 20 66 74 73 35 44 61 74 61 52 65  ata = fts5DataRe
8080: 61 64 28 70 2c 20 46 54 53 35 5f 53 54 52 55 43  ad(p, FTS5_STRUC
8090: 54 55 52 45 5f 52 4f 57 49 44 29 3b 0a 20 20 69  TURE_ROWID);.  i
80a0: 66 28 20 70 2d 3e 72 63 20 29 20 72 65 74 75 72  f( p->rc ) retur
80b0: 6e 20 30 3b 0a 20 20 2f 2a 20 54 4f 44 4f 3a 20  n 0;.  /* TODO: 
80c0: 44 6f 20 77 65 20 6e 65 65 64 20 74 68 69 73 20  Do we need this 
80d0: 69 66 20 74 68 65 20 6c 65 61 66 2d 69 6e 64 65  if the leaf-inde
80e0: 78 20 69 73 20 61 70 70 65 6e 64 65 64 3f 20 50  x is appended? P
80f0: 72 6f 62 61 62 6c 79 2e 2e 2e 20 2a 2f 0a 20 20  robably... */.  
8100: 6d 65 6d 73 65 74 28 26 70 44 61 74 61 2d 3e 70  memset(&pData->p
8110: 5b 70 44 61 74 61 2d 3e 6e 6e 5d 2c 20 30 2c 20  [pData->nn], 0, 
8120: 46 54 53 35 5f 44 41 54 41 5f 50 41 44 44 49 4e  FTS5_DATA_PADDIN
8130: 47 29 3b 0a 20 20 70 2d 3e 72 63 20 3d 20 66 74  G);.  p->rc = ft
8140: 73 35 53 74 72 75 63 74 75 72 65 44 65 63 6f 64  s5StructureDecod
8150: 65 28 70 44 61 74 61 2d 3e 70 2c 20 70 44 61 74  e(pData->p, pDat
8160: 61 2d 3e 6e 6e 2c 20 26 69 43 6f 6f 6b 69 65 2c  a->nn, &iCookie,
8170: 20 26 70 52 65 74 29 3b 0a 20 20 69 66 28 20 70   &pRet);.  if( p
8180: 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
8190: 26 26 20 70 43 6f 6e 66 69 67 2d 3e 69 43 6f 6f  && pConfig->iCoo
81a0: 6b 69 65 21 3d 69 43 6f 6f 6b 69 65 20 29 7b 0a  kie!=iCookie ){.
81b0: 20 20 20 20 70 2d 3e 72 63 20 3d 20 73 71 6c 69      p->rc = sqli
81c0: 74 65 33 46 74 73 35 43 6f 6e 66 69 67 4c 6f 61  te3Fts5ConfigLoa
81d0: 64 28 70 43 6f 6e 66 69 67 2c 20 69 43 6f 6f 6b  d(pConfig, iCook
81e0: 69 65 29 3b 0a 20 20 7d 0a 0a 20 20 66 74 73 35  ie);.  }..  fts5
81f0: 44 61 74 61 52 65 6c 65 61 73 65 28 70 44 61 74  DataRelease(pDat
8200: 61 29 3b 0a 20 20 69 66 28 20 70 2d 3e 72 63 21  a);.  if( p->rc!
8210: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
8220: 20 20 66 74 73 35 53 74 72 75 63 74 75 72 65 52    fts5StructureR
8230: 65 6c 65 61 73 65 28 70 52 65 74 29 3b 0a 20 20  elease(pRet);.  
8240: 20 20 70 52 65 74 20 3d 20 30 3b 0a 20 20 7d 0a    pRet = 0;.  }.
8250: 20 20 72 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d    return pRet;.}
8260: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
8270: 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20  he total number 
8280: 6f 66 20 73 65 67 6d 65 6e 74 73 20 69 6e 20 69  of segments in i
8290: 6e 64 65 78 20 73 74 72 75 63 74 75 72 65 20 70  ndex structure p
82a0: 53 74 72 75 63 74 2e 20 54 68 69 73 0a 2a 2a 20  Struct. This.** 
82b0: 66 75 6e 63 74 69 6f 6e 20 69 73 20 6f 6e 6c 79  function is only
82c0: 20 65 76 65 72 20 75 73 65 64 20 61 73 20 70 61   ever used as pa
82d0: 72 74 20 6f 66 20 61 73 73 65 72 74 28 29 20 63  rt of assert() c
82e0: 6f 6e 64 69 74 69 6f 6e 73 2e 0a 2a 2f 0a 23 69  onditions..*/.#i
82f0: 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
8300: 47 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73  G.static int fts
8310: 35 53 74 72 75 63 74 75 72 65 43 6f 75 6e 74 53  5StructureCountS
8320: 65 67 6d 65 6e 74 73 28 46 74 73 35 53 74 72 75  egments(Fts5Stru
8330: 63 74 75 72 65 20 2a 70 53 74 72 75 63 74 29 7b  cture *pStruct){
8340: 0a 20 20 69 6e 74 20 6e 53 65 67 6d 65 6e 74 20  .  int nSegment 
8350: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
8360: 20 20 20 2f 2a 20 54 6f 74 61 6c 20 6e 75 6d 62     /* Total numb
8370: 65 72 20 6f 66 20 73 65 67 6d 65 6e 74 73 20 2a  er of segments *
8380: 2f 0a 20 20 69 66 28 20 70 53 74 72 75 63 74 20  /.  if( pStruct 
8390: 29 7b 0a 20 20 20 20 69 6e 74 20 69 4c 76 6c 3b  ){.    int iLvl;
83a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
83b0: 20 20 20 20 20 2f 2a 20 55 73 65 64 20 74 6f 20       /* Used to 
83c0: 69 74 65 72 61 74 65 20 74 68 72 6f 75 67 68 20  iterate through 
83d0: 6c 65 76 65 6c 73 20 2a 2f 0a 20 20 20 20 66 6f  levels */.    fo
83e0: 72 28 69 4c 76 6c 3d 30 3b 20 69 4c 76 6c 3c 70  r(iLvl=0; iLvl<p
83f0: 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 3b 20  Struct->nLevel; 
8400: 69 4c 76 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 6e  iLvl++){.      n
8410: 53 65 67 6d 65 6e 74 20 2b 3d 20 70 53 74 72 75  Segment += pStru
8420: 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d  ct->aLevel[iLvl]
8430: 2e 6e 53 65 67 3b 0a 20 20 20 20 7d 0a 20 20 7d  .nSeg;.    }.  }
8440: 0a 0a 20 20 72 65 74 75 72 6e 20 6e 53 65 67 6d  ..  return nSegm
8450: 65 6e 74 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  ent;.}.#endif../
8460: 2a 0a 2a 2a 20 53 65 72 69 61 6c 69 7a 65 20 61  *.** Serialize a
8470: 6e 64 20 73 74 6f 72 65 20 74 68 65 20 22 73 74  nd store the "st
8480: 72 75 63 74 75 72 65 22 20 72 65 63 6f 72 64 2e  ructure" record.
8490: 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72  .**.** If an err
84a0: 6f 72 20 6f 63 63 75 72 73 2c 20 6c 65 61 76 65  or occurs, leave
84b0: 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69   an error code i
84c0: 6e 20 74 68 65 20 46 74 73 35 49 6e 64 65 78 20  n the Fts5Index 
84d0: 6f 62 6a 65 63 74 2e 20 49 66 20 61 6e 0a 2a 2a  object. If an.**
84e0: 20 65 72 72 6f 72 20 68 61 73 20 61 6c 72 65 61   error has alrea
84f0: 64 79 20 6f 63 63 75 72 72 65 64 2c 20 74 68 69  dy occurred, thi
8500: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20  s function is a 
8510: 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63  no-op..*/.static
8520: 20 76 6f 69 64 20 66 74 73 35 53 74 72 75 63 74   void fts5Struct
8530: 75 72 65 57 72 69 74 65 28 46 74 73 35 49 6e 64  ureWrite(Fts5Ind
8540: 65 78 20 2a 70 2c 20 46 74 73 35 53 74 72 75 63  ex *p, Fts5Struc
8550: 74 75 72 65 20 2a 70 53 74 72 75 63 74 29 7b 0a  ture *pStruct){.
8560: 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c    if( p->rc==SQL
8570: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 46 74  ITE_OK ){.    Ft
8580: 73 35 42 75 66 66 65 72 20 62 75 66 3b 20 20 20  s5Buffer buf;   
8590: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42              /* B
85a0: 75 66 66 65 72 20 74 6f 20 73 65 72 69 61 6c 69  uffer to seriali
85b0: 7a 65 20 72 65 63 6f 72 64 20 69 6e 74 6f 20 2a  ze record into *
85c0: 2f 0a 20 20 20 20 69 6e 74 20 69 4c 76 6c 3b 20  /.    int iLvl; 
85d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
85e0: 20 20 20 20 2f 2a 20 55 73 65 64 20 74 6f 20 69      /* Used to i
85f0: 74 65 72 61 74 65 20 74 68 72 6f 75 67 68 20 6c  terate through l
8600: 65 76 65 6c 73 20 2a 2f 0a 20 20 20 20 69 6e 74  evels */.    int
8610: 20 69 43 6f 6f 6b 69 65 3b 20 20 20 20 20 20 20   iCookie;       
8620: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f             /* Co
8630: 6f 6b 69 65 20 76 61 6c 75 65 20 74 6f 20 73 74  okie value to st
8640: 6f 72 65 20 2a 2f 0a 0a 20 20 20 20 61 73 73 65  ore */..    asse
8650: 72 74 28 20 70 53 74 72 75 63 74 2d 3e 6e 53 65  rt( pStruct->nSe
8660: 67 6d 65 6e 74 3d 3d 66 74 73 35 53 74 72 75 63  gment==fts5Struc
8670: 74 75 72 65 43 6f 75 6e 74 53 65 67 6d 65 6e 74  tureCountSegment
8680: 73 28 70 53 74 72 75 63 74 29 20 29 3b 0a 20 20  s(pStruct) );.  
8690: 20 20 6d 65 6d 73 65 74 28 26 62 75 66 2c 20 30    memset(&buf, 0
86a0: 2c 20 73 69 7a 65 6f 66 28 46 74 73 35 42 75 66  , sizeof(Fts5Buf
86b0: 66 65 72 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 41  fer));..    /* A
86c0: 70 70 65 6e 64 20 74 68 65 20 63 75 72 72 65 6e  ppend the curren
86d0: 74 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20  t configuration 
86e0: 63 6f 6f 6b 69 65 20 2a 2f 0a 20 20 20 20 69 43  cookie */.    iC
86f0: 6f 6f 6b 69 65 20 3d 20 70 2d 3e 70 43 6f 6e 66  ookie = p->pConf
8700: 69 67 2d 3e 69 43 6f 6f 6b 69 65 3b 0a 20 20 20  ig->iCookie;.   
8710: 20 69 66 28 20 69 43 6f 6f 6b 69 65 3c 30 20 29   if( iCookie<0 )
8720: 20 69 43 6f 6f 6b 69 65 20 3d 20 30 3b 0a 20 20   iCookie = 0;.  
8730: 20 20 66 74 73 35 42 75 66 66 65 72 41 70 70 65    fts5BufferAppe
8740: 6e 64 33 32 28 26 70 2d 3e 72 63 2c 20 26 62 75  nd32(&p->rc, &bu
8750: 66 2c 20 69 43 6f 6f 6b 69 65 29 3b 0a 0a 20 20  f, iCookie);..  
8760: 20 20 66 74 73 35 42 75 66 66 65 72 41 70 70 65    fts5BufferAppe
8770: 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c  ndVarint(&p->rc,
8780: 20 26 62 75 66 2c 20 70 53 74 72 75 63 74 2d 3e   &buf, pStruct->
8790: 6e 4c 65 76 65 6c 29 3b 0a 20 20 20 20 66 74 73  nLevel);.    fts
87a0: 35 42 75 66 66 65 72 41 70 70 65 6e 64 56 61 72  5BufferAppendVar
87b0: 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26 62 75 66  int(&p->rc, &buf
87c0: 2c 20 70 53 74 72 75 63 74 2d 3e 6e 53 65 67 6d  , pStruct->nSegm
87d0: 65 6e 74 29 3b 0a 20 20 20 20 66 74 73 35 42 75  ent);.    fts5Bu
87e0: 66 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e 74  fferAppendVarint
87f0: 28 26 70 2d 3e 72 63 2c 20 26 62 75 66 2c 20 28  (&p->rc, &buf, (
8800: 69 36 34 29 70 53 74 72 75 63 74 2d 3e 6e 57 72  i64)pStruct->nWr
8810: 69 74 65 43 6f 75 6e 74 65 72 29 3b 0a 0a 20 20  iteCounter);..  
8820: 20 20 66 6f 72 28 69 4c 76 6c 3d 30 3b 20 69 4c    for(iLvl=0; iL
8830: 76 6c 3c 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76  vl<pStruct->nLev
8840: 65 6c 3b 20 69 4c 76 6c 2b 2b 29 7b 0a 20 20 20  el; iLvl++){.   
8850: 20 20 20 69 6e 74 20 69 53 65 67 3b 20 20 20 20     int iSeg;    
8860: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8870: 20 2f 2a 20 55 73 65 64 20 74 6f 20 69 74 65 72   /* Used to iter
8880: 61 74 65 20 74 68 72 6f 75 67 68 20 73 65 67 6d  ate through segm
8890: 65 6e 74 73 20 2a 2f 0a 20 20 20 20 20 20 46 74  ents */.      Ft
88a0: 73 35 53 74 72 75 63 74 75 72 65 4c 65 76 65 6c  s5StructureLevel
88b0: 20 2a 70 4c 76 6c 20 3d 20 26 70 53 74 72 75 63   *pLvl = &pStruc
88c0: 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d 3b  t->aLevel[iLvl];
88d0: 0a 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65  .      fts5Buffe
88e0: 72 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26 70  rAppendVarint(&p
88f0: 2d 3e 72 63 2c 20 26 62 75 66 2c 20 70 4c 76 6c  ->rc, &buf, pLvl
8900: 2d 3e 6e 4d 65 72 67 65 29 3b 0a 20 20 20 20 20  ->nMerge);.     
8910: 20 66 74 73 35 42 75 66 66 65 72 41 70 70 65 6e   fts5BufferAppen
8920: 64 56 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20  dVarint(&p->rc, 
8930: 26 62 75 66 2c 20 70 4c 76 6c 2d 3e 6e 53 65 67  &buf, pLvl->nSeg
8940: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
8950: 20 70 4c 76 6c 2d 3e 6e 4d 65 72 67 65 3c 3d 70   pLvl->nMerge<=p
8960: 4c 76 6c 2d 3e 6e 53 65 67 20 29 3b 0a 0a 20 20  Lvl->nSeg );..  
8970: 20 20 20 20 66 6f 72 28 69 53 65 67 3d 30 3b 20      for(iSeg=0; 
8980: 69 53 65 67 3c 70 4c 76 6c 2d 3e 6e 53 65 67 3b  iSeg<pLvl->nSeg;
8990: 20 69 53 65 67 2b 2b 29 7b 0a 20 20 20 20 20 20   iSeg++){.      
89a0: 20 20 66 74 73 35 42 75 66 66 65 72 41 70 70 65    fts5BufferAppe
89b0: 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c  ndVarint(&p->rc,
89c0: 20 26 62 75 66 2c 20 70 4c 76 6c 2d 3e 61 53 65   &buf, pLvl->aSe
89d0: 67 5b 69 53 65 67 5d 2e 69 53 65 67 69 64 29 3b  g[iSeg].iSegid);
89e0: 0a 20 20 20 20 20 20 20 20 66 74 73 35 42 75 66  .        fts5Buf
89f0: 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e 74 28  ferAppendVarint(
8a00: 26 70 2d 3e 72 63 2c 20 26 62 75 66 2c 20 70 4c  &p->rc, &buf, pL
8a10: 76 6c 2d 3e 61 53 65 67 5b 69 53 65 67 5d 2e 70  vl->aSeg[iSeg].p
8a20: 67 6e 6f 46 69 72 73 74 29 3b 0a 20 20 20 20 20  gnoFirst);.     
8a30: 20 20 20 66 74 73 35 42 75 66 66 65 72 41 70 70     fts5BufferApp
8a40: 65 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e 72 63  endVarint(&p->rc
8a50: 2c 20 26 62 75 66 2c 20 70 4c 76 6c 2d 3e 61 53  , &buf, pLvl->aS
8a60: 65 67 5b 69 53 65 67 5d 2e 70 67 6e 6f 4c 61 73  eg[iSeg].pgnoLas
8a70: 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  t);.      }.    
8a80: 7d 0a 0a 20 20 20 20 66 74 73 35 44 61 74 61 57  }..    fts5DataW
8a90: 72 69 74 65 28 70 2c 20 46 54 53 35 5f 53 54 52  rite(p, FTS5_STR
8aa0: 55 43 54 55 52 45 5f 52 4f 57 49 44 2c 20 62 75  UCTURE_ROWID, bu
8ab0: 66 2e 70 2c 20 62 75 66 2e 6e 29 3b 0a 20 20 20  f.p, buf.n);.   
8ac0: 20 66 74 73 35 42 75 66 66 65 72 46 72 65 65 28   fts5BufferFree(
8ad0: 26 62 75 66 29 3b 0a 20 20 7d 0a 7d 0a 0a 23 69  &buf);.  }.}..#i
8ae0: 66 20 30 0a 73 74 61 74 69 63 20 76 6f 69 64 20  f 0.static void 
8af0: 66 74 73 35 44 65 62 75 67 53 74 72 75 63 74 75  fts5DebugStructu
8b00: 72 65 28 69 6e 74 2a 2c 46 74 73 35 42 75 66 66  re(int*,Fts5Buff
8b10: 65 72 2a 2c 46 74 73 35 53 74 72 75 63 74 75 72  er*,Fts5Structur
8b20: 65 2a 29 3b 0a 73 74 61 74 69 63 20 76 6f 69 64  e*);.static void
8b30: 20 66 74 73 35 50 72 69 6e 74 53 74 72 75 63 74   fts5PrintStruct
8b40: 75 72 65 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  ure(const char *
8b50: 7a 43 61 70 74 69 6f 6e 2c 20 46 74 73 35 53 74  zCaption, Fts5St
8b60: 72 75 63 74 75 72 65 20 2a 70 53 74 72 75 63 74  ructure *pStruct
8b70: 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
8b80: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 46 74 73 35 42  LITE_OK;.  Fts5B
8b90: 75 66 66 65 72 20 62 75 66 3b 0a 20 20 6d 65 6d  uffer buf;.  mem
8ba0: 73 65 74 28 26 62 75 66 2c 20 30 2c 20 73 69 7a  set(&buf, 0, siz
8bb0: 65 6f 66 28 62 75 66 29 29 3b 0a 20 20 66 74 73  eof(buf));.  fts
8bc0: 35 44 65 62 75 67 53 74 72 75 63 74 75 72 65 28  5DebugStructure(
8bd0: 26 72 63 2c 20 26 62 75 66 2c 20 70 53 74 72 75  &rc, &buf, pStru
8be0: 63 74 29 3b 0a 20 20 66 70 72 69 6e 74 66 28 73  ct);.  fprintf(s
8bf0: 74 64 6f 75 74 2c 20 22 25 73 3a 20 25 73 5c 6e  tdout, "%s: %s\n
8c00: 22 2c 20 7a 43 61 70 74 69 6f 6e 2c 20 62 75 66  ", zCaption, buf
8c10: 2e 70 29 3b 0a 20 20 66 66 6c 75 73 68 28 73 74  .p);.  fflush(st
8c20: 64 6f 75 74 29 3b 0a 20 20 66 74 73 35 42 75 66  dout);.  fts5Buf
8c30: 66 65 72 46 72 65 65 28 26 62 75 66 29 3b 0a 7d  ferFree(&buf);.}
8c40: 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20  .#else.# define 
8c50: 66 74 73 35 50 72 69 6e 74 53 74 72 75 63 74 75  fts5PrintStructu
8c60: 72 65 28 78 2c 79 29 0a 23 65 6e 64 69 66 0a 0a  re(x,y).#endif..
8c70: 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 35 53  static int fts5S
8c80: 65 67 6d 65 6e 74 53 69 7a 65 28 46 74 73 35 53  egmentSize(Fts5S
8c90: 74 72 75 63 74 75 72 65 53 65 67 6d 65 6e 74 20  tructureSegment 
8ca0: 2a 70 53 65 67 29 7b 0a 20 20 72 65 74 75 72 6e  *pSeg){.  return
8cb0: 20 31 20 2b 20 70 53 65 67 2d 3e 70 67 6e 6f 4c   1 + pSeg->pgnoL
8cc0: 61 73 74 20 2d 20 70 53 65 67 2d 3e 70 67 6e 6f  ast - pSeg->pgno
8cd0: 46 69 72 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  First;.}../*.** 
8ce0: 52 65 74 75 72 6e 20 61 20 63 6f 70 79 20 6f 66  Return a copy of
8cf0: 20 69 6e 64 65 78 20 73 74 72 75 63 74 75 72 65   index structure
8d00: 20 70 53 74 72 75 63 74 2e 20 45 78 63 65 70 74   pStruct. Except
8d10: 2c 20 70 72 6f 6d 6f 74 65 20 61 73 20 6d 61 6e  , promote as man
8d20: 79 20 0a 2a 2a 20 73 65 67 6d 65 6e 74 73 20 61  y .** segments a
8d30: 73 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 6c 65  s possible to le
8d40: 76 65 6c 20 69 50 72 6f 6d 6f 74 65 2e 20 49 66  vel iPromote. If
8d50: 20 61 6e 20 4f 4f 4d 20 6f 63 63 75 72 73 2c 20   an OOM occurs, 
8d60: 4e 55 4c 4c 20 69 73 20 0a 2a 2a 20 72 65 74 75  NULL is .** retu
8d70: 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rned..*/.static 
8d80: 76 6f 69 64 20 66 74 73 35 53 74 72 75 63 74 75  void fts5Structu
8d90: 72 65 50 72 6f 6d 6f 74 65 54 6f 28 0a 20 20 46  rePromoteTo(.  F
8da0: 74 73 35 49 6e 64 65 78 20 2a 70 2c 0a 20 20 69  ts5Index *p,.  i
8db0: 6e 74 20 69 50 72 6f 6d 6f 74 65 2c 0a 20 20 69  nt iPromote,.  i
8dc0: 6e 74 20 73 7a 50 72 6f 6d 6f 74 65 2c 0a 20 20  nt szPromote,.  
8dd0: 46 74 73 35 53 74 72 75 63 74 75 72 65 20 2a 70  Fts5Structure *p
8de0: 53 74 72 75 63 74 0a 29 7b 0a 20 20 69 6e 74 20  Struct.){.  int 
8df0: 69 6c 2c 20 69 73 3b 0a 20 20 46 74 73 35 53 74  il, is;.  Fts5St
8e00: 72 75 63 74 75 72 65 4c 65 76 65 6c 20 2a 70 4f  ructureLevel *pO
8e10: 75 74 20 3d 20 26 70 53 74 72 75 63 74 2d 3e 61  ut = &pStruct->a
8e20: 4c 65 76 65 6c 5b 69 50 72 6f 6d 6f 74 65 5d 3b  Level[iPromote];
8e30: 0a 0a 20 20 69 66 28 20 70 4f 75 74 2d 3e 6e 4d  ..  if( pOut->nM
8e40: 65 72 67 65 3d 3d 30 20 29 7b 0a 20 20 20 20 66  erge==0 ){.    f
8e50: 6f 72 28 69 6c 3d 69 50 72 6f 6d 6f 74 65 2b 31  or(il=iPromote+1
8e60: 3b 20 69 6c 3c 70 53 74 72 75 63 74 2d 3e 6e 4c  ; il<pStruct->nL
8e70: 65 76 65 6c 3b 20 69 6c 2b 2b 29 7b 0a 20 20 20  evel; il++){.   
8e80: 20 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65     Fts5Structure
8e90: 4c 65 76 65 6c 20 2a 70 4c 76 6c 20 3d 20 26 70  Level *pLvl = &p
8ea0: 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69  Struct->aLevel[i
8eb0: 6c 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4c  l];.      if( pL
8ec0: 76 6c 2d 3e 6e 4d 65 72 67 65 20 29 20 72 65 74  vl->nMerge ) ret
8ed0: 75 72 6e 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  urn;.      for(i
8ee0: 73 3d 70 4c 76 6c 2d 3e 6e 53 65 67 2d 31 3b 20  s=pLvl->nSeg-1; 
8ef0: 69 73 3e 3d 30 3b 20 69 73 2d 2d 29 7b 0a 20 20  is>=0; is--){.  
8f00: 20 20 20 20 20 20 69 6e 74 20 73 7a 20 3d 20 66        int sz = f
8f10: 74 73 35 53 65 67 6d 65 6e 74 53 69 7a 65 28 26  ts5SegmentSize(&
8f20: 70 4c 76 6c 2d 3e 61 53 65 67 5b 69 73 5d 29 3b  pLvl->aSeg[is]);
8f30: 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 7a 3e  .        if( sz>
8f40: 73 7a 50 72 6f 6d 6f 74 65 20 29 20 72 65 74 75  szPromote ) retu
8f50: 72 6e 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35  rn;.        fts5
8f60: 53 74 72 75 63 74 75 72 65 45 78 74 65 6e 64 4c  StructureExtendL
8f70: 65 76 65 6c 28 26 70 2d 3e 72 63 2c 20 70 53 74  evel(&p->rc, pSt
8f80: 72 75 63 74 2c 20 69 50 72 6f 6d 6f 74 65 2c 20  ruct, iPromote, 
8f90: 31 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 69  1, 1);.        i
8fa0: 66 28 20 70 2d 3e 72 63 20 29 20 72 65 74 75 72  f( p->rc ) retur
8fb0: 6e 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70  n;.        memcp
8fc0: 79 28 70 4f 75 74 2d 3e 61 53 65 67 2c 20 26 70  y(pOut->aSeg, &p
8fd0: 4c 76 6c 2d 3e 61 53 65 67 5b 69 73 5d 2c 20 73  Lvl->aSeg[is], s
8fe0: 69 7a 65 6f 66 28 46 74 73 35 53 74 72 75 63 74  izeof(Fts5Struct
8ff0: 75 72 65 53 65 67 6d 65 6e 74 29 29 3b 0a 20 20  ureSegment));.  
9000: 20 20 20 20 20 20 70 4f 75 74 2d 3e 6e 53 65 67        pOut->nSeg
9010: 2b 2b 3b 0a 20 20 20 20 20 20 20 20 70 4c 76 6c  ++;.        pLvl
9020: 2d 3e 6e 53 65 67 2d 2d 3b 0a 20 20 20 20 20 20  ->nSeg--;.      
9030: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  }.    }.  }.}../
9040: 2a 0a 2a 2a 20 41 20 6e 65 77 20 73 65 67 6d 65  *.** A new segme
9050: 6e 74 20 68 61 73 20 6a 75 73 74 20 62 65 65 6e  nt has just been
9060: 20 77 72 69 74 74 65 6e 20 74 6f 20 6c 65 76 65   written to leve
9070: 6c 20 69 4c 76 6c 20 6f 66 20 69 6e 64 65 78 20  l iLvl of index 
9080: 73 74 72 75 63 74 75 72 65 0a 2a 2a 20 70 53 74  structure.** pSt
9090: 72 75 63 74 2e 20 54 68 69 73 20 66 75 6e 63 74  ruct. This funct
90a0: 69 6f 6e 20 64 65 74 65 72 6d 69 6e 65 73 20 69  ion determines i
90b0: 66 20 61 6e 79 20 73 65 67 6d 65 6e 74 73 20 73  f any segments s
90c0: 68 6f 75 6c 64 20 62 65 20 70 72 6f 6d 6f 74 65  hould be promote
90d0: 64 0a 2a 2a 20 61 73 20 61 20 72 65 73 75 6c 74  d.** as a result
90e0: 2e 20 53 65 67 6d 65 6e 74 73 20 61 72 65 20 70  . Segments are p
90f0: 72 6f 6d 6f 74 65 64 20 69 6e 20 74 77 6f 20 73  romoted in two s
9100: 63 65 6e 61 72 69 6f 73 3a 0a 2a 2a 0a 2a 2a 20  cenarios:.**.** 
9110: 20 20 61 29 20 49 66 20 74 68 65 20 73 65 67 6d    a) If the segm
9120: 65 6e 74 20 6a 75 73 74 20 77 72 69 74 74 65 6e  ent just written
9130: 20 69 73 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e   is smaller than
9140: 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 73 65 67   one or more seg
9150: 6d 65 6e 74 73 0a 2a 2a 20 20 20 20 20 20 77 69  ments.**      wi
9160: 74 68 69 6e 20 74 68 65 20 70 72 65 76 69 6f 75  thin the previou
9170: 73 20 70 6f 70 75 6c 61 74 65 64 20 6c 65 76 65  s populated leve
9180: 6c 2c 20 69 74 20 69 73 20 70 72 6f 6d 6f 74 65  l, it is promote
9190: 64 20 74 6f 20 74 68 65 20 70 72 65 76 69 6f 75  d to the previou
91a0: 73 0a 2a 2a 20 20 20 20 20 20 70 6f 70 75 6c 61  s.**      popula
91b0: 74 65 64 20 6c 65 76 65 6c 2e 0a 2a 2a 0a 2a 2a  ted level..**.**
91c0: 20 20 20 62 29 20 49 66 20 74 68 65 20 73 65 67     b) If the seg
91d0: 6d 65 6e 74 20 6a 75 73 74 20 77 72 69 74 74 65  ment just writte
91e0: 6e 20 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e  n is larger than
91f0: 20 74 68 65 20 6e 65 77 65 73 74 20 73 65 67 6d   the newest segm
9200: 65 6e 74 20 6f 6e 0a 2a 2a 20 20 20 20 20 20 74  ent on.**      t
9210: 68 65 20 6e 65 78 74 20 70 6f 70 75 6c 61 74 65  he next populate
9220: 64 20 6c 65 76 65 6c 2c 20 74 68 65 6e 20 74 68  d level, then th
9230: 61 74 20 73 65 67 6d 65 6e 74 2c 20 61 6e 64 20  at segment, and 
9240: 61 6e 79 20 6f 74 68 65 72 20 61 64 6a 61 63 65  any other adjace
9250: 6e 74 0a 2a 2a 20 20 20 20 20 20 73 65 67 6d 65  nt.**      segme
9260: 6e 74 73 20 74 68 61 74 20 61 72 65 20 61 6c 73  nts that are als
9270: 6f 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 74  o smaller than t
9280: 68 65 20 6f 6e 65 20 6a 75 73 74 20 77 72 69 74  he one just writ
9290: 74 65 6e 2c 20 61 72 65 20 0a 2a 2a 20 20 20 20  ten, are .**    
92a0: 20 20 70 72 6f 6d 6f 74 65 64 2e 20 0a 2a 2a 0a    promoted. .**.
92b0: 2a 2a 20 49 66 20 6f 6e 65 20 6f 72 20 6d 6f 72  ** If one or mor
92c0: 65 20 73 65 67 6d 65 6e 74 73 20 61 72 65 20 70  e segments are p
92d0: 72 6f 6d 6f 74 65 64 2c 20 74 68 65 20 73 74 72  romoted, the str
92e0: 75 63 74 75 72 65 20 6f 62 6a 65 63 74 20 69 73  ucture object is
92f0: 20 75 70 64 61 74 65 64 0a 2a 2a 20 74 6f 20 72   updated.** to r
9300: 65 66 6c 65 63 74 20 74 68 69 73 2e 0a 2a 2f 0a  eflect this..*/.
9310: 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
9320: 53 74 72 75 63 74 75 72 65 50 72 6f 6d 6f 74 65  StructurePromote
9330: 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70  (.  Fts5Index *p
9340: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
9350: 20 20 20 20 2f 2a 20 46 54 53 35 20 62 61 63 6b      /* FTS5 back
9360: 65 6e 64 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  end object */.  
9370: 69 6e 74 20 69 4c 76 6c 2c 20 20 20 20 20 20 20  int iLvl,       
9380: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9390: 2f 2a 20 49 6e 64 65 78 20 6c 65 76 65 6c 20 6a  /* Index level j
93a0: 75 73 74 20 75 70 64 61 74 65 64 20 2a 2f 0a 20  ust updated */. 
93b0: 20 46 74 73 35 53 74 72 75 63 74 75 72 65 20 2a   Fts5Structure *
93c0: 70 53 74 72 75 63 74 20 20 20 20 20 20 20 20 20  pStruct         
93d0: 20 2f 2a 20 49 6e 64 65 78 20 73 74 72 75 63 74   /* Index struct
93e0: 75 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20  ure */.){.  if( 
93f0: 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
9400: 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 54 73 74   ){.    int iTst
9410: 3b 0a 20 20 20 20 69 6e 74 20 69 50 72 6f 6d 6f  ;.    int iPromo
9420: 74 65 20 3d 20 2d 31 3b 0a 20 20 20 20 69 6e 74  te = -1;.    int
9430: 20 73 7a 50 72 6f 6d 6f 74 65 20 3d 20 30 3b 20   szPromote = 0; 
9440: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 72             /* Pr
9450: 6f 6d 6f 74 65 20 61 6e 79 74 68 69 6e 67 20 74  omote anything t
9460: 68 69 73 20 73 69 7a 65 20 6f 72 20 73 6d 61 6c  his size or smal
9470: 6c 65 72 20 2a 2f 0a 20 20 20 20 46 74 73 35 53  ler */.    Fts5S
9480: 74 72 75 63 74 75 72 65 53 65 67 6d 65 6e 74 20  tructureSegment 
9490: 2a 70 53 65 67 3b 20 20 20 2f 2a 20 53 65 67 6d  *pSeg;   /* Segm
94a0: 65 6e 74 20 6a 75 73 74 20 77 72 69 74 74 65 6e  ent just written
94b0: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 73 7a 53 65   */.    int szSe
94c0: 67 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  g;              
94d0: 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
94e0: 20 73 65 67 6d 65 6e 74 20 6a 75 73 74 20 77 72   segment just wr
94f0: 69 74 74 65 6e 20 2a 2f 0a 20 20 20 20 69 6e 74  itten */.    int
9500: 20 6e 53 65 67 20 3d 20 70 53 74 72 75 63 74 2d   nSeg = pStruct-
9510: 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d 2e 6e 53  >aLevel[iLvl].nS
9520: 65 67 3b 0a 0a 20 20 20 20 69 66 28 20 6e 53 65  eg;..    if( nSe
9530: 67 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  g==0 ) return;. 
9540: 20 20 20 70 53 65 67 20 3d 20 26 70 53 74 72 75     pSeg = &pStru
9550: 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d  ct->aLevel[iLvl]
9560: 2e 61 53 65 67 5b 70 53 74 72 75 63 74 2d 3e 61  .aSeg[pStruct->a
9570: 4c 65 76 65 6c 5b 69 4c 76 6c 5d 2e 6e 53 65 67  Level[iLvl].nSeg
9580: 2d 31 5d 3b 0a 20 20 20 20 73 7a 53 65 67 20 3d  -1];.    szSeg =
9590: 20 28 31 20 2b 20 70 53 65 67 2d 3e 70 67 6e 6f   (1 + pSeg->pgno
95a0: 4c 61 73 74 20 2d 20 70 53 65 67 2d 3e 70 67 6e  Last - pSeg->pgn
95b0: 6f 46 69 72 73 74 29 3b 0a 0a 20 20 20 20 2f 2a  oFirst);..    /*
95c0: 20 43 68 65 63 6b 20 66 6f 72 20 63 6f 6e 64 69   Check for condi
95d0: 74 69 6f 6e 20 28 61 29 20 2a 2f 0a 20 20 20 20  tion (a) */.    
95e0: 66 6f 72 28 69 54 73 74 3d 69 4c 76 6c 2d 31 3b  for(iTst=iLvl-1;
95f0: 20 69 54 73 74 3e 3d 30 20 26 26 20 70 53 74 72   iTst>=0 && pStr
9600: 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 54 73 74  uct->aLevel[iTst
9610: 5d 2e 6e 53 65 67 3d 3d 30 3b 20 69 54 73 74 2d  ].nSeg==0; iTst-
9620: 2d 29 3b 0a 20 20 20 20 69 66 28 20 69 54 73 74  -);.    if( iTst
9630: 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  >=0 ){.      int
9640: 20 69 3b 0a 20 20 20 20 20 20 69 6e 74 20 73 7a   i;.      int sz
9650: 4d 61 78 20 3d 20 30 3b 0a 20 20 20 20 20 20 46  Max = 0;.      F
9660: 74 73 35 53 74 72 75 63 74 75 72 65 4c 65 76 65  ts5StructureLeve
9670: 6c 20 2a 70 54 73 74 20 3d 20 26 70 53 74 72 75  l *pTst = &pStru
9680: 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 54 73 74 5d  ct->aLevel[iTst]
9690: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
96a0: 70 54 73 74 2d 3e 6e 4d 65 72 67 65 3d 3d 30 20  pTst->nMerge==0 
96b0: 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30  );.      for(i=0
96c0: 3b 20 69 3c 70 54 73 74 2d 3e 6e 53 65 67 3b 20  ; i<pTst->nSeg; 
96d0: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  i++){.        in
96e0: 74 20 73 7a 20 3d 20 70 54 73 74 2d 3e 61 53 65  t sz = pTst->aSe
96f0: 67 5b 69 5d 2e 70 67 6e 6f 4c 61 73 74 20 2d 20  g[i].pgnoLast - 
9700: 70 54 73 74 2d 3e 61 53 65 67 5b 69 5d 2e 70 67  pTst->aSeg[i].pg
9710: 6e 6f 46 69 72 73 74 20 2b 20 31 3b 0a 20 20 20  noFirst + 1;.   
9720: 20 20 20 20 20 69 66 28 20 73 7a 3e 73 7a 4d 61       if( sz>szMa
9730: 78 20 29 20 73 7a 4d 61 78 20 3d 20 73 7a 3b 0a  x ) szMax = sz;.
9740: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
9750: 28 20 73 7a 4d 61 78 3e 3d 73 7a 53 65 67 20 29  ( szMax>=szSeg )
9760: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e  {.        /* Con
9770: 64 69 74 69 6f 6e 20 28 61 29 20 69 73 20 74 72  dition (a) is tr
9780: 75 65 2e 20 50 72 6f 6d 6f 74 65 20 74 68 65 20  ue. Promote the 
9790: 6e 65 77 65 73 74 20 73 65 67 6d 65 6e 74 20 6f  newest segment o
97a0: 6e 20 6c 65 76 65 6c 20 0a 20 20 20 20 20 20 20  n level .       
97b0: 20 2a 2a 20 69 4c 76 6c 20 74 6f 20 6c 65 76 65   ** iLvl to leve
97c0: 6c 20 69 54 73 74 2e 20 20 2a 2f 0a 20 20 20 20  l iTst.  */.    
97d0: 20 20 20 20 69 50 72 6f 6d 6f 74 65 20 3d 20 69      iPromote = i
97e0: 54 73 74 3b 0a 20 20 20 20 20 20 20 20 73 7a 50  Tst;.        szP
97f0: 72 6f 6d 6f 74 65 20 3d 20 73 7a 4d 61 78 3b 0a  romote = szMax;.
9800: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
9810: 20 20 20 2f 2a 20 49 66 20 63 6f 6e 64 69 74 69     /* If conditi
9820: 6f 6e 20 28 61 29 20 69 73 20 6e 6f 74 20 6d 65  on (a) is not me
9830: 74 2c 20 61 73 73 75 6d 65 20 28 62 29 20 69 73  t, assume (b) is
9840: 20 74 72 75 65 2e 20 53 74 72 75 63 74 75 72 65   true. Structure
9850: 50 72 6f 6d 6f 74 65 54 6f 28 29 0a 20 20 20 20  PromoteTo().    
9860: 2a 2a 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66  ** is a no-op if
9870: 20 69 74 20 69 73 20 6e 6f 74 2e 20 20 2a 2f 0a   it is not.  */.
9880: 20 20 20 20 69 66 28 20 69 50 72 6f 6d 6f 74 65      if( iPromote
9890: 3c 30 20 29 7b 0a 20 20 20 20 20 20 69 50 72 6f  <0 ){.      iPro
98a0: 6d 6f 74 65 20 3d 20 69 4c 76 6c 3b 0a 20 20 20  mote = iLvl;.   
98b0: 20 20 20 73 7a 50 72 6f 6d 6f 74 65 20 3d 20 73     szPromote = s
98c0: 7a 53 65 67 3b 0a 20 20 20 20 7d 0a 20 20 20 20  zSeg;.    }.    
98d0: 66 74 73 35 53 74 72 75 63 74 75 72 65 50 72 6f  fts5StructurePro
98e0: 6d 6f 74 65 54 6f 28 70 2c 20 69 50 72 6f 6d 6f  moteTo(p, iPromo
98f0: 74 65 2c 20 73 7a 50 72 6f 6d 6f 74 65 2c 20 70  te, szPromote, p
9900: 53 74 72 75 63 74 29 3b 0a 20 20 7d 0a 7d 0a 0a  Struct);.  }.}..
9910: 0a 2f 2a 0a 2a 2a 20 41 64 76 61 6e 63 65 20 74  ./*.** Advance t
9920: 68 65 20 69 74 65 72 61 74 6f 72 20 70 61 73 73  he iterator pass
9930: 65 64 20 61 73 20 74 68 65 20 6f 6e 6c 79 20 61  ed as the only a
9940: 72 67 75 6d 65 6e 74 2e 20 49 66 20 74 68 65 20  rgument. If the 
9950: 65 6e 64 20 6f 66 20 74 68 65 20 0a 2a 2a 20 64  end of the .** d
9960: 6f 63 6c 69 73 74 2d 69 6e 64 65 78 20 70 61 67  oclist-index pag
9970: 65 20 69 73 20 72 65 61 63 68 65 64 2c 20 72 65  e is reached, re
9980: 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 2e 0a 2a  turn non-zero..*
9990: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73  /.static int fts
99a0: 35 44 6c 69 64 78 4c 76 6c 4e 65 78 74 28 46 74  5DlidxLvlNext(Ft
99b0: 73 35 44 6c 69 64 78 4c 76 6c 20 2a 70 4c 76 6c  s5DlidxLvl *pLvl
99c0: 29 7b 0a 20 20 46 74 73 35 44 61 74 61 20 2a 70  ){.  Fts5Data *p
99d0: 44 61 74 61 20 3d 20 70 4c 76 6c 2d 3e 70 44 61  Data = pLvl->pDa
99e0: 74 61 3b 0a 0a 20 20 69 66 28 20 70 4c 76 6c 2d  ta;..  if( pLvl-
99f0: 3e 69 4f 66 66 3d 3d 30 20 29 7b 0a 20 20 20 20  >iOff==0 ){.    
9a00: 61 73 73 65 72 74 28 20 70 4c 76 6c 2d 3e 62 45  assert( pLvl->bE
9a10: 6f 66 3d 3d 30 20 29 3b 0a 20 20 20 20 70 4c 76  of==0 );.    pLv
9a20: 6c 2d 3e 69 4f 66 66 20 3d 20 31 3b 0a 20 20 20  l->iOff = 1;.   
9a30: 20 70 4c 76 6c 2d 3e 69 4f 66 66 20 2b 3d 20 66   pLvl->iOff += f
9a40: 74 73 35 47 65 74 56 61 72 69 6e 74 33 32 28 26  ts5GetVarint32(&
9a50: 70 44 61 74 61 2d 3e 70 5b 31 5d 2c 20 70 4c 76  pData->p[1], pLv
9a60: 6c 2d 3e 69 4c 65 61 66 50 67 6e 6f 29 3b 0a 20  l->iLeafPgno);. 
9a70: 20 20 20 70 4c 76 6c 2d 3e 69 4f 66 66 20 2b 3d     pLvl->iOff +=
9a80: 20 66 74 73 35 47 65 74 56 61 72 69 6e 74 28 26   fts5GetVarint(&
9a90: 70 44 61 74 61 2d 3e 70 5b 70 4c 76 6c 2d 3e 69  pData->p[pLvl->i
9aa0: 4f 66 66 5d 2c 20 28 75 36 34 2a 29 26 70 4c 76  Off], (u64*)&pLv
9ab0: 6c 2d 3e 69 52 6f 77 69 64 29 3b 0a 20 20 20 20  l->iRowid);.    
9ac0: 70 4c 76 6c 2d 3e 69 46 69 72 73 74 4f 66 66 20  pLvl->iFirstOff 
9ad0: 3d 20 70 4c 76 6c 2d 3e 69 4f 66 66 3b 0a 20 20  = pLvl->iOff;.  
9ae0: 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 69  }else{.    int i
9af0: 4f 66 66 3b 0a 20 20 20 20 66 6f 72 28 69 4f 66  Off;.    for(iOf
9b00: 66 3d 70 4c 76 6c 2d 3e 69 4f 66 66 3b 20 69 4f  f=pLvl->iOff; iO
9b10: 66 66 3c 70 44 61 74 61 2d 3e 6e 6e 3b 20 69 4f  ff<pData->nn; iO
9b20: 66 66 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28  ff++){.      if(
9b30: 20 70 44 61 74 61 2d 3e 70 5b 69 4f 66 66 5d 20   pData->p[iOff] 
9b40: 29 20 62 72 65 61 6b 3b 20 0a 20 20 20 20 7d 0a  ) break; .    }.
9b50: 0a 20 20 20 20 69 66 28 20 69 4f 66 66 3c 70 44  .    if( iOff<pD
9b60: 61 74 61 2d 3e 6e 6e 20 29 7b 0a 20 20 20 20 20  ata->nn ){.     
9b70: 20 69 36 34 20 69 56 61 6c 3b 0a 20 20 20 20 20   i64 iVal;.     
9b80: 20 70 4c 76 6c 2d 3e 69 4c 65 61 66 50 67 6e 6f   pLvl->iLeafPgno
9b90: 20 2b 3d 20 28 69 4f 66 66 20 2d 20 70 4c 76 6c   += (iOff - pLvl
9ba0: 2d 3e 69 4f 66 66 29 20 2b 20 31 3b 0a 20 20 20  ->iOff) + 1;.   
9bb0: 20 20 20 69 4f 66 66 20 2b 3d 20 66 74 73 35 47     iOff += fts5G
9bc0: 65 74 56 61 72 69 6e 74 28 26 70 44 61 74 61 2d  etVarint(&pData-
9bd0: 3e 70 5b 69 4f 66 66 5d 2c 20 28 75 36 34 2a 29  >p[iOff], (u64*)
9be0: 26 69 56 61 6c 29 3b 0a 20 20 20 20 20 20 70 4c  &iVal);.      pL
9bf0: 76 6c 2d 3e 69 52 6f 77 69 64 20 2b 3d 20 69 56  vl->iRowid += iV
9c00: 61 6c 3b 0a 20 20 20 20 20 20 70 4c 76 6c 2d 3e  al;.      pLvl->
9c10: 69 4f 66 66 20 3d 20 69 4f 66 66 3b 0a 20 20 20  iOff = iOff;.   
9c20: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 4c   }else{.      pL
9c30: 76 6c 2d 3e 62 45 6f 66 20 3d 20 31 3b 0a 20 20  vl->bEof = 1;.  
9c40: 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72    }.  }..  retur
9c50: 6e 20 70 4c 76 6c 2d 3e 62 45 6f 66 3b 0a 7d 0a  n pLvl->bEof;.}.
9c60: 0a 2f 2a 0a 2a 2a 20 41 64 76 61 6e 63 65 20 74  ./*.** Advance t
9c70: 68 65 20 69 74 65 72 61 74 6f 72 20 70 61 73 73  he iterator pass
9c80: 65 64 20 61 73 20 74 68 65 20 6f 6e 6c 79 20 61  ed as the only a
9c90: 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74  rgument..*/.stat
9ca0: 69 63 20 69 6e 74 20 66 74 73 35 44 6c 69 64 78  ic int fts5Dlidx
9cb0: 49 74 65 72 4e 65 78 74 52 28 46 74 73 35 49 6e  IterNextR(Fts5In
9cc0: 64 65 78 20 2a 70 2c 20 46 74 73 35 44 6c 69 64  dex *p, Fts5Dlid
9cd0: 78 49 74 65 72 20 2a 70 49 74 65 72 2c 20 69 6e  xIter *pIter, in
9ce0: 74 20 69 4c 76 6c 29 7b 0a 20 20 46 74 73 35 44  t iLvl){.  Fts5D
9cf0: 6c 69 64 78 4c 76 6c 20 2a 70 4c 76 6c 20 3d 20  lidxLvl *pLvl = 
9d00: 26 70 49 74 65 72 2d 3e 61 4c 76 6c 5b 69 4c 76  &pIter->aLvl[iLv
9d10: 6c 5d 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 69  l];..  assert( i
9d20: 4c 76 6c 3c 70 49 74 65 72 2d 3e 6e 4c 76 6c 20  Lvl<pIter->nLvl 
9d30: 29 3b 0a 20 20 69 66 28 20 66 74 73 35 44 6c 69  );.  if( fts5Dli
9d40: 64 78 4c 76 6c 4e 65 78 74 28 70 4c 76 6c 29 20  dxLvlNext(pLvl) 
9d50: 29 7b 0a 20 20 20 20 69 66 28 20 28 69 4c 76 6c  ){.    if( (iLvl
9d60: 2b 31 29 20 3c 20 70 49 74 65 72 2d 3e 6e 4c 76  +1) < pIter->nLv
9d70: 6c 20 29 7b 0a 20 20 20 20 20 20 66 74 73 35 44  l ){.      fts5D
9d80: 6c 69 64 78 49 74 65 72 4e 65 78 74 52 28 70 2c  lidxIterNextR(p,
9d90: 20 70 49 74 65 72 2c 20 69 4c 76 6c 2b 31 29 3b   pIter, iLvl+1);
9da0: 0a 20 20 20 20 20 20 69 66 28 20 70 4c 76 6c 5b  .      if( pLvl[
9db0: 31 5d 2e 62 45 6f 66 3d 3d 30 20 29 7b 0a 20 20  1].bEof==0 ){.  
9dc0: 20 20 20 20 20 20 66 74 73 35 44 61 74 61 52 65        fts5DataRe
9dd0: 6c 65 61 73 65 28 70 4c 76 6c 2d 3e 70 44 61 74  lease(pLvl->pDat
9de0: 61 29 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 73  a);.        mems
9df0: 65 74 28 70 4c 76 6c 2c 20 30 2c 20 73 69 7a 65  et(pLvl, 0, size
9e00: 6f 66 28 46 74 73 35 44 6c 69 64 78 4c 76 6c 29  of(Fts5DlidxLvl)
9e10: 29 3b 0a 20 20 20 20 20 20 20 20 70 4c 76 6c 2d  );.        pLvl-
9e20: 3e 70 44 61 74 61 20 3d 20 66 74 73 35 44 61 74  >pData = fts5Dat
9e30: 61 52 65 61 64 28 70 2c 20 0a 20 20 20 20 20 20  aRead(p, .      
9e40: 20 20 20 20 20 20 46 54 53 35 5f 44 4c 49 44 58        FTS5_DLIDX
9e50: 5f 52 4f 57 49 44 28 70 49 74 65 72 2d 3e 69 53  _ROWID(pIter->iS
9e60: 65 67 69 64 2c 20 69 4c 76 6c 2c 20 70 4c 76 6c  egid, iLvl, pLvl
9e70: 5b 31 5d 2e 69 4c 65 61 66 50 67 6e 6f 29 0a 20  [1].iLeafPgno). 
9e80: 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20         );.      
9e90: 20 20 69 66 28 20 70 4c 76 6c 2d 3e 70 44 61 74    if( pLvl->pDat
9ea0: 61 20 29 20 66 74 73 35 44 6c 69 64 78 4c 76 6c  a ) fts5DlidxLvl
9eb0: 4e 65 78 74 28 70 4c 76 6c 29 3b 0a 20 20 20 20  Next(pLvl);.    
9ec0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
9ed0: 20 72 65 74 75 72 6e 20 70 49 74 65 72 2d 3e 61   return pIter->a
9ee0: 4c 76 6c 5b 30 5d 2e 62 45 6f 66 3b 0a 7d 0a 73  Lvl[0].bEof;.}.s
9ef0: 74 61 74 69 63 20 69 6e 74 20 66 74 73 35 44 6c  tatic int fts5Dl
9f00: 69 64 78 49 74 65 72 4e 65 78 74 28 46 74 73 35  idxIterNext(Fts5
9f10: 49 6e 64 65 78 20 2a 70 2c 20 46 74 73 35 44 6c  Index *p, Fts5Dl
9f20: 69 64 78 49 74 65 72 20 2a 70 49 74 65 72 29 7b  idxIter *pIter){
9f30: 0a 20 20 72 65 74 75 72 6e 20 66 74 73 35 44 6c  .  return fts5Dl
9f40: 69 64 78 49 74 65 72 4e 65 78 74 52 28 70 2c 20  idxIterNextR(p, 
9f50: 70 49 74 65 72 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a  pIter, 0);.}../*
9f60: 0a 2a 2a 20 54 68 65 20 69 74 65 72 61 74 6f 72  .** The iterator
9f70: 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 66   passed as the f
9f80: 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 68 61  irst argument ha
9f90: 73 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  s the following 
9fa0: 66 69 65 6c 64 73 20 73 65 74 0a 2a 2a 20 61 73  fields set.** as
9fb0: 20 66 6f 6c 6c 6f 77 73 2e 20 54 68 69 73 20 66   follows. This f
9fc0: 75 6e 63 74 69 6f 6e 20 73 65 74 73 20 75 70 20  unction sets up 
9fd0: 74 68 65 20 72 65 73 74 20 6f 66 20 74 68 65 20  the rest of the 
9fe0: 69 74 65 72 61 74 6f 72 20 73 6f 20 74 68 61 74  iterator so that
9ff0: 20 69 74 0a 2a 2a 20 70 6f 69 6e 74 73 20 74 6f   it.** points to
a000: 20 74 68 65 20 66 69 72 73 74 20 72 6f 77 69 64   the first rowid
a010: 20 69 6e 20 74 68 65 20 64 6f 63 6c 69 73 74 2d   in the doclist-
a020: 69 6e 64 65 78 2e 0a 2a 2a 0a 2a 2a 20 20 20 70  index..**.**   p
a030: 44 61 74 61 3a 0a 2a 2a 20 20 20 20 20 70 6f 69  Data:.**     poi
a040: 6e 74 65 72 20 74 6f 20 64 6f 63 6c 69 73 74 2d  nter to doclist-
a050: 69 6e 64 65 78 20 72 65 63 6f 72 64 2c 20 0a 2a  index record, .*
a060: 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73 20 66  *.** When this f
a070: 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
a080: 64 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 50 67  d pIter->iLeafPg
a090: 6e 6f 20 69 73 20 74 68 65 20 70 61 67 65 20 6e  no is the page n
a0a0: 75 6d 62 65 72 20 74 68 65 0a 2a 2a 20 64 6f 63  umber the.** doc
a0b0: 6c 69 73 74 20 69 73 20 61 73 73 6f 63 69 61 74  list is associat
a0c0: 65 64 20 77 69 74 68 20 28 74 68 65 20 6f 6e 65  ed with (the one
a0d0: 20 66 65 61 74 75 72 69 6e 67 20 74 68 65 20 74   featuring the t
a0e0: 65 72 6d 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  erm)..*/.static 
a0f0: 69 6e 74 20 66 74 73 35 44 6c 69 64 78 49 74 65  int fts5DlidxIte
a100: 72 46 69 72 73 74 28 46 74 73 35 44 6c 69 64 78  rFirst(Fts5Dlidx
a110: 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a 20 20  Iter *pIter){.  
a120: 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30  int i;.  for(i=0
a130: 3b 20 69 3c 70 49 74 65 72 2d 3e 6e 4c 76 6c 3b  ; i<pIter->nLvl;
a140: 20 69 2b 2b 29 7b 0a 20 20 20 20 66 74 73 35 44   i++){.    fts5D
a150: 6c 69 64 78 4c 76 6c 4e 65 78 74 28 26 70 49 74  lidxLvlNext(&pIt
a160: 65 72 2d 3e 61 4c 76 6c 5b 69 5d 29 3b 0a 20 20  er->aLvl[i]);.  
a170: 7d 0a 20 20 72 65 74 75 72 6e 20 70 49 74 65 72  }.  return pIter
a180: 2d 3e 61 4c 76 6c 5b 30 5d 2e 62 45 6f 66 3b 0a  ->aLvl[0].bEof;.
a190: 7d 0a 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 66  }...static int f
a1a0: 74 73 35 44 6c 69 64 78 49 74 65 72 45 6f 66 28  ts5DlidxIterEof(
a1b0: 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 46 74  Fts5Index *p, Ft
a1c0: 73 35 44 6c 69 64 78 49 74 65 72 20 2a 70 49 74  s5DlidxIter *pIt
a1d0: 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 2d  er){.  return p-
a1e0: 3e 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c  >rc!=SQLITE_OK |
a1f0: 7c 20 70 49 74 65 72 2d 3e 61 4c 76 6c 5b 30 5d  | pIter->aLvl[0]
a200: 2e 62 45 6f 66 3b 0a 7d 0a 0a 73 74 61 74 69 63  .bEof;.}..static
a210: 20 76 6f 69 64 20 66 74 73 35 44 6c 69 64 78 49   void fts5DlidxI
a220: 74 65 72 4c 61 73 74 28 46 74 73 35 49 6e 64 65  terLast(Fts5Inde
a230: 78 20 2a 70 2c 20 46 74 73 35 44 6c 69 64 78 49  x *p, Fts5DlidxI
a240: 74 65 72 20 2a 70 49 74 65 72 29 7b 0a 20 20 69  ter *pIter){.  i
a250: 6e 74 20 69 3b 0a 0a 20 20 2f 2a 20 41 64 76 61  nt i;..  /* Adva
a260: 6e 63 65 20 65 61 63 68 20 6c 65 76 65 6c 20 74  nce each level t
a270: 6f 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72 79  o the last entry
a280: 20 6f 6e 20 74 68 65 20 6c 61 73 74 20 70 61 67   on the last pag
a290: 65 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 70 49 74  e */.  for(i=pIt
a2a0: 65 72 2d 3e 6e 4c 76 6c 2d 31 3b 20 70 2d 3e 72  er->nLvl-1; p->r
a2b0: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
a2c0: 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20  i>=0; i--){.    
a2d0: 46 74 73 35 44 6c 69 64 78 4c 76 6c 20 2a 70 4c  Fts5DlidxLvl *pL
a2e0: 76 6c 20 3d 20 26 70 49 74 65 72 2d 3e 61 4c 76  vl = &pIter->aLv
a2f0: 6c 5b 69 5d 3b 0a 20 20 20 20 77 68 69 6c 65 28  l[i];.    while(
a300: 20 66 74 73 35 44 6c 69 64 78 4c 76 6c 4e 65 78   fts5DlidxLvlNex
a310: 74 28 70 4c 76 6c 29 3d 3d 30 20 29 3b 0a 20 20  t(pLvl)==0 );.  
a320: 20 20 70 4c 76 6c 2d 3e 62 45 6f 66 20 3d 20 30    pLvl->bEof = 0
a330: 3b 0a 0a 20 20 20 20 69 66 28 20 69 3e 30 20 29  ;..    if( i>0 )
a340: 7b 0a 20 20 20 20 20 20 46 74 73 35 44 6c 69 64  {.      Fts5Dlid
a350: 78 4c 76 6c 20 2a 70 43 68 69 6c 64 20 3d 20 26  xLvl *pChild = &
a360: 70 4c 76 6c 5b 2d 31 5d 3b 0a 20 20 20 20 20 20  pLvl[-1];.      
a370: 66 74 73 35 44 61 74 61 52 65 6c 65 61 73 65 28  fts5DataRelease(
a380: 70 43 68 69 6c 64 2d 3e 70 44 61 74 61 29 3b 0a  pChild->pData);.
a390: 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70 43 68        memset(pCh
a3a0: 69 6c 64 2c 20 30 2c 20 73 69 7a 65 6f 66 28 46  ild, 0, sizeof(F
a3b0: 74 73 35 44 6c 69 64 78 4c 76 6c 29 29 3b 0a 20  ts5DlidxLvl));. 
a3c0: 20 20 20 20 20 70 43 68 69 6c 64 2d 3e 70 44 61       pChild->pDa
a3d0: 74 61 20 3d 20 66 74 73 35 44 61 74 61 52 65 61  ta = fts5DataRea
a3e0: 64 28 70 2c 20 0a 20 20 20 20 20 20 20 20 20 20  d(p, .          
a3f0: 46 54 53 35 5f 44 4c 49 44 58 5f 52 4f 57 49 44  FTS5_DLIDX_ROWID
a400: 28 70 49 74 65 72 2d 3e 69 53 65 67 69 64 2c 20  (pIter->iSegid, 
a410: 69 2d 31 2c 20 70 4c 76 6c 2d 3e 69 4c 65 61 66  i-1, pLvl->iLeaf
a420: 50 67 6e 6f 29 0a 20 20 20 20 20 20 29 3b 0a 20  Pgno).      );. 
a430: 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
a440: 2a 20 4d 6f 76 65 20 74 68 65 20 69 74 65 72 61  * Move the itera
a450: 74 6f 72 20 70 61 73 73 65 64 20 61 73 20 74 68  tor passed as th
a460: 65 20 6f 6e 6c 79 20 61 72 67 75 6d 65 6e 74 20  e only argument 
a470: 74 6f 20 74 68 65 20 70 72 65 76 69 6f 75 73 20  to the previous 
a480: 65 6e 74 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63  entry..*/.static
a490: 20 69 6e 74 20 66 74 73 35 44 6c 69 64 78 4c 76   int fts5DlidxLv
a4a0: 6c 50 72 65 76 28 46 74 73 35 44 6c 69 64 78 4c  lPrev(Fts5DlidxL
a4b0: 76 6c 20 2a 70 4c 76 6c 29 7b 0a 20 20 69 6e 74  vl *pLvl){.  int
a4c0: 20 69 4f 66 66 20 3d 20 70 4c 76 6c 2d 3e 69 4f   iOff = pLvl->iO
a4d0: 66 66 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  ff;..  assert( p
a4e0: 4c 76 6c 2d 3e 62 45 6f 66 3d 3d 30 20 29 3b 0a  Lvl->bEof==0 );.
a4f0: 20 20 69 66 28 20 69 4f 66 66 3c 3d 70 4c 76 6c    if( iOff<=pLvl
a500: 2d 3e 69 46 69 72 73 74 4f 66 66 20 29 7b 0a 20  ->iFirstOff ){. 
a510: 20 20 20 70 4c 76 6c 2d 3e 62 45 6f 66 20 3d 20     pLvl->bEof = 
a520: 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  1;.  }else{.    
a530: 75 38 20 2a 61 20 3d 20 70 4c 76 6c 2d 3e 70 44  u8 *a = pLvl->pD
a540: 61 74 61 2d 3e 70 3b 0a 20 20 20 20 69 36 34 20  ata->p;.    i64 
a550: 69 56 61 6c 3b 0a 20 20 20 20 69 6e 74 20 69 4c  iVal;.    int iL
a560: 69 6d 69 74 3b 0a 20 20 20 20 69 6e 74 20 69 69  imit;.    int ii
a570: 3b 0a 20 20 20 20 69 6e 74 20 6e 5a 65 72 6f 20  ;.    int nZero 
a580: 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a 20 43 75 72  = 0;..    /* Cur
a590: 72 65 6e 74 6c 79 20 69 4f 66 66 20 70 6f 69 6e  rently iOff poin
a5a0: 74 73 20 74 6f 20 74 68 65 20 66 69 72 73 74 20  ts to the first 
a5b0: 62 79 74 65 20 6f 66 20 61 20 76 61 72 69 6e 74  byte of a varint
a5c0: 2e 20 54 68 69 73 20 62 6c 6f 63 6b 20 0a 20 20  . This block .  
a5d0: 20 20 2a 2a 20 64 65 63 72 65 6d 65 6e 74 73 20    ** decrements 
a5e0: 69 4f 66 66 20 75 6e 74 69 6c 20 69 74 20 70 6f  iOff until it po
a5f0: 69 6e 74 73 20 74 6f 20 74 68 65 20 66 69 72 73  ints to the firs
a600: 74 20 62 79 74 65 20 6f 66 20 74 68 65 20 70 72  t byte of the pr
a610: 65 76 69 6f 75 73 20 0a 20 20 20 20 2a 2a 20 76  evious .    ** v
a620: 61 72 69 6e 74 2e 20 54 61 6b 69 6e 67 20 63 61  arint. Taking ca
a630: 72 65 20 6e 6f 74 20 74 6f 20 72 65 61 64 20 61  re not to read a
a640: 6e 79 20 6d 65 6d 6f 72 79 20 6c 6f 63 61 74 69  ny memory locati
a650: 6f 6e 73 20 74 68 61 74 20 6f 63 63 75 72 0a 20  ons that occur. 
a660: 20 20 20 2a 2a 20 62 65 66 6f 72 65 20 74 68 65     ** before the
a670: 20 62 75 66 66 65 72 20 69 6e 20 6d 65 6d 6f 72   buffer in memor
a680: 79 2e 20 20 2a 2f 0a 20 20 20 20 69 4c 69 6d 69  y.  */.    iLimi
a690: 74 20 3d 20 28 69 4f 66 66 3e 39 20 3f 20 69 4f  t = (iOff>9 ? iO
a6a0: 66 66 2d 39 20 3a 20 30 29 3b 0a 20 20 20 20 66  ff-9 : 0);.    f
a6b0: 6f 72 28 69 4f 66 66 2d 2d 3b 20 69 4f 66 66 3e  or(iOff--; iOff>
a6c0: 69 4c 69 6d 69 74 3b 20 69 4f 66 66 2d 2d 29 7b  iLimit; iOff--){
a6d0: 0a 20 20 20 20 20 20 69 66 28 20 28 61 5b 69 4f  .      if( (a[iO
a6e0: 66 66 2d 31 5d 20 26 20 30 78 38 30 29 3d 3d 30  ff-1] & 0x80)==0
a6f0: 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a   ) break;.    }.
a700: 0a 20 20 20 20 66 74 73 35 47 65 74 56 61 72 69  .    fts5GetVari
a710: 6e 74 28 26 61 5b 69 4f 66 66 5d 2c 20 28 75 36  nt(&a[iOff], (u6
a720: 34 2a 29 26 69 56 61 6c 29 3b 0a 20 20 20 20 70  4*)&iVal);.    p
a730: 4c 76 6c 2d 3e 69 52 6f 77 69 64 20 2d 3d 20 69  Lvl->iRowid -= i
a740: 56 61 6c 3b 0a 20 20 20 20 70 4c 76 6c 2d 3e 69  Val;.    pLvl->i
a750: 4c 65 61 66 50 67 6e 6f 2d 2d 3b 0a 0a 20 20 20  LeafPgno--;..   
a760: 20 2f 2a 20 53 6b 69 70 20 62 61 63 6b 77 61 72   /* Skip backwar
a770: 64 73 20 70 61 73 74 20 61 6e 79 20 30 78 30 30  ds past any 0x00
a780: 20 76 61 72 69 6e 74 73 2e 20 2a 2f 0a 20 20 20   varints. */.   
a790: 20 66 6f 72 28 69 69 3d 69 4f 66 66 2d 31 3b 20   for(ii=iOff-1; 
a7a0: 69 69 3e 3d 70 4c 76 6c 2d 3e 69 46 69 72 73 74  ii>=pLvl->iFirst
a7b0: 4f 66 66 20 26 26 20 61 5b 69 69 5d 3d 3d 30 78  Off && a[ii]==0x
a7c0: 30 30 3b 20 69 69 2d 2d 29 7b 0a 20 20 20 20 20  00; ii--){.     
a7d0: 20 6e 5a 65 72 6f 2b 2b 3b 0a 20 20 20 20 7d 0a   nZero++;.    }.
a7e0: 20 20 20 20 69 66 28 20 69 69 3e 3d 70 4c 76 6c      if( ii>=pLvl
a7f0: 2d 3e 69 46 69 72 73 74 4f 66 66 20 26 26 20 28  ->iFirstOff && (
a800: 61 5b 69 69 5d 20 26 20 30 78 38 30 29 20 29 7b  a[ii] & 0x80) ){
a810: 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 62 79  .      /* The by
a820: 74 65 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 62  te immediately b
a830: 65 66 6f 72 65 20 74 68 65 20 6c 61 73 74 20 30  efore the last 0
a840: 78 30 30 20 62 79 74 65 20 68 61 73 20 74 68 65  x00 byte has the
a850: 20 30 78 38 30 20 62 69 74 0a 20 20 20 20 20 20   0x80 bit.      
a860: 2a 2a 20 73 65 74 2e 20 53 6f 20 74 68 65 20 6c  ** set. So the l
a870: 61 73 74 20 30 78 30 30 20 69 73 20 6f 6e 6c 79  ast 0x00 is only
a880: 20 61 20 76 61 72 69 6e 74 20 30 20 69 66 20 74   a varint 0 if t
a890: 68 65 72 65 20 61 72 65 20 38 20 6d 6f 72 65 20  here are 8 more 
a8a0: 30 78 38 30 0a 20 20 20 20 20 20 2a 2a 20 62 79  0x80.      ** by
a8b0: 74 65 73 20 62 65 66 6f 72 65 20 61 5b 69 69 5d  tes before a[ii]
a8c0: 2e 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 62  . */.      int b
a8d0: 5a 65 72 6f 20 3d 20 30 3b 20 20 20 20 20 20 20  Zero = 0;       
a8e0: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
a8f0: 66 20 6c 61 73 74 20 30 78 30 30 20 63 6f 75 6e  f last 0x00 coun
a900: 74 73 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  ts */.      if( 
a910: 28 69 69 2d 38 29 3e 3d 70 4c 76 6c 2d 3e 69 46  (ii-8)>=pLvl->iF
a920: 69 72 73 74 4f 66 66 20 29 7b 0a 20 20 20 20 20  irstOff ){.     
a930: 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20     int j;.      
a940: 20 20 66 6f 72 28 6a 3d 31 3b 20 6a 3c 3d 38 20    for(j=1; j<=8 
a950: 26 26 20 28 61 5b 69 69 2d 6a 5d 20 26 20 30 78  && (a[ii-j] & 0x
a960: 38 30 29 3b 20 6a 2b 2b 29 3b 0a 20 20 20 20 20  80); j++);.     
a970: 20 20 20 62 5a 65 72 6f 20 3d 20 28 6a 3e 38 29     bZero = (j>8)
a980: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
a990: 69 66 28 20 62 5a 65 72 6f 3d 3d 30 20 29 20 6e  if( bZero==0 ) n
a9a0: 5a 65 72 6f 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20  Zero--;.    }.  
a9b0: 20 20 70 4c 76 6c 2d 3e 69 4c 65 61 66 50 67 6e    pLvl->iLeafPgn
a9c0: 6f 20 2d 3d 20 6e 5a 65 72 6f 3b 0a 20 20 20 20  o -= nZero;.    
a9d0: 70 4c 76 6c 2d 3e 69 4f 66 66 20 3d 20 69 4f 66  pLvl->iOff = iOf
a9e0: 66 20 2d 20 6e 5a 65 72 6f 3b 0a 20 20 7d 0a 0a  f - nZero;.  }..
a9f0: 20 20 72 65 74 75 72 6e 20 70 4c 76 6c 2d 3e 62    return pLvl->b
aa00: 45 6f 66 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69  Eof;.}..static i
aa10: 6e 74 20 66 74 73 35 44 6c 69 64 78 49 74 65 72  nt fts5DlidxIter
aa20: 50 72 65 76 52 28 46 74 73 35 49 6e 64 65 78 20  PrevR(Fts5Index 
aa30: 2a 70 2c 20 46 74 73 35 44 6c 69 64 78 49 74 65  *p, Fts5DlidxIte
aa40: 72 20 2a 70 49 74 65 72 2c 20 69 6e 74 20 69 4c  r *pIter, int iL
aa50: 76 6c 29 7b 0a 20 20 46 74 73 35 44 6c 69 64 78  vl){.  Fts5Dlidx
aa60: 4c 76 6c 20 2a 70 4c 76 6c 20 3d 20 26 70 49 74  Lvl *pLvl = &pIt
aa70: 65 72 2d 3e 61 4c 76 6c 5b 69 4c 76 6c 5d 3b 0a  er->aLvl[iLvl];.
aa80: 0a 20 20 61 73 73 65 72 74 28 20 69 4c 76 6c 3c  .  assert( iLvl<
aa90: 70 49 74 65 72 2d 3e 6e 4c 76 6c 20 29 3b 0a 20  pIter->nLvl );. 
aaa0: 20 69 66 28 20 66 74 73 35 44 6c 69 64 78 4c 76   if( fts5DlidxLv
aab0: 6c 50 72 65 76 28 70 4c 76 6c 29 20 29 7b 0a 20  lPrev(pLvl) ){. 
aac0: 20 20 20 69 66 28 20 28 69 4c 76 6c 2b 31 29 20     if( (iLvl+1) 
aad0: 3c 20 70 49 74 65 72 2d 3e 6e 4c 76 6c 20 29 7b  < pIter->nLvl ){
aae0: 0a 20 20 20 20 20 20 66 74 73 35 44 6c 69 64 78  .      fts5Dlidx
aaf0: 49 74 65 72 50 72 65 76 52 28 70 2c 20 70 49 74  IterPrevR(p, pIt
ab00: 65 72 2c 20 69 4c 76 6c 2b 31 29 3b 0a 20 20 20  er, iLvl+1);.   
ab10: 20 20 20 69 66 28 20 70 4c 76 6c 5b 31 5d 2e 62     if( pLvl[1].b
ab20: 45 6f 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Eof==0 ){.      
ab30: 20 20 66 74 73 35 44 61 74 61 52 65 6c 65 61 73    fts5DataReleas
ab40: 65 28 70 4c 76 6c 2d 3e 70 44 61 74 61 29 3b 0a  e(pLvl->pData);.
ab50: 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70          memset(p
ab60: 4c 76 6c 2c 20 30 2c 20 73 69 7a 65 6f 66 28 46  Lvl, 0, sizeof(F
ab70: 74 73 35 44 6c 69 64 78 4c 76 6c 29 29 3b 0a 20  ts5DlidxLvl));. 
ab80: 20 20 20 20 20 20 20 70 4c 76 6c 2d 3e 70 44 61         pLvl->pDa
ab90: 74 61 20 3d 20 66 74 73 35 44 61 74 61 52 65 61  ta = fts5DataRea
aba0: 64 28 70 2c 20 0a 20 20 20 20 20 20 20 20 20 20  d(p, .          
abb0: 20 20 46 54 53 35 5f 44 4c 49 44 58 5f 52 4f 57    FTS5_DLIDX_ROW
abc0: 49 44 28 70 49 74 65 72 2d 3e 69 53 65 67 69 64  ID(pIter->iSegid
abd0: 2c 20 69 4c 76 6c 2c 20 70 4c 76 6c 5b 31 5d 2e  , iLvl, pLvl[1].
abe0: 69 4c 65 61 66 50 67 6e 6f 29 0a 20 20 20 20 20  iLeafPgno).     
abf0: 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66     );.        if
ac00: 28 20 70 4c 76 6c 2d 3e 70 44 61 74 61 20 29 7b  ( pLvl->pData ){
ac10: 0a 20 20 20 20 20 20 20 20 20 20 77 68 69 6c 65  .          while
ac20: 28 20 66 74 73 35 44 6c 69 64 78 4c 76 6c 4e 65  ( fts5DlidxLvlNe
ac30: 78 74 28 70 4c 76 6c 29 3d 3d 30 20 29 3b 0a 20  xt(pLvl)==0 );. 
ac40: 20 20 20 20 20 20 20 20 20 70 4c 76 6c 2d 3e 62           pLvl->b
ac50: 45 6f 66 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  Eof = 0;.       
ac60: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
ac70: 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70  .  }..  return p
ac80: 49 74 65 72 2d 3e 61 4c 76 6c 5b 30 5d 2e 62 45  Iter->aLvl[0].bE
ac90: 6f 66 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74  of;.}.static int
aca0: 20 66 74 73 35 44 6c 69 64 78 49 74 65 72 50 72   fts5DlidxIterPr
acb0: 65 76 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c  ev(Fts5Index *p,
acc0: 20 46 74 73 35 44 6c 69 64 78 49 74 65 72 20 2a   Fts5DlidxIter *
acd0: 70 49 74 65 72 29 7b 0a 20 20 72 65 74 75 72 6e  pIter){.  return
ace0: 20 66 74 73 35 44 6c 69 64 78 49 74 65 72 50 72   fts5DlidxIterPr
acf0: 65 76 52 28 70 2c 20 70 49 74 65 72 2c 20 30 29  evR(p, pIter, 0)
ad00: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20  ;.}../*.** Free 
ad10: 61 20 64 6f 63 6c 69 73 74 2d 69 6e 64 65 78 20  a doclist-index 
ad20: 69 74 65 72 61 74 6f 72 20 6f 62 6a 65 63 74 20  iterator object 
ad30: 61 6c 6c 6f 63 61 74 65 64 20 62 79 20 66 74 73  allocated by fts
ad40: 35 44 6c 69 64 78 49 74 65 72 49 6e 69 74 28 29  5DlidxIterInit()
ad50: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
ad60: 20 66 74 73 35 44 6c 69 64 78 49 74 65 72 46 72   fts5DlidxIterFr
ad70: 65 65 28 46 74 73 35 44 6c 69 64 78 49 74 65 72  ee(Fts5DlidxIter
ad80: 20 2a 70 49 74 65 72 29 7b 0a 20 20 69 66 28 20   *pIter){.  if( 
ad90: 70 49 74 65 72 20 29 7b 0a 20 20 20 20 69 6e 74  pIter ){.    int
ada0: 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   i;.    for(i=0;
adb0: 20 69 3c 70 49 74 65 72 2d 3e 6e 4c 76 6c 3b 20   i<pIter->nLvl; 
adc0: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 66 74 73 35  i++){.      fts5
add0: 44 61 74 61 52 65 6c 65 61 73 65 28 70 49 74 65  DataRelease(pIte
ade0: 72 2d 3e 61 4c 76 6c 5b 69 5d 2e 70 44 61 74 61  r->aLvl[i].pData
adf0: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
ae00: 69 74 65 33 5f 66 72 65 65 28 70 49 74 65 72 29  ite3_free(pIter)
ae10: 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63 20  ;.  }.}..static 
ae20: 46 74 73 35 44 6c 69 64 78 49 74 65 72 20 2a 66  Fts5DlidxIter *f
ae30: 74 73 35 44 6c 69 64 78 49 74 65 72 49 6e 69 74  ts5DlidxIterInit
ae40: 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70  (.  Fts5Index *p
ae50: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
ae60: 20 20 20 20 2f 2a 20 46 74 73 35 20 42 61 63 6b      /* Fts5 Back
ae70: 65 6e 64 20 74 6f 20 69 74 65 72 61 74 65 20 77  end to iterate w
ae80: 69 74 68 69 6e 20 2a 2f 0a 20 20 69 6e 74 20 62  ithin */.  int b
ae90: 52 65 76 2c 20 20 20 20 20 20 20 20 20 20 20 20  Rev,            
aea0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
aeb0: 75 65 20 66 6f 72 20 4f 52 44 45 52 20 42 59 20  ue for ORDER BY 
aec0: 41 53 43 20 2a 2f 0a 20 20 69 6e 74 20 69 53 65  ASC */.  int iSe
aed0: 67 69 64 2c 20 20 20 20 20 20 20 20 20 20 20 20  gid,            
aee0: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 67 6d           /* Segm
aef0: 65 6e 74 20 69 64 20 2a 2f 0a 20 20 69 6e 74 20  ent id */.  int 
af00: 69 4c 65 61 66 50 67 20 20 20 20 20 20 20 20 20  iLeafPg         
af10: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
af20: 65 61 66 20 70 61 67 65 20 6e 75 6d 62 65 72 20  eaf page number 
af30: 74 6f 20 6c 6f 61 64 20 64 6c 69 64 78 20 66 6f  to load dlidx fo
af40: 72 20 2a 2f 0a 29 7b 0a 20 20 46 74 73 35 44 6c  r */.){.  Fts5Dl
af50: 69 64 78 49 74 65 72 20 2a 70 49 74 65 72 20 3d  idxIter *pIter =
af60: 20 30 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69   0;.  int i;.  i
af70: 6e 74 20 62 44 6f 6e 65 20 3d 20 30 3b 0a 0a 20  nt bDone = 0;.. 
af80: 20 66 6f 72 28 69 3d 30 3b 20 70 2d 3e 72 63 3d   for(i=0; p->rc=
af90: 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 62 44  =SQLITE_OK && bD
afa0: 6f 6e 65 3d 3d 30 3b 20 69 2b 2b 29 7b 0a 20 20  one==0; i++){.  
afb0: 20 20 69 6e 74 20 6e 42 79 74 65 20 3d 20 73 69    int nByte = si
afc0: 7a 65 6f 66 28 46 74 73 35 44 6c 69 64 78 49 74  zeof(Fts5DlidxIt
afd0: 65 72 29 20 2b 20 69 20 2a 20 73 69 7a 65 6f 66  er) + i * sizeof
afe0: 28 46 74 73 35 44 6c 69 64 78 4c 76 6c 29 3b 0a  (Fts5DlidxLvl);.
aff0: 20 20 20 20 46 74 73 35 44 6c 69 64 78 49 74 65      Fts5DlidxIte
b000: 72 20 2a 70 4e 65 77 3b 0a 0a 20 20 20 20 70 4e  r *pNew;..    pN
b010: 65 77 20 3d 20 28 46 74 73 35 44 6c 69 64 78 49  ew = (Fts5DlidxI
b020: 74 65 72 2a 29 73 71 6c 69 74 65 33 5f 72 65 61  ter*)sqlite3_rea
b030: 6c 6c 6f 63 28 70 49 74 65 72 2c 20 6e 42 79 74  lloc(pIter, nByt
b040: 65 29 3b 0a 20 20 20 20 69 66 28 20 70 4e 65 77  e);.    if( pNew
b050: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e  ==0 ){.      p->
b060: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
b070: 4d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  M;.    }else{.  
b080: 20 20 20 20 69 36 34 20 69 52 6f 77 69 64 20 3d      i64 iRowid =
b090: 20 46 54 53 35 5f 44 4c 49 44 58 5f 52 4f 57 49   FTS5_DLIDX_ROWI
b0a0: 44 28 69 53 65 67 69 64 2c 20 69 2c 20 69 4c 65  D(iSegid, i, iLe
b0b0: 61 66 50 67 29 3b 0a 20 20 20 20 20 20 46 74 73  afPg);.      Fts
b0c0: 35 44 6c 69 64 78 4c 76 6c 20 2a 70 4c 76 6c 20  5DlidxLvl *pLvl 
b0d0: 3d 20 26 70 4e 65 77 2d 3e 61 4c 76 6c 5b 69 5d  = &pNew->aLvl[i]
b0e0: 3b 0a 20 20 20 20 20 20 70 49 74 65 72 20 3d 20  ;.      pIter = 
b0f0: 70 4e 65 77 3b 0a 20 20 20 20 20 20 6d 65 6d 73  pNew;.      mems
b100: 65 74 28 70 4c 76 6c 2c 20 30 2c 20 73 69 7a 65  et(pLvl, 0, size
b110: 6f 66 28 46 74 73 35 44 6c 69 64 78 4c 76 6c 29  of(Fts5DlidxLvl)
b120: 29 3b 0a 20 20 20 20 20 20 70 4c 76 6c 2d 3e 70  );.      pLvl->p
b130: 44 61 74 61 20 3d 20 66 74 73 35 44 61 74 61 52  Data = fts5DataR
b140: 65 61 64 28 70 2c 20 69 52 6f 77 69 64 29 3b 0a  ead(p, iRowid);.
b150: 20 20 20 20 20 20 69 66 28 20 70 4c 76 6c 2d 3e        if( pLvl->
b160: 70 44 61 74 61 20 26 26 20 28 70 4c 76 6c 2d 3e  pData && (pLvl->
b170: 70 44 61 74 61 2d 3e 70 5b 30 5d 20 26 20 30 78  pData->p[0] & 0x
b180: 30 30 30 31 29 3d 3d 30 20 29 7b 0a 20 20 20 20  0001)==0 ){.    
b190: 20 20 20 20 62 44 6f 6e 65 20 3d 20 31 3b 0a 20      bDone = 1;. 
b1a0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 49 74       }.      pIt
b1b0: 65 72 2d 3e 6e 4c 76 6c 20 3d 20 69 2b 31 3b 0a  er->nLvl = i+1;.
b1c0: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28      }.  }..  if(
b1d0: 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
b1e0: 4b 20 29 7b 0a 20 20 20 20 70 49 74 65 72 2d 3e  K ){.    pIter->
b1f0: 69 53 65 67 69 64 20 3d 20 69 53 65 67 69 64 3b  iSegid = iSegid;
b200: 0a 20 20 20 20 69 66 28 20 62 52 65 76 3d 3d 30  .    if( bRev==0
b210: 20 29 7b 0a 20 20 20 20 20 20 66 74 73 35 44 6c   ){.      fts5Dl
b220: 69 64 78 49 74 65 72 46 69 72 73 74 28 70 49 74  idxIterFirst(pIt
b230: 65 72 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  er);.    }else{.
b240: 20 20 20 20 20 20 66 74 73 35 44 6c 69 64 78 49        fts5DlidxI
b250: 74 65 72 4c 61 73 74 28 70 2c 20 70 49 74 65 72  terLast(p, pIter
b260: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
b270: 69 66 28 20 70 2d 3e 72 63 21 3d 53 51 4c 49 54  if( p->rc!=SQLIT
b280: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 66 74 73 35  E_OK ){.    fts5
b290: 44 6c 69 64 78 49 74 65 72 46 72 65 65 28 70 49  DlidxIterFree(pI
b2a0: 74 65 72 29 3b 0a 20 20 20 20 70 49 74 65 72 20  ter);.    pIter 
b2b0: 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75  = 0;.  }..  retu
b2c0: 72 6e 20 70 49 74 65 72 3b 0a 7d 0a 0a 73 74 61  rn pIter;.}..sta
b2d0: 74 69 63 20 69 36 34 20 66 74 73 35 44 6c 69 64  tic i64 fts5Dlid
b2e0: 78 49 74 65 72 52 6f 77 69 64 28 46 74 73 35 44  xIterRowid(Fts5D
b2f0: 6c 69 64 78 49 74 65 72 20 2a 70 49 74 65 72 29  lidxIter *pIter)
b300: 7b 0a 20 20 72 65 74 75 72 6e 20 70 49 74 65 72  {.  return pIter
b310: 2d 3e 61 4c 76 6c 5b 30 5d 2e 69 52 6f 77 69 64  ->aLvl[0].iRowid
b320: 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74 20 66  ;.}.static int f
b330: 74 73 35 44 6c 69 64 78 49 74 65 72 50 67 6e 6f  ts5DlidxIterPgno
b340: 28 46 74 73 35 44 6c 69 64 78 49 74 65 72 20 2a  (Fts5DlidxIter *
b350: 70 49 74 65 72 29 7b 0a 20 20 72 65 74 75 72 6e  pIter){.  return
b360: 20 70 49 74 65 72 2d 3e 61 4c 76 6c 5b 30 5d 2e   pIter->aLvl[0].
b370: 69 4c 65 61 66 50 67 6e 6f 3b 0a 7d 0a 0a 2f 2a  iLeafPgno;.}../*
b380: 0a 2a 2a 20 4c 6f 61 64 20 74 68 65 20 6e 65 78  .** Load the nex
b390: 74 20 6c 65 61 66 20 70 61 67 65 20 69 6e 74 6f  t leaf page into
b3a0: 20 74 68 65 20 73 65 67 6d 65 6e 74 20 69 74 65   the segment ite
b3b0: 72 61 74 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  rator..*/.static
b3c0: 20 76 6f 69 64 20 66 74 73 35 53 65 67 49 74 65   void fts5SegIte
b3d0: 72 4e 65 78 74 50 61 67 65 28 0a 20 20 46 74 73  rNextPage(.  Fts
b3e0: 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20  5Index *p,      
b3f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
b400: 46 54 53 35 20 62 61 63 6b 65 6e 64 20 6f 62 6a  FTS5 backend obj
b410: 65 63 74 20 2a 2f 0a 20 20 46 74 73 35 53 65 67  ect */.  Fts5Seg
b420: 49 74 65 72 20 2a 70 49 74 65 72 20 20 20 20 20  Iter *pIter     
b430: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72           /* Iter
b440: 61 74 6f 72 20 74 6f 20 61 64 76 61 6e 63 65 20  ator to advance 
b450: 74 6f 20 6e 65 78 74 20 70 61 67 65 20 2a 2f 0a  to next page */.
b460: 29 7b 0a 20 20 46 74 73 35 44 61 74 61 20 2a 70  ){.  Fts5Data *p
b470: 4c 65 61 66 3b 0a 20 20 46 74 73 35 53 74 72 75  Leaf;.  Fts5Stru
b480: 63 74 75 72 65 53 65 67 6d 65 6e 74 20 2a 70 53  ctureSegment *pS
b490: 65 67 20 3d 20 70 49 74 65 72 2d 3e 70 53 65 67  eg = pIter->pSeg
b4a0: 3b 0a 20 20 66 74 73 35 44 61 74 61 52 65 6c 65  ;.  fts5DataRele
b4b0: 61 73 65 28 70 49 74 65 72 2d 3e 70 4c 65 61 66  ase(pIter->pLeaf
b4c0: 29 3b 0a 20 20 70 49 74 65 72 2d 3e 69 4c 65 61  );.  pIter->iLea
b4d0: 66 50 67 6e 6f 2b 2b 3b 0a 20 20 69 66 28 20 70  fPgno++;.  if( p
b4e0: 49 74 65 72 2d 3e 70 4e 65 78 74 4c 65 61 66 20  Iter->pNextLeaf 
b4f0: 29 7b 0a 20 20 20 20 70 49 74 65 72 2d 3e 70 4c  ){.    pIter->pL
b500: 65 61 66 20 3d 20 70 49 74 65 72 2d 3e 70 4e 65  eaf = pIter->pNe
b510: 78 74 4c 65 61 66 3b 0a 20 20 20 20 70 49 74 65  xtLeaf;.    pIte
b520: 72 2d 3e 70 4e 65 78 74 4c 65 61 66 20 3d 20 30  r->pNextLeaf = 0
b530: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 49  ;.  }else if( pI
b540: 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 3c 3d  ter->iLeafPgno<=
b550: 70 53 65 67 2d 3e 70 67 6e 6f 4c 61 73 74 20 29  pSeg->pgnoLast )
b560: 7b 0a 20 20 20 20 70 49 74 65 72 2d 3e 70 4c 65  {.    pIter->pLe
b570: 61 66 20 3d 20 66 74 73 35 44 61 74 61 52 65 61  af = fts5DataRea
b580: 64 28 70 2c 20 0a 20 20 20 20 20 20 20 20 46 54  d(p, .        FT
b590: 53 35 5f 53 45 47 4d 45 4e 54 5f 52 4f 57 49 44  S5_SEGMENT_ROWID
b5a0: 28 70 53 65 67 2d 3e 69 53 65 67 69 64 2c 20 70  (pSeg->iSegid, p
b5b0: 49 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 29  Iter->iLeafPgno)
b5c0: 0a 20 20 20 20 29 3b 0a 20 20 7d 65 6c 73 65 7b  .    );.  }else{
b5d0: 0a 20 20 20 20 70 49 74 65 72 2d 3e 70 4c 65 61  .    pIter->pLea
b5e0: 66 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 70 4c 65  f = 0;.  }.  pLe
b5f0: 61 66 20 3d 20 70 49 74 65 72 2d 3e 70 4c 65 61  af = pIter->pLea
b600: 66 3b 0a 0a 20 20 69 66 28 20 70 4c 65 61 66 20  f;..  if( pLeaf 
b610: 29 7b 0a 20 20 20 20 70 49 74 65 72 2d 3e 69 50  ){.    pIter->iP
b620: 67 69 64 78 4f 66 66 20 3d 20 70 4c 65 61 66 2d  gidxOff = pLeaf-
b630: 3e 73 7a 4c 65 61 66 3b 0a 20 20 20 20 69 66 28  >szLeaf;.    if(
b640: 20 66 74 73 35 4c 65 61 66 49 73 54 65 72 6d 6c   fts5LeafIsTerml
b650: 65 73 73 28 70 4c 65 61 66 29 20 29 7b 0a 20 20  ess(pLeaf) ){.  
b660: 20 20 20 20 70 49 74 65 72 2d 3e 69 45 6e 64 6f      pIter->iEndo
b670: 66 44 6f 63 6c 69 73 74 20 3d 20 70 4c 65 61 66  fDoclist = pLeaf
b680: 2d 3e 6e 6e 2b 31 3b 0a 20 20 20 20 7d 65 6c 73  ->nn+1;.    }els
b690: 65 7b 0a 20 20 20 20 20 20 70 49 74 65 72 2d 3e  e{.      pIter->
b6a0: 69 50 67 69 64 78 4f 66 66 20 2b 3d 20 66 74 73  iPgidxOff += fts
b6b0: 35 47 65 74 56 61 72 69 6e 74 33 32 28 26 70 4c  5GetVarint32(&pL
b6c0: 65 61 66 2d 3e 70 5b 70 49 74 65 72 2d 3e 69 50  eaf->p[pIter->iP
b6d0: 67 69 64 78 4f 66 66 5d 2c 0a 20 20 20 20 20 20  gidxOff],.      
b6e0: 20 20 20 20 70 49 74 65 72 2d 3e 69 45 6e 64 6f      pIter->iEndo
b6f0: 66 44 6f 63 6c 69 73 74 0a 20 20 20 20 20 20 29  fDoclist.      )
b700: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  ;.    }.  }.}../
b710: 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20 70 20  *.** Argument p 
b720: 70 6f 69 6e 74 73 20 74 6f 20 61 20 62 75 66 66  points to a buff
b730: 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 61 20  er containing a 
b740: 76 61 72 69 6e 74 20 74 6f 20 62 65 20 69 6e 74  varint to be int
b750: 65 72 70 72 65 74 65 64 20 61 73 20 61 0a 2a 2a  erpreted as a.**
b760: 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74 20 73   position list s
b770: 69 7a 65 20 66 69 65 6c 64 2e 20 52 65 61 64 20  ize field. Read 
b780: 74 68 65 20 76 61 72 69 6e 74 20 61 6e 64 20 72  the varint and r
b790: 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72  eturn the number
b7a0: 20 6f 66 20 62 79 74 65 73 0a 2a 2a 20 72 65 61   of bytes.** rea
b7b0: 64 2e 20 42 65 66 6f 72 65 20 72 65 74 75 72 6e  d. Before return
b7c0: 69 6e 67 2c 20 73 65 74 20 2a 70 6e 53 7a 20 74  ing, set *pnSz t
b7d0: 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  o the number of 
b7e0: 62 79 74 65 73 20 69 6e 20 74 68 65 20 70 6f 73  bytes in the pos
b7f0: 69 74 69 6f 6e 0a 2a 2a 20 6c 69 73 74 2c 20 61  ition.** list, a
b800: 6e 64 20 2a 70 62 44 65 6c 20 74 6f 20 74 72 75  nd *pbDel to tru
b810: 65 20 69 66 20 74 68 65 20 64 65 6c 65 74 65 20  e if the delete 
b820: 66 6c 61 67 20 69 73 20 73 65 74 2c 20 6f 72 20  flag is set, or 
b830: 66 61 6c 73 65 20 6f 74 68 65 72 77 69 73 65 2e  false otherwise.
b840: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .*/.static int f
b850: 74 73 35 47 65 74 50 6f 73 6c 69 73 74 53 69 7a  ts5GetPoslistSiz
b860: 65 28 63 6f 6e 73 74 20 75 38 20 2a 70 2c 20 69  e(const u8 *p, i
b870: 6e 74 20 2a 70 6e 53 7a 2c 20 69 6e 74 20 2a 70  nt *pnSz, int *p
b880: 62 44 65 6c 29 7b 0a 20 20 69 6e 74 20 6e 53 7a  bDel){.  int nSz
b890: 3b 0a 20 20 69 6e 74 20 6e 20 3d 20 30 3b 0a 20  ;.  int n = 0;. 
b8a0: 20 66 74 73 35 46 61 73 74 47 65 74 56 61 72 69   fts5FastGetVari
b8b0: 6e 74 33 32 28 70 2c 20 6e 2c 20 6e 53 7a 29 3b  nt32(p, n, nSz);
b8c0: 0a 20 20 61 73 73 65 72 74 5f 6e 63 28 20 6e 53  .  assert_nc( nS
b8d0: 7a 3e 3d 30 20 29 3b 0a 20 20 2a 70 6e 53 7a 20  z>=0 );.  *pnSz 
b8e0: 3d 20 6e 53 7a 2f 32 3b 0a 20 20 2a 70 62 44 65  = nSz/2;.  *pbDe
b8f0: 6c 20 3d 20 6e 53 7a 20 26 20 30 78 30 30 30 31  l = nSz & 0x0001
b900: 3b 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a  ;.  return n;.}.
b910: 0a 2f 2a 0a 2a 2a 20 46 74 73 35 53 65 67 49 74  ./*.** Fts5SegIt
b920: 65 72 2e 69 4c 65 61 66 4f 66 66 73 65 74 20 63  er.iLeafOffset c
b930: 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 73 20  urrently points 
b940: 74 6f 20 74 68 65 20 66 69 72 73 74 20 62 79 74  to the first byt
b950: 65 20 6f 66 20 61 0a 2a 2a 20 70 6f 73 69 74 69  e of a.** positi
b960: 6f 6e 2d 6c 69 73 74 20 73 69 7a 65 20 66 69 65  on-list size fie
b970: 6c 64 2e 20 52 65 61 64 20 74 68 65 20 76 61 6c  ld. Read the val
b980: 75 65 20 6f 66 20 74 68 65 20 66 69 65 6c 64 20  ue of the field 
b990: 61 6e 64 20 73 74 6f 72 65 20 69 74 0a 2a 2a 20  and store it.** 
b9a0: 69 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  in the following
b9b0: 20 76 61 72 69 61 62 6c 65 73 3a 0a 2a 2a 0a 2a   variables:.**.*
b9c0: 2a 20 20 20 46 74 73 35 53 65 67 49 74 65 72 2e  *   Fts5SegIter.
b9d0: 6e 50 6f 73 0a 2a 2a 20 20 20 46 74 73 35 53 65  nPos.**   Fts5Se
b9e0: 67 49 74 65 72 2e 62 44 65 6c 0a 2a 2a 0a 2a 2a  gIter.bDel.**.**
b9f0: 20 4c 65 61 76 65 20 46 74 73 35 53 65 67 49 74   Leave Fts5SegIt
ba00: 65 72 2e 69 4c 65 61 66 4f 66 66 73 65 74 20 70  er.iLeafOffset p
ba10: 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 65 20 66  ointing to the f
ba20: 69 72 73 74 20 62 79 74 65 20 6f 66 20 74 68 65  irst byte of the
ba30: 20 0a 2a 2a 20 70 6f 73 69 74 69 6f 6e 20 6c 69   .** position li
ba40: 73 74 20 63 6f 6e 74 65 6e 74 20 28 69 66 20 61  st content (if a
ba50: 6e 79 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ny)..*/.static v
ba60: 6f 69 64 20 66 74 73 35 53 65 67 49 74 65 72 4c  oid fts5SegIterL
ba70: 6f 61 64 4e 50 6f 73 28 46 74 73 35 49 6e 64 65  oadNPos(Fts5Inde
ba80: 78 20 2a 70 2c 20 46 74 73 35 53 65 67 49 74 65  x *p, Fts5SegIte
ba90: 72 20 2a 70 49 74 65 72 29 7b 0a 20 20 69 66 28  r *pIter){.  if(
baa0: 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
bab0: 4b 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 4f 66  K ){.    int iOf
bac0: 66 20 3d 20 70 49 74 65 72 2d 3e 69 4c 65 61 66  f = pIter->iLeaf
bad0: 4f 66 66 73 65 74 3b 20 20 2f 2a 20 4f 66 66 73  Offset;  /* Offs
bae0: 65 74 20 74 6f 20 72 65 61 64 20 61 74 20 2a 2f  et to read at */
baf0: 0a 20 20 20 20 69 6e 74 20 6e 53 7a 3b 0a 20 20  .    int nSz;.  
bb00: 20 20 41 53 53 45 52 54 5f 53 5a 4c 45 41 46 5f    ASSERT_SZLEAF_
bb10: 4f 4b 28 70 49 74 65 72 2d 3e 70 4c 65 61 66 29  OK(pIter->pLeaf)
bb20: 3b 0a 20 20 20 20 66 74 73 35 46 61 73 74 47 65  ;.    fts5FastGe
bb30: 74 56 61 72 69 6e 74 33 32 28 70 49 74 65 72 2d  tVarint32(pIter-
bb40: 3e 70 4c 65 61 66 2d 3e 70 2c 20 69 4f 66 66 2c  >pLeaf->p, iOff,
bb50: 20 6e 53 7a 29 3b 0a 20 20 20 20 70 49 74 65 72   nSz);.    pIter
bb60: 2d 3e 62 44 65 6c 20 3d 20 28 6e 53 7a 20 26 20  ->bDel = (nSz & 
bb70: 30 78 30 30 30 31 29 3b 0a 20 20 20 20 70 49 74  0x0001);.    pIt
bb80: 65 72 2d 3e 6e 50 6f 73 20 3d 20 6e 53 7a 3e 3e  er->nPos = nSz>>
bb90: 31 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 69 4c  1;.    pIter->iL
bba0: 65 61 66 4f 66 66 73 65 74 20 3d 20 69 4f 66 66  eafOffset = iOff
bbb0: 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63 20  ;.  }.}..static 
bbc0: 76 6f 69 64 20 66 74 73 35 53 65 67 49 74 65 72  void fts5SegIter
bbd0: 4c 6f 61 64 52 6f 77 69 64 28 46 74 73 35 49 6e  LoadRowid(Fts5In
bbe0: 64 65 78 20 2a 70 2c 20 46 74 73 35 53 65 67 49  dex *p, Fts5SegI
bbf0: 74 65 72 20 2a 70 49 74 65 72 29 7b 0a 20 20 75  ter *pIter){.  u
bc00: 38 20 2a 61 20 3d 20 70 49 74 65 72 2d 3e 70 4c  8 *a = pIter->pL
bc10: 65 61 66 2d 3e 70 3b 20 20 20 20 20 20 20 20 2f  eaf->p;        /
bc20: 2a 20 42 75 66 66 65 72 20 74 6f 20 72 65 61 64  * Buffer to read
bc30: 20 64 61 74 61 20 66 72 6f 6d 20 2a 2f 0a 20 20   data from */.  
bc40: 69 6e 74 20 69 4f 66 66 20 3d 20 70 49 74 65 72  int iOff = pIter
bc50: 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 3b 0a 0a  ->iLeafOffset;..
bc60: 20 20 41 53 53 45 52 54 5f 53 5a 4c 45 41 46 5f    ASSERT_SZLEAF_
bc70: 4f 4b 28 70 49 74 65 72 2d 3e 70 4c 65 61 66 29  OK(pIter->pLeaf)
bc80: 3b 0a 20 20 69 66 28 20 69 4f 66 66 3e 3d 70 49  ;.  if( iOff>=pI
bc90: 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 73 7a 4c 65  ter->pLeaf->szLe
bca0: 61 66 20 29 7b 0a 20 20 20 20 66 74 73 35 53 65  af ){.    fts5Se
bcb0: 67 49 74 65 72 4e 65 78 74 50 61 67 65 28 70 2c  gIterNextPage(p,
bcc0: 20 70 49 74 65 72 29 3b 0a 20 20 20 20 69 66 28   pIter);.    if(
bcd0: 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 3d 3d 30   pIter->pLeaf==0
bce0: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d   ){.      if( p-
bcf0: 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  >rc==SQLITE_OK )
bd00: 20 70 2d 3e 72 63 20 3d 20 46 54 53 35 5f 43 4f   p->rc = FTS5_CO
bd10: 52 52 55 50 54 3b 0a 20 20 20 20 20 20 72 65 74  RRUPT;.      ret
bd20: 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  urn;.    }.    i
bd30: 4f 66 66 20 3d 20 34 3b 0a 20 20 20 20 61 20 3d  Off = 4;.    a =
bd40: 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 70   pIter->pLeaf->p
bd50: 3b 0a 20 20 7d 0a 20 20 69 4f 66 66 20 2b 3d 20  ;.  }.  iOff += 
bd60: 73 71 6c 69 74 65 33 46 74 73 35 47 65 74 56 61  sqlite3Fts5GetVa
bd70: 72 69 6e 74 28 26 61 5b 69 4f 66 66 5d 2c 20 28  rint(&a[iOff], (
bd80: 75 36 34 2a 29 26 70 49 74 65 72 2d 3e 69 52 6f  u64*)&pIter->iRo
bd90: 77 69 64 29 3b 0a 20 20 70 49 74 65 72 2d 3e 69  wid);.  pIter->i
bda0: 4c 65 61 66 4f 66 66 73 65 74 20 3d 20 69 4f 66  LeafOffset = iOf
bdb0: 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 74 73 35  f;.}../*.** Fts5
bdc0: 53 65 67 49 74 65 72 2e 69 4c 65 61 66 4f 66 66  SegIter.iLeafOff
bdd0: 73 65 74 20 63 75 72 72 65 6e 74 6c 79 20 70 6f  set currently po
bde0: 69 6e 74 73 20 74 6f 20 74 68 65 20 66 69 72 73  ints to the firs
bdf0: 74 20 62 79 74 65 20 6f 66 20 74 68 65 20 0a 2a  t byte of the .*
be00: 2a 20 22 6e 53 75 66 66 69 78 22 20 66 69 65 6c  * "nSuffix" fiel
be10: 64 20 6f 66 20 61 20 74 65 72 6d 2e 20 46 75 6e  d of a term. Fun
be20: 63 74 69 6f 6e 20 70 61 72 61 6d 65 74 65 72 20  ction parameter 
be30: 6e 4b 65 65 70 20 63 6f 6e 74 61 69 6e 73 20 74  nKeep contains t
be40: 68 65 20 76 61 6c 75 65 0a 2a 2a 20 6f 66 20 74  he value.** of t
be50: 68 65 20 22 6e 50 72 65 66 69 78 22 20 66 69 65  he "nPrefix" fie
be60: 6c 64 20 28 69 66 20 74 68 65 72 65 20 77 61 73  ld (if there was
be70: 20 6f 6e 65 20 2d 20 69 74 20 69 73 20 70 61 73   one - it is pas
be80: 73 65 64 20 30 20 69 66 20 74 68 69 73 20 69 73  sed 0 if this is
be90: 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20 74 65  .** the first te
bea0: 72 6d 20 69 6e 20 74 68 65 20 73 65 67 6d 65 6e  rm in the segmen
beb0: 74 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  t)..**.** This f
bec0: 75 6e 63 74 69 6f 6e 20 70 6f 70 75 6c 61 74 65  unction populate
bed0: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 46 74 73 35 53  s:.**.**   Fts5S
bee0: 65 67 49 74 65 72 2e 74 65 72 6d 0a 2a 2a 20 20  egIter.term.**  
bef0: 20 46 74 73 35 53 65 67 49 74 65 72 2e 72 6f 77   Fts5SegIter.row
bf00: 69 64 0a 2a 2a 0a 2a 2a 20 61 63 63 6f 72 64 69  id.**.** accordi
bf10: 6e 67 6c 79 20 61 6e 64 20 6c 65 61 76 65 73 20  ngly and leaves 
bf20: 28 46 74 73 35 53 65 67 49 74 65 72 2e 69 4c 65  (Fts5SegIter.iLe
bf30: 61 66 4f 66 66 73 65 74 29 20 73 65 74 20 74 6f  afOffset) set to
bf40: 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 0a   the content of.
bf50: 2a 2a 20 74 68 65 20 66 69 72 73 74 20 70 6f 73  ** the first pos
bf60: 69 74 69 6f 6e 20 6c 69 73 74 2e 20 54 68 65 20  ition list. The 
bf70: 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74 20 62 65  position list be
bf80: 6c 6f 6e 67 69 6e 67 20 74 6f 20 64 6f 63 75 6d  longing to docum
bf90: 65 6e 74 20 0a 2a 2a 20 28 46 74 73 35 53 65 67  ent .** (Fts5Seg
bfa0: 49 74 65 72 2e 69 52 6f 77 69 64 29 2e 0a 2a 2f  Iter.iRowid)..*/
bfb0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
bfc0: 35 53 65 67 49 74 65 72 4c 6f 61 64 54 65 72 6d  5SegIterLoadTerm
bfd0: 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 46  (Fts5Index *p, F
bfe0: 74 73 35 53 65 67 49 74 65 72 20 2a 70 49 74 65  ts5SegIter *pIte
bff0: 72 2c 20 69 6e 74 20 6e 4b 65 65 70 29 7b 0a 20  r, int nKeep){. 
c000: 20 75 38 20 2a 61 20 3d 20 70 49 74 65 72 2d 3e   u8 *a = pIter->
c010: 70 4c 65 61 66 2d 3e 70 3b 20 20 20 20 20 20 20  pLeaf->p;       
c020: 20 2f 2a 20 42 75 66 66 65 72 20 74 6f 20 72 65   /* Buffer to re
c030: 61 64 20 64 61 74 61 20 66 72 6f 6d 20 2a 2f 0a  ad data from */.
c040: 20 20 69 6e 74 20 69 4f 66 66 20 3d 20 70 49 74    int iOff = pIt
c050: 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 3b  er->iLeafOffset;
c060: 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 72    /* Offset to r
c070: 65 61 64 20 61 74 20 2a 2f 0a 20 20 69 6e 74 20  ead at */.  int 
c080: 6e 4e 65 77 3b 20 20 20 20 20 20 20 20 20 20 20  nNew;           
c090: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42              /* B
c0a0: 79 74 65 73 20 6f 66 20 6e 65 77 20 64 61 74 61  ytes of new data
c0b0: 20 2a 2f 0a 0a 20 20 69 4f 66 66 20 2b 3d 20 66   */..  iOff += f
c0c0: 74 73 35 47 65 74 56 61 72 69 6e 74 33 32 28 26  ts5GetVarint32(&
c0d0: 61 5b 69 4f 66 66 5d 2c 20 6e 4e 65 77 29 3b 0a  a[iOff], nNew);.
c0e0: 20 20 70 49 74 65 72 2d 3e 74 65 72 6d 2e 6e 20    pIter->term.n 
c0f0: 3d 20 6e 4b 65 65 70 3b 0a 20 20 66 74 73 35 42  = nKeep;.  fts5B
c100: 75 66 66 65 72 41 70 70 65 6e 64 42 6c 6f 62 28  ufferAppendBlob(
c110: 26 70 2d 3e 72 63 2c 20 26 70 49 74 65 72 2d 3e  &p->rc, &pIter->
c120: 74 65 72 6d 2c 20 6e 4e 65 77 2c 20 26 61 5b 69  term, nNew, &a[i
c130: 4f 66 66 5d 29 3b 0a 20 20 69 4f 66 66 20 2b 3d  Off]);.  iOff +=
c140: 20 6e 4e 65 77 3b 0a 20 20 70 49 74 65 72 2d 3e   nNew;.  pIter->
c150: 69 54 65 72 6d 4c 65 61 66 4f 66 66 73 65 74 20  iTermLeafOffset 
c160: 3d 20 69 4f 66 66 3b 0a 20 20 70 49 74 65 72 2d  = iOff;.  pIter-
c170: 3e 69 54 65 72 6d 4c 65 61 66 50 67 6e 6f 20 3d  >iTermLeafPgno =
c180: 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e   pIter->iLeafPgn
c190: 6f 3b 0a 20 20 70 49 74 65 72 2d 3e 69 4c 65 61  o;.  pIter->iLea
c1a0: 66 4f 66 66 73 65 74 20 3d 20 69 4f 66 66 3b 0a  fOffset = iOff;.
c1b0: 0a 20 20 69 66 28 20 70 49 74 65 72 2d 3e 69 50  .  if( pIter->iP
c1c0: 67 69 64 78 4f 66 66 3e 3d 70 49 74 65 72 2d 3e  gidxOff>=pIter->
c1d0: 70 4c 65 61 66 2d 3e 6e 6e 20 29 7b 0a 20 20 20  pLeaf->nn ){.   
c1e0: 20 70 49 74 65 72 2d 3e 69 45 6e 64 6f 66 44 6f   pIter->iEndofDo
c1f0: 63 6c 69 73 74 20 3d 20 70 49 74 65 72 2d 3e 70  clist = pIter->p
c200: 4c 65 61 66 2d 3e 6e 6e 2b 31 3b 0a 20 20 7d 65  Leaf->nn+1;.  }e
c210: 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 6e 45 78  lse{.    int nEx
c220: 74 72 61 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e  tra;.    pIter->
c230: 69 50 67 69 64 78 4f 66 66 20 2b 3d 20 66 74 73  iPgidxOff += fts
c240: 35 47 65 74 56 61 72 69 6e 74 33 32 28 26 61 5b  5GetVarint32(&a[
c250: 70 49 74 65 72 2d 3e 69 50 67 69 64 78 4f 66 66  pIter->iPgidxOff
c260: 5d 2c 20 6e 45 78 74 72 61 29 3b 0a 20 20 20 20  ], nExtra);.    
c270: 70 49 74 65 72 2d 3e 69 45 6e 64 6f 66 44 6f 63  pIter->iEndofDoc
c280: 6c 69 73 74 20 2b 3d 20 6e 45 78 74 72 61 3b 0a  list += nExtra;.
c290: 20 20 7d 0a 0a 20 20 66 74 73 35 53 65 67 49 74    }..  fts5SegIt
c2a0: 65 72 4c 6f 61 64 52 6f 77 69 64 28 70 2c 20 70  erLoadRowid(p, p
c2b0: 49 74 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Iter);.}../*.** 
c2c0: 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 69  Initialize the i
c2d0: 74 65 72 61 74 6f 72 20 6f 62 6a 65 63 74 20 70  terator object p
c2e0: 49 74 65 72 20 74 6f 20 69 74 65 72 61 74 65 20  Iter to iterate 
c2f0: 74 68 72 6f 75 67 68 20 74 68 65 20 65 6e 74 72  through the entr
c300: 69 65 73 20 69 6e 0a 2a 2a 20 73 65 67 6d 65 6e  ies in.** segmen
c310: 74 20 70 53 65 67 2e 20 54 68 65 20 69 74 65 72  t pSeg. The iter
c320: 61 74 6f 72 20 69 73 20 6c 65 66 74 20 70 6f 69  ator is left poi
c330: 6e 74 69 6e 67 20 74 6f 20 74 68 65 20 66 69 72  nting to the fir
c340: 73 74 20 65 6e 74 72 79 20 77 68 65 6e 20 0a 2a  st entry when .*
c350: 2a 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * this function 
c360: 72 65 74 75 72 6e 73 2e 0a 2a 2a 0a 2a 2a 20 49  returns..**.** I
c370: 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
c380: 73 2c 20 46 74 73 35 49 6e 64 65 78 2e 72 63 20  s, Fts5Index.rc 
c390: 69 73 20 73 65 74 20 74 6f 20 61 6e 20 61 70 70  is set to an app
c3a0: 72 6f 70 72 69 61 74 65 20 65 72 72 6f 72 20 63  ropriate error c
c3b0: 6f 64 65 2e 20 49 66 20 0a 2a 2a 20 61 6e 20 65  ode. If .** an e
c3c0: 72 72 6f 72 20 68 61 73 20 61 6c 72 65 61 64 79  rror has already
c3d0: 20 6f 63 63 75 72 72 65 64 20 77 68 65 6e 20 74   occurred when t
c3e0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
c3f0: 63 61 6c 6c 65 64 2c 20 69 74 20 69 73 20 61 20  called, it is a 
c400: 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63  no-op..*/.static
c410: 20 76 6f 69 64 20 66 74 73 35 53 65 67 49 74 65   void fts5SegIte
c420: 72 49 6e 69 74 28 0a 20 20 46 74 73 35 49 6e 64  rInit(.  Fts5Ind
c430: 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  ex *p,          
c440: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53 20           /* FTS 
c450: 69 6e 64 65 78 20 6f 62 6a 65 63 74 20 2a 2f 0a  index object */.
c460: 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65 53    Fts5StructureS
c470: 65 67 6d 65 6e 74 20 2a 70 53 65 67 2c 20 20 20  egment *pSeg,   
c480: 20 20 2f 2a 20 44 65 73 63 72 69 70 74 69 6f 6e    /* Description
c490: 20 6f 66 20 73 65 67 6d 65 6e 74 20 2a 2f 0a 20   of segment */. 
c4a0: 20 46 74 73 35 53 65 67 49 74 65 72 20 2a 70 49   Fts5SegIter *pI
c4b0: 74 65 72 20 20 20 20 20 20 20 20 20 20 20 20 20  ter             
c4c0: 20 2f 2a 20 4f 62 6a 65 63 74 20 74 6f 20 70 6f   /* Object to po
c4d0: 70 75 6c 61 74 65 20 2a 2f 0a 29 7b 0a 20 20 69  pulate */.){.  i
c4e0: 66 28 20 70 53 65 67 2d 3e 70 67 6e 6f 46 69 72  f( pSeg->pgnoFir
c4f0: 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20  st==0 ){.    /* 
c500: 54 68 69 73 20 68 61 70 70 65 6e 73 20 69 66 20  This happens if 
c510: 74 68 65 20 73 65 67 6d 65 6e 74 20 69 73 20 62  the segment is b
c520: 65 69 6e 67 20 75 73 65 64 20 61 73 20 61 6e 20  eing used as an 
c530: 69 6e 70 75 74 20 74 6f 20 61 6e 20 69 6e 63 72  input to an incr
c540: 65 6d 65 6e 74 61 6c 0a 20 20 20 20 2a 2a 20 6d  emental.    ** m
c550: 65 72 67 65 20 61 6e 64 20 61 6c 6c 20 64 61 74  erge and all dat
c560: 61 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65  a has already be
c570: 65 6e 20 22 74 72 69 6d 6d 65 64 22 2e 20 53 65  en "trimmed". Se
c580: 65 20 66 75 6e 63 74 69 6f 6e 0a 20 20 20 20 2a  e function.    *
c590: 2a 20 66 74 73 35 54 72 69 6d 53 65 67 6d 65 6e  * fts5TrimSegmen
c5a0: 74 73 28 29 20 66 6f 72 20 64 65 74 61 69 6c 73  ts() for details
c5b0: 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 6c  . In this case l
c5c0: 65 61 76 65 20 74 68 65 20 69 74 65 72 61 74 6f  eave the iterato
c5d0: 72 20 65 6d 70 74 79 2e 0a 20 20 20 20 2a 2a 20  r empty..    ** 
c5e0: 54 68 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20  The caller will 
c5f0: 73 65 65 20 74 68 65 20 28 70 49 74 65 72 2d 3e  see the (pIter->
c600: 70 4c 65 61 66 3d 3d 30 29 20 61 6e 64 20 61 73  pLeaf==0) and as
c610: 73 75 6d 65 20 74 68 65 20 69 74 65 72 61 74 6f  sume the iterato
c620: 72 20 69 73 0a 20 20 20 20 2a 2a 20 61 74 20 45  r is.    ** at E
c630: 4f 46 20 61 6c 72 65 61 64 79 2e 20 2a 2f 0a 20  OF already. */. 
c640: 20 20 20 61 73 73 65 72 74 28 20 70 49 74 65 72     assert( pIter
c650: 2d 3e 70 4c 65 61 66 3d 3d 30 20 29 3b 0a 20 20  ->pLeaf==0 );.  
c660: 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20    return;.  }.. 
c670: 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49   if( p->rc==SQLI
c680: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 6d 65 6d  TE_OK ){.    mem
c690: 73 65 74 28 70 49 74 65 72 2c 20 30 2c 20 73 69  set(pIter, 0, si
c6a0: 7a 65 6f 66 28 2a 70 49 74 65 72 29 29 3b 0a 20  zeof(*pIter));. 
c6b0: 20 20 20 70 49 74 65 72 2d 3e 70 53 65 67 20 3d     pIter->pSeg =
c6c0: 20 70 53 65 67 3b 0a 20 20 20 20 70 49 74 65 72   pSeg;.    pIter
c6d0: 2d 3e 69 4c 65 61 66 50 67 6e 6f 20 3d 20 70 53  ->iLeafPgno = pS
c6e0: 65 67 2d 3e 70 67 6e 6f 46 69 72 73 74 2d 31 3b  eg->pgnoFirst-1;
c6f0: 0a 20 20 20 20 66 74 73 35 53 65 67 49 74 65 72  .    fts5SegIter
c700: 4e 65 78 74 50 61 67 65 28 70 2c 20 70 49 74 65  NextPage(p, pIte
c710: 72 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70  r);.  }..  if( p
c720: 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
c730: 29 7b 0a 20 20 20 20 70 49 74 65 72 2d 3e 69 4c  ){.    pIter->iL
c740: 65 61 66 4f 66 66 73 65 74 20 3d 20 34 3b 0a 20  eafOffset = 4;. 
c750: 20 20 20 61 73 73 65 72 74 5f 6e 63 28 20 70 49     assert_nc( pI
c760: 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 6e 6e 3e 34  ter->pLeaf->nn>4
c770: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
c780: 66 74 73 35 4c 65 61 66 46 69 72 73 74 54 65 72  fts5LeafFirstTer
c790: 6d 4f 66 66 28 70 49 74 65 72 2d 3e 70 4c 65 61  mOff(pIter->pLea
c7a0: 66 29 3d 3d 34 20 29 3b 0a 20 20 20 20 70 49 74  f)==4 );.    pIt
c7b0: 65 72 2d 3e 69 50 67 69 64 78 4f 66 66 20 3d 20  er->iPgidxOff = 
c7c0: 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 73 7a  pIter->pLeaf->sz
c7d0: 4c 65 61 66 2b 31 3b 0a 20 20 20 20 66 74 73 35  Leaf+1;.    fts5
c7e0: 53 65 67 49 74 65 72 4c 6f 61 64 54 65 72 6d 28  SegIterLoadTerm(
c7f0: 70 2c 20 70 49 74 65 72 2c 20 30 29 3b 0a 20 20  p, pIter, 0);.  
c800: 20 20 66 74 73 35 53 65 67 49 74 65 72 4c 6f 61    fts5SegIterLoa
c810: 64 4e 50 6f 73 28 70 2c 20 70 49 74 65 72 29 3b  dNPos(p, pIter);
c820: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  .  }.}../*.** Th
c830: 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 6f  is function is o
c840: 6e 6c 79 20 65 76 65 72 20 63 61 6c 6c 65 64 20  nly ever called 
c850: 6f 6e 20 69 74 65 72 61 74 6f 72 73 20 63 72 65  on iterators cre
c860: 61 74 65 64 20 62 79 20 63 61 6c 6c 73 20 74 6f  ated by calls to
c870: 0a 2a 2a 20 46 74 73 35 49 6e 64 65 78 51 75 65  .** Fts5IndexQue
c880: 72 79 28 29 20 77 69 74 68 20 74 68 65 20 46 54  ry() with the FT
c890: 53 35 49 4e 44 45 58 5f 51 55 45 52 59 5f 44 45  S5INDEX_QUERY_DE
c8a0: 53 43 20 66 6c 61 67 20 73 65 74 2e 0a 2a 2a 0a  SC flag set..**.
c8b0: 2a 2a 20 54 68 65 20 69 74 65 72 61 74 6f 72 20  ** The iterator 
c8c0: 69 73 20 69 6e 20 61 6e 20 75 6e 75 73 75 61 6c  is in an unusual
c8d0: 20 73 74 61 74 65 20 77 68 65 6e 20 74 68 69 73   state when this
c8e0: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
c8f0: 6c 65 64 3a 20 74 68 65 0a 2a 2a 20 46 74 73 35  led: the.** Fts5
c900: 53 65 67 49 74 65 72 2e 69 4c 65 61 66 4f 66 66  SegIter.iLeafOff
c910: 73 65 74 20 76 61 72 69 61 62 6c 65 20 69 73 20  set variable is 
c920: 73 65 74 20 74 6f 20 74 68 65 20 6f 66 66 73 65  set to the offse
c930: 74 20 6f 66 20 74 68 65 20 73 74 61 72 74 20 6f  t of the start o
c940: 66 0a 2a 2a 20 74 68 65 20 70 6f 73 69 74 69 6f  f.** the positio
c950: 6e 2d 6c 69 73 74 20 73 69 7a 65 20 66 69 65 6c  n-list size fiel
c960: 64 20 66 6f 72 20 74 68 65 20 66 69 72 73 74 20  d for the first 
c970: 72 65 6c 65 76 61 6e 74 20 72 6f 77 69 64 20 6f  relevant rowid o
c980: 6e 20 74 68 65 20 70 61 67 65 2e 0a 2a 2a 20 46  n the page..** F
c990: 74 73 35 53 65 67 49 74 65 72 2e 72 6f 77 69 64  ts5SegIter.rowid
c9a0: 20 69 73 20 73 65 74 2c 20 62 75 74 20 6e 50 6f   is set, but nPo
c9b0: 73 20 61 6e 64 20 62 44 65 6c 20 61 72 65 20 6e  s and bDel are n
c9c0: 6f 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ot..**.** This f
c9d0: 75 6e 63 74 69 6f 6e 20 61 64 76 61 6e 63 65 73  unction advances
c9e0: 20 74 68 65 20 69 74 65 72 61 74 6f 72 20 73 6f   the iterator so
c9f0: 20 74 68 61 74 20 69 74 20 70 6f 69 6e 74 73 20   that it points 
ca00: 74 6f 20 74 68 65 20 6c 61 73 74 20 0a 2a 2a 20  to the last .** 
ca10: 72 65 6c 65 76 61 6e 74 20 72 6f 77 69 64 20 6f  relevant rowid o
ca20: 6e 20 74 68 65 20 70 61 67 65 20 61 6e 64 2c 20  n the page and, 
ca30: 69 66 20 6e 65 63 65 73 73 61 72 79 2c 20 69 6e  if necessary, in
ca40: 69 74 69 61 6c 69 7a 65 73 20 74 68 65 20 0a 2a  itializes the .*
ca50: 2a 20 61 52 6f 77 69 64 4f 66 66 73 65 74 5b 5d  * aRowidOffset[]
ca60: 20 61 6e 64 20 69 52 6f 77 69 64 4f 66 66 73 65   and iRowidOffse
ca70: 74 20 76 61 72 69 61 62 6c 65 73 2e 20 41 74 20  t variables. At 
ca80: 74 68 69 73 20 70 6f 69 6e 74 20 74 68 65 20 69  this point the i
ca90: 74 65 72 61 74 6f 72 0a 2a 2a 20 69 73 20 69 6e  terator.** is in
caa0: 20 69 74 73 20 72 65 67 75 6c 61 72 20 73 74 61   its regular sta
cab0: 74 65 20 2d 20 46 74 73 35 53 65 67 49 74 65 72  te - Fts5SegIter
cac0: 2e 69 4c 65 61 66 4f 66 66 73 65 74 20 70 6f 69  .iLeafOffset poi
cad0: 6e 74 73 20 74 6f 20 74 68 65 20 66 69 72 73 74  nts to the first
cae0: 0a 2a 2a 20 62 79 74 65 20 6f 66 20 74 68 65 20  .** byte of the 
caf0: 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74 20 63 6f  position list co
cb00: 6e 74 65 6e 74 20 61 73 73 6f 63 69 61 74 65 64  ntent associated
cb10: 20 77 69 74 68 20 73 61 69 64 20 72 6f 77 69 64   with said rowid
cb20: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
cb30: 20 66 74 73 35 53 65 67 49 74 65 72 52 65 76 65   fts5SegIterReve
cb40: 72 73 65 49 6e 69 74 50 61 67 65 28 46 74 73 35  rseInitPage(Fts5
cb50: 49 6e 64 65 78 20 2a 70 2c 20 46 74 73 35 53 65  Index *p, Fts5Se
cb60: 67 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a 20  gIter *pIter){. 
cb70: 20 69 6e 74 20 6e 20 3d 20 70 49 74 65 72 2d 3e   int n = pIter->
cb80: 70 4c 65 61 66 2d 3e 73 7a 4c 65 61 66 3b 0a 20  pLeaf->szLeaf;. 
cb90: 20 69 6e 74 20 69 20 3d 20 70 49 74 65 72 2d 3e   int i = pIter->
cba0: 69 4c 65 61 66 4f 66 66 73 65 74 3b 0a 20 20 75  iLeafOffset;.  u
cbb0: 38 20 2a 61 20 3d 20 70 49 74 65 72 2d 3e 70 4c  8 *a = pIter->pL
cbc0: 65 61 66 2d 3e 70 3b 0a 20 20 69 6e 74 20 69 52  eaf->p;.  int iR
cbd0: 6f 77 69 64 4f 66 66 73 65 74 20 3d 20 30 3b 0a  owidOffset = 0;.
cbe0: 0a 20 20 69 66 28 20 6e 3e 70 49 74 65 72 2d 3e  .  if( n>pIter->
cbf0: 69 45 6e 64 6f 66 44 6f 63 6c 69 73 74 20 29 7b  iEndofDoclist ){
cc00: 0a 20 20 20 20 6e 20 3d 20 70 49 74 65 72 2d 3e  .    n = pIter->
cc10: 69 45 6e 64 6f 66 44 6f 63 6c 69 73 74 3b 0a 20  iEndofDoclist;. 
cc20: 20 7d 0a 0a 20 20 41 53 53 45 52 54 5f 53 5a 4c   }..  ASSERT_SZL
cc30: 45 41 46 5f 4f 4b 28 70 49 74 65 72 2d 3e 70 4c  EAF_OK(pIter->pL
cc40: 65 61 66 29 3b 0a 20 20 77 68 69 6c 65 28 20 31  eaf);.  while( 1
cc50: 20 29 7b 0a 20 20 20 20 69 36 34 20 69 44 65 6c   ){.    i64 iDel
cc60: 74 61 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20  ta = 0;.    int 
cc70: 6e 50 6f 73 3b 0a 20 20 20 20 69 6e 74 20 62 44  nPos;.    int bD
cc80: 75 6d 6d 79 3b 0a 0a 20 20 20 20 69 20 2b 3d 20  ummy;..    i += 
cc90: 66 74 73 35 47 65 74 50 6f 73 6c 69 73 74 53 69  fts5GetPoslistSi
cca0: 7a 65 28 26 61 5b 69 5d 2c 20 26 6e 50 6f 73 2c  ze(&a[i], &nPos,
ccb0: 20 26 62 44 75 6d 6d 79 29 3b 0a 20 20 20 20 69   &bDummy);.    i
ccc0: 20 2b 3d 20 6e 50 6f 73 3b 0a 20 20 20 20 69 66   += nPos;.    if
ccd0: 28 20 69 3e 3d 6e 20 29 20 62 72 65 61 6b 3b 0a  ( i>=n ) break;.
cce0: 20 20 20 20 69 20 2b 3d 20 66 74 73 35 47 65 74      i += fts5Get
ccf0: 56 61 72 69 6e 74 28 26 61 5b 69 5d 2c 20 28 75  Varint(&a[i], (u
cd00: 36 34 2a 29 26 69 44 65 6c 74 61 29 3b 0a 20 20  64*)&iDelta);.  
cd10: 20 20 70 49 74 65 72 2d 3e 69 52 6f 77 69 64 20    pIter->iRowid 
cd20: 2b 3d 20 69 44 65 6c 74 61 3b 0a 0a 20 20 20 20  += iDelta;..    
cd30: 69 66 28 20 69 52 6f 77 69 64 4f 66 66 73 65 74  if( iRowidOffset
cd40: 3e 3d 70 49 74 65 72 2d 3e 6e 52 6f 77 69 64 4f  >=pIter->nRowidO
cd50: 66 66 73 65 74 20 29 7b 0a 20 20 20 20 20 20 69  ffset ){.      i
cd60: 6e 74 20 6e 4e 65 77 20 3d 20 70 49 74 65 72 2d  nt nNew = pIter-
cd70: 3e 6e 52 6f 77 69 64 4f 66 66 73 65 74 20 2b 20  >nRowidOffset + 
cd80: 38 3b 0a 20 20 20 20 20 20 69 6e 74 20 2a 61 4e  8;.      int *aN
cd90: 65 77 20 3d 20 28 69 6e 74 2a 29 73 71 6c 69 74  ew = (int*)sqlit
cda0: 65 33 5f 72 65 61 6c 6c 6f 63 28 70 49 74 65 72  e3_realloc(pIter
cdb0: 2d 3e 61 52 6f 77 69 64 4f 66 66 73 65 74 2c 20  ->aRowidOffset, 
cdc0: 6e 4e 65 77 2a 73 69 7a 65 6f 66 28 69 6e 74 29  nNew*sizeof(int)
cdd0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 61 4e 65  );.      if( aNe
cde0: 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  w==0 ){.        
cdf0: 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e  p->rc = SQLITE_N
ce00: 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 62 72  OMEM;.        br
ce10: 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
ce20: 20 20 20 70 49 74 65 72 2d 3e 61 52 6f 77 69 64     pIter->aRowid
ce30: 4f 66 66 73 65 74 20 3d 20 61 4e 65 77 3b 0a 20  Offset = aNew;. 
ce40: 20 20 20 20 20 70 49 74 65 72 2d 3e 6e 52 6f 77       pIter->nRow
ce50: 69 64 4f 66 66 73 65 74 20 3d 20 6e 4e 65 77 3b  idOffset = nNew;
ce60: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 49 74 65  .    }..    pIte
ce70: 72 2d 3e 61 52 6f 77 69 64 4f 66 66 73 65 74 5b  r->aRowidOffset[
ce80: 69 52 6f 77 69 64 4f 66 66 73 65 74 2b 2b 5d 20  iRowidOffset++] 
ce90: 3d 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66  = pIter->iLeafOf
cea0: 66 73 65 74 3b 0a 20 20 20 20 70 49 74 65 72 2d  fset;.    pIter-
ceb0: 3e 69 4c 65 61 66 4f 66 66 73 65 74 20 3d 20 69  >iLeafOffset = i
cec0: 3b 0a 20 20 7d 0a 20 20 70 49 74 65 72 2d 3e 69  ;.  }.  pIter->i
ced0: 52 6f 77 69 64 4f 66 66 73 65 74 20 3d 20 69 52  RowidOffset = iR
cee0: 6f 77 69 64 4f 66 66 73 65 74 3b 0a 20 20 66 74  owidOffset;.  ft
cef0: 73 35 53 65 67 49 74 65 72 4c 6f 61 64 4e 50 6f  s5SegIterLoadNPo
cf00: 73 28 70 2c 20 70 49 74 65 72 29 3b 0a 7d 0a 0a  s(p, pIter);.}..
cf10: 2f 2a 0a 2a 2a 0a 2a 2f 0a 73 74 61 74 69 63 20  /*.**.*/.static 
cf20: 76 6f 69 64 20 66 74 73 35 53 65 67 49 74 65 72  void fts5SegIter
cf30: 52 65 76 65 72 73 65 4e 65 77 50 61 67 65 28 46  ReverseNewPage(F
cf40: 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 46 74 73  ts5Index *p, Fts
cf50: 35 53 65 67 49 74 65 72 20 2a 70 49 74 65 72 29  5SegIter *pIter)
cf60: 7b 0a 20 20 61 73 73 65 72 74 28 20 70 49 74 65  {.  assert( pIte
cf70: 72 2d 3e 66 6c 61 67 73 20 26 20 46 54 53 35 5f  r->flags & FTS5_
cf80: 53 45 47 49 54 45 52 5f 52 45 56 45 52 53 45 20  SEGITER_REVERSE 
cf90: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 49 74  );.  assert( pIt
cfa0: 65 72 2d 3e 66 6c 61 67 73 20 26 20 46 54 53 35  er->flags & FTS5
cfb0: 5f 53 45 47 49 54 45 52 5f 4f 4e 45 54 45 52 4d  _SEGITER_ONETERM
cfc0: 20 29 3b 0a 0a 20 20 66 74 73 35 44 61 74 61 52   );..  fts5DataR
cfd0: 65 6c 65 61 73 65 28 70 49 74 65 72 2d 3e 70 4c  elease(pIter->pL
cfe0: 65 61 66 29 3b 0a 20 20 70 49 74 65 72 2d 3e 70  eaf);.  pIter->p
cff0: 4c 65 61 66 20 3d 20 30 3b 0a 20 20 77 68 69 6c  Leaf = 0;.  whil
d000: 65 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  e( p->rc==SQLITE
d010: 5f 4f 4b 20 26 26 20 70 49 74 65 72 2d 3e 69 4c  _OK && pIter->iL
d020: 65 61 66 50 67 6e 6f 3e 70 49 74 65 72 2d 3e 69  eafPgno>pIter->i
d030: 54 65 72 6d 4c 65 61 66 50 67 6e 6f 20 29 7b 0a  TermLeafPgno ){.
d040: 20 20 20 20 46 74 73 35 44 61 74 61 20 2a 70 4e      Fts5Data *pN
d050: 65 77 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 69  ew;.    pIter->i
d060: 4c 65 61 66 50 67 6e 6f 2d 2d 3b 0a 20 20 20 20  LeafPgno--;.    
d070: 70 4e 65 77 20 3d 20 66 74 73 35 44 61 74 61 52  pNew = fts5DataR
d080: 65 61 64 28 70 2c 20 46 54 53 35 5f 53 45 47 4d  ead(p, FTS5_SEGM
d090: 45 4e 54 5f 52 4f 57 49 44 28 0a 20 20 20 20 20  ENT_ROWID(.     
d0a0: 20 20 20 20 20 70 49 74 65 72 2d 3e 70 53 65 67       pIter->pSeg
d0b0: 2d 3e 69 53 65 67 69 64 2c 20 70 49 74 65 72 2d  ->iSegid, pIter-
d0c0: 3e 69 4c 65 61 66 50 67 6e 6f 0a 20 20 20 20 29  >iLeafPgno.    )
d0d0: 29 3b 0a 20 20 20 20 69 66 28 20 70 4e 65 77 20  );.    if( pNew 
d0e0: 29 7b 0a 20 20 20 20 20 20 2f 2a 20 69 54 65 72  ){.      /* iTer
d0f0: 6d 4c 65 61 66 4f 66 66 73 65 74 20 6d 61 79 20  mLeafOffset may 
d100: 62 65 20 65 71 75 61 6c 20 74 6f 20 73 7a 4c 65  be equal to szLe
d110: 61 66 20 69 66 20 74 68 65 20 74 65 72 6d 20 69  af if the term i
d120: 73 20 74 68 65 20 6c 61 73 74 0a 20 20 20 20 20  s the last.     
d130: 20 2a 2a 20 74 68 69 6e 67 20 6f 6e 20 74 68 65   ** thing on the
d140: 20 70 61 67 65 20 2d 20 69 2e 65 2e 20 74 68 65   page - i.e. the
d150: 20 66 69 72 73 74 20 72 6f 77 69 64 20 69 73 20   first rowid is 
d160: 6f 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  on the following
d170: 20 70 61 67 65 2e 0a 20 20 20 20 20 20 2a 2a 20   page..      ** 
d180: 49 6e 20 74 68 69 73 20 63 61 73 65 20 6c 65 61  In this case lea
d190: 66 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 3d 3d  f pIter->pLeaf==
d1a0: 30 2c 20 74 68 69 73 20 69 74 65 72 61 74 6f 72  0, this iterator
d1b0: 20 69 73 20 61 74 20 45 4f 46 2e 20 2a 2f 0a 20   is at EOF. */. 
d1c0: 20 20 20 20 20 69 66 28 20 70 49 74 65 72 2d 3e       if( pIter->
d1d0: 69 4c 65 61 66 50 67 6e 6f 3d 3d 70 49 74 65 72  iLeafPgno==pIter
d1e0: 2d 3e 69 54 65 72 6d 4c 65 61 66 50 67 6e 6f 20  ->iTermLeafPgno 
d1f0: 0a 20 20 20 20 20 20 20 26 26 20 70 49 74 65 72  .       && pIter
d200: 2d 3e 69 54 65 72 6d 4c 65 61 66 4f 66 66 73 65  ->iTermLeafOffse
d210: 74 3c 70 4e 65 77 2d 3e 73 7a 4c 65 61 66 20 0a  t<pNew->szLeaf .
d220: 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
d230: 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 20 3d 20   pIter->pLeaf = 
d240: 70 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 70 49  pNew;.        pI
d250: 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74  ter->iLeafOffset
d260: 20 3d 20 70 49 74 65 72 2d 3e 69 54 65 72 6d 4c   = pIter->iTermL
d270: 65 61 66 4f 66 66 73 65 74 3b 0a 20 20 20 20 20  eafOffset;.     
d280: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
d290: 69 6e 74 20 69 52 6f 77 69 64 4f 66 66 3b 0a 20  int iRowidOff;. 
d2a0: 20 20 20 20 20 20 20 69 52 6f 77 69 64 4f 66 66         iRowidOff
d2b0: 20 3d 20 66 74 73 35 4c 65 61 66 46 69 72 73 74   = fts5LeafFirst
d2c0: 52 6f 77 69 64 4f 66 66 28 70 4e 65 77 29 3b 0a  RowidOff(pNew);.
d2d0: 20 20 20 20 20 20 20 20 69 66 28 20 69 52 6f 77          if( iRow
d2e0: 69 64 4f 66 66 20 29 7b 0a 20 20 20 20 20 20 20  idOff ){.       
d2f0: 20 20 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 20     pIter->pLeaf 
d300: 3d 20 70 4e 65 77 3b 0a 20 20 20 20 20 20 20 20  = pNew;.        
d310: 20 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66    pIter->iLeafOf
d320: 66 73 65 74 20 3d 20 69 52 6f 77 69 64 4f 66 66  fset = iRowidOff
d330: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
d340: 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 70    }..      if( p
d350: 49 74 65 72 2d 3e 70 4c 65 61 66 20 29 7b 0a 20  Iter->pLeaf ){. 
d360: 20 20 20 20 20 20 20 75 38 20 2a 61 20 3d 20 26         u8 *a = &
d370: 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 70 5b  pIter->pLeaf->p[
d380: 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73  pIter->iLeafOffs
d390: 65 74 5d 3b 0a 20 20 20 20 20 20 20 20 70 49 74  et];.        pIt
d3a0: 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 20  er->iLeafOffset 
d3b0: 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e 74  += fts5GetVarint
d3c0: 28 61 2c 20 28 75 36 34 2a 29 26 70 49 74 65 72  (a, (u64*)&pIter
d3d0: 2d 3e 69 52 6f 77 69 64 29 3b 0a 20 20 20 20 20  ->iRowid);.     
d3e0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
d3f0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 66  }else{.        f
d400: 74 73 35 44 61 74 61 52 65 6c 65 61 73 65 28 70  ts5DataRelease(p
d410: 4e 65 77 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  New);.      }.  
d420: 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70    }.  }..  if( p
d430: 49 74 65 72 2d 3e 70 4c 65 61 66 20 29 7b 0a 20  Iter->pLeaf ){. 
d440: 20 20 20 70 49 74 65 72 2d 3e 69 45 6e 64 6f 66     pIter->iEndof
d450: 44 6f 63 6c 69 73 74 20 3d 20 70 49 74 65 72 2d  Doclist = pIter-
d460: 3e 70 4c 65 61 66 2d 3e 6e 6e 2b 31 3b 0a 20 20  >pLeaf->nn+1;.  
d470: 20 20 66 74 73 35 53 65 67 49 74 65 72 52 65 76    fts5SegIterRev
d480: 65 72 73 65 49 6e 69 74 50 61 67 65 28 70 2c 20  erseInitPage(p, 
d490: 70 49 74 65 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  pIter);.  }.}../
d4a0: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65  *.** Return true
d4b0: 20 69 66 20 74 68 65 20 69 74 65 72 61 74 6f 72   if the iterator
d4c0: 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73   passed as the s
d4d0: 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 63  econd argument c
d4e0: 75 72 72 65 6e 74 6c 79 0a 2a 2a 20 70 6f 69 6e  urrently.** poin
d4f0: 74 73 20 74 6f 20 61 20 64 65 6c 65 74 65 20 6d  ts to a delete m
d500: 61 72 6b 65 72 2e 20 41 20 64 65 6c 65 74 65 20  arker. A delete 
d510: 6d 61 72 6b 65 72 20 69 73 20 61 6e 20 65 6e 74  marker is an ent
d520: 72 79 20 77 69 74 68 20 61 20 30 20 62 79 74 65  ry with a 0 byte
d530: 0a 2a 2a 20 70 6f 73 69 74 69 6f 6e 2d 6c 69 73  .** position-lis
d540: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  t..*/.static int
d550: 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 49 73   fts5MultiIterIs
d560: 45 6d 70 74 79 28 46 74 73 35 49 6e 64 65 78 20  Empty(Fts5Index 
d570: 2a 70 2c 20 46 74 73 35 49 6e 64 65 78 49 74 65  *p, Fts5IndexIte
d580: 72 20 2a 70 49 74 65 72 29 7b 0a 20 20 46 74 73  r *pIter){.  Fts
d590: 35 53 65 67 49 74 65 72 20 2a 70 53 65 67 20 3d  5SegIter *pSeg =
d5a0: 20 26 70 49 74 65 72 2d 3e 61 53 65 67 5b 70 49   &pIter->aSeg[pI
d5b0: 74 65 72 2d 3e 61 46 69 72 73 74 5b 31 5d 2e 69  ter->aFirst[1].i
d5c0: 46 69 72 73 74 5d 3b 0a 20 20 72 65 74 75 72 6e  First];.  return
d5d0: 20 28 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f   (p->rc==SQLITE_
d5e0: 4f 4b 20 26 26 20 70 53 65 67 2d 3e 70 4c 65 61  OK && pSeg->pLea
d5f0: 66 20 26 26 20 70 53 65 67 2d 3e 6e 50 6f 73 3d  f && pSeg->nPos=
d600: 3d 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64  =0);.}../*.** Ad
d610: 76 61 6e 63 65 20 69 74 65 72 61 74 6f 72 20 70  vance iterator p
d620: 49 74 65 72 20 74 6f 20 74 68 65 20 6e 65 78 74  Iter to the next
d630: 20 65 6e 74 72 79 2e 20 0a 2a 2a 0a 2a 2a 20 49   entry. .**.** I
d640: 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
d650: 73 2c 20 46 74 73 35 49 6e 64 65 78 2e 72 63 20  s, Fts5Index.rc 
d660: 69 73 20 73 65 74 20 74 6f 20 61 6e 20 61 70 70  is set to an app
d670: 72 6f 70 72 69 61 74 65 20 65 72 72 6f 72 20 63  ropriate error c
d680: 6f 64 65 2e 20 49 74 20 0a 2a 2a 20 69 73 20 6e  ode. It .** is n
d690: 6f 74 20 63 6f 6e 73 69 64 65 72 65 64 20 61 6e  ot considered an
d6a0: 20 65 72 72 6f 72 20 69 66 20 74 68 65 20 69 74   error if the it
d6b0: 65 72 61 74 6f 72 20 72 65 61 63 68 65 73 20 45  erator reaches E
d6c0: 4f 46 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20  OF. If an error 
d6d0: 68 61 73 20 0a 2a 2a 20 61 6c 72 65 61 64 79 20  has .** already 
d6e0: 6f 63 63 75 72 72 65 64 20 77 68 65 6e 20 74 68  occurred when th
d6f0: 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
d700: 61 6c 6c 65 64 2c 20 69 74 20 69 73 20 61 20 6e  alled, it is a n
d710: 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  o-op..*/.static 
d720: 76 6f 69 64 20 66 74 73 35 53 65 67 49 74 65 72  void fts5SegIter
d730: 4e 65 78 74 28 0a 20 20 46 74 73 35 49 6e 64 65  Next(.  Fts5Inde
d740: 78 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  x *p,           
d750: 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53 35 20          /* FTS5 
d760: 62 61 63 6b 65 6e 64 20 6f 62 6a 65 63 74 20 2a  backend object *
d770: 2f 0a 20 20 46 74 73 35 53 65 67 49 74 65 72 20  /.  Fts5SegIter 
d780: 2a 70 49 74 65 72 2c 20 20 20 20 20 20 20 20 20  *pIter,         
d790: 20 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20      /* Iterator 
d7a0: 74 6f 20 61 64 76 61 6e 63 65 20 2a 2f 0a 20 20  to advance */.  
d7b0: 69 6e 74 20 2a 70 62 4e 65 77 54 65 72 6d 20 20  int *pbNewTerm  
d7c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d7d0: 2f 2a 20 4f 55 54 3a 20 53 65 74 20 66 6f 72 20  /* OUT: Set for 
d7e0: 6e 65 77 20 74 65 72 6d 20 2a 2f 0a 29 7b 0a 20  new term */.){. 
d7f0: 20 61 73 73 65 72 74 28 20 70 62 4e 65 77 54 65   assert( pbNewTe
d800: 72 6d 3d 3d 30 20 7c 7c 20 2a 70 62 4e 65 77 54  rm==0 || *pbNewT
d810: 65 72 6d 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20  erm==0 );.  if( 
d820: 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
d830: 20 29 7b 0a 20 20 20 20 69 66 28 20 70 49 74 65   ){.    if( pIte
d840: 72 2d 3e 66 6c 61 67 73 20 26 20 46 54 53 35 5f  r->flags & FTS5_
d850: 53 45 47 49 54 45 52 5f 52 45 56 45 52 53 45 20  SEGITER_REVERSE 
d860: 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
d870: 20 70 49 74 65 72 2d 3e 70 4e 65 78 74 4c 65 61   pIter->pNextLea
d880: 66 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66  f==0 );.      if
d890: 28 20 70 49 74 65 72 2d 3e 69 52 6f 77 69 64 4f  ( pIter->iRowidO
d8a0: 66 66 73 65 74 3e 30 20 29 7b 0a 20 20 20 20 20  ffset>0 ){.     
d8b0: 20 20 20 75 38 20 2a 61 20 3d 20 70 49 74 65 72     u8 *a = pIter
d8c0: 2d 3e 70 4c 65 61 66 2d 3e 70 3b 0a 20 20 20 20  ->pLeaf->p;.    
d8d0: 20 20 20 20 69 6e 74 20 69 4f 66 66 3b 0a 20 20      int iOff;.  
d8e0: 20 20 20 20 20 20 69 6e 74 20 6e 50 6f 73 3b 0a        int nPos;.
d8f0: 20 20 20 20 20 20 20 20 69 6e 74 20 62 44 75 6d          int bDum
d900: 6d 79 3b 0a 20 20 20 20 20 20 20 20 69 36 34 20  my;.        i64 
d910: 69 44 65 6c 74 61 3b 0a 0a 20 20 20 20 20 20 20  iDelta;..       
d920: 20 70 49 74 65 72 2d 3e 69 52 6f 77 69 64 4f 66   pIter->iRowidOf
d930: 66 73 65 74 2d 2d 3b 0a 20 20 20 20 20 20 20 20  fset--;.        
d940: 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73  pIter->iLeafOffs
d950: 65 74 20 3d 20 69 4f 66 66 20 3d 20 70 49 74 65  et = iOff = pIte
d960: 72 2d 3e 61 52 6f 77 69 64 4f 66 66 73 65 74 5b  r->aRowidOffset[
d970: 70 49 74 65 72 2d 3e 69 52 6f 77 69 64 4f 66 66  pIter->iRowidOff
d980: 73 65 74 5d 3b 0a 20 20 20 20 20 20 20 20 69 4f  set];.        iO
d990: 66 66 20 2b 3d 20 66 74 73 35 47 65 74 50 6f 73  ff += fts5GetPos
d9a0: 6c 69 73 74 53 69 7a 65 28 26 61 5b 69 4f 66 66  listSize(&a[iOff
d9b0: 5d 2c 20 26 6e 50 6f 73 2c 20 26 62 44 75 6d 6d  ], &nPos, &bDumm
d9c0: 79 29 3b 0a 20 20 20 20 20 20 20 20 69 4f 66 66  y);.        iOff
d9d0: 20 2b 3d 20 6e 50 6f 73 3b 0a 20 20 20 20 20 20   += nPos;.      
d9e0: 20 20 66 74 73 35 47 65 74 56 61 72 69 6e 74 28    fts5GetVarint(
d9f0: 26 61 5b 69 4f 66 66 5d 2c 20 28 75 36 34 2a 29  &a[iOff], (u64*)
da00: 26 69 44 65 6c 74 61 29 3b 0a 20 20 20 20 20 20  &iDelta);.      
da10: 20 20 70 49 74 65 72 2d 3e 69 52 6f 77 69 64 20    pIter->iRowid 
da20: 2d 3d 20 69 44 65 6c 74 61 3b 0a 20 20 20 20 20  -= iDelta;.     
da30: 20 20 20 66 74 73 35 53 65 67 49 74 65 72 4c 6f     fts5SegIterLo
da40: 61 64 4e 50 6f 73 28 70 2c 20 70 49 74 65 72 29  adNPos(p, pIter)
da50: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
da60: 20 20 20 20 20 20 20 66 74 73 35 53 65 67 49 74         fts5SegIt
da70: 65 72 52 65 76 65 72 73 65 4e 65 77 50 61 67 65  erReverseNewPage
da80: 28 70 2c 20 70 49 74 65 72 29 3b 0a 20 20 20 20  (p, pIter);.    
da90: 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20    }.    }else{. 
daa0: 20 20 20 20 20 46 74 73 35 44 61 74 61 20 2a 70       Fts5Data *p
dab0: 4c 65 61 66 20 3d 20 70 49 74 65 72 2d 3e 70 4c  Leaf = pIter->pL
dac0: 65 61 66 3b 0a 20 20 20 20 20 20 69 6e 74 20 69  eaf;.      int i
dad0: 4f 66 66 3b 0a 20 20 20 20 20 20 69 6e 74 20 62  Off;.      int b
dae0: 4e 65 77 54 65 72 6d 20 3d 20 30 3b 0a 20 20 20  NewTerm = 0;.   
daf0: 20 20 20 69 6e 74 20 6e 4b 65 65 70 20 3d 20 30     int nKeep = 0
db00: 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 53 65 61 72  ;..      /* Sear
db10: 63 68 20 66 6f 72 20 74 68 65 20 65 6e 64 20 6f  ch for the end o
db20: 66 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 20 6c  f the position l
db30: 69 73 74 20 77 69 74 68 69 6e 20 74 68 65 20 63  ist within the c
db40: 75 72 72 65 6e 74 20 70 61 67 65 2e 20 2a 2f 0a  urrent page. */.
db50: 20 20 20 20 20 20 75 38 20 2a 61 20 3d 20 70 4c        u8 *a = pL
db60: 65 61 66 2d 3e 70 3b 0a 20 20 20 20 20 20 69 6e  eaf->p;.      in
db70: 74 20 6e 20 3d 20 70 4c 65 61 66 2d 3e 73 7a 4c  t n = pLeaf->szL
db80: 65 61 66 3b 0a 0a 20 20 20 20 20 20 41 53 53 45  eaf;..      ASSE
db90: 52 54 5f 53 5a 4c 45 41 46 5f 4f 4b 28 70 4c 65  RT_SZLEAF_OK(pLe
dba0: 61 66 29 3b 0a 20 20 20 20 20 20 69 4f 66 66 20  af);.      iOff 
dbb0: 3d 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66  = pIter->iLeafOf
dbc0: 66 73 65 74 20 2b 20 70 49 74 65 72 2d 3e 6e 50  fset + pIter->nP
dbd0: 6f 73 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 69  os;..      if( i
dbe0: 4f 66 66 3c 6e 20 29 7b 0a 20 20 20 20 20 20 20  Off<n ){.       
dbf0: 20 2f 2a 20 54 68 65 20 6e 65 78 74 20 65 6e 74   /* The next ent
dc00: 72 79 20 69 73 20 6f 6e 20 74 68 65 20 63 75 72  ry is on the cur
dc10: 72 65 6e 74 20 70 61 67 65 2e 20 2a 2f 0a 20 20  rent page. */.  
dc20: 20 20 20 20 20 20 61 73 73 65 72 74 5f 6e 63 28        assert_nc(
dc30: 20 69 4f 66 66 3c 3d 70 49 74 65 72 2d 3e 69 45   iOff<=pIter->iE
dc40: 6e 64 6f 66 44 6f 63 6c 69 73 74 20 29 3b 0a 20  ndofDoclist );. 
dc50: 20 20 20 20 20 20 20 69 66 28 20 69 4f 66 66 3e         if( iOff>
dc60: 3d 70 49 74 65 72 2d 3e 69 45 6e 64 6f 66 44 6f  =pIter->iEndofDo
dc70: 63 6c 69 73 74 20 29 7b 0a 20 20 20 20 20 20 20  clist ){.       
dc80: 20 20 20 62 4e 65 77 54 65 72 6d 20 3d 20 31 3b     bNewTerm = 1;
dc90: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69  .          if( i
dca0: 4f 66 66 21 3d 66 74 73 35 4c 65 61 66 46 69 72  Off!=fts5LeafFir
dcb0: 73 74 54 65 72 6d 4f 66 66 28 70 4c 65 61 66 29  stTermOff(pLeaf)
dcc0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
dcd0: 69 4f 66 66 20 2b 3d 20 66 74 73 35 47 65 74 56  iOff += fts5GetV
dce0: 61 72 69 6e 74 33 32 28 26 61 5b 69 4f 66 66 5d  arint32(&a[iOff]
dcf0: 2c 20 6e 4b 65 65 70 29 3b 0a 20 20 20 20 20 20  , nKeep);.      
dd00: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65      }.        }e
dd10: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 75  lse{.          u
dd20: 36 34 20 69 44 65 6c 74 61 3b 0a 20 20 20 20 20  64 iDelta;.     
dd30: 20 20 20 20 20 69 4f 66 66 20 2b 3d 20 73 71 6c       iOff += sql
dd40: 69 74 65 33 46 74 73 35 47 65 74 56 61 72 69 6e  ite3Fts5GetVarin
dd50: 74 28 26 61 5b 69 4f 66 66 5d 2c 20 26 69 44 65  t(&a[iOff], &iDe
dd60: 6c 74 61 29 3b 0a 20 20 20 20 20 20 20 20 20 20  lta);.          
dd70: 70 49 74 65 72 2d 3e 69 52 6f 77 69 64 20 2b 3d  pIter->iRowid +=
dd80: 20 69 44 65 6c 74 61 3b 0a 20 20 20 20 20 20 20   iDelta;.       
dd90: 20 20 20 61 73 73 65 72 74 5f 6e 63 28 20 69 44     assert_nc( iD
dda0: 65 6c 74 61 3e 30 20 29 3b 0a 20 20 20 20 20 20  elta>0 );.      
ddb0: 20 20 7d 0a 20 20 20 20 20 20 20 20 70 49 74 65    }.        pIte
ddc0: 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 20 3d  r->iLeafOffset =
ddd0: 20 69 4f 66 66 3b 0a 0a 20 20 20 20 20 20 7d 65   iOff;..      }e
dde0: 6c 73 65 20 69 66 28 20 70 49 74 65 72 2d 3e 70  lse if( pIter->p
ddf0: 53 65 67 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Seg==0 ){.      
de00: 20 20 63 6f 6e 73 74 20 75 38 20 2a 70 4c 69 73    const u8 *pLis
de10: 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 63  t = 0;.        c
de20: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 65 72 6d  onst char *zTerm
de30: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 69 6e   = 0;.        in
de40: 74 20 6e 4c 69 73 74 20 3d 20 30 3b 0a 20 20 20  t nList = 0;.   
de50: 20 20 20 20 20 61 73 73 65 72 74 28 20 28 70 49       assert( (pI
de60: 74 65 72 2d 3e 66 6c 61 67 73 20 26 20 46 54 53  ter->flags & FTS
de70: 35 5f 53 45 47 49 54 45 52 5f 4f 4e 45 54 45 52  5_SEGITER_ONETER
de80: 4d 29 20 7c 7c 20 70 62 4e 65 77 54 65 72 6d 20  M) || pbNewTerm 
de90: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 30  );.        if( 0
dea0: 3d 3d 28 70 49 74 65 72 2d 3e 66 6c 61 67 73 20  ==(pIter->flags 
deb0: 26 20 46 54 53 35 5f 53 45 47 49 54 45 52 5f 4f  & FTS5_SEGITER_O
dec0: 4e 45 54 45 52 4d 29 20 29 7b 0a 20 20 20 20 20  NETERM) ){.     
ded0: 20 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35       sqlite3Fts5
dee0: 48 61 73 68 53 63 61 6e 4e 65 78 74 28 70 2d 3e  HashScanNext(p->
def0: 70 48 61 73 68 29 3b 0a 20 20 20 20 20 20 20 20  pHash);.        
df00: 20 20 73 71 6c 69 74 65 33 46 74 73 35 48 61 73    sqlite3Fts5Has
df10: 68 53 63 61 6e 45 6e 74 72 79 28 70 2d 3e 70 48  hScanEntry(p->pH
df20: 61 73 68 2c 20 26 7a 54 65 72 6d 2c 20 26 70 4c  ash, &zTerm, &pL
df30: 69 73 74 2c 20 26 6e 4c 69 73 74 29 3b 0a 20 20  ist, &nList);.  
df40: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
df50: 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a  if( pList==0 ){.
df60: 20 20 20 20 20 20 20 20 20 20 66 74 73 35 44 61            fts5Da
df70: 74 61 52 65 6c 65 61 73 65 28 70 49 74 65 72 2d  taRelease(pIter-
df80: 3e 70 4c 65 61 66 29 3b 0a 20 20 20 20 20 20 20  >pLeaf);.       
df90: 20 20 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 20     pIter->pLeaf 
dfa0: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  = 0;.        }el
dfb0: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 70 49  se{.          pI
dfc0: 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 70 20 3d 20  ter->pLeaf->p = 
dfd0: 28 75 38 2a 29 70 4c 69 73 74 3b 0a 20 20 20 20  (u8*)pList;.    
dfe0: 20 20 20 20 20 20 70 49 74 65 72 2d 3e 70 4c 65        pIter->pLe
dff0: 61 66 2d 3e 6e 6e 20 3d 20 6e 4c 69 73 74 3b 0a  af->nn = nList;.
e000: 20 20 20 20 20 20 20 20 20 20 70 49 74 65 72 2d            pIter-
e010: 3e 70 4c 65 61 66 2d 3e 73 7a 4c 65 61 66 20 3d  >pLeaf->szLeaf =
e020: 20 6e 4c 69 73 74 3b 0a 20 20 20 20 20 20 20 20   nList;.        
e030: 20 20 70 49 74 65 72 2d 3e 69 45 6e 64 6f 66 44    pIter->iEndofD
e040: 6f 63 6c 69 73 74 20 3d 20 6e 4c 69 73 74 2b 31  oclist = nList+1
e050: 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
e060: 74 65 33 46 74 73 35 42 75 66 66 65 72 53 65 74  te3Fts5BufferSet
e070: 28 26 70 2d 3e 72 63 2c 20 26 70 49 74 65 72 2d  (&p->rc, &pIter-
e080: 3e 74 65 72 6d 2c 20 28 69 6e 74 29 73 74 72 6c  >term, (int)strl
e090: 65 6e 28 7a 54 65 72 6d 29 2c 0a 20 20 20 20 20  en(zTerm),.     
e0a0: 20 20 20 20 20 20 20 20 20 28 75 38 2a 29 7a 54           (u8*)zT
e0b0: 65 72 6d 29 3b 0a 20 20 20 20 20 20 20 20 20 20  erm);.          
e0c0: 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73  pIter->iLeafOffs
e0d0: 65 74 20 3d 20 66 74 73 35 47 65 74 56 61 72 69  et = fts5GetVari
e0e0: 6e 74 28 70 4c 69 73 74 2c 20 28 75 36 34 2a 29  nt(pList, (u64*)
e0f0: 26 70 49 74 65 72 2d 3e 69 52 6f 77 69 64 29 3b  &pIter->iRowid);
e100: 0a 20 20 20 20 20 20 20 20 20 20 2a 70 62 4e 65  .          *pbNe
e110: 77 54 65 72 6d 20 3d 20 31 3b 0a 20 20 20 20 20  wTerm = 1;.     
e120: 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65     }.      }else
e130: 7b 0a 20 20 20 20 20 20 20 20 69 4f 66 66 20 3d  {.        iOff =
e140: 20 30 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 4e   0;.        /* N
e150: 65 78 74 20 65 6e 74 72 79 20 69 73 20 6e 6f 74  ext entry is not
e160: 20 6f 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20   on the current 
e170: 70 61 67 65 20 2a 2f 0a 20 20 20 20 20 20 20 20  page */.        
e180: 77 68 69 6c 65 28 20 69 4f 66 66 3d 3d 30 20 29  while( iOff==0 )
e190: 7b 0a 20 20 20 20 20 20 20 20 20 20 66 74 73 35  {.          fts5
e1a0: 53 65 67 49 74 65 72 4e 65 78 74 50 61 67 65 28  SegIterNextPage(
e1b0: 70 2c 20 70 49 74 65 72 29 3b 0a 20 20 20 20 20  p, pIter);.     
e1c0: 20 20 20 20 20 70 4c 65 61 66 20 3d 20 70 49 74       pLeaf = pIt
e1d0: 65 72 2d 3e 70 4c 65 61 66 3b 0a 20 20 20 20 20  er->pLeaf;.     
e1e0: 20 20 20 20 20 69 66 28 20 70 4c 65 61 66 3d 3d       if( pLeaf==
e1f0: 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  0 ) break;.     
e200: 20 20 20 20 20 41 53 53 45 52 54 5f 53 5a 4c 45       ASSERT_SZLE
e210: 41 46 5f 4f 4b 28 70 4c 65 61 66 29 3b 0a 20 20  AF_OK(pLeaf);.  
e220: 20 20 20 20 20 20 20 20 69 66 28 20 28 69 4f 66          if( (iOf
e230: 66 20 3d 20 66 74 73 35 4c 65 61 66 46 69 72 73  f = fts5LeafFirs
e240: 74 52 6f 77 69 64 4f 66 66 28 70 4c 65 61 66 29  tRowidOff(pLeaf)
e250: 29 20 26 26 20 69 4f 66 66 3c 70 4c 65 61 66 2d  ) && iOff<pLeaf-
e260: 3e 73 7a 4c 65 61 66 20 29 7b 0a 20 20 20 20 20  >szLeaf ){.     
e270: 20 20 20 20 20 20 20 69 4f 66 66 20 2b 3d 20 73         iOff += s
e280: 71 6c 69 74 65 33 46 74 73 35 47 65 74 56 61 72  qlite3Fts5GetVar
e290: 69 6e 74 28 26 70 4c 65 61 66 2d 3e 70 5b 69 4f  int(&pLeaf->p[iO
e2a0: 66 66 5d 2c 20 28 75 36 34 2a 29 26 70 49 74 65  ff], (u64*)&pIte
e2b0: 72 2d 3e 69 52 6f 77 69 64 29 3b 0a 20 20 20 20  r->iRowid);.    
e2c0: 20 20 20 20 20 20 20 20 70 49 74 65 72 2d 3e 69          pIter->i
e2d0: 4c 65 61 66 4f 66 66 73 65 74 20 3d 20 69 4f 66  LeafOffset = iOf
e2e0: 66 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 20 20  f;..            
e2f0: 69 66 28 20 70 4c 65 61 66 2d 3e 6e 6e 3e 70 4c  if( pLeaf->nn>pL
e300: 65 61 66 2d 3e 73 7a 4c 65 61 66 20 29 7b 0a 20  eaf->szLeaf ){. 
e310: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 49 74               pIt
e320: 65 72 2d 3e 69 50 67 69 64 78 4f 66 66 20 3d 20  er->iPgidxOff = 
e330: 70 4c 65 61 66 2d 3e 73 7a 4c 65 61 66 20 2b 20  pLeaf->szLeaf + 
e340: 66 74 73 35 47 65 74 56 61 72 69 6e 74 33 32 28  fts5GetVarint32(
e350: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
e360: 20 20 20 26 70 4c 65 61 66 2d 3e 70 5b 70 4c 65     &pLeaf->p[pLe
e370: 61 66 2d 3e 73 7a 4c 65 61 66 5d 2c 20 70 49 74  af->szLeaf], pIt
e380: 65 72 2d 3e 69 45 6e 64 6f 66 44 6f 63 6c 69 73  er->iEndofDoclis
e390: 74 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t.              
e3a0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  );.            }
e3b0: 0a 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ..          }.  
e3c0: 20 20 20 20 20 20 20 20 65 6c 73 65 20 69 66 28          else if(
e3d0: 20 70 4c 65 61 66 2d 3e 6e 6e 3e 70 4c 65 61 66   pLeaf->nn>pLeaf
e3e0: 2d 3e 73 7a 4c 65 61 66 20 29 7b 0a 20 20 20 20  ->szLeaf ){.    
e3f0: 20 20 20 20 20 20 20 20 70 49 74 65 72 2d 3e 69          pIter->i
e400: 50 67 69 64 78 4f 66 66 20 3d 20 70 4c 65 61 66  PgidxOff = pLeaf
e410: 2d 3e 73 7a 4c 65 61 66 20 2b 20 66 74 73 35 47  ->szLeaf + fts5G
e420: 65 74 56 61 72 69 6e 74 33 32 28 0a 20 20 20 20  etVarint32(.    
e430: 20 20 20 20 20 20 20 20 20 20 20 20 26 70 4c 65              &pLe
e440: 61 66 2d 3e 70 5b 70 4c 65 61 66 2d 3e 73 7a 4c  af->p[pLeaf->szL
e450: 65 61 66 5d 2c 20 69 4f 66 66 0a 20 20 20 20 20  eaf], iOff.     
e460: 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20         );.      
e470: 20 20 20 20 20 20 70 49 74 65 72 2d 3e 69 4c 65        pIter->iLe
e480: 61 66 4f 66 66 73 65 74 20 3d 20 69 4f 66 66 3b  afOffset = iOff;
e490: 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 49 74  .            pIt
e4a0: 65 72 2d 3e 69 45 6e 64 6f 66 44 6f 63 6c 69 73  er->iEndofDoclis
e4b0: 74 20 3d 20 69 4f 66 66 3b 0a 20 20 20 20 20 20  t = iOff;.      
e4c0: 20 20 20 20 20 20 62 4e 65 77 54 65 72 6d 20 3d        bNewTerm =
e4d0: 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a   1;.          }.
e4e0: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69 4f            if( iO
e4f0: 66 66 3e 3d 70 4c 65 61 66 2d 3e 73 7a 4c 65 61  ff>=pLeaf->szLea
e500: 66 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  f ){.           
e510: 20 70 2d 3e 72 63 20 3d 20 46 54 53 35 5f 43 4f   p->rc = FTS5_CO
e520: 52 52 55 50 54 3b 0a 20 20 20 20 20 20 20 20 20  RRUPT;.         
e530: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20     return;.     
e540: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
e550: 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
e560: 2f 2a 20 43 68 65 63 6b 20 69 66 20 74 68 65 20  /* Check if the 
e570: 69 74 65 72 61 74 6f 72 20 69 73 20 6e 6f 77 20  iterator is now 
e580: 61 74 20 45 4f 46 2e 20 49 66 20 73 6f 2c 20 72  at EOF. If so, r
e590: 65 74 75 72 6e 20 65 61 72 6c 79 2e 20 2a 2f 0a  eturn early. */.
e5a0: 20 20 20 20 20 20 69 66 28 20 70 49 74 65 72 2d        if( pIter-
e5b0: 3e 70 4c 65 61 66 20 29 7b 0a 20 20 20 20 20 20  >pLeaf ){.      
e5c0: 20 20 69 66 28 20 62 4e 65 77 54 65 72 6d 20 29    if( bNewTerm )
e5d0: 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
e5e0: 70 49 74 65 72 2d 3e 66 6c 61 67 73 20 26 20 46  pIter->flags & F
e5f0: 54 53 35 5f 53 45 47 49 54 45 52 5f 4f 4e 45 54  TS5_SEGITER_ONET
e600: 45 52 4d 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ERM ){.         
e610: 20 20 20 66 74 73 35 44 61 74 61 52 65 6c 65 61     fts5DataRelea
e620: 73 65 28 70 49 74 65 72 2d 3e 70 4c 65 61 66 29  se(pIter->pLeaf)
e630: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 49  ;.            pI
e640: 74 65 72 2d 3e 70 4c 65 61 66 20 3d 20 30 3b 0a  ter->pLeaf = 0;.
e650: 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b            }else{
e660: 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 74 73  .            fts
e670: 35 53 65 67 49 74 65 72 4c 6f 61 64 54 65 72 6d  5SegIterLoadTerm
e680: 28 70 2c 20 70 49 74 65 72 2c 20 6e 4b 65 65 70  (p, pIter, nKeep
e690: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 66  );.            f
e6a0: 74 73 35 53 65 67 49 74 65 72 4c 6f 61 64 4e 50  ts5SegIterLoadNP
e6b0: 6f 73 28 70 2c 20 70 49 74 65 72 29 3b 0a 20 20  os(p, pIter);.  
e6c0: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 62            if( pb
e6d0: 4e 65 77 54 65 72 6d 20 29 20 2a 70 62 4e 65 77  NewTerm ) *pbNew
e6e0: 54 65 72 6d 20 3d 20 31 3b 0a 20 20 20 20 20 20  Term = 1;.      
e6f0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65      }.        }e
e700: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 66  lse{.          f
e710: 74 73 35 53 65 67 49 74 65 72 4c 6f 61 64 4e 50  ts5SegIterLoadNP
e720: 6f 73 28 70 2c 20 70 49 74 65 72 29 3b 0a 20 20  os(p, pIter);.  
e730: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
e740: 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 23 64 65      }.  }.}..#de
e750: 66 69 6e 65 20 53 57 41 50 56 41 4c 28 54 2c 20  fine SWAPVAL(T, 
e760: 61 2c 20 62 29 20 7b 20 54 20 74 6d 70 3b 20 74  a, b) { T tmp; t
e770: 6d 70 3d 61 3b 20 61 3d 62 3b 20 62 3d 74 6d 70  mp=a; a=b; b=tmp
e780: 3b 20 7d 0a 0a 2f 2a 0a 2a 2a 20 49 74 65 72 61  ; }../*.** Itera
e790: 74 6f 72 20 70 49 74 65 72 20 63 75 72 72 65 6e  tor pIter curren
e7a0: 74 6c 79 20 70 6f 69 6e 74 73 20 74 6f 20 74 68  tly points to th
e7b0: 65 20 66 69 72 73 74 20 72 6f 77 69 64 20 69 6e  e first rowid in
e7c0: 20 61 20 64 6f 63 6c 69 73 74 2e 20 54 68 69 73   a doclist. This
e7d0: 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 73 65 74  .** function set
e7e0: 73 20 74 68 65 20 69 74 65 72 61 74 6f 72 20 75  s the iterator u
e7f0: 70 20 73 6f 20 74 68 61 74 20 69 74 65 72 61 74  p so that iterat
e800: 65 73 20 69 6e 20 72 65 76 65 72 73 65 20 6f 72  es in reverse or
e810: 64 65 72 20 74 68 72 6f 75 67 68 0a 2a 2a 20 74  der through.** t
e820: 68 65 20 64 6f 63 6c 69 73 74 2e 0a 2a 2f 0a 73  he doclist..*/.s
e830: 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 53  tatic void fts5S
e840: 65 67 49 74 65 72 52 65 76 65 72 73 65 28 46 74  egIterReverse(Ft
e850: 73 35 49 6e 64 65 78 20 2a 70 2c 20 46 74 73 35  s5Index *p, Fts5
e860: 53 65 67 49 74 65 72 20 2a 70 49 74 65 72 29 7b  SegIter *pIter){
e870: 0a 20 20 46 74 73 35 44 6c 69 64 78 49 74 65 72  .  Fts5DlidxIter
e880: 20 2a 70 44 6c 69 64 78 20 3d 20 70 49 74 65 72   *pDlidx = pIter
e890: 2d 3e 70 44 6c 69 64 78 3b 0a 20 20 46 74 73 35  ->pDlidx;.  Fts5
e8a0: 44 61 74 61 20 2a 70 4c 61 73 74 20 3d 20 30 3b  Data *pLast = 0;
e8b0: 0a 20 20 69 6e 74 20 70 67 6e 6f 4c 61 73 74 20  .  int pgnoLast 
e8c0: 3d 20 30 3b 0a 0a 20 20 69 66 28 20 70 44 6c 69  = 0;..  if( pDli
e8d0: 64 78 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 53  dx ){.    int iS
e8e0: 65 67 69 64 20 3d 20 70 49 74 65 72 2d 3e 70 53  egid = pIter->pS
e8f0: 65 67 2d 3e 69 53 65 67 69 64 3b 0a 20 20 20 20  eg->iSegid;.    
e900: 70 67 6e 6f 4c 61 73 74 20 3d 20 66 74 73 35 44  pgnoLast = fts5D
e910: 6c 69 64 78 49 74 65 72 50 67 6e 6f 28 70 44 6c  lidxIterPgno(pDl
e920: 69 64 78 29 3b 0a 20 20 20 20 70 4c 61 73 74 20  idx);.    pLast 
e930: 3d 20 66 74 73 35 44 61 74 61 52 65 61 64 28 70  = fts5DataRead(p
e940: 2c 20 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f 52  , FTS5_SEGMENT_R
e950: 4f 57 49 44 28 69 53 65 67 69 64 2c 20 70 67 6e  OWID(iSegid, pgn
e960: 6f 4c 61 73 74 29 29 3b 0a 20 20 7d 65 6c 73 65  oLast));.  }else
e970: 7b 0a 20 20 20 20 46 74 73 35 44 61 74 61 20 2a  {.    Fts5Data *
e980: 70 4c 65 61 66 20 3d 20 70 49 74 65 72 2d 3e 70  pLeaf = pIter->p
e990: 4c 65 61 66 3b 20 20 20 20 20 20 20 20 20 2f 2a  Leaf;         /*
e9a0: 20 43 75 72 72 65 6e 74 20 6c 65 61 66 20 64 61   Current leaf da
e9b0: 74 61 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 43 75  ta */..    /* Cu
e9c0: 72 72 65 6e 74 6c 79 2c 20 46 74 73 35 53 65 67  rrently, Fts5Seg
e9d0: 49 74 65 72 2e 69 4c 65 61 66 4f 66 66 73 65 74  Iter.iLeafOffset
e9e0: 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 66   points to the f
e9f0: 69 72 73 74 20 62 79 74 65 20 6f 66 0a 20 20 20  irst byte of.   
ea00: 20 2a 2a 20 70 6f 73 69 74 69 6f 6e 2d 6c 69 73   ** position-lis
ea10: 74 20 63 6f 6e 74 65 6e 74 20 66 6f 72 20 74 68  t content for th
ea20: 65 20 63 75 72 72 65 6e 74 20 72 6f 77 69 64 2e  e current rowid.
ea30: 20 42 61 63 6b 20 69 74 20 75 70 20 73 6f 20 74   Back it up so t
ea40: 68 61 74 20 69 74 0a 20 20 20 20 2a 2a 20 70 6f  hat it.    ** po
ea50: 69 6e 74 73 20 74 6f 20 74 68 65 20 73 74 61 72  ints to the star
ea60: 74 20 6f 66 20 74 68 65 20 70 6f 73 69 74 69 6f  t of the positio
ea70: 6e 2d 6c 69 73 74 20 73 69 7a 65 20 66 69 65 6c  n-list size fiel
ea80: 64 2e 20 2a 2f 0a 20 20 20 20 70 49 74 65 72 2d  d. */.    pIter-
ea90: 3e 69 4c 65 61 66 4f 66 66 73 65 74 20 2d 3d 20  >iLeafOffset -= 
eaa0: 73 71 6c 69 74 65 33 46 74 73 35 47 65 74 56 61  sqlite3Fts5GetVa
eab0: 72 69 6e 74 4c 65 6e 28 70 49 74 65 72 2d 3e 6e  rintLen(pIter->n
eac0: 50 6f 73 2a 32 2b 70 49 74 65 72 2d 3e 62 44 65  Pos*2+pIter->bDe
ead0: 6c 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74  l);..    /* If t
eae0: 68 69 73 20 63 6f 6e 64 69 74 69 6f 6e 20 69 73  his condition is
eaf0: 20 74 72 75 65 20 74 68 65 6e 20 74 68 65 20 6c   true then the l
eb00: 61 72 67 65 73 74 20 72 6f 77 69 64 20 66 6f 72  argest rowid for
eb10: 20 74 68 65 20 63 75 72 72 65 6e 74 0a 20 20 20   the current.   
eb20: 20 2a 2a 20 74 65 72 6d 20 6d 61 79 20 6e 6f 74   ** term may not
eb30: 20 62 65 20 73 74 6f 72 65 64 20 6f 6e 20 74 68   be stored on th
eb40: 65 20 63 75 72 72 65 6e 74 20 70 61 67 65 2e 20  e current page. 
eb50: 53 6f 20 73 65 61 72 63 68 20 66 6f 72 77 61 72  So search forwar
eb60: 64 20 74 6f 0a 20 20 20 20 2a 2a 20 73 65 65 20  d to.    ** see 
eb70: 77 68 65 72 65 20 73 61 69 64 20 72 6f 77 69 64  where said rowid
eb80: 20 72 65 61 6c 6c 79 20 69 73 2e 20 20 2a 2f 0a   really is.  */.
eb90: 20 20 20 20 69 66 28 20 70 49 74 65 72 2d 3e 69      if( pIter->i
eba0: 45 6e 64 6f 66 44 6f 63 6c 69 73 74 3e 3d 70 4c  EndofDoclist>=pL
ebb0: 65 61 66 2d 3e 73 7a 4c 65 61 66 20 29 7b 0a 20  eaf->szLeaf ){. 
ebc0: 20 20 20 20 20 69 6e 74 20 70 67 6e 6f 3b 0a 20       int pgno;. 
ebd0: 20 20 20 20 20 46 74 73 35 53 74 72 75 63 74 75       Fts5Structu
ebe0: 72 65 53 65 67 6d 65 6e 74 20 2a 70 53 65 67 20  reSegment *pSeg 
ebf0: 3d 20 70 49 74 65 72 2d 3e 70 53 65 67 3b 0a 0a  = pIter->pSeg;..
ec00: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6c 61 73        /* The las
ec10: 74 20 72 6f 77 69 64 20 69 6e 20 74 68 65 20 64  t rowid in the d
ec20: 6f 63 6c 69 73 74 20 6d 61 79 20 6e 6f 74 20 62  oclist may not b
ec30: 65 20 6f 6e 20 74 68 65 20 63 75 72 72 65 6e 74  e on the current
ec40: 20 70 61 67 65 2e 20 53 65 61 72 63 68 0a 20 20   page. Search.  
ec50: 20 20 20 20 2a 2a 20 66 6f 72 77 61 72 64 20 74      ** forward t
ec60: 6f 20 66 69 6e 64 20 74 68 65 20 70 61 67 65 20  o find the page 
ec70: 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 6c  containing the l
ec80: 61 73 74 20 72 6f 77 69 64 2e 20 20 2a 2f 0a 20  ast rowid.  */. 
ec90: 20 20 20 20 20 66 6f 72 28 70 67 6e 6f 3d 70 49       for(pgno=pI
eca0: 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 2b 31  ter->iLeafPgno+1
ecb0: 3b 20 21 70 2d 3e 72 63 20 26 26 20 70 67 6e 6f  ; !p->rc && pgno
ecc0: 3c 3d 70 53 65 67 2d 3e 70 67 6e 6f 4c 61 73 74  <=pSeg->pgnoLast
ecd0: 3b 20 70 67 6e 6f 2b 2b 29 7b 0a 20 20 20 20 20  ; pgno++){.     
ece0: 20 20 20 69 36 34 20 69 41 62 73 20 3d 20 46 54     i64 iAbs = FT
ecf0: 53 35 5f 53 45 47 4d 45 4e 54 5f 52 4f 57 49 44  S5_SEGMENT_ROWID
ed00: 28 70 53 65 67 2d 3e 69 53 65 67 69 64 2c 20 70  (pSeg->iSegid, p
ed10: 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 46 74  gno);.        Ft
ed20: 73 35 44 61 74 61 20 2a 70 4e 65 77 20 3d 20 66  s5Data *pNew = f
ed30: 74 73 35 44 61 74 61 52 65 61 64 28 70 2c 20 69  ts5DataRead(p, i
ed40: 41 62 73 29 3b 0a 20 20 20 20 20 20 20 20 69 66  Abs);.        if
ed50: 28 20 70 4e 65 77 20 29 7b 0a 20 20 20 20 20 20  ( pNew ){.      
ed60: 20 20 20 20 69 6e 74 20 69 52 6f 77 69 64 2c 20      int iRowid, 
ed70: 62 54 65 72 6d 6c 65 73 73 3b 0a 20 20 20 20 20  bTermless;.     
ed80: 20 20 20 20 20 69 52 6f 77 69 64 20 3d 20 66 74       iRowid = ft
ed90: 73 35 4c 65 61 66 46 69 72 73 74 52 6f 77 69 64  s5LeafFirstRowid
eda0: 4f 66 66 28 70 4e 65 77 29 3b 0a 20 20 20 20 20  Off(pNew);.     
edb0: 20 20 20 20 20 62 54 65 72 6d 6c 65 73 73 20 3d       bTermless =
edc0: 20 66 74 73 35 4c 65 61 66 49 73 54 65 72 6d 6c   fts5LeafIsTerml
edd0: 65 73 73 28 70 4e 65 77 29 3b 0a 20 20 20 20 20  ess(pNew);.     
ede0: 20 20 20 20 20 69 66 28 20 69 52 6f 77 69 64 20       if( iRowid 
edf0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 53  ){.            S
ee00: 57 41 50 56 41 4c 28 46 74 73 35 44 61 74 61 2a  WAPVAL(Fts5Data*
ee10: 2c 20 70 4e 65 77 2c 20 70 4c 61 73 74 29 3b 0a  , pNew, pLast);.
ee20: 20 20 20 20 20 20 20 20 20 20 20 20 70 67 6e 6f              pgno
ee30: 4c 61 73 74 20 3d 20 70 67 6e 6f 3b 0a 20 20 20  Last = pgno;.   
ee40: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
ee50: 20 20 20 66 74 73 35 44 61 74 61 52 65 6c 65 61     fts5DataRelea
ee60: 73 65 28 70 4e 65 77 29 3b 0a 20 20 20 20 20 20  se(pNew);.      
ee70: 20 20 20 20 69 66 28 20 62 54 65 72 6d 6c 65 73      if( bTermles
ee80: 73 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20  s==0 ) break;.  
ee90: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
eea0: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
eeb0: 49 66 20 70 4c 61 73 74 20 69 73 20 4e 55 4c 4c  If pLast is NULL
eec0: 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74 2c 20   at this point, 
eed0: 74 68 65 6e 20 74 68 65 20 6c 61 73 74 20 72 6f  then the last ro
eee0: 77 69 64 20 66 6f 72 20 74 68 69 73 20 64 6f 63  wid for this doc
eef0: 6c 69 73 74 0a 20 20 2a 2a 20 6c 69 65 73 20 6f  list.  ** lies o
ef00: 6e 20 74 68 65 20 70 61 67 65 20 63 75 72 72 65  n the page curre
ef10: 6e 74 6c 79 20 69 6e 64 69 63 61 74 65 64 20 62  ntly indicated b
ef20: 79 20 74 68 65 20 69 74 65 72 61 74 6f 72 2e 20  y the iterator. 
ef30: 49 6e 20 74 68 69 73 20 63 61 73 65 20 0a 20 20  In this case .  
ef40: 2a 2a 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f  ** pIter->iLeafO
ef50: 66 66 73 65 74 20 69 73 20 61 6c 72 65 61 64 79  ffset is already
ef60: 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f   set to point to
ef70: 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 2d 6c 69   the position-li
ef80: 73 74 20 73 69 7a 65 0a 20 20 2a 2a 20 66 69 65  st size.  ** fie
ef90: 6c 64 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  ld associated wi
efa0: 74 68 20 74 68 65 20 66 69 72 73 74 20 72 65 6c  th the first rel
efb0: 65 76 61 6e 74 20 72 6f 77 69 64 20 6f 6e 20 74  evant rowid on t
efc0: 68 65 20 70 61 67 65 2e 0a 20 20 2a 2a 0a 20 20  he page..  **.  
efd0: 2a 2a 20 4f 72 2c 20 69 66 20 70 4c 61 73 74 20  ** Or, if pLast 
efe0: 69 73 20 6e 6f 6e 2d 4e 55 4c 4c 2c 20 74 68 65  is non-NULL, the
eff0: 6e 20 69 74 20 69 73 20 74 68 65 20 70 61 67 65  n it is the page
f000: 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74   that contains t
f010: 68 65 20 6c 61 73 74 0a 20 20 2a 2a 20 72 6f 77  he last.  ** row
f020: 69 64 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  id. In this case
f030: 20 63 6f 6e 66 69 67 75 72 65 20 74 68 65 20 69   configure the i
f040: 74 65 72 61 74 6f 72 20 73 6f 20 74 68 61 74 20  terator so that 
f050: 69 74 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65  it points to the
f060: 0a 20 20 2a 2a 20 66 69 72 73 74 20 72 6f 77 69  .  ** first rowi
f070: 64 20 6f 6e 20 74 68 69 73 20 70 61 67 65 2e 0a  d on this page..
f080: 20 20 2a 2f 0a 20 20 69 66 28 20 70 4c 61 73 74    */.  if( pLast
f090: 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 4f 66 66   ){.    int iOff
f0a0: 3b 0a 20 20 20 20 66 74 73 35 44 61 74 61 52 65  ;.    fts5DataRe
f0b0: 6c 65 61 73 65 28 70 49 74 65 72 2d 3e 70 4c 65  lease(pIter->pLe
f0c0: 61 66 29 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e  af);.    pIter->
f0d0: 70 4c 65 61 66 20 3d 20 70 4c 61 73 74 3b 0a 20  pLeaf = pLast;. 
f0e0: 20 20 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 50     pIter->iLeafP
f0f0: 67 6e 6f 20 3d 20 70 67 6e 6f 4c 61 73 74 3b 0a  gno = pgnoLast;.
f100: 20 20 20 20 69 4f 66 66 20 3d 20 66 74 73 35 4c      iOff = fts5L
f110: 65 61 66 46 69 72 73 74 52 6f 77 69 64 4f 66 66  eafFirstRowidOff
f120: 28 70 4c 61 73 74 29 3b 0a 20 20 20 20 69 4f 66  (pLast);.    iOf
f130: 66 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69  f += fts5GetVari
f140: 6e 74 28 26 70 4c 61 73 74 2d 3e 70 5b 69 4f 66  nt(&pLast->p[iOf
f150: 66 5d 2c 20 28 75 36 34 2a 29 26 70 49 74 65 72  f], (u64*)&pIter
f160: 2d 3e 69 52 6f 77 69 64 29 3b 0a 20 20 20 20 70  ->iRowid);.    p
f170: 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65  Iter->iLeafOffse
f180: 74 20 3d 20 69 4f 66 66 3b 0a 0a 20 20 20 20 69  t = iOff;..    i
f190: 66 28 20 66 74 73 35 4c 65 61 66 49 73 54 65 72  f( fts5LeafIsTer
f1a0: 6d 6c 65 73 73 28 70 4c 61 73 74 29 20 29 7b 0a  mless(pLast) ){.
f1b0: 20 20 20 20 20 20 70 49 74 65 72 2d 3e 69 45 6e        pIter->iEn
f1c0: 64 6f 66 44 6f 63 6c 69 73 74 20 3d 20 70 4c 61  dofDoclist = pLa
f1d0: 73 74 2d 3e 6e 6e 2b 31 3b 0a 20 20 20 20 7d 65  st->nn+1;.    }e
f1e0: 6c 73 65 7b 0a 20 20 20 20 20 20 70 49 74 65 72  lse{.      pIter
f1f0: 2d 3e 69 45 6e 64 6f 66 44 6f 63 6c 69 73 74 20  ->iEndofDoclist 
f200: 3d 20 66 74 73 35 4c 65 61 66 46 69 72 73 74 54  = fts5LeafFirstT
f210: 65 72 6d 4f 66 66 28 70 4c 61 73 74 29 3b 0a 20  ermOff(pLast);. 
f220: 20 20 20 7d 0a 0a 20 20 7d 0a 0a 20 20 66 74 73     }..  }..  fts
f230: 35 53 65 67 49 74 65 72 52 65 76 65 72 73 65 49  5SegIterReverseI
f240: 6e 69 74 50 61 67 65 28 70 2c 20 70 49 74 65 72  nitPage(p, pIter
f250: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 74 65 72  );.}../*.** Iter
f260: 61 74 6f 72 20 70 49 74 65 72 20 63 75 72 72 65  ator pIter curre
f270: 6e 74 6c 79 20 70 6f 69 6e 74 73 20 74 6f 20 74  ntly points to t
f280: 68 65 20 66 69 72 73 74 20 72 6f 77 69 64 20 6f  he first rowid o
f290: 66 20 61 20 64 6f 63 6c 69 73 74 2e 0a 2a 2a 20  f a doclist..** 
f2a0: 54 68 65 72 65 20 69 73 20 61 20 64 6f 63 6c 69  There is a docli
f2b0: 73 74 2d 69 6e 64 65 78 20 61 73 73 6f 63 69 61  st-index associa
f2c0: 74 65 64 20 77 69 74 68 20 74 68 65 20 66 69 6e  ted with the fin
f2d0: 61 6c 20 74 65 72 6d 20 6f 6e 20 74 68 65 20 63  al term on the c
f2e0: 75 72 72 65 6e 74 20 0a 2a 2a 20 70 61 67 65 2e  urrent .** page.
f2f0: 20 49 66 20 74 68 65 20 63 75 72 72 65 6e 74 20   If the current 
f300: 74 65 72 6d 20 69 73 20 74 68 65 20 6c 61 73 74  term is the last
f310: 20 74 65 72 6d 20 6f 6e 20 74 68 65 20 70 61 67   term on the pag
f320: 65 2c 20 6c 6f 61 64 20 74 68 65 20 0a 2a 2a 20  e, load the .** 
f330: 64 6f 63 6c 69 73 74 2d 69 6e 64 65 78 20 66 72  doclist-index fr
f340: 6f 6d 20 64 69 73 6b 20 61 6e 64 20 69 6e 69 74  om disk and init
f350: 69 61 6c 69 7a 65 20 61 6e 20 69 74 65 72 61 74  ialize an iterat
f360: 6f 72 20 61 74 20 28 70 49 74 65 72 2d 3e 70 44  or at (pIter->pD
f370: 6c 69 64 78 29 2e 0a 2a 2f 0a 73 74 61 74 69 63  lidx)..*/.static
f380: 20 76 6f 69 64 20 66 74 73 35 53 65 67 49 74 65   void fts5SegIte
f390: 72 4c 6f 61 64 44 6c 69 64 78 28 46 74 73 35 49  rLoadDlidx(Fts5I
f3a0: 6e 64 65 78 20 2a 70 2c 20 46 74 73 35 53 65 67  ndex *p, Fts5Seg
f3b0: 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a 20 20  Iter *pIter){.  
f3c0: 69 6e 74 20 69 53 65 67 20 3d 20 70 49 74 65 72  int iSeg = pIter
f3d0: 2d 3e 70 53 65 67 2d 3e 69 53 65 67 69 64 3b 0a  ->pSeg->iSegid;.
f3e0: 20 20 69 6e 74 20 62 52 65 76 20 3d 20 28 70 49    int bRev = (pI
f3f0: 74 65 72 2d 3e 66 6c 61 67 73 20 26 20 46 54 53  ter->flags & FTS
f400: 35 5f 53 45 47 49 54 45 52 5f 52 45 56 45 52 53  5_SEGITER_REVERS
f410: 45 29 3b 0a 20 20 46 74 73 35 44 61 74 61 20 2a  E);.  Fts5Data *
f420: 70 4c 65 61 66 20 3d 20 70 49 74 65 72 2d 3e 70  pLeaf = pIter->p
f430: 4c 65 61 66 3b 20 2f 2a 20 43 75 72 72 65 6e 74  Leaf; /* Current
f440: 20 6c 65 61 66 20 64 61 74 61 20 2a 2f 0a 0a 20   leaf data */.. 
f450: 20 61 73 73 65 72 74 28 20 70 49 74 65 72 2d 3e   assert( pIter->
f460: 66 6c 61 67 73 20 26 20 46 54 53 35 5f 53 45 47  flags & FTS5_SEG
f470: 49 54 45 52 5f 4f 4e 45 54 45 52 4d 20 29 3b 0a  ITER_ONETERM );.
f480: 20 20 61 73 73 65 72 74 28 20 70 49 74 65 72 2d    assert( pIter-
f490: 3e 70 44 6c 69 64 78 3d 3d 30 20 29 3b 0a 0a 20  >pDlidx==0 );.. 
f4a0: 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 74 68 65   /* Check if the
f4b0: 20 63 75 72 72 65 6e 74 20 64 6f 63 6c 69 73 74   current doclist
f4c0: 20 65 6e 64 73 20 6f 6e 20 74 68 69 73 20 70 61   ends on this pa
f4d0: 67 65 2e 20 49 66 20 69 74 20 64 6f 65 73 2c 20  ge. If it does, 
f4e0: 72 65 74 75 72 6e 0a 20 20 2a 2a 20 65 61 72 6c  return.  ** earl
f4f0: 79 20 77 69 74 68 6f 75 74 20 6c 6f 61 64 69 6e  y without loadin
f500: 67 20 74 68 65 20 64 6f 63 6c 69 73 74 2d 69 6e  g the doclist-in
f510: 64 65 78 20 28 61 73 20 69 74 20 62 65 6c 6f 6e  dex (as it belon
f520: 67 73 20 74 6f 20 61 20 64 69 66 66 65 72 65 6e  gs to a differen
f530: 74 0a 20 20 2a 2a 20 74 65 72 6d 2e 20 2a 2f 0a  t.  ** term. */.
f540: 20 20 69 66 28 20 70 49 74 65 72 2d 3e 69 54 65    if( pIter->iTe
f550: 72 6d 4c 65 61 66 50 67 6e 6f 3d 3d 70 49 74 65  rmLeafPgno==pIte
f560: 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 20 0a 20 20  r->iLeafPgno .  
f570: 20 26 26 20 70 49 74 65 72 2d 3e 69 45 6e 64 6f   && pIter->iEndo
f580: 66 44 6f 63 6c 69 73 74 3c 70 4c 65 61 66 2d 3e  fDoclist<pLeaf->
f590: 73 7a 4c 65 61 66 20 0a 20 20 29 7b 0a 20 20 20  szLeaf .  ){.   
f5a0: 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20   return;.  }..  
f5b0: 70 49 74 65 72 2d 3e 70 44 6c 69 64 78 20 3d 20  pIter->pDlidx = 
f5c0: 66 74 73 35 44 6c 69 64 78 49 74 65 72 49 6e 69  fts5DlidxIterIni
f5d0: 74 28 70 2c 20 62 52 65 76 2c 20 69 53 65 67 2c  t(p, bRev, iSeg,
f5e0: 20 70 49 74 65 72 2d 3e 69 54 65 72 6d 4c 65 61   pIter->iTermLea
f5f0: 66 50 67 6e 6f 29 3b 0a 7d 0a 0a 23 64 65 66 69  fPgno);.}..#defi
f600: 6e 65 20 66 74 73 35 49 6e 64 65 78 53 6b 69 70  ne fts5IndexSkip
f610: 56 61 72 69 6e 74 28 61 2c 20 69 4f 66 66 29 20  Varint(a, iOff) 
f620: 7b 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20  {            \. 
f630: 20 69 6e 74 20 69 45 6e 64 20 3d 20 69 4f 66 66   int iEnd = iOff
f640: 2b 39 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  +9;             
f650: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f660: 20 5c 0a 20 20 77 68 69 6c 65 28 20 28 61 5b 69   \.  while( (a[i
f670: 4f 66 66 2b 2b 5d 20 26 20 30 78 38 30 29 20 26  Off++] & 0x80) &
f680: 26 20 69 4f 66 66 3c 69 45 6e 64 20 29 3b 20 20  & iOff<iEnd );  
f690: 20 20 20 20 20 5c 0a 7d 0a 0a 2f 2a 0a 2a 2a 20       \.}../*.** 
f6a0: 54 68 65 20 69 74 65 72 61 74 6f 72 20 6f 62 6a  The iterator obj
f6b0: 65 63 74 20 70 61 73 73 65 64 20 61 73 20 74 68  ect passed as th
f6c0: 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
f6d0: 74 20 63 75 72 72 65 6e 74 6c 79 20 63 6f 6e 74  t currently cont
f6e0: 61 69 6e 73 0a 2a 2a 20 6e 6f 20 76 61 6c 69 64  ains.** no valid
f6f0: 20 76 61 6c 75 65 73 20 65 78 63 65 70 74 20 66   values except f
f700: 6f 72 20 74 68 65 20 46 74 73 35 53 65 67 49 74  or the Fts5SegIt
f710: 65 72 2e 70 4c 65 61 66 20 6d 65 6d 62 65 72 20  er.pLeaf member 
f720: 76 61 72 69 61 62 6c 65 2e 20 54 68 69 73 0a 2a  variable. This.*
f730: 2a 20 66 75 6e 63 74 69 6f 6e 20 73 65 61 72 63  * function searc
f740: 68 65 73 20 74 68 65 20 6c 65 61 66 20 70 61 67  hes the leaf pag
f750: 65 20 66 6f 72 20 61 20 74 65 72 6d 20 6d 61 74  e for a term mat
f760: 63 68 69 6e 67 20 28 70 54 65 72 6d 2f 6e 54 65  ching (pTerm/nTe
f770: 72 6d 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  rm)..**.** If th
f780: 65 20 73 70 65 63 69 66 69 65 64 20 74 65 72 6d  e specified term
f790: 20 69 73 20 66 6f 75 6e 64 20 6f 6e 20 74 68 65   is found on the
f7a0: 20 70 61 67 65 2c 20 74 68 65 6e 20 74 68 65 20   page, then the 
f7b0: 69 74 65 72 61 74 6f 72 20 69 73 20 6c 65 66 74  iterator is left
f7c0: 0a 2a 2a 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20  .** pointing to 
f7d0: 69 74 2e 20 49 66 20 61 72 67 75 6d 65 6e 74 20  it. If argument 
f7e0: 62 47 65 20 69 73 20 7a 65 72 6f 20 61 6e 64 20  bGe is zero and 
f7f0: 74 68 65 20 74 65 72 6d 20 69 73 20 6e 6f 74 20  the term is not 
f800: 66 6f 75 6e 64 2c 0a 2a 2a 20 74 68 65 20 69 74  found,.** the it
f810: 65 72 61 74 6f 72 20 69 73 20 6c 65 66 74 20 70  erator is left p
f820: 6f 69 6e 74 69 6e 67 20 61 74 20 45 4f 46 2e 0a  ointing at EOF..
f830: 2a 2a 0a 2a 2a 20 49 66 20 62 47 65 20 69 73 20  **.** If bGe is 
f840: 6e 6f 6e 2d 7a 65 72 6f 20 61 6e 64 20 74 68 65  non-zero and the
f850: 20 73 70 65 63 69 66 69 65 64 20 74 65 72 6d 20   specified term 
f860: 69 73 20 6e 6f 74 20 66 6f 75 6e 64 2c 20 74 68  is not found, th
f870: 65 6e 20 74 68 65 0a 2a 2a 20 69 74 65 72 61 74  en the.** iterat
f880: 6f 72 20 69 73 20 6c 65 66 74 20 70 6f 69 6e 74  or is left point
f890: 69 6e 67 20 74 6f 20 74 68 65 20 73 6d 61 6c 6c  ing to the small
f8a0: 65 73 74 20 74 65 72 6d 20 69 6e 20 74 68 65 20  est term in the 
f8b0: 73 65 67 6d 65 6e 74 20 74 68 61 74 0a 2a 2a 20  segment that.** 
f8c0: 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74  is larger than t
f8d0: 68 65 20 73 70 65 63 69 66 69 65 64 20 74 65 72  he specified ter
f8e0: 6d 2c 20 65 76 65 6e 20 69 66 20 74 68 69 73 20  m, even if this 
f8f0: 74 65 72 6d 20 69 73 20 6e 6f 74 20 6f 6e 20 74  term is not on t
f900: 68 65 0a 2a 2a 20 63 75 72 72 65 6e 74 20 70 61  he.** current pa
f910: 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ge..*/.static vo
f920: 69 64 20 66 74 73 35 4c 65 61 66 53 65 65 6b 28  id fts5LeafSeek(
f930: 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c  .  Fts5Index *p,
f940: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f950: 20 20 20 2f 2a 20 4c 65 61 76 65 20 61 6e 79 20     /* Leave any 
f960: 65 72 72 6f 72 20 63 6f 64 65 20 68 65 72 65 20  error code here 
f970: 2a 2f 0a 20 20 69 6e 74 20 62 47 65 2c 20 20 20  */.  int bGe,   
f980: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f990: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72       /* True for
f9a0: 20 61 20 3e 3d 20 73 65 61 72 63 68 20 2a 2f 0a   a >= search */.
f9b0: 20 20 46 74 73 35 53 65 67 49 74 65 72 20 2a 70    Fts5SegIter *p
f9c0: 49 74 65 72 2c 20 20 20 20 20 20 20 20 20 20 20  Iter,           
f9d0: 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 74 6f    /* Iterator to
f9e0: 20 73 65 65 6b 20 2a 2f 0a 20 20 63 6f 6e 73 74   seek */.  const
f9f0: 20 75 38 20 2a 70 54 65 72 6d 2c 20 69 6e 74 20   u8 *pTerm, int 
fa00: 6e 54 65 72 6d 20 20 20 20 20 20 2f 2a 20 54 65  nTerm      /* Te
fa10: 72 6d 20 74 6f 20 73 65 61 72 63 68 20 66 6f 72  rm to search for
fa20: 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 4f 66   */.){.  int iOf
fa30: 66 3b 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 61  f;.  const u8 *a
fa40: 20 3d 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d   = pIter->pLeaf-
fa50: 3e 70 3b 0a 20 20 69 6e 74 20 73 7a 4c 65 61 66  >p;.  int szLeaf
fa60: 20 3d 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d   = pIter->pLeaf-
fa70: 3e 73 7a 4c 65 61 66 3b 0a 20 20 69 6e 74 20 6e  >szLeaf;.  int n
fa80: 20 3d 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d   = pIter->pLeaf-
fa90: 3e 6e 6e 3b 0a 0a 20 20 69 6e 74 20 6e 4d 61 74  >nn;..  int nMat
faa0: 63 68 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 4b  ch = 0;.  int nK
fab0: 65 65 70 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e  eep = 0;.  int n
fac0: 4e 65 77 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69  New = 0;.  int i
fad0: 54 65 72 6d 4f 66 66 3b 0a 20 20 69 6e 74 20 69  TermOff;.  int i
fae0: 50 67 69 64 78 3b 20 20 20 20 20 20 20 20 20 20  Pgidx;          
faf0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75             /* Cu
fb00: 72 72 65 6e 74 20 6f 66 66 73 65 74 20 69 6e 20  rrent offset in 
fb10: 70 67 69 64 78 20 2a 2f 0a 20 20 69 6e 74 20 62  pgidx */.  int b
fb20: 45 6e 64 4f 66 50 61 67 65 20 3d 20 30 3b 0a 0a  EndOfPage = 0;..
fb30: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72 63 3d    assert( p->rc=
fb40: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 0a 20  =SQLITE_OK );.. 
fb50: 20 69 50 67 69 64 78 20 3d 20 73 7a 4c 65 61 66   iPgidx = szLeaf
fb60: 3b 0a 20 20 69 50 67 69 64 78 20 2b 3d 20 66 74  ;.  iPgidx += ft
fb70: 73 35 47 65 74 56 61 72 69 6e 74 33 32 28 26 61  s5GetVarint32(&a
fb80: 5b 69 50 67 69 64 78 5d 2c 20 69 54 65 72 6d 4f  [iPgidx], iTermO
fb90: 66 66 29 3b 0a 20 20 69 4f 66 66 20 3d 20 69 54  ff);.  iOff = iT
fba0: 65 72 6d 4f 66 66 3b 0a 0a 20 20 77 68 69 6c 65  ermOff;..  while
fbb0: 28 20 31 20 29 7b 0a 0a 20 20 20 20 2f 2a 20 46  ( 1 ){..    /* F
fbc0: 69 67 75 72 65 20 6f 75 74 20 68 6f 77 20 6d 61  igure out how ma
fbd0: 6e 79 20 6e 65 77 20 62 79 74 65 73 20 61 72 65  ny new bytes are
fbe0: 20 69 6e 20 74 68 69 73 20 74 65 72 6d 20 2a 2f   in this term */
fbf0: 0a 20 20 20 20 66 74 73 35 46 61 73 74 47 65 74  .    fts5FastGet
fc00: 56 61 72 69 6e 74 33 32 28 61 2c 20 69 4f 66 66  Varint32(a, iOff
fc10: 2c 20 6e 4e 65 77 29 3b 0a 20 20 20 20 69 66 28  , nNew);.    if(
fc20: 20 6e 4b 65 65 70 3c 6e 4d 61 74 63 68 20 29 7b   nKeep<nMatch ){
fc30: 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 65 61 72  .      goto sear
fc40: 63 68 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d  ch_failed;.    }
fc50: 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e 4b  ..    assert( nK
fc60: 65 65 70 3e 3d 6e 4d 61 74 63 68 20 29 3b 0a 20  eep>=nMatch );. 
fc70: 20 20 20 69 66 28 20 6e 4b 65 65 70 3d 3d 6e 4d     if( nKeep==nM
fc80: 61 74 63 68 20 29 7b 0a 20 20 20 20 20 20 69 6e  atch ){.      in
fc90: 74 20 6e 43 6d 70 3b 0a 20 20 20 20 20 20 69 6e  t nCmp;.      in
fca0: 74 20 69 3b 0a 20 20 20 20 20 20 6e 43 6d 70 20  t i;.      nCmp 
fcb0: 3d 20 4d 49 4e 28 6e 4e 65 77 2c 20 6e 54 65 72  = MIN(nNew, nTer
fcc0: 6d 2d 6e 4d 61 74 63 68 29 3b 0a 20 20 20 20 20  m-nMatch);.     
fcd0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6d 70   for(i=0; i<nCmp
fce0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
fcf0: 69 66 28 20 61 5b 69 4f 66 66 2b 69 5d 21 3d 70  if( a[iOff+i]!=p
fd00: 54 65 72 6d 5b 6e 4d 61 74 63 68 2b 69 5d 20 29  Term[nMatch+i] )
fd10: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
fd20: 20 20 20 20 20 20 6e 4d 61 74 63 68 20 2b 3d 20        nMatch += 
fd30: 69 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 6e 54  i;..      if( nT
fd40: 65 72 6d 3d 3d 6e 4d 61 74 63 68 20 29 7b 0a 20  erm==nMatch ){. 
fd50: 20 20 20 20 20 20 20 69 66 28 20 69 3d 3d 6e 4e         if( i==nN
fd60: 65 77 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ew ){.          
fd70: 67 6f 74 6f 20 73 65 61 72 63 68 5f 73 75 63 63  goto search_succ
fd80: 65 73 73 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  ess;.        }el
fd90: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f  se{.          go
fda0: 74 6f 20 73 65 61 72 63 68 5f 66 61 69 6c 65 64  to search_failed
fdb0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
fdc0: 20 20 7d 65 6c 73 65 20 69 66 28 20 69 3c 6e 4e    }else if( i<nN
fdd0: 65 77 20 26 26 20 61 5b 69 4f 66 66 2b 69 5d 3e  ew && a[iOff+i]>
fde0: 70 54 65 72 6d 5b 6e 4d 61 74 63 68 5d 20 29 7b  pTerm[nMatch] ){
fdf0: 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73 65  .        goto se
fe00: 61 72 63 68 5f 66 61 69 6c 65 64 3b 0a 20 20 20  arch_failed;.   
fe10: 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
fe20: 69 66 28 20 69 50 67 69 64 78 3e 3d 6e 20 29 7b  if( iPgidx>=n ){
fe30: 0a 20 20 20 20 20 20 62 45 6e 64 4f 66 50 61 67  .      bEndOfPag
fe40: 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 62 72 65  e = 1;.      bre
fe50: 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69  ak;.    }..    i
fe60: 50 67 69 64 78 20 2b 3d 20 66 74 73 35 47 65 74  Pgidx += fts5Get
fe70: 56 61 72 69 6e 74 33 32 28 26 61 5b 69 50 67 69  Varint32(&a[iPgi
fe80: 64 78 5d 2c 20 6e 4b 65 65 70 29 3b 0a 20 20 20  dx], nKeep);.   
fe90: 20 69 54 65 72 6d 4f 66 66 20 2b 3d 20 6e 4b 65   iTermOff += nKe
fea0: 65 70 3b 0a 20 20 20 20 69 4f 66 66 20 3d 20 69  ep;.    iOff = i
feb0: 54 65 72 6d 4f 66 66 3b 0a 0a 20 20 20 20 2f 2a  TermOff;..    /*
fec0: 20 52 65 61 64 20 74 68 65 20 6e 4b 65 65 70 20   Read the nKeep 
fed0: 66 69 65 6c 64 20 6f 66 20 74 68 65 20 6e 65 78  field of the nex
fee0: 74 20 74 65 72 6d 2e 20 2a 2f 0a 20 20 20 20 66  t term. */.    f
fef0: 74 73 35 46 61 73 74 47 65 74 56 61 72 69 6e 74  ts5FastGetVarint
ff00: 33 32 28 61 2c 20 69 4f 66 66 2c 20 6e 4b 65 65  32(a, iOff, nKee
ff10: 70 29 3b 0a 20 20 7d 0a 0a 20 73 65 61 72 63 68  p);.  }.. search
ff20: 5f 66 61 69 6c 65 64 3a 0a 20 20 69 66 28 20 62  _failed:.  if( b
ff30: 47 65 3d 3d 30 20 29 7b 0a 20 20 20 20 66 74 73  Ge==0 ){.    fts
ff40: 35 44 61 74 61 52 65 6c 65 61 73 65 28 70 49 74  5DataRelease(pIt
ff50: 65 72 2d 3e 70 4c 65 61 66 29 3b 0a 20 20 20 20  er->pLeaf);.    
ff60: 70 49 74 65 72 2d 3e 70 4c 65 61 66 20 3d 20 30  pIter->pLeaf = 0
ff70: 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  ;.    return;.  
ff80: 7d 65 6c 73 65 20 69 66 28 20 62 45 6e 64 4f 66  }else if( bEndOf
ff90: 50 61 67 65 20 29 7b 0a 20 20 20 20 64 6f 20 7b  Page ){.    do {
ffa0: 0a 20 20 20 20 20 20 66 74 73 35 53 65 67 49 74  .      fts5SegIt
ffb0: 65 72 4e 65 78 74 50 61 67 65 28 70 2c 20 70 49  erNextPage(p, pI
ffc0: 74 65 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ter);.      if( 
ffd0: 70 49 74 65 72 2d 3e 70 4c 65 61 66 3d 3d 30 20  pIter->pLeaf==0 
ffe0: 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20  ) return;.      
fff0: 61 20 3d 20 70 49 74 65 72 2d 3e 70 4c 65 61 66  a = pIter->pLeaf
10000 2d 3e 70 3b 0a 20 20 20 20 20 20 69 66 28 20 66  ->p;.      if( f
10010 74 73 35 4c 65 61 66 49 73 54 65 72 6d 6c 65 73  ts5LeafIsTermles
10020 73 28 70 49 74 65 72 2d 3e 70 4c 65 61 66 29 3d  s(pIter->pLeaf)=
10030 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 66 74  =0 ){.        ft
10040 73 35 47 65 74 56 61 72 69 6e 74 33 32 28 26 70  s5GetVarint32(&p
10050 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 70 5b 70  Iter->pLeaf->p[p
10060 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 73 7a 4c  Iter->pLeaf->szL
10070 65 61 66 5d 2c 20 69 4f 66 66 29 3b 0a 20 20 20  eaf], iOff);.   
10080 20 20 20 20 20 69 66 28 20 69 4f 66 66 3c 34 20       if( iOff<4 
10090 7c 7c 20 69 4f 66 66 3e 3d 70 49 74 65 72 2d 3e  || iOff>=pIter->
100a0 70 4c 65 61 66 2d 3e 73 7a 4c 65 61 66 20 29 7b  pLeaf->szLeaf ){
100b0 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 72 63  .          p->rc
100c0 20 3d 20 46 54 53 35 5f 43 4f 52 52 55 50 54 3b   = FTS5_CORRUPT;
100d0 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
100e0 20 20 20 20 20 20 20 20 20 20 6e 4b 65 65 70 20            nKeep 
100f0 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 69  = 0;.          i
10100 4f 66 66 20 2b 3d 20 66 74 73 35 47 65 74 56 61  Off += fts5GetVa
10110 72 69 6e 74 33 32 28 26 61 5b 69 4f 66 66 5d 2c  rint32(&a[iOff],
10120 20 6e 4e 65 77 29 3b 0a 20 20 20 20 20 20 20 20   nNew);.        
10130 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
10140 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
10150 77 68 69 6c 65 28 20 31 20 29 3b 0a 20 20 7d 0a  while( 1 );.  }.
10160 0a 20 73 65 61 72 63 68 5f 73 75 63 63 65 73 73  . search_success
10170 3a 0a 0a 20 20 70 49 74 65 72 2d 3e 69 4c 65 61  :..  pIter->iLea
10180 66 4f 66 66 73 65 74 20 3d 20 69 4f 66 66 20 2b  fOffset = iOff +
10190 20 6e 4e 65 77 3b 0a 20 20 70 49 74 65 72 2d 3e   nNew;.  pIter->
101a0 69 54 65 72 6d 4c 65 61 66 4f 66 66 73 65 74 20  iTermLeafOffset 
101b0 3d 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66  = pIter->iLeafOf
101c0 66 73 65 74 3b 0a 20 20 70 49 74 65 72 2d 3e 69  fset;.  pIter->i
101d0 54 65 72 6d 4c 65 61 66 50 67 6e 6f 20 3d 20 70  TermLeafPgno = p
101e0 49 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 3b  Iter->iLeafPgno;
101f0 0a 0a 20 20 66 74 73 35 42 75 66 66 65 72 53 65  ..  fts5BufferSe
10200 74 28 26 70 2d 3e 72 63 2c 20 26 70 49 74 65 72  t(&p->rc, &pIter
10210 2d 3e 74 65 72 6d 2c 20 6e 4b 65 65 70 2c 20 70  ->term, nKeep, p
10220 54 65 72 6d 29 3b 0a 20 20 66 74 73 35 42 75 66  Term);.  fts5Buf
10230 66 65 72 41 70 70 65 6e 64 42 6c 6f 62 28 26 70  ferAppendBlob(&p
10240 2d 3e 72 63 2c 20 26 70 49 74 65 72 2d 3e 74 65  ->rc, &pIter->te
10250 72 6d 2c 20 6e 4e 65 77 2c 20 26 61 5b 69 4f 66  rm, nNew, &a[iOf
10260 66 5d 29 3b 0a 0a 20 20 69 66 28 20 69 50 67 69  f]);..  if( iPgi
10270 64 78 3e 3d 6e 20 29 7b 0a 20 20 20 20 70 49 74  dx>=n ){.    pIt
10280 65 72 2d 3e 69 45 6e 64 6f 66 44 6f 63 6c 69 73  er->iEndofDoclis
10290 74 20 3d 20 70 49 74 65 72 2d 3e 70 4c 65 61 66  t = pIter->pLeaf
102a0 2d 3e 6e 6e 2b 31 3b 0a 20 20 7d 65 6c 73 65 7b  ->nn+1;.  }else{
102b0 0a 20 20 20 20 69 6e 74 20 6e 45 78 74 72 61 3b  .    int nExtra;
102c0 0a 20 20 20 20 69 50 67 69 64 78 20 2b 3d 20 66  .    iPgidx += f
102d0 74 73 35 47 65 74 56 61 72 69 6e 74 33 32 28 26  ts5GetVarint32(&
102e0 61 5b 69 50 67 69 64 78 5d 2c 20 6e 45 78 74 72  a[iPgidx], nExtr
102f0 61 29 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 69  a);.    pIter->i
10300 45 6e 64 6f 66 44 6f 63 6c 69 73 74 20 3d 20 69  EndofDoclist = i
10310 54 65 72 6d 4f 66 66 20 2b 20 6e 45 78 74 72 61  TermOff + nExtra
10320 3b 0a 20 20 7d 0a 20 20 70 49 74 65 72 2d 3e 69  ;.  }.  pIter->i
10330 50 67 69 64 78 4f 66 66 20 3d 20 69 50 67 69 64  PgidxOff = iPgid
10340 78 3b 0a 0a 20 20 66 74 73 35 53 65 67 49 74 65  x;..  fts5SegIte
10350 72 4c 6f 61 64 52 6f 77 69 64 28 70 2c 20 70 49  rLoadRowid(p, pI
10360 74 65 72 29 3b 0a 20 20 66 74 73 35 53 65 67 49  ter);.  fts5SegI
10370 74 65 72 4c 6f 61 64 4e 50 6f 73 28 70 2c 20 70  terLoadNPos(p, p
10380 49 74 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Iter);.}../*.** 
10390 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 6f  Initialize the o
103a0 62 6a 65 63 74 20 70 49 74 65 72 20 74 6f 20 70  bject pIter to p
103b0 6f 69 6e 74 20 74 6f 20 74 65 72 6d 20 70 54 65  oint to term pTe
103c0 72 6d 2f 6e 54 65 72 6d 20 77 69 74 68 69 6e 20  rm/nTerm within 
103d0 73 65 67 6d 65 6e 74 0a 2a 2a 20 70 53 65 67 2e  segment.** pSeg.
103e0 20 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20   If there is no 
103f0 73 75 63 68 20 74 65 72 6d 20 69 6e 20 74 68 65  such term in the
10400 20 69 6e 64 65 78 2c 20 74 68 65 20 69 74 65 72   index, the iter
10410 61 74 6f 72 20 69 73 20 73 65 74 20 74 6f 20 45  ator is set to E
10420 4f 46 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  OF..**.** If an 
10430 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 46 74  error occurs, Ft
10440 73 35 49 6e 64 65 78 2e 72 63 20 69 73 20 73 65  s5Index.rc is se
10450 74 20 74 6f 20 61 6e 20 61 70 70 72 6f 70 72 69  t to an appropri
10460 61 74 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 20  ate error code. 
10470 49 66 20 0a 2a 2a 20 61 6e 20 65 72 72 6f 72 20  If .** an error 
10480 68 61 73 20 61 6c 72 65 61 64 79 20 6f 63 63 75  has already occu
10490 72 72 65 64 20 77 68 65 6e 20 74 68 69 73 20 66  rred when this f
104a0 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
104b0 64 2c 20 69 74 20 69 73 20 61 20 6e 6f 2d 6f 70  d, it is a no-op
104c0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
104d0 20 66 74 73 35 53 65 67 49 74 65 72 53 65 65 6b   fts5SegIterSeek
104e0 49 6e 69 74 28 0a 20 20 46 74 73 35 49 6e 64 65  Init(.  Fts5Inde
104f0 78 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  x *p,           
10500 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53 35 20          /* FTS5 
10510 62 61 63 6b 65 6e 64 20 2a 2f 0a 20 20 46 74 73  backend */.  Fts
10520 35 42 75 66 66 65 72 20 2a 70 42 75 66 2c 20 20  5Buffer *pBuf,  
10530 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
10540 42 75 66 66 65 72 20 74 6f 20 75 73 65 20 66 6f  Buffer to use fo
10550 72 20 6c 6f 61 64 69 6e 67 20 70 61 67 65 73 20  r loading pages 
10560 2a 2f 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 70  */.  const u8 *p
10570 54 65 72 6d 2c 20 69 6e 74 20 6e 54 65 72 6d 2c  Term, int nTerm,
10580 20 20 20 20 20 2f 2a 20 54 65 72 6d 20 74 6f 20       /* Term to 
10590 73 65 65 6b 20 74 6f 20 2a 2f 0a 20 20 69 6e 74  seek to */.  int
105a0 20 66 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20   flags,         
105b0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
105c0 4d 61 73 6b 20 6f 66 20 46 54 53 35 49 4e 44 45  Mask of FTS5INDE
105d0 58 5f 58 58 58 20 66 6c 61 67 73 20 2a 2f 0a 20  X_XXX flags */. 
105e0 20 46 74 73 35 53 74 72 75 63 74 75 72 65 53 65   Fts5StructureSe
105f0 67 6d 65 6e 74 20 2a 70 53 65 67 2c 20 20 20 20  gment *pSeg,    
10600 20 2f 2a 20 44 65 73 63 72 69 70 74 69 6f 6e 20   /* Description 
10610 6f 66 20 73 65 67 6d 65 6e 74 20 2a 2f 0a 20 20  of segment */.  
10620 46 74 73 35 53 65 67 49 74 65 72 20 2a 70 49 74  Fts5SegIter *pIt
10630 65 72 20 20 20 20 20 20 20 20 20 20 20 20 20 20  er              
10640 2f 2a 20 4f 62 6a 65 63 74 20 74 6f 20 70 6f 70  /* Object to pop
10650 75 6c 61 74 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e  ulate */.){.  in
10660 74 20 69 50 67 20 3d 20 31 3b 0a 20 20 69 6e 74  t iPg = 1;.  int
10670 20 62 47 65 20 3d 20 28 66 6c 61 67 73 20 26 20   bGe = (flags & 
10680 46 54 53 35 49 4e 44 45 58 5f 51 55 45 52 59 5f  FTS5INDEX_QUERY_
10690 53 43 41 4e 29 3b 0a 20 20 69 6e 74 20 62 44 6c  SCAN);.  int bDl
106a0 69 64 78 20 3d 20 30 3b 20 20 20 20 20 20 20 20  idx = 0;        
106b0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
106c0 20 69 66 20 74 68 65 72 65 20 69 73 20 61 20 64   if there is a d
106d0 6f 63 6c 69 73 74 2d 69 6e 64 65 78 20 2a 2f 0a  oclist-index */.
106e0 0a 20 20 73 74 61 74 69 63 20 69 6e 74 20 6e 43  .  static int nC
106f0 61 6c 6c 20 3d 20 30 3b 0a 20 20 6e 43 61 6c 6c  all = 0;.  nCall
10700 2b 2b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 62  ++;..  assert( b
10710 47 65 3d 3d 30 20 7c 7c 20 28 66 6c 61 67 73 20  Ge==0 || (flags 
10720 26 20 46 54 53 35 49 4e 44 45 58 5f 51 55 45 52  & FTS5INDEX_QUER
10730 59 5f 44 45 53 43 29 3d 3d 30 20 29 3b 0a 20 20  Y_DESC)==0 );.  
10740 61 73 73 65 72 74 28 20 70 54 65 72 6d 20 26 26  assert( pTerm &&
10750 20 6e 54 65 72 6d 20 29 3b 0a 20 20 6d 65 6d 73   nTerm );.  mems
10760 65 74 28 70 49 74 65 72 2c 20 30 2c 20 73 69 7a  et(pIter, 0, siz
10770 65 6f 66 28 2a 70 49 74 65 72 29 29 3b 0a 20 20  eof(*pIter));.  
10780 70 49 74 65 72 2d 3e 70 53 65 67 20 3d 20 70 53  pIter->pSeg = pS
10790 65 67 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 62  eg;..  /* This b
107a0 6c 6f 63 6b 20 73 65 74 73 20 73 74 61 63 6b 20  lock sets stack 
107b0 76 61 72 69 61 62 6c 65 20 69 50 67 20 74 6f 20  variable iPg to 
107c0 74 68 65 20 6c 65 61 66 20 70 61 67 65 20 6e 75  the leaf page nu
107d0 6d 62 65 72 20 74 68 61 74 20 6d 61 79 0a 20 20  mber that may.  
107e0 2a 2a 20 63 6f 6e 74 61 69 6e 20 74 65 72 6d 20  ** contain term 
107f0 28 70 54 65 72 6d 2f 6e 54 65 72 6d 29 2c 20 69  (pTerm/nTerm), i
10800 66 20 69 74 20 69 73 20 70 72 65 73 65 6e 74 20  f it is present 
10810 69 6e 20 74 68 65 20 73 65 67 6d 65 6e 74 2e 20  in the segment. 
10820 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 49 64 78  */.  if( p->pIdx
10830 53 65 6c 65 63 74 3d 3d 30 20 29 7b 0a 20 20 20  Select==0 ){.   
10840 20 46 74 73 35 43 6f 6e 66 69 67 20 2a 70 43 6f   Fts5Config *pCo
10850 6e 66 69 67 20 3d 20 70 2d 3e 70 43 6f 6e 66 69  nfig = p->pConfi
10860 67 3b 0a 20 20 20 20 66 74 73 35 49 6e 64 65 78  g;.    fts5Index
10870 50 72 65 70 61 72 65 53 74 6d 74 28 70 2c 20 26  PrepareStmt(p, &
10880 70 2d 3e 70 49 64 78 53 65 6c 65 63 74 2c 20 73  p->pIdxSelect, s
10890 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 0a  qlite3_mprintf(.
108a0 20 20 20 20 20 20 20 20 20 20 22 53 45 4c 45 43            "SELEC
108b0 54 20 70 67 6e 6f 20 46 52 4f 4d 20 27 25 71 27  T pgno FROM '%q'
108c0 2e 27 25 71 5f 69 64 78 27 20 57 48 45 52 45 20  .'%q_idx' WHERE 
108d0 22 0a 20 20 20 20 20 20 20 20 20 20 22 73 65 67  ".          "seg
108e0 69 64 3d 3f 20 41 4e 44 20 74 65 72 6d 3c 3d 3f  id=? AND term<=?
108f0 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d 20 44   ORDER BY term D
10900 45 53 43 20 4c 49 4d 49 54 20 31 22 2c 0a 20 20  ESC LIMIT 1",.  
10910 20 20 20 20 20 20 20 20 70 43 6f 6e 66 69 67 2d          pConfig-
10920 3e 7a 44 62 2c 20 70 43 6f 6e 66 69 67 2d 3e 7a  >zDb, pConfig->z
10930 4e 61 6d 65 0a 20 20 20 20 29 29 3b 0a 20 20 7d  Name.    ));.  }
10940 0a 20 20 69 66 28 20 70 2d 3e 72 63 20 29 20 72  .  if( p->rc ) r
10950 65 74 75 72 6e 3b 0a 20 20 73 71 6c 69 74 65 33  eturn;.  sqlite3
10960 5f 62 69 6e 64 5f 69 6e 74 28 70 2d 3e 70 49 64  _bind_int(p->pId
10970 78 53 65 6c 65 63 74 2c 20 31 2c 20 70 53 65 67  xSelect, 1, pSeg
10980 2d 3e 69 53 65 67 69 64 29 3b 0a 20 20 73 71 6c  ->iSegid);.  sql
10990 69 74 65 33 5f 62 69 6e 64 5f 62 6c 6f 62 28 70  ite3_bind_blob(p
109a0 2d 3e 70 49 64 78 53 65 6c 65 63 74 2c 20 32 2c  ->pIdxSelect, 2,
109b0 20 70 54 65 72 6d 2c 20 6e 54 65 72 6d 2c 20 53   pTerm, nTerm, S
109c0 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20  QLITE_STATIC);. 
109d0 20 69 66 28 20 53 51 4c 49 54 45 5f 52 4f 57 3d   if( SQLITE_ROW=
109e0 3d 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 2d  =sqlite3_step(p-
109f0 3e 70 49 64 78 53 65 6c 65 63 74 29 20 29 7b 0a  >pIdxSelect) ){.
10a00 20 20 20 20 69 36 34 20 76 61 6c 20 3d 20 73 71      i64 val = sq
10a10 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74  lite3_column_int
10a20 28 70 2d 3e 70 49 64 78 53 65 6c 65 63 74 2c 20  (p->pIdxSelect, 
10a30 30 29 3b 0a 20 20 20 20 69 50 67 20 3d 20 28 69  0);.    iPg = (i
10a40 6e 74 29 28 76 61 6c 3e 3e 31 29 3b 0a 20 20 20  nt)(val>>1);.   
10a50 20 62 44 6c 69 64 78 20 3d 20 28 76 61 6c 20 26   bDlidx = (val &
10a60 20 30 78 30 30 30 31 29 3b 0a 20 20 7d 0a 20 20   0x0001);.  }.  
10a70 70 2d 3e 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  p->rc = sqlite3_
10a80 72 65 73 65 74 28 70 2d 3e 70 49 64 78 53 65 6c  reset(p->pIdxSel
10a90 65 63 74 29 3b 0a 0a 20 20 69 66 28 20 69 50 67  ect);..  if( iPg
10aa0 3c 70 53 65 67 2d 3e 70 67 6e 6f 46 69 72 73 74  <pSeg->pgnoFirst
10ab0 20 29 7b 0a 20 20 20 20 69 50 67 20 3d 20 70 53   ){.    iPg = pS
10ac0 65 67 2d 3e 70 67 6e 6f 46 69 72 73 74 3b 0a 20  eg->pgnoFirst;. 
10ad0 20 20 20 62 44 6c 69 64 78 20 3d 20 30 3b 0a 20     bDlidx = 0;. 
10ae0 20 7d 0a 0a 20 20 70 49 74 65 72 2d 3e 69 4c 65   }..  pIter->iLe
10af0 61 66 50 67 6e 6f 20 3d 20 69 50 67 20 2d 20 31  afPgno = iPg - 1
10b00 3b 0a 20 20 66 74 73 35 53 65 67 49 74 65 72 4e  ;.  fts5SegIterN
10b10 65 78 74 50 61 67 65 28 70 2c 20 70 49 74 65 72  extPage(p, pIter
10b20 29 3b 0a 0a 20 20 69 66 28 20 70 49 74 65 72 2d  );..  if( pIter-
10b30 3e 70 4c 65 61 66 20 29 7b 0a 20 20 20 20 66 74  >pLeaf ){.    ft
10b40 73 35 4c 65 61 66 53 65 65 6b 28 70 2c 20 62 47  s5LeafSeek(p, bG
10b50 65 2c 20 70 49 74 65 72 2c 20 70 54 65 72 6d 2c  e, pIter, pTerm,
10b60 20 6e 54 65 72 6d 29 3b 0a 20 20 7d 0a 0a 20 20   nTerm);.  }..  
10b70 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  if( p->rc==SQLIT
10b80 45 5f 4f 4b 20 26 26 20 62 47 65 3d 3d 30 20 29  E_OK && bGe==0 )
10b90 7b 0a 20 20 20 20 70 49 74 65 72 2d 3e 66 6c 61  {.    pIter->fla
10ba0 67 73 20 7c 3d 20 46 54 53 35 5f 53 45 47 49 54  gs |= FTS5_SEGIT
10bb0 45 52 5f 4f 4e 45 54 45 52 4d 3b 0a 20 20 20 20  ER_ONETERM;.    
10bc0 69 66 28 20 70 49 74 65 72 2d 3e 70 4c 65 61 66  if( pIter->pLeaf
10bd0 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 66 6c   ){.      if( fl
10be0 61 67 73 20 26 20 46 54 53 35 49 4e 44 45 58 5f  ags & FTS5INDEX_
10bf0 51 55 45 52 59 5f 44 45 53 43 20 29 7b 0a 20 20  QUERY_DESC ){.  
10c00 20 20 20 20 20 20 70 49 74 65 72 2d 3e 66 6c 61        pIter->fla
10c10 67 73 20 7c 3d 20 46 54 53 35 5f 53 45 47 49 54  gs |= FTS5_SEGIT
10c20 45 52 5f 52 45 56 45 52 53 45 3b 0a 20 20 20 20  ER_REVERSE;.    
10c30 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 62 44    }.      if( bD
10c40 6c 69 64 78 20 29 7b 0a 20 20 20 20 20 20 20 20  lidx ){.        
10c50 66 74 73 35 53 65 67 49 74 65 72 4c 6f 61 64 44  fts5SegIterLoadD
10c60 6c 69 64 78 28 70 2c 20 70 49 74 65 72 29 3b 0a  lidx(p, pIter);.
10c70 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
10c80 28 20 66 6c 61 67 73 20 26 20 46 54 53 35 49 4e  ( flags & FTS5IN
10c90 44 45 58 5f 51 55 45 52 59 5f 44 45 53 43 20 29  DEX_QUERY_DESC )
10ca0 7b 0a 20 20 20 20 20 20 20 20 66 74 73 35 53 65  {.        fts5Se
10cb0 67 49 74 65 72 52 65 76 65 72 73 65 28 70 2c 20  gIterReverse(p, 
10cc0 70 49 74 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a  pIter);.      }.
10cd0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
10ce0 45 69 74 68 65 72 3a 0a 20 20 2a 2a 0a 20 20 2a  Either:.  **.  *
10cf0 2a 20 20 20 31 29 20 61 6e 20 65 72 72 6f 72 20  *   1) an error 
10d00 68 61 73 20 6f 63 63 75 72 72 65 64 2c 20 6f 72  has occurred, or
10d10 0a 20 20 2a 2a 20 20 20 32 29 20 74 68 65 20 69  .  **   2) the i
10d20 74 65 72 61 74 6f 72 20 70 6f 69 6e 74 73 20 74  terator points t
10d30 6f 20 45 4f 46 2c 20 6f 72 0a 20 20 2a 2a 20 20  o EOF, or.  **  
10d40 20 33 29 20 74 68 65 20 69 74 65 72 61 74 6f 72   3) the iterator
10d50 20 70 6f 69 6e 74 73 20 74 6f 20 61 6e 20 65 6e   points to an en
10d60 74 72 79 20 77 69 74 68 20 74 65 72 6d 20 28 70  try with term (p
10d70 54 65 72 6d 2f 6e 54 65 72 6d 29 2c 20 6f 72 0a  Term/nTerm), or.
10d80 20 20 2a 2a 20 20 20 34 29 20 74 68 65 20 46 54    **   4) the FT
10d90 53 35 49 4e 44 45 58 5f 51 55 45 52 59 5f 53 43  S5INDEX_QUERY_SC
10da0 41 4e 20 66 6c 61 67 20 77 61 73 20 73 65 74 20  AN flag was set 
10db0 61 6e 64 20 74 68 65 20 69 74 65 72 61 74 6f 72  and the iterator
10dc0 20 70 6f 69 6e 74 73 0a 20 20 2a 2a 20 20 20 20   points.  **    
10dd0 20 20 74 6f 20 61 6e 20 65 6e 74 72 79 20 77 69    to an entry wi
10de0 74 68 20 61 20 74 65 72 6d 20 67 72 65 61 74 65  th a term greate
10df0 72 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20  r than or equal 
10e00 74 6f 20 28 70 54 65 72 6d 2f 6e 54 65 72 6d 29  to (pTerm/nTerm)
10e10 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
10e20 20 70 2d 3e 72 63 21 3d 53 51 4c 49 54 45 5f 4f   p->rc!=SQLITE_O
10e30 4b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  K               
10e40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10e50 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 31 20             /* 1 
10e60 2a 2f 0a 20 20 20 7c 7c 20 70 49 74 65 72 2d 3e  */.   || pIter->
10e70 70 4c 65 61 66 3d 3d 30 20 20 20 20 20 20 20 20  pLeaf==0        
10e80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10e90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10ea0 20 20 20 20 20 20 20 2f 2a 20 32 20 2a 2f 0a 20         /* 2 */. 
10eb0 20 20 7c 7c 20 66 74 73 35 42 75 66 66 65 72 43    || fts5BufferC
10ec0 6f 6d 70 61 72 65 42 6c 6f 62 28 26 70 49 74 65  ompareBlob(&pIte
10ed0 72 2d 3e 74 65 72 6d 2c 20 70 54 65 72 6d 2c 20  r->term, pTerm, 
10ee0 6e 54 65 72 6d 29 3d 3d 30 20 20 20 20 20 20 20  nTerm)==0       
10ef0 20 20 20 2f 2a 20 33 20 2a 2f 0a 20 20 20 7c 7c     /* 3 */.   ||
10f00 20 28 62 47 65 20 26 26 20 66 74 73 35 42 75 66   (bGe && fts5Buf
10f10 66 65 72 43 6f 6d 70 61 72 65 42 6c 6f 62 28 26  ferCompareBlob(&
10f20 70 49 74 65 72 2d 3e 74 65 72 6d 2c 20 70 54 65  pIter->term, pTe
10f30 72 6d 2c 20 6e 54 65 72 6d 29 3e 30 29 20 20 2f  rm, nTerm)>0)  /
10f40 2a 20 34 20 2a 2f 0a 20 20 29 3b 0a 7d 0a 0a 2f  * 4 */.  );.}../
10f50 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20  *.** Initialize 
10f60 74 68 65 20 6f 62 6a 65 63 74 20 70 49 74 65 72  the object pIter
10f70 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 65 72   to point to ter
10f80 6d 20 70 54 65 72 6d 2f 6e 54 65 72 6d 20 77 69  m pTerm/nTerm wi
10f90 74 68 69 6e 20 74 68 65 0a 2a 2a 20 69 6e 2d 6d  thin the.** in-m
10fa0 65 6d 6f 72 79 20 68 61 73 68 20 74 61 62 6c 65  emory hash table
10fb0 2e 20 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f  . If there is no
10fc0 20 73 75 63 68 20 74 65 72 6d 20 69 6e 20 74 68   such term in th
10fd0 65 20 68 61 73 68 2d 74 61 62 6c 65 2c 20 74 68  e hash-table, th
10fe0 65 20 0a 2a 2a 20 69 74 65 72 61 74 6f 72 20 69  e .** iterator i
10ff0 73 20 73 65 74 20 74 6f 20 45 4f 46 2e 0a 2a 2a  s set to EOF..**
11000 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20  .** If an error 
11010 6f 63 63 75 72 73 2c 20 46 74 73 35 49 6e 64 65  occurs, Fts5Inde
11020 78 2e 72 63 20 69 73 20 73 65 74 20 74 6f 20 61  x.rc is set to a
11030 6e 20 61 70 70 72 6f 70 72 69 61 74 65 20 65 72  n appropriate er
11040 72 6f 72 20 63 6f 64 65 2e 20 49 66 20 0a 2a 2a  ror code. If .**
11050 20 61 6e 20 65 72 72 6f 72 20 68 61 73 20 61 6c   an error has al
11060 72 65 61 64 79 20 6f 63 63 75 72 72 65 64 20 77  ready occurred w
11070 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hen this functio
11080 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20 69 74 20  n is called, it 
11090 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73  is a no-op..*/.s
110a0 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 53  tatic void fts5S
110b0 65 67 49 74 65 72 48 61 73 68 49 6e 69 74 28 0a  egIterHashInit(.
110c0 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20    Fts5Index *p, 
110d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
110e0 20 20 2f 2a 20 46 54 53 35 20 62 61 63 6b 65 6e    /* FTS5 backen
110f0 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 75 38 20  d */.  const u8 
11100 2a 70 54 65 72 6d 2c 20 69 6e 74 20 6e 54 65 72  *pTerm, int nTer
11110 6d 2c 20 20 20 20 20 2f 2a 20 54 65 72 6d 20 74  m,     /* Term t
11120 6f 20 73 65 65 6b 20 74 6f 20 2a 2f 0a 20 20 69  o seek to */.  i
11130 6e 74 20 66 6c 61 67 73 2c 20 20 20 20 20 20 20  nt flags,       
11140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
11150 2a 20 4d 61 73 6b 20 6f 66 20 46 54 53 35 49 4e  * Mask of FTS5IN
11160 44 45 58 5f 58 58 58 20 66 6c 61 67 73 20 2a 2f  DEX_XXX flags */
11170 0a 20 20 46 74 73 35 53 65 67 49 74 65 72 20 2a  .  Fts5SegIter *
11180 70 49 74 65 72 20 20 20 20 20 20 20 20 20 20 20  pIter           
11190 20 20 20 2f 2a 20 4f 62 6a 65 63 74 20 74 6f 20     /* Object to 
111a0 70 6f 70 75 6c 61 74 65 20 2a 2f 0a 29 7b 0a 20  populate */.){. 
111b0 20 63 6f 6e 73 74 20 75 38 20 2a 70 4c 69 73 74   const u8 *pList
111c0 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 4c 69 73   = 0;.  int nLis
111d0 74 20 3d 20 30 3b 0a 20 20 63 6f 6e 73 74 20 75  t = 0;.  const u
111e0 38 20 2a 7a 20 3d 20 30 3b 0a 20 20 69 6e 74 20  8 *z = 0;.  int 
111f0 6e 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74  n = 0;..  assert
11200 28 20 70 2d 3e 70 48 61 73 68 20 29 3b 0a 20 20  ( p->pHash );.  
11210 61 73 73 65 72 74 28 20 70 2d 3e 72 63 3d 3d 53  assert( p->rc==S
11220 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 0a 20 20 69  QLITE_OK );..  i
11230 66 28 20 70 54 65 72 6d 3d 3d 30 20 7c 7c 20 28  f( pTerm==0 || (
11240 66 6c 61 67 73 20 26 20 46 54 53 35 49 4e 44 45  flags & FTS5INDE
11250 58 5f 51 55 45 52 59 5f 53 43 41 4e 29 20 29 7b  X_QUERY_SCAN) ){
11260 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 73 71 6c  .    p->rc = sql
11270 69 74 65 33 46 74 73 35 48 61 73 68 53 63 61 6e  ite3Fts5HashScan
11280 49 6e 69 74 28 70 2d 3e 70 48 61 73 68 2c 20 28  Init(p->pHash, (
11290 63 6f 6e 73 74 20 63 68 61 72 2a 29 70 54 65 72  const char*)pTer
112a0 6d 2c 20 6e 54 65 72 6d 29 3b 0a 20 20 20 20 73  m, nTerm);.    s
112b0 71 6c 69 74 65 33 46 74 73 35 48 61 73 68 53 63  qlite3Fts5HashSc
112c0 61 6e 45 6e 74 72 79 28 70 2d 3e 70 48 61 73 68  anEntry(p->pHash
112d0 2c 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 2a 29  , (const char**)
112e0 26 7a 2c 20 26 70 4c 69 73 74 2c 20 26 6e 4c 69  &z, &pList, &nLi
112f0 73 74 29 3b 0a 20 20 20 20 6e 20 3d 20 28 7a 20  st);.    n = (z 
11300 3f 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 28 63  ? (int)strlen((c
11310 6f 6e 73 74 20 63 68 61 72 2a 29 7a 29 20 3a 20  onst char*)z) : 
11320 30 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  0);.  }else{.   
11330 20 70 49 74 65 72 2d 3e 66 6c 61 67 73 20 7c 3d   pIter->flags |=
11340 20 46 54 53 35 5f 53 45 47 49 54 45 52 5f 4f 4e   FTS5_SEGITER_ON
11350 45 54 45 52 4d 3b 0a 20 20 20 20 73 71 6c 69 74  ETERM;.    sqlit
11360 65 33 46 74 73 35 48 61 73 68 51 75 65 72 79 28  e3Fts5HashQuery(
11370 70 2d 3e 70 48 61 73 68 2c 20 28 63 6f 6e 73 74  p->pHash, (const
11380 20 63 68 61 72 2a 29 70 54 65 72 6d 2c 20 6e 54   char*)pTerm, nT
11390 65 72 6d 2c 20 26 70 4c 69 73 74 2c 20 26 6e 4c  erm, &pList, &nL
113a0 69 73 74 29 3b 0a 20 20 20 20 7a 20 3d 20 70 54  ist);.    z = pT
113b0 65 72 6d 3b 0a 20 20 20 20 6e 20 3d 20 6e 54 65  erm;.    n = nTe
113c0 72 6d 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70  rm;.  }..  if( p
113d0 4c 69 73 74 20 29 7b 0a 20 20 20 20 46 74 73 35  List ){.    Fts5
113e0 44 61 74 61 20 2a 70 4c 65 61 66 3b 0a 20 20 20  Data *pLeaf;.   
113f0 20 73 71 6c 69 74 65 33 46 74 73 35 42 75 66 66   sqlite3Fts5Buff
11400 65 72 53 65 74 28 26 70 2d 3e 72 63 2c 20 26 70  erSet(&p->rc, &p
11410 49 74 65 72 2d 3e 74 65 72 6d 2c 20 6e 2c 20 7a  Iter->term, n, z
11420 29 3b 0a 20 20 20 20 70 4c 65 61 66 20 3d 20 66  );.    pLeaf = f
11430 74 73 35 49 64 78 4d 61 6c 6c 6f 63 28 70 2c 20  ts5IdxMalloc(p, 
11440 73 69 7a 65 6f 66 28 46 74 73 35 44 61 74 61 29  sizeof(Fts5Data)
11450 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 65 61 66  );.    if( pLeaf
11460 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
11470 20 20 70 4c 65 61 66 2d 3e 70 20 3d 20 28 75 38    pLeaf->p = (u8
11480 2a 29 70 4c 69 73 74 3b 0a 20 20 20 20 70 4c 65  *)pList;.    pLe
11490 61 66 2d 3e 6e 6e 20 3d 20 70 4c 65 61 66 2d 3e  af->nn = pLeaf->
114a0 73 7a 4c 65 61 66 20 3d 20 6e 4c 69 73 74 3b 0a  szLeaf = nList;.
114b0 20 20 20 20 70 49 74 65 72 2d 3e 70 4c 65 61 66      pIter->pLeaf
114c0 20 3d 20 70 4c 65 61 66 3b 0a 20 20 20 20 70 49   = pLeaf;.    pI
114d0 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74  ter->iLeafOffset
114e0 20 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e 74   = fts5GetVarint
114f0 28 70 4c 65 61 66 2d 3e 70 2c 20 28 75 36 34 2a  (pLeaf->p, (u64*
11500 29 26 70 49 74 65 72 2d 3e 69 52 6f 77 69 64 29  )&pIter->iRowid)
11510 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 69 45 6e  ;.    pIter->iEn
11520 64 6f 66 44 6f 63 6c 69 73 74 20 3d 20 70 4c 65  dofDoclist = pLe
11530 61 66 2d 3e 6e 6e 2b 31 3b 0a 0a 20 20 20 20 69  af->nn+1;..    i
11540 66 28 20 66 6c 61 67 73 20 26 20 46 54 53 35 49  f( flags & FTS5I
11550 4e 44 45 58 5f 51 55 45 52 59 5f 44 45 53 43 20  NDEX_QUERY_DESC 
11560 29 7b 0a 20 20 20 20 20 20 70 49 74 65 72 2d 3e  ){.      pIter->
11570 66 6c 61 67 73 20 7c 3d 20 46 54 53 35 5f 53 45  flags |= FTS5_SE
11580 47 49 54 45 52 5f 52 45 56 45 52 53 45 3b 0a 20  GITER_REVERSE;. 
11590 20 20 20 20 20 66 74 73 35 53 65 67 49 74 65 72       fts5SegIter
115a0 52 65 76 65 72 73 65 49 6e 69 74 50 61 67 65 28  ReverseInitPage(
115b0 70 2c 20 70 49 74 65 72 29 3b 0a 20 20 20 20 7d  p, pIter);.    }
115c0 65 6c 73 65 7b 0a 20 20 20 20 20 20 66 74 73 35  else{.      fts5
115d0 53 65 67 49 74 65 72 4c 6f 61 64 4e 50 6f 73 28  SegIterLoadNPos(
115e0 70 2c 20 70 49 74 65 72 29 3b 0a 20 20 20 20 7d  p, pIter);.    }
115f0 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 5a 65  .  }.}../*.** Ze
11600 72 6f 20 74 68 65 20 69 74 65 72 61 74 6f 72 20  ro the iterator 
11610 70 61 73 73 65 64 20 61 73 20 74 68 65 20 6f 6e  passed as the on
11620 6c 79 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a  ly argument..*/.
11630 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
11640 53 65 67 49 74 65 72 43 6c 65 61 72 28 46 74 73  SegIterClear(Fts
11650 35 53 65 67 49 74 65 72 20 2a 70 49 74 65 72 29  5SegIter *pIter)
11660 7b 0a 20 20 66 74 73 35 42 75 66 66 65 72 46 72  {.  fts5BufferFr
11670 65 65 28 26 70 49 74 65 72 2d 3e 74 65 72 6d 29  ee(&pIter->term)
11680 3b 0a 20 20 66 74 73 35 44 61 74 61 52 65 6c 65  ;.  fts5DataRele
11690 61 73 65 28 70 49 74 65 72 2d 3e 70 4c 65 61 66  ase(pIter->pLeaf
116a0 29 3b 0a 20 20 66 74 73 35 44 61 74 61 52 65 6c  );.  fts5DataRel
116b0 65 61 73 65 28 70 49 74 65 72 2d 3e 70 4e 65 78  ease(pIter->pNex
116c0 74 4c 65 61 66 29 3b 0a 20 20 66 74 73 35 44 6c  tLeaf);.  fts5Dl
116d0 69 64 78 49 74 65 72 46 72 65 65 28 70 49 74 65  idxIterFree(pIte
116e0 72 2d 3e 70 44 6c 69 64 78 29 3b 0a 20 20 73 71  r->pDlidx);.  sq
116f0 6c 69 74 65 33 5f 66 72 65 65 28 70 49 74 65 72  lite3_free(pIter
11700 2d 3e 61 52 6f 77 69 64 4f 66 66 73 65 74 29 3b  ->aRowidOffset);
11710 0a 20 20 6d 65 6d 73 65 74 28 70 49 74 65 72 2c  .  memset(pIter,
11720 20 30 2c 20 73 69 7a 65 6f 66 28 46 74 73 35 53   0, sizeof(Fts5S
11730 65 67 49 74 65 72 29 29 3b 0a 7d 0a 0a 23 69 66  egIter));.}..#if
11740 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
11750 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
11760 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20 61 73  ction is used as
11770 20 70 61 72 74 20 6f 66 20 74 68 65 20 62 69 67   part of the big
11780 20 61 73 73 65 72 74 28 29 20 70 72 6f 63 65 64   assert() proced
11790 75 72 65 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20  ure implemented 
117a0 62 79 0a 2a 2a 20 66 74 73 35 41 73 73 65 72 74  by.** fts5Assert
117b0 4d 75 6c 74 69 49 74 65 72 53 65 74 75 70 28 29  MultiIterSetup()
117c0 2e 20 49 74 20 65 6e 73 75 72 65 73 20 74 68 61  . It ensures tha
117d0 74 20 74 68 65 20 72 65 73 75 6c 74 20 63 75 72  t the result cur
117e0 72 65 6e 74 6c 79 20 73 74 6f 72 65 64 0a 2a 2a  rently stored.**
117f0 20 69 6e 20 2a 70 52 65 73 20 69 73 20 74 68 65   in *pRes is the
11800 20 63 6f 72 72 65 63 74 20 72 65 73 75 6c 74 20   correct result 
11810 6f 66 20 63 6f 6d 70 61 72 69 6e 67 20 74 68 65  of comparing the
11820 20 63 75 72 72 65 6e 74 20 70 6f 73 69 74 69 6f   current positio
11830 6e 73 20 6f 66 20 74 68 65 0a 2a 2a 20 74 77 6f  ns of the.** two
11840 20 69 74 65 72 61 74 6f 72 73 2e 0a 2a 2f 0a 73   iterators..*/.s
11850 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 41  tatic void fts5A
11860 73 73 65 72 74 43 6f 6d 70 61 72 69 73 6f 6e 52  ssertComparisonR
11870 65 73 75 6c 74 28 0a 20 20 46 74 73 35 49 6e 64  esult(.  Fts5Ind
11880 65 78 49 74 65 72 20 2a 70 49 74 65 72 2c 20 0a  exIter *pIter, .
11890 20 20 46 74 73 35 53 65 67 49 74 65 72 20 2a 70    Fts5SegIter *p
118a0 31 2c 0a 20 20 46 74 73 35 53 65 67 49 74 65 72  1,.  Fts5SegIter
118b0 20 2a 70 32 2c 0a 20 20 46 74 73 35 43 52 65 73   *p2,.  Fts5CRes
118c0 75 6c 74 20 2a 70 52 65 73 0a 29 7b 0a 20 20 69  ult *pRes.){.  i
118d0 6e 74 20 69 31 20 3d 20 70 31 20 2d 20 70 49 74  nt i1 = p1 - pIt
118e0 65 72 2d 3e 61 53 65 67 3b 0a 20 20 69 6e 74 20  er->aSeg;.  int 
118f0 69 32 20 3d 20 70 32 20 2d 20 70 49 74 65 72 2d  i2 = p2 - pIter-
11900 3e 61 53 65 67 3b 0a 0a 20 20 69 66 28 20 70 31  >aSeg;..  if( p1
11910 2d 3e 70 4c 65 61 66 20 7c 7c 20 70 32 2d 3e 70  ->pLeaf || p2->p
11920 4c 65 61 66 20 29 7b 0a 20 20 20 20 69 66 28 20  Leaf ){.    if( 
11930 70 31 2d 3e 70 4c 65 61 66 3d 3d 30 20 29 7b 0a  p1->pLeaf==0 ){.
11940 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 52        assert( pR
11950 65 73 2d 3e 69 46 69 72 73 74 3d 3d 69 32 20 29  es->iFirst==i2 )
11960 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
11970 70 32 2d 3e 70 4c 65 61 66 3d 3d 30 20 29 7b 0a  p2->pLeaf==0 ){.
11980 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 52        assert( pR
11990 65 73 2d 3e 69 46 69 72 73 74 3d 3d 69 31 20 29  es->iFirst==i1 )
119a0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
119b0 20 20 20 69 6e 74 20 6e 4d 69 6e 20 3d 20 4d 49     int nMin = MI
119c0 4e 28 70 31 2d 3e 74 65 72 6d 2e 6e 2c 20 70 32  N(p1->term.n, p2
119d0 2d 3e 74 65 72 6d 2e 6e 29 3b 0a 20 20 20 20 20  ->term.n);.     
119e0 20 69 6e 74 20 72 65 73 20 3d 20 6d 65 6d 63 6d   int res = memcm
119f0 70 28 70 31 2d 3e 74 65 72 6d 2e 70 2c 20 70 32  p(p1->term.p, p2
11a00 2d 3e 74 65 72 6d 2e 70 2c 20 6e 4d 69 6e 29 3b  ->term.p, nMin);
11a10 0a 20 20 20 20 20 20 69 66 28 20 72 65 73 3d 3d  .      if( res==
11a20 30 20 29 20 72 65 73 20 3d 20 70 31 2d 3e 74 65  0 ) res = p1->te
11a30 72 6d 2e 6e 20 2d 20 70 32 2d 3e 74 65 72 6d 2e  rm.n - p2->term.
11a40 6e 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 72 65  n;..      if( re
11a50 73 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  s==0 ){.        
11a60 61 73 73 65 72 74 28 20 70 52 65 73 2d 3e 62 54  assert( pRes->bT
11a70 65 72 6d 45 71 3d 3d 31 20 29 3b 0a 20 20 20 20  ermEq==1 );.    
11a80 20 20 20 20 61 73 73 65 72 74 28 20 70 31 2d 3e      assert( p1->
11a90 69 52 6f 77 69 64 21 3d 70 32 2d 3e 69 52 6f 77  iRowid!=p2->iRow
11aa0 69 64 20 29 3b 0a 20 20 20 20 20 20 20 20 72 65  id );.        re
11ab0 73 20 3d 20 28 28 70 31 2d 3e 69 52 6f 77 69 64  s = ((p1->iRowid
11ac0 20 3e 20 70 32 2d 3e 69 52 6f 77 69 64 29 3d 3d   > p2->iRowid)==
11ad0 70 49 74 65 72 2d 3e 62 52 65 76 29 20 3f 20 2d  pIter->bRev) ? -
11ae0 31 20 3a 20 31 3b 0a 20 20 20 20 20 20 7d 65 6c  1 : 1;.      }el
11af0 73 65 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65  se{.        asse
11b00 72 74 28 20 70 52 65 73 2d 3e 62 54 65 72 6d 45  rt( pRes->bTermE
11b10 71 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 7d 0a  q==0 );.      }.
11b20 0a 20 20 20 20 20 20 69 66 28 20 72 65 73 3c 30  .      if( res<0
11b30 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65   ){.        asse
11b40 72 74 28 20 70 52 65 73 2d 3e 69 46 69 72 73 74  rt( pRes->iFirst
11b50 3d 3d 69 31 20 29 3b 0a 20 20 20 20 20 20 7d 65  ==i1 );.      }e
11b60 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61 73 73  lse{.        ass
11b70 65 72 74 28 20 70 52 65 73 2d 3e 69 46 69 72 73  ert( pRes->iFirs
11b80 74 3d 3d 69 32 20 29 3b 0a 20 20 20 20 20 20 7d  t==i2 );.      }
11b90 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a  .    }.  }.}../*
11ba0 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
11bb0 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 20 75 6e 6c  n is a no-op unl
11bc0 65 73 73 20 53 51 4c 49 54 45 5f 44 45 42 55 47  ess SQLITE_DEBUG
11bd0 20 69 73 20 64 65 66 69 6e 65 64 20 77 68 65 6e   is defined when
11be0 20 74 68 69 73 20 6d 6f 64 75 6c 65 0a 2a 2a 20   this module.** 
11bf0 69 73 20 63 6f 6d 70 69 6c 65 64 2e 20 49 6e 20  is compiled. In 
11c00 74 68 61 74 20 63 61 73 65 2c 20 74 68 69 73 20  that case, this 
11c10 66 75 6e 63 74 69 6f 6e 20 69 73 20 65 73 73 65  function is esse
11c20 6e 74 69 61 6c 6c 79 20 61 6e 20 61 73 73 65 72  ntially an asser
11c30 74 28 29 20 0a 2a 2a 20 73 74 61 74 65 6d 65 6e  t() .** statemen
11c40 74 20 75 73 65 64 20 74 6f 20 76 65 72 69 66 79  t used to verify
11c50 20 74 68 61 74 20 74 68 65 20 63 6f 6e 74 65 6e   that the conten
11c60 74 73 20 6f 66 20 74 68 65 20 70 49 74 65 72 2d  ts of the pIter-
11c70 3e 61 46 69 72 73 74 5b 5d 20 61 72 72 61 79 0a  >aFirst[] array.
11c80 2a 2a 20 61 72 65 20 63 6f 72 72 65 63 74 2e 0a  ** are correct..
11c90 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
11ca0 74 73 35 41 73 73 65 72 74 4d 75 6c 74 69 49 74  ts5AssertMultiIt
11cb0 65 72 53 65 74 75 70 28 46 74 73 35 49 6e 64 65  erSetup(Fts5Inde
11cc0 78 20 2a 70 2c 20 46 74 73 35 49 6e 64 65 78 49  x *p, Fts5IndexI
11cd0 74 65 72 20 2a 70 49 74 65 72 29 7b 0a 20 20 69  ter *pIter){.  i
11ce0 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  f( p->rc==SQLITE
11cf0 5f 4f 4b 20 29 7b 0a 20 20 20 20 46 74 73 35 53  _OK ){.    Fts5S
11d00 65 67 49 74 65 72 20 2a 70 46 69 72 73 74 20 3d  egIter *pFirst =
11d10 20 26 70 49 74 65 72 2d 3e 61 53 65 67 5b 20 70   &pIter->aSeg[ p
11d20 49 74 65 72 2d 3e 61 46 69 72 73 74 5b 31 5d 2e  Iter->aFirst[1].
11d30 69 46 69 72 73 74 20 5d 3b 0a 20 20 20 20 69 6e  iFirst ];.    in
11d40 74 20 69 3b 0a 0a 20 20 20 20 61 73 73 65 72 74  t i;..    assert
11d50 28 20 28 70 46 69 72 73 74 2d 3e 70 4c 65 61 66  ( (pFirst->pLeaf
11d60 3d 3d 30 29 3d 3d 70 49 74 65 72 2d 3e 62 45 6f  ==0)==pIter->bEo
11d70 66 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 68 65  f );..    /* Che
11d80 63 6b 20 74 68 61 74 20 70 49 74 65 72 2d 3e 69  ck that pIter->i
11d90 53 77 69 74 63 68 52 6f 77 69 64 20 69 73 20 73  SwitchRowid is s
11da0 65 74 20 63 6f 72 72 65 63 74 6c 79 2e 20 2a 2f  et correctly. */
11db0 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
11dc0 70 49 74 65 72 2d 3e 6e 53 65 67 3b 20 69 2b 2b  pIter->nSeg; i++
11dd0 29 7b 0a 20 20 20 20 20 20 46 74 73 35 53 65 67  ){.      Fts5Seg
11de0 49 74 65 72 20 2a 70 31 20 3d 20 26 70 49 74 65  Iter *p1 = &pIte
11df0 72 2d 3e 61 53 65 67 5b 69 5d 3b 0a 20 20 20 20  r->aSeg[i];.    
11e00 20 20 61 73 73 65 72 74 28 20 70 31 3d 3d 70 46    assert( p1==pF
11e10 69 72 73 74 20 0a 20 20 20 20 20 20 20 20 20 20  irst .          
11e20 20 7c 7c 20 70 31 2d 3e 70 4c 65 61 66 3d 3d 30   || p1->pLeaf==0
11e30 20 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20   .           || 
11e40 66 74 73 35 42 75 66 66 65 72 43 6f 6d 70 61 72  fts5BufferCompar
11e50 65 28 26 70 46 69 72 73 74 2d 3e 74 65 72 6d 2c  e(&pFirst->term,
11e60 20 26 70 31 2d 3e 74 65 72 6d 29 20 0a 20 20 20   &p1->term) .   
11e70 20 20 20 20 20 20 20 20 7c 7c 20 70 31 2d 3e 69          || p1->i
11e80 52 6f 77 69 64 3d 3d 70 49 74 65 72 2d 3e 69 53  Rowid==pIter->iS
11e90 77 69 74 63 68 52 6f 77 69 64 0a 20 20 20 20 20  witchRowid.     
11ea0 20 20 20 20 20 20 7c 7c 20 28 70 31 2d 3e 69 52        || (p1->iR
11eb0 6f 77 69 64 3c 70 49 74 65 72 2d 3e 69 53 77 69  owid<pIter->iSwi
11ec0 74 63 68 52 6f 77 69 64 29 3d 3d 70 49 74 65 72  tchRowid)==pIter
11ed0 2d 3e 62 52 65 76 0a 20 20 20 20 20 20 29 3b 0a  ->bRev.      );.
11ee0 20 20 20 20 7d 0a 0a 20 20 20 20 66 6f 72 28 69      }..    for(i
11ef0 3d 30 3b 20 69 3c 70 49 74 65 72 2d 3e 6e 53 65  =0; i<pIter->nSe
11f00 67 3b 20 69 2b 3d 32 29 7b 0a 20 20 20 20 20 20  g; i+=2){.      
11f10 46 74 73 35 53 65 67 49 74 65 72 20 2a 70 31 20  Fts5SegIter *p1 
11f20 3d 20 26 70 49 74 65 72 2d 3e 61 53 65 67 5b 69  = &pIter->aSeg[i
11f30 5d 3b 0a 20 20 20 20 20 20 46 74 73 35 53 65 67  ];.      Fts5Seg
11f40 49 74 65 72 20 2a 70 32 20 3d 20 26 70 49 74 65  Iter *p2 = &pIte
11f50 72 2d 3e 61 53 65 67 5b 69 2b 31 5d 3b 0a 20 20  r->aSeg[i+1];.  
11f60 20 20 20 20 46 74 73 35 43 52 65 73 75 6c 74 20      Fts5CResult 
11f70 2a 70 52 65 73 20 3d 20 26 70 49 74 65 72 2d 3e  *pRes = &pIter->
11f80 61 46 69 72 73 74 5b 28 70 49 74 65 72 2d 3e 6e  aFirst[(pIter->n
11f90 53 65 67 20 2b 20 69 29 20 2f 20 32 5d 3b 0a 20  Seg + i) / 2];. 
11fa0 20 20 20 20 20 66 74 73 35 41 73 73 65 72 74 43       fts5AssertC
11fb0 6f 6d 70 61 72 69 73 6f 6e 52 65 73 75 6c 74 28  omparisonResult(
11fc0 70 49 74 65 72 2c 20 70 31 2c 20 70 32 2c 20 70  pIter, p1, p2, p
11fd0 52 65 73 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  Res);.    }..   
11fe0 20 66 6f 72 28 69 3d 31 3b 20 69 3c 28 70 49 74   for(i=1; i<(pIt
11ff0 65 72 2d 3e 6e 53 65 67 20 2f 20 32 29 3b 20 69  er->nSeg / 2); i
12000 2b 3d 32 29 7b 0a 20 20 20 20 20 20 46 74 73 35  +=2){.      Fts5
12010 53 65 67 49 74 65 72 20 2a 70 31 20 3d 20 26 70  SegIter *p1 = &p
12020 49 74 65 72 2d 3e 61 53 65 67 5b 20 70 49 74 65  Iter->aSeg[ pIte
12030 72 2d 3e 61 46 69 72 73 74 5b 69 2a 32 5d 2e 69  r->aFirst[i*2].i
12040 46 69 72 73 74 20 5d 3b 0a 20 20 20 20 20 20 46  First ];.      F
12050 74 73 35 53 65 67 49 74 65 72 20 2a 70 32 20 3d  ts5SegIter *p2 =
12060 20 26 70 49 74 65 72 2d 3e 61 53 65 67 5b 20 70   &pIter->aSeg[ p
12070 49 74 65 72 2d 3e 61 46 69 72 73 74 5b 69 2a 32  Iter->aFirst[i*2
12080 2b 31 5d 2e 69 46 69 72 73 74 20 5d 3b 0a 20 20  +1].iFirst ];.  
12090 20 20 20 20 46 74 73 35 43 52 65 73 75 6c 74 20      Fts5CResult 
120a0 2a 70 52 65 73 20 3d 20 26 70 49 74 65 72 2d 3e  *pRes = &pIter->
120b0 61 46 69 72 73 74 5b 69 5d 3b 0a 20 20 20 20 20  aFirst[i];.     
120c0 20 66 74 73 35 41 73 73 65 72 74 43 6f 6d 70 61   fts5AssertCompa
120d0 72 69 73 6f 6e 52 65 73 75 6c 74 28 70 49 74 65  risonResult(pIte
120e0 72 2c 20 70 31 2c 20 70 32 2c 20 70 52 65 73 29  r, p1, p2, pRes)
120f0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65  ;.    }.  }.}.#e
12100 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 66 74 73  lse.# define fts
12110 35 41 73 73 65 72 74 4d 75 6c 74 69 49 74 65 72  5AssertMultiIter
12120 53 65 74 75 70 28 78 2c 79 29 0a 23 65 6e 64 69  Setup(x,y).#endi
12130 66 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20 74 68 65 20  f../*.** Do the 
12140 63 6f 6d 70 61 72 69 73 6f 6e 20 6e 65 63 65 73  comparison neces
12150 73 61 72 79 20 74 6f 20 70 6f 70 75 6c 61 74 65  sary to populate
12160 20 70 49 74 65 72 2d 3e 61 46 69 72 73 74 5b 69   pIter->aFirst[i
12170 4f 75 74 5d 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  Out]..**.** If t
12180 68 65 20 72 65 74 75 72 6e 65 64 20 76 61 6c 75  he returned valu
12190 65 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74  e is non-zero, t
121a0 68 65 6e 20 69 74 20 69 73 20 74 68 65 20 69 6e  hen it is the in
121b0 64 65 78 20 6f 66 20 61 6e 20 65 6e 74 72 79 0a  dex of an entry.
121c0 2a 2a 20 69 6e 20 74 68 65 20 70 49 74 65 72 2d  ** in the pIter-
121d0 3e 61 53 65 67 5b 5d 20 61 72 72 61 79 20 74 68  >aSeg[] array th
121e0 61 74 20 69 73 20 28 61 29 20 6e 6f 74 20 61 74  at is (a) not at
121f0 20 45 4f 46 2c 20 61 6e 64 20 28 62 29 20 70 6f   EOF, and (b) po
12200 69 6e 74 69 6e 67 0a 2a 2a 20 74 6f 20 61 20 6b  inting.** to a k
12210 65 79 20 74 68 61 74 20 69 73 20 61 20 64 75 70  ey that is a dup
12220 6c 69 63 61 74 65 20 6f 66 20 61 6e 6f 74 68 65  licate of anothe
12230 72 2c 20 68 69 67 68 65 72 20 70 72 69 6f 72 69  r, higher priori
12240 74 79 2c 20 0a 2a 2a 20 73 65 67 6d 65 6e 74 2d  ty, .** segment-
12250 69 74 65 72 61 74 6f 72 20 69 6e 20 74 68 65 20  iterator in the 
12260 70 53 65 67 2d 3e 61 53 65 67 5b 5d 20 61 72 72  pSeg->aSeg[] arr
12270 61 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ay..*/.static in
12280 74 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 44  t fts5MultiIterD
12290 6f 43 6f 6d 70 61 72 65 28 46 74 73 35 49 6e 64  oCompare(Fts5Ind
122a0 65 78 49 74 65 72 20 2a 70 49 74 65 72 2c 20 69  exIter *pIter, i
122b0 6e 74 20 69 4f 75 74 29 7b 0a 20 20 69 6e 74 20  nt iOut){.  int 
122c0 69 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  i1;             
122d0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
122e0 6e 64 65 78 20 6f 66 20 6c 65 66 74 2d 68 61 6e  ndex of left-han
122f0 64 20 46 74 73 35 53 65 67 49 74 65 72 20 2a 2f  d Fts5SegIter */
12300 0a 20 20 69 6e 74 20 69 32 3b 20 20 20 20 20 20  .  int i2;      
12310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12320 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 72     /* Index of r
12330 69 67 68 74 2d 68 61 6e 64 20 46 74 73 35 53 65  ight-hand Fts5Se
12340 67 49 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 69  gIter */.  int i
12350 52 65 73 3b 0a 20 20 46 74 73 35 53 65 67 49 74  Res;.  Fts5SegIt
12360 65 72 20 2a 70 31 3b 20 20 20 20 20 20 20 20 20  er *p1;         
12370 20 20 20 20 20 20 20 2f 2a 20 4c 65 66 74 2d 68         /* Left-h
12380 61 6e 64 20 46 74 73 35 53 65 67 49 74 65 72 20  and Fts5SegIter 
12390 2a 2f 0a 20 20 46 74 73 35 53 65 67 49 74 65 72  */.  Fts5SegIter
123a0 20 2a 70 32 3b 20 20 20 20 20 20 20 20 20 20 20   *p2;           
123b0 20 20 20 20 20 2f 2a 20 52 69 67 68 74 2d 68 61       /* Right-ha
123c0 6e 64 20 46 74 73 35 53 65 67 49 74 65 72 20 2a  nd Fts5SegIter *
123d0 2f 0a 20 20 46 74 73 35 43 52 65 73 75 6c 74 20  /.  Fts5CResult 
123e0 2a 70 52 65 73 20 3d 20 26 70 49 74 65 72 2d 3e  *pRes = &pIter->
123f0 61 46 69 72 73 74 5b 69 4f 75 74 5d 3b 0a 0a 20  aFirst[iOut];.. 
12400 20 61 73 73 65 72 74 28 20 69 4f 75 74 3c 70 49   assert( iOut<pI
12410 74 65 72 2d 3e 6e 53 65 67 20 26 26 20 69 4f 75  ter->nSeg && iOu
12420 74 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  t>0 );.  assert(
12430 20 70 49 74 65 72 2d 3e 62 52 65 76 3d 3d 30 20   pIter->bRev==0 
12440 7c 7c 20 70 49 74 65 72 2d 3e 62 52 65 76 3d 3d  || pIter->bRev==
12450 31 20 29 3b 0a 0a 20 20 69 66 28 20 69 4f 75 74  1 );..  if( iOut
12460 3e 3d 28 70 49 74 65 72 2d 3e 6e 53 65 67 2f 32  >=(pIter->nSeg/2
12470 29 20 29 7b 0a 20 20 20 20 69 31 20 3d 20 28 69  ) ){.    i1 = (i
12480 4f 75 74 20 2d 20 70 49 74 65 72 2d 3e 6e 53 65  Out - pIter->nSe
12490 67 2f 32 29 20 2a 20 32 3b 0a 20 20 20 20 69 32  g/2) * 2;.    i2
124a0 20 3d 20 69 31 20 2b 20 31 3b 0a 20 20 7d 65 6c   = i1 + 1;.  }el
124b0 73 65 7b 0a 20 20 20 20 69 31 20 3d 20 70 49 74  se{.    i1 = pIt
124c0 65 72 2d 3e 61 46 69 72 73 74 5b 69 4f 75 74 2a  er->aFirst[iOut*
124d0 32 5d 2e 69 46 69 72 73 74 3b 0a 20 20 20 20 69  2].iFirst;.    i
124e0 32 20 3d 20 70 49 74 65 72 2d 3e 61 46 69 72 73  2 = pIter->aFirs
124f0 74 5b 69 4f 75 74 2a 32 2b 31 5d 2e 69 46 69 72  t[iOut*2+1].iFir
12500 73 74 3b 0a 20 20 7d 0a 20 20 70 31 20 3d 20 26  st;.  }.  p1 = &
12510 70 49 74 65 72 2d 3e 61 53 65 67 5b 69 31 5d 3b  pIter->aSeg[i1];
12520 0a 20 20 70 32 20 3d 20 26 70 49 74 65 72 2d 3e  .  p2 = &pIter->
12530 61 53 65 67 5b 69 32 5d 3b 0a 0a 20 20 70 52 65  aSeg[i2];..  pRe
12540 73 2d 3e 62 54 65 72 6d 45 71 20 3d 20 30 3b 0a  s->bTermEq = 0;.
12550 20 20 69 66 28 20 70 31 2d 3e 70 4c 65 61 66 3d    if( p1->pLeaf=
12560 3d 30 20 29 7b 20 20 20 20 20 20 20 20 20 20 20  =0 ){           
12570 2f 2a 20 49 66 20 70 31 20 69 73 20 61 74 20 45  /* If p1 is at E
12580 4f 46 20 2a 2f 0a 20 20 20 20 69 52 65 73 20 3d  OF */.    iRes =
12590 20 69 32 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28   i2;.  }else if(
125a0 20 70 32 2d 3e 70 4c 65 61 66 3d 3d 30 20 29 7b   p2->pLeaf==0 ){
125b0 20 20 20 20 20 2f 2a 20 49 66 20 70 32 20 69 73       /* If p2 is
125c0 20 61 74 20 45 4f 46 20 2a 2f 0a 20 20 20 20 69   at EOF */.    i
125d0 52 65 73 20 3d 20 69 31 3b 0a 20 20 7d 65 6c 73  Res = i1;.  }els
125e0 65 7b 0a 20 20 20 20 69 6e 74 20 72 65 73 20 3d  e{.    int res =
125f0 20 66 74 73 35 42 75 66 66 65 72 43 6f 6d 70 61   fts5BufferCompa
12600 72 65 28 26 70 31 2d 3e 74 65 72 6d 2c 20 26 70  re(&p1->term, &p
12610 32 2d 3e 74 65 72 6d 29 3b 0a 20 20 20 20 69 66  2->term);.    if
12620 28 20 72 65 73 3d 3d 30 20 29 7b 0a 20 20 20 20  ( res==0 ){.    
12630 20 20 61 73 73 65 72 74 28 20 69 32 3e 69 31 20    assert( i2>i1 
12640 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
12650 20 69 32 21 3d 30 20 29 3b 0a 20 20 20 20 20 20   i2!=0 );.      
12660 70 52 65 73 2d 3e 62 54 65 72 6d 45 71 20 3d 20  pRes->bTermEq = 
12670 31 3b 0a 20 20 20 20 20 20 69 66 28 20 70 31 2d  1;.      if( p1-
12680 3e 69 52 6f 77 69 64 3d 3d 70 32 2d 3e 69 52 6f  >iRowid==p2->iRo
12690 77 69 64 20 29 7b 0a 20 20 20 20 20 20 20 20 70  wid ){.        p
126a0 31 2d 3e 62 44 65 6c 20 3d 20 70 32 2d 3e 62 44  1->bDel = p2->bD
126b0 65 6c 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  el;.        retu
126c0 72 6e 20 69 32 3b 0a 20 20 20 20 20 20 7d 0a 20  rn i2;.      }. 
126d0 20 20 20 20 20 72 65 73 20 3d 20 28 28 70 31 2d       res = ((p1-
126e0 3e 69 52 6f 77 69 64 20 3e 20 70 32 2d 3e 69 52  >iRowid > p2->iR
126f0 6f 77 69 64 29 3d 3d 70 49 74 65 72 2d 3e 62 52  owid)==pIter->bR
12700 65 76 29 20 3f 20 2d 31 20 3a 20 2b 31 3b 0a 20  ev) ? -1 : +1;. 
12710 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28     }.    assert(
12720 20 72 65 73 21 3d 30 20 29 3b 0a 20 20 20 20 69   res!=0 );.    i
12730 66 28 20 72 65 73 3c 30 20 29 7b 0a 20 20 20 20  f( res<0 ){.    
12740 20 20 69 52 65 73 20 3d 20 69 31 3b 0a 20 20 20    iRes = i1;.   
12750 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 52   }else{.      iR
12760 65 73 20 3d 20 69 32 3b 0a 20 20 20 20 7d 0a 20  es = i2;.    }. 
12770 20 7d 0a 0a 20 20 70 52 65 73 2d 3e 69 46 69 72   }..  pRes->iFir
12780 73 74 20 3d 20 69 52 65 73 3b 0a 20 20 72 65 74  st = iRes;.  ret
12790 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
127a0 4d 6f 76 65 20 74 68 65 20 73 65 67 2d 69 74 65  Move the seg-ite
127b0 72 20 73 6f 20 74 68 61 74 20 69 74 20 70 6f 69  r so that it poi
127c0 6e 74 73 20 74 6f 20 74 68 65 20 66 69 72 73 74  nts to the first
127d0 20 72 6f 77 69 64 20 6f 6e 20 70 61 67 65 20 69   rowid on page i
127e0 4c 65 61 66 50 67 6e 6f 2e 0a 2a 2a 20 49 74 20  LeafPgno..** It 
127f0 69 73 20 61 6e 20 65 72 72 6f 72 20 69 66 20 6c  is an error if l
12800 65 61 66 20 69 4c 65 61 66 50 67 6e 6f 20 64 6f  eaf iLeafPgno do
12810 65 73 20 6e 6f 74 20 65 78 69 73 74 20 6f 72 20  es not exist or 
12820 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 72 6f 77 69  contains no rowi
12830 64 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ds..*/.static vo
12840 69 64 20 66 74 73 35 53 65 67 49 74 65 72 47 6f  id fts5SegIterGo
12850 74 6f 50 61 67 65 28 0a 20 20 46 74 73 35 49 6e  toPage(.  Fts5In
12860 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20 20  dex *p,         
12870 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53            /* FTS
12880 35 20 62 61 63 6b 65 6e 64 20 6f 62 6a 65 63 74  5 backend object
12890 20 2a 2f 0a 20 20 46 74 73 35 53 65 67 49 74 65   */.  Fts5SegIte
128a0 72 20 2a 70 49 74 65 72 2c 20 20 20 20 20 20 20  r *pIter,       
128b0 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74 6f        /* Iterato
128c0 72 20 74 6f 20 61 64 76 61 6e 63 65 20 2a 2f 0a  r to advance */.
128d0 20 20 69 6e 74 20 69 4c 65 61 66 50 67 6e 6f 0a    int iLeafPgno.
128e0 29 7b 0a 20 20 61 73 73 65 72 74 28 20 69 4c 65  ){.  assert( iLe
128f0 61 66 50 67 6e 6f 3e 70 49 74 65 72 2d 3e 69 4c  afPgno>pIter->iL
12900 65 61 66 50 67 6e 6f 20 29 3b 0a 0a 20 20 69 66  eafPgno );..  if
12910 28 20 69 4c 65 61 66 50 67 6e 6f 3e 70 49 74 65  ( iLeafPgno>pIte
12920 72 2d 3e 70 53 65 67 2d 3e 70 67 6e 6f 4c 61 73  r->pSeg->pgnoLas
12930 74 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d  t ){.    p->rc =
12940 20 46 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20   FTS5_CORRUPT;. 
12950 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66 74 73 35   }else{.    fts5
12960 44 61 74 61 52 65 6c 65 61 73 65 28 70 49 74 65  DataRelease(pIte
12970 72 2d 3e 70 4e 65 78 74 4c 65 61 66 29 3b 0a 20  r->pNextLeaf);. 
12980 20 20 20 70 49 74 65 72 2d 3e 70 4e 65 78 74 4c     pIter->pNextL
12990 65 61 66 20 3d 20 30 3b 0a 20 20 20 20 70 49 74  eaf = 0;.    pIt
129a0 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 20 3d 20  er->iLeafPgno = 
129b0 69 4c 65 61 66 50 67 6e 6f 2d 31 3b 0a 20 20 20  iLeafPgno-1;.   
129c0 20 66 74 73 35 53 65 67 49 74 65 72 4e 65 78 74   fts5SegIterNext
129d0 50 61 67 65 28 70 2c 20 70 49 74 65 72 29 3b 0a  Page(p, pIter);.
129e0 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72      assert( p->r
129f0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c!=SQLITE_OK || 
12a00 70 49 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f  pIter->iLeafPgno
12a10 3d 3d 69 4c 65 61 66 50 67 6e 6f 20 29 3b 0a 0a  ==iLeafPgno );..
12a20 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53      if( p->rc==S
12a30 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
12a40 20 20 69 6e 74 20 69 4f 66 66 3b 0a 20 20 20 20    int iOff;.    
12a50 20 20 75 38 20 2a 61 20 3d 20 70 49 74 65 72 2d    u8 *a = pIter-
12a60 3e 70 4c 65 61 66 2d 3e 70 3b 0a 20 20 20 20 20  >pLeaf->p;.     
12a70 20 69 6e 74 20 6e 20 3d 20 70 49 74 65 72 2d 3e   int n = pIter->
12a80 70 4c 65 61 66 2d 3e 73 7a 4c 65 61 66 3b 0a 0a  pLeaf->szLeaf;..
12a90 20 20 20 20 20 20 69 4f 66 66 20 3d 20 66 74 73        iOff = fts
12aa0 35 4c 65 61 66 46 69 72 73 74 52 6f 77 69 64 4f  5LeafFirstRowidO
12ab0 66 66 28 70 49 74 65 72 2d 3e 70 4c 65 61 66 29  ff(pIter->pLeaf)
12ac0 3b 0a 20 20 20 20 20 20 69 66 28 20 69 4f 66 66  ;.      if( iOff
12ad0 3c 34 20 7c 7c 20 69 4f 66 66 3e 3d 6e 20 29 7b  <4 || iOff>=n ){
12ae0 0a 20 20 20 20 20 20 20 20 70 2d 3e 72 63 20 3d  .        p->rc =
12af0 20 46 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20   FTS5_CORRUPT;. 
12b00 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
12b10 20 20 20 20 69 4f 66 66 20 2b 3d 20 66 74 73 35      iOff += fts5
12b20 47 65 74 56 61 72 69 6e 74 28 26 61 5b 69 4f 66  GetVarint(&a[iOf
12b30 66 5d 2c 20 28 75 36 34 2a 29 26 70 49 74 65 72  f], (u64*)&pIter
12b40 2d 3e 69 52 6f 77 69 64 29 3b 0a 20 20 20 20 20  ->iRowid);.     
12b50 20 20 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f     pIter->iLeafO
12b60 66 66 73 65 74 20 3d 20 69 4f 66 66 3b 0a 20 20  ffset = iOff;.  
12b70 20 20 20 20 20 20 66 74 73 35 53 65 67 49 74 65        fts5SegIte
12b80 72 4c 6f 61 64 4e 50 6f 73 28 70 2c 20 70 49 74  rLoadNPos(p, pIt
12b90 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  er);.      }.   
12ba0 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
12bb0 41 64 76 61 6e 63 65 20 74 68 65 20 69 74 65 72  Advance the iter
12bc0 61 74 6f 72 20 70 61 73 73 65 64 20 61 73 20 74  ator passed as t
12bd0 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
12be0 6e 74 20 75 6e 74 69 6c 20 69 74 20 69 73 20 61  nt until it is a
12bf0 74 20 6f 72 20 0a 2a 2a 20 70 61 73 74 20 72 6f  t or .** past ro
12c00 77 69 64 20 69 46 72 6f 6d 2e 20 52 65 67 61 72  wid iFrom. Regar
12c10 64 6c 65 73 73 20 6f 66 20 74 68 65 20 76 61 6c  dless of the val
12c20 75 65 20 6f 66 20 69 46 72 6f 6d 2c 20 74 68 65  ue of iFrom, the
12c30 20 69 74 65 72 61 74 6f 72 20 69 73 0a 2a 2a 20   iterator is.** 
12c40 61 6c 77 61 79 73 20 61 64 76 61 6e 63 65 64 20  always advanced 
12c50 61 74 20 6c 65 61 73 74 20 6f 6e 63 65 2e 0a 2a  at least once..*
12c60 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  /.static void ft
12c70 73 35 53 65 67 49 74 65 72 4e 65 78 74 46 72 6f  s5SegIterNextFro
12c80 6d 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a  m(.  Fts5Index *
12c90 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
12ca0 20 20 20 20 20 2f 2a 20 46 54 53 35 20 62 61 63       /* FTS5 bac
12cb0 6b 65 6e 64 20 6f 62 6a 65 63 74 20 2a 2f 0a 20  kend object */. 
12cc0 20 46 74 73 35 53 65 67 49 74 65 72 20 2a 70 49   Fts5SegIter *pI
12cd0 74 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 20  ter,            
12ce0 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 74 6f 20   /* Iterator to 
12cf0 61 64 76 61 6e 63 65 20 2a 2f 0a 20 20 69 36 34  advance */.  i64
12d00 20 69 4d 61 74 63 68 20 20 20 20 20 20 20 20 20   iMatch         
12d10 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
12d20 41 64 76 61 6e 63 65 20 69 74 65 72 61 74 6f 72  Advance iterator
12d30 20 61 74 20 6c 65 61 73 74 20 74 68 69 73 20 66   at least this f
12d40 61 72 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 62  ar */.){.  int b
12d50 52 65 76 20 3d 20 28 70 49 74 65 72 2d 3e 66 6c  Rev = (pIter->fl
12d60 61 67 73 20 26 20 46 54 53 35 5f 53 45 47 49 54  ags & FTS5_SEGIT
12d70 45 52 5f 52 45 56 45 52 53 45 29 3b 0a 20 20 46  ER_REVERSE);.  F
12d80 74 73 35 44 6c 69 64 78 49 74 65 72 20 2a 70 44  ts5DlidxIter *pD
12d90 6c 69 64 78 20 3d 20 70 49 74 65 72 2d 3e 70 44  lidx = pIter->pD
12da0 6c 69 64 78 3b 0a 20 20 69 6e 74 20 69 4c 65 61  lidx;.  int iLea
12db0 66 50 67 6e 6f 20 3d 20 70 49 74 65 72 2d 3e 69  fPgno = pIter->i
12dc0 4c 65 61 66 50 67 6e 6f 3b 0a 20 20 69 6e 74 20  LeafPgno;.  int 
12dd0 62 4d 6f 76 65 20 3d 20 31 3b 0a 0a 20 20 61 73  bMove = 1;..  as
12de0 73 65 72 74 28 20 70 49 74 65 72 2d 3e 66 6c 61  sert( pIter->fla
12df0 67 73 20 26 20 46 54 53 35 5f 53 45 47 49 54 45  gs & FTS5_SEGITE
12e00 52 5f 4f 4e 45 54 45 52 4d 20 29 3b 0a 20 20 61  R_ONETERM );.  a
12e10 73 73 65 72 74 28 20 70 49 74 65 72 2d 3e 70 44  ssert( pIter->pD
12e20 6c 69 64 78 20 29 3b 0a 20 20 61 73 73 65 72 74  lidx );.  assert
12e30 28 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 20 29  ( pIter->pLeaf )
12e40 3b 0a 0a 20 20 69 66 28 20 62 52 65 76 3d 3d 30  ;..  if( bRev==0
12e50 20 29 7b 0a 20 20 20 20 77 68 69 6c 65 28 20 21   ){.    while( !
12e60 66 74 73 35 44 6c 69 64 78 49 74 65 72 45 6f 66  fts5DlidxIterEof
12e70 28 70 2c 20 70 44 6c 69 64 78 29 20 26 26 20 69  (p, pDlidx) && i
12e80 4d 61 74 63 68 3e 66 74 73 35 44 6c 69 64 78 49  Match>fts5DlidxI
12e90 74 65 72 52 6f 77 69 64 28 70 44 6c 69 64 78 29  terRowid(pDlidx)
12ea0 20 29 7b 0a 20 20 20 20 20 20 69 4c 65 61 66 50   ){.      iLeafP
12eb0 67 6e 6f 20 3d 20 66 74 73 35 44 6c 69 64 78 49  gno = fts5DlidxI
12ec0 74 65 72 50 67 6e 6f 28 70 44 6c 69 64 78 29 3b  terPgno(pDlidx);
12ed0 0a 20 20 20 20 20 20 66 74 73 35 44 6c 69 64 78  .      fts5Dlidx
12ee0 49 74 65 72 4e 65 78 74 28 70 2c 20 70 44 6c 69  IterNext(p, pDli
12ef0 64 78 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61  dx);.    }.    a
12f00 73 73 65 72 74 5f 6e 63 28 20 69 4c 65 61 66 50  ssert_nc( iLeafP
12f10 67 6e 6f 3e 3d 70 49 74 65 72 2d 3e 69 4c 65 61  gno>=pIter->iLea
12f20 66 50 67 6e 6f 20 7c 7c 20 70 2d 3e 72 63 20 29  fPgno || p->rc )
12f30 3b 0a 20 20 20 20 69 66 28 20 69 4c 65 61 66 50  ;.    if( iLeafP
12f40 67 6e 6f 3e 70 49 74 65 72 2d 3e 69 4c 65 61 66  gno>pIter->iLeaf
12f50 50 67 6e 6f 20 29 7b 0a 20 20 20 20 20 20 66 74  Pgno ){.      ft
12f60 73 35 53 65 67 49 74 65 72 47 6f 74 6f 50 61 67  s5SegIterGotoPag
12f70 65 28 70 2c 20 70 49 74 65 72 2c 20 69 4c 65 61  e(p, pIter, iLea
12f80 66 50 67 6e 6f 29 3b 0a 20 20 20 20 20 20 62 4d  fPgno);.      bM
12f90 6f 76 65 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  ove = 0;.    }. 
12fa0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65   }else{.    asse
12fb0 72 74 28 20 70 49 74 65 72 2d 3e 70 4e 65 78 74  rt( pIter->pNext
12fc0 4c 65 61 66 3d 3d 30 20 29 3b 0a 20 20 20 20 61  Leaf==0 );.    a
12fd0 73 73 65 72 74 28 20 69 4d 61 74 63 68 3c 70 49  ssert( iMatch<pI
12fe0 74 65 72 2d 3e 69 52 6f 77 69 64 20 29 3b 0a 20  ter->iRowid );. 
12ff0 20 20 20 77 68 69 6c 65 28 20 21 66 74 73 35 44     while( !fts5D
13000 6c 69 64 78 49 74 65 72 45 6f 66 28 70 2c 20 70  lidxIterEof(p, p
13010 44 6c 69 64 78 29 20 26 26 20 69 4d 61 74 63 68  Dlidx) && iMatch
13020 3c 66 74 73 35 44 6c 69 64 78 49 74 65 72 52 6f  <fts5DlidxIterRo
13030 77 69 64 28 70 44 6c 69 64 78 29 20 29 7b 0a 20  wid(pDlidx) ){. 
13040 20 20 20 20 20 66 74 73 35 44 6c 69 64 78 49 74       fts5DlidxIt
13050 65 72 50 72 65 76 28 70 2c 20 70 44 6c 69 64 78  erPrev(p, pDlidx
13060 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 4c 65  );.    }.    iLe
13070 61 66 50 67 6e 6f 20 3d 20 66 74 73 35 44 6c 69  afPgno = fts5Dli
13080 64 78 49 74 65 72 50 67 6e 6f 28 70 44 6c 69 64  dxIterPgno(pDlid
13090 78 29 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28  x);..    assert(
130a0 20 66 74 73 35 44 6c 69 64 78 49 74 65 72 45 6f   fts5DlidxIterEo
130b0 66 28 70 2c 20 70 44 6c 69 64 78 29 20 7c 7c 20  f(p, pDlidx) || 
130c0 69 4c 65 61 66 50 67 6e 6f 3c 3d 70 49 74 65 72  iLeafPgno<=pIter
130d0 2d 3e 69 4c 65 61 66 50 67 6e 6f 20 29 3b 0a 0a  ->iLeafPgno );..
130e0 20 20 20 20 69 66 28 20 69 4c 65 61 66 50 67 6e      if( iLeafPgn
130f0 6f 3c 70 49 74 65 72 2d 3e 69 4c 65 61 66 50 67  o<pIter->iLeafPg
13100 6e 6f 20 29 7b 0a 20 20 20 20 20 20 70 49 74 65  no ){.      pIte
13110 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 20 3d 20 69  r->iLeafPgno = i
13120 4c 65 61 66 50 67 6e 6f 2b 31 3b 0a 20 20 20 20  LeafPgno+1;.    
13130 20 20 66 74 73 35 53 65 67 49 74 65 72 52 65 76    fts5SegIterRev
13140 65 72 73 65 4e 65 77 50 61 67 65 28 70 2c 20 70  erseNewPage(p, p
13150 49 74 65 72 29 3b 0a 20 20 20 20 20 20 62 4d 6f  Iter);.      bMo
13160 76 65 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  ve = 0;.    }.  
13170 7d 0a 0a 20 20 64 6f 7b 0a 20 20 20 20 69 66 28  }..  do{.    if(
13180 20 62 4d 6f 76 65 20 29 20 66 74 73 35 53 65 67   bMove ) fts5Seg
13190 49 74 65 72 4e 65 78 74 28 70 2c 20 70 49 74 65  IterNext(p, pIte
131a0 72 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 70  r, 0);.    if( p
131b0 49 74 65 72 2d 3e 70 4c 65 61 66 3d 3d 30 20 29  Iter->pLeaf==0 )
131c0 20 62 72 65 61 6b 3b 0a 20 20 20 20 69 66 28 20   break;.    if( 
131d0 62 52 65 76 3d 3d 30 20 26 26 20 70 49 74 65 72  bRev==0 && pIter
131e0 2d 3e 69 52 6f 77 69 64 3e 3d 69 4d 61 74 63 68  ->iRowid>=iMatch
131f0 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 69 66   ) break;.    if
13200 28 20 62 52 65 76 21 3d 30 20 26 26 20 70 49 74  ( bRev!=0 && pIt
13210 65 72 2d 3e 69 52 6f 77 69 64 3c 3d 69 4d 61 74  er->iRowid<=iMat
13220 63 68 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  ch ) break;.    
13230 62 4d 6f 76 65 20 3d 20 31 3b 0a 20 20 7d 77 68  bMove = 1;.  }wh
13240 69 6c 65 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49  ile( p->rc==SQLI
13250 54 45 5f 4f 4b 20 29 3b 0a 7d 0a 0a 0a 2f 2a 0a  TE_OK );.}.../*.
13260 2a 2a 20 46 72 65 65 20 74 68 65 20 69 74 65 72  ** Free the iter
13270 61 74 6f 72 20 6f 62 6a 65 63 74 20 70 61 73 73  ator object pass
13280 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64  ed as the second
13290 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74   argument..*/.st
132a0 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 4d 75  atic void fts5Mu
132b0 6c 74 69 49 74 65 72 46 72 65 65 28 46 74 73 35  ltiIterFree(Fts5
132c0 49 6e 64 65 78 20 2a 70 2c 20 46 74 73 35 49 6e  Index *p, Fts5In
132d0 64 65 78 49 74 65 72 20 2a 70 49 74 65 72 29 7b  dexIter *pIter){
132e0 0a 20 20 69 66 28 20 70 49 74 65 72 20 29 7b 0a  .  if( pIter ){.
132f0 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66      int i;.    f
13300 6f 72 28 69 3d 30 3b 20 69 3c 70 49 74 65 72 2d  or(i=0; i<pIter-
13310 3e 6e 53 65 67 3b 20 69 2b 2b 29 7b 0a 20 20 20  >nSeg; i++){.   
13320 20 20 20 66 74 73 35 53 65 67 49 74 65 72 43 6c     fts5SegIterCl
13330 65 61 72 28 26 70 49 74 65 72 2d 3e 61 53 65 67  ear(&pIter->aSeg
13340 5b 69 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  [i]);.    }.    
13350 66 74 73 35 53 74 72 75 63 74 75 72 65 52 65 6c  fts5StructureRel
13360 65 61 73 65 28 70 49 74 65 72 2d 3e 70 53 74 72  ease(pIter->pStr
13370 75 63 74 29 3b 0a 20 20 20 20 66 74 73 35 42 75  uct);.    fts5Bu
13380 66 66 65 72 46 72 65 65 28 26 70 49 74 65 72 2d  fferFree(&pIter-
13390 3e 70 6f 73 6c 69 73 74 29 3b 0a 20 20 20 20 73  >poslist);.    s
133a0 71 6c 69 74 65 33 5f 66 72 65 65 28 70 49 74 65  qlite3_free(pIte
133b0 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69  r);.  }.}..stati
133c0 63 20 76 6f 69 64 20 66 74 73 35 4d 75 6c 74 69  c void fts5Multi
133d0 49 74 65 72 41 64 76 61 6e 63 65 64 28 0a 20 20  IterAdvanced(.  
133e0 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 20 20  Fts5Index *p,   
133f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13400 2f 2a 20 46 54 53 35 20 62 61 63 6b 65 6e 64 20  /* FTS5 backend 
13410 74 6f 20 69 74 65 72 61 74 65 20 77 69 74 68 69  to iterate withi
13420 6e 20 2a 2f 0a 20 20 46 74 73 35 49 6e 64 65 78  n */.  Fts5Index
13430 49 74 65 72 20 2a 70 49 74 65 72 2c 20 20 20 20  Iter *pIter,    
13440 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74         /* Iterat
13450 6f 72 20 74 6f 20 75 70 64 61 74 65 20 61 46 69  or to update aFi
13460 72 73 74 5b 5d 20 61 72 72 61 79 20 66 6f 72 20  rst[] array for 
13470 2a 2f 0a 20 20 69 6e 74 20 69 43 68 61 6e 67 65  */.  int iChange
13480 64 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d,              
13490 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66       /* Index of
134a0 20 73 75 62 2d 69 74 65 72 61 74 6f 72 20 6a 75   sub-iterator ju
134b0 73 74 20 61 64 76 61 6e 63 65 64 20 2a 2f 0a 20  st advanced */. 
134c0 20 69 6e 74 20 69 4d 69 6e 73 65 74 20 20 20 20   int iMinset    
134d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
134e0 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 65 6e 74 72   /* Minimum entr
134f0 79 20 69 6e 20 61 46 69 72 73 74 5b 5d 20 74 6f  y in aFirst[] to
13500 20 73 65 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74   set */.){.  int
13510 20 69 3b 0a 20 20 66 6f 72 28 69 3d 28 70 49 74   i;.  for(i=(pIt
13520 65 72 2d 3e 6e 53 65 67 2b 69 43 68 61 6e 67 65  er->nSeg+iChange
13530 64 29 2f 32 3b 20 69 3e 3d 69 4d 69 6e 73 65 74  d)/2; i>=iMinset
13540 20 26 26 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54   && p->rc==SQLIT
13550 45 5f 4f 4b 3b 20 69 3d 69 2f 32 29 7b 0a 20 20  E_OK; i=i/2){.  
13560 20 20 69 6e 74 20 69 45 71 3b 0a 20 20 20 20 69    int iEq;.    i
13570 66 28 20 28 69 45 71 20 3d 20 66 74 73 35 4d 75  f( (iEq = fts5Mu
13580 6c 74 69 49 74 65 72 44 6f 43 6f 6d 70 61 72 65  ltiIterDoCompare
13590 28 70 49 74 65 72 2c 20 69 29 29 20 29 7b 0a 20  (pIter, i)) ){. 
135a0 20 20 20 20 20 66 74 73 35 53 65 67 49 74 65 72       fts5SegIter
135b0 4e 65 78 74 28 70 2c 20 26 70 49 74 65 72 2d 3e  Next(p, &pIter->
135c0 61 53 65 67 5b 69 45 71 5d 2c 20 30 29 3b 0a 20  aSeg[iEq], 0);. 
135d0 20 20 20 20 20 69 20 3d 20 70 49 74 65 72 2d 3e       i = pIter->
135e0 6e 53 65 67 20 2b 20 69 45 71 3b 0a 20 20 20 20  nSeg + iEq;.    
135f0 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  }.  }.}../*.** S
13600 75 62 2d 69 74 65 72 61 74 6f 72 20 69 43 68 61  ub-iterator iCha
13610 6e 67 65 64 20 6f 66 20 69 74 65 72 61 74 6f 72  nged of iterator
13620 20 70 49 74 65 72 20 68 61 73 20 6a 75 73 74 20   pIter has just 
13630 62 65 65 6e 20 61 64 76 61 6e 63 65 64 2e 20 49  been advanced. I
13640 74 20 73 74 69 6c 6c 0a 2a 2a 20 70 6f 69 6e 74  t still.** point
13650 73 20 74 6f 20 74 68 65 20 73 61 6d 65 20 74 65  s to the same te
13660 72 6d 20 74 68 6f 75 67 68 20 2d 20 6a 75 73 74  rm though - just
13670 20 61 20 64 69 66 66 65 72 65 6e 74 20 72 6f 77   a different row
13680 69 64 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f  id. This functio
13690 6e 0a 2a 2a 20 61 74 74 65 6d 70 74 73 20 74 6f  n.** attempts to
136a0 20 75 70 64 61 74 65 20 74 68 65 20 63 6f 6e 74   update the cont
136b0 65 6e 74 73 20 6f 66 20 74 68 65 20 70 49 74 65  ents of the pIte
136c0 72 2d 3e 61 46 69 72 73 74 5b 5d 20 61 63 63 6f  r->aFirst[] acco
136d0 72 64 69 6e 67 6c 79 2e 0a 2a 2a 20 49 66 20 69  rdingly..** If i
136e0 74 20 64 6f 65 73 20 73 6f 20 73 75 63 63 65 73  t does so succes
136f0 73 66 75 6c 6c 79 2c 20 30 20 69 73 20 72 65 74  sfully, 0 is ret
13700 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65  urned. Otherwise
13710 20 31 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 6e   1..**.** If non
13720 2d 7a 65 72 6f 20 69 73 20 72 65 74 75 72 6e 65  -zero is returne
13730 64 2c 20 74 68 65 20 63 61 6c 6c 65 72 20 73 68  d, the caller sh
13740 6f 75 6c 64 20 63 61 6c 6c 20 66 74 73 35 4d 75  ould call fts5Mu
13750 6c 74 69 49 74 65 72 41 64 76 61 6e 63 65 64 28  ltiIterAdvanced(
13760 29 0a 2a 2a 20 6f 6e 20 74 68 65 20 69 74 65 72  ).** on the iter
13770 61 74 6f 72 20 69 6e 73 74 65 61 64 2e 20 54 68  ator instead. Th
13780 61 74 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65 73  at function does
13790 20 74 68 65 20 73 61 6d 65 20 61 73 20 74 68 69   the same as thi
137a0 73 20 6f 6e 65 2c 20 65 78 63 65 70 74 0a 2a 2a  s one, except.**
137b0 20 74 68 61 74 20 69 74 20 64 65 61 6c 73 20 77   that it deals w
137c0 69 74 68 20 6d 6f 72 65 20 63 6f 6d 70 6c 69 63  ith more complic
137d0 61 74 65 64 20 63 61 73 65 73 20 61 73 20 77 65  ated cases as we
137e0 6c 6c 2e 0a 2a 2f 20 0a 73 74 61 74 69 63 20 69  ll..*/ .static i
137f0 6e 74 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72  nt fts5MultiIter
13800 41 64 76 61 6e 63 65 52 6f 77 69 64 28 0a 20 20  AdvanceRowid(.  
13810 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 20 20  Fts5Index *p,   
13820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13830 2f 2a 20 46 54 53 35 20 62 61 63 6b 65 6e 64 20  /* FTS5 backend 
13840 74 6f 20 69 74 65 72 61 74 65 20 77 69 74 68 69  to iterate withi
13850 6e 20 2a 2f 0a 20 20 46 74 73 35 49 6e 64 65 78  n */.  Fts5Index
13860 49 74 65 72 20 2a 70 49 74 65 72 2c 20 20 20 20  Iter *pIter,    
13870 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74         /* Iterat
13880 6f 72 20 74 6f 20 75 70 64 61 74 65 20 61 46 69  or to update aFi
13890 72 73 74 5b 5d 20 61 72 72 61 79 20 66 6f 72 20  rst[] array for 
138a0 2a 2f 0a 20 20 69 6e 74 20 69 43 68 61 6e 67 65  */.  int iChange
138b0 64 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d               
138c0 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66       /* Index of
138d0 20 73 75 62 2d 69 74 65 72 61 74 6f 72 20 6a 75   sub-iterator ju
138e0 73 74 20 61 64 76 61 6e 63 65 64 20 2a 2f 0a 29  st advanced */.)
138f0 7b 0a 20 20 46 74 73 35 53 65 67 49 74 65 72 20  {.  Fts5SegIter 
13900 2a 70 4e 65 77 20 3d 20 26 70 49 74 65 72 2d 3e  *pNew = &pIter->
13910 61 53 65 67 5b 69 43 68 61 6e 67 65 64 5d 3b 0a  aSeg[iChanged];.
13920 0a 20 20 69 66 28 20 70 4e 65 77 2d 3e 69 52 6f  .  if( pNew->iRo
13930 77 69 64 3d 3d 70 49 74 65 72 2d 3e 69 53 77 69  wid==pIter->iSwi
13940 74 63 68 52 6f 77 69 64 0a 20 20 20 7c 7c 20 28  tchRowid.   || (
13950 70 4e 65 77 2d 3e 69 52 6f 77 69 64 3c 70 49 74  pNew->iRowid<pIt
13960 65 72 2d 3e 69 53 77 69 74 63 68 52 6f 77 69 64  er->iSwitchRowid
13970 29 3d 3d 70 49 74 65 72 2d 3e 62 52 65 76 0a 20  )==pIter->bRev. 
13980 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20   ){.    int i;. 
13990 20 20 20 46 74 73 35 53 65 67 49 74 65 72 20 2a     Fts5SegIter *
139a0 70 4f 74 68 65 72 20 3d 20 26 70 49 74 65 72 2d  pOther = &pIter-
139b0 3e 61 53 65 67 5b 69 43 68 61 6e 67 65 64 20 5e  >aSeg[iChanged ^
139c0 20 30 78 30 30 30 31 5d 3b 0a 20 20 20 20 70 49   0x0001];.    pI
139d0 74 65 72 2d 3e 69 53 77 69 74 63 68 52 6f 77 69  ter->iSwitchRowi
139e0 64 20 3d 20 70 49 74 65 72 2d 3e 62 52 65 76 20  d = pIter->bRev 
139f0 3f 20 53 4d 41 4c 4c 45 53 54 5f 49 4e 54 36 34  ? SMALLEST_INT64
13a00 20 3a 20 4c 41 52 47 45 53 54 5f 49 4e 54 36 34   : LARGEST_INT64
13a10 3b 0a 20 20 20 20 66 6f 72 28 69 3d 28 70 49 74  ;.    for(i=(pIt
13a20 65 72 2d 3e 6e 53 65 67 2b 69 43 68 61 6e 67 65  er->nSeg+iChange
13a30 64 29 2f 32 3b 20 31 3b 20 69 3d 69 2f 32 29 7b  d)/2; 1; i=i/2){
13a40 0a 20 20 20 20 20 20 46 74 73 35 43 52 65 73 75  .      Fts5CResu
13a50 6c 74 20 2a 70 52 65 73 20 3d 20 26 70 49 74 65  lt *pRes = &pIte
13a60 72 2d 3e 61 46 69 72 73 74 5b 69 5d 3b 0a 0a 20  r->aFirst[i];.. 
13a70 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4e 65       assert( pNe
13a80 77 2d 3e 70 4c 65 61 66 20 29 3b 0a 20 20 20 20  w->pLeaf );.    
13a90 20 20 61 73 73 65 72 74 28 20 70 52 65 73 2d 3e    assert( pRes->
13aa0 62 54 65 72 6d 45 71 3d 3d 30 20 7c 7c 20 70 4f  bTermEq==0 || pO
13ab0 74 68 65 72 2d 3e 70 4c 65 61 66 20 29 3b 0a 0a  ther->pLeaf );..
13ac0 20 20 20 20 20 20 69 66 28 20 70 52 65 73 2d 3e        if( pRes->
13ad0 62 54 65 72 6d 45 71 20 29 7b 0a 20 20 20 20 20  bTermEq ){.     
13ae0 20 20 20 69 66 28 20 70 4e 65 77 2d 3e 69 52 6f     if( pNew->iRo
13af0 77 69 64 3d 3d 70 4f 74 68 65 72 2d 3e 69 52 6f  wid==pOther->iRo
13b00 77 69 64 20 29 7b 0a 20 20 20 20 20 20 20 20 20  wid ){.         
13b10 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20   return 1;.     
13b20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28 70 4f     }else if( (pO
13b30 74 68 65 72 2d 3e 69 52 6f 77 69 64 3e 70 4e 65  ther->iRowid>pNe
13b40 77 2d 3e 69 52 6f 77 69 64 29 3d 3d 70 49 74 65  w->iRowid)==pIte
13b50 72 2d 3e 62 52 65 76 20 29 7b 0a 20 20 20 20 20  r->bRev ){.     
13b60 20 20 20 20 20 70 49 74 65 72 2d 3e 69 53 77 69       pIter->iSwi
13b70 74 63 68 52 6f 77 69 64 20 3d 20 70 4f 74 68 65  tchRowid = pOthe
13b80 72 2d 3e 69 52 6f 77 69 64 3b 0a 20 20 20 20 20  r->iRowid;.     
13b90 20 20 20 20 20 70 4e 65 77 20 3d 20 70 4f 74 68       pNew = pOth
13ba0 65 72 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  er;.        }els
13bb0 65 20 69 66 28 20 28 70 4f 74 68 65 72 2d 3e 69  e if( (pOther->i
13bc0 52 6f 77 69 64 3e 70 49 74 65 72 2d 3e 69 53 77  Rowid>pIter->iSw
13bd0 69 74 63 68 52 6f 77 69 64 29 3d 3d 70 49 74 65  itchRowid)==pIte
13be0 72 2d 3e 62 52 65 76 20 29 7b 0a 20 20 20 20 20  r->bRev ){.     
13bf0 20 20 20 20 20 70 49 74 65 72 2d 3e 69 53 77 69       pIter->iSwi
13c00 74 63 68 52 6f 77 69 64 20 3d 20 70 4f 74 68 65  tchRowid = pOthe
13c10 72 2d 3e 69 52 6f 77 69 64 3b 0a 20 20 20 20 20  r->iRowid;.     
13c20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
13c30 20 20 20 70 52 65 73 2d 3e 69 46 69 72 73 74 20     pRes->iFirst 
13c40 3d 20 28 70 4e 65 77 20 2d 20 70 49 74 65 72 2d  = (pNew - pIter-
13c50 3e 61 53 65 67 29 3b 0a 20 20 20 20 20 20 69 66  >aSeg);.      if
13c60 28 20 69 3d 3d 31 20 29 20 62 72 65 61 6b 3b 0a  ( i==1 ) break;.
13c70 0a 20 20 20 20 20 20 70 4f 74 68 65 72 20 3d 20  .      pOther = 
13c80 26 70 49 74 65 72 2d 3e 61 53 65 67 5b 20 70 49  &pIter->aSeg[ pI
13c90 74 65 72 2d 3e 61 46 69 72 73 74 5b 69 20 5e 20  ter->aFirst[i ^ 
13ca0 30 78 30 30 30 31 5d 2e 69 46 69 72 73 74 20 5d  0x0001].iFirst ]
13cb0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72  ;.    }.  }..  r
13cc0 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
13cd0 2a 20 53 65 74 20 74 68 65 20 70 49 74 65 72 2d  * Set the pIter-
13ce0 3e 62 45 6f 66 20 76 61 72 69 61 62 6c 65 20 62  >bEof variable b
13cf0 61 73 65 64 20 6f 6e 20 74 68 65 20 73 74 61 74  ased on the stat
13d00 65 20 6f 66 20 74 68 65 20 73 75 62 2d 69 74 65  e of the sub-ite
13d10 72 61 74 6f 72 73 2e 0a 2a 2f 0a 73 74 61 74 69  rators..*/.stati
13d20 63 20 76 6f 69 64 20 66 74 73 35 4d 75 6c 74 69  c void fts5Multi
13d30 49 74 65 72 53 65 74 45 6f 66 28 46 74 73 35 49  IterSetEof(Fts5I
13d40 6e 64 65 78 49 74 65 72 20 2a 70 49 74 65 72 29  ndexIter *pIter)
13d50 7b 0a 20 20 46 74 73 35 53 65 67 49 74 65 72 20  {.  Fts5SegIter 
13d60 2a 70 53 65 67 20 3d 20 26 70 49 74 65 72 2d 3e  *pSeg = &pIter->
13d70 61 53 65 67 5b 20 70 49 74 65 72 2d 3e 61 46 69  aSeg[ pIter->aFi
13d80 72 73 74 5b 31 5d 2e 69 46 69 72 73 74 20 5d 3b  rst[1].iFirst ];
13d90 0a 20 20 70 49 74 65 72 2d 3e 62 45 6f 66 20 3d  .  pIter->bEof =
13da0 20 70 53 65 67 2d 3e 70 4c 65 61 66 3d 3d 30 3b   pSeg->pLeaf==0;
13db0 0a 20 20 70 49 74 65 72 2d 3e 69 53 77 69 74 63  .  pIter->iSwitc
13dc0 68 52 6f 77 69 64 20 3d 20 70 53 65 67 2d 3e 69  hRowid = pSeg->i
13dd0 52 6f 77 69 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Rowid;.}../*.** 
13de0 4d 6f 76 65 20 74 68 65 20 69 74 65 72 61 74 6f  Move the iterato
13df0 72 20 74 6f 20 74 68 65 20 6e 65 78 74 20 65 6e  r to the next en
13e00 74 72 79 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 61  try. .**.** If a
13e10 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  n error occurs, 
13e20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  an error code is
13e30 20 6c 65 66 74 20 69 6e 20 46 74 73 35 49 6e 64   left in Fts5Ind
13e40 65 78 2e 72 63 2e 20 49 74 20 69 73 20 6e 6f 74  ex.rc. It is not
13e50 20 0a 2a 2a 20 63 6f 6e 73 69 64 65 72 65 64 20   .** considered 
13e60 61 6e 20 65 72 72 6f 72 20 69 66 20 74 68 65 20  an error if the 
13e70 69 74 65 72 61 74 6f 72 20 72 65 61 63 68 65 73  iterator reaches
13e80 20 45 4f 46 2c 20 6f 72 20 69 66 20 69 74 20 69   EOF, or if it i
13e90 73 20 61 6c 72 65 61 64 79 20 61 74 20 0a 2a 2a  s already at .**
13ea0 20 45 4f 46 20 77 68 65 6e 20 74 68 69 73 20 66   EOF when this f
13eb0 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
13ec0 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  d..*/.static voi
13ed0 64 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 4e  d fts5MultiIterN
13ee0 65 78 74 28 0a 20 20 46 74 73 35 49 6e 64 65 78  ext(.  Fts5Index
13ef0 20 2a 70 2c 20 0a 20 20 46 74 73 35 49 6e 64 65   *p, .  Fts5Inde
13f00 78 49 74 65 72 20 2a 70 49 74 65 72 2c 0a 20 20  xIter *pIter,.  
13f10 69 6e 74 20 62 46 72 6f 6d 2c 20 20 20 20 20 20  int bFrom,      
13f20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13f30 2f 2a 20 54 72 75 65 20 69 66 20 61 72 67 75 6d  /* True if argum
13f40 65 6e 74 20 69 46 72 6f 6d 20 69 73 20 76 61 6c  ent iFrom is val
13f50 69 64 20 2a 2f 0a 20 20 69 36 34 20 69 46 72 6f  id */.  i64 iFro
13f60 6d 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m               
13f70 20 20 20 20 20 20 20 20 2f 2a 20 41 64 76 61 6e          /* Advan
13f80 63 65 20 61 74 20 6c 65 61 73 74 20 61 73 20 66  ce at least as f
13f90 61 72 20 61 73 20 74 68 69 73 20 2a 2f 0a 29 7b  ar as this */.){
13fa0 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51  .  if( p->rc==SQ
13fb0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69  LITE_OK ){.    i
13fc0 6e 74 20 62 55 73 65 46 72 6f 6d 20 3d 20 62 46  nt bUseFrom = bF
13fd0 72 6f 6d 3b 0a 20 20 20 20 64 6f 20 7b 0a 20 20  rom;.    do {.  
13fe0 20 20 20 20 69 6e 74 20 69 46 69 72 73 74 20 3d      int iFirst =
13ff0 20 70 49 74 65 72 2d 3e 61 46 69 72 73 74 5b 31   pIter->aFirst[1
14000 5d 2e 69 46 69 72 73 74 3b 0a 20 20 20 20 20 20  ].iFirst;.      
14010 69 6e 74 20 62 4e 65 77 54 65 72 6d 20 3d 20 30  int bNewTerm = 0
14020 3b 0a 20 20 20 20 20 20 46 74 73 35 53 65 67 49  ;.      Fts5SegI
14030 74 65 72 20 2a 70 53 65 67 20 3d 20 26 70 49 74  ter *pSeg = &pIt
14040 65 72 2d 3e 61 53 65 67 5b 69 46 69 72 73 74 5d  er->aSeg[iFirst]
14050 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
14060 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
14070 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 62 55   );.      if( bU
14080 73 65 46 72 6f 6d 20 26 26 20 70 53 65 67 2d 3e  seFrom && pSeg->
14090 70 44 6c 69 64 78 20 29 7b 0a 20 20 20 20 20 20  pDlidx ){.      
140a0 20 20 66 74 73 35 53 65 67 49 74 65 72 4e 65 78    fts5SegIterNex
140b0 74 46 72 6f 6d 28 70 2c 20 70 53 65 67 2c 20 69  tFrom(p, pSeg, i
140c0 46 72 6f 6d 29 3b 0a 20 20 20 20 20 20 7d 65 6c  From);.      }el
140d0 73 65 7b 0a 20 20 20 20 20 20 20 20 66 74 73 35  se{.        fts5
140e0 53 65 67 49 74 65 72 4e 65 78 74 28 70 2c 20 70  SegIterNext(p, p
140f0 53 65 67 2c 20 26 62 4e 65 77 54 65 72 6d 29 3b  Seg, &bNewTerm);
14100 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
14110 69 66 28 20 70 53 65 67 2d 3e 70 4c 65 61 66 3d  if( pSeg->pLeaf=
14120 3d 30 20 7c 7c 20 62 4e 65 77 54 65 72 6d 20 0a  =0 || bNewTerm .
14130 20 20 20 20 20 20 20 7c 7c 20 66 74 73 35 4d 75         || fts5Mu
14140 6c 74 69 49 74 65 72 41 64 76 61 6e 63 65 52 6f  ltiIterAdvanceRo
14150 77 69 64 28 70 2c 20 70 49 74 65 72 2c 20 69 46  wid(p, pIter, iF
14160 69 72 73 74 29 0a 20 20 20 20 20 20 29 7b 0a 20  irst).      ){. 
14170 20 20 20 20 20 20 20 66 74 73 35 4d 75 6c 74 69         fts5Multi
14180 49 74 65 72 41 64 76 61 6e 63 65 64 28 70 2c 20  IterAdvanced(p, 
14190 70 49 74 65 72 2c 20 69 46 69 72 73 74 2c 20 31  pIter, iFirst, 1
141a0 29 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35 4d  );.        fts5M
141b0 75 6c 74 69 49 74 65 72 53 65 74 45 6f 66 28 70  ultiIterSetEof(p
141c0 49 74 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Iter);.      }. 
141d0 20 20 20 20 20 66 74 73 35 41 73 73 65 72 74 4d       fts5AssertM
141e0 75 6c 74 69 49 74 65 72 53 65 74 75 70 28 70 2c  ultiIterSetup(p,
141f0 20 70 49 74 65 72 29 3b 0a 0a 20 20 20 20 20 20   pIter);..      
14200 62 55 73 65 46 72 6f 6d 20 3d 20 30 3b 0a 20 20  bUseFrom = 0;.  
14210 20 20 7d 77 68 69 6c 65 28 20 70 49 74 65 72 2d    }while( pIter-
14220 3e 62 53 6b 69 70 45 6d 70 74 79 20 26 26 20 66  >bSkipEmpty && f
14230 74 73 35 4d 75 6c 74 69 49 74 65 72 49 73 45 6d  ts5MultiIterIsEm
14240 70 74 79 28 70 2c 20 70 49 74 65 72 29 20 29 3b  pty(p, pIter) );
14250 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 46  .  }.}..static F
14260 74 73 35 49 6e 64 65 78 49 74 65 72 20 2a 66 74  ts5IndexIter *ft
14270 73 35 4d 75 6c 74 69 49 74 65 72 41 6c 6c 6f 63  s5MultiIterAlloc
14280 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70  (.  Fts5Index *p
14290 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
142a0 20 20 20 20 2f 2a 20 46 54 53 35 20 62 61 63 6b      /* FTS5 back
142b0 65 6e 64 20 74 6f 20 69 74 65 72 61 74 65 20 77  end to iterate w
142c0 69 74 68 69 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e  ithin */.  int n
142d0 53 65 67 0a 29 7b 0a 20 20 46 74 73 35 49 6e 64  Seg.){.  Fts5Ind
142e0 65 78 49 74 65 72 20 2a 70 4e 65 77 3b 0a 20 20  exIter *pNew;.  
142f0 69 6e 74 20 6e 53 6c 6f 74 3b 20 20 20 20 20 20  int nSlot;      
14300 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14310 2f 2a 20 50 6f 77 65 72 20 6f 66 20 74 77 6f 20  /* Power of two 
14320 3e 3d 20 6e 53 65 67 20 2a 2f 0a 0a 20 20 66 6f  >= nSeg */..  fo
14330 72 28 6e 53 6c 6f 74 3d 32 3b 20 6e 53 6c 6f 74  r(nSlot=2; nSlot
14340 3c 6e 53 65 67 3b 20 6e 53 6c 6f 74 3d 6e 53 6c  <nSeg; nSlot=nSl
14350 6f 74 2a 32 29 3b 0a 20 20 70 4e 65 77 20 3d 20  ot*2);.  pNew = 
14360 66 74 73 35 49 64 78 4d 61 6c 6c 6f 63 28 70 2c  fts5IdxMalloc(p,
14370 20 0a 20 20 20 20 20 20 73 69 7a 65 6f 66 28 46   .      sizeof(F
14380 74 73 35 49 6e 64 65 78 49 74 65 72 29 20 2b 20  ts5IndexIter) + 
14390 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 70              /* p
143a0 4e 65 77 20 2a 2f 0a 20 20 20 20 20 20 73 69 7a  New */.      siz
143b0 65 6f 66 28 46 74 73 35 53 65 67 49 74 65 72 29  eof(Fts5SegIter)
143c0 20 2a 20 28 6e 53 6c 6f 74 2d 31 29 20 2b 20 20   * (nSlot-1) +  
143d0 20 2f 2a 20 70 4e 65 77 2d 3e 61 53 65 67 5b 5d   /* pNew->aSeg[]
143e0 20 2a 2f 0a 20 20 20 20 20 20 73 69 7a 65 6f 66   */.      sizeof
143f0 28 46 74 73 35 43 52 65 73 75 6c 74 29 20 2a 20  (Fts5CResult) * 
14400 6e 53 6c 6f 74 20 20 20 20 20 20 20 20 20 2f 2a  nSlot         /*
14410 20 70 4e 65 77 2d 3e 61 46 69 72 73 74 5b 5d 20   pNew->aFirst[] 
14420 2a 2f 0a 20 20 29 3b 0a 20 20 69 66 28 20 70 4e  */.  );.  if( pN
14430 65 77 20 29 7b 0a 20 20 20 20 70 4e 65 77 2d 3e  ew ){.    pNew->
14440 6e 53 65 67 20 3d 20 6e 53 6c 6f 74 3b 0a 20 20  nSeg = nSlot;.  
14450 20 20 70 4e 65 77 2d 3e 61 46 69 72 73 74 20 3d    pNew->aFirst =
14460 20 28 46 74 73 35 43 52 65 73 75 6c 74 2a 29 26   (Fts5CResult*)&
14470 70 4e 65 77 2d 3e 61 53 65 67 5b 6e 53 6c 6f 74  pNew->aSeg[nSlot
14480 5d 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 70 49 6e  ];.    pNew->pIn
14490 64 65 78 20 3d 20 70 3b 0a 20 20 7d 0a 20 20 72  dex = p;.  }.  r
144a0 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f  eturn pNew;.}../
144b0 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20  *.** Allocate a 
144c0 6e 65 77 20 46 74 73 35 49 6e 64 65 78 49 74 65  new Fts5IndexIte
144d0 72 20 6f 62 6a 65 63 74 2e 0a 2a 2a 0a 2a 2a 20  r object..**.** 
144e0 54 68 65 20 6e 65 77 20 6f 62 6a 65 63 74 20 77  The new object w
144f0 69 6c 6c 20 62 65 20 75 73 65 64 20 74 6f 20 69  ill be used to i
14500 74 65 72 61 74 65 20 74 68 72 6f 75 67 68 20 64  terate through d
14510 61 74 61 20 69 6e 20 73 74 72 75 63 74 75 72 65  ata in structure
14520 20 70 53 74 72 75 63 74 2e 0a 2a 2a 20 49 66 20   pStruct..** If 
14530 69 4c 65 76 65 6c 20 69 73 20 2d 76 65 2c 20 74  iLevel is -ve, t
14540 68 65 6e 20 61 6c 6c 20 64 61 74 61 20 69 6e 20  hen all data in 
14550 61 6c 6c 20 73 65 67 6d 65 6e 74 73 20 69 73 20  all segments is 
14560 6d 65 72 67 65 64 2e 20 4f 72 2c 20 69 66 20 69  merged. Or, if i
14570 4c 65 76 65 6c 0a 2a 2a 20 69 73 20 7a 65 72 6f  Level.** is zero
14580 20 6f 72 20 67 72 65 61 74 65 72 2c 20 64 61 74   or greater, dat
14590 61 20 66 72 6f 6d 20 74 68 65 20 66 69 72 73 74  a from the first
145a0 20 6e 53 65 67 6d 65 6e 74 20 73 65 67 6d 65 6e   nSegment segmen
145b0 74 73 20 6f 6e 20 6c 65 76 65 6c 20 69 4c 65 76  ts on level iLev
145c0 65 6c 0a 2a 2a 20 69 73 20 6d 65 72 67 65 64 2e  el.** is merged.
145d0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 74 65 72 61  .**.** The itera
145e0 74 6f 72 20 69 6e 69 74 69 61 6c 6c 79 20 70 6f  tor initially po
145f0 69 6e 74 73 20 74 6f 20 74 68 65 20 66 69 72 73  ints to the firs
14600 74 20 74 65 72 6d 2f 72 6f 77 69 64 20 65 6e 74  t term/rowid ent
14610 72 79 20 69 6e 20 74 68 65 20 0a 2a 2a 20 69 74  ry in the .** it
14620 65 72 61 74 65 64 20 64 61 74 61 2e 0a 2a 2f 0a  erated data..*/.
14630 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
14640 4d 75 6c 74 69 49 74 65 72 4e 65 77 28 0a 20 20  MultiIterNew(.  
14650 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 20 20  Fts5Index *p,   
14660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14670 2f 2a 20 46 54 53 35 20 62 61 63 6b 65 6e 64 20  /* FTS5 backend 
14680 74 6f 20 69 74 65 72 61 74 65 20 77 69 74 68 69  to iterate withi
14690 6e 20 2a 2f 0a 20 20 46 74 73 35 53 74 72 75 63  n */.  Fts5Struc
146a0 74 75 72 65 20 2a 70 53 74 72 75 63 74 2c 20 20  ture *pStruct,  
146b0 20 20 20 20 20 20 20 2f 2a 20 53 74 72 75 63 74         /* Struct
146c0 75 72 65 20 6f 66 20 73 70 65 63 69 66 69 63 20  ure of specific 
146d0 69 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20 62  index */.  int b
146e0 53 6b 69 70 45 6d 70 74 79 2c 20 20 20 20 20 20  SkipEmpty,      
146f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
14700 75 65 20 74 6f 20 69 67 6e 6f 72 65 20 64 65 6c  ue to ignore del
14710 65 74 65 2d 6b 65 79 73 20 2a 2f 0a 20 20 69 6e  ete-keys */.  in
14720 74 20 66 6c 61 67 73 2c 20 20 20 20 20 20 20 20  t flags,        
14730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
14740 20 46 54 53 35 49 4e 44 45 58 5f 51 55 45 52 59   FTS5INDEX_QUERY
14750 5f 58 58 58 20 66 6c 61 67 73 20 2a 2f 0a 20 20  _XXX flags */.  
14760 63 6f 6e 73 74 20 75 38 20 2a 70 54 65 72 6d 2c  const u8 *pTerm,
14770 20 69 6e 74 20 6e 54 65 72 6d 2c 20 20 20 20 20   int nTerm,     
14780 2f 2a 20 54 65 72 6d 20 74 6f 20 73 65 65 6b 20  /* Term to seek 
14790 74 6f 20 28 6f 72 20 4e 55 4c 4c 2f 30 29 20 2a  to (or NULL/0) *
147a0 2f 0a 20 20 69 6e 74 20 69 4c 65 76 65 6c 2c 20  /.  int iLevel, 
147b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
147c0 20 20 20 20 2f 2a 20 4c 65 76 65 6c 20 74 6f 20      /* Level to 
147d0 69 74 65 72 61 74 65 20 28 2d 31 20 66 6f 72 20  iterate (-1 for 
147e0 61 6c 6c 29 20 2a 2f 0a 20 20 69 6e 74 20 6e 53  all) */.  int nS
147f0 65 67 6d 65 6e 74 2c 20 20 20 20 20 20 20 20 20  egment,         
14800 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
14810 62 65 72 20 6f 66 20 73 65 67 6d 65 6e 74 73 20  ber of segments 
14820 74 6f 20 6d 65 72 67 65 20 28 69 4c 65 76 65 6c  to merge (iLevel
14830 3e 3d 30 29 20 2a 2f 0a 20 20 46 74 73 35 49 6e  >=0) */.  Fts5In
14840 64 65 78 49 74 65 72 20 2a 2a 70 70 4f 75 74 20  dexIter **ppOut 
14850 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 77            /* New
14860 20 6f 62 6a 65 63 74 20 2a 2f 0a 29 7b 0a 20 20   object */.){.  
14870 69 6e 74 20 6e 53 65 67 20 3d 20 30 3b 20 20 20  int nSeg = 0;   
14880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14890 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 73 65 67  /* Number of seg
148a0 6d 65 6e 74 2d 69 74 65 72 73 20 69 6e 20 75 73  ment-iters in us
148b0 65 20 2a 2f 0a 20 20 69 6e 74 20 69 49 74 65 72  e */.  int iIter
148c0 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
148d0 20 20 20 20 20 20 20 2f 2a 20 2a 2f 0a 20 20 69         /* */.  i
148e0 6e 74 20 69 53 65 67 3b 20 20 20 20 20 20 20 20  nt iSeg;        
148f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
14900 2a 20 55 73 65 64 20 74 6f 20 69 74 65 72 61 74  * Used to iterat
14910 65 20 74 68 72 6f 75 67 68 20 73 65 67 6d 65 6e  e through segmen
14920 74 73 20 2a 2f 0a 20 20 46 74 73 35 42 75 66 66  ts */.  Fts5Buff
14930 65 72 20 62 75 66 20 3d 20 7b 30 2c 30 2c 30 7d  er buf = {0,0,0}
14940 3b 20 20 20 20 20 20 20 2f 2a 20 42 75 66 66 65  ;       /* Buffe
14950 72 20 75 73 65 64 20 62 79 20 66 74 73 35 53 65  r used by fts5Se
14960 67 49 74 65 72 53 65 65 6b 49 6e 69 74 28 29 20  gIterSeekInit() 
14970 2a 2f 0a 20 20 46 74 73 35 53 74 72 75 63 74 75  */.  Fts5Structu
14980 72 65 4c 65 76 65 6c 20 2a 70 4c 76 6c 3b 0a 20  reLevel *pLvl;. 
14990 20 46 74 73 35 49 6e 64 65 78 49 74 65 72 20 2a   Fts5IndexIter *
149a0 70 4e 65 77 3b 0a 0a 20 20 61 73 73 65 72 74 28  pNew;..  assert(
149b0 20 28 70 54 65 72 6d 3d 3d 30 20 26 26 20 6e 54   (pTerm==0 && nT
149c0 65 72 6d 3d 3d 30 29 20 7c 7c 20 69 4c 65 76 65  erm==0) || iLeve
149d0 6c 3c 30 20 29 3b 0a 0a 20 20 2f 2a 20 41 6c 6c  l<0 );..  /* All
149e0 6f 63 61 74 65 20 73 70 61 63 65 20 66 6f 72 20  ocate space for 
149f0 74 68 65 20 6e 65 77 20 6d 75 6c 74 69 2d 73 65  the new multi-se
14a00 67 2d 69 74 65 72 61 74 6f 72 2e 20 2a 2f 0a 20  g-iterator. */. 
14a10 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49   if( p->rc==SQLI
14a20 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28  TE_OK ){.    if(
14a30 20 69 4c 65 76 65 6c 3c 30 20 29 7b 0a 20 20 20   iLevel<0 ){.   
14a40 20 20 20 61 73 73 65 72 74 28 20 70 53 74 72 75     assert( pStru
14a50 63 74 2d 3e 6e 53 65 67 6d 65 6e 74 3d 3d 66 74  ct->nSegment==ft
14a60 73 35 53 74 72 75 63 74 75 72 65 43 6f 75 6e 74  s5StructureCount
14a70 53 65 67 6d 65 6e 74 73 28 70 53 74 72 75 63 74  Segments(pStruct
14a80 29 20 29 3b 0a 20 20 20 20 20 20 6e 53 65 67 20  ) );.      nSeg 
14a90 3d 20 70 53 74 72 75 63 74 2d 3e 6e 53 65 67 6d  = pStruct->nSegm
14aa0 65 6e 74 3b 0a 20 20 20 20 20 20 6e 53 65 67 20  ent;.      nSeg 
14ab0 2b 3d 20 28 70 2d 3e 70 48 61 73 68 20 3f 20 31  += (p->pHash ? 1
14ac0 20 3a 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65   : 0);.    }else
14ad0 7b 0a 20 20 20 20 20 20 6e 53 65 67 20 3d 20 4d  {.      nSeg = M
14ae0 49 4e 28 70 53 74 72 75 63 74 2d 3e 61 4c 65 76  IN(pStruct->aLev
14af0 65 6c 5b 69 4c 65 76 65 6c 5d 2e 6e 53 65 67 2c  el[iLevel].nSeg,
14b00 20 6e 53 65 67 6d 65 6e 74 29 3b 0a 20 20 20 20   nSegment);.    
14b10 7d 0a 20 20 7d 0a 20 20 2a 70 70 4f 75 74 20 3d  }.  }.  *ppOut =
14b20 20 70 4e 65 77 20 3d 20 66 74 73 35 4d 75 6c 74   pNew = fts5Mult
14b30 69 49 74 65 72 41 6c 6c 6f 63 28 70 2c 20 6e 53  iIterAlloc(p, nS
14b40 65 67 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d  eg);.  if( pNew=
14b50 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70  =0 ) return;.  p
14b60 4e 65 77 2d 3e 62 52 65 76 20 3d 20 28 30 21 3d  New->bRev = (0!=
14b70 28 66 6c 61 67 73 20 26 20 46 54 53 35 49 4e 44  (flags & FTS5IND
14b80 45 58 5f 51 55 45 52 59 5f 44 45 53 43 29 29 3b  EX_QUERY_DESC));
14b90 0a 20 20 70 4e 65 77 2d 3e 62 53 6b 69 70 45 6d  .  pNew->bSkipEm
14ba0 70 74 79 20 3d 20 62 53 6b 69 70 45 6d 70 74 79  pty = bSkipEmpty
14bb0 3b 0a 20 20 70 4e 65 77 2d 3e 70 53 74 72 75 63  ;.  pNew->pStruc
14bc0 74 20 3d 20 70 53 74 72 75 63 74 3b 0a 20 20 66  t = pStruct;.  f
14bd0 74 73 35 53 74 72 75 63 74 75 72 65 52 65 66 28  ts5StructureRef(
14be0 70 53 74 72 75 63 74 29 3b 0a 0a 20 20 2f 2a 20  pStruct);..  /* 
14bf0 49 6e 69 74 69 61 6c 69 7a 65 20 65 61 63 68 20  Initialize each 
14c00 6f 66 20 74 68 65 20 63 6f 6d 70 6f 6e 65 6e 74  of the component
14c10 20 73 65 67 6d 65 6e 74 20 69 74 65 72 61 74 6f   segment iterato
14c20 72 73 2e 20 2a 2f 0a 20 20 69 66 28 20 69 4c 65  rs. */.  if( iLe
14c30 76 65 6c 3c 30 20 29 7b 0a 20 20 20 20 46 74 73  vel<0 ){.    Fts
14c40 35 53 74 72 75 63 74 75 72 65 4c 65 76 65 6c 20  5StructureLevel 
14c50 2a 70 45 6e 64 20 3d 20 26 70 53 74 72 75 63 74  *pEnd = &pStruct
14c60 2d 3e 61 4c 65 76 65 6c 5b 70 53 74 72 75 63 74  ->aLevel[pStruct
14c70 2d 3e 6e 4c 65 76 65 6c 5d 3b 0a 20 20 20 20 69  ->nLevel];.    i
14c80 66 28 20 70 2d 3e 70 48 61 73 68 20 29 7b 0a 20  f( p->pHash ){. 
14c90 20 20 20 20 20 2f 2a 20 41 64 64 20 61 20 73 65       /* Add a se
14ca0 67 6d 65 6e 74 20 69 74 65 72 61 74 6f 72 20 66  gment iterator f
14cb0 6f 72 20 74 68 65 20 63 75 72 72 65 6e 74 20 63  or the current c
14cc0 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 68  ontents of the h
14cd0 61 73 68 20 74 61 62 6c 65 2e 20 2a 2f 0a 20 20  ash table. */.  
14ce0 20 20 20 20 46 74 73 35 53 65 67 49 74 65 72 20      Fts5SegIter 
14cf0 2a 70 49 74 65 72 20 3d 20 26 70 4e 65 77 2d 3e  *pIter = &pNew->
14d00 61 53 65 67 5b 69 49 74 65 72 2b 2b 5d 3b 0a 20  aSeg[iIter++];. 
14d10 20 20 20 20 20 66 74 73 35 53 65 67 49 74 65 72       fts5SegIter
14d20 48 61 73 68 49 6e 69 74 28 70 2c 20 70 54 65 72  HashInit(p, pTer
14d30 6d 2c 20 6e 54 65 72 6d 2c 20 66 6c 61 67 73 2c  m, nTerm, flags,
14d40 20 70 49 74 65 72 29 3b 0a 20 20 20 20 7d 0a 20   pIter);.    }. 
14d50 20 20 20 66 6f 72 28 70 4c 76 6c 3d 26 70 53 74     for(pLvl=&pSt
14d60 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 30 5d 3b  ruct->aLevel[0];
14d70 20 70 4c 76 6c 3c 70 45 6e 64 3b 20 70 4c 76 6c   pLvl<pEnd; pLvl
14d80 2b 2b 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 69  ++){.      for(i
14d90 53 65 67 3d 70 4c 76 6c 2d 3e 6e 53 65 67 2d 31  Seg=pLvl->nSeg-1
14da0 3b 20 69 53 65 67 3e 3d 30 3b 20 69 53 65 67 2d  ; iSeg>=0; iSeg-
14db0 2d 29 7b 0a 20 20 20 20 20 20 20 20 46 74 73 35  -){.        Fts5
14dc0 53 74 72 75 63 74 75 72 65 53 65 67 6d 65 6e 74  StructureSegment
14dd0 20 2a 70 53 65 67 20 3d 20 26 70 4c 76 6c 2d 3e   *pSeg = &pLvl->
14de0 61 53 65 67 5b 69 53 65 67 5d 3b 0a 20 20 20 20  aSeg[iSeg];.    
14df0 20 20 20 20 46 74 73 35 53 65 67 49 74 65 72 20      Fts5SegIter 
14e00 2a 70 49 74 65 72 20 3d 20 26 70 4e 65 77 2d 3e  *pIter = &pNew->
14e10 61 53 65 67 5b 69 49 74 65 72 2b 2b 5d 3b 0a 20  aSeg[iIter++];. 
14e20 20 20 20 20 20 20 20 69 66 28 20 70 54 65 72 6d         if( pTerm
14e30 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
14e40 20 66 74 73 35 53 65 67 49 74 65 72 49 6e 69 74   fts5SegIterInit
14e50 28 70 2c 20 70 53 65 67 2c 20 70 49 74 65 72 29  (p, pSeg, pIter)
14e60 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
14e70 0a 20 20 20 20 20 20 20 20 20 20 66 74 73 35 53  .          fts5S
14e80 65 67 49 74 65 72 53 65 65 6b 49 6e 69 74 28 70  egIterSeekInit(p
14e90 2c 20 26 62 75 66 2c 20 70 54 65 72 6d 2c 20 6e  , &buf, pTerm, n
14ea0 54 65 72 6d 2c 20 66 6c 61 67 73 2c 20 70 53 65  Term, flags, pSe
14eb0 67 2c 20 70 49 74 65 72 29 3b 0a 20 20 20 20 20  g, pIter);.     
14ec0 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
14ed0 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20   }.  }else{.    
14ee0 70 4c 76 6c 20 3d 20 26 70 53 74 72 75 63 74 2d  pLvl = &pStruct-
14ef0 3e 61 4c 65 76 65 6c 5b 69 4c 65 76 65 6c 5d 3b  >aLevel[iLevel];
14f00 0a 20 20 20 20 66 6f 72 28 69 53 65 67 3d 6e 53  .    for(iSeg=nS
14f10 65 67 2d 31 3b 20 69 53 65 67 3e 3d 30 3b 20 69  eg-1; iSeg>=0; i
14f20 53 65 67 2d 2d 29 7b 0a 20 20 20 20 20 20 66 74  Seg--){.      ft
14f30 73 35 53 65 67 49 74 65 72 49 6e 69 74 28 70 2c  s5SegIterInit(p,
14f40 20 26 70 4c 76 6c 2d 3e 61 53 65 67 5b 69 53 65   &pLvl->aSeg[iSe
14f50 67 5d 2c 20 26 70 4e 65 77 2d 3e 61 53 65 67 5b  g], &pNew->aSeg[
14f60 69 49 74 65 72 2b 2b 5d 29 3b 0a 20 20 20 20 7d  iIter++]);.    }
14f70 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 69  .  }.  assert( i
14f80 49 74 65 72 3d 3d 6e 53 65 67 20 29 3b 0a 0a 20  Iter==nSeg );.. 
14f90 20 2f 2a 20 49 66 20 74 68 65 20 61 62 6f 76 65   /* If the above
14fa0 20 77 61 73 20 73 75 63 63 65 73 73 66 75 6c 2c   was successful,
14fb0 20 65 61 63 68 20 63 6f 6d 70 6f 6e 65 6e 74 20   each component 
14fc0 69 74 65 72 61 74 6f 72 73 20 6e 6f 77 20 70 6f  iterators now po
14fd0 69 6e 74 73 20 0a 20 20 2a 2a 20 74 6f 20 74 68  ints .  ** to th
14fe0 65 20 66 69 72 73 74 20 65 6e 74 72 79 20 69 6e  e first entry in
14ff0 20 69 74 73 20 73 65 67 6d 65 6e 74 2e 20 49 6e   its segment. In
15000 20 74 68 69 73 20 63 61 73 65 20 69 6e 69 74 69   this case initi
15010 61 6c 69 7a 65 20 74 68 65 20 0a 20 20 2a 2a 20  alize the .  ** 
15020 61 46 69 72 73 74 5b 5d 20 61 72 72 61 79 2e 20  aFirst[] array. 
15030 4f 72 2c 20 69 66 20 61 6e 20 65 72 72 6f 72 20  Or, if an error 
15040 68 61 73 20 6f 63 63 75 72 72 65 64 2c 20 66 72  has occurred, fr
15050 65 65 20 74 68 65 20 69 74 65 72 61 74 6f 72 0a  ee the iterator.
15060 20 20 2a 2a 20 6f 62 6a 65 63 74 20 61 6e 64 20    ** object and 
15070 73 65 74 20 74 68 65 20 6f 75 74 70 75 74 20 76  set the output v
15080 61 72 69 61 62 6c 65 20 74 6f 20 4e 55 4c 4c 2e  ariable to NULL.
15090 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 72 63    */.  if( p->rc
150a0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
150b0 20 20 20 66 6f 72 28 69 49 74 65 72 3d 70 4e 65     for(iIter=pNe
150c0 77 2d 3e 6e 53 65 67 2d 31 3b 20 69 49 74 65 72  w->nSeg-1; iIter
150d0 3e 30 3b 20 69 49 74 65 72 2d 2d 29 7b 0a 20 20  >0; iIter--){.  
150e0 20 20 20 20 69 6e 74 20 69 45 71 3b 0a 20 20 20      int iEq;.   
150f0 20 20 20 69 66 28 20 28 69 45 71 20 3d 20 66 74     if( (iEq = ft
15100 73 35 4d 75 6c 74 69 49 74 65 72 44 6f 43 6f 6d  s5MultiIterDoCom
15110 70 61 72 65 28 70 4e 65 77 2c 20 69 49 74 65 72  pare(pNew, iIter
15120 29 29 20 29 7b 0a 20 20 20 20 20 20 20 20 66 74  )) ){.        ft
15130 73 35 53 65 67 49 74 65 72 4e 65 78 74 28 70 2c  s5SegIterNext(p,
15140 20 26 70 4e 65 77 2d 3e 61 53 65 67 5b 69 45 71   &pNew->aSeg[iEq
15150 5d 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 66  ], 0);.        f
15160 74 73 35 4d 75 6c 74 69 49 74 65 72 41 64 76 61  ts5MultiIterAdva
15170 6e 63 65 64 28 70 2c 20 70 4e 65 77 2c 20 69 45  nced(p, pNew, iE
15180 71 2c 20 69 49 74 65 72 29 3b 0a 20 20 20 20 20  q, iIter);.     
15190 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 66 74 73   }.    }.    fts
151a0 35 4d 75 6c 74 69 49 74 65 72 53 65 74 45 6f 66  5MultiIterSetEof
151b0 28 70 4e 65 77 29 3b 0a 20 20 20 20 66 74 73 35  (pNew);.    fts5
151c0 41 73 73 65 72 74 4d 75 6c 74 69 49 74 65 72 53  AssertMultiIterS
151d0 65 74 75 70 28 70 2c 20 70 4e 65 77 29 3b 0a 0a  etup(p, pNew);..
151e0 20 20 20 20 69 66 28 20 70 4e 65 77 2d 3e 62 53      if( pNew->bS
151f0 6b 69 70 45 6d 70 74 79 20 26 26 20 66 74 73 35  kipEmpty && fts5
15200 4d 75 6c 74 69 49 74 65 72 49 73 45 6d 70 74 79  MultiIterIsEmpty
15210 28 70 2c 20 70 4e 65 77 29 20 29 7b 0a 20 20 20  (p, pNew) ){.   
15220 20 20 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72     fts5MultiIter
15230 4e 65 78 74 28 70 2c 20 70 4e 65 77 2c 20 30 2c  Next(p, pNew, 0,
15240 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c   0);.    }.  }el
15250 73 65 7b 0a 20 20 20 20 66 74 73 35 4d 75 6c 74  se{.    fts5Mult
15260 69 49 74 65 72 46 72 65 65 28 70 2c 20 70 4e 65  iIterFree(p, pNe
15270 77 29 3b 0a 20 20 20 20 2a 70 70 4f 75 74 20 3d  w);.    *ppOut =
15280 20 30 3b 0a 20 20 7d 0a 20 20 66 74 73 35 42 75   0;.  }.  fts5Bu
15290 66 66 65 72 46 72 65 65 28 26 62 75 66 29 3b 0a  fferFree(&buf);.
152a0 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20  }../*.** Create 
152b0 61 6e 20 46 74 73 35 49 6e 64 65 78 49 74 65 72  an Fts5IndexIter
152c0 20 74 68 61 74 20 69 74 65 72 61 74 65 73 20 74   that iterates t
152d0 68 72 6f 75 67 68 20 74 68 65 20 64 6f 63 6c 69  hrough the docli
152e0 73 74 20 70 72 6f 76 69 64 65 64 0a 2a 2a 20 61  st provided.** a
152f0 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67  s the second arg
15300 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  ument..*/.static
15310 20 76 6f 69 64 20 66 74 73 35 4d 75 6c 74 69 49   void fts5MultiI
15320 74 65 72 4e 65 77 32 28 0a 20 20 46 74 73 35 49  terNew2(.  Fts5I
15330 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20  ndex *p,        
15340 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54             /* FT
15350 53 35 20 62 61 63 6b 65 6e 64 20 74 6f 20 69 74  S5 backend to it
15360 65 72 61 74 65 20 77 69 74 68 69 6e 20 2a 2f 0a  erate within */.
15370 20 20 46 74 73 35 44 61 74 61 20 2a 70 44 61 74    Fts5Data *pDat
15380 61 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  a,              
15390 20 20 2f 2a 20 44 6f 63 6c 69 73 74 20 74 6f 20    /* Doclist to 
153a0 69 74 65 72 61 74 65 20 74 68 72 6f 75 67 68 20  iterate through 
153b0 2a 2f 0a 20 20 69 6e 74 20 62 44 65 73 63 2c 20  */.  int bDesc, 
153c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
153d0 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72       /* True for
153e0 20 64 65 73 63 65 6e 64 69 6e 67 20 72 6f 77 69   descending rowi
153f0 64 20 6f 72 64 65 72 20 2a 2f 0a 20 20 46 74 73  d order */.  Fts
15400 35 49 6e 64 65 78 49 74 65 72 20 2a 2a 70 70 4f  5IndexIter **ppO
15410 75 74 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ut           /* 
15420 4e 65 77 20 6f 62 6a 65 63 74 20 2a 2f 0a 29 7b  New object */.){
15430 0a 20 20 46 74 73 35 49 6e 64 65 78 49 74 65 72  .  Fts5IndexIter
15440 20 2a 70 4e 65 77 3b 0a 20 20 70 4e 65 77 20 3d   *pNew;.  pNew =
15450 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 41 6c   fts5MultiIterAl
15460 6c 6f 63 28 70 2c 20 32 29 3b 0a 20 20 69 66 28  loc(p, 2);.  if(
15470 20 70 4e 65 77 20 29 7b 0a 20 20 20 20 46 74 73   pNew ){.    Fts
15480 35 53 65 67 49 74 65 72 20 2a 70 49 74 65 72 20  5SegIter *pIter 
15490 3d 20 26 70 4e 65 77 2d 3e 61 53 65 67 5b 31 5d  = &pNew->aSeg[1]
154a0 3b 0a 0a 20 20 20 20 70 4e 65 77 2d 3e 62 46 69  ;..    pNew->bFi
154b0 6c 74 65 72 65 64 20 3d 20 31 3b 0a 20 20 20 20  ltered = 1;.    
154c0 70 49 74 65 72 2d 3e 66 6c 61 67 73 20 3d 20 46  pIter->flags = F
154d0 54 53 35 5f 53 45 47 49 54 45 52 5f 4f 4e 45 54  TS5_SEGITER_ONET
154e0 45 52 4d 3b 0a 20 20 20 20 69 66 28 20 70 44 61  ERM;.    if( pDa
154f0 74 61 2d 3e 73 7a 4c 65 61 66 3e 30 20 29 7b 0a  ta->szLeaf>0 ){.
15500 20 20 20 20 20 20 70 49 74 65 72 2d 3e 70 4c 65        pIter->pLe
15510 61 66 20 3d 20 70 44 61 74 61 3b 0a 20 20 20 20  af = pData;.    
15520 20 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66    pIter->iLeafOf
15530 66 73 65 74 20 3d 20 66 74 73 35 47 65 74 56 61  fset = fts5GetVa
15540 72 69 6e 74 28 70 44 61 74 61 2d 3e 70 2c 20 28  rint(pData->p, (
15550 75 36 34 2a 29 26 70 49 74 65 72 2d 3e 69 52 6f  u64*)&pIter->iRo
15560 77 69 64 29 3b 0a 20 20 20 20 20 20 70 49 74 65  wid);.      pIte
15570 72 2d 3e 69 45 6e 64 6f 66 44 6f 63 6c 69 73 74  r->iEndofDoclist
15580 20 3d 20 70 44 61 74 61 2d 3e 6e 6e 3b 0a 20 20   = pData->nn;.  
15590 20 20 20 20 70 4e 65 77 2d 3e 61 46 69 72 73 74      pNew->aFirst
155a0 5b 31 5d 2e 69 46 69 72 73 74 20 3d 20 31 3b 0a  [1].iFirst = 1;.
155b0 20 20 20 20 20 20 69 66 28 20 62 44 65 73 63 20        if( bDesc 
155c0 29 7b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d  ){.        pNew-
155d0 3e 62 52 65 76 20 3d 20 31 3b 0a 20 20 20 20 20  >bRev = 1;.     
155e0 20 20 20 70 49 74 65 72 2d 3e 66 6c 61 67 73 20     pIter->flags 
155f0 7c 3d 20 46 54 53 35 5f 53 45 47 49 54 45 52 5f  |= FTS5_SEGITER_
15600 52 45 56 45 52 53 45 3b 0a 20 20 20 20 20 20 20  REVERSE;.       
15610 20 66 74 73 35 53 65 67 49 74 65 72 52 65 76 65   fts5SegIterReve
15620 72 73 65 49 6e 69 74 50 61 67 65 28 70 2c 20 70  rseInitPage(p, p
15630 49 74 65 72 29 3b 0a 20 20 20 20 20 20 7d 65 6c  Iter);.      }el
15640 73 65 7b 0a 20 20 20 20 20 20 20 20 66 74 73 35  se{.        fts5
15650 53 65 67 49 74 65 72 4c 6f 61 64 4e 50 6f 73 28  SegIterLoadNPos(
15660 70 2c 20 70 49 74 65 72 29 3b 0a 20 20 20 20 20  p, pIter);.     
15670 20 7d 0a 20 20 20 20 20 20 70 44 61 74 61 20 3d   }.      pData =
15680 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   0;.    }else{. 
15690 20 20 20 20 20 70 4e 65 77 2d 3e 62 45 6f 66 20       pNew->bEof 
156a0 3d 20 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  = 1;.    }..    
156b0 2a 70 70 4f 75 74 20 3d 20 70 4e 65 77 3b 0a 20  *ppOut = pNew;. 
156c0 20 7d 0a 0a 20 20 66 74 73 35 44 61 74 61 52 65   }..  fts5DataRe
156d0 6c 65 61 73 65 28 70 44 61 74 61 29 3b 0a 7d 0a  lease(pData);.}.
156e0 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72  ./*.** Return tr
156f0 75 65 20 69 66 20 74 68 65 20 69 74 65 72 61 74  ue if the iterat
15700 6f 72 20 69 73 20 61 74 20 45 4f 46 20 6f 72 20  or is at EOF or 
15710 69 66 20 61 6e 20 65 72 72 6f 72 20 68 61 73 20  if an error has 
15720 6f 63 63 75 72 72 65 64 2e 20 0a 2a 2a 20 46 61  occurred. .** Fa
15730 6c 73 65 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a  lse otherwise..*
15740 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73  /.static int fts
15750 35 4d 75 6c 74 69 49 74 65 72 45 6f 66 28 46 74  5MultiIterEof(Ft
15760 73 35 49 6e 64 65 78 20 2a 70 2c 20 46 74 73 35  s5Index *p, Fts5
15770 49 6e 64 65 78 49 74 65 72 20 2a 70 49 74 65 72  IndexIter *pIter
15780 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  ){.  assert( p->
15790 72 63 20 0a 20 20 20 20 20 20 7c 7c 20 28 70 49  rc .      || (pI
157a0 74 65 72 2d 3e 61 53 65 67 5b 20 70 49 74 65 72  ter->aSeg[ pIter
157b0 2d 3e 61 46 69 72 73 74 5b 31 5d 2e 69 46 69 72  ->aFirst[1].iFir
157c0 73 74 20 5d 2e 70 4c 65 61 66 3d 3d 30 29 3d 3d  st ].pLeaf==0)==
157d0 70 49 74 65 72 2d 3e 62 45 6f 66 20 0a 20 20 29  pIter->bEof .  )
157e0 3b 0a 20 20 72 65 74 75 72 6e 20 28 70 2d 3e 72  ;.  return (p->r
157f0 63 20 7c 7c 20 70 49 74 65 72 2d 3e 62 45 6f 66  c || pIter->bEof
15800 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  );.}../*.** Retu
15810 72 6e 20 74 68 65 20 72 6f 77 69 64 20 6f 66 20  rn the rowid of 
15820 74 68 65 20 65 6e 74 72 79 20 74 68 61 74 20 74  the entry that t
15830 68 65 20 69 74 65 72 61 74 6f 72 20 63 75 72 72  he iterator curr
15840 65 6e 74 6c 79 20 70 6f 69 6e 74 73 0a 2a 2a 20  ently points.** 
15850 74 6f 2e 20 49 66 20 74 68 65 20 69 74 65 72 61  to. If the itera
15860 74 6f 72 20 70 6f 69 6e 74 73 20 74 6f 20 45 4f  tor points to EO
15870 46 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63  F when this func
15880 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 74  tion is called t
15890 68 65 0a 2a 2a 20 72 65 73 75 6c 74 73 20 61 72  he.** results ar
158a0 65 20 75 6e 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a  e undefined..*/.
158b0 73 74 61 74 69 63 20 69 36 34 20 66 74 73 35 4d  static i64 fts5M
158c0 75 6c 74 69 49 74 65 72 52 6f 77 69 64 28 46 74  ultiIterRowid(Ft
158d0 73 35 49 6e 64 65 78 49 74 65 72 20 2a 70 49 74  s5IndexIter *pIt
158e0 65 72 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70  er){.  assert( p
158f0 49 74 65 72 2d 3e 61 53 65 67 5b 20 70 49 74 65  Iter->aSeg[ pIte
15900 72 2d 3e 61 46 69 72 73 74 5b 31 5d 2e 69 46 69  r->aFirst[1].iFi
15910 72 73 74 20 5d 2e 70 4c 65 61 66 20 29 3b 0a 20  rst ].pLeaf );. 
15920 20 72 65 74 75 72 6e 20 70 49 74 65 72 2d 3e 61   return pIter->a
15930 53 65 67 5b 20 70 49 74 65 72 2d 3e 61 46 69 72  Seg[ pIter->aFir
15940 73 74 5b 31 5d 2e 69 46 69 72 73 74 20 5d 2e 69  st[1].iFirst ].i
15950 52 6f 77 69 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Rowid;.}../*.** 
15960 4d 6f 76 65 20 74 68 65 20 69 74 65 72 61 74 6f  Move the iterato
15970 72 20 74 6f 20 74 68 65 20 6e 65 78 74 20 65 6e  r to the next en
15980 74 72 79 20 61 74 20 6f 72 20 66 6f 6c 6c 6f 77  try at or follow
15990 69 6e 67 20 69 4d 61 74 63 68 2e 0a 2a 2f 0a 73  ing iMatch..*/.s
159a0 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 4d  tatic void fts5M
159b0 75 6c 74 69 49 74 65 72 4e 65 78 74 46 72 6f 6d  ultiIterNextFrom
159c0 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70  (.  Fts5Index *p
159d0 2c 20 0a 20 20 46 74 73 35 49 6e 64 65 78 49 74  , .  Fts5IndexIt
159e0 65 72 20 2a 70 49 74 65 72 2c 20 0a 20 20 69 36  er *pIter, .  i6
159f0 34 20 69 4d 61 74 63 68 0a 29 7b 0a 20 20 77 68  4 iMatch.){.  wh
15a00 69 6c 65 28 20 31 20 29 7b 0a 20 20 20 20 69 36  ile( 1 ){.    i6
15a10 34 20 69 52 6f 77 69 64 3b 0a 20 20 20 20 66 74  4 iRowid;.    ft
15a20 73 35 4d 75 6c 74 69 49 74 65 72 4e 65 78 74 28  s5MultiIterNext(
15a30 70 2c 20 70 49 74 65 72 2c 20 31 2c 20 69 4d 61  p, pIter, 1, iMa
15a40 74 63 68 29 3b 0a 20 20 20 20 69 66 28 20 66 74  tch);.    if( ft
15a50 73 35 4d 75 6c 74 69 49 74 65 72 45 6f 66 28 70  s5MultiIterEof(p
15a60 2c 20 70 49 74 65 72 29 20 29 20 62 72 65 61 6b  , pIter) ) break
15a70 3b 0a 20 20 20 20 69 52 6f 77 69 64 20 3d 20 66  ;.    iRowid = f
15a80 74 73 35 4d 75 6c 74 69 49 74 65 72 52 6f 77 69  ts5MultiIterRowi
15a90 64 28 70 49 74 65 72 29 3b 0a 20 20 20 20 69 66  d(pIter);.    if
15aa0 28 20 70 49 74 65 72 2d 3e 62 52 65 76 3d 3d 30  ( pIter->bRev==0
15ab0 20 26 26 20 69 52 6f 77 69 64 3e 3d 69 4d 61 74   && iRowid>=iMat
15ac0 63 68 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  ch ) break;.    
15ad0 69 66 28 20 70 49 74 65 72 2d 3e 62 52 65 76 21  if( pIter->bRev!
15ae0 3d 30 20 26 26 20 69 52 6f 77 69 64 3c 3d 69 4d  =0 && iRowid<=iM
15af0 61 74 63 68 20 29 20 62 72 65 61 6b 3b 0a 20 20  atch ) break;.  
15b00 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  }.}../*.** Retur
15b10 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  n a pointer to a
15b20 20 62 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69   buffer containi
15b30 6e 67 20 74 68 65 20 74 65 72 6d 20 61 73 73 6f  ng the term asso
15b40 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20  ciated with the 
15b50 0a 2a 2a 20 65 6e 74 72 79 20 74 68 61 74 20 74  .** entry that t
15b60 68 65 20 69 74 65 72 61 74 6f 72 20 63 75 72 72  he iterator curr
15b70 65 6e 74 6c 79 20 70 6f 69 6e 74 73 20 74 6f 2e  ently points to.
15b80 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74  .*/.static const
15b90 20 75 38 20 2a 66 74 73 35 4d 75 6c 74 69 49 74   u8 *fts5MultiIt
15ba0 65 72 54 65 72 6d 28 46 74 73 35 49 6e 64 65 78  erTerm(Fts5Index
15bb0 49 74 65 72 20 2a 70 49 74 65 72 2c 20 69 6e 74  Iter *pIter, int
15bc0 20 2a 70 6e 29 7b 0a 20 20 46 74 73 35 53 65 67   *pn){.  Fts5Seg
15bd0 49 74 65 72 20 2a 70 20 3d 20 26 70 49 74 65 72  Iter *p = &pIter
15be0 2d 3e 61 53 65 67 5b 20 70 49 74 65 72 2d 3e 61  ->aSeg[ pIter->a
15bf0 46 69 72 73 74 5b 31 5d 2e 69 46 69 72 73 74 20  First[1].iFirst 
15c00 5d 3b 0a 20 20 2a 70 6e 20 3d 20 70 2d 3e 74 65  ];.  *pn = p->te
15c10 72 6d 2e 6e 3b 0a 20 20 72 65 74 75 72 6e 20 70  rm.n;.  return p
15c20 2d 3e 74 65 72 6d 2e 70 3b 0a 7d 0a 0a 73 74 61  ->term.p;.}..sta
15c30 74 69 63 20 76 6f 69 64 20 66 74 73 35 43 68 75  tic void fts5Chu
15c40 6e 6b 49 74 65 72 61 74 65 28 0a 20 20 46 74 73  nkIterate(.  Fts
15c50 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20  5Index *p,      
15c60 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
15c70 49 6e 64 65 78 20 6f 62 6a 65 63 74 20 2a 2f 0a  Index object */.
15c80 20 20 46 74 73 35 53 65 67 49 74 65 72 20 2a 70    Fts5SegIter *p
15c90 53 65 67 2c 20 20 20 20 20 20 20 20 20 20 20 20  Seg,            
15ca0 20 20 2f 2a 20 50 6f 73 6c 69 73 74 20 6f 66 20    /* Poslist of 
15cb0 74 68 69 73 20 69 74 65 72 61 74 6f 72 20 2a 2f  this iterator */
15cc0 0a 20 20 76 6f 69 64 20 2a 70 43 74 78 2c 20 20  .  void *pCtx,  
15cd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15ce0 20 20 20 2f 2a 20 43 6f 6e 74 65 78 74 20 70 6f     /* Context po
15cf0 69 6e 74 65 72 20 66 6f 72 20 78 43 68 75 6e 6b  inter for xChunk
15d00 20 63 61 6c 6c 62 61 63 6b 20 2a 2f 0a 20 20 76   callback */.  v
15d10 6f 69 64 20 28 2a 78 43 68 75 6e 6b 29 28 46 74  oid (*xChunk)(Ft
15d20 73 35 49 6e 64 65 78 2a 2c 20 76 6f 69 64 2a 2c  s5Index*, void*,
15d30 20 63 6f 6e 73 74 20 75 38 2a 2c 20 69 6e 74 29   const u8*, int)
15d40 0a 29 7b 0a 20 20 69 6e 74 20 6e 52 65 6d 20 3d  .){.  int nRem =
15d50 20 70 53 65 67 2d 3e 6e 50 6f 73 3b 20 20 20 20   pSeg->nPos;    
15d60 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
15d70 6f 66 20 62 79 74 65 73 20 73 74 69 6c 6c 20 74  of bytes still t
15d80 6f 20 63 6f 6d 65 20 2a 2f 0a 20 20 46 74 73 35  o come */.  Fts5
15d90 44 61 74 61 20 2a 70 44 61 74 61 20 3d 20 30 3b  Data *pData = 0;
15da0 0a 20 20 75 38 20 2a 70 43 68 75 6e 6b 20 3d 20  .  u8 *pChunk = 
15db0 26 70 53 65 67 2d 3e 70 4c 65 61 66 2d 3e 70 5b  &pSeg->pLeaf->p[
15dc0 70 53 65 67 2d 3e 69 4c 65 61 66 4f 66 66 73 65  pSeg->iLeafOffse
15dd0 74 5d 3b 0a 20 20 69 6e 74 20 6e 43 68 75 6e 6b  t];.  int nChunk
15de0 20 3d 20 4d 49 4e 28 6e 52 65 6d 2c 20 70 53 65   = MIN(nRem, pSe
15df0 67 2d 3e 70 4c 65 61 66 2d 3e 73 7a 4c 65 61 66  g->pLeaf->szLeaf
15e00 20 2d 20 70 53 65 67 2d 3e 69 4c 65 61 66 4f 66   - pSeg->iLeafOf
15e10 66 73 65 74 29 3b 0a 20 20 69 6e 74 20 70 67 6e  fset);.  int pgn
15e20 6f 20 3d 20 70 53 65 67 2d 3e 69 4c 65 61 66 50  o = pSeg->iLeafP
15e30 67 6e 6f 3b 0a 20 20 69 6e 74 20 70 67 6e 6f 53  gno;.  int pgnoS
15e40 61 76 65 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20  ave = 0;..  if( 
15e50 28 70 53 65 67 2d 3e 66 6c 61 67 73 20 26 20 46  (pSeg->flags & F
15e60 54 53 35 5f 53 45 47 49 54 45 52 5f 52 45 56 45  TS5_SEGITER_REVE
15e70 52 53 45 29 3d 3d 30 20 29 7b 0a 20 20 20 20 70  RSE)==0 ){.    p
15e80 67 6e 6f 53 61 76 65 20 3d 20 70 67 6e 6f 2b 31  gnoSave = pgno+1
15e90 3b 0a 20 20 7d 0a 0a 20 20 77 68 69 6c 65 28 20  ;.  }..  while( 
15ea0 31 20 29 7b 0a 20 20 20 20 78 43 68 75 6e 6b 28  1 ){.    xChunk(
15eb0 70 2c 20 70 43 74 78 2c 20 70 43 68 75 6e 6b 2c  p, pCtx, pChunk,
15ec0 20 6e 43 68 75 6e 6b 29 3b 0a 20 20 20 20 6e 52   nChunk);.    nR
15ed0 65 6d 20 2d 3d 20 6e 43 68 75 6e 6b 3b 0a 20 20  em -= nChunk;.  
15ee0 20 20 66 74 73 35 44 61 74 61 52 65 6c 65 61 73    fts5DataReleas
15ef0 65 28 70 44 61 74 61 29 3b 0a 20 20 20 20 69 66  e(pData);.    if
15f00 28 20 6e 52 65 6d 3c 3d 30 20 29 7b 0a 20 20 20  ( nRem<=0 ){.   
15f10 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 65     break;.    }e
15f20 6c 73 65 7b 0a 20 20 20 20 20 20 70 67 6e 6f 2b  lse{.      pgno+
15f30 2b 3b 0a 20 20 20 20 20 20 70 44 61 74 61 20 3d  +;.      pData =
15f40 20 66 74 73 35 44 61 74 61 52 65 61 64 28 70 2c   fts5DataRead(p,
15f50 20 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f 52 4f   FTS5_SEGMENT_RO
15f60 57 49 44 28 70 53 65 67 2d 3e 70 53 65 67 2d 3e  WID(pSeg->pSeg->
15f70 69 53 65 67 69 64 2c 20 70 67 6e 6f 29 29 3b 0a  iSegid, pgno));.
15f80 20 20 20 20 20 20 69 66 28 20 70 44 61 74 61 3d        if( pData=
15f90 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  =0 ) break;.    
15fa0 20 20 70 43 68 75 6e 6b 20 3d 20 26 70 44 61 74    pChunk = &pDat
15fb0 61 2d 3e 70 5b 34 5d 3b 0a 20 20 20 20 20 20 6e  a->p[4];.      n
15fc0 43 68 75 6e 6b 20 3d 20 4d 49 4e 28 6e 52 65 6d  Chunk = MIN(nRem
15fd0 2c 20 70 44 61 74 61 2d 3e 73 7a 4c 65 61 66 20  , pData->szLeaf 
15fe0 2d 20 34 29 3b 0a 20 20 20 20 20 20 69 66 28 20  - 4);.      if( 
15ff0 70 67 6e 6f 3d 3d 70 67 6e 6f 53 61 76 65 20 29  pgno==pgnoSave )
16000 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
16010 28 20 70 53 65 67 2d 3e 70 4e 65 78 74 4c 65 61  ( pSeg->pNextLea
16020 66 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  f==0 );.        
16030 70 53 65 67 2d 3e 70 4e 65 78 74 4c 65 61 66 20  pSeg->pNextLeaf 
16040 3d 20 70 44 61 74 61 3b 0a 20 20 20 20 20 20 20  = pData;.       
16050 20 70 44 61 74 61 20 3d 20 30 3b 0a 20 20 20 20   pData = 0;.    
16060 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a    }.    }.  }.}.
16070 0a 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74  .../*.** Allocat
16080 65 20 61 20 6e 65 77 20 73 65 67 6d 65 6e 74 2d  e a new segment-
16090 69 64 20 66 6f 72 20 74 68 65 20 73 74 72 75 63  id for the struc
160a0 74 75 72 65 20 70 53 74 72 75 63 74 2e 20 54 68  ture pStruct. Th
160b0 65 20 6e 65 77 20 73 65 67 6d 65 6e 74 0a 2a 2a  e new segment.**
160c0 20 69 64 20 6d 75 73 74 20 62 65 20 62 65 74 77   id must be betw
160d0 65 65 6e 20 31 20 61 6e 64 20 36 35 33 33 35 20  een 1 and 65335 
160e0 69 6e 63 6c 75 73 69 76 65 2c 20 61 6e 64 20 6d  inclusive, and m
160f0 75 73 74 20 6e 6f 74 20 62 65 20 75 73 65 64 20  ust not be used 
16100 62 79 20 0a 2a 2a 20 61 6e 79 20 63 75 72 72 65  by .** any curre
16110 6e 74 6c 79 20 65 78 69 73 74 69 6e 67 20 73 65  ntly existing se
16120 67 6d 65 6e 74 2e 20 49 66 20 61 20 66 72 65 65  gment. If a free
16130 20 73 65 67 6d 65 6e 74 20 69 64 20 63 61 6e 6e   segment id cann
16140 6f 74 20 62 65 20 66 6f 75 6e 64 2c 0a 2a 2a 20  ot be found,.** 
16150 53 51 4c 49 54 45 5f 46 55 4c 4c 20 69 73 20 72  SQLITE_FULL is r
16160 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49  eturned..**.** I
16170 66 20 61 6e 20 65 72 72 6f 72 20 68 61 73 20 61  f an error has a
16180 6c 72 65 61 64 79 20 6f 63 63 75 72 72 65 64 2c  lready occurred,
16190 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
161a0 73 20 61 20 6e 6f 2d 6f 70 2e 20 30 20 69 73 20  s a no-op. 0 is 
161b0 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 69 6e 20  .** returned in 
161c0 74 68 69 73 20 63 61 73 65 2e 0a 2a 2f 0a 73 74  this case..*/.st
161d0 61 74 69 63 20 69 6e 74 20 66 74 73 35 41 6c 6c  atic int fts5All
161e0 6f 63 61 74 65 53 65 67 69 64 28 46 74 73 35 49  ocateSegid(Fts5I
161f0 6e 64 65 78 20 2a 70 2c 20 46 74 73 35 53 74 72  ndex *p, Fts5Str
16200 75 63 74 75 72 65 20 2a 70 53 74 72 75 63 74 29  ucture *pStruct)
16210 7b 0a 20 20 69 6e 74 20 69 53 65 67 69 64 20 3d  {.  int iSegid =
16220 20 30 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 72 63   0;..  if( p->rc
16230 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
16240 20 20 20 69 66 28 20 70 53 74 72 75 63 74 2d 3e     if( pStruct->
16250 6e 53 65 67 6d 65 6e 74 3e 3d 46 54 53 35 5f 4d  nSegment>=FTS5_M
16260 41 58 5f 53 45 47 4d 45 4e 54 20 29 7b 0a 20 20  AX_SEGMENT ){.  
16270 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49      p->rc = SQLI
16280 54 45 5f 46 55 4c 4c 3b 0a 20 20 20 20 7d 65 6c  TE_FULL;.    }el
16290 73 65 7b 0a 20 20 20 20 20 20 77 68 69 6c 65 28  se{.      while(
162a0 20 69 53 65 67 69 64 3d 3d 30 20 29 7b 0a 20 20   iSegid==0 ){.  
162b0 20 20 20 20 20 20 69 6e 74 20 69 4c 76 6c 2c 20        int iLvl, 
162c0 69 53 65 67 3b 0a 20 20 20 20 20 20 20 20 73 71  iSeg;.        sq
162d0 6c 69 74 65 33 5f 72 61 6e 64 6f 6d 6e 65 73 73  lite3_randomness
162e0 28 73 69 7a 65 6f 66 28 75 33 32 29 2c 20 28 76  (sizeof(u32), (v
162f0 6f 69 64 2a 29 26 69 53 65 67 69 64 29 3b 0a 20  oid*)&iSegid);. 
16300 20 20 20 20 20 20 20 69 53 65 67 69 64 20 3d 20         iSegid = 
16310 69 53 65 67 69 64 20 26 20 28 28 31 20 3c 3c 20  iSegid & ((1 << 
16320 46 54 53 35 5f 44 41 54 41 5f 49 44 5f 42 29 2d  FTS5_DATA_ID_B)-
16330 31 29 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28  1);.        for(
16340 69 4c 76 6c 3d 30 3b 20 69 4c 76 6c 3c 70 53 74  iLvl=0; iLvl<pSt
16350 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 3b 20 69 4c  ruct->nLevel; iL
16360 76 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20  vl++){.         
16370 20 66 6f 72 28 69 53 65 67 3d 30 3b 20 69 53 65   for(iSeg=0; iSe
16380 67 3c 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65  g<pStruct->aLeve
16390 6c 5b 69 4c 76 6c 5d 2e 6e 53 65 67 3b 20 69 53  l[iLvl].nSeg; iS
163a0 65 67 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20  eg++){.         
163b0 20 20 20 69 66 28 20 69 53 65 67 69 64 3d 3d 70     if( iSegid==p
163c0 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69  Struct->aLevel[i
163d0 4c 76 6c 5d 2e 61 53 65 67 5b 69 53 65 67 5d 2e  Lvl].aSeg[iSeg].
163e0 69 53 65 67 69 64 20 29 7b 0a 20 20 20 20 20 20  iSegid ){.      
163f0 20 20 20 20 20 20 20 20 69 53 65 67 69 64 20 3d          iSegid =
16400 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   0;.            
16410 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  }.          }.  
16420 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
16430 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74      }.  }..  ret
16440 75 72 6e 20 69 53 65 67 69 64 3b 0a 7d 0a 0a 2f  urn iSegid;.}../
16450 2a 0a 2a 2a 20 44 69 73 63 61 72 64 20 61 6c 6c  *.** Discard all
16460 20 64 61 74 61 20 63 75 72 72 65 6e 74 6c 79 20   data currently 
16470 63 61 63 68 65 64 20 69 6e 20 74 68 65 20 68 61  cached in the ha
16480 73 68 2d 74 61 62 6c 65 73 2e 0a 2a 2f 0a 73 74  sh-tables..*/.st
16490 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 49 6e  atic void fts5In
164a0 64 65 78 44 69 73 63 61 72 64 44 61 74 61 28 46  dexDiscardData(F
164b0 74 73 35 49 6e 64 65 78 20 2a 70 29 7b 0a 20 20  ts5Index *p){.  
164c0 61 73 73 65 72 74 28 20 70 2d 3e 70 48 61 73 68  assert( p->pHash
164d0 20 7c 7c 20 70 2d 3e 6e 50 65 6e 64 69 6e 67 44   || p->nPendingD
164e0 61 74 61 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20  ata==0 );.  if( 
164f0 70 2d 3e 70 48 61 73 68 20 29 7b 0a 20 20 20 20  p->pHash ){.    
16500 73 71 6c 69 74 65 33 46 74 73 35 48 61 73 68 43  sqlite3Fts5HashC
16510 6c 65 61 72 28 70 2d 3e 70 48 61 73 68 29 3b 0a  lear(p->pHash);.
16520 20 20 20 20 70 2d 3e 6e 50 65 6e 64 69 6e 67 44      p->nPendingD
16530 61 74 61 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a  ata = 0;.  }.}..
16540 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
16550 20 73 69 7a 65 20 6f 66 20 74 68 65 20 70 72 65   size of the pre
16560 66 69 78 2c 20 69 6e 20 62 79 74 65 73 2c 20 74  fix, in bytes, t
16570 68 61 74 20 62 75 66 66 65 72 20 28 6e 4e 65 77  hat buffer (nNew
16580 2f 70 4e 65 77 29 20 73 68 61 72 65 73 0a 2a 2a  /pNew) shares.**
16590 20 77 69 74 68 20 62 75 66 66 65 72 20 28 6e 4f   with buffer (nO
165a0 6c 64 2f 70 4f 6c 64 29 2e 0a 2a 2f 0a 73 74 61  ld/pOld)..*/.sta
165b0 74 69 63 20 69 6e 74 20 66 74 73 35 50 72 65 66  tic int fts5Pref
165c0 69 78 43 6f 6d 70 72 65 73 73 28 0a 20 20 69 6e  ixCompress(.  in
165d0 74 20 6e 4f 6c 64 2c 20 63 6f 6e 73 74 20 75 38  t nOld, const u8
165e0 20 2a 70 4f 6c 64 2c 0a 20 20 69 6e 74 20 6e 4e   *pOld,.  int nN
165f0 65 77 2c 20 63 6f 6e 73 74 20 75 38 20 2a 70 4e  ew, const u8 *pN
16600 65 77 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  ew.){.  int i;. 
16610 20 61 73 73 65 72 74 28 20 66 74 73 35 42 6c 6f   assert( fts5Blo
16620 62 43 6f 6d 70 61 72 65 28 70 4f 6c 64 2c 20 6e  bCompare(pOld, n
16630 4f 6c 64 2c 20 70 4e 65 77 2c 20 6e 4e 65 77 29  Old, pNew, nNew)
16640 3c 30 20 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  <0 );.  for(i=0;
16650 20 69 3c 6e 4f 6c 64 3b 20 69 2b 2b 29 7b 0a 20   i<nOld; i++){. 
16660 20 20 20 69 66 28 20 70 4f 6c 64 5b 69 5d 21 3d     if( pOld[i]!=
16670 70 4e 65 77 5b 69 5d 20 29 20 62 72 65 61 6b 3b  pNew[i] ) break;
16680 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 69 3b  .  }.  return i;
16690 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .}..static void 
166a0 66 74 73 35 57 72 69 74 65 44 6c 69 64 78 43 6c  fts5WriteDlidxCl
166b0 65 61 72 28 0a 20 20 46 74 73 35 49 6e 64 65 78  ear(.  Fts5Index
166c0 20 2a 70 2c 20 0a 20 20 46 74 73 35 53 65 67 57   *p, .  Fts5SegW
166d0 72 69 74 65 72 20 2a 70 57 72 69 74 65 72 2c 0a  riter *pWriter,.
166e0 20 20 69 6e 74 20 62 46 6c 75 73 68 20 20 20 20    int bFlush    
166f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16700 20 20 2f 2a 20 49 66 20 74 72 75 65 2c 20 77 72    /* If true, wr
16710 69 74 65 20 64 6c 69 64 78 20 74 6f 20 64 69 73  ite dlidx to dis
16720 6b 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b  k */.){.  int i;
16730 0a 20 20 61 73 73 65 72 74 28 20 62 46 6c 75 73  .  assert( bFlus
16740 68 3d 3d 30 20 7c 7c 20 28 70 57 72 69 74 65 72  h==0 || (pWriter
16750 2d 3e 6e 44 6c 69 64 78 3e 30 20 26 26 20 70 57  ->nDlidx>0 && pW
16760 72 69 74 65 72 2d 3e 61 44 6c 69 64 78 5b 30 5d  riter->aDlidx[0]
16770 2e 62 75 66 2e 6e 3e 30 29 20 29 3b 0a 20 20 66  .buf.n>0) );.  f
16780 6f 72 28 69 3d 30 3b 20 69 3c 70 57 72 69 74 65  or(i=0; i<pWrite
16790 72 2d 3e 6e 44 6c 69 64 78 3b 20 69 2b 2b 29 7b  r->nDlidx; i++){
167a0 0a 20 20 20 20 46 74 73 35 44 6c 69 64 78 57 72  .    Fts5DlidxWr
167b0 69 74 65 72 20 2a 70 44 6c 69 64 78 20 3d 20 26  iter *pDlidx = &
167c0 70 57 72 69 74 65 72 2d 3e 61 44 6c 69 64 78 5b  pWriter->aDlidx[
167d0 69 5d 3b 0a 20 20 20 20 69 66 28 20 70 44 6c 69  i];.    if( pDli
167e0 64 78 2d 3e 62 75 66 2e 6e 3d 3d 30 20 29 20 62  dx->buf.n==0 ) b
167f0 72 65 61 6b 3b 0a 20 20 20 20 69 66 28 20 62 46  reak;.    if( bF
16800 6c 75 73 68 20 29 7b 0a 20 20 20 20 20 20 61 73  lush ){.      as
16810 73 65 72 74 28 20 70 44 6c 69 64 78 2d 3e 70 67  sert( pDlidx->pg
16820 6e 6f 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 66  no!=0 );.      f
16830 74 73 35 44 61 74 61 57 72 69 74 65 28 70 2c 20  ts5DataWrite(p, 
16840 0a 20 20 20 20 20 20 20 20 20 20 46 54 53 35 5f  .          FTS5_
16850 44 4c 49 44 58 5f 52 4f 57 49 44 28 70 57 72 69  DLIDX_ROWID(pWri
16860 74 65 72 2d 3e 69 53 65 67 69 64 2c 20 69 2c 20  ter->iSegid, i, 
16870 70 44 6c 69 64 78 2d 3e 70 67 6e 6f 29 2c 0a 20  pDlidx->pgno),. 
16880 20 20 20 20 20 20 20 20 20 70 44 6c 69 64 78 2d           pDlidx-
16890 3e 62 75 66 2e 70 2c 20 70 44 6c 69 64 78 2d 3e  >buf.p, pDlidx->
168a0 62 75 66 2e 6e 0a 20 20 20 20 20 20 29 3b 0a 20  buf.n.      );. 
168b0 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
168c0 46 74 73 35 42 75 66 66 65 72 5a 65 72 6f 28 26  Fts5BufferZero(&
168d0 70 44 6c 69 64 78 2d 3e 62 75 66 29 3b 0a 20 20  pDlidx->buf);.  
168e0 20 20 70 44 6c 69 64 78 2d 3e 62 50 72 65 76 56    pDlidx->bPrevV
168f0 61 6c 69 64 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a  alid = 0;.  }.}.
16900 0a 2f 2a 0a 2a 2a 20 47 72 6f 77 20 74 68 65 20  ./*.** Grow the 
16910 70 57 72 69 74 65 72 2d 3e 61 44 6c 69 64 78 5b  pWriter->aDlidx[
16920 5d 20 61 72 72 61 79 20 74 6f 20 61 74 20 6c 65  ] array to at le
16930 61 73 74 20 6e 4c 76 6c 20 65 6c 65 6d 65 6e 74  ast nLvl element
16940 73 20 69 6e 20 73 69 7a 65 2e 0a 2a 2a 20 41 6e  s in size..** An
16950 79 20 6e 65 77 20 61 72 72 61 79 20 65 6c 65 6d  y new array elem
16960 65 6e 74 73 20 61 72 65 20 7a 65 72 6f 65 64 20  ents are zeroed 
16970 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67  before returning
16980 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
16990 66 74 73 35 57 72 69 74 65 44 6c 69 64 78 47 72  fts5WriteDlidxGr
169a0 6f 77 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20  ow(.  Fts5Index 
169b0 2a 70 2c 0a 20 20 46 74 73 35 53 65 67 57 72 69  *p,.  Fts5SegWri
169c0 74 65 72 20 2a 70 57 72 69 74 65 72 2c 0a 20 20  ter *pWriter,.  
169d0 69 6e 74 20 6e 4c 76 6c 0a 29 7b 0a 20 20 69 66  int nLvl.){.  if
169e0 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
169f0 4f 4b 20 26 26 20 6e 4c 76 6c 3e 3d 70 57 72 69  OK && nLvl>=pWri
16a00 74 65 72 2d 3e 6e 44 6c 69 64 78 20 29 7b 0a 20  ter->nDlidx ){. 
16a10 20 20 20 46 74 73 35 44 6c 69 64 78 57 72 69 74     Fts5DlidxWrit
16a20 65 72 20 2a 61 44 6c 69 64 78 20 3d 20 28 46 74  er *aDlidx = (Ft
16a30 73 35 44 6c 69 64 78 57 72 69 74 65 72 2a 29 73  s5DlidxWriter*)s
16a40 71 6c 69 74 65 33 5f 72 65 61 6c 6c 6f 63 28 0a  qlite3_realloc(.
16a50 20 20 20 20 20 20 20 20 70 57 72 69 74 65 72 2d          pWriter-
16a60 3e 61 44 6c 69 64 78 2c 20 73 69 7a 65 6f 66 28  >aDlidx, sizeof(
16a70 46 74 73 35 44 6c 69 64 78 57 72 69 74 65 72 29  Fts5DlidxWriter)
16a80 20 2a 20 6e 4c 76 6c 0a 20 20 20 20 29 3b 0a 20   * nLvl.    );. 
16a90 20 20 20 69 66 28 20 61 44 6c 69 64 78 3d 3d 30     if( aDlidx==0
16aa0 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 72 63 20   ){.      p->rc 
16ab0 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
16ac0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
16ad0 20 69 6e 74 20 6e 42 79 74 65 20 3d 20 73 69 7a   int nByte = siz
16ae0 65 6f 66 28 46 74 73 35 44 6c 69 64 78 57 72 69  eof(Fts5DlidxWri
16af0 74 65 72 29 20 2a 20 28 6e 4c 76 6c 20 2d 20 70  ter) * (nLvl - p
16b00 57 72 69 74 65 72 2d 3e 6e 44 6c 69 64 78 29 3b  Writer->nDlidx);
16b10 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 26 61  .      memset(&a
16b20 44 6c 69 64 78 5b 70 57 72 69 74 65 72 2d 3e 6e  Dlidx[pWriter->n
16b30 44 6c 69 64 78 5d 2c 20 30 2c 20 6e 42 79 74 65  Dlidx], 0, nByte
16b40 29 3b 0a 20 20 20 20 20 20 70 57 72 69 74 65 72  );.      pWriter
16b50 2d 3e 61 44 6c 69 64 78 20 3d 20 61 44 6c 69 64  ->aDlidx = aDlid
16b60 78 3b 0a 20 20 20 20 20 20 70 57 72 69 74 65 72  x;.      pWriter
16b70 2d 3e 6e 44 6c 69 64 78 20 3d 20 6e 4c 76 6c 3b  ->nDlidx = nLvl;
16b80 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
16b90 75 72 6e 20 70 2d 3e 72 63 3b 0a 7d 0a 0a 2f 2a  urn p->rc;.}../*
16ba0 0a 2a 2a 20 49 66 20 74 68 65 20 63 75 72 72 65  .** If the curre
16bb0 6e 74 20 64 6f 63 6c 69 73 74 2d 69 6e 64 65 78  nt doclist-index
16bc0 20 61 63 63 75 6d 75 6c 61 74 69 6e 67 20 69 6e   accumulating in
16bd0 20 70 57 72 69 74 65 72 2d 3e 61 44 6c 69 64 78   pWriter->aDlidx
16be0 5b 5d 20 69 73 20 6c 61 72 67 65 0a 2a 2a 20 65  [] is large.** e
16bf0 6e 6f 75 67 68 2c 20 66 6c 75 73 68 20 69 74 20  nough, flush it 
16c00 74 6f 20 64 69 73 6b 20 61 6e 64 20 72 65 74 75  to disk and retu
16c10 72 6e 20 31 2e 20 4f 74 68 65 72 77 69 73 65 20  rn 1. Otherwise 
16c20 64 69 73 63 61 72 64 20 69 74 20 61 6e 64 20 72  discard it and r
16c30 65 74 75 72 6e 0a 2a 2a 20 7a 65 72 6f 2e 0a 2a  eturn.** zero..*
16c40 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73  /.static int fts
16c50 35 57 72 69 74 65 46 6c 75 73 68 44 6c 69 64 78  5WriteFlushDlidx
16c60 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 46  (Fts5Index *p, F
16c70 74 73 35 53 65 67 57 72 69 74 65 72 20 2a 70 57  ts5SegWriter *pW
16c80 72 69 74 65 72 29 7b 0a 20 20 69 6e 74 20 62 46  riter){.  int bF
16c90 6c 61 67 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 49  lag = 0;..  /* I
16ca0 66 20 74 68 65 72 65 20 77 65 72 65 20 46 54 53  f there were FTS
16cb0 35 5f 4d 49 4e 5f 44 4c 49 44 58 5f 53 49 5a 45  5_MIN_DLIDX_SIZE
16cc0 20 6f 72 20 6d 6f 72 65 20 65 6d 70 74 79 20 6c   or more empty l
16cd0 65 61 66 20 70 61 67 65 73 20 77 72 69 74 74 65  eaf pages writte
16ce0 6e 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20 64 61  n.  ** to the da
16cf0 74 61 62 61 73 65 2c 20 61 6c 73 6f 20 77 72 69  tabase, also wri
16d00 74 65 20 74 68 65 20 64 6f 63 6c 69 73 74 2d 69  te the doclist-i
16d10 6e 64 65 78 20 74 6f 20 64 69 73 6b 2e 20 20 2a  ndex to disk.  *
16d20 2f 0a 20 20 69 66 28 20 70 57 72 69 74 65 72 2d  /.  if( pWriter-
16d30 3e 61 44 6c 69 64 78 5b 30 5d 2e 62 75 66 2e 6e  >aDlidx[0].buf.n
16d40 3e 30 20 26 26 20 70 57 72 69 74 65 72 2d 3e 6e  >0 && pWriter->n
16d50 45 6d 70 74 79 3e 3d 46 54 53 35 5f 4d 49 4e 5f  Empty>=FTS5_MIN_
16d60 44 4c 49 44 58 5f 53 49 5a 45 20 29 7b 0a 20 20  DLIDX_SIZE ){.  
16d70 20 20 62 46 6c 61 67 20 3d 20 31 3b 0a 20 20 7d    bFlag = 1;.  }
16d80 0a 20 20 66 74 73 35 57 72 69 74 65 44 6c 69 64  .  fts5WriteDlid
16d90 78 43 6c 65 61 72 28 70 2c 20 70 57 72 69 74 65  xClear(p, pWrite
16da0 72 2c 20 62 46 6c 61 67 29 3b 0a 20 20 70 57 72  r, bFlag);.  pWr
16db0 69 74 65 72 2d 3e 6e 45 6d 70 74 79 20 3d 20 30  iter->nEmpty = 0
16dc0 3b 0a 20 20 72 65 74 75 72 6e 20 62 46 6c 61 67  ;.  return bFlag
16dd0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
16de0 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
16df0 65 64 20 77 68 65 6e 65 76 65 72 20 70 72 6f 63  ed whenever proc
16e00 65 73 73 69 6e 67 20 6f 66 20 74 68 65 20 64 6f  essing of the do
16e10 63 6c 69 73 74 20 66 6f 72 20 74 68 65 20 0a 2a  clist for the .*
16e20 2a 20 6c 61 73 74 20 74 65 72 6d 20 6f 6e 20 6c  * last term on l
16e30 65 61 66 20 70 61 67 65 20 28 70 57 72 69 74 65  eaf page (pWrite
16e40 72 2d 3e 69 42 74 50 61 67 65 29 20 69 73 20 63  r->iBtPage) is c
16e50 6f 6d 70 6c 65 74 65 64 2e 20 0a 2a 2a 0a 2a 2a  ompleted. .**.**
16e60 20 54 68 65 20 64 6f 63 6c 69 73 74 2d 69 6e 64   The doclist-ind
16e70 65 78 20 66 6f 72 20 74 68 61 74 20 74 65 72 6d  ex for that term
16e80 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 73 74   is currently st
16e90 6f 72 65 64 20 69 6e 2d 6d 65 6d 6f 72 79 20 77  ored in-memory w
16ea0 69 74 68 69 6e 20 74 68 65 0a 2a 2a 20 46 74 73  ithin the.** Fts
16eb0 35 53 65 67 57 72 69 74 65 72 2e 61 44 6c 69 64  5SegWriter.aDlid
16ec0 78 5b 5d 20 61 72 72 61 79 2e 20 49 66 20 69 74  x[] array. If it
16ed0 20 69 73 20 6c 61 72 67 65 20 65 6e 6f 75 67 68   is large enough
16ee0 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a  , this function.
16ef0 2a 2a 20 77 72 69 74 65 73 20 69 74 20 6f 75 74  ** writes it out
16f00 20 74 6f 20 64 69 73 6b 2e 20 4f 72 2c 20 69 66   to disk. Or, if
16f10 20 69 74 20 69 73 20 74 6f 6f 20 73 6d 61 6c 6c   it is too small
16f20 20 74 6f 20 62 6f 74 68 65 72 20 77 69 74 68 2c   to bother with,
16f30 20 64 69 73 63 61 72 64 73 0a 2a 2a 20 69 74 2e   discards.** it.
16f40 0a 2a 2a 0a 2a 2a 20 46 74 73 35 53 65 67 57 72  .**.** Fts5SegWr
16f50 69 74 65 72 2e 62 74 74 65 72 6d 20 63 75 72 72  iter.btterm curr
16f60 65 6e 74 6c 79 20 63 6f 6e 74 61 69 6e 73 20 74  ently contains t
16f70 68 65 20 66 69 72 73 74 20 74 65 72 6d 20 6f 6e  he first term on
16f80 20 70 61 67 65 20 69 42 74 50 61 67 65 2e 0a 2a   page iBtPage..*
16f90 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  /.static void ft
16fa0 73 35 57 72 69 74 65 46 6c 75 73 68 42 74 72 65  s5WriteFlushBtre
16fb0 65 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20  e(Fts5Index *p, 
16fc0 46 74 73 35 53 65 67 57 72 69 74 65 72 20 2a 70  Fts5SegWriter *p
16fd0 57 72 69 74 65 72 29 7b 0a 20 20 69 6e 74 20 62  Writer){.  int b
16fe0 46 6c 61 67 3b 0a 0a 20 20 61 73 73 65 72 74 28  Flag;..  assert(
16ff0 20 70 57 72 69 74 65 72 2d 3e 69 42 74 50 61 67   pWriter->iBtPag
17000 65 20 7c 7c 20 70 57 72 69 74 65 72 2d 3e 6e 45  e || pWriter->nE
17010 6d 70 74 79 3d 3d 30 20 29 3b 0a 20 20 69 66 28  mpty==0 );.  if(
17020 20 70 57 72 69 74 65 72 2d 3e 69 42 74 50 61 67   pWriter->iBtPag
17030 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  e==0 ) return;. 
17040 20 62 46 6c 61 67 20 3d 20 66 74 73 35 57 72 69   bFlag = fts5Wri
17050 74 65 46 6c 75 73 68 44 6c 69 64 78 28 70 2c 20  teFlushDlidx(p, 
17060 70 57 72 69 74 65 72 29 3b 0a 0a 20 20 69 66 28  pWriter);..  if(
17070 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
17080 4b 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63  K ){.    const c
17090 68 61 72 20 2a 7a 20 3d 20 28 70 57 72 69 74 65  har *z = (pWrite
170a0 72 2d 3e 62 74 74 65 72 6d 2e 6e 3e 30 3f 28 63  r->btterm.n>0?(c
170b0 6f 6e 73 74 20 63 68 61 72 2a 29 70 57 72 69 74  onst char*)pWrit
170c0 65 72 2d 3e 62 74 74 65 72 6d 2e 70 3a 22 22 29  er->btterm.p:"")
170d0 3b 0a 20 20 20 20 2f 2a 20 54 68 65 20 66 6f 6c  ;.    /* The fol
170e0 6c 6f 77 69 6e 67 20 77 61 73 20 61 6c 72 65 61  lowing was alrea
170f0 64 79 20 64 6f 6e 65 20 69 6e 20 66 74 73 35 57  dy done in fts5W
17100 72 69 74 65 49 6e 69 74 28 29 3a 20 2a 2f 0a 20  riteInit(): */. 
17110 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f 62 69     /* sqlite3_bi
17120 6e 64 5f 69 6e 74 28 70 2d 3e 70 49 64 78 57 72  nd_int(p->pIdxWr
17130 69 74 65 72 2c 20 31 2c 20 70 57 72 69 74 65 72  iter, 1, pWriter
17140 2d 3e 69 53 65 67 69 64 29 3b 20 2a 2f 0a 20 20  ->iSegid); */.  
17150 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 62    sqlite3_bind_b
17160 6c 6f 62 28 70 2d 3e 70 49 64 78 57 72 69 74 65  lob(p->pIdxWrite
17170 72 2c 20 32 2c 20 7a 2c 20 70 57 72 69 74 65 72  r, 2, z, pWriter
17180 2d 3e 62 74 74 65 72 6d 2e 6e 2c 20 53 51 4c 49  ->btterm.n, SQLI
17190 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20  TE_STATIC);.    
171a0 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74  sqlite3_bind_int
171b0 36 34 28 70 2d 3e 70 49 64 78 57 72 69 74 65 72  64(p->pIdxWriter
171c0 2c 20 33 2c 20 62 46 6c 61 67 20 2b 20 28 28 69  , 3, bFlag + ((i
171d0 36 34 29 70 57 72 69 74 65 72 2d 3e 69 42 74 50  64)pWriter->iBtP
171e0 61 67 65 3c 3c 31 29 29 3b 0a 20 20 20 20 73 71  age<<1));.    sq
171f0 6c 69 74 65 33 5f 73 74 65 70 28 70 2d 3e 70 49  lite3_step(p->pI
17200 64 78 57 72 69 74 65 72 29 3b 0a 20 20 20 20 70  dxWriter);.    p
17210 2d 3e 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 72  ->rc = sqlite3_r
17220 65 73 65 74 28 70 2d 3e 70 49 64 78 57 72 69 74  eset(p->pIdxWrit
17230 65 72 29 3b 0a 20 20 7d 0a 20 20 70 57 72 69 74  er);.  }.  pWrit
17240 65 72 2d 3e 69 42 74 50 61 67 65 20 3d 20 30 3b  er->iBtPage = 0;
17250 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69  .}../*.** This i
17260 73 20 63 61 6c 6c 65 64 20 6f 6e 63 65 20 66 6f  s called once fo
17270 72 20 65 61 63 68 20 6c 65 61 66 20 70 61 67 65  r each leaf page
17280 20 65 78 63 65 70 74 20 74 68 65 20 66 69 72 73   except the firs
17290 74 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 0a  t that contains.
172a0 2a 2a 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20  ** at least one 
172b0 74 65 72 6d 2e 20 41 72 67 75 6d 65 6e 74 20 28  term. Argument (
172c0 6e 54 65 72 6d 2f 70 54 65 72 6d 29 20 69 73 20  nTerm/pTerm) is 
172d0 74 68 65 20 73 70 6c 69 74 2d 6b 65 79 20 2d 20  the split-key - 
172e0 61 20 74 65 72 6d 20 74 68 61 74 0a 2a 2a 20 69  a term that.** i
172f0 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20 61 6c  s larger than al
17300 6c 20 74 65 72 6d 73 20 77 72 69 74 74 65 6e 20  l terms written 
17310 74 6f 20 65 61 72 6c 69 65 72 20 6c 65 61 76 65  to earlier leave
17320 73 2c 20 61 6e 64 20 65 71 75 61 6c 20 74 6f 20  s, and equal to 
17330 6f 72 0a 2a 2a 20 73 6d 61 6c 6c 65 72 20 74 68  or.** smaller th
17340 61 6e 20 74 68 65 20 66 69 72 73 74 20 74 65 72  an the first ter
17350 6d 20 6f 6e 20 74 68 65 20 6e 65 77 20 6c 65 61  m on the new lea
17360 66 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65  f..**.** If an e
17370 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 61 6e 20  rror occurs, an 
17380 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 6c 65  error code is le
17390 66 74 20 69 6e 20 46 74 73 35 49 6e 64 65 78 2e  ft in Fts5Index.
173a0 72 63 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 0a  rc. If an error.
173b0 2a 2a 20 68 61 73 20 61 6c 72 65 61 64 79 20 6f  ** has already o
173c0 63 63 75 72 72 65 64 20 77 68 65 6e 20 74 68 69  ccurred when thi
173d0 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
173e0 6c 6c 65 64 2c 20 69 74 20 69 73 20 61 20 6e 6f  lled, it is a no
173f0 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  -op..*/.static v
17400 6f 69 64 20 66 74 73 35 57 72 69 74 65 42 74 72  oid fts5WriteBtr
17410 65 65 54 65 72 6d 28 0a 20 20 46 74 73 35 49 6e  eeTerm(.  Fts5In
17420 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20 20  dex *p,         
17430 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53            /* FTS
17440 35 20 62 61 63 6b 65 6e 64 20 6f 62 6a 65 63 74  5 backend object
17450 20 2a 2f 0a 20 20 46 74 73 35 53 65 67 57 72 69   */.  Fts5SegWri
17460 74 65 72 20 2a 70 57 72 69 74 65 72 2c 20 20 20  ter *pWriter,   
17470 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 72 20        /* Writer 
17480 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20  object */.  int 
17490 6e 54 65 72 6d 2c 20 63 6f 6e 73 74 20 75 38 20  nTerm, const u8 
174a0 2a 70 54 65 72 6d 20 20 20 20 20 20 2f 2a 20 46  *pTerm      /* F
174b0 69 72 73 74 20 74 65 72 6d 20 6f 6e 20 6e 65 77  irst term on new
174c0 20 70 61 67 65 20 2a 2f 0a 29 7b 0a 20 20 66 74   page */.){.  ft
174d0 73 35 57 72 69 74 65 46 6c 75 73 68 42 74 72 65  s5WriteFlushBtre
174e0 65 28 70 2c 20 70 57 72 69 74 65 72 29 3b 0a 20  e(p, pWriter);. 
174f0 20 66 74 73 35 42 75 66 66 65 72 53 65 74 28 26   fts5BufferSet(&
17500 70 2d 3e 72 63 2c 20 26 70 57 72 69 74 65 72 2d  p->rc, &pWriter-
17510 3e 62 74 74 65 72 6d 2c 20 6e 54 65 72 6d 2c 20  >btterm, nTerm, 
17520 70 54 65 72 6d 29 3b 0a 20 20 70 57 72 69 74 65  pTerm);.  pWrite
17530 72 2d 3e 69 42 74 50 61 67 65 20 3d 20 70 57 72  r->iBtPage = pWr
17540 69 74 65 72 2d 3e 77 72 69 74 65 72 2e 70 67 6e  iter->writer.pgn
17550 6f 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  o;.}../*.** This
17560 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
17570 6c 65 64 20 77 68 65 6e 20 66 6c 75 73 68 69 6e  led when flushin
17580 67 20 61 20 6c 65 61 66 20 70 61 67 65 20 74 68  g a leaf page th
17590 61 74 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 0a 2a  at contains no.*
175a0 2a 20 74 65 72 6d 73 20 61 74 20 61 6c 6c 20 74  * terms at all t
175b0 6f 20 64 69 73 6b 2e 0a 2a 2f 0a 73 74 61 74 69  o disk..*/.stati
175c0 63 20 76 6f 69 64 20 66 74 73 35 57 72 69 74 65  c void fts5Write
175d0 42 74 72 65 65 4e 6f 54 65 72 6d 28 0a 20 20 46  BtreeNoTerm(.  F
175e0 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20  ts5Index *p,    
175f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
17600 2a 20 46 54 53 35 20 62 61 63 6b 65 6e 64 20 6f  * FTS5 backend o
17610 62 6a 65 63 74 20 2a 2f 0a 20 20 46 74 73 35 53  bject */.  Fts5S
17620 65 67 57 72 69 74 65 72 20 2a 70 57 72 69 74 65  egWriter *pWrite
17630 72 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72  r          /* Wr
17640 69 74 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 29  iter object */.)
17650 7b 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20  {.  /* If there 
17660 77 65 72 65 20 6e 6f 20 72 6f 77 69 64 73 20 6f  were no rowids o
17670 6e 20 74 68 65 20 6c 65 61 66 20 70 61 67 65 20  n the leaf page 
17680 65 69 74 68 65 72 20 61 6e 64 20 74 68 65 20 64  either and the d
17690 6f 63 6c 69 73 74 2d 69 6e 64 65 78 0a 20 20 2a  oclist-index.  *
176a0 2a 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65  * has already be
176b0 65 6e 20 73 74 61 72 74 65 64 2c 20 61 70 70 65  en started, appe
176c0 6e 64 20 61 6e 20 30 78 30 30 20 62 79 74 65 20  nd an 0x00 byte 
176d0 74 6f 20 69 74 2e 20 20 2a 2f 0a 20 20 69 66 28  to it.  */.  if(
176e0 20 70 57 72 69 74 65 72 2d 3e 62 46 69 72 73 74   pWriter->bFirst
176f0 52 6f 77 69 64 49 6e 50 61 67 65 20 26 26 20 70  RowidInPage && p
17700 57 72 69 74 65 72 2d 3e 61 44 6c 69 64 78 5b 30  Writer->aDlidx[0
17710 5d 2e 62 75 66 2e 6e 3e 30 20 29 7b 0a 20 20 20  ].buf.n>0 ){.   
17720 20 46 74 73 35 44 6c 69 64 78 57 72 69 74 65 72   Fts5DlidxWriter
17730 20 2a 70 44 6c 69 64 78 20 3d 20 26 70 57 72 69   *pDlidx = &pWri
17740 74 65 72 2d 3e 61 44 6c 69 64 78 5b 30 5d 3b 0a  ter->aDlidx[0];.
17750 20 20 20 20 61 73 73 65 72 74 28 20 70 44 6c 69      assert( pDli
17760 64 78 2d 3e 62 50 72 65 76 56 61 6c 69 64 20 29  dx->bPrevValid )
17770 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 46 74 73  ;.    sqlite3Fts
17780 35 42 75 66 66 65 72 41 70 70 65 6e 64 56 61 72  5BufferAppendVar
17790 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26 70 44 6c  int(&p->rc, &pDl
177a0 69 64 78 2d 3e 62 75 66 2c 20 30 29 3b 0a 20 20  idx->buf, 0);.  
177b0 7d 0a 0a 20 20 2f 2a 20 49 6e 63 72 65 6d 65 6e  }..  /* Incremen
177c0 74 20 74 68 65 20 22 6e 75 6d 62 65 72 20 6f 66  t the "number of
177d0 20 73 65 71 75 65 6e 74 69 61 6c 20 6c 65 61 76   sequential leav
177e0 65 73 20 77 69 74 68 6f 75 74 20 61 20 74 65 72  es without a ter
177f0 6d 22 20 63 6f 75 6e 74 65 72 2e 20 2a 2f 0a 20  m" counter. */. 
17800 20 70 57 72 69 74 65 72 2d 3e 6e 45 6d 70 74 79   pWriter->nEmpty
17810 2b 2b 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 36  ++;.}..static i6
17820 34 20 66 74 73 35 44 6c 69 64 78 45 78 74 72 61  4 fts5DlidxExtra
17830 63 74 46 69 72 73 74 52 6f 77 69 64 28 46 74 73  ctFirstRowid(Fts
17840 35 42 75 66 66 65 72 20 2a 70 42 75 66 29 7b 0a  5Buffer *pBuf){.
17850 20 20 69 36 34 20 69 52 6f 77 69 64 3b 0a 20 20    i64 iRowid;.  
17860 69 6e 74 20 69 4f 66 66 3b 0a 0a 20 20 69 4f 66  int iOff;..  iOf
17870 66 20 3d 20 31 20 2b 20 66 74 73 35 47 65 74 56  f = 1 + fts5GetV
17880 61 72 69 6e 74 28 26 70 42 75 66 2d 3e 70 5b 31  arint(&pBuf->p[1
17890 5d 2c 20 28 75 36 34 2a 29 26 69 52 6f 77 69 64  ], (u64*)&iRowid
178a0 29 3b 0a 20 20 66 74 73 35 47 65 74 56 61 72 69  );.  fts5GetVari
178b0 6e 74 28 26 70 42 75 66 2d 3e 70 5b 69 4f 66 66  nt(&pBuf->p[iOff
178c0 5d 2c 20 28 75 36 34 2a 29 26 69 52 6f 77 69 64  ], (u64*)&iRowid
178d0 29 3b 0a 20 20 72 65 74 75 72 6e 20 69 52 6f 77  );.  return iRow
178e0 69 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 77  id;.}../*.** Row
178f0 69 64 20 69 52 6f 77 69 64 20 68 61 73 20 6a 75  id iRowid has ju
17900 73 74 20 62 65 65 6e 20 61 70 70 65 6e 64 65 64  st been appended
17910 20 74 6f 20 74 68 65 20 63 75 72 72 65 6e 74 20   to the current 
17920 6c 65 61 66 20 70 61 67 65 2e 20 49 74 20 69 73  leaf page. It is
17930 20 74 68 65 0a 2a 2a 20 66 69 72 73 74 20 6f 6e   the.** first on
17940 20 74 68 65 20 70 61 67 65 2e 20 54 68 69 73 20   the page. This 
17950 66 75 6e 63 74 69 6f 6e 20 61 70 70 65 6e 64 73  function appends
17960 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65 20   an appropriate 
17970 65 6e 74 72 79 20 74 6f 20 74 68 65 20 63 75 72  entry to the cur
17980 72 65 6e 74 0a 2a 2a 20 64 6f 63 6c 69 73 74 2d  rent.** doclist-
17990 69 6e 64 65 78 2e 0a 2a 2f 0a 73 74 61 74 69 63  index..*/.static
179a0 20 76 6f 69 64 20 66 74 73 35 57 72 69 74 65 44   void fts5WriteD
179b0 6c 69 64 78 41 70 70 65 6e 64 28 0a 20 20 46 74  lidxAppend(.  Ft
179c0 73 35 49 6e 64 65 78 20 2a 70 2c 20 0a 20 20 46  s5Index *p, .  F
179d0 74 73 35 53 65 67 57 72 69 74 65 72 20 2a 70 57  ts5SegWriter *pW
179e0 72 69 74 65 72 2c 20 0a 20 20 69 36 34 20 69 52  riter, .  i64 iR
179f0 6f 77 69 64 0a 29 7b 0a 20 20 69 6e 74 20 69 3b  owid.){.  int i;
17a00 0a 20 20 69 6e 74 20 62 44 6f 6e 65 20 3d 20 30  .  int bDone = 0
17a10 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20 70 2d  ;..  for(i=0; p-
17a20 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26  >rc==SQLITE_OK &
17a30 26 20 62 44 6f 6e 65 3d 3d 30 3b 20 69 2b 2b 29  & bDone==0; i++)
17a40 7b 0a 20 20 20 20 69 36 34 20 69 56 61 6c 3b 0a  {.    i64 iVal;.
17a50 20 20 20 20 46 74 73 35 44 6c 69 64 78 57 72 69      Fts5DlidxWri
17a60 74 65 72 20 2a 70 44 6c 69 64 78 20 3d 20 26 70  ter *pDlidx = &p
17a70 57 72 69 74 65 72 2d 3e 61 44 6c 69 64 78 5b 69  Writer->aDlidx[i
17a80 5d 3b 0a 0a 20 20 20 20 69 66 28 20 70 44 6c 69  ];..    if( pDli
17a90 64 78 2d 3e 62 75 66 2e 6e 3e 3d 70 2d 3e 70 43  dx->buf.n>=p->pC
17aa0 6f 6e 66 69 67 2d 3e 70 67 73 7a 20 29 7b 0a 20  onfig->pgsz ){. 
17ab0 20 20 20 20 20 2f 2a 20 54 68 65 20 63 75 72 72       /* The curr
17ac0 65 6e 74 20 64 6f 63 6c 69 73 74 2d 69 6e 64 65  ent doclist-inde
17ad0 78 20 70 61 67 65 20 69 73 20 66 75 6c 6c 2e 20  x page is full. 
17ae0 57 72 69 74 65 20 69 74 20 74 6f 20 64 69 73 6b  Write it to disk
17af0 20 61 6e 64 20 70 75 73 68 0a 20 20 20 20 20 20   and push.      
17b00 2a 2a 20 61 20 63 6f 70 79 20 6f 66 20 69 52 6f  ** a copy of iRo
17b10 77 69 64 20 28 77 68 69 63 68 20 77 69 6c 6c 20  wid (which will 
17b20 62 65 63 6f 6d 65 20 74 68 65 20 66 69 72 73 74  become the first
17b30 20 72 6f 77 69 64 20 6f 6e 20 74 68 65 20 6e 65   rowid on the ne
17b40 78 74 0a 20 20 20 20 20 20 2a 2a 20 64 6f 63 6c  xt.      ** docl
17b50 69 73 74 2d 69 6e 64 65 78 20 6c 65 61 66 20 70  ist-index leaf p
17b60 61 67 65 29 20 75 70 20 69 6e 74 6f 20 74 68 65  age) up into the
17b70 20 6e 65 78 74 20 6c 65 76 65 6c 20 6f 66 20 74   next level of t
17b80 68 65 20 62 2d 74 72 65 65 20 0a 20 20 20 20 20  he b-tree .     
17b90 20 2a 2a 20 68 69 65 72 61 72 63 68 79 2e 20 49   ** hierarchy. I
17ba0 66 20 74 68 65 20 6e 6f 64 65 20 62 65 69 6e 67  f the node being
17bb0 20 66 6c 75 73 68 65 64 20 69 73 20 63 75 72 72   flushed is curr
17bc0 65 6e 74 6c 79 20 74 68 65 20 72 6f 6f 74 20 6e  ently the root n
17bd0 6f 64 65 2c 0a 20 20 20 20 20 20 2a 2a 20 61 6c  ode,.      ** al
17be0 73 6f 20 70 75 73 68 20 69 74 73 20 66 69 72 73  so push its firs
17bf0 74 20 72 6f 77 69 64 20 75 70 77 61 72 64 73 2e  t rowid upwards.
17c00 20 2a 2f 0a 20 20 20 20 20 20 70 44 6c 69 64 78   */.      pDlidx
17c10 2d 3e 62 75 66 2e 70 5b 30 5d 20 3d 20 30 78 30  ->buf.p[0] = 0x0
17c20 31 3b 20 20 20 20 2f 2a 20 4e 6f 74 20 74 68 65  1;    /* Not the
17c30 20 72 6f 6f 74 20 6e 6f 64 65 20 2a 2f 0a 20 20   root node */.  
17c40 20 20 20 20 66 74 73 35 44 61 74 61 57 72 69 74      fts5DataWrit
17c50 65 28 70 2c 20 0a 20 20 20 20 20 20 20 20 20 20  e(p, .          
17c60 46 54 53 35 5f 44 4c 49 44 58 5f 52 4f 57 49 44  FTS5_DLIDX_ROWID
17c70 28 70 57 72 69 74 65 72 2d 3e 69 53 65 67 69 64  (pWriter->iSegid
17c80 2c 20 69 2c 20 70 44 6c 69 64 78 2d 3e 70 67 6e  , i, pDlidx->pgn
17c90 6f 29 2c 0a 20 20 20 20 20 20 20 20 20 20 70 44  o),.          pD
17ca0 6c 69 64 78 2d 3e 62 75 66 2e 70 2c 20 70 44 6c  lidx->buf.p, pDl
17cb0 69 64 78 2d 3e 62 75 66 2e 6e 0a 20 20 20 20 20  idx->buf.n.     
17cc0 20 29 3b 0a 20 20 20 20 20 20 66 74 73 35 57 72   );.      fts5Wr
17cd0 69 74 65 44 6c 69 64 78 47 72 6f 77 28 70 2c 20  iteDlidxGrow(p, 
17ce0 70 57 72 69 74 65 72 2c 20 69 2b 32 29 3b 0a 20  pWriter, i+2);. 
17cf0 20 20 20 20 20 70 44 6c 69 64 78 20 3d 20 26 70       pDlidx = &p
17d00 57 72 69 74 65 72 2d 3e 61 44 6c 69 64 78 5b 69  Writer->aDlidx[i
17d10 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e  ];.      if( p->
17d20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
17d30 20 70 44 6c 69 64 78 5b 31 5d 2e 62 75 66 2e 6e   pDlidx[1].buf.n
17d40 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69  ==0 ){.        i
17d50 36 34 20 69 46 69 72 73 74 20 3d 20 66 74 73 35  64 iFirst = fts5
17d60 44 6c 69 64 78 45 78 74 72 61 63 74 46 69 72 73  DlidxExtractFirs
17d70 74 52 6f 77 69 64 28 26 70 44 6c 69 64 78 2d 3e  tRowid(&pDlidx->
17d80 62 75 66 29 3b 0a 0a 20 20 20 20 20 20 20 20 2f  buf);..        /
17d90 2a 20 54 68 69 73 20 77 61 73 20 74 68 65 20 72  * This was the r
17da0 6f 6f 74 20 6e 6f 64 65 2e 20 50 75 73 68 20 69  oot node. Push i
17db0 74 73 20 66 69 72 73 74 20 72 6f 77 69 64 20 75  ts first rowid u
17dc0 70 20 74 6f 20 74 68 65 20 6e 65 77 20 72 6f 6f  p to the new roo
17dd0 74 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 44  t. */.        pD
17de0 6c 69 64 78 5b 31 5d 2e 70 67 6e 6f 20 3d 20 70  lidx[1].pgno = p
17df0 44 6c 69 64 78 2d 3e 70 67 6e 6f 3b 0a 20 20 20  Dlidx->pgno;.   
17e00 20 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35       sqlite3Fts5
17e10 42 75 66 66 65 72 41 70 70 65 6e 64 56 61 72 69  BufferAppendVari
17e20 6e 74 28 26 70 2d 3e 72 63 2c 20 26 70 44 6c 69  nt(&p->rc, &pDli
17e30 64 78 5b 31 5d 2e 62 75 66 2c 20 30 29 3b 0a 20  dx[1].buf, 0);. 
17e40 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 46 74         sqlite3Ft
17e50 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 56 61  s5BufferAppendVa
17e60 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26 70 44  rint(&p->rc, &pD
17e70 6c 69 64 78 5b 31 5d 2e 62 75 66 2c 20 70 44 6c  lidx[1].buf, pDl
17e80 69 64 78 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20  idx->pgno);.    
17e90 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 42      sqlite3Fts5B
17ea0 75 66 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e  ufferAppendVarin
17eb0 74 28 26 70 2d 3e 72 63 2c 20 26 70 44 6c 69 64  t(&p->rc, &pDlid
17ec0 78 5b 31 5d 2e 62 75 66 2c 20 69 46 69 72 73 74  x[1].buf, iFirst
17ed0 29 3b 0a 20 20 20 20 20 20 20 20 70 44 6c 69 64  );.        pDlid
17ee0 78 5b 31 5d 2e 62 50 72 65 76 56 61 6c 69 64 20  x[1].bPrevValid 
17ef0 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 70 44 6c  = 1;.        pDl
17f00 69 64 78 5b 31 5d 2e 69 50 72 65 76 20 3d 20 69  idx[1].iPrev = i
17f10 46 69 72 73 74 3b 0a 20 20 20 20 20 20 7d 0a 0a  First;.      }..
17f20 20 20 20 20 20 20 73 71 6c 69 74 65 33 46 74 73        sqlite3Fts
17f30 35 42 75 66 66 65 72 5a 65 72 6f 28 26 70 44 6c  5BufferZero(&pDl
17f40 69 64 78 2d 3e 62 75 66 29 3b 0a 20 20 20 20 20  idx->buf);.     
17f50 20 70 44 6c 69 64 78 2d 3e 62 50 72 65 76 56 61   pDlidx->bPrevVa
17f60 6c 69 64 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  lid = 0;.      p
17f70 44 6c 69 64 78 2d 3e 70 67 6e 6f 2b 2b 3b 0a 20  Dlidx->pgno++;. 
17f80 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
17f90 62 44 6f 6e 65 20 3d 20 31 3b 0a 20 20 20 20 7d  bDone = 1;.    }
17fa0 0a 0a 20 20 20 20 69 66 28 20 70 44 6c 69 64 78  ..    if( pDlidx
17fb0 2d 3e 62 50 72 65 76 56 61 6c 69 64 20 29 7b 0a  ->bPrevValid ){.
17fc0 20 20 20 20 20 20 69 56 61 6c 20 3d 20 69 52 6f        iVal = iRo
17fd0 77 69 64 20 2d 20 70 44 6c 69 64 78 2d 3e 69 50  wid - pDlidx->iP
17fe0 72 65 76 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  rev;.    }else{.
17ff0 20 20 20 20 20 20 69 36 34 20 69 50 67 6e 6f 20        i64 iPgno 
18000 3d 20 28 69 3d 3d 30 20 3f 20 70 57 72 69 74 65  = (i==0 ? pWrite
18010 72 2d 3e 77 72 69 74 65 72 2e 70 67 6e 6f 20 3a  r->writer.pgno :
18020 20 70 44 6c 69 64 78 5b 2d 31 5d 2e 70 67 6e 6f   pDlidx[-1].pgno
18030 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
18040 20 70 44 6c 69 64 78 2d 3e 62 75 66 2e 6e 3d 3d   pDlidx->buf.n==
18050 30 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 );.      sqlit
18060 65 33 46 74 73 35 42 75 66 66 65 72 41 70 70 65  e3Fts5BufferAppe
18070 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c  ndVarint(&p->rc,
18080 20 26 70 44 6c 69 64 78 2d 3e 62 75 66 2c 20 21   &pDlidx->buf, !
18090 62 44 6f 6e 65 29 3b 0a 20 20 20 20 20 20 73 71  bDone);.      sq
180a0 6c 69 74 65 33 46 74 73 35 42 75 66 66 65 72 41  lite3Fts5BufferA
180b0 70 70 65 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e  ppendVarint(&p->
180c0 72 63 2c 20 26 70 44 6c 69 64 78 2d 3e 62 75 66  rc, &pDlidx->buf
180d0 2c 20 69 50 67 6e 6f 29 3b 0a 20 20 20 20 20 20  , iPgno);.      
180e0 69 56 61 6c 20 3d 20 69 52 6f 77 69 64 3b 0a 20  iVal = iRowid;. 
180f0 20 20 20 7d 0a 0a 20 20 20 20 73 71 6c 69 74 65     }..    sqlite
18100 33 46 74 73 35 42 75 66 66 65 72 41 70 70 65 6e  3Fts5BufferAppen
18110 64 56 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20  dVarint(&p->rc, 
18120 26 70 44 6c 69 64 78 2d 3e 62 75 66 2c 20 69 56  &pDlidx->buf, iV
18130 61 6c 29 3b 0a 20 20 20 20 70 44 6c 69 64 78 2d  al);.    pDlidx-
18140 3e 62 50 72 65 76 56 61 6c 69 64 20 3d 20 31 3b  >bPrevValid = 1;
18150 0a 20 20 20 20 70 44 6c 69 64 78 2d 3e 69 50 72  .    pDlidx->iPr
18160 65 76 20 3d 20 69 52 6f 77 69 64 3b 0a 20 20 7d  ev = iRowid;.  }
18170 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .}..static void 
18180 66 74 73 35 57 72 69 74 65 46 6c 75 73 68 4c 65  fts5WriteFlushLe
18190 61 66 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c  af(Fts5Index *p,
181a0 20 46 74 73 35 53 65 67 57 72 69 74 65 72 20 2a   Fts5SegWriter *
181b0 70 57 72 69 74 65 72 29 7b 0a 20 20 73 74 61 74  pWriter){.  stat
181c0 69 63 20 63 6f 6e 73 74 20 75 38 20 7a 65 72 6f  ic const u8 zero
181d0 5b 5d 20 3d 20 7b 20 30 78 30 30 2c 20 30 78 30  [] = { 0x00, 0x0
181e0 30 2c 20 30 78 30 30 2c 20 30 78 30 30 20 7d 3b  0, 0x00, 0x00 };
181f0 0a 20 20 46 74 73 35 50 61 67 65 57 72 69 74 65  .  Fts5PageWrite
18200 72 20 2a 70 50 61 67 65 20 3d 20 26 70 57 72 69  r *pPage = &pWri
18210 74 65 72 2d 3e 77 72 69 74 65 72 3b 0a 20 20 69  ter->writer;.  i
18220 36 34 20 69 52 6f 77 69 64 3b 0a 0a 20 20 61 73  64 iRowid;..  as
18230 73 65 72 74 28 20 28 70 50 61 67 65 2d 3e 70 67  sert( (pPage->pg
18240 69 64 78 2e 6e 3d 3d 30 29 3d 3d 28 70 57 72 69  idx.n==0)==(pWri
18250 74 65 72 2d 3e 62 46 69 72 73 74 54 65 72 6d 49  ter->bFirstTermI
18260 6e 50 61 67 65 29 20 29 3b 0a 0a 20 20 2f 2a 20  nPage) );..  /* 
18270 53 65 74 20 74 68 65 20 73 7a 4c 65 61 66 20 68  Set the szLeaf h
18280 65 61 64 65 72 20 66 69 65 6c 64 2e 20 2a 2f 0a  eader field. */.
18290 20 20 61 73 73 65 72 74 28 20 30 3d 3d 66 74 73    assert( 0==fts
182a0 35 47 65 74 55 31 36 28 26 70 50 61 67 65 2d 3e  5GetU16(&pPage->
182b0 62 75 66 2e 70 5b 32 5d 29 20 29 3b 0a 20 20 66  buf.p[2]) );.  f
182c0 74 73 35 50 75 74 55 31 36 28 26 70 50 61 67 65  ts5PutU16(&pPage
182d0 2d 3e 62 75 66 2e 70 5b 32 5d 2c 20 70 50 61 67  ->buf.p[2], pPag
182e0 65 2d 3e 62 75 66 2e 6e 29 3b 0a 0a 20 20 69 66  e->buf.n);..  if
182f0 28 20 70 57 72 69 74 65 72 2d 3e 62 46 69 72 73  ( pWriter->bFirs
18300 74 54 65 72 6d 49 6e 50 61 67 65 20 29 7b 0a 20  tTermInPage ){. 
18310 20 20 20 2f 2a 20 4e 6f 20 74 65 72 6d 20 77 61     /* No term wa
18320 73 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 69  s written to thi
18330 73 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20 61  s page. */.    a
18340 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70 67  ssert( pPage->pg
18350 69 64 78 2e 6e 3d 3d 30 20 29 3b 0a 20 20 20 20  idx.n==0 );.    
18360 66 74 73 35 57 72 69 74 65 42 74 72 65 65 4e 6f  fts5WriteBtreeNo
18370 54 65 72 6d 28 70 2c 20 70 57 72 69 74 65 72 29  Term(p, pWriter)
18380 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  ;.  }else{.    /
18390 2a 20 41 70 70 65 6e 64 20 74 68 65 20 70 67 69  * Append the pgi
183a0 64 78 20 74 6f 20 74 68 65 20 70 61 67 65 20 62  dx to the page b
183b0 75 66 66 65 72 2e 20 53 65 74 20 74 68 65 20 73  uffer. Set the s
183c0 7a 4c 65 61 66 20 68 65 61 64 65 72 20 66 69 65  zLeaf header fie
183d0 6c 64 2e 20 2a 2f 0a 20 20 20 20 66 74 73 35 42  ld. */.    fts5B
183e0 75 66 66 65 72 41 70 70 65 6e 64 42 6c 6f 62 28  ufferAppendBlob(
183f0 26 70 2d 3e 72 63 2c 20 26 70 50 61 67 65 2d 3e  &p->rc, &pPage->
18400 62 75 66 2c 20 70 50 61 67 65 2d 3e 70 67 69 64  buf, pPage->pgid
18410 78 2e 6e 2c 20 70 50 61 67 65 2d 3e 70 67 69 64  x.n, pPage->pgid
18420 78 2e 70 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  x.p);.  }..  /* 
18430 57 72 69 74 65 20 74 68 65 20 70 61 67 65 20 6f  Write the page o
18440 75 74 20 74 6f 20 64 69 73 6b 20 2a 2f 0a 20 20  ut to disk */.  
18450 69 52 6f 77 69 64 20 3d 20 46 54 53 35 5f 53 45  iRowid = FTS5_SE
18460 47 4d 45 4e 54 5f 52 4f 57 49 44 28 70 57 72 69  GMENT_ROWID(pWri
18470 74 65 72 2d 3e 69 53 65 67 69 64 2c 20 70 50 61  ter->iSegid, pPa
18480 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20 20 66 74 73  ge->pgno);.  fts
18490 35 44 61 74 61 57 72 69 74 65 28 70 2c 20 69 52  5DataWrite(p, iR
184a0 6f 77 69 64 2c 20 70 50 61 67 65 2d 3e 62 75 66  owid, pPage->buf
184b0 2e 70 2c 20 70 50 61 67 65 2d 3e 62 75 66 2e 6e  .p, pPage->buf.n
184c0 29 3b 0a 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c  );..  /* Initial
184d0 69 7a 65 20 74 68 65 20 6e 65 78 74 20 70 61 67  ize the next pag
184e0 65 2e 20 2a 2f 0a 20 20 66 74 73 35 42 75 66 66  e. */.  fts5Buff
184f0 65 72 5a 65 72 6f 28 26 70 50 61 67 65 2d 3e 62  erZero(&pPage->b
18500 75 66 29 3b 0a 20 20 66 74 73 35 42 75 66 66 65  uf);.  fts5Buffe
18510 72 5a 65 72 6f 28 26 70 50 61 67 65 2d 3e 70 67  rZero(&pPage->pg
18520 69 64 78 29 3b 0a 20 20 66 74 73 35 42 75 66 66  idx);.  fts5Buff
18530 65 72 41 70 70 65 6e 64 42 6c 6f 62 28 26 70 2d  erAppendBlob(&p-
18540 3e 72 63 2c 20 26 70 50 61 67 65 2d 3e 62 75 66  >rc, &pPage->buf
18550 2c 20 34 2c 20 7a 65 72 6f 29 3b 0a 20 20 70 50  , 4, zero);.  pP
18560 61 67 65 2d 3e 69 50 72 65 76 50 67 69 64 78 20  age->iPrevPgidx 
18570 3d 20 30 3b 0a 20 20 70 50 61 67 65 2d 3e 70 67  = 0;.  pPage->pg
18580 6e 6f 2b 2b 3b 0a 0a 20 20 2f 2a 20 49 6e 63 72  no++;..  /* Incr
18590 65 61 73 65 20 74 68 65 20 6c 65 61 76 65 73 20  ease the leaves 
185a0 77 72 69 74 74 65 6e 20 63 6f 75 6e 74 65 72 20  written counter 
185b0 2a 2f 0a 20 20 70 57 72 69 74 65 72 2d 3e 6e 4c  */.  pWriter->nL
185c0 65 61 66 57 72 69 74 74 65 6e 2b 2b 3b 0a 0a 20  eafWritten++;.. 
185d0 20 2f 2a 20 54 68 65 20 6e 65 77 20 6c 65 61 66   /* The new leaf
185e0 20 68 6f 6c 64 73 20 6e 6f 20 74 65 72 6d 73 20   holds no terms 
185f0 6f 72 20 72 6f 77 69 64 73 20 2a 2f 0a 20 20 70  or rowids */.  p
18600 57 72 69 74 65 72 2d 3e 62 46 69 72 73 74 54 65  Writer->bFirstTe
18610 72 6d 49 6e 50 61 67 65 20 3d 20 31 3b 0a 20 20  rmInPage = 1;.  
18620 70 57 72 69 74 65 72 2d 3e 62 46 69 72 73 74 52  pWriter->bFirstR
18630 6f 77 69 64 49 6e 50 61 67 65 20 3d 20 31 3b 0a  owidInPage = 1;.
18640 7d 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64 20  }../*.** Append 
18650 74 65 72 6d 20 70 54 65 72 6d 2f 6e 54 65 72 6d  term pTerm/nTerm
18660 20 74 6f 20 74 68 65 20 73 65 67 6d 65 6e 74 20   to the segment 
18670 62 65 69 6e 67 20 77 72 69 74 74 65 6e 20 62 79  being written by
18680 20 74 68 65 20 77 72 69 74 65 72 20 70 61 73 73   the writer pass
18690 65 64 0a 2a 2a 20 61 73 20 74 68 65 20 73 65 63  ed.** as the sec
186a0 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a  ond argument..**
186b0 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20  .** If an error 
186c0 6f 63 63 75 72 73 2c 20 73 65 74 20 74 68 65 20  occurs, set the 
186d0 46 74 73 35 49 6e 64 65 78 2e 72 63 20 65 72 72  Fts5Index.rc err
186e0 6f 72 20 63 6f 64 65 2e 20 49 66 20 61 6e 20 65  or code. If an e
186f0 72 72 6f 72 20 68 61 73 20 0a 2a 2a 20 61 6c 72  rror has .** alr
18700 65 61 64 79 20 6f 63 63 75 72 72 65 64 2c 20 74  eady occurred, t
18710 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
18720 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74  a no-op..*/.stat
18730 69 63 20 76 6f 69 64 20 66 74 73 35 57 72 69 74  ic void fts5Writ
18740 65 41 70 70 65 6e 64 54 65 72 6d 28 0a 20 20 46  eAppendTerm(.  F
18750 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 0a 20 20  ts5Index *p, .  
18760 46 74 73 35 53 65 67 57 72 69 74 65 72 20 2a 70  Fts5SegWriter *p
18770 57 72 69 74 65 72 2c 0a 20 20 69 6e 74 20 6e 54  Writer,.  int nT
18780 65 72 6d 2c 20 63 6f 6e 73 74 20 75 38 20 2a 70  erm, const u8 *p
18790 54 65 72 6d 20 0a 29 7b 0a 20 20 69 6e 74 20 6e  Term .){.  int n
187a0 50 72 65 66 69 78 3b 20 20 20 20 20 20 20 20 20  Prefix;         
187b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79             /* By
187c0 74 65 73 20 6f 66 20 70 72 65 66 69 78 20 63 6f  tes of prefix co
187d0 6d 70 72 65 73 73 69 6f 6e 20 66 6f 72 20 74 65  mpression for te
187e0 72 6d 20 2a 2f 0a 20 20 46 74 73 35 50 61 67 65  rm */.  Fts5Page
187f0 57 72 69 74 65 72 20 2a 70 50 61 67 65 20 3d 20  Writer *pPage = 
18800 26 70 57 72 69 74 65 72 2d 3e 77 72 69 74 65 72  &pWriter->writer
18810 3b 0a 20 20 46 74 73 35 42 75 66 66 65 72 20 2a  ;.  Fts5Buffer *
18820 70 50 67 69 64 78 20 3d 20 26 70 57 72 69 74 65  pPgidx = &pWrite
18830 72 2d 3e 77 72 69 74 65 72 2e 70 67 69 64 78 3b  r->writer.pgidx;
18840 0a 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72  ..  assert( p->r
18850 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  c==SQLITE_OK );.
18860 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
18870 3e 62 75 66 2e 6e 3e 3d 34 20 29 3b 0a 20 20 61  >buf.n>=4 );.  a
18880 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 62 75  ssert( pPage->bu
18890 66 2e 6e 3e 34 20 7c 7c 20 70 57 72 69 74 65 72  f.n>4 || pWriter
188a0 2d 3e 62 46 69 72 73 74 54 65 72 6d 49 6e 50 61  ->bFirstTermInPa
188b0 67 65 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  ge );..  /* If t
188c0 68 65 20 63 75 72 72 65 6e 74 20 6c 65 61 66 20  he current leaf 
188d0 70 61 67 65 20 69 73 20 66 75 6c 6c 2c 20 66 6c  page is full, fl
188e0 75 73 68 20 69 74 20 74 6f 20 64 69 73 6b 2e 20  ush it to disk. 
188f0 2a 2f 0a 20 20 69 66 28 20 28 70 50 61 67 65 2d  */.  if( (pPage-
18900 3e 62 75 66 2e 6e 20 2b 20 70 50 67 69 64 78 2d  >buf.n + pPgidx-
18910 3e 6e 20 2b 20 6e 54 65 72 6d 20 2b 20 32 29 3e  >n + nTerm + 2)>
18920 3d 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e 70 67 73  =p->pConfig->pgs
18930 7a 20 29 7b 0a 20 20 20 20 69 66 28 20 70 50 61  z ){.    if( pPa
18940 67 65 2d 3e 62 75 66 2e 6e 3e 34 20 29 7b 0a 20  ge->buf.n>4 ){. 
18950 20 20 20 20 20 66 74 73 35 57 72 69 74 65 46 6c       fts5WriteFl
18960 75 73 68 4c 65 61 66 28 70 2c 20 70 57 72 69 74  ushLeaf(p, pWrit
18970 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66  er);.    }.    f
18980 74 73 35 42 75 66 66 65 72 47 72 6f 77 28 26 70  ts5BufferGrow(&p
18990 2d 3e 72 63 2c 20 26 70 50 61 67 65 2d 3e 62 75  ->rc, &pPage->bu
189a0 66 2c 20 6e 54 65 72 6d 2b 46 54 53 35 5f 44 41  f, nTerm+FTS5_DA
189b0 54 41 5f 50 41 44 44 49 4e 47 29 3b 0a 20 20 7d  TA_PADDING);.  }
189c0 0a 20 20 0a 20 20 2f 2a 20 54 4f 44 4f 31 3a 20  .  .  /* TODO1: 
189d0 55 70 64 61 74 69 6e 67 20 70 67 69 64 78 20 68  Updating pgidx h
189e0 65 72 65 2e 20 2a 2f 0a 20 20 70 50 67 69 64 78  ere. */.  pPgidx
189f0 2d 3e 6e 20 2b 3d 20 73 71 6c 69 74 65 33 46 74  ->n += sqlite3Ft
18a00 73 35 50 75 74 56 61 72 69 6e 74 28 0a 20 20 20  s5PutVarint(.   
18a10 20 20 20 26 70 50 67 69 64 78 2d 3e 70 5b 70 50     &pPgidx->p[pP
18a20 67 69 64 78 2d 3e 6e 5d 2c 20 70 50 61 67 65 2d  gidx->n], pPage-
18a30 3e 62 75 66 2e 6e 20 2d 20 70 50 61 67 65 2d 3e  >buf.n - pPage->
18a40 69 50 72 65 76 50 67 69 64 78 0a 20 20 29 3b 0a  iPrevPgidx.  );.
18a50 20 20 70 50 61 67 65 2d 3e 69 50 72 65 76 50 67    pPage->iPrevPg
18a60 69 64 78 20 3d 20 70 50 61 67 65 2d 3e 62 75 66  idx = pPage->buf
18a70 2e 6e 3b 0a 23 69 66 20 30 0a 20 20 66 74 73 35  .n;.#if 0.  fts5
18a80 50 75 74 55 31 36 28 26 70 50 67 69 64 78 2d 3e  PutU16(&pPgidx->
18a90 70 5b 70 50 67 69 64 78 2d 3e 6e 5d 2c 20 70 50  p[pPgidx->n], pP
18aa0 61 67 65 2d 3e 62 75 66 2e 6e 29 3b 0a 20 20 70  age->buf.n);.  p
18ab0 50 67 69 64 78 2d 3e 6e 20 2b 3d 20 32 3b 0a 23  Pgidx->n += 2;.#
18ac0 65 6e 64 69 66 0a 0a 20 20 69 66 28 20 70 57 72  endif..  if( pWr
18ad0 69 74 65 72 2d 3e 62 46 69 72 73 74 54 65 72 6d  iter->bFirstTerm
18ae0 49 6e 50 61 67 65 20 29 7b 0a 20 20 20 20 6e 50  InPage ){.    nP
18af0 72 65 66 69 78 20 3d 20 30 3b 0a 20 20 20 20 69  refix = 0;.    i
18b00 66 28 20 70 50 61 67 65 2d 3e 70 67 6e 6f 21 3d  f( pPage->pgno!=
18b10 31 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68  1 ){.      /* Th
18b20 69 73 20 69 73 20 74 68 65 20 66 69 72 73 74 20  is is the first 
18b30 74 65 72 6d 20 6f 6e 20 61 20 6c 65 61 66 20 74  term on a leaf t
18b40 68 61 74 20 69 73 20 6e 6f 74 20 74 68 65 20 6c  hat is not the l
18b50 65 66 74 6d 6f 73 74 20 6c 65 61 66 20 69 6e 0a  eftmost leaf in.
18b60 20 20 20 20 20 20 2a 2a 20 74 68 65 20 73 65 67        ** the seg
18b70 6d 65 6e 74 20 62 2d 74 72 65 65 2e 20 49 6e 20  ment b-tree. In 
18b80 74 68 69 73 20 63 61 73 65 20 69 74 20 69 73 20  this case it is 
18b90 6e 65 63 65 73 73 61 72 79 20 74 6f 20 61 64 64  necessary to add
18ba0 20 61 20 74 65 72 6d 20 74 6f 0a 20 20 20 20 20   a term to.     
18bb0 20 2a 2a 20 74 68 65 20 62 2d 74 72 65 65 20 68   ** the b-tree h
18bc0 69 65 72 61 72 63 68 79 20 74 68 61 74 20 69 73  ierarchy that is
18bd0 20 28 61 29 20 6c 61 72 67 65 72 20 74 68 61 6e   (a) larger than
18be0 20 74 68 65 20 6c 61 72 67 65 73 74 20 74 65 72   the largest ter
18bf0 6d 20 0a 20 20 20 20 20 20 2a 2a 20 61 6c 72 65  m .      ** alre
18c00 61 64 79 20 77 72 69 74 74 65 6e 20 74 6f 20 74  ady written to t
18c10 68 65 20 73 65 67 6d 65 6e 74 20 61 6e 64 20 28  he segment and (
18c20 62 29 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20  b) smaller than 
18c30 6f 72 20 65 71 75 61 6c 20 74 6f 0a 20 20 20 20  or equal to.    
18c40 20 20 2a 2a 20 74 68 69 73 20 74 65 72 6d 2e 20    ** this term. 
18c50 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20  In other words, 
18c60 61 20 70 72 65 66 69 78 20 6f 66 20 28 70 54 65  a prefix of (pTe
18c70 72 6d 2f 6e 54 65 72 6d 29 20 74 68 61 74 20 69  rm/nTerm) that i
18c80 73 20 6f 6e 65 0a 20 20 20 20 20 20 2a 2a 20 62  s one.      ** b
18c90 79 74 65 20 6c 6f 6e 67 65 72 20 74 68 61 6e 20  yte longer than 
18ca0 74 68 65 20 6c 6f 6e 67 65 73 74 20 70 72 65 66  the longest pref
18cb0 69 78 20 28 70 54 65 72 6d 2f 6e 54 65 72 6d 29  ix (pTerm/nTerm)
18cc0 20 73 68 61 72 65 73 20 77 69 74 68 20 74 68 65   shares with the
18cd0 0a 20 20 20 20 20 20 2a 2a 20 70 72 65 76 69 6f  .      ** previo
18ce0 75 73 20 74 65 72 6d 2e 20 0a 20 20 20 20 20 20  us term. .      
18cf0 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 55 73 75 61  **.      ** Usua
18d00 6c 6c 79 2c 20 74 68 65 20 70 72 65 76 69 6f 75  lly, the previou
18d10 73 20 74 65 72 6d 20 69 73 20 61 76 61 69 6c 61  s term is availa
18d20 62 6c 65 20 69 6e 20 70 50 61 67 65 2d 3e 74 65  ble in pPage->te
18d30 72 6d 2e 20 54 68 65 20 65 78 63 65 70 74 69 6f  rm. The exceptio
18d40 6e 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 69 66  n.      ** is if
18d50 20 74 68 69 73 20 69 73 20 74 68 65 20 66 69 72   this is the fir
18d60 73 74 20 74 65 72 6d 20 77 72 69 74 74 65 6e 20  st term written 
18d70 69 6e 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61  in an incrementa
18d80 6c 2d 6d 65 72 67 65 20 73 74 65 70 2e 0a 20 20  l-merge step..  
18d90 20 20 20 20 2a 2a 20 49 6e 20 74 68 69 73 20 63      ** In this c
18da0 61 73 65 20 74 68 65 20 70 72 65 76 69 6f 75 73  ase the previous
18db0 20 74 65 72 6d 20 69 73 20 6e 6f 74 20 61 76 61   term is not ava
18dc0 69 6c 61 62 6c 65 2c 20 73 6f 20 6a 75 73 74 20  ilable, so just 
18dd0 77 72 69 74 65 20 61 0a 20 20 20 20 20 20 2a 2a  write a.      **
18de0 20 63 6f 70 79 20 6f 66 20 28 70 54 65 72 6d 2f   copy of (pTerm/
18df0 6e 54 65 72 6d 29 20 69 6e 74 6f 20 74 68 65 20  nTerm) into the 
18e00 70 61 72 65 6e 74 20 6e 6f 64 65 2e 20 54 68 69  parent node. Thi
18e10 73 20 69 73 20 73 6c 69 67 68 74 6c 79 0a 20 20  s is slightly.  
18e20 20 20 20 20 2a 2a 20 69 6e 65 66 66 69 63 69 65      ** inefficie
18e30 6e 74 2c 20 62 75 74 20 73 74 69 6c 6c 20 63 6f  nt, but still co
18e40 72 72 65 63 74 2e 20 20 2a 2f 0a 20 20 20 20 20  rrect.  */.     
18e50 20 69 6e 74 20 6e 20 3d 20 6e 54 65 72 6d 3b 0a   int n = nTerm;.
18e60 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65 2d        if( pPage-
18e70 3e 74 65 72 6d 2e 6e 20 29 7b 0a 20 20 20 20 20  >term.n ){.     
18e80 20 20 20 6e 20 3d 20 31 20 2b 20 66 74 73 35 50     n = 1 + fts5P
18e90 72 65 66 69 78 43 6f 6d 70 72 65 73 73 28 70 50  refixCompress(pP
18ea0 61 67 65 2d 3e 74 65 72 6d 2e 6e 2c 20 70 50 61  age->term.n, pPa
18eb0 67 65 2d 3e 74 65 72 6d 2e 70 2c 20 6e 54 65 72  ge->term.p, nTer
18ec0 6d 2c 20 70 54 65 72 6d 29 3b 0a 20 20 20 20 20  m, pTerm);.     
18ed0 20 7d 0a 20 20 20 20 20 20 66 74 73 35 57 72 69   }.      fts5Wri
18ee0 74 65 42 74 72 65 65 54 65 72 6d 28 70 2c 20 70  teBtreeTerm(p, p
18ef0 57 72 69 74 65 72 2c 20 6e 2c 20 70 54 65 72 6d  Writer, n, pTerm
18f00 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65 20 3d  );.      pPage =
18f10 20 26 70 57 72 69 74 65 72 2d 3e 77 72 69 74 65   &pWriter->write
18f20 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  r;.    }.  }else
18f30 7b 0a 20 20 20 20 6e 50 72 65 66 69 78 20 3d 20  {.    nPrefix = 
18f40 66 74 73 35 50 72 65 66 69 78 43 6f 6d 70 72 65  fts5PrefixCompre
18f50 73 73 28 70 50 61 67 65 2d 3e 74 65 72 6d 2e 6e  ss(pPage->term.n
18f60 2c 20 70 50 61 67 65 2d 3e 74 65 72 6d 2e 70 2c  , pPage->term.p,
18f70 20 6e 54 65 72 6d 2c 20 70 54 65 72 6d 29 3b 0a   nTerm, pTerm);.
18f80 20 20 20 20 66 74 73 35 42 75 66 66 65 72 41 70      fts5BufferAp
18f90 70 65 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e 72  pendVarint(&p->r
18fa0 63 2c 20 26 70 50 61 67 65 2d 3e 62 75 66 2c 20  c, &pPage->buf, 
18fb0 6e 50 72 65 66 69 78 29 3b 0a 20 20 7d 0a 0a 20  nPrefix);.  }.. 
18fc0 20 2f 2a 20 41 70 70 65 6e 64 20 74 68 65 20 6e   /* Append the n
18fd0 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f  umber of bytes o
18fe0 66 20 6e 65 77 20 64 61 74 61 2c 20 74 68 65 6e  f new data, then
18ff0 20 74 68 65 20 74 65 72 6d 20 64 61 74 61 20 69   the term data i
19000 74 73 65 6c 66 0a 20 20 2a 2a 20 74 6f 20 74 68  tself.  ** to th
19010 65 20 70 61 67 65 2e 20 2a 2f 0a 20 20 66 74 73  e page. */.  fts
19020 35 42 75 66 66 65 72 41 70 70 65 6e 64 56 61 72  5BufferAppendVar
19030 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26 70 50 61  int(&p->rc, &pPa
19040 67 65 2d 3e 62 75 66 2c 20 6e 54 65 72 6d 20 2d  ge->buf, nTerm -
19050 20 6e 50 72 65 66 69 78 29 3b 0a 20 20 66 74 73   nPrefix);.  fts
19060 35 42 75 66 66 65 72 41 70 70 65 6e 64 42 6c 6f  5BufferAppendBlo
19070 62 28 26 70 2d 3e 72 63 2c 20 26 70 50 61 67 65  b(&p->rc, &pPage
19080 2d 3e 62 75 66 2c 20 6e 54 65 72 6d 20 2d 20 6e  ->buf, nTerm - n
19090 50 72 65 66 69 78 2c 20 26 70 54 65 72 6d 5b 6e  Prefix, &pTerm[n
190a0 50 72 65 66 69 78 5d 29 3b 0a 0a 20 20 2f 2a 20  Prefix]);..  /* 
190b0 55 70 64 61 74 65 20 74 68 65 20 46 74 73 35 50  Update the Fts5P
190c0 61 67 65 57 72 69 74 65 72 2e 74 65 72 6d 20 66  ageWriter.term f
190d0 69 65 6c 64 2e 20 2a 2f 0a 20 20 66 74 73 35 42  ield. */.  fts5B
190e0 75 66 66 65 72 53 65 74 28 26 70 2d 3e 72 63 2c  ufferSet(&p->rc,
190f0 20 26 70 50 61 67 65 2d 3e 74 65 72 6d 2c 20 6e   &pPage->term, n
19100 54 65 72 6d 2c 20 70 54 65 72 6d 29 3b 0a 20 20  Term, pTerm);.  
19110 70 57 72 69 74 65 72 2d 3e 62 46 69 72 73 74 54  pWriter->bFirstT
19120 65 72 6d 49 6e 50 61 67 65 20 3d 20 30 3b 0a 0a  ermInPage = 0;..
19130 20 20 70 57 72 69 74 65 72 2d 3e 62 46 69 72 73    pWriter->bFirs
19140 74 52 6f 77 69 64 49 6e 50 61 67 65 20 3d 20 30  tRowidInPage = 0
19150 3b 0a 20 20 70 57 72 69 74 65 72 2d 3e 62 46 69  ;.  pWriter->bFi
19160 72 73 74 52 6f 77 69 64 49 6e 44 6f 63 6c 69 73  rstRowidInDoclis
19170 74 20 3d 20 31 3b 0a 0a 20 20 61 73 73 65 72 74  t = 1;..  assert
19180 28 20 70 2d 3e 72 63 20 7c 7c 20 28 70 57 72 69  ( p->rc || (pWri
19190 74 65 72 2d 3e 6e 44 6c 69 64 78 3e 30 20 26 26  ter->nDlidx>0 &&
191a0 20 70 57 72 69 74 65 72 2d 3e 61 44 6c 69 64 78   pWriter->aDlidx
191b0 5b 30 5d 2e 62 75 66 2e 6e 3d 3d 30 29 20 29 3b  [0].buf.n==0) );
191c0 0a 20 20 70 57 72 69 74 65 72 2d 3e 61 44 6c 69  .  pWriter->aDli
191d0 64 78 5b 30 5d 2e 70 67 6e 6f 20 3d 20 70 50 61  dx[0].pgno = pPa
191e0 67 65 2d 3e 70 67 6e 6f 3b 0a 7d 0a 0a 2f 2a 0a  ge->pgno;.}../*.
191f0 2a 2a 20 41 70 70 65 6e 64 20 61 20 72 6f 77 69  ** Append a rowi
19200 64 20 61 6e 64 20 70 6f 73 69 74 69 6f 6e 2d 6c  d and position-l
19210 69 73 74 20 73 69 7a 65 20 66 69 65 6c 64 20 74  ist size field t
19220 6f 20 74 68 65 20 77 72 69 74 65 72 73 20 6f 75  o the writers ou
19230 74 70 75 74 2e 20 0a 2a 2f 0a 73 74 61 74 69 63  tput. .*/.static
19240 20 76 6f 69 64 20 66 74 73 35 57 72 69 74 65 41   void fts5WriteA
19250 70 70 65 6e 64 52 6f 77 69 64 28 0a 20 20 46 74  ppendRowid(.  Ft
19260 73 35 49 6e 64 65 78 20 2a 70 2c 20 0a 20 20 46  s5Index *p, .  F
19270 74 73 35 53 65 67 57 72 69 74 65 72 20 2a 70 57  ts5SegWriter *pW
19280 72 69 74 65 72 2c 0a 20 20 69 36 34 20 69 52 6f  riter,.  i64 iRo
19290 77 69 64 2c 0a 20 20 69 6e 74 20 6e 50 6f 73 0a  wid,.  int nPos.
192a0 29 7b 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d  ){.  if( p->rc==
192b0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
192c0 20 46 74 73 35 50 61 67 65 57 72 69 74 65 72 20   Fts5PageWriter 
192d0 2a 70 50 61 67 65 20 3d 20 26 70 57 72 69 74 65  *pPage = &pWrite
192e0 72 2d 3e 77 72 69 74 65 72 3b 0a 0a 20 20 20 20  r->writer;..    
192f0 69 66 28 20 28 70 50 61 67 65 2d 3e 62 75 66 2e  if( (pPage->buf.
19300 6e 20 2b 20 70 50 61 67 65 2d 3e 70 67 69 64 78  n + pPage->pgidx
19310 2e 6e 29 3e 3d 70 2d 3e 70 43 6f 6e 66 69 67 2d  .n)>=p->pConfig-
19320 3e 70 67 73 7a 20 29 7b 0a 20 20 20 20 20 20 66  >pgsz ){.      f
19330 74 73 35 57 72 69 74 65 46 6c 75 73 68 4c 65 61  ts5WriteFlushLea
19340 66 28 70 2c 20 70 57 72 69 74 65 72 29 3b 0a 20  f(p, pWriter);. 
19350 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20     }..    /* If 
19360 74 68 69 73 20 69 73 20 74 6f 20 62 65 20 74 68  this is to be th
19370 65 20 66 69 72 73 74 20 72 6f 77 69 64 20 77 72  e first rowid wr
19380 69 74 74 65 6e 20 74 6f 20 74 68 65 20 70 61 67  itten to the pag
19390 65 2c 20 73 65 74 20 74 68 65 20 0a 20 20 20 20  e, set the .    
193a0 2a 2a 20 72 6f 77 69 64 2d 70 6f 69 6e 74 65 72  ** rowid-pointer
193b0 20 69 6e 20 74 68 65 20 70 61 67 65 2d 68 65 61   in the page-hea
193c0 64 65 72 2e 20 41 6c 73 6f 20 61 70 70 65 6e 64  der. Also append
193d0 20 61 20 76 61 6c 75 65 20 74 6f 20 74 68 65 20   a value to the 
193e0 64 6c 69 64 78 0a 20 20 20 20 2a 2a 20 62 75 66  dlidx.    ** buf
193f0 66 65 72 2c 20 69 6e 20 63 61 73 65 20 61 20 64  fer, in case a d
19400 6f 63 6c 69 73 74 2d 69 6e 64 65 78 20 69 73 20  oclist-index is 
19410 72 65 71 75 69 72 65 64 2e 20 20 2a 2f 0a 20 20  required.  */.  
19420 20 20 69 66 28 20 70 57 72 69 74 65 72 2d 3e 62    if( pWriter->b
19430 46 69 72 73 74 52 6f 77 69 64 49 6e 50 61 67 65  FirstRowidInPage
19440 20 29 7b 0a 20 20 20 20 20 20 66 74 73 35 50 75   ){.      fts5Pu
19450 74 55 31 36 28 70 50 61 67 65 2d 3e 62 75 66 2e  tU16(pPage->buf.
19460 70 2c 20 70 50 61 67 65 2d 3e 62 75 66 2e 6e 29  p, pPage->buf.n)
19470 3b 0a 20 20 20 20 20 20 66 74 73 35 57 72 69 74  ;.      fts5Writ
19480 65 44 6c 69 64 78 41 70 70 65 6e 64 28 70 2c 20  eDlidxAppend(p, 
19490 70 57 72 69 74 65 72 2c 20 69 52 6f 77 69 64 29  pWriter, iRowid)
194a0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
194b0 57 72 69 74 65 20 74 68 65 20 72 6f 77 69 64 2e  Write the rowid.
194c0 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 57 72 69   */.    if( pWri
194d0 74 65 72 2d 3e 62 46 69 72 73 74 52 6f 77 69 64  ter->bFirstRowid
194e0 49 6e 44 6f 63 6c 69 73 74 20 7c 7c 20 70 57 72  InDoclist || pWr
194f0 69 74 65 72 2d 3e 62 46 69 72 73 74 52 6f 77 69  iter->bFirstRowi
19500 64 49 6e 50 61 67 65 20 29 7b 0a 20 20 20 20 20  dInPage ){.     
19510 20 66 74 73 35 42 75 66 66 65 72 41 70 70 65 6e   fts5BufferAppen
19520 64 56 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20  dVarint(&p->rc, 
19530 26 70 50 61 67 65 2d 3e 62 75 66 2c 20 69 52 6f  &pPage->buf, iRo
19540 77 69 64 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  wid);.    }else{
19550 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
19560 2d 3e 72 63 20 7c 7c 20 69 52 6f 77 69 64 3e 70  ->rc || iRowid>p
19570 57 72 69 74 65 72 2d 3e 69 50 72 65 76 52 6f 77  Writer->iPrevRow
19580 69 64 20 29 3b 0a 20 20 20 20 20 20 66 74 73 35  id );.      fts5
19590 42 75 66 66 65 72 41 70 70 65 6e 64 56 61 72 69  BufferAppendVari
195a0 6e 74 28 26 70 2d 3e 72 63 2c 20 26 70 50 61 67  nt(&p->rc, &pPag
195b0 65 2d 3e 62 75 66 2c 20 69 52 6f 77 69 64 20 2d  e->buf, iRowid -
195c0 20 70 57 72 69 74 65 72 2d 3e 69 50 72 65 76 52   pWriter->iPrevR
195d0 6f 77 69 64 29 3b 0a 20 20 20 20 7d 0a 20 20 20  owid);.    }.   
195e0 20 70 57 72 69 74 65 72 2d 3e 69 50 72 65 76 52   pWriter->iPrevR
195f0 6f 77 69 64 20 3d 20 69 52 6f 77 69 64 3b 0a 20  owid = iRowid;. 
19600 20 20 20 70 57 72 69 74 65 72 2d 3e 62 46 69 72     pWriter->bFir
19610 73 74 52 6f 77 69 64 49 6e 44 6f 63 6c 69 73 74  stRowidInDoclist
19620 20 3d 20 30 3b 0a 20 20 20 20 70 57 72 69 74 65   = 0;.    pWrite
19630 72 2d 3e 62 46 69 72 73 74 52 6f 77 69 64 49 6e  r->bFirstRowidIn
19640 50 61 67 65 20 3d 20 30 3b 0a 0a 20 20 20 20 66  Page = 0;..    f
19650 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 56  ts5BufferAppendV
19660 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26 70  arint(&p->rc, &p
19670 50 61 67 65 2d 3e 62 75 66 2c 20 6e 50 6f 73 29  Page->buf, nPos)
19680 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63 20  ;.  }.}..static 
19690 76 6f 69 64 20 66 74 73 35 57 72 69 74 65 41 70  void fts5WriteAp
196a0 70 65 6e 64 50 6f 73 6c 69 73 74 44 61 74 61 28  pendPoslistData(
196b0 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c  .  Fts5Index *p,
196c0 20 0a 20 20 46 74 73 35 53 65 67 57 72 69 74 65   .  Fts5SegWrite
196d0 72 20 2a 70 57 72 69 74 65 72 2c 20 0a 20 20 63  r *pWriter, .  c
196e0 6f 6e 73 74 20 75 38 20 2a 61 44 61 74 61 2c 20  onst u8 *aData, 
196f0 0a 20 20 69 6e 74 20 6e 44 61 74 61 0a 29 7b 0a  .  int nData.){.
19700 20 20 46 74 73 35 50 61 67 65 57 72 69 74 65 72    Fts5PageWriter
19710 20 2a 70 50 61 67 65 20 3d 20 26 70 57 72 69 74   *pPage = &pWrit
19720 65 72 2d 3e 77 72 69 74 65 72 3b 0a 20 20 63 6f  er->writer;.  co
19730 6e 73 74 20 75 38 20 2a 61 20 3d 20 61 44 61 74  nst u8 *a = aDat
19740 61 3b 0a 20 20 69 6e 74 20 6e 20 3d 20 6e 44 61  a;.  int n = nDa
19750 74 61 3b 0a 20 20 0a 20 20 61 73 73 65 72 74 28  ta;.  .  assert(
19760 20 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e 70 67 73   p->pConfig->pgs
19770 7a 3e 30 20 29 3b 0a 20 20 77 68 69 6c 65 28 20  z>0 );.  while( 
19780 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
19790 20 0a 20 20 20 20 20 26 26 20 28 70 50 61 67 65   .     && (pPage
197a0 2d 3e 62 75 66 2e 6e 20 2b 20 70 50 61 67 65 2d  ->buf.n + pPage-
197b0 3e 70 67 69 64 78 2e 6e 20 2b 20 6e 29 3e 3d 70  >pgidx.n + n)>=p
197c0 2d 3e 70 43 6f 6e 66 69 67 2d 3e 70 67 73 7a 20  ->pConfig->pgsz 
197d0 0a 20 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 52  .  ){.    int nR
197e0 65 71 20 3d 20 70 2d 3e 70 43 6f 6e 66 69 67 2d  eq = p->pConfig-
197f0 3e 70 67 73 7a 20 2d 20 70 50 61 67 65 2d 3e 62  >pgsz - pPage->b
19800 75 66 2e 6e 20 2d 20 70 50 61 67 65 2d 3e 70 67  uf.n - pPage->pg
19810 69 64 78 2e 6e 3b 0a 20 20 20 20 69 6e 74 20 6e  idx.n;.    int n
19820 43 6f 70 79 20 3d 20 30 3b 0a 20 20 20 20 77 68  Copy = 0;.    wh
19830 69 6c 65 28 20 6e 43 6f 70 79 3c 6e 52 65 71 20  ile( nCopy<nReq 
19840 29 7b 0a 20 20 20 20 20 20 69 36 34 20 64 75 6d  ){.      i64 dum
19850 6d 79 3b 0a 20 20 20 20 20 20 6e 43 6f 70 79 20  my;.      nCopy 
19860 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e 74  += fts5GetVarint
19870 28 26 61 5b 6e 43 6f 70 79 5d 2c 20 28 75 36 34  (&a[nCopy], (u64
19880 2a 29 26 64 75 6d 6d 79 29 3b 0a 20 20 20 20 7d  *)&dummy);.    }
19890 0a 20 20 20 20 66 74 73 35 42 75 66 66 65 72 41  .    fts5BufferA
198a0 70 70 65 6e 64 42 6c 6f 62 28 26 70 2d 3e 72 63  ppendBlob(&p->rc
198b0 2c 20 26 70 50 61 67 65 2d 3e 62 75 66 2c 20 6e  , &pPage->buf, n
198c0 43 6f 70 79 2c 20 61 29 3b 0a 20 20 20 20 61 20  Copy, a);.    a 
198d0 2b 3d 20 6e 43 6f 70 79 3b 0a 20 20 20 20 6e 20  += nCopy;.    n 
198e0 2d 3d 20 6e 43 6f 70 79 3b 0a 20 20 20 20 66 74  -= nCopy;.    ft
198f0 73 35 57 72 69 74 65 46 6c 75 73 68 4c 65 61 66  s5WriteFlushLeaf
19900 28 70 2c 20 70 57 72 69 74 65 72 29 3b 0a 20 20  (p, pWriter);.  
19910 7d 0a 20 20 69 66 28 20 6e 3e 30 20 29 7b 0a 20  }.  if( n>0 ){. 
19920 20 20 20 66 74 73 35 42 75 66 66 65 72 41 70 70     fts5BufferApp
19930 65 6e 64 42 6c 6f 62 28 26 70 2d 3e 72 63 2c 20  endBlob(&p->rc, 
19940 26 70 50 61 67 65 2d 3e 62 75 66 2c 20 6e 2c 20  &pPage->buf, n, 
19950 61 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  a);.  }.}../*.**
19960 20 46 6c 75 73 68 20 61 6e 79 20 64 61 74 61 20   Flush any data 
19970 63 61 63 68 65 64 20 62 79 20 74 68 65 20 77 72  cached by the wr
19980 69 74 65 72 20 6f 62 6a 65 63 74 20 74 6f 20 74  iter object to t
19990 68 65 20 64 61 74 61 62 61 73 65 2e 20 46 72 65  he database. Fre
199a0 65 20 61 6e 79 0a 2a 2a 20 61 6c 6c 6f 63 61 74  e any.** allocat
199b0 69 6f 6e 73 20 61 73 73 6f 63 69 61 74 65 64 20  ions associated 
199c0 77 69 74 68 20 74 68 65 20 77 72 69 74 65 72 2e  with the writer.
199d0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
199e0 66 74 73 35 57 72 69 74 65 46 69 6e 69 73 68 28  fts5WriteFinish(
199f0 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c  .  Fts5Index *p,
19a00 20 0a 20 20 46 74 73 35 53 65 67 57 72 69 74 65   .  Fts5SegWrite
19a10 72 20 2a 70 57 72 69 74 65 72 2c 20 20 20 20 20  r *pWriter,     
19a20 20 20 20 20 2f 2a 20 57 72 69 74 65 72 20 6f 62      /* Writer ob
19a30 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20 2a 70  ject */.  int *p
19a40 6e 4c 65 61 66 20 20 20 20 20 20 20 20 20 20 20  nLeaf           
19a50 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54            /* OUT
19a60 3a 20 4e 75 6d 62 65 72 20 6f 66 20 6c 65 61 66  : Number of leaf
19a70 20 70 61 67 65 73 20 69 6e 20 62 2d 74 72 65 65   pages in b-tree
19a80 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a   */.){.  int i;.
19a90 20 20 46 74 73 35 50 61 67 65 57 72 69 74 65 72    Fts5PageWriter
19aa0 20 2a 70 4c 65 61 66 20 3d 20 26 70 57 72 69 74   *pLeaf = &pWrit
19ab0 65 72 2d 3e 77 72 69 74 65 72 3b 0a 20 20 69 66  er->writer;.  if
19ac0 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
19ad0 4f 4b 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  OK ){.    assert
19ae0 28 20 70 4c 65 61 66 2d 3e 70 67 6e 6f 3e 3d 31  ( pLeaf->pgno>=1
19af0 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 65 61   );.    if( pLea
19b00 66 2d 3e 62 75 66 2e 6e 3e 34 20 29 7b 0a 20 20  f->buf.n>4 ){.  
19b10 20 20 20 20 66 74 73 35 57 72 69 74 65 46 6c 75      fts5WriteFlu
19b20 73 68 4c 65 61 66 28 70 2c 20 70 57 72 69 74 65  shLeaf(p, pWrite
19b30 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2a 70  r);.    }.    *p
19b40 6e 4c 65 61 66 20 3d 20 70 4c 65 61 66 2d 3e 70  nLeaf = pLeaf->p
19b50 67 6e 6f 2d 31 3b 0a 20 20 20 20 66 74 73 35 57  gno-1;.    fts5W
19b60 72 69 74 65 46 6c 75 73 68 42 74 72 65 65 28 70  riteFlushBtree(p
19b70 2c 20 70 57 72 69 74 65 72 29 3b 0a 20 20 7d 0a  , pWriter);.  }.
19b80 20 20 66 74 73 35 42 75 66 66 65 72 46 72 65 65    fts5BufferFree
19b90 28 26 70 4c 65 61 66 2d 3e 74 65 72 6d 29 3b 0a  (&pLeaf->term);.
19ba0 20 20 66 74 73 35 42 75 66 66 65 72 46 72 65 65    fts5BufferFree
19bb0 28 26 70 4c 65 61 66 2d 3e 62 75 66 29 3b 0a 20  (&pLeaf->buf);. 
19bc0 20 66 74 73 35 42 75 66 66 65 72 46 72 65 65 28   fts5BufferFree(
19bd0 26 70 4c 65 61 66 2d 3e 70 67 69 64 78 29 3b 0a  &pLeaf->pgidx);.
19be0 20 20 66 74 73 35 42 75 66 66 65 72 46 72 65 65    fts5BufferFree
19bf0 28 26 70 57 72 69 74 65 72 2d 3e 62 74 74 65 72  (&pWriter->btter
19c00 6d 29 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20  m);..  for(i=0; 
19c10 69 3c 70 57 72 69 74 65 72 2d 3e 6e 44 6c 69 64  i<pWriter->nDlid
19c20 78 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c  x; i++){.    sql
19c30 69 74 65 33 46 74 73 35 42 75 66 66 65 72 46 72  ite3Fts5BufferFr
19c40 65 65 28 26 70 57 72 69 74 65 72 2d 3e 61 44 6c  ee(&pWriter->aDl
19c50 69 64 78 5b 69 5d 2e 62 75 66 29 3b 0a 20 20 7d  idx[i].buf);.  }
19c60 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
19c70 70 57 72 69 74 65 72 2d 3e 61 44 6c 69 64 78 29  pWriter->aDlidx)
19c80 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64  ;.}..static void
19c90 20 66 74 73 35 57 72 69 74 65 49 6e 69 74 28 0a   fts5WriteInit(.
19ca0 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20    Fts5Index *p, 
19cb0 0a 20 20 46 74 73 35 53 65 67 57 72 69 74 65 72  .  Fts5SegWriter
19cc0 20 2a 70 57 72 69 74 65 72 2c 20 0a 20 20 69 6e   *pWriter, .  in
19cd0 74 20 69 53 65 67 69 64 0a 29 7b 0a 20 20 63 6f  t iSegid.){.  co
19ce0 6e 73 74 20 69 6e 74 20 6e 42 75 66 66 65 72 20  nst int nBuffer 
19cf0 3d 20 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e 70 67  = p->pConfig->pg
19d00 73 7a 20 2b 20 46 54 53 35 5f 44 41 54 41 5f 50  sz + FTS5_DATA_P
19d10 41 44 44 49 4e 47 3b 0a 0a 20 20 6d 65 6d 73 65  ADDING;..  memse
19d20 74 28 70 57 72 69 74 65 72 2c 20 30 2c 20 73 69  t(pWriter, 0, si
19d30 7a 65 6f 66 28 46 74 73 35 53 65 67 57 72 69 74  zeof(Fts5SegWrit
19d40 65 72 29 29 3b 0a 20 20 70 57 72 69 74 65 72 2d  er));.  pWriter-
19d50 3e 69 53 65 67 69 64 20 3d 20 69 53 65 67 69 64  >iSegid = iSegid
19d60 3b 0a 0a 20 20 66 74 73 35 57 72 69 74 65 44 6c  ;..  fts5WriteDl
19d70 69 64 78 47 72 6f 77 28 70 2c 20 70 57 72 69 74  idxGrow(p, pWrit
19d80 65 72 2c 20 31 29 3b 0a 20 20 70 57 72 69 74 65  er, 1);.  pWrite
19d90 72 2d 3e 77 72 69 74 65 72 2e 70 67 6e 6f 20 3d  r->writer.pgno =
19da0 20 31 3b 0a 20 20 70 57 72 69 74 65 72 2d 3e 62   1;.  pWriter->b
19db0 46 69 72 73 74 54 65 72 6d 49 6e 50 61 67 65 20  FirstTermInPage 
19dc0 3d 20 31 3b 0a 20 20 70 57 72 69 74 65 72 2d 3e  = 1;.  pWriter->
19dd0 69 42 74 50 61 67 65 20 3d 20 31 3b 0a 0a 20 20  iBtPage = 1;..  
19de0 2f 2a 20 47 72 6f 77 20 74 68 65 20 74 77 6f 20  /* Grow the two 
19df0 62 75 66 66 65 72 73 20 74 6f 20 70 67 73 7a 20  buffers to pgsz 
19e00 2b 20 70 61 64 64 69 6e 67 20 62 79 74 65 73 20  + padding bytes 
19e10 69 6e 20 73 69 7a 65 2e 20 2a 2f 0a 20 20 66 74  in size. */.  ft
19e20 73 35 42 75 66 66 65 72 47 72 6f 77 28 26 70 2d  s5BufferGrow(&p-
19e30 3e 72 63 2c 20 26 70 57 72 69 74 65 72 2d 3e 77  >rc, &pWriter->w
19e40 72 69 74 65 72 2e 70 67 69 64 78 2c 20 6e 42 75  riter.pgidx, nBu
19e50 66 66 65 72 29 3b 0a 20 20 66 74 73 35 42 75 66  ffer);.  fts5Buf
19e60 66 65 72 47 72 6f 77 28 26 70 2d 3e 72 63 2c 20  ferGrow(&p->rc, 
19e70 26 70 57 72 69 74 65 72 2d 3e 77 72 69 74 65 72  &pWriter->writer
19e80 2e 62 75 66 2c 20 6e 42 75 66 66 65 72 29 3b 0a  .buf, nBuffer);.
19e90 0a 20 20 69 66 28 20 70 2d 3e 70 49 64 78 57 72  .  if( p->pIdxWr
19ea0 69 74 65 72 3d 3d 30 20 29 7b 0a 20 20 20 20 46  iter==0 ){.    F
19eb0 74 73 35 43 6f 6e 66 69 67 20 2a 70 43 6f 6e 66  ts5Config *pConf
19ec0 69 67 20 3d 20 70 2d 3e 70 43 6f 6e 66 69 67 3b  ig = p->pConfig;
19ed0 0a 20 20 20 20 66 74 73 35 49 6e 64 65 78 50 72  .    fts5IndexPr
19ee0 65 70 61 72 65 53 74 6d 74 28 70 2c 20 26 70 2d  epareStmt(p, &p-
19ef0 3e 70 49 64 78 57 72 69 74 65 72 2c 20 73 71 6c  >pIdxWriter, sql
19f00 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 0a 20 20  ite3_mprintf(.  
19f10 20 20 20 20 20 20 20 20 22 49 4e 53 45 52 54 20          "INSERT 
19f20 49 4e 54 4f 20 27 25 71 27 2e 27 25 71 5f 69 64  INTO '%q'.'%q_id
19f30 78 27 28 73 65 67 69 64 2c 74 65 72 6d 2c 70 67  x'(segid,term,pg
19f40 6e 6f 29 20 56 41 4c 55 45 53 28 3f 2c 3f 2c 3f  no) VALUES(?,?,?
19f50 29 22 2c 20 0a 20 20 20 20 20 20 20 20 20 20 70  )", .          p
19f60 43 6f 6e 66 69 67 2d 3e 7a 44 62 2c 20 70 43 6f  Config->zDb, pCo
19f70 6e 66 69 67 2d 3e 7a 4e 61 6d 65 0a 20 20 20 20  nfig->zName.    
19f80 29 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70  ));.  }..  if( p
19f90 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
19fa0 29 7b 0a 20 20 20 20 2f 2a 20 49 6e 69 74 69 61  ){.    /* Initia
19fb0 6c 69 7a 65 20 74 68 65 20 34 2d 62 79 74 65 20  lize the 4-byte 
19fc0 6c 65 61 66 2d 70 61 67 65 20 68 65 61 64 65 72  leaf-page header
19fd0 20 74 6f 20 30 78 30 30 2e 20 2a 2f 0a 20 20 20   to 0x00. */.   
19fe0 20 6d 65 6d 73 65 74 28 70 57 72 69 74 65 72 2d   memset(pWriter-
19ff0 3e 77 72 69 74 65 72 2e 62 75 66 2e 70 2c 20 30  >writer.buf.p, 0
1a000 2c 20 34 29 3b 0a 20 20 20 20 70 57 72 69 74 65  , 4);.    pWrite
1a010 72 2d 3e 77 72 69 74 65 72 2e 62 75 66 2e 6e 20  r->writer.buf.n 
1a020 3d 20 34 3b 0a 0a 20 20 20 20 2f 2a 20 42 69 6e  = 4;..    /* Bin
1a030 64 20 74 68 65 20 63 75 72 72 65 6e 74 20 6f 75  d the current ou
1a040 74 70 75 74 20 73 65 67 6d 65 6e 74 20 69 64 20  tput segment id 
1a050 74 6f 20 74 68 65 20 69 6e 64 65 78 2d 77 72 69  to the index-wri
1a060 74 65 72 2e 20 54 68 69 73 20 69 73 20 61 6e 0a  ter. This is an.
1a070 20 20 20 20 2a 2a 20 6f 70 74 69 6d 69 7a 61 74      ** optimizat
1a080 69 6f 6e 20 6f 76 65 72 20 62 69 6e 64 69 6e 67  ion over binding
1a090 20 74 68 65 20 73 61 6d 65 20 76 61 6c 75 65 20   the same value 
1a0a0 6f 76 65 72 20 61 6e 64 20 6f 76 65 72 20 61 73  over and over as
1a0b0 20 72 6f 77 73 20 61 72 65 0a 20 20 20 20 2a 2a   rows are.    **
1a0c0 20 69 6e 73 65 72 74 65 64 20 69 6e 74 6f 20 25   inserted into %
1a0d0 5f 69 64 78 20 62 79 20 74 68 65 20 63 75 72 72  _idx by the curr
1a0e0 65 6e 74 20 77 72 69 74 65 72 2e 20 20 2a 2f 0a  ent writer.  */.
1a0f0 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64      sqlite3_bind
1a100 5f 69 6e 74 28 70 2d 3e 70 49 64 78 57 72 69 74  _int(p->pIdxWrit
1a110 65 72 2c 20 31 2c 20 70 57 72 69 74 65 72 2d 3e  er, 1, pWriter->
1a120 69 53 65 67 69 64 29 3b 0a 20 20 7d 0a 7d 0a 0a  iSegid);.  }.}..
1a130 2f 2a 0a 2a 2a 20 49 74 65 72 61 74 6f 72 20 70  /*.** Iterator p
1a140 49 74 65 72 20 77 61 73 20 75 73 65 64 20 74 6f  Iter was used to
1a150 20 69 74 65 72 61 74 65 20 74 68 72 6f 75 67 68   iterate through
1a160 20 74 68 65 20 69 6e 70 75 74 20 73 65 67 6d 65   the input segme
1a170 6e 74 73 20 6f 66 20 6f 6e 20 61 6e 0a 2a 2a 20  nts of on an.** 
1a180 69 6e 63 72 65 6d 65 6e 74 61 6c 20 6d 65 72 67  incremental merg
1a190 65 20 6f 70 65 72 61 74 69 6f 6e 2e 20 54 68 69  e operation. Thi
1a1a0 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
1a1b0 6c 6c 65 64 20 69 66 20 74 68 65 20 69 6e 63 72  lled if the incr
1a1c0 65 6d 65 6e 74 61 6c 0a 2a 2a 20 6d 65 72 67 65  emental.** merge
1a1d0 20 73 74 65 70 20 68 61 73 20 66 69 6e 69 73 68   step has finish
1a1e0 65 64 20 62 75 74 20 74 68 65 20 69 6e 70 75 74  ed but the input
1a1f0 20 68 61 73 20 6e 6f 74 20 62 65 65 6e 20 63 6f   has not been co
1a200 6d 70 6c 65 74 65 6c 79 20 65 78 68 61 75 73 74  mpletely exhaust
1a210 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ed..*/.static vo
1a220 69 64 20 66 74 73 35 54 72 69 6d 53 65 67 6d 65  id fts5TrimSegme
1a230 6e 74 73 28 46 74 73 35 49 6e 64 65 78 20 2a 70  nts(Fts5Index *p
1a240 2c 20 46 74 73 35 49 6e 64 65 78 49 74 65 72 20  , Fts5IndexIter 
1a250 2a 70 49 74 65 72 29 7b 0a 20 20 69 6e 74 20 69  *pIter){.  int i
1a260 3b 0a 20 20 46 74 73 35 42 75 66 66 65 72 20 62  ;.  Fts5Buffer b
1a270 75 66 3b 0a 20 20 6d 65 6d 73 65 74 28 26 62 75  uf;.  memset(&bu
1a280 66 2c 20 30 2c 20 73 69 7a 65 6f 66 28 46 74 73  f, 0, sizeof(Fts
1a290 35 42 75 66 66 65 72 29 29 3b 0a 20 20 66 6f 72  5Buffer));.  for
1a2a0 28 69 3d 30 3b 20 69 3c 70 49 74 65 72 2d 3e 6e  (i=0; i<pIter->n
1a2b0 53 65 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 46  Seg; i++){.    F
1a2c0 74 73 35 53 65 67 49 74 65 72 20 2a 70 53 65 67  ts5SegIter *pSeg
1a2d0 20 3d 20 26 70 49 74 65 72 2d 3e 61 53 65 67 5b   = &pIter->aSeg[
1a2e0 69 5d 3b 0a 20 20 20 20 69 66 28 20 70 53 65 67  i];.    if( pSeg
1a2f0 2d 3e 70 53 65 67 3d 3d 30 20 29 7b 0a 20 20 20  ->pSeg==0 ){.   
1a300 20 20 20 2f 2a 20 6e 6f 2d 6f 70 20 2a 2f 0a 20     /* no-op */. 
1a310 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 53 65     }else if( pSe
1a320 67 2d 3e 70 4c 65 61 66 3d 3d 30 20 29 7b 0a 20  g->pLeaf==0 ){. 
1a330 20 20 20 20 20 2f 2a 20 41 6c 6c 20 6b 65 79 73       /* All keys
1a340 20 66 72 6f 6d 20 74 68 69 73 20 69 6e 70 75 74   from this input
1a350 20 73 65 67 6d 65 6e 74 20 68 61 76 65 20 62 65   segment have be
1a360 65 6e 20 74 72 61 6e 73 66 65 72 65 64 20 74 6f  en transfered to
1a370 20 74 68 65 20 6f 75 74 70 75 74 2e 0a 20 20 20   the output..   
1a380 20 20 20 2a 2a 20 53 65 74 20 62 6f 74 68 20 74     ** Set both t
1a390 68 65 20 66 69 72 73 74 20 61 6e 64 20 6c 61 73  he first and las
1a3a0 74 20 70 61 67 65 2d 6e 75 6d 62 65 72 73 20 74  t page-numbers t
1a3b0 6f 20 30 20 74 6f 20 69 6e 64 69 63 61 74 65 20  o 0 to indicate 
1a3c0 74 68 61 74 20 74 68 65 0a 20 20 20 20 20 20 2a  that the.      *
1a3d0 2a 20 73 65 67 6d 65 6e 74 20 69 73 20 6e 6f 77  * segment is now
1a3e0 20 65 6d 70 74 79 2e 20 2a 2f 0a 20 20 20 20 20   empty. */.     
1a3f0 20 70 53 65 67 2d 3e 70 53 65 67 2d 3e 70 67 6e   pSeg->pSeg->pgn
1a400 6f 4c 61 73 74 20 3d 20 30 3b 0a 20 20 20 20 20  oLast = 0;.     
1a410 20 70 53 65 67 2d 3e 70 53 65 67 2d 3e 70 67 6e   pSeg->pSeg->pgn
1a420 6f 46 69 72 73 74 20 3d 20 30 3b 0a 20 20 20 20  oFirst = 0;.    
1a430 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74  }else{.      int
1a440 20 69 4f 66 66 20 3d 20 70 53 65 67 2d 3e 69 54   iOff = pSeg->iT
1a450 65 72 6d 4c 65 61 66 4f 66 66 73 65 74 3b 20 20  ermLeafOffset;  
1a460 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f 6e 20     /* Offset on 
1a470 6e 65 77 20 66 69 72 73 74 20 6c 65 61 66 20 70  new first leaf p
1a480 61 67 65 20 2a 2f 0a 20 20 20 20 20 20 69 36 34  age */.      i64
1a490 20 69 4c 65 61 66 52 6f 77 69 64 3b 0a 20 20 20   iLeafRowid;.   
1a4a0 20 20 20 46 74 73 35 44 61 74 61 20 2a 70 44 61     Fts5Data *pDa
1a4b0 74 61 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 49  ta;.      int iI
1a4c0 64 20 3d 20 70 53 65 67 2d 3e 70 53 65 67 2d 3e  d = pSeg->pSeg->
1a4d0 69 53 65 67 69 64 3b 0a 20 20 20 20 20 20 75 38  iSegid;.      u8
1a4e0 20 61 48 64 72 5b 34 5d 20 3d 20 7b 30 78 30 30   aHdr[4] = {0x00
1a4f0 2c 20 30 78 30 30 2c 20 30 78 30 30 2c 20 30 78  , 0x00, 0x00, 0x
1a500 30 30 7d 3b 0a 0a 20 20 20 20 20 20 69 4c 65 61  00};..      iLea
1a510 66 52 6f 77 69 64 20 3d 20 46 54 53 35 5f 53 45  fRowid = FTS5_SE
1a520 47 4d 45 4e 54 5f 52 4f 57 49 44 28 69 49 64 2c  GMENT_ROWID(iId,
1a530 20 70 53 65 67 2d 3e 69 54 65 72 6d 4c 65 61 66   pSeg->iTermLeaf
1a540 50 67 6e 6f 29 3b 0a 20 20 20 20 20 20 70 44 61  Pgno);.      pDa
1a550 74 61 20 3d 20 66 74 73 35 44 61 74 61 52 65 61  ta = fts5DataRea
1a560 64 28 70 2c 20 69 4c 65 61 66 52 6f 77 69 64 29  d(p, iLeafRowid)
1a570 3b 0a 20 20 20 20 20 20 69 66 28 20 70 44 61 74  ;.      if( pDat
1a580 61 20 29 7b 0a 20 20 20 20 20 20 20 20 66 74 73  a ){.        fts
1a590 35 42 75 66 66 65 72 5a 65 72 6f 28 26 62 75 66  5BufferZero(&buf
1a5a0 29 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35 42  );.        fts5B
1a5b0 75 66 66 65 72 47 72 6f 77 28 26 70 2d 3e 72 63  ufferGrow(&p->rc
1a5c0 2c 20 26 62 75 66 2c 20 70 44 61 74 61 2d 3e 6e  , &buf, pData->n
1a5d0 6e 29 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35  n);.        fts5
1a5e0 42 75 66 66 65 72 41 70 70 65 6e 64 42 6c 6f 62  BufferAppendBlob
1a5f0 28 26 70 2d 3e 72 63 2c 20 26 62 75 66 2c 20 73  (&p->rc, &buf, s
1a600 69 7a 65 6f 66 28 61 48 64 72 29 2c 20 61 48 64  izeof(aHdr), aHd
1a610 72 29 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35  r);.        fts5
1a620 42 75 66 66 65 72 41 70 70 65 6e 64 56 61 72 69  BufferAppendVari
1a630 6e 74 28 26 70 2d 3e 72 63 2c 20 26 62 75 66 2c  nt(&p->rc, &buf,
1a640 20 70 53 65 67 2d 3e 74 65 72 6d 2e 6e 29 3b 0a   pSeg->term.n);.
1a650 20 20 20 20 20 20 20 20 66 74 73 35 42 75 66 66          fts5Buff
1a660 65 72 41 70 70 65 6e 64 42 6c 6f 62 28 26 70 2d  erAppendBlob(&p-
1a670 3e 72 63 2c 20 26 62 75 66 2c 20 70 53 65 67 2d  >rc, &buf, pSeg-
1a680 3e 74 65 72 6d 2e 6e 2c 20 70 53 65 67 2d 3e 74  >term.n, pSeg->t
1a690 65 72 6d 2e 70 29 3b 0a 20 20 20 20 20 20 20 20  erm.p);.        
1a6a0 66 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64  fts5BufferAppend
1a6b0 42 6c 6f 62 28 26 70 2d 3e 72 63 2c 20 26 62 75  Blob(&p->rc, &bu
1a6c0 66 2c 20 70 44 61 74 61 2d 3e 73 7a 4c 65 61 66  f, pData->szLeaf
1a6d0 2d 69 4f 66 66 2c 20 26 70 44 61 74 61 2d 3e 70  -iOff, &pData->p
1a6e0 5b 69 4f 66 66 5d 29 3b 0a 20 20 20 20 20 20 20  [iOff]);.       
1a6f0 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49   if( p->rc==SQLI
1a700 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
1a710 20 20 20 2f 2a 20 53 65 74 20 74 68 65 20 73 7a     /* Set the sz
1a720 4c 65 61 66 20 66 69 65 6c 64 20 2a 2f 0a 20 20  Leaf field */.  
1a730 20 20 20 20 20 20 20 20 66 74 73 35 50 75 74 55          fts5PutU
1a740 31 36 28 26 62 75 66 2e 70 5b 32 5d 2c 20 62 75  16(&buf.p[2], bu
1a750 66 2e 6e 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  f.n);.        }.
1a760 0a 20 20 20 20 20 20 20 20 2f 2a 20 53 65 74 20  .        /* Set 
1a770 75 70 20 74 68 65 20 6e 65 77 20 70 61 67 65 2d  up the new page-
1a780 69 6e 64 65 78 20 61 72 72 61 79 20 2a 2f 0a 20  index array */. 
1a790 20 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65         fts5Buffe
1a7a0 72 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26 70  rAppendVarint(&p
1a7b0 2d 3e 72 63 2c 20 26 62 75 66 2c 20 34 29 3b 0a  ->rc, &buf, 4);.
1a7c0 20 20 20 20 20 20 20 20 69 66 28 20 70 53 65 67          if( pSeg
1a7d0 2d 3e 69 4c 65 61 66 50 67 6e 6f 3d 3d 70 53 65  ->iLeafPgno==pSe
1a7e0 67 2d 3e 69 54 65 72 6d 4c 65 61 66 50 67 6e 6f  g->iTermLeafPgno
1a7f0 20 0a 20 20 20 20 20 20 20 20 20 26 26 20 70 53   .         && pS
1a800 65 67 2d 3e 69 45 6e 64 6f 66 44 6f 63 6c 69 73  eg->iEndofDoclis
1a810 74 3c 70 44 61 74 61 2d 3e 73 7a 4c 65 61 66 20  t<pData->szLeaf 
1a820 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20  .        ){.    
1a830 20 20 20 20 20 20 69 6e 74 20 6e 44 69 66 66 20        int nDiff 
1a840 3d 20 70 44 61 74 61 2d 3e 73 7a 4c 65 61 66 20  = pData->szLeaf 
1a850 2d 20 70 53 65 67 2d 3e 69 45 6e 64 6f 66 44 6f  - pSeg->iEndofDo
1a860 63 6c 69 73 74 3b 0a 20 20 20 20 20 20 20 20 20  clist;.         
1a870 20 66 74 73 35 42 75 66 66 65 72 41 70 70 65 6e   fts5BufferAppen
1a880 64 56 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20  dVarint(&p->rc, 
1a890 26 62 75 66 2c 20 62 75 66 2e 6e 20 2d 20 31 20  &buf, buf.n - 1 
1a8a0 2d 20 6e 44 69 66 66 20 2d 20 34 29 3b 0a 20 20  - nDiff - 4);.  
1a8b0 20 20 20 20 20 20 20 20 66 74 73 35 42 75 66 66          fts5Buff
1a8c0 65 72 41 70 70 65 6e 64 42 6c 6f 62 28 26 70 2d  erAppendBlob(&p-
1a8d0 3e 72 63 2c 20 26 62 75 66 2c 20 0a 20 20 20 20  >rc, &buf, .    
1a8e0 20 20 20 20 20 20 20 20 20 20 70 44 61 74 61 2d            pData-
1a8f0 3e 6e 6e 20 2d 20 70 53 65 67 2d 3e 69 50 67 69  >nn - pSeg->iPgi
1a900 64 78 4f 66 66 2c 20 26 70 44 61 74 61 2d 3e 70  dxOff, &pData->p
1a910 5b 70 53 65 67 2d 3e 69 50 67 69 64 78 4f 66 66  [pSeg->iPgidxOff
1a920 5d 0a 20 20 20 20 20 20 20 20 20 20 29 3b 0a 20  ].          );. 
1a930 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20         }..      
1a940 20 20 66 74 73 35 44 61 74 61 52 65 6c 65 61 73    fts5DataReleas
1a950 65 28 70 44 61 74 61 29 3b 0a 20 20 20 20 20 20  e(pData);.      
1a960 20 20 70 53 65 67 2d 3e 70 53 65 67 2d 3e 70 67    pSeg->pSeg->pg
1a970 6e 6f 46 69 72 73 74 20 3d 20 70 53 65 67 2d 3e  noFirst = pSeg->
1a980 69 54 65 72 6d 4c 65 61 66 50 67 6e 6f 3b 0a 20  iTermLeafPgno;. 
1a990 20 20 20 20 20 20 20 66 74 73 35 44 61 74 61 44         fts5DataD
1a9a0 65 6c 65 74 65 28 70 2c 20 46 54 53 35 5f 53 45  elete(p, FTS5_SE
1a9b0 47 4d 45 4e 54 5f 52 4f 57 49 44 28 69 49 64 2c  GMENT_ROWID(iId,
1a9c0 20 31 29 2c 20 69 4c 65 61 66 52 6f 77 69 64 29   1), iLeafRowid)
1a9d0 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35 44 61  ;.        fts5Da
1a9e0 74 61 57 72 69 74 65 28 70 2c 20 69 4c 65 61 66  taWrite(p, iLeaf
1a9f0 52 6f 77 69 64 2c 20 62 75 66 2e 70 2c 20 62 75  Rowid, buf.p, bu
1aa00 66 2e 6e 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  f.n);.      }.  
1aa10 20 20 7d 0a 20 20 7d 0a 20 20 66 74 73 35 42 75    }.  }.  fts5Bu
1aa20 66 66 65 72 46 72 65 65 28 26 62 75 66 29 3b 0a  fferFree(&buf);.
1aa30 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  }..static void f
1aa40 74 73 35 4d 65 72 67 65 43 68 75 6e 6b 43 61 6c  ts5MergeChunkCal
1aa50 6c 62 61 63 6b 28 0a 20 20 46 74 73 35 49 6e 64  lback(.  Fts5Ind
1aa60 65 78 20 2a 70 2c 20 0a 20 20 76 6f 69 64 20 2a  ex *p, .  void *
1aa70 70 43 74 78 2c 20 0a 20 20 63 6f 6e 73 74 20 75  pCtx, .  const u
1aa80 38 20 2a 70 43 68 75 6e 6b 2c 20 69 6e 74 20 6e  8 *pChunk, int n
1aa90 43 68 75 6e 6b 0a 29 7b 0a 20 20 46 74 73 35 53  Chunk.){.  Fts5S
1aaa0 65 67 57 72 69 74 65 72 20 2a 70 57 72 69 74 65  egWriter *pWrite
1aab0 72 20 3d 20 28 46 74 73 35 53 65 67 57 72 69 74  r = (Fts5SegWrit
1aac0 65 72 2a 29 70 43 74 78 3b 0a 20 20 66 74 73 35  er*)pCtx;.  fts5
1aad0 57 72 69 74 65 41 70 70 65 6e 64 50 6f 73 6c 69  WriteAppendPosli
1aae0 73 74 44 61 74 61 28 70 2c 20 70 57 72 69 74 65  stData(p, pWrite
1aaf0 72 2c 20 70 43 68 75 6e 6b 2c 20 6e 43 68 75 6e  r, pChunk, nChun
1ab00 6b 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 0a 2a 2f 0a  k);.}../*.**.*/.
1ab10 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
1ab20 49 6e 64 65 78 4d 65 72 67 65 4c 65 76 65 6c 28  IndexMergeLevel(
1ab30 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c  .  Fts5Index *p,
1ab40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ab50 20 20 20 2f 2a 20 46 54 53 35 20 62 61 63 6b 65     /* FTS5 backe
1ab60 6e 64 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 46  nd object */.  F
1ab70 74 73 35 53 74 72 75 63 74 75 72 65 20 2a 2a 70  ts5Structure **p
1ab80 70 53 74 72 75 63 74 2c 20 20 20 20 20 20 20 2f  pStruct,       /
1ab90 2a 20 49 4e 2f 4f 55 54 3a 20 53 74 75 63 74 75  * IN/OUT: Stuctu
1aba0 72 65 20 6f 66 20 69 6e 64 65 78 20 2a 2f 0a 20  re of index */. 
1abb0 20 69 6e 74 20 69 4c 76 6c 2c 20 20 20 20 20 20   int iLvl,      
1abc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1abd0 20 2f 2a 20 4c 65 76 65 6c 20 74 6f 20 72 65 61   /* Level to rea
1abe0 64 20 69 6e 70 75 74 20 66 72 6f 6d 20 2a 2f 0a  d input from */.
1abf0 20 20 69 6e 74 20 2a 70 6e 52 65 6d 20 20 20 20    int *pnRem    
1ac00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ac10 20 20 2f 2a 20 57 72 69 74 65 20 75 70 20 74 6f    /* Write up to
1ac20 20 74 68 69 73 20 6d 61 6e 79 20 6f 75 74 70 75   this many outpu
1ac30 74 20 6c 65 61 76 65 73 20 2a 2f 0a 29 7b 0a 20  t leaves */.){. 
1ac40 20 46 74 73 35 53 74 72 75 63 74 75 72 65 20 2a   Fts5Structure *
1ac50 70 53 74 72 75 63 74 20 3d 20 2a 70 70 53 74 72  pStruct = *ppStr
1ac60 75 63 74 3b 0a 20 20 46 74 73 35 53 74 72 75 63  uct;.  Fts5Struc
1ac70 74 75 72 65 4c 65 76 65 6c 20 2a 70 4c 76 6c 20  tureLevel *pLvl 
1ac80 3d 20 26 70 53 74 72 75 63 74 2d 3e 61 4c 65 76  = &pStruct->aLev
1ac90 65 6c 5b 69 4c 76 6c 5d 3b 0a 20 20 46 74 73 35  el[iLvl];.  Fts5
1aca0 53 74 72 75 63 74 75 72 65 4c 65 76 65 6c 20 2a  StructureLevel *
1acb0 70 4c 76 6c 4f 75 74 3b 0a 20 20 46 74 73 35 49  pLvlOut;.  Fts5I
1acc0 6e 64 65 78 49 74 65 72 20 2a 70 49 74 65 72 20  ndexIter *pIter 
1acd0 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 49 74  = 0;       /* It
1ace0 65 72 61 74 6f 72 20 74 6f 20 72 65 61 64 20 69  erator to read i
1acf0 6e 70 75 74 20 64 61 74 61 20 2a 2f 0a 20 20 69  nput data */.  i
1ad00 6e 74 20 6e 52 65 6d 20 3d 20 70 6e 52 65 6d 20  nt nRem = pnRem 
1ad10 3f 20 2a 70 6e 52 65 6d 20 3a 20 30 3b 20 20 2f  ? *pnRem : 0;  /
1ad20 2a 20 4f 75 74 70 75 74 20 6c 65 61 66 20 70 61  * Output leaf pa
1ad30 67 65 73 20 6c 65 66 74 20 74 6f 20 77 72 69 74  ges left to writ
1ad40 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 49 6e 70 75  e */.  int nInpu
1ad50 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
1ad60 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
1ad70 20 6f 66 20 69 6e 70 75 74 20 73 65 67 6d 65 6e   of input segmen
1ad80 74 73 20 2a 2f 0a 20 20 46 74 73 35 53 65 67 57  ts */.  Fts5SegW
1ad90 72 69 74 65 72 20 77 72 69 74 65 72 3b 20 20 20  riter writer;   
1ada0 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65          /* Write
1adb0 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 46 74  r object */.  Ft
1adc0 73 35 53 74 72 75 63 74 75 72 65 53 65 67 6d 65  s5StructureSegme
1add0 6e 74 20 2a 70 53 65 67 3b 20 20 20 20 20 2f 2a  nt *pSeg;     /*
1ade0 20 4f 75 74 70 75 74 20 73 65 67 6d 65 6e 74 20   Output segment 
1adf0 2a 2f 0a 20 20 46 74 73 35 42 75 66 66 65 72 20  */.  Fts5Buffer 
1ae00 74 65 72 6d 3b 0a 20 20 69 6e 74 20 62 4f 6c 64  term;.  int bOld
1ae10 65 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  est;            
1ae20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
1ae30 69 66 20 74 68 65 20 6f 75 74 70 75 74 20 73 65  if the output se
1ae40 67 6d 65 6e 74 20 69 73 20 74 68 65 20 6f 6c 64  gment is the old
1ae50 65 73 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  est */..  assert
1ae60 28 20 69 4c 76 6c 3c 70 53 74 72 75 63 74 2d 3e  ( iLvl<pStruct->
1ae70 6e 4c 65 76 65 6c 20 29 3b 0a 20 20 61 73 73 65  nLevel );.  asse
1ae80 72 74 28 20 70 4c 76 6c 2d 3e 6e 4d 65 72 67 65  rt( pLvl->nMerge
1ae90 3c 3d 70 4c 76 6c 2d 3e 6e 53 65 67 20 29 3b 0a  <=pLvl->nSeg );.
1aea0 0a 20 20 6d 65 6d 73 65 74 28 26 77 72 69 74 65  .  memset(&write
1aeb0 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 46 74 73  r, 0, sizeof(Fts
1aec0 35 53 65 67 57 72 69 74 65 72 29 29 3b 0a 20 20  5SegWriter));.  
1aed0 6d 65 6d 73 65 74 28 26 74 65 72 6d 2c 20 30 2c  memset(&term, 0,
1aee0 20 73 69 7a 65 6f 66 28 46 74 73 35 42 75 66 66   sizeof(Fts5Buff
1aef0 65 72 29 29 3b 0a 20 20 69 66 28 20 70 4c 76 6c  er));.  if( pLvl
1af00 2d 3e 6e 4d 65 72 67 65 20 29 7b 0a 20 20 20 20  ->nMerge ){.    
1af10 70 4c 76 6c 4f 75 74 20 3d 20 26 70 53 74 72 75  pLvlOut = &pStru
1af20 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c 2b  ct->aLevel[iLvl+
1af30 31 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  1];.    assert( 
1af40 70 4c 76 6c 4f 75 74 2d 3e 6e 53 65 67 3e 30 20  pLvlOut->nSeg>0 
1af50 29 3b 0a 20 20 20 20 6e 49 6e 70 75 74 20 3d 20  );.    nInput = 
1af60 70 4c 76 6c 2d 3e 6e 4d 65 72 67 65 3b 0a 20 20  pLvl->nMerge;.  
1af70 20 20 70 53 65 67 20 3d 20 26 70 4c 76 6c 4f 75    pSeg = &pLvlOu
1af80 74 2d 3e 61 53 65 67 5b 70 4c 76 6c 4f 75 74 2d  t->aSeg[pLvlOut-
1af90 3e 6e 53 65 67 2d 31 5d 3b 0a 0a 20 20 20 20 66  >nSeg-1];..    f
1afa0 74 73 35 57 72 69 74 65 49 6e 69 74 28 70 2c 20  ts5WriteInit(p, 
1afb0 26 77 72 69 74 65 72 2c 20 70 53 65 67 2d 3e 69  &writer, pSeg->i
1afc0 53 65 67 69 64 29 3b 0a 20 20 20 20 77 72 69 74  Segid);.    writ
1afd0 65 72 2e 77 72 69 74 65 72 2e 70 67 6e 6f 20 3d  er.writer.pgno =
1afe0 20 70 53 65 67 2d 3e 70 67 6e 6f 4c 61 73 74 2b   pSeg->pgnoLast+
1aff0 31 3b 0a 20 20 20 20 77 72 69 74 65 72 2e 69 42  1;.    writer.iB
1b000 74 50 61 67 65 20 3d 20 30 3b 0a 20 20 7d 65 6c  tPage = 0;.  }el
1b010 73 65 7b 0a 20 20 20 20 69 6e 74 20 69 53 65 67  se{.    int iSeg
1b020 69 64 20 3d 20 66 74 73 35 41 6c 6c 6f 63 61 74  id = fts5Allocat
1b030 65 53 65 67 69 64 28 70 2c 20 70 53 74 72 75 63  eSegid(p, pStruc
1b040 74 29 3b 0a 0a 20 20 20 20 2f 2a 20 45 78 74 65  t);..    /* Exte
1b050 6e 64 20 74 68 65 20 46 74 73 35 53 74 72 75 63  nd the Fts5Struc
1b060 74 75 72 65 20 6f 62 6a 65 63 74 20 61 73 20 72  ture object as r
1b070 65 71 75 69 72 65 64 20 74 6f 20 65 6e 73 75 72  equired to ensur
1b080 65 20 74 68 65 20 6f 75 74 70 75 74 0a 20 20 20  e the output.   
1b090 20 2a 2a 20 73 65 67 6d 65 6e 74 20 65 78 69 73   ** segment exis
1b0a0 74 73 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 69  ts. */.    if( i
1b0b0 4c 76 6c 3d 3d 70 53 74 72 75 63 74 2d 3e 6e 4c  Lvl==pStruct->nL
1b0c0 65 76 65 6c 2d 31 20 29 7b 0a 20 20 20 20 20 20  evel-1 ){.      
1b0d0 66 74 73 35 53 74 72 75 63 74 75 72 65 41 64 64  fts5StructureAdd
1b0e0 4c 65 76 65 6c 28 26 70 2d 3e 72 63 2c 20 70 70  Level(&p->rc, pp
1b0f0 53 74 72 75 63 74 29 3b 0a 20 20 20 20 20 20 70  Struct);.      p
1b100 53 74 72 75 63 74 20 3d 20 2a 70 70 53 74 72 75  Struct = *ppStru
1b110 63 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 74  ct;.    }.    ft
1b120 73 35 53 74 72 75 63 74 75 72 65 45 78 74 65 6e  s5StructureExten
1b130 64 4c 65 76 65 6c 28 26 70 2d 3e 72 63 2c 20 70  dLevel(&p->rc, p
1b140 53 74 72 75 63 74 2c 20 69 4c 76 6c 2b 31 2c 20  Struct, iLvl+1, 
1b150 31 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 70  1, 0);.    if( p
1b160 2d 3e 72 63 20 29 20 72 65 74 75 72 6e 3b 0a 20  ->rc ) return;. 
1b170 20 20 20 70 4c 76 6c 20 3d 20 26 70 53 74 72 75     pLvl = &pStru
1b180 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d  ct->aLevel[iLvl]
1b190 3b 0a 20 20 20 20 70 4c 76 6c 4f 75 74 20 3d 20  ;.    pLvlOut = 
1b1a0 26 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c  &pStruct->aLevel
1b1b0 5b 69 4c 76 6c 2b 31 5d 3b 0a 0a 20 20 20 20 66  [iLvl+1];..    f
1b1c0 74 73 35 57 72 69 74 65 49 6e 69 74 28 70 2c 20  ts5WriteInit(p, 
1b1d0 26 77 72 69 74 65 72 2c 20 69 53 65 67 69 64 29  &writer, iSegid)
1b1e0 3b 0a 0a 20 20 20 20 2f 2a 20 41 64 64 20 74 68  ;..    /* Add th
1b1f0 65 20 6e 65 77 20 73 65 67 6d 65 6e 74 20 74 6f  e new segment to
1b200 20 74 68 65 20 6f 75 74 70 75 74 20 6c 65 76 65   the output leve
1b210 6c 20 2a 2f 0a 20 20 20 20 70 53 65 67 20 3d 20  l */.    pSeg = 
1b220 26 70 4c 76 6c 4f 75 74 2d 3e 61 53 65 67 5b 70  &pLvlOut->aSeg[p
1b230 4c 76 6c 4f 75 74 2d 3e 6e 53 65 67 5d 3b 0a 20  LvlOut->nSeg];. 
1b240 20 20 20 70 4c 76 6c 4f 75 74 2d 3e 6e 53 65 67     pLvlOut->nSeg
1b250 2b 2b 3b 0a 20 20 20 20 70 53 65 67 2d 3e 70 67  ++;.    pSeg->pg
1b260 6e 6f 46 69 72 73 74 20 3d 20 31 3b 0a 20 20 20  noFirst = 1;.   
1b270 20 70 53 65 67 2d 3e 69 53 65 67 69 64 20 3d 20   pSeg->iSegid = 
1b280 69 53 65 67 69 64 3b 0a 20 20 20 20 70 53 74 72  iSegid;.    pStr
1b290 75 63 74 2d 3e 6e 53 65 67 6d 65 6e 74 2b 2b 3b  uct->nSegment++;
1b2a0 0a 0a 20 20 20 20 2f 2a 20 52 65 61 64 20 69 6e  ..    /* Read in
1b2b0 70 75 74 20 66 72 6f 6d 20 61 6c 6c 20 73 65 67  put from all seg
1b2c0 6d 65 6e 74 73 20 69 6e 20 74 68 65 20 69 6e 70  ments in the inp
1b2d0 75 74 20 6c 65 76 65 6c 20 2a 2f 0a 20 20 20 20  ut level */.    
1b2e0 6e 49 6e 70 75 74 20 3d 20 70 4c 76 6c 2d 3e 6e  nInput = pLvl->n
1b2f0 53 65 67 3b 0a 20 20 7d 0a 20 20 62 4f 6c 64 65  Seg;.  }.  bOlde
1b300 73 74 20 3d 20 28 70 4c 76 6c 4f 75 74 2d 3e 6e  st = (pLvlOut->n
1b310 53 65 67 3d 3d 31 20 26 26 20 70 53 74 72 75 63  Seg==1 && pStruc
1b320 74 2d 3e 6e 4c 65 76 65 6c 3d 3d 69 4c 76 6c 2b  t->nLevel==iLvl+
1b330 32 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 69  2);..  assert( i
1b340 4c 76 6c 3e 3d 30 20 29 3b 0a 20 20 66 6f 72 28  Lvl>=0 );.  for(
1b350 66 74 73 35 4d 75 6c 74 69 49 74 65 72 4e 65 77  fts5MultiIterNew
1b360 28 70 2c 20 70 53 74 72 75 63 74 2c 20 30 2c 20  (p, pStruct, 0, 
1b370 30 2c 20 30 2c 20 30 2c 20 69 4c 76 6c 2c 20 6e  0, 0, 0, iLvl, n
1b380 49 6e 70 75 74 2c 20 26 70 49 74 65 72 29 3b 0a  Input, &pIter);.
1b390 20 20 20 20 20 20 66 74 73 35 4d 75 6c 74 69 49        fts5MultiI
1b3a0 74 65 72 45 6f 66 28 70 2c 20 70 49 74 65 72 29  terEof(p, pIter)
1b3b0 3d 3d 30 3b 0a 20 20 20 20 20 20 66 74 73 35 4d  ==0;.      fts5M
1b3c0 75 6c 74 69 49 74 65 72 4e 65 78 74 28 70 2c 20  ultiIterNext(p, 
1b3d0 70 49 74 65 72 2c 20 30 2c 20 30 29 0a 20 20 29  pIter, 0, 0).  )
1b3e0 7b 0a 20 20 20 20 46 74 73 35 53 65 67 49 74 65  {.    Fts5SegIte
1b3f0 72 20 2a 70 53 65 67 49 74 65 72 20 3d 20 26 70  r *pSegIter = &p
1b400 49 74 65 72 2d 3e 61 53 65 67 5b 20 70 49 74 65  Iter->aSeg[ pIte
1b410 72 2d 3e 61 46 69 72 73 74 5b 31 5d 2e 69 46 69  r->aFirst[1].iFi
1b420 72 73 74 20 5d 3b 0a 20 20 20 20 69 6e 74 20 6e  rst ];.    int n
1b430 50 6f 73 3b 20 20 20 20 20 20 20 20 20 20 20 20  Pos;            
1b440 20 20 20 20 20 20 20 20 20 2f 2a 20 70 6f 73 69           /* posi
1b450 74 69 6f 6e 2d 6c 69 73 74 20 73 69 7a 65 20 66  tion-list size f
1b460 69 65 6c 64 20 76 61 6c 75 65 20 2a 2f 0a 20 20  ield value */.  
1b470 20 20 69 6e 74 20 6e 54 65 72 6d 3b 0a 20 20 20    int nTerm;.   
1b480 20 63 6f 6e 73 74 20 75 38 20 2a 70 54 65 72 6d   const u8 *pTerm
1b490 3b 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20  ;..    /* Check 
1b4a0 66 6f 72 20 6b 65 79 20 61 6e 6e 69 68 69 6c 61  for key annihila
1b4b0 74 69 6f 6e 2e 20 2a 2f 0a 20 20 20 20 69 66 28  tion. */.    if(
1b4c0 20 70 53 65 67 49 74 65 72 2d 3e 6e 50 6f 73 3d   pSegIter->nPos=
1b4d0 3d 30 20 26 26 20 28 62 4f 6c 64 65 73 74 20 7c  =0 && (bOldest |
1b4e0 7c 20 70 53 65 67 49 74 65 72 2d 3e 62 44 65 6c  | pSegIter->bDel
1b4f0 3d 3d 30 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b  ==0) ) continue;
1b500 0a 0a 20 20 20 20 70 54 65 72 6d 20 3d 20 66 74  ..    pTerm = ft
1b510 73 35 4d 75 6c 74 69 49 74 65 72 54 65 72 6d 28  s5MultiIterTerm(
1b520 70 49 74 65 72 2c 20 26 6e 54 65 72 6d 29 3b 0a  pIter, &nTerm);.
1b530 20 20 20 20 69 66 28 20 6e 54 65 72 6d 21 3d 74      if( nTerm!=t
1b540 65 72 6d 2e 6e 20 7c 7c 20 6d 65 6d 63 6d 70 28  erm.n || memcmp(
1b550 70 54 65 72 6d 2c 20 74 65 72 6d 2e 70 2c 20 6e  pTerm, term.p, n
1b560 54 65 72 6d 29 20 29 7b 0a 20 20 20 20 20 20 69  Term) ){.      i
1b570 66 28 20 70 6e 52 65 6d 20 26 26 20 77 72 69 74  f( pnRem && writ
1b580 65 72 2e 6e 4c 65 61 66 57 72 69 74 74 65 6e 3e  er.nLeafWritten>
1b590 6e 52 65 6d 20 29 7b 0a 20 20 20 20 20 20 20 20  nRem ){.        
1b5a0 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a  break;.      }..
1b5b0 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 69 73        /* This is
1b5c0 20 61 20 6e 65 77 20 74 65 72 6d 2e 20 41 70 70   a new term. App
1b5d0 65 6e 64 20 61 20 74 65 72 6d 20 74 6f 20 74 68  end a term to th
1b5e0 65 20 6f 75 74 70 75 74 20 73 65 67 6d 65 6e 74  e output segment
1b5f0 2e 20 2a 2f 0a 20 20 20 20 20 20 66 74 73 35 57  . */.      fts5W
1b600 72 69 74 65 41 70 70 65 6e 64 54 65 72 6d 28 70  riteAppendTerm(p
1b610 2c 20 26 77 72 69 74 65 72 2c 20 6e 54 65 72 6d  , &writer, nTerm
1b620 2c 20 70 54 65 72 6d 29 3b 0a 20 20 20 20 20 20  , pTerm);.      
1b630 66 74 73 35 42 75 66 66 65 72 53 65 74 28 26 70  fts5BufferSet(&p
1b640 2d 3e 72 63 2c 20 26 74 65 72 6d 2c 20 6e 54 65  ->rc, &term, nTe
1b650 72 6d 2c 20 70 54 65 72 6d 29 3b 0a 20 20 20 20  rm, pTerm);.    
1b660 7d 0a 0a 20 20 20 20 2f 2a 20 41 70 70 65 6e 64  }..    /* Append
1b670 20 74 68 65 20 72 6f 77 69 64 20 74 6f 20 74 68   the rowid to th
1b680 65 20 6f 75 74 70 75 74 20 2a 2f 0a 20 20 20 20  e output */.    
1b690 2f 2a 20 57 52 49 54 45 50 4f 53 4c 49 53 54 53  /* WRITEPOSLISTS
1b6a0 49 5a 45 20 2a 2f 0a 20 20 20 20 6e 50 6f 73 20  IZE */.    nPos 
1b6b0 3d 20 70 53 65 67 49 74 65 72 2d 3e 6e 50 6f 73  = pSegIter->nPos
1b6c0 2a 32 20 2b 20 70 53 65 67 49 74 65 72 2d 3e 62  *2 + pSegIter->b
1b6d0 44 65 6c 3b 0a 20 20 20 20 66 74 73 35 57 72 69  Del;.    fts5Wri
1b6e0 74 65 41 70 70 65 6e 64 52 6f 77 69 64 28 70 2c  teAppendRowid(p,
1b6f0 20 26 77 72 69 74 65 72 2c 20 66 74 73 35 4d 75   &writer, fts5Mu
1b700 6c 74 69 49 74 65 72 52 6f 77 69 64 28 70 49 74  ltiIterRowid(pIt
1b710 65 72 29 2c 20 6e 50 6f 73 29 3b 0a 0a 20 20 20  er), nPos);..   
1b720 20 2f 2a 20 41 70 70 65 6e 64 20 74 68 65 20 70   /* Append the p
1b730 6f 73 69 74 69 6f 6e 2d 6c 69 73 74 20 64 61 74  osition-list dat
1b740 61 20 74 6f 20 74 68 65 20 6f 75 74 70 75 74 20  a to the output 
1b750 2a 2f 0a 20 20 20 20 66 74 73 35 43 68 75 6e 6b  */.    fts5Chunk
1b760 49 74 65 72 61 74 65 28 70 2c 20 70 53 65 67 49  Iterate(p, pSegI
1b770 74 65 72 2c 20 28 76 6f 69 64 2a 29 26 77 72 69  ter, (void*)&wri
1b780 74 65 72 2c 20 66 74 73 35 4d 65 72 67 65 43 68  ter, fts5MergeCh
1b790 75 6e 6b 43 61 6c 6c 62 61 63 6b 29 3b 0a 20 20  unkCallback);.  
1b7a0 7d 0a 0a 20 20 2f 2a 20 46 6c 75 73 68 20 74 68  }..  /* Flush th
1b7b0 65 20 6c 61 73 74 20 6c 65 61 66 20 70 61 67 65  e last leaf page
1b7c0 20 74 6f 20 64 69 73 6b 2e 20 53 65 74 20 74 68   to disk. Set th
1b7d0 65 20 6f 75 74 70 75 74 20 73 65 67 6d 65 6e 74  e output segment
1b7e0 20 62 2d 74 72 65 65 20 68 65 69 67 68 74 0a 20   b-tree height. 
1b7f0 20 2a 2a 20 61 6e 64 20 6c 61 73 74 20 6c 65 61   ** and last lea
1b800 66 20 70 61 67 65 20 6e 75 6d 62 65 72 20 61 74  f page number at
1b810 20 74 68 65 20 73 61 6d 65 20 74 69 6d 65 2e 20   the same time. 
1b820 20 2a 2f 0a 20 20 66 74 73 35 57 72 69 74 65 46   */.  fts5WriteF
1b830 69 6e 69 73 68 28 70 2c 20 26 77 72 69 74 65 72  inish(p, &writer
1b840 2c 20 26 70 53 65 67 2d 3e 70 67 6e 6f 4c 61 73  , &pSeg->pgnoLas
1b850 74 29 3b 0a 0a 20 20 69 66 28 20 66 74 73 35 4d  t);..  if( fts5M
1b860 75 6c 74 69 49 74 65 72 45 6f 66 28 70 2c 20 70  ultiIterEof(p, p
1b870 49 74 65 72 29 20 29 7b 0a 20 20 20 20 69 6e 74  Iter) ){.    int
1b880 20 69 3b 0a 0a 20 20 20 20 2f 2a 20 52 65 6d 6f   i;..    /* Remo
1b890 76 65 20 74 68 65 20 72 65 64 75 6e 64 61 6e 74  ve the redundant
1b8a0 20 73 65 67 6d 65 6e 74 73 20 66 72 6f 6d 20 74   segments from t
1b8b0 68 65 20 25 5f 64 61 74 61 20 74 61 62 6c 65 20  he %_data table 
1b8c0 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  */.    for(i=0; 
1b8d0 69 3c 6e 49 6e 70 75 74 3b 20 69 2b 2b 29 7b 0a  i<nInput; i++){.
1b8e0 20 20 20 20 20 20 66 74 73 35 44 61 74 61 52 65        fts5DataRe
1b8f0 6d 6f 76 65 53 65 67 6d 65 6e 74 28 70 2c 20 70  moveSegment(p, p
1b900 4c 76 6c 2d 3e 61 53 65 67 5b 69 5d 2e 69 53 65  Lvl->aSeg[i].iSe
1b910 67 69 64 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  gid);.    }..   
1b920 20 2f 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 72   /* Remove the r
1b930 65 64 75 6e 64 61 6e 74 20 73 65 67 6d 65 6e 74  edundant segment
1b940 73 20 66 72 6f 6d 20 74 68 65 20 69 6e 70 75 74  s from the input
1b950 20 6c 65 76 65 6c 20 2a 2f 0a 20 20 20 20 69 66   level */.    if
1b960 28 20 70 4c 76 6c 2d 3e 6e 53 65 67 21 3d 6e 49  ( pLvl->nSeg!=nI
1b970 6e 70 75 74 20 29 7b 0a 20 20 20 20 20 20 69 6e  nput ){.      in
1b980 74 20 6e 4d 6f 76 65 20 3d 20 28 70 4c 76 6c 2d  t nMove = (pLvl-
1b990 3e 6e 53 65 67 20 2d 20 6e 49 6e 70 75 74 29 20  >nSeg - nInput) 
1b9a0 2a 20 73 69 7a 65 6f 66 28 46 74 73 35 53 74 72  * sizeof(Fts5Str
1b9b0 75 63 74 75 72 65 53 65 67 6d 65 6e 74 29 3b 0a  uctureSegment);.
1b9c0 20 20 20 20 20 20 6d 65 6d 6d 6f 76 65 28 70 4c        memmove(pL
1b9d0 76 6c 2d 3e 61 53 65 67 2c 20 26 70 4c 76 6c 2d  vl->aSeg, &pLvl-
1b9e0 3e 61 53 65 67 5b 6e 49 6e 70 75 74 5d 2c 20 6e  >aSeg[nInput], n
1b9f0 4d 6f 76 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20  Move);.    }.   
1ba00 20 70 53 74 72 75 63 74 2d 3e 6e 53 65 67 6d 65   pStruct->nSegme
1ba10 6e 74 20 2d 3d 20 6e 49 6e 70 75 74 3b 0a 20 20  nt -= nInput;.  
1ba20 20 20 70 4c 76 6c 2d 3e 6e 53 65 67 20 2d 3d 20    pLvl->nSeg -= 
1ba30 6e 49 6e 70 75 74 3b 0a 20 20 20 20 70 4c 76 6c  nInput;.    pLvl
1ba40 2d 3e 6e 4d 65 72 67 65 20 3d 20 30 3b 0a 20 20  ->nMerge = 0;.  
1ba50 20 20 69 66 28 20 70 53 65 67 2d 3e 70 67 6e 6f    if( pSeg->pgno
1ba60 4c 61 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Last==0 ){.     
1ba70 20 70 4c 76 6c 4f 75 74 2d 3e 6e 53 65 67 2d 2d   pLvlOut->nSeg--
1ba80 3b 0a 20 20 20 20 20 20 70 53 74 72 75 63 74 2d  ;.      pStruct-
1ba90 3e 6e 53 65 67 6d 65 6e 74 2d 2d 3b 0a 20 20 20  >nSegment--;.   
1baa0 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20   }.  }else{.    
1bab0 61 73 73 65 72 74 28 20 70 53 65 67 2d 3e 70 67  assert( pSeg->pg
1bac0 6e 6f 4c 61 73 74 3e 30 20 29 3b 0a 20 20 20 20  noLast>0 );.    
1bad0 66 74 73 35 54 72 69 6d 53 65 67 6d 65 6e 74 73  fts5TrimSegments
1bae0 28 70 2c 20 70 49 74 65 72 29 3b 0a 20 20 20 20  (p, pIter);.    
1baf0 70 4c 76 6c 2d 3e 6e 4d 65 72 67 65 20 3d 20 6e  pLvl->nMerge = n
1bb00 49 6e 70 75 74 3b 0a 20 20 7d 0a 0a 20 20 66 74  Input;.  }..  ft
1bb10 73 35 4d 75 6c 74 69 49 74 65 72 46 72 65 65 28  s5MultiIterFree(
1bb20 70 2c 20 70 49 74 65 72 29 3b 0a 20 20 66 74 73  p, pIter);.  fts
1bb30 35 42 75 66 66 65 72 46 72 65 65 28 26 74 65 72  5BufferFree(&ter
1bb40 6d 29 3b 0a 20 20 69 66 28 20 70 6e 52 65 6d 20  m);.  if( pnRem 
1bb50 29 20 2a 70 6e 52 65 6d 20 2d 3d 20 77 72 69 74  ) *pnRem -= writ
1bb60 65 72 2e 6e 4c 65 61 66 57 72 69 74 74 65 6e 3b  er.nLeafWritten;
1bb70 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20 75 70 20  .}../*.** Do up 
1bb80 74 6f 20 6e 50 67 20 70 61 67 65 73 20 6f 66 20  to nPg pages of 
1bb90 61 75 74 6f 6d 65 72 67 65 20 77 6f 72 6b 20 6f  automerge work o
1bba0 6e 20 74 68 65 20 69 6e 64 65 78 2e 0a 2a 2f 0a  n the index..*/.
1bbb0 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
1bbc0 49 6e 64 65 78 4d 65 72 67 65 28 0a 20 20 46 74  IndexMerge(.  Ft
1bbd0 73 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20  s5Index *p,     
1bbe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1bbf0 20 46 54 53 35 20 62 61 63 6b 65 6e 64 20 6f 62   FTS5 backend ob
1bc00 6a 65 63 74 20 2a 2f 0a 20 20 46 74 73 35 53 74  ject */.  Fts5St
1bc10 72 75 63 74 75 72 65 20 2a 2a 70 70 53 74 72 75  ructure **ppStru
1bc20 63 74 2c 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f  ct,       /* IN/
1bc30 4f 55 54 3a 20 43 75 72 72 65 6e 74 20 73 74 72  OUT: Current str
1bc40 75 63 74 75 72 65 20 6f 66 20 69 6e 64 65 78 20  ucture of index 
1bc50 2a 2f 0a 20 20 69 6e 74 20 6e 50 67 20 20 20 20  */.  int nPg    
1bc60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bc70 20 20 20 20 20 2f 2a 20 50 61 67 65 73 20 6f 66       /* Pages of
1bc80 20 77 6f 72 6b 20 74 6f 20 64 6f 20 2a 2f 0a 29   work to do */.)
1bc90 7b 0a 20 20 69 6e 74 20 6e 52 65 6d 20 3d 20 6e  {.  int nRem = n
1bca0 50 67 3b 0a 20 20 46 74 73 35 53 74 72 75 63 74  Pg;.  Fts5Struct
1bcb0 75 72 65 20 2a 70 53 74 72 75 63 74 20 3d 20 2a  ure *pStruct = *
1bcc0 70 70 53 74 72 75 63 74 3b 0a 20 20 77 68 69 6c  ppStruct;.  whil
1bcd0 65 28 20 6e 52 65 6d 3e 30 20 26 26 20 70 2d 3e  e( nRem>0 && p->
1bce0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
1bcf0 0a 20 20 20 20 69 6e 74 20 69 4c 76 6c 3b 20 20  .    int iLvl;  
1bd00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bd10 20 2f 2a 20 54 6f 20 69 74 65 72 61 74 65 20 74   /* To iterate t
1bd20 68 72 6f 75 67 68 20 6c 65 76 65 6c 73 20 2a 2f  hrough levels */
1bd30 0a 20 20 20 20 69 6e 74 20 69 42 65 73 74 4c 76  .    int iBestLv
1bd40 6c 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  l = 0;          
1bd50 20 2f 2a 20 4c 65 76 65 6c 20 6f 66 66 65 72 69   /* Level offeri
1bd60 6e 67 20 74 68 65 20 6d 6f 73 74 20 69 6e 70 75  ng the most inpu
1bd70 74 20 73 65 67 6d 65 6e 74 73 20 2a 2f 0a 20 20  t segments */.  
1bd80 20 20 69 6e 74 20 6e 42 65 73 74 20 3d 20 30 3b    int nBest = 0;
1bd90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1bda0 20 4e 75 6d 62 65 72 20 6f 66 20 69 6e 70 75 74   Number of input
1bdb0 20 73 65 67 6d 65 6e 74 73 20 6f 6e 20 62 65 73   segments on bes
1bdc0 74 20 6c 65 76 65 6c 20 2a 2f 0a 0a 20 20 20 20  t level */..    
1bdd0 2f 2a 20 53 65 74 20 69 42 65 73 74 4c 76 6c 20  /* Set iBestLvl 
1bde0 74 6f 20 74 68 65 20 6c 65 76 65 6c 20 74 6f 20  to the level to 
1bdf0 72 65 61 64 20 69 6e 70 75 74 20 73 65 67 6d 65  read input segme
1be00 6e 74 73 20 66 72 6f 6d 2e 20 2a 2f 0a 20 20 20  nts from. */.   
1be10 20 61 73 73 65 72 74 28 20 70 53 74 72 75 63 74   assert( pStruct
1be20 2d 3e 6e 4c 65 76 65 6c 3e 30 20 29 3b 0a 20 20  ->nLevel>0 );.  
1be30 20 20 66 6f 72 28 69 4c 76 6c 3d 30 3b 20 69 4c    for(iLvl=0; iL
1be40 76 6c 3c 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76  vl<pStruct->nLev
1be50 65 6c 3b 20 69 4c 76 6c 2b 2b 29 7b 0a 20 20 20  el; iLvl++){.   
1be60 20 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65     Fts5Structure
1be70 4c 65 76 65 6c 20 2a 70 4c 76 6c 20 3d 20 26 70  Level *pLvl = &p
1be80 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69  Struct->aLevel[i
1be90 4c 76 6c 5d 3b 0a 20 20 20 20 20 20 69 66 28 20  Lvl];.      if( 
1bea0 70 4c 76 6c 2d 3e 6e 4d 65 72 67 65 20 29 7b 0a  pLvl->nMerge ){.
1beb0 20 20 20 20 20 20 20 20 69 66 28 20 70 4c 76 6c          if( pLvl
1bec0 2d 3e 6e 4d 65 72 67 65 3e 6e 42 65 73 74 20 29  ->nMerge>nBest )
1bed0 7b 0a 20 20 20 20 20 20 20 20 20 20 69 42 65 73  {.          iBes
1bee0 74 4c 76 6c 20 3d 20 69 4c 76 6c 3b 0a 20 20 20  tLvl = iLvl;.   
1bef0 20 20 20 20 20 20 20 6e 42 65 73 74 20 3d 20 70         nBest = p
1bf00 4c 76 6c 2d 3e 6e 4d 65 72 67 65 3b 0a 20 20 20  Lvl->nMerge;.   
1bf10 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 62       }.        b
1bf20 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
1bf30 20 20 20 20 69 66 28 20 70 4c 76 6c 2d 3e 6e 53      if( pLvl->nS
1bf40 65 67 3e 6e 42 65 73 74 20 29 7b 0a 20 20 20 20  eg>nBest ){.    
1bf50 20 20 20 20 6e 42 65 73 74 20 3d 20 70 4c 76 6c      nBest = pLvl
1bf60 2d 3e 6e 53 65 67 3b 0a 20 20 20 20 20 20 20 20  ->nSeg;.        
1bf70 69 42 65 73 74 4c 76 6c 20 3d 20 69 4c 76 6c 3b  iBestLvl = iLvl;
1bf80 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
1bf90 20 20 20 20 2f 2a 20 49 66 20 6e 42 65 73 74 20      /* If nBest 
1bfa0 69 73 20 73 74 69 6c 6c 20 30 2c 20 74 68 65 6e  is still 0, then
1bfb0 20 74 68 65 20 69 6e 64 65 78 20 6d 75 73 74 20   the index must 
1bfc0 62 65 20 65 6d 70 74 79 2e 20 2a 2f 0a 23 69 66  be empty. */.#if
1bfd0 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
1bfe0 0a 20 20 20 20 66 6f 72 28 69 4c 76 6c 3d 30 3b  .    for(iLvl=0;
1bff0 20 6e 42 65 73 74 3d 3d 30 20 26 26 20 69 4c 76   nBest==0 && iLv
1c000 6c 3c 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65  l<pStruct->nLeve
1c010 6c 3b 20 69 4c 76 6c 2b 2b 29 7b 0a 20 20 20 20  l; iLvl++){.    
1c020 20 20 61 73 73 65 72 74 28 20 70 53 74 72 75 63    assert( pStruc
1c030 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d 2e  t->aLevel[iLvl].
1c040 6e 53 65 67 3d 3d 30 20 29 3b 0a 20 20 20 20 7d  nSeg==0 );.    }
1c050 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 69 66 28  .#endif..    if(
1c060 20 6e 42 65 73 74 3c 70 2d 3e 70 43 6f 6e 66 69   nBest<p->pConfi
1c070 67 2d 3e 6e 41 75 74 6f 6d 65 72 67 65 20 0a 20  g->nAutomerge . 
1c080 20 20 20 20 20 20 20 26 26 20 70 53 74 72 75 63         && pStruc
1c090 74 2d 3e 61 4c 65 76 65 6c 5b 69 42 65 73 74 4c  t->aLevel[iBestL
1c0a0 76 6c 5d 2e 6e 4d 65 72 67 65 3d 3d 30 20 0a 20  vl].nMerge==0 . 
1c0b0 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 62 72       ){.      br
1c0c0 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66  eak;.    }.    f
1c0d0 74 73 35 49 6e 64 65 78 4d 65 72 67 65 4c 65 76  ts5IndexMergeLev
1c0e0 65 6c 28 70 2c 20 26 70 53 74 72 75 63 74 2c 20  el(p, &pStruct, 
1c0f0 69 42 65 73 74 4c 76 6c 2c 20 26 6e 52 65 6d 29  iBestLvl, &nRem)
1c100 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d  ;.    if( p->rc=
1c110 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 53  =SQLITE_OK && pS
1c120 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 42  truct->aLevel[iB
1c130 65 73 74 4c 76 6c 5d 2e 6e 4d 65 72 67 65 3d 3d  estLvl].nMerge==
1c140 30 20 29 7b 0a 20 20 20 20 20 20 66 74 73 35 53  0 ){.      fts5S
1c150 74 72 75 63 74 75 72 65 50 72 6f 6d 6f 74 65 28  tructurePromote(
1c160 70 2c 20 69 42 65 73 74 4c 76 6c 2b 31 2c 20 70  p, iBestLvl+1, p
1c170 53 74 72 75 63 74 29 3b 0a 20 20 20 20 7d 0a 20  Struct);.    }. 
1c180 20 7d 0a 20 20 2a 70 70 53 74 72 75 63 74 20 3d   }.  *ppStruct =
1c190 20 70 53 74 72 75 63 74 3b 0a 7d 0a 0a 2f 2a 0a   pStruct;.}../*.
1c1a0 2a 2a 20 41 20 74 6f 74 61 6c 20 6f 66 20 6e 4c  ** A total of nL
1c1b0 65 61 66 20 6c 65 61 66 20 70 61 67 65 73 20 6f  eaf leaf pages o
1c1c0 66 20 64 61 74 61 20 68 61 73 20 6a 75 73 74 20  f data has just 
1c1d0 62 65 65 6e 20 66 6c 75 73 68 65 64 20 74 6f 20  been flushed to 
1c1e0 61 20 6c 65 76 65 6c 2d 30 0a 2a 2a 20 73 65 67  a level-0.** seg
1c1f0 6d 65 6e 74 2e 20 54 68 69 73 20 66 75 6e 63 74  ment. This funct
1c200 69 6f 6e 20 75 70 64 61 74 65 73 20 74 68 65 20  ion updates the 
1c210 77 72 69 74 65 2d 63 6f 75 6e 74 65 72 20 61 63  write-counter ac
1c220 63 6f 72 64 69 6e 67 6c 79 20 61 6e 64 2c 20 69  cordingly and, i
1c230 66 0a 2a 2a 20 6e 65 63 65 73 73 61 72 79 2c 20  f.** necessary, 
1c240 70 65 72 66 6f 72 6d 73 20 69 6e 63 72 65 6d 65  performs increme
1c250 6e 74 61 6c 20 6d 65 72 67 65 20 77 6f 72 6b 2e  ntal merge work.
1c260 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72  .**.** If an err
1c270 6f 72 20 6f 63 63 75 72 73 2c 20 73 65 74 20 74  or occurs, set t
1c280 68 65 20 46 74 73 35 49 6e 64 65 78 2e 72 63 20  he Fts5Index.rc 
1c290 65 72 72 6f 72 20 63 6f 64 65 2e 20 49 66 20 61  error code. If a
1c2a0 6e 20 65 72 72 6f 72 20 68 61 73 20 0a 2a 2a 20  n error has .** 
1c2b0 61 6c 72 65 61 64 79 20 6f 63 63 75 72 72 65 64  already occurred
1c2c0 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  , this function 
1c2d0 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73  is a no-op..*/.s
1c2e0 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 49  tatic void fts5I
1c2f0 6e 64 65 78 41 75 74 6f 6d 65 72 67 65 28 0a 20  ndexAutomerge(. 
1c300 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 20   Fts5Index *p,  
1c310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c320 20 2f 2a 20 46 54 53 35 20 62 61 63 6b 65 6e 64   /* FTS5 backend
1c330 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 46 74 73   object */.  Fts
1c340 35 53 74 72 75 63 74 75 72 65 20 2a 2a 70 70 53  5Structure **ppS
1c350 74 72 75 63 74 2c 20 20 20 20 20 20 20 2f 2a 20  truct,       /* 
1c360 49 4e 2f 4f 55 54 3a 20 43 75 72 72 65 6e 74 20  IN/OUT: Current 
1c370 73 74 72 75 63 74 75 72 65 20 6f 66 20 69 6e 64  structure of ind
1c380 65 78 20 2a 2f 0a 20 20 69 6e 74 20 6e 4c 65 61  ex */.  int nLea
1c390 66 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  f               
1c3a0 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
1c3b0 72 20 6f 66 20 6f 75 74 70 75 74 20 6c 65 61 76  r of output leav
1c3c0 65 73 20 6a 75 73 74 20 77 72 69 74 74 65 6e 20  es just written 
1c3d0 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 70 2d 3e 72  */.){.  if( p->r
1c3e0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
1c3f0 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e 6e 41 75 74  p->pConfig->nAut
1c400 6f 6d 65 72 67 65 3e 30 20 29 7b 0a 20 20 20 20  omerge>0 ){.    
1c410 46 74 73 35 53 74 72 75 63 74 75 72 65 20 2a 70  Fts5Structure *p
1c420 53 74 72 75 63 74 20 3d 20 2a 70 70 53 74 72 75  Struct = *ppStru
1c430 63 74 3b 0a 20 20 20 20 75 36 34 20 6e 57 72 69  ct;.    u64 nWri
1c440 74 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  te;             
1c450 20 20 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c        /* Initial
1c460 20 76 61 6c 75 65 20 6f 66 20 77 72 69 74 65 2d   value of write-
1c470 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20 69  counter */.    i
1c480 6e 74 20 6e 57 6f 72 6b 3b 20 20 20 20 20 20 20  nt nWork;       
1c490 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1c4a0 4e 75 6d 62 65 72 20 6f 66 20 77 6f 72 6b 2d 71  Number of work-q
1c4b0 75 61 6e 74 61 20 74 6f 20 70 65 72 66 6f 72 6d  uanta to perform
1c4c0 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 52 65 6d   */.    int nRem
1c4d0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1c4e0 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
1c4f0 6f 66 20 6c 65 61 66 20 70 61 67 65 73 20 6c 65  of leaf pages le
1c500 66 74 20 74 6f 20 77 72 69 74 65 20 2a 2f 0a 0a  ft to write */..
1c510 20 20 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68      /* Update th
1c520 65 20 77 72 69 74 65 2d 63 6f 75 6e 74 65 72 2e  e write-counter.
1c530 20 57 68 69 6c 65 20 64 6f 69 6e 67 20 73 6f 2c   While doing so,
1c540 20 73 65 74 20 6e 57 6f 72 6b 2e 20 2a 2f 0a 20   set nWork. */. 
1c550 20 20 20 6e 57 72 69 74 65 20 3d 20 70 53 74 72     nWrite = pStr
1c560 75 63 74 2d 3e 6e 57 72 69 74 65 43 6f 75 6e 74  uct->nWriteCount
1c570 65 72 3b 0a 20 20 20 20 6e 57 6f 72 6b 20 3d 20  er;.    nWork = 
1c580 28 69 6e 74 29 28 28 28 6e 57 72 69 74 65 20 2b  (int)(((nWrite +
1c590 20 6e 4c 65 61 66 29 20 2f 20 70 2d 3e 6e 57 6f   nLeaf) / p->nWo
1c5a0 72 6b 55 6e 69 74 29 20 2d 20 28 6e 57 72 69 74  rkUnit) - (nWrit
1c5b0 65 20 2f 20 70 2d 3e 6e 57 6f 72 6b 55 6e 69 74  e / p->nWorkUnit
1c5c0 29 29 3b 0a 20 20 20 20 70 53 74 72 75 63 74 2d  ));.    pStruct-
1c5d0 3e 6e 57 72 69 74 65 43 6f 75 6e 74 65 72 20 2b  >nWriteCounter +
1c5e0 3d 20 6e 4c 65 61 66 3b 0a 20 20 20 20 6e 52 65  = nLeaf;.    nRe
1c5f0 6d 20 3d 20 28 69 6e 74 29 28 70 2d 3e 6e 57 6f  m = (int)(p->nWo
1c600 72 6b 55 6e 69 74 20 2a 20 6e 57 6f 72 6b 20 2a  rkUnit * nWork *
1c610 20 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c   pStruct->nLevel
1c620 29 3b 0a 0a 20 20 20 20 66 74 73 35 49 6e 64 65  );..    fts5Inde
1c630 78 4d 65 72 67 65 28 70 2c 20 70 70 53 74 72 75  xMerge(p, ppStru
1c640 63 74 2c 20 6e 52 65 6d 29 3b 0a 20 20 7d 0a 7d  ct, nRem);.  }.}
1c650 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  ..static void ft
1c660 73 35 49 6e 64 65 78 43 72 69 73 69 73 6d 65 72  s5IndexCrisismer
1c670 67 65 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20  ge(.  Fts5Index 
1c680 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  *p,             
1c690 20 20 20 20 20 20 2f 2a 20 46 54 53 35 20 62 61        /* FTS5 ba
1c6a0 63 6b 65 6e 64 20 6f 62 6a 65 63 74 20 2a 2f 0a  ckend object */.
1c6b0 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65 20    Fts5Structure 
1c6c0 2a 2a 70 70 53 74 72 75 63 74 20 20 20 20 20 20  **ppStruct      
1c6d0 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 43 75 72    /* IN/OUT: Cur
1c6e0 72 65 6e 74 20 73 74 72 75 63 74 75 72 65 20 6f  rent structure o
1c6f0 66 20 69 6e 64 65 78 20 2a 2f 0a 29 7b 0a 20 20  f index */.){.  
1c700 63 6f 6e 73 74 20 69 6e 74 20 6e 43 72 69 73 69  const int nCrisi
1c710 73 20 3d 20 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e  s = p->pConfig->
1c720 6e 43 72 69 73 69 73 4d 65 72 67 65 3b 0a 20 20  nCrisisMerge;.  
1c730 46 74 73 35 53 74 72 75 63 74 75 72 65 20 2a 70  Fts5Structure *p
1c740 53 74 72 75 63 74 20 3d 20 2a 70 70 53 74 72 75  Struct = *ppStru
1c750 63 74 3b 0a 20 20 69 6e 74 20 69 4c 76 6c 20 3d  ct;.  int iLvl =
1c760 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70   0;..  assert( p
1c770 2d 3e 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc!=SQLITE_OK 
1c780 7c 7c 20 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76  || pStruct->nLev
1c790 65 6c 3e 30 20 29 3b 0a 20 20 77 68 69 6c 65 28  el>0 );.  while(
1c7a0 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
1c7b0 4b 20 26 26 20 70 53 74 72 75 63 74 2d 3e 61 4c  K && pStruct->aL
1c7c0 65 76 65 6c 5b 69 4c 76 6c 5d 2e 6e 53 65 67 3e  evel[iLvl].nSeg>
1c7d0 3d 6e 43 72 69 73 69 73 20 29 7b 0a 20 20 20 20  =nCrisis ){.    
1c7e0 66 74 73 35 49 6e 64 65 78 4d 65 72 67 65 4c 65  fts5IndexMergeLe
1c7f0 76 65 6c 28 70 2c 20 26 70 53 74 72 75 63 74 2c  vel(p, &pStruct,
1c800 20 69 4c 76 6c 2c 20 30 29 3b 0a 20 20 20 20 61   iLvl, 0);.    a
1c810 73 73 65 72 74 28 20 70 2d 3e 72 63 21 3d 53 51  ssert( p->rc!=SQ
1c820 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 53 74 72 75  LITE_OK || pStru
1c830 63 74 2d 3e 6e 4c 65 76 65 6c 3e 28 69 4c 76 6c  ct->nLevel>(iLvl
1c840 2b 31 29 20 29 3b 0a 20 20 20 20 66 74 73 35 53  +1) );.    fts5S
1c850 74 72 75 63 74 75 72 65 50 72 6f 6d 6f 74 65 28  tructurePromote(
1c860 70 2c 20 69 4c 76 6c 2b 31 2c 20 70 53 74 72 75  p, iLvl+1, pStru
1c870 63 74 29 3b 0a 20 20 20 20 69 4c 76 6c 2b 2b 3b  ct);.    iLvl++;
1c880 0a 20 20 7d 0a 20 20 2a 70 70 53 74 72 75 63 74  .  }.  *ppStruct
1c890 20 3d 20 70 53 74 72 75 63 74 3b 0a 7d 0a 0a 73   = pStruct;.}..s
1c8a0 74 61 74 69 63 20 69 6e 74 20 66 74 73 35 49 6e  tatic int fts5In
1c8b0 64 65 78 52 65 74 75 72 6e 28 46 74 73 35 49 6e  dexReturn(Fts5In
1c8c0 64 65 78 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72  dex *p){.  int r
1c8d0 63 20 3d 20 70 2d 3e 72 63 3b 0a 20 20 70 2d 3e  c = p->rc;.  p->
1c8e0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
1c8f0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
1c900 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 46  typedef struct F
1c910 74 73 35 46 6c 75 73 68 43 74 78 20 46 74 73 35  ts5FlushCtx Fts5
1c920 46 6c 75 73 68 43 74 78 3b 0a 73 74 72 75 63 74  FlushCtx;.struct
1c930 20 46 74 73 35 46 6c 75 73 68 43 74 78 20 7b 0a   Fts5FlushCtx {.
1c940 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 49 64    Fts5Index *pId
1c950 78 3b 0a 20 20 46 74 73 35 53 65 67 57 72 69 74  x;.  Fts5SegWrit
1c960 65 72 20 77 72 69 74 65 72 3b 20 0a 7d 3b 0a 0a  er writer; .};..
1c970 2f 2a 0a 2a 2a 20 42 75 66 66 65 72 20 61 42 75  /*.** Buffer aBu
1c980 66 5b 5d 20 63 6f 6e 74 61 69 6e 73 20 61 20 6c  f[] contains a l
1c990 69 73 74 20 6f 66 20 76 61 72 69 6e 74 73 2c 20  ist of varints, 
1c9a0 61 6c 6c 20 73 6d 61 6c 6c 20 65 6e 6f 75 67 68  all small enough
1c9b0 20 74 6f 20 66 69 74 0a 2a 2a 20 69 6e 20 61 20   to fit.** in a 
1c9c0 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72 2e 20  32-bit integer. 
1c9d0 52 65 74 75 72 6e 20 74 68 65 20 73 69 7a 65 20  Return the size 
1c9e0 6f 66 20 74 68 65 20 6c 61 72 67 65 73 74 20 70  of the largest p
1c9f0 72 65 66 69 78 20 6f 66 20 74 68 69 73 20 0a 2a  refix of this .*
1ca00 2a 20 6c 69 73 74 20 6e 4d 61 78 20 62 79 74 65  * list nMax byte
1ca10 73 20 6f 72 20 6c 65 73 73 20 69 6e 20 73 69 7a  s or less in siz
1ca20 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
1ca30 20 66 74 73 35 50 6f 73 6c 69 73 74 50 72 65 66   fts5PoslistPref
1ca40 69 78 28 63 6f 6e 73 74 20 75 38 20 2a 61 42 75  ix(const u8 *aBu
1ca50 66 2c 20 69 6e 74 20 6e 4d 61 78 29 7b 0a 20 20  f, int nMax){.  
1ca60 69 6e 74 20 72 65 74 3b 0a 20 20 75 33 32 20 64  int ret;.  u32 d
1ca70 75 6d 6d 79 3b 0a 20 20 72 65 74 20 3d 20 66 74  ummy;.  ret = ft
1ca80 73 35 47 65 74 56 61 72 69 6e 74 33 32 28 61 42  s5GetVarint32(aB
1ca90 75 66 2c 20 64 75 6d 6d 79 29 3b 0a 20 20 69 66  uf, dummy);.  if
1caa0 28 20 72 65 74 3c 6e 4d 61 78 20 29 7b 0a 20 20  ( ret<nMax ){.  
1cab0 20 20 77 68 69 6c 65 28 20 31 20 29 7b 0a 20 20    while( 1 ){.  
1cac0 20 20 20 20 69 6e 74 20 69 20 3d 20 66 74 73 35      int i = fts5
1cad0 47 65 74 56 61 72 69 6e 74 33 32 28 26 61 42 75  GetVarint32(&aBu
1cae0 66 5b 72 65 74 5d 2c 20 64 75 6d 6d 79 29 3b 0a  f[ret], dummy);.
1caf0 20 20 20 20 20 20 69 66 28 20 28 72 65 74 20 2b        if( (ret +
1cb00 20 69 29 20 3e 20 6e 4d 61 78 20 29 20 62 72 65   i) > nMax ) bre
1cb10 61 6b 3b 0a 20 20 20 20 20 20 72 65 74 20 2b 3d  ak;.      ret +=
1cb20 20 69 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20   i;.    }.  }.  
1cb30 72 65 74 75 72 6e 20 72 65 74 3b 0a 7d 0a 0a 23  return ret;.}..#
1cb40 64 65 66 69 6e 65 20 66 74 73 35 42 75 66 66 65  define fts5Buffe
1cb50 72 53 61 66 65 41 70 70 65 6e 64 42 6c 6f 62 28  rSafeAppendBlob(
1cb60 70 42 75 66 2c 20 70 42 6c 6f 62 2c 20 6e 42 6c  pBuf, pBlob, nBl
1cb70 6f 62 29 20 7b 20 20 20 20 20 5c 0a 20 20 61 73  ob) {     \.  as
1cb80 73 65 72 74 28 20 28 70 42 75 66 29 2d 3e 6e 53  sert( (pBuf)->nS
1cb90 70 61 63 65 3e 3d 28 28 70 42 75 66 29 2d 3e 6e  pace>=((pBuf)->n
1cba0 2b 6e 42 6c 6f 62 29 20 29 3b 20 20 20 20 20 20  +nBlob) );      
1cbb0 20 20 20 20 20 20 20 5c 0a 20 20 6d 65 6d 63 70         \.  memcp
1cbc0 79 28 26 28 70 42 75 66 29 2d 3e 70 5b 28 70 42  y(&(pBuf)->p[(pB
1cbd0 75 66 29 2d 3e 6e 5d 2c 20 70 42 6c 6f 62 2c 20  uf)->n], pBlob, 
1cbe0 6e 42 6c 6f 62 29 3b 20 20 20 20 20 20 20 20 20  nBlob);         
1cbf0 20 20 20 20 5c 0a 20 20 28 70 42 75 66 29 2d 3e      \.  (pBuf)->
1cc00 6e 20 2b 3d 20 6e 42 6c 6f 62 3b 20 20 20 20 20  n += nBlob;     
1cc10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cc20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cc30 20 5c 0a 7d 0a 0a 23 64 65 66 69 6e 65 20 66 74   \.}..#define ft
1cc40 73 35 42 75 66 66 65 72 53 61 66 65 41 70 70 65  s5BufferSafeAppe
1cc50 6e 64 56 61 72 69 6e 74 28 70 42 75 66 2c 20 69  ndVarint(pBuf, i
1cc60 56 61 6c 29 20 7b 20 20 20 20 20 20 20 20 20 20  Val) {          
1cc70 20 20 20 20 20 20 5c 0a 20 20 28 70 42 75 66 29        \.  (pBuf)
1cc80 2d 3e 6e 20 2b 3d 20 73 71 6c 69 74 65 33 46 74  ->n += sqlite3Ft
1cc90 73 35 50 75 74 56 61 72 69 6e 74 28 26 28 70 42  s5PutVarint(&(pB
1cca0 75 66 29 2d 3e 70 5b 28 70 42 75 66 29 2d 3e 6e  uf)->p[(pBuf)->n
1ccb0 5d 2c 20 28 69 56 61 6c 29 29 3b 20 20 5c 0a 20  ], (iVal));  \. 
1ccc0 20 61 73 73 65 72 74 28 20 28 70 42 75 66 29 2d   assert( (pBuf)-
1ccd0 3e 6e 53 70 61 63 65 3e 3d 28 70 42 75 66 29 2d  >nSpace>=(pBuf)-
1cce0 3e 6e 20 29 3b 20 20 20 20 20 20 20 20 20 20 20  >n );           
1ccf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
1cd00 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 6c 75 73 68 20  .}../*.** Flush 
1cd10 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
1cd20 69 6e 2d 6d 65 6d 6f 72 79 20 68 61 73 68 20 74  in-memory hash t
1cd30 61 62 6c 65 20 69 48 61 73 68 20 74 6f 20 61 20  able iHash to a 
1cd40 6e 65 77 20 6c 65 76 65 6c 2d 30 20 0a 2a 2a 20  new level-0 .** 
1cd50 73 65 67 6d 65 6e 74 20 6f 6e 20 64 69 73 6b 2e  segment on disk.
1cd60 20 41 6c 73 6f 20 75 70 64 61 74 65 20 74 68 65   Also update the
1cd70 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 73   corresponding s
1cd80 74 72 75 63 74 75 72 65 20 72 65 63 6f 72 64 2e  tructure record.
1cd90 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72  .**.** If an err
1cda0 6f 72 20 6f 63 63 75 72 73 2c 20 73 65 74 20 74  or occurs, set t
1cdb0 68 65 20 46 74 73 35 49 6e 64 65 78 2e 72 63 20  he Fts5Index.rc 
1cdc0 65 72 72 6f 72 20 63 6f 64 65 2e 20 49 66 20 61  error code. If a
1cdd0 6e 20 65 72 72 6f 72 20 68 61 73 20 0a 2a 2a 20  n error has .** 
1cde0 61 6c 72 65 61 64 79 20 6f 63 63 75 72 72 65 64  already occurred
1cdf0 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  , this function 
1ce00 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73  is a no-op..*/.s
1ce10 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 46  tatic void fts5F
1ce20 6c 75 73 68 4f 6e 65 48 61 73 68 28 46 74 73 35  lushOneHash(Fts5
1ce30 49 6e 64 65 78 20 2a 70 29 7b 0a 20 20 46 74 73  Index *p){.  Fts
1ce40 35 48 61 73 68 20 2a 70 48 61 73 68 20 3d 20 70  5Hash *pHash = p
1ce50 2d 3e 70 48 61 73 68 3b 0a 20 20 46 74 73 35 53  ->pHash;.  Fts5S
1ce60 74 72 75 63 74 75 72 65 20 2a 70 53 74 72 75 63  tructure *pStruc
1ce70 74 3b 0a 20 20 69 6e 74 20 69 53 65 67 69 64 3b  t;.  int iSegid;
1ce80 0a 20 20 69 6e 74 20 70 67 6e 6f 4c 61 73 74 20  .  int pgnoLast 
1ce90 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
1cea0 20 20 20 20 20 2f 2a 20 4c 61 73 74 20 6c 65 61       /* Last lea
1ceb0 66 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 6e  f page number in
1cec0 20 73 65 67 6d 65 6e 74 20 2a 2f 0a 0a 20 20 2f   segment */..  /
1ced0 2a 20 4f 62 74 61 69 6e 20 61 20 72 65 66 65 72  * Obtain a refer
1cee0 65 6e 63 65 20 74 6f 20 74 68 65 20 69 6e 64 65  ence to the inde
1cef0 78 20 73 74 72 75 63 74 75 72 65 20 61 6e 64 20  x structure and 
1cf00 61 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 73  allocate a new s
1cf10 65 67 6d 65 6e 74 2d 69 64 0a 20 20 2a 2a 20 66  egment-id.  ** f
1cf20 6f 72 20 74 68 65 20 6e 65 77 20 6c 65 76 65 6c  or the new level
1cf30 2d 30 20 73 65 67 6d 65 6e 74 2e 20 20 2a 2f 0a  -0 segment.  */.
1cf40 20 20 70 53 74 72 75 63 74 20 3d 20 66 74 73 35    pStruct = fts5
1cf50 53 74 72 75 63 74 75 72 65 52 65 61 64 28 70 29  StructureRead(p)
1cf60 3b 0a 20 20 69 53 65 67 69 64 20 3d 20 66 74 73  ;.  iSegid = fts
1cf70 35 41 6c 6c 6f 63 61 74 65 53 65 67 69 64 28 70  5AllocateSegid(p
1cf80 2c 20 70 53 74 72 75 63 74 29 3b 0a 0a 20 20 69  , pStruct);..  i
1cf90 66 28 20 69 53 65 67 69 64 20 29 7b 0a 20 20 20  f( iSegid ){.   
1cfa0 20 63 6f 6e 73 74 20 69 6e 74 20 70 67 73 7a 20   const int pgsz 
1cfb0 3d 20 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e 70 67  = p->pConfig->pg
1cfc0 73 7a 3b 0a 0a 20 20 20 20 46 74 73 35 53 74 72  sz;..    Fts5Str
1cfd0 75 63 74 75 72 65 53 65 67 6d 65 6e 74 20 2a 70  uctureSegment *p
1cfe0 53 65 67 3b 20 20 20 2f 2a 20 4e 65 77 20 73 65  Seg;   /* New se
1cff0 67 6d 65 6e 74 20 77 69 74 68 69 6e 20 70 53 74  gment within pSt
1d000 72 75 63 74 20 2a 2f 0a 20 20 20 20 46 74 73 35  ruct */.    Fts5
1d010 42 75 66 66 65 72 20 2a 70 42 75 66 3b 20 20 20  Buffer *pBuf;   
1d020 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 75 66            /* Buf
1d030 66 65 72 20 69 6e 20 77 68 69 63 68 20 74 6f 20  fer in which to 
1d040 61 73 73 65 6d 62 6c 65 20 6c 65 61 66 20 70 61  assemble leaf pa
1d050 67 65 20 2a 2f 0a 20 20 20 20 46 74 73 35 42 75  ge */.    Fts5Bu
1d060 66 66 65 72 20 2a 70 50 67 69 64 78 3b 20 20 20  ffer *pPgidx;   
1d070 20 20 20 20 20 20 20 20 2f 2a 20 42 75 66 66 65          /* Buffe
1d080 72 20 69 6e 20 77 68 69 63 68 20 74 6f 20 61 73  r in which to as
1d090 73 65 6d 62 6c 65 20 70 67 69 64 78 20 2a 2f 0a  semble pgidx */.
1d0a0 0a 20 20 20 20 46 74 73 35 53 65 67 57 72 69 74  .    Fts5SegWrit
1d0b0 65 72 20 77 72 69 74 65 72 3b 0a 20 20 20 20 66  er writer;.    f
1d0c0 74 73 35 57 72 69 74 65 49 6e 69 74 28 70 2c 20  ts5WriteInit(p, 
1d0d0 26 77 72 69 74 65 72 2c 20 69 53 65 67 69 64 29  &writer, iSegid)
1d0e0 3b 0a 0a 20 20 20 20 70 42 75 66 20 3d 20 26 77  ;..    pBuf = &w
1d0f0 72 69 74 65 72 2e 77 72 69 74 65 72 2e 62 75 66  riter.writer.buf
1d100 3b 0a 20 20 20 20 70 50 67 69 64 78 20 3d 20 26  ;.    pPgidx = &
1d110 77 72 69 74 65 72 2e 77 72 69 74 65 72 2e 70 67  writer.writer.pg
1d120 69 64 78 3b 0a 0a 20 20 20 20 2f 2a 20 66 74 73  idx;..    /* fts
1d130 35 57 72 69 74 65 49 6e 69 74 28 29 20 73 68 6f  5WriteInit() sho
1d140 75 6c 64 20 68 61 76 65 20 69 6e 69 74 69 61 6c  uld have initial
1d150 69 7a 65 64 20 74 68 65 20 62 75 66 66 65 72 73  ized the buffers
1d160 20 74 6f 20 28 6d 6f 73 74 20 6c 69 6b 65 6c 79   to (most likely
1d170 29 0a 20 20 20 20 2a 2a 20 74 68 65 20 6d 61 78  ).    ** the max
1d180 69 6d 75 6d 20 73 70 61 63 65 20 72 65 71 75 69  imum space requi
1d190 72 65 64 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65  red. */.    asse
1d1a0 72 74 28 20 70 2d 3e 72 63 20 7c 7c 20 70 42 75  rt( p->rc || pBu
1d1b0 66 2d 3e 6e 53 70 61 63 65 3e 3d 28 70 67 73 7a  f->nSpace>=(pgsz
1d1c0 20 2b 20 46 54 53 35 5f 44 41 54 41 5f 50 41 44   + FTS5_DATA_PAD
1d1d0 44 49 4e 47 29 20 29 3b 0a 20 20 20 20 61 73 73  DING) );.    ass
1d1e0 65 72 74 28 20 70 2d 3e 72 63 20 7c 7c 20 70 50  ert( p->rc || pP
1d1f0 67 69 64 78 2d 3e 6e 53 70 61 63 65 3e 3d 28 70  gidx->nSpace>=(p
1d200 67 73 7a 20 2b 20 46 54 53 35 5f 44 41 54 41 5f  gsz + FTS5_DATA_
1d210 50 41 44 44 49 4e 47 29 20 29 3b 0a 0a 20 20 20  PADDING) );..   
1d220 20 2f 2a 20 42 65 67 69 6e 20 73 63 61 6e 6e 69   /* Begin scanni
1d230 6e 67 20 74 68 72 6f 75 67 68 20 68 61 73 68 20  ng through hash 
1d240 74 61 62 6c 65 20 65 6e 74 72 69 65 73 2e 20 54  table entries. T
1d250 68 69 73 20 6c 6f 6f 70 20 72 75 6e 73 20 6f 6e  his loop runs on
1d260 63 65 20 66 6f 72 20 65 61 63 68 0a 20 20 20 20  ce for each.    
1d270 2a 2a 20 74 65 72 6d 2f 64 6f 63 6c 69 73 74 20  ** term/doclist 
1d280 63 75 72 72 65 6e 74 6c 79 20 73 74 6f 72 65 64  currently stored
1d290 20 77 69 74 68 69 6e 20 74 68 65 20 68 61 73 68   within the hash
1d2a0 20 74 61 62 6c 65 2e 20 2a 2f 0a 20 20 20 20 69   table. */.    i
1d2b0 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  f( p->rc==SQLITE
1d2c0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e  _OK ){.      p->
1d2d0 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74 73 35  rc = sqlite3Fts5
1d2e0 48 61 73 68 53 63 61 6e 49 6e 69 74 28 70 48 61  HashScanInit(pHa
1d2f0 73 68 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d  sh, 0, 0);.    }
1d300 0a 20 20 20 20 77 68 69 6c 65 28 20 70 2d 3e 72  .    while( p->r
1d310 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
1d320 30 3d 3d 73 71 6c 69 74 65 33 46 74 73 35 48 61  0==sqlite3Fts5Ha
1d330 73 68 53 63 61 6e 45 6f 66 28 70 48 61 73 68 29  shScanEof(pHash)
1d340 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20   ){.      const 
1d350 63 68 61 72 20 2a 7a 54 65 72 6d 3b 20 20 20 20  char *zTerm;    
1d360 20 20 20 20 20 20 2f 2a 20 42 75 66 66 65 72 20        /* Buffer 
1d370 63 6f 6e 74 61 69 6e 69 6e 67 20 74 65 72 6d 20  containing term 
1d380 2a 2f 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 75  */.      const u
1d390 38 20 2a 70 44 6f 63 6c 69 73 74 3b 20 20 20 20  8 *pDoclist;    
1d3a0 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
1d3b0 74 6f 20 64 6f 63 6c 69 73 74 20 66 6f 72 20 74  to doclist for t
1d3c0 68 69 73 20 74 65 72 6d 20 2a 2f 0a 20 20 20 20  his term */.    
1d3d0 20 20 69 6e 74 20 6e 44 6f 63 6c 69 73 74 3b 20    int nDoclist; 
1d3e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1d3f0 20 53 69 7a 65 20 6f 66 20 64 6f 63 6c 69 73 74   Size of doclist
1d400 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 0a 20 20   in bytes */..  
1d410 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65      /* Write the
1d420 20 74 65 72 6d 20 66 6f 72 20 74 68 69 73 20 65   term for this e
1d430 6e 74 72 79 20 74 6f 20 64 69 73 6b 2e 20 2a 2f  ntry to disk. */
1d440 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 46 74  .      sqlite3Ft
1d450 73 35 48 61 73 68 53 63 61 6e 45 6e 74 72 79 28  s5HashScanEntry(
1d460 70 48 61 73 68 2c 20 26 7a 54 65 72 6d 2c 20 26  pHash, &zTerm, &
1d470 70 44 6f 63 6c 69 73 74 2c 20 26 6e 44 6f 63 6c  pDoclist, &nDocl
1d480 69 73 74 29 3b 0a 20 20 20 20 20 20 66 74 73 35  ist);.      fts5
1d490 57 72 69 74 65 41 70 70 65 6e 64 54 65 72 6d 28  WriteAppendTerm(
1d4a0 70 2c 20 26 77 72 69 74 65 72 2c 20 28 69 6e 74  p, &writer, (int
1d4b0 29 73 74 72 6c 65 6e 28 7a 54 65 72 6d 29 2c 20  )strlen(zTerm), 
1d4c0 28 63 6f 6e 73 74 20 75 38 2a 29 7a 54 65 72 6d  (const u8*)zTerm
1d4d0 29 3b 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74  );..      assert
1d4e0 28 20 77 72 69 74 65 72 2e 62 46 69 72 73 74 52  ( writer.bFirstR
1d4f0 6f 77 69 64 49 6e 50 61 67 65 3d 3d 30 20 29 3b  owidInPage==0 );
1d500 0a 20 20 20 20 20 20 69 66 28 20 70 67 73 7a 3e  .      if( pgsz>
1d510 3d 28 70 42 75 66 2d 3e 6e 20 2b 20 70 50 67 69  =(pBuf->n + pPgi
1d520 64 78 2d 3e 6e 20 2b 20 6e 44 6f 63 6c 69 73 74  dx->n + nDoclist
1d530 20 2b 20 31 29 20 29 7b 0a 20 20 20 20 20 20 20   + 1) ){.       
1d540 20 2f 2a 20 54 68 65 20 65 6e 74 69 72 65 20 64   /* The entire d
1d550 6f 63 6c 69 73 74 20 77 69 6c 6c 20 66 69 74 20  oclist will fit 
1d560 6f 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c  on the current l
1d570 65 61 66 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  eaf. */.        
1d580 66 74 73 35 42 75 66 66 65 72 53 61 66 65 41 70  fts5BufferSafeAp
1d590 70 65 6e 64 42 6c 6f 62 28 70 42 75 66 2c 20 70  pendBlob(pBuf, p
1d5a0 44 6f 63 6c 69 73 74 2c 20 6e 44 6f 63 6c 69 73  Doclist, nDoclis
1d5b0 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  t);.      }else{
1d5c0 0a 20 20 20 20 20 20 20 20 69 36 34 20 69 52 6f  .        i64 iRo
1d5d0 77 69 64 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  wid = 0;.       
1d5e0 20 69 36 34 20 69 44 65 6c 74 61 20 3d 20 30 3b   i64 iDelta = 0;
1d5f0 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 4f 66  .        int iOf
1d600 66 20 3d 20 30 3b 0a 0a 20 20 20 20 20 20 20 20  f = 0;..        
1d610 2f 2a 20 54 68 65 20 65 6e 74 69 72 65 20 64 6f  /* The entire do
1d620 63 6c 69 73 74 20 77 69 6c 6c 20 6e 6f 74 20 66  clist will not f
1d630 69 74 20 6f 6e 20 74 68 69 73 20 6c 65 61 66 2e  it on this leaf.
1d640 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 0a   The following .
1d650 20 20 20 20 20 20 20 20 2a 2a 20 6c 6f 6f 70 20          ** loop 
1d660 69 74 65 72 61 74 65 73 20 74 68 72 6f 75 67 68  iterates through
1d670 20 74 68 65 20 70 6f 73 6c 69 73 74 73 20 74 68   the poslists th
1d680 61 74 20 6d 61 6b 65 20 75 70 20 74 68 65 20 63  at make up the c
1d690 75 72 72 65 6e 74 20 0a 20 20 20 20 20 20 20 20  urrent .        
1d6a0 2a 2a 20 64 6f 63 6c 69 73 74 2e 20 20 2a 2f 0a  ** doclist.  */.
1d6b0 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 70          while( p
1d6c0 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
1d6d0 26 26 20 69 4f 66 66 3c 6e 44 6f 63 6c 69 73 74  && iOff<nDoclist
1d6e0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e   ){.          in
1d6f0 74 20 6e 50 6f 73 3b 0a 20 20 20 20 20 20 20 20  t nPos;.        
1d700 20 20 69 6e 74 20 6e 43 6f 70 79 3b 0a 20 20 20    int nCopy;.   
1d710 20 20 20 20 20 20 20 69 6e 74 20 62 44 75 6d 6d         int bDumm
1d720 79 3b 0a 20 20 20 20 20 20 20 20 20 20 69 4f 66  y;.          iOf
1d730 66 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69  f += fts5GetVari
1d740 6e 74 28 26 70 44 6f 63 6c 69 73 74 5b 69 4f 66  nt(&pDoclist[iOf
1d750 66 5d 2c 20 28 75 36 34 2a 29 26 69 44 65 6c 74  f], (u64*)&iDelt
1d760 61 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6e 43  a);.          nC
1d770 6f 70 79 20 3d 20 66 74 73 35 47 65 74 50 6f 73  opy = fts5GetPos
1d780 6c 69 73 74 53 69 7a 65 28 26 70 44 6f 63 6c 69  listSize(&pDocli
1d790 73 74 5b 69 4f 66 66 5d 2c 20 26 6e 50 6f 73 2c  st[iOff], &nPos,
1d7a0 20 26 62 44 75 6d 6d 79 29 3b 0a 20 20 20 20 20   &bDummy);.     
1d7b0 20 20 20 20 20 6e 43 6f 70 79 20 2b 3d 20 6e 50       nCopy += nP
1d7c0 6f 73 3b 0a 20 20 20 20 20 20 20 20 20 20 69 52  os;.          iR
1d7d0 6f 77 69 64 20 2b 3d 20 69 44 65 6c 74 61 3b 0a  owid += iDelta;.
1d7e0 20 20 20 20 20 20 20 20 20 20 0a 20 20 20 20 20            .     
1d7f0 20 20 20 20 20 69 66 28 20 77 72 69 74 65 72 2e       if( writer.
1d800 62 46 69 72 73 74 52 6f 77 69 64 49 6e 50 61 67  bFirstRowidInPag
1d810 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  e ){.           
1d820 20 66 74 73 35 50 75 74 55 31 36 28 26 70 42 75   fts5PutU16(&pBu
1d830 66 2d 3e 70 5b 30 5d 2c 20 70 42 75 66 2d 3e 6e  f->p[0], pBuf->n
1d840 29 3b 20 20 20 2f 2a 20 66 69 72 73 74 20 72 6f  );   /* first ro
1d850 77 69 64 20 6f 6e 20 70 61 67 65 20 2a 2f 0a 20  wid on page */. 
1d860 20 20 20 20 20 20 20 20 20 20 20 70 42 75 66 2d             pBuf-
1d870 3e 6e 20 2b 3d 20 73 71 6c 69 74 65 33 46 74 73  >n += sqlite3Fts
1d880 35 50 75 74 56 61 72 69 6e 74 28 26 70 42 75 66  5PutVarint(&pBuf
1d890 2d 3e 70 5b 70 42 75 66 2d 3e 6e 5d 2c 20 69 52  ->p[pBuf->n], iR
1d8a0 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 20 20 20  owid);.         
1d8b0 20 20 20 77 72 69 74 65 72 2e 62 46 69 72 73 74     writer.bFirst
1d8c0 52 6f 77 69 64 49 6e 50 61 67 65 20 3d 20 30 3b  RowidInPage = 0;
1d8d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 74 73  .            fts
1d8e0 35 57 72 69 74 65 44 6c 69 64 78 41 70 70 65 6e  5WriteDlidxAppen
1d8f0 64 28 70 2c 20 26 77 72 69 74 65 72 2c 20 69 52  d(p, &writer, iR
1d900 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 20 20 20  owid);.         
1d910 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1d920 20 20 20 20 70 42 75 66 2d 3e 6e 20 2b 3d 20 73      pBuf->n += s
1d930 71 6c 69 74 65 33 46 74 73 35 50 75 74 56 61 72  qlite3Fts5PutVar
1d940 69 6e 74 28 26 70 42 75 66 2d 3e 70 5b 70 42 75  int(&pBuf->p[pBu
1d950 66 2d 3e 6e 5d 2c 20 69 44 65 6c 74 61 29 3b 0a  f->n], iDelta);.
1d960 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
1d970 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 42        assert( pB
1d980 75 66 2d 3e 6e 3c 3d 70 42 75 66 2d 3e 6e 53 70  uf->n<=pBuf->nSp
1d990 61 63 65 20 29 3b 0a 0a 20 20 20 20 20 20 20 20  ace );..        
1d9a0 20 20 69 66 28 20 28 70 42 75 66 2d 3e 6e 20 2b    if( (pBuf->n +
1d9b0 20 70 50 67 69 64 78 2d 3e 6e 20 2b 20 6e 43 6f   pPgidx->n + nCo
1d9c0 70 79 29 20 3c 3d 20 70 67 73 7a 20 29 7b 0a 20  py) <= pgsz ){. 
1d9d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
1d9e0 65 20 65 6e 74 69 72 65 20 70 6f 73 6c 69 73 74  e entire poslist
1d9f0 20 77 69 6c 6c 20 66 69 74 20 6f 6e 20 74 68 65   will fit on the
1da00 20 63 75 72 72 65 6e 74 20 6c 65 61 66 2e 20 53   current leaf. S
1da10 6f 20 63 6f 70 79 0a 20 20 20 20 20 20 20 20 20  o copy.         
1da20 20 20 20 2a 2a 20 69 74 20 69 6e 20 6f 6e 65 20     ** it in one 
1da30 67 6f 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  go. */.         
1da40 20 20 20 66 74 73 35 42 75 66 66 65 72 53 61 66     fts5BufferSaf
1da50 65 41 70 70 65 6e 64 42 6c 6f 62 28 70 42 75 66  eAppendBlob(pBuf
1da60 2c 20 26 70 44 6f 63 6c 69 73 74 5b 69 4f 66 66  , &pDoclist[iOff
1da70 5d 2c 20 6e 43 6f 70 79 29 3b 0a 20 20 20 20 20  ], nCopy);.     
1da80 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
1da90 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 65          /* The e
1daa0 6e 74 69 72 65 20 70 6f 73 6c 69 73 74 20 77 69  ntire poslist wi
1dab0 6c 6c 20 6e 6f 74 20 66 69 74 20 6f 6e 20 74 68  ll not fit on th
1dac0 69 73 20 6c 65 61 66 2e 20 53 6f 20 69 74 20 6e  is leaf. So it n
1dad0 65 65 64 73 0a 20 20 20 20 20 20 20 20 20 20 20  eeds.           
1dae0 20 2a 2a 20 74 6f 20 62 65 20 62 72 6f 6b 65 6e   ** to be broken
1daf0 20 69 6e 74 6f 20 73 65 63 74 69 6f 6e 73 2e 20   into sections. 
1db00 54 68 65 20 6f 6e 6c 79 20 71 75 61 6c 69 66 69  The only qualifi
1db10 63 61 74 69 6f 6e 20 62 65 69 6e 67 0a 20 20 20  cation being.   
1db20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 68 61 74           ** that
1db30 20 65 61 63 68 20 76 61 72 69 6e 74 20 6d 75 73   each varint mus
1db40 74 20 62 65 20 73 74 6f 72 65 64 20 63 6f 6e 74  t be stored cont
1db50 69 67 75 6f 75 73 6c 79 2e 20 20 2a 2f 0a 20 20  iguously.  */.  
1db60 20 20 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20            const 
1db70 75 38 20 2a 70 50 6f 73 6c 69 73 74 20 3d 20 26  u8 *pPoslist = &
1db80 70 44 6f 63 6c 69 73 74 5b 69 4f 66 66 5d 3b 0a  pDoclist[iOff];.
1db90 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20              int 
1dba0 69 50 6f 73 20 3d 20 30 3b 0a 20 20 20 20 20 20  iPos = 0;.      
1dbb0 20 20 20 20 20 20 77 68 69 6c 65 28 20 70 2d 3e        while( p->
1dbc0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
1dbd0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  .              i
1dbe0 6e 74 20 6e 53 70 61 63 65 20 3d 20 70 67 73 7a  nt nSpace = pgsz
1dbf0 20 2d 20 70 42 75 66 2d 3e 6e 20 2d 20 70 50 67   - pBuf->n - pPg
1dc00 69 64 78 2d 3e 6e 3b 0a 20 20 20 20 20 20 20 20  idx->n;.        
1dc10 20 20 20 20 20 20 69 6e 74 20 6e 20 3d 20 30 3b        int n = 0;
1dc20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  .              i
1dc30 66 28 20 28 6e 43 6f 70 79 20 2d 20 69 50 6f 73  f( (nCopy - iPos
1dc40 29 3c 3d 6e 53 70 61 63 65 20 29 7b 0a 20 20 20  )<=nSpace ){.   
1dc50 20 20 20 20 20 20 20 20 20 20 20 20 20 6e 20 3d               n =
1dc60 20 6e 43 6f 70 79 20 2d 20 69 50 6f 73 3b 0a 20   nCopy - iPos;. 
1dc70 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 65 6c               }el
1dc80 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
1dc90 20 20 20 20 6e 20 3d 20 66 74 73 35 50 6f 73 6c      n = fts5Posl
1dca0 69 73 74 50 72 65 66 69 78 28 26 70 50 6f 73 6c  istPrefix(&pPosl
1dcb0 69 73 74 5b 69 50 6f 73 5d 2c 20 6e 53 70 61 63  ist[iPos], nSpac
1dcc0 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  e);.            
1dcd0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
1dce0 20 20 61 73 73 65 72 74 28 20 6e 3e 30 20 29 3b    assert( n>0 );
1dcf0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66  .              f
1dd00 74 73 35 42 75 66 66 65 72 53 61 66 65 41 70 70  ts5BufferSafeApp
1dd10 65 6e 64 42 6c 6f 62 28 70 42 75 66 2c 20 26 70  endBlob(pBuf, &p
1dd20 50 6f 73 6c 69 73 74 5b 69 50 6f 73 5d 2c 20 6e  Poslist[iPos], n
1dd30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
1dd40 20 69 50 6f 73 20 2b 3d 20 6e 3b 0a 20 20 20 20   iPos += n;.    
1dd50 20 20 20 20 20 20 20 20 20 20 69 66 28 20 28 70            if( (p
1dd60 42 75 66 2d 3e 6e 20 2b 20 70 50 67 69 64 78 2d  Buf->n + pPgidx-
1dd70 3e 6e 29 3e 3d 70 67 73 7a 20 29 7b 0a 20 20 20  >n)>=pgsz ){.   
1dd80 20 20 20 20 20 20 20 20 20 20 20 20 20 66 74 73               fts
1dd90 35 57 72 69 74 65 46 6c 75 73 68 4c 65 61 66 28  5WriteFlushLeaf(
1dda0 70 2c 20 26 77 72 69 74 65 72 29 3b 0a 20 20 20  p, &writer);.   
1ddb0 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
1ddc0 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69             if( i
1ddd0 50 6f 73 3e 3d 6e 43 6f 70 79 20 29 20 62 72 65  Pos>=nCopy ) bre
1dde0 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ak;.            
1ddf0 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  }.          }.  
1de00 20 20 20 20 20 20 20 20 69 4f 66 66 20 2b 3d 20          iOff += 
1de10 6e 43 6f 70 79 3b 0a 20 20 20 20 20 20 20 20 7d  nCopy;.        }
1de20 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
1de30 2f 2a 20 54 4f 44 4f 32 3a 20 44 6f 63 6c 69 73  /* TODO2: Doclis
1de40 74 20 74 65 72 6d 69 6e 61 74 6f 72 20 77 72 69  t terminator wri
1de50 74 74 65 6e 20 68 65 72 65 2e 20 2a 2f 0a 20 20  tten here. */.  
1de60 20 20 20 20 2f 2a 20 70 42 75 66 2d 3e 70 5b 70      /* pBuf->p[p
1de70 42 75 66 2d 3e 6e 2b 2b 5d 20 3d 20 27 5c 30 27  Buf->n++] = '\0'
1de80 3b 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72  ; */.      asser
1de90 74 28 20 70 42 75 66 2d 3e 6e 3c 3d 70 42 75 66  t( pBuf->n<=pBuf
1dea0 2d 3e 6e 53 70 61 63 65 20 29 3b 0a 20 20 20 20  ->nSpace );.    
1deb0 20 20 73 71 6c 69 74 65 33 46 74 73 35 48 61 73    sqlite3Fts5Has
1dec0 68 53 63 61 6e 4e 65 78 74 28 70 48 61 73 68 29  hScanNext(pHash)
1ded0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
1dee0 74 65 33 46 74 73 35 48 61 73 68 43 6c 65 61 72  te3Fts5HashClear
1def0 28 70 48 61 73 68 29 3b 0a 20 20 20 20 66 74 73  (pHash);.    fts
1df00 35 57 72 69 74 65 46 69 6e 69 73 68 28 70 2c 20  5WriteFinish(p, 
1df10 26 77 72 69 74 65 72 2c 20 26 70 67 6e 6f 4c 61  &writer, &pgnoLa
1df20 73 74 29 3b 0a 0a 20 20 20 20 2f 2a 20 55 70 64  st);..    /* Upd
1df30 61 74 65 20 74 68 65 20 46 74 73 35 53 74 72 75  ate the Fts5Stru
1df40 63 74 75 72 65 2e 20 49 74 20 69 73 20 77 72 69  cture. It is wri
1df50 74 74 65 6e 20 62 61 63 6b 20 74 6f 20 74 68 65  tten back to the
1df60 20 64 61 74 61 62 61 73 65 20 62 79 20 74 68 65   database by the
1df70 0a 20 20 20 20 2a 2a 20 66 74 73 35 53 74 72 75  .    ** fts5Stru
1df80 63 74 75 72 65 52 65 6c 65 61 73 65 28 29 20 63  ctureRelease() c
1df90 61 6c 6c 20 62 65 6c 6f 77 2e 20 20 2a 2f 0a 20  all below.  */. 
1dfa0 20 20 20 69 66 28 20 70 53 74 72 75 63 74 2d 3e     if( pStruct->
1dfb0 6e 4c 65 76 65 6c 3d 3d 30 20 29 7b 0a 20 20 20  nLevel==0 ){.   
1dfc0 20 20 20 66 74 73 35 53 74 72 75 63 74 75 72 65     fts5Structure
1dfd0 41 64 64 4c 65 76 65 6c 28 26 70 2d 3e 72 63 2c  AddLevel(&p->rc,
1dfe0 20 26 70 53 74 72 75 63 74 29 3b 0a 20 20 20 20   &pStruct);.    
1dff0 7d 0a 20 20 20 20 66 74 73 35 53 74 72 75 63 74  }.    fts5Struct
1e000 75 72 65 45 78 74 65 6e 64 4c 65 76 65 6c 28 26  ureExtendLevel(&
1e010 70 2d 3e 72 63 2c 20 70 53 74 72 75 63 74 2c 20  p->rc, pStruct, 
1e020 30 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 69 66  0, 1, 0);.    if
1e030 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
1e040 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 53 65 67  OK ){.      pSeg
1e050 20 3d 20 26 70 53 74 72 75 63 74 2d 3e 61 4c 65   = &pStruct->aLe
1e060 76 65 6c 5b 30 5d 2e 61 53 65 67 5b 20 70 53 74  vel[0].aSeg[ pSt
1e070 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 30 5d 2e  ruct->aLevel[0].
1e080 6e 53 65 67 2b 2b 20 5d 3b 0a 20 20 20 20 20 20  nSeg++ ];.      
1e090 70 53 65 67 2d 3e 69 53 65 67 69 64 20 3d 20 69  pSeg->iSegid = i
1e0a0 53 65 67 69 64 3b 0a 20 20 20 20 20 20 70 53 65  Segid;.      pSe
1e0b0 67 2d 3e 70 67 6e 6f 46 69 72 73 74 20 3d 20 31  g->pgnoFirst = 1
1e0c0 3b 0a 20 20 20 20 20 20 70 53 65 67 2d 3e 70 67  ;.      pSeg->pg
1e0d0 6e 6f 4c 61 73 74 20 3d 20 70 67 6e 6f 4c 61 73  noLast = pgnoLas
1e0e0 74 3b 0a 20 20 20 20 20 20 70 53 74 72 75 63 74  t;.      pStruct
1e0f0 2d 3e 6e 53 65 67 6d 65 6e 74 2b 2b 3b 0a 20 20  ->nSegment++;.  
1e100 20 20 7d 0a 20 20 20 20 66 74 73 35 53 74 72 75    }.    fts5Stru
1e110 63 74 75 72 65 50 72 6f 6d 6f 74 65 28 70 2c 20  cturePromote(p, 
1e120 30 2c 20 70 53 74 72 75 63 74 29 3b 0a 20 20 7d  0, pStruct);.  }
1e130 0a 0a 20 20 66 74 73 35 49 6e 64 65 78 41 75 74  ..  fts5IndexAut
1e140 6f 6d 65 72 67 65 28 70 2c 20 26 70 53 74 72 75  omerge(p, &pStru
1e150 63 74 2c 20 70 67 6e 6f 4c 61 73 74 29 3b 0a 20  ct, pgnoLast);. 
1e160 20 66 74 73 35 49 6e 64 65 78 43 72 69 73 69 73   fts5IndexCrisis
1e170 6d 65 72 67 65 28 70 2c 20 26 70 53 74 72 75 63  merge(p, &pStruc
1e180 74 29 3b 0a 20 20 66 74 73 35 53 74 72 75 63 74  t);.  fts5Struct
1e190 75 72 65 57 72 69 74 65 28 70 2c 20 70 53 74 72  ureWrite(p, pStr
1e1a0 75 63 74 29 3b 0a 20 20 66 74 73 35 53 74 72 75  uct);.  fts5Stru
1e1b0 63 74 75 72 65 52 65 6c 65 61 73 65 28 70 53 74  ctureRelease(pSt
1e1c0 72 75 63 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ruct);.}../*.** 
1e1d0 46 6c 75 73 68 20 61 6e 79 20 64 61 74 61 20 73  Flush any data s
1e1e0 74 6f 72 65 64 20 69 6e 20 74 68 65 20 69 6e 2d  tored in the in-
1e1f0 6d 65 6d 6f 72 79 20 68 61 73 68 20 74 61 62 6c  memory hash tabl
1e200 65 73 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  es to the databa
1e210 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  se..*/.static vo
1e220 69 64 20 66 74 73 35 49 6e 64 65 78 46 6c 75 73  id fts5IndexFlus
1e230 68 28 46 74 73 35 49 6e 64 65 78 20 2a 70 29 7b  h(Fts5Index *p){
1e240 0a 20 20 2f 2a 20 55 6e 6c 65 73 73 20 69 74 20  .  /* Unless it 
1e250 69 73 20 65 6d 70 74 79 2c 20 66 6c 75 73 68 20  is empty, flush 
1e260 74 68 65 20 68 61 73 68 20 74 61 62 6c 65 20 74  the hash table t
1e270 6f 20 64 69 73 6b 20 2a 2f 0a 20 20 69 66 28 20  o disk */.  if( 
1e280 70 2d 3e 6e 50 65 6e 64 69 6e 67 44 61 74 61 20  p->nPendingData 
1e290 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
1e2a0 2d 3e 70 48 61 73 68 20 29 3b 0a 20 20 20 20 70  ->pHash );.    p
1e2b0 2d 3e 6e 50 65 6e 64 69 6e 67 44 61 74 61 20 3d  ->nPendingData =
1e2c0 20 30 3b 0a 20 20 20 20 66 74 73 35 46 6c 75 73   0;.    fts5Flus
1e2d0 68 4f 6e 65 48 61 73 68 28 70 29 3b 0a 20 20 7d  hOneHash(p);.  }
1e2e0 0a 7d 0a 0a 0a 69 6e 74 20 73 71 6c 69 74 65 33  .}...int sqlite3
1e2f0 46 74 73 35 49 6e 64 65 78 4f 70 74 69 6d 69 7a  Fts5IndexOptimiz
1e300 65 28 46 74 73 35 49 6e 64 65 78 20 2a 70 29 7b  e(Fts5Index *p){
1e310 0a 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65  .  Fts5Structure
1e320 20 2a 70 53 74 72 75 63 74 3b 0a 20 20 46 74 73   *pStruct;.  Fts
1e330 35 53 74 72 75 63 74 75 72 65 20 2a 70 4e 65 77  5Structure *pNew
1e340 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 53 65 67   = 0;.  int nSeg
1e350 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28   = 0;..  assert(
1e360 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
1e370 4b 20 29 3b 0a 20 20 66 74 73 35 49 6e 64 65 78  K );.  fts5Index
1e380 46 6c 75 73 68 28 70 29 3b 0a 20 20 70 53 74 72  Flush(p);.  pStr
1e390 75 63 74 20 3d 20 66 74 73 35 53 74 72 75 63 74  uct = fts5Struct
1e3a0 75 72 65 52 65 61 64 28 70 29 3b 0a 0a 20 20 69  ureRead(p);..  i
1e3b0 66 28 20 70 53 74 72 75 63 74 20 29 7b 0a 20 20  f( pStruct ){.  
1e3c0 20 20 61 73 73 65 72 74 28 20 70 53 74 72 75 63    assert( pStruc
1e3d0 74 2d 3e 6e 53 65 67 6d 65 6e 74 3d 3d 66 74 73  t->nSegment==fts
1e3e0 35 53 74 72 75 63 74 75 72 65 43 6f 75 6e 74 53  5StructureCountS
1e3f0 65 67 6d 65 6e 74 73 28 70 53 74 72 75 63 74 29  egments(pStruct)
1e400 20 29 3b 0a 20 20 20 20 6e 53 65 67 20 3d 20 70   );.    nSeg = p
1e410 53 74 72 75 63 74 2d 3e 6e 53 65 67 6d 65 6e 74  Struct->nSegment
1e420 3b 0a 20 20 20 20 69 66 28 20 6e 53 65 67 3e 31  ;.    if( nSeg>1
1e430 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 42   ){.      int nB
1e440 79 74 65 20 3d 20 73 69 7a 65 6f 66 28 46 74 73  yte = sizeof(Fts
1e450 35 53 74 72 75 63 74 75 72 65 29 3b 0a 20 20 20  5Structure);.   
1e460 20 20 20 6e 42 79 74 65 20 2b 3d 20 28 70 53 74     nByte += (pSt
1e470 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 2b 31 29 20  ruct->nLevel+1) 
1e480 2a 20 73 69 7a 65 6f 66 28 46 74 73 35 53 74 72  * sizeof(Fts5Str
1e490 75 63 74 75 72 65 4c 65 76 65 6c 29 3b 0a 20 20  uctureLevel);.  
1e4a0 20 20 20 20 70 4e 65 77 20 3d 20 28 46 74 73 35      pNew = (Fts5
1e4b0 53 74 72 75 63 74 75 72 65 2a 29 73 71 6c 69 74  Structure*)sqlit
1e4c0 65 33 46 74 73 35 4d 61 6c 6c 6f 63 5a 65 72 6f  e3Fts5MallocZero
1e4d0 28 26 70 2d 3e 72 63 2c 20 6e 42 79 74 65 29 3b  (&p->rc, nByte);
1e4e0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
1e4f0 20 70 4e 65 77 20 29 7b 0a 20 20 20 20 46 74 73   pNew ){.    Fts
1e500 35 53 74 72 75 63 74 75 72 65 4c 65 76 65 6c 20  5StructureLevel 
1e510 2a 70 4c 76 6c 3b 0a 20 20 20 20 69 6e 74 20 6e  *pLvl;.    int n
1e520 42 79 74 65 20 3d 20 6e 53 65 67 20 2a 20 73 69  Byte = nSeg * si
1e530 7a 65 6f 66 28 46 74 73 35 53 74 72 75 63 74 75  zeof(Fts5Structu
1e540 72 65 53 65 67 6d 65 6e 74 29 3b 0a 20 20 20 20  reSegment);.    
1e550 70 4e 65 77 2d 3e 6e 4c 65 76 65 6c 20 3d 20 70  pNew->nLevel = p
1e560 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 2b 31  Struct->nLevel+1
1e570 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 52 65 66  ;.    pNew->nRef
1e580 20 3d 20 31 3b 0a 20 20 20 20 70 4e 65 77 2d 3e   = 1;.    pNew->
1e590 6e 57 72 69 74 65 43 6f 75 6e 74 65 72 20 3d 20  nWriteCounter = 
1e5a0 70 53 74 72 75 63 74 2d 3e 6e 57 72 69 74 65 43  pStruct->nWriteC
1e5b0 6f 75 6e 74 65 72 3b 0a 20 20 20 20 70 4c 76 6c  ounter;.    pLvl
1e5c0 20 3d 20 26 70 4e 65 77 2d 3e 61 4c 65 76 65 6c   = &pNew->aLevel
1e5d0 5b 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c  [pStruct->nLevel
1e5e0 5d 3b 0a 20 20 20 20 70 4c 76 6c 2d 3e 61 53 65  ];.    pLvl->aSe
1e5f0 67 20 3d 20 28 46 74 73 35 53 74 72 75 63 74 75  g = (Fts5Structu
1e600 72 65 53 65 67 6d 65 6e 74 2a 29 73 71 6c 69 74  reSegment*)sqlit
1e610 65 33 46 74 73 35 4d 61 6c 6c 6f 63 5a 65 72 6f  e3Fts5MallocZero
1e620 28 26 70 2d 3e 72 63 2c 20 6e 42 79 74 65 29 3b  (&p->rc, nByte);
1e630 0a 20 20 20 20 69 66 28 20 70 4c 76 6c 2d 3e 61  .    if( pLvl->a
1e640 53 65 67 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  Seg ){.      int
1e650 20 69 4c 76 6c 2c 20 69 53 65 67 3b 0a 20 20 20   iLvl, iSeg;.   
1e660 20 20 20 69 6e 74 20 69 53 65 67 4f 75 74 20 3d     int iSegOut =
1e670 20 30 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 4c   0;.      for(iL
1e680 76 6c 3d 30 3b 20 69 4c 76 6c 3c 70 53 74 72 75  vl=0; iLvl<pStru
1e690 63 74 2d 3e 6e 4c 65 76 65 6c 3b 20 69 4c 76 6c  ct->nLevel; iLvl
1e6a0 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 66 6f 72  ++){.        for
1e6b0 28 69 53 65 67 3d 30 3b 20 69 53 65 67 3c 70 53  (iSeg=0; iSeg<pS
1e6c0 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c  truct->aLevel[iL
1e6d0 76 6c 5d 2e 6e 53 65 67 3b 20 69 53 65 67 2b 2b  vl].nSeg; iSeg++
1e6e0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4c 76  ){.          pLv
1e6f0 6c 2d 3e 61 53 65 67 5b 69 53 65 67 4f 75 74 5d  l->aSeg[iSegOut]
1e700 20 3d 20 70 53 74 72 75 63 74 2d 3e 61 4c 65 76   = pStruct->aLev
1e710 65 6c 5b 69 4c 76 6c 5d 2e 61 53 65 67 5b 69 53  el[iLvl].aSeg[iS
1e720 65 67 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 69  eg];.          i
1e730 53 65 67 4f 75 74 2b 2b 3b 0a 20 20 20 20 20 20  SegOut++;.      
1e740 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
1e750 20 20 70 4e 65 77 2d 3e 6e 53 65 67 6d 65 6e 74    pNew->nSegment
1e760 20 3d 20 70 4c 76 6c 2d 3e 6e 53 65 67 20 3d 20   = pLvl->nSeg = 
1e770 6e 53 65 67 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  nSeg;.    }else{
1e780 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
1e790 72 65 65 28 70 4e 65 77 29 3b 0a 20 20 20 20 20  ree(pNew);.     
1e7a0 20 70 4e 65 77 20 3d 20 30 3b 0a 20 20 20 20 7d   pNew = 0;.    }
1e7b0 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 4e 65 77  .  }..  if( pNew
1e7c0 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 4c 76 6c   ){.    int iLvl
1e7d0 20 3d 20 70 4e 65 77 2d 3e 6e 4c 65 76 65 6c 2d   = pNew->nLevel-
1e7e0 31 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 70 2d  1;.    while( p-
1e7f0 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26  >rc==SQLITE_OK &
1e800 26 20 70 4e 65 77 2d 3e 61 4c 65 76 65 6c 5b 69  & pNew->aLevel[i
1e810 4c 76 6c 5d 2e 6e 53 65 67 3e 30 20 29 7b 0a 20  Lvl].nSeg>0 ){. 
1e820 20 20 20 20 20 69 6e 74 20 6e 52 65 6d 20 3d 20       int nRem = 
1e830 46 54 53 35 5f 4f 50 54 5f 57 4f 52 4b 5f 55 4e  FTS5_OPT_WORK_UN
1e840 49 54 3b 0a 20 20 20 20 20 20 66 74 73 35 49 6e  IT;.      fts5In
1e850 64 65 78 4d 65 72 67 65 4c 65 76 65 6c 28 70 2c  dexMergeLevel(p,
1e860 20 26 70 4e 65 77 2c 20 69 4c 76 6c 2c 20 26 6e   &pNew, iLvl, &n
1e870 52 65 6d 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  Rem);.    }..   
1e880 20 66 74 73 35 53 74 72 75 63 74 75 72 65 57 72   fts5StructureWr
1e890 69 74 65 28 70 2c 20 70 4e 65 77 29 3b 0a 20 20  ite(p, pNew);.  
1e8a0 20 20 66 74 73 35 53 74 72 75 63 74 75 72 65 52    fts5StructureR
1e8b0 65 6c 65 61 73 65 28 70 4e 65 77 29 3b 0a 20 20  elease(pNew);.  
1e8c0 7d 0a 0a 20 20 66 74 73 35 53 74 72 75 63 74 75  }..  fts5Structu
1e8d0 72 65 52 65 6c 65 61 73 65 28 70 53 74 72 75 63  reRelease(pStruc
1e8e0 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 66 74 73  t);.  return fts
1e8f0 35 49 6e 64 65 78 52 65 74 75 72 6e 28 70 29 3b  5IndexReturn(p);
1e900 20 0a 7d 0a 0a 69 6e 74 20 73 71 6c 69 74 65 33   .}..int sqlite3
1e910 46 74 73 35 49 6e 64 65 78 4d 65 72 67 65 28 46  Fts5IndexMerge(F
1e920 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 69 6e 74  ts5Index *p, int
1e930 20 6e 4d 65 72 67 65 29 7b 0a 20 20 46 74 73 35   nMerge){.  Fts5
1e940 53 74 72 75 63 74 75 72 65 20 2a 70 53 74 72 75  Structure *pStru
1e950 63 74 3b 0a 0a 20 20 70 53 74 72 75 63 74 20 3d  ct;..  pStruct =
1e960 20 66 74 73 35 53 74 72 75 63 74 75 72 65 52 65   fts5StructureRe
1e970 61 64 28 70 29 3b 0a 20 20 69 66 28 20 70 53 74  ad(p);.  if( pSt
1e980 72 75 63 74 20 26 26 20 70 53 74 72 75 63 74 2d  ruct && pStruct-
1e990 3e 6e 4c 65 76 65 6c 20 29 7b 0a 20 20 20 20 66  >nLevel ){.    f
1e9a0 74 73 35 49 6e 64 65 78 4d 65 72 67 65 28 70 2c  ts5IndexMerge(p,
1e9b0 20 26 70 53 74 72 75 63 74 2c 20 6e 4d 65 72 67   &pStruct, nMerg
1e9c0 65 29 3b 0a 20 20 20 20 66 74 73 35 53 74 72 75  e);.    fts5Stru
1e9d0 63 74 75 72 65 57 72 69 74 65 28 70 2c 20 70 53  ctureWrite(p, pS
1e9e0 74 72 75 63 74 29 3b 0a 20 20 7d 0a 20 20 66 74  truct);.  }.  ft
1e9f0 73 35 53 74 72 75 63 74 75 72 65 52 65 6c 65 61  s5StructureRelea
1ea00 73 65 28 70 53 74 72 75 63 74 29 3b 0a 0a 20 20  se(pStruct);..  
1ea10 72 65 74 75 72 6e 20 66 74 73 35 49 6e 64 65 78  return fts5Index
1ea20 52 65 74 75 72 6e 28 70 29 3b 0a 7d 0a 0a 73 74  Return(p);.}..st
1ea30 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 50 6f  atic void fts5Po
1ea40 73 6c 69 73 74 43 61 6c 6c 62 61 63 6b 28 0a 20  slistCallback(. 
1ea50 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 0a   Fts5Index *p, .
1ea60 20 20 76 6f 69 64 20 2a 70 43 6f 6e 74 65 78 74    void *pContext
1ea70 2c 20 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 70  , .  const u8 *p
1ea80 43 68 75 6e 6b 2c 20 69 6e 74 20 6e 43 68 75 6e  Chunk, int nChun
1ea90 6b 0a 29 7b 0a 20 20 61 73 73 65 72 74 5f 6e 63  k.){.  assert_nc
1eaa0 28 20 6e 43 68 75 6e 6b 3e 3d 30 20 29 3b 0a 20  ( nChunk>=0 );. 
1eab0 20 69 66 28 20 6e 43 68 75 6e 6b 3e 30 20 29 7b   if( nChunk>0 ){
1eac0 0a 20 20 20 20 66 74 73 35 42 75 66 66 65 72 53  .    fts5BufferS
1ead0 61 66 65 41 70 70 65 6e 64 42 6c 6f 62 28 28 46  afeAppendBlob((F
1eae0 74 73 35 42 75 66 66 65 72 2a 29 70 43 6f 6e 74  ts5Buffer*)pCont
1eaf0 65 78 74 2c 20 70 43 68 75 6e 6b 2c 20 6e 43 68  ext, pChunk, nCh
1eb00 75 6e 6b 29 3b 0a 20 20 7d 0a 7d 0a 0a 74 79 70  unk);.  }.}..typ
1eb10 65 64 65 66 20 73 74 72 75 63 74 20 50 6f 73 6c  edef struct Posl
1eb20 69 73 74 43 61 6c 6c 62 61 63 6b 43 74 78 20 50  istCallbackCtx P
1eb30 6f 73 6c 69 73 74 43 61 6c 6c 62 61 63 6b 43 74  oslistCallbackCt
1eb40 78 3b 0a 73 74 72 75 63 74 20 50 6f 73 6c 69 73  x;.struct Poslis
1eb50 74 43 61 6c 6c 62 61 63 6b 43 74 78 20 7b 0a 20  tCallbackCtx {. 
1eb60 20 46 74 73 35 42 75 66 66 65 72 20 2a 70 42 75   Fts5Buffer *pBu
1eb70 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  f;              
1eb80 20 2f 2a 20 41 70 70 65 6e 64 20 74 6f 20 74 68   /* Append to th
1eb90 69 73 20 62 75 66 66 65 72 20 2a 2f 0a 20 20 46  is buffer */.  F
1eba0 74 73 35 43 6f 6c 73 65 74 20 2a 70 43 6f 6c 73  ts5Colset *pCols
1ebb0 65 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  et;            /
1ebc0 2a 20 52 65 73 74 72 69 63 74 20 6d 61 74 63 68  * Restrict match
1ebd0 65 73 20 74 6f 20 74 68 69 73 20 63 6f 6c 75 6d  es to this colum
1ebe0 6e 20 2a 2f 0a 20 20 69 6e 74 20 65 53 74 61 74  n */.  int eStat
1ebf0 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
1ec00 20 20 20 20 20 20 20 2f 2a 20 53 65 65 20 61 62         /* See ab
1ec10 6f 76 65 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  ove */.};../*.**
1ec20 20 54 4f 44 4f 3a 20 4d 61 6b 65 20 74 68 69 73   TODO: Make this
1ec30 20 6d 6f 72 65 20 65 66 66 69 63 69 65 6e 74 21   more efficient!
1ec40 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .*/.static int f
1ec50 74 73 35 49 6e 64 65 78 43 6f 6c 73 65 74 54 65  ts5IndexColsetTe
1ec60 73 74 28 46 74 73 35 43 6f 6c 73 65 74 20 2a 70  st(Fts5Colset *p
1ec70 43 6f 6c 73 65 74 2c 20 69 6e 74 20 69 43 6f 6c  Colset, int iCol
1ec80 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f  ){.  int i;.  fo
1ec90 72 28 69 3d 30 3b 20 69 3c 70 43 6f 6c 73 65 74  r(i=0; i<pColset
1eca0 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20  ->nCol; i++){.  
1ecb0 20 20 69 66 28 20 70 43 6f 6c 73 65 74 2d 3e 61    if( pColset->a
1ecc0 69 43 6f 6c 5b 69 5d 3d 3d 69 43 6f 6c 20 29 20  iCol[i]==iCol ) 
1ecd0 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20  return 1;.  }.  
1ece0 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 73 74 61  return 0;.}..sta
1ecf0 74 69 63 20 76 6f 69 64 20 66 74 73 35 50 6f 73  tic void fts5Pos
1ed00 6c 69 73 74 46 69 6c 74 65 72 43 61 6c 6c 62 61  listFilterCallba
1ed10 63 6b 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20  ck(.  Fts5Index 
1ed20 2a 70 2c 20 0a 20 20 76 6f 69 64 20 2a 70 43 6f  *p, .  void *pCo
1ed30 6e 74 65 78 74 2c 20 0a 20 20 63 6f 6e 73 74 20  ntext, .  const 
1ed40 75 38 20 2a 70 43 68 75 6e 6b 2c 20 69 6e 74 20  u8 *pChunk, int 
1ed50 6e 43 68 75 6e 6b 0a 29 7b 0a 20 20 50 6f 73 6c  nChunk.){.  Posl
1ed60 69 73 74 43 61 6c 6c 62 61 63 6b 43 74 78 20 2a  istCallbackCtx *
1ed70 70 43 74 78 20 3d 20 28 50 6f 73 6c 69 73 74 43  pCtx = (PoslistC
1ed80 61 6c 6c 62 61 63 6b 43 74 78 2a 29 70 43 6f 6e  allbackCtx*)pCon
1ed90 74 65 78 74 3b 0a 20 20 61 73 73 65 72 74 5f 6e  text;.  assert_n
1eda0 63 28 20 6e 43 68 75 6e 6b 3e 3d 30 20 29 3b 0a  c( nChunk>=0 );.
1edb0 20 20 69 66 28 20 6e 43 68 75 6e 6b 3e 30 20 29    if( nChunk>0 )
1edc0 7b 0a 20 20 20 20 2f 2a 20 53 65 61 72 63 68 20  {.    /* Search 
1edd0 74 68 72 6f 75 67 68 20 74 6f 20 66 69 6e 64 20  through to find 
1ede0 74 68 65 20 66 69 72 73 74 20 76 61 72 69 6e 74  the first varint
1edf0 20 77 69 74 68 20 76 61 6c 75 65 20 31 2e 20 54   with value 1. T
1ee00 68 69 73 20 69 73 20 74 68 65 0a 20 20 20 20 2a  his is the.    *
1ee10 2a 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 6e  * start of the n
1ee20 65 78 74 20 63 6f 6c 75 6d 6e 73 20 68 69 74 73  ext columns hits
1ee30 2e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 20 3d  . */.    int i =
1ee40 20 30 3b 0a 20 20 20 20 69 6e 74 20 69 53 74 61   0;.    int iSta
1ee50 72 74 20 3d 20 30 3b 0a 0a 20 20 20 20 69 66 28  rt = 0;..    if(
1ee60 20 70 43 74 78 2d 3e 65 53 74 61 74 65 3d 3d 32   pCtx->eState==2
1ee70 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 43   ){.      int iC
1ee80 6f 6c 3b 0a 20 20 20 20 20 20 66 74 73 35 46 61  ol;.      fts5Fa
1ee90 73 74 47 65 74 56 61 72 69 6e 74 33 32 28 70 43  stGetVarint32(pC
1eea0 68 75 6e 6b 2c 20 69 2c 20 69 43 6f 6c 29 3b 0a  hunk, i, iCol);.
1eeb0 20 20 20 20 20 20 69 66 28 20 66 74 73 35 49 6e        if( fts5In
1eec0 64 65 78 43 6f 6c 73 65 74 54 65 73 74 28 70 43  dexColsetTest(pC
1eed0 74 78 2d 3e 70 43 6f 6c 73 65 74 2c 20 69 43 6f  tx->pColset, iCo
1eee0 6c 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43  l) ){.        pC
1eef0 74 78 2d 3e 65 53 74 61 74 65 20 3d 20 31 3b 0a  tx->eState = 1;.
1ef00 20 20 20 20 20 20 20 20 66 74 73 35 42 75 66 66          fts5Buff
1ef10 65 72 53 61 66 65 41 70 70 65 6e 64 56 61 72 69  erSafeAppendVari
1ef20 6e 74 28 70 43 74 78 2d 3e 70 42 75 66 2c 20 31  nt(pCtx->pBuf, 1
1ef30 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
1ef40 20 20 20 20 20 20 20 20 70 43 74 78 2d 3e 65 53          pCtx->eS
1ef50 74 61 74 65 20 3d 20 30 3b 0a 20 20 20 20 20 20  tate = 0;.      
1ef60 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 64 6f 20  }.    }..    do 
1ef70 7b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 69  {.      while( i
1ef80 3c 6e 43 68 75 6e 6b 20 26 26 20 70 43 68 75 6e  <nChunk && pChun
1ef90 6b 5b 69 5d 21 3d 30 78 30 31 20 29 7b 0a 20 20  k[i]!=0x01 ){.  
1efa0 20 20 20 20 20 20 77 68 69 6c 65 28 20 70 43 68        while( pCh
1efb0 75 6e 6b 5b 69 5d 20 26 20 30 78 38 30 20 29 20  unk[i] & 0x80 ) 
1efc0 69 2b 2b 3b 0a 20 20 20 20 20 20 20 20 69 2b 2b  i++;.        i++
1efd0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1efe0 69 66 28 20 70 43 74 78 2d 3e 65 53 74 61 74 65  if( pCtx->eState
1eff0 20 29 7b 0a 20 20 20 20 20 20 20 20 66 74 73 35   ){.        fts5
1f000 42 75 66 66 65 72 53 61 66 65 41 70 70 65 6e 64  BufferSafeAppend
1f010 42 6c 6f 62 28 70 43 74 78 2d 3e 70 42 75 66 2c  Blob(pCtx->pBuf,
1f020 20 26 70 43 68 75 6e 6b 5b 69 53 74 61 72 74 5d   &pChunk[iStart]
1f030 2c 20 69 2d 69 53 74 61 72 74 29 3b 0a 20 20 20  , i-iStart);.   
1f040 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 69     }.      if( i
1f050 3c 6e 43 68 75 6e 6b 20 29 7b 0a 20 20 20 20 20  <nChunk ){.     
1f060 20 20 20 69 6e 74 20 69 43 6f 6c 3b 0a 20 20 20     int iCol;.   
1f070 20 20 20 20 20 69 53 74 61 72 74 20 3d 20 69 3b       iStart = i;
1f080 0a 20 20 20 20 20 20 20 20 69 2b 2b 3b 0a 20 20  .        i++;.  
1f090 20 20 20 20 20 20 69 66 28 20 69 3e 3d 6e 43 68        if( i>=nCh
1f0a0 75 6e 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  unk ){.         
1f0b0 20 70 43 74 78 2d 3e 65 53 74 61 74 65 20 3d 20   pCtx->eState = 
1f0c0 32 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  2;.        }else
1f0d0 7b 0a 20 20 20 20 20 20 20 20 20 20 66 74 73 35  {.          fts5
1f0e0 46 61 73 74 47 65 74 56 61 72 69 6e 74 33 32 28  FastGetVarint32(
1f0f0 70 43 68 75 6e 6b 2c 20 69 2c 20 69 43 6f 6c 29  pChunk, i, iCol)
1f100 3b 0a 20 20 20 20 20 20 20 20 20 20 70 43 74 78  ;.          pCtx
1f110 2d 3e 65 53 74 61 74 65 20 3d 20 66 74 73 35 49  ->eState = fts5I
1f120 6e 64 65 78 43 6f 6c 73 65 74 54 65 73 74 28 70  ndexColsetTest(p
1f130 43 74 78 2d 3e 70 43 6f 6c 73 65 74 2c 20 69 43  Ctx->pColset, iC
1f140 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  ol);.          i
1f150 66 28 20 70 43 74 78 2d 3e 65 53 74 61 74 65 20  f( pCtx->eState 
1f160 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 66  ){.            f
1f170 74 73 35 42 75 66 66 65 72 53 61 66 65 41 70 70  ts5BufferSafeApp
1f180 65 6e 64 42 6c 6f 62 28 70 43 74 78 2d 3e 70 42  endBlob(pCtx->pB
1f190 75 66 2c 20 26 70 43 68 75 6e 6b 5b 69 53 74 61  uf, &pChunk[iSta
1f1a0 72 74 5d 2c 20 69 2d 69 53 74 61 72 74 29 3b 0a  rt], i-iStart);.
1f1b0 20 20 20 20 20 20 20 20 20 20 20 20 69 53 74 61              iSta
1f1c0 72 74 20 3d 20 69 3b 0a 20 20 20 20 20 20 20 20  rt = i;.        
1f1d0 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
1f1e0 20 20 20 20 7d 0a 20 20 20 20 7d 77 68 69 6c 65      }.    }while
1f1f0 28 20 69 3c 6e 43 68 75 6e 6b 20 29 3b 0a 20 20  ( i<nChunk );.  
1f200 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 74 65 72 61  }.}../*.** Itera
1f210 74 6f 72 20 70 49 74 65 72 20 63 75 72 72 65 6e  tor pIter curren
1f220 74 6c 79 20 70 6f 69 6e 74 73 20 74 6f 20 61 20  tly points to a 
1f230 76 61 6c 69 64 20 65 6e 74 72 79 20 28 6e 6f 74  valid entry (not
1f240 20 45 4f 46 29 2e 20 54 68 69 73 0a 2a 2a 20 66   EOF). This.** f
1f250 75 6e 63 74 69 6f 6e 20 61 70 70 65 6e 64 73 20  unction appends 
1f260 74 68 65 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73  the position lis
1f270 74 20 64 61 74 61 20 66 6f 72 20 74 68 65 20 63  t data for the c
1f280 75 72 72 65 6e 74 20 65 6e 74 72 79 20 74 6f 0a  urrent entry to.
1f290 2a 2a 20 62 75 66 66 65 72 20 70 42 75 66 2e 20  ** buffer pBuf. 
1f2a0 49 74 20 64 6f 65 73 20 6e 6f 74 20 6d 61 6b 65  It does not make
1f2b0 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 70   a copy of the p
1f2c0 6f 73 69 74 69 6f 6e 2d 6c 69 73 74 20 73 69 7a  osition-list siz
1f2d0 65 0a 2a 2a 20 66 69 65 6c 64 2e 0a 2a 2f 0a 73  e.** field..*/.s
1f2e0 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 53  tatic void fts5S
1f2f0 65 67 69 74 65 72 50 6f 73 6c 69 73 74 28 0a 20  egiterPoslist(. 
1f300 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 0a 20   Fts5Index *p,. 
1f310 20 46 74 73 35 53 65 67 49 74 65 72 20 2a 70 53   Fts5SegIter *pS
1f320 65 67 2c 0a 20 20 46 74 73 35 43 6f 6c 73 65 74  eg,.  Fts5Colset
1f330 20 2a 70 43 6f 6c 73 65 74 2c 0a 20 20 46 74 73   *pColset,.  Fts
1f340 35 42 75 66 66 65 72 20 2a 70 42 75 66 0a 29 7b  5Buffer *pBuf.){
1f350 0a 20 20 69 66 28 20 30 3d 3d 66 74 73 35 42 75  .  if( 0==fts5Bu
1f360 66 66 65 72 47 72 6f 77 28 26 70 2d 3e 72 63 2c  fferGrow(&p->rc,
1f370 20 70 42 75 66 2c 20 70 53 65 67 2d 3e 6e 50 6f   pBuf, pSeg->nPo
1f380 73 29 20 29 7b 0a 20 20 20 20 69 66 28 20 70 43  s) ){.    if( pC
1f390 6f 6c 73 65 74 3d 3d 30 20 29 7b 0a 20 20 20 20  olset==0 ){.    
1f3a0 20 20 66 74 73 35 43 68 75 6e 6b 49 74 65 72 61    fts5ChunkItera
1f3b0 74 65 28 70 2c 20 70 53 65 67 2c 20 28 76 6f 69  te(p, pSeg, (voi
1f3c0 64 2a 29 70 42 75 66 2c 20 66 74 73 35 50 6f 73  d*)pBuf, fts5Pos
1f3d0 6c 69 73 74 43 61 6c 6c 62 61 63 6b 29 3b 0a 20  listCallback);. 
1f3e0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1f3f0 50 6f 73 6c 69 73 74 43 61 6c 6c 62 61 63 6b 43  PoslistCallbackC
1f400 74 78 20 73 43 74 78 3b 0a 20 20 20 20 20 20 73  tx sCtx;.      s
1f410 43 74 78 2e 70 42 75 66 20 3d 20 70 42 75 66 3b  Ctx.pBuf = pBuf;
1f420 0a 20 20 20 20 20 20 73 43 74 78 2e 70 43 6f 6c  .      sCtx.pCol
1f430 73 65 74 20 3d 20 70 43 6f 6c 73 65 74 3b 0a 20  set = pColset;. 
1f440 20 20 20 20 20 73 43 74 78 2e 65 53 74 61 74 65       sCtx.eState
1f450 20 3d 20 66 74 73 35 49 6e 64 65 78 43 6f 6c 73   = fts5IndexCols
1f460 65 74 54 65 73 74 28 70 43 6f 6c 73 65 74 2c 20  etTest(pColset, 
1f470 30 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  0);.      assert
1f480 28 20 73 43 74 78 2e 65 53 74 61 74 65 3d 3d 30  ( sCtx.eState==0
1f490 20 7c 7c 20 73 43 74 78 2e 65 53 74 61 74 65 3d   || sCtx.eState=
1f4a0 3d 31 20 29 3b 0a 20 20 20 20 20 20 66 74 73 35  =1 );.      fts5
1f4b0 43 68 75 6e 6b 49 74 65 72 61 74 65 28 70 2c 20  ChunkIterate(p, 
1f4c0 70 53 65 67 2c 20 28 76 6f 69 64 2a 29 26 73 43  pSeg, (void*)&sC
1f4d0 74 78 2c 20 66 74 73 35 50 6f 73 6c 69 73 74 46  tx, fts5PoslistF
1f4e0 69 6c 74 65 72 43 61 6c 6c 62 61 63 6b 29 3b 0a  ilterCallback);.
1f4f0 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
1f500 2a 2a 20 49 4e 2f 4f 55 54 20 70 61 72 61 6d 65  ** IN/OUT parame
1f510 74 65 72 20 28 2a 70 61 29 20 70 6f 69 6e 74 73  ter (*pa) points
1f520 20 74 6f 20 61 20 70 6f 73 69 74 69 6f 6e 20 6c   to a position l
1f530 69 73 74 20 6e 20 62 79 74 65 73 20 69 6e 20 73  ist n bytes in s
1f540 69 7a 65 2e 20 49 66 0a 2a 2a 20 74 68 65 20 70  ize. If.** the p
1f550 6f 73 69 74 69 6f 6e 20 6c 69 73 74 20 63 6f 6e  osition list con
1f560 74 61 69 6e 73 20 65 6e 74 72 69 65 73 20 66 6f  tains entries fo
1f570 72 20 63 6f 6c 75 6d 6e 20 69 43 6f 6c 2c 20 74  r column iCol, t
1f580 68 65 6e 20 28 2a 70 61 29 20 69 73 20 73 65 74  hen (*pa) is set
1f590 0a 2a 2a 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20  .** to point to 
1f5a0 74 68 65 20 73 75 62 2d 70 6f 73 69 74 69 6f 6e  the sub-position
1f5b0 2d 6c 69 73 74 20 66 6f 72 20 74 68 61 74 20 63  -list for that c
1f5c0 6f 6c 75 6d 6e 20 61 6e 64 20 74 68 65 20 6e 75  olumn and the nu
1f5d0 6d 62 65 72 20 6f 66 0a 2a 2a 20 62 79 74 65 73  mber of.** bytes
1f5e0 20 69 6e 20 69 74 20 72 65 74 75 72 6e 65 64 2e   in it returned.
1f5f0 20 4f 72 2c 20 69 66 20 74 68 65 20 61 72 67 75   Or, if the argu
1f600 6d 65 6e 74 20 70 6f 73 69 74 69 6f 6e 20 6c 69  ment position li
1f610 73 74 20 64 6f 65 73 20 6e 6f 74 0a 2a 2a 20 63  st does not.** c
1f620 6f 6e 74 61 69 6e 20 61 6e 79 20 65 6e 74 72 69  ontain any entri
1f630 65 73 20 66 6f 72 20 63 6f 6c 75 6d 6e 20 69 43  es for column iC
1f640 6f 6c 2c 20 72 65 74 75 72 6e 20 30 2e 0a 2a 2f  ol, return 0..*/
1f650 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 35  .static int fts5
1f660 49 6e 64 65 78 45 78 74 72 61 63 74 43 6f 6c 28  IndexExtractCol(
1f670 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 2a 70 61  .  const u8 **pa
1f680 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1f690 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 50 6f     /* IN/OUT: Po
1f6a0 69 6e 74 65 72 20 74 6f 20 70 6f 73 6c 69 73 74  inter to poslist
1f6b0 20 2a 2f 0a 20 20 69 6e 74 20 6e 2c 20 20 20 20   */.  int n,    
1f6c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f6d0 20 20 20 20 20 20 2f 2a 20 49 4e 3a 20 53 69 7a        /* IN: Siz
1f6e0 65 20 6f 66 20 70 6f 73 6c 69 73 74 20 69 6e 20  e of poslist in 
1f6f0 62 79 74 65 73 20 2a 2f 0a 20 20 69 6e 74 20 69  bytes */.  int i
1f700 43 6f 6c 20 20 20 20 20 20 20 20 20 20 20 20 20  Col             
1f710 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f             /* Co
1f720 6c 75 6d 6e 20 74 6f 20 65 78 74 72 61 63 74 20  lumn to extract 
1f730 66 72 6f 6d 20 70 6f 73 6c 69 73 74 20 2a 2f 0a  from poslist */.
1f740 29 7b 0a 20 20 69 6e 74 20 69 43 75 72 72 65 6e  ){.  int iCurren
1f750 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  t = 0;          
1f760 20 20 20 20 20 2f 2a 20 41 6e 79 74 68 69 6e 67       /* Anything
1f770 20 62 65 66 6f 72 65 20 74 68 65 20 66 69 72 73   before the firs
1f780 74 20 30 78 30 31 20 69 73 20 63 6f 6c 20 30 20  t 0x01 is col 0 
1f790 2a 2f 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 70  */.  const u8 *p
1f7a0 20 3d 20 2a 70 61 3b 0a 20 20 63 6f 6e 73 74 20   = *pa;.  const 
1f7b0 75 38 20 2a 70 45 6e 64 20 3d 20 26 70 5b 6e 5d  u8 *pEnd = &p[n]
1f7c0 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65  ;         /* One
1f7d0 20 62 79 74 65 20 70 61 73 74 20 65 6e 64 20 6f   byte past end o
1f7e0 66 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74 20  f position list 
1f7f0 2a 2f 0a 20 20 75 38 20 70 72 65 76 20 3d 20 30  */.  u8 prev = 0
1f800 3b 0a 0a 20 20 77 68 69 6c 65 28 20 69 43 6f 6c  ;..  while( iCol
1f810 21 3d 69 43 75 72 72 65 6e 74 20 29 7b 0a 20 20  !=iCurrent ){.  
1f820 20 20 2f 2a 20 41 64 76 61 6e 63 65 20 70 6f 69    /* Advance poi
1f830 6e 74 65 72 20 70 20 75 6e 74 69 6c 20 69 74 20  nter p until it 
1f840 70 6f 69 6e 74 73 20 74 6f 20 70 45 6e 64 20 6f  points to pEnd o
1f850 72 20 61 6e 20 30 78 30 31 20 62 79 74 65 20 74  r an 0x01 byte t
1f860 68 61 74 20 69 73 0a 20 20 20 20 2a 2a 20 6e 6f  hat is.    ** no
1f870 74 20 70 61 72 74 20 6f 66 20 61 20 76 61 72 69  t part of a vari
1f880 6e 74 20 2a 2f 0a 20 20 20 20 77 68 69 6c 65 28  nt */.    while(
1f890 20 28 70 72 65 76 20 26 20 30 78 38 30 29 20 7c   (prev & 0x80) |
1f8a0 7c 20 2a 70 21 3d 30 78 30 31 20 29 7b 0a 20 20  | *p!=0x01 ){.  
1f8b0 20 20 20 20 70 72 65 76 20 3d 20 2a 70 2b 2b 3b      prev = *p++;
1f8c0 0a 20 20 20 20 20 20 69 66 28 20 70 3d 3d 70 45  .      if( p==pE
1f8d0 6e 64 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  nd ) return 0;. 
1f8e0 20 20 20 7d 0a 20 20 20 20 2a 70 61 20 3d 20 70     }.    *pa = p
1f8f0 2b 2b 3b 0a 20 20 20 20 70 20 2b 3d 20 66 74 73  ++;.    p += fts
1f900 35 47 65 74 56 61 72 69 6e 74 33 32 28 70 2c 20  5GetVarint32(p, 
1f910 69 43 75 72 72 65 6e 74 29 3b 0a 20 20 7d 0a 0a  iCurrent);.  }..
1f920 20 20 2f 2a 20 41 64 76 61 6e 63 65 20 70 6f 69    /* Advance poi
1f930 6e 74 65 72 20 70 20 75 6e 74 69 6c 20 69 74 20  nter p until it 
1f940 70 6f 69 6e 74 73 20 74 6f 20 70 45 6e 64 20 6f  points to pEnd o
1f950 72 20 61 6e 20 30 78 30 31 20 62 79 74 65 20 74  r an 0x01 byte t
1f960 68 61 74 20 69 73 0a 20 20 2a 2a 20 6e 6f 74 20  hat is.  ** not 
1f970 70 61 72 74 20 6f 66 20 61 20 76 61 72 69 6e 74  part of a varint
1f980 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28 70   */.  assert( (p
1f990 72 65 76 20 26 20 30 78 38 30 29 3d 3d 30 20 29  rev & 0x80)==0 )
1f9a0 3b 0a 20 20 77 68 69 6c 65 28 20 70 3c 70 45 6e  ;.  while( p<pEn
1f9b0 64 20 26 26 20 28 28 70 72 65 76 20 26 20 30 78  d && ((prev & 0x
1f9c0 38 30 29 20 7c 7c 20 2a 70 21 3d 30 78 30 31 29  80) || *p!=0x01)
1f9d0 20 29 7b 0a 20 20 20 20 70 72 65 76 20 3d 20 2a   ){.    prev = *
1f9e0 70 2b 2b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  p++;.  }.  retur
1f9f0 6e 20 70 20 2d 20 28 2a 70 61 29 3b 0a 7d 0a 0a  n p - (*pa);.}..
1fa00 0a 2f 2a 0a 2a 2a 20 49 74 65 72 61 74 6f 72 20  ./*.** Iterator 
1fa10 70 4d 75 6c 74 69 20 63 75 72 72 65 6e 74 6c 79  pMulti 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 66 6f 6c 6c 6f 77 69 6e 67 20 74 6f 20 62 75   following to bu
1fa70 66 66 65 72 20 70 42 75 66 3a 0a 2a 2a 0a 2a 2a  ffer pBuf:.**.**
1fa80 20 20 20 2a 20 54 68 65 20 76 61 72 69 6e 74 20     * The varint 
1fa90 69 44 65 6c 74 61 2c 20 61 6e 64 0a 2a 2a 20 20  iDelta, and.**  
1faa0 20 2a 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 20   * the position 
1fab0 6c 69 73 74 20 74 68 61 74 20 63 75 72 72 65 6e  list that curren
1fac0 74 6c 79 20 70 6f 69 6e 74 73 20 74 6f 2c 20 69  tly points to, i
1fad0 6e 63 6c 75 64 69 6e 67 20 74 68 65 20 73 69 7a  ncluding the siz
1fae0 65 20 66 69 65 6c 64 2e 0a 2a 2a 0a 2a 2a 20 49  e field..**.** I
1faf0 66 20 61 72 67 75 6d 65 6e 74 20 70 43 6f 6c 73  f argument pCols
1fb00 65 74 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65 6e  et is NULL, then
1fb10 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 20 6c 69   the position li
1fb20 73 74 20 69 73 20 66 69 6c 74 65 72 65 64 20 61  st is filtered a
1fb30 63 63 6f 72 64 69 6e 67 0a 2a 2a 20 74 6f 20 70  ccording.** to p
1fb40 43 6f 6c 73 65 74 20 62 65 66 6f 72 65 20 62 65  Colset before be
1fb50 69 6e 67 20 61 70 70 65 6e 64 65 64 20 74 6f 20  ing appended to 
1fb60 74 68 65 20 62 75 66 66 65 72 2e 20 49 66 20 74  the buffer. If t
1fb70 68 69 73 20 6d 65 61 6e 73 20 74 68 65 72 65 20  his means there 
1fb80 61 72 65 0a 2a 2a 20 6e 6f 20 65 6e 74 72 69 65  are.** no entrie
1fb90 73 20 69 6e 20 74 68 65 20 70 6f 73 69 74 69 6f  s in the positio
1fba0 6e 20 6c 69 73 74 2c 20 6e 6f 74 68 69 6e 67 20  n list, nothing 
1fbb0 69 73 20 61 70 70 65 6e 64 65 64 20 74 6f 20 74  is appended to t
1fbc0 68 65 20 62 75 66 66 65 72 20 28 6e 6f 74 0a 2a  he buffer (not.*
1fbd0 2a 20 65 76 65 6e 20 69 44 65 6c 74 61 29 2e 0a  * even iDelta)..
1fbe0 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f  **.** If an erro
1fbf0 72 20 6f 63 63 75 72 73 2c 20 61 6e 20 65 72 72  r occurs, an err
1fc00 6f 72 20 63 6f 64 65 20 69 73 20 6c 65 66 74 20  or code is left 
1fc10 69 6e 20 70 2d 3e 72 63 2e 20 0a 2a 2f 0a 73 74  in p->rc. .*/.st
1fc20 61 74 69 63 20 69 6e 74 20 66 74 73 35 41 70 70  atic int fts5App
1fc30 65 6e 64 50 6f 73 6c 69 73 74 28 0a 20 20 46 74  endPoslist(.  Ft
1fc40 73 35 49 6e 64 65 78 20 2a 70 2c 0a 20 20 69 36  s5Index *p,.  i6
1fc50 34 20 69 44 65 6c 74 61 2c 0a 20 20 46 74 73 35  4 iDelta,.  Fts5
1fc60 49 6e 64 65 78 49 74 65 72 20 2a 70 4d 75 6c 74  IndexIter *pMult
1fc70 69 2c 0a 20 20 46 74 73 35 43 6f 6c 73 65 74 20  i,.  Fts5Colset 
1fc80 2a 70 43 6f 6c 73 65 74 2c 0a 20 20 46 74 73 35  *pColset,.  Fts5
1fc90 42 75 66 66 65 72 20 2a 70 42 75 66 0a 29 7b 0a  Buffer *pBuf.){.
1fca0 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c    if( p->rc==SQL
1fcb0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 46 74  ITE_OK ){.    Ft
1fcc0 73 35 53 65 67 49 74 65 72 20 2a 70 53 65 67 20  s5SegIter *pSeg 
1fcd0 3d 20 26 70 4d 75 6c 74 69 2d 3e 61 53 65 67 5b  = &pMulti->aSeg[
1fce0 20 70 4d 75 6c 74 69 2d 3e 61 46 69 72 73 74 5b   pMulti->aFirst[
1fcf0 31 5d 2e 69 46 69 72 73 74 20 5d 3b 0a 20 20 20  1].iFirst ];.   
1fd00 20 61 73 73 65 72 74 28 20 66 74 73 35 4d 75 6c   assert( fts5Mul
1fd10 74 69 49 74 65 72 45 6f 66 28 70 2c 20 70 4d 75  tiIterEof(p, pMu
1fd20 6c 74 69 29 3d 3d 30 20 29 3b 0a 20 20 20 20 61  lti)==0 );.    a
1fd30 73 73 65 72 74 28 20 70 53 65 67 2d 3e 6e 50 6f  ssert( pSeg->nPo
1fd40 73 3e 30 20 29 3b 0a 20 20 20 20 69 66 28 20 30  s>0 );.    if( 0
1fd50 3d 3d 66 74 73 35 42 75 66 66 65 72 47 72 6f 77  ==fts5BufferGrow
1fd60 28 26 70 2d 3e 72 63 2c 20 70 42 75 66 2c 20 70  (&p->rc, pBuf, p
1fd70 53 65 67 2d 3e 6e 50 6f 73 2b 39 2b 39 29 20 29  Seg->nPos+9+9) )
1fd80 7b 0a 0a 20 20 20 20 20 20 69 66 28 20 70 53 65  {..      if( pSe
1fd90 67 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 2b 70  g->iLeafOffset+p
1fda0 53 65 67 2d 3e 6e 50 6f 73 3c 3d 70 53 65 67 2d  Seg->nPos<=pSeg-
1fdb0 3e 70 4c 65 61 66 2d 3e 73 7a 4c 65 61 66 20 0a  >pLeaf->szLeaf .
1fdc0 20 20 20 20 20 20 20 26 26 20 28 70 43 6f 6c 73         && (pCols
1fdd0 65 74 3d 3d 30 20 7c 7c 20 70 43 6f 6c 73 65 74  et==0 || pColset
1fde0 2d 3e 6e 43 6f 6c 3d 3d 31 29 0a 20 20 20 20 20  ->nCol==1).     
1fdf0 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73   ){.        cons
1fe00 74 20 75 38 20 2a 70 50 6f 73 20 3d 20 26 70 53  t u8 *pPos = &pS
1fe10 65 67 2d 3e 70 4c 65 61 66 2d 3e 70 5b 70 53 65  eg->pLeaf->p[pSe
1fe20 67 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 5d 3b  g->iLeafOffset];
1fe30 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 50 6f  .        int nPo
1fe40 73 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  s;.        if( p
1fe50 43 6f 6c 73 65 74 20 29 7b 0a 20 20 20 20 20 20  Colset ){.      
1fe60 20 20 20 20 6e 50 6f 73 20 3d 20 66 74 73 35 49      nPos = fts5I
1fe70 6e 64 65 78 45 78 74 72 61 63 74 43 6f 6c 28 26  ndexExtractCol(&
1fe80 70 50 6f 73 2c 20 70 53 65 67 2d 3e 6e 50 6f 73  pPos, pSeg->nPos
1fe90 2c 20 70 43 6f 6c 73 65 74 2d 3e 61 69 43 6f 6c  , pColset->aiCol
1fea0 5b 30 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20  [0]);.          
1feb0 69 66 28 20 6e 50 6f 73 3d 3d 30 20 29 20 72 65  if( nPos==0 ) re
1fec0 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 20 20  turn 1;.        
1fed0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
1fee0 20 6e 50 6f 73 20 3d 20 70 53 65 67 2d 3e 6e 50   nPos = pSeg->nP
1fef0 6f 73 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  os;.        }.  
1ff00 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 50        assert( nP
1ff10 6f 73 3e 30 20 29 3b 0a 20 20 20 20 20 20 20 20  os>0 );.        
1ff20 66 74 73 35 42 75 66 66 65 72 53 61 66 65 41 70  fts5BufferSafeAp
1ff30 70 65 6e 64 56 61 72 69 6e 74 28 70 42 75 66 2c  pendVarint(pBuf,
1ff40 20 69 44 65 6c 74 61 29 3b 0a 20 20 20 20 20 20   iDelta);.      
1ff50 20 20 66 74 73 35 42 75 66 66 65 72 53 61 66 65    fts5BufferSafe
1ff60 41 70 70 65 6e 64 56 61 72 69 6e 74 28 70 42 75  AppendVarint(pBu
1ff70 66 2c 20 6e 50 6f 73 2a 32 29 3b 0a 20 20 20 20  f, nPos*2);.    
1ff80 20 20 20 20 66 74 73 35 42 75 66 66 65 72 53 61      fts5BufferSa
1ff90 66 65 41 70 70 65 6e 64 42 6c 6f 62 28 70 42 75  feAppendBlob(pBu
1ffa0 66 2c 20 70 50 6f 73 2c 20 6e 50 6f 73 29 3b 0a  f, pPos, nPos);.
1ffb0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1ffc0 20 20 20 20 20 69 6e 74 20 69 53 76 31 3b 0a 20       int iSv1;. 
1ffd0 20 20 20 20 20 20 20 69 6e 74 20 69 53 76 32 3b         int iSv2;
1ffe0 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 44 61  .        int iDa
1fff0 74 61 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20  ta;..        /* 
20000 41 70 70 65 6e 64 20 69 44 65 6c 74 61 20 2a 2f  Append iDelta */
20010 0a 20 20 20 20 20 20 20 20 69 53 76 31 20 3d 20  .        iSv1 = 
20020 70 42 75 66 2d 3e 6e 3b 0a 20 20 20 20 20 20 20  pBuf->n;.       
20030 20 66 74 73 35 42 75 66 66 65 72 53 61 66 65 41   fts5BufferSafeA
20040 70 70 65 6e 64 56 61 72 69 6e 74 28 70 42 75 66  ppendVarint(pBuf
20050 2c 20 69 44 65 6c 74 61 29 3b 0a 0a 20 20 20 20  , iDelta);..    
20060 20 20 20 20 2f 2a 20 57 52 49 54 45 50 4f 53 4c      /* WRITEPOSL
20070 49 53 54 53 49 5a 45 20 2a 2f 0a 20 20 20 20 20  ISTSIZE */.     
20080 20 20 20 69 53 76 32 20 3d 20 70 42 75 66 2d 3e     iSv2 = pBuf->
20090 6e 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35 42  n;.        fts5B
200a0 75 66 66 65 72 53 61 66 65 41 70 70 65 6e 64 56  ufferSafeAppendV
200b0 61 72 69 6e 74 28 70 42 75 66 2c 20 70 53 65 67  arint(pBuf, pSeg
200c0 2d 3e 6e 50 6f 73 2a 32 29 3b 0a 20 20 20 20 20  ->nPos*2);.     
200d0 20 20 20 69 44 61 74 61 20 3d 20 70 42 75 66 2d     iData = pBuf-
200e0 3e 6e 3b 0a 0a 20 20 20 20 20 20 20 20 66 74 73  >n;..        fts
200f0 35 53 65 67 69 74 65 72 50 6f 73 6c 69 73 74 28  5SegiterPoslist(
20100 70 2c 20 70 53 65 67 2c 20 70 43 6f 6c 73 65 74  p, pSeg, pColset
20110 2c 20 70 42 75 66 29 3b 0a 0a 20 20 20 20 20 20  , pBuf);..      
20120 20 20 69 66 28 20 70 43 6f 6c 73 65 74 20 29 7b    if( pColset ){
20130 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 6e  .          int n
20140 41 63 74 75 61 6c 20 3d 20 70 42 75 66 2d 3e 6e  Actual = pBuf->n
20150 20 2d 20 69 44 61 74 61 3b 0a 20 20 20 20 20 20   - iData;.      
20160 20 20 20 20 69 66 28 20 6e 41 63 74 75 61 6c 21      if( nActual!
20170 3d 70 53 65 67 2d 3e 6e 50 6f 73 20 29 7b 0a 20  =pSeg->nPos ){. 
20180 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6e             if( n
20190 41 63 74 75 61 6c 3d 3d 30 20 29 7b 0a 20 20 20  Actual==0 ){.   
201a0 20 20 20 20 20 20 20 20 20 20 20 70 42 75 66 2d             pBuf-
201b0 3e 6e 20 3d 20 69 53 76 31 3b 0a 20 20 20 20 20  >n = iSv1;.     
201c0 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
201d0 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  1;.            }
201e0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
201f0 20 20 20 20 69 6e 74 20 6e 52 65 71 20 3d 20 73      int nReq = s
20200 71 6c 69 74 65 33 46 74 73 35 47 65 74 56 61 72  qlite3Fts5GetVar
20210 69 6e 74 4c 65 6e 28 28 75 33 32 29 28 6e 41 63  intLen((u32)(nAc
20220 74 75 61 6c 2a 32 29 29 3b 0a 20 20 20 20 20 20  tual*2));.      
20230 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 69          while( i
20240 53 76 32 3c 28 69 44 61 74 61 2d 6e 52 65 71 29  Sv2<(iData-nReq)
20250 20 29 7b 20 70 42 75 66 2d 3e 70 5b 69 53 76 32   ){ pBuf->p[iSv2
20260 2b 2b 5d 20 3d 20 30 78 38 30 3b 20 7d 0a 20 20  ++] = 0x80; }.  
20270 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
20280 74 65 33 46 74 73 35 50 75 74 56 61 72 69 6e 74  te3Fts5PutVarint
20290 28 26 70 42 75 66 2d 3e 70 5b 69 53 76 32 5d 2c  (&pBuf->p[iSv2],
202a0 20 6e 41 63 74 75 61 6c 2a 32 29 3b 0a 20 20 20   nActual*2);.   
202b0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
202c0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
202d0 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 7d 0a  .      }..    }.
202e0 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 30 3b    }..  return 0;
202f0 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .}..static void 
20300 66 74 73 35 44 6f 63 6c 69 73 74 49 74 65 72 4e  fts5DoclistIterN
20310 65 78 74 28 46 74 73 35 44 6f 63 6c 69 73 74 49  ext(Fts5DoclistI
20320 74 65 72 20 2a 70 49 74 65 72 29 7b 0a 20 20 75  ter *pIter){.  u
20330 38 20 2a 70 20 3d 20 70 49 74 65 72 2d 3e 61 50  8 *p = pIter->aP
20340 6f 73 6c 69 73 74 20 2b 20 70 49 74 65 72 2d 3e  oslist + pIter->
20350 6e 53 69 7a 65 20 2b 20 70 49 74 65 72 2d 3e 6e  nSize + pIter->n
20360 50 6f 73 6c 69 73 74 3b 0a 0a 20 20 61 73 73 65  Poslist;..  asse
20370 72 74 28 20 70 49 74 65 72 2d 3e 61 50 6f 73 6c  rt( pIter->aPosl
20380 69 73 74 20 29 3b 0a 20 20 69 66 28 20 70 3e 3d  ist );.  if( p>=
20390 70 49 74 65 72 2d 3e 61 45 6f 66 20 29 7b 0a 20  pIter->aEof ){. 
203a0 20 20 20 70 49 74 65 72 2d 3e 61 50 6f 73 6c 69     pIter->aPosli
203b0 73 74 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b  st = 0;.  }else{
203c0 0a 20 20 20 20 69 36 34 20 69 44 65 6c 74 61 3b  .    i64 iDelta;
203d0 0a 0a 20 20 20 20 70 20 2b 3d 20 66 74 73 35 47  ..    p += fts5G
203e0 65 74 56 61 72 69 6e 74 28 70 2c 20 28 75 36 34  etVarint(p, (u64
203f0 2a 29 26 69 44 65 6c 74 61 29 3b 0a 20 20 20 20  *)&iDelta);.    
20400 70 49 74 65 72 2d 3e 69 52 6f 77 69 64 20 2b 3d  pIter->iRowid +=
20410 20 69 44 65 6c 74 61 3b 0a 0a 20 20 20 20 2f 2a   iDelta;..    /*
20420 20 52 65 61 64 20 70 6f 73 69 74 69 6f 6e 20 6c   Read position l
20430 69 73 74 20 73 69 7a 65 20 2a 2f 0a 20 20 20 20  ist size */.    
20440 69 66 28 20 70 5b 30 5d 20 26 20 30 78 38 30 20  if( p[0] & 0x80 
20450 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 50 6f  ){.      int nPo
20460 73 3b 0a 20 20 20 20 20 20 70 49 74 65 72 2d 3e  s;.      pIter->
20470 6e 53 69 7a 65 20 3d 20 66 74 73 35 47 65 74 56  nSize = fts5GetV
20480 61 72 69 6e 74 33 32 28 70 2c 20 6e 50 6f 73 29  arint32(p, nPos)
20490 3b 0a 20 20 20 20 20 20 70 49 74 65 72 2d 3e 6e  ;.      pIter->n
204a0 50 6f 73 6c 69 73 74 20 3d 20 28 6e 50 6f 73 3e  Poslist = (nPos>
204b0 3e 31 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  >1);.    }else{.
204c0 20 20 20 20 20 20 70 49 74 65 72 2d 3e 6e 50 6f        pIter->nPo
204d0 73 6c 69 73 74 20 3d 20 28 28 69 6e 74 29 28 70  slist = ((int)(p
204e0 5b 30 5d 29 29 20 3e 3e 20 31 3b 0a 20 20 20 20  [0])) >> 1;.    
204f0 20 20 70 49 74 65 72 2d 3e 6e 53 69 7a 65 20 3d    pIter->nSize =
20500 20 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70   1;.    }..    p
20510 49 74 65 72 2d 3e 61 50 6f 73 6c 69 73 74 20 3d  Iter->aPoslist =
20520 20 70 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69   p;.  }.}..stati
20530 63 20 76 6f 69 64 20 66 74 73 35 44 6f 63 6c 69  c void fts5Docli
20540 73 74 49 74 65 72 49 6e 69 74 28 0a 20 20 46 74  stIterInit(.  Ft
20550 73 35 42 75 66 66 65 72 20 2a 70 42 75 66 2c 20  s5Buffer *pBuf, 
20560 0a 20 20 46 74 73 35 44 6f 63 6c 69 73 74 49 74  .  Fts5DoclistIt
20570 65 72 20 2a 70 49 74 65 72 0a 29 7b 0a 20 20 6d  er *pIter.){.  m
20580 65 6d 73 65 74 28 70 49 74 65 72 2c 20 30 2c 20  emset(pIter, 0, 
20590 73 69 7a 65 6f 66 28 2a 70 49 74 65 72 29 29 3b  sizeof(*pIter));
205a0 0a 20 20 70 49 74 65 72 2d 3e 61 50 6f 73 6c 69  .  pIter->aPosli
205b0 73 74 20 3d 20 70 42 75 66 2d 3e 70 3b 0a 20 20  st = pBuf->p;.  
205c0 70 49 74 65 72 2d 3e 61 45 6f 66 20 3d 20 26 70  pIter->aEof = &p
205d0 42 75 66 2d 3e 70 5b 70 42 75 66 2d 3e 6e 5d 3b  Buf->p[pBuf->n];
205e0 0a 20 20 66 74 73 35 44 6f 63 6c 69 73 74 49 74  .  fts5DoclistIt
205f0 65 72 4e 65 78 74 28 70 49 74 65 72 29 3b 0a 7d  erNext(pIter);.}
20600 0a 0a 23 69 66 20 30 0a 2f 2a 0a 2a 2a 20 41 70  ..#if 0./*.** Ap
20610 70 65 6e 64 20 61 20 64 6f 63 6c 69 73 74 20 74  pend a doclist t
20620 6f 20 62 75 66 66 65 72 20 70 42 75 66 2e 0a 2a  o buffer pBuf..*
20630 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
20640 6f 6e 20 61 73 73 75 6d 65 73 20 74 68 61 74 20  on assumes that 
20650 73 70 61 63 65 20 77 69 74 68 69 6e 20 74 68 65  space within the
20660 20 62 75 66 66 65 72 20 68 61 73 20 61 6c 72 65   buffer has alre
20670 61 64 79 20 62 65 65 6e 0a 2a 2a 20 61 6c 6c 6f  ady been.** allo
20680 63 61 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  cated..*/.static
20690 20 76 6f 69 64 20 66 74 73 35 4d 65 72 67 65 41   void fts5MergeA
206a0 70 70 65 6e 64 44 6f 63 69 64 28 0a 20 20 46 74  ppendDocid(.  Ft
206b0 73 35 42 75 66 66 65 72 20 2a 70 42 75 66 2c 20  s5Buffer *pBuf, 
206c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
206d0 20 42 75 66 66 65 72 20 74 6f 20 77 72 69 74 65   Buffer to write
206e0 20 74 6f 20 2a 2f 0a 20 20 69 36 34 20 2a 70 69   to */.  i64 *pi
206f0 4c 61 73 74 52 6f 77 69 64 2c 20 20 20 20 20 20  LastRowid,      
20700 20 20 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f           /* IN/O
20710 55 54 3a 20 50 72 65 76 69 6f 75 73 20 72 6f 77  UT: Previous row
20720 69 64 20 77 72 69 74 74 65 6e 20 28 69 66 20 61  id written (if a
20730 6e 79 29 20 2a 2f 0a 20 20 69 36 34 20 69 52 6f  ny) */.  i64 iRo
20740 77 69 64 20 20 20 20 20 20 20 20 20 20 20 20 20  wid             
20750 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 77 69           /* Rowi
20760 64 20 74 6f 20 61 70 70 65 6e 64 20 2a 2f 0a 29  d to append */.)
20770 7b 0a 20 20 61 73 73 65 72 74 28 20 70 42 75 66  {.  assert( pBuf
20780 2d 3e 6e 21 3d 30 20 7c 7c 20 28 2a 70 69 4c 61  ->n!=0 || (*piLa
20790 73 74 52 6f 77 69 64 29 3d 3d 30 20 29 3b 0a 20  stRowid)==0 );. 
207a0 20 66 74 73 35 42 75 66 66 65 72 53 61 66 65 41   fts5BufferSafeA
207b0 70 70 65 6e 64 56 61 72 69 6e 74 28 70 42 75 66  ppendVarint(pBuf
207c0 2c 20 69 52 6f 77 69 64 20 2d 20 2a 70 69 4c 61  , iRowid - *piLa
207d0 73 74 52 6f 77 69 64 29 3b 0a 20 20 2a 70 69 4c  stRowid);.  *piL
207e0 61 73 74 52 6f 77 69 64 20 3d 20 69 52 6f 77 69  astRowid = iRowi
207f0 64 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 64 65  d;.}.#endif..#de
20800 66 69 6e 65 20 66 74 73 35 4d 65 72 67 65 41 70  fine fts5MergeAp
20810 70 65 6e 64 44 6f 63 69 64 28 70 42 75 66 2c 20  pendDocid(pBuf, 
20820 69 4c 61 73 74 52 6f 77 69 64 2c 20 69 52 6f 77  iLastRowid, iRow
20830 69 64 29 20 7b 20 20 20 20 20 20 20 5c 0a 20 20  id) {       \.  
20840 61 73 73 65 72 74 28 20 28 70 42 75 66 29 2d 3e  assert( (pBuf)->
20850 6e 21 3d 30 20 7c 7c 20 28 69 4c 61 73 74 52 6f  n!=0 || (iLastRo
20860 77 69 64 29 3d 3d 30 20 29 3b 20 20 20 20 20 20  wid)==0 );      
20870 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
20880 20 66 74 73 35 42 75 66 66 65 72 53 61 66 65 41   fts5BufferSafeA
20890 70 70 65 6e 64 56 61 72 69 6e 74 28 28 70 42 75  ppendVarint((pBu
208a0 66 29 2c 20 28 69 52 6f 77 69 64 29 20 2d 20 28  f), (iRowid) - (
208b0 69 4c 61 73 74 52 6f 77 69 64 29 29 3b 20 5c 0a  iLastRowid)); \.
208c0 20 20 28 69 4c 61 73 74 52 6f 77 69 64 29 20 3d    (iLastRowid) =
208d0 20 28 69 52 6f 77 69 64 29 3b 20 20 20 20 20 20   (iRowid);      
208e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
208f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
20900 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42 75 66 66 65 72  .}../*.** Buffer
20910 73 20 70 31 20 61 6e 64 20 70 32 20 63 6f 6e 74  s p1 and p2 cont
20920 61 69 6e 20 64 6f 63 6c 69 73 74 73 2e 20 54 68  ain doclists. Th
20930 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 65 72 67  is function merg
20940 65 73 20 74 68 65 20 63 6f 6e 74 65 6e 74 0a 2a  es the content.*
20950 2a 20 6f 66 20 74 68 65 20 74 77 6f 20 64 6f 63  * of the two doc
20960 6c 69 73 74 73 20 74 6f 67 65 74 68 65 72 20 61  lists together a
20970 6e 64 20 73 65 74 73 20 62 75 66 66 65 72 20 70  nd sets buffer p
20980 31 20 74 6f 20 74 68 65 20 72 65 73 75 6c 74 20  1 to the result 
20990 62 65 66 6f 72 65 0a 2a 2a 20 72 65 74 75 72 6e  before.** return
209a0 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  ing..**.** If an
209b0 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 61   error occurs, a
209c0 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  n error code is 
209d0 6c 65 66 74 20 69 6e 20 70 2d 3e 72 63 2e 20 49  left in p->rc. I
209e0 66 20 61 6e 20 65 72 72 6f 72 20 68 61 73 0a 2a  f an error has.*
209f0 2a 20 61 6c 72 65 61 64 79 20 6f 63 63 75 72 72  * already occurr
20a00 65 64 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ed, this functio
20a10 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f  n is a no-op..*/
20a20 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
20a30 35 4d 65 72 67 65 50 72 65 66 69 78 4c 69 73 74  5MergePrefixList
20a40 73 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a  s(.  Fts5Index *
20a50 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
20a60 20 20 20 20 20 2f 2a 20 46 54 53 35 20 62 61 63       /* FTS5 bac
20a70 6b 65 6e 64 20 6f 62 6a 65 63 74 20 2a 2f 0a 20  kend object */. 
20a80 20 46 74 73 35 42 75 66 66 65 72 20 2a 70 31 2c   Fts5Buffer *p1,
20a90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20aa0 20 2f 2a 20 46 69 72 73 74 20 6c 69 73 74 20 74   /* First list t
20ab0 6f 20 6d 65 72 67 65 20 2a 2f 0a 20 20 46 74 73  o merge */.  Fts
20ac0 35 42 75 66 66 65 72 20 2a 70 32 20 20 20 20 20  5Buffer *p2     
20ad0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
20ae0 53 65 63 6f 6e 64 20 6c 69 73 74 20 74 6f 20 6d  Second list to m
20af0 65 72 67 65 20 2a 2f 0a 29 7b 0a 20 20 69 66 28  erge */.){.  if(
20b00 20 70 32 2d 3e 6e 20 29 7b 0a 20 20 20 20 69 36   p2->n ){.    i6
20b10 34 20 69 4c 61 73 74 52 6f 77 69 64 20 3d 20 30  4 iLastRowid = 0
20b20 3b 0a 20 20 20 20 46 74 73 35 44 6f 63 6c 69 73  ;.    Fts5Doclis
20b30 74 49 74 65 72 20 69 31 3b 0a 20 20 20 20 46 74  tIter i1;.    Ft
20b40 73 35 44 6f 63 6c 69 73 74 49 74 65 72 20 69 32  s5DoclistIter i2
20b50 3b 0a 20 20 20 20 46 74 73 35 42 75 66 66 65 72  ;.    Fts5Buffer
20b60 20 6f 75 74 3b 0a 20 20 20 20 46 74 73 35 42 75   out;.    Fts5Bu
20b70 66 66 65 72 20 74 6d 70 3b 0a 20 20 20 20 6d 65  ffer tmp;.    me
20b80 6d 73 65 74 28 26 6f 75 74 2c 20 30 2c 20 73 69  mset(&out, 0, si
20b90 7a 65 6f 66 28 6f 75 74 29 29 3b 0a 20 20 20 20  zeof(out));.    
20ba0 6d 65 6d 73 65 74 28 26 74 6d 70 2c 20 30 2c 20  memset(&tmp, 0, 
20bb0 73 69 7a 65 6f 66 28 74 6d 70 29 29 3b 0a 0a 20  sizeof(tmp));.. 
20bc0 20 20 20 66 74 73 35 42 75 66 66 65 72 47 72 6f     fts5BufferGro
20bd0 77 28 26 70 2d 3e 72 63 2c 20 26 6f 75 74 2c 20  w(&p->rc, &out, 
20be0 70 31 2d 3e 6e 20 2b 20 70 32 2d 3e 6e 29 3b 0a  p1->n + p2->n);.
20bf0 20 20 20 20 66 74 73 35 44 6f 63 6c 69 73 74 49      fts5DoclistI
20c00 74 65 72 49 6e 69 74 28 70 31 2c 20 26 69 31 29  terInit(p1, &i1)
20c10 3b 0a 20 20 20 20 66 74 73 35 44 6f 63 6c 69 73  ;.    fts5Doclis
20c20 74 49 74 65 72 49 6e 69 74 28 70 32 2c 20 26 69  tIterInit(p2, &i
20c30 32 29 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 70  2);.    while( p
20c40 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
20c50 26 26 20 28 69 31 2e 61 50 6f 73 6c 69 73 74 21  && (i1.aPoslist!
20c60 3d 30 20 7c 7c 20 69 32 2e 61 50 6f 73 6c 69 73  =0 || i2.aPoslis
20c70 74 21 3d 30 29 20 29 7b 0a 20 20 20 20 20 20 69  t!=0) ){.      i
20c80 66 28 20 69 32 2e 61 50 6f 73 6c 69 73 74 3d 3d  f( i2.aPoslist==
20c90 30 20 7c 7c 20 28 69 31 2e 61 50 6f 73 6c 69 73  0 || (i1.aPoslis
20ca0 74 20 26 26 20 69 31 2e 69 52 6f 77 69 64 3c 69  t && i1.iRowid<i
20cb0 32 2e 69 52 6f 77 69 64 29 20 29 7b 0a 20 20 20  2.iRowid) ){.   
20cc0 20 20 20 20 20 2f 2a 20 43 6f 70 79 20 65 6e 74       /* Copy ent
20cd0 72 79 20 66 72 6f 6d 20 69 31 20 2a 2f 0a 20 20  ry from i1 */.  
20ce0 20 20 20 20 20 20 66 74 73 35 4d 65 72 67 65 41        fts5MergeA
20cf0 70 70 65 6e 64 44 6f 63 69 64 28 26 6f 75 74 2c  ppendDocid(&out,
20d00 20 69 4c 61 73 74 52 6f 77 69 64 2c 20 69 31 2e   iLastRowid, i1.
20d10 69 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 20  iRowid);.       
20d20 20 66 74 73 35 42 75 66 66 65 72 53 61 66 65 41   fts5BufferSafeA
20d30 70 70 65 6e 64 42 6c 6f 62 28 26 6f 75 74 2c 20  ppendBlob(&out, 
20d40 69 31 2e 61 50 6f 73 6c 69 73 74 2c 20 69 31 2e  i1.aPoslist, i1.
20d50 6e 50 6f 73 6c 69 73 74 2b 69 31 2e 6e 53 69 7a  nPoslist+i1.nSiz
20d60 65 29 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35  e);.        fts5
20d70 44 6f 63 6c 69 73 74 49 74 65 72 4e 65 78 74 28  DoclistIterNext(
20d80 26 69 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  &i1);.      }.  
20d90 20 20 20 20 65 6c 73 65 20 69 66 28 20 69 31 2e      else if( i1.
20da0 61 50 6f 73 6c 69 73 74 3d 3d 30 20 7c 7c 20 69  aPoslist==0 || i
20db0 32 2e 69 52 6f 77 69 64 21 3d 69 31 2e 69 52 6f  2.iRowid!=i1.iRo
20dc0 77 69 64 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  wid ){.        /
20dd0 2a 20 43 6f 70 79 20 65 6e 74 72 79 20 66 72 6f  * Copy entry fro
20de0 6d 20 69 32 20 2a 2f 0a 20 20 20 20 20 20 20 20  m i2 */.        
20df0 66 74 73 35 4d 65 72 67 65 41 70 70 65 6e 64 44  fts5MergeAppendD
20e00 6f 63 69 64 28 26 6f 75 74 2c 20 69 4c 61 73 74  ocid(&out, iLast
20e10 52 6f 77 69 64 2c 20 69 32 2e 69 52 6f 77 69 64  Rowid, i2.iRowid
20e20 29 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35 42  );.        fts5B
20e30 75 66 66 65 72 53 61 66 65 41 70 70 65 6e 64 42  ufferSafeAppendB
20e40 6c 6f 62 28 26 6f 75 74 2c 20 69 32 2e 61 50 6f  lob(&out, i2.aPo
20e50 73 6c 69 73 74 2c 20 69 32 2e 6e 50 6f 73 6c 69  slist, i2.nPosli
20e60 73 74 2b 69 32 2e 6e 53 69 7a 65 29 3b 0a 20 20  st+i2.nSize);.  
20e70 20 20 20 20 20 20 66 74 73 35 44 6f 63 6c 69 73        fts5Doclis
20e80 74 49 74 65 72 4e 65 78 74 28 26 69 32 29 3b 0a  tIterNext(&i2);.
20e90 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 65 6c        }.      el
20ea0 73 65 7b 0a 20 20 20 20 20 20 20 20 69 36 34 20  se{.        i64 
20eb0 69 50 6f 73 31 20 3d 20 30 3b 0a 20 20 20 20 20  iPos1 = 0;.     
20ec0 20 20 20 69 36 34 20 69 50 6f 73 32 20 3d 20 30     i64 iPos2 = 0
20ed0 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 4f  ;.        int iO
20ee0 66 66 31 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  ff1 = 0;.       
20ef0 20 69 6e 74 20 69 4f 66 66 32 20 3d 20 30 3b 0a   int iOff2 = 0;.
20f00 20 20 20 20 20 20 20 20 75 38 20 2a 61 31 20 3d          u8 *a1 =
20f10 20 26 69 31 2e 61 50 6f 73 6c 69 73 74 5b 69 31   &i1.aPoslist[i1
20f20 2e 6e 53 69 7a 65 5d 3b 0a 20 20 20 20 20 20 20  .nSize];.       
20f30 20 75 38 20 2a 61 32 20 3d 20 26 69 32 2e 61 50   u8 *a2 = &i2.aP
20f40 6f 73 6c 69 73 74 5b 69 32 2e 6e 53 69 7a 65 5d  oslist[i2.nSize]
20f50 3b 0a 0a 20 20 20 20 20 20 20 20 46 74 73 35 50  ;..        Fts5P
20f60 6f 73 6c 69 73 74 57 72 69 74 65 72 20 77 72 69  oslistWriter wri
20f70 74 65 72 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d  ter;.        mem
20f80 73 65 74 28 26 77 72 69 74 65 72 2c 20 30 2c 20  set(&writer, 0, 
20f90 73 69 7a 65 6f 66 28 77 72 69 74 65 72 29 29 3b  sizeof(writer));
20fa0 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 4d 65 72  ..        /* Mer
20fb0 67 65 20 74 68 65 20 74 77 6f 20 70 6f 73 69 74  ge the two posit
20fc0 69 6f 6e 20 6c 69 73 74 73 2e 20 2a 2f 20 0a 20  ion lists. */ . 
20fd0 20 20 20 20 20 20 20 66 74 73 35 4d 65 72 67 65         fts5Merge
20fe0 41 70 70 65 6e 64 44 6f 63 69 64 28 26 6f 75 74  AppendDocid(&out
20ff0 2c 20 69 4c 61 73 74 52 6f 77 69 64 2c 20 69 32  , iLastRowid, i2
21000 2e 69 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20  .iRowid);.      
21010 20 20 66 74 73 35 42 75 66 66 65 72 5a 65 72 6f    fts5BufferZero
21020 28 26 74 6d 70 29 3b 0a 0a 20 20 20 20 20 20 20  (&tmp);..       
21030 20 73 71 6c 69 74 65 33 46 74 73 35 50 6f 73 6c   sqlite3Fts5Posl
21040 69 73 74 4e 65 78 74 36 34 28 61 31 2c 20 69 31  istNext64(a1, i1
21050 2e 6e 50 6f 73 6c 69 73 74 2c 20 26 69 4f 66 66  .nPoslist, &iOff
21060 31 2c 20 26 69 50 6f 73 31 29 3b 0a 20 20 20 20  1, &iPos1);.    
21070 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 50      sqlite3Fts5P
21080 6f 73 6c 69 73 74 4e 65 78 74 36 34 28 61 32 2c  oslistNext64(a2,
21090 20 69 32 2e 6e 50 6f 73 6c 69 73 74 2c 20 26 69   i2.nPoslist, &i
210a0 4f 66 66 32 2c 20 26 69 50 6f 73 32 29 3b 0a 0a  Off2, &iPos2);..
210b0 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 70          while( p
210c0 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
210d0 26 26 20 28 69 50 6f 73 31 3e 3d 30 20 7c 7c 20  && (iPos1>=0 || 
210e0 69 50 6f 73 32 3e 3d 30 29 20 29 7b 0a 20 20 20  iPos2>=0) ){.   
210f0 20 20 20 20 20 20 20 69 36 34 20 69 4e 65 77 3b         i64 iNew;
21100 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69  .          if( i
21110 50 6f 73 32 3c 30 20 7c 7c 20 28 69 50 6f 73 31  Pos2<0 || (iPos1
21120 3e 3d 30 20 26 26 20 69 50 6f 73 31 3c 69 50 6f  >=0 && iPos1<iPo
21130 73 32 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  s2) ){.         
21140 20 20 20 69 4e 65 77 20 3d 20 69 50 6f 73 31 3b     iNew = iPos1;
21150 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
21160 69 74 65 33 46 74 73 35 50 6f 73 6c 69 73 74 4e  ite3Fts5PoslistN
21170 65 78 74 36 34 28 61 31 2c 20 69 31 2e 6e 50 6f  ext64(a1, i1.nPo
21180 73 6c 69 73 74 2c 20 26 69 4f 66 66 31 2c 20 26  slist, &iOff1, &
21190 69 50 6f 73 31 29 3b 0a 20 20 20 20 20 20 20 20  iPos1);.        
211a0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
211b0 20 20 20 20 20 69 4e 65 77 20 3d 20 69 50 6f 73       iNew = iPos
211c0 32 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  2;.            s
211d0 71 6c 69 74 65 33 46 74 73 35 50 6f 73 6c 69 73  qlite3Fts5Poslis
211e0 74 4e 65 78 74 36 34 28 61 32 2c 20 69 32 2e 6e  tNext64(a2, i2.n
211f0 50 6f 73 6c 69 73 74 2c 20 26 69 4f 66 66 32 2c  Poslist, &iOff2,
21200 20 26 69 50 6f 73 32 29 3b 0a 20 20 20 20 20 20   &iPos2);.      
21210 20 20 20 20 20 20 69 66 28 20 69 50 6f 73 31 3d        if( iPos1=
21220 3d 69 50 6f 73 32 20 29 7b 0a 20 20 20 20 20 20  =iPos2 ){.      
21230 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 46          sqlite3F
21240 74 73 35 50 6f 73 6c 69 73 74 4e 65 78 74 36 34  ts5PoslistNext64
21250 28 61 31 2c 20 69 31 2e 6e 50 6f 73 6c 69 73 74  (a1, i1.nPoslist
21260 2c 20 26 69 4f 66 66 31 2c 26 69 50 6f 73 31 29  , &iOff1,&iPos1)
21270 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
21280 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
21290 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 73 71        p->rc = sq
212a0 6c 69 74 65 33 46 74 73 35 50 6f 73 6c 69 73 74  lite3Fts5Poslist
212b0 57 72 69 74 65 72 41 70 70 65 6e 64 28 26 74 6d  WriterAppend(&tm
212c0 70 2c 20 26 77 72 69 74 65 72 2c 20 69 4e 65 77  p, &writer, iNew
212d0 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20  );.        }..  
212e0 20 20 20 20 20 20 2f 2a 20 57 52 49 54 45 50 4f        /* WRITEPO
212f0 53 4c 49 53 54 53 49 5a 45 20 2a 2f 0a 20 20 20  SLISTSIZE */.   
21300 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72 53       fts5BufferS
21310 61 66 65 41 70 70 65 6e 64 56 61 72 69 6e 74 28  afeAppendVarint(
21320 26 6f 75 74 2c 20 74 6d 70 2e 6e 20 2a 20 32 29  &out, tmp.n * 2)
21330 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35 42 75  ;.        fts5Bu
21340 66 66 65 72 53 61 66 65 41 70 70 65 6e 64 42 6c  fferSafeAppendBl
21350 6f 62 28 26 6f 75 74 2c 20 74 6d 70 2e 70 2c 20  ob(&out, tmp.p, 
21360 74 6d 70 2e 6e 29 3b 0a 20 20 20 20 20 20 20 20  tmp.n);.        
21370 66 74 73 35 44 6f 63 6c 69 73 74 49 74 65 72 4e  fts5DoclistIterN
21380 65 78 74 28 26 69 31 29 3b 0a 20 20 20 20 20 20  ext(&i1);.      
21390 20 20 66 74 73 35 44 6f 63 6c 69 73 74 49 74 65    fts5DoclistIte
213a0 72 4e 65 78 74 28 26 69 32 29 3b 0a 20 20 20 20  rNext(&i2);.    
213b0 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 66    }.    }..    f
213c0 74 73 35 42 75 66 66 65 72 53 65 74 28 26 70 2d  ts5BufferSet(&p-
213d0 3e 72 63 2c 20 70 31 2c 20 6f 75 74 2e 6e 2c 20  >rc, p1, out.n, 
213e0 6f 75 74 2e 70 29 3b 0a 20 20 20 20 66 74 73 35  out.p);.    fts5
213f0 42 75 66 66 65 72 46 72 65 65 28 26 74 6d 70 29  BufferFree(&tmp)
21400 3b 0a 20 20 20 20 66 74 73 35 42 75 66 66 65 72  ;.    fts5Buffer
21410 46 72 65 65 28 26 6f 75 74 29 3b 0a 20 20 7d 0a  Free(&out);.  }.
21420 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  }..static void f
21430 74 73 35 42 75 66 66 65 72 53 77 61 70 28 46 74  ts5BufferSwap(Ft
21440 73 35 42 75 66 66 65 72 20 2a 70 31 2c 20 46 74  s5Buffer *p1, Ft
21450 73 35 42 75 66 66 65 72 20 2a 70 32 29 7b 0a 20  s5Buffer *p2){. 
21460 20 46 74 73 35 42 75 66 66 65 72 20 74 6d 70 20   Fts5Buffer tmp 
21470 3d 20 2a 70 31 3b 0a 20 20 2a 70 31 20 3d 20 2a  = *p1;.  *p1 = *
21480 70 32 3b 0a 20 20 2a 70 32 20 3d 20 74 6d 70 3b  p2;.  *p2 = tmp;
21490 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .}..static void 
214a0 66 74 73 35 53 65 74 75 70 50 72 65 66 69 78 49  fts5SetupPrefixI
214b0 74 65 72 28 0a 20 20 46 74 73 35 49 6e 64 65 78  ter(.  Fts5Index
214c0 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
214d0 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
214e0 74 6f 20 72 65 61 64 20 66 72 6f 6d 20 2a 2f 0a  to read from */.
214f0 20 20 69 6e 74 20 62 44 65 73 63 2c 20 20 20 20    int bDesc,    
21500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21510 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 22 4f    /* True for "O
21520 52 44 45 52 20 42 59 20 72 6f 77 69 64 20 44 45  RDER BY rowid DE
21530 53 43 22 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 75  SC" */.  const u
21540 38 20 2a 70 54 6f 6b 65 6e 2c 20 20 20 20 20 20  8 *pToken,      
21550 20 20 20 20 20 20 20 20 20 2f 2a 20 42 75 66 66           /* Buff
21560 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 70 72  er containing pr
21570 65 66 69 78 20 74 6f 20 6d 61 74 63 68 20 2a 2f  efix to match */
21580 0a 20 20 69 6e 74 20 6e 54 6f 6b 65 6e 2c 20 20  .  int nToken,  
21590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
215a0 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 62 75     /* Size of bu
215b0 66 66 65 72 20 70 54 6f 6b 65 6e 20 69 6e 20 62  ffer pToken in b
215c0 79 74 65 73 20 2a 2f 0a 20 20 46 74 73 35 43 6f  ytes */.  Fts5Co
215d0 6c 73 65 74 20 2a 70 43 6f 6c 73 65 74 2c 20 20  lset *pColset,  
215e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73            /* Res
215f0 74 72 69 63 74 20 6d 61 74 63 68 65 73 20 74 6f  trict matches to
21600 20 74 68 65 73 65 20 63 6f 6c 75 6d 6e 73 20 2a   these columns *
21610 2f 0a 20 20 46 74 73 35 49 6e 64 65 78 49 74 65  /.  Fts5IndexIte
21620 72 20 2a 2a 70 70 49 74 65 72 20 20 20 20 20 20  r **ppIter      
21630 20 20 20 20 2f 2a 20 4f 55 54 3a 20 4e 65 77 20      /* OUT: New 
21640 69 74 65 72 61 74 6f 72 20 2a 2f 0a 29 7b 0a 20  iterator */.){. 
21650 20 46 74 73 35 53 74 72 75 63 74 75 72 65 20 2a   Fts5Structure *
21660 70 53 74 72 75 63 74 3b 0a 20 20 46 74 73 35 42  pStruct;.  Fts5B
21670 75 66 66 65 72 20 2a 61 42 75 66 3b 0a 20 20 63  uffer *aBuf;.  c
21680 6f 6e 73 74 20 69 6e 74 20 6e 42 75 66 20 3d 20  onst int nBuf = 
21690 33 32 3b 0a 0a 20 20 61 42 75 66 20 3d 20 28 46  32;..  aBuf = (F
216a0 74 73 35 42 75 66 66 65 72 2a 29 66 74 73 35 49  ts5Buffer*)fts5I
216b0 64 78 4d 61 6c 6c 6f 63 28 70 2c 20 73 69 7a 65  dxMalloc(p, size
216c0 6f 66 28 46 74 73 35 42 75 66 66 65 72 29 2a 6e  of(Fts5Buffer)*n
216d0 42 75 66 29 3b 0a 20 20 70 53 74 72 75 63 74 20  Buf);.  pStruct 
216e0 3d 20 66 74 73 35 53 74 72 75 63 74 75 72 65 52  = fts5StructureR
216f0 65 61 64 28 70 29 3b 0a 0a 20 20 69 66 28 20 61  ead(p);..  if( a
21700 42 75 66 20 26 26 20 70 53 74 72 75 63 74 20 29  Buf && pStruct )
21710 7b 0a 20 20 20 20 63 6f 6e 73 74 20 69 6e 74 20  {.    const int 
21720 66 6c 61 67 73 20 3d 20 46 54 53 35 49 4e 44 45  flags = FTS5INDE
21730 58 5f 51 55 45 52 59 5f 53 43 41 4e 3b 0a 20 20  X_QUERY_SCAN;.  
21740 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 69 36 34    int i;.    i64
21750 20 69 4c 61 73 74 52 6f 77 69 64 20 3d 20 30 3b   iLastRowid = 0;
21760 0a 20 20 20 20 46 74 73 35 49 6e 64 65 78 49 74  .    Fts5IndexIt
21770 65 72 20 2a 70 31 20 3d 20 30 3b 20 20 20 20 20  er *p1 = 0;     
21780 2f 2a 20 49 74 65 72 61 74 6f 72 20 75 73 65 64  /* Iterator used
21790 20 74 6f 20 67 61 74 68 65 72 20 64 61 74 61 20   to gather data 
217a0 66 72 6f 6d 20 69 6e 64 65 78 20 2a 2f 0a 20 20  from index */.  
217b0 20 20 46 74 73 35 44 61 74 61 20 2a 70 44 61 74    Fts5Data *pDat
217c0 61 3b 0a 20 20 20 20 46 74 73 35 42 75 66 66 65  a;.    Fts5Buffe
217d0 72 20 64 6f 63 6c 69 73 74 3b 0a 0a 20 20 20 20  r doclist;..    
217e0 6d 65 6d 73 65 74 28 26 64 6f 63 6c 69 73 74 2c  memset(&doclist,
217f0 20 30 2c 20 73 69 7a 65 6f 66 28 64 6f 63 6c 69   0, sizeof(docli
21800 73 74 29 29 3b 0a 20 20 20 20 66 6f 72 28 66 74  st));.    for(ft
21810 73 35 4d 75 6c 74 69 49 74 65 72 4e 65 77 28 70  s5MultiIterNew(p
21820 2c 20 70 53 74 72 75 63 74 2c 20 31 2c 20 66 6c  , pStruct, 1, fl
21830 61 67 73 2c 20 70 54 6f 6b 65 6e 2c 20 6e 54 6f  ags, pToken, nTo
21840 6b 65 6e 2c 20 2d 31 2c 20 30 2c 20 26 70 31 29  ken, -1, 0, &p1)
21850 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35 4d 75  ;.        fts5Mu
21860 6c 74 69 49 74 65 72 45 6f 66 28 70 2c 20 70 31  ltiIterEof(p, p1
21870 29 3d 3d 30 3b 0a 20 20 20 20 20 20 20 20 66 74  )==0;.        ft
21880 73 35 4d 75 6c 74 69 49 74 65 72 4e 65 78 74 28  s5MultiIterNext(
21890 70 2c 20 70 31 2c 20 30 2c 20 30 29 0a 20 20 20  p, p1, 0, 0).   
218a0 20 29 7b 0a 20 20 20 20 20 20 69 36 34 20 69 52   ){.      i64 iR
218b0 6f 77 69 64 20 3d 20 66 74 73 35 4d 75 6c 74 69  owid = fts5Multi
218c0 49 74 65 72 52 6f 77 69 64 28 70 31 29 3b 0a 20  IterRowid(p1);. 
218d0 20 20 20 20 20 69 6e 74 20 6e 54 65 72 6d 3b 0a       int nTerm;.
218e0 20 20 20 20 20 20 63 6f 6e 73 74 20 75 38 20 2a        const u8 *
218f0 70 54 65 72 6d 20 3d 20 66 74 73 35 4d 75 6c 74  pTerm = fts5Mult
21900 69 49 74 65 72 54 65 72 6d 28 70 31 2c 20 26 6e  iIterTerm(p1, &n
21910 54 65 72 6d 29 3b 0a 20 20 20 20 20 20 61 73 73  Term);.      ass
21920 65 72 74 5f 6e 63 28 20 6d 65 6d 63 6d 70 28 70  ert_nc( memcmp(p
21930 54 6f 6b 65 6e 2c 20 70 54 65 72 6d 2c 20 4d 49  Token, pTerm, MI
21940 4e 28 6e 54 6f 6b 65 6e 2c 20 6e 54 65 72 6d 29  N(nToken, nTerm)
21950 29 3c 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66  )<=0 );.      if
21960 28 20 6e 54 65 72 6d 3c 6e 54 6f 6b 65 6e 20 7c  ( nTerm<nToken |
21970 7c 20 6d 65 6d 63 6d 70 28 70 54 6f 6b 65 6e 2c  | memcmp(pToken,
21980 20 70 54 65 72 6d 2c 20 6e 54 6f 6b 65 6e 29 20   pTerm, nToken) 
21990 29 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 20 20  ) break;..      
219a0 69 66 28 20 64 6f 63 6c 69 73 74 2e 6e 3e 30 20  if( doclist.n>0 
219b0 26 26 20 69 52 6f 77 69 64 3c 3d 69 4c 61 73 74  && iRowid<=iLast
219c0 52 6f 77 69 64 20 29 7b 0a 20 20 20 20 20 20 20  Rowid ){.       
219d0 20 66 6f 72 28 69 3d 30 3b 20 70 2d 3e 72 63 3d   for(i=0; p->rc=
219e0 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 64 6f  =SQLITE_OK && do
219f0 63 6c 69 73 74 2e 6e 3b 20 69 2b 2b 29 7b 0a 20  clist.n; i++){. 
21a00 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
21a10 20 69 3c 6e 42 75 66 20 29 3b 0a 20 20 20 20 20   i<nBuf );.     
21a20 20 20 20 20 20 69 66 28 20 61 42 75 66 5b 69 5d       if( aBuf[i]
21a30 2e 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  .n==0 ){.       
21a40 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72 53       fts5BufferS
21a50 77 61 70 28 26 64 6f 63 6c 69 73 74 2c 20 26 61  wap(&doclist, &a
21a60 42 75 66 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20  Buf[i]);.       
21a70 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72 5a       fts5BufferZ
21a80 65 72 6f 28 26 64 6f 63 6c 69 73 74 29 3b 0a 20  ero(&doclist);. 
21a90 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
21aa0 20 20 20 20 20 20 20 20 20 20 20 20 66 74 73 35              fts5
21ab0 4d 65 72 67 65 50 72 65 66 69 78 4c 69 73 74 73  MergePrefixLists
21ac0 28 70 2c 20 26 64 6f 63 6c 69 73 74 2c 20 26 61  (p, &doclist, &a
21ad0 42 75 66 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20  Buf[i]);.       
21ae0 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72 5a       fts5BufferZ
21af0 65 72 6f 28 26 61 42 75 66 5b 69 5d 29 3b 0a 20  ero(&aBuf[i]);. 
21b00 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
21b10 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 4c 61     }.        iLa
21b20 73 74 52 6f 77 69 64 20 3d 20 30 3b 0a 20 20 20  stRowid = 0;.   
21b30 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20     }..      if( 
21b40 21 66 74 73 35 41 70 70 65 6e 64 50 6f 73 6c 69  !fts5AppendPosli
21b50 73 74 28 70 2c 20 69 52 6f 77 69 64 2d 69 4c 61  st(p, iRowid-iLa
21b60 73 74 52 6f 77 69 64 2c 20 70 31 2c 20 70 43 6f  stRowid, p1, pCo
21b70 6c 73 65 74 2c 20 26 64 6f 63 6c 69 73 74 29 20  lset, &doclist) 
21b80 29 7b 0a 20 20 20 20 20 20 20 20 69 4c 61 73 74  ){.        iLast
21b90 52 6f 77 69 64 20 3d 20 69 52 6f 77 69 64 3b 0a  Rowid = iRowid;.
21ba0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
21bb0 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 42     for(i=0; i<nB
21bc0 75 66 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  uf; i++){.      
21bd0 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  if( p->rc==SQLIT
21be0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
21bf0 66 74 73 35 4d 65 72 67 65 50 72 65 66 69 78 4c  fts5MergePrefixL
21c00 69 73 74 73 28 70 2c 20 26 64 6f 63 6c 69 73 74  ists(p, &doclist
21c10 2c 20 26 61 42 75 66 5b 69 5d 29 3b 0a 20 20 20  , &aBuf[i]);.   
21c20 20 20 20 7d 0a 20 20 20 20 20 20 66 74 73 35 42     }.      fts5B
21c30 75 66 66 65 72 46 72 65 65 28 26 61 42 75 66 5b  ufferFree(&aBuf[
21c40 69 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66  i]);.    }.    f
21c50 74 73 35 4d 75 6c 74 69 49 74 65 72 46 72 65 65  ts5MultiIterFree
21c60 28 70 2c 20 70 31 29 3b 0a 0a 20 20 20 20 70 44  (p, p1);..    pD
21c70 61 74 61 20 3d 20 66 74 73 35 49 64 78 4d 61 6c  ata = fts5IdxMal
21c80 6c 6f 63 28 70 2c 20 73 69 7a 65 6f 66 28 46 74  loc(p, sizeof(Ft
21c90 73 35 44 61 74 61 29 20 2b 20 64 6f 63 6c 69 73  s5Data) + doclis
21ca0 74 2e 6e 29 3b 0a 20 20 20 20 69 66 28 20 70 44  t.n);.    if( pD
21cb0 61 74 61 20 29 7b 0a 20 20 20 20 20 20 70 44 61  ata ){.      pDa
21cc0 74 61 2d 3e 70 20 3d 20 28 75 38 2a 29 26 70 44  ta->p = (u8*)&pD
21cd0 61 74 61 5b 31 5d 3b 0a 20 20 20 20 20 20 70 44  ata[1];.      pD
21ce0 61 74 61 2d 3e 6e 6e 20 3d 20 70 44 61 74 61 2d  ata->nn = pData-
21cf0 3e 73 7a 4c 65 61 66 20 3d 20 64 6f 63 6c 69 73  >szLeaf = doclis
21d00 74 2e 6e 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70  t.n;.      memcp
21d10 79 28 70 44 61 74 61 2d 3e 70 2c 20 64 6f 63 6c  y(pData->p, docl
21d20 69 73 74 2e 70 2c 20 64 6f 63 6c 69 73 74 2e 6e  ist.p, doclist.n
21d30 29 3b 0a 20 20 20 20 20 20 66 74 73 35 4d 75 6c  );.      fts5Mul
21d40 74 69 49 74 65 72 4e 65 77 32 28 70 2c 20 70 44  tiIterNew2(p, pD
21d50 61 74 61 2c 20 62 44 65 73 63 2c 20 70 70 49 74  ata, bDesc, ppIt
21d60 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66  er);.    }.    f
21d70 74 73 35 42 75 66 66 65 72 46 72 65 65 28 26 64  ts5BufferFree(&d
21d80 6f 63 6c 69 73 74 29 3b 0a 20 20 7d 0a 0a 20 20  oclist);.  }..  
21d90 66 74 73 35 53 74 72 75 63 74 75 72 65 52 65 6c  fts5StructureRel
21da0 65 61 73 65 28 70 53 74 72 75 63 74 29 3b 0a 20  ease(pStruct);. 
21db0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 61 42   sqlite3_free(aB
21dc0 75 66 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 49  uf);.}.../*.** I
21dd0 6e 64 69 63 61 74 65 20 74 68 61 74 20 61 6c 6c  ndicate that all
21de0 20 73 75 62 73 65 71 75 65 6e 74 20 63 61 6c 6c   subsequent call
21df0 73 20 74 6f 20 73 71 6c 69 74 65 33 46 74 73 35  s to sqlite3Fts5
21e00 49 6e 64 65 78 57 72 69 74 65 28 29 20 70 65 72  IndexWrite() per
21e10 74 61 69 6e 0a 2a 2a 20 74 6f 20 74 68 65 20 64  tain.** to the d
21e20 6f 63 75 6d 65 6e 74 20 77 69 74 68 20 72 6f 77  ocument with row
21e30 69 64 20 69 52 6f 77 69 64 2e 0a 2a 2f 0a 69 6e  id iRowid..*/.in
21e40 74 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64  t sqlite3Fts5Ind
21e50 65 78 42 65 67 69 6e 57 72 69 74 65 28 46 74 73  exBeginWrite(Fts
21e60 35 49 6e 64 65 78 20 2a 70 2c 20 69 6e 74 20 62  5Index *p, int b
21e70 44 65 6c 65 74 65 2c 20 69 36 34 20 69 52 6f 77  Delete, i64 iRow
21e80 69 64 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70  id){.  assert( p
21e90 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
21ea0 29 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74  );..  /* Allocat
21eb0 65 20 74 68 65 20 68 61 73 68 20 74 61 62 6c 65  e the hash table
21ec0 20 69 66 20 69 74 20 68 61 73 20 6e 6f 74 20 61   if it has not a
21ed0 6c 72 65 61 64 79 20 62 65 65 6e 20 61 6c 6c 6f  lready been allo
21ee0 63 61 74 65 64 20 2a 2f 0a 20 20 69 66 28 20 70  cated */.  if( p
21ef0 2d 3e 70 48 61 73 68 3d 3d 30 20 29 7b 0a 20 20  ->pHash==0 ){.  
21f00 20 20 70 2d 3e 72 63 20 3d 20 73 71 6c 69 74 65    p->rc = sqlite
21f10 33 46 74 73 35 48 61 73 68 4e 65 77 28 26 70 2d  3Fts5HashNew(&p-
21f20 3e 70 48 61 73 68 2c 20 26 70 2d 3e 6e 50 65 6e  >pHash, &p->nPen
21f30 64 69 6e 67 44 61 74 61 29 3b 0a 20 20 7d 0a 0a  dingData);.  }..
21f40 20 20 2f 2a 20 46 6c 75 73 68 20 74 68 65 20 68    /* Flush the h
21f50 61 73 68 20 74 61 62 6c 65 20 74 6f 20 64 69 73  ash table to dis
21f60 6b 20 69 66 20 72 65 71 75 69 72 65 64 20 2a 2f  k if required */
21f70 0a 20 20 69 66 28 20 69 52 6f 77 69 64 3c 70 2d  .  if( iRowid<p-
21f80 3e 69 57 72 69 74 65 52 6f 77 69 64 20 0a 20 20  >iWriteRowid .  
21f90 20 7c 7c 20 28 69 52 6f 77 69 64 3d 3d 70 2d 3e   || (iRowid==p->
21fa0 69 57 72 69 74 65 52 6f 77 69 64 20 26 26 20 70  iWriteRowid && p
21fb0 2d 3e 62 44 65 6c 65 74 65 3d 3d 30 29 0a 20 20  ->bDelete==0).  
21fc0 20 7c 7c 20 28 70 2d 3e 6e 50 65 6e 64 69 6e 67   || (p->nPending
21fd0 44 61 74 61 20 3e 20 70 2d 3e 6e 4d 61 78 50 65  Data > p->nMaxPe
21fe0 6e 64 69 6e 67 44 61 74 61 29 20 0a 20 20 29 7b  ndingData) .  ){
21ff0 0a 20 20 20 20 66 74 73 35 49 6e 64 65 78 46 6c  .    fts5IndexFl
22000 75 73 68 28 70 29 3b 0a 20 20 7d 0a 0a 20 20 70  ush(p);.  }..  p
22010 2d 3e 69 57 72 69 74 65 52 6f 77 69 64 20 3d 20  ->iWriteRowid = 
22020 69 52 6f 77 69 64 3b 0a 20 20 70 2d 3e 62 44 65  iRowid;.  p->bDe
22030 6c 65 74 65 20 3d 20 62 44 65 6c 65 74 65 3b 0a  lete = bDelete;.
22040 20 20 72 65 74 75 72 6e 20 66 74 73 35 49 6e 64    return fts5Ind
22050 65 78 52 65 74 75 72 6e 28 70 29 3b 0a 7d 0a 0a  exReturn(p);.}..
22060 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69 74 20 64 61 74  /*.** Commit dat
22070 61 20 74 6f 20 64 69 73 6b 2e 0a 2a 2f 0a 69 6e  a to disk..*/.in
22080 74 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64  t sqlite3Fts5Ind
22090 65 78 53 79 6e 63 28 46 74 73 35 49 6e 64 65 78  exSync(Fts5Index
220a0 20 2a 70 2c 20 69 6e 74 20 62 43 6f 6d 6d 69 74   *p, int bCommit
220b0 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  ){.  assert( p->
220c0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  rc==SQLITE_OK );
220d0 0a 20 20 66 74 73 35 49 6e 64 65 78 46 6c 75 73  .  fts5IndexFlus
220e0 68 28 70 29 3b 0a 20 20 69 66 28 20 62 43 6f 6d  h(p);.  if( bCom
220f0 6d 69 74 20 29 20 66 74 73 35 43 6c 6f 73 65 52  mit ) fts5CloseR
22100 65 61 64 65 72 28 70 29 3b 0a 20 20 72 65 74 75  eader(p);.  retu
22110 72 6e 20 66 74 73 35 49 6e 64 65 78 52 65 74 75  rn fts5IndexRetu
22120 72 6e 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn(p);.}../*.** 
22130 44 69 73 63 61 72 64 20 61 6e 79 20 64 61 74 61  Discard any data
22140 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 69   stored in the i
22150 6e 2d 6d 65 6d 6f 72 79 20 68 61 73 68 20 74 61  n-memory hash ta
22160 62 6c 65 73 2e 20 44 6f 20 6e 6f 74 20 77 72 69  bles. Do not wri
22170 74 65 20 69 74 0a 2a 2a 20 74 6f 20 74 68 65 20  te it.** to the 
22180 64 61 74 61 62 61 73 65 2e 20 41 64 64 69 74 69  database. Additi
22190 6f 6e 61 6c 6c 79 2c 20 61 73 73 75 6d 65 20 74  onally, assume t
221a0 68 61 74 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  hat the contents
221b0 20 6f 66 20 74 68 65 20 25 5f 64 61 74 61 0a 2a   of the %_data.*
221c0 2a 20 74 61 62 6c 65 20 6d 61 79 20 68 61 76 65  * table may have
221d0 20 63 68 61 6e 67 65 64 20 6f 6e 20 64 69 73 6b   changed on disk
221e0 2e 20 53 6f 20 61 6e 79 20 69 6e 2d 6d 65 6d 6f  . So any in-memo
221f0 72 79 20 63 61 63 68 65 73 20 6f 66 20 25 5f 64  ry caches of %_d
22200 61 74 61 20 0a 2a 2a 20 72 65 63 6f 72 64 73 20  ata .** records 
22210 6d 75 73 74 20 62 65 20 69 6e 76 61 6c 69 64 61  must be invalida
22220 74 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ted..*/.int sqli
22230 74 65 33 46 74 73 35 49 6e 64 65 78 52 6f 6c 6c  te3Fts5IndexRoll
22240 62 61 63 6b 28 46 74 73 35 49 6e 64 65 78 20 2a  back(Fts5Index *
22250 70 29 7b 0a 20 20 66 74 73 35 43 6c 6f 73 65 52  p){.  fts5CloseR
22260 65 61 64 65 72 28 70 29 3b 0a 20 20 66 74 73 35  eader(p);.  fts5
22270 49 6e 64 65 78 44 69 73 63 61 72 64 44 61 74 61  IndexDiscardData
22280 28 70 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  (p);.  assert( p
22290 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
222a0 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
222b0 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
222c0 54 68 65 20 25 5f 64 61 74 61 20 74 61 62 6c 65  The %_data table
222d0 20 69 73 20 63 6f 6d 70 6c 65 74 65 6c 79 20 65   is completely e
222e0 6d 70 74 79 20 77 68 65 6e 20 74 68 69 73 20 66  mpty when this f
222f0 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
22300 64 2e 20 54 68 69 73 0a 2a 2a 20 66 75 6e 63 74  d. This.** funct
22310 69 6f 6e 20 70 6f 70 75 6c 61 74 65 73 20 69 74  ion populates it
22320 20 77 69 74 68 20 74 68 65 20 69 6e 69 74 69 61   with the initia
22330 6c 20 73 74 72 75 63 74 75 72 65 20 6f 62 6a 65  l structure obje
22340 63 74 73 20 66 6f 72 20 65 61 63 68 20 69 6e 64  cts for each ind
22350 65 78 2c 0a 2a 2a 20 61 6e 64 20 74 68 65 20 69  ex,.** and the i
22360 6e 69 74 69 61 6c 20 76 65 72 73 69 6f 6e 20 6f  nitial version o
22370 66 20 74 68 65 20 22 61 76 65 72 61 67 65 73 22  f the "averages"
22380 20 72 65 63 6f 72 64 20 28 61 20 7a 65 72 6f 2d   record (a zero-
22390 62 79 74 65 20 62 6c 6f 62 29 2e 0a 2a 2f 0a 69  byte blob)..*/.i
223a0 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e  nt sqlite3Fts5In
223b0 64 65 78 52 65 69 6e 69 74 28 46 74 73 35 49 6e  dexReinit(Fts5In
223c0 64 65 78 20 2a 70 29 7b 0a 20 20 46 74 73 35 53  dex *p){.  Fts5S
223d0 74 72 75 63 74 75 72 65 20 73 3b 0a 20 20 6d 65  tructure s;.  me
223e0 6d 73 65 74 28 26 73 2c 20 30 2c 20 73 69 7a 65  mset(&s, 0, size
223f0 6f 66 28 46 74 73 35 53 74 72 75 63 74 75 72 65  of(Fts5Structure
22400 29 29 3b 0a 20 20 66 74 73 35 44 61 74 61 57 72  ));.  fts5DataWr
22410 69 74 65 28 70 2c 20 46 54 53 35 5f 41 56 45 52  ite(p, FTS5_AVER
22420 41 47 45 53 5f 52 4f 57 49 44 2c 20 28 63 6f 6e  AGES_ROWID, (con
22430 73 74 20 75 38 2a 29 22 22 2c 20 30 29 3b 0a 20  st u8*)"", 0);. 
22440 20 66 74 73 35 53 74 72 75 63 74 75 72 65 57 72   fts5StructureWr
22450 69 74 65 28 70 2c 20 26 73 29 3b 0a 20 20 72 65  ite(p, &s);.  re
22460 74 75 72 6e 20 66 74 73 35 49 6e 64 65 78 52 65  turn fts5IndexRe
22470 74 75 72 6e 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn(p);.}../*.*
22480 2a 20 4f 70 65 6e 20 61 20 6e 65 77 20 46 74 73  * Open a new Fts
22490 35 49 6e 64 65 78 20 68 61 6e 64 6c 65 2e 20 49  5Index handle. I
224a0 66 20 74 68 65 20 62 43 72 65 61 74 65 20 61 72  f the bCreate ar
224b0 67 75 6d 65 6e 74 20 69 73 20 74 72 75 65 2c 20  gument is true, 
224c0 63 72 65 61 74 65 0a 2a 2a 20 61 6e 64 20 69 6e  create.** and in
224d0 69 74 69 61 6c 69 7a 65 20 74 68 65 20 75 6e 64  itialize the und
224e0 65 72 6c 79 69 6e 67 20 25 5f 64 61 74 61 20 74  erlying %_data t
224f0 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73  able..**.** If s
22500 75 63 63 65 73 73 66 75 6c 2c 20 73 65 74 20 2a  uccessful, set *
22510 70 70 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74  pp to point to t
22520 68 65 20 6e 65 77 20 6f 62 6a 65 63 74 20 61 6e  he new object an
22530 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  d return SQLITE_
22540 4f 4b 2e 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65  OK..** Otherwise
22550 2c 20 73 65 74 20 2a 70 70 20 74 6f 20 4e 55 4c  , set *pp to NUL
22560 4c 20 61 6e 64 20 72 65 74 75 72 6e 20 61 6e 20  L and return an 
22570 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64  SQLite error cod
22580 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  e..*/.int sqlite
22590 33 46 74 73 35 49 6e 64 65 78 4f 70 65 6e 28 0a  3Fts5IndexOpen(.
225a0 20 20 46 74 73 35 43 6f 6e 66 69 67 20 2a 70 43    Fts5Config *pC
225b0 6f 6e 66 69 67 2c 20 0a 20 20 69 6e 74 20 62 43  onfig, .  int bC
225c0 72 65 61 74 65 2c 20 0a 20 20 46 74 73 35 49 6e  reate, .  Fts5In
225d0 64 65 78 20 2a 2a 70 70 2c 0a 20 20 63 68 61 72  dex **pp,.  char
225e0 20 2a 2a 70 7a 45 72 72 0a 29 7b 0a 20 20 69 6e   **pzErr.){.  in
225f0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
22600 3b 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70  ;.  Fts5Index *p
22610 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
22620 20 20 20 20 2f 2a 20 4e 65 77 20 6f 62 6a 65 63      /* New objec
22630 74 20 2a 2f 0a 0a 20 20 2a 70 70 20 3d 20 70 20  t */..  *pp = p 
22640 3d 20 28 46 74 73 35 49 6e 64 65 78 2a 29 73 71  = (Fts5Index*)sq
22650 6c 69 74 65 33 46 74 73 35 4d 61 6c 6c 6f 63 5a  lite3Fts5MallocZ
22660 65 72 6f 28 26 72 63 2c 20 73 69 7a 65 6f 66 28  ero(&rc, sizeof(
22670 46 74 73 35 49 6e 64 65 78 29 29 3b 0a 20 20 69  Fts5Index));.  i
22680 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
22690 20 29 7b 0a 20 20 20 20 70 2d 3e 70 43 6f 6e 66   ){.    p->pConf
226a0 69 67 20 3d 20 70 43 6f 6e 66 69 67 3b 0a 20 20  ig = pConfig;.  
226b0 20 20 70 2d 3e 6e 57 6f 72 6b 55 6e 69 74 20 3d    p->nWorkUnit =
226c0 20 46 54 53 35 5f 57 4f 52 4b 5f 55 4e 49 54 3b   FTS5_WORK_UNIT;
226d0 0a 20 20 20 20 70 2d 3e 6e 4d 61 78 50 65 6e 64  .    p->nMaxPend
226e0 69 6e 67 44 61 74 61 20 3d 20 31 30 32 34 2a 31  ingData = 1024*1
226f0 30 32 34 3b 0a 20 20 20 20 70 2d 3e 7a 44 61 74  024;.    p->zDat
22700 61 54 62 6c 20 3d 20 73 71 6c 69 74 65 33 46 74  aTbl = sqlite3Ft
22710 73 35 4d 70 72 69 6e 74 66 28 26 72 63 2c 20 22  s5Mprintf(&rc, "
22720 25 73 5f 64 61 74 61 22 2c 20 70 43 6f 6e 66 69  %s_data", pConfi
22730 67 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 69  g->zName);.    i
22740 66 28 20 70 2d 3e 7a 44 61 74 61 54 62 6c 20 26  f( p->zDataTbl &
22750 26 20 62 43 72 65 61 74 65 20 29 7b 0a 20 20 20  & bCreate ){.   
22760 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 46     rc = sqlite3F
22770 74 73 35 43 72 65 61 74 65 54 61 62 6c 65 28 0a  ts5CreateTable(.
22780 20 20 20 20 20 20 20 20 20 20 70 43 6f 6e 66 69            pConfi
22790 67 2c 20 22 64 61 74 61 22 2c 20 22 69 64 20 49  g, "data", "id I
227a0 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b  NTEGER PRIMARY K
227b0 45 59 2c 20 62 6c 6f 63 6b 20 42 4c 4f 42 22 2c  EY, block BLOB",
227c0 20 30 2c 20 70 7a 45 72 72 0a 20 20 20 20 20 20   0, pzErr.      
227d0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  );.      if( rc=
227e0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
227f0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
22800 65 33 46 74 73 35 43 72 65 61 74 65 54 61 62 6c  e3Fts5CreateTabl
22810 65 28 70 43 6f 6e 66 69 67 2c 20 22 69 64 78 22  e(pConfig, "idx"
22820 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 22  , .            "
22830 73 65 67 69 64 2c 20 74 65 72 6d 2c 20 70 67 6e  segid, term, pgn
22840 6f 2c 20 50 52 49 4d 41 52 59 20 4b 45 59 28 73  o, PRIMARY KEY(s
22850 65 67 69 64 2c 20 74 65 72 6d 29 22 2c 20 0a 20  egid, term)", . 
22860 20 20 20 20 20 20 20 20 20 20 20 31 2c 20 70 7a             1, pz
22870 45 72 72 0a 20 20 20 20 20 20 20 20 29 3b 0a 20  Err.        );. 
22880 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
22890 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
228a0 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  {.        rc = s
228b0 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78 52  qlite3Fts5IndexR
228c0 65 69 6e 69 74 28 70 29 3b 0a 20 20 20 20 20 20  einit(p);.      
228d0 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 61  }.    }.  }..  a
228e0 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54  ssert( rc!=SQLIT
228f0 45 5f 4f 4b 20 7c 7c 20 70 2d 3e 72 63 3d 3d 53  E_OK || p->rc==S
22900 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 69 66  QLITE_OK );.  if
22910 28 20 72 63 20 29 7b 0a 20 20 20 20 73 71 6c 69  ( rc ){.    sqli
22920 74 65 33 46 74 73 35 49 6e 64 65 78 43 6c 6f 73  te3Fts5IndexClos
22930 65 28 70 29 3b 0a 20 20 20 20 2a 70 70 20 3d 20  e(p);.    *pp = 
22940 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  0;.  }.  return 
22950 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f  rc;.}../*.** Clo
22960 73 65 20 61 20 68 61 6e 64 6c 65 20 6f 70 65 6e  se a handle open
22970 65 64 20 62 79 20 61 6e 20 65 61 72 6c 69 65 72  ed by an earlier
22980 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33   call to sqlite3
22990 46 74 73 35 49 6e 64 65 78 4f 70 65 6e 28 29 2e  Fts5IndexOpen().
229a0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46  .*/.int sqlite3F
229b0 74 73 35 49 6e 64 65 78 43 6c 6f 73 65 28 46 74  ts5IndexClose(Ft
229c0 73 35 49 6e 64 65 78 20 2a 70 29 7b 0a 20 20 69  s5Index *p){.  i
229d0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
229e0 4b 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20  K;.  if( p ){.  
229f0 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 52 65    assert( p->pRe
22a00 61 64 65 72 3d 3d 30 20 29 3b 0a 20 20 20 20 73  ader==0 );.    s
22a10 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28  qlite3_finalize(
22a20 70 2d 3e 70 57 72 69 74 65 72 29 3b 0a 20 20 20  p->pWriter);.   
22a30 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a   sqlite3_finaliz
22a40 65 28 70 2d 3e 70 44 65 6c 65 74 65 72 29 3b 0a  e(p->pDeleter);.
22a50 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61      sqlite3_fina
22a60 6c 69 7a 65 28 70 2d 3e 70 49 64 78 57 72 69 74  lize(p->pIdxWrit
22a70 65 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  er);.    sqlite3
22a80 5f 66 69 6e 61 6c 69 7a 65 28 70 2d 3e 70 49 64  _finalize(p->pId
22a90 78 44 65 6c 65 74 65 72 29 3b 0a 20 20 20 20 73  xDeleter);.    s
22aa0 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28  qlite3_finalize(
22ab0 70 2d 3e 70 49 64 78 53 65 6c 65 63 74 29 3b 0a  p->pIdxSelect);.
22ac0 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 48      sqlite3Fts5H
22ad0 61 73 68 46 72 65 65 28 70 2d 3e 70 48 61 73 68  ashFree(p->pHash
22ae0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
22af0 72 65 65 28 70 2d 3e 7a 44 61 74 61 54 62 6c 29  ree(p->zDataTbl)
22b00 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ;.    sqlite3_fr
22b10 65 65 28 70 29 3b 0a 20 20 7d 0a 20 20 72 65 74  ee(p);.  }.  ret
22b20 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
22b30 20 41 72 67 75 6d 65 6e 74 20 70 20 70 6f 69 6e   Argument p poin
22b40 74 73 20 74 6f 20 61 20 62 75 66 66 65 72 20 63  ts to a buffer c
22b50 6f 6e 74 61 69 6e 69 6e 67 20 75 74 66 2d 38 20  ontaining utf-8 
22b60 74 65 78 74 20 74 68 61 74 20 69 73 20 6e 20 62  text that is n b
22b70 79 74 65 73 20 69 6e 20 0a 2a 2a 20 73 69 7a 65  ytes in .** size
22b80 2e 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d  . Return the num
22b90 62 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20  ber of bytes in 
22ba0 74 68 65 20 6e 43 68 61 72 20 63 68 61 72 61 63  the nChar charac
22bb0 74 65 72 20 70 72 65 66 69 78 20 6f 66 20 74 68  ter prefix of th
22bc0 65 0a 2a 2a 20 62 75 66 66 65 72 2c 20 6f 72 20  e.** buffer, or 
22bd0 30 20 69 66 20 74 68 65 72 65 20 61 72 65 20 6c  0 if there are l
22be0 65 73 73 20 74 68 61 6e 20 6e 43 68 61 72 20 63  ess than nChar c
22bf0 68 61 72 61 63 74 65 72 73 20 69 6e 20 74 6f 74  haracters in tot
22c00 61 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  al..*/.static in
22c10 74 20 66 74 73 35 49 6e 64 65 78 43 68 61 72 6c  t fts5IndexCharl
22c20 65 6e 54 6f 42 79 74 65 6c 65 6e 28 63 6f 6e 73  enToBytelen(cons
22c30 74 20 63 68 61 72 20 2a 70 2c 20 69 6e 74 20 6e  t char *p, int n
22c40 42 79 74 65 2c 20 69 6e 74 20 6e 43 68 61 72 29  Byte, int nChar)
22c50 7b 0a 20 20 69 6e 74 20 6e 20 3d 20 30 3b 0a 20  {.  int n = 0;. 
22c60 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d   int i;.  for(i=
22c70 30 3b 20 69 3c 6e 43 68 61 72 3b 20 69 2b 2b 29  0; i<nChar; i++)
22c80 7b 0a 20 20 20 20 69 66 28 20 6e 3e 3d 6e 42 79  {.    if( n>=nBy
22c90 74 65 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20  te ) return 0;  
22ca0 20 20 20 20 2f 2a 20 49 6e 70 75 74 20 63 6f 6e      /* Input con
22cb0 74 61 69 6e 73 20 66 65 77 65 72 20 74 68 61 6e  tains fewer than
22cc0 20 6e 43 68 61 72 20 63 68 61 72 73 20 2a 2f 0a   nChar chars */.
22cd0 20 20 20 20 69 66 28 20 28 75 6e 73 69 67 6e 65      if( (unsigne
22ce0 64 20 63 68 61 72 29 70 5b 6e 2b 2b 5d 3e 3d 30  d char)p[n++]>=0
22cf0 78 63 30 20 29 7b 0a 20 20 20 20 20 20 77 68 69  xc0 ){.      whi
22d00 6c 65 28 20 28 70 5b 6e 5d 20 26 20 30 78 63 30  le( (p[n] & 0xc0
22d10 29 3d 3d 30 78 38 30 20 29 20 6e 2b 2b 3b 0a 20  )==0x80 ) n++;. 
22d20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
22d30 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70 49  n n;.}../*.** pI
22d40 6e 20 69 73 20 61 20 55 54 46 2d 38 20 65 6e 63  n is a UTF-8 enc
22d50 6f 64 65 64 20 73 74 72 69 6e 67 2c 20 6e 49 6e  oded string, nIn
22d60 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2e 20   bytes in size. 
22d70 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65  Return the numbe
22d80 72 20 6f 66 0a 2a 2a 20 75 6e 69 63 6f 64 65 20  r of.** unicode 
22d90 63 68 61 72 61 63 74 65 72 73 20 69 6e 20 74 68  characters in th
22da0 65 20 73 74 72 69 6e 67 2e 0a 2a 2f 0a 73 74 61  e string..*/.sta
22db0 74 69 63 20 69 6e 74 20 66 74 73 35 49 6e 64 65  tic int fts5Inde
22dc0 78 43 68 61 72 6c 65 6e 28 63 6f 6e 73 74 20 63  xCharlen(const c
22dd0 68 61 72 20 2a 70 49 6e 2c 20 69 6e 74 20 6e 49  har *pIn, int nI
22de0 6e 29 7b 0a 20 20 69 6e 74 20 6e 43 68 61 72 20  n){.  int nChar 
22df0 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
22e00 0a 20 20 69 6e 74 20 69 20 3d 20 30 3b 0a 20 20  .  int i = 0;.  
22e10 77 68 69 6c 65 28 20 69 3c 6e 49 6e 20 29 7b 0a  while( i<nIn ){.
22e20 20 20 20 20 69 66 28 20 28 75 6e 73 69 67 6e 65      if( (unsigne
22e30 64 20 63 68 61 72 29 70 49 6e 5b 69 2b 2b 5d 3e  d char)pIn[i++]>
22e40 3d 30 78 63 30 20 29 7b 0a 20 20 20 20 20 20 77  =0xc0 ){.      w
22e50 68 69 6c 65 28 20 69 3c 6e 49 6e 20 26 26 20 28  hile( i<nIn && (
22e60 70 49 6e 5b 69 5d 20 26 20 30 78 63 30 29 3d 3d  pIn[i] & 0xc0)==
22e70 30 78 38 30 20 29 20 69 2b 2b 3b 0a 20 20 20 20  0x80 ) i++;.    
22e80 7d 0a 20 20 20 20 6e 43 68 61 72 2b 2b 3b 0a 20  }.    nChar++;. 
22e90 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 43 68 61   }.  return nCha
22ea0 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 73 65  r;.}../*.** Inse
22eb0 72 74 20 6f 72 20 72 65 6d 6f 76 65 20 64 61 74  rt or remove dat
22ec0 61 20 74 6f 20 6f 72 20 66 72 6f 6d 20 74 68 65  a to or from the
22ed0 20 69 6e 64 65 78 2e 20 45 61 63 68 20 74 69 6d   index. Each tim
22ee0 65 20 61 20 64 6f 63 75 6d 65 6e 74 20 69 73 20  e a document is 
22ef0 0a 2a 2a 20 61 64 64 65 64 20 74 6f 20 6f 72 20  .** added to or 
22f00 72 65 6d 6f 76 65 64 20 66 72 6f 6d 20 74 68 65  removed from the
22f10 20 69 6e 64 65 78 2c 20 74 68 69 73 20 66 75 6e   index, this fun
22f20 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20  ction is called 
22f30 6f 6e 65 20 6f 72 20 6d 6f 72 65 0a 2a 2a 20 74  one or more.** t
22f40 69 6d 65 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20  imes..**.** For 
22f50 61 6e 20 69 6e 73 65 72 74 2c 20 69 74 20 6d 75  an insert, it mu
22f60 73 74 20 62 65 20 63 61 6c 6c 65 64 20 6f 6e 63  st be called onc
22f70 65 20 66 6f 72 20 65 61 63 68 20 74 6f 6b 65 6e  e for each token
22f80 20 69 6e 20 74 68 65 20 6e 65 77 20 64 6f 63 75   in the new docu
22f90 6d 65 6e 74 2e 0a 2a 2a 20 49 66 20 74 68 65 20  ment..** If the 
22fa0 6f 70 65 72 61 74 69 6f 6e 20 69 73 20 61 20 64  operation is a d
22fb0 65 6c 65 74 65 2c 20 69 74 20 6d 75 73 74 20 62  elete, it must b
22fc0 65 20 63 61 6c 6c 65 64 20 28 61 74 20 6c 65 61  e called (at lea
22fd0 73 74 29 20 6f 6e 63 65 20 66 6f 72 20 65 61 63  st) once for eac
22fe0 68 0a 2a 2a 20 75 6e 69 71 75 65 20 74 6f 6b 65  h.** unique toke
22ff0 6e 20 69 6e 20 74 68 65 20 64 6f 63 75 6d 65 6e  n in the documen
23000 74 20 77 69 74 68 20 61 6e 20 69 43 6f 6c 20 76  t with an iCol v
23010 61 6c 75 65 20 6c 65 73 73 20 74 68 61 6e 20 7a  alue less than z
23020 65 72 6f 2e 20 54 68 65 20 69 50 6f 73 0a 2a 2a  ero. The iPos.**
23030 20 61 72 67 75 6d 65 6e 74 20 69 73 20 69 67 6e   argument is ign
23040 6f 72 65 64 20 66 6f 72 20 61 20 64 65 6c 65 74  ored for a delet
23050 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  e..*/.int sqlite
23060 33 46 74 73 35 49 6e 64 65 78 57 72 69 74 65 28  3Fts5IndexWrite(
23070 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c  .  Fts5Index *p,
23080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23090 20 20 20 2f 2a 20 49 6e 64 65 78 20 74 6f 20 77     /* Index to w
230a0 72 69 74 65 20 74 6f 20 2a 2f 0a 20 20 69 6e 74  rite to */.  int
230b0 20 69 43 6f 6c 2c 20 20 20 20 20 20 20 20 20 20   iCol,          
230c0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
230d0 43 6f 6c 75 6d 6e 20 74 6f 6b 65 6e 20 61 70 70  Column token app
230e0 65 61 72 73 20 69 6e 20 28 2d 76 65 20 2d 3e 20  ears in (-ve -> 
230f0 64 65 6c 65 74 65 29 20 2a 2f 0a 20 20 69 6e 74  delete) */.  int
23100 20 69 50 6f 73 2c 20 20 20 20 20 20 20 20 20 20   iPos,          
23110 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
23120 50 6f 73 69 74 69 6f 6e 20 6f 66 20 74 6f 6b 65  Position of toke
23130 6e 20 77 69 74 68 69 6e 20 63 6f 6c 75 6d 6e 20  n within column 
23140 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
23150 2a 70 54 6f 6b 65 6e 2c 20 69 6e 74 20 6e 54 6f  *pToken, int nTo
23160 6b 65 6e 20 20 2f 2a 20 54 6f 6b 65 6e 20 74 6f  ken  /* Token to
23170 20 61 64 64 20 6f 72 20 72 65 6d 6f 76 65 20 74   add or remove t
23180 6f 20 6f 72 20 66 72 6f 6d 20 69 6e 64 65 78 20  o or from index 
23190 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20  */.){.  int i;  
231a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
231b0 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20          /* Used 
231c0 74 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f 75  to iterate throu
231d0 67 68 20 69 6e 64 65 78 65 73 20 2a 2f 0a 20 20  gh indexes */.  
231e0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
231f0 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  OK;             
23200 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
23210 2f 0a 20 20 46 74 73 35 43 6f 6e 66 69 67 20 2a  /.  Fts5Config *
23220 70 43 6f 6e 66 69 67 20 3d 20 70 2d 3e 70 43 6f  pConfig = p->pCo
23230 6e 66 69 67 3b 0a 0a 20 20 61 73 73 65 72 74 28  nfig;..  assert(
23240 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
23250 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28  K );.  assert( (
23260 69 43 6f 6c 3c 30 29 3d 3d 70 2d 3e 62 44 65 6c  iCol<0)==p->bDel
23270 65 74 65 20 29 3b 0a 0a 20 20 2f 2a 20 41 64 64  ete );..  /* Add
23280 20 74 68 65 20 65 6e 74 72 79 20 74 6f 20 74 68   the entry to th
23290 65 20 6d 61 69 6e 20 74 65 72 6d 73 20 69 6e 64  e main terms ind
232a0 65 78 2e 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71  ex. */.  rc = sq
232b0 6c 69 74 65 33 46 74 73 35 48 61 73 68 57 72 69  lite3Fts5HashWri
232c0 74 65 28 0a 20 20 20 20 20 20 70 2d 3e 70 48 61  te(.      p->pHa
232d0 73 68 2c 20 70 2d 3e 69 57 72 69 74 65 52 6f 77  sh, p->iWriteRow
232e0 69 64 2c 20 69 43 6f 6c 2c 20 69 50 6f 73 2c 20  id, iCol, iPos, 
232f0 46 54 53 35 5f 4d 41 49 4e 5f 50 52 45 46 49 58  FTS5_MAIN_PREFIX
23300 2c 20 70 54 6f 6b 65 6e 2c 20 6e 54 6f 6b 65 6e  , pToken, nToken
23310 0a 20 20 29 3b 0a 0a 20 20 66 6f 72 28 69 3d 30  .  );..  for(i=0
23320 3b 20 69 3c 70 43 6f 6e 66 69 67 2d 3e 6e 50 72  ; i<pConfig->nPr
23330 65 66 69 78 20 26 26 20 72 63 3d 3d 53 51 4c 49  efix && rc==SQLI
23340 54 45 5f 4f 4b 3b 20 69 2b 2b 29 7b 0a 20 20 20  TE_OK; i++){.   
23350 20 69 6e 74 20 6e 42 79 74 65 20 3d 20 66 74 73   int nByte = fts
23360 35 49 6e 64 65 78 43 68 61 72 6c 65 6e 54 6f 42  5IndexCharlenToB
23370 79 74 65 6c 65 6e 28 70 54 6f 6b 65 6e 2c 20 6e  ytelen(pToken, n
23380 54 6f 6b 65 6e 2c 20 70 43 6f 6e 66 69 67 2d 3e  Token, pConfig->
23390 61 50 72 65 66 69 78 5b 69 5d 29 3b 0a 20 20 20  aPrefix[i]);.   
233a0 20 69 66 28 20 6e 42 79 74 65 20 29 7b 0a 20 20   if( nByte ){.  
233b0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
233c0 46 74 73 35 48 61 73 68 57 72 69 74 65 28 70 2d  Fts5HashWrite(p-
233d0 3e 70 48 61 73 68 2c 20 0a 20 20 20 20 20 20 20  >pHash, .       
233e0 20 20 20 70 2d 3e 69 57 72 69 74 65 52 6f 77 69     p->iWriteRowi
233f0 64 2c 20 69 43 6f 6c 2c 20 69 50 6f 73 2c 20 46  d, iCol, iPos, F
23400 54 53 35 5f 4d 41 49 4e 5f 50 52 45 46 49 58 2b  TS5_MAIN_PREFIX+
23410 69 2b 31 2c 20 70 54 6f 6b 65 6e 2c 20 6e 42 79  i+1, pToken, nBy
23420 74 65 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20  te.      );.    
23430 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  }.  }..  return 
23440 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65  rc;.}../*.** Ope
23450 6e 20 61 20 6e 65 77 20 69 74 65 72 61 74 6f 72  n a new iterator
23460 20 74 6f 20 69 74 65 72 61 74 65 20 74 68 6f 75   to iterate thou
23470 67 68 20 61 6c 6c 20 72 6f 77 69 64 20 74 68 61  gh all rowid tha
23480 74 20 6d 61 74 63 68 20 74 68 65 20 0a 2a 2a 20  t match the .** 
23490 73 70 65 63 69 66 69 65 64 20 74 6f 6b 65 6e 20  specified token 
234a0 6f 72 20 74 6f 6b 65 6e 20 70 72 65 66 69 78 2e  or token prefix.
234b0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46  .*/.int sqlite3F
234c0 74 73 35 49 6e 64 65 78 51 75 65 72 79 28 0a 20  ts5IndexQuery(. 
234d0 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 20   Fts5Index *p,  
234e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
234f0 20 2f 2a 20 46 54 53 20 69 6e 64 65 78 20 74 6f   /* FTS index to
23500 20 71 75 65 72 79 20 2a 2f 0a 20 20 63 6f 6e 73   query */.  cons
23510 74 20 63 68 61 72 20 2a 70 54 6f 6b 65 6e 2c 20  t char *pToken, 
23520 69 6e 74 20 6e 54 6f 6b 65 6e 2c 20 2f 2a 20 54  int nToken, /* T
23530 6f 6b 65 6e 20 28 6f 72 20 70 72 65 66 69 78 29  oken (or prefix)
23540 20 74 6f 20 71 75 65 72 79 20 66 6f 72 20 2a 2f   to query for */
23550 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c 20 20 20  .  int flags,   
23560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23570 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 46 54     /* Mask of FT
23580 53 35 49 4e 44 45 58 5f 51 55 45 52 59 5f 58 20  S5INDEX_QUERY_X 
23590 66 6c 61 67 73 20 2a 2f 0a 20 20 46 74 73 35 43  flags */.  Fts5C
235a0 6f 6c 73 65 74 20 2a 70 43 6f 6c 73 65 74 2c 20  olset *pColset, 
235b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61             /* Ma
235c0 74 63 68 20 74 68 65 73 65 20 63 6f 6c 75 6d 6e  tch these column
235d0 73 20 6f 6e 6c 79 20 2a 2f 0a 20 20 46 74 73 35  s only */.  Fts5
235e0 49 6e 64 65 78 49 74 65 72 20 2a 2a 70 70 49 74  IndexIter **ppIt
235f0 65 72 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f  er          /* O
23600 55 54 3a 20 4e 65 77 20 69 74 65 72 61 74 6f 72  UT: New iterator
23610 20 6f 62 6a 65 63 74 20 2a 2f 0a 29 7b 0a 20 20   object */.){.  
23620 46 74 73 35 43 6f 6e 66 69 67 20 2a 70 43 6f 6e  Fts5Config *pCon
23630 66 69 67 20 3d 20 70 2d 3e 70 43 6f 6e 66 69 67  fig = p->pConfig
23640 3b 0a 20 20 46 74 73 35 49 6e 64 65 78 49 74 65  ;.  Fts5IndexIte
23650 72 20 2a 70 52 65 74 20 3d 20 30 3b 0a 20 20 69  r *pRet = 0;.  i
23660 6e 74 20 69 49 64 78 20 3d 20 30 3b 0a 20 20 46  nt iIdx = 0;.  F
23670 74 73 35 42 75 66 66 65 72 20 62 75 66 20 3d 20  ts5Buffer buf = 
23680 7b 30 2c 20 30 2c 20 30 7d 3b 0a 0a 20 20 2f 2a  {0, 0, 0};..  /*
23690 20 49 66 20 74 68 65 20 51 55 45 52 59 5f 53 43   If the QUERY_SC
236a0 41 4e 20 66 6c 61 67 20 69 73 20 73 65 74 2c 20  AN flag is set, 
236b0 61 6c 6c 20 6f 74 68 65 72 20 66 6c 61 67 73 20  all other flags 
236c0 6d 75 73 74 20 62 65 20 63 6c 65 61 72 2e 20 2a  must be clear. *
236d0 2f 0a 20 20 61 73 73 65 72 74 28 20 28 66 6c 61  /.  assert( (fla
236e0 67 73 20 26 20 46 54 53 35 49 4e 44 45 58 5f 51  gs & FTS5INDEX_Q
236f0 55 45 52 59 5f 53 43 41 4e 29 3d 3d 30 20 7c 7c  UERY_SCAN)==0 ||
23700 20 66 6c 61 67 73 3d 3d 46 54 53 35 49 4e 44 45   flags==FTS5INDE
23710 58 5f 51 55 45 52 59 5f 53 43 41 4e 20 29 3b 0a  X_QUERY_SCAN );.
23720 0a 20 20 69 66 28 20 66 74 73 35 42 75 66 66 65  .  if( fts5Buffe
23730 72 47 72 6f 77 28 26 70 2d 3e 72 63 2c 20 26 62  rGrow(&p->rc, &b
23740 75 66 2c 20 6e 54 6f 6b 65 6e 2b 31 29 3d 3d 30  uf, nToken+1)==0
23750 20 29 7b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26   ){.    memcpy(&
23760 62 75 66 2e 70 5b 31 5d 2c 20 70 54 6f 6b 65 6e  buf.p[1], pToken
23770 2c 20 6e 54 6f 6b 65 6e 29 3b 0a 0a 23 69 66 64  , nToken);..#ifd
23780 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
23790 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 51 55      /* If the QU
237a0 45 52 59 5f 54 45 53 54 5f 4e 4f 49 44 58 20 66  ERY_TEST_NOIDX f
237b0 6c 61 67 20 77 61 73 20 73 70 65 63 69 66 69 65  lag was specifie
237c0 64 2c 20 74 68 65 6e 20 74 68 69 73 20 6d 75 73  d, then this mus
237d0 74 20 62 65 20 61 0a 20 20 20 20 2a 2a 20 70 72  t be a.    ** pr
237e0 65 66 69 78 2d 71 75 65 72 79 2e 20 49 6e 73 74  efix-query. Inst
237f0 65 61 64 20 6f 66 20 75 73 69 6e 67 20 61 20 70  ead of using a p
23800 72 65 66 69 78 2d 69 6e 64 65 78 20 28 69 66 20  refix-index (if 
23810 6f 6e 65 20 65 78 69 73 74 73 29 2c 20 0a 20 20  one exists), .  
23820 20 20 2a 2a 20 65 76 61 6c 75 61 74 65 20 74 68    ** evaluate th
23830 65 20 70 72 65 66 69 78 20 71 75 65 72 79 20 75  e prefix query u
23840 73 69 6e 67 20 74 68 65 20 6d 61 69 6e 20 46 54  sing the main FT
23850 53 20 69 6e 64 65 78 2e 20 54 68 69 73 20 69 73  S index. This is
23860 20 75 73 65 64 0a 20 20 20 20 2a 2a 20 66 6f 72   used.    ** for
23870 20 69 6e 74 65 72 6e 61 6c 20 73 61 6e 69 74 79   internal sanity
23880 20 63 68 65 63 6b 69 6e 67 20 62 79 20 74 68 65   checking by the
23890 20 69 6e 74 65 67 72 69 74 79 2d 63 68 65 63 6b   integrity-check
238a0 20 69 6e 20 64 65 62 75 67 20 0a 20 20 20 20 2a   in debug .    *
238b0 2a 20 6d 6f 64 65 20 6f 6e 6c 79 2e 20 20 2a 2f  * mode only.  */
238c0 0a 20 20 20 20 69 66 28 20 70 43 6f 6e 66 69 67  .    if( pConfig
238d0 2d 3e 62 50 72 65 66 69 78 49 6e 64 65 78 3d 3d  ->bPrefixIndex==
238e0 30 20 7c 7c 20 28 66 6c 61 67 73 20 26 20 46 54  0 || (flags & FT
238f0 53 35 49 4e 44 45 58 5f 51 55 45 52 59 5f 54 45  S5INDEX_QUERY_TE
23900 53 54 5f 4e 4f 49 44 58 29 20 29 7b 0a 20 20 20  ST_NOIDX) ){.   
23910 20 20 20 61 73 73 65 72 74 28 20 66 6c 61 67 73     assert( flags
23920 20 26 20 46 54 53 35 49 4e 44 45 58 5f 51 55 45   & FTS5INDEX_QUE
23930 52 59 5f 50 52 45 46 49 58 20 29 3b 0a 20 20 20  RY_PREFIX );.   
23940 20 20 20 69 49 64 78 20 3d 20 31 2b 70 43 6f 6e     iIdx = 1+pCon
23950 66 69 67 2d 3e 6e 50 72 65 66 69 78 3b 0a 20 20  fig->nPrefix;.  
23960 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20    }else.#endif. 
23970 20 20 20 69 66 28 20 66 6c 61 67 73 20 26 20 46     if( flags & F
23980 54 53 35 49 4e 44 45 58 5f 51 55 45 52 59 5f 50  TS5INDEX_QUERY_P
23990 52 45 46 49 58 20 29 7b 0a 20 20 20 20 20 20 69  REFIX ){.      i
239a0 6e 74 20 6e 43 68 61 72 20 3d 20 66 74 73 35 49  nt nChar = fts5I
239b0 6e 64 65 78 43 68 61 72 6c 65 6e 28 70 54 6f 6b  ndexCharlen(pTok
239c0 65 6e 2c 20 6e 54 6f 6b 65 6e 29 3b 0a 20 20 20  en, nToken);.   
239d0 20 20 20 66 6f 72 28 69 49 64 78 3d 31 3b 20 69     for(iIdx=1; i
239e0 49 64 78 3c 3d 70 43 6f 6e 66 69 67 2d 3e 6e 50  Idx<=pConfig->nP
239f0 72 65 66 69 78 3b 20 69 49 64 78 2b 2b 29 7b 0a  refix; iIdx++){.
23a00 20 20 20 20 20 20 20 20 69 66 28 20 70 43 6f 6e          if( pCon
23a10 66 69 67 2d 3e 61 50 72 65 66 69 78 5b 69 49 64  fig->aPrefix[iId
23a20 78 2d 31 5d 3d 3d 6e 43 68 61 72 20 29 20 62 72  x-1]==nChar ) br
23a30 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
23a40 20 7d 0a 0a 20 20 20 20 69 66 28 20 69 49 64 78   }..    if( iIdx
23a50 3c 3d 70 43 6f 6e 66 69 67 2d 3e 6e 50 72 65 66  <=pConfig->nPref
23a60 69 78 20 29 7b 0a 20 20 20 20 20 20 46 74 73 35  ix ){.      Fts5
23a70 53 74 72 75 63 74 75 72 65 20 2a 70 53 74 72 75  Structure *pStru
23a80 63 74 20 3d 20 66 74 73 35 53 74 72 75 63 74 75  ct = fts5Structu
23a90 72 65 52 65 61 64 28 70 29 3b 0a 20 20 20 20 20  reRead(p);.     
23aa0 20 62 75 66 2e 70 5b 30 5d 20 3d 20 46 54 53 35   buf.p[0] = FTS5
23ab0 5f 4d 41 49 4e 5f 50 52 45 46 49 58 20 2b 20 69  _MAIN_PREFIX + i
23ac0 49 64 78 3b 0a 20 20 20 20 20 20 69 66 28 20 70  Idx;.      if( p
23ad0 53 74 72 75 63 74 20 29 7b 0a 20 20 20 20 20 20  Struct ){.      
23ae0 20 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 4e    fts5MultiIterN
23af0 65 77 28 70 2c 20 70 53 74 72 75 63 74 2c 20 31  ew(p, pStruct, 1
23b00 2c 20 66 6c 61 67 73 2c 20 62 75 66 2e 70 2c 20  , flags, buf.p, 
23b10 6e 54 6f 6b 65 6e 2b 31 2c 20 2d 31 2c 20 30 2c  nToken+1, -1, 0,
23b20 20 26 70 52 65 74 29 3b 0a 20 20 20 20 20 20 20   &pRet);.       
23b30 20 66 74 73 35 53 74 72 75 63 74 75 72 65 52 65   fts5StructureRe
23b40 6c 65 61 73 65 28 70 53 74 72 75 63 74 29 3b 0a  lease(pStruct);.
23b50 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
23b60 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 62 44 65  e{.      int bDe
23b70 73 63 20 3d 20 28 66 6c 61 67 73 20 26 20 46 54  sc = (flags & FT
23b80 53 35 49 4e 44 45 58 5f 51 55 45 52 59 5f 44 45  S5INDEX_QUERY_DE
23b90 53 43 29 21 3d 30 3b 0a 20 20 20 20 20 20 62 75  SC)!=0;.      bu
23ba0 66 2e 70 5b 30 5d 20 3d 20 46 54 53 35 5f 4d 41  f.p[0] = FTS5_MA
23bb0 49 4e 5f 50 52 45 46 49 58 3b 0a 20 20 20 20 20  IN_PREFIX;.     
23bc0 20 66 74 73 35 53 65 74 75 70 50 72 65 66 69 78   fts5SetupPrefix
23bd0 49 74 65 72 28 70 2c 20 62 44 65 73 63 2c 20 62  Iter(p, bDesc, b
23be0 75 66 2e 70 2c 20 6e 54 6f 6b 65 6e 2b 31 2c 20  uf.p, nToken+1, 
23bf0 70 43 6f 6c 73 65 74 2c 20 26 70 52 65 74 29 3b  pColset, &pRet);
23c00 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20  .    }..    if( 
23c10 70 2d 3e 72 63 20 29 7b 0a 20 20 20 20 20 20 73  p->rc ){.      s
23c20 71 6c 69 74 65 33 46 74 73 35 49 74 65 72 43 6c  qlite3Fts5IterCl
23c30 6f 73 65 28 70 52 65 74 29 3b 0a 20 20 20 20 20  ose(pRet);.     
23c40 20 70 52 65 74 20 3d 20 30 3b 0a 20 20 20 20 20   pRet = 0;.     
23c50 20 66 74 73 35 43 6c 6f 73 65 52 65 61 64 65 72   fts5CloseReader
23c60 28 70 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2a  (p);.    }.    *
23c70 70 70 49 74 65 72 20 3d 20 70 52 65 74 3b 0a 20  ppIter = pRet;. 
23c80 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 42 75     sqlite3Fts5Bu
23c90 66 66 65 72 46 72 65 65 28 26 62 75 66 29 3b 0a  fferFree(&buf);.
23ca0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 66 74 73    }.  return fts
23cb0 35 49 6e 64 65 78 52 65 74 75 72 6e 28 70 29 3b  5IndexReturn(p);
23cc0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
23cd0 20 74 72 75 65 20 69 66 20 74 68 65 20 69 74 65   true if the ite
23ce0 72 61 74 6f 72 20 70 61 73 73 65 64 20 61 73 20  rator passed as 
23cf0 74 68 65 20 6f 6e 6c 79 20 61 72 67 75 6d 65 6e  the only argumen
23d00 74 20 69 73 20 61 74 20 45 4f 46 2e 0a 2a 2f 0a  t is at EOF..*/.
23d10 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 49  int sqlite3Fts5I
23d20 74 65 72 45 6f 66 28 46 74 73 35 49 6e 64 65 78  terEof(Fts5Index
23d30 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a 20 20  Iter *pIter){.  
23d40 61 73 73 65 72 74 28 20 70 49 74 65 72 2d 3e 70  assert( pIter->p
23d50 49 6e 64 65 78 2d 3e 72 63 3d 3d 53 51 4c 49 54  Index->rc==SQLIT
23d60 45 5f 4f 4b 20 29 3b 0a 20 20 72 65 74 75 72 6e  E_OK );.  return
23d70 20 70 49 74 65 72 2d 3e 62 45 6f 66 3b 0a 7d 0a   pIter->bEof;.}.
23d80 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 6f 20 74  ./*.** Move to t
23d90 68 65 20 6e 65 78 74 20 6d 61 74 63 68 69 6e 67  he next matching
23da0 20 72 6f 77 69 64 2e 20 0a 2a 2f 0a 69 6e 74 20   rowid. .*/.int 
23db0 73 71 6c 69 74 65 33 46 74 73 35 49 74 65 72 4e  sqlite3Fts5IterN
23dc0 65 78 74 28 46 74 73 35 49 6e 64 65 78 49 74 65  ext(Fts5IndexIte
23dd0 72 20 2a 70 49 74 65 72 29 7b 0a 20 20 61 73 73  r *pIter){.  ass
23de0 65 72 74 28 20 70 49 74 65 72 2d 3e 70 49 6e 64  ert( pIter->pInd
23df0 65 78 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  ex->rc==SQLITE_O
23e00 4b 20 29 3b 0a 20 20 66 74 73 35 4d 75 6c 74 69  K );.  fts5Multi
23e10 49 74 65 72 4e 65 78 74 28 70 49 74 65 72 2d 3e  IterNext(pIter->
23e20 70 49 6e 64 65 78 2c 20 70 49 74 65 72 2c 20 30  pIndex, pIter, 0
23e30 2c 20 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 66  , 0);.  return f
23e40 74 73 35 49 6e 64 65 78 52 65 74 75 72 6e 28 70  ts5IndexReturn(p
23e50 49 74 65 72 2d 3e 70 49 6e 64 65 78 29 3b 0a 7d  Iter->pIndex);.}
23e60 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 6f 20  ../*.** Move to 
23e70 74 68 65 20 6e 65 78 74 20 6d 61 74 63 68 69 6e  the next matchin
23e80 67 20 74 65 72 6d 2f 72 6f 77 69 64 2e 20 55 73  g term/rowid. Us
23e90 65 64 20 62 79 20 74 68 65 20 66 74 73 35 76 6f  ed by the fts5vo
23ea0 63 61 62 20 6d 6f 64 75 6c 65 2e 0a 2a 2f 0a 69  cab module..*/.i
23eb0 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 49 74  nt sqlite3Fts5It
23ec0 65 72 4e 65 78 74 53 63 61 6e 28 46 74 73 35 49  erNextScan(Fts5I
23ed0 6e 64 65 78 49 74 65 72 20 2a 70 49 74 65 72 29  ndexIter *pIter)
23ee0 7b 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70  {.  Fts5Index *p
23ef0 20 3d 20 70 49 74 65 72 2d 3e 70 49 6e 64 65 78   = pIter->pIndex
23f00 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 49 74  ;..  assert( pIt
23f10 65 72 2d 3e 70 49 6e 64 65 78 2d 3e 72 63 3d 3d  er->pIndex->rc==
23f20 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 0a 20 20  SQLITE_OK );..  
23f30 66 74 73 35 4d 75 6c 74 69 49 74 65 72 4e 65 78  fts5MultiIterNex
23f40 74 28 70 2c 20 70 49 74 65 72 2c 20 30 2c 20 30  t(p, pIter, 0, 0
23f50 29 3b 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d  );.  if( p->rc==
23f60 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
23f70 20 46 74 73 35 53 65 67 49 74 65 72 20 2a 70 53   Fts5SegIter *pS
23f80 65 67 20 3d 20 26 70 49 74 65 72 2d 3e 61 53 65  eg = &pIter->aSe
23f90 67 5b 20 70 49 74 65 72 2d 3e 61 46 69 72 73 74  g[ pIter->aFirst
23fa0 5b 31 5d 2e 69 46 69 72 73 74 20 5d 3b 0a 20 20  [1].iFirst ];.  
23fb0 20 20 69 66 28 20 70 53 65 67 2d 3e 70 4c 65 61    if( pSeg->pLea
23fc0 66 20 26 26 20 70 53 65 67 2d 3e 74 65 72 6d 2e  f && pSeg->term.
23fd0 70 5b 30 5d 21 3d 46 54 53 35 5f 4d 41 49 4e 5f  p[0]!=FTS5_MAIN_
23fe0 50 52 45 46 49 58 20 29 7b 0a 20 20 20 20 20 20  PREFIX ){.      
23ff0 66 74 73 35 44 61 74 61 52 65 6c 65 61 73 65 28  fts5DataRelease(
24000 70 53 65 67 2d 3e 70 4c 65 61 66 29 3b 0a 20 20  pSeg->pLeaf);.  
24010 20 20 20 20 70 53 65 67 2d 3e 70 4c 65 61 66 20      pSeg->pLeaf 
24020 3d 20 30 3b 0a 20 20 20 20 20 20 70 49 74 65 72  = 0;.      pIter
24030 2d 3e 62 45 6f 66 20 3d 20 31 3b 0a 20 20 20 20  ->bEof = 1;.    
24040 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  }.  }..  return 
24050 66 74 73 35 49 6e 64 65 78 52 65 74 75 72 6e 28  fts5IndexReturn(
24060 70 49 74 65 72 2d 3e 70 49 6e 64 65 78 29 3b 0a  pIter->pIndex);.
24070 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 6f  }../*.** Move to
24080 20 74 68 65 20 6e 65 78 74 20 6d 61 74 63 68 69   the next matchi
24090 6e 67 20 72 6f 77 69 64 20 74 68 61 74 20 6f 63  ng rowid that oc
240a0 63 75 72 73 20 61 74 20 6f 72 20 61 66 74 65 72  curs at or after
240b0 20 69 4d 61 74 63 68 2e 20 54 68 65 0a 2a 2a 20   iMatch. The.** 
240c0 64 65 66 69 6e 69 74 69 6f 6e 20 6f 66 20 22 61  definition of "a
240d0 74 20 6f 72 20 61 66 74 65 72 22 20 64 65 70 65  t or after" depe
240e0 6e 64 73 20 6f 6e 20 77 68 65 74 68 65 72 20 74  nds on whether t
240f0 68 69 73 20 69 74 65 72 61 74 6f 72 20 69 74 65  his iterator ite
24100 72 61 74 65 73 0a 2a 2a 20 69 6e 20 61 73 63 65  rates.** in asce
24110 6e 64 69 6e 67 20 6f 72 20 64 65 73 63 65 6e 64  nding or descend
24120 69 6e 67 20 72 6f 77 69 64 20 6f 72 64 65 72 2e  ing rowid order.
24130 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46  .*/.int sqlite3F
24140 74 73 35 49 74 65 72 4e 65 78 74 46 72 6f 6d 28  ts5IterNextFrom(
24150 46 74 73 35 49 6e 64 65 78 49 74 65 72 20 2a 70  Fts5IndexIter *p
24160 49 74 65 72 2c 20 69 36 34 20 69 4d 61 74 63 68  Iter, i64 iMatch
24170 29 7b 0a 20 20 66 74 73 35 4d 75 6c 74 69 49 74  ){.  fts5MultiIt
24180 65 72 4e 65 78 74 46 72 6f 6d 28 70 49 74 65 72  erNextFrom(pIter
24190 2d 3e 70 49 6e 64 65 78 2c 20 70 49 74 65 72 2c  ->pIndex, pIter,
241a0 20 69 4d 61 74 63 68 29 3b 0a 20 20 72 65 74 75   iMatch);.  retu
241b0 72 6e 20 66 74 73 35 49 6e 64 65 78 52 65 74 75  rn fts5IndexRetu
241c0 72 6e 28 70 49 74 65 72 2d 3e 70 49 6e 64 65 78  rn(pIter->pIndex
241d0 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  );.}../*.** Retu
241e0 72 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 72  rn the current r
241f0 6f 77 69 64 2e 0a 2a 2f 0a 69 36 34 20 73 71 6c  owid..*/.i64 sql
24200 69 74 65 33 46 74 73 35 49 74 65 72 52 6f 77 69  ite3Fts5IterRowi
24210 64 28 46 74 73 35 49 6e 64 65 78 49 74 65 72 20  d(Fts5IndexIter 
24220 2a 70 49 74 65 72 29 7b 0a 20 20 72 65 74 75 72  *pIter){.  retur
24230 6e 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 52  n fts5MultiIterR
24240 6f 77 69 64 28 70 49 74 65 72 29 3b 0a 7d 0a 0a  owid(pIter);.}..
24250 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
24260 20 63 75 72 72 65 6e 74 20 74 65 72 6d 2e 0a 2a   current term..*
24270 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 71  /.const char *sq
24280 6c 69 74 65 33 46 74 73 35 49 74 65 72 54 65 72  lite3Fts5IterTer
24290 6d 28 46 74 73 35 49 6e 64 65 78 49 74 65 72 20  m(Fts5IndexIter 
242a0 2a 70 49 74 65 72 2c 20 69 6e 74 20 2a 70 6e 29  *pIter, int *pn)
242b0 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 63 6f 6e  {.  int n;.  con
242c0 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 28 63 6f  st char *z = (co
242d0 6e 73 74 20 63 68 61 72 2a 29 66 74 73 35 4d 75  nst char*)fts5Mu
242e0 6c 74 69 49 74 65 72 54 65 72 6d 28 70 49 74 65  ltiIterTerm(pIte
242f0 72 2c 20 26 6e 29 3b 0a 20 20 2a 70 6e 20 3d 20  r, &n);.  *pn = 
24300 6e 2d 31 3b 0a 20 20 72 65 74 75 72 6e 20 26 7a  n-1;.  return &z
24310 5b 31 5d 3b 0a 7d 0a 0a 0a 73 74 61 74 69 63 20  [1];.}...static 
24320 69 6e 74 20 66 74 73 35 49 6e 64 65 78 45 78 74  int fts5IndexExt
24330 72 61 63 74 43 6f 6c 73 65 74 20 28 0a 20 20 46  ractColset (.  F
24340 74 73 35 43 6f 6c 73 65 74 20 2a 70 43 6f 6c 73  ts5Colset *pCols
24350 65 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  et,            /
24360 2a 20 43 6f 6c 73 65 74 20 74 6f 20 66 69 6c 74  * Colset to filt
24370 65 72 20 6f 6e 20 2a 2f 0a 20 20 63 6f 6e 73 74  er on */.  const
24380 20 75 38 20 2a 70 50 6f 73 2c 20 69 6e 74 20 6e   u8 *pPos, int n
24390 50 6f 73 2c 20 20 20 20 20 20 20 2f 2a 20 50 6f  Pos,       /* Po
243a0 73 69 74 69 6f 6e 20 6c 69 73 74 20 2a 2f 0a 20  sition list */. 
243b0 20 46 74 73 35 42 75 66 66 65 72 20 2a 70 42 75   Fts5Buffer *pBu
243c0 66 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  f               
243d0 20 2f 2a 20 4f 75 74 70 75 74 20 62 75 66 66 65   /* Output buffe
243e0 72 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63  r */.){.  int rc
243f0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
24400 69 6e 74 20 69 3b 0a 0a 20 20 66 74 73 35 42 75  int i;..  fts5Bu
24410 66 66 65 72 5a 65 72 6f 28 70 42 75 66 29 3b 0a  fferZero(pBuf);.
24420 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 43 6f    for(i=0; i<pCo
24430 6c 73 65 74 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29  lset->nCol; i++)
24440 7b 0a 20 20 20 20 63 6f 6e 73 74 20 75 38 20 2a  {.    const u8 *
24450 70 53 75 62 20 3d 20 70 50 6f 73 3b 0a 20 20 20  pSub = pPos;.   
24460 20 69 6e 74 20 6e 53 75 62 20 3d 20 66 74 73 35   int nSub = fts5
24470 49 6e 64 65 78 45 78 74 72 61 63 74 43 6f 6c 28  IndexExtractCol(
24480 26 70 53 75 62 2c 20 6e 50 6f 73 2c 20 70 43 6f  &pSub, nPos, pCo
24490 6c 73 65 74 2d 3e 61 69 43 6f 6c 5b 69 5d 29 3b  lset->aiCol[i]);
244a0 0a 20 20 20 20 69 66 28 20 6e 53 75 62 20 29 7b  .    if( nSub ){
244b0 0a 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65  .      fts5Buffe
244c0 72 41 70 70 65 6e 64 42 6c 6f 62 28 26 72 63 2c  rAppendBlob(&rc,
244d0 20 70 42 75 66 2c 20 6e 53 75 62 2c 20 70 53 75   pBuf, nSub, pSu
244e0 62 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  b);.    }.  }.  
244f0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f  return rc;.}.../
24500 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f  *.** Return a po
24510 69 6e 74 65 72 20 74 6f 20 61 20 62 75 66 66 65  inter to a buffe
24520 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 61 20 63  r containing a c
24530 6f 70 79 20 6f 66 20 74 68 65 20 70 6f 73 69 74  opy of the posit
24540 69 6f 6e 20 6c 69 73 74 20 66 6f 72 0a 2a 2a 20  ion list for.** 
24550 74 68 65 20 63 75 72 72 65 6e 74 20 65 6e 74 72  the current entr
24560 79 2e 20 4f 75 74 70 75 74 20 76 61 72 69 61 62  y. Output variab
24570 6c 65 20 2a 70 6e 20 69 73 20 73 65 74 20 74 6f  le *pn is set to
24580 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
24590 20 62 75 66 66 65 72 20 0a 2a 2a 20 69 6e 20 62   buffer .** in b
245a0 79 74 65 73 20 62 65 66 6f 72 65 20 72 65 74 75  ytes before retu
245b0 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  rning..**.** The
245c0 20 72 65 74 75 72 6e 65 64 20 70 6f 73 69 74 69   returned positi
245d0 6f 6e 20 6c 69 73 74 20 64 6f 65 73 20 6e 6f 74  on list does not
245e0 20 69 6e 63 6c 75 64 65 20 74 68 65 20 22 6e 75   include the "nu
245f0 6d 62 65 72 20 6f 66 20 62 79 74 65 73 22 20 76  mber of bytes" v
24600 61 72 69 6e 74 0a 2a 2a 20 66 69 65 6c 64 20 74  arint.** field t
24610 68 61 74 20 73 74 61 72 74 73 20 74 68 65 20 70  hat starts the p
24620 6f 73 69 74 69 6f 6e 20 6c 69 73 74 20 6f 6e 20  osition list on 
24630 64 69 73 6b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  disk..*/.int sql
24640 69 74 65 33 46 74 73 35 49 74 65 72 50 6f 73 6c  ite3Fts5IterPosl
24650 69 73 74 28 0a 20 20 46 74 73 35 49 6e 64 65 78  ist(.  Fts5Index
24660 49 74 65 72 20 2a 70 49 74 65 72 2c 20 0a 20 20  Iter *pIter, .  
24670 46 74 73 35 43 6f 6c 73 65 74 20 2a 70 43 6f 6c  Fts5Colset *pCol
24680 73 65 74 2c 20 20 20 20 20 20 20 20 20 20 20 20  set,            
24690 2f 2a 20 43 6f 6c 75 6d 6e 20 66 69 6c 74 65 72  /* Column filter
246a0 20 28 6f 72 20 4e 55 4c 4c 29 20 2a 2f 0a 20 20   (or NULL) */.  
246b0 63 6f 6e 73 74 20 75 38 20 2a 2a 70 70 2c 20 20  const u8 **pp,  
246c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
246d0 2f 2a 20 4f 55 54 3a 20 50 6f 69 6e 74 65 72 20  /* OUT: Pointer 
246e0 74 6f 20 70 6f 73 69 74 69 6f 6e 2d 6c 69 73 74  to position-list
246f0 20 64 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20 2a   data */.  int *
24700 70 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  pn,             
24710 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55             /* OU
24720 54 3a 20 53 69 7a 65 20 6f 66 20 70 6f 73 69 74  T: Size of posit
24730 69 6f 6e 2d 6c 69 73 74 20 69 6e 20 62 79 74 65  ion-list in byte
24740 73 20 2a 2f 0a 20 20 69 36 34 20 2a 70 69 52 6f  s */.  i64 *piRo
24750 77 69 64 20 20 20 20 20 20 20 20 20 20 20 20 20  wid             
24760 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 43         /* OUT: C
24770 75 72 72 65 6e 74 20 72 6f 77 69 64 20 2a 2f 0a  urrent rowid */.
24780 29 7b 0a 20 20 46 74 73 35 53 65 67 49 74 65 72  ){.  Fts5SegIter
24790 20 2a 70 53 65 67 20 3d 20 26 70 49 74 65 72 2d   *pSeg = &pIter-
247a0 3e 61 53 65 67 5b 20 70 49 74 65 72 2d 3e 61 46  >aSeg[ pIter->aF
247b0 69 72 73 74 5b 31 5d 2e 69 46 69 72 73 74 20 5d  irst[1].iFirst ]
247c0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 49 74 65  ;.  assert( pIte
247d0 72 2d 3e 70 49 6e 64 65 78 2d 3e 72 63 3d 3d 53  r->pIndex->rc==S
247e0 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 2a 70  QLITE_OK );.  *p
247f0 69 52 6f 77 69 64 20 3d 20 70 53 65 67 2d 3e 69  iRowid = pSeg->i
24800 52 6f 77 69 64 3b 0a 20 20 69 66 28 20 70 53 65  Rowid;.  if( pSe
24810 67 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 2b 70  g->iLeafOffset+p
24820 53 65 67 2d 3e 6e 50 6f 73 3c 3d 70 53 65 67 2d  Seg->nPos<=pSeg-
24830 3e 70 4c 65 61 66 2d 3e 73 7a 4c 65 61 66 20 29  >pLeaf->szLeaf )
24840 7b 0a 20 20 20 20 75 38 20 2a 70 50 6f 73 20 3d  {.    u8 *pPos =
24850 20 26 70 53 65 67 2d 3e 70 4c 65 61 66 2d 3e 70   &pSeg->pLeaf->p
24860 5b 70 53 65 67 2d 3e 69 4c 65 61 66 4f 66 66 73  [pSeg->iLeafOffs
24870 65 74 5d 3b 0a 20 20 20 20 69 66 28 20 70 43 6f  et];.    if( pCo
24880 6c 73 65 74 3d 3d 30 20 7c 7c 20 70 49 74 65 72  lset==0 || pIter
24890 2d 3e 62 46 69 6c 74 65 72 65 64 20 29 7b 0a 20  ->bFiltered ){. 
248a0 20 20 20 20 20 2a 70 6e 20 3d 20 70 53 65 67 2d       *pn = pSeg-
248b0 3e 6e 50 6f 73 3b 0a 20 20 20 20 20 20 2a 70 70  >nPos;.      *pp
248c0 20 3d 20 70 50 6f 73 3b 0a 20 20 20 20 7d 65 6c   = pPos;.    }el
248d0 73 65 20 69 66 28 20 70 43 6f 6c 73 65 74 2d 3e  se if( pColset->
248e0 6e 43 6f 6c 3d 3d 31 20 29 7b 0a 20 20 20 20 20  nCol==1 ){.     
248f0 20 2a 70 70 20 3d 20 70 50 6f 73 3b 0a 20 20 20   *pp = pPos;.   
24900 20 20 20 2a 70 6e 20 3d 20 66 74 73 35 49 6e 64     *pn = fts5Ind
24910 65 78 45 78 74 72 61 63 74 43 6f 6c 28 70 70 2c  exExtractCol(pp,
24920 20 70 53 65 67 2d 3e 6e 50 6f 73 2c 20 70 43 6f   pSeg->nPos, pCo
24930 6c 73 65 74 2d 3e 61 69 43 6f 6c 5b 30 5d 29 3b  lset->aiCol[0]);
24940 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
24950 20 20 66 74 73 35 42 75 66 66 65 72 5a 65 72 6f    fts5BufferZero
24960 28 26 70 49 74 65 72 2d 3e 70 6f 73 6c 69 73 74  (&pIter->poslist
24970 29 3b 0a 20 20 20 20 20 20 66 74 73 35 49 6e 64  );.      fts5Ind
24980 65 78 45 78 74 72 61 63 74 43 6f 6c 73 65 74 28  exExtractColset(
24990 70 43 6f 6c 73 65 74 2c 20 70 50 6f 73 2c 20 70  pColset, pPos, p
249a0 53 65 67 2d 3e 6e 50 6f 73 2c 20 26 70 49 74 65  Seg->nPos, &pIte
249b0 72 2d 3e 70 6f 73 6c 69 73 74 29 3b 0a 20 20 20  r->poslist);.   
249c0 20 20 20 2a 70 70 20 3d 20 70 49 74 65 72 2d 3e     *pp = pIter->
249d0 70 6f 73 6c 69 73 74 2e 70 3b 0a 20 20 20 20 20  poslist.p;.     
249e0 20 2a 70 6e 20 3d 20 70 49 74 65 72 2d 3e 70 6f   *pn = pIter->po
249f0 73 6c 69 73 74 2e 6e 3b 0a 20 20 20 20 7d 0a 20  slist.n;.    }. 
24a00 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66 74 73 35   }else{.    fts5
24a10 42 75 66 66 65 72 5a 65 72 6f 28 26 70 49 74 65  BufferZero(&pIte
24a20 72 2d 3e 70 6f 73 6c 69 73 74 29 3b 0a 20 20 20  r->poslist);.   
24a30 20 66 74 73 35 53 65 67 69 74 65 72 50 6f 73 6c   fts5SegiterPosl
24a40 69 73 74 28 70 49 74 65 72 2d 3e 70 49 6e 64 65  ist(pIter->pInde
24a50 78 2c 20 70 53 65 67 2c 20 70 43 6f 6c 73 65 74  x, pSeg, pColset
24a60 2c 20 26 70 49 74 65 72 2d 3e 70 6f 73 6c 69 73  , &pIter->poslis
24a70 74 29 3b 0a 20 20 20 20 2a 70 70 20 3d 20 70 49  t);.    *pp = pI
24a80 74 65 72 2d 3e 70 6f 73 6c 69 73 74 2e 70 3b 0a  ter->poslist.p;.
24a90 20 20 20 20 2a 70 6e 20 3d 20 70 49 74 65 72 2d      *pn = pIter-
24aa0 3e 70 6f 73 6c 69 73 74 2e 6e 3b 0a 20 20 7d 0a  >poslist.n;.  }.
24ab0 20 20 72 65 74 75 72 6e 20 66 74 73 35 49 6e 64    return fts5Ind
24ac0 65 78 52 65 74 75 72 6e 28 70 49 74 65 72 2d 3e  exReturn(pIter->
24ad0 70 49 6e 64 65 78 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  pIndex);.}../*.*
24ae0 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
24af0 69 73 20 73 69 6d 69 6c 61 72 20 74 6f 20 73 71  is similar to sq
24b00 6c 69 74 65 33 46 74 73 35 49 74 65 72 50 6f 73  lite3Fts5IterPos
24b10 6c 69 73 74 28 29 2c 20 65 78 63 65 70 74 20 74  list(), except t
24b20 68 61 74 20 69 74 0a 2a 2a 20 63 6f 70 69 65 73  hat it.** copies
24b30 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 20 6c 69   the position li
24b40 73 74 20 69 6e 74 6f 20 74 68 65 20 62 75 66 66  st into the buff
24b50 65 72 20 73 75 70 70 6c 69 65 64 20 61 73 20 74  er supplied as t
24b60 68 65 20 73 65 63 6f 6e 64 20 0a 2a 2a 20 61 72  he second .** ar
24b70 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73  gument..*/.int s
24b80 71 6c 69 74 65 33 46 74 73 35 49 74 65 72 50 6f  qlite3Fts5IterPo
24b90 73 6c 69 73 74 42 75 66 66 65 72 28 46 74 73 35  slistBuffer(Fts5
24ba0 49 6e 64 65 78 49 74 65 72 20 2a 70 49 74 65 72  IndexIter *pIter
24bb0 2c 20 46 74 73 35 42 75 66 66 65 72 20 2a 70 42  , Fts5Buffer *pB
24bc0 75 66 29 7b 0a 20 20 46 74 73 35 49 6e 64 65 78  uf){.  Fts5Index
24bd0 20 2a 70 20 3d 20 70 49 74 65 72 2d 3e 70 49 6e   *p = pIter->pIn
24be0 64 65 78 3b 0a 20 20 46 74 73 35 53 65 67 49 74  dex;.  Fts5SegIt
24bf0 65 72 20 2a 70 53 65 67 20 3d 20 26 70 49 74 65  er *pSeg = &pIte
24c00 72 2d 3e 61 53 65 67 5b 20 70 49 74 65 72 2d 3e  r->aSeg[ pIter->
24c10 61 46 69 72 73 74 5b 31 5d 2e 69 46 69 72 73 74  aFirst[1].iFirst
24c20 20 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d   ];.  assert( p-
24c30 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  >rc==SQLITE_OK )
24c40 3b 0a 20 20 66 74 73 35 42 75 66 66 65 72 5a 65  ;.  fts5BufferZe
24c50 72 6f 28 70 42 75 66 29 3b 0a 20 20 66 74 73 35  ro(pBuf);.  fts5
24c60 53 65 67 69 74 65 72 50 6f 73 6c 69 73 74 28 70  SegiterPoslist(p
24c70 2c 20 70 53 65 67 2c 20 30 2c 20 70 42 75 66 29  , pSeg, 0, pBuf)
24c80 3b 0a 20 20 72 65 74 75 72 6e 20 66 74 73 35 49  ;.  return fts5I
24c90 6e 64 65 78 52 65 74 75 72 6e 28 70 29 3b 0a 7d  ndexReturn(p);.}
24ca0 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 6e  ../*.** Close an
24cb0 20 69 74 65 72 61 74 6f 72 20 6f 70 65 6e 65 64   iterator opened
24cc0 20 62 79 20 61 6e 20 65 61 72 6c 69 65 72 20 63   by an earlier c
24cd0 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 46 74  all to sqlite3Ft
24ce0 73 35 49 6e 64 65 78 51 75 65 72 79 28 29 2e 0a  s5IndexQuery()..
24cf0 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 46  */.void sqlite3F
24d00 74 73 35 49 74 65 72 43 6c 6f 73 65 28 46 74 73  ts5IterClose(Fts
24d10 35 49 6e 64 65 78 49 74 65 72 20 2a 70 49 74 65  5IndexIter *pIte
24d20 72 29 7b 0a 20 20 69 66 28 20 70 49 74 65 72 20  r){.  if( pIter 
24d30 29 7b 0a 20 20 20 20 46 74 73 35 49 6e 64 65 78  ){.    Fts5Index
24d40 20 2a 70 49 6e 64 65 78 20 3d 20 70 49 74 65 72   *pIndex = pIter
24d50 2d 3e 70 49 6e 64 65 78 3b 0a 20 20 20 20 66 74  ->pIndex;.    ft
24d60 73 35 4d 75 6c 74 69 49 74 65 72 46 72 65 65 28  s5MultiIterFree(
24d70 70 49 74 65 72 2d 3e 70 49 6e 64 65 78 2c 20 70  pIter->pIndex, p
24d80 49 74 65 72 29 3b 0a 20 20 20 20 66 74 73 35 43  Iter);.    fts5C
24d90 6c 6f 73 65 52 65 61 64 65 72 28 70 49 6e 64 65  loseReader(pInde
24da0 78 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  x);.  }.}../*.**
24db0 20 52 65 61 64 20 61 6e 64 20 64 65 63 6f 64 65   Read and decode
24dc0 20 74 68 65 20 22 61 76 65 72 61 67 65 73 22 20   the "averages" 
24dd0 72 65 63 6f 72 64 20 66 72 6f 6d 20 74 68 65 20  record from the 
24de0 64 61 74 61 62 61 73 65 2e 20 0a 2a 2a 0a 2a 2a  database. .**.**
24df0 20 50 61 72 61 6d 65 74 65 72 20 61 6e 53 69 7a   Parameter anSiz
24e00 65 20 6d 75 73 74 20 70 6f 69 6e 74 20 74 6f 20  e must point to 
24e10 61 6e 20 61 72 72 61 79 20 6f 66 20 73 69 7a 65  an array of size
24e20 20 6e 43 6f 6c 2c 20 77 68 65 72 65 20 6e 43 6f   nCol, where nCo
24e30 6c 20 69 73 0a 2a 2a 20 74 68 65 20 6e 75 6d 62  l is.** the numb
24e40 65 72 20 6f 66 20 75 73 65 72 20 64 65 66 69 6e  er of user defin
24e50 65 64 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68  ed columns in th
24e60 65 20 46 54 53 20 74 61 62 6c 65 2e 0a 2a 2f 0a  e FTS table..*/.
24e70 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 49  int sqlite3Fts5I
24e80 6e 64 65 78 47 65 74 41 76 65 72 61 67 65 73 28  ndexGetAverages(
24e90 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 69 36  Fts5Index *p, i6
24ea0 34 20 2a 70 6e 52 6f 77 2c 20 69 36 34 20 2a 61  4 *pnRow, i64 *a
24eb0 6e 53 69 7a 65 29 7b 0a 20 20 69 6e 74 20 6e 43  nSize){.  int nC
24ec0 6f 6c 20 3d 20 70 2d 3e 70 43 6f 6e 66 69 67 2d  ol = p->pConfig-
24ed0 3e 6e 43 6f 6c 3b 0a 20 20 46 74 73 35 44 61 74  >nCol;.  Fts5Dat
24ee0 61 20 2a 70 44 61 74 61 3b 0a 0a 20 20 2a 70 6e  a *pData;..  *pn
24ef0 52 6f 77 20 3d 20 30 3b 0a 20 20 6d 65 6d 73 65  Row = 0;.  memse
24f00 74 28 61 6e 53 69 7a 65 2c 20 30 2c 20 73 69 7a  t(anSize, 0, siz
24f10 65 6f 66 28 69 36 34 29 20 2a 20 6e 43 6f 6c 29  eof(i64) * nCol)
24f20 3b 0a 20 20 70 44 61 74 61 20 3d 20 66 74 73 35  ;.  pData = fts5
24f30 44 61 74 61 52 65 61 64 28 70 2c 20 46 54 53 35  DataRead(p, FTS5
24f40 5f 41 56 45 52 41 47 45 53 5f 52 4f 57 49 44 29  _AVERAGES_ROWID)
24f50 3b 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53  ;.  if( p->rc==S
24f60 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 44 61 74  QLITE_OK && pDat
24f70 61 2d 3e 6e 6e 20 29 7b 0a 20 20 20 20 69 6e 74  a->nn ){.    int
24f80 20 69 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20   i = 0;.    int 
24f90 69 43 6f 6c 3b 0a 20 20 20 20 69 20 2b 3d 20 66  iCol;.    i += f
24fa0 74 73 35 47 65 74 56 61 72 69 6e 74 28 26 70 44  ts5GetVarint(&pD
24fb0 61 74 61 2d 3e 70 5b 69 5d 2c 20 28 75 36 34 2a  ata->p[i], (u64*
24fc0 29 70 6e 52 6f 77 29 3b 0a 20 20 20 20 66 6f 72  )pnRow);.    for
24fd0 28 69 43 6f 6c 3d 30 3b 20 69 3c 70 44 61 74 61  (iCol=0; i<pData
24fe0 2d 3e 6e 6e 20 26 26 20 69 43 6f 6c 3c 6e 43 6f  ->nn && iCol<nCo
24ff0 6c 3b 20 69 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20  l; iCol++){.    
25000 20 20 69 20 2b 3d 20 66 74 73 35 47 65 74 56 61    i += fts5GetVa
25010 72 69 6e 74 28 26 70 44 61 74 61 2d 3e 70 5b 69  rint(&pData->p[i
25020 5d 2c 20 28 75 36 34 2a 29 26 61 6e 53 69 7a 65  ], (u64*)&anSize
25030 5b 69 43 6f 6c 5d 29 3b 0a 20 20 20 20 7d 0a 20  [iCol]);.    }. 
25040 20 7d 0a 0a 20 20 66 74 73 35 44 61 74 61 52 65   }..  fts5DataRe
25050 6c 65 61 73 65 28 70 44 61 74 61 29 3b 0a 20 20  lease(pData);.  
25060 72 65 74 75 72 6e 20 66 74 73 35 49 6e 64 65 78  return fts5Index
25070 52 65 74 75 72 6e 28 70 29 3b 0a 7d 0a 0a 2f 2a  Return(p);.}../*
25080 0a 2a 2a 20 52 65 70 6c 61 63 65 20 74 68 65 20  .** Replace the 
25090 63 75 72 72 65 6e 74 20 22 61 76 65 72 61 67 65  current "average
250a0 73 22 20 72 65 63 6f 72 64 20 77 69 74 68 20 74  s" record with t
250b0 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  he contents of t
250c0 68 65 20 62 75 66 66 65 72 20 0a 2a 2a 20 73 75  he buffer .** su
250d0 70 70 6c 69 65 64 20 61 73 20 74 68 65 20 73 65  pplied as the se
250e0 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2e 0a 2a  cond argument..*
250f0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73  /.int sqlite3Fts
25100 35 49 6e 64 65 78 53 65 74 41 76 65 72 61 67 65  5IndexSetAverage
25110 73 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20  s(Fts5Index *p, 
25120 63 6f 6e 73 74 20 75 38 20 2a 70 44 61 74 61 2c  const u8 *pData,
25130 20 69 6e 74 20 6e 44 61 74 61 29 7b 0a 20 20 61   int nData){.  a
25140 73 73 65 72 74 28 20 70 2d 3e 72 63 3d 3d 53 51  ssert( p->rc==SQ
25150 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 66 74 73  LITE_OK );.  fts
25160 35 44 61 74 61 57 72 69 74 65 28 70 2c 20 46 54  5DataWrite(p, FT
25170 53 35 5f 41 56 45 52 41 47 45 53 5f 52 4f 57 49  S5_AVERAGES_ROWI
25180 44 2c 20 70 44 61 74 61 2c 20 6e 44 61 74 61 29  D, pData, nData)
25190 3b 0a 20 20 72 65 74 75 72 6e 20 66 74 73 35 49  ;.  return fts5I
251a0 6e 64 65 78 52 65 74 75 72 6e 28 70 29 3b 0a 7d  ndexReturn(p);.}
251b0 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
251c0 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20  he total number 
251d0 6f 66 20 62 6c 6f 63 6b 73 20 74 68 69 73 20 6d  of blocks this m
251e0 6f 64 75 6c 65 20 68 61 73 20 72 65 61 64 20 66  odule has read f
251f0 72 6f 6d 20 74 68 65 20 25 5f 64 61 74 61 0a 2a  rom the %_data.*
25200 2a 20 74 61 62 6c 65 20 73 69 6e 63 65 20 69 74  * table since it
25210 20 77 61 73 20 63 72 65 61 74 65 64 2e 0a 2a 2f   was created..*/
25220 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35  .int sqlite3Fts5
25230 49 6e 64 65 78 52 65 61 64 73 28 46 74 73 35 49  IndexReads(Fts5I
25240 6e 64 65 78 20 2a 70 29 7b 0a 20 20 72 65 74 75  ndex *p){.  retu
25250 72 6e 20 70 2d 3e 6e 52 65 61 64 3b 0a 7d 0a 0a  rn p->nRead;.}..
25260 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 33 32  /*.** Set the 32
25270 2d 62 69 74 20 63 6f 6f 6b 69 65 20 76 61 6c 75  -bit cookie valu
25280 65 20 73 74 6f 72 65 64 20 61 74 20 74 68 65 20  e stored at the 
25290 73 74 61 72 74 20 6f 66 20 61 6c 6c 20 73 74 72  start of all str
252a0 75 63 74 75 72 65 20 0a 2a 2a 20 72 65 63 6f 72  ucture .** recor
252b0 64 73 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20  ds to the value 
252c0 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65  passed as the se
252d0 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2e 0a 2a  cond argument..*
252e0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49  *.** Return SQLI
252f0 54 45 5f 4f 4b 20 69 66 20 73 75 63 63 65 73 73  TE_OK if success
25300 66 75 6c 2c 20 6f 72 20 61 6e 20 53 51 4c 69 74  ful, or an SQLit
25310 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20  e error code if 
25320 61 6e 20 65 72 72 6f 72 0a 2a 2a 20 6f 63 63 75  an error.** occu
25330 72 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  rs..*/.int sqlit
25340 65 33 46 74 73 35 49 6e 64 65 78 53 65 74 43 6f  e3Fts5IndexSetCo
25350 6f 6b 69 65 28 46 74 73 35 49 6e 64 65 78 20 2a  okie(Fts5Index *
25360 70 2c 20 69 6e 74 20 69 4e 65 77 29 7b 0a 20 20  p, int iNew){.  
25370 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
25380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25390 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
253a0 6f 64 65 20 2a 2f 0a 20 20 46 74 73 35 43 6f 6e  ode */.  Fts5Con
253b0 66 69 67 20 2a 70 43 6f 6e 66 69 67 20 3d 20 70  fig *pConfig = p
253c0 2d 3e 70 43 6f 6e 66 69 67 3b 20 20 20 20 2f 2a  ->pConfig;    /*
253d0 20 43 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 6f   Configuration o
253e0 62 6a 65 63 74 20 2a 2f 0a 20 20 75 38 20 61 43  bject */.  u8 aC
253f0 6f 6f 6b 69 65 5b 34 5d 3b 20 20 20 20 20 20 20  ookie[4];       
25400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25410 2f 2a 20 42 69 6e 61 72 79 20 72 65 70 72 65 73  /* Binary repres
25420 65 6e 74 61 74 69 6f 6e 20 6f 66 20 69 4e 65 77  entation of iNew
25430 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 62 6c   */.  sqlite3_bl
25440 6f 62 20 2a 70 42 6c 6f 62 20 3d 20 30 3b 0a 0a  ob *pBlob = 0;..
25450 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72 63 3d    assert( p->rc=
25460 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20  =SQLITE_OK );.  
25470 73 71 6c 69 74 65 33 46 74 73 35 50 75 74 33 32  sqlite3Fts5Put32
25480 28 61 43 6f 6f 6b 69 65 2c 20 69 4e 65 77 29 3b  (aCookie, iNew);
25490 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ..  rc = sqlite3
254a0 5f 62 6c 6f 62 5f 6f 70 65 6e 28 70 43 6f 6e 66  _blob_open(pConf
254b0 69 67 2d 3e 64 62 2c 20 70 43 6f 6e 66 69 67 2d  ig->db, pConfig-
254c0 3e 7a 44 62 2c 20 70 2d 3e 7a 44 61 74 61 54 62  >zDb, p->zDataTb
254d0 6c 2c 20 0a 20 20 20 20 20 20 22 62 6c 6f 63 6b  l, .      "block
254e0 22 2c 20 46 54 53 35 5f 53 54 52 55 43 54 55 52  ", FTS5_STRUCTUR
254f0 45 5f 52 4f 57 49 44 2c 20 31 2c 20 26 70 42 6c  E_ROWID, 1, &pBl
25500 6f 62 0a 20 20 29 3b 0a 20 20 69 66 28 20 72 63  ob.  );.  if( rc
25510 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
25520 20 20 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f     sqlite3_blob_
25530 77 72 69 74 65 28 70 42 6c 6f 62 2c 20 61 43 6f  write(pBlob, aCo
25540 6f 6b 69 65 2c 20 34 2c 20 30 29 3b 0a 20 20 20  okie, 4, 0);.   
25550 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 62 6c   rc = sqlite3_bl
25560 6f 62 5f 63 6c 6f 73 65 28 70 42 6c 6f 62 29 3b  ob_close(pBlob);
25570 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72  .  }..  return r
25580 63 3b 0a 7d 0a 0a 69 6e 74 20 73 71 6c 69 74 65  c;.}..int sqlite
25590 33 46 74 73 35 49 6e 64 65 78 4c 6f 61 64 43 6f  3Fts5IndexLoadCo
255a0 6e 66 69 67 28 46 74 73 35 49 6e 64 65 78 20 2a  nfig(Fts5Index *
255b0 70 29 7b 0a 20 20 46 74 73 35 53 74 72 75 63 74  p){.  Fts5Struct
255c0 75 72 65 20 2a 70 53 74 72 75 63 74 3b 0a 20 20  ure *pStruct;.  
255d0 70 53 74 72 75 63 74 20 3d 20 66 74 73 35 53 74  pStruct = fts5St
255e0 72 75 63 74 75 72 65 52 65 61 64 28 70 29 3b 0a  ructureRead(p);.
255f0 20 20 66 74 73 35 53 74 72 75 63 74 75 72 65 52    fts5StructureR
25600 65 6c 65 61 73 65 28 70 53 74 72 75 63 74 29 3b  elease(pStruct);
25610 0a 20 20 72 65 74 75 72 6e 20 66 74 73 35 49 6e  .  return fts5In
25620 64 65 78 52 65 74 75 72 6e 28 70 29 3b 0a 7d 0a  dexReturn(p);.}.
25630 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ../*************
25640 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
25650 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
25660 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
25670 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a  ************.***
25680 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
25690 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
256a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
256b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
256c0 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 42 65 6c 6f 77  *******.** Below
256d0 20 74 68 69 73 20 70 6f 69 6e 74 20 69 73 20 74   this point is t
256e0 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  he implementatio
256f0 6e 20 6f 66 20 74 68 65 20 69 6e 74 65 67 72 69  n of the integri
25700 74 79 2d 63 68 65 63 6b 20 0a 2a 2a 20 66 75 6e  ty-check .** fun
25710 63 74 69 6f 6e 61 6c 69 74 79 2e 0a 2a 2f 0a 0a  ctionality..*/..
25720 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 73  /*.** Return a s
25730 69 6d 70 6c 65 20 63 68 65 63 6b 73 75 6d 20 76  imple checksum v
25740 61 6c 75 65 20 62 61 73 65 64 20 6f 6e 20 74 68  alue based on th
25750 65 20 61 72 67 75 6d 65 6e 74 73 2e 0a 2a 2f 0a  e arguments..*/.
25760 73 74 61 74 69 63 20 75 36 34 20 66 74 73 35 49  static u64 fts5I
25770 6e 64 65 78 45 6e 74 72 79 43 6b 73 75 6d 28 0a  ndexEntryCksum(.
25780 20 20 69 36 34 20 69 52 6f 77 69 64 2c 20 0a 20    i64 iRowid, . 
25790 20 69 6e 74 20 69 43 6f 6c 2c 20 0a 20 20 69 6e   int iCol, .  in
257a0 74 20 69 50 6f 73 2c 20 0a 20 20 69 6e 74 20 69  t iPos, .  int i
257b0 49 64 78 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61  Idx,.  const cha
257c0 72 20 2a 70 54 65 72 6d 2c 0a 20 20 69 6e 74 20  r *pTerm,.  int 
257d0 6e 54 65 72 6d 0a 29 7b 0a 20 20 69 6e 74 20 69  nTerm.){.  int i
257e0 3b 0a 20 20 75 36 34 20 72 65 74 20 3d 20 69 52  ;.  u64 ret = iR
257f0 6f 77 69 64 3b 0a 20 20 72 65 74 20 2b 3d 20 28  owid;.  ret += (
25800 72 65 74 3c 3c 33 29 20 2b 20 69 43 6f 6c 3b 0a  ret<<3) + iCol;.
25810 20 20 72 65 74 20 2b 3d 20 28 72 65 74 3c 3c 33    ret += (ret<<3
25820 29 20 2b 20 69 50 6f 73 3b 0a 20 20 69 66 28 20  ) + iPos;.  if( 
25830 69 49 64 78 3e 3d 30 20 29 20 72 65 74 20 2b 3d  iIdx>=0 ) ret +=
25840 20 28 72 65 74 3c 3c 33 29 20 2b 20 28 46 54 53   (ret<<3) + (FTS
25850 35 5f 4d 41 49 4e 5f 50 52 45 46 49 58 20 2b 20  5_MAIN_PREFIX + 
25860 69 49 64 78 29 3b 0a 20 20 66 6f 72 28 69 3d 30  iIdx);.  for(i=0
25870 3b 20 69 3c 6e 54 65 72 6d 3b 20 69 2b 2b 29 20  ; i<nTerm; i++) 
25880 72 65 74 20 2b 3d 20 28 72 65 74 3c 3c 33 29 20  ret += (ret<<3) 
25890 2b 20 70 54 65 72 6d 5b 69 5d 3b 0a 20 20 72 65  + pTerm[i];.  re
258a0 74 75 72 6e 20 72 65 74 3b 0a 7d 0a 0a 23 69 66  turn ret;.}..#if
258b0 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
258c0 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
258d0 74 69 6f 6e 20 69 73 20 70 75 72 65 6c 79 20 61  tion is purely a
258e0 6e 20 69 6e 74 65 72 6e 61 6c 20 74 65 73 74 2e  n internal test.
258f0 20 49 74 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6e   It does not con
25900 74 72 69 62 75 74 65 20 74 6f 20 0a 2a 2a 20 46  tribute to .** F
25910 54 53 20 66 75 6e 63 74 69 6f 6e 61 6c 69 74 79  TS functionality
25920 2c 20 6f 72 20 65 76 65 6e 20 74 68 65 20 69 6e  , or even the in
25930 74 65 67 72 69 74 79 2d 63 68 65 63 6b 2c 20 69  tegrity-check, i
25940 6e 20 61 6e 79 20 77 61 79 2e 0a 2a 2a 0a 2a 2a  n any way..**.**
25950 20 49 6e 73 74 65 61 64 2c 20 69 74 20 74 65 73   Instead, it tes
25960 74 73 20 74 68 61 74 20 74 68 65 20 73 61 6d 65  ts that the same
25970 20 73 65 74 20 6f 66 20 70 67 6e 6f 2f 72 6f 77   set of pgno/row
25980 69 64 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 73 20  id combinations 
25990 61 72 65 20 0a 2a 2a 20 76 69 73 69 74 65 64 20  are .** visited 
259a0 72 65 67 61 72 64 6c 65 73 73 20 6f 66 20 77 68  regardless of wh
259b0 65 74 68 65 72 20 74 68 65 20 64 6f 63 6c 69 73  ether the doclis
259c0 74 2d 69 6e 64 65 78 20 69 64 65 6e 74 69 66 69  t-index identifi
259d0 65 64 20 62 79 20 70 61 72 61 6d 65 74 65 72 73  ed by parameters
259e0 0a 2a 2a 20 69 53 65 67 69 64 2f 69 4c 65 61 66  .** iSegid/iLeaf
259f0 20 69 73 20 69 74 65 72 61 74 65 64 20 69 6e 20   is iterated in 
25a00 66 6f 72 77 61 72 64 73 20 6f 72 20 72 65 76 65  forwards or reve
25a10 72 73 65 20 6f 72 64 65 72 2e 0a 2a 2f 0a 73 74  rse order..*/.st
25a20 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 54 65  atic void fts5Te
25a30 73 74 44 6c 69 64 78 52 65 76 65 72 73 65 28 0a  stDlidxReverse(.
25a40 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20    Fts5Index *p, 
25a50 0a 20 20 69 6e 74 20 69 53 65 67 69 64 2c 20 20  .  int iSegid,  
25a60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25a70 20 20 20 2f 2a 20 53 65 67 6d 65 6e 74 20 69 64     /* Segment id
25a80 20 74 6f 20 6c 6f 61 64 20 66 72 6f 6d 20 2a 2f   to load from */
25a90 0a 20 20 69 6e 74 20 69 4c 65 61 66 20 20 20 20  .  int iLeaf    
25aa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25ab0 20 20 20 2f 2a 20 4c 6f 61 64 20 64 6f 63 6c 69     /* Load docli
25ac0 73 74 2d 69 6e 64 65 78 20 66 6f 72 20 74 68 69  st-index for thi
25ad0 73 20 6c 65 61 66 20 2a 2f 0a 29 7b 0a 20 20 46  s leaf */.){.  F
25ae0 74 73 35 44 6c 69 64 78 49 74 65 72 20 2a 70 44  ts5DlidxIter *pD
25af0 6c 69 64 78 20 3d 20 30 3b 0a 20 20 75 36 34 20  lidx = 0;.  u64 
25b00 63 6b 73 75 6d 31 20 3d 20 31 33 3b 0a 20 20 75  cksum1 = 13;.  u
25b10 36 34 20 63 6b 73 75 6d 32 20 3d 20 31 33 3b 0a  64 cksum2 = 13;.
25b20 0a 20 20 66 6f 72 28 70 44 6c 69 64 78 3d 66 74  .  for(pDlidx=ft
25b30 73 35 44 6c 69 64 78 49 74 65 72 49 6e 69 74 28  s5DlidxIterInit(
25b40 70 2c 20 30 2c 20 69 53 65 67 69 64 2c 20 69 4c  p, 0, iSegid, iL
25b50 65 61 66 29 3b 0a 20 20 20 20 20 20 66 74 73 35  eaf);.      fts5
25b60 44 6c 69 64 78 49 74 65 72 45 6f 66 28 70 2c 20  DlidxIterEof(p, 
25b70 70 44 6c 69 64 78 29 3d 3d 30 3b 0a 20 20 20 20  pDlidx)==0;.    
25b80 20 20 66 74 73 35 44 6c 69 64 78 49 74 65 72 4e    fts5DlidxIterN
25b90 65 78 74 28 70 2c 20 70 44 6c 69 64 78 29 0a 20  ext(p, pDlidx). 
25ba0 20 29 7b 0a 20 20 20 20 69 36 34 20 69 52 6f 77   ){.    i64 iRow
25bb0 69 64 20 3d 20 66 74 73 35 44 6c 69 64 78 49 74  id = fts5DlidxIt
25bc0 65 72 52 6f 77 69 64 28 70 44 6c 69 64 78 29 3b  erRowid(pDlidx);
25bd0 0a 20 20 20 20 69 6e 74 20 70 67 6e 6f 20 3d 20  .    int pgno = 
25be0 66 74 73 35 44 6c 69 64 78 49 74 65 72 50 67 6e  fts5DlidxIterPgn
25bf0 6f 28 70 44 6c 69 64 78 29 3b 0a 20 20 20 20 61  o(pDlidx);.    a
25c00 73 73 65 72 74 28 20 70 67 6e 6f 3e 69 4c 65 61  ssert( pgno>iLea
25c10 66 20 29 3b 0a 20 20 20 20 63 6b 73 75 6d 31 20  f );.    cksum1 
25c20 2b 3d 20 69 52 6f 77 69 64 20 2b 20 28 28 69 36  += iRowid + ((i6
25c30 34 29 70 67 6e 6f 3c 3c 33 32 29 3b 0a 20 20 7d  4)pgno<<32);.  }
25c40 0a 20 20 66 74 73 35 44 6c 69 64 78 49 74 65 72  .  fts5DlidxIter
25c50 46 72 65 65 28 70 44 6c 69 64 78 29 3b 0a 20 20  Free(pDlidx);.  
25c60 70 44 6c 69 64 78 20 3d 20 30 3b 0a 0a 20 20 66  pDlidx = 0;..  f
25c70 6f 72 28 70 44 6c 69 64 78 3d 66 74 73 35 44 6c  or(pDlidx=fts5Dl
25c80 69 64 78 49 74 65 72 49 6e 69 74 28 70 2c 20 31  idxIterInit(p, 1
25c90 2c 20 69 53 65 67 69 64 2c 20 69 4c 65 61 66 29  , iSegid, iLeaf)
25ca0 3b 0a 20 20 20 20 20 20 66 74 73 35 44 6c 69 64  ;.      fts5Dlid
25cb0 78 49 74 65 72 45 6f 66 28 70 2c 20 70 44 6c 69  xIterEof(p, pDli
25cc0 64 78 29 3d 3d 30 3b 0a 20 20 20 20 20 20 66 74  dx)==0;.      ft
25cd0 73 35 44 6c 69 64 78 49 74 65 72 50 72 65 76 28  s5DlidxIterPrev(
25ce0 70 2c 20 70 44 6c 69 64 78 29 0a 20 20 29 7b 0a  p, pDlidx).  ){.
25cf0 20 20 20 20 69 36 34 20 69 52 6f 77 69 64 20 3d      i64 iRowid =
25d00 20 66 74 73 35 44 6c 69 64 78 49 74 65 72 52 6f   fts5DlidxIterRo
25d10 77 69 64 28 70 44 6c 69 64 78 29 3b 0a 20 20 20  wid(pDlidx);.   
25d20 20 69 6e 74 20 70 67 6e 6f 20 3d 20 66 74 73 35   int pgno = fts5
25d30 44 6c 69 64 78 49 74 65 72 50 67 6e 6f 28 70 44  DlidxIterPgno(pD
25d40 6c 69 64 78 29 3b 0a 20 20 20 20 61 73 73 65 72  lidx);.    asser
25d50 74 28 20 66 74 73 35 44 6c 69 64 78 49 74 65 72  t( fts5DlidxIter
25d60 50 67 6e 6f 28 70 44 6c 69 64 78 29 3e 69 4c 65  Pgno(pDlidx)>iLe
25d70 61 66 20 29 3b 0a 20 20 20 20 63 6b 73 75 6d 32  af );.    cksum2
25d80 20 2b 3d 20 69 52 6f 77 69 64 20 2b 20 28 28 69   += iRowid + ((i
25d90 36 34 29 70 67 6e 6f 3c 3c 33 32 29 3b 0a 20 20  64)pgno<<32);.  
25da0 7d 0a 20 20 66 74 73 35 44 6c 69 64 78 49 74 65  }.  fts5DlidxIte
25db0 72 46 72 65 65 28 70 44 6c 69 64 78 29 3b 0a 20  rFree(pDlidx);. 
25dc0 20 70 44 6c 69 64 78 20 3d 20 30 3b 0a 0a 20 20   pDlidx = 0;..  
25dd0 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  if( p->rc==SQLIT
25de0 45 5f 4f 4b 20 26 26 20 63 6b 73 75 6d 31 21 3d  E_OK && cksum1!=
25df0 63 6b 73 75 6d 32 20 29 20 70 2d 3e 72 63 20 3d  cksum2 ) p->rc =
25e00 20 46 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a 7d   FTS5_CORRUPT;.}
25e10 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73  ..static int fts
25e20 35 51 75 65 72 79 43 6b 73 75 6d 28 0a 20 20 46  5QueryCksum(.  F
25e30 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20  ts5Index *p,    
25e40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
25e50 2a 20 46 74 73 35 20 69 6e 64 65 78 20 6f 62 6a  * Fts5 index obj
25e60 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20 69 49 64  ect */.  int iId
25e70 78 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  x,.  const char 
25e80 2a 7a 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  *z,             
25e90 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6b 65       /* Index ke
25ea0 79 20 74 6f 20 71 75 65 72 79 20 66 6f 72 20 2a  y to query for *
25eb0 2f 0a 20 20 69 6e 74 20 6e 2c 20 20 20 20 20 20  /.  int n,      
25ec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25ed0 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 69      /* Size of i
25ee0 6e 64 65 78 20 6b 65 79 20 69 6e 20 62 79 74 65  ndex key in byte
25ef0 73 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73  s */.  int flags
25f00 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
25f10 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 73 20         /* Flags 
25f20 66 6f 72 20 46 74 73 35 49 6e 64 65 78 51 75 65  for Fts5IndexQue
25f30 72 79 20 2a 2f 0a 20 20 75 36 34 20 2a 70 43 6b  ry */.  u64 *pCk
25f40 73 75 6d 20 20 20 20 20 20 20 20 20 20 20 20 20  sum             
25f50 20 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f 55          /* IN/OU
25f60 54 3a 20 43 68 65 63 6b 73 75 6d 20 76 61 6c 75  T: Checksum valu
25f70 65 20 2a 2f 0a 29 7b 0a 20 20 75 36 34 20 63 6b  e */.){.  u64 ck
25f80 73 75 6d 20 3d 20 2a 70 43 6b 73 75 6d 3b 0a 20  sum = *pCksum;. 
25f90 20 46 74 73 35 49 6e 64 65 78 49 74 65 72 20 2a   Fts5IndexIter *
25fa0 70 49 64 78 49 74 65 72 20 3d 20 30 3b 0a 20 20  pIdxIter = 0;.  
25fb0 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33  int rc = sqlite3
25fc0 46 74 73 35 49 6e 64 65 78 51 75 65 72 79 28 70  Fts5IndexQuery(p
25fd0 2c 20 7a 2c 20 6e 2c 20 66 6c 61 67 73 2c 20 30  , z, n, flags, 0
25fe0 2c 20 26 70 49 64 78 49 74 65 72 29 3b 0a 0a 20  , &pIdxIter);.. 
25ff0 20 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49   while( rc==SQLI
26000 54 45 5f 4f 4b 20 26 26 20 30 3d 3d 73 71 6c 69  TE_OK && 0==sqli
26010 74 65 33 46 74 73 35 49 74 65 72 45 6f 66 28 70  te3Fts5IterEof(p
26020 49 64 78 49 74 65 72 29 20 29 7b 0a 20 20 20 20  IdxIter) ){.    
26030 69 36 34 20 64 75 6d 6d 79 3b 0a 20 20 20 20 63  i64 dummy;.    c
26040 6f 6e 73 74 20 75 38 20 2a 70 50 6f 73 3b 0a 20  onst u8 *pPos;. 
26050 20 20 20 69 6e 74 20 6e 50 6f 73 3b 0a 20 20 20     int nPos;.   
26060 20 69 36 34 20 72 6f 77 69 64 20 3d 20 73 71 6c   i64 rowid = sql
26070 69 74 65 33 46 74 73 35 49 74 65 72 52 6f 77 69  ite3Fts5IterRowi
26080 64 28 70 49 64 78 49 74 65 72 29 3b 0a 20 20 20  d(pIdxIter);.   
26090 20 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74 73   rc = sqlite3Fts
260a0 35 49 74 65 72 50 6f 73 6c 69 73 74 28 70 49 64  5IterPoslist(pId
260b0 78 49 74 65 72 2c 20 30 2c 20 26 70 50 6f 73 2c  xIter, 0, &pPos,
260c0 20 26 6e 50 6f 73 2c 20 26 64 75 6d 6d 79 29 3b   &nPos, &dummy);
260d0 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
260e0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
260f0 46 74 73 35 50 6f 73 6c 69 73 74 52 65 61 64 65  Fts5PoslistReade
26100 72 20 73 52 65 61 64 65 72 3b 0a 20 20 20 20 20  r sReader;.     
26110 20 66 6f 72 28 73 71 6c 69 74 65 33 46 74 73 35   for(sqlite3Fts5
26120 50 6f 73 6c 69 73 74 52 65 61 64 65 72 49 6e 69  PoslistReaderIni
26130 74 28 70 50 6f 73 2c 20 6e 50 6f 73 2c 20 26 73  t(pPos, nPos, &s
26140 52 65 61 64 65 72 29 3b 0a 20 20 20 20 20 20 20  Reader);.       
26150 20 20 20 73 52 65 61 64 65 72 2e 62 45 6f 66 3d     sReader.bEof=
26160 3d 30 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  =0;.          sq
26170 6c 69 74 65 33 46 74 73 35 50 6f 73 6c 69 73 74  lite3Fts5Poslist
26180 52 65 61 64 65 72 4e 65 78 74 28 26 73 52 65 61  ReaderNext(&sRea
26190 64 65 72 29 0a 20 20 20 20 20 20 29 7b 0a 20 20  der).      ){.  
261a0 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d        int iCol =
261b0 20 46 54 53 35 5f 50 4f 53 32 43 4f 4c 55 4d 4e   FTS5_POS2COLUMN
261c0 28 73 52 65 61 64 65 72 2e 69 50 6f 73 29 3b 0a  (sReader.iPos);.
261d0 20 20 20 20 20 20 20 20 69 6e 74 20 69 4f 66 66          int iOff
261e0 20 3d 20 46 54 53 35 5f 50 4f 53 32 4f 46 46 53   = FTS5_POS2OFFS
261f0 45 54 28 73 52 65 61 64 65 72 2e 69 50 6f 73 29  ET(sReader.iPos)
26200 3b 0a 20 20 20 20 20 20 20 20 63 6b 73 75 6d 20  ;.        cksum 
26210 5e 3d 20 66 74 73 35 49 6e 64 65 78 45 6e 74 72  ^= fts5IndexEntr
26220 79 43 6b 73 75 6d 28 72 6f 77 69 64 2c 20 69 43  yCksum(rowid, iC
26230 6f 6c 2c 20 69 4f 66 66 2c 20 69 49 64 78 2c 20  ol, iOff, iIdx, 
26240 7a 2c 20 6e 29 3b 0a 20 20 20 20 20 20 7d 0a 20  z, n);.      }. 
26250 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
26260 33 46 74 73 35 49 74 65 72 4e 65 78 74 28 70 49  3Fts5IterNext(pI
26270 64 78 49 74 65 72 29 3b 0a 20 20 20 20 7d 0a 20  dxIter);.    }. 
26280 20 7d 0a 20 20 73 71 6c 69 74 65 33 46 74 73 35   }.  sqlite3Fts5
26290 49 74 65 72 43 6c 6f 73 65 28 70 49 64 78 49 74  IterClose(pIdxIt
262a0 65 72 29 3b 0a 0a 20 20 2a 70 43 6b 73 75 6d 20  er);..  *pCksum 
262b0 3d 20 63 6b 73 75 6d 3b 0a 20 20 72 65 74 75 72  = cksum;.  retur
262c0 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  n rc;.}.../*.** 
262d0 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
262e0 20 61 6c 73 6f 20 70 75 72 65 6c 79 20 61 6e 20   also purely an 
262f0 69 6e 74 65 72 6e 61 6c 20 74 65 73 74 2e 20 49  internal test. I
26300 74 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6e 74 72  t does not contr
26310 69 62 75 74 65 20 74 6f 20 0a 2a 2a 20 46 54 53  ibute to .** FTS
26320 20 66 75 6e 63 74 69 6f 6e 61 6c 69 74 79 2c 20   functionality, 
26330 6f 72 20 65 76 65 6e 20 74 68 65 20 69 6e 74 65  or even the inte
26340 67 72 69 74 79 2d 63 68 65 63 6b 2c 20 69 6e 20  grity-check, in 
26350 61 6e 79 20 77 61 79 2e 0a 2a 2f 0a 73 74 61 74  any way..*/.stat
26360 69 63 20 76 6f 69 64 20 66 74 73 35 54 65 73 74  ic void fts5Test
26370 54 65 72 6d 28 0a 20 20 46 74 73 35 49 6e 64 65  Term(.  Fts5Inde
26380 78 20 2a 70 2c 20 0a 20 20 46 74 73 35 42 75 66  x *p, .  Fts5Buf
26390 66 65 72 20 2a 70 50 72 65 76 2c 20 20 20 20 20  fer *pPrev,     
263a0 20 20 20 20 20 20 20 20 20 2f 2a 20 50 72 65 76           /* Prev
263b0 69 6f 75 73 20 74 65 72 6d 20 2a 2f 0a 20 20 63  ious term */.  c
263c0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 2c 20 69 6e  onst char *z, in
263d0 74 20 6e 2c 20 20 20 20 20 20 20 20 20 20 20 2f  t n,           /
263e0 2a 20 50 6f 73 73 69 62 6c 79 20 6e 65 77 20 74  * Possibly new t
263f0 65 72 6d 20 74 6f 20 74 65 73 74 20 2a 2f 0a 20  erm to test */. 
26400 20 75 36 34 20 65 78 70 65 63 74 65 64 2c 0a 20   u64 expected,. 
26410 20 75 36 34 20 2a 70 43 6b 73 75 6d 0a 29 7b 0a   u64 *pCksum.){.
26420 20 20 69 6e 74 20 72 63 20 3d 20 70 2d 3e 72 63    int rc = p->rc
26430 3b 0a 20 20 69 66 28 20 70 50 72 65 76 2d 3e 6e  ;.  if( pPrev->n
26440 3d 3d 30 20 29 7b 0a 20 20 20 20 66 74 73 35 42  ==0 ){.    fts5B
26450 75 66 66 65 72 53 65 74 28 26 72 63 2c 20 70 50  ufferSet(&rc, pP
26460 72 65 76 2c 20 6e 2c 20 28 63 6f 6e 73 74 20 75  rev, n, (const u
26470 38 2a 29 7a 29 3b 0a 20 20 7d 65 6c 73 65 0a 20  8*)z);.  }else. 
26480 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
26490 4f 4b 20 26 26 20 28 70 50 72 65 76 2d 3e 6e 21  OK && (pPrev->n!
264a0 3d 6e 20 7c 7c 20 6d 65 6d 63 6d 70 28 70 50 72  =n || memcmp(pPr
264b0 65 76 2d 3e 70 2c 20 7a 2c 20 6e 29 29 20 29 7b  ev->p, z, n)) ){
264c0 0a 20 20 20 20 75 36 34 20 63 6b 73 75 6d 33 20  .    u64 cksum3 
264d0 3d 20 2a 70 43 6b 73 75 6d 3b 0a 20 20 20 20 63  = *pCksum;.    c
264e0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 65 72 6d  onst char *zTerm
264f0 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29   = (const char*)
26500 26 70 50 72 65 76 2d 3e 70 5b 31 5d 3b 20 20 2f  &pPrev->p[1];  /
26510 2a 20 74 65 72 6d 20 73 61 6e 73 20 70 72 65 66  * term sans pref
26520 69 78 2d 62 79 74 65 20 2a 2f 0a 20 20 20 20 69  ix-byte */.    i
26530 6e 74 20 6e 54 65 72 6d 20 3d 20 70 50 72 65 76  nt nTerm = pPrev
26540 2d 3e 6e 2d 31 3b 20 20 20 20 20 20 20 20 20 20  ->n-1;          
26550 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 7a 54 65    /* Size of zTe
26560 72 6d 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20  rm in bytes */. 
26570 20 20 20 69 6e 74 20 69 49 64 78 20 3d 20 28 70     int iIdx = (p
26580 50 72 65 76 2d 3e 70 5b 30 5d 20 2d 20 46 54 53  Prev->p[0] - FTS
26590 35 5f 4d 41 49 4e 5f 50 52 45 46 49 58 29 3b 0a  5_MAIN_PREFIX);.
265a0 20 20 20 20 69 6e 74 20 66 6c 61 67 73 20 3d 20      int flags = 
265b0 28 69 49 64 78 3d 3d 30 20 3f 20 30 20 3a 20 46  (iIdx==0 ? 0 : F
265c0 54 53 35 49 4e 44 45 58 5f 51 55 45 52 59 5f 50  TS5INDEX_QUERY_P
265d0 52 45 46 49 58 29 3b 0a 20 20 20 20 75 36 34 20  REFIX);.    u64 
265e0 63 6b 31 20 3d 20 30 3b 0a 20 20 20 20 75 36 34  ck1 = 0;.    u64
265f0 20 63 6b 32 20 3d 20 30 3b 0a 0a 20 20 20 20 2f   ck2 = 0;..    /
26600 2a 20 43 68 65 63 6b 20 74 68 61 74 20 74 68 65  * Check that the
26610 20 72 65 73 75 6c 74 73 20 72 65 74 75 72 6e 65   results returne
26620 64 20 66 6f 72 20 41 53 43 20 61 6e 64 20 44 45  d for ASC and DE
26630 53 43 20 71 75 65 72 69 65 73 20 61 72 65 0a 20  SC queries are. 
26640 20 20 20 2a 2a 20 74 68 65 20 73 61 6d 65 2e 20     ** the same. 
26650 49 66 20 6e 6f 74 2c 20 63 61 6c 6c 20 74 68 69  If not, call thi
26660 73 20 63 6f 72 72 75 70 74 69 6f 6e 2e 20 20 2a  s corruption.  *
26670 2f 0a 20 20 20 20 72 63 20 3d 20 66 74 73 35 51  /.    rc = fts5Q
26680 75 65 72 79 43 6b 73 75 6d 28 70 2c 20 69 49 64  ueryCksum(p, iId
26690 78 2c 20 7a 54 65 72 6d 2c 20 6e 54 65 72 6d 2c  x, zTerm, nTerm,
266a0 20 66 6c 61 67 73 2c 20 26 63 6b 31 29 3b 0a 20   flags, &ck1);. 
266b0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
266c0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69 6e  E_OK ){.      in
266d0 74 20 66 20 3d 20 66 6c 61 67 73 7c 46 54 53 35  t f = flags|FTS5
266e0 49 4e 44 45 58 5f 51 55 45 52 59 5f 44 45 53 43  INDEX_QUERY_DESC
266f0 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 66 74 73  ;.      rc = fts
26700 35 51 75 65 72 79 43 6b 73 75 6d 28 70 2c 20 69  5QueryCksum(p, i
26710 49 64 78 2c 20 7a 54 65 72 6d 2c 20 6e 54 65 72  Idx, zTerm, nTer
26720 6d 2c 20 66 2c 20 26 63 6b 32 29 3b 0a 20 20 20  m, f, &ck2);.   
26730 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53   }.    if( rc==S
26740 51 4c 49 54 45 5f 4f 4b 20 26 26 20 63 6b 31 21  QLITE_OK && ck1!
26750 3d 63 6b 32 20 29 20 72 63 20 3d 20 46 54 53 35  =ck2 ) rc = FTS5
26760 5f 43 4f 52 52 55 50 54 3b 0a 0a 20 20 20 20 2f  _CORRUPT;..    /
26770 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 20 70  * If this is a p
26780 72 65 66 69 78 20 71 75 65 72 79 2c 20 63 68 65  refix query, che
26790 63 6b 20 74 68 61 74 20 74 68 65 20 72 65 73 75  ck that the resu
267a0 6c 74 73 20 72 65 74 75 72 6e 65 64 20 69 66 20  lts returned if 
267b0 74 68 65 0a 20 20 20 20 2a 2a 20 74 68 65 20 69  the.    ** the i
267c0 6e 64 65 78 20 69 73 20 64 69 73 61 62 6c 65 64  ndex is disabled
267d0 20 61 72 65 20 74 68 65 20 73 61 6d 65 2e 20 49   are the same. I
267e0 6e 20 62 6f 74 68 20 41 53 43 20 61 6e 64 20 44  n both ASC and D
267f0 45 53 43 20 6f 72 64 65 72 2e 20 0a 20 20 20 20  ESC order. .    
26800 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 69 73 20 63  **.    ** This c
26810 68 65 63 6b 20 6d 61 79 20 6f 6e 6c 79 20 62 65  heck may only be
26820 20 70 65 72 66 6f 72 6d 65 64 20 69 66 20 74 68   performed if th
26830 65 20 68 61 73 68 20 74 61 62 6c 65 20 69 73 20  e hash table is 
26840 65 6d 70 74 79 2e 20 54 68 69 73 0a 20 20 20 20  empty. This.    
26850 2a 2a 20 69 73 20 62 65 63 61 75 73 65 20 74 68  ** is because th
26860 65 20 68 61 73 68 20 74 61 62 6c 65 20 6f 6e 6c  e hash table onl
26870 79 20 73 75 70 70 6f 72 74 73 20 61 20 73 69 6e  y supports a sin
26880 67 6c 65 20 73 63 61 6e 20 71 75 65 72 79 20 61  gle scan query a
26890 74 0a 20 20 20 20 2a 2a 20 61 20 74 69 6d 65 2c  t.    ** a time,
268a0 20 61 6e 64 20 74 68 65 20 6d 75 6c 74 69 2d 69   and the multi-i
268b0 74 65 72 20 6c 6f 6f 70 20 66 72 6f 6d 20 77 68  ter loop from wh
268c0 69 63 68 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ich this functio
268d0 6e 20 69 73 20 63 61 6c 6c 65 64 0a 20 20 20 20  n is called.    
268e0 2a 2a 20 69 73 20 61 6c 72 65 61 64 79 20 70 65  ** is already pe
268f0 72 66 6f 72 6d 69 6e 67 20 73 75 63 68 20 61 20  rforming such a 
26900 73 63 61 6e 2e 20 2a 2f 0a 20 20 20 20 69 66 28  scan. */.    if(
26910 20 70 2d 3e 6e 50 65 6e 64 69 6e 67 44 61 74 61   p->nPendingData
26920 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ==0 ){.      if(
26930 20 69 49 64 78 3e 30 20 26 26 20 72 63 3d 3d 53   iIdx>0 && rc==S
26940 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
26950 20 20 20 20 69 6e 74 20 66 20 3d 20 66 6c 61 67      int f = flag
26960 73 7c 46 54 53 35 49 4e 44 45 58 5f 51 55 45 52  s|FTS5INDEX_QUER
26970 59 5f 54 45 53 54 5f 4e 4f 49 44 58 3b 0a 20 20  Y_TEST_NOIDX;.  
26980 20 20 20 20 20 20 63 6b 32 20 3d 20 30 3b 0a 20        ck2 = 0;. 
26990 20 20 20 20 20 20 20 72 63 20 3d 20 66 74 73 35         rc = fts5
269a0 51 75 65 72 79 43 6b 73 75 6d 28 70 2c 20 69 49  QueryCksum(p, iI
269b0 64 78 2c 20 7a 54 65 72 6d 2c 20 6e 54 65 72 6d  dx, zTerm, nTerm
269c0 2c 20 66 2c 20 26 63 6b 32 29 3b 0a 20 20 20 20  , f, &ck2);.    
269d0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
269e0 54 45 5f 4f 4b 20 26 26 20 63 6b 31 21 3d 63 6b  TE_OK && ck1!=ck
269f0 32 20 29 20 72 63 20 3d 20 46 54 53 35 5f 43 4f  2 ) rc = FTS5_CO
26a00 52 52 55 50 54 3b 0a 20 20 20 20 20 20 7d 0a 20  RRUPT;.      }. 
26a10 20 20 20 20 20 69 66 28 20 69 49 64 78 3e 30 20       if( iIdx>0 
26a20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  && rc==SQLITE_OK
26a30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20   ){.        int 
26a40 66 20 3d 20 66 6c 61 67 73 7c 46 54 53 35 49 4e  f = flags|FTS5IN
26a50 44 45 58 5f 51 55 45 52 59 5f 54 45 53 54 5f 4e  DEX_QUERY_TEST_N
26a60 4f 49 44 58 7c 46 54 53 35 49 4e 44 45 58 5f 51  OIDX|FTS5INDEX_Q
26a70 55 45 52 59 5f 44 45 53 43 3b 0a 20 20 20 20 20  UERY_DESC;.     
26a80 20 20 20 63 6b 32 20 3d 20 30 3b 0a 20 20 20 20     ck2 = 0;.    
26a90 20 20 20 20 72 63 20 3d 20 66 74 73 35 51 75 65      rc = fts5Que
26aa0 72 79 43 6b 73 75 6d 28 70 2c 20 69 49 64 78 2c  ryCksum(p, iIdx,
26ab0 20 7a 54 65 72 6d 2c 20 6e 54 65 72 6d 2c 20 66   zTerm, nTerm, f
26ac0 2c 20 26 63 6b 32 29 3b 0a 20 20 20 20 20 20 20  , &ck2);.       
26ad0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
26ae0 4f 4b 20 26 26 20 63 6b 31 21 3d 63 6b 32 20 29  OK && ck1!=ck2 )
26af0 20 72 63 20 3d 20 46 54 53 35 5f 43 4f 52 52 55   rc = FTS5_CORRU
26b00 50 54 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  PT;.      }.    
26b10 7d 0a 0a 20 20 20 20 63 6b 73 75 6d 33 20 5e 3d  }..    cksum3 ^=
26b20 20 63 6b 31 3b 0a 20 20 20 20 66 74 73 35 42 75   ck1;.    fts5Bu
26b30 66 66 65 72 53 65 74 28 26 72 63 2c 20 70 50 72  fferSet(&rc, pPr
26b40 65 76 2c 20 6e 2c 20 28 63 6f 6e 73 74 20 75 38  ev, n, (const u8
26b50 2a 29 7a 29 3b 0a 0a 20 20 20 20 69 66 28 20 72  *)z);..    if( r
26b60 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
26b70 63 6b 73 75 6d 33 21 3d 65 78 70 65 63 74 65 64  cksum3!=expected
26b80 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 46   ){.      rc = F
26b90 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20  TS5_CORRUPT;.   
26ba0 20 7d 0a 20 20 20 20 2a 70 43 6b 73 75 6d 20 3d   }.    *pCksum =
26bb0 20 63 6b 73 75 6d 33 3b 0a 20 20 7d 0a 20 20 70   cksum3;.  }.  p
26bc0 2d 3e 72 63 20 3d 20 72 63 3b 0a 7d 0a 20 0a 23  ->rc = rc;.}. .#
26bd0 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 66 74  else.# define ft
26be0 73 35 54 65 73 74 44 6c 69 64 78 52 65 76 65 72  s5TestDlidxRever
26bf0 73 65 28 78 2c 79 2c 7a 29 0a 23 20 64 65 66 69  se(x,y,z).# defi
26c00 6e 65 20 66 74 73 35 54 65 73 74 54 65 72 6d 28  ne fts5TestTerm(
26c10 75 2c 76 2c 77 2c 78 2c 79 2c 7a 29 0a 23 65 6e  u,v,w,x,y,z).#en
26c20 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b  dif../*.** Check
26c30 20 74 68 61 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 31   that:.**.**   1
26c40 29 20 41 6c 6c 20 6c 65 61 76 65 73 20 6f 66 20  ) All leaves of 
26c50 70 53 65 67 20 62 65 74 77 65 65 6e 20 69 46 69  pSeg between iFi
26c60 72 73 74 20 61 6e 64 20 69 4c 61 73 74 20 28 69  rst and iLast (i
26c70 6e 63 6c 75 73 69 76 65 29 20 65 78 69 73 74 20  nclusive) exist 
26c80 61 6e 64 0a 2a 2a 20 20 20 20 20 20 63 6f 6e 74  and.**      cont
26c90 61 69 6e 20 7a 65 72 6f 20 74 65 72 6d 73 2e 0a  ain zero terms..
26ca0 2a 2a 20 20 20 32 29 20 41 6c 6c 20 6c 65 61 76  **   2) All leav
26cb0 65 73 20 6f 66 20 70 53 65 67 20 62 65 74 77 65  es of pSeg betwe
26cc0 65 6e 20 69 4e 6f 52 6f 77 69 64 20 61 6e 64 20  en iNoRowid and 
26cd0 69 4c 61 73 74 20 28 69 6e 63 6c 75 73 69 76 65  iLast (inclusive
26ce0 29 20 65 78 69 73 74 20 61 6e 64 0a 2a 2a 20 20  ) exist and.**  
26cf0 20 20 20 20 63 6f 6e 74 61 69 6e 20 7a 65 72 6f      contain zero
26d00 20 72 6f 77 69 64 73 2e 0a 2a 2f 0a 73 74 61 74   rowids..*/.stat
26d10 69 63 20 76 6f 69 64 20 66 74 73 35 49 6e 64 65  ic void fts5Inde
26d20 78 49 6e 74 65 67 72 69 74 79 43 68 65 63 6b 45  xIntegrityCheckE
26d30 6d 70 74 79 28 0a 20 20 46 74 73 35 49 6e 64 65  mpty(.  Fts5Inde
26d40 78 20 2a 70 2c 0a 20 20 46 74 73 35 53 74 72 75  x *p,.  Fts5Stru
26d50 63 74 75 72 65 53 65 67 6d 65 6e 74 20 2a 70 53  ctureSegment *pS
26d60 65 67 2c 20 20 20 20 20 2f 2a 20 53 65 67 6d 65  eg,     /* Segme
26d70 6e 74 20 74 6f 20 63 68 65 63 6b 20 69 6e 74 65  nt to check inte
26d80 72 6e 61 6c 20 63 6f 6e 73 69 73 74 65 6e 63 79  rnal consistency
26d90 20 2a 2f 0a 20 20 69 6e 74 20 69 46 69 72 73 74   */.  int iFirst
26da0 2c 0a 20 20 69 6e 74 20 69 4e 6f 52 6f 77 69 64  ,.  int iNoRowid
26db0 2c 0a 20 20 69 6e 74 20 69 4c 61 73 74 0a 29 7b  ,.  int iLast.){
26dc0 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20 2f 2a 20  .  int i;..  /* 
26dd0 4e 6f 77 20 63 68 65 63 6b 20 74 68 61 74 20 74  Now check that t
26de0 68 65 20 69 74 65 72 2e 6e 45 6d 70 74 79 20 6c  he iter.nEmpty l
26df0 65 61 76 65 73 20 66 6f 6c 6c 6f 77 69 6e 67 20  eaves following 
26e00 74 68 65 20 63 75 72 72 65 6e 74 20 6c 65 61 66  the current leaf
26e10 0a 20 20 2a 2a 20 28 61 29 20 65 78 69 73 74 20  .  ** (a) exist 
26e20 61 6e 64 20 28 62 29 20 63 6f 6e 74 61 69 6e 20  and (b) contain 
26e30 6e 6f 20 74 65 72 6d 73 2e 20 2a 2f 0a 20 20 66  no terms. */.  f
26e40 6f 72 28 69 3d 69 46 69 72 73 74 3b 20 70 2d 3e  or(i=iFirst; p->
26e50 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
26e60 20 69 3c 3d 69 4c 61 73 74 3b 20 69 2b 2b 29 7b   i<=iLast; i++){
26e70 0a 20 20 20 20 46 74 73 35 44 61 74 61 20 2a 70  .    Fts5Data *p
26e80 4c 65 61 66 20 3d 20 66 74 73 35 44 61 74 61 52  Leaf = fts5DataR
26e90 65 61 64 28 70 2c 20 46 54 53 35 5f 53 45 47 4d  ead(p, FTS5_SEGM
26ea0 45 4e 54 5f 52 4f 57 49 44 28 70 53 65 67 2d 3e  ENT_ROWID(pSeg->
26eb0 69 53 65 67 69 64 2c 20 69 29 29 3b 0a 20 20 20  iSegid, i));.   
26ec0 20 69 66 28 20 70 4c 65 61 66 20 29 7b 0a 20 20   if( pLeaf ){.  
26ed0 20 20 20 20 69 66 28 20 21 66 74 73 35 4c 65 61      if( !fts5Lea
26ee0 66 49 73 54 65 72 6d 6c 65 73 73 28 70 4c 65 61  fIsTermless(pLea
26ef0 66 29 20 29 20 70 2d 3e 72 63 20 3d 20 46 54 53  f) ) p->rc = FTS
26f00 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20 20 20  5_CORRUPT;.     
26f10 20 69 66 28 20 69 3e 3d 69 4e 6f 52 6f 77 69 64   if( i>=iNoRowid
26f20 20 26 26 20 30 21 3d 66 74 73 35 4c 65 61 66 46   && 0!=fts5LeafF
26f30 69 72 73 74 52 6f 77 69 64 4f 66 66 28 70 4c 65  irstRowidOff(pLe
26f40 61 66 29 20 29 20 70 2d 3e 72 63 20 3d 20 46 54  af) ) p->rc = FT
26f50 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20 20  S5_CORRUPT;.    
26f60 7d 0a 20 20 20 20 66 74 73 35 44 61 74 61 52 65  }.    fts5DataRe
26f70 6c 65 61 73 65 28 70 4c 65 61 66 29 3b 0a 20 20  lease(pLeaf);.  
26f80 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64  }.}..static void
26f90 20 66 74 73 35 49 6e 74 65 67 72 69 74 79 43 68   fts5IntegrityCh
26fa0 65 63 6b 50 67 69 64 78 28 46 74 73 35 49 6e 64  eckPgidx(Fts5Ind
26fb0 65 78 20 2a 70 2c 20 46 74 73 35 44 61 74 61 20  ex *p, Fts5Data 
26fc0 2a 70 4c 65 61 66 29 7b 0a 20 20 69 6e 74 20 69  *pLeaf){.  int i
26fd0 54 65 72 6d 4f 66 66 20 3d 20 30 3b 0a 20 20 69  TermOff = 0;.  i
26fe0 6e 74 20 69 69 3b 0a 0a 20 20 46 74 73 35 42 75  nt ii;..  Fts5Bu
26ff0 66 66 65 72 20 62 75 66 31 20 3d 20 7b 30 2c 30  ffer buf1 = {0,0
27000 2c 30 7d 3b 0a 20 20 46 74 73 35 42 75 66 66 65  ,0};.  Fts5Buffe
27010 72 20 62 75 66 32 20 3d 20 7b 30 2c 30 2c 30 7d  r buf2 = {0,0,0}
27020 3b 0a 0a 20 20 69 69 20 3d 20 70 4c 65 61 66 2d  ;..  ii = pLeaf-
27030 3e 73 7a 4c 65 61 66 3b 0a 20 20 77 68 69 6c 65  >szLeaf;.  while
27040 28 20 69 69 3c 70 4c 65 61 66 2d 3e 6e 6e 20 26  ( ii<pLeaf->nn &
27050 26 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  & p->rc==SQLITE_
27060 4f 4b 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 65  OK ){.    int re
27070 73 3b 0a 20 20 20 20 69 6e 74 20 69 4f 66 66 3b  s;.    int iOff;
27080 0a 20 20 20 20 69 6e 74 20 6e 49 6e 63 72 3b 0a  .    int nIncr;.
27090 0a 20 20 20 20 69 69 20 2b 3d 20 66 74 73 35 47  .    ii += fts5G
270a0 65 74 56 61 72 69 6e 74 33 32 28 26 70 4c 65 61  etVarint32(&pLea
270b0 66 2d 3e 70 5b 69 69 5d 2c 20 6e 49 6e 63 72 29  f->p[ii], nIncr)
270c0 3b 0a 20 20 20 20 69 54 65 72 6d 4f 66 66 20 2b  ;.    iTermOff +
270d0 3d 20 6e 49 6e 63 72 3b 0a 20 20 20 20 69 4f 66  = nIncr;.    iOf
270e0 66 20 3d 20 69 54 65 72 6d 4f 66 66 3b 0a 0a 20  f = iTermOff;.. 
270f0 20 20 20 69 66 28 20 69 4f 66 66 3e 3d 70 4c 65     if( iOff>=pLe
27100 61 66 2d 3e 73 7a 4c 65 61 66 20 29 7b 0a 20 20  af->szLeaf ){.  
27110 20 20 20 20 70 2d 3e 72 63 20 3d 20 46 54 53 35      p->rc = FTS5
27120 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20 20 7d 65  _CORRUPT;.    }e
27130 6c 73 65 20 69 66 28 20 69 54 65 72 6d 4f 66 66  lse if( iTermOff
27140 3d 3d 6e 49 6e 63 72 20 29 7b 0a 20 20 20 20 20  ==nIncr ){.     
27150 20 69 6e 74 20 6e 42 79 74 65 3b 0a 20 20 20 20   int nByte;.    
27160 20 20 69 4f 66 66 20 2b 3d 20 66 74 73 35 47 65    iOff += fts5Ge
27170 74 56 61 72 69 6e 74 33 32 28 26 70 4c 65 61 66  tVarint32(&pLeaf
27180 2d 3e 70 5b 69 4f 66 66 5d 2c 20 6e 42 79 74 65  ->p[iOff], nByte
27190 29 3b 0a 20 20 20 20 20 20 69 66 28 20 28 69 4f  );.      if( (iO
271a0 66 66 2b 6e 42 79 74 65 29 3e 70 4c 65 61 66 2d  ff+nByte)>pLeaf-
271b0 3e 73 7a 4c 65 61 66 20 29 7b 0a 20 20 20 20 20  >szLeaf ){.     
271c0 20 20 20 70 2d 3e 72 63 20 3d 20 46 54 53 35 5f     p->rc = FTS5_
271d0 43 4f 52 52 55 50 54 3b 0a 20 20 20 20 20 20 7d  CORRUPT;.      }
271e0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 66 74  else{.        ft
271f0 73 35 42 75 66 66 65 72 53 65 74 28 26 70 2d 3e  s5BufferSet(&p->
27200 72 63 2c 20 26 62 75 66 31 2c 20 6e 42 79 74 65  rc, &buf1, nByte
27210 2c 20 26 70 4c 65 61 66 2d 3e 70 5b 69 4f 66 66  , &pLeaf->p[iOff
27220 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ]);.      }.    
27230 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74  }else{.      int
27240 20 6e 4b 65 65 70 2c 20 6e 42 79 74 65 3b 0a 20   nKeep, nByte;. 
27250 20 20 20 20 20 69 4f 66 66 20 2b 3d 20 66 74 73       iOff += fts
27260 35 47 65 74 56 61 72 69 6e 74 33 32 28 26 70 4c  5GetVarint32(&pL
27270 65 61 66 2d 3e 70 5b 69 4f 66 66 5d 2c 20 6e 4b  eaf->p[iOff], nK
27280 65 65 70 29 3b 0a 20 20 20 20 20 20 69 4f 66 66  eep);.      iOff
27290 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e   += fts5GetVarin
272a0 74 33 32 28 26 70 4c 65 61 66 2d 3e 70 5b 69 4f  t32(&pLeaf->p[iO
272b0 66 66 5d 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20  ff], nByte);.   
272c0 20 20 20 69 66 28 20 6e 4b 65 65 70 3e 62 75 66     if( nKeep>buf
272d0 31 2e 6e 20 7c 7c 20 28 69 4f 66 66 2b 6e 42 79  1.n || (iOff+nBy
272e0 74 65 29 3e 70 4c 65 61 66 2d 3e 73 7a 4c 65 61  te)>pLeaf->szLea
272f0 66 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e  f ){.        p->
27300 72 63 20 3d 20 46 54 53 35 5f 43 4f 52 52 55 50  rc = FTS5_CORRUP
27310 54 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  T;.      }else{.
27320 20 20 20 20 20 20 20 20 62 75 66 31 2e 6e 20 3d          buf1.n =
27330 20 6e 4b 65 65 70 3b 0a 20 20 20 20 20 20 20 20   nKeep;.        
27340 66 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64  fts5BufferAppend
27350 42 6c 6f 62 28 26 70 2d 3e 72 63 2c 20 26 62 75  Blob(&p->rc, &bu
27360 66 31 2c 20 6e 42 79 74 65 2c 20 26 70 4c 65 61  f1, nByte, &pLea
27370 66 2d 3e 70 5b 69 4f 66 66 5d 29 3b 0a 20 20 20  f->p[iOff]);.   
27380 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20     }..      if( 
27390 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
273a0 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 73 20   ){.        res 
273b0 3d 20 66 74 73 35 42 75 66 66 65 72 43 6f 6d 70  = fts5BufferComp
273c0 61 72 65 28 26 62 75 66 31 2c 20 26 62 75 66 32  are(&buf1, &buf2
273d0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
273e0 65 73 3c 3d 30 20 29 20 70 2d 3e 72 63 20 3d 20  es<=0 ) p->rc = 
273f0 46 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20  FTS5_CORRUPT;.  
27400 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
27410 66 74 73 35 42 75 66 66 65 72 53 65 74 28 26 70  fts5BufferSet(&p
27420 2d 3e 72 63 2c 20 26 62 75 66 32 2c 20 62 75 66  ->rc, &buf2, buf
27430 31 2e 6e 2c 20 62 75 66 31 2e 70 29 3b 0a 20 20  1.n, buf1.p);.  
27440 7d 0a 0a 20 20 66 74 73 35 42 75 66 66 65 72 46  }..  fts5BufferF
27450 72 65 65 28 26 62 75 66 31 29 3b 0a 20 20 66 74  ree(&buf1);.  ft
27460 73 35 42 75 66 66 65 72 46 72 65 65 28 26 62 75  s5BufferFree(&bu
27470 66 32 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76  f2);.}..static v
27480 6f 69 64 20 66 74 73 35 49 6e 64 65 78 49 6e 74  oid fts5IndexInt
27490 65 67 72 69 74 79 43 68 65 63 6b 53 65 67 6d 65  egrityCheckSegme
274a0 6e 74 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20  nt(.  Fts5Index 
274b0 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  *p,             
274c0 20 20 20 20 20 20 2f 2a 20 46 54 53 35 20 62 61        /* FTS5 ba
274d0 63 6b 65 6e 64 20 6f 62 6a 65 63 74 20 2a 2f 0a  ckend object */.
274e0 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65 53    Fts5StructureS
274f0 65 67 6d 65 6e 74 20 2a 70 53 65 67 20 20 20 20  egment *pSeg    
27500 20 20 2f 2a 20 53 65 67 6d 65 6e 74 20 74 6f 20    /* Segment to 
27510 63 68 65 63 6b 20 69 6e 74 65 72 6e 61 6c 20 63  check internal c
27520 6f 6e 73 69 73 74 65 6e 63 79 20 2a 2f 0a 29 7b  onsistency */.){
27530 0a 20 20 46 74 73 35 43 6f 6e 66 69 67 20 2a 70  .  Fts5Config *p
27540 43 6f 6e 66 69 67 20 3d 20 70 2d 3e 70 43 6f 6e  Config = p->pCon
27550 66 69 67 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73  fig;.  sqlite3_s
27560 74 6d 74 20 2a 70 53 74 6d 74 20 3d 20 30 3b 0a  tmt *pStmt = 0;.
27570 20 20 69 6e 74 20 72 63 32 3b 0a 20 20 69 6e 74    int rc2;.  int
27580 20 69 49 64 78 50 72 65 76 4c 65 61 66 20 3d 20   iIdxPrevLeaf = 
27590 70 53 65 67 2d 3e 70 67 6e 6f 46 69 72 73 74 2d  pSeg->pgnoFirst-
275a0 31 3b 0a 20 20 69 6e 74 20 69 44 6c 69 64 78 50  1;.  int iDlidxP
275b0 72 65 76 4c 65 61 66 20 3d 20 70 53 65 67 2d 3e  revLeaf = pSeg->
275c0 70 67 6e 6f 4c 61 73 74 3b 0a 0a 20 20 69 66 28  pgnoLast;..  if(
275d0 20 70 53 65 67 2d 3e 70 67 6e 6f 46 69 72 73 74   pSeg->pgnoFirst
275e0 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20  ==0 ) return;.. 
275f0 20 66 74 73 35 49 6e 64 65 78 50 72 65 70 61 72   fts5IndexPrepar
27600 65 53 74 6d 74 28 70 2c 20 26 70 53 74 6d 74 2c  eStmt(p, &pStmt,
27610 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
27620 28 0a 20 20 20 20 20 20 22 53 45 4c 45 43 54 20  (.      "SELECT 
27630 73 65 67 69 64 2c 20 74 65 72 6d 2c 20 28 70 67  segid, term, (pg
27640 6e 6f 3e 3e 31 29 2c 20 28 70 67 6e 6f 26 31 29  no>>1), (pgno&1)
27650 20 46 52 4f 4d 20 25 51 2e 27 25 71 5f 69 64 78   FROM %Q.'%q_idx
27660 27 20 57 48 45 52 45 20 73 65 67 69 64 3d 25 64  ' WHERE segid=%d
27670 22 2c 0a 20 20 20 20 20 20 70 43 6f 6e 66 69 67  ",.      pConfig
27680 2d 3e 7a 44 62 2c 20 70 43 6f 6e 66 69 67 2d 3e  ->zDb, pConfig->
27690 7a 4e 61 6d 65 2c 20 70 53 65 67 2d 3e 69 53 65  zName, pSeg->iSe
276a0 67 69 64 0a 20 20 29 29 3b 0a 0a 20 20 2f 2a 20  gid.  ));..  /* 
276b0 49 74 65 72 61 74 65 20 74 68 72 6f 75 67 68 20  Iterate through 
276c0 74 68 65 20 62 2d 74 72 65 65 20 68 69 65 72 61  the b-tree hiera
276d0 72 63 68 79 2e 20 20 2a 2f 0a 20 20 77 68 69 6c  rchy.  */.  whil
276e0 65 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  e( p->rc==SQLITE
276f0 5f 4f 4b 20 26 26 20 53 51 4c 49 54 45 5f 52 4f  _OK && SQLITE_RO
27700 57 3d 3d 73 71 6c 69 74 65 33 5f 73 74 65 70 28  W==sqlite3_step(
27710 70 53 74 6d 74 29 20 29 7b 0a 20 20 20 20 69 36  pStmt) ){.    i6
27720 34 20 69 52 6f 77 3b 20 20 20 20 20 20 20 20 20  4 iRow;         
27730 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
27740 6f 77 69 64 20 66 6f 72 20 74 68 69 73 20 6c 65  owid for this le
27750 61 66 20 2a 2f 0a 20 20 20 20 46 74 73 35 44 61  af */.    Fts5Da
27760 74 61 20 2a 70 4c 65 61 66 3b 20 20 20 20 20 20  ta *pLeaf;      
27770 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 20          /* Data 
27780 66 6f 72 20 74 68 69 73 20 6c 65 61 66 20 2a 2f  for this leaf */
27790 0a 0a 20 20 20 20 69 6e 74 20 6e 49 64 78 54 65  ..    int nIdxTe
277a0 72 6d 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c  rm = sqlite3_col
277b0 75 6d 6e 5f 62 79 74 65 73 28 70 53 74 6d 74 2c  umn_bytes(pStmt,
277c0 20 31 29 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63   1);.    const c
277d0 68 61 72 20 2a 7a 49 64 78 54 65 72 6d 20 3d 20  har *zIdxTerm = 
277e0 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c  (const char*)sql
277f0 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74  ite3_column_text
27800 28 70 53 74 6d 74 2c 20 31 29 3b 0a 20 20 20 20  (pStmt, 1);.    
27810 69 6e 74 20 69 49 64 78 4c 65 61 66 20 3d 20 73  int iIdxLeaf = s
27820 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e  qlite3_column_in
27830 74 28 70 53 74 6d 74 2c 20 32 29 3b 0a 20 20 20  t(pStmt, 2);.   
27840 20 69 6e 74 20 62 49 64 78 44 6c 69 64 78 20 3d   int bIdxDlidx =
27850 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
27860 69 6e 74 28 70 53 74 6d 74 2c 20 33 29 3b 0a 0a  int(pStmt, 3);..
27870 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 6c 65      /* If the le
27880 61 66 20 69 6e 20 71 75 65 73 74 69 6f 6e 20 68  af in question h
27890 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  as already been 
278a0 74 72 69 6d 6d 65 64 20 66 72 6f 6d 20 74 68 65  trimmed from the
278b0 20 73 65 67 6d 65 6e 74 2c 20 0a 20 20 20 20 2a   segment, .    *
278c0 2a 20 69 67 6e 6f 72 65 20 74 68 69 73 20 62 2d  * ignore this b-
278d0 74 72 65 65 20 65 6e 74 72 79 2e 20 4f 74 68 65  tree entry. Othe
278e0 72 77 69 73 65 2c 20 6c 6f 61 64 20 69 74 20 69  rwise, load it i
278f0 6e 74 6f 20 6d 65 6d 6f 72 79 2e 20 2a 2f 0a 20  nto memory. */. 
27900 20 20 20 69 66 28 20 69 49 64 78 4c 65 61 66 3c     if( iIdxLeaf<
27910 70 53 65 67 2d 3e 70 67 6e 6f 46 69 72 73 74 20  pSeg->pgnoFirst 
27920 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
27930 69 52 6f 77 20 3d 20 46 54 53 35 5f 53 45 47 4d  iRow = FTS5_SEGM
27940 45 4e 54 5f 52 4f 57 49 44 28 70 53 65 67 2d 3e  ENT_ROWID(pSeg->
27950 69 53 65 67 69 64 2c 20 69 49 64 78 4c 65 61 66  iSegid, iIdxLeaf
27960 29 3b 0a 20 20 20 20 70 4c 65 61 66 20 3d 20 66  );.    pLeaf = f
27970 74 73 35 44 61 74 61 52 65 61 64 28 70 2c 20 69  ts5DataRead(p, i
27980 52 6f 77 29 3b 0a 20 20 20 20 69 66 28 20 70 4c  Row);.    if( pL
27990 65 61 66 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a  eaf==0 ) break;.
279a0 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 68  .    /* Check th
279b0 61 74 20 74 68 65 20 6c 65 61 66 20 63 6f 6e 74  at the leaf cont
279c0 61 69 6e 73 20 61 74 20 6c 65 61 73 74 20 6f 6e  ains at least on
279d0 65 20 74 65 72 6d 2c 20 61 6e 64 20 74 68 61 74  e term, and that
279e0 20 69 74 20 69 73 20 65 71 75 61 6c 0a 20 20 20   it is equal.   
279f0 20 2a 2a 20 74 6f 20 6f 72 20 6c 61 72 67 65 72   ** to or larger
27a00 20 74 68 61 6e 20 74 68 65 20 73 70 6c 69 74 2d   than the split-
27a10 6b 65 79 20 69 6e 20 7a 49 64 78 54 65 72 6d 2e  key in zIdxTerm.
27a20 20 20 41 6c 73 6f 20 63 68 65 63 6b 20 74 68 61    Also check tha
27a30 74 20 69 66 20 74 68 65 72 65 0a 20 20 20 20 2a  t if there.    *
27a40 2a 20 69 73 20 61 6c 73 6f 20 61 20 72 6f 77 69  * is also a rowi
27a50 64 20 70 6f 69 6e 74 65 72 20 77 69 74 68 69 6e  d pointer within
27a60 20 74 68 65 20 6c 65 61 66 20 70 61 67 65 20 68   the leaf page h
27a70 65 61 64 65 72 2c 20 69 74 20 70 6f 69 6e 74 73  eader, it points
27a80 20 74 6f 20 61 0a 20 20 20 20 2a 2a 20 6c 6f 63   to a.    ** loc
27a90 61 74 69 6f 6e 20 62 65 66 6f 72 65 20 74 68 65  ation before the
27aa0 20 74 65 72 6d 2e 20 20 2a 2f 0a 20 20 20 20 69   term.  */.    i
27ab0 66 28 20 70 4c 65 61 66 2d 3e 6e 6e 3c 3d 70 4c  f( pLeaf->nn<=pL
27ac0 65 61 66 2d 3e 73 7a 4c 65 61 66 20 29 7b 0a 20  eaf->szLeaf ){. 
27ad0 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 46 54 53       p->rc = FTS
27ae0 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20 20 7d  5_CORRUPT;.    }
27af0 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20  else{.      int 
27b00 69 4f 66 66 3b 20 20 20 20 20 20 20 20 20 20 20  iOff;           
27b10 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65          /* Offse
27b20 74 20 6f 66 20 66 69 72 73 74 20 74 65 72 6d 20  t of first term 
27b30 6f 6e 20 6c 65 61 66 20 2a 2f 0a 20 20 20 20 20  on leaf */.     
27b40 20 69 6e 74 20 69 52 6f 77 69 64 4f 66 66 3b 20   int iRowidOff; 
27b50 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
27b60 4f 66 66 73 65 74 20 6f 66 20 66 69 72 73 74 20  Offset of first 
27b70 72 6f 77 69 64 20 6f 6e 20 6c 65 61 66 20 2a 2f  rowid on leaf */
27b80 0a 20 20 20 20 20 20 69 6e 74 20 6e 54 65 72 6d  .      int nTerm
27b90 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
27ba0 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 65     /* Size of te
27bb0 72 6d 20 6f 6e 20 6c 65 61 66 20 69 6e 20 62 79  rm on leaf in by
27bc0 74 65 73 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  tes */.      int
27bd0 20 72 65 73 3b 20 20 20 20 20 20 20 20 20 20 20   res;           
27be0 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d 70           /* Comp
27bf0 61 72 69 73 6f 6e 20 6f 66 20 74 65 72 6d 20 61  arison of term a
27c00 6e 64 20 73 70 6c 69 74 2d 6b 65 79 20 2a 2f 0a  nd split-key */.
27c10 0a 20 20 20 20 20 20 69 4f 66 66 20 3d 20 66 74  .      iOff = ft
27c20 73 35 4c 65 61 66 46 69 72 73 74 54 65 72 6d 4f  s5LeafFirstTermO
27c30 66 66 28 70 4c 65 61 66 29 3b 0a 20 20 20 20 20  ff(pLeaf);.     
27c40 20 69 52 6f 77 69 64 4f 66 66 20 3d 20 66 74 73   iRowidOff = fts
27c50 35 4c 65 61 66 46 69 72 73 74 52 6f 77 69 64 4f  5LeafFirstRowidO
27c60 66 66 28 70 4c 65 61 66 29 3b 0a 20 20 20 20 20  ff(pLeaf);.     
27c70 20 69 66 28 20 69 52 6f 77 69 64 4f 66 66 3e 3d   if( iRowidOff>=
27c80 69 4f 66 66 20 29 7b 0a 20 20 20 20 20 20 20 20  iOff ){.        
27c90 70 2d 3e 72 63 20 3d 20 46 54 53 35 5f 43 4f 52  p->rc = FTS5_COR
27ca0 52 55 50 54 3b 0a 20 20 20 20 20 20 7d 65 6c 73  RUPT;.      }els
27cb0 65 7b 0a 20 20 20 20 20 20 20 20 69 4f 66 66 20  e{.        iOff 
27cc0 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e 74  += fts5GetVarint
27cd0 33 32 28 26 70 4c 65 61 66 2d 3e 70 5b 69 4f 66  32(&pLeaf->p[iOf
27ce0 66 5d 2c 20 6e 54 65 72 6d 29 3b 0a 20 20 20 20  f], nTerm);.    
27cf0 20 20 20 20 72 65 73 20 3d 20 6d 65 6d 63 6d 70      res = memcmp
27d00 28 26 70 4c 65 61 66 2d 3e 70 5b 69 4f 66 66 5d  (&pLeaf->p[iOff]
27d10 2c 20 7a 49 64 78 54 65 72 6d 2c 20 4d 49 4e 28  , zIdxTerm, MIN(
27d20 6e 54 65 72 6d 2c 20 6e 49 64 78 54 65 72 6d 29  nTerm, nIdxTerm)
27d30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
27d40 65 73 3d 3d 30 20 29 20 72 65 73 20 3d 20 6e 54  es==0 ) res = nT
27d50 65 72 6d 20 2d 20 6e 49 64 78 54 65 72 6d 3b 0a  erm - nIdxTerm;.
27d60 20 20 20 20 20 20 20 20 69 66 28 20 72 65 73 3c          if( res<
27d70 30 20 29 20 70 2d 3e 72 63 20 3d 20 46 54 53 35  0 ) p->rc = FTS5
27d80 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20 20 20 20  _CORRUPT;.      
27d90 7d 0a 0a 20 20 20 20 20 20 66 74 73 35 49 6e 74  }..      fts5Int
27da0 65 67 72 69 74 79 43 68 65 63 6b 50 67 69 64 78  egrityCheckPgidx
27db0 28 70 2c 20 70 4c 65 61 66 29 3b 0a 20 20 20 20  (p, pLeaf);.    
27dc0 7d 0a 20 20 20 20 66 74 73 35 44 61 74 61 52 65  }.    fts5DataRe
27dd0 6c 65 61 73 65 28 70 4c 65 61 66 29 3b 0a 20 20  lease(pLeaf);.  
27de0 20 20 69 66 28 20 70 2d 3e 72 63 20 29 20 62 72    if( p->rc ) br
27df0 65 61 6b 3b 0a 0a 20 20 20 20 2f 2a 20 4e 6f 77  eak;..    /* Now
27e00 20 63 68 65 63 6b 20 74 68 61 74 20 74 68 65 20   check that the 
27e10 69 74 65 72 2e 6e 45 6d 70 74 79 20 6c 65 61 76  iter.nEmpty leav
27e20 65 73 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65  es following the
27e30 20 63 75 72 72 65 6e 74 20 6c 65 61 66 0a 20 20   current leaf.  
27e40 20 20 2a 2a 20 28 61 29 20 65 78 69 73 74 20 61    ** (a) exist a
27e50 6e 64 20 28 62 29 20 63 6f 6e 74 61 69 6e 20 6e  nd (b) contain n
27e60 6f 20 74 65 72 6d 73 2e 20 2a 2f 0a 20 20 20 20  o terms. */.    
27e70 66 74 73 35 49 6e 64 65 78 49 6e 74 65 67 72 69  fts5IndexIntegri
27e80 74 79 43 68 65 63 6b 45 6d 70 74 79 28 0a 20 20  tyCheckEmpty(.  
27e90 20 20 20 20 20 20 70 2c 20 70 53 65 67 2c 20 69        p, pSeg, i
27ea0 49 64 78 50 72 65 76 4c 65 61 66 2b 31 2c 20 69  IdxPrevLeaf+1, i
27eb0 44 6c 69 64 78 50 72 65 76 4c 65 61 66 2b 31 2c  DlidxPrevLeaf+1,
27ec0 20 69 49 64 78 4c 65 61 66 2d 31 0a 20 20 20 20   iIdxLeaf-1.    
27ed0 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 72 63  );.    if( p->rc
27ee0 20 29 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 2f   ) break;..    /
27ef0 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 61 20  * If there is a 
27f00 64 6f 63 6c 69 73 74 2d 69 6e 64 65 78 2c 20 63  doclist-index, c
27f10 68 65 63 6b 20 74 68 61 74 20 69 74 20 6c 6f 6f  heck that it loo
27f20 6b 73 20 72 69 67 68 74 2e 20 2a 2f 0a 20 20 20  ks right. */.   
27f30 20 69 66 28 20 62 49 64 78 44 6c 69 64 78 20 29   if( bIdxDlidx )
27f40 7b 0a 20 20 20 20 20 20 46 74 73 35 44 6c 69 64  {.      Fts5Dlid
27f50 78 49 74 65 72 20 2a 70 44 6c 69 64 78 20 3d 20  xIter *pDlidx = 
27f60 30 3b 20 20 2f 2a 20 46 6f 72 20 69 74 65 72 61  0;  /* For itera
27f70 74 69 6e 67 20 74 68 72 6f 75 67 68 20 64 6f 63  ting through doc
27f80 6c 69 73 74 20 69 6e 64 65 78 20 2a 2f 0a 20 20  list index */.  
27f90 20 20 20 20 69 6e 74 20 69 50 72 65 76 4c 65 61      int iPrevLea
27fa0 66 20 3d 20 69 49 64 78 4c 65 61 66 3b 0a 20 20  f = iIdxLeaf;.  
27fb0 20 20 20 20 69 6e 74 20 69 53 65 67 69 64 20 3d      int iSegid =
27fc0 20 70 53 65 67 2d 3e 69 53 65 67 69 64 3b 0a 20   pSeg->iSegid;. 
27fd0 20 20 20 20 20 69 6e 74 20 69 50 67 20 3d 20 30       int iPg = 0
27fe0 3b 0a 20 20 20 20 20 20 69 36 34 20 69 4b 65 79  ;.      i64 iKey
27ff0 3b 0a 0a 20 20 20 20 20 20 66 6f 72 28 70 44 6c  ;..      for(pDl
28000 69 64 78 3d 66 74 73 35 44 6c 69 64 78 49 74 65  idx=fts5DlidxIte
28010 72 49 6e 69 74 28 70 2c 20 30 2c 20 69 53 65 67  rInit(p, 0, iSeg
28020 69 64 2c 20 69 49 64 78 4c 65 61 66 29 3b 0a 20  id, iIdxLeaf);. 
28030 20 20 20 20 20 20 20 20 20 66 74 73 35 44 6c 69           fts5Dli
28040 64 78 49 74 65 72 45 6f 66 28 70 2c 20 70 44 6c  dxIterEof(p, pDl
28050 69 64 78 29 3d 3d 30 3b 0a 20 20 20 20 20 20 20  idx)==0;.       
28060 20 20 20 66 74 73 35 44 6c 69 64 78 49 74 65 72     fts5DlidxIter
28070 4e 65 78 74 28 70 2c 20 70 44 6c 69 64 78 29 0a  Next(p, pDlidx).
28080 20 20 20 20 20 20 29 7b 0a 0a 20 20 20 20 20 20        ){..      
28090 20 20 2f 2a 20 43 68 65 63 6b 20 61 6e 79 20 72    /* Check any r
280a0 6f 77 69 64 2d 6c 65 73 73 20 70 61 67 65 73 20  owid-less pages 
280b0 74 68 61 74 20 6f 63 63 75 72 20 62 65 66 6f 72  that occur befor
280c0 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c 65  e the current le
280d0 61 66 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 66  af. */.        f
280e0 6f 72 28 69 50 67 3d 69 50 72 65 76 4c 65 61 66  or(iPg=iPrevLeaf
280f0 2b 31 3b 20 69 50 67 3c 66 74 73 35 44 6c 69 64  +1; iPg<fts5Dlid
28100 78 49 74 65 72 50 67 6e 6f 28 70 44 6c 69 64 78  xIterPgno(pDlidx
28110 29 3b 20 69 50 67 2b 2b 29 7b 0a 20 20 20 20 20  ); iPg++){.     
28120 20 20 20 20 20 69 4b 65 79 20 3d 20 46 54 53 35       iKey = FTS5
28130 5f 53 45 47 4d 45 4e 54 5f 52 4f 57 49 44 28 69  _SEGMENT_ROWID(i
28140 53 65 67 69 64 2c 20 69 50 67 29 3b 0a 20 20 20  Segid, iPg);.   
28150 20 20 20 20 20 20 20 70 4c 65 61 66 20 3d 20 66         pLeaf = f
28160 74 73 35 44 61 74 61 52 65 61 64 28 70 2c 20 69  ts5DataRead(p, i
28170 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20 20 20  Key);.          
28180 69 66 28 20 70 4c 65 61 66 20 29 7b 0a 20 20 20  if( pLeaf ){.   
28190 20 20 20 20 20 20 20 20 20 69 66 28 20 66 74 73           if( fts
281a0 35 4c 65 61 66 46 69 72 73 74 52 6f 77 69 64 4f  5LeafFirstRowidO
281b0 66 66 28 70 4c 65 61 66 29 21 3d 30 20 29 20 70  ff(pLeaf)!=0 ) p
281c0 2d 3e 72 63 20 3d 20 46 54 53 35 5f 43 4f 52 52  ->rc = FTS5_CORR
281d0 55 50 54 3b 0a 20 20 20 20 20 20 20 20 20 20 20  UPT;.           
281e0 20 66 74 73 35 44 61 74 61 52 65 6c 65 61 73 65   fts5DataRelease
281f0 28 70 4c 65 61 66 29 3b 0a 20 20 20 20 20 20 20  (pLeaf);.       
28200 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
28210 20 20 20 20 20 20 20 69 50 72 65 76 4c 65 61 66         iPrevLeaf
28220 20 3d 20 66 74 73 35 44 6c 69 64 78 49 74 65 72   = fts5DlidxIter
28230 50 67 6e 6f 28 70 44 6c 69 64 78 29 3b 0a 0a 20  Pgno(pDlidx);.. 
28240 20 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 20         /* Check 
28250 74 68 61 74 20 74 68 65 20 6c 65 61 66 20 70 61  that the leaf pa
28260 67 65 20 69 6e 64 69 63 61 74 65 64 20 62 79 20  ge indicated by 
28270 74 68 65 20 69 74 65 72 61 74 6f 72 20 72 65 61  the iterator rea
28280 6c 6c 79 20 64 6f 65 73 0a 20 20 20 20 20 20 20  lly does.       
28290 20 2a 2a 20 63 6f 6e 74 61 69 6e 20 74 68 65 20   ** contain the 
282a0 72 6f 77 69 64 20 73 75 67 67 65 73 74 65 64 20  rowid suggested 
282b0 62 79 20 74 68 65 20 73 61 6d 65 2e 20 2a 2f 0a  by the same. */.
282c0 20 20 20 20 20 20 20 20 69 4b 65 79 20 3d 20 46          iKey = F
282d0 54 53 35 5f 53 45 47 4d 45 4e 54 5f 52 4f 57 49  TS5_SEGMENT_ROWI
282e0 44 28 69 53 65 67 69 64 2c 20 69 50 72 65 76 4c  D(iSegid, iPrevL
282f0 65 61 66 29 3b 0a 20 20 20 20 20 20 20 20 70 4c  eaf);.        pL
28300 65 61 66 20 3d 20 66 74 73 35 44 61 74 61 52 65  eaf = fts5DataRe
28310 61 64 28 70 2c 20 69 4b 65 79 29 3b 0a 20 20 20  ad(p, iKey);.   
28320 20 20 20 20 20 69 66 28 20 70 4c 65 61 66 20 29       if( pLeaf )
28330 7b 0a 20 20 20 20 20 20 20 20 20 20 69 36 34 20  {.          i64 
28340 69 52 6f 77 69 64 3b 0a 20 20 20 20 20 20 20 20  iRowid;.        
28350 20 20 69 6e 74 20 69 52 6f 77 69 64 4f 66 66 20    int iRowidOff 
28360 3d 20 66 74 73 35 4c 65 61 66 46 69 72 73 74 52  = fts5LeafFirstR
28370 6f 77 69 64 4f 66 66 28 70 4c 65 61 66 29 3b 0a  owidOff(pLeaf);.
28380 20 20 20 20 20 20 20 20 20 20 41 53 53 45 52 54            ASSERT
28390 5f 53 5a 4c 45 41 46 5f 4f 4b 28 70 4c 65 61 66  _SZLEAF_OK(pLeaf
283a0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
283b0 20 69 52 6f 77 69 64 4f 66 66 3e 3d 70 4c 65 61   iRowidOff>=pLea
283c0 66 2d 3e 73 7a 4c 65 61 66 20 29 7b 0a 20 20 20  f->szLeaf ){.   
283d0 20 20 20 20 20 20 20 20 20 70 2d 3e 72 63 20 3d           p->rc =
283e0 20 46 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20   FTS5_CORRUPT;. 
283f0 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
28400 20 20 20 20 20 20 20 20 20 20 20 20 66 74 73 35              fts5
28410 47 65 74 56 61 72 69 6e 74 28 26 70 4c 65 61 66  GetVarint(&pLeaf
28420 2d 3e 70 5b 69 52 6f 77 69 64 4f 66 66 5d 2c 20  ->p[iRowidOff], 
28430 28 75 36 34 2a 29 26 69 52 6f 77 69 64 29 3b 0a  (u64*)&iRowid);.
28440 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
28450 69 52 6f 77 69 64 21 3d 66 74 73 35 44 6c 69 64  iRowid!=fts5Dlid
28460 78 49 74 65 72 52 6f 77 69 64 28 70 44 6c 69 64  xIterRowid(pDlid
28470 78 29 20 29 20 70 2d 3e 72 63 20 3d 20 46 54 53  x) ) p->rc = FTS
28480 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20 20 20  5_CORRUPT;.     
28490 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
284a0 20 66 74 73 35 44 61 74 61 52 65 6c 65 61 73 65   fts5DataRelease
284b0 28 70 4c 65 61 66 29 3b 0a 20 20 20 20 20 20 20  (pLeaf);.       
284c0 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20   }.      }..    
284d0 20 20 69 44 6c 69 64 78 50 72 65 76 4c 65 61 66    iDlidxPrevLeaf
284e0 20 3d 20 69 50 67 3b 0a 20 20 20 20 20 20 66 74   = iPg;.      ft
284f0 73 35 44 6c 69 64 78 49 74 65 72 46 72 65 65 28  s5DlidxIterFree(
28500 70 44 6c 69 64 78 29 3b 0a 20 20 20 20 20 20 66  pDlidx);.      f
28510 74 73 35 54 65 73 74 44 6c 69 64 78 52 65 76 65  ts5TestDlidxReve
28520 72 73 65 28 70 2c 20 69 53 65 67 69 64 2c 20 69  rse(p, iSegid, i
28530 49 64 78 4c 65 61 66 29 3b 0a 20 20 20 20 7d 65  IdxLeaf);.    }e
28540 6c 73 65 7b 0a 20 20 20 20 20 20 69 44 6c 69 64  lse{.      iDlid
28550 78 50 72 65 76 4c 65 61 66 20 3d 20 70 53 65 67  xPrevLeaf = pSeg
28560 2d 3e 70 67 6e 6f 4c 61 73 74 3b 0a 20 20 20 20  ->pgnoLast;.    
28570 20 20 2f 2a 20 54 4f 44 4f 3a 20 43 68 65 63 6b    /* TODO: Check
28580 20 74 68 65 72 65 20 69 73 20 6e 6f 20 64 6f 63   there is no doc
28590 6c 69 73 74 20 69 6e 64 65 78 20 2a 2f 0a 20 20  list index */.  
285a0 20 20 7d 0a 0a 20 20 20 20 69 49 64 78 50 72 65    }..    iIdxPre
285b0 76 4c 65 61 66 20 3d 20 69 49 64 78 4c 65 61 66  vLeaf = iIdxLeaf
285c0 3b 0a 20 20 7d 0a 0a 20 20 72 63 32 20 3d 20 73  ;.  }..  rc2 = s
285d0 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28  qlite3_finalize(
285e0 70 53 74 6d 74 29 3b 0a 20 20 69 66 28 20 70 2d  pStmt);.  if( p-
285f0 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  >rc==SQLITE_OK )
28600 20 70 2d 3e 72 63 20 3d 20 72 63 32 3b 0a 0a 20   p->rc = rc2;.. 
28610 20 2f 2a 20 50 61 67 65 20 69 74 65 72 2e 69 4c   /* Page iter.iL
28620 65 61 66 20 6d 75 73 74 20 6e 6f 77 20 62 65 20  eaf must now be 
28630 74 68 65 20 72 69 67 68 74 6d 6f 73 74 20 6c 65  the rightmost le
28640 61 66 2d 70 61 67 65 20 69 6e 20 74 68 65 20 73  af-page in the s
28650 65 67 6d 65 6e 74 20 2a 2f 0a 23 69 66 20 30 0a  egment */.#if 0.
28660 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c    if( p->rc==SQL
28670 49 54 45 5f 4f 4b 20 26 26 20 69 74 65 72 2e 69  ITE_OK && iter.i
28680 4c 65 61 66 21 3d 70 53 65 67 2d 3e 70 67 6e 6f  Leaf!=pSeg->pgno
28690 4c 61 73 74 20 29 7b 0a 20 20 20 20 70 2d 3e 72  Last ){.    p->r
286a0 63 20 3d 20 46 54 53 35 5f 43 4f 52 52 55 50 54  c = FTS5_CORRUPT
286b0 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a  ;.  }.#endif.}..
286c0 0a 2f 2a 0a 2a 2a 20 52 75 6e 20 69 6e 74 65 72  ./*.** Run inter
286d0 6e 61 6c 20 63 68 65 63 6b 73 20 74 6f 20 65 6e  nal checks to en
286e0 73 75 72 65 20 74 68 61 74 20 74 68 65 20 46 54  sure that the FT
286f0 53 20 69 6e 64 65 78 20 28 61 29 20 69 73 20 69  S index (a) is i
28700 6e 74 65 72 6e 61 6c 6c 79 20 0a 2a 2a 20 63 6f  nternally .** co
28710 6e 73 69 73 74 65 6e 74 20 61 6e 64 20 28 62 29  nsistent and (b)
28720 20 63 6f 6e 74 61 69 6e 73 20 65 6e 74 72 69 65   contains entrie
28730 73 20 66 6f 72 20 77 68 69 63 68 20 74 68 65 20  s for which the 
28740 58 4f 52 20 6f 66 20 74 68 65 20 63 68 65 63 6b  XOR of the check
28750 73 75 6d 73 0a 2a 2a 20 61 73 20 63 61 6c 63 75  sums.** as calcu
28760 6c 61 74 65 64 20 62 79 20 66 74 73 35 49 6e 64  lated by fts5Ind
28770 65 78 45 6e 74 72 79 43 6b 73 75 6d 28 29 20 69  exEntryCksum() i
28780 73 20 63 6b 73 75 6d 2e 0a 2a 2a 0a 2a 2a 20 52  s cksum..**.** R
28790 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
287a0 52 55 50 54 20 69 66 20 61 6e 79 20 6f 66 20 74  RUPT if any of t
287b0 68 65 20 69 6e 74 65 72 6e 61 6c 20 63 68 65 63  he internal chec
287c0 6b 73 20 66 61 69 6c 2c 20 6f 72 20 69 66 20 74  ks fail, or if t
287d0 68 65 0a 2a 2a 20 63 68 65 63 6b 73 75 6d 20 64  he.** checksum d
287e0 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68 2e 20 52  oes not match. R
287f0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20  eturn SQLITE_OK 
28800 69 66 20 61 6c 6c 20 63 68 65 63 6b 73 20 70 61  if all checks pa
28810 73 73 20 77 69 74 68 6f 75 74 0a 2a 2a 20 65 72  ss without.** er
28820 72 6f 72 2c 20 6f 72 20 73 6f 6d 65 20 6f 74 68  ror, or some oth
28830 65 72 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20  er SQLite error 
28840 63 6f 64 65 20 69 66 20 61 6e 6f 74 68 65 72 20  code if another 
28850 65 72 72 6f 72 20 28 65 2e 67 2e 20 4f 4f 4d 29  error (e.g. OOM)
28860 0a 2a 2a 20 6f 63 63 75 72 73 2e 0a 2a 2f 0a 69  .** occurs..*/.i
28870 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e  nt sqlite3Fts5In
28880 64 65 78 49 6e 74 65 67 72 69 74 79 43 68 65 63  dexIntegrityChec
28890 6b 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20  k(Fts5Index *p, 
288a0 75 36 34 20 63 6b 73 75 6d 29 7b 0a 20 20 75 36  u64 cksum){.  u6
288b0 34 20 63 6b 73 75 6d 32 20 3d 20 30 3b 20 20 20  4 cksum2 = 0;   
288c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
288d0 20 43 68 65 63 6b 73 75 6d 20 62 61 73 65 64 20   Checksum based 
288e0 6f 6e 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 69  on contents of i
288f0 6e 64 65 78 65 73 20 2a 2f 0a 20 20 46 74 73 35  ndexes */.  Fts5
28900 42 75 66 66 65 72 20 70 6f 73 6c 69 73 74 20 3d  Buffer poslist =
28910 20 7b 30 2c 30 2c 30 7d 3b 20 20 20 2f 2a 20 42   {0,0,0};   /* B
28920 75 66 66 65 72 20 75 73 65 64 20 74 6f 20 68 6f  uffer used to ho
28930 6c 64 20 61 20 70 6f 73 6c 69 73 74 20 2a 2f 0a  ld a poslist */.
28940 20 20 46 74 73 35 49 6e 64 65 78 49 74 65 72 20    Fts5IndexIter 
28950 2a 70 49 74 65 72 3b 20 20 20 20 20 20 20 20 20  *pIter;         
28960 20 20 2f 2a 20 55 73 65 64 20 74 6f 20 69 74 65    /* Used to ite
28970 72 61 74 65 20 74 68 72 6f 75 67 68 20 65 6e 74  rate through ent
28980 69 72 65 20 69 6e 64 65 78 20 2a 2f 0a 20 20 46  ire index */.  F
28990 74 73 35 53 74 72 75 63 74 75 72 65 20 2a 70 53  ts5Structure *pS
289a0 74 72 75 63 74 3b 20 20 20 20 20 20 20 20 20 2f  truct;         /
289b0 2a 20 49 6e 64 65 78 20 73 74 72 75 63 74 75 72  * Index structur
289c0 65 20 2a 2f 0a 0a 20 20 2f 2a 20 55 73 65 64 20  e */..  /* Used 
289d0 62 79 20 65 78 74 72 61 20 69 6e 74 65 72 6e 61  by extra interna
289e0 6c 20 74 65 73 74 73 20 6f 6e 6c 79 20 72 75 6e  l tests only run
289f0 20 69 66 20 4e 44 45 42 55 47 20 69 73 20 6e 6f   if NDEBUG is no
28a00 74 20 64 65 66 69 6e 65 64 20 2a 2f 0a 20 20 75  t defined */.  u
28a10 36 34 20 63 6b 73 75 6d 33 20 3d 20 30 3b 20 20  64 cksum3 = 0;  
28a20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
28a30 2a 20 43 68 65 63 6b 73 75 6d 20 62 61 73 65 64  * Checksum based
28a40 20 6f 6e 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20   on contents of 
28a50 69 6e 64 65 78 65 73 20 2a 2f 0a 20 20 46 74 73  indexes */.  Fts
28a60 35 42 75 66 66 65 72 20 74 65 72 6d 20 3d 20 7b  5Buffer term = {
28a70 30 2c 30 2c 30 7d 3b 20 20 20 20 20 20 2f 2a 20  0,0,0};      /* 
28a80 42 75 66 66 65 72 20 75 73 65 64 20 74 6f 20 68  Buffer used to h
28a90 6f 6c 64 20 6d 6f 73 74 20 72 65 63 65 6e 74 20  old most recent 
28aa0 74 65 72 6d 20 2a 2f 0a 20 20 0a 20 20 2f 2a 20  term */.  .  /* 
28ab0 4c 6f 61 64 20 74 68 65 20 46 54 53 20 69 6e 64  Load the FTS ind
28ac0 65 78 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a  ex structure */.
28ad0 20 20 70 53 74 72 75 63 74 20 3d 20 66 74 73 35    pStruct = fts5
28ae0 53 74 72 75 63 74 75 72 65 52 65 61 64 28 70 29  StructureRead(p)
28af0 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 68  ;..  /* Check th
28b00 61 74 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20  at the internal 
28b10 6e 6f 64 65 73 20 6f 66 20 65 61 63 68 20 73 65  nodes of each se
28b20 67 6d 65 6e 74 20 6d 61 74 63 68 20 74 68 65 20  gment match the 
28b30 6c 65 61 76 65 73 20 2a 2f 0a 20 20 69 66 28 20  leaves */.  if( 
28b40 70 53 74 72 75 63 74 20 29 7b 0a 20 20 20 20 69  pStruct ){.    i
28b50 6e 74 20 69 4c 76 6c 2c 20 69 53 65 67 3b 0a 20  nt iLvl, iSeg;. 
28b60 20 20 20 66 6f 72 28 69 4c 76 6c 3d 30 3b 20 69     for(iLvl=0; i
28b70 4c 76 6c 3c 70 53 74 72 75 63 74 2d 3e 6e 4c 65  Lvl<pStruct->nLe
28b80 76 65 6c 3b 20 69 4c 76 6c 2b 2b 29 7b 0a 20 20  vel; iLvl++){.  
28b90 20 20 20 20 66 6f 72 28 69 53 65 67 3d 30 3b 20      for(iSeg=0; 
28ba0 69 53 65 67 3c 70 53 74 72 75 63 74 2d 3e 61 4c  iSeg<pStruct->aL
28bb0 65 76 65 6c 5b 69 4c 76 6c 5d 2e 6e 53 65 67 3b  evel[iLvl].nSeg;
28bc0 20 69 53 65 67 2b 2b 29 7b 0a 20 20 20 20 20 20   iSeg++){.      
28bd0 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65 53    Fts5StructureS
28be0 65 67 6d 65 6e 74 20 2a 70 53 65 67 20 3d 20 26  egment *pSeg = &
28bf0 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b  pStruct->aLevel[
28c00 69 4c 76 6c 5d 2e 61 53 65 67 5b 69 53 65 67 5d  iLvl].aSeg[iSeg]
28c10 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35 49 6e  ;.        fts5In
28c20 64 65 78 49 6e 74 65 67 72 69 74 79 43 68 65 63  dexIntegrityChec
28c30 6b 53 65 67 6d 65 6e 74 28 70 2c 20 70 53 65 67  kSegment(p, pSeg
28c40 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
28c50 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 63  .  }..  /* The c
28c60 6b 73 75 6d 20 61 72 67 75 6d 65 6e 74 20 70 61  ksum argument pa
28c70 73 73 65 64 20 74 6f 20 74 68 69 73 20 66 75 6e  ssed to this fun
28c80 63 74 69 6f 6e 20 69 73 20 61 20 63 68 65 63 6b  ction is a check
28c90 73 75 6d 20 63 61 6c 63 75 6c 61 74 65 64 0a 20  sum calculated. 
28ca0 20 2a 2a 20 62 61 73 65 64 20 6f 6e 20 61 6c 6c   ** based on all
28cb0 20 65 78 70 65 63 74 65 64 20 65 6e 74 72 69 65   expected entrie
28cc0 73 20 69 6e 20 74 68 65 20 46 54 53 20 69 6e 64  s in the FTS ind
28cd0 65 78 20 28 69 6e 63 6c 75 64 69 6e 67 20 70 72  ex (including pr
28ce0 65 66 69 78 20 69 6e 64 65 78 0a 20 20 2a 2a 20  efix index.  ** 
28cf0 65 6e 74 72 69 65 73 29 2e 20 54 68 69 73 20 62  entries). This b
28d00 6c 6f 63 6b 20 63 68 65 63 6b 73 20 74 68 61 74  lock checks that
28d10 20 61 20 63 68 65 63 6b 73 75 6d 20 63 61 6c 63   a checksum calc
28d20 75 6c 61 74 65 64 20 62 61 73 65 64 20 6f 6e 20  ulated based on 
28d30 74 68 65 0a 20 20 2a 2a 20 61 63 74 75 61 6c 20  the.  ** actual 
28d40 63 6f 6e 74 65 6e 74 73 20 6f 66 20 46 54 53 20  contents of FTS 
28d50 69 6e 64 65 78 20 69 73 20 69 64 65 6e 74 69 63  index is identic
28d60 61 6c 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 77  al..  **.  ** Tw
28d70 6f 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 74 68  o versions of th
28d80 65 20 73 61 6d 65 20 63 68 65 63 6b 73 75 6d 20  e same checksum 
28d90 61 72 65 20 63 61 6c 63 75 6c 61 74 65 64 2e 20  are calculated. 
28da0 54 68 65 20 66 69 72 73 74 20 28 73 74 61 63 6b  The first (stack
28db0 0a 20 20 2a 2a 20 76 61 72 69 61 62 6c 65 20 63  .  ** variable c
28dc0 6b 73 75 6d 32 29 20 62 61 73 65 64 20 6f 6e 20  ksum2) based on 
28dd0 65 6e 74 72 69 65 73 20 65 78 74 72 61 63 74 65  entries extracte
28de0 64 20 66 72 6f 6d 20 74 68 65 20 66 75 6c 6c 2d  d from the full-
28df0 74 65 78 74 20 69 6e 64 65 78 0a 20 20 2a 2a 20  text index.  ** 
28e00 77 68 69 6c 65 20 64 6f 69 6e 67 20 61 20 6c 69  while doing a li
28e10 6e 65 61 72 20 73 63 61 6e 20 6f 66 20 65 61 63  near scan of eac
28e20 68 20 69 6e 64 69 76 69 64 75 61 6c 20 69 6e 64  h individual ind
28e30 65 78 20 69 6e 20 74 75 72 6e 2e 20 0a 20 20 2a  ex in turn. .  *
28e40 2a 0a 20 20 2a 2a 20 41 73 20 65 61 63 68 20 74  *.  ** As each t
28e50 65 72 6d 20 76 69 73 69 74 65 64 20 62 79 20 74  erm visited by t
28e60 68 65 20 6c 69 6e 65 61 72 20 73 63 61 6e 73 2c  he linear scans,
28e70 20 61 20 73 65 70 61 72 61 74 65 20 71 75 65 72   a separate quer
28e80 79 20 66 6f 72 20 74 68 65 0a 20 20 2a 2a 20 73  y for the.  ** s
28e90 61 6d 65 20 74 65 72 6d 20 69 73 20 70 65 72 66  ame term is perf
28ea0 6f 72 6d 65 64 2e 20 63 6b 73 75 6d 33 20 69 73  ormed. cksum3 is
28eb0 20 63 61 6c 63 75 6c 61 74 65 64 20 62 61 73 65   calculated base
28ec0 64 20 6f 6e 20 74 68 65 20 65 6e 74 72 69 65 73  d on the entries
28ed0 0a 20 20 2a 2a 20 65 78 74 72 61 63 74 65 64 20  .  ** extracted 
28ee0 62 79 20 74 68 65 73 65 20 71 75 65 72 69 65 73  by these queries
28ef0 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 66 74 73  ..  */.  for(fts
28f00 35 4d 75 6c 74 69 49 74 65 72 4e 65 77 28 70 2c  5MultiIterNew(p,
28f10 20 70 53 74 72 75 63 74 2c 20 30 2c 20 30 2c 20   pStruct, 0, 0, 
28f20 30 2c 20 30 2c 20 2d 31 2c 20 30 2c 20 26 70 49  0, 0, -1, 0, &pI
28f30 74 65 72 29 3b 0a 20 20 20 20 20 20 66 74 73 35  ter);.      fts5
28f40 4d 75 6c 74 69 49 74 65 72 45 6f 66 28 70 2c 20  MultiIterEof(p, 
28f50 70 49 74 65 72 29 3d 3d 30 3b 0a 20 20 20 20 20  pIter)==0;.     
28f60 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 4e 65   fts5MultiIterNe
28f70 78 74 28 70 2c 20 70 49 74 65 72 2c 20 30 2c 20  xt(p, pIter, 0, 
28f80 30 29 0a 20 20 29 7b 0a 20 20 20 20 69 6e 74 20  0).  ){.    int 
28f90 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n;              
28fa0 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
28fb0 6f 66 20 74 65 72 6d 20 69 6e 20 62 79 74 65 73  of term in bytes
28fc0 20 2a 2f 0a 20 20 20 20 69 36 34 20 69 50 6f 73   */.    i64 iPos
28fd0 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
28fe0 20 20 20 20 2f 2a 20 50 6f 73 69 74 69 6f 6e 20      /* Position 
28ff0 72 65 61 64 20 66 72 6f 6d 20 70 6f 73 6c 69 73  read from poslis
29000 74 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 4f 66  t */.    int iOf
29010 66 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  f = 0;          
29020 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 77       /* Offset w
29030 69 74 68 69 6e 20 70 6f 73 6c 69 73 74 20 2a 2f  ithin poslist */
29040 0a 20 20 20 20 69 36 34 20 69 52 6f 77 69 64 20  .    i64 iRowid 
29050 3d 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 52  = fts5MultiIterR
29060 6f 77 69 64 28 70 49 74 65 72 29 3b 0a 20 20 20  owid(pIter);.   
29070 20 63 68 61 72 20 2a 7a 20 3d 20 28 63 68 61 72   char *z = (char
29080 2a 29 66 74 73 35 4d 75 6c 74 69 49 74 65 72 54  *)fts5MultiIterT
29090 65 72 6d 28 70 49 74 65 72 2c 20 26 6e 29 3b 0a  erm(pIter, &n);.
290a0 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20  .    /* If this 
290b0 69 73 20 61 20 6e 65 77 20 74 65 72 6d 2c 20 71  is a new term, q
290c0 75 65 72 79 20 66 6f 72 20 69 74 2e 20 55 70 64  uery for it. Upd
290d0 61 74 65 20 63 6b 73 75 6d 33 20 77 69 74 68 20  ate cksum3 with 
290e0 74 68 65 20 72 65 73 75 6c 74 73 2e 20 2a 2f 0a  the results. */.
290f0 20 20 20 20 66 74 73 35 54 65 73 74 54 65 72 6d      fts5TestTerm
29100 28 70 2c 20 26 74 65 72 6d 2c 20 7a 2c 20 6e 2c  (p, &term, z, n,
29110 20 63 6b 73 75 6d 32 2c 20 26 63 6b 73 75 6d 33   cksum2, &cksum3
29120 29 3b 0a 0a 20 20 20 20 70 6f 73 6c 69 73 74 2e  );..    poslist.
29130 6e 20 3d 20 30 3b 0a 20 20 20 20 66 74 73 35 53  n = 0;.    fts5S
29140 65 67 69 74 65 72 50 6f 73 6c 69 73 74 28 70 2c  egiterPoslist(p,
29150 20 26 70 49 74 65 72 2d 3e 61 53 65 67 5b 70 49   &pIter->aSeg[pI
29160 74 65 72 2d 3e 61 46 69 72 73 74 5b 31 5d 2e 69  ter->aFirst[1].i
29170 46 69 72 73 74 5d 20 2c 20 30 2c 20 26 70 6f 73  First] , 0, &pos
29180 6c 69 73 74 29 3b 0a 20 20 20 20 77 68 69 6c 65  list);.    while
29190 28 20 30 3d 3d 73 71 6c 69 74 65 33 46 74 73 35  ( 0==sqlite3Fts5
291a0 50 6f 73 6c 69 73 74 4e 65 78 74 36 34 28 70 6f  PoslistNext64(po
291b0 73 6c 69 73 74 2e 70 2c 20 70 6f 73 6c 69 73 74  slist.p, poslist
291c0 2e 6e 2c 20 26 69 4f 66 66 2c 20 26 69 50 6f 73  .n, &iOff, &iPos
291d0 29 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  ) ){.      int i
291e0 43 6f 6c 20 3d 20 46 54 53 35 5f 50 4f 53 32 43  Col = FTS5_POS2C
291f0 4f 4c 55 4d 4e 28 69 50 6f 73 29 3b 0a 20 20 20  OLUMN(iPos);.   
29200 20 20 20 69 6e 74 20 69 54 6f 6b 4f 66 66 20 3d     int iTokOff =
29210 20 46 54 53 35 5f 50 4f 53 32 4f 46 46 53 45 54   FTS5_POS2OFFSET
29220 28 69 50 6f 73 29 3b 0a 20 20 20 20 20 20 63 6b  (iPos);.      ck
29230 73 75 6d 32 20 5e 3d 20 66 74 73 35 49 6e 64 65  sum2 ^= fts5Inde
29240 78 45 6e 74 72 79 43 6b 73 75 6d 28 69 52 6f 77  xEntryCksum(iRow
29250 69 64 2c 20 69 43 6f 6c 2c 20 69 54 6f 6b 4f 66  id, iCol, iTokOf
29260 66 2c 20 2d 31 2c 20 7a 2c 20 6e 29 3b 0a 20 20  f, -1, z, n);.  
29270 20 20 7d 0a 20 20 7d 0a 20 20 66 74 73 35 54 65    }.  }.  fts5Te
29280 73 74 54 65 72 6d 28 70 2c 20 26 74 65 72 6d 2c  stTerm(p, &term,
29290 20 30 2c 20 30 2c 20 63 6b 73 75 6d 32 2c 20 26   0, 0, cksum2, &
292a0 63 6b 73 75 6d 33 29 3b 0a 0a 20 20 66 74 73 35  cksum3);..  fts5
292b0 4d 75 6c 74 69 49 74 65 72 46 72 65 65 28 70 2c  MultiIterFree(p,
292c0 20 70 49 74 65 72 29 3b 0a 20 20 69 66 28 20 70   pIter);.  if( p
292d0 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
292e0 26 26 20 63 6b 73 75 6d 21 3d 63 6b 73 75 6d 32  && cksum!=cksum2
292f0 20 29 20 70 2d 3e 72 63 20 3d 20 46 54 53 35 5f   ) p->rc = FTS5_
29300 43 4f 52 52 55 50 54 3b 0a 0a 20 20 66 74 73 35  CORRUPT;..  fts5
29310 53 74 72 75 63 74 75 72 65 52 65 6c 65 61 73 65  StructureRelease
29320 28 70 53 74 72 75 63 74 29 3b 0a 20 20 66 74 73  (pStruct);.  fts
29330 35 42 75 66 66 65 72 46 72 65 65 28 26 74 65 72  5BufferFree(&ter
29340 6d 29 3b 0a 20 20 66 74 73 35 42 75 66 66 65 72  m);.  fts5Buffer
29350 46 72 65 65 28 26 70 6f 73 6c 69 73 74 29 3b 0a  Free(&poslist);.
29360 20 20 72 65 74 75 72 6e 20 66 74 73 35 49 6e 64    return fts5Ind
29370 65 78 52 65 74 75 72 6e 28 70 29 3b 0a 7d 0a 0a  exReturn(p);.}..
29380 0a 2f 2a 0a 2a 2a 20 43 61 6c 63 75 6c 61 74 65  ./*.** Calculate
29390 20 61 6e 64 20 72 65 74 75 72 6e 20 61 20 63 68   and return a ch
293a0 65 63 6b 73 75 6d 20 74 68 61 74 20 69 73 20 74  ecksum that is t
293b0 68 65 20 58 4f 52 20 6f 66 20 74 68 65 20 69 6e  he XOR of the in
293c0 64 65 78 20 65 6e 74 72 79 0a 2a 2a 20 63 68 65  dex entry.** che
293d0 63 6b 73 75 6d 20 6f 66 20 61 6c 6c 20 65 6e 74  cksum of all ent
293e0 72 69 65 73 20 74 68 61 74 20 77 6f 75 6c 64 20  ries that would 
293f0 62 65 20 67 65 6e 65 72 61 74 65 64 20 62 79 20  be generated by 
29400 74 68 65 20 74 6f 6b 65 6e 20 73 70 65 63 69 66  the token specif
29410 69 65 64 0a 2a 2a 20 62 79 20 74 68 65 20 66 69  ied.** by the fi
29420 6e 61 6c 20 35 20 61 72 67 75 6d 65 6e 74 73 2e  nal 5 arguments.
29430 0a 2a 2f 0a 75 36 34 20 73 71 6c 69 74 65 33 46  .*/.u64 sqlite3F
29440 74 73 35 49 6e 64 65 78 43 6b 73 75 6d 28 0a 20  ts5IndexCksum(. 
29450 20 46 74 73 35 43 6f 6e 66 69 67 20 2a 70 43 6f   Fts5Config *pCo
29460 6e 66 69 67 2c 20 20 20 20 20 20 20 20 20 20 20  nfig,           
29470 20 2f 2a 20 43 6f 6e 66 69 67 75 72 61 74 69 6f   /* Configuratio
29480 6e 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69 36  n object */.  i6
29490 34 20 69 52 6f 77 69 64 2c 20 20 20 20 20 20 20  4 iRowid,       
294a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
294b0 20 44 6f 63 75 6d 65 6e 74 20 74 65 72 6d 20 61   Document term a
294c0 70 70 65 61 72 73 20 69 6e 20 2a 2f 0a 20 20 69  ppears in */.  i
294d0 6e 74 20 69 43 6f 6c 2c 20 20 20 20 20 20 20 20  nt iCol,        
294e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
294f0 2a 20 43 6f 6c 75 6d 6e 20 74 65 72 6d 20 61 70  * Column term ap
29500 70 65 61 72 73 20 69 6e 20 2a 2f 0a 20 20 69 6e  pears in */.  in
29510 74 20 69 50 6f 73 2c 20 20 20 20 20 20 20 20 20  t iPos,         
29520 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
29530 20 50 6f 73 69 74 69 6f 6e 20 74 65 72 6d 20 61   Position term a
29540 70 70 65 61 72 73 20 69 6e 20 2a 2f 0a 20 20 63  ppears in */.  c
29550 6f 6e 73 74 20 63 68 61 72 20 2a 70 54 65 72 6d  onst char *pTerm
29560 2c 20 69 6e 74 20 6e 54 65 72 6d 20 20 20 20 2f  , int nTerm    /
29570 2a 20 54 65 72 6d 20 61 74 20 69 50 6f 73 20 2a  * Term at iPos *
29580 2f 0a 29 7b 0a 20 20 75 36 34 20 72 65 74 20 3d  /.){.  u64 ret =
29590 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
295a0 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
295b0 20 76 61 6c 75 65 20 2a 2f 0a 20 20 69 6e 74 20   value */.  int 
295c0 69 49 64 78 3b 20 20 20 20 20 20 20 20 20 20 20  iIdx;           
295d0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
295e0 6f 72 20 69 74 65 72 61 74 69 6e 67 20 74 68 72  or iterating thr
295f0 6f 75 67 68 20 69 6e 64 65 78 65 73 20 2a 2f 0a  ough indexes */.
29600 0a 20 20 72 65 74 20 3d 20 66 74 73 35 49 6e 64  .  ret = fts5Ind
29610 65 78 45 6e 74 72 79 43 6b 73 75 6d 28 69 52 6f  exEntryCksum(iRo
29620 77 69 64 2c 20 69 43 6f 6c 2c 20 69 50 6f 73 2c  wid, iCol, iPos,
29630 20 30 2c 20 70 54 65 72 6d 2c 20 6e 54 65 72 6d   0, pTerm, nTerm
29640 29 3b 0a 0a 20 20 66 6f 72 28 69 49 64 78 3d 30  );..  for(iIdx=0
29650 3b 20 69 49 64 78 3c 70 43 6f 6e 66 69 67 2d 3e  ; iIdx<pConfig->
29660 6e 50 72 65 66 69 78 3b 20 69 49 64 78 2b 2b 29  nPrefix; iIdx++)
29670 7b 0a 20 20 20 20 69 6e 74 20 6e 42 79 74 65 20  {.    int nByte 
29680 3d 20 66 74 73 35 49 6e 64 65 78 43 68 61 72 6c  = fts5IndexCharl
29690 65 6e 54 6f 42 79 74 65 6c 65 6e 28 70 54 65 72  enToBytelen(pTer
296a0 6d 2c 20 6e 54 65 72 6d 2c 20 70 43 6f 6e 66 69  m, nTerm, pConfi
296b0 67 2d 3e 61 50 72 65 66 69 78 5b 69 49 64 78 5d  g->aPrefix[iIdx]
296c0 29 3b 0a 20 20 20 20 69 66 28 20 6e 42 79 74 65  );.    if( nByte
296d0 20 29 7b 0a 20 20 20 20 20 20 72 65 74 20 5e 3d   ){.      ret ^=
296e0 20 66 74 73 35 49 6e 64 65 78 45 6e 74 72 79 43   fts5IndexEntryC
296f0 6b 73 75 6d 28 69 52 6f 77 69 64 2c 20 69 43 6f  ksum(iRowid, iCo
29700 6c 2c 20 69 50 6f 73 2c 20 69 49 64 78 2b 31 2c  l, iPos, iIdx+1,
29710 20 70 54 65 72 6d 2c 20 6e 42 79 74 65 29 3b 0a   pTerm, nByte);.
29720 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74      }.  }..  ret
29730 75 72 6e 20 72 65 74 3b 0a 7d 0a 0a 2f 2a 2a 2a  urn ret;.}../***
29740 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
29750 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
29760 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
29770 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
29780 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ******.*********
29790 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
297a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
297b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
297c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
297d0 2a 0a 2a 2a 20 42 65 6c 6f 77 20 74 68 69 73 20  *.** Below this 
297e0 70 6f 69 6e 74 20 69 73 20 74 68 65 20 69 6d 70  point is the imp
297f0 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74  lementation of t
29800 68 65 20 66 74 73 35 5f 64 65 63 6f 64 65 28 29  he fts5_decode()
29810 20 73 63 61 6c 61 72 0a 2a 2a 20 66 75 6e 63 74   scalar.** funct
29820 69 6f 6e 20 6f 6e 6c 79 2e 0a 2a 2f 0a 0a 2f 2a  ion only..*/../*
29830 0a 2a 2a 20 44 65 63 6f 64 65 20 61 20 73 65 67  .** Decode a seg
29840 6d 65 6e 74 2d 64 61 74 61 20 72 6f 77 69 64 20  ment-data rowid 
29850 66 72 6f 6d 20 74 68 65 20 25 5f 64 61 74 61 20  from the %_data 
29860 74 61 62 6c 65 2e 20 54 68 69 73 20 66 75 6e 63  table. This func
29870 74 69 6f 6e 20 69 73 0a 2a 2a 20 74 68 65 20 6f  tion is.** the o
29880 70 70 6f 73 69 74 65 20 6f 66 20 6d 61 63 72 6f  pposite of macro
29890 20 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f 52 4f   FTS5_SEGMENT_RO
298a0 57 49 44 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63  WID()..*/.static
298b0 20 76 6f 69 64 20 66 74 73 35 44 65 63 6f 64 65   void fts5Decode
298c0 52 6f 77 69 64 28 0a 20 20 69 36 34 20 69 52 6f  Rowid(.  i64 iRo
298d0 77 69 64 2c 20 20 20 20 20 20 20 20 20 20 20 20  wid,            
298e0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 77 69           /* Rowi
298f0 64 20 66 72 6f 6d 20 25 5f 64 61 74 61 20 74 61  d from %_data ta
29900 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 69  ble */.  int *pi
29910 53 65 67 69 64 2c 20 20 20 20 20 20 20 20 20 20  Segid,          
29920 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a           /* OUT:
29930 20 53 65 67 6d 65 6e 74 20 69 64 20 2a 2f 0a 20   Segment id */. 
29940 20 69 6e 74 20 2a 70 62 44 6c 69 64 78 2c 20 20   int *pbDlidx,  
29950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29960 20 2f 2a 20 4f 55 54 3a 20 44 6c 69 64 78 20 66   /* OUT: Dlidx f
29970 6c 61 67 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 69  lag */.  int *pi
29980 48 65 69 67 68 74 2c 20 20 20 20 20 20 20 20 20  Height,         
29990 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a           /* OUT:
299a0 20 48 65 69 67 68 74 20 2a 2f 0a 20 20 69 6e 74   Height */.  int
299b0 20 2a 70 69 50 67 6e 6f 20 20 20 20 20 20 20 20   *piPgno        
299c0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
299d0 4f 55 54 3a 20 50 61 67 65 20 6e 75 6d 62 65 72  OUT: Page number
299e0 20 2a 2f 0a 29 7b 0a 20 20 2a 70 69 50 67 6e 6f   */.){.  *piPgno
299f0 20 3d 20 28 69 6e 74 29 28 69 52 6f 77 69 64 20   = (int)(iRowid 
29a00 26 20 28 28 28 69 36 34 29 31 20 3c 3c 20 46 54  & (((i64)1 << FT
29a10 53 35 5f 44 41 54 41 5f 50 41 47 45 5f 42 29 20  S5_DATA_PAGE_B) 
29a20 2d 20 31 29 29 3b 0a 20 20 69 52 6f 77 69 64 20  - 1));.  iRowid 
29a30 3e 3e 3d 20 46 54 53 35 5f 44 41 54 41 5f 50 41  >>= FTS5_DATA_PA
29a40 47 45 5f 42 3b 0a 0a 20 20 2a 70 69 48 65 69 67  GE_B;..  *piHeig
29a50 68 74 20 3d 20 28 69 6e 74 29 28 69 52 6f 77 69  ht = (int)(iRowi
29a60 64 20 26 20 28 28 28 69 36 34 29 31 20 3c 3c 20  d & (((i64)1 << 
29a70 46 54 53 35 5f 44 41 54 41 5f 48 45 49 47 48 54  FTS5_DATA_HEIGHT
29a80 5f 42 29 20 2d 20 31 29 29 3b 0a 20 20 69 52 6f  _B) - 1));.  iRo
29a90 77 69 64 20 3e 3e 3d 20 46 54 53 35 5f 44 41 54  wid >>= FTS5_DAT
29aa0 41 5f 48 45 49 47 48 54 5f 42 3b 0a 0a 20 20 2a  A_HEIGHT_B;..  *
29ab0 70 62 44 6c 69 64 78 20 3d 20 28 69 6e 74 29 28  pbDlidx = (int)(
29ac0 69 52 6f 77 69 64 20 26 20 30 78 30 30 30 31 29  iRowid & 0x0001)
29ad0 3b 0a 20 20 69 52 6f 77 69 64 20 3e 3e 3d 20 46  ;.  iRowid >>= F
29ae0 54 53 35 5f 44 41 54 41 5f 44 4c 49 5f 42 3b 0a  TS5_DATA_DLI_B;.
29af0 0a 20 20 2a 70 69 53 65 67 69 64 20 3d 20 28 69  .  *piSegid = (i
29b00 6e 74 29 28 69 52 6f 77 69 64 20 26 20 28 28 28  nt)(iRowid & (((
29b10 69 36 34 29 31 20 3c 3c 20 46 54 53 35 5f 44 41  i64)1 << FTS5_DA
29b20 54 41 5f 49 44 5f 42 29 20 2d 20 31 29 29 3b 0a  TA_ID_B) - 1));.
29b30 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  }..static void f
29b40 74 73 35 44 65 62 75 67 52 6f 77 69 64 28 69 6e  ts5DebugRowid(in
29b50 74 20 2a 70 52 63 2c 20 46 74 73 35 42 75 66 66  t *pRc, Fts5Buff
29b60 65 72 20 2a 70 42 75 66 2c 20 69 36 34 20 69 4b  er *pBuf, i64 iK
29b70 65 79 29 7b 0a 20 20 69 6e 74 20 69 53 65 67 69  ey){.  int iSegi
29b80 64 2c 20 69 48 65 69 67 68 74 2c 20 69 50 67 6e  d, iHeight, iPgn
29b90 6f 2c 20 62 44 6c 69 64 78 3b 20 20 20 20 20 20  o, bDlidx;      
29ba0 20 2f 2a 20 52 6f 77 69 64 20 63 6f 6d 70 65 6e   /* Rowid compen
29bb0 65 6e 74 73 20 2a 2f 0a 20 20 66 74 73 35 44 65  ents */.  fts5De
29bc0 63 6f 64 65 52 6f 77 69 64 28 69 4b 65 79 2c 20  codeRowid(iKey, 
29bd0 26 69 53 65 67 69 64 2c 20 26 62 44 6c 69 64 78  &iSegid, &bDlidx
29be0 2c 20 26 69 48 65 69 67 68 74 2c 20 26 69 50 67  , &iHeight, &iPg
29bf0 6e 6f 29 3b 0a 0a 20 20 69 66 28 20 69 53 65 67  no);..  if( iSeg
29c00 69 64 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28  id==0 ){.    if(
29c10 20 69 4b 65 79 3d 3d 46 54 53 35 5f 41 56 45 52   iKey==FTS5_AVER
29c20 41 47 45 53 5f 52 4f 57 49 44 20 29 7b 0a 20 20  AGES_ROWID ){.  
29c30 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 42      sqlite3Fts5B
29c40 75 66 66 65 72 41 70 70 65 6e 64 50 72 69 6e 74  ufferAppendPrint
29c50 66 28 70 52 63 2c 20 70 42 75 66 2c 20 22 7b 61  f(pRc, pBuf, "{a
29c60 76 65 72 61 67 65 73 7d 20 22 29 3b 0a 20 20 20  verages} ");.   
29c70 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71   }else{.      sq
29c80 6c 69 74 65 33 46 74 73 35 42 75 66 66 65 72 41  lite3Fts5BufferA
29c90 70 70 65 6e 64 50 72 69 6e 74 66 28 70 52 63 2c  ppendPrintf(pRc,
29ca0 20 70 42 75 66 2c 20 22 7b 73 74 72 75 63 74 75   pBuf, "{structu
29cb0 72 65 7d 22 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  re}");.    }.  }
29cc0 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c  .  else{.    sql
29cd0 69 74 65 33 46 74 73 35 42 75 66 66 65 72 41 70  ite3Fts5BufferAp
29ce0 70 65 6e 64 50 72 69 6e 74 66 28 70 52 63 2c 20  pendPrintf(pRc, 
29cf0 70 42 75 66 2c 20 22 7b 25 73 73 65 67 69 64 3d  pBuf, "{%ssegid=
29d00 25 64 20 68 3d 25 64 20 70 67 6e 6f 3d 25 64 7d  %d h=%d pgno=%d}
29d10 22 2c 0a 20 20 20 20 20 20 20 20 62 44 6c 69 64  ",.        bDlid
29d20 78 20 3f 20 22 64 6c 69 64 78 20 22 20 3a 20 22  x ? "dlidx " : "
29d30 22 2c 20 69 53 65 67 69 64 2c 20 69 48 65 69 67  ", iSegid, iHeig
29d40 68 74 2c 20 69 50 67 6e 6f 0a 20 20 20 20 29 3b  ht, iPgno.    );
29d50 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 76  .  }.}..static v
29d60 6f 69 64 20 66 74 73 35 44 65 62 75 67 53 74 72  oid fts5DebugStr
29d70 75 63 74 75 72 65 28 0a 20 20 69 6e 74 20 2a 70  ucture(.  int *p
29d80 52 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  Rc,             
29d90 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f            /* IN/
29da0 4f 55 54 3a 20 65 72 72 6f 72 20 63 6f 64 65 20  OUT: error code 
29db0 2a 2f 0a 20 20 46 74 73 35 42 75 66 66 65 72 20  */.  Fts5Buffer 
29dc0 2a 70 42 75 66 2c 0a 20 20 46 74 73 35 53 74 72  *pBuf,.  Fts5Str
29dd0 75 63 74 75 72 65 20 2a 70 0a 29 7b 0a 20 20 69  ucture *p.){.  i
29de0 6e 74 20 69 4c 76 6c 2c 20 69 53 65 67 3b 20 20  nt iLvl, iSeg;  
29df0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
29e00 2a 20 49 74 65 72 61 74 65 20 74 68 72 6f 75 67  * Iterate throug
29e10 68 20 6c 65 76 65 6c 73 2c 20 73 65 67 6d 65 6e  h levels, segmen
29e20 74 73 20 2a 2f 0a 0a 20 20 66 6f 72 28 69 4c 76  ts */..  for(iLv
29e30 6c 3d 30 3b 20 69 4c 76 6c 3c 70 2d 3e 6e 4c 65  l=0; iLvl<p->nLe
29e40 76 65 6c 3b 20 69 4c 76 6c 2b 2b 29 7b 0a 20 20  vel; iLvl++){.  
29e50 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65 4c    Fts5StructureL
29e60 65 76 65 6c 20 2a 70 4c 76 6c 20 3d 20 26 70 2d  evel *pLvl = &p-
29e70 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d 3b 0a 20  >aLevel[iLvl];. 
29e80 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 42 75     sqlite3Fts5Bu
29e90 66 66 65 72 41 70 70 65 6e 64 50 72 69 6e 74 66  fferAppendPrintf
29ea0 28 70 52 63 2c 20 70 42 75 66 2c 20 0a 20 20 20  (pRc, pBuf, .   
29eb0 20 20 20 20 20 22 20 7b 6c 76 6c 3d 25 64 20 6e       " {lvl=%d n
29ec0 4d 65 72 67 65 3d 25 64 20 6e 53 65 67 3d 25 64  Merge=%d nSeg=%d
29ed0 22 2c 20 69 4c 76 6c 2c 20 70 4c 76 6c 2d 3e 6e  ", iLvl, pLvl->n
29ee0 4d 65 72 67 65 2c 20 70 4c 76 6c 2d 3e 6e 53 65  Merge, pLvl->nSe
29ef0 67 0a 20 20 20 20 29 3b 0a 20 20 20 20 66 6f 72  g.    );.    for
29f00 28 69 53 65 67 3d 30 3b 20 69 53 65 67 3c 70 4c  (iSeg=0; iSeg<pL
29f10 76 6c 2d 3e 6e 53 65 67 3b 20 69 53 65 67 2b 2b  vl->nSeg; iSeg++
29f20 29 7b 0a 20 20 20 20 20 20 46 74 73 35 53 74 72  ){.      Fts5Str
29f30 75 63 74 75 72 65 53 65 67 6d 65 6e 74 20 2a 70  uctureSegment *p
29f40 53 65 67 20 3d 20 26 70 4c 76 6c 2d 3e 61 53 65  Seg = &pLvl->aSe
29f50 67 5b 69 53 65 67 5d 3b 0a 20 20 20 20 20 20 73  g[iSeg];.      s
29f60 71 6c 69 74 65 33 46 74 73 35 42 75 66 66 65 72  qlite3Fts5Buffer
29f70 41 70 70 65 6e 64 50 72 69 6e 74 66 28 70 52 63  AppendPrintf(pRc
29f80 2c 20 70 42 75 66 2c 20 22 20 7b 69 64 3d 25 64  , pBuf, " {id=%d
29f90 20 6c 65 61 76 65 73 3d 25 64 2e 2e 25 64 7d 22   leaves=%d..%d}"
29fa0 2c 20 0a 20 20 20 20 20 20 20 20 20 20 70 53 65  , .          pSe
29fb0 67 2d 3e 69 53 65 67 69 64 2c 20 70 53 65 67 2d  g->iSegid, pSeg-
29fc0 3e 70 67 6e 6f 46 69 72 73 74 2c 20 70 53 65 67  >pgnoFirst, pSeg
29fd0 2d 3e 70 67 6e 6f 4c 61 73 74 0a 20 20 20 20 20  ->pgnoLast.     
29fe0 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71   );.    }.    sq
29ff0 6c 69 74 65 33 46 74 73 35 42 75 66 66 65 72 41  lite3Fts5BufferA
2a000 70 70 65 6e 64 50 72 69 6e 74 66 28 70 52 63 2c  ppendPrintf(pRc,
2a010 20 70 42 75 66 2c 20 22 7d 22 29 3b 0a 20 20 7d   pBuf, "}");.  }
2a020 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69  .}../*.** This i
2a030 73 20 70 61 72 74 20 6f 66 20 74 68 65 20 66 74  s part of the ft
2a040 73 35 5f 64 65 63 6f 64 65 28 29 20 64 65 62 75  s5_decode() debu
2a050 67 67 69 6e 67 20 61 69 64 2e 0a 2a 2a 0a 2a 2a  gging aid..**.**
2a060 20 41 72 67 75 6d 65 6e 74 73 20 70 42 6c 6f 62   Arguments pBlob
2a070 2f 6e 42 6c 6f 62 20 63 6f 6e 74 61 69 6e 20 61  /nBlob contain a
2a080 20 73 65 72 69 61 6c 69 7a 65 64 20 46 74 73 35   serialized Fts5
2a090 53 74 72 75 63 74 75 72 65 20 6f 62 6a 65 63 74  Structure object
2a0a0 2e 20 54 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69  . This.** functi
2a0b0 6f 6e 20 61 70 70 65 6e 64 73 20 61 20 68 75 6d  on appends a hum
2a0c0 61 6e 2d 72 65 61 64 61 62 6c 65 20 72 65 70 72  an-readable repr
2a0d0 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68  esentation of th
2a0e0 65 20 73 61 6d 65 20 6f 62 6a 65 63 74 0a 2a 2a  e same object.**
2a0f0 20 74 6f 20 74 68 65 20 62 75 66 66 65 72 20 70   to the buffer p
2a100 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63  assed as the sec
2a110 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2e 20 0a 2a  ond argument. .*
2a120 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  /.static void ft
2a130 73 35 44 65 63 6f 64 65 53 74 72 75 63 74 75 72  s5DecodeStructur
2a140 65 28 0a 20 20 69 6e 74 20 2a 70 52 63 2c 20 20  e(.  int *pRc,  
2a150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a160 20 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20       /* IN/OUT: 
2a170 65 72 72 6f 72 20 63 6f 64 65 20 2a 2f 0a 20 20  error code */.  
2a180 46 74 73 35 42 75 66 66 65 72 20 2a 70 42 75 66  Fts5Buffer *pBuf
2a190 2c 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 70 42  ,.  const u8 *pB
2a1a0 6c 6f 62 2c 20 69 6e 74 20 6e 42 6c 6f 62 0a 29  lob, int nBlob.)
2a1b0 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  {.  int rc;     
2a1c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a1d0 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
2a1e0 64 65 20 2a 2f 0a 20 20 46 74 73 35 53 74 72 75  de */.  Fts5Stru
2a1f0 63 74 75 72 65 20 2a 70 20 3d 20 30 3b 20 20 20  cture *p = 0;   
2a200 20 20 20 20 20 20 20 20 2f 2a 20 44 65 63 6f 64          /* Decod
2a210 65 64 20 73 74 72 75 63 74 75 72 65 20 6f 62 6a  ed structure obj
2a220 65 63 74 20 2a 2f 0a 0a 20 20 72 63 20 3d 20 66  ect */..  rc = f
2a230 74 73 35 53 74 72 75 63 74 75 72 65 44 65 63 6f  ts5StructureDeco
2a240 64 65 28 70 42 6c 6f 62 2c 20 6e 42 6c 6f 62 2c  de(pBlob, nBlob,
2a250 20 30 2c 20 26 70 29 3b 0a 20 20 69 66 28 20 72   0, &p);.  if( r
2a260 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
2a270 20 20 20 20 2a 70 52 63 20 3d 20 72 63 3b 0a 20      *pRc = rc;. 
2a280 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a     return;.  }..
2a290 20 20 66 74 73 35 44 65 62 75 67 53 74 72 75 63    fts5DebugStruc
2a2a0 74 75 72 65 28 70 52 63 2c 20 70 42 75 66 2c 20  ture(pRc, pBuf, 
2a2b0 70 29 3b 0a 20 20 66 74 73 35 53 74 72 75 63 74  p);.  fts5Struct
2a2c0 75 72 65 52 65 6c 65 61 73 65 28 70 29 3b 0a 7d  ureRelease(p);.}
2a2d0 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20  ../*.** This is 
2a2e0 70 61 72 74 20 6f 66 20 74 68 65 20 66 74 73 35  part of the fts5
2a2f0 5f 64 65 63 6f 64 65 28 29 20 64 65 62 75 67 67  _decode() debugg
2a300 69 6e 67 20 61 69 64 2e 0a 2a 2a 0a 2a 2a 20 41  ing aid..**.** A
2a310 72 67 75 6d 65 6e 74 73 20 70 42 6c 6f 62 2f 6e  rguments pBlob/n
2a320 42 6c 6f 62 20 63 6f 6e 74 61 69 6e 20 61 6e 20  Blob contain an 
2a330 22 61 76 65 72 61 67 65 73 22 20 72 65 63 6f 72  "averages" recor
2a340 64 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  d. This function
2a350 20 0a 2a 2a 20 61 70 70 65 6e 64 73 20 61 20 68   .** appends a h
2a360 75 6d 61 6e 2d 72 65 61 64 61 62 6c 65 20 72 65  uman-readable re
2a370 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20  presentation of 
2a380 72 65 63 6f 72 64 20 74 6f 20 74 68 65 20 62 75  record to the bu
2a390 66 66 65 72 20 70 61 73 73 65 64 20 0a 2a 2a 20  ffer passed .** 
2a3a0 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72  as the second ar
2a3b0 67 75 6d 65 6e 74 2e 20 0a 2a 2f 0a 73 74 61 74  gument. .*/.stat
2a3c0 69 63 20 76 6f 69 64 20 66 74 73 35 44 65 63 6f  ic void fts5Deco
2a3d0 64 65 41 76 65 72 61 67 65 73 28 0a 20 20 69 6e  deAverages(.  in
2a3e0 74 20 2a 70 52 63 2c 20 20 20 20 20 20 20 20 20  t *pRc,         
2a3f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2a400 20 49 4e 2f 4f 55 54 3a 20 65 72 72 6f 72 20 63   IN/OUT: error c
2a410 6f 64 65 20 2a 2f 0a 20 20 46 74 73 35 42 75 66  ode */.  Fts5Buf
2a420 66 65 72 20 2a 70 42 75 66 2c 0a 20 20 63 6f 6e  fer *pBuf,.  con
2a430 73 74 20 75 38 20 2a 70 42 6c 6f 62 2c 20 69 6e  st u8 *pBlob, in
2a440 74 20 6e 42 6c 6f 62 0a 29 7b 0a 20 20 69 6e 74  t nBlob.){.  int
2a450 20 69 20 3d 20 30 3b 0a 20 20 63 6f 6e 73 74 20   i = 0;.  const 
2a460 63 68 61 72 20 2a 7a 53 70 61 63 65 20 3d 20 22  char *zSpace = "
2a470 22 3b 0a 0a 20 20 77 68 69 6c 65 28 20 69 3c 6e  ";..  while( i<n
2a480 42 6c 6f 62 20 29 7b 0a 20 20 20 20 75 36 34 20  Blob ){.    u64 
2a490 69 56 61 6c 3b 0a 20 20 20 20 69 20 2b 3d 20 73  iVal;.    i += s
2a4a0 71 6c 69 74 65 33 46 74 73 35 47 65 74 56 61 72  qlite3Fts5GetVar
2a4b0 69 6e 74 28 26 70 42 6c 6f 62 5b 69 5d 2c 20 26  int(&pBlob[i], &
2a4c0 69 56 61 6c 29 3b 0a 20 20 20 20 73 71 6c 69 74  iVal);.    sqlit
2a4d0 65 33 46 74 73 35 42 75 66 66 65 72 41 70 70 65  e3Fts5BufferAppe
2a4e0 6e 64 50 72 69 6e 74 66 28 70 52 63 2c 20 70 42  ndPrintf(pRc, pB
2a4f0 75 66 2c 20 22 25 73 25 64 22 2c 20 7a 53 70 61  uf, "%s%d", zSpa
2a500 63 65 2c 20 28 69 6e 74 29 69 56 61 6c 29 3b 0a  ce, (int)iVal);.
2a510 20 20 20 20 7a 53 70 61 63 65 20 3d 20 22 20 22      zSpace = " "
2a520 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42  ;.  }.}../*.** B
2a530 75 66 66 65 72 20 28 61 2f 6e 29 20 69 73 20 61  uffer (a/n) is a
2a540 73 73 75 6d 65 64 20 74 6f 20 63 6f 6e 74 61 69  ssumed to contai
2a550 6e 20 61 20 6c 69 73 74 20 6f 66 20 73 65 72 69  n a list of seri
2a560 61 6c 69 7a 65 64 20 76 61 72 69 6e 74 73 2e 20  alized varints. 
2a570 52 65 61 64 0a 2a 2a 20 65 61 63 68 20 76 61 72  Read.** each var
2a580 69 6e 74 20 61 6e 64 20 61 70 70 65 6e 64 20 69  int and append i
2a590 74 73 20 73 74 72 69 6e 67 20 72 65 70 72 65 73  ts string repres
2a5a0 65 6e 74 61 74 69 6f 6e 20 74 6f 20 62 75 66 66  entation to buff
2a5b0 65 72 20 70 42 75 66 2e 20 52 65 74 75 72 6e 0a  er pBuf. Return.
2a5c0 2a 2a 20 61 66 74 65 72 20 65 69 74 68 65 72 20  ** after either 
2a5d0 74 68 65 20 69 6e 70 75 74 20 62 75 66 66 65 72  the input buffer
2a5e0 20 69 73 20 65 78 68 61 75 73 74 65 64 20 6f 72   is exhausted or
2a5f0 20 61 20 30 20 76 61 6c 75 65 20 69 73 20 72 65   a 0 value is re
2a600 61 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65  ad..**.** The re
2a610 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20 74 68  turn value is th
2a620 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  e number of byte
2a630 73 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20  s read from the 
2a640 69 6e 70 75 74 20 62 75 66 66 65 72 2e 0a 2a 2f  input buffer..*/
2a650 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 35  .static int fts5
2a660 44 65 63 6f 64 65 50 6f 73 6c 69 73 74 28 69 6e  DecodePoslist(in
2a670 74 20 2a 70 52 63 2c 20 46 74 73 35 42 75 66 66  t *pRc, Fts5Buff
2a680 65 72 20 2a 70 42 75 66 2c 20 63 6f 6e 73 74 20  er *pBuf, const 
2a690 75 38 20 2a 61 2c 20 69 6e 74 20 6e 29 7b 0a 20  u8 *a, int n){. 
2a6a0 20 69 6e 74 20 69 4f 66 66 20 3d 20 30 3b 0a 20   int iOff = 0;. 
2a6b0 20 77 68 69 6c 65 28 20 69 4f 66 66 3c 6e 20 29   while( iOff<n )
2a6c0 7b 0a 20 20 20 20 69 6e 74 20 69 56 61 6c 3b 0a  {.    int iVal;.
2a6d0 20 20 20 20 69 4f 66 66 20 2b 3d 20 66 74 73 35      iOff += fts5
2a6e0 47 65 74 56 61 72 69 6e 74 33 32 28 26 61 5b 69  GetVarint32(&a[i
2a6f0 4f 66 66 5d 2c 20 69 56 61 6c 29 3b 0a 20 20 20  Off], iVal);.   
2a700 20 73 71 6c 69 74 65 33 46 74 73 35 42 75 66 66   sqlite3Fts5Buff
2a710 65 72 41 70 70 65 6e 64 50 72 69 6e 74 66 28 70  erAppendPrintf(p
2a720 52 63 2c 20 70 42 75 66 2c 20 22 20 25 64 22 2c  Rc, pBuf, " %d",
2a730 20 69 56 61 6c 29 3b 0a 20 20 7d 0a 20 20 72 65   iVal);.  }.  re
2a740 74 75 72 6e 20 69 4f 66 66 3b 0a 7d 0a 0a 2f 2a  turn iOff;.}../*
2a750 0a 2a 2a 20 54 68 65 20 73 74 61 72 74 20 6f 66  .** The start of
2a760 20 62 75 66 66 65 72 20 28 61 2f 6e 29 20 63 6f   buffer (a/n) co
2a770 6e 74 61 69 6e 73 20 74 68 65 20 73 74 61 72 74  ntains the start
2a780 20 6f 66 20 61 20 64 6f 63 6c 69 73 74 2e 20 54   of a doclist. T
2a790 68 65 20 64 6f 63 6c 69 73 74 0a 2a 2a 20 6d 61  he doclist.** ma
2a7a0 79 20 6f 72 20 6d 61 79 20 6e 6f 74 20 66 69 6e  y or may not fin
2a7b0 69 73 68 20 77 69 74 68 69 6e 20 74 68 65 20 62  ish within the b
2a7c0 75 66 66 65 72 2e 20 54 68 69 73 20 66 75 6e 63  uffer. This func
2a7d0 74 69 6f 6e 20 61 70 70 65 6e 64 73 20 61 20 74  tion appends a t
2a7e0 65 78 74 0a 2a 2a 20 72 65 70 72 65 73 65 6e 74  ext.** represent
2a7f0 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 70 61 72  ation of the par
2a800 74 20 6f 66 20 74 68 65 20 64 6f 63 6c 69 73 74  t of the doclist
2a810 20 74 68 61 74 20 69 73 20 70 72 65 73 65 6e 74   that is present
2a820 20 74 6f 20 62 75 66 66 65 72 0a 2a 2a 20 70 42   to buffer.** pB
2a830 75 66 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72  uf. .**.** The r
2a840 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20 74  eturn value is t
2a850 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74  he number of byt
2a860 65 73 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65  es read from the
2a870 20 69 6e 70 75 74 20 62 75 66 66 65 72 2e 0a 2a   input buffer..*
2a880 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73  /.static int fts
2a890 35 44 65 63 6f 64 65 44 6f 63 6c 69 73 74 28 69  5DecodeDoclist(i
2a8a0 6e 74 20 2a 70 52 63 2c 20 46 74 73 35 42 75 66  nt *pRc, Fts5Buf
2a8b0 66 65 72 20 2a 70 42 75 66 2c 20 63 6f 6e 73 74  fer *pBuf, const
2a8c0 20 75 38 20 2a 61 2c 20 69 6e 74 20 6e 29 7b 0a   u8 *a, int n){.
2a8d0 20 20 69 36 34 20 69 44 6f 63 69 64 20 3d 20 30    i64 iDocid = 0
2a8e0 3b 0a 20 20 69 6e 74 20 69 4f 66 66 20 3d 20 30  ;.  int iOff = 0
2a8f0 3b 0a 0a 20 20 69 66 28 20 6e 3e 30 20 29 7b 0a  ;..  if( n>0 ){.
2a900 20 20 20 20 69 4f 66 66 20 3d 20 73 71 6c 69 74      iOff = sqlit
2a910 65 33 46 74 73 35 47 65 74 56 61 72 69 6e 74 28  e3Fts5GetVarint(
2a920 61 2c 20 28 75 36 34 2a 29 26 69 44 6f 63 69 64  a, (u64*)&iDocid
2a930 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 46 74  );.    sqlite3Ft
2a940 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 50 72  s5BufferAppendPr
2a950 69 6e 74 66 28 70 52 63 2c 20 70 42 75 66 2c 20  intf(pRc, pBuf, 
2a960 22 20 69 64 3d 25 6c 6c 64 22 2c 20 69 44 6f 63  " id=%lld", iDoc
2a970 69 64 29 3b 0a 20 20 7d 0a 20 20 77 68 69 6c 65  id);.  }.  while
2a980 28 20 69 4f 66 66 3c 6e 20 29 7b 0a 20 20 20 20  ( iOff<n ){.    
2a990 69 6e 74 20 6e 50 6f 73 3b 0a 20 20 20 20 69 6e  int nPos;.    in
2a9a0 74 20 62 44 75 6d 6d 79 3b 0a 20 20 20 20 69 4f  t bDummy;.    iO
2a9b0 66 66 20 2b 3d 20 66 74 73 35 47 65 74 50 6f 73  ff += fts5GetPos
2a9c0 6c 69 73 74 53 69 7a 65 28 26 61 5b 69 4f 66 66  listSize(&a[iOff
2a9d0 5d 2c 20 26 6e 50 6f 73 2c 20 26 62 44 75 6d 6d  ], &nPos, &bDumm
2a9e0 79 29 3b 0a 20 20 20 20 69 4f 66 66 20 2b 3d 20  y);.    iOff += 
2a9f0 66 74 73 35 44 65 63 6f 64 65 50 6f 73 6c 69 73  fts5DecodePoslis
2aa00 74 28 70 52 63 2c 20 70 42 75 66 2c 20 26 61 5b  t(pRc, pBuf, &a[
2aa10 69 4f 66 66 5d 2c 20 4d 49 4e 28 6e 2d 69 4f 66  iOff], MIN(n-iOf
2aa20 66 2c 20 6e 50 6f 73 29 29 3b 0a 20 20 20 20 69  f, nPos));.    i
2aa30 66 28 20 69 4f 66 66 3c 6e 20 29 7b 0a 20 20 20  f( iOff<n ){.   
2aa40 20 20 20 69 36 34 20 69 44 65 6c 74 61 3b 0a 20     i64 iDelta;. 
2aa50 20 20 20 20 20 69 4f 66 66 20 2b 3d 20 73 71 6c       iOff += sql
2aa60 69 74 65 33 46 74 73 35 47 65 74 56 61 72 69 6e  ite3Fts5GetVarin
2aa70 74 28 26 61 5b 69 4f 66 66 5d 2c 20 28 75 36 34  t(&a[iOff], (u64
2aa80 2a 29 26 69 44 65 6c 74 61 29 3b 0a 20 20 20 20  *)&iDelta);.    
2aa90 20 20 69 44 6f 63 69 64 20 2b 3d 20 69 44 65 6c    iDocid += iDel
2aaa0 74 61 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ta;.      sqlite
2aab0 33 46 74 73 35 42 75 66 66 65 72 41 70 70 65 6e  3Fts5BufferAppen
2aac0 64 50 72 69 6e 74 66 28 70 52 63 2c 20 70 42 75  dPrintf(pRc, pBu
2aad0 66 2c 20 22 20 69 64 3d 25 6c 6c 64 22 2c 20 69  f, " id=%lld", i
2aae0 44 6f 63 69 64 29 3b 0a 20 20 20 20 7d 0a 20 20  Docid);.    }.  
2aaf0 7d 0a 0a 20 20 72 65 74 75 72 6e 20 69 4f 66 66  }..  return iOff
2ab00 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 69  ;.}../*.** The i
2ab10 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66  mplementation of
2ab20 20 75 73 65 72 2d 64 65 66 69 6e 65 64 20 73 63   user-defined sc
2ab30 61 6c 61 72 20 66 75 6e 63 74 69 6f 6e 20 66 74  alar function ft
2ab40 73 35 5f 64 65 63 6f 64 65 28 29 2e 0a 2a 2f 0a  s5_decode()..*/.
2ab50 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
2ab60 44 65 63 6f 64 65 46 75 6e 63 74 69 6f 6e 28 0a  DecodeFunction(.
2ab70 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78    sqlite3_contex
2ab80 74 20 2a 70 43 74 78 2c 20 20 20 20 20 20 20 20  t *pCtx,        
2ab90 20 20 2f 2a 20 46 75 6e 63 74 69 6f 6e 20 63 61    /* Function ca
2aba0 6c 6c 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ll context */.  
2abb0 69 6e 74 20 6e 41 72 67 2c 20 20 20 20 20 20 20  int nArg,       
2abc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2abd0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67  /* Number of arg
2abe0 73 20 28 61 6c 77 61 79 73 20 32 29 20 2a 2f 0a  s (always 2) */.
2abf0 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20    sqlite3_value 
2ac00 2a 2a 61 70 56 61 6c 20 20 20 20 20 20 20 20 20  **apVal         
2ac10 20 20 2f 2a 20 46 75 6e 63 74 69 6f 6e 20 61 72    /* Function ar
2ac20 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20  guments */.){.  
2ac30 69 36 34 20 69 52 6f 77 69 64 3b 20 20 20 20 20  i64 iRowid;     
2ac40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ac50 2f 2a 20 52 6f 77 69 64 20 66 6f 72 20 72 65 63  /* Rowid for rec
2ac60 6f 72 64 20 62 65 69 6e 67 20 64 65 63 6f 64 65  ord being decode
2ac70 64 20 2a 2f 0a 20 20 69 6e 74 20 69 53 65 67 69  d */.  int iSegi
2ac80 64 2c 69 48 65 69 67 68 74 2c 69 50 67 6e 6f 2c  d,iHeight,iPgno,
2ac90 62 44 6c 69 64 78 3b 2f 2a 20 52 6f 77 69 64 20  bDlidx;/* Rowid 
2aca0 63 6f 6d 70 6f 6e 65 6e 74 73 20 2a 2f 0a 20 20  components */.  
2acb0 63 6f 6e 73 74 20 75 38 20 2a 61 42 6c 6f 62 3b  const u8 *aBlob;
2acc0 20 69 6e 74 20 6e 3b 20 20 20 20 20 20 20 20 20   int n;         
2acd0 2f 2a 20 52 65 63 6f 72 64 20 74 6f 20 64 65 63  /* Record to dec
2ace0 6f 64 65 20 2a 2f 0a 20 20 75 38 20 2a 61 20 3d  ode */.  u8 *a =
2acf0 20 30 3b 0a 20 20 46 74 73 35 42 75 66 66 65 72   0;.  Fts5Buffer
2ad00 20 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   s;             
2ad10 20 20 20 20 20 20 2f 2a 20 42 75 69 6c 64 20 75        /* Build u
2ad20 70 20 74 65 78 74 20 74 6f 20 72 65 74 75 72 6e  p text to return
2ad30 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20 72   here */.  int r
2ad40 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  c = SQLITE_OK;  
2ad50 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
2ad60 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69  turn code */.  i
2ad70 6e 74 20 6e 53 70 61 63 65 20 3d 20 30 3b 0a 0a  nt nSpace = 0;..
2ad80 20 20 61 73 73 65 72 74 28 20 6e 41 72 67 3d 3d    assert( nArg==
2ad90 32 20 29 3b 0a 20 20 6d 65 6d 73 65 74 28 26 73  2 );.  memset(&s
2ada0 2c 20 30 2c 20 73 69 7a 65 6f 66 28 46 74 73 35  , 0, sizeof(Fts5
2adb0 42 75 66 66 65 72 29 29 3b 0a 20 20 69 52 6f 77  Buffer));.  iRow
2adc0 69 64 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c  id = sqlite3_val
2add0 75 65 5f 69 6e 74 36 34 28 61 70 56 61 6c 5b 30  ue_int64(apVal[0
2ade0 5d 29 3b 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 61  ]);..  /* Make a
2adf0 20 63 6f 70 79 20 6f 66 20 74 68 65 20 73 65 63   copy of the sec
2ae00 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 28 61 20  ond argument (a 
2ae10 62 6c 6f 62 29 20 69 6e 20 61 42 6c 6f 62 5b 5d  blob) in aBlob[]
2ae20 2e 20 54 68 65 20 61 42 6c 6f 62 5b 5d 0a 20 20  . The aBlob[].  
2ae30 2a 2a 20 63 6f 70 79 20 69 73 20 66 6f 6c 6c 6f  ** copy is follo
2ae40 77 65 64 20 62 79 20 46 54 53 35 5f 44 41 54 41  wed by FTS5_DATA
2ae50 5f 5a 45 52 4f 5f 50 41 44 44 49 4e 47 20 30 78  _ZERO_PADDING 0x
2ae60 30 30 20 62 79 74 65 73 2c 20 77 68 69 63 68 20  00 bytes, which 
2ae70 70 72 65 76 65 6e 74 73 0a 20 20 2a 2a 20 62 75  prevents.  ** bu
2ae80 66 66 65 72 20 6f 76 65 72 72 65 61 64 73 20 65  ffer overreads e
2ae90 76 65 6e 20 69 66 20 74 68 65 20 72 65 63 6f 72  ven if the recor
2aea0 64 20 69 73 20 63 6f 72 72 75 70 74 2e 20 20 2a  d is corrupt.  *
2aeb0 2f 0a 20 20 6e 20 3d 20 73 71 6c 69 74 65 33 5f  /.  n = sqlite3_
2aec0 76 61 6c 75 65 5f 62 79 74 65 73 28 61 70 56 61  value_bytes(apVa
2aed0 6c 5b 31 5d 29 3b 0a 20 20 61 42 6c 6f 62 20 3d  l[1]);.  aBlob =
2aee0 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62   sqlite3_value_b
2aef0 6c 6f 62 28 61 70 56 61 6c 5b 31 5d 29 3b 0a 20  lob(apVal[1]);. 
2af00 20 6e 53 70 61 63 65 20 3d 20 6e 20 2b 20 46 54   nSpace = n + FT
2af10 53 35 5f 44 41 54 41 5f 5a 45 52 4f 5f 50 41 44  S5_DATA_ZERO_PAD
2af20 44 49 4e 47 3b 0a 20 20 61 20 3d 20 28 75 38 2a  DING;.  a = (u8*
2af30 29 73 71 6c 69 74 65 33 46 74 73 35 4d 61 6c 6c  )sqlite3Fts5Mall
2af40 6f 63 5a 65 72 6f 28 26 72 63 2c 20 6e 53 70 61  ocZero(&rc, nSpa
2af50 63 65 29 3b 0a 20 20 69 66 28 20 61 3d 3d 30 20  ce);.  if( a==0 
2af60 29 20 67 6f 74 6f 20 64 65 63 6f 64 65 5f 6f 75  ) goto decode_ou
2af70 74 3b 0a 20 20 6d 65 6d 63 70 79 28 61 2c 20 61  t;.  memcpy(a, a
2af80 42 6c 6f 62 2c 20 6e 29 3b 0a 0a 0a 20 20 66 74  Blob, n);...  ft
2af90 73 35 44 65 63 6f 64 65 52 6f 77 69 64 28 69 52  s5DecodeRowid(iR
2afa0 6f 77 69 64 2c 20 26 69 53 65 67 69 64 2c 20 26  owid, &iSegid, &
2afb0 62 44 6c 69 64 78 2c 20 26 69 48 65 69 67 68 74  bDlidx, &iHeight
2afc0 2c 20 26 69 50 67 6e 6f 29 3b 0a 0a 20 20 66 74  , &iPgno);..  ft
2afd0 73 35 44 65 62 75 67 52 6f 77 69 64 28 26 72 63  s5DebugRowid(&rc
2afe0 2c 20 26 73 2c 20 69 52 6f 77 69 64 29 3b 0a 20  , &s, iRowid);. 
2aff0 20 69 66 28 20 62 44 6c 69 64 78 20 29 7b 0a 20   if( bDlidx ){. 
2b000 20 20 20 46 74 73 35 44 61 74 61 20 64 6c 69 64     Fts5Data dlid
2b010 78 3b 0a 20 20 20 20 46 74 73 35 44 6c 69 64 78  x;.    Fts5Dlidx
2b020 4c 76 6c 20 6c 76 6c 3b 0a 0a 20 20 20 20 64 6c  Lvl lvl;..    dl
2b030 69 64 78 2e 70 20 3d 20 61 3b 0a 20 20 20 20 64  idx.p = a;.    d
2b040 6c 69 64 78 2e 6e 6e 20 3d 20 6e 3b 0a 0a 20 20  lidx.nn = n;..  
2b050 20 20 6d 65 6d 73 65 74 28 26 6c 76 6c 2c 20 30    memset(&lvl, 0
2b060 2c 20 73 69 7a 65 6f 66 28 46 74 73 35 44 6c 69  , sizeof(Fts5Dli
2b070 64 78 4c 76 6c 29 29 3b 0a 20 20 20 20 6c 76 6c  dxLvl));.    lvl
2b080 2e 70 44 61 74 61 20 3d 20 26 64 6c 69 64 78 3b  .pData = &dlidx;
2b090 0a 20 20 20 20 6c 76 6c 2e 69 4c 65 61 66 50 67  .    lvl.iLeafPg
2b0a0 6e 6f 20 3d 20 69 50 67 6e 6f 3b 0a 0a 20 20 20  no = iPgno;..   
2b0b0 20 66 6f 72 28 66 74 73 35 44 6c 69 64 78 4c 76   for(fts5DlidxLv
2b0c0 6c 4e 65 78 74 28 26 6c 76 6c 29 3b 20 6c 76 6c  lNext(&lvl); lvl
2b0d0 2e 62 45 6f 66 3d 3d 30 3b 20 66 74 73 35 44 6c  .bEof==0; fts5Dl
2b0e0 69 64 78 4c 76 6c 4e 65 78 74 28 26 6c 76 6c 29  idxLvlNext(&lvl)
2b0f0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
2b100 46 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64  Fts5BufferAppend
2b110 50 72 69 6e 74 66 28 26 72 63 2c 20 26 73 2c 20  Printf(&rc, &s, 
2b120 0a 20 20 20 20 20 20 20 20 20 20 22 20 25 64 28  .          " %d(
2b130 25 6c 6c 64 29 22 2c 20 6c 76 6c 2e 69 4c 65 61  %lld)", lvl.iLea
2b140 66 50 67 6e 6f 2c 20 6c 76 6c 2e 69 52 6f 77 69  fPgno, lvl.iRowi
2b150 64 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d  d.      );.    }
2b160 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 69 53 65  .  }else if( iSe
2b170 67 69 64 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66  gid==0 ){.    if
2b180 28 20 69 52 6f 77 69 64 3d 3d 46 54 53 35 5f 41  ( iRowid==FTS5_A
2b190 56 45 52 41 47 45 53 5f 52 4f 57 49 44 20 29 7b  VERAGES_ROWID ){
2b1a0 0a 20 20 20 20 20 20 66 74 73 35 44 65 63 6f 64  .      fts5Decod
2b1b0 65 41 76 65 72 61 67 65 73 28 26 72 63 2c 20 26  eAverages(&rc, &
2b1c0 73 2c 20 61 2c 20 6e 29 3b 0a 20 20 20 20 7d 65  s, a, n);.    }e
2b1d0 6c 73 65 7b 0a 20 20 20 20 20 20 66 74 73 35 44  lse{.      fts5D
2b1e0 65 63 6f 64 65 53 74 72 75 63 74 75 72 65 28 26  ecodeStructure(&
2b1f0 72 63 2c 20 26 73 2c 20 61 2c 20 6e 29 3b 0a 20  rc, &s, a, n);. 
2b200 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20     }.  }else{.  
2b210 20 20 46 74 73 35 42 75 66 66 65 72 20 74 65 72    Fts5Buffer ter
2b220 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m;              
2b230 2f 2a 20 43 75 72 72 65 6e 74 20 74 65 72 6d 20  /* Current term 
2b240 72 65 61 64 20 66 72 6f 6d 20 70 61 67 65 20 2a  read from page *
2b250 2f 0a 20 20 20 20 69 6e 74 20 73 7a 4c 65 61 66  /.    int szLeaf
2b260 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2b270 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66      /* Offset of
2b280 20 70 67 69 64 78 20 69 6e 20 61 5b 5d 20 2a 2f   pgidx in a[] */
2b290 0a 20 20 20 20 69 6e 74 20 69 50 67 69 64 78 4f  .    int iPgidxO
2b2a0 66 66 3b 0a 20 20 20 20 69 6e 74 20 69 50 67 69  ff;.    int iPgi
2b2b0 64 78 50 72 65 76 20 3d 20 30 3b 20 20 20 20 20  dxPrev = 0;     
2b2c0 20 20 20 20 20 20 2f 2a 20 50 72 65 76 69 6f 75        /* Previou
2b2d0 73 20 76 61 6c 75 65 20 72 65 61 64 20 66 72 6f  s value read fro
2b2e0 6d 20 70 67 69 64 78 20 2a 2f 0a 20 20 20 20 69  m pgidx */.    i
2b2f0 6e 74 20 69 54 65 72 6d 4f 66 66 20 3d 20 30 3b  nt iTermOff = 0;
2b300 0a 20 20 20 20 69 6e 74 20 69 52 6f 77 69 64 4f  .    int iRowidO
2b310 66 66 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20  ff = 0;.    int 
2b320 69 4f 66 66 3b 0a 20 20 20 20 69 6e 74 20 6e 44  iOff;.    int nD
2b330 6f 63 6c 69 73 74 3b 0a 0a 20 20 20 20 6d 65 6d  oclist;..    mem
2b340 73 65 74 28 26 74 65 72 6d 2c 20 30 2c 20 73 69  set(&term, 0, si
2b350 7a 65 6f 66 28 46 74 73 35 42 75 66 66 65 72 29  zeof(Fts5Buffer)
2b360 29 3b 0a 0a 20 20 20 20 69 66 28 20 6e 3c 34 20  );..    if( n<4 
2b370 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
2b380 46 74 73 35 42 75 66 66 65 72 53 65 74 28 26 72  Fts5BufferSet(&r
2b390 63 2c 20 26 73 2c 20 37 2c 20 28 63 6f 6e 73 74  c, &s, 7, (const
2b3a0 20 75 38 2a 29 22 63 6f 72 72 75 70 74 22 29 3b   u8*)"corrupt");
2b3b0 0a 20 20 20 20 20 20 67 6f 74 6f 20 64 65 63 6f  .      goto deco
2b3c0 64 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 65 6c 73  de_out;.    }els
2b3d0 65 7b 0a 20 20 20 20 20 20 69 52 6f 77 69 64 4f  e{.      iRowidO
2b3e0 66 66 20 3d 20 66 74 73 35 47 65 74 55 31 36 28  ff = fts5GetU16(
2b3f0 26 61 5b 30 5d 29 3b 0a 20 20 20 20 20 20 69 50  &a[0]);.      iP
2b400 67 69 64 78 4f 66 66 20 3d 20 73 7a 4c 65 61 66  gidxOff = szLeaf
2b410 20 3d 20 66 74 73 35 47 65 74 55 31 36 28 26 61   = fts5GetU16(&a
2b420 5b 32 5d 29 3b 0a 20 20 20 20 20 20 69 66 28 20  [2]);.      if( 
2b430 69 50 67 69 64 78 4f 66 66 3c 6e 20 29 7b 0a 20  iPgidxOff<n ){. 
2b440 20 20 20 20 20 20 20 66 74 73 35 47 65 74 56 61         fts5GetVa
2b450 72 69 6e 74 33 32 28 26 61 5b 69 50 67 69 64 78  rint32(&a[iPgidx
2b460 4f 66 66 5d 2c 20 69 54 65 72 6d 4f 66 66 29 3b  Off], iTermOff);
2b470 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
2b480 20 20 20 20 2f 2a 20 44 65 63 6f 64 65 20 74 68      /* Decode th
2b490 65 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74 20  e position list 
2b4a0 74 61 69 6c 20 61 74 20 74 68 65 20 73 74 61 72  tail at the star
2b4b0 74 20 6f 66 20 74 68 65 20 70 61 67 65 20 2a 2f  t of the page */
2b4c0 0a 20 20 20 20 69 66 28 20 69 52 6f 77 69 64 4f  .    if( iRowidO
2b4d0 66 66 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  ff!=0 ){.      i
2b4e0 4f 66 66 20 3d 20 69 52 6f 77 69 64 4f 66 66 3b  Off = iRowidOff;
2b4f0 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 69  .    }else if( i
2b500 54 65 72 6d 4f 66 66 21 3d 30 20 29 7b 0a 20 20  TermOff!=0 ){.  
2b510 20 20 20 20 69 4f 66 66 20 3d 20 69 54 65 72 6d      iOff = iTerm
2b520 4f 66 66 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  Off;.    }else{.
2b530 20 20 20 20 20 20 69 4f 66 66 20 3d 20 73 7a 4c        iOff = szL
2b540 65 61 66 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66  eaf;.    }.    f
2b550 74 73 35 44 65 63 6f 64 65 50 6f 73 6c 69 73 74  ts5DecodePoslist
2b560 28 26 72 63 2c 20 26 73 2c 20 26 61 5b 34 5d 2c  (&rc, &s, &a[4],
2b570 20 69 4f 66 66 2d 34 29 3b 0a 0a 20 20 20 20 2f   iOff-4);..    /
2b580 2a 20 44 65 63 6f 64 65 20 61 6e 79 20 6d 6f 72  * Decode any mor
2b590 65 20 64 6f 63 6c 69 73 74 20 64 61 74 61 20 74  e doclist data t
2b5a0 68 61 74 20 61 70 70 65 61 72 73 20 6f 6e 20 74  hat appears on t
2b5b0 68 65 20 70 61 67 65 20 62 65 66 6f 72 65 20 74  he page before t
2b5c0 68 65 0a 20 20 20 20 2a 2a 20 66 69 72 73 74 20  he.    ** first 
2b5d0 74 65 72 6d 2e 20 2a 2f 0a 20 20 20 20 6e 44 6f  term. */.    nDo
2b5e0 63 6c 69 73 74 20 3d 20 28 69 54 65 72 6d 4f 66  clist = (iTermOf
2b5f0 66 20 3f 20 69 54 65 72 6d 4f 66 66 20 3a 20 73  f ? iTermOff : s
2b600 7a 4c 65 61 66 29 20 2d 20 69 4f 66 66 3b 0a 20  zLeaf) - iOff;. 
2b610 20 20 20 66 74 73 35 44 65 63 6f 64 65 44 6f 63     fts5DecodeDoc
2b620 6c 69 73 74 28 26 72 63 2c 20 26 73 2c 20 26 61  list(&rc, &s, &a
2b630 5b 69 4f 66 66 5d 2c 20 6e 44 6f 63 6c 69 73 74  [iOff], nDoclist
2b640 29 3b 0a 0a 20 20 20 20 77 68 69 6c 65 28 20 69  );..    while( i
2b650 50 67 69 64 78 4f 66 66 3c 6e 20 29 7b 0a 20 20  PgidxOff<n ){.  
2b660 20 20 20 20 69 6e 74 20 62 46 69 72 73 74 20 3d      int bFirst =
2b670 20 28 69 50 67 69 64 78 4f 66 66 3d 3d 73 7a 4c   (iPgidxOff==szL
2b680 65 61 66 29 3b 20 20 20 20 20 2f 2a 20 54 72 75  eaf);     /* Tru
2b690 65 20 66 6f 72 20 66 69 72 73 74 20 74 65 72 6d  e for first term
2b6a0 20 6f 6e 20 70 61 67 65 20 2a 2f 0a 20 20 20 20   on page */.    
2b6b0 20 20 69 6e 74 20 6e 42 79 74 65 3b 20 20 20 20    int nByte;    
2b6c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b6d0 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73          /* Bytes
2b6e0 20 6f 66 20 64 61 74 61 20 2a 2f 0a 20 20 20 20   of data */.    
2b6f0 20 20 69 6e 74 20 69 45 6e 64 3b 0a 20 20 20 20    int iEnd;.    
2b700 20 20 0a 20 20 20 20 20 20 69 50 67 69 64 78 4f    .      iPgidxO
2b710 66 66 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72  ff += fts5GetVar
2b720 69 6e 74 33 32 28 26 61 5b 69 50 67 69 64 78 4f  int32(&a[iPgidxO
2b730 66 66 5d 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20  ff], nByte);.   
2b740 20 20 20 69 50 67 69 64 78 50 72 65 76 20 2b 3d     iPgidxPrev +=
2b750 20 6e 42 79 74 65 3b 0a 20 20 20 20 20 20 69 4f   nByte;.      iO
2b760 66 66 20 3d 20 69 50 67 69 64 78 50 72 65 76 3b  ff = iPgidxPrev;
2b770 0a 0a 20 20 20 20 20 20 69 66 28 20 69 50 67 69  ..      if( iPgi
2b780 64 78 4f 66 66 3c 6e 20 29 7b 0a 20 20 20 20 20  dxOff<n ){.     
2b790 20 20 20 66 74 73 35 47 65 74 56 61 72 69 6e 74     fts5GetVarint
2b7a0 33 32 28 26 61 5b 69 50 67 69 64 78 4f 66 66 5d  32(&a[iPgidxOff]
2b7b0 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20 20 20 20  , nByte);.      
2b7c0 20 20 69 45 6e 64 20 3d 20 69 50 67 69 64 78 50    iEnd = iPgidxP
2b7d0 72 65 76 20 2b 20 6e 42 79 74 65 3b 0a 20 20 20  rev + nByte;.   
2b7e0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2b7f0 20 20 69 45 6e 64 20 3d 20 73 7a 4c 65 61 66 3b    iEnd = szLeaf;
2b800 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
2b810 69 66 28 20 62 46 69 72 73 74 3d 3d 30 20 29 7b  if( bFirst==0 ){
2b820 0a 20 20 20 20 20 20 20 20 69 4f 66 66 20 2b 3d  .        iOff +=
2b830 20 66 74 73 35 47 65 74 56 61 72 69 6e 74 33 32   fts5GetVarint32
2b840 28 26 61 5b 69 4f 66 66 5d 2c 20 6e 42 79 74 65  (&a[iOff], nByte
2b850 29 3b 0a 20 20 20 20 20 20 20 20 74 65 72 6d 2e  );.        term.
2b860 6e 20 3d 20 6e 42 79 74 65 3b 0a 20 20 20 20 20  n = nByte;.     
2b870 20 7d 0a 20 20 20 20 20 20 69 4f 66 66 20 2b 3d   }.      iOff +=
2b880 20 66 74 73 35 47 65 74 56 61 72 69 6e 74 33 32   fts5GetVarint32
2b890 28 26 61 5b 69 4f 66 66 5d 2c 20 6e 42 79 74 65  (&a[iOff], nByte
2b8a0 29 3b 0a 20 20 20 20 20 20 66 74 73 35 42 75 66  );.      fts5Buf
2b8b0 66 65 72 41 70 70 65 6e 64 42 6c 6f 62 28 26 72  ferAppendBlob(&r
2b8c0 63 2c 20 26 74 65 72 6d 2c 20 6e 42 79 74 65 2c  c, &term, nByte,
2b8d0 20 26 61 5b 69 4f 66 66 5d 29 3b 0a 20 20 20 20   &a[iOff]);.    
2b8e0 20 20 69 4f 66 66 20 2b 3d 20 6e 42 79 74 65 3b    iOff += nByte;
2b8f0 0a 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 46  ..      sqlite3F
2b900 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 50  ts5BufferAppendP
2b910 72 69 6e 74 66 28 0a 20 20 20 20 20 20 20 20 20  rintf(.         
2b920 20 26 72 63 2c 20 26 73 2c 20 22 20 74 65 72 6d   &rc, &s, " term
2b930 3d 25 2e 2a 73 22 2c 20 74 65 72 6d 2e 6e 2c 20  =%.*s", term.n, 
2b940 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 74 65 72  (const char*)ter
2b950 6d 2e 70 0a 20 20 20 20 20 20 29 3b 0a 20 20 20  m.p.      );.   
2b960 20 20 20 69 4f 66 66 20 2b 3d 20 66 74 73 35 44     iOff += fts5D
2b970 65 63 6f 64 65 44 6f 63 6c 69 73 74 28 26 72 63  ecodeDoclist(&rc
2b980 2c 20 26 73 2c 20 26 61 5b 69 4f 66 66 5d 2c 20  , &s, &a[iOff], 
2b990 69 45 6e 64 2d 69 4f 66 66 29 3b 0a 20 20 20 20  iEnd-iOff);.    
2b9a0 7d 0a 0a 20 20 20 20 66 74 73 35 42 75 66 66 65  }..    fts5Buffe
2b9b0 72 46 72 65 65 28 26 74 65 72 6d 29 3b 0a 20 20  rFree(&term);.  
2b9c0 7d 0a 20 20 0a 20 64 65 63 6f 64 65 5f 6f 75 74  }.  . decode_out
2b9d0 3a 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  :.  sqlite3_free
2b9e0 28 61 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53  (a);.  if( rc==S
2b9f0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2ba00 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74  sqlite3_result_t
2ba10 65 78 74 28 70 43 74 78 2c 20 28 63 6f 6e 73 74  ext(pCtx, (const
2ba20 20 63 68 61 72 2a 29 73 2e 70 2c 20 73 2e 6e 2c   char*)s.p, s.n,
2ba30 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e   SQLITE_TRANSIEN
2ba40 54 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  T);.  }else{.   
2ba50 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
2ba60 65 72 72 6f 72 5f 63 6f 64 65 28 70 43 74 78 2c  error_code(pCtx,
2ba70 20 72 63 29 3b 0a 20 20 7d 0a 20 20 66 74 73 35   rc);.  }.  fts5
2ba80 42 75 66 66 65 72 46 72 65 65 28 26 73 29 3b 0a  BufferFree(&s);.
2ba90 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 69 6d 70  }../*.** The imp
2baa0 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 75  lementation of u
2bab0 73 65 72 2d 64 65 66 69 6e 65 64 20 73 63 61 6c  ser-defined scal
2bac0 61 72 20 66 75 6e 63 74 69 6f 6e 20 66 74 73 35  ar function fts5
2bad0 5f 72 6f 77 69 64 28 29 2e 0a 2a 2f 0a 73 74 61  _rowid()..*/.sta
2bae0 74 69 63 20 76 6f 69 64 20 66 74 73 35 52 6f 77  tic void fts5Row
2baf0 69 64 46 75 6e 63 74 69 6f 6e 28 0a 20 20 73 71  idFunction(.  sq
2bb00 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 70  lite3_context *p
2bb10 43 74 78 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  Ctx,          /*
2bb20 20 46 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 20 63   Function call c
2bb30 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20  ontext */.  int 
2bb40 6e 41 72 67 2c 20 20 20 20 20 20 20 20 20 20 20  nArg,           
2bb50 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
2bb60 75 6d 62 65 72 20 6f 66 20 61 72 67 73 20 28 61  umber of args (a
2bb70 6c 77 61 79 73 20 32 29 20 2a 2f 0a 20 20 73 71  lways 2) */.  sq
2bb80 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 70  lite3_value **ap
2bb90 56 61 6c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  Val           /*
2bba0 20 46 75 6e 63 74 69 6f 6e 20 61 72 67 75 6d 65   Function argume
2bbb0 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73  nts */.){.  cons
2bbc0 74 20 63 68 61 72 20 2a 7a 41 72 67 3b 0a 20 20  t char *zArg;.  
2bbd0 69 66 28 20 6e 41 72 67 3d 3d 30 20 29 7b 0a 20  if( nArg==0 ){. 
2bbe0 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
2bbf0 74 5f 65 72 72 6f 72 28 70 43 74 78 2c 20 22 73  t_error(pCtx, "s
2bc00 68 6f 75 6c 64 20 62 65 3a 20 66 74 73 35 5f 72  hould be: fts5_r
2bc10 6f 77 69 64 28 73 75 62 6a 65 63 74 2c 20 2e 2e  owid(subject, ..
2bc20 2e 2e 29 22 2c 20 2d 31 29 3b 0a 20 20 7d 65 6c  ..)", -1);.  }el
2bc30 73 65 7b 0a 20 20 20 20 7a 41 72 67 20 3d 20 28  se{.    zArg = (
2bc40 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69  const char*)sqli
2bc50 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61  te3_value_text(a
2bc60 70 56 61 6c 5b 30 5d 29 3b 0a 20 20 20 20 69 66  pVal[0]);.    if
2bc70 28 20 30 3d 3d 73 71 6c 69 74 65 33 5f 73 74 72  ( 0==sqlite3_str
2bc80 69 63 6d 70 28 7a 41 72 67 2c 20 22 73 65 67 6d  icmp(zArg, "segm
2bc90 65 6e 74 22 29 20 29 7b 0a 20 20 20 20 20 20 69  ent") ){.      i
2bca0 36 34 20 69 52 6f 77 69 64 3b 0a 20 20 20 20 20  64 iRowid;.     
2bcb0 20 69 6e 74 20 73 65 67 69 64 2c 20 70 67 6e 6f   int segid, pgno
2bcc0 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 41 72 67  ;.      if( nArg
2bcd0 21 3d 33 20 29 7b 0a 20 20 20 20 20 20 20 20 73  !=3 ){.        s
2bce0 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72  qlite3_result_er
2bcf0 72 6f 72 28 70 43 74 78 2c 20 0a 20 20 20 20 20  ror(pCtx, .     
2bd00 20 20 20 20 20 20 20 22 73 68 6f 75 6c 64 20 62         "should b
2bd10 65 3a 20 66 74 73 35 5f 72 6f 77 69 64 28 27 73  e: fts5_rowid('s
2bd20 65 67 6d 65 6e 74 27 2c 20 73 65 67 69 64 2c 20  egment', segid, 
2bd30 70 67 6e 6f 29 29 22 2c 20 2d 31 0a 20 20 20 20  pgno))", -1.    
2bd40 20 20 20 20 29 3b 0a 20 20 20 20 20 20 7d 65 6c      );.      }el
2bd50 73 65 7b 0a 20 20 20 20 20 20 20 20 73 65 67 69  se{.        segi
2bd60 64 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  d = sqlite3_valu
2bd70 65 5f 69 6e 74 28 61 70 56 61 6c 5b 31 5d 29 3b  e_int(apVal[1]);
2bd80 0a 20 20 20 20 20 20 20 20 70 67 6e 6f 20 3d 20  .        pgno = 
2bd90 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e  sqlite3_value_in
2bda0 74 28 61 70 56 61 6c 5b 32 5d 29 3b 0a 20 20 20  t(apVal[2]);.   
2bdb0 20 20 20 20 20 69 52 6f 77 69 64 20 3d 20 46 54       iRowid = FT
2bdc0 53 35 5f 53 45 47 4d 45 4e 54 5f 52 4f 57 49 44  S5_SEGMENT_ROWID
2bdd0 28 73 65 67 69 64 2c 20 70 67 6e 6f 29 3b 0a 20  (segid, pgno);. 
2bde0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72         sqlite3_r
2bdf0 65 73 75 6c 74 5f 69 6e 74 36 34 28 70 43 74 78  esult_int64(pCtx
2be00 2c 20 69 52 6f 77 69 64 29 3b 0a 20 20 20 20 20  , iRowid);.     
2be10 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
2be20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
2be30 6c 74 5f 65 72 72 6f 72 28 70 43 74 78 2c 20 0a  lt_error(pCtx, .
2be40 20 20 20 20 20 20 20 20 22 66 69 72 73 74 20 61          "first a
2be50 72 67 20 74 6f 20 66 74 73 35 5f 72 6f 77 69 64  rg to fts5_rowid
2be60 28 29 20 6d 75 73 74 20 62 65 20 27 73 65 67 6d  () must be 'segm
2be70 65 6e 74 27 22 20 2c 20 2d 31 0a 20 20 20 20 20  ent'" , -1.     
2be80 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a   );.    }.  }.}.
2be90 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 63  ./*.** This is c
2bea0 61 6c 6c 65 64 20 61 73 20 70 61 72 74 20 6f 66  alled as part of
2beb0 20 72 65 67 69 73 74 65 72 69 6e 67 20 74 68 65   registering the
2bec0 20 46 54 53 35 20 6d 6f 64 75 6c 65 20 77 69 74   FTS5 module wit
2bed0 68 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 63 6f  h database.** co
2bee0 6e 6e 65 63 74 69 6f 6e 20 64 62 2e 20 49 74 20  nnection db. It 
2bef0 72 65 67 69 73 74 65 72 73 20 73 65 76 65 72 61  registers severa
2bf00 6c 20 75 73 65 72 2d 64 65 66 69 6e 65 64 20 73  l user-defined s
2bf10 63 61 6c 61 72 20 66 75 6e 63 74 69 6f 6e 73 20  calar functions 
2bf20 75 73 65 66 75 6c 0a 2a 2a 20 77 69 74 68 20 46  useful.** with F
2bf30 54 53 35 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75  TS5..**.** If su
2bf40 63 63 65 73 73 66 75 6c 2c 20 53 51 4c 49 54 45  ccessful, SQLITE
2bf50 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e  _OK is returned.
2bf60 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
2bf70 75 72 73 2c 20 73 6f 6d 65 20 6f 74 68 65 72 0a  urs, some other.
2bf80 2a 2a 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20  ** SQLite error 
2bf90 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
2bfa0 20 69 6e 73 74 65 61 64 2e 0a 2a 2f 0a 69 6e 74   instead..*/.int
2bfb0 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65   sqlite3Fts5Inde
2bfc0 78 49 6e 69 74 28 73 71 6c 69 74 65 33 20 2a 64  xInit(sqlite3 *d
2bfd0 62 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 73  b){.  int rc = s
2bfe0 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75  qlite3_create_fu
2bff0 6e 63 74 69 6f 6e 28 0a 20 20 20 20 20 20 64 62  nction(.      db
2c000 2c 20 22 66 74 73 35 5f 64 65 63 6f 64 65 22 2c  , "fts5_decode",
2c010 20 32 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c   2, SQLITE_UTF8,
2c020 20 30 2c 20 66 74 73 35 44 65 63 6f 64 65 46 75   0, fts5DecodeFu
2c030 6e 63 74 69 6f 6e 2c 20 30 2c 20 30 0a 20 20 29  nction, 0, 0.  )
2c040 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
2c050 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20  TE_OK ){.    rc 
2c060 3d 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65  = sqlite3_create
2c070 5f 66 75 6e 63 74 69 6f 6e 28 0a 20 20 20 20 20  _function(.     
2c080 20 20 20 64 62 2c 20 22 66 74 73 35 5f 72 6f 77     db, "fts5_row
2c090 69 64 22 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f  id", -1, SQLITE_
2c0a0 55 54 46 38 2c 20 30 2c 20 66 74 73 35 52 6f 77  UTF8, 0, fts5Row
2c0b0 69 64 46 75 6e 63 74 69 6f 6e 2c 20 30 2c 20 30  idFunction, 0, 0
2c0c0 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 20 20 72 65  .    );.  }.  re
2c0d0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a              turn rc;.}..