/ Hex Artifact Content
Login

Artifact 62a682a70ea2e84fa67c7786ead892b201116ad1:


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 46 74 73 35 42 75 66 66 65 72 20 73 63  .  Fts5Buffer sc
29c0: 72 61 74 63 68 3b 0a 0a 20 20 2f 2a 20 45 72 72  ratch;..  /* Err
29d0: 6f 72 20 73 74 61 74 65 2e 20 2a 2f 0a 20 20 69  or state. */.  i
29e0: 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
29f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2a00: 2a 20 43 75 72 72 65 6e 74 20 65 72 72 6f 72 20  * Current error 
2a10: 63 6f 64 65 20 2a 2f 0a 0a 20 20 2f 2a 20 53 74  code */..  /* St
2a20: 61 74 65 20 75 73 65 64 20 62 79 20 74 68 65 20  ate used by the 
2a30: 66 74 73 35 44 61 74 61 58 58 58 28 29 20 66 75  fts5DataXXX() fu
2a40: 6e 63 74 69 6f 6e 73 2e 20 2a 2f 0a 20 20 73 71  nctions. */.  sq
2a50: 6c 69 74 65 33 5f 62 6c 6f 62 20 2a 70 52 65 61  lite3_blob *pRea
2a60: 64 65 72 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  der;          /*
2a70: 20 52 4f 20 69 6e 63 72 2d 62 6c 6f 62 20 6f 70   RO incr-blob op
2a80: 65 6e 20 6f 6e 20 25 5f 64 61 74 61 20 74 61 62  en on %_data tab
2a90: 6c 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  le */.  sqlite3_
2aa0: 73 74 6d 74 20 2a 70 57 72 69 74 65 72 3b 20 20  stmt *pWriter;  
2ab0: 20 20 20 20 20 20 20 20 2f 2a 20 22 49 4e 53 45          /* "INSE
2ac0: 52 54 20 2e 2e 2e 20 25 5f 64 61 74 61 20 56 41  RT ... %_data VA
2ad0: 4c 55 45 53 28 3f 2c 3f 29 22 20 2a 2f 0a 20 20  LUES(?,?)" */.  
2ae0: 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 44  sqlite3_stmt *pD
2af0: 65 6c 65 74 65 72 3b 20 20 20 20 20 20 20 20 20  eleter;         
2b00: 2f 2a 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20  /* "DELETE FROM 
2b10: 25 5f 64 61 74 61 20 2e 2e 2e 20 69 64 3e 3d 3f  %_data ... id>=?
2b20: 20 41 4e 44 20 69 64 3c 3d 3f 22 20 2a 2f 0a 20   AND id<=?" */. 
2b30: 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
2b40: 49 64 78 57 72 69 74 65 72 3b 20 20 20 20 20 20  IdxWriter;      
2b50: 20 2f 2a 20 22 49 4e 53 45 52 54 20 2e 2e 2e 20   /* "INSERT ... 
2b60: 25 5f 69 64 78 20 56 41 4c 55 45 53 28 3f 2c 3f  %_idx VALUES(?,?
2b70: 2c 3f 2c 3f 29 22 20 2a 2f 0a 20 20 73 71 6c 69  ,?,?)" */.  sqli
2b80: 74 65 33 5f 73 74 6d 74 20 2a 70 49 64 78 44 65  te3_stmt *pIdxDe
2b90: 6c 65 74 65 72 3b 20 20 20 20 20 20 2f 2a 20 22  leter;      /* "
2ba0: 44 45 4c 45 54 45 20 46 52 4f 4d 20 25 5f 69 64  DELETE FROM %_id
2bb0: 78 20 57 48 45 52 45 20 73 65 67 69 64 3d 3f 20  x WHERE segid=? 
2bc0: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  */.  sqlite3_stm
2bd0: 74 20 2a 70 49 64 78 53 65 6c 65 63 74 3b 0a 20  t *pIdxSelect;. 
2be0: 20 69 6e 74 20 6e 52 65 61 64 3b 20 20 20 20 20   int nRead;     
2bf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c00: 20 2f 2a 20 54 6f 74 61 6c 20 6e 75 6d 62 65 72   /* Total number
2c10: 20 6f 66 20 62 6c 6f 63 6b 73 20 72 65 61 64 20   of blocks read 
2c20: 2a 2f 0a 7d 3b 0a 0a 73 74 72 75 63 74 20 46 74  */.};..struct Ft
2c30: 73 35 44 6f 63 6c 69 73 74 49 74 65 72 20 7b 0a  s5DoclistIter {.
2c40: 20 20 75 38 20 2a 61 3b 0a 20 20 69 6e 74 20 6e    u8 *a;.  int n
2c50: 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20 2f 2a  ;.  int i;..  /*
2c60: 20 4f 75 74 70 75 74 20 76 61 72 69 61 62 6c 65   Output variable
2c70: 73 2e 20 61 50 6f 73 6c 69 73 74 3d 3d 30 20 61  s. aPoslist==0 a
2c80: 74 20 45 4f 46 20 2a 2f 0a 20 20 69 36 34 20 69  t EOF */.  i64 i
2c90: 52 6f 77 69 64 3b 0a 20 20 75 38 20 2a 61 50 6f  Rowid;.  u8 *aPo
2ca0: 73 6c 69 73 74 3b 0a 20 20 69 6e 74 20 6e 50 6f  slist;.  int nPo
2cb0: 73 6c 69 73 74 3b 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  slist;.};../*.**
2cc0: 20 54 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   The contents of
2cd0: 20 74 68 65 20 22 73 74 72 75 63 74 75 72 65 22   the "structure"
2ce0: 20 72 65 63 6f 72 64 20 66 6f 72 20 65 61 63 68   record for each
2cf0: 20 69 6e 64 65 78 20 61 72 65 20 72 65 70 72 65   index are repre
2d00: 73 65 6e 74 65 64 0a 2a 2a 20 75 73 69 6e 67 20  sented.** using 
2d10: 61 6e 20 46 74 73 35 53 74 72 75 63 74 75 72 65  an Fts5Structure
2d20: 20 72 65 63 6f 72 64 20 69 6e 20 6d 65 6d 6f 72   record in memor
2d30: 79 2e 20 57 68 69 63 68 20 75 73 65 73 20 69 6e  y. Which uses in
2d40: 73 74 61 6e 63 65 73 20 6f 66 20 74 68 65 20 0a  stances of the .
2d50: 2a 2a 20 6f 74 68 65 72 20 46 74 73 35 53 74 72  ** other Fts5Str
2d60: 75 63 74 75 72 65 58 58 58 20 74 79 70 65 73 20  uctureXXX types 
2d70: 61 73 20 63 6f 6d 70 6f 6e 65 6e 74 73 2e 0a 2a  as components..*
2d80: 2f 0a 73 74 72 75 63 74 20 46 74 73 35 53 74 72  /.struct Fts5Str
2d90: 75 63 74 75 72 65 53 65 67 6d 65 6e 74 20 7b 0a  uctureSegment {.
2da0: 20 20 69 6e 74 20 69 53 65 67 69 64 3b 20 20 20    int iSegid;   
2db0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2dc0: 20 20 2f 2a 20 53 65 67 6d 65 6e 74 20 69 64 20    /* Segment id 
2dd0: 2a 2f 0a 20 20 69 6e 74 20 70 67 6e 6f 46 69 72  */.  int pgnoFir
2de0: 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  st;             
2df0: 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 6c 65       /* First le
2e00: 61 66 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69  af page number i
2e10: 6e 20 73 65 67 6d 65 6e 74 20 2a 2f 0a 20 20 69  n segment */.  i
2e20: 6e 74 20 70 67 6e 6f 4c 61 73 74 3b 20 20 20 20  nt pgnoLast;    
2e30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2e40: 2a 20 4c 61 73 74 20 6c 65 61 66 20 70 61 67 65  * Last leaf page
2e50: 20 6e 75 6d 62 65 72 20 69 6e 20 73 65 67 6d 65   number in segme
2e60: 6e 74 20 2a 2f 0a 7d 3b 0a 73 74 72 75 63 74 20  nt */.};.struct 
2e70: 46 74 73 35 53 74 72 75 63 74 75 72 65 4c 65 76  Fts5StructureLev
2e80: 65 6c 20 7b 0a 20 20 69 6e 74 20 6e 4d 65 72 67  el {.  int nMerg
2e90: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
2ea0: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
2eb0: 20 6f 66 20 73 65 67 6d 65 6e 74 73 20 69 6e 20   of segments in 
2ec0: 69 6e 63 72 2d 6d 65 72 67 65 20 2a 2f 0a 20 20  incr-merge */.  
2ed0: 69 6e 74 20 6e 53 65 67 3b 20 20 20 20 20 20 20  int nSeg;       
2ee0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ef0: 2f 2a 20 54 6f 74 61 6c 20 6e 75 6d 62 65 72 20  /* Total number 
2f00: 6f 66 20 73 65 67 6d 65 6e 74 73 20 6f 6e 20 6c  of segments on l
2f10: 65 76 65 6c 20 2a 2f 0a 20 20 46 74 73 35 53 74  evel */.  Fts5St
2f20: 72 75 63 74 75 72 65 53 65 67 6d 65 6e 74 20 2a  ructureSegment *
2f30: 61 53 65 67 3b 20 20 20 20 20 2f 2a 20 41 72 72  aSeg;     /* Arr
2f40: 61 79 20 6f 66 20 73 65 67 6d 65 6e 74 73 2e 20  ay of segments. 
2f50: 61 53 65 67 5b 30 5d 20 69 73 20 6f 6c 64 65 73  aSeg[0] is oldes
2f60: 74 2e 20 2a 2f 0a 7d 3b 0a 73 74 72 75 63 74 20  t. */.};.struct 
2f70: 46 74 73 35 53 74 72 75 63 74 75 72 65 20 7b 0a  Fts5Structure {.
2f80: 20 20 69 6e 74 20 6e 52 65 66 3b 20 20 20 20 20    int nRef;     
2f90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2fa0: 20 20 2f 2a 20 4f 62 6a 65 63 74 20 72 65 66 65    /* Object refe
2fb0: 72 65 6e 63 65 20 63 6f 75 6e 74 20 2a 2f 0a 20  rence count */. 
2fc0: 20 75 36 34 20 6e 57 72 69 74 65 43 6f 75 6e 74   u64 nWriteCount
2fd0: 65 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  er;             
2fe0: 20 2f 2a 20 54 6f 74 61 6c 20 6c 65 61 76 65 73   /* Total leaves
2ff0: 20 77 72 69 74 74 65 6e 20 74 6f 20 6c 65 76 65   written to leve
3000: 6c 20 30 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 65  l 0 */.  int nSe
3010: 67 6d 65 6e 74 3b 20 20 20 20 20 20 20 20 20 20  gment;          
3020: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 74 61           /* Tota
3030: 6c 20 73 65 67 6d 65 6e 74 73 20 69 6e 20 74 68  l segments in th
3040: 69 73 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a  is structure */.
3050: 20 20 69 6e 74 20 6e 4c 65 76 65 6c 3b 20 20 20    int nLevel;   
3060: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3070: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6c    /* Number of l
3080: 65 76 65 6c 73 20 69 6e 20 74 68 69 73 20 69 6e  evels in this in
3090: 64 65 78 20 2a 2f 0a 20 20 46 74 73 35 53 74 72  dex */.  Fts5Str
30a0: 75 63 74 75 72 65 4c 65 76 65 6c 20 61 4c 65 76  uctureLevel aLev
30b0: 65 6c 5b 31 5d 3b 20 20 20 2f 2a 20 41 72 72 61  el[1];   /* Arra
30c0: 79 20 6f 66 20 6e 4c 65 76 65 6c 20 6c 65 76 65  y of nLevel leve
30d0: 6c 20 6f 62 6a 65 63 74 73 20 2a 2f 0a 7d 3b 0a  l objects */.};.
30e0: 0a 2f 2a 0a 2a 2a 20 41 6e 20 6f 62 6a 65 63 74  ./*.** An object
30f0: 20 6f 66 20 74 79 70 65 20 46 74 73 35 53 65 67   of type Fts5Seg
3100: 57 72 69 74 65 72 20 69 73 20 75 73 65 64 20 74  Writer is used t
3110: 6f 20 77 72 69 74 65 20 74 6f 20 73 65 67 6d 65  o write to segme
3120: 6e 74 73 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 46  nts..*/.struct F
3130: 74 73 35 50 61 67 65 57 72 69 74 65 72 20 7b 0a  ts5PageWriter {.
3140: 20 20 69 6e 74 20 70 67 6e 6f 3b 20 20 20 20 20    int pgno;     
3150: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3160: 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72    /* Page number
3170: 20 66 6f 72 20 74 68 69 73 20 70 61 67 65 20 2a   for this page *
3180: 2f 0a 20 20 69 6e 74 20 69 50 72 65 76 50 67 69  /.  int iPrevPgi
3190: 64 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  dx;             
31a0: 20 20 20 20 2f 2a 20 50 72 65 76 69 6f 75 73 20      /* Previous 
31b0: 76 61 6c 75 65 20 77 72 69 74 74 65 6e 20 69 6e  value written in
31c0: 74 6f 20 70 67 69 64 78 20 2a 2f 0a 20 20 46 74  to pgidx */.  Ft
31d0: 73 35 42 75 66 66 65 72 20 62 75 66 3b 20 20 20  s5Buffer buf;   
31e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
31f0: 20 42 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69   Buffer containi
3200: 6e 67 20 6c 65 61 66 20 64 61 74 61 20 2a 2f 0a  ng leaf data */.
3210: 20 20 46 74 73 35 42 75 66 66 65 72 20 70 67 69    Fts5Buffer pgi
3220: 64 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  dx;             
3230: 20 20 2f 2a 20 42 75 66 66 65 72 20 63 6f 6e 74    /* Buffer cont
3240: 61 69 6e 69 6e 67 20 70 61 67 65 2d 69 6e 64 65  aining page-inde
3250: 78 20 2a 2f 0a 20 20 46 74 73 35 42 75 66 66 65  x */.  Fts5Buffe
3260: 72 20 74 65 72 6d 3b 20 20 20 20 20 20 20 20 20  r term;         
3270: 20 20 20 20 20 20 20 2f 2a 20 42 75 66 66 65 72         /* Buffer
3280: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 70 72 65 76   containing prev
3290: 69 6f 75 73 20 74 65 72 6d 20 6f 6e 20 70 61 67  ious term on pag
32a0: 65 20 2a 2f 0a 7d 3b 0a 73 74 72 75 63 74 20 46  e */.};.struct F
32b0: 74 73 35 44 6c 69 64 78 57 72 69 74 65 72 20 7b  ts5DlidxWriter {
32c0: 0a 20 20 69 6e 74 20 70 67 6e 6f 3b 20 20 20 20  .  int pgno;    
32d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32e0: 20 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65     /* Page numbe
32f0: 72 20 66 6f 72 20 74 68 69 73 20 70 61 67 65 20  r for this page 
3300: 2a 2f 0a 20 20 69 6e 74 20 62 50 72 65 76 56 61  */.  int bPrevVa
3310: 6c 69 64 3b 20 20 20 20 20 20 20 20 20 20 20 20  lid;            
3320: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
3330: 69 50 72 65 76 20 69 73 20 76 61 6c 69 64 20 2a  iPrev is valid *
3340: 2f 0a 20 20 69 36 34 20 69 50 72 65 76 3b 20 20  /.  i64 iPrev;  
3350: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3360: 20 20 20 20 2f 2a 20 50 72 65 76 69 6f 75 73 20      /* Previous 
3370: 72 6f 77 69 64 20 76 61 6c 75 65 20 77 72 69 74  rowid value writ
3380: 74 65 6e 20 74 6f 20 70 61 67 65 20 2a 2f 0a 20  ten to page */. 
3390: 20 46 74 73 35 42 75 66 66 65 72 20 62 75 66 3b   Fts5Buffer buf;
33a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33b0: 20 2f 2a 20 42 75 66 66 65 72 20 63 6f 6e 74 61   /* Buffer conta
33c0: 69 6e 69 6e 67 20 70 61 67 65 20 64 61 74 61 20  ining page data 
33d0: 2a 2f 0a 7d 3b 0a 73 74 72 75 63 74 20 46 74 73  */.};.struct Fts
33e0: 35 53 65 67 57 72 69 74 65 72 20 7b 0a 20 20 69  5SegWriter {.  i
33f0: 6e 74 20 69 53 65 67 69 64 3b 20 20 20 20 20 20  nt iSegid;      
3400: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
3410: 2a 20 53 65 67 69 64 20 74 6f 20 77 72 69 74 65  * Segid to write
3420: 20 74 6f 20 2a 2f 0a 20 20 46 74 73 35 50 61 67   to */.  Fts5Pag
3430: 65 57 72 69 74 65 72 20 77 72 69 74 65 72 3b 20  eWriter writer; 
3440: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65           /* Page
3450: 57 72 69 74 65 72 20 6f 62 6a 65 63 74 20 2a 2f  Writer object */
3460: 0a 20 20 69 36 34 20 69 50 72 65 76 52 6f 77 69  .  i64 iPrevRowi
3470: 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d;              
3480: 20 20 20 2f 2a 20 50 72 65 76 69 6f 75 73 20 72     /* Previous r
3490: 6f 77 69 64 20 77 72 69 74 74 65 6e 20 74 6f 20  owid written to 
34a0: 63 75 72 72 65 6e 74 20 6c 65 61 66 20 2a 2f 0a  current leaf */.
34b0: 20 20 75 38 20 62 46 69 72 73 74 52 6f 77 69 64    u8 bFirstRowid
34c0: 49 6e 44 6f 63 6c 69 73 74 3b 20 20 20 20 20 20  InDoclist;      
34d0: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 6e 65 78    /* True if nex
34e0: 74 20 72 6f 77 69 64 20 69 73 20 66 69 72 73 74  t rowid is first
34f0: 20 69 6e 20 64 6f 63 6c 69 73 74 20 2a 2f 0a 20   in doclist */. 
3500: 20 75 38 20 62 46 69 72 73 74 52 6f 77 69 64 49   u8 bFirstRowidI
3510: 6e 50 61 67 65 3b 20 20 20 20 20 20 20 20 20 20  nPage;          
3520: 20 2f 2a 20 54 72 75 65 20 69 66 20 6e 65 78 74   /* True if next
3530: 20 72 6f 77 69 64 20 69 73 20 66 69 72 73 74 20   rowid is first 
3540: 69 6e 20 70 61 67 65 20 2a 2f 0a 20 20 2f 2a 20  in page */.  /* 
3550: 54 4f 44 4f 31 3a 20 43 61 6e 20 75 73 65 20 28  TODO1: Can use (
3560: 77 72 69 74 65 72 2e 70 67 69 64 78 2e 6e 3d 3d  writer.pgidx.n==
3570: 30 29 20 69 6e 73 74 65 61 64 20 6f 66 20 62 46  0) instead of bF
3580: 69 72 73 74 54 65 72 6d 49 6e 50 61 67 65 20 2a  irstTermInPage *
3590: 2f 0a 20 20 75 38 20 62 46 69 72 73 74 54 65 72  /.  u8 bFirstTer
35a0: 6d 49 6e 50 61 67 65 3b 20 20 20 20 20 20 20 20  mInPage;        
35b0: 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 6e      /* True if n
35c0: 65 78 74 20 74 65 72 6d 20 77 69 6c 6c 20 62 65  ext term will be
35d0: 20 66 69 72 73 74 20 69 6e 20 6c 65 61 66 20 2a   first in leaf *
35e0: 2f 0a 20 20 69 6e 74 20 6e 4c 65 61 66 57 72 69  /.  int nLeafWri
35f0: 74 74 65 6e 3b 20 20 20 20 20 20 20 20 20 20 20  tten;           
3600: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
3610: 20 6c 65 61 66 20 70 61 67 65 73 20 77 72 69 74   leaf pages writ
3620: 74 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 6d  ten */.  int nEm
3630: 70 74 79 3b 20 20 20 20 20 20 20 20 20 20 20 20  pty;            
3640: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
3650: 65 72 20 6f 66 20 63 6f 6e 74 69 67 75 6f 75 73  er of contiguous
3660: 20 74 65 72 6d 2d 6c 65 73 73 20 6e 6f 64 65 73   term-less nodes
3670: 20 2a 2f 0a 0a 20 20 69 6e 74 20 6e 44 6c 69 64   */..  int nDlid
3680: 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  x;              
3690: 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c 6f 63 61         /* Alloca
36a0: 74 65 64 20 73 69 7a 65 20 6f 66 20 61 44 6c 69  ted size of aDli
36b0: 64 78 5b 5d 20 61 72 72 61 79 20 2a 2f 0a 20 20  dx[] array */.  
36c0: 46 74 73 35 44 6c 69 64 78 57 72 69 74 65 72 20  Fts5DlidxWriter 
36d0: 2a 61 44 6c 69 64 78 3b 20 20 20 20 20 20 20 20  *aDlidx;        
36e0: 2f 2a 20 41 72 72 61 79 20 6f 66 20 46 74 73 35  /* Array of Fts5
36f0: 44 6c 69 64 78 57 72 69 74 65 72 20 6f 62 6a 65  DlidxWriter obje
3700: 63 74 73 20 2a 2f 0a 0a 20 20 2f 2a 20 56 61 6c  cts */..  /* Val
3710: 75 65 73 20 74 6f 20 69 6e 73 65 72 74 20 69 6e  ues to insert in
3720: 74 6f 20 74 68 65 20 25 5f 69 64 78 20 74 61 62  to the %_idx tab
3730: 6c 65 20 2a 2f 0a 20 20 46 74 73 35 42 75 66 66  le */.  Fts5Buff
3740: 65 72 20 62 74 74 65 72 6d 3b 20 20 20 20 20 20  er btterm;      
3750: 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 78 74 20          /* Next 
3760: 74 65 72 6d 20 74 6f 20 69 6e 73 65 72 74 20 69  term to insert i
3770: 6e 74 6f 20 25 5f 69 64 78 20 74 61 62 6c 65 20  nto %_idx table 
3780: 2a 2f 0a 20 20 69 6e 74 20 69 42 74 50 61 67 65  */.  int iBtPage
3790: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
37a0: 20 20 20 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d       /* Page num
37b0: 62 65 72 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  ber correspondin
37c0: 67 20 74 6f 20 62 74 74 65 72 6d 20 2a 2f 0a 7d  g to btterm */.}
37d0: 3b 0a 0a 2f 2a 0a 2a 2a 20 4f 62 6a 65 63 74 20  ;../*.** Object 
37e0: 66 6f 72 20 69 74 65 72 61 74 69 6e 67 20 74 68  for iterating th
37f0: 72 6f 75 67 68 20 74 68 65 20 6d 65 72 67 65 64  rough the merged
3800: 20 72 65 73 75 6c 74 73 20 6f 66 20 6f 6e 65 20   results of one 
3810: 6f 72 20 6d 6f 72 65 20 73 65 67 6d 65 6e 74 73  or more segments
3820: 2c 0a 2a 2a 20 76 69 73 69 74 69 6e 67 20 65 61  ,.** visiting ea
3830: 63 68 20 74 65 72 6d 2f 72 6f 77 69 64 20 70 61  ch term/rowid pa
3840: 69 72 20 69 6e 20 74 68 65 20 6d 65 72 67 65 64  ir in the merged
3850: 20 64 61 74 61 2e 0a 2a 2a 0a 2a 2a 20 6e 53 65   data..**.** nSe
3860: 67 20 69 73 20 61 6c 77 61 79 73 20 61 20 70 6f  g is always a po
3870: 77 65 72 20 6f 66 20 74 77 6f 20 67 72 65 61 74  wer of two great
3880: 65 72 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c  er than or equal
3890: 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   to the number o
38a0: 66 0a 2a 2a 20 73 65 67 6d 65 6e 74 73 20 74 68  f.** segments th
38b0: 61 74 20 74 68 69 73 20 6f 62 6a 65 63 74 20 69  at this object i
38c0: 73 20 6d 65 72 67 69 6e 67 20 64 61 74 61 20 66  s merging data f
38d0: 72 6f 6d 2e 20 42 6f 74 68 20 74 68 65 20 61 53  rom. Both the aS
38e0: 65 67 5b 5d 20 61 6e 64 0a 2a 2a 20 61 46 69 72  eg[] and.** aFir
38f0: 73 74 5b 5d 20 61 72 72 61 79 73 20 61 72 65 20  st[] arrays are 
3900: 73 69 7a 65 64 20 61 74 20 6e 53 65 67 20 65 6e  sized at nSeg en
3910: 74 72 69 65 73 2e 20 54 68 65 20 61 53 65 67 5b  tries. The aSeg[
3920: 5d 20 61 72 72 61 79 20 69 73 20 70 61 64 64 65  ] array is padde
3930: 64 0a 2a 2a 20 77 69 74 68 20 7a 65 72 6f 65 64  d.** with zeroed
3940: 20 6f 62 6a 65 63 74 73 20 2d 20 74 68 65 73 65   objects - these
3950: 20 61 72 65 20 68 61 6e 64 6c 65 64 20 61 73 20   are handled as 
3960: 69 66 20 74 68 65 79 20 77 65 72 65 20 69 74 65  if they were ite
3970: 72 61 74 6f 72 73 20 6f 70 65 6e 65 64 0a 2a 2a  rators opened.**
3980: 20 6f 6e 20 65 6d 70 74 79 20 73 65 67 6d 65 6e   on empty segmen
3990: 74 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65  ts..**.** The re
39a0: 73 75 6c 74 73 20 6f 66 20 63 6f 6d 70 61 72 69  sults of compari
39b0: 6e 67 20 73 65 67 6d 65 6e 74 73 20 61 53 65 67  ng segments aSeg
39c0: 5b 4e 5d 20 61 6e 64 20 61 53 65 67 5b 4e 2b 31  [N] and aSeg[N+1
39d0: 5d 2c 20 77 68 65 72 65 20 4e 20 69 73 20 61 6e  ], where N is an
39e0: 0a 2a 2a 20 65 76 65 6e 20 6e 75 6d 62 65 72 2c  .** even number,
39f0: 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 61 46   is stored in aF
3a00: 69 72 73 74 5b 28 6e 53 65 67 2b 4e 29 2f 32 5d  irst[(nSeg+N)/2]
3a10: 2e 20 54 68 65 20 22 72 65 73 75 6c 74 22 20 6f  . The "result" o
3a20: 66 20 74 68 65 20 0a 2a 2a 20 63 6f 6d 70 61 72  f the .** compar
3a30: 69 73 6f 6e 20 69 6e 20 74 68 69 73 20 63 6f 6e  ison in this con
3a40: 74 65 78 74 20 69 73 20 74 68 65 20 69 6e 64 65  text is the inde
3a50: 78 20 6f 66 20 74 68 65 20 69 74 65 72 61 74 6f  x of the iterato
3a60: 72 20 74 68 61 74 20 63 75 72 72 65 6e 74 6c 79  r that currently
3a70: 0a 2a 2a 20 70 6f 69 6e 74 73 20 74 6f 20 74 68  .** points to th
3a80: 65 20 73 6d 61 6c 6c 65 72 20 74 65 72 6d 2f 72  e smaller term/r
3a90: 6f 77 69 64 20 63 6f 6d 62 69 6e 61 74 69 6f 6e  owid combination
3aa0: 2e 20 49 74 65 72 61 74 6f 72 73 20 61 74 20 45  . Iterators at E
3ab0: 4f 46 20 61 72 65 0a 2a 2a 20 63 6f 6e 73 69 64  OF are.** consid
3ac0: 65 72 65 64 20 74 6f 20 62 65 20 67 72 65 61 74  ered to be great
3ad0: 65 72 20 74 68 61 6e 20 61 6c 6c 20 6f 74 68 65  er than all othe
3ae0: 72 20 69 74 65 72 61 74 6f 72 73 2e 0a 2a 2a 0a  r iterators..**.
3af0: 2a 2a 20 61 46 69 72 73 74 5b 31 5d 20 63 6f 6e  ** aFirst[1] con
3b00: 74 61 69 6e 73 20 74 68 65 20 69 6e 64 65 78 20  tains the index 
3b10: 69 6e 20 61 53 65 67 5b 5d 20 6f 66 20 74 68 65  in aSeg[] of the
3b20: 20 69 74 65 72 61 74 6f 72 20 74 68 61 74 20 70   iterator that p
3b30: 6f 69 6e 74 73 20 74 6f 0a 2a 2a 20 74 68 65 20  oints to.** the 
3b40: 73 6d 61 6c 6c 65 73 74 20 6b 65 79 20 6f 76 65  smallest key ove
3b50: 72 61 6c 6c 2e 20 61 46 69 72 73 74 5b 30 5d 20  rall. aFirst[0] 
3b60: 69 73 20 75 6e 75 73 65 64 2e 20 0a 2a 2f 0a 0a  is unused. .*/..
3b70: 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 46  typedef struct F
3b80: 74 73 35 43 52 65 73 75 6c 74 20 46 74 73 35 43  ts5CResult Fts5C
3b90: 52 65 73 75 6c 74 3b 0a 73 74 72 75 63 74 20 46  Result;.struct F
3ba0: 74 73 35 43 52 65 73 75 6c 74 20 7b 0a 20 20 75  ts5CResult {.  u
3bb0: 31 36 20 69 46 69 72 73 74 3b 20 20 20 20 20 20  16 iFirst;      
3bc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
3bd0: 2a 20 61 53 65 67 5b 5d 20 69 6e 64 65 78 20 6f  * aSeg[] index o
3be0: 66 20 66 69 72 73 74 65 73 74 20 69 74 65 72 61  f firstest itera
3bf0: 74 6f 72 20 2a 2f 0a 20 20 75 38 20 62 54 65 72  tor */.  u8 bTer
3c00: 6d 45 71 3b 20 20 20 20 20 20 20 20 20 20 20 20  mEq;            
3c10: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
3c20: 20 69 66 20 74 68 65 20 74 65 72 6d 73 20 61 72   if the terms ar
3c30: 65 20 65 71 75 61 6c 20 2a 2f 0a 7d 3b 0a 0a 2f  e equal */.};../
3c40: 2a 0a 2a 2a 20 4f 62 6a 65 63 74 20 66 6f 72 20  *.** Object for 
3c50: 69 74 65 72 61 74 69 6e 67 20 74 68 72 6f 75 67  iterating throug
3c60: 68 20 61 20 73 69 6e 67 6c 65 20 73 65 67 6d 65  h a single segme
3c70: 6e 74 2c 20 76 69 73 69 74 69 6e 67 20 65 61 63  nt, visiting eac
3c80: 68 20 74 65 72 6d 2f 72 6f 77 69 64 0a 2a 2a 20  h term/rowid.** 
3c90: 70 61 69 72 20 69 6e 20 74 68 65 20 73 65 67 6d  pair in the segm
3ca0: 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 70 53 65 67 3a  ent..**.** pSeg:
3cb0: 0a 2a 2a 20 20 20 54 68 65 20 73 65 67 6d 65 6e  .**   The segmen
3cc0: 74 20 74 6f 20 69 74 65 72 61 74 65 20 74 68 72  t to iterate thr
3cd0: 6f 75 67 68 2e 0a 2a 2a 0a 2a 2a 20 69 4c 65 61  ough..**.** iLea
3ce0: 66 50 67 6e 6f 3a 0a 2a 2a 20 20 20 43 75 72 72  fPgno:.**   Curr
3cf0: 65 6e 74 20 6c 65 61 66 20 70 61 67 65 20 6e 75  ent leaf page nu
3d00: 6d 62 65 72 20 77 69 74 68 69 6e 20 73 65 67 6d  mber within segm
3d10: 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 69 4c 65 61 66  ent..**.** iLeaf
3d20: 4f 66 66 73 65 74 3a 0a 2a 2a 20 20 20 42 79 74  Offset:.**   Byt
3d30: 65 20 6f 66 66 73 65 74 20 77 69 74 68 69 6e 20  e offset within 
3d40: 74 68 65 20 63 75 72 72 65 6e 74 20 6c 65 61 66  the current leaf
3d50: 20 74 68 61 74 20 69 73 20 74 68 65 20 66 69 72   that is the fir
3d60: 73 74 20 62 79 74 65 20 6f 66 20 74 68 65 20 0a  st byte of the .
3d70: 2a 2a 20 20 20 70 6f 73 69 74 69 6f 6e 20 6c 69  **   position li
3d80: 73 74 20 64 61 74 61 20 28 6f 6e 65 20 62 79 74  st data (one byt
3d90: 65 20 70 61 73 73 65 64 20 74 68 65 20 70 6f 73  e passed the pos
3da0: 69 74 69 6f 6e 2d 6c 69 73 74 20 73 69 7a 65 20  ition-list size 
3db0: 66 69 65 6c 64 29 2e 0a 2a 2a 20 20 20 72 6f 77  field)..**   row
3dc0: 69 64 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20  id field of the 
3dd0: 63 75 72 72 65 6e 74 20 65 6e 74 72 79 2e 20 55  current entry. U
3de0: 73 75 61 6c 6c 79 20 74 68 69 73 20 69 73 20 74  sually this is t
3df0: 68 65 20 73 69 7a 65 20 66 69 65 6c 64 20 6f 66  he size field of
3e00: 20 74 68 65 0a 2a 2a 20 20 20 70 6f 73 69 74 69   the.**   positi
3e10: 6f 6e 20 6c 69 73 74 20 64 61 74 61 2e 20 54 68  on list data. Th
3e20: 65 20 65 78 63 65 70 74 69 6f 6e 20 69 73 20 69  e exception is i
3e30: 66 20 74 68 65 20 72 6f 77 69 64 20 66 6f 72 20  f the rowid for 
3e40: 74 68 65 20 63 75 72 72 65 6e 74 20 65 6e 74 72  the current entr
3e50: 79 20 0a 2a 2a 20 20 20 69 73 20 74 68 65 20 6c  y .**   is the l
3e60: 61 73 74 20 74 68 69 6e 67 20 6f 6e 20 74 68 65  ast thing on the
3e70: 20 6c 65 61 66 20 70 61 67 65 2e 0a 2a 2a 0a 2a   leaf page..**.*
3e80: 2a 20 70 4c 65 61 66 3a 0a 2a 2a 20 20 20 42 75  * pLeaf:.**   Bu
3e90: 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20  ffer containing 
3ea0: 63 75 72 72 65 6e 74 20 6c 65 61 66 20 70 61 67  current leaf pag
3eb0: 65 20 64 61 74 61 2e 20 53 65 74 20 74 6f 20 4e  e data. Set to N
3ec0: 55 4c 4c 20 61 74 20 45 4f 46 2e 0a 2a 2a 0a 2a  ULL at EOF..**.*
3ed0: 2a 20 69 54 65 72 6d 4c 65 61 66 50 67 6e 6f 2c  * iTermLeafPgno,
3ee0: 20 69 54 65 72 6d 4c 65 61 66 4f 66 66 73 65 74   iTermLeafOffset
3ef0: 3a 0a 2a 2a 20 20 20 4c 65 61 66 20 70 61 67 65  :.**   Leaf page
3f00: 20 6e 75 6d 62 65 72 20 63 6f 6e 74 61 69 6e 69   number containi
3f10: 6e 67 20 74 68 65 20 6c 61 73 74 20 74 65 72 6d  ng the last term
3f20: 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 73   read from the s
3f30: 65 67 6d 65 6e 74 2e 20 41 6e 64 0a 2a 2a 20 20  egment. And.**  
3f40: 20 74 68 65 20 6f 66 66 73 65 74 20 69 6d 6d 65   the offset imme
3f50: 64 69 61 74 65 6c 79 20 66 6f 6c 6c 6f 77 69 6e  diately followin
3f60: 67 20 74 68 65 20 74 65 72 6d 20 64 61 74 61 2e  g the term data.
3f70: 0a 2a 2a 0a 2a 2a 20 66 6c 61 67 73 3a 0a 2a 2a  .**.** flags:.**
3f80: 20 20 20 4d 61 73 6b 20 6f 66 20 46 54 53 35 5f     Mask of FTS5_
3f90: 53 45 47 49 54 45 52 5f 58 58 58 20 76 61 6c 75  SEGITER_XXX valu
3fa0: 65 73 2e 20 49 6e 74 65 72 70 72 65 74 65 64 20  es. Interpreted 
3fb0: 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a  as follows:.**.*
3fc0: 2a 20 20 20 46 54 53 35 5f 53 45 47 49 54 45 52  *   FTS5_SEGITER
3fd0: 5f 4f 4e 45 54 45 52 4d 3a 0a 2a 2a 20 20 20 20  _ONETERM:.**    
3fe0: 20 49 66 20 73 65 74 2c 20 73 65 74 20 74 68 65   If set, set the
3ff0: 20 69 74 65 72 61 74 6f 72 20 74 6f 20 70 6f 69   iterator to poi
4000: 6e 74 20 74 6f 20 45 4f 46 20 61 66 74 65 72 20  nt to EOF after 
4010: 74 68 65 20 63 75 72 72 65 6e 74 20 64 6f 63 6c  the current docl
4020: 69 73 74 20 0a 2a 2a 20 20 20 20 20 68 61 73 20  ist .**     has 
4030: 62 65 65 6e 20 65 78 68 61 75 73 74 65 64 2e 20  been exhausted. 
4040: 44 6f 20 6e 6f 74 20 70 72 6f 63 65 65 64 20 74  Do not proceed t
4050: 6f 20 74 68 65 20 6e 65 78 74 20 74 65 72 6d 20  o the next term 
4060: 69 6e 20 74 68 65 20 73 65 67 6d 65 6e 74 2e 0a  in the segment..
4070: 2a 2a 0a 2a 2a 20 20 20 46 54 53 35 5f 53 45 47  **.**   FTS5_SEG
4080: 49 54 45 52 5f 52 45 56 45 52 53 45 3a 0a 2a 2a  ITER_REVERSE:.**
4090: 20 20 20 20 20 54 68 69 73 20 66 6c 61 67 20 69       This flag i
40a0: 73 20 6f 6e 6c 79 20 65 76 65 72 20 73 65 74 20  s only ever set 
40b0: 69 66 20 46 54 53 35 5f 53 45 47 49 54 45 52 5f  if FTS5_SEGITER_
40c0: 4f 4e 45 54 45 52 4d 20 69 73 20 61 6c 73 6f 20  ONETERM is also 
40d0: 73 65 74 2e 20 49 66 0a 2a 2a 20 20 20 20 20 69  set. If.**     i
40e0: 74 20 69 73 20 73 65 74 2c 20 69 74 65 72 61 74  t is set, iterat
40f0: 65 20 74 68 72 6f 75 67 68 20 72 6f 77 69 64 20  e through rowid 
4100: 69 6e 20 64 65 73 63 65 6e 64 69 6e 67 20 6f 72  in descending or
4110: 64 65 72 20 69 6e 73 74 65 61 64 20 6f 66 20 74  der instead of t
4120: 68 65 0a 2a 2a 20 20 20 20 20 64 65 66 61 75 6c  he.**     defaul
4130: 74 20 61 73 63 65 6e 64 69 6e 67 20 6f 72 64 65  t ascending orde
4140: 72 2e 0a 2a 2a 0a 2a 2a 20 69 52 6f 77 69 64 4f  r..**.** iRowidO
4150: 66 66 73 65 74 2f 6e 52 6f 77 69 64 4f 66 66 73  ffset/nRowidOffs
4160: 65 74 2f 61 52 6f 77 69 64 4f 66 66 73 65 74 3a  et/aRowidOffset:
4170: 0a 2a 2a 20 20 20 20 20 54 68 65 73 65 20 61 72  .**     These ar
4180: 65 20 75 73 65 64 20 69 66 20 74 68 65 20 46 54  e used if the FT
4190: 53 35 5f 53 45 47 49 54 45 52 5f 52 45 56 45 52  S5_SEGITER_REVER
41a0: 53 45 20 66 6c 61 67 20 69 73 20 73 65 74 2e 0a  SE flag is set..
41b0: 2a 2a 0a 2a 2a 20 20 20 20 20 46 6f 72 20 65 61  **.**     For ea
41c0: 63 68 20 72 6f 77 69 64 20 6f 6e 20 74 68 65 20  ch rowid on the 
41d0: 70 61 67 65 20 63 6f 72 72 65 73 70 6f 6e 64 69  page correspondi
41e0: 6e 67 20 74 6f 20 74 68 65 20 63 75 72 72 65 6e  ng to the curren
41f0: 74 20 74 65 72 6d 2c 20 74 68 65 0a 2a 2a 20 20  t term, the.**  
4200: 20 20 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67     corresponding
4210: 20 61 52 6f 77 69 64 4f 66 66 73 65 74 5b 5d 20   aRowidOffset[] 
4220: 65 6e 74 72 79 20 69 73 20 73 65 74 20 74 6f 20  entry is set to 
4230: 74 68 65 20 62 79 74 65 20 6f 66 66 73 65 74 20  the byte offset 
4240: 6f 66 20 74 68 65 0a 2a 2a 20 20 20 20 20 73 74  of the.**     st
4250: 61 72 74 20 6f 66 20 74 68 65 20 22 70 6f 73 69  art of the "posi
4260: 74 69 6f 6e 2d 6c 69 73 74 2d 73 69 7a 65 22 20  tion-list-size" 
4270: 66 69 65 6c 64 20 77 69 74 68 69 6e 20 74 68 65  field within the
4280: 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 69 54 65   page..**.** iTe
4290: 72 6d 49 64 78 3a 0a 2a 2a 20 20 20 20 20 49 6e  rmIdx:.**     In
42a0: 64 65 78 20 6f 66 20 63 75 72 72 65 6e 74 20 74  dex of current t
42b0: 65 72 6d 20 6f 6e 20 69 54 65 72 6d 4c 65 61 66  erm on iTermLeaf
42c0: 50 67 6e 6f 2e 0a 2a 2f 0a 73 74 72 75 63 74 20  Pgno..*/.struct 
42d0: 46 74 73 35 53 65 67 49 74 65 72 20 7b 0a 20 20  Fts5SegIter {.  
42e0: 46 74 73 35 53 74 72 75 63 74 75 72 65 53 65 67  Fts5StructureSeg
42f0: 6d 65 6e 74 20 2a 70 53 65 67 3b 20 20 20 20 20  ment *pSeg;     
4300: 2f 2a 20 53 65 67 6d 65 6e 74 20 74 6f 20 69 74  /* Segment to it
4310: 65 72 61 74 65 20 74 68 72 6f 75 67 68 20 2a 2f  erate through */
4320: 0a 20 20 69 6e 74 20 66 6c 61 67 73 3b 20 20 20  .  int flags;   
4330: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4340: 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 63 6f     /* Mask of co
4350: 6e 66 69 67 75 72 61 74 69 6f 6e 20 66 6c 61 67  nfiguration flag
4360: 73 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 65 61 66  s */.  int iLeaf
4370: 50 67 6e 6f 3b 20 20 20 20 20 20 20 20 20 20 20  Pgno;           
4380: 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e         /* Curren
4390: 74 20 6c 65 61 66 20 70 61 67 65 20 6e 75 6d 62  t leaf page numb
43a0: 65 72 20 2a 2f 0a 20 20 46 74 73 35 44 61 74 61  er */.  Fts5Data
43b0: 20 2a 70 4c 65 61 66 3b 20 20 20 20 20 20 20 20   *pLeaf;        
43c0: 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65          /* Curre
43d0: 6e 74 20 6c 65 61 66 20 64 61 74 61 20 2a 2f 0a  nt leaf data */.
43e0: 20 20 46 74 73 35 44 61 74 61 20 2a 70 4e 65 78    Fts5Data *pNex
43f0: 74 4c 65 61 66 3b 20 20 20 20 20 20 20 20 20 20  tLeaf;          
4400: 20 20 2f 2a 20 4c 65 61 66 20 70 61 67 65 20 28    /* Leaf page (
4410: 69 4c 65 61 66 50 67 6e 6f 2b 31 29 20 2a 2f 0a  iLeafPgno+1) */.
4420: 20 20 69 6e 74 20 69 4c 65 61 66 4f 66 66 73 65    int iLeafOffse
4430: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
4440: 20 20 2f 2a 20 42 79 74 65 20 6f 66 66 73 65 74    /* Byte offset
4450: 20 77 69 74 68 69 6e 20 63 75 72 72 65 6e 74 20   within current 
4460: 6c 65 61 66 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68  leaf */..  /* Th
4470: 65 20 70 61 67 65 20 61 6e 64 20 6f 66 66 73 65  e page and offse
4480: 74 20 66 72 6f 6d 20 77 68 69 63 68 20 74 68 65  t from which the
4490: 20 63 75 72 72 65 6e 74 20 74 65 72 6d 20 77 61   current term wa
44a0: 73 20 72 65 61 64 2e 20 54 68 65 20 6f 66 66 73  s read. The offs
44b0: 65 74 20 0a 20 20 2a 2a 20 69 73 20 74 68 65 20  et .  ** is the 
44c0: 6f 66 66 73 65 74 20 6f 66 20 74 68 65 20 66 69  offset of the fi
44d0: 72 73 74 20 72 6f 77 69 64 20 69 6e 20 74 68 65  rst rowid in the
44e0: 20 63 75 72 72 65 6e 74 20 64 6f 63 6c 69 73 74   current doclist
44f0: 2e 20 20 2a 2f 0a 20 20 69 6e 74 20 69 54 65 72  .  */.  int iTer
4500: 6d 4c 65 61 66 50 67 6e 6f 3b 0a 20 20 69 6e 74  mLeafPgno;.  int
4510: 20 69 54 65 72 6d 4c 65 61 66 4f 66 66 73 65 74   iTermLeafOffset
4520: 3b 0a 0a 20 20 69 6e 74 20 69 50 67 69 64 78 4f  ;..  int iPgidxO
4530: 66 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ff;             
4540: 20 20 20 20 20 2f 2a 20 4e 65 78 74 20 6f 66 66       /* Next off
4550: 73 65 74 20 69 6e 20 70 67 69 64 78 20 2a 2f 0a  set in pgidx */.
4560: 20 20 69 6e 74 20 69 45 6e 64 6f 66 44 6f 63 6c    int iEndofDocl
4570: 69 73 74 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 66  ist;..  /* The f
4580: 6f 6c 6c 6f 77 69 6e 67 20 61 72 65 20 6f 6e 6c  ollowing are onl
4590: 79 20 75 73 65 64 20 69 66 20 74 68 65 20 46 54  y used if the FT
45a0: 53 35 5f 53 45 47 49 54 45 52 5f 52 45 56 45 52  S5_SEGITER_REVER
45b0: 53 45 20 66 6c 61 67 20 69 73 20 73 65 74 2e 20  SE flag is set. 
45c0: 2a 2f 0a 20 20 69 6e 74 20 69 52 6f 77 69 64 4f  */.  int iRowidO
45d0: 66 66 73 65 74 3b 20 20 20 20 20 20 20 20 20 20  ffset;          
45e0: 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20       /* Current 
45f0: 65 6e 74 72 79 20 69 6e 20 61 52 6f 77 69 64 4f  entry in aRowidO
4600: 66 66 73 65 74 5b 5d 20 2a 2f 0a 20 20 69 6e 74  ffset[] */.  int
4610: 20 6e 52 6f 77 69 64 4f 66 66 73 65 74 3b 20 20   nRowidOffset;  
4620: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
4630: 41 6c 6c 6f 63 61 74 65 64 20 73 69 7a 65 20 6f  Allocated size o
4640: 66 20 61 52 6f 77 69 64 4f 66 66 73 65 74 5b 5d  f aRowidOffset[]
4650: 20 61 72 72 61 79 20 2a 2f 0a 20 20 69 6e 74 20   array */.  int 
4660: 2a 61 52 6f 77 69 64 4f 66 66 73 65 74 3b 20 20  *aRowidOffset;  
4670: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
4680: 72 72 61 79 20 6f 66 20 6f 66 66 73 65 74 20 74  rray of offset t
4690: 6f 20 72 6f 77 69 64 20 66 69 65 6c 64 73 20 2a  o rowid fields *
46a0: 2f 0a 0a 20 20 46 74 73 35 44 6c 69 64 78 49 74  /..  Fts5DlidxIt
46b0: 65 72 20 2a 70 44 6c 69 64 78 3b 20 20 20 20 20  er *pDlidx;     
46c0: 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65       /* If there
46d0: 20 69 73 20 61 20 64 6f 63 6c 69 73 74 2d 69 6e   is a doclist-in
46e0: 64 65 78 20 2a 2f 0a 0a 20 20 2f 2a 20 56 61 72  dex */..  /* Var
46f0: 69 61 62 6c 65 73 20 70 6f 70 75 6c 61 74 65 64  iables populated
4700: 20 62 61 73 65 64 20 6f 6e 20 63 75 72 72 65 6e   based on curren
4710: 74 20 65 6e 74 72 79 2e 20 2a 2f 0a 20 20 46 74  t entry. */.  Ft
4720: 73 35 42 75 66 66 65 72 20 74 65 72 6d 3b 20 20  s5Buffer term;  
4730: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
4740: 20 43 75 72 72 65 6e 74 20 74 65 72 6d 20 2a 2f   Current term */
4750: 0a 20 20 69 36 34 20 69 52 6f 77 69 64 3b 20 20  .  i64 iRowid;  
4760: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4770: 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 72 6f     /* Current ro
4780: 77 69 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 6f  wid */.  int nPo
4790: 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s;              
47a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
47b0: 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20 63  er of bytes in c
47c0: 75 72 72 65 6e 74 20 70 6f 73 69 74 69 6f 6e 20  urrent position 
47d0: 6c 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20 62 44  list */.  int bD
47e0: 65 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  el;             
47f0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
4800: 65 20 69 66 20 74 68 65 20 64 65 6c 65 74 65 20  e if the delete 
4810: 66 6c 61 67 20 69 73 20 73 65 74 20 2a 2f 0a 7d  flag is set */.}
4820: 3b 0a 0a 2f 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e  ;../*.** Argumen
4830: 74 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74  t is a pointer t
4840: 6f 20 61 6e 20 46 74 73 35 44 61 74 61 20 73 74  o an Fts5Data st
4850: 72 75 63 74 75 72 65 20 74 68 61 74 20 63 6f 6e  ructure that con
4860: 74 61 69 6e 73 20 61 20 0a 2a 2a 20 6c 65 61 66  tains a .** leaf
4870: 20 70 61 67 65 2e 0a 2a 2f 0a 23 64 65 66 69 6e   page..*/.#defin
4880: 65 20 41 53 53 45 52 54 5f 53 5a 4c 45 41 46 5f  e ASSERT_SZLEAF_
4890: 4f 4b 28 78 29 20 61 73 73 65 72 74 28 20 5c 0a  OK(x) assert( \.
48a0: 20 20 20 20 28 78 29 2d 3e 73 7a 4c 65 61 66 3d      (x)->szLeaf=
48b0: 3d 28 78 29 2d 3e 6e 6e 20 7c 7c 20 28 78 29 2d  =(x)->nn || (x)-
48c0: 3e 73 7a 4c 65 61 66 3d 3d 66 74 73 35 47 65 74  >szLeaf==fts5Get
48d0: 55 31 36 28 26 28 78 29 2d 3e 70 5b 32 5d 29 20  U16(&(x)->p[2]) 
48e0: 5c 0a 29 0a 0a 23 64 65 66 69 6e 65 20 46 54 53  \.)..#define FTS
48f0: 35 5f 53 45 47 49 54 45 52 5f 4f 4e 45 54 45 52  5_SEGITER_ONETER
4900: 4d 20 30 78 30 31 0a 23 64 65 66 69 6e 65 20 46  M 0x01.#define F
4910: 54 53 35 5f 53 45 47 49 54 45 52 5f 52 45 56 45  TS5_SEGITER_REVE
4920: 52 53 45 20 30 78 30 32 0a 0a 0a 2f 2a 20 0a 2a  RSE 0x02.../* .*
4930: 2a 20 41 72 67 75 6d 65 6e 74 20 69 73 20 61 20  * Argument is a 
4940: 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 46 74  pointer to an Ft
4950: 73 35 44 61 74 61 20 73 74 72 75 63 74 75 72 65  s5Data structure
4960: 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 61   that contains a
4970: 20 6c 65 61 66 0a 2a 2a 20 70 61 67 65 2e 20 54   leaf.** page. T
4980: 68 69 73 20 6d 61 63 72 6f 20 65 76 61 6c 75 61  his macro evalua
4990: 74 65 73 20 74 6f 20 74 72 75 65 20 69 66 20 74  tes to true if t
49a0: 68 65 20 6c 65 61 66 20 63 6f 6e 74 61 69 6e 73  he leaf contains
49b0: 20 6e 6f 20 74 65 72 6d 73 2c 20 6f 72 0a 2a 2a   no terms, or.**
49c0: 20 66 61 6c 73 65 20 69 66 20 69 74 20 63 6f 6e   false if it con
49d0: 74 61 69 6e 73 20 61 74 20 6c 65 61 73 74 20 6f  tains at least o
49e0: 6e 65 20 74 65 72 6d 2e 0a 2a 2f 0a 23 64 65 66  ne term..*/.#def
49f0: 69 6e 65 20 66 74 73 35 4c 65 61 66 49 73 54 65  ine fts5LeafIsTe
4a00: 72 6d 6c 65 73 73 28 78 29 20 28 28 78 29 2d 3e  rmless(x) ((x)->
4a10: 73 7a 4c 65 61 66 20 3e 3d 20 28 78 29 2d 3e 6e  szLeaf >= (x)->n
4a20: 6e 29 0a 0a 23 64 65 66 69 6e 65 20 66 74 73 35  n)..#define fts5
4a30: 4c 65 61 66 54 65 72 6d 4f 66 66 28 78 2c 20 69  LeafTermOff(x, i
4a40: 29 20 28 66 74 73 35 47 65 74 55 31 36 28 26 28  ) (fts5GetU16(&(
4a50: 78 29 2d 3e 70 5b 28 78 29 2d 3e 73 7a 4c 65 61  x)->p[(x)->szLea
4a60: 66 20 2b 20 28 69 29 2a 32 5d 29 29 0a 0a 23 64  f + (i)*2]))..#d
4a70: 65 66 69 6e 65 20 66 74 73 35 4c 65 61 66 46 69  efine fts5LeafFi
4a80: 72 73 74 52 6f 77 69 64 4f 66 66 28 78 29 20 28  rstRowidOff(x) (
4a90: 66 74 73 35 47 65 74 55 31 36 28 28 78 29 2d 3e  fts5GetU16((x)->
4aa0: 70 29 29 0a 0a 2f 2a 0a 2a 2a 20 70 6f 73 6c 69  p))../*.** posli
4ab0: 73 74 3a 0a 2a 2a 20 20 20 55 73 65 64 20 62 79  st:.**   Used by
4ac0: 20 73 71 6c 69 74 65 33 46 74 73 35 49 74 65 72   sqlite3Fts5Iter
4ad0: 50 6f 73 6c 69 73 74 28 29 20 77 68 65 6e 20 74  Poslist() when t
4ae0: 68 65 20 70 6f 73 6c 69 73 74 20 6e 65 65 64 73  he poslist needs
4af0: 20 74 6f 20 62 65 20 62 75 66 66 65 72 65 64 2e   to be buffered.
4b00: 0a 2a 2a 20 20 20 54 68 65 72 65 20 69 73 20 6e  .**   There is n
4b10: 6f 20 77 61 79 20 74 6f 20 74 65 6c 6c 20 69 66  o way to tell if
4b20: 20 74 68 69 73 20 69 73 20 70 6f 70 75 6c 61 74   this is populat
4b30: 65 64 20 6f 72 20 6e 6f 74 2e 0a 2a 2f 0a 73 74  ed or not..*/.st
4b40: 72 75 63 74 20 46 74 73 35 49 6e 64 65 78 49 74  ruct Fts5IndexIt
4b50: 65 72 20 7b 0a 20 20 46 74 73 35 49 6e 64 65 78  er {.  Fts5Index
4b60: 20 2a 70 49 6e 64 65 78 3b 20 20 20 20 20 20 20   *pIndex;       
4b70: 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
4b80: 74 68 61 74 20 6f 77 6e 73 20 74 68 69 73 20 69  that owns this i
4b90: 74 65 72 61 74 6f 72 20 2a 2f 0a 20 20 46 74 73  terator */.  Fts
4ba0: 35 53 74 72 75 63 74 75 72 65 20 2a 70 53 74 72  5Structure *pStr
4bb0: 75 63 74 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  uct;         /* 
4bc0: 44 61 74 61 62 61 73 65 20 73 74 72 75 63 74 75  Database structu
4bd0: 72 65 20 66 6f 72 20 74 68 69 73 20 69 74 65 72  re for this iter
4be0: 61 74 6f 72 20 2a 2f 0a 20 20 46 74 73 35 42 75  ator */.  Fts5Bu
4bf0: 66 66 65 72 20 70 6f 73 6c 69 73 74 3b 20 20 20  ffer poslist;   
4c00: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 75 66            /* Buf
4c10: 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 63  fer containing c
4c20: 75 72 72 65 6e 74 20 70 6f 73 6c 69 73 74 20 2a  urrent poslist *
4c30: 2f 0a 0a 20 20 69 6e 74 20 6e 53 65 67 3b 20 20  /..  int nSeg;  
4c40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4c50: 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
4c60: 61 53 65 67 5b 5d 20 61 72 72 61 79 20 2a 2f 0a  aSeg[] array */.
4c70: 20 20 69 6e 74 20 62 52 65 76 3b 20 20 20 20 20    int bRev;     
4c80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4c90: 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 69 74 65    /* True to ite
4ca0: 72 61 74 65 20 69 6e 20 72 65 76 65 72 73 65 20  rate in reverse 
4cb0: 6f 72 64 65 72 20 2a 2f 0a 20 20 69 6e 74 20 62  order */.  int b
4cc0: 53 6b 69 70 45 6d 70 74 79 3b 20 20 20 20 20 20  SkipEmpty;      
4cd0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
4ce0: 75 65 20 74 6f 20 73 6b 69 70 20 64 65 6c 65 74  ue to skip delet
4cf0: 65 64 20 65 6e 74 72 69 65 73 20 2a 2f 0a 20 20  ed entries */.  
4d00: 69 6e 74 20 62 45 6f 66 3b 20 20 20 20 20 20 20  int bEof;       
4d10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4d20: 2f 2a 20 54 72 75 65 20 61 74 20 45 4f 46 20 2a  /* True at EOF *
4d30: 2f 0a 0a 20 20 69 36 34 20 69 53 77 69 74 63 68  /..  i64 iSwitch
4d40: 52 6f 77 69 64 3b 20 20 20 20 20 20 20 20 20 20  Rowid;          
4d50: 20 20 20 20 20 2f 2a 20 46 69 72 73 74 65 73 74       /* Firstest
4d60: 20 72 6f 77 69 64 20 6f 66 20 6f 74 68 65 72 20   rowid of other 
4d70: 74 68 61 6e 20 61 46 69 72 73 74 5b 31 5d 20 2a  than aFirst[1] *
4d80: 2f 0a 20 20 46 74 73 35 43 52 65 73 75 6c 74 20  /.  Fts5CResult 
4d90: 2a 61 46 69 72 73 74 3b 20 20 20 20 20 20 20 20  *aFirst;        
4da0: 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 6d      /* Current m
4db0: 65 72 67 65 20 73 74 61 74 65 20 28 73 65 65 20  erge state (see 
4dc0: 61 62 6f 76 65 29 20 2a 2f 0a 20 20 46 74 73 35  above) */.  Fts5
4dd0: 53 65 67 49 74 65 72 20 61 53 65 67 5b 31 5d 3b  SegIter aSeg[1];
4de0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
4df0: 72 72 61 79 20 6f 66 20 73 65 67 6d 65 6e 74 20  rray of segment 
4e00: 69 74 65 72 61 74 6f 72 73 20 2a 2f 0a 7d 3b 0a  iterators */.};.
4e10: 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74 61  ../*.** An insta
4e20: 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  nce of the follo
4e30: 77 69 6e 67 20 74 79 70 65 20 69 73 20 75 73 65  wing type is use
4e40: 64 20 74 6f 20 69 74 65 72 61 74 65 20 74 68 72  d to iterate thr
4e50: 6f 75 67 68 20 74 68 65 20 63 6f 6e 74 65 6e 74  ough the content
4e60: 73 0a 2a 2a 20 6f 66 20 61 20 64 6f 63 6c 69 73  s.** of a doclis
4e70: 74 2d 69 6e 64 65 78 20 72 65 63 6f 72 64 2e 0a  t-index record..
4e80: 2a 2a 0a 2a 2a 20 70 44 61 74 61 3a 0a 2a 2a 20  **.** pData:.** 
4e90: 20 20 52 65 63 6f 72 64 20 63 6f 6e 74 61 69 6e    Record contain
4ea0: 69 6e 67 20 74 68 65 20 64 6f 63 6c 69 73 74 2d  ing the doclist-
4eb0: 69 6e 64 65 78 20 64 61 74 61 2e 0a 2a 2a 0a 2a  index data..**.*
4ec0: 2a 20 62 45 6f 66 3a 0a 2a 2a 20 20 20 53 65 74  * bEof:.**   Set
4ed0: 20 74 6f 20 74 72 75 65 20 6f 6e 63 65 20 69 74   to true once it
4ee0: 65 72 61 74 6f 72 20 68 61 73 20 72 65 61 63 68  erator has reach
4ef0: 65 64 20 45 4f 46 2e 0a 2a 2a 0a 2a 2a 20 69 4f  ed EOF..**.** iO
4f00: 66 66 3a 0a 2a 2a 20 20 20 53 65 74 20 74 6f 20  ff:.**   Set to 
4f10: 74 68 65 20 63 75 72 72 65 6e 74 20 6f 66 66 73  the current offs
4f20: 65 74 20 77 69 74 68 69 6e 20 72 65 63 6f 72 64  et within record
4f30: 20 70 44 61 74 61 2e 0a 2a 2f 0a 73 74 72 75 63   pData..*/.struc
4f40: 74 20 46 74 73 35 44 6c 69 64 78 4c 76 6c 20 7b  t Fts5DlidxLvl {
4f50: 0a 20 20 46 74 73 35 44 61 74 61 20 2a 70 44 61  .  Fts5Data *pDa
4f60: 74 61 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ta;             
4f70: 20 2f 2a 20 44 61 74 61 20 66 6f 72 20 63 75 72   /* Data for cur
4f80: 72 65 6e 74 20 70 61 67 65 20 6f 66 20 74 68 69  rent page of thi
4f90: 73 20 6c 65 76 65 6c 20 2a 2f 0a 20 20 69 6e 74  s level */.  int
4fa0: 20 69 4f 66 66 3b 20 20 20 20 20 20 20 20 20 20   iOff;          
4fb0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75             /* Cu
4fc0: 72 72 65 6e 74 20 6f 66 66 73 65 74 20 69 6e 74  rrent offset int
4fd0: 6f 20 70 44 61 74 61 20 2a 2f 0a 20 20 69 6e 74  o pData */.  int
4fe0: 20 62 45 6f 66 3b 20 20 20 20 20 20 20 20 20 20   bEof;          
4ff0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 74             /* At
5000: 20 45 4f 46 20 61 6c 72 65 61 64 79 20 2a 2f 0a   EOF already */.
5010: 20 20 69 6e 74 20 69 46 69 72 73 74 4f 66 66 3b    int iFirstOff;
5020: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5030: 2f 2a 20 55 73 65 64 20 62 79 20 72 65 76 65 72  /* Used by rever
5040: 73 65 20 69 74 65 72 61 74 6f 72 73 20 2a 2f 0a  se iterators */.
5050: 0a 20 20 2f 2a 20 4f 75 74 70 75 74 20 76 61 72  .  /* Output var
5060: 69 61 62 6c 65 73 20 2a 2f 0a 20 20 69 6e 74 20  iables */.  int 
5070: 69 4c 65 61 66 50 67 6e 6f 3b 20 20 20 20 20 20  iLeafPgno;      
5080: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67            /* Pag
5090: 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 75 72 72  e number of curr
50a0: 65 6e 74 20 6c 65 61 66 20 70 61 67 65 20 2a 2f  ent leaf page */
50b0: 0a 20 20 69 36 34 20 69 52 6f 77 69 64 3b 20 20  .  i64 iRowid;  
50c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
50d0: 20 2f 2a 20 46 69 72 73 74 20 72 6f 77 69 64 20   /* First rowid 
50e0: 6f 6e 20 6c 65 61 66 20 69 4c 65 61 66 50 67 6e  on leaf iLeafPgn
50f0: 6f 20 2a 2f 0a 7d 3b 0a 73 74 72 75 63 74 20 46  o */.};.struct F
5100: 74 73 35 44 6c 69 64 78 49 74 65 72 20 7b 0a 20  ts5DlidxIter {. 
5110: 20 69 6e 74 20 6e 4c 76 6c 3b 0a 20 20 69 6e 74   int nLvl;.  int
5120: 20 69 53 65 67 69 64 3b 0a 20 20 46 74 73 35 44   iSegid;.  Fts5D
5130: 6c 69 64 78 4c 76 6c 20 61 4c 76 6c 5b 31 5d 3b  lidxLvl aLvl[1];
5140: 0a 7d 3b 0a 0a 73 74 61 74 69 63 20 76 6f 69 64  .};..static void
5150: 20 66 74 73 35 50 75 74 55 31 36 28 75 38 20 2a   fts5PutU16(u8 *
5160: 61 4f 75 74 2c 20 75 31 36 20 69 56 61 6c 29 7b  aOut, u16 iVal){
5170: 0a 20 20 61 4f 75 74 5b 30 5d 20 3d 20 28 69 56  .  aOut[0] = (iV
5180: 61 6c 3e 3e 38 29 3b 0a 20 20 61 4f 75 74 5b 31  al>>8);.  aOut[1
5190: 5d 20 3d 20 28 69 56 61 6c 26 30 78 46 46 29 3b  ] = (iVal&0xFF);
51a0: 0a 7d 0a 0a 73 74 61 74 69 63 20 75 31 36 20 66  .}..static u16 f
51b0: 74 73 35 47 65 74 55 31 36 28 63 6f 6e 73 74 20  ts5GetU16(const 
51c0: 75 38 20 2a 61 49 6e 29 7b 0a 20 20 72 65 74 75  u8 *aIn){.  retu
51d0: 72 6e 20 28 28 75 31 36 29 61 49 6e 5b 30 5d 20  rn ((u16)aIn[0] 
51e0: 3c 3c 20 38 29 20 2b 20 61 49 6e 5b 31 5d 3b 0a  << 8) + aIn[1];.
51f0: 7d 20 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61  } ../*.** Alloca
5200: 74 65 20 61 6e 64 20 72 65 74 75 72 6e 20 61 20  te and return a 
5210: 62 75 66 66 65 72 20 61 74 20 6c 65 61 73 74 20  buffer at least 
5220: 6e 42 79 74 65 20 62 79 74 65 73 20 69 6e 20 73  nByte bytes in s
5230: 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  ize..**.** If an
5240: 20 4f 4f 4d 20 65 72 72 6f 72 20 69 73 20 65 6e   OOM error is en
5250: 63 6f 75 6e 74 65 72 65 64 2c 20 72 65 74 75 72  countered, retur
5260: 6e 20 4e 55 4c 4c 20 61 6e 64 20 73 65 74 20 74  n NULL and set t
5270: 68 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69 6e  he error code in
5280: 0a 2a 2a 20 74 68 65 20 46 74 73 35 49 6e 64 65  .** the Fts5Inde
5290: 78 20 68 61 6e 64 6c 65 20 70 61 73 73 65 64 20  x handle passed 
52a0: 61 73 20 74 68 65 20 66 69 72 73 74 20 61 72 67  as the first arg
52b0: 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  ument..*/.static
52c0: 20 76 6f 69 64 20 2a 66 74 73 35 49 64 78 4d 61   void *fts5IdxMa
52d0: 6c 6c 6f 63 28 46 74 73 35 49 6e 64 65 78 20 2a  lloc(Fts5Index *
52e0: 70 2c 20 69 6e 74 20 6e 42 79 74 65 29 7b 0a 20  p, int nByte){. 
52f0: 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 46   return sqlite3F
5300: 74 73 35 4d 61 6c 6c 6f 63 5a 65 72 6f 28 26 70  ts5MallocZero(&p
5310: 2d 3e 72 63 2c 20 6e 42 79 74 65 29 3b 0a 7d 0a  ->rc, nByte);.}.
5320: 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65 20 74  ./*.** Compare t
5330: 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  he contents of t
5340: 68 65 20 70 4c 65 66 74 20 62 75 66 66 65 72 20  he pLeft buffer 
5350: 77 69 74 68 20 74 68 65 20 70 52 69 67 68 74 2f  with the pRight/
5360: 6e 52 69 67 68 74 20 62 6c 6f 62 2e 0a 2a 2a 0a  nRight blob..**.
5370: 2a 2a 20 52 65 74 75 72 6e 20 2d 76 65 20 69 66  ** Return -ve if
5380: 20 70 4c 65 66 74 20 69 73 20 73 6d 61 6c 6c 65   pLeft is smalle
5390: 72 20 74 68 61 6e 20 70 52 69 67 68 74 2c 20 30  r than pRight, 0
53a0: 20 69 66 20 74 68 65 79 20 61 72 65 20 65 71 75   if they are equ
53b0: 61 6c 20 6f 72 0a 2a 2a 20 2b 76 65 20 69 66 20  al or.** +ve if 
53c0: 70 52 69 67 68 74 20 69 73 20 73 6d 61 6c 6c 65  pRight is smalle
53d0: 72 20 74 68 61 6e 20 70 4c 65 66 74 2e 20 49 6e  r than pLeft. In
53e0: 20 6f 74 68 65 72 20 77 6f 72 64 73 3a 0a 2a 2a   other words:.**
53f0: 0a 2a 2a 20 20 20 20 20 72 65 73 20 3d 20 2a 70  .**     res = *p
5400: 4c 65 66 74 20 2d 20 2a 70 52 69 67 68 74 0a 2a  Left - *pRight.*
5410: 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
5420: 44 45 42 55 47 0a 73 74 61 74 69 63 20 69 6e 74  DEBUG.static int
5430: 20 66 74 73 35 42 75 66 66 65 72 43 6f 6d 70 61   fts5BufferCompa
5440: 72 65 42 6c 6f 62 28 0a 20 20 46 74 73 35 42 75  reBlob(.  Fts5Bu
5450: 66 66 65 72 20 2a 70 4c 65 66 74 2c 20 20 20 20  ffer *pLeft,    
5460: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 66            /* Lef
5470: 74 20 68 61 6e 64 20 73 69 64 65 20 6f 66 20 63  t hand side of c
5480: 6f 6d 70 61 72 69 73 6f 6e 20 2a 2f 0a 20 20 63  omparison */.  c
5490: 6f 6e 73 74 20 75 38 20 2a 70 52 69 67 68 74 2c  onst u8 *pRight,
54a0: 20 69 6e 74 20 6e 52 69 67 68 74 20 20 20 20 2f   int nRight    /
54b0: 2a 20 52 69 67 68 74 20 68 61 6e 64 20 73 69 64  * Right hand sid
54c0: 65 20 6f 66 20 63 6f 6d 70 61 72 69 73 6f 6e 20  e of comparison 
54d0: 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 43 6d 70  */.){.  int nCmp
54e0: 20 3d 20 4d 49 4e 28 70 4c 65 66 74 2d 3e 6e 2c   = MIN(pLeft->n,
54f0: 20 6e 52 69 67 68 74 29 3b 0a 20 20 69 6e 74 20   nRight);.  int 
5500: 72 65 73 20 3d 20 6d 65 6d 63 6d 70 28 70 4c 65  res = memcmp(pLe
5510: 66 74 2d 3e 70 2c 20 70 52 69 67 68 74 2c 20 6e  ft->p, pRight, n
5520: 43 6d 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 28  Cmp);.  return (
5530: 72 65 73 3d 3d 30 20 3f 20 28 70 4c 65 66 74 2d  res==0 ? (pLeft-
5540: 3e 6e 20 2d 20 6e 52 69 67 68 74 29 20 3a 20 72  >n - nRight) : r
5550: 65 73 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  es);.}.#endif../
5560: 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65 20 74 68 65  *.** Compare the
5570: 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
5580: 20 74 77 6f 20 62 75 66 66 65 72 73 20 75 73 69   two buffers usi
5590: 6e 67 20 6d 65 6d 63 6d 70 28 29 2e 20 49 66 20  ng memcmp(). If 
55a0: 6f 6e 65 20 62 75 66 66 65 72 0a 2a 2a 20 69 73  one buffer.** is
55b0: 20 61 20 70 72 65 66 69 78 20 6f 66 20 74 68 65   a prefix of the
55c0: 20 6f 74 68 65 72 2c 20 69 74 20 69 73 20 63 6f   other, it is co
55d0: 6e 73 69 64 65 72 65 64 20 74 68 65 20 6c 65 73  nsidered the les
55e0: 73 65 72 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  ser..**.** Retur
55f0: 6e 20 2d 76 65 20 69 66 20 70 4c 65 66 74 20 69  n -ve if pLeft i
5600: 73 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 70  s smaller than p
5610: 52 69 67 68 74 2c 20 30 20 69 66 20 74 68 65 79  Right, 0 if they
5620: 20 61 72 65 20 65 71 75 61 6c 20 6f 72 0a 2a 2a   are equal or.**
5630: 20 2b 76 65 20 69 66 20 70 52 69 67 68 74 20 69   +ve if pRight i
5640: 73 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 70  s smaller than p
5650: 4c 65 66 74 2e 20 49 6e 20 6f 74 68 65 72 20 77  Left. In other w
5660: 6f 72 64 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  ords:.**.**     
5670: 72 65 73 20 3d 20 2a 70 4c 65 66 74 20 2d 20 2a  res = *pLeft - *
5680: 70 52 69 67 68 74 0a 2a 2f 0a 73 74 61 74 69 63  pRight.*/.static
5690: 20 69 6e 74 20 66 74 73 35 42 75 66 66 65 72 43   int fts5BufferC
56a0: 6f 6d 70 61 72 65 28 46 74 73 35 42 75 66 66 65  ompare(Fts5Buffe
56b0: 72 20 2a 70 4c 65 66 74 2c 20 46 74 73 35 42 75  r *pLeft, Fts5Bu
56c0: 66 66 65 72 20 2a 70 52 69 67 68 74 29 7b 0a 20  ffer *pRight){. 
56d0: 20 69 6e 74 20 6e 43 6d 70 20 3d 20 4d 49 4e 28   int nCmp = MIN(
56e0: 70 4c 65 66 74 2d 3e 6e 2c 20 70 52 69 67 68 74  pLeft->n, pRight
56f0: 2d 3e 6e 29 3b 0a 20 20 69 6e 74 20 72 65 73 20  ->n);.  int res 
5700: 3d 20 6d 65 6d 63 6d 70 28 70 4c 65 66 74 2d 3e  = memcmp(pLeft->
5710: 70 2c 20 70 52 69 67 68 74 2d 3e 70 2c 20 6e 43  p, pRight->p, nC
5720: 6d 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 72  mp);.  return (r
5730: 65 73 3d 3d 30 20 3f 20 28 70 4c 65 66 74 2d 3e  es==0 ? (pLeft->
5740: 6e 20 2d 20 70 52 69 67 68 74 2d 3e 6e 29 20 3a  n - pRight->n) :
5750: 20 72 65 73 29 3b 0a 7d 0a 0a 23 69 66 64 65 66   res);.}..#ifdef
5760: 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 73 74   SQLITE_DEBUG.st
5770: 61 74 69 63 20 69 6e 74 20 66 74 73 35 42 6c 6f  atic int fts5Blo
5780: 62 43 6f 6d 70 61 72 65 28 0a 20 20 63 6f 6e 73  bCompare(.  cons
5790: 74 20 75 38 20 2a 70 4c 65 66 74 2c 20 69 6e 74  t u8 *pLeft, int
57a0: 20 6e 4c 65 66 74 2c 20 0a 20 20 63 6f 6e 73 74   nLeft, .  const
57b0: 20 75 38 20 2a 70 52 69 67 68 74 2c 20 69 6e 74   u8 *pRight, int
57c0: 20 6e 52 69 67 68 74 0a 29 7b 0a 20 20 69 6e 74   nRight.){.  int
57d0: 20 6e 43 6d 70 20 3d 20 4d 49 4e 28 6e 4c 65 66   nCmp = MIN(nLef
57e0: 74 2c 20 6e 52 69 67 68 74 29 3b 0a 20 20 69 6e  t, nRight);.  in
57f0: 74 20 72 65 73 20 3d 20 6d 65 6d 63 6d 70 28 70  t res = memcmp(p
5800: 4c 65 66 74 2c 20 70 52 69 67 68 74 2c 20 6e 43  Left, pRight, nC
5810: 6d 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 72  mp);.  return (r
5820: 65 73 3d 3d 30 20 3f 20 28 6e 4c 65 66 74 20 2d  es==0 ? (nLeft -
5830: 20 6e 52 69 67 68 74 29 20 3a 20 72 65 73 29 3b   nRight) : res);
5840: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 73 74 61 74 69  .}.#endif..stati
5850: 63 20 69 6e 74 20 66 74 73 35 4c 65 61 66 46 69  c int fts5LeafFi
5860: 72 73 74 54 65 72 6d 4f 66 66 28 46 74 73 35 44  rstTermOff(Fts5D
5870: 61 74 61 20 2a 70 4c 65 61 66 29 7b 0a 20 20 69  ata *pLeaf){.  i
5880: 6e 74 20 72 65 74 3b 0a 20 20 66 74 73 35 47 65  nt ret;.  fts5Ge
5890: 74 56 61 72 69 6e 74 33 32 28 26 70 4c 65 61 66  tVarint32(&pLeaf
58a0: 2d 3e 70 5b 70 4c 65 61 66 2d 3e 73 7a 4c 65 61  ->p[pLeaf->szLea
58b0: 66 5d 2c 20 72 65 74 29 3b 0a 20 20 72 65 74 75  f], ret);.  retu
58c0: 72 6e 20 72 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  rn ret;.}../*.**
58d0: 20 43 6c 6f 73 65 20 74 68 65 20 72 65 61 64 2d   Close the read-
58e0: 6f 6e 6c 79 20 62 6c 6f 62 20 68 61 6e 64 6c 65  only blob handle
58f0: 2c 20 69 66 20 69 74 20 69 73 20 6f 70 65 6e 2e  , if it is open.
5900: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
5910: 66 74 73 35 43 6c 6f 73 65 52 65 61 64 65 72 28  fts5CloseReader(
5920: 46 74 73 35 49 6e 64 65 78 20 2a 70 29 7b 0a 20  Fts5Index *p){. 
5930: 20 69 66 28 20 70 2d 3e 70 52 65 61 64 65 72 20   if( p->pReader 
5940: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62  ){.    sqlite3_b
5950: 6c 6f 62 20 2a 70 52 65 61 64 65 72 20 3d 20 70  lob *pReader = p
5960: 2d 3e 70 52 65 61 64 65 72 3b 0a 20 20 20 20 70  ->pReader;.    p
5970: 2d 3e 70 52 65 61 64 65 72 20 3d 20 30 3b 0a 20  ->pReader = 0;. 
5980: 20 20 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f     sqlite3_blob_
5990: 63 6c 6f 73 65 28 70 52 65 61 64 65 72 29 3b 0a  close(pReader);.
59a0: 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65    }.}.../*.** Re
59b0: 74 72 69 65 76 65 20 61 20 72 65 63 6f 72 64 20  trieve a record 
59c0: 66 72 6f 6d 20 74 68 65 20 25 5f 64 61 74 61 20  from the %_data 
59d0: 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  table..**.** If 
59e0: 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  an error occurs,
59f0: 20 4e 55 4c 4c 20 69 73 20 72 65 74 75 72 6e 65   NULL is returne
5a00: 64 20 61 6e 64 20 61 6e 20 65 72 72 6f 72 20 6c  d and an error l
5a10: 65 66 74 20 69 6e 20 74 68 65 20 0a 2a 2a 20 46  eft in the .** F
5a20: 74 73 35 49 6e 64 65 78 20 6f 62 6a 65 63 74 2e  ts5Index object.
5a30: 0a 2a 2f 0a 73 74 61 74 69 63 20 46 74 73 35 44  .*/.static Fts5D
5a40: 61 74 61 20 2a 66 74 73 35 44 61 74 61 52 65 61  ata *fts5DataRea
5a50: 64 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20  d(Fts5Index *p, 
5a60: 69 36 34 20 69 52 6f 77 69 64 29 7b 0a 20 20 46  i64 iRowid){.  F
5a70: 74 73 35 44 61 74 61 20 2a 70 52 65 74 20 3d 20  ts5Data *pRet = 
5a80: 30 3b 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d  0;.  if( p->rc==
5a90: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
5aa0: 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
5ab0: 5f 4f 4b 3b 0a 0a 20 20 20 20 69 66 28 20 70 2d  _OK;..    if( p-
5ac0: 3e 70 52 65 61 64 65 72 20 29 7b 0a 20 20 20 20  >pReader ){.    
5ad0: 20 20 2f 2a 20 54 68 69 73 20 63 61 6c 6c 20 6d    /* This call m
5ae0: 61 79 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  ay return SQLITE
5af0: 5f 41 42 4f 52 54 20 69 66 20 74 68 65 72 65 20  _ABORT if there 
5b00: 68 61 73 20 62 65 65 6e 20 61 20 73 61 76 65 70  has been a savep
5b10: 6f 69 6e 74 0a 20 20 20 20 20 20 2a 2a 20 72 6f  oint.      ** ro
5b20: 6c 6c 62 61 63 6b 20 73 69 6e 63 65 20 69 74 20  llback since it 
5b30: 77 61 73 20 6c 61 73 74 20 75 73 65 64 2e 20 49  was last used. I
5b40: 6e 20 74 68 69 73 20 63 61 73 65 20 61 20 6e 65  n this case a ne
5b50: 77 20 62 6c 6f 62 20 68 61 6e 64 6c 65 0a 20 20  w blob handle.  
5b60: 20 20 20 20 2a 2a 20 69 73 20 72 65 71 75 69 72      ** is requir
5b70: 65 64 2e 20 20 2a 2f 0a 20 20 20 20 20 20 73 71  ed.  */.      sq
5b80: 6c 69 74 65 33 5f 62 6c 6f 62 20 2a 70 42 6c 6f  lite3_blob *pBlo
5b90: 62 20 3d 20 70 2d 3e 70 52 65 61 64 65 72 3b 0a  b = p->pReader;.
5ba0: 20 20 20 20 20 20 70 2d 3e 70 52 65 61 64 65 72        p->pReader
5bb0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 63 20 3d   = 0;.      rc =
5bc0: 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 72 65   sqlite3_blob_re
5bd0: 6f 70 65 6e 28 70 42 6c 6f 62 2c 20 69 52 6f 77  open(pBlob, iRow
5be0: 69 64 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  id);.      asser
5bf0: 74 28 20 70 2d 3e 70 52 65 61 64 65 72 3d 3d 30  t( p->pReader==0
5c00: 20 29 3b 0a 20 20 20 20 20 20 70 2d 3e 70 52 65   );.      p->pRe
5c10: 61 64 65 72 20 3d 20 70 42 6c 6f 62 3b 0a 20 20  ader = pBlob;.  
5c20: 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
5c30: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
5c40: 20 66 74 73 35 43 6c 6f 73 65 52 65 61 64 65 72   fts5CloseReader
5c50: 28 70 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  (p);.      }.   
5c60: 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
5c70: 45 5f 41 42 4f 52 54 20 29 20 72 63 20 3d 20 53  E_ABORT ) rc = S
5c80: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a  QLITE_OK;.    }.
5c90: 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 62  .    /* If the b
5ca0: 6c 6f 62 20 68 61 6e 64 6c 65 20 69 73 20 6e 6f  lob handle is no
5cb0: 74 20 6f 70 65 6e 20 61 74 20 74 68 69 73 20 70  t open at this p
5cc0: 6f 69 6e 74 2c 20 6f 70 65 6e 20 69 74 20 61 6e  oint, open it an
5cd0: 64 20 73 65 65 6b 20 0a 20 20 20 20 2a 2a 20 74  d seek .    ** t
5ce0: 6f 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  o the requested 
5cf0: 65 6e 74 72 79 2e 20 20 2a 2f 0a 20 20 20 20 69  entry.  */.    i
5d00: 66 28 20 70 2d 3e 70 52 65 61 64 65 72 3d 3d 30  f( p->pReader==0
5d10: 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   && rc==SQLITE_O
5d20: 4b 20 29 7b 0a 20 20 20 20 20 20 46 74 73 35 43  K ){.      Fts5C
5d30: 6f 6e 66 69 67 20 2a 70 43 6f 6e 66 69 67 20 3d  onfig *pConfig =
5d40: 20 70 2d 3e 70 43 6f 6e 66 69 67 3b 0a 20 20 20   p->pConfig;.   
5d50: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f     rc = sqlite3_
5d60: 62 6c 6f 62 5f 6f 70 65 6e 28 70 43 6f 6e 66 69  blob_open(pConfi
5d70: 67 2d 3e 64 62 2c 20 0a 20 20 20 20 20 20 20 20  g->db, .        
5d80: 20 20 70 43 6f 6e 66 69 67 2d 3e 7a 44 62 2c 20    pConfig->zDb, 
5d90: 70 2d 3e 7a 44 61 74 61 54 62 6c 2c 20 22 62 6c  p->zDataTbl, "bl
5da0: 6f 63 6b 22 2c 20 69 52 6f 77 69 64 2c 20 30 2c  ock", iRowid, 0,
5db0: 20 26 70 2d 3e 70 52 65 61 64 65 72 0a 20 20 20   &p->pReader.   
5dc0: 20 20 20 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20     );.    }..   
5dd0: 20 2f 2a 20 49 66 20 65 69 74 68 65 72 20 6f 66   /* If either of
5de0: 20 74 68 65 20 73 71 6c 69 74 65 33 5f 62 6c 6f   the sqlite3_blo
5df0: 62 5f 6f 70 65 6e 28 29 20 6f 72 20 73 71 6c 69  b_open() or sqli
5e00: 74 65 33 5f 62 6c 6f 62 5f 72 65 6f 70 65 6e 28  te3_blob_reopen(
5e10: 29 20 63 61 6c 6c 73 0a 20 20 20 20 2a 2a 20 61  ) calls.    ** a
5e20: 62 6f 76 65 20 72 65 74 75 72 6e 65 64 20 53 51  bove returned SQ
5e30: 4c 49 54 45 5f 45 52 52 4f 52 2c 20 72 65 74 75  LITE_ERROR, retu
5e40: 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
5e50: 54 5f 56 54 41 42 20 69 6e 73 74 65 61 64 2e 0a  T_VTAB instead..
5e60: 20 20 20 20 2a 2a 20 41 6c 6c 20 74 68 65 20 72      ** All the r
5e70: 65 61 73 6f 6e 73 20 74 68 6f 73 65 20 66 75 6e  easons those fun
5e80: 63 74 69 6f 6e 73 20 6d 69 67 68 74 20 72 65 74  ctions might ret
5e90: 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  urn SQLITE_ERROR
5ea0: 20 2d 20 6d 69 73 73 69 6e 67 0a 20 20 20 20 2a   - missing.    *
5eb0: 2a 20 74 61 62 6c 65 2c 20 6d 69 73 73 69 6e 67  * table, missing
5ec0: 20 72 6f 77 2c 20 6e 6f 6e 2d 62 6c 6f 62 2f 74   row, non-blob/t
5ed0: 65 78 74 20 69 6e 20 62 6c 6f 63 6b 20 63 6f 6c  ext in block col
5ee0: 75 6d 6e 20 2d 20 69 6e 64 69 63 61 74 65 20 0a  umn - indicate .
5ef0: 20 20 20 20 2a 2a 20 62 61 63 6b 69 6e 67 20 73      ** backing s
5f00: 74 6f 72 65 20 63 6f 72 72 75 70 74 69 6f 6e 2e  tore corruption.
5f10: 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d    */.    if( rc=
5f20: 3d 53 51 4c 49 54 45 5f 45 52 52 4f 52 20 29 20  =SQLITE_ERROR ) 
5f30: 72 63 20 3d 20 46 54 53 35 5f 43 4f 52 52 55 50  rc = FTS5_CORRUP
5f40: 54 3b 0a 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  T;..    if( rc==
5f50: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
5f60: 20 20 20 75 38 20 2a 61 4f 75 74 20 3d 20 30 3b     u8 *aOut = 0;
5f70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
5f80: 2a 20 52 65 61 64 20 62 6c 6f 62 20 64 61 74 61  * Read blob data
5f90: 20 69 6e 74 6f 20 74 68 69 73 20 62 75 66 66 65   into this buffe
5fa0: 72 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e  r */.      int n
5fb0: 42 79 74 65 20 3d 20 73 71 6c 69 74 65 33 5f 62  Byte = sqlite3_b
5fc0: 6c 6f 62 5f 62 79 74 65 73 28 70 2d 3e 70 52 65  lob_bytes(p->pRe
5fd0: 61 64 65 72 29 3b 0a 20 20 20 20 20 20 69 6e 74  ader);.      int
5fe0: 20 6e 41 6c 6c 6f 63 20 3d 20 73 69 7a 65 6f 66   nAlloc = sizeof
5ff0: 28 46 74 73 35 44 61 74 61 29 20 2b 20 6e 42 79  (Fts5Data) + nBy
6000: 74 65 20 2b 20 46 54 53 35 5f 44 41 54 41 5f 50  te + FTS5_DATA_P
6010: 41 44 44 49 4e 47 3b 0a 20 20 20 20 20 20 70 52  ADDING;.      pR
6020: 65 74 20 3d 20 28 46 74 73 35 44 61 74 61 2a 29  et = (Fts5Data*)
6030: 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 6e  sqlite3_malloc(n
6040: 41 6c 6c 6f 63 29 3b 0a 20 20 20 20 20 20 69 66  Alloc);.      if
6050: 28 20 70 52 65 74 20 29 7b 0a 20 20 20 20 20 20  ( pRet ){.      
6060: 20 20 70 52 65 74 2d 3e 6e 6e 20 3d 20 6e 42 79    pRet->nn = nBy
6070: 74 65 3b 0a 20 20 20 20 20 20 20 20 61 4f 75 74  te;.        aOut
6080: 20 3d 20 70 52 65 74 2d 3e 70 20 3d 20 28 75 38   = pRet->p = (u8
6090: 2a 29 26 70 52 65 74 5b 31 5d 3b 0a 20 20 20 20  *)&pRet[1];.    
60a0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
60b0: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
60c0: 45 4d 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  EM;.      }..   
60d0: 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
60e0: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
60f0: 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 62 6c 6f  rc = sqlite3_blo
6100: 62 5f 72 65 61 64 28 70 2d 3e 70 52 65 61 64 65  b_read(p->pReade
6110: 72 2c 20 61 4f 75 74 2c 20 6e 42 79 74 65 2c 20  r, aOut, nByte, 
6120: 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  0);.      }.    
6130: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
6140: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 73  _OK ){.        s
6150: 71 6c 69 74 65 33 5f 66 72 65 65 28 70 52 65 74  qlite3_free(pRet
6160: 29 3b 0a 20 20 20 20 20 20 20 20 70 52 65 74 20  );.        pRet 
6170: 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  = 0;.      }else
6180: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 4f 44  {.        /* TOD
6190: 4f 31 3a 20 46 69 78 20 74 68 69 73 20 2a 2f 0a  O1: Fix this */.
61a0: 20 20 20 20 20 20 20 20 70 52 65 74 2d 3e 73 7a          pRet->sz
61b0: 4c 65 61 66 20 3d 20 66 74 73 35 47 65 74 55 31  Leaf = fts5GetU1
61c0: 36 28 26 70 52 65 74 2d 3e 70 5b 32 5d 29 3b 0a  6(&pRet->p[2]);.
61d0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
61e0: 20 20 70 2d 3e 72 63 20 3d 20 72 63 3b 0a 20 20    p->rc = rc;.  
61f0: 20 20 70 2d 3e 6e 52 65 61 64 2b 2b 3b 0a 20 20    p->nRead++;.  
6200: 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 28 70 52  }..  assert( (pR
6210: 65 74 3d 3d 30 29 3d 3d 28 70 2d 3e 72 63 21 3d  et==0)==(p->rc!=
6220: 53 51 4c 49 54 45 5f 4f 4b 29 20 29 3b 0a 20 20  SQLITE_OK) );.  
6230: 72 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 0a  return pRet;.}..
6240: 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 20  /*.** Release a 
6250: 72 65 66 65 72 65 6e 63 65 20 74 6f 20 64 61 74  reference to dat
6260: 61 20 72 65 63 6f 72 64 20 72 65 74 75 72 6e 65  a record returne
6270: 64 20 62 79 20 61 6e 20 65 61 72 6c 69 65 72 20  d by an earlier 
6280: 63 61 6c 6c 20 74 6f 0a 2a 2a 20 66 74 73 35 44  call to.** fts5D
6290: 61 74 61 52 65 61 64 28 29 2e 0a 2a 2f 0a 73 74  ataRead()..*/.st
62a0: 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 44 61  atic void fts5Da
62b0: 74 61 52 65 6c 65 61 73 65 28 46 74 73 35 44 61  taRelease(Fts5Da
62c0: 74 61 20 2a 70 44 61 74 61 29 7b 0a 20 20 73 71  ta *pData){.  sq
62d0: 6c 69 74 65 33 5f 66 72 65 65 28 70 44 61 74 61  lite3_free(pData
62e0: 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74  );.}..static int
62f0: 20 66 74 73 35 49 6e 64 65 78 50 72 65 70 61 72   fts5IndexPrepar
6300: 65 53 74 6d 74 28 0a 20 20 46 74 73 35 49 6e 64  eStmt(.  Fts5Ind
6310: 65 78 20 2a 70 2c 0a 20 20 73 71 6c 69 74 65 33  ex *p,.  sqlite3
6320: 5f 73 74 6d 74 20 2a 2a 70 70 53 74 6d 74 2c 0a  _stmt **ppStmt,.
6330: 20 20 63 68 61 72 20 2a 7a 53 71 6c 0a 29 7b 0a    char *zSql.){.
6340: 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c    if( p->rc==SQL
6350: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66  ITE_OK ){.    if
6360: 28 20 7a 53 71 6c 20 29 7b 0a 20 20 20 20 20 20  ( zSql ){.      
6370: 70 2d 3e 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  p->rc = sqlite3_
6380: 70 72 65 70 61 72 65 5f 76 32 28 70 2d 3e 70 43  prepare_v2(p->pC
6390: 6f 6e 66 69 67 2d 3e 64 62 2c 20 7a 53 71 6c 2c  onfig->db, zSql,
63a0: 20 2d 31 2c 20 70 70 53 74 6d 74 2c 20 30 29 3b   -1, ppStmt, 0);
63b0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
63c0: 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45    p->rc = SQLITE
63d0: 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20  _NOMEM;.    }.  
63e0: 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  }.  sqlite3_free
63f0: 28 7a 53 71 6c 29 3b 0a 20 20 72 65 74 75 72 6e  (zSql);.  return
6400: 20 70 2d 3e 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a   p->rc;.}.../*.*
6410: 2a 20 49 4e 53 45 52 54 20 4f 52 20 52 45 50 4c  * INSERT OR REPL
6420: 41 43 45 20 61 20 72 65 63 6f 72 64 20 69 6e 74  ACE a record int
6430: 6f 20 74 68 65 20 25 5f 64 61 74 61 20 74 61 62  o the %_data tab
6440: 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  le..*/.static vo
6450: 69 64 20 66 74 73 35 44 61 74 61 57 72 69 74 65  id fts5DataWrite
6460: 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 69  (Fts5Index *p, i
6470: 36 34 20 69 52 6f 77 69 64 2c 20 63 6f 6e 73 74  64 iRowid, const
6480: 20 75 38 20 2a 70 44 61 74 61 2c 20 69 6e 74 20   u8 *pData, int 
6490: 6e 44 61 74 61 29 7b 0a 20 20 69 66 28 20 70 2d  nData){.  if( p-
64a0: 3e 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  >rc!=SQLITE_OK )
64b0: 20 72 65 74 75 72 6e 3b 0a 0a 20 20 69 66 28 20   return;..  if( 
64c0: 70 2d 3e 70 57 72 69 74 65 72 3d 3d 30 20 29 7b  p->pWriter==0 ){
64d0: 0a 20 20 20 20 46 74 73 35 43 6f 6e 66 69 67 20  .    Fts5Config 
64e0: 2a 70 43 6f 6e 66 69 67 20 3d 20 70 2d 3e 70 43  *pConfig = p->pC
64f0: 6f 6e 66 69 67 3b 0a 20 20 20 20 66 74 73 35 49  onfig;.    fts5I
6500: 6e 64 65 78 50 72 65 70 61 72 65 53 74 6d 74 28  ndexPrepareStmt(
6510: 70 2c 20 26 70 2d 3e 70 57 72 69 74 65 72 2c 20  p, &p->pWriter, 
6520: 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
6530: 0a 20 20 20 20 20 20 20 20 20 20 22 52 45 50 4c  .          "REPL
6540: 41 43 45 20 49 4e 54 4f 20 27 25 71 27 2e 27 25  ACE INTO '%q'.'%
6550: 71 5f 64 61 74 61 27 28 69 64 2c 20 62 6c 6f 63  q_data'(id, bloc
6560: 6b 29 20 56 41 4c 55 45 53 28 3f 2c 3f 29 22 2c  k) VALUES(?,?)",
6570: 20 0a 20 20 20 20 20 20 20 20 20 20 70 43 6f 6e   .          pCon
6580: 66 69 67 2d 3e 7a 44 62 2c 20 70 43 6f 6e 66 69  fig->zDb, pConfi
6590: 67 2d 3e 7a 4e 61 6d 65 0a 20 20 20 20 29 29 3b  g->zName.    ));
65a0: 0a 20 20 20 20 69 66 28 20 70 2d 3e 72 63 20 29  .    if( p->rc )
65b0: 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20   return;.  }..  
65c0: 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74  sqlite3_bind_int
65d0: 36 34 28 70 2d 3e 70 57 72 69 74 65 72 2c 20 31  64(p->pWriter, 1
65e0: 2c 20 69 52 6f 77 69 64 29 3b 0a 20 20 73 71 6c  , iRowid);.  sql
65f0: 69 74 65 33 5f 62 69 6e 64 5f 62 6c 6f 62 28 70  ite3_bind_blob(p
6600: 2d 3e 70 57 72 69 74 65 72 2c 20 32 2c 20 70 44  ->pWriter, 2, pD
6610: 61 74 61 2c 20 6e 44 61 74 61 2c 20 53 51 4c 49  ata, nData, SQLI
6620: 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 73 71  TE_STATIC);.  sq
6630: 6c 69 74 65 33 5f 73 74 65 70 28 70 2d 3e 70 57  lite3_step(p->pW
6640: 72 69 74 65 72 29 3b 0a 20 20 70 2d 3e 72 63 20  riter);.  p->rc 
6650: 3d 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28  = sqlite3_reset(
6660: 70 2d 3e 70 57 72 69 74 65 72 29 3b 0a 7d 0a 0a  p->pWriter);.}..
6670: 2f 2a 0a 2a 2a 20 45 78 65 63 75 74 65 20 74 68  /*.** Execute th
6680: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 53 51 4c 3a  e following SQL:
6690: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 44 45 4c 45 54  .**.**     DELET
66a0: 45 20 46 52 4f 4d 20 25 5f 64 61 74 61 20 57 48  E FROM %_data WH
66b0: 45 52 45 20 69 64 20 42 45 54 57 45 45 4e 20 24  ERE id BETWEEN $
66c0: 69 46 69 72 73 74 20 41 4e 44 20 24 69 4c 61 73  iFirst AND $iLas
66d0: 74 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  t.*/.static void
66e0: 20 66 74 73 35 44 61 74 61 44 65 6c 65 74 65 28   fts5DataDelete(
66f0: 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 69 36  Fts5Index *p, i6
6700: 34 20 69 46 69 72 73 74 2c 20 69 36 34 20 69 4c  4 iFirst, i64 iL
6710: 61 73 74 29 7b 0a 20 20 69 66 28 20 70 2d 3e 72  ast){.  if( p->r
6720: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
6730: 65 74 75 72 6e 3b 0a 0a 20 20 69 66 28 20 70 2d  eturn;..  if( p-
6740: 3e 70 44 65 6c 65 74 65 72 3d 3d 30 20 29 7b 0a  >pDeleter==0 ){.
6750: 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20      int rc;.    
6760: 46 74 73 35 43 6f 6e 66 69 67 20 2a 70 43 6f 6e  Fts5Config *pCon
6770: 66 69 67 20 3d 20 70 2d 3e 70 43 6f 6e 66 69 67  fig = p->pConfig
6780: 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 53 71 6c  ;.    char *zSql
6790: 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
67a0: 74 66 28 0a 20 20 20 20 20 20 20 20 22 44 45 4c  tf(.        "DEL
67b0: 45 54 45 20 46 52 4f 4d 20 27 25 71 27 2e 27 25  ETE FROM '%q'.'%
67c0: 71 5f 64 61 74 61 27 20 57 48 45 52 45 20 69 64  q_data' WHERE id
67d0: 3e 3d 3f 20 41 4e 44 20 69 64 3c 3d 3f 22 2c 20  >=? AND id<=?", 
67e0: 0a 20 20 20 20 20 20 20 20 20 20 70 43 6f 6e 66  .          pConf
67f0: 69 67 2d 3e 7a 44 62 2c 20 70 43 6f 6e 66 69 67  ig->zDb, pConfig
6800: 2d 3e 7a 4e 61 6d 65 0a 20 20 20 20 29 3b 0a 20  ->zName.    );. 
6810: 20 20 20 69 66 28 20 7a 53 71 6c 3d 3d 30 20 29     if( zSql==0 )
6820: 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
6830: 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d  ITE_NOMEM;.    }
6840: 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d  else{.      rc =
6850: 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65   sqlite3_prepare
6860: 5f 76 32 28 70 43 6f 6e 66 69 67 2d 3e 64 62 2c  _v2(pConfig->db,
6870: 20 7a 53 71 6c 2c 20 2d 31 2c 20 26 70 2d 3e 70   zSql, -1, &p->p
6880: 44 65 6c 65 74 65 72 2c 20 30 29 3b 0a 20 20 20  Deleter, 0);.   
6890: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
68a0: 7a 53 71 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20  zSql);.    }.   
68b0: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
68c0: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 72  OK ){.      p->r
68d0: 63 20 3d 20 72 63 3b 0a 20 20 20 20 20 20 72 65  c = rc;.      re
68e0: 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  turn;.    }.  }.
68f0: 0a 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f  .  sqlite3_bind_
6900: 69 6e 74 36 34 28 70 2d 3e 70 44 65 6c 65 74 65  int64(p->pDelete
6910: 72 2c 20 31 2c 20 69 46 69 72 73 74 29 3b 0a 20  r, 1, iFirst);. 
6920: 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e   sqlite3_bind_in
6930: 74 36 34 28 70 2d 3e 70 44 65 6c 65 74 65 72 2c  t64(p->pDeleter,
6940: 20 32 2c 20 69 4c 61 73 74 29 3b 0a 20 20 73 71   2, iLast);.  sq
6950: 6c 69 74 65 33 5f 73 74 65 70 28 70 2d 3e 70 44  lite3_step(p->pD
6960: 65 6c 65 74 65 72 29 3b 0a 20 20 70 2d 3e 72 63  eleter);.  p->rc
6970: 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74   = sqlite3_reset
6980: 28 70 2d 3e 70 44 65 6c 65 74 65 72 29 3b 0a 7d  (p->pDeleter);.}
6990: 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20 61  ../*.** Remove a
69a0: 6c 6c 20 72 65 63 6f 72 64 73 20 61 73 73 6f 63  ll records assoc
69b0: 69 61 74 65 64 20 77 69 74 68 20 73 65 67 6d 65  iated with segme
69c0: 6e 74 20 69 53 65 67 69 64 2e 0a 2a 2f 0a 73 74  nt iSegid..*/.st
69d0: 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 44 61  atic void fts5Da
69e0: 74 61 52 65 6d 6f 76 65 53 65 67 6d 65 6e 74 28  taRemoveSegment(
69f0: 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 69 6e  Fts5Index *p, in
6a00: 74 20 69 53 65 67 69 64 29 7b 0a 20 20 69 36 34  t iSegid){.  i64
6a10: 20 69 46 69 72 73 74 20 3d 20 46 54 53 35 5f 53   iFirst = FTS5_S
6a20: 45 47 4d 45 4e 54 5f 52 4f 57 49 44 28 69 53 65  EGMENT_ROWID(iSe
6a30: 67 69 64 2c 20 30 29 3b 0a 20 20 69 36 34 20 69  gid, 0);.  i64 i
6a40: 4c 61 73 74 20 3d 20 46 54 53 35 5f 53 45 47 4d  Last = FTS5_SEGM
6a50: 45 4e 54 5f 52 4f 57 49 44 28 69 53 65 67 69 64  ENT_ROWID(iSegid
6a60: 2b 31 2c 20 30 29 2d 31 3b 0a 20 20 66 74 73 35  +1, 0)-1;.  fts5
6a70: 44 61 74 61 44 65 6c 65 74 65 28 70 2c 20 69 46  DataDelete(p, iF
6a80: 69 72 73 74 2c 20 69 4c 61 73 74 29 3b 0a 20 20  irst, iLast);.  
6a90: 69 66 28 20 70 2d 3e 70 49 64 78 44 65 6c 65 74  if( p->pIdxDelet
6aa0: 65 72 3d 3d 30 20 29 7b 0a 20 20 20 20 46 74 73  er==0 ){.    Fts
6ab0: 35 43 6f 6e 66 69 67 20 2a 70 43 6f 6e 66 69 67  5Config *pConfig
6ac0: 20 3d 20 70 2d 3e 70 43 6f 6e 66 69 67 3b 0a 20   = p->pConfig;. 
6ad0: 20 20 20 66 74 73 35 49 6e 64 65 78 50 72 65 70     fts5IndexPrep
6ae0: 61 72 65 53 74 6d 74 28 70 2c 20 26 70 2d 3e 70  areStmt(p, &p->p
6af0: 49 64 78 44 65 6c 65 74 65 72 2c 20 73 71 6c 69  IdxDeleter, sqli
6b00: 74 65 33 5f 6d 70 72 69 6e 74 66 28 0a 20 20 20  te3_mprintf(.   
6b10: 20 20 20 20 20 20 20 22 44 45 4c 45 54 45 20 46         "DELETE F
6b20: 52 4f 4d 20 27 25 71 27 2e 27 25 71 5f 69 64 78  ROM '%q'.'%q_idx
6b30: 27 20 57 48 45 52 45 20 73 65 67 69 64 3d 3f 22  ' WHERE segid=?"
6b40: 2c 0a 20 20 20 20 20 20 20 20 20 20 70 43 6f 6e  ,.          pCon
6b50: 66 69 67 2d 3e 7a 44 62 2c 20 70 43 6f 6e 66 69  fig->zDb, pConfi
6b60: 67 2d 3e 7a 4e 61 6d 65 0a 20 20 20 20 29 29 3b  g->zName.    ));
6b70: 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 72 63  .  }.  if( p->rc
6b80: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
6b90: 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f     sqlite3_bind_
6ba0: 69 6e 74 28 70 2d 3e 70 49 64 78 44 65 6c 65 74  int(p->pIdxDelet
6bb0: 65 72 2c 20 31 2c 20 69 53 65 67 69 64 29 3b 0a  er, 1, iSegid);.
6bc0: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 65 70      sqlite3_step
6bd0: 28 70 2d 3e 70 49 64 78 44 65 6c 65 74 65 72 29  (p->pIdxDeleter)
6be0: 3b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 73 71  ;.    p->rc = sq
6bf0: 6c 69 74 65 33 5f 72 65 73 65 74 28 70 2d 3e 70  lite3_reset(p->p
6c00: 49 64 78 44 65 6c 65 74 65 72 29 3b 0a 20 20 7d  IdxDeleter);.  }
6c10: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73  .}../*.** Releas
6c20: 65 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f  e a reference to
6c30: 20 61 6e 20 46 74 73 35 53 74 72 75 63 74 75 72   an Fts5Structur
6c40: 65 20 6f 62 6a 65 63 74 20 72 65 74 75 72 6e 65  e object returne
6c50: 64 20 62 79 20 61 6e 20 65 61 72 6c 69 65 72 20  d by an earlier 
6c60: 0a 2a 2a 20 63 61 6c 6c 20 74 6f 20 66 74 73 35  .** call to fts5
6c70: 53 74 72 75 63 74 75 72 65 52 65 61 64 28 29 20  StructureRead() 
6c80: 6f 72 20 66 74 73 35 53 74 72 75 63 74 75 72 65  or fts5Structure
6c90: 44 65 63 6f 64 65 28 29 2e 0a 2a 2f 0a 73 74 61  Decode()..*/.sta
6ca0: 74 69 63 20 76 6f 69 64 20 66 74 73 35 53 74 72  tic void fts5Str
6cb0: 75 63 74 75 72 65 52 65 6c 65 61 73 65 28 46 74  uctureRelease(Ft
6cc0: 73 35 53 74 72 75 63 74 75 72 65 20 2a 70 53 74  s5Structure *pSt
6cd0: 72 75 63 74 29 7b 0a 20 20 69 66 28 20 70 53 74  ruct){.  if( pSt
6ce0: 72 75 63 74 20 26 26 20 30 3e 3d 28 2d 2d 70 53  ruct && 0>=(--pS
6cf0: 74 72 75 63 74 2d 3e 6e 52 65 66 29 20 29 7b 0a  truct->nRef) ){.
6d00: 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 61      int i;.    a
6d10: 73 73 65 72 74 28 20 70 53 74 72 75 63 74 2d 3e  ssert( pStruct->
6d20: 6e 52 65 66 3d 3d 30 20 29 3b 0a 20 20 20 20 66  nRef==0 );.    f
6d30: 6f 72 28 69 3d 30 3b 20 69 3c 70 53 74 72 75 63  or(i=0; i<pStruc
6d40: 74 2d 3e 6e 4c 65 76 65 6c 3b 20 69 2b 2b 29 7b  t->nLevel; i++){
6d50: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
6d60: 72 65 65 28 70 53 74 72 75 63 74 2d 3e 61 4c 65  ree(pStruct->aLe
6d70: 76 65 6c 5b 69 5d 2e 61 53 65 67 29 3b 0a 20 20  vel[i].aSeg);.  
6d80: 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f    }.    sqlite3_
6d90: 66 72 65 65 28 70 53 74 72 75 63 74 29 3b 0a 20  free(pStruct);. 
6da0: 20 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69   }.}..static voi
6db0: 64 20 66 74 73 35 53 74 72 75 63 74 75 72 65 52  d fts5StructureR
6dc0: 65 66 28 46 74 73 35 53 74 72 75 63 74 75 72 65  ef(Fts5Structure
6dd0: 20 2a 70 53 74 72 75 63 74 29 7b 0a 20 20 70 53   *pStruct){.  pS
6de0: 74 72 75 63 74 2d 3e 6e 52 65 66 2b 2b 3b 0a 7d  truct->nRef++;.}
6df0: 0a 0a 2f 2a 0a 2a 2a 20 44 65 73 65 72 69 61 6c  ../*.** Deserial
6e00: 69 7a 65 20 61 6e 64 20 72 65 74 75 72 6e 20 74  ize and return t
6e10: 68 65 20 73 74 72 75 63 74 75 72 65 20 72 65 63  he structure rec
6e20: 6f 72 64 20 63 75 72 72 65 6e 74 6c 79 20 73 74  ord currently st
6e30: 6f 72 65 64 20 69 6e 20 73 65 72 69 61 6c 69 7a  ored in serializ
6e40: 65 64 0a 2a 2a 20 66 6f 72 6d 20 77 69 74 68 69  ed.** form withi
6e50: 6e 20 62 75 66 66 65 72 20 70 44 61 74 61 2f 6e  n buffer pData/n
6e60: 44 61 74 61 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  Data..**.** The 
6e70: 46 74 73 35 53 74 72 75 63 74 75 72 65 2e 61 4c  Fts5Structure.aL
6e80: 65 76 65 6c 5b 5d 20 61 6e 64 20 65 61 63 68 20  evel[] and each 
6e90: 46 74 73 35 53 74 72 75 63 74 75 72 65 4c 65 76  Fts5StructureLev
6ea0: 65 6c 2e 61 53 65 67 5b 5d 20 61 72 72 61 79 0a  el.aSeg[] array.
6eb0: 2a 2a 20 61 72 65 20 6f 76 65 72 2d 61 6c 6c 6f  ** are over-allo
6ec0: 63 61 74 65 64 20 62 79 20 6f 6e 65 20 73 6c 6f  cated by one slo
6ed0: 74 2e 20 54 68 69 73 20 61 6c 6c 6f 77 73 20 74  t. This allows t
6ee0: 68 65 20 73 74 72 75 63 74 75 72 65 20 63 6f 6e  he structure con
6ef0: 74 65 6e 74 73 0a 2a 2a 20 74 6f 20 62 65 20 6d  tents.** to be m
6f00: 6f 72 65 20 65 61 73 69 6c 79 20 65 64 69 74 65  ore easily edite
6f10: 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65  d..**.** If an e
6f20: 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 2a 70 70  rror occurs, *pp
6f30: 4f 75 74 20 69 73 20 73 65 74 20 74 6f 20 4e 55  Out is set to NU
6f40: 4c 4c 20 61 6e 64 20 61 6e 20 53 51 4c 69 74 65  LL and an SQLite
6f50: 20 65 72 72 6f 72 20 63 6f 64 65 0a 2a 2a 20 72   error code.** r
6f60: 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69  eturned. Otherwi
6f70: 73 65 2c 20 2a 70 70 4f 75 74 20 69 73 20 73 65  se, *ppOut is se
6f80: 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68  t to point to th
6f90: 65 20 6e 65 77 20 6f 62 6a 65 63 74 20 61 6e 64  e new object and
6fa0: 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65  .** SQLITE_OK re
6fb0: 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  turned..*/.stati
6fc0: 63 20 69 6e 74 20 66 74 73 35 53 74 72 75 63 74  c int fts5Struct
6fd0: 75 72 65 44 65 63 6f 64 65 28 0a 20 20 63 6f 6e  ureDecode(.  con
6fe0: 73 74 20 75 38 20 2a 70 44 61 74 61 2c 20 20 20  st u8 *pData,   
6ff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
7000: 42 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e  Buffer containin
7010: 67 20 73 65 72 69 61 6c 69 7a 65 64 20 73 74 72  g serialized str
7020: 75 63 74 75 72 65 20 2a 2f 0a 20 20 69 6e 74 20  ucture */.  int 
7030: 6e 44 61 74 61 2c 20 20 20 20 20 20 20 20 20 20  nData,          
7040: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
7050: 69 7a 65 20 6f 66 20 62 75 66 66 65 72 20 70 44  ize of buffer pD
7060: 61 74 61 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a  ata in bytes */.
7070: 20 20 69 6e 74 20 2a 70 69 43 6f 6f 6b 69 65 2c    int *piCookie,
7080: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7090: 20 20 2f 2a 20 43 6f 6e 66 69 67 75 72 61 74 69    /* Configurati
70a0: 6f 6e 20 63 6f 6f 6b 69 65 20 76 61 6c 75 65 20  on cookie value 
70b0: 2a 2f 0a 20 20 46 74 73 35 53 74 72 75 63 74 75  */.  Fts5Structu
70c0: 72 65 20 2a 2a 70 70 4f 75 74 20 20 20 20 20 20  re **ppOut      
70d0: 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 44 65 73       /* OUT: Des
70e0: 65 72 69 61 6c 69 7a 65 64 20 6f 62 6a 65 63 74  erialized object
70f0: 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20   */.){.  int rc 
7100: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69  = SQLITE_OK;.  i
7110: 6e 74 20 69 20 3d 20 30 3b 0a 20 20 69 6e 74 20  nt i = 0;.  int 
7120: 69 4c 76 6c 3b 0a 20 20 69 6e 74 20 6e 4c 65 76  iLvl;.  int nLev
7130: 65 6c 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 53  el = 0;.  int nS
7140: 65 67 6d 65 6e 74 20 3d 20 30 3b 0a 20 20 69 6e  egment = 0;.  in
7150: 74 20 6e 42 79 74 65 3b 20 20 20 20 20 20 20 20  t nByte;        
7160: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
7170: 20 42 79 74 65 73 20 6f 66 20 73 70 61 63 65 20   Bytes of space 
7180: 74 6f 20 61 6c 6c 6f 63 61 74 65 20 61 74 20 70  to allocate at p
7190: 52 65 74 20 2a 2f 0a 20 20 46 74 73 35 53 74 72  Ret */.  Fts5Str
71a0: 75 63 74 75 72 65 20 2a 70 52 65 74 20 3d 20 30  ucture *pRet = 0
71b0: 3b 20 20 20 20 20 20 20 20 2f 2a 20 53 74 72 75  ;        /* Stru
71c0: 63 74 75 72 65 20 6f 62 6a 65 63 74 20 74 6f 20  cture object to 
71d0: 72 65 74 75 72 6e 20 2a 2f 0a 0a 20 20 2f 2a 20  return */..  /* 
71e0: 47 72 61 62 20 74 68 65 20 63 6f 6f 6b 69 65 20  Grab the cookie 
71f0: 76 61 6c 75 65 20 2a 2f 0a 20 20 69 66 28 20 70  value */.  if( p
7200: 69 43 6f 6f 6b 69 65 20 29 20 2a 70 69 43 6f 6f  iCookie ) *piCoo
7210: 6b 69 65 20 3d 20 73 71 6c 69 74 65 33 46 74 73  kie = sqlite3Fts
7220: 35 47 65 74 33 32 28 70 44 61 74 61 29 3b 0a 20  5Get32(pData);. 
7230: 20 69 20 3d 20 34 3b 0a 0a 20 20 2f 2a 20 52 65   i = 4;..  /* Re
7240: 61 64 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d  ad the total num
7250: 62 65 72 20 6f 66 20 6c 65 76 65 6c 73 20 61 6e  ber of levels an
7260: 64 20 73 65 67 6d 65 6e 74 73 20 66 72 6f 6d 20  d segments from 
7270: 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
7280: 0a 20 20 2a 2a 20 73 74 72 75 63 74 75 72 65 20  .  ** structure 
7290: 72 65 63 6f 72 64 2e 20 20 2a 2f 0a 20 20 69 20  record.  */.  i 
72a0: 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e 74  += fts5GetVarint
72b0: 33 32 28 26 70 44 61 74 61 5b 69 5d 2c 20 6e 4c  32(&pData[i], nL
72c0: 65 76 65 6c 29 3b 0a 20 20 69 20 2b 3d 20 66 74  evel);.  i += ft
72d0: 73 35 47 65 74 56 61 72 69 6e 74 33 32 28 26 70  s5GetVarint32(&p
72e0: 44 61 74 61 5b 69 5d 2c 20 6e 53 65 67 6d 65 6e  Data[i], nSegmen
72f0: 74 29 3b 0a 20 20 6e 42 79 74 65 20 3d 20 28 0a  t);.  nByte = (.
7300: 20 20 20 20 20 20 73 69 7a 65 6f 66 28 46 74 73        sizeof(Fts
7310: 35 53 74 72 75 63 74 75 72 65 29 20 2b 20 20 20  5Structure) +   
7320: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7330: 20 2f 2a 20 4d 61 69 6e 20 73 74 72 75 63 74 75   /* Main structu
7340: 72 65 20 2a 2f 0a 20 20 20 20 20 20 73 69 7a 65  re */.      size
7350: 6f 66 28 46 74 73 35 53 74 72 75 63 74 75 72 65  of(Fts5Structure
7360: 4c 65 76 65 6c 29 20 2a 20 28 6e 4c 65 76 65 6c  Level) * (nLevel
7370: 2d 31 29 20 20 20 20 2f 2a 20 61 4c 65 76 65 6c  -1)    /* aLevel
7380: 5b 5d 20 61 72 72 61 79 20 2a 2f 0a 20 20 29 3b  [] array */.  );
7390: 0a 20 20 70 52 65 74 20 3d 20 28 46 74 73 35 53  .  pRet = (Fts5S
73a0: 74 72 75 63 74 75 72 65 2a 29 73 71 6c 69 74 65  tructure*)sqlite
73b0: 33 46 74 73 35 4d 61 6c 6c 6f 63 5a 65 72 6f 28  3Fts5MallocZero(
73c0: 26 72 63 2c 20 6e 42 79 74 65 29 3b 0a 0a 20 20  &rc, nByte);..  
73d0: 69 66 28 20 70 52 65 74 20 29 7b 0a 20 20 20 20  if( pRet ){.    
73e0: 70 52 65 74 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a  pRet->nRef = 1;.
73f0: 20 20 20 20 70 52 65 74 2d 3e 6e 4c 65 76 65 6c      pRet->nLevel
7400: 20 3d 20 6e 4c 65 76 65 6c 3b 0a 20 20 20 20 70   = nLevel;.    p
7410: 52 65 74 2d 3e 6e 53 65 67 6d 65 6e 74 20 3d 20  Ret->nSegment = 
7420: 6e 53 65 67 6d 65 6e 74 3b 0a 20 20 20 20 69 20  nSegment;.    i 
7430: 2b 3d 20 73 71 6c 69 74 65 33 46 74 73 35 47 65  += sqlite3Fts5Ge
7440: 74 56 61 72 69 6e 74 28 26 70 44 61 74 61 5b 69  tVarint(&pData[i
7450: 5d 2c 20 26 70 52 65 74 2d 3e 6e 57 72 69 74 65  ], &pRet->nWrite
7460: 43 6f 75 6e 74 65 72 29 3b 0a 0a 20 20 20 20 66  Counter);..    f
7470: 6f 72 28 69 4c 76 6c 3d 30 3b 20 72 63 3d 3d 53  or(iLvl=0; rc==S
7480: 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 4c 76 6c  QLITE_OK && iLvl
7490: 3c 6e 4c 65 76 65 6c 3b 20 69 4c 76 6c 2b 2b 29  <nLevel; iLvl++)
74a0: 7b 0a 20 20 20 20 20 20 46 74 73 35 53 74 72 75  {.      Fts5Stru
74b0: 63 74 75 72 65 4c 65 76 65 6c 20 2a 70 4c 76 6c  ctureLevel *pLvl
74c0: 20 3d 20 26 70 52 65 74 2d 3e 61 4c 65 76 65 6c   = &pRet->aLevel
74d0: 5b 69 4c 76 6c 5d 3b 0a 20 20 20 20 20 20 69 6e  [iLvl];.      in
74e0: 74 20 6e 54 6f 74 61 6c 3b 0a 20 20 20 20 20 20  t nTotal;.      
74f0: 69 6e 74 20 69 53 65 67 3b 0a 0a 20 20 20 20 20  int iSeg;..     
7500: 20 69 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72   i += fts5GetVar
7510: 69 6e 74 33 32 28 26 70 44 61 74 61 5b 69 5d 2c  int32(&pData[i],
7520: 20 70 4c 76 6c 2d 3e 6e 4d 65 72 67 65 29 3b 0a   pLvl->nMerge);.
7530: 20 20 20 20 20 20 69 20 2b 3d 20 66 74 73 35 47        i += fts5G
7540: 65 74 56 61 72 69 6e 74 33 32 28 26 70 44 61 74  etVarint32(&pDat
7550: 61 5b 69 5d 2c 20 6e 54 6f 74 61 6c 29 3b 0a 20  a[i], nTotal);. 
7560: 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 54 6f       assert( nTo
7570: 74 61 6c 3e 3d 70 4c 76 6c 2d 3e 6e 4d 65 72 67  tal>=pLvl->nMerg
7580: 65 20 29 3b 0a 20 20 20 20 20 20 70 4c 76 6c 2d  e );.      pLvl-
7590: 3e 61 53 65 67 20 3d 20 28 46 74 73 35 53 74 72  >aSeg = (Fts5Str
75a0: 75 63 74 75 72 65 53 65 67 6d 65 6e 74 2a 29 73  uctureSegment*)s
75b0: 71 6c 69 74 65 33 46 74 73 35 4d 61 6c 6c 6f 63  qlite3Fts5Malloc
75c0: 5a 65 72 6f 28 26 72 63 2c 20 0a 20 20 20 20 20  Zero(&rc, .     
75d0: 20 20 20 20 20 6e 54 6f 74 61 6c 20 2a 20 73 69       nTotal * si
75e0: 7a 65 6f 66 28 46 74 73 35 53 74 72 75 63 74 75  zeof(Fts5Structu
75f0: 72 65 53 65 67 6d 65 6e 74 29 0a 20 20 20 20 20  reSegment).     
7600: 20 29 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 72   );..      if( r
7610: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
7620: 20 20 20 20 20 20 20 20 70 4c 76 6c 2d 3e 6e 53          pLvl->nS
7630: 65 67 20 3d 20 6e 54 6f 74 61 6c 3b 0a 20 20 20  eg = nTotal;.   
7640: 20 20 20 20 20 66 6f 72 28 69 53 65 67 3d 30 3b       for(iSeg=0;
7650: 20 69 53 65 67 3c 6e 54 6f 74 61 6c 3b 20 69 53   iSeg<nTotal; iS
7660: 65 67 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20  eg++){.         
7670: 20 69 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72   i += fts5GetVar
7680: 69 6e 74 33 32 28 26 70 44 61 74 61 5b 69 5d 2c  int32(&pData[i],
7690: 20 70 4c 76 6c 2d 3e 61 53 65 67 5b 69 53 65 67   pLvl->aSeg[iSeg
76a0: 5d 2e 69 53 65 67 69 64 29 3b 0a 20 20 20 20 20  ].iSegid);.     
76b0: 20 20 20 20 20 69 20 2b 3d 20 66 74 73 35 47 65       i += fts5Ge
76c0: 74 56 61 72 69 6e 74 33 32 28 26 70 44 61 74 61  tVarint32(&pData
76d0: 5b 69 5d 2c 20 70 4c 76 6c 2d 3e 61 53 65 67 5b  [i], pLvl->aSeg[
76e0: 69 53 65 67 5d 2e 70 67 6e 6f 46 69 72 73 74 29  iSeg].pgnoFirst)
76f0: 3b 0a 20 20 20 20 20 20 20 20 20 20 69 20 2b 3d  ;.          i +=
7700: 20 66 74 73 35 47 65 74 56 61 72 69 6e 74 33 32   fts5GetVarint32
7710: 28 26 70 44 61 74 61 5b 69 5d 2c 20 70 4c 76 6c  (&pData[i], pLvl
7720: 2d 3e 61 53 65 67 5b 69 53 65 67 5d 2e 70 67 6e  ->aSeg[iSeg].pgn
7730: 6f 4c 61 73 74 29 3b 0a 20 20 20 20 20 20 20 20  oLast);.        
7740: 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  }.      }else{. 
7750: 20 20 20 20 20 20 20 66 74 73 35 53 74 72 75 63         fts5Struc
7760: 74 75 72 65 52 65 6c 65 61 73 65 28 70 52 65 74  tureRelease(pRet
7770: 29 3b 0a 20 20 20 20 20 20 20 20 70 52 65 74 20  );.        pRet 
7780: 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 0;.      }.   
7790: 20 7d 0a 20 20 7d 0a 0a 20 20 2a 70 70 4f 75 74   }.  }..  *ppOut
77a0: 20 3d 20 70 52 65 74 3b 0a 20 20 72 65 74 75 72   = pRet;.  retur
77b0: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 0a 2a  n rc;.}../*.**.*
77c0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  /.static void ft
77d0: 73 35 53 74 72 75 63 74 75 72 65 41 64 64 4c 65  s5StructureAddLe
77e0: 76 65 6c 28 69 6e 74 20 2a 70 52 63 2c 20 46 74  vel(int *pRc, Ft
77f0: 73 35 53 74 72 75 63 74 75 72 65 20 2a 2a 70 70  s5Structure **pp
7800: 53 74 72 75 63 74 29 7b 0a 20 20 69 66 28 20 2a  Struct){.  if( *
7810: 70 52 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  pRc==SQLITE_OK )
7820: 7b 0a 20 20 20 20 46 74 73 35 53 74 72 75 63 74  {.    Fts5Struct
7830: 75 72 65 20 2a 70 53 74 72 75 63 74 20 3d 20 2a  ure *pStruct = *
7840: 70 70 53 74 72 75 63 74 3b 0a 20 20 20 20 69 6e  ppStruct;.    in
7850: 74 20 6e 4c 65 76 65 6c 20 3d 20 70 53 74 72 75  t nLevel = pStru
7860: 63 74 2d 3e 6e 4c 65 76 65 6c 3b 0a 20 20 20 20  ct->nLevel;.    
7870: 69 6e 74 20 6e 42 79 74 65 20 3d 20 28 0a 20 20  int nByte = (.  
7880: 20 20 20 20 20 20 73 69 7a 65 6f 66 28 46 74 73        sizeof(Fts
7890: 35 53 74 72 75 63 74 75 72 65 29 20 2b 20 20 20  5Structure) +   
78a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
78b0: 2a 20 4d 61 69 6e 20 73 74 72 75 63 74 75 72 65  * Main structure
78c0: 20 2a 2f 0a 20 20 20 20 20 20 20 20 73 69 7a 65   */.        size
78d0: 6f 66 28 46 74 73 35 53 74 72 75 63 74 75 72 65  of(Fts5Structure
78e0: 4c 65 76 65 6c 29 20 2a 20 28 6e 4c 65 76 65 6c  Level) * (nLevel
78f0: 2b 31 29 20 20 2f 2a 20 61 4c 65 76 65 6c 5b 5d  +1)  /* aLevel[]
7900: 20 61 72 72 61 79 20 2a 2f 0a 20 20 20 20 29 3b   array */.    );
7910: 0a 0a 20 20 20 20 70 53 74 72 75 63 74 20 3d 20  ..    pStruct = 
7920: 73 71 6c 69 74 65 33 5f 72 65 61 6c 6c 6f 63 28  sqlite3_realloc(
7930: 70 53 74 72 75 63 74 2c 20 6e 42 79 74 65 29 3b  pStruct, nByte);
7940: 0a 20 20 20 20 69 66 28 20 70 53 74 72 75 63 74  .    if( pStruct
7950: 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74   ){.      memset
7960: 28 26 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65  (&pStruct->aLeve
7970: 6c 5b 6e 4c 65 76 65 6c 5d 2c 20 30 2c 20 73 69  l[nLevel], 0, si
7980: 7a 65 6f 66 28 46 74 73 35 53 74 72 75 63 74 75  zeof(Fts5Structu
7990: 72 65 4c 65 76 65 6c 29 29 3b 0a 20 20 20 20 20  reLevel));.     
79a0: 20 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c   pStruct->nLevel
79b0: 2b 2b 3b 0a 20 20 20 20 20 20 2a 70 70 53 74 72  ++;.      *ppStr
79c0: 75 63 74 20 3d 20 70 53 74 72 75 63 74 3b 0a 20  uct = pStruct;. 
79d0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
79e0: 2a 70 52 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f  *pRc = SQLITE_NO
79f0: 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  MEM;.    }.  }.}
7a00: 0a 0a 2f 2a 0a 2a 2a 20 45 78 74 65 6e 64 20 6c  ../*.** Extend l
7a10: 65 76 65 6c 20 69 4c 76 6c 20 73 6f 20 74 68 61  evel iLvl so tha
7a20: 74 20 74 68 65 72 65 20 69 73 20 72 6f 6f 6d 20  t there is room 
7a30: 66 6f 72 20 61 74 20 6c 65 61 73 74 20 6e 45 78  for at least nEx
7a40: 74 72 61 20 6d 6f 72 65 0a 2a 2a 20 73 65 67 6d  tra more.** segm
7a50: 65 6e 74 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ents..*/.static 
7a60: 76 6f 69 64 20 66 74 73 35 53 74 72 75 63 74 75  void fts5Structu
7a70: 72 65 45 78 74 65 6e 64 4c 65 76 65 6c 28 0a 20  reExtendLevel(. 
7a80: 20 69 6e 74 20 2a 70 52 63 2c 20 0a 20 20 46 74   int *pRc, .  Ft
7a90: 73 35 53 74 72 75 63 74 75 72 65 20 2a 70 53 74  s5Structure *pSt
7aa0: 72 75 63 74 2c 20 0a 20 20 69 6e 74 20 69 4c 76  ruct, .  int iLv
7ab0: 6c 2c 20 0a 20 20 69 6e 74 20 6e 45 78 74 72 61  l, .  int nExtra
7ac0: 2c 20 0a 20 20 69 6e 74 20 62 49 6e 73 65 72 74  , .  int bInsert
7ad0: 0a 29 7b 0a 20 20 69 66 28 20 2a 70 52 63 3d 3d  .){.  if( *pRc==
7ae0: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
7af0: 20 46 74 73 35 53 74 72 75 63 74 75 72 65 4c 65   Fts5StructureLe
7b00: 76 65 6c 20 2a 70 4c 76 6c 20 3d 20 26 70 53 74  vel *pLvl = &pSt
7b10: 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76  ruct->aLevel[iLv
7b20: 6c 5d 3b 0a 20 20 20 20 46 74 73 35 53 74 72 75  l];.    Fts5Stru
7b30: 63 74 75 72 65 53 65 67 6d 65 6e 74 20 2a 61 4e  ctureSegment *aN
7b40: 65 77 3b 0a 20 20 20 20 69 6e 74 20 6e 42 79 74  ew;.    int nByt
7b50: 65 3b 0a 0a 20 20 20 20 6e 42 79 74 65 20 3d 20  e;..    nByte = 
7b60: 28 70 4c 76 6c 2d 3e 6e 53 65 67 20 2b 20 6e 45  (pLvl->nSeg + nE
7b70: 78 74 72 61 29 20 2a 20 73 69 7a 65 6f 66 28 46  xtra) * sizeof(F
7b80: 74 73 35 53 74 72 75 63 74 75 72 65 53 65 67 6d  ts5StructureSegm
7b90: 65 6e 74 29 3b 0a 20 20 20 20 61 4e 65 77 20 3d  ent);.    aNew =
7ba0: 20 73 71 6c 69 74 65 33 5f 72 65 61 6c 6c 6f 63   sqlite3_realloc
7bb0: 28 70 4c 76 6c 2d 3e 61 53 65 67 2c 20 6e 42 79  (pLvl->aSeg, nBy
7bc0: 74 65 29 3b 0a 20 20 20 20 69 66 28 20 61 4e 65  te);.    if( aNe
7bd0: 77 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 62  w ){.      if( b
7be0: 49 6e 73 65 72 74 3d 3d 30 20 29 7b 0a 20 20 20  Insert==0 ){.   
7bf0: 20 20 20 20 20 6d 65 6d 73 65 74 28 26 61 4e 65       memset(&aNe
7c00: 77 5b 70 4c 76 6c 2d 3e 6e 53 65 67 5d 2c 20 30  w[pLvl->nSeg], 0
7c10: 2c 20 73 69 7a 65 6f 66 28 46 74 73 35 53 74 72  , sizeof(Fts5Str
7c20: 75 63 74 75 72 65 53 65 67 6d 65 6e 74 29 20 2a  uctureSegment) *
7c30: 20 6e 45 78 74 72 61 29 3b 0a 20 20 20 20 20 20   nExtra);.      
7c40: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69  }else{.        i
7c50: 6e 74 20 6e 4d 6f 76 65 20 3d 20 70 4c 76 6c 2d  nt nMove = pLvl-
7c60: 3e 6e 53 65 67 20 2a 20 73 69 7a 65 6f 66 28 46  >nSeg * sizeof(F
7c70: 74 73 35 53 74 72 75 63 74 75 72 65 53 65 67 6d  ts5StructureSegm
7c80: 65 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 6d 65  ent);.        me
7c90: 6d 6d 6f 76 65 28 26 61 4e 65 77 5b 6e 45 78 74  mmove(&aNew[nExt
7ca0: 72 61 5d 2c 20 61 4e 65 77 2c 20 6e 4d 6f 76 65  ra], aNew, nMove
7cb0: 29 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 73 65  );.        memse
7cc0: 74 28 61 4e 65 77 2c 20 30 2c 20 73 69 7a 65 6f  t(aNew, 0, sizeo
7cd0: 66 28 46 74 73 35 53 74 72 75 63 74 75 72 65 53  f(Fts5StructureS
7ce0: 65 67 6d 65 6e 74 29 20 2a 20 6e 45 78 74 72 61  egment) * nExtra
7cf0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
7d00: 20 70 4c 76 6c 2d 3e 61 53 65 67 20 3d 20 61 4e   pLvl->aSeg = aN
7d10: 65 77 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ew;.    }else{. 
7d20: 20 20 20 20 20 2a 70 52 63 20 3d 20 53 51 4c 49       *pRc = SQLI
7d30: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a  TE_NOMEM;.    }.
7d40: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61    }.}../*.** Rea
7d50: 64 2c 20 64 65 73 65 72 69 61 6c 69 7a 65 20 61  d, deserialize a
7d60: 6e 64 20 72 65 74 75 72 6e 20 74 68 65 20 73 74  nd return the st
7d70: 72 75 63 74 75 72 65 20 72 65 63 6f 72 64 2e 0a  ructure record..
7d80: 2a 2a 0a 2a 2a 20 54 68 65 20 46 74 73 35 53 74  **.** The Fts5St
7d90: 72 75 63 74 75 72 65 2e 61 4c 65 76 65 6c 5b 5d  ructure.aLevel[]
7da0: 20 61 6e 64 20 65 61 63 68 20 46 74 73 35 53 74   and each Fts5St
7db0: 72 75 63 74 75 72 65 4c 65 76 65 6c 2e 61 53 65  ructureLevel.aSe
7dc0: 67 5b 5d 20 61 72 72 61 79 0a 2a 2a 20 61 72 65  g[] array.** are
7dd0: 20 6f 76 65 72 2d 61 6c 6c 6f 63 61 74 65 64 20   over-allocated 
7de0: 61 73 20 64 65 73 63 72 69 62 65 64 20 66 6f 72  as described for
7df0: 20 66 75 6e 63 74 69 6f 6e 20 66 74 73 35 53 74   function fts5St
7e00: 72 75 63 74 75 72 65 44 65 63 6f 64 65 28 29 20  ructureDecode() 
7e10: 0a 2a 2a 20 61 62 6f 76 65 2e 0a 2a 2a 0a 2a 2a  .** above..**.**
7e20: 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
7e30: 75 72 73 2c 20 4e 55 4c 4c 20 69 73 20 72 65 74  urs, NULL is ret
7e40: 75 72 6e 65 64 20 61 6e 64 20 61 6e 20 65 72 72  urned and an err
7e50: 6f 72 20 63 6f 64 65 20 6c 65 66 74 20 69 6e 20  or code left in 
7e60: 74 68 65 0a 2a 2a 20 46 74 73 35 49 6e 64 65 78  the.** Fts5Index
7e70: 20 68 61 6e 64 6c 65 2e 20 49 66 20 61 6e 20 65   handle. If an e
7e80: 72 72 6f 72 20 68 61 73 20 61 6c 72 65 61 64 79  rror has already
7e90: 20 6f 63 63 75 72 72 65 64 20 77 68 65 6e 20 74   occurred when t
7ea0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20  his function.** 
7eb0: 69 73 20 63 61 6c 6c 65 64 2c 20 69 74 20 69 73  is called, it is
7ec0: 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61   a no-op..*/.sta
7ed0: 74 69 63 20 46 74 73 35 53 74 72 75 63 74 75 72  tic Fts5Structur
7ee0: 65 20 2a 66 74 73 35 53 74 72 75 63 74 75 72 65  e *fts5Structure
7ef0: 52 65 61 64 28 46 74 73 35 49 6e 64 65 78 20 2a  Read(Fts5Index *
7f00: 70 29 7b 0a 20 20 46 74 73 35 43 6f 6e 66 69 67  p){.  Fts5Config
7f10: 20 2a 70 43 6f 6e 66 69 67 20 3d 20 70 2d 3e 70   *pConfig = p->p
7f20: 43 6f 6e 66 69 67 3b 0a 20 20 46 74 73 35 53 74  Config;.  Fts5St
7f30: 72 75 63 74 75 72 65 20 2a 70 52 65 74 20 3d 20  ructure *pRet = 
7f40: 30 3b 20 20 20 20 20 20 20 20 2f 2a 20 4f 62 6a  0;        /* Obj
7f50: 65 63 74 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f  ect to return */
7f60: 0a 20 20 69 6e 74 20 69 43 6f 6f 6b 69 65 3b 20  .  int iCookie; 
7f70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7f80: 20 20 20 2f 2a 20 43 6f 6e 66 69 67 75 72 61 74     /* Configurat
7f90: 69 6f 6e 20 63 6f 6f 6b 69 65 20 2a 2f 0a 20 20  ion cookie */.  
7fa0: 46 74 73 35 44 61 74 61 20 2a 70 44 61 74 61 3b  Fts5Data *pData;
7fb0: 0a 0a 20 20 70 44 61 74 61 20 3d 20 66 74 73 35  ..  pData = fts5
7fc0: 44 61 74 61 52 65 61 64 28 70 2c 20 46 54 53 35  DataRead(p, FTS5
7fd0: 5f 53 54 52 55 43 54 55 52 45 5f 52 4f 57 49 44  _STRUCTURE_ROWID
7fe0: 29 3b 0a 20 20 69 66 28 20 70 2d 3e 72 63 20 29  );.  if( p->rc )
7ff0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 2f 2a 20   return 0;.  /* 
8000: 54 4f 44 4f 3a 20 44 6f 20 77 65 20 6e 65 65 64  TODO: Do we need
8010: 20 74 68 69 73 20 69 66 20 74 68 65 20 6c 65 61   this if the lea
8020: 66 2d 69 6e 64 65 78 20 69 73 20 61 70 70 65 6e  f-index is appen
8030: 64 65 64 3f 20 50 72 6f 62 61 62 6c 79 2e 2e 2e  ded? Probably...
8040: 20 2a 2f 0a 20 20 6d 65 6d 73 65 74 28 26 70 44   */.  memset(&pD
8050: 61 74 61 2d 3e 70 5b 70 44 61 74 61 2d 3e 6e 6e  ata->p[pData->nn
8060: 5d 2c 20 30 2c 20 46 54 53 35 5f 44 41 54 41 5f  ], 0, FTS5_DATA_
8070: 50 41 44 44 49 4e 47 29 3b 0a 20 20 70 2d 3e 72  PADDING);.  p->r
8080: 63 20 3d 20 66 74 73 35 53 74 72 75 63 74 75 72  c = fts5Structur
8090: 65 44 65 63 6f 64 65 28 70 44 61 74 61 2d 3e 70  eDecode(pData->p
80a0: 2c 20 70 44 61 74 61 2d 3e 6e 6e 2c 20 26 69 43  , pData->nn, &iC
80b0: 6f 6f 6b 69 65 2c 20 26 70 52 65 74 29 3b 0a 20  ookie, &pRet);. 
80c0: 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49   if( p->rc==SQLI
80d0: 54 45 5f 4f 4b 20 26 26 20 70 43 6f 6e 66 69 67  TE_OK && pConfig
80e0: 2d 3e 69 43 6f 6f 6b 69 65 21 3d 69 43 6f 6f 6b  ->iCookie!=iCook
80f0: 69 65 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20  ie ){.    p->rc 
8100: 3d 20 73 71 6c 69 74 65 33 46 74 73 35 43 6f 6e  = sqlite3Fts5Con
8110: 66 69 67 4c 6f 61 64 28 70 43 6f 6e 66 69 67 2c  figLoad(pConfig,
8120: 20 69 43 6f 6f 6b 69 65 29 3b 0a 20 20 7d 0a 0a   iCookie);.  }..
8130: 20 20 66 74 73 35 44 61 74 61 52 65 6c 65 61 73    fts5DataReleas
8140: 65 28 70 44 61 74 61 29 3b 0a 20 20 69 66 28 20  e(pData);.  if( 
8150: 70 2d 3e 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc!=SQLITE_OK
8160: 20 29 7b 0a 20 20 20 20 66 74 73 35 53 74 72 75   ){.    fts5Stru
8170: 63 74 75 72 65 52 65 6c 65 61 73 65 28 70 52 65  ctureRelease(pRe
8180: 74 29 3b 0a 20 20 20 20 70 52 65 74 20 3d 20 30  t);.    pRet = 0
8190: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  ;.  }.  return p
81a0: 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  Ret;.}../*.** Re
81b0: 74 75 72 6e 20 74 68 65 20 74 6f 74 61 6c 20 6e  turn the total n
81c0: 75 6d 62 65 72 20 6f 66 20 73 65 67 6d 65 6e 74  umber of segment
81d0: 73 20 69 6e 20 69 6e 64 65 78 20 73 74 72 75 63  s in index struc
81e0: 74 75 72 65 20 70 53 74 72 75 63 74 2e 20 54 68  ture pStruct. Th
81f0: 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 69  is.** function i
8200: 73 20 6f 6e 6c 79 20 65 76 65 72 20 75 73 65 64  s only ever used
8210: 20 61 73 20 70 61 72 74 20 6f 66 20 61 73 73 65   as part of asse
8220: 72 74 28 29 20 63 6f 6e 64 69 74 69 6f 6e 73 2e  rt() conditions.
8230: 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .*/.#ifdef SQLIT
8240: 45 5f 44 45 42 55 47 0a 73 74 61 74 69 63 20 69  E_DEBUG.static i
8250: 6e 74 20 66 74 73 35 53 74 72 75 63 74 75 72 65  nt fts5Structure
8260: 43 6f 75 6e 74 53 65 67 6d 65 6e 74 73 28 46 74  CountSegments(Ft
8270: 73 35 53 74 72 75 63 74 75 72 65 20 2a 70 53 74  s5Structure *pSt
8280: 72 75 63 74 29 7b 0a 20 20 69 6e 74 20 6e 53 65  ruct){.  int nSe
8290: 67 6d 65 6e 74 20 3d 20 30 3b 20 20 20 20 20 20  gment = 0;      
82a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 74 61           /* Tota
82b0: 6c 20 6e 75 6d 62 65 72 20 6f 66 20 73 65 67 6d  l number of segm
82c0: 65 6e 74 73 20 2a 2f 0a 20 20 69 66 28 20 70 53  ents */.  if( pS
82d0: 74 72 75 63 74 20 29 7b 0a 20 20 20 20 69 6e 74  truct ){.    int
82e0: 20 69 4c 76 6c 3b 20 20 20 20 20 20 20 20 20 20   iLvl;          
82f0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73             /* Us
8300: 65 64 20 74 6f 20 69 74 65 72 61 74 65 20 74 68  ed to iterate th
8310: 72 6f 75 67 68 20 6c 65 76 65 6c 73 20 2a 2f 0a  rough levels */.
8320: 20 20 20 20 66 6f 72 28 69 4c 76 6c 3d 30 3b 20      for(iLvl=0; 
8330: 69 4c 76 6c 3c 70 53 74 72 75 63 74 2d 3e 6e 4c  iLvl<pStruct->nL
8340: 65 76 65 6c 3b 20 69 4c 76 6c 2b 2b 29 7b 0a 20  evel; iLvl++){. 
8350: 20 20 20 20 20 6e 53 65 67 6d 65 6e 74 20 2b 3d       nSegment +=
8360: 20 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c   pStruct->aLevel
8370: 5b 69 4c 76 6c 5d 2e 6e 53 65 67 3b 0a 20 20 20  [iLvl].nSeg;.   
8380: 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e   }.  }..  return
8390: 20 6e 53 65 67 6d 65 6e 74 3b 0a 7d 0a 23 65 6e   nSegment;.}.#en
83a0: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 53 65 72 69 61  dif../*.** Seria
83b0: 6c 69 7a 65 20 61 6e 64 20 73 74 6f 72 65 20 74  lize and store t
83c0: 68 65 20 22 73 74 72 75 63 74 75 72 65 22 20 72  he "structure" r
83d0: 65 63 6f 72 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ecord..**.** If 
83e0: 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  an error occurs,
83f0: 20 6c 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20   leave an error 
8400: 63 6f 64 65 20 69 6e 20 74 68 65 20 46 74 73 35  code in the Fts5
8410: 49 6e 64 65 78 20 6f 62 6a 65 63 74 2e 20 49 66  Index object. If
8420: 20 61 6e 0a 2a 2a 20 65 72 72 6f 72 20 68 61 73   an.** error has
8430: 20 61 6c 72 65 61 64 79 20 6f 63 63 75 72 72 65   already occurre
8440: 64 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  d, this function
8450: 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a   is a no-op..*/.
8460: 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
8470: 53 74 72 75 63 74 75 72 65 57 72 69 74 65 28 46  StructureWrite(F
8480: 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 46 74 73  ts5Index *p, Fts
8490: 35 53 74 72 75 63 74 75 72 65 20 2a 70 53 74 72  5Structure *pStr
84a0: 75 63 74 29 7b 0a 20 20 69 66 28 20 70 2d 3e 72  uct){.  if( p->r
84b0: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
84c0: 20 20 20 20 46 74 73 35 42 75 66 66 65 72 20 62      Fts5Buffer b
84d0: 75 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  uf;             
84e0: 20 20 2f 2a 20 42 75 66 66 65 72 20 74 6f 20 73    /* Buffer to s
84f0: 65 72 69 61 6c 69 7a 65 20 72 65 63 6f 72 64 20  erialize record 
8500: 69 6e 74 6f 20 2a 2f 0a 20 20 20 20 69 6e 74 20  into */.    int 
8510: 69 4c 76 6c 3b 20 20 20 20 20 20 20 20 20 20 20  iLvl;           
8520: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65            /* Use
8530: 64 20 74 6f 20 69 74 65 72 61 74 65 20 74 68 72  d to iterate thr
8540: 6f 75 67 68 20 6c 65 76 65 6c 73 20 2a 2f 0a 20  ough levels */. 
8550: 20 20 20 69 6e 74 20 69 43 6f 6f 6b 69 65 3b 20     int iCookie; 
8560: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8570: 20 2f 2a 20 43 6f 6f 6b 69 65 20 76 61 6c 75 65   /* Cookie value
8580: 20 74 6f 20 73 74 6f 72 65 20 2a 2f 0a 0a 20 20   to store */..  
8590: 20 20 61 73 73 65 72 74 28 20 70 53 74 72 75 63    assert( pStruc
85a0: 74 2d 3e 6e 53 65 67 6d 65 6e 74 3d 3d 66 74 73  t->nSegment==fts
85b0: 35 53 74 72 75 63 74 75 72 65 43 6f 75 6e 74 53  5StructureCountS
85c0: 65 67 6d 65 6e 74 73 28 70 53 74 72 75 63 74 29  egments(pStruct)
85d0: 20 29 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 26   );.    memset(&
85e0: 62 75 66 2c 20 30 2c 20 73 69 7a 65 6f 66 28 46  buf, 0, sizeof(F
85f0: 74 73 35 42 75 66 66 65 72 29 29 3b 0a 0a 20 20  ts5Buffer));..  
8600: 20 20 2f 2a 20 41 70 70 65 6e 64 20 74 68 65 20    /* Append the 
8610: 63 75 72 72 65 6e 74 20 63 6f 6e 66 69 67 75 72  current configur
8620: 61 74 69 6f 6e 20 63 6f 6f 6b 69 65 20 2a 2f 0a  ation cookie */.
8630: 20 20 20 20 69 43 6f 6f 6b 69 65 20 3d 20 70 2d      iCookie = p-
8640: 3e 70 43 6f 6e 66 69 67 2d 3e 69 43 6f 6f 6b 69  >pConfig->iCooki
8650: 65 3b 0a 20 20 20 20 69 66 28 20 69 43 6f 6f 6b  e;.    if( iCook
8660: 69 65 3c 30 20 29 20 69 43 6f 6f 6b 69 65 20 3d  ie<0 ) iCookie =
8670: 20 30 3b 0a 20 20 20 20 66 74 73 35 42 75 66 66   0;.    fts5Buff
8680: 65 72 41 70 70 65 6e 64 33 32 28 26 70 2d 3e 72  erAppend32(&p->r
8690: 63 2c 20 26 62 75 66 2c 20 69 43 6f 6f 6b 69 65  c, &buf, iCookie
86a0: 29 3b 0a 0a 20 20 20 20 66 74 73 35 42 75 66 66  );..    fts5Buff
86b0: 65 72 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26  erAppendVarint(&
86c0: 70 2d 3e 72 63 2c 20 26 62 75 66 2c 20 70 53 74  p->rc, &buf, pSt
86d0: 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 29 3b 0a 20  ruct->nLevel);. 
86e0: 20 20 20 66 74 73 35 42 75 66 66 65 72 41 70 70     fts5BufferApp
86f0: 65 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e 72 63  endVarint(&p->rc
8700: 2c 20 26 62 75 66 2c 20 70 53 74 72 75 63 74 2d  , &buf, pStruct-
8710: 3e 6e 53 65 67 6d 65 6e 74 29 3b 0a 20 20 20 20  >nSegment);.    
8720: 66 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64  fts5BufferAppend
8730: 56 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26  Varint(&p->rc, &
8740: 62 75 66 2c 20 28 69 36 34 29 70 53 74 72 75 63  buf, (i64)pStruc
8750: 74 2d 3e 6e 57 72 69 74 65 43 6f 75 6e 74 65 72  t->nWriteCounter
8760: 29 3b 0a 0a 20 20 20 20 66 6f 72 28 69 4c 76 6c  );..    for(iLvl
8770: 3d 30 3b 20 69 4c 76 6c 3c 70 53 74 72 75 63 74  =0; iLvl<pStruct
8780: 2d 3e 6e 4c 65 76 65 6c 3b 20 69 4c 76 6c 2b 2b  ->nLevel; iLvl++
8790: 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 53 65  ){.      int iSe
87a0: 67 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  g;              
87b0: 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20 74         /* Used t
87c0: 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f 75 67  o iterate throug
87d0: 68 20 73 65 67 6d 65 6e 74 73 20 2a 2f 0a 20 20  h segments */.  
87e0: 20 20 20 20 46 74 73 35 53 74 72 75 63 74 75 72      Fts5Structur
87f0: 65 4c 65 76 65 6c 20 2a 70 4c 76 6c 20 3d 20 26  eLevel *pLvl = &
8800: 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b  pStruct->aLevel[
8810: 69 4c 76 6c 5d 3b 0a 20 20 20 20 20 20 66 74 73  iLvl];.      fts
8820: 35 42 75 66 66 65 72 41 70 70 65 6e 64 56 61 72  5BufferAppendVar
8830: 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26 62 75 66  int(&p->rc, &buf
8840: 2c 20 70 4c 76 6c 2d 3e 6e 4d 65 72 67 65 29 3b  , pLvl->nMerge);
8850: 0a 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65  .      fts5Buffe
8860: 72 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26 70  rAppendVarint(&p
8870: 2d 3e 72 63 2c 20 26 62 75 66 2c 20 70 4c 76 6c  ->rc, &buf, pLvl
8880: 2d 3e 6e 53 65 67 29 3b 0a 20 20 20 20 20 20 61  ->nSeg);.      a
8890: 73 73 65 72 74 28 20 70 4c 76 6c 2d 3e 6e 4d 65  ssert( pLvl->nMe
88a0: 72 67 65 3c 3d 70 4c 76 6c 2d 3e 6e 53 65 67 20  rge<=pLvl->nSeg 
88b0: 29 3b 0a 0a 20 20 20 20 20 20 66 6f 72 28 69 53  );..      for(iS
88c0: 65 67 3d 30 3b 20 69 53 65 67 3c 70 4c 76 6c 2d  eg=0; iSeg<pLvl-
88d0: 3e 6e 53 65 67 3b 20 69 53 65 67 2b 2b 29 7b 0a  >nSeg; iSeg++){.
88e0: 20 20 20 20 20 20 20 20 66 74 73 35 42 75 66 66          fts5Buff
88f0: 65 72 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26  erAppendVarint(&
8900: 70 2d 3e 72 63 2c 20 26 62 75 66 2c 20 70 4c 76  p->rc, &buf, pLv
8910: 6c 2d 3e 61 53 65 67 5b 69 53 65 67 5d 2e 69 53  l->aSeg[iSeg].iS
8920: 65 67 69 64 29 3b 0a 20 20 20 20 20 20 20 20 66  egid);.        f
8930: 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 56  ts5BufferAppendV
8940: 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26 62  arint(&p->rc, &b
8950: 75 66 2c 20 70 4c 76 6c 2d 3e 61 53 65 67 5b 69  uf, pLvl->aSeg[i
8960: 53 65 67 5d 2e 70 67 6e 6f 46 69 72 73 74 29 3b  Seg].pgnoFirst);
8970: 0a 20 20 20 20 20 20 20 20 66 74 73 35 42 75 66  .        fts5Buf
8980: 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e 74 28  ferAppendVarint(
8990: 26 70 2d 3e 72 63 2c 20 26 62 75 66 2c 20 70 4c  &p->rc, &buf, pL
89a0: 76 6c 2d 3e 61 53 65 67 5b 69 53 65 67 5d 2e 70  vl->aSeg[iSeg].p
89b0: 67 6e 6f 4c 61 73 74 29 3b 0a 20 20 20 20 20 20  gnoLast);.      
89c0: 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 66 74 73  }.    }..    fts
89d0: 35 44 61 74 61 57 72 69 74 65 28 70 2c 20 46 54  5DataWrite(p, FT
89e0: 53 35 5f 53 54 52 55 43 54 55 52 45 5f 52 4f 57  S5_STRUCTURE_ROW
89f0: 49 44 2c 20 62 75 66 2e 70 2c 20 62 75 66 2e 6e  ID, buf.p, buf.n
8a00: 29 3b 0a 20 20 20 20 66 74 73 35 42 75 66 66 65  );.    fts5Buffe
8a10: 72 46 72 65 65 28 26 62 75 66 29 3b 0a 20 20 7d  rFree(&buf);.  }
8a20: 0a 7d 0a 0a 23 69 66 20 30 0a 73 74 61 74 69 63  .}..#if 0.static
8a30: 20 76 6f 69 64 20 66 74 73 35 44 65 62 75 67 53   void fts5DebugS
8a40: 74 72 75 63 74 75 72 65 28 69 6e 74 2a 2c 46 74  tructure(int*,Ft
8a50: 73 35 42 75 66 66 65 72 2a 2c 46 74 73 35 53 74  s5Buffer*,Fts5St
8a60: 72 75 63 74 75 72 65 2a 29 3b 0a 73 74 61 74 69  ructure*);.stati
8a70: 63 20 76 6f 69 64 20 66 74 73 35 50 72 69 6e 74  c void fts5Print
8a80: 53 74 72 75 63 74 75 72 65 28 63 6f 6e 73 74 20  Structure(const 
8a90: 63 68 61 72 20 2a 7a 43 61 70 74 69 6f 6e 2c 20  char *zCaption, 
8aa0: 46 74 73 35 53 74 72 75 63 74 75 72 65 20 2a 70  Fts5Structure *p
8ab0: 53 74 72 75 63 74 29 7b 0a 20 20 69 6e 74 20 72  Struct){.  int r
8ac0: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
8ad0: 20 46 74 73 35 42 75 66 66 65 72 20 62 75 66 3b   Fts5Buffer buf;
8ae0: 0a 20 20 6d 65 6d 73 65 74 28 26 62 75 66 2c 20  .  memset(&buf, 
8af0: 30 2c 20 73 69 7a 65 6f 66 28 62 75 66 29 29 3b  0, sizeof(buf));
8b00: 0a 20 20 66 74 73 35 44 65 62 75 67 53 74 72 75  .  fts5DebugStru
8b10: 63 74 75 72 65 28 26 72 63 2c 20 26 62 75 66 2c  cture(&rc, &buf,
8b20: 20 70 53 74 72 75 63 74 29 3b 0a 20 20 66 70 72   pStruct);.  fpr
8b30: 69 6e 74 66 28 73 74 64 6f 75 74 2c 20 22 25 73  intf(stdout, "%s
8b40: 3a 20 25 73 5c 6e 22 2c 20 7a 43 61 70 74 69 6f  : %s\n", zCaptio
8b50: 6e 2c 20 62 75 66 2e 70 29 3b 0a 20 20 66 66 6c  n, buf.p);.  ffl
8b60: 75 73 68 28 73 74 64 6f 75 74 29 3b 0a 20 20 66  ush(stdout);.  f
8b70: 74 73 35 42 75 66 66 65 72 46 72 65 65 28 26 62  ts5BufferFree(&b
8b80: 75 66 29 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20 64  uf);.}.#else.# d
8b90: 65 66 69 6e 65 20 66 74 73 35 50 72 69 6e 74 53  efine fts5PrintS
8ba0: 74 72 75 63 74 75 72 65 28 78 2c 79 29 0a 23 65  tructure(x,y).#e
8bb0: 6e 64 69 66 0a 0a 73 74 61 74 69 63 20 69 6e 74  ndif..static int
8bc0: 20 66 74 73 35 53 65 67 6d 65 6e 74 53 69 7a 65   fts5SegmentSize
8bd0: 28 46 74 73 35 53 74 72 75 63 74 75 72 65 53 65  (Fts5StructureSe
8be0: 67 6d 65 6e 74 20 2a 70 53 65 67 29 7b 0a 20 20  gment *pSeg){.  
8bf0: 72 65 74 75 72 6e 20 31 20 2b 20 70 53 65 67 2d  return 1 + pSeg-
8c00: 3e 70 67 6e 6f 4c 61 73 74 20 2d 20 70 53 65 67  >pgnoLast - pSeg
8c10: 2d 3e 70 67 6e 6f 46 69 72 73 74 3b 0a 7d 0a 0a  ->pgnoFirst;.}..
8c20: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 63  /*.** Return a c
8c30: 6f 70 79 20 6f 66 20 69 6e 64 65 78 20 73 74 72  opy of index str
8c40: 75 63 74 75 72 65 20 70 53 74 72 75 63 74 2e 20  ucture pStruct. 
8c50: 45 78 63 65 70 74 2c 20 70 72 6f 6d 6f 74 65 20  Except, promote 
8c60: 61 73 20 6d 61 6e 79 20 0a 2a 2a 20 73 65 67 6d  as many .** segm
8c70: 65 6e 74 73 20 61 73 20 70 6f 73 73 69 62 6c 65  ents as possible
8c80: 20 74 6f 20 6c 65 76 65 6c 20 69 50 72 6f 6d 6f   to level iPromo
8c90: 74 65 2e 20 49 66 20 61 6e 20 4f 4f 4d 20 6f 63  te. If an OOM oc
8ca0: 63 75 72 73 2c 20 4e 55 4c 4c 20 69 73 20 0a 2a  curs, NULL is .*
8cb0: 2a 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73  * returned..*/.s
8cc0: 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 53  tatic void fts5S
8cd0: 74 72 75 63 74 75 72 65 50 72 6f 6d 6f 74 65 54  tructurePromoteT
8ce0: 6f 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a  o(.  Fts5Index *
8cf0: 70 2c 0a 20 20 69 6e 74 20 69 50 72 6f 6d 6f 74  p,.  int iPromot
8d00: 65 2c 0a 20 20 69 6e 74 20 73 7a 50 72 6f 6d 6f  e,.  int szPromo
8d10: 74 65 2c 0a 20 20 46 74 73 35 53 74 72 75 63 74  te,.  Fts5Struct
8d20: 75 72 65 20 2a 70 53 74 72 75 63 74 0a 29 7b 0a  ure *pStruct.){.
8d30: 20 20 69 6e 74 20 69 6c 2c 20 69 73 3b 0a 20 20    int il, is;.  
8d40: 46 74 73 35 53 74 72 75 63 74 75 72 65 4c 65 76  Fts5StructureLev
8d50: 65 6c 20 2a 70 4f 75 74 20 3d 20 26 70 53 74 72  el *pOut = &pStr
8d60: 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 50 72 6f  uct->aLevel[iPro
8d70: 6d 6f 74 65 5d 3b 0a 0a 20 20 69 66 28 20 70 4f  mote];..  if( pO
8d80: 75 74 2d 3e 6e 4d 65 72 67 65 3d 3d 30 20 29 7b  ut->nMerge==0 ){
8d90: 0a 20 20 20 20 66 6f 72 28 69 6c 3d 69 50 72 6f  .    for(il=iPro
8da0: 6d 6f 74 65 2b 31 3b 20 69 6c 3c 70 53 74 72 75  mote+1; il<pStru
8db0: 63 74 2d 3e 6e 4c 65 76 65 6c 3b 20 69 6c 2b 2b  ct->nLevel; il++
8dc0: 29 7b 0a 20 20 20 20 20 20 46 74 73 35 53 74 72  ){.      Fts5Str
8dd0: 75 63 74 75 72 65 4c 65 76 65 6c 20 2a 70 4c 76  uctureLevel *pLv
8de0: 6c 20 3d 20 26 70 53 74 72 75 63 74 2d 3e 61 4c  l = &pStruct->aL
8df0: 65 76 65 6c 5b 69 6c 5d 3b 0a 20 20 20 20 20 20  evel[il];.      
8e00: 69 66 28 20 70 4c 76 6c 2d 3e 6e 4d 65 72 67 65  if( pLvl->nMerge
8e10: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20   ) return;.     
8e20: 20 66 6f 72 28 69 73 3d 70 4c 76 6c 2d 3e 6e 53   for(is=pLvl->nS
8e30: 65 67 2d 31 3b 20 69 73 3e 3d 30 3b 20 69 73 2d  eg-1; is>=0; is-
8e40: 2d 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  -){.        int 
8e50: 73 7a 20 3d 20 66 74 73 35 53 65 67 6d 65 6e 74  sz = fts5Segment
8e60: 53 69 7a 65 28 26 70 4c 76 6c 2d 3e 61 53 65 67  Size(&pLvl->aSeg
8e70: 5b 69 73 5d 29 3b 0a 20 20 20 20 20 20 20 20 69  [is]);.        i
8e80: 66 28 20 73 7a 3e 73 7a 50 72 6f 6d 6f 74 65 20  f( sz>szPromote 
8e90: 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20  ) return;.      
8ea0: 20 20 66 74 73 35 53 74 72 75 63 74 75 72 65 45    fts5StructureE
8eb0: 78 74 65 6e 64 4c 65 76 65 6c 28 26 70 2d 3e 72  xtendLevel(&p->r
8ec0: 63 2c 20 70 53 74 72 75 63 74 2c 20 69 50 72 6f  c, pStruct, iPro
8ed0: 6d 6f 74 65 2c 20 31 2c 20 31 29 3b 0a 20 20 20  mote, 1, 1);.   
8ee0: 20 20 20 20 20 69 66 28 20 70 2d 3e 72 63 20 29       if( p->rc )
8ef0: 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 20   return;.       
8f00: 20 6d 65 6d 63 70 79 28 70 4f 75 74 2d 3e 61 53   memcpy(pOut->aS
8f10: 65 67 2c 20 26 70 4c 76 6c 2d 3e 61 53 65 67 5b  eg, &pLvl->aSeg[
8f20: 69 73 5d 2c 20 73 69 7a 65 6f 66 28 46 74 73 35  is], sizeof(Fts5
8f30: 53 74 72 75 63 74 75 72 65 53 65 67 6d 65 6e 74  StructureSegment
8f40: 29 29 3b 0a 20 20 20 20 20 20 20 20 70 4f 75 74  ));.        pOut
8f50: 2d 3e 6e 53 65 67 2b 2b 3b 0a 20 20 20 20 20 20  ->nSeg++;.      
8f60: 20 20 70 4c 76 6c 2d 3e 6e 53 65 67 2d 2d 3b 0a    pLvl->nSeg--;.
8f70: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
8f80: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 6e 65 77  }.}../*.** A new
8f90: 20 73 65 67 6d 65 6e 74 20 68 61 73 20 6a 75 73   segment has jus
8fa0: 74 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74  t been written t
8fb0: 6f 20 6c 65 76 65 6c 20 69 4c 76 6c 20 6f 66 20  o level iLvl of 
8fc0: 69 6e 64 65 78 20 73 74 72 75 63 74 75 72 65 0a  index structure.
8fd0: 2a 2a 20 70 53 74 72 75 63 74 2e 20 54 68 69 73  ** pStruct. This
8fe0: 20 66 75 6e 63 74 69 6f 6e 20 64 65 74 65 72 6d   function determ
8ff0: 69 6e 65 73 20 69 66 20 61 6e 79 20 73 65 67 6d  ines if any segm
9000: 65 6e 74 73 20 73 68 6f 75 6c 64 20 62 65 20 70  ents should be p
9010: 72 6f 6d 6f 74 65 64 0a 2a 2a 20 61 73 20 61 20  romoted.** as a 
9020: 72 65 73 75 6c 74 2e 20 53 65 67 6d 65 6e 74 73  result. Segments
9030: 20 61 72 65 20 70 72 6f 6d 6f 74 65 64 20 69 6e   are promoted in
9040: 20 74 77 6f 20 73 63 65 6e 61 72 69 6f 73 3a 0a   two scenarios:.
9050: 2a 2a 0a 2a 2a 20 20 20 61 29 20 49 66 20 74 68  **.**   a) If th
9060: 65 20 73 65 67 6d 65 6e 74 20 6a 75 73 74 20 77  e segment just w
9070: 72 69 74 74 65 6e 20 69 73 20 73 6d 61 6c 6c 65  ritten is smalle
9080: 72 20 74 68 61 6e 20 6f 6e 65 20 6f 72 20 6d 6f  r than one or mo
9090: 72 65 20 73 65 67 6d 65 6e 74 73 0a 2a 2a 20 20  re segments.**  
90a0: 20 20 20 20 77 69 74 68 69 6e 20 74 68 65 20 70      within the p
90b0: 72 65 76 69 6f 75 73 20 70 6f 70 75 6c 61 74 65  revious populate
90c0: 64 20 6c 65 76 65 6c 2c 20 69 74 20 69 73 20 70  d level, it is p
90d0: 72 6f 6d 6f 74 65 64 20 74 6f 20 74 68 65 20 70  romoted to the p
90e0: 72 65 76 69 6f 75 73 0a 2a 2a 20 20 20 20 20 20  revious.**      
90f0: 70 6f 70 75 6c 61 74 65 64 20 6c 65 76 65 6c 2e  populated level.
9100: 0a 2a 2a 0a 2a 2a 20 20 20 62 29 20 49 66 20 74  .**.**   b) If t
9110: 68 65 20 73 65 67 6d 65 6e 74 20 6a 75 73 74 20  he segment just 
9120: 77 72 69 74 74 65 6e 20 69 73 20 6c 61 72 67 65  written is large
9130: 72 20 74 68 61 6e 20 74 68 65 20 6e 65 77 65 73  r than the newes
9140: 74 20 73 65 67 6d 65 6e 74 20 6f 6e 0a 2a 2a 20  t segment on.** 
9150: 20 20 20 20 20 74 68 65 20 6e 65 78 74 20 70 6f       the next po
9160: 70 75 6c 61 74 65 64 20 6c 65 76 65 6c 2c 20 74  pulated level, t
9170: 68 65 6e 20 74 68 61 74 20 73 65 67 6d 65 6e 74  hen that segment
9180: 2c 20 61 6e 64 20 61 6e 79 20 6f 74 68 65 72 20  , and any other 
9190: 61 64 6a 61 63 65 6e 74 0a 2a 2a 20 20 20 20 20  adjacent.**     
91a0: 20 73 65 67 6d 65 6e 74 73 20 74 68 61 74 20 61   segments that a
91b0: 72 65 20 61 6c 73 6f 20 73 6d 61 6c 6c 65 72 20  re also smaller 
91c0: 74 68 61 6e 20 74 68 65 20 6f 6e 65 20 6a 75 73  than the one jus
91d0: 74 20 77 72 69 74 74 65 6e 2c 20 61 72 65 20 0a  t written, are .
91e0: 2a 2a 20 20 20 20 20 20 70 72 6f 6d 6f 74 65 64  **      promoted
91f0: 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 6f 6e 65 20  . .**.** If one 
9200: 6f 72 20 6d 6f 72 65 20 73 65 67 6d 65 6e 74 73  or more segments
9210: 20 61 72 65 20 70 72 6f 6d 6f 74 65 64 2c 20 74   are promoted, t
9220: 68 65 20 73 74 72 75 63 74 75 72 65 20 6f 62 6a  he structure obj
9230: 65 63 74 20 69 73 20 75 70 64 61 74 65 64 0a 2a  ect is updated.*
9240: 2a 20 74 6f 20 72 65 66 6c 65 63 74 20 74 68 69  * to reflect thi
9250: 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  s..*/.static voi
9260: 64 20 66 74 73 35 53 74 72 75 63 74 75 72 65 50  d fts5StructureP
9270: 72 6f 6d 6f 74 65 28 0a 20 20 46 74 73 35 49 6e  romote(.  Fts5In
9280: 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20 20  dex *p,         
9290: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53            /* FTS
92a0: 35 20 62 61 63 6b 65 6e 64 20 6f 62 6a 65 63 74  5 backend object
92b0: 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 76 6c 2c 20   */.  int iLvl, 
92c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
92d0: 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6c        /* Index l
92e0: 65 76 65 6c 20 6a 75 73 74 20 75 70 64 61 74 65  evel just update
92f0: 64 20 2a 2f 0a 20 20 46 74 73 35 53 74 72 75 63  d */.  Fts5Struc
9300: 74 75 72 65 20 2a 70 53 74 72 75 63 74 20 20 20  ture *pStruct   
9310: 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
9320: 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 29 7b 0a  structure */.){.
9330: 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c    if( p->rc==SQL
9340: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 6e  ITE_OK ){.    in
9350: 74 20 69 54 73 74 3b 0a 20 20 20 20 69 6e 74 20  t iTst;.    int 
9360: 69 50 72 6f 6d 6f 74 65 20 3d 20 2d 31 3b 0a 20  iPromote = -1;. 
9370: 20 20 20 69 6e 74 20 73 7a 50 72 6f 6d 6f 74 65     int szPromote
9380: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
9390: 20 2f 2a 20 50 72 6f 6d 6f 74 65 20 61 6e 79 74   /* Promote anyt
93a0: 68 69 6e 67 20 74 68 69 73 20 73 69 7a 65 20 6f  hing this size o
93b0: 72 20 73 6d 61 6c 6c 65 72 20 2a 2f 0a 20 20 20  r smaller */.   
93c0: 20 46 74 73 35 53 74 72 75 63 74 75 72 65 53 65   Fts5StructureSe
93d0: 67 6d 65 6e 74 20 2a 70 53 65 67 3b 20 20 20 2f  gment *pSeg;   /
93e0: 2a 20 53 65 67 6d 65 6e 74 20 6a 75 73 74 20 77  * Segment just w
93f0: 72 69 74 74 65 6e 20 2a 2f 0a 20 20 20 20 69 6e  ritten */.    in
9400: 74 20 73 7a 53 65 67 3b 20 20 20 20 20 20 20 20  t szSeg;        
9410: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
9420: 69 7a 65 20 6f 66 20 73 65 67 6d 65 6e 74 20 6a  ize of segment j
9430: 75 73 74 20 77 72 69 74 74 65 6e 20 2a 2f 0a 20  ust written */. 
9440: 20 20 20 69 6e 74 20 6e 53 65 67 20 3d 20 70 53     int nSeg = pS
9450: 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c  truct->aLevel[iL
9460: 76 6c 5d 2e 6e 53 65 67 3b 0a 0a 20 20 20 20 69  vl].nSeg;..    i
9470: 66 28 20 6e 53 65 67 3d 3d 30 20 29 20 72 65 74  f( nSeg==0 ) ret
9480: 75 72 6e 3b 0a 20 20 20 20 70 53 65 67 20 3d 20  urn;.    pSeg = 
9490: 26 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c  &pStruct->aLevel
94a0: 5b 69 4c 76 6c 5d 2e 61 53 65 67 5b 70 53 74 72  [iLvl].aSeg[pStr
94b0: 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c  uct->aLevel[iLvl
94c0: 5d 2e 6e 53 65 67 2d 31 5d 3b 0a 20 20 20 20 73  ].nSeg-1];.    s
94d0: 7a 53 65 67 20 3d 20 28 31 20 2b 20 70 53 65 67  zSeg = (1 + pSeg
94e0: 2d 3e 70 67 6e 6f 4c 61 73 74 20 2d 20 70 53 65  ->pgnoLast - pSe
94f0: 67 2d 3e 70 67 6e 6f 46 69 72 73 74 29 3b 0a 0a  g->pgnoFirst);..
9500: 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72      /* Check for
9510: 20 63 6f 6e 64 69 74 69 6f 6e 20 28 61 29 20 2a   condition (a) *
9520: 2f 0a 20 20 20 20 66 6f 72 28 69 54 73 74 3d 69  /.    for(iTst=i
9530: 4c 76 6c 2d 31 3b 20 69 54 73 74 3e 3d 30 20 26  Lvl-1; iTst>=0 &
9540: 26 20 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65  & pStruct->aLeve
9550: 6c 5b 69 54 73 74 5d 2e 6e 53 65 67 3d 3d 30 3b  l[iTst].nSeg==0;
9560: 20 69 54 73 74 2d 2d 29 3b 0a 20 20 20 20 69 66   iTst--);.    if
9570: 28 20 69 54 73 74 3e 3d 30 20 29 7b 0a 20 20 20  ( iTst>=0 ){.   
9580: 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20     int i;.      
9590: 69 6e 74 20 73 7a 4d 61 78 20 3d 20 30 3b 0a 20  int szMax = 0;. 
95a0: 20 20 20 20 20 46 74 73 35 53 74 72 75 63 74 75       Fts5Structu
95b0: 72 65 4c 65 76 65 6c 20 2a 70 54 73 74 20 3d 20  reLevel *pTst = 
95c0: 26 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c  &pStruct->aLevel
95d0: 5b 69 54 73 74 5d 3b 0a 20 20 20 20 20 20 61 73  [iTst];.      as
95e0: 73 65 72 74 28 20 70 54 73 74 2d 3e 6e 4d 65 72  sert( pTst->nMer
95f0: 67 65 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 66  ge==0 );.      f
9600: 6f 72 28 69 3d 30 3b 20 69 3c 70 54 73 74 2d 3e  or(i=0; i<pTst->
9610: 6e 53 65 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nSeg; i++){.    
9620: 20 20 20 20 69 6e 74 20 73 7a 20 3d 20 70 54 73      int sz = pTs
9630: 74 2d 3e 61 53 65 67 5b 69 5d 2e 70 67 6e 6f 4c  t->aSeg[i].pgnoL
9640: 61 73 74 20 2d 20 70 54 73 74 2d 3e 61 53 65 67  ast - pTst->aSeg
9650: 5b 69 5d 2e 70 67 6e 6f 46 69 72 73 74 20 2b 20  [i].pgnoFirst + 
9660: 31 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73  1;.        if( s
9670: 7a 3e 73 7a 4d 61 78 20 29 20 73 7a 4d 61 78 20  z>szMax ) szMax 
9680: 3d 20 73 7a 3b 0a 20 20 20 20 20 20 7d 0a 20 20  = sz;.      }.  
9690: 20 20 20 20 69 66 28 20 73 7a 4d 61 78 3e 3d 73      if( szMax>=s
96a0: 7a 53 65 67 20 29 7b 0a 20 20 20 20 20 20 20 20  zSeg ){.        
96b0: 2f 2a 20 43 6f 6e 64 69 74 69 6f 6e 20 28 61 29  /* Condition (a)
96c0: 20 69 73 20 74 72 75 65 2e 20 50 72 6f 6d 6f 74   is true. Promot
96d0: 65 20 74 68 65 20 6e 65 77 65 73 74 20 73 65 67  e the newest seg
96e0: 6d 65 6e 74 20 6f 6e 20 6c 65 76 65 6c 20 0a 20  ment on level . 
96f0: 20 20 20 20 20 20 20 2a 2a 20 69 4c 76 6c 20 74         ** iLvl t
9700: 6f 20 6c 65 76 65 6c 20 69 54 73 74 2e 20 20 2a  o level iTst.  *
9710: 2f 0a 20 20 20 20 20 20 20 20 69 50 72 6f 6d 6f  /.        iPromo
9720: 74 65 20 3d 20 69 54 73 74 3b 0a 20 20 20 20 20  te = iTst;.     
9730: 20 20 20 73 7a 50 72 6f 6d 6f 74 65 20 3d 20 73     szPromote = s
9740: 7a 4d 61 78 3b 0a 20 20 20 20 20 20 7d 0a 20 20  zMax;.      }.  
9750: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 63    }..    /* If c
9760: 6f 6e 64 69 74 69 6f 6e 20 28 61 29 20 69 73 20  ondition (a) is 
9770: 6e 6f 74 20 6d 65 74 2c 20 61 73 73 75 6d 65 20  not met, assume 
9780: 28 62 29 20 69 73 20 74 72 75 65 2e 20 53 74 72  (b) is true. Str
9790: 75 63 74 75 72 65 50 72 6f 6d 6f 74 65 54 6f 28  ucturePromoteTo(
97a0: 29 0a 20 20 20 20 2a 2a 20 69 73 20 61 20 6e 6f  ).    ** is a no
97b0: 2d 6f 70 20 69 66 20 69 74 20 69 73 20 6e 6f 74  -op if it is not
97c0: 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 69 50  .  */.    if( iP
97d0: 72 6f 6d 6f 74 65 3c 30 20 29 7b 0a 20 20 20 20  romote<0 ){.    
97e0: 20 20 69 50 72 6f 6d 6f 74 65 20 3d 20 69 4c 76    iPromote = iLv
97f0: 6c 3b 0a 20 20 20 20 20 20 73 7a 50 72 6f 6d 6f  l;.      szPromo
9800: 74 65 20 3d 20 73 7a 53 65 67 3b 0a 20 20 20 20  te = szSeg;.    
9810: 7d 0a 20 20 20 20 66 74 73 35 53 74 72 75 63 74  }.    fts5Struct
9820: 75 72 65 50 72 6f 6d 6f 74 65 54 6f 28 70 2c 20  urePromoteTo(p, 
9830: 69 50 72 6f 6d 6f 74 65 2c 20 73 7a 50 72 6f 6d  iPromote, szProm
9840: 6f 74 65 2c 20 70 53 74 72 75 63 74 29 3b 0a 20  ote, pStruct);. 
9850: 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 41 64 76   }.}.../*.** Adv
9860: 61 6e 63 65 20 74 68 65 20 69 74 65 72 61 74 6f  ance the iterato
9870: 72 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  r passed as the 
9880: 6f 6e 6c 79 20 61 72 67 75 6d 65 6e 74 2e 20 49  only argument. I
9890: 66 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  f the end of the
98a0: 20 0a 2a 2a 20 64 6f 63 6c 69 73 74 2d 69 6e 64   .** doclist-ind
98b0: 65 78 20 70 61 67 65 20 69 73 20 72 65 61 63 68  ex page is reach
98c0: 65 64 2c 20 72 65 74 75 72 6e 20 6e 6f 6e 2d 7a  ed, return non-z
98d0: 65 72 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ero..*/.static i
98e0: 6e 74 20 66 74 73 35 44 6c 69 64 78 4c 76 6c 4e  nt fts5DlidxLvlN
98f0: 65 78 74 28 46 74 73 35 44 6c 69 64 78 4c 76 6c  ext(Fts5DlidxLvl
9900: 20 2a 70 4c 76 6c 29 7b 0a 20 20 46 74 73 35 44   *pLvl){.  Fts5D
9910: 61 74 61 20 2a 70 44 61 74 61 20 3d 20 70 4c 76  ata *pData = pLv
9920: 6c 2d 3e 70 44 61 74 61 3b 0a 0a 20 20 69 66 28  l->pData;..  if(
9930: 20 70 4c 76 6c 2d 3e 69 4f 66 66 3d 3d 30 20 29   pLvl->iOff==0 )
9940: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4c  {.    assert( pL
9950: 76 6c 2d 3e 62 45 6f 66 3d 3d 30 20 29 3b 0a 20  vl->bEof==0 );. 
9960: 20 20 20 70 4c 76 6c 2d 3e 69 4f 66 66 20 3d 20     pLvl->iOff = 
9970: 31 3b 0a 20 20 20 20 70 4c 76 6c 2d 3e 69 4f 66  1;.    pLvl->iOf
9980: 66 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69  f += fts5GetVari
9990: 6e 74 33 32 28 26 70 44 61 74 61 2d 3e 70 5b 31  nt32(&pData->p[1
99a0: 5d 2c 20 70 4c 76 6c 2d 3e 69 4c 65 61 66 50 67  ], pLvl->iLeafPg
99b0: 6e 6f 29 3b 0a 20 20 20 20 70 4c 76 6c 2d 3e 69  no);.    pLvl->i
99c0: 4f 66 66 20 2b 3d 20 66 74 73 35 47 65 74 56 61  Off += fts5GetVa
99d0: 72 69 6e 74 28 26 70 44 61 74 61 2d 3e 70 5b 70  rint(&pData->p[p
99e0: 4c 76 6c 2d 3e 69 4f 66 66 5d 2c 20 28 75 36 34  Lvl->iOff], (u64
99f0: 2a 29 26 70 4c 76 6c 2d 3e 69 52 6f 77 69 64 29  *)&pLvl->iRowid)
9a00: 3b 0a 20 20 20 20 70 4c 76 6c 2d 3e 69 46 69 72  ;.    pLvl->iFir
9a10: 73 74 4f 66 66 20 3d 20 70 4c 76 6c 2d 3e 69 4f  stOff = pLvl->iO
9a20: 66 66 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ff;.  }else{.   
9a30: 20 69 6e 74 20 69 4f 66 66 3b 0a 20 20 20 20 66   int iOff;.    f
9a40: 6f 72 28 69 4f 66 66 3d 70 4c 76 6c 2d 3e 69 4f  or(iOff=pLvl->iO
9a50: 66 66 3b 20 69 4f 66 66 3c 70 44 61 74 61 2d 3e  ff; iOff<pData->
9a60: 6e 6e 3b 20 69 4f 66 66 2b 2b 29 7b 0a 20 20 20  nn; iOff++){.   
9a70: 20 20 20 69 66 28 20 70 44 61 74 61 2d 3e 70 5b     if( pData->p[
9a80: 69 4f 66 66 5d 20 29 20 62 72 65 61 6b 3b 20 0a  iOff] ) break; .
9a90: 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 69      }..    if( i
9aa0: 4f 66 66 3c 70 44 61 74 61 2d 3e 6e 6e 20 29 7b  Off<pData->nn ){
9ab0: 0a 20 20 20 20 20 20 69 36 34 20 69 56 61 6c 3b  .      i64 iVal;
9ac0: 0a 20 20 20 20 20 20 70 4c 76 6c 2d 3e 69 4c 65  .      pLvl->iLe
9ad0: 61 66 50 67 6e 6f 20 2b 3d 20 28 69 4f 66 66 20  afPgno += (iOff 
9ae0: 2d 20 70 4c 76 6c 2d 3e 69 4f 66 66 29 20 2b 20  - pLvl->iOff) + 
9af0: 31 3b 0a 20 20 20 20 20 20 69 4f 66 66 20 2b 3d  1;.      iOff +=
9b00: 20 66 74 73 35 47 65 74 56 61 72 69 6e 74 28 26   fts5GetVarint(&
9b10: 70 44 61 74 61 2d 3e 70 5b 69 4f 66 66 5d 2c 20  pData->p[iOff], 
9b20: 28 75 36 34 2a 29 26 69 56 61 6c 29 3b 0a 20 20  (u64*)&iVal);.  
9b30: 20 20 20 20 70 4c 76 6c 2d 3e 69 52 6f 77 69 64      pLvl->iRowid
9b40: 20 2b 3d 20 69 56 61 6c 3b 0a 20 20 20 20 20 20   += iVal;.      
9b50: 70 4c 76 6c 2d 3e 69 4f 66 66 20 3d 20 69 4f 66  pLvl->iOff = iOf
9b60: 66 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  f;.    }else{.  
9b70: 20 20 20 20 70 4c 76 6c 2d 3e 62 45 6f 66 20 3d      pLvl->bEof =
9b80: 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20   1;.    }.  }.. 
9b90: 20 72 65 74 75 72 6e 20 70 4c 76 6c 2d 3e 62 45   return pLvl->bE
9ba0: 6f 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 76  of;.}../*.** Adv
9bb0: 61 6e 63 65 20 74 68 65 20 69 74 65 72 61 74 6f  ance the iterato
9bc0: 72 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  r passed as the 
9bd0: 6f 6e 6c 79 20 61 72 67 75 6d 65 6e 74 2e 0a 2a  only argument..*
9be0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73  /.static int fts
9bf0: 35 44 6c 69 64 78 49 74 65 72 4e 65 78 74 52 28  5DlidxIterNextR(
9c00: 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 46 74  Fts5Index *p, Ft
9c10: 73 35 44 6c 69 64 78 49 74 65 72 20 2a 70 49 74  s5DlidxIter *pIt
9c20: 65 72 2c 20 69 6e 74 20 69 4c 76 6c 29 7b 0a 20  er, int iLvl){. 
9c30: 20 46 74 73 35 44 6c 69 64 78 4c 76 6c 20 2a 70   Fts5DlidxLvl *p
9c40: 4c 76 6c 20 3d 20 26 70 49 74 65 72 2d 3e 61 4c  Lvl = &pIter->aL
9c50: 76 6c 5b 69 4c 76 6c 5d 3b 0a 0a 20 20 61 73 73  vl[iLvl];..  ass
9c60: 65 72 74 28 20 69 4c 76 6c 3c 70 49 74 65 72 2d  ert( iLvl<pIter-
9c70: 3e 6e 4c 76 6c 20 29 3b 0a 20 20 69 66 28 20 66  >nLvl );.  if( f
9c80: 74 73 35 44 6c 69 64 78 4c 76 6c 4e 65 78 74 28  ts5DlidxLvlNext(
9c90: 70 4c 76 6c 29 20 29 7b 0a 20 20 20 20 69 66 28  pLvl) ){.    if(
9ca0: 20 28 69 4c 76 6c 2b 31 29 20 3c 20 70 49 74 65   (iLvl+1) < pIte
9cb0: 72 2d 3e 6e 4c 76 6c 20 29 7b 0a 20 20 20 20 20  r->nLvl ){.     
9cc0: 20 66 74 73 35 44 6c 69 64 78 49 74 65 72 4e 65   fts5DlidxIterNe
9cd0: 78 74 52 28 70 2c 20 70 49 74 65 72 2c 20 69 4c  xtR(p, pIter, iL
9ce0: 76 6c 2b 31 29 3b 0a 20 20 20 20 20 20 69 66 28  vl+1);.      if(
9cf0: 20 70 4c 76 6c 5b 31 5d 2e 62 45 6f 66 3d 3d 30   pLvl[1].bEof==0
9d00: 20 29 7b 0a 20 20 20 20 20 20 20 20 66 74 73 35   ){.        fts5
9d10: 44 61 74 61 52 65 6c 65 61 73 65 28 70 4c 76 6c  DataRelease(pLvl
9d20: 2d 3e 70 44 61 74 61 29 3b 0a 20 20 20 20 20 20  ->pData);.      
9d30: 20 20 6d 65 6d 73 65 74 28 70 4c 76 6c 2c 20 30    memset(pLvl, 0
9d40: 2c 20 73 69 7a 65 6f 66 28 46 74 73 35 44 6c 69  , sizeof(Fts5Dli
9d50: 64 78 4c 76 6c 29 29 3b 0a 20 20 20 20 20 20 20  dxLvl));.       
9d60: 20 70 4c 76 6c 2d 3e 70 44 61 74 61 20 3d 20 66   pLvl->pData = f
9d70: 74 73 35 44 61 74 61 52 65 61 64 28 70 2c 20 0a  ts5DataRead(p, .
9d80: 20 20 20 20 20 20 20 20 20 20 20 20 46 54 53 35              FTS5
9d90: 5f 44 4c 49 44 58 5f 52 4f 57 49 44 28 70 49 74  _DLIDX_ROWID(pIt
9da0: 65 72 2d 3e 69 53 65 67 69 64 2c 20 69 4c 76 6c  er->iSegid, iLvl
9db0: 2c 20 70 4c 76 6c 5b 31 5d 2e 69 4c 65 61 66 50  , pLvl[1].iLeafP
9dc0: 67 6e 6f 29 0a 20 20 20 20 20 20 20 20 29 3b 0a  gno).        );.
9dd0: 20 20 20 20 20 20 20 20 69 66 28 20 70 4c 76 6c          if( pLvl
9de0: 2d 3e 70 44 61 74 61 20 29 20 66 74 73 35 44 6c  ->pData ) fts5Dl
9df0: 69 64 78 4c 76 6c 4e 65 78 74 28 70 4c 76 6c 29  idxLvlNext(pLvl)
9e00: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
9e10: 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70 49    }..  return pI
9e20: 74 65 72 2d 3e 61 4c 76 6c 5b 30 5d 2e 62 45 6f  ter->aLvl[0].bEo
9e30: 66 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74 20  f;.}.static int 
9e40: 66 74 73 35 44 6c 69 64 78 49 74 65 72 4e 65 78  fts5DlidxIterNex
9e50: 74 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20  t(Fts5Index *p, 
9e60: 46 74 73 35 44 6c 69 64 78 49 74 65 72 20 2a 70  Fts5DlidxIter *p
9e70: 49 74 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20  Iter){.  return 
9e80: 66 74 73 35 44 6c 69 64 78 49 74 65 72 4e 65 78  fts5DlidxIterNex
9e90: 74 52 28 70 2c 20 70 49 74 65 72 2c 20 30 29 3b  tR(p, pIter, 0);
9ea0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 69 74  .}../*.** The it
9eb0: 65 72 61 74 6f 72 20 70 61 73 73 65 64 20 61 73  erator passed as
9ec0: 20 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d   the first argum
9ed0: 65 6e 74 20 68 61 73 20 74 68 65 20 66 6f 6c 6c  ent has the foll
9ee0: 6f 77 69 6e 67 20 66 69 65 6c 64 73 20 73 65 74  owing fields set
9ef0: 0a 2a 2a 20 61 73 20 66 6f 6c 6c 6f 77 73 2e 20  .** as follows. 
9f00: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 73 65  This function se
9f10: 74 73 20 75 70 20 74 68 65 20 72 65 73 74 20 6f  ts up the rest o
9f20: 66 20 74 68 65 20 69 74 65 72 61 74 6f 72 20 73  f the iterator s
9f30: 6f 20 74 68 61 74 20 69 74 0a 2a 2a 20 70 6f 69  o that it.** poi
9f40: 6e 74 73 20 74 6f 20 74 68 65 20 66 69 72 73 74  nts to the first
9f50: 20 72 6f 77 69 64 20 69 6e 20 74 68 65 20 64 6f   rowid in the do
9f60: 63 6c 69 73 74 2d 69 6e 64 65 78 2e 0a 2a 2a 0a  clist-index..**.
9f70: 2a 2a 20 20 20 70 44 61 74 61 3a 0a 2a 2a 20 20  **   pData:.**  
9f80: 20 20 20 70 6f 69 6e 74 65 72 20 74 6f 20 64 6f     pointer to do
9f90: 63 6c 69 73 74 2d 69 6e 64 65 78 20 72 65 63 6f  clist-index reco
9fa0: 72 64 2c 20 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20  rd, .**.** When 
9fb0: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
9fc0: 20 63 61 6c 6c 65 64 20 70 49 74 65 72 2d 3e 69   called pIter->i
9fd0: 4c 65 61 66 50 67 6e 6f 20 69 73 20 74 68 65 20  LeafPgno is the 
9fe0: 70 61 67 65 20 6e 75 6d 62 65 72 20 74 68 65 0a  page number the.
9ff0: 2a 2a 20 64 6f 63 6c 69 73 74 20 69 73 20 61 73  ** doclist is as
a000: 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 28 74  sociated with (t
a010: 68 65 20 6f 6e 65 20 66 65 61 74 75 72 69 6e 67  he one featuring
a020: 20 74 68 65 20 74 65 72 6d 29 2e 0a 2a 2f 0a 73   the term)..*/.s
a030: 74 61 74 69 63 20 69 6e 74 20 66 74 73 35 44 6c  tatic int fts5Dl
a040: 69 64 78 49 74 65 72 46 69 72 73 74 28 46 74 73  idxIterFirst(Fts
a050: 35 44 6c 69 64 78 49 74 65 72 20 2a 70 49 74 65  5DlidxIter *pIte
a060: 72 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66  r){.  int i;.  f
a070: 6f 72 28 69 3d 30 3b 20 69 3c 70 49 74 65 72 2d  or(i=0; i<pIter-
a080: 3e 6e 4c 76 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  >nLvl; i++){.   
a090: 20 66 74 73 35 44 6c 69 64 78 4c 76 6c 4e 65 78   fts5DlidxLvlNex
a0a0: 74 28 26 70 49 74 65 72 2d 3e 61 4c 76 6c 5b 69  t(&pIter->aLvl[i
a0b0: 5d 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  ]);.  }.  return
a0c0: 20 70 49 74 65 72 2d 3e 61 4c 76 6c 5b 30 5d 2e   pIter->aLvl[0].
a0d0: 62 45 6f 66 3b 0a 7d 0a 0a 0a 73 74 61 74 69 63  bEof;.}...static
a0e0: 20 69 6e 74 20 66 74 73 35 44 6c 69 64 78 49 74   int fts5DlidxIt
a0f0: 65 72 45 6f 66 28 46 74 73 35 49 6e 64 65 78 20  erEof(Fts5Index 
a100: 2a 70 2c 20 46 74 73 35 44 6c 69 64 78 49 74 65  *p, Fts5DlidxIte
a110: 72 20 2a 70 49 74 65 72 29 7b 0a 20 20 72 65 74  r *pIter){.  ret
a120: 75 72 6e 20 70 2d 3e 72 63 21 3d 53 51 4c 49 54  urn p->rc!=SQLIT
a130: 45 5f 4f 4b 20 7c 7c 20 70 49 74 65 72 2d 3e 61  E_OK || pIter->a
a140: 4c 76 6c 5b 30 5d 2e 62 45 6f 66 3b 0a 7d 0a 0a  Lvl[0].bEof;.}..
a150: 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
a160: 44 6c 69 64 78 49 74 65 72 4c 61 73 74 28 46 74  DlidxIterLast(Ft
a170: 73 35 49 6e 64 65 78 20 2a 70 2c 20 46 74 73 35  s5Index *p, Fts5
a180: 44 6c 69 64 78 49 74 65 72 20 2a 70 49 74 65 72  DlidxIter *pIter
a190: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20 2f  ){.  int i;..  /
a1a0: 2a 20 41 64 76 61 6e 63 65 20 65 61 63 68 20 6c  * Advance each l
a1b0: 65 76 65 6c 20 74 6f 20 74 68 65 20 6c 61 73 74  evel to the last
a1c0: 20 65 6e 74 72 79 20 6f 6e 20 74 68 65 20 6c 61   entry on the la
a1d0: 73 74 20 70 61 67 65 20 2a 2f 0a 20 20 66 6f 72  st page */.  for
a1e0: 28 69 3d 70 49 74 65 72 2d 3e 6e 4c 76 6c 2d 31  (i=pIter->nLvl-1
a1f0: 3b 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ; p->rc==SQLITE_
a200: 4f 4b 20 26 26 20 69 3e 3d 30 3b 20 69 2d 2d 29  OK && i>=0; i--)
a210: 7b 0a 20 20 20 20 46 74 73 35 44 6c 69 64 78 4c  {.    Fts5DlidxL
a220: 76 6c 20 2a 70 4c 76 6c 20 3d 20 26 70 49 74 65  vl *pLvl = &pIte
a230: 72 2d 3e 61 4c 76 6c 5b 69 5d 3b 0a 20 20 20 20  r->aLvl[i];.    
a240: 77 68 69 6c 65 28 20 66 74 73 35 44 6c 69 64 78  while( fts5Dlidx
a250: 4c 76 6c 4e 65 78 74 28 70 4c 76 6c 29 3d 3d 30  LvlNext(pLvl)==0
a260: 20 29 3b 0a 20 20 20 20 70 4c 76 6c 2d 3e 62 45   );.    pLvl->bE
a270: 6f 66 20 3d 20 30 3b 0a 0a 20 20 20 20 69 66 28  of = 0;..    if(
a280: 20 69 3e 30 20 29 7b 0a 20 20 20 20 20 20 46 74   i>0 ){.      Ft
a290: 73 35 44 6c 69 64 78 4c 76 6c 20 2a 70 43 68 69  s5DlidxLvl *pChi
a2a0: 6c 64 20 3d 20 26 70 4c 76 6c 5b 2d 31 5d 3b 0a  ld = &pLvl[-1];.
a2b0: 20 20 20 20 20 20 66 74 73 35 44 61 74 61 52 65        fts5DataRe
a2c0: 6c 65 61 73 65 28 70 43 68 69 6c 64 2d 3e 70 44  lease(pChild->pD
a2d0: 61 74 61 29 3b 0a 20 20 20 20 20 20 6d 65 6d 73  ata);.      mems
a2e0: 65 74 28 70 43 68 69 6c 64 2c 20 30 2c 20 73 69  et(pChild, 0, si
a2f0: 7a 65 6f 66 28 46 74 73 35 44 6c 69 64 78 4c 76  zeof(Fts5DlidxLv
a300: 6c 29 29 3b 0a 20 20 20 20 20 20 70 43 68 69 6c  l));.      pChil
a310: 64 2d 3e 70 44 61 74 61 20 3d 20 66 74 73 35 44  d->pData = fts5D
a320: 61 74 61 52 65 61 64 28 70 2c 20 0a 20 20 20 20  ataRead(p, .    
a330: 20 20 20 20 20 20 46 54 53 35 5f 44 4c 49 44 58        FTS5_DLIDX
a340: 5f 52 4f 57 49 44 28 70 49 74 65 72 2d 3e 69 53  _ROWID(pIter->iS
a350: 65 67 69 64 2c 20 69 2d 31 2c 20 70 4c 76 6c 2d  egid, i-1, pLvl-
a360: 3e 69 4c 65 61 66 50 67 6e 6f 29 0a 20 20 20 20  >iLeafPgno).    
a370: 20 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d    );.    }.  }.}
a380: 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65  ../*.** Move the
a390: 20 69 74 65 72 61 74 6f 72 20 70 61 73 73 65 64   iterator passed
a3a0: 20 61 73 20 74 68 65 20 6f 6e 6c 79 20 61 72 67   as the only arg
a3b0: 75 6d 65 6e 74 20 74 6f 20 74 68 65 20 70 72 65  ument to the pre
a3c0: 76 69 6f 75 73 20 65 6e 74 72 79 2e 0a 2a 2f 0a  vious entry..*/.
a3d0: 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 35 44  static int fts5D
a3e0: 6c 69 64 78 4c 76 6c 50 72 65 76 28 46 74 73 35  lidxLvlPrev(Fts5
a3f0: 44 6c 69 64 78 4c 76 6c 20 2a 70 4c 76 6c 29 7b  DlidxLvl *pLvl){
a400: 0a 20 20 69 6e 74 20 69 4f 66 66 20 3d 20 70 4c  .  int iOff = pL
a410: 76 6c 2d 3e 69 4f 66 66 3b 0a 0a 20 20 61 73 73  vl->iOff;..  ass
a420: 65 72 74 28 20 70 4c 76 6c 2d 3e 62 45 6f 66 3d  ert( pLvl->bEof=
a430: 3d 30 20 29 3b 0a 20 20 69 66 28 20 69 4f 66 66  =0 );.  if( iOff
a440: 3c 3d 70 4c 76 6c 2d 3e 69 46 69 72 73 74 4f 66  <=pLvl->iFirstOf
a450: 66 20 29 7b 0a 20 20 20 20 70 4c 76 6c 2d 3e 62  f ){.    pLvl->b
a460: 45 6f 66 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65  Eof = 1;.  }else
a470: 7b 0a 20 20 20 20 75 38 20 2a 61 20 3d 20 70 4c  {.    u8 *a = pL
a480: 76 6c 2d 3e 70 44 61 74 61 2d 3e 70 3b 0a 20 20  vl->pData->p;.  
a490: 20 20 69 36 34 20 69 56 61 6c 3b 0a 20 20 20 20    i64 iVal;.    
a4a0: 69 6e 74 20 69 4c 69 6d 69 74 3b 0a 20 20 20 20  int iLimit;.    
a4b0: 69 6e 74 20 69 69 3b 0a 20 20 20 20 69 6e 74 20  int ii;.    int 
a4c0: 6e 5a 65 72 6f 20 3d 20 30 3b 0a 0a 20 20 20 20  nZero = 0;..    
a4d0: 2f 2a 20 43 75 72 72 65 6e 74 6c 79 20 69 4f 66  /* Currently iOf
a4e0: 66 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20  f points to the 
a4f0: 66 69 72 73 74 20 62 79 74 65 20 6f 66 20 61 20  first byte of a 
a500: 76 61 72 69 6e 74 2e 20 54 68 69 73 20 62 6c 6f  varint. This blo
a510: 63 6b 20 0a 20 20 20 20 2a 2a 20 64 65 63 72 65  ck .    ** decre
a520: 6d 65 6e 74 73 20 69 4f 66 66 20 75 6e 74 69 6c  ments iOff until
a530: 20 69 74 20 70 6f 69 6e 74 73 20 74 6f 20 74 68   it points to th
a540: 65 20 66 69 72 73 74 20 62 79 74 65 20 6f 66 20  e first byte of 
a550: 74 68 65 20 70 72 65 76 69 6f 75 73 20 0a 20 20  the previous .  
a560: 20 20 2a 2a 20 76 61 72 69 6e 74 2e 20 54 61 6b    ** varint. Tak
a570: 69 6e 67 20 63 61 72 65 20 6e 6f 74 20 74 6f 20  ing care not to 
a580: 72 65 61 64 20 61 6e 79 20 6d 65 6d 6f 72 79 20  read any memory 
a590: 6c 6f 63 61 74 69 6f 6e 73 20 74 68 61 74 20 6f  locations that o
a5a0: 63 63 75 72 0a 20 20 20 20 2a 2a 20 62 65 66 6f  ccur.    ** befo
a5b0: 72 65 20 74 68 65 20 62 75 66 66 65 72 20 69 6e  re the buffer in
a5c0: 20 6d 65 6d 6f 72 79 2e 20 20 2a 2f 0a 20 20 20   memory.  */.   
a5d0: 20 69 4c 69 6d 69 74 20 3d 20 28 69 4f 66 66 3e   iLimit = (iOff>
a5e0: 39 20 3f 20 69 4f 66 66 2d 39 20 3a 20 30 29 3b  9 ? iOff-9 : 0);
a5f0: 0a 20 20 20 20 66 6f 72 28 69 4f 66 66 2d 2d 3b  .    for(iOff--;
a600: 20 69 4f 66 66 3e 69 4c 69 6d 69 74 3b 20 69 4f   iOff>iLimit; iO
a610: 66 66 2d 2d 29 7b 0a 20 20 20 20 20 20 69 66 28  ff--){.      if(
a620: 20 28 61 5b 69 4f 66 66 2d 31 5d 20 26 20 30 78   (a[iOff-1] & 0x
a630: 38 30 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a  80)==0 ) break;.
a640: 20 20 20 20 7d 0a 0a 20 20 20 20 66 74 73 35 47      }..    fts5G
a650: 65 74 56 61 72 69 6e 74 28 26 61 5b 69 4f 66 66  etVarint(&a[iOff
a660: 5d 2c 20 28 75 36 34 2a 29 26 69 56 61 6c 29 3b  ], (u64*)&iVal);
a670: 0a 20 20 20 20 70 4c 76 6c 2d 3e 69 52 6f 77 69  .    pLvl->iRowi
a680: 64 20 2d 3d 20 69 56 61 6c 3b 0a 20 20 20 20 70  d -= iVal;.    p
a690: 4c 76 6c 2d 3e 69 4c 65 61 66 50 67 6e 6f 2d 2d  Lvl->iLeafPgno--
a6a0: 3b 0a 0a 20 20 20 20 2f 2a 20 53 6b 69 70 20 62  ;..    /* Skip b
a6b0: 61 63 6b 77 61 72 64 73 20 70 61 73 74 20 61 6e  ackwards past an
a6c0: 79 20 30 78 30 30 20 76 61 72 69 6e 74 73 2e 20  y 0x00 varints. 
a6d0: 2a 2f 0a 20 20 20 20 66 6f 72 28 69 69 3d 69 4f  */.    for(ii=iO
a6e0: 66 66 2d 31 3b 20 69 69 3e 3d 70 4c 76 6c 2d 3e  ff-1; ii>=pLvl->
a6f0: 69 46 69 72 73 74 4f 66 66 20 26 26 20 61 5b 69  iFirstOff && a[i
a700: 69 5d 3d 3d 30 78 30 30 3b 20 69 69 2d 2d 29 7b  i]==0x00; ii--){
a710: 0a 20 20 20 20 20 20 6e 5a 65 72 6f 2b 2b 3b 0a  .      nZero++;.
a720: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 69      }.    if( ii
a730: 3e 3d 70 4c 76 6c 2d 3e 69 46 69 72 73 74 4f 66  >=pLvl->iFirstOf
a740: 66 20 26 26 20 28 61 5b 69 69 5d 20 26 20 30 78  f && (a[ii] & 0x
a750: 38 30 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  80) ){.      /* 
a760: 54 68 65 20 62 79 74 65 20 69 6d 6d 65 64 69 61  The byte immedia
a770: 74 65 6c 79 20 62 65 66 6f 72 65 20 74 68 65 20  tely before the 
a780: 6c 61 73 74 20 30 78 30 30 20 62 79 74 65 20 68  last 0x00 byte h
a790: 61 73 20 74 68 65 20 30 78 38 30 20 62 69 74 0a  as the 0x80 bit.
a7a0: 20 20 20 20 20 20 2a 2a 20 73 65 74 2e 20 53 6f        ** set. So
a7b0: 20 74 68 65 20 6c 61 73 74 20 30 78 30 30 20 69   the last 0x00 i
a7c0: 73 20 6f 6e 6c 79 20 61 20 76 61 72 69 6e 74 20  s only a varint 
a7d0: 30 20 69 66 20 74 68 65 72 65 20 61 72 65 20 38  0 if there are 8
a7e0: 20 6d 6f 72 65 20 30 78 38 30 0a 20 20 20 20 20   more 0x80.     
a7f0: 20 2a 2a 20 62 79 74 65 73 20 62 65 66 6f 72 65   ** bytes before
a800: 20 61 5b 69 69 5d 2e 20 2a 2f 0a 20 20 20 20 20   a[ii]. */.     
a810: 20 69 6e 74 20 62 5a 65 72 6f 20 3d 20 30 3b 20   int bZero = 0; 
a820: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
a830: 54 72 75 65 20 69 66 20 6c 61 73 74 20 30 78 30  True if last 0x0
a840: 30 20 63 6f 75 6e 74 73 20 2a 2f 0a 20 20 20 20  0 counts */.    
a850: 20 20 69 66 28 20 28 69 69 2d 38 29 3e 3d 70 4c    if( (ii-8)>=pL
a860: 76 6c 2d 3e 69 46 69 72 73 74 4f 66 66 20 29 7b  vl->iFirstOff ){
a870: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a  .        int j;.
a880: 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 31 3b          for(j=1;
a890: 20 6a 3c 3d 38 20 26 26 20 28 61 5b 69 69 2d 6a   j<=8 && (a[ii-j
a8a0: 5d 20 26 20 30 78 38 30 29 3b 20 6a 2b 2b 29 3b  ] & 0x80); j++);
a8b0: 0a 20 20 20 20 20 20 20 20 62 5a 65 72 6f 20 3d  .        bZero =
a8c0: 20 28 6a 3e 38 29 3b 0a 20 20 20 20 20 20 7d 0a   (j>8);.      }.
a8d0: 20 20 20 20 20 20 69 66 28 20 62 5a 65 72 6f 3d        if( bZero=
a8e0: 3d 30 20 29 20 6e 5a 65 72 6f 2d 2d 3b 0a 20 20  =0 ) nZero--;.  
a8f0: 20 20 7d 0a 20 20 20 20 70 4c 76 6c 2d 3e 69 4c    }.    pLvl->iL
a900: 65 61 66 50 67 6e 6f 20 2d 3d 20 6e 5a 65 72 6f  eafPgno -= nZero
a910: 3b 0a 20 20 20 20 70 4c 76 6c 2d 3e 69 4f 66 66  ;.    pLvl->iOff
a920: 20 3d 20 69 4f 66 66 20 2d 20 6e 5a 65 72 6f 3b   = iOff - nZero;
a930: 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70  .  }..  return p
a940: 4c 76 6c 2d 3e 62 45 6f 66 3b 0a 7d 0a 0a 73 74  Lvl->bEof;.}..st
a950: 61 74 69 63 20 69 6e 74 20 66 74 73 35 44 6c 69  atic int fts5Dli
a960: 64 78 49 74 65 72 50 72 65 76 52 28 46 74 73 35  dxIterPrevR(Fts5
a970: 49 6e 64 65 78 20 2a 70 2c 20 46 74 73 35 44 6c  Index *p, Fts5Dl
a980: 69 64 78 49 74 65 72 20 2a 70 49 74 65 72 2c 20  idxIter *pIter, 
a990: 69 6e 74 20 69 4c 76 6c 29 7b 0a 20 20 46 74 73  int iLvl){.  Fts
a9a0: 35 44 6c 69 64 78 4c 76 6c 20 2a 70 4c 76 6c 20  5DlidxLvl *pLvl 
a9b0: 3d 20 26 70 49 74 65 72 2d 3e 61 4c 76 6c 5b 69  = &pIter->aLvl[i
a9c0: 4c 76 6c 5d 3b 0a 0a 20 20 61 73 73 65 72 74 28  Lvl];..  assert(
a9d0: 20 69 4c 76 6c 3c 70 49 74 65 72 2d 3e 6e 4c 76   iLvl<pIter->nLv
a9e0: 6c 20 29 3b 0a 20 20 69 66 28 20 66 74 73 35 44  l );.  if( fts5D
a9f0: 6c 69 64 78 4c 76 6c 50 72 65 76 28 70 4c 76 6c  lidxLvlPrev(pLvl
aa00: 29 20 29 7b 0a 20 20 20 20 69 66 28 20 28 69 4c  ) ){.    if( (iL
aa10: 76 6c 2b 31 29 20 3c 20 70 49 74 65 72 2d 3e 6e  vl+1) < pIter->n
aa20: 4c 76 6c 20 29 7b 0a 20 20 20 20 20 20 66 74 73  Lvl ){.      fts
aa30: 35 44 6c 69 64 78 49 74 65 72 50 72 65 76 52 28  5DlidxIterPrevR(
aa40: 70 2c 20 70 49 74 65 72 2c 20 69 4c 76 6c 2b 31  p, pIter, iLvl+1
aa50: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4c 76  );.      if( pLv
aa60: 6c 5b 31 5d 2e 62 45 6f 66 3d 3d 30 20 29 7b 0a  l[1].bEof==0 ){.
aa70: 20 20 20 20 20 20 20 20 66 74 73 35 44 61 74 61          fts5Data
aa80: 52 65 6c 65 61 73 65 28 70 4c 76 6c 2d 3e 70 44  Release(pLvl->pD
aa90: 61 74 61 29 3b 0a 20 20 20 20 20 20 20 20 6d 65  ata);.        me
aaa0: 6d 73 65 74 28 70 4c 76 6c 2c 20 30 2c 20 73 69  mset(pLvl, 0, si
aab0: 7a 65 6f 66 28 46 74 73 35 44 6c 69 64 78 4c 76  zeof(Fts5DlidxLv
aac0: 6c 29 29 3b 0a 20 20 20 20 20 20 20 20 70 4c 76  l));.        pLv
aad0: 6c 2d 3e 70 44 61 74 61 20 3d 20 66 74 73 35 44  l->pData = fts5D
aae0: 61 74 61 52 65 61 64 28 70 2c 20 0a 20 20 20 20  ataRead(p, .    
aaf0: 20 20 20 20 20 20 20 20 46 54 53 35 5f 44 4c 49          FTS5_DLI
ab00: 44 58 5f 52 4f 57 49 44 28 70 49 74 65 72 2d 3e  DX_ROWID(pIter->
ab10: 69 53 65 67 69 64 2c 20 69 4c 76 6c 2c 20 70 4c  iSegid, iLvl, pL
ab20: 76 6c 5b 31 5d 2e 69 4c 65 61 66 50 67 6e 6f 29  vl[1].iLeafPgno)
ab30: 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20  .        );.    
ab40: 20 20 20 20 69 66 28 20 70 4c 76 6c 2d 3e 70 44      if( pLvl->pD
ab50: 61 74 61 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ata ){.         
ab60: 20 77 68 69 6c 65 28 20 66 74 73 35 44 6c 69 64   while( fts5Dlid
ab70: 78 4c 76 6c 4e 65 78 74 28 70 4c 76 6c 29 3d 3d  xLvlNext(pLvl)==
ab80: 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70  0 );.          p
ab90: 4c 76 6c 2d 3e 62 45 6f 66 20 3d 20 30 3b 0a 20  Lvl->bEof = 0;. 
aba0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
abb0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65  .    }.  }..  re
abc0: 74 75 72 6e 20 70 49 74 65 72 2d 3e 61 4c 76 6c  turn pIter->aLvl
abd0: 5b 30 5d 2e 62 45 6f 66 3b 0a 7d 0a 73 74 61 74  [0].bEof;.}.stat
abe0: 69 63 20 69 6e 74 20 66 74 73 35 44 6c 69 64 78  ic int fts5Dlidx
abf0: 49 74 65 72 50 72 65 76 28 46 74 73 35 49 6e 64  IterPrev(Fts5Ind
ac00: 65 78 20 2a 70 2c 20 46 74 73 35 44 6c 69 64 78  ex *p, Fts5Dlidx
ac10: 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a 20 20  Iter *pIter){.  
ac20: 72 65 74 75 72 6e 20 66 74 73 35 44 6c 69 64 78  return fts5Dlidx
ac30: 49 74 65 72 50 72 65 76 52 28 70 2c 20 70 49 74  IterPrevR(p, pIt
ac40: 65 72 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  er, 0);.}../*.**
ac50: 20 46 72 65 65 20 61 20 64 6f 63 6c 69 73 74 2d   Free a doclist-
ac60: 69 6e 64 65 78 20 69 74 65 72 61 74 6f 72 20 6f  index iterator o
ac70: 62 6a 65 63 74 20 61 6c 6c 6f 63 61 74 65 64 20  bject allocated 
ac80: 62 79 20 66 74 73 35 44 6c 69 64 78 49 74 65 72  by fts5DlidxIter
ac90: 49 6e 69 74 28 29 2e 0a 2a 2f 0a 73 74 61 74 69  Init()..*/.stati
aca0: 63 20 76 6f 69 64 20 66 74 73 35 44 6c 69 64 78  c void fts5Dlidx
acb0: 49 74 65 72 46 72 65 65 28 46 74 73 35 44 6c 69  IterFree(Fts5Dli
acc0: 64 78 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a  dxIter *pIter){.
acd0: 20 20 69 66 28 20 70 49 74 65 72 20 29 7b 0a 20    if( pIter ){. 
ace0: 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f     int i;.    fo
acf0: 72 28 69 3d 30 3b 20 69 3c 70 49 74 65 72 2d 3e  r(i=0; i<pIter->
ad00: 6e 4c 76 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nLvl; i++){.    
ad10: 20 20 66 74 73 35 44 61 74 61 52 65 6c 65 61 73    fts5DataReleas
ad20: 65 28 70 49 74 65 72 2d 3e 61 4c 76 6c 5b 69 5d  e(pIter->aLvl[i]
ad30: 2e 70 44 61 74 61 29 3b 0a 20 20 20 20 7d 0a 20  .pData);.    }. 
ad40: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
ad50: 70 49 74 65 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 73  pIter);.  }.}..s
ad60: 74 61 74 69 63 20 46 74 73 35 44 6c 69 64 78 49  tatic Fts5DlidxI
ad70: 74 65 72 20 2a 66 74 73 35 44 6c 69 64 78 49 74  ter *fts5DlidxIt
ad80: 65 72 49 6e 69 74 28 0a 20 20 46 74 73 35 49 6e  erInit(.  Fts5In
ad90: 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20 20  dex *p,         
ada0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 74 73            /* Fts
adb0: 35 20 42 61 63 6b 65 6e 64 20 74 6f 20 69 74 65  5 Backend to ite
adc0: 72 61 74 65 20 77 69 74 68 69 6e 20 2a 2f 0a 20  rate within */. 
add0: 20 69 6e 74 20 62 52 65 76 2c 20 20 20 20 20 20   int bRev,      
ade0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
adf0: 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 4f 52 44   /* True for ORD
ae00: 45 52 20 42 59 20 41 53 43 20 2a 2f 0a 20 20 69  ER BY ASC */.  i
ae10: 6e 74 20 69 53 65 67 69 64 2c 20 20 20 20 20 20  nt iSegid,      
ae20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
ae30: 2a 20 53 65 67 6d 65 6e 74 20 69 64 20 2a 2f 0a  * Segment id */.
ae40: 20 20 69 6e 74 20 69 4c 65 61 66 50 67 20 20 20    int iLeafPg   
ae50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ae60: 20 20 2f 2a 20 4c 65 61 66 20 70 61 67 65 20 6e    /* Leaf page n
ae70: 75 6d 62 65 72 20 74 6f 20 6c 6f 61 64 20 64 6c  umber to load dl
ae80: 69 64 78 20 66 6f 72 20 2a 2f 0a 29 7b 0a 20 20  idx for */.){.  
ae90: 46 74 73 35 44 6c 69 64 78 49 74 65 72 20 2a 70  Fts5DlidxIter *p
aea0: 49 74 65 72 20 3d 20 30 3b 0a 20 20 69 6e 74 20  Iter = 0;.  int 
aeb0: 69 3b 0a 20 20 69 6e 74 20 62 44 6f 6e 65 20 3d  i;.  int bDone =
aec0: 20 30 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20   0;..  for(i=0; 
aed0: 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
aee0: 20 26 26 20 62 44 6f 6e 65 3d 3d 30 3b 20 69 2b   && bDone==0; i+
aef0: 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6e 42 79 74  +){.    int nByt
af00: 65 20 3d 20 73 69 7a 65 6f 66 28 46 74 73 35 44  e = sizeof(Fts5D
af10: 6c 69 64 78 49 74 65 72 29 20 2b 20 69 20 2a 20  lidxIter) + i * 
af20: 73 69 7a 65 6f 66 28 46 74 73 35 44 6c 69 64 78  sizeof(Fts5Dlidx
af30: 4c 76 6c 29 3b 0a 20 20 20 20 46 74 73 35 44 6c  Lvl);.    Fts5Dl
af40: 69 64 78 49 74 65 72 20 2a 70 4e 65 77 3b 0a 0a  idxIter *pNew;..
af50: 20 20 20 20 70 4e 65 77 20 3d 20 28 46 74 73 35      pNew = (Fts5
af60: 44 6c 69 64 78 49 74 65 72 2a 29 73 71 6c 69 74  DlidxIter*)sqlit
af70: 65 33 5f 72 65 61 6c 6c 6f 63 28 70 49 74 65 72  e3_realloc(pIter
af80: 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20 20 69 66  , nByte);.    if
af90: 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20  ( pNew==0 ){.   
afa0: 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54     p->rc = SQLIT
afb0: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 65 6c  E_NOMEM;.    }el
afc0: 73 65 7b 0a 20 20 20 20 20 20 69 36 34 20 69 52  se{.      i64 iR
afd0: 6f 77 69 64 20 3d 20 46 54 53 35 5f 44 4c 49 44  owid = FTS5_DLID
afe0: 58 5f 52 4f 57 49 44 28 69 53 65 67 69 64 2c 20  X_ROWID(iSegid, 
aff0: 69 2c 20 69 4c 65 61 66 50 67 29 3b 0a 20 20 20  i, iLeafPg);.   
b000: 20 20 20 46 74 73 35 44 6c 69 64 78 4c 76 6c 20     Fts5DlidxLvl 
b010: 2a 70 4c 76 6c 20 3d 20 26 70 4e 65 77 2d 3e 61  *pLvl = &pNew->a
b020: 4c 76 6c 5b 69 5d 3b 0a 20 20 20 20 20 20 70 49  Lvl[i];.      pI
b030: 74 65 72 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20  ter = pNew;.    
b040: 20 20 6d 65 6d 73 65 74 28 70 4c 76 6c 2c 20 30    memset(pLvl, 0
b050: 2c 20 73 69 7a 65 6f 66 28 46 74 73 35 44 6c 69  , sizeof(Fts5Dli
b060: 64 78 4c 76 6c 29 29 3b 0a 20 20 20 20 20 20 70  dxLvl));.      p
b070: 4c 76 6c 2d 3e 70 44 61 74 61 20 3d 20 66 74 73  Lvl->pData = fts
b080: 35 44 61 74 61 52 65 61 64 28 70 2c 20 69 52 6f  5DataRead(p, iRo
b090: 77 69 64 29 3b 0a 20 20 20 20 20 20 69 66 28 20  wid);.      if( 
b0a0: 70 4c 76 6c 2d 3e 70 44 61 74 61 20 26 26 20 28  pLvl->pData && (
b0b0: 70 4c 76 6c 2d 3e 70 44 61 74 61 2d 3e 70 5b 30  pLvl->pData->p[0
b0c0: 5d 20 26 20 30 78 30 30 30 31 29 3d 3d 30 20 29  ] & 0x0001)==0 )
b0d0: 7b 0a 20 20 20 20 20 20 20 20 62 44 6f 6e 65 20  {.        bDone 
b0e0: 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 1;.      }.   
b0f0: 20 20 20 70 49 74 65 72 2d 3e 6e 4c 76 6c 20 3d     pIter->nLvl =
b100: 20 69 2b 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   i+1;.    }.  }.
b110: 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51  .  if( p->rc==SQ
b120: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70  LITE_OK ){.    p
b130: 49 74 65 72 2d 3e 69 53 65 67 69 64 20 3d 20 69  Iter->iSegid = i
b140: 53 65 67 69 64 3b 0a 20 20 20 20 69 66 28 20 62  Segid;.    if( b
b150: 52 65 76 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Rev==0 ){.      
b160: 66 74 73 35 44 6c 69 64 78 49 74 65 72 46 69 72  fts5DlidxIterFir
b170: 73 74 28 70 49 74 65 72 29 3b 0a 20 20 20 20 7d  st(pIter);.    }
b180: 65 6c 73 65 7b 0a 20 20 20 20 20 20 66 74 73 35  else{.      fts5
b190: 44 6c 69 64 78 49 74 65 72 4c 61 73 74 28 70 2c  DlidxIterLast(p,
b1a0: 20 70 49 74 65 72 29 3b 0a 20 20 20 20 7d 0a 20   pIter);.    }. 
b1b0: 20 7d 0a 0a 20 20 69 66 28 20 70 2d 3e 72 63 21   }..  if( p->rc!
b1c0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
b1d0: 20 20 66 74 73 35 44 6c 69 64 78 49 74 65 72 46    fts5DlidxIterF
b1e0: 72 65 65 28 70 49 74 65 72 29 3b 0a 20 20 20 20  ree(pIter);.    
b1f0: 70 49 74 65 72 20 3d 20 30 3b 0a 20 20 7d 0a 0a  pIter = 0;.  }..
b200: 20 20 72 65 74 75 72 6e 20 70 49 74 65 72 3b 0a    return pIter;.
b210: 7d 0a 0a 73 74 61 74 69 63 20 69 36 34 20 66 74  }..static i64 ft
b220: 73 35 44 6c 69 64 78 49 74 65 72 52 6f 77 69 64  s5DlidxIterRowid
b230: 28 46 74 73 35 44 6c 69 64 78 49 74 65 72 20 2a  (Fts5DlidxIter *
b240: 70 49 74 65 72 29 7b 0a 20 20 72 65 74 75 72 6e  pIter){.  return
b250: 20 70 49 74 65 72 2d 3e 61 4c 76 6c 5b 30 5d 2e   pIter->aLvl[0].
b260: 69 52 6f 77 69 64 3b 0a 7d 0a 73 74 61 74 69 63  iRowid;.}.static
b270: 20 69 6e 74 20 66 74 73 35 44 6c 69 64 78 49 74   int fts5DlidxIt
b280: 65 72 50 67 6e 6f 28 46 74 73 35 44 6c 69 64 78  erPgno(Fts5Dlidx
b290: 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a 20 20  Iter *pIter){.  
b2a0: 72 65 74 75 72 6e 20 70 49 74 65 72 2d 3e 61 4c  return pIter->aL
b2b0: 76 6c 5b 30 5d 2e 69 4c 65 61 66 50 67 6e 6f 3b  vl[0].iLeafPgno;
b2c0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 61 64 20 74  .}../*.** Load t
b2d0: 68 65 20 6e 65 78 74 20 6c 65 61 66 20 70 61 67  he next leaf pag
b2e0: 65 20 69 6e 74 6f 20 74 68 65 20 73 65 67 6d 65  e into the segme
b2f0: 6e 74 20 69 74 65 72 61 74 6f 72 2e 0a 2a 2f 0a  nt iterator..*/.
b300: 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
b310: 53 65 67 49 74 65 72 4e 65 78 74 50 61 67 65 28  SegIterNextPage(
b320: 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c  .  Fts5Index *p,
b330: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b340: 20 20 20 2f 2a 20 46 54 53 35 20 62 61 63 6b 65     /* FTS5 backe
b350: 6e 64 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 46  nd object */.  F
b360: 74 73 35 53 65 67 49 74 65 72 20 2a 70 49 74 65  ts5SegIter *pIte
b370: 72 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  r              /
b380: 2a 20 49 74 65 72 61 74 6f 72 20 74 6f 20 61 64  * Iterator to ad
b390: 76 61 6e 63 65 20 74 6f 20 6e 65 78 74 20 70 61  vance to next pa
b3a0: 67 65 20 2a 2f 0a 29 7b 0a 20 20 46 74 73 35 44  ge */.){.  Fts5D
b3b0: 61 74 61 20 2a 70 4c 65 61 66 3b 0a 20 20 46 74  ata *pLeaf;.  Ft
b3c0: 73 35 53 74 72 75 63 74 75 72 65 53 65 67 6d 65  s5StructureSegme
b3d0: 6e 74 20 2a 70 53 65 67 20 3d 20 70 49 74 65 72  nt *pSeg = pIter
b3e0: 2d 3e 70 53 65 67 3b 0a 20 20 66 74 73 35 44 61  ->pSeg;.  fts5Da
b3f0: 74 61 52 65 6c 65 61 73 65 28 70 49 74 65 72 2d  taRelease(pIter-
b400: 3e 70 4c 65 61 66 29 3b 0a 20 20 70 49 74 65 72  >pLeaf);.  pIter
b410: 2d 3e 69 4c 65 61 66 50 67 6e 6f 2b 2b 3b 0a 20  ->iLeafPgno++;. 
b420: 20 69 66 28 20 70 49 74 65 72 2d 3e 70 4e 65 78   if( pIter->pNex
b430: 74 4c 65 61 66 20 29 7b 0a 20 20 20 20 61 73 73  tLeaf ){.    ass
b440: 65 72 74 28 20 70 49 74 65 72 2d 3e 69 4c 65 61  ert( pIter->iLea
b450: 66 50 67 6e 6f 3c 3d 70 53 65 67 2d 3e 70 67 6e  fPgno<=pSeg->pgn
b460: 6f 4c 61 73 74 20 29 3b 0a 20 20 20 20 70 49 74  oLast );.    pIt
b470: 65 72 2d 3e 70 4c 65 61 66 20 3d 20 70 49 74 65  er->pLeaf = pIte
b480: 72 2d 3e 70 4e 65 78 74 4c 65 61 66 3b 0a 20 20  r->pNextLeaf;.  
b490: 20 20 70 49 74 65 72 2d 3e 70 4e 65 78 74 4c 65    pIter->pNextLe
b4a0: 61 66 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 20  af = 0;.  }else 
b4b0: 69 66 28 20 70 49 74 65 72 2d 3e 69 4c 65 61 66  if( pIter->iLeaf
b4c0: 50 67 6e 6f 3c 3d 70 53 65 67 2d 3e 70 67 6e 6f  Pgno<=pSeg->pgno
b4d0: 4c 61 73 74 20 29 7b 0a 20 20 20 20 70 49 74 65  Last ){.    pIte
b4e0: 72 2d 3e 70 4c 65 61 66 20 3d 20 66 74 73 35 44  r->pLeaf = fts5D
b4f0: 61 74 61 52 65 61 64 28 70 2c 20 0a 20 20 20 20  ataRead(p, .    
b500: 20 20 20 20 46 54 53 35 5f 53 45 47 4d 45 4e 54      FTS5_SEGMENT
b510: 5f 52 4f 57 49 44 28 70 53 65 67 2d 3e 69 53 65  _ROWID(pSeg->iSe
b520: 67 69 64 2c 20 70 49 74 65 72 2d 3e 69 4c 65 61  gid, pIter->iLea
b530: 66 50 67 6e 6f 29 0a 20 20 20 20 29 3b 0a 20 20  fPgno).    );.  
b540: 7d 65 6c 73 65 7b 0a 20 20 20 20 70 49 74 65 72  }else{.    pIter
b550: 2d 3e 70 4c 65 61 66 20 3d 20 30 3b 0a 20 20 7d  ->pLeaf = 0;.  }
b560: 0a 20 20 70 4c 65 61 66 20 3d 20 70 49 74 65 72  .  pLeaf = pIter
b570: 2d 3e 70 4c 65 61 66 3b 0a 0a 20 20 69 66 28 20  ->pLeaf;..  if( 
b580: 70 4c 65 61 66 20 29 7b 0a 20 20 20 20 70 49 74  pLeaf ){.    pIt
b590: 65 72 2d 3e 69 50 67 69 64 78 4f 66 66 20 3d 20  er->iPgidxOff = 
b5a0: 70 4c 65 61 66 2d 3e 73 7a 4c 65 61 66 3b 0a 20  pLeaf->szLeaf;. 
b5b0: 20 20 20 69 66 28 20 66 74 73 35 4c 65 61 66 49     if( fts5LeafI
b5c0: 73 54 65 72 6d 6c 65 73 73 28 70 4c 65 61 66 29  sTermless(pLeaf)
b5d0: 20 29 7b 0a 20 20 20 20 20 20 70 49 74 65 72 2d   ){.      pIter-
b5e0: 3e 69 45 6e 64 6f 66 44 6f 63 6c 69 73 74 20 3d  >iEndofDoclist =
b5f0: 20 70 4c 65 61 66 2d 3e 6e 6e 2b 31 3b 0a 20 20   pLeaf->nn+1;.  
b600: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
b610: 49 74 65 72 2d 3e 69 50 67 69 64 78 4f 66 66 20  Iter->iPgidxOff 
b620: 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e 74  += fts5GetVarint
b630: 33 32 28 26 70 4c 65 61 66 2d 3e 70 5b 70 49 74  32(&pLeaf->p[pIt
b640: 65 72 2d 3e 69 50 67 69 64 78 4f 66 66 5d 2c 0a  er->iPgidxOff],.
b650: 20 20 20 20 20 20 20 20 20 20 70 49 74 65 72 2d            pIter-
b660: 3e 69 45 6e 64 6f 66 44 6f 63 6c 69 73 74 0a 20  >iEndofDoclist. 
b670: 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 20 20       );.    }.  
b680: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 72 67 75 6d  }.}../*.** Argum
b690: 65 6e 74 20 70 20 70 6f 69 6e 74 73 20 74 6f 20  ent p points to 
b6a0: 61 20 62 75 66 66 65 72 20 63 6f 6e 74 61 69 6e  a buffer contain
b6b0: 69 6e 67 20 61 20 76 61 72 69 6e 74 20 74 6f 20  ing a varint to 
b6c0: 62 65 20 69 6e 74 65 72 70 72 65 74 65 64 20 61  be interpreted a
b6d0: 73 20 61 0a 2a 2a 20 70 6f 73 69 74 69 6f 6e 20  s a.** position 
b6e0: 6c 69 73 74 20 73 69 7a 65 20 66 69 65 6c 64 2e  list size field.
b6f0: 20 52 65 61 64 20 74 68 65 20 76 61 72 69 6e 74   Read the varint
b700: 20 61 6e 64 20 72 65 74 75 72 6e 20 74 68 65 20   and return the 
b710: 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 0a  number of bytes.
b720: 2a 2a 20 72 65 61 64 2e 20 42 65 66 6f 72 65 20  ** read. Before 
b730: 72 65 74 75 72 6e 69 6e 67 2c 20 73 65 74 20 2a  returning, set *
b740: 70 6e 53 7a 20 74 6f 20 74 68 65 20 6e 75 6d 62  pnSz to the numb
b750: 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20 74  er of bytes in t
b760: 68 65 20 70 6f 73 69 74 69 6f 6e 0a 2a 2a 20 6c  he position.** l
b770: 69 73 74 2c 20 61 6e 64 20 2a 70 62 44 65 6c 20  ist, and *pbDel 
b780: 74 6f 20 74 72 75 65 20 69 66 20 74 68 65 20 64  to true if the d
b790: 65 6c 65 74 65 20 66 6c 61 67 20 69 73 20 73 65  elete flag is se
b7a0: 74 2c 20 6f 72 20 66 61 6c 73 65 20 6f 74 68 65  t, or false othe
b7b0: 72 77 69 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  rwise..*/.static
b7c0: 20 69 6e 74 20 66 74 73 35 47 65 74 50 6f 73 6c   int fts5GetPosl
b7d0: 69 73 74 53 69 7a 65 28 63 6f 6e 73 74 20 75 38  istSize(const u8
b7e0: 20 2a 70 2c 20 69 6e 74 20 2a 70 6e 53 7a 2c 20   *p, int *pnSz, 
b7f0: 69 6e 74 20 2a 70 62 44 65 6c 29 7b 0a 20 20 69  int *pbDel){.  i
b800: 6e 74 20 6e 53 7a 3b 0a 20 20 69 6e 74 20 6e 20  nt nSz;.  int n 
b810: 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e 74 33  = fts5GetVarint3
b820: 32 28 70 2c 20 6e 53 7a 29 3b 0a 20 20 61 73 73  2(p, nSz);.  ass
b830: 65 72 74 5f 6e 63 28 20 6e 53 7a 3e 3d 30 20 29  ert_nc( nSz>=0 )
b840: 3b 0a 20 20 2a 70 6e 53 7a 20 3d 20 6e 53 7a 2f  ;.  *pnSz = nSz/
b850: 32 3b 0a 20 20 2a 70 62 44 65 6c 20 3d 20 6e 53  2;.  *pbDel = nS
b860: 7a 20 26 20 30 78 30 30 30 31 3b 0a 20 20 72 65  z & 0x0001;.  re
b870: 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn n;.}../*.**
b880: 20 46 74 73 35 53 65 67 49 74 65 72 2e 69 4c 65   Fts5SegIter.iLe
b890: 61 66 4f 66 66 73 65 74 20 63 75 72 72 65 6e 74  afOffset current
b8a0: 6c 79 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65  ly points to the
b8b0: 20 66 69 72 73 74 20 62 79 74 65 20 6f 66 20 61   first byte of a
b8c0: 0a 2a 2a 20 70 6f 73 69 74 69 6f 6e 2d 6c 69 73  .** position-lis
b8d0: 74 20 73 69 7a 65 20 66 69 65 6c 64 2e 20 52 65  t size field. Re
b8e0: 61 64 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  ad the value of 
b8f0: 74 68 65 20 66 69 65 6c 64 20 61 6e 64 20 73 74  the field and st
b900: 6f 72 65 20 69 74 0a 2a 2a 20 69 6e 20 74 68 65  ore it.** in the
b910: 20 66 6f 6c 6c 6f 77 69 6e 67 20 76 61 72 69 61   following varia
b920: 62 6c 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 46 74  bles:.**.**   Ft
b930: 73 35 53 65 67 49 74 65 72 2e 6e 50 6f 73 0a 2a  s5SegIter.nPos.*
b940: 2a 20 20 20 46 74 73 35 53 65 67 49 74 65 72 2e  *   Fts5SegIter.
b950: 62 44 65 6c 0a 2a 2a 0a 2a 2a 20 4c 65 61 76 65  bDel.**.** Leave
b960: 20 46 74 73 35 53 65 67 49 74 65 72 2e 69 4c 65   Fts5SegIter.iLe
b970: 61 66 4f 66 66 73 65 74 20 70 6f 69 6e 74 69 6e  afOffset pointin
b980: 67 20 74 6f 20 74 68 65 20 66 69 72 73 74 20 62  g to the first b
b990: 79 74 65 20 6f 66 20 74 68 65 20 0a 2a 2a 20 70  yte of the .** p
b9a0: 6f 73 69 74 69 6f 6e 20 6c 69 73 74 20 63 6f 6e  osition list con
b9b0: 74 65 6e 74 20 28 69 66 20 61 6e 79 29 2e 0a 2a  tent (if any)..*
b9c0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  /.static void ft
b9d0: 73 35 53 65 67 49 74 65 72 4c 6f 61 64 4e 50 6f  s5SegIterLoadNPo
b9e0: 73 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20  s(Fts5Index *p, 
b9f0: 46 74 73 35 53 65 67 49 74 65 72 20 2a 70 49 74  Fts5SegIter *pIt
ba00: 65 72 29 7b 0a 20 20 69 66 28 20 70 2d 3e 72 63  er){.  if( p->rc
ba10: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
ba20: 20 20 20 69 6e 74 20 69 4f 66 66 20 3d 20 70 49     int iOff = pI
ba30: 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74  ter->iLeafOffset
ba40: 3b 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20  ;  /* Offset to 
ba50: 72 65 61 64 20 61 74 20 2a 2f 0a 20 20 20 20 41  read at */.    A
ba60: 53 53 45 52 54 5f 53 5a 4c 45 41 46 5f 4f 4b 28  SSERT_SZLEAF_OK(
ba70: 70 49 74 65 72 2d 3e 70 4c 65 61 66 29 3b 0a 20  pIter->pLeaf);. 
ba80: 20 20 20 69 66 28 20 69 4f 66 66 3e 3d 70 49 74     if( iOff>=pIt
ba90: 65 72 2d 3e 70 4c 65 61 66 2d 3e 73 7a 4c 65 61  er->pLeaf->szLea
baa0: 66 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 72 63  f ){.      p->rc
bab0: 20 3d 20 46 54 53 35 5f 43 4f 52 52 55 50 54 3b   = FTS5_CORRUPT;
bac0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
bad0: 20 20 63 6f 6e 73 74 20 75 38 20 2a 61 20 3d 20    const u8 *a = 
bae0: 26 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 70  &pIter->pLeaf->p
baf0: 5b 69 4f 66 66 5d 3b 0a 20 20 20 20 20 20 70 49  [iOff];.      pI
bb00: 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74  ter->iLeafOffset
bb10: 20 2b 3d 20 66 74 73 35 47 65 74 50 6f 73 6c 69   += fts5GetPosli
bb20: 73 74 53 69 7a 65 28 61 2c 20 26 70 49 74 65 72  stSize(a, &pIter
bb30: 2d 3e 6e 50 6f 73 2c 20 26 70 49 74 65 72 2d 3e  ->nPos, &pIter->
bb40: 62 44 65 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  bDel);.    }.  }
bb50: 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .}..static void 
bb60: 66 74 73 35 53 65 67 49 74 65 72 4c 6f 61 64 52  fts5SegIterLoadR
bb70: 6f 77 69 64 28 46 74 73 35 49 6e 64 65 78 20 2a  owid(Fts5Index *
bb80: 70 2c 20 46 74 73 35 53 65 67 49 74 65 72 20 2a  p, Fts5SegIter *
bb90: 70 49 74 65 72 29 7b 0a 20 20 75 38 20 2a 61 20  pIter){.  u8 *a 
bba0: 3d 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e  = pIter->pLeaf->
bbb0: 70 3b 20 20 20 20 20 20 20 20 2f 2a 20 42 75 66  p;        /* Buf
bbc0: 66 65 72 20 74 6f 20 72 65 61 64 20 64 61 74 61  fer to read data
bbd0: 20 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20 69   from */.  int i
bbe0: 4f 66 66 20 3d 20 70 49 74 65 72 2d 3e 69 4c 65  Off = pIter->iLe
bbf0: 61 66 4f 66 66 73 65 74 3b 0a 0a 20 20 41 53 53  afOffset;..  ASS
bc00: 45 52 54 5f 53 5a 4c 45 41 46 5f 4f 4b 28 70 49  ERT_SZLEAF_OK(pI
bc10: 74 65 72 2d 3e 70 4c 65 61 66 29 3b 0a 20 20 69  ter->pLeaf);.  i
bc20: 66 28 20 69 4f 66 66 3e 3d 70 49 74 65 72 2d 3e  f( iOff>=pIter->
bc30: 70 4c 65 61 66 2d 3e 73 7a 4c 65 61 66 20 29 7b  pLeaf->szLeaf ){
bc40: 0a 20 20 20 20 66 74 73 35 53 65 67 49 74 65 72  .    fts5SegIter
bc50: 4e 65 78 74 50 61 67 65 28 70 2c 20 70 49 74 65  NextPage(p, pIte
bc60: 72 29 3b 0a 20 20 20 20 69 66 28 20 70 49 74 65  r);.    if( pIte
bc70: 72 2d 3e 70 4c 65 61 66 3d 3d 30 20 29 7b 0a 20  r->pLeaf==0 ){. 
bc80: 20 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d       if( p->rc==
bc90: 53 51 4c 49 54 45 5f 4f 4b 20 29 20 70 2d 3e 72  SQLITE_OK ) p->r
bca0: 63 20 3d 20 46 54 53 35 5f 43 4f 52 52 55 50 54  c = FTS5_CORRUPT
bcb0: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a  ;.      return;.
bcc0: 20 20 20 20 7d 0a 20 20 20 20 69 4f 66 66 20 3d      }.    iOff =
bcd0: 20 34 3b 0a 20 20 20 20 61 20 3d 20 70 49 74 65   4;.    a = pIte
bce0: 72 2d 3e 70 4c 65 61 66 2d 3e 70 3b 0a 20 20 7d  r->pLeaf->p;.  }
bcf0: 0a 20 20 69 4f 66 66 20 2b 3d 20 73 71 6c 69 74  .  iOff += sqlit
bd00: 65 33 46 74 73 35 47 65 74 56 61 72 69 6e 74 28  e3Fts5GetVarint(
bd10: 26 61 5b 69 4f 66 66 5d 2c 20 28 75 36 34 2a 29  &a[iOff], (u64*)
bd20: 26 70 49 74 65 72 2d 3e 69 52 6f 77 69 64 29 3b  &pIter->iRowid);
bd30: 0a 20 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f  .  pIter->iLeafO
bd40: 66 66 73 65 74 20 3d 20 69 4f 66 66 3b 0a 7d 0a  ffset = iOff;.}.
bd50: 0a 2f 2a 0a 2a 2a 20 46 74 73 35 53 65 67 49 74  ./*.** Fts5SegIt
bd60: 65 72 2e 69 4c 65 61 66 4f 66 66 73 65 74 20 63  er.iLeafOffset c
bd70: 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 73 20  urrently points 
bd80: 74 6f 20 74 68 65 20 66 69 72 73 74 20 62 79 74  to the first byt
bd90: 65 20 6f 66 20 74 68 65 20 0a 2a 2a 20 22 6e 53  e of the .** "nS
bda0: 75 66 66 69 78 22 20 66 69 65 6c 64 20 6f 66 20  uffix" field of 
bdb0: 61 20 74 65 72 6d 2e 20 46 75 6e 63 74 69 6f 6e  a term. Function
bdc0: 20 70 61 72 61 6d 65 74 65 72 20 6e 4b 65 65 70   parameter nKeep
bdd0: 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 76 61   contains the va
bde0: 6c 75 65 0a 2a 2a 20 6f 66 20 74 68 65 20 22 6e  lue.** of the "n
bdf0: 50 72 65 66 69 78 22 20 66 69 65 6c 64 20 28 69  Prefix" field (i
be00: 66 20 74 68 65 72 65 20 77 61 73 20 6f 6e 65 20  f there was one 
be10: 2d 20 69 74 20 69 73 20 70 61 73 73 65 64 20 30  - it is passed 0
be20: 20 69 66 20 74 68 69 73 20 69 73 0a 2a 2a 20 74   if this is.** t
be30: 68 65 20 66 69 72 73 74 20 74 65 72 6d 20 69 6e  he first term in
be40: 20 74 68 65 20 73 65 67 6d 65 6e 74 29 2e 0a 2a   the segment)..*
be50: 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
be60: 6f 6e 20 70 6f 70 75 6c 61 74 65 73 3a 0a 2a 2a  on populates:.**
be70: 0a 2a 2a 20 20 20 46 74 73 35 53 65 67 49 74 65  .**   Fts5SegIte
be80: 72 2e 74 65 72 6d 0a 2a 2a 20 20 20 46 74 73 35  r.term.**   Fts5
be90: 53 65 67 49 74 65 72 2e 72 6f 77 69 64 0a 2a 2a  SegIter.rowid.**
bea0: 0a 2a 2a 20 61 63 63 6f 72 64 69 6e 67 6c 79 20  .** accordingly 
beb0: 61 6e 64 20 6c 65 61 76 65 73 20 28 46 74 73 35  and leaves (Fts5
bec0: 53 65 67 49 74 65 72 2e 69 4c 65 61 66 4f 66 66  SegIter.iLeafOff
bed0: 73 65 74 29 20 73 65 74 20 74 6f 20 74 68 65 20  set) set to the 
bee0: 63 6f 6e 74 65 6e 74 20 6f 66 0a 2a 2a 20 74 68  content of.** th
bef0: 65 20 66 69 72 73 74 20 70 6f 73 69 74 69 6f 6e  e first position
bf00: 20 6c 69 73 74 2e 20 54 68 65 20 70 6f 73 69 74   list. The posit
bf10: 69 6f 6e 20 6c 69 73 74 20 62 65 6c 6f 6e 67 69  ion list belongi
bf20: 6e 67 20 74 6f 20 64 6f 63 75 6d 65 6e 74 20 0a  ng to document .
bf30: 2a 2a 20 28 46 74 73 35 53 65 67 49 74 65 72 2e  ** (Fts5SegIter.
bf40: 69 52 6f 77 69 64 29 2e 0a 2a 2f 0a 73 74 61 74  iRowid)..*/.stat
bf50: 69 63 20 76 6f 69 64 20 66 74 73 35 53 65 67 49  ic void fts5SegI
bf60: 74 65 72 4c 6f 61 64 54 65 72 6d 28 46 74 73 35  terLoadTerm(Fts5
bf70: 49 6e 64 65 78 20 2a 70 2c 20 46 74 73 35 53 65  Index *p, Fts5Se
bf80: 67 49 74 65 72 20 2a 70 49 74 65 72 2c 20 69 6e  gIter *pIter, in
bf90: 74 20 6e 4b 65 65 70 29 7b 0a 20 20 75 38 20 2a  t nKeep){.  u8 *
bfa0: 61 20 3d 20 70 49 74 65 72 2d 3e 70 4c 65 61 66  a = pIter->pLeaf
bfb0: 2d 3e 70 3b 20 20 20 20 20 20 20 20 2f 2a 20 42  ->p;        /* B
bfc0: 75 66 66 65 72 20 74 6f 20 72 65 61 64 20 64 61  uffer to read da
bfd0: 74 61 20 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74  ta from */.  int
bfe0: 20 69 4f 66 66 20 3d 20 70 49 74 65 72 2d 3e 69   iOff = pIter->i
bff0: 4c 65 61 66 4f 66 66 73 65 74 3b 20 20 2f 2a 20  LeafOffset;  /* 
c000: 4f 66 66 73 65 74 20 74 6f 20 72 65 61 64 20 61  Offset to read a
c010: 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 4e 65 77 3b  t */.  int nNew;
c020: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c030: 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20         /* Bytes 
c040: 6f 66 20 6e 65 77 20 64 61 74 61 20 2a 2f 0a 0a  of new data */..
c050: 20 20 69 4f 66 66 20 2b 3d 20 66 74 73 35 47 65    iOff += fts5Ge
c060: 74 56 61 72 69 6e 74 33 32 28 26 61 5b 69 4f 66  tVarint32(&a[iOf
c070: 66 5d 2c 20 6e 4e 65 77 29 3b 0a 20 20 70 49 74  f], nNew);.  pIt
c080: 65 72 2d 3e 74 65 72 6d 2e 6e 20 3d 20 6e 4b 65  er->term.n = nKe
c090: 65 70 3b 0a 20 20 66 74 73 35 42 75 66 66 65 72  ep;.  fts5Buffer
c0a0: 41 70 70 65 6e 64 42 6c 6f 62 28 26 70 2d 3e 72  AppendBlob(&p->r
c0b0: 63 2c 20 26 70 49 74 65 72 2d 3e 74 65 72 6d 2c  c, &pIter->term,
c0c0: 20 6e 4e 65 77 2c 20 26 61 5b 69 4f 66 66 5d 29   nNew, &a[iOff])
c0d0: 3b 0a 20 20 69 4f 66 66 20 2b 3d 20 6e 4e 65 77  ;.  iOff += nNew
c0e0: 3b 0a 20 20 70 49 74 65 72 2d 3e 69 54 65 72 6d  ;.  pIter->iTerm
c0f0: 4c 65 61 66 4f 66 66 73 65 74 20 3d 20 69 4f 66  LeafOffset = iOf
c100: 66 3b 0a 20 20 70 49 74 65 72 2d 3e 69 54 65 72  f;.  pIter->iTer
c110: 6d 4c 65 61 66 50 67 6e 6f 20 3d 20 70 49 74 65  mLeafPgno = pIte
c120: 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 3b 0a 20 20  r->iLeafPgno;.  
c130: 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73  pIter->iLeafOffs
c140: 65 74 20 3d 20 69 4f 66 66 3b 0a 0a 20 20 69 66  et = iOff;..  if
c150: 28 20 70 49 74 65 72 2d 3e 69 50 67 69 64 78 4f  ( pIter->iPgidxO
c160: 66 66 3e 3d 70 49 74 65 72 2d 3e 70 4c 65 61 66  ff>=pIter->pLeaf
c170: 2d 3e 6e 6e 20 29 7b 0a 20 20 20 20 70 49 74 65  ->nn ){.    pIte
c180: 72 2d 3e 69 45 6e 64 6f 66 44 6f 63 6c 69 73 74  r->iEndofDoclist
c190: 20 3d 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d   = pIter->pLeaf-
c1a0: 3e 6e 6e 2b 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a  >nn+1;.  }else{.
c1b0: 20 20 20 20 69 6e 74 20 6e 45 78 74 72 61 3b 0a      int nExtra;.
c1c0: 20 20 20 20 70 49 74 65 72 2d 3e 69 50 67 69 64      pIter->iPgid
c1d0: 78 4f 66 66 20 2b 3d 20 66 74 73 35 47 65 74 56  xOff += fts5GetV
c1e0: 61 72 69 6e 74 33 32 28 26 61 5b 70 49 74 65 72  arint32(&a[pIter
c1f0: 2d 3e 69 50 67 69 64 78 4f 66 66 5d 2c 20 6e 45  ->iPgidxOff], nE
c200: 78 74 72 61 29 3b 0a 20 20 20 20 70 49 74 65 72  xtra);.    pIter
c210: 2d 3e 69 45 6e 64 6f 66 44 6f 63 6c 69 73 74 20  ->iEndofDoclist 
c220: 2b 3d 20 6e 45 78 74 72 61 3b 0a 20 20 7d 0a 0a  += nExtra;.  }..
c230: 20 20 66 74 73 35 53 65 67 49 74 65 72 4c 6f 61    fts5SegIterLoa
c240: 64 52 6f 77 69 64 28 70 2c 20 70 49 74 65 72 29  dRowid(p, pIter)
c250: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69  ;.}../*.** Initi
c260: 61 6c 69 7a 65 20 74 68 65 20 69 74 65 72 61 74  alize the iterat
c270: 6f 72 20 6f 62 6a 65 63 74 20 70 49 74 65 72 20  or object pIter 
c280: 74 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f 75  to iterate throu
c290: 67 68 20 74 68 65 20 65 6e 74 72 69 65 73 20 69  gh the entries i
c2a0: 6e 0a 2a 2a 20 73 65 67 6d 65 6e 74 20 70 53 65  n.** segment pSe
c2b0: 67 2e 20 54 68 65 20 69 74 65 72 61 74 6f 72 20  g. The iterator 
c2c0: 69 73 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67  is left pointing
c2d0: 20 74 6f 20 74 68 65 20 66 69 72 73 74 20 65 6e   to the first en
c2e0: 74 72 79 20 77 68 65 6e 20 0a 2a 2a 20 74 68 69  try when .** thi
c2f0: 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  s function retur
c300: 6e 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  ns..**.** If an 
c310: 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 46 74  error occurs, Ft
c320: 73 35 49 6e 64 65 78 2e 72 63 20 69 73 20 73 65  s5Index.rc is se
c330: 74 20 74 6f 20 61 6e 20 61 70 70 72 6f 70 72 69  t to an appropri
c340: 61 74 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 20  ate error code. 
c350: 49 66 20 0a 2a 2a 20 61 6e 20 65 72 72 6f 72 20  If .** an error 
c360: 68 61 73 20 61 6c 72 65 61 64 79 20 6f 63 63 75  has already occu
c370: 72 72 65 64 20 77 68 65 6e 20 74 68 69 73 20 66  rred when this f
c380: 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
c390: 64 2c 20 69 74 20 69 73 20 61 20 6e 6f 2d 6f 70  d, it is a no-op
c3a0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
c3b0: 20 66 74 73 35 53 65 67 49 74 65 72 49 6e 69 74   fts5SegIterInit
c3c0: 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70  (.  Fts5Index *p
c3d0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
c3e0: 20 20 20 20 2f 2a 20 46 54 53 20 69 6e 64 65 78      /* FTS index
c3f0: 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 46 74 73   object */.  Fts
c400: 35 53 74 72 75 63 74 75 72 65 53 65 67 6d 65 6e  5StructureSegmen
c410: 74 20 2a 70 53 65 67 2c 20 20 20 20 20 2f 2a 20  t *pSeg,     /* 
c420: 44 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 73  Description of s
c430: 65 67 6d 65 6e 74 20 2a 2f 0a 20 20 46 74 73 35  egment */.  Fts5
c440: 53 65 67 49 74 65 72 20 2a 70 49 74 65 72 20 20  SegIter *pIter  
c450: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
c460: 62 6a 65 63 74 20 74 6f 20 70 6f 70 75 6c 61 74  bject to populat
c470: 65 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 70 53  e */.){.  if( pS
c480: 65 67 2d 3e 70 67 6e 6f 46 69 72 73 74 3d 3d 30  eg->pgnoFirst==0
c490: 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20   ){.    /* This 
c4a0: 68 61 70 70 65 6e 73 20 69 66 20 74 68 65 20 73  happens if the s
c4b0: 65 67 6d 65 6e 74 20 69 73 20 62 65 69 6e 67 20  egment is being 
c4c0: 75 73 65 64 20 61 73 20 61 6e 20 69 6e 70 75 74  used as an input
c4d0: 20 74 6f 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74   to an increment
c4e0: 61 6c 0a 20 20 20 20 2a 2a 20 6d 65 72 67 65 20  al.    ** merge 
c4f0: 61 6e 64 20 61 6c 6c 20 64 61 74 61 20 68 61 73  and all data has
c500: 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 22 74   already been "t
c510: 72 69 6d 6d 65 64 22 2e 20 53 65 65 20 66 75 6e  rimmed". See fun
c520: 63 74 69 6f 6e 0a 20 20 20 20 2a 2a 20 66 74 73  ction.    ** fts
c530: 35 54 72 69 6d 53 65 67 6d 65 6e 74 73 28 29 20  5TrimSegments() 
c540: 66 6f 72 20 64 65 74 61 69 6c 73 2e 20 49 6e 20  for details. In 
c550: 74 68 69 73 20 63 61 73 65 20 6c 65 61 76 65 20  this case leave 
c560: 74 68 65 20 69 74 65 72 61 74 6f 72 20 65 6d 70  the iterator emp
c570: 74 79 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20 63  ty..    ** The c
c580: 61 6c 6c 65 72 20 77 69 6c 6c 20 73 65 65 20 74  aller will see t
c590: 68 65 20 28 70 49 74 65 72 2d 3e 70 4c 65 61 66  he (pIter->pLeaf
c5a0: 3d 3d 30 29 20 61 6e 64 20 61 73 73 75 6d 65 20  ==0) and assume 
c5b0: 74 68 65 20 69 74 65 72 61 74 6f 72 20 69 73 0a  the iterator is.
c5c0: 20 20 20 20 2a 2a 20 61 74 20 45 4f 46 20 61 6c      ** at EOF al
c5d0: 72 65 61 64 79 2e 20 2a 2f 0a 20 20 20 20 61 73  ready. */.    as
c5e0: 73 65 72 74 28 20 70 49 74 65 72 2d 3e 70 4c 65  sert( pIter->pLe
c5f0: 61 66 3d 3d 30 20 29 3b 0a 20 20 20 20 72 65 74  af==0 );.    ret
c600: 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  urn;.  }..  if( 
c610: 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
c620: 20 29 7b 0a 20 20 20 20 6d 65 6d 73 65 74 28 70   ){.    memset(p
c630: 49 74 65 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28  Iter, 0, sizeof(
c640: 2a 70 49 74 65 72 29 29 3b 0a 20 20 20 20 70 49  *pIter));.    pI
c650: 74 65 72 2d 3e 70 53 65 67 20 3d 20 70 53 65 67  ter->pSeg = pSeg
c660: 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 69 4c 65  ;.    pIter->iLe
c670: 61 66 50 67 6e 6f 20 3d 20 70 53 65 67 2d 3e 70  afPgno = pSeg->p
c680: 67 6e 6f 46 69 72 73 74 2d 31 3b 0a 20 20 20 20  gnoFirst-1;.    
c690: 66 74 73 35 53 65 67 49 74 65 72 4e 65 78 74 50  fts5SegIterNextP
c6a0: 61 67 65 28 70 2c 20 70 49 74 65 72 29 3b 0a 20  age(p, pIter);. 
c6b0: 20 7d 0a 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d   }..  if( p->rc=
c6c0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
c6d0: 20 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66    pIter->iLeafOf
c6e0: 66 73 65 74 20 3d 20 34 3b 0a 20 20 20 20 61 73  fset = 4;.    as
c6f0: 73 65 72 74 5f 6e 63 28 20 70 49 74 65 72 2d 3e  sert_nc( pIter->
c700: 70 4c 65 61 66 2d 3e 6e 6e 3e 34 20 29 3b 0a 20  pLeaf->nn>4 );. 
c710: 20 20 20 61 73 73 65 72 74 28 20 66 74 73 35 4c     assert( fts5L
c720: 65 61 66 46 69 72 73 74 54 65 72 6d 4f 66 66 28  eafFirstTermOff(
c730: 70 49 74 65 72 2d 3e 70 4c 65 61 66 29 3d 3d 34  pIter->pLeaf)==4
c740: 20 29 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 69   );.    pIter->i
c750: 50 67 69 64 78 4f 66 66 20 3d 20 70 49 74 65 72  PgidxOff = pIter
c760: 2d 3e 70 4c 65 61 66 2d 3e 73 7a 4c 65 61 66 2b  ->pLeaf->szLeaf+
c770: 31 3b 0a 20 20 20 20 66 74 73 35 53 65 67 49 74  1;.    fts5SegIt
c780: 65 72 4c 6f 61 64 54 65 72 6d 28 70 2c 20 70 49  erLoadTerm(p, pI
c790: 74 65 72 2c 20 30 29 3b 0a 20 20 20 20 66 74 73  ter, 0);.    fts
c7a0: 35 53 65 67 49 74 65 72 4c 6f 61 64 4e 50 6f 73  5SegIterLoadNPos
c7b0: 28 70 2c 20 70 49 74 65 72 29 3b 0a 20 20 7d 0a  (p, pIter);.  }.
c7c0: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
c7d0: 6e 63 74 69 6f 6e 20 69 73 20 6f 6e 6c 79 20 65  nction is only e
c7e0: 76 65 72 20 63 61 6c 6c 65 64 20 6f 6e 20 69 74  ver called on it
c7f0: 65 72 61 74 6f 72 73 20 63 72 65 61 74 65 64 20  erators created 
c800: 62 79 20 63 61 6c 6c 73 20 74 6f 0a 2a 2a 20 46  by calls to.** F
c810: 74 73 35 49 6e 64 65 78 51 75 65 72 79 28 29 20  ts5IndexQuery() 
c820: 77 69 74 68 20 74 68 65 20 46 54 53 35 49 4e 44  with the FTS5IND
c830: 45 58 5f 51 55 45 52 59 5f 44 45 53 43 20 66 6c  EX_QUERY_DESC fl
c840: 61 67 20 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 54 68  ag set..**.** Th
c850: 65 20 69 74 65 72 61 74 6f 72 20 69 73 20 69 6e  e iterator is in
c860: 20 61 6e 20 75 6e 75 73 75 61 6c 20 73 74 61 74   an unusual stat
c870: 65 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63  e when this func
c880: 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 3a 20  tion is called: 
c890: 74 68 65 0a 2a 2a 20 46 74 73 35 53 65 67 49 74  the.** Fts5SegIt
c8a0: 65 72 2e 69 4c 65 61 66 4f 66 66 73 65 74 20 76  er.iLeafOffset v
c8b0: 61 72 69 61 62 6c 65 20 69 73 20 73 65 74 20 74  ariable is set t
c8c0: 6f 20 74 68 65 20 6f 66 66 73 65 74 20 6f 66 20  o the offset of 
c8d0: 74 68 65 20 73 74 61 72 74 20 6f 66 0a 2a 2a 20  the start of.** 
c8e0: 74 68 65 20 70 6f 73 69 74 69 6f 6e 2d 6c 69 73  the position-lis
c8f0: 74 20 73 69 7a 65 20 66 69 65 6c 64 20 66 6f 72  t size field for
c900: 20 74 68 65 20 66 69 72 73 74 20 72 65 6c 65 76   the first relev
c910: 61 6e 74 20 72 6f 77 69 64 20 6f 6e 20 74 68 65  ant rowid on the
c920: 20 70 61 67 65 2e 0a 2a 2a 20 46 74 73 35 53 65   page..** Fts5Se
c930: 67 49 74 65 72 2e 72 6f 77 69 64 20 69 73 20 73  gIter.rowid is s
c940: 65 74 2c 20 62 75 74 20 6e 50 6f 73 20 61 6e 64  et, but nPos and
c950: 20 62 44 65 6c 20 61 72 65 20 6e 6f 74 2e 0a 2a   bDel are not..*
c960: 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
c970: 6f 6e 20 61 64 76 61 6e 63 65 73 20 74 68 65 20  on advances the 
c980: 69 74 65 72 61 74 6f 72 20 73 6f 20 74 68 61 74  iterator so that
c990: 20 69 74 20 70 6f 69 6e 74 73 20 74 6f 20 74 68   it points to th
c9a0: 65 20 6c 61 73 74 20 0a 2a 2a 20 72 65 6c 65 76  e last .** relev
c9b0: 61 6e 74 20 72 6f 77 69 64 20 6f 6e 20 74 68 65  ant rowid on the
c9c0: 20 70 61 67 65 20 61 6e 64 2c 20 69 66 20 6e 65   page and, if ne
c9d0: 63 65 73 73 61 72 79 2c 20 69 6e 69 74 69 61 6c  cessary, initial
c9e0: 69 7a 65 73 20 74 68 65 20 0a 2a 2a 20 61 52 6f  izes the .** aRo
c9f0: 77 69 64 4f 66 66 73 65 74 5b 5d 20 61 6e 64 20  widOffset[] and 
ca00: 69 52 6f 77 69 64 4f 66 66 73 65 74 20 76 61 72  iRowidOffset var
ca10: 69 61 62 6c 65 73 2e 20 41 74 20 74 68 69 73 20  iables. At this 
ca20: 70 6f 69 6e 74 20 74 68 65 20 69 74 65 72 61 74  point the iterat
ca30: 6f 72 0a 2a 2a 20 69 73 20 69 6e 20 69 74 73 20  or.** is in its 
ca40: 72 65 67 75 6c 61 72 20 73 74 61 74 65 20 2d 20  regular state - 
ca50: 46 74 73 35 53 65 67 49 74 65 72 2e 69 4c 65 61  Fts5SegIter.iLea
ca60: 66 4f 66 66 73 65 74 20 70 6f 69 6e 74 73 20 74  fOffset points t
ca70: 6f 20 74 68 65 20 66 69 72 73 74 0a 2a 2a 20 62  o the first.** b
ca80: 79 74 65 20 6f 66 20 74 68 65 20 70 6f 73 69 74  yte of the posit
ca90: 69 6f 6e 20 6c 69 73 74 20 63 6f 6e 74 65 6e 74  ion list content
caa0: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
cab0: 20 73 61 69 64 20 72 6f 77 69 64 2e 0a 2a 2f 0a   said rowid..*/.
cac0: 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
cad0: 53 65 67 49 74 65 72 52 65 76 65 72 73 65 49 6e  SegIterReverseIn
cae0: 69 74 50 61 67 65 28 46 74 73 35 49 6e 64 65 78  itPage(Fts5Index
caf0: 20 2a 70 2c 20 46 74 73 35 53 65 67 49 74 65 72   *p, Fts5SegIter
cb00: 20 2a 70 49 74 65 72 29 7b 0a 20 20 69 6e 74 20   *pIter){.  int 
cb10: 6e 20 3d 20 70 49 74 65 72 2d 3e 70 4c 65 61 66  n = pIter->pLeaf
cb20: 2d 3e 73 7a 4c 65 61 66 3b 0a 20 20 69 6e 74 20  ->szLeaf;.  int 
cb30: 69 20 3d 20 70 49 74 65 72 2d 3e 69 4c 65 61 66  i = pIter->iLeaf
cb40: 4f 66 66 73 65 74 3b 0a 20 20 75 38 20 2a 61 20  Offset;.  u8 *a 
cb50: 3d 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e  = pIter->pLeaf->
cb60: 70 3b 0a 20 20 69 6e 74 20 69 52 6f 77 69 64 4f  p;.  int iRowidO
cb70: 66 66 73 65 74 20 3d 20 30 3b 0a 0a 20 20 69 66  ffset = 0;..  if
cb80: 28 20 6e 3e 70 49 74 65 72 2d 3e 69 45 6e 64 6f  ( n>pIter->iEndo
cb90: 66 44 6f 63 6c 69 73 74 20 29 7b 0a 20 20 20 20  fDoclist ){.    
cba0: 6e 20 3d 20 70 49 74 65 72 2d 3e 69 45 6e 64 6f  n = pIter->iEndo
cbb0: 66 44 6f 63 6c 69 73 74 3b 0a 20 20 7d 0a 0a 20  fDoclist;.  }.. 
cbc0: 20 41 53 53 45 52 54 5f 53 5a 4c 45 41 46 5f 4f   ASSERT_SZLEAF_O
cbd0: 4b 28 70 49 74 65 72 2d 3e 70 4c 65 61 66 29 3b  K(pIter->pLeaf);
cbe0: 0a 20 20 77 68 69 6c 65 28 20 31 20 29 7b 0a 20  .  while( 1 ){. 
cbf0: 20 20 20 69 36 34 20 69 44 65 6c 74 61 20 3d 20     i64 iDelta = 
cc00: 30 3b 0a 20 20 20 20 69 6e 74 20 6e 50 6f 73 3b  0;.    int nPos;
cc10: 0a 20 20 20 20 69 6e 74 20 62 44 75 6d 6d 79 3b  .    int bDummy;
cc20: 0a 0a 20 20 20 20 69 20 2b 3d 20 66 74 73 35 47  ..    i += fts5G
cc30: 65 74 50 6f 73 6c 69 73 74 53 69 7a 65 28 26 61  etPoslistSize(&a
cc40: 5b 69 5d 2c 20 26 6e 50 6f 73 2c 20 26 62 44 75  [i], &nPos, &bDu
cc50: 6d 6d 79 29 3b 0a 20 20 20 20 69 20 2b 3d 20 6e  mmy);.    i += n
cc60: 50 6f 73 3b 0a 20 20 20 20 69 66 28 20 69 3e 3d  Pos;.    if( i>=
cc70: 6e 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 69  n ) break;.    i
cc80: 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e   += fts5GetVarin
cc90: 74 28 26 61 5b 69 5d 2c 20 28 75 36 34 2a 29 26  t(&a[i], (u64*)&
cca0: 69 44 65 6c 74 61 29 3b 0a 20 20 20 20 70 49 74  iDelta);.    pIt
ccb0: 65 72 2d 3e 69 52 6f 77 69 64 20 2b 3d 20 69 44  er->iRowid += iD
ccc0: 65 6c 74 61 3b 0a 0a 20 20 20 20 69 66 28 20 69  elta;..    if( i
ccd0: 52 6f 77 69 64 4f 66 66 73 65 74 3e 3d 70 49 74  RowidOffset>=pIt
cce0: 65 72 2d 3e 6e 52 6f 77 69 64 4f 66 66 73 65 74  er->nRowidOffset
ccf0: 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 4e   ){.      int nN
cd00: 65 77 20 3d 20 70 49 74 65 72 2d 3e 6e 52 6f 77  ew = pIter->nRow
cd10: 69 64 4f 66 66 73 65 74 20 2b 20 38 3b 0a 20 20  idOffset + 8;.  
cd20: 20 20 20 20 69 6e 74 20 2a 61 4e 65 77 20 3d 20      int *aNew = 
cd30: 28 69 6e 74 2a 29 73 71 6c 69 74 65 33 5f 72 65  (int*)sqlite3_re
cd40: 61 6c 6c 6f 63 28 70 49 74 65 72 2d 3e 61 52 6f  alloc(pIter->aRo
cd50: 77 69 64 4f 66 66 73 65 74 2c 20 6e 4e 65 77 2a  widOffset, nNew*
cd60: 73 69 7a 65 6f 66 28 69 6e 74 29 29 3b 0a 20 20  sizeof(int));.  
cd70: 20 20 20 20 69 66 28 20 61 4e 65 77 3d 3d 30 20      if( aNew==0 
cd80: 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 72 63  ){.        p->rc
cd90: 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
cda0: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
cdb0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 49        }.      pI
cdc0: 74 65 72 2d 3e 61 52 6f 77 69 64 4f 66 66 73 65  ter->aRowidOffse
cdd0: 74 20 3d 20 61 4e 65 77 3b 0a 20 20 20 20 20 20  t = aNew;.      
cde0: 70 49 74 65 72 2d 3e 6e 52 6f 77 69 64 4f 66 66  pIter->nRowidOff
cdf0: 73 65 74 20 3d 20 6e 4e 65 77 3b 0a 20 20 20 20  set = nNew;.    
ce00: 7d 0a 0a 20 20 20 20 70 49 74 65 72 2d 3e 61 52  }..    pIter->aR
ce10: 6f 77 69 64 4f 66 66 73 65 74 5b 69 52 6f 77 69  owidOffset[iRowi
ce20: 64 4f 66 66 73 65 74 2b 2b 5d 20 3d 20 70 49 74  dOffset++] = pIt
ce30: 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 3b  er->iLeafOffset;
ce40: 0a 20 20 20 20 70 49 74 65 72 2d 3e 69 4c 65 61  .    pIter->iLea
ce50: 66 4f 66 66 73 65 74 20 3d 20 69 3b 0a 20 20 7d  fOffset = i;.  }
ce60: 0a 20 20 70 49 74 65 72 2d 3e 69 52 6f 77 69 64  .  pIter->iRowid
ce70: 4f 66 66 73 65 74 20 3d 20 69 52 6f 77 69 64 4f  Offset = iRowidO
ce80: 66 66 73 65 74 3b 0a 20 20 66 74 73 35 53 65 67  ffset;.  fts5Seg
ce90: 49 74 65 72 4c 6f 61 64 4e 50 6f 73 28 70 2c 20  IterLoadNPos(p, 
cea0: 70 49 74 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  pIter);.}../*.**
ceb0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
cec0: 66 74 73 35 53 65 67 49 74 65 72 52 65 76 65 72  fts5SegIterRever
ced0: 73 65 4e 65 77 50 61 67 65 28 46 74 73 35 49 6e  seNewPage(Fts5In
cee0: 64 65 78 20 2a 70 2c 20 46 74 73 35 53 65 67 49  dex *p, Fts5SegI
cef0: 74 65 72 20 2a 70 49 74 65 72 29 7b 0a 20 20 61  ter *pIter){.  a
cf00: 73 73 65 72 74 28 20 70 49 74 65 72 2d 3e 66 6c  ssert( pIter->fl
cf10: 61 67 73 20 26 20 46 54 53 35 5f 53 45 47 49 54  ags & FTS5_SEGIT
cf20: 45 52 5f 52 45 56 45 52 53 45 20 29 3b 0a 20 20  ER_REVERSE );.  
cf30: 61 73 73 65 72 74 28 20 70 49 74 65 72 2d 3e 66  assert( pIter->f
cf40: 6c 61 67 73 20 26 20 46 54 53 35 5f 53 45 47 49  lags & FTS5_SEGI
cf50: 54 45 52 5f 4f 4e 45 54 45 52 4d 20 29 3b 0a 0a  TER_ONETERM );..
cf60: 20 20 66 74 73 35 44 61 74 61 52 65 6c 65 61 73    fts5DataReleas
cf70: 65 28 70 49 74 65 72 2d 3e 70 4c 65 61 66 29 3b  e(pIter->pLeaf);
cf80: 0a 20 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 20  .  pIter->pLeaf 
cf90: 3d 20 30 3b 0a 20 20 77 68 69 6c 65 28 20 70 2d  = 0;.  while( p-
cfa0: 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26  >rc==SQLITE_OK &
cfb0: 26 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 50 67  & pIter->iLeafPg
cfc0: 6e 6f 3e 70 49 74 65 72 2d 3e 69 54 65 72 6d 4c  no>pIter->iTermL
cfd0: 65 61 66 50 67 6e 6f 20 29 7b 0a 20 20 20 20 46  eafPgno ){.    F
cfe0: 74 73 35 44 61 74 61 20 2a 70 4e 65 77 3b 0a 20  ts5Data *pNew;. 
cff0: 20 20 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 50     pIter->iLeafP
d000: 67 6e 6f 2d 2d 3b 0a 20 20 20 20 70 4e 65 77 20  gno--;.    pNew 
d010: 3d 20 66 74 73 35 44 61 74 61 52 65 61 64 28 70  = fts5DataRead(p
d020: 2c 20 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f 52  , FTS5_SEGMENT_R
d030: 4f 57 49 44 28 0a 20 20 20 20 20 20 20 20 20 20  OWID(.          
d040: 70 49 74 65 72 2d 3e 70 53 65 67 2d 3e 69 53 65  pIter->pSeg->iSe
d050: 67 69 64 2c 20 70 49 74 65 72 2d 3e 69 4c 65 61  gid, pIter->iLea
d060: 66 50 67 6e 6f 0a 20 20 20 20 29 29 3b 0a 20 20  fPgno.    ));.  
d070: 20 20 69 66 28 20 70 4e 65 77 20 29 7b 0a 20 20    if( pNew ){.  
d080: 20 20 20 20 69 66 28 20 70 49 74 65 72 2d 3e 69      if( pIter->i
d090: 4c 65 61 66 50 67 6e 6f 3d 3d 70 49 74 65 72 2d  LeafPgno==pIter-
d0a0: 3e 69 54 65 72 6d 4c 65 61 66 50 67 6e 6f 20 29  >iTermLeafPgno )
d0b0: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 49  {.        if( pI
d0c0: 74 65 72 2d 3e 69 54 65 72 6d 4c 65 61 66 4f 66  ter->iTermLeafOf
d0d0: 66 73 65 74 3c 70 4e 65 77 2d 3e 73 7a 4c 65 61  fset<pNew->szLea
d0e0: 66 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  f ){.          p
d0f0: 49 74 65 72 2d 3e 70 4c 65 61 66 20 3d 20 70 4e  Iter->pLeaf = pN
d100: 65 77 3b 0a 20 20 20 20 20 20 20 20 20 20 70 49  ew;.          pI
d110: 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74  ter->iLeafOffset
d120: 20 3d 20 70 49 74 65 72 2d 3e 69 54 65 72 6d 4c   = pIter->iTermL
d130: 65 61 66 4f 66 66 73 65 74 3b 0a 20 20 20 20 20  eafOffset;.     
d140: 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65     }.      }else
d150: 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 52  {.        int iR
d160: 6f 77 69 64 4f 66 66 3b 0a 20 20 20 20 20 20 20  owidOff;.       
d170: 20 69 52 6f 77 69 64 4f 66 66 20 3d 20 66 74 73   iRowidOff = fts
d180: 35 4c 65 61 66 46 69 72 73 74 52 6f 77 69 64 4f  5LeafFirstRowidO
d190: 66 66 28 70 4e 65 77 29 3b 0a 20 20 20 20 20 20  ff(pNew);.      
d1a0: 20 20 69 66 28 20 69 52 6f 77 69 64 4f 66 66 20    if( iRowidOff 
d1b0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 49 74  ){.          pIt
d1c0: 65 72 2d 3e 70 4c 65 61 66 20 3d 20 70 4e 65 77  er->pLeaf = pNew
d1d0: 3b 0a 20 20 20 20 20 20 20 20 20 20 70 49 74 65  ;.          pIte
d1e0: 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 20 3d  r->iLeafOffset =
d1f0: 20 69 52 6f 77 69 64 4f 66 66 3b 0a 20 20 20 20   iRowidOff;.    
d200: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20      }.      }.. 
d210: 20 20 20 20 20 69 66 28 20 70 49 74 65 72 2d 3e       if( pIter->
d220: 70 4c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 20  pLeaf ){.       
d230: 20 75 38 20 2a 61 20 3d 20 26 70 49 74 65 72 2d   u8 *a = &pIter-
d240: 3e 70 4c 65 61 66 2d 3e 70 5b 70 49 74 65 72 2d  >pLeaf->p[pIter-
d250: 3e 69 4c 65 61 66 4f 66 66 73 65 74 5d 3b 0a 20  >iLeafOffset];. 
d260: 20 20 20 20 20 20 20 70 49 74 65 72 2d 3e 69 4c         pIter->iL
d270: 65 61 66 4f 66 66 73 65 74 20 2b 3d 20 66 74 73  eafOffset += fts
d280: 35 47 65 74 56 61 72 69 6e 74 28 61 2c 20 28 75  5GetVarint(a, (u
d290: 36 34 2a 29 26 70 49 74 65 72 2d 3e 69 52 6f 77  64*)&pIter->iRow
d2a0: 69 64 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65  id);.        bre
d2b0: 61 6b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  ak;.      }else{
d2c0: 0a 20 20 20 20 20 20 20 20 66 74 73 35 44 61 74  .        fts5Dat
d2d0: 61 52 65 6c 65 61 73 65 28 70 4e 65 77 29 3b 0a  aRelease(pNew);.
d2e0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
d2f0: 7d 0a 0a 20 20 69 66 28 20 70 49 74 65 72 2d 3e  }..  if( pIter->
d300: 70 4c 65 61 66 20 29 7b 0a 20 20 20 20 70 49 74  pLeaf ){.    pIt
d310: 65 72 2d 3e 69 45 6e 64 6f 66 44 6f 63 6c 69 73  er->iEndofDoclis
d320: 74 20 3d 20 70 49 74 65 72 2d 3e 70 4c 65 61 66  t = pIter->pLeaf
d330: 2d 3e 6e 6e 2b 31 3b 0a 20 20 20 20 66 74 73 35  ->nn+1;.    fts5
d340: 53 65 67 49 74 65 72 52 65 76 65 72 73 65 49 6e  SegIterReverseIn
d350: 69 74 50 61 67 65 28 70 2c 20 70 49 74 65 72 29  itPage(p, pIter)
d360: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  ;.  }.}../*.** R
d370: 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 74 68  eturn true if th
d380: 65 20 69 74 65 72 61 74 6f 72 20 70 61 73 73 65  e iterator passe
d390: 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20  d as the second 
d3a0: 61 72 67 75 6d 65 6e 74 20 63 75 72 72 65 6e 74  argument current
d3b0: 6c 79 0a 2a 2a 20 70 6f 69 6e 74 73 20 74 6f 20  ly.** points to 
d3c0: 61 20 64 65 6c 65 74 65 20 6d 61 72 6b 65 72 2e  a delete marker.
d3d0: 20 41 20 64 65 6c 65 74 65 20 6d 61 72 6b 65 72   A delete marker
d3e0: 20 69 73 20 61 6e 20 65 6e 74 72 79 20 77 69 74   is an entry wit
d3f0: 68 20 61 20 30 20 62 79 74 65 0a 2a 2a 20 70 6f  h a 0 byte.** po
d400: 73 69 74 69 6f 6e 2d 6c 69 73 74 2e 0a 2a 2f 0a  sition-list..*/.
d410: 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 35 4d  static int fts5M
d420: 75 6c 74 69 49 74 65 72 49 73 45 6d 70 74 79 28  ultiIterIsEmpty(
d430: 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 46 74  Fts5Index *p, Ft
d440: 73 35 49 6e 64 65 78 49 74 65 72 20 2a 70 49 74  s5IndexIter *pIt
d450: 65 72 29 7b 0a 20 20 46 74 73 35 53 65 67 49 74  er){.  Fts5SegIt
d460: 65 72 20 2a 70 53 65 67 20 3d 20 26 70 49 74 65  er *pSeg = &pIte
d470: 72 2d 3e 61 53 65 67 5b 70 49 74 65 72 2d 3e 61  r->aSeg[pIter->a
d480: 46 69 72 73 74 5b 31 5d 2e 69 46 69 72 73 74 5d  First[1].iFirst]
d490: 3b 0a 20 20 72 65 74 75 72 6e 20 28 70 2d 3e 72  ;.  return (p->r
d4a0: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
d4b0: 70 53 65 67 2d 3e 70 4c 65 61 66 20 26 26 20 70  pSeg->pLeaf && p
d4c0: 53 65 67 2d 3e 6e 50 6f 73 3d 3d 30 29 3b 0a 7d  Seg->nPos==0);.}
d4d0: 0a 0a 2f 2a 0a 2a 2a 20 41 64 76 61 6e 63 65 20  ../*.** Advance 
d4e0: 69 74 65 72 61 74 6f 72 20 70 49 74 65 72 20 74  iterator pIter t
d4f0: 6f 20 74 68 65 20 6e 65 78 74 20 65 6e 74 72 79  o the next entry
d500: 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65  . .**.** If an e
d510: 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 46 74 73  rror occurs, Fts
d520: 35 49 6e 64 65 78 2e 72 63 20 69 73 20 73 65 74  5Index.rc is set
d530: 20 74 6f 20 61 6e 20 61 70 70 72 6f 70 72 69 61   to an appropria
d540: 74 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 49  te error code. I
d550: 74 20 0a 2a 2a 20 69 73 20 6e 6f 74 20 63 6f 6e  t .** is not con
d560: 73 69 64 65 72 65 64 20 61 6e 20 65 72 72 6f 72  sidered an error
d570: 20 69 66 20 74 68 65 20 69 74 65 72 61 74 6f 72   if the iterator
d580: 20 72 65 61 63 68 65 73 20 45 4f 46 2e 20 49 66   reaches EOF. If
d590: 20 61 6e 20 65 72 72 6f 72 20 68 61 73 20 0a 2a   an error has .*
d5a0: 2a 20 61 6c 72 65 61 64 79 20 6f 63 63 75 72 72  * already occurr
d5b0: 65 64 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e  ed when this fun
d5c0: 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c  ction is called,
d5d0: 20 69 74 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a   it is a no-op..
d5e0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
d5f0: 74 73 35 53 65 67 49 74 65 72 4e 65 78 74 28 0a  ts5SegIterNext(.
d600: 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20    Fts5Index *p, 
d610: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d620: 20 20 2f 2a 20 46 54 53 35 20 62 61 63 6b 65 6e    /* FTS5 backen
d630: 64 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 46 74  d object */.  Ft
d640: 73 35 53 65 67 49 74 65 72 20 2a 70 49 74 65 72  s5SegIter *pIter
d650: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
d660: 20 49 74 65 72 61 74 6f 72 20 74 6f 20 61 64 76   Iterator to adv
d670: 61 6e 63 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 70  ance */.  int *p
d680: 62 4e 65 77 54 65 72 6d 20 20 20 20 20 20 20 20  bNewTerm        
d690: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54            /* OUT
d6a0: 3a 20 53 65 74 20 66 6f 72 20 6e 65 77 20 74 65  : Set for new te
d6b0: 72 6d 20 2a 2f 0a 29 7b 0a 20 20 61 73 73 65 72  rm */.){.  asser
d6c0: 74 28 20 70 62 4e 65 77 54 65 72 6d 3d 3d 30 20  t( pbNewTerm==0 
d6d0: 7c 7c 20 2a 70 62 4e 65 77 54 65 72 6d 3d 3d 30  || *pbNewTerm==0
d6e0: 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d   );.  if( p->rc=
d6f0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
d700: 20 20 69 66 28 20 70 49 74 65 72 2d 3e 66 6c 61    if( pIter->fla
d710: 67 73 20 26 20 46 54 53 35 5f 53 45 47 49 54 45  gs & FTS5_SEGITE
d720: 52 5f 52 45 56 45 52 53 45 20 29 7b 0a 20 20 20  R_REVERSE ){.   
d730: 20 20 20 61 73 73 65 72 74 28 20 70 49 74 65 72     assert( pIter
d740: 2d 3e 70 4e 65 78 74 4c 65 61 66 3d 3d 30 20 29  ->pNextLeaf==0 )
d750: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49 74 65  ;.      if( pIte
d760: 72 2d 3e 69 52 6f 77 69 64 4f 66 66 73 65 74 3e  r->iRowidOffset>
d770: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 75 38 20  0 ){.        u8 
d780: 2a 61 20 3d 20 70 49 74 65 72 2d 3e 70 4c 65 61  *a = pIter->pLea
d790: 66 2d 3e 70 3b 0a 20 20 20 20 20 20 20 20 69 6e  f->p;.        in
d7a0: 74 20 69 4f 66 66 3b 0a 20 20 20 20 20 20 20 20  t iOff;.        
d7b0: 69 6e 74 20 6e 50 6f 73 3b 0a 20 20 20 20 20 20  int nPos;.      
d7c0: 20 20 69 6e 74 20 62 44 75 6d 6d 79 3b 0a 20 20    int bDummy;.  
d7d0: 20 20 20 20 20 20 69 36 34 20 69 44 65 6c 74 61        i64 iDelta
d7e0: 3b 0a 0a 20 20 20 20 20 20 20 20 70 49 74 65 72  ;..        pIter
d7f0: 2d 3e 69 52 6f 77 69 64 4f 66 66 73 65 74 2d 2d  ->iRowidOffset--
d800: 3b 0a 20 20 20 20 20 20 20 20 70 49 74 65 72 2d  ;.        pIter-
d810: 3e 69 4c 65 61 66 4f 66 66 73 65 74 20 3d 20 69  >iLeafOffset = i
d820: 4f 66 66 20 3d 20 70 49 74 65 72 2d 3e 61 52 6f  Off = pIter->aRo
d830: 77 69 64 4f 66 66 73 65 74 5b 70 49 74 65 72 2d  widOffset[pIter-
d840: 3e 69 52 6f 77 69 64 4f 66 66 73 65 74 5d 3b 0a  >iRowidOffset];.
d850: 20 20 20 20 20 20 20 20 69 4f 66 66 20 2b 3d 20          iOff += 
d860: 66 74 73 35 47 65 74 50 6f 73 6c 69 73 74 53 69  fts5GetPoslistSi
d870: 7a 65 28 26 61 5b 69 4f 66 66 5d 2c 20 26 6e 50  ze(&a[iOff], &nP
d880: 6f 73 2c 20 26 62 44 75 6d 6d 79 29 3b 0a 20 20  os, &bDummy);.  
d890: 20 20 20 20 20 20 69 4f 66 66 20 2b 3d 20 6e 50        iOff += nP
d8a0: 6f 73 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35  os;.        fts5
d8b0: 47 65 74 56 61 72 69 6e 74 28 26 61 5b 69 4f 66  GetVarint(&a[iOf
d8c0: 66 5d 2c 20 28 75 36 34 2a 29 26 69 44 65 6c 74  f], (u64*)&iDelt
d8d0: 61 29 3b 0a 20 20 20 20 20 20 20 20 70 49 74 65  a);.        pIte
d8e0: 72 2d 3e 69 52 6f 77 69 64 20 2d 3d 20 69 44 65  r->iRowid -= iDe
d8f0: 6c 74 61 3b 0a 20 20 20 20 20 20 20 20 66 74 73  lta;.        fts
d900: 35 53 65 67 49 74 65 72 4c 6f 61 64 4e 50 6f 73  5SegIterLoadNPos
d910: 28 70 2c 20 70 49 74 65 72 29 3b 0a 20 20 20 20  (p, pIter);.    
d920: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
d930: 20 66 74 73 35 53 65 67 49 74 65 72 52 65 76 65   fts5SegIterReve
d940: 72 73 65 4e 65 77 50 61 67 65 28 70 2c 20 70 49  rseNewPage(p, pI
d950: 74 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ter);.      }.  
d960: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 46    }else{.      F
d970: 74 73 35 44 61 74 61 20 2a 70 4c 65 61 66 20 3d  ts5Data *pLeaf =
d980: 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 3b 0a 20   pIter->pLeaf;. 
d990: 20 20 20 20 20 69 6e 74 20 69 4f 66 66 3b 0a 20       int iOff;. 
d9a0: 20 20 20 20 20 69 6e 74 20 62 4e 65 77 54 65 72       int bNewTer
d9b0: 6d 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 6e 74  m = 0;.      int
d9c0: 20 6e 4b 65 65 70 20 3d 20 30 3b 0a 0a 20 20 20   nKeep = 0;..   
d9d0: 20 20 20 2f 2a 20 53 65 61 72 63 68 20 66 6f 72     /* Search for
d9e0: 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
d9f0: 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74 20 77 69  position list wi
da00: 74 68 69 6e 20 74 68 65 20 63 75 72 72 65 6e 74  thin the current
da10: 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20 20 20   page. */.      
da20: 75 38 20 2a 61 20 3d 20 70 4c 65 61 66 2d 3e 70  u8 *a = pLeaf->p
da30: 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 20 3d 20  ;.      int n = 
da40: 70 4c 65 61 66 2d 3e 73 7a 4c 65 61 66 3b 0a 0a  pLeaf->szLeaf;..
da50: 20 20 20 20 20 20 41 53 53 45 52 54 5f 53 5a 4c        ASSERT_SZL
da60: 45 41 46 5f 4f 4b 28 70 4c 65 61 66 29 3b 0a 20  EAF_OK(pLeaf);. 
da70: 20 20 20 20 20 69 4f 66 66 20 3d 20 70 49 74 65       iOff = pIte
da80: 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 20 2b  r->iLeafOffset +
da90: 20 70 49 74 65 72 2d 3e 6e 50 6f 73 3b 0a 0a 20   pIter->nPos;.. 
daa0: 20 20 20 20 20 69 66 28 20 69 4f 66 66 3c 6e 20       if( iOff<n 
dab0: 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ){.        /* Th
dac0: 65 20 6e 65 78 74 20 65 6e 74 72 79 20 69 73 20  e next entry is 
dad0: 6f 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 70  on the current p
dae0: 61 67 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  age. */.        
daf0: 61 73 73 65 72 74 5f 6e 63 28 20 69 4f 66 66 3c  assert_nc( iOff<
db00: 3d 70 49 74 65 72 2d 3e 69 45 6e 64 6f 66 44 6f  =pIter->iEndofDo
db10: 63 6c 69 73 74 20 29 3b 0a 20 20 20 20 20 20 20  clist );.       
db20: 20 69 66 28 20 69 4f 66 66 3e 3d 70 49 74 65 72   if( iOff>=pIter
db30: 2d 3e 69 45 6e 64 6f 66 44 6f 63 6c 69 73 74 20  ->iEndofDoclist 
db40: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 62 4e 65  ){.          bNe
db50: 77 54 65 72 6d 20 3d 20 31 3b 0a 20 20 20 20 20  wTerm = 1;.     
db60: 20 20 20 20 20 69 66 28 20 69 4f 66 66 21 3d 66       if( iOff!=f
db70: 74 73 35 4c 65 61 66 46 69 72 73 74 54 65 72 6d  ts5LeafFirstTerm
db80: 4f 66 66 28 70 4c 65 61 66 29 20 29 7b 0a 20 20  Off(pLeaf) ){.  
db90: 20 20 20 20 20 20 20 20 20 20 69 4f 66 66 20 2b            iOff +
dba0: 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e 74 33  = fts5GetVarint3
dbb0: 32 28 26 61 5b 69 4f 66 66 5d 2c 20 6e 4b 65 65  2(&a[iOff], nKee
dbc0: 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  p);.          }.
dbd0: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
dbe0: 20 20 20 20 20 20 20 20 20 75 36 34 20 69 44 65           u64 iDe
dbf0: 6c 74 61 3b 0a 20 20 20 20 20 20 20 20 20 20 69  lta;.          i
dc00: 4f 66 66 20 2b 3d 20 73 71 6c 69 74 65 33 46 74  Off += sqlite3Ft
dc10: 73 35 47 65 74 56 61 72 69 6e 74 28 26 61 5b 69  s5GetVarint(&a[i
dc20: 4f 66 66 5d 2c 20 26 69 44 65 6c 74 61 29 3b 0a  Off], &iDelta);.
dc30: 20 20 20 20 20 20 20 20 20 20 70 49 74 65 72 2d            pIter-
dc40: 3e 69 52 6f 77 69 64 20 2b 3d 20 69 44 65 6c 74  >iRowid += iDelt
dc50: 61 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  a;.          ass
dc60: 65 72 74 5f 6e 63 28 20 69 44 65 6c 74 61 3e 30  ert_nc( iDelta>0
dc70: 20 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   );.        }.  
dc80: 20 20 20 20 20 20 70 49 74 65 72 2d 3e 69 4c 65        pIter->iLe
dc90: 61 66 4f 66 66 73 65 74 20 3d 20 69 4f 66 66 3b  afOffset = iOff;
dca0: 0a 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ..      }else if
dcb0: 28 20 70 49 74 65 72 2d 3e 70 53 65 67 3d 3d 30  ( pIter->pSeg==0
dcc0: 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73   ){.        cons
dcd0: 74 20 75 38 20 2a 70 4c 69 73 74 20 3d 20 30 3b  t u8 *pList = 0;
dce0: 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63  .        const c
dcf0: 68 61 72 20 2a 7a 54 65 72 6d 20 3d 20 30 3b 0a  har *zTerm = 0;.
dd00: 20 20 20 20 20 20 20 20 69 6e 74 20 6e 4c 69 73          int nLis
dd10: 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 69  t = 0;.        i
dd20: 66 28 20 30 3d 3d 28 70 49 74 65 72 2d 3e 66 6c  f( 0==(pIter->fl
dd30: 61 67 73 20 26 20 46 54 53 35 5f 53 45 47 49 54  ags & FTS5_SEGIT
dd40: 45 52 5f 4f 4e 45 54 45 52 4d 29 20 29 7b 0a 20  ER_ONETERM) ){. 
dd50: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
dd60: 46 74 73 35 48 61 73 68 53 63 61 6e 4e 65 78 74  Fts5HashScanNext
dd70: 28 70 2d 3e 70 48 61 73 68 29 3b 0a 20 20 20 20  (p->pHash);.    
dd80: 20 20 20 20 20 20 73 71 6c 69 74 65 33 46 74 73        sqlite3Fts
dd90: 35 48 61 73 68 53 63 61 6e 45 6e 74 72 79 28 70  5HashScanEntry(p
dda0: 2d 3e 70 48 61 73 68 2c 20 26 7a 54 65 72 6d 2c  ->pHash, &zTerm,
ddb0: 20 26 70 4c 69 73 74 2c 20 26 6e 4c 69 73 74 29   &pList, &nList)
ddc0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
ddd0: 20 20 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30      if( pList==0
dde0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 66 74   ){.          ft
ddf0: 73 35 44 61 74 61 52 65 6c 65 61 73 65 28 70 49  s5DataRelease(pI
de00: 74 65 72 2d 3e 70 4c 65 61 66 29 3b 0a 20 20 20  ter->pLeaf);.   
de10: 20 20 20 20 20 20 20 70 49 74 65 72 2d 3e 70 4c         pIter->pL
de20: 65 61 66 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  eaf = 0;.       
de30: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
de40: 20 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e    pIter->pLeaf->
de50: 70 20 3d 20 28 75 38 2a 29 70 4c 69 73 74 3b 0a  p = (u8*)pList;.
de60: 20 20 20 20 20 20 20 20 20 20 70 49 74 65 72 2d            pIter-
de70: 3e 70 4c 65 61 66 2d 3e 6e 6e 20 3d 20 6e 4c 69  >pLeaf->nn = nLi
de80: 73 74 3b 0a 20 20 20 20 20 20 20 20 20 20 70 49  st;.          pI
de90: 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 73 7a 4c 65  ter->pLeaf->szLe
dea0: 61 66 20 3d 20 6e 4c 69 73 74 3b 0a 20 20 20 20  af = nList;.    
deb0: 20 20 20 20 20 20 70 49 74 65 72 2d 3e 69 45 6e        pIter->iEn
dec0: 64 6f 66 44 6f 63 6c 69 73 74 20 3d 20 6e 4c 69  dofDoclist = nLi
ded0: 73 74 2b 31 3b 0a 20 20 20 20 20 20 20 20 20 20  st+1;.          
dee0: 73 71 6c 69 74 65 33 46 74 73 35 42 75 66 66 65  sqlite3Fts5Buffe
def0: 72 53 65 74 28 26 70 2d 3e 72 63 2c 20 26 70 49  rSet(&p->rc, &pI
df00: 74 65 72 2d 3e 74 65 72 6d 2c 20 73 74 72 6c 65  ter->term, strle
df10: 6e 28 7a 54 65 72 6d 29 2c 20 28 75 38 2a 29 7a  n(zTerm), (u8*)z
df20: 54 65 72 6d 29 3b 0a 20 20 20 20 20 20 20 20 20  Term);.         
df30: 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66   pIter->iLeafOff
df40: 73 65 74 20 3d 20 66 74 73 35 47 65 74 56 61 72  set = fts5GetVar
df50: 69 6e 74 28 70 4c 69 73 74 2c 20 28 75 36 34 2a  int(pList, (u64*
df60: 29 26 70 49 74 65 72 2d 3e 69 52 6f 77 69 64 29  )&pIter->iRowid)
df70: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
df80: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
df90: 20 69 4f 66 66 20 3d 20 30 3b 0a 20 20 20 20 20   iOff = 0;.     
dfa0: 20 20 20 2f 2a 20 4e 65 78 74 20 65 6e 74 72 79     /* Next entry
dfb0: 20 69 73 20 6e 6f 74 20 6f 6e 20 74 68 65 20 63   is not on the c
dfc0: 75 72 72 65 6e 74 20 70 61 67 65 20 2a 2f 0a 20  urrent page */. 
dfd0: 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 69 4f         while( iO
dfe0: 66 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ff==0 ){.       
dff0: 20 20 20 66 74 73 35 53 65 67 49 74 65 72 4e 65     fts5SegIterNe
e000: 78 74 50 61 67 65 28 70 2c 20 70 49 74 65 72 29  xtPage(p, pIter)
e010: 3b 0a 20 20 20 20 20 20 20 20 20 20 70 4c 65 61  ;.          pLea
e020: 66 20 3d 20 70 49 74 65 72 2d 3e 70 4c 65 61 66  f = pIter->pLeaf
e030: 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
e040: 70 4c 65 61 66 3d 3d 30 20 29 20 62 72 65 61 6b  pLeaf==0 ) break
e050: 3b 0a 20 20 20 20 20 20 20 20 20 20 41 53 53 45  ;.          ASSE
e060: 52 54 5f 53 5a 4c 45 41 46 5f 4f 4b 28 70 4c 65  RT_SZLEAF_OK(pLe
e070: 61 66 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  af);.          i
e080: 66 28 20 28 69 4f 66 66 20 3d 20 66 74 73 35 4c  f( (iOff = fts5L
e090: 65 61 66 46 69 72 73 74 52 6f 77 69 64 4f 66 66  eafFirstRowidOff
e0a0: 28 70 4c 65 61 66 29 29 20 26 26 20 69 4f 66 66  (pLeaf)) && iOff
e0b0: 3c 70 4c 65 61 66 2d 3e 73 7a 4c 65 61 66 20 29  <pLeaf->szLeaf )
e0c0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 4f  {.            iO
e0d0: 66 66 20 2b 3d 20 73 71 6c 69 74 65 33 46 74 73  ff += sqlite3Fts
e0e0: 35 47 65 74 56 61 72 69 6e 74 28 26 70 4c 65 61  5GetVarint(&pLea
e0f0: 66 2d 3e 70 5b 69 4f 66 66 5d 2c 20 28 75 36 34  f->p[iOff], (u64
e100: 2a 29 26 70 49 74 65 72 2d 3e 69 52 6f 77 69 64  *)&pIter->iRowid
e110: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  );.            p
e120: 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65  Iter->iLeafOffse
e130: 74 20 3d 20 69 4f 66 66 3b 0a 0a 20 20 20 20 20  t = iOff;..     
e140: 20 20 20 20 20 20 20 69 66 28 20 70 4c 65 61 66         if( pLeaf
e150: 2d 3e 6e 6e 3e 70 4c 65 61 66 2d 3e 73 7a 4c 65  ->nn>pLeaf->szLe
e160: 61 66 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  af ){.          
e170: 20 20 20 20 70 49 74 65 72 2d 3e 69 50 67 69 64      pIter->iPgid
e180: 78 4f 66 66 20 3d 20 70 4c 65 61 66 2d 3e 73 7a  xOff = pLeaf->sz
e190: 4c 65 61 66 20 2b 20 66 74 73 35 47 65 74 56 61  Leaf + fts5GetVa
e1a0: 72 69 6e 74 33 32 28 0a 20 20 20 20 20 20 20 20  rint32(.        
e1b0: 20 20 20 20 20 20 20 20 20 20 26 70 4c 65 61 66            &pLeaf
e1c0: 2d 3e 70 5b 70 4c 65 61 66 2d 3e 73 7a 4c 65 61  ->p[pLeaf->szLea
e1d0: 66 5d 2c 20 70 49 74 65 72 2d 3e 69 45 6e 64 6f  f], pIter->iEndo
e1e0: 66 44 6f 63 6c 69 73 74 0a 20 20 20 20 20 20 20  fDoclist.       
e1f0: 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20         );.      
e200: 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20        }..       
e210: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 65     }.          e
e220: 6c 73 65 20 69 66 28 20 70 4c 65 61 66 2d 3e 6e  lse if( pLeaf->n
e230: 6e 3e 70 4c 65 61 66 2d 3e 73 7a 4c 65 61 66 20  n>pLeaf->szLeaf 
e240: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  ){.            p
e250: 49 74 65 72 2d 3e 69 50 67 69 64 78 4f 66 66 20  Iter->iPgidxOff 
e260: 3d 20 70 4c 65 61 66 2d 3e 73 7a 4c 65 61 66 20  = pLeaf->szLeaf 
e270: 2b 20 66 74 73 35 47 65 74 56 61 72 69 6e 74 33  + fts5GetVarint3
e280: 32 28 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  2(.             
e290: 20 20 20 26 70 4c 65 61 66 2d 3e 70 5b 70 4c 65     &pLeaf->p[pLe
e2a0: 61 66 2d 3e 73 7a 4c 65 61 66 5d 2c 20 69 4f 66  af->szLeaf], iOf
e2b0: 66 0a 20 20 20 20 20 20 20 20 20 20 20 20 29 3b  f.            );
e2c0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 49 74  .            pIt
e2d0: 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 20  er->iLeafOffset 
e2e0: 3d 20 69 4f 66 66 3b 0a 20 20 20 20 20 20 20 20  = iOff;.        
e2f0: 20 20 20 20 70 49 74 65 72 2d 3e 69 45 6e 64 6f      pIter->iEndo
e300: 66 44 6f 63 6c 69 73 74 20 3d 20 69 4f 66 66 3b  fDoclist = iOff;
e310: 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 4e 65  .            bNe
e320: 77 54 65 72 6d 20 3d 20 31 3b 0a 20 20 20 20 20  wTerm = 1;.     
e330: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
e340: 20 69 66 28 20 69 4f 66 66 3e 3d 70 4c 65 61 66   if( iOff>=pLeaf
e350: 2d 3e 73 7a 4c 65 61 66 20 29 7b 0a 20 20 20 20  ->szLeaf ){.    
e360: 20 20 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20          p->rc = 
e370: 46 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20  FTS5_CORRUPT;.  
e380: 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
e390: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
e3a0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
e3b0: 0a 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 20  .      /* Check 
e3c0: 69 66 20 74 68 65 20 69 74 65 72 61 74 6f 72 20  if the iterator 
e3d0: 69 73 20 6e 6f 77 20 61 74 20 45 4f 46 2e 20 49  is now at EOF. I
e3e0: 66 20 73 6f 2c 20 72 65 74 75 72 6e 20 65 61 72  f so, return ear
e3f0: 6c 79 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66 28  ly. */.      if(
e400: 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 20 29 7b   pIter->pLeaf ){
e410: 0a 20 20 20 20 20 20 20 20 69 66 28 20 62 4e 65  .        if( bNe
e420: 77 54 65 72 6d 20 29 7b 0a 20 20 20 20 20 20 20  wTerm ){.       
e430: 20 20 20 69 66 28 20 70 49 74 65 72 2d 3e 66 6c     if( pIter->fl
e440: 61 67 73 20 26 20 46 54 53 35 5f 53 45 47 49 54  ags & FTS5_SEGIT
e450: 45 52 5f 4f 4e 45 54 45 52 4d 20 29 7b 0a 20 20  ER_ONETERM ){.  
e460: 20 20 20 20 20 20 20 20 20 20 66 74 73 35 44 61            fts5Da
e470: 74 61 52 65 6c 65 61 73 65 28 70 49 74 65 72 2d  taRelease(pIter-
e480: 3e 70 4c 65 61 66 29 3b 0a 20 20 20 20 20 20 20  >pLeaf);.       
e490: 20 20 20 20 20 70 49 74 65 72 2d 3e 70 4c 65 61       pIter->pLea
e4a0: 66 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  f = 0;.         
e4b0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
e4c0: 20 20 20 20 66 74 73 35 53 65 67 49 74 65 72 4c      fts5SegIterL
e4d0: 6f 61 64 54 65 72 6d 28 70 2c 20 70 49 74 65 72  oadTerm(p, pIter
e4e0: 2c 20 6e 4b 65 65 70 29 3b 0a 20 20 20 20 20 20  , nKeep);.      
e4f0: 20 20 20 20 20 20 66 74 73 35 53 65 67 49 74 65        fts5SegIte
e500: 72 4c 6f 61 64 4e 50 6f 73 28 70 2c 20 70 49 74  rLoadNPos(p, pIt
e510: 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  er);.           
e520: 20 69 66 28 20 70 62 4e 65 77 54 65 72 6d 20 29   if( pbNewTerm )
e530: 20 2a 70 62 4e 65 77 54 65 72 6d 20 3d 20 31 3b   *pbNewTerm = 1;
e540: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
e550: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
e560: 20 20 20 20 20 20 66 74 73 35 53 65 67 49 74 65        fts5SegIte
e570: 72 4c 6f 61 64 4e 50 6f 73 28 70 2c 20 70 49 74  rLoadNPos(p, pIt
e580: 65 72 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  er);.        }. 
e590: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
e5a0: 0a 7d 0a 0a 23 64 65 66 69 6e 65 20 53 57 41 50  .}..#define SWAP
e5b0: 56 41 4c 28 54 2c 20 61 2c 20 62 29 20 7b 20 54  VAL(T, a, b) { T
e5c0: 20 74 6d 70 3b 20 74 6d 70 3d 61 3b 20 61 3d 62   tmp; tmp=a; a=b
e5d0: 3b 20 62 3d 74 6d 70 3b 20 7d 0a 0a 2f 2a 0a 2a  ; b=tmp; }../*.*
e5e0: 2a 20 49 74 65 72 61 74 6f 72 20 70 49 74 65 72  * Iterator pIter
e5f0: 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74   currently point
e600: 73 20 74 6f 20 74 68 65 20 66 69 72 73 74 20 72  s to the first r
e610: 6f 77 69 64 20 69 6e 20 61 20 64 6f 63 6c 69 73  owid in a doclis
e620: 74 2e 20 54 68 69 73 0a 2a 2a 20 66 75 6e 63 74  t. This.** funct
e630: 69 6f 6e 20 73 65 74 73 20 74 68 65 20 69 74 65  ion sets the ite
e640: 72 61 74 6f 72 20 75 70 20 73 6f 20 74 68 61 74  rator up so that
e650: 20 69 74 65 72 61 74 65 73 20 69 6e 20 72 65 76   iterates in rev
e660: 65 72 73 65 20 6f 72 64 65 72 20 74 68 72 6f 75  erse order throu
e670: 67 68 0a 2a 2a 20 74 68 65 20 64 6f 63 6c 69 73  gh.** the doclis
e680: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  t..*/.static voi
e690: 64 20 66 74 73 35 53 65 67 49 74 65 72 52 65 76  d fts5SegIterRev
e6a0: 65 72 73 65 28 46 74 73 35 49 6e 64 65 78 20 2a  erse(Fts5Index *
e6b0: 70 2c 20 46 74 73 35 53 65 67 49 74 65 72 20 2a  p, Fts5SegIter *
e6c0: 70 49 74 65 72 29 7b 0a 20 20 46 74 73 35 44 6c  pIter){.  Fts5Dl
e6d0: 69 64 78 49 74 65 72 20 2a 70 44 6c 69 64 78 20  idxIter *pDlidx 
e6e0: 3d 20 70 49 74 65 72 2d 3e 70 44 6c 69 64 78 3b  = pIter->pDlidx;
e6f0: 0a 20 20 46 74 73 35 44 61 74 61 20 2a 70 4c 61  .  Fts5Data *pLa
e700: 73 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20 70 67  st = 0;.  int pg
e710: 6e 6f 4c 61 73 74 20 3d 20 30 3b 0a 0a 20 20 69  noLast = 0;..  i
e720: 66 28 20 70 44 6c 69 64 78 20 29 7b 0a 20 20 20  f( pDlidx ){.   
e730: 20 69 6e 74 20 69 53 65 67 69 64 20 3d 20 70 49   int iSegid = pI
e740: 74 65 72 2d 3e 70 53 65 67 2d 3e 69 53 65 67 69  ter->pSeg->iSegi
e750: 64 3b 0a 20 20 20 20 70 67 6e 6f 4c 61 73 74 20  d;.    pgnoLast 
e760: 3d 20 66 74 73 35 44 6c 69 64 78 49 74 65 72 50  = fts5DlidxIterP
e770: 67 6e 6f 28 70 44 6c 69 64 78 29 3b 0a 20 20 20  gno(pDlidx);.   
e780: 20 70 4c 61 73 74 20 3d 20 66 74 73 35 44 61 74   pLast = fts5Dat
e790: 61 52 65 61 64 28 70 2c 20 46 54 53 35 5f 53 45  aRead(p, FTS5_SE
e7a0: 47 4d 45 4e 54 5f 52 4f 57 49 44 28 69 53 65 67  GMENT_ROWID(iSeg
e7b0: 69 64 2c 20 70 67 6e 6f 4c 61 73 74 29 29 3b 0a  id, pgnoLast));.
e7c0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 46 74 73    }else{.    Fts
e7d0: 35 44 61 74 61 20 2a 70 4c 65 61 66 20 3d 20 70  5Data *pLeaf = p
e7e0: 49 74 65 72 2d 3e 70 4c 65 61 66 3b 20 20 20 20  Iter->pLeaf;    
e7f0: 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20       /* Current 
e800: 6c 65 61 66 20 64 61 74 61 20 2a 2f 0a 0a 20 20  leaf data */..  
e810: 20 20 2f 2a 20 43 75 72 72 65 6e 74 6c 79 2c 20    /* Currently, 
e820: 46 74 73 35 53 65 67 49 74 65 72 2e 69 4c 65 61  Fts5SegIter.iLea
e830: 66 4f 66 66 73 65 74 20 70 6f 69 6e 74 73 20 74  fOffset points t
e840: 6f 20 74 68 65 20 66 69 72 73 74 20 62 79 74 65  o the first byte
e850: 20 6f 66 0a 20 20 20 20 2a 2a 20 70 6f 73 69 74   of.    ** posit
e860: 69 6f 6e 2d 6c 69 73 74 20 63 6f 6e 74 65 6e 74  ion-list content
e870: 20 66 6f 72 20 74 68 65 20 63 75 72 72 65 6e 74   for the current
e880: 20 72 6f 77 69 64 2e 20 42 61 63 6b 20 69 74 20   rowid. Back it 
e890: 75 70 20 73 6f 20 74 68 61 74 20 69 74 0a 20 20  up so that it.  
e8a0: 20 20 2a 2a 20 70 6f 69 6e 74 73 20 74 6f 20 74    ** points to t
e8b0: 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20  he start of the 
e8c0: 70 6f 73 69 74 69 6f 6e 2d 6c 69 73 74 20 73 69  position-list si
e8d0: 7a 65 20 66 69 65 6c 64 2e 20 2a 2f 0a 20 20 20  ze field. */.   
e8e0: 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66   pIter->iLeafOff
e8f0: 73 65 74 20 2d 3d 20 73 71 6c 69 74 65 33 46 74  set -= sqlite3Ft
e900: 73 35 47 65 74 56 61 72 69 6e 74 4c 65 6e 28 70  s5GetVarintLen(p
e910: 49 74 65 72 2d 3e 6e 50 6f 73 2a 32 2b 70 49 74  Iter->nPos*2+pIt
e920: 65 72 2d 3e 62 44 65 6c 29 3b 0a 0a 20 20 20 20  er->bDel);..    
e930: 2f 2a 20 49 66 20 74 68 69 73 20 63 6f 6e 64 69  /* If this condi
e940: 74 69 6f 6e 20 69 73 20 74 72 75 65 20 74 68 65  tion is true the
e950: 6e 20 74 68 65 20 6c 61 72 67 65 73 74 20 72 6f  n the largest ro
e960: 77 69 64 20 66 6f 72 20 74 68 65 20 63 75 72 72  wid for the curr
e970: 65 6e 74 0a 20 20 20 20 2a 2a 20 74 65 72 6d 20  ent.    ** term 
e980: 6d 61 79 20 6e 6f 74 20 62 65 20 73 74 6f 72 65  may not be store
e990: 64 20 6f 6e 20 74 68 65 20 63 75 72 72 65 6e 74  d on the current
e9a0: 20 70 61 67 65 2e 20 53 6f 20 73 65 61 72 63 68   page. So search
e9b0: 20 66 6f 72 77 61 72 64 20 74 6f 0a 20 20 20 20   forward to.    
e9c0: 2a 2a 20 73 65 65 20 77 68 65 72 65 20 73 61 69  ** see where sai
e9d0: 64 20 72 6f 77 69 64 20 72 65 61 6c 6c 79 20 69  d rowid really i
e9e0: 73 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70  s.  */.    if( p
e9f0: 49 74 65 72 2d 3e 69 45 6e 64 6f 66 44 6f 63 6c  Iter->iEndofDocl
ea00: 69 73 74 3e 3d 70 4c 65 61 66 2d 3e 73 7a 4c 65  ist>=pLeaf->szLe
ea10: 61 66 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  af ){.      int 
ea20: 70 67 6e 6f 3b 0a 20 20 20 20 20 20 46 74 73 35  pgno;.      Fts5
ea30: 53 74 72 75 63 74 75 72 65 53 65 67 6d 65 6e 74  StructureSegment
ea40: 20 2a 70 53 65 67 20 3d 20 70 49 74 65 72 2d 3e   *pSeg = pIter->
ea50: 70 53 65 67 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  pSeg;..      /* 
ea60: 54 68 65 20 6c 61 73 74 20 72 6f 77 69 64 20 69  The last rowid i
ea70: 6e 20 74 68 65 20 64 6f 63 6c 69 73 74 20 6d 61  n the doclist ma
ea80: 79 20 6e 6f 74 20 62 65 20 6f 6e 20 74 68 65 20  y not be on the 
ea90: 63 75 72 72 65 6e 74 20 70 61 67 65 2e 20 53 65  current page. Se
eaa0: 61 72 63 68 0a 20 20 20 20 20 20 2a 2a 20 66 6f  arch.      ** fo
eab0: 72 77 61 72 64 20 74 6f 20 66 69 6e 64 20 74 68  rward to find th
eac0: 65 20 70 61 67 65 20 63 6f 6e 74 61 69 6e 69 6e  e page containin
ead0: 67 20 74 68 65 20 6c 61 73 74 20 72 6f 77 69 64  g the last rowid
eae0: 2e 20 20 2a 2f 0a 20 20 20 20 20 20 66 6f 72 28  .  */.      for(
eaf0: 70 67 6e 6f 3d 70 49 74 65 72 2d 3e 69 4c 65 61  pgno=pIter->iLea
eb00: 66 50 67 6e 6f 2b 31 3b 20 21 70 2d 3e 72 63 20  fPgno+1; !p->rc 
eb10: 26 26 20 70 67 6e 6f 3c 3d 70 53 65 67 2d 3e 70  && pgno<=pSeg->p
eb20: 67 6e 6f 4c 61 73 74 3b 20 70 67 6e 6f 2b 2b 29  gnoLast; pgno++)
eb30: 7b 0a 20 20 20 20 20 20 20 20 69 36 34 20 69 41  {.        i64 iA
eb40: 62 73 20 3d 20 46 54 53 35 5f 53 45 47 4d 45 4e  bs = FTS5_SEGMEN
eb50: 54 5f 52 4f 57 49 44 28 70 53 65 67 2d 3e 69 53  T_ROWID(pSeg->iS
eb60: 65 67 69 64 2c 20 70 67 6e 6f 29 3b 0a 20 20 20  egid, pgno);.   
eb70: 20 20 20 20 20 46 74 73 35 44 61 74 61 20 2a 70       Fts5Data *p
eb80: 4e 65 77 20 3d 20 66 74 73 35 44 61 74 61 52 65  New = fts5DataRe
eb90: 61 64 28 70 2c 20 69 41 62 73 29 3b 0a 20 20 20  ad(p, iAbs);.   
eba0: 20 20 20 20 20 69 66 28 20 70 4e 65 77 20 29 7b       if( pNew ){
ebb0: 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 69  .          int i
ebc0: 52 6f 77 69 64 2c 20 62 54 65 72 6d 6c 65 73 73  Rowid, bTermless
ebd0: 3b 0a 20 20 20 20 20 20 20 20 20 20 69 52 6f 77  ;.          iRow
ebe0: 69 64 20 3d 20 66 74 73 35 4c 65 61 66 46 69 72  id = fts5LeafFir
ebf0: 73 74 52 6f 77 69 64 4f 66 66 28 70 4e 65 77 29  stRowidOff(pNew)
ec00: 3b 0a 20 20 20 20 20 20 20 20 20 20 62 54 65 72  ;.          bTer
ec10: 6d 6c 65 73 73 20 3d 20 66 74 73 35 4c 65 61 66  mless = fts5Leaf
ec20: 49 73 54 65 72 6d 6c 65 73 73 28 70 4e 65 77 29  IsTermless(pNew)
ec30: 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
ec40: 69 52 6f 77 69 64 20 29 7b 0a 20 20 20 20 20 20  iRowid ){.      
ec50: 20 20 20 20 20 20 53 57 41 50 56 41 4c 28 46 74        SWAPVAL(Ft
ec60: 73 35 44 61 74 61 2a 2c 20 70 4e 65 77 2c 20 70  s5Data*, pNew, p
ec70: 4c 61 73 74 29 3b 0a 20 20 20 20 20 20 20 20 20  Last);.         
ec80: 20 20 20 70 67 6e 6f 4c 61 73 74 20 3d 20 70 67     pgnoLast = pg
ec90: 6e 6f 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  no;.          }.
eca0: 20 20 20 20 20 20 20 20 20 20 66 74 73 35 44 61            fts5Da
ecb0: 74 61 52 65 6c 65 61 73 65 28 70 4e 65 77 29 3b  taRelease(pNew);
ecc0: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 62  .          if( b
ecd0: 54 65 72 6d 6c 65 73 73 3d 3d 30 20 29 20 62 72  Termless==0 ) br
ece0: 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  eak;.        }. 
ecf0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
ed00: 0a 0a 20 20 2f 2a 20 49 66 20 70 4c 61 73 74 20  ..  /* If pLast 
ed10: 69 73 20 4e 55 4c 4c 20 61 74 20 74 68 69 73 20  is NULL at this 
ed20: 70 6f 69 6e 74 2c 20 74 68 65 6e 20 74 68 65 20  point, then the 
ed30: 6c 61 73 74 20 72 6f 77 69 64 20 66 6f 72 20 74  last rowid for t
ed40: 68 69 73 20 64 6f 63 6c 69 73 74 0a 20 20 2a 2a  his doclist.  **
ed50: 20 6c 69 65 73 20 6f 6e 20 74 68 65 20 70 61 67   lies on the pag
ed60: 65 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 64 69  e currently indi
ed70: 63 61 74 65 64 20 62 79 20 74 68 65 20 69 74 65  cated by the ite
ed80: 72 61 74 6f 72 2e 20 49 6e 20 74 68 69 73 20 63  rator. In this c
ed90: 61 73 65 20 0a 20 20 2a 2a 20 70 49 74 65 72 2d  ase .  ** pIter-
eda0: 3e 69 4c 65 61 66 4f 66 66 73 65 74 20 69 73 20  >iLeafOffset is 
edb0: 61 6c 72 65 61 64 79 20 73 65 74 20 74 6f 20 70  already set to p
edc0: 6f 69 6e 74 20 74 6f 20 74 68 65 20 70 6f 73 69  oint to the posi
edd0: 74 69 6f 6e 2d 6c 69 73 74 20 73 69 7a 65 0a 20  tion-list size. 
ede0: 20 2a 2a 20 66 69 65 6c 64 20 61 73 73 6f 63 69   ** field associ
edf0: 61 74 65 64 20 77 69 74 68 20 74 68 65 20 66 69  ated with the fi
ee00: 72 73 74 20 72 65 6c 65 76 61 6e 74 20 72 6f 77  rst relevant row
ee10: 69 64 20 6f 6e 20 74 68 65 20 70 61 67 65 2e 0a  id on the page..
ee20: 20 20 2a 2a 0a 20 20 2a 2a 20 4f 72 2c 20 69 66    **.  ** Or, if
ee30: 20 70 4c 61 73 74 20 69 73 20 6e 6f 6e 2d 4e 55   pLast is non-NU
ee40: 4c 4c 2c 20 74 68 65 6e 20 69 74 20 69 73 20 74  LL, then it is t
ee50: 68 65 20 70 61 67 65 20 74 68 61 74 20 63 6f 6e  he page that con
ee60: 74 61 69 6e 73 20 74 68 65 20 6c 61 73 74 0a 20  tains the last. 
ee70: 20 2a 2a 20 72 6f 77 69 64 2e 20 49 6e 20 74 68   ** rowid. In th
ee80: 69 73 20 63 61 73 65 20 63 6f 6e 66 69 67 75 72  is case configur
ee90: 65 20 74 68 65 20 69 74 65 72 61 74 6f 72 20 73  e the iterator s
eea0: 6f 20 74 68 61 74 20 69 74 20 70 6f 69 6e 74 73  o that it points
eeb0: 20 74 6f 20 74 68 65 0a 20 20 2a 2a 20 66 69 72   to the.  ** fir
eec0: 73 74 20 72 6f 77 69 64 20 6f 6e 20 74 68 69 73  st rowid on this
eed0: 20 70 61 67 65 2e 0a 20 20 2a 2f 0a 20 20 69 66   page..  */.  if
eee0: 28 20 70 4c 61 73 74 20 29 7b 0a 20 20 20 20 69  ( pLast ){.    i
eef0: 6e 74 20 69 4f 66 66 3b 0a 20 20 20 20 66 74 73  nt iOff;.    fts
ef00: 35 44 61 74 61 52 65 6c 65 61 73 65 28 70 49 74  5DataRelease(pIt
ef10: 65 72 2d 3e 70 4c 65 61 66 29 3b 0a 20 20 20 20  er->pLeaf);.    
ef20: 70 49 74 65 72 2d 3e 70 4c 65 61 66 20 3d 20 70  pIter->pLeaf = p
ef30: 4c 61 73 74 3b 0a 20 20 20 20 70 49 74 65 72 2d  Last;.    pIter-
ef40: 3e 69 4c 65 61 66 50 67 6e 6f 20 3d 20 70 67 6e  >iLeafPgno = pgn
ef50: 6f 4c 61 73 74 3b 0a 20 20 20 20 69 4f 66 66 20  oLast;.    iOff 
ef60: 3d 20 66 74 73 35 4c 65 61 66 46 69 72 73 74 52  = fts5LeafFirstR
ef70: 6f 77 69 64 4f 66 66 28 70 4c 61 73 74 29 3b 0a  owidOff(pLast);.
ef80: 20 20 20 20 69 4f 66 66 20 2b 3d 20 66 74 73 35      iOff += fts5
ef90: 47 65 74 56 61 72 69 6e 74 28 26 70 4c 61 73 74  GetVarint(&pLast
efa0: 2d 3e 70 5b 69 4f 66 66 5d 2c 20 28 75 36 34 2a  ->p[iOff], (u64*
efb0: 29 26 70 49 74 65 72 2d 3e 69 52 6f 77 69 64 29  )&pIter->iRowid)
efc0: 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 69 4c 65  ;.    pIter->iLe
efd0: 61 66 4f 66 66 73 65 74 20 3d 20 69 4f 66 66 3b  afOffset = iOff;
efe0: 0a 0a 20 20 20 20 69 66 28 20 66 74 73 35 4c 65  ..    if( fts5Le
eff0: 61 66 49 73 54 65 72 6d 6c 65 73 73 28 70 4c 61  afIsTermless(pLa
f000: 73 74 29 20 29 7b 0a 20 20 20 20 20 20 70 49 74  st) ){.      pIt
f010: 65 72 2d 3e 69 45 6e 64 6f 66 44 6f 63 6c 69 73  er->iEndofDoclis
f020: 74 20 3d 20 70 4c 61 73 74 2d 3e 6e 6e 2b 31 3b  t = pLast->nn+1;
f030: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
f040: 20 20 70 49 74 65 72 2d 3e 69 45 6e 64 6f 66 44    pIter->iEndofD
f050: 6f 63 6c 69 73 74 20 3d 20 66 74 73 35 4c 65 61  oclist = fts5Lea
f060: 66 46 69 72 73 74 54 65 72 6d 4f 66 66 28 70 4c  fFirstTermOff(pL
f070: 61 73 74 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 7d  ast);.    }..  }
f080: 0a 0a 20 20 66 74 73 35 53 65 67 49 74 65 72 52  ..  fts5SegIterR
f090: 65 76 65 72 73 65 49 6e 69 74 50 61 67 65 28 70  everseInitPage(p
f0a0: 2c 20 70 49 74 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a  , pIter);.}../*.
f0b0: 2a 2a 20 49 74 65 72 61 74 6f 72 20 70 49 74 65  ** Iterator pIte
f0c0: 72 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e  r currently poin
f0d0: 74 73 20 74 6f 20 74 68 65 20 66 69 72 73 74 20  ts to the first 
f0e0: 72 6f 77 69 64 20 6f 66 20 61 20 64 6f 63 6c 69  rowid of a docli
f0f0: 73 74 2e 0a 2a 2a 20 54 68 65 72 65 20 69 73 20  st..** There is 
f100: 61 20 64 6f 63 6c 69 73 74 2d 69 6e 64 65 78 20  a doclist-index 
f110: 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
f120: 74 68 65 20 66 69 6e 61 6c 20 74 65 72 6d 20 6f  the final term o
f130: 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 0a 2a  n the current .*
f140: 2a 20 70 61 67 65 2e 20 49 66 20 74 68 65 20 63  * page. If the c
f150: 75 72 72 65 6e 74 20 74 65 72 6d 20 69 73 20 74  urrent term is t
f160: 68 65 20 6c 61 73 74 20 74 65 72 6d 20 6f 6e 20  he last term on 
f170: 74 68 65 20 70 61 67 65 2c 20 6c 6f 61 64 20 74  the page, load t
f180: 68 65 20 0a 2a 2a 20 64 6f 63 6c 69 73 74 2d 69  he .** doclist-i
f190: 6e 64 65 78 20 66 72 6f 6d 20 64 69 73 6b 20 61  ndex from disk a
f1a0: 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 20 61 6e  nd initialize an
f1b0: 20 69 74 65 72 61 74 6f 72 20 61 74 20 28 70 49   iterator at (pI
f1c0: 74 65 72 2d 3e 70 44 6c 69 64 78 29 2e 0a 2a 2f  ter->pDlidx)..*/
f1d0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
f1e0: 35 53 65 67 49 74 65 72 4c 6f 61 64 44 6c 69 64  5SegIterLoadDlid
f1f0: 78 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20  x(Fts5Index *p, 
f200: 46 74 73 35 53 65 67 49 74 65 72 20 2a 70 49 74  Fts5SegIter *pIt
f210: 65 72 29 7b 0a 20 20 69 6e 74 20 69 53 65 67 20  er){.  int iSeg 
f220: 3d 20 70 49 74 65 72 2d 3e 70 53 65 67 2d 3e 69  = pIter->pSeg->i
f230: 53 65 67 69 64 3b 0a 20 20 69 6e 74 20 62 52 65  Segid;.  int bRe
f240: 76 20 3d 20 28 70 49 74 65 72 2d 3e 66 6c 61 67  v = (pIter->flag
f250: 73 20 26 20 46 54 53 35 5f 53 45 47 49 54 45 52  s & FTS5_SEGITER
f260: 5f 52 45 56 45 52 53 45 29 3b 0a 20 20 46 74 73  _REVERSE);.  Fts
f270: 35 44 61 74 61 20 2a 70 4c 65 61 66 20 3d 20 70  5Data *pLeaf = p
f280: 49 74 65 72 2d 3e 70 4c 65 61 66 3b 20 2f 2a 20  Iter->pLeaf; /* 
f290: 43 75 72 72 65 6e 74 20 6c 65 61 66 20 64 61 74  Current leaf dat
f2a0: 61 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  a */..  assert( 
f2b0: 70 49 74 65 72 2d 3e 66 6c 61 67 73 20 26 20 46  pIter->flags & F
f2c0: 54 53 35 5f 53 45 47 49 54 45 52 5f 4f 4e 45 54  TS5_SEGITER_ONET
f2d0: 45 52 4d 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ERM );.  assert(
f2e0: 20 70 49 74 65 72 2d 3e 70 44 6c 69 64 78 3d 3d   pIter->pDlidx==
f2f0: 30 20 29 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b  0 );..  /* Check
f300: 20 69 66 20 74 68 65 20 63 75 72 72 65 6e 74 20   if the current 
f310: 64 6f 63 6c 69 73 74 20 65 6e 64 73 20 6f 6e 20  doclist ends on 
f320: 74 68 69 73 20 70 61 67 65 2e 20 49 66 20 69 74  this page. If it
f330: 20 64 6f 65 73 2c 20 72 65 74 75 72 6e 0a 20 20   does, return.  
f340: 2a 2a 20 65 61 72 6c 79 20 77 69 74 68 6f 75 74  ** early without
f350: 20 6c 6f 61 64 69 6e 67 20 74 68 65 20 64 6f 63   loading the doc
f360: 6c 69 73 74 2d 69 6e 64 65 78 20 28 61 73 20 69  list-index (as i
f370: 74 20 62 65 6c 6f 6e 67 73 20 74 6f 20 61 20 64  t belongs to a d
f380: 69 66 66 65 72 65 6e 74 0a 20 20 2a 2a 20 74 65  ifferent.  ** te
f390: 72 6d 2e 20 2a 2f 0a 20 20 69 66 28 20 70 49 74  rm. */.  if( pIt
f3a0: 65 72 2d 3e 69 54 65 72 6d 4c 65 61 66 50 67 6e  er->iTermLeafPgn
f3b0: 6f 3d 3d 70 49 74 65 72 2d 3e 69 4c 65 61 66 50  o==pIter->iLeafP
f3c0: 67 6e 6f 20 0a 20 20 20 26 26 20 70 49 74 65 72  gno .   && pIter
f3d0: 2d 3e 69 45 6e 64 6f 66 44 6f 63 6c 69 73 74 3c  ->iEndofDoclist<
f3e0: 70 4c 65 61 66 2d 3e 73 7a 4c 65 61 66 20 0a 20  pLeaf->szLeaf . 
f3f0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a   ){.    return;.
f400: 20 20 7d 0a 0a 20 20 70 49 74 65 72 2d 3e 70 44    }..  pIter->pD
f410: 6c 69 64 78 20 3d 20 66 74 73 35 44 6c 69 64 78  lidx = fts5Dlidx
f420: 49 74 65 72 49 6e 69 74 28 70 2c 20 62 52 65 76  IterInit(p, bRev
f430: 2c 20 69 53 65 67 2c 20 70 49 74 65 72 2d 3e 69  , iSeg, pIter->i
f440: 54 65 72 6d 4c 65 61 66 50 67 6e 6f 29 3b 0a 7d  TermLeafPgno);.}
f450: 0a 0a 23 64 65 66 69 6e 65 20 66 74 73 35 49 6e  ..#define fts5In
f460: 64 65 78 47 65 74 56 61 72 69 6e 74 33 32 28 61  dexGetVarint32(a
f470: 2c 20 69 4f 66 66 2c 20 6e 56 61 6c 29 20 7b 20  , iOff, nVal) { 
f480: 20 20 20 20 5c 0a 20 20 6e 56 61 6c 20 3d 20 28      \.  nVal = (
f490: 61 29 5b 69 4f 66 66 2b 2b 5d 3b 20 20 20 20 20  a)[iOff++];     
f4a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f4b0: 20 20 20 20 20 20 20 20 5c 0a 20 20 69 66 28 20          \.  if( 
f4c0: 6e 56 61 6c 20 26 20 30 78 38 30 20 29 7b 20 20  nVal & 0x80 ){  
f4d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f4e0: 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
f4f0: 20 20 69 4f 66 66 2d 2d 3b 20 20 20 20 20 20 20    iOff--;       
f500: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f510: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f520: 5c 0a 20 20 20 20 69 4f 66 66 20 2b 3d 20 66 74  \.    iOff += ft
f530: 73 35 47 65 74 56 61 72 69 6e 74 33 32 28 26 28  s5GetVarint32(&(
f540: 61 29 5b 69 4f 66 66 5d 2c 20 6e 56 61 6c 29 3b  a)[iOff], nVal);
f550: 20 20 20 20 5c 0a 20 20 7d 20 20 20 20 20 20 20      \.  }       
f560: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f570: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f580: 20 20 20 20 20 20 20 20 5c 0a 7d 0a 0a 23 64 65          \.}..#de
f590: 66 69 6e 65 20 66 74 73 35 49 6e 64 65 78 53 6b  fine fts5IndexSk
f5a0: 69 70 56 61 72 69 6e 74 28 61 2c 20 69 4f 66 66  ipVarint(a, iOff
f5b0: 29 20 7b 20 20 20 20 20 20 20 20 20 20 20 20 5c  ) {            \
f5c0: 0a 20 20 69 6e 74 20 69 45 6e 64 20 3d 20 69 4f  .  int iEnd = iO
f5d0: 66 66 2b 39 3b 20 20 20 20 20 20 20 20 20 20 20  ff+9;           
f5e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f5f0: 20 20 20 5c 0a 20 20 77 68 69 6c 65 28 20 28 61     \.  while( (a
f600: 5b 69 4f 66 66 2b 2b 5d 20 26 20 30 78 38 30 29  [iOff++] & 0x80)
f610: 20 26 26 20 69 4f 66 66 3c 69 45 6e 64 20 29 3b   && iOff<iEnd );
f620: 20 20 20 20 20 20 20 5c 0a 7d 0a 0a 2f 2a 0a 2a         \.}../*.*
f630: 2a 20 54 68 65 20 69 74 65 72 61 74 6f 72 20 6f  * The iterator o
f640: 62 6a 65 63 74 20 70 61 73 73 65 64 20 61 73 20  bject passed as 
f650: 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  the second argum
f660: 65 6e 74 20 63 75 72 72 65 6e 74 6c 79 20 63 6f  ent currently co
f670: 6e 74 61 69 6e 73 0a 2a 2a 20 6e 6f 20 76 61 6c  ntains.** no val
f680: 69 64 20 76 61 6c 75 65 73 20 65 78 63 65 70 74  id values except
f690: 20 66 6f 72 20 74 68 65 20 46 74 73 35 53 65 67   for the Fts5Seg
f6a0: 49 74 65 72 2e 70 4c 65 61 66 20 6d 65 6d 62 65  Iter.pLeaf membe
f6b0: 72 20 76 61 72 69 61 62 6c 65 2e 20 54 68 69 73  r variable. This
f6c0: 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 73 65 61  .** function sea
f6d0: 72 63 68 65 73 20 74 68 65 20 6c 65 61 66 20 70  rches the leaf p
f6e0: 61 67 65 20 66 6f 72 20 61 20 74 65 72 6d 20 6d  age for a term m
f6f0: 61 74 63 68 69 6e 67 20 28 70 54 65 72 6d 2f 6e  atching (pTerm/n
f700: 54 65 72 6d 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  Term)..**.** If 
f710: 74 68 65 20 73 70 65 63 69 66 69 65 64 20 74 65  the specified te
f720: 72 6d 20 69 73 20 66 6f 75 6e 64 20 6f 6e 20 74  rm is found on t
f730: 68 65 20 70 61 67 65 2c 20 74 68 65 6e 20 74 68  he page, then th
f740: 65 20 69 74 65 72 61 74 6f 72 20 69 73 20 6c 65  e iterator is le
f750: 66 74 0a 2a 2a 20 70 6f 69 6e 74 69 6e 67 20 74  ft.** pointing t
f760: 6f 20 69 74 2e 20 49 66 20 61 72 67 75 6d 65 6e  o it. If argumen
f770: 74 20 62 47 65 20 69 73 20 7a 65 72 6f 20 61 6e  t bGe is zero an
f780: 64 20 74 68 65 20 74 65 72 6d 20 69 73 20 6e 6f  d the term is no
f790: 74 20 66 6f 75 6e 64 2c 0a 2a 2a 20 74 68 65 20  t found,.** the 
f7a0: 69 74 65 72 61 74 6f 72 20 69 73 20 6c 65 66 74  iterator is left
f7b0: 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 45 4f 46   pointing at EOF
f7c0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 62 47 65 20 69  ..**.** If bGe i
f7d0: 73 20 6e 6f 6e 2d 7a 65 72 6f 20 61 6e 64 20 74  s non-zero and t
f7e0: 68 65 20 73 70 65 63 69 66 69 65 64 20 74 65 72  he specified ter
f7f0: 6d 20 69 73 20 6e 6f 74 20 66 6f 75 6e 64 2c 20  m is not found, 
f800: 74 68 65 6e 20 74 68 65 0a 2a 2a 20 69 74 65 72  then the.** iter
f810: 61 74 6f 72 20 69 73 20 6c 65 66 74 20 70 6f 69  ator is left poi
f820: 6e 74 69 6e 67 20 74 6f 20 74 68 65 20 73 6d 61  nting to the sma
f830: 6c 6c 65 73 74 20 74 65 72 6d 20 69 6e 20 74 68  llest term in th
f840: 65 20 73 65 67 6d 65 6e 74 20 74 68 61 74 0a 2a  e segment that.*
f850: 2a 20 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e  * is larger than
f860: 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20 74   the specified t
f870: 65 72 6d 2c 20 65 76 65 6e 20 69 66 20 74 68 69  erm, even if thi
f880: 73 20 74 65 72 6d 20 69 73 20 6e 6f 74 20 6f 6e  s term is not on
f890: 20 74 68 65 0a 2a 2a 20 63 75 72 72 65 6e 74 20   the.** current 
f8a0: 70 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  page..*/.static 
f8b0: 76 6f 69 64 20 66 74 73 35 4c 65 61 66 53 65 65  void fts5LeafSee
f8c0: 6b 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a  k(.  Fts5Index *
f8d0: 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
f8e0: 20 20 20 20 20 2f 2a 20 4c 65 61 76 65 20 61 6e       /* Leave an
f8f0: 79 20 65 72 72 6f 72 20 63 6f 64 65 20 68 65 72  y error code her
f900: 65 20 2a 2f 0a 20 20 69 6e 74 20 62 47 65 2c 20  e */.  int bGe, 
f910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f920: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66         /* True f
f930: 6f 72 20 61 20 3e 3d 20 73 65 61 72 63 68 20 2a  or a >= search *
f940: 2f 0a 20 20 46 74 73 35 53 65 67 49 74 65 72 20  /.  Fts5SegIter 
f950: 2a 70 49 74 65 72 2c 20 20 20 20 20 20 20 20 20  *pIter,         
f960: 20 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20      /* Iterator 
f970: 74 6f 20 73 65 65 6b 20 2a 2f 0a 20 20 63 6f 6e  to seek */.  con
f980: 73 74 20 75 38 20 2a 70 54 65 72 6d 2c 20 69 6e  st u8 *pTerm, in
f990: 74 20 6e 54 65 72 6d 20 20 20 20 20 20 2f 2a 20  t nTerm      /* 
f9a0: 54 65 72 6d 20 74 6f 20 73 65 61 72 63 68 20 66  Term to search f
f9b0: 6f 72 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69  or */.){.  int i
f9c0: 4f 66 66 3b 0a 20 20 63 6f 6e 73 74 20 75 38 20  Off;.  const u8 
f9d0: 2a 61 20 3d 20 70 49 74 65 72 2d 3e 70 4c 65 61  *a = pIter->pLea
f9e0: 66 2d 3e 70 3b 0a 20 20 69 6e 74 20 73 7a 4c 65  f->p;.  int szLe
f9f0: 61 66 20 3d 20 70 49 74 65 72 2d 3e 70 4c 65 61  af = pIter->pLea
fa00: 66 2d 3e 73 7a 4c 65 61 66 3b 0a 20 20 69 6e 74  f->szLeaf;.  int
fa10: 20 6e 20 3d 20 70 49 74 65 72 2d 3e 70 4c 65 61   n = pIter->pLea
fa20: 66 2d 3e 6e 6e 3b 0a 0a 20 20 69 6e 74 20 6e 4d  f->nn;..  int nM
fa30: 61 74 63 68 20 3d 20 30 3b 0a 20 20 69 6e 74 20  atch = 0;.  int 
fa40: 6e 4b 65 65 70 20 3d 20 30 3b 0a 20 20 69 6e 74  nKeep = 0;.  int
fa50: 20 6e 4e 65 77 20 3d 20 30 3b 0a 20 20 69 6e 74   nNew = 0;.  int
fa60: 20 69 54 65 72 6d 4f 66 66 3b 0a 20 20 69 6e 74   iTermOff;.  int
fa70: 20 69 50 67 69 64 78 3b 20 20 20 20 20 20 20 20   iPgidx;        
fa80: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
fa90: 43 75 72 72 65 6e 74 20 6f 66 66 73 65 74 20 69  Current offset i
faa0: 6e 20 70 67 69 64 78 20 2a 2f 0a 20 20 69 6e 74  n pgidx */.  int
fab0: 20 62 45 6e 64 4f 66 50 61 67 65 20 3d 20 30 3b   bEndOfPage = 0;
fac0: 0a 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72  ..  assert( p->r
fad0: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  c==SQLITE_OK );.
fae0: 0a 20 20 69 50 67 69 64 78 20 3d 20 73 7a 4c 65  .  iPgidx = szLe
faf0: 61 66 3b 0a 20 20 69 50 67 69 64 78 20 2b 3d 20  af;.  iPgidx += 
fb00: 66 74 73 35 47 65 74 56 61 72 69 6e 74 33 32 28  fts5GetVarint32(
fb10: 26 61 5b 69 50 67 69 64 78 5d 2c 20 69 54 65 72  &a[iPgidx], iTer
fb20: 6d 4f 66 66 29 3b 0a 20 20 69 4f 66 66 20 3d 20  mOff);.  iOff = 
fb30: 69 54 65 72 6d 4f 66 66 3b 0a 0a 20 20 77 68 69  iTermOff;..  whi
fb40: 6c 65 28 20 31 20 29 7b 0a 0a 20 20 20 20 2f 2a  le( 1 ){..    /*
fb50: 20 46 69 67 75 72 65 20 6f 75 74 20 68 6f 77 20   Figure out how 
fb60: 6d 61 6e 79 20 6e 65 77 20 62 79 74 65 73 20 61  many new bytes a
fb70: 72 65 20 69 6e 20 74 68 69 73 20 74 65 72 6d 20  re in this term 
fb80: 2a 2f 0a 20 20 20 20 66 74 73 35 49 6e 64 65 78  */.    fts5Index
fb90: 47 65 74 56 61 72 69 6e 74 33 32 28 61 2c 20 69  GetVarint32(a, i
fba0: 4f 66 66 2c 20 6e 4e 65 77 29 3b 0a 20 20 20 20  Off, nNew);.    
fbb0: 69 66 28 20 6e 4b 65 65 70 3c 6e 4d 61 74 63 68  if( nKeep<nMatch
fbc0: 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73   ){.      goto s
fbd0: 65 61 72 63 68 5f 66 61 69 6c 65 64 3b 0a 20 20  earch_failed;.  
fbe0: 20 20 7d 0a 0a 20 20 20 20 61 73 73 65 72 74 28    }..    assert(
fbf0: 20 6e 4b 65 65 70 3e 3d 6e 4d 61 74 63 68 20 29   nKeep>=nMatch )
fc00: 3b 0a 20 20 20 20 69 66 28 20 6e 4b 65 65 70 3d  ;.    if( nKeep=
fc10: 3d 6e 4d 61 74 63 68 20 29 7b 0a 20 20 20 20 20  =nMatch ){.     
fc20: 20 69 6e 74 20 6e 43 6d 70 3b 0a 20 20 20 20 20   int nCmp;.     
fc30: 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 6e 43   int i;.      nC
fc40: 6d 70 20 3d 20 4d 49 4e 28 6e 4e 65 77 2c 20 6e  mp = MIN(nNew, n
fc50: 54 65 72 6d 2d 6e 4d 61 74 63 68 29 3b 0a 20 20  Term-nMatch);.  
fc60: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
fc70: 43 6d 70 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Cmp; i++){.     
fc80: 20 20 20 69 66 28 20 61 5b 69 4f 66 66 2b 69 5d     if( a[iOff+i]
fc90: 21 3d 70 54 65 72 6d 5b 6e 4d 61 74 63 68 2b 69  !=pTerm[nMatch+i
fca0: 5d 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  ] ) break;.     
fcb0: 20 7d 0a 20 20 20 20 20 20 6e 4d 61 74 63 68 20   }.      nMatch 
fcc0: 2b 3d 20 69 3b 0a 0a 20 20 20 20 20 20 69 66 28  += i;..      if(
fcd0: 20 6e 54 65 72 6d 3d 3d 6e 4d 61 74 63 68 20 29   nTerm==nMatch )
fce0: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 3d  {.        if( i=
fcf0: 3d 6e 4e 65 77 20 29 7b 0a 20 20 20 20 20 20 20  =nNew ){.       
fd00: 20 20 20 67 6f 74 6f 20 73 65 61 72 63 68 5f 73     goto search_s
fd10: 75 63 63 65 73 73 3b 0a 20 20 20 20 20 20 20 20  uccess;.        
fd20: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
fd30: 20 67 6f 74 6f 20 73 65 61 72 63 68 5f 66 61 69   goto search_fai
fd40: 6c 65 64 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  led;.        }. 
fd50: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 69       }else if( i
fd60: 3c 6e 4e 65 77 20 26 26 20 61 5b 69 4f 66 66 2b  <nNew && a[iOff+
fd70: 69 5d 3e 70 54 65 72 6d 5b 6e 4d 61 74 63 68 5d  i]>pTerm[nMatch]
fd80: 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f   ){.        goto
fd90: 20 73 65 61 72 63 68 5f 66 61 69 6c 65 64 3b 0a   search_failed;.
fda0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
fdb0: 20 20 20 69 66 28 20 69 50 67 69 64 78 3e 3d 6e     if( iPgidx>=n
fdc0: 20 29 7b 0a 20 20 20 20 20 20 62 45 6e 64 4f 66   ){.      bEndOf
fdd0: 50 61 67 65 20 3d 20 31 3b 0a 20 20 20 20 20 20  Page = 1;.      
fde0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20  break;.    }..  
fdf0: 20 20 69 50 67 69 64 78 20 2b 3d 20 66 74 73 35    iPgidx += fts5
fe00: 47 65 74 56 61 72 69 6e 74 33 32 28 26 61 5b 69  GetVarint32(&a[i
fe10: 50 67 69 64 78 5d 2c 20 6e 4b 65 65 70 29 3b 0a  Pgidx], nKeep);.
fe20: 20 20 20 20 69 54 65 72 6d 4f 66 66 20 2b 3d 20      iTermOff += 
fe30: 6e 4b 65 65 70 3b 0a 20 20 20 20 69 4f 66 66 20  nKeep;.    iOff 
fe40: 3d 20 69 54 65 72 6d 4f 66 66 3b 0a 0a 20 20 20  = iTermOff;..   
fe50: 20 2f 2a 20 52 65 61 64 20 74 68 65 20 6e 4b 65   /* Read the nKe
fe60: 65 70 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20  ep field of the 
fe70: 6e 65 78 74 20 74 65 72 6d 2e 20 2a 2f 0a 20 20  next term. */.  
fe80: 20 20 66 74 73 35 49 6e 64 65 78 47 65 74 56 61    fts5IndexGetVa
fe90: 72 69 6e 74 33 32 28 61 2c 20 69 4f 66 66 2c 20  rint32(a, iOff, 
fea0: 6e 4b 65 65 70 29 3b 0a 20 20 7d 0a 0a 20 73 65  nKeep);.  }.. se
feb0: 61 72 63 68 5f 66 61 69 6c 65 64 3a 0a 20 20 69  arch_failed:.  i
fec0: 66 28 20 62 47 65 3d 3d 30 20 29 7b 0a 20 20 20  f( bGe==0 ){.   
fed0: 20 66 74 73 35 44 61 74 61 52 65 6c 65 61 73 65   fts5DataRelease
fee0: 28 70 49 74 65 72 2d 3e 70 4c 65 61 66 29 3b 0a  (pIter->pLeaf);.
fef0: 20 20 20 20 70 49 74 65 72 2d 3e 70 4c 65 61 66      pIter->pLeaf
ff00: 20 3d 20 30 3b 0a 20 20 20 20 72 65 74 75 72 6e   = 0;.    return
ff10: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 62 45  ;.  }else if( bE
ff20: 6e 64 4f 66 50 61 67 65 20 29 7b 0a 20 20 20 20  ndOfPage ){.    
ff30: 64 6f 20 7b 0a 20 20 20 20 20 20 66 74 73 35 53  do {.      fts5S
ff40: 65 67 49 74 65 72 4e 65 78 74 50 61 67 65 28 70  egIterNextPage(p
ff50: 2c 20 70 49 74 65 72 29 3b 0a 20 20 20 20 20 20  , pIter);.      
ff60: 69 66 28 20 70 49 74 65 72 2d 3e 70 4c 65 61 66  if( pIter->pLeaf
ff70: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
ff80: 20 20 20 20 61 20 3d 20 70 49 74 65 72 2d 3e 70      a = pIter->p
ff90: 4c 65 61 66 2d 3e 70 3b 0a 20 20 20 20 20 20 69  Leaf->p;.      i
ffa0: 66 28 20 66 74 73 35 4c 65 61 66 49 73 54 65 72  f( fts5LeafIsTer
ffb0: 6d 6c 65 73 73 28 70 49 74 65 72 2d 3e 70 4c 65  mless(pIter->pLe
ffc0: 61 66 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  af)==0 ){.      
ffd0: 20 20 66 74 73 35 47 65 74 56 61 72 69 6e 74 33    fts5GetVarint3
ffe0: 32 28 26 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d  2(&pIter->pLeaf-
fff0: 3e 70 5b 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d  >p[pIter->pLeaf-
10000 3e 73 7a 4c 65 61 66 5d 2c 20 69 4f 66 66 29 3b  >szLeaf], iOff);
10010 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 4f 66  .        if( iOf
10020 66 3c 34 20 7c 7c 20 69 4f 66 66 3e 3d 70 49 74  f<4 || iOff>=pIt
10030 65 72 2d 3e 70 4c 65 61 66 2d 3e 73 7a 4c 65 61  er->pLeaf->szLea
10040 66 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  f ){.          p
10050 2d 3e 72 63 20 3d 20 46 54 53 35 5f 43 4f 52 52  ->rc = FTS5_CORR
10060 55 50 54 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  UPT;.        }el
10070 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 6e 4b  se{.          nK
10080 65 65 70 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  eep = 0;.       
10090 20 20 20 69 4f 66 66 20 2b 3d 20 66 74 73 35 47     iOff += fts5G
100a0 65 74 56 61 72 69 6e 74 33 32 28 26 61 5b 69 4f  etVarint32(&a[iO
100b0 66 66 5d 2c 20 6e 4e 65 77 29 3b 0a 20 20 20 20  ff], nNew);.    
100c0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
100d0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
100e0 20 20 20 7d 77 68 69 6c 65 28 20 31 20 29 3b 0a     }while( 1 );.
100f0 20 20 7d 0a 0a 20 73 65 61 72 63 68 5f 73 75 63    }.. search_suc
10100 63 65 73 73 3a 0a 0a 20 20 70 49 74 65 72 2d 3e  cess:..  pIter->
10110 69 4c 65 61 66 4f 66 66 73 65 74 20 3d 20 69 4f  iLeafOffset = iO
10120 66 66 20 2b 20 6e 4e 65 77 3b 0a 20 20 70 49 74  ff + nNew;.  pIt
10130 65 72 2d 3e 69 54 65 72 6d 4c 65 61 66 4f 66 66  er->iTermLeafOff
10140 73 65 74 20 3d 20 70 49 74 65 72 2d 3e 69 4c 65  set = pIter->iLe
10150 61 66 4f 66 66 73 65 74 3b 0a 20 20 70 49 74 65  afOffset;.  pIte
10160 72 2d 3e 69 54 65 72 6d 4c 65 61 66 50 67 6e 6f  r->iTermLeafPgno
10170 20 3d 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 50   = pIter->iLeafP
10180 67 6e 6f 3b 0a 0a 20 20 66 74 73 35 42 75 66 66  gno;..  fts5Buff
10190 65 72 53 65 74 28 26 70 2d 3e 72 63 2c 20 26 70  erSet(&p->rc, &p
101a0 49 74 65 72 2d 3e 74 65 72 6d 2c 20 6e 4b 65 65  Iter->term, nKee
101b0 70 2c 20 70 54 65 72 6d 29 3b 0a 20 20 66 74 73  p, pTerm);.  fts
101c0 35 42 75 66 66 65 72 41 70 70 65 6e 64 42 6c 6f  5BufferAppendBlo
101d0 62 28 26 70 2d 3e 72 63 2c 20 26 70 49 74 65 72  b(&p->rc, &pIter
101e0 2d 3e 74 65 72 6d 2c 20 6e 4e 65 77 2c 20 26 61  ->term, nNew, &a
101f0 5b 69 4f 66 66 5d 29 3b 0a 0a 20 20 69 66 28 20  [iOff]);..  if( 
10200 69 50 67 69 64 78 3e 3d 6e 20 29 7b 0a 20 20 20  iPgidx>=n ){.   
10210 20 70 49 74 65 72 2d 3e 69 45 6e 64 6f 66 44 6f   pIter->iEndofDo
10220 63 6c 69 73 74 20 3d 20 70 49 74 65 72 2d 3e 70  clist = pIter->p
10230 4c 65 61 66 2d 3e 6e 6e 2b 31 3b 0a 20 20 7d 65  Leaf->nn+1;.  }e
10240 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 6e 45 78  lse{.    int nEx
10250 74 72 61 3b 0a 20 20 20 20 69 50 67 69 64 78 20  tra;.    iPgidx 
10260 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e 74  += fts5GetVarint
10270 33 32 28 26 61 5b 69 50 67 69 64 78 5d 2c 20 6e  32(&a[iPgidx], n
10280 45 78 74 72 61 29 3b 0a 20 20 20 20 70 49 74 65  Extra);.    pIte
10290 72 2d 3e 69 45 6e 64 6f 66 44 6f 63 6c 69 73 74  r->iEndofDoclist
102a0 20 3d 20 69 54 65 72 6d 4f 66 66 20 2b 20 6e 45   = iTermOff + nE
102b0 78 74 72 61 3b 0a 20 20 7d 0a 20 20 70 49 74 65  xtra;.  }.  pIte
102c0 72 2d 3e 69 50 67 69 64 78 4f 66 66 20 3d 20 69  r->iPgidxOff = i
102d0 50 67 69 64 78 3b 0a 0a 20 20 66 74 73 35 53 65  Pgidx;..  fts5Se
102e0 67 49 74 65 72 4c 6f 61 64 52 6f 77 69 64 28 70  gIterLoadRowid(p
102f0 2c 20 70 49 74 65 72 29 3b 0a 20 20 66 74 73 35  , pIter);.  fts5
10300 53 65 67 49 74 65 72 4c 6f 61 64 4e 50 6f 73 28  SegIterLoadNPos(
10310 70 2c 20 70 49 74 65 72 29 3b 0a 7d 0a 0a 2f 2a  p, pIter);.}../*
10320 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74  .** Initialize t
10330 68 65 20 6f 62 6a 65 63 74 20 70 49 74 65 72 20  he object pIter 
10340 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 65 72 6d  to point to term
10350 20 70 54 65 72 6d 2f 6e 54 65 72 6d 20 77 69 74   pTerm/nTerm wit
10360 68 69 6e 20 73 65 67 6d 65 6e 74 0a 2a 2a 20 70  hin segment.** p
10370 53 65 67 2e 20 49 66 20 74 68 65 72 65 20 69 73  Seg. If there is
10380 20 6e 6f 20 73 75 63 68 20 74 65 72 6d 20 69 6e   no such term in
10390 20 74 68 65 20 69 6e 64 65 78 2c 20 74 68 65 20   the index, the 
103a0 69 74 65 72 61 74 6f 72 20 69 73 20 73 65 74 20  iterator is set 
103b0 74 6f 20 45 4f 46 2e 0a 2a 2a 0a 2a 2a 20 49 66  to EOF..**.** If
103c0 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
103d0 2c 20 46 74 73 35 49 6e 64 65 78 2e 72 63 20 69  , Fts5Index.rc i
103e0 73 20 73 65 74 20 74 6f 20 61 6e 20 61 70 70 72  s set to an appr
103f0 6f 70 72 69 61 74 65 20 65 72 72 6f 72 20 63 6f  opriate error co
10400 64 65 2e 20 49 66 20 0a 2a 2a 20 61 6e 20 65 72  de. If .** an er
10410 72 6f 72 20 68 61 73 20 61 6c 72 65 61 64 79 20  ror has already 
10420 6f 63 63 75 72 72 65 64 20 77 68 65 6e 20 74 68  occurred when th
10430 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
10440 61 6c 6c 65 64 2c 20 69 74 20 69 73 20 61 20 6e  alled, it is a n
10450 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  o-op..*/.static 
10460 76 6f 69 64 20 66 74 73 35 53 65 67 49 74 65 72  void fts5SegIter
10470 53 65 65 6b 49 6e 69 74 28 0a 20 20 46 74 73 35  SeekInit(.  Fts5
10480 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20  Index *p,       
10490 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
104a0 54 53 35 20 62 61 63 6b 65 6e 64 20 2a 2f 0a 20  TS5 backend */. 
104b0 20 46 74 73 35 42 75 66 66 65 72 20 2a 70 42 75   Fts5Buffer *pBu
104c0 66 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  f,              
104d0 20 2f 2a 20 42 75 66 66 65 72 20 74 6f 20 75 73   /* Buffer to us
104e0 65 20 66 6f 72 20 6c 6f 61 64 69 6e 67 20 70 61  e for loading pa
104f0 67 65 73 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 75  ges */.  const u
10500 38 20 2a 70 54 65 72 6d 2c 20 69 6e 74 20 6e 54  8 *pTerm, int nT
10510 65 72 6d 2c 20 20 20 20 20 2f 2a 20 54 65 72 6d  erm,     /* Term
10520 20 74 6f 20 73 65 65 6b 20 74 6f 20 2a 2f 0a 20   to seek to */. 
10530 20 69 6e 74 20 66 6c 61 67 73 2c 20 20 20 20 20   int flags,     
10540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10550 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 46 54 53 35   /* Mask of FTS5
10560 49 4e 44 45 58 5f 58 58 58 20 66 6c 61 67 73 20  INDEX_XXX flags 
10570 2a 2f 0a 20 20 46 74 73 35 53 74 72 75 63 74 75  */.  Fts5Structu
10580 72 65 53 65 67 6d 65 6e 74 20 2a 70 53 65 67 2c  reSegment *pSeg,
10590 20 20 20 20 20 2f 2a 20 44 65 73 63 72 69 70 74       /* Descript
105a0 69 6f 6e 20 6f 66 20 73 65 67 6d 65 6e 74 20 2a  ion of segment *
105b0 2f 0a 20 20 46 74 73 35 53 65 67 49 74 65 72 20  /.  Fts5SegIter 
105c0 2a 70 49 74 65 72 20 20 20 20 20 20 20 20 20 20  *pIter          
105d0 20 20 20 20 2f 2a 20 4f 62 6a 65 63 74 20 74 6f      /* Object to
105e0 20 70 6f 70 75 6c 61 74 65 20 2a 2f 0a 29 7b 0a   populate */.){.
105f0 20 20 69 6e 74 20 69 50 67 20 3d 20 31 3b 0a 20    int iPg = 1;. 
10600 20 69 6e 74 20 62 47 65 20 3d 20 28 66 6c 61 67   int bGe = (flag
10610 73 20 26 20 46 54 53 35 49 4e 44 45 58 5f 51 55  s & FTS5INDEX_QU
10620 45 52 59 5f 53 43 41 4e 29 3b 0a 20 20 69 6e 74  ERY_SCAN);.  int
10630 20 62 44 6c 69 64 78 20 3d 20 30 3b 20 20 20 20   bDlidx = 0;    
10640 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
10650 54 72 75 65 20 69 66 20 74 68 65 72 65 20 69 73  True if there is
10660 20 61 20 64 6f 63 6c 69 73 74 2d 69 6e 64 65 78   a doclist-index
10670 20 2a 2f 0a 0a 20 20 73 74 61 74 69 63 20 69 6e   */..  static in
10680 74 20 6e 43 61 6c 6c 20 3d 20 30 3b 0a 20 20 6e  t nCall = 0;.  n
10690 43 61 6c 6c 2b 2b 3b 0a 0a 20 20 61 73 73 65 72  Call++;..  asser
106a0 74 28 20 62 47 65 3d 3d 30 20 7c 7c 20 28 66 6c  t( bGe==0 || (fl
106b0 61 67 73 20 26 20 46 54 53 35 49 4e 44 45 58 5f  ags & FTS5INDEX_
106c0 51 55 45 52 59 5f 44 45 53 43 29 3d 3d 30 20 29  QUERY_DESC)==0 )
106d0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 54 65 72  ;.  assert( pTer
106e0 6d 20 26 26 20 6e 54 65 72 6d 20 29 3b 0a 20 20  m && nTerm );.  
106f0 6d 65 6d 73 65 74 28 70 49 74 65 72 2c 20 30 2c  memset(pIter, 0,
10700 20 73 69 7a 65 6f 66 28 2a 70 49 74 65 72 29 29   sizeof(*pIter))
10710 3b 0a 20 20 70 49 74 65 72 2d 3e 70 53 65 67 20  ;.  pIter->pSeg 
10720 3d 20 70 53 65 67 3b 0a 0a 20 20 2f 2a 20 54 68  = pSeg;..  /* Th
10730 69 73 20 62 6c 6f 63 6b 20 73 65 74 73 20 73 74  is block sets st
10740 61 63 6b 20 76 61 72 69 61 62 6c 65 20 69 50 67  ack variable iPg
10750 20 74 6f 20 74 68 65 20 6c 65 61 66 20 70 61 67   to the leaf pag
10760 65 20 6e 75 6d 62 65 72 20 74 68 61 74 20 6d 61  e number that ma
10770 79 0a 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 20 74  y.  ** contain t
10780 65 72 6d 20 28 70 54 65 72 6d 2f 6e 54 65 72 6d  erm (pTerm/nTerm
10790 29 2c 20 69 66 20 69 74 20 69 73 20 70 72 65 73  ), if it is pres
107a0 65 6e 74 20 69 6e 20 74 68 65 20 73 65 67 6d 65  ent in the segme
107b0 6e 74 2e 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e  nt. */.  if( p->
107c0 70 49 64 78 53 65 6c 65 63 74 3d 3d 30 20 29 7b  pIdxSelect==0 ){
107d0 0a 20 20 20 20 46 74 73 35 43 6f 6e 66 69 67 20  .    Fts5Config 
107e0 2a 70 43 6f 6e 66 69 67 20 3d 20 70 2d 3e 70 43  *pConfig = p->pC
107f0 6f 6e 66 69 67 3b 0a 20 20 20 20 66 74 73 35 49  onfig;.    fts5I
10800 6e 64 65 78 50 72 65 70 61 72 65 53 74 6d 74 28  ndexPrepareStmt(
10810 70 2c 20 26 70 2d 3e 70 49 64 78 53 65 6c 65 63  p, &p->pIdxSelec
10820 74 2c 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e  t, sqlite3_mprin
10830 74 66 28 0a 20 20 20 20 20 20 20 20 20 20 22 53  tf(.          "S
10840 45 4c 45 43 54 20 70 67 6e 6f 20 46 52 4f 4d 20  ELECT pgno FROM 
10850 27 25 71 27 2e 27 25 71 5f 69 64 78 27 20 57 48  '%q'.'%q_idx' WH
10860 45 52 45 20 22 0a 20 20 20 20 20 20 20 20 20 20  ERE ".          
10870 22 73 65 67 69 64 3d 3f 20 41 4e 44 20 74 65 72  "segid=? AND ter
10880 6d 3c 3d 3f 20 4f 52 44 45 52 20 42 59 20 74 65  m<=? ORDER BY te
10890 72 6d 20 44 45 53 43 20 4c 49 4d 49 54 20 31 22  rm DESC LIMIT 1"
108a0 2c 0a 20 20 20 20 20 20 20 20 20 20 70 43 6f 6e  ,.          pCon
108b0 66 69 67 2d 3e 7a 44 62 2c 20 70 43 6f 6e 66 69  fig->zDb, pConfi
108c0 67 2d 3e 7a 4e 61 6d 65 0a 20 20 20 20 29 29 3b  g->zName.    ));
108d0 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 72 63  .  }.  if( p->rc
108e0 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 73 71 6c   ) return;.  sql
108f0 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 28 70 2d  ite3_bind_int(p-
10900 3e 70 49 64 78 53 65 6c 65 63 74 2c 20 31 2c 20  >pIdxSelect, 1, 
10910 70 53 65 67 2d 3e 69 53 65 67 69 64 29 3b 0a 20  pSeg->iSegid);. 
10920 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 62 6c   sqlite3_bind_bl
10930 6f 62 28 70 2d 3e 70 49 64 78 53 65 6c 65 63 74  ob(p->pIdxSelect
10940 2c 20 32 2c 20 70 54 65 72 6d 2c 20 6e 54 65 72  , 2, pTerm, nTer
10950 6d 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43  m, SQLITE_STATIC
10960 29 3b 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f  );.  if( SQLITE_
10970 52 4f 57 3d 3d 73 71 6c 69 74 65 33 5f 73 74 65  ROW==sqlite3_ste
10980 70 28 70 2d 3e 70 49 64 78 53 65 6c 65 63 74 29  p(p->pIdxSelect)
10990 20 29 7b 0a 20 20 20 20 69 36 34 20 76 61 6c 20   ){.    i64 val 
109a0 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  = sqlite3_column
109b0 5f 69 6e 74 28 70 2d 3e 70 49 64 78 53 65 6c 65  _int(p->pIdxSele
109c0 63 74 2c 20 30 29 3b 0a 20 20 20 20 69 50 67 20  ct, 0);.    iPg 
109d0 3d 20 28 69 6e 74 29 28 76 61 6c 3e 3e 31 29 3b  = (int)(val>>1);
109e0 0a 20 20 20 20 62 44 6c 69 64 78 20 3d 20 28 76  .    bDlidx = (v
109f0 61 6c 20 26 20 30 78 30 30 30 31 29 3b 0a 20 20  al & 0x0001);.  
10a00 7d 0a 20 20 70 2d 3e 72 63 20 3d 20 73 71 6c 69  }.  p->rc = sqli
10a10 74 65 33 5f 72 65 73 65 74 28 70 2d 3e 70 49 64  te3_reset(p->pId
10a20 78 53 65 6c 65 63 74 29 3b 0a 0a 20 20 69 66 28  xSelect);..  if(
10a30 20 69 50 67 3c 70 53 65 67 2d 3e 70 67 6e 6f 46   iPg<pSeg->pgnoF
10a40 69 72 73 74 20 29 7b 0a 20 20 20 20 69 50 67 20  irst ){.    iPg 
10a50 3d 20 70 53 65 67 2d 3e 70 67 6e 6f 46 69 72 73  = pSeg->pgnoFirs
10a60 74 3b 0a 20 20 20 20 62 44 6c 69 64 78 20 3d 20  t;.    bDlidx = 
10a70 30 3b 0a 20 20 7d 0a 0a 20 20 70 49 74 65 72 2d  0;.  }..  pIter-
10a80 3e 69 4c 65 61 66 50 67 6e 6f 20 3d 20 69 50 67  >iLeafPgno = iPg
10a90 20 2d 20 31 3b 0a 20 20 66 74 73 35 53 65 67 49   - 1;.  fts5SegI
10aa0 74 65 72 4e 65 78 74 50 61 67 65 28 70 2c 20 70  terNextPage(p, p
10ab0 49 74 65 72 29 3b 0a 0a 20 20 69 66 28 20 70 49  Iter);..  if( pI
10ac0 74 65 72 2d 3e 70 4c 65 61 66 20 29 7b 0a 20 20  ter->pLeaf ){.  
10ad0 20 20 66 74 73 35 4c 65 61 66 53 65 65 6b 28 70    fts5LeafSeek(p
10ae0 2c 20 62 47 65 2c 20 70 49 74 65 72 2c 20 70 54  , bGe, pIter, pT
10af0 65 72 6d 2c 20 6e 54 65 72 6d 29 3b 0a 20 20 7d  erm, nTerm);.  }
10b00 0a 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53  ..  if( p->rc==S
10b10 51 4c 49 54 45 5f 4f 4b 20 26 26 20 62 47 65 3d  QLITE_OK && bGe=
10b20 3d 30 20 29 7b 0a 20 20 20 20 70 49 74 65 72 2d  =0 ){.    pIter-
10b30 3e 66 6c 61 67 73 20 7c 3d 20 46 54 53 35 5f 53  >flags |= FTS5_S
10b40 45 47 49 54 45 52 5f 4f 4e 45 54 45 52 4d 3b 0a  EGITER_ONETERM;.
10b50 20 20 20 20 69 66 28 20 70 49 74 65 72 2d 3e 70      if( pIter->p
10b60 4c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 69 66  Leaf ){.      if
10b70 28 20 66 6c 61 67 73 20 26 20 46 54 53 35 49 4e  ( flags & FTS5IN
10b80 44 45 58 5f 51 55 45 52 59 5f 44 45 53 43 20 29  DEX_QUERY_DESC )
10b90 7b 0a 20 20 20 20 20 20 20 20 70 49 74 65 72 2d  {.        pIter-
10ba0 3e 66 6c 61 67 73 20 7c 3d 20 46 54 53 35 5f 53  >flags |= FTS5_S
10bb0 45 47 49 54 45 52 5f 52 45 56 45 52 53 45 3b 0a  EGITER_REVERSE;.
10bc0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
10bd0 28 20 62 44 6c 69 64 78 20 29 7b 0a 20 20 20 20  ( bDlidx ){.    
10be0 20 20 20 20 66 74 73 35 53 65 67 49 74 65 72 4c      fts5SegIterL
10bf0 6f 61 64 44 6c 69 64 78 28 70 2c 20 70 49 74 65  oadDlidx(p, pIte
10c00 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  r);.      }.    
10c10 20 20 69 66 28 20 66 6c 61 67 73 20 26 20 46 54    if( flags & FT
10c20 53 35 49 4e 44 45 58 5f 51 55 45 52 59 5f 44 45  S5INDEX_QUERY_DE
10c30 53 43 20 29 7b 0a 20 20 20 20 20 20 20 20 66 74  SC ){.        ft
10c40 73 35 53 65 67 49 74 65 72 52 65 76 65 72 73 65  s5SegIterReverse
10c50 28 70 2c 20 70 49 74 65 72 29 3b 0a 20 20 20 20  (p, pIter);.    
10c60 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
10c70 20 2f 2a 20 45 69 74 68 65 72 3a 0a 20 20 2a 2a   /* Either:.  **
10c80 0a 20 20 2a 2a 20 20 20 31 29 20 61 6e 20 65 72  .  **   1) an er
10c90 72 6f 72 20 68 61 73 20 6f 63 63 75 72 72 65 64  ror has occurred
10ca0 2c 20 6f 72 0a 20 20 2a 2a 20 20 20 32 29 20 74  , or.  **   2) t
10cb0 68 65 20 69 74 65 72 61 74 6f 72 20 70 6f 69 6e  he iterator poin
10cc0 74 73 20 74 6f 20 45 4f 46 2c 20 6f 72 0a 20 20  ts to EOF, or.  
10cd0 2a 2a 20 20 20 33 29 20 74 68 65 20 69 74 65 72  **   3) the iter
10ce0 61 74 6f 72 20 70 6f 69 6e 74 73 20 74 6f 20 61  ator points to a
10cf0 6e 20 65 6e 74 72 79 20 77 69 74 68 20 74 65 72  n entry with ter
10d00 6d 20 28 70 54 65 72 6d 2f 6e 54 65 72 6d 29 2c  m (pTerm/nTerm),
10d10 20 6f 72 0a 20 20 2a 2a 20 20 20 34 29 20 74 68   or.  **   4) th
10d20 65 20 46 54 53 35 49 4e 44 45 58 5f 51 55 45 52  e FTS5INDEX_QUER
10d30 59 5f 53 43 41 4e 20 66 6c 61 67 20 77 61 73 20  Y_SCAN flag was 
10d40 73 65 74 20 61 6e 64 20 74 68 65 20 69 74 65 72  set and the iter
10d50 61 74 6f 72 20 70 6f 69 6e 74 73 0a 20 20 2a 2a  ator points.  **
10d60 20 20 20 20 20 20 74 6f 20 61 6e 20 65 6e 74 72        to an entr
10d70 79 20 77 69 74 68 20 61 20 74 65 72 6d 20 67 72  y with a term gr
10d80 65 61 74 65 72 20 74 68 61 6e 20 6f 72 20 65 71  eater than or eq
10d90 75 61 6c 20 74 6f 20 28 70 54 65 72 6d 2f 6e 54  ual to (pTerm/nT
10da0 65 72 6d 29 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  erm)..  */.  ass
10db0 65 72 74 28 20 70 2d 3e 72 63 21 3d 53 51 4c 49  ert( p->rc!=SQLI
10dc0 54 45 5f 4f 4b 20 20 20 20 20 20 20 20 20 20 20  TE_OK           
10dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10de0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
10df0 2a 20 31 20 2a 2f 0a 20 20 20 7c 7c 20 70 49 74  * 1 */.   || pIt
10e00 65 72 2d 3e 70 4c 65 61 66 3d 3d 30 20 20 20 20  er->pLeaf==0    
10e10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10e20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10e30 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 32 20             /* 2 
10e40 2a 2f 0a 20 20 20 7c 7c 20 66 74 73 35 42 75 66  */.   || fts5Buf
10e50 66 65 72 43 6f 6d 70 61 72 65 42 6c 6f 62 28 26  ferCompareBlob(&
10e60 70 49 74 65 72 2d 3e 74 65 72 6d 2c 20 70 54 65  pIter->term, pTe
10e70 72 6d 2c 20 6e 54 65 72 6d 29 3d 3d 30 20 20 20  rm, nTerm)==0   
10e80 20 20 20 20 20 20 20 2f 2a 20 33 20 2a 2f 0a 20         /* 3 */. 
10e90 20 20 7c 7c 20 28 62 47 65 20 26 26 20 66 74 73    || (bGe && fts
10ea0 35 42 75 66 66 65 72 43 6f 6d 70 61 72 65 42 6c  5BufferCompareBl
10eb0 6f 62 28 26 70 49 74 65 72 2d 3e 74 65 72 6d 2c  ob(&pIter->term,
10ec0 20 70 54 65 72 6d 2c 20 6e 54 65 72 6d 29 3e 30   pTerm, nTerm)>0
10ed0 29 20 20 2f 2a 20 34 20 2a 2f 0a 20 20 29 3b 0a  )  /* 4 */.  );.
10ee0 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c  }../*.** Initial
10ef0 69 7a 65 20 74 68 65 20 6f 62 6a 65 63 74 20 70  ize the object p
10f00 49 74 65 72 20 74 6f 20 70 6f 69 6e 74 20 74 6f  Iter to point to
10f10 20 74 65 72 6d 20 70 54 65 72 6d 2f 6e 54 65 72   term pTerm/nTer
10f20 6d 20 77 69 74 68 69 6e 20 74 68 65 0a 2a 2a 20  m within the.** 
10f30 69 6e 2d 6d 65 6d 6f 72 79 20 68 61 73 68 20 74  in-memory hash t
10f40 61 62 6c 65 2e 20 49 66 20 74 68 65 72 65 20 69  able. If there i
10f50 73 20 6e 6f 20 73 75 63 68 20 74 65 72 6d 20 69  s no such term i
10f60 6e 20 74 68 65 20 68 61 73 68 2d 74 61 62 6c 65  n the hash-table
10f70 2c 20 74 68 65 20 0a 2a 2a 20 69 74 65 72 61 74  , the .** iterat
10f80 6f 72 20 69 73 20 73 65 74 20 74 6f 20 45 4f 46  or is set to EOF
10f90 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72  ..**.** If an er
10fa0 72 6f 72 20 6f 63 63 75 72 73 2c 20 46 74 73 35  ror occurs, Fts5
10fb0 49 6e 64 65 78 2e 72 63 20 69 73 20 73 65 74 20  Index.rc is set 
10fc0 74 6f 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74  to an appropriat
10fd0 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 49 66  e error code. If
10fe0 20 0a 2a 2a 20 61 6e 20 65 72 72 6f 72 20 68 61   .** an error ha
10ff0 73 20 61 6c 72 65 61 64 79 20 6f 63 63 75 72 72  s already occurr
11000 65 64 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e  ed when this fun
11010 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c  ction is called,
11020 20 69 74 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a   it is a no-op..
11030 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
11040 74 73 35 53 65 67 49 74 65 72 48 61 73 68 49 6e  ts5SegIterHashIn
11050 69 74 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20  it(.  Fts5Index 
11060 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  *p,             
11070 20 20 20 20 20 20 2f 2a 20 46 54 53 35 20 62 61        /* FTS5 ba
11080 63 6b 65 6e 64 20 2a 2f 0a 20 20 63 6f 6e 73 74  ckend */.  const
11090 20 75 38 20 2a 70 54 65 72 6d 2c 20 69 6e 74 20   u8 *pTerm, int 
110a0 6e 54 65 72 6d 2c 20 20 20 20 20 2f 2a 20 54 65  nTerm,     /* Te
110b0 72 6d 20 74 6f 20 73 65 65 6b 20 74 6f 20 2a 2f  rm to seek to */
110c0 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c 20 20 20  .  int flags,   
110d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
110e0 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 46 54     /* Mask of FT
110f0 53 35 49 4e 44 45 58 5f 58 58 58 20 66 6c 61 67  S5INDEX_XXX flag
11100 73 20 2a 2f 0a 20 20 46 74 73 35 53 65 67 49 74  s */.  Fts5SegIt
11110 65 72 20 2a 70 49 74 65 72 20 20 20 20 20 20 20  er *pIter       
11120 20 20 20 20 20 20 20 2f 2a 20 4f 62 6a 65 63 74         /* Object
11130 20 74 6f 20 70 6f 70 75 6c 61 74 65 20 2a 2f 0a   to populate */.
11140 29 7b 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 70  ){.  const u8 *p
11150 4c 69 73 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20  List = 0;.  int 
11160 6e 4c 69 73 74 20 3d 20 30 3b 0a 20 20 63 6f 6e  nList = 0;.  con
11170 73 74 20 75 38 20 2a 7a 20 3d 20 30 3b 0a 20 20  st u8 *z = 0;.  
11180 69 6e 74 20 6e 20 3d 20 30 3b 0a 0a 20 20 61 73  int n = 0;..  as
11190 73 65 72 74 28 20 70 2d 3e 70 48 61 73 68 20 29  sert( p->pHash )
111a0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72  ;.  assert( p->r
111b0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  c==SQLITE_OK );.
111c0 0a 20 20 69 66 28 20 70 54 65 72 6d 3d 3d 30 20  .  if( pTerm==0 
111d0 7c 7c 20 28 66 6c 61 67 73 20 26 20 46 54 53 35  || (flags & FTS5
111e0 49 4e 44 45 58 5f 51 55 45 52 59 5f 53 43 41 4e  INDEX_QUERY_SCAN
111f0 29 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d  ) ){.    p->rc =
11200 20 73 71 6c 69 74 65 33 46 74 73 35 48 61 73 68   sqlite3Fts5Hash
11210 53 63 61 6e 49 6e 69 74 28 70 2d 3e 70 48 61 73  ScanInit(p->pHas
11220 68 2c 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29  h, (const char*)
11230 70 54 65 72 6d 2c 20 6e 54 65 72 6d 29 3b 0a 20  pTerm, nTerm);. 
11240 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 48 61     sqlite3Fts5Ha
11250 73 68 53 63 61 6e 45 6e 74 72 79 28 70 2d 3e 70  shScanEntry(p->p
11260 48 61 73 68 2c 20 28 63 6f 6e 73 74 20 63 68 61  Hash, (const cha
11270 72 2a 2a 29 26 7a 2c 20 26 70 4c 69 73 74 2c 20  r**)&z, &pList, 
11280 26 6e 4c 69 73 74 29 3b 0a 20 20 20 20 6e 20 3d  &nList);.    n =
11290 20 28 7a 20 3f 20 73 74 72 6c 65 6e 28 28 63 6f   (z ? strlen((co
112a0 6e 73 74 20 63 68 61 72 2a 29 7a 29 20 3a 20 30  nst char*)z) : 0
112b0 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
112c0 70 49 74 65 72 2d 3e 66 6c 61 67 73 20 7c 3d 20  pIter->flags |= 
112d0 46 54 53 35 5f 53 45 47 49 54 45 52 5f 4f 4e 45  FTS5_SEGITER_ONE
112e0 54 45 52 4d 3b 0a 20 20 20 20 73 71 6c 69 74 65  TERM;.    sqlite
112f0 33 46 74 73 35 48 61 73 68 51 75 65 72 79 28 70  3Fts5HashQuery(p
11300 2d 3e 70 48 61 73 68 2c 20 28 63 6f 6e 73 74 20  ->pHash, (const 
11310 63 68 61 72 2a 29 70 54 65 72 6d 2c 20 6e 54 65  char*)pTerm, nTe
11320 72 6d 2c 20 26 70 4c 69 73 74 2c 20 26 6e 4c 69  rm, &pList, &nLi
11330 73 74 29 3b 0a 20 20 20 20 7a 20 3d 20 70 54 65  st);.    z = pTe
11340 72 6d 3b 0a 20 20 20 20 6e 20 3d 20 6e 54 65 72  rm;.    n = nTer
11350 6d 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 4c  m;.  }..  if( pL
11360 69 73 74 20 29 7b 0a 20 20 20 20 46 74 73 35 44  ist ){.    Fts5D
11370 61 74 61 20 2a 70 4c 65 61 66 3b 0a 20 20 20 20  ata *pLeaf;.    
11380 73 71 6c 69 74 65 33 46 74 73 35 42 75 66 66 65  sqlite3Fts5Buffe
11390 72 53 65 74 28 26 70 2d 3e 72 63 2c 20 26 70 49  rSet(&p->rc, &pI
113a0 74 65 72 2d 3e 74 65 72 6d 2c 20 6e 2c 20 7a 29  ter->term, n, z)
113b0 3b 0a 20 20 20 20 70 4c 65 61 66 20 3d 20 66 74  ;.    pLeaf = ft
113c0 73 35 49 64 78 4d 61 6c 6c 6f 63 28 70 2c 20 73  s5IdxMalloc(p, s
113d0 69 7a 65 6f 66 28 46 74 73 35 44 61 74 61 29 29  izeof(Fts5Data))
113e0 3b 0a 20 20 20 20 69 66 28 20 70 4c 65 61 66 3d  ;.    if( pLeaf=
113f0 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20  =0 ) return;.   
11400 20 70 4c 65 61 66 2d 3e 70 20 3d 20 28 75 38 2a   pLeaf->p = (u8*
11410 29 70 4c 69 73 74 3b 0a 20 20 20 20 70 4c 65 61  )pList;.    pLea
11420 66 2d 3e 6e 6e 20 3d 20 70 4c 65 61 66 2d 3e 73  f->nn = pLeaf->s
11430 7a 4c 65 61 66 20 3d 20 6e 4c 69 73 74 3b 0a 20  zLeaf = nList;. 
11440 20 20 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 20     pIter->pLeaf 
11450 3d 20 70 4c 65 61 66 3b 0a 20 20 20 20 70 49 74  = pLeaf;.    pIt
11460 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 20  er->iLeafOffset 
11470 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e 74 28  = fts5GetVarint(
11480 70 4c 65 61 66 2d 3e 70 2c 20 28 75 36 34 2a 29  pLeaf->p, (u64*)
11490 26 70 49 74 65 72 2d 3e 69 52 6f 77 69 64 29 3b  &pIter->iRowid);
114a0 0a 20 20 20 20 70 49 74 65 72 2d 3e 69 45 6e 64  .    pIter->iEnd
114b0 6f 66 44 6f 63 6c 69 73 74 20 3d 20 70 4c 65 61  ofDoclist = pLea
114c0 66 2d 3e 6e 6e 2b 31 3b 0a 0a 20 20 20 20 69 66  f->nn+1;..    if
114d0 28 20 66 6c 61 67 73 20 26 20 46 54 53 35 49 4e  ( flags & FTS5IN
114e0 44 45 58 5f 51 55 45 52 59 5f 44 45 53 43 20 29  DEX_QUERY_DESC )
114f0 7b 0a 20 20 20 20 20 20 70 49 74 65 72 2d 3e 66  {.      pIter->f
11500 6c 61 67 73 20 7c 3d 20 46 54 53 35 5f 53 45 47  lags |= FTS5_SEG
11510 49 54 45 52 5f 52 45 56 45 52 53 45 3b 0a 20 20  ITER_REVERSE;.  
11520 20 20 20 20 66 74 73 35 53 65 67 49 74 65 72 52      fts5SegIterR
11530 65 76 65 72 73 65 49 6e 69 74 50 61 67 65 28 70  everseInitPage(p
11540 2c 20 70 49 74 65 72 29 3b 0a 20 20 20 20 7d 65  , pIter);.    }e
11550 6c 73 65 7b 0a 20 20 20 20 20 20 66 74 73 35 53  lse{.      fts5S
11560 65 67 49 74 65 72 4c 6f 61 64 4e 50 6f 73 28 70  egIterLoadNPos(p
11570 2c 20 70 49 74 65 72 29 3b 0a 20 20 20 20 7d 0a  , pIter);.    }.
11580 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 5a 65 72    }.}../*.** Zer
11590 6f 20 74 68 65 20 69 74 65 72 61 74 6f 72 20 70  o the iterator p
115a0 61 73 73 65 64 20 61 73 20 74 68 65 20 6f 6e 6c  assed as the onl
115b0 79 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73  y argument..*/.s
115c0 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 53  tatic void fts5S
115d0 65 67 49 74 65 72 43 6c 65 61 72 28 46 74 73 35  egIterClear(Fts5
115e0 53 65 67 49 74 65 72 20 2a 70 49 74 65 72 29 7b  SegIter *pIter){
115f0 0a 20 20 66 74 73 35 42 75 66 66 65 72 46 72 65  .  fts5BufferFre
11600 65 28 26 70 49 74 65 72 2d 3e 74 65 72 6d 29 3b  e(&pIter->term);
11610 0a 20 20 66 74 73 35 44 61 74 61 52 65 6c 65 61  .  fts5DataRelea
11620 73 65 28 70 49 74 65 72 2d 3e 70 4c 65 61 66 29  se(pIter->pLeaf)
11630 3b 0a 20 20 66 74 73 35 44 61 74 61 52 65 6c 65  ;.  fts5DataRele
11640 61 73 65 28 70 49 74 65 72 2d 3e 70 4e 65 78 74  ase(pIter->pNext
11650 4c 65 61 66 29 3b 0a 20 20 66 74 73 35 44 6c 69  Leaf);.  fts5Dli
11660 64 78 49 74 65 72 46 72 65 65 28 70 49 74 65 72  dxIterFree(pIter
11670 2d 3e 70 44 6c 69 64 78 29 3b 0a 20 20 73 71 6c  ->pDlidx);.  sql
11680 69 74 65 33 5f 66 72 65 65 28 70 49 74 65 72 2d  ite3_free(pIter-
11690 3e 61 52 6f 77 69 64 4f 66 66 73 65 74 29 3b 0a  >aRowidOffset);.
116a0 20 20 6d 65 6d 73 65 74 28 70 49 74 65 72 2c 20    memset(pIter, 
116b0 30 2c 20 73 69 7a 65 6f 66 28 46 74 73 35 53 65  0, sizeof(Fts5Se
116c0 67 49 74 65 72 29 29 3b 0a 7d 0a 0a 23 69 66 64  gIter));.}..#ifd
116d0 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
116e0 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
116f0 74 69 6f 6e 20 69 73 20 75 73 65 64 20 61 73 20  tion is used as 
11700 70 61 72 74 20 6f 66 20 74 68 65 20 62 69 67 20  part of the big 
11710 61 73 73 65 72 74 28 29 20 70 72 6f 63 65 64 75  assert() procedu
11720 72 65 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 62  re implemented b
11730 79 0a 2a 2a 20 66 74 73 35 41 73 73 65 72 74 4d  y.** fts5AssertM
11740 75 6c 74 69 49 74 65 72 53 65 74 75 70 28 29 2e  ultiIterSetup().
11750 20 49 74 20 65 6e 73 75 72 65 73 20 74 68 61 74   It ensures that
11760 20 74 68 65 20 72 65 73 75 6c 74 20 63 75 72 72   the result curr
11770 65 6e 74 6c 79 20 73 74 6f 72 65 64 0a 2a 2a 20  ently stored.** 
11780 69 6e 20 2a 70 52 65 73 20 69 73 20 74 68 65 20  in *pRes is the 
11790 63 6f 72 72 65 63 74 20 72 65 73 75 6c 74 20 6f  correct result o
117a0 66 20 63 6f 6d 70 61 72 69 6e 67 20 74 68 65 20  f comparing the 
117b0 63 75 72 72 65 6e 74 20 70 6f 73 69 74 69 6f 6e  current position
117c0 73 20 6f 66 20 74 68 65 0a 2a 2a 20 74 77 6f 20  s of the.** two 
117d0 69 74 65 72 61 74 6f 72 73 2e 0a 2a 2f 0a 73 74  iterators..*/.st
117e0 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 41 73  atic void fts5As
117f0 73 65 72 74 43 6f 6d 70 61 72 69 73 6f 6e 52 65  sertComparisonRe
11800 73 75 6c 74 28 0a 20 20 46 74 73 35 49 6e 64 65  sult(.  Fts5Inde
11810 78 49 74 65 72 20 2a 70 49 74 65 72 2c 20 0a 20  xIter *pIter, . 
11820 20 46 74 73 35 53 65 67 49 74 65 72 20 2a 70 31   Fts5SegIter *p1
11830 2c 0a 20 20 46 74 73 35 53 65 67 49 74 65 72 20  ,.  Fts5SegIter 
11840 2a 70 32 2c 0a 20 20 46 74 73 35 43 52 65 73 75  *p2,.  Fts5CResu
11850 6c 74 20 2a 70 52 65 73 0a 29 7b 0a 20 20 69 6e  lt *pRes.){.  in
11860 74 20 69 31 20 3d 20 70 31 20 2d 20 70 49 74 65  t i1 = p1 - pIte
11870 72 2d 3e 61 53 65 67 3b 0a 20 20 69 6e 74 20 69  r->aSeg;.  int i
11880 32 20 3d 20 70 32 20 2d 20 70 49 74 65 72 2d 3e  2 = p2 - pIter->
11890 61 53 65 67 3b 0a 0a 20 20 69 66 28 20 70 31 2d  aSeg;..  if( p1-
118a0 3e 70 4c 65 61 66 20 7c 7c 20 70 32 2d 3e 70 4c  >pLeaf || p2->pL
118b0 65 61 66 20 29 7b 0a 20 20 20 20 69 66 28 20 70  eaf ){.    if( p
118c0 31 2d 3e 70 4c 65 61 66 3d 3d 30 20 29 7b 0a 20  1->pLeaf==0 ){. 
118d0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 52 65       assert( pRe
118e0 73 2d 3e 69 46 69 72 73 74 3d 3d 69 32 20 29 3b  s->iFirst==i2 );
118f0 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70  .    }else if( p
11900 32 2d 3e 70 4c 65 61 66 3d 3d 30 20 29 7b 0a 20  2->pLeaf==0 ){. 
11910 20 20 20 20 20 61 73 73 65 72 74 28 20 70 52 65       assert( pRe
11920 73 2d 3e 69 46 69 72 73 74 3d 3d 69 31 20 29 3b  s->iFirst==i1 );
11930 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
11940 20 20 69 6e 74 20 6e 4d 69 6e 20 3d 20 4d 49 4e    int nMin = MIN
11950 28 70 31 2d 3e 74 65 72 6d 2e 6e 2c 20 70 32 2d  (p1->term.n, p2-
11960 3e 74 65 72 6d 2e 6e 29 3b 0a 20 20 20 20 20 20  >term.n);.      
11970 69 6e 74 20 72 65 73 20 3d 20 6d 65 6d 63 6d 70  int res = memcmp
11980 28 70 31 2d 3e 74 65 72 6d 2e 70 2c 20 70 32 2d  (p1->term.p, p2-
11990 3e 74 65 72 6d 2e 70 2c 20 6e 4d 69 6e 29 3b 0a  >term.p, nMin);.
119a0 20 20 20 20 20 20 69 66 28 20 72 65 73 3d 3d 30        if( res==0
119b0 20 29 20 72 65 73 20 3d 20 70 31 2d 3e 74 65 72   ) res = p1->ter
119c0 6d 2e 6e 20 2d 20 70 32 2d 3e 74 65 72 6d 2e 6e  m.n - p2->term.n
119d0 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 72 65 73  ;..      if( res
119e0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 61  ==0 ){.        a
119f0 73 73 65 72 74 28 20 70 52 65 73 2d 3e 62 54 65  ssert( pRes->bTe
11a00 72 6d 45 71 3d 3d 31 20 29 3b 0a 20 20 20 20 20  rmEq==1 );.     
11a10 20 20 20 61 73 73 65 72 74 28 20 70 31 2d 3e 69     assert( p1->i
11a20 52 6f 77 69 64 21 3d 70 32 2d 3e 69 52 6f 77 69  Rowid!=p2->iRowi
11a30 64 20 29 3b 0a 20 20 20 20 20 20 20 20 72 65 73  d );.        res
11a40 20 3d 20 28 28 70 31 2d 3e 69 52 6f 77 69 64 20   = ((p1->iRowid 
11a50 3e 20 70 32 2d 3e 69 52 6f 77 69 64 29 3d 3d 70  > p2->iRowid)==p
11a60 49 74 65 72 2d 3e 62 52 65 76 29 20 3f 20 2d 31  Iter->bRev) ? -1
11a70 20 3a 20 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73   : 1;.      }els
11a80 65 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  e{.        asser
11a90 74 28 20 70 52 65 73 2d 3e 62 54 65 72 6d 45 71  t( pRes->bTermEq
11aa0 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 7d 0a 0a  ==0 );.      }..
11ab0 20 20 20 20 20 20 69 66 28 20 72 65 73 3c 30 20        if( res<0 
11ac0 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ){.        asser
11ad0 74 28 20 70 52 65 73 2d 3e 69 46 69 72 73 74 3d  t( pRes->iFirst=
11ae0 3d 69 31 20 29 3b 0a 20 20 20 20 20 20 7d 65 6c  =i1 );.      }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 69 46 69 72 73 74  rt( pRes->iFirst
11b10 3d 3d 69 32 20 29 3b 0a 20 20 20 20 20 20 7d 0a  ==i2 );.      }.
11b20 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
11b30 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
11b40 20 69 73 20 61 20 6e 6f 2d 6f 70 20 75 6e 6c 65   is a no-op unle
11b50 73 73 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20  ss SQLITE_DEBUG 
11b60 69 73 20 64 65 66 69 6e 65 64 20 77 68 65 6e 20  is defined when 
11b70 74 68 69 73 20 6d 6f 64 75 6c 65 0a 2a 2a 20 69  this module.** i
11b80 73 20 63 6f 6d 70 69 6c 65 64 2e 20 49 6e 20 74  s compiled. In t
11b90 68 61 74 20 63 61 73 65 2c 20 74 68 69 73 20 66  hat case, this f
11ba0 75 6e 63 74 69 6f 6e 20 69 73 20 65 73 73 65 6e  unction is essen
11bb0 74 69 61 6c 6c 79 20 61 6e 20 61 73 73 65 72 74  tially an assert
11bc0 28 29 20 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74  () .** statement
11bd0 20 75 73 65 64 20 74 6f 20 76 65 72 69 66 79 20   used to verify 
11be0 74 68 61 74 20 74 68 65 20 63 6f 6e 74 65 6e 74  that the content
11bf0 73 20 6f 66 20 74 68 65 20 70 49 74 65 72 2d 3e  s of the pIter->
11c00 61 46 69 72 73 74 5b 5d 20 61 72 72 61 79 0a 2a  aFirst[] array.*
11c10 2a 20 61 72 65 20 63 6f 72 72 65 63 74 2e 0a 2a  * are correct..*
11c20 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  /.static void ft
11c30 73 35 41 73 73 65 72 74 4d 75 6c 74 69 49 74 65  s5AssertMultiIte
11c40 72 53 65 74 75 70 28 46 74 73 35 49 6e 64 65 78  rSetup(Fts5Index
11c50 20 2a 70 2c 20 46 74 73 35 49 6e 64 65 78 49 74   *p, Fts5IndexIt
11c60 65 72 20 2a 70 49 74 65 72 29 7b 0a 20 20 69 66  er *pIter){.  if
11c70 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
11c80 4f 4b 20 29 7b 0a 20 20 20 20 46 74 73 35 53 65  OK ){.    Fts5Se
11c90 67 49 74 65 72 20 2a 70 46 69 72 73 74 20 3d 20  gIter *pFirst = 
11ca0 26 70 49 74 65 72 2d 3e 61 53 65 67 5b 20 70 49  &pIter->aSeg[ pI
11cb0 74 65 72 2d 3e 61 46 69 72 73 74 5b 31 5d 2e 69  ter->aFirst[1].i
11cc0 46 69 72 73 74 20 5d 3b 0a 20 20 20 20 69 6e 74  First ];.    int
11cd0 20 69 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28   i;..    assert(
11ce0 20 28 70 46 69 72 73 74 2d 3e 70 4c 65 61 66 3d   (pFirst->pLeaf=
11cf0 3d 30 29 3d 3d 70 49 74 65 72 2d 3e 62 45 6f 66  =0)==pIter->bEof
11d00 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63   );..    /* Chec
11d10 6b 20 74 68 61 74 20 70 49 74 65 72 2d 3e 69 53  k that pIter->iS
11d20 77 69 74 63 68 52 6f 77 69 64 20 69 73 20 73 65  witchRowid is se
11d30 74 20 63 6f 72 72 65 63 74 6c 79 2e 20 2a 2f 0a  t correctly. */.
11d40 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
11d50 49 74 65 72 2d 3e 6e 53 65 67 3b 20 69 2b 2b 29  Iter->nSeg; i++)
11d60 7b 0a 20 20 20 20 20 20 46 74 73 35 53 65 67 49  {.      Fts5SegI
11d70 74 65 72 20 2a 70 31 20 3d 20 26 70 49 74 65 72  ter *p1 = &pIter
11d80 2d 3e 61 53 65 67 5b 69 5d 3b 0a 20 20 20 20 20  ->aSeg[i];.     
11d90 20 61 73 73 65 72 74 28 20 70 31 3d 3d 70 46 69   assert( p1==pFi
11da0 72 73 74 20 0a 20 20 20 20 20 20 20 20 20 20 20  rst .           
11db0 7c 7c 20 70 31 2d 3e 70 4c 65 61 66 3d 3d 30 20  || p1->pLeaf==0 
11dc0 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 66  .           || f
11dd0 74 73 35 42 75 66 66 65 72 43 6f 6d 70 61 72 65  ts5BufferCompare
11de0 28 26 70 46 69 72 73 74 2d 3e 74 65 72 6d 2c 20  (&pFirst->term, 
11df0 26 70 31 2d 3e 74 65 72 6d 29 20 0a 20 20 20 20  &p1->term) .    
11e00 20 20 20 20 20 20 20 7c 7c 20 70 31 2d 3e 69 52         || p1->iR
11e10 6f 77 69 64 3d 3d 70 49 74 65 72 2d 3e 69 53 77  owid==pIter->iSw
11e20 69 74 63 68 52 6f 77 69 64 0a 20 20 20 20 20 20  itchRowid.      
11e30 20 20 20 20 20 7c 7c 20 28 70 31 2d 3e 69 52 6f       || (p1->iRo
11e40 77 69 64 3c 70 49 74 65 72 2d 3e 69 53 77 69 74  wid<pIter->iSwit
11e50 63 68 52 6f 77 69 64 29 3d 3d 70 49 74 65 72 2d  chRowid)==pIter-
11e60 3e 62 52 65 76 0a 20 20 20 20 20 20 29 3b 0a 20  >bRev.      );. 
11e70 20 20 20 7d 0a 0a 20 20 20 20 66 6f 72 28 69 3d     }..    for(i=
11e80 30 3b 20 69 3c 70 49 74 65 72 2d 3e 6e 53 65 67  0; i<pIter->nSeg
11e90 3b 20 69 2b 3d 32 29 7b 0a 20 20 20 20 20 20 46  ; i+=2){.      F
11ea0 74 73 35 53 65 67 49 74 65 72 20 2a 70 31 20 3d  ts5SegIter *p1 =
11eb0 20 26 70 49 74 65 72 2d 3e 61 53 65 67 5b 69 5d   &pIter->aSeg[i]
11ec0 3b 0a 20 20 20 20 20 20 46 74 73 35 53 65 67 49  ;.      Fts5SegI
11ed0 74 65 72 20 2a 70 32 20 3d 20 26 70 49 74 65 72  ter *p2 = &pIter
11ee0 2d 3e 61 53 65 67 5b 69 2b 31 5d 3b 0a 20 20 20  ->aSeg[i+1];.   
11ef0 20 20 20 46 74 73 35 43 52 65 73 75 6c 74 20 2a     Fts5CResult *
11f00 70 52 65 73 20 3d 20 26 70 49 74 65 72 2d 3e 61  pRes = &pIter->a
11f10 46 69 72 73 74 5b 28 70 49 74 65 72 2d 3e 6e 53  First[(pIter->nS
11f20 65 67 20 2b 20 69 29 20 2f 20 32 5d 3b 0a 20 20  eg + i) / 2];.  
11f30 20 20 20 20 66 74 73 35 41 73 73 65 72 74 43 6f      fts5AssertCo
11f40 6d 70 61 72 69 73 6f 6e 52 65 73 75 6c 74 28 70  mparisonResult(p
11f50 49 74 65 72 2c 20 70 31 2c 20 70 32 2c 20 70 52  Iter, p1, p2, pR
11f60 65 73 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  es);.    }..    
11f70 66 6f 72 28 69 3d 31 3b 20 69 3c 28 70 49 74 65  for(i=1; i<(pIte
11f80 72 2d 3e 6e 53 65 67 20 2f 20 32 29 3b 20 69 2b  r->nSeg / 2); i+
11f90 3d 32 29 7b 0a 20 20 20 20 20 20 46 74 73 35 53  =2){.      Fts5S
11fa0 65 67 49 74 65 72 20 2a 70 31 20 3d 20 26 70 49  egIter *p1 = &pI
11fb0 74 65 72 2d 3e 61 53 65 67 5b 20 70 49 74 65 72  ter->aSeg[ pIter
11fc0 2d 3e 61 46 69 72 73 74 5b 69 2a 32 5d 2e 69 46  ->aFirst[i*2].iF
11fd0 69 72 73 74 20 5d 3b 0a 20 20 20 20 20 20 46 74  irst ];.      Ft
11fe0 73 35 53 65 67 49 74 65 72 20 2a 70 32 20 3d 20  s5SegIter *p2 = 
11ff0 26 70 49 74 65 72 2d 3e 61 53 65 67 5b 20 70 49  &pIter->aSeg[ pI
12000 74 65 72 2d 3e 61 46 69 72 73 74 5b 69 2a 32 2b  ter->aFirst[i*2+
12010 31 5d 2e 69 46 69 72 73 74 20 5d 3b 0a 20 20 20  1].iFirst ];.   
12020 20 20 20 46 74 73 35 43 52 65 73 75 6c 74 20 2a     Fts5CResult *
12030 70 52 65 73 20 3d 20 26 70 49 74 65 72 2d 3e 61  pRes = &pIter->a
12040 46 69 72 73 74 5b 69 5d 3b 0a 20 20 20 20 20 20  First[i];.      
12050 66 74 73 35 41 73 73 65 72 74 43 6f 6d 70 61 72  fts5AssertCompar
12060 69 73 6f 6e 52 65 73 75 6c 74 28 70 49 74 65 72  isonResult(pIter
12070 2c 20 70 31 2c 20 70 32 2c 20 70 52 65 73 29 3b  , p1, p2, pRes);
12080 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6c  .    }.  }.}.#el
12090 73 65 0a 23 20 64 65 66 69 6e 65 20 66 74 73 35  se.# define fts5
120a0 41 73 73 65 72 74 4d 75 6c 74 69 49 74 65 72 53  AssertMultiIterS
120b0 65 74 75 70 28 78 2c 79 29 0a 23 65 6e 64 69 66  etup(x,y).#endif
120c0 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20 74 68 65 20 63  ../*.** Do the c
120d0 6f 6d 70 61 72 69 73 6f 6e 20 6e 65 63 65 73 73  omparison necess
120e0 61 72 79 20 74 6f 20 70 6f 70 75 6c 61 74 65 20  ary to populate 
120f0 70 49 74 65 72 2d 3e 61 46 69 72 73 74 5b 69 4f  pIter->aFirst[iO
12100 75 74 5d 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ut]..**.** If th
12110 65 20 72 65 74 75 72 6e 65 64 20 76 61 6c 75 65  e returned value
12120 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68   is non-zero, th
12130 65 6e 20 69 74 20 69 73 20 74 68 65 20 69 6e 64  en it is the ind
12140 65 78 20 6f 66 20 61 6e 20 65 6e 74 72 79 0a 2a  ex of an entry.*
12150 2a 20 69 6e 20 74 68 65 20 70 49 74 65 72 2d 3e  * in the pIter->
12160 61 53 65 67 5b 5d 20 61 72 72 61 79 20 74 68 61  aSeg[] array tha
12170 74 20 69 73 20 28 61 29 20 6e 6f 74 20 61 74 20  t is (a) not at 
12180 45 4f 46 2c 20 61 6e 64 20 28 62 29 20 70 6f 69  EOF, and (b) poi
12190 6e 74 69 6e 67 0a 2a 2a 20 74 6f 20 61 20 6b 65  nting.** to a ke
121a0 79 20 74 68 61 74 20 69 73 20 61 20 64 75 70 6c  y that is a dupl
121b0 69 63 61 74 65 20 6f 66 20 61 6e 6f 74 68 65 72  icate of another
121c0 2c 20 68 69 67 68 65 72 20 70 72 69 6f 72 69 74  , higher priorit
121d0 79 2c 20 0a 2a 2a 20 73 65 67 6d 65 6e 74 2d 69  y, .** segment-i
121e0 74 65 72 61 74 6f 72 20 69 6e 20 74 68 65 20 70  terator in the p
121f0 53 65 67 2d 3e 61 53 65 67 5b 5d 20 61 72 72 61  Seg->aSeg[] arra
12200 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  y..*/.static int
12210 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 44 6f   fts5MultiIterDo
12220 43 6f 6d 70 61 72 65 28 46 74 73 35 49 6e 64 65  Compare(Fts5Inde
12230 78 49 74 65 72 20 2a 70 49 74 65 72 2c 20 69 6e  xIter *pIter, in
12240 74 20 69 4f 75 74 29 7b 0a 20 20 69 6e 74 20 69  t iOut){.  int i
12250 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  1;              
12260 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
12270 64 65 78 20 6f 66 20 6c 65 66 74 2d 68 61 6e 64  dex of left-hand
12280 20 46 74 73 35 53 65 67 49 74 65 72 20 2a 2f 0a   Fts5SegIter */.
12290 20 20 69 6e 74 20 69 32 3b 20 20 20 20 20 20 20    int i2;       
122a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
122b0 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 72 69    /* Index of ri
122c0 67 68 74 2d 68 61 6e 64 20 46 74 73 35 53 65 67  ght-hand Fts5Seg
122d0 49 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 69 52  Iter */.  int iR
122e0 65 73 3b 0a 20 20 46 74 73 35 53 65 67 49 74 65  es;.  Fts5SegIte
122f0 72 20 2a 70 31 3b 20 20 20 20 20 20 20 20 20 20  r *p1;          
12300 20 20 20 20 20 20 2f 2a 20 4c 65 66 74 2d 68 61        /* Left-ha
12310 6e 64 20 46 74 73 35 53 65 67 49 74 65 72 20 2a  nd Fts5SegIter *
12320 2f 0a 20 20 46 74 73 35 53 65 67 49 74 65 72 20  /.  Fts5SegIter 
12330 2a 70 32 3b 20 20 20 20 20 20 20 20 20 20 20 20  *p2;            
12340 20 20 20 20 2f 2a 20 52 69 67 68 74 2d 68 61 6e      /* Right-han
12350 64 20 46 74 73 35 53 65 67 49 74 65 72 20 2a 2f  d Fts5SegIter */
12360 0a 20 20 46 74 73 35 43 52 65 73 75 6c 74 20 2a  .  Fts5CResult *
12370 70 52 65 73 20 3d 20 26 70 49 74 65 72 2d 3e 61  pRes = &pIter->a
12380 46 69 72 73 74 5b 69 4f 75 74 5d 3b 0a 0a 20 20  First[iOut];..  
12390 61 73 73 65 72 74 28 20 69 4f 75 74 3c 70 49 74  assert( iOut<pIt
123a0 65 72 2d 3e 6e 53 65 67 20 26 26 20 69 4f 75 74  er->nSeg && iOut
123b0 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  >0 );.  assert( 
123c0 70 49 74 65 72 2d 3e 62 52 65 76 3d 3d 30 20 7c  pIter->bRev==0 |
123d0 7c 20 70 49 74 65 72 2d 3e 62 52 65 76 3d 3d 31  | pIter->bRev==1
123e0 20 29 3b 0a 0a 20 20 69 66 28 20 69 4f 75 74 3e   );..  if( iOut>
123f0 3d 28 70 49 74 65 72 2d 3e 6e 53 65 67 2f 32 29  =(pIter->nSeg/2)
12400 20 29 7b 0a 20 20 20 20 69 31 20 3d 20 28 69 4f   ){.    i1 = (iO
12410 75 74 20 2d 20 70 49 74 65 72 2d 3e 6e 53 65 67  ut - pIter->nSeg
12420 2f 32 29 20 2a 20 32 3b 0a 20 20 20 20 69 32 20  /2) * 2;.    i2 
12430 3d 20 69 31 20 2b 20 31 3b 0a 20 20 7d 65 6c 73  = i1 + 1;.  }els
12440 65 7b 0a 20 20 20 20 69 31 20 3d 20 70 49 74 65  e{.    i1 = pIte
12450 72 2d 3e 61 46 69 72 73 74 5b 69 4f 75 74 2a 32  r->aFirst[iOut*2
12460 5d 2e 69 46 69 72 73 74 3b 0a 20 20 20 20 69 32  ].iFirst;.    i2
12470 20 3d 20 70 49 74 65 72 2d 3e 61 46 69 72 73 74   = pIter->aFirst
12480 5b 69 4f 75 74 2a 32 2b 31 5d 2e 69 46 69 72 73  [iOut*2+1].iFirs
12490 74 3b 0a 20 20 7d 0a 20 20 70 31 20 3d 20 26 70  t;.  }.  p1 = &p
124a0 49 74 65 72 2d 3e 61 53 65 67 5b 69 31 5d 3b 0a  Iter->aSeg[i1];.
124b0 20 20 70 32 20 3d 20 26 70 49 74 65 72 2d 3e 61    p2 = &pIter->a
124c0 53 65 67 5b 69 32 5d 3b 0a 0a 20 20 70 52 65 73  Seg[i2];..  pRes
124d0 2d 3e 62 54 65 72 6d 45 71 20 3d 20 30 3b 0a 20  ->bTermEq = 0;. 
124e0 20 69 66 28 20 70 31 2d 3e 70 4c 65 61 66 3d 3d   if( p1->pLeaf==
124f0 30 20 29 7b 20 20 20 20 20 20 20 20 20 20 20 2f  0 ){           /
12500 2a 20 49 66 20 70 31 20 69 73 20 61 74 20 45 4f  * If p1 is at EO
12510 46 20 2a 2f 0a 20 20 20 20 69 52 65 73 20 3d 20  F */.    iRes = 
12520 69 32 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  i2;.  }else if( 
12530 70 32 2d 3e 70 4c 65 61 66 3d 3d 30 20 29 7b 20  p2->pLeaf==0 ){ 
12540 20 20 20 20 2f 2a 20 49 66 20 70 32 20 69 73 20      /* If p2 is 
12550 61 74 20 45 4f 46 20 2a 2f 0a 20 20 20 20 69 52  at EOF */.    iR
12560 65 73 20 3d 20 69 31 3b 0a 20 20 7d 65 6c 73 65  es = i1;.  }else
12570 7b 0a 20 20 20 20 69 6e 74 20 72 65 73 20 3d 20  {.    int res = 
12580 66 74 73 35 42 75 66 66 65 72 43 6f 6d 70 61 72  fts5BufferCompar
12590 65 28 26 70 31 2d 3e 74 65 72 6d 2c 20 26 70 32  e(&p1->term, &p2
125a0 2d 3e 74 65 72 6d 29 3b 0a 20 20 20 20 69 66 28  ->term);.    if(
125b0 20 72 65 73 3d 3d 30 20 29 7b 0a 20 20 20 20 20   res==0 ){.     
125c0 20 61 73 73 65 72 74 28 20 69 32 3e 69 31 20 29   assert( i2>i1 )
125d0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
125e0 69 32 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 70  i2!=0 );.      p
125f0 52 65 73 2d 3e 62 54 65 72 6d 45 71 20 3d 20 31  Res->bTermEq = 1
12600 3b 0a 20 20 20 20 20 20 69 66 28 20 70 31 2d 3e  ;.      if( p1->
12610 69 52 6f 77 69 64 3d 3d 70 32 2d 3e 69 52 6f 77  iRowid==p2->iRow
12620 69 64 20 29 7b 0a 20 20 20 20 20 20 20 20 70 31  id ){.        p1
12630 2d 3e 62 44 65 6c 20 3d 20 70 32 2d 3e 62 44 65  ->bDel = p2->bDe
12640 6c 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  l;.        retur
12650 6e 20 69 32 3b 0a 20 20 20 20 20 20 7d 0a 20 20  n i2;.      }.  
12660 20 20 20 20 72 65 73 20 3d 20 28 28 70 31 2d 3e      res = ((p1->
12670 69 52 6f 77 69 64 20 3e 20 70 32 2d 3e 69 52 6f  iRowid > p2->iRo
12680 77 69 64 29 3d 3d 70 49 74 65 72 2d 3e 62 52 65  wid)==pIter->bRe
12690 76 29 20 3f 20 2d 31 20 3a 20 2b 31 3b 0a 20 20  v) ? -1 : +1;.  
126a0 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20    }.    assert( 
126b0 72 65 73 21 3d 30 20 29 3b 0a 20 20 20 20 69 66  res!=0 );.    if
126c0 28 20 72 65 73 3c 30 20 29 7b 0a 20 20 20 20 20  ( res<0 ){.     
126d0 20 69 52 65 73 20 3d 20 69 31 3b 0a 20 20 20 20   iRes = i1;.    
126e0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 52 65  }else{.      iRe
126f0 73 20 3d 20 69 32 3b 0a 20 20 20 20 7d 0a 20 20  s = i2;.    }.  
12700 7d 0a 0a 20 20 70 52 65 73 2d 3e 69 46 69 72 73  }..  pRes->iFirs
12710 74 20 3d 20 69 52 65 73 3b 0a 20 20 72 65 74 75  t = iRes;.  retu
12720 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d  rn 0;.}../*.** M
12730 6f 76 65 20 74 68 65 20 73 65 67 2d 69 74 65 72  ove the seg-iter
12740 20 73 6f 20 74 68 61 74 20 69 74 20 70 6f 69 6e   so that it poin
12750 74 73 20 74 6f 20 74 68 65 20 66 69 72 73 74 20  ts to the first 
12760 72 6f 77 69 64 20 6f 6e 20 70 61 67 65 20 69 4c  rowid on page iL
12770 65 61 66 50 67 6e 6f 2e 0a 2a 2a 20 49 74 20 69  eafPgno..** It i
12780 73 20 61 6e 20 65 72 72 6f 72 20 69 66 20 6c 65  s an error if le
12790 61 66 20 69 4c 65 61 66 50 67 6e 6f 20 64 6f 65  af iLeafPgno doe
127a0 73 20 6e 6f 74 20 65 78 69 73 74 20 6f 72 20 63  s not exist or c
127b0 6f 6e 74 61 69 6e 73 20 6e 6f 20 72 6f 77 69 64  ontains no rowid
127c0 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  s..*/.static voi
127d0 64 20 66 74 73 35 53 65 67 49 74 65 72 47 6f 74  d fts5SegIterGot
127e0 6f 50 61 67 65 28 0a 20 20 46 74 73 35 49 6e 64  oPage(.  Fts5Ind
127f0 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  ex *p,          
12800 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53 35           /* FTS5
12810 20 62 61 63 6b 65 6e 64 20 6f 62 6a 65 63 74 20   backend object 
12820 2a 2f 0a 20 20 46 74 73 35 53 65 67 49 74 65 72  */.  Fts5SegIter
12830 20 2a 70 49 74 65 72 2c 20 20 20 20 20 20 20 20   *pIter,        
12840 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72       /* Iterator
12850 20 74 6f 20 61 64 76 61 6e 63 65 20 2a 2f 0a 20   to advance */. 
12860 20 69 6e 74 20 69 4c 65 61 66 50 67 6e 6f 0a 29   int iLeafPgno.)
12870 7b 0a 20 20 61 73 73 65 72 74 28 20 69 4c 65 61  {.  assert( iLea
12880 66 50 67 6e 6f 3e 70 49 74 65 72 2d 3e 69 4c 65  fPgno>pIter->iLe
12890 61 66 50 67 6e 6f 20 29 3b 0a 0a 20 20 69 66 28  afPgno );..  if(
128a0 20 69 4c 65 61 66 50 67 6e 6f 3e 70 49 74 65 72   iLeafPgno>pIter
128b0 2d 3e 70 53 65 67 2d 3e 70 67 6e 6f 4c 61 73 74  ->pSeg->pgnoLast
128c0 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20   ){.    p->rc = 
128d0 46 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20  FTS5_CORRUPT;.  
128e0 7d 65 6c 73 65 7b 0a 20 20 20 20 66 74 73 35 44  }else{.    fts5D
128f0 61 74 61 52 65 6c 65 61 73 65 28 70 49 74 65 72  ataRelease(pIter
12900 2d 3e 70 4e 65 78 74 4c 65 61 66 29 3b 0a 20 20  ->pNextLeaf);.  
12910 20 20 70 49 74 65 72 2d 3e 70 4e 65 78 74 4c 65    pIter->pNextLe
12920 61 66 20 3d 20 30 3b 0a 20 20 20 20 70 49 74 65  af = 0;.    pIte
12930 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 20 3d 20 69  r->iLeafPgno = i
12940 4c 65 61 66 50 67 6e 6f 2d 31 3b 0a 20 20 20 20  LeafPgno-1;.    
12950 66 74 73 35 53 65 67 49 74 65 72 4e 65 78 74 50  fts5SegIterNextP
12960 61 67 65 28 70 2c 20 70 49 74 65 72 29 3b 0a 20  age(p, pIter);. 
12970 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72 63     assert( p->rc
12980 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70  !=SQLITE_OK || p
12990 49 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 3d  Iter->iLeafPgno=
129a0 3d 69 4c 65 61 66 50 67 6e 6f 20 29 3b 0a 0a 20  =iLeafPgno );.. 
129b0 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51     if( p->rc==SQ
129c0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
129d0 20 69 6e 74 20 69 4f 66 66 3b 0a 20 20 20 20 20   int iOff;.     
129e0 20 75 38 20 2a 61 20 3d 20 70 49 74 65 72 2d 3e   u8 *a = pIter->
129f0 70 4c 65 61 66 2d 3e 70 3b 0a 20 20 20 20 20 20  pLeaf->p;.      
12a00 69 6e 74 20 6e 20 3d 20 70 49 74 65 72 2d 3e 70  int n = pIter->p
12a10 4c 65 61 66 2d 3e 73 7a 4c 65 61 66 3b 0a 0a 20  Leaf->szLeaf;.. 
12a20 20 20 20 20 20 69 4f 66 66 20 3d 20 66 74 73 35       iOff = fts5
12a30 4c 65 61 66 46 69 72 73 74 52 6f 77 69 64 4f 66  LeafFirstRowidOf
12a40 66 28 70 49 74 65 72 2d 3e 70 4c 65 61 66 29 3b  f(pIter->pLeaf);
12a50 0a 20 20 20 20 20 20 69 66 28 20 69 4f 66 66 3c  .      if( iOff<
12a60 34 20 7c 7c 20 69 4f 66 66 3e 3d 6e 20 29 7b 0a  4 || iOff>=n ){.
12a70 20 20 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20          p->rc = 
12a80 46 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20  FTS5_CORRUPT;.  
12a90 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
12aa0 20 20 20 69 4f 66 66 20 2b 3d 20 66 74 73 35 47     iOff += fts5G
12ab0 65 74 56 61 72 69 6e 74 28 26 61 5b 69 4f 66 66  etVarint(&a[iOff
12ac0 5d 2c 20 28 75 36 34 2a 29 26 70 49 74 65 72 2d  ], (u64*)&pIter-
12ad0 3e 69 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20  >iRowid);.      
12ae0 20 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66    pIter->iLeafOf
12af0 66 73 65 74 20 3d 20 69 4f 66 66 3b 0a 20 20 20  fset = iOff;.   
12b00 20 20 20 20 20 66 74 73 35 53 65 67 49 74 65 72       fts5SegIter
12b10 4c 6f 61 64 4e 50 6f 73 28 70 2c 20 70 49 74 65  LoadNPos(p, pIte
12b20 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  r);.      }.    
12b30 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  }.  }.}../*.** A
12b40 64 76 61 6e 63 65 20 74 68 65 20 69 74 65 72 61  dvance the itera
12b50 74 6f 72 20 70 61 73 73 65 64 20 61 73 20 74 68  tor passed as th
12b60 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
12b70 74 20 75 6e 74 69 6c 20 69 74 20 69 73 20 61 74  t until it is at
12b80 20 6f 72 20 0a 2a 2a 20 70 61 73 74 20 72 6f 77   or .** past row
12b90 69 64 20 69 46 72 6f 6d 2e 20 52 65 67 61 72 64  id iFrom. Regard
12ba0 6c 65 73 73 20 6f 66 20 74 68 65 20 76 61 6c 75  less of the valu
12bb0 65 20 6f 66 20 69 46 72 6f 6d 2c 20 74 68 65 20  e of iFrom, the 
12bc0 69 74 65 72 61 74 6f 72 20 69 73 0a 2a 2a 20 61  iterator is.** a
12bd0 6c 77 61 79 73 20 61 64 76 61 6e 63 65 64 20 61  lways advanced a
12be0 74 20 6c 65 61 73 74 20 6f 6e 63 65 2e 0a 2a 2f  t least once..*/
12bf0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
12c00 35 53 65 67 49 74 65 72 4e 65 78 74 46 72 6f 6d  5SegIterNextFrom
12c10 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70  (.  Fts5Index *p
12c20 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
12c30 20 20 20 20 2f 2a 20 46 54 53 35 20 62 61 63 6b      /* FTS5 back
12c40 65 6e 64 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  end object */.  
12c50 46 74 73 35 53 65 67 49 74 65 72 20 2a 70 49 74  Fts5SegIter *pIt
12c60 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  er,             
12c70 2f 2a 20 49 74 65 72 61 74 6f 72 20 74 6f 20 61  /* Iterator to a
12c80 64 76 61 6e 63 65 20 2a 2f 0a 20 20 69 36 34 20  dvance */.  i64 
12c90 69 4d 61 74 63 68 20 20 20 20 20 20 20 20 20 20  iMatch          
12ca0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
12cb0 64 76 61 6e 63 65 20 69 74 65 72 61 74 6f 72 20  dvance iterator 
12cc0 61 74 20 6c 65 61 73 74 20 74 68 69 73 20 66 61  at least this fa
12cd0 72 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 62 52  r */.){.  int bR
12ce0 65 76 20 3d 20 28 70 49 74 65 72 2d 3e 66 6c 61  ev = (pIter->fla
12cf0 67 73 20 26 20 46 54 53 35 5f 53 45 47 49 54 45  gs & FTS5_SEGITE
12d00 52 5f 52 45 56 45 52 53 45 29 3b 0a 20 20 46 74  R_REVERSE);.  Ft
12d10 73 35 44 6c 69 64 78 49 74 65 72 20 2a 70 44 6c  s5DlidxIter *pDl
12d20 69 64 78 20 3d 20 70 49 74 65 72 2d 3e 70 44 6c  idx = pIter->pDl
12d30 69 64 78 3b 0a 20 20 69 6e 74 20 69 4c 65 61 66  idx;.  int iLeaf
12d40 50 67 6e 6f 20 3d 20 70 49 74 65 72 2d 3e 69 4c  Pgno = pIter->iL
12d50 65 61 66 50 67 6e 6f 3b 0a 20 20 69 6e 74 20 62  eafPgno;.  int b
12d60 4d 6f 76 65 20 3d 20 31 3b 0a 0a 20 20 61 73 73  Move = 1;..  ass
12d70 65 72 74 28 20 70 49 74 65 72 2d 3e 66 6c 61 67  ert( pIter->flag
12d80 73 20 26 20 46 54 53 35 5f 53 45 47 49 54 45 52  s & FTS5_SEGITER
12d90 5f 4f 4e 45 54 45 52 4d 20 29 3b 0a 20 20 61 73  _ONETERM );.  as
12da0 73 65 72 74 28 20 70 49 74 65 72 2d 3e 70 44 6c  sert( pIter->pDl
12db0 69 64 78 20 29 3b 0a 20 20 61 73 73 65 72 74 28  idx );.  assert(
12dc0 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 20 29 3b   pIter->pLeaf );
12dd0 0a 0a 20 20 69 66 28 20 62 52 65 76 3d 3d 30 20  ..  if( bRev==0 
12de0 29 7b 0a 20 20 20 20 77 68 69 6c 65 28 20 21 66  ){.    while( !f
12df0 74 73 35 44 6c 69 64 78 49 74 65 72 45 6f 66 28  ts5DlidxIterEof(
12e00 70 2c 20 70 44 6c 69 64 78 29 20 26 26 20 69 4d  p, pDlidx) && iM
12e10 61 74 63 68 3e 66 74 73 35 44 6c 69 64 78 49 74  atch>fts5DlidxIt
12e20 65 72 52 6f 77 69 64 28 70 44 6c 69 64 78 29 20  erRowid(pDlidx) 
12e30 29 7b 0a 20 20 20 20 20 20 69 4c 65 61 66 50 67  ){.      iLeafPg
12e40 6e 6f 20 3d 20 66 74 73 35 44 6c 69 64 78 49 74  no = fts5DlidxIt
12e50 65 72 50 67 6e 6f 28 70 44 6c 69 64 78 29 3b 0a  erPgno(pDlidx);.
12e60 20 20 20 20 20 20 66 74 73 35 44 6c 69 64 78 49        fts5DlidxI
12e70 74 65 72 4e 65 78 74 28 70 2c 20 70 44 6c 69 64  terNext(p, pDlid
12e80 78 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73  x);.    }.    as
12e90 73 65 72 74 5f 6e 63 28 20 69 4c 65 61 66 50 67  sert_nc( iLeafPg
12ea0 6e 6f 3e 3d 70 49 74 65 72 2d 3e 69 4c 65 61 66  no>=pIter->iLeaf
12eb0 50 67 6e 6f 20 7c 7c 20 70 2d 3e 72 63 20 29 3b  Pgno || p->rc );
12ec0 0a 20 20 20 20 69 66 28 20 69 4c 65 61 66 50 67  .    if( iLeafPg
12ed0 6e 6f 3e 70 49 74 65 72 2d 3e 69 4c 65 61 66 50  no>pIter->iLeafP
12ee0 67 6e 6f 20 29 7b 0a 20 20 20 20 20 20 66 74 73  gno ){.      fts
12ef0 35 53 65 67 49 74 65 72 47 6f 74 6f 50 61 67 65  5SegIterGotoPage
12f00 28 70 2c 20 70 49 74 65 72 2c 20 69 4c 65 61 66  (p, pIter, iLeaf
12f10 50 67 6e 6f 29 3b 0a 20 20 20 20 20 20 62 4d 6f  Pgno);.      bMo
12f20 76 65 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  ve = 0;.    }.  
12f30 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72  }else{.    asser
12f40 74 28 20 70 49 74 65 72 2d 3e 70 4e 65 78 74 4c  t( pIter->pNextL
12f50 65 61 66 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73  eaf==0 );.    as
12f60 73 65 72 74 28 20 69 4d 61 74 63 68 3c 70 49 74  sert( iMatch<pIt
12f70 65 72 2d 3e 69 52 6f 77 69 64 20 29 3b 0a 20 20  er->iRowid );.  
12f80 20 20 77 68 69 6c 65 28 20 21 66 74 73 35 44 6c    while( !fts5Dl
12f90 69 64 78 49 74 65 72 45 6f 66 28 70 2c 20 70 44  idxIterEof(p, pD
12fa0 6c 69 64 78 29 20 26 26 20 69 4d 61 74 63 68 3c  lidx) && iMatch<
12fb0 66 74 73 35 44 6c 69 64 78 49 74 65 72 52 6f 77  fts5DlidxIterRow
12fc0 69 64 28 70 44 6c 69 64 78 29 20 29 7b 0a 20 20  id(pDlidx) ){.  
12fd0 20 20 20 20 66 74 73 35 44 6c 69 64 78 49 74 65      fts5DlidxIte
12fe0 72 50 72 65 76 28 70 2c 20 70 44 6c 69 64 78 29  rPrev(p, pDlidx)
12ff0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 4c 65 61  ;.    }.    iLea
13000 66 50 67 6e 6f 20 3d 20 66 74 73 35 44 6c 69 64  fPgno = fts5Dlid
13010 78 49 74 65 72 50 67 6e 6f 28 70 44 6c 69 64 78  xIterPgno(pDlidx
13020 29 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20  );..    assert( 
13030 66 74 73 35 44 6c 69 64 78 49 74 65 72 45 6f 66  fts5DlidxIterEof
13040 28 70 2c 20 70 44 6c 69 64 78 29 20 7c 7c 20 69  (p, pDlidx) || i
13050 4c 65 61 66 50 67 6e 6f 3c 3d 70 49 74 65 72 2d  LeafPgno<=pIter-
13060 3e 69 4c 65 61 66 50 67 6e 6f 20 29 3b 0a 0a 20  >iLeafPgno );.. 
13070 20 20 20 69 66 28 20 69 4c 65 61 66 50 67 6e 6f     if( iLeafPgno
13080 3c 70 49 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e  <pIter->iLeafPgn
13090 6f 20 29 7b 0a 20 20 20 20 20 20 70 49 74 65 72  o ){.      pIter
130a0 2d 3e 69 4c 65 61 66 50 67 6e 6f 20 3d 20 69 4c  ->iLeafPgno = iL
130b0 65 61 66 50 67 6e 6f 2b 31 3b 0a 20 20 20 20 20  eafPgno+1;.     
130c0 20 66 74 73 35 53 65 67 49 74 65 72 52 65 76 65   fts5SegIterReve
130d0 72 73 65 4e 65 77 50 61 67 65 28 70 2c 20 70 49  rseNewPage(p, pI
130e0 74 65 72 29 3b 0a 20 20 20 20 20 20 62 4d 6f 76  ter);.      bMov
130f0 65 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d  e = 0;.    }.  }
13100 0a 0a 20 20 64 6f 7b 0a 20 20 20 20 69 66 28 20  ..  do{.    if( 
13110 62 4d 6f 76 65 20 29 20 66 74 73 35 53 65 67 49  bMove ) fts5SegI
13120 74 65 72 4e 65 78 74 28 70 2c 20 70 49 74 65 72  terNext(p, pIter
13130 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 70 49  , 0);.    if( pI
13140 74 65 72 2d 3e 70 4c 65 61 66 3d 3d 30 20 29 20  ter->pLeaf==0 ) 
13150 62 72 65 61 6b 3b 0a 20 20 20 20 69 66 28 20 62  break;.    if( b
13160 52 65 76 3d 3d 30 20 26 26 20 70 49 74 65 72 2d  Rev==0 && pIter-
13170 3e 69 52 6f 77 69 64 3e 3d 69 4d 61 74 63 68 20  >iRowid>=iMatch 
13180 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 69 66 28  ) break;.    if(
13190 20 62 52 65 76 21 3d 30 20 26 26 20 70 49 74 65   bRev!=0 && pIte
131a0 72 2d 3e 69 52 6f 77 69 64 3c 3d 69 4d 61 74 63  r->iRowid<=iMatc
131b0 68 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 62  h ) break;.    b
131c0 4d 6f 76 65 20 3d 20 31 3b 0a 20 20 7d 77 68 69  Move = 1;.  }whi
131d0 6c 65 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  le( p->rc==SQLIT
131e0 45 5f 4f 4b 20 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  E_OK );.}.../*.*
131f0 2a 20 46 72 65 65 20 74 68 65 20 69 74 65 72 61  * Free the itera
13200 74 6f 72 20 6f 62 6a 65 63 74 20 70 61 73 73 65  tor object passe
13210 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20  d as the second 
13220 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61  argument..*/.sta
13230 74 69 63 20 76 6f 69 64 20 66 74 73 35 4d 75 6c  tic void fts5Mul
13240 74 69 49 74 65 72 46 72 65 65 28 46 74 73 35 49  tiIterFree(Fts5I
13250 6e 64 65 78 20 2a 70 2c 20 46 74 73 35 49 6e 64  ndex *p, Fts5Ind
13260 65 78 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a  exIter *pIter){.
13270 20 20 69 66 28 20 70 49 74 65 72 20 29 7b 0a 20    if( pIter ){. 
13280 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f     int i;.    fo
13290 72 28 69 3d 30 3b 20 69 3c 70 49 74 65 72 2d 3e  r(i=0; i<pIter->
132a0 6e 53 65 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nSeg; i++){.    
132b0 20 20 66 74 73 35 53 65 67 49 74 65 72 43 6c 65    fts5SegIterCle
132c0 61 72 28 26 70 49 74 65 72 2d 3e 61 53 65 67 5b  ar(&pIter->aSeg[
132d0 69 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66  i]);.    }.    f
132e0 74 73 35 53 74 72 75 63 74 75 72 65 52 65 6c 65  ts5StructureRele
132f0 61 73 65 28 70 49 74 65 72 2d 3e 70 53 74 72 75  ase(pIter->pStru
13300 63 74 29 3b 0a 20 20 20 20 66 74 73 35 42 75 66  ct);.    fts5Buf
13310 66 65 72 46 72 65 65 28 26 70 49 74 65 72 2d 3e  ferFree(&pIter->
13320 70 6f 73 6c 69 73 74 29 3b 0a 20 20 20 20 73 71  poslist);.    sq
13330 6c 69 74 65 33 5f 66 72 65 65 28 70 49 74 65 72  lite3_free(pIter
13340 29 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63  );.  }.}..static
13350 20 76 6f 69 64 20 66 74 73 35 4d 75 6c 74 69 49   void fts5MultiI
13360 74 65 72 41 64 76 61 6e 63 65 64 28 0a 20 20 46  terAdvanced(.  F
13370 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20  ts5Index *p,    
13380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
13390 2a 20 46 54 53 35 20 62 61 63 6b 65 6e 64 20 74  * FTS5 backend t
133a0 6f 20 69 74 65 72 61 74 65 20 77 69 74 68 69 6e  o iterate within
133b0 20 2a 2f 0a 20 20 46 74 73 35 49 6e 64 65 78 49   */.  Fts5IndexI
133c0 74 65 72 20 2a 70 49 74 65 72 2c 20 20 20 20 20  ter *pIter,     
133d0 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74 6f        /* Iterato
133e0 72 20 74 6f 20 75 70 64 61 74 65 20 61 46 69 72  r to update aFir
133f0 73 74 5b 5d 20 61 72 72 61 79 20 66 6f 72 20 2a  st[] array for *
13400 2f 0a 20 20 69 6e 74 20 69 43 68 61 6e 67 65 64  /.  int iChanged
13410 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
13420 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20      /* Index of 
13430 73 75 62 2d 69 74 65 72 61 74 6f 72 20 6a 75 73  sub-iterator jus
13440 74 20 61 64 76 61 6e 63 65 64 20 2a 2f 0a 20 20  t advanced */.  
13450 69 6e 74 20 69 4d 69 6e 73 65 74 20 20 20 20 20  int iMinset     
13460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13470 2f 2a 20 4d 69 6e 69 6d 75 6d 20 65 6e 74 72 79  /* Minimum entry
13480 20 69 6e 20 61 46 69 72 73 74 5b 5d 20 74 6f 20   in aFirst[] to 
13490 73 65 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  set */.){.  int 
134a0 69 3b 0a 20 20 66 6f 72 28 69 3d 28 70 49 74 65  i;.  for(i=(pIte
134b0 72 2d 3e 6e 53 65 67 2b 69 43 68 61 6e 67 65 64  r->nSeg+iChanged
134c0 29 2f 32 3b 20 69 3e 3d 69 4d 69 6e 73 65 74 20  )/2; i>=iMinset 
134d0 26 26 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  && p->rc==SQLITE
134e0 5f 4f 4b 3b 20 69 3d 69 2f 32 29 7b 0a 20 20 20  _OK; i=i/2){.   
134f0 20 69 6e 74 20 69 45 71 3b 0a 20 20 20 20 69 66   int iEq;.    if
13500 28 20 28 69 45 71 20 3d 20 66 74 73 35 4d 75 6c  ( (iEq = fts5Mul
13510 74 69 49 74 65 72 44 6f 43 6f 6d 70 61 72 65 28  tiIterDoCompare(
13520 70 49 74 65 72 2c 20 69 29 29 20 29 7b 0a 20 20  pIter, i)) ){.  
13530 20 20 20 20 66 74 73 35 53 65 67 49 74 65 72 4e      fts5SegIterN
13540 65 78 74 28 70 2c 20 26 70 49 74 65 72 2d 3e 61  ext(p, &pIter->a
13550 53 65 67 5b 69 45 71 5d 2c 20 30 29 3b 0a 20 20  Seg[iEq], 0);.  
13560 20 20 20 20 69 20 3d 20 70 49 74 65 72 2d 3e 6e      i = pIter->n
13570 53 65 67 20 2b 20 69 45 71 3b 0a 20 20 20 20 7d  Seg + iEq;.    }
13580 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 75  .  }.}../*.** Su
13590 62 2d 69 74 65 72 61 74 6f 72 20 69 43 68 61 6e  b-iterator iChan
135a0 67 65 64 20 6f 66 20 69 74 65 72 61 74 6f 72 20  ged of iterator 
135b0 70 49 74 65 72 20 68 61 73 20 6a 75 73 74 20 62  pIter has just b
135c0 65 65 6e 20 61 64 76 61 6e 63 65 64 2e 20 49 74  een advanced. It
135d0 20 73 74 69 6c 6c 0a 2a 2a 20 70 6f 69 6e 74 73   still.** points
135e0 20 74 6f 20 74 68 65 20 73 61 6d 65 20 74 65 72   to the same ter
135f0 6d 20 74 68 6f 75 67 68 20 2d 20 6a 75 73 74 20  m though - just 
13600 61 20 64 69 66 66 65 72 65 6e 74 20 72 6f 77 69  a different rowi
13610 64 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  d. This function
13620 0a 2a 2a 20 61 74 74 65 6d 70 74 73 20 74 6f 20  .** attempts to 
13630 75 70 64 61 74 65 20 74 68 65 20 63 6f 6e 74 65  update the conte
13640 6e 74 73 20 6f 66 20 74 68 65 20 70 49 74 65 72  nts of the pIter
13650 2d 3e 61 46 69 72 73 74 5b 5d 20 61 63 63 6f 72  ->aFirst[] accor
13660 64 69 6e 67 6c 79 2e 0a 2a 2a 20 49 66 20 69 74  dingly..** If it
13670 20 64 6f 65 73 20 73 6f 20 73 75 63 63 65 73 73   does so success
13680 66 75 6c 6c 79 2c 20 30 20 69 73 20 72 65 74 75  fully, 0 is retu
13690 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65 20  rned. Otherwise 
136a0 31 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 6e 2d  1..**.** If non-
136b0 7a 65 72 6f 20 69 73 20 72 65 74 75 72 6e 65 64  zero is returned
136c0 2c 20 74 68 65 20 63 61 6c 6c 65 72 20 73 68 6f  , the caller sho
136d0 75 6c 64 20 63 61 6c 6c 20 66 74 73 35 4d 75 6c  uld call fts5Mul
136e0 74 69 49 74 65 72 41 64 76 61 6e 63 65 64 28 29  tiIterAdvanced()
136f0 0a 2a 2a 20 6f 6e 20 74 68 65 20 69 74 65 72 61  .** on the itera
13700 74 6f 72 20 69 6e 73 74 65 61 64 2e 20 54 68 61  tor instead. Tha
13710 74 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20  t function does 
13720 74 68 65 20 73 61 6d 65 20 61 73 20 74 68 69 73  the same as this
13730 20 6f 6e 65 2c 20 65 78 63 65 70 74 0a 2a 2a 20   one, except.** 
13740 74 68 61 74 20 69 74 20 64 65 61 6c 73 20 77 69  that it deals wi
13750 74 68 20 6d 6f 72 65 20 63 6f 6d 70 6c 69 63 61  th more complica
13760 74 65 64 20 63 61 73 65 73 20 61 73 20 77 65 6c  ted cases as wel
13770 6c 2e 0a 2a 2f 20 0a 73 74 61 74 69 63 20 69 6e  l..*/ .static in
13780 74 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 41  t fts5MultiIterA
13790 64 76 61 6e 63 65 52 6f 77 69 64 28 0a 20 20 46  dvanceRowid(.  F
137a0 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20  ts5Index *p,    
137b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
137c0 2a 20 46 54 53 35 20 62 61 63 6b 65 6e 64 20 74  * FTS5 backend t
137d0 6f 20 69 74 65 72 61 74 65 20 77 69 74 68 69 6e  o iterate within
137e0 20 2a 2f 0a 20 20 46 74 73 35 49 6e 64 65 78 49   */.  Fts5IndexI
137f0 74 65 72 20 2a 70 49 74 65 72 2c 20 20 20 20 20  ter *pIter,     
13800 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74 6f        /* Iterato
13810 72 20 74 6f 20 75 70 64 61 74 65 20 61 46 69 72  r to update aFir
13820 73 74 5b 5d 20 61 72 72 61 79 20 66 6f 72 20 2a  st[] array for *
13830 2f 0a 20 20 69 6e 74 20 69 43 68 61 6e 67 65 64  /.  int iChanged
13840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13850 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20      /* Index of 
13860 73 75 62 2d 69 74 65 72 61 74 6f 72 20 6a 75 73  sub-iterator jus
13870 74 20 61 64 76 61 6e 63 65 64 20 2a 2f 0a 29 7b  t advanced */.){
13880 0a 20 20 46 74 73 35 53 65 67 49 74 65 72 20 2a  .  Fts5SegIter *
13890 70 4e 65 77 20 3d 20 26 70 49 74 65 72 2d 3e 61  pNew = &pIter->a
138a0 53 65 67 5b 69 43 68 61 6e 67 65 64 5d 3b 0a 0a  Seg[iChanged];..
138b0 20 20 69 66 28 20 70 4e 65 77 2d 3e 69 52 6f 77    if( pNew->iRow
138c0 69 64 3d 3d 70 49 74 65 72 2d 3e 69 53 77 69 74  id==pIter->iSwit
138d0 63 68 52 6f 77 69 64 0a 20 20 20 7c 7c 20 28 70  chRowid.   || (p
138e0 4e 65 77 2d 3e 69 52 6f 77 69 64 3c 70 49 74 65  New->iRowid<pIte
138f0 72 2d 3e 69 53 77 69 74 63 68 52 6f 77 69 64 29  r->iSwitchRowid)
13900 3d 3d 70 49 74 65 72 2d 3e 62 52 65 76 0a 20 20  ==pIter->bRev.  
13910 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  ){.    int i;.  
13920 20 20 46 74 73 35 53 65 67 49 74 65 72 20 2a 70    Fts5SegIter *p
13930 4f 74 68 65 72 20 3d 20 26 70 49 74 65 72 2d 3e  Other = &pIter->
13940 61 53 65 67 5b 69 43 68 61 6e 67 65 64 20 5e 20  aSeg[iChanged ^ 
13950 30 78 30 30 30 31 5d 3b 0a 20 20 20 20 70 49 74  0x0001];.    pIt
13960 65 72 2d 3e 69 53 77 69 74 63 68 52 6f 77 69 64  er->iSwitchRowid
13970 20 3d 20 70 49 74 65 72 2d 3e 62 52 65 76 20 3f   = pIter->bRev ?
13980 20 53 4d 41 4c 4c 45 53 54 5f 49 4e 54 36 34 20   SMALLEST_INT64 
13990 3a 20 4c 41 52 47 45 53 54 5f 49 4e 54 36 34 3b  : LARGEST_INT64;
139a0 0a 20 20 20 20 66 6f 72 28 69 3d 28 70 49 74 65  .    for(i=(pIte
139b0 72 2d 3e 6e 53 65 67 2b 69 43 68 61 6e 67 65 64  r->nSeg+iChanged
139c0 29 2f 32 3b 20 31 3b 20 69 3d 69 2f 32 29 7b 0a  )/2; 1; i=i/2){.
139d0 20 20 20 20 20 20 46 74 73 35 43 52 65 73 75 6c        Fts5CResul
139e0 74 20 2a 70 52 65 73 20 3d 20 26 70 49 74 65 72  t *pRes = &pIter
139f0 2d 3e 61 46 69 72 73 74 5b 69 5d 3b 0a 0a 20 20  ->aFirst[i];..  
13a00 20 20 20 20 61 73 73 65 72 74 28 20 70 4e 65 77      assert( pNew
13a10 2d 3e 70 4c 65 61 66 20 29 3b 0a 20 20 20 20 20  ->pLeaf );.     
13a20 20 61 73 73 65 72 74 28 20 70 52 65 73 2d 3e 62   assert( pRes->b
13a30 54 65 72 6d 45 71 3d 3d 30 20 7c 7c 20 70 4f 74  TermEq==0 || pOt
13a40 68 65 72 2d 3e 70 4c 65 61 66 20 29 3b 0a 0a 20  her->pLeaf );.. 
13a50 20 20 20 20 20 69 66 28 20 70 52 65 73 2d 3e 62       if( pRes->b
13a60 54 65 72 6d 45 71 20 29 7b 0a 20 20 20 20 20 20  TermEq ){.      
13a70 20 20 69 66 28 20 70 4e 65 77 2d 3e 69 52 6f 77    if( pNew->iRow
13a80 69 64 3d 3d 70 4f 74 68 65 72 2d 3e 69 52 6f 77  id==pOther->iRow
13a90 69 64 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  id ){.          
13aa0 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20  return 1;.      
13ab0 20 20 7d 65 6c 73 65 20 69 66 28 20 28 70 4f 74    }else if( (pOt
13ac0 68 65 72 2d 3e 69 52 6f 77 69 64 3e 70 4e 65 77  her->iRowid>pNew
13ad0 2d 3e 69 52 6f 77 69 64 29 3d 3d 70 49 74 65 72  ->iRowid)==pIter
13ae0 2d 3e 62 52 65 76 20 29 7b 0a 20 20 20 20 20 20  ->bRev ){.      
13af0 20 20 20 20 70 49 74 65 72 2d 3e 69 53 77 69 74      pIter->iSwit
13b00 63 68 52 6f 77 69 64 20 3d 20 70 4f 74 68 65 72  chRowid = pOther
13b10 2d 3e 69 52 6f 77 69 64 3b 0a 20 20 20 20 20 20  ->iRowid;.      
13b20 20 20 20 20 70 4e 65 77 20 3d 20 70 4f 74 68 65      pNew = pOthe
13b30 72 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  r;.        }else
13b40 20 69 66 28 20 28 70 4f 74 68 65 72 2d 3e 69 52   if( (pOther->iR
13b50 6f 77 69 64 3e 70 49 74 65 72 2d 3e 69 53 77 69  owid>pIter->iSwi
13b60 74 63 68 52 6f 77 69 64 29 3d 3d 70 49 74 65 72  tchRowid)==pIter
13b70 2d 3e 62 52 65 76 20 29 7b 0a 20 20 20 20 20 20  ->bRev ){.      
13b80 20 20 20 20 70 49 74 65 72 2d 3e 69 53 77 69 74      pIter->iSwit
13b90 63 68 52 6f 77 69 64 20 3d 20 70 4f 74 68 65 72  chRowid = pOther
13ba0 2d 3e 69 52 6f 77 69 64 3b 0a 20 20 20 20 20 20  ->iRowid;.      
13bb0 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
13bc0 20 20 70 52 65 73 2d 3e 69 46 69 72 73 74 20 3d    pRes->iFirst =
13bd0 20 28 70 4e 65 77 20 2d 20 70 49 74 65 72 2d 3e   (pNew - pIter->
13be0 61 53 65 67 29 3b 0a 20 20 20 20 20 20 69 66 28  aSeg);.      if(
13bf0 20 69 3d 3d 31 20 29 20 62 72 65 61 6b 3b 0a 0a   i==1 ) break;..
13c00 20 20 20 20 20 20 70 4f 74 68 65 72 20 3d 20 26        pOther = &
13c10 70 49 74 65 72 2d 3e 61 53 65 67 5b 20 70 49 74  pIter->aSeg[ pIt
13c20 65 72 2d 3e 61 46 69 72 73 74 5b 69 20 5e 20 30  er->aFirst[i ^ 0
13c30 78 30 30 30 31 5d 2e 69 46 69 72 73 74 20 5d 3b  x0001].iFirst ];
13c40 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65  .    }.  }..  re
13c50 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
13c60 20 53 65 74 20 74 68 65 20 70 49 74 65 72 2d 3e   Set the pIter->
13c70 62 45 6f 66 20 76 61 72 69 61 62 6c 65 20 62 61  bEof variable ba
13c80 73 65 64 20 6f 6e 20 74 68 65 20 73 74 61 74 65  sed on the state
13c90 20 6f 66 20 74 68 65 20 73 75 62 2d 69 74 65 72   of the sub-iter
13ca0 61 74 6f 72 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  ators..*/.static
13cb0 20 76 6f 69 64 20 66 74 73 35 4d 75 6c 74 69 49   void fts5MultiI
13cc0 74 65 72 53 65 74 45 6f 66 28 46 74 73 35 49 6e  terSetEof(Fts5In
13cd0 64 65 78 49 74 65 72 20 2a 70 49 74 65 72 29 7b  dexIter *pIter){
13ce0 0a 20 20 46 74 73 35 53 65 67 49 74 65 72 20 2a  .  Fts5SegIter *
13cf0 70 53 65 67 20 3d 20 26 70 49 74 65 72 2d 3e 61  pSeg = &pIter->a
13d00 53 65 67 5b 20 70 49 74 65 72 2d 3e 61 46 69 72  Seg[ pIter->aFir
13d10 73 74 5b 31 5d 2e 69 46 69 72 73 74 20 5d 3b 0a  st[1].iFirst ];.
13d20 20 20 70 49 74 65 72 2d 3e 62 45 6f 66 20 3d 20    pIter->bEof = 
13d30 70 53 65 67 2d 3e 70 4c 65 61 66 3d 3d 30 3b 0a  pSeg->pLeaf==0;.
13d40 20 20 70 49 74 65 72 2d 3e 69 53 77 69 74 63 68    pIter->iSwitch
13d50 52 6f 77 69 64 20 3d 20 70 53 65 67 2d 3e 69 52  Rowid = pSeg->iR
13d60 6f 77 69 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d  owid;.}../*.** M
13d70 6f 76 65 20 74 68 65 20 69 74 65 72 61 74 6f 72  ove the iterator
13d80 20 74 6f 20 74 68 65 20 6e 65 78 74 20 65 6e 74   to the next ent
13d90 72 79 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  ry. .**.** If an
13da0 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 61   error occurs, a
13db0 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  n error code is 
13dc0 6c 65 66 74 20 69 6e 20 46 74 73 35 49 6e 64 65  left in Fts5Inde
13dd0 78 2e 72 63 2e 20 49 74 20 69 73 20 6e 6f 74 20  x.rc. It is not 
13de0 0a 2a 2a 20 63 6f 6e 73 69 64 65 72 65 64 20 61  .** considered a
13df0 6e 20 65 72 72 6f 72 20 69 66 20 74 68 65 20 69  n error if the i
13e00 74 65 72 61 74 6f 72 20 72 65 61 63 68 65 73 20  terator reaches 
13e10 45 4f 46 2c 20 6f 72 20 69 66 20 69 74 20 69 73  EOF, or if it is
13e20 20 61 6c 72 65 61 64 79 20 61 74 20 0a 2a 2a 20   already at .** 
13e30 45 4f 46 20 77 68 65 6e 20 74 68 69 73 20 66 75  EOF when this fu
13e40 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
13e50 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
13e60 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 4e 65   fts5MultiIterNe
13e70 78 74 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20  xt(.  Fts5Index 
13e80 2a 70 2c 20 0a 20 20 46 74 73 35 49 6e 64 65 78  *p, .  Fts5Index
13e90 49 74 65 72 20 2a 70 49 74 65 72 2c 0a 20 20 69  Iter *pIter,.  i
13ea0 6e 74 20 62 46 72 6f 6d 2c 20 20 20 20 20 20 20  nt bFrom,       
13eb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
13ec0 2a 20 54 72 75 65 20 69 66 20 61 72 67 75 6d 65  * True if argume
13ed0 6e 74 20 69 46 72 6f 6d 20 69 73 20 76 61 6c 69  nt iFrom is vali
13ee0 64 20 2a 2f 0a 20 20 69 36 34 20 69 46 72 6f 6d  d */.  i64 iFrom
13ef0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13f00 20 20 20 20 20 20 20 2f 2a 20 41 64 76 61 6e 63         /* Advanc
13f10 65 20 61 74 20 6c 65 61 73 74 20 61 73 20 66 61  e at least as fa
13f20 72 20 61 73 20 74 68 69 73 20 2a 2f 0a 29 7b 0a  r as this */.){.
13f30 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c    if( p->rc==SQL
13f40 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 6e  ITE_OK ){.    in
13f50 74 20 62 55 73 65 46 72 6f 6d 20 3d 20 62 46 72  t bUseFrom = bFr
13f60 6f 6d 3b 0a 20 20 20 20 64 6f 20 7b 0a 20 20 20  om;.    do {.   
13f70 20 20 20 69 6e 74 20 69 46 69 72 73 74 20 3d 20     int iFirst = 
13f80 70 49 74 65 72 2d 3e 61 46 69 72 73 74 5b 31 5d  pIter->aFirst[1]
13f90 2e 69 46 69 72 73 74 3b 0a 20 20 20 20 20 20 69  .iFirst;.      i
13fa0 6e 74 20 62 4e 65 77 54 65 72 6d 20 3d 20 30 3b  nt bNewTerm = 0;
13fb0 0a 20 20 20 20 20 20 46 74 73 35 53 65 67 49 74  .      Fts5SegIt
13fc0 65 72 20 2a 70 53 65 67 20 3d 20 26 70 49 74 65  er *pSeg = &pIte
13fd0 72 2d 3e 61 53 65 67 5b 69 46 69 72 73 74 5d 3b  r->aSeg[iFirst];
13fe0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
13ff0 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
14000 29 3b 0a 20 20 20 20 20 20 69 66 28 20 62 55 73  );.      if( bUs
14010 65 46 72 6f 6d 20 26 26 20 70 53 65 67 2d 3e 70  eFrom && pSeg->p
14020 44 6c 69 64 78 20 29 7b 0a 20 20 20 20 20 20 20  Dlidx ){.       
14030 20 66 74 73 35 53 65 67 49 74 65 72 4e 65 78 74   fts5SegIterNext
14040 46 72 6f 6d 28 70 2c 20 70 53 65 67 2c 20 69 46  From(p, pSeg, iF
14050 72 6f 6d 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  rom);.      }els
14060 65 7b 0a 20 20 20 20 20 20 20 20 66 74 73 35 53  e{.        fts5S
14070 65 67 49 74 65 72 4e 65 78 74 28 70 2c 20 70 53  egIterNext(p, pS
14080 65 67 2c 20 26 62 4e 65 77 54 65 72 6d 29 3b 0a  eg, &bNewTerm);.
14090 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69        }..      i
140a0 66 28 20 70 53 65 67 2d 3e 70 4c 65 61 66 3d 3d  f( pSeg->pLeaf==
140b0 30 20 7c 7c 20 62 4e 65 77 54 65 72 6d 20 0a 20  0 || bNewTerm . 
140c0 20 20 20 20 20 20 7c 7c 20 66 74 73 35 4d 75 6c        || fts5Mul
140d0 74 69 49 74 65 72 41 64 76 61 6e 63 65 52 6f 77  tiIterAdvanceRow
140e0 69 64 28 70 2c 20 70 49 74 65 72 2c 20 69 46 69  id(p, pIter, iFi
140f0 72 73 74 29 0a 20 20 20 20 20 20 29 7b 0a 20 20  rst).      ){.  
14100 20 20 20 20 20 20 66 74 73 35 4d 75 6c 74 69 49        fts5MultiI
14110 74 65 72 41 64 76 61 6e 63 65 64 28 70 2c 20 70  terAdvanced(p, p
14120 49 74 65 72 2c 20 69 46 69 72 73 74 2c 20 31 29  Iter, iFirst, 1)
14130 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35 4d 75  ;.        fts5Mu
14140 6c 74 69 49 74 65 72 53 65 74 45 6f 66 28 70 49  ltiIterSetEof(pI
14150 74 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ter);.      }.  
14160 20 20 20 20 66 74 73 35 41 73 73 65 72 74 4d 75      fts5AssertMu
14170 6c 74 69 49 74 65 72 53 65 74 75 70 28 70 2c 20  ltiIterSetup(p, 
14180 70 49 74 65 72 29 3b 0a 0a 20 20 20 20 20 20 62  pIter);..      b
14190 55 73 65 46 72 6f 6d 20 3d 20 30 3b 0a 20 20 20  UseFrom = 0;.   
141a0 20 7d 77 68 69 6c 65 28 20 70 49 74 65 72 2d 3e   }while( pIter->
141b0 62 53 6b 69 70 45 6d 70 74 79 20 26 26 20 66 74  bSkipEmpty && ft
141c0 73 35 4d 75 6c 74 69 49 74 65 72 49 73 45 6d 70  s5MultiIterIsEmp
141d0 74 79 28 70 2c 20 70 49 74 65 72 29 20 29 3b 0a  ty(p, pIter) );.
141e0 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 46 74    }.}..static Ft
141f0 73 35 49 6e 64 65 78 49 74 65 72 20 2a 66 74 73  s5IndexIter *fts
14200 35 4d 75 6c 74 69 49 74 65 72 41 6c 6c 6f 63 28  5MultiIterAlloc(
14210 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c  .  Fts5Index *p,
14220 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14230 20 20 20 2f 2a 20 46 54 53 35 20 62 61 63 6b 65     /* FTS5 backe
14240 6e 64 20 74 6f 20 69 74 65 72 61 74 65 20 77 69  nd to iterate wi
14250 74 68 69 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e 53  thin */.  int nS
14260 65 67 0a 29 7b 0a 20 20 46 74 73 35 49 6e 64 65  eg.){.  Fts5Inde
14270 78 49 74 65 72 20 2a 70 4e 65 77 3b 0a 20 20 69  xIter *pNew;.  i
14280 6e 74 20 6e 53 6c 6f 74 3b 20 20 20 20 20 20 20  nt nSlot;       
14290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
142a0 2a 20 50 6f 77 65 72 20 6f 66 20 74 77 6f 20 3e  * Power of two >
142b0 3d 20 6e 53 65 67 20 2a 2f 0a 0a 20 20 66 6f 72  = nSeg */..  for
142c0 28 6e 53 6c 6f 74 3d 32 3b 20 6e 53 6c 6f 74 3c  (nSlot=2; nSlot<
142d0 6e 53 65 67 3b 20 6e 53 6c 6f 74 3d 6e 53 6c 6f  nSeg; nSlot=nSlo
142e0 74 2a 32 29 3b 0a 20 20 70 4e 65 77 20 3d 20 66  t*2);.  pNew = f
142f0 74 73 35 49 64 78 4d 61 6c 6c 6f 63 28 70 2c 20  ts5IdxMalloc(p, 
14300 0a 20 20 20 20 20 20 73 69 7a 65 6f 66 28 46 74  .      sizeof(Ft
14310 73 35 49 6e 64 65 78 49 74 65 72 29 20 2b 20 20  s5IndexIter) +  
14320 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 70 4e             /* pN
14330 65 77 20 2a 2f 0a 20 20 20 20 20 20 73 69 7a 65  ew */.      size
14340 6f 66 28 46 74 73 35 53 65 67 49 74 65 72 29 20  of(Fts5SegIter) 
14350 2a 20 28 6e 53 6c 6f 74 2d 31 29 20 2b 20 20 20  * (nSlot-1) +   
14360 2f 2a 20 70 4e 65 77 2d 3e 61 53 65 67 5b 5d 20  /* pNew->aSeg[] 
14370 2a 2f 0a 20 20 20 20 20 20 73 69 7a 65 6f 66 28  */.      sizeof(
14380 46 74 73 35 43 52 65 73 75 6c 74 29 20 2a 20 6e  Fts5CResult) * n
14390 53 6c 6f 74 20 20 20 20 20 20 20 20 20 2f 2a 20  Slot         /* 
143a0 70 4e 65 77 2d 3e 61 46 69 72 73 74 5b 5d 20 2a  pNew->aFirst[] *
143b0 2f 0a 20 20 29 3b 0a 20 20 69 66 28 20 70 4e 65  /.  );.  if( pNe
143c0 77 20 29 7b 0a 20 20 20 20 70 4e 65 77 2d 3e 6e  w ){.    pNew->n
143d0 53 65 67 20 3d 20 6e 53 6c 6f 74 3b 0a 20 20 20  Seg = nSlot;.   
143e0 20 70 4e 65 77 2d 3e 61 46 69 72 73 74 20 3d 20   pNew->aFirst = 
143f0 28 46 74 73 35 43 52 65 73 75 6c 74 2a 29 26 70  (Fts5CResult*)&p
14400 4e 65 77 2d 3e 61 53 65 67 5b 6e 53 6c 6f 74 5d  New->aSeg[nSlot]
14410 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 70 49 6e 64  ;.    pNew->pInd
14420 65 78 20 3d 20 70 3b 0a 20 20 7d 0a 20 20 72 65  ex = p;.  }.  re
14430 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a  turn pNew;.}../*
14440 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e  .** Allocate a n
14450 65 77 20 46 74 73 35 49 6e 64 65 78 49 74 65 72  ew Fts5IndexIter
14460 20 6f 62 6a 65 63 74 2e 0a 2a 2a 0a 2a 2a 20 54   object..**.** T
14470 68 65 20 6e 65 77 20 6f 62 6a 65 63 74 20 77 69  he new object wi
14480 6c 6c 20 62 65 20 75 73 65 64 20 74 6f 20 69 74  ll be used to it
14490 65 72 61 74 65 20 74 68 72 6f 75 67 68 20 64 61  erate through da
144a0 74 61 20 69 6e 20 73 74 72 75 63 74 75 72 65 20  ta in structure 
144b0 70 53 74 72 75 63 74 2e 0a 2a 2a 20 49 66 20 69  pStruct..** If i
144c0 4c 65 76 65 6c 20 69 73 20 2d 76 65 2c 20 74 68  Level is -ve, th
144d0 65 6e 20 61 6c 6c 20 64 61 74 61 20 69 6e 20 61  en all data in a
144e0 6c 6c 20 73 65 67 6d 65 6e 74 73 20 69 73 20 6d  ll segments is m
144f0 65 72 67 65 64 2e 20 4f 72 2c 20 69 66 20 69 4c  erged. Or, if iL
14500 65 76 65 6c 0a 2a 2a 20 69 73 20 7a 65 72 6f 20  evel.** is zero 
14510 6f 72 20 67 72 65 61 74 65 72 2c 20 64 61 74 61  or greater, data
14520 20 66 72 6f 6d 20 74 68 65 20 66 69 72 73 74 20   from the first 
14530 6e 53 65 67 6d 65 6e 74 20 73 65 67 6d 65 6e 74  nSegment segment
14540 73 20 6f 6e 20 6c 65 76 65 6c 20 69 4c 65 76 65  s on level iLeve
14550 6c 0a 2a 2a 20 69 73 20 6d 65 72 67 65 64 2e 0a  l.** is merged..
14560 2a 2a 0a 2a 2a 20 54 68 65 20 69 74 65 72 61 74  **.** The iterat
14570 6f 72 20 69 6e 69 74 69 61 6c 6c 79 20 70 6f 69  or initially poi
14580 6e 74 73 20 74 6f 20 74 68 65 20 66 69 72 73 74  nts to the first
14590 20 74 65 72 6d 2f 72 6f 77 69 64 20 65 6e 74 72   term/rowid entr
145a0 79 20 69 6e 20 74 68 65 20 0a 2a 2a 20 69 74 65  y in the .** ite
145b0 72 61 74 65 64 20 64 61 74 61 2e 0a 2a 2f 0a 73  rated data..*/.s
145c0 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 4d  tatic void fts5M
145d0 75 6c 74 69 49 74 65 72 4e 65 77 28 0a 20 20 46  ultiIterNew(.  F
145e0 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20  ts5Index *p,    
145f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
14600 2a 20 46 54 53 35 20 62 61 63 6b 65 6e 64 20 74  * FTS5 backend t
14610 6f 20 69 74 65 72 61 74 65 20 77 69 74 68 69 6e  o iterate within
14620 20 2a 2f 0a 20 20 46 74 73 35 53 74 72 75 63 74   */.  Fts5Struct
14630 75 72 65 20 2a 70 53 74 72 75 63 74 2c 20 20 20  ure *pStruct,   
14640 20 20 20 20 20 20 2f 2a 20 53 74 72 75 63 74 75        /* Structu
14650 72 65 20 6f 66 20 73 70 65 63 69 66 69 63 20 69  re of specific i
14660 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20 62 53  ndex */.  int bS
14670 6b 69 70 45 6d 70 74 79 2c 20 20 20 20 20 20 20  kipEmpty,       
14680 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
14690 65 20 74 6f 20 69 67 6e 6f 72 65 20 64 65 6c 65  e to ignore dele
146a0 74 65 2d 6b 65 79 73 20 2a 2f 0a 20 20 69 6e 74  te-keys */.  int
146b0 20 66 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20   flags,         
146c0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
146d0 46 54 53 35 49 4e 44 45 58 5f 51 55 45 52 59 5f  FTS5INDEX_QUERY_
146e0 58 58 58 20 66 6c 61 67 73 20 2a 2f 0a 20 20 63  XXX flags */.  c
146f0 6f 6e 73 74 20 75 38 20 2a 70 54 65 72 6d 2c 20  onst u8 *pTerm, 
14700 69 6e 74 20 6e 54 65 72 6d 2c 20 20 20 20 20 2f  int nTerm,     /
14710 2a 20 54 65 72 6d 20 74 6f 20 73 65 65 6b 20 74  * Term to seek t
14720 6f 20 28 6f 72 20 4e 55 4c 4c 2f 30 29 20 2a 2f  o (or NULL/0) */
14730 0a 20 20 69 6e 74 20 69 4c 65 76 65 6c 2c 20 20  .  int iLevel,  
14740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14750 20 20 20 2f 2a 20 4c 65 76 65 6c 20 74 6f 20 69     /* Level to i
14760 74 65 72 61 74 65 20 28 2d 31 20 66 6f 72 20 61  terate (-1 for a
14770 6c 6c 29 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 65  ll) */.  int nSe
14780 67 6d 65 6e 74 2c 20 20 20 20 20 20 20 20 20 20  gment,          
14790 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
147a0 65 72 20 6f 66 20 73 65 67 6d 65 6e 74 73 20 74  er of segments t
147b0 6f 20 6d 65 72 67 65 20 28 69 4c 65 76 65 6c 3e  o merge (iLevel>
147c0 3d 30 29 20 2a 2f 0a 20 20 46 74 73 35 49 6e 64  =0) */.  Fts5Ind
147d0 65 78 49 74 65 72 20 2a 2a 70 70 4f 75 74 20 20  exIter **ppOut  
147e0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 77 20           /* New 
147f0 6f 62 6a 65 63 74 20 2a 2f 0a 29 7b 0a 20 20 69  object */.){.  i
14800 6e 74 20 6e 53 65 67 20 3d 20 30 3b 20 20 20 20  nt nSeg = 0;    
14810 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
14820 2a 20 4e 75 6d 62 65 72 20 6f 66 20 73 65 67 6d  * Number of segm
14830 65 6e 74 2d 69 74 65 72 73 20 69 6e 20 75 73 65  ent-iters in use
14840 20 2a 2f 0a 20 20 69 6e 74 20 69 49 74 65 72 20   */.  int iIter 
14850 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
14860 20 20 20 20 20 20 2f 2a 20 2a 2f 0a 20 20 69 6e        /* */.  in
14870 74 20 69 53 65 67 3b 20 20 20 20 20 20 20 20 20  t iSeg;         
14880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
14890 20 55 73 65 64 20 74 6f 20 69 74 65 72 61 74 65   Used to iterate
148a0 20 74 68 72 6f 75 67 68 20 73 65 67 6d 65 6e 74   through segment
148b0 73 20 2a 2f 0a 20 20 46 74 73 35 42 75 66 66 65  s */.  Fts5Buffe
148c0 72 20 62 75 66 20 3d 20 7b 30 2c 30 2c 30 7d 3b  r buf = {0,0,0};
148d0 20 20 20 20 20 20 20 2f 2a 20 42 75 66 66 65 72         /* Buffer
148e0 20 75 73 65 64 20 62 79 20 66 74 73 35 53 65 67   used by fts5Seg
148f0 49 74 65 72 53 65 65 6b 49 6e 69 74 28 29 20 2a  IterSeekInit() *
14900 2f 0a 20 20 46 74 73 35 53 74 72 75 63 74 75 72  /.  Fts5Structur
14910 65 4c 65 76 65 6c 20 2a 70 4c 76 6c 3b 0a 20 20  eLevel *pLvl;.  
14920 46 74 73 35 49 6e 64 65 78 49 74 65 72 20 2a 70  Fts5IndexIter *p
14930 4e 65 77 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  New;..  assert( 
14940 28 70 54 65 72 6d 3d 3d 30 20 26 26 20 6e 54 65  (pTerm==0 && nTe
14950 72 6d 3d 3d 30 29 20 7c 7c 20 69 4c 65 76 65 6c  rm==0) || iLevel
14960 3c 30 20 29 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f  <0 );..  /* Allo
14970 63 61 74 65 20 73 70 61 63 65 20 66 6f 72 20 74  cate space for t
14980 68 65 20 6e 65 77 20 6d 75 6c 74 69 2d 73 65 67  he new multi-seg
14990 2d 69 74 65 72 61 74 6f 72 2e 20 2a 2f 0a 20 20  -iterator. */.  
149a0 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  if( p->rc==SQLIT
149b0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20  E_OK ){.    if( 
149c0 69 4c 65 76 65 6c 3c 30 20 29 7b 0a 20 20 20 20  iLevel<0 ){.    
149d0 20 20 61 73 73 65 72 74 28 20 70 53 74 72 75 63    assert( pStruc
149e0 74 2d 3e 6e 53 65 67 6d 65 6e 74 3d 3d 66 74 73  t->nSegment==fts
149f0 35 53 74 72 75 63 74 75 72 65 43 6f 75 6e 74 53  5StructureCountS
14a00 65 67 6d 65 6e 74 73 28 70 53 74 72 75 63 74 29  egments(pStruct)
14a10 20 29 3b 0a 20 20 20 20 20 20 6e 53 65 67 20 3d   );.      nSeg =
14a20 20 70 53 74 72 75 63 74 2d 3e 6e 53 65 67 6d 65   pStruct->nSegme
14a30 6e 74 3b 0a 20 20 20 20 20 20 6e 53 65 67 20 2b  nt;.      nSeg +
14a40 3d 20 28 70 2d 3e 70 48 61 73 68 20 3f 20 31 20  = (p->pHash ? 1 
14a50 3a 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  : 0);.    }else{
14a60 0a 20 20 20 20 20 20 6e 53 65 67 20 3d 20 4d 49  .      nSeg = MI
14a70 4e 28 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65  N(pStruct->aLeve
14a80 6c 5b 69 4c 65 76 65 6c 5d 2e 6e 53 65 67 2c 20  l[iLevel].nSeg, 
14a90 6e 53 65 67 6d 65 6e 74 29 3b 0a 20 20 20 20 7d  nSegment);.    }
14aa0 0a 20 20 7d 0a 20 20 2a 70 70 4f 75 74 20 3d 20  .  }.  *ppOut = 
14ab0 70 4e 65 77 20 3d 20 66 74 73 35 4d 75 6c 74 69  pNew = fts5Multi
14ac0 49 74 65 72 41 6c 6c 6f 63 28 70 2c 20 6e 53 65  IterAlloc(p, nSe
14ad0 67 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d  g);.  if( pNew==
14ae0 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 4e  0 ) return;.  pN
14af0 65 77 2d 3e 62 52 65 76 20 3d 20 28 30 21 3d 28  ew->bRev = (0!=(
14b00 66 6c 61 67 73 20 26 20 46 54 53 35 49 4e 44 45  flags & FTS5INDE
14b10 58 5f 51 55 45 52 59 5f 44 45 53 43 29 29 3b 0a  X_QUERY_DESC));.
14b20 20 20 70 4e 65 77 2d 3e 62 53 6b 69 70 45 6d 70    pNew->bSkipEmp
14b30 74 79 20 3d 20 62 53 6b 69 70 45 6d 70 74 79 3b  ty = bSkipEmpty;
14b40 0a 20 20 70 4e 65 77 2d 3e 70 53 74 72 75 63 74  .  pNew->pStruct
14b50 20 3d 20 70 53 74 72 75 63 74 3b 0a 20 20 66 74   = pStruct;.  ft
14b60 73 35 53 74 72 75 63 74 75 72 65 52 65 66 28 70  s5StructureRef(p
14b70 53 74 72 75 63 74 29 3b 0a 0a 20 20 2f 2a 20 49  Struct);..  /* I
14b80 6e 69 74 69 61 6c 69 7a 65 20 65 61 63 68 20 6f  nitialize each o
14b90 66 20 74 68 65 20 63 6f 6d 70 6f 6e 65 6e 74 20  f the component 
14ba0 73 65 67 6d 65 6e 74 20 69 74 65 72 61 74 6f 72  segment iterator
14bb0 73 2e 20 2a 2f 0a 20 20 69 66 28 20 69 4c 65 76  s. */.  if( iLev
14bc0 65 6c 3c 30 20 29 7b 0a 20 20 20 20 46 74 73 35  el<0 ){.    Fts5
14bd0 53 74 72 75 63 74 75 72 65 4c 65 76 65 6c 20 2a  StructureLevel *
14be0 70 45 6e 64 20 3d 20 26 70 53 74 72 75 63 74 2d  pEnd = &pStruct-
14bf0 3e 61 4c 65 76 65 6c 5b 70 53 74 72 75 63 74 2d  >aLevel[pStruct-
14c00 3e 6e 4c 65 76 65 6c 5d 3b 0a 20 20 20 20 69 66  >nLevel];.    if
14c10 28 20 70 2d 3e 70 48 61 73 68 20 29 7b 0a 20 20  ( p->pHash ){.  
14c20 20 20 20 20 2f 2a 20 41 64 64 20 61 20 73 65 67      /* Add a seg
14c30 6d 65 6e 74 20 69 74 65 72 61 74 6f 72 20 66 6f  ment iterator fo
14c40 72 20 74 68 65 20 63 75 72 72 65 6e 74 20 63 6f  r the current co
14c50 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 68 61  ntents of the ha
14c60 73 68 20 74 61 62 6c 65 2e 20 2a 2f 0a 20 20 20  sh table. */.   
14c70 20 20 20 46 74 73 35 53 65 67 49 74 65 72 20 2a     Fts5SegIter *
14c80 70 49 74 65 72 20 3d 20 26 70 4e 65 77 2d 3e 61  pIter = &pNew->a
14c90 53 65 67 5b 69 49 74 65 72 2b 2b 5d 3b 0a 20 20  Seg[iIter++];.  
14ca0 20 20 20 20 66 74 73 35 53 65 67 49 74 65 72 48      fts5SegIterH
14cb0 61 73 68 49 6e 69 74 28 70 2c 20 70 54 65 72 6d  ashInit(p, pTerm
14cc0 2c 20 6e 54 65 72 6d 2c 20 66 6c 61 67 73 2c 20  , nTerm, flags, 
14cd0 70 49 74 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20  pIter);.    }.  
14ce0 20 20 66 6f 72 28 70 4c 76 6c 3d 26 70 53 74 72    for(pLvl=&pStr
14cf0 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 30 5d 3b 20  uct->aLevel[0]; 
14d00 70 4c 76 6c 3c 70 45 6e 64 3b 20 70 4c 76 6c 2b  pLvl<pEnd; pLvl+
14d10 2b 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 69 53  +){.      for(iS
14d20 65 67 3d 70 4c 76 6c 2d 3e 6e 53 65 67 2d 31 3b  eg=pLvl->nSeg-1;
14d30 20 69 53 65 67 3e 3d 30 3b 20 69 53 65 67 2d 2d   iSeg>=0; iSeg--
14d40 29 7b 0a 20 20 20 20 20 20 20 20 46 74 73 35 53  ){.        Fts5S
14d50 74 72 75 63 74 75 72 65 53 65 67 6d 65 6e 74 20  tructureSegment 
14d60 2a 70 53 65 67 20 3d 20 26 70 4c 76 6c 2d 3e 61  *pSeg = &pLvl->a
14d70 53 65 67 5b 69 53 65 67 5d 3b 0a 20 20 20 20 20  Seg[iSeg];.     
14d80 20 20 20 46 74 73 35 53 65 67 49 74 65 72 20 2a     Fts5SegIter *
14d90 70 49 74 65 72 20 3d 20 26 70 4e 65 77 2d 3e 61  pIter = &pNew->a
14da0 53 65 67 5b 69 49 74 65 72 2b 2b 5d 3b 0a 20 20  Seg[iIter++];.  
14db0 20 20 20 20 20 20 69 66 28 20 70 54 65 72 6d 3d        if( pTerm=
14dc0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
14dd0 66 74 73 35 53 65 67 49 74 65 72 49 6e 69 74 28  fts5SegIterInit(
14de0 70 2c 20 70 53 65 67 2c 20 70 49 74 65 72 29 3b  p, pSeg, pIter);
14df0 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
14e00 20 20 20 20 20 20 20 20 20 20 66 74 73 35 53 65            fts5Se
14e10 67 49 74 65 72 53 65 65 6b 49 6e 69 74 28 70 2c  gIterSeekInit(p,
14e20 20 26 62 75 66 2c 20 70 54 65 72 6d 2c 20 6e 54   &buf, pTerm, nT
14e30 65 72 6d 2c 20 66 6c 61 67 73 2c 20 70 53 65 67  erm, flags, pSeg
14e40 2c 20 70 49 74 65 72 29 3b 0a 20 20 20 20 20 20  , pIter);.      
14e50 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
14e60 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  }.  }else{.    p
14e70 4c 76 6c 20 3d 20 26 70 53 74 72 75 63 74 2d 3e  Lvl = &pStruct->
14e80 61 4c 65 76 65 6c 5b 69 4c 65 76 65 6c 5d 3b 0a  aLevel[iLevel];.
14e90 20 20 20 20 66 6f 72 28 69 53 65 67 3d 6e 53 65      for(iSeg=nSe
14ea0 67 2d 31 3b 20 69 53 65 67 3e 3d 30 3b 20 69 53  g-1; iSeg>=0; iS
14eb0 65 67 2d 2d 29 7b 0a 20 20 20 20 20 20 66 74 73  eg--){.      fts
14ec0 35 53 65 67 49 74 65 72 49 6e 69 74 28 70 2c 20  5SegIterInit(p, 
14ed0 26 70 4c 76 6c 2d 3e 61 53 65 67 5b 69 53 65 67  &pLvl->aSeg[iSeg
14ee0 5d 2c 20 26 70 4e 65 77 2d 3e 61 53 65 67 5b 69  ], &pNew->aSeg[i
14ef0 49 74 65 72 2b 2b 5d 29 3b 0a 20 20 20 20 7d 0a  Iter++]);.    }.
14f00 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 69 49    }.  assert( iI
14f10 74 65 72 3d 3d 6e 53 65 67 20 29 3b 0a 0a 20 20  ter==nSeg );..  
14f20 2f 2a 20 49 66 20 74 68 65 20 61 62 6f 76 65 20  /* If the above 
14f30 77 61 73 20 73 75 63 63 65 73 73 66 75 6c 2c 20  was successful, 
14f40 65 61 63 68 20 63 6f 6d 70 6f 6e 65 6e 74 20 69  each component i
14f50 74 65 72 61 74 6f 72 73 20 6e 6f 77 20 70 6f 69  terators now poi
14f60 6e 74 73 20 0a 20 20 2a 2a 20 74 6f 20 74 68 65  nts .  ** to the
14f70 20 66 69 72 73 74 20 65 6e 74 72 79 20 69 6e 20   first entry in 
14f80 69 74 73 20 73 65 67 6d 65 6e 74 2e 20 49 6e 20  its segment. In 
14f90 74 68 69 73 20 63 61 73 65 20 69 6e 69 74 69 61  this case initia
14fa0 6c 69 7a 65 20 74 68 65 20 0a 20 20 2a 2a 20 61  lize the .  ** a
14fb0 46 69 72 73 74 5b 5d 20 61 72 72 61 79 2e 20 4f  First[] array. O
14fc0 72 2c 20 69 66 20 61 6e 20 65 72 72 6f 72 20 68  r, if an error h
14fd0 61 73 20 6f 63 63 75 72 72 65 64 2c 20 66 72 65  as occurred, fre
14fe0 65 20 74 68 65 20 69 74 65 72 61 74 6f 72 0a 20  e the iterator. 
14ff0 20 2a 2a 20 6f 62 6a 65 63 74 20 61 6e 64 20 73   ** object and s
15000 65 74 20 74 68 65 20 6f 75 74 70 75 74 20 76 61  et the output va
15010 72 69 61 62 6c 65 20 74 6f 20 4e 55 4c 4c 2e 20  riable to NULL. 
15020 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d   */.  if( p->rc=
15030 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
15040 20 20 66 6f 72 28 69 49 74 65 72 3d 70 4e 65 77    for(iIter=pNew
15050 2d 3e 6e 53 65 67 2d 31 3b 20 69 49 74 65 72 3e  ->nSeg-1; iIter>
15060 30 3b 20 69 49 74 65 72 2d 2d 29 7b 0a 20 20 20  0; iIter--){.   
15070 20 20 20 69 6e 74 20 69 45 71 3b 0a 20 20 20 20     int iEq;.    
15080 20 20 69 66 28 20 28 69 45 71 20 3d 20 66 74 73    if( (iEq = fts
15090 35 4d 75 6c 74 69 49 74 65 72 44 6f 43 6f 6d 70  5MultiIterDoComp
150a0 61 72 65 28 70 4e 65 77 2c 20 69 49 74 65 72 29  are(pNew, iIter)
150b0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 66 74 73  ) ){.        fts
150c0 35 53 65 67 49 74 65 72 4e 65 78 74 28 70 2c 20  5SegIterNext(p, 
150d0 26 70 4e 65 77 2d 3e 61 53 65 67 5b 69 45 71 5d  &pNew->aSeg[iEq]
150e0 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 66 74  , 0);.        ft
150f0 73 35 4d 75 6c 74 69 49 74 65 72 41 64 76 61 6e  s5MultiIterAdvan
15100 63 65 64 28 70 2c 20 70 4e 65 77 2c 20 69 45 71  ced(p, pNew, iEq
15110 2c 20 69 49 74 65 72 29 3b 0a 20 20 20 20 20 20  , iIter);.      
15120 7d 0a 20 20 20 20 7d 0a 20 20 20 20 66 74 73 35  }.    }.    fts5
15130 4d 75 6c 74 69 49 74 65 72 53 65 74 45 6f 66 28  MultiIterSetEof(
15140 70 4e 65 77 29 3b 0a 20 20 20 20 66 74 73 35 41  pNew);.    fts5A
15150 73 73 65 72 74 4d 75 6c 74 69 49 74 65 72 53 65  ssertMultiIterSe
15160 74 75 70 28 70 2c 20 70 4e 65 77 29 3b 0a 0a 20  tup(p, pNew);.. 
15170 20 20 20 69 66 28 20 70 4e 65 77 2d 3e 62 53 6b     if( pNew->bSk
15180 69 70 45 6d 70 74 79 20 26 26 20 66 74 73 35 4d  ipEmpty && fts5M
15190 75 6c 74 69 49 74 65 72 49 73 45 6d 70 74 79 28  ultiIterIsEmpty(
151a0 70 2c 20 70 4e 65 77 29 20 29 7b 0a 20 20 20 20  p, pNew) ){.    
151b0 20 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 4e    fts5MultiIterN
151c0 65 78 74 28 70 2c 20 70 4e 65 77 2c 20 30 2c 20  ext(p, pNew, 0, 
151d0 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  0);.    }.  }els
151e0 65 7b 0a 20 20 20 20 66 74 73 35 4d 75 6c 74 69  e{.    fts5Multi
151f0 49 74 65 72 46 72 65 65 28 70 2c 20 70 4e 65 77  IterFree(p, pNew
15200 29 3b 0a 20 20 20 20 2a 70 70 4f 75 74 20 3d 20  );.    *ppOut = 
15210 30 3b 0a 20 20 7d 0a 20 20 66 74 73 35 42 75 66  0;.  }.  fts5Buf
15220 66 65 72 46 72 65 65 28 26 62 75 66 29 3b 0a 7d  ferFree(&buf);.}
15230 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61  ../*.** Create a
15240 6e 20 46 74 73 35 49 6e 64 65 78 49 74 65 72 20  n Fts5IndexIter 
15250 74 68 61 74 20 69 74 65 72 61 74 65 73 20 74 68  that iterates th
15260 72 6f 75 67 68 20 74 68 65 20 64 6f 63 6c 69 73  rough the doclis
15270 74 20 70 72 6f 76 69 64 65 64 0a 2a 2a 20 61 73  t provided.** as
15280 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
15290 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ment..*/.static 
152a0 76 6f 69 64 20 66 74 73 35 4d 75 6c 74 69 49 74  void fts5MultiIt
152b0 65 72 4e 65 77 32 28 0a 20 20 46 74 73 35 49 6e  erNew2(.  Fts5In
152c0 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20 20  dex *p,         
152d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53            /* FTS
152e0 35 20 62 61 63 6b 65 6e 64 20 74 6f 20 69 74 65  5 backend to ite
152f0 72 61 74 65 20 77 69 74 68 69 6e 20 2a 2f 0a 20  rate within */. 
15300 20 46 74 73 35 44 61 74 61 20 2a 70 44 61 74 61   Fts5Data *pData
15310 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
15320 20 2f 2a 20 44 6f 63 6c 69 73 74 20 74 6f 20 69   /* Doclist to i
15330 74 65 72 61 74 65 20 74 68 72 6f 75 67 68 20 2a  terate through *
15340 2f 0a 20 20 69 6e 74 20 62 44 65 73 63 2c 20 20  /.  int bDesc,  
15350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15360 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20      /* True for 
15370 64 65 73 63 65 6e 64 69 6e 67 20 72 6f 77 69 64  descending rowid
15380 20 6f 72 64 65 72 20 2a 2f 0a 20 20 46 74 73 35   order */.  Fts5
15390 49 6e 64 65 78 49 74 65 72 20 2a 2a 70 70 4f 75  IndexIter **ppOu
153a0 74 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  t           /* N
153b0 65 77 20 6f 62 6a 65 63 74 20 2a 2f 0a 29 7b 0a  ew object */.){.
153c0 20 20 46 74 73 35 49 6e 64 65 78 49 74 65 72 20    Fts5IndexIter 
153d0 2a 70 4e 65 77 3b 0a 20 20 70 4e 65 77 20 3d 20  *pNew;.  pNew = 
153e0 66 74 73 35 4d 75 6c 74 69 49 74 65 72 41 6c 6c  fts5MultiIterAll
153f0 6f 63 28 70 2c 20 32 29 3b 0a 20 20 69 66 28 20  oc(p, 2);.  if( 
15400 70 4e 65 77 20 29 7b 0a 20 20 20 20 46 74 73 35  pNew ){.    Fts5
15410 53 65 67 49 74 65 72 20 2a 70 49 74 65 72 20 3d  SegIter *pIter =
15420 20 26 70 4e 65 77 2d 3e 61 53 65 67 5b 31 5d 3b   &pNew->aSeg[1];
15430 0a 0a 20 20 20 20 70 49 74 65 72 2d 3e 66 6c 61  ..    pIter->fla
15440 67 73 20 3d 20 46 54 53 35 5f 53 45 47 49 54 45  gs = FTS5_SEGITE
15450 52 5f 4f 4e 45 54 45 52 4d 3b 0a 20 20 20 20 69  R_ONETERM;.    i
15460 66 28 20 70 44 61 74 61 2d 3e 73 7a 4c 65 61 66  f( pData->szLeaf
15470 3e 30 20 29 7b 0a 20 20 20 20 20 20 70 49 74 65  >0 ){.      pIte
15480 72 2d 3e 70 4c 65 61 66 20 3d 20 70 44 61 74 61  r->pLeaf = pData
15490 3b 0a 20 20 20 20 20 20 70 49 74 65 72 2d 3e 69  ;.      pIter->i
154a0 4c 65 61 66 4f 66 66 73 65 74 20 3d 20 66 74 73  LeafOffset = fts
154b0 35 47 65 74 56 61 72 69 6e 74 28 70 44 61 74 61  5GetVarint(pData
154c0 2d 3e 70 2c 20 28 75 36 34 2a 29 26 70 49 74 65  ->p, (u64*)&pIte
154d0 72 2d 3e 69 52 6f 77 69 64 29 3b 0a 20 20 20 20  r->iRowid);.    
154e0 20 20 70 49 74 65 72 2d 3e 69 45 6e 64 6f 66 44    pIter->iEndofD
154f0 6f 63 6c 69 73 74 20 3d 20 70 44 61 74 61 2d 3e  oclist = pData->
15500 6e 6e 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e  nn;.      pNew->
15510 61 46 69 72 73 74 5b 31 5d 2e 69 46 69 72 73 74  aFirst[1].iFirst
15520 20 3d 20 31 3b 0a 20 20 20 20 20 20 69 66 28 20   = 1;.      if( 
15530 62 44 65 73 63 20 29 7b 0a 20 20 20 20 20 20 20  bDesc ){.       
15540 20 70 4e 65 77 2d 3e 62 52 65 76 20 3d 20 31 3b   pNew->bRev = 1;
15550 0a 20 20 20 20 20 20 20 20 70 49 74 65 72 2d 3e  .        pIter->
15560 66 6c 61 67 73 20 7c 3d 20 46 54 53 35 5f 53 45  flags |= FTS5_SE
15570 47 49 54 45 52 5f 52 45 56 45 52 53 45 3b 0a 20  GITER_REVERSE;. 
15580 20 20 20 20 20 20 20 66 74 73 35 53 65 67 49 74         fts5SegIt
15590 65 72 52 65 76 65 72 73 65 49 6e 69 74 50 61 67  erReverseInitPag
155a0 65 28 70 2c 20 70 49 74 65 72 29 3b 0a 20 20 20  e(p, pIter);.   
155b0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
155c0 20 20 66 74 73 35 53 65 67 49 74 65 72 4c 6f 61    fts5SegIterLoa
155d0 64 4e 50 6f 73 28 70 2c 20 70 49 74 65 72 29 3b  dNPos(p, pIter);
155e0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
155f0 44 61 74 61 20 3d 20 30 3b 0a 20 20 20 20 7d 65  Data = 0;.    }e
15600 6c 73 65 7b 0a 20 20 20 20 20 20 70 4e 65 77 2d  lse{.      pNew-
15610 3e 62 45 6f 66 20 3d 20 31 3b 0a 20 20 20 20 7d  >bEof = 1;.    }
15620 0a 0a 20 20 20 20 2a 70 70 4f 75 74 20 3d 20 70  ..    *ppOut = p
15630 4e 65 77 3b 0a 20 20 7d 0a 0a 20 20 66 74 73 35  New;.  }..  fts5
15640 44 61 74 61 52 65 6c 65 61 73 65 28 70 44 61 74  DataRelease(pDat
15650 61 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  a);.}../*.** Ret
15660 75 72 6e 20 74 72 75 65 20 69 66 20 74 68 65 20  urn true if the 
15670 69 74 65 72 61 74 6f 72 20 69 73 20 61 74 20 45  iterator is at E
15680 4f 46 20 6f 72 20 69 66 20 61 6e 20 65 72 72 6f  OF or if an erro
15690 72 20 68 61 73 20 6f 63 63 75 72 72 65 64 2e 20  r has occurred. 
156a0 0a 2a 2a 20 46 61 6c 73 65 20 6f 74 68 65 72 77  .** False otherw
156b0 69 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ise..*/.static i
156c0 6e 74 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72  nt fts5MultiIter
156d0 45 6f 66 28 46 74 73 35 49 6e 64 65 78 20 2a 70  Eof(Fts5Index *p
156e0 2c 20 46 74 73 35 49 6e 64 65 78 49 74 65 72 20  , Fts5IndexIter 
156f0 2a 70 49 74 65 72 29 7b 0a 20 20 61 73 73 65 72  *pIter){.  asser
15700 74 28 20 70 2d 3e 72 63 20 0a 20 20 20 20 20 20  t( p->rc .      
15710 7c 7c 20 28 70 49 74 65 72 2d 3e 61 53 65 67 5b  || (pIter->aSeg[
15720 20 70 49 74 65 72 2d 3e 61 46 69 72 73 74 5b 31   pIter->aFirst[1
15730 5d 2e 69 46 69 72 73 74 20 5d 2e 70 4c 65 61 66  ].iFirst ].pLeaf
15740 3d 3d 30 29 3d 3d 70 49 74 65 72 2d 3e 62 45 6f  ==0)==pIter->bEo
15750 66 20 0a 20 20 29 3b 0a 20 20 72 65 74 75 72 6e  f .  );.  return
15760 20 28 70 2d 3e 72 63 20 7c 7c 20 70 49 74 65 72   (p->rc || pIter
15770 2d 3e 62 45 6f 66 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  ->bEof);.}../*.*
15780 2a 20 52 65 74 75 72 6e 20 74 68 65 20 72 6f 77  * Return the row
15790 69 64 20 6f 66 20 74 68 65 20 65 6e 74 72 79 20  id of the entry 
157a0 74 68 61 74 20 74 68 65 20 69 74 65 72 61 74 6f  that the iterato
157b0 72 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e  r currently poin
157c0 74 73 0a 2a 2a 20 74 6f 2e 20 49 66 20 74 68 65  ts.** to. If the
157d0 20 69 74 65 72 61 74 6f 72 20 70 6f 69 6e 74 73   iterator points
157e0 20 74 6f 20 45 4f 46 20 77 68 65 6e 20 74 68 69   to EOF when thi
157f0 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
15800 6c 6c 65 64 20 74 68 65 0a 2a 2a 20 72 65 73 75  lled the.** resu
15810 6c 74 73 20 61 72 65 20 75 6e 64 65 66 69 6e 65  lts are undefine
15820 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 36 34  d..*/.static i64
15830 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 52 6f   fts5MultiIterRo
15840 77 69 64 28 46 74 73 35 49 6e 64 65 78 49 74 65  wid(Fts5IndexIte
15850 72 20 2a 70 49 74 65 72 29 7b 0a 20 20 61 73 73  r *pIter){.  ass
15860 65 72 74 28 20 70 49 74 65 72 2d 3e 61 53 65 67  ert( pIter->aSeg
15870 5b 20 70 49 74 65 72 2d 3e 61 46 69 72 73 74 5b  [ pIter->aFirst[
15880 31 5d 2e 69 46 69 72 73 74 20 5d 2e 70 4c 65 61  1].iFirst ].pLea
15890 66 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 49  f );.  return pI
158a0 74 65 72 2d 3e 61 53 65 67 5b 20 70 49 74 65 72  ter->aSeg[ pIter
158b0 2d 3e 61 46 69 72 73 74 5b 31 5d 2e 69 46 69 72  ->aFirst[1].iFir
158c0 73 74 20 5d 2e 69 52 6f 77 69 64 3b 0a 7d 0a 0a  st ].iRowid;.}..
158d0 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 69  /*.** Move the i
158e0 74 65 72 61 74 6f 72 20 74 6f 20 74 68 65 20 6e  terator to the n
158f0 65 78 74 20 65 6e 74 72 79 20 61 74 20 6f 72 20  ext entry at or 
15900 66 6f 6c 6c 6f 77 69 6e 67 20 69 4d 61 74 63 68  following iMatch
15910 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
15920 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 4e 65   fts5MultiIterNe
15930 78 74 46 72 6f 6d 28 0a 20 20 46 74 73 35 49 6e  xtFrom(.  Fts5In
15940 64 65 78 20 2a 70 2c 20 0a 20 20 46 74 73 35 49  dex *p, .  Fts5I
15950 6e 64 65 78 49 74 65 72 20 2a 70 49 74 65 72 2c  ndexIter *pIter,
15960 20 0a 20 20 69 36 34 20 69 4d 61 74 63 68 0a 29   .  i64 iMatch.)
15970 7b 0a 20 20 77 68 69 6c 65 28 20 31 20 29 7b 0a  {.  while( 1 ){.
15980 20 20 20 20 69 36 34 20 69 52 6f 77 69 64 3b 0a      i64 iRowid;.
15990 20 20 20 20 66 74 73 35 4d 75 6c 74 69 49 74 65      fts5MultiIte
159a0 72 4e 65 78 74 28 70 2c 20 70 49 74 65 72 2c 20  rNext(p, pIter, 
159b0 31 2c 20 69 4d 61 74 63 68 29 3b 0a 20 20 20 20  1, iMatch);.    
159c0 69 66 28 20 66 74 73 35 4d 75 6c 74 69 49 74 65  if( fts5MultiIte
159d0 72 45 6f 66 28 70 2c 20 70 49 74 65 72 29 20 29  rEof(p, pIter) )
159e0 20 62 72 65 61 6b 3b 0a 20 20 20 20 69 52 6f 77   break;.    iRow
159f0 69 64 20 3d 20 66 74 73 35 4d 75 6c 74 69 49 74  id = fts5MultiIt
15a00 65 72 52 6f 77 69 64 28 70 49 74 65 72 29 3b 0a  erRowid(pIter);.
15a10 20 20 20 20 69 66 28 20 70 49 74 65 72 2d 3e 62      if( pIter->b
15a20 52 65 76 3d 3d 30 20 26 26 20 69 52 6f 77 69 64  Rev==0 && iRowid
15a30 3e 3d 69 4d 61 74 63 68 20 29 20 62 72 65 61 6b  >=iMatch ) break
15a40 3b 0a 20 20 20 20 69 66 28 20 70 49 74 65 72 2d  ;.    if( pIter-
15a50 3e 62 52 65 76 21 3d 30 20 26 26 20 69 52 6f 77  >bRev!=0 && iRow
15a60 69 64 3c 3d 69 4d 61 74 63 68 20 29 20 62 72 65  id<=iMatch ) bre
15a70 61 6b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  ak;.  }.}../*.**
15a80 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   Return a pointe
15a90 72 20 74 6f 20 61 20 62 75 66 66 65 72 20 63 6f  r to a buffer co
15aa0 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 74 65 72  ntaining the ter
15ab0 6d 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  m associated wit
15ac0 68 20 74 68 65 20 0a 2a 2a 20 65 6e 74 72 79 20  h the .** entry 
15ad0 74 68 61 74 20 74 68 65 20 69 74 65 72 61 74 6f  that the iterato
15ae0 72 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e  r currently poin
15af0 74 73 20 74 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63  ts to..*/.static
15b00 20 63 6f 6e 73 74 20 75 38 20 2a 66 74 73 35 4d   const u8 *fts5M
15b10 75 6c 74 69 49 74 65 72 54 65 72 6d 28 46 74 73  ultiIterTerm(Fts
15b20 35 49 6e 64 65 78 49 74 65 72 20 2a 70 49 74 65  5IndexIter *pIte
15b30 72 2c 20 69 6e 74 20 2a 70 6e 29 7b 0a 20 20 46  r, int *pn){.  F
15b40 74 73 35 53 65 67 49 74 65 72 20 2a 70 20 3d 20  ts5SegIter *p = 
15b50 26 70 49 74 65 72 2d 3e 61 53 65 67 5b 20 70 49  &pIter->aSeg[ pI
15b60 74 65 72 2d 3e 61 46 69 72 73 74 5b 31 5d 2e 69  ter->aFirst[1].i
15b70 46 69 72 73 74 20 5d 3b 0a 20 20 2a 70 6e 20 3d  First ];.  *pn =
15b80 20 70 2d 3e 74 65 72 6d 2e 6e 3b 0a 20 20 72 65   p->term.n;.  re
15b90 74 75 72 6e 20 70 2d 3e 74 65 72 6d 2e 70 3b 0a  turn p->term.p;.
15ba0 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  }..static void f
15bb0 74 73 35 43 68 75 6e 6b 49 74 65 72 61 74 65 28  ts5ChunkIterate(
15bc0 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c  .  Fts5Index *p,
15bd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15be0 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 62 6a 65     /* Index obje
15bf0 63 74 20 2a 2f 0a 20 20 46 74 73 35 53 65 67 49  ct */.  Fts5SegI
15c00 74 65 72 20 2a 70 53 65 67 2c 20 20 20 20 20 20  ter *pSeg,      
15c10 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 73 6c 69          /* Posli
15c20 73 74 20 6f 66 20 74 68 69 73 20 69 74 65 72 61  st of this itera
15c30 74 6f 72 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70  tor */.  void *p
15c40 43 74 78 2c 20 20 20 20 20 20 20 20 20 20 20 20  Ctx,            
15c50 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 74           /* Cont
15c60 65 78 74 20 70 6f 69 6e 74 65 72 20 66 6f 72 20  ext pointer for 
15c70 78 43 68 75 6e 6b 20 63 61 6c 6c 62 61 63 6b 20  xChunk callback 
15c80 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 78 43 68 75  */.  void (*xChu
15c90 6e 6b 29 28 46 74 73 35 49 6e 64 65 78 2a 2c 20  nk)(Fts5Index*, 
15ca0 76 6f 69 64 2a 2c 20 63 6f 6e 73 74 20 75 38 2a  void*, const u8*
15cb0 2c 20 69 6e 74 29 0a 29 7b 0a 20 20 69 6e 74 20  , int).){.  int 
15cc0 6e 52 65 6d 20 3d 20 70 53 65 67 2d 3e 6e 50 6f  nRem = pSeg->nPo
15cd0 73 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  s;          /* N
15ce0 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 73  umber of bytes s
15cf0 74 69 6c 6c 20 74 6f 20 63 6f 6d 65 20 2a 2f 0a  till to come */.
15d00 20 20 46 74 73 35 44 61 74 61 20 2a 70 44 61 74    Fts5Data *pDat
15d10 61 20 3d 20 30 3b 0a 20 20 75 38 20 2a 70 43 68  a = 0;.  u8 *pCh
15d20 75 6e 6b 20 3d 20 26 70 53 65 67 2d 3e 70 4c 65  unk = &pSeg->pLe
15d30 61 66 2d 3e 70 5b 70 53 65 67 2d 3e 69 4c 65 61  af->p[pSeg->iLea
15d40 66 4f 66 66 73 65 74 5d 3b 0a 20 20 69 6e 74 20  fOffset];.  int 
15d50 6e 43 68 75 6e 6b 20 3d 20 4d 49 4e 28 6e 52 65  nChunk = MIN(nRe
15d60 6d 2c 20 70 53 65 67 2d 3e 70 4c 65 61 66 2d 3e  m, pSeg->pLeaf->
15d70 73 7a 4c 65 61 66 20 2d 20 70 53 65 67 2d 3e 69  szLeaf - pSeg->i
15d80 4c 65 61 66 4f 66 66 73 65 74 29 3b 0a 20 20 69  LeafOffset);.  i
15d90 6e 74 20 70 67 6e 6f 20 3d 20 70 53 65 67 2d 3e  nt pgno = pSeg->
15da0 69 4c 65 61 66 50 67 6e 6f 3b 0a 20 20 69 6e 74  iLeafPgno;.  int
15db0 20 70 67 6e 6f 53 61 76 65 20 3d 20 30 3b 0a 0a   pgnoSave = 0;..
15dc0 20 20 69 66 28 20 28 70 53 65 67 2d 3e 66 6c 61    if( (pSeg->fla
15dd0 67 73 20 26 20 46 54 53 35 5f 53 45 47 49 54 45  gs & FTS5_SEGITE
15de0 52 5f 52 45 56 45 52 53 45 29 3d 3d 30 20 29 7b  R_REVERSE)==0 ){
15df0 0a 20 20 20 20 70 67 6e 6f 53 61 76 65 20 3d 20  .    pgnoSave = 
15e00 70 67 6e 6f 2b 31 3b 0a 20 20 7d 0a 0a 20 20 77  pgno+1;.  }..  w
15e10 68 69 6c 65 28 20 31 20 29 7b 0a 20 20 20 20 78  hile( 1 ){.    x
15e20 43 68 75 6e 6b 28 70 2c 20 70 43 74 78 2c 20 70  Chunk(p, pCtx, p
15e30 43 68 75 6e 6b 2c 20 6e 43 68 75 6e 6b 29 3b 0a  Chunk, nChunk);.
15e40 20 20 20 20 6e 52 65 6d 20 2d 3d 20 6e 43 68 75      nRem -= nChu
15e50 6e 6b 3b 0a 20 20 20 20 66 74 73 35 44 61 74 61  nk;.    fts5Data
15e60 52 65 6c 65 61 73 65 28 70 44 61 74 61 29 3b 0a  Release(pData);.
15e70 20 20 20 20 69 66 28 20 6e 52 65 6d 3c 3d 30 20      if( nRem<=0 
15e80 29 7b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  ){.      break;.
15e90 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
15ea0 20 70 67 6e 6f 2b 2b 3b 0a 20 20 20 20 20 20 70   pgno++;.      p
15eb0 44 61 74 61 20 3d 20 66 74 73 35 44 61 74 61 52  Data = fts5DataR
15ec0 65 61 64 28 70 2c 20 46 54 53 35 5f 53 45 47 4d  ead(p, FTS5_SEGM
15ed0 45 4e 54 5f 52 4f 57 49 44 28 70 53 65 67 2d 3e  ENT_ROWID(pSeg->
15ee0 70 53 65 67 2d 3e 69 53 65 67 69 64 2c 20 70 67  pSeg->iSegid, pg
15ef0 6e 6f 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20  no));.      if( 
15f00 70 44 61 74 61 3d 3d 30 20 29 20 62 72 65 61 6b  pData==0 ) break
15f10 3b 0a 20 20 20 20 20 20 70 43 68 75 6e 6b 20 3d  ;.      pChunk =
15f20 20 26 70 44 61 74 61 2d 3e 70 5b 34 5d 3b 0a 20   &pData->p[4];. 
15f30 20 20 20 20 20 6e 43 68 75 6e 6b 20 3d 20 4d 49       nChunk = MI
15f40 4e 28 6e 52 65 6d 2c 20 70 44 61 74 61 2d 3e 73  N(nRem, pData->s
15f50 7a 4c 65 61 66 20 2d 20 34 29 3b 0a 20 20 20 20  zLeaf - 4);.    
15f60 20 20 69 66 28 20 70 67 6e 6f 3d 3d 70 67 6e 6f    if( pgno==pgno
15f70 53 61 76 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Save ){.        
15f80 61 73 73 65 72 74 28 20 70 53 65 67 2d 3e 70 4e  assert( pSeg->pN
15f90 65 78 74 4c 65 61 66 3d 3d 30 20 29 3b 0a 20 20  extLeaf==0 );.  
15fa0 20 20 20 20 20 20 70 53 65 67 2d 3e 70 4e 65 78        pSeg->pNex
15fb0 74 4c 65 61 66 20 3d 20 70 44 61 74 61 3b 0a 20  tLeaf = pData;. 
15fc0 20 20 20 20 20 20 20 70 44 61 74 61 20 3d 20 30         pData = 0
15fd0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
15fe0 20 20 7d 0a 7d 0a 0a 0a 0a 2f 2a 0a 2a 2a 20 41    }.}..../*.** A
15ff0 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 73 65  llocate a new se
16000 67 6d 65 6e 74 2d 69 64 20 66 6f 72 20 74 68 65  gment-id for the
16010 20 73 74 72 75 63 74 75 72 65 20 70 53 74 72 75   structure pStru
16020 63 74 2e 20 54 68 65 20 6e 65 77 20 73 65 67 6d  ct. The new segm
16030 65 6e 74 0a 2a 2a 20 69 64 20 6d 75 73 74 20 62  ent.** id must b
16040 65 20 62 65 74 77 65 65 6e 20 31 20 61 6e 64 20  e between 1 and 
16050 36 35 33 33 35 20 69 6e 63 6c 75 73 69 76 65 2c  65335 inclusive,
16060 20 61 6e 64 20 6d 75 73 74 20 6e 6f 74 20 62 65   and must not be
16070 20 75 73 65 64 20 62 79 20 0a 2a 2a 20 61 6e 79   used by .** any
16080 20 63 75 72 72 65 6e 74 6c 79 20 65 78 69 73 74   currently exist
16090 69 6e 67 20 73 65 67 6d 65 6e 74 2e 20 49 66 20  ing segment. If 
160a0 61 20 66 72 65 65 20 73 65 67 6d 65 6e 74 20 69  a free segment i
160b0 64 20 63 61 6e 6e 6f 74 20 62 65 20 66 6f 75 6e  d cannot be foun
160c0 64 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 46 55 4c  d,.** SQLITE_FUL
160d0 4c 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  L is returned..*
160e0 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72  *.** If an error
160f0 20 68 61 73 20 61 6c 72 65 61 64 79 20 6f 63 63   has already occ
16100 75 72 72 65 64 2c 20 74 68 69 73 20 66 75 6e 63  urred, this func
16110 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  tion is a no-op.
16120 20 30 20 69 73 20 0a 2a 2a 20 72 65 74 75 72 6e   0 is .** return
16130 65 64 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e  ed in this case.
16140 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .*/.static int f
16150 74 73 35 41 6c 6c 6f 63 61 74 65 53 65 67 69 64  ts5AllocateSegid
16160 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 46  (Fts5Index *p, F
16170 74 73 35 53 74 72 75 63 74 75 72 65 20 2a 70 53  ts5Structure *pS
16180 74 72 75 63 74 29 7b 0a 20 20 69 6e 74 20 69 53  truct){.  int iS
16190 65 67 69 64 20 3d 20 30 3b 0a 0a 20 20 69 66 28  egid = 0;..  if(
161a0 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
161b0 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 70 53 74  K ){.    if( pSt
161c0 72 75 63 74 2d 3e 6e 53 65 67 6d 65 6e 74 3e 3d  ruct->nSegment>=
161d0 46 54 53 35 5f 4d 41 58 5f 53 45 47 4d 45 4e 54  FTS5_MAX_SEGMENT
161e0 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 72 63 20   ){.      p->rc 
161f0 3d 20 53 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20  = SQLITE_FULL;. 
16200 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
16210 77 68 69 6c 65 28 20 69 53 65 67 69 64 3d 3d 30  while( iSegid==0
16220 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20   ){.        int 
16230 69 4c 76 6c 2c 20 69 53 65 67 3b 0a 20 20 20 20  iLvl, iSeg;.    
16240 20 20 20 20 73 71 6c 69 74 65 33 5f 72 61 6e 64      sqlite3_rand
16250 6f 6d 6e 65 73 73 28 73 69 7a 65 6f 66 28 75 33  omness(sizeof(u3
16260 32 29 2c 20 28 76 6f 69 64 2a 29 26 69 53 65 67  2), (void*)&iSeg
16270 69 64 29 3b 0a 20 20 20 20 20 20 20 20 69 53 65  id);.        iSe
16280 67 69 64 20 3d 20 69 53 65 67 69 64 20 26 20 28  gid = iSegid & (
16290 28 31 20 3c 3c 20 46 54 53 35 5f 44 41 54 41 5f  (1 << FTS5_DATA_
162a0 49 44 5f 42 29 2d 31 29 3b 0a 20 20 20 20 20 20  ID_B)-1);.      
162b0 20 20 66 6f 72 28 69 4c 76 6c 3d 30 3b 20 69 4c    for(iLvl=0; iL
162c0 76 6c 3c 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76  vl<pStruct->nLev
162d0 65 6c 3b 20 69 4c 76 6c 2b 2b 29 7b 0a 20 20 20  el; iLvl++){.   
162e0 20 20 20 20 20 20 20 66 6f 72 28 69 53 65 67 3d         for(iSeg=
162f0 30 3b 20 69 53 65 67 3c 70 53 74 72 75 63 74 2d  0; iSeg<pStruct-
16300 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d 2e 6e 53  >aLevel[iLvl].nS
16310 65 67 3b 20 69 53 65 67 2b 2b 29 7b 0a 20 20 20  eg; iSeg++){.   
16320 20 20 20 20 20 20 20 20 20 69 66 28 20 69 53 65           if( iSe
16330 67 69 64 3d 3d 70 53 74 72 75 63 74 2d 3e 61 4c  gid==pStruct->aL
16340 65 76 65 6c 5b 69 4c 76 6c 5d 2e 61 53 65 67 5b  evel[iLvl].aSeg[
16350 69 53 65 67 5d 2e 69 53 65 67 69 64 20 29 7b 0a  iSeg].iSegid ){.
16360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 53                iS
16370 65 67 69 64 20 3d 20 30 3b 0a 20 20 20 20 20 20  egid = 0;.      
16380 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
16390 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
163a0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
163b0 0a 20 20 72 65 74 75 72 6e 20 69 53 65 67 69 64  .  return iSegid
163c0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 69 73 63 61  ;.}../*.** Disca
163d0 72 64 20 61 6c 6c 20 64 61 74 61 20 63 75 72 72  rd all data curr
163e0 65 6e 74 6c 79 20 63 61 63 68 65 64 20 69 6e 20  ently cached in 
163f0 74 68 65 20 68 61 73 68 2d 74 61 62 6c 65 73 2e  the hash-tables.
16400 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
16410 66 74 73 35 49 6e 64 65 78 44 69 73 63 61 72 64  fts5IndexDiscard
16420 44 61 74 61 28 46 74 73 35 49 6e 64 65 78 20 2a  Data(Fts5Index *
16430 70 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 2d  p){.  assert( p-
16440 3e 70 48 61 73 68 20 7c 7c 20 70 2d 3e 6e 50 65  >pHash || p->nPe
16450 6e 64 69 6e 67 44 61 74 61 3d 3d 30 20 29 3b 0a  ndingData==0 );.
16460 20 20 69 66 28 20 70 2d 3e 70 48 61 73 68 20 29    if( p->pHash )
16470 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 46 74 73  {.    sqlite3Fts
16480 35 48 61 73 68 43 6c 65 61 72 28 70 2d 3e 70 48  5HashClear(p->pH
16490 61 73 68 29 3b 0a 20 20 20 20 70 2d 3e 6e 50 65  ash);.    p->nPe
164a0 6e 64 69 6e 67 44 61 74 61 20 3d 20 30 3b 0a 20  ndingData = 0;. 
164b0 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75   }.}../*.** Retu
164c0 72 6e 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  rn the size of t
164d0 68 65 20 70 72 65 66 69 78 2c 20 69 6e 20 62 79  he prefix, in by
164e0 74 65 73 2c 20 74 68 61 74 20 62 75 66 66 65 72  tes, that buffer
164f0 20 28 6e 4e 65 77 2f 70 4e 65 77 29 20 73 68 61   (nNew/pNew) sha
16500 72 65 73 0a 2a 2a 20 77 69 74 68 20 62 75 66 66  res.** with buff
16510 65 72 20 28 6e 4f 6c 64 2f 70 4f 6c 64 29 2e 0a  er (nOld/pOld)..
16520 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74  */.static int ft
16530 73 35 50 72 65 66 69 78 43 6f 6d 70 72 65 73 73  s5PrefixCompress
16540 28 0a 20 20 69 6e 74 20 6e 4f 6c 64 2c 20 63 6f  (.  int nOld, co
16550 6e 73 74 20 75 38 20 2a 70 4f 6c 64 2c 0a 20 20  nst u8 *pOld,.  
16560 69 6e 74 20 6e 4e 65 77 2c 20 63 6f 6e 73 74 20  int nNew, const 
16570 75 38 20 2a 70 4e 65 77 0a 29 7b 0a 20 20 69 6e  u8 *pNew.){.  in
16580 74 20 69 3b 0a 20 20 61 73 73 65 72 74 28 20 66  t i;.  assert( f
16590 74 73 35 42 6c 6f 62 43 6f 6d 70 61 72 65 28 70  ts5BlobCompare(p
165a0 4f 6c 64 2c 20 6e 4f 6c 64 2c 20 70 4e 65 77 2c  Old, nOld, pNew,
165b0 20 6e 4e 65 77 29 3c 30 20 29 3b 0a 20 20 66 6f   nNew)<0 );.  fo
165c0 72 28 69 3d 30 3b 20 69 3c 6e 4f 6c 64 3b 20 69  r(i=0; i<nOld; i
165d0 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 4f 6c  ++){.    if( pOl
165e0 64 5b 69 5d 21 3d 70 4e 65 77 5b 69 5d 20 29 20  d[i]!=pNew[i] ) 
165f0 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72 65 74  break;.  }.  ret
16600 75 72 6e 20 69 3b 0a 7d 0a 0a 73 74 61 74 69 63  urn i;.}..static
16610 20 76 6f 69 64 20 66 74 73 35 57 72 69 74 65 44   void fts5WriteD
16620 6c 69 64 78 43 6c 65 61 72 28 0a 20 20 46 74 73  lidxClear(.  Fts
16630 35 49 6e 64 65 78 20 2a 70 2c 20 0a 20 20 46 74  5Index *p, .  Ft
16640 73 35 53 65 67 57 72 69 74 65 72 20 2a 70 57 72  s5SegWriter *pWr
16650 69 74 65 72 2c 0a 20 20 69 6e 74 20 62 46 6c 75  iter,.  int bFlu
16660 73 68 20 20 20 20 20 20 20 20 20 20 20 20 20 20  sh              
16670 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 72          /* If tr
16680 75 65 2c 20 77 72 69 74 65 20 64 6c 69 64 78 20  ue, write dlidx 
16690 74 6f 20 64 69 73 6b 20 2a 2f 0a 29 7b 0a 20 20  to disk */.){.  
166a0 69 6e 74 20 69 3b 0a 20 20 61 73 73 65 72 74 28  int i;.  assert(
166b0 20 62 46 6c 75 73 68 3d 3d 30 20 7c 7c 20 28 70   bFlush==0 || (p
166c0 57 72 69 74 65 72 2d 3e 6e 44 6c 69 64 78 3e 30  Writer->nDlidx>0
166d0 20 26 26 20 70 57 72 69 74 65 72 2d 3e 61 44 6c   && pWriter->aDl
166e0 69 64 78 5b 30 5d 2e 62 75 66 2e 6e 3e 30 29 20  idx[0].buf.n>0) 
166f0 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  );.  for(i=0; i<
16700 70 57 72 69 74 65 72 2d 3e 6e 44 6c 69 64 78 3b  pWriter->nDlidx;
16710 20 69 2b 2b 29 7b 0a 20 20 20 20 46 74 73 35 44   i++){.    Fts5D
16720 6c 69 64 78 57 72 69 74 65 72 20 2a 70 44 6c 69  lidxWriter *pDli
16730 64 78 20 3d 20 26 70 57 72 69 74 65 72 2d 3e 61  dx = &pWriter->a
16740 44 6c 69 64 78 5b 69 5d 3b 0a 20 20 20 20 69 66  Dlidx[i];.    if
16750 28 20 70 44 6c 69 64 78 2d 3e 62 75 66 2e 6e 3d  ( pDlidx->buf.n=
16760 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  =0 ) break;.    
16770 69 66 28 20 62 46 6c 75 73 68 20 29 7b 0a 20 20  if( bFlush ){.  
16780 20 20 20 20 61 73 73 65 72 74 28 20 70 44 6c 69      assert( pDli
16790 64 78 2d 3e 70 67 6e 6f 21 3d 30 20 29 3b 0a 20  dx->pgno!=0 );. 
167a0 20 20 20 20 20 66 74 73 35 44 61 74 61 57 72 69       fts5DataWri
167b0 74 65 28 70 2c 20 0a 20 20 20 20 20 20 20 20 20  te(p, .         
167c0 20 46 54 53 35 5f 44 4c 49 44 58 5f 52 4f 57 49   FTS5_DLIDX_ROWI
167d0 44 28 70 57 72 69 74 65 72 2d 3e 69 53 65 67 69  D(pWriter->iSegi
167e0 64 2c 20 69 2c 20 70 44 6c 69 64 78 2d 3e 70 67  d, i, pDlidx->pg
167f0 6e 6f 29 2c 0a 20 20 20 20 20 20 20 20 20 20 70  no),.          p
16800 44 6c 69 64 78 2d 3e 62 75 66 2e 70 2c 20 70 44  Dlidx->buf.p, pD
16810 6c 69 64 78 2d 3e 62 75 66 2e 6e 0a 20 20 20 20  lidx->buf.n.    
16820 20 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73    );.    }.    s
16830 71 6c 69 74 65 33 46 74 73 35 42 75 66 66 65 72  qlite3Fts5Buffer
16840 5a 65 72 6f 28 26 70 44 6c 69 64 78 2d 3e 62 75  Zero(&pDlidx->bu
16850 66 29 3b 0a 20 20 20 20 70 44 6c 69 64 78 2d 3e  f);.    pDlidx->
16860 62 50 72 65 76 56 61 6c 69 64 20 3d 20 30 3b 0a  bPrevValid = 0;.
16870 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 72 6f    }.}../*.** Gro
16880 77 20 74 68 65 20 70 57 72 69 74 65 72 2d 3e 61  w the pWriter->a
16890 44 6c 69 64 78 5b 5d 20 61 72 72 61 79 20 74 6f  Dlidx[] array to
168a0 20 61 74 20 6c 65 61 73 74 20 6e 4c 76 6c 20 65   at least nLvl e
168b0 6c 65 6d 65 6e 74 73 20 69 6e 20 73 69 7a 65 2e  lements in size.
168c0 0a 2a 2a 20 41 6e 79 20 6e 65 77 20 61 72 72 61  .** Any new arra
168d0 79 20 65 6c 65 6d 65 6e 74 73 20 61 72 65 20 7a  y elements are z
168e0 65 72 6f 65 64 20 62 65 66 6f 72 65 20 72 65 74  eroed before ret
168f0 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69  urning..*/.stati
16900 63 20 69 6e 74 20 66 74 73 35 57 72 69 74 65 44  c int fts5WriteD
16910 6c 69 64 78 47 72 6f 77 28 0a 20 20 46 74 73 35  lidxGrow(.  Fts5
16920 49 6e 64 65 78 20 2a 70 2c 0a 20 20 46 74 73 35  Index *p,.  Fts5
16930 53 65 67 57 72 69 74 65 72 20 2a 70 57 72 69 74  SegWriter *pWrit
16940 65 72 2c 0a 20 20 69 6e 74 20 6e 4c 76 6c 0a 29  er,.  int nLvl.)
16950 7b 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53  {.  if( p->rc==S
16960 51 4c 49 54 45 5f 4f 4b 20 26 26 20 6e 4c 76 6c  QLITE_OK && nLvl
16970 3e 3d 70 57 72 69 74 65 72 2d 3e 6e 44 6c 69 64  >=pWriter->nDlid
16980 78 20 29 7b 0a 20 20 20 20 46 74 73 35 44 6c 69  x ){.    Fts5Dli
16990 64 78 57 72 69 74 65 72 20 2a 61 44 6c 69 64 78  dxWriter *aDlidx
169a0 20 3d 20 28 46 74 73 35 44 6c 69 64 78 57 72 69   = (Fts5DlidxWri
169b0 74 65 72 2a 29 73 71 6c 69 74 65 33 5f 72 65 61  ter*)sqlite3_rea
169c0 6c 6c 6f 63 28 0a 20 20 20 20 20 20 20 20 70 57  lloc(.        pW
169d0 72 69 74 65 72 2d 3e 61 44 6c 69 64 78 2c 20 73  riter->aDlidx, s
169e0 69 7a 65 6f 66 28 46 74 73 35 44 6c 69 64 78 57  izeof(Fts5DlidxW
169f0 72 69 74 65 72 29 20 2a 20 6e 4c 76 6c 0a 20 20  riter) * nLvl.  
16a00 20 20 29 3b 0a 20 20 20 20 69 66 28 20 61 44 6c    );.    if( aDl
16a10 69 64 78 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  idx==0 ){.      
16a20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e  p->rc = SQLITE_N
16a30 4f 4d 45 4d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  OMEM;.    }else{
16a40 0a 20 20 20 20 20 20 69 6e 74 20 6e 42 79 74 65  .      int nByte
16a50 20 3d 20 73 69 7a 65 6f 66 28 46 74 73 35 44 6c   = sizeof(Fts5Dl
16a60 69 64 78 57 72 69 74 65 72 29 20 2a 20 28 6e 4c  idxWriter) * (nL
16a70 76 6c 20 2d 20 70 57 72 69 74 65 72 2d 3e 6e 44  vl - pWriter->nD
16a80 6c 69 64 78 29 3b 0a 20 20 20 20 20 20 6d 65 6d  lidx);.      mem
16a90 73 65 74 28 26 61 44 6c 69 64 78 5b 70 57 72 69  set(&aDlidx[pWri
16aa0 74 65 72 2d 3e 6e 44 6c 69 64 78 5d 2c 20 30 2c  ter->nDlidx], 0,
16ab0 20 6e 42 79 74 65 29 3b 0a 20 20 20 20 20 20 70   nByte);.      p
16ac0 57 72 69 74 65 72 2d 3e 61 44 6c 69 64 78 20 3d  Writer->aDlidx =
16ad0 20 61 44 6c 69 64 78 3b 0a 20 20 20 20 20 20 70   aDlidx;.      p
16ae0 57 72 69 74 65 72 2d 3e 6e 44 6c 69 64 78 20 3d  Writer->nDlidx =
16af0 20 6e 4c 76 6c 3b 0a 20 20 20 20 7d 0a 20 20 7d   nLvl;.    }.  }
16b00 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e 72 63 3b  .  return p->rc;
16b10 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65  .}../*.** If the
16b20 20 63 75 72 72 65 6e 74 20 64 6f 63 6c 69 73 74   current doclist
16b30 2d 69 6e 64 65 78 20 61 63 63 75 6d 75 6c 61 74  -index accumulat
16b40 69 6e 67 20 69 6e 20 70 57 72 69 74 65 72 2d 3e  ing in pWriter->
16b50 61 44 6c 69 64 78 5b 5d 20 69 73 20 6c 61 72 67  aDlidx[] is larg
16b60 65 0a 2a 2a 20 65 6e 6f 75 67 68 2c 20 66 6c 75  e.** enough, flu
16b70 73 68 20 69 74 20 74 6f 20 64 69 73 6b 20 61 6e  sh it to disk an
16b80 64 20 72 65 74 75 72 6e 20 31 2e 20 4f 74 68 65  d return 1. Othe
16b90 72 77 69 73 65 20 64 69 73 63 61 72 64 20 69 74  rwise discard it
16ba0 20 61 6e 64 20 72 65 74 75 72 6e 0a 2a 2a 20 7a   and return.** z
16bb0 65 72 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ero..*/.static i
16bc0 6e 74 20 66 74 73 35 57 72 69 74 65 46 6c 75 73  nt fts5WriteFlus
16bd0 68 44 6c 69 64 78 28 46 74 73 35 49 6e 64 65 78  hDlidx(Fts5Index
16be0 20 2a 70 2c 20 46 74 73 35 53 65 67 57 72 69 74   *p, Fts5SegWrit
16bf0 65 72 20 2a 70 57 72 69 74 65 72 29 7b 0a 20 20  er *pWriter){.  
16c00 69 6e 74 20 62 46 6c 61 67 20 3d 20 30 3b 0a 0a  int bFlag = 0;..
16c10 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 77 65    /* If there we
16c20 72 65 20 46 54 53 35 5f 4d 49 4e 5f 44 4c 49 44  re FTS5_MIN_DLID
16c30 58 5f 53 49 5a 45 20 6f 72 20 6d 6f 72 65 20 65  X_SIZE or more e
16c40 6d 70 74 79 20 6c 65 61 66 20 70 61 67 65 73 20  mpty leaf pages 
16c50 77 72 69 74 74 65 6e 0a 20 20 2a 2a 20 74 6f 20  written.  ** to 
16c60 74 68 65 20 64 61 74 61 62 61 73 65 2c 20 61 6c  the database, al
16c70 73 6f 20 77 72 69 74 65 20 74 68 65 20 64 6f 63  so write the doc
16c80 6c 69 73 74 2d 69 6e 64 65 78 20 74 6f 20 64 69  list-index to di
16c90 73 6b 2e 20 20 2a 2f 0a 20 20 69 66 28 20 70 57  sk.  */.  if( pW
16ca0 72 69 74 65 72 2d 3e 61 44 6c 69 64 78 5b 30 5d  riter->aDlidx[0]
16cb0 2e 62 75 66 2e 6e 3e 30 20 26 26 20 70 57 72 69  .buf.n>0 && pWri
16cc0 74 65 72 2d 3e 6e 45 6d 70 74 79 3e 3d 46 54 53  ter->nEmpty>=FTS
16cd0 35 5f 4d 49 4e 5f 44 4c 49 44 58 5f 53 49 5a 45  5_MIN_DLIDX_SIZE
16ce0 20 29 7b 0a 20 20 20 20 62 46 6c 61 67 20 3d 20   ){.    bFlag = 
16cf0 31 3b 0a 20 20 7d 0a 20 20 66 74 73 35 57 72 69  1;.  }.  fts5Wri
16d00 74 65 44 6c 69 64 78 43 6c 65 61 72 28 70 2c 20  teDlidxClear(p, 
16d10 70 57 72 69 74 65 72 2c 20 62 46 6c 61 67 29 3b  pWriter, bFlag);
16d20 0a 20 20 70 57 72 69 74 65 72 2d 3e 6e 45 6d 70  .  pWriter->nEmp
16d30 74 79 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e  ty = 0;.  return
16d40 20 62 46 6c 61 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   bFlag;.}../*.**
16d50 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
16d60 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 65 76 65  s called wheneve
16d70 72 20 70 72 6f 63 65 73 73 69 6e 67 20 6f 66 20  r processing of 
16d80 74 68 65 20 64 6f 63 6c 69 73 74 20 66 6f 72 20  the doclist for 
16d90 74 68 65 20 0a 2a 2a 20 6c 61 73 74 20 74 65 72  the .** last ter
16da0 6d 20 6f 6e 20 6c 65 61 66 20 70 61 67 65 20 28  m on leaf page (
16db0 70 57 72 69 74 65 72 2d 3e 69 42 74 50 61 67 65  pWriter->iBtPage
16dc0 29 20 69 73 20 63 6f 6d 70 6c 65 74 65 64 2e 20  ) is completed. 
16dd0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 6f 63 6c 69  .**.** The docli
16de0 73 74 2d 69 6e 64 65 78 20 66 6f 72 20 74 68 61  st-index for tha
16df0 74 20 74 65 72 6d 20 69 73 20 63 75 72 72 65 6e  t term is curren
16e00 74 6c 79 20 73 74 6f 72 65 64 20 69 6e 2d 6d 65  tly stored in-me
16e10 6d 6f 72 79 20 77 69 74 68 69 6e 20 74 68 65 0a  mory within the.
16e20 2a 2a 20 46 74 73 35 53 65 67 57 72 69 74 65 72  ** Fts5SegWriter
16e30 2e 61 44 6c 69 64 78 5b 5d 20 61 72 72 61 79 2e  .aDlidx[] array.
16e40 20 49 66 20 69 74 20 69 73 20 6c 61 72 67 65 20   If it is large 
16e50 65 6e 6f 75 67 68 2c 20 74 68 69 73 20 66 75 6e  enough, this fun
16e60 63 74 69 6f 6e 0a 2a 2a 20 77 72 69 74 65 73 20  ction.** writes 
16e70 69 74 20 6f 75 74 20 74 6f 20 64 69 73 6b 2e 20  it out to disk. 
16e80 4f 72 2c 20 69 66 20 69 74 20 69 73 20 74 6f 6f  Or, if it is too
16e90 20 73 6d 61 6c 6c 20 74 6f 20 62 6f 74 68 65 72   small to bother
16ea0 20 77 69 74 68 2c 20 64 69 73 63 61 72 64 73 0a   with, discards.
16eb0 2a 2a 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 46 74 73  ** it..**.** Fts
16ec0 35 53 65 67 57 72 69 74 65 72 2e 62 74 74 65 72  5SegWriter.btter
16ed0 6d 20 63 75 72 72 65 6e 74 6c 79 20 63 6f 6e 74  m currently cont
16ee0 61 69 6e 73 20 74 68 65 20 66 69 72 73 74 20 74  ains the first t
16ef0 65 72 6d 20 6f 6e 20 70 61 67 65 20 69 42 74 50  erm on page iBtP
16f00 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  age..*/.static v
16f10 6f 69 64 20 66 74 73 35 57 72 69 74 65 46 6c 75  oid fts5WriteFlu
16f20 73 68 42 74 72 65 65 28 46 74 73 35 49 6e 64 65  shBtree(Fts5Inde
16f30 78 20 2a 70 2c 20 46 74 73 35 53 65 67 57 72 69  x *p, Fts5SegWri
16f40 74 65 72 20 2a 70 57 72 69 74 65 72 29 7b 0a 20  ter *pWriter){. 
16f50 20 69 6e 74 20 62 46 6c 61 67 3b 0a 0a 20 20 61   int bFlag;..  a
16f60 73 73 65 72 74 28 20 70 57 72 69 74 65 72 2d 3e  ssert( pWriter->
16f70 69 42 74 50 61 67 65 20 7c 7c 20 70 57 72 69 74  iBtPage || pWrit
16f80 65 72 2d 3e 6e 45 6d 70 74 79 3d 3d 30 20 29 3b  er->nEmpty==0 );
16f90 0a 20 20 69 66 28 20 70 57 72 69 74 65 72 2d 3e  .  if( pWriter->
16fa0 69 42 74 50 61 67 65 3d 3d 30 20 29 20 72 65 74  iBtPage==0 ) ret
16fb0 75 72 6e 3b 0a 20 20 62 46 6c 61 67 20 3d 20 66  urn;.  bFlag = f
16fc0 74 73 35 57 72 69 74 65 46 6c 75 73 68 44 6c 69  ts5WriteFlushDli
16fd0 64 78 28 70 2c 20 70 57 72 69 74 65 72 29 3b 0a  dx(p, pWriter);.
16fe0 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51  .  if( p->rc==SQ
16ff0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 63  LITE_OK ){.    c
17000 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 28  onst char *z = (
17010 70 57 72 69 74 65 72 2d 3e 62 74 74 65 72 6d 2e  pWriter->btterm.
17020 6e 3e 30 3f 28 63 6f 6e 73 74 20 63 68 61 72 2a  n>0?(const char*
17030 29 70 57 72 69 74 65 72 2d 3e 62 74 74 65 72 6d  )pWriter->btterm
17040 2e 70 3a 22 22 29 3b 0a 20 20 20 20 2f 2a 20 54  .p:"");.    /* T
17050 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 77 61 73  he following was
17060 20 61 6c 72 65 61 64 79 20 64 6f 6e 65 20 69 6e   already done in
17070 20 66 74 73 35 57 72 69 74 65 49 6e 69 74 28 29   fts5WriteInit()
17080 3a 20 2a 2f 0a 20 20 20 20 2f 2a 20 73 71 6c 69  : */.    /* sqli
17090 74 65 33 5f 62 69 6e 64 5f 69 6e 74 28 70 2d 3e  te3_bind_int(p->
170a0 70 49 64 78 57 72 69 74 65 72 2c 20 31 2c 20 70  pIdxWriter, 1, p
170b0 57 72 69 74 65 72 2d 3e 69 53 65 67 69 64 29 3b  Writer->iSegid);
170c0 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   */.    sqlite3_
170d0 62 69 6e 64 5f 62 6c 6f 62 28 70 2d 3e 70 49 64  bind_blob(p->pId
170e0 78 57 72 69 74 65 72 2c 20 32 2c 20 7a 2c 20 70  xWriter, 2, z, p
170f0 57 72 69 74 65 72 2d 3e 62 74 74 65 72 6d 2e 6e  Writer->btterm.n
17100 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29  , SQLITE_STATIC)
17110 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69  ;.    sqlite3_bi
17120 6e 64 5f 69 6e 74 36 34 28 70 2d 3e 70 49 64 78  nd_int64(p->pIdx
17130 57 72 69 74 65 72 2c 20 33 2c 20 62 46 6c 61 67  Writer, 3, bFlag
17140 20 2b 20 28 28 69 36 34 29 70 57 72 69 74 65 72   + ((i64)pWriter
17150 2d 3e 69 42 74 50 61 67 65 3c 3c 31 29 29 3b 0a  ->iBtPage<<1));.
17160 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 65 70      sqlite3_step
17170 28 70 2d 3e 70 49 64 78 57 72 69 74 65 72 29 3b  (p->pIdxWriter);
17180 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 73 71 6c  .    p->rc = sql
17190 69 74 65 33 5f 72 65 73 65 74 28 70 2d 3e 70 49  ite3_reset(p->pI
171a0 64 78 57 72 69 74 65 72 29 3b 0a 20 20 7d 0a 20  dxWriter);.  }. 
171b0 20 70 57 72 69 74 65 72 2d 3e 69 42 74 50 61 67   pWriter->iBtPag
171c0 65 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  e = 0;.}../*.** 
171d0 54 68 69 73 20 69 73 20 63 61 6c 6c 65 64 20 6f  This is called o
171e0 6e 63 65 20 66 6f 72 20 65 61 63 68 20 6c 65 61  nce for each lea
171f0 66 20 70 61 67 65 20 65 78 63 65 70 74 20 74 68  f page except th
17200 65 20 66 69 72 73 74 20 74 68 61 74 20 63 6f 6e  e first that con
17210 74 61 69 6e 73 0a 2a 2a 20 61 74 20 6c 65 61 73  tains.** at leas
17220 74 20 6f 6e 65 20 74 65 72 6d 2e 20 41 72 67 75  t one term. Argu
17230 6d 65 6e 74 20 28 6e 54 65 72 6d 2f 70 54 65 72  ment (nTerm/pTer
17240 6d 29 20 69 73 20 74 68 65 20 73 70 6c 69 74 2d  m) is the split-
17250 6b 65 79 20 2d 20 61 20 74 65 72 6d 20 74 68 61  key - a term tha
17260 74 0a 2a 2a 20 69 73 20 6c 61 72 67 65 72 20 74  t.** is larger t
17270 68 61 6e 20 61 6c 6c 20 74 65 72 6d 73 20 77 72  han all terms wr
17280 69 74 74 65 6e 20 74 6f 20 65 61 72 6c 69 65 72  itten to earlier
17290 20 6c 65 61 76 65 73 2c 20 61 6e 64 20 65 71 75   leaves, and equ
172a0 61 6c 20 74 6f 20 6f 72 0a 2a 2a 20 73 6d 61 6c  al to or.** smal
172b0 6c 65 72 20 74 68 61 6e 20 74 68 65 20 66 69 72  ler than the fir
172c0 73 74 20 74 65 72 6d 20 6f 6e 20 74 68 65 20 6e  st term on the n
172d0 65 77 20 6c 65 61 66 2e 0a 2a 2a 0a 2a 2a 20 49  ew leaf..**.** I
172e0 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
172f0 73 2c 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  s, an error code
17300 20 69 73 20 6c 65 66 74 20 69 6e 20 46 74 73 35   is left in Fts5
17310 49 6e 64 65 78 2e 72 63 2e 20 49 66 20 61 6e 20  Index.rc. If an 
17320 65 72 72 6f 72 0a 2a 2a 20 68 61 73 20 61 6c 72  error.** has alr
17330 65 61 64 79 20 6f 63 63 75 72 72 65 64 20 77 68  eady occurred wh
17340 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
17350 20 69 73 20 63 61 6c 6c 65 64 2c 20 69 74 20 69   is called, it i
17360 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74  s a no-op..*/.st
17370 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 57 72  atic void fts5Wr
17380 69 74 65 42 74 72 65 65 54 65 72 6d 28 0a 20 20  iteBtreeTerm(.  
17390 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 20 20  Fts5Index *p,   
173a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
173b0 2f 2a 20 46 54 53 35 20 62 61 63 6b 65 6e 64 20  /* FTS5 backend 
173c0 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 46 74 73 35  object */.  Fts5
173d0 53 65 67 57 72 69 74 65 72 20 2a 70 57 72 69 74  SegWriter *pWrit
173e0 65 72 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 57  er,         /* W
173f0 72 69 74 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a  riter object */.
17400 20 20 69 6e 74 20 6e 54 65 72 6d 2c 20 63 6f 6e    int nTerm, con
17410 73 74 20 75 38 20 2a 70 54 65 72 6d 20 20 20 20  st u8 *pTerm    
17420 20 20 2f 2a 20 46 69 72 73 74 20 74 65 72 6d 20    /* First term 
17430 6f 6e 20 6e 65 77 20 70 61 67 65 20 2a 2f 0a 29  on new page */.)
17440 7b 0a 20 20 66 74 73 35 57 72 69 74 65 46 6c 75  {.  fts5WriteFlu
17450 73 68 42 74 72 65 65 28 70 2c 20 70 57 72 69 74  shBtree(p, pWrit
17460 65 72 29 3b 0a 20 20 66 74 73 35 42 75 66 66 65  er);.  fts5Buffe
17470 72 53 65 74 28 26 70 2d 3e 72 63 2c 20 26 70 57  rSet(&p->rc, &pW
17480 72 69 74 65 72 2d 3e 62 74 74 65 72 6d 2c 20 6e  riter->btterm, n
17490 54 65 72 6d 2c 20 70 54 65 72 6d 29 3b 0a 20 20  Term, pTerm);.  
174a0 70 57 72 69 74 65 72 2d 3e 69 42 74 50 61 67 65  pWriter->iBtPage
174b0 20 3d 20 70 57 72 69 74 65 72 2d 3e 77 72 69 74   = pWriter->writ
174c0 65 72 2e 70 67 6e 6f 3b 0a 7d 0a 0a 2f 2a 0a 2a  er.pgno;.}../*.*
174d0 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
174e0 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 66  is called when f
174f0 6c 75 73 68 69 6e 67 20 61 20 6c 65 61 66 20 70  lushing a leaf p
17500 61 67 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e  age that contain
17510 73 20 6e 6f 0a 2a 2a 20 74 65 72 6d 73 20 61 74  s no.** terms at
17520 20 61 6c 6c 20 74 6f 20 64 69 73 6b 2e 0a 2a 2f   all to disk..*/
17530 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
17540 35 57 72 69 74 65 42 74 72 65 65 4e 6f 54 65 72  5WriteBtreeNoTer
17550 6d 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a  m(.  Fts5Index *
17560 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
17570 20 20 20 20 20 2f 2a 20 46 54 53 35 20 62 61 63       /* FTS5 bac
17580 6b 65 6e 64 20 6f 62 6a 65 63 74 20 2a 2f 0a 20  kend object */. 
17590 20 46 74 73 35 53 65 67 57 72 69 74 65 72 20 2a   Fts5SegWriter *
175a0 70 57 72 69 74 65 72 20 20 20 20 20 20 20 20 20  pWriter         
175b0 20 2f 2a 20 57 72 69 74 65 72 20 6f 62 6a 65 63   /* Writer objec
175c0 74 20 2a 2f 0a 29 7b 0a 20 20 2f 2a 20 49 66 20  t */.){.  /* If 
175d0 74 68 65 72 65 20 77 65 72 65 20 6e 6f 20 72 6f  there were no ro
175e0 77 69 64 73 20 6f 6e 20 74 68 65 20 6c 65 61 66  wids on the leaf
175f0 20 70 61 67 65 20 65 69 74 68 65 72 20 61 6e 64   page either and
17600 20 74 68 65 20 64 6f 63 6c 69 73 74 2d 69 6e 64   the doclist-ind
17610 65 78 0a 20 20 2a 2a 20 68 61 73 20 61 6c 72 65  ex.  ** has alre
17620 61 64 79 20 62 65 65 6e 20 73 74 61 72 74 65 64  ady been started
17630 2c 20 61 70 70 65 6e 64 20 61 6e 20 30 78 30 30  , append an 0x00
17640 20 62 79 74 65 20 74 6f 20 69 74 2e 20 20 2a 2f   byte to it.  */
17650 0a 20 20 69 66 28 20 70 57 72 69 74 65 72 2d 3e  .  if( pWriter->
17660 62 46 69 72 73 74 52 6f 77 69 64 49 6e 50 61 67  bFirstRowidInPag
17670 65 20 26 26 20 70 57 72 69 74 65 72 2d 3e 61 44  e && pWriter->aD
17680 6c 69 64 78 5b 30 5d 2e 62 75 66 2e 6e 3e 30 20  lidx[0].buf.n>0 
17690 29 7b 0a 20 20 20 20 46 74 73 35 44 6c 69 64 78  ){.    Fts5Dlidx
176a0 57 72 69 74 65 72 20 2a 70 44 6c 69 64 78 20 3d  Writer *pDlidx =
176b0 20 26 70 57 72 69 74 65 72 2d 3e 61 44 6c 69 64   &pWriter->aDlid
176c0 78 5b 30 5d 3b 0a 20 20 20 20 61 73 73 65 72 74  x[0];.    assert
176d0 28 20 70 44 6c 69 64 78 2d 3e 62 50 72 65 76 56  ( pDlidx->bPrevV
176e0 61 6c 69 64 20 29 3b 0a 20 20 20 20 73 71 6c 69  alid );.    sqli
176f0 74 65 33 46 74 73 35 42 75 66 66 65 72 41 70 70  te3Fts5BufferApp
17700 65 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e 72 63  endVarint(&p->rc
17710 2c 20 26 70 44 6c 69 64 78 2d 3e 62 75 66 2c 20  , &pDlidx->buf, 
17720 30 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 6e  0);.  }..  /* In
17730 63 72 65 6d 65 6e 74 20 74 68 65 20 22 6e 75 6d  crement the "num
17740 62 65 72 20 6f 66 20 73 65 71 75 65 6e 74 69 61  ber of sequentia
17750 6c 20 6c 65 61 76 65 73 20 77 69 74 68 6f 75 74  l leaves without
17760 20 61 20 74 65 72 6d 22 20 63 6f 75 6e 74 65 72   a term" counter
17770 2e 20 2a 2f 0a 20 20 70 57 72 69 74 65 72 2d 3e  . */.  pWriter->
17780 6e 45 6d 70 74 79 2b 2b 3b 0a 7d 0a 0a 73 74 61  nEmpty++;.}..sta
17790 74 69 63 20 69 36 34 20 66 74 73 35 44 6c 69 64  tic i64 fts5Dlid
177a0 78 45 78 74 72 61 63 74 46 69 72 73 74 52 6f 77  xExtractFirstRow
177b0 69 64 28 46 74 73 35 42 75 66 66 65 72 20 2a 70  id(Fts5Buffer *p
177c0 42 75 66 29 7b 0a 20 20 69 36 34 20 69 52 6f 77  Buf){.  i64 iRow
177d0 69 64 3b 0a 20 20 69 6e 74 20 69 4f 66 66 3b 0a  id;.  int iOff;.
177e0 0a 20 20 69 4f 66 66 20 3d 20 31 20 2b 20 66 74  .  iOff = 1 + ft
177f0 73 35 47 65 74 56 61 72 69 6e 74 28 26 70 42 75  s5GetVarint(&pBu
17800 66 2d 3e 70 5b 31 5d 2c 20 28 75 36 34 2a 29 26  f->p[1], (u64*)&
17810 69 52 6f 77 69 64 29 3b 0a 20 20 66 74 73 35 47  iRowid);.  fts5G
17820 65 74 56 61 72 69 6e 74 28 26 70 42 75 66 2d 3e  etVarint(&pBuf->
17830 70 5b 69 4f 66 66 5d 2c 20 28 75 36 34 2a 29 26  p[iOff], (u64*)&
17840 69 52 6f 77 69 64 29 3b 0a 20 20 72 65 74 75 72  iRowid);.  retur
17850 6e 20 69 52 6f 77 69 64 3b 0a 7d 0a 0a 2f 2a 0a  n iRowid;.}../*.
17860 2a 2a 20 52 6f 77 69 64 20 69 52 6f 77 69 64 20  ** Rowid iRowid 
17870 68 61 73 20 6a 75 73 74 20 62 65 65 6e 20 61 70  has just been ap
17880 70 65 6e 64 65 64 20 74 6f 20 74 68 65 20 63 75  pended to the cu
17890 72 72 65 6e 74 20 6c 65 61 66 20 70 61 67 65 2e  rrent leaf page.
178a0 20 49 74 20 69 73 20 74 68 65 0a 2a 2a 20 66 69   It is the.** fi
178b0 72 73 74 20 6f 6e 20 74 68 65 20 70 61 67 65 2e  rst on the page.
178c0 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61   This function a
178d0 70 70 65 6e 64 73 20 61 6e 20 61 70 70 72 6f 70  ppends an approp
178e0 72 69 61 74 65 20 65 6e 74 72 79 20 74 6f 20 74  riate entry to t
178f0 68 65 20 63 75 72 72 65 6e 74 0a 2a 2a 20 64 6f  he current.** do
17900 63 6c 69 73 74 2d 69 6e 64 65 78 2e 0a 2a 2f 0a  clist-index..*/.
17910 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
17920 57 72 69 74 65 44 6c 69 64 78 41 70 70 65 6e 64  WriteDlidxAppend
17930 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70  (.  Fts5Index *p
17940 2c 20 0a 20 20 46 74 73 35 53 65 67 57 72 69 74  , .  Fts5SegWrit
17950 65 72 20 2a 70 57 72 69 74 65 72 2c 20 0a 20 20  er *pWriter, .  
17960 69 36 34 20 69 52 6f 77 69 64 0a 29 7b 0a 20 20  i64 iRowid.){.  
17970 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 62 44 6f  int i;.  int bDo
17980 6e 65 20 3d 20 30 3b 0a 0a 20 20 66 6f 72 28 69  ne = 0;..  for(i
17990 3d 30 3b 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  =0; p->rc==SQLIT
179a0 45 5f 4f 4b 20 26 26 20 62 44 6f 6e 65 3d 3d 30  E_OK && bDone==0
179b0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 36 34 20  ; i++){.    i64 
179c0 69 56 61 6c 3b 0a 20 20 20 20 46 74 73 35 44 6c  iVal;.    Fts5Dl
179d0 69 64 78 57 72 69 74 65 72 20 2a 70 44 6c 69 64  idxWriter *pDlid
179e0 78 20 3d 20 26 70 57 72 69 74 65 72 2d 3e 61 44  x = &pWriter->aD
179f0 6c 69 64 78 5b 69 5d 3b 0a 0a 20 20 20 20 69 66  lidx[i];..    if
17a00 28 20 70 44 6c 69 64 78 2d 3e 62 75 66 2e 6e 3e  ( pDlidx->buf.n>
17a10 3d 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e 70 67 73  =p->pConfig->pgs
17a20 7a 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68  z ){.      /* Th
17a30 65 20 63 75 72 72 65 6e 74 20 64 6f 63 6c 69 73  e current doclis
17a40 74 2d 69 6e 64 65 78 20 70 61 67 65 20 69 73 20  t-index page is 
17a50 66 75 6c 6c 2e 20 57 72 69 74 65 20 69 74 20 74  full. Write it t
17a60 6f 20 64 69 73 6b 20 61 6e 64 20 70 75 73 68 0a  o disk and push.
17a70 20 20 20 20 20 20 2a 2a 20 61 20 63 6f 70 79 20        ** a copy 
17a80 6f 66 20 69 52 6f 77 69 64 20 28 77 68 69 63 68  of iRowid (which
17a90 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20 74 68 65   will become the
17aa0 20 66 69 72 73 74 20 72 6f 77 69 64 20 6f 6e 20   first rowid on 
17ab0 74 68 65 20 6e 65 78 74 0a 20 20 20 20 20 20 2a  the next.      *
17ac0 2a 20 64 6f 63 6c 69 73 74 2d 69 6e 64 65 78 20  * doclist-index 
17ad0 6c 65 61 66 20 70 61 67 65 29 20 75 70 20 69 6e  leaf page) up in
17ae0 74 6f 20 74 68 65 20 6e 65 78 74 20 6c 65 76 65  to the next leve
17af0 6c 20 6f 66 20 74 68 65 20 62 2d 74 72 65 65 20  l of the b-tree 
17b00 0a 20 20 20 20 20 20 2a 2a 20 68 69 65 72 61 72  .      ** hierar
17b10 63 68 79 2e 20 49 66 20 74 68 65 20 6e 6f 64 65  chy. If the node
17b20 20 62 65 69 6e 67 20 66 6c 75 73 68 65 64 20 69   being flushed i
17b30 73 20 63 75 72 72 65 6e 74 6c 79 20 74 68 65 20  s currently the 
17b40 72 6f 6f 74 20 6e 6f 64 65 2c 0a 20 20 20 20 20  root node,.     
17b50 20 2a 2a 20 61 6c 73 6f 20 70 75 73 68 20 69 74   ** also push it
17b60 73 20 66 69 72 73 74 20 72 6f 77 69 64 20 75 70  s first rowid up
17b70 77 61 72 64 73 2e 20 2a 2f 0a 20 20 20 20 20 20  wards. */.      
17b80 70 44 6c 69 64 78 2d 3e 62 75 66 2e 70 5b 30 5d  pDlidx->buf.p[0]
17b90 20 3d 20 30 78 30 31 3b 20 20 20 20 2f 2a 20 4e   = 0x01;    /* N
17ba0 6f 74 20 74 68 65 20 72 6f 6f 74 20 6e 6f 64 65  ot the root node
17bb0 20 2a 2f 0a 20 20 20 20 20 20 66 74 73 35 44 61   */.      fts5Da
17bc0 74 61 57 72 69 74 65 28 70 2c 20 0a 20 20 20 20  taWrite(p, .    
17bd0 20 20 20 20 20 20 46 54 53 35 5f 44 4c 49 44 58        FTS5_DLIDX
17be0 5f 52 4f 57 49 44 28 70 57 72 69 74 65 72 2d 3e  _ROWID(pWriter->
17bf0 69 53 65 67 69 64 2c 20 69 2c 20 70 44 6c 69 64  iSegid, i, pDlid
17c00 78 2d 3e 70 67 6e 6f 29 2c 0a 20 20 20 20 20 20  x->pgno),.      
17c10 20 20 20 20 70 44 6c 69 64 78 2d 3e 62 75 66 2e      pDlidx->buf.
17c20 70 2c 20 70 44 6c 69 64 78 2d 3e 62 75 66 2e 6e  p, pDlidx->buf.n
17c30 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20  .      );.      
17c40 66 74 73 35 57 72 69 74 65 44 6c 69 64 78 47 72  fts5WriteDlidxGr
17c50 6f 77 28 70 2c 20 70 57 72 69 74 65 72 2c 20 69  ow(p, pWriter, i
17c60 2b 32 29 3b 0a 20 20 20 20 20 20 70 44 6c 69 64  +2);.      pDlid
17c70 78 20 3d 20 26 70 57 72 69 74 65 72 2d 3e 61 44  x = &pWriter->aD
17c80 6c 69 64 78 5b 69 5d 3b 0a 20 20 20 20 20 20 69  lidx[i];.      i
17c90 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  f( p->rc==SQLITE
17ca0 5f 4f 4b 20 26 26 20 70 44 6c 69 64 78 5b 31 5d  _OK && pDlidx[1]
17cb0 2e 62 75 66 2e 6e 3d 3d 30 20 29 7b 0a 20 20 20  .buf.n==0 ){.   
17cc0 20 20 20 20 20 69 36 34 20 69 46 69 72 73 74 20       i64 iFirst 
17cd0 3d 20 66 74 73 35 44 6c 69 64 78 45 78 74 72 61  = fts5DlidxExtra
17ce0 63 74 46 69 72 73 74 52 6f 77 69 64 28 26 70 44  ctFirstRowid(&pD
17cf0 6c 69 64 78 2d 3e 62 75 66 29 3b 0a 0a 20 20 20  lidx->buf);..   
17d00 20 20 20 20 20 2f 2a 20 54 68 69 73 20 77 61 73       /* This was
17d10 20 74 68 65 20 72 6f 6f 74 20 6e 6f 64 65 2e 20   the root node. 
17d20 50 75 73 68 20 69 74 73 20 66 69 72 73 74 20 72  Push its first r
17d30 6f 77 69 64 20 75 70 20 74 6f 20 74 68 65 20 6e  owid up to the n
17d40 65 77 20 72 6f 6f 74 2e 20 2a 2f 0a 20 20 20 20  ew root. */.    
17d50 20 20 20 20 70 44 6c 69 64 78 5b 31 5d 2e 70 67      pDlidx[1].pg
17d60 6e 6f 20 3d 20 70 44 6c 69 64 78 2d 3e 70 67 6e  no = pDlidx->pgn
17d70 6f 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  o;.        sqlit
17d80 65 33 46 74 73 35 42 75 66 66 65 72 41 70 70 65  e3Fts5BufferAppe
17d90 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c  ndVarint(&p->rc,
17da0 20 26 70 44 6c 69 64 78 5b 31 5d 2e 62 75 66 2c   &pDlidx[1].buf,
17db0 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c   0);.        sql
17dc0 69 74 65 33 46 74 73 35 42 75 66 66 65 72 41 70  ite3Fts5BufferAp
17dd0 70 65 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e 72  pendVarint(&p->r
17de0 63 2c 20 26 70 44 6c 69 64 78 5b 31 5d 2e 62 75  c, &pDlidx[1].bu
17df0 66 2c 20 70 44 6c 69 64 78 2d 3e 70 67 6e 6f 29  f, pDlidx->pgno)
17e00 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
17e10 33 46 74 73 35 42 75 66 66 65 72 41 70 70 65 6e  3Fts5BufferAppen
17e20 64 56 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20  dVarint(&p->rc, 
17e30 26 70 44 6c 69 64 78 5b 31 5d 2e 62 75 66 2c 20  &pDlidx[1].buf, 
17e40 69 46 69 72 73 74 29 3b 0a 20 20 20 20 20 20 20  iFirst);.       
17e50 20 70 44 6c 69 64 78 5b 31 5d 2e 62 50 72 65 76   pDlidx[1].bPrev
17e60 56 61 6c 69 64 20 3d 20 31 3b 0a 20 20 20 20 20  Valid = 1;.     
17e70 20 20 20 70 44 6c 69 64 78 5b 31 5d 2e 69 50 72     pDlidx[1].iPr
17e80 65 76 20 3d 20 69 46 69 72 73 74 3b 0a 20 20 20  ev = iFirst;.   
17e90 20 20 20 7d 0a 0a 20 20 20 20 20 20 73 71 6c 69     }..      sqli
17ea0 74 65 33 46 74 73 35 42 75 66 66 65 72 5a 65 72  te3Fts5BufferZer
17eb0 6f 28 26 70 44 6c 69 64 78 2d 3e 62 75 66 29 3b  o(&pDlidx->buf);
17ec0 0a 20 20 20 20 20 20 70 44 6c 69 64 78 2d 3e 62  .      pDlidx->b
17ed0 50 72 65 76 56 61 6c 69 64 20 3d 20 30 3b 0a 20  PrevValid = 0;. 
17ee0 20 20 20 20 20 70 44 6c 69 64 78 2d 3e 70 67 6e       pDlidx->pgn
17ef0 6f 2b 2b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  o++;.    }else{.
17f00 20 20 20 20 20 20 62 44 6f 6e 65 20 3d 20 31 3b        bDone = 1;
17f10 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20  .    }..    if( 
17f20 70 44 6c 69 64 78 2d 3e 62 50 72 65 76 56 61 6c  pDlidx->bPrevVal
17f30 69 64 20 29 7b 0a 20 20 20 20 20 20 69 56 61 6c  id ){.      iVal
17f40 20 3d 20 69 52 6f 77 69 64 20 2d 20 70 44 6c 69   = iRowid - pDli
17f50 64 78 2d 3e 69 50 72 65 76 3b 0a 20 20 20 20 7d  dx->iPrev;.    }
17f60 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 36 34 20  else{.      i64 
17f70 69 50 67 6e 6f 20 3d 20 28 69 3d 3d 30 20 3f 20  iPgno = (i==0 ? 
17f80 70 57 72 69 74 65 72 2d 3e 77 72 69 74 65 72 2e  pWriter->writer.
17f90 70 67 6e 6f 20 3a 20 70 44 6c 69 64 78 5b 2d 31  pgno : pDlidx[-1
17fa0 5d 2e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 61  ].pgno);.      a
17fb0 73 73 65 72 74 28 20 70 44 6c 69 64 78 2d 3e 62  ssert( pDlidx->b
17fc0 75 66 2e 6e 3d 3d 30 20 29 3b 0a 20 20 20 20 20  uf.n==0 );.     
17fd0 20 73 71 6c 69 74 65 33 46 74 73 35 42 75 66 66   sqlite3Fts5Buff
17fe0 65 72 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26  erAppendVarint(&
17ff0 70 2d 3e 72 63 2c 20 26 70 44 6c 69 64 78 2d 3e  p->rc, &pDlidx->
18000 62 75 66 2c 20 21 62 44 6f 6e 65 29 3b 0a 20 20  buf, !bDone);.  
18010 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 42      sqlite3Fts5B
18020 75 66 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e  ufferAppendVarin
18030 74 28 26 70 2d 3e 72 63 2c 20 26 70 44 6c 69 64  t(&p->rc, &pDlid
18040 78 2d 3e 62 75 66 2c 20 69 50 67 6e 6f 29 3b 0a  x->buf, iPgno);.
18050 20 20 20 20 20 20 69 56 61 6c 20 3d 20 69 52 6f        iVal = iRo
18060 77 69 64 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  wid;.    }..    
18070 73 71 6c 69 74 65 33 46 74 73 35 42 75 66 66 65  sqlite3Fts5Buffe
18080 72 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26 70  rAppendVarint(&p
18090 2d 3e 72 63 2c 20 26 70 44 6c 69 64 78 2d 3e 62  ->rc, &pDlidx->b
180a0 75 66 2c 20 69 56 61 6c 29 3b 0a 20 20 20 20 70  uf, iVal);.    p
180b0 44 6c 69 64 78 2d 3e 62 50 72 65 76 56 61 6c 69  Dlidx->bPrevVali
180c0 64 20 3d 20 31 3b 0a 20 20 20 20 70 44 6c 69 64  d = 1;.    pDlid
180d0 78 2d 3e 69 50 72 65 76 20 3d 20 69 52 6f 77 69  x->iPrev = iRowi
180e0 64 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63  d;.  }.}..static
180f0 20 76 6f 69 64 20 66 74 73 35 57 72 69 74 65 46   void fts5WriteF
18100 6c 75 73 68 4c 65 61 66 28 46 74 73 35 49 6e 64  lushLeaf(Fts5Ind
18110 65 78 20 2a 70 2c 20 46 74 73 35 53 65 67 57 72  ex *p, Fts5SegWr
18120 69 74 65 72 20 2a 70 57 72 69 74 65 72 29 7b 0a  iter *pWriter){.
18130 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75    static const u
18140 38 20 7a 65 72 6f 5b 5d 20 3d 20 7b 20 30 78 30  8 zero[] = { 0x0
18150 30 2c 20 30 78 30 30 2c 20 30 78 30 30 2c 20 30  0, 0x00, 0x00, 0
18160 78 30 30 20 7d 3b 0a 20 20 46 74 73 35 50 61 67  x00 };.  Fts5Pag
18170 65 57 72 69 74 65 72 20 2a 70 50 61 67 65 20 3d  eWriter *pPage =
18180 20 26 70 57 72 69 74 65 72 2d 3e 77 72 69 74 65   &pWriter->write
18190 72 3b 0a 20 20 69 36 34 20 69 52 6f 77 69 64 3b  r;.  i64 iRowid;
181a0 0a 0a 20 20 61 73 73 65 72 74 28 20 28 70 50 61  ..  assert( (pPa
181b0 67 65 2d 3e 70 67 69 64 78 2e 6e 3d 3d 30 29 3d  ge->pgidx.n==0)=
181c0 3d 28 70 57 72 69 74 65 72 2d 3e 62 46 69 72 73  =(pWriter->bFirs
181d0 74 54 65 72 6d 49 6e 50 61 67 65 29 20 29 3b 0a  tTermInPage) );.
181e0 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20 73 7a  .  /* Set the sz
181f0 4c 65 61 66 20 68 65 61 64 65 72 20 66 69 65 6c  Leaf header fiel
18200 64 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  d. */.  assert( 
18210 30 3d 3d 66 74 73 35 47 65 74 55 31 36 28 26 70  0==fts5GetU16(&p
18220 50 61 67 65 2d 3e 62 75 66 2e 70 5b 32 5d 29 20  Page->buf.p[2]) 
18230 29 3b 0a 20 20 66 74 73 35 50 75 74 55 31 36 28  );.  fts5PutU16(
18240 26 70 50 61 67 65 2d 3e 62 75 66 2e 70 5b 32 5d  &pPage->buf.p[2]
18250 2c 20 70 50 61 67 65 2d 3e 62 75 66 2e 6e 29 3b  , pPage->buf.n);
18260 0a 0a 20 20 69 66 28 20 70 57 72 69 74 65 72 2d  ..  if( pWriter-
18270 3e 62 46 69 72 73 74 54 65 72 6d 49 6e 50 61 67  >bFirstTermInPag
18280 65 20 29 7b 0a 20 20 20 20 2f 2a 20 4e 6f 20 74  e ){.    /* No t
18290 65 72 6d 20 77 61 73 20 77 72 69 74 74 65 6e 20  erm was written 
182a0 74 6f 20 74 68 69 73 20 70 61 67 65 2e 20 2a 2f  to this page. */
182b0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
182c0 67 65 2d 3e 70 67 69 64 78 2e 6e 3d 3d 30 20 29  ge->pgidx.n==0 )
182d0 3b 0a 20 20 20 20 66 74 73 35 57 72 69 74 65 42  ;.    fts5WriteB
182e0 74 72 65 65 4e 6f 54 65 72 6d 28 70 2c 20 70 57  treeNoTerm(p, pW
182f0 72 69 74 65 72 29 3b 0a 20 20 7d 65 6c 73 65 7b  riter);.  }else{
18300 0a 20 20 20 20 2f 2a 20 41 70 70 65 6e 64 20 74  .    /* Append t
18310 68 65 20 70 67 69 64 78 20 74 6f 20 74 68 65 20  he pgidx to the 
18320 70 61 67 65 20 62 75 66 66 65 72 2e 20 53 65 74  page buffer. Set
18330 20 74 68 65 20 73 7a 4c 65 61 66 20 68 65 61 64   the szLeaf head
18340 65 72 20 66 69 65 6c 64 2e 20 2a 2f 0a 20 20 20  er field. */.   
18350 20 66 74 73 35 42 75 66 66 65 72 41 70 70 65 6e   fts5BufferAppen
18360 64 42 6c 6f 62 28 26 70 2d 3e 72 63 2c 20 26 70  dBlob(&p->rc, &p
18370 50 61 67 65 2d 3e 62 75 66 2c 20 70 50 61 67 65  Page->buf, pPage
18380 2d 3e 70 67 69 64 78 2e 6e 2c 20 70 50 61 67 65  ->pgidx.n, pPage
18390 2d 3e 70 67 69 64 78 2e 70 29 3b 0a 20 20 7d 0a  ->pgidx.p);.  }.
183a0 0a 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20  .  /* Write the 
183b0 70 61 67 65 20 6f 75 74 20 74 6f 20 64 69 73 6b  page out to disk
183c0 20 2a 2f 0a 20 20 69 52 6f 77 69 64 20 3d 20 46   */.  iRowid = F
183d0 54 53 35 5f 53 45 47 4d 45 4e 54 5f 52 4f 57 49  TS5_SEGMENT_ROWI
183e0 44 28 70 57 72 69 74 65 72 2d 3e 69 53 65 67 69  D(pWriter->iSegi
183f0 64 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 29 3b  d, pPage->pgno);
18400 0a 20 20 66 74 73 35 44 61 74 61 57 72 69 74 65  .  fts5DataWrite
18410 28 70 2c 20 69 52 6f 77 69 64 2c 20 70 50 61 67  (p, iRowid, pPag
18420 65 2d 3e 62 75 66 2e 70 2c 20 70 50 61 67 65 2d  e->buf.p, pPage-
18430 3e 62 75 66 2e 6e 29 3b 0a 0a 20 20 2f 2a 20 49  >buf.n);..  /* I
18440 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 6e 65  nitialize the ne
18450 78 74 20 70 61 67 65 2e 20 2a 2f 0a 20 20 66 74  xt page. */.  ft
18460 73 35 42 75 66 66 65 72 5a 65 72 6f 28 26 70 50  s5BufferZero(&pP
18470 61 67 65 2d 3e 62 75 66 29 3b 0a 20 20 66 74 73  age->buf);.  fts
18480 35 42 75 66 66 65 72 5a 65 72 6f 28 26 70 50 61  5BufferZero(&pPa
18490 67 65 2d 3e 70 67 69 64 78 29 3b 0a 20 20 66 74  ge->pgidx);.  ft
184a0 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 42 6c  s5BufferAppendBl
184b0 6f 62 28 26 70 2d 3e 72 63 2c 20 26 70 50 61 67  ob(&p->rc, &pPag
184c0 65 2d 3e 62 75 66 2c 20 34 2c 20 7a 65 72 6f 29  e->buf, 4, zero)
184d0 3b 0a 20 20 70 50 61 67 65 2d 3e 69 50 72 65 76  ;.  pPage->iPrev
184e0 50 67 69 64 78 20 3d 20 30 3b 0a 20 20 70 50 61  Pgidx = 0;.  pPa
184f0 67 65 2d 3e 70 67 6e 6f 2b 2b 3b 0a 0a 20 20 2f  ge->pgno++;..  /
18500 2a 20 49 6e 63 72 65 61 73 65 20 74 68 65 20 6c  * Increase the l
18510 65 61 76 65 73 20 77 72 69 74 74 65 6e 20 63 6f  eaves written co
18520 75 6e 74 65 72 20 2a 2f 0a 20 20 70 57 72 69 74  unter */.  pWrit
18530 65 72 2d 3e 6e 4c 65 61 66 57 72 69 74 74 65 6e  er->nLeafWritten
18540 2b 2b 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 6e 65  ++;..  /* The ne
18550 77 20 6c 65 61 66 20 68 6f 6c 64 73 20 6e 6f 20  w leaf holds no 
18560 74 65 72 6d 73 20 6f 72 20 72 6f 77 69 64 73 20  terms or rowids 
18570 2a 2f 0a 20 20 70 57 72 69 74 65 72 2d 3e 62 46  */.  pWriter->bF
18580 69 72 73 74 54 65 72 6d 49 6e 50 61 67 65 20 3d  irstTermInPage =
18590 20 31 3b 0a 20 20 70 57 72 69 74 65 72 2d 3e 62   1;.  pWriter->b
185a0 46 69 72 73 74 52 6f 77 69 64 49 6e 50 61 67 65  FirstRowidInPage
185b0 20 3d 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41   = 1;.}../*.** A
185c0 70 70 65 6e 64 20 74 65 72 6d 20 70 54 65 72 6d  ppend term pTerm
185d0 2f 6e 54 65 72 6d 20 74 6f 20 74 68 65 20 73 65  /nTerm to the se
185e0 67 6d 65 6e 74 20 62 65 69 6e 67 20 77 72 69 74  gment being writ
185f0 74 65 6e 20 62 79 20 74 68 65 20 77 72 69 74 65  ten by the write
18600 72 20 70 61 73 73 65 64 0a 2a 2a 20 61 73 20 74  r passed.** as t
18610 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
18620 6e 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  nt..**.** If an 
18630 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 73 65  error occurs, se
18640 74 20 74 68 65 20 46 74 73 35 49 6e 64 65 78 2e  t the Fts5Index.
18650 72 63 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 49  rc error code. I
18660 66 20 61 6e 20 65 72 72 6f 72 20 68 61 73 20 0a  f an error has .
18670 2a 2a 20 61 6c 72 65 61 64 79 20 6f 63 63 75 72  ** already occur
18680 72 65 64 2c 20 74 68 69 73 20 66 75 6e 63 74 69  red, this functi
18690 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a  on is a no-op..*
186a0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  /.static void ft
186b0 73 35 57 72 69 74 65 41 70 70 65 6e 64 54 65 72  s5WriteAppendTer
186c0 6d 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a  m(.  Fts5Index *
186d0 70 2c 20 0a 20 20 46 74 73 35 53 65 67 57 72 69  p, .  Fts5SegWri
186e0 74 65 72 20 2a 70 57 72 69 74 65 72 2c 0a 20 20  ter *pWriter,.  
186f0 69 6e 74 20 6e 54 65 72 6d 2c 20 63 6f 6e 73 74  int nTerm, const
18700 20 75 38 20 2a 70 54 65 72 6d 20 0a 29 7b 0a 20   u8 *pTerm .){. 
18710 20 69 6e 74 20 6e 50 72 65 66 69 78 3b 20 20 20   int nPrefix;   
18720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18730 20 2f 2a 20 42 79 74 65 73 20 6f 66 20 70 72 65   /* Bytes of pre
18740 66 69 78 20 63 6f 6d 70 72 65 73 73 69 6f 6e 20  fix compression 
18750 66 6f 72 20 74 65 72 6d 20 2a 2f 0a 20 20 46 74  for term */.  Ft
18760 73 35 50 61 67 65 57 72 69 74 65 72 20 2a 70 50  s5PageWriter *pP
18770 61 67 65 20 3d 20 26 70 57 72 69 74 65 72 2d 3e  age = &pWriter->
18780 77 72 69 74 65 72 3b 0a 20 20 46 74 73 35 42 75  writer;.  Fts5Bu
18790 66 66 65 72 20 2a 70 50 67 69 64 78 20 3d 20 26  ffer *pPgidx = &
187a0 70 57 72 69 74 65 72 2d 3e 77 72 69 74 65 72 2e  pWriter->writer.
187b0 70 67 69 64 78 3b 0a 0a 20 20 69 66 28 20 70 2d  pgidx;..  if( p-
187c0 3e 72 63 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  >rc ) return;.  
187d0 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 62  assert( pPage->b
187e0 75 66 2e 6e 3e 3d 34 20 29 3b 0a 20 20 61 73 73  uf.n>=4 );.  ass
187f0 65 72 74 28 20 70 50 61 67 65 2d 3e 62 75 66 2e  ert( pPage->buf.
18800 6e 3e 34 20 7c 7c 20 70 57 72 69 74 65 72 2d 3e  n>4 || pWriter->
18810 62 46 69 72 73 74 54 65 72 6d 49 6e 50 61 67 65  bFirstTermInPage
18820 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65   );..  /* If the
18830 20 63 75 72 72 65 6e 74 20 6c 65 61 66 20 70 61   current leaf pa
18840 67 65 20 69 73 20 66 75 6c 6c 2c 20 66 6c 75 73  ge is full, flus
18850 68 20 69 74 20 74 6f 20 64 69 73 6b 2e 20 2a 2f  h it to disk. */
18860 0a 20 20 69 66 28 20 28 70 50 61 67 65 2d 3e 62  .  if( (pPage->b
18870 75 66 2e 6e 20 2b 20 70 50 67 69 64 78 2d 3e 6e  uf.n + pPgidx->n
18880 20 2b 20 6e 54 65 72 6d 20 2b 20 32 29 3e 3d 70   + nTerm + 2)>=p
18890 2d 3e 70 43 6f 6e 66 69 67 2d 3e 70 67 73 7a 20  ->pConfig->pgsz 
188a0 29 7b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  ){.    if( pPage
188b0 2d 3e 62 75 66 2e 6e 3e 34 20 29 7b 0a 20 20 20  ->buf.n>4 ){.   
188c0 20 20 20 66 74 73 35 57 72 69 74 65 46 6c 75 73     fts5WriteFlus
188d0 68 4c 65 61 66 28 70 2c 20 70 57 72 69 74 65 72  hLeaf(p, pWriter
188e0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 74 73  );.    }.    fts
188f0 35 42 75 66 66 65 72 47 72 6f 77 28 26 70 2d 3e  5BufferGrow(&p->
18900 72 63 2c 20 26 70 50 61 67 65 2d 3e 62 75 66 2c  rc, &pPage->buf,
18910 20 6e 54 65 72 6d 2b 46 54 53 35 5f 44 41 54 41   nTerm+FTS5_DATA
18920 5f 50 41 44 44 49 4e 47 29 3b 0a 20 20 7d 0a 20  _PADDING);.  }. 
18930 20 0a 20 20 2f 2a 20 54 4f 44 4f 31 3a 20 55 70   .  /* TODO1: Up
18940 64 61 74 69 6e 67 20 70 67 69 64 78 20 68 65 72  dating pgidx her
18950 65 2e 20 2a 2f 0a 20 20 70 50 67 69 64 78 2d 3e  e. */.  pPgidx->
18960 6e 20 2b 3d 20 73 71 6c 69 74 65 33 46 74 73 35  n += sqlite3Fts5
18970 50 75 74 56 61 72 69 6e 74 28 0a 20 20 20 20 20  PutVarint(.     
18980 20 26 70 50 67 69 64 78 2d 3e 70 5b 70 50 67 69   &pPgidx->p[pPgi
18990 64 78 2d 3e 6e 5d 2c 20 70 50 61 67 65 2d 3e 62  dx->n], pPage->b
189a0 75 66 2e 6e 20 2d 20 70 50 61 67 65 2d 3e 69 50  uf.n - pPage->iP
189b0 72 65 76 50 67 69 64 78 0a 20 20 29 3b 0a 20 20  revPgidx.  );.  
189c0 70 50 61 67 65 2d 3e 69 50 72 65 76 50 67 69 64  pPage->iPrevPgid
189d0 78 20 3d 20 70 50 61 67 65 2d 3e 62 75 66 2e 6e  x = pPage->buf.n
189e0 3b 0a 23 69 66 20 30 0a 20 20 66 74 73 35 50 75  ;.#if 0.  fts5Pu
189f0 74 55 31 36 28 26 70 50 67 69 64 78 2d 3e 70 5b  tU16(&pPgidx->p[
18a00 70 50 67 69 64 78 2d 3e 6e 5d 2c 20 70 50 61 67  pPgidx->n], pPag
18a10 65 2d 3e 62 75 66 2e 6e 29 3b 0a 20 20 70 50 67  e->buf.n);.  pPg
18a20 69 64 78 2d 3e 6e 20 2b 3d 20 32 3b 0a 23 65 6e  idx->n += 2;.#en
18a30 64 69 66 0a 0a 20 20 69 66 28 20 70 57 72 69 74  dif..  if( pWrit
18a40 65 72 2d 3e 62 46 69 72 73 74 54 65 72 6d 49 6e  er->bFirstTermIn
18a50 50 61 67 65 20 29 7b 0a 20 20 20 20 6e 50 72 65  Page ){.    nPre
18a60 66 69 78 20 3d 20 30 3b 0a 20 20 20 20 69 66 28  fix = 0;.    if(
18a70 20 70 50 61 67 65 2d 3e 70 67 6e 6f 21 3d 31 20   pPage->pgno!=1 
18a80 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73  ){.      /* This
18a90 20 69 73 20 74 68 65 20 66 69 72 73 74 20 74 65   is the first te
18aa0 72 6d 20 6f 6e 20 61 20 6c 65 61 66 20 74 68 61  rm on a leaf tha
18ab0 74 20 69 73 20 6e 6f 74 20 74 68 65 20 6c 65 66  t is not the lef
18ac0 74 6d 6f 73 74 20 6c 65 61 66 20 69 6e 0a 20 20  tmost leaf in.  
18ad0 20 20 20 20 2a 2a 20 74 68 65 20 73 65 67 6d 65      ** the segme
18ae0 6e 74 20 62 2d 74 72 65 65 2e 20 49 6e 20 74 68  nt b-tree. In th
18af0 69 73 20 63 61 73 65 20 69 74 20 69 73 20 6e 65  is case it is ne
18b00 63 65 73 73 61 72 79 20 74 6f 20 61 64 64 20 61  cessary to add a
18b10 20 74 65 72 6d 20 74 6f 0a 20 20 20 20 20 20 2a   term to.      *
18b20 2a 20 74 68 65 20 62 2d 74 72 65 65 20 68 69 65  * the b-tree hie
18b30 72 61 72 63 68 79 20 74 68 61 74 20 69 73 20 28  rarchy that is (
18b40 61 29 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74  a) larger than t
18b50 68 65 20 6c 61 72 67 65 73 74 20 74 65 72 6d 20  he largest term 
18b60 0a 20 20 20 20 20 20 2a 2a 20 61 6c 72 65 61 64  .      ** alread
18b70 79 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65  y written to the
18b80 20 73 65 67 6d 65 6e 74 20 61 6e 64 20 28 62 29   segment and (b)
18b90 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 6f 72   smaller than or
18ba0 20 65 71 75 61 6c 20 74 6f 0a 20 20 20 20 20 20   equal to.      
18bb0 2a 2a 20 74 68 69 73 20 74 65 72 6d 2e 20 49 6e  ** this term. In
18bc0 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 61 20   other words, a 
18bd0 70 72 65 66 69 78 20 6f 66 20 28 70 54 65 72 6d  prefix of (pTerm
18be0 2f 6e 54 65 72 6d 29 20 74 68 61 74 20 69 73 20  /nTerm) that is 
18bf0 6f 6e 65 0a 20 20 20 20 20 20 2a 2a 20 62 79 74  one.      ** byt
18c00 65 20 6c 6f 6e 67 65 72 20 74 68 61 6e 20 74 68  e longer than th
18c10 65 20 6c 6f 6e 67 65 73 74 20 70 72 65 66 69 78  e longest prefix
18c20 20 28 70 54 65 72 6d 2f 6e 54 65 72 6d 29 20 73   (pTerm/nTerm) s
18c30 68 61 72 65 73 20 77 69 74 68 20 74 68 65 0a 20  hares with the. 
18c40 20 20 20 20 20 2a 2a 20 70 72 65 76 69 6f 75 73       ** previous
18c50 20 74 65 72 6d 2e 20 0a 20 20 20 20 20 20 2a 2a   term. .      **
18c60 0a 20 20 20 20 20 20 2a 2a 20 55 73 75 61 6c 6c  .      ** Usuall
18c70 79 2c 20 74 68 65 20 70 72 65 76 69 6f 75 73 20  y, the previous 
18c80 74 65 72 6d 20 69 73 20 61 76 61 69 6c 61 62 6c  term is availabl
18c90 65 20 69 6e 20 70 50 61 67 65 2d 3e 74 65 72 6d  e in pPage->term
18ca0 2e 20 54 68 65 20 65 78 63 65 70 74 69 6f 6e 0a  . The exception.
18cb0 20 20 20 20 20 20 2a 2a 20 69 73 20 69 66 20 74        ** is if t
18cc0 68 69 73 20 69 73 20 74 68 65 20 66 69 72 73 74  his is the first
18cd0 20 74 65 72 6d 20 77 72 69 74 74 65 6e 20 69 6e   term written in
18ce0 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c 2d   an incremental-
18cf0 6d 65 72 67 65 20 73 74 65 70 2e 0a 20 20 20 20  merge step..    
18d00 20 20 2a 2a 20 49 6e 20 74 68 69 73 20 63 61 73    ** In this cas
18d10 65 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 74  e the previous t
18d20 65 72 6d 20 69 73 20 6e 6f 74 20 61 76 61 69 6c  erm is not avail
18d30 61 62 6c 65 2c 20 73 6f 20 6a 75 73 74 20 77 72  able, so just wr
18d40 69 74 65 20 61 0a 20 20 20 20 20 20 2a 2a 20 63  ite a.      ** c
18d50 6f 70 79 20 6f 66 20 28 70 54 65 72 6d 2f 6e 54  opy of (pTerm/nT
18d60 65 72 6d 29 20 69 6e 74 6f 20 74 68 65 20 70 61  erm) into the pa
18d70 72 65 6e 74 20 6e 6f 64 65 2e 20 54 68 69 73 20  rent node. This 
18d80 69 73 20 73 6c 69 67 68 74 6c 79 0a 20 20 20 20  is slightly.    
18d90 20 20 2a 2a 20 69 6e 65 66 66 69 63 69 65 6e 74    ** inefficient
18da0 2c 20 62 75 74 20 73 74 69 6c 6c 20 63 6f 72 72  , but still corr
18db0 65 63 74 2e 20 20 2a 2f 0a 20 20 20 20 20 20 69  ect.  */.      i
18dc0 6e 74 20 6e 20 3d 20 6e 54 65 72 6d 3b 0a 20 20  nt n = nTerm;.  
18dd0 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 74      if( pPage->t
18de0 65 72 6d 2e 6e 20 29 7b 0a 20 20 20 20 20 20 20  erm.n ){.       
18df0 20 6e 20 3d 20 31 20 2b 20 66 74 73 35 50 72 65   n = 1 + fts5Pre
18e00 66 69 78 43 6f 6d 70 72 65 73 73 28 70 50 61 67  fixCompress(pPag
18e10 65 2d 3e 74 65 72 6d 2e 6e 2c 20 70 50 61 67 65  e->term.n, pPage
18e20 2d 3e 74 65 72 6d 2e 70 2c 20 6e 54 65 72 6d 2c  ->term.p, nTerm,
18e30 20 70 54 65 72 6d 29 3b 0a 20 20 20 20 20 20 7d   pTerm);.      }
18e40 0a 20 20 20 20 20 20 66 74 73 35 57 72 69 74 65  .      fts5Write
18e50 42 74 72 65 65 54 65 72 6d 28 70 2c 20 70 57 72  BtreeTerm(p, pWr
18e60 69 74 65 72 2c 20 6e 2c 20 70 54 65 72 6d 29 3b  iter, n, pTerm);
18e70 0a 20 20 20 20 20 20 70 50 61 67 65 20 3d 20 26  .      pPage = &
18e80 70 57 72 69 74 65 72 2d 3e 77 72 69 74 65 72 3b  pWriter->writer;
18e90 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a  .    }.  }else{.
18ea0 20 20 20 20 6e 50 72 65 66 69 78 20 3d 20 66 74      nPrefix = ft
18eb0 73 35 50 72 65 66 69 78 43 6f 6d 70 72 65 73 73  s5PrefixCompress
18ec0 28 70 50 61 67 65 2d 3e 74 65 72 6d 2e 6e 2c 20  (pPage->term.n, 
18ed0 70 50 61 67 65 2d 3e 74 65 72 6d 2e 70 2c 20 6e  pPage->term.p, n
18ee0 54 65 72 6d 2c 20 70 54 65 72 6d 29 3b 0a 20 20  Term, pTerm);.  
18ef0 20 20 66 74 73 35 42 75 66 66 65 72 41 70 70 65    fts5BufferAppe
18f00 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c  ndVarint(&p->rc,
18f10 20 26 70 50 61 67 65 2d 3e 62 75 66 2c 20 6e 50   &pPage->buf, nP
18f20 72 65 66 69 78 29 3b 0a 20 20 7d 0a 0a 20 20 2f  refix);.  }..  /
18f30 2a 20 41 70 70 65 6e 64 20 74 68 65 20 6e 75 6d  * Append the num
18f40 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20  ber of bytes of 
18f50 6e 65 77 20 64 61 74 61 2c 20 74 68 65 6e 20 74  new data, then t
18f60 68 65 20 74 65 72 6d 20 64 61 74 61 20 69 74 73  he term data its
18f70 65 6c 66 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20  elf.  ** to the 
18f80 70 61 67 65 2e 20 2a 2f 0a 20 20 66 74 73 35 42  page. */.  fts5B
18f90 75 66 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e  ufferAppendVarin
18fa0 74 28 26 70 2d 3e 72 63 2c 20 26 70 50 61 67 65  t(&p->rc, &pPage
18fb0 2d 3e 62 75 66 2c 20 6e 54 65 72 6d 20 2d 20 6e  ->buf, nTerm - n
18fc0 50 72 65 66 69 78 29 3b 0a 20 20 66 74 73 35 42  Prefix);.  fts5B
18fd0 75 66 66 65 72 41 70 70 65 6e 64 42 6c 6f 62 28  ufferAppendBlob(
18fe0 26 70 2d 3e 72 63 2c 20 26 70 50 61 67 65 2d 3e  &p->rc, &pPage->
18ff0 62 75 66 2c 20 6e 54 65 72 6d 20 2d 20 6e 50 72  buf, nTerm - nPr
19000 65 66 69 78 2c 20 26 70 54 65 72 6d 5b 6e 50 72  efix, &pTerm[nPr
19010 65 66 69 78 5d 29 3b 0a 0a 20 20 2f 2a 20 55 70  efix]);..  /* Up
19020 64 61 74 65 20 74 68 65 20 46 74 73 35 50 61 67  date the Fts5Pag
19030 65 57 72 69 74 65 72 2e 74 65 72 6d 20 66 69 65  eWriter.term fie
19040 6c 64 2e 20 2a 2f 0a 20 20 66 74 73 35 42 75 66  ld. */.  fts5Buf
19050 66 65 72 53 65 74 28 26 70 2d 3e 72 63 2c 20 26  ferSet(&p->rc, &
19060 70 50 61 67 65 2d 3e 74 65 72 6d 2c 20 6e 54 65  pPage->term, nTe
19070 72 6d 2c 20 70 54 65 72 6d 29 3b 0a 20 20 70 57  rm, pTerm);.  pW
19080 72 69 74 65 72 2d 3e 62 46 69 72 73 74 54 65 72  riter->bFirstTer
19090 6d 49 6e 50 61 67 65 20 3d 20 30 3b 0a 0a 20 20  mInPage = 0;..  
190a0 70 57 72 69 74 65 72 2d 3e 62 46 69 72 73 74 52  pWriter->bFirstR
190b0 6f 77 69 64 49 6e 50 61 67 65 20 3d 20 30 3b 0a  owidInPage = 0;.
190c0 20 20 70 57 72 69 74 65 72 2d 3e 62 46 69 72 73    pWriter->bFirs
190d0 74 52 6f 77 69 64 49 6e 44 6f 63 6c 69 73 74 20  tRowidInDoclist 
190e0 3d 20 31 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  = 1;..  assert( 
190f0 70 2d 3e 72 63 20 7c 7c 20 28 70 57 72 69 74 65  p->rc || (pWrite
19100 72 2d 3e 6e 44 6c 69 64 78 3e 30 20 26 26 20 70  r->nDlidx>0 && p
19110 57 72 69 74 65 72 2d 3e 61 44 6c 69 64 78 5b 30  Writer->aDlidx[0
19120 5d 2e 62 75 66 2e 6e 3d 3d 30 29 20 29 3b 0a 20  ].buf.n==0) );. 
19130 20 70 57 72 69 74 65 72 2d 3e 61 44 6c 69 64 78   pWriter->aDlidx
19140 5b 30 5d 2e 70 67 6e 6f 20 3d 20 70 50 61 67 65  [0].pgno = pPage
19150 2d 3e 70 67 6e 6f 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ->pgno;.}../*.**
19160 20 41 70 70 65 6e 64 20 61 20 72 6f 77 69 64 20   Append a rowid 
19170 61 6e 64 20 70 6f 73 69 74 69 6f 6e 2d 6c 69 73  and position-lis
19180 74 20 73 69 7a 65 20 66 69 65 6c 64 20 74 6f 20  t size field to 
19190 74 68 65 20 77 72 69 74 65 72 73 20 6f 75 74 70  the writers outp
191a0 75 74 2e 20 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ut. .*/.static v
191b0 6f 69 64 20 66 74 73 35 57 72 69 74 65 41 70 70  oid fts5WriteApp
191c0 65 6e 64 52 6f 77 69 64 28 0a 20 20 46 74 73 35  endRowid(.  Fts5
191d0 49 6e 64 65 78 20 2a 70 2c 20 0a 20 20 46 74 73  Index *p, .  Fts
191e0 35 53 65 67 57 72 69 74 65 72 20 2a 70 57 72 69  5SegWriter *pWri
191f0 74 65 72 2c 0a 20 20 69 36 34 20 69 52 6f 77 69  ter,.  i64 iRowi
19200 64 2c 0a 20 20 69 6e 74 20 6e 50 6f 73 0a 29 7b  d,.  int nPos.){
19210 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51  .  if( p->rc==SQ
19220 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 46  LITE_OK ){.    F
19230 74 73 35 50 61 67 65 57 72 69 74 65 72 20 2a 70  ts5PageWriter *p
19240 50 61 67 65 20 3d 20 26 70 57 72 69 74 65 72 2d  Page = &pWriter-
19250 3e 77 72 69 74 65 72 3b 0a 0a 20 20 20 20 69 66  >writer;..    if
19260 28 20 28 70 50 61 67 65 2d 3e 62 75 66 2e 6e 20  ( (pPage->buf.n 
19270 2b 20 70 50 61 67 65 2d 3e 70 67 69 64 78 2e 6e  + pPage->pgidx.n
19280 29 3e 3d 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e 70  )>=p->pConfig->p
19290 67 73 7a 20 29 7b 0a 20 20 20 20 20 20 66 74 73  gsz ){.      fts
192a0 35 57 72 69 74 65 46 6c 75 73 68 4c 65 61 66 28  5WriteFlushLeaf(
192b0 70 2c 20 70 57 72 69 74 65 72 29 3b 0a 20 20 20  p, pWriter);.   
192c0 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68   }..    /* If th
192d0 69 73 20 69 73 20 74 6f 20 62 65 20 74 68 65 20  is is to be the 
192e0 66 69 72 73 74 20 72 6f 77 69 64 20 77 72 69 74  first rowid writ
192f0 74 65 6e 20 74 6f 20 74 68 65 20 70 61 67 65 2c  ten to the page,
19300 20 73 65 74 20 74 68 65 20 0a 20 20 20 20 2a 2a   set the .    **
19310 20 72 6f 77 69 64 2d 70 6f 69 6e 74 65 72 20 69   rowid-pointer i
19320 6e 20 74 68 65 20 70 61 67 65 2d 68 65 61 64 65  n the page-heade
19330 72 2e 20 41 6c 73 6f 20 61 70 70 65 6e 64 20 61  r. Also append a
19340 20 76 61 6c 75 65 20 74 6f 20 74 68 65 20 64 6c   value to the dl
19350 69 64 78 0a 20 20 20 20 2a 2a 20 62 75 66 66 65  idx.    ** buffe
19360 72 2c 20 69 6e 20 63 61 73 65 20 61 20 64 6f 63  r, in case a doc
19370 6c 69 73 74 2d 69 6e 64 65 78 20 69 73 20 72 65  list-index is re
19380 71 75 69 72 65 64 2e 20 20 2a 2f 0a 20 20 20 20  quired.  */.    
19390 69 66 28 20 70 57 72 69 74 65 72 2d 3e 62 46 69  if( pWriter->bFi
193a0 72 73 74 52 6f 77 69 64 49 6e 50 61 67 65 20 29  rstRowidInPage )
193b0 7b 0a 20 20 20 20 20 20 66 74 73 35 50 75 74 55  {.      fts5PutU
193c0 31 36 28 70 50 61 67 65 2d 3e 62 75 66 2e 70 2c  16(pPage->buf.p,
193d0 20 70 50 61 67 65 2d 3e 62 75 66 2e 6e 29 3b 0a   pPage->buf.n);.
193e0 20 20 20 20 20 20 66 74 73 35 57 72 69 74 65 44        fts5WriteD
193f0 6c 69 64 78 41 70 70 65 6e 64 28 70 2c 20 70 57  lidxAppend(p, pW
19400 72 69 74 65 72 2c 20 69 52 6f 77 69 64 29 3b 0a  riter, iRowid);.
19410 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 57 72      }..    /* Wr
19420 69 74 65 20 74 68 65 20 72 6f 77 69 64 2e 20 2a  ite the rowid. *
19430 2f 0a 20 20 20 20 69 66 28 20 70 57 72 69 74 65  /.    if( pWrite
19440 72 2d 3e 62 46 69 72 73 74 52 6f 77 69 64 49 6e  r->bFirstRowidIn
19450 44 6f 63 6c 69 73 74 20 7c 7c 20 70 57 72 69 74  Doclist || pWrit
19460 65 72 2d 3e 62 46 69 72 73 74 52 6f 77 69 64 49  er->bFirstRowidI
19470 6e 50 61 67 65 20 29 7b 0a 20 20 20 20 20 20 66  nPage ){.      f
19480 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 56  ts5BufferAppendV
19490 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26 70  arint(&p->rc, &p
194a0 50 61 67 65 2d 3e 62 75 66 2c 20 69 52 6f 77 69  Page->buf, iRowi
194b0 64 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  d);.    }else{. 
194c0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e       assert( p->
194d0 72 63 20 7c 7c 20 69 52 6f 77 69 64 3e 70 57 72  rc || iRowid>pWr
194e0 69 74 65 72 2d 3e 69 50 72 65 76 52 6f 77 69 64  iter->iPrevRowid
194f0 20 29 3b 0a 20 20 20 20 20 20 66 74 73 35 42 75   );.      fts5Bu
19500 66 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e 74  fferAppendVarint
19510 28 26 70 2d 3e 72 63 2c 20 26 70 50 61 67 65 2d  (&p->rc, &pPage-
19520 3e 62 75 66 2c 20 69 52 6f 77 69 64 20 2d 20 70  >buf, iRowid - p
19530 57 72 69 74 65 72 2d 3e 69 50 72 65 76 52 6f 77  Writer->iPrevRow
19540 69 64 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  id);.    }.    p
19550 57 72 69 74 65 72 2d 3e 69 50 72 65 76 52 6f 77  Writer->iPrevRow
19560 69 64 20 3d 20 69 52 6f 77 69 64 3b 0a 20 20 20  id = iRowid;.   
19570 20 70 57 72 69 74 65 72 2d 3e 62 46 69 72 73 74   pWriter->bFirst
19580 52 6f 77 69 64 49 6e 44 6f 63 6c 69 73 74 20 3d  RowidInDoclist =
19590 20 30 3b 0a 20 20 20 20 70 57 72 69 74 65 72 2d   0;.    pWriter-
195a0 3e 62 46 69 72 73 74 52 6f 77 69 64 49 6e 50 61  >bFirstRowidInPa
195b0 67 65 20 3d 20 30 3b 0a 0a 20 20 20 20 66 74 73  ge = 0;..    fts
195c0 35 42 75 66 66 65 72 41 70 70 65 6e 64 56 61 72  5BufferAppendVar
195d0 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26 70 50 61  int(&p->rc, &pPa
195e0 67 65 2d 3e 62 75 66 2c 20 6e 50 6f 73 29 3b 0a  ge->buf, nPos);.
195f0 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f    }.}..static vo
19600 69 64 20 66 74 73 35 57 72 69 74 65 41 70 70 65  id fts5WriteAppe
19610 6e 64 50 6f 73 6c 69 73 74 44 61 74 61 28 0a 20  ndPoslistData(. 
19620 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 0a   Fts5Index *p, .
19630 20 20 46 74 73 35 53 65 67 57 72 69 74 65 72 20    Fts5SegWriter 
19640 2a 70 57 72 69 74 65 72 2c 20 0a 20 20 63 6f 6e  *pWriter, .  con
19650 73 74 20 75 38 20 2a 61 44 61 74 61 2c 20 0a 20  st u8 *aData, . 
19660 20 69 6e 74 20 6e 44 61 74 61 0a 29 7b 0a 20 20   int nData.){.  
19670 46 74 73 35 50 61 67 65 57 72 69 74 65 72 20 2a  Fts5PageWriter *
19680 70 50 61 67 65 20 3d 20 26 70 57 72 69 74 65 72  pPage = &pWriter
19690 2d 3e 77 72 69 74 65 72 3b 0a 20 20 63 6f 6e 73  ->writer;.  cons
196a0 74 20 75 38 20 2a 61 20 3d 20 61 44 61 74 61 3b  t u8 *a = aData;
196b0 0a 20 20 69 6e 74 20 6e 20 3d 20 6e 44 61 74 61  .  int n = nData
196c0 3b 0a 20 20 0a 20 20 61 73 73 65 72 74 28 20 70  ;.  .  assert( p
196d0 2d 3e 70 43 6f 6e 66 69 67 2d 3e 70 67 73 7a 3e  ->pConfig->pgsz>
196e0 30 20 29 3b 0a 20 20 77 68 69 6c 65 28 20 70 2d  0 );.  while( p-
196f0 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 0a  >rc==SQLITE_OK .
19700 20 20 20 20 20 26 26 20 28 70 50 61 67 65 2d 3e       && (pPage->
19710 62 75 66 2e 6e 20 2b 20 70 50 61 67 65 2d 3e 70  buf.n + pPage->p
19720 67 69 64 78 2e 6e 20 2b 20 6e 29 3e 3d 70 2d 3e  gidx.n + n)>=p->
19730 70 43 6f 6e 66 69 67 2d 3e 70 67 73 7a 20 0a 20  pConfig->pgsz . 
19740 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 52 65 71   ){.    int nReq
19750 20 3d 20 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e 70   = p->pConfig->p
19760 67 73 7a 20 2d 20 70 50 61 67 65 2d 3e 62 75 66  gsz - pPage->buf
19770 2e 6e 20 2d 20 70 50 61 67 65 2d 3e 70 67 69 64  .n - pPage->pgid
19780 78 2e 6e 3b 0a 20 20 20 20 69 6e 74 20 6e 43 6f  x.n;.    int nCo
19790 70 79 20 3d 20 30 3b 0a 20 20 20 20 77 68 69 6c  py = 0;.    whil
197a0 65 28 20 6e 43 6f 70 79 3c 6e 52 65 71 20 29 7b  e( nCopy<nReq ){
197b0 0a 20 20 20 20 20 20 69 36 34 20 64 75 6d 6d 79  .      i64 dummy
197c0 3b 0a 20 20 20 20 20 20 6e 43 6f 70 79 20 2b 3d  ;.      nCopy +=
197d0 20 66 74 73 35 47 65 74 56 61 72 69 6e 74 28 26   fts5GetVarint(&
197e0 61 5b 6e 43 6f 70 79 5d 2c 20 28 75 36 34 2a 29  a[nCopy], (u64*)
197f0 26 64 75 6d 6d 79 29 3b 0a 20 20 20 20 7d 0a 20  &dummy);.    }. 
19800 20 20 20 66 74 73 35 42 75 66 66 65 72 41 70 70     fts5BufferApp
19810 65 6e 64 42 6c 6f 62 28 26 70 2d 3e 72 63 2c 20  endBlob(&p->rc, 
19820 26 70 50 61 67 65 2d 3e 62 75 66 2c 20 6e 43 6f  &pPage->buf, nCo
19830 70 79 2c 20 61 29 3b 0a 20 20 20 20 61 20 2b 3d  py, a);.    a +=
19840 20 6e 43 6f 70 79 3b 0a 20 20 20 20 6e 20 2d 3d   nCopy;.    n -=
19850 20 6e 43 6f 70 79 3b 0a 20 20 20 20 66 74 73 35   nCopy;.    fts5
19860 57 72 69 74 65 46 6c 75 73 68 4c 65 61 66 28 70  WriteFlushLeaf(p
19870 2c 20 70 57 72 69 74 65 72 29 3b 0a 20 20 7d 0a  , pWriter);.  }.
19880 20 20 69 66 28 20 6e 3e 30 20 29 7b 0a 20 20 20    if( n>0 ){.   
19890 20 66 74 73 35 42 75 66 66 65 72 41 70 70 65 6e   fts5BufferAppen
198a0 64 42 6c 6f 62 28 26 70 2d 3e 72 63 2c 20 26 70  dBlob(&p->rc, &p
198b0 50 61 67 65 2d 3e 62 75 66 2c 20 6e 2c 20 61 29  Page->buf, n, a)
198c0 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46  ;.  }.}../*.** F
198d0 6c 75 73 68 20 61 6e 79 20 64 61 74 61 20 63 61  lush any data ca
198e0 63 68 65 64 20 62 79 20 74 68 65 20 77 72 69 74  ched by the writ
198f0 65 72 20 6f 62 6a 65 63 74 20 74 6f 20 74 68 65  er object to the
19900 20 64 61 74 61 62 61 73 65 2e 20 46 72 65 65 20   database. Free 
19910 61 6e 79 0a 2a 2a 20 61 6c 6c 6f 63 61 74 69 6f  any.** allocatio
19920 6e 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  ns associated wi
19930 74 68 20 74 68 65 20 77 72 69 74 65 72 2e 0a 2a  th the writer..*
19940 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  /.static void ft
19950 73 35 57 72 69 74 65 46 69 6e 69 73 68 28 0a 20  s5WriteFinish(. 
19960 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 0a   Fts5Index *p, .
19970 20 20 46 74 73 35 53 65 67 57 72 69 74 65 72 20    Fts5SegWriter 
19980 2a 70 57 72 69 74 65 72 2c 20 20 20 20 20 20 20  *pWriter,       
19990 20 20 2f 2a 20 57 72 69 74 65 72 20 6f 62 6a 65    /* Writer obje
199a0 63 74 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 4c  ct */.  int *pnL
199b0 65 61 66 20 20 20 20 20 20 20 20 20 20 20 20 20  eaf             
199c0 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20          /* OUT: 
199d0 4e 75 6d 62 65 72 20 6f 66 20 6c 65 61 66 20 70  Number of leaf p
199e0 61 67 65 73 20 69 6e 20 62 2d 74 72 65 65 20 2a  ages in b-tree *
199f0 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  /.){.  int i;.  
19a00 46 74 73 35 50 61 67 65 57 72 69 74 65 72 20 2a  Fts5PageWriter *
19a10 70 4c 65 61 66 20 3d 20 26 70 57 72 69 74 65 72  pLeaf = &pWriter
19a20 2d 3e 77 72 69 74 65 72 3b 0a 20 20 69 66 28 20  ->writer;.  if( 
19a30 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
19a40 20 29 7b 0a 20 20 20 20 69 66 28 20 70 4c 65 61   ){.    if( pLea
19a50 66 2d 3e 70 67 6e 6f 3d 3d 31 20 26 26 20 70 4c  f->pgno==1 && pL
19a60 65 61 66 2d 3e 62 75 66 2e 6e 3d 3d 30 20 29 7b  eaf->buf.n==0 ){
19a70 0a 20 20 20 20 20 20 2a 70 6e 4c 65 61 66 20 3d  .      *pnLeaf =
19a80 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   0;.    }else{. 
19a90 20 20 20 20 20 69 66 28 20 70 4c 65 61 66 2d 3e       if( pLeaf->
19aa0 62 75 66 2e 6e 3e 34 20 29 7b 0a 20 20 20 20 20  buf.n>4 ){.     
19ab0 20 20 20 66 74 73 35 57 72 69 74 65 46 6c 75 73     fts5WriteFlus
19ac0 68 4c 65 61 66 28 70 2c 20 70 57 72 69 74 65 72  hLeaf(p, pWriter
19ad0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
19ae0 20 2a 70 6e 4c 65 61 66 20 3d 20 70 4c 65 61 66   *pnLeaf = pLeaf
19af0 2d 3e 70 67 6e 6f 2d 31 3b 0a 0a 20 20 20 20 20  ->pgno-1;..     
19b00 20 66 74 73 35 57 72 69 74 65 46 6c 75 73 68 42   fts5WriteFlushB
19b10 74 72 65 65 28 70 2c 20 70 57 72 69 74 65 72 29  tree(p, pWriter)
19b20 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66 74  ;.    }.  }.  ft
19b30 73 35 42 75 66 66 65 72 46 72 65 65 28 26 70 4c  s5BufferFree(&pL
19b40 65 61 66 2d 3e 74 65 72 6d 29 3b 0a 20 20 66 74  eaf->term);.  ft
19b50 73 35 42 75 66 66 65 72 46 72 65 65 28 26 70 4c  s5BufferFree(&pL
19b60 65 61 66 2d 3e 62 75 66 29 3b 0a 20 20 66 74 73  eaf->buf);.  fts
19b70 35 42 75 66 66 65 72 46 72 65 65 28 26 70 4c 65  5BufferFree(&pLe
19b80 61 66 2d 3e 70 67 69 64 78 29 3b 0a 20 20 66 74  af->pgidx);.  ft
19b90 73 35 42 75 66 66 65 72 46 72 65 65 28 26 70 57  s5BufferFree(&pW
19ba0 72 69 74 65 72 2d 3e 62 74 74 65 72 6d 29 3b 0a  riter->btterm);.
19bb0 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 57  .  for(i=0; i<pW
19bc0 72 69 74 65 72 2d 3e 6e 44 6c 69 64 78 3b 20 69  riter->nDlidx; i
19bd0 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ++){.    sqlite3
19be0 46 74 73 35 42 75 66 66 65 72 46 72 65 65 28 26  Fts5BufferFree(&
19bf0 70 57 72 69 74 65 72 2d 3e 61 44 6c 69 64 78 5b  pWriter->aDlidx[
19c00 69 5d 2e 62 75 66 29 3b 0a 20 20 7d 0a 20 20 73  i].buf);.  }.  s
19c10 71 6c 69 74 65 33 5f 66 72 65 65 28 70 57 72 69  qlite3_free(pWri
19c20 74 65 72 2d 3e 61 44 6c 69 64 78 29 3b 0a 7d 0a  ter->aDlidx);.}.
19c30 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
19c40 35 57 72 69 74 65 49 6e 69 74 28 0a 20 20 46 74  5WriteInit(.  Ft
19c50 73 35 49 6e 64 65 78 20 2a 70 2c 20 0a 20 20 46  s5Index *p, .  F
19c60 74 73 35 53 65 67 57 72 69 74 65 72 20 2a 70 57  ts5SegWriter *pW
19c70 72 69 74 65 72 2c 20 0a 20 20 69 6e 74 20 69 53  riter, .  int iS
19c80 65 67 69 64 0a 29 7b 0a 20 20 63 6f 6e 73 74 20  egid.){.  const 
19c90 69 6e 74 20 6e 42 75 66 66 65 72 20 3d 20 70 2d  int nBuffer = p-
19ca0 3e 70 43 6f 6e 66 69 67 2d 3e 70 67 73 7a 20 2b  >pConfig->pgsz +
19cb0 20 46 54 53 35 5f 44 41 54 41 5f 50 41 44 44 49   FTS5_DATA_PADDI
19cc0 4e 47 3b 0a 0a 20 20 6d 65 6d 73 65 74 28 70 57  NG;..  memset(pW
19cd0 72 69 74 65 72 2c 20 30 2c 20 73 69 7a 65 6f 66  riter, 0, sizeof
19ce0 28 46 74 73 35 53 65 67 57 72 69 74 65 72 29 29  (Fts5SegWriter))
19cf0 3b 0a 20 20 70 57 72 69 74 65 72 2d 3e 69 53 65  ;.  pWriter->iSe
19d00 67 69 64 20 3d 20 69 53 65 67 69 64 3b 0a 0a 20  gid = iSegid;.. 
19d10 20 66 74 73 35 57 72 69 74 65 44 6c 69 64 78 47   fts5WriteDlidxG
19d20 72 6f 77 28 70 2c 20 70 57 72 69 74 65 72 2c 20  row(p, pWriter, 
19d30 31 29 3b 0a 20 20 70 57 72 69 74 65 72 2d 3e 77  1);.  pWriter->w
19d40 72 69 74 65 72 2e 70 67 6e 6f 20 3d 20 31 3b 0a  riter.pgno = 1;.
19d50 20 20 70 57 72 69 74 65 72 2d 3e 62 46 69 72 73    pWriter->bFirs
19d60 74 54 65 72 6d 49 6e 50 61 67 65 20 3d 20 31 3b  tTermInPage = 1;
19d70 0a 20 20 70 57 72 69 74 65 72 2d 3e 69 42 74 50  .  pWriter->iBtP
19d80 61 67 65 20 3d 20 31 3b 0a 0a 20 20 2f 2a 20 47  age = 1;..  /* G
19d90 72 6f 77 20 74 68 65 20 74 77 6f 20 62 75 66 66  row the two buff
19da0 65 72 73 20 74 6f 20 70 67 73 7a 20 2b 20 70 61  ers to pgsz + pa
19db0 64 64 69 6e 67 20 62 79 74 65 73 20 69 6e 20 73  dding bytes in s
19dc0 69 7a 65 2e 20 2a 2f 0a 20 20 66 74 73 35 42 75  ize. */.  fts5Bu
19dd0 66 66 65 72 47 72 6f 77 28 26 70 2d 3e 72 63 2c  fferGrow(&p->rc,
19de0 20 26 70 57 72 69 74 65 72 2d 3e 77 72 69 74 65   &pWriter->write
19df0 72 2e 70 67 69 64 78 2c 20 6e 42 75 66 66 65 72  r.pgidx, nBuffer
19e00 29 3b 0a 20 20 66 74 73 35 42 75 66 66 65 72 47  );.  fts5BufferG
19e10 72 6f 77 28 26 70 2d 3e 72 63 2c 20 26 70 57 72  row(&p->rc, &pWr
19e20 69 74 65 72 2d 3e 77 72 69 74 65 72 2e 62 75 66  iter->writer.buf
19e30 2c 20 6e 42 75 66 66 65 72 29 3b 0a 0a 20 20 69  , nBuffer);..  i
19e40 66 28 20 70 2d 3e 70 49 64 78 57 72 69 74 65 72  f( p->pIdxWriter
19e50 3d 3d 30 20 29 7b 0a 20 20 20 20 46 74 73 35 43  ==0 ){.    Fts5C
19e60 6f 6e 66 69 67 20 2a 70 43 6f 6e 66 69 67 20 3d  onfig *pConfig =
19e70 20 70 2d 3e 70 43 6f 6e 66 69 67 3b 0a 20 20 20   p->pConfig;.   
19e80 20 66 74 73 35 49 6e 64 65 78 50 72 65 70 61 72   fts5IndexPrepar
19e90 65 53 74 6d 74 28 70 2c 20 26 70 2d 3e 70 49 64  eStmt(p, &p->pId
19ea0 78 57 72 69 74 65 72 2c 20 73 71 6c 69 74 65 33  xWriter, sqlite3
19eb0 5f 6d 70 72 69 6e 74 66 28 0a 20 20 20 20 20 20  _mprintf(.      
19ec0 20 20 20 20 22 49 4e 53 45 52 54 20 49 4e 54 4f      "INSERT INTO
19ed0 20 27 25 71 27 2e 27 25 71 5f 69 64 78 27 28 73   '%q'.'%q_idx'(s
19ee0 65 67 69 64 2c 74 65 72 6d 2c 70 67 6e 6f 29 20  egid,term,pgno) 
19ef0 56 41 4c 55 45 53 28 3f 2c 3f 2c 3f 29 22 2c 20  VALUES(?,?,?)", 
19f00 0a 20 20 20 20 20 20 20 20 20 20 70 43 6f 6e 66  .          pConf
19f10 69 67 2d 3e 7a 44 62 2c 20 70 43 6f 6e 66 69 67  ig->zDb, pConfig
19f20 2d 3e 7a 4e 61 6d 65 0a 20 20 20 20 29 29 3b 0a  ->zName.    ));.
19f30 20 20 7d 0a 0a 20 20 69 66 28 20 70 2d 3e 72 63    }..  if( p->rc
19f40 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
19f50 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65     /* Initialize
19f60 20 74 68 65 20 34 2d 62 79 74 65 20 6c 65 61 66   the 4-byte leaf
19f70 2d 70 61 67 65 20 68 65 61 64 65 72 20 74 6f 20  -page header to 
19f80 30 78 30 30 2e 20 2a 2f 0a 20 20 20 20 6d 65 6d  0x00. */.    mem
19f90 73 65 74 28 70 57 72 69 74 65 72 2d 3e 77 72 69  set(pWriter->wri
19fa0 74 65 72 2e 62 75 66 2e 70 2c 20 30 2c 20 34 29  ter.buf.p, 0, 4)
19fb0 3b 0a 20 20 20 20 70 57 72 69 74 65 72 2d 3e 77  ;.    pWriter->w
19fc0 72 69 74 65 72 2e 62 75 66 2e 6e 20 3d 20 34 3b  riter.buf.n = 4;
19fd0 0a 0a 20 20 20 20 2f 2a 20 42 69 6e 64 20 74 68  ..    /* Bind th
19fe0 65 20 63 75 72 72 65 6e 74 20 6f 75 74 70 75 74  e current output
19ff0 20 73 65 67 6d 65 6e 74 20 69 64 20 74 6f 20 74   segment id to t
1a000 68 65 20 69 6e 64 65 78 2d 77 72 69 74 65 72 2e  he index-writer.
1a010 20 54 68 69 73 20 69 73 20 61 6e 0a 20 20 20 20   This is an.    
1a020 2a 2a 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20  ** optimization 
1a030 6f 76 65 72 20 62 69 6e 64 69 6e 67 20 74 68 65  over binding the
1a040 20 73 61 6d 65 20 76 61 6c 75 65 20 6f 76 65 72   same value over
1a050 20 61 6e 64 20 6f 76 65 72 20 61 73 20 72 6f 77   and over as row
1a060 73 20 61 72 65 0a 20 20 20 20 2a 2a 20 69 6e 73  s are.    ** ins
1a070 65 72 74 65 64 20 69 6e 74 6f 20 25 5f 69 64 78  erted into %_idx
1a080 20 62 79 20 74 68 65 20 63 75 72 72 65 6e 74 20   by the current 
1a090 77 72 69 74 65 72 2e 20 20 2a 2f 0a 20 20 20 20  writer.  */.    
1a0a0 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74  sqlite3_bind_int
1a0b0 28 70 2d 3e 70 49 64 78 57 72 69 74 65 72 2c 20  (p->pIdxWriter, 
1a0c0 31 2c 20 70 57 72 69 74 65 72 2d 3e 69 53 65 67  1, pWriter->iSeg
1a0d0 69 64 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  id);.  }.}../*.*
1a0e0 2a 20 49 74 65 72 61 74 6f 72 20 70 49 74 65 72  * Iterator pIter
1a0f0 20 77 61 73 20 75 73 65 64 20 74 6f 20 69 74 65   was used to ite
1a100 72 61 74 65 20 74 68 72 6f 75 67 68 20 74 68 65  rate through the
1a110 20 69 6e 70 75 74 20 73 65 67 6d 65 6e 74 73 20   input segments 
1a120 6f 66 20 6f 6e 20 61 6e 0a 2a 2a 20 69 6e 63 72  of on an.** incr
1a130 65 6d 65 6e 74 61 6c 20 6d 65 72 67 65 20 6f 70  emental merge op
1a140 65 72 61 74 69 6f 6e 2e 20 54 68 69 73 20 66 75  eration. This fu
1a150 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
1a160 20 69 66 20 74 68 65 20 69 6e 63 72 65 6d 65 6e   if the incremen
1a170 74 61 6c 0a 2a 2a 20 6d 65 72 67 65 20 73 74 65  tal.** merge ste
1a180 70 20 68 61 73 20 66 69 6e 69 73 68 65 64 20 62  p has finished b
1a190 75 74 20 74 68 65 20 69 6e 70 75 74 20 68 61 73  ut the input has
1a1a0 20 6e 6f 74 20 62 65 65 6e 20 63 6f 6d 70 6c 65   not been comple
1a1b0 74 65 6c 79 20 65 78 68 61 75 73 74 65 64 2e 0a  tely exhausted..
1a1c0 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
1a1d0 74 73 35 54 72 69 6d 53 65 67 6d 65 6e 74 73 28  ts5TrimSegments(
1a1e0 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 46 74  Fts5Index *p, Ft
1a1f0 73 35 49 6e 64 65 78 49 74 65 72 20 2a 70 49 74  s5IndexIter *pIt
1a200 65 72 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  er){.  int i;.  
1a210 46 74 73 35 42 75 66 66 65 72 20 62 75 66 3b 0a  Fts5Buffer buf;.
1a220 20 20 6d 65 6d 73 65 74 28 26 62 75 66 2c 20 30    memset(&buf, 0
1a230 2c 20 73 69 7a 65 6f 66 28 46 74 73 35 42 75 66  , sizeof(Fts5Buf
1a240 66 65 72 29 29 3b 0a 20 20 66 6f 72 28 69 3d 30  fer));.  for(i=0
1a250 3b 20 69 3c 70 49 74 65 72 2d 3e 6e 53 65 67 3b  ; i<pIter->nSeg;
1a260 20 69 2b 2b 29 7b 0a 20 20 20 20 46 74 73 35 53   i++){.    Fts5S
1a270 65 67 49 74 65 72 20 2a 70 53 65 67 20 3d 20 26  egIter *pSeg = &
1a280 70 49 74 65 72 2d 3e 61 53 65 67 5b 69 5d 3b 0a  pIter->aSeg[i];.
1a290 20 20 20 20 69 66 28 20 70 53 65 67 2d 3e 70 53      if( pSeg->pS
1a2a0 65 67 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f  eg==0 ){.      /
1a2b0 2a 20 6e 6f 2d 6f 70 20 2a 2f 0a 20 20 20 20 7d  * no-op */.    }
1a2c0 65 6c 73 65 20 69 66 28 20 70 53 65 67 2d 3e 70  else if( pSeg->p
1a2d0 4c 65 61 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Leaf==0 ){.     
1a2e0 20 2f 2a 20 41 6c 6c 20 6b 65 79 73 20 66 72 6f   /* All keys fro
1a2f0 6d 20 74 68 69 73 20 69 6e 70 75 74 20 73 65 67  m this input seg
1a300 6d 65 6e 74 20 68 61 76 65 20 62 65 65 6e 20 74  ment have been t
1a310 72 61 6e 73 66 65 72 65 64 20 74 6f 20 74 68 65  ransfered to the
1a320 20 6f 75 74 70 75 74 2e 0a 20 20 20 20 20 20 2a   output..      *
1a330 2a 20 53 65 74 20 62 6f 74 68 20 74 68 65 20 66  * Set both the f
1a340 69 72 73 74 20 61 6e 64 20 6c 61 73 74 20 70 61  irst and last pa
1a350 67 65 2d 6e 75 6d 62 65 72 73 20 74 6f 20 30 20  ge-numbers to 0 
1a360 74 6f 20 69 6e 64 69 63 61 74 65 20 74 68 61 74  to indicate that
1a370 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 73 65   the.      ** se
1a380 67 6d 65 6e 74 20 69 73 20 6e 6f 77 20 65 6d 70  gment is now emp
1a390 74 79 2e 20 2a 2f 0a 20 20 20 20 20 20 70 53 65  ty. */.      pSe
1a3a0 67 2d 3e 70 53 65 67 2d 3e 70 67 6e 6f 4c 61 73  g->pSeg->pgnoLas
1a3b0 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 53 65  t = 0;.      pSe
1a3c0 67 2d 3e 70 53 65 67 2d 3e 70 67 6e 6f 46 69 72  g->pSeg->pgnoFir
1a3d0 73 74 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73  st = 0;.    }els
1a3e0 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 4f 66  e{.      int iOf
1a3f0 66 20 3d 20 70 53 65 67 2d 3e 69 54 65 72 6d 4c  f = pSeg->iTermL
1a400 65 61 66 4f 66 66 73 65 74 3b 20 20 20 20 20 2f  eafOffset;     /
1a410 2a 20 4f 66 66 73 65 74 20 6f 6e 20 6e 65 77 20  * Offset on new 
1a420 66 69 72 73 74 20 6c 65 61 66 20 70 61 67 65 20  first leaf page 
1a430 2a 2f 0a 20 20 20 20 20 20 69 36 34 20 69 4c 65  */.      i64 iLe
1a440 61 66 52 6f 77 69 64 3b 0a 20 20 20 20 20 20 46  afRowid;.      F
1a450 74 73 35 44 61 74 61 20 2a 70 44 61 74 61 3b 0a  ts5Data *pData;.
1a460 20 20 20 20 20 20 69 6e 74 20 69 49 64 20 3d 20        int iId = 
1a470 70 53 65 67 2d 3e 70 53 65 67 2d 3e 69 53 65 67  pSeg->pSeg->iSeg
1a480 69 64 3b 0a 20 20 20 20 20 20 75 38 20 61 48 64  id;.      u8 aHd
1a490 72 5b 34 5d 20 3d 20 7b 30 78 30 30 2c 20 30 78  r[4] = {0x00, 0x
1a4a0 30 30 2c 20 30 78 30 30 2c 20 30 78 30 30 7d 3b  00, 0x00, 0x00};
1a4b0 0a 0a 20 20 20 20 20 20 69 4c 65 61 66 52 6f 77  ..      iLeafRow
1a4c0 69 64 20 3d 20 46 54 53 35 5f 53 45 47 4d 45 4e  id = FTS5_SEGMEN
1a4d0 54 5f 52 4f 57 49 44 28 69 49 64 2c 20 70 53 65  T_ROWID(iId, pSe
1a4e0 67 2d 3e 69 54 65 72 6d 4c 65 61 66 50 67 6e 6f  g->iTermLeafPgno
1a4f0 29 3b 0a 20 20 20 20 20 20 70 44 61 74 61 20 3d  );.      pData =
1a500 20 66 74 73 35 44 61 74 61 52 65 61 64 28 70 2c   fts5DataRead(p,
1a510 20 69 4c 65 61 66 52 6f 77 69 64 29 3b 0a 20 20   iLeafRowid);.  
1a520 20 20 20 20 69 66 28 20 70 44 61 74 61 20 29 7b      if( pData ){
1a530 0a 20 20 20 20 20 20 20 20 66 74 73 35 42 75 66  .        fts5Buf
1a540 66 65 72 5a 65 72 6f 28 26 62 75 66 29 3b 0a 20  ferZero(&buf);. 
1a550 20 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65         fts5Buffe
1a560 72 47 72 6f 77 28 26 70 2d 3e 72 63 2c 20 26 62  rGrow(&p->rc, &b
1a570 75 66 2c 20 70 44 61 74 61 2d 3e 6e 6e 29 3b 0a  uf, pData->nn);.
1a580 20 20 20 20 20 20 20 20 66 74 73 35 42 75 66 66          fts5Buff
1a590 65 72 41 70 70 65 6e 64 42 6c 6f 62 28 26 70 2d  erAppendBlob(&p-
1a5a0 3e 72 63 2c 20 26 62 75 66 2c 20 73 69 7a 65 6f  >rc, &buf, sizeo
1a5b0 66 28 61 48 64 72 29 2c 20 61 48 64 72 29 3b 0a  f(aHdr), aHdr);.
1a5c0 20 20 20 20 20 20 20 20 66 74 73 35 42 75 66 66          fts5Buff
1a5d0 65 72 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26  erAppendVarint(&
1a5e0 70 2d 3e 72 63 2c 20 26 62 75 66 2c 20 70 53 65  p->rc, &buf, pSe
1a5f0 67 2d 3e 74 65 72 6d 2e 6e 29 3b 0a 20 20 20 20  g->term.n);.    
1a600 20 20 20 20 66 74 73 35 42 75 66 66 65 72 41 70      fts5BufferAp
1a610 70 65 6e 64 42 6c 6f 62 28 26 70 2d 3e 72 63 2c  pendBlob(&p->rc,
1a620 20 26 62 75 66 2c 20 70 53 65 67 2d 3e 74 65 72   &buf, pSeg->ter
1a630 6d 2e 6e 2c 20 70 53 65 67 2d 3e 74 65 72 6d 2e  m.n, pSeg->term.
1a640 70 29 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35  p);.        fts5
1a650 42 75 66 66 65 72 41 70 70 65 6e 64 42 6c 6f 62  BufferAppendBlob
1a660 28 26 70 2d 3e 72 63 2c 20 26 62 75 66 2c 20 70  (&p->rc, &buf, p
1a670 44 61 74 61 2d 3e 73 7a 4c 65 61 66 2d 69 4f 66  Data->szLeaf-iOf
1a680 66 2c 20 26 70 44 61 74 61 2d 3e 70 5b 69 4f 66  f, &pData->p[iOf
1a690 66 5d 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  f]);.        if(
1a6a0 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
1a6b0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  K ){.          /
1a6c0 2a 20 53 65 74 20 74 68 65 20 73 7a 4c 65 61 66  * Set the szLeaf
1a6d0 20 66 69 65 6c 64 20 2a 2f 0a 20 20 20 20 20 20   field */.      
1a6e0 20 20 20 20 66 74 73 35 50 75 74 55 31 36 28 26      fts5PutU16(&
1a6f0 62 75 66 2e 70 5b 32 5d 2c 20 62 75 66 2e 6e 29  buf.p[2], buf.n)
1a700 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20  ;.        }..   
1a710 20 20 20 20 20 2f 2a 20 53 65 74 20 75 70 20 74       /* Set up t
1a720 68 65 20 6e 65 77 20 70 61 67 65 2d 69 6e 64 65  he new page-inde
1a730 78 20 61 72 72 61 79 20 2a 2f 0a 20 20 20 20 20  x array */.     
1a740 20 20 20 66 74 73 35 42 75 66 66 65 72 41 70 70     fts5BufferApp
1a750 65 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e 72 63  endVarint(&p->rc
1a760 2c 20 26 62 75 66 2c 20 34 29 3b 0a 20 20 20 20  , &buf, 4);.    
1a770 20 20 20 20 69 66 28 20 70 53 65 67 2d 3e 69 4c      if( pSeg->iL
1a780 65 61 66 50 67 6e 6f 3d 3d 70 53 65 67 2d 3e 69  eafPgno==pSeg->i
1a790 54 65 72 6d 4c 65 61 66 50 67 6e 6f 20 0a 20 20  TermLeafPgno .  
1a7a0 20 20 20 20 20 20 20 26 26 20 70 53 65 67 2d 3e         && pSeg->
1a7b0 69 45 6e 64 6f 66 44 6f 63 6c 69 73 74 3c 70 44  iEndofDoclist<pD
1a7c0 61 74 61 2d 3e 73 7a 4c 65 61 66 20 0a 20 20 20  ata->szLeaf .   
1a7d0 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
1a7e0 20 20 69 6e 74 20 6e 44 69 66 66 20 3d 20 70 44    int nDiff = pD
1a7f0 61 74 61 2d 3e 73 7a 4c 65 61 66 20 2d 20 70 53  ata->szLeaf - pS
1a800 65 67 2d 3e 69 45 6e 64 6f 66 44 6f 63 6c 69 73  eg->iEndofDoclis
1a810 74 3b 0a 20 20 20 20 20 20 20 20 20 20 66 74 73  t;.          fts
1a820 35 42 75 66 66 65 72 41 70 70 65 6e 64 56 61 72  5BufferAppendVar
1a830 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26 62 75 66  int(&p->rc, &buf
1a840 2c 20 62 75 66 2e 6e 20 2d 20 31 20 2d 20 6e 44  , buf.n - 1 - nD
1a850 69 66 66 20 2d 20 34 29 3b 0a 20 20 20 20 20 20  iff - 4);.      
1a860 20 20 20 20 66 74 73 35 42 75 66 66 65 72 41 70      fts5BufferAp
1a870 70 65 6e 64 42 6c 6f 62 28 26 70 2d 3e 72 63 2c  pendBlob(&p->rc,
1a880 20 26 62 75 66 2c 20 0a 20 20 20 20 20 20 20 20   &buf, .        
1a890 20 20 20 20 20 20 70 44 61 74 61 2d 3e 6e 6e 20        pData->nn 
1a8a0 2d 20 70 53 65 67 2d 3e 69 50 67 69 64 78 4f 66  - pSeg->iPgidxOf
1a8b0 66 2c 20 26 70 44 61 74 61 2d 3e 70 5b 70 53 65  f, &pData->p[pSe
1a8c0 67 2d 3e 69 50 67 69 64 78 4f 66 66 5d 0a 20 20  g->iPgidxOff].  
1a8d0 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20          );.     
1a8e0 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 66 74     }..        ft
1a8f0 73 35 44 61 74 61 52 65 6c 65 61 73 65 28 70 44  s5DataRelease(pD
1a900 61 74 61 29 3b 0a 20 20 20 20 20 20 20 20 70 53  ata);.        pS
1a910 65 67 2d 3e 70 53 65 67 2d 3e 70 67 6e 6f 46 69  eg->pSeg->pgnoFi
1a920 72 73 74 20 3d 20 70 53 65 67 2d 3e 69 54 65 72  rst = pSeg->iTer
1a930 6d 4c 65 61 66 50 67 6e 6f 3b 0a 20 20 20 20 20  mLeafPgno;.     
1a940 20 20 20 66 74 73 35 44 61 74 61 44 65 6c 65 74     fts5DataDelet
1a950 65 28 70 2c 20 46 54 53 35 5f 53 45 47 4d 45 4e  e(p, FTS5_SEGMEN
1a960 54 5f 52 4f 57 49 44 28 69 49 64 2c 20 31 29 2c  T_ROWID(iId, 1),
1a970 20 69 4c 65 61 66 52 6f 77 69 64 29 3b 0a 20 20   iLeafRowid);.  
1a980 20 20 20 20 20 20 66 74 73 35 44 61 74 61 57 72        fts5DataWr
1a990 69 74 65 28 70 2c 20 69 4c 65 61 66 52 6f 77 69  ite(p, iLeafRowi
1a9a0 64 2c 20 62 75 66 2e 70 2c 20 62 75 66 2e 6e 29  d, buf.p, buf.n)
1a9b0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
1a9c0 20 20 7d 0a 20 20 66 74 73 35 42 75 66 66 65 72    }.  fts5Buffer
1a9d0 46 72 65 65 28 26 62 75 66 29 3b 0a 7d 0a 0a 73  Free(&buf);.}..s
1a9e0 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 4d  tatic void fts5M
1a9f0 65 72 67 65 43 68 75 6e 6b 43 61 6c 6c 62 61 63  ergeChunkCallbac
1aa00 6b 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a  k(.  Fts5Index *
1aa10 70 2c 20 0a 20 20 76 6f 69 64 20 2a 70 43 74 78  p, .  void *pCtx
1aa20 2c 20 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 70  , .  const u8 *p
1aa30 43 68 75 6e 6b 2c 20 69 6e 74 20 6e 43 68 75 6e  Chunk, int nChun
1aa40 6b 0a 29 7b 0a 20 20 46 74 73 35 53 65 67 57 72  k.){.  Fts5SegWr
1aa50 69 74 65 72 20 2a 70 57 72 69 74 65 72 20 3d 20  iter *pWriter = 
1aa60 28 46 74 73 35 53 65 67 57 72 69 74 65 72 2a 29  (Fts5SegWriter*)
1aa70 70 43 74 78 3b 0a 20 20 66 74 73 35 57 72 69 74  pCtx;.  fts5Writ
1aa80 65 41 70 70 65 6e 64 50 6f 73 6c 69 73 74 44 61  eAppendPoslistDa
1aa90 74 61 28 70 2c 20 70 57 72 69 74 65 72 2c 20 70  ta(p, pWriter, p
1aaa0 43 68 75 6e 6b 2c 20 6e 43 68 75 6e 6b 29 3b 0a  Chunk, nChunk);.
1aab0 7d 0a 0a 2f 2a 0a 2a 2a 0a 2a 2f 0a 73 74 61 74  }../*.**.*/.stat
1aac0 69 63 20 76 6f 69 64 20 66 74 73 35 49 6e 64 65  ic void fts5Inde
1aad0 78 4d 65 72 67 65 4c 65 76 65 6c 28 0a 20 20 46  xMergeLevel(.  F
1aae0 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20  ts5Index *p,    
1aaf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1ab00 2a 20 46 54 53 35 20 62 61 63 6b 65 6e 64 20 6f  * FTS5 backend o
1ab10 62 6a 65 63 74 20 2a 2f 0a 20 20 46 74 73 35 53  bject */.  Fts5S
1ab20 74 72 75 63 74 75 72 65 20 2a 2a 70 70 53 74 72  tructure **ppStr
1ab30 75 63 74 2c 20 20 20 20 20 20 20 2f 2a 20 49 4e  uct,       /* IN
1ab40 2f 4f 55 54 3a 20 53 74 75 63 74 75 72 65 20 6f  /OUT: Stucture o
1ab50 66 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74  f index */.  int
1ab60 20 69 4c 76 6c 2c 20 20 20 20 20 20 20 20 20 20   iLvl,          
1ab70 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1ab80 4c 65 76 65 6c 20 74 6f 20 72 65 61 64 20 69 6e  Level to read in
1ab90 70 75 74 20 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e  put from */.  in
1aba0 74 20 2a 70 6e 52 65 6d 20 20 20 20 20 20 20 20  t *pnRem        
1abb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1abc0 20 57 72 69 74 65 20 75 70 20 74 6f 20 74 68 69   Write up to thi
1abd0 73 20 6d 61 6e 79 20 6f 75 74 70 75 74 20 6c 65  s many output le
1abe0 61 76 65 73 20 2a 2f 0a 29 7b 0a 20 20 46 74 73  aves */.){.  Fts
1abf0 35 53 74 72 75 63 74 75 72 65 20 2a 70 53 74 72  5Structure *pStr
1ac00 75 63 74 20 3d 20 2a 70 70 53 74 72 75 63 74 3b  uct = *ppStruct;
1ac10 0a 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65  .  Fts5Structure
1ac20 4c 65 76 65 6c 20 2a 70 4c 76 6c 20 3d 20 26 70  Level *pLvl = &p
1ac30 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69  Struct->aLevel[i
1ac40 4c 76 6c 5d 3b 0a 20 20 46 74 73 35 53 74 72 75  Lvl];.  Fts5Stru
1ac50 63 74 75 72 65 4c 65 76 65 6c 20 2a 70 4c 76 6c  ctureLevel *pLvl
1ac60 4f 75 74 3b 0a 20 20 46 74 73 35 49 6e 64 65 78  Out;.  Fts5Index
1ac70 49 74 65 72 20 2a 70 49 74 65 72 20 3d 20 30 3b  Iter *pIter = 0;
1ac80 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74         /* Iterat
1ac90 6f 72 20 74 6f 20 72 65 61 64 20 69 6e 70 75 74  or to read input
1aca0 20 64 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20 6e   data */.  int n
1acb0 52 65 6d 20 3d 20 70 6e 52 65 6d 20 3f 20 2a 70  Rem = pnRem ? *p
1acc0 6e 52 65 6d 20 3a 20 30 3b 20 20 2f 2a 20 4f 75  nRem : 0;  /* Ou
1acd0 74 70 75 74 20 6c 65 61 66 20 70 61 67 65 73 20  tput leaf pages 
1ace0 6c 65 66 74 20 74 6f 20 77 72 69 74 65 20 2a 2f  left to write */
1acf0 0a 20 20 69 6e 74 20 6e 49 6e 70 75 74 3b 20 20  .  int nInput;  
1ad00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ad10 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
1ad20 69 6e 70 75 74 20 73 65 67 6d 65 6e 74 73 20 2a  input segments *
1ad30 2f 0a 20 20 46 74 73 35 53 65 67 57 72 69 74 65  /.  Fts5SegWrite
1ad40 72 20 77 72 69 74 65 72 3b 20 20 20 20 20 20 20  r writer;       
1ad50 20 20 20 20 2f 2a 20 57 72 69 74 65 72 20 6f 62      /* Writer ob
1ad60 6a 65 63 74 20 2a 2f 0a 20 20 46 74 73 35 53 74  ject */.  Fts5St
1ad70 72 75 63 74 75 72 65 53 65 67 6d 65 6e 74 20 2a  ructureSegment *
1ad80 70 53 65 67 3b 20 20 20 20 20 2f 2a 20 4f 75 74  pSeg;     /* Out
1ad90 70 75 74 20 73 65 67 6d 65 6e 74 20 2a 2f 0a 20  put segment */. 
1ada0 20 46 74 73 35 42 75 66 66 65 72 20 74 65 72 6d   Fts5Buffer term
1adb0 3b 0a 20 20 69 6e 74 20 62 4f 6c 64 65 73 74 3b  ;.  int bOldest;
1adc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1add0 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74      /* True if t
1ade0 68 65 20 6f 75 74 70 75 74 20 73 65 67 6d 65 6e  he output segmen
1adf0 74 20 69 73 20 74 68 65 20 6f 6c 64 65 73 74 20  t is the oldest 
1ae00 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 69 4c  */..  assert( iL
1ae10 76 6c 3c 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76  vl<pStruct->nLev
1ae20 65 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  el );.  assert( 
1ae30 70 4c 76 6c 2d 3e 6e 4d 65 72 67 65 3c 3d 70 4c  pLvl->nMerge<=pL
1ae40 76 6c 2d 3e 6e 53 65 67 20 29 3b 0a 0a 20 20 6d  vl->nSeg );..  m
1ae50 65 6d 73 65 74 28 26 77 72 69 74 65 72 2c 20 30  emset(&writer, 0
1ae60 2c 20 73 69 7a 65 6f 66 28 46 74 73 35 53 65 67  , sizeof(Fts5Seg
1ae70 57 72 69 74 65 72 29 29 3b 0a 20 20 6d 65 6d 73  Writer));.  mems
1ae80 65 74 28 26 74 65 72 6d 2c 20 30 2c 20 73 69 7a  et(&term, 0, siz
1ae90 65 6f 66 28 46 74 73 35 42 75 66 66 65 72 29 29  eof(Fts5Buffer))
1aea0 3b 0a 20 20 69 66 28 20 70 4c 76 6c 2d 3e 6e 4d  ;.  if( pLvl->nM
1aeb0 65 72 67 65 20 29 7b 0a 20 20 20 20 70 4c 76 6c  erge ){.    pLvl
1aec0 4f 75 74 20 3d 20 26 70 53 74 72 75 63 74 2d 3e  Out = &pStruct->
1aed0 61 4c 65 76 65 6c 5b 69 4c 76 6c 2b 31 5d 3b 0a  aLevel[iLvl+1];.
1aee0 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 76 6c      assert( pLvl
1aef0 4f 75 74 2d 3e 6e 53 65 67 3e 30 20 29 3b 0a 20  Out->nSeg>0 );. 
1af00 20 20 20 6e 49 6e 70 75 74 20 3d 20 70 4c 76 6c     nInput = pLvl
1af10 2d 3e 6e 4d 65 72 67 65 3b 0a 20 20 20 20 70 53  ->nMerge;.    pS
1af20 65 67 20 3d 20 26 70 4c 76 6c 4f 75 74 2d 3e 61  eg = &pLvlOut->a
1af30 53 65 67 5b 70 4c 76 6c 4f 75 74 2d 3e 6e 53 65  Seg[pLvlOut->nSe
1af40 67 2d 31 5d 3b 0a 0a 20 20 20 20 66 74 73 35 57  g-1];..    fts5W
1af50 72 69 74 65 49 6e 69 74 28 70 2c 20 26 77 72 69  riteInit(p, &wri
1af60 74 65 72 2c 20 70 53 65 67 2d 3e 69 53 65 67 69  ter, pSeg->iSegi
1af70 64 29 3b 0a 20 20 20 20 77 72 69 74 65 72 2e 77  d);.    writer.w
1af80 72 69 74 65 72 2e 70 67 6e 6f 20 3d 20 70 53 65  riter.pgno = pSe
1af90 67 2d 3e 70 67 6e 6f 4c 61 73 74 2b 31 3b 0a 20  g->pgnoLast+1;. 
1afa0 20 20 20 77 72 69 74 65 72 2e 69 42 74 50 61 67     writer.iBtPag
1afb0 65 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a  e = 0;.  }else{.
1afc0 20 20 20 20 69 6e 74 20 69 53 65 67 69 64 20 3d      int iSegid =
1afd0 20 66 74 73 35 41 6c 6c 6f 63 61 74 65 53 65 67   fts5AllocateSeg
1afe0 69 64 28 70 2c 20 70 53 74 72 75 63 74 29 3b 0a  id(p, pStruct);.
1aff0 0a 20 20 20 20 2f 2a 20 45 78 74 65 6e 64 20 74  .    /* Extend t
1b000 68 65 20 46 74 73 35 53 74 72 75 63 74 75 72 65  he Fts5Structure
1b010 20 6f 62 6a 65 63 74 20 61 73 20 72 65 71 75 69   object as requi
1b020 72 65 64 20 74 6f 20 65 6e 73 75 72 65 20 74 68  red to ensure th
1b030 65 20 6f 75 74 70 75 74 0a 20 20 20 20 2a 2a 20  e output.    ** 
1b040 73 65 67 6d 65 6e 74 20 65 78 69 73 74 73 2e 20  segment exists. 
1b050 2a 2f 0a 20 20 20 20 69 66 28 20 69 4c 76 6c 3d  */.    if( iLvl=
1b060 3d 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c  =pStruct->nLevel
1b070 2d 31 20 29 7b 0a 20 20 20 20 20 20 66 74 73 35  -1 ){.      fts5
1b080 53 74 72 75 63 74 75 72 65 41 64 64 4c 65 76 65  StructureAddLeve
1b090 6c 28 26 70 2d 3e 72 63 2c 20 70 70 53 74 72 75  l(&p->rc, ppStru
1b0a0 63 74 29 3b 0a 20 20 20 20 20 20 70 53 74 72 75  ct);.      pStru
1b0b0 63 74 20 3d 20 2a 70 70 53 74 72 75 63 74 3b 0a  ct = *ppStruct;.
1b0c0 20 20 20 20 7d 0a 20 20 20 20 66 74 73 35 53 74      }.    fts5St
1b0d0 72 75 63 74 75 72 65 45 78 74 65 6e 64 4c 65 76  ructureExtendLev
1b0e0 65 6c 28 26 70 2d 3e 72 63 2c 20 70 53 74 72 75  el(&p->rc, pStru
1b0f0 63 74 2c 20 69 4c 76 6c 2b 31 2c 20 31 2c 20 30  ct, iLvl+1, 1, 0
1b100 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 72 63  );.    if( p->rc
1b110 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 70   ) return;.    p
1b120 4c 76 6c 20 3d 20 26 70 53 74 72 75 63 74 2d 3e  Lvl = &pStruct->
1b130 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d 3b 0a 20 20  aLevel[iLvl];.  
1b140 20 20 70 4c 76 6c 4f 75 74 20 3d 20 26 70 53 74    pLvlOut = &pSt
1b150 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76  ruct->aLevel[iLv
1b160 6c 2b 31 5d 3b 0a 0a 20 20 20 20 66 74 73 35 57  l+1];..    fts5W
1b170 72 69 74 65 49 6e 69 74 28 70 2c 20 26 77 72 69  riteInit(p, &wri
1b180 74 65 72 2c 20 69 53 65 67 69 64 29 3b 0a 0a 20  ter, iSegid);.. 
1b190 20 20 20 2f 2a 20 41 64 64 20 74 68 65 20 6e 65     /* Add the ne
1b1a0 77 20 73 65 67 6d 65 6e 74 20 74 6f 20 74 68 65  w segment to the
1b1b0 20 6f 75 74 70 75 74 20 6c 65 76 65 6c 20 2a 2f   output level */
1b1c0 0a 20 20 20 20 70 53 65 67 20 3d 20 26 70 4c 76  .    pSeg = &pLv
1b1d0 6c 4f 75 74 2d 3e 61 53 65 67 5b 70 4c 76 6c 4f  lOut->aSeg[pLvlO
1b1e0 75 74 2d 3e 6e 53 65 67 5d 3b 0a 20 20 20 20 70  ut->nSeg];.    p
1b1f0 4c 76 6c 4f 75 74 2d 3e 6e 53 65 67 2b 2b 3b 0a  LvlOut->nSeg++;.
1b200 20 20 20 20 70 53 65 67 2d 3e 70 67 6e 6f 46 69      pSeg->pgnoFi
1b210 72 73 74 20 3d 20 31 3b 0a 20 20 20 20 70 53 65  rst = 1;.    pSe
1b220 67 2d 3e 69 53 65 67 69 64 20 3d 20 69 53 65 67  g->iSegid = iSeg
1b230 69 64 3b 0a 20 20 20 20 70 53 74 72 75 63 74 2d  id;.    pStruct-
1b240 3e 6e 53 65 67 6d 65 6e 74 2b 2b 3b 0a 0a 20 20  >nSegment++;..  
1b250 20 20 2f 2a 20 52 65 61 64 20 69 6e 70 75 74 20    /* Read input 
1b260 66 72 6f 6d 20 61 6c 6c 20 73 65 67 6d 65 6e 74  from all segment
1b270 73 20 69 6e 20 74 68 65 20 69 6e 70 75 74 20 6c  s in the input l
1b280 65 76 65 6c 20 2a 2f 0a 20 20 20 20 6e 49 6e 70  evel */.    nInp
1b290 75 74 20 3d 20 70 4c 76 6c 2d 3e 6e 53 65 67 3b  ut = pLvl->nSeg;
1b2a0 0a 20 20 7d 0a 20 20 62 4f 6c 64 65 73 74 20 3d  .  }.  bOldest =
1b2b0 20 28 70 4c 76 6c 4f 75 74 2d 3e 6e 53 65 67 3d   (pLvlOut->nSeg=
1b2c0 3d 31 20 26 26 20 70 53 74 72 75 63 74 2d 3e 6e  =1 && pStruct->n
1b2d0 4c 65 76 65 6c 3d 3d 69 4c 76 6c 2b 32 29 3b 0a  Level==iLvl+2);.
1b2e0 0a 20 20 61 73 73 65 72 74 28 20 69 4c 76 6c 3e  .  assert( iLvl>
1b2f0 3d 30 20 29 3b 0a 20 20 66 6f 72 28 66 74 73 35  =0 );.  for(fts5
1b300 4d 75 6c 74 69 49 74 65 72 4e 65 77 28 70 2c 20  MultiIterNew(p, 
1b310 70 53 74 72 75 63 74 2c 20 30 2c 20 30 2c 20 30  pStruct, 0, 0, 0
1b320 2c 20 30 2c 20 69 4c 76 6c 2c 20 6e 49 6e 70 75  , 0, iLvl, nInpu
1b330 74 2c 20 26 70 49 74 65 72 29 3b 0a 20 20 20 20  t, &pIter);.    
1b340 20 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 45    fts5MultiIterE
1b350 6f 66 28 70 2c 20 70 49 74 65 72 29 3d 3d 30 3b  of(p, pIter)==0;
1b360 0a 20 20 20 20 20 20 66 74 73 35 4d 75 6c 74 69  .      fts5Multi
1b370 49 74 65 72 4e 65 78 74 28 70 2c 20 70 49 74 65  IterNext(p, pIte
1b380 72 2c 20 30 2c 20 30 29 0a 20 20 29 7b 0a 20 20  r, 0, 0).  ){.  
1b390 20 20 46 74 73 35 53 65 67 49 74 65 72 20 2a 70    Fts5SegIter *p
1b3a0 53 65 67 49 74 65 72 20 3d 20 26 70 49 74 65 72  SegIter = &pIter
1b3b0 2d 3e 61 53 65 67 5b 20 70 49 74 65 72 2d 3e 61  ->aSeg[ pIter->a
1b3c0 46 69 72 73 74 5b 31 5d 2e 69 46 69 72 73 74 20  First[1].iFirst 
1b3d0 5d 3b 0a 20 20 20 20 69 6e 74 20 6e 50 6f 73 3b  ];.    int nPos;
1b3e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b3f0 20 20 20 20 20 2f 2a 20 70 6f 73 69 74 69 6f 6e       /* position
1b400 2d 6c 69 73 74 20 73 69 7a 65 20 66 69 65 6c 64  -list size field
1b410 20 76 61 6c 75 65 20 2a 2f 0a 20 20 20 20 69 6e   value */.    in
1b420 74 20 6e 54 65 72 6d 3b 0a 20 20 20 20 63 6f 6e  t nTerm;.    con
1b430 73 74 20 75 38 20 2a 70 54 65 72 6d 3b 0a 0a 20  st u8 *pTerm;.. 
1b440 20 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20     /* Check for 
1b450 6b 65 79 20 61 6e 6e 69 68 69 6c 61 74 69 6f 6e  key annihilation
1b460 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 53 65  . */.    if( pSe
1b470 67 49 74 65 72 2d 3e 6e 50 6f 73 3d 3d 30 20 26  gIter->nPos==0 &
1b480 26 20 28 62 4f 6c 64 65 73 74 20 7c 7c 20 70 53  & (bOldest || pS
1b490 65 67 49 74 65 72 2d 3e 62 44 65 6c 3d 3d 30 29  egIter->bDel==0)
1b4a0 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 0a 20 20   ) continue;..  
1b4b0 20 20 70 54 65 72 6d 20 3d 20 66 74 73 35 4d 75    pTerm = fts5Mu
1b4c0 6c 74 69 49 74 65 72 54 65 72 6d 28 70 49 74 65  ltiIterTerm(pIte
1b4d0 72 2c 20 26 6e 54 65 72 6d 29 3b 0a 20 20 20 20  r, &nTerm);.    
1b4e0 69 66 28 20 6e 54 65 72 6d 21 3d 74 65 72 6d 2e  if( nTerm!=term.
1b4f0 6e 20 7c 7c 20 6d 65 6d 63 6d 70 28 70 54 65 72  n || memcmp(pTer
1b500 6d 2c 20 74 65 72 6d 2e 70 2c 20 6e 54 65 72 6d  m, term.p, nTerm
1b510 29 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  ) ){.      if( p
1b520 6e 52 65 6d 20 26 26 20 77 72 69 74 65 72 2e 6e  nRem && writer.n
1b530 4c 65 61 66 57 72 69 74 74 65 6e 3e 6e 52 65 6d  LeafWritten>nRem
1b540 20 29 7b 0a 20 20 20 20 20 20 20 20 62 72 65 61   ){.        brea
1b550 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  k;.      }..    
1b560 20 20 2f 2a 20 54 68 69 73 20 69 73 20 61 20 6e    /* This is a n
1b570 65 77 20 74 65 72 6d 2e 20 41 70 70 65 6e 64 20  ew term. Append 
1b580 61 20 74 65 72 6d 20 74 6f 20 74 68 65 20 6f 75  a term to the ou
1b590 74 70 75 74 20 73 65 67 6d 65 6e 74 2e 20 2a 2f  tput segment. */
1b5a0 0a 20 20 20 20 20 20 66 74 73 35 57 72 69 74 65  .      fts5Write
1b5b0 41 70 70 65 6e 64 54 65 72 6d 28 70 2c 20 26 77  AppendTerm(p, &w
1b5c0 72 69 74 65 72 2c 20 6e 54 65 72 6d 2c 20 70 54  riter, nTerm, pT
1b5d0 65 72 6d 29 3b 0a 20 20 20 20 20 20 66 74 73 35  erm);.      fts5
1b5e0 42 75 66 66 65 72 53 65 74 28 26 70 2d 3e 72 63  BufferSet(&p->rc
1b5f0 2c 20 26 74 65 72 6d 2c 20 6e 54 65 72 6d 2c 20  , &term, nTerm, 
1b600 70 54 65 72 6d 29 3b 0a 20 20 20 20 7d 0a 0a 20  pTerm);.    }.. 
1b610 20 20 20 2f 2a 20 41 70 70 65 6e 64 20 74 68 65     /* Append the
1b620 20 72 6f 77 69 64 20 74 6f 20 74 68 65 20 6f 75   rowid to the ou
1b630 74 70 75 74 20 2a 2f 0a 20 20 20 20 2f 2a 20 57  tput */.    /* W
1b640 52 49 54 45 50 4f 53 4c 49 53 54 53 49 5a 45 20  RITEPOSLISTSIZE 
1b650 2a 2f 0a 20 20 20 20 6e 50 6f 73 20 3d 20 70 53  */.    nPos = pS
1b660 65 67 49 74 65 72 2d 3e 6e 50 6f 73 2a 32 20 2b  egIter->nPos*2 +
1b670 20 70 53 65 67 49 74 65 72 2d 3e 62 44 65 6c 3b   pSegIter->bDel;
1b680 0a 20 20 20 20 66 74 73 35 57 72 69 74 65 41 70  .    fts5WriteAp
1b690 70 65 6e 64 52 6f 77 69 64 28 70 2c 20 26 77 72  pendRowid(p, &wr
1b6a0 69 74 65 72 2c 20 66 74 73 35 4d 75 6c 74 69 49  iter, fts5MultiI
1b6b0 74 65 72 52 6f 77 69 64 28 70 49 74 65 72 29 2c  terRowid(pIter),
1b6c0 20 6e 50 6f 73 29 3b 0a 0a 20 20 20 20 2f 2a 20   nPos);..    /* 
1b6d0 41 70 70 65 6e 64 20 74 68 65 20 70 6f 73 69 74  Append the posit
1b6e0 69 6f 6e 2d 6c 69 73 74 20 64 61 74 61 20 74 6f  ion-list data to
1b6f0 20 74 68 65 20 6f 75 74 70 75 74 20 2a 2f 0a 20   the output */. 
1b700 20 20 20 66 74 73 35 43 68 75 6e 6b 49 74 65 72     fts5ChunkIter
1b710 61 74 65 28 70 2c 20 70 53 65 67 49 74 65 72 2c  ate(p, pSegIter,
1b720 20 28 76 6f 69 64 2a 29 26 77 72 69 74 65 72 2c   (void*)&writer,
1b730 20 66 74 73 35 4d 65 72 67 65 43 68 75 6e 6b 43   fts5MergeChunkC
1b740 61 6c 6c 62 61 63 6b 29 3b 0a 20 20 7d 0a 0a 20  allback);.  }.. 
1b750 20 2f 2a 20 46 6c 75 73 68 20 74 68 65 20 6c 61   /* Flush the la
1b760 73 74 20 6c 65 61 66 20 70 61 67 65 20 74 6f 20  st leaf page to 
1b770 64 69 73 6b 2e 20 53 65 74 20 74 68 65 20 6f 75  disk. Set the ou
1b780 74 70 75 74 20 73 65 67 6d 65 6e 74 20 62 2d 74  tput segment b-t
1b790 72 65 65 20 68 65 69 67 68 74 0a 20 20 2a 2a 20  ree height.  ** 
1b7a0 61 6e 64 20 6c 61 73 74 20 6c 65 61 66 20 70 61  and last leaf pa
1b7b0 67 65 20 6e 75 6d 62 65 72 20 61 74 20 74 68 65  ge number at the
1b7c0 20 73 61 6d 65 20 74 69 6d 65 2e 20 20 2a 2f 0a   same time.  */.
1b7d0 20 20 66 74 73 35 57 72 69 74 65 46 69 6e 69 73    fts5WriteFinis
1b7e0 68 28 70 2c 20 26 77 72 69 74 65 72 2c 20 26 70  h(p, &writer, &p
1b7f0 53 65 67 2d 3e 70 67 6e 6f 4c 61 73 74 29 3b 0a  Seg->pgnoLast);.
1b800 0a 20 20 69 66 28 20 66 74 73 35 4d 75 6c 74 69  .  if( fts5Multi
1b810 49 74 65 72 45 6f 66 28 70 2c 20 70 49 74 65 72  IterEof(p, pIter
1b820 29 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  ) ){.    int i;.
1b830 0a 20 20 20 20 2f 2a 20 52 65 6d 6f 76 65 20 74  .    /* Remove t
1b840 68 65 20 72 65 64 75 6e 64 61 6e 74 20 73 65 67  he redundant seg
1b850 6d 65 6e 74 73 20 66 72 6f 6d 20 74 68 65 20 25  ments from the %
1b860 5f 64 61 74 61 20 74 61 62 6c 65 20 2a 2f 0a 20  _data table */. 
1b870 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 49     for(i=0; i<nI
1b880 6e 70 75 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nput; i++){.    
1b890 20 20 66 74 73 35 44 61 74 61 52 65 6d 6f 76 65    fts5DataRemove
1b8a0 53 65 67 6d 65 6e 74 28 70 2c 20 70 4c 76 6c 2d  Segment(p, pLvl-
1b8b0 3e 61 53 65 67 5b 69 5d 2e 69 53 65 67 69 64 29  >aSeg[i].iSegid)
1b8c0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
1b8d0 52 65 6d 6f 76 65 20 74 68 65 20 72 65 64 75 6e  Remove the redun
1b8e0 64 61 6e 74 20 73 65 67 6d 65 6e 74 73 20 66 72  dant segments fr
1b8f0 6f 6d 20 74 68 65 20 69 6e 70 75 74 20 6c 65 76  om the input lev
1b900 65 6c 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 4c  el */.    if( pL
1b910 76 6c 2d 3e 6e 53 65 67 21 3d 6e 49 6e 70 75 74  vl->nSeg!=nInput
1b920 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 4d   ){.      int nM
1b930 6f 76 65 20 3d 20 28 70 4c 76 6c 2d 3e 6e 53 65  ove = (pLvl->nSe
1b940 67 20 2d 20 6e 49 6e 70 75 74 29 20 2a 20 73 69  g - nInput) * si
1b950 7a 65 6f 66 28 46 74 73 35 53 74 72 75 63 74 75  zeof(Fts5Structu
1b960 72 65 53 65 67 6d 65 6e 74 29 3b 0a 20 20 20 20  reSegment);.    
1b970 20 20 6d 65 6d 6d 6f 76 65 28 70 4c 76 6c 2d 3e    memmove(pLvl->
1b980 61 53 65 67 2c 20 26 70 4c 76 6c 2d 3e 61 53 65  aSeg, &pLvl->aSe
1b990 67 5b 6e 49 6e 70 75 74 5d 2c 20 6e 4d 6f 76 65  g[nInput], nMove
1b9a0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 53 74  );.    }.    pSt
1b9b0 72 75 63 74 2d 3e 6e 53 65 67 6d 65 6e 74 20 2d  ruct->nSegment -
1b9c0 3d 20 6e 49 6e 70 75 74 3b 0a 20 20 20 20 70 4c  = nInput;.    pL
1b9d0 76 6c 2d 3e 6e 53 65 67 20 2d 3d 20 6e 49 6e 70  vl->nSeg -= nInp
1b9e0 75 74 3b 0a 20 20 20 20 70 4c 76 6c 2d 3e 6e 4d  ut;.    pLvl->nM
1b9f0 65 72 67 65 20 3d 20 30 3b 0a 20 20 20 20 69 66  erge = 0;.    if
1ba00 28 20 70 53 65 67 2d 3e 70 67 6e 6f 4c 61 73 74  ( pSeg->pgnoLast
1ba10 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 4c 76  ==0 ){.      pLv
1ba20 6c 4f 75 74 2d 3e 6e 53 65 67 2d 2d 3b 0a 20 20  lOut->nSeg--;.  
1ba30 20 20 20 20 70 53 74 72 75 63 74 2d 3e 6e 53 65      pStruct->nSe
1ba40 67 6d 65 6e 74 2d 2d 3b 0a 20 20 20 20 7d 0a 20  gment--;.    }. 
1ba50 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65   }else{.    asse
1ba60 72 74 28 20 70 53 65 67 2d 3e 70 67 6e 6f 4c 61  rt( pSeg->pgnoLa
1ba70 73 74 3e 30 20 29 3b 0a 20 20 20 20 66 74 73 35  st>0 );.    fts5
1ba80 54 72 69 6d 53 65 67 6d 65 6e 74 73 28 70 2c 20  TrimSegments(p, 
1ba90 70 49 74 65 72 29 3b 0a 20 20 20 20 70 4c 76 6c  pIter);.    pLvl
1baa0 2d 3e 6e 4d 65 72 67 65 20 3d 20 6e 49 6e 70 75  ->nMerge = nInpu
1bab0 74 3b 0a 20 20 7d 0a 0a 20 20 66 74 73 35 4d 75  t;.  }..  fts5Mu
1bac0 6c 74 69 49 74 65 72 46 72 65 65 28 70 2c 20 70  ltiIterFree(p, p
1bad0 49 74 65 72 29 3b 0a 20 20 66 74 73 35 42 75 66  Iter);.  fts5Buf
1bae0 66 65 72 46 72 65 65 28 26 74 65 72 6d 29 3b 0a  ferFree(&term);.
1baf0 20 20 69 66 28 20 70 6e 52 65 6d 20 29 20 2a 70    if( pnRem ) *p
1bb00 6e 52 65 6d 20 2d 3d 20 77 72 69 74 65 72 2e 6e  nRem -= writer.n
1bb10 4c 65 61 66 57 72 69 74 74 65 6e 3b 0a 7d 0a 0a  LeafWritten;.}..
1bb20 2f 2a 0a 2a 2a 20 44 6f 20 75 70 20 74 6f 20 6e  /*.** Do up to n
1bb30 50 67 20 70 61 67 65 73 20 6f 66 20 61 75 74 6f  Pg pages of auto
1bb40 6d 65 72 67 65 20 77 6f 72 6b 20 6f 6e 20 74 68  merge work on th
1bb50 65 20 69 6e 64 65 78 2e 0a 2a 2f 0a 73 74 61 74  e index..*/.stat
1bb60 69 63 20 76 6f 69 64 20 66 74 73 35 49 6e 64 65  ic void fts5Inde
1bb70 78 4d 65 72 67 65 28 0a 20 20 46 74 73 35 49 6e  xMerge(.  Fts5In
1bb80 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20 20  dex *p,         
1bb90 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53            /* FTS
1bba0 35 20 62 61 63 6b 65 6e 64 20 6f 62 6a 65 63 74  5 backend object
1bbb0 20 2a 2f 0a 20 20 46 74 73 35 53 74 72 75 63 74   */.  Fts5Struct
1bbc0 75 72 65 20 2a 2a 70 70 53 74 72 75 63 74 2c 20  ure **ppStruct, 
1bbd0 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a        /* IN/OUT:
1bbe0 20 43 75 72 72 65 6e 74 20 73 74 72 75 63 74 75   Current structu
1bbf0 72 65 20 6f 66 20 69 6e 64 65 78 20 2a 2f 0a 20  re of index */. 
1bc00 20 69 6e 74 20 6e 50 67 20 20 20 20 20 20 20 20   int nPg        
1bc10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bc20 20 2f 2a 20 50 61 67 65 73 20 6f 66 20 77 6f 72   /* Pages of wor
1bc30 6b 20 74 6f 20 64 6f 20 2a 2f 0a 29 7b 0a 20 20  k to do */.){.  
1bc40 69 6e 74 20 6e 52 65 6d 20 3d 20 6e 50 67 3b 0a  int nRem = nPg;.
1bc50 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65 20    Fts5Structure 
1bc60 2a 70 53 74 72 75 63 74 20 3d 20 2a 70 70 53 74  *pStruct = *ppSt
1bc70 72 75 63 74 3b 0a 20 20 77 68 69 6c 65 28 20 6e  ruct;.  while( n
1bc80 52 65 6d 3e 30 20 26 26 20 70 2d 3e 72 63 3d 3d  Rem>0 && p->rc==
1bc90 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1bca0 20 69 6e 74 20 69 4c 76 6c 3b 20 20 20 20 20 20   int iLvl;      
1bcb0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1bcc0 54 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f 75  To iterate throu
1bcd0 67 68 20 6c 65 76 65 6c 73 20 2a 2f 0a 20 20 20  gh levels */.   
1bce0 20 69 6e 74 20 69 42 65 73 74 4c 76 6c 20 3d 20   int iBestLvl = 
1bcf0 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  0;           /* 
1bd00 4c 65 76 65 6c 20 6f 66 66 65 72 69 6e 67 20 74  Level offering t
1bd10 68 65 20 6d 6f 73 74 20 69 6e 70 75 74 20 73 65  he most input se
1bd20 67 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20 69 6e  gments */.    in
1bd30 74 20 6e 42 65 73 74 20 3d 20 30 3b 20 20 20 20  t nBest = 0;    
1bd40 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
1bd50 62 65 72 20 6f 66 20 69 6e 70 75 74 20 73 65 67  ber of input seg
1bd60 6d 65 6e 74 73 20 6f 6e 20 62 65 73 74 20 6c 65  ments on best le
1bd70 76 65 6c 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 53  vel */..    /* S
1bd80 65 74 20 69 42 65 73 74 4c 76 6c 20 74 6f 20 74  et iBestLvl to t
1bd90 68 65 20 6c 65 76 65 6c 20 74 6f 20 72 65 61 64  he level to read
1bda0 20 69 6e 70 75 74 20 73 65 67 6d 65 6e 74 73 20   input segments 
1bdb0 66 72 6f 6d 2e 20 2a 2f 0a 20 20 20 20 61 73 73  from. */.    ass
1bdc0 65 72 74 28 20 70 53 74 72 75 63 74 2d 3e 6e 4c  ert( pStruct->nL
1bdd0 65 76 65 6c 3e 30 20 29 3b 0a 20 20 20 20 66 6f  evel>0 );.    fo
1bde0 72 28 69 4c 76 6c 3d 30 3b 20 69 4c 76 6c 3c 70  r(iLvl=0; iLvl<p
1bdf0 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 3b 20  Struct->nLevel; 
1be00 69 4c 76 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 46  iLvl++){.      F
1be10 74 73 35 53 74 72 75 63 74 75 72 65 4c 65 76 65  ts5StructureLeve
1be20 6c 20 2a 70 4c 76 6c 20 3d 20 26 70 53 74 72 75  l *pLvl = &pStru
1be30 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d  ct->aLevel[iLvl]
1be40 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4c 76 6c  ;.      if( pLvl
1be50 2d 3e 6e 4d 65 72 67 65 20 29 7b 0a 20 20 20 20  ->nMerge ){.    
1be60 20 20 20 20 69 66 28 20 70 4c 76 6c 2d 3e 6e 4d      if( pLvl->nM
1be70 65 72 67 65 3e 6e 42 65 73 74 20 29 7b 0a 20 20  erge>nBest ){.  
1be80 20 20 20 20 20 20 20 20 69 42 65 73 74 4c 76 6c          iBestLvl
1be90 20 3d 20 69 4c 76 6c 3b 0a 20 20 20 20 20 20 20   = iLvl;.       
1bea0 20 20 20 6e 42 65 73 74 20 3d 20 70 4c 76 6c 2d     nBest = pLvl-
1beb0 3e 6e 4d 65 72 67 65 3b 0a 20 20 20 20 20 20 20  >nMerge;.       
1bec0 20 7d 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b   }.        break
1bed0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1bee0 69 66 28 20 70 4c 76 6c 2d 3e 6e 53 65 67 3e 6e  if( pLvl->nSeg>n
1bef0 42 65 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20  Best ){.        
1bf00 6e 42 65 73 74 20 3d 20 70 4c 76 6c 2d 3e 6e 53  nBest = pLvl->nS
1bf10 65 67 3b 0a 20 20 20 20 20 20 20 20 69 42 65 73  eg;.        iBes
1bf20 74 4c 76 6c 20 3d 20 69 4c 76 6c 3b 0a 20 20 20  tLvl = iLvl;.   
1bf30 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
1bf40 2f 2a 20 49 66 20 6e 42 65 73 74 20 69 73 20 73  /* If nBest is s
1bf50 74 69 6c 6c 20 30 2c 20 74 68 65 6e 20 74 68 65  till 0, then the
1bf60 20 69 6e 64 65 78 20 6d 75 73 74 20 62 65 20 65   index must be e
1bf70 6d 70 74 79 2e 20 2a 2f 0a 23 69 66 64 65 66 20  mpty. */.#ifdef 
1bf80 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20  SQLITE_DEBUG.   
1bf90 20 66 6f 72 28 69 4c 76 6c 3d 30 3b 20 6e 42 65   for(iLvl=0; nBe
1bfa0 73 74 3d 3d 30 20 26 26 20 69 4c 76 6c 3c 70 53  st==0 && iLvl<pS
1bfb0 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 3b 20 69  truct->nLevel; i
1bfc0 4c 76 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 61 73  Lvl++){.      as
1bfd0 73 65 72 74 28 20 70 53 74 72 75 63 74 2d 3e 61  sert( pStruct->a
1bfe0 4c 65 76 65 6c 5b 69 4c 76 6c 5d 2e 6e 53 65 67  Level[iLvl].nSeg
1bff0 3d 3d 30 20 29 3b 0a 20 20 20 20 7d 0a 23 65 6e  ==0 );.    }.#en
1c000 64 69 66 0a 0a 20 20 20 20 69 66 28 20 6e 42 65  dif..    if( nBe
1c010 73 74 3c 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e 6e  st<p->pConfig->n
1c020 41 75 74 6f 6d 65 72 67 65 20 0a 20 20 20 20 20  Automerge .     
1c030 20 20 20 26 26 20 70 53 74 72 75 63 74 2d 3e 61     && pStruct->a
1c040 4c 65 76 65 6c 5b 69 42 65 73 74 4c 76 6c 5d 2e  Level[iBestLvl].
1c050 6e 4d 65 72 67 65 3d 3d 30 20 0a 20 20 20 20 20  nMerge==0 .     
1c060 20 29 7b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   ){.      break;
1c070 0a 20 20 20 20 7d 0a 20 20 20 20 66 74 73 35 49  .    }.    fts5I
1c080 6e 64 65 78 4d 65 72 67 65 4c 65 76 65 6c 28 70  ndexMergeLevel(p
1c090 2c 20 26 70 53 74 72 75 63 74 2c 20 69 42 65 73  , &pStruct, iBes
1c0a0 74 4c 76 6c 2c 20 26 6e 52 65 6d 29 3b 0a 20 20  tLvl, &nRem);.  
1c0b0 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c    if( p->rc==SQL
1c0c0 49 54 45 5f 4f 4b 20 26 26 20 70 53 74 72 75 63  ITE_OK && pStruc
1c0d0 74 2d 3e 61 4c 65 76 65 6c 5b 69 42 65 73 74 4c  t->aLevel[iBestL
1c0e0 76 6c 5d 2e 6e 4d 65 72 67 65 3d 3d 30 20 29 7b  vl].nMerge==0 ){
1c0f0 0a 20 20 20 20 20 20 66 74 73 35 53 74 72 75 63  .      fts5Struc
1c100 74 75 72 65 50 72 6f 6d 6f 74 65 28 70 2c 20 69  turePromote(p, i
1c110 42 65 73 74 4c 76 6c 2b 31 2c 20 70 53 74 72 75  BestLvl+1, pStru
1c120 63 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  ct);.    }.  }. 
1c130 20 2a 70 70 53 74 72 75 63 74 20 3d 20 70 53 74   *ppStruct = pSt
1c140 72 75 63 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  ruct;.}../*.** A
1c150 20 74 6f 74 61 6c 20 6f 66 20 6e 4c 65 61 66 20   total of nLeaf 
1c160 6c 65 61 66 20 70 61 67 65 73 20 6f 66 20 64 61  leaf pages of da
1c170 74 61 20 68 61 73 20 6a 75 73 74 20 62 65 65 6e  ta has just been
1c180 20 66 6c 75 73 68 65 64 20 74 6f 20 61 20 6c 65   flushed to a le
1c190 76 65 6c 2d 30 0a 2a 2a 20 73 65 67 6d 65 6e 74  vel-0.** segment
1c1a0 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  . This function 
1c1b0 75 70 64 61 74 65 73 20 74 68 65 20 77 72 69 74  updates the writ
1c1c0 65 2d 63 6f 75 6e 74 65 72 20 61 63 63 6f 72 64  e-counter accord
1c1d0 69 6e 67 6c 79 20 61 6e 64 2c 20 69 66 0a 2a 2a  ingly and, if.**
1c1e0 20 6e 65 63 65 73 73 61 72 79 2c 20 70 65 72 66   necessary, perf
1c1f0 6f 72 6d 73 20 69 6e 63 72 65 6d 65 6e 74 61 6c  orms incremental
1c200 20 6d 65 72 67 65 20 77 6f 72 6b 2e 0a 2a 2a 0a   merge work..**.
1c210 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  ** If an error o
1c220 63 63 75 72 73 2c 20 73 65 74 20 74 68 65 20 46  ccurs, set the F
1c230 74 73 35 49 6e 64 65 78 2e 72 63 20 65 72 72 6f  ts5Index.rc erro
1c240 72 20 63 6f 64 65 2e 20 49 66 20 61 6e 20 65 72  r code. If an er
1c250 72 6f 72 20 68 61 73 20 0a 2a 2a 20 61 6c 72 65  ror has .** alre
1c260 61 64 79 20 6f 63 63 75 72 72 65 64 2c 20 74 68  ady occurred, th
1c270 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61  is function is a
1c280 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69   no-op..*/.stati
1c290 63 20 76 6f 69 64 20 66 74 73 35 49 6e 64 65 78  c void fts5Index
1c2a0 41 75 74 6f 6d 65 72 67 65 28 0a 20 20 46 74 73  Automerge(.  Fts
1c2b0 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20  5Index *p,      
1c2c0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1c2d0 46 54 53 35 20 62 61 63 6b 65 6e 64 20 6f 62 6a  FTS5 backend obj
1c2e0 65 63 74 20 2a 2f 0a 20 20 46 74 73 35 53 74 72  ect */.  Fts5Str
1c2f0 75 63 74 75 72 65 20 2a 2a 70 70 53 74 72 75 63  ucture **ppStruc
1c300 74 2c 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f  t,       /* IN/O
1c310 55 54 3a 20 43 75 72 72 65 6e 74 20 73 74 72 75  UT: Current stru
1c320 63 74 75 72 65 20 6f 66 20 69 6e 64 65 78 20 2a  cture of index *
1c330 2f 0a 20 20 69 6e 74 20 6e 4c 65 61 66 20 20 20  /.  int nLeaf   
1c340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c350 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
1c360 20 6f 75 74 70 75 74 20 6c 65 61 76 65 73 20 6a   output leaves j
1c370 75 73 74 20 77 72 69 74 74 65 6e 20 2a 2f 0a 29  ust written */.)
1c380 7b 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53  {.  if( p->rc==S
1c390 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 2d 3e 70  QLITE_OK && p->p
1c3a0 43 6f 6e 66 69 67 2d 3e 6e 41 75 74 6f 6d 65 72  Config->nAutomer
1c3b0 67 65 3e 30 20 29 7b 0a 20 20 20 20 46 74 73 35  ge>0 ){.    Fts5
1c3c0 53 74 72 75 63 74 75 72 65 20 2a 70 53 74 72 75  Structure *pStru
1c3d0 63 74 20 3d 20 2a 70 70 53 74 72 75 63 74 3b 0a  ct = *ppStruct;.
1c3e0 20 20 20 20 75 36 34 20 6e 57 72 69 74 65 3b 20      u64 nWrite; 
1c3f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c400 20 20 2f 2a 20 49 6e 69 74 69 61 6c 20 76 61 6c    /* Initial val
1c410 75 65 20 6f 66 20 77 72 69 74 65 2d 63 6f 75 6e  ue of write-coun
1c420 74 65 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e  ter */.    int n
1c430 57 6f 72 6b 3b 20 20 20 20 20 20 20 20 20 20 20  Work;           
1c440 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
1c450 65 72 20 6f 66 20 77 6f 72 6b 2d 71 75 61 6e 74  er of work-quant
1c460 61 20 74 6f 20 70 65 72 66 6f 72 6d 20 2a 2f 0a  a to perform */.
1c470 20 20 20 20 69 6e 74 20 6e 52 65 6d 3b 20 20 20      int nRem;   
1c480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c490 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6c    /* Number of l
1c4a0 65 61 66 20 70 61 67 65 73 20 6c 65 66 74 20 74  eaf pages left t
1c4b0 6f 20 77 72 69 74 65 20 2a 2f 0a 0a 20 20 20 20  o write */..    
1c4c0 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20 77 72  /* Update the wr
1c4d0 69 74 65 2d 63 6f 75 6e 74 65 72 2e 20 57 68 69  ite-counter. Whi
1c4e0 6c 65 20 64 6f 69 6e 67 20 73 6f 2c 20 73 65 74  le doing so, set
1c4f0 20 6e 57 6f 72 6b 2e 20 2a 2f 0a 20 20 20 20 6e   nWork. */.    n
1c500 57 72 69 74 65 20 3d 20 70 53 74 72 75 63 74 2d  Write = pStruct-
1c510 3e 6e 57 72 69 74 65 43 6f 75 6e 74 65 72 3b 0a  >nWriteCounter;.
1c520 20 20 20 20 6e 57 6f 72 6b 20 3d 20 28 69 6e 74      nWork = (int
1c530 29 28 28 28 6e 57 72 69 74 65 20 2b 20 6e 4c 65  )(((nWrite + nLe
1c540 61 66 29 20 2f 20 70 2d 3e 6e 57 6f 72 6b 55 6e  af) / p->nWorkUn
1c550 69 74 29 20 2d 20 28 6e 57 72 69 74 65 20 2f 20  it) - (nWrite / 
1c560 70 2d 3e 6e 57 6f 72 6b 55 6e 69 74 29 29 3b 0a  p->nWorkUnit));.
1c570 20 20 20 20 70 53 74 72 75 63 74 2d 3e 6e 57 72      pStruct->nWr
1c580 69 74 65 43 6f 75 6e 74 65 72 20 2b 3d 20 6e 4c  iteCounter += nL
1c590 65 61 66 3b 0a 20 20 20 20 6e 52 65 6d 20 3d 20  eaf;.    nRem = 
1c5a0 28 69 6e 74 29 28 70 2d 3e 6e 57 6f 72 6b 55 6e  (int)(p->nWorkUn
1c5b0 69 74 20 2a 20 6e 57 6f 72 6b 20 2a 20 70 53 74  it * nWork * pSt
1c5c0 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 29 3b 0a 0a  ruct->nLevel);..
1c5d0 20 20 20 20 66 74 73 35 49 6e 64 65 78 4d 65 72      fts5IndexMer
1c5e0 67 65 28 70 2c 20 70 70 53 74 72 75 63 74 2c 20  ge(p, ppStruct, 
1c5f0 6e 52 65 6d 29 3b 0a 20 20 7d 0a 7d 0a 0a 73 74  nRem);.  }.}..st
1c600 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 49 6e  atic void fts5In
1c610 64 65 78 43 72 69 73 69 73 6d 65 72 67 65 28 0a  dexCrisismerge(.
1c620 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20    Fts5Index *p, 
1c630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c640 20 20 2f 2a 20 46 54 53 35 20 62 61 63 6b 65 6e    /* FTS5 backen
1c650 64 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 46 74  d object */.  Ft
1c660 73 35 53 74 72 75 63 74 75 72 65 20 2a 2a 70 70  s5Structure **pp
1c670 53 74 72 75 63 74 20 20 20 20 20 20 20 20 2f 2a  Struct        /*
1c680 20 49 4e 2f 4f 55 54 3a 20 43 75 72 72 65 6e 74   IN/OUT: Current
1c690 20 73 74 72 75 63 74 75 72 65 20 6f 66 20 69 6e   structure of in
1c6a0 64 65 78 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73  dex */.){.  cons
1c6b0 74 20 69 6e 74 20 6e 43 72 69 73 69 73 20 3d 20  t int nCrisis = 
1c6c0 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e 6e 43 72 69  p->pConfig->nCri
1c6d0 73 69 73 4d 65 72 67 65 3b 0a 20 20 46 74 73 35  sisMerge;.  Fts5
1c6e0 53 74 72 75 63 74 75 72 65 20 2a 70 53 74 72 75  Structure *pStru
1c6f0 63 74 20 3d 20 2a 70 70 53 74 72 75 63 74 3b 0a  ct = *ppStruct;.
1c700 20 20 69 6e 74 20 69 4c 76 6c 20 3d 20 30 3b 0a    int iLvl = 0;.
1c710 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72 63  .  assert( p->rc
1c720 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70  !=SQLITE_OK || p
1c730 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 3e 30  Struct->nLevel>0
1c740 20 29 3b 0a 20 20 77 68 69 6c 65 28 20 70 2d 3e   );.  while( p->
1c750 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
1c760 20 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c   pStruct->aLevel
1c770 5b 69 4c 76 6c 5d 2e 6e 53 65 67 3e 3d 6e 43 72  [iLvl].nSeg>=nCr
1c780 69 73 69 73 20 29 7b 0a 20 20 20 20 66 74 73 35  isis ){.    fts5
1c790 49 6e 64 65 78 4d 65 72 67 65 4c 65 76 65 6c 28  IndexMergeLevel(
1c7a0 70 2c 20 26 70 53 74 72 75 63 74 2c 20 69 4c 76  p, &pStruct, iLv
1c7b0 6c 2c 20 30 29 3b 0a 20 20 20 20 61 73 73 65 72  l, 0);.    asser
1c7c0 74 28 20 70 2d 3e 72 63 21 3d 53 51 4c 49 54 45  t( p->rc!=SQLITE
1c7d0 5f 4f 4b 20 7c 7c 20 70 53 74 72 75 63 74 2d 3e  _OK || pStruct->
1c7e0 6e 4c 65 76 65 6c 3e 28 69 4c 76 6c 2b 31 29 20  nLevel>(iLvl+1) 
1c7f0 29 3b 0a 20 20 20 20 66 74 73 35 53 74 72 75 63  );.    fts5Struc
1c800 74 75 72 65 50 72 6f 6d 6f 74 65 28 70 2c 20 69  turePromote(p, i
1c810 4c 76 6c 2b 31 2c 20 70 53 74 72 75 63 74 29 3b  Lvl+1, pStruct);
1c820 0a 20 20 20 20 69 4c 76 6c 2b 2b 3b 0a 20 20 7d  .    iLvl++;.  }
1c830 0a 20 20 2a 70 70 53 74 72 75 63 74 20 3d 20 70  .  *ppStruct = p
1c840 53 74 72 75 63 74 3b 0a 7d 0a 0a 73 74 61 74 69  Struct;.}..stati
1c850 63 20 69 6e 74 20 66 74 73 35 49 6e 64 65 78 52  c int fts5IndexR
1c860 65 74 75 72 6e 28 46 74 73 35 49 6e 64 65 78 20  eturn(Fts5Index 
1c870 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  *p){.  int rc = 
1c880 70 2d 3e 72 63 3b 0a 20 20 70 2d 3e 72 63 20 3d  p->rc;.  p->rc =
1c890 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 72 65   SQLITE_OK;.  re
1c8a0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 74 79 70 65  turn rc;.}..type
1c8b0 64 65 66 20 73 74 72 75 63 74 20 46 74 73 35 46  def struct Fts5F
1c8c0 6c 75 73 68 43 74 78 20 46 74 73 35 46 6c 75 73  lushCtx Fts5Flus
1c8d0 68 43 74 78 3b 0a 73 74 72 75 63 74 20 46 74 73  hCtx;.struct Fts
1c8e0 35 46 6c 75 73 68 43 74 78 20 7b 0a 20 20 46 74  5FlushCtx {.  Ft
1c8f0 73 35 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20  s5Index *pIdx;. 
1c900 20 46 74 73 35 53 65 67 57 72 69 74 65 72 20 77   Fts5SegWriter w
1c910 72 69 74 65 72 3b 20 0a 7d 3b 0a 0a 2f 2a 0a 2a  riter; .};../*.*
1c920 2a 20 42 75 66 66 65 72 20 61 42 75 66 5b 5d 20  * Buffer aBuf[] 
1c930 63 6f 6e 74 61 69 6e 73 20 61 20 6c 69 73 74 20  contains a list 
1c940 6f 66 20 76 61 72 69 6e 74 73 2c 20 61 6c 6c 20  of varints, all 
1c950 73 6d 61 6c 6c 20 65 6e 6f 75 67 68 20 74 6f 20  small enough to 
1c960 66 69 74 0a 2a 2a 20 69 6e 20 61 20 33 32 2d 62  fit.** in a 32-b
1c970 69 74 20 69 6e 74 65 67 65 72 2e 20 52 65 74 75  it integer. Retu
1c980 72 6e 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  rn the size of t
1c990 68 65 20 6c 61 72 67 65 73 74 20 70 72 65 66 69  he largest prefi
1c9a0 78 20 6f 66 20 74 68 69 73 20 0a 2a 2a 20 6c 69  x of this .** li
1c9b0 73 74 20 6e 4d 61 78 20 62 79 74 65 73 20 6f 72  st nMax bytes or
1c9c0 20 6c 65 73 73 20 69 6e 20 73 69 7a 65 2e 0a 2a   less in size..*
1c9d0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73  /.static int fts
1c9e0 35 50 6f 73 6c 69 73 74 50 72 65 66 69 78 28 63  5PoslistPrefix(c
1c9f0 6f 6e 73 74 20 75 38 20 2a 61 42 75 66 2c 20 69  onst u8 *aBuf, i
1ca00 6e 74 20 6e 4d 61 78 29 7b 0a 20 20 69 6e 74 20  nt nMax){.  int 
1ca10 72 65 74 3b 0a 20 20 75 33 32 20 64 75 6d 6d 79  ret;.  u32 dummy
1ca20 3b 0a 20 20 72 65 74 20 3d 20 66 74 73 35 47 65  ;.  ret = fts5Ge
1ca30 74 56 61 72 69 6e 74 33 32 28 61 42 75 66 2c 20  tVarint32(aBuf, 
1ca40 64 75 6d 6d 79 29 3b 0a 20 20 69 66 28 20 72 65  dummy);.  if( re
1ca50 74 3c 6e 4d 61 78 20 29 7b 0a 20 20 20 20 77 68  t<nMax ){.    wh
1ca60 69 6c 65 28 20 31 20 29 7b 0a 20 20 20 20 20 20  ile( 1 ){.      
1ca70 69 6e 74 20 69 20 3d 20 66 74 73 35 47 65 74 56  int i = fts5GetV
1ca80 61 72 69 6e 74 33 32 28 26 61 42 75 66 5b 72 65  arint32(&aBuf[re
1ca90 74 5d 2c 20 64 75 6d 6d 79 29 3b 0a 20 20 20 20  t], dummy);.    
1caa0 20 20 69 66 28 20 28 72 65 74 20 2b 20 69 29 20    if( (ret + i) 
1cab0 3e 20 6e 4d 61 78 20 29 20 62 72 65 61 6b 3b 0a  > nMax ) break;.
1cac0 20 20 20 20 20 20 72 65 74 20 2b 3d 20 69 3b 0a        ret += i;.
1cad0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
1cae0 72 6e 20 72 65 74 3b 0a 7d 0a 0a 23 64 65 66 69  rn ret;.}..#defi
1caf0 6e 65 20 66 74 73 35 42 75 66 66 65 72 53 61 66  ne fts5BufferSaf
1cb00 65 41 70 70 65 6e 64 42 6c 6f 62 28 70 42 75 66  eAppendBlob(pBuf
1cb10 2c 20 70 42 6c 6f 62 2c 20 6e 42 6c 6f 62 29 20  , pBlob, nBlob) 
1cb20 7b 20 5c 0a 20 20 61 73 73 65 72 74 28 20 70 42  { \.  assert( pB
1cb30 75 66 2d 3e 6e 53 70 61 63 65 3e 3d 28 70 42 75  uf->nSpace>=(pBu
1cb40 66 2d 3e 6e 2b 6e 42 6c 6f 62 29 20 29 3b 20 20  f->n+nBlob) );  
1cb50 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 6d             \.  m
1cb60 65 6d 63 70 79 28 26 70 42 75 66 2d 3e 70 5b 70  emcpy(&pBuf->p[p
1cb70 42 75 66 2d 3e 6e 5d 2c 20 70 42 6c 6f 62 2c 20  Buf->n], pBlob, 
1cb80 6e 42 6c 6f 62 29 3b 20 20 20 20 20 20 20 20 20  nBlob);         
1cb90 20 20 20 20 5c 0a 20 20 70 42 75 66 2d 3e 6e 20      \.  pBuf->n 
1cba0 2b 3d 20 6e 42 6c 6f 62 3b 20 20 20 20 20 20 20  += nBlob;       
1cbb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cbc0 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 7d               \.}
1cbd0 0a 0a 2f 2a 0a 2a 2a 20 46 6c 75 73 68 20 74 68  ../*.** Flush th
1cbe0 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 69 6e  e contents of in
1cbf0 2d 6d 65 6d 6f 72 79 20 68 61 73 68 20 74 61 62  -memory hash tab
1cc00 6c 65 20 69 48 61 73 68 20 74 6f 20 61 20 6e 65  le iHash to a ne
1cc10 77 20 6c 65 76 65 6c 2d 30 20 0a 2a 2a 20 73 65  w level-0 .** se
1cc20 67 6d 65 6e 74 20 6f 6e 20 64 69 73 6b 2e 20 41  gment on disk. A
1cc30 6c 73 6f 20 75 70 64 61 74 65 20 74 68 65 20 63  lso update the c
1cc40 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 73 74 72  orresponding str
1cc50 75 63 74 75 72 65 20 72 65 63 6f 72 64 2e 0a 2a  ucture record..*
1cc60 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72  *.** If an error
1cc70 20 6f 63 63 75 72 73 2c 20 73 65 74 20 74 68 65   occurs, set the
1cc80 20 46 74 73 35 49 6e 64 65 78 2e 72 63 20 65 72   Fts5Index.rc er
1cc90 72 6f 72 20 63 6f 64 65 2e 20 49 66 20 61 6e 20  ror code. If an 
1cca0 65 72 72 6f 72 20 68 61 73 20 0a 2a 2a 20 61 6c  error has .** al
1ccb0 72 65 61 64 79 20 6f 63 63 75 72 72 65 64 2c 20  ready occurred, 
1ccc0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
1ccd0 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61   a no-op..*/.sta
1cce0 74 69 63 20 76 6f 69 64 20 66 74 73 35 46 6c 75  tic void fts5Flu
1ccf0 73 68 4f 6e 65 48 61 73 68 28 46 74 73 35 49 6e  shOneHash(Fts5In
1cd00 64 65 78 20 2a 70 29 7b 0a 20 20 46 74 73 35 48  dex *p){.  Fts5H
1cd10 61 73 68 20 2a 70 48 61 73 68 20 3d 20 70 2d 3e  ash *pHash = p->
1cd20 70 48 61 73 68 3b 0a 20 20 46 74 73 35 53 74 72  pHash;.  Fts5Str
1cd30 75 63 74 75 72 65 20 2a 70 53 74 72 75 63 74 3b  ucture *pStruct;
1cd40 0a 20 20 69 6e 74 20 69 53 65 67 69 64 3b 0a 20  .  int iSegid;. 
1cd50 20 69 6e 74 20 70 67 6e 6f 4c 61 73 74 20 3d 20   int pgnoLast = 
1cd60 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
1cd70 20 20 20 2f 2a 20 4c 61 73 74 20 6c 65 61 66 20     /* Last leaf 
1cd80 70 61 67 65 20 6e 75 6d 62 65 72 20 69 6e 20 73  page number in s
1cd90 65 67 6d 65 6e 74 20 2a 2f 0a 0a 20 20 2f 2a 20  egment */..  /* 
1cda0 4f 62 74 61 69 6e 20 61 20 72 65 66 65 72 65 6e  Obtain a referen
1cdb0 63 65 20 74 6f 20 74 68 65 20 69 6e 64 65 78 20  ce to the index 
1cdc0 73 74 72 75 63 74 75 72 65 20 61 6e 64 20 61 6c  structure and al
1cdd0 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 73 65 67  locate a new seg
1cde0 6d 65 6e 74 2d 69 64 0a 20 20 2a 2a 20 66 6f 72  ment-id.  ** for
1cdf0 20 74 68 65 20 6e 65 77 20 6c 65 76 65 6c 2d 30   the new level-0
1ce00 20 73 65 67 6d 65 6e 74 2e 20 20 2a 2f 0a 20 20   segment.  */.  
1ce10 70 53 74 72 75 63 74 20 3d 20 66 74 73 35 53 74  pStruct = fts5St
1ce20 72 75 63 74 75 72 65 52 65 61 64 28 70 29 3b 0a  ructureRead(p);.
1ce30 20 20 69 53 65 67 69 64 20 3d 20 66 74 73 35 41    iSegid = fts5A
1ce40 6c 6c 6f 63 61 74 65 53 65 67 69 64 28 70 2c 20  llocateSegid(p, 
1ce50 70 53 74 72 75 63 74 29 3b 0a 0a 20 20 69 66 28  pStruct);..  if(
1ce60 20 69 53 65 67 69 64 20 29 7b 0a 20 20 20 20 63   iSegid ){.    c
1ce70 6f 6e 73 74 20 69 6e 74 20 70 67 73 7a 20 3d 20  onst int pgsz = 
1ce80 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e 70 67 73 7a  p->pConfig->pgsz
1ce90 3b 0a 0a 20 20 20 20 46 74 73 35 53 74 72 75 63  ;..    Fts5Struc
1cea0 74 75 72 65 53 65 67 6d 65 6e 74 20 2a 70 53 65  tureSegment *pSe
1ceb0 67 3b 20 20 20 2f 2a 20 4e 65 77 20 73 65 67 6d  g;   /* New segm
1cec0 65 6e 74 20 77 69 74 68 69 6e 20 70 53 74 72 75  ent within pStru
1ced0 63 74 20 2a 2f 0a 20 20 20 20 46 74 73 35 42 75  ct */.    Fts5Bu
1cee0 66 66 65 72 20 2a 70 42 75 66 3b 20 20 20 20 20  ffer *pBuf;     
1cef0 20 20 20 20 20 20 20 20 2f 2a 20 42 75 66 66 65          /* Buffe
1cf00 72 20 69 6e 20 77 68 69 63 68 20 74 6f 20 61 73  r in which to as
1cf10 73 65 6d 62 6c 65 20 6c 65 61 66 20 70 61 67 65  semble leaf page
1cf20 20 2a 2f 0a 20 20 20 20 46 74 73 35 42 75 66 66   */.    Fts5Buff
1cf30 65 72 20 2a 70 50 67 69 64 78 3b 20 20 20 20 20  er *pPgidx;     
1cf40 20 20 20 20 20 20 2f 2a 20 42 75 66 66 65 72 20        /* Buffer 
1cf50 69 6e 20 77 68 69 63 68 20 74 6f 20 61 73 73 65  in which to asse
1cf60 6d 62 6c 65 20 70 67 69 64 78 20 2a 2f 0a 0a 20  mble pgidx */.. 
1cf70 20 20 20 46 74 73 35 53 65 67 57 72 69 74 65 72     Fts5SegWriter
1cf80 20 77 72 69 74 65 72 3b 0a 20 20 20 20 66 74 73   writer;.    fts
1cf90 35 57 72 69 74 65 49 6e 69 74 28 70 2c 20 26 77  5WriteInit(p, &w
1cfa0 72 69 74 65 72 2c 20 69 53 65 67 69 64 29 3b 0a  riter, iSegid);.
1cfb0 0a 20 20 20 20 70 42 75 66 20 3d 20 26 77 72 69  .    pBuf = &wri
1cfc0 74 65 72 2e 77 72 69 74 65 72 2e 62 75 66 3b 0a  ter.writer.buf;.
1cfd0 20 20 20 20 70 50 67 69 64 78 20 3d 20 26 77 72      pPgidx = &wr
1cfe0 69 74 65 72 2e 77 72 69 74 65 72 2e 70 67 69 64  iter.writer.pgid
1cff0 78 3b 0a 0a 20 20 20 20 2f 2a 20 66 74 73 35 57  x;..    /* fts5W
1d000 72 69 74 65 49 6e 69 74 28 29 20 73 68 6f 75 6c  riteInit() shoul
1d010 64 20 68 61 76 65 20 69 6e 69 74 69 61 6c 69 7a  d have initializ
1d020 65 64 20 74 68 65 20 62 75 66 66 65 72 73 20 74  ed the buffers t
1d030 6f 20 28 6d 6f 73 74 20 6c 69 6b 65 6c 79 29 0a  o (most likely).
1d040 20 20 20 20 2a 2a 20 74 68 65 20 6d 61 78 69 6d      ** the maxim
1d050 75 6d 20 73 70 61 63 65 20 72 65 71 75 69 72 65  um space require
1d060 64 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74  d. */.    assert
1d070 28 20 70 2d 3e 72 63 20 7c 7c 20 70 42 75 66 2d  ( p->rc || pBuf-
1d080 3e 6e 53 70 61 63 65 3e 3d 28 70 67 73 7a 20 2b  >nSpace>=(pgsz +
1d090 20 46 54 53 35 5f 44 41 54 41 5f 50 41 44 44 49   FTS5_DATA_PADDI
1d0a0 4e 47 29 20 29 3b 0a 20 20 20 20 61 73 73 65 72  NG) );.    asser
1d0b0 74 28 20 70 2d 3e 72 63 20 7c 7c 20 70 50 67 69  t( p->rc || pPgi
1d0c0 64 78 2d 3e 6e 53 70 61 63 65 3e 3d 28 70 67 73  dx->nSpace>=(pgs
1d0d0 7a 20 2b 20 46 54 53 35 5f 44 41 54 41 5f 50 41  z + FTS5_DATA_PA
1d0e0 44 44 49 4e 47 29 20 29 3b 0a 0a 20 20 20 20 2f  DDING) );..    /
1d0f0 2a 20 42 65 67 69 6e 20 73 63 61 6e 6e 69 6e 67  * Begin scanning
1d100 20 74 68 72 6f 75 67 68 20 68 61 73 68 20 74 61   through hash ta
1d110 62 6c 65 20 65 6e 74 72 69 65 73 2e 20 54 68 69  ble entries. Thi
1d120 73 20 6c 6f 6f 70 20 72 75 6e 73 20 6f 6e 63 65  s loop runs once
1d130 20 66 6f 72 20 65 61 63 68 0a 20 20 20 20 2a 2a   for each.    **
1d140 20 74 65 72 6d 2f 64 6f 63 6c 69 73 74 20 63 75   term/doclist cu
1d150 72 72 65 6e 74 6c 79 20 73 74 6f 72 65 64 20 77  rrently stored w
1d160 69 74 68 69 6e 20 74 68 65 20 68 61 73 68 20 74  ithin the hash t
1d170 61 62 6c 65 2e 20 2a 2f 0a 20 20 20 20 69 66 28  able. */.    if(
1d180 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
1d190 4b 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 72 63  K ){.      p->rc
1d1a0 20 3d 20 73 71 6c 69 74 65 33 46 74 73 35 48 61   = sqlite3Fts5Ha
1d1b0 73 68 53 63 61 6e 49 6e 69 74 28 70 48 61 73 68  shScanInit(pHash
1d1c0 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20  , 0, 0);.    }. 
1d1d0 20 20 20 77 68 69 6c 65 28 20 70 2d 3e 72 63 3d     while( p->rc=
1d1e0 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 30 3d  =SQLITE_OK && 0=
1d1f0 3d 73 71 6c 69 74 65 33 46 74 73 35 48 61 73 68  =sqlite3Fts5Hash
1d200 53 63 61 6e 45 6f 66 28 70 48 61 73 68 29 20 29  ScanEof(pHash) )
1d210 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68  {.      const ch
1d220 61 72 20 2a 7a 54 65 72 6d 3b 20 20 20 20 20 20  ar *zTerm;      
1d230 20 20 20 20 2f 2a 20 42 75 66 66 65 72 20 63 6f      /* Buffer co
1d240 6e 74 61 69 6e 69 6e 67 20 74 65 72 6d 20 2a 2f  ntaining term */
1d250 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 75 38 20  .      const u8 
1d260 2a 70 44 6f 63 6c 69 73 74 3b 20 20 20 20 20 20  *pDoclist;      
1d270 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f     /* Pointer to
1d280 20 64 6f 63 6c 69 73 74 20 66 6f 72 20 74 68 69   doclist for thi
1d290 73 20 74 65 72 6d 20 2a 2f 0a 20 20 20 20 20 20  s term */.      
1d2a0 69 6e 74 20 6e 44 6f 63 6c 69 73 74 3b 20 20 20  int nDoclist;   
1d2b0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
1d2c0 69 7a 65 20 6f 66 20 64 6f 63 6c 69 73 74 20 69  ize of doclist i
1d2d0 6e 20 62 79 74 65 73 20 2a 2f 0a 0a 20 20 20 20  n bytes */..    
1d2e0 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 74    /* Write the t
1d2f0 65 72 6d 20 66 6f 72 20 74 68 69 73 20 65 6e 74  erm for this ent
1d300 72 79 20 74 6f 20 64 69 73 6b 2e 20 2a 2f 0a 20  ry to disk. */. 
1d310 20 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35       sqlite3Fts5
1d320 48 61 73 68 53 63 61 6e 45 6e 74 72 79 28 70 48  HashScanEntry(pH
1d330 61 73 68 2c 20 26 7a 54 65 72 6d 2c 20 26 70 44  ash, &zTerm, &pD
1d340 6f 63 6c 69 73 74 2c 20 26 6e 44 6f 63 6c 69 73  oclist, &nDoclis
1d350 74 29 3b 0a 20 20 20 20 20 20 66 74 73 35 57 72  t);.      fts5Wr
1d360 69 74 65 41 70 70 65 6e 64 54 65 72 6d 28 70 2c  iteAppendTerm(p,
1d370 20 26 77 72 69 74 65 72 2c 20 73 74 72 6c 65 6e   &writer, strlen
1d380 28 7a 54 65 72 6d 29 2c 20 28 63 6f 6e 73 74 20  (zTerm), (const 
1d390 75 38 2a 29 7a 54 65 72 6d 29 3b 0a 0a 20 20 20  u8*)zTerm);..   
1d3a0 20 20 20 69 66 28 20 77 72 69 74 65 72 2e 62 46     if( writer.bF
1d3b0 69 72 73 74 52 6f 77 69 64 49 6e 50 61 67 65 3d  irstRowidInPage=
1d3c0 3d 30 20 0a 20 20 20 20 20 20 20 26 26 20 70 67  =0 .       && pg
1d3d0 73 7a 3e 3d 28 70 42 75 66 2d 3e 6e 20 2b 20 70  sz>=(pBuf->n + p
1d3e0 50 67 69 64 78 2d 3e 6e 20 2b 20 6e 44 6f 63 6c  Pgidx->n + nDocl
1d3f0 69 73 74 20 2b 20 31 29 20 0a 20 20 20 20 20 20  ist + 1) .      
1d400 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ){.        /* Th
1d410 65 20 65 6e 74 69 72 65 20 64 6f 63 6c 69 73 74  e entire doclist
1d420 20 77 69 6c 6c 20 66 69 74 20 6f 6e 20 74 68 65   will fit on the
1d430 20 63 75 72 72 65 6e 74 20 6c 65 61 66 2e 20 2a   current leaf. *
1d440 2f 0a 20 20 20 20 20 20 20 20 66 74 73 35 42 75  /.        fts5Bu
1d450 66 66 65 72 53 61 66 65 41 70 70 65 6e 64 42 6c  fferSafeAppendBl
1d460 6f 62 28 70 42 75 66 2c 20 70 44 6f 63 6c 69 73  ob(pBuf, pDoclis
1d470 74 2c 20 6e 44 6f 63 6c 69 73 74 29 3b 0a 20 20  t, nDoclist);.  
1d480 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1d490 20 20 20 69 36 34 20 69 52 6f 77 69 64 20 3d 20     i64 iRowid = 
1d4a0 30 3b 0a 20 20 20 20 20 20 20 20 69 36 34 20 69  0;.        i64 i
1d4b0 44 65 6c 74 61 20 3d 20 30 3b 0a 20 20 20 20 20  Delta = 0;.     
1d4c0 20 20 20 69 6e 74 20 69 4f 66 66 20 3d 20 30 3b     int iOff = 0;
1d4d0 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 20 77 72  ..        /*  wr
1d4e0 69 74 65 72 2e 62 46 69 72 73 74 52 6f 77 69 64  iter.bFirstRowid
1d4f0 49 6e 50 61 67 65 20 3d 20 30 3b 20 2a 2f 0a 0a  InPage = 0; */..
1d500 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 65          /* The e
1d510 6e 74 69 72 65 20 64 6f 63 6c 69 73 74 20 77 69  ntire doclist wi
1d520 6c 6c 20 6e 6f 74 20 66 69 74 20 6f 6e 20 74 68  ll not fit on th
1d530 69 73 20 6c 65 61 66 2e 20 54 68 65 20 66 6f 6c  is leaf. The fol
1d540 6c 6f 77 69 6e 67 20 0a 20 20 20 20 20 20 20 20  lowing .        
1d550 2a 2a 20 6c 6f 6f 70 20 69 74 65 72 61 74 65 73  ** loop iterates
1d560 20 74 68 72 6f 75 67 68 20 74 68 65 20 70 6f 73   through the pos
1d570 6c 69 73 74 73 20 74 68 61 74 20 6d 61 6b 65 20  lists that make 
1d580 75 70 20 74 68 65 20 63 75 72 72 65 6e 74 20 0a  up the current .
1d590 20 20 20 20 20 20 20 20 2a 2a 20 64 6f 63 6c 69          ** docli
1d5a0 73 74 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20  st.  */.        
1d5b0 77 68 69 6c 65 28 20 70 2d 3e 72 63 3d 3d 53 51  while( p->rc==SQ
1d5c0 4c 49 54 45 5f 4f 4b 20 26 26 20 69 4f 66 66 3c  LITE_OK && iOff<
1d5d0 6e 44 6f 63 6c 69 73 74 20 29 7b 0a 20 20 20 20  nDoclist ){.    
1d5e0 20 20 20 20 20 20 69 6e 74 20 6e 50 6f 73 3b 0a        int nPos;.
1d5f0 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 6e 43            int nC
1d600 6f 70 79 3b 0a 20 20 20 20 20 20 20 20 20 20 69  opy;.          i
1d610 6e 74 20 62 44 75 6d 6d 79 3b 0a 20 20 20 20 20  nt bDummy;.     
1d620 20 20 20 20 20 69 4f 66 66 20 2b 3d 20 66 74 73       iOff += fts
1d630 35 47 65 74 56 61 72 69 6e 74 28 26 70 44 6f 63  5GetVarint(&pDoc
1d640 6c 69 73 74 5b 69 4f 66 66 5d 2c 20 28 75 36 34  list[iOff], (u64
1d650 2a 29 26 69 44 65 6c 74 61 29 3b 0a 20 20 20 20  *)&iDelta);.    
1d660 20 20 20 20 20 20 6e 43 6f 70 79 20 3d 20 66 74        nCopy = ft
1d670 73 35 47 65 74 50 6f 73 6c 69 73 74 53 69 7a 65  s5GetPoslistSize
1d680 28 26 70 44 6f 63 6c 69 73 74 5b 69 4f 66 66 5d  (&pDoclist[iOff]
1d690 2c 20 26 6e 50 6f 73 2c 20 26 62 44 75 6d 6d 79  , &nPos, &bDummy
1d6a0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6e 43 6f  );.          nCo
1d6b0 70 79 20 2b 3d 20 6e 50 6f 73 3b 0a 20 20 20 20  py += nPos;.    
1d6c0 20 20 20 20 20 20 69 52 6f 77 69 64 20 2b 3d 20        iRowid += 
1d6d0 69 44 65 6c 74 61 3b 0a 20 20 20 20 20 20 20 20  iDelta;.        
1d6e0 20 20 0a 20 20 20 20 20 20 20 20 20 20 69 66 28    .          if(
1d6f0 20 77 72 69 74 65 72 2e 62 46 69 72 73 74 52 6f   writer.bFirstRo
1d700 77 69 64 49 6e 50 61 67 65 20 29 7b 0a 20 20 20  widInPage ){.   
1d710 20 20 20 20 20 20 20 20 20 66 74 73 35 50 75 74           fts5Put
1d720 55 31 36 28 26 70 42 75 66 2d 3e 70 5b 30 5d 2c  U16(&pBuf->p[0],
1d730 20 70 42 75 66 2d 3e 6e 29 3b 20 20 20 2f 2a 20   pBuf->n);   /* 
1d740 66 69 72 73 74 20 72 6f 77 69 64 20 6f 6e 20 70  first rowid on p
1d750 61 67 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  age */.         
1d760 20 20 20 70 42 75 66 2d 3e 6e 20 2b 3d 20 73 71     pBuf->n += sq
1d770 6c 69 74 65 33 46 74 73 35 50 75 74 56 61 72 69  lite3Fts5PutVari
1d780 6e 74 28 26 70 42 75 66 2d 3e 70 5b 70 42 75 66  nt(&pBuf->p[pBuf
1d790 2d 3e 6e 5d 2c 20 69 52 6f 77 69 64 29 3b 0a 20  ->n], iRowid);. 
1d7a0 20 20 20 20 20 20 20 20 20 20 20 77 72 69 74 65             write
1d7b0 72 2e 62 46 69 72 73 74 52 6f 77 69 64 49 6e 50  r.bFirstRowidInP
1d7c0 61 67 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  age = 0;.       
1d7d0 20 20 20 20 20 66 74 73 35 57 72 69 74 65 44 6c       fts5WriteDl
1d7e0 69 64 78 41 70 70 65 6e 64 28 70 2c 20 26 77 72  idxAppend(p, &wr
1d7f0 69 74 65 72 2c 20 69 52 6f 77 69 64 29 3b 0a 20  iter, iRowid);. 
1d800 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
1d810 20 20 20 20 20 20 20 20 20 20 20 20 70 42 75 66              pBuf
1d820 2d 3e 6e 20 2b 3d 20 73 71 6c 69 74 65 33 46 74  ->n += sqlite3Ft
1d830 73 35 50 75 74 56 61 72 69 6e 74 28 26 70 42 75  s5PutVarint(&pBu
1d840 66 2d 3e 70 5b 70 42 75 66 2d 3e 6e 5d 2c 20 69  f->p[pBuf->n], i
1d850 44 65 6c 74 61 29 3b 0a 20 20 20 20 20 20 20 20  Delta);.        
1d860 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 61 73    }.          as
1d870 73 65 72 74 28 20 70 42 75 66 2d 3e 6e 3c 3d 70  sert( pBuf->n<=p
1d880 42 75 66 2d 3e 6e 53 70 61 63 65 20 29 3b 0a 0a  Buf->nSpace );..
1d890 20 20 20 20 20 20 20 20 20 20 69 66 28 20 28 70            if( (p
1d8a0 42 75 66 2d 3e 6e 20 2b 20 70 50 67 69 64 78 2d  Buf->n + pPgidx-
1d8b0 3e 6e 20 2b 20 6e 43 6f 70 79 29 20 3c 3d 20 70  >n + nCopy) <= p
1d8c0 67 73 7a 20 29 7b 0a 20 20 20 20 20 20 20 20 20  gsz ){.         
1d8d0 20 20 20 2f 2a 20 54 68 65 20 65 6e 74 69 72 65     /* The entire
1d8e0 20 70 6f 73 6c 69 73 74 20 77 69 6c 6c 20 66 69   poslist will fi
1d8f0 74 20 6f 6e 20 74 68 65 20 63 75 72 72 65 6e 74  t on the current
1d900 20 6c 65 61 66 2e 20 53 6f 20 63 6f 70 79 0a 20   leaf. So copy. 
1d910 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69 74             ** it
1d920 20 69 6e 20 6f 6e 65 20 67 6f 2e 20 2a 2f 0a 20   in one go. */. 
1d930 20 20 20 20 20 20 20 20 20 20 20 66 74 73 35 42             fts5B
1d940 75 66 66 65 72 53 61 66 65 41 70 70 65 6e 64 42  ufferSafeAppendB
1d950 6c 6f 62 28 70 42 75 66 2c 20 26 70 44 6f 63 6c  lob(pBuf, &pDocl
1d960 69 73 74 5b 69 4f 66 66 5d 2c 20 6e 43 6f 70 79  ist[iOff], nCopy
1d970 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c  );.          }el
1d980 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
1d990 2f 2a 20 54 68 65 20 65 6e 74 69 72 65 20 70 6f  /* The entire po
1d9a0 73 6c 69 73 74 20 77 69 6c 6c 20 6e 6f 74 20 66  slist will not f
1d9b0 69 74 20 6f 6e 20 74 68 69 73 20 6c 65 61 66 2e  it on this leaf.
1d9c0 20 53 6f 20 69 74 20 6e 65 65 64 73 0a 20 20 20   So it needs.   
1d9d0 20 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 62           ** to b
1d9e0 65 20 62 72 6f 6b 65 6e 20 69 6e 74 6f 20 73 65  e broken into se
1d9f0 63 74 69 6f 6e 73 2e 20 54 68 65 20 6f 6e 6c 79  ctions. The only
1da00 20 71 75 61 6c 69 66 69 63 61 74 69 6f 6e 20 62   qualification b
1da10 65 69 6e 67 0a 20 20 20 20 20 20 20 20 20 20 20  eing.           
1da20 20 2a 2a 20 74 68 61 74 20 65 61 63 68 20 76 61   ** that each va
1da30 72 69 6e 74 20 6d 75 73 74 20 62 65 20 73 74 6f  rint must be sto
1da40 72 65 64 20 63 6f 6e 74 69 67 75 6f 75 73 6c 79  red contiguously
1da50 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  .  */.          
1da60 20 20 63 6f 6e 73 74 20 75 38 20 2a 70 50 6f 73    const u8 *pPos
1da70 6c 69 73 74 20 3d 20 26 70 44 6f 63 6c 69 73 74  list = &pDoclist
1da80 5b 69 4f 66 66 5d 3b 0a 20 20 20 20 20 20 20 20  [iOff];.        
1da90 20 20 20 20 69 6e 74 20 69 50 6f 73 20 3d 20 30      int iPos = 0
1daa0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 77 68  ;.            wh
1dab0 69 6c 65 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49  ile( p->rc==SQLI
1dac0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
1dad0 20 20 20 20 20 20 20 69 6e 74 20 6e 53 70 61 63         int nSpac
1dae0 65 20 3d 20 70 67 73 7a 20 2d 20 70 42 75 66 2d  e = pgsz - pBuf-
1daf0 3e 6e 20 2d 20 70 50 67 69 64 78 2d 3e 6e 3b 0a  >n - pPgidx->n;.
1db00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 6e                in
1db10 74 20 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  t n = 0;.       
1db20 20 20 20 20 20 20 20 69 66 28 20 28 6e 43 6f 70         if( (nCop
1db30 79 20 2d 20 69 50 6f 73 29 3c 3d 6e 53 70 61 63  y - iPos)<=nSpac
1db40 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  e ){.           
1db50 20 20 20 20 20 6e 20 3d 20 6e 43 6f 70 79 20 2d       n = nCopy -
1db60 20 69 50 6f 73 3b 0a 20 20 20 20 20 20 20 20 20   iPos;.         
1db70 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
1db80 20 20 20 20 20 20 20 20 20 20 20 20 6e 20 3d 20              n = 
1db90 66 74 73 35 50 6f 73 6c 69 73 74 50 72 65 66 69  fts5PoslistPrefi
1dba0 78 28 26 70 50 6f 73 6c 69 73 74 5b 69 50 6f 73  x(&pPoslist[iPos
1dbb0 5d 2c 20 6e 53 70 61 63 65 29 3b 0a 20 20 20 20  ], nSpace);.    
1dbc0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
1dbd0 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
1dbe0 28 20 6e 3e 30 20 29 3b 0a 20 20 20 20 20 20 20  ( n>0 );.       
1dbf0 20 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65         fts5Buffe
1dc00 72 53 61 66 65 41 70 70 65 6e 64 42 6c 6f 62 28  rSafeAppendBlob(
1dc10 70 42 75 66 2c 20 26 70 50 6f 73 6c 69 73 74 5b  pBuf, &pPoslist[
1dc20 69 50 6f 73 5d 2c 20 6e 29 3b 0a 20 20 20 20 20  iPos], n);.     
1dc30 20 20 20 20 20 20 20 20 20 69 50 6f 73 20 2b 3d           iPos +=
1dc40 20 6e 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   n;.            
1dc50 20 20 69 66 28 20 28 70 42 75 66 2d 3e 6e 20 2b    if( (pBuf->n +
1dc60 20 70 50 67 69 64 78 2d 3e 6e 29 3e 3d 70 67 73   pPgidx->n)>=pgs
1dc70 7a 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  z ){.           
1dc80 20 20 20 20 20 66 74 73 35 57 72 69 74 65 46 6c       fts5WriteFl
1dc90 75 73 68 4c 65 61 66 28 70 2c 20 26 77 72 69 74  ushLeaf(p, &writ
1dca0 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  er);.           
1dcb0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
1dcc0 20 20 20 69 66 28 20 69 50 6f 73 3e 3d 6e 43 6f     if( iPos>=nCo
1dcd0 70 79 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  py ) break;.    
1dce0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1dcf0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
1dd00 69 4f 66 66 20 2b 3d 20 6e 43 6f 70 79 3b 0a 20  iOff += nCopy;. 
1dd10 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
1dd20 0a 0a 20 20 20 20 20 20 2f 2a 20 54 4f 44 4f 32  ..      /* TODO2
1dd30 3a 20 44 6f 63 6c 69 73 74 20 74 65 72 6d 69 6e  : Doclist termin
1dd40 61 74 6f 72 20 77 72 69 74 74 65 6e 20 68 65 72  ator written her
1dd50 65 2e 20 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 70  e. */.      /* p
1dd60 42 75 66 2d 3e 70 5b 70 42 75 66 2d 3e 6e 2b 2b  Buf->p[pBuf->n++
1dd70 5d 20 3d 20 27 5c 30 27 3b 20 2a 2f 0a 20 20 20  ] = '\0'; */.   
1dd80 20 20 20 61 73 73 65 72 74 28 20 70 42 75 66 2d     assert( pBuf-
1dd90 3e 6e 3c 3d 70 42 75 66 2d 3e 6e 53 70 61 63 65  >n<=pBuf->nSpace
1dda0 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   );.      sqlite
1ddb0 33 46 74 73 35 48 61 73 68 53 63 61 6e 4e 65 78  3Fts5HashScanNex
1ddc0 74 28 70 48 61 73 68 29 3b 0a 20 20 20 20 7d 0a  t(pHash);.    }.
1ddd0 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 48      sqlite3Fts5H
1dde0 61 73 68 43 6c 65 61 72 28 70 48 61 73 68 29 3b  ashClear(pHash);
1ddf0 0a 20 20 20 20 66 74 73 35 57 72 69 74 65 46 69  .    fts5WriteFi
1de00 6e 69 73 68 28 70 2c 20 26 77 72 69 74 65 72 2c  nish(p, &writer,
1de10 20 26 70 67 6e 6f 4c 61 73 74 29 3b 0a 0a 20 20   &pgnoLast);..  
1de20 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20    /* Update the 
1de30 46 74 73 35 53 74 72 75 63 74 75 72 65 2e 20 49  Fts5Structure. I
1de40 74 20 69 73 20 77 72 69 74 74 65 6e 20 62 61 63  t is written bac
1de50 6b 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  k to the databas
1de60 65 20 62 79 20 74 68 65 0a 20 20 20 20 2a 2a 20  e by the.    ** 
1de70 66 74 73 35 53 74 72 75 63 74 75 72 65 52 65 6c  fts5StructureRel
1de80 65 61 73 65 28 29 20 63 61 6c 6c 20 62 65 6c 6f  ease() call belo
1de90 77 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70  w.  */.    if( p
1dea0 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 3d 3d  Struct->nLevel==
1deb0 30 20 29 7b 0a 20 20 20 20 20 20 66 74 73 35 53  0 ){.      fts5S
1dec0 74 72 75 63 74 75 72 65 41 64 64 4c 65 76 65 6c  tructureAddLevel
1ded0 28 26 70 2d 3e 72 63 2c 20 26 70 53 74 72 75 63  (&p->rc, &pStruc
1dee0 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 74  t);.    }.    ft
1def0 73 35 53 74 72 75 63 74 75 72 65 45 78 74 65 6e  s5StructureExten
1df00 64 4c 65 76 65 6c 28 26 70 2d 3e 72 63 2c 20 70  dLevel(&p->rc, p
1df10 53 74 72 75 63 74 2c 20 30 2c 20 31 2c 20 30 29  Struct, 0, 1, 0)
1df20 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d  ;.    if( p->rc=
1df30 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1df40 20 20 20 20 70 53 65 67 20 3d 20 26 70 53 74 72      pSeg = &pStr
1df50 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 30 5d 2e 61  uct->aLevel[0].a
1df60 53 65 67 5b 20 70 53 74 72 75 63 74 2d 3e 61 4c  Seg[ pStruct->aL
1df70 65 76 65 6c 5b 30 5d 2e 6e 53 65 67 2b 2b 20 5d  evel[0].nSeg++ ]
1df80 3b 0a 20 20 20 20 20 20 70 53 65 67 2d 3e 69 53  ;.      pSeg->iS
1df90 65 67 69 64 20 3d 20 69 53 65 67 69 64 3b 0a 20  egid = iSegid;. 
1dfa0 20 20 20 20 20 70 53 65 67 2d 3e 70 67 6e 6f 46       pSeg->pgnoF
1dfb0 69 72 73 74 20 3d 20 31 3b 0a 20 20 20 20 20 20  irst = 1;.      
1dfc0 70 53 65 67 2d 3e 70 67 6e 6f 4c 61 73 74 20 3d  pSeg->pgnoLast =
1dfd0 20 70 67 6e 6f 4c 61 73 74 3b 0a 20 20 20 20 20   pgnoLast;.     
1dfe0 20 70 53 74 72 75 63 74 2d 3e 6e 53 65 67 6d 65   pStruct->nSegme
1dff0 6e 74 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  nt++;.    }.    
1e000 66 74 73 35 53 74 72 75 63 74 75 72 65 50 72 6f  fts5StructurePro
1e010 6d 6f 74 65 28 70 2c 20 30 2c 20 70 53 74 72 75  mote(p, 0, pStru
1e020 63 74 29 3b 0a 20 20 7d 0a 0a 20 20 66 74 73 35  ct);.  }..  fts5
1e030 49 6e 64 65 78 41 75 74 6f 6d 65 72 67 65 28 70  IndexAutomerge(p
1e040 2c 20 26 70 53 74 72 75 63 74 2c 20 70 67 6e 6f  , &pStruct, pgno
1e050 4c 61 73 74 29 3b 0a 20 20 66 74 73 35 49 6e 64  Last);.  fts5Ind
1e060 65 78 43 72 69 73 69 73 6d 65 72 67 65 28 70 2c  exCrisismerge(p,
1e070 20 26 70 53 74 72 75 63 74 29 3b 0a 20 20 66 74   &pStruct);.  ft
1e080 73 35 53 74 72 75 63 74 75 72 65 57 72 69 74 65  s5StructureWrite
1e090 28 70 2c 20 70 53 74 72 75 63 74 29 3b 0a 20 20  (p, pStruct);.  
1e0a0 66 74 73 35 53 74 72 75 63 74 75 72 65 52 65 6c  fts5StructureRel
1e0b0 65 61 73 65 28 70 53 74 72 75 63 74 29 3b 0a 7d  ease(pStruct);.}
1e0c0 0a 0a 2f 2a 0a 2a 2a 20 46 6c 75 73 68 20 61 6e  ../*.** Flush an
1e0d0 79 20 64 61 74 61 20 73 74 6f 72 65 64 20 69 6e  y data stored in
1e0e0 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 68   the in-memory h
1e0f0 61 73 68 20 74 61 62 6c 65 73 20 74 6f 20 74 68  ash tables to th
1e100 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2f 0a 73  e database..*/.s
1e110 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 49  tatic void fts5I
1e120 6e 64 65 78 46 6c 75 73 68 28 46 74 73 35 49 6e  ndexFlush(Fts5In
1e130 64 65 78 20 2a 70 29 7b 0a 20 20 2f 2a 20 55 6e  dex *p){.  /* Un
1e140 6c 65 73 73 20 69 74 20 69 73 20 65 6d 70 74 79  less it is empty
1e150 2c 20 66 6c 75 73 68 20 74 68 65 20 68 61 73 68  , flush the hash
1e160 20 74 61 62 6c 65 20 74 6f 20 64 69 73 6b 20 2a   table to disk *
1e170 2f 0a 20 20 69 66 28 20 70 2d 3e 6e 50 65 6e 64  /.  if( p->nPend
1e180 69 6e 67 44 61 74 61 20 29 7b 0a 20 20 20 20 61  ingData ){.    a
1e190 73 73 65 72 74 28 20 70 2d 3e 70 48 61 73 68 20  ssert( p->pHash 
1e1a0 29 3b 0a 20 20 20 20 70 2d 3e 6e 50 65 6e 64 69  );.    p->nPendi
1e1b0 6e 67 44 61 74 61 20 3d 20 30 3b 0a 20 20 20 20  ngData = 0;.    
1e1c0 66 74 73 35 46 6c 75 73 68 4f 6e 65 48 61 73 68  fts5FlushOneHash
1e1d0 28 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a 69 6e 74  (p);.  }.}...int
1e1e0 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65   sqlite3Fts5Inde
1e1f0 78 4f 70 74 69 6d 69 7a 65 28 46 74 73 35 49 6e  xOptimize(Fts5In
1e200 64 65 78 20 2a 70 29 7b 0a 20 20 46 74 73 35 53  dex *p){.  Fts5S
1e210 74 72 75 63 74 75 72 65 20 2a 70 53 74 72 75 63  tructure *pStruc
1e220 74 3b 0a 20 20 46 74 73 35 53 74 72 75 63 74 75  t;.  Fts5Structu
1e230 72 65 20 2a 70 4e 65 77 20 3d 20 30 3b 0a 20 20  re *pNew = 0;.  
1e240 69 6e 74 20 6e 53 65 67 20 3d 20 30 3b 0a 0a 20  int nSeg = 0;.. 
1e250 20 61 73 73 65 72 74 28 20 70 2d 3e 72 63 3d 3d   assert( p->rc==
1e260 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 66  SQLITE_OK );.  f
1e270 74 73 35 49 6e 64 65 78 46 6c 75 73 68 28 70 29  ts5IndexFlush(p)
1e280 3b 0a 20 20 70 53 74 72 75 63 74 20 3d 20 66 74  ;.  pStruct = ft
1e290 73 35 53 74 72 75 63 74 75 72 65 52 65 61 64 28  s5StructureRead(
1e2a0 70 29 3b 0a 0a 20 20 69 66 28 20 70 53 74 72 75  p);..  if( pStru
1e2b0 63 74 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  ct ){.    assert
1e2c0 28 20 70 53 74 72 75 63 74 2d 3e 6e 53 65 67 6d  ( pStruct->nSegm
1e2d0 65 6e 74 3d 3d 66 74 73 35 53 74 72 75 63 74 75  ent==fts5Structu
1e2e0 72 65 43 6f 75 6e 74 53 65 67 6d 65 6e 74 73 28  reCountSegments(
1e2f0 70 53 74 72 75 63 74 29 20 29 3b 0a 20 20 20 20  pStruct) );.    
1e300 6e 53 65 67 20 3d 20 70 53 74 72 75 63 74 2d 3e  nSeg = pStruct->
1e310 6e 53 65 67 6d 65 6e 74 3b 0a 20 20 20 20 69 66  nSegment;.    if
1e320 28 20 6e 53 65 67 3e 31 20 29 7b 0a 20 20 20 20  ( nSeg>1 ){.    
1e330 20 20 69 6e 74 20 6e 42 79 74 65 20 3d 20 73 69    int nByte = si
1e340 7a 65 6f 66 28 46 74 73 35 53 74 72 75 63 74 75  zeof(Fts5Structu
1e350 72 65 29 3b 0a 20 20 20 20 20 20 6e 42 79 74 65  re);.      nByte
1e360 20 2b 3d 20 28 70 53 74 72 75 63 74 2d 3e 6e 4c   += (pStruct->nL
1e370 65 76 65 6c 2b 31 29 20 2a 20 73 69 7a 65 6f 66  evel+1) * sizeof
1e380 28 46 74 73 35 53 74 72 75 63 74 75 72 65 4c 65  (Fts5StructureLe
1e390 76 65 6c 29 3b 0a 20 20 20 20 20 20 70 4e 65 77  vel);.      pNew
1e3a0 20 3d 20 28 46 74 73 35 53 74 72 75 63 74 75 72   = (Fts5Structur
1e3b0 65 2a 29 73 71 6c 69 74 65 33 46 74 73 35 4d 61  e*)sqlite3Fts5Ma
1e3c0 6c 6c 6f 63 5a 65 72 6f 28 26 70 2d 3e 72 63 2c  llocZero(&p->rc,
1e3d0 20 6e 42 79 74 65 29 3b 0a 20 20 20 20 7d 0a 20   nByte);.    }. 
1e3e0 20 7d 0a 20 20 69 66 28 20 70 4e 65 77 20 29 7b   }.  if( pNew ){
1e3f0 0a 20 20 20 20 46 74 73 35 53 74 72 75 63 74 75  .    Fts5Structu
1e400 72 65 4c 65 76 65 6c 20 2a 70 4c 76 6c 3b 0a 20  reLevel *pLvl;. 
1e410 20 20 20 69 6e 74 20 6e 42 79 74 65 20 3d 20 6e     int nByte = n
1e420 53 65 67 20 2a 20 73 69 7a 65 6f 66 28 46 74 73  Seg * sizeof(Fts
1e430 35 53 74 72 75 63 74 75 72 65 53 65 67 6d 65 6e  5StructureSegmen
1e440 74 29 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 4c  t);.    pNew->nL
1e450 65 76 65 6c 20 3d 20 70 53 74 72 75 63 74 2d 3e  evel = pStruct->
1e460 6e 4c 65 76 65 6c 2b 31 3b 0a 20 20 20 20 70 4e  nLevel+1;.    pN
1e470 65 77 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20  ew->nRef = 1;.  
1e480 20 20 70 4e 65 77 2d 3e 6e 57 72 69 74 65 43 6f    pNew->nWriteCo
1e490 75 6e 74 65 72 20 3d 20 70 53 74 72 75 63 74 2d  unter = pStruct-
1e4a0 3e 6e 57 72 69 74 65 43 6f 75 6e 74 65 72 3b 0a  >nWriteCounter;.
1e4b0 20 20 20 20 70 4c 76 6c 20 3d 20 26 70 4e 65 77      pLvl = &pNew
1e4c0 2d 3e 61 4c 65 76 65 6c 5b 70 53 74 72 75 63 74  ->aLevel[pStruct
1e4d0 2d 3e 6e 4c 65 76 65 6c 5d 3b 0a 20 20 20 20 70  ->nLevel];.    p
1e4e0 4c 76 6c 2d 3e 61 53 65 67 20 3d 20 28 46 74 73  Lvl->aSeg = (Fts
1e4f0 35 53 74 72 75 63 74 75 72 65 53 65 67 6d 65 6e  5StructureSegmen
1e500 74 2a 29 73 71 6c 69 74 65 33 46 74 73 35 4d 61  t*)sqlite3Fts5Ma
1e510 6c 6c 6f 63 5a 65 72 6f 28 26 70 2d 3e 72 63 2c  llocZero(&p->rc,
1e520 20 6e 42 79 74 65 29 3b 0a 20 20 20 20 69 66 28   nByte);.    if(
1e530 20 70 4c 76 6c 2d 3e 61 53 65 67 20 29 7b 0a 20   pLvl->aSeg ){. 
1e540 20 20 20 20 20 69 6e 74 20 69 4c 76 6c 2c 20 69       int iLvl, i
1e550 53 65 67 3b 0a 20 20 20 20 20 20 69 6e 74 20 69  Seg;.      int i
1e560 53 65 67 4f 75 74 20 3d 20 30 3b 0a 20 20 20 20  SegOut = 0;.    
1e570 20 20 66 6f 72 28 69 4c 76 6c 3d 30 3b 20 69 4c    for(iLvl=0; iL
1e580 76 6c 3c 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76  vl<pStruct->nLev
1e590 65 6c 3b 20 69 4c 76 6c 2b 2b 29 7b 0a 20 20 20  el; iLvl++){.   
1e5a0 20 20 20 20 20 66 6f 72 28 69 53 65 67 3d 30 3b       for(iSeg=0;
1e5b0 20 69 53 65 67 3c 70 53 74 72 75 63 74 2d 3e 61   iSeg<pStruct->a
1e5c0 4c 65 76 65 6c 5b 69 4c 76 6c 5d 2e 6e 53 65 67  Level[iLvl].nSeg
1e5d0 3b 20 69 53 65 67 2b 2b 29 7b 0a 20 20 20 20 20  ; iSeg++){.     
1e5e0 20 20 20 20 20 70 4c 76 6c 2d 3e 61 53 65 67 5b       pLvl->aSeg[
1e5f0 69 53 65 67 4f 75 74 5d 20 3d 20 70 53 74 72 75  iSegOut] = pStru
1e600 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d  ct->aLevel[iLvl]
1e610 2e 61 53 65 67 5b 69 53 65 67 5d 3b 0a 20 20 20  .aSeg[iSeg];.   
1e620 20 20 20 20 20 20 20 69 53 65 67 4f 75 74 2b 2b         iSegOut++
1e630 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
1e640 20 20 7d 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e    }.      pNew->
1e650 6e 53 65 67 6d 65 6e 74 20 3d 20 70 4c 76 6c 2d  nSegment = pLvl-
1e660 3e 6e 53 65 67 20 3d 20 6e 53 65 67 3b 0a 20 20  >nSeg = nSeg;.  
1e670 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73    }else{.      s
1e680 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4e 65 77  qlite3_free(pNew
1e690 29 3b 0a 20 20 20 20 20 20 70 4e 65 77 20 3d 20  );.      pNew = 
1e6a0 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  0;.    }.  }..  
1e6b0 69 66 28 20 70 4e 65 77 20 29 7b 0a 20 20 20 20  if( pNew ){.    
1e6c0 69 6e 74 20 69 4c 76 6c 20 3d 20 70 4e 65 77 2d  int iLvl = pNew-
1e6d0 3e 6e 4c 65 76 65 6c 2d 31 3b 0a 20 20 20 20 77  >nLevel-1;.    w
1e6e0 68 69 6c 65 28 20 70 2d 3e 72 63 3d 3d 53 51 4c  hile( p->rc==SQL
1e6f0 49 54 45 5f 4f 4b 20 26 26 20 70 4e 65 77 2d 3e  ITE_OK && pNew->
1e700 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d 2e 6e 53 65  aLevel[iLvl].nSe
1e710 67 3e 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  g>0 ){.      int
1e720 20 6e 52 65 6d 20 3d 20 46 54 53 35 5f 4f 50 54   nRem = FTS5_OPT
1e730 5f 57 4f 52 4b 5f 55 4e 49 54 3b 0a 20 20 20 20  _WORK_UNIT;.    
1e740 20 20 66 74 73 35 49 6e 64 65 78 4d 65 72 67 65    fts5IndexMerge
1e750 4c 65 76 65 6c 28 70 2c 20 26 70 4e 65 77 2c 20  Level(p, &pNew, 
1e760 69 4c 76 6c 2c 20 26 6e 52 65 6d 29 3b 0a 20 20  iLvl, &nRem);.  
1e770 20 20 7d 0a 0a 20 20 20 20 66 74 73 35 53 74 72    }..    fts5Str
1e780 75 63 74 75 72 65 57 72 69 74 65 28 70 2c 20 70  uctureWrite(p, p
1e790 4e 65 77 29 3b 0a 20 20 20 20 66 74 73 35 53 74  New);.    fts5St
1e7a0 72 75 63 74 75 72 65 52 65 6c 65 61 73 65 28 70  ructureRelease(p
1e7b0 4e 65 77 29 3b 0a 20 20 7d 0a 0a 20 20 66 74 73  New);.  }..  fts
1e7c0 35 53 74 72 75 63 74 75 72 65 52 65 6c 65 61 73  5StructureReleas
1e7d0 65 28 70 53 74 72 75 63 74 29 3b 0a 20 20 72 65  e(pStruct);.  re
1e7e0 74 75 72 6e 20 66 74 73 35 49 6e 64 65 78 52 65  turn fts5IndexRe
1e7f0 74 75 72 6e 28 70 29 3b 20 0a 7d 0a 0a 69 6e 74  turn(p); .}..int
1e800 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65   sqlite3Fts5Inde
1e810 78 4d 65 72 67 65 28 46 74 73 35 49 6e 64 65 78  xMerge(Fts5Index
1e820 20 2a 70 2c 20 69 6e 74 20 6e 4d 65 72 67 65 29   *p, int nMerge)
1e830 7b 0a 20 20 46 74 73 35 53 74 72 75 63 74 75 72  {.  Fts5Structur
1e840 65 20 2a 70 53 74 72 75 63 74 3b 0a 0a 20 20 70  e *pStruct;..  p
1e850 53 74 72 75 63 74 20 3d 20 66 74 73 35 53 74 72  Struct = fts5Str
1e860 75 63 74 75 72 65 52 65 61 64 28 70 29 3b 0a 20  uctureRead(p);. 
1e870 20 69 66 28 20 70 53 74 72 75 63 74 20 26 26 20   if( pStruct && 
1e880 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 20  pStruct->nLevel 
1e890 29 7b 0a 20 20 20 20 66 74 73 35 49 6e 64 65 78  ){.    fts5Index
1e8a0 4d 65 72 67 65 28 70 2c 20 26 70 53 74 72 75 63  Merge(p, &pStruc
1e8b0 74 2c 20 6e 4d 65 72 67 65 29 3b 0a 20 20 20 20  t, nMerge);.    
1e8c0 66 74 73 35 53 74 72 75 63 74 75 72 65 57 72 69  fts5StructureWri
1e8d0 74 65 28 70 2c 20 70 53 74 72 75 63 74 29 3b 0a  te(p, pStruct);.
1e8e0 20 20 7d 0a 20 20 66 74 73 35 53 74 72 75 63 74    }.  fts5Struct
1e8f0 75 72 65 52 65 6c 65 61 73 65 28 70 53 74 72 75  ureRelease(pStru
1e900 63 74 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 66  ct);..  return f
1e910 74 73 35 49 6e 64 65 78 52 65 74 75 72 6e 28 70  ts5IndexReturn(p
1e920 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69  );.}..static voi
1e930 64 20 66 74 73 35 50 6f 73 6c 69 73 74 43 61 6c  d fts5PoslistCal
1e940 6c 62 61 63 6b 28 0a 20 20 46 74 73 35 49 6e 64  lback(.  Fts5Ind
1e950 65 78 20 2a 70 2c 20 0a 20 20 76 6f 69 64 20 2a  ex *p, .  void *
1e960 70 43 74 78 2c 20 0a 20 20 63 6f 6e 73 74 20 75  pCtx, .  const u
1e970 38 20 2a 70 43 68 75 6e 6b 2c 20 69 6e 74 20 6e  8 *pChunk, int n
1e980 43 68 75 6e 6b 0a 29 7b 0a 20 20 61 73 73 65 72  Chunk.){.  asser
1e990 74 5f 6e 63 28 20 6e 43 68 75 6e 6b 3e 3d 30 20  t_nc( nChunk>=0 
1e9a0 29 3b 0a 20 20 69 66 28 20 6e 43 68 75 6e 6b 3e  );.  if( nChunk>
1e9b0 30 20 29 7b 0a 20 20 20 20 66 74 73 35 42 75 66  0 ){.    fts5Buf
1e9c0 66 65 72 41 70 70 65 6e 64 42 6c 6f 62 28 26 70  ferAppendBlob(&p
1e9d0 2d 3e 72 63 2c 20 28 46 74 73 35 42 75 66 66 65  ->rc, (Fts5Buffe
1e9e0 72 2a 29 70 43 74 78 2c 20 6e 43 68 75 6e 6b 2c  r*)pCtx, nChunk,
1e9f0 20 70 43 68 75 6e 6b 29 3b 0a 20 20 7d 0a 7d 0a   pChunk);.  }.}.
1ea00 0a 2f 2a 0a 2a 2a 20 49 74 65 72 61 74 6f 72 20  ./*.** Iterator 
1ea10 70 49 74 65 72 20 63 75 72 72 65 6e 74 6c 79 20  pIter currently 
1ea20 70 6f 69 6e 74 73 20 74 6f 20 61 20 76 61 6c 69  points to a vali
1ea30 64 20 65 6e 74 72 79 20 28 6e 6f 74 20 45 4f 46  d entry (not EOF
1ea40 29 2e 20 54 68 69 73 0a 2a 2a 20 66 75 6e 63 74  ). This.** funct
1ea50 69 6f 6e 20 61 70 70 65 6e 64 73 20 74 68 65 20  ion appends the 
1ea60 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74 20 64 61  position list da
1ea70 74 61 20 66 6f 72 20 74 68 65 20 63 75 72 72 65  ta for the curre
1ea80 6e 74 20 65 6e 74 72 79 20 74 6f 0a 2a 2a 20 62  nt entry to.** b
1ea90 75 66 66 65 72 20 70 42 75 66 2e 20 49 74 20 64  uffer pBuf. It d
1eaa0 6f 65 73 20 6e 6f 74 20 6d 61 6b 65 20 61 20 63  oes not make a c
1eab0 6f 70 79 20 6f 66 20 74 68 65 20 70 6f 73 69 74  opy of the posit
1eac0 69 6f 6e 2d 6c 69 73 74 20 73 69 7a 65 0a 2a 2a  ion-list size.**
1ead0 20 66 69 65 6c 64 2e 0a 2a 2f 0a 73 74 61 74 69   field..*/.stati
1eae0 63 20 76 6f 69 64 20 66 74 73 35 53 65 67 69 74  c void fts5Segit
1eaf0 65 72 50 6f 73 6c 69 73 74 28 0a 20 20 46 74 73  erPoslist(.  Fts
1eb00 35 49 6e 64 65 78 20 2a 70 2c 0a 20 20 46 74 73  5Index *p,.  Fts
1eb10 35 53 65 67 49 74 65 72 20 2a 70 53 65 67 2c 0a  5SegIter *pSeg,.
1eb20 20 20 46 74 73 35 42 75 66 66 65 72 20 2a 70 42    Fts5Buffer *pB
1eb30 75 66 0a 29 7b 0a 20 20 66 74 73 35 43 68 75 6e  uf.){.  fts5Chun
1eb40 6b 49 74 65 72 61 74 65 28 70 2c 20 70 53 65 67  kIterate(p, pSeg
1eb50 2c 20 28 76 6f 69 64 2a 29 70 42 75 66 2c 20 66  , (void*)pBuf, f
1eb60 74 73 35 50 6f 73 6c 69 73 74 43 61 6c 6c 62 61  ts5PoslistCallba
1eb70 63 6b 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 74  ck);.}../*.** It
1eb80 65 72 61 74 6f 72 20 70 4d 75 6c 74 69 20 63 75  erator pMulti cu
1eb90 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 73 20 74  rrently points t
1eba0 6f 20 61 20 76 61 6c 69 64 20 65 6e 74 72 79 20  o a valid entry 
1ebb0 28 6e 6f 74 20 45 4f 46 29 2e 20 54 68 69 73 0a  (not EOF). This.
1ebc0 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 61 70 70 65  ** function appe
1ebd0 6e 64 73 20 61 20 63 6f 70 79 20 6f 66 20 74 68  nds a copy of th
1ebe0 65 20 70 6f 73 69 74 69 6f 6e 2d 6c 69 73 74 20  e position-list 
1ebf0 6f 66 20 74 68 65 20 65 6e 74 72 79 20 70 4d 75  of the entry pMu
1ec00 6c 74 69 20 0a 2a 2a 20 63 75 72 72 65 6e 74 6c  lti .** currentl
1ec10 79 20 70 6f 69 6e 74 73 20 74 6f 20 74 6f 20 62  y points to to b
1ec20 75 66 66 65 72 20 70 42 75 66 2e 0a 2a 2a 0a 2a  uffer pBuf..**.*
1ec30 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  * If an error oc
1ec40 63 75 72 73 2c 20 61 6e 20 65 72 72 6f 72 20 63  curs, an error c
1ec50 6f 64 65 20 69 73 20 6c 65 66 74 20 69 6e 20 70  ode is left in p
1ec60 2d 3e 72 63 2e 20 49 74 20 69 73 20 61 73 73 75  ->rc. It is assu
1ec70 6d 65 64 0a 2a 2a 20 6e 6f 20 65 72 72 6f 72 20  med.** no error 
1ec80 68 61 73 20 61 6c 72 65 61 64 79 20 6f 63 63 75  has already occu
1ec90 72 72 65 64 20 77 68 65 6e 20 74 68 69 73 20 66  rred when this f
1eca0 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
1ecb0 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  d..*/.static voi
1ecc0 64 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 50  d fts5MultiIterP
1ecd0 6f 73 6c 69 73 74 28 0a 20 20 46 74 73 35 49 6e  oslist(.  Fts5In
1ece0 64 65 78 20 2a 70 2c 0a 20 20 46 74 73 35 49 6e  dex *p,.  Fts5In
1ecf0 64 65 78 49 74 65 72 20 2a 70 4d 75 6c 74 69 2c  dexIter *pMulti,
1ed00 0a 20 20 69 6e 74 20 62 53 7a 2c 20 20 20 20 20  .  int bSz,     
1ed10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ed20 20 20 20 2f 2a 20 41 70 70 65 6e 64 20 61 20 73     /* Append a s
1ed30 69 7a 65 20 66 69 65 6c 64 20 62 65 66 6f 72 65  ize field before
1ed40 20 74 68 65 20 64 61 74 61 20 2a 2f 0a 20 20 46   the data */.  F
1ed50 74 73 35 42 75 66 66 65 72 20 2a 70 42 75 66 0a  ts5Buffer *pBuf.
1ed60 29 7b 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d  ){.  if( p->rc==
1ed70 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1ed80 20 46 74 73 35 53 65 67 49 74 65 72 20 2a 70 53   Fts5SegIter *pS
1ed90 65 67 20 3d 20 26 70 4d 75 6c 74 69 2d 3e 61 53  eg = &pMulti->aS
1eda0 65 67 5b 20 70 4d 75 6c 74 69 2d 3e 61 46 69 72  eg[ pMulti->aFir
1edb0 73 74 5b 31 5d 2e 69 46 69 72 73 74 20 5d 3b 0a  st[1].iFirst ];.
1edc0 20 20 20 20 61 73 73 65 72 74 28 20 66 74 73 35      assert( fts5
1edd0 4d 75 6c 74 69 49 74 65 72 45 6f 66 28 70 2c 20  MultiIterEof(p, 
1ede0 70 4d 75 6c 74 69 29 3d 3d 30 20 29 3b 0a 0a 20  pMulti)==0 );.. 
1edf0 20 20 20 69 66 28 20 62 53 7a 20 29 7b 0a 20 20     if( bSz ){.  
1ee00 20 20 20 20 2f 2a 20 57 52 49 54 45 50 4f 53 4c      /* WRITEPOSL
1ee10 49 53 54 53 49 5a 45 20 2a 2f 0a 20 20 20 20 20  ISTSIZE */.     
1ee20 20 66 74 73 35 42 75 66 66 65 72 41 70 70 65 6e   fts5BufferAppen
1ee30 64 56 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20  dVarint(&p->rc, 
1ee40 70 42 75 66 2c 20 70 53 65 67 2d 3e 6e 50 6f 73  pBuf, pSeg->nPos
1ee50 2a 32 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66  *2);.    }.    f
1ee60 74 73 35 53 65 67 69 74 65 72 50 6f 73 6c 69 73  ts5SegiterPoslis
1ee70 74 28 70 2c 20 70 53 65 67 2c 20 70 42 75 66 29  t(p, pSeg, pBuf)
1ee80 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63 20  ;.  }.}..static 
1ee90 76 6f 69 64 20 66 74 73 35 44 6f 63 6c 69 73 74  void fts5Doclist
1eea0 49 74 65 72 4e 65 78 74 28 46 74 73 35 44 6f 63  IterNext(Fts5Doc
1eeb0 6c 69 73 74 49 74 65 72 20 2a 70 49 74 65 72 29  listIter *pIter)
1eec0 7b 0a 20 20 69 66 28 20 70 49 74 65 72 2d 3e 69  {.  if( pIter->i
1eed0 3c 70 49 74 65 72 2d 3e 6e 20 29 7b 0a 20 20 20  <pIter->n ){.   
1eee0 20 69 6e 74 20 62 44 75 6d 6d 79 3b 0a 20 20 20   int bDummy;.   
1eef0 20 69 66 28 20 70 49 74 65 72 2d 3e 69 20 29 7b   if( pIter->i ){
1ef00 0a 20 20 20 20 20 20 69 36 34 20 69 44 65 6c 74  .      i64 iDelt
1ef10 61 3b 0a 20 20 20 20 20 20 70 49 74 65 72 2d 3e  a;.      pIter->
1ef20 69 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69  i += fts5GetVari
1ef30 6e 74 28 26 70 49 74 65 72 2d 3e 61 5b 70 49 74  nt(&pIter->a[pIt
1ef40 65 72 2d 3e 69 5d 2c 20 28 75 36 34 2a 29 26 69  er->i], (u64*)&i
1ef50 44 65 6c 74 61 29 3b 0a 20 20 20 20 20 20 70 49  Delta);.      pI
1ef60 74 65 72 2d 3e 69 52 6f 77 69 64 20 2b 3d 20 69  ter->iRowid += i
1ef70 44 65 6c 74 61 3b 0a 20 20 20 20 7d 65 6c 73 65  Delta;.    }else
1ef80 7b 0a 20 20 20 20 20 20 70 49 74 65 72 2d 3e 69  {.      pIter->i
1ef90 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e   += fts5GetVarin
1efa0 74 28 26 70 49 74 65 72 2d 3e 61 5b 70 49 74 65  t(&pIter->a[pIte
1efb0 72 2d 3e 69 5d 2c 20 28 75 36 34 2a 29 26 70 49  r->i], (u64*)&pI
1efc0 74 65 72 2d 3e 69 52 6f 77 69 64 29 3b 0a 20 20  ter->iRowid);.  
1efd0 20 20 7d 0a 20 20 20 20 70 49 74 65 72 2d 3e 69    }.    pIter->i
1efe0 20 2b 3d 20 66 74 73 35 47 65 74 50 6f 73 6c 69   += fts5GetPosli
1eff0 73 74 53 69 7a 65 28 0a 20 20 20 20 20 20 20 20  stSize(.        
1f000 26 70 49 74 65 72 2d 3e 61 5b 70 49 74 65 72 2d  &pIter->a[pIter-
1f010 3e 69 5d 2c 20 26 70 49 74 65 72 2d 3e 6e 50 6f  >i], &pIter->nPo
1f020 73 6c 69 73 74 2c 20 26 62 44 75 6d 6d 79 0a 20  slist, &bDummy. 
1f030 20 20 20 29 3b 0a 20 20 20 20 70 49 74 65 72 2d     );.    pIter-
1f040 3e 61 50 6f 73 6c 69 73 74 20 3d 20 26 70 49 74  >aPoslist = &pIt
1f050 65 72 2d 3e 61 5b 70 49 74 65 72 2d 3e 69 5d 3b  er->a[pIter->i];
1f060 0a 20 20 20 20 70 49 74 65 72 2d 3e 69 20 2b 3d  .    pIter->i +=
1f070 20 70 49 74 65 72 2d 3e 6e 50 6f 73 6c 69 73 74   pIter->nPoslist
1f080 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
1f090 49 74 65 72 2d 3e 61 50 6f 73 6c 69 73 74 20 3d  Iter->aPoslist =
1f0a0 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69   0;.  }.}..stati
1f0b0 63 20 76 6f 69 64 20 66 74 73 35 44 6f 63 6c 69  c void fts5Docli
1f0c0 73 74 49 74 65 72 49 6e 69 74 28 0a 20 20 46 74  stIterInit(.  Ft
1f0d0 73 35 42 75 66 66 65 72 20 2a 70 42 75 66 2c 20  s5Buffer *pBuf, 
1f0e0 0a 20 20 46 74 73 35 44 6f 63 6c 69 73 74 49 74  .  Fts5DoclistIt
1f0f0 65 72 20 2a 70 49 74 65 72 0a 29 7b 0a 20 20 6d  er *pIter.){.  m
1f100 65 6d 73 65 74 28 70 49 74 65 72 2c 20 30 2c 20  emset(pIter, 0, 
1f110 73 69 7a 65 6f 66 28 2a 70 49 74 65 72 29 29 3b  sizeof(*pIter));
1f120 0a 20 20 70 49 74 65 72 2d 3e 61 20 3d 20 70 42  .  pIter->a = pB
1f130 75 66 2d 3e 70 3b 0a 20 20 70 49 74 65 72 2d 3e  uf->p;.  pIter->
1f140 6e 20 3d 20 70 42 75 66 2d 3e 6e 3b 0a 20 20 66  n = pBuf->n;.  f
1f150 74 73 35 44 6f 63 6c 69 73 74 49 74 65 72 4e 65  ts5DoclistIterNe
1f160 78 74 28 70 49 74 65 72 29 3b 0a 7d 0a 0a 2f 2a  xt(pIter);.}../*
1f170 0a 2a 2a 20 41 70 70 65 6e 64 20 61 20 64 6f 63  .** Append a doc
1f180 6c 69 73 74 20 74 6f 20 62 75 66 66 65 72 20 70  list to buffer p
1f190 42 75 66 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  Buf..*/.static v
1f1a0 6f 69 64 20 66 74 73 35 4d 65 72 67 65 41 70 70  oid fts5MergeApp
1f1b0 65 6e 64 44 6f 63 69 64 28 0a 20 20 69 6e 74 20  endDocid(.  int 
1f1c0 2a 70 52 63 2c 20 20 20 20 20 20 20 20 20 20 20  *pRc,           
1f1d0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
1f1e0 4e 2f 4f 55 54 3a 20 45 72 72 6f 72 20 63 6f 64  N/OUT: Error cod
1f1f0 65 20 2a 2f 0a 20 20 46 74 73 35 42 75 66 66 65  e */.  Fts5Buffe
1f200 72 20 2a 70 42 75 66 2c 20 20 20 20 20 20 20 20  r *pBuf,        
1f210 20 20 20 20 20 20 20 2f 2a 20 42 75 66 66 65 72         /* Buffer
1f220 20 74 6f 20 77 72 69 74 65 20 74 6f 20 2a 2f 0a   to write to */.
1f230 20 20 69 36 34 20 2a 70 69 4c 61 73 74 52 6f 77    i64 *piLastRow
1f240 69 64 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  id,             
1f250 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 50 72 65    /* IN/OUT: Pre
1f260 76 69 6f 75 73 20 72 6f 77 69 64 20 77 72 69 74  vious rowid writ
1f270 74 65 6e 20 28 69 66 20 61 6e 79 29 20 2a 2f 0a  ten (if any) */.
1f280 20 20 69 36 34 20 69 52 6f 77 69 64 20 20 20 20    i64 iRowid    
1f290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f2a0 20 20 2f 2a 20 52 6f 77 69 64 20 74 6f 20 61 70    /* Rowid to ap
1f2b0 70 65 6e 64 20 2a 2f 0a 29 7b 0a 20 20 69 66 28  pend */.){.  if(
1f2c0 20 70 42 75 66 2d 3e 6e 3d 3d 30 20 29 7b 0a 20   pBuf->n==0 ){. 
1f2d0 20 20 20 66 74 73 35 42 75 66 66 65 72 41 70 70     fts5BufferApp
1f2e0 65 6e 64 56 61 72 69 6e 74 28 70 52 63 2c 20 70  endVarint(pRc, p
1f2f0 42 75 66 2c 20 69 52 6f 77 69 64 29 3b 0a 20 20  Buf, iRowid);.  
1f300 7d 65 6c 73 65 7b 0a 20 20 20 20 66 74 73 35 42  }else{.    fts5B
1f310 75 66 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e  ufferAppendVarin
1f320 74 28 70 52 63 2c 20 70 42 75 66 2c 20 69 52 6f  t(pRc, pBuf, iRo
1f330 77 69 64 20 2d 20 2a 70 69 4c 61 73 74 52 6f 77  wid - *piLastRow
1f340 69 64 29 3b 0a 20 20 7d 0a 20 20 2a 70 69 4c 61  id);.  }.  *piLa
1f350 73 74 52 6f 77 69 64 20 3d 20 69 52 6f 77 69 64  stRowid = iRowid
1f360 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42 75 66 66 65  ;.}../*.** Buffe
1f370 72 73 20 70 31 20 61 6e 64 20 70 32 20 63 6f 6e  rs p1 and p2 con
1f380 74 61 69 6e 20 64 6f 63 6c 69 73 74 73 2e 20 54  tain doclists. T
1f390 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 65 72  his function mer
1f3a0 67 65 73 20 74 68 65 20 63 6f 6e 74 65 6e 74 0a  ges the content.
1f3b0 2a 2a 20 6f 66 20 74 68 65 20 74 77 6f 20 64 6f  ** of the two do
1f3c0 63 6c 69 73 74 73 20 74 6f 67 65 74 68 65 72 20  clists together 
1f3d0 61 6e 64 20 73 65 74 73 20 62 75 66 66 65 72 20  and sets buffer 
1f3e0 70 31 20 74 6f 20 74 68 65 20 72 65 73 75 6c 74  p1 to the result
1f3f0 20 62 65 66 6f 72 65 0a 2a 2a 20 72 65 74 75 72   before.** retur
1f400 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  ning..**.** If a
1f410 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  n error occurs, 
1f420 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  an error code is
1f430 20 6c 65 66 74 20 69 6e 20 70 2d 3e 72 63 2e 20   left in p->rc. 
1f440 49 66 20 61 6e 20 65 72 72 6f 72 20 68 61 73 0a  If an error has.
1f450 2a 2a 20 61 6c 72 65 61 64 79 20 6f 63 63 75 72  ** already occur
1f460 72 65 64 2c 20 74 68 69 73 20 66 75 6e 63 74 69  red, this functi
1f470 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a  on is a no-op..*
1f480 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  /.static void ft
1f490 73 35 4d 65 72 67 65 50 72 65 66 69 78 4c 69 73  s5MergePrefixLis
1f4a0 74 73 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20  ts(.  Fts5Index 
1f4b0 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  *p,             
1f4c0 20 20 20 20 20 20 2f 2a 20 46 54 53 35 20 62 61        /* FTS5 ba
1f4d0 63 6b 65 6e 64 20 6f 62 6a 65 63 74 20 2a 2f 0a  ckend object */.
1f4e0 20 20 46 74 73 35 42 75 66 66 65 72 20 2a 70 31    Fts5Buffer *p1
1f4f0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1f500 20 20 2f 2a 20 46 69 72 73 74 20 6c 69 73 74 20    /* First list 
1f510 74 6f 20 6d 65 72 67 65 20 2a 2f 0a 20 20 46 74  to merge */.  Ft
1f520 73 35 42 75 66 66 65 72 20 2a 70 32 20 20 20 20  s5Buffer *p2    
1f530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1f540 20 53 65 63 6f 6e 64 20 6c 69 73 74 20 74 6f 20   Second list to 
1f550 6d 65 72 67 65 20 2a 2f 0a 29 7b 0a 20 20 69 66  merge */.){.  if
1f560 28 20 70 32 2d 3e 6e 20 29 7b 0a 20 20 20 20 69  ( p2->n ){.    i
1f570 36 34 20 69 4c 61 73 74 52 6f 77 69 64 20 3d 20  64 iLastRowid = 
1f580 30 3b 0a 20 20 20 20 46 74 73 35 44 6f 63 6c 69  0;.    Fts5Docli
1f590 73 74 49 74 65 72 20 69 31 3b 0a 20 20 20 20 46  stIter i1;.    F
1f5a0 74 73 35 44 6f 63 6c 69 73 74 49 74 65 72 20 69  ts5DoclistIter i
1f5b0 32 3b 0a 20 20 20 20 46 74 73 35 42 75 66 66 65  2;.    Fts5Buffe
1f5c0 72 20 6f 75 74 3b 0a 20 20 20 20 46 74 73 35 42  r out;.    Fts5B
1f5d0 75 66 66 65 72 20 74 6d 70 3b 0a 20 20 20 20 6d  uffer tmp;.    m
1f5e0 65 6d 73 65 74 28 26 6f 75 74 2c 20 30 2c 20 73  emset(&out, 0, s
1f5f0 69 7a 65 6f 66 28 6f 75 74 29 29 3b 0a 20 20 20  izeof(out));.   
1f600 20 6d 65 6d 73 65 74 28 26 74 6d 70 2c 20 30 2c   memset(&tmp, 0,
1f610 20 73 69 7a 65 6f 66 28 74 6d 70 29 29 3b 0a 0a   sizeof(tmp));..
1f620 20 20 20 20 66 74 73 35 44 6f 63 6c 69 73 74 49      fts5DoclistI
1f630 74 65 72 49 6e 69 74 28 70 31 2c 20 26 69 31 29  terInit(p1, &i1)
1f640 3b 0a 20 20 20 20 66 74 73 35 44 6f 63 6c 69 73  ;.    fts5Doclis
1f650 74 49 74 65 72 49 6e 69 74 28 70 32 2c 20 26 69  tIterInit(p2, &i
1f660 32 29 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 70  2);.    while( p
1f670 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
1f680 26 26 20 28 69 31 2e 61 50 6f 73 6c 69 73 74 21  && (i1.aPoslist!
1f690 3d 30 20 7c 7c 20 69 32 2e 61 50 6f 73 6c 69 73  =0 || i2.aPoslis
1f6a0 74 21 3d 30 29 20 29 7b 0a 20 20 20 20 20 20 69  t!=0) ){.      i
1f6b0 66 28 20 69 32 2e 61 50 6f 73 6c 69 73 74 3d 3d  f( i2.aPoslist==
1f6c0 30 20 7c 7c 20 28 69 31 2e 61 50 6f 73 6c 69 73  0 || (i1.aPoslis
1f6d0 74 20 26 26 20 69 31 2e 69 52 6f 77 69 64 3c 69  t && i1.iRowid<i
1f6e0 32 2e 69 52 6f 77 69 64 29 20 29 7b 0a 20 20 20  2.iRowid) ){.   
1f6f0 20 20 20 20 20 2f 2a 20 43 6f 70 79 20 65 6e 74       /* Copy ent
1f700 72 79 20 66 72 6f 6d 20 69 31 20 2a 2f 0a 20 20  ry from i1 */.  
1f710 20 20 20 20 20 20 66 74 73 35 4d 65 72 67 65 41        fts5MergeA
1f720 70 70 65 6e 64 44 6f 63 69 64 28 26 70 2d 3e 72  ppendDocid(&p->r
1f730 63 2c 20 26 6f 75 74 2c 20 26 69 4c 61 73 74 52  c, &out, &iLastR
1f740 6f 77 69 64 2c 20 69 31 2e 69 52 6f 77 69 64 29  owid, i1.iRowid)
1f750 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 57 52 49  ;.        /* WRI
1f760 54 45 50 4f 53 4c 49 53 54 53 49 5a 45 20 2a 2f  TEPOSLISTSIZE */
1f770 0a 20 20 20 20 20 20 20 20 66 74 73 35 42 75 66  .        fts5Buf
1f780 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e 74 28  ferAppendVarint(
1f790 26 70 2d 3e 72 63 2c 20 26 6f 75 74 2c 20 69 31  &p->rc, &out, i1
1f7a0 2e 6e 50 6f 73 6c 69 73 74 20 2a 20 32 29 3b 0a  .nPoslist * 2);.
1f7b0 20 20 20 20 20 20 20 20 66 74 73 35 42 75 66 66          fts5Buff
1f7c0 65 72 41 70 70 65 6e 64 42 6c 6f 62 28 26 70 2d  erAppendBlob(&p-
1f7d0 3e 72 63 2c 20 26 6f 75 74 2c 20 69 31 2e 6e 50  >rc, &out, i1.nP
1f7e0 6f 73 6c 69 73 74 2c 20 69 31 2e 61 50 6f 73 6c  oslist, i1.aPosl
1f7f0 69 73 74 29 3b 0a 20 20 20 20 20 20 20 20 66 74  ist);.        ft
1f800 73 35 44 6f 63 6c 69 73 74 49 74 65 72 4e 65 78  s5DoclistIterNex
1f810 74 28 26 69 31 29 3b 0a 20 20 20 20 20 20 7d 0a  t(&i1);.      }.
1f820 20 20 20 20 20 20 65 6c 73 65 20 69 66 28 20 69        else if( i
1f830 31 2e 61 50 6f 73 6c 69 73 74 3d 3d 30 20 7c 7c  1.aPoslist==0 ||
1f840 20 69 32 2e 69 52 6f 77 69 64 21 3d 69 31 2e 69   i2.iRowid!=i1.i
1f850 52 6f 77 69 64 20 29 7b 0a 20 20 20 20 20 20 20  Rowid ){.       
1f860 20 2f 2a 20 43 6f 70 79 20 65 6e 74 72 79 20 66   /* Copy entry f
1f870 72 6f 6d 20 69 32 20 2a 2f 0a 20 20 20 20 20 20  rom i2 */.      
1f880 20 20 66 74 73 35 4d 65 72 67 65 41 70 70 65 6e    fts5MergeAppen
1f890 64 44 6f 63 69 64 28 26 70 2d 3e 72 63 2c 20 26  dDocid(&p->rc, &
1f8a0 6f 75 74 2c 20 26 69 4c 61 73 74 52 6f 77 69 64  out, &iLastRowid
1f8b0 2c 20 69 32 2e 69 52 6f 77 69 64 29 3b 0a 20 20  , i2.iRowid);.  
1f8c0 20 20 20 20 20 20 2f 2a 20 57 52 49 54 45 50 4f        /* WRITEPO
1f8d0 53 4c 49 53 54 53 49 5a 45 20 2a 2f 0a 20 20 20  SLISTSIZE */.   
1f8e0 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72 41       fts5BufferA
1f8f0 70 70 65 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e  ppendVarint(&p->
1f900 72 63 2c 20 26 6f 75 74 2c 20 69 32 2e 6e 50 6f  rc, &out, i2.nPo
1f910 73 6c 69 73 74 20 2a 20 32 29 3b 0a 20 20 20 20  slist * 2);.    
1f920 20 20 20 20 66 74 73 35 42 75 66 66 65 72 41 70      fts5BufferAp
1f930 70 65 6e 64 42 6c 6f 62 28 26 70 2d 3e 72 63 2c  pendBlob(&p->rc,
1f940 20 26 6f 75 74 2c 20 69 32 2e 6e 50 6f 73 6c 69   &out, i2.nPosli
1f950 73 74 2c 20 69 32 2e 61 50 6f 73 6c 69 73 74 29  st, i2.aPoslist)
1f960 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35 44 6f  ;.        fts5Do
1f970 63 6c 69 73 74 49 74 65 72 4e 65 78 74 28 26 69  clistIterNext(&i
1f980 32 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  2);.      }.    
1f990 20 20 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20    else{.        
1f9a0 46 74 73 35 50 6f 73 6c 69 73 74 52 65 61 64 65  Fts5PoslistReade
1f9b0 72 20 72 31 3b 0a 20 20 20 20 20 20 20 20 46 74  r r1;.        Ft
1f9c0 73 35 50 6f 73 6c 69 73 74 52 65 61 64 65 72 20  s5PoslistReader 
1f9d0 72 32 3b 0a 20 20 20 20 20 20 20 20 46 74 73 35  r2;.        Fts5
1f9e0 50 6f 73 6c 69 73 74 57 72 69 74 65 72 20 77 72  PoslistWriter wr
1f9f0 69 74 65 72 3b 0a 0a 20 20 20 20 20 20 20 20 6d  iter;..        m
1fa00 65 6d 73 65 74 28 26 77 72 69 74 65 72 2c 20 30  emset(&writer, 0
1fa10 2c 20 73 69 7a 65 6f 66 28 77 72 69 74 65 72 29  , sizeof(writer)
1fa20 29 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 4d  );..        /* M
1fa30 65 72 67 65 20 74 68 65 20 74 77 6f 20 70 6f 73  erge the two pos
1fa40 69 74 69 6f 6e 20 6c 69 73 74 73 2e 20 2a 2f 20  ition lists. */ 
1fa50 0a 20 20 20 20 20 20 20 20 66 74 73 35 4d 65 72  .        fts5Mer
1fa60 67 65 41 70 70 65 6e 64 44 6f 63 69 64 28 26 70  geAppendDocid(&p
1fa70 2d 3e 72 63 2c 20 26 6f 75 74 2c 20 26 69 4c 61  ->rc, &out, &iLa
1fa80 73 74 52 6f 77 69 64 2c 20 69 32 2e 69 52 6f 77  stRowid, i2.iRow
1fa90 69 64 29 3b 0a 20 20 20 20 20 20 20 20 66 74 73  id);.        fts
1faa0 35 42 75 66 66 65 72 5a 65 72 6f 28 26 74 6d 70  5BufferZero(&tmp
1fab0 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
1fac0 65 33 46 74 73 35 50 6f 73 6c 69 73 74 52 65 61  e3Fts5PoslistRea
1fad0 64 65 72 49 6e 69 74 28 2d 31 2c 20 69 31 2e 61  derInit(-1, i1.a
1fae0 50 6f 73 6c 69 73 74 2c 20 69 31 2e 6e 50 6f 73  Poslist, i1.nPos
1faf0 6c 69 73 74 2c 20 26 72 31 29 3b 0a 20 20 20 20  list, &r1);.    
1fb00 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 50      sqlite3Fts5P
1fb10 6f 73 6c 69 73 74 52 65 61 64 65 72 49 6e 69 74  oslistReaderInit
1fb20 28 2d 31 2c 20 69 32 2e 61 50 6f 73 6c 69 73 74  (-1, i2.aPoslist
1fb30 2c 20 69 32 2e 6e 50 6f 73 6c 69 73 74 2c 20 26  , i2.nPoslist, &
1fb40 72 32 29 3b 0a 20 20 20 20 20 20 20 20 77 68 69  r2);.        whi
1fb50 6c 65 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  le( p->rc==SQLIT
1fb60 45 5f 4f 4b 20 26 26 20 28 72 31 2e 62 45 6f 66  E_OK && (r1.bEof
1fb70 3d 3d 30 20 7c 7c 20 72 32 2e 62 45 6f 66 3d 3d  ==0 || r2.bEof==
1fb80 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  0) ){.          
1fb90 69 36 34 20 69 4e 65 77 3b 0a 20 20 20 20 20 20  i64 iNew;.      
1fba0 20 20 20 20 69 66 28 20 72 32 2e 62 45 6f 66 20      if( r2.bEof 
1fbb0 7c 7c 20 28 72 31 2e 62 45 6f 66 3d 3d 30 20 26  || (r1.bEof==0 &
1fbc0 26 20 72 31 2e 69 50 6f 73 3c 72 32 2e 69 50 6f  & r1.iPos<r2.iPo
1fbd0 73 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  s) ){.          
1fbe0 20 20 69 4e 65 77 20 3d 20 72 31 2e 69 50 6f 73    iNew = r1.iPos
1fbf0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  ;.            sq
1fc00 6c 69 74 65 33 46 74 73 35 50 6f 73 6c 69 73 74  lite3Fts5Poslist
1fc10 52 65 61 64 65 72 4e 65 78 74 28 26 72 31 29 3b  ReaderNext(&r1);
1fc20 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65  .          }else
1fc30 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 4e  {.            iN
1fc40 65 77 20 3d 20 72 32 2e 69 50 6f 73 3b 0a 20 20  ew = r2.iPos;.  
1fc50 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
1fc60 33 46 74 73 35 50 6f 73 6c 69 73 74 52 65 61 64  3Fts5PoslistRead
1fc70 65 72 4e 65 78 74 28 26 72 32 29 3b 0a 20 20 20  erNext(&r2);.   
1fc80 20 20 20 20 20 20 20 20 20 69 66 28 20 72 31 2e           if( r1.
1fc90 69 50 6f 73 3d 3d 72 32 2e 69 50 6f 73 20 29 20  iPos==r2.iPos ) 
1fca0 73 71 6c 69 74 65 33 46 74 73 35 50 6f 73 6c 69  sqlite3Fts5Posli
1fcb0 73 74 52 65 61 64 65 72 4e 65 78 74 28 26 72 31  stReaderNext(&r1
1fcc0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
1fcd0 20 20 20 20 20 20 20 20 20 70 2d 3e 72 63 20 3d           p->rc =
1fce0 20 73 71 6c 69 74 65 33 46 74 73 35 50 6f 73 6c   sqlite3Fts5Posl
1fcf0 69 73 74 57 72 69 74 65 72 41 70 70 65 6e 64 28  istWriterAppend(
1fd00 26 74 6d 70 2c 20 26 77 72 69 74 65 72 2c 20 69  &tmp, &writer, i
1fd10 4e 65 77 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  New);.        }.
1fd20 0a 20 20 20 20 20 20 20 20 2f 2a 20 57 52 49 54  .        /* WRIT
1fd30 45 50 4f 53 4c 49 53 54 53 49 5a 45 20 2a 2f 0a  EPOSLISTSIZE */.
1fd40 20 20 20 20 20 20 20 20 66 74 73 35 42 75 66 66          fts5Buff
1fd50 65 72 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26  erAppendVarint(&
1fd60 70 2d 3e 72 63 2c 20 26 6f 75 74 2c 20 74 6d 70  p->rc, &out, tmp
1fd70 2e 6e 20 2a 20 32 29 3b 0a 20 20 20 20 20 20 20  .n * 2);.       
1fd80 20 66 74 73 35 42 75 66 66 65 72 41 70 70 65 6e   fts5BufferAppen
1fd90 64 42 6c 6f 62 28 26 70 2d 3e 72 63 2c 20 26 6f  dBlob(&p->rc, &o
1fda0 75 74 2c 20 74 6d 70 2e 6e 2c 20 74 6d 70 2e 70  ut, tmp.n, tmp.p
1fdb0 29 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35 44  );.        fts5D
1fdc0 6f 63 6c 69 73 74 49 74 65 72 4e 65 78 74 28 26  oclistIterNext(&
1fdd0 69 31 29 3b 0a 20 20 20 20 20 20 20 20 66 74 73  i1);.        fts
1fde0 35 44 6f 63 6c 69 73 74 49 74 65 72 4e 65 78 74  5DoclistIterNext
1fdf0 28 26 69 32 29 3b 0a 20 20 20 20 20 20 7d 0a 20  (&i2);.      }. 
1fe00 20 20 20 7d 0a 0a 20 20 20 20 66 74 73 35 42 75     }..    fts5Bu
1fe10 66 66 65 72 53 65 74 28 26 70 2d 3e 72 63 2c 20  fferSet(&p->rc, 
1fe20 70 31 2c 20 6f 75 74 2e 6e 2c 20 6f 75 74 2e 70  p1, out.n, out.p
1fe30 29 3b 0a 20 20 20 20 66 74 73 35 42 75 66 66 65  );.    fts5Buffe
1fe40 72 46 72 65 65 28 26 74 6d 70 29 3b 0a 20 20 20  rFree(&tmp);.   
1fe50 20 66 74 73 35 42 75 66 66 65 72 46 72 65 65 28   fts5BufferFree(
1fe60 26 6f 75 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 73 74  &out);.  }.}..st
1fe70 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 42 75  atic void fts5Bu
1fe80 66 66 65 72 53 77 61 70 28 46 74 73 35 42 75 66  fferSwap(Fts5Buf
1fe90 66 65 72 20 2a 70 31 2c 20 46 74 73 35 42 75 66  fer *p1, Fts5Buf
1fea0 66 65 72 20 2a 70 32 29 7b 0a 20 20 46 74 73 35  fer *p2){.  Fts5
1feb0 42 75 66 66 65 72 20 74 6d 70 20 3d 20 2a 70 31  Buffer tmp = *p1
1fec0 3b 0a 20 20 2a 70 31 20 3d 20 2a 70 32 3b 0a 20  ;.  *p1 = *p2;. 
1fed0 20 2a 70 32 20 3d 20 74 6d 70 3b 0a 7d 0a 0a 73   *p2 = tmp;.}..s
1fee0 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 53  tatic void fts5S
1fef0 65 74 75 70 50 72 65 66 69 78 49 74 65 72 28 0a  etupPrefixIter(.
1ff00 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20    Fts5Index *p, 
1ff10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ff20 20 20 2f 2a 20 49 6e 64 65 78 20 74 6f 20 72 65    /* Index to re
1ff30 61 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74  ad from */.  int
1ff40 20 62 44 65 73 63 2c 20 20 20 20 20 20 20 20 20   bDesc,         
1ff50 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1ff60 54 72 75 65 20 66 6f 72 20 22 4f 52 44 45 52 20  True for "ORDER 
1ff70 42 59 20 72 6f 77 69 64 20 44 45 53 43 22 20 2a  BY rowid DESC" *
1ff80 2f 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 70 54  /.  const u8 *pT
1ff90 6f 6b 65 6e 2c 20 20 20 20 20 20 20 20 20 20 20  oken,           
1ffa0 20 20 20 20 2f 2a 20 42 75 66 66 65 72 20 63 6f      /* Buffer co
1ffb0 6e 74 61 69 6e 69 6e 67 20 70 72 65 66 69 78 20  ntaining prefix 
1ffc0 74 6f 20 6d 61 74 63 68 20 2a 2f 0a 20 20 69 6e  to match */.  in
1ffd0 74 20 6e 54 6f 6b 65 6e 2c 20 20 20 20 20 20 20  t nToken,       
1ffe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1fff0 20 53 69 7a 65 20 6f 66 20 62 75 66 66 65 72 20   Size of buffer 
20000 70 54 6f 6b 65 6e 20 69 6e 20 62 79 74 65 73 20  pToken in bytes 
20010 2a 2f 0a 20 20 46 74 73 35 49 6e 64 65 78 49 74  */.  Fts5IndexIt
20020 65 72 20 2a 2a 70 70 49 74 65 72 20 20 20 20 20  er **ppIter     
20030 20 20 2f 2a 20 4f 55 54 3a 20 4e 65 77 20 69 74    /* OUT: New it
20040 65 72 61 74 6f 72 20 2a 2f 0a 29 7b 0a 20 20 46  erator */.){.  F
20050 74 73 35 53 74 72 75 63 74 75 72 65 20 2a 70 53  ts5Structure *pS
20060 74 72 75 63 74 3b 0a 20 20 46 74 73 35 42 75 66  truct;.  Fts5Buf
20070 66 65 72 20 2a 61 42 75 66 3b 0a 20 20 63 6f 6e  fer *aBuf;.  con
20080 73 74 20 69 6e 74 20 6e 42 75 66 20 3d 20 33 32  st int nBuf = 32
20090 3b 0a 0a 20 20 61 42 75 66 20 3d 20 28 46 74 73  ;..  aBuf = (Fts
200a0 35 42 75 66 66 65 72 2a 29 66 74 73 35 49 64 78  5Buffer*)fts5Idx
200b0 4d 61 6c 6c 6f 63 28 70 2c 20 73 69 7a 65 6f 66  Malloc(p, sizeof
200c0 28 46 74 73 35 42 75 66 66 65 72 29 2a 6e 42 75  (Fts5Buffer)*nBu
200d0 66 29 3b 0a 20 20 70 53 74 72 75 63 74 20 3d 20  f);.  pStruct = 
200e0 66 74 73 35 53 74 72 75 63 74 75 72 65 52 65 61  fts5StructureRea
200f0 64 28 70 29 3b 0a 0a 20 20 69 66 28 20 61 42 75  d(p);..  if( aBu
20100 66 20 26 26 20 70 53 74 72 75 63 74 20 29 7b 0a  f && pStruct ){.
20110 20 20 20 20 63 6f 6e 73 74 20 69 6e 74 20 66 6c      const int fl
20120 61 67 73 20 3d 20 46 54 53 35 49 4e 44 45 58 5f  ags = FTS5INDEX_
20130 51 55 45 52 59 5f 53 43 41 4e 3b 0a 20 20 20 20  QUERY_SCAN;.    
20140 69 6e 74 20 69 3b 0a 20 20 20 20 69 36 34 20 69  int i;.    i64 i
20150 4c 61 73 74 52 6f 77 69 64 20 3d 20 30 3b 0a 20  LastRowid = 0;. 
20160 20 20 20 46 74 73 35 49 6e 64 65 78 49 74 65 72     Fts5IndexIter
20170 20 2a 70 31 20 3d 20 30 3b 20 20 20 20 20 2f 2a   *p1 = 0;     /*
20180 20 49 74 65 72 61 74 6f 72 20 75 73 65 64 20 74   Iterator used t
20190 6f 20 67 61 74 68 65 72 20 64 61 74 61 20 66 72  o gather data fr
201a0 6f 6d 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20  om index */.    
201b0 46 74 73 35 44 61 74 61 20 2a 70 44 61 74 61 3b  Fts5Data *pData;
201c0 0a 20 20 20 20 46 74 73 35 42 75 66 66 65 72 20  .    Fts5Buffer 
201d0 64 6f 63 6c 69 73 74 3b 0a 0a 20 20 20 20 6d 65  doclist;..    me
201e0 6d 73 65 74 28 26 64 6f 63 6c 69 73 74 2c 20 30  mset(&doclist, 0
201f0 2c 20 73 69 7a 65 6f 66 28 64 6f 63 6c 69 73 74  , sizeof(doclist
20200 29 29 3b 0a 20 20 20 20 66 6f 72 28 66 74 73 35  ));.    for(fts5
20210 4d 75 6c 74 69 49 74 65 72 4e 65 77 28 70 2c 20  MultiIterNew(p, 
20220 70 53 74 72 75 63 74 2c 20 31 2c 20 66 6c 61 67  pStruct, 1, flag
20230 73 2c 20 70 54 6f 6b 65 6e 2c 20 6e 54 6f 6b 65  s, pToken, nToke
20240 6e 2c 20 2d 31 2c 20 30 2c 20 26 70 31 29 3b 0a  n, -1, 0, &p1);.
20250 20 20 20 20 20 20 20 20 66 74 73 35 4d 75 6c 74          fts5Mult
20260 69 49 74 65 72 45 6f 66 28 70 2c 20 70 31 29 3d  iIterEof(p, p1)=
20270 3d 30 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35  =0;.        fts5
20280 4d 75 6c 74 69 49 74 65 72 4e 65 78 74 28 70 2c  MultiIterNext(p,
20290 20 70 31 2c 20 30 2c 20 30 29 0a 20 20 20 20 29   p1, 0, 0).    )
202a0 7b 0a 20 20 20 20 20 20 69 36 34 20 69 52 6f 77  {.      i64 iRow
202b0 69 64 20 3d 20 66 74 73 35 4d 75 6c 74 69 49 74  id = fts5MultiIt
202c0 65 72 52 6f 77 69 64 28 70 31 29 3b 0a 20 20 20  erRowid(p1);.   
202d0 20 20 20 69 6e 74 20 6e 54 65 72 6d 3b 0a 20 20     int nTerm;.  
202e0 20 20 20 20 63 6f 6e 73 74 20 75 38 20 2a 70 54      const u8 *pT
202f0 65 72 6d 20 3d 20 66 74 73 35 4d 75 6c 74 69 49  erm = fts5MultiI
20300 74 65 72 54 65 72 6d 28 70 31 2c 20 26 6e 54 65  terTerm(p1, &nTe
20310 72 6d 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  rm);.      asser
20320 74 28 20 6d 65 6d 63 6d 70 28 70 54 6f 6b 65 6e  t( memcmp(pToken
20330 2c 20 70 54 65 72 6d 2c 20 4d 49 4e 28 6e 54 6f  , pTerm, MIN(nTo
20340 6b 65 6e 2c 20 6e 54 65 72 6d 29 29 3c 3d 30 20  ken, nTerm))<=0 
20350 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 54 65  );.      if( nTe
20360 72 6d 3c 6e 54 6f 6b 65 6e 20 7c 7c 20 6d 65 6d  rm<nToken || mem
20370 63 6d 70 28 70 54 6f 6b 65 6e 2c 20 70 54 65 72  cmp(pToken, pTer
20380 6d 2c 20 6e 54 6f 6b 65 6e 29 20 29 20 62 72 65  m, nToken) ) bre
20390 61 6b 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 64  ak;..      if( d
203a0 6f 63 6c 69 73 74 2e 6e 3e 30 20 26 26 20 69 52  oclist.n>0 && iR
203b0 6f 77 69 64 3c 3d 69 4c 61 73 74 52 6f 77 69 64  owid<=iLastRowid
203c0 20 29 7b 0a 20 20 20 20 20 20 20 20 66 6f 72 28   ){.        for(
203d0 69 3d 30 3b 20 70 2d 3e 72 63 3d 3d 53 51 4c 49  i=0; p->rc==SQLI
203e0 54 45 5f 4f 4b 20 26 26 20 64 6f 63 6c 69 73 74  TE_OK && doclist
203f0 2e 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  .n; i++){.      
20400 20 20 20 20 61 73 73 65 72 74 28 20 69 3c 6e 42      assert( i<nB
20410 75 66 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  uf );.          
20420 69 66 28 20 61 42 75 66 5b 69 5d 2e 6e 3d 3d 30  if( aBuf[i].n==0
20430 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
20440 66 74 73 35 42 75 66 66 65 72 53 77 61 70 28 26  fts5BufferSwap(&
20450 64 6f 63 6c 69 73 74 2c 20 26 61 42 75 66 5b 69  doclist, &aBuf[i
20460 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ]);.            
20470 66 74 73 35 42 75 66 66 65 72 5a 65 72 6f 28 26  fts5BufferZero(&
20480 64 6f 63 6c 69 73 74 29 3b 0a 20 20 20 20 20 20  doclist);.      
20490 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
204a0 20 20 20 20 20 20 20 66 74 73 35 4d 65 72 67 65         fts5Merge
204b0 50 72 65 66 69 78 4c 69 73 74 73 28 70 2c 20 26  PrefixLists(p, &
204c0 64 6f 63 6c 69 73 74 2c 20 26 61 42 75 66 5b 69  doclist, &aBuf[i
204d0 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ]);.            
204e0 66 74 73 35 42 75 66 66 65 72 5a 65 72 6f 28 26  fts5BufferZero(&
204f0 61 42 75 66 5b 69 5d 29 3b 0a 20 20 20 20 20 20  aBuf[i]);.      
20500 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
20510 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 66        }..      f
20520 74 73 35 4d 65 72 67 65 41 70 70 65 6e 64 44 6f  ts5MergeAppendDo
20530 63 69 64 28 26 70 2d 3e 72 63 2c 20 26 64 6f 63  cid(&p->rc, &doc
20540 6c 69 73 74 2c 20 26 69 4c 61 73 74 52 6f 77 69  list, &iLastRowi
20550 64 2c 20 69 52 6f 77 69 64 29 3b 0a 20 20 20 20  d, iRowid);.    
20560 20 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 50    fts5MultiIterP
20570 6f 73 6c 69 73 74 28 70 2c 20 70 31 2c 20 31 2c  oslist(p, p1, 1,
20580 20 26 64 6f 63 6c 69 73 74 29 3b 0a 20 20 20 20   &doclist);.    
20590 7d 0a 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  }..    for(i=0; 
205a0 69 3c 6e 42 75 66 3b 20 69 2b 2b 29 7b 0a 20 20  i<nBuf; i++){.  
205b0 20 20 20 20 66 74 73 35 4d 65 72 67 65 50 72 65      fts5MergePre
205c0 66 69 78 4c 69 73 74 73 28 70 2c 20 26 64 6f 63  fixLists(p, &doc
205d0 6c 69 73 74 2c 20 26 61 42 75 66 5b 69 5d 29 3b  list, &aBuf[i]);
205e0 0a 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65  .      fts5Buffe
205f0 72 46 72 65 65 28 26 61 42 75 66 5b 69 5d 29 3b  rFree(&aBuf[i]);
20600 0a 20 20 20 20 7d 0a 20 20 20 20 66 74 73 35 4d  .    }.    fts5M
20610 75 6c 74 69 49 74 65 72 46 72 65 65 28 70 2c 20  ultiIterFree(p, 
20620 70 31 29 3b 0a 0a 20 20 20 20 70 44 61 74 61 20  p1);..    pData 
20630 3d 20 66 74 73 35 49 64 78 4d 61 6c 6c 6f 63 28  = fts5IdxMalloc(
20640 70 2c 20 73 69 7a 65 6f 66 28 46 74 73 35 44 61  p, sizeof(Fts5Da
20650 74 61 29 20 2b 20 64 6f 63 6c 69 73 74 2e 6e 29  ta) + doclist.n)
20660 3b 0a 20 20 20 20 69 66 28 20 70 44 61 74 61 20  ;.    if( pData 
20670 29 7b 0a 20 20 20 20 20 20 70 44 61 74 61 2d 3e  ){.      pData->
20680 70 20 3d 20 28 75 38 2a 29 26 70 44 61 74 61 5b  p = (u8*)&pData[
20690 31 5d 3b 0a 20 20 20 20 20 20 70 44 61 74 61 2d  1];.      pData-
206a0 3e 6e 6e 20 3d 20 70 44 61 74 61 2d 3e 73 7a 4c  >nn = pData->szL
206b0 65 61 66 20 3d 20 64 6f 63 6c 69 73 74 2e 6e 3b  eaf = doclist.n;
206c0 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 44  .      memcpy(pD
206d0 61 74 61 2d 3e 70 2c 20 64 6f 63 6c 69 73 74 2e  ata->p, doclist.
206e0 70 2c 20 64 6f 63 6c 69 73 74 2e 6e 29 3b 0a 20  p, doclist.n);. 
206f0 20 20 20 20 20 66 74 73 35 4d 75 6c 74 69 49 74       fts5MultiIt
20700 65 72 4e 65 77 32 28 70 2c 20 70 44 61 74 61 2c  erNew2(p, pData,
20710 20 62 44 65 73 63 2c 20 70 70 49 74 65 72 29 3b   bDesc, ppIter);
20720 0a 20 20 20 20 7d 0a 20 20 20 20 66 74 73 35 42  .    }.    fts5B
20730 75 66 66 65 72 46 72 65 65 28 26 64 6f 63 6c 69  ufferFree(&docli
20740 73 74 29 3b 0a 20 20 7d 0a 0a 20 20 66 74 73 35  st);.  }..  fts5
20750 53 74 72 75 63 74 75 72 65 52 65 6c 65 61 73 65  StructureRelease
20760 28 70 53 74 72 75 63 74 29 3b 0a 20 20 73 71 6c  (pStruct);.  sql
20770 69 74 65 33 5f 66 72 65 65 28 61 42 75 66 29 3b  ite3_free(aBuf);
20780 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 49 6e 64 69 63  .}.../*.** Indic
20790 61 74 65 20 74 68 61 74 20 61 6c 6c 20 73 75 62  ate that all sub
207a0 73 65 71 75 65 6e 74 20 63 61 6c 6c 73 20 74 6f  sequent calls to
207b0 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65   sqlite3Fts5Inde
207c0 78 57 72 69 74 65 28 29 20 70 65 72 74 61 69 6e  xWrite() pertain
207d0 0a 2a 2a 20 74 6f 20 74 68 65 20 64 6f 63 75 6d  .** to the docum
207e0 65 6e 74 20 77 69 74 68 20 72 6f 77 69 64 20 69  ent with rowid i
207f0 52 6f 77 69 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  Rowid..*/.int sq
20800 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78 42 65  lite3Fts5IndexBe
20810 67 69 6e 57 72 69 74 65 28 46 74 73 35 49 6e 64  ginWrite(Fts5Ind
20820 65 78 20 2a 70 2c 20 69 36 34 20 69 52 6f 77 69  ex *p, i64 iRowi
20830 64 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 2d  d){.  assert( p-
20840 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  >rc==SQLITE_OK )
20850 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65  ;..  /* Allocate
20860 20 74 68 65 20 68 61 73 68 20 74 61 62 6c 65 20   the hash table 
20870 69 66 20 69 74 20 68 61 73 20 6e 6f 74 20 61 6c  if it has not al
20880 72 65 61 64 79 20 62 65 65 6e 20 61 6c 6c 6f 63  ready been alloc
20890 61 74 65 64 20 2a 2f 0a 20 20 69 66 28 20 70 2d  ated */.  if( p-
208a0 3e 70 48 61 73 68 3d 3d 30 20 29 7b 0a 20 20 20  >pHash==0 ){.   
208b0 20 70 2d 3e 72 63 20 3d 20 73 71 6c 69 74 65 33   p->rc = sqlite3
208c0 46 74 73 35 48 61 73 68 4e 65 77 28 26 70 2d 3e  Fts5HashNew(&p->
208d0 70 48 61 73 68 2c 20 26 70 2d 3e 6e 50 65 6e 64  pHash, &p->nPend
208e0 69 6e 67 44 61 74 61 29 3b 0a 20 20 7d 0a 0a 20  ingData);.  }.. 
208f0 20 2f 2a 20 46 6c 75 73 68 20 74 68 65 20 68 61   /* Flush the ha
20900 73 68 20 74 61 62 6c 65 20 74 6f 20 64 69 73 6b  sh table to disk
20910 20 69 66 20 72 65 71 75 69 72 65 64 20 2a 2f 0a   if required */.
20920 20 20 69 66 28 20 69 52 6f 77 69 64 3c 3d 70 2d    if( iRowid<=p-
20930 3e 69 57 72 69 74 65 52 6f 77 69 64 20 7c 7c 20  >iWriteRowid || 
20940 28 70 2d 3e 6e 50 65 6e 64 69 6e 67 44 61 74 61  (p->nPendingData
20950 20 3e 20 70 2d 3e 6e 4d 61 78 50 65 6e 64 69 6e   > p->nMaxPendin
20960 67 44 61 74 61 29 20 29 7b 0a 20 20 20 20 66 74  gData) ){.    ft
20970 73 35 49 6e 64 65 78 46 6c 75 73 68 28 70 29 3b  s5IndexFlush(p);
20980 0a 20 20 7d 0a 20 20 70 2d 3e 69 57 72 69 74 65  .  }.  p->iWrite
20990 52 6f 77 69 64 20 3d 20 69 52 6f 77 69 64 3b 0a  Rowid = iRowid;.
209a0 20 20 72 65 74 75 72 6e 20 66 74 73 35 49 6e 64    return fts5Ind
209b0 65 78 52 65 74 75 72 6e 28 70 29 3b 0a 7d 0a 0a  exReturn(p);.}..
209c0 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69 74 20 64 61 74  /*.** Commit dat
209d0 61 20 74 6f 20 64 69 73 6b 2e 0a 2a 2f 0a 69 6e  a to disk..*/.in
209e0 74 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64  t sqlite3Fts5Ind
209f0 65 78 53 79 6e 63 28 46 74 73 35 49 6e 64 65 78  exSync(Fts5Index
20a00 20 2a 70 2c 20 69 6e 74 20 62 43 6f 6d 6d 69 74   *p, int bCommit
20a10 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  ){.  assert( p->
20a20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  rc==SQLITE_OK );
20a30 0a 20 20 66 74 73 35 49 6e 64 65 78 46 6c 75 73  .  fts5IndexFlus
20a40 68 28 70 29 3b 0a 20 20 69 66 28 20 62 43 6f 6d  h(p);.  if( bCom
20a50 6d 69 74 20 29 20 66 74 73 35 43 6c 6f 73 65 52  mit ) fts5CloseR
20a60 65 61 64 65 72 28 70 29 3b 0a 20 20 72 65 74 75  eader(p);.  retu
20a70 72 6e 20 66 74 73 35 49 6e 64 65 78 52 65 74 75  rn fts5IndexRetu
20a80 72 6e 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn(p);.}../*.** 
20a90 44 69 73 63 61 72 64 20 61 6e 79 20 64 61 74 61  Discard any data
20aa0 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 69   stored in the i
20ab0 6e 2d 6d 65 6d 6f 72 79 20 68 61 73 68 20 74 61  n-memory hash ta
20ac0 62 6c 65 73 2e 20 44 6f 20 6e 6f 74 20 77 72 69  bles. Do not wri
20ad0 74 65 20 69 74 0a 2a 2a 20 74 6f 20 74 68 65 20  te it.** to the 
20ae0 64 61 74 61 62 61 73 65 2e 20 41 64 64 69 74 69  database. Additi
20af0 6f 6e 61 6c 6c 79 2c 20 61 73 73 75 6d 65 20 74  onally, assume t
20b00 68 61 74 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  hat the contents
20b10 20 6f 66 20 74 68 65 20 25 5f 64 61 74 61 0a 2a   of the %_data.*
20b20 2a 20 74 61 62 6c 65 20 6d 61 79 20 68 61 76 65  * table may have
20b30 20 63 68 61 6e 67 65 64 20 6f 6e 20 64 69 73 6b   changed on disk
20b40 2e 20 53 6f 20 61 6e 79 20 69 6e 2d 6d 65 6d 6f  . So any in-memo
20b50 72 79 20 63 61 63 68 65 73 20 6f 66 20 25 5f 64  ry caches of %_d
20b60 61 74 61 20 0a 2a 2a 20 72 65 63 6f 72 64 73 20  ata .** records 
20b70 6d 75 73 74 20 62 65 20 69 6e 76 61 6c 69 64 61  must be invalida
20b80 74 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ted..*/.int sqli
20b90 74 65 33 46 74 73 35 49 6e 64 65 78 52 6f 6c 6c  te3Fts5IndexRoll
20ba0 62 61 63 6b 28 46 74 73 35 49 6e 64 65 78 20 2a  back(Fts5Index *
20bb0 70 29 7b 0a 20 20 66 74 73 35 43 6c 6f 73 65 52  p){.  fts5CloseR
20bc0 65 61 64 65 72 28 70 29 3b 0a 20 20 66 74 73 35  eader(p);.  fts5
20bd0 49 6e 64 65 78 44 69 73 63 61 72 64 44 61 74 61  IndexDiscardData
20be0 28 70 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  (p);.  assert( p
20bf0 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
20c00 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
20c10 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
20c20 54 68 65 20 25 5f 64 61 74 61 20 74 61 62 6c 65  The %_data table
20c30 20 69 73 20 63 6f 6d 70 6c 65 74 65 6c 79 20 65   is completely e
20c40 6d 70 74 79 20 77 68 65 6e 20 74 68 69 73 20 66  mpty when this f
20c50 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
20c60 64 2e 20 54 68 69 73 0a 2a 2a 20 66 75 6e 63 74  d. This.** funct
20c70 69 6f 6e 20 70 6f 70 75 6c 61 74 65 73 20 69 74  ion populates it
20c80 20 77 69 74 68 20 74 68 65 20 69 6e 69 74 69 61   with the initia
20c90 6c 20 73 74 72 75 63 74 75 72 65 20 6f 62 6a 65  l structure obje
20ca0 63 74 73 20 66 6f 72 20 65 61 63 68 20 69 6e 64  cts for each ind
20cb0 65 78 2c 0a 2a 2a 20 61 6e 64 20 74 68 65 20 69  ex,.** and the i
20cc0 6e 69 74 69 61 6c 20 76 65 72 73 69 6f 6e 20 6f  nitial version o
20cd0 66 20 74 68 65 20 22 61 76 65 72 61 67 65 73 22  f the "averages"
20ce0 20 72 65 63 6f 72 64 20 28 61 20 7a 65 72 6f 2d   record (a zero-
20cf0 62 79 74 65 20 62 6c 6f 62 29 2e 0a 2a 2f 0a 69  byte blob)..*/.i
20d00 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e  nt sqlite3Fts5In
20d10 64 65 78 52 65 69 6e 69 74 28 46 74 73 35 49 6e  dexReinit(Fts5In
20d20 64 65 78 20 2a 70 29 7b 0a 20 20 46 74 73 35 53  dex *p){.  Fts5S
20d30 74 72 75 63 74 75 72 65 20 73 3b 0a 20 20 6d 65  tructure s;.  me
20d40 6d 73 65 74 28 26 73 2c 20 30 2c 20 73 69 7a 65  mset(&s, 0, size
20d50 6f 66 28 46 74 73 35 53 74 72 75 63 74 75 72 65  of(Fts5Structure
20d60 29 29 3b 0a 20 20 66 74 73 35 44 61 74 61 57 72  ));.  fts5DataWr
20d70 69 74 65 28 70 2c 20 46 54 53 35 5f 41 56 45 52  ite(p, FTS5_AVER
20d80 41 47 45 53 5f 52 4f 57 49 44 2c 20 28 63 6f 6e  AGES_ROWID, (con
20d90 73 74 20 75 38 2a 29 22 22 2c 20 30 29 3b 0a 20  st u8*)"", 0);. 
20da0 20 66 74 73 35 53 74 72 75 63 74 75 72 65 57 72   fts5StructureWr
20db0 69 74 65 28 70 2c 20 26 73 29 3b 0a 20 20 72 65  ite(p, &s);.  re
20dc0 74 75 72 6e 20 66 74 73 35 49 6e 64 65 78 52 65  turn fts5IndexRe
20dd0 74 75 72 6e 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn(p);.}../*.*
20de0 2a 20 4f 70 65 6e 20 61 20 6e 65 77 20 46 74 73  * Open a new Fts
20df0 35 49 6e 64 65 78 20 68 61 6e 64 6c 65 2e 20 49  5Index handle. I
20e00 66 20 74 68 65 20 62 43 72 65 61 74 65 20 61 72  f the bCreate ar
20e10 67 75 6d 65 6e 74 20 69 73 20 74 72 75 65 2c 20  gument is true, 
20e20 63 72 65 61 74 65 0a 2a 2a 20 61 6e 64 20 69 6e  create.** and in
20e30 69 74 69 61 6c 69 7a 65 20 74 68 65 20 75 6e 64  itialize the und
20e40 65 72 6c 79 69 6e 67 20 25 5f 64 61 74 61 20 74  erlying %_data t
20e50 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73  able..**.** If s
20e60 75 63 63 65 73 73 66 75 6c 2c 20 73 65 74 20 2a  uccessful, set *
20e70 70 70 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74  pp to point to t
20e80 68 65 20 6e 65 77 20 6f 62 6a 65 63 74 20 61 6e  he new object an
20e90 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  d return SQLITE_
20ea0 4f 4b 2e 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65  OK..** Otherwise
20eb0 2c 20 73 65 74 20 2a 70 70 20 74 6f 20 4e 55 4c  , set *pp to NUL
20ec0 4c 20 61 6e 64 20 72 65 74 75 72 6e 20 61 6e 20  L and return an 
20ed0 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64  SQLite error cod
20ee0 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  e..*/.int sqlite
20ef0 33 46 74 73 35 49 6e 64 65 78 4f 70 65 6e 28 0a  3Fts5IndexOpen(.
20f00 20 20 46 74 73 35 43 6f 6e 66 69 67 20 2a 70 43    Fts5Config *pC
20f10 6f 6e 66 69 67 2c 20 0a 20 20 69 6e 74 20 62 43  onfig, .  int bC
20f20 72 65 61 74 65 2c 20 0a 20 20 46 74 73 35 49 6e  reate, .  Fts5In
20f30 64 65 78 20 2a 2a 70 70 2c 0a 20 20 63 68 61 72  dex **pp,.  char
20f40 20 2a 2a 70 7a 45 72 72 0a 29 7b 0a 20 20 69 6e   **pzErr.){.  in
20f50 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
20f60 3b 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70  ;.  Fts5Index *p
20f70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
20f80 20 20 20 20 2f 2a 20 4e 65 77 20 6f 62 6a 65 63      /* New objec
20f90 74 20 2a 2f 0a 0a 20 20 2a 70 70 20 3d 20 70 20  t */..  *pp = p 
20fa0 3d 20 28 46 74 73 35 49 6e 64 65 78 2a 29 73 71  = (Fts5Index*)sq
20fb0 6c 69 74 65 33 46 74 73 35 4d 61 6c 6c 6f 63 5a  lite3Fts5MallocZ
20fc0 65 72 6f 28 26 72 63 2c 20 73 69 7a 65 6f 66 28  ero(&rc, sizeof(
20fd0 46 74 73 35 49 6e 64 65 78 29 29 3b 0a 20 20 69  Fts5Index));.  i
20fe0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
20ff0 20 29 7b 0a 20 20 20 20 70 2d 3e 70 43 6f 6e 66   ){.    p->pConf
21000 69 67 20 3d 20 70 43 6f 6e 66 69 67 3b 0a 20 20  ig = pConfig;.  
21010 20 20 70 2d 3e 6e 57 6f 72 6b 55 6e 69 74 20 3d    p->nWorkUnit =
21020 20 46 54 53 35 5f 57 4f 52 4b 5f 55 4e 49 54 3b   FTS5_WORK_UNIT;
21030 0a 20 20 20 20 70 2d 3e 6e 4d 61 78 50 65 6e 64  .    p->nMaxPend
21040 69 6e 67 44 61 74 61 20 3d 20 31 30 32 34 2a 31  ingData = 1024*1
21050 30 32 34 3b 0a 20 20 20 20 70 2d 3e 7a 44 61 74  024;.    p->zDat
21060 61 54 62 6c 20 3d 20 73 71 6c 69 74 65 33 46 74  aTbl = sqlite3Ft
21070 73 35 4d 70 72 69 6e 74 66 28 26 72 63 2c 20 22  s5Mprintf(&rc, "
21080 25 73 5f 64 61 74 61 22 2c 20 70 43 6f 6e 66 69  %s_data", pConfi
21090 67 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 69  g->zName);.    i
210a0 66 28 20 70 2d 3e 7a 44 61 74 61 54 62 6c 20 26  f( p->zDataTbl &
210b0 26 20 62 43 72 65 61 74 65 20 29 7b 0a 20 20 20  & bCreate ){.   
210c0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 46     rc = sqlite3F
210d0 74 73 35 43 72 65 61 74 65 54 61 62 6c 65 28 0a  ts5CreateTable(.
210e0 20 20 20 20 20 20 20 20 20 20 70 43 6f 6e 66 69            pConfi
210f0 67 2c 20 22 64 61 74 61 22 2c 20 22 69 64 20 49  g, "data", "id I
21100 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b  NTEGER PRIMARY K
21110 45 59 2c 20 62 6c 6f 63 6b 20 42 4c 4f 42 22 2c  EY, block BLOB",
21120 20 30 2c 20 70 7a 45 72 72 0a 20 20 20 20 20 20   0, pzErr.      
21130 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  );.      if( rc=
21140 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
21150 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
21160 65 33 46 74 73 35 43 72 65 61 74 65 54 61 62 6c  e3Fts5CreateTabl
21170 65 28 70 43 6f 6e 66 69 67 2c 20 22 69 64 78 22  e(pConfig, "idx"
21180 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 22  , .            "
21190 73 65 67 69 64 2c 20 74 65 72 6d 2c 20 70 67 6e  segid, term, pgn
211a0 6f 2c 20 50 52 49 4d 41 52 59 20 4b 45 59 28 73  o, PRIMARY KEY(s
211b0 65 67 69 64 2c 20 74 65 72 6d 29 22 2c 20 0a 20  egid, term)", . 
211c0 20 20 20 20 20 20 20 20 20 20 20 31 2c 20 70 7a             1, pz
211d0 45 72 72 0a 20 20 20 20 20 20 20 20 29 3b 0a 20  Err.        );. 
211e0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
211f0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
21200 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  {.        rc = s
21210 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78 52  qlite3Fts5IndexR
21220 65 69 6e 69 74 28 70 29 3b 0a 20 20 20 20 20 20  einit(p);.      
21230 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 61  }.    }.  }..  a
21240 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54  ssert( rc!=SQLIT
21250 45 5f 4f 4b 20 7c 7c 20 70 2d 3e 72 63 3d 3d 53  E_OK || p->rc==S
21260 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 69 66  QLITE_OK );.  if
21270 28 20 72 63 20 29 7b 0a 20 20 20 20 73 71 6c 69  ( rc ){.    sqli
21280 74 65 33 46 74 73 35 49 6e 64 65 78 43 6c 6f 73  te3Fts5IndexClos
21290 65 28 70 29 3b 0a 20 20 20 20 2a 70 70 20 3d 20  e(p);.    *pp = 
212a0 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  0;.  }.  return 
212b0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f  rc;.}../*.** Clo
212c0 73 65 20 61 20 68 61 6e 64 6c 65 20 6f 70 65 6e  se a handle open
212d0 65 64 20 62 79 20 61 6e 20 65 61 72 6c 69 65 72  ed by an earlier
212e0 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33   call to sqlite3
212f0 46 74 73 35 49 6e 64 65 78 4f 70 65 6e 28 29 2e  Fts5IndexOpen().
21300 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46  .*/.int sqlite3F
21310 74 73 35 49 6e 64 65 78 43 6c 6f 73 65 28 46 74  ts5IndexClose(Ft
21320 73 35 49 6e 64 65 78 20 2a 70 29 7b 0a 20 20 69  s5Index *p){.  i
21330 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
21340 4b 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20  K;.  if( p ){.  
21350 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 52 65    assert( p->pRe
21360 61 64 65 72 3d 3d 30 20 29 3b 0a 20 20 20 20 73  ader==0 );.    s
21370 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28  qlite3_finalize(
21380 70 2d 3e 70 57 72 69 74 65 72 29 3b 0a 20 20 20  p->pWriter);.   
21390 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a   sqlite3_finaliz
213a0 65 28 70 2d 3e 70 44 65 6c 65 74 65 72 29 3b 0a  e(p->pDeleter);.
213b0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61      sqlite3_fina
213c0 6c 69 7a 65 28 70 2d 3e 70 49 64 78 57 72 69 74  lize(p->pIdxWrit
213d0 65 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  er);.    sqlite3
213e0 5f 66 69 6e 61 6c 69 7a 65 28 70 2d 3e 70 49 64  _finalize(p->pId
213f0 78 44 65 6c 65 74 65 72 29 3b 0a 20 20 20 20 73  xDeleter);.    s
21400 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28  qlite3_finalize(
21410 70 2d 3e 70 49 64 78 53 65 6c 65 63 74 29 3b 0a  p->pIdxSelect);.
21420 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 48      sqlite3Fts5H
21430 61 73 68 46 72 65 65 28 70 2d 3e 70 48 61 73 68  ashFree(p->pHash
21440 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 46 74  );.    sqlite3Ft
21450 73 35 42 75 66 66 65 72 46 72 65 65 28 26 70 2d  s5BufferFree(&p-
21460 3e 73 63 72 61 74 63 68 29 3b 0a 20 20 20 20 73  >scratch);.    s
21470 71 6c 69 74 65 33 5f 66 72 65 65 28 70 2d 3e 7a  qlite3_free(p->z
21480 44 61 74 61 54 62 6c 29 3b 0a 20 20 20 20 73 71  DataTbl);.    sq
21490 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20  lite3_free(p);. 
214a0 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
214b0 7d 0a 0a 2f 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e  }../*.** Argumen
214c0 74 20 70 20 70 6f 69 6e 74 73 20 74 6f 20 61 20  t p points to a 
214d0 62 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e  buffer containin
214e0 67 20 75 74 66 2d 38 20 74 65 78 74 20 74 68 61  g utf-8 text tha
214f0 74 20 69 73 20 6e 20 62 79 74 65 73 20 69 6e 20  t is n bytes in 
21500 0a 2a 2a 20 73 69 7a 65 2e 20 52 65 74 75 72 6e  .** size. Return
21510 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62   the number of b
21520 79 74 65 73 20 69 6e 20 74 68 65 20 6e 43 68 61  ytes in the nCha
21530 72 20 63 68 61 72 61 63 74 65 72 20 70 72 65 66  r character pref
21540 69 78 20 6f 66 20 74 68 65 0a 2a 2a 20 62 75 66  ix of the.** buf
21550 66 65 72 2c 20 6f 72 20 30 20 69 66 20 74 68 65  fer, or 0 if the
21560 72 65 20 61 72 65 20 6c 65 73 73 20 74 68 61 6e  re are less than
21570 20 6e 43 68 61 72 20 63 68 61 72 61 63 74 65 72   nChar character
21580 73 20 69 6e 20 74 6f 74 61 6c 2e 0a 2a 2f 0a 73  s in total..*/.s
21590 74 61 74 69 63 20 69 6e 74 20 66 74 73 35 49 6e  tatic int fts5In
215a0 64 65 78 43 68 61 72 6c 65 6e 54 6f 42 79 74 65  dexCharlenToByte
215b0 6c 65 6e 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  len(const char *
215c0 70 2c 20 69 6e 74 20 6e 42 79 74 65 2c 20 69 6e  p, int nByte, in
215d0 74 20 6e 43 68 61 72 29 7b 0a 20 20 69 6e 74 20  t nChar){.  int 
215e0 6e 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 3b 0a  n = 0;.  int i;.
215f0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 68    for(i=0; i<nCh
21600 61 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66  ar; i++){.    if
21610 28 20 6e 3e 3d 6e 42 79 74 65 20 29 20 72 65 74  ( n>=nByte ) ret
21620 75 72 6e 20 30 3b 20 20 20 20 20 20 2f 2a 20 49  urn 0;      /* I
21630 6e 70 75 74 20 63 6f 6e 74 61 69 6e 73 20 66 65  nput contains fe
21640 77 65 72 20 74 68 61 6e 20 6e 43 68 61 72 20 63  wer than nChar c
21650 68 61 72 73 20 2a 2f 0a 20 20 20 20 69 66 28 20  hars */.    if( 
21660 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 29 70  (unsigned char)p
21670 5b 6e 2b 2b 5d 3e 3d 30 78 63 30 20 29 7b 0a 20  [n++]>=0xc0 ){. 
21680 20 20 20 20 20 77 68 69 6c 65 28 20 28 70 5b 6e       while( (p[n
21690 5d 20 26 20 30 78 63 30 29 3d 3d 30 78 38 30 20  ] & 0xc0)==0x80 
216a0 29 20 6e 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d  ) n++;.    }.  }
216b0 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a  .  return n;.}..
216c0 2f 2a 0a 2a 2a 20 70 49 6e 20 69 73 20 61 20 55  /*.** pIn is a U
216d0 54 46 2d 38 20 65 6e 63 6f 64 65 64 20 73 74 72  TF-8 encoded str
216e0 69 6e 67 2c 20 6e 49 6e 20 62 79 74 65 73 20 69  ing, nIn bytes i
216f0 6e 20 73 69 7a 65 2e 20 52 65 74 75 72 6e 20 74  n size. Return t
21700 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20  he number of.** 
21710 75 6e 69 63 6f 64 65 20 63 68 61 72 61 63 74 65  unicode characte
21720 72 73 20 69 6e 20 74 68 65 20 73 74 72 69 6e 67  rs in the string
21730 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
21740 66 74 73 35 49 6e 64 65 78 43 68 61 72 6c 65 6e  fts5IndexCharlen
21750 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 70 49 6e  (const char *pIn
21760 2c 20 69 6e 74 20 6e 49 6e 29 7b 0a 20 20 69 6e  , int nIn){.  in
21770 74 20 6e 43 68 61 72 20 3d 20 30 3b 20 20 20 20  t nChar = 0;    
21780 20 20 20 20 20 20 20 20 0a 20 20 69 6e 74 20 69          .  int i
21790 20 3d 20 30 3b 0a 20 20 77 68 69 6c 65 28 20 69   = 0;.  while( i
217a0 3c 6e 49 6e 20 29 7b 0a 20 20 20 20 69 66 28 20  <nIn ){.    if( 
217b0 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 29 70  (unsigned char)p
217c0 49 6e 5b 69 2b 2b 5d 3e 3d 30 78 63 30 20 29 7b  In[i++]>=0xc0 ){
217d0 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 69 3c  .      while( i<
217e0 6e 49 6e 20 26 26 20 28 70 49 6e 5b 69 5d 20 26  nIn && (pIn[i] &
217f0 20 30 78 63 30 29 3d 3d 30 78 38 30 20 29 20 69   0xc0)==0x80 ) i
21800 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 43  ++;.    }.    nC
21810 68 61 72 2b 2b 3b 0a 20 20 7d 0a 20 20 72 65 74  har++;.  }.  ret
21820 75 72 6e 20 6e 43 68 61 72 3b 0a 7d 0a 0a 2f 2a  urn nChar;.}../*
21830 0a 2a 2a 20 49 6e 73 65 72 74 20 6f 72 20 72 65  .** Insert or re
21840 6d 6f 76 65 20 64 61 74 61 20 74 6f 20 6f 72 20  move data to or 
21850 66 72 6f 6d 20 74 68 65 20 69 6e 64 65 78 2e 20  from the index. 
21860 45 61 63 68 20 74 69 6d 65 20 61 20 64 6f 63 75  Each time a docu
21870 6d 65 6e 74 20 69 73 20 0a 2a 2a 20 61 64 64 65  ment is .** adde
21880 64 20 74 6f 20 6f 72 20 72 65 6d 6f 76 65 64 20  d to or removed 
21890 66 72 6f 6d 20 74 68 65 20 69 6e 64 65 78 2c 20  from the index, 
218a0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
218b0 20 63 61 6c 6c 65 64 20 6f 6e 65 20 6f 72 20 6d   called one or m
218c0 6f 72 65 0a 2a 2a 20 74 69 6d 65 73 2e 0a 2a 2a  ore.** times..**
218d0 0a 2a 2a 20 46 6f 72 20 61 6e 20 69 6e 73 65 72  .** For an inser
218e0 74 2c 20 69 74 20 6d 75 73 74 20 62 65 20 63 61  t, it must be ca
218f0 6c 6c 65 64 20 6f 6e 63 65 20 66 6f 72 20 65 61  lled once for ea
21900 63 68 20 74 6f 6b 65 6e 20 69 6e 20 74 68 65 20  ch token in the 
21910 6e 65 77 20 64 6f 63 75 6d 65 6e 74 2e 0a 2a 2a  new document..**
21920 20 49 66 20 74 68 65 20 6f 70 65 72 61 74 69 6f   If the operatio
21930 6e 20 69 73 20 61 20 64 65 6c 65 74 65 2c 20 69  n is a delete, i
21940 74 20 6d 75 73 74 20 62 65 20 63 61 6c 6c 65 64  t must be called
21950 20 28 61 74 20 6c 65 61 73 74 29 20 6f 6e 63 65   (at least) once
21960 20 66 6f 72 20 65 61 63 68 0a 2a 2a 20 75 6e 69   for each.** uni
21970 71 75 65 20 74 6f 6b 65 6e 20 69 6e 20 74 68 65  que token in the
21980 20 64 6f 63 75 6d 65 6e 74 20 77 69 74 68 20 61   document with a
21990 6e 20 69 43 6f 6c 20 76 61 6c 75 65 20 6c 65 73  n iCol value les
219a0 73 20 74 68 61 6e 20 7a 65 72 6f 2e 20 54 68 65  s than zero. The
219b0 20 69 50 6f 73 0a 2a 2a 20 61 72 67 75 6d 65 6e   iPos.** argumen
219c0 74 20 69 73 20 69 67 6e 6f 72 65 64 20 66 6f 72  t is ignored for
219d0 20 61 20 64 65 6c 65 74 65 2e 0a 2a 2f 0a 69 6e   a delete..*/.in
219e0 74 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64  t sqlite3Fts5Ind
219f0 65 78 57 72 69 74 65 28 0a 20 20 46 74 73 35 49  exWrite(.  Fts5I
21a00 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20  ndex *p,        
21a10 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
21a20 64 65 78 20 74 6f 20 77 72 69 74 65 20 74 6f 20  dex to write to 
21a30 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 2c 20 20  */.  int iCol,  
21a40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21a50 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 74       /* Column t
21a60 6f 6b 65 6e 20 61 70 70 65 61 72 73 20 69 6e 20  oken appears in 
21a70 28 2d 76 65 20 2d 3e 20 64 65 6c 65 74 65 29 20  (-ve -> delete) 
21a80 2a 2f 0a 20 20 69 6e 74 20 69 50 6f 73 2c 20 20  */.  int iPos,  
21a90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21aa0 20 20 20 20 20 2f 2a 20 50 6f 73 69 74 69 6f 6e       /* Position
21ab0 20 6f 66 20 74 6f 6b 65 6e 20 77 69 74 68 69 6e   of token within
21ac0 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 63 6f 6e   column */.  con
21ad0 73 74 20 63 68 61 72 20 2a 70 54 6f 6b 65 6e 2c  st char *pToken,
21ae0 20 69 6e 74 20 6e 54 6f 6b 65 6e 20 20 2f 2a 20   int nToken  /* 
21af0 54 6f 6b 65 6e 20 74 6f 20 61 64 64 20 6f 72 20  Token to add or 
21b00 72 65 6d 6f 76 65 20 74 6f 20 6f 72 20 66 72 6f  remove to or fro
21b10 6d 20 69 6e 64 65 78 20 2a 2f 0a 29 7b 0a 20 20  m index */.){.  
21b20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20  int i;          
21b30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21b40 2f 2a 20 55 73 65 64 20 74 6f 20 69 74 65 72 61  /* Used to itera
21b50 74 65 20 74 68 72 6f 75 67 68 20 69 6e 64 65 78  te through index
21b60 65 73 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d  es */.  int rc =
21b70 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20   SQLITE_OK;     
21b80 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
21b90 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 46 74 73 35  n code */.  Fts5
21ba0 43 6f 6e 66 69 67 20 2a 70 43 6f 6e 66 69 67 20  Config *pConfig 
21bb0 3d 20 70 2d 3e 70 43 6f 6e 66 69 67 3b 0a 0a 20  = p->pConfig;.. 
21bc0 20 61 73 73 65 72 74 28 20 70 2d 3e 72 63 3d 3d   assert( p->rc==
21bd0 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 0a 20 20  SQLITE_OK );..  
21be0 2f 2a 20 41 64 64 20 74 68 65 20 65 6e 74 72 79  /* Add the entry
21bf0 20 74 6f 20 74 68 65 20 6d 61 69 6e 20 74 65 72   to the main ter
21c00 6d 73 20 69 6e 64 65 78 2e 20 2a 2f 0a 20 20 72  ms index. */.  r
21c10 63 20 3d 20 73 71 6c 69 74 65 33 46 74 73 35 48  c = sqlite3Fts5H
21c20 61 73 68 57 72 69 74 65 28 0a 20 20 20 20 20 20  ashWrite(.      
21c30 70 2d 3e 70 48 61 73 68 2c 20 70 2d 3e 69 57 72  p->pHash, p->iWr
21c40 69 74 65 52 6f 77 69 64 2c 20 69 43 6f 6c 2c 20  iteRowid, iCol, 
21c50 69 50 6f 73 2c 20 46 54 53 35 5f 4d 41 49 4e 5f  iPos, FTS5_MAIN_
21c60 50 52 45 46 49 58 2c 20 70 54 6f 6b 65 6e 2c 20  PREFIX, pToken, 
21c70 6e 54 6f 6b 65 6e 0a 20 20 29 3b 0a 0a 20 20 66  nToken.  );..  f
21c80 6f 72 28 69 3d 30 3b 20 69 3c 70 43 6f 6e 66 69  or(i=0; i<pConfi
21c90 67 2d 3e 6e 50 72 65 66 69 78 20 26 26 20 72 63  g->nPrefix && rc
21ca0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20 69 2b 2b  ==SQLITE_OK; i++
21cb0 29 7b 0a 20 20 20 20 69 6e 74 20 6e 42 79 74 65  ){.    int nByte
21cc0 20 3d 20 66 74 73 35 49 6e 64 65 78 43 68 61 72   = fts5IndexChar
21cd0 6c 65 6e 54 6f 42 79 74 65 6c 65 6e 28 70 54 6f  lenToBytelen(pTo
21ce0 6b 65 6e 2c 20 6e 54 6f 6b 65 6e 2c 20 70 43 6f  ken, nToken, pCo
21cf0 6e 66 69 67 2d 3e 61 50 72 65 66 69 78 5b 69 5d  nfig->aPrefix[i]
21d00 29 3b 0a 20 20 20 20 69 66 28 20 6e 42 79 74 65  );.    if( nByte
21d10 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   ){.      rc = s
21d20 71 6c 69 74 65 33 46 74 73 35 48 61 73 68 57 72  qlite3Fts5HashWr
21d30 69 74 65 28 70 2d 3e 70 48 61 73 68 2c 20 0a 20  ite(p->pHash, . 
21d40 20 20 20 20 20 20 20 20 20 70 2d 3e 69 57 72 69           p->iWri
21d50 74 65 52 6f 77 69 64 2c 20 69 43 6f 6c 2c 20 69  teRowid, iCol, i
21d60 50 6f 73 2c 20 46 54 53 35 5f 4d 41 49 4e 5f 50  Pos, FTS5_MAIN_P
21d70 52 45 46 49 58 2b 69 2b 31 2c 20 70 54 6f 6b 65  REFIX+i+1, pToke
21d80 6e 2c 20 6e 42 79 74 65 0a 20 20 20 20 20 20 29  n, nByte.      )
21d90 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72  ;.    }.  }..  r
21da0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
21db0 2a 2a 20 4f 70 65 6e 20 61 20 6e 65 77 20 69 74  ** Open a new it
21dc0 65 72 61 74 6f 72 20 74 6f 20 69 74 65 72 61 74  erator to iterat
21dd0 65 20 74 68 6f 75 67 68 20 61 6c 6c 20 72 6f 77  e though all row
21de0 69 64 20 74 68 61 74 20 6d 61 74 63 68 20 74 68  id that match th
21df0 65 20 0a 2a 2a 20 73 70 65 63 69 66 69 65 64 20  e .** specified 
21e00 74 6f 6b 65 6e 20 6f 72 20 74 6f 6b 65 6e 20 70  token or token p
21e10 72 65 66 69 78 2e 0a 2a 2f 0a 69 6e 74 20 73 71  refix..*/.int sq
21e20 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78 51 75  lite3Fts5IndexQu
21e30 65 72 79 28 0a 20 20 46 74 73 35 49 6e 64 65 78  ery(.  Fts5Index
21e40 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
21e50 20 20 20 20 20 20 20 2f 2a 20 46 54 53 20 69 6e         /* FTS in
21e60 64 65 78 20 74 6f 20 71 75 65 72 79 20 2a 2f 0a  dex to query */.
21e70 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 70 54    const char *pT
21e80 6f 6b 65 6e 2c 20 69 6e 74 20 6e 54 6f 6b 65 6e  oken, int nToken
21e90 2c 20 2f 2a 20 54 6f 6b 65 6e 20 28 6f 72 20 70  , /* Token (or p
21ea0 72 65 66 69 78 29 20 74 6f 20 71 75 65 72 79 20  refix) to query 
21eb0 66 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61  for */.  int fla
21ec0 67 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  gs,             
21ed0 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b           /* Mask
21ee0 20 6f 66 20 46 54 53 35 49 4e 44 45 58 5f 51 55   of FTS5INDEX_QU
21ef0 45 52 59 5f 58 20 66 6c 61 67 73 20 2a 2f 0a 20  ERY_X flags */. 
21f00 20 46 74 73 35 49 6e 64 65 78 49 74 65 72 20 2a   Fts5IndexIter *
21f10 2a 70 70 49 74 65 72 20 20 20 20 20 20 20 20 20  *ppIter         
21f20 20 2f 2a 20 4f 55 54 3a 20 4e 65 77 20 69 74 65   /* OUT: New ite
21f30 72 61 74 6f 72 20 6f 62 6a 65 63 74 20 2a 2f 0a  rator object */.
21f40 29 7b 0a 20 20 46 74 73 35 43 6f 6e 66 69 67 20  ){.  Fts5Config 
21f50 2a 70 43 6f 6e 66 69 67 20 3d 20 70 2d 3e 70 43  *pConfig = p->pC
21f60 6f 6e 66 69 67 3b 0a 20 20 46 74 73 35 49 6e 64  onfig;.  Fts5Ind
21f70 65 78 49 74 65 72 20 2a 70 52 65 74 20 3d 20 30  exIter *pRet = 0
21f80 3b 0a 20 20 69 6e 74 20 69 49 64 78 20 3d 20 30  ;.  int iIdx = 0
21f90 3b 0a 20 20 46 74 73 35 42 75 66 66 65 72 20 62  ;.  Fts5Buffer b
21fa0 75 66 20 3d 20 7b 30 2c 20 30 2c 20 30 7d 3b 0a  uf = {0, 0, 0};.
21fb0 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 51 55 45  .  /* If the QUE
21fc0 52 59 5f 53 43 41 4e 20 66 6c 61 67 20 69 73 20  RY_SCAN flag is 
21fd0 73 65 74 2c 20 61 6c 6c 20 6f 74 68 65 72 20 66  set, all other f
21fe0 6c 61 67 73 20 6d 75 73 74 20 62 65 20 63 6c 65  lags must be cle
21ff0 61 72 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ar. */.  assert(
22000 20 28 66 6c 61 67 73 20 26 20 46 54 53 35 49 4e   (flags & FTS5IN
22010 44 45 58 5f 51 55 45 52 59 5f 53 43 41 4e 29 3d  DEX_QUERY_SCAN)=
22020 3d 30 0a 20 20 20 20 20 20 20 7c 7c 20 28 66 6c  =0.       || (fl
22030 61 67 73 20 26 20 46 54 53 35 49 4e 44 45 58 5f  ags & FTS5INDEX_
22040 51 55 45 52 59 5f 53 43 41 4e 29 3d 3d 46 54 53  QUERY_SCAN)==FTS
22050 35 49 4e 44 45 58 5f 51 55 45 52 59 5f 53 43 41  5INDEX_QUERY_SCA
22060 4e 0a 20 20 29 3b 0a 0a 20 20 69 66 28 20 73 71  N.  );..  if( sq
22070 6c 69 74 65 33 46 74 73 35 42 75 66 66 65 72 47  lite3Fts5BufferG
22080 72 6f 77 28 26 70 2d 3e 72 63 2c 20 26 62 75 66  row(&p->rc, &buf
22090 2c 20 6e 54 6f 6b 65 6e 2b 31 29 3d 3d 30 20 29  , nToken+1)==0 )
220a0 7b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 62 75  {.    memcpy(&bu
220b0 66 2e 70 5b 31 5d 2c 20 70 54 6f 6b 65 6e 2c 20  f.p[1], pToken, 
220c0 6e 54 6f 6b 65 6e 29 3b 0a 0a 23 69 66 64 65 66  nToken);..#ifdef
220d0 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
220e0 20 20 2f 2a 20 49 66 20 74 68 65 20 51 55 45 52    /* If the QUER
220f0 59 5f 54 45 53 54 5f 4e 4f 49 44 58 20 66 6c 61  Y_TEST_NOIDX fla
22100 67 20 77 61 73 20 73 70 65 63 69 66 69 65 64 2c  g was specified,
22110 20 74 68 65 6e 20 74 68 69 73 20 6d 75 73 74 20   then this must 
22120 62 65 20 61 0a 20 20 20 20 2a 2a 20 70 72 65 66  be a.    ** pref
22130 69 78 2d 71 75 65 72 79 2e 20 49 6e 73 74 65 61  ix-query. Instea
22140 64 20 6f 66 20 75 73 69 6e 67 20 61 20 70 72 65  d of using a pre
22150 66 69 78 2d 69 6e 64 65 78 20 28 69 66 20 6f 6e  fix-index (if on
22160 65 20 65 78 69 73 74 73 29 2c 20 0a 20 20 20 20  e exists), .    
22170 2a 2a 20 65 76 61 6c 75 61 74 65 20 74 68 65 20  ** evaluate the 
22180 70 72 65 66 69 78 20 71 75 65 72 79 20 75 73 69  prefix query usi
22190 6e 67 20 74 68 65 20 6d 61 69 6e 20 46 54 53 20  ng the main FTS 
221a0 69 6e 64 65 78 2e 20 54 68 69 73 20 69 73 20 75  index. This is u
221b0 73 65 64 0a 20 20 20 20 2a 2a 20 66 6f 72 20 69  sed.    ** for i
221c0 6e 74 65 72 6e 61 6c 20 73 61 6e 69 74 79 20 63  nternal sanity c
221d0 68 65 63 6b 69 6e 67 20 62 79 20 74 68 65 20 69  hecking by the i
221e0 6e 74 65 67 72 69 74 79 2d 63 68 65 63 6b 20 69  ntegrity-check i
221f0 6e 20 64 65 62 75 67 20 0a 20 20 20 20 2a 2a 20  n debug .    ** 
22200 6d 6f 64 65 20 6f 6e 6c 79 2e 20 20 2a 2f 0a 20  mode only.  */. 
22210 20 20 20 69 66 28 20 70 43 6f 6e 66 69 67 2d 3e     if( pConfig->
22220 62 50 72 65 66 69 78 49 6e 64 65 78 3d 3d 30 20  bPrefixIndex==0 
22230 7c 7c 20 28 66 6c 61 67 73 20 26 20 46 54 53 35  || (flags & FTS5
22240 49 4e 44 45 58 5f 51 55 45 52 59 5f 54 45 53 54  INDEX_QUERY_TEST
22250 5f 4e 4f 49 44 58 29 20 29 7b 0a 20 20 20 20 20  _NOIDX) ){.     
22260 20 61 73 73 65 72 74 28 20 66 6c 61 67 73 20 26   assert( flags &
22270 20 46 54 53 35 49 4e 44 45 58 5f 51 55 45 52 59   FTS5INDEX_QUERY
22280 5f 50 52 45 46 49 58 20 29 3b 0a 20 20 20 20 20  _PREFIX );.     
22290 20 69 49 64 78 20 3d 20 31 2b 70 43 6f 6e 66 69   iIdx = 1+pConfi
222a0 67 2d 3e 6e 50 72 65 66 69 78 3b 0a 20 20 20 20  g->nPrefix;.    
222b0 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 20  }else.#endif.   
222c0 20 69 66 28 20 66 6c 61 67 73 20 26 20 46 54 53   if( flags & FTS
222d0 35 49 4e 44 45 58 5f 51 55 45 52 59 5f 50 52 45  5INDEX_QUERY_PRE
222e0 46 49 58 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  FIX ){.      int
222f0 20 6e 43 68 61 72 20 3d 20 66 74 73 35 49 6e 64   nChar = fts5Ind
22300 65 78 43 68 61 72 6c 65 6e 28 70 54 6f 6b 65 6e  exCharlen(pToken
22310 2c 20 6e 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 20  , nToken);.     
22320 20 66 6f 72 28 69 49 64 78 3d 31 3b 20 69 49 64   for(iIdx=1; iId
22330 78 3c 3d 70 43 6f 6e 66 69 67 2d 3e 6e 50 72 65  x<=pConfig->nPre
22340 66 69 78 3b 20 69 49 64 78 2b 2b 29 7b 0a 20 20  fix; iIdx++){.  
22350 20 20 20 20 20 20 69 66 28 20 70 43 6f 6e 66 69        if( pConfi
22360 67 2d 3e 61 50 72 65 66 69 78 5b 69 49 64 78 2d  g->aPrefix[iIdx-
22370 31 5d 3d 3d 6e 43 68 61 72 20 29 20 62 72 65 61  1]==nChar ) brea
22380 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  k;.      }.    }
22390 0a 0a 20 20 20 20 69 66 28 20 69 49 64 78 3c 3d  ..    if( iIdx<=
223a0 70 43 6f 6e 66 69 67 2d 3e 6e 50 72 65 66 69 78  pConfig->nPrefix
223b0 20 29 7b 0a 20 20 20 20 20 20 46 74 73 35 53 74   ){.      Fts5St
223c0 72 75 63 74 75 72 65 20 2a 70 53 74 72 75 63 74  ructure *pStruct
223d0 20 3d 20 66 74 73 35 53 74 72 75 63 74 75 72 65   = fts5Structure
223e0 52 65 61 64 28 70 29 3b 0a 20 20 20 20 20 20 62  Read(p);.      b
223f0 75 66 2e 70 5b 30 5d 20 3d 20 46 54 53 35 5f 4d  uf.p[0] = FTS5_M
22400 41 49 4e 5f 50 52 45 46 49 58 20 2b 20 69 49 64  AIN_PREFIX + iId
22410 78 3b 0a 20 20 20 20 20 20 69 66 28 20 70 53 74  x;.      if( pSt
22420 72 75 63 74 20 29 7b 0a 20 20 20 20 20 20 20 20  ruct ){.        
22430 66 74 73 35 4d 75 6c 74 69 49 74 65 72 4e 65 77  fts5MultiIterNew
22440 28 70 2c 20 70 53 74 72 75 63 74 2c 20 31 2c 20  (p, pStruct, 1, 
22450 66 6c 61 67 73 2c 20 62 75 66 2e 70 2c 20 6e 54  flags, buf.p, nT
22460 6f 6b 65 6e 2b 31 2c 20 2d 31 2c 20 30 2c 20 26  oken+1, -1, 0, &
22470 70 52 65 74 29 3b 0a 20 20 20 20 20 20 20 20 66  pRet);.        f
22480 74 73 35 53 74 72 75 63 74 75 72 65 52 65 6c 65  ts5StructureRele
22490 61 73 65 28 70 53 74 72 75 63 74 29 3b 0a 20 20  ase(pStruct);.  
224a0 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b      }.    }else{
224b0 0a 20 20 20 20 20 20 69 6e 74 20 62 44 65 73 63  .      int bDesc
224c0 20 3d 20 28 66 6c 61 67 73 20 26 20 46 54 53 35   = (flags & FTS5
224d0 49 4e 44 45 58 5f 51 55 45 52 59 5f 44 45 53 43  INDEX_QUERY_DESC
224e0 29 21 3d 30 3b 0a 20 20 20 20 20 20 62 75 66 2e  )!=0;.      buf.
224f0 70 5b 30 5d 20 3d 20 46 54 53 35 5f 4d 41 49 4e  p[0] = FTS5_MAIN
22500 5f 50 52 45 46 49 58 3b 0a 20 20 20 20 20 20 66  _PREFIX;.      f
22510 74 73 35 53 65 74 75 70 50 72 65 66 69 78 49 74  ts5SetupPrefixIt
22520 65 72 28 70 2c 20 62 44 65 73 63 2c 20 62 75 66  er(p, bDesc, buf
22530 2e 70 2c 20 6e 54 6f 6b 65 6e 2b 31 2c 20 26 70  .p, nToken+1, &p
22540 52 65 74 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  Ret);.    }..   
22550 20 69 66 28 20 70 2d 3e 72 63 20 29 7b 0a 20 20   if( p->rc ){.  
22560 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 49      sqlite3Fts5I
22570 74 65 72 43 6c 6f 73 65 28 70 52 65 74 29 3b 0a  terClose(pRet);.
22580 20 20 20 20 20 20 70 52 65 74 20 3d 20 30 3b 0a        pRet = 0;.
22590 20 20 20 20 20 20 66 74 73 35 43 6c 6f 73 65 52        fts5CloseR
225a0 65 61 64 65 72 28 70 29 3b 0a 20 20 20 20 7d 0a  eader(p);.    }.
225b0 20 20 20 20 2a 70 70 49 74 65 72 20 3d 20 70 52      *ppIter = pR
225c0 65 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 46  et;.    sqlite3F
225d0 74 73 35 42 75 66 66 65 72 46 72 65 65 28 26 62  ts5BufferFree(&b
225e0 75 66 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  uf);.  }.  retur
225f0 6e 20 66 74 73 35 49 6e 64 65 78 52 65 74 75 72  n fts5IndexRetur
22600 6e 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  n(p);.}../*.** R
22610 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 74 68  eturn true if th
22620 65 20 69 74 65 72 61 74 6f 72 20 70 61 73 73 65  e iterator passe
22630 64 20 61 73 20 74 68 65 20 6f 6e 6c 79 20 61 72  d as the only ar
22640 67 75 6d 65 6e 74 20 69 73 20 61 74 20 45 4f 46  gument is at EOF
22650 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
22660 46 74 73 35 49 74 65 72 45 6f 66 28 46 74 73 35  Fts5IterEof(Fts5
22670 49 6e 64 65 78 49 74 65 72 20 2a 70 49 74 65 72  IndexIter *pIter
22680 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 49 74  ){.  assert( pIt
22690 65 72 2d 3e 70 49 6e 64 65 78 2d 3e 72 63 3d 3d  er->pIndex->rc==
226a0 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 72  SQLITE_OK );.  r
226b0 65 74 75 72 6e 20 70 49 74 65 72 2d 3e 62 45 6f  eturn pIter->bEo
226c0 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65  f;.}../*.** Move
226d0 20 74 6f 20 74 68 65 20 6e 65 78 74 20 6d 61 74   to the next mat
226e0 63 68 69 6e 67 20 72 6f 77 69 64 2e 20 0a 2a 2f  ching rowid. .*/
226f0 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35  .int sqlite3Fts5
22700 49 74 65 72 4e 65 78 74 28 46 74 73 35 49 6e 64  IterNext(Fts5Ind
22710 65 78 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a  exIter *pIter){.
22720 20 20 61 73 73 65 72 74 28 20 70 49 74 65 72 2d    assert( pIter-
22730 3e 70 49 6e 64 65 78 2d 3e 72 63 3d 3d 53 51 4c  >pIndex->rc==SQL
22740 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 66 74 73 35  ITE_OK );.  fts5
22750 4d 75 6c 74 69 49 74 65 72 4e 65 78 74 28 70 49  MultiIterNext(pI
22760 74 65 72 2d 3e 70 49 6e 64 65 78 2c 20 70 49 74  ter->pIndex, pIt
22770 65 72 2c 20 30 2c 20 30 29 3b 0a 20 20 72 65 74  er, 0, 0);.  ret
22780 75 72 6e 20 66 74 73 35 49 6e 64 65 78 52 65 74  urn fts5IndexRet
22790 75 72 6e 28 70 49 74 65 72 2d 3e 70 49 6e 64 65  urn(pIter->pInde
227a0 78 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76  x);.}../*.** Mov
227b0 65 20 74 6f 20 74 68 65 20 6e 65 78 74 20 6d 61  e to the next ma
227c0 74 63 68 69 6e 67 20 74 65 72 6d 2f 72 6f 77 69  tching term/rowi
227d0 64 2e 20 55 73 65 64 20 62 79 20 74 68 65 20 66  d. Used by the f
227e0 74 73 35 76 6f 63 61 62 20 6d 6f 64 75 6c 65 2e  ts5vocab module.
227f0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46  .*/.int sqlite3F
22800 74 73 35 49 74 65 72 4e 65 78 74 53 63 61 6e 28  ts5IterNextScan(
22810 46 74 73 35 49 6e 64 65 78 49 74 65 72 20 2a 70  Fts5IndexIter *p
22820 49 74 65 72 29 7b 0a 20 20 46 74 73 35 49 6e 64  Iter){.  Fts5Ind
22830 65 78 20 2a 70 20 3d 20 70 49 74 65 72 2d 3e 70  ex *p = pIter->p
22840 49 6e 64 65 78 3b 0a 0a 20 20 61 73 73 65 72 74  Index;..  assert
22850 28 20 70 49 74 65 72 2d 3e 70 49 6e 64 65 78 2d  ( pIter->pIndex-
22860 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  >rc==SQLITE_OK )
22870 3b 0a 0a 20 20 66 74 73 35 4d 75 6c 74 69 49 74  ;..  fts5MultiIt
22880 65 72 4e 65 78 74 28 70 2c 20 70 49 74 65 72 2c  erNext(p, pIter,
22890 20 30 2c 20 30 29 3b 0a 20 20 69 66 28 20 70 2d   0, 0);.  if( p-
228a0 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  >rc==SQLITE_OK )
228b0 7b 0a 20 20 20 20 46 74 73 35 53 65 67 49 74 65  {.    Fts5SegIte
228c0 72 20 2a 70 53 65 67 20 3d 20 26 70 49 74 65 72  r *pSeg = &pIter
228d0 2d 3e 61 53 65 67 5b 20 70 49 74 65 72 2d 3e 61  ->aSeg[ pIter->a
228e0 46 69 72 73 74 5b 31 5d 2e 69 46 69 72 73 74 20  First[1].iFirst 
228f0 5d 3b 0a 20 20 20 20 69 66 28 20 70 53 65 67 2d  ];.    if( pSeg-
22900 3e 70 4c 65 61 66 20 26 26 20 70 53 65 67 2d 3e  >pLeaf && pSeg->
22910 74 65 72 6d 2e 70 5b 30 5d 21 3d 46 54 53 35 5f  term.p[0]!=FTS5_
22920 4d 41 49 4e 5f 50 52 45 46 49 58 20 29 7b 0a 20  MAIN_PREFIX ){. 
22930 20 20 20 20 20 66 74 73 35 44 61 74 61 52 65 6c       fts5DataRel
22940 65 61 73 65 28 70 53 65 67 2d 3e 70 4c 65 61 66  ease(pSeg->pLeaf
22950 29 3b 0a 20 20 20 20 20 20 70 53 65 67 2d 3e 70  );.      pSeg->p
22960 4c 65 61 66 20 3d 20 30 3b 0a 20 20 20 20 20 20  Leaf = 0;.      
22970 70 49 74 65 72 2d 3e 62 45 6f 66 20 3d 20 31 3b  pIter->bEof = 1;
22980 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65  .    }.  }..  re
22990 74 75 72 6e 20 66 74 73 35 49 6e 64 65 78 52 65  turn fts5IndexRe
229a0 74 75 72 6e 28 70 49 74 65 72 2d 3e 70 49 6e 64  turn(pIter->pInd
229b0 65 78 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f  ex);.}../*.** Mo
229c0 76 65 20 74 6f 20 74 68 65 20 6e 65 78 74 20 6d  ve to the next m
229d0 61 74 63 68 69 6e 67 20 72 6f 77 69 64 20 74 68  atching rowid th
229e0 61 74 20 6f 63 63 75 72 73 20 61 74 20 6f 72 20  at occurs at or 
229f0 61 66 74 65 72 20 69 4d 61 74 63 68 2e 20 54 68  after iMatch. Th
22a00 65 0a 2a 2a 20 64 65 66 69 6e 69 74 69 6f 6e 20  e.** definition 
22a10 6f 66 20 22 61 74 20 6f 72 20 61 66 74 65 72 22  of "at or after"
22a20 20 64 65 70 65 6e 64 73 20 6f 6e 20 77 68 65 74   depends on whet
22a30 68 65 72 20 74 68 69 73 20 69 74 65 72 61 74 6f  her this iterato
22a40 72 20 69 74 65 72 61 74 65 73 0a 2a 2a 20 69 6e  r iterates.** in
22a50 20 61 73 63 65 6e 64 69 6e 67 20 6f 72 20 64 65   ascending or de
22a60 73 63 65 6e 64 69 6e 67 20 72 6f 77 69 64 20 6f  scending rowid o
22a70 72 64 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  rder..*/.int sql
22a80 69 74 65 33 46 74 73 35 49 74 65 72 4e 65 78 74  ite3Fts5IterNext
22a90 46 72 6f 6d 28 46 74 73 35 49 6e 64 65 78 49 74  From(Fts5IndexIt
22aa0 65 72 20 2a 70 49 74 65 72 2c 20 69 36 34 20 69  er *pIter, i64 i
22ab0 4d 61 74 63 68 29 7b 0a 20 20 66 74 73 35 4d 75  Match){.  fts5Mu
22ac0 6c 74 69 49 74 65 72 4e 65 78 74 46 72 6f 6d 28  ltiIterNextFrom(
22ad0 70 49 74 65 72 2d 3e 70 49 6e 64 65 78 2c 20 70  pIter->pIndex, p
22ae0 49 74 65 72 2c 20 69 4d 61 74 63 68 29 3b 0a 20  Iter, iMatch);. 
22af0 20 72 65 74 75 72 6e 20 66 74 73 35 49 6e 64 65   return fts5Inde
22b00 78 52 65 74 75 72 6e 28 70 49 74 65 72 2d 3e 70  xReturn(pIter->p
22b10 49 6e 64 65 78 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  Index);.}../*.**
22b20 20 52 65 74 75 72 6e 20 74 68 65 20 63 75 72 72   Return the curr
22b30 65 6e 74 20 72 6f 77 69 64 2e 0a 2a 2f 0a 69 36  ent rowid..*/.i6
22b40 34 20 73 71 6c 69 74 65 33 46 74 73 35 49 74 65  4 sqlite3Fts5Ite
22b50 72 52 6f 77 69 64 28 46 74 73 35 49 6e 64 65 78  rRowid(Fts5Index
22b60 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a 20 20  Iter *pIter){.  
22b70 72 65 74 75 72 6e 20 66 74 73 35 4d 75 6c 74 69  return fts5Multi
22b80 49 74 65 72 52 6f 77 69 64 28 70 49 74 65 72 29  IterRowid(pIter)
22b90 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
22ba0 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 65  n the current te
22bb0 72 6d 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61  rm..*/.const cha
22bc0 72 20 2a 73 71 6c 69 74 65 33 46 74 73 35 49 74  r *sqlite3Fts5It
22bd0 65 72 54 65 72 6d 28 46 74 73 35 49 6e 64 65 78  erTerm(Fts5Index
22be0 49 74 65 72 20 2a 70 49 74 65 72 2c 20 69 6e 74  Iter *pIter, int
22bf0 20 2a 70 6e 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a   *pn){.  int n;.
22c00 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20    const char *z 
22c10 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 66  = (const char*)f
22c20 74 73 35 4d 75 6c 74 69 49 74 65 72 54 65 72 6d  ts5MultiIterTerm
22c30 28 70 49 74 65 72 2c 20 26 6e 29 3b 0a 20 20 2a  (pIter, &n);.  *
22c40 70 6e 20 3d 20 6e 2d 31 3b 0a 20 20 72 65 74 75  pn = n-1;.  retu
22c50 72 6e 20 26 7a 5b 31 5d 3b 0a 7d 0a 0a 0a 2f 2a  rn &z[1];.}.../*
22c60 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69  .** Return a poi
22c70 6e 74 65 72 20 74 6f 20 61 20 62 75 66 66 65 72  nter to a buffer
22c80 20 63 6f 6e 74 61 69 6e 69 6e 67 20 61 20 63 6f   containing a co
22c90 70 79 20 6f 66 20 74 68 65 20 70 6f 73 69 74 69  py of the positi
22ca0 6f 6e 20 6c 69 73 74 20 66 6f 72 0a 2a 2a 20 74  on list for.** t
22cb0 68 65 20 63 75 72 72 65 6e 74 20 65 6e 74 72 79  he current entry
22cc0 2e 20 4f 75 74 70 75 74 20 76 61 72 69 61 62 6c  . Output variabl
22cd0 65 20 2a 70 6e 20 69 73 20 73 65 74 20 74 6f 20  e *pn is set to 
22ce0 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
22cf0 62 75 66 66 65 72 20 0a 2a 2a 20 69 6e 20 62 79  buffer .** in by
22d00 74 65 73 20 62 65 66 6f 72 65 20 72 65 74 75 72  tes before retur
22d10 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ning..**.** The 
22d20 72 65 74 75 72 6e 65 64 20 70 6f 73 69 74 69 6f  returned positio
22d30 6e 20 6c 69 73 74 20 64 6f 65 73 20 6e 6f 74 20  n list does not 
22d40 69 6e 63 6c 75 64 65 20 74 68 65 20 22 6e 75 6d  include the "num
22d50 62 65 72 20 6f 66 20 62 79 74 65 73 22 20 76 61  ber of bytes" va
22d60 72 69 6e 74 0a 2a 2a 20 66 69 65 6c 64 20 74 68  rint.** field th
22d70 61 74 20 73 74 61 72 74 73 20 74 68 65 20 70 6f  at starts the po
22d80 73 69 74 69 6f 6e 20 6c 69 73 74 20 6f 6e 20 64  sition list on d
22d90 69 73 6b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  isk..*/.int sqli
22da0 74 65 33 46 74 73 35 49 74 65 72 50 6f 73 6c 69  te3Fts5IterPosli
22db0 73 74 28 0a 20 20 46 74 73 35 49 6e 64 65 78 49  st(.  Fts5IndexI
22dc0 74 65 72 20 2a 70 49 74 65 72 2c 20 0a 20 20 63  ter *pIter, .  c
22dd0 6f 6e 73 74 20 75 38 20 2a 2a 70 70 2c 20 20 20  onst u8 **pp,   
22de0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
22df0 2a 20 4f 55 54 3a 20 50 6f 69 6e 74 65 72 20 74  * OUT: Pointer t
22e00 6f 20 70 6f 73 69 74 69 6f 6e 2d 6c 69 73 74 20  o position-list 
22e10 64 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20 2a 70  data */.  int *p
22e20 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n,              
22e30 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54            /* OUT
22e40 3a 20 53 69 7a 65 20 6f 66 20 70 6f 73 69 74 69  : Size of positi
22e50 6f 6e 2d 6c 69 73 74 20 69 6e 20 62 79 74 65 73  on-list in bytes
22e60 20 2a 2f 0a 20 20 69 36 34 20 2a 70 69 52 6f 77   */.  i64 *piRow
22e70 69 64 20 20 20 20 20 20 20 20 20 20 20 20 20 20  id              
22e80 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 43 75        /* OUT: Cu
22e90 72 72 65 6e 74 20 72 6f 77 69 64 20 2a 2f 0a 29  rrent rowid */.)
22ea0 7b 0a 20 20 46 74 73 35 53 65 67 49 74 65 72 20  {.  Fts5SegIter 
22eb0 2a 70 53 65 67 20 3d 20 26 70 49 74 65 72 2d 3e  *pSeg = &pIter->
22ec0 61 53 65 67 5b 20 70 49 74 65 72 2d 3e 61 46 69  aSeg[ pIter->aFi
22ed0 72 73 74 5b 31 5d 2e 69 46 69 72 73 74 20 5d 3b  rst[1].iFirst ];
22ee0 0a 20 20 61 73 73 65 72 74 28 20 70 49 74 65 72  .  assert( pIter
22ef0 2d 3e 70 49 6e 64 65 78 2d 3e 72 63 3d 3d 53 51  ->pIndex->rc==SQ
22f00 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 2a 70 69  LITE_OK );.  *pi
22f10 52 6f 77 69 64 20 3d 20 70 53 65 67 2d 3e 69 52  Rowid = pSeg->iR
22f20 6f 77 69 64 3b 0a 20 20 2a 70 6e 20 3d 20 70 53  owid;.  *pn = pS
22f30 65 67 2d 3e 6e 50 6f 73 3b 0a 20 20 69 66 28 20  eg->nPos;.  if( 
22f40 70 53 65 67 2d 3e 69 4c 65 61 66 4f 66 66 73 65  pSeg->iLeafOffse
22f50 74 2b 70 53 65 67 2d 3e 6e 50 6f 73 20 3c 3d 20  t+pSeg->nPos <= 
22f60 70 53 65 67 2d 3e 70 4c 65 61 66 2d 3e 73 7a 4c  pSeg->pLeaf->szL
22f70 65 61 66 20 29 7b 0a 20 20 20 20 2a 70 70 20 3d  eaf ){.    *pp =
22f80 20 26 70 53 65 67 2d 3e 70 4c 65 61 66 2d 3e 70   &pSeg->pLeaf->p
22f90 5b 70 53 65 67 2d 3e 69 4c 65 61 66 4f 66 66 73  [pSeg->iLeafOffs
22fa0 65 74 5d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  et];.  }else{.  
22fb0 20 20 66 74 73 35 42 75 66 66 65 72 5a 65 72 6f    fts5BufferZero
22fc0 28 26 70 49 74 65 72 2d 3e 70 6f 73 6c 69 73 74  (&pIter->poslist
22fd0 29 3b 0a 20 20 20 20 66 74 73 35 53 65 67 69 74  );.    fts5Segit
22fe0 65 72 50 6f 73 6c 69 73 74 28 70 49 74 65 72 2d  erPoslist(pIter-
22ff0 3e 70 49 6e 64 65 78 2c 20 70 53 65 67 2c 20 26  >pIndex, pSeg, &
23000 70 49 74 65 72 2d 3e 70 6f 73 6c 69 73 74 29 3b  pIter->poslist);
23010 0a 20 20 20 20 2a 70 70 20 3d 20 70 49 74 65 72  .    *pp = pIter
23020 2d 3e 70 6f 73 6c 69 73 74 2e 70 3b 0a 20 20 7d  ->poslist.p;.  }
23030 0a 20 20 72 65 74 75 72 6e 20 66 74 73 35 49 6e  .  return fts5In
23040 64 65 78 52 65 74 75 72 6e 28 70 49 74 65 72 2d  dexReturn(pIter-
23050 3e 70 49 6e 64 65 78 29 3b 0a 7d 0a 0a 2f 2a 0a  >pIndex);.}../*.
23060 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
23070 20 69 73 20 73 69 6d 69 6c 61 72 20 74 6f 20 73   is similar to s
23080 71 6c 69 74 65 33 46 74 73 35 49 74 65 72 50 6f  qlite3Fts5IterPo
23090 73 6c 69 73 74 28 29 2c 20 65 78 63 65 70 74 20  slist(), except 
230a0 74 68 61 74 20 69 74 0a 2a 2a 20 63 6f 70 69 65  that it.** copie
230b0 73 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 20 6c  s the position l
230c0 69 73 74 20 69 6e 74 6f 20 74 68 65 20 62 75 66  ist into the buf
230d0 66 65 72 20 73 75 70 70 6c 69 65 64 20 61 73 20  fer supplied as 
230e0 74 68 65 20 73 65 63 6f 6e 64 20 0a 2a 2a 20 61  the second .** a
230f0 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 69 6e 74 20  rgument..*/.int 
23100 73 71 6c 69 74 65 33 46 74 73 35 49 74 65 72 50  sqlite3Fts5IterP
23110 6f 73 6c 69 73 74 42 75 66 66 65 72 28 46 74 73  oslistBuffer(Fts
23120 35 49 6e 64 65 78 49 74 65 72 20 2a 70 49 74 65  5IndexIter *pIte
23130 72 2c 20 46 74 73 35 42 75 66 66 65 72 20 2a 70  r, Fts5Buffer *p
23140 42 75 66 29 7b 0a 20 20 46 74 73 35 49 6e 64 65  Buf){.  Fts5Inde
23150 78 20 2a 70 20 3d 20 70 49 74 65 72 2d 3e 70 49  x *p = pIter->pI
23160 6e 64 65 78 3b 0a 0a 20 20 61 73 73 65 72 74 28  ndex;..  assert(
23170 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
23180 4b 20 29 3b 0a 20 20 66 74 73 35 42 75 66 66 65  K );.  fts5Buffe
23190 72 5a 65 72 6f 28 70 42 75 66 29 3b 0a 20 20 66  rZero(pBuf);.  f
231a0 74 73 35 4d 75 6c 74 69 49 74 65 72 50 6f 73 6c  ts5MultiIterPosl
231b0 69 73 74 28 70 2c 20 70 49 74 65 72 2c 20 30 2c  ist(p, pIter, 0,
231c0 20 70 42 75 66 29 3b 0a 20 20 72 65 74 75 72 6e   pBuf);.  return
231d0 20 66 74 73 35 49 6e 64 65 78 52 65 74 75 72 6e   fts5IndexReturn
231e0 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c  (p);.}../*.** Cl
231f0 6f 73 65 20 61 6e 20 69 74 65 72 61 74 6f 72 20  ose an iterator 
23200 6f 70 65 6e 65 64 20 62 79 20 61 6e 20 65 61 72  opened by an ear
23210 6c 69 65 72 20 63 61 6c 6c 20 74 6f 20 73 71 6c  lier call to sql
23220 69 74 65 33 46 74 73 35 49 6e 64 65 78 51 75 65  ite3Fts5IndexQue
23230 72 79 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ry()..*/.void sq
23240 6c 69 74 65 33 46 74 73 35 49 74 65 72 43 6c 6f  lite3Fts5IterClo
23250 73 65 28 46 74 73 35 49 6e 64 65 78 49 74 65 72  se(Fts5IndexIter
23260 20 2a 70 49 74 65 72 29 7b 0a 20 20 69 66 28 20   *pIter){.  if( 
23270 70 49 74 65 72 20 29 7b 0a 20 20 20 20 46 74 73  pIter ){.    Fts
23280 35 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 20 3d  5Index *pIndex =
23290 20 70 49 74 65 72 2d 3e 70 49 6e 64 65 78 3b 0a   pIter->pIndex;.
232a0 20 20 20 20 66 74 73 35 4d 75 6c 74 69 49 74 65      fts5MultiIte
232b0 72 46 72 65 65 28 70 49 74 65 72 2d 3e 70 49 6e  rFree(pIter->pIn
232c0 64 65 78 2c 20 70 49 74 65 72 29 3b 0a 20 20 20  dex, pIter);.   
232d0 20 66 74 73 35 43 6c 6f 73 65 52 65 61 64 65 72   fts5CloseReader
232e0 28 70 49 6e 64 65 78 29 3b 0a 20 20 7d 0a 7d 0a  (pIndex);.  }.}.
232f0 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 61 6e 64 20  ./*.** Read and 
23300 64 65 63 6f 64 65 20 74 68 65 20 22 61 76 65 72  decode the "aver
23310 61 67 65 73 22 20 72 65 63 6f 72 64 20 66 72 6f  ages" record fro
23320 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20  m the database. 
23330 0a 2a 2a 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72  .**.** Parameter
23340 20 61 6e 53 69 7a 65 20 6d 75 73 74 20 70 6f 69   anSize must poi
23350 6e 74 20 74 6f 20 61 6e 20 61 72 72 61 79 20 6f  nt to an array o
23360 66 20 73 69 7a 65 20 6e 43 6f 6c 2c 20 77 68 65  f size nCol, whe
23370 72 65 20 6e 43 6f 6c 20 69 73 0a 2a 2a 20 74 68  re nCol is.** th
23380 65 20 6e 75 6d 62 65 72 20 6f 66 20 75 73 65 72  e number of user
23390 20 64 65 66 69 6e 65 64 20 63 6f 6c 75 6d 6e 73   defined columns
233a0 20 69 6e 20 74 68 65 20 46 54 53 20 74 61 62 6c   in the FTS tabl
233b0 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  e..*/.int sqlite
233c0 33 46 74 73 35 49 6e 64 65 78 47 65 74 41 76 65  3Fts5IndexGetAve
233d0 72 61 67 65 73 28 46 74 73 35 49 6e 64 65 78 20  rages(Fts5Index 
233e0 2a 70 2c 20 69 36 34 20 2a 70 6e 52 6f 77 2c 20  *p, i64 *pnRow, 
233f0 69 36 34 20 2a 61 6e 53 69 7a 65 29 7b 0a 20 20  i64 *anSize){.  
23400 69 6e 74 20 6e 43 6f 6c 20 3d 20 70 2d 3e 70 43  int nCol = p->pC
23410 6f 6e 66 69 67 2d 3e 6e 43 6f 6c 3b 0a 20 20 46  onfig->nCol;.  F
23420 74 73 35 44 61 74 61 20 2a 70 44 61 74 61 3b 0a  ts5Data *pData;.
23430 0a 20 20 2a 70 6e 52 6f 77 20 3d 20 30 3b 0a 20  .  *pnRow = 0;. 
23440 20 6d 65 6d 73 65 74 28 61 6e 53 69 7a 65 2c 20   memset(anSize, 
23450 30 2c 20 73 69 7a 65 6f 66 28 69 36 34 29 20 2a  0, sizeof(i64) *
23460 20 6e 43 6f 6c 29 3b 0a 20 20 70 44 61 74 61 20   nCol);.  pData 
23470 3d 20 66 74 73 35 44 61 74 61 52 65 61 64 28 70  = fts5DataRead(p
23480 2c 20 46 54 53 35 5f 41 56 45 52 41 47 45 53 5f  , FTS5_AVERAGES_
23490 52 4f 57 49 44 29 3b 0a 20 20 69 66 28 20 70 2d  ROWID);.  if( p-
234a0 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26  >rc==SQLITE_OK &
234b0 26 20 70 44 61 74 61 2d 3e 6e 6e 20 29 7b 0a 20  & pData->nn ){. 
234c0 20 20 20 69 6e 74 20 69 20 3d 20 30 3b 0a 20 20     int i = 0;.  
234d0 20 20 69 6e 74 20 69 43 6f 6c 3b 0a 20 20 20 20    int iCol;.    
234e0 69 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69  i += fts5GetVari
234f0 6e 74 28 26 70 44 61 74 61 2d 3e 70 5b 69 5d 2c  nt(&pData->p[i],
23500 20 28 75 36 34 2a 29 70 6e 52 6f 77 29 3b 0a 20   (u64*)pnRow);. 
23510 20 20 20 66 6f 72 28 69 43 6f 6c 3d 30 3b 20 69     for(iCol=0; i
23520 3c 70 44 61 74 61 2d 3e 6e 6e 20 26 26 20 69 43  <pData->nn && iC
23530 6f 6c 3c 6e 43 6f 6c 3b 20 69 43 6f 6c 2b 2b 29  ol<nCol; iCol++)
23540 7b 0a 20 20 20 20 20 20 69 20 2b 3d 20 66 74 73  {.      i += fts
23550 35 47 65 74 56 61 72 69 6e 74 28 26 70 44 61 74  5GetVarint(&pDat
23560 61 2d 3e 70 5b 69 5d 2c 20 28 75 36 34 2a 29 26  a->p[i], (u64*)&
23570 61 6e 53 69 7a 65 5b 69 43 6f 6c 5d 29 3b 0a 20  anSize[iCol]);. 
23580 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 66 74 73 35     }.  }..  fts5
23590 44 61 74 61 52 65 6c 65 61 73 65 28 70 44 61 74  DataRelease(pDat
235a0 61 29 3b 0a 20 20 72 65 74 75 72 6e 20 66 74 73  a);.  return fts
235b0 35 49 6e 64 65 78 52 65 74 75 72 6e 28 70 29 3b  5IndexReturn(p);
235c0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 70 6c 61 63  .}../*.** Replac
235d0 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 22 61  e the current "a
235e0 76 65 72 61 67 65 73 22 20 72 65 63 6f 72 64 20  verages" record 
235f0 77 69 74 68 20 74 68 65 20 63 6f 6e 74 65 6e 74  with the content
23600 73 20 6f 66 20 74 68 65 20 62 75 66 66 65 72 20  s of the buffer 
23610 0a 2a 2a 20 73 75 70 70 6c 69 65 64 20 61 73 20  .** supplied as 
23620 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  the second argum
23630 65 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ent..*/.int sqli
23640 74 65 33 46 74 73 35 49 6e 64 65 78 53 65 74 41  te3Fts5IndexSetA
23650 76 65 72 61 67 65 73 28 46 74 73 35 49 6e 64 65  verages(Fts5Inde
23660 78 20 2a 70 2c 20 63 6f 6e 73 74 20 75 38 20 2a  x *p, const u8 *
23670 70 44 61 74 61 2c 20 69 6e 74 20 6e 44 61 74 61  pData, int nData
23680 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  ){.  assert( p->
23690 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  rc==SQLITE_OK );
236a0 0a 20 20 66 74 73 35 44 61 74 61 57 72 69 74 65  .  fts5DataWrite
236b0 28 70 2c 20 46 54 53 35 5f 41 56 45 52 41 47 45  (p, FTS5_AVERAGE
236c0 53 5f 52 4f 57 49 44 2c 20 70 44 61 74 61 2c 20  S_ROWID, pData, 
236d0 6e 44 61 74 61 29 3b 0a 20 20 72 65 74 75 72 6e  nData);.  return
236e0 20 66 74 73 35 49 6e 64 65 78 52 65 74 75 72 6e   fts5IndexReturn
236f0 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  (p);.}../*.** Re
23700 74 75 72 6e 20 74 68 65 20 74 6f 74 61 6c 20 6e  turn the total n
23710 75 6d 62 65 72 20 6f 66 20 62 6c 6f 63 6b 73 20  umber of blocks 
23720 74 68 69 73 20 6d 6f 64 75 6c 65 20 68 61 73 20  this module has 
23730 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 25 5f  read from the %_
23740 64 61 74 61 0a 2a 2a 20 74 61 62 6c 65 20 73 69  data.** table si
23750 6e 63 65 20 69 74 20 77 61 73 20 63 72 65 61 74  nce it was creat
23760 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ed..*/.int sqlit
23770 65 33 46 74 73 35 49 6e 64 65 78 52 65 61 64 73  e3Fts5IndexReads
23780 28 46 74 73 35 49 6e 64 65 78 20 2a 70 29 7b 0a  (Fts5Index *p){.
23790 20 20 72 65 74 75 72 6e 20 70 2d 3e 6e 52 65 61    return p->nRea
237a0 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20  d;.}../*.** Set 
237b0 74 68 65 20 33 32 2d 62 69 74 20 63 6f 6f 6b 69  the 32-bit cooki
237c0 65 20 76 61 6c 75 65 20 73 74 6f 72 65 64 20 61  e value stored a
237d0 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 61  t the start of a
237e0 6c 6c 20 73 74 72 75 63 74 75 72 65 20 0a 2a 2a  ll structure .**
237f0 20 72 65 63 6f 72 64 73 20 74 6f 20 74 68 65 20   records to the 
23800 76 61 6c 75 65 20 70 61 73 73 65 64 20 61 73 20  value passed as 
23810 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  the second argum
23820 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  ent..**.** Retur
23830 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 73  n SQLITE_OK if s
23840 75 63 63 65 73 73 66 75 6c 2c 20 6f 72 20 61 6e  uccessful, or an
23850 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f   SQLite error co
23860 64 65 20 69 66 20 61 6e 20 65 72 72 6f 72 0a 2a  de if an error.*
23870 2a 20 6f 63 63 75 72 73 2e 0a 2a 2f 0a 69 6e 74  * occurs..*/.int
23880 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65   sqlite3Fts5Inde
23890 78 53 65 74 43 6f 6f 6b 69 65 28 46 74 73 35 49  xSetCookie(Fts5I
238a0 6e 64 65 78 20 2a 70 2c 20 69 6e 74 20 69 4e 65  ndex *p, int iNe
238b0 77 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20  w){.  int rc;   
238c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
238d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
238e0 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 46  turn code */.  F
238f0 74 73 35 43 6f 6e 66 69 67 20 2a 70 43 6f 6e 66  ts5Config *pConf
23900 69 67 20 3d 20 70 2d 3e 70 43 6f 6e 66 69 67 3b  ig = p->pConfig;
23910 20 20 20 20 2f 2a 20 43 6f 6e 66 69 67 75 72 61      /* Configura
23920 74 69 6f 6e 20 6f 62 6a 65 63 74 20 2a 2f 0a 20  tion object */. 
23930 20 75 38 20 61 43 6f 6f 6b 69 65 5b 34 5d 3b 20   u8 aCookie[4]; 
23940 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23950 20 20 20 20 20 20 2f 2a 20 42 69 6e 61 72 79 20        /* Binary 
23960 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f  representation o
23970 66 20 69 4e 65 77 20 2a 2f 0a 20 20 73 71 6c 69  f iNew */.  sqli
23980 74 65 33 5f 62 6c 6f 62 20 2a 70 42 6c 6f 62 20  te3_blob *pBlob 
23990 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  = 0;..  assert( 
239a0 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
239b0 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 46 74 73   );.  sqlite3Fts
239c0 35 50 75 74 33 32 28 61 43 6f 6f 6b 69 65 2c 20  5Put32(aCookie, 
239d0 69 4e 65 77 29 3b 0a 0a 20 20 72 63 20 3d 20 73  iNew);..  rc = s
239e0 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 6f 70 65 6e  qlite3_blob_open
239f0 28 70 43 6f 6e 66 69 67 2d 3e 64 62 2c 20 70 43  (pConfig->db, pC
23a00 6f 6e 66 69 67 2d 3e 7a 44 62 2c 20 70 2d 3e 7a  onfig->zDb, p->z
23a10 44 61 74 61 54 62 6c 2c 20 0a 20 20 20 20 20 20  DataTbl, .      
23a20 22 62 6c 6f 63 6b 22 2c 20 46 54 53 35 5f 53 54  "block", FTS5_ST
23a30 52 55 43 54 55 52 45 5f 52 4f 57 49 44 2c 20 31  RUCTURE_ROWID, 1
23a40 2c 20 26 70 42 6c 6f 62 0a 20 20 29 3b 0a 20 20  , &pBlob.  );.  
23a50 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
23a60 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  K ){.    sqlite3
23a70 5f 62 6c 6f 62 5f 77 72 69 74 65 28 70 42 6c 6f  _blob_write(pBlo
23a80 62 2c 20 61 43 6f 6f 6b 69 65 2c 20 34 2c 20 30  b, aCookie, 4, 0
23a90 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  );.    rc = sqli
23aa0 74 65 33 5f 62 6c 6f 62 5f 63 6c 6f 73 65 28 70  te3_blob_close(p
23ab0 42 6c 6f 62 29 3b 0a 20 20 7d 0a 0a 20 20 72 65  Blob);.  }..  re
23ac0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 69 6e 74 20  turn rc;.}..int 
23ad0 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78  sqlite3Fts5Index
23ae0 4c 6f 61 64 43 6f 6e 66 69 67 28 46 74 73 35 49  LoadConfig(Fts5I
23af0 6e 64 65 78 20 2a 70 29 7b 0a 20 20 46 74 73 35  ndex *p){.  Fts5
23b00 53 74 72 75 63 74 75 72 65 20 2a 70 53 74 72 75  Structure *pStru
23b10 63 74 3b 0a 20 20 70 53 74 72 75 63 74 20 3d 20  ct;.  pStruct = 
23b20 66 74 73 35 53 74 72 75 63 74 75 72 65 52 65 61  fts5StructureRea
23b30 64 28 70 29 3b 0a 20 20 66 74 73 35 53 74 72 75  d(p);.  fts5Stru
23b40 63 74 75 72 65 52 65 6c 65 61 73 65 28 70 53 74  ctureRelease(pSt
23b50 72 75 63 74 29 3b 0a 20 20 72 65 74 75 72 6e 20  ruct);.  return 
23b60 66 74 73 35 49 6e 64 65 78 52 65 74 75 72 6e 28  fts5IndexReturn(
23b70 70 29 3b 0a 7d 0a 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a  p);.}.../*******
23b80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
23b90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
23ba0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
23bb0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
23bc0 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  **.*************
23bd0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
23be0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
23bf0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
23c00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a  *************.**
23c10 20 42 65 6c 6f 77 20 74 68 69 73 20 70 6f 69 6e   Below this poin
23c20 74 20 69 73 20 74 68 65 20 69 6d 70 6c 65 6d 65  t is the impleme
23c30 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 69  ntation of the i
23c40 6e 74 65 67 72 69 74 79 2d 63 68 65 63 6b 20 0a  ntegrity-check .
23c50 2a 2a 20 66 75 6e 63 74 69 6f 6e 61 6c 69 74 79  ** functionality
23c60 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  ..*/../*.** Retu
23c70 72 6e 20 61 20 73 69 6d 70 6c 65 20 63 68 65 63  rn a simple chec
23c80 6b 73 75 6d 20 76 61 6c 75 65 20 62 61 73 65 64  ksum value based
23c90 20 6f 6e 20 74 68 65 20 61 72 67 75 6d 65 6e 74   on the argument
23ca0 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75 36 34  s..*/.static u64
23cb0 20 66 74 73 35 49 6e 64 65 78 45 6e 74 72 79 43   fts5IndexEntryC
23cc0 6b 73 75 6d 28 0a 20 20 69 36 34 20 69 52 6f 77  ksum(.  i64 iRow
23cd0 69 64 2c 20 0a 20 20 69 6e 74 20 69 43 6f 6c 2c  id, .  int iCol,
23ce0 20 0a 20 20 69 6e 74 20 69 50 6f 73 2c 20 0a 20   .  int iPos, . 
23cf0 20 69 6e 74 20 69 49 64 78 2c 0a 20 20 63 6f 6e   int iIdx,.  con
23d00 73 74 20 63 68 61 72 20 2a 70 54 65 72 6d 2c 0a  st char *pTerm,.
23d10 20 20 69 6e 74 20 6e 54 65 72 6d 0a 29 7b 0a 20    int nTerm.){. 
23d20 20 69 6e 74 20 69 3b 0a 20 20 75 36 34 20 72 65   int i;.  u64 re
23d30 74 20 3d 20 69 52 6f 77 69 64 3b 0a 20 20 72 65  t = iRowid;.  re
23d40 74 20 2b 3d 20 28 72 65 74 3c 3c 33 29 20 2b 20  t += (ret<<3) + 
23d50 69 43 6f 6c 3b 0a 20 20 72 65 74 20 2b 3d 20 28  iCol;.  ret += (
23d60 72 65 74 3c 3c 33 29 20 2b 20 69 50 6f 73 3b 0a  ret<<3) + iPos;.
23d70 20 20 69 66 28 20 69 49 64 78 3e 3d 30 20 29 20    if( iIdx>=0 ) 
23d80 72 65 74 20 2b 3d 20 28 72 65 74 3c 3c 33 29 20  ret += (ret<<3) 
23d90 2b 20 28 46 54 53 35 5f 4d 41 49 4e 5f 50 52 45  + (FTS5_MAIN_PRE
23da0 46 49 58 20 2b 20 69 49 64 78 29 3b 0a 20 20 66  FIX + iIdx);.  f
23db0 6f 72 28 69 3d 30 3b 20 69 3c 6e 54 65 72 6d 3b  or(i=0; i<nTerm;
23dc0 20 69 2b 2b 29 20 72 65 74 20 2b 3d 20 28 72 65   i++) ret += (re
23dd0 74 3c 3c 33 29 20 2b 20 70 54 65 72 6d 5b 69 5d  t<<3) + pTerm[i]
23de0 3b 0a 20 20 72 65 74 75 72 6e 20 72 65 74 3b 0a  ;.  return ret;.
23df0 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  }..#ifdef SQLITE
23e00 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 54 68 69  _DEBUG./*.** Thi
23e10 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 70 75  s function is pu
23e20 72 65 6c 79 20 61 6e 20 69 6e 74 65 72 6e 61 6c  rely an internal
23e30 20 74 65 73 74 2e 20 49 74 20 64 6f 65 73 20 6e   test. It does n
23e40 6f 74 20 63 6f 6e 74 72 69 62 75 74 65 20 74 6f  ot contribute to
23e50 20 0a 2a 2a 20 46 54 53 20 66 75 6e 63 74 69 6f   .** FTS functio
23e60 6e 61 6c 69 74 79 2c 20 6f 72 20 65 76 65 6e 20  nality, or even 
23e70 74 68 65 20 69 6e 74 65 67 72 69 74 79 2d 63 68  the integrity-ch
23e80 65 63 6b 2c 20 69 6e 20 61 6e 79 20 77 61 79 2e  eck, in any way.
23e90 0a 2a 2a 0a 2a 2a 20 49 6e 73 74 65 61 64 2c 20  .**.** Instead, 
23ea0 69 74 20 74 65 73 74 73 20 74 68 61 74 20 74 68  it tests that th
23eb0 65 20 73 61 6d 65 20 73 65 74 20 6f 66 20 70 67  e same set of pg
23ec0 6e 6f 2f 72 6f 77 69 64 20 63 6f 6d 62 69 6e 61  no/rowid combina
23ed0 74 69 6f 6e 73 20 61 72 65 20 0a 2a 2a 20 76 69  tions are .** vi
23ee0 73 69 74 65 64 20 72 65 67 61 72 64 6c 65 73 73  sited regardless
23ef0 20 6f 66 20 77 68 65 74 68 65 72 20 74 68 65 20   of whether the 
23f00 64 6f 63 6c 69 73 74 2d 69 6e 64 65 78 20 69 64  doclist-index id
23f10 65 6e 74 69 66 69 65 64 20 62 79 20 70 61 72 61  entified by para
23f20 6d 65 74 65 72 73 0a 2a 2a 20 69 53 65 67 69 64  meters.** iSegid
23f30 2f 69 4c 65 61 66 20 69 73 20 69 74 65 72 61 74  /iLeaf is iterat
23f40 65 64 20 69 6e 20 66 6f 72 77 61 72 64 73 20 6f  ed in forwards o
23f50 72 20 72 65 76 65 72 73 65 20 6f 72 64 65 72 2e  r reverse order.
23f60 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
23f70 66 74 73 35 54 65 73 74 44 6c 69 64 78 52 65 76  fts5TestDlidxRev
23f80 65 72 73 65 28 0a 20 20 46 74 73 35 49 6e 64 65  erse(.  Fts5Inde
23f90 78 20 2a 70 2c 20 0a 20 20 69 6e 74 20 69 53 65  x *p, .  int iSe
23fa0 67 69 64 2c 20 20 20 20 20 20 20 20 20 20 20 20  gid,            
23fb0 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 67 6d           /* Segm
23fc0 65 6e 74 20 69 64 20 74 6f 20 6c 6f 61 64 20 66  ent id to load f
23fd0 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 65  rom */.  int iLe
23fe0 61 66 20 20 20 20 20 20 20 20 20 20 20 20 20 20  af              
23ff0 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 61 64           /* Load
24000 20 64 6f 63 6c 69 73 74 2d 69 6e 64 65 78 20 66   doclist-index f
24010 6f 72 20 74 68 69 73 20 6c 65 61 66 20 2a 2f 0a  or this leaf */.
24020 29 7b 0a 20 20 46 74 73 35 44 6c 69 64 78 49 74  ){.  Fts5DlidxIt
24030 65 72 20 2a 70 44 6c 69 64 78 20 3d 20 30 3b 0a  er *pDlidx = 0;.
24040 20 20 75 36 34 20 63 6b 73 75 6d 31 20 3d 20 31    u64 cksum1 = 1
24050 33 3b 0a 20 20 75 36 34 20 63 6b 73 75 6d 32 20  3;.  u64 cksum2 
24060 3d 20 31 33 3b 0a 0a 20 20 66 6f 72 28 70 44 6c  = 13;..  for(pDl
24070 69 64 78 3d 66 74 73 35 44 6c 69 64 78 49 74 65  idx=fts5DlidxIte
24080 72 49 6e 69 74 28 70 2c 20 30 2c 20 69 53 65 67  rInit(p, 0, iSeg
24090 69 64 2c 20 69 4c 65 61 66 29 3b 0a 20 20 20 20  id, iLeaf);.    
240a0 20 20 66 74 73 35 44 6c 69 64 78 49 74 65 72 45    fts5DlidxIterE
240b0 6f 66 28 70 2c 20 70 44 6c 69 64 78 29 3d 3d 30  of(p, pDlidx)==0
240c0 3b 0a 20 20 20 20 20 20 66 74 73 35 44 6c 69 64  ;.      fts5Dlid
240d0 78 49 74 65 72 4e 65 78 74 28 70 2c 20 70 44 6c  xIterNext(p, pDl
240e0 69 64 78 29 0a 20 20 29 7b 0a 20 20 20 20 69 36  idx).  ){.    i6
240f0 34 20 69 52 6f 77 69 64 20 3d 20 66 74 73 35 44  4 iRowid = fts5D
24100 6c 69 64 78 49 74 65 72 52 6f 77 69 64 28 70 44  lidxIterRowid(pD
24110 6c 69 64 78 29 3b 0a 20 20 20 20 69 6e 74 20 70  lidx);.    int p
24120 67 6e 6f 20 3d 20 66 74 73 35 44 6c 69 64 78 49  gno = fts5DlidxI
24130 74 65 72 50 67 6e 6f 28 70 44 6c 69 64 78 29 3b  terPgno(pDlidx);
24140 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 67 6e  .    assert( pgn
24150 6f 3e 69 4c 65 61 66 20 29 3b 0a 20 20 20 20 63  o>iLeaf );.    c
24160 6b 73 75 6d 31 20 2b 3d 20 69 52 6f 77 69 64 20  ksum1 += iRowid 
24170 2b 20 28 28 69 36 34 29 70 67 6e 6f 3c 3c 33 32  + ((i64)pgno<<32
24180 29 3b 0a 20 20 7d 0a 20 20 66 74 73 35 44 6c 69  );.  }.  fts5Dli
24190 64 78 49 74 65 72 46 72 65 65 28 70 44 6c 69 64  dxIterFree(pDlid
241a0 78 29 3b 0a 20 20 70 44 6c 69 64 78 20 3d 20 30  x);.  pDlidx = 0
241b0 3b 0a 0a 20 20 66 6f 72 28 70 44 6c 69 64 78 3d  ;..  for(pDlidx=
241c0 66 74 73 35 44 6c 69 64 78 49 74 65 72 49 6e 69  fts5DlidxIterIni
241d0 74 28 70 2c 20 31 2c 20 69 53 65 67 69 64 2c 20  t(p, 1, iSegid, 
241e0 69 4c 65 61 66 29 3b 0a 20 20 20 20 20 20 66 74  iLeaf);.      ft
241f0 73 35 44 6c 69 64 78 49 74 65 72 45 6f 66 28 70  s5DlidxIterEof(p
24200 2c 20 70 44 6c 69 64 78 29 3d 3d 30 3b 0a 20 20  , pDlidx)==0;.  
24210 20 20 20 20 66 74 73 35 44 6c 69 64 78 49 74 65      fts5DlidxIte
24220 72 50 72 65 76 28 70 2c 20 70 44 6c 69 64 78 29  rPrev(p, pDlidx)
24230 0a 20 20 29 7b 0a 20 20 20 20 69 36 34 20 69 52  .  ){.    i64 iR
24240 6f 77 69 64 20 3d 20 66 74 73 35 44 6c 69 64 78  owid = fts5Dlidx
24250 49 74 65 72 52 6f 77 69 64 28 70 44 6c 69 64 78  IterRowid(pDlidx
24260 29 3b 0a 20 20 20 20 69 6e 74 20 70 67 6e 6f 20  );.    int pgno 
24270 3d 20 66 74 73 35 44 6c 69 64 78 49 74 65 72 50  = fts5DlidxIterP
24280 67 6e 6f 28 70 44 6c 69 64 78 29 3b 0a 20 20 20  gno(pDlidx);.   
24290 20 61 73 73 65 72 74 28 20 66 74 73 35 44 6c 69   assert( fts5Dli
242a0 64 78 49 74 65 72 50 67 6e 6f 28 70 44 6c 69 64  dxIterPgno(pDlid
242b0 78 29 3e 69 4c 65 61 66 20 29 3b 0a 20 20 20 20  x)>iLeaf );.    
242c0 63 6b 73 75 6d 32 20 2b 3d 20 69 52 6f 77 69 64  cksum2 += iRowid
242d0 20 2b 20 28 28 69 36 34 29 70 67 6e 6f 3c 3c 33   + ((i64)pgno<<3
242e0 32 29 3b 0a 20 20 7d 0a 20 20 66 74 73 35 44 6c  2);.  }.  fts5Dl
242f0 69 64 78 49 74 65 72 46 72 65 65 28 70 44 6c 69  idxIterFree(pDli
24300 64 78 29 3b 0a 20 20 70 44 6c 69 64 78 20 3d 20  dx);.  pDlidx = 
24310 30 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d  0;..  if( p->rc=
24320 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 63 6b  =SQLITE_OK && ck
24330 73 75 6d 31 21 3d 63 6b 73 75 6d 32 20 29 20 70  sum1!=cksum2 ) p
24340 2d 3e 72 63 20 3d 20 46 54 53 35 5f 43 4f 52 52  ->rc = FTS5_CORR
24350 55 50 54 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69  UPT;.}..static i
24360 6e 74 20 66 74 73 35 51 75 65 72 79 43 6b 73 75  nt fts5QueryCksu
24370 6d 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a  m(.  Fts5Index *
24380 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
24390 20 20 20 20 20 2f 2a 20 46 74 73 35 20 69 6e 64       /* Fts5 ind
243a0 65 78 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69  ex object */.  i
243b0 6e 74 20 69 49 64 78 2c 0a 20 20 63 6f 6e 73 74  nt iIdx,.  const
243c0 20 63 68 61 72 20 2a 7a 2c 20 20 20 20 20 20 20   char *z,       
243d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
243e0 64 65 78 20 6b 65 79 20 74 6f 20 71 75 65 72 79  dex key to query
243f0 20 66 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 6e 2c   for */.  int n,
24400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24410 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
24420 65 20 6f 66 20 69 6e 64 65 78 20 6b 65 79 20 69  e of index key i
24430 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 69 6e 74  n bytes */.  int
24440 20 66 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20   flags,         
24450 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
24460 46 6c 61 67 73 20 66 6f 72 20 46 74 73 35 49 6e  Flags for Fts5In
24470 64 65 78 51 75 65 72 79 20 2a 2f 0a 20 20 75 36  dexQuery */.  u6
24480 34 20 2a 70 43 6b 73 75 6d 20 20 20 20 20 20 20  4 *pCksum       
24490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
244a0 20 49 4e 2f 4f 55 54 3a 20 43 68 65 63 6b 73 75   IN/OUT: Checksu
244b0 6d 20 76 61 6c 75 65 20 2a 2f 0a 29 7b 0a 20 20  m value */.){.  
244c0 75 36 34 20 63 6b 73 75 6d 20 3d 20 2a 70 43 6b  u64 cksum = *pCk
244d0 73 75 6d 3b 0a 20 20 46 74 73 35 49 6e 64 65 78  sum;.  Fts5Index
244e0 49 74 65 72 20 2a 70 49 64 78 49 74 65 72 20 3d  Iter *pIdxIter =
244f0 20 30 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 73   0;.  int rc = s
24500 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78 51  qlite3Fts5IndexQ
24510 75 65 72 79 28 70 2c 20 7a 2c 20 6e 2c 20 66 6c  uery(p, z, n, fl
24520 61 67 73 2c 20 26 70 49 64 78 49 74 65 72 29 3b  ags, &pIdxIter);
24530 0a 0a 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 53  ..  while( rc==S
24540 51 4c 49 54 45 5f 4f 4b 20 26 26 20 30 3d 3d 73  QLITE_OK && 0==s
24550 71 6c 69 74 65 33 46 74 73 35 49 74 65 72 45 6f  qlite3Fts5IterEo
24560 66 28 70 49 64 78 49 74 65 72 29 20 29 7b 0a 20  f(pIdxIter) ){. 
24570 20 20 20 69 36 34 20 64 75 6d 6d 79 3b 0a 20 20     i64 dummy;.  
24580 20 20 63 6f 6e 73 74 20 75 38 20 2a 70 50 6f 73    const u8 *pPos
24590 3b 0a 20 20 20 20 69 6e 74 20 6e 50 6f 73 3b 0a  ;.    int nPos;.
245a0 20 20 20 20 69 36 34 20 72 6f 77 69 64 20 3d 20      i64 rowid = 
245b0 73 71 6c 69 74 65 33 46 74 73 35 49 74 65 72 52  sqlite3Fts5IterR
245c0 6f 77 69 64 28 70 49 64 78 49 74 65 72 29 3b 0a  owid(pIdxIter);.
245d0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
245e0 46 74 73 35 49 74 65 72 50 6f 73 6c 69 73 74 28  Fts5IterPoslist(
245f0 70 49 64 78 49 74 65 72 2c 20 26 70 50 6f 73 2c  pIdxIter, &pPos,
24600 20 26 6e 50 6f 73 2c 20 26 64 75 6d 6d 79 29 3b   &nPos, &dummy);
24610 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
24620 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
24630 46 74 73 35 50 6f 73 6c 69 73 74 52 65 61 64 65  Fts5PoslistReade
24640 72 20 73 52 65 61 64 65 72 3b 0a 20 20 20 20 20  r sReader;.     
24650 20 66 6f 72 28 73 71 6c 69 74 65 33 46 74 73 35   for(sqlite3Fts5
24660 50 6f 73 6c 69 73 74 52 65 61 64 65 72 49 6e 69  PoslistReaderIni
24670 74 28 2d 31 2c 20 70 50 6f 73 2c 20 6e 50 6f 73  t(-1, pPos, nPos
24680 2c 20 26 73 52 65 61 64 65 72 29 3b 0a 20 20 20  , &sReader);.   
24690 20 20 20 20 20 20 20 73 52 65 61 64 65 72 2e 62         sReader.b
246a0 45 6f 66 3d 3d 30 3b 0a 20 20 20 20 20 20 20 20  Eof==0;.        
246b0 20 20 73 71 6c 69 74 65 33 46 74 73 35 50 6f 73    sqlite3Fts5Pos
246c0 6c 69 73 74 52 65 61 64 65 72 4e 65 78 74 28 26  listReaderNext(&
246d0 73 52 65 61 64 65 72 29 0a 20 20 20 20 20 20 29  sReader).      )
246e0 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 43  {.        int iC
246f0 6f 6c 20 3d 20 46 54 53 35 5f 50 4f 53 32 43 4f  ol = FTS5_POS2CO
24700 4c 55 4d 4e 28 73 52 65 61 64 65 72 2e 69 50 6f  LUMN(sReader.iPo
24710 73 29 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  s);.        int 
24720 69 4f 66 66 20 3d 20 46 54 53 35 5f 50 4f 53 32  iOff = FTS5_POS2
24730 4f 46 46 53 45 54 28 73 52 65 61 64 65 72 2e 69  OFFSET(sReader.i
24740 50 6f 73 29 3b 0a 20 20 20 20 20 20 20 20 63 6b  Pos);.        ck
24750 73 75 6d 20 5e 3d 20 66 74 73 35 49 6e 64 65 78  sum ^= fts5Index
24760 45 6e 74 72 79 43 6b 73 75 6d 28 72 6f 77 69 64  EntryCksum(rowid
24770 2c 20 69 43 6f 6c 2c 20 69 4f 66 66 2c 20 69 49  , iCol, iOff, iI
24780 64 78 2c 20 7a 2c 20 6e 29 3b 0a 20 20 20 20 20  dx, z, n);.     
24790 20 7d 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71   }.      rc = sq
247a0 6c 69 74 65 33 46 74 73 35 49 74 65 72 4e 65 78  lite3Fts5IterNex
247b0 74 28 70 49 64 78 49 74 65 72 29 3b 0a 20 20 20  t(pIdxIter);.   
247c0 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33   }.  }.  sqlite3
247d0 46 74 73 35 49 74 65 72 43 6c 6f 73 65 28 70 49  Fts5IterClose(pI
247e0 64 78 49 74 65 72 29 3b 0a 0a 20 20 2a 70 43 6b  dxIter);..  *pCk
247f0 73 75 6d 20 3d 20 63 6b 73 75 6d 3b 0a 20 20 72  sum = cksum;.  r
24800 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a  eturn rc;.}.../*
24810 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
24820 6e 20 69 73 20 61 6c 73 6f 20 70 75 72 65 6c 79  n is also purely
24830 20 61 6e 20 69 6e 74 65 72 6e 61 6c 20 74 65 73   an internal tes
24840 74 2e 20 49 74 20 64 6f 65 73 20 6e 6f 74 20 63  t. It does not c
24850 6f 6e 74 72 69 62 75 74 65 20 74 6f 20 0a 2a 2a  ontribute to .**
24860 20 46 54 53 20 66 75 6e 63 74 69 6f 6e 61 6c 69   FTS functionali
24870 74 79 2c 20 6f 72 20 65 76 65 6e 20 74 68 65 20  ty, or even the 
24880 69 6e 74 65 67 72 69 74 79 2d 63 68 65 63 6b 2c  integrity-check,
24890 20 69 6e 20 61 6e 79 20 77 61 79 2e 0a 2a 2f 0a   in any way..*/.
248a0 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
248b0 54 65 73 74 54 65 72 6d 28 0a 20 20 46 74 73 35  TestTerm(.  Fts5
248c0 49 6e 64 65 78 20 2a 70 2c 20 0a 20 20 46 74 73  Index *p, .  Fts
248d0 35 42 75 66 66 65 72 20 2a 70 50 72 65 76 2c 20  5Buffer *pPrev, 
248e0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
248f0 50 72 65 76 69 6f 75 73 20 74 65 72 6d 20 2a 2f  Previous term */
24900 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
24910 2c 20 69 6e 74 20 6e 2c 20 20 20 20 20 20 20 20  , int n,        
24920 20 20 20 2f 2a 20 50 6f 73 73 69 62 6c 79 20 6e     /* Possibly n
24930 65 77 20 74 65 72 6d 20 74 6f 20 74 65 73 74 20  ew term to test 
24940 2a 2f 0a 20 20 75 36 34 20 65 78 70 65 63 74 65  */.  u64 expecte
24950 64 2c 0a 20 20 75 36 34 20 2a 70 43 6b 73 75 6d  d,.  u64 *pCksum
24960 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 70  .){.  int rc = p
24970 2d 3e 72 63 3b 0a 20 20 69 66 28 20 70 50 72 65  ->rc;.  if( pPre
24980 76 2d 3e 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 66  v->n==0 ){.    f
24990 74 73 35 42 75 66 66 65 72 53 65 74 28 26 72 63  ts5BufferSet(&rc
249a0 2c 20 70 50 72 65 76 2c 20 6e 2c 20 28 63 6f 6e  , pPrev, n, (con
249b0 73 74 20 75 38 2a 29 7a 29 3b 0a 20 20 7d 65 6c  st u8*)z);.  }el
249c0 73 65 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  se.  if( rc==SQL
249d0 49 54 45 5f 4f 4b 20 26 26 20 28 70 50 72 65 76  ITE_OK && (pPrev
249e0 2d 3e 6e 21 3d 6e 20 7c 7c 20 6d 65 6d 63 6d 70  ->n!=n || memcmp
249f0 28 70 50 72 65 76 2d 3e 70 2c 20 7a 2c 20 6e 29  (pPrev->p, z, n)
24a00 29 20 29 7b 0a 20 20 20 20 75 36 34 20 63 6b 73  ) ){.    u64 cks
24a10 75 6d 33 20 3d 20 2a 70 43 6b 73 75 6d 3b 0a 20  um3 = *pCksum;. 
24a20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
24a30 54 65 72 6d 20 3d 20 28 63 6f 6e 73 74 20 63 68  Term = (const ch
24a40 61 72 2a 29 26 70 50 72 65 76 2d 3e 70 5b 31 5d  ar*)&pPrev->p[1]
24a50 3b 20 20 2f 2a 20 74 65 72 6d 20 73 61 6e 73 20  ;  /* term sans 
24a60 70 72 65 66 69 78 2d 62 79 74 65 20 2a 2f 0a 20  prefix-byte */. 
24a70 20 20 20 69 6e 74 20 6e 54 65 72 6d 20 3d 20 70     int nTerm = p
24a80 50 72 65 76 2d 3e 6e 2d 31 3b 20 20 20 20 20 20  Prev->n-1;      
24a90 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
24aa0 20 7a 54 65 72 6d 20 69 6e 20 62 79 74 65 73 20   zTerm in bytes 
24ab0 2a 2f 0a 20 20 20 20 69 6e 74 20 69 49 64 78 20  */.    int iIdx 
24ac0 3d 20 28 70 50 72 65 76 2d 3e 70 5b 30 5d 20 2d  = (pPrev->p[0] -
24ad0 20 46 54 53 35 5f 4d 41 49 4e 5f 50 52 45 46 49   FTS5_MAIN_PREFI
24ae0 58 29 3b 0a 20 20 20 20 69 6e 74 20 66 6c 61 67  X);.    int flag
24af0 73 20 3d 20 28 69 49 64 78 3d 3d 30 20 3f 20 30  s = (iIdx==0 ? 0
24b00 20 3a 20 46 54 53 35 49 4e 44 45 58 5f 51 55 45   : FTS5INDEX_QUE
24b10 52 59 5f 50 52 45 46 49 58 29 3b 0a 20 20 20 20  RY_PREFIX);.    
24b20 75 36 34 20 63 6b 31 20 3d 20 30 3b 0a 20 20 20  u64 ck1 = 0;.   
24b30 20 75 36 34 20 63 6b 32 20 3d 20 30 3b 0a 0a 20   u64 ck2 = 0;.. 
24b40 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74     /* Check that
24b50 20 74 68 65 20 72 65 73 75 6c 74 73 20 72 65 74   the results ret
24b60 75 72 6e 65 64 20 66 6f 72 20 41 53 43 20 61 6e  urned for ASC an
24b70 64 20 44 45 53 43 20 71 75 65 72 69 65 73 20 61  d DESC queries a
24b80 72 65 0a 20 20 20 20 2a 2a 20 74 68 65 20 73 61  re.    ** the sa
24b90 6d 65 2e 20 49 66 20 6e 6f 74 2c 20 63 61 6c 6c  me. If not, call
24ba0 20 74 68 69 73 20 63 6f 72 72 75 70 74 69 6f 6e   this corruption
24bb0 2e 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 66  .  */.    rc = f
24bc0 74 73 35 51 75 65 72 79 43 6b 73 75 6d 28 70 2c  ts5QueryCksum(p,
24bd0 20 69 49 64 78 2c 20 7a 54 65 72 6d 2c 20 6e 54   iIdx, zTerm, nT
24be0 65 72 6d 2c 20 66 6c 61 67 73 2c 20 26 63 6b 31  erm, flags, &ck1
24bf0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
24c00 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
24c10 20 20 69 6e 74 20 66 20 3d 20 66 6c 61 67 73 7c    int f = flags|
24c20 46 54 53 35 49 4e 44 45 58 5f 51 55 45 52 59 5f  FTS5INDEX_QUERY_
24c30 44 45 53 43 3b 0a 20 20 20 20 20 20 72 63 20 3d  DESC;.      rc =
24c40 20 66 74 73 35 51 75 65 72 79 43 6b 73 75 6d 28   fts5QueryCksum(
24c50 70 2c 20 69 49 64 78 2c 20 7a 54 65 72 6d 2c 20  p, iIdx, zTerm, 
24c60 6e 54 65 72 6d 2c 20 66 2c 20 26 63 6b 32 29 3b  nTerm, f, &ck2);
24c70 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72  .    }.    if( r
24c80 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
24c90 63 6b 31 21 3d 63 6b 32 20 29 20 72 63 20 3d 20  ck1!=ck2 ) rc = 
24ca0 46 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a 0a 20  FTS5_CORRUPT;.. 
24cb0 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73     /* If this is
24cc0 20 61 20 70 72 65 66 69 78 20 71 75 65 72 79 2c   a prefix query,
24cd0 20 63 68 65 63 6b 20 74 68 61 74 20 74 68 65 20   check that the 
24ce0 72 65 73 75 6c 74 73 20 72 65 74 75 72 6e 65 64  results returned
24cf0 20 69 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 74   if the.    ** t
24d00 68 65 20 69 6e 64 65 78 20 69 73 20 64 69 73 61  he index is disa
24d10 62 6c 65 64 20 61 72 65 20 74 68 65 20 73 61 6d  bled are the sam
24d20 65 2e 20 49 6e 20 62 6f 74 68 20 41 53 43 20 61  e. In both ASC a
24d30 6e 64 20 44 45 53 43 20 6f 72 64 65 72 2e 20 0a  nd DESC order. .
24d40 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68      **.    ** Th
24d50 69 73 20 63 68 65 63 6b 20 6d 61 79 20 6f 6e 6c  is check may onl
24d60 79 20 62 65 20 70 65 72 66 6f 72 6d 65 64 20 69  y be performed i
24d70 66 20 74 68 65 20 68 61 73 68 20 74 61 62 6c 65  f the hash table
24d80 20 69 73 20 65 6d 70 74 79 2e 20 54 68 69 73 0a   is empty. This.
24d90 20 20 20 20 2a 2a 20 69 73 20 62 65 63 61 75 73      ** is becaus
24da0 65 20 74 68 65 20 68 61 73 68 20 74 61 62 6c 65  e the hash table
24db0 20 6f 6e 6c 79 20 73 75 70 70 6f 72 74 73 20 61   only supports a
24dc0 20 73 69 6e 67 6c 65 20 73 63 61 6e 20 71 75 65   single scan que
24dd0 72 79 20 61 74 0a 20 20 20 20 2a 2a 20 61 20 74  ry at.    ** a t
24de0 69 6d 65 2c 20 61 6e 64 20 74 68 65 20 6d 75 6c  ime, and the mul
24df0 74 69 2d 69 74 65 72 20 6c 6f 6f 70 20 66 72 6f  ti-iter loop fro
24e00 6d 20 77 68 69 63 68 20 74 68 69 73 20 66 75 6e  m which this fun
24e10 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 0a  ction is called.
24e20 20 20 20 20 2a 2a 20 69 73 20 61 6c 72 65 61 64      ** is alread
24e30 79 20 70 65 72 66 6f 72 6d 69 6e 67 20 73 75 63  y performing suc
24e40 68 20 61 20 73 63 61 6e 2e 20 2a 2f 0a 20 20 20  h a scan. */.   
24e50 20 69 66 28 20 70 2d 3e 6e 50 65 6e 64 69 6e 67   if( p->nPending
24e60 44 61 74 61 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Data==0 ){.     
24e70 20 69 66 28 20 69 49 64 78 3e 30 20 26 26 20 72   if( iIdx>0 && r
24e80 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
24e90 20 20 20 20 20 20 20 20 69 6e 74 20 66 20 3d 20          int f = 
24ea0 66 6c 61 67 73 7c 46 54 53 35 49 4e 44 45 58 5f  flags|FTS5INDEX_
24eb0 51 55 45 52 59 5f 54 45 53 54 5f 4e 4f 49 44 58  QUERY_TEST_NOIDX
24ec0 3b 0a 20 20 20 20 20 20 20 20 63 6b 32 20 3d 20  ;.        ck2 = 
24ed0 30 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  0;.        rc = 
24ee0 66 74 73 35 51 75 65 72 79 43 6b 73 75 6d 28 70  fts5QueryCksum(p
24ef0 2c 20 69 49 64 78 2c 20 7a 54 65 72 6d 2c 20 6e  , iIdx, zTerm, n
24f00 54 65 72 6d 2c 20 66 2c 20 26 63 6b 32 29 3b 0a  Term, f, &ck2);.
24f10 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d          if( rc==
24f20 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 63 6b 31  SQLITE_OK && ck1
24f30 21 3d 63 6b 32 20 29 20 72 63 20 3d 20 46 54 53  !=ck2 ) rc = FTS
24f40 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20 20 20  5_CORRUPT;.     
24f50 20 7d 0a 20 20 20 20 20 20 69 66 28 20 69 49 64   }.      if( iId
24f60 78 3e 30 20 26 26 20 72 63 3d 3d 53 51 4c 49 54  x>0 && rc==SQLIT
24f70 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
24f80 69 6e 74 20 66 20 3d 20 66 6c 61 67 73 7c 46 54  int f = flags|FT
24f90 53 35 49 4e 44 45 58 5f 51 55 45 52 59 5f 54 45  S5INDEX_QUERY_TE
24fa0 53 54 5f 4e 4f 49 44 58 7c 46 54 53 35 49 4e 44  ST_NOIDX|FTS5IND
24fb0 45 58 5f 51 55 45 52 59 5f 44 45 53 43 3b 0a 20  EX_QUERY_DESC;. 
24fc0 20 20 20 20 20 20 20 63 6b 32 20 3d 20 30 3b 0a         ck2 = 0;.
24fd0 20 20 20 20 20 20 20 20 72 63 20 3d 20 66 74 73          rc = fts
24fe0 35 51 75 65 72 79 43 6b 73 75 6d 28 70 2c 20 69  5QueryCksum(p, i
24ff0 49 64 78 2c 20 7a 54 65 72 6d 2c 20 6e 54 65 72  Idx, zTerm, nTer
25000 6d 2c 20 66 2c 20 26 63 6b 32 29 3b 0a 20 20 20  m, f, &ck2);.   
25010 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
25020 49 54 45 5f 4f 4b 20 26 26 20 63 6b 31 21 3d 63  ITE_OK && ck1!=c
25030 6b 32 20 29 20 72 63 20 3d 20 46 54 53 35 5f 43  k2 ) rc = FTS5_C
25040 4f 52 52 55 50 54 3b 0a 20 20 20 20 20 20 7d 0a  ORRUPT;.      }.
25050 20 20 20 20 7d 0a 0a 20 20 20 20 63 6b 73 75 6d      }..    cksum
25060 33 20 5e 3d 20 63 6b 31 3b 0a 20 20 20 20 66 74  3 ^= ck1;.    ft
25070 73 35 42 75 66 66 65 72 53 65 74 28 26 72 63 2c  s5BufferSet(&rc,
25080 20 70 50 72 65 76 2c 20 6e 2c 20 28 63 6f 6e 73   pPrev, n, (cons
25090 74 20 75 38 2a 29 7a 29 3b 0a 0a 20 20 20 20 69  t u8*)z);..    i
250a0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
250b0 20 26 26 20 63 6b 73 75 6d 33 21 3d 65 78 70 65   && cksum3!=expe
250c0 63 74 65 64 20 29 7b 0a 20 20 20 20 20 20 72 63  cted ){.      rc
250d0 20 3d 20 46 54 53 35 5f 43 4f 52 52 55 50 54 3b   = FTS5_CORRUPT;
250e0 0a 20 20 20 20 7d 0a 20 20 20 20 2a 70 43 6b 73  .    }.    *pCks
250f0 75 6d 20 3d 20 63 6b 73 75 6d 33 3b 0a 20 20 7d  um = cksum3;.  }
25100 0a 20 20 70 2d 3e 72 63 20 3d 20 72 63 3b 0a 7d  .  p->rc = rc;.}
25110 0a 20 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e  . .#else.# defin
25120 65 20 66 74 73 35 54 65 73 74 44 6c 69 64 78 52  e fts5TestDlidxR
25130 65 76 65 72 73 65 28 78 2c 79 2c 7a 29 0a 23 20  everse(x,y,z).# 
25140 64 65 66 69 6e 65 20 66 74 73 35 54 65 73 74 54  define fts5TestT
25150 65 72 6d 28 75 2c 76 2c 77 2c 78 2c 79 2c 7a 29  erm(u,v,w,x,y,z)
25160 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 43  .#endif../*.** C
25170 68 65 63 6b 20 74 68 61 74 3a 0a 2a 2a 0a 2a 2a  heck that:.**.**
25180 20 20 20 31 29 20 41 6c 6c 20 6c 65 61 76 65 73     1) All leaves
25190 20 6f 66 20 70 53 65 67 20 62 65 74 77 65 65 6e   of pSeg between
251a0 20 69 46 69 72 73 74 20 61 6e 64 20 69 4c 61 73   iFirst and iLas
251b0 74 20 28 69 6e 63 6c 75 73 69 76 65 29 20 65 78  t (inclusive) ex
251c0 69 73 74 20 61 6e 64 0a 2a 2a 20 20 20 20 20 20  ist and.**      
251d0 63 6f 6e 74 61 69 6e 20 7a 65 72 6f 20 74 65 72  contain zero ter
251e0 6d 73 2e 0a 2a 2a 20 20 20 32 29 20 41 6c 6c 20  ms..**   2) All 
251f0 6c 65 61 76 65 73 20 6f 66 20 70 53 65 67 20 62  leaves of pSeg b
25200 65 74 77 65 65 6e 20 69 4e 6f 52 6f 77 69 64 20  etween iNoRowid 
25210 61 6e 64 20 69 4c 61 73 74 20 28 69 6e 63 6c 75  and iLast (inclu
25220 73 69 76 65 29 20 65 78 69 73 74 20 61 6e 64 0a  sive) exist and.
25230 2a 2a 20 20 20 20 20 20 63 6f 6e 74 61 69 6e 20  **      contain 
25240 7a 65 72 6f 20 72 6f 77 69 64 73 2e 0a 2a 2f 0a  zero rowids..*/.
25250 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
25260 49 6e 64 65 78 49 6e 74 65 67 72 69 74 79 43 68  IndexIntegrityCh
25270 65 63 6b 45 6d 70 74 79 28 0a 20 20 46 74 73 35  eckEmpty(.  Fts5
25280 49 6e 64 65 78 20 2a 70 2c 0a 20 20 46 74 73 35  Index *p,.  Fts5
25290 53 74 72 75 63 74 75 72 65 53 65 67 6d 65 6e 74  StructureSegment
252a0 20 2a 70 53 65 67 2c 20 20 20 20 20 2f 2a 20 53   *pSeg,     /* S
252b0 65 67 6d 65 6e 74 20 74 6f 20 63 68 65 63 6b 20  egment to check 
252c0 69 6e 74 65 72 6e 61 6c 20 63 6f 6e 73 69 73 74  internal consist
252d0 65 6e 63 79 20 2a 2f 0a 20 20 69 6e 74 20 69 46  ency */.  int iF
252e0 69 72 73 74 2c 0a 20 20 69 6e 74 20 69 4e 6f 52  irst,.  int iNoR
252f0 6f 77 69 64 2c 0a 20 20 69 6e 74 20 69 4c 61 73  owid,.  int iLas
25300 74 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20  t.){.  int i;.. 
25310 20 2f 2a 20 4e 6f 77 20 63 68 65 63 6b 20 74 68   /* Now check th
25320 61 74 20 74 68 65 20 69 74 65 72 2e 6e 45 6d 70  at the iter.nEmp
25330 74 79 20 6c 65 61 76 65 73 20 66 6f 6c 6c 6f 77  ty leaves follow
25340 69 6e 67 20 74 68 65 20 63 75 72 72 65 6e 74 20  ing the current 
25350 6c 65 61 66 0a 20 20 2a 2a 20 28 61 29 20 65 78  leaf.  ** (a) ex
25360 69 73 74 20 61 6e 64 20 28 62 29 20 63 6f 6e 74  ist and (b) cont
25370 61 69 6e 20 6e 6f 20 74 65 72 6d 73 2e 20 2a 2f  ain no terms. */
25380 0a 20 20 66 6f 72 28 69 3d 69 46 69 72 73 74 3b  .  for(i=iFirst;
25390 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
253a0 4b 20 26 26 20 69 3c 3d 69 4c 61 73 74 3b 20 69  K && i<=iLast; i
253b0 2b 2b 29 7b 0a 20 20 20 20 46 74 73 35 44 61 74  ++){.    Fts5Dat
253c0 61 20 2a 70 4c 65 61 66 20 3d 20 66 74 73 35 44  a *pLeaf = fts5D
253d0 61 74 61 52 65 61 64 28 70 2c 20 46 54 53 35 5f  ataRead(p, FTS5_
253e0 53 45 47 4d 45 4e 54 5f 52 4f 57 49 44 28 70 53  SEGMENT_ROWID(pS
253f0 65 67 2d 3e 69 53 65 67 69 64 2c 20 69 29 29 3b  eg->iSegid, i));
25400 0a 20 20 20 20 69 66 28 20 70 4c 65 61 66 20 29  .    if( pLeaf )
25410 7b 0a 20 20 20 20 20 20 69 66 28 20 21 66 74 73  {.      if( !fts
25420 35 4c 65 61 66 49 73 54 65 72 6d 6c 65 73 73 28  5LeafIsTermless(
25430 70 4c 65 61 66 29 20 29 20 70 2d 3e 72 63 20 3d  pLeaf) ) p->rc =
25440 20 46 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20   FTS5_CORRUPT;. 
25450 20 20 20 20 20 69 66 28 20 69 3e 3d 69 4e 6f 52       if( i>=iNoR
25460 6f 77 69 64 20 26 26 20 30 21 3d 66 74 73 35 4c  owid && 0!=fts5L
25470 65 61 66 46 69 72 73 74 52 6f 77 69 64 4f 66 66  eafFirstRowidOff
25480 28 70 4c 65 61 66 29 20 29 20 70 2d 3e 72 63 20  (pLeaf) ) p->rc 
25490 3d 20 46 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a  = FTS5_CORRUPT;.
254a0 20 20 20 20 7d 0a 20 20 20 20 66 74 73 35 44 61      }.    fts5Da
254b0 74 61 52 65 6c 65 61 73 65 28 70 4c 65 61 66 29  taRelease(pLeaf)
254c0 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 72 63 20  ;.    if( p->rc 
254d0 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 7d 0a 0a  ) break;.  }.}..
254e0 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
254f0 49 6e 74 65 67 72 69 74 79 43 68 65 63 6b 50 67  IntegrityCheckPg
25500 69 64 78 28 46 74 73 35 49 6e 64 65 78 20 2a 70  idx(Fts5Index *p
25510 2c 20 46 74 73 35 44 61 74 61 20 2a 70 4c 65 61  , Fts5Data *pLea
25520 66 29 7b 0a 20 20 69 6e 74 20 69 54 65 72 6d 4f  f){.  int iTermO
25530 66 66 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 69  ff = 0;.  int ii
25540 3b 0a 0a 20 20 46 74 73 35 42 75 66 66 65 72 20  ;..  Fts5Buffer 
25550 62 75 66 31 20 3d 20 7b 30 2c 30 2c 30 7d 3b 0a  buf1 = {0,0,0};.
25560 20 20 46 74 73 35 42 75 66 66 65 72 20 62 75 66    Fts5Buffer buf
25570 32 20 3d 20 7b 30 2c 30 2c 30 7d 3b 0a 0a 20 20  2 = {0,0,0};..  
25580 69 69 20 3d 20 70 4c 65 61 66 2d 3e 73 7a 4c 65  ii = pLeaf->szLe
25590 61 66 3b 0a 20 20 77 68 69 6c 65 28 20 69 69 3c  af;.  while( ii<
255a0 70 4c 65 61 66 2d 3e 6e 6e 20 26 26 20 70 2d 3e  pLeaf->nn && p->
255b0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
255c0 0a 20 20 20 20 69 6e 74 20 72 65 73 3b 0a 20 20  .    int res;.  
255d0 20 20 69 6e 74 20 69 4f 66 66 3b 0a 20 20 20 20    int iOff;.    
255e0 69 6e 74 20 6e 49 6e 63 72 3b 0a 0a 20 20 20 20  int nIncr;..    
255f0 69 69 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72  ii += fts5GetVar
25600 69 6e 74 33 32 28 26 70 4c 65 61 66 2d 3e 70 5b  int32(&pLeaf->p[
25610 69 69 5d 2c 20 6e 49 6e 63 72 29 3b 0a 20 20 20  ii], nIncr);.   
25620 20 69 54 65 72 6d 4f 66 66 20 2b 3d 20 6e 49 6e   iTermOff += nIn
25630 63 72 3b 0a 20 20 20 20 69 4f 66 66 20 3d 20 69  cr;.    iOff = i
25640 54 65 72 6d 4f 66 66 3b 0a 0a 20 20 20 20 69 66  TermOff;..    if
25650 28 20 69 4f 66 66 3e 3d 70 4c 65 61 66 2d 3e 73  ( iOff>=pLeaf->s
25660 7a 4c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 70  zLeaf ){.      p
25670 2d 3e 72 63 20 3d 20 46 54 53 35 5f 43 4f 52 52  ->rc = FTS5_CORR
25680 55 50 54 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  UPT;.    }else i
25690 66 28 20 69 54 65 72 6d 4f 66 66 3d 3d 6e 49 6e  f( iTermOff==nIn
256a0 63 72 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  cr ){.      int 
256b0 6e 42 79 74 65 3b 0a 20 20 20 20 20 20 69 4f 66  nByte;.      iOf
256c0 66 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69  f += fts5GetVari
256d0 6e 74 33 32 28 26 70 4c 65 61 66 2d 3e 70 5b 69  nt32(&pLeaf->p[i
256e0 4f 66 66 5d 2c 20 6e 42 79 74 65 29 3b 0a 20 20  Off], nByte);.  
256f0 20 20 20 20 69 66 28 20 28 69 4f 66 66 2b 6e 42      if( (iOff+nB
25700 79 74 65 29 3e 70 4c 65 61 66 2d 3e 73 7a 4c 65  yte)>pLeaf->szLe
25710 61 66 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d  af ){.        p-
25720 3e 72 63 20 3d 20 46 54 53 35 5f 43 4f 52 52 55  >rc = FTS5_CORRU
25730 50 54 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  PT;.      }else{
25740 0a 20 20 20 20 20 20 20 20 66 74 73 35 42 75 66  .        fts5Buf
25750 66 65 72 53 65 74 28 26 70 2d 3e 72 63 2c 20 26  ferSet(&p->rc, &
25760 62 75 66 31 2c 20 6e 42 79 74 65 2c 20 26 70 4c  buf1, nByte, &pL
25770 65 61 66 2d 3e 70 5b 69 4f 66 66 5d 29 3b 0a 20  eaf->p[iOff]);. 
25780 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
25790 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 4b 65 65  {.      int nKee
257a0 70 2c 20 6e 42 79 74 65 3b 0a 20 20 20 20 20 20  p, nByte;.      
257b0 69 4f 66 66 20 2b 3d 20 66 74 73 35 47 65 74 56  iOff += fts5GetV
257c0 61 72 69 6e 74 33 32 28 26 70 4c 65 61 66 2d 3e  arint32(&pLeaf->
257d0 70 5b 69 4f 66 66 5d 2c 20 6e 4b 65 65 70 29 3b  p[iOff], nKeep);
257e0 0a 20 20 20 20 20 20 69 4f 66 66 20 2b 3d 20 66  .      iOff += f
257f0 74 73 35 47 65 74 56 61 72 69 6e 74 33 32 28 26  ts5GetVarint32(&
25800 70 4c 65 61 66 2d 3e 70 5b 69 4f 66 66 5d 2c 20  pLeaf->p[iOff], 
25810 6e 42 79 74 65 29 3b 0a 20 20 20 20 20 20 69 66  nByte);.      if
25820 28 20 6e 4b 65 65 70 3e 62 75 66 31 2e 6e 20 7c  ( nKeep>buf1.n |
25830 7c 20 28 69 4f 66 66 2b 6e 42 79 74 65 29 3e 70  | (iOff+nByte)>p
25840 4c 65 61 66 2d 3e 73 7a 4c 65 61 66 20 29 7b 0a  Leaf->szLeaf ){.
25850 20 20 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20          p->rc = 
25860 46 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20  FTS5_CORRUPT;.  
25870 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
25880 20 20 20 62 75 66 31 2e 6e 20 3d 20 6e 4b 65 65     buf1.n = nKee
25890 70 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35 42  p;.        fts5B
258a0 75 66 66 65 72 41 70 70 65 6e 64 42 6c 6f 62 28  ufferAppendBlob(
258b0 26 70 2d 3e 72 63 2c 20 26 62 75 66 31 2c 20 6e  &p->rc, &buf1, n
258c0 42 79 74 65 2c 20 26 70 4c 65 61 66 2d 3e 70 5b  Byte, &pLeaf->p[
258d0 69 4f 66 66 5d 29 3b 0a 20 20 20 20 20 20 7d 0a  iOff]);.      }.
258e0 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72 63  .      if( p->rc
258f0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
25900 20 20 20 20 20 20 20 72 65 73 20 3d 20 66 74 73         res = fts
25910 35 42 75 66 66 65 72 43 6f 6d 70 61 72 65 28 26  5BufferCompare(&
25920 62 75 66 31 2c 20 26 62 75 66 32 29 3b 0a 20 20  buf1, &buf2);.  
25930 20 20 20 20 20 20 69 66 28 20 72 65 73 3c 3d 30        if( res<=0
25940 20 29 20 70 2d 3e 72 63 20 3d 20 46 54 53 35 5f   ) p->rc = FTS5_
25950 43 4f 52 52 55 50 54 3b 0a 20 20 20 20 20 20 7d  CORRUPT;.      }
25960 0a 20 20 20 20 7d 0a 20 20 20 20 66 74 73 35 42  .    }.    fts5B
25970 75 66 66 65 72 53 65 74 28 26 70 2d 3e 72 63 2c  ufferSet(&p->rc,
25980 20 26 62 75 66 32 2c 20 62 75 66 31 2e 6e 2c 20   &buf2, buf1.n, 
25990 62 75 66 31 2e 70 29 3b 0a 20 20 7d 0a 0a 20 20  buf1.p);.  }..  
259a0 66 74 73 35 42 75 66 66 65 72 46 72 65 65 28 26  fts5BufferFree(&
259b0 62 75 66 31 29 3b 0a 20 20 66 74 73 35 42 75 66  buf1);.  fts5Buf
259c0 66 65 72 46 72 65 65 28 26 62 75 66 32 29 3b 0a  ferFree(&buf2);.
259d0 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  }..static void f
259e0 74 73 35 49 6e 64 65 78 49 6e 74 65 67 72 69 74  ts5IndexIntegrit
259f0 79 43 68 65 63 6b 53 65 67 6d 65 6e 74 28 0a 20  yCheckSegment(. 
25a00 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 20   Fts5Index *p,  
25a10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25a20 20 2f 2a 20 46 54 53 35 20 62 61 63 6b 65 6e 64   /* FTS5 backend
25a30 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 46 74 73   object */.  Fts
25a40 35 53 74 72 75 63 74 75 72 65 53 65 67 6d 65 6e  5StructureSegmen
25a50 74 20 2a 70 53 65 67 20 20 20 20 20 20 2f 2a 20  t *pSeg      /* 
25a60 53 65 67 6d 65 6e 74 20 74 6f 20 63 68 65 63 6b  Segment to check
25a70 20 69 6e 74 65 72 6e 61 6c 20 63 6f 6e 73 69 73   internal consis
25a80 74 65 6e 63 79 20 2a 2f 0a 29 7b 0a 20 20 46 74  tency */.){.  Ft
25a90 73 35 43 6f 6e 66 69 67 20 2a 70 43 6f 6e 66 69  s5Config *pConfi
25aa0 67 20 3d 20 70 2d 3e 70 43 6f 6e 66 69 67 3b 0a  g = p->pConfig;.
25ab0 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
25ac0 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 69 6e 74  pStmt = 0;.  int
25ad0 20 72 63 32 3b 0a 20 20 69 6e 74 20 69 49 64 78   rc2;.  int iIdx
25ae0 50 72 65 76 4c 65 61 66 20 3d 20 70 53 65 67 2d  PrevLeaf = pSeg-
25af0 3e 70 67 6e 6f 46 69 72 73 74 2d 31 3b 0a 20 20  >pgnoFirst-1;.  
25b00 69 6e 74 20 69 44 6c 69 64 78 50 72 65 76 4c 65  int iDlidxPrevLe
25b10 61 66 20 3d 20 70 53 65 67 2d 3e 70 67 6e 6f 4c  af = pSeg->pgnoL
25b20 61 73 74 3b 0a 0a 20 20 69 66 28 20 70 53 65 67  ast;..  if( pSeg
25b30 2d 3e 70 67 6e 6f 46 69 72 73 74 3d 3d 30 20 29  ->pgnoFirst==0 )
25b40 20 72 65 74 75 72 6e 3b 0a 0a 20 20 66 74 73 35   return;..  fts5
25b50 49 6e 64 65 78 50 72 65 70 61 72 65 53 74 6d 74  IndexPrepareStmt
25b60 28 70 2c 20 26 70 53 74 6d 74 2c 20 73 71 6c 69  (p, &pStmt, sqli
25b70 74 65 33 5f 6d 70 72 69 6e 74 66 28 0a 20 20 20  te3_mprintf(.   
25b80 20 20 20 22 53 45 4c 45 43 54 20 73 65 67 69 64     "SELECT segid
25b90 2c 20 74 65 72 6d 2c 20 28 70 67 6e 6f 3e 3e 31  , term, (pgno>>1
25ba0 29 2c 20 28 70 67 6e 6f 20 26 20 31 29 20 46 52  ), (pgno & 1) FR
25bb0 4f 4d 20 27 25 71 27 2e 27 25 71 5f 69 64 78 27  OM '%q'.'%q_idx'
25bc0 20 57 48 45 52 45 20 73 65 67 69 64 3d 25 64 22   WHERE segid=%d"
25bd0 2c 0a 20 20 20 20 20 20 70 43 6f 6e 66 69 67 2d  ,.      pConfig-
25be0 3e 7a 44 62 2c 20 70 43 6f 6e 66 69 67 2d 3e 7a  >zDb, pConfig->z
25bf0 4e 61 6d 65 2c 20 70 53 65 67 2d 3e 69 53 65 67  Name, pSeg->iSeg
25c00 69 64 0a 20 20 29 29 3b 0a 0a 20 20 2f 2a 20 49  id.  ));..  /* I
25c10 74 65 72 61 74 65 20 74 68 72 6f 75 67 68 20 74  terate through t
25c20 68 65 20 62 2d 74 72 65 65 20 68 69 65 72 61 72  he b-tree hierar
25c30 63 68 79 2e 20 20 2a 2f 0a 20 20 77 68 69 6c 65  chy.  */.  while
25c40 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
25c50 4f 4b 20 26 26 20 53 51 4c 49 54 45 5f 52 4f 57  OK && SQLITE_ROW
25c60 3d 3d 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70  ==sqlite3_step(p
25c70 53 74 6d 74 29 20 29 7b 0a 20 20 20 20 69 36 34  Stmt) ){.    i64
25c80 20 69 52 6f 77 3b 20 20 20 20 20 20 20 20 20 20   iRow;          
25c90 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f             /* Ro
25ca0 77 69 64 20 66 6f 72 20 74 68 69 73 20 6c 65 61  wid for this lea
25cb0 66 20 2a 2f 0a 20 20 20 20 46 74 73 35 44 61 74  f */.    Fts5Dat
25cc0 61 20 2a 70 4c 65 61 66 3b 20 20 20 20 20 20 20  a *pLeaf;       
25cd0 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 20 66         /* Data f
25ce0 6f 72 20 74 68 69 73 20 6c 65 61 66 20 2a 2f 0a  or this leaf */.
25cf0 0a 20 20 20 20 69 6e 74 20 6e 49 64 78 54 65 72  .    int nIdxTer
25d00 6d 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  m = sqlite3_colu
25d10 6d 6e 5f 62 79 74 65 73 28 70 53 74 6d 74 2c 20  mn_bytes(pStmt, 
25d20 31 29 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68  1);.    const ch
25d30 61 72 20 2a 7a 49 64 78 54 65 72 6d 20 3d 20 28  ar *zIdxTerm = (
25d40 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69  const char*)sqli
25d50 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28  te3_column_text(
25d60 70 53 74 6d 74 2c 20 31 29 3b 0a 20 20 20 20 69  pStmt, 1);.    i
25d70 6e 74 20 69 49 64 78 4c 65 61 66 20 3d 20 73 71  nt iIdxLeaf = sq
25d80 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74  lite3_column_int
25d90 28 70 53 74 6d 74 2c 20 32 29 3b 0a 20 20 20 20  (pStmt, 2);.    
25da0 69 6e 74 20 62 49 64 78 44 6c 69 64 78 20 3d 20  int bIdxDlidx = 
25db0 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69  sqlite3_column_i
25dc0 6e 74 28 70 53 74 6d 74 2c 20 33 29 3b 0a 0a 20  nt(pStmt, 3);.. 
25dd0 20 20 20 2f 2a 20 49 66 20 74 68 65 20 6c 65 61     /* If the lea
25de0 66 20 69 6e 20 71 75 65 73 74 69 6f 6e 20 68 61  f in question ha
25df0 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 74  s already been t
25e00 72 69 6d 6d 65 64 20 66 72 6f 6d 20 74 68 65 20  rimmed from the 
25e10 73 65 67 6d 65 6e 74 2c 20 0a 20 20 20 20 2a 2a  segment, .    **
25e20 20 69 67 6e 6f 72 65 20 74 68 69 73 20 62 2d 74   ignore this b-t
25e30 72 65 65 20 65 6e 74 72 79 2e 20 4f 74 68 65 72  ree entry. Other
25e40 77 69 73 65 2c 20 6c 6f 61 64 20 69 74 20 69 6e  wise, load it in
25e50 74 6f 20 6d 65 6d 6f 72 79 2e 20 2a 2f 0a 20 20  to memory. */.  
25e60 20 20 69 66 28 20 69 49 64 78 4c 65 61 66 3c 70    if( iIdxLeaf<p
25e70 53 65 67 2d 3e 70 67 6e 6f 46 69 72 73 74 20 29  Seg->pgnoFirst )
25e80 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69   continue;.    i
25e90 52 6f 77 20 3d 20 46 54 53 35 5f 53 45 47 4d 45  Row = FTS5_SEGME
25ea0 4e 54 5f 52 4f 57 49 44 28 70 53 65 67 2d 3e 69  NT_ROWID(pSeg->i
25eb0 53 65 67 69 64 2c 20 69 49 64 78 4c 65 61 66 29  Segid, iIdxLeaf)
25ec0 3b 0a 20 20 20 20 70 4c 65 61 66 20 3d 20 66 74  ;.    pLeaf = ft
25ed0 73 35 44 61 74 61 52 65 61 64 28 70 2c 20 69 52  s5DataRead(p, iR
25ee0 6f 77 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 65  ow);.    if( pLe
25ef0 61 66 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 0a  af==0 ) break;..
25f00 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61      /* Check tha
25f10 74 20 74 68 65 20 6c 65 61 66 20 63 6f 6e 74 61  t the leaf conta
25f20 69 6e 73 20 61 74 20 6c 65 61 73 74 20 6f 6e 65  ins at least one
25f30 20 74 65 72 6d 2c 20 61 6e 64 20 74 68 61 74 20   term, and that 
25f40 69 74 20 69 73 20 65 71 75 61 6c 0a 20 20 20 20  it is equal.    
25f50 2a 2a 20 74 6f 20 6f 72 20 6c 61 72 67 65 72 20  ** to or larger 
25f60 74 68 61 6e 20 74 68 65 20 73 70 6c 69 74 2d 6b  than the split-k
25f70 65 79 20 69 6e 20 7a 49 64 78 54 65 72 6d 2e 20  ey in zIdxTerm. 
25f80 20 41 6c 73 6f 20 63 68 65 63 6b 20 74 68 61 74   Also check that
25f90 20 69 66 20 74 68 65 72 65 0a 20 20 20 20 2a 2a   if there.    **
25fa0 20 69 73 20 61 6c 73 6f 20 61 20 72 6f 77 69 64   is also a rowid
25fb0 20 70 6f 69 6e 74 65 72 20 77 69 74 68 69 6e 20   pointer within 
25fc0 74 68 65 20 6c 65 61 66 20 70 61 67 65 20 68 65  the leaf page he
25fd0 61 64 65 72 2c 20 69 74 20 70 6f 69 6e 74 73 20  ader, it points 
25fe0 74 6f 20 61 0a 20 20 20 20 2a 2a 20 6c 6f 63 61  to a.    ** loca
25ff0 74 69 6f 6e 20 62 65 66 6f 72 65 20 74 68 65 20  tion before the 
26000 74 65 72 6d 2e 20 20 2a 2f 0a 20 20 20 20 69 66  term.  */.    if
26010 28 20 70 4c 65 61 66 2d 3e 6e 6e 3c 3d 70 4c 65  ( pLeaf->nn<=pLe
26020 61 66 2d 3e 73 7a 4c 65 61 66 20 29 7b 0a 20 20  af->szLeaf ){.  
26030 20 20 20 20 70 2d 3e 72 63 20 3d 20 46 54 53 35      p->rc = FTS5
26040 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20 20 7d 65  _CORRUPT;.    }e
26050 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  lse{.      int i
26060 4f 66 66 3b 20 20 20 20 20 20 20 20 20 20 20 20  Off;            
26070 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74         /* Offset
26080 20 6f 66 20 66 69 72 73 74 20 74 65 72 6d 20 6f   of first term o
26090 6e 20 6c 65 61 66 20 2a 2f 0a 20 20 20 20 20 20  n leaf */.      
260a0 69 6e 74 20 69 52 6f 77 69 64 4f 66 66 3b 20 20  int iRowidOff;  
260b0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
260c0 66 66 73 65 74 20 6f 66 20 66 69 72 73 74 20 72  ffset of first r
260d0 6f 77 69 64 20 6f 6e 20 6c 65 61 66 20 2a 2f 0a  owid on leaf */.
260e0 20 20 20 20 20 20 69 6e 74 20 6e 54 65 72 6d 3b        int nTerm;
260f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26100 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 65 72    /* Size of ter
26110 6d 20 6f 6e 20 6c 65 61 66 20 69 6e 20 62 79 74  m on leaf in byt
26120 65 73 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  es */.      int 
26130 72 65 73 3b 20 20 20 20 20 20 20 20 20 20 20 20  res;            
26140 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d 70 61          /* Compa
26150 72 69 73 6f 6e 20 6f 66 20 74 65 72 6d 20 61 6e  rison of term an
26160 64 20 73 70 6c 69 74 2d 6b 65 79 20 2a 2f 0a 0a  d split-key */..
26170 20 20 20 20 20 20 69 4f 66 66 20 3d 20 66 74 73        iOff = fts
26180 35 4c 65 61 66 46 69 72 73 74 54 65 72 6d 4f 66  5LeafFirstTermOf
26190 66 28 70 4c 65 61 66 29 3b 0a 20 20 20 20 20 20  f(pLeaf);.      
261a0 69 52 6f 77 69 64 4f 66 66 20 3d 20 66 74 73 35  iRowidOff = fts5
261b0 4c 65 61 66 46 69 72 73 74 52 6f 77 69 64 4f 66  LeafFirstRowidOf
261c0 66 28 70 4c 65 61 66 29 3b 0a 20 20 20 20 20 20  f(pLeaf);.      
261d0 69 66 28 20 69 52 6f 77 69 64 4f 66 66 3e 3d 69  if( iRowidOff>=i
261e0 4f 66 66 20 29 7b 0a 20 20 20 20 20 20 20 20 70  Off ){.        p
261f0 2d 3e 72 63 20 3d 20 46 54 53 35 5f 43 4f 52 52  ->rc = FTS5_CORR
26200 55 50 54 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  UPT;.      }else
26210 7b 0a 20 20 20 20 20 20 20 20 69 4f 66 66 20 2b  {.        iOff +
26220 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e 74 33  = fts5GetVarint3
26230 32 28 26 70 4c 65 61 66 2d 3e 70 5b 69 4f 66 66  2(&pLeaf->p[iOff
26240 5d 2c 20 6e 54 65 72 6d 29 3b 0a 20 20 20 20 20  ], nTerm);.     
26250 20 20 20 72 65 73 20 3d 20 6d 65 6d 63 6d 70 28     res = memcmp(
26260 26 70 4c 65 61 66 2d 3e 70 5b 69 4f 66 66 5d 2c  &pLeaf->p[iOff],
26270 20 7a 49 64 78 54 65 72 6d 2c 20 4d 49 4e 28 6e   zIdxTerm, MIN(n
26280 54 65 72 6d 2c 20 6e 49 64 78 54 65 72 6d 29 29  Term, nIdxTerm))
26290 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 65  ;.        if( re
262a0 73 3d 3d 30 20 29 20 72 65 73 20 3d 20 6e 54 65  s==0 ) res = nTe
262b0 72 6d 20 2d 20 6e 49 64 78 54 65 72 6d 3b 0a 20  rm - nIdxTerm;. 
262c0 20 20 20 20 20 20 20 69 66 28 20 72 65 73 3c 30         if( res<0
262d0 20 29 20 70 2d 3e 72 63 20 3d 20 46 54 53 35 5f   ) p->rc = FTS5_
262e0 43 4f 52 52 55 50 54 3b 0a 20 20 20 20 20 20 7d  CORRUPT;.      }
262f0 0a 0a 20 20 20 20 20 20 66 74 73 35 49 6e 74 65  ..      fts5Inte
26300 67 72 69 74 79 43 68 65 63 6b 50 67 69 64 78 28  grityCheckPgidx(
26310 70 2c 20 70 4c 65 61 66 29 3b 0a 20 20 20 20 7d  p, pLeaf);.    }
26320 0a 20 20 20 20 66 74 73 35 44 61 74 61 52 65 6c  .    fts5DataRel
26330 65 61 73 65 28 70 4c 65 61 66 29 3b 0a 20 20 20  ease(pLeaf);.   
26340 20 69 66 28 20 70 2d 3e 72 63 20 29 20 62 72 65   if( p->rc ) bre
26350 61 6b 3b 0a 0a 0a 20 20 20 20 2f 2a 20 4e 6f 77  ak;...    /* Now
26360 20 63 68 65 63 6b 20 74 68 61 74 20 74 68 65 20   check that the 
26370 69 74 65 72 2e 6e 45 6d 70 74 79 20 6c 65 61 76  iter.nEmpty leav
26380 65 73 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65  es following the
26390 20 63 75 72 72 65 6e 74 20 6c 65 61 66 0a 20 20   current leaf.  
263a0 20 20 2a 2a 20 28 61 29 20 65 78 69 73 74 20 61    ** (a) exist a
263b0 6e 64 20 28 62 29 20 63 6f 6e 74 61 69 6e 20 6e  nd (b) contain n
263c0 6f 20 74 65 72 6d 73 2e 20 2a 2f 0a 20 20 20 20  o terms. */.    
263d0 66 74 73 35 49 6e 64 65 78 49 6e 74 65 67 72 69  fts5IndexIntegri
263e0 74 79 43 68 65 63 6b 45 6d 70 74 79 28 0a 20 20  tyCheckEmpty(.  
263f0 20 20 20 20 20 20 70 2c 20 70 53 65 67 2c 20 69        p, pSeg, i
26400 49 64 78 50 72 65 76 4c 65 61 66 2b 31 2c 20 69  IdxPrevLeaf+1, i
26410 44 6c 69 64 78 50 72 65 76 4c 65 61 66 2b 31 2c  DlidxPrevLeaf+1,
26420 20 69 49 64 78 4c 65 61 66 2d 31 0a 20 20 20 20   iIdxLeaf-1.    
26430 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 72 63  );.    if( p->rc
26440 20 29 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 2f   ) break;..    /
26450 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 61 20  * If there is a 
26460 64 6f 63 6c 69 73 74 2d 69 6e 64 65 78 2c 20 63  doclist-index, c
26470 68 65 63 6b 20 74 68 61 74 20 69 74 20 6c 6f 6f  heck that it loo
26480 6b 73 20 72 69 67 68 74 2e 20 2a 2f 0a 20 20 20  ks right. */.   
26490 20 69 66 28 20 62 49 64 78 44 6c 69 64 78 20 29   if( bIdxDlidx )
264a0 7b 0a 20 20 20 20 20 20 46 74 73 35 44 6c 69 64  {.      Fts5Dlid
264b0 78 49 74 65 72 20 2a 70 44 6c 69 64 78 20 3d 20  xIter *pDlidx = 
264c0 30 3b 20 20 2f 2a 20 46 6f 72 20 69 74 65 72 61  0;  /* For itera
264d0 74 69 6e 67 20 74 68 72 6f 75 67 68 20 64 6f 63  ting through doc
264e0 6c 69 73 74 20 69 6e 64 65 78 20 2a 2f 0a 20 20  list index */.  
264f0 20 20 20 20 69 6e 74 20 69 50 72 65 76 4c 65 61      int iPrevLea
26500 66 20 3d 20 69 49 64 78 4c 65 61 66 3b 0a 20 20  f = iIdxLeaf;.  
26510 20 20 20 20 69 6e 74 20 69 53 65 67 69 64 20 3d      int iSegid =
26520 20 70 53 65 67 2d 3e 69 53 65 67 69 64 3b 0a 20   pSeg->iSegid;. 
26530 20 20 20 20 20 69 6e 74 20 69 50 67 20 3d 20 30       int iPg = 0
26540 3b 0a 20 20 20 20 20 20 69 36 34 20 69 4b 65 79  ;.      i64 iKey
26550 3b 0a 0a 20 20 20 20 20 20 66 6f 72 28 70 44 6c  ;..      for(pDl
26560 69 64 78 3d 66 74 73 35 44 6c 69 64 78 49 74 65  idx=fts5DlidxIte
26570 72 49 6e 69 74 28 70 2c 20 30 2c 20 69 53 65 67  rInit(p, 0, iSeg
26580 69 64 2c 20 69 49 64 78 4c 65 61 66 29 3b 0a 20  id, iIdxLeaf);. 
26590 20 20 20 20 20 20 20 20 20 66 74 73 35 44 6c 69           fts5Dli
265a0 64 78 49 74 65 72 45 6f 66 28 70 2c 20 70 44 6c  dxIterEof(p, pDl
265b0 69 64 78 29 3d 3d 30 3b 0a 20 20 20 20 20 20 20  idx)==0;.       
265c0 20 20 20 66 74 73 35 44 6c 69 64 78 49 74 65 72     fts5DlidxIter
265d0 4e 65 78 74 28 70 2c 20 70 44 6c 69 64 78 29 0a  Next(p, pDlidx).
265e0 20 20 20 20 20 20 29 7b 0a 0a 20 20 20 20 20 20        ){..      
265f0 20 20 2f 2a 20 43 68 65 63 6b 20 61 6e 79 20 72    /* Check any r
26600 6f 77 69 64 2d 6c 65 73 73 20 70 61 67 65 73 20  owid-less pages 
26610 74 68 61 74 20 6f 63 63 75 72 20 62 65 66 6f 72  that occur befor
26620 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c 65  e the current le
26630 61 66 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 66  af. */.        f
26640 6f 72 28 69 50 67 3d 69 50 72 65 76 4c 65 61 66  or(iPg=iPrevLeaf
26650 2b 31 3b 20 69 50 67 3c 66 74 73 35 44 6c 69 64  +1; iPg<fts5Dlid
26660 78 49 74 65 72 50 67 6e 6f 28 70 44 6c 69 64 78  xIterPgno(pDlidx
26670 29 3b 20 69 50 67 2b 2b 29 7b 0a 20 20 20 20 20  ); iPg++){.     
26680 20 20 20 20 20 69 4b 65 79 20 3d 20 46 54 53 35       iKey = FTS5
26690 5f 53 45 47 4d 45 4e 54 5f 52 4f 57 49 44 28 69  _SEGMENT_ROWID(i
266a0 53 65 67 69 64 2c 20 69 50 67 29 3b 0a 20 20 20  Segid, iPg);.   
266b0 20 20 20 20 20 20 20 70 4c 65 61 66 20 3d 20 66         pLeaf = f
266c0 74 73 35 44 61 74 61 52 65 61 64 28 70 2c 20 69  ts5DataRead(p, i
266d0 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20 20 20  Key);.          
266e0 69 66 28 20 70 4c 65 61 66 20 29 7b 0a 20 20 20  if( pLeaf ){.   
266f0 20 20 20 20 20 20 20 20 20 69 66 28 20 66 74 73           if( fts
26700 35 4c 65 61 66 46 69 72 73 74 52 6f 77 69 64 4f  5LeafFirstRowidO
26710 66 66 28 70 4c 65 61 66 29 21 3d 30 20 29 20 70  ff(pLeaf)!=0 ) p
26720 2d 3e 72 63 20 3d 20 46 54 53 35 5f 43 4f 52 52  ->rc = FTS5_CORR
26730 55 50 54 3b 0a 20 20 20 20 20 20 20 20 20 20 20  UPT;.           
26740 20 66 74 73 35 44 61 74 61 52 65 6c 65 61 73 65   fts5DataRelease
26750 28 70 4c 65 61 66 29 3b 0a 20 20 20 20 20 20 20  (pLeaf);.       
26760 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
26770 20 20 20 20 20 20 20 69 50 72 65 76 4c 65 61 66         iPrevLeaf
26780 20 3d 20 66 74 73 35 44 6c 69 64 78 49 74 65 72   = fts5DlidxIter
26790 50 67 6e 6f 28 70 44 6c 69 64 78 29 3b 0a 0a 20  Pgno(pDlidx);.. 
267a0 20 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 20         /* Check 
267b0 74 68 61 74 20 74 68 65 20 6c 65 61 66 20 70 61  that the leaf pa
267c0 67 65 20 69 6e 64 69 63 61 74 65 64 20 62 79 20  ge indicated by 
267d0 74 68 65 20 69 74 65 72 61 74 6f 72 20 72 65 61  the iterator rea
267e0 6c 6c 79 20 64 6f 65 73 0a 20 20 20 20 20 20 20  lly does.       
267f0 20 2a 2a 20 63 6f 6e 74 61 69 6e 20 74 68 65 20   ** contain the 
26800 72 6f 77 69 64 20 73 75 67 67 65 73 74 65 64 20  rowid suggested 
26810 62 79 20 74 68 65 20 73 61 6d 65 2e 20 2a 2f 0a  by the same. */.
26820 20 20 20 20 20 20 20 20 69 4b 65 79 20 3d 20 46          iKey = F
26830 54 53 35 5f 53 45 47 4d 45 4e 54 5f 52 4f 57 49  TS5_SEGMENT_ROWI
26840 44 28 69 53 65 67 69 64 2c 20 69 50 72 65 76 4c  D(iSegid, iPrevL
26850 65 61 66 29 3b 0a 20 20 20 20 20 20 20 20 70 4c  eaf);.        pL
26860 65 61 66 20 3d 20 66 74 73 35 44 61 74 61 52 65  eaf = fts5DataRe
26870 61 64 28 70 2c 20 69 4b 65 79 29 3b 0a 20 20 20  ad(p, iKey);.   
26880 20 20 20 20 20 69 66 28 20 70 4c 65 61 66 20 29       if( pLeaf )
26890 7b 0a 20 20 20 20 20 20 20 20 20 20 69 36 34 20  {.          i64 
268a0 69 52 6f 77 69 64 3b 0a 20 20 20 20 20 20 20 20  iRowid;.        
268b0 20 20 69 6e 74 20 69 52 6f 77 69 64 4f 66 66 20    int iRowidOff 
268c0 3d 20 66 74 73 35 4c 65 61 66 46 69 72 73 74 52  = fts5LeafFirstR
268d0 6f 77 69 64 4f 66 66 28 70 4c 65 61 66 29 3b 0a  owidOff(pLeaf);.
268e0 20 20 20 20 20 20 20 20 20 20 41 53 53 45 52 54            ASSERT
268f0 5f 53 5a 4c 45 41 46 5f 4f 4b 28 70 4c 65 61 66  _SZLEAF_OK(pLeaf
26900 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
26910 20 69 52 6f 77 69 64 4f 66 66 3e 3d 70 4c 65 61   iRowidOff>=pLea
26920 66 2d 3e 73 7a 4c 65 61 66 20 29 7b 0a 20 20 20  f->szLeaf ){.   
26930 20 20 20 20 20 20 20 20 20 70 2d 3e 72 63 20 3d           p->rc =
26940 20 46 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20   FTS5_CORRUPT;. 
26950 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
26960 20 20 20 20 20 20 20 20 20 20 20 20 66 74 73 35              fts5
26970 47 65 74 56 61 72 69 6e 74 28 26 70 4c 65 61 66  GetVarint(&pLeaf
26980 2d 3e 70 5b 69 52 6f 77 69 64 4f 66 66 5d 2c 20  ->p[iRowidOff], 
26990 28 75 36 34 2a 29 26 69 52 6f 77 69 64 29 3b 0a  (u64*)&iRowid);.
269a0 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
269b0 69 52 6f 77 69 64 21 3d 66 74 73 35 44 6c 69 64  iRowid!=fts5Dlid
269c0 78 49 74 65 72 52 6f 77 69 64 28 70 44 6c 69 64  xIterRowid(pDlid
269d0 78 29 20 29 20 70 2d 3e 72 63 20 3d 20 46 54 53  x) ) p->rc = FTS
269e0 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20 20 20  5_CORRUPT;.     
269f0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
26a00 20 66 74 73 35 44 61 74 61 52 65 6c 65 61 73 65   fts5DataRelease
26a10 28 70 4c 65 61 66 29 3b 0a 20 20 20 20 20 20 20  (pLeaf);.       
26a20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20   }.      }..    
26a30 20 20 69 44 6c 69 64 78 50 72 65 76 4c 65 61 66    iDlidxPrevLeaf
26a40 20 3d 20 69 50 67 3b 0a 20 20 20 20 20 20 66 74   = iPg;.      ft
26a50 73 35 44 6c 69 64 78 49 74 65 72 46 72 65 65 28  s5DlidxIterFree(
26a60 70 44 6c 69 64 78 29 3b 0a 20 20 20 20 20 20 66  pDlidx);.      f
26a70 74 73 35 54 65 73 74 44 6c 69 64 78 52 65 76 65  ts5TestDlidxReve
26a80 72 73 65 28 70 2c 20 69 53 65 67 69 64 2c 20 69  rse(p, iSegid, i
26a90 49 64 78 4c 65 61 66 29 3b 0a 20 20 20 20 7d 65  IdxLeaf);.    }e
26aa0 6c 73 65 7b 0a 20 20 20 20 20 20 69 44 6c 69 64  lse{.      iDlid
26ab0 78 50 72 65 76 4c 65 61 66 20 3d 20 70 53 65 67  xPrevLeaf = pSeg
26ac0 2d 3e 70 67 6e 6f 4c 61 73 74 3b 0a 20 20 20 20  ->pgnoLast;.    
26ad0 20 20 2f 2a 20 54 4f 44 4f 3a 20 43 68 65 63 6b    /* TODO: Check
26ae0 20 74 68 65 72 65 20 69 73 20 6e 6f 20 64 6f 63   there is no doc
26af0 6c 69 73 74 20 69 6e 64 65 78 20 2a 2f 0a 20 20  list index */.  
26b00 20 20 7d 0a 0a 20 20 20 20 69 49 64 78 50 72 65    }..    iIdxPre
26b10 76 4c 65 61 66 20 3d 20 69 49 64 78 4c 65 61 66  vLeaf = iIdxLeaf
26b20 3b 0a 20 20 7d 0a 0a 20 20 72 63 32 20 3d 20 73  ;.  }..  rc2 = s
26b30 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28  qlite3_finalize(
26b40 70 53 74 6d 74 29 3b 0a 20 20 69 66 28 20 70 2d  pStmt);.  if( p-
26b50 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  >rc==SQLITE_OK )
26b60 20 70 2d 3e 72 63 20 3d 20 72 63 32 3b 0a 0a 20   p->rc = rc2;.. 
26b70 20 2f 2a 20 50 61 67 65 20 69 74 65 72 2e 69 4c   /* Page iter.iL
26b80 65 61 66 20 6d 75 73 74 20 6e 6f 77 20 62 65 20  eaf must now be 
26b90 74 68 65 20 72 69 67 68 74 6d 6f 73 74 20 6c 65  the rightmost le
26ba0 61 66 2d 70 61 67 65 20 69 6e 20 74 68 65 20 73  af-page in the s
26bb0 65 67 6d 65 6e 74 20 2a 2f 0a 23 69 66 20 30 0a  egment */.#if 0.
26bc0 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c    if( p->rc==SQL
26bd0 49 54 45 5f 4f 4b 20 26 26 20 69 74 65 72 2e 69  ITE_OK && iter.i
26be0 4c 65 61 66 21 3d 70 53 65 67 2d 3e 70 67 6e 6f  Leaf!=pSeg->pgno
26bf0 4c 61 73 74 20 29 7b 0a 20 20 20 20 70 2d 3e 72  Last ){.    p->r
26c00 63 20 3d 20 46 54 53 35 5f 43 4f 52 52 55 50 54  c = FTS5_CORRUPT
26c10 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a  ;.  }.#endif.}..
26c20 0a 2f 2a 0a 2a 2a 20 52 75 6e 20 69 6e 74 65 72  ./*.** Run inter
26c30 6e 61 6c 20 63 68 65 63 6b 73 20 74 6f 20 65 6e  nal checks to en
26c40 73 75 72 65 20 74 68 61 74 20 74 68 65 20 46 54  sure that the FT
26c50 53 20 69 6e 64 65 78 20 28 61 29 20 69 73 20 69  S index (a) is i
26c60 6e 74 65 72 6e 61 6c 6c 79 20 0a 2a 2a 20 63 6f  nternally .** co
26c70 6e 73 69 73 74 65 6e 74 20 61 6e 64 20 28 62 29  nsistent and (b)
26c80 20 63 6f 6e 74 61 69 6e 73 20 65 6e 74 72 69 65   contains entrie
26c90 73 20 66 6f 72 20 77 68 69 63 68 20 74 68 65 20  s for which the 
26ca0 58 4f 52 20 6f 66 20 74 68 65 20 63 68 65 63 6b  XOR of the check
26cb0 73 75 6d 73 0a 2a 2a 20 61 73 20 63 61 6c 63 75  sums.** as calcu
26cc0 6c 61 74 65 64 20 62 79 20 66 74 73 35 49 6e 64  lated by fts5Ind
26cd0 65 78 45 6e 74 72 79 43 6b 73 75 6d 28 29 20 69  exEntryCksum() i
26ce0 73 20 63 6b 73 75 6d 2e 0a 2a 2a 0a 2a 2a 20 52  s cksum..**.** R
26cf0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
26d00 52 55 50 54 20 69 66 20 61 6e 79 20 6f 66 20 74  RUPT if any of t
26d10 68 65 20 69 6e 74 65 72 6e 61 6c 20 63 68 65 63  he internal chec
26d20 6b 73 20 66 61 69 6c 2c 20 6f 72 20 69 66 20 74  ks fail, or if t
26d30 68 65 0a 2a 2a 20 63 68 65 63 6b 73 75 6d 20 64  he.** checksum d
26d40 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68 2e 20 52  oes not match. R
26d50 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20  eturn SQLITE_OK 
26d60 69 66 20 61 6c 6c 20 63 68 65 63 6b 73 20 70 61  if all checks pa
26d70 73 73 20 77 69 74 68 6f 75 74 0a 2a 2a 20 65 72  ss without.** er
26d80 72 6f 72 2c 20 6f 72 20 73 6f 6d 65 20 6f 74 68  ror, or some oth
26d90 65 72 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20  er SQLite error 
26da0 63 6f 64 65 20 69 66 20 61 6e 6f 74 68 65 72 20  code if another 
26db0 65 72 72 6f 72 20 28 65 2e 67 2e 20 4f 4f 4d 29  error (e.g. OOM)
26dc0 0a 2a 2a 20 6f 63 63 75 72 73 2e 0a 2a 2f 0a 69  .** occurs..*/.i
26dd0 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e  nt sqlite3Fts5In
26de0 64 65 78 49 6e 74 65 67 72 69 74 79 43 68 65 63  dexIntegrityChec
26df0 6b 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20  k(Fts5Index *p, 
26e00 75 36 34 20 63 6b 73 75 6d 29 7b 0a 20 20 75 36  u64 cksum){.  u6
26e10 34 20 63 6b 73 75 6d 32 20 3d 20 30 3b 20 20 20  4 cksum2 = 0;   
26e20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
26e30 20 43 68 65 63 6b 73 75 6d 20 62 61 73 65 64 20   Checksum based 
26e40 6f 6e 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 69  on contents of i
26e50 6e 64 65 78 65 73 20 2a 2f 0a 20 20 46 74 73 35  ndexes */.  Fts5
26e60 42 75 66 66 65 72 20 70 6f 73 6c 69 73 74 20 3d  Buffer poslist =
26e70 20 7b 30 2c 30 2c 30 7d 3b 20 20 20 2f 2a 20 42   {0,0,0};   /* B
26e80 75 66 66 65 72 20 75 73 65 64 20 74 6f 20 68 6f  uffer used to ho
26e90 6c 64 20 61 20 70 6f 73 6c 69 73 74 20 2a 2f 0a  ld a poslist */.
26ea0 20 20 46 74 73 35 49 6e 64 65 78 49 74 65 72 20    Fts5IndexIter 
26eb0 2a 70 49 74 65 72 3b 20 20 20 20 20 20 20 20 20  *pIter;         
26ec0 20 20 2f 2a 20 55 73 65 64 20 74 6f 20 69 74 65    /* Used to ite
26ed0 72 61 74 65 20 74 68 72 6f 75 67 68 20 65 6e 74  rate through ent
26ee0 69 72 65 20 69 6e 64 65 78 20 2a 2f 0a 20 20 46  ire index */.  F
26ef0 74 73 35 53 74 72 75 63 74 75 72 65 20 2a 70 53  ts5Structure *pS
26f00 74 72 75 63 74 3b 20 20 20 20 20 20 20 20 20 2f  truct;         /
26f10 2a 20 49 6e 64 65 78 20 73 74 72 75 63 74 75 72  * Index structur
26f20 65 20 2a 2f 0a 0a 20 20 2f 2a 20 55 73 65 64 20  e */..  /* Used 
26f30 62 79 20 65 78 74 72 61 20 69 6e 74 65 72 6e 61  by extra interna
26f40 6c 20 74 65 73 74 73 20 6f 6e 6c 79 20 72 75 6e  l tests only run
26f50 20 69 66 20 4e 44 45 42 55 47 20 69 73 20 6e 6f   if NDEBUG is no
26f60 74 20 64 65 66 69 6e 65 64 20 2a 2f 0a 20 20 75  t defined */.  u
26f70 36 34 20 63 6b 73 75 6d 33 20 3d 20 30 3b 20 20  64 cksum3 = 0;  
26f80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
26f90 2a 20 43 68 65 63 6b 73 75 6d 20 62 61 73 65 64  * Checksum based
26fa0 20 6f 6e 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20   on contents of 
26fb0 69 6e 64 65 78 65 73 20 2a 2f 0a 20 20 46 74 73  indexes */.  Fts
26fc0 35 42 75 66 66 65 72 20 74 65 72 6d 20 3d 20 7b  5Buffer term = {
26fd0 30 2c 30 2c 30 7d 3b 20 20 20 20 20 20 2f 2a 20  0,0,0};      /* 
26fe0 42 75 66 66 65 72 20 75 73 65 64 20 74 6f 20 68  Buffer used to h
26ff0 6f 6c 64 20 6d 6f 73 74 20 72 65 63 65 6e 74 20  old most recent 
27000 74 65 72 6d 20 2a 2f 0a 20 20 0a 20 20 2f 2a 20  term */.  .  /* 
27010 4c 6f 61 64 20 74 68 65 20 46 54 53 20 69 6e 64  Load the FTS ind
27020 65 78 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a  ex structure */.
27030 20 20 70 53 74 72 75 63 74 20 3d 20 66 74 73 35    pStruct = fts5
27040 53 74 72 75 63 74 75 72 65 52 65 61 64 28 70 29  StructureRead(p)
27050 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 68  ;..  /* Check th
27060 61 74 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20  at the internal 
27070 6e 6f 64 65 73 20 6f 66 20 65 61 63 68 20 73 65  nodes of each se
27080 67 6d 65 6e 74 20 6d 61 74 63 68 20 74 68 65 20  gment match the 
27090 6c 65 61 76 65 73 20 2a 2f 0a 20 20 69 66 28 20  leaves */.  if( 
270a0 70 53 74 72 75 63 74 20 29 7b 0a 20 20 20 20 69  pStruct ){.    i
270b0 6e 74 20 69 4c 76 6c 2c 20 69 53 65 67 3b 0a 20  nt iLvl, iSeg;. 
270c0 20 20 20 66 6f 72 28 69 4c 76 6c 3d 30 3b 20 69     for(iLvl=0; i
270d0 4c 76 6c 3c 70 53 74 72 75 63 74 2d 3e 6e 4c 65  Lvl<pStruct->nLe
270e0 76 65 6c 3b 20 69 4c 76 6c 2b 2b 29 7b 0a 20 20  vel; iLvl++){.  
270f0 20 20 20 20 66 6f 72 28 69 53 65 67 3d 30 3b 20      for(iSeg=0; 
27100 69 53 65 67 3c 70 53 74 72 75 63 74 2d 3e 61 4c  iSeg<pStruct->aL
27110 65 76 65 6c 5b 69 4c 76 6c 5d 2e 6e 53 65 67 3b  evel[iLvl].nSeg;
27120 20 69 53 65 67 2b 2b 29 7b 0a 20 20 20 20 20 20   iSeg++){.      
27130 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65 53    Fts5StructureS
27140 65 67 6d 65 6e 74 20 2a 70 53 65 67 20 3d 20 26  egment *pSeg = &
27150 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b  pStruct->aLevel[
27160 69 4c 76 6c 5d 2e 61 53 65 67 5b 69 53 65 67 5d  iLvl].aSeg[iSeg]
27170 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35 49 6e  ;.        fts5In
27180 64 65 78 49 6e 74 65 67 72 69 74 79 43 68 65 63  dexIntegrityChec
27190 6b 53 65 67 6d 65 6e 74 28 70 2c 20 70 53 65 67  kSegment(p, pSeg
271a0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
271b0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 63  .  }..  /* The c
271c0 6b 73 75 6d 20 61 72 67 75 6d 65 6e 74 20 70 61  ksum argument pa
271d0 73 73 65 64 20 74 6f 20 74 68 69 73 20 66 75 6e  ssed to this fun
271e0 63 74 69 6f 6e 20 69 73 20 61 20 63 68 65 63 6b  ction is a check
271f0 73 75 6d 20 63 61 6c 63 75 6c 61 74 65 64 0a 20  sum calculated. 
27200 20 2a 2a 20 62 61 73 65 64 20 6f 6e 20 61 6c 6c   ** based on all
27210 20 65 78 70 65 63 74 65 64 20 65 6e 74 72 69 65   expected entrie
27220 73 20 69 6e 20 74 68 65 20 46 54 53 20 69 6e 64  s in the FTS ind
27230 65 78 20 28 69 6e 63 6c 75 64 69 6e 67 20 70 72  ex (including pr
27240 65 66 69 78 20 69 6e 64 65 78 0a 20 20 2a 2a 20  efix index.  ** 
27250 65 6e 74 72 69 65 73 29 2e 20 54 68 69 73 20 62  entries). This b
27260 6c 6f 63 6b 20 63 68 65 63 6b 73 20 74 68 61 74  lock checks that
27270 20 61 20 63 68 65 63 6b 73 75 6d 20 63 61 6c 63   a checksum calc
27280 75 6c 61 74 65 64 20 62 61 73 65 64 20 6f 6e 20  ulated based on 
27290 74 68 65 0a 20 20 2a 2a 20 61 63 74 75 61 6c 20  the.  ** actual 
272a0 63 6f 6e 74 65 6e 74 73 20 6f 66 20 46 54 53 20  contents of FTS 
272b0 69 6e 64 65 78 20 69 73 20 69 64 65 6e 74 69 63  index is identic
272c0 61 6c 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 77  al..  **.  ** Tw
272d0 6f 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 74 68  o versions of th
272e0 65 20 73 61 6d 65 20 63 68 65 63 6b 73 75 6d 20  e same checksum 
272f0 61 72 65 20 63 61 6c 63 75 6c 61 74 65 64 2e 20  are calculated. 
27300 54 68 65 20 66 69 72 73 74 20 28 73 74 61 63 6b  The first (stack
27310 0a 20 20 2a 2a 20 76 61 72 69 61 62 6c 65 20 63  .  ** variable c
27320 6b 73 75 6d 32 29 20 62 61 73 65 64 20 6f 6e 20  ksum2) based on 
27330 65 6e 74 72 69 65 73 20 65 78 74 72 61 63 74 65  entries extracte
27340 64 20 66 72 6f 6d 20 74 68 65 20 66 75 6c 6c 2d  d from the full-
27350 74 65 78 74 20 69 6e 64 65 78 0a 20 20 2a 2a 20  text index.  ** 
27360 77 68 69 6c 65 20 64 6f 69 6e 67 20 61 20 6c 69  while doing a li
27370 6e 65 61 72 20 73 63 61 6e 20 6f 66 20 65 61 63  near scan of eac
27380 68 20 69 6e 64 69 76 69 64 75 61 6c 20 69 6e 64  h individual ind
27390 65 78 20 69 6e 20 74 75 72 6e 2e 20 0a 20 20 2a  ex in turn. .  *
273a0 2a 0a 20 20 2a 2a 20 41 73 20 65 61 63 68 20 74  *.  ** As each t
273b0 65 72 6d 20 76 69 73 69 74 65 64 20 62 79 20 74  erm visited by t
273c0 68 65 20 6c 69 6e 65 61 72 20 73 63 61 6e 73 2c  he linear scans,
273d0 20 61 20 73 65 70 61 72 61 74 65 20 71 75 65 72   a separate quer
273e0 79 20 66 6f 72 20 74 68 65 0a 20 20 2a 2a 20 73  y for the.  ** s
273f0 61 6d 65 20 74 65 72 6d 20 69 73 20 70 65 72 66  ame term is perf
27400 6f 72 6d 65 64 2e 20 63 6b 73 75 6d 33 20 69 73  ormed. cksum3 is
27410 20 63 61 6c 63 75 6c 61 74 65 64 20 62 61 73 65   calculated base
27420 64 20 6f 6e 20 74 68 65 20 65 6e 74 72 69 65 73  d on the entries
27430 0a 20 20 2a 2a 20 65 78 74 72 61 63 74 65 64 20  .  ** extracted 
27440 62 79 20 74 68 65 73 65 20 71 75 65 72 69 65 73  by these queries
27450 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 66 74 73  ..  */.  for(fts
27460 35 4d 75 6c 74 69 49 74 65 72 4e 65 77 28 70 2c  5MultiIterNew(p,
27470 20 70 53 74 72 75 63 74 2c 20 30 2c 20 30 2c 20   pStruct, 0, 0, 
27480 30 2c 20 30 2c 20 2d 31 2c 20 30 2c 20 26 70 49  0, 0, -1, 0, &pI
27490 74 65 72 29 3b 0a 20 20 20 20 20 20 66 74 73 35  ter);.      fts5
274a0 4d 75 6c 74 69 49 74 65 72 45 6f 66 28 70 2c 20  MultiIterEof(p, 
274b0 70 49 74 65 72 29 3d 3d 30 3b 0a 20 20 20 20 20  pIter)==0;.     
274c0 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 4e 65   fts5MultiIterNe
274d0 78 74 28 70 2c 20 70 49 74 65 72 2c 20 30 2c 20  xt(p, pIter, 0, 
274e0 30 29 0a 20 20 29 7b 0a 20 20 20 20 69 6e 74 20  0).  ){.    int 
274f0 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n;              
27500 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
27510 6f 66 20 74 65 72 6d 20 69 6e 20 62 79 74 65 73  of term in bytes
27520 20 2a 2f 0a 20 20 20 20 69 36 34 20 69 50 6f 73   */.    i64 iPos
27530 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
27540 20 20 20 20 2f 2a 20 50 6f 73 69 74 69 6f 6e 20      /* Position 
27550 72 65 61 64 20 66 72 6f 6d 20 70 6f 73 6c 69 73  read from poslis
27560 74 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 4f 66  t */.    int iOf
27570 66 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  f = 0;          
27580 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 77       /* Offset w
27590 69 74 68 69 6e 20 70 6f 73 6c 69 73 74 20 2a 2f  ithin poslist */
275a0 0a 20 20 20 20 69 36 34 20 69 52 6f 77 69 64 20  .    i64 iRowid 
275b0 3d 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 52  = fts5MultiIterR
275c0 6f 77 69 64 28 70 49 74 65 72 29 3b 0a 20 20 20  owid(pIter);.   
275d0 20 63 68 61 72 20 2a 7a 20 3d 20 28 63 68 61 72   char *z = (char
275e0 2a 29 66 74 73 35 4d 75 6c 74 69 49 74 65 72 54  *)fts5MultiIterT
275f0 65 72 6d 28 70 49 74 65 72 2c 20 26 6e 29 3b 0a  erm(pIter, &n);.
27600 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20  .    /* If this 
27610 69 73 20 61 20 6e 65 77 20 74 65 72 6d 2c 20 71  is a new term, q
27620 75 65 72 79 20 66 6f 72 20 69 74 2e 20 55 70 64  uery for it. Upd
27630 61 74 65 20 63 6b 73 75 6d 33 20 77 69 74 68 20  ate cksum3 with 
27640 74 68 65 20 72 65 73 75 6c 74 73 2e 20 2a 2f 0a  the results. */.
27650 20 20 20 20 66 74 73 35 54 65 73 74 54 65 72 6d      fts5TestTerm
27660 28 70 2c 20 26 74 65 72 6d 2c 20 7a 2c 20 6e 2c  (p, &term, z, n,
27670 20 63 6b 73 75 6d 32 2c 20 26 63 6b 73 75 6d 33   cksum2, &cksum3
27680 29 3b 0a 0a 20 20 20 20 70 6f 73 6c 69 73 74 2e  );..    poslist.
27690 6e 20 3d 20 30 3b 0a 20 20 20 20 66 74 73 35 4d  n = 0;.    fts5M
276a0 75 6c 74 69 49 74 65 72 50 6f 73 6c 69 73 74 28  ultiIterPoslist(
276b0 70 2c 20 70 49 74 65 72 2c 20 30 2c 20 26 70 6f  p, pIter, 0, &po
276c0 73 6c 69 73 74 29 3b 0a 20 20 20 20 77 68 69 6c  slist);.    whil
276d0 65 28 20 30 3d 3d 73 71 6c 69 74 65 33 46 74 73  e( 0==sqlite3Fts
276e0 35 50 6f 73 6c 69 73 74 4e 65 78 74 36 34 28 70  5PoslistNext64(p
276f0 6f 73 6c 69 73 74 2e 70 2c 20 70 6f 73 6c 69 73  oslist.p, poslis
27700 74 2e 6e 2c 20 26 69 4f 66 66 2c 20 26 69 50 6f  t.n, &iOff, &iPo
27710 73 29 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  s) ){.      int 
27720 69 43 6f 6c 20 3d 20 46 54 53 35 5f 50 4f 53 32  iCol = FTS5_POS2
27730 43 4f 4c 55 4d 4e 28 69 50 6f 73 29 3b 0a 20 20  COLUMN(iPos);.  
27740 20 20 20 20 69 6e 74 20 69 54 6f 6b 4f 66 66 20      int iTokOff 
27750 3d 20 46 54 53 35 5f 50 4f 53 32 4f 46 46 53 45  = FTS5_POS2OFFSE
27760 54 28 69 50 6f 73 29 3b 0a 20 20 20 20 20 20 63  T(iPos);.      c
27770 6b 73 75 6d 32 20 5e 3d 20 66 74 73 35 49 6e 64  ksum2 ^= fts5Ind
27780 65 78 45 6e 74 72 79 43 6b 73 75 6d 28 69 52 6f  exEntryCksum(iRo
27790 77 69 64 2c 20 69 43 6f 6c 2c 20 69 54 6f 6b 4f  wid, iCol, iTokO
277a0 66 66 2c 20 2d 31 2c 20 7a 2c 20 6e 29 3b 0a 20  ff, -1, z, n);. 
277b0 20 20 20 7d 0a 20 20 7d 0a 20 20 66 74 73 35 54     }.  }.  fts5T
277c0 65 73 74 54 65 72 6d 28 70 2c 20 26 74 65 72 6d  estTerm(p, &term
277d0 2c 20 30 2c 20 30 2c 20 63 6b 73 75 6d 32 2c 20  , 0, 0, cksum2, 
277e0 26 63 6b 73 75 6d 33 29 3b 0a 0a 20 20 66 74 73  &cksum3);..  fts
277f0 35 4d 75 6c 74 69 49 74 65 72 46 72 65 65 28 70  5MultiIterFree(p
27800 2c 20 70 49 74 65 72 29 3b 0a 20 20 69 66 28 20  , pIter);.  if( 
27810 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
27820 20 26 26 20 63 6b 73 75 6d 21 3d 63 6b 73 75 6d   && cksum!=cksum
27830 32 20 29 20 70 2d 3e 72 63 20 3d 20 46 54 53 35  2 ) p->rc = FTS5
27840 5f 43 4f 52 52 55 50 54 3b 0a 0a 20 20 66 74 73  _CORRUPT;..  fts
27850 35 53 74 72 75 63 74 75 72 65 52 65 6c 65 61 73  5StructureReleas
27860 65 28 70 53 74 72 75 63 74 29 3b 0a 20 20 66 74  e(pStruct);.  ft
27870 73 35 42 75 66 66 65 72 46 72 65 65 28 26 74 65  s5BufferFree(&te
27880 72 6d 29 3b 0a 20 20 66 74 73 35 42 75 66 66 65  rm);.  fts5Buffe
27890 72 46 72 65 65 28 26 70 6f 73 6c 69 73 74 29 3b  rFree(&poslist);
278a0 0a 20 20 72 65 74 75 72 6e 20 66 74 73 35 49 6e  .  return fts5In
278b0 64 65 78 52 65 74 75 72 6e 28 70 29 3b 0a 7d 0a  dexReturn(p);.}.
278c0 0a 0a 2f 2a 0a 2a 2a 20 43 61 6c 63 75 6c 61 74  ../*.** Calculat
278d0 65 20 61 6e 64 20 72 65 74 75 72 6e 20 61 20 63  e and return a c
278e0 68 65 63 6b 73 75 6d 20 74 68 61 74 20 69 73 20  hecksum that is 
278f0 74 68 65 20 58 4f 52 20 6f 66 20 74 68 65 20 69  the XOR of the i
27900 6e 64 65 78 20 65 6e 74 72 79 0a 2a 2a 20 63 68  ndex entry.** ch
27910 65 63 6b 73 75 6d 20 6f 66 20 61 6c 6c 20 65 6e  ecksum of all en
27920 74 72 69 65 73 20 74 68 61 74 20 77 6f 75 6c 64  tries that would
27930 20 62 65 20 67 65 6e 65 72 61 74 65 64 20 62 79   be generated by
27940 20 74 68 65 20 74 6f 6b 65 6e 20 73 70 65 63 69   the token speci
27950 66 69 65 64 0a 2a 2a 20 62 79 20 74 68 65 20 66  fied.** by the f
27960 69 6e 61 6c 20 35 20 61 72 67 75 6d 65 6e 74 73  inal 5 arguments
27970 2e 0a 2a 2f 0a 75 36 34 20 73 71 6c 69 74 65 33  ..*/.u64 sqlite3
27980 46 74 73 35 49 6e 64 65 78 43 6b 73 75 6d 28 0a  Fts5IndexCksum(.
27990 20 20 46 74 73 35 43 6f 6e 66 69 67 20 2a 70 43    Fts5Config *pC
279a0 6f 6e 66 69 67 2c 20 20 20 20 20 20 20 20 20 20  onfig,          
279b0 20 20 2f 2a 20 43 6f 6e 66 69 67 75 72 61 74 69    /* Configurati
279c0 6f 6e 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69  on object */.  i
279d0 36 34 20 69 52 6f 77 69 64 2c 20 20 20 20 20 20  64 iRowid,      
279e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
279f0 2a 20 44 6f 63 75 6d 65 6e 74 20 74 65 72 6d 20  * Document term 
27a00 61 70 70 65 61 72 73 20 69 6e 20 2a 2f 0a 20 20  appears in */.  
27a10 69 6e 74 20 69 43 6f 6c 2c 20 20 20 20 20 20 20  int iCol,       
27a20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27a30 2f 2a 20 43 6f 6c 75 6d 6e 20 74 65 72 6d 20 61  /* Column term a
27a40 70 70 65 61 72 73 20 69 6e 20 2a 2f 0a 20 20 69  ppears in */.  i
27a50 6e 74 20 69 50 6f 73 2c 20 20 20 20 20 20 20 20  nt iPos,        
27a60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
27a70 2a 20 50 6f 73 69 74 69 6f 6e 20 74 65 72 6d 20  * Position term 
27a80 61 70 70 65 61 72 73 20 69 6e 20 2a 2f 0a 20 20  appears in */.  
27a90 63 6f 6e 73 74 20 63 68 61 72 20 2a 70 54 65 72  const char *pTer
27aa0 6d 2c 20 69 6e 74 20 6e 54 65 72 6d 20 20 20 20  m, int nTerm    
27ab0 2f 2a 20 54 65 72 6d 20 61 74 20 69 50 6f 73 20  /* Term at iPos 
27ac0 2a 2f 0a 29 7b 0a 20 20 75 36 34 20 72 65 74 20  */.){.  u64 ret 
27ad0 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
27ae0 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
27af0 6e 20 76 61 6c 75 65 20 2a 2f 0a 20 20 69 6e 74  n value */.  int
27b00 20 69 49 64 78 3b 20 20 20 20 20 20 20 20 20 20   iIdx;          
27b10 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
27b20 46 6f 72 20 69 74 65 72 61 74 69 6e 67 20 74 68  For iterating th
27b30 72 6f 75 67 68 20 69 6e 64 65 78 65 73 20 2a 2f  rough indexes */
27b40 0a 0a 20 20 72 65 74 20 3d 20 66 74 73 35 49 6e  ..  ret = fts5In
27b50 64 65 78 45 6e 74 72 79 43 6b 73 75 6d 28 69 52  dexEntryCksum(iR
27b60 6f 77 69 64 2c 20 69 43 6f 6c 2c 20 69 50 6f 73  owid, iCol, iPos
27b70 2c 20 30 2c 20 70 54 65 72 6d 2c 20 6e 54 65 72  , 0, pTerm, nTer
27b80 6d 29 3b 0a 0a 20 20 66 6f 72 28 69 49 64 78 3d  m);..  for(iIdx=
27b90 30 3b 20 69 49 64 78 3c 70 43 6f 6e 66 69 67 2d  0; iIdx<pConfig-
27ba0 3e 6e 50 72 65 66 69 78 3b 20 69 49 64 78 2b 2b  >nPrefix; iIdx++
27bb0 29 7b 0a 20 20 20 20 69 6e 74 20 6e 42 79 74 65  ){.    int nByte
27bc0 20 3d 20 66 74 73 35 49 6e 64 65 78 43 68 61 72   = fts5IndexChar
27bd0 6c 65 6e 54 6f 42 79 74 65 6c 65 6e 28 70 54 65  lenToBytelen(pTe
27be0 72 6d 2c 20 6e 54 65 72 6d 2c 20 70 43 6f 6e 66  rm, nTerm, pConf
27bf0 69 67 2d 3e 61 50 72 65 66 69 78 5b 69 49 64 78  ig->aPrefix[iIdx
27c00 5d 29 3b 0a 20 20 20 20 69 66 28 20 6e 42 79 74  ]);.    if( nByt
27c10 65 20 29 7b 0a 20 20 20 20 20 20 72 65 74 20 5e  e ){.      ret ^
27c20 3d 20 66 74 73 35 49 6e 64 65 78 45 6e 74 72 79  = fts5IndexEntry
27c30 43 6b 73 75 6d 28 69 52 6f 77 69 64 2c 20 69 43  Cksum(iRowid, iC
27c40 6f 6c 2c 20 69 50 6f 73 2c 20 69 49 64 78 2b 31  ol, iPos, iIdx+1
27c50 2c 20 70 54 65 72 6d 2c 20 6e 42 79 74 65 29 3b  , pTerm, nByte);
27c60 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65  .    }.  }..  re
27c70 74 75 72 6e 20 72 65 74 3b 0a 7d 0a 0a 2f 2a 2a  turn ret;.}../**
27c80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
27c90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
27ca0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
27cb0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
27cc0 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  *******.********
27cd0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
27ce0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
27cf0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
27d00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
27d10 2a 2a 0a 2a 2a 20 42 65 6c 6f 77 20 74 68 69 73  **.** Below this
27d20 20 70 6f 69 6e 74 20 69 73 20 74 68 65 20 69 6d   point is the im
27d30 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20  plementation of 
27d40 74 68 65 20 66 74 73 35 5f 64 65 63 6f 64 65 28  the fts5_decode(
27d50 29 20 73 63 61 6c 61 72 0a 2a 2a 20 66 75 6e 63  ) scalar.** func
27d60 74 69 6f 6e 20 6f 6e 6c 79 2e 0a 2a 2f 0a 0a 2f  tion only..*/../
27d70 2a 0a 2a 2a 20 44 65 63 6f 64 65 20 61 20 73 65  *.** Decode a se
27d80 67 6d 65 6e 74 2d 64 61 74 61 20 72 6f 77 69 64  gment-data rowid
27d90 20 66 72 6f 6d 20 74 68 65 20 25 5f 64 61 74 61   from the %_data
27da0 20 74 61 62 6c 65 2e 20 54 68 69 73 20 66 75 6e   table. This fun
27db0 63 74 69 6f 6e 20 69 73 0a 2a 2a 20 74 68 65 20  ction is.** the 
27dc0 6f 70 70 6f 73 69 74 65 20 6f 66 20 6d 61 63 72  opposite of macr
27dd0 6f 20 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f 52  o FTS5_SEGMENT_R
27de0 4f 57 49 44 28 29 2e 0a 2a 2f 0a 73 74 61 74 69  OWID()..*/.stati
27df0 63 20 76 6f 69 64 20 66 74 73 35 44 65 63 6f 64  c void fts5Decod
27e00 65 52 6f 77 69 64 28 0a 20 20 69 36 34 20 69 52  eRowid(.  i64 iR
27e10 6f 77 69 64 2c 20 20 20 20 20 20 20 20 20 20 20  owid,           
27e20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 77            /* Row
27e30 69 64 20 66 72 6f 6d 20 25 5f 64 61 74 61 20 74  id from %_data t
27e40 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 70  able */.  int *p
27e50 69 53 65 67 69 64 2c 20 20 20 20 20 20 20 20 20  iSegid,         
27e60 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54            /* OUT
27e70 3a 20 53 65 67 6d 65 6e 74 20 69 64 20 2a 2f 0a  : Segment id */.
27e80 20 20 69 6e 74 20 2a 70 62 44 6c 69 64 78 2c 20    int *pbDlidx, 
27e90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27ea0 20 20 2f 2a 20 4f 55 54 3a 20 44 6c 69 64 78 20    /* OUT: Dlidx 
27eb0 66 6c 61 67 20 2a 2f 0a 20 20 69 6e 74 20 2a 70  flag */.  int *p
27ec0 69 48 65 69 67 68 74 2c 20 20 20 20 20 20 20 20  iHeight,        
27ed0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54            /* OUT
27ee0 3a 20 48 65 69 67 68 74 20 2a 2f 0a 20 20 69 6e  : Height */.  in
27ef0 74 20 2a 70 69 50 67 6e 6f 20 20 20 20 20 20 20  t *piPgno       
27f00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
27f10 20 4f 55 54 3a 20 50 61 67 65 20 6e 75 6d 62 65   OUT: Page numbe
27f20 72 20 2a 2f 0a 29 7b 0a 20 20 2a 70 69 50 67 6e  r */.){.  *piPgn
27f30 6f 20 3d 20 28 69 6e 74 29 28 69 52 6f 77 69 64  o = (int)(iRowid
27f40 20 26 20 28 28 28 69 36 34 29 31 20 3c 3c 20 46   & (((i64)1 << F
27f50 54 53 35 5f 44 41 54 41 5f 50 41 47 45 5f 42 29  TS5_DATA_PAGE_B)
27f60 20 2d 20 31 29 29 3b 0a 20 20 69 52 6f 77 69 64   - 1));.  iRowid
27f70 20 3e 3e 3d 20 46 54 53 35 5f 44 41 54 41 5f 50   >>= FTS5_DATA_P
27f80 41 47 45 5f 42 3b 0a 0a 20 20 2a 70 69 48 65 69  AGE_B;..  *piHei
27f90 67 68 74 20 3d 20 28 69 6e 74 29 28 69 52 6f 77  ght = (int)(iRow
27fa0 69 64 20 26 20 28 28 28 69 36 34 29 31 20 3c 3c  id & (((i64)1 <<
27fb0 20 46 54 53 35 5f 44 41 54 41 5f 48 45 49 47 48   FTS5_DATA_HEIGH
27fc0 54 5f 42 29 20 2d 20 31 29 29 3b 0a 20 20 69 52  T_B) - 1));.  iR
27fd0 6f 77 69 64 20 3e 3e 3d 20 46 54 53 35 5f 44 41  owid >>= FTS5_DA
27fe0 54 41 5f 48 45 49 47 48 54 5f 42 3b 0a 0a 20 20  TA_HEIGHT_B;..  
27ff0 2a 70 62 44 6c 69 64 78 20 3d 20 28 69 6e 74 29  *pbDlidx = (int)
28000 28 69 52 6f 77 69 64 20 26 20 30 78 30 30 30 31  (iRowid & 0x0001
28010 29 3b 0a 20 20 69 52 6f 77 69 64 20 3e 3e 3d 20  );.  iRowid >>= 
28020 46 54 53 35 5f 44 41 54 41 5f 44 4c 49 5f 42 3b  FTS5_DATA_DLI_B;
28030 0a 0a 20 20 2a 70 69 53 65 67 69 64 20 3d 20 28  ..  *piSegid = (
28040 69 6e 74 29 28 69 52 6f 77 69 64 20 26 20 28 28  int)(iRowid & ((
28050 28 69 36 34 29 31 20 3c 3c 20 46 54 53 35 5f 44  (i64)1 << FTS5_D
28060 41 54 41 5f 49 44 5f 42 29 20 2d 20 31 29 29 3b  ATA_ID_B) - 1));
28070 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .}..static void 
28080 66 74 73 35 44 65 62 75 67 52 6f 77 69 64 28 69  fts5DebugRowid(i
28090 6e 74 20 2a 70 52 63 2c 20 46 74 73 35 42 75 66  nt *pRc, Fts5Buf
280a0 66 65 72 20 2a 70 42 75 66 2c 20 69 36 34 20 69  fer *pBuf, i64 i
280b0 4b 65 79 29 7b 0a 20 20 69 6e 74 20 69 53 65 67  Key){.  int iSeg
280c0 69 64 2c 20 69 48 65 69 67 68 74 2c 20 69 50 67  id, iHeight, iPg
280d0 6e 6f 2c 20 62 44 6c 69 64 78 3b 20 20 20 20 20  no, bDlidx;     
280e0 20 20 2f 2a 20 52 6f 77 69 64 20 63 6f 6d 70 65    /* Rowid compe
280f0 6e 65 6e 74 73 20 2a 2f 0a 20 20 66 74 73 35 44  nents */.  fts5D
28100 65 63 6f 64 65 52 6f 77 69 64 28 69 4b 65 79 2c  ecodeRowid(iKey,
28110 20 26 69 53 65 67 69 64 2c 20 26 62 44 6c 69 64   &iSegid, &bDlid
28120 78 2c 20 26 69 48 65 69 67 68 74 2c 20 26 69 50  x, &iHeight, &iP
28130 67 6e 6f 29 3b 0a 0a 20 20 69 66 28 20 69 53 65  gno);..  if( iSe
28140 67 69 64 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66  gid==0 ){.    if
28150 28 20 69 4b 65 79 3d 3d 46 54 53 35 5f 41 56 45  ( iKey==FTS5_AVE
28160 52 41 47 45 53 5f 52 4f 57 49 44 20 29 7b 0a 20  RAGES_ROWID ){. 
28170 20 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35       sqlite3Fts5
28180 42 75 66 66 65 72 41 70 70 65 6e 64 50 72 69 6e  BufferAppendPrin
28190 74 66 28 70 52 63 2c 20 70 42 75 66 2c 20 22 7b  tf(pRc, pBuf, "{
281a0 61 76 65 72 61 67 65 73 7d 20 22 29 3b 0a 20 20  averages} ");.  
281b0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73    }else{.      s
281c0 71 6c 69 74 65 33 46 74 73 35 42 75 66 66 65 72  qlite3Fts5Buffer
281d0 41 70 70 65 6e 64 50 72 69 6e 74 66 28 70 52 63  AppendPrintf(pRc
281e0 2c 20 70 42 75 66 2c 20 22 7b 73 74 72 75 63 74  , pBuf, "{struct
281f0 75 72 65 7d 22 29 3b 0a 20 20 20 20 7d 0a 20 20  ure}");.    }.  
28200 7d 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20 73 71  }.  else{.    sq
28210 6c 69 74 65 33 46 74 73 35 42 75 66 66 65 72 41  lite3Fts5BufferA
28220 70 70 65 6e 64 50 72 69 6e 74 66 28 70 52 63 2c  ppendPrintf(pRc,
28230 20 70 42 75 66 2c 20 22 7b 25 73 73 65 67 69 64   pBuf, "{%ssegid
28240 3d 25 64 20 68 3d 25 64 20 70 67 6e 6f 3d 25 64  =%d h=%d pgno=%d
28250 7d 22 2c 0a 20 20 20 20 20 20 20 20 62 44 6c 69  }",.        bDli
28260 64 78 20 3f 20 22 64 6c 69 64 78 20 22 20 3a 20  dx ? "dlidx " : 
28270 22 22 2c 20 69 53 65 67 69 64 2c 20 69 48 65 69  "", iSegid, iHei
28280 67 68 74 2c 20 69 50 67 6e 6f 0a 20 20 20 20 29  ght, iPgno.    )
28290 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63 20  ;.  }.}..static 
282a0 76 6f 69 64 20 66 74 73 35 44 65 62 75 67 53 74  void fts5DebugSt
282b0 72 75 63 74 75 72 65 28 0a 20 20 69 6e 74 20 2a  ructure(.  int *
282c0 70 52 63 2c 20 20 20 20 20 20 20 20 20 20 20 20  pRc,            
282d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 4e             /* IN
282e0 2f 4f 55 54 3a 20 65 72 72 6f 72 20 63 6f 64 65  /OUT: error code
282f0 20 2a 2f 0a 20 20 46 74 73 35 42 75 66 66 65 72   */.  Fts5Buffer
28300 20 2a 70 42 75 66 2c 0a 20 20 46 74 73 35 53 74   *pBuf,.  Fts5St
28310 72 75 63 74 75 72 65 20 2a 70 0a 29 7b 0a 20 20  ructure *p.){.  
28320 69 6e 74 20 69 4c 76 6c 2c 20 69 53 65 67 3b 20  int iLvl, iSeg; 
28330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28340 2f 2a 20 49 74 65 72 61 74 65 20 74 68 72 6f 75  /* Iterate throu
28350 67 68 20 6c 65 76 65 6c 73 2c 20 73 65 67 6d 65  gh levels, segme
28360 6e 74 73 20 2a 2f 0a 0a 20 20 66 6f 72 28 69 4c  nts */..  for(iL
28370 76 6c 3d 30 3b 20 69 4c 76 6c 3c 70 2d 3e 6e 4c  vl=0; iLvl<p->nL
28380 65 76 65 6c 3b 20 69 4c 76 6c 2b 2b 29 7b 0a 20  evel; iLvl++){. 
28390 20 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65     Fts5Structure
283a0 4c 65 76 65 6c 20 2a 70 4c 76 6c 20 3d 20 26 70  Level *pLvl = &p
283b0 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d 3b 0a  ->aLevel[iLvl];.
283c0 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 42      sqlite3Fts5B
283d0 75 66 66 65 72 41 70 70 65 6e 64 50 72 69 6e 74  ufferAppendPrint
283e0 66 28 70 52 63 2c 20 70 42 75 66 2c 20 0a 20 20  f(pRc, pBuf, .  
283f0 20 20 20 20 20 20 22 20 7b 6c 76 6c 3d 25 64 20        " {lvl=%d 
28400 6e 4d 65 72 67 65 3d 25 64 20 6e 53 65 67 3d 25  nMerge=%d nSeg=%
28410 64 22 2c 20 69 4c 76 6c 2c 20 70 4c 76 6c 2d 3e  d", iLvl, pLvl->
28420 6e 4d 65 72 67 65 2c 20 70 4c 76 6c 2d 3e 6e 53  nMerge, pLvl->nS
28430 65 67 0a 20 20 20 20 29 3b 0a 20 20 20 20 66 6f  eg.    );.    fo
28440 72 28 69 53 65 67 3d 30 3b 20 69 53 65 67 3c 70  r(iSeg=0; iSeg<p
28450 4c 76 6c 2d 3e 6e 53 65 67 3b 20 69 53 65 67 2b  Lvl->nSeg; iSeg+
28460 2b 29 7b 0a 20 20 20 20 20 20 46 74 73 35 53 74  +){.      Fts5St
28470 72 75 63 74 75 72 65 53 65 67 6d 65 6e 74 20 2a  ructureSegment *
28480 70 53 65 67 20 3d 20 26 70 4c 76 6c 2d 3e 61 53  pSeg = &pLvl->aS
28490 65 67 5b 69 53 65 67 5d 3b 0a 20 20 20 20 20 20  eg[iSeg];.      
284a0 73 71 6c 69 74 65 33 46 74 73 35 42 75 66 66 65  sqlite3Fts5Buffe
284b0 72 41 70 70 65 6e 64 50 72 69 6e 74 66 28 70 52  rAppendPrintf(pR
284c0 63 2c 20 70 42 75 66 2c 20 22 20 7b 69 64 3d 25  c, pBuf, " {id=%
284d0 64 20 6c 65 61 76 65 73 3d 25 64 2e 2e 25 64 7d  d leaves=%d..%d}
284e0 22 2c 20 0a 20 20 20 20 20 20 20 20 20 20 70 53  ", .          pS
284f0 65 67 2d 3e 69 53 65 67 69 64 2c 20 70 53 65 67  eg->iSegid, pSeg
28500 2d 3e 70 67 6e 6f 46 69 72 73 74 2c 20 70 53 65  ->pgnoFirst, pSe
28510 67 2d 3e 70 67 6e 6f 4c 61 73 74 0a 20 20 20 20  g->pgnoLast.    
28520 20 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73    );.    }.    s
28530 71 6c 69 74 65 33 46 74 73 35 42 75 66 66 65 72  qlite3Fts5Buffer
28540 41 70 70 65 6e 64 50 72 69 6e 74 66 28 70 52 63  AppendPrintf(pRc
28550 2c 20 70 42 75 66 2c 20 22 7d 22 29 3b 0a 20 20  , pBuf, "}");.  
28560 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  }.}../*.** This 
28570 69 73 20 70 61 72 74 20 6f 66 20 74 68 65 20 66  is part of the f
28580 74 73 35 5f 64 65 63 6f 64 65 28 29 20 64 65 62  ts5_decode() deb
28590 75 67 67 69 6e 67 20 61 69 64 2e 0a 2a 2a 0a 2a  ugging aid..**.*
285a0 2a 20 41 72 67 75 6d 65 6e 74 73 20 70 42 6c 6f  * Arguments pBlo
285b0 62 2f 6e 42 6c 6f 62 20 63 6f 6e 74 61 69 6e 20  b/nBlob contain 
285c0 61 20 73 65 72 69 61 6c 69 7a 65 64 20 46 74 73  a serialized Fts
285d0 35 53 74 72 75 63 74 75 72 65 20 6f 62 6a 65 63  5Structure objec
285e0 74 2e 20 54 68 69 73 0a 2a 2a 20 66 75 6e 63 74  t. This.** funct
285f0 69 6f 6e 20 61 70 70 65 6e 64 73 20 61 20 68 75  ion appends a hu
28600 6d 61 6e 2d 72 65 61 64 61 62 6c 65 20 72 65 70  man-readable rep
28610 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74  resentation of t
28620 68 65 20 73 61 6d 65 20 6f 62 6a 65 63 74 0a 2a  he same object.*
28630 2a 20 74 6f 20 74 68 65 20 62 75 66 66 65 72 20  * to the buffer 
28640 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65  passed as the se
28650 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2e 20 0a  cond argument. .
28660 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
28670 74 73 35 44 65 63 6f 64 65 53 74 72 75 63 74 75  ts5DecodeStructu
28680 72 65 28 0a 20 20 69 6e 74 20 2a 70 52 63 2c 20  re(.  int *pRc, 
28690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
286a0 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a        /* IN/OUT:
286b0 20 65 72 72 6f 72 20 63 6f 64 65 20 2a 2f 0a 20   error code */. 
286c0 20 46 74 73 35 42 75 66 66 65 72 20 2a 70 42 75   Fts5Buffer *pBu
286d0 66 2c 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 70  f,.  const u8 *p
286e0 42 6c 6f 62 2c 20 69 6e 74 20 6e 42 6c 6f 62 0a  Blob, int nBlob.
286f0 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  ){.  int rc;    
28700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28710 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
28720 6f 64 65 20 2a 2f 0a 20 20 46 74 73 35 53 74 72  ode */.  Fts5Str
28730 75 63 74 75 72 65 20 2a 70 20 3d 20 30 3b 20 20  ucture *p = 0;  
28740 20 20 20 20 20 20 20 20 20 2f 2a 20 44 65 63 6f           /* Deco
28750 64 65 64 20 73 74 72 75 63 74 75 72 65 20 6f 62  ded structure ob
28760 6a 65 63 74 20 2a 2f 0a 0a 20 20 72 63 20 3d 20  ject */..  rc = 
28770 66 74 73 35 53 74 72 75 63 74 75 72 65 44 65 63  fts5StructureDec
28780 6f 64 65 28 70 42 6c 6f 62 2c 20 6e 42 6c 6f 62  ode(pBlob, nBlob
28790 2c 20 30 2c 20 26 70 29 3b 0a 20 20 69 66 28 20  , 0, &p);.  if( 
287a0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
287b0 0a 20 20 20 20 2a 70 52 63 20 3d 20 72 63 3b 0a  .    *pRc = rc;.
287c0 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
287d0 0a 20 20 66 74 73 35 44 65 62 75 67 53 74 72 75  .  fts5DebugStru
287e0 63 74 75 72 65 28 70 52 63 2c 20 70 42 75 66 2c  cture(pRc, pBuf,
287f0 20 70 29 3b 0a 20 20 66 74 73 35 53 74 72 75 63   p);.  fts5Struc
28800 74 75 72 65 52 65 6c 65 61 73 65 28 70 29 3b 0a  tureRelease(p);.
28810 7d 0a 0a 2f 2a 0a 2a 2a 20 42 75 66 66 65 72 20  }../*.** Buffer 
28820 28 61 2f 6e 29 20 69 73 20 61 73 73 75 6d 65 64  (a/n) is assumed
28830 20 74 6f 20 63 6f 6e 74 61 69 6e 20 61 20 6c 69   to contain a li
28840 73 74 20 6f 66 20 73 65 72 69 61 6c 69 7a 65 64  st of serialized
28850 20 76 61 72 69 6e 74 73 2e 20 52 65 61 64 0a 2a   varints. Read.*
28860 2a 20 65 61 63 68 20 76 61 72 69 6e 74 20 61 6e  * each varint an
28870 64 20 61 70 70 65 6e 64 20 69 74 73 20 73 74 72  d append its str
28880 69 6e 67 20 72 65 70 72 65 73 65 6e 74 61 74 69  ing representati
28890 6f 6e 20 74 6f 20 62 75 66 66 65 72 20 70 42 75  on to buffer pBu
288a0 66 2e 20 52 65 74 75 72 6e 0a 2a 2a 20 61 66 74  f. Return.** aft
288b0 65 72 20 65 69 74 68 65 72 20 74 68 65 20 69 6e  er either the in
288c0 70 75 74 20 62 75 66 66 65 72 20 69 73 20 65 78  put buffer is ex
288d0 68 61 75 73 74 65 64 20 6f 72 20 61 20 30 20 76  hausted or a 0 v
288e0 61 6c 75 65 20 69 73 20 72 65 61 64 2e 0a 2a 2a  alue is read..**
288f0 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 20 76  .** The return v
28900 61 6c 75 65 20 69 73 20 74 68 65 20 6e 75 6d 62  alue is the numb
28910 65 72 20 6f 66 20 62 79 74 65 73 20 72 65 61 64  er of bytes read
28920 20 66 72 6f 6d 20 74 68 65 20 69 6e 70 75 74 20   from the input 
28930 62 75 66 66 65 72 2e 0a 2a 2f 0a 73 74 61 74 69  buffer..*/.stati
28940 63 20 69 6e 74 20 66 74 73 35 44 65 63 6f 64 65  c int fts5Decode
28950 50 6f 73 6c 69 73 74 28 69 6e 74 20 2a 70 52 63  Poslist(int *pRc
28960 2c 20 46 74 73 35 42 75 66 66 65 72 20 2a 70 42  , Fts5Buffer *pB
28970 75 66 2c 20 63 6f 6e 73 74 20 75 38 20 2a 61 2c  uf, const u8 *a,
28980 20 69 6e 74 20 6e 29 7b 0a 20 20 69 6e 74 20 69   int n){.  int i
28990 4f 66 66 20 3d 20 30 3b 0a 20 20 77 68 69 6c 65  Off = 0;.  while
289a0 28 20 69 4f 66 66 3c 6e 20 29 7b 0a 20 20 20 20  ( iOff<n ){.    
289b0 69 6e 74 20 69 56 61 6c 3b 0a 20 20 20 20 69 4f  int iVal;.    iO
289c0 66 66 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72  ff += fts5GetVar
289d0 69 6e 74 33 32 28 26 61 5b 69 4f 66 66 5d 2c 20  int32(&a[iOff], 
289e0 69 56 61 6c 29 3b 0a 20 20 20 20 73 71 6c 69 74  iVal);.    sqlit
289f0 65 33 46 74 73 35 42 75 66 66 65 72 41 70 70 65  e3Fts5BufferAppe
28a00 6e 64 50 72 69 6e 74 66 28 70 52 63 2c 20 70 42  ndPrintf(pRc, pB
28a10 75 66 2c 20 22 20 25 64 22 2c 20 69 56 61 6c 29  uf, " %d", iVal)
28a20 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 69  ;.  }.  return i
28a30 4f 66 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  Off;.}../*.** Th
28a40 65 20 73 74 61 72 74 20 6f 66 20 62 75 66 66 65  e start of buffe
28a50 72 20 28 61 2f 6e 29 20 63 6f 6e 74 61 69 6e 73  r (a/n) contains
28a60 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 61 20   the start of a 
28a70 64 6f 63 6c 69 73 74 2e 20 54 68 65 20 64 6f 63  doclist. The doc
28a80 6c 69 73 74 0a 2a 2a 20 6d 61 79 20 6f 72 20 6d  list.** may or m
28a90 61 79 20 6e 6f 74 20 66 69 6e 69 73 68 20 77 69  ay not finish wi
28aa0 74 68 69 6e 20 74 68 65 20 62 75 66 66 65 72 2e  thin the buffer.
28ab0 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61   This function a
28ac0 70 70 65 6e 64 73 20 61 20 74 65 78 74 0a 2a 2a  ppends a text.**
28ad0 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20   representation 
28ae0 6f 66 20 74 68 65 20 70 61 72 74 20 6f 66 20 74  of the part of t
28af0 68 65 20 64 6f 63 6c 69 73 74 20 74 68 61 74 20  he doclist that 
28b00 69 73 20 70 72 65 73 65 6e 74 20 74 6f 20 62 75  is present to bu
28b10 66 66 65 72 0a 2a 2a 20 70 42 75 66 2e 20 0a 2a  ffer.** pBuf. .*
28b20 2a 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 20  *.** The return 
28b30 76 61 6c 75 65 20 69 73 20 74 68 65 20 6e 75 6d  value is the num
28b40 62 65 72 20 6f 66 20 62 79 74 65 73 20 72 65 61  ber of bytes rea
28b50 64 20 66 72 6f 6d 20 74 68 65 20 69 6e 70 75 74  d from the input
28b60 20 62 75 66 66 65 72 2e 0a 2a 2f 0a 73 74 61 74   buffer..*/.stat
28b70 69 63 20 69 6e 74 20 66 74 73 35 44 65 63 6f 64  ic int fts5Decod
28b80 65 44 6f 63 6c 69 73 74 28 69 6e 74 20 2a 70 52  eDoclist(int *pR
28b90 63 2c 20 46 74 73 35 42 75 66 66 65 72 20 2a 70  c, Fts5Buffer *p
28ba0 42 75 66 2c 20 63 6f 6e 73 74 20 75 38 20 2a 61  Buf, const u8 *a
28bb0 2c 20 69 6e 74 20 6e 29 7b 0a 20 20 69 36 34 20  , int n){.  i64 
28bc0 69 44 6f 63 69 64 20 3d 20 30 3b 0a 20 20 69 6e  iDocid = 0;.  in
28bd0 74 20 69 4f 66 66 20 3d 20 30 3b 0a 0a 20 20 69  t iOff = 0;..  i
28be0 66 28 20 6e 3e 30 20 29 7b 0a 20 20 20 20 69 4f  f( n>0 ){.    iO
28bf0 66 66 20 3d 20 73 71 6c 69 74 65 33 46 74 73 35  ff = sqlite3Fts5
28c00 47 65 74 56 61 72 69 6e 74 28 61 2c 20 28 75 36  GetVarint(a, (u6
28c10 34 2a 29 26 69 44 6f 63 69 64 29 3b 0a 20 20 20  4*)&iDocid);.   
28c20 20 73 71 6c 69 74 65 33 46 74 73 35 42 75 66 66   sqlite3Fts5Buff
28c30 65 72 41 70 70 65 6e 64 50 72 69 6e 74 66 28 70  erAppendPrintf(p
28c40 52 63 2c 20 70 42 75 66 2c 20 22 20 69 64 3d 25  Rc, pBuf, " id=%
28c50 6c 6c 64 22 2c 20 69 44 6f 63 69 64 29 3b 0a 20  lld", iDocid);. 
28c60 20 7d 0a 20 20 77 68 69 6c 65 28 20 69 4f 66 66   }.  while( iOff
28c70 3c 6e 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 50  <n ){.    int nP
28c80 6f 73 3b 0a 20 20 20 20 69 6e 74 20 62 44 75 6d  os;.    int bDum
28c90 6d 79 3b 0a 20 20 20 20 69 4f 66 66 20 2b 3d 20  my;.    iOff += 
28ca0 66 74 73 35 47 65 74 50 6f 73 6c 69 73 74 53 69  fts5GetPoslistSi
28cb0 7a 65 28 26 61 5b 69 4f 66 66 5d 2c 20 26 6e 50  ze(&a[iOff], &nP
28cc0 6f 73 2c 20 26 62 44 75 6d 6d 79 29 3b 0a 20 20  os, &bDummy);.  
28cd0 20 20 69 4f 66 66 20 2b 3d 20 66 74 73 35 44 65    iOff += fts5De
28ce0 63 6f 64 65 50 6f 73 6c 69 73 74 28 70 52 63 2c  codePoslist(pRc,
28cf0 20 70 42 75 66 2c 20 26 61 5b 69 4f 66 66 5d 2c   pBuf, &a[iOff],
28d00 20 4d 49 4e 28 6e 2d 69 4f 66 66 2c 20 6e 50 6f   MIN(n-iOff, nPo
28d10 73 29 29 3b 0a 20 20 20 20 69 66 28 20 69 4f 66  s));.    if( iOf
28d20 66 3c 6e 20 29 7b 0a 20 20 20 20 20 20 69 36 34  f<n ){.      i64
28d30 20 69 44 65 6c 74 61 3b 0a 20 20 20 20 20 20 69   iDelta;.      i
28d40 4f 66 66 20 2b 3d 20 73 71 6c 69 74 65 33 46 74  Off += sqlite3Ft
28d50 73 35 47 65 74 56 61 72 69 6e 74 28 26 61 5b 69  s5GetVarint(&a[i
28d60 4f 66 66 5d 2c 20 28 75 36 34 2a 29 26 69 44 65  Off], (u64*)&iDe
28d70 6c 74 61 29 3b 0a 20 20 20 20 20 20 69 66 28 20  lta);.      if( 
28d80 69 44 65 6c 74 61 3d 3d 30 20 29 20 72 65 74 75  iDelta==0 ) retu
28d90 72 6e 20 69 4f 66 66 3b 0a 20 20 20 20 20 20 69  rn iOff;.      i
28da0 44 6f 63 69 64 20 2b 3d 20 69 44 65 6c 74 61 3b  Docid += iDelta;
28db0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 46 74  .      sqlite3Ft
28dc0 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 50 72  s5BufferAppendPr
28dd0 69 6e 74 66 28 70 52 63 2c 20 70 42 75 66 2c 20  intf(pRc, pBuf, 
28de0 22 20 69 64 3d 25 6c 6c 64 22 2c 20 69 44 6f 63  " id=%lld", iDoc
28df0 69 64 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  id);.    }.  }..
28e00 20 20 72 65 74 75 72 6e 20 69 4f 66 66 3b 0a 7d    return iOff;.}
28e10 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 69 6d 70 6c  ../*.** The impl
28e20 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 75 73  ementation of us
28e30 65 72 2d 64 65 66 69 6e 65 64 20 73 63 61 6c 61  er-defined scala
28e40 72 20 66 75 6e 63 74 69 6f 6e 20 66 74 73 35 5f  r function fts5_
28e50 64 65 63 6f 64 65 28 29 2e 0a 2a 2f 0a 73 74 61  decode()..*/.sta
28e60 74 69 63 20 76 6f 69 64 20 66 74 73 35 44 65 63  tic void fts5Dec
28e70 6f 64 65 46 75 6e 63 74 69 6f 6e 28 0a 20 20 73  odeFunction(.  s
28e80 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a  qlite3_context *
28e90 70 43 74 78 2c 20 20 20 20 20 20 20 20 20 20 2f  pCtx,          /
28ea0 2a 20 46 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 20  * Function call 
28eb0 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74  context */.  int
28ec0 20 6e 41 72 67 2c 20 20 20 20 20 20 20 20 20 20   nArg,          
28ed0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
28ee0 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 73 20 28  Number of args (
28ef0 61 6c 77 61 79 73 20 32 29 20 2a 2f 0a 20 20 73  always 2) */.  s
28f00 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61  qlite3_value **a
28f10 70 56 61 6c 20 20 20 20 20 20 20 20 20 20 20 2f  pVal           /
28f20 2a 20 46 75 6e 63 74 69 6f 6e 20 61 72 67 75 6d  * Function argum
28f30 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 69 36 34  ents */.){.  i64
28f40 20 69 52 6f 77 69 64 3b 20 20 20 20 20 20 20 20   iRowid;        
28f50 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
28f60 52 6f 77 69 64 20 66 6f 72 20 72 65 63 6f 72 64  Rowid for record
28f70 20 62 65 69 6e 67 20 64 65 63 6f 64 65 64 20 2a   being decoded *
28f80 2f 0a 20 20 69 6e 74 20 69 53 65 67 69 64 2c 69  /.  int iSegid,i
28f90 48 65 69 67 68 74 2c 69 50 67 6e 6f 2c 62 44 6c  Height,iPgno,bDl
28fa0 69 64 78 3b 2f 2a 20 52 6f 77 69 64 20 63 6f 6d  idx;/* Rowid com
28fb0 70 6f 6e 65 6e 74 73 20 2a 2f 0a 20 20 63 6f 6e  ponents */.  con
28fc0 73 74 20 75 38 20 2a 61 42 6c 6f 62 3b 20 69 6e  st u8 *aBlob; in
28fd0 74 20 6e 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  t n;         /* 
28fe0 52 65 63 6f 72 64 20 74 6f 20 64 65 63 6f 64 65  Record to decode
28ff0 20 2a 2f 0a 20 20 75 38 20 2a 61 20 3d 20 30 3b   */.  u8 *a = 0;
29000 0a 20 20 46 74 73 35 42 75 66 66 65 72 20 73 3b  .  Fts5Buffer s;
29010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29020 20 20 20 2f 2a 20 42 75 69 6c 64 20 75 70 20 74     /* Build up t
29030 65 78 74 20 74 6f 20 72 65 74 75 72 6e 20 68 65  ext to return he
29040 72 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d  re */.  int rc =
29050 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20   SQLITE_OK;     
29060 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
29070 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20  n code */.  int 
29080 6e 53 70 61 63 65 20 3d 20 30 3b 0a 0a 20 20 61  nSpace = 0;..  a
29090 73 73 65 72 74 28 20 6e 41 72 67 3d 3d 32 20 29  ssert( nArg==2 )
290a0 3b 0a 20 20 6d 65 6d 73 65 74 28 26 73 2c 20 30  ;.  memset(&s, 0
290b0 2c 20 73 69 7a 65 6f 66 28 46 74 73 35 42 75 66  , sizeof(Fts5Buf
290c0 66 65 72 29 29 3b 0a 20 20 69 52 6f 77 69 64 20  fer));.  iRowid 
290d0 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  = sqlite3_value_
290e0 69 6e 74 36 34 28 61 70 56 61 6c 5b 30 5d 29 3b  int64(apVal[0]);
290f0 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 61 20 63 6f  ..  /* Make a co
29100 70 79 20 6f 66 20 74 68 65 20 73 65 63 6f 6e 64  py of the second
29110 20 61 72 67 75 6d 65 6e 74 20 28 61 20 62 6c 6f   argument (a blo
29120 62 29 20 69 6e 20 61 42 6c 6f 62 5b 5d 2e 20 54  b) in aBlob[]. T
29130 68 65 20 61 42 6c 6f 62 5b 5d 0a 20 20 2a 2a 20  he aBlob[].  ** 
29140 63 6f 70 79 20 69 73 20 66 6f 6c 6c 6f 77 65 64  copy is followed
29150 20 62 79 20 46 54 53 35 5f 44 41 54 41 5f 5a 45   by FTS5_DATA_ZE
29160 52 4f 5f 50 41 44 44 49 4e 47 20 30 78 30 30 20  RO_PADDING 0x00 
29170 62 79 74 65 73 2c 20 77 68 69 63 68 20 70 72 65  bytes, which pre
29180 76 65 6e 74 73 0a 20 20 2a 2a 20 62 75 66 66 65  vents.  ** buffe
29190 72 20 6f 76 65 72 72 65 61 64 73 20 65 76 65 6e  r overreads even
291a0 20 69 66 20 74 68 65 20 72 65 63 6f 72 64 20 69   if the record i
291b0 73 20 63 6f 72 72 75 70 74 2e 20 20 2a 2f 0a 20  s corrupt.  */. 
291c0 20 6e 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c   n = sqlite3_val
291d0 75 65 5f 62 79 74 65 73 28 61 70 56 61 6c 5b 31  ue_bytes(apVal[1
291e0 5d 29 3b 0a 20 20 61 42 6c 6f 62 20 3d 20 73 71  ]);.  aBlob = sq
291f0 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 6c 6f 62  lite3_value_blob
29200 28 61 70 56 61 6c 5b 31 5d 29 3b 0a 20 20 6e 53  (apVal[1]);.  nS
29210 70 61 63 65 20 3d 20 6e 20 2b 20 46 54 53 35 5f  pace = n + FTS5_
29220 44 41 54 41 5f 5a 45 52 4f 5f 50 41 44 44 49 4e  DATA_ZERO_PADDIN
29230 47 3b 0a 20 20 61 20 3d 20 28 75 38 2a 29 73 71  G;.  a = (u8*)sq
29240 6c 69 74 65 33 46 74 73 35 4d 61 6c 6c 6f 63 5a  lite3Fts5MallocZ
29250 65 72 6f 28 26 72 63 2c 20 6e 53 70 61 63 65 29  ero(&rc, nSpace)
29260 3b 0a 20 20 69 66 28 20 61 3d 3d 30 20 29 20 67  ;.  if( a==0 ) g
29270 6f 74 6f 20 64 65 63 6f 64 65 5f 6f 75 74 3b 0a  oto decode_out;.
29280 20 20 6d 65 6d 63 70 79 28 61 2c 20 61 42 6c 6f    memcpy(a, aBlo
29290 62 2c 20 6e 29 3b 0a 0a 0a 20 20 66 74 73 35 44  b, n);...  fts5D
292a0 65 63 6f 64 65 52 6f 77 69 64 28 69 52 6f 77 69  ecodeRowid(iRowi
292b0 64 2c 20 26 69 53 65 67 69 64 2c 20 26 62 44 6c  d, &iSegid, &bDl
292c0 69 64 78 2c 20 26 69 48 65 69 67 68 74 2c 20 26  idx, &iHeight, &
292d0 69 50 67 6e 6f 29 3b 0a 0a 20 20 66 74 73 35 44  iPgno);..  fts5D
292e0 65 62 75 67 52 6f 77 69 64 28 26 72 63 2c 20 26  ebugRowid(&rc, &
292f0 73 2c 20 69 52 6f 77 69 64 29 3b 0a 20 20 69 66  s, iRowid);.  if
29300 28 20 62 44 6c 69 64 78 20 29 7b 0a 20 20 20 20  ( bDlidx ){.    
29310 46 74 73 35 44 61 74 61 20 64 6c 69 64 78 3b 0a  Fts5Data dlidx;.
29320 20 20 20 20 46 74 73 35 44 6c 69 64 78 4c 76 6c      Fts5DlidxLvl
29330 20 6c 76 6c 3b 0a 0a 20 20 20 20 64 6c 69 64 78   lvl;..    dlidx
29340 2e 70 20 3d 20 61 3b 0a 20 20 20 20 64 6c 69 64  .p = a;.    dlid
29350 78 2e 6e 6e 20 3d 20 6e 3b 0a 0a 20 20 20 20 6d  x.nn = n;..    m
29360 65 6d 73 65 74 28 26 6c 76 6c 2c 20 30 2c 20 73  emset(&lvl, 0, s
29370 69 7a 65 6f 66 28 46 74 73 35 44 6c 69 64 78 4c  izeof(Fts5DlidxL
29380 76 6c 29 29 3b 0a 20 20 20 20 6c 76 6c 2e 70 44  vl));.    lvl.pD
29390 61 74 61 20 3d 20 26 64 6c 69 64 78 3b 0a 20 20  ata = &dlidx;.  
293a0 20 20 6c 76 6c 2e 69 4c 65 61 66 50 67 6e 6f 20    lvl.iLeafPgno 
293b0 3d 20 69 50 67 6e 6f 3b 0a 0a 20 20 20 20 66 6f  = iPgno;..    fo
293c0 72 28 66 74 73 35 44 6c 69 64 78 4c 76 6c 4e 65  r(fts5DlidxLvlNe
293d0 78 74 28 26 6c 76 6c 29 3b 20 6c 76 6c 2e 62 45  xt(&lvl); lvl.bE
293e0 6f 66 3d 3d 30 3b 20 66 74 73 35 44 6c 69 64 78  of==0; fts5Dlidx
293f0 4c 76 6c 4e 65 78 74 28 26 6c 76 6c 29 29 7b 0a  LvlNext(&lvl)){.
29400 20 20 20 20 20 20 73 71 6c 69 74 65 33 46 74 73        sqlite3Fts
29410 35 42 75 66 66 65 72 41 70 70 65 6e 64 50 72 69  5BufferAppendPri
29420 6e 74 66 28 26 72 63 2c 20 26 73 2c 20 0a 20 20  ntf(&rc, &s, .  
29430 20 20 20 20 20 20 20 20 22 20 25 64 28 25 6c 6c          " %d(%ll
29440 64 29 22 2c 20 6c 76 6c 2e 69 4c 65 61 66 50 67  d)", lvl.iLeafPg
29450 6e 6f 2c 20 6c 76 6c 2e 69 52 6f 77 69 64 0a 20  no, lvl.iRowid. 
29460 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 20 20       );.    }.  
29470 7d 65 6c 73 65 20 69 66 28 20 69 53 65 67 69 64  }else if( iSegid
29480 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 69  ==0 ){.    if( i
29490 52 6f 77 69 64 3d 3d 46 54 53 35 5f 41 56 45 52  Rowid==FTS5_AVER
294a0 41 47 45 53 5f 52 4f 57 49 44 20 29 7b 0a 20 20  AGES_ROWID ){.  
294b0 20 20 20 20 2f 2a 20 74 6f 64 6f 20 2a 2f 0a 20      /* todo */. 
294c0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
294d0 66 74 73 35 44 65 63 6f 64 65 53 74 72 75 63 74  fts5DecodeStruct
294e0 75 72 65 28 26 72 63 2c 20 26 73 2c 20 61 2c 20  ure(&rc, &s, a, 
294f0 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  n);.    }.  }els
29500 65 7b 0a 20 20 20 20 46 74 73 35 42 75 66 66 65  e{.    Fts5Buffe
29510 72 20 74 65 72 6d 3b 20 20 20 20 20 20 20 20 20  r term;         
29520 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20       /* Current 
29530 74 65 72 6d 20 72 65 61 64 20 66 72 6f 6d 20 70  term read from p
29540 61 67 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 73  age */.    int s
29550 7a 4c 65 61 66 3b 20 20 20 20 20 20 20 20 20 20  zLeaf;          
29560 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73           /* Offs
29570 65 74 20 6f 66 20 70 67 69 64 78 20 69 6e 20 61  et of pgidx in a
29580 5b 5d 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 50  [] */.    int iP
29590 67 69 64 78 4f 66 66 3b 0a 20 20 20 20 69 6e 74  gidxOff;.    int
295a0 20 69 50 67 69 64 78 50 72 65 76 20 3d 20 30 3b   iPgidxPrev = 0;
295b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 72             /* Pr
295c0 65 76 69 6f 75 73 20 76 61 6c 75 65 20 72 65 61  evious value rea
295d0 64 20 66 72 6f 6d 20 70 67 69 64 78 20 2a 2f 0a  d from pgidx */.
295e0 20 20 20 20 69 6e 74 20 69 54 65 72 6d 4f 66 66      int iTermOff
295f0 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 69 52   = 0;.    int iR
29600 6f 77 69 64 4f 66 66 20 3d 20 30 3b 0a 20 20 20  owidOff = 0;.   
29610 20 69 6e 74 20 69 4f 66 66 3b 0a 20 20 20 20 69   int iOff;.    i
29620 6e 74 20 6e 44 6f 63 6c 69 73 74 3b 0a 0a 20 20  nt nDoclist;..  
29630 20 20 6d 65 6d 73 65 74 28 26 74 65 72 6d 2c 20    memset(&term, 
29640 30 2c 20 73 69 7a 65 6f 66 28 46 74 73 35 42 75  0, sizeof(Fts5Bu
29650 66 66 65 72 29 29 3b 0a 0a 20 20 20 20 69 66 28  ffer));..    if(
29660 20 6e 3c 34 20 29 7b 0a 20 20 20 20 20 20 73 71   n<4 ){.      sq
29670 6c 69 74 65 33 46 74 73 35 42 75 66 66 65 72 53  lite3Fts5BufferS
29680 65 74 28 26 72 63 2c 20 26 73 2c 20 38 2c 20 28  et(&rc, &s, 8, (
29690 63 6f 6e 73 74 20 75 38 2a 29 22 63 6f 72 72 75  const u8*)"corru
296a0 70 74 22 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f  pt");.      goto
296b0 20 64 65 63 6f 64 65 5f 6f 75 74 3b 0a 20 20 20   decode_out;.   
296c0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 52   }else{.      iR
296d0 6f 77 69 64 4f 66 66 20 3d 20 66 74 73 35 47 65  owidOff = fts5Ge
296e0 74 55 31 36 28 26 61 5b 30 5d 29 3b 0a 20 20 20  tU16(&a[0]);.   
296f0 20 20 20 69 50 67 69 64 78 4f 66 66 20 3d 20 73     iPgidxOff = s
29700 7a 4c 65 61 66 20 3d 20 66 74 73 35 47 65 74 55  zLeaf = fts5GetU
29710 31 36 28 26 61 5b 32 5d 29 3b 0a 20 20 20 20 20  16(&a[2]);.     
29720 20 69 66 28 20 69 50 67 69 64 78 4f 66 66 3c 6e   if( iPgidxOff<n
29730 20 29 7b 0a 20 20 20 20 20 20 20 20 66 74 73 35   ){.        fts5
29740 47 65 74 56 61 72 69 6e 74 33 32 28 26 61 5b 69  GetVarint32(&a[i
29750 50 67 69 64 78 4f 66 66 5d 2c 20 69 54 65 72 6d  PgidxOff], iTerm
29760 4f 66 66 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Off);.      }.  
29770 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 65 63 6f    }..    /* Deco
29780 64 65 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 20  de the position 
29790 6c 69 73 74 20 74 61 69 6c 20 61 74 20 74 68 65  list tail at the
297a0 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 70 61   start of the pa
297b0 67 65 20 2a 2f 0a 20 20 20 20 69 66 28 20 69 52  ge */.    if( iR
297c0 6f 77 69 64 4f 66 66 21 3d 30 20 29 7b 0a 20 20  owidOff!=0 ){.  
297d0 20 20 20 20 69 4f 66 66 20 3d 20 69 52 6f 77 69      iOff = iRowi
297e0 64 4f 66 66 3b 0a 20 20 20 20 7d 65 6c 73 65 20  dOff;.    }else 
297f0 69 66 28 20 69 54 65 72 6d 4f 66 66 21 3d 30 20  if( iTermOff!=0 
29800 29 7b 0a 20 20 20 20 20 20 69 4f 66 66 20 3d 20  ){.      iOff = 
29810 69 54 65 72 6d 4f 66 66 3b 0a 20 20 20 20 7d 65  iTermOff;.    }e
29820 6c 73 65 7b 0a 20 20 20 20 20 20 69 4f 66 66 20  lse{.      iOff 
29830 3d 20 73 7a 4c 65 61 66 3b 0a 20 20 20 20 7d 0a  = szLeaf;.    }.
29840 20 20 20 20 66 74 73 35 44 65 63 6f 64 65 50 6f      fts5DecodePo
29850 73 6c 69 73 74 28 26 72 63 2c 20 26 73 2c 20 26  slist(&rc, &s, &
29860 61 5b 34 5d 2c 20 69 4f 66 66 2d 34 29 3b 0a 0a  a[4], iOff-4);..
29870 20 20 20 20 2f 2a 20 44 65 63 6f 64 65 20 61 6e      /* Decode an
29880 79 20 6d 6f 72 65 20 64 6f 63 6c 69 73 74 20 64  y more doclist d
29890 61 74 61 20 74 68 61 74 20 61 70 70 65 61 72 73  ata that appears
298a0 20 6f 6e 20 74 68 65 20 70 61 67 65 20 62 65 66   on the page bef
298b0 6f 72 65 20 74 68 65 0a 20 20 20 20 2a 2a 20 66  ore the.    ** f
298c0 69 72 73 74 20 74 65 72 6d 2e 20 2a 2f 0a 20 20  irst term. */.  
298d0 20 20 6e 44 6f 63 6c 69 73 74 20 3d 20 28 69 54    nDoclist = (iT
298e0 65 72 6d 4f 66 66 20 3f 20 69 54 65 72 6d 4f 66  ermOff ? iTermOf
298f0 66 20 3a 20 73 7a 4c 65 61 66 29 20 2d 20 69 4f  f : szLeaf) - iO
29900 66 66 3b 0a 20 20 20 20 66 74 73 35 44 65 63 6f  ff;.    fts5Deco
29910 64 65 44 6f 63 6c 69 73 74 28 26 72 63 2c 20 26  deDoclist(&rc, &
29920 73 2c 20 26 61 5b 69 4f 66 66 5d 2c 20 6e 44 6f  s, &a[iOff], nDo
29930 63 6c 69 73 74 29 3b 0a 0a 20 20 20 20 77 68 69  clist);..    whi
29940 6c 65 28 20 69 50 67 69 64 78 4f 66 66 3c 6e 20  le( iPgidxOff<n 
29950 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 62 46 69  ){.      int bFi
29960 72 73 74 20 3d 20 28 69 50 67 69 64 78 4f 66 66  rst = (iPgidxOff
29970 3d 3d 73 7a 4c 65 61 66 29 3b 20 20 20 20 20 2f  ==szLeaf);     /
29980 2a 20 54 72 75 65 20 66 6f 72 20 66 69 72 73 74  * True for first
29990 20 74 65 72 6d 20 6f 6e 20 70 61 67 65 20 2a 2f   term on page */
299a0 0a 20 20 20 20 20 20 69 6e 74 20 6e 42 79 74 65  .      int nByte
299b0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
299c0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
299d0 42 79 74 65 73 20 6f 66 20 64 61 74 61 20 2a 2f  Bytes of data */
299e0 0a 20 20 20 20 20 20 69 6e 74 20 69 45 6e 64 3b  .      int iEnd;
299f0 0a 20 20 20 20 20 20 0a 20 20 20 20 20 20 69 50  .      .      iP
29a00 67 69 64 78 4f 66 66 20 2b 3d 20 66 74 73 35 47  gidxOff += fts5G
29a10 65 74 56 61 72 69 6e 74 33 32 28 26 61 5b 69 50  etVarint32(&a[iP
29a20 67 69 64 78 4f 66 66 5d 2c 20 6e 42 79 74 65 29  gidxOff], nByte)
29a30 3b 0a 20 20 20 20 20 20 69 50 67 69 64 78 50 72  ;.      iPgidxPr
29a40 65 76 20 2b 3d 20 6e 42 79 74 65 3b 0a 20 20 20  ev += nByte;.   
29a50 20 20 20 69 4f 66 66 20 3d 20 69 50 67 69 64 78     iOff = iPgidx
29a60 50 72 65 76 3b 0a 0a 20 20 20 20 20 20 69 66 28  Prev;..      if(
29a70 20 69 50 67 69 64 78 4f 66 66 3c 6e 20 29 7b 0a   iPgidxOff<n ){.
29a80 20 20 20 20 20 20 20 20 66 74 73 35 47 65 74 56          fts5GetV
29a90 61 72 69 6e 74 33 32 28 26 61 5b 69 50 67 69 64  arint32(&a[iPgid
29aa0 78 4f 66 66 5d 2c 20 6e 42 79 74 65 29 3b 0a 20  xOff], nByte);. 
29ab0 20 20 20 20 20 20 20 69 45 6e 64 20 3d 20 69 50         iEnd = iP
29ac0 67 69 64 78 50 72 65 76 20 2b 20 6e 42 79 74 65  gidxPrev + nByte
29ad0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
29ae0 20 20 20 20 20 20 20 69 45 6e 64 20 3d 20 73 7a         iEnd = sz
29af0 4c 65 61 66 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  Leaf;.      }.. 
29b00 20 20 20 20 20 69 66 28 20 62 46 69 72 73 74 3d       if( bFirst=
29b10 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 4f  =0 ){.        iO
29b20 66 66 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72  ff += fts5GetVar
29b30 69 6e 74 33 32 28 26 61 5b 69 4f 66 66 5d 2c 20  int32(&a[iOff], 
29b40 6e 42 79 74 65 29 3b 0a 20 20 20 20 20 20 20 20  nByte);.        
29b50 74 65 72 6d 2e 6e 20 3d 20 6e 42 79 74 65 3b 0a  term.n = nByte;.
29b60 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 4f        }.      iO
29b70 66 66 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72  ff += fts5GetVar
29b80 69 6e 74 33 32 28 26 61 5b 69 4f 66 66 5d 2c 20  int32(&a[iOff], 
29b90 6e 42 79 74 65 29 3b 0a 20 20 20 20 20 20 66 74  nByte);.      ft
29ba0 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 42 6c  s5BufferAppendBl
29bb0 6f 62 28 26 72 63 2c 20 26 74 65 72 6d 2c 20 6e  ob(&rc, &term, n
29bc0 42 79 74 65 2c 20 26 61 5b 69 4f 66 66 5d 29 3b  Byte, &a[iOff]);
29bd0 0a 20 20 20 20 20 20 69 4f 66 66 20 2b 3d 20 6e  .      iOff += n
29be0 42 79 74 65 3b 0a 0a 20 20 20 20 20 20 73 71 6c  Byte;..      sql
29bf0 69 74 65 33 46 74 73 35 42 75 66 66 65 72 41 70  ite3Fts5BufferAp
29c00 70 65 6e 64 50 72 69 6e 74 66 28 0a 20 20 20 20  pendPrintf(.    
29c10 20 20 20 20 20 20 26 72 63 2c 20 26 73 2c 20 22        &rc, &s, "
29c20 20 74 65 72 6d 3d 25 2e 2a 73 22 2c 20 74 65 72   term=%.*s", ter
29c30 6d 2e 6e 2c 20 28 63 6f 6e 73 74 20 63 68 61 72  m.n, (const char
29c40 2a 29 74 65 72 6d 2e 70 0a 20 20 20 20 20 20 29  *)term.p.      )
29c50 3b 0a 20 20 20 20 20 20 69 4f 66 66 20 2b 3d 20  ;.      iOff += 
29c60 66 74 73 35 44 65 63 6f 64 65 44 6f 63 6c 69 73  fts5DecodeDoclis
29c70 74 28 26 72 63 2c 20 26 73 2c 20 26 61 5b 69 4f  t(&rc, &s, &a[iO
29c80 66 66 5d 2c 20 69 45 6e 64 2d 69 4f 66 66 29 3b  ff], iEnd-iOff);
29c90 0a 20 20 20 20 7d 0a 0a 20 20 20 20 66 74 73 35  .    }..    fts5
29ca0 42 75 66 66 65 72 46 72 65 65 28 26 74 65 72 6d  BufferFree(&term
29cb0 29 3b 0a 20 20 7d 0a 20 20 0a 20 64 65 63 6f 64  );.  }.  . decod
29cc0 65 5f 6f 75 74 3a 0a 20 20 73 71 6c 69 74 65 33  e_out:.  sqlite3
29cd0 5f 66 72 65 65 28 61 29 3b 0a 20 20 69 66 28 20  _free(a);.  if( 
29ce0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
29cf0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73  .    sqlite3_res
29d00 75 6c 74 5f 74 65 78 74 28 70 43 74 78 2c 20 28  ult_text(pCtx, (
29d10 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 2e 70 2c  const char*)s.p,
29d20 20 73 2e 6e 2c 20 53 51 4c 49 54 45 5f 54 52 41   s.n, SQLITE_TRA
29d30 4e 53 49 45 4e 54 29 3b 0a 20 20 7d 65 6c 73 65  NSIENT);.  }else
29d40 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65  {.    sqlite3_re
29d50 73 75 6c 74 5f 65 72 72 6f 72 5f 63 6f 64 65 28  sult_error_code(
29d60 70 43 74 78 2c 20 72 63 29 3b 0a 20 20 7d 0a 20  pCtx, rc);.  }. 
29d70 20 66 74 73 35 42 75 66 66 65 72 46 72 65 65 28   fts5BufferFree(
29d80 26 73 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  &s);.}../*.** Th
29d90 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  e implementation
29da0 20 6f 66 20 75 73 65 72 2d 64 65 66 69 6e 65 64   of user-defined
29db0 20 73 63 61 6c 61 72 20 66 75 6e 63 74 69 6f 6e   scalar function
29dc0 20 66 74 73 35 5f 72 6f 77 69 64 28 29 2e 0a 2a   fts5_rowid()..*
29dd0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  /.static void ft
29de0 73 35 52 6f 77 69 64 46 75 6e 63 74 69 6f 6e 28  s5RowidFunction(
29df0 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  .  sqlite3_conte
29e00 78 74 20 2a 70 43 74 78 2c 20 20 20 20 20 20 20  xt *pCtx,       
29e10 20 20 20 2f 2a 20 46 75 6e 63 74 69 6f 6e 20 63     /* Function c
29e20 61 6c 6c 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  all context */. 
29e30 20 69 6e 74 20 6e 41 72 67 2c 20 20 20 20 20 20   int nArg,      
29e40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29e50 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72   /* Number of ar
29e60 67 73 20 28 61 6c 77 61 79 73 20 32 29 20 2a 2f  gs (always 2) */
29e70 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  .  sqlite3_value
29e80 20 2a 2a 61 70 56 61 6c 20 20 20 20 20 20 20 20   **apVal        
29e90 20 20 20 2f 2a 20 46 75 6e 63 74 69 6f 6e 20 61     /* Function a
29ea0 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20  rguments */.){. 
29eb0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41 72   const char *zAr
29ec0 67 3b 0a 20 20 69 66 28 20 6e 41 72 67 3d 3d 30  g;.  if( nArg==0
29ed0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
29ee0 72 65 73 75 6c 74 5f 65 72 72 6f 72 28 70 43 74  result_error(pCt
29ef0 78 2c 20 22 73 68 6f 75 6c 64 20 62 65 3a 20 66  x, "should be: f
29f00 74 73 35 5f 72 6f 77 69 64 28 73 75 62 6a 65 63  ts5_rowid(subjec
29f10 74 2c 20 2e 2e 2e 2e 29 22 2c 20 2d 31 29 3b 0a  t, ....)", -1);.
29f20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 41 72    }else{.    zAr
29f30 67 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a  g = (const char*
29f40 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74  )sqlite3_value_t
29f50 65 78 74 28 61 70 56 61 6c 5b 30 5d 29 3b 0a 20  ext(apVal[0]);. 
29f60 20 20 20 69 66 28 20 30 3d 3d 73 71 6c 69 74 65     if( 0==sqlite
29f70 33 5f 73 74 72 69 63 6d 70 28 7a 41 72 67 2c 20  3_stricmp(zArg, 
29f80 22 73 65 67 6d 65 6e 74 22 29 20 29 7b 0a 20 20  "segment") ){.  
29f90 20 20 20 20 69 36 34 20 69 52 6f 77 69 64 3b 0a      i64 iRowid;.
29fa0 20 20 20 20 20 20 69 6e 74 20 73 65 67 69 64 2c        int segid,
29fb0 20 70 67 6e 6f 3b 0a 20 20 20 20 20 20 69 66 28   pgno;.      if(
29fc0 20 6e 41 72 67 21 3d 33 20 29 7b 0a 20 20 20 20   nArg!=3 ){.    
29fd0 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
29fe0 6c 74 5f 65 72 72 6f 72 28 70 43 74 78 2c 20 0a  lt_error(pCtx, .
29ff0 20 20 20 20 20 20 20 20 20 20 20 20 22 73 68 6f              "sho
2a000 75 6c 64 20 62 65 3a 20 66 74 73 35 5f 72 6f 77  uld be: fts5_row
2a010 69 64 28 27 73 65 67 6d 65 6e 74 27 2c 20 73 65  id('segment', se
2a020 67 69 64 2c 20 70 67 6e 6f 29 29 22 2c 20 2d 31  gid, pgno))", -1
2a030 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20  .        );.    
2a040 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
2a050 20 73 65 67 69 64 20 3d 20 73 71 6c 69 74 65 33   segid = sqlite3
2a060 5f 76 61 6c 75 65 5f 69 6e 74 28 61 70 56 61 6c  _value_int(apVal
2a070 5b 31 5d 29 3b 0a 20 20 20 20 20 20 20 20 70 67  [1]);.        pg
2a080 6e 6f 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c  no = sqlite3_val
2a090 75 65 5f 69 6e 74 28 61 70 56 61 6c 5b 32 5d 29  ue_int(apVal[2])
2a0a0 3b 0a 20 20 20 20 20 20 20 20 69 52 6f 77 69 64  ;.        iRowid
2a0b0 20 3d 20 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f   = FTS5_SEGMENT_
2a0c0 52 4f 57 49 44 28 73 65 67 69 64 2c 20 70 67 6e  ROWID(segid, pgn
2a0d0 6f 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  o);.        sqli
2a0e0 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 36 34  te3_result_int64
2a0f0 28 70 43 74 78 2c 20 69 52 6f 77 69 64 29 3b 0a  (pCtx, iRowid);.
2a100 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
2a110 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  e{.      sqlite3
2a120 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 28 70 43  _result_error(pC
2a130 74 78 2c 20 0a 20 20 20 20 20 20 20 20 22 66 69  tx, .        "fi
2a140 72 73 74 20 61 72 67 20 74 6f 20 66 74 73 35 5f  rst arg to fts5_
2a150 72 6f 77 69 64 28 29 20 6d 75 73 74 20 62 65 20  rowid() must be 
2a160 27 73 65 67 6d 65 6e 74 27 22 20 2c 20 2d 31 0a  'segment'" , -1.
2a170 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 20        );.    }. 
2a180 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73   }.}../*.** This
2a190 20 69 73 20 63 61 6c 6c 65 64 20 61 73 20 70 61   is called as pa
2a1a0 72 74 20 6f 66 20 72 65 67 69 73 74 65 72 69 6e  rt of registerin
2a1b0 67 20 74 68 65 20 46 54 53 35 20 6d 6f 64 75 6c  g the FTS5 modul
2a1c0 65 20 77 69 74 68 20 64 61 74 61 62 61 73 65 0a  e with database.
2a1d0 2a 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 64 62  ** connection db
2a1e0 2e 20 49 74 20 72 65 67 69 73 74 65 72 73 20 73  . It registers s
2a1f0 65 76 65 72 61 6c 20 75 73 65 72 2d 64 65 66 69  everal user-defi
2a200 6e 65 64 20 73 63 61 6c 61 72 20 66 75 6e 63 74  ned scalar funct
2a210 69 6f 6e 73 20 75 73 65 66 75 6c 0a 2a 2a 20 77  ions useful.** w
2a220 69 74 68 20 46 54 53 35 2e 0a 2a 2a 0a 2a 2a 20  ith FTS5..**.** 
2a230 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 53  If successful, S
2a240 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
2a250 72 6e 65 64 2e 20 49 66 20 61 6e 20 65 72 72 6f  rned. If an erro
2a260 72 20 6f 63 63 75 72 73 2c 20 73 6f 6d 65 20 6f  r occurs, some o
2a270 74 68 65 72 0a 2a 2a 20 53 51 4c 69 74 65 20 65  ther.** SQLite e
2a280 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74  rror code is ret
2a290 75 72 6e 65 64 20 69 6e 73 74 65 61 64 2e 0a 2a  urned instead..*
2a2a0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73  /.int sqlite3Fts
2a2b0 35 49 6e 64 65 78 49 6e 69 74 28 73 71 6c 69 74  5IndexInit(sqlit
2a2c0 65 33 20 2a 64 62 29 7b 0a 20 20 69 6e 74 20 72  e3 *db){.  int r
2a2d0 63 20 3d 20 73 71 6c 69 74 65 33 5f 63 72 65 61  c = sqlite3_crea
2a2e0 74 65 5f 66 75 6e 63 74 69 6f 6e 28 0a 20 20 20  te_function(.   
2a2f0 20 20 20 64 62 2c 20 22 66 74 73 35 5f 64 65 63     db, "fts5_dec
2a300 6f 64 65 22 2c 20 32 2c 20 53 51 4c 49 54 45 5f  ode", 2, SQLITE_
2a310 55 54 46 38 2c 20 30 2c 20 66 74 73 35 44 65 63  UTF8, 0, fts5Dec
2a320 6f 64 65 46 75 6e 63 74 69 6f 6e 2c 20 30 2c 20  odeFunction, 0, 
2a330 30 0a 20 20 29 3b 0a 20 20 69 66 28 20 72 63 3d  0.  );.  if( rc=
2a340 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2a350 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 63    rc = sqlite3_c
2a360 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 0a  reate_function(.
2a370 20 20 20 20 20 20 20 20 64 62 2c 20 22 66 74 73          db, "fts
2a380 35 5f 72 6f 77 69 64 22 2c 20 2d 31 2c 20 53 51  5_rowid", -1, SQ
2a390 4c 49 54 45 5f 55 54 46 38 2c 20 30 2c 20 66 74  LITE_UTF8, 0, ft
2a3a0 73 35 52 6f 77 69 64 46 75 6e 63 74 69 6f 6e 2c  s5RowidFunction,
2a3b0 20 30 2c 20 30 0a 20 20 20 20 29 3b 0a 20 20 7d   0, 0.    );.  }
2a3c0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
2a3d0 0a                                               .